aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/golang.org/x/text/language
diff options
context:
space:
mode:
Diffstat (limited to 'Godeps/_workspace/src/golang.org/x/text/language')
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/Makefile16
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/common.go16
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/coverage.go197
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/gen_common.go20
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/gen_index.go162
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/go1_1.go38
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/go1_2.go11
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/index.go762
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/language.go975
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/lookup.go396
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/maketables.go1635
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/match.go840
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/parse.go859
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/tables.go2791
-rw-r--r--Godeps/_workspace/src/golang.org/x/text/language/tags.go143
15 files changed, 0 insertions, 8861 deletions
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/Makefile b/Godeps/_workspace/src/golang.org/x/text/language/Makefile
deleted file mode 100644
index 79f005784..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/Makefile
+++ /dev/null
@@ -1,16 +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.
-
-CLEANFILES+=maketables
-
-maketables: maketables.go
- go build $^
-
-tables: maketables
- ./maketables > tables.go
- gofmt -w -s tables.go
-
-# Build (but do not run) maketables during testing,
-# just to make sure it still compiles.
-testshort: maketables
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/common.go b/Godeps/_workspace/src/golang.org/x/text/language/common.go
deleted file mode 100644
index a255bb0a5..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/common.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// This file was generated by go generate; DO NOT EDIT
-
-package language
-
-// This file contains code common to the maketables.go and the package code.
-
-// langAliasType is the type of an alias in langAliasMap.
-type langAliasType int8
-
-const (
- langDeprecated langAliasType = iota
- langMacro
- langLegacy
-
- langAliasTypeUnknown langAliasType = -1
-)
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/coverage.go b/Godeps/_workspace/src/golang.org/x/text/language/coverage.go
deleted file mode 100644
index 101fd23c1..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/coverage.go
+++ /dev/null
@@ -1,197 +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 language
-
-import (
- "fmt"
- "sort"
-)
-
-// The Coverage interface is used to define the level of coverage of an
-// internationalization service. Note that not all types are supported by all
-// services. As lists may be generated on the fly, it is recommended that users
-// of a Coverage cache the results.
-type Coverage interface {
- // Tags returns the list of supported tags.
- Tags() []Tag
-
- // BaseLanguages returns the list of supported base languages.
- BaseLanguages() []Base
-
- // Scripts returns the list of supported scripts.
- Scripts() []Script
-
- // Regions returns the list of supported regions.
- Regions() []Region
-}
-
-var (
- // Supported defines a Coverage that lists all supported subtags. Tags
- // always returns nil.
- Supported Coverage = allSubtags{}
-)
-
-// TODO:
-// - Support Variants, numbering systems.
-// - CLDR coverage levels.
-// - Set of common tags defined in this package.
-
-type allSubtags struct{}
-
-// Regions returns the list of supported regions. As all regions are in a
-// consecutive range, it simply returns a slice of numbers in increasing order.
-// The "undefined" region is not returned.
-func (s allSubtags) Regions() []Region {
- reg := make([]Region, numRegions)
- for i := range reg {
- reg[i] = Region{regionID(i + 1)}
- }
- return reg
-}
-
-// Scripts returns the list of supported scripts. As all scripts are in a
-// consecutive range, it simply returns a slice of numbers in increasing order.
-// The "undefined" script is not returned.
-func (s allSubtags) Scripts() []Script {
- scr := make([]Script, numScripts)
- for i := range scr {
- scr[i] = Script{scriptID(i + 1)}
- }
- return scr
-}
-
-// BaseLanguages returns the list of all supported base languages. It generates
-// the list by traversing the internal structures.
-func (s allSubtags) BaseLanguages() []Base {
- base := make([]Base, 0, numLanguages)
- for i := 0; i < langNoIndexOffset; i++ {
- // We included "und" already for the value 0.
- if i != nonCanonicalUnd {
- base = append(base, Base{langID(i)})
- }
- }
- i := langNoIndexOffset
- for _, v := range langNoIndex {
- for k := 0; k < 8; k++ {
- if v&1 == 1 {
- base = append(base, Base{langID(i)})
- }
- v >>= 1
- i++
- }
- }
- return base
-}
-
-// Tags always returns nil.
-func (s allSubtags) Tags() []Tag {
- return nil
-}
-
-// coverage is used used by NewCoverage which is used as a convenient way for
-// creating Coverage implementations for partially defined data. Very often a
-// package will only need to define a subset of slices. coverage provides a
-// convenient way to do this. Moreover, packages using NewCoverage, instead of
-// their own implementation, will not break if later new slice types are added.
-type coverage struct {
- tags func() []Tag
- bases func() []Base
- scripts func() []Script
- regions func() []Region
-}
-
-func (s *coverage) Tags() []Tag {
- if s.tags == nil {
- return nil
- }
- return s.tags()
-}
-
-// bases implements sort.Interface and is used to sort base languages.
-type bases []Base
-
-func (b bases) Len() int {
- return len(b)
-}
-
-func (b bases) Swap(i, j int) {
- b[i], b[j] = b[j], b[i]
-}
-
-func (b bases) Less(i, j int) bool {
- return b[i].langID < b[j].langID
-}
-
-// BaseLanguages returns the result from calling s.bases if it is specified or
-// otherwise derives the set of supported base languages from tags.
-func (s *coverage) BaseLanguages() []Base {
- if s.bases == nil {
- tags := s.Tags()
- if len(tags) == 0 {
- return nil
- }
- a := make([]Base, len(tags))
- for i, t := range tags {
- a[i] = Base{langID(t.lang)}
- }
- sort.Sort(bases(a))
- k := 0
- for i := 1; i < len(a); i++ {
- if a[k] != a[i] {
- k++
- a[k] = a[i]
- }
- }
- return a[:k+1]
- }
- return s.bases()
-}
-
-func (s *coverage) Scripts() []Script {
- if s.scripts == nil {
- return nil
- }
- return s.scripts()
-}
-
-func (s *coverage) Regions() []Region {
- if s.regions == nil {
- return nil
- }
- return s.regions()
-}
-
-// NewCoverage returns a Coverage for the given lists. It is typically used by
-// packages providing internationalization services to define their level of
-// coverage. A list may be of type []T or func() []T, where T is either Tag,
-// Base, Script or Region. The returned Coverage derives the value for Bases
-// from Tags if no func or slice for []Base is specified. For other unspecified
-// types the returned Coverage will return nil for the respective methods.
-func NewCoverage(list ...interface{}) Coverage {
- s := &coverage{}
- for _, x := range list {
- switch v := x.(type) {
- case func() []Base:
- s.bases = v
- case func() []Script:
- s.scripts = v
- case func() []Region:
- s.regions = v
- case func() []Tag:
- s.tags = v
- case []Base:
- s.bases = func() []Base { return v }
- case []Script:
- s.scripts = func() []Script { return v }
- case []Region:
- s.regions = func() []Region { return v }
- case []Tag:
- s.tags = func() []Tag { return v }
- default:
- panic(fmt.Sprintf("language: unsupported set type %T", v))
- }
- }
- return s
-}
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/gen_common.go b/Godeps/_workspace/src/golang.org/x/text/language/gen_common.go
deleted file mode 100644
index 83ce18013..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/gen_common.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.
-
-// +build ignore
-
-package main
-
-// This file contains code common to the maketables.go and the package code.
-
-// langAliasType is the type of an alias in langAliasMap.
-type langAliasType int8
-
-const (
- langDeprecated langAliasType = iota
- langMacro
- langLegacy
-
- langAliasTypeUnknown langAliasType = -1
-)
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/gen_index.go b/Godeps/_workspace/src/golang.org/x/text/language/gen_index.go
deleted file mode 100644
index eef555cd3..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/gen_index.go
+++ /dev/null
@@ -1,162 +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
-
-// This file generates derivative tables based on the language package itself.
-
-import (
- "bytes"
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "reflect"
- "sort"
- "strings"
-
- "golang.org/x/text/internal/gen"
- "golang.org/x/text/language"
- "golang.org/x/text/unicode/cldr"
-)
-
-var (
- test = flag.Bool("test", false,
- "test existing tables; can be used to compare web data with package data.")
-
- draft = flag.String("draft",
- "contributed",
- `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`)
-)
-
-func main() {
- gen.Init()
-
- // Read the CLDR zip file.
- r := gen.OpenCLDRCoreZip()
- defer r.Close()
-
- d := &cldr.Decoder{}
- data, err := d.DecodeZip(r)
- if err != nil {
- log.Fatalf("DecodeZip: %v", err)
- }
-
- w := gen.NewCodeWriter()
- defer func() {
- buf := &bytes.Buffer{}
-
- if _, err = w.WriteGo(buf, "language"); err != nil {
- log.Fatalf("Error formatting file index.go: %v", err)
- }
-
- // Since we're generating a table for our own package we need to rewrite
- // doing the equivalent of go fmt -r 'language.b -> b'. Using
- // bytes.Replace will do.
- out := bytes.Replace(buf.Bytes(), []byte("language."), nil, -1)
- if err := ioutil.WriteFile("index.go", out, 0600); err != nil {
- log.Fatalf("Could not create file index.go: %v", err)
- }
- }()
-
- m := map[language.Tag]bool{}
- for _, lang := range data.Locales() {
- // We include all locales unconditionally to be consistent with en_US.
- // We want en_US, even though it has no data associated with it.
-
- // TODO: put any of the languages for which no data exists at the end
- // of the index. This allows all components based on ICU to use that
- // as the cutoff point.
- // if x := data.RawLDML(lang); false ||
- // x.LocaleDisplayNames != nil ||
- // x.Characters != nil ||
- // x.Delimiters != nil ||
- // x.Measurement != nil ||
- // x.Dates != nil ||
- // x.Numbers != nil ||
- // x.Units != nil ||
- // x.ListPatterns != nil ||
- // x.Collations != nil ||
- // x.Segmentations != nil ||
- // x.Rbnf != nil ||
- // x.Annotations != nil ||
- // x.Metadata != nil {
-
- // TODO: support POSIX natively, albeit non-standard.
- tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1))
- m[tag] = true
- // }
- }
- // Include locales for plural rules, which uses a different structure.
- for _, plurals := range data.Supplemental().Plurals {
- for _, rules := range plurals.PluralRules {
- for _, lang := range strings.Split(rules.Locales, " ") {
- m[language.Make(lang)] = true
- }
- }
- }
-
- var core, special []language.Tag
-
- for t := range m {
- if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" {
- log.Fatalf("Unexpected extension %v in %v", x, t)
- }
- if len(t.Variants()) == 0 && len(t.Extensions()) == 0 {
- core = append(core, t)
- } else {
- special = append(special, t)
- }
- }
-
- w.WriteComment(`
- NumCompactTags is the number of common tags. The maximum tag is
- NumCompactTags-1.`)
- w.WriteConst("NumCompactTags", len(core)+len(special))
-
- sort.Sort(byAlpha(special))
- w.WriteVar("specialTags", special)
-
- // TODO: order by frequency?
- sort.Sort(byAlpha(core))
-
- // Size computations are just an estimate.
- w.Size += int(reflect.TypeOf(map[uint32]uint16{}).Size())
- w.Size += len(core) * 6 // size of uint32 and uint16
-
- fmt.Fprintln(w)
- fmt.Fprintln(w, "var coreTags = map[uint32]uint16{")
- fmt.Fprintln(w, "0x0: 0, // und")
- i := len(special) + 1 // Und and special tags already written.
- for _, t := range core {
- if t == language.Und {
- continue
- }
- fmt.Fprint(w.Hash, t, i)
- b, s, r := t.Raw()
- fmt.Fprintf(w, "0x%s%s%s: %d, // %s\n",
- getIndex(b, 3), // 3 is enough as it is guaranteed to be a compact number
- getIndex(s, 2),
- getIndex(r, 3),
- i, t)
- i++
- }
- fmt.Fprintln(w, "}")
-}
-
-// getIndex prints the subtag type and extracts its index of size nibble.
-// If the index is less than n nibbles, the result is prefixed with 0s.
-func getIndex(x interface{}, n int) string {
- s := fmt.Sprintf("%#v", x) // s is of form Type{typeID: 0x00}
- s = s[strings.Index(s, "0x")+2 : len(s)-1]
- return strings.Repeat("0", n-len(s)) + s
-}
-
-type byAlpha []language.Tag
-
-func (a byAlpha) Len() int { return len(a) }
-func (a byAlpha) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a byAlpha) Less(i, j int) bool { return a[i].String() < a[j].String() }
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/go1_1.go b/Godeps/_workspace/src/golang.org/x/text/language/go1_1.go
deleted file mode 100644
index 380f4c09f..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/go1_1.go
+++ /dev/null
@@ -1,38 +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.2
-
-package language
-
-import "sort"
-
-func sortStable(s sort.Interface) {
- ss := stableSort{
- s: s,
- pos: make([]int, s.Len()),
- }
- for i := range ss.pos {
- ss.pos[i] = i
- }
- sort.Sort(&ss)
-}
-
-type stableSort struct {
- s sort.Interface
- pos []int
-}
-
-func (s *stableSort) Len() int {
- return len(s.pos)
-}
-
-func (s *stableSort) Less(i, j int) bool {
- return s.s.Less(i, j) || !s.s.Less(j, i) && s.pos[i] < s.pos[j]
-}
-
-func (s *stableSort) Swap(i, j int) {
- s.s.Swap(i, j)
- s.pos[i], s.pos[j] = s.pos[j], s.pos[i]
-}
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/go1_2.go b/Godeps/_workspace/src/golang.org/x/text/language/go1_2.go
deleted file mode 100644
index 38268c57a..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/go1_2.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.
-
-// +build go1.2
-
-package language
-
-import "sort"
-
-var sortStable = sort.Stable
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/index.go b/Godeps/_workspace/src/golang.org/x/text/language/index.go
deleted file mode 100644
index 7fa9cc82d..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/index.go
+++ /dev/null
@@ -1,762 +0,0 @@
-// This file was generated by go generate; DO NOT EDIT
-
-package language
-
-// NumCompactTags is the number of common tags. The maximum tag is
-// NumCompactTags-1.
-const NumCompactTags = 747
-
-var specialTags = []Tag{ // 2 elements
- 0: {lang: 0x61, region: 0x6d, script: 0x0, pVariant: 0x5, pExt: 0xe, str: "ca-ES-valencia"},
- 1: {lang: 0x9b, region: 0x132, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"},
-} // Size: 72 bytes
-
-var coreTags = map[uint32]uint16{
- 0x0: 0, // und
- 0x00a00000: 3, // af
- 0x00a000d0: 4, // af-NA
- 0x00a0015e: 5, // af-ZA
- 0x00b00000: 6, // agq
- 0x00b00051: 7, // agq-CM
- 0x00d00000: 8, // ak
- 0x00d0007e: 9, // ak-GH
- 0x01100000: 10, // am
- 0x0110006e: 11, // am-ET
- 0x01500000: 12, // ar
- 0x01500001: 13, // ar-001
- 0x01500022: 14, // ar-AE
- 0x01500038: 15, // ar-BH
- 0x01500061: 16, // ar-DJ
- 0x01500066: 17, // ar-DZ
- 0x0150006a: 18, // ar-EG
- 0x0150006b: 19, // ar-EH
- 0x0150006c: 20, // ar-ER
- 0x01500095: 21, // ar-IL
- 0x01500099: 22, // ar-IQ
- 0x0150009f: 23, // ar-JO
- 0x015000a6: 24, // ar-KM
- 0x015000aa: 25, // ar-KW
- 0x015000ae: 26, // ar-LB
- 0x015000b7: 27, // ar-LY
- 0x015000b8: 28, // ar-MA
- 0x015000c7: 29, // ar-MR
- 0x015000df: 30, // ar-OM
- 0x015000eb: 31, // ar-PS
- 0x015000f1: 32, // ar-QA
- 0x01500106: 33, // ar-SA
- 0x01500109: 34, // ar-SD
- 0x01500113: 35, // ar-SO
- 0x01500115: 36, // ar-SS
- 0x0150011a: 37, // ar-SY
- 0x0150011e: 38, // ar-TD
- 0x01500126: 39, // ar-TN
- 0x0150015b: 40, // ar-YE
- 0x01c00000: 41, // as
- 0x01c00097: 42, // as-IN
- 0x01d00000: 43, // asa
- 0x01d0012d: 44, // asa-TZ
- 0x01f00000: 45, // ast
- 0x01f0006d: 46, // ast-ES
- 0x02400000: 47, // az
- 0x0241e000: 48, // az-Cyrl
- 0x0241e031: 49, // az-Cyrl-AZ
- 0x02452000: 50, // az-Latn
- 0x02452031: 51, // az-Latn-AZ
- 0x02a00000: 52, // bas
- 0x02a00051: 53, // bas-CM
- 0x02f00000: 54, // be
- 0x02f00046: 55, // be-BY
- 0x03100000: 56, // bem
- 0x0310015f: 57, // bem-ZM
- 0x03300000: 58, // bez
- 0x0330012d: 59, // bez-TZ
- 0x03800000: 60, // bg
- 0x03800037: 61, // bg-BG
- 0x03c00000: 62, // bh
- 0x04900000: 63, // bm
- 0x049000c1: 64, // bm-ML
- 0x04b00000: 65, // bn
- 0x04b00034: 66, // bn-BD
- 0x04b00097: 67, // bn-IN
- 0x04c00000: 68, // bo
- 0x04c00052: 69, // bo-CN
- 0x04c00097: 70, // bo-IN
- 0x05000000: 71, // br
- 0x05000076: 72, // br-FR
- 0x05300000: 73, // brx
- 0x05300097: 74, // brx-IN
- 0x05400000: 75, // bs
- 0x0541e000: 76, // bs-Cyrl
- 0x0541e032: 77, // bs-Cyrl-BA
- 0x05452000: 78, // bs-Latn
- 0x05452032: 79, // bs-Latn-BA
- 0x06100000: 80, // ca
- 0x06100021: 81, // ca-AD
- 0x0610006d: 82, // ca-ES
- 0x06100076: 83, // ca-FR
- 0x0610009c: 84, // ca-IT
- 0x06400000: 85, // ce
- 0x06400104: 86, // ce-RU
- 0x06600000: 87, // cgg
- 0x0660012f: 88, // cgg-UG
- 0x06c00000: 89, // chr
- 0x06c00132: 90, // chr-US
- 0x06f00000: 91, // ckb
- 0x06f00099: 92, // ckb-IQ
- 0x06f0009a: 93, // ckb-IR
- 0x07900000: 94, // cs
- 0x0790005d: 95, // cs-CZ
- 0x07d00000: 96, // cu
- 0x07d00104: 97, // cu-RU
- 0x07f00000: 98, // cy
- 0x07f00079: 99, // cy-GB
- 0x08000000: 100, // da
- 0x08000062: 101, // da-DK
- 0x08000080: 102, // da-GL
- 0x08300000: 103, // dav
- 0x083000a2: 104, // dav-KE
- 0x08500000: 105, // de
- 0x0850002d: 106, // de-AT
- 0x08500035: 107, // de-BE
- 0x0850004d: 108, // de-CH
- 0x0850005f: 109, // de-DE
- 0x085000b0: 110, // de-LI
- 0x085000b5: 111, // de-LU
- 0x08800000: 112, // dje
- 0x088000d2: 113, // dje-NE
- 0x08b00000: 114, // dsb
- 0x08b0005f: 115, // dsb-DE
- 0x08f00000: 116, // dua
- 0x08f00051: 117, // dua-CM
- 0x09000000: 118, // dv
- 0x09100000: 119, // dyo
- 0x09100112: 120, // dyo-SN
- 0x09300000: 121, // dz
- 0x09300042: 122, // dz-BT
- 0x09400000: 123, // ebu
- 0x094000a2: 124, // ebu-KE
- 0x09500000: 125, // ee
- 0x0950007e: 126, // ee-GH
- 0x09500120: 127, // ee-TG
- 0x09a00000: 128, // el
- 0x09a0005c: 129, // el-CY
- 0x09a00085: 130, // el-GR
- 0x09b00000: 131, // en
- 0x09b00001: 132, // en-001
- 0x09b0001a: 133, // en-150
- 0x09b00024: 134, // en-AG
- 0x09b00025: 135, // en-AI
- 0x09b0002c: 136, // en-AS
- 0x09b0002d: 137, // en-AT
- 0x09b0002e: 138, // en-AU
- 0x09b00033: 139, // en-BB
- 0x09b00035: 140, // en-BE
- 0x09b00039: 141, // en-BI
- 0x09b0003c: 142, // en-BM
- 0x09b00041: 143, // en-BS
- 0x09b00045: 144, // en-BW
- 0x09b00047: 145, // en-BZ
- 0x09b00048: 146, // en-CA
- 0x09b00049: 147, // en-CC
- 0x09b0004d: 148, // en-CH
- 0x09b0004f: 149, // en-CK
- 0x09b00051: 150, // en-CM
- 0x09b0005b: 151, // en-CX
- 0x09b0005c: 152, // en-CY
- 0x09b0005f: 153, // en-DE
- 0x09b00060: 154, // en-DG
- 0x09b00062: 155, // en-DK
- 0x09b00063: 156, // en-DM
- 0x09b0006c: 157, // en-ER
- 0x09b00070: 158, // en-FI
- 0x09b00071: 159, // en-FJ
- 0x09b00072: 160, // en-FK
- 0x09b00073: 161, // en-FM
- 0x09b00079: 162, // en-GB
- 0x09b0007a: 163, // en-GD
- 0x09b0007d: 164, // en-GG
- 0x09b0007e: 165, // en-GH
- 0x09b0007f: 166, // en-GI
- 0x09b00081: 167, // en-GM
- 0x09b00088: 168, // en-GU
- 0x09b0008a: 169, // en-GY
- 0x09b0008b: 170, // en-HK
- 0x09b00094: 171, // en-IE
- 0x09b00095: 172, // en-IL
- 0x09b00096: 173, // en-IM
- 0x09b00097: 174, // en-IN
- 0x09b00098: 175, // en-IO
- 0x09b0009d: 176, // en-JE
- 0x09b0009e: 177, // en-JM
- 0x09b000a2: 178, // en-KE
- 0x09b000a5: 179, // en-KI
- 0x09b000a7: 180, // en-KN
- 0x09b000ab: 181, // en-KY
- 0x09b000af: 182, // en-LC
- 0x09b000b2: 183, // en-LR
- 0x09b000b3: 184, // en-LS
- 0x09b000bd: 185, // en-MG
- 0x09b000be: 186, // en-MH
- 0x09b000c4: 187, // en-MO
- 0x09b000c5: 188, // en-MP
- 0x09b000c8: 189, // en-MS
- 0x09b000c9: 190, // en-MT
- 0x09b000ca: 191, // en-MU
- 0x09b000cc: 192, // en-MW
- 0x09b000ce: 193, // en-MY
- 0x09b000d0: 194, // en-NA
- 0x09b000d3: 195, // en-NF
- 0x09b000d4: 196, // en-NG
- 0x09b000d7: 197, // en-NL
- 0x09b000db: 198, // en-NR
- 0x09b000dd: 199, // en-NU
- 0x09b000de: 200, // en-NZ
- 0x09b000e4: 201, // en-PG
- 0x09b000e5: 202, // en-PH
- 0x09b000e6: 203, // en-PK
- 0x09b000e9: 204, // en-PN
- 0x09b000ea: 205, // en-PR
- 0x09b000ee: 206, // en-PW
- 0x09b00105: 207, // en-RW
- 0x09b00107: 208, // en-SB
- 0x09b00108: 209, // en-SC
- 0x09b00109: 210, // en-SD
- 0x09b0010a: 211, // en-SE
- 0x09b0010b: 212, // en-SG
- 0x09b0010c: 213, // en-SH
- 0x09b0010d: 214, // en-SI
- 0x09b00110: 215, // en-SL
- 0x09b00115: 216, // en-SS
- 0x09b00119: 217, // en-SX
- 0x09b0011b: 218, // en-SZ
- 0x09b0011d: 219, // en-TC
- 0x09b00123: 220, // en-TK
- 0x09b00127: 221, // en-TO
- 0x09b0012a: 222, // en-TT
- 0x09b0012b: 223, // en-TV
- 0x09b0012d: 224, // en-TZ
- 0x09b0012f: 225, // en-UG
- 0x09b00131: 226, // en-UM
- 0x09b00132: 227, // en-US
- 0x09b00136: 228, // en-VC
- 0x09b00139: 229, // en-VG
- 0x09b0013a: 230, // en-VI
- 0x09b0013c: 231, // en-VU
- 0x09b0013f: 232, // en-WS
- 0x09b0015e: 233, // en-ZA
- 0x09b0015f: 234, // en-ZM
- 0x09b00161: 235, // en-ZW
- 0x09c00000: 236, // eo
- 0x09c00001: 237, // eo-001
- 0x09d00000: 238, // es
- 0x09d0001e: 239, // es-419
- 0x09d0002b: 240, // es-AR
- 0x09d0003e: 241, // es-BO
- 0x09d00040: 242, // es-BR
- 0x09d00050: 243, // es-CL
- 0x09d00053: 244, // es-CO
- 0x09d00055: 245, // es-CR
- 0x09d00058: 246, // es-CU
- 0x09d00064: 247, // es-DO
- 0x09d00067: 248, // es-EA
- 0x09d00068: 249, // es-EC
- 0x09d0006d: 250, // es-ES
- 0x09d00084: 251, // es-GQ
- 0x09d00087: 252, // es-GT
- 0x09d0008d: 253, // es-HN
- 0x09d00092: 254, // es-IC
- 0x09d000cd: 255, // es-MX
- 0x09d000d6: 256, // es-NI
- 0x09d000e0: 257, // es-PA
- 0x09d000e2: 258, // es-PE
- 0x09d000e5: 259, // es-PH
- 0x09d000ea: 260, // es-PR
- 0x09d000ef: 261, // es-PY
- 0x09d00118: 262, // es-SV
- 0x09d00132: 263, // es-US
- 0x09d00133: 264, // es-UY
- 0x09d00138: 265, // es-VE
- 0x09f00000: 266, // et
- 0x09f00069: 267, // et-EE
- 0x0a100000: 268, // eu
- 0x0a10006d: 269, // eu-ES
- 0x0a200000: 270, // ewo
- 0x0a200051: 271, // ewo-CM
- 0x0a400000: 272, // fa
- 0x0a400023: 273, // fa-AF
- 0x0a40009a: 274, // fa-IR
- 0x0a600000: 275, // ff
- 0x0a600051: 276, // ff-CM
- 0x0a600082: 277, // ff-GN
- 0x0a6000c7: 278, // ff-MR
- 0x0a600112: 279, // ff-SN
- 0x0a800000: 280, // fi
- 0x0a800070: 281, // fi-FI
- 0x0aa00000: 282, // fil
- 0x0aa000e5: 283, // fil-PH
- 0x0ad00000: 284, // fo
- 0x0ad00062: 285, // fo-DK
- 0x0ad00074: 286, // fo-FO
- 0x0af00000: 287, // fr
- 0x0af00035: 288, // fr-BE
- 0x0af00036: 289, // fr-BF
- 0x0af00039: 290, // fr-BI
- 0x0af0003a: 291, // fr-BJ
- 0x0af0003b: 292, // fr-BL
- 0x0af00048: 293, // fr-CA
- 0x0af0004a: 294, // fr-CD
- 0x0af0004b: 295, // fr-CF
- 0x0af0004c: 296, // fr-CG
- 0x0af0004d: 297, // fr-CH
- 0x0af0004e: 298, // fr-CI
- 0x0af00051: 299, // fr-CM
- 0x0af00061: 300, // fr-DJ
- 0x0af00066: 301, // fr-DZ
- 0x0af00076: 302, // fr-FR
- 0x0af00078: 303, // fr-GA
- 0x0af0007c: 304, // fr-GF
- 0x0af00082: 305, // fr-GN
- 0x0af00083: 306, // fr-GP
- 0x0af00084: 307, // fr-GQ
- 0x0af0008f: 308, // fr-HT
- 0x0af000a6: 309, // fr-KM
- 0x0af000b5: 310, // fr-LU
- 0x0af000b8: 311, // fr-MA
- 0x0af000b9: 312, // fr-MC
- 0x0af000bc: 313, // fr-MF
- 0x0af000bd: 314, // fr-MG
- 0x0af000c1: 315, // fr-ML
- 0x0af000c6: 316, // fr-MQ
- 0x0af000c7: 317, // fr-MR
- 0x0af000ca: 318, // fr-MU
- 0x0af000d1: 319, // fr-NC
- 0x0af000d2: 320, // fr-NE
- 0x0af000e3: 321, // fr-PF
- 0x0af000e8: 322, // fr-PM
- 0x0af00100: 323, // fr-RE
- 0x0af00105: 324, // fr-RW
- 0x0af00108: 325, // fr-SC
- 0x0af00112: 326, // fr-SN
- 0x0af0011a: 327, // fr-SY
- 0x0af0011e: 328, // fr-TD
- 0x0af00120: 329, // fr-TG
- 0x0af00126: 330, // fr-TN
- 0x0af0013c: 331, // fr-VU
- 0x0af0013d: 332, // fr-WF
- 0x0af0015c: 333, // fr-YT
- 0x0b600000: 334, // fur
- 0x0b60009c: 335, // fur-IT
- 0x0b900000: 336, // fy
- 0x0b9000d7: 337, // fy-NL
- 0x0ba00000: 338, // ga
- 0x0ba00094: 339, // ga-IE
- 0x0c200000: 340, // gd
- 0x0c200079: 341, // gd-GB
- 0x0c800000: 342, // gl
- 0x0c80006d: 343, // gl-ES
- 0x0d200000: 344, // gsw
- 0x0d20004d: 345, // gsw-CH
- 0x0d200076: 346, // gsw-FR
- 0x0d2000b0: 347, // gsw-LI
- 0x0d300000: 348, // gu
- 0x0d300097: 349, // gu-IN
- 0x0d700000: 350, // guw
- 0x0d800000: 351, // guz
- 0x0d8000a2: 352, // guz-KE
- 0x0d900000: 353, // gv
- 0x0d900096: 354, // gv-IM
- 0x0dc00000: 355, // ha
- 0x0dc0007e: 356, // ha-GH
- 0x0dc000d2: 357, // ha-NE
- 0x0dc000d4: 358, // ha-NG
- 0x0de00000: 359, // haw
- 0x0de00132: 360, // haw-US
- 0x0e000000: 361, // he
- 0x0e000095: 362, // he-IL
- 0x0e100000: 363, // hi
- 0x0e100097: 364, // hi-IN
- 0x0ee00000: 365, // hr
- 0x0ee00032: 366, // hr-BA
- 0x0ee0008e: 367, // hr-HR
- 0x0ef00000: 368, // hsb
- 0x0ef0005f: 369, // hsb-DE
- 0x0f200000: 370, // hu
- 0x0f200090: 371, // hu-HU
- 0x0f300000: 372, // hy
- 0x0f300027: 373, // hy-AM
- 0x0f800000: 374, // id
- 0x0f800093: 375, // id-ID
- 0x0fa00000: 376, // ig
- 0x0fa000d4: 377, // ig-NG
- 0x0fb00000: 378, // ii
- 0x0fb00052: 379, // ii-CN
- 0x10200000: 380, // is
- 0x1020009b: 381, // is-IS
- 0x10300000: 382, // it
- 0x1030004d: 383, // it-CH
- 0x1030009c: 384, // it-IT
- 0x10300111: 385, // it-SM
- 0x10400000: 386, // iu
- 0x10700000: 387, // ja
- 0x107000a0: 388, // ja-JP
- 0x10900000: 389, // jbo
- 0x10a00000: 390, // jgo
- 0x10a00051: 391, // jgo-CM
- 0x10c00000: 392, // jmc
- 0x10c0012d: 393, // jmc-TZ
- 0x10f00000: 394, // jv
- 0x11100000: 395, // ka
- 0x1110007b: 396, // ka-GE
- 0x11300000: 397, // kab
- 0x11300066: 398, // kab-DZ
- 0x11500000: 399, // kaj
- 0x11600000: 400, // kam
- 0x116000a2: 401, // kam-KE
- 0x11900000: 402, // kcg
- 0x11b00000: 403, // kde
- 0x11b0012d: 404, // kde-TZ
- 0x11d00000: 405, // kea
- 0x11d00059: 406, // kea-CV
- 0x12800000: 407, // khq
- 0x128000c1: 408, // khq-ML
- 0x12b00000: 409, // ki
- 0x12b000a2: 410, // ki-KE
- 0x12f00000: 411, // kk
- 0x12f000ac: 412, // kk-KZ
- 0x13000000: 413, // kkj
- 0x13000051: 414, // kkj-CM
- 0x13100000: 415, // kl
- 0x13100080: 416, // kl-GL
- 0x13200000: 417, // kln
- 0x132000a2: 418, // kln-KE
- 0x13300000: 419, // km
- 0x133000a4: 420, // km-KH
- 0x13500000: 421, // kn
- 0x13500097: 422, // kn-IN
- 0x13600000: 423, // ko
- 0x136000a8: 424, // ko-KP
- 0x136000a9: 425, // ko-KR
- 0x13800000: 426, // kok
- 0x13800097: 427, // kok-IN
- 0x14100000: 428, // ks
- 0x14100097: 429, // ks-IN
- 0x14200000: 430, // ksb
- 0x1420012d: 431, // ksb-TZ
- 0x14300000: 432, // ksf
- 0x14300051: 433, // ksf-CM
- 0x14400000: 434, // ksh
- 0x1440005f: 435, // ksh-DE
- 0x14500000: 436, // ku
- 0x14a00000: 437, // kw
- 0x14a00079: 438, // kw-GB
- 0x14d00000: 439, // ky
- 0x14d000a3: 440, // ky-KG
- 0x15100000: 441, // lag
- 0x1510012d: 442, // lag-TZ
- 0x15400000: 443, // lb
- 0x154000b5: 444, // lb-LU
- 0x15a00000: 445, // lg
- 0x15a0012f: 446, // lg-UG
- 0x16100000: 447, // lkt
- 0x16100132: 448, // lkt-US
- 0x16400000: 449, // ln
- 0x16400029: 450, // ln-AO
- 0x1640004a: 451, // ln-CD
- 0x1640004b: 452, // ln-CF
- 0x1640004c: 453, // ln-CG
- 0x16500000: 454, // lo
- 0x165000ad: 455, // lo-LA
- 0x16800000: 456, // lrc
- 0x16800099: 457, // lrc-IQ
- 0x1680009a: 458, // lrc-IR
- 0x16900000: 459, // lt
- 0x169000b4: 460, // lt-LT
- 0x16b00000: 461, // lu
- 0x16b0004a: 462, // lu-CD
- 0x16d00000: 463, // luo
- 0x16d000a2: 464, // luo-KE
- 0x16e00000: 465, // luy
- 0x16e000a2: 466, // luy-KE
- 0x17000000: 467, // lv
- 0x170000b6: 468, // lv-LV
- 0x17a00000: 469, // mas
- 0x17a000a2: 470, // mas-KE
- 0x17a0012d: 471, // mas-TZ
- 0x18000000: 472, // mer
- 0x180000a2: 473, // mer-KE
- 0x18200000: 474, // mfe
- 0x182000ca: 475, // mfe-MU
- 0x18300000: 476, // mg
- 0x183000bd: 477, // mg-MG
- 0x18400000: 478, // mgh
- 0x184000cf: 479, // mgh-MZ
- 0x18500000: 480, // mgo
- 0x18500051: 481, // mgo-CM
- 0x18c00000: 482, // mk
- 0x18c000c0: 483, // mk-MK
- 0x18d00000: 484, // ml
- 0x18d00097: 485, // ml-IN
- 0x18f00000: 486, // mn
- 0x18f000c3: 487, // mn-MN
- 0x19600000: 488, // mr
- 0x19600097: 489, // mr-IN
- 0x19a00000: 490, // ms
- 0x19a0003d: 491, // ms-BN
- 0x19a000ce: 492, // ms-MY
- 0x19a0010b: 493, // ms-SG
- 0x19b00000: 494, // mt
- 0x19b000c9: 495, // mt-MT
- 0x19d00000: 496, // mua
- 0x19d00051: 497, // mua-CM
- 0x1a500000: 498, // my
- 0x1a5000c2: 499, // my-MM
- 0x1a900000: 500, // mzn
- 0x1a90009a: 501, // mzn-IR
- 0x1ab00000: 502, // nah
- 0x1ae00000: 503, // naq
- 0x1ae000d0: 504, // naq-NA
- 0x1af00000: 505, // nb
- 0x1af000d8: 506, // nb-NO
- 0x1af0010e: 507, // nb-SJ
- 0x1b100000: 508, // nd
- 0x1b100161: 509, // nd-ZW
- 0x1b400000: 510, // ne
- 0x1b400097: 511, // ne-IN
- 0x1b4000d9: 512, // ne-NP
- 0x1bd00000: 513, // nl
- 0x1bd0002f: 514, // nl-AW
- 0x1bd00035: 515, // nl-BE
- 0x1bd0003f: 516, // nl-BQ
- 0x1bd0005a: 517, // nl-CW
- 0x1bd000d7: 518, // nl-NL
- 0x1bd00114: 519, // nl-SR
- 0x1bd00119: 520, // nl-SX
- 0x1be00000: 521, // nmg
- 0x1be00051: 522, // nmg-CM
- 0x1bf00000: 523, // nn
- 0x1bf000d8: 524, // nn-NO
- 0x1c000000: 525, // nnh
- 0x1c000051: 526, // nnh-CM
- 0x1c100000: 527, // no
- 0x1c500000: 528, // nqo
- 0x1c600000: 529, // nr
- 0x1c800000: 530, // nso
- 0x1c900000: 531, // nus
- 0x1c900115: 532, // nus-SS
- 0x1cc00000: 533, // ny
- 0x1ce00000: 534, // nyn
- 0x1ce0012f: 535, // nyn-UG
- 0x1d200000: 536, // om
- 0x1d20006e: 537, // om-ET
- 0x1d2000a2: 538, // om-KE
- 0x1d300000: 539, // or
- 0x1d300097: 540, // or-IN
- 0x1d400000: 541, // os
- 0x1d40007b: 542, // os-GE
- 0x1d400104: 543, // os-RU
- 0x1d700000: 544, // pa
- 0x1d705000: 545, // pa-Arab
- 0x1d7050e6: 546, // pa-Arab-PK
- 0x1d72f000: 547, // pa-Guru
- 0x1d72f097: 548, // pa-Guru-IN
- 0x1db00000: 549, // pap
- 0x1e700000: 550, // pl
- 0x1e7000e7: 551, // pl-PL
- 0x1ed00000: 552, // prg
- 0x1ed00001: 553, // prg-001
- 0x1ee00000: 554, // ps
- 0x1ee00023: 555, // ps-AF
- 0x1ef00000: 556, // pt
- 0x1ef00029: 557, // pt-AO
- 0x1ef00040: 558, // pt-BR
- 0x1ef0004d: 559, // pt-CH
- 0x1ef00059: 560, // pt-CV
- 0x1ef00084: 561, // pt-GQ
- 0x1ef00089: 562, // pt-GW
- 0x1ef000b5: 563, // pt-LU
- 0x1ef000c4: 564, // pt-MO
- 0x1ef000cf: 565, // pt-MZ
- 0x1ef000ec: 566, // pt-PT
- 0x1ef00116: 567, // pt-ST
- 0x1ef00124: 568, // pt-TL
- 0x1f100000: 569, // qu
- 0x1f10003e: 570, // qu-BO
- 0x1f100068: 571, // qu-EC
- 0x1f1000e2: 572, // qu-PE
- 0x1fc00000: 573, // rm
- 0x1fc0004d: 574, // rm-CH
- 0x20100000: 575, // rn
- 0x20100039: 576, // rn-BI
- 0x20300000: 577, // ro
- 0x203000ba: 578, // ro-MD
- 0x20300102: 579, // ro-RO
- 0x20500000: 580, // rof
- 0x2050012d: 581, // rof-TZ
- 0x20700000: 582, // ru
- 0x20700046: 583, // ru-BY
- 0x207000a3: 584, // ru-KG
- 0x207000ac: 585, // ru-KZ
- 0x207000ba: 586, // ru-MD
- 0x20700104: 587, // ru-RU
- 0x2070012e: 588, // ru-UA
- 0x20a00000: 589, // rw
- 0x20a00105: 590, // rw-RW
- 0x20b00000: 591, // rwk
- 0x20b0012d: 592, // rwk-TZ
- 0x20f00000: 593, // sah
- 0x20f00104: 594, // sah-RU
- 0x21000000: 595, // saq
- 0x210000a2: 596, // saq-KE
- 0x21400000: 597, // sbp
- 0x2140012d: 598, // sbp-TZ
- 0x21c00000: 599, // sdh
- 0x21d00000: 600, // se
- 0x21d00070: 601, // se-FI
- 0x21d000d8: 602, // se-NO
- 0x21d0010a: 603, // se-SE
- 0x21f00000: 604, // seh
- 0x21f000cf: 605, // seh-MZ
- 0x22100000: 606, // ses
- 0x221000c1: 607, // ses-ML
- 0x22200000: 608, // sg
- 0x2220004b: 609, // sg-CF
- 0x22600000: 610, // shi
- 0x22652000: 611, // shi-Latn
- 0x226520b8: 612, // shi-Latn-MA
- 0x226d2000: 613, // shi-Tfng
- 0x226d20b8: 614, // shi-Tfng-MA
- 0x22800000: 615, // si
- 0x228000b1: 616, // si-LK
- 0x22a00000: 617, // sk
- 0x22a0010f: 618, // sk-SK
- 0x22c00000: 619, // sl
- 0x22c0010d: 620, // sl-SI
- 0x23000000: 621, // sma
- 0x23100000: 622, // smi
- 0x23200000: 623, // smj
- 0x23300000: 624, // smn
- 0x23300070: 625, // smn-FI
- 0x23500000: 626, // sms
- 0x23600000: 627, // sn
- 0x23600161: 628, // sn-ZW
- 0x23800000: 629, // so
- 0x23800061: 630, // so-DJ
- 0x2380006e: 631, // so-ET
- 0x238000a2: 632, // so-KE
- 0x23800113: 633, // so-SO
- 0x23a00000: 634, // sq
- 0x23a00026: 635, // sq-AL
- 0x23a000c0: 636, // sq-MK
- 0x23a0014a: 637, // sq-XK
- 0x23b00000: 638, // sr
- 0x23b1e000: 639, // sr-Cyrl
- 0x23b1e032: 640, // sr-Cyrl-BA
- 0x23b1e0bb: 641, // sr-Cyrl-ME
- 0x23b1e103: 642, // sr-Cyrl-RS
- 0x23b1e14a: 643, // sr-Cyrl-XK
- 0x23b52000: 644, // sr-Latn
- 0x23b52032: 645, // sr-Latn-BA
- 0x23b520bb: 646, // sr-Latn-ME
- 0x23b52103: 647, // sr-Latn-RS
- 0x23b5214a: 648, // sr-Latn-XK
- 0x24000000: 649, // ss
- 0x24100000: 650, // ssy
- 0x24200000: 651, // st
- 0x24700000: 652, // sv
- 0x24700030: 653, // sv-AX
- 0x24700070: 654, // sv-FI
- 0x2470010a: 655, // sv-SE
- 0x24800000: 656, // sw
- 0x2480004a: 657, // sw-CD
- 0x248000a2: 658, // sw-KE
- 0x2480012d: 659, // sw-TZ
- 0x2480012f: 660, // sw-UG
- 0x24f00000: 661, // syr
- 0x25100000: 662, // ta
- 0x25100097: 663, // ta-IN
- 0x251000b1: 664, // ta-LK
- 0x251000ce: 665, // ta-MY
- 0x2510010b: 666, // ta-SG
- 0x25800000: 667, // te
- 0x25800097: 668, // te-IN
- 0x25a00000: 669, // teo
- 0x25a000a2: 670, // teo-KE
- 0x25a0012f: 671, // teo-UG
- 0x25d00000: 672, // th
- 0x25d00121: 673, // th-TH
- 0x26100000: 674, // ti
- 0x2610006c: 675, // ti-ER
- 0x2610006e: 676, // ti-ET
- 0x26200000: 677, // tig
- 0x26400000: 678, // tk
- 0x26400125: 679, // tk-TM
- 0x26b00000: 680, // tn
- 0x26c00000: 681, // to
- 0x26c00127: 682, // to-TO
- 0x26f00000: 683, // tr
- 0x26f0005c: 684, // tr-CY
- 0x26f00129: 685, // tr-TR
- 0x27200000: 686, // ts
- 0x27e00000: 687, // twq
- 0x27e000d2: 688, // twq-NE
- 0x28200000: 689, // tzm
- 0x282000b8: 690, // tzm-MA
- 0x28400000: 691, // ug
- 0x28400052: 692, // ug-CN
- 0x28600000: 693, // uk
- 0x2860012e: 694, // uk-UA
- 0x28c00000: 695, // ur
- 0x28c00097: 696, // ur-IN
- 0x28c000e6: 697, // ur-PK
- 0x28d00000: 698, // uz
- 0x28d05000: 699, // uz-Arab
- 0x28d05023: 700, // uz-Arab-AF
- 0x28d1e000: 701, // uz-Cyrl
- 0x28d1e134: 702, // uz-Cyrl-UZ
- 0x28d52000: 703, // uz-Latn
- 0x28d52134: 704, // uz-Latn-UZ
- 0x28e00000: 705, // vai
- 0x28e52000: 706, // vai-Latn
- 0x28e520b2: 707, // vai-Latn-LR
- 0x28ed9000: 708, // vai-Vaii
- 0x28ed90b2: 709, // vai-Vaii-LR
- 0x28f00000: 710, // ve
- 0x29200000: 711, // vi
- 0x2920013b: 712, // vi-VN
- 0x29700000: 713, // vo
- 0x29700001: 714, // vo-001
- 0x29a00000: 715, // vun
- 0x29a0012d: 716, // vun-TZ
- 0x29b00000: 717, // wa
- 0x29c00000: 718, // wae
- 0x29c0004d: 719, // wae-CH
- 0x2a400000: 720, // wo
- 0x2a900000: 721, // xh
- 0x2b100000: 722, // xog
- 0x2b10012f: 723, // xog-UG
- 0x2b700000: 724, // yav
- 0x2b700051: 725, // yav-CM
- 0x2b900000: 726, // yi
- 0x2b900001: 727, // yi-001
- 0x2ba00000: 728, // yo
- 0x2ba0003a: 729, // yo-BJ
- 0x2ba000d4: 730, // yo-NG
- 0x2bd00000: 731, // yue
- 0x2bd0008b: 732, // yue-HK
- 0x2c300000: 733, // zgh
- 0x2c3000b8: 734, // zgh-MA
- 0x2c400000: 735, // zh
- 0x2c434000: 736, // zh-Hans
- 0x2c434052: 737, // zh-Hans-CN
- 0x2c43408b: 738, // zh-Hans-HK
- 0x2c4340c4: 739, // zh-Hans-MO
- 0x2c43410b: 740, // zh-Hans-SG
- 0x2c435000: 741, // zh-Hant
- 0x2c43508b: 742, // zh-Hant-HK
- 0x2c4350c4: 743, // zh-Hant-MO
- 0x2c43512c: 744, // zh-Hant-TW
- 0x2c600000: 745, // zu
- 0x2c60015e: 746, // zu-ZA
-}
-
-// Total table size 4550 bytes (4KiB); checksum: B6D49547
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/language.go b/Godeps/_workspace/src/golang.org/x/text/language/language.go
deleted file mode 100644
index 5c6dcbd94..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/language.go
+++ /dev/null
@@ -1,975 +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.
-
-//go:generate go run maketables.go gen_common.go -output tables.go
-//go:generate go run gen_index.go
-
-// Package language implements BCP 47 language tags and related functionality.
-//
-// The Tag type, which is used to represent languages, is agnostic to the
-// meaning of its subtags. Tags are not fully canonicalized to preserve
-// information that may be valuable in certain contexts. As a consequence, two
-// different tags may represent identical languages.
-//
-// Initializing language- or locale-specific components usually consists of
-// two steps. The first step is to select a display language based on the
-// preferred languages of the user and the languages supported by an application.
-// The second step is to create the language-specific services based on
-// this selection. Each is discussed in more details below.
-//
-// Matching preferred against supported languages
-//
-// An application may support various languages. This list is typically limited
-// by the languages for which there exists translations of the user interface.
-// Similarly, a user may provide a list of preferred languages which is limited
-// by the languages understood by this user.
-// An application should use a Matcher to find the best supported language based
-// on the user's preferred list.
-// Matchers are aware of the intricacies of equivalence between languages.
-// The default Matcher implementation takes into account things such as
-// deprecated subtags, legacy tags, and mutual intelligibility between scripts
-// and languages.
-//
-// A Matcher for English, Australian English, Danish, and standard Mandarin can
-// be defined as follows:
-//
-// var matcher = language.NewMatcher([]language.Tag{
-// language.English, // The first language is used as fallback.
-// language.MustParse("en-AU"),
-// language.Danish,
-// language.Chinese,
-// })
-//
-// The following code selects the best match for someone speaking Spanish and
-// Norwegian:
-//
-// preferred := []language.Tag{ language.Spanish, language.Norwegian }
-// tag, _, _ := matcher.Match(preferred...)
-//
-// In this case, the best match is Danish, as Danish is sufficiently a match to
-// Norwegian to not have to fall back to the default.
-// See ParseAcceptLanguage on how to handle the Accept-Language HTTP header.
-//
-// Selecting language-specific services
-//
-// One should always use the Tag returned by the Matcher to create an instance
-// of any of the language-specific services provided by the text repository.
-// This prevents the mixing of languages, such as having a different language for
-// messages and display names, as well as improper casing or sorting order for
-// the selected language.
-// Using the returned Tag also allows user-defined settings, such as collation
-// order or numbering system to be transparently passed as options.
-//
-// If you have language-specific data in your application, however, it will in
-// most cases suffice to use the index returned by the matcher to identify
-// the user language.
-// The following loop provides an alternative in case this is not sufficient:
-//
-// supported := map[language.Tag]data{
-// language.English: enData,
-// language.MustParse("en-AU"): enAUData,
-// language.Danish: daData,
-// language.Chinese: zhData,
-// }
-// tag, _, _ := matcher.Match(preferred...)
-// for ; tag != language.Und; tag = tag.Parent() {
-// if v, ok := supported[tag]; ok {
-// return v
-// }
-// }
-// return enData // should not reach here
-//
-// Repeatedly taking the Parent of the tag returned by Match will eventually
-// match one of the tags used to initialize the Matcher.
-//
-// Canonicalization
-//
-// By default, only legacy and deprecated tags are converted into their
-// canonical equivalent. All other information is preserved. This approach makes
-// the confidence scores more accurate and allows matchers to distinguish
-// between variants that are otherwise lost.
-//
-// As a consequence, two tags that should be treated as identical according to
-// BCP 47 or CLDR, like "en-Latn" and "en", will be represented differently. The
-// Matchers will handle such distinctions, though, and are aware of the
-// equivalence relations. The CanonType type can be used to alter the
-// canonicalization form.
-//
-// References
-//
-// BCP 47 - Tags for Identifying Languages
-// http://tools.ietf.org/html/bcp47
-package language
-
-// TODO: Remove above NOTE after:
-// - verifying that tables are dropped correctly (most notably matcher tables).
-
-import (
- "errors"
- "fmt"
- "strings"
-)
-
-const (
- // maxCoreSize is the maximum size of a BCP 47 tag without variants and
- // extensions. Equals max lang (3) + script (4) + max reg (3) + 2 dashes.
- maxCoreSize = 12
-
- // max99thPercentileSize is a somewhat arbitrary buffer size that presumably
- // is large enough to hold at least 99% of the BCP 47 tags.
- max99thPercentileSize = 32
-
- // maxSimpleUExtensionSize is the maximum size of a -u extension with one
- // key-type pair. Equals len("-u-") + key (2) + dash + max value (8).
- maxSimpleUExtensionSize = 14
-)
-
-// Tag represents a BCP 47 language tag. It is used to specify an instance of a
-// specific language or locale. All language tag values are guaranteed to be
-// well-formed.
-type Tag struct {
- lang langID
- region regionID
- script scriptID
- pVariant byte // offset in str, includes preceding '-'
- pExt uint16 // offset of first extension, includes preceding '-'
-
- // str is the string representation of the Tag. It will only be used if the
- // tag has variants or extensions.
- str string
-}
-
-// Make is a convenience wrapper for Parse that omits the error.
-// In case of an error, a sensible default is returned.
-func Make(s string) Tag {
- return Default.Make(s)
-}
-
-// Make is a convenience wrapper for c.Parse that omits the error.
-// In case of an error, a sensible default is returned.
-func (c CanonType) Make(s string) Tag {
- t, _ := c.Parse(s)
- return t
-}
-
-// Raw returns the raw base language, script and region, without making an
-// attempt to infer their values.
-func (t Tag) Raw() (b Base, s Script, r Region) {
- return Base{t.lang}, Script{t.script}, Region{t.region}
-}
-
-// equalTags compares language, script and region subtags only.
-func (t Tag) equalTags(a Tag) bool {
- return t.lang == a.lang && t.script == a.script && t.region == a.region
-}
-
-// IsRoot returns true if t is equal to language "und".
-func (t Tag) IsRoot() bool {
- if int(t.pVariant) < len(t.str) {
- return false
- }
- return t.equalTags(und)
-}
-
-// private reports whether the Tag consists solely of a private use tag.
-func (t Tag) private() bool {
- return t.str != "" && t.pVariant == 0
-}
-
-// CanonType can be used to enable or disable various types of canonicalization.
-type CanonType int
-
-const (
- // Replace deprecated base languages with their preferred replacements.
- DeprecatedBase CanonType = 1 << iota
- // Replace deprecated scripts with their preferred replacements.
- DeprecatedScript
- // Replace deprecated regions with their preferred replacements.
- DeprecatedRegion
- // Remove redundant scripts.
- SuppressScript
- // Normalize legacy encodings. This includes legacy languages defined in
- // CLDR as well as bibliographic codes defined in ISO-639.
- Legacy
- // Map the dominant language of a macro language group to the macro language
- // subtag. For example cmn -> zh.
- Macro
- // The CLDR flag should be used if full compatibility with CLDR is required.
- // There are a few cases where language.Tag may differ from CLDR. To follow all
- // of CLDR's suggestions, use All|CLDR.
- CLDR
-
- // Raw can be used to Compose or Parse without Canonicalization.
- Raw CanonType = 0
-
- // Replace all deprecated tags with their preferred replacements.
- Deprecated = DeprecatedBase | DeprecatedScript | DeprecatedRegion
-
- // All canonicalizations recommended by BCP 47.
- BCP47 = Deprecated | SuppressScript
-
- // All canonicalizations.
- All = BCP47 | Legacy | Macro
-
- // Default is the canonicalization used by Parse, Make and Compose. To
- // preserve as much information as possible, canonicalizations that remove
- // potentially valuable information are not included. The Matcher is
- // designed to recognize similar tags that would be the same if
- // they were canonicalized using All.
- Default = Deprecated | Legacy
-
- canonLang = DeprecatedBase | Legacy | Macro
-
- // TODO: LikelyScript, LikelyRegion: suppress similar to ICU.
-)
-
-// canonicalize returns the canonicalized equivalent of the tag and
-// whether there was any change.
-func (t Tag) canonicalize(c CanonType) (Tag, bool) {
- if c == Raw {
- return t, false
- }
- changed := false
- if c&SuppressScript != 0 {
- if t.lang < langNoIndexOffset && uint8(t.script) == suppressScript[t.lang] {
- t.script = 0
- changed = true
- }
- }
- if c&canonLang != 0 {
- for {
- if l, aliasType := normLang(t.lang); l != t.lang {
- switch aliasType {
- case langLegacy:
- if c&Legacy != 0 {
- if t.lang == _sh && t.script == 0 {
- t.script = _Latn
- }
- t.lang = l
- changed = true
- }
- case langMacro:
- if c&Macro != 0 {
- // We deviate here from CLDR. The mapping "nb" -> "no"
- // qualifies as a typical Macro language mapping. However,
- // for legacy reasons, CLDR maps "no", the macro language
- // code for Norwegian, to the dominant variant "nb". This
- // change is currently under consideration for CLDR as well.
- // See http://unicode.org/cldr/trac/ticket/2698 and also
- // http://unicode.org/cldr/trac/ticket/1790 for some of the
- // practical implications. TODO: this check could be removed
- // if CLDR adopts this change.
- if c&CLDR == 0 || t.lang != _nb {
- changed = true
- t.lang = l
- }
- }
- case langDeprecated:
- if c&DeprecatedBase != 0 {
- if t.lang == _mo && t.region == 0 {
- t.region = _MD
- }
- t.lang = l
- changed = true
- // Other canonicalization types may still apply.
- continue
- }
- }
- } else if c&Legacy != 0 && t.lang == _no && c&CLDR != 0 {
- t.lang = _nb
- changed = true
- }
- break
- }
- }
- if c&DeprecatedScript != 0 {
- if t.script == _Qaai {
- changed = true
- t.script = _Zinh
- }
- }
- if c&DeprecatedRegion != 0 {
- if r := normRegion(t.region); r != 0 {
- changed = true
- t.region = r
- }
- }
- return t, changed
-}
-
-// Canonicalize returns the canonicalized equivalent of the tag.
-func (c CanonType) Canonicalize(t Tag) (Tag, error) {
- t, changed := t.canonicalize(c)
- if changed {
- t.remakeString()
- }
- return t, nil
-}
-
-// Confidence indicates the level of certainty for a given return value.
-// For example, Serbian may be written in Cyrillic or Latin script.
-// The confidence level indicates whether a value was explicitly specified,
-// whether it is typically the only possible value, or whether there is
-// an ambiguity.
-type Confidence int
-
-const (
- No Confidence = iota // full confidence that there was no match
- Low // most likely value picked out of a set of alternatives
- High // value is generally assumed to be the correct match
- Exact // exact match or explicitly specified value
-)
-
-var confName = []string{"No", "Low", "High", "Exact"}
-
-func (c Confidence) String() string {
- return confName[c]
-}
-
-// remakeString is used to update t.str in case lang, script or region changed.
-// It is assumed that pExt and pVariant still point to the start of the
-// respective parts.
-func (t *Tag) remakeString() {
- if t.str == "" {
- return
- }
- extra := t.str[t.pVariant:]
- if t.pVariant > 0 {
- extra = extra[1:]
- }
- if t.equalTags(und) && strings.HasPrefix(extra, "x-") {
- t.str = extra
- t.pVariant = 0
- t.pExt = 0
- return
- }
- var buf [max99thPercentileSize]byte // avoid extra memory allocation in most cases.
- b := buf[:t.genCoreBytes(buf[:])]
- if extra != "" {
- diff := len(b) - int(t.pVariant)
- b = append(b, '-')
- b = append(b, extra...)
- t.pVariant = uint8(int(t.pVariant) + diff)
- t.pExt = uint16(int(t.pExt) + diff)
- } else {
- t.pVariant = uint8(len(b))
- t.pExt = uint16(len(b))
- }
- t.str = string(b)
-}
-
-// genCoreBytes writes a string for the base languages, script and region tags
-// to the given buffer and returns the number of bytes written. It will never
-// write more than maxCoreSize bytes.
-func (t *Tag) genCoreBytes(buf []byte) int {
- n := t.lang.stringToBuf(buf[:])
- if t.script != 0 {
- n += copy(buf[n:], "-")
- n += copy(buf[n:], t.script.String())
- }
- if t.region != 0 {
- n += copy(buf[n:], "-")
- n += copy(buf[n:], t.region.String())
- }
- return n
-}
-
-// String returns the canonical string representation of the language tag.
-func (t Tag) String() string {
- if t.str != "" {
- return t.str
- }
- if t.script == 0 && t.region == 0 {
- return t.lang.String()
- }
- buf := [maxCoreSize]byte{}
- return string(buf[:t.genCoreBytes(buf[:])])
-}
-
-// Base returns the base language of the language tag. If the base language is
-// unspecified, an attempt will be made to infer it from the context.
-// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.
-func (t Tag) Base() (Base, Confidence) {
- if t.lang != 0 {
- return Base{t.lang}, Exact
- }
- c := High
- if t.script == 0 && !(Region{t.region}).IsCountry() {
- c = Low
- }
- if tag, err := addTags(t); err == nil && tag.lang != 0 {
- return Base{tag.lang}, c
- }
- return Base{0}, No
-}
-
-// Script infers the script for the language tag. If it was not explicitly given, it will infer
-// a most likely candidate.
-// If more than one script is commonly used for a language, the most likely one
-// is returned with a low confidence indication. For example, it returns (Cyrl, Low)
-// for Serbian.
-// If a script cannot be inferred (Zzzz, No) is returned. We do not use Zyyy (undetermined)
-// as one would suspect from the IANA registry for BCP 47. In a Unicode context Zyyy marks
-// common characters (like 1, 2, 3, '.', etc.) and is therefore more like multiple scripts.
-// See http://www.unicode.org/reports/tr24/#Values for more details. Zzzz is also used for
-// unknown value in CLDR. (Zzzz, Exact) is returned if Zzzz was explicitly specified.
-// Note that an inferred script is never guaranteed to be the correct one. Latin is
-// almost exclusively used for Afrikaans, but Arabic has been used for some texts
-// in the past. Also, the script that is commonly used may change over time.
-// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.
-func (t Tag) Script() (Script, Confidence) {
- if t.script != 0 {
- return Script{t.script}, Exact
- }
- sc, c := scriptID(_Zzzz), No
- if t.lang < langNoIndexOffset {
- if scr := scriptID(suppressScript[t.lang]); scr != 0 {
- // Note: it is not always the case that a language with a suppress
- // script value is only written in one script (e.g. kk, ms, pa).
- if t.region == 0 {
- return Script{scriptID(scr)}, High
- }
- sc, c = scr, High
- }
- }
- if tag, err := addTags(t); err == nil {
- if tag.script != sc {
- sc, c = tag.script, Low
- }
- } else {
- t, _ = (Deprecated | Macro).Canonicalize(t)
- if tag, err := addTags(t); err == nil && tag.script != sc {
- sc, c = tag.script, Low
- }
- }
- return Script{sc}, c
-}
-
-// Region returns the region for the language tag. If it was not explicitly given, it will
-// infer a most likely candidate from the context.
-// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.
-func (t Tag) Region() (Region, Confidence) {
- if t.region != 0 {
- return Region{t.region}, Exact
- }
- if t, err := addTags(t); err == nil {
- return Region{t.region}, Low // TODO: differentiate between high and low.
- }
- t, _ = (Deprecated | Macro).Canonicalize(t)
- if tag, err := addTags(t); err == nil {
- return Region{tag.region}, Low
- }
- return Region{_ZZ}, No // TODO: return world instead of undetermined?
-}
-
-// Variant returns the variants specified explicitly for this language tag.
-// or nil if no variant was specified.
-func (t Tag) Variants() []Variant {
- v := []Variant{}
- if int(t.pVariant) < int(t.pExt) {
- for x, str := "", t.str[t.pVariant:t.pExt]; str != ""; {
- x, str = nextToken(str)
- v = append(v, Variant{x})
- }
- }
- return v
-}
-
-// Parent returns the CLDR parent of t. In CLDR, missing fields in data for a
-// specific language are substituted with fields from the parent language.
-// The parent for a language may change for newer versions of CLDR.
-func (t Tag) Parent() Tag {
- if t.str != "" {
- // Strip the variants and extensions.
- t, _ = Raw.Compose(t.Raw())
- if t.region == 0 && t.script != 0 && t.lang != 0 {
- base, _ := addTags(Tag{lang: t.lang})
- if base.script == t.script {
- return Tag{lang: t.lang}
- }
- }
- return t
- }
- if t.lang != 0 {
- if t.region != 0 {
- maxScript := t.script
- if maxScript == 0 {
- max, _ := addTags(t)
- maxScript = max.script
- }
-
- for i := range parents {
- if langID(parents[i].lang) == t.lang && scriptID(parents[i].maxScript) == maxScript {
- for _, r := range parents[i].fromRegion {
- if regionID(r) == t.region {
- return Tag{
- lang: t.lang,
- script: scriptID(parents[i].script),
- region: regionID(parents[i].toRegion),
- }
- }
- }
- }
- }
-
- // Strip the script if it is the default one.
- base, _ := addTags(Tag{lang: t.lang})
- if base.script != maxScript {
- return Tag{lang: t.lang, script: maxScript}
- }
- return Tag{lang: t.lang}
- } else if t.script != 0 {
- // The parent for an base-script pair with a non-default script is
- // "und" instead of the base language.
- base, _ := addTags(Tag{lang: t.lang})
- if base.script != t.script {
- return und
- }
- return Tag{lang: t.lang}
- }
- }
- return und
-}
-
-// returns token t and the rest of the string.
-func nextToken(s string) (t, tail string) {
- p := strings.Index(s[1:], "-")
- if p == -1 {
- return s[1:], ""
- }
- p++
- return s[1:p], s[p:]
-}
-
-// Extension is a single BCP 47 extension.
-type Extension struct {
- s string
-}
-
-// String returns the string representation of the extension, including the
-// type tag.
-func (e Extension) String() string {
- return e.s
-}
-
-// ParseExtension parses s as an extension and returns it on success.
-func ParseExtension(s string) (e Extension, err error) {
- scan := makeScannerString(s)
- var end int
- if n := len(scan.token); n != 1 {
- return Extension{}, errSyntax
- }
- scan.toLower(0, len(scan.b))
- end = parseExtension(&scan)
- if end != len(s) {
- return Extension{}, errSyntax
- }
- return Extension{string(scan.b)}, nil
-}
-
-// Type returns the one-byte extension type of e. It returns 0 for the zero
-// exception.
-func (e Extension) Type() byte {
- if e.s == "" {
- return 0
- }
- return e.s[0]
-}
-
-// Tokens returns the list of tokens of e.
-func (e Extension) Tokens() []string {
- return strings.Split(e.s, "-")
-}
-
-// Extension returns the extension of type x for tag t. It will return
-// false for ok if t does not have the requested extension. The returned
-// extension will be invalid in this case.
-func (t Tag) Extension(x byte) (ext Extension, ok bool) {
- for i := int(t.pExt); i < len(t.str)-1; {
- var ext string
- i, ext = getExtension(t.str, i)
- if ext[0] == x {
- return Extension{ext}, true
- }
- }
- return Extension{string(x)}, false
-}
-
-// Extensions returns all extensions of t.
-func (t Tag) Extensions() []Extension {
- e := []Extension{}
- for i := int(t.pExt); i < len(t.str)-1; {
- var ext string
- i, ext = getExtension(t.str, i)
- e = append(e, Extension{ext})
- }
- return e
-}
-
-// TypeForKey returns the type associated with the given key, where key and type
-// are of the allowed values defined for the Unicode locale extension ('u') in
-// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.
-// TypeForKey will traverse the inheritance chain to get the correct value.
-func (t Tag) TypeForKey(key string) string {
- if start, end, _ := t.findTypeForKey(key); end != start {
- return t.str[start:end]
- }
- return ""
-}
-
-var (
- errPrivateUse = errors.New("cannot set a key on a private use tag")
- errInvalidArguments = errors.New("invalid key or type")
-)
-
-// SetTypeForKey returns a new Tag with the key set to type, where key and type
-// are of the allowed values defined for the Unicode locale extension ('u') in
-// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.
-// An empty value removes an existing pair with the same key.
-func (t Tag) SetTypeForKey(key, value string) (Tag, error) {
- if t.private() {
- return t, errPrivateUse
- }
- if len(key) != 2 {
- return t, errInvalidArguments
- }
-
- // Remove the setting if value is "".
- if value == "" {
- start, end, _ := t.findTypeForKey(key)
- if start != end {
- // Remove key tag and leading '-'.
- start -= 4
-
- // Remove a possible empty extension.
- if (end == len(t.str) || t.str[end+2] == '-') && t.str[start-2] == '-' {
- start -= 2
- }
- if start == int(t.pVariant) && end == len(t.str) {
- t.str = ""
- t.pVariant, t.pExt = 0, 0
- } else {
- t.str = fmt.Sprintf("%s%s", t.str[:start], t.str[end:])
- }
- }
- return t, nil
- }
-
- if len(value) < 3 || len(value) > 8 {
- return t, errInvalidArguments
- }
-
- var (
- buf [maxCoreSize + maxSimpleUExtensionSize]byte
- uStart int // start of the -u extension.
- )
-
- // Generate the tag string if needed.
- if t.str == "" {
- uStart = t.genCoreBytes(buf[:])
- buf[uStart] = '-'
- uStart++
- }
-
- // Create new key-type pair and parse it to verify.
- b := buf[uStart:]
- copy(b, "u-")
- copy(b[2:], key)
- b[4] = '-'
- b = b[:5+copy(b[5:], value)]
- scan := makeScanner(b)
- if parseExtensions(&scan); scan.err != nil {
- return t, scan.err
- }
-
- // Assemble the replacement string.
- if t.str == "" {
- t.pVariant, t.pExt = byte(uStart-1), uint16(uStart-1)
- t.str = string(buf[:uStart+len(b)])
- } else {
- s := t.str
- start, end, hasExt := t.findTypeForKey(key)
- if start == end {
- if hasExt {
- b = b[2:]
- }
- t.str = fmt.Sprintf("%s-%s%s", s[:start], b, s[end:])
- } else {
- t.str = fmt.Sprintf("%s%s%s", s[:start], value, s[end:])
- }
- }
- return t, nil
-}
-
-// findKeyAndType returns the start and end position for the type corresponding
-// to key or the point at which to insert the key-value pair if the type
-// wasn't found. The hasExt return value reports whether an -u extension was present.
-// Note: the extensions are typically very small and are likely to contain
-// only one key-type pair.
-func (t Tag) findTypeForKey(key string) (start, end int, hasExt bool) {
- p := int(t.pExt)
- if len(key) != 2 || p == len(t.str) || p == 0 {
- return p, p, false
- }
- s := t.str
-
- // Find the correct extension.
- for p++; s[p] != 'u'; p++ {
- if s[p] > 'u' {
- p--
- return p, p, false
- }
- if p = nextExtension(s, p); p == len(s) {
- return len(s), len(s), false
- }
- }
- // Proceed to the hyphen following the extension name.
- p++
-
- // curKey is the key currently being processed.
- curKey := ""
-
- // Iterate over keys until we get the end of a section.
- for {
- // p points to the hyphen preceding the current token.
- if p3 := p + 3; s[p3] == '-' {
- // Found a key.
- // Check whether we just processed the key that was requested.
- if curKey == key {
- return start, p, true
- }
- // Set to the next key and continue scanning type tokens.
- curKey = s[p+1 : p3]
- if curKey > key {
- return p, p, true
- }
- // Start of the type token sequence.
- start = p + 4
- // A type is at least 3 characters long.
- p += 7 // 4 + 3
- } else {
- // Attribute or type, which is at least 3 characters long.
- p += 4
- }
- // p points past the third character of a type or attribute.
- max := p + 5 // maximum length of token plus hyphen.
- if len(s) < max {
- max = len(s)
- }
- for ; p < max && s[p] != '-'; p++ {
- }
- // Bail if we have exhausted all tokens or if the next token starts
- // a new extension.
- if p == len(s) || s[p+2] == '-' {
- if curKey == key {
- return start, p, true
- }
- return p, p, true
- }
- }
-}
-
-// CompactIndex returns an index, where 0 <= index < NumCompactTags, for tags
-// for which data exists in the text repository. The index will change over time
-// and should not be stored in persistent storage. Extensions, except for the
-// 'va' type of the 'u' extension, are ignored. It will return 0, false if no
-// compact tag exists, where 0 is the index for the root language (Und).
-func CompactIndex(t Tag) (index int, ok bool) {
- // TODO: perhaps give more frequent tags a lower index.
- // TODO: we could make the indexes stable. This will excluded some
- // possibilities for optimization, so don't do this quite yet.
- b, s, r := t.Raw()
- if len(t.str) > 0 {
- if strings.HasPrefix(t.str, "x-") {
- // We have no entries for user-defined tags.
- return 0, false
- }
- if uint16(t.pVariant) != t.pExt {
- // There are no tags with variants and an u-va type.
- if t.TypeForKey("va") != "" {
- return 0, false
- }
- t, _ = Raw.Compose(b, s, r, t.Variants())
- } else if _, ok := t.Extension('u'); ok {
- // Strip all but the 'va' entry.
- variant := t.TypeForKey("va")
- t, _ = Raw.Compose(b, s, r)
- t, _ = t.SetTypeForKey("va", variant)
- }
- if len(t.str) > 0 {
- // We have some variants.
- for i, s := range specialTags {
- if s == t {
- return i + 1, true
- }
- }
- return 0, false
- }
- }
- // No variants specified: just compare core components.
- // The key has the form lllssrrr, where l, s, and r are nibbles for
- // respectively the langID, scriptID, and regionID.
- key := uint32(b.langID) << (8 + 12)
- key |= uint32(s.scriptID) << 12
- key |= uint32(r.regionID)
- x, ok := coreTags[key]
- return int(x), ok
-}
-
-// Base is an ISO 639 language code, used for encoding the base language
-// of a language tag.
-type Base struct {
- langID
-}
-
-// ParseBase parses a 2- or 3-letter ISO 639 code.
-// It returns a ValueError if s is a well-formed but unknown language identifier
-// or another error if another error occurred.
-func ParseBase(s string) (Base, error) {
- if n := len(s); n < 2 || 3 < n {
- return Base{}, errSyntax
- }
- var buf [3]byte
- l, err := getLangID(buf[:copy(buf[:], s)])
- return Base{l}, err
-}
-
-// Script is a 4-letter ISO 15924 code for representing scripts.
-// It is idiomatically represented in title case.
-type Script struct {
- scriptID
-}
-
-// ParseScript parses a 4-letter ISO 15924 code.
-// It returns a ValueError if s is a well-formed but unknown script identifier
-// or another error if another error occurred.
-func ParseScript(s string) (Script, error) {
- if len(s) != 4 {
- return Script{}, errSyntax
- }
- var buf [4]byte
- sc, err := getScriptID(script, buf[:copy(buf[:], s)])
- return Script{sc}, err
-}
-
-// Region is an ISO 3166-1 or UN M.49 code for representing countries and regions.
-type Region struct {
- regionID
-}
-
-// EncodeM49 returns the Region for the given UN M.49 code.
-// It returns an error if r is not a valid code.
-func EncodeM49(r int) (Region, error) {
- rid, err := getRegionM49(r)
- return Region{rid}, err
-}
-
-// ParseRegion parses a 2- or 3-letter ISO 3166-1 or a UN M.49 code.
-// It returns a ValueError if s is a well-formed but unknown region identifier
-// or another error if another error occurred.
-func ParseRegion(s string) (Region, error) {
- if n := len(s); n < 2 || 3 < n {
- return Region{}, errSyntax
- }
- var buf [3]byte
- r, err := getRegionID(buf[:copy(buf[:], s)])
- return Region{r}, err
-}
-
-// IsCountry returns whether this region is a country or autonomous area. This
-// includes non-standard definitions from CLDR.
-func (r Region) IsCountry() bool {
- if r.regionID == 0 || r.IsGroup() || r.IsPrivateUse() && r.regionID != _XK {
- return false
- }
- return true
-}
-
-// IsGroup returns whether this region defines a collection of regions. This
-// includes non-standard definitions from CLDR.
-func (r Region) IsGroup() bool {
- if r.regionID == 0 {
- return false
- }
- return int(regionInclusion[r.regionID]) < len(regionContainment)
-}
-
-// Contains returns whether Region c is contained by Region r. It returns true
-// if c == r.
-func (r Region) Contains(c Region) bool {
- return r.regionID.contains(c.regionID)
-}
-
-func (r regionID) contains(c regionID) bool {
- if r == c {
- return true
- }
- g := regionInclusion[r]
- if g >= nRegionGroups {
- return false
- }
- m := regionContainment[g]
-
- d := regionInclusion[c]
- b := regionInclusionBits[d]
-
- // A contained country may belong to multiple disjoint groups. Matching any
- // of these indicates containment. If the contained region is a group, it
- // must strictly be a subset.
- if d >= nRegionGroups {
- return b&m != 0
- }
- return b&^m == 0
-}
-
-var errNoTLD = errors.New("language: region is not a valid ccTLD")
-
-// TLD returns the country code top-level domain (ccTLD). UK is returned for GB.
-// In all other cases it returns either the region itself or an error.
-//
-// This method may return an error for a region for which there exists a
-// canonical form with a ccTLD. To get that ccTLD canonicalize r first. The
-// region will already be canonicalized it was obtained from a Tag that was
-// obtained using any of the default methods.
-func (r Region) TLD() (Region, error) {
- // See http://en.wikipedia.org/wiki/Country_code_top-level_domain for the
- // difference between ISO 3166-1 and IANA ccTLD.
- if r.regionID == _GB {
- r = Region{_UK}
- }
- if (r.typ() & ccTLD) == 0 {
- return Region{}, errNoTLD
- }
- return r, nil
-}
-
-// Canonicalize returns the region or a possible replacement if the region is
-// deprecated. It will not return a replacement for deprecated regions that
-// are split into multiple regions.
-func (r Region) Canonicalize() Region {
- if cr := normRegion(r.regionID); cr != 0 {
- return Region{cr}
- }
- return r
-}
-
-// Variant represents a registered variant of a language as defined by BCP 47.
-type Variant struct {
- variant string
-}
-
-// ParseVariant parses and returns a Variant. An error is returned if s is not
-// a valid variant.
-func ParseVariant(s string) (Variant, error) {
- s = strings.ToLower(s)
- if _, ok := variantIndex[s]; ok {
- return Variant{s}, nil
- }
- return Variant{}, mkErrInvalid([]byte(s))
-}
-
-// String returns the string representation of the variant.
-func (v Variant) String() string {
- return v.variant
-}
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/lookup.go b/Godeps/_workspace/src/golang.org/x/text/language/lookup.go
deleted file mode 100644
index 1d80ac370..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/lookup.go
+++ /dev/null
@@ -1,396 +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 language
-
-import (
- "bytes"
- "fmt"
- "sort"
- "strconv"
-
- "golang.org/x/text/internal/tag"
-)
-
-// findIndex tries to find the given tag in idx and returns a standardized error
-// if it could not be found.
-func findIndex(idx tag.Index, key []byte, form string) (index int, err error) {
- if !tag.FixCase(form, key) {
- return 0, errSyntax
- }
- i := idx.Index(key)
- if i == -1 {
- return 0, mkErrInvalid(key)
- }
- return i, nil
-}
-
-func searchUint(imap []uint16, key uint16) int {
- return sort.Search(len(imap), func(i int) bool {
- return imap[i] >= key
- })
-}
-
-type langID uint16
-
-// getLangID returns the langID of s if s is a canonical subtag
-// or langUnknown if s is not a canonical subtag.
-func getLangID(s []byte) (langID, error) {
- if len(s) == 2 {
- return getLangISO2(s)
- }
- return getLangISO3(s)
-}
-
-// mapLang returns the mapped langID of id according to mapping m.
-func normLang(id langID) (langID, langAliasType) {
- k := sort.Search(len(langAliasMap), func(i int) bool {
- return langAliasMap[i].from >= uint16(id)
- })
- if k < len(langAliasMap) && langAliasMap[k].from == uint16(id) {
- return langID(langAliasMap[k].to), langAliasTypes[k]
- }
- return id, langAliasTypeUnknown
-}
-
-// getLangISO2 returns the langID for the given 2-letter ISO language code
-// or unknownLang if this does not exist.
-func getLangISO2(s []byte) (langID, error) {
- if !tag.FixCase("zz", s) {
- return 0, errSyntax
- }
- if i := lang.Index(s); i != -1 && lang.Elem(i)[3] != 0 {
- return langID(i), nil
- }
- return 0, mkErrInvalid(s)
-}
-
-const base = 'z' - 'a' + 1
-
-func strToInt(s []byte) uint {
- v := uint(0)
- for i := 0; i < len(s); i++ {
- v *= base
- v += uint(s[i] - 'a')
- }
- return v
-}
-
-// converts the given integer to the original ASCII string passed to strToInt.
-// len(s) must match the number of characters obtained.
-func intToStr(v uint, s []byte) {
- for i := len(s) - 1; i >= 0; i-- {
- s[i] = byte(v%base) + 'a'
- v /= base
- }
-}
-
-// getLangISO3 returns the langID for the given 3-letter ISO language code
-// or unknownLang if this does not exist.
-func getLangISO3(s []byte) (langID, error) {
- if tag.FixCase("und", s) {
- // first try to match canonical 3-letter entries
- for i := lang.Index(s[:2]); i != -1; i = lang.Next(s[:2], i) {
- if e := lang.Elem(i); e[3] == 0 && e[2] == s[2] {
- // We treat "und" as special and always translate it to "unspecified".
- // Note that ZZ and Zzzz are private use and are not treated as
- // unspecified by default.
- id := langID(i)
- if id == nonCanonicalUnd {
- return 0, nil
- }
- return id, nil
- }
- }
- if i := altLangISO3.Index(s); i != -1 {
- return langID(altLangIndex[altLangISO3.Elem(i)[3]]), nil
- }
- n := strToInt(s)
- if langNoIndex[n/8]&(1<<(n%8)) != 0 {
- return langID(n) + langNoIndexOffset, nil
- }
- // Check for non-canonical uses of ISO3.
- for i := lang.Index(s[:1]); i != -1; i = lang.Next(s[:1], i) {
- if e := lang.Elem(i); e[2] == s[1] && e[3] == s[2] {
- return langID(i), nil
- }
- }
- return 0, mkErrInvalid(s)
- }
- return 0, errSyntax
-}
-
-// stringToBuf writes the string to b and returns the number of bytes
-// written. cap(b) must be >= 3.
-func (id langID) stringToBuf(b []byte) int {
- if id >= langNoIndexOffset {
- intToStr(uint(id)-langNoIndexOffset, b[:3])
- return 3
- } else if id == 0 {
- return copy(b, "und")
- }
- l := lang[id<<2:]
- if l[3] == 0 {
- return copy(b, l[:3])
- }
- return copy(b, l[:2])
-}
-
-// String returns the BCP 47 representation of the langID.
-// Use b as variable name, instead of id, to ensure the variable
-// used is consistent with that of Base in which this type is embedded.
-func (b langID) String() string {
- if b == 0 {
- return "und"
- } else if b >= langNoIndexOffset {
- b -= langNoIndexOffset
- buf := [3]byte{}
- intToStr(uint(b), buf[:])
- return string(buf[:])
- }
- l := lang.Elem(int(b))
- if l[3] == 0 {
- return l[:3]
- }
- return l[:2]
-}
-
-// ISO3 returns the ISO 639-3 language code.
-func (b langID) ISO3() string {
- if b == 0 || b >= langNoIndexOffset {
- return b.String()
- }
- l := lang.Elem(int(b))
- if l[3] == 0 {
- return l[:3]
- } else if l[2] == 0 {
- return altLangISO3.Elem(int(l[3]))[:3]
- }
- // This allocation will only happen for 3-letter ISO codes
- // that are non-canonical BCP 47 language identifiers.
- return l[0:1] + l[2:4]
-}
-
-// IsPrivateUse reports whether this language code is reserved for private use.
-func (b langID) IsPrivateUse() bool {
- return langPrivateStart <= b && b <= langPrivateEnd
-}
-
-type regionID uint16
-
-// getRegionID returns the region id for s if s is a valid 2-letter region code
-// or unknownRegion.
-func getRegionID(s []byte) (regionID, error) {
- if len(s) == 3 {
- if isAlpha(s[0]) {
- return getRegionISO3(s)
- }
- if i, err := strconv.ParseUint(string(s), 10, 10); err == nil {
- return getRegionM49(int(i))
- }
- }
- return getRegionISO2(s)
-}
-
-// getRegionISO2 returns the regionID for the given 2-letter ISO country code
-// or unknownRegion if this does not exist.
-func getRegionISO2(s []byte) (regionID, error) {
- i, err := findIndex(regionISO, s, "ZZ")
- if err != nil {
- return 0, err
- }
- return regionID(i) + isoRegionOffset, nil
-}
-
-// getRegionISO3 returns the regionID for the given 3-letter ISO country code
-// or unknownRegion if this does not exist.
-func getRegionISO3(s []byte) (regionID, error) {
- if tag.FixCase("ZZZ", s) {
- for i := regionISO.Index(s[:1]); i != -1; i = regionISO.Next(s[:1], i) {
- if e := regionISO.Elem(i); e[2] == s[1] && e[3] == s[2] {
- return regionID(i) + isoRegionOffset, nil
- }
- }
- for i := 0; i < len(altRegionISO3); i += 3 {
- if tag.Compare(altRegionISO3[i:i+3], s) == 0 {
- return regionID(altRegionIDs[i/3]), nil
- }
- }
- return 0, mkErrInvalid(s)
- }
- return 0, errSyntax
-}
-
-func getRegionM49(n int) (regionID, error) {
- if 0 < n && n <= 999 {
- const (
- searchBits = 7
- regionBits = 9
- regionMask = 1<<regionBits - 1
- )
- idx := n >> searchBits
- buf := fromM49[m49Index[idx]:m49Index[idx+1]]
- val := uint16(n) << regionBits // we rely on bits shifting out
- i := sort.Search(len(buf), func(i int) bool {
- return buf[i] >= val
- })
- if r := fromM49[int(m49Index[idx])+i]; r&^regionMask == val {
- return regionID(r & regionMask), nil
- }
- }
- var e ValueError
- fmt.Fprint(bytes.NewBuffer([]byte(e.v[:])), n)
- return 0, e
-}
-
-// normRegion returns a region if r is deprecated or 0 otherwise.
-// TODO: consider supporting BYS (-> BLR), CSK (-> 200 or CZ), PHI (-> PHL) and AFI (-> DJ).
-// TODO: consider mapping split up regions to new most populous one (like CLDR).
-func normRegion(r regionID) regionID {
- m := regionOldMap
- k := sort.Search(len(m), func(i int) bool {
- return m[i].from >= uint16(r)
- })
- if k < len(m) && m[k].from == uint16(r) {
- return regionID(m[k].to)
- }
- return 0
-}
-
-const (
- iso3166UserAssigned = 1 << iota
- ccTLD
- bcp47Region
-)
-
-func (r regionID) typ() byte {
- return regionTypes[r]
-}
-
-// String returns the BCP 47 representation for the region.
-// It returns "ZZ" for an unspecified region.
-func (r regionID) String() string {
- if r < isoRegionOffset {
- if r == 0 {
- return "ZZ"
- }
- return fmt.Sprintf("%03d", r.M49())
- }
- r -= isoRegionOffset
- return regionISO.Elem(int(r))[:2]
-}
-
-// ISO3 returns the 3-letter ISO code of r.
-// Note that not all regions have a 3-letter ISO code.
-// In such cases this method returns "ZZZ".
-func (r regionID) ISO3() string {
- if r < isoRegionOffset {
- return "ZZZ"
- }
- r -= isoRegionOffset
- reg := regionISO.Elem(int(r))
- switch reg[2] {
- case 0:
- return altRegionISO3[reg[3]:][:3]
- case ' ':
- return "ZZZ"
- }
- return reg[0:1] + reg[2:4]
-}
-
-// M49 returns the UN M.49 encoding of r, or 0 if this encoding
-// is not defined for r.
-func (r regionID) M49() int {
- return int(m49[r])
-}
-
-// IsPrivateUse reports whether r has the ISO 3166 User-assigned status. This
-// may include private-use tags that are assigned by CLDR and used in this
-// implementation. So IsPrivateUse and IsCountry can be simultaneously true.
-func (r regionID) IsPrivateUse() bool {
- return r.typ()&iso3166UserAssigned != 0
-}
-
-type scriptID uint8
-
-// getScriptID returns the script id for string s. It assumes that s
-// is of the format [A-Z][a-z]{3}.
-func getScriptID(idx tag.Index, s []byte) (scriptID, error) {
- i, err := findIndex(idx, s, "Zzzz")
- return scriptID(i), err
-}
-
-// String returns the script code in title case.
-// It returns "Zzzz" for an unspecified script.
-func (s scriptID) String() string {
- if s == 0 {
- return "Zzzz"
- }
- return script.Elem(int(s))
-}
-
-// IsPrivateUse reports whether this script code is reserved for private use.
-func (s scriptID) IsPrivateUse() bool {
- return _Qaaa <= s && s <= _Qabx
-}
-
-const (
- maxAltTaglen = len("en-US-POSIX")
- maxLen = maxAltTaglen
-)
-
-var (
- // grandfatheredMap holds a mapping from legacy and grandfathered tags to
- // their base language or index to more elaborate tag.
- grandfatheredMap = map[[maxLen]byte]int16{
- [maxLen]byte{'a', 'r', 't', '-', 'l', 'o', 'j', 'b', 'a', 'n'}: _jbo, // art-lojban
- [maxLen]byte{'i', '-', 'a', 'm', 'i'}: _ami, // i-ami
- [maxLen]byte{'i', '-', 'b', 'n', 'n'}: _bnn, // i-bnn
- [maxLen]byte{'i', '-', 'h', 'a', 'k'}: _hak, // i-hak
- [maxLen]byte{'i', '-', 'k', 'l', 'i', 'n', 'g', 'o', 'n'}: _tlh, // i-klingon
- [maxLen]byte{'i', '-', 'l', 'u', 'x'}: _lb, // i-lux
- [maxLen]byte{'i', '-', 'n', 'a', 'v', 'a', 'j', 'o'}: _nv, // i-navajo
- [maxLen]byte{'i', '-', 'p', 'w', 'n'}: _pwn, // i-pwn
- [maxLen]byte{'i', '-', 't', 'a', 'o'}: _tao, // i-tao
- [maxLen]byte{'i', '-', 't', 'a', 'y'}: _tay, // i-tay
- [maxLen]byte{'i', '-', 't', 's', 'u'}: _tsu, // i-tsu
- [maxLen]byte{'n', 'o', '-', 'b', 'o', 'k'}: _nb, // no-bok
- [maxLen]byte{'n', 'o', '-', 'n', 'y', 'n'}: _nn, // no-nyn
- [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'f', 'r'}: _sfb, // sgn-BE-FR
- [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'n', 'l'}: _vgt, // sgn-BE-NL
- [maxLen]byte{'s', 'g', 'n', '-', 'c', 'h', '-', 'd', 'e'}: _sgg, // sgn-CH-DE
- [maxLen]byte{'z', 'h', '-', 'g', 'u', 'o', 'y', 'u'}: _cmn, // zh-guoyu
- [maxLen]byte{'z', 'h', '-', 'h', 'a', 'k', 'k', 'a'}: _hak, // zh-hakka
- [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n', '-', 'n', 'a', 'n'}: _nan, // zh-min-nan
- [maxLen]byte{'z', 'h', '-', 'x', 'i', 'a', 'n', 'g'}: _hsn, // zh-xiang
-
- // Grandfathered tags with no modern replacement will be converted as
- // follows:
- [maxLen]byte{'c', 'e', 'l', '-', 'g', 'a', 'u', 'l', 'i', 's', 'h'}: -1, // cel-gaulish
- [maxLen]byte{'e', 'n', '-', 'g', 'b', '-', 'o', 'e', 'd'}: -2, // en-GB-oed
- [maxLen]byte{'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}: -3, // i-default
- [maxLen]byte{'i', '-', 'e', 'n', 'o', 'c', 'h', 'i', 'a', 'n'}: -4, // i-enochian
- [maxLen]byte{'i', '-', 'm', 'i', 'n', 'g', 'o'}: -5, // i-mingo
- [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n'}: -6, // zh-min
-
- // CLDR-specific tag.
- [maxLen]byte{'r', 'o', 'o', 't'}: 0, // root
- [maxLen]byte{'e', 'n', '-', 'u', 's', '-', 'p', 'o', 's', 'i', 'x'}: -7, // en_US_POSIX"
- }
-
- altTagIndex = [...]uint8{0, 17, 31, 45, 61, 74, 86, 102}
-
- altTags = "xtg-x-cel-gaulishen-GB-oxendicten-x-i-defaultund-x-i-enochiansee-x-i-mingonan-x-zh-minen-US-u-va-posix"
-)
-
-func grandfathered(s [maxAltTaglen]byte) (t Tag, ok bool) {
- if v, ok := grandfatheredMap[s]; ok {
- if v < 0 {
- return Make(altTags[altTagIndex[-v-1]:altTagIndex[-v]]), true
- }
- t.lang = langID(v)
- return t, true
- }
- return t, false
-}
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/maketables.go b/Godeps/_workspace/src/golang.org/x/text/language/maketables.go
deleted file mode 100644
index 2cc995b37..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/maketables.go
+++ /dev/null
@@ -1,1635 +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 ignore
-
-// Language tag table generator.
-// Data read from the web.
-
-package main
-
-import (
- "bufio"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "math"
- "reflect"
- "regexp"
- "sort"
- "strconv"
- "strings"
-
- "golang.org/x/text/internal/gen"
- "golang.org/x/text/internal/tag"
- "golang.org/x/text/unicode/cldr"
-)
-
-var (
- test = flag.Bool("test",
- false,
- "test existing tables; can be used to compare web data with package data.")
- outputFile = flag.String("output",
- "tables.go",
- "output file for generated tables")
-)
-
-var comment = []string{
- `
-lang holds an alphabetically sorted list of ISO-639 language identifiers.
-All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag.
-For 2-byte language identifiers, the two successive bytes have the following meaning:
- - if the first letter of the 2- and 3-letter ISO codes are the same:
- the second and third letter of the 3-letter ISO code.
- - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3.
-For 3-byte language identifiers the 4th byte is 0.`,
- `
-langNoIndex is a bit vector of all 3-letter language codes that are not used as an index
-in lookup tables. The language ids for these language codes are derived directly
-from the letters and are not consecutive.`,
- `
-altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives
-to 2-letter language codes that cannot be derived using the method described above.
-Each 3-letter code is followed by its 1-byte langID.`,
- `
-altLangIndex is used to convert indexes in altLangISO3 to langIDs.`,
- `
-langAliasMap maps langIDs to their suggested replacements.`,
- `
-script is an alphabetically sorted list of ISO 15924 codes. The index
-of the script in the string, divided by 4, is the internal scriptID.`,
- `
-isoRegionOffset needs to be added to the index of regionISO to obtain the regionID
-for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for
-the UN.M49 codes used for groups.)`,
- `
-regionISO holds a list of alphabetically sorted 2-letter ISO region codes.
-Each 2-letter codes is followed by two bytes with the following meaning:
- - [A-Z}{2}: the first letter of the 2-letter code plus these two
- letters form the 3-letter ISO code.
- - 0, n: index into altRegionISO3.`,
- `
-regionTypes defines the status of a region for various standards.`,
- `
-m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are
-codes indicating collections of regions.`,
- `
-m49Index gives indexes into fromM49 based on the three most significant bits
-of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in
- fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]]
-for an entry where the first 7 bits match the 7 lsb of the UN.M49 code.
-The region code is stored in the 9 lsb of the indexed value.`,
- `
-fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.`,
- `
-altRegionISO3 holds a list of 3-letter region codes that cannot be
-mapped to 2-letter codes using the default algorithm. This is a short list.`,
- `
-altRegionIDs holds a list of regionIDs the positions of which match those
-of the 3-letter ISO codes in altRegionISO3.`,
- `
-variantNumSpecialized is the number of specialized variants in variants.`,
- `
-suppressScript is an index from langID to the dominant script for that language,
-if it exists. If a script is given, it should be suppressed from the language tag.`,
- `
-likelyLang is a lookup table, indexed by langID, for the most likely
-scripts and regions given incomplete information. If more entries exist for a
-given language, region and script are the index and size respectively
-of the list in likelyLangList.`,
- `
-likelyLangList holds lists info associated with likelyLang.`,
- `
-likelyRegion is a lookup table, indexed by regionID, for the most likely
-languages and scripts given incomplete information. If more entries exist
-for a given regionID, lang and script are the index and size respectively
-of the list in likelyRegionList.
-TODO: exclude containers and user-definable regions from the list.`,
- `
-likelyRegionList holds lists info associated with likelyRegion.`,
- `
-likelyScript is a lookup table, indexed by scriptID, for the most likely
-languages and regions given a script.`,
- `
-matchLang holds pairs of langIDs of base languages that are typically
-mutually intelligible. Each pair is associated with a confidence and
-whether the intelligibility goes one or both ways.`,
- `
-matchScript holds pairs of scriptIDs where readers of one script
-can typically also read the other. Each is associated with a confidence.`,
- `
-nRegionGroups is the number of region groups.`,
- `
-regionInclusion maps region identifiers to sets of regions in regionInclusionBits,
-where each set holds all groupings that are directly connected in a region
-containment graph.`,
- `
-regionInclusionBits is an array of bit vectors where every vector represents
-a set of region groupings. These sets are used to compute the distance
-between two regions for the purpose of language matching.`,
- `
-regionInclusionNext marks, for each entry in regionInclusionBits, the set of
-all groups that are reachable from the groups set in the respective entry.`,
-}
-
-// TODO: consider changing some of these structures to tries. This can reduce
-// memory, but may increase the need for memory allocations. This could be
-// mitigated if we can piggyback on language tags for common cases.
-
-func failOnError(e error) {
- if e != nil {
- log.Panic(e)
- }
-}
-
-type setType int
-
-const (
- Indexed setType = 1 + iota // all elements must be of same size
- Linear
-)
-
-type stringSet struct {
- s []string
- sorted, frozen bool
-
- // We often need to update values after the creation of an index is completed.
- // We include a convenience map for keeping track of this.
- update map[string]string
- typ setType // used for checking.
-}
-
-func (ss *stringSet) clone() stringSet {
- c := *ss
- c.s = append([]string(nil), c.s...)
- return c
-}
-
-func (ss *stringSet) setType(t setType) {
- if ss.typ != t && ss.typ != 0 {
- log.Panicf("type %d cannot be assigned as it was already %d", t, ss.typ)
- }
-}
-
-// parse parses a whitespace-separated string and initializes ss with its
-// components.
-func (ss *stringSet) parse(s string) {
- scan := bufio.NewScanner(strings.NewReader(s))
- scan.Split(bufio.ScanWords)
- for scan.Scan() {
- ss.add(scan.Text())
- }
-}
-
-func (ss *stringSet) assertChangeable() {
- if ss.frozen {
- log.Panic("attempt to modify a frozen stringSet")
- }
-}
-
-func (ss *stringSet) add(s string) {
- ss.assertChangeable()
- ss.s = append(ss.s, s)
- ss.sorted = ss.frozen
-}
-
-func (ss *stringSet) freeze() {
- ss.compact()
- ss.frozen = true
-}
-
-func (ss *stringSet) compact() {
- if ss.sorted {
- return
- }
- a := ss.s
- sort.Strings(a)
- k := 0
- for i := 1; i < len(a); i++ {
- if a[k] != a[i] {
- a[k+1] = a[i]
- k++
- }
- }
- ss.s = a[:k+1]
- ss.sorted = ss.frozen
-}
-
-type funcSorter struct {
- fn func(a, b string) bool
- sort.StringSlice
-}
-
-func (s funcSorter) Less(i, j int) bool {
- return s.fn(s.StringSlice[i], s.StringSlice[j])
-}
-
-func (ss *stringSet) sortFunc(f func(a, b string) bool) {
- ss.compact()
- sort.Sort(funcSorter{f, sort.StringSlice(ss.s)})
-}
-
-func (ss *stringSet) remove(s string) {
- ss.assertChangeable()
- if i, ok := ss.find(s); ok {
- copy(ss.s[i:], ss.s[i+1:])
- ss.s = ss.s[:len(ss.s)-1]
- }
-}
-
-func (ss *stringSet) replace(ol, nu string) {
- ss.s[ss.index(ol)] = nu
- ss.sorted = ss.frozen
-}
-
-func (ss *stringSet) index(s string) int {
- ss.setType(Indexed)
- i, ok := ss.find(s)
- if !ok {
- if i < len(ss.s) {
- log.Panicf("find: item %q is not in list. Closest match is %q.", s, ss.s[i])
- }
- log.Panicf("find: item %q is not in list", s)
-
- }
- return i
-}
-
-func (ss *stringSet) find(s string) (int, bool) {
- ss.compact()
- i := sort.SearchStrings(ss.s, s)
- return i, i != len(ss.s) && ss.s[i] == s
-}
-
-func (ss *stringSet) slice() []string {
- ss.compact()
- return ss.s
-}
-
-func (ss *stringSet) updateLater(v, key string) {
- if ss.update == nil {
- ss.update = map[string]string{}
- }
- ss.update[v] = key
-}
-
-// join joins the string and ensures that all entries are of the same length.
-func (ss *stringSet) join() string {
- ss.setType(Indexed)
- n := len(ss.s[0])
- for _, s := range ss.s {
- if len(s) != n {
- log.Panicf("join: not all entries are of the same length: %q", s)
- }
- }
- ss.s = append(ss.s, strings.Repeat("\xff", n))
- return strings.Join(ss.s, "")
-}
-
-// ianaEntry holds information for an entry in the IANA Language Subtag Repository.
-// All types use the same entry.
-// See http://tools.ietf.org/html/bcp47#section-5.1 for a description of the various
-// fields.
-type ianaEntry struct {
- typ string
- description []string
- scope string
- added string
- preferred string
- deprecated string
- suppressScript string
- macro string
- prefix []string
-}
-
-type builder struct {
- w *gen.CodeWriter
- hw io.Writer // MultiWriter for w and w.Hash
- data *cldr.CLDR
- supp *cldr.SupplementalData
-
- // indices
- locale stringSet // common locales
- lang stringSet // canonical language ids (2 or 3 letter ISO codes) with data
- langNoIndex stringSet // 3-letter ISO codes with no associated data
- script stringSet // 4-letter ISO codes
- region stringSet // 2-letter ISO or 3-digit UN M49 codes
- variant stringSet // 4-8-alphanumeric variant code.
-
- // Region codes that are groups with their corresponding group IDs.
- groups map[int]index
-
- // langInfo
- registry map[string]*ianaEntry
-}
-
-type index uint
-
-func newBuilder(w *gen.CodeWriter) *builder {
- r := gen.OpenCLDRCoreZip()
- defer r.Close()
- d := &cldr.Decoder{}
- data, err := d.DecodeZip(r)
- failOnError(err)
- b := builder{
- w: w,
- hw: io.MultiWriter(w, w.Hash),
- data: data,
- supp: data.Supplemental(),
- }
- b.parseRegistry()
- return &b
-}
-
-func (b *builder) parseRegistry() {
- r := gen.OpenIANAFile("assignments/language-subtag-registry")
- defer r.Close()
- b.registry = make(map[string]*ianaEntry)
-
- scan := bufio.NewScanner(r)
- scan.Split(bufio.ScanWords)
- var record *ianaEntry
- for more := scan.Scan(); more; {
- key := scan.Text()
- more = scan.Scan()
- value := scan.Text()
- switch key {
- case "Type:":
- record = &ianaEntry{typ: value}
- case "Subtag:", "Tag:":
- if s := strings.SplitN(value, "..", 2); len(s) > 1 {
- for a := s[0]; a <= s[1]; a = inc(a) {
- b.addToRegistry(a, record)
- }
- } else {
- b.addToRegistry(value, record)
- }
- case "Suppress-Script:":
- record.suppressScript = value
- case "Added:":
- record.added = value
- case "Deprecated:":
- record.deprecated = value
- case "Macrolanguage:":
- record.macro = value
- case "Preferred-Value:":
- record.preferred = value
- case "Prefix:":
- record.prefix = append(record.prefix, value)
- case "Scope:":
- record.scope = value
- case "Description:":
- buf := []byte(value)
- for more = scan.Scan(); more; more = scan.Scan() {
- b := scan.Bytes()
- if b[0] == '%' || b[len(b)-1] == ':' {
- break
- }
- buf = append(buf, ' ')
- buf = append(buf, b...)
- }
- record.description = append(record.description, string(buf))
- continue
- default:
- continue
- }
- more = scan.Scan()
- }
- if scan.Err() != nil {
- log.Panic(scan.Err())
- }
-}
-
-func (b *builder) addToRegistry(key string, entry *ianaEntry) {
- if info, ok := b.registry[key]; ok {
- if info.typ != "language" || entry.typ != "extlang" {
- log.Fatalf("parseRegistry: tag %q already exists", key)
- }
- } else {
- b.registry[key] = entry
- }
-}
-
-var commentIndex = make(map[string]string)
-
-func init() {
- for _, s := range comment {
- key := strings.TrimSpace(strings.SplitN(s, " ", 2)[0])
- commentIndex[key] = s
- }
-}
-
-func (b *builder) comment(name string) {
- if s := commentIndex[name]; len(s) > 0 {
- b.w.WriteComment(s)
- } else {
- fmt.Fprintln(b.w)
- }
-}
-
-func (b *builder) pf(f string, x ...interface{}) {
- fmt.Fprintf(b.hw, f, x...)
- fmt.Fprint(b.hw, "\n")
-}
-
-func (b *builder) p(x ...interface{}) {
- fmt.Fprintln(b.hw, x...)
-}
-
-func (b *builder) addSize(s int) {
- b.w.Size += s
- b.pf("// Size: %d bytes", s)
-}
-
-func (b *builder) writeConst(name string, x interface{}) {
- b.comment(name)
- b.w.WriteConst(name, x)
-}
-
-// writeConsts computes f(v) for all v in values and writes the results
-// as constants named _v to a single constant block.
-func (b *builder) writeConsts(f func(string) int, values ...string) {
- b.pf("const (")
- for _, v := range values {
- b.pf("\t_%s = %v", v, f(v))
- }
- b.pf(")")
-}
-
-// writeType writes the type of the given value, which must be a struct.
-func (b *builder) writeType(value interface{}) {
- b.comment(reflect.TypeOf(value).Name())
- b.w.WriteType(value)
-}
-
-func (b *builder) writeSlice(name string, ss interface{}) {
- b.writeSliceAddSize(name, 0, ss)
-}
-
-func (b *builder) writeSliceAddSize(name string, extraSize int, ss interface{}) {
- b.comment(name)
- b.w.Size += extraSize
- v := reflect.ValueOf(ss)
- t := v.Type().Elem()
- b.pf("// Size: %d bytes, %d elements", v.Len()*int(t.Size())+extraSize, v.Len())
-
- fmt.Fprintf(b.w, "var %s = ", name)
- b.w.WriteArray(ss)
- b.p()
-}
-
-type fromTo struct {
- from, to uint16
-}
-
-func (b *builder) writeSortedMap(name string, ss *stringSet, index func(s string) uint16) {
- ss.sortFunc(func(a, b string) bool {
- return index(a) < index(b)
- })
- m := []fromTo{}
- for _, s := range ss.s {
- m = append(m, fromTo{index(s), index(ss.update[s])})
- }
- b.writeSlice(name, m)
-}
-
-const base = 'z' - 'a' + 1
-
-func strToInt(s string) uint {
- v := uint(0)
- for i := 0; i < len(s); i++ {
- v *= base
- v += uint(s[i] - 'a')
- }
- return v
-}
-
-// converts the given integer to the original ASCII string passed to strToInt.
-// len(s) must match the number of characters obtained.
-func intToStr(v uint, s []byte) {
- for i := len(s) - 1; i >= 0; i-- {
- s[i] = byte(v%base) + 'a'
- v /= base
- }
-}
-
-func (b *builder) writeBitVector(name string, ss []string) {
- vec := make([]uint8, int(math.Ceil(math.Pow(base, float64(len(ss[0])))/8)))
- for _, s := range ss {
- v := strToInt(s)
- vec[v/8] |= 1 << (v % 8)
- }
- b.writeSlice(name, vec)
-}
-
-// TODO: convert this type into a list or two-stage trie.
-func (b *builder) writeMapFunc(name string, m map[string]string, f func(string) uint16) {
- b.comment(name)
- v := reflect.ValueOf(m)
- sz := v.Len() * (2 + int(v.Type().Key().Size()))
- for _, k := range m {
- sz += len(k)
- }
- b.addSize(sz)
- keys := []string{}
- b.pf(`var %s = map[string]uint16{`, name)
- for k := range m {
- keys = append(keys, k)
- }
- sort.Strings(keys)
- for _, k := range keys {
- b.pf("\t%q: %v,", k, f(m[k]))
- }
- b.p("}")
-}
-
-func (b *builder) writeMap(name string, m interface{}) {
- b.comment(name)
- v := reflect.ValueOf(m)
- sz := v.Len() * (2 + int(v.Type().Key().Size()) + int(v.Type().Elem().Size()))
- b.addSize(sz)
- f := strings.FieldsFunc(fmt.Sprintf("%#v", m), func(r rune) bool {
- return strings.IndexRune("{}, ", r) != -1
- })
- sort.Strings(f[1:])
- b.pf(`var %s = %s{`, name, f[0])
- for _, kv := range f[1:] {
- b.pf("\t%s,", kv)
- }
- b.p("}")
-}
-
-func (b *builder) langIndex(s string) uint16 {
- if s == "und" {
- return 0
- }
- if i, ok := b.lang.find(s); ok {
- return uint16(i)
- }
- return uint16(strToInt(s)) + uint16(len(b.lang.s))
-}
-
-// inc advances the string to its lexicographical successor.
-func inc(s string) string {
- const maxTagLength = 4
- var buf [maxTagLength]byte
- intToStr(strToInt(strings.ToLower(s))+1, buf[:len(s)])
- for i := 0; i < len(s); i++ {
- if s[i] <= 'Z' {
- buf[i] -= 'a' - 'A'
- }
- }
- return string(buf[:len(s)])
-}
-
-func (b *builder) parseIndices() {
- meta := b.supp.Metadata
-
- for k, v := range b.registry {
- var ss *stringSet
- switch v.typ {
- case "language":
- if len(k) == 2 || v.suppressScript != "" || v.scope == "special" {
- b.lang.add(k)
- continue
- } else {
- ss = &b.langNoIndex
- }
- case "region":
- ss = &b.region
- case "script":
- ss = &b.script
- case "variant":
- ss = &b.variant
- default:
- continue
- }
- ss.add(k)
- }
- // Include any language for which there is data.
- for _, lang := range b.data.Locales() {
- if x := b.data.RawLDML(lang); false ||
- x.LocaleDisplayNames != nil ||
- x.Characters != nil ||
- x.Delimiters != nil ||
- x.Measurement != nil ||
- x.Dates != nil ||
- x.Numbers != nil ||
- x.Units != nil ||
- x.ListPatterns != nil ||
- x.Collations != nil ||
- x.Segmentations != nil ||
- x.Rbnf != nil ||
- x.Annotations != nil ||
- x.Metadata != nil {
-
- from := strings.Split(lang, "_")
- if lang := from[0]; lang != "root" {
- b.lang.add(lang)
- }
- }
- }
- // Include locales for plural rules, which uses a different structure.
- for _, plurals := range b.data.Supplemental().Plurals {
- for _, rules := range plurals.PluralRules {
- for _, lang := range strings.Split(rules.Locales, " ") {
- if lang = strings.Split(lang, "_")[0]; lang != "root" {
- b.lang.add(lang)
- }
- }
- }
- }
- // Include languages in likely subtags.
- for _, m := range b.supp.LikelySubtags.LikelySubtag {
- from := strings.Split(m.From, "_")
- b.lang.add(from[0])
- }
- // Include ISO-639 alpha-3 bibliographic entries.
- for _, a := range meta.Alias.LanguageAlias {
- if a.Reason == "bibliographic" {
- b.langNoIndex.add(a.Type)
- }
- }
- // Include regions in territoryAlias (not all are in the IANA registry!)
- for _, reg := range b.supp.Metadata.Alias.TerritoryAlias {
- if len(reg.Type) == 2 {
- b.region.add(reg.Type)
- }
- }
-
- for _, s := range b.lang.s {
- if len(s) == 3 {
- b.langNoIndex.remove(s)
- }
- }
- b.writeConst("numLanguages", len(b.lang.slice())+len(b.langNoIndex.slice()))
- b.writeConst("numScripts", len(b.script.slice()))
- b.writeConst("numRegions", len(b.region.slice()))
-
- // Add dummy codes at the start of each list to represent "unspecified".
- b.lang.add("---")
- b.script.add("----")
- b.region.add("---")
-
- // common locales
- b.locale.parse(meta.DefaultContent.Locales)
-}
-
-func (b *builder) computeRegionGroups() {
- b.groups = make(map[int]index)
-
- // Create group indices.
- for i := 1; b.region.s[i][0] < 'A'; i++ { // Base M49 indices on regionID.
- b.groups[i] = index(len(b.groups))
- }
- for _, g := range b.supp.TerritoryContainment.Group {
- group := b.region.index(g.Type)
- if _, ok := b.groups[group]; !ok {
- b.groups[group] = index(len(b.groups))
- }
- }
- if len(b.groups) > 32 {
- log.Fatalf("only 32 groups supported, found %d", len(b.groups))
- }
- b.writeConst("nRegionGroups", len(b.groups))
-}
-
-var langConsts = []string{
- "af", "am", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es",
- "et", "fa", "fi", "fil", "fr", "gu", "he", "hi", "hr", "hu", "hy", "id", "is",
- "it", "ja", "ka", "kk", "km", "kn", "ko", "ky", "lo", "lt", "lv", "mk", "ml",
- "mn", "mo", "mr", "ms", "mul", "my", "nb", "ne", "nl", "no", "pa", "pl", "pt",
- "ro", "ru", "sh", "si", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th",
- "tl", "tn", "tr", "uk", "ur", "uz", "vi", "zh", "zu",
-
- // constants for grandfathered tags (if not already defined)
- "jbo", "ami", "bnn", "hak", "tlh", "lb", "nv", "pwn", "tao", "tay", "tsu",
- "nn", "sfb", "vgt", "sgg", "cmn", "nan", "hsn",
-}
-
-// writeLanguage generates all tables needed for language canonicalization.
-func (b *builder) writeLanguage() {
- meta := b.supp.Metadata
-
- b.writeConst("nonCanonicalUnd", b.lang.index("und"))
- b.writeConsts(func(s string) int { return int(b.langIndex(s)) }, langConsts...)
- b.writeConst("langPrivateStart", b.langIndex("qaa"))
- b.writeConst("langPrivateEnd", b.langIndex("qtz"))
-
- // Get language codes that need to be mapped (overlong 3-letter codes,
- // deprecated 2-letter codes, legacy and grandfathered tags.)
- langAliasMap := stringSet{}
- aliasTypeMap := map[string]langAliasType{}
-
- // altLangISO3 get the alternative ISO3 names that need to be mapped.
- altLangISO3 := stringSet{}
- // Add dummy start to avoid the use of index 0.
- altLangISO3.add("---")
- altLangISO3.updateLater("---", "aa")
-
- lang := b.lang.clone()
- for _, a := range meta.Alias.LanguageAlias {
- if a.Replacement == "" {
- a.Replacement = "und"
- }
- // TODO: support mapping to tags
- repl := strings.SplitN(a.Replacement, "_", 2)[0]
- if a.Reason == "overlong" {
- if len(a.Replacement) == 2 && len(a.Type) == 3 {
- lang.updateLater(a.Replacement, a.Type)
- }
- } else if len(a.Type) <= 3 {
- switch a.Reason {
- case "macrolanguage":
- aliasTypeMap[a.Type] = langMacro
- case "deprecated":
- // handled elsewhere
- continue
- case "bibliographic", "legacy":
- if a.Type == "no" {
- continue
- }
- aliasTypeMap[a.Type] = langLegacy
- default:
- log.Fatalf("new %s alias: %s", a.Reason, a.Type)
- }
- langAliasMap.add(a.Type)
- langAliasMap.updateLater(a.Type, repl)
- }
- }
- // Manually add the mapping of "nb" (Norwegian) to its macro language.
- // This can be removed if CLDR adopts this change.
- langAliasMap.add("nb")
- langAliasMap.updateLater("nb", "no")
- aliasTypeMap["nb"] = langMacro
-
- for k, v := range b.registry {
- // Also add deprecated values for 3-letter ISO codes, which CLDR omits.
- if v.typ == "language" && v.deprecated != "" && v.preferred != "" {
- langAliasMap.add(k)
- langAliasMap.updateLater(k, v.preferred)
- aliasTypeMap[k] = langDeprecated
- }
- }
- // Fix CLDR mappings.
- lang.updateLater("tl", "tgl")
- lang.updateLater("sh", "hbs")
- lang.updateLater("mo", "mol")
- lang.updateLater("no", "nor")
- lang.updateLater("tw", "twi")
- lang.updateLater("nb", "nob")
- lang.updateLater("ak", "aka")
-
- // Ensure that each 2-letter code is matched with a 3-letter code.
- for _, v := range lang.s[1:] {
- s, ok := lang.update[v]
- if !ok {
- if s, ok = lang.update[langAliasMap.update[v]]; !ok {
- continue
- }
- lang.update[v] = s
- }
- if v[0] != s[0] {
- altLangISO3.add(s)
- altLangISO3.updateLater(s, v)
- }
- }
-
- // Complete canonialized language tags.
- lang.freeze()
- for i, v := range lang.s {
- // We can avoid these manual entries by using the IANI registry directly.
- // Seems easier to update the list manually, as changes are rare.
- // The panic in this loop will trigger if we miss an entry.
- add := ""
- if s, ok := lang.update[v]; ok {
- if s[0] == v[0] {
- add = s[1:]
- } else {
- add = string([]byte{0, byte(altLangISO3.index(s))})
- }
- } else if len(v) == 3 {
- add = "\x00"
- } else {
- log.Panicf("no data for long form of %q", v)
- }
- lang.s[i] += add
- }
- b.writeConst("lang", tag.Index(lang.join()))
-
- b.writeConst("langNoIndexOffset", len(b.lang.s))
-
- // space of all valid 3-letter language identifiers.
- b.writeBitVector("langNoIndex", b.langNoIndex.slice())
-
- altLangIndex := []uint16{}
- for i, s := range altLangISO3.slice() {
- altLangISO3.s[i] += string([]byte{byte(len(altLangIndex))})
- if i > 0 {
- idx := b.lang.index(altLangISO3.update[s])
- altLangIndex = append(altLangIndex, uint16(idx))
- }
- }
- b.writeConst("altLangISO3", tag.Index(altLangISO3.join()))
- b.writeSlice("altLangIndex", altLangIndex)
-
- b.writeSortedMap("langAliasMap", &langAliasMap, b.langIndex)
- types := make([]langAliasType, len(langAliasMap.s))
- for i, s := range langAliasMap.s {
- types[i] = aliasTypeMap[s]
- }
- b.writeSlice("langAliasTypes", types)
-}
-
-var scriptConsts = []string{
- "Latn", "Hani", "Hans", "Hant", "Qaaa", "Qaai", "Qabx", "Zinh", "Zyyy",
- "Zzzz",
-}
-
-func (b *builder) writeScript() {
- b.writeConsts(b.script.index, scriptConsts...)
- b.writeConst("script", tag.Index(b.script.join()))
-
- supp := make([]uint8, len(b.lang.slice()))
- for i, v := range b.lang.slice()[1:] {
- if sc := b.registry[v].suppressScript; sc != "" {
- supp[i+1] = uint8(b.script.index(sc))
- }
- }
- b.writeSlice("suppressScript", supp)
-
- // There is only one deprecated script in CLDR. This value is hard-coded.
- // We check here if the code must be updated.
- for _, a := range b.supp.Metadata.Alias.ScriptAlias {
- if a.Type != "Qaai" {
- log.Panicf("unexpected deprecated stript %q", a.Type)
- }
- }
-}
-
-func parseM49(s string) int16 {
- if len(s) == 0 {
- return 0
- }
- v, err := strconv.ParseUint(s, 10, 10)
- failOnError(err)
- return int16(v)
-}
-
-var regionConsts = []string{
- "001", "419", "BR", "CA", "ES", "GB", "MD", "PT", "UK", "US",
- "ZZ", "XA", "XC", "XK", // Unofficial tag for Kosovo.
-}
-
-func (b *builder) writeRegion() {
- b.writeConsts(b.region.index, regionConsts...)
-
- isoOffset := b.region.index("AA")
- m49map := make([]int16, len(b.region.slice()))
- fromM49map := make(map[int16]int)
- altRegionISO3 := ""
- altRegionIDs := []uint16{}
-
- b.writeConst("isoRegionOffset", isoOffset)
-
- // 2-letter region lookup and mapping to numeric codes.
- regionISO := b.region.clone()
- regionISO.s = regionISO.s[isoOffset:]
- regionISO.sorted = false
-
- regionTypes := make([]byte, len(b.region.s))
-
- // Is the region valid BCP 47?
- for s, e := range b.registry {
- if len(s) == 2 && s == strings.ToUpper(s) {
- i := b.region.index(s)
- for _, d := range e.description {
- if strings.Contains(d, "Private use") {
- regionTypes[i] = iso3166UserAssgined
- }
- }
- regionTypes[i] |= bcp47Region
- }
- }
-
- // Is the region a valid ccTLD?
- r := gen.OpenIANAFile("domains/root/db")
- defer r.Close()
-
- buf, err := ioutil.ReadAll(r)
- failOnError(err)
- re := regexp.MustCompile(`"/domains/root/db/([a-z]{2}).html"`)
- for _, m := range re.FindAllSubmatch(buf, -1) {
- i := b.region.index(strings.ToUpper(string(m[1])))
- regionTypes[i] |= ccTLD
- }
-
- b.writeSlice("regionTypes", regionTypes)
-
- iso3Set := make(map[string]int)
- update := func(iso2, iso3 string) {
- i := regionISO.index(iso2)
- if j, ok := iso3Set[iso3]; !ok && iso3[0] == iso2[0] {
- regionISO.s[i] += iso3[1:]
- iso3Set[iso3] = -1
- } else {
- if ok && j >= 0 {
- regionISO.s[i] += string([]byte{0, byte(j)})
- } else {
- iso3Set[iso3] = len(altRegionISO3)
- regionISO.s[i] += string([]byte{0, byte(len(altRegionISO3))})
- altRegionISO3 += iso3
- altRegionIDs = append(altRegionIDs, uint16(isoOffset+i))
- }
- }
- }
- for _, tc := range b.supp.CodeMappings.TerritoryCodes {
- i := regionISO.index(tc.Type) + isoOffset
- if d := m49map[i]; d != 0 {
- log.Panicf("%s found as a duplicate UN.M49 code of %03d", tc.Numeric, d)
- }
- m49 := parseM49(tc.Numeric)
- m49map[i] = m49
- if r := fromM49map[m49]; r == 0 {
- fromM49map[m49] = i
- } else if r != i {
- dep := b.registry[regionISO.s[r-isoOffset]].deprecated
- if t := b.registry[tc.Type]; t != nil && dep != "" && (t.deprecated == "" || t.deprecated > dep) {
- fromM49map[m49] = i
- }
- }
- }
- for _, ta := range b.supp.Metadata.Alias.TerritoryAlias {
- if len(ta.Type) == 3 && ta.Type[0] <= '9' && len(ta.Replacement) == 2 {
- from := parseM49(ta.Type)
- if r := fromM49map[from]; r == 0 {
- fromM49map[from] = regionISO.index(ta.Replacement) + isoOffset
- }
- }
- }
- for _, tc := range b.supp.CodeMappings.TerritoryCodes {
- if len(tc.Alpha3) == 3 {
- update(tc.Type, tc.Alpha3)
- }
- }
- // This entries are not included in territoryCodes. Mostly 3-letter variants
- // of deleted codes and an entry for QU.
- for _, m := range []struct{ iso2, iso3 string }{
- {"CT", "CTE"},
- {"DY", "DHY"},
- {"HV", "HVO"},
- {"JT", "JTN"},
- {"MI", "MID"},
- {"NH", "NHB"},
- {"NQ", "ATN"},
- {"PC", "PCI"},
- {"PU", "PUS"},
- {"PZ", "PCZ"},
- {"RH", "RHO"},
- {"VD", "VDR"},
- {"WK", "WAK"},
- // These three-letter codes are used for others as well.
- {"FQ", "ATF"},
- } {
- update(m.iso2, m.iso3)
- }
- for i, s := range regionISO.s {
- if len(s) != 4 {
- regionISO.s[i] = s + " "
- }
- }
- b.writeConst("regionISO", tag.Index(regionISO.join()))
- b.writeConst("altRegionISO3", altRegionISO3)
- b.writeSlice("altRegionIDs", altRegionIDs)
-
- // Create list of deprecated regions.
- // TODO: consider inserting SF -> FI. Not included by CLDR, but is the only
- // Transitionally-reserved mapping not included.
- regionOldMap := stringSet{}
- // Include regions in territoryAlias (not all are in the IANA registry!)
- for _, reg := range b.supp.Metadata.Alias.TerritoryAlias {
- if len(reg.Type) == 2 && reg.Reason == "deprecated" && len(reg.Replacement) == 2 {
- regionOldMap.add(reg.Type)
- regionOldMap.updateLater(reg.Type, reg.Replacement)
- i, _ := regionISO.find(reg.Type)
- j, _ := regionISO.find(reg.Replacement)
- if k := m49map[i+isoOffset]; k == 0 {
- m49map[i+isoOffset] = m49map[j+isoOffset]
- }
- }
- }
- b.writeSortedMap("regionOldMap", &regionOldMap, func(s string) uint16 {
- return uint16(b.region.index(s))
- })
- // 3-digit region lookup, groupings.
- for i := 1; i < isoOffset; i++ {
- m := parseM49(b.region.s[i])
- m49map[i] = m
- fromM49map[m] = i
- }
- b.writeSlice("m49", m49map)
-
- const (
- searchBits = 7
- regionBits = 9
- )
- if len(m49map) >= 1<<regionBits {
- log.Fatalf("Maximum number of regions exceeded: %d > %d", len(m49map), 1<<regionBits)
- }
- m49Index := [9]int16{}
- fromM49 := []uint16{}
- m49 := []int{}
- for k, _ := range fromM49map {
- m49 = append(m49, int(k))
- }
- sort.Ints(m49)
- for _, k := range m49[1:] {
- val := (k & (1<<searchBits - 1)) << regionBits
- fromM49 = append(fromM49, uint16(val|fromM49map[int16(k)]))
- m49Index[1:][k>>searchBits] = int16(len(fromM49))
- }
- b.writeSlice("m49Index", m49Index)
- b.writeSlice("fromM49", fromM49)
-}
-
-const (
- // TODO: put these lists in regionTypes as user data? Could be used for
- // various optimizations and refinements and could be exposed in the API.
- iso3166Except = "AC CP DG EA EU FX IC SU TA UK"
- iso3166Trans = "AN BU CS NT TP YU ZR" // SF is not in our set of Regions.
- // DY and RH are actually not deleted, but indeterminately reserved.
- iso3166DelCLDR = "CT DD DY FQ HV JT MI NH NQ PC PU PZ RH VD WK YD"
-)
-
-const (
- iso3166UserAssgined = 1 << iota
- ccTLD
- bcp47Region
-)
-
-func find(list []string, s string) int {
- for i, t := range list {
- if t == s {
- return i
- }
- }
- return -1
-}
-
-// writeVariants generates per-variant information and creates a map from variant
-// name to index value. We assign index values such that sorting multiple
-// variants by index value will result in the correct order.
-// There are two types of variants: specialized and general. Specialized variants
-// are only applicable to certain language or language-script pairs. Generalized
-// variants apply to any language. Generalized variants always sort after
-// specialized variants. We will therefore always assign a higher index value
-// to a generalized variant than any other variant. Generalized variants are
-// sorted alphabetically among themselves.
-// Specialized variants may also sort after other specialized variants. Such
-// variants will be ordered after any of the variants they may follow.
-// We assume that if a variant x is followed by a variant y, then for any prefix
-// p of x, p-x is a prefix of y. This allows us to order tags based on the
-// maximum of the length of any of its prefixes.
-// TODO: it is possible to define a set of Prefix values on variants such that
-// a total order cannot be defined to the point that this algorithm breaks.
-// In other words, we cannot guarantee the same order of variants for the
-// future using the same algorithm or for non-compliant combinations of
-// variants. For this reason, consider using simple alphabetic sorting
-// of variants and ignore Prefix restrictions altogether.
-func (b *builder) writeVariant() {
- generalized := stringSet{}
- specialized := stringSet{}
- specializedExtend := stringSet{}
- // Collate the variants by type and check assumptions.
- for _, v := range b.variant.slice() {
- e := b.registry[v]
- if len(e.prefix) == 0 {
- generalized.add(v)
- continue
- }
- c := strings.Split(e.prefix[0], "-")
- hasScriptOrRegion := false
- if len(c) > 1 {
- _, hasScriptOrRegion = b.script.find(c[1])
- if !hasScriptOrRegion {
- _, hasScriptOrRegion = b.region.find(c[1])
-
- }
- }
- if len(c) == 1 || len(c) == 2 && hasScriptOrRegion {
- // Variant is preceded by a language.
- specialized.add(v)
- continue
- }
- // Variant is preceded by another variant.
- specializedExtend.add(v)
- prefix := c[0] + "-"
- if hasScriptOrRegion {
- prefix += c[1]
- }
- for _, p := range e.prefix {
- // Verify that the prefix minus the last element is a prefix of the
- // predecessor element.
- i := strings.LastIndex(p, "-")
- pred := b.registry[p[i+1:]]
- if find(pred.prefix, p[:i]) < 0 {
- log.Fatalf("prefix %q for variant %q not consistent with predecessor spec", p, v)
- }
- // The sorting used below does not work in the general case. It works
- // if we assume that variants that may be followed by others only have
- // prefixes of the same length. Verify this.
- count := strings.Count(p[:i], "-")
- for _, q := range pred.prefix {
- if c := strings.Count(q, "-"); c != count {
- log.Fatalf("variant %q preceding %q has a prefix %q of size %d; want %d", p[i+1:], v, q, c, count)
- }
- }
- if !strings.HasPrefix(p, prefix) {
- log.Fatalf("prefix %q of variant %q should start with %q", p, v, prefix)
- }
- }
- }
-
- // Sort extended variants.
- a := specializedExtend.s
- less := func(v, w string) bool {
- // Sort by the maximum number of elements.
- maxCount := func(s string) (max int) {
- for _, p := range b.registry[s].prefix {
- if c := strings.Count(p, "-"); c > max {
- max = c
- }
- }
- return
- }
- if cv, cw := maxCount(v), maxCount(w); cv != cw {
- return cv < cw
- }
- // Sort by name as tie breaker.
- return v < w
- }
- sort.Sort(funcSorter{less, sort.StringSlice(a)})
- specializedExtend.frozen = true
-
- // Create index from variant name to index.
- variantIndex := make(map[string]uint8)
- add := func(s []string) {
- for _, v := range s {
- variantIndex[v] = uint8(len(variantIndex))
- }
- }
- add(specialized.slice())
- add(specializedExtend.s)
- numSpecialized := len(variantIndex)
- add(generalized.slice())
- if n := len(variantIndex); n > 255 {
- log.Fatalf("maximum number of variants exceeded: was %d; want <= 255", n)
- }
- b.writeMap("variantIndex", variantIndex)
- b.writeConst("variantNumSpecialized", numSpecialized)
-}
-
-func (b *builder) writeLanguageInfo() {
-}
-
-// writeLikelyData writes tables that are used both for finding parent relations and for
-// language matching. Each entry contains additional bits to indicate the status of the
-// data to know when it cannot be used for parent relations.
-func (b *builder) writeLikelyData() {
- const (
- isList = 1 << iota
- scriptInFrom
- regionInFrom
- )
- type ( // generated types
- likelyScriptRegion struct {
- region uint16
- script uint8
- flags uint8
- }
- likelyLangScript struct {
- lang uint16
- script uint8
- flags uint8
- }
- likelyLangRegion struct {
- lang uint16
- region uint16
- }
- // likelyTag is used for getting likely tags for group regions, where
- // the likely region might be a region contained in the group.
- likelyTag struct {
- lang uint16
- region uint16
- script uint8
- }
- )
- var ( // generated variables
- likelyRegionGroup = make([]likelyTag, len(b.groups))
- likelyLang = make([]likelyScriptRegion, len(b.lang.s))
- likelyRegion = make([]likelyLangScript, len(b.region.s))
- likelyScript = make([]likelyLangRegion, len(b.script.s))
- likelyLangList = []likelyScriptRegion{}
- likelyRegionList = []likelyLangScript{}
- )
- type fromTo struct {
- from, to []string
- }
- langToOther := map[int][]fromTo{}
- regionToOther := map[int][]fromTo{}
- for _, m := range b.supp.LikelySubtags.LikelySubtag {
- from := strings.Split(m.From, "_")
- to := strings.Split(m.To, "_")
- if len(to) != 3 {
- log.Fatalf("invalid number of subtags in %q: found %d, want 3", m.To, len(to))
- }
- if len(from) > 3 {
- log.Fatalf("invalid number of subtags: found %d, want 1-3", len(from))
- }
- if from[0] != to[0] && from[0] != "und" {
- log.Fatalf("unexpected language change in expansion: %s -> %s", from, to)
- }
- if len(from) == 3 {
- if from[2] != to[2] {
- log.Fatalf("unexpected region change in expansion: %s -> %s", from, to)
- }
- if from[0] != "und" {
- log.Fatalf("unexpected fully specified from tag: %s -> %s", from, to)
- }
- }
- if len(from) == 1 || from[0] != "und" {
- id := 0
- if from[0] != "und" {
- id = b.lang.index(from[0])
- }
- langToOther[id] = append(langToOther[id], fromTo{from, to})
- } else if len(from) == 2 && len(from[1]) == 4 {
- sid := b.script.index(from[1])
- likelyScript[sid].lang = uint16(b.langIndex(to[0]))
- likelyScript[sid].region = uint16(b.region.index(to[2]))
- } else {
- r := b.region.index(from[len(from)-1])
- if id, ok := b.groups[r]; ok {
- if from[0] != "und" {
- log.Fatalf("region changed unexpectedly: %s -> %s", from, to)
- }
- likelyRegionGroup[id].lang = uint16(b.langIndex(to[0]))
- likelyRegionGroup[id].script = uint8(b.script.index(to[1]))
- likelyRegionGroup[id].region = uint16(b.region.index(to[2]))
- } else {
- regionToOther[r] = append(regionToOther[r], fromTo{from, to})
- }
- }
- }
- b.writeType(likelyLangRegion{})
- b.writeSlice("likelyScript", likelyScript)
-
- for id := range b.lang.s {
- list := langToOther[id]
- if len(list) == 1 {
- likelyLang[id].region = uint16(b.region.index(list[0].to[2]))
- likelyLang[id].script = uint8(b.script.index(list[0].to[1]))
- } else if len(list) > 1 {
- likelyLang[id].flags = isList
- likelyLang[id].region = uint16(len(likelyLangList))
- likelyLang[id].script = uint8(len(list))
- for _, x := range list {
- flags := uint8(0)
- if len(x.from) > 1 {
- if x.from[1] == x.to[2] {
- flags = regionInFrom
- } else {
- flags = scriptInFrom
- }
- }
- likelyLangList = append(likelyLangList, likelyScriptRegion{
- region: uint16(b.region.index(x.to[2])),
- script: uint8(b.script.index(x.to[1])),
- flags: flags,
- })
- }
- }
- }
- // TODO: merge suppressScript data with this table.
- b.writeType(likelyScriptRegion{})
- b.writeSlice("likelyLang", likelyLang)
- b.writeSlice("likelyLangList", likelyLangList)
-
- for id := range b.region.s {
- list := regionToOther[id]
- if len(list) == 1 {
- likelyRegion[id].lang = uint16(b.langIndex(list[0].to[0]))
- likelyRegion[id].script = uint8(b.script.index(list[0].to[1]))
- if len(list[0].from) > 2 {
- likelyRegion[id].flags = scriptInFrom
- }
- } else if len(list) > 1 {
- likelyRegion[id].flags = isList
- likelyRegion[id].lang = uint16(len(likelyRegionList))
- likelyRegion[id].script = uint8(len(list))
- for i, x := range list {
- if len(x.from) == 2 && i != 0 || i > 0 && len(x.from) != 3 {
- log.Fatalf("unspecified script must be first in list: %v at %d", x.from, i)
- }
- x := likelyLangScript{
- lang: uint16(b.langIndex(x.to[0])),
- script: uint8(b.script.index(x.to[1])),
- }
- if len(list[0].from) > 2 {
- x.flags = scriptInFrom
- }
- likelyRegionList = append(likelyRegionList, x)
- }
- }
- }
- b.writeType(likelyLangScript{})
- b.writeSlice("likelyRegion", likelyRegion)
- b.writeSlice("likelyRegionList", likelyRegionList)
-
- b.writeType(likelyTag{})
- b.writeSlice("likelyRegionGroup", likelyRegionGroup)
-}
-
-type mutualIntelligibility struct {
- want, have uint16
- conf uint8
- oneway bool
-}
-
-type scriptIntelligibility struct {
- lang uint16 // langID or 0 if *
- want, have uint8
- conf uint8
-}
-
-type sortByConf []mutualIntelligibility
-
-func (l sortByConf) Less(a, b int) bool {
- return l[a].conf > l[b].conf
-}
-
-func (l sortByConf) Swap(a, b int) {
- l[a], l[b] = l[b], l[a]
-}
-
-func (l sortByConf) Len() int {
- return len(l)
-}
-
-// toConf converts a percentage value [0, 100] to a confidence class.
-func toConf(pct uint8) uint8 {
- switch {
- case pct == 100:
- return 3 // Exact
- case pct >= 90:
- return 2 // High
- case pct > 50:
- return 1 // Low
- default:
- return 0 // No
- }
-}
-
-// writeMatchData writes tables with languages and scripts for which there is
-// mutual intelligibility. The data is based on CLDR's languageMatching data.
-// Note that we use a different algorithm than the one defined by CLDR and that
-// we slightly modify the data. For example, we convert scores to confidence levels.
-// We also drop all region-related data as we use a different algorithm to
-// determine region equivalence.
-func (b *builder) writeMatchData() {
- b.writeType(mutualIntelligibility{})
- b.writeType(scriptIntelligibility{})
- lm := b.supp.LanguageMatching.LanguageMatches
- cldr.MakeSlice(&lm).SelectAnyOf("type", "written")
-
- matchLang := []mutualIntelligibility{}
- matchScript := []scriptIntelligibility{}
- // Convert the languageMatch entries in lists keyed by desired language.
- for _, m := range lm[0].LanguageMatch {
- // Different versions of CLDR use different separators.
- desired := strings.Replace(m.Desired, "-", "_", -1)
- supported := strings.Replace(m.Supported, "-", "_", -1)
- d := strings.Split(desired, "_")
- s := strings.Split(supported, "_")
- if len(d) != len(s) || len(d) > 2 {
- // Skip all entries with regions and work around CLDR bug.
- continue
- }
- pct, _ := strconv.ParseInt(m.Percent, 10, 8)
- if len(d) == 2 && d[0] == s[0] && len(d[1]) == 4 {
- // language-script pair.
- lang := uint16(0)
- if d[0] != "*" {
- lang = uint16(b.langIndex(d[0]))
- }
- matchScript = append(matchScript, scriptIntelligibility{
- lang: lang,
- want: uint8(b.script.index(d[1])),
- have: uint8(b.script.index(s[1])),
- conf: toConf(uint8(pct)),
- })
- if m.Oneway != "true" {
- matchScript = append(matchScript, scriptIntelligibility{
- lang: lang,
- want: uint8(b.script.index(s[1])),
- have: uint8(b.script.index(d[1])),
- conf: toConf(uint8(pct)),
- })
- }
- } else if len(d) == 1 && d[0] != "*" {
- if pct == 100 {
- // nb == no is already handled by macro mapping. Check there
- // really is only this case.
- if d[0] != "no" || s[0] != "nb" {
- log.Fatalf("unhandled equivalence %s == %s", s[0], d[0])
- }
- continue
- }
- matchLang = append(matchLang, mutualIntelligibility{
- want: uint16(b.langIndex(d[0])),
- have: uint16(b.langIndex(s[0])),
- conf: uint8(pct),
- oneway: m.Oneway == "true",
- })
- } else {
- // TODO: Handle other mappings.
- a := []string{"*;*", "*_*;*_*", "es_MX;es_419"}
- s := strings.Join([]string{desired, supported}, ";")
- if i := sort.SearchStrings(a, s); i == len(a) || a[i] != s {
- log.Printf("%q not handled", s)
- }
- }
- }
- sort.Stable(sortByConf(matchLang))
- // collapse percentage into confidence classes
- for i, m := range matchLang {
- matchLang[i].conf = toConf(m.conf)
- }
- b.writeSlice("matchLang", matchLang)
- b.writeSlice("matchScript", matchScript)
-}
-
-func (b *builder) writeRegionInclusionData() {
- var (
- // mm holds for each group the set of groups with a distance of 1.
- mm = make(map[int][]index)
-
- // containment holds for each group the transitive closure of
- // containment of other groups.
- containment = make(map[index][]index)
- )
- for _, g := range b.supp.TerritoryContainment.Group {
- group := b.region.index(g.Type)
- groupIdx := b.groups[group]
- for _, mem := range strings.Split(g.Contains, " ") {
- r := b.region.index(mem)
- mm[r] = append(mm[r], groupIdx)
- if g, ok := b.groups[r]; ok {
- mm[group] = append(mm[group], g)
- containment[groupIdx] = append(containment[groupIdx], g)
- }
- }
- }
-
- regionContainment := make([]uint32, len(b.groups))
- for _, g := range b.groups {
- l := containment[g]
-
- // Compute the transitive closure of containment.
- for i := 0; i < len(l); i++ {
- l = append(l, containment[l[i]]...)
- }
-
- // Compute the bitmask.
- regionContainment[g] = 1 << g
- for _, v := range l {
- regionContainment[g] |= 1 << v
- }
- // log.Printf("%d: %X", g, regionContainment[g])
- }
- b.writeSlice("regionContainment", regionContainment)
-
- regionInclusion := make([]uint8, len(b.region.s))
- bvs := make(map[uint32]index)
- // Make the first bitvector positions correspond with the groups.
- for r, i := range b.groups {
- bv := uint32(1 << i)
- for _, g := range mm[r] {
- bv |= 1 << g
- }
- bvs[bv] = i
- regionInclusion[r] = uint8(bvs[bv])
- }
- for r := 1; r < len(b.region.s); r++ {
- if _, ok := b.groups[r]; !ok {
- bv := uint32(0)
- for _, g := range mm[r] {
- bv |= 1 << g
- }
- if bv == 0 {
- // Pick the world for unspecified regions.
- bv = 1 << b.groups[b.region.index("001")]
- }
- if _, ok := bvs[bv]; !ok {
- bvs[bv] = index(len(bvs))
- }
- regionInclusion[r] = uint8(bvs[bv])
- }
- }
- b.writeSlice("regionInclusion", regionInclusion)
- regionInclusionBits := make([]uint32, len(bvs))
- for k, v := range bvs {
- regionInclusionBits[v] = uint32(k)
- }
- // Add bit vectors for increasingly large distances until a fixed point is reached.
- regionInclusionNext := []uint8{}
- for i := 0; i < len(regionInclusionBits); i++ {
- bits := regionInclusionBits[i]
- next := bits
- for i := uint(0); i < uint(len(b.groups)); i++ {
- if bits&(1<<i) != 0 {
- next |= regionInclusionBits[i]
- }
- }
- if _, ok := bvs[next]; !ok {
- bvs[next] = index(len(bvs))
- regionInclusionBits = append(regionInclusionBits, next)
- }
- regionInclusionNext = append(regionInclusionNext, uint8(bvs[next]))
- }
- b.writeSlice("regionInclusionBits", regionInclusionBits)
- b.writeSlice("regionInclusionNext", regionInclusionNext)
-}
-
-type parentRel struct {
- lang uint16
- script uint8
- maxScript uint8
- toRegion uint16
- fromRegion []uint16
-}
-
-func (b *builder) writeParents() {
- b.writeType(parentRel{})
-
- parents := []parentRel{}
-
- // Construct parent overrides.
- n := 0
- for _, p := range b.data.Supplemental().ParentLocales.ParentLocale {
- // Skipping non-standard scripts to root is implemented using addTags.
- if p.Parent == "root" {
- continue
- }
-
- sub := strings.Split(p.Parent, "_")
- parent := parentRel{lang: b.langIndex(sub[0])}
- if len(sub) == 2 {
- // TODO: check that all undefined scripts are indeed Latn in these
- // cases.
- parent.maxScript = uint8(b.script.index("Latn"))
- parent.toRegion = uint16(b.region.index(sub[1]))
- } else {
- parent.script = uint8(b.script.index(sub[1]))
- parent.maxScript = parent.script
- parent.toRegion = uint16(b.region.index(sub[2]))
- }
- for _, c := range strings.Split(p.Locales, " ") {
- region := b.region.index(c[strings.LastIndex(c, "_")+1:])
- parent.fromRegion = append(parent.fromRegion, uint16(region))
- }
- parents = append(parents, parent)
- n += len(parent.fromRegion)
- }
- b.writeSliceAddSize("parents", n*2, parents)
-}
-
-func main() {
- gen.Init()
-
- gen.Repackage("gen_common.go", "common.go", "language")
-
- w := gen.NewCodeWriter()
- defer w.WriteGoFile("tables.go", "language")
-
- fmt.Fprintln(w, `import "golang.org/x/text/internal/tag"`)
-
- b := newBuilder(w)
- gen.WriteCLDRVersion(w)
-
- b.parseIndices()
- b.writeType(fromTo{})
- b.writeLanguage()
- b.writeScript()
- b.writeRegion()
- b.writeVariant()
- // TODO: b.writeLocale()
- b.computeRegionGroups()
- b.writeLikelyData()
- b.writeMatchData()
- b.writeRegionInclusionData()
- b.writeParents()
-}
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/match.go b/Godeps/_workspace/src/golang.org/x/text/language/match.go
deleted file mode 100644
index eec72bcc1..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/match.go
+++ /dev/null
@@ -1,840 +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 language
-
-import "errors"
-
-// Matcher is the interface that wraps the Match method.
-//
-// Match returns the best match for any of the given tags, along with
-// a unique index associated with the returned tag and a confidence
-// score.
-type Matcher interface {
- Match(t ...Tag) (tag Tag, index int, c Confidence)
-}
-
-// Comprehends reports the confidence score for a speaker of a given language
-// to being able to comprehend the written form of an alternative language.
-func Comprehends(speaker, alternative Tag) Confidence {
- _, _, c := NewMatcher([]Tag{alternative}).Match(speaker)
- return c
-}
-
-// NewMatcher returns a Matcher that matches an ordered list of preferred tags
-// against a list of supported tags based on written intelligibility, closeness
-// of dialect, equivalence of subtags and various other rules. It is initialized
-// with the list of supported tags. The first element is used as the default
-// value in case no match is found.
-//
-// Its Match method matches the first of the given Tags to reach a certain
-// confidence threshold. The tags passed to Match should therefore be specified
-// in order of preference. Extensions are ignored for matching.
-//
-// The index returned by the Match method corresponds to the index of the
-// matched tag in t, but is augmented with the Unicode extension ('u')of the
-// corresponding preferred tag. This allows user locale options to be passed
-// transparently.
-func NewMatcher(t []Tag) Matcher {
- return newMatcher(t)
-}
-
-func (m *matcher) Match(want ...Tag) (t Tag, index int, c Confidence) {
- match, w, c := m.getBest(want...)
- if match == nil {
- t = m.default_.tag
- } else {
- t, index = match.tag, match.index
- }
- // Copy options from the user-provided tag into the result tag. This is hard
- // to do after the fact, so we do it here.
- // TODO: consider also adding in variants that are compatible with the
- // matched language.
- // TODO: Add back region if it is non-ambiguous? Or create another tag to
- // preserve the region?
- if u, ok := w.Extension('u'); ok {
- t, _ = Raw.Compose(t, u)
- }
- return t, index, c
-}
-
-type scriptRegionFlags uint8
-
-const (
- isList = 1 << iota
- scriptInFrom
- regionInFrom
-)
-
-func (t *Tag) setUndefinedLang(id langID) {
- if t.lang == 0 {
- t.lang = id
- }
-}
-
-func (t *Tag) setUndefinedScript(id scriptID) {
- if t.script == 0 {
- t.script = id
- }
-}
-
-func (t *Tag) setUndefinedRegion(id regionID) {
- if t.region == 0 || t.region.contains(id) {
- t.region = id
- }
-}
-
-// ErrMissingLikelyTagsData indicates no information was available
-// to compute likely values of missing tags.
-var ErrMissingLikelyTagsData = errors.New("missing likely tags data")
-
-// addLikelySubtags sets subtags to their most likely value, given the locale.
-// In most cases this means setting fields for unknown values, but in some
-// cases it may alter a value. It returns a ErrMissingLikelyTagsData error
-// if the given locale cannot be expanded.
-func (t Tag) addLikelySubtags() (Tag, error) {
- id, err := addTags(t)
- if err != nil {
- return t, err
- } else if id.equalTags(t) {
- return t, nil
- }
- id.remakeString()
- return id, nil
-}
-
-// specializeRegion attempts to specialize a group region.
-func specializeRegion(t *Tag) bool {
- if i := regionInclusion[t.region]; i < nRegionGroups {
- x := likelyRegionGroup[i]
- if langID(x.lang) == t.lang && scriptID(x.script) == t.script {
- t.region = regionID(x.region)
- }
- return true
- }
- return false
-}
-
-func addTags(t Tag) (Tag, error) {
- // We leave private use identifiers alone.
- if t.private() {
- return t, nil
- }
- if t.script != 0 && t.region != 0 {
- if t.lang != 0 {
- // already fully specified
- specializeRegion(&t)
- return t, nil
- }
- // Search matches for und-script-region. Note that for these cases
- // region will never be a group so there is no need to check for this.
- list := likelyRegion[t.region : t.region+1]
- if x := list[0]; x.flags&isList != 0 {
- list = likelyRegionList[x.lang : x.lang+uint16(x.script)]
- }
- for _, x := range list {
- // Deviating from the spec. See match_test.go for details.
- if scriptID(x.script) == t.script {
- t.setUndefinedLang(langID(x.lang))
- return t, nil
- }
- }
- }
- if t.lang != 0 {
- // Search matches for lang-script and lang-region, where lang != und.
- if t.lang < langNoIndexOffset {
- x := likelyLang[t.lang]
- if x.flags&isList != 0 {
- list := likelyLangList[x.region : x.region+uint16(x.script)]
- if t.script != 0 {
- for _, x := range list {
- if scriptID(x.script) == t.script && x.flags&scriptInFrom != 0 {
- t.setUndefinedRegion(regionID(x.region))
- return t, nil
- }
- }
- } else if t.region != 0 {
- count := 0
- goodScript := true
- tt := t
- for _, x := range list {
- // We visit all entries for which the script was not
- // defined, including the ones where the region was not
- // defined. This allows for proper disambiguation within
- // regions.
- if x.flags&scriptInFrom == 0 && t.region.contains(regionID(x.region)) {
- tt.region = regionID(x.region)
- tt.setUndefinedScript(scriptID(x.script))
- goodScript = goodScript && tt.script == scriptID(x.script)
- count++
- }
- }
- if count == 1 {
- return tt, nil
- }
- // Even if we fail to find a unique Region, we might have
- // an unambiguous script.
- if goodScript {
- t.script = tt.script
- }
- }
- }
- }
- } else {
- // Search matches for und-script.
- if t.script != 0 {
- x := likelyScript[t.script]
- if x.region != 0 {
- t.setUndefinedRegion(regionID(x.region))
- t.setUndefinedLang(langID(x.lang))
- return t, nil
- }
- }
- // Search matches for und-region. If und-script-region exists, it would
- // have been found earlier.
- if t.region != 0 {
- if i := regionInclusion[t.region]; i < nRegionGroups {
- x := likelyRegionGroup[i]
- if x.region != 0 {
- t.setUndefinedLang(langID(x.lang))
- t.setUndefinedScript(scriptID(x.script))
- t.region = regionID(x.region)
- }
- } else {
- x := likelyRegion[t.region]
- if x.flags&isList != 0 {
- x = likelyRegionList[x.lang]
- }
- if x.script != 0 && x.flags != scriptInFrom {
- t.setUndefinedLang(langID(x.lang))
- t.setUndefinedScript(scriptID(x.script))
- return t, nil
- }
- }
- }
- }
-
- // Search matches for lang.
- if t.lang < langNoIndexOffset {
- x := likelyLang[t.lang]
- if x.flags&isList != 0 {
- x = likelyLangList[x.region]
- }
- if x.region != 0 {
- t.setUndefinedScript(scriptID(x.script))
- t.setUndefinedRegion(regionID(x.region))
- }
- specializeRegion(&t)
- if t.lang == 0 {
- t.lang = _en // default language
- }
- return t, nil
- }
- return t, ErrMissingLikelyTagsData
-}
-
-func (t *Tag) setTagsFrom(id Tag) {
- t.lang = id.lang
- t.script = id.script
- t.region = id.region
-}
-
-// minimize removes the region or script subtags from t such that
-// t.addLikelySubtags() == t.minimize().addLikelySubtags().
-func (t Tag) minimize() (Tag, error) {
- t, err := minimizeTags(t)
- if err != nil {
- return t, err
- }
- t.remakeString()
- return t, nil
-}
-
-// minimizeTags mimics the behavior of the ICU 51 C implementation.
-func minimizeTags(t Tag) (Tag, error) {
- if t.equalTags(und) {
- return t, nil
- }
- max, err := addTags(t)
- if err != nil {
- return t, err
- }
- for _, id := range [...]Tag{
- {lang: t.lang},
- {lang: t.lang, region: t.region},
- {lang: t.lang, script: t.script},
- } {
- if x, err := addTags(id); err == nil && max.equalTags(x) {
- t.setTagsFrom(id)
- break
- }
- }
- return t, nil
-}
-
-// Tag Matching
-// CLDR defines an algorithm for finding the best match between two sets of language
-// tags. The basic algorithm defines how to score a possible match and then find
-// the match with the best score
-// (see http://www.unicode.org/reports/tr35/#LanguageMatching).
-// Using scoring has several disadvantages. The scoring obfuscates the importance of
-// the various factors considered, making the algorithm harder to understand. Using
-// scoring also requires the full score to be computed for each pair of tags.
-//
-// We will use a different algorithm which aims to have the following properties:
-// - clarity on the precedence of the various selection factors, and
-// - improved performance by allowing early termination of a comparison.
-//
-// Matching algorithm (overview)
-// Input:
-// - supported: a set of supported tags
-// - default: the default tag to return in case there is no match
-// - desired: list of desired tags, ordered by preference, starting with
-// the most-preferred.
-//
-// Algorithm:
-// 1) Set the best match to the lowest confidence level
-// 2) For each tag in "desired":
-// a) For each tag in "supported":
-// 1) compute the match between the two tags.
-// 2) if the match is better than the previous best match, replace it
-// with the new match. (see next section)
-// b) if the current best match is above a certain threshold, return this
-// match without proceeding to the next tag in "desired". [See Note 1]
-// 3) If the best match so far is below a certain threshold, return "default".
-//
-// Ranking:
-// We use two phases to determine whether one pair of tags are a better match
-// than another pair of tags. First, we determine a rough confidence level. If the
-// levels are different, the one with the highest confidence wins.
-// Second, if the rough confidence levels are identical, we use a set of tie-breaker
-// rules.
-//
-// The confidence level of matching a pair of tags is determined by finding the
-// lowest confidence level of any matches of the corresponding subtags (the
-// result is deemed as good as its weakest link).
-// We define the following levels:
-// Exact - An exact match of a subtag, before adding likely subtags.
-// MaxExact - An exact match of a subtag, after adding likely subtags.
-// [See Note 2].
-// High - High level of mutual intelligibility between different subtag
-// variants.
-// Low - Low level of mutual intelligibility between different subtag
-// variants.
-// No - No mutual intelligibility.
-//
-// The following levels can occur for each type of subtag:
-// Base: Exact, MaxExact, High, Low, No
-// Script: Exact, MaxExact [see Note 3], Low, No
-// Region: Exact, MaxExact, High
-// Variant: Exact, High
-// Private: Exact, No
-//
-// Any result with a confidence level of Low or higher is deemed a possible match.
-// Once a desired tag matches any of the supported tags with a level of MaxExact
-// or higher, the next desired tag is not considered (see Step 2.b).
-// Note that CLDR provides languageMatching data that defines close equivalence
-// classes for base languages, scripts and regions.
-//
-// Tie-breaking
-// If we get the same confidence level for two matches, we apply a sequence of
-// tie-breaking rules. The first that succeeds defines the result. The rules are
-// applied in the following order.
-// 1) Original language was defined and was identical.
-// 2) Original region was defined and was identical.
-// 3) Distance between two maximized regions was the smallest.
-// 4) Original script was defined and was identical.
-// 5) Distance from want tag to have tag using the parent relation [see Note 5.]
-// If there is still no winner after these rules are applied, the first match
-// found wins.
-//
-// Notes:
-// [1] Note that even if we may not have a perfect match, if a match is above a
-// certain threshold, it is considered a better match than any other match
-// to a tag later in the list of preferred language tags.
-// [2] In practice, as matching of Exact is done in a separate phase from
-// matching the other levels, we reuse the Exact level to mean MaxExact in
-// the second phase. As a consequence, we only need the levels defined by
-// the Confidence type. The MaxExact confidence level is mapped to High in
-// the public API.
-// [3] We do not differentiate between maximized script values that were derived
-// from suppressScript versus most likely tag data. We determined that in
-// ranking the two, one ranks just after the other. Moreover, the two cannot
-// occur concurrently. As a consequence, they are identical for practical
-// purposes.
-// [4] In case of deprecated, macro-equivalents and legacy mappings, we assign
-// the MaxExact level to allow iw vs he to still be a closer match than
-// en-AU vs en-US, for example.
-// [5] In CLDR a locale inherits fields that are unspecified for this locale
-// from its parent. Therefore, if a locale is a parent of another locale,
-// it is a strong measure for closeness, especially when no other tie
-// breaker rule applies. One could also argue it is inconsistent, for
-// example, when pt-AO matches pt (which CLDR equates with pt-BR), even
-// though its parent is pt-PT according to the inheritance rules.
-//
-// Implementation Details:
-// There are several performance considerations worth pointing out. Most notably,
-// we preprocess as much as possible (within reason) at the time of creation of a
-// matcher. This includes:
-// - creating a per-language map, which includes data for the raw base language
-// and its canonicalized variant (if applicable),
-// - expanding entries for the equivalence classes defined in CLDR's
-// languageMatch data.
-// The per-language map ensures that typically only a very small number of tags
-// need to be considered. The pre-expansion of canonicalized subtags and
-// equivalence classes reduces the amount of map lookups that need to be done at
-// runtime.
-
-// matcher keeps a set of supported language tags, indexed by language.
-type matcher struct {
- default_ *haveTag
- index map[langID]*matchHeader
- passSettings bool
-}
-
-// matchHeader has the lists of tags for exact matches and matches based on
-// maximized and canonicalized tags for a given language.
-type matchHeader struct {
- exact []haveTag
- max []haveTag
-}
-
-// haveTag holds a supported Tag and its maximized script and region. The maximized
-// or canonicalized language is not stored as it is not needed during matching.
-type haveTag struct {
- tag Tag
-
- // index of this tag in the original list of supported tags.
- index int
-
- // conf is the maximum confidence that can result from matching this haveTag.
- // When conf < Exact this means it was inserted after applying a CLDR equivalence rule.
- conf Confidence
-
- // Maximized region and script.
- maxRegion regionID
- maxScript scriptID
-
- // altScript may be checked as an alternative match to maxScript. If altScript
- // matches, the confidence level for this match is Low. Theoretically there
- // could be multiple alternative scripts. This does not occur in practice.
- altScript scriptID
-
- // nextMax is the index of the next haveTag with the same maximized tags.
- nextMax uint16
-}
-
-func makeHaveTag(tag Tag, index int) (haveTag, langID) {
- max := tag
- if tag.lang != 0 {
- max, _ = max.canonicalize(All)
- max, _ = addTags(max)
- max.remakeString()
- }
- return haveTag{tag, index, Exact, max.region, max.script, altScript(max.lang, max.script), 0}, max.lang
-}
-
-// altScript returns an alternative script that may match the given script with
-// a low confidence. At the moment, the langMatch data allows for at most one
-// script to map to another and we rely on this to keep the code simple.
-func altScript(l langID, s scriptID) scriptID {
- for _, alt := range matchScript {
- if (alt.lang == 0 || langID(alt.lang) == l) && scriptID(alt.have) == s {
- return scriptID(alt.want)
- }
- }
- return 0
-}
-
-// addIfNew adds a haveTag to the list of tags only if it is a unique tag.
-// Tags that have the same maximized values are linked by index.
-func (h *matchHeader) addIfNew(n haveTag, exact bool) {
- // Don't add new exact matches.
- for _, v := range h.exact {
- if v.tag.equalsRest(n.tag) {
- return
- }
- }
- if exact {
- h.exact = append(h.exact, n)
- }
- // Allow duplicate maximized tags, but create a linked list to allow quickly
- // comparing the equivalents and bail out.
- for i, v := range h.max {
- if v.maxScript == n.maxScript &&
- v.maxRegion == n.maxRegion &&
- v.tag.variantOrPrivateTagStr() == n.tag.variantOrPrivateTagStr() {
- for h.max[i].nextMax != 0 {
- i = int(h.max[i].nextMax)
- }
- h.max[i].nextMax = uint16(len(h.max))
- break
- }
- }
- h.max = append(h.max, n)
-}
-
-// header returns the matchHeader for the given language. It creates one if
-// it doesn't already exist.
-func (m *matcher) header(l langID) *matchHeader {
- if h := m.index[l]; h != nil {
- return h
- }
- h := &matchHeader{}
- m.index[l] = h
- return h
-}
-
-// newMatcher builds an index for the given supported tags and returns it as
-// a matcher. It also expands the index by considering various equivalence classes
-// for a given tag.
-func newMatcher(supported []Tag) *matcher {
- m := &matcher{
- index: make(map[langID]*matchHeader),
- }
- if len(supported) == 0 {
- m.default_ = &haveTag{}
- return m
- }
- // Add supported languages to the index. Add exact matches first to give
- // them precedence.
- for i, tag := range supported {
- pair, _ := makeHaveTag(tag, i)
- m.header(tag.lang).addIfNew(pair, true)
- }
- m.default_ = &m.header(supported[0].lang).exact[0]
- for i, tag := range supported {
- pair, max := makeHaveTag(tag, i)
- if max != tag.lang {
- m.header(max).addIfNew(pair, false)
- }
- }
-
- // update is used to add indexes in the map for equivalent languages.
- // If force is true, the update will also apply to derived entries. To
- // avoid applying a "transitive closure", use false.
- update := func(want, have uint16, conf Confidence, force bool) {
- if hh := m.index[langID(have)]; hh != nil {
- if !force && len(hh.exact) == 0 {
- return
- }
- hw := m.header(langID(want))
- for _, v := range hh.max {
- if conf < v.conf {
- v.conf = conf
- }
- v.nextMax = 0 // this value needs to be recomputed
- if v.altScript != 0 {
- v.altScript = altScript(langID(want), v.maxScript)
- }
- hw.addIfNew(v, conf == Exact && len(hh.exact) > 0)
- }
- }
- }
-
- // Add entries for languages with mutual intelligibility as defined by CLDR's
- // languageMatch data.
- for _, ml := range matchLang {
- update(ml.want, ml.have, Confidence(ml.conf), false)
- if !ml.oneway {
- update(ml.have, ml.want, Confidence(ml.conf), false)
- }
- }
-
- // Add entries for possible canonicalizations. This is an optimization to
- // ensure that only one map lookup needs to be done at runtime per desired tag.
- // First we match deprecated equivalents. If they are perfect equivalents
- // (their canonicalization simply substitutes a different language code, but
- // nothing else), the match confidence is Exact, otherwise it is High.
- for i, lm := range langAliasMap {
- if lm.from == _sh {
- continue
- }
-
- // If deprecated codes match and there is no fiddling with the script or
- // or region, we consider it an exact match.
- conf := Exact
- if langAliasTypes[i] != langMacro {
- if !isExactEquivalent(langID(lm.from)) {
- conf = High
- }
- update(lm.to, lm.from, conf, true)
- }
- update(lm.from, lm.to, conf, true)
- }
- return m
-}
-
-// getBest gets the best matching tag in m for any of the given tags, taking into
-// account the order of preference of the given tags.
-func (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) {
- best := bestMatch{}
- for _, w := range want {
- var max Tag
- // Check for exact match first.
- h := m.index[w.lang]
- if w.lang != 0 {
- // Base language is defined.
- if h == nil {
- continue
- }
- for i := range h.exact {
- have := &h.exact[i]
- if have.tag.equalsRest(w) {
- return have, w, Exact
- }
- }
- max, _ = w.canonicalize(Legacy | Deprecated)
- max, _ = addTags(max)
- } else {
- // Base language is not defined.
- if h != nil {
- for i := range h.exact {
- have := &h.exact[i]
- if have.tag.equalsRest(w) {
- return have, w, Exact
- }
- }
- }
- if w.script == 0 && w.region == 0 {
- // We skip all tags matching und for approximate matching, including
- // private tags.
- continue
- }
- max, _ = addTags(w)
- if h = m.index[max.lang]; h == nil {
- continue
- }
- }
- // Check for match based on maximized tag.
- for i := range h.max {
- have := &h.max[i]
- best.update(have, w, max.script, max.region)
- if best.conf == Exact {
- for have.nextMax != 0 {
- have = &h.max[have.nextMax]
- best.update(have, w, max.script, max.region)
- }
- return best.have, best.want, High
- }
- }
- }
- if best.conf <= No {
- if len(want) != 0 {
- return nil, want[0], No
- }
- return nil, Tag{}, No
- }
- return best.have, best.want, best.conf
-}
-
-// bestMatch accumulates the best match so far.
-type bestMatch struct {
- have *haveTag
- want Tag
- conf Confidence
- // Cached results from applying tie-breaking rules.
- origLang bool
- origReg bool
- regDist uint8
- origScript bool
- parentDist uint8 // 255 if have is not an ancestor of want tag.
-}
-
-// update updates the existing best match if the new pair is considered to be a
-// better match.
-// To determine if the given pair is a better match, it first computes the rough
-// confidence level. If this surpasses the current match, it will replace it and
-// update the tie-breaker rule cache. If there is a tie, it proceeds with applying
-// a series of tie-breaker rules. If there is no conclusive winner after applying
-// the tie-breaker rules, it leaves the current match as the preferred match.
-func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion regionID) {
- // Bail if the maximum attainable confidence is below that of the current best match.
- c := have.conf
- if c < m.conf {
- return
- }
- if have.maxScript != maxScript {
- // There is usually very little comprehension between different scripts.
- // In a few cases there may still be Low comprehension. This possibility is
- // pre-computed and stored in have.altScript.
- if Low < m.conf || have.altScript != maxScript {
- return
- }
- c = Low
- } else if have.maxRegion != maxRegion {
- // There is usually a small difference between languages across regions.
- // We use the region distance (below) to disambiguate between equal matches.
- if High < c {
- c = High
- }
- }
-
- // We store the results of the computations of the tie-breaker rules along
- // with the best match. There is no need to do the checks once we determine
- // we have a winner, but we do still need to do the tie-breaker computations.
- // We use "beaten" to keep track if we still need to do the checks.
- beaten := false // true if the new pair defeats the current one.
- if c != m.conf {
- if c < m.conf {
- return
- }
- beaten = true
- }
-
- // Tie-breaker rules:
- // We prefer if the pre-maximized language was specified and identical.
- origLang := have.tag.lang == tag.lang && tag.lang != 0
- if !beaten && m.origLang != origLang {
- if m.origLang {
- return
- }
- beaten = true
- }
-
- // We prefer if the pre-maximized region was specified and identical.
- origReg := have.tag.region == tag.region && tag.region != 0
- if !beaten && m.origReg != origReg {
- if m.origReg {
- return
- }
- beaten = true
- }
-
- // Next we prefer smaller distances between regions, as defined by regionDist.
- regDist := regionDist(have.maxRegion, maxRegion, tag.lang)
- if !beaten && m.regDist != regDist {
- if regDist > m.regDist {
- return
- }
- beaten = true
- }
-
- // Next we prefer if the pre-maximized script was specified and identical.
- origScript := have.tag.script == tag.script && tag.script != 0
- if !beaten && m.origScript != origScript {
- if m.origScript {
- return
- }
- beaten = true
- }
-
- // Finally we prefer tags which have a closer parent relationship.
- parentDist := parentDistance(have.tag.region, tag)
- if !beaten && m.parentDist != parentDist {
- if parentDist > m.parentDist {
- return
- }
- beaten = true
- }
-
- // Update m to the newly found best match.
- if beaten {
- m.have = have
- m.want = tag
- m.conf = c
- m.origLang = origLang
- m.origReg = origReg
- m.origScript = origScript
- m.regDist = regDist
- m.parentDist = parentDist
- }
-}
-
-// parentDistance returns the number of times Parent must be called before the
-// regions match. It is assumed that it has already been checked that lang and
-// script are identical. If haveRegion does not occur in the ancestor chain of
-// tag, it returns 255.
-func parentDistance(haveRegion regionID, tag Tag) uint8 {
- p := tag.Parent()
- d := uint8(1)
- for haveRegion != p.region {
- if p.region == 0 {
- return 255
- }
- p = p.Parent()
- d++
- }
- return d
-}
-
-// regionDist wraps regionDistance with some exceptions to the algorithmic distance.
-func regionDist(a, b regionID, lang langID) uint8 {
- if lang == _en {
- // Two variants of non-US English are close to each other, regardless of distance.
- if a != _US && b != _US {
- return 2
- }
- }
- return uint8(regionDistance(a, b))
-}
-
-// regionDistance computes the distance between two regions based on the
-// distance in the graph of region containments as defined in CLDR. It iterates
-// over increasingly inclusive sets of groups, represented as bit vectors, until
-// the source bit vector has bits in common with the destination vector.
-func regionDistance(a, b regionID) int {
- if a == b {
- return 0
- }
- p, q := regionInclusion[a], regionInclusion[b]
- if p < nRegionGroups {
- p, q = q, p
- }
- set := regionInclusionBits
- if q < nRegionGroups && set[p]&(1<<q) != 0 {
- return 1
- }
- d := 2
- for goal := set[q]; set[p]&goal == 0; p = regionInclusionNext[p] {
- d++
- }
- return d
-}
-
-func (t Tag) variants() string {
- if t.pVariant == 0 {
- return ""
- }
- return t.str[t.pVariant:t.pExt]
-}
-
-// variantOrPrivateTagStr returns variants or private use tags.
-func (t Tag) variantOrPrivateTagStr() string {
- if t.pExt > 0 {
- return t.str[t.pVariant:t.pExt]
- }
- return t.str[t.pVariant:]
-}
-
-// equalsRest compares everything except the language.
-func (a Tag) equalsRest(b Tag) bool {
- // TODO: don't include extensions in this comparison. To do this efficiently,
- // though, we should handle private tags separately.
- return a.script == b.script && a.region == b.region && a.variantOrPrivateTagStr() == b.variantOrPrivateTagStr()
-}
-
-// isExactEquivalent returns true if canonicalizing the language will not alter
-// the script or region of a tag.
-func isExactEquivalent(l langID) bool {
- for _, o := range notEquivalent {
- if o == l {
- return false
- }
- }
- return true
-}
-
-var notEquivalent []langID
-
-func init() {
- // Create a list of all languages for which canonicalization may alter the
- // script or region.
- for _, lm := range langAliasMap {
- tag := Tag{lang: langID(lm.from)}
- if tag, _ = tag.canonicalize(All); tag.script != 0 || tag.region != 0 {
- notEquivalent = append(notEquivalent, langID(lm.from))
- }
- }
-}
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/parse.go b/Godeps/_workspace/src/golang.org/x/text/language/parse.go
deleted file mode 100644
index cfa28f56e..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/parse.go
+++ /dev/null
@@ -1,859 +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 language
-
-import (
- "bytes"
- "errors"
- "fmt"
- "sort"
- "strconv"
- "strings"
-
- "golang.org/x/text/internal/tag"
-)
-
-// isAlpha returns true if the byte is not a digit.
-// b must be an ASCII letter or digit.
-func isAlpha(b byte) bool {
- return b > '9'
-}
-
-// isAlphaNum returns true if the string contains only ASCII letters or digits.
-func isAlphaNum(s []byte) bool {
- for _, c := range s {
- if !('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9') {
- return false
- }
- }
- return true
-}
-
-// errSyntax is returned by any of the parsing functions when the
-// input is not well-formed, according to BCP 47.
-// TODO: return the position at which the syntax error occurred?
-var errSyntax = errors.New("language: tag is not well-formed")
-
-// ValueError is returned by any of the parsing functions when the
-// input is well-formed but the respective subtag is not recognized
-// as a valid value.
-type ValueError struct {
- v [8]byte
-}
-
-func mkErrInvalid(s []byte) error {
- var e ValueError
- copy(e.v[:], s)
- return e
-}
-
-func (e ValueError) tag() []byte {
- n := bytes.IndexByte(e.v[:], 0)
- if n == -1 {
- n = 8
- }
- return e.v[:n]
-}
-
-// Error implements the error interface.
-func (e ValueError) Error() string {
- return fmt.Sprintf("language: subtag %q is well-formed but unknown", e.tag())
-}
-
-// Subtag returns the subtag for which the error occurred.
-func (e ValueError) Subtag() string {
- return string(e.tag())
-}
-
-// scanner is used to scan BCP 47 tokens, which are separated by _ or -.
-type scanner struct {
- b []byte
- bytes [max99thPercentileSize]byte
- token []byte
- start int // start position of the current token
- end int // end position of the current token
- next int // next point for scan
- err error
- done bool
-}
-
-func makeScannerString(s string) scanner {
- scan := scanner{}
- if len(s) <= len(scan.bytes) {
- scan.b = scan.bytes[:copy(scan.bytes[:], s)]
- } else {
- scan.b = []byte(s)
- }
- scan.init()
- return scan
-}
-
-// makeScanner returns a scanner using b as the input buffer.
-// b is not copied and may be modified by the scanner routines.
-func makeScanner(b []byte) scanner {
- scan := scanner{b: b}
- scan.init()
- return scan
-}
-
-func (s *scanner) init() {
- for i, c := range s.b {
- if c == '_' {
- s.b[i] = '-'
- }
- }
- s.scan()
-}
-
-// restToLower converts the string between start and end to lower case.
-func (s *scanner) toLower(start, end int) {
- for i := start; i < end; i++ {
- c := s.b[i]
- if 'A' <= c && c <= 'Z' {
- s.b[i] += 'a' - 'A'
- }
- }
-}
-
-func (s *scanner) setError(e error) {
- if s.err == nil || (e == errSyntax && s.err != errSyntax) {
- s.err = e
- }
-}
-
-// resizeRange shrinks or grows the array at position oldStart such that
-// a new string of size newSize can fit between oldStart and oldEnd.
-// Sets the scan point to after the resized range.
-func (s *scanner) resizeRange(oldStart, oldEnd, newSize int) {
- s.start = oldStart
- if end := oldStart + newSize; end != oldEnd {
- diff := end - oldEnd
- if end < cap(s.b) {
- b := make([]byte, len(s.b)+diff)
- copy(b, s.b[:oldStart])
- copy(b[end:], s.b[oldEnd:])
- s.b = b
- } else {
- s.b = append(s.b[end:], s.b[oldEnd:]...)
- }
- s.next = end + (s.next - s.end)
- s.end = end
- }
-}
-
-// replace replaces the current token with repl.
-func (s *scanner) replace(repl string) {
- s.resizeRange(s.start, s.end, len(repl))
- copy(s.b[s.start:], repl)
-}
-
-// gobble removes the current token from the input.
-// Caller must call scan after calling gobble.
-func (s *scanner) gobble(e error) {
- s.setError(e)
- if s.start == 0 {
- s.b = s.b[:+copy(s.b, s.b[s.next:])]
- s.end = 0
- } else {
- s.b = s.b[:s.start-1+copy(s.b[s.start-1:], s.b[s.end:])]
- s.end = s.start - 1
- }
- s.next = s.start
-}
-
-// deleteRange removes the given range from s.b before the current token.
-func (s *scanner) deleteRange(start, end int) {
- s.setError(errSyntax)
- s.b = s.b[:start+copy(s.b[start:], s.b[end:])]
- diff := end - start
- s.next -= diff
- s.start -= diff
- s.end -= diff
-}
-
-// scan parses the next token of a BCP 47 string. Tokens that are larger
-// than 8 characters or include non-alphanumeric characters result in an error
-// and are gobbled and removed from the output.
-// It returns the end position of the last token consumed.
-func (s *scanner) scan() (end int) {
- end = s.end
- s.token = nil
- for s.start = s.next; s.next < len(s.b); {
- i := bytes.IndexByte(s.b[s.next:], '-')
- if i == -1 {
- s.end = len(s.b)
- s.next = len(s.b)
- i = s.end - s.start
- } else {
- s.end = s.next + i
- s.next = s.end + 1
- }
- token := s.b[s.start:s.end]
- if i < 1 || i > 8 || !isAlphaNum(token) {
- s.gobble(errSyntax)
- continue
- }
- s.token = token
- return end
- }
- if n := len(s.b); n > 0 && s.b[n-1] == '-' {
- s.setError(errSyntax)
- s.b = s.b[:len(s.b)-1]
- }
- s.done = true
- return end
-}
-
-// acceptMinSize parses multiple tokens of the given size or greater.
-// It returns the end position of the last token consumed.
-func (s *scanner) acceptMinSize(min int) (end int) {
- end = s.end
- s.scan()
- for ; len(s.token) >= min; s.scan() {
- end = s.end
- }
- return end
-}
-
-// Parse parses the given BCP 47 string and returns a valid Tag. If parsing
-// failed it returns an error and any part of the tag that could be parsed.
-// If parsing succeeded but an unknown value was found, it returns
-// ValueError. The Tag returned in this case is just stripped of the unknown
-// value. All other values are preserved. It accepts tags in the BCP 47 format
-// and extensions to this standard defined in
-// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.
-// The resulting tag is canonicalized using the default canonicalization type.
-func Parse(s string) (t Tag, err error) {
- return Default.Parse(s)
-}
-
-// Parse parses the given BCP 47 string and returns a valid Tag. If parsing
-// failed it returns an error and any part of the tag that could be parsed.
-// If parsing succeeded but an unknown value was found, it returns
-// ValueError. The Tag returned in this case is just stripped of the unknown
-// value. All other values are preserved. It accepts tags in the BCP 47 format
-// and extensions to this standard defined in
-// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.
-// The resulting tag is canonicalized using the the canonicalization type c.
-func (c CanonType) Parse(s string) (t Tag, err error) {
- // TODO: consider supporting old-style locale key-value pairs.
- if s == "" {
- return und, errSyntax
- }
- if len(s) <= maxAltTaglen {
- b := [maxAltTaglen]byte{}
- for i, c := range s {
- // Generating invalid UTF-8 is okay as it won't match.
- if 'A' <= c && c <= 'Z' {
- c += 'a' - 'A'
- } else if c == '_' {
- c = '-'
- }
- b[i] = byte(c)
- }
- if t, ok := grandfathered(b); ok {
- return t, nil
- }
- }
- scan := makeScannerString(s)
- t, err = parse(&scan, s)
- t, changed := t.canonicalize(c)
- if changed {
- t.remakeString()
- }
- return t, err
-}
-
-func parse(scan *scanner, s string) (t Tag, err error) {
- t = und
- var end int
- if n := len(scan.token); n <= 1 {
- scan.toLower(0, len(scan.b))
- if n == 0 || scan.token[0] != 'x' {
- return t, errSyntax
- }
- end = parseExtensions(scan)
- } else if n >= 4 {
- return und, errSyntax
- } else { // the usual case
- t, end = parseTag(scan)
- if n := len(scan.token); n == 1 {
- t.pExt = uint16(end)
- end = parseExtensions(scan)
- } else if end < len(scan.b) {
- scan.setError(errSyntax)
- scan.b = scan.b[:end]
- }
- }
- if int(t.pVariant) < len(scan.b) {
- if end < len(s) {
- s = s[:end]
- }
- if len(s) > 0 && tag.Compare(s, scan.b) == 0 {
- t.str = s
- } else {
- t.str = string(scan.b)
- }
- } else {
- t.pVariant, t.pExt = 0, 0
- }
- return t, scan.err
-}
-
-// parseTag parses language, script, region and variants.
-// It returns a Tag and the end position in the input that was parsed.
-func parseTag(scan *scanner) (t Tag, end int) {
- var e error
- // TODO: set an error if an unknown lang, script or region is encountered.
- t.lang, e = getLangID(scan.token)
- scan.setError(e)
- scan.replace(t.lang.String())
- langStart := scan.start
- end = scan.scan()
- for len(scan.token) == 3 && isAlpha(scan.token[0]) {
- // From http://tools.ietf.org/html/bcp47, <lang>-<extlang> tags are equivalent
- // to a tag of the form <extlang>.
- lang, e := getLangID(scan.token)
- if lang != 0 {
- t.lang = lang
- copy(scan.b[langStart:], lang.String())
- scan.b[langStart+3] = '-'
- scan.start = langStart + 4
- }
- scan.gobble(e)
- end = scan.scan()
- }
- if len(scan.token) == 4 && isAlpha(scan.token[0]) {
- t.script, e = getScriptID(script, scan.token)
- if t.script == 0 {
- scan.gobble(e)
- }
- end = scan.scan()
- }
- if n := len(scan.token); n >= 2 && n <= 3 {
- t.region, e = getRegionID(scan.token)
- if t.region == 0 {
- scan.gobble(e)
- } else {
- scan.replace(t.region.String())
- }
- end = scan.scan()
- }
- scan.toLower(scan.start, len(scan.b))
- t.pVariant = byte(end)
- end = parseVariants(scan, end, t)
- t.pExt = uint16(end)
- return t, end
-}
-
-var separator = []byte{'-'}
-
-// parseVariants scans tokens as long as each token is a valid variant string.
-// Duplicate variants are removed.
-func parseVariants(scan *scanner, end int, t Tag) int {
- start := scan.start
- varIDBuf := [4]uint8{}
- variantBuf := [4][]byte{}
- varID := varIDBuf[:0]
- variant := variantBuf[:0]
- last := -1
- needSort := false
- for ; len(scan.token) >= 4; scan.scan() {
- // TODO: measure the impact of needing this conversion and redesign
- // the data structure if there is an issue.
- v, ok := variantIndex[string(scan.token)]
- if !ok {
- // unknown variant
- // TODO: allow user-defined variants?
- scan.gobble(mkErrInvalid(scan.token))
- continue
- }
- varID = append(varID, v)
- variant = append(variant, scan.token)
- if !needSort {
- if last < int(v) {
- last = int(v)
- } else {
- needSort = true
- // There is no legal combinations of more than 7 variants
- // (and this is by no means a useful sequence).
- const maxVariants = 8
- if len(varID) > maxVariants {
- break
- }
- }
- }
- end = scan.end
- }
- if needSort {
- sort.Sort(variantsSort{varID, variant})
- k, l := 0, -1
- for i, v := range varID {
- w := int(v)
- if l == w {
- // Remove duplicates.
- continue
- }
- varID[k] = varID[i]
- variant[k] = variant[i]
- k++
- l = w
- }
- if str := bytes.Join(variant[:k], separator); len(str) == 0 {
- end = start - 1
- } else {
- scan.resizeRange(start, end, len(str))
- copy(scan.b[scan.start:], str)
- end = scan.end
- }
- }
- return end
-}
-
-type variantsSort struct {
- i []uint8
- v [][]byte
-}
-
-func (s variantsSort) Len() int {
- return len(s.i)
-}
-
-func (s variantsSort) Swap(i, j int) {
- s.i[i], s.i[j] = s.i[j], s.i[i]
- s.v[i], s.v[j] = s.v[j], s.v[i]
-}
-
-func (s variantsSort) Less(i, j int) bool {
- return s.i[i] < s.i[j]
-}
-
-type bytesSort [][]byte
-
-func (b bytesSort) Len() int {
- return len(b)
-}
-
-func (b bytesSort) Swap(i, j int) {
- b[i], b[j] = b[j], b[i]
-}
-
-func (b bytesSort) Less(i, j int) bool {
- return bytes.Compare(b[i], b[j]) == -1
-}
-
-// parseExtensions parses and normalizes the extensions in the buffer.
-// It returns the last position of scan.b that is part of any extension.
-// It also trims scan.b to remove excess parts accordingly.
-func parseExtensions(scan *scanner) int {
- start := scan.start
- exts := [][]byte{}
- private := []byte{}
- end := scan.end
- for len(scan.token) == 1 {
- extStart := scan.start
- ext := scan.token[0]
- end = parseExtension(scan)
- extension := scan.b[extStart:end]
- if len(extension) < 3 || (ext != 'x' && len(extension) < 4) {
- scan.setError(errSyntax)
- end = extStart
- continue
- } else if start == extStart && (ext == 'x' || scan.start == len(scan.b)) {
- scan.b = scan.b[:end]
- return end
- } else if ext == 'x' {
- private = extension
- break
- }
- exts = append(exts, extension)
- }
- sort.Sort(bytesSort(exts))
- if len(private) > 0 {
- exts = append(exts, private)
- }
- scan.b = scan.b[:start]
- if len(exts) > 0 {
- scan.b = append(scan.b, bytes.Join(exts, separator)...)
- } else if start > 0 {
- // Strip trailing '-'.
- scan.b = scan.b[:start-1]
- }
- return end
-}
-
-// parseExtension parses a single extension and returns the position of
-// the extension end.
-func parseExtension(scan *scanner) int {
- start, end := scan.start, scan.end
- switch scan.token[0] {
- case 'u':
- attrStart := end
- scan.scan()
- for last := []byte{}; len(scan.token) > 2; scan.scan() {
- if bytes.Compare(scan.token, last) != -1 {
- // Attributes are unsorted. Start over from scratch.
- p := attrStart + 1
- scan.next = p
- attrs := [][]byte{}
- for scan.scan(); len(scan.token) > 2; scan.scan() {
- attrs = append(attrs, scan.token)
- end = scan.end
- }
- sort.Sort(bytesSort(attrs))
- copy(scan.b[p:], bytes.Join(attrs, separator))
- break
- }
- last = scan.token
- end = scan.end
- }
- var last, key []byte
- for attrEnd := end; len(scan.token) == 2; last = key {
- key = scan.token
- keyEnd := scan.end
- end = scan.acceptMinSize(3)
- // TODO: check key value validity
- if keyEnd == end || bytes.Compare(key, last) != 1 {
- // We have an invalid key or the keys are not sorted.
- // Start scanning keys from scratch and reorder.
- p := attrEnd + 1
- scan.next = p
- keys := [][]byte{}
- for scan.scan(); len(scan.token) == 2; {
- keyStart, keyEnd := scan.start, scan.end
- end = scan.acceptMinSize(3)
- if keyEnd != end {
- keys = append(keys, scan.b[keyStart:end])
- } else {
- scan.setError(errSyntax)
- end = keyStart
- }
- }
- sort.Sort(bytesSort(keys))
- reordered := bytes.Join(keys, separator)
- if e := p + len(reordered); e < end {
- scan.deleteRange(e, end)
- end = e
- }
- copy(scan.b[p:], bytes.Join(keys, separator))
- break
- }
- }
- case 't':
- scan.scan()
- if n := len(scan.token); n >= 2 && n <= 3 && isAlpha(scan.token[1]) {
- _, end = parseTag(scan)
- scan.toLower(start, end)
- }
- for len(scan.token) == 2 && !isAlpha(scan.token[1]) {
- end = scan.acceptMinSize(3)
- }
- case 'x':
- end = scan.acceptMinSize(1)
- default:
- end = scan.acceptMinSize(2)
- }
- return end
-}
-
-// Compose creates a Tag from individual parts, which may be of type Tag, Base,
-// Script, Region, Variant, []Variant, Extension, []Extension or error. If a
-// Base, Script or Region or slice of type Variant or Extension is passed more
-// than once, the latter will overwrite the former. Variants and Extensions are
-// accumulated, but if two extensions of the same type are passed, the latter
-// will replace the former. A Tag overwrites all former values and typically
-// only makes sense as the first argument. The resulting tag is returned after
-// canonicalizing using the Default CanonType. If one or more errors are
-// encountered, one of the errors is returned.
-func Compose(part ...interface{}) (t Tag, err error) {
- return Default.Compose(part...)
-}
-
-// Compose creates a Tag from individual parts, which may be of type Tag, Base,
-// Script, Region, Variant, []Variant, Extension, []Extension or error. If a
-// Base, Script or Region or slice of type Variant or Extension is passed more
-// than once, the latter will overwrite the former. Variants and Extensions are
-// accumulated, but if two extensions of the same type are passed, the latter
-// will replace the former. A Tag overwrites all former values and typically
-// only makes sense as the first argument. The resulting tag is returned after
-// canonicalizing using CanonType c. If one or more errors are encountered,
-// one of the errors is returned.
-func (c CanonType) Compose(part ...interface{}) (t Tag, err error) {
- var b builder
- if err = b.update(part...); err != nil {
- return und, err
- }
- t, _ = b.tag.canonicalize(c)
-
- if len(b.ext) > 0 || len(b.variant) > 0 {
- sort.Sort(sortVariant(b.variant))
- sort.Strings(b.ext)
- if b.private != "" {
- b.ext = append(b.ext, b.private)
- }
- n := maxCoreSize + tokenLen(b.variant...) + tokenLen(b.ext...)
- buf := make([]byte, n)
- p := t.genCoreBytes(buf)
- t.pVariant = byte(p)
- p += appendTokens(buf[p:], b.variant...)
- t.pExt = uint16(p)
- p += appendTokens(buf[p:], b.ext...)
- t.str = string(buf[:p])
- } else if b.private != "" {
- t.str = b.private
- t.remakeString()
- }
- return
-}
-
-type builder struct {
- tag Tag
-
- private string // the x extension
- ext []string
- variant []string
-
- err error
-}
-
-func (b *builder) addExt(e string) {
- if e == "" {
- } else if e[0] == 'x' {
- b.private = e
- } else {
- b.ext = append(b.ext, e)
- }
-}
-
-var errInvalidArgument = errors.New("invalid Extension or Variant")
-
-func (b *builder) update(part ...interface{}) (err error) {
- replace := func(l *[]string, s string, eq func(a, b string) bool) bool {
- if s == "" {
- b.err = errInvalidArgument
- return true
- }
- for i, v := range *l {
- if eq(v, s) {
- (*l)[i] = s
- return true
- }
- }
- return false
- }
- for _, x := range part {
- switch v := x.(type) {
- case Tag:
- b.tag.lang = v.lang
- b.tag.region = v.region
- b.tag.script = v.script
- if v.str != "" {
- b.variant = nil
- for x, s := "", v.str[v.pVariant:v.pExt]; s != ""; {
- x, s = nextToken(s)
- b.variant = append(b.variant, x)
- }
- b.ext, b.private = nil, ""
- for i, e := int(v.pExt), ""; i < len(v.str); {
- i, e = getExtension(v.str, i)
- b.addExt(e)
- }
- }
- case Base:
- b.tag.lang = v.langID
- case Script:
- b.tag.script = v.scriptID
- case Region:
- b.tag.region = v.regionID
- case Variant:
- if !replace(&b.variant, v.variant, func(a, b string) bool { return a == b }) {
- b.variant = append(b.variant, v.variant)
- }
- case Extension:
- if !replace(&b.ext, v.s, func(a, b string) bool { return a[0] == b[0] }) {
- b.addExt(v.s)
- }
- case []Variant:
- b.variant = nil
- for _, x := range v {
- b.update(x)
- }
- case []Extension:
- b.ext, b.private = nil, ""
- for _, e := range v {
- b.update(e)
- }
- // TODO: support parsing of raw strings based on morphology or just extensions?
- case error:
- err = v
- }
- }
- return
-}
-
-func tokenLen(token ...string) (n int) {
- for _, t := range token {
- n += len(t) + 1
- }
- return
-}
-
-func appendTokens(b []byte, token ...string) int {
- p := 0
- for _, t := range token {
- b[p] = '-'
- copy(b[p+1:], t)
- p += 1 + len(t)
- }
- return p
-}
-
-type sortVariant []string
-
-func (s sortVariant) Len() int {
- return len(s)
-}
-
-func (s sortVariant) Swap(i, j int) {
- s[j], s[i] = s[i], s[j]
-}
-
-func (s sortVariant) Less(i, j int) bool {
- return variantIndex[s[i]] < variantIndex[s[j]]
-}
-
-func findExt(list []string, x byte) int {
- for i, e := range list {
- if e[0] == x {
- return i
- }
- }
- return -1
-}
-
-// getExtension returns the name, body and end position of the extension.
-func getExtension(s string, p int) (end int, ext string) {
- if s[p] == '-' {
- p++
- }
- if s[p] == 'x' {
- return len(s), s[p:]
- }
- end = nextExtension(s, p)
- return end, s[p:end]
-}
-
-// nextExtension finds the next extension within the string, searching
-// for the -<char>- pattern from position p.
-// In the fast majority of cases, language tags will have at most
-// one extension and extensions tend to be small.
-func nextExtension(s string, p int) int {
- for n := len(s) - 3; p < n; {
- if s[p] == '-' {
- if s[p+2] == '-' {
- return p
- }
- p += 3
- } else {
- p++
- }
- }
- return len(s)
-}
-
-var errInvalidWeight = errors.New("ParseAcceptLanguage: invalid weight")
-
-// ParseAcceptLanguage parses the contents of a Accept-Language header as
-// defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and
-// a list of corresponding quality weights. It is more permissive than RFC 2616
-// and may return non-nil slices even if the input is not valid.
-// The Tags will be sorted by highest weight first and then by first occurrence.
-// Tags with a weight of zero will be dropped. An error will be returned if the
-// input could not be parsed.
-func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) {
- var entry string
- for s != "" {
- if entry, s = split(s, ','); entry == "" {
- continue
- }
-
- entry, weight := split(entry, ';')
-
- // Scan the language.
- t, err := Parse(entry)
- if err != nil {
- id, ok := acceptFallback[entry]
- if !ok {
- return nil, nil, err
- }
- t = Tag{lang: id}
- }
-
- // Scan the optional weight.
- w := 1.0
- if weight != "" {
- weight = consume(weight, 'q')
- weight = consume(weight, '=')
- // consume returns the empty string when a token could not be
- // consumed, resulting in an error for ParseFloat.
- if w, err = strconv.ParseFloat(weight, 32); err != nil {
- return nil, nil, errInvalidWeight
- }
- // Drop tags with a quality weight of 0.
- if w <= 0 {
- continue
- }
- }
-
- tag = append(tag, t)
- q = append(q, float32(w))
- }
- sortStable(&tagSort{tag, q})
- return tag, q, nil
-}
-
-// consume removes a leading token c from s and returns the result or the empty
-// string if there is no such token.
-func consume(s string, c byte) string {
- if s == "" || s[0] != c {
- return ""
- }
- return strings.TrimSpace(s[1:])
-}
-
-func split(s string, c byte) (head, tail string) {
- if i := strings.IndexByte(s, c); i >= 0 {
- return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+1:])
- }
- return strings.TrimSpace(s), ""
-}
-
-// Add hack mapping to deal with a small number of cases that that occur
-// in Accept-Language (with reasonable frequency).
-var acceptFallback = map[string]langID{
- "english": _en,
- "deutsch": _de,
- "italian": _it,
- "french": _fr,
- "*": _mul, // defined in the spec to match all languages.
-}
-
-type tagSort struct {
- tag []Tag
- q []float32
-}
-
-func (s *tagSort) Len() int {
- return len(s.q)
-}
-
-func (s *tagSort) Less(i, j int) bool {
- return s.q[i] > s.q[j]
-}
-
-func (s *tagSort) Swap(i, j int) {
- s.tag[i], s.tag[j] = s.tag[j], s.tag[i]
- s.q[i], s.q[j] = s.q[j], s.q[i]
-}
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/tables.go b/Godeps/_workspace/src/golang.org/x/text/language/tables.go
deleted file mode 100644
index 5de0f856a..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/tables.go
+++ /dev/null
@@ -1,2791 +0,0 @@
-// This file was generated by go generate; DO NOT EDIT
-
-package language
-
-import "golang.org/x/text/internal/tag"
-
-// CLDRVersion is the CLDR version from which the tables in this package are derived.
-const CLDRVersion = "29"
-
-const numLanguages = 8654
-
-const numScripts = 230
-
-const numRegions = 354
-
-type fromTo struct {
- from uint16
- to uint16
-}
-
-const nonCanonicalUnd = 649
-const (
- _af = 10
- _am = 17
- _ar = 21
- _az = 36
- _bg = 56
- _bn = 75
- _ca = 97
- _cs = 121
- _da = 128
- _de = 133
- _el = 154
- _en = 155
- _es = 157
- _et = 159
- _fa = 164
- _fi = 168
- _fil = 170
- _fr = 175
- _gu = 211
- _he = 224
- _hi = 225
- _hr = 238
- _hu = 242
- _hy = 243
- _id = 248
- _is = 258
- _it = 259
- _ja = 263
- _ka = 273
- _kk = 303
- _km = 307
- _kn = 309
- _ko = 310
- _ky = 333
- _lo = 357
- _lt = 361
- _lv = 368
- _mk = 396
- _ml = 397
- _mn = 399
- _mo = 402
- _mr = 406
- _ms = 410
- _mul = 414
- _my = 421
- _nb = 431
- _ne = 436
- _nl = 445
- _no = 449
- _pa = 471
- _pl = 487
- _pt = 495
- _ro = 515
- _ru = 519
- _sh = 549
- _si = 552
- _sk = 554
- _sl = 556
- _sq = 570
- _sr = 571
- _sv = 583
- _sw = 584
- _ta = 593
- _te = 600
- _th = 605
- _tl = 616
- _tn = 619
- _tr = 623
- _uk = 646
- _ur = 652
- _uz = 653
- _vi = 658
- _zh = 708
- _zu = 710
- _jbo = 265
- _ami = 1033
- _bnn = 1740
- _hak = 221
- _tlh = 13850
- _lb = 340
- _nv = 458
- _pwn = 11438
- _tao = 13571
- _tay = 13581
- _tsu = 14045
- _nn = 447
- _sfb = 13012
- _vgt = 15084
- _sgg = 13043
- _cmn = 2390
- _nan = 428
- _hsn = 240
-)
-
-const langPrivateStart = 0x2d09
-
-const langPrivateEnd = 0x2f10
-
-// lang holds an alphabetically sorted list of ISO-639 language identifiers.
-// All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag.
-// For 2-byte language identifiers, the two successive bytes have the following meaning:
-// - if the first letter of the 2- and 3-letter ISO codes are the same:
-// the second and third letter of the 3-letter ISO code.
-// - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3.
-// For 3-byte language identifiers the 4th byte is 0.
-var lang tag.Index = "" + // Size: 2856 bytes
- "---\x00aaarabbkabr\x00ace\x00ach\x00ada\x00ady\x00aeveaeb\x00affragq\x00" +
- "aho\x00akkaakk\x00aln\x00alt\x00ammhamo\x00anrgaoz\x00arraarc\x00arn\x00" +
- "aro\x00arq\x00ary\x00arz\x00assmasa\x00ase\x00ast\x00atj\x00avvaawa\x00a" +
- "yymazzebaakbal\x00ban\x00bap\x00bar\x00bas\x00bax\x00bbc\x00bbj\x00bci" +
- "\x00beelbej\x00bem\x00bew\x00bez\x00bfd\x00bfq\x00bft\x00bfy\x00bgulbgc" +
- "\x00bgn\x00bgx\x00bhihbhb\x00bhi\x00bhk\x00bho\x00biisbik\x00bin\x00bjj" +
- "\x00bjn\x00bkm\x00bku\x00blt\x00bmambmq\x00bnenboodbpy\x00bqi\x00bqv\x00" +
- "brrebra\x00brh\x00brx\x00bsosbsq\x00bss\x00bto\x00btv\x00bua\x00buc\x00b" +
- "ug\x00bum\x00bvb\x00byn\x00byv\x00bze\x00caatcch\x00ccp\x00ceheceb\x00cg" +
- "g\x00chhachk\x00chm\x00cho\x00chp\x00chr\x00cja\x00cjm\x00ckb\x00cooscop" +
- "\x00cps\x00crrecrj\x00crk\x00crl\x00crm\x00crs\x00csescsb\x00csw\x00ctd" +
- "\x00cuhucvhvcyymdaandak\x00dar\x00dav\x00dcc\x00deeuden\x00dgr\x00dje" +
- "\x00dnj\x00doi\x00dsb\x00dtm\x00dtp\x00dty\x00dua\x00dvivdyo\x00dyu\x00d" +
- "zzoebu\x00eeweefi\x00egl\x00egy\x00eky\x00elllenngeopoes\x00\x05esu\x00e" +
- "tstett\x00euusewo\x00ext\x00faasfan\x00ffulffm\x00fiinfia\x00fil\x00fit" +
- "\x00fjijfoaofon\x00frrafrc\x00frp\x00frr\x00frs\x00fud\x00fuq\x00fur\x00" +
- "fuv\x00fvr\x00fyrygalegaa\x00gag\x00gan\x00gay\x00gbm\x00gbz\x00gcr\x00g" +
- "dlagez\x00ggn\x00gil\x00gjk\x00gju\x00gllgglk\x00gnrngom\x00gon\x00gor" +
- "\x00gos\x00got\x00grc\x00grt\x00gsw\x00guujgub\x00guc\x00gur\x00guw\x00g" +
- "uz\x00gvlvgvr\x00gwi\x00haauhak\x00haw\x00haz\x00heebhiinhif\x00hil\x00h" +
- "lu\x00hmd\x00hnd\x00hne\x00hnj\x00hnn\x00hno\x00homohoc\x00hoj\x00hrrvhs" +
- "b\x00hsn\x00htathuunhyyehzerianaiba\x00ibb\x00idndieleigboiiiiikpkikt" +
- "\x00ilo\x00inndinh\x00iodoisslittaiukuiw\x00\x03izh\x00japnjam\x00jbo" +
- "\x00jgo\x00ji\x00\x06jmc\x00jml\x00jut\x00jvavjwavkaatkaa\x00kab\x00kac" +
- "\x00kaj\x00kam\x00kao\x00kbd\x00kcg\x00kck\x00kde\x00kdt\x00kea\x00ken" +
- "\x00kfo\x00kfr\x00kfy\x00kgonkge\x00kgp\x00kha\x00khb\x00khn\x00khq\x00k" +
- "ht\x00khw\x00kiikkiu\x00kjuakjg\x00kkazkkj\x00klalkln\x00kmhmkmb\x00knan" +
- "koorkoi\x00kok\x00kos\x00kpe\x00kraukrc\x00kri\x00krj\x00krl\x00kru\x00k" +
- "sasksb\x00ksf\x00ksh\x00kuurkum\x00kvomkvr\x00kvx\x00kw\x00\x01kxm\x00kx" +
- "p\x00kyirlaatlab\x00lad\x00lag\x00lah\x00laj\x00lbtzlbe\x00lbw\x00lcp" +
- "\x00lep\x00lez\x00lgugliimlif\x00lij\x00lis\x00ljp\x00lki\x00lkt\x00lmn" +
- "\x00lmo\x00lninloaolol\x00loz\x00lrc\x00ltitltg\x00luublua\x00luo\x00luy" +
- "\x00luz\x00lvavlwl\x00lzh\x00lzz\x00mad\x00maf\x00mag\x00mai\x00mak\x00m" +
- "an\x00mas\x00maz\x00mdf\x00mdh\x00mdr\x00men\x00mer\x00mfa\x00mfe\x00mgl" +
- "gmgh\x00mgo\x00mgp\x00mgy\x00mhahmirimin\x00mis\x00mkkdmlalmls\x00mnonmn" +
- "i\x00mnw\x00moolmoe\x00moh\x00mos\x00mrarmrd\x00mrj\x00mro\x00mssamtltmt" +
- "r\x00mua\x00mul\x00mus\x00mvy\x00mwk\x00mwr\x00mwv\x00mxc\x00myyamyv\x00" +
- "myx\x00myz\x00mzn\x00naaunah\x00nan\x00nap\x00naq\x00nbobnch\x00nddendc" +
- "\x00nds\x00neepnew\x00ngdongl\x00nhe\x00nhw\x00nij\x00niu\x00njo\x00nlld" +
- "nmg\x00nnnonnh\x00noornod\x00noe\x00non\x00nqo\x00nrblnsk\x00nso\x00nus" +
- "\x00nvavnxq\x00nyyanym\x00nyn\x00nzi\x00occiojjiomrmorriosssosa\x00otk" +
- "\x00paanpag\x00pal\x00pam\x00pap\x00pau\x00pcd\x00pcm\x00pdc\x00pdt\x00p" +
- "eo\x00pfl\x00phn\x00pilipka\x00pko\x00plolpms\x00pnt\x00pon\x00pra\x00pr" +
- "d\x00prg\x00psusptorpuu\x00quuequc\x00qug\x00raj\x00rcf\x00rej\x00rgn" +
- "\x00ria\x00rif\x00rjs\x00rkt\x00rmohrmf\x00rmo\x00rmt\x00rmu\x00rnunrng" +
- "\x00roonrob\x00rof\x00rtm\x00ruusrue\x00rug\x00rw\x00\x04rwk\x00ryu\x00s" +
- "aansaf\x00sah\x00saq\x00sas\x00sat\x00saz\x00sbp\x00scrdsck\x00scn\x00sc" +
- "o\x00scs\x00sdndsdc\x00sdh\x00semesef\x00seh\x00sei\x00ses\x00sgagsga" +
- "\x00sgs\x00sh\x00\x02shi\x00shn\x00siinsid\x00sklkskr\x00sllvsli\x00sly" +
- "\x00smmosma\x00smi\x00smj\x00smn\x00smp\x00sms\x00snnasnk\x00soomsou\x00" +
- "sqqisrrpsrb\x00srn\x00srr\x00srx\x00ssswssy\x00stotstq\x00suunsuk\x00sus" +
- "\x00svweswwaswb\x00swc\x00swg\x00swv\x00sxn\x00syl\x00syr\x00szl\x00taam" +
- "taj\x00tbw\x00tcy\x00tdd\x00tdg\x00tdh\x00teeltem\x00teo\x00tet\x00tggkt" +
- "hhathl\x00thq\x00thr\x00tiirtig\x00tiv\x00tkuktkl\x00tkr\x00tkt\x00tlglt" +
- "ly\x00tmh\x00tnsntoontog\x00tpi\x00trurtru\x00trv\x00tssotsd\x00tsf\x00t" +
- "sg\x00tsj\x00ttatttj\x00tts\x00ttt\x00tum\x00tvl\x00twwitwq\x00txg\x00ty" +
- "ahtyv\x00tzm\x00udm\x00ugiguga\x00ukkruli\x00umb\x00und\x00unr\x00unx" +
- "\x00urrduzzbvai\x00veenvec\x00vep\x00viievic\x00vls\x00vmf\x00vmw\x00voo" +
- "lvot\x00vro\x00vun\x00walnwae\x00wal\x00war\x00wbp\x00wbq\x00wbr\x00wls" +
- "\x00wni\x00woolwtm\x00wuu\x00xav\x00xcr\x00xhhoxlc\x00xld\x00xmf\x00xmn" +
- "\x00xmr\x00xna\x00xnr\x00xog\x00xpr\x00xsa\x00xsr\x00yao\x00yap\x00yav" +
- "\x00ybb\x00yiidyooryrl\x00yua\x00yue\x00zahazag\x00zbl\x00zdj\x00zea\x00" +
- "zgh\x00zhhozmi\x00zuulzxx\x00zza\x00\xff\xff\xff\xff"
-
-const langNoIndexOffset = 713
-
-// langNoIndex is a bit vector of all 3-letter language codes that are not used as an index
-// in lookup tables. The language ids for these language codes are derived directly
-// from the letters and are not consecutive.
-// Size: 2197 bytes, 2197 elements
-var langNoIndex = [2197]uint8{
- // Entry 0 - 3F
- 0xff, 0xfd, 0xfd, 0xfe, 0xef, 0xf7, 0xbf, 0xd2,
- 0xfb, 0xbf, 0xfe, 0xfa, 0xb7, 0x1d, 0x3c, 0x57,
- 0x6f, 0x97, 0x73, 0xf8, 0xff, 0xef, 0xff, 0x70,
- 0xaf, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x85, 0x62,
- 0xe9, 0xbf, 0xfd, 0xff, 0xff, 0xf7, 0xfd, 0x77,
- 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3,
- 0xc9, 0xff, 0xff, 0xff, 0x4d, 0xb8, 0x0a, 0x6a,
- 0x7e, 0xfa, 0xe3, 0xfe, 0x7e, 0xff, 0x77, 0xff,
- // Entry 40 - 7F
- 0xff, 0xff, 0xff, 0xdf, 0x2b, 0xf4, 0xf1, 0xe0,
- 0x5d, 0xe7, 0x9f, 0x14, 0x07, 0x20, 0xdf, 0xed,
- 0x9f, 0x3f, 0xc9, 0x21, 0xf8, 0x3f, 0x94, 0xf7,
- 0x7e, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff,
- 0xff, 0xff, 0x5f, 0xfc, 0xdb, 0xfd, 0xbf, 0xb5,
- 0x7b, 0xdf, 0x7f, 0xf7, 0xeb, 0xfe, 0xff, 0xa7,
- 0xbd, 0xff, 0x7f, 0xf7, 0xff, 0xef, 0xef, 0xef,
- 0xff, 0xff, 0x9f, 0xff, 0xff, 0xef, 0xff, 0xdf,
- // Entry 80 - BF
- 0xff, 0xff, 0xf3, 0xff, 0xfb, 0x2f, 0xff, 0xff,
- 0xfb, 0xee, 0xff, 0xbd, 0xdb, 0xff, 0xdf, 0xf7,
- 0xff, 0xfa, 0xfd, 0xff, 0x7e, 0xaf, 0x7b, 0xfe,
- 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xff,
- 0xff, 0xdf, 0xfb, 0xff, 0xfd, 0xfc, 0xfb, 0xff,
- 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xbf, 0xfd, 0xd5,
- 0xa5, 0x77, 0x40, 0xff, 0x9c, 0xc1, 0x41, 0x2c,
- 0x08, 0x24, 0x41, 0x00, 0x50, 0x40, 0x00, 0x80,
- // Entry C0 - FF
- 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96,
- 0x9b, 0x14, 0x88, 0xf6, 0x7b, 0xe7, 0x17, 0x56,
- 0x55, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef,
- 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10,
- 0xbc, 0x87, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35,
- 0x3e, 0x87, 0xc7, 0xdf, 0xff, 0x00, 0x81, 0x00,
- 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x40, 0x00, 0x40, 0x92, 0x21, 0xd0, 0xbf, 0x5d,
- // Entry 100 - 13F
- 0xfd, 0xde, 0xfe, 0x5e, 0x00, 0x00, 0x02, 0x64,
- 0x8d, 0x19, 0xc1, 0xdf, 0x79, 0x22, 0x00, 0x00,
- 0x00, 0xdf, 0x6d, 0xdc, 0x26, 0xe5, 0xd9, 0xf3,
- 0xfe, 0xff, 0xfd, 0xcb, 0x9f, 0x14, 0x01, 0x0c,
- 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc5, 0x67, 0x5f,
- 0x56, 0x89, 0x5e, 0xb7, 0xec, 0xef, 0x03, 0x00,
- 0x02, 0x00, 0x00, 0x00, 0xc0, 0x77, 0xda, 0x57,
- 0x90, 0x69, 0x01, 0x2c, 0x96, 0x79, 0xe0, 0xff,
- // Entry 140 - 17F
- 0xff, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x08, 0x56,
- 0x01, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x16,
- 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x09,
- 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10,
- 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04,
- 0x08, 0x00, 0x00, 0x04, 0x00, 0x80, 0x28, 0x04,
- 0x00, 0x00, 0x50, 0xd5, 0x2d, 0x00, 0x64, 0x35,
- 0x24, 0x53, 0xf5, 0xd4, 0xbd, 0xe2, 0xcd, 0x03,
- // Entry 180 - 1BF
- 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x17, 0x39, 0x01, 0xdd, 0x57, 0x98,
- 0x21, 0x98, 0xa5, 0x00, 0x00, 0x01, 0x40, 0x82,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0xb0, 0xfe,
- 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- // Entry 1C0 - 1FF
- 0x00, 0x01, 0x28, 0x05, 0x00, 0x00, 0x00, 0x00,
- 0x04, 0x20, 0x04, 0xa6, 0x08, 0x04, 0x00, 0x08,
- 0x81, 0x50, 0x00, 0x00, 0x08, 0x11, 0x86, 0x40,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x06, 0x55,
- 0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x60,
- 0x3b, 0x83, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xbe, 0xdf, 0xff, 0xfe, 0xbf,
- // Entry 200 - 23F
- 0xdf, 0xc7, 0x83, 0x82, 0xc0, 0xff, 0xdf, 0x27,
- 0xcf, 0x5f, 0xe7, 0x01, 0x10, 0x20, 0xb2, 0xc5,
- 0xa4, 0x45, 0x25, 0x9b, 0x03, 0xcf, 0xf0, 0xdf,
- 0x03, 0xc4, 0x08, 0x10, 0x01, 0x0e, 0x01, 0xe3,
- 0x92, 0x54, 0xdb, 0x38, 0xf1, 0x7f, 0xf7, 0x6d,
- 0xf9, 0xff, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01,
- 0x21, 0x12, 0x6c, 0x5f, 0xdd, 0x0f, 0x85, 0x4f,
- 0x40, 0x40, 0x00, 0x04, 0xf9, 0xfd, 0xbd, 0xd4,
- // Entry 240 - 27F
- 0xe8, 0x13, 0xf4, 0x27, 0xa3, 0x0d, 0x00, 0x00,
- 0x20, 0x7b, 0x39, 0x02, 0x05, 0x84, 0x00, 0xf0,
- 0xbf, 0x7f, 0xda, 0x00, 0x18, 0x04, 0x81, 0x00,
- 0x00, 0x00, 0x80, 0x10, 0x94, 0x1c, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x04,
- 0x08, 0xb4, 0x7c, 0xa5, 0x0c, 0x40, 0x00, 0x00,
- 0x11, 0x04, 0x04, 0x6c, 0x00, 0x20, 0x70, 0xff,
- 0xfb, 0x7f, 0x60, 0x00, 0x05, 0x9b, 0xdd, 0x6e,
- // Entry 280 - 2BF
- 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x40, 0x05,
- 0xb5, 0xb6, 0x80, 0x08, 0x04, 0x00, 0x04, 0x51,
- 0xe2, 0xff, 0xfd, 0x3f, 0x05, 0x09, 0x08, 0x05,
- 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x02, 0x60,
- 0xe5, 0x48, 0x14, 0x89, 0x20, 0xc0, 0x47, 0x80,
- 0x07, 0x00, 0x00, 0x00, 0xcc, 0x50, 0x40, 0x24,
- 0x85, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20,
- // Entry 2C0 - 2FF
- 0x02, 0x50, 0x88, 0x11, 0x00, 0xd1, 0x6c, 0xee,
- 0x50, 0x27, 0x1d, 0x11, 0x69, 0x06, 0x59, 0xe9,
- 0x33, 0x08, 0x00, 0x20, 0x05, 0x40, 0x10, 0x00,
- 0x00, 0x00, 0x50, 0x44, 0x96, 0x49, 0xd6, 0x5d,
- 0xa7, 0x81, 0x47, 0x97, 0xfb, 0x00, 0x10, 0x00,
- 0x08, 0x00, 0x80, 0x00, 0x40, 0x45, 0x00, 0x01,
- 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x04, 0x08,
- 0xf8, 0xeb, 0xf6, 0x39, 0xc4, 0x89, 0x16, 0x00,
- // Entry 300 - 33F
- 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa2,
- 0x01, 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00,
- 0x04, 0x10, 0xf0, 0x9d, 0x95, 0x13, 0x04, 0x80,
- 0x00, 0x01, 0xd0, 0x12, 0x40, 0x00, 0x10, 0xb0,
- 0x10, 0x62, 0x4c, 0xd2, 0x02, 0x01, 0x4a, 0x00,
- 0x46, 0x04, 0x00, 0x08, 0x02, 0x00, 0x20, 0xc0,
- 0x00, 0x80, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00,
- 0x00, 0xf0, 0xd8, 0x6f, 0x15, 0x02, 0x08, 0x00,
- // Entry 340 - 37F
- 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01,
- 0x00, 0x10, 0x00, 0x00, 0x00, 0xf8, 0x85, 0xe3,
- 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0x7f, 0xfb,
- 0xff, 0xfc, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xf6,
- 0xfb, 0xfe, 0xf7, 0x1f, 0xff, 0xb3, 0xed, 0xff,
- 0xdb, 0xed, 0xff, 0xfe, 0xff, 0xfe, 0xdf, 0xff,
- 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xff, 0xff,
- 0xfd, 0xff, 0xdf, 0xaf, 0x9c, 0xff, 0xfb, 0xff,
- // Entry 380 - 3BF
- 0xff, 0xff, 0xff, 0xff, 0xef, 0xd2, 0xbb, 0xdf,
- 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef,
- 0xfd, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff,
- 0xef, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0x5f, 0xd3, 0x7b, 0xfd, 0xd9, 0xdf, 0xef,
- 0xbc, 0x18, 0x05, 0x2c, 0xff, 0x07, 0xf0, 0xff,
- 0xf7, 0x5f, 0x00, 0x08, 0x00, 0xc3, 0x3d, 0x1b,
- 0x06, 0xe6, 0x72, 0xf0, 0xdd, 0x3c, 0x7f, 0x44,
- // Entry 3C0 - 3FF
- 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xfd, 0xff, 0x57,
- 0xf2, 0xff, 0x39, 0xff, 0xf2, 0x1e, 0x95, 0xf7,
- 0xf7, 0xff, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00,
- 0x40, 0x54, 0x9f, 0x8a, 0xd9, 0xd9, 0x0e, 0x11,
- 0x84, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x00, 0x01,
- 0x05, 0xd1, 0x50, 0x58, 0x00, 0x00, 0x00, 0x10,
- 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2,
- 0xf9, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
- // Entry 400 - 43F
- 0xd7, 0x6f, 0xff, 0xff, 0xdf, 0x7d, 0xbb, 0xff,
- 0xff, 0xff, 0xf7, 0xf3, 0xef, 0xff, 0xff, 0xf7,
- 0xff, 0xdf, 0xdb, 0x7f, 0xff, 0xff, 0x7f, 0xff,
- 0xff, 0xff, 0xef, 0xff, 0xbc, 0xff, 0xff, 0xfb,
- 0xff, 0xfb, 0xff, 0xde, 0x76, 0xbd, 0xff, 0xf7,
- 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xf3, 0xfe,
- 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xde,
- 0xf7, 0xbb, 0xef, 0xf7, 0xff, 0xfb, 0xbf, 0xdf,
- // Entry 440 - 47F
- 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0x5f, 0x7d,
- 0x7f, 0xff, 0xff, 0xf7, 0xe5, 0xfc, 0xff, 0xfd,
- 0x7f, 0x7f, 0xff, 0x9e, 0xae, 0xff, 0xee, 0xff,
- 0x7f, 0xf7, 0x7b, 0x02, 0x82, 0x04, 0xff, 0xf7,
- 0xff, 0xbf, 0xd7, 0xef, 0xfe, 0xdf, 0xf7, 0xfe,
- 0xe2, 0x8e, 0xe7, 0xff, 0xf7, 0xff, 0x56, 0xbd,
- 0xcd, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xef, 0xff,
- 0xe5, 0xdf, 0x7d, 0x0f, 0xa7, 0x51, 0x04, 0x44,
- // Entry 480 - 4BF
- 0x13, 0xd0, 0x5d, 0xaf, 0xa6, 0xfd, 0xb9, 0xff,
- 0x63, 0x5d, 0x5b, 0xff, 0xff, 0xbf, 0x3f, 0x20,
- 0x14, 0x00, 0x57, 0x51, 0x82, 0x65, 0xf5, 0x49,
- 0xe2, 0xff, 0xfc, 0xdf, 0x00, 0x05, 0xc5, 0x05,
- 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x04,
- 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x51, 0x60, 0x05, 0x04, 0x01, 0x00, 0x00,
- 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xb1,
- // Entry 4C0 - 4FF
- 0xfd, 0x67, 0x4b, 0x06, 0x95, 0x06, 0x57, 0xed,
- 0xfb, 0x4c, 0x9d, 0x7b, 0x83, 0x04, 0x62, 0x40,
- 0x00, 0x15, 0x42, 0x00, 0x00, 0x00, 0x54, 0x83,
- 0xf9, 0x4f, 0x10, 0x8c, 0xc9, 0x46, 0xde, 0xf7,
- 0x13, 0x31, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00,
- 0x01, 0x40, 0x00, 0xf0, 0x5b, 0xf4, 0xbe, 0x7d,
- 0xba, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41,
- // Entry 500 - 53F
- 0xb0, 0xff, 0x79, 0x7a, 0x04, 0x00, 0x00, 0x49,
- 0x2d, 0x14, 0x27, 0x77, 0xed, 0xf1, 0xbf, 0xef,
- 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xfc,
- 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xf5, 0xff,
- 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7f, 0x10,
- 0x01, 0x01, 0x84, 0x6d, 0xff, 0xf7, 0xdd, 0xf9,
- 0x5f, 0x05, 0x86, 0xef, 0xf5, 0x77, 0xbd, 0x3c,
- 0x00, 0x00, 0x00, 0x43, 0x71, 0x42, 0x00, 0x40,
- // Entry 540 - 57F
- 0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- // Entry 580 - 5BF
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xab, 0xbd, 0xe7, 0x57, 0xee, 0x13, 0x5d,
- 0x09, 0xc1, 0x40, 0x21, 0xfa, 0x17, 0x01, 0x80,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0xde, 0xff, 0xbf,
- 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
- 0x00, 0x30, 0x95, 0xe3, 0x10, 0x00, 0x00, 0x00,
- 0x11, 0x04, 0x16, 0x00, 0x01, 0x02, 0x00, 0x81,
- 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40,
- // Entry 5C0 - 5FF
- 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x7e, 0x02,
- 0xaa, 0x10, 0x5d, 0xd8, 0x52, 0x00, 0x80, 0x20,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x02, 0x02,
- 0x19, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d,
- 0x31, 0x00, 0x00, 0x00, 0x01, 0x50, 0x02, 0x20,
- 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00,
- 0x00, 0x1f, 0xdf, 0xf2, 0xfd, 0xff, 0xfd, 0x3f,
- 0x9f, 0x18, 0xcf, 0x9c, 0xbf, 0xaf, 0x5f, 0xfe,
- // Entry 600 - 63F
- 0x7b, 0x4b, 0x40, 0x10, 0xe1, 0xfd, 0xaf, 0xfd,
- 0xb7, 0xf7, 0xff, 0xf3, 0xdf, 0xff, 0x6f, 0xf1,
- 0x7b, 0xf1, 0x7f, 0xdf, 0x7f, 0xbf, 0xfe, 0xb7,
- 0xee, 0x1c, 0xfb, 0xdb, 0xef, 0xdf, 0xff, 0xfd,
- 0x7e, 0xbe, 0x57, 0xff, 0x6f, 0x81, 0x76, 0x1f,
- 0xd4, 0x77, 0xf5, 0xfd, 0xff, 0xff, 0xeb, 0xfe,
- 0xbf, 0x5f, 0x57, 0x1b, 0xeb, 0x5f, 0x50, 0x18,
- 0x02, 0xfa, 0xff, 0x9d, 0x15, 0x97, 0x15, 0x0f,
- // Entry 640 - 67F
- 0x75, 0xc4, 0x7d, 0x81, 0x82, 0xf1, 0xd7, 0x7e,
- 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xdd, 0xde,
- 0xfc, 0xfd, 0xf6, 0x5f, 0x7a, 0x1f, 0x40, 0x98,
- 0x02, 0xff, 0xe3, 0xff, 0xf3, 0xd6, 0xf2, 0xff,
- 0xfb, 0xdf, 0x7d, 0x50, 0x1e, 0x15, 0x7b, 0xb4,
- 0xf5, 0xbe, 0xff, 0xff, 0xf3, 0xf7, 0xff, 0xf7,
- 0x7f, 0xff, 0xff, 0xbe, 0xdb, 0xf7, 0xd7, 0xf9,
- 0xef, 0x2f, 0x80, 0xbf, 0xc5, 0xff, 0xff, 0xf3,
- // Entry 680 - 6BF
- 0x97, 0x9d, 0xff, 0xff, 0xf7, 0xcf, 0xfd, 0xbf,
- 0xde, 0x7f, 0x06, 0x1d, 0x57, 0xff, 0xf8, 0xda,
- 0x5d, 0xce, 0x7d, 0x16, 0xb9, 0xea, 0x69, 0xa0,
- 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x48,
- 0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00,
- 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06,
- 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00,
- 0x04, 0x00, 0x10, 0x8c, 0x58, 0xd5, 0x0d, 0x0f,
- // Entry 6C0 - 6FF
- 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd1, 0x42, 0x08,
- 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00,
- 0x00, 0xdc, 0xff, 0xeb, 0x1f, 0x58, 0x08, 0x41,
- 0x04, 0xa0, 0x04, 0x00, 0x30, 0x12, 0x40, 0x22,
- 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x80, 0x10, 0x10, 0xaf,
- 0x6f, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00,
- // Entry 700 - 73F
- 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
- 0x80, 0x86, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x01,
- 0xdf, 0x18, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0x79,
- 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
- 0x03, 0x00, 0x09, 0x20, 0x00, 0x00, 0x01, 0x00,
- 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // Entry 740 - 77F
- 0x00, 0x00, 0x00, 0xef, 0xf7, 0xfd, 0xcf, 0x7e,
- 0xa0, 0x11, 0x10, 0x00, 0x00, 0x92, 0x01, 0x44,
- 0xcd, 0xf9, 0x5e, 0x00, 0x01, 0x00, 0x30, 0x14,
- 0x04, 0x55, 0x10, 0x01, 0x04, 0xf6, 0x3f, 0x7a,
- 0x05, 0x04, 0x00, 0xb0, 0x80, 0x00, 0x55, 0x55,
- 0x97, 0x7c, 0x9f, 0x71, 0xcc, 0x78, 0xd1, 0x43,
- 0xf5, 0x57, 0x67, 0x14, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x2c, 0xf7, 0xdb, 0x1f, 0x54, 0x60,
- // Entry 780 - 7BF
- 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0xaa, 0x01,
- 0x00, 0x00, 0x30, 0x00, 0x24, 0x44, 0x00, 0x00,
- 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0,
- 0xf5, 0xff, 0xd5, 0xd7, 0xbc, 0x70, 0xd6, 0x78,
- 0x78, 0x15, 0x50, 0x00, 0xa4, 0x84, 0xe9, 0x41,
- 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00,
- 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02,
- 0xff, 0xef, 0xff, 0x4f, 0x85, 0x53, 0xf4, 0xed,
- // Entry 7C0 - 7FF
- 0xdd, 0xbf, 0x72, 0x19, 0xc7, 0x0c, 0xf5, 0x42,
- 0x54, 0xdd, 0x77, 0x14, 0x00, 0x80, 0xc0, 0x56,
- 0xcc, 0x16, 0x9e, 0xfb, 0x35, 0x7d, 0xef, 0xff,
- 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x5d,
- 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80,
- 0x10, 0x20, 0x24, 0x00, 0xff, 0x3f, 0xdf, 0x67,
- 0xfe, 0x01, 0x06, 0x88, 0x0a, 0x40, 0x16, 0x01,
- 0x01, 0x15, 0x2b, 0x3e, 0x01, 0x00, 0x00, 0x10,
- // Entry 800 - 83F
- 0x90, 0x69, 0x45, 0x02, 0x02, 0x01, 0xe1, 0xbf,
- 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa7, 0xd1,
- 0x54, 0x9e, 0x44, 0xdf, 0xfd, 0x8f, 0x66, 0xb3,
- 0x55, 0x20, 0xd4, 0xc3, 0xd8, 0x30, 0x3d, 0x80,
- 0x00, 0x00, 0x00, 0x4c, 0xd4, 0x11, 0xc5, 0x84,
- 0x6e, 0x50, 0x00, 0x22, 0x50, 0x6e, 0xbf, 0xdb,
- 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10,
- 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00,
- // Entry 840 - 87F
- 0xf0, 0xfb, 0xfd, 0x3f, 0x05, 0x00, 0x12, 0x81,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02,
- 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28,
- 0x84, 0x00, 0x33, 0xc0, 0x23, 0x24, 0x00, 0x00,
- 0x00, 0xcb, 0xe4, 0x3a, 0x42, 0xc8, 0x14, 0xf1,
- 0xef, 0xff, 0x7f, 0x16, 0x01, 0x01, 0x84, 0x50,
- 0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40,
- 0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1,
- // Entry 880 - 8BF
- 0x76, 0x16, 0x08, 0x03, 0x10, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x24,
- 0x0a, 0x00, 0x80, 0x00, 0x00,
-}
-
-// altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives
-// to 2-letter language codes that cannot be derived using the method described above.
-// Each 3-letter code is followed by its 1-byte langID.
-var altLangISO3 tag.Index = "---\x00cor\x00hbs\x01heb\x02kin\x03spa\x04yid\x05\xff\xff\xff\xff"
-
-// altLangIndex is used to convert indexes in altLangISO3 to langIDs.
-// Size: 12 bytes, 6 elements
-var altLangIndex = [6]uint16{
- 0x014a, 0x0225, 0x0105, 0x020a, 0x009d, 0x010b,
-}
-
-// langAliasMap maps langIDs to their suggested replacements.
-// Size: 640 bytes, 160 elements
-var langAliasMap = [160]fromTo{
- 0: {from: 0xc4, to: 0xda},
- 1: {from: 0xff, to: 0xf8},
- 2: {from: 0x105, to: 0xe0},
- 3: {from: 0x10b, to: 0x2b9},
- 4: {from: 0x110, to: 0x10f},
- 5: {from: 0x192, to: 0x203},
- 6: {from: 0x1af, to: 0x1c1},
- 7: {from: 0x225, to: 0x23b},
- 8: {from: 0x268, to: 0xaa},
- 9: {from: 0x274, to: 0x252},
- 10: {from: 0x27d, to: 0xd},
- 11: {from: 0x2d5, to: 0x2db},
- 12: {from: 0x326, to: 0x93},
- 13: {from: 0x3c7, to: 0x1c48},
- 14: {from: 0x3e8, to: 0x23a},
- 15: {from: 0x3f9, to: 0x23a},
- 16: {from: 0x484, to: 0x15},
- 17: {from: 0x48f, to: 0xf3},
- 18: {from: 0x4d5, to: 0x1f38},
- 19: {from: 0x54a, to: 0x23},
- 20: {from: 0x550, to: 0x2732},
- 21: {from: 0x55c, to: 0x24},
- 22: {from: 0x57d, to: 0xa1},
- 23: {from: 0x5a3, to: 0x26},
- 24: {from: 0x5ac, to: 0x42},
- 25: {from: 0x615, to: 0x5a7},
- 26: {from: 0x65a, to: 0xc7a},
- 27: {from: 0x786, to: 0x1a5},
- 28: {from: 0x7cd, to: 0x16e},
- 29: {from: 0x7d4, to: 0x59},
- 30: {from: 0x855, to: 0x30b9},
- 31: {from: 0x8cf, to: 0x2c4},
- 32: {from: 0x90c, to: 0x23f1},
- 33: {from: 0x915, to: 0x95a},
- 34: {from: 0x932, to: 0x24f},
- 35: {from: 0x953, to: 0x3fc0},
- 36: {from: 0x956, to: 0x2c4},
- 37: {from: 0x995, to: 0x2b3e},
- 38: {from: 0x9c5, to: 0x2f18},
- 39: {from: 0xa50, to: 0x73},
- 40: {from: 0xa9f, to: 0x79},
- 41: {from: 0xb5f, to: 0x8a},
- 42: {from: 0xb6e, to: 0x1a2},
- 43: {from: 0xb8f, to: 0xb92},
- 44: {from: 0xb95, to: 0x2c8},
- 45: {from: 0xc76, to: 0x1df1},
- 46: {from: 0xc85, to: 0x2c31},
- 47: {from: 0xcd0, to: 0x1bd},
- 48: {from: 0xe67, to: 0x9f},
- 49: {from: 0xe9b, to: 0x179},
- 50: {from: 0xf37, to: 0xfc},
- 51: {from: 0x1010, to: 0xd},
- 52: {from: 0x11bb, to: 0xaf},
- 53: {from: 0x1207, to: 0xa6},
- 54: {from: 0x12b6, to: 0xb32},
- 55: {from: 0x12ba, to: 0x1d2},
- 56: {from: 0x12c9, to: 0x145c},
- 57: {from: 0x1317, to: 0x111},
- 58: {from: 0x131a, to: 0x85},
- 59: {from: 0x133a, to: 0x3a46},
- 60: {from: 0x1401, to: 0xcc},
- 61: {from: 0x145f, to: 0x9a},
- 62: {from: 0x1497, to: 0x278f},
- 63: {from: 0x14af, to: 0xca},
- 64: {from: 0x14be, to: 0xcd6},
- 65: {from: 0x1511, to: 0x12bb},
- 66: {from: 0x15a0, to: 0x154d},
- 67: {from: 0x15ad, to: 0x168a},
- 68: {from: 0x1621, to: 0x23f},
- 69: {from: 0x1710, to: 0x1a98},
- 70: {from: 0x180b, to: 0x2947},
- 71: {from: 0x1821, to: 0x102},
- 72: {from: 0x18f1, to: 0x104},
- 73: {from: 0x191d, to: 0x12ac},
- 74: {from: 0x1dcf, to: 0x3548},
- 75: {from: 0x1dd4, to: 0x1e74},
- 76: {from: 0x1df1, to: 0x18f},
- 77: {from: 0x1e7a, to: 0x145},
- 78: {from: 0x1e85, to: 0x13b},
- 79: {from: 0x1e89, to: 0x122},
- 80: {from: 0x1e90, to: 0x138},
- 81: {from: 0x1ea6, to: 0x1f82},
- 82: {from: 0x1ecc, to: 0x147},
- 83: {from: 0x1f30, to: 0x8d},
- 84: {from: 0x1f65, to: 0x12f8},
- 85: {from: 0x1f7d, to: 0x4235},
- 86: {from: 0x1f8b, to: 0x371a},
- 87: {from: 0x1fc4, to: 0x8d},
- 88: {from: 0x1fce, to: 0x8d},
- 89: {from: 0x1ff9, to: 0x6c1},
- 90: {from: 0x20ad, to: 0x2fbd},
- 91: {from: 0x2119, to: 0x30fc},
- 92: {from: 0x2209, to: 0x170},
- 93: {from: 0x227b, to: 0x18c},
- 94: {from: 0x2287, to: 0x189},
- 95: {from: 0x2291, to: 0x19a},
- 96: {from: 0x22e7, to: 0x8f2},
- 97: {from: 0x2340, to: 0x69},
- 98: {from: 0x23d5, to: 0x179},
- 99: {from: 0x2460, to: 0x244b},
- 100: {from: 0x2490, to: 0x1f4},
- 101: {from: 0x24be, to: 0x3a46},
- 102: {from: 0x24fc, to: 0x244b},
- 103: {from: 0x2520, to: 0x40ef},
- 104: {from: 0x2686, to: 0x25ce},
- 105: {from: 0x26ab, to: 0x1b4},
- 106: {from: 0x271d, to: 0x2b3e},
- 107: {from: 0x28b1, to: 0x1d1},
- 108: {from: 0x2993, to: 0x1d3},
- 109: {from: 0x29d6, to: 0x3a46},
- 110: {from: 0x2a93, to: 0x1ee},
- 111: {from: 0x2aaa, to: 0x32e},
- 112: {from: 0x2ade, to: 0xa4},
- 113: {from: 0x2adf, to: 0xa4},
- 114: {from: 0x2b96, to: 0x183},
- 115: {from: 0x2b9f, to: 0x1763},
- 116: {from: 0x2bb1, to: 0x2b2c},
- 117: {from: 0x2bb8, to: 0x152},
- 118: {from: 0x2beb, to: 0x37},
- 119: {from: 0x2bfc, to: 0x2019},
- 120: {from: 0x2c37, to: 0x2c32},
- 121: {from: 0x2c86, to: 0x2c6e},
- 122: {from: 0x2f2a, to: 0x1f1},
- 123: {from: 0x30fd, to: 0x3125},
- 124: {from: 0x31c1, to: 0x203},
- 125: {from: 0x3285, to: 0x1667},
- 126: {from: 0x337d, to: 0x22a},
- 127: {from: 0x33ef, to: 0x132},
- 128: {from: 0x340d, to: 0x215},
- 129: {from: 0x3494, to: 0x248},
- 130: {from: 0x3557, to: 0x8d},
- 131: {from: 0x35ad, to: 0x3689},
- 132: {from: 0x35c2, to: 0x2a32},
- 133: {from: 0x35c6, to: 0x4c},
- 134: {from: 0x35c9, to: 0x2fbf},
- 135: {from: 0x3603, to: 0x373d},
- 136: {from: 0x3629, to: 0x3d57},
- 137: {from: 0x363c, to: 0x376e},
- 138: {from: 0x364b, to: 0x1d3b},
- 139: {from: 0x364c, to: 0x2c31},
- 140: {from: 0x36f3, to: 0x26a},
- 141: {from: 0x38e5, to: 0xb28},
- 142: {from: 0x390f, to: 0xe91},
- 143: {from: 0x3a30, to: 0x28d},
- 144: {from: 0x3d54, to: 0x7f},
- 145: {from: 0x3f9f, to: 0x828},
- 146: {from: 0x4055, to: 0x30a},
- 147: {from: 0x4090, to: 0x3cf7},
- 148: {from: 0x410f, to: 0x13a},
- 149: {from: 0x4162, to: 0x3462},
- 150: {from: 0x4164, to: 0x86},
- 151: {from: 0x4246, to: 0x30b9},
- 152: {from: 0x427a, to: 0x2b9},
- 153: {from: 0x4361, to: 0x21a0},
- 154: {from: 0x4374, to: 0x2473},
- 155: {from: 0x43a7, to: 0x4645},
- 156: {from: 0x4445, to: 0x4437},
- 157: {from: 0x44d5, to: 0x44dc},
- 158: {from: 0x46ad, to: 0x19a},
- 159: {from: 0x473e, to: 0x2be},
-}
-
-// Size: 160 bytes, 160 elements
-var langAliasTypes = [160]langAliasType{
- // Entry 0 - 3F
- 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, 1,
- 1, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 0, 2,
- 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, 1, 0, 0, 2,
- 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 0, 1, 2, 0, 1,
- // Entry 40 - 7F
- 0, 1, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1, 1,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 2, 2,
- 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,
- 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, 1,
- // Entry 80 - BF
- 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
- 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1,
-}
-
-const (
- _Latn = 82
- _Hani = 50
- _Hans = 52
- _Hant = 53
- _Qaaa = 131
- _Qaai = 139
- _Qabx = 180
- _Zinh = 224
- _Zyyy = 229
- _Zzzz = 230
-)
-
-// script is an alphabetically sorted list of ISO 15924 codes. The index
-// of the script in the string, divided by 4, is the internal scriptID.
-var script tag.Index = "" + // Size: 928 bytes
- "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" +
- "BrahBraiBugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgyd" +
- "EgyhEgypElbaEthiGeokGeorGlagGothGranGrekGujrGuruHanbHangHaniHanoHansHant" +
- "HatrHebrHiraHluwHmngHrktHungIndsItalJamoJavaJpanJurcKaliKanaKharKhmrKhoj" +
- "KitlKitsKndaKoreKpelKthiLanaLaooLatfLatgLatnLekeLepcLimbLinaLinbLisuLoma" +
- "LyciLydiMahjMandManiMarcMayaMendMercMeroMlymModiMongMoonMrooMteiMultMymr" +
- "NarbNbatNewaNkgbNkooNshuOgamOlckOrkhOryaOsgeOsmaPalmPaucPermPhagPhliPhlp" +
- "PhlvPhnxPiqdPlrdPrtiQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaam" +
- "QaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabe" +
- "QabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabw" +
- "QabxRjngRoroRunrSamrSaraSarbSaurSgnwShawShrdSiddSindSinhSoraSundSyloSyrc" +
- "SyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglgThaaThaiTibtTirh" +
- "UgarVaiiVispWaraWoleXpeoXsuxYiiiZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff" +
- "\xff"
-
-// suppressScript is an index from langID to the dominant script for that language,
-// if it exists. If a script is given, it should be suppressed from the language tag.
-// Size: 713 bytes, 713 elements
-var suppressScript = [713]uint8{
- // Entry 0 - 3F
- 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x27, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // Entry 40 - 7F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,
- // Entry 80 - BF
- 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,
- 0xd4, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x2d, 0x52, 0x52, 0x52, 0x00, 0x52,
- 0x00, 0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
- 0x52, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x52,
- 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- // Entry C0 - FF
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x52, 0x2e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x37, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52,
- 0x00, 0x52, 0x52, 0x08, 0x00, 0x00, 0x00, 0x00,
- 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,
- // Entry 100 - 13F
- 0x00, 0x00, 0x52, 0x52, 0x00, 0x37, 0x00, 0x41,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x29, 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, 0x1e,
- 0x00, 0x52, 0x00, 0x46, 0x00, 0x4a, 0x4b, 0x00,
- 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // Entry 140 - 17F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x00, 0x00,
- 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,
- // Entry 180 - 1BF
- 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,
- 0x52, 0x00, 0x00, 0x00, 0x1e, 0x64, 0x00, 0x00,
- 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00,
- 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00,
- 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52,
- 0x00, 0x52, 0x00, 0x52, 0x20, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52,
- // Entry 1C0 - 1FF
- 0x00, 0x52, 0x00, 0x00, 0x00, 0x70, 0x52, 0x00,
- 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x52, 0x75, 0x00, 0x00, 0x00, 0x2f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x52,
- 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
- // Entry 200 - 23F
- 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x1e,
- 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc1, 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x52,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- // Entry 240 - 27F
- 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52,
- 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xd0, 0x52, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00,
- 0x00, 0x27, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,
- 0x52, 0x00, 0x52, 0x52, 0x52, 0x00, 0x52, 0x52,
- 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
- // Entry 280 - 2BF
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x52,
- 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // Entry 2C0 - 2FF
- 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,
- 0x00,
-}
-
-const (
- _001 = 1
- _419 = 30
- _BR = 64
- _CA = 72
- _ES = 109
- _GB = 121
- _MD = 186
- _PT = 236
- _UK = 304
- _US = 306
- _ZZ = 354
- _XA = 320
- _XC = 322
- _XK = 330
-)
-
-// isoRegionOffset needs to be added to the index of regionISO to obtain the regionID
-// for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for
-// the UN.M49 codes used for groups.)
-const isoRegionOffset = 31
-
-// regionTypes defines the status of a region for various standards.
-// Size: 355 bytes, 355 elements
-var regionTypes = [355]uint8{
- // Entry 0 - 3F
- 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, 0x05,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- // Entry 40 - 7F
- 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x00,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06,
- 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- // Entry 80 - BF
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00,
- // Entry C0 - FF
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06,
- 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06,
- 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06,
- 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
- // Entry 100 - 13F
- 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06,
- // Entry 140 - 17F
- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
- 0x05, 0x05, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06,
- 0x04, 0x06, 0x05,
-}
-
-// regionISO holds a list of alphabetically sorted 2-letter ISO region codes.
-// Each 2-letter codes is followed by two bytes with the following meaning:
-// - [A-Z}{2}: the first letter of the 2-letter code plus these two
-// letters form the 3-letter ISO code.
-// - 0, n: index into altRegionISO3.
-var regionISO tag.Index = "" + // Size: 1300 bytes
- "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" +
- "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" +
- "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" +
- "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" +
- "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03FIINFJJIFKLKFMSMFOROFQ" +
- "\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGRRC" +
- "GS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSRIM" +
- "MNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00\x09" +
- "KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTULUUX" +
- "LVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQMRRT" +
- "MSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOORNPPL" +
- "NQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00\x12" +
- "PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTTQU" +
- "\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYCSD" +
- "DNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYRSZ" +
- "WZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTVUV" +
- "TWWNTZZAUAKRUGGAUK UMMIUSSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVUUTWFLF" +
- "WKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXOOOXPPP" +
- "XQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAFZMMBZR" +
- "ARZWWEZZZZ\xff\xff\xff\xff"
-
-// altRegionISO3 holds a list of 3-letter region codes that cannot be
-// mapped to 2-letter codes using the default algorithm. This is a short list.
-var altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN"
-
-// altRegionIDs holds a list of regionIDs the positions of which match those
-// of the 3-letter ISO codes in altRegionISO3.
-// Size: 22 bytes, 11 elements
-var altRegionIDs = [11]uint16{
- 0x0056, 0x006f, 0x0086, 0x00a6, 0x00a8, 0x00ab, 0x00e8, 0x0103,
- 0x011f, 0x015c, 0x00da,
-}
-
-// Size: 80 bytes, 20 elements
-var regionOldMap = [20]fromTo{
- 0: {from: 0x43, to: 0xc2},
- 1: {from: 0x57, to: 0xa5},
- 2: {from: 0x5e, to: 0x5f},
- 3: {from: 0x65, to: 0x3a},
- 4: {from: 0x77, to: 0x76},
- 5: {from: 0x91, to: 0x36},
- 6: {from: 0xa1, to: 0x131},
- 7: {from: 0xbf, to: 0x131},
- 8: {from: 0xd5, to: 0x13c},
- 9: {from: 0xda, to: 0x2a},
- 10: {from: 0xed, to: 0x131},
- 11: {from: 0xf0, to: 0xe0},
- 12: {from: 0xfa, to: 0x6f},
- 13: {from: 0x101, to: 0x161},
- 14: {from: 0x128, to: 0x124},
- 15: {from: 0x130, to: 0x79},
- 16: {from: 0x137, to: 0x13b},
- 17: {from: 0x13e, to: 0x131},
- 18: {from: 0x15a, to: 0x15b},
- 19: {from: 0x160, to: 0x4a},
-}
-
-// m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are
-// codes indicating collections of regions.
-// Size: 710 bytes, 355 elements
-var m49 = [355]int16{
- // Entry 0 - 3F
- 0, 1, 2, 3, 5, 9, 11, 13,
- 14, 15, 17, 18, 19, 21, 29, 30,
- 34, 35, 39, 53, 54, 57, 61, 142,
- 143, 145, 150, 151, 154, 155, 419, 958,
- 0, 20, 784, 4, 28, 660, 8, 51,
- 530, 24, 10, 32, 16, 40, 36, 533,
- 248, 31, 70, 52, 50, 56, 854, 100,
- 48, 108, 204, 652, 60, 96, 68, 535,
- // Entry 40 - 7F
- 76, 44, 64, 104, 74, 72, 112, 84,
- 124, 166, 180, 140, 178, 756, 384, 184,
- 152, 120, 156, 170, 0, 188, 891, 296,
- 192, 132, 531, 162, 196, 203, 278, 276,
- 0, 262, 208, 212, 214, 204, 12, 0,
- 218, 233, 818, 732, 232, 724, 231, 967,
- 246, 242, 238, 583, 234, 0, 250, 249,
- 266, 826, 308, 268, 254, 831, 288, 292,
- // Entry 80 - BF
- 304, 270, 324, 312, 226, 300, 239, 320,
- 316, 624, 328, 344, 334, 340, 191, 332,
- 348, 854, 0, 360, 372, 376, 833, 356,
- 86, 368, 364, 352, 380, 832, 388, 400,
- 392, 581, 404, 417, 116, 296, 174, 659,
- 408, 410, 414, 136, 398, 418, 422, 662,
- 438, 144, 430, 426, 440, 442, 428, 434,
- 504, 492, 498, 499, 663, 450, 584, 581,
- // Entry C0 - FF
- 807, 466, 104, 496, 446, 580, 474, 478,
- 500, 470, 480, 462, 454, 484, 458, 508,
- 516, 540, 562, 574, 566, 548, 558, 528,
- 578, 524, 10, 520, 536, 570, 554, 512,
- 591, 0, 604, 258, 598, 608, 586, 616,
- 666, 612, 630, 275, 620, 581, 585, 600,
- 591, 634, 959, 960, 961, 962, 963, 964,
- 965, 966, 967, 968, 969, 970, 971, 972,
- // Entry 100 - 13F
- 638, 716, 642, 688, 643, 646, 682, 90,
- 690, 729, 752, 702, 654, 705, 744, 703,
- 694, 674, 686, 706, 740, 728, 678, 810,
- 222, 534, 760, 748, 0, 796, 148, 260,
- 768, 764, 762, 772, 626, 795, 788, 776,
- 626, 792, 780, 798, 158, 834, 804, 800,
- 826, 581, 840, 858, 860, 336, 670, 704,
- 862, 92, 850, 704, 548, 876, 581, 882,
- // Entry 140 - 17F
- 973, 974, 975, 976, 977, 978, 979, 980,
- 981, 982, 983, 984, 985, 986, 987, 988,
- 989, 990, 991, 992, 993, 994, 995, 996,
- 997, 998, 720, 887, 175, 891, 710, 894,
- 180, 716, 999,
-}
-
-// m49Index gives indexes into fromM49 based on the three most significant bits
-// of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in
-// fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]]
-// for an entry where the first 7 bits match the 7 lsb of the UN.M49 code.
-// The region code is stored in the 9 lsb of the indexed value.
-// Size: 18 bytes, 9 elements
-var m49Index = [9]int16{
- 0, 59, 107, 142, 180, 219, 258, 290,
- 332,
-}
-
-// fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.
-// Size: 664 bytes, 332 elements
-var fromM49 = [332]uint16{
- // Entry 0 - 3F
- 0x0201, 0x0402, 0x0603, 0x0823, 0x0a04, 0x1026, 0x1205, 0x142a,
- 0x1606, 0x1866, 0x1a07, 0x1c08, 0x1e09, 0x202c, 0x220a, 0x240b,
- 0x260c, 0x2821, 0x2a0d, 0x3029, 0x3824, 0x3a0e, 0x3c0f, 0x3e31,
- 0x402b, 0x4410, 0x4611, 0x482e, 0x4e12, 0x502d, 0x5841, 0x6038,
- 0x6434, 0x6627, 0x6833, 0x6a13, 0x6c14, 0x7035, 0x7215, 0x783c,
- 0x7a16, 0x8042, 0x883e, 0x8c32, 0x9045, 0x9444, 0x9840, 0xa847,
- 0xac98, 0xb507, 0xb939, 0xc03d, 0xc837, 0xd0c2, 0xd839, 0xe046,
- 0xe8a4, 0xf051, 0xf848, 0x0859, 0x10ab, 0x184b, 0x1c17, 0x1e18,
- // Entry 40 - 7F
- 0x20b1, 0x2219, 0x291e, 0x2c1a, 0x2e1b, 0x3050, 0x341c, 0x361d,
- 0x3852, 0x3d2c, 0x445b, 0x4c49, 0x5453, 0x5ca6, 0x5f5c, 0x644c,
- 0x684a, 0x704f, 0x7855, 0x7e8e, 0x8058, 0x885c, 0x965d, 0x983a,
- 0xa062, 0xa863, 0xac64, 0xb468, 0xbd18, 0xc484, 0xcc6e, 0xce6e,
- 0xd06c, 0xd269, 0xd474, 0xdc72, 0xde86, 0xe471, 0xec70, 0xf030,
- 0xf277, 0xf476, 0xfc7c, 0x04e3, 0x091f, 0x0c61, 0x1478, 0x187b,
- 0x1c81, 0x26eb, 0x285f, 0x2c5e, 0x305f, 0x407e, 0x487f, 0x50a5,
- 0x5885, 0x6080, 0x687a, 0x7083, 0x7888, 0x8087, 0x8882, 0x908a,
- // Entry 80 - BF
- 0x988f, 0x9c8c, 0xa135, 0xa88d, 0xb08b, 0xb890, 0xc09b, 0xc897,
- 0xd093, 0xd89a, 0xe099, 0xe894, 0xf095, 0xf89c, 0x004e, 0x089e,
- 0x10a0, 0x1cac, 0x209f, 0x28a2, 0x30a8, 0x34a9, 0x3caa, 0x42a3,
- 0x44ad, 0x461e, 0x4cae, 0x54b3, 0x58b6, 0x5cb2, 0x64b7, 0x6cb0,
- 0x70b4, 0x74b5, 0x7cc4, 0x84bd, 0x8ccc, 0x94ce, 0x9ccb, 0xa4c1,
- 0xacc9, 0xb4c6, 0xbcc7, 0xc0ca, 0xc8cd, 0xd8b9, 0xe0c3, 0xe4ba,
- 0xe6bb, 0xe8c8, 0xf0b8, 0xf8cf, 0x00df, 0x08d0, 0x10db, 0x18d9,
- 0x20d7, 0x2428, 0x265a, 0x2a2f, 0x2d19, 0x2e3f, 0x30dc, 0x38d1,
- // Entry C0 - FF
- 0x493c, 0x54de, 0x5cd6, 0x64d2, 0x6cd4, 0x74dd, 0x7cd3, 0x84d8,
- 0x88c5, 0x8b31, 0x8e73, 0x90be, 0x92ee, 0x94e6, 0x9ee0, 0xace4,
- 0xb0ef, 0xb8e2, 0xc0e5, 0xc8e9, 0xd0e7, 0xd8ec, 0xe089, 0xe524,
- 0xecea, 0xf4f1, 0xfd00, 0x0502, 0x0704, 0x0d05, 0x183b, 0x1d0c,
- 0x26a7, 0x2825, 0x2caf, 0x2ebc, 0x34e8, 0x3d36, 0x4511, 0x4d16,
- 0x5506, 0x5d12, 0x6103, 0x6508, 0x6d10, 0x7d0b, 0x7f0f, 0x813b,
- 0x830d, 0x8513, 0x8d5e, 0x9961, 0xa15a, 0xa86d, 0xb115, 0xb309,
- 0xb86b, 0xc109, 0xc914, 0xd10e, 0xd91b, 0xe10a, 0xe84d, 0xf11a,
- // Entry 100 - 13F
- 0xf522, 0xf921, 0x0120, 0x0923, 0x1127, 0x192a, 0x2022, 0x2926,
- 0x3129, 0x3725, 0x391d, 0x3d2b, 0x412f, 0x492e, 0x4ec0, 0x5517,
- 0x646a, 0x7479, 0x7e7d, 0x809d, 0x8296, 0x852d, 0x9132, 0xa53a,
- 0xac36, 0xb533, 0xb934, 0xbd38, 0xd93d, 0xe53f, 0xed5b, 0xef5b,
- 0xf656, 0xfd5f, 0x7c1f, 0x7ef2, 0x80f3, 0x82f4, 0x84f5, 0x86f6,
- 0x88f7, 0x8af8, 0x8cf9, 0x8e6f, 0x90fb, 0x92fc, 0x94fd, 0x96fe,
- 0x98ff, 0x9b40, 0x9d41, 0x9f42, 0xa143, 0xa344, 0xa545, 0xa746,
- 0xa947, 0xab48, 0xad49, 0xaf4a, 0xb14b, 0xb34c, 0xb54d, 0xb74e,
- // Entry 140 - 17F
- 0xb94f, 0xbb50, 0xbd51, 0xbf52, 0xc153, 0xc354, 0xc555, 0xc756,
- 0xc957, 0xcb58, 0xcd59, 0xcf62,
-}
-
-// Size: 1444 bytes
-var variantIndex = map[string]uint8{
- "1606nict": 0x0,
- "1694acad": 0x1,
- "1901": 0x2,
- "1959acad": 0x3,
- "1994": 0x45,
- "1996": 0x4,
- "abl1943": 0x5,
- "alalc97": 0x47,
- "aluku": 0x6,
- "ao1990": 0x7,
- "arevela": 0x8,
- "arevmda": 0x9,
- "baku1926": 0xa,
- "balanka": 0xb,
- "barla": 0xc,
- "basiceng": 0xd,
- "bauddha": 0xe,
- "biscayan": 0xf,
- "biske": 0x40,
- "bohoric": 0x10,
- "boont": 0x11,
- "colb1945": 0x12,
- "cornu": 0x13,
- "dajnko": 0x14,
- "ekavsk": 0x15,
- "emodeng": 0x16,
- "fonipa": 0x48,
- "fonupa": 0x49,
- "fonxsamp": 0x4a,
- "hepburn": 0x17,
- "heploc": 0x46,
- "hognorsk": 0x18,
- "ijekavsk": 0x19,
- "itihasa": 0x1a,
- "jauer": 0x1b,
- "jyutping": 0x1c,
- "kkcor": 0x1d,
- "kociewie": 0x1e,
- "kscor": 0x1f,
- "laukika": 0x20,
- "lipaw": 0x41,
- "luna1918": 0x21,
- "metelko": 0x22,
- "monoton": 0x23,
- "ndyuka": 0x24,
- "nedis": 0x25,
- "newfound": 0x26,
- "njiva": 0x42,
- "nulik": 0x27,
- "osojs": 0x43,
- "oxendict": 0x28,
- "pamaka": 0x29,
- "petr1708": 0x2a,
- "pinyin": 0x2b,
- "polyton": 0x2c,
- "puter": 0x2d,
- "rigik": 0x2e,
- "rozaj": 0x2f,
- "rumgr": 0x30,
- "scotland": 0x31,
- "scouse": 0x32,
- "simple": 0x4b,
- "solba": 0x44,
- "sotav": 0x33,
- "surmiran": 0x34,
- "sursilv": 0x35,
- "sutsilv": 0x36,
- "tarask": 0x37,
- "uccor": 0x38,
- "ucrcor": 0x39,
- "ulster": 0x3a,
- "unifon": 0x3b,
- "vaidika": 0x3c,
- "valencia": 0x3d,
- "vallader": 0x3e,
- "wadegile": 0x3f,
-}
-
-// variantNumSpecialized is the number of specialized variants in variants.
-const variantNumSpecialized = 71
-
-// nRegionGroups is the number of region groups.
-const nRegionGroups = 32
-
-type likelyLangRegion struct {
- lang uint16
- region uint16
-}
-
-// likelyScript is a lookup table, indexed by scriptID, for the most likely
-// languages and regions given a script.
-// Size: 928 bytes, 232 elements
-var likelyScript = [232]likelyLangRegion{
- 1: {lang: 0xa6, region: 0x82},
- 3: {lang: 0x159, region: 0x104},
- 4: {lang: 0xc, region: 0x97},
- 5: {lang: 0x15, region: 0x6a},
- 7: {lang: 0x16, region: 0x9a},
- 8: {lang: 0xf3, region: 0x27},
- 9: {lang: 0x8, region: 0x9a},
- 10: {lang: 0x27, region: 0x93},
- 11: {lang: 0x2b, region: 0x51},
- 12: {lang: 0x55, region: 0xb2},
- 13: {lang: 0x2c, region: 0x93},
- 14: {lang: 0x4b, region: 0x34},
- 15: {lang: 0x20d, region: 0x97},
- 17: {lang: 0x2c4, region: 0x12c},
- 18: {lang: 0x1e5, region: 0x97},
- 19: {lang: 0xaf, region: 0x76},
- 20: {lang: 0x5b, region: 0x93},
- 21: {lang: 0x47, region: 0xe5},
- 22: {lang: 0x63, region: 0x34},
- 23: {lang: 0x73, region: 0x48},
- 24: {lang: 0x2a8, region: 0x129},
- 25: {lang: 0x6e, region: 0x13b},
- 26: {lang: 0x6c, region: 0x132},
- 28: {lang: 0x71, region: 0x6a},
- 29: {lang: 0xd0, region: 0x5c},
- 30: {lang: 0x207, region: 0x104},
- 32: {lang: 0xe1, region: 0x97},
- 34: {lang: 0xaf, region: 0x76},
- 37: {lang: 0x98, region: 0x6a},
- 38: {lang: 0x23a, region: 0x26},
- 39: {lang: 0x11, region: 0x6e},
- 41: {lang: 0x111, region: 0x7b},
- 42: {lang: 0x7d, region: 0x37},
- 43: {lang: 0xcf, region: 0x12e},
- 44: {lang: 0x20d, region: 0x97},
- 45: {lang: 0x9a, region: 0x85},
- 46: {lang: 0xd3, region: 0x97},
- 47: {lang: 0x1d7, region: 0x97},
- 48: {lang: 0x2c4, region: 0x12c},
- 49: {lang: 0x136, region: 0xa9},
- 50: {lang: 0x2c4, region: 0x52},
- 51: {lang: 0xe9, region: 0xe5},
- 52: {lang: 0x2c4, region: 0x52},
- 53: {lang: 0x2c4, region: 0x12c},
- 54: {lang: 0x18b, region: 0x99},
- 55: {lang: 0xe0, region: 0x95},
- 56: {lang: 0x107, region: 0xa0},
- 57: {lang: 0xe4, region: 0x129},
- 58: {lang: 0xe8, region: 0xad},
- 60: {lang: 0xf2, region: 0x90},
- 62: {lang: 0xa0, region: 0x9c},
- 63: {lang: 0x136, region: 0xa9},
- 64: {lang: 0x10f, region: 0x93},
- 65: {lang: 0x107, region: 0xa0},
- 67: {lang: 0x99, region: 0xc2},
- 68: {lang: 0x107, region: 0xa0},
- 69: {lang: 0x1eb, region: 0xe6},
- 70: {lang: 0x133, region: 0xa4},
- 71: {lang: 0x21a, region: 0x97},
- 74: {lang: 0x135, region: 0x97},
- 75: {lang: 0x136, region: 0xa9},
- 77: {lang: 0x40, region: 0x97},
- 78: {lang: 0x1c2, region: 0x121},
- 79: {lang: 0x165, region: 0xad},
- 84: {lang: 0x158, region: 0x97},
- 85: {lang: 0x15c, region: 0x97},
- 86: {lang: 0x14f, region: 0x85},
- 87: {lang: 0xd0, region: 0x85},
- 88: {lang: 0x15e, region: 0x52},
- 90: {lang: 0x2aa, region: 0x129},
- 91: {lang: 0x2ab, region: 0x129},
- 92: {lang: 0xe1, region: 0x97},
- 93: {lang: 0x1a8, region: 0x9a},
- 94: {lang: 0x2ad, region: 0x52},
- 95: {lang: 0x4c, region: 0x52},
- 97: {lang: 0x17f, region: 0x110},
- 98: {lang: 0x2ae, region: 0x109},
- 99: {lang: 0x2ae, region: 0x109},
- 100: {lang: 0x18d, region: 0x97},
- 101: {lang: 0x196, region: 0x97},
- 102: {lang: 0x18f, region: 0x52},
- 104: {lang: 0x199, region: 0x34},
- 105: {lang: 0x190, region: 0x97},
- 106: {lang: 0x22b, region: 0xe6},
- 107: {lang: 0x1a5, region: 0xc2},
- 108: {lang: 0x2af, region: 0x106},
- 109: {lang: 0x16, region: 0x9f},
- 110: {lang: 0x1b5, region: 0xd9},
- 112: {lang: 0x179, region: 0x82},
- 114: {lang: 0x223, region: 0x94},
- 115: {lang: 0x212, region: 0x97},
- 116: {lang: 0x1d6, region: 0xc3},
- 117: {lang: 0x1d3, region: 0x97},
- 118: {lang: 0x1d5, region: 0x132},
- 119: {lang: 0x238, region: 0x113},
- 120: {lang: 0x16, region: 0x11a},
- 121: {lang: 0x7c, region: 0xc2},
- 122: {lang: 0x147, region: 0x104},
- 123: {lang: 0x172, region: 0x52},
- 124: {lang: 0x1d9, region: 0x9a},
- 125: {lang: 0x1d9, region: 0x52},
- 127: {lang: 0x1e3, region: 0xae},
- 129: {lang: 0xe5, region: 0x52},
- 130: {lang: 0x2b2, region: 0x9a},
- 181: {lang: 0x1f6, region: 0x93},
- 183: {lang: 0x1c4, region: 0x10a},
- 184: {lang: 0x234, region: 0x95},
- 186: {lang: 0x2b3, region: 0x15b},
- 187: {lang: 0x213, region: 0x97},
- 188: {lang: 0x1e, region: 0x132},
- 189: {lang: 0x9b, region: 0x79},
- 190: {lang: 0x20d, region: 0x97},
- 191: {lang: 0x20d, region: 0x97},
- 192: {lang: 0x21a, region: 0x97},
- 193: {lang: 0x228, region: 0xb1},
- 194: {lang: 0x23c, region: 0x97},
- 195: {lang: 0x244, region: 0x93},
- 196: {lang: 0x24e, region: 0x34},
- 197: {lang: 0x24f, region: 0x99},
- 201: {lang: 0x253, region: 0xe5},
- 202: {lang: 0x8a, region: 0x97},
- 203: {lang: 0x255, region: 0x52},
- 204: {lang: 0x126, region: 0x52},
- 205: {lang: 0x251, region: 0x97},
- 206: {lang: 0x27f, region: 0x52},
- 207: {lang: 0x48, region: 0x13b},
- 208: {lang: 0x258, region: 0x97},
- 210: {lang: 0x2c3, region: 0xb8},
- 211: {lang: 0xaa, region: 0xe5},
- 212: {lang: 0x90, region: 0xcb},
- 213: {lang: 0x25d, region: 0x121},
- 214: {lang: 0x4c, region: 0x52},
- 215: {lang: 0x177, region: 0x97},
- 216: {lang: 0x285, region: 0x11a},
- 217: {lang: 0x28e, region: 0xb2},
- 219: {lang: 0xec, region: 0x97},
- 221: {lang: 0x1e1, region: 0x9a},
- 222: {lang: 0xe, region: 0x99},
- 223: {lang: 0xfb, region: 0x52},
-}
-
-type likelyScriptRegion struct {
- region uint16
- script uint8
- flags uint8
-}
-
-// likelyLang is a lookup table, indexed by langID, for the most likely
-// scripts and regions given incomplete information. If more entries exist for a
-// given language, region and script are the index and size respectively
-// of the list in likelyLangList.
-// Size: 2852 bytes, 713 elements
-var likelyLang = [713]likelyScriptRegion{
- 0: {region: 0x132, script: 0x52, flags: 0x0},
- 1: {region: 0x6e, script: 0x52, flags: 0x0},
- 2: {region: 0x7b, script: 0x1e, flags: 0x0},
- 3: {region: 0x7e, script: 0x52, flags: 0x0},
- 4: {region: 0x93, script: 0x52, flags: 0x0},
- 5: {region: 0x12f, script: 0x52, flags: 0x0},
- 6: {region: 0x7e, script: 0x52, flags: 0x0},
- 7: {region: 0x104, script: 0x1e, flags: 0x0},
- 8: {region: 0x9a, script: 0x9, flags: 0x0},
- 9: {region: 0x126, script: 0x5, flags: 0x0},
- 10: {region: 0x15e, script: 0x52, flags: 0x0},
- 11: {region: 0x51, script: 0x52, flags: 0x0},
- 12: {region: 0x97, script: 0x4, flags: 0x0},
- 13: {region: 0x7e, script: 0x52, flags: 0x0},
- 14: {region: 0x99, script: 0xde, flags: 0x0},
- 15: {region: 0x14a, script: 0x52, flags: 0x0},
- 16: {region: 0x104, script: 0x1e, flags: 0x0},
- 17: {region: 0x6e, script: 0x27, flags: 0x0},
- 18: {region: 0xd4, script: 0x52, flags: 0x0},
- 20: {region: 0x93, script: 0x52, flags: 0x0},
- 21: {region: 0x6a, script: 0x5, flags: 0x0},
- 22: {region: 0x0, script: 0x3, flags: 0x1},
- 23: {region: 0x50, script: 0x52, flags: 0x0},
- 24: {region: 0x3e, script: 0x52, flags: 0x0},
- 25: {region: 0x66, script: 0x5, flags: 0x0},
- 26: {region: 0xb8, script: 0x5, flags: 0x0},
- 27: {region: 0x6a, script: 0x5, flags: 0x0},
- 28: {region: 0x97, script: 0xe, flags: 0x0},
- 29: {region: 0x12d, script: 0x52, flags: 0x0},
- 30: {region: 0x132, script: 0xbc, flags: 0x0},
- 31: {region: 0x6d, script: 0x52, flags: 0x0},
- 32: {region: 0x48, script: 0x52, flags: 0x0},
- 33: {region: 0x104, script: 0x1e, flags: 0x0},
- 34: {region: 0x97, script: 0x20, flags: 0x0},
- 35: {region: 0x3e, script: 0x52, flags: 0x0},
- 36: {region: 0x3, script: 0x5, flags: 0x1},
- 37: {region: 0x104, script: 0x1e, flags: 0x0},
- 38: {region: 0xe6, script: 0x5, flags: 0x0},
- 39: {region: 0x93, script: 0x52, flags: 0x0},
- 40: {region: 0xd9, script: 0x20, flags: 0x0},
- 41: {region: 0x2d, script: 0x52, flags: 0x0},
- 42: {region: 0x51, script: 0x52, flags: 0x0},
- 43: {region: 0x51, script: 0xb, flags: 0x0},
- 44: {region: 0x93, script: 0x52, flags: 0x0},
- 45: {region: 0x51, script: 0x52, flags: 0x0},
- 46: {region: 0x4e, script: 0x52, flags: 0x0},
- 47: {region: 0x46, script: 0x1e, flags: 0x0},
- 48: {region: 0x109, script: 0x5, flags: 0x0},
- 49: {region: 0x15f, script: 0x52, flags: 0x0},
- 50: {region: 0x93, script: 0x52, flags: 0x0},
- 51: {region: 0x12d, script: 0x52, flags: 0x0},
- 52: {region: 0x51, script: 0x52, flags: 0x0},
- 53: {region: 0x97, script: 0xcd, flags: 0x0},
- 54: {region: 0xe6, script: 0x5, flags: 0x0},
- 55: {region: 0x97, script: 0x20, flags: 0x0},
- 56: {region: 0x37, script: 0x1e, flags: 0x0},
- 57: {region: 0x97, script: 0x20, flags: 0x0},
- 58: {region: 0xe6, script: 0x5, flags: 0x0},
- 59: {region: 0x129, script: 0x2d, flags: 0x0},
- 61: {region: 0x97, script: 0x20, flags: 0x0},
- 62: {region: 0x97, script: 0x20, flags: 0x0},
- 63: {region: 0xe5, script: 0x52, flags: 0x0},
- 64: {region: 0x97, script: 0x20, flags: 0x0},
- 65: {region: 0x13c, script: 0x52, flags: 0x0},
- 66: {region: 0xe5, script: 0x52, flags: 0x0},
- 67: {region: 0xd4, script: 0x52, flags: 0x0},
- 68: {region: 0x97, script: 0x20, flags: 0x0},
- 69: {region: 0x93, script: 0x52, flags: 0x0},
- 70: {region: 0x51, script: 0x52, flags: 0x0},
- 71: {region: 0xe5, script: 0x52, flags: 0x0},
- 72: {region: 0x13b, script: 0xcf, flags: 0x0},
- 73: {region: 0xc1, script: 0x52, flags: 0x0},
- 74: {region: 0xc1, script: 0x52, flags: 0x0},
- 75: {region: 0x34, script: 0xe, flags: 0x0},
- 76: {region: 0x52, script: 0xd6, flags: 0x0},
- 77: {region: 0x97, script: 0xe, flags: 0x0},
- 78: {region: 0x9a, script: 0x5, flags: 0x0},
- 79: {region: 0x4e, script: 0x52, flags: 0x0},
- 80: {region: 0x76, script: 0x52, flags: 0x0},
- 81: {region: 0x97, script: 0x20, flags: 0x0},
- 82: {region: 0xe6, script: 0x5, flags: 0x0},
- 83: {region: 0x97, script: 0x20, flags: 0x0},
- 84: {region: 0x32, script: 0x52, flags: 0x0},
- 85: {region: 0xb2, script: 0xc, flags: 0x0},
- 86: {region: 0x51, script: 0x52, flags: 0x0},
- 87: {region: 0xe5, script: 0x52, flags: 0x0},
- 88: {region: 0xe6, script: 0x20, flags: 0x0},
- 89: {region: 0x104, script: 0x1e, flags: 0x0},
- 90: {region: 0x15c, script: 0x52, flags: 0x0},
- 91: {region: 0x93, script: 0x52, flags: 0x0},
- 92: {region: 0x51, script: 0x52, flags: 0x0},
- 93: {region: 0x84, script: 0x52, flags: 0x0},
- 94: {region: 0x6c, script: 0x27, flags: 0x0},
- 95: {region: 0x51, script: 0x52, flags: 0x0},
- 96: {region: 0xc1, script: 0x52, flags: 0x0},
- 97: {region: 0x6d, script: 0x52, flags: 0x0},
- 98: {region: 0xd4, script: 0x52, flags: 0x0},
- 99: {region: 0x8, script: 0x2, flags: 0x1},
- 100: {region: 0x104, script: 0x1e, flags: 0x0},
- 101: {region: 0xe5, script: 0x52, flags: 0x0},
- 102: {region: 0x12f, script: 0x52, flags: 0x0},
- 103: {region: 0x88, script: 0x52, flags: 0x0},
- 104: {region: 0x73, script: 0x52, flags: 0x0},
- 105: {region: 0x104, script: 0x1e, flags: 0x0},
- 106: {region: 0x132, script: 0x52, flags: 0x0},
- 107: {region: 0x48, script: 0x52, flags: 0x0},
- 108: {region: 0x132, script: 0x1a, flags: 0x0},
- 109: {region: 0xa4, script: 0x5, flags: 0x0},
- 110: {region: 0x13b, script: 0x19, flags: 0x0},
- 111: {region: 0x99, script: 0x5, flags: 0x0},
- 112: {region: 0x76, script: 0x52, flags: 0x0},
- 113: {region: 0x6a, script: 0x1c, flags: 0x0},
- 114: {region: 0xe5, script: 0x52, flags: 0x0},
- 115: {region: 0x48, script: 0x17, flags: 0x0},
- 116: {region: 0x48, script: 0x17, flags: 0x0},
- 117: {region: 0x48, script: 0x17, flags: 0x0},
- 118: {region: 0x48, script: 0x17, flags: 0x0},
- 119: {region: 0x48, script: 0x17, flags: 0x0},
- 120: {region: 0x108, script: 0x52, flags: 0x0},
- 121: {region: 0x5d, script: 0x52, flags: 0x0},
- 122: {region: 0xe7, script: 0x52, flags: 0x0},
- 123: {region: 0x48, script: 0x17, flags: 0x0},
- 124: {region: 0xc2, script: 0x79, flags: 0x0},
- 125: {region: 0xa, script: 0x2, flags: 0x1},
- 126: {region: 0x104, script: 0x1e, flags: 0x0},
- 127: {region: 0x79, script: 0x52, flags: 0x0},
- 128: {region: 0x62, script: 0x52, flags: 0x0},
- 129: {region: 0x132, script: 0x52, flags: 0x0},
- 130: {region: 0x104, script: 0x1e, flags: 0x0},
- 131: {region: 0xa2, script: 0x52, flags: 0x0},
- 132: {region: 0x97, script: 0x5, flags: 0x0},
- 133: {region: 0x5f, script: 0x52, flags: 0x0},
- 134: {region: 0x48, script: 0x52, flags: 0x0},
- 135: {region: 0x48, script: 0x52, flags: 0x0},
- 136: {region: 0xd2, script: 0x52, flags: 0x0},
- 137: {region: 0x4e, script: 0x52, flags: 0x0},
- 138: {region: 0x97, script: 0x5, flags: 0x0},
- 139: {region: 0x5f, script: 0x52, flags: 0x0},
- 140: {region: 0xc1, script: 0x52, flags: 0x0},
- 141: {region: 0xce, script: 0x52, flags: 0x0},
- 142: {region: 0xd9, script: 0x20, flags: 0x0},
- 143: {region: 0x51, script: 0x52, flags: 0x0},
- 144: {region: 0xcb, script: 0xd4, flags: 0x0},
- 145: {region: 0x112, script: 0x52, flags: 0x0},
- 146: {region: 0x36, script: 0x52, flags: 0x0},
- 147: {region: 0x42, script: 0xd6, flags: 0x0},
- 148: {region: 0xa2, script: 0x52, flags: 0x0},
- 149: {region: 0x7e, script: 0x52, flags: 0x0},
- 150: {region: 0xd4, script: 0x52, flags: 0x0},
- 151: {region: 0x9c, script: 0x52, flags: 0x0},
- 152: {region: 0x6a, script: 0x25, flags: 0x0},
- 153: {region: 0xc2, script: 0x43, flags: 0x0},
- 154: {region: 0x85, script: 0x2d, flags: 0x0},
- 155: {region: 0xc, script: 0x2, flags: 0x1},
- 156: {region: 0x1, script: 0x52, flags: 0x0},
- 157: {region: 0x6d, script: 0x52, flags: 0x0},
- 158: {region: 0x132, script: 0x52, flags: 0x0},
- 159: {region: 0x69, script: 0x52, flags: 0x0},
- 160: {region: 0x9c, script: 0x3e, flags: 0x0},
- 161: {region: 0x6d, script: 0x52, flags: 0x0},
- 162: {region: 0x51, script: 0x52, flags: 0x0},
- 163: {region: 0x6d, script: 0x52, flags: 0x0},
- 164: {region: 0x9a, script: 0x5, flags: 0x0},
- 165: {region: 0x84, script: 0x52, flags: 0x0},
- 166: {region: 0xe, script: 0x2, flags: 0x1},
- 167: {region: 0xc1, script: 0x52, flags: 0x0},
- 168: {region: 0x70, script: 0x52, flags: 0x0},
- 169: {region: 0x109, script: 0x5, flags: 0x0},
- 170: {region: 0xe5, script: 0x52, flags: 0x0},
- 171: {region: 0x10a, script: 0x52, flags: 0x0},
- 172: {region: 0x71, script: 0x52, flags: 0x0},
- 173: {region: 0x74, script: 0x52, flags: 0x0},
- 174: {region: 0x3a, script: 0x52, flags: 0x0},
- 175: {region: 0x76, script: 0x52, flags: 0x0},
- 176: {region: 0x132, script: 0x52, flags: 0x0},
- 177: {region: 0x76, script: 0x52, flags: 0x0},
- 178: {region: 0x5f, script: 0x52, flags: 0x0},
- 179: {region: 0x5f, script: 0x52, flags: 0x0},
- 180: {region: 0x13d, script: 0x52, flags: 0x0},
- 181: {region: 0xd2, script: 0x52, flags: 0x0},
- 182: {region: 0x9c, script: 0x52, flags: 0x0},
- 183: {region: 0xd4, script: 0x52, flags: 0x0},
- 184: {region: 0x109, script: 0x52, flags: 0x0},
- 185: {region: 0xd7, script: 0x52, flags: 0x0},
- 186: {region: 0x94, script: 0x52, flags: 0x0},
- 187: {region: 0x7e, script: 0x52, flags: 0x0},
- 188: {region: 0xba, script: 0x52, flags: 0x0},
- 189: {region: 0x52, script: 0x34, flags: 0x0},
- 190: {region: 0x93, script: 0x52, flags: 0x0},
- 191: {region: 0x97, script: 0x20, flags: 0x0},
- 192: {region: 0x9a, script: 0x5, flags: 0x0},
- 193: {region: 0x7c, script: 0x52, flags: 0x0},
- 194: {region: 0x79, script: 0x52, flags: 0x0},
- 195: {region: 0x6e, script: 0x27, flags: 0x0},
- 196: {region: 0xd9, script: 0x20, flags: 0x0},
- 197: {region: 0xa5, script: 0x52, flags: 0x0},
- 198: {region: 0xe6, script: 0x5, flags: 0x0},
- 199: {region: 0xe6, script: 0x5, flags: 0x0},
- 200: {region: 0x6d, script: 0x52, flags: 0x0},
- 201: {region: 0x9a, script: 0x5, flags: 0x0},
- 202: {region: 0xef, script: 0x52, flags: 0x0},
- 203: {region: 0x97, script: 0x20, flags: 0x0},
- 204: {region: 0x97, script: 0xd0, flags: 0x0},
- 205: {region: 0x93, script: 0x52, flags: 0x0},
- 206: {region: 0xd7, script: 0x52, flags: 0x0},
- 207: {region: 0x12e, script: 0x2b, flags: 0x0},
- 208: {region: 0x10, script: 0x2, flags: 0x1},
- 209: {region: 0x97, script: 0xe, flags: 0x0},
- 210: {region: 0x4d, script: 0x52, flags: 0x0},
- 211: {region: 0x97, script: 0x2e, flags: 0x0},
- 212: {region: 0x40, script: 0x52, flags: 0x0},
- 213: {region: 0x53, script: 0x52, flags: 0x0},
- 214: {region: 0x7e, script: 0x52, flags: 0x0},
- 216: {region: 0xa2, script: 0x52, flags: 0x0},
- 217: {region: 0x96, script: 0x52, flags: 0x0},
- 218: {region: 0xd9, script: 0x20, flags: 0x0},
- 219: {region: 0x48, script: 0x52, flags: 0x0},
- 220: {region: 0x12, script: 0x3, flags: 0x1},
- 221: {region: 0x52, script: 0x34, flags: 0x0},
- 222: {region: 0x132, script: 0x52, flags: 0x0},
- 223: {region: 0x23, script: 0x5, flags: 0x0},
- 224: {region: 0x95, script: 0x37, flags: 0x0},
- 225: {region: 0x97, script: 0x20, flags: 0x0},
- 226: {region: 0x71, script: 0x52, flags: 0x0},
- 227: {region: 0xe5, script: 0x52, flags: 0x0},
- 228: {region: 0x129, script: 0x39, flags: 0x0},
- 229: {region: 0x52, script: 0x81, flags: 0x0},
- 230: {region: 0xe6, script: 0x5, flags: 0x0},
- 231: {region: 0x97, script: 0x20, flags: 0x0},
- 232: {region: 0xad, script: 0x3a, flags: 0x0},
- 233: {region: 0xe5, script: 0x52, flags: 0x0},
- 234: {region: 0xe6, script: 0x5, flags: 0x0},
- 235: {region: 0xe4, script: 0x52, flags: 0x0},
- 236: {region: 0x97, script: 0x20, flags: 0x0},
- 237: {region: 0x97, script: 0x20, flags: 0x0},
- 238: {region: 0x8e, script: 0x52, flags: 0x0},
- 239: {region: 0x5f, script: 0x52, flags: 0x0},
- 240: {region: 0x52, script: 0x34, flags: 0x0},
- 241: {region: 0x8f, script: 0x52, flags: 0x0},
- 242: {region: 0x90, script: 0x52, flags: 0x0},
- 243: {region: 0x27, script: 0x8, flags: 0x0},
- 244: {region: 0xd0, script: 0x52, flags: 0x0},
- 245: {region: 0x76, script: 0x52, flags: 0x0},
- 246: {region: 0xce, script: 0x52, flags: 0x0},
- 247: {region: 0xd4, script: 0x52, flags: 0x0},
- 248: {region: 0x93, script: 0x52, flags: 0x0},
- 250: {region: 0xd4, script: 0x52, flags: 0x0},
- 251: {region: 0x52, script: 0xdf, flags: 0x0},
- 252: {region: 0x132, script: 0x52, flags: 0x0},
- 253: {region: 0x48, script: 0x52, flags: 0x0},
- 254: {region: 0xe5, script: 0x52, flags: 0x0},
- 255: {region: 0x93, script: 0x52, flags: 0x0},
- 256: {region: 0x104, script: 0x1e, flags: 0x0},
- 258: {region: 0x9b, script: 0x52, flags: 0x0},
- 259: {region: 0x9c, script: 0x52, flags: 0x0},
- 260: {region: 0x48, script: 0x17, flags: 0x0},
- 261: {region: 0x95, script: 0x37, flags: 0x0},
- 262: {region: 0x104, script: 0x52, flags: 0x0},
- 263: {region: 0xa0, script: 0x41, flags: 0x0},
- 264: {region: 0x9e, script: 0x52, flags: 0x0},
- 266: {region: 0x51, script: 0x52, flags: 0x0},
- 267: {region: 0x12e, script: 0x37, flags: 0x0},
- 268: {region: 0x12d, script: 0x52, flags: 0x0},
- 269: {region: 0xd9, script: 0x20, flags: 0x0},
- 270: {region: 0x62, script: 0x52, flags: 0x0},
- 271: {region: 0x93, script: 0x52, flags: 0x0},
- 272: {region: 0x93, script: 0x52, flags: 0x0},
- 273: {region: 0x7b, script: 0x29, flags: 0x0},
- 274: {region: 0x134, script: 0x1e, flags: 0x0},
- 275: {region: 0x66, script: 0x52, flags: 0x0},
- 276: {region: 0xc2, script: 0x52, flags: 0x0},
- 277: {region: 0xd4, script: 0x52, flags: 0x0},
- 278: {region: 0xa2, script: 0x52, flags: 0x0},
- 279: {region: 0xc1, script: 0x52, flags: 0x0},
- 280: {region: 0x104, script: 0x1e, flags: 0x0},
- 281: {region: 0xd4, script: 0x52, flags: 0x0},
- 282: {region: 0x161, script: 0x52, flags: 0x0},
- 283: {region: 0x12d, script: 0x52, flags: 0x0},
- 284: {region: 0x121, script: 0xd5, flags: 0x0},
- 285: {region: 0x59, script: 0x52, flags: 0x0},
- 286: {region: 0x51, script: 0x52, flags: 0x0},
- 287: {region: 0x4e, script: 0x52, flags: 0x0},
- 288: {region: 0x97, script: 0x20, flags: 0x0},
- 289: {region: 0x97, script: 0x20, flags: 0x0},
- 290: {region: 0x4a, script: 0x52, flags: 0x0},
- 291: {region: 0x93, script: 0x52, flags: 0x0},
- 292: {region: 0x40, script: 0x52, flags: 0x0},
- 293: {region: 0x97, script: 0x52, flags: 0x0},
- 294: {region: 0x52, script: 0xcc, flags: 0x0},
- 295: {region: 0x97, script: 0x20, flags: 0x0},
- 296: {region: 0xc1, script: 0x52, flags: 0x0},
- 297: {region: 0x97, script: 0x6b, flags: 0x0},
- 298: {region: 0xe6, script: 0x5, flags: 0x0},
- 299: {region: 0xa2, script: 0x52, flags: 0x0},
- 300: {region: 0x129, script: 0x52, flags: 0x0},
- 301: {region: 0xd0, script: 0x52, flags: 0x0},
- 302: {region: 0xad, script: 0x4f, flags: 0x0},
- 303: {region: 0x15, script: 0x6, flags: 0x1},
- 304: {region: 0x51, script: 0x52, flags: 0x0},
- 305: {region: 0x80, script: 0x52, flags: 0x0},
- 306: {region: 0xa2, script: 0x52, flags: 0x0},
- 307: {region: 0xa4, script: 0x46, flags: 0x0},
- 308: {region: 0x29, script: 0x52, flags: 0x0},
- 309: {region: 0x97, script: 0x4a, flags: 0x0},
- 310: {region: 0xa9, script: 0x4b, flags: 0x0},
- 311: {region: 0x104, script: 0x1e, flags: 0x0},
- 312: {region: 0x97, script: 0x20, flags: 0x0},
- 313: {region: 0x73, script: 0x52, flags: 0x0},
- 314: {region: 0xb2, script: 0x52, flags: 0x0},
- 316: {region: 0x104, script: 0x1e, flags: 0x0},
- 317: {region: 0x110, script: 0x52, flags: 0x0},
- 318: {region: 0xe5, script: 0x52, flags: 0x0},
- 319: {region: 0x104, script: 0x52, flags: 0x0},
- 320: {region: 0x97, script: 0x20, flags: 0x0},
- 321: {region: 0x97, script: 0x5, flags: 0x0},
- 322: {region: 0x12d, script: 0x52, flags: 0x0},
- 323: {region: 0x51, script: 0x52, flags: 0x0},
- 324: {region: 0x5f, script: 0x52, flags: 0x0},
- 325: {region: 0x1b, script: 0x3, flags: 0x1},
- 326: {region: 0x104, script: 0x1e, flags: 0x0},
- 327: {region: 0x104, script: 0x1e, flags: 0x0},
- 328: {region: 0x93, script: 0x52, flags: 0x0},
- 329: {region: 0xe6, script: 0x5, flags: 0x0},
- 330: {region: 0x79, script: 0x52, flags: 0x0},
- 331: {region: 0x121, script: 0xd5, flags: 0x0},
- 332: {region: 0xe6, script: 0x5, flags: 0x0},
- 333: {region: 0x1e, script: 0x5, flags: 0x1},
- 334: {region: 0x135, script: 0x52, flags: 0x0},
- 335: {region: 0x85, script: 0x56, flags: 0x0},
- 336: {region: 0x95, script: 0x37, flags: 0x0},
- 337: {region: 0x12d, script: 0x52, flags: 0x0},
- 338: {region: 0xe6, script: 0x5, flags: 0x0},
- 339: {region: 0x12f, script: 0x52, flags: 0x0},
- 340: {region: 0xb5, script: 0x52, flags: 0x0},
- 341: {region: 0x104, script: 0x1e, flags: 0x0},
- 342: {region: 0x93, script: 0x52, flags: 0x0},
- 343: {region: 0x52, script: 0xd5, flags: 0x0},
- 344: {region: 0x97, script: 0x54, flags: 0x0},
- 345: {region: 0x104, script: 0x1e, flags: 0x0},
- 346: {region: 0x12f, script: 0x52, flags: 0x0},
- 347: {region: 0xd7, script: 0x52, flags: 0x0},
- 348: {region: 0x23, script: 0x2, flags: 0x1},
- 349: {region: 0x9c, script: 0x52, flags: 0x0},
- 350: {region: 0x52, script: 0x58, flags: 0x0},
- 351: {region: 0x93, script: 0x52, flags: 0x0},
- 352: {region: 0x9a, script: 0x5, flags: 0x0},
- 353: {region: 0x132, script: 0x52, flags: 0x0},
- 354: {region: 0x97, script: 0xd0, flags: 0x0},
- 355: {region: 0x9c, script: 0x52, flags: 0x0},
- 356: {region: 0x4a, script: 0x52, flags: 0x0},
- 357: {region: 0xad, script: 0x4f, flags: 0x0},
- 358: {region: 0x4a, script: 0x52, flags: 0x0},
- 359: {region: 0x15f, script: 0x52, flags: 0x0},
- 360: {region: 0x9a, script: 0x5, flags: 0x0},
- 361: {region: 0xb4, script: 0x52, flags: 0x0},
- 362: {region: 0xb6, script: 0x52, flags: 0x0},
- 363: {region: 0x4a, script: 0x52, flags: 0x0},
- 364: {region: 0x4a, script: 0x52, flags: 0x0},
- 365: {region: 0xa2, script: 0x52, flags: 0x0},
- 366: {region: 0xa2, script: 0x52, flags: 0x0},
- 367: {region: 0x9a, script: 0x5, flags: 0x0},
- 368: {region: 0xb6, script: 0x52, flags: 0x0},
- 369: {region: 0x121, script: 0xd5, flags: 0x0},
- 370: {region: 0x52, script: 0x34, flags: 0x0},
- 371: {region: 0x129, script: 0x52, flags: 0x0},
- 372: {region: 0x93, script: 0x52, flags: 0x0},
- 373: {region: 0x51, script: 0x52, flags: 0x0},
- 374: {region: 0x97, script: 0x20, flags: 0x0},
- 375: {region: 0x97, script: 0x20, flags: 0x0},
- 376: {region: 0x93, script: 0x52, flags: 0x0},
- 377: {region: 0x25, script: 0x3, flags: 0x1},
- 378: {region: 0xa2, script: 0x52, flags: 0x0},
- 379: {region: 0xcd, script: 0x52, flags: 0x0},
- 380: {region: 0x104, script: 0x1e, flags: 0x0},
- 381: {region: 0xe5, script: 0x52, flags: 0x0},
- 382: {region: 0x93, script: 0x52, flags: 0x0},
- 383: {region: 0x110, script: 0x52, flags: 0x0},
- 384: {region: 0xa2, script: 0x52, flags: 0x0},
- 385: {region: 0x121, script: 0x5, flags: 0x0},
- 386: {region: 0xca, script: 0x52, flags: 0x0},
- 387: {region: 0xbd, script: 0x52, flags: 0x0},
- 388: {region: 0xcf, script: 0x52, flags: 0x0},
- 389: {region: 0x51, script: 0x52, flags: 0x0},
- 390: {region: 0xd9, script: 0x20, flags: 0x0},
- 391: {region: 0x12d, script: 0x52, flags: 0x0},
- 392: {region: 0xbe, script: 0x52, flags: 0x0},
- 393: {region: 0xde, script: 0x52, flags: 0x0},
- 394: {region: 0x93, script: 0x52, flags: 0x0},
- 395: {region: 0x99, script: 0x36, flags: 0x0},
- 396: {region: 0xc0, script: 0x1e, flags: 0x0},
- 397: {region: 0x97, script: 0x64, flags: 0x0},
- 398: {region: 0x109, script: 0x52, flags: 0x0},
- 399: {region: 0x28, script: 0x3, flags: 0x1},
- 400: {region: 0x97, script: 0xe, flags: 0x0},
- 401: {region: 0xc2, script: 0x6b, flags: 0x0},
- 403: {region: 0x48, script: 0x52, flags: 0x0},
- 404: {region: 0x48, script: 0x52, flags: 0x0},
- 405: {region: 0x36, script: 0x52, flags: 0x0},
- 406: {region: 0x97, script: 0x20, flags: 0x0},
- 407: {region: 0xd9, script: 0x20, flags: 0x0},
- 408: {region: 0x104, script: 0x1e, flags: 0x0},
- 409: {region: 0x34, script: 0x68, flags: 0x0},
- 410: {region: 0x2b, script: 0x3, flags: 0x1},
- 411: {region: 0xc9, script: 0x52, flags: 0x0},
- 412: {region: 0x97, script: 0x20, flags: 0x0},
- 413: {region: 0x51, script: 0x52, flags: 0x0},
- 415: {region: 0x132, script: 0x52, flags: 0x0},
- 416: {region: 0xe6, script: 0x5, flags: 0x0},
- 417: {region: 0xc1, script: 0x52, flags: 0x0},
- 418: {region: 0x97, script: 0x20, flags: 0x0},
- 419: {region: 0x93, script: 0x52, flags: 0x0},
- 420: {region: 0x161, script: 0x52, flags: 0x0},
- 421: {region: 0xc2, script: 0x6b, flags: 0x0},
- 422: {region: 0x104, script: 0x1e, flags: 0x0},
- 423: {region: 0x12f, script: 0x52, flags: 0x0},
- 424: {region: 0x9a, script: 0x5d, flags: 0x0},
- 425: {region: 0x9a, script: 0x5, flags: 0x0},
- 426: {region: 0xdb, script: 0x52, flags: 0x0},
- 428: {region: 0x52, script: 0x34, flags: 0x0},
- 429: {region: 0x9c, script: 0x52, flags: 0x0},
- 430: {region: 0xd0, script: 0x52, flags: 0x0},
- 431: {region: 0xd8, script: 0x52, flags: 0x0},
- 432: {region: 0xcd, script: 0x52, flags: 0x0},
- 433: {region: 0x161, script: 0x52, flags: 0x0},
- 434: {region: 0xcf, script: 0x52, flags: 0x0},
- 435: {region: 0x5f, script: 0x52, flags: 0x0},
- 436: {region: 0xd9, script: 0x20, flags: 0x0},
- 437: {region: 0xd9, script: 0x20, flags: 0x0},
- 438: {region: 0xd0, script: 0x52, flags: 0x0},
- 439: {region: 0xcf, script: 0x52, flags: 0x0},
- 440: {region: 0xcd, script: 0x52, flags: 0x0},
- 441: {region: 0xcd, script: 0x52, flags: 0x0},
- 442: {region: 0x93, script: 0x52, flags: 0x0},
- 443: {region: 0xdd, script: 0x52, flags: 0x0},
- 444: {region: 0x97, script: 0x52, flags: 0x0},
- 445: {region: 0xd7, script: 0x52, flags: 0x0},
- 446: {region: 0x51, script: 0x52, flags: 0x0},
- 447: {region: 0xd8, script: 0x52, flags: 0x0},
- 448: {region: 0x51, script: 0x52, flags: 0x0},
- 449: {region: 0xd8, script: 0x52, flags: 0x0},
- 450: {region: 0x121, script: 0x4e, flags: 0x0},
- 451: {region: 0x97, script: 0x20, flags: 0x0},
- 452: {region: 0x10a, script: 0xb7, flags: 0x0},
- 453: {region: 0x82, script: 0x70, flags: 0x0},
- 454: {region: 0x15e, script: 0x52, flags: 0x0},
- 455: {region: 0x48, script: 0x17, flags: 0x0},
- 456: {region: 0x15e, script: 0x52, flags: 0x0},
- 457: {region: 0x115, script: 0x52, flags: 0x0},
- 458: {region: 0x132, script: 0x52, flags: 0x0},
- 459: {region: 0x52, script: 0x52, flags: 0x0},
- 460: {region: 0xcc, script: 0x52, flags: 0x0},
- 461: {region: 0x12d, script: 0x52, flags: 0x0},
- 462: {region: 0x12f, script: 0x52, flags: 0x0},
- 463: {region: 0x7e, script: 0x52, flags: 0x0},
- 464: {region: 0x76, script: 0x52, flags: 0x0},
- 466: {region: 0x6e, script: 0x52, flags: 0x0},
- 467: {region: 0x97, script: 0x75, flags: 0x0},
- 468: {region: 0x7b, script: 0x1e, flags: 0x0},
- 469: {region: 0x132, script: 0x76, flags: 0x0},
- 470: {region: 0xc3, script: 0x74, flags: 0x0},
- 471: {region: 0x2e, script: 0x3, flags: 0x1},
- 472: {region: 0xe5, script: 0x52, flags: 0x0},
- 473: {region: 0x31, script: 0x2, flags: 0x1},
- 474: {region: 0xe5, script: 0x52, flags: 0x0},
- 475: {region: 0x2f, script: 0x52, flags: 0x0},
- 476: {region: 0xee, script: 0x52, flags: 0x0},
- 477: {region: 0x76, script: 0x52, flags: 0x0},
- 478: {region: 0xd4, script: 0x52, flags: 0x0},
- 479: {region: 0x132, script: 0x52, flags: 0x0},
- 480: {region: 0x48, script: 0x52, flags: 0x0},
- 481: {region: 0x9a, script: 0xdd, flags: 0x0},
- 482: {region: 0x5f, script: 0x52, flags: 0x0},
- 483: {region: 0xae, script: 0x7f, flags: 0x0},
- 485: {region: 0x97, script: 0x12, flags: 0x0},
- 486: {region: 0xa2, script: 0x52, flags: 0x0},
- 487: {region: 0xe7, script: 0x52, flags: 0x0},
- 488: {region: 0x9c, script: 0x52, flags: 0x0},
- 489: {region: 0x85, script: 0x2d, flags: 0x0},
- 490: {region: 0x73, script: 0x52, flags: 0x0},
- 491: {region: 0xe6, script: 0x45, flags: 0x0},
- 492: {region: 0x9a, script: 0x5, flags: 0x0},
- 493: {region: 0x1, script: 0x52, flags: 0x0},
- 494: {region: 0x23, script: 0x5, flags: 0x0},
- 495: {region: 0x40, script: 0x52, flags: 0x0},
- 496: {region: 0x78, script: 0x52, flags: 0x0},
- 497: {region: 0xe2, script: 0x52, flags: 0x0},
- 498: {region: 0x87, script: 0x52, flags: 0x0},
- 499: {region: 0x68, script: 0x52, flags: 0x0},
- 500: {region: 0x97, script: 0x20, flags: 0x0},
- 501: {region: 0x100, script: 0x52, flags: 0x0},
- 502: {region: 0x93, script: 0x52, flags: 0x0},
- 503: {region: 0x9c, script: 0x52, flags: 0x0},
- 504: {region: 0x97, script: 0x52, flags: 0x0},
- 505: {region: 0x33, script: 0x2, flags: 0x1},
- 506: {region: 0xd9, script: 0x20, flags: 0x0},
- 507: {region: 0x34, script: 0xe, flags: 0x0},
- 508: {region: 0x4d, script: 0x52, flags: 0x0},
- 509: {region: 0x70, script: 0x52, flags: 0x0},
- 510: {region: 0x4d, script: 0x52, flags: 0x0},
- 511: {region: 0x9a, script: 0x5, flags: 0x0},
- 512: {region: 0x10a, script: 0x52, flags: 0x0},
- 513: {region: 0x39, script: 0x52, flags: 0x0},
- 514: {region: 0xcf, script: 0x52, flags: 0x0},
- 515: {region: 0x102, script: 0x52, flags: 0x0},
- 516: {region: 0x93, script: 0x52, flags: 0x0},
- 517: {region: 0x12d, script: 0x52, flags: 0x0},
- 518: {region: 0x71, script: 0x52, flags: 0x0},
- 519: {region: 0x104, script: 0x1e, flags: 0x0},
- 520: {region: 0x12e, script: 0x1e, flags: 0x0},
- 521: {region: 0x107, script: 0x52, flags: 0x0},
- 522: {region: 0x105, script: 0x52, flags: 0x0},
- 523: {region: 0x12d, script: 0x52, flags: 0x0},
- 524: {region: 0xa0, script: 0x44, flags: 0x0},
- 525: {region: 0x97, script: 0x20, flags: 0x0},
- 526: {region: 0x7e, script: 0x52, flags: 0x0},
- 527: {region: 0x104, script: 0x1e, flags: 0x0},
- 528: {region: 0xa2, script: 0x52, flags: 0x0},
- 529: {region: 0x93, script: 0x52, flags: 0x0},
- 530: {region: 0x97, script: 0x52, flags: 0x0},
- 531: {region: 0x97, script: 0xbb, flags: 0x0},
- 532: {region: 0x12d, script: 0x52, flags: 0x0},
- 533: {region: 0x9c, script: 0x52, flags: 0x0},
- 534: {region: 0x97, script: 0x20, flags: 0x0},
- 535: {region: 0x9c, script: 0x52, flags: 0x0},
- 536: {region: 0x79, script: 0x52, flags: 0x0},
- 537: {region: 0x48, script: 0x52, flags: 0x0},
- 538: {region: 0x35, script: 0x4, flags: 0x1},
- 539: {region: 0x9c, script: 0x52, flags: 0x0},
- 540: {region: 0x9a, script: 0x5, flags: 0x0},
- 541: {region: 0xd8, script: 0x52, flags: 0x0},
- 542: {region: 0x4e, script: 0x52, flags: 0x0},
- 543: {region: 0xcf, script: 0x52, flags: 0x0},
- 544: {region: 0xcd, script: 0x52, flags: 0x0},
- 545: {region: 0xc1, script: 0x52, flags: 0x0},
- 546: {region: 0x4b, script: 0x52, flags: 0x0},
- 547: {region: 0x94, script: 0x72, flags: 0x0},
- 548: {region: 0xb4, script: 0x52, flags: 0x0},
- 550: {region: 0xb8, script: 0xd2, flags: 0x0},
- 551: {region: 0xc2, script: 0x6b, flags: 0x0},
- 552: {region: 0xb1, script: 0xc1, flags: 0x0},
- 553: {region: 0x6e, script: 0x52, flags: 0x0},
- 554: {region: 0x10f, script: 0x52, flags: 0x0},
- 555: {region: 0xe6, script: 0x5, flags: 0x0},
- 556: {region: 0x10d, script: 0x52, flags: 0x0},
- 557: {region: 0xe7, script: 0x52, flags: 0x0},
- 558: {region: 0x93, script: 0x52, flags: 0x0},
- 559: {region: 0x13f, script: 0x52, flags: 0x0},
- 560: {region: 0x10a, script: 0x52, flags: 0x0},
- 562: {region: 0x10a, script: 0x52, flags: 0x0},
- 563: {region: 0x70, script: 0x52, flags: 0x0},
- 564: {region: 0x95, script: 0xb8, flags: 0x0},
- 565: {region: 0x70, script: 0x52, flags: 0x0},
- 566: {region: 0x161, script: 0x52, flags: 0x0},
- 567: {region: 0xc1, script: 0x52, flags: 0x0},
- 568: {region: 0x113, script: 0x52, flags: 0x0},
- 569: {region: 0x121, script: 0xd5, flags: 0x0},
- 570: {region: 0x26, script: 0x52, flags: 0x0},
- 571: {region: 0x39, script: 0x5, flags: 0x1},
- 572: {region: 0x97, script: 0xc2, flags: 0x0},
- 573: {region: 0x114, script: 0x52, flags: 0x0},
- 574: {region: 0x112, script: 0x52, flags: 0x0},
- 575: {region: 0x97, script: 0x20, flags: 0x0},
- 576: {region: 0x15e, script: 0x52, flags: 0x0},
- 577: {region: 0x6c, script: 0x52, flags: 0x0},
- 578: {region: 0x15e, script: 0x52, flags: 0x0},
- 579: {region: 0x5f, script: 0x52, flags: 0x0},
- 580: {region: 0x93, script: 0x52, flags: 0x0},
- 581: {region: 0x12d, script: 0x52, flags: 0x0},
- 582: {region: 0x82, script: 0x52, flags: 0x0},
- 583: {region: 0x10a, script: 0x52, flags: 0x0},
- 584: {region: 0x12d, script: 0x52, flags: 0x0},
- 585: {region: 0x15c, script: 0x5, flags: 0x0},
- 586: {region: 0x4a, script: 0x52, flags: 0x0},
- 587: {region: 0x5f, script: 0x52, flags: 0x0},
- 588: {region: 0x97, script: 0x20, flags: 0x0},
- 589: {region: 0x93, script: 0x52, flags: 0x0},
- 590: {region: 0x34, script: 0xe, flags: 0x0},
- 591: {region: 0x99, script: 0xc5, flags: 0x0},
- 592: {region: 0xe7, script: 0x52, flags: 0x0},
- 593: {region: 0x97, script: 0xcd, flags: 0x0},
- 594: {region: 0xd9, script: 0x20, flags: 0x0},
- 595: {region: 0xe5, script: 0x52, flags: 0x0},
- 596: {region: 0x97, script: 0x4a, flags: 0x0},
- 597: {region: 0x52, script: 0xcb, flags: 0x0},
- 598: {region: 0xd9, script: 0x20, flags: 0x0},
- 599: {region: 0xd9, script: 0x20, flags: 0x0},
- 600: {region: 0x97, script: 0xd0, flags: 0x0},
- 601: {region: 0x110, script: 0x52, flags: 0x0},
- 602: {region: 0x12f, script: 0x52, flags: 0x0},
- 603: {region: 0x124, script: 0x52, flags: 0x0},
- 604: {region: 0x3e, script: 0x3, flags: 0x1},
- 605: {region: 0x121, script: 0xd5, flags: 0x0},
- 606: {region: 0xd9, script: 0x20, flags: 0x0},
- 607: {region: 0xd9, script: 0x20, flags: 0x0},
- 608: {region: 0xd9, script: 0x20, flags: 0x0},
- 609: {region: 0x6e, script: 0x27, flags: 0x0},
- 610: {region: 0x6c, script: 0x27, flags: 0x0},
- 611: {region: 0xd4, script: 0x52, flags: 0x0},
- 612: {region: 0x125, script: 0x52, flags: 0x0},
- 613: {region: 0x123, script: 0x52, flags: 0x0},
- 614: {region: 0x31, script: 0x52, flags: 0x0},
- 615: {region: 0xd9, script: 0x20, flags: 0x0},
- 616: {region: 0xe5, script: 0x52, flags: 0x0},
- 617: {region: 0x31, script: 0x52, flags: 0x0},
- 618: {region: 0xd2, script: 0x52, flags: 0x0},
- 619: {region: 0x15e, script: 0x52, flags: 0x0},
- 620: {region: 0x127, script: 0x52, flags: 0x0},
- 621: {region: 0xcc, script: 0x52, flags: 0x0},
- 622: {region: 0xe4, script: 0x52, flags: 0x0},
- 623: {region: 0x129, script: 0x52, flags: 0x0},
- 624: {region: 0x129, script: 0x52, flags: 0x0},
- 625: {region: 0x12c, script: 0x52, flags: 0x0},
- 626: {region: 0x15e, script: 0x52, flags: 0x0},
- 627: {region: 0x85, script: 0x2d, flags: 0x0},
- 628: {region: 0xd9, script: 0x20, flags: 0x0},
- 629: {region: 0xe5, script: 0x52, flags: 0x0},
- 630: {region: 0x42, script: 0xd6, flags: 0x0},
- 631: {region: 0x104, script: 0x1e, flags: 0x0},
- 632: {region: 0x12f, script: 0x52, flags: 0x0},
- 633: {region: 0x121, script: 0xd5, flags: 0x0},
- 634: {region: 0x31, script: 0x52, flags: 0x0},
- 635: {region: 0xcc, script: 0x52, flags: 0x0},
- 636: {region: 0x12b, script: 0x52, flags: 0x0},
- 638: {region: 0xd2, script: 0x52, flags: 0x0},
- 639: {region: 0x52, script: 0xce, flags: 0x0},
- 640: {region: 0xe3, script: 0x52, flags: 0x0},
- 641: {region: 0x104, script: 0x1e, flags: 0x0},
- 642: {region: 0xb8, script: 0x52, flags: 0x0},
- 643: {region: 0x104, script: 0x1e, flags: 0x0},
- 644: {region: 0x41, script: 0x4, flags: 0x1},
- 645: {region: 0x11a, script: 0xd8, flags: 0x0},
- 646: {region: 0x12e, script: 0x1e, flags: 0x0},
- 647: {region: 0x73, script: 0x52, flags: 0x0},
- 648: {region: 0x29, script: 0x52, flags: 0x0},
- 650: {region: 0x45, script: 0x3, flags: 0x1},
- 651: {region: 0x97, script: 0xe, flags: 0x0},
- 652: {region: 0xe6, script: 0x5, flags: 0x0},
- 653: {region: 0x48, script: 0x4, flags: 0x1},
- 654: {region: 0xb2, script: 0xd9, flags: 0x0},
- 655: {region: 0x15e, script: 0x52, flags: 0x0},
- 656: {region: 0x9c, script: 0x52, flags: 0x0},
- 657: {region: 0x104, script: 0x52, flags: 0x0},
- 658: {region: 0x13b, script: 0x52, flags: 0x0},
- 659: {region: 0x119, script: 0x52, flags: 0x0},
- 660: {region: 0x35, script: 0x52, flags: 0x0},
- 661: {region: 0x5f, script: 0x52, flags: 0x0},
- 662: {region: 0xcf, script: 0x52, flags: 0x0},
- 663: {region: 0x1, script: 0x52, flags: 0x0},
- 664: {region: 0x104, script: 0x52, flags: 0x0},
- 665: {region: 0x69, script: 0x52, flags: 0x0},
- 666: {region: 0x12d, script: 0x52, flags: 0x0},
- 667: {region: 0x35, script: 0x52, flags: 0x0},
- 668: {region: 0x4d, script: 0x52, flags: 0x0},
- 669: {region: 0x6e, script: 0x27, flags: 0x0},
- 670: {region: 0xe5, script: 0x52, flags: 0x0},
- 671: {region: 0x2e, script: 0x52, flags: 0x0},
- 672: {region: 0x97, script: 0xd0, flags: 0x0},
- 673: {region: 0x97, script: 0x20, flags: 0x0},
- 674: {region: 0x13d, script: 0x52, flags: 0x0},
- 675: {region: 0xa6, script: 0x5, flags: 0x0},
- 676: {region: 0x112, script: 0x52, flags: 0x0},
- 677: {region: 0x97, script: 0x20, flags: 0x0},
- 678: {region: 0x52, script: 0x34, flags: 0x0},
- 679: {region: 0x40, script: 0x52, flags: 0x0},
- 680: {region: 0x129, script: 0x18, flags: 0x0},
- 681: {region: 0x15e, script: 0x52, flags: 0x0},
- 682: {region: 0x129, script: 0x5a, flags: 0x0},
- 683: {region: 0x129, script: 0x5b, flags: 0x0},
- 684: {region: 0x7b, script: 0x29, flags: 0x0},
- 685: {region: 0x52, script: 0x5e, flags: 0x0},
- 686: {region: 0x109, script: 0x62, flags: 0x0},
- 687: {region: 0x106, script: 0x6c, flags: 0x0},
- 688: {region: 0x97, script: 0x20, flags: 0x0},
- 689: {region: 0x12f, script: 0x52, flags: 0x0},
- 690: {region: 0x9a, script: 0x82, flags: 0x0},
- 691: {region: 0x15b, script: 0xba, flags: 0x0},
- 692: {region: 0xd9, script: 0x20, flags: 0x0},
- 693: {region: 0xcf, script: 0x52, flags: 0x0},
- 694: {region: 0x73, script: 0x52, flags: 0x0},
- 695: {region: 0x51, script: 0x52, flags: 0x0},
- 696: {region: 0x51, script: 0x52, flags: 0x0},
- 697: {region: 0x1, script: 0x37, flags: 0x0},
- 698: {region: 0xd4, script: 0x52, flags: 0x0},
- 699: {region: 0x40, script: 0x52, flags: 0x0},
- 700: {region: 0xcd, script: 0x52, flags: 0x0},
- 701: {region: 0x4c, script: 0x3, flags: 0x1},
- 702: {region: 0x52, script: 0x52, flags: 0x0},
- 703: {region: 0x109, script: 0x52, flags: 0x0},
- 705: {region: 0xa6, script: 0x5, flags: 0x0},
- 706: {region: 0xd7, script: 0x52, flags: 0x0},
- 707: {region: 0xb8, script: 0xd2, flags: 0x0},
- 708: {region: 0x4f, script: 0x14, flags: 0x1},
- 709: {region: 0xce, script: 0x52, flags: 0x0},
- 710: {region: 0x15e, script: 0x52, flags: 0x0},
- 712: {region: 0x129, script: 0x52, flags: 0x0},
-}
-
-// likelyLangList holds lists info associated with likelyLang.
-// Size: 396 bytes, 99 elements
-var likelyLangList = [99]likelyScriptRegion{
- 0: {region: 0x9a, script: 0x7, flags: 0x0},
- 1: {region: 0x9f, script: 0x6d, flags: 0x2},
- 2: {region: 0x11a, script: 0x78, flags: 0x2},
- 3: {region: 0x31, script: 0x52, flags: 0x0},
- 4: {region: 0x99, script: 0x5, flags: 0x4},
- 5: {region: 0x9a, script: 0x5, flags: 0x4},
- 6: {region: 0x104, script: 0x1e, flags: 0x4},
- 7: {region: 0x9a, script: 0x5, flags: 0x2},
- 8: {region: 0x97, script: 0xe, flags: 0x0},
- 9: {region: 0x34, script: 0x16, flags: 0x2},
- 10: {region: 0x104, script: 0x1e, flags: 0x0},
- 11: {region: 0x37, script: 0x2a, flags: 0x2},
- 12: {region: 0x132, script: 0x52, flags: 0x0},
- 13: {region: 0x79, script: 0xbd, flags: 0x2},
- 14: {region: 0x112, script: 0x52, flags: 0x0},
- 15: {region: 0x82, script: 0x1, flags: 0x2},
- 16: {region: 0x5c, script: 0x1d, flags: 0x0},
- 17: {region: 0x85, script: 0x57, flags: 0x2},
- 18: {region: 0xd4, script: 0x52, flags: 0x0},
- 19: {region: 0x51, script: 0x5, flags: 0x4},
- 20: {region: 0x109, script: 0x5, flags: 0x4},
- 21: {region: 0xac, script: 0x1e, flags: 0x0},
- 22: {region: 0x23, script: 0x5, flags: 0x4},
- 23: {region: 0x52, script: 0x5, flags: 0x4},
- 24: {region: 0x9a, script: 0x5, flags: 0x4},
- 25: {region: 0xc3, script: 0x5, flags: 0x4},
- 26: {region: 0x52, script: 0x5, flags: 0x2},
- 27: {region: 0x129, script: 0x52, flags: 0x0},
- 28: {region: 0xae, script: 0x5, flags: 0x4},
- 29: {region: 0x99, script: 0x5, flags: 0x2},
- 30: {region: 0xa3, script: 0x1e, flags: 0x0},
- 31: {region: 0x52, script: 0x5, flags: 0x4},
- 32: {region: 0x129, script: 0x52, flags: 0x4},
- 33: {region: 0x52, script: 0x5, flags: 0x2},
- 34: {region: 0x129, script: 0x52, flags: 0x2},
- 35: {region: 0xd9, script: 0x20, flags: 0x0},
- 36: {region: 0x97, script: 0x55, flags: 0x2},
- 37: {region: 0x81, script: 0x52, flags: 0x0},
- 38: {region: 0x82, script: 0x70, flags: 0x4},
- 39: {region: 0x82, script: 0x70, flags: 0x2},
- 40: {region: 0xc3, script: 0x1e, flags: 0x0},
- 41: {region: 0x52, script: 0x66, flags: 0x4},
- 42: {region: 0x52, script: 0x66, flags: 0x2},
- 43: {region: 0xce, script: 0x52, flags: 0x0},
- 44: {region: 0x49, script: 0x5, flags: 0x4},
- 45: {region: 0x93, script: 0x5, flags: 0x4},
- 46: {region: 0x97, script: 0x2f, flags: 0x0},
- 47: {region: 0xe6, script: 0x5, flags: 0x4},
- 48: {region: 0xe6, script: 0x5, flags: 0x2},
- 49: {region: 0x9a, script: 0x7c, flags: 0x0},
- 50: {region: 0x52, script: 0x7d, flags: 0x2},
- 51: {region: 0xb8, script: 0xd2, flags: 0x0},
- 52: {region: 0xd7, script: 0x52, flags: 0x4},
- 53: {region: 0xe6, script: 0x5, flags: 0x0},
- 54: {region: 0x97, script: 0x20, flags: 0x2},
- 55: {region: 0x97, script: 0x47, flags: 0x2},
- 56: {region: 0x97, script: 0xc0, flags: 0x2},
- 57: {region: 0x103, script: 0x1e, flags: 0x0},
- 58: {region: 0xbb, script: 0x52, flags: 0x4},
- 59: {region: 0x102, script: 0x52, flags: 0x4},
- 60: {region: 0x104, script: 0x52, flags: 0x4},
- 61: {region: 0x129, script: 0x52, flags: 0x4},
- 62: {region: 0x122, script: 0x1e, flags: 0x0},
- 63: {region: 0xe6, script: 0x5, flags: 0x4},
- 64: {region: 0xe6, script: 0x5, flags: 0x2},
- 65: {region: 0x52, script: 0x5, flags: 0x0},
- 66: {region: 0xac, script: 0x1e, flags: 0x4},
- 67: {region: 0xc3, script: 0x1e, flags: 0x4},
- 68: {region: 0xac, script: 0x1e, flags: 0x2},
- 69: {region: 0x97, script: 0xe, flags: 0x0},
- 70: {region: 0xd9, script: 0x20, flags: 0x4},
- 71: {region: 0xd9, script: 0x20, flags: 0x2},
- 72: {region: 0x134, script: 0x52, flags: 0x0},
- 73: {region: 0x23, script: 0x5, flags: 0x4},
- 74: {region: 0x52, script: 0x1e, flags: 0x4},
- 75: {region: 0x23, script: 0x5, flags: 0x2},
- 76: {region: 0x8b, script: 0x35, flags: 0x0},
- 77: {region: 0x52, script: 0x34, flags: 0x4},
- 78: {region: 0x52, script: 0x34, flags: 0x2},
- 79: {region: 0x52, script: 0x34, flags: 0x0},
- 80: {region: 0x2e, script: 0x35, flags: 0x4},
- 81: {region: 0x3d, script: 0x35, flags: 0x4},
- 82: {region: 0x79, script: 0x35, flags: 0x4},
- 83: {region: 0x7c, script: 0x35, flags: 0x4},
- 84: {region: 0x8b, script: 0x35, flags: 0x4},
- 85: {region: 0x93, script: 0x35, flags: 0x4},
- 86: {region: 0xc4, script: 0x35, flags: 0x4},
- 87: {region: 0xce, script: 0x35, flags: 0x4},
- 88: {region: 0xe0, script: 0x35, flags: 0x4},
- 89: {region: 0xe3, script: 0x35, flags: 0x4},
- 90: {region: 0xe5, script: 0x35, flags: 0x4},
- 91: {region: 0x114, script: 0x35, flags: 0x4},
- 92: {region: 0x121, script: 0x35, flags: 0x4},
- 93: {region: 0x12c, script: 0x35, flags: 0x4},
- 94: {region: 0x132, script: 0x35, flags: 0x4},
- 95: {region: 0x13b, script: 0x35, flags: 0x4},
- 96: {region: 0x12c, script: 0x11, flags: 0x2},
- 97: {region: 0x12c, script: 0x30, flags: 0x2},
- 98: {region: 0x12c, script: 0x35, flags: 0x2},
-}
-
-type likelyLangScript struct {
- lang uint16
- script uint8
- flags uint8
-}
-
-// likelyRegion is a lookup table, indexed by regionID, for the most likely
-// languages and scripts given incomplete information. If more entries exist
-// for a given regionID, lang and script are the index and size respectively
-// of the list in likelyRegionList.
-// TODO: exclude containers and user-definable regions from the list.
-// Size: 1420 bytes, 355 elements
-var likelyRegion = [355]likelyLangScript{
- 33: {lang: 0x61, script: 0x52, flags: 0x0},
- 34: {lang: 0x15, script: 0x5, flags: 0x0},
- 35: {lang: 0x0, script: 0x2, flags: 0x1},
- 38: {lang: 0x2, script: 0x2, flags: 0x1},
- 39: {lang: 0x4, script: 0x2, flags: 0x1},
- 41: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 42: {lang: 0x0, script: 0x52, flags: 0x0},
- 43: {lang: 0x9d, script: 0x52, flags: 0x0},
- 44: {lang: 0x22f, script: 0x52, flags: 0x0},
- 45: {lang: 0x85, script: 0x52, flags: 0x0},
- 47: {lang: 0x1bd, script: 0x52, flags: 0x0},
- 48: {lang: 0x247, script: 0x52, flags: 0x0},
- 49: {lang: 0x24, script: 0x52, flags: 0x0},
- 50: {lang: 0x6, script: 0x2, flags: 0x1},
- 52: {lang: 0x4b, script: 0xe, flags: 0x0},
- 53: {lang: 0x1bd, script: 0x52, flags: 0x0},
- 54: {lang: 0xaf, script: 0x52, flags: 0x0},
- 55: {lang: 0x38, script: 0x1e, flags: 0x0},
- 56: {lang: 0x15, script: 0x5, flags: 0x0},
- 57: {lang: 0x201, script: 0x52, flags: 0x0},
- 58: {lang: 0xaf, script: 0x52, flags: 0x0},
- 59: {lang: 0xaf, script: 0x52, flags: 0x0},
- 61: {lang: 0x19a, script: 0x52, flags: 0x0},
- 62: {lang: 0x9d, script: 0x52, flags: 0x0},
- 63: {lang: 0x1db, script: 0x52, flags: 0x0},
- 64: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 66: {lang: 0x8, script: 0x2, flags: 0x1},
- 68: {lang: 0x0, script: 0x52, flags: 0x0},
- 70: {lang: 0x2f, script: 0x1e, flags: 0x0},
- 72: {lang: 0x2b9, script: 0x37, flags: 0x2},
- 73: {lang: 0x19a, script: 0x5, flags: 0x2},
- 74: {lang: 0x248, script: 0x52, flags: 0x0},
- 75: {lang: 0xaf, script: 0x52, flags: 0x0},
- 76: {lang: 0xaf, script: 0x52, flags: 0x0},
- 77: {lang: 0x85, script: 0x52, flags: 0x0},
- 78: {lang: 0xaf, script: 0x52, flags: 0x0},
- 80: {lang: 0x9d, script: 0x52, flags: 0x0},
- 81: {lang: 0xaf, script: 0x52, flags: 0x0},
- 82: {lang: 0xa, script: 0x5, flags: 0x1},
- 83: {lang: 0x9d, script: 0x52, flags: 0x0},
- 84: {lang: 0x0, script: 0x52, flags: 0x0},
- 85: {lang: 0x9d, script: 0x52, flags: 0x0},
- 88: {lang: 0x9d, script: 0x52, flags: 0x0},
- 89: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 90: {lang: 0x1db, script: 0x52, flags: 0x0},
- 92: {lang: 0xf, script: 0x2, flags: 0x1},
- 93: {lang: 0x79, script: 0x52, flags: 0x0},
- 95: {lang: 0x85, script: 0x52, flags: 0x0},
- 97: {lang: 0x1, script: 0x52, flags: 0x0},
- 98: {lang: 0x80, script: 0x52, flags: 0x0},
- 100: {lang: 0x9d, script: 0x52, flags: 0x0},
- 102: {lang: 0x11, script: 0x2, flags: 0x1},
- 103: {lang: 0x9d, script: 0x52, flags: 0x0},
- 104: {lang: 0x9d, script: 0x52, flags: 0x0},
- 105: {lang: 0x9f, script: 0x52, flags: 0x0},
- 106: {lang: 0x15, script: 0x5, flags: 0x0},
- 107: {lang: 0x15, script: 0x5, flags: 0x0},
- 108: {lang: 0x261, script: 0x27, flags: 0x0},
- 109: {lang: 0x9d, script: 0x52, flags: 0x0},
- 110: {lang: 0x13, script: 0x2, flags: 0x1},
- 112: {lang: 0xa8, script: 0x52, flags: 0x0},
- 113: {lang: 0xe2, script: 0x20, flags: 0x2},
- 116: {lang: 0xad, script: 0x52, flags: 0x0},
- 118: {lang: 0xaf, script: 0x52, flags: 0x0},
- 120: {lang: 0xaf, script: 0x52, flags: 0x0},
- 121: {lang: 0x15, script: 0x2, flags: 0x1},
- 123: {lang: 0x17, script: 0x3, flags: 0x1},
- 124: {lang: 0xaf, script: 0x52, flags: 0x0},
- 126: {lang: 0xd, script: 0x52, flags: 0x0},
- 128: {lang: 0x131, script: 0x52, flags: 0x0},
- 130: {lang: 0xaf, script: 0x52, flags: 0x0},
- 131: {lang: 0xaf, script: 0x52, flags: 0x0},
- 132: {lang: 0x9d, script: 0x52, flags: 0x0},
- 133: {lang: 0x1a, script: 0x2, flags: 0x1},
- 134: {lang: 0x0, script: 0x52, flags: 0x0},
- 135: {lang: 0x9d, script: 0x52, flags: 0x0},
- 137: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 139: {lang: 0x2c4, script: 0x35, flags: 0x0},
- 140: {lang: 0x0, script: 0x52, flags: 0x0},
- 141: {lang: 0x9d, script: 0x52, flags: 0x0},
- 142: {lang: 0xee, script: 0x52, flags: 0x0},
- 143: {lang: 0xf1, script: 0x52, flags: 0x0},
- 144: {lang: 0xf2, script: 0x52, flags: 0x0},
- 146: {lang: 0x9d, script: 0x52, flags: 0x0},
- 147: {lang: 0x1c, script: 0x2, flags: 0x1},
- 149: {lang: 0xe0, script: 0x37, flags: 0x0},
- 151: {lang: 0x1e, script: 0x3, flags: 0x1},
- 153: {lang: 0x15, script: 0x5, flags: 0x0},
- 154: {lang: 0x21, script: 0x2, flags: 0x1},
- 155: {lang: 0x102, script: 0x52, flags: 0x0},
- 156: {lang: 0x103, script: 0x52, flags: 0x0},
- 159: {lang: 0x15, script: 0x5, flags: 0x0},
- 160: {lang: 0x107, script: 0x41, flags: 0x0},
- 162: {lang: 0x248, script: 0x52, flags: 0x0},
- 163: {lang: 0x14d, script: 0x1e, flags: 0x0},
- 164: {lang: 0x23, script: 0x3, flags: 0x1},
- 166: {lang: 0x26, script: 0x2, flags: 0x1},
- 168: {lang: 0x136, script: 0x4b, flags: 0x0},
- 169: {lang: 0x136, script: 0x4b, flags: 0x0},
- 170: {lang: 0x15, script: 0x5, flags: 0x0},
- 172: {lang: 0x207, script: 0x1e, flags: 0x0},
- 173: {lang: 0x28, script: 0x2, flags: 0x1},
- 174: {lang: 0x15, script: 0x5, flags: 0x0},
- 176: {lang: 0x85, script: 0x52, flags: 0x0},
- 177: {lang: 0x228, script: 0xc1, flags: 0x0},
- 179: {lang: 0x242, script: 0x52, flags: 0x0},
- 180: {lang: 0x169, script: 0x52, flags: 0x0},
- 181: {lang: 0xaf, script: 0x52, flags: 0x0},
- 182: {lang: 0x170, script: 0x52, flags: 0x0},
- 183: {lang: 0x15, script: 0x5, flags: 0x0},
- 184: {lang: 0x2a, script: 0x2, flags: 0x1},
- 185: {lang: 0xaf, script: 0x52, flags: 0x0},
- 186: {lang: 0x2c, script: 0x2, flags: 0x1},
- 187: {lang: 0x23b, script: 0x52, flags: 0x0},
- 188: {lang: 0xaf, script: 0x52, flags: 0x0},
- 189: {lang: 0x183, script: 0x52, flags: 0x0},
- 192: {lang: 0x2e, script: 0x2, flags: 0x1},
- 193: {lang: 0x49, script: 0x52, flags: 0x0},
- 194: {lang: 0x30, script: 0x2, flags: 0x1},
- 195: {lang: 0x32, script: 0x2, flags: 0x1},
- 196: {lang: 0x34, script: 0x2, flags: 0x1},
- 198: {lang: 0xaf, script: 0x52, flags: 0x0},
- 199: {lang: 0x36, script: 0x2, flags: 0x1},
- 201: {lang: 0x19b, script: 0x52, flags: 0x0},
- 202: {lang: 0x38, script: 0x3, flags: 0x1},
- 203: {lang: 0x90, script: 0xd4, flags: 0x0},
- 205: {lang: 0x9d, script: 0x52, flags: 0x0},
- 206: {lang: 0x19a, script: 0x52, flags: 0x0},
- 207: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 208: {lang: 0xa, script: 0x52, flags: 0x0},
- 209: {lang: 0xaf, script: 0x52, flags: 0x0},
- 210: {lang: 0xdc, script: 0x52, flags: 0x0},
- 212: {lang: 0xdc, script: 0x5, flags: 0x2},
- 214: {lang: 0x9d, script: 0x52, flags: 0x0},
- 215: {lang: 0x1bd, script: 0x52, flags: 0x0},
- 216: {lang: 0x1af, script: 0x52, flags: 0x0},
- 217: {lang: 0x1b4, script: 0x20, flags: 0x0},
- 223: {lang: 0x15, script: 0x5, flags: 0x0},
- 224: {lang: 0x9d, script: 0x52, flags: 0x0},
- 226: {lang: 0x9d, script: 0x52, flags: 0x0},
- 227: {lang: 0xaf, script: 0x52, flags: 0x0},
- 228: {lang: 0x26e, script: 0x52, flags: 0x0},
- 229: {lang: 0xaa, script: 0x52, flags: 0x0},
- 230: {lang: 0x3b, script: 0x3, flags: 0x1},
- 231: {lang: 0x3e, script: 0x2, flags: 0x1},
- 232: {lang: 0xaf, script: 0x52, flags: 0x0},
- 234: {lang: 0x9d, script: 0x52, flags: 0x0},
- 235: {lang: 0x15, script: 0x5, flags: 0x0},
- 236: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 238: {lang: 0x1dc, script: 0x52, flags: 0x0},
- 239: {lang: 0xca, script: 0x52, flags: 0x0},
- 241: {lang: 0x15, script: 0x5, flags: 0x0},
- 256: {lang: 0xaf, script: 0x52, flags: 0x0},
- 258: {lang: 0x40, script: 0x2, flags: 0x1},
- 259: {lang: 0x23b, script: 0x1e, flags: 0x0},
- 260: {lang: 0x42, script: 0x2, flags: 0x1},
- 261: {lang: 0x20a, script: 0x52, flags: 0x0},
- 262: {lang: 0x15, script: 0x5, flags: 0x0},
- 264: {lang: 0xaf, script: 0x52, flags: 0x0},
- 265: {lang: 0x15, script: 0x5, flags: 0x0},
- 266: {lang: 0x44, script: 0x2, flags: 0x1},
- 269: {lang: 0x22c, script: 0x52, flags: 0x0},
- 270: {lang: 0x1af, script: 0x52, flags: 0x0},
- 271: {lang: 0x46, script: 0x2, flags: 0x1},
- 273: {lang: 0x103, script: 0x52, flags: 0x0},
- 274: {lang: 0xaf, script: 0x52, flags: 0x0},
- 275: {lang: 0x238, script: 0x52, flags: 0x0},
- 276: {lang: 0x1bd, script: 0x52, flags: 0x0},
- 278: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 280: {lang: 0x9d, script: 0x52, flags: 0x0},
- 282: {lang: 0x48, script: 0x2, flags: 0x1},
- 286: {lang: 0xaf, script: 0x52, flags: 0x0},
- 287: {lang: 0xaf, script: 0x52, flags: 0x0},
- 288: {lang: 0xaf, script: 0x52, flags: 0x0},
- 289: {lang: 0x4a, script: 0x3, flags: 0x1},
- 290: {lang: 0x4d, script: 0x2, flags: 0x1},
- 291: {lang: 0x265, script: 0x52, flags: 0x0},
- 292: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 293: {lang: 0x264, script: 0x52, flags: 0x0},
- 294: {lang: 0x4f, script: 0x2, flags: 0x1},
- 295: {lang: 0x26c, script: 0x52, flags: 0x0},
- 297: {lang: 0x51, script: 0x4, flags: 0x1},
- 299: {lang: 0x27c, script: 0x52, flags: 0x0},
- 300: {lang: 0x55, script: 0x2, flags: 0x1},
- 301: {lang: 0x248, script: 0x52, flags: 0x0},
- 302: {lang: 0x57, script: 0x3, flags: 0x1},
- 303: {lang: 0x248, script: 0x52, flags: 0x0},
- 306: {lang: 0x2b9, script: 0x37, flags: 0x2},
- 307: {lang: 0x9d, script: 0x52, flags: 0x0},
- 308: {lang: 0x28d, script: 0x52, flags: 0x0},
- 309: {lang: 0x103, script: 0x52, flags: 0x0},
- 312: {lang: 0x9d, script: 0x52, flags: 0x0},
- 315: {lang: 0x292, script: 0x52, flags: 0x0},
- 316: {lang: 0x41, script: 0x52, flags: 0x0},
- 317: {lang: 0xaf, script: 0x52, flags: 0x0},
- 319: {lang: 0x22f, script: 0x52, flags: 0x0},
- 330: {lang: 0x5a, script: 0x2, flags: 0x1},
- 347: {lang: 0x15, script: 0x5, flags: 0x0},
- 348: {lang: 0x5c, script: 0x2, flags: 0x1},
- 353: {lang: 0x236, script: 0x52, flags: 0x0},
-}
-
-// likelyRegionList holds lists info associated with likelyRegion.
-// Size: 376 bytes, 94 elements
-var likelyRegionList = [94]likelyLangScript{
- 0: {lang: 0xa4, script: 0x5, flags: 0x0},
- 1: {lang: 0x264, script: 0x52, flags: 0x0},
- 2: {lang: 0x23a, script: 0x52, flags: 0x0},
- 3: {lang: 0x18c, script: 0x1e, flags: 0x0},
- 4: {lang: 0xf3, script: 0x8, flags: 0x0},
- 5: {lang: 0x145, script: 0x52, flags: 0x0},
- 6: {lang: 0x54, script: 0x52, flags: 0x0},
- 7: {lang: 0x23b, script: 0x1e, flags: 0x0},
- 8: {lang: 0x93, script: 0xd6, flags: 0x0},
- 9: {lang: 0x1b4, script: 0x20, flags: 0x0},
- 10: {lang: 0x2c4, script: 0x34, flags: 0x0},
- 11: {lang: 0x284, script: 0x5, flags: 0x0},
- 12: {lang: 0x2bd, script: 0x35, flags: 0x0},
- 13: {lang: 0x2be, script: 0x52, flags: 0x0},
- 14: {lang: 0x157, script: 0xd5, flags: 0x0},
- 15: {lang: 0x9a, script: 0x2d, flags: 0x0},
- 16: {lang: 0x26f, script: 0x52, flags: 0x0},
- 17: {lang: 0x15, script: 0x5, flags: 0x0},
- 18: {lang: 0xaf, script: 0x52, flags: 0x0},
- 19: {lang: 0x11, script: 0x27, flags: 0x0},
- 20: {lang: 0x9b, script: 0x52, flags: 0x0},
- 21: {lang: 0x141, script: 0x5, flags: 0x2},
- 22: {lang: 0x2b9, script: 0x37, flags: 0x2},
- 23: {lang: 0x111, script: 0x29, flags: 0x0},
- 24: {lang: 0x2, script: 0x1e, flags: 0x0},
- 25: {lang: 0x145, script: 0x52, flags: 0x0},
- 26: {lang: 0x9a, script: 0x2d, flags: 0x0},
- 27: {lang: 0x18c, script: 0x1e, flags: 0x0},
- 28: {lang: 0xf8, script: 0x52, flags: 0x0},
- 29: {lang: 0x19a, script: 0x5, flags: 0x0},
- 30: {lang: 0xe1, script: 0x20, flags: 0x0},
- 31: {lang: 0x28c, script: 0x5, flags: 0x0},
- 32: {lang: 0x129, script: 0x6b, flags: 0x0},
- 33: {lang: 0xa4, script: 0x5, flags: 0x0},
- 34: {lang: 0x264, script: 0x52, flags: 0x0},
- 35: {lang: 0x133, script: 0x46, flags: 0x0},
- 36: {lang: 0x6d, script: 0x5, flags: 0x0},
- 37: {lang: 0x11c, script: 0xd5, flags: 0x0},
- 38: {lang: 0x15, script: 0x5, flags: 0x0},
- 39: {lang: 0xaf, script: 0x52, flags: 0x0},
- 40: {lang: 0x165, script: 0x4f, flags: 0x0},
- 41: {lang: 0x11c, script: 0xd5, flags: 0x0},
- 42: {lang: 0x15, script: 0x5, flags: 0x0},
- 43: {lang: 0xaf, script: 0x52, flags: 0x0},
- 44: {lang: 0x203, script: 0x52, flags: 0x0},
- 45: {lang: 0x286, script: 0x1e, flags: 0x0},
- 46: {lang: 0x18c, script: 0x1e, flags: 0x0},
- 47: {lang: 0x23a, script: 0x52, flags: 0x0},
- 48: {lang: 0x1a5, script: 0x6b, flags: 0x0},
- 49: {lang: 0x114, script: 0x52, flags: 0x0},
- 50: {lang: 0x18f, script: 0x1e, flags: 0x0},
- 51: {lang: 0x12f, script: 0x5, flags: 0x0},
- 52: {lang: 0x2c4, script: 0x35, flags: 0x0},
- 53: {lang: 0x1ef, script: 0x52, flags: 0x0},
- 54: {lang: 0x15, script: 0x5, flags: 0x0},
- 55: {lang: 0xaf, script: 0x52, flags: 0x0},
- 56: {lang: 0x182, script: 0x52, flags: 0x0},
- 57: {lang: 0x28c, script: 0x5, flags: 0x0},
- 58: {lang: 0x40, script: 0x20, flags: 0x0},
- 59: {lang: 0x28c, script: 0x5, flags: 0x0},
- 60: {lang: 0x28c, script: 0x5, flags: 0x0},
- 61: {lang: 0x58, script: 0x20, flags: 0x0},
- 62: {lang: 0x1e7, script: 0x52, flags: 0x0},
- 63: {lang: 0x2f, script: 0x1e, flags: 0x0},
- 64: {lang: 0x203, script: 0x52, flags: 0x0},
- 65: {lang: 0x38, script: 0x1e, flags: 0x0},
- 66: {lang: 0x207, script: 0x1e, flags: 0x0},
- 67: {lang: 0x13f, script: 0x52, flags: 0x0},
- 68: {lang: 0x247, script: 0x52, flags: 0x0},
- 69: {lang: 0x2b9, script: 0x37, flags: 0x0},
- 70: {lang: 0x22a, script: 0x52, flags: 0x0},
- 71: {lang: 0x286, script: 0x1e, flags: 0x0},
- 72: {lang: 0x15, script: 0x5, flags: 0x0},
- 73: {lang: 0xaf, script: 0x52, flags: 0x0},
- 74: {lang: 0x25d, script: 0xd5, flags: 0x0},
- 75: {lang: 0x181, script: 0x5, flags: 0x0},
- 76: {lang: 0x191, script: 0x6b, flags: 0x0},
- 77: {lang: 0x25c, script: 0x1e, flags: 0x0},
- 78: {lang: 0xa4, script: 0x5, flags: 0x0},
- 79: {lang: 0x15, script: 0x5, flags: 0x0},
- 80: {lang: 0xaf, script: 0x52, flags: 0x0},
- 81: {lang: 0x26f, script: 0x52, flags: 0x0},
- 82: {lang: 0x24, script: 0x5, flags: 0x0},
- 83: {lang: 0x118, script: 0x1e, flags: 0x0},
- 84: {lang: 0x3b, script: 0x2d, flags: 0x0},
- 85: {lang: 0x2c4, script: 0x35, flags: 0x0},
- 86: {lang: 0x271, script: 0x52, flags: 0x0},
- 87: {lang: 0x286, script: 0x1e, flags: 0x0},
- 88: {lang: 0x2b9, script: 0x37, flags: 0x0},
- 89: {lang: 0x1e7, script: 0x52, flags: 0x0},
- 90: {lang: 0x23a, script: 0x52, flags: 0x0},
- 91: {lang: 0x23b, script: 0x1e, flags: 0x0},
- 92: {lang: 0xaf, script: 0x52, flags: 0x0},
- 93: {lang: 0x249, script: 0x5, flags: 0x0},
-}
-
-type likelyTag struct {
- lang uint16
- region uint16
- script uint8
-}
-
-// Size: 192 bytes, 32 elements
-var likelyRegionGroup = [32]likelyTag{
- 1: {lang: 0x9b, region: 0xd4, script: 0x52},
- 2: {lang: 0x9b, region: 0x132, script: 0x52},
- 3: {lang: 0x1ef, region: 0x40, script: 0x52},
- 4: {lang: 0x9b, region: 0x2e, script: 0x52},
- 5: {lang: 0x9b, region: 0xd4, script: 0x52},
- 6: {lang: 0x9d, region: 0xcd, script: 0x52},
- 7: {lang: 0x248, region: 0x12d, script: 0x52},
- 8: {lang: 0x15, region: 0x6a, script: 0x5},
- 9: {lang: 0x248, region: 0x4a, script: 0x52},
- 10: {lang: 0x9b, region: 0x15e, script: 0x52},
- 11: {lang: 0x9b, region: 0x132, script: 0x52},
- 12: {lang: 0x9b, region: 0x132, script: 0x52},
- 13: {lang: 0x9d, region: 0x58, script: 0x52},
- 14: {lang: 0x2c4, region: 0x52, script: 0x34},
- 15: {lang: 0xe1, region: 0x97, script: 0x20},
- 16: {lang: 0xf8, region: 0x93, script: 0x52},
- 17: {lang: 0x103, region: 0x9c, script: 0x52},
- 18: {lang: 0x9b, region: 0x2e, script: 0x52},
- 19: {lang: 0x9b, region: 0xe4, script: 0x52},
- 20: {lang: 0x9b, region: 0x88, script: 0x52},
- 21: {lang: 0x22f, region: 0x13f, script: 0x52},
- 22: {lang: 0x2c4, region: 0x52, script: 0x34},
- 23: {lang: 0x28d, region: 0x134, script: 0x52},
- 24: {lang: 0x15, region: 0x106, script: 0x5},
- 25: {lang: 0x207, region: 0x104, script: 0x1e},
- 26: {lang: 0x207, region: 0x104, script: 0x1e},
- 27: {lang: 0x9b, region: 0x79, script: 0x52},
- 28: {lang: 0x85, region: 0x5f, script: 0x52},
- 29: {lang: 0x9d, region: 0x1e, script: 0x52},
- 30: {lang: 0x9b, region: 0x98, script: 0x52},
- 31: {lang: 0x9b, region: 0x79, script: 0x52},
-}
-
-type mutualIntelligibility struct {
- want uint16
- have uint16
- conf uint8
- oneway bool
-}
-
-type scriptIntelligibility struct {
- lang uint16
- want uint8
- have uint8
- conf uint8
-}
-
-// matchLang holds pairs of langIDs of base languages that are typically
-// mutually intelligible. Each pair is associated with a confidence and
-// whether the intelligibility goes one or both ways.
-// Size: 708 bytes, 118 elements
-var matchLang = [118]mutualIntelligibility{
- 0: {want: 0x1c1, have: 0x1af, conf: 0x2, oneway: false},
- 1: {want: 0x145, have: 0x6f, conf: 0x2, oneway: false},
- 2: {want: 0xee, have: 0x54, conf: 0x2, oneway: false},
- 3: {want: 0x225, have: 0x54, conf: 0x2, oneway: false},
- 4: {want: 0x23b, have: 0x54, conf: 0x2, oneway: false},
- 5: {want: 0x225, have: 0xee, conf: 0x2, oneway: false},
- 6: {want: 0x23b, have: 0xee, conf: 0x2, oneway: false},
- 7: {want: 0x225, have: 0x23b, conf: 0x2, oneway: false},
- 8: {want: 0x241, have: 0x1, conf: 0x2, oneway: false},
- 9: {want: 0xd2, have: 0x85, conf: 0x2, oneway: true},
- 10: {want: 0x154, have: 0x85, conf: 0x2, oneway: true},
- 11: {want: 0x80, have: 0x1c1, conf: 0x2, oneway: false},
- 12: {want: 0x80, have: 0x1af, conf: 0x2, oneway: false},
- 13: {want: 0x6f, have: 0x145, conf: 0x2, oneway: false},
- 14: {want: 0x2, have: 0x207, conf: 0x2, oneway: true},
- 15: {want: 0x5, have: 0x9b, conf: 0x2, oneway: true},
- 16: {want: 0xa, have: 0x1bd, conf: 0x2, oneway: true},
- 17: {want: 0xd, have: 0x9b, conf: 0x2, oneway: true},
- 18: {want: 0x23, have: 0x9d, conf: 0x2, oneway: true},
- 19: {want: 0x24, have: 0x207, conf: 0x2, oneway: true},
- 20: {want: 0x2f, have: 0x207, conf: 0x2, oneway: true},
- 21: {want: 0x31, have: 0x9b, conf: 0x2, oneway: true},
- 22: {want: 0x3c, have: 0xe1, conf: 0x2, oneway: true},
- 23: {want: 0x4b, have: 0x9b, conf: 0x2, oneway: true},
- 24: {want: 0x50, have: 0xaf, conf: 0x2, oneway: true},
- 25: {want: 0x65, have: 0xaa, conf: 0x2, oneway: true},
- 26: {want: 0x6c, have: 0x9b, conf: 0x2, oneway: true},
- 27: {want: 0x6f, have: 0x15, conf: 0x2, oneway: true},
- 28: {want: 0x70, have: 0xaf, conf: 0x2, oneway: true},
- 29: {want: 0x78, have: 0xaf, conf: 0x2, oneway: true},
- 30: {want: 0x7f, have: 0x9b, conf: 0x2, oneway: true},
- 31: {want: 0x95, have: 0x9b, conf: 0x2, oneway: true},
- 32: {want: 0x9c, have: 0x9b, conf: 0x2, oneway: true},
- 33: {want: 0x9f, have: 0xa8, conf: 0x2, oneway: true},
- 34: {want: 0xa1, have: 0x9d, conf: 0x2, oneway: true},
- 35: {want: 0xad, have: 0x80, conf: 0x2, oneway: true},
- 36: {want: 0xb9, have: 0x1bd, conf: 0x2, oneway: true},
- 37: {want: 0xba, have: 0x9b, conf: 0x2, oneway: true},
- 38: {want: 0xbb, have: 0x9b, conf: 0x2, oneway: true},
- 39: {want: 0xc2, have: 0x9b, conf: 0x2, oneway: true},
- 40: {want: 0xc8, have: 0x9d, conf: 0x2, oneway: true},
- 41: {want: 0xca, have: 0x9d, conf: 0x2, oneway: true},
- 42: {want: 0xd3, have: 0xe1, conf: 0x2, oneway: true},
- 43: {want: 0xdc, have: 0x9b, conf: 0x2, oneway: true},
- 44: {want: 0xde, have: 0x9b, conf: 0x2, oneway: true},
- 45: {want: 0xf1, have: 0xaf, conf: 0x2, oneway: true},
- 46: {want: 0xf3, have: 0x207, conf: 0x2, oneway: true},
- 47: {want: 0xf5, have: 0x9b, conf: 0x2, oneway: true},
- 48: {want: 0xfa, have: 0x9b, conf: 0x2, oneway: true},
- 49: {want: 0x102, have: 0x9b, conf: 0x2, oneway: true},
- 50: {want: 0x10f, have: 0xf8, conf: 0x2, oneway: true},
- 51: {want: 0x111, have: 0x9b, conf: 0x2, oneway: true},
- 52: {want: 0x122, have: 0xaf, conf: 0x2, oneway: true},
- 53: {want: 0x12f, have: 0x207, conf: 0x2, oneway: true},
- 54: {want: 0x133, have: 0x9b, conf: 0x2, oneway: true},
- 55: {want: 0x135, have: 0x9b, conf: 0x2, oneway: true},
- 56: {want: 0x13d, have: 0x9b, conf: 0x2, oneway: true},
- 57: {want: 0x145, have: 0x26f, conf: 0x2, oneway: true},
- 58: {want: 0x14d, have: 0x207, conf: 0x2, oneway: true},
- 59: {want: 0x14e, have: 0x103, conf: 0x2, oneway: true},
- 60: {want: 0x15a, have: 0x9b, conf: 0x2, oneway: true},
- 61: {want: 0x164, have: 0xaf, conf: 0x2, oneway: true},
- 62: {want: 0x165, have: 0x9b, conf: 0x2, oneway: true},
- 63: {want: 0x167, have: 0x9b, conf: 0x2, oneway: true},
- 64: {want: 0x16c, have: 0xaf, conf: 0x2, oneway: true},
- 65: {want: 0x182, have: 0x9b, conf: 0x2, oneway: true},
- 66: {want: 0x183, have: 0xaf, conf: 0x2, oneway: true},
- 67: {want: 0x189, have: 0x9b, conf: 0x2, oneway: true},
- 68: {want: 0x18c, have: 0x38, conf: 0x2, oneway: true},
- 69: {want: 0x18d, have: 0x9b, conf: 0x2, oneway: true},
- 70: {want: 0x18f, have: 0x207, conf: 0x2, oneway: true},
- 71: {want: 0x196, have: 0xe1, conf: 0x2, oneway: true},
- 72: {want: 0x19a, have: 0xf8, conf: 0x2, oneway: true},
- 73: {want: 0x19b, have: 0x9b, conf: 0x2, oneway: true},
- 74: {want: 0x1a5, have: 0x9b, conf: 0x2, oneway: true},
- 75: {want: 0x1b4, have: 0x9b, conf: 0x2, oneway: true},
- 76: {want: 0x1bf, have: 0x1af, conf: 0x2, oneway: false},
- 77: {want: 0x1bf, have: 0x1c1, conf: 0x2, oneway: true},
- 78: {want: 0x1c8, have: 0x9b, conf: 0x2, oneway: true},
- 79: {want: 0x1cc, have: 0x9b, conf: 0x2, oneway: true},
- 80: {want: 0x1ce, have: 0x9b, conf: 0x2, oneway: true},
- 81: {want: 0x1d0, have: 0xaf, conf: 0x2, oneway: true},
- 82: {want: 0x1d2, have: 0x9b, conf: 0x2, oneway: true},
- 83: {want: 0x1d3, have: 0x9b, conf: 0x2, oneway: true},
- 84: {want: 0x1d7, have: 0x9b, conf: 0x2, oneway: true},
- 85: {want: 0x1de, have: 0x9b, conf: 0x2, oneway: true},
- 86: {want: 0x1ee, have: 0x9b, conf: 0x2, oneway: true},
- 87: {want: 0x1f1, have: 0x9d, conf: 0x2, oneway: true},
- 88: {want: 0x1fc, have: 0x85, conf: 0x2, oneway: true},
- 89: {want: 0x201, have: 0x9b, conf: 0x2, oneway: true},
- 90: {want: 0x20a, have: 0xaf, conf: 0x2, oneway: true},
- 91: {want: 0x20d, have: 0xe1, conf: 0x2, oneway: true},
- 92: {want: 0x21a, have: 0x9b, conf: 0x2, oneway: true},
- 93: {want: 0x228, have: 0x9b, conf: 0x2, oneway: true},
- 94: {want: 0x236, have: 0x9b, conf: 0x2, oneway: true},
- 95: {want: 0x238, have: 0x9b, conf: 0x2, oneway: true},
- 96: {want: 0x23a, have: 0x9b, conf: 0x2, oneway: true},
- 97: {want: 0x242, have: 0x9b, conf: 0x2, oneway: true},
- 98: {want: 0x244, have: 0xf8, conf: 0x2, oneway: true},
- 99: {want: 0x248, have: 0x9b, conf: 0x2, oneway: true},
- 100: {want: 0x251, have: 0x9b, conf: 0x2, oneway: true},
- 101: {want: 0x258, have: 0x9b, conf: 0x2, oneway: true},
- 102: {want: 0x25c, have: 0x207, conf: 0x2, oneway: true},
- 103: {want: 0x261, have: 0x9b, conf: 0x2, oneway: true},
- 104: {want: 0x264, have: 0x207, conf: 0x2, oneway: true},
- 105: {want: 0x361a, have: 0x9b, conf: 0x2, oneway: true},
- 106: {want: 0x26b, have: 0x9b, conf: 0x2, oneway: true},
- 107: {want: 0x26c, have: 0x9b, conf: 0x2, oneway: true},
- 108: {want: 0x277, have: 0x207, conf: 0x2, oneway: true},
- 109: {want: 0x27b, have: 0x9b, conf: 0x2, oneway: true},
- 110: {want: 0x284, have: 0x2c4, conf: 0x2, oneway: true},
- 111: {want: 0x28c, have: 0x9b, conf: 0x2, oneway: true},
- 112: {want: 0x28d, have: 0x207, conf: 0x2, oneway: true},
- 113: {want: 0x2a4, have: 0xaf, conf: 0x2, oneway: true},
- 114: {want: 0x2a9, have: 0x9b, conf: 0x2, oneway: true},
- 115: {want: 0x2b9, have: 0x9b, conf: 0x2, oneway: true},
- 116: {want: 0x2ba, have: 0x9b, conf: 0x2, oneway: true},
- 117: {want: 0x2c6, have: 0x9b, conf: 0x2, oneway: true},
-}
-
-// matchScript holds pairs of scriptIDs where readers of one script
-// can typically also read the other. Each is associated with a confidence.
-// Size: 24 bytes, 4 elements
-var matchScript = [4]scriptIntelligibility{
- 0: {lang: 0x23b, want: 0x52, have: 0x1e, conf: 0x2},
- 1: {lang: 0x23b, want: 0x1e, have: 0x52, conf: 0x2},
- 2: {lang: 0x0, want: 0x34, have: 0x35, conf: 0x1},
- 3: {lang: 0x0, want: 0x35, have: 0x34, conf: 0x1},
-}
-
-// Size: 128 bytes, 32 elements
-var regionContainment = [32]uint32{
- 0xffffffff, 0x000007a2, 0x00003044, 0x00000008,
- 0x403c0010, 0x00000020, 0x00000040, 0x00000080,
- 0x00000100, 0x00000200, 0x00000400, 0x2000384c,
- 0x00001000, 0x00002000, 0x00004000, 0x00008000,
- 0x00010000, 0x00020000, 0x00040000, 0x00080000,
- 0x00100000, 0x00200000, 0x01c1c000, 0x00800000,
- 0x01000000, 0x1e020000, 0x04000000, 0x08000000,
- 0x10000000, 0x20002048, 0x40000000, 0x80000000,
-}
-
-// regionInclusion maps region identifiers to sets of regions in regionInclusionBits,
-// where each set holds all groupings that are directly connected in a region
-// containment graph.
-// Size: 355 bytes, 355 elements
-var regionInclusion = [355]uint8{
- // Entry 0 - 3F
- 0x00, 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, 0x20,
- 0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x22, 0x23,
- 0x25, 0x26, 0x21, 0x27, 0x28, 0x29, 0x2a, 0x25,
- 0x2b, 0x23, 0x22, 0x25, 0x24, 0x29, 0x2c, 0x2d,
- 0x23, 0x2e, 0x2c, 0x25, 0x2f, 0x30, 0x27, 0x25,
- // Entry 40 - 7F
- 0x27, 0x25, 0x24, 0x30, 0x21, 0x31, 0x32, 0x33,
- 0x2f, 0x21, 0x26, 0x26, 0x26, 0x34, 0x2c, 0x28,
- 0x27, 0x26, 0x35, 0x27, 0x21, 0x33, 0x22, 0x20,
- 0x25, 0x2c, 0x25, 0x21, 0x36, 0x2d, 0x34, 0x29,
- 0x21, 0x2e, 0x37, 0x25, 0x25, 0x20, 0x38, 0x38,
- 0x27, 0x37, 0x38, 0x38, 0x2e, 0x39, 0x2e, 0x1f,
- 0x37, 0x3a, 0x27, 0x3b, 0x2b, 0x20, 0x29, 0x34,
- 0x26, 0x37, 0x25, 0x23, 0x27, 0x2b, 0x2c, 0x22,
- // Entry 80 - BF
- 0x2f, 0x2c, 0x2c, 0x25, 0x26, 0x39, 0x21, 0x33,
- 0x3b, 0x2c, 0x27, 0x35, 0x21, 0x33, 0x39, 0x25,
- 0x2d, 0x20, 0x38, 0x30, 0x37, 0x23, 0x2b, 0x24,
- 0x21, 0x23, 0x24, 0x2b, 0x39, 0x2b, 0x25, 0x23,
- 0x35, 0x20, 0x2e, 0x3c, 0x30, 0x3b, 0x2e, 0x25,
- 0x35, 0x35, 0x23, 0x25, 0x3c, 0x30, 0x23, 0x25,
- 0x34, 0x24, 0x2c, 0x31, 0x37, 0x29, 0x37, 0x38,
- 0x38, 0x34, 0x32, 0x22, 0x25, 0x2e, 0x3b, 0x20,
- // Entry C0 - FF
- 0x22, 0x2c, 0x30, 0x35, 0x35, 0x3b, 0x25, 0x2c,
- 0x25, 0x39, 0x2e, 0x24, 0x2e, 0x33, 0x30, 0x2e,
- 0x31, 0x3a, 0x2c, 0x2a, 0x2c, 0x20, 0x33, 0x29,
- 0x2b, 0x24, 0x20, 0x3b, 0x23, 0x28, 0x2a, 0x23,
- 0x33, 0x20, 0x27, 0x28, 0x3a, 0x30, 0x24, 0x2d,
- 0x2f, 0x28, 0x25, 0x23, 0x39, 0x20, 0x3b, 0x27,
- 0x20, 0x23, 0x20, 0x20, 0x1e, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- // Entry 100 - 13F
- 0x2e, 0x20, 0x2d, 0x22, 0x32, 0x2e, 0x23, 0x3a,
- 0x2e, 0x38, 0x37, 0x30, 0x2c, 0x39, 0x2b, 0x2d,
- 0x2c, 0x22, 0x2c, 0x2e, 0x27, 0x2e, 0x26, 0x32,
- 0x33, 0x25, 0x23, 0x31, 0x21, 0x25, 0x26, 0x21,
- 0x2c, 0x30, 0x3c, 0x28, 0x30, 0x3c, 0x38, 0x28,
- 0x30, 0x23, 0x25, 0x28, 0x35, 0x2e, 0x32, 0x2e,
- 0x20, 0x21, 0x2f, 0x27, 0x3c, 0x22, 0x25, 0x20,
- 0x27, 0x25, 0x25, 0x30, 0x3a, 0x28, 0x20, 0x28,
- // Entry 140 - 17F
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x23, 0x23, 0x2e, 0x22, 0x31, 0x2e,
- 0x26, 0x2e, 0x20,
-}
-
-// regionInclusionBits is an array of bit vectors where every vector represents
-// a set of region groupings. These sets are used to compute the distance
-// between two regions for the purpose of language matching.
-// Size: 288 bytes, 72 elements
-var regionInclusionBits = [72]uint32{
- // Entry 0 - 1F
- 0x82400813, 0x000007a3, 0x00003844, 0x20000808,
- 0x403c0011, 0x00000022, 0x20000844, 0x00000082,
- 0x00000102, 0x00000202, 0x00000402, 0x2000384d,
- 0x00001804, 0x20002804, 0x00404000, 0x00408000,
- 0x00410000, 0x02020000, 0x00040010, 0x00080010,
- 0x00100010, 0x00200010, 0x01c1c001, 0x00c00000,
- 0x01400000, 0x1e020001, 0x06000000, 0x0a000000,
- 0x12000000, 0x20002848, 0x40000010, 0x80000001,
- // Entry 20 - 3F
- 0x00000001, 0x40000000, 0x00020000, 0x01000000,
- 0x00008000, 0x00002000, 0x00000200, 0x00000008,
- 0x00200000, 0x90000000, 0x00040000, 0x08000000,
- 0x00000020, 0x84000000, 0x00000080, 0x00001000,
- 0x00010000, 0x00000400, 0x04000000, 0x00000040,
- 0x10000000, 0x00004000, 0x81000000, 0x88000000,
- 0x00000100, 0x80020000, 0x00080000, 0x00100000,
- 0x00800000, 0xffffffff, 0x82400fb3, 0xc27c0813,
- // Entry 40 - 5F
- 0xa240385f, 0x83c1c813, 0x9e420813, 0x92000001,
- 0x86000001, 0x81400001, 0x8a000001, 0x82020001,
-}
-
-// regionInclusionNext marks, for each entry in regionInclusionBits, the set of
-// all groups that are reachable from the groups set in the respective entry.
-// Size: 72 bytes, 72 elements
-var regionInclusionNext = [72]uint8{
- // Entry 0 - 3F
- 0x3d, 0x3e, 0x0b, 0x0b, 0x3f, 0x01, 0x0b, 0x01,
- 0x01, 0x01, 0x01, 0x40, 0x0b, 0x0b, 0x16, 0x16,
- 0x16, 0x19, 0x04, 0x04, 0x04, 0x04, 0x41, 0x16,
- 0x16, 0x42, 0x19, 0x19, 0x19, 0x0b, 0x04, 0x00,
- 0x00, 0x1e, 0x11, 0x18, 0x0f, 0x0d, 0x09, 0x03,
- 0x15, 0x43, 0x12, 0x1b, 0x05, 0x44, 0x07, 0x0c,
- 0x10, 0x0a, 0x1a, 0x06, 0x1c, 0x0e, 0x45, 0x46,
- 0x08, 0x47, 0x13, 0x14, 0x17, 0x3d, 0x3d, 0x3d,
- // Entry 40 - 7F
- 0x3d, 0x3d, 0x3d, 0x42, 0x42, 0x41, 0x42, 0x42,
-}
-
-type parentRel struct {
- lang uint16
- script uint8
- maxScript uint8
- toRegion uint16
- fromRegion []uint16
-}
-
-// Size: 412 bytes, 5 elements
-var parents = [5]parentRel{
- 0: {lang: 0x9b, script: 0x0, maxScript: 0x52, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x24, 0x25, 0x2e, 0x33, 0x35, 0x3c, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4f, 0x51, 0x5b, 0x5c, 0x60, 0x63, 0x6c, 0x71, 0x72, 0x73, 0x79, 0x7a, 0x7d, 0x7e, 0x7f, 0x81, 0x8a, 0x8b, 0x94, 0x95, 0x96, 0x97, 0x98, 0x9d, 0x9e, 0xa2, 0xa5, 0xa7, 0xab, 0xaf, 0xb2, 0xb3, 0xbd, 0xc4, 0xc8, 0xc9, 0xca, 0xcc, 0xce, 0xd0, 0xd3, 0xd4, 0xdb, 0xdd, 0xde, 0xe4, 0xe5, 0xe6, 0xe9, 0xee, 0x105, 0x107, 0x108, 0x109, 0x10b, 0x10c, 0x110, 0x115, 0x119, 0x11b, 0x11d, 0x123, 0x127, 0x12a, 0x12b, 0x12d, 0x12f, 0x136, 0x139, 0x13c, 0x13f, 0x15e, 0x15f, 0x161}},
- 1: {lang: 0x9b, script: 0x0, maxScript: 0x52, toRegion: 0x1a, fromRegion: []uint16{0x2d, 0x4d, 0x5f, 0x62, 0x70, 0xd7, 0x10a, 0x10d}},
- 2: {lang: 0x9d, script: 0x0, maxScript: 0x52, toRegion: 0x1e, fromRegion: []uint16{0x2b, 0x3e, 0x40, 0x50, 0x53, 0x55, 0x58, 0x64, 0x68, 0x87, 0x8d, 0xcd, 0xd6, 0xe0, 0xe2, 0xea, 0xef, 0x118, 0x132, 0x133, 0x138}},
- 3: {lang: 0x1ef, script: 0x0, maxScript: 0x52, toRegion: 0xec, fromRegion: []uint16{0x29, 0x4d, 0x59, 0x84, 0x89, 0xb5, 0xc4, 0xcf, 0x116, 0x124}},
- 4: {lang: 0x2c4, script: 0x35, maxScript: 0x35, toRegion: 0x8b, fromRegion: []uint16{0xc4}},
-}
-
-// Total table size 20315 bytes (19KiB); checksum: C16EF251
diff --git a/Godeps/_workspace/src/golang.org/x/text/language/tags.go b/Godeps/_workspace/src/golang.org/x/text/language/tags.go
deleted file mode 100644
index de30155a2..000000000
--- a/Godeps/_workspace/src/golang.org/x/text/language/tags.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 language
-
-// TODO: Various sets of commonly use tags and regions.
-
-// MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed.
-// It simplifies safe initialization of Tag values.
-func MustParse(s string) Tag {
- t, err := Parse(s)
- if err != nil {
- panic(err)
- }
- return t
-}
-
-// MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed.
-// It simplifies safe initialization of Tag values.
-func (c CanonType) MustParse(s string) Tag {
- t, err := c.Parse(s)
- if err != nil {
- panic(err)
- }
- return t
-}
-
-// MustParseBase is like ParseBase, but panics if the given base cannot be parsed.
-// It simplifies safe initialization of Base values.
-func MustParseBase(s string) Base {
- b, err := ParseBase(s)
- if err != nil {
- panic(err)
- }
- return b
-}
-
-// MustParseScript is like ParseScript, but panics if the given script cannot be
-// parsed. It simplifies safe initialization of Script values.
-func MustParseScript(s string) Script {
- scr, err := ParseScript(s)
- if err != nil {
- panic(err)
- }
- return scr
-}
-
-// MustParseRegion is like ParseRegion, but panics if the given region cannot be
-// parsed. It simplifies safe initialization of Region values.
-func MustParseRegion(s string) Region {
- r, err := ParseRegion(s)
- if err != nil {
- panic(err)
- }
- return r
-}
-
-var (
- und = Tag{}
-
- Und Tag = Tag{}
-
- Afrikaans Tag = Tag{lang: _af} // af
- Amharic Tag = Tag{lang: _am} // am
- Arabic Tag = Tag{lang: _ar} // ar
- ModernStandardArabic Tag = Tag{lang: _ar, region: _001} // ar-001
- Azerbaijani Tag = Tag{lang: _az} // az
- Bulgarian Tag = Tag{lang: _bg} // bg
- Bengali Tag = Tag{lang: _bn} // bn
- Catalan Tag = Tag{lang: _ca} // ca
- Czech Tag = Tag{lang: _cs} // cs
- Danish Tag = Tag{lang: _da} // da
- German Tag = Tag{lang: _de} // de
- Greek Tag = Tag{lang: _el} // el
- English Tag = Tag{lang: _en} // en
- AmericanEnglish Tag = Tag{lang: _en, region: _US} // en-US
- BritishEnglish Tag = Tag{lang: _en, region: _GB} // en-GB
- Spanish Tag = Tag{lang: _es} // es
- EuropeanSpanish Tag = Tag{lang: _es, region: _ES} // es-ES
- LatinAmericanSpanish Tag = Tag{lang: _es, region: _419} // es-419
- Estonian Tag = Tag{lang: _et} // et
- Persian Tag = Tag{lang: _fa} // fa
- Finnish Tag = Tag{lang: _fi} // fi
- Filipino Tag = Tag{lang: _fil} // fil
- French Tag = Tag{lang: _fr} // fr
- CanadianFrench Tag = Tag{lang: _fr, region: _CA} // fr-CA
- Gujarati Tag = Tag{lang: _gu} // gu
- Hebrew Tag = Tag{lang: _he} // he
- Hindi Tag = Tag{lang: _hi} // hi
- Croatian Tag = Tag{lang: _hr} // hr
- Hungarian Tag = Tag{lang: _hu} // hu
- Armenian Tag = Tag{lang: _hy} // hy
- Indonesian Tag = Tag{lang: _id} // id
- Icelandic Tag = Tag{lang: _is} // is
- Italian Tag = Tag{lang: _it} // it
- Japanese Tag = Tag{lang: _ja} // ja
- Georgian Tag = Tag{lang: _ka} // ka
- Kazakh Tag = Tag{lang: _kk} // kk
- Khmer Tag = Tag{lang: _km} // km
- Kannada Tag = Tag{lang: _kn} // kn
- Korean Tag = Tag{lang: _ko} // ko
- Kirghiz Tag = Tag{lang: _ky} // ky
- Lao Tag = Tag{lang: _lo} // lo
- Lithuanian Tag = Tag{lang: _lt} // lt
- Latvian Tag = Tag{lang: _lv} // lv
- Macedonian Tag = Tag{lang: _mk} // mk
- Malayalam Tag = Tag{lang: _ml} // ml
- Mongolian Tag = Tag{lang: _mn} // mn
- Marathi Tag = Tag{lang: _mr} // mr
- Malay Tag = Tag{lang: _ms} // ms
- Burmese Tag = Tag{lang: _my} // my
- Nepali Tag = Tag{lang: _ne} // ne
- Dutch Tag = Tag{lang: _nl} // nl
- Norwegian Tag = Tag{lang: _no} // no
- Punjabi Tag = Tag{lang: _pa} // pa
- Polish Tag = Tag{lang: _pl} // pl
- Portuguese Tag = Tag{lang: _pt} // pt
- BrazilianPortuguese Tag = Tag{lang: _pt, region: _BR} // pt-BR
- EuropeanPortuguese Tag = Tag{lang: _pt, region: _PT} // pt-PT
- Romanian Tag = Tag{lang: _ro} // ro
- Russian Tag = Tag{lang: _ru} // ru
- Sinhala Tag = Tag{lang: _si} // si
- Slovak Tag = Tag{lang: _sk} // sk
- Slovenian Tag = Tag{lang: _sl} // sl
- Albanian Tag = Tag{lang: _sq} // sq
- Serbian Tag = Tag{lang: _sr} // sr
- SerbianLatin Tag = Tag{lang: _sr, script: _Latn} // sr-Latn
- Swedish Tag = Tag{lang: _sv} // sv
- Swahili Tag = Tag{lang: _sw} // sw
- Tamil Tag = Tag{lang: _ta} // ta
- Telugu Tag = Tag{lang: _te} // te
- Thai Tag = Tag{lang: _th} // th
- Turkish Tag = Tag{lang: _tr} // tr
- Ukrainian Tag = Tag{lang: _uk} // uk
- Urdu Tag = Tag{lang: _ur} // ur
- Uzbek Tag = Tag{lang: _uz} // uz
- Vietnamese Tag = Tag{lang: _vi} // vi
- Chinese Tag = Tag{lang: _zh} // zh
- SimplifiedChinese Tag = Tag{lang: _zh, script: _Hans} // zh-Hans
- TraditionalChinese Tag = Tag{lang: _zh, script: _Hant} // zh-Hant
- Zulu Tag = Tag{lang: _zu} // zu
-)