summaryrefslogtreecommitdiff
path: root/vendor/github.com/tdewolff/minify/v2/html
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/tdewolff/minify/v2/html')
-rw-r--r--vendor/github.com/tdewolff/minify/v2/html/buffer.go137
-rw-r--r--vendor/github.com/tdewolff/minify/v2/html/hash.go543
-rw-r--r--vendor/github.com/tdewolff/minify/v2/html/html.go511
-rw-r--r--vendor/github.com/tdewolff/minify/v2/html/table.go1346
4 files changed, 2537 insertions, 0 deletions
diff --git a/vendor/github.com/tdewolff/minify/v2/html/buffer.go b/vendor/github.com/tdewolff/minify/v2/html/buffer.go
new file mode 100644
index 000000000..f58367b44
--- /dev/null
+++ b/vendor/github.com/tdewolff/minify/v2/html/buffer.go
@@ -0,0 +1,137 @@
+package html
+
+import (
+ "github.com/tdewolff/parse/v2"
+ "github.com/tdewolff/parse/v2/html"
+)
+
+// Token is a single token unit with an attribute value (if given) and hash of the data.
+type Token struct {
+ html.TokenType
+ Hash Hash
+ Data []byte
+ Text []byte
+ AttrVal []byte
+ Traits traits
+ Offset int
+}
+
+// TokenBuffer is a buffer that allows for token look-ahead.
+type TokenBuffer struct {
+ r *parse.Input
+ l *html.Lexer
+
+ buf []Token
+ pos int
+
+ attrBuffer []*Token
+}
+
+// NewTokenBuffer returns a new TokenBuffer.
+func NewTokenBuffer(r *parse.Input, l *html.Lexer) *TokenBuffer {
+ return &TokenBuffer{
+ r: r,
+ l: l,
+ buf: make([]Token, 0, 8),
+ }
+}
+
+func (z *TokenBuffer) read(t *Token) {
+ t.Offset = z.r.Offset()
+ t.TokenType, t.Data = z.l.Next()
+ t.Text = z.l.Text()
+ if t.TokenType == html.AttributeToken {
+ t.Offset += 1 + len(t.Text) + 1
+ t.AttrVal = z.l.AttrVal()
+ if len(t.AttrVal) > 1 && (t.AttrVal[0] == '"' || t.AttrVal[0] == '\'') {
+ t.Offset++
+ t.AttrVal = t.AttrVal[1 : len(t.AttrVal)-1] // quotes will be readded in attribute loop if necessary
+ }
+ t.Hash = ToHash(t.Text)
+ t.Traits = attrMap[t.Hash]
+ } else if t.TokenType == html.StartTagToken || t.TokenType == html.EndTagToken {
+ t.AttrVal = nil
+ t.Hash = ToHash(t.Text)
+ t.Traits = tagMap[t.Hash] // zero if not exist
+ } else {
+ t.AttrVal = nil
+ t.Hash = 0
+ t.Traits = 0
+ }
+}
+
+// Peek returns the ith element and possibly does an allocation.
+// Peeking past an error will panic.
+func (z *TokenBuffer) Peek(pos int) *Token {
+ pos += z.pos
+ if pos >= len(z.buf) {
+ if len(z.buf) > 0 && z.buf[len(z.buf)-1].TokenType == html.ErrorToken {
+ return &z.buf[len(z.buf)-1]
+ }
+
+ c := cap(z.buf)
+ d := len(z.buf) - z.pos
+ p := pos - z.pos + 1 // required peek length
+ var buf []Token
+ if 2*p > c {
+ buf = make([]Token, 0, 2*c+p)
+ } else {
+ buf = z.buf
+ }
+ copy(buf[:d], z.buf[z.pos:])
+
+ buf = buf[:p]
+ pos -= z.pos
+ for i := d; i < p; i++ {
+ z.read(&buf[i])
+ if buf[i].TokenType == html.ErrorToken {
+ buf = buf[:i+1]
+ pos = i
+ break
+ }
+ }
+ z.pos, z.buf = 0, buf
+ }
+ return &z.buf[pos]
+}
+
+// Shift returns the first element and advances position.
+func (z *TokenBuffer) Shift() *Token {
+ if z.pos >= len(z.buf) {
+ t := &z.buf[:1][0]
+ z.read(t)
+ return t
+ }
+ t := &z.buf[z.pos]
+ z.pos++
+ return t
+}
+
+// Attributes extracts the gives attribute hashes from a tag.
+// It returns in the same order pointers to the requested token data or nil.
+func (z *TokenBuffer) Attributes(hashes ...Hash) []*Token {
+ n := 0
+ for {
+ if t := z.Peek(n); t.TokenType != html.AttributeToken {
+ break
+ }
+ n++
+ }
+ if len(hashes) > cap(z.attrBuffer) {
+ z.attrBuffer = make([]*Token, len(hashes))
+ } else {
+ z.attrBuffer = z.attrBuffer[:len(hashes)]
+ for i := range z.attrBuffer {
+ z.attrBuffer[i] = nil
+ }
+ }
+ for i := z.pos; i < z.pos+n; i++ {
+ attr := &z.buf[i]
+ for j, hash := range hashes {
+ if hash == attr.Hash {
+ z.attrBuffer[j] = attr
+ }
+ }
+ }
+ return z.attrBuffer
+}
diff --git a/vendor/github.com/tdewolff/minify/v2/html/hash.go b/vendor/github.com/tdewolff/minify/v2/html/hash.go
new file mode 100644
index 000000000..3b91cbbd5
--- /dev/null
+++ b/vendor/github.com/tdewolff/minify/v2/html/hash.go
@@ -0,0 +1,543 @@
+package html
+
+// generated by hasher -type=Hash -file=hash.go; DO NOT EDIT, except for adding more constants to the list and rerun go generate
+
+// uses github.com/tdewolff/hasher
+//go:generate hasher -type=Hash -file=hash.go
+
+// Hash defines perfect hashes for a predefined list of strings
+type Hash uint32
+
+// Unique hash definitions to be used instead of strings
+const (
+ A Hash = 0x1 // a
+ Abbr Hash = 0x37a04 // abbr
+ About Hash = 0x5 // about
+ Accept Hash = 0x1106 // accept
+ Accept_Charset Hash = 0x110e // accept-charset
+ Action Hash = 0x23f06 // action
+ Address Hash = 0x5a07 // address
+ Align Hash = 0x32705 // align
+ Alink Hash = 0x7005 // alink
+ Allowfullscreen Hash = 0x2ad0f // allowfullscreen
+ Amp_Boilerplate Hash = 0x610f // amp-boilerplate
+ Area Hash = 0x1e304 // area
+ Article Hash = 0x2707 // article
+ Aside Hash = 0xb405 // aside
+ Async Hash = 0xac05 // async
+ Audio Hash = 0xd105 // audio
+ Autofocus Hash = 0xe409 // autofocus
+ Autoplay Hash = 0x10808 // autoplay
+ Axis Hash = 0x11004 // axis
+ B Hash = 0x101 // b
+ Background Hash = 0x300a // background
+ Base Hash = 0x19604 // base
+ Bb Hash = 0x37b02 // bb
+ Bdi Hash = 0x7503 // bdi
+ Bdo Hash = 0x31f03 // bdo
+ Bgcolor Hash = 0x12607 // bgcolor
+ Blockquote Hash = 0x13e0a // blockquote
+ Body Hash = 0xd04 // body
+ Br Hash = 0x37c02 // br
+ Button Hash = 0x14806 // button
+ Canvas Hash = 0xb006 // canvas
+ Caption Hash = 0x21f07 // caption
+ Charset Hash = 0x1807 // charset
+ Checked Hash = 0x1b307 // checked
+ Cite Hash = 0xfb04 // cite
+ Class Hash = 0x15905 // class
+ Classid Hash = 0x15907 // classid
+ Clear Hash = 0x2b05 // clear
+ Code Hash = 0x19204 // code
+ Codebase Hash = 0x19208 // codebase
+ Codetype Hash = 0x1a408 // codetype
+ Col Hash = 0x12803 // col
+ Colgroup Hash = 0x1bb08 // colgroup
+ Color Hash = 0x12805 // color
+ Cols Hash = 0x1cf04 // cols
+ Colspan Hash = 0x1cf07 // colspan
+ Compact Hash = 0x1ec07 // compact
+ Content Hash = 0x28407 // content
+ Controls Hash = 0x20108 // controls
+ Data Hash = 0x1f04 // data
+ Datalist Hash = 0x1f08 // datalist
+ Datatype Hash = 0x4d08 // datatype
+ Dd Hash = 0x5b02 // dd
+ Declare Hash = 0xb707 // declare
+ Default Hash = 0x7f07 // default
+ DefaultChecked Hash = 0x1730e // defaultChecked
+ DefaultMuted Hash = 0x7f0c // defaultMuted
+ DefaultSelected Hash = 0x8a0f // defaultSelected
+ Defer Hash = 0x9805 // defer
+ Del Hash = 0x10503 // del
+ Details Hash = 0x15f07 // details
+ Dfn Hash = 0x16c03 // dfn
+ Dialog Hash = 0xa606 // dialog
+ Dir Hash = 0x7603 // dir
+ Disabled Hash = 0x18008 // disabled
+ Div Hash = 0x18703 // div
+ Dl Hash = 0x1b902 // dl
+ Dt Hash = 0x23102 // dt
+ Em Hash = 0x4302 // em
+ Embed Hash = 0x4905 // embed
+ Enabled Hash = 0x26c07 // enabled
+ Enctype Hash = 0x1fa07 // enctype
+ Face Hash = 0x5604 // face
+ Fieldset Hash = 0x21408 // fieldset
+ Figcaption Hash = 0x21c0a // figcaption
+ Figure Hash = 0x22606 // figure
+ Footer Hash = 0xdb06 // footer
+ For Hash = 0x23b03 // for
+ Form Hash = 0x23b04 // form
+ Formaction Hash = 0x23b0a // formaction
+ Formnovalidate Hash = 0x2450e // formnovalidate
+ Frame Hash = 0x28c05 // frame
+ Frameborder Hash = 0x28c0b // frameborder
+ H1 Hash = 0x2e002 // h1
+ H2 Hash = 0x25302 // h2
+ H3 Hash = 0x25502 // h3
+ H4 Hash = 0x25702 // h4
+ H5 Hash = 0x25902 // h5
+ H6 Hash = 0x25b02 // h6
+ Head Hash = 0x2d204 // head
+ Header Hash = 0x2d206 // header
+ Hgroup Hash = 0x25d06 // hgroup
+ Hidden Hash = 0x26806 // hidden
+ Hr Hash = 0x32d02 // hr
+ Href Hash = 0x32d04 // href
+ Hreflang Hash = 0x32d08 // hreflang
+ Html Hash = 0x27304 // html
+ Http_Equiv Hash = 0x2770a // http-equiv
+ I Hash = 0x2401 // i
+ Icon Hash = 0x28304 // icon
+ Id Hash = 0xb602 // id
+ Iframe Hash = 0x28b06 // iframe
+ Img Hash = 0x29703 // img
+ Inert Hash = 0xf605 // inert
+ Inlist Hash = 0x29a06 // inlist
+ Input Hash = 0x2a405 // input
+ Ins Hash = 0x2a903 // ins
+ Ismap Hash = 0x11205 // ismap
+ Itemscope Hash = 0xfc09 // itemscope
+ Kbd Hash = 0x7403 // kbd
+ Keygen Hash = 0x1f606 // keygen
+ Label Hash = 0xbe05 // label
+ Lang Hash = 0x33104 // lang
+ Language Hash = 0x33108 // language
+ Legend Hash = 0x2c506 // legend
+ Li Hash = 0x2302 // li
+ Link Hash = 0x7104 // link
+ Longdesc Hash = 0xc208 // longdesc
+ Main Hash = 0xf404 // main
+ Manifest Hash = 0x2bc08 // manifest
+ Map Hash = 0xee03 // map
+ Mark Hash = 0x2cb04 // mark
+ Math Hash = 0x2cf04 // math
+ Max Hash = 0x2d803 // max
+ Maxlength Hash = 0x2d809 // maxlength
+ Media Hash = 0xa405 // media
+ Menu Hash = 0x12204 // menu
+ Meta Hash = 0x2e204 // meta
+ Meter Hash = 0x2f705 // meter
+ Method Hash = 0x2fc06 // method
+ Multiple Hash = 0x30208 // multiple
+ Muted Hash = 0x30a05 // muted
+ Name Hash = 0xa204 // name
+ Nav Hash = 0x32403 // nav
+ Nohref Hash = 0x32b06 // nohref
+ Noresize Hash = 0x13608 // noresize
+ Noscript Hash = 0x14d08 // noscript
+ Noshade Hash = 0x16e07 // noshade
+ Novalidate Hash = 0x2490a // novalidate
+ Nowrap Hash = 0x1d506 // nowrap
+ Object Hash = 0xd506 // object
+ Ol Hash = 0xcb02 // ol
+ Open Hash = 0x32104 // open
+ Optgroup Hash = 0x35608 // optgroup
+ Option Hash = 0x30f06 // option
+ Output Hash = 0x206 // output
+ P Hash = 0x501 // p
+ Param Hash = 0xf005 // param
+ Pauseonexit Hash = 0x1160b // pauseonexit
+ Picture Hash = 0x1c207 // picture
+ Plaintext Hash = 0x1da09 // plaintext
+ Poster Hash = 0x26206 // poster
+ Pre Hash = 0x35d03 // pre
+ Prefix Hash = 0x35d06 // prefix
+ Profile Hash = 0x36407 // profile
+ Progress Hash = 0x34208 // progress
+ Property Hash = 0x31508 // property
+ Q Hash = 0x14301 // q
+ Rb Hash = 0x2f02 // rb
+ Readonly Hash = 0x1e408 // readonly
+ Rel Hash = 0xbc03 // rel
+ Required Hash = 0x22a08 // required
+ Resource Hash = 0x1c708 // resource
+ Rev Hash = 0x7803 // rev
+ Reversed Hash = 0x7808 // reversed
+ Rows Hash = 0x9c04 // rows
+ Rowspan Hash = 0x9c07 // rowspan
+ Rp Hash = 0x6a02 // rp
+ Rt Hash = 0x2802 // rt
+ Rtc Hash = 0xf903 // rtc
+ Ruby Hash = 0xe004 // ruby
+ Rules Hash = 0x12c05 // rules
+ S Hash = 0x1c01 // s
+ Samp Hash = 0x6004 // samp
+ Scope Hash = 0x10005 // scope
+ Scoped Hash = 0x10006 // scoped
+ Script Hash = 0x14f06 // script
+ Scrolling Hash = 0xc809 // scrolling
+ Seamless Hash = 0x19808 // seamless
+ Section Hash = 0x13007 // section
+ Select Hash = 0x16506 // select
+ Selected Hash = 0x16508 // selected
+ Shape Hash = 0x19f05 // shape
+ Size Hash = 0x13a04 // size
+ Slot Hash = 0x20804 // slot
+ Small Hash = 0x2ab05 // small
+ Sortable Hash = 0x2ef08 // sortable
+ Source Hash = 0x1c906 // source
+ Span Hash = 0x9f04 // span
+ Src Hash = 0x34903 // src
+ Srcset Hash = 0x34906 // srcset
+ Start Hash = 0x2505 // start
+ Strong Hash = 0x29e06 // strong
+ Style Hash = 0x2c205 // style
+ Sub Hash = 0x31d03 // sub
+ Summary Hash = 0x33907 // summary
+ Sup Hash = 0x34003 // sup
+ Svg Hash = 0x34f03 // svg
+ Tabindex Hash = 0x2e408 // tabindex
+ Table Hash = 0x2f205 // table
+ Target Hash = 0x706 // target
+ Tbody Hash = 0xc05 // tbody
+ Td Hash = 0x1e02 // td
+ Template Hash = 0x4208 // template
+ Text Hash = 0x1df04 // text
+ Textarea Hash = 0x1df08 // textarea
+ Tfoot Hash = 0xda05 // tfoot
+ Th Hash = 0x2d102 // th
+ Thead Hash = 0x2d105 // thead
+ Time Hash = 0x12004 // time
+ Title Hash = 0x15405 // title
+ Tr Hash = 0x1f202 // tr
+ Track Hash = 0x1f205 // track
+ Translate Hash = 0x20b09 // translate
+ Truespeed Hash = 0x23209 // truespeed
+ Type Hash = 0x5104 // type
+ Typemustmatch Hash = 0x1a80d // typemustmatch
+ Typeof Hash = 0x5106 // typeof
+ U Hash = 0x301 // u
+ Ul Hash = 0x8302 // ul
+ Undeterminate Hash = 0x370d // undeterminate
+ Usemap Hash = 0xeb06 // usemap
+ Valign Hash = 0x32606 // valign
+ Value Hash = 0x18905 // value
+ Valuetype Hash = 0x18909 // valuetype
+ Var Hash = 0x28003 // var
+ Video Hash = 0x35205 // video
+ Visible Hash = 0x36b07 // visible
+ Vlink Hash = 0x37205 // vlink
+ Vocab Hash = 0x37705 // vocab
+ Wbr Hash = 0x37e03 // wbr
+ Xmlns Hash = 0x2eb05 // xmlns
+ Xmp Hash = 0x36203 // xmp
+)
+
+// String returns the hash' name.
+func (i Hash) String() string {
+ start := uint32(i >> 8)
+ n := uint32(i & 0xff)
+ if start+n > uint32(len(_Hash_text)) {
+ return ""
+ }
+ return _Hash_text[start : start+n]
+}
+
+// ToHash returns the hash whose name is s. It returns zero if there is no
+// such hash. It is case sensitive.
+func ToHash(s []byte) Hash {
+ if len(s) == 0 || len(s) > _Hash_maxLen {
+ return 0
+ }
+ h := uint32(_Hash_hash0)
+ for i := 0; i < len(s); i++ {
+ h ^= uint32(s[i])
+ h *= 16777619
+ }
+ if i := _Hash_table[h&uint32(len(_Hash_table)-1)]; int(i&0xff) == len(s) {
+ t := _Hash_text[i>>8 : i>>8+i&0xff]
+ for i := 0; i < len(s); i++ {
+ if t[i] != s[i] {
+ goto NEXT
+ }
+ }
+ return i
+ }
+NEXT:
+ if i := _Hash_table[(h>>16)&uint32(len(_Hash_table)-1)]; int(i&0xff) == len(s) {
+ t := _Hash_text[i>>8 : i>>8+i&0xff]
+ for i := 0; i < len(s); i++ {
+ if t[i] != s[i] {
+ return 0
+ }
+ }
+ return i
+ }
+ return 0
+}
+
+const _Hash_hash0 = 0x9acb0442
+const _Hash_maxLen = 15
+const _Hash_text = "aboutputargetbodyaccept-charsetdatalistarticlearbackgroundet" +
+ "erminatemplatembedatatypeofaceaddressamp-boilerplatealinkbdi" +
+ "reversedefaultMutedefaultSelectedeferowspanamedialogasyncanv" +
+ "asideclarelabelongdescrollingaudiobjectfooterubyautofocusema" +
+ "paramainertcitemscopedelautoplayaxismapauseonexitimenubgcolo" +
+ "rulesectionoresizeblockquotebuttonoscriptitleclassidetailsel" +
+ "ectedfnoshadefaultCheckedisabledivaluetypecodebaseamlesshape" +
+ "codetypemustmatcheckedlcolgroupicturesourcecolspanowraplaint" +
+ "extareadonlycompactrackeygenctypecontrolslotranslatefieldset" +
+ "figcaptionfigurequiredtruespeedformactionformnovalidateh2h3h" +
+ "4h5h6hgrouposterhiddenabledhtmlhttp-equivaricontentiframebor" +
+ "derimginlistronginputinsmallowfullscreenmanifestylegendmarkm" +
+ "atheadermaxlength1metabindexmlnsortablemetermethodmultiplemu" +
+ "tedoptionpropertysubdopenavalignohreflanguagesummarysuprogre" +
+ "ssrcsetsvgvideoptgrouprefixmprofilevisiblevlinkvocabbrwbr"
+
+var _Hash_table = [1 << 9]Hash{
+ 0x0: 0x1df08, // textarea
+ 0x4: 0x32d02, // hr
+ 0x8: 0x1c207, // picture
+ 0xb: 0x18905, // value
+ 0xf: 0x2e408, // tabindex
+ 0x12: 0x15905, // class
+ 0x15: 0x37e03, // wbr
+ 0x18: 0x1a80d, // typemustmatch
+ 0x1a: 0x1b902, // dl
+ 0x1d: 0xf903, // rtc
+ 0x1e: 0x25702, // h4
+ 0x22: 0x2ef08, // sortable
+ 0x24: 0x4208, // template
+ 0x25: 0x28c0b, // frameborder
+ 0x28: 0x37a04, // abbr
+ 0x29: 0x28b06, // iframe
+ 0x2a: 0x610f, // amp-boilerplate
+ 0x2c: 0x1e408, // readonly
+ 0x30: 0x23f06, // action
+ 0x33: 0x28c05, // frame
+ 0x35: 0x12c05, // rules
+ 0x36: 0x30208, // multiple
+ 0x38: 0x31f03, // bdo
+ 0x39: 0x1d506, // nowrap
+ 0x3e: 0x21408, // fieldset
+ 0x3f: 0x7503, // bdi
+ 0x46: 0x7f0c, // defaultMuted
+ 0x49: 0x35205, // video
+ 0x4c: 0x19808, // seamless
+ 0x4d: 0x13608, // noresize
+ 0x4f: 0xb602, // id
+ 0x51: 0x25d06, // hgroup
+ 0x52: 0x23102, // dt
+ 0x55: 0x12805, // color
+ 0x56: 0x34003, // sup
+ 0x59: 0x370d, // undeterminate
+ 0x5a: 0x35608, // optgroup
+ 0x5b: 0x2d206, // header
+ 0x5c: 0xb405, // aside
+ 0x5f: 0x10005, // scope
+ 0x60: 0x101, // b
+ 0x61: 0xcb02, // ol
+ 0x64: 0x32b06, // nohref
+ 0x65: 0x1da09, // plaintext
+ 0x66: 0x20804, // slot
+ 0x67: 0x11004, // axis
+ 0x68: 0x12803, // col
+ 0x69: 0x32606, // valign
+ 0x6c: 0x2d105, // thead
+ 0x70: 0x34906, // srcset
+ 0x71: 0x26806, // hidden
+ 0x76: 0x1bb08, // colgroup
+ 0x78: 0x34f03, // svg
+ 0x7b: 0x2cb04, // mark
+ 0x7e: 0x33104, // lang
+ 0x81: 0x1cf04, // cols
+ 0x86: 0x5a07, // address
+ 0x8b: 0xf404, // main
+ 0x8c: 0x4302, // em
+ 0x8f: 0x32d08, // hreflang
+ 0x93: 0x1b307, // checked
+ 0x94: 0x25902, // h5
+ 0x95: 0x301, // u
+ 0x96: 0x32705, // align
+ 0x97: 0x14301, // q
+ 0x99: 0xd506, // object
+ 0x9b: 0x28407, // content
+ 0x9d: 0xc809, // scrolling
+ 0x9f: 0x36407, // profile
+ 0xa0: 0x34903, // src
+ 0xa1: 0xda05, // tfoot
+ 0xa3: 0x2f705, // meter
+ 0xa4: 0x37705, // vocab
+ 0xa6: 0xd04, // body
+ 0xa8: 0x19204, // code
+ 0xac: 0x20108, // controls
+ 0xb0: 0x2ab05, // small
+ 0xb1: 0x18008, // disabled
+ 0xb5: 0x5604, // face
+ 0xb6: 0x501, // p
+ 0xb9: 0x2302, // li
+ 0xbb: 0xe409, // autofocus
+ 0xbf: 0x27304, // html
+ 0xc2: 0x4d08, // datatype
+ 0xc6: 0x35d06, // prefix
+ 0xcb: 0x35d03, // pre
+ 0xcc: 0x1106, // accept
+ 0xd1: 0x23b03, // for
+ 0xd5: 0x29e06, // strong
+ 0xd6: 0x9c07, // rowspan
+ 0xd7: 0x25502, // h3
+ 0xd8: 0x2cf04, // math
+ 0xde: 0x16e07, // noshade
+ 0xdf: 0x19f05, // shape
+ 0xe1: 0x10006, // scoped
+ 0xe3: 0x706, // target
+ 0xe6: 0x21c0a, // figcaption
+ 0xe9: 0x1df04, // text
+ 0xea: 0x1c708, // resource
+ 0xec: 0xee03, // map
+ 0xf0: 0x29a06, // inlist
+ 0xf1: 0x16506, // select
+ 0xf2: 0x1f606, // keygen
+ 0xf3: 0x5106, // typeof
+ 0xf6: 0xb006, // canvas
+ 0xf7: 0x30f06, // option
+ 0xf8: 0xbe05, // label
+ 0xf9: 0xbc03, // rel
+ 0xfb: 0x1f04, // data
+ 0xfd: 0x6004, // samp
+ 0x100: 0x110e, // accept-charset
+ 0x101: 0xeb06, // usemap
+ 0x103: 0x2bc08, // manifest
+ 0x109: 0xa204, // name
+ 0x10a: 0x14806, // button
+ 0x10b: 0x2b05, // clear
+ 0x10e: 0x33907, // summary
+ 0x10f: 0x2e204, // meta
+ 0x110: 0x33108, // language
+ 0x112: 0x300a, // background
+ 0x113: 0x2707, // article
+ 0x116: 0x23b0a, // formaction
+ 0x119: 0x1, // a
+ 0x11b: 0x5, // about
+ 0x11c: 0xfc09, // itemscope
+ 0x11e: 0x14d08, // noscript
+ 0x11f: 0x15907, // classid
+ 0x120: 0x36203, // xmp
+ 0x121: 0x19604, // base
+ 0x123: 0x1c01, // s
+ 0x124: 0x36b07, // visible
+ 0x126: 0x37b02, // bb
+ 0x127: 0x9c04, // rows
+ 0x12d: 0x2450e, // formnovalidate
+ 0x131: 0x1f205, // track
+ 0x135: 0x18703, // div
+ 0x136: 0xac05, // async
+ 0x137: 0x31508, // property
+ 0x13a: 0x16c03, // dfn
+ 0x13e: 0xf605, // inert
+ 0x142: 0x10503, // del
+ 0x144: 0x25302, // h2
+ 0x147: 0x2c205, // style
+ 0x149: 0x29703, // img
+ 0x14a: 0xc05, // tbody
+ 0x14b: 0x7603, // dir
+ 0x14c: 0x2eb05, // xmlns
+ 0x14e: 0x1f08, // datalist
+ 0x14f: 0x32d04, // href
+ 0x150: 0x1f202, // tr
+ 0x151: 0x13e0a, // blockquote
+ 0x152: 0x18909, // valuetype
+ 0x155: 0xdb06, // footer
+ 0x157: 0x14f06, // script
+ 0x158: 0x1cf07, // colspan
+ 0x15d: 0x1730e, // defaultChecked
+ 0x15f: 0x2490a, // novalidate
+ 0x164: 0x1a408, // codetype
+ 0x165: 0x2c506, // legend
+ 0x16b: 0x1160b, // pauseonexit
+ 0x16c: 0x21f07, // caption
+ 0x16f: 0x26c07, // enabled
+ 0x173: 0x26206, // poster
+ 0x175: 0x30a05, // muted
+ 0x176: 0x11205, // ismap
+ 0x178: 0x2a903, // ins
+ 0x17a: 0xe004, // ruby
+ 0x17b: 0x37c02, // br
+ 0x17c: 0x8a0f, // defaultSelected
+ 0x17d: 0x7403, // kbd
+ 0x17f: 0x1c906, // source
+ 0x182: 0x9f04, // span
+ 0x184: 0x2d803, // max
+ 0x18a: 0x5b02, // dd
+ 0x18b: 0x13a04, // size
+ 0x18c: 0xa405, // media
+ 0x18d: 0x19208, // codebase
+ 0x18f: 0x4905, // embed
+ 0x192: 0x5104, // type
+ 0x193: 0xf005, // param
+ 0x194: 0x25b02, // h6
+ 0x197: 0x28304, // icon
+ 0x198: 0x12607, // bgcolor
+ 0x199: 0x2ad0f, // allowfullscreen
+ 0x19a: 0x12004, // time
+ 0x19b: 0x7803, // rev
+ 0x19d: 0x34208, // progress
+ 0x19e: 0x22606, // figure
+ 0x1a0: 0x6a02, // rp
+ 0x1a2: 0xa606, // dialog
+ 0x1a4: 0x2802, // rt
+ 0x1a7: 0x1e304, // area
+ 0x1a8: 0x7808, // reversed
+ 0x1aa: 0x32104, // open
+ 0x1ac: 0x2d204, // head
+ 0x1ad: 0x7005, // alink
+ 0x1af: 0x28003, // var
+ 0x1b0: 0x15f07, // details
+ 0x1b1: 0x2401, // i
+ 0x1b3: 0x1e02, // td
+ 0x1b4: 0xb707, // declare
+ 0x1b5: 0x8302, // ul
+ 0x1ba: 0x2fc06, // method
+ 0x1bd: 0x13007, // section
+ 0x1be: 0x22a08, // required
+ 0x1c2: 0x9805, // defer
+ 0x1c3: 0x37205, // vlink
+ 0x1c4: 0x15405, // title
+ 0x1c5: 0x2770a, // http-equiv
+ 0x1c6: 0x1fa07, // enctype
+ 0x1c7: 0x1ec07, // compact
+ 0x1c8: 0x2d809, // maxlength
+ 0x1c9: 0x16508, // selected
+ 0x1cc: 0xd105, // audio
+ 0x1cd: 0xc208, // longdesc
+ 0x1d1: 0xfb04, // cite
+ 0x1da: 0x2505, // start
+ 0x1de: 0x2d102, // th
+ 0x1df: 0x10808, // autoplay
+ 0x1e2: 0x7104, // link
+ 0x1e3: 0x206, // output
+ 0x1e5: 0x12204, // menu
+ 0x1e6: 0x2a405, // input
+ 0x1eb: 0x32403, // nav
+ 0x1ec: 0x31d03, // sub
+ 0x1ee: 0x1807, // charset
+ 0x1ef: 0x7f07, // default
+ 0x1f3: 0x2f205, // table
+ 0x1f4: 0x23b04, // form
+ 0x1f5: 0x23209, // truespeed
+ 0x1f6: 0x2f02, // rb
+ 0x1fb: 0x20b09, // translate
+ 0x1fd: 0x2e002, // h1
+}
diff --git a/vendor/github.com/tdewolff/minify/v2/html/html.go b/vendor/github.com/tdewolff/minify/v2/html/html.go
new file mode 100644
index 000000000..8342f72a8
--- /dev/null
+++ b/vendor/github.com/tdewolff/minify/v2/html/html.go
@@ -0,0 +1,511 @@
+// Package html minifies HTML5 following the specifications at http://www.w3.org/TR/html5/syntax.html.
+package html
+
+import (
+ "bytes"
+ "io"
+
+ "github.com/tdewolff/minify/v2"
+ "github.com/tdewolff/parse/v2"
+ "github.com/tdewolff/parse/v2/buffer"
+ "github.com/tdewolff/parse/v2/html"
+)
+
+var (
+ gtBytes = []byte(">")
+ isBytes = []byte("=")
+ spaceBytes = []byte(" ")
+ doctypeBytes = []byte("<!doctype html>")
+ jsMimeBytes = []byte("application/javascript")
+ cssMimeBytes = []byte("text/css")
+ htmlMimeBytes = []byte("text/html")
+ svgMimeBytes = []byte("image/svg+xml")
+ formMimeBytes = []byte("application/x-www-form-urlencoded")
+ mathMimeBytes = []byte("application/mathml+xml")
+ dataSchemeBytes = []byte("data:")
+ jsSchemeBytes = []byte("javascript:")
+ httpBytes = []byte("http")
+ radioBytes = []byte("radio")
+ onBytes = []byte("on")
+ textBytes = []byte("text")
+ noneBytes = []byte("none")
+ submitBytes = []byte("submit")
+ allBytes = []byte("all")
+ rectBytes = []byte("rect")
+ dataBytes = []byte("data")
+ getBytes = []byte("get")
+ autoBytes = []byte("auto")
+ oneBytes = []byte("one")
+ inlineParams = map[string]string{"inline": "1"}
+)
+
+////////////////////////////////////////////////////////////////
+
+// DefaultMinifier is the default minifier.
+var DefaultMinifier = &Minifier{}
+
+// Minifier is an HTML minifier.
+type Minifier struct {
+ KeepComments bool
+ KeepConditionalComments bool
+ KeepDefaultAttrVals bool
+ KeepDocumentTags bool
+ KeepEndTags bool
+ KeepQuotes bool
+ KeepWhitespace bool
+}
+
+// Minify minifies HTML data, it reads from r and writes to w.
+func Minify(m *minify.M, w io.Writer, r io.Reader, params map[string]string) error {
+ return DefaultMinifier.Minify(m, w, r, params)
+}
+
+// Minify minifies HTML data, it reads from r and writes to w.
+func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]string) error {
+ var rawTagHash Hash
+ var rawTagMediatype []byte
+
+ omitSpace := true // if true the next leading space is omitted
+ inPre := false
+
+ attrMinifyBuffer := buffer.NewWriter(make([]byte, 0, 64))
+ attrByteBuffer := make([]byte, 0, 64)
+
+ z := parse.NewInput(r)
+ defer z.Restore()
+
+ l := html.NewLexer(z)
+ tb := NewTokenBuffer(z, l)
+ for {
+ t := *tb.Shift()
+ switch t.TokenType {
+ case html.ErrorToken:
+ if _, err := w.Write(nil); err != nil {
+ return err
+ }
+ if l.Err() == io.EOF {
+ return nil
+ }
+ return l.Err()
+ case html.DoctypeToken:
+ w.Write(doctypeBytes)
+ case html.CommentToken:
+ if o.KeepComments {
+ w.Write(t.Data)
+ } else if o.KeepConditionalComments && 6 < len(t.Text) && (bytes.HasPrefix(t.Text, []byte("[if ")) || bytes.HasSuffix(t.Text, []byte("[endif]")) || bytes.HasSuffix(t.Text, []byte("[endif]--"))) {
+ // [if ...] is always 7 or more characters, [endif] is only encountered for downlevel-revealed
+ // see https://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx#syntax
+ if bytes.HasPrefix(t.Data, []byte("<!--[if ")) && bytes.HasSuffix(t.Data, []byte("<![endif]-->")) { // downlevel-hidden
+ begin := bytes.IndexByte(t.Data, '>') + 1
+ end := len(t.Data) - len("<![endif]-->")
+ w.Write(t.Data[:begin])
+ if err := o.Minify(m, w, buffer.NewReader(t.Data[begin:end]), nil); err != nil {
+ return minify.UpdateErrorPosition(err, z, t.Offset)
+ }
+ w.Write(t.Data[end:])
+ } else {
+ w.Write(t.Data) // downlevel-revealed or short downlevel-hidden
+ }
+ } else if 1 < len(t.Text) && t.Text[0] == '#' {
+ // SSI tags
+ w.Write(t.Data)
+ }
+ case html.SvgToken:
+ if err := m.MinifyMimetype(svgMimeBytes, w, buffer.NewReader(t.Data), nil); err != nil {
+ if err != minify.ErrNotExist {
+ return minify.UpdateErrorPosition(err, z, t.Offset)
+ }
+ w.Write(t.Data)
+ }
+ case html.MathToken:
+ if err := m.MinifyMimetype(mathMimeBytes, w, buffer.NewReader(t.Data), nil); err != nil {
+ if err != minify.ErrNotExist {
+ return minify.UpdateErrorPosition(err, z, t.Offset)
+ }
+ w.Write(t.Data)
+ }
+ case html.TextToken:
+ // CSS and JS minifiers for inline code
+ if rawTagHash != 0 {
+ if rawTagHash == Style || rawTagHash == Script || rawTagHash == Iframe {
+ var mimetype []byte
+ var params map[string]string
+ if rawTagHash == Iframe {
+ mimetype = htmlMimeBytes
+ } else if len(rawTagMediatype) > 0 {
+ mimetype, params = parse.Mediatype(rawTagMediatype)
+ } else if rawTagHash == Script {
+ mimetype = jsMimeBytes
+ } else if rawTagHash == Style {
+ mimetype = cssMimeBytes
+ }
+ if err := m.MinifyMimetype(mimetype, w, buffer.NewReader(t.Data), params); err != nil {
+ if err != minify.ErrNotExist {
+ return minify.UpdateErrorPosition(err, z, t.Offset)
+ }
+ w.Write(t.Data)
+ }
+ } else {
+ w.Write(t.Data)
+ }
+ } else if inPre {
+ w.Write(t.Data)
+ } else {
+ t.Data = parse.ReplaceMultipleWhitespaceAndEntities(t.Data, EntitiesMap, TextRevEntitiesMap)
+
+ // whitespace removal; trim left
+ if omitSpace && parse.IsWhitespace(t.Data[0]) {
+ t.Data = t.Data[1:]
+ }
+
+ // whitespace removal; trim right
+ omitSpace = false
+ if len(t.Data) == 0 {
+ omitSpace = true
+ } else if parse.IsWhitespace(t.Data[len(t.Data)-1]) {
+ omitSpace = true
+ i := 0
+ for {
+ next := tb.Peek(i)
+ // trim if EOF, text token with leading whitespace or block token
+ if next.TokenType == html.ErrorToken {
+ t.Data = t.Data[:len(t.Data)-1]
+ omitSpace = false
+ break
+ } else if next.TokenType == html.TextToken {
+ // this only happens when a comment, doctype or phrasing end tag (only for !o.KeepWhitespace) was in between
+ // remove if the text token starts with a whitespace
+ if len(next.Data) > 0 && parse.IsWhitespace(next.Data[0]) {
+ t.Data = t.Data[:len(t.Data)-1]
+ omitSpace = false
+ }
+ break
+ } else if next.TokenType == html.StartTagToken || next.TokenType == html.EndTagToken {
+ if o.KeepWhitespace {
+ break
+ }
+ // remove when followed up by a block tag
+ if next.Traits&nonPhrasingTag != 0 {
+ t.Data = t.Data[:len(t.Data)-1]
+ omitSpace = false
+ break
+ } else if next.TokenType == html.StartTagToken {
+ break
+ }
+ }
+ i++
+ }
+ }
+
+ w.Write(t.Data)
+ }
+ case html.StartTagToken, html.EndTagToken:
+ rawTagHash = 0
+ hasAttributes := false
+ if t.TokenType == html.StartTagToken {
+ if next := tb.Peek(0); next.TokenType == html.AttributeToken {
+ hasAttributes = true
+ }
+ if t.Traits&rawTag != 0 {
+ // ignore empty script and style tags
+ if !hasAttributes && (t.Hash == Script || t.Hash == Style) {
+ if next := tb.Peek(1); next.TokenType == html.EndTagToken {
+ tb.Shift()
+ tb.Shift()
+ break
+ }
+ }
+ rawTagHash = t.Hash
+ rawTagMediatype = nil
+
+ // do not minify content of <style amp-boilerplate>
+ if hasAttributes && t.Hash == Style {
+ if attrs := tb.Attributes(Amp_Boilerplate); attrs[0] != nil {
+ rawTagHash = 0
+ }
+ }
+ }
+ } else if t.Hash == Template {
+ omitSpace = true // EndTagToken
+ }
+
+ if t.Hash == Pre {
+ inPre = t.TokenType == html.StartTagToken
+ }
+
+ // remove superfluous tags, except for html, head and body tags when KeepDocumentTags is set
+ if !hasAttributes && (!o.KeepDocumentTags && (t.Hash == Html || t.Hash == Head || t.Hash == Body) || t.Hash == Colgroup) {
+ break
+ } else if t.TokenType == html.EndTagToken {
+ omitEndTag := false
+ if !o.KeepEndTags {
+ if t.Hash == Thead || t.Hash == Tbody || t.Hash == Tfoot || t.Hash == Tr || t.Hash == Th ||
+ t.Hash == Td || t.Hash == Option || t.Hash == Dd || t.Hash == Dt || t.Hash == Li ||
+ t.Hash == Rb || t.Hash == Rt || t.Hash == Rtc || t.Hash == Rp {
+ omitEndTag = true // omit end tags
+ } else if t.Hash == P {
+ i := 0
+ for {
+ next := tb.Peek(i)
+ i++
+ // continue if text token is empty or whitespace
+ if next.TokenType == html.TextToken && parse.IsAllWhitespace(next.Data) {
+ continue
+ }
+ if next.TokenType == html.ErrorToken || next.TokenType == html.EndTagToken && next.Traits&keepPTag == 0 || next.TokenType == html.StartTagToken && next.Traits&omitPTag != 0 {
+ omitEndTag = true // omit p end tag
+ }
+ break
+ }
+ } else if t.Hash == Optgroup {
+ i := 0
+ for {
+ next := tb.Peek(i)
+ i++
+ // continue if text token
+ if next.TokenType == html.TextToken {
+ continue
+ }
+ if next.TokenType == html.ErrorToken || next.Hash != Option {
+ omitEndTag = true // omit optgroup end tag
+ }
+ break
+ }
+ }
+ }
+
+ if o.KeepWhitespace || t.Traits&objectTag != 0 {
+ omitSpace = false
+ } else if t.Traits&nonPhrasingTag != 0 {
+ omitSpace = true // omit spaces after block elements
+ }
+
+ if !omitEndTag {
+ if len(t.Data) > 3+len(t.Text) {
+ t.Data[2+len(t.Text)] = '>'
+ t.Data = t.Data[:3+len(t.Text)]
+ }
+ w.Write(t.Data)
+ }
+
+ // skip text in select and optgroup tags
+ if t.Hash == Option || t.Hash == Optgroup {
+ if next := tb.Peek(0); next.TokenType == html.TextToken {
+ tb.Shift()
+ }
+ }
+ break
+ }
+
+ if o.KeepWhitespace || t.Traits&objectTag != 0 {
+ omitSpace = false
+ } else if t.Traits&nonPhrasingTag != 0 {
+ omitSpace = true // omit spaces after block elements
+ }
+
+ w.Write(t.Data)
+
+ if hasAttributes {
+ if t.Hash == Meta {
+ attrs := tb.Attributes(Content, Http_Equiv, Charset, Name)
+ if content := attrs[0]; content != nil {
+ if httpEquiv := attrs[1]; httpEquiv != nil {
+ httpEquiv.AttrVal = parse.TrimWhitespace(httpEquiv.AttrVal)
+ if charset := attrs[2]; charset == nil && parse.EqualFold(httpEquiv.AttrVal, []byte("content-type")) {
+ content.AttrVal = minify.Mediatype(content.AttrVal)
+ if bytes.Equal(content.AttrVal, []byte("text/html;charset=utf-8")) {
+ httpEquiv.Text = nil
+ content.Text = []byte("charset")
+ content.Hash = Charset
+ content.AttrVal = []byte("utf-8")
+ }
+ }
+ }
+ if name := attrs[3]; name != nil {
+ name.AttrVal = parse.TrimWhitespace(name.AttrVal)
+ if parse.EqualFold(name.AttrVal, []byte("keywords")) {
+ content.AttrVal = bytes.ReplaceAll(content.AttrVal, []byte(", "), []byte(","))
+ } else if parse.EqualFold(name.AttrVal, []byte("viewport")) {
+ content.AttrVal = bytes.ReplaceAll(content.AttrVal, []byte(" "), []byte(""))
+ for i := 0; i < len(content.AttrVal); i++ {
+ if content.AttrVal[i] == '=' && i+2 < len(content.AttrVal) {
+ i++
+ if n := parse.Number(content.AttrVal[i:]); n > 0 {
+ minNum := minify.Number(content.AttrVal[i:i+n], -1)
+ if len(minNum) < n {
+ copy(content.AttrVal[i:i+len(minNum)], minNum)
+ copy(content.AttrVal[i+len(minNum):], content.AttrVal[i+n:])
+ content.AttrVal = content.AttrVal[:len(content.AttrVal)+len(minNum)-n]
+ }
+ i += len(minNum)
+ }
+ i-- // mitigate for-loop increase
+ }
+ }
+ }
+ }
+ }
+ } else if t.Hash == Script {
+ attrs := tb.Attributes(Src, Charset)
+ if attrs[0] != nil && attrs[1] != nil {
+ attrs[1].Text = nil
+ }
+ } else if t.Hash == Input {
+ attrs := tb.Attributes(Type, Value)
+ if t, value := attrs[0], attrs[1]; t != nil && value != nil {
+ isRadio := parse.EqualFold(t.AttrVal, radioBytes)
+ if !isRadio && len(value.AttrVal) == 0 {
+ value.Text = nil
+ } else if isRadio && parse.EqualFold(value.AttrVal, onBytes) {
+ value.Text = nil
+ }
+ }
+ } else if t.Hash == A {
+ attrs := tb.Attributes(Id, Name)
+ if id, name := attrs[0], attrs[1]; id != nil && name != nil {
+ if bytes.Equal(id.AttrVal, name.AttrVal) {
+ name.Text = nil
+ }
+ }
+ }
+
+ // write attributes
+ for {
+ attr := *tb.Shift()
+ if attr.TokenType != html.AttributeToken {
+ break
+ } else if attr.Text == nil {
+ continue // removed attribute
+ }
+
+ val := attr.AttrVal
+ if attr.Traits&trimAttr != 0 {
+ val = parse.ReplaceMultipleWhitespaceAndEntities(val, EntitiesMap, nil)
+ val = parse.TrimWhitespace(val)
+ } else {
+ val = parse.ReplaceEntities(val, EntitiesMap, nil)
+ }
+ if t.Traits != 0 {
+ if len(val) == 0 && (attr.Hash == Class ||
+ attr.Hash == Dir ||
+ attr.Hash == Id ||
+ attr.Hash == Name ||
+ attr.Hash == Action && t.Hash == Form) {
+ continue // omit empty attribute values
+ }
+ if attr.Traits&caselessAttr != 0 {
+ val = parse.ToLower(val)
+ if attr.Hash == Enctype || attr.Hash == Codetype || attr.Hash == Accept || attr.Hash == Type && (t.Hash == A || t.Hash == Link || t.Hash == Embed || t.Hash == Object || t.Hash == Source || t.Hash == Script || t.Hash == Style) {
+ val = minify.Mediatype(val)
+ }
+ }
+ if rawTagHash != 0 && attr.Hash == Type {
+ rawTagMediatype = parse.Copy(val)
+ }
+
+ // default attribute values can be omitted
+ if !o.KeepDefaultAttrVals && (attr.Hash == Type && (t.Hash == Script && jsMimetypes[string(val)] ||
+ t.Hash == Style && bytes.Equal(val, cssMimeBytes) ||
+ t.Hash == Link && bytes.Equal(val, cssMimeBytes) ||
+ t.Hash == Input && bytes.Equal(val, textBytes) ||
+ t.Hash == Button && bytes.Equal(val, submitBytes)) ||
+ attr.Hash == Language && t.Hash == Script ||
+ attr.Hash == Method && bytes.Equal(val, getBytes) ||
+ attr.Hash == Enctype && bytes.Equal(val, formMimeBytes) ||
+ attr.Hash == Colspan && bytes.Equal(val, oneBytes) ||
+ attr.Hash == Rowspan && bytes.Equal(val, oneBytes) ||
+ attr.Hash == Shape && bytes.Equal(val, rectBytes) ||
+ attr.Hash == Span && bytes.Equal(val, oneBytes) ||
+ attr.Hash == Clear && bytes.Equal(val, noneBytes) ||
+ attr.Hash == Frameborder && bytes.Equal(val, oneBytes) ||
+ attr.Hash == Scrolling && bytes.Equal(val, autoBytes) ||
+ attr.Hash == Valuetype && bytes.Equal(val, dataBytes) ||
+ attr.Hash == Media && t.Hash == Style && bytes.Equal(val, allBytes)) {
+ continue
+ }
+
+ if attr.Hash == Style {
+ // CSS minifier for attribute inline code
+ val = parse.TrimWhitespace(val)
+ attrMinifyBuffer.Reset()
+ if err := m.MinifyMimetype(cssMimeBytes, attrMinifyBuffer, buffer.NewReader(val), inlineParams); err == nil {
+ val = attrMinifyBuffer.Bytes()
+ } else if err != minify.ErrNotExist {
+ return minify.UpdateErrorPosition(err, z, attr.Offset)
+ }
+ if len(val) == 0 {
+ continue
+ }
+ } else if len(attr.Text) > 2 && attr.Text[0] == 'o' && attr.Text[1] == 'n' {
+ // JS minifier for attribute inline code
+ val = parse.TrimWhitespace(val)
+ if len(val) >= 11 && parse.EqualFold(val[:11], jsSchemeBytes) {
+ val = val[11:]
+ }
+ attrMinifyBuffer.Reset()
+ if err := m.MinifyMimetype(jsMimeBytes, attrMinifyBuffer, buffer.NewReader(val), nil); err == nil {
+ val = attrMinifyBuffer.Bytes()
+ } else if err != minify.ErrNotExist {
+ return minify.UpdateErrorPosition(err, z, attr.Offset)
+ }
+ if len(val) == 0 {
+ continue
+ }
+ } else if attr.Traits&urlAttr != 0 { // anchors are already handled
+ val = parse.TrimWhitespace(val)
+ if 5 < len(val) {
+ if parse.EqualFold(val[:4], httpBytes) {
+ if val[4] == ':' {
+ if m.URL != nil && m.URL.Scheme == "http" {
+ val = val[5:]
+ } else {
+ parse.ToLower(val[:4])
+ }
+ } else if (val[4] == 's' || val[4] == 'S') && val[5] == ':' {
+ if m.URL != nil && m.URL.Scheme == "https" {
+ val = val[6:]
+ } else {
+ parse.ToLower(val[:5])
+ }
+ }
+ } else if parse.EqualFold(val[:5], dataSchemeBytes) {
+ val = minify.DataURI(m, val)
+ }
+ }
+ }
+ }
+
+ w.Write(spaceBytes)
+ w.Write(attr.Text)
+ if len(val) > 0 && attr.Traits&booleanAttr == 0 {
+ w.Write(isBytes)
+
+ // use double quotes for RDFa attributes
+ isXML := attr.Hash == Vocab || attr.Hash == Typeof || attr.Hash == Property || attr.Hash == Resource || attr.Hash == Prefix || attr.Hash == Content || attr.Hash == About || attr.Hash == Rev || attr.Hash == Datatype || attr.Hash == Inlist
+
+ // no quotes if possible, else prefer single or double depending on which occurs more often in value
+ val = html.EscapeAttrVal(&attrByteBuffer, attr.AttrVal, val, o.KeepQuotes || isXML)
+ w.Write(val)
+ }
+ }
+ } else {
+ _ = tb.Shift() // StartTagClose
+ }
+ w.Write(gtBytes)
+
+ // skip text in select and optgroup tags
+ if t.Hash == Select || t.Hash == Optgroup {
+ if next := tb.Peek(0); next.TokenType == html.TextToken {
+ tb.Shift()
+ }
+ }
+
+ // keep space after phrasing tags (<i>, <span>, ...) FontAwesome etc.
+ if t.TokenType == html.StartTagToken && t.Traits&nonPhrasingTag == 0 {
+ if next := tb.Peek(0); next.Hash == t.Hash && next.TokenType == html.EndTagToken {
+ omitSpace = false
+ }
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/tdewolff/minify/v2/html/table.go b/vendor/github.com/tdewolff/minify/v2/html/table.go
new file mode 100644
index 000000000..a42782b03
--- /dev/null
+++ b/vendor/github.com/tdewolff/minify/v2/html/table.go
@@ -0,0 +1,1346 @@
+package html
+
+type traits uint16
+
+const (
+ normalTag traits = 1 << iota
+ rawTag // raw tags need special processing for their content
+ nonPhrasingTag // non-phrasing elements are unaffected by whitespace, remove spaces around these tags
+ objectTag // content tags with a few exclusions, keep spaces after these open/close tags
+ omitPTag // omit p end tag if it is followed by this start tag
+ keepPTag // keep p end tag if it is followed by this end tag
+)
+
+const (
+ booleanAttr traits = 1 << iota
+ caselessAttr
+ urlAttr
+ trimAttr
+)
+
+var tagMap = map[Hash]traits{
+ A: keepPTag,
+ Abbr: normalTag,
+ Address: nonPhrasingTag | omitPTag,
+ Area: normalTag,
+ Article: nonPhrasingTag | omitPTag,
+ Aside: nonPhrasingTag | omitPTag,
+ Audio: keepPTag,
+ B: normalTag,
+ Base: normalTag,
+ Bb: normalTag,
+ Bdi: normalTag,
+ Bdo: normalTag,
+ Blockquote: nonPhrasingTag | omitPTag,
+ Body: nonPhrasingTag,
+ Br: nonPhrasingTag,
+ Button: objectTag,
+ Canvas: objectTag,
+ Caption: nonPhrasingTag,
+ Cite: normalTag,
+ Code: normalTag,
+ Col: nonPhrasingTag,
+ Colgroup: nonPhrasingTag,
+ Data: normalTag,
+ Datalist: normalTag,
+ Dd: nonPhrasingTag,
+ Del: keepPTag,
+ Details: omitPTag,
+ Dfn: normalTag,
+ Dialog: normalTag,
+ Div: nonPhrasingTag | omitPTag,
+ Dl: nonPhrasingTag | omitPTag,
+ Dt: nonPhrasingTag,
+ Em: normalTag,
+ Embed: nonPhrasingTag,
+ Fieldset: nonPhrasingTag | omitPTag,
+ Figcaption: nonPhrasingTag | omitPTag,
+ Figure: nonPhrasingTag | omitPTag,
+ Footer: nonPhrasingTag | omitPTag,
+ Form: nonPhrasingTag | omitPTag,
+ H1: nonPhrasingTag | omitPTag,
+ H2: nonPhrasingTag | omitPTag,
+ H3: nonPhrasingTag | omitPTag,
+ H4: nonPhrasingTag | omitPTag,
+ H5: nonPhrasingTag | omitPTag,
+ H6: nonPhrasingTag | omitPTag,
+ Head: nonPhrasingTag,
+ Header: nonPhrasingTag | omitPTag,
+ Hgroup: nonPhrasingTag,
+ Hr: nonPhrasingTag | omitPTag,
+ Html: nonPhrasingTag,
+ I: normalTag,
+ Iframe: rawTag | objectTag,
+ Img: objectTag,
+ Input: objectTag,
+ Ins: keepPTag,
+ Kbd: normalTag,
+ Label: normalTag,
+ Legend: normalTag,
+ Li: nonPhrasingTag,
+ Link: normalTag,
+ Main: nonPhrasingTag | omitPTag,
+ Map: keepPTag,
+ Mark: normalTag,
+ Math: rawTag,
+ Menu: omitPTag,
+ Meta: nonPhrasingTag,
+ Meter: objectTag,
+ Nav: nonPhrasingTag | omitPTag,
+ Noscript: nonPhrasingTag | keepPTag,
+ Object: objectTag,
+ Ol: nonPhrasingTag | omitPTag,
+ Optgroup: normalTag,
+ Option: normalTag,
+ Output: nonPhrasingTag,
+ P: nonPhrasingTag | omitPTag,
+ Param: normalTag,
+ Picture: normalTag,
+ Pre: nonPhrasingTag | omitPTag,
+ Progress: objectTag,
+ Q: objectTag,
+ Rp: normalTag,
+ Rt: normalTag,
+ Ruby: normalTag,
+ S: normalTag,
+ Samp: normalTag,
+ Script: rawTag,
+ Section: nonPhrasingTag | omitPTag,
+ Select: objectTag,
+ Slot: normalTag,
+ Small: normalTag,
+ Source: normalTag,
+ Span: normalTag,
+ Strong: normalTag,
+ Style: rawTag | nonPhrasingTag,
+ Sub: normalTag,
+ Summary: normalTag,
+ Sup: normalTag,
+ Svg: rawTag | objectTag,
+ Table: nonPhrasingTag | omitPTag,
+ Tbody: nonPhrasingTag,
+ Td: nonPhrasingTag,
+ Template: normalTag,
+ Textarea: rawTag | objectTag,
+ Tfoot: nonPhrasingTag,
+ Th: nonPhrasingTag,
+ Thead: nonPhrasingTag,
+ Time: normalTag,
+ Title: nonPhrasingTag,
+ Tr: nonPhrasingTag,
+ Track: normalTag,
+ U: normalTag,
+ Ul: nonPhrasingTag | omitPTag,
+ Var: normalTag,
+ Video: objectTag | keepPTag,
+ Wbr: normalTag,
+}
+
+var attrMap = map[Hash]traits{
+ Accept: caselessAttr,
+ Accept_Charset: caselessAttr,
+ Action: urlAttr,
+ Align: caselessAttr,
+ Alink: caselessAttr,
+ Allowfullscreen: booleanAttr,
+ Async: booleanAttr,
+ Autofocus: booleanAttr,
+ Autoplay: booleanAttr,
+ Axis: caselessAttr,
+ Background: urlAttr,
+ Bgcolor: caselessAttr,
+ Charset: caselessAttr,
+ Checked: booleanAttr,
+ Cite: urlAttr,
+ Class: trimAttr,
+ Classid: urlAttr,
+ Clear: caselessAttr,
+ Codebase: urlAttr,
+ Codetype: caselessAttr,
+ Color: caselessAttr,
+ Cols: trimAttr,
+ Colspan: trimAttr,
+ Compact: booleanAttr,
+ Controls: booleanAttr,
+ Data: urlAttr,
+ Declare: booleanAttr,
+ Default: booleanAttr,
+ DefaultChecked: booleanAttr,
+ DefaultMuted: booleanAttr,
+ DefaultSelected: booleanAttr,
+ Defer: booleanAttr,
+ Dir: caselessAttr,
+ Disabled: booleanAttr,
+ Enabled: booleanAttr,
+ Enctype: caselessAttr,
+ Face: caselessAttr,
+ Formaction: urlAttr,
+ Formnovalidate: booleanAttr,
+ Frame: caselessAttr,
+ Hidden: booleanAttr,
+ Href: urlAttr,
+ Hreflang: caselessAttr,
+ Http_Equiv: caselessAttr,
+ Icon: urlAttr,
+ Inert: booleanAttr,
+ Ismap: booleanAttr,
+ Itemscope: booleanAttr,
+ Lang: caselessAttr,
+ Language: caselessAttr,
+ Link: caselessAttr,
+ Longdesc: urlAttr,
+ Manifest: urlAttr,
+ Maxlength: trimAttr,
+ Media: caselessAttr | trimAttr,
+ Method: caselessAttr,
+ Multiple: booleanAttr,
+ Muted: booleanAttr,
+ Nohref: booleanAttr,
+ Noresize: booleanAttr,
+ Noshade: booleanAttr,
+ Novalidate: booleanAttr,
+ Nowrap: booleanAttr,
+ Open: booleanAttr,
+ Pauseonexit: booleanAttr,
+ Poster: urlAttr,
+ Profile: urlAttr,
+ Readonly: booleanAttr,
+ Rel: caselessAttr,
+ Required: booleanAttr,
+ Rev: caselessAttr,
+ Reversed: booleanAttr,
+ Rows: trimAttr,
+ Rowspan: trimAttr,
+ Rules: caselessAttr,
+ Scope: caselessAttr,
+ Scoped: booleanAttr,
+ Scrolling: caselessAttr,
+ Seamless: booleanAttr,
+ Selected: booleanAttr,
+ Shape: caselessAttr,
+ Size: trimAttr,
+ Sortable: booleanAttr,
+ Span: trimAttr,
+ Src: urlAttr,
+ Srcset: trimAttr,
+ Tabindex: trimAttr,
+ Target: caselessAttr,
+ Text: caselessAttr,
+ Translate: caselessAttr,
+ Truespeed: booleanAttr,
+ Type: caselessAttr,
+ Typemustmatch: booleanAttr,
+ Undeterminate: booleanAttr,
+ Usemap: urlAttr,
+ Valign: caselessAttr,
+ Valuetype: caselessAttr,
+ Vlink: caselessAttr,
+ Visible: booleanAttr,
+ Xmlns: urlAttr,
+}
+
+var jsMimetypes = map[string]bool{
+ "text/javascript": true,
+ "application/javascript": true,
+}
+
+// EntitiesMap are all named character entities.
+var EntitiesMap = map[string][]byte{
+ "AElig": []byte("&#198;"),
+ "AMP": []byte("&"),
+ "Aacute": []byte("&#193;"),
+ "Abreve": []byte("&#258;"),
+ "Acirc": []byte("&#194;"),
+ "Agrave": []byte("&#192;"),
+ "Alpha": []byte("&#913;"),
+ "Amacr": []byte("&#256;"),
+ "Aogon": []byte("&#260;"),
+ "ApplyFunction": []byte("&af;"),
+ "Aring": []byte("&#197;"),
+ "Assign": []byte("&#8788;"),
+ "Atilde": []byte("&#195;"),
+ "Backslash": []byte("&#8726;"),
+ "Barwed": []byte("&#8966;"),
+ "Because": []byte("&#8757;"),
+ "Bernoullis": []byte("&Bscr;"),
+ "Breve": []byte("&#728;"),
+ "Bumpeq": []byte("&bump;"),
+ "Cacute": []byte("&#262;"),
+ "CapitalDifferentialD": []byte("&DD;"),
+ "Cayleys": []byte("&Cfr;"),
+ "Ccaron": []byte("&#268;"),
+ "Ccedil": []byte("&#199;"),
+ "Ccirc": []byte("&#264;"),
+ "Cconint": []byte("&#8752;"),
+ "Cedilla": []byte("&#184;"),
+ "CenterDot": []byte("&#183;"),
+ "CircleDot": []byte("&odot;"),
+ "CircleMinus": []byte("&#8854;"),
+ "CirclePlus": []byte("&#8853;"),
+ "CircleTimes": []byte("&#8855;"),
+ "ClockwiseContourIntegral": []byte("&#8754;"),
+ "CloseCurlyDoubleQuote": []byte("&#8221;"),
+ "CloseCurlyQuote": []byte("&#8217;"),
+ "Congruent": []byte("&#8801;"),
+ "Conint": []byte("&#8751;"),
+ "ContourIntegral": []byte("&oint;"),
+ "Coproduct": []byte("&#8720;"),
+ "CounterClockwiseContourIntegral": []byte("&#8755;"),
+ "CupCap": []byte("&#8781;"),
+ "DDotrahd": []byte("&#10513;"),
+ "Dagger": []byte("&#8225;"),
+ "Dcaron": []byte("&#270;"),
+ "Delta": []byte("&#916;"),
+ "DiacriticalAcute": []byte("&#180;"),
+ "DiacriticalDot": []byte("&dot;"),
+ "DiacriticalDoubleAcute": []byte("&#733;"),
+ "DiacriticalGrave": []byte("`"),
+ "DiacriticalTilde": []byte("&#732;"),
+ "Diamond": []byte("&diam;"),
+ "DifferentialD": []byte("&dd;"),
+ "DotDot": []byte("&#8412;"),
+ "DotEqual": []byte("&#8784;"),
+ "DoubleContourIntegral": []byte("&#8751;"),
+ "DoubleDot": []byte("&Dot;"),
+ "DoubleDownArrow": []byte("&dArr;"),
+ "DoubleLeftArrow": []byte("&lArr;"),
+ "DoubleLeftRightArrow": []byte("&iff;"),
+ "DoubleLeftTee": []byte("&Dashv;"),
+ "DoubleLongLeftArrow": []byte("&xlArr;"),
+ "DoubleLongLeftRightArrow": []byte("&xhArr;"),
+ "DoubleLongRightArrow": []byte("&xrArr;"),
+ "DoubleRightArrow": []byte("&rArr;"),
+ "DoubleRightTee": []byte("&#8872;"),
+ "DoubleUpArrow": []byte("&uArr;"),
+ "DoubleUpDownArrow": []byte("&vArr;"),
+ "DoubleVerticalBar": []byte("&par;"),
+ "DownArrow": []byte("&darr;"),
+ "DownArrowBar": []byte("&#10515;"),
+ "DownArrowUpArrow": []byte("&#8693;"),
+ "DownBreve": []byte("&#785;"),
+ "DownLeftRightVector": []byte("&#10576;"),
+ "DownLeftTeeVector": []byte("&#10590;"),
+ "DownLeftVector": []byte("&#8637;"),
+ "DownLeftVectorBar": []byte("&#10582;"),
+ "DownRightTeeVector": []byte("&#10591;"),
+ "DownRightVector": []byte("&#8641;"),
+ "DownRightVectorBar": []byte("&#10583;"),
+ "DownTee": []byte("&top;"),
+ "DownTeeArrow": []byte("&#8615;"),
+ "Downarrow": []byte("&dArr;"),
+ "Dstrok": []byte("&#272;"),
+ "Eacute": []byte("&#201;"),
+ "Ecaron": []byte("&#282;"),
+ "Ecirc": []byte("&#202;"),
+ "Egrave": []byte("&#200;"),
+ "Element": []byte("&in;"),
+ "Emacr": []byte("&#274;"),
+ "EmptySmallSquare": []byte("&#9723;"),
+ "EmptyVerySmallSquare": []byte("&#9643;"),
+ "Eogon": []byte("&#280;"),
+ "Epsilon": []byte("&#917;"),
+ "EqualTilde": []byte("&esim;"),
+ "Equilibrium": []byte("&#8652;"),
+ "Exists": []byte("&#8707;"),
+ "ExponentialE": []byte("&ee;"),
+ "FilledSmallSquare": []byte("&#9724;"),
+ "FilledVerySmallSquare": []byte("&squf;"),
+ "ForAll": []byte("&#8704;"),
+ "Fouriertrf": []byte("&Fscr;"),
+ "GT": []byte(">"),
+ "Gamma": []byte("&#915;"),
+ "Gammad": []byte("&#988;"),
+ "Gbreve": []byte("&#286;"),
+ "Gcedil": []byte("&#290;"),
+ "Gcirc": []byte("&#284;"),
+ "GreaterEqual": []byte("&ge;"),
+ "GreaterEqualLess": []byte("&gel;"),
+ "GreaterFullEqual": []byte("&gE;"),
+ "GreaterGreater": []byte("&#10914;"),
+ "GreaterLess": []byte("&gl;"),
+ "GreaterSlantEqual": []byte("&ges;"),
+ "GreaterTilde": []byte("&gsim;"),
+ "HARDcy": []byte("&#1066;"),
+ "Hacek": []byte("&#711;"),
+ "Hat": []byte("^"),
+ "Hcirc": []byte("&#292;"),
+ "HilbertSpace": []byte("&Hscr;"),
+ "HorizontalLine": []byte("&boxh;"),
+ "Hstrok": []byte("&#294;"),
+ "HumpDownHump": []byte("&bump;"),
+ "HumpEqual": []byte("&#8783;"),
+ "IJlig": []byte("&#306;"),
+ "Iacute": []byte("&#205;"),
+ "Icirc": []byte("&#206;"),
+ "Ifr": []byte("&Im;"),
+ "Igrave": []byte("&#204;"),
+ "Imacr": []byte("&#298;"),
+ "ImaginaryI": []byte("&ii;"),
+ "Implies": []byte("&rArr;"),
+ "Integral": []byte("&int;"),
+ "Intersection": []byte("&xcap;"),
+ "InvisibleComma": []byte("&ic;"),
+ "InvisibleTimes": []byte("&it;"),
+ "Iogon": []byte("&#302;"),
+ "Itilde": []byte("&#296;"),
+ "Jcirc": []byte("&#308;"),
+ "Jsercy": []byte("&#1032;"),
+ "Kappa": []byte("&#922;"),
+ "Kcedil": []byte("&#310;"),
+ "LT": []byte("<"),
+ "Lacute": []byte("&#313;"),
+ "Lambda": []byte("&#923;"),
+ "Laplacetrf": []byte("&Lscr;"),
+ "Lcaron": []byte("&#317;"),
+ "Lcedil": []byte("&#315;"),
+ "LeftAngleBracket": []byte("&lang;"),
+ "LeftArrow": []byte("&larr;"),
+ "LeftArrowBar": []byte("&#8676;"),
+ "LeftArrowRightArrow": []byte("&#8646;"),
+ "LeftCeiling": []byte("&#8968;"),
+ "LeftDoubleBracket": []byte("&lobrk;"),
+ "LeftDownTeeVector": []byte("&#10593;"),
+ "LeftDownVector": []byte("&#8643;"),
+ "LeftDownVectorBar": []byte("&#10585;"),
+ "LeftFloor": []byte("&#8970;"),
+ "LeftRightArrow": []byte("&harr;"),
+ "LeftRightVector": []byte("&#10574;"),
+ "LeftTee": []byte("&#8867;"),
+ "LeftTeeArrow": []byte("&#8612;"),
+ "LeftTeeVector": []byte("&#10586;"),
+ "LeftTriangle": []byte("&#8882;"),
+ "LeftTriangleBar": []byte("&#10703;"),
+ "LeftTriangleEqual": []byte("&#8884;"),
+ "LeftUpDownVector": []byte("&#10577;"),
+ "LeftUpTeeVector": []byte("&#10592;"),
+ "LeftUpVector": []byte("&#8639;"),
+ "LeftUpVectorBar": []byte("&#10584;"),
+ "LeftVector": []byte("&#8636;"),
+ "LeftVectorBar": []byte("&#10578;"),
+ "Leftarrow": []byte("&lArr;"),
+ "Leftrightarrow": []byte("&iff;"),
+ "LessEqualGreater": []byte("&leg;"),
+ "LessFullEqual": []byte("&lE;"),
+ "LessGreater": []byte("&lg;"),
+ "LessLess": []byte("&#10913;"),
+ "LessSlantEqual": []byte("&les;"),
+ "LessTilde": []byte("&lsim;"),
+ "Lleftarrow": []byte("&#8666;"),
+ "Lmidot": []byte("&#319;"),
+ "LongLeftArrow": []byte("&xlarr;"),
+ "LongLeftRightArrow": []byte("&xharr;"),
+ "LongRightArrow": []byte("&xrarr;"),
+ "Longleftarrow": []byte("&xlArr;"),
+ "Longleftrightarrow": []byte("&xhArr;"),
+ "Longrightarrow": []byte("&xrArr;"),
+ "LowerLeftArrow": []byte("&#8601;"),
+ "LowerRightArrow": []byte("&#8600;"),
+ "Lstrok": []byte("&#321;"),
+ "MediumSpace": []byte("&#8287;"),
+ "Mellintrf": []byte("&Mscr;"),
+ "MinusPlus": []byte("&mp;"),
+ "Nacute": []byte("&#323;"),
+ "Ncaron": []byte("&#327;"),
+ "Ncedil": []byte("&#325;"),
+ "NegativeMediumSpace": []byte("&#8203;"),
+ "NegativeThickSpace": []byte("&#8203;"),
+ "NegativeThinSpace": []byte("&#8203;"),
+ "NegativeVeryThinSpace": []byte("&#8203;"),
+ "NestedGreaterGreater": []byte("&Gt;"),
+ "NestedLessLess": []byte("&Lt;"),
+ "NewLine": []byte("\n"),
+ "NoBreak": []byte("&#8288;"),
+ "NonBreakingSpace": []byte("&#160;"),
+ "NotCongruent": []byte("&#8802;"),
+ "NotCupCap": []byte("&#8813;"),
+ "NotDoubleVerticalBar": []byte("&npar;"),
+ "NotElement": []byte("&#8713;"),
+ "NotEqual": []byte("&ne;"),
+ "NotExists": []byte("&#8708;"),
+ "NotGreater": []byte("&ngt;"),
+ "NotGreaterEqual": []byte("&nge;"),
+ "NotGreaterLess": []byte("&ntgl;"),
+ "NotGreaterTilde": []byte("&#8821;"),
+ "NotLeftTriangle": []byte("&#8938;"),
+ "NotLeftTriangleEqual": []byte("&#8940;"),
+ "NotLess": []byte("&nlt;"),
+ "NotLessEqual": []byte("&nle;"),
+ "NotLessGreater": []byte("&ntlg;"),
+ "NotLessTilde": []byte("&#8820;"),
+ "NotPrecedes": []byte("&npr;"),
+ "NotPrecedesSlantEqual": []byte("&#8928;"),
+ "NotReverseElement": []byte("&#8716;"),
+ "NotRightTriangle": []byte("&#8939;"),
+ "NotRightTriangleEqual": []byte("&#8941;"),
+ "NotSquareSubsetEqual": []byte("&#8930;"),
+ "NotSquareSupersetEqual": []byte("&#8931;"),
+ "NotSubsetEqual": []byte("&#8840;"),
+ "NotSucceeds": []byte("&nsc;"),
+ "NotSucceedsSlantEqual": []byte("&#8929;"),
+ "NotSupersetEqual": []byte("&#8841;"),
+ "NotTilde": []byte("&nsim;"),
+ "NotTildeEqual": []byte("&#8772;"),
+ "NotTildeFullEqual": []byte("&#8775;"),
+ "NotTildeTilde": []byte("&nap;"),
+ "NotVerticalBar": []byte("&nmid;"),
+ "Ntilde": []byte("&#209;"),
+ "OElig": []byte("&#338;"),
+ "Oacute": []byte("&#211;"),
+ "Ocirc": []byte("&#212;"),
+ "Odblac": []byte("&#336;"),
+ "Ograve": []byte("&#210;"),
+ "Omacr": []byte("&#332;"),
+ "Omega": []byte("&ohm;"),
+ "Omicron": []byte("&#927;"),
+ "OpenCurlyDoubleQuote": []byte("&#8220;"),
+ "OpenCurlyQuote": []byte("&#8216;"),
+ "Oslash": []byte("&#216;"),
+ "Otilde": []byte("&#213;"),
+ "OverBar": []byte("&#8254;"),
+ "OverBrace": []byte("&#9182;"),
+ "OverBracket": []byte("&tbrk;"),
+ "OverParenthesis": []byte("&#9180;"),
+ "PartialD": []byte("&part;"),
+ "PlusMinus": []byte("&pm;"),
+ "Poincareplane": []byte("&Hfr;"),
+ "Precedes": []byte("&pr;"),
+ "PrecedesEqual": []byte("&pre;"),
+ "PrecedesSlantEqual": []byte("&#8828;"),
+ "PrecedesTilde": []byte("&#8830;"),
+ "Product": []byte("&prod;"),
+ "Proportion": []byte("&#8759;"),
+ "Proportional": []byte("&prop;"),
+ "QUOT": []byte("\""),
+ "Racute": []byte("&#340;"),
+ "Rcaron": []byte("&#344;"),
+ "Rcedil": []byte("&#342;"),
+ "ReverseElement": []byte("&ni;"),
+ "ReverseEquilibrium": []byte("&#8651;"),
+ "ReverseUpEquilibrium": []byte("&duhar;"),
+ "Rfr": []byte("&Re;"),
+ "RightAngleBracket": []byte("&rang;"),
+ "RightArrow": []byte("&rarr;"),
+ "RightArrowBar": []byte("&#8677;"),
+ "RightArrowLeftArrow": []byte("&#8644;"),
+ "RightCeiling": []byte("&#8969;"),
+ "RightDoubleBracket": []byte("&robrk;"),
+ "RightDownTeeVector": []byte("&#10589;"),
+ "RightDownVector": []byte("&#8642;"),
+ "RightDownVectorBar": []byte("&#10581;"),
+ "RightFloor": []byte("&#8971;"),
+ "RightTee": []byte("&#8866;"),
+ "RightTeeArrow": []byte("&map;"),
+ "RightTeeVector": []byte("&#10587;"),
+ "RightTriangle": []byte("&#8883;"),
+ "RightTriangleBar": []byte("&#10704;"),
+ "RightTriangleEqual": []byte("&#8885;"),
+ "RightUpDownVector": []byte("&#10575;"),
+ "RightUpTeeVector": []byte("&#10588;"),
+ "RightUpVector": []byte("&#8638;"),
+ "RightUpVectorBar": []byte("&#10580;"),
+ "RightVector": []byte("&#8640;"),
+ "RightVectorBar": []byte("&#10579;"),
+ "Rightarrow": []byte("&rArr;"),
+ "RoundImplies": []byte("&#10608;"),
+ "Rrightarrow": []byte("&#8667;"),
+ "RuleDelayed": []byte("&#10740;"),
+ "SHCHcy": []byte("&#1065;"),
+ "SOFTcy": []byte("&#1068;"),
+ "Sacute": []byte("&#346;"),
+ "Scaron": []byte("&#352;"),
+ "Scedil": []byte("&#350;"),
+ "Scirc": []byte("&#348;"),
+ "ShortDownArrow": []byte("&darr;"),
+ "ShortLeftArrow": []byte("&larr;"),
+ "ShortRightArrow": []byte("&rarr;"),
+ "ShortUpArrow": []byte("&uarr;"),
+ "Sigma": []byte("&#931;"),
+ "SmallCircle": []byte("&#8728;"),
+ "Square": []byte("&squ;"),
+ "SquareIntersection": []byte("&#8851;"),
+ "SquareSubset": []byte("&#8847;"),
+ "SquareSubsetEqual": []byte("&#8849;"),
+ "SquareSuperset": []byte("&#8848;"),
+ "SquareSupersetEqual": []byte("&#8850;"),
+ "SquareUnion": []byte("&#8852;"),
+ "Subset": []byte("&Sub;"),
+ "SubsetEqual": []byte("&sube;"),
+ "Succeeds": []byte("&sc;"),
+ "SucceedsEqual": []byte("&sce;"),
+ "SucceedsSlantEqual": []byte("&#8829;"),
+ "SucceedsTilde": []byte("&#8831;"),
+ "SuchThat": []byte("&ni;"),
+ "Superset": []byte("&sup;"),
+ "SupersetEqual": []byte("&supe;"),
+ "Supset": []byte("&Sup;"),
+ "THORN": []byte("&#222;"),
+ "Tab": []byte(" "),
+ "Tcaron": []byte("&#356;"),
+ "Tcedil": []byte("&#354;"),
+ "Therefore": []byte("&#8756;"),
+ "Theta": []byte("&#920;"),
+ "ThinSpace": []byte("&#8201;"),
+ "Tilde": []byte("&sim;"),
+ "TildeEqual": []byte("&sime;"),
+ "TildeFullEqual": []byte("&cong;"),
+ "TildeTilde": []byte("&ap;"),
+ "TripleDot": []byte("&tdot;"),
+ "Tstrok": []byte("&#358;"),
+ "Uacute": []byte("&#218;"),
+ "Uarrocir": []byte("&#10569;"),
+ "Ubreve": []byte("&#364;"),
+ "Ucirc": []byte("&#219;"),
+ "Udblac": []byte("&#368;"),
+ "Ugrave": []byte("&#217;"),
+ "Umacr": []byte("&#362;"),
+ "UnderBar": []byte("_"),
+ "UnderBrace": []byte("&#9183;"),
+ "UnderBracket": []byte("&bbrk;"),
+ "UnderParenthesis": []byte("&#9181;"),
+ "Union": []byte("&xcup;"),
+ "UnionPlus": []byte("&#8846;"),
+ "Uogon": []byte("&#370;"),
+ "UpArrow": []byte("&uarr;"),
+ "UpArrowBar": []byte("&#10514;"),
+ "UpArrowDownArrow": []byte("&#8645;"),
+ "UpDownArrow": []byte("&varr;"),
+ "UpEquilibrium": []byte("&udhar;"),
+ "UpTee": []byte("&bot;"),
+ "UpTeeArrow": []byte("&#8613;"),
+ "Uparrow": []byte("&uArr;"),
+ "Updownarrow": []byte("&vArr;"),
+ "UpperLeftArrow": []byte("&#8598;"),
+ "UpperRightArrow": []byte("&#8599;"),
+ "Upsilon": []byte("&#933;"),
+ "Uring": []byte("&#366;"),
+ "Utilde": []byte("&#360;"),
+ "Verbar": []byte("&Vert;"),
+ "VerticalBar": []byte("&mid;"),
+ "VerticalLine": []byte("|"),
+ "VerticalSeparator": []byte("&#10072;"),
+ "VerticalTilde": []byte("&wr;"),
+ "VeryThinSpace": []byte("&#8202;"),
+ "Vvdash": []byte("&#8874;"),
+ "Wcirc": []byte("&#372;"),
+ "Yacute": []byte("&#221;"),
+ "Ycirc": []byte("&#374;"),
+ "Zacute": []byte("&#377;"),
+ "Zcaron": []byte("&#381;"),
+ "ZeroWidthSpace": []byte("&#8203;"),
+ "aacute": []byte("&#225;"),
+ "abreve": []byte("&#259;"),
+ "acirc": []byte("&#226;"),
+ "acute": []byte("&#180;"),
+ "aelig": []byte("&#230;"),
+ "agrave": []byte("&#224;"),
+ "alefsym": []byte("&#8501;"),
+ "alpha": []byte("&#945;"),
+ "amacr": []byte("&#257;"),
+ "amp": []byte("&"),
+ "andslope": []byte("&#10840;"),
+ "angle": []byte("&ang;"),
+ "angmsd": []byte("&#8737;"),
+ "angmsdaa": []byte("&#10664;"),
+ "angmsdab": []byte("&#10665;"),
+ "angmsdac": []byte("&#10666;"),
+ "angmsdad": []byte("&#10667;"),
+ "angmsdae": []byte("&#10668;"),
+ "angmsdaf": []byte("&#10669;"),
+ "angmsdag": []byte("&#10670;"),
+ "angmsdah": []byte("&#10671;"),
+ "angrtvb": []byte("&#8894;"),
+ "angrtvbd": []byte("&#10653;"),
+ "angsph": []byte("&#8738;"),
+ "angst": []byte("&#197;"),
+ "angzarr": []byte("&#9084;"),
+ "aogon": []byte("&#261;"),
+ "apos": []byte("'"),
+ "approx": []byte("&ap;"),
+ "approxeq": []byte("&ape;"),
+ "aring": []byte("&#229;"),
+ "ast": []byte("*"),
+ "asymp": []byte("&ap;"),
+ "asympeq": []byte("&#8781;"),
+ "atilde": []byte("&#227;"),
+ "awconint": []byte("&#8755;"),
+ "backcong": []byte("&#8780;"),
+ "backepsilon": []byte("&#1014;"),
+ "backprime": []byte("&#8245;"),
+ "backsim": []byte("&bsim;"),
+ "backsimeq": []byte("&#8909;"),
+ "barvee": []byte("&#8893;"),
+ "barwed": []byte("&#8965;"),
+ "barwedge": []byte("&#8965;"),
+ "bbrktbrk": []byte("&#9142;"),
+ "becaus": []byte("&#8757;"),
+ "because": []byte("&#8757;"),
+ "bemptyv": []byte("&#10672;"),
+ "bernou": []byte("&Bscr;"),
+ "between": []byte("&#8812;"),
+ "bigcap": []byte("&xcap;"),
+ "bigcirc": []byte("&#9711;"),
+ "bigcup": []byte("&xcup;"),
+ "bigodot": []byte("&xodot;"),
+ "bigoplus": []byte("&#10753;"),
+ "bigotimes": []byte("&#10754;"),
+ "bigsqcup": []byte("&#10758;"),
+ "bigstar": []byte("&#9733;"),
+ "bigtriangledown": []byte("&#9661;"),
+ "bigtriangleup": []byte("&#9651;"),
+ "biguplus": []byte("&#10756;"),
+ "bigvee": []byte("&Vee;"),
+ "bigwedge": []byte("&#8896;"),
+ "bkarow": []byte("&rbarr;"),
+ "blacklozenge": []byte("&lozf;"),
+ "blacksquare": []byte("&squf;"),
+ "blacktriangle": []byte("&#9652;"),
+ "blacktriangledown": []byte("&#9662;"),
+ "blacktriangleleft": []byte("&#9666;"),
+ "blacktriangleright": []byte("&#9656;"),
+ "bottom": []byte("&bot;"),
+ "bowtie": []byte("&#8904;"),
+ "boxminus": []byte("&#8863;"),
+ "boxplus": []byte("&#8862;"),
+ "boxtimes": []byte("&#8864;"),
+ "bprime": []byte("&#8245;"),
+ "breve": []byte("&#728;"),
+ "brvbar": []byte("&#166;"),
+ "bsol": []byte("\\"),
+ "bsolhsub": []byte("&#10184;"),
+ "bullet": []byte("&bull;"),
+ "bumpeq": []byte("&#8783;"),
+ "cacute": []byte("&#263;"),
+ "capbrcup": []byte("&#10825;"),
+ "caron": []byte("&#711;"),
+ "ccaron": []byte("&#269;"),
+ "ccedil": []byte("&#231;"),
+ "ccirc": []byte("&#265;"),
+ "ccupssm": []byte("&#10832;"),
+ "cedil": []byte("&#184;"),
+ "cemptyv": []byte("&#10674;"),
+ "centerdot": []byte("&#183;"),
+ "checkmark": []byte("&check;"),
+ "circeq": []byte("&cire;"),
+ "circlearrowleft": []byte("&#8634;"),
+ "circlearrowright": []byte("&#8635;"),
+ "circledR": []byte("&REG;"),
+ "circledS": []byte("&oS;"),
+ "circledast": []byte("&oast;"),
+ "circledcirc": []byte("&ocir;"),
+ "circleddash": []byte("&#8861;"),
+ "cirfnint": []byte("&#10768;"),
+ "cirscir": []byte("&#10690;"),
+ "clubsuit": []byte("&#9827;"),
+ "colon": []byte(":"),
+ "colone": []byte("&#8788;"),
+ "coloneq": []byte("&#8788;"),
+ "comma": []byte(","),
+ "commat": []byte("@"),
+ "compfn": []byte("&#8728;"),
+ "complement": []byte("&comp;"),
+ "complexes": []byte("&Copf;"),
+ "congdot": []byte("&#10861;"),
+ "conint": []byte("&oint;"),
+ "coprod": []byte("&#8720;"),
+ "copysr": []byte("&#8471;"),
+ "cudarrl": []byte("&#10552;"),
+ "cudarrr": []byte("&#10549;"),
+ "cularr": []byte("&#8630;"),
+ "cularrp": []byte("&#10557;"),
+ "cupbrcap": []byte("&#10824;"),
+ "cupdot": []byte("&#8845;"),
+ "curarr": []byte("&#8631;"),
+ "curarrm": []byte("&#10556;"),
+ "curlyeqprec": []byte("&#8926;"),
+ "curlyeqsucc": []byte("&#8927;"),
+ "curlyvee": []byte("&#8910;"),
+ "curlywedge": []byte("&#8911;"),
+ "curren": []byte("&#164;"),
+ "curvearrowleft": []byte("&#8630;"),
+ "curvearrowright": []byte("&#8631;"),
+ "cwconint": []byte("&#8754;"),
+ "cylcty": []byte("&#9005;"),
+ "dagger": []byte("&#8224;"),
+ "daleth": []byte("&#8504;"),
+ "dbkarow": []byte("&rBarr;"),
+ "dblac": []byte("&#733;"),
+ "dcaron": []byte("&#271;"),
+ "ddagger": []byte("&#8225;"),
+ "ddotseq": []byte("&eDDot;"),
+ "delta": []byte("&#948;"),
+ "demptyv": []byte("&#10673;"),
+ "diamond": []byte("&diam;"),
+ "diamondsuit": []byte("&#9830;"),
+ "digamma": []byte("&#989;"),
+ "divide": []byte("&div;"),
+ "divideontimes": []byte("&#8903;"),
+ "divonx": []byte("&#8903;"),
+ "dlcorn": []byte("&#8990;"),
+ "dlcrop": []byte("&#8973;"),
+ "dollar": []byte("$"),
+ "doteqdot": []byte("&eDot;"),
+ "dotminus": []byte("&#8760;"),
+ "dotplus": []byte("&#8724;"),
+ "dotsquare": []byte("&#8865;"),
+ "doublebarwedge": []byte("&#8966;"),
+ "downarrow": []byte("&darr;"),
+ "downdownarrows": []byte("&#8650;"),
+ "downharpoonleft": []byte("&#8643;"),
+ "downharpoonright": []byte("&#8642;"),
+ "drbkarow": []byte("&RBarr;"),
+ "drcorn": []byte("&#8991;"),
+ "drcrop": []byte("&#8972;"),
+ "dstrok": []byte("&#273;"),
+ "dwangle": []byte("&#10662;"),
+ "dzigrarr": []byte("&#10239;"),
+ "eacute": []byte("&#233;"),
+ "ecaron": []byte("&#283;"),
+ "ecirc": []byte("&#234;"),
+ "ecolon": []byte("&#8789;"),
+ "egrave": []byte("&#232;"),
+ "elinters": []byte("&#9191;"),
+ "emacr": []byte("&#275;"),
+ "emptyset": []byte("&#8709;"),
+ "emptyv": []byte("&#8709;"),
+ "emsp13": []byte("&#8196;"),
+ "emsp14": []byte("&#8197;"),
+ "eogon": []byte("&#281;"),
+ "epsilon": []byte("&#949;"),
+ "eqcirc": []byte("&ecir;"),
+ "eqcolon": []byte("&#8789;"),
+ "eqsim": []byte("&esim;"),
+ "eqslantgtr": []byte("&egs;"),
+ "eqslantless": []byte("&els;"),
+ "equals": []byte("="),
+ "equest": []byte("&#8799;"),
+ "equivDD": []byte("&#10872;"),
+ "eqvparsl": []byte("&#10725;"),
+ "excl": []byte("!"),
+ "expectation": []byte("&Escr;"),
+ "exponentiale": []byte("&ee;"),
+ "fallingdotseq": []byte("&#8786;"),
+ "female": []byte("&#9792;"),
+ "forall": []byte("&#8704;"),
+ "fpartint": []byte("&#10765;"),
+ "frac12": []byte("&#189;"),
+ "frac13": []byte("&#8531;"),
+ "frac14": []byte("&#188;"),
+ "frac15": []byte("&#8533;"),
+ "frac16": []byte("&#8537;"),
+ "frac18": []byte("&#8539;"),
+ "frac23": []byte("&#8532;"),
+ "frac25": []byte("&#8534;"),
+ "frac34": []byte("&#190;"),
+ "frac35": []byte("&#8535;"),
+ "frac38": []byte("&#8540;"),
+ "frac45": []byte("&#8536;"),
+ "frac56": []byte("&#8538;"),
+ "frac58": []byte("&#8541;"),
+ "frac78": []byte("&#8542;"),
+ "gacute": []byte("&#501;"),
+ "gamma": []byte("&#947;"),
+ "gammad": []byte("&#989;"),
+ "gbreve": []byte("&#287;"),
+ "gcirc": []byte("&#285;"),
+ "geq": []byte("&ge;"),
+ "geqq": []byte("&gE;"),
+ "geqslant": []byte("&ges;"),
+ "gesdoto": []byte("&#10882;"),
+ "gesdotol": []byte("&#10884;"),
+ "ggg": []byte("&Gg;"),
+ "gnapprox": []byte("&gnap;"),
+ "gneq": []byte("&gne;"),
+ "gneqq": []byte("&gnE;"),
+ "grave": []byte("`"),
+ "gt": []byte(">"),
+ "gtquest": []byte("&#10876;"),
+ "gtrapprox": []byte("&gap;"),
+ "gtrdot": []byte("&#8919;"),
+ "gtreqless": []byte("&gel;"),
+ "gtreqqless": []byte("&gEl;"),
+ "gtrless": []byte("&gl;"),
+ "gtrsim": []byte("&gsim;"),
+ "hArr": []byte("&iff;"),
+ "hairsp": []byte("&#8202;"),
+ "hamilt": []byte("&Hscr;"),
+ "hardcy": []byte("&#1098;"),
+ "harrcir": []byte("&#10568;"),
+ "hcirc": []byte("&#293;"),
+ "hearts": []byte("&#9829;"),
+ "heartsuit": []byte("&#9829;"),
+ "hellip": []byte("&mldr;"),
+ "hercon": []byte("&#8889;"),
+ "hksearow": []byte("&#10533;"),
+ "hkswarow": []byte("&#10534;"),
+ "homtht": []byte("&#8763;"),
+ "hookleftarrow": []byte("&#8617;"),
+ "hookrightarrow": []byte("&#8618;"),
+ "horbar": []byte("&#8213;"),
+ "hslash": []byte("&hbar;"),
+ "hstrok": []byte("&#295;"),
+ "hybull": []byte("&#8259;"),
+ "hyphen": []byte("&dash;"),
+ "iacute": []byte("&#237;"),
+ "icirc": []byte("&#238;"),
+ "iexcl": []byte("&#161;"),
+ "igrave": []byte("&#236;"),
+ "iiiint": []byte("&qint;"),
+ "iiint": []byte("&tint;"),
+ "ijlig": []byte("&#307;"),
+ "imacr": []byte("&#299;"),
+ "image": []byte("&Im;"),
+ "imagline": []byte("&Iscr;"),
+ "imagpart": []byte("&Im;"),
+ "imath": []byte("&#305;"),
+ "imped": []byte("&#437;"),
+ "incare": []byte("&#8453;"),
+ "infintie": []byte("&#10717;"),
+ "inodot": []byte("&#305;"),
+ "intcal": []byte("&#8890;"),
+ "integers": []byte("&Zopf;"),
+ "intercal": []byte("&#8890;"),
+ "intlarhk": []byte("&#10775;"),
+ "intprod": []byte("&iprod;"),
+ "iogon": []byte("&#303;"),
+ "iquest": []byte("&#191;"),
+ "isin": []byte("&in;"),
+ "isindot": []byte("&#8949;"),
+ "isinsv": []byte("&#8947;"),
+ "isinv": []byte("&in;"),
+ "itilde": []byte("&#297;"),
+ "jcirc": []byte("&#309;"),
+ "jmath": []byte("&#567;"),
+ "jsercy": []byte("&#1112;"),
+ "kappa": []byte("&#954;"),
+ "kappav": []byte("&#1008;"),
+ "kcedil": []byte("&#311;"),
+ "kgreen": []byte("&#312;"),
+ "lacute": []byte("&#314;"),
+ "laemptyv": []byte("&#10676;"),
+ "lagran": []byte("&Lscr;"),
+ "lambda": []byte("&#955;"),
+ "langle": []byte("&lang;"),
+ "laquo": []byte("&#171;"),
+ "larrbfs": []byte("&#10527;"),
+ "larrhk": []byte("&#8617;"),
+ "larrlp": []byte("&#8619;"),
+ "larrsim": []byte("&#10611;"),
+ "larrtl": []byte("&#8610;"),
+ "lbrace": []byte("{"),
+ "lbrack": []byte("["),
+ "lbrksld": []byte("&#10639;"),
+ "lbrkslu": []byte("&#10637;"),
+ "lcaron": []byte("&#318;"),
+ "lcedil": []byte("&#316;"),
+ "lcub": []byte("{"),
+ "ldquor": []byte("&#8222;"),
+ "ldrdhar": []byte("&#10599;"),
+ "ldrushar": []byte("&#10571;"),
+ "leftarrow": []byte("&larr;"),
+ "leftarrowtail": []byte("&#8610;"),
+ "leftharpoondown": []byte("&#8637;"),
+ "leftharpoonup": []byte("&#8636;"),
+ "leftleftarrows": []byte("&#8647;"),
+ "leftrightarrow": []byte("&harr;"),
+ "leftrightarrows": []byte("&#8646;"),
+ "leftrightharpoons": []byte("&#8651;"),
+ "leftrightsquigarrow": []byte("&#8621;"),
+ "leftthreetimes": []byte("&#8907;"),
+ "leq": []byte("&le;"),
+ "leqq": []byte("&lE;"),
+ "leqslant": []byte("&les;"),
+ "lesdoto": []byte("&#10881;"),
+ "lesdotor": []byte("&#10883;"),
+ "lessapprox": []byte("&lap;"),
+ "lessdot": []byte("&#8918;"),
+ "lesseqgtr": []byte("&leg;"),
+ "lesseqqgtr": []byte("&lEg;"),
+ "lessgtr": []byte("&lg;"),
+ "lesssim": []byte("&lsim;"),
+ "lfloor": []byte("&#8970;"),
+ "llcorner": []byte("&#8990;"),
+ "lmidot": []byte("&#320;"),
+ "lmoust": []byte("&#9136;"),
+ "lmoustache": []byte("&#9136;"),
+ "lnapprox": []byte("&lnap;"),
+ "lneq": []byte("&lne;"),
+ "lneqq": []byte("&lnE;"),
+ "longleftarrow": []byte("&xlarr;"),
+ "longleftrightarrow": []byte("&xharr;"),
+ "longmapsto": []byte("&xmap;"),
+ "longrightarrow": []byte("&xrarr;"),
+ "looparrowleft": []byte("&#8619;"),
+ "looparrowright": []byte("&#8620;"),
+ "lotimes": []byte("&#10804;"),
+ "lowast": []byte("&#8727;"),
+ "lowbar": []byte("_"),
+ "lozenge": []byte("&loz;"),
+ "lpar": []byte("("),
+ "lrcorner": []byte("&#8991;"),
+ "lsaquo": []byte("&#8249;"),
+ "lsqb": []byte("["),
+ "lsquor": []byte("&#8218;"),
+ "lstrok": []byte("&#322;"),
+ "lt": []byte("<"),
+ "lthree": []byte("&#8907;"),
+ "ltimes": []byte("&#8905;"),
+ "ltquest": []byte("&#10875;"),
+ "lurdshar": []byte("&#10570;"),
+ "luruhar": []byte("&#10598;"),
+ "maltese": []byte("&malt;"),
+ "mapsto": []byte("&map;"),
+ "mapstodown": []byte("&#8615;"),
+ "mapstoleft": []byte("&#8612;"),
+ "mapstoup": []byte("&#8613;"),
+ "marker": []byte("&#9646;"),
+ "measuredangle": []byte("&#8737;"),
+ "micro": []byte("&#181;"),
+ "midast": []byte("*"),
+ "middot": []byte("&#183;"),
+ "minusb": []byte("&#8863;"),
+ "minusd": []byte("&#8760;"),
+ "minusdu": []byte("&#10794;"),
+ "mnplus": []byte("&mp;"),
+ "models": []byte("&#8871;"),
+ "mstpos": []byte("&ac;"),
+ "multimap": []byte("&#8888;"),
+ "nLeftarrow": []byte("&#8653;"),
+ "nLeftrightarrow": []byte("&#8654;"),
+ "nRightarrow": []byte("&#8655;"),
+ "nVDash": []byte("&#8879;"),
+ "nVdash": []byte("&#8878;"),
+ "nabla": []byte("&Del;"),
+ "nacute": []byte("&#324;"),
+ "napos": []byte("&#329;"),
+ "napprox": []byte("&nap;"),
+ "natural": []byte("&#9838;"),
+ "naturals": []byte("&Nopf;"),
+ "ncaron": []byte("&#328;"),
+ "ncedil": []byte("&#326;"),
+ "nearrow": []byte("&#8599;"),
+ "nequiv": []byte("&#8802;"),
+ "nesear": []byte("&toea;"),
+ "nexist": []byte("&#8708;"),
+ "nexists": []byte("&#8708;"),
+ "ngeq": []byte("&nge;"),
+ "ngtr": []byte("&ngt;"),
+ "niv": []byte("&ni;"),
+ "nleftarrow": []byte("&#8602;"),
+ "nleftrightarrow": []byte("&#8622;"),
+ "nleq": []byte("&nle;"),
+ "nless": []byte("&nlt;"),
+ "nltrie": []byte("&#8940;"),
+ "notinva": []byte("&#8713;"),
+ "notinvb": []byte("&#8951;"),
+ "notinvc": []byte("&#8950;"),
+ "notniva": []byte("&#8716;"),
+ "notnivb": []byte("&#8958;"),
+ "notnivc": []byte("&#8957;"),
+ "nparallel": []byte("&npar;"),
+ "npolint": []byte("&#10772;"),
+ "nprcue": []byte("&#8928;"),
+ "nprec": []byte("&npr;"),
+ "nrightarrow": []byte("&#8603;"),
+ "nrtrie": []byte("&#8941;"),
+ "nsccue": []byte("&#8929;"),
+ "nshortmid": []byte("&nmid;"),
+ "nshortparallel": []byte("&npar;"),
+ "nsimeq": []byte("&#8772;"),
+ "nsmid": []byte("&nmid;"),
+ "nspar": []byte("&npar;"),
+ "nsqsube": []byte("&#8930;"),
+ "nsqsupe": []byte("&#8931;"),
+ "nsubseteq": []byte("&#8840;"),
+ "nsucc": []byte("&nsc;"),
+ "nsupseteq": []byte("&#8841;"),
+ "ntilde": []byte("&#241;"),
+ "ntriangleleft": []byte("&#8938;"),
+ "ntrianglelefteq": []byte("&#8940;"),
+ "ntriangleright": []byte("&#8939;"),
+ "ntrianglerighteq": []byte("&#8941;"),
+ "num": []byte("#"),
+ "numero": []byte("&#8470;"),
+ "nvDash": []byte("&#8877;"),
+ "nvdash": []byte("&#8876;"),
+ "nvinfin": []byte("&#10718;"),
+ "nwarrow": []byte("&#8598;"),
+ "oacute": []byte("&#243;"),
+ "ocirc": []byte("&#244;"),
+ "odblac": []byte("&#337;"),
+ "oelig": []byte("&#339;"),
+ "ograve": []byte("&#242;"),
+ "olcross": []byte("&#10683;"),
+ "omacr": []byte("&#333;"),
+ "omega": []byte("&#969;"),
+ "omicron": []byte("&#959;"),
+ "ominus": []byte("&#8854;"),
+ "order": []byte("&oscr;"),
+ "orderof": []byte("&oscr;"),
+ "origof": []byte("&#8886;"),
+ "orslope": []byte("&#10839;"),
+ "oslash": []byte("&#248;"),
+ "otilde": []byte("&#245;"),
+ "otimes": []byte("&#8855;"),
+ "otimesas": []byte("&#10806;"),
+ "parallel": []byte("&par;"),
+ "percnt": []byte("%"),
+ "period": []byte("."),
+ "permil": []byte("&#8240;"),
+ "perp": []byte("&bot;"),
+ "pertenk": []byte("&#8241;"),
+ "phmmat": []byte("&Mscr;"),
+ "pitchfork": []byte("&fork;"),
+ "planck": []byte("&hbar;"),
+ "planckh": []byte("&#8462;"),
+ "plankv": []byte("&hbar;"),
+ "plus": []byte("+"),
+ "plusacir": []byte("&#10787;"),
+ "pluscir": []byte("&#10786;"),
+ "plusdo": []byte("&#8724;"),
+ "plusmn": []byte("&pm;"),
+ "plussim": []byte("&#10790;"),
+ "plustwo": []byte("&#10791;"),
+ "pointint": []byte("&#10773;"),
+ "pound": []byte("&#163;"),
+ "prec": []byte("&pr;"),
+ "precapprox": []byte("&prap;"),
+ "preccurlyeq": []byte("&#8828;"),
+ "preceq": []byte("&pre;"),
+ "precnapprox": []byte("&prnap;"),
+ "precneqq": []byte("&prnE;"),
+ "precnsim": []byte("&#8936;"),
+ "precsim": []byte("&#8830;"),
+ "primes": []byte("&Popf;"),
+ "prnsim": []byte("&#8936;"),
+ "profalar": []byte("&#9006;"),
+ "profline": []byte("&#8978;"),
+ "profsurf": []byte("&#8979;"),
+ "propto": []byte("&prop;"),
+ "prurel": []byte("&#8880;"),
+ "puncsp": []byte("&#8200;"),
+ "qprime": []byte("&#8279;"),
+ "quaternions": []byte("&Hopf;"),
+ "quatint": []byte("&#10774;"),
+ "quest": []byte("?"),
+ "questeq": []byte("&#8799;"),
+ "quot": []byte("\""),
+ "racute": []byte("&#341;"),
+ "radic": []byte("&Sqrt;"),
+ "raemptyv": []byte("&#10675;"),
+ "rangle": []byte("&rang;"),
+ "raquo": []byte("&#187;"),
+ "rarrbfs": []byte("&#10528;"),
+ "rarrhk": []byte("&#8618;"),
+ "rarrlp": []byte("&#8620;"),
+ "rarrsim": []byte("&#10612;"),
+ "rarrtl": []byte("&#8611;"),
+ "rationals": []byte("&Qopf;"),
+ "rbrace": []byte("}"),
+ "rbrack": []byte("]"),
+ "rbrksld": []byte("&#10638;"),
+ "rbrkslu": []byte("&#10640;"),
+ "rcaron": []byte("&#345;"),
+ "rcedil": []byte("&#343;"),
+ "rcub": []byte("}"),
+ "rdldhar": []byte("&#10601;"),
+ "rdquor": []byte("&#8221;"),
+ "real": []byte("&Re;"),
+ "realine": []byte("&Rscr;"),
+ "realpart": []byte("&Re;"),
+ "reals": []byte("&Ropf;"),
+ "rfloor": []byte("&#8971;"),
+ "rightarrow": []byte("&rarr;"),
+ "rightarrowtail": []byte("&#8611;"),
+ "rightharpoondown": []byte("&#8641;"),
+ "rightharpoonup": []byte("&#8640;"),
+ "rightleftarrows": []byte("&#8644;"),
+ "rightleftharpoons": []byte("&#8652;"),
+ "rightrightarrows": []byte("&#8649;"),
+ "rightsquigarrow": []byte("&#8605;"),
+ "rightthreetimes": []byte("&#8908;"),
+ "risingdotseq": []byte("&#8787;"),
+ "rmoust": []byte("&#9137;"),
+ "rmoustache": []byte("&#9137;"),
+ "rotimes": []byte("&#10805;"),
+ "rpar": []byte(")"),
+ "rppolint": []byte("&#10770;"),
+ "rsaquo": []byte("&#8250;"),
+ "rsqb": []byte("]"),
+ "rsquor": []byte("&#8217;"),
+ "rthree": []byte("&#8908;"),
+ "rtimes": []byte("&#8906;"),
+ "rtriltri": []byte("&#10702;"),
+ "ruluhar": []byte("&#10600;"),
+ "sacute": []byte("&#347;"),
+ "scaron": []byte("&#353;"),
+ "scedil": []byte("&#351;"),
+ "scirc": []byte("&#349;"),
+ "scnsim": []byte("&#8937;"),
+ "scpolint": []byte("&#10771;"),
+ "searrow": []byte("&#8600;"),
+ "semi": []byte(";"),
+ "seswar": []byte("&tosa;"),
+ "setminus": []byte("&#8726;"),
+ "sfrown": []byte("&#8994;"),
+ "shchcy": []byte("&#1097;"),
+ "shortmid": []byte("&mid;"),
+ "shortparallel": []byte("&par;"),
+ "sigma": []byte("&#963;"),
+ "sigmaf": []byte("&#962;"),
+ "sigmav": []byte("&#962;"),
+ "simeq": []byte("&sime;"),
+ "simplus": []byte("&#10788;"),
+ "simrarr": []byte("&#10610;"),
+ "slarr": []byte("&larr;"),
+ "smallsetminus": []byte("&#8726;"),
+ "smeparsl": []byte("&#10724;"),
+ "smid": []byte("&mid;"),
+ "softcy": []byte("&#1100;"),
+ "sol": []byte("/"),
+ "solbar": []byte("&#9023;"),
+ "spades": []byte("&#9824;"),
+ "spadesuit": []byte("&#9824;"),
+ "spar": []byte("&par;"),
+ "sqsube": []byte("&#8849;"),
+ "sqsubset": []byte("&#8847;"),
+ "sqsubseteq": []byte("&#8849;"),
+ "sqsupe": []byte("&#8850;"),
+ "sqsupset": []byte("&#8848;"),
+ "sqsupseteq": []byte("&#8850;"),
+ "square": []byte("&squ;"),
+ "squarf": []byte("&squf;"),
+ "srarr": []byte("&rarr;"),
+ "ssetmn": []byte("&#8726;"),
+ "ssmile": []byte("&#8995;"),
+ "sstarf": []byte("&Star;"),
+ "straightepsilon": []byte("&#1013;"),
+ "straightphi": []byte("&#981;"),
+ "strns": []byte("&#175;"),
+ "subedot": []byte("&#10947;"),
+ "submult": []byte("&#10945;"),
+ "subplus": []byte("&#10943;"),
+ "subrarr": []byte("&#10617;"),
+ "subset": []byte("&sub;"),
+ "subseteq": []byte("&sube;"),
+ "subseteqq": []byte("&subE;"),
+ "subsetneq": []byte("&#8842;"),
+ "subsetneqq": []byte("&subnE;"),
+ "succ": []byte("&sc;"),
+ "succapprox": []byte("&scap;"),
+ "succcurlyeq": []byte("&#8829;"),
+ "succeq": []byte("&sce;"),
+ "succnapprox": []byte("&scnap;"),
+ "succneqq": []byte("&scnE;"),
+ "succnsim": []byte("&#8937;"),
+ "succsim": []byte("&#8831;"),
+ "supdsub": []byte("&#10968;"),
+ "supedot": []byte("&#10948;"),
+ "suphsol": []byte("&#10185;"),
+ "suphsub": []byte("&#10967;"),
+ "suplarr": []byte("&#10619;"),
+ "supmult": []byte("&#10946;"),
+ "supplus": []byte("&#10944;"),
+ "supset": []byte("&sup;"),
+ "supseteq": []byte("&supe;"),
+ "supseteqq": []byte("&supE;"),
+ "supsetneq": []byte("&#8843;"),
+ "supsetneqq": []byte("&supnE;"),
+ "swarrow": []byte("&#8601;"),
+ "szlig": []byte("&#223;"),
+ "target": []byte("&#8982;"),
+ "tcaron": []byte("&#357;"),
+ "tcedil": []byte("&#355;"),
+ "telrec": []byte("&#8981;"),
+ "there4": []byte("&#8756;"),
+ "therefore": []byte("&#8756;"),
+ "theta": []byte("&#952;"),
+ "thetasym": []byte("&#977;"),
+ "thetav": []byte("&#977;"),
+ "thickapprox": []byte("&ap;"),
+ "thicksim": []byte("&sim;"),
+ "thinsp": []byte("&#8201;"),
+ "thkap": []byte("&ap;"),
+ "thksim": []byte("&sim;"),
+ "thorn": []byte("&#254;"),
+ "tilde": []byte("&#732;"),
+ "times": []byte("&#215;"),
+ "timesb": []byte("&#8864;"),
+ "timesbar": []byte("&#10801;"),
+ "topbot": []byte("&#9014;"),
+ "topfork": []byte("&#10970;"),
+ "tprime": []byte("&#8244;"),
+ "triangle": []byte("&utri;"),
+ "triangledown": []byte("&dtri;"),
+ "triangleleft": []byte("&ltri;"),
+ "trianglelefteq": []byte("&#8884;"),
+ "triangleq": []byte("&trie;"),
+ "triangleright": []byte("&rtri;"),
+ "trianglerighteq": []byte("&#8885;"),
+ "tridot": []byte("&#9708;"),
+ "triminus": []byte("&#10810;"),
+ "triplus": []byte("&#10809;"),
+ "tritime": []byte("&#10811;"),
+ "trpezium": []byte("&#9186;"),
+ "tstrok": []byte("&#359;"),
+ "twoheadleftarrow": []byte("&Larr;"),
+ "twoheadrightarrow": []byte("&Rarr;"),
+ "uacute": []byte("&#250;"),
+ "ubreve": []byte("&#365;"),
+ "ucirc": []byte("&#251;"),
+ "udblac": []byte("&#369;"),
+ "ugrave": []byte("&#249;"),
+ "ulcorn": []byte("&#8988;"),
+ "ulcorner": []byte("&#8988;"),
+ "ulcrop": []byte("&#8975;"),
+ "umacr": []byte("&#363;"),
+ "uogon": []byte("&#371;"),
+ "uparrow": []byte("&uarr;"),
+ "updownarrow": []byte("&varr;"),
+ "upharpoonleft": []byte("&#8639;"),
+ "upharpoonright": []byte("&#8638;"),
+ "upsih": []byte("&#978;"),
+ "upsilon": []byte("&#965;"),
+ "upuparrows": []byte("&#8648;"),
+ "urcorn": []byte("&#8989;"),
+ "urcorner": []byte("&#8989;"),
+ "urcrop": []byte("&#8974;"),
+ "uring": []byte("&#367;"),
+ "utilde": []byte("&#361;"),
+ "uwangle": []byte("&#10663;"),
+ "varepsilon": []byte("&#1013;"),
+ "varkappa": []byte("&#1008;"),
+ "varnothing": []byte("&#8709;"),
+ "varphi": []byte("&#981;"),
+ "varpi": []byte("&piv;"),
+ "varpropto": []byte("&prop;"),
+ "varrho": []byte("&rhov;"),
+ "varsigma": []byte("&#962;"),
+ "vartheta": []byte("&#977;"),
+ "vartriangleleft": []byte("&#8882;"),
+ "vartriangleright": []byte("&#8883;"),
+ "vee": []byte("&or;"),
+ "veebar": []byte("&#8891;"),
+ "vellip": []byte("&#8942;"),
+ "verbar": []byte("|"),
+ "vert": []byte("|"),
+ "vprop": []byte("&prop;"),
+ "vzigzag": []byte("&#10650;"),
+ "wcirc": []byte("&#373;"),
+ "wedge": []byte("&and;"),
+ "wedgeq": []byte("&#8793;"),
+ "weierp": []byte("&wp;"),
+ "wreath": []byte("&wr;"),
+ "xvee": []byte("&Vee;"),
+ "xwedge": []byte("&#8896;"),
+ "yacute": []byte("&#253;"),
+ "ycirc": []byte("&#375;"),
+ "zacute": []byte("&#378;"),
+ "zcaron": []byte("&#382;"),
+ "zeetrf": []byte("&Zfr;"),
+ "zigrarr": []byte("&#8669;"),
+}
+
+// TextRevEntitiesMap is a map of escapes.
+var TextRevEntitiesMap = map[byte][]byte{
+ '<': []byte("&lt;"),
+}