Logs

18.2.2020:

  • Thêm một số dạng Công thức Toán học.

  • Thêm dạng Công thức Hóa học.

3.2.2020: Upload lên RPubs.

30.1.2020: Khởi tạo trang và upload lên GitHub.


Tài liệu tham khảo

ASCII Table

Tại sao không bao giờ nên sử dụng utf8 trong MySQL?

Wikipedia: List of XML and HTML character entity references

JavaScript String Escape / Unescape

LaTeX / Mathematics

Overleaf: Mathematical expressions

Wikipedia: MathML

MDN: MathML

W3C: Mathematical Markup Language (MathML) Version 3.0 2nd Edition

Load dữ liệu và các thư viện cần dùng

html_entitiesPathFile = "G:/R/Projects/ddRMarkdown/_datasets/html_entities.csv"
html_entities = read.csv(html_entitiesPathFile, encoding = "UTF-8")

escapePathFile = "G:/R/Projects/ddRMarkdown/_datasets/escape.csv"
escape = read.csv(escapePathFile, encoding = "UTF-8")

tex_mmlPathFile = "G:/R/Projects/ddRMarkdown/_datasets/tex_mml.csv"
tex_mml = read.csv(tex_mmlPathFile, encoding = "UTF-8")

library(kableExtra)

Các mã kí tự hay dùng trong trang web

# head(html_entities)
kable(html_entities[2:ncol(html_entities)]) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  scroll_box(width = "auto")
Name Character EntityName HexDec HTMLExample HTMLDescription
Quotation mark " quot U+0022 (34)
Ampersand & amp U+0026 (38)
Apostrophe apos U+0027 (39)
Less-than < lt U+003C (60)
Greater-than > gt U+003E (62)
Number sign # num U+0023 (35)
Solidus / sol U+002F (47)
Reverse solidus (backward solidus) \ bsol U+005C (92)
Semicolon ; semi U+003B (59)
Colon : colon U+003A (58)
Full stop (period) . period U+002E (46)

Các mã escape

# head(escape)
kable(escape[2:ncol(escape)]) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  scroll_box(width = "auto")
Name Escape HTMLExample HTMLDescription
Horizontal Tab \t
Vertical Tab \v
Nul char \0
Backspace \b
Form feed \f
Newline \n
Carriage return \r
Single quote \’
Double quote \"
Backslash \\

Các mã đánh dấu Công thức toán học hay dùng

#head(tex_mml)
kable(tex_mml[tex_mml$Group == 1, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Equation Inline \(...\), $...$ <math> hay <math xmlns=“http://www.w3.org/1998/Math/MathML” > $xyz$ Công – \(xyz\) – thức. Hiển thị Công thức toán học trong đoạn văn.
Equation Display \[...\], $$...$$ <math xmlns=“http://www.w3.org/1998/Math/MathML” display=“block”> $$xyz$$ Công – \[xyz\] – thức. Hiển thị Công thức toán học thành một khối riêng biệt.
kable(tex_mml[tex_mml$Group == 2, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Nomal Style \mathrm{…} <math mathvariant=“normal”> $\mathrm{xyz}$ \(\mathrm{xyz}\) Hiển thị Công thức toán học ở dạng bình thường (không in nghiêng).
Spacing \, \: \; \ (space) \quad \qquad $f(x)=x\ +3$ \(f(x)=x\ +3\) Xem thêm: https://www.overleaf.com/learn/latex/Spacing_in_math_mode
Multilines \\ $f(x)=x\,+y\\ f(x)=x\quad+y$ \(f(x)=x\,+y\\f(x)=x\quad+y\)
Group multilines \begin{cases} \end{cases} $\begin{cases} x=a\\x-y=b \end{cases}$ \(\begin{cases}x=a\\x-y=b\end{cases}\)
\left.\begin{split} \end{split}\right $\left.\begin{split} x=a\\x-y=b \end{split}\right\}$ \(\left.\begin{split}x=a\\x-y=b\end{split}\right\}\)
Text markup \text $x+y=z\quad \text{(Phương trình 1)}$ \(x+y=z\quad\text{(Phương trình 1)}\)
Bold text \textbf $\textbf{x}+y$ \(\textbf{x}+y\) Xem thêm mục 11.1. Formatted text12. Formatting mathematics symbols: https://en.wikibooks.org/wiki/LaTeX/Mathematics#Formatted_text
Color \color ${\color{red}x} \mathbin{\color{#00ff00}-} 2$ \({\color{red}x}\mathbin{\color{#00ff00}-} 2\) Xem thêm mục 13. Color: https://en.wikibooks.org/wiki/LaTeX/Mathematics#Color
Boxed Equations \boxed $\boxed{x+y=z}$ \(\boxed{x+y=z}\)
kable(tex_mml[tex_mml$Group == 3, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Identifiers <mi>
Greek letters \alpha \beta $\alpha$ $\beta$ \(\alpha\) \(\beta\)
\delta \Delta $\delta$ $\Delta$ \(\delta\) \(\Delta\)
\epsilon \varepsilon $\epsilon$ $\varepsilon$ \(\epsilon\) \(\varepsilon\)
\eta \lambda $\eta$ $\lambda$ \(\eta\) \(\lambda\)
\gamma \Gamma $\gamma$ $\Gamma$ \(\gamma\) \(\Gamma\)
\pi \Pi $\pi$ $\Pi$ \(\pi\) \(\Pi\)
\phi \varphi \Phi $\phi$ $\varphi$ $\Phi$ \(\phi\) \(\varphi\) \(\Phi\)
\sigma \Sigma $\sigma$ $\Sigma$ \(\sigma\) \(\Sigma\)
\mu \theta \chi $\mu$ $\theta$ $\chi$ \(\mu\) \(\theta\) \(\chi\)
Numbers <mn>
kable(tex_mml[tex_mml$Group == 4, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Superscript ^ <msup> Z^k \(Z^k\) Dấu mũ; lũy thừa.
Subscript _ <msub> Z_n \(Z_n\)
Block, Group {...} <mrow> $Z_{2.n}$ $Z^{2.k}$ $Z_{2_n}^{k^k}$ \(Z_{2.n}\) \(Z^{2.k}\) \(Z_{2_n}^{k^k}\) LaTeX không phân biệt trước sau. MathML thì phân biệt và phải đặt trong tag <msubsup>.
$_{4}^{12}{C} ^{5+}_{2}$ \(_{4}^{12}{C}^{5+}_{2}\) Thiết nghĩ, cách nhớ chung là dưới trước trên sau.
Brackets and Parentheses (...) [...] \{…\} |...|, \left(...\right) $(\frac{x}{y})$ $[X]$ $\{Y\}$ $|Z|$ \((\frac{x}{y})\) \([X]\) \(\{Y\}\) \(|Z|\)
$\left( \frac{x}{y} \right)$ \(\left(\frac{x}{y}\right)\)
Arrows \to \gets $\to$ $\gets$ \(\to\) \(\gets\)
\Rightarrow \Leftarrow $\Rightarrow$ $\Leftarrow$ \(\Rightarrow\) \(\Leftarrow\)
\Leftrightarrow \rightleftharpoons $\Leftrightarrow$ $\rightleftharpoons$ \(\Leftrightarrow\) \(\rightleftharpoons\)
\uparrow \downarrow $\uparrow$ $\downarrow$ \(\uparrow\) \(\downarrow\)
\overrightarrow \overleftarrow $\overrightarrow{Z}$ $\overleftarrow{Z}$ \(\overrightarrow{Z}\) \(\overleftarrow{Z}\)
\xrightarrow \xleftarrow $\xrightarrow[T]{t^0}$ $\xleftarrow[T]{t^0}$ \(\xrightarrow[T]{t^0}\) \(\xleftarrow[T]{t^0}\)
\widehat $\widehat{Z}$ \(\widehat{Z}\)
kable(tex_mml[tex_mml$Group == 5, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Operators <mo>
Addition + <mo>+</mo>
Subtraction - <mo>-</mo>
Multiplication \times <mo>&#xD7;</mo> $a \times b$ \(a \times b\)
Division \frac{n}{d} <mfrac> $\frac{num}{den}$ \(\frac{num}{den}\) MathML: <mfrac><mrow><mi>numerator</mi></mrow><mrow><mi>denominator</mi></mrow></mfrac>
Binary operators \pm \mp \otimes \oplus \cup \cap $\pm$ $\mp$ $\otimes$ $\oplus$ $\cup$ $\cap$ \(\pm\) \(\mp\) \(\otimes\) \(\oplus\) \(\cup\) \(\cap\)
Relation operators \equiv \sim \simeq \neq \leq \geq $\equiv$ $\sim$ $\simeq$ $\neq$ $\leq$ $\geq$ \(\equiv\) \(\sim\) \(\simeq\) \(\neq\) \(\leq\) \(\geq\)
Symbols \infty \dots \cdots \vdots $\infty$ $\dots$ $\cdots$ $\vdots$ \(\infty\) \(\dots\) \(\cdots\) \(\vdots\)
Set symbols \exists \nexists \forall \subset \subseteq \supset \supseteq \in \notin $\exists$ $\nexists$ $\forall$ $\subset$ $\subseteq$ $\supset$ $\supseteq$ $\in$ $\notin$ \(\exists\) \(\nexists\) \(\forall\) \(\subset\) \(\subseteq\) \(\supset\) \(\supseteq\) \(\in\) \(\notin\)
kable(tex_mml[tex_mml$Group == 6, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Square root \sqrt <msqrt> $\sqrt Z$ $\sqrt{\frac{n}{d}}$ \(\sqrt Z\) \(\sqrt{\frac{n}{d}}\) Căn bậc 2.
nth root \sqrt[n] <mroot> $\sqrt[3] Z$ $\sqrt[4]{\frac{n}{d}}$ \(\sqrt[3] Z\) \(\sqrt[4]{\frac{n}{d}}\) Căn bậc n. 
Limits \lim\limits_{...} <munder> $\lim\limits _{x\to\infty} {f(x)}$ \(\lim\limits_{x\to\infty}{f(x)}\) MathML:<math><mrow><munder><mo>lim</mo><mrow><mi>x</mi><mo>&#x2192;</mo><mi>&#x221E;</mi></mrow></munder><mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow></math>
Sums, Products \sum \prod $\sum$ $\prod$ \(\sum\) \(\prod\)
$\displaystyle\sum _{n=1}^{\infty} 2^{-n}$ \(\displaystyle\sum_{n=1}^{\infty}2^{-n}\)
Integrals \int \oint $\int$ $\oint$ \(\int\) \(\oint\)
kable(tex_mml[tex_mml$Group == 7, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Matrix pmatrix bmatrix vmatrix
$\begin{pmatrix}0 & 1 \\ 2 & 3\end{pmatrix}$ \(\begin{pmatrix}0 & 1 \\ 2 & 3\end{pmatrix}\)
kable(tex_mml[tex_mml$Group == 8, 3:ncol(tex_mml)], row.names = F) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = T) %>%
  scroll_box(width = "auto")
Name LaTeX MathML HTMLExample Output HTMLDescription
Chemistry formulae \ce $\ce{SO4^2- +Ba^2+ -&gt;BaSO4 v}$ \(\ce{SO4^2-+Ba^2+-&gt;BaSO4 v}\)
$\ce{SO}_4^{2-} \ce{+Ba^2+ -&gt;BaSO4 v}$ \(\ce{SO}_4^{2-}\ce{+Ba^2+-&gt;BaSO4 v}\) Kết hợp Công thức dạng Hóa học và dạng Toán học để biểu diễn đẹp hơn.

$\ce{SO4^2-+Ba^2+->BaSO4 v}$ \(\ce{SO4^2-+Ba^2+->BaSO4 v}\)

$\ce{SO}_4^{2-}\ce{+Ba^2+->BaSO4 v}$ \(\ce{SO}_4^{2-}\ce{+Ba^2+->BaSO4 v}\)





LS0tDQp0aXRsZTogIlBo4bulIGzhu6VjIDE6IEPDoWMgYuG6o25nIG3DoyB0aMaw4budbmcgZMO5bmciDQpzdWJ0aXRsZTogIig8c3BhbiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lXCI+KipEKio8L3NwYW4+ZXNpZ24gPHNwYW4gc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZVwiPioqRCoqPC9zcGFuPm9jdW1lbnRzIHdpdGggPHNwYW4gc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZVwiPioqUk1hcmtkb3duKio8L3NwYW4+KSINCmF1dGhvcjogIlRyw6F0IFF1YW5nIFRo4buleSINCmRhdGU6ICJOZ8OgeSAyMC8yLzIwMjAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjc3M6IFN0eWxlLmNzcw0KICAgIGRmX3ByaW50OiBkZWZhdWx0DQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAga2VlcF9tZDogeWVzDQogICAgI21hdGhqYXg6IG51bGwNCiAgICAjbWF0aGpheDogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbWF0aGpheEAzL2VzNS90ZXgtbW1sLWNodG1sLmpzIg0KICAgICNtYXRoamF4OiBsb2NhbA0KICAgICNzZWxmX2NvbnRhaW5lZDogZmFsc2UNCiAgICBpbmNsdWRlczoNCiAgICAgIGluX2hlYWRlcjogX2hlYWRlcl9NYXRoSmF4Lmh0bWwNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCm9wdGlvbnMoa25pdHIudGFibGUuZm9ybWF0ID0gJ2h0bWwnKQ0Kb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICcnKQ0KYGBgDQoNCjxkaXYgY2xhc3M9ImxvZ3MiPg0KPGRpdiBjbGFzcz0ibG9ncy1jYXB0aW9uIj5Mb2dzPC9kaXY+DQo8ZGl2IGNsYXNzPSJsb2dzLWNvbnRlbnQgc2Nyb2xsIj4NCioqMTguMi4yMDIwOioqDQoNCi0gVGjDqm0gbeG7mXQgc+G7kSBk4bqhbmcgQ8O0bmcgdGjhu6ljIFRvw6FuIGjhu41jLg0KDQotIFRow6ptIGThuqFuZyBDw7RuZyB0aOG7qWMgSMOzYSBo4buNYy4NCg0KKiozLjIuMjAyMDoqKiBVcGxvYWQgbMOqbiBgUlB1YnNgLg0KDQotIFJQdWJzOiA8YSB0YXJnZXQ9Il9wYXJlbnQiIGhyZWY9Imh0dHBzOi8vcnB1YnMuY29tL0JhYnlNb3VzZS9kZHJFbmNvZGluZ1RhYmxlcyI+aHR0cHM6Ly9ycHVicy5jb20vQmFieU1vdXNlL2RkckVuY29kaW5nVGFibGVzPC9hPg0KDQoqKjMwLjEuMjAyMDoqKiBLaOG7n2kgdOG6oW8gdHJhbmcgdsOgIHVwbG9hZCBsw6puIGBHaXRIdWJgLg0KDQotIEdpdEh1YjogPGEgdGFyZ2V0PSJfcGFyZW50IiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQmFieU1vdXNlL2RkUk1hcmtkb3duIj5odHRwczovL2dpdGh1Yi5jb20vQmFieU1vdXNlL2RkUk1hcmtkb3duPC9hPg0KDQo8L2Rpdj48L2Rpdj4NCjwvYnI+DQoNCiMgVMOgaSBsaeG7h3UgdGhhbSBraOG6o28NCltBU0NJSSBUYWJsZV0oaHR0cDovL2FzY2lpLXRhYmxlLmNvbS9jb2RlcGFnZS5waHA/MTI1MikNCg0KW1ThuqFpIHNhbyBraMO0bmcgYmFvIGdp4budIG7Dqm4gc+G7rSBk4bulbmcgdXRmOCB0cm9uZyBNeVNRTD9dKGh0dHBzOi8vdG9wZGV2LnZuL2Jsb2cvdGFpLXNhby1raG9uZy1iYW8tZ2lvLW5lbi1zdS1kdW5nLXV0ZjgtdHJvbmctbXlzcWwvKQ0KDQpbV2lraXBlZGlhOiBMaXN0IG9mIFhNTCBhbmQgSFRNTCBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZXNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfWE1MX2FuZF9IVE1MX2NoYXJhY3Rlcl9lbnRpdHlfcmVmZXJlbmNlcykNCg0KW0phdmFTY3JpcHQgU3RyaW5nIEVzY2FwZSAvIFVuZXNjYXBlXShodHRwczovL3d3dy5mcmVlZm9ybWF0dGVyLmNvbS9qYXZhc2NyaXB0LWVzY2FwZS5odG1sKQ0KDQpbTGFUZVggLyBNYXRoZW1hdGljc10oaHR0cHM6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvTGFUZVgvTWF0aGVtYXRpY3MpDQoNCltPdmVybGVhZjogTWF0aGVtYXRpY2FsIGV4cHJlc3Npb25zXShodHRwczovL3d3dy5vdmVybGVhZi5jb20vbGVhcm4vbGF0ZXgvTWF0aGVtYXRpY2FsX2V4cHJlc3Npb25zKQ0KDQpbV2lraXBlZGlhOiBNYXRoTUxdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01hdGhNTCkNCg0KW01ETjogTWF0aE1MXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9NYXRoTUwpDQoNCltXM0M6IE1hdGhlbWF0aWNhbCBNYXJrdXAgTGFuZ3VhZ2UgKE1hdGhNTCkgVmVyc2lvbiAzLjAgMm5kIEVkaXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9NYXRoTUwzLykNCg0KIyBMb2FkIGThu68gbGnhu4d1IHbDoCBjw6FjIHRoxrAgdmnhu4duIGPhuqduIGTDuW5nDQpgYGB7cn0NCmh0bWxfZW50aXRpZXNQYXRoRmlsZSA9ICJHOi9SL1Byb2plY3RzL2RkUk1hcmtkb3duL19kYXRhc2V0cy9odG1sX2VudGl0aWVzLmNzdiINCmh0bWxfZW50aXRpZXMgPSByZWFkLmNzdihodG1sX2VudGl0aWVzUGF0aEZpbGUsIGVuY29kaW5nID0gIlVURi04IikNCg0KZXNjYXBlUGF0aEZpbGUgPSAiRzovUi9Qcm9qZWN0cy9kZFJNYXJrZG93bi9fZGF0YXNldHMvZXNjYXBlLmNzdiINCmVzY2FwZSA9IHJlYWQuY3N2KGVzY2FwZVBhdGhGaWxlLCBlbmNvZGluZyA9ICJVVEYtOCIpDQoNCnRleF9tbWxQYXRoRmlsZSA9ICJHOi9SL1Byb2plY3RzL2RkUk1hcmtkb3duL19kYXRhc2V0cy90ZXhfbW1sLmNzdiINCnRleF9tbWwgPSByZWFkLmNzdih0ZXhfbW1sUGF0aEZpbGUsIGVuY29kaW5nID0gIlVURi04IikNCg0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYGBgDQoNCiMgQ8OhYyBtw6Mga8OtIHThu7EgaGF5IGTDuW5nIHRyb25nIHRyYW5nIHdlYg0KYGBge3J9DQojIGhlYWQoaHRtbF9lbnRpdGllcykNCmthYmxlKGh0bWxfZW50aXRpZXNbMjpuY29sKGh0bWxfZW50aXRpZXMpXSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpICU+JQ0KICBzY3JvbGxfYm94KHdpZHRoID0gImF1dG8iKQ0KYGBgDQoNCiMgQ8OhYyBtw6MgZXNjYXBlDQpgYGB7cn0NCiMgaGVhZChlc2NhcGUpDQprYWJsZShlc2NhcGVbMjpuY29sKGVzY2FwZSldKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lDQogIHNjcm9sbF9ib3god2lkdGggPSAiYXV0byIpDQpgYGANCg0KIyBDw6FjIG3DoyDEkcOhbmggZOG6pXUgQ8O0bmcgdGjhu6ljIHRvw6FuIGjhu41jIGhheSBkw7luZw0KYGBge3J9DQojaGVhZCh0ZXhfbW1sKQ0Ka2FibGUodGV4X21tbFt0ZXhfbW1sJEdyb3VwID09IDEsIDM6bmNvbCh0ZXhfbW1sKV0sIHJvdy5uYW1lcyA9IEYpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gVCkgJT4lDQogIHNjcm9sbF9ib3god2lkdGggPSAiYXV0byIpDQpgYGANCg0KYGBge3J9DQprYWJsZSh0ZXhfbW1sW3RleF9tbWwkR3JvdXAgPT0gMiwgMzpuY29sKHRleF9tbWwpXSwgcm93Lm5hbWVzID0gRikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBUKSAlPiUNCiAgc2Nyb2xsX2JveCh3aWR0aCA9ICJhdXRvIikNCmBgYA0KDQpgYGB7cn0NCmthYmxlKHRleF9tbWxbdGV4X21tbCRHcm91cCA9PSAzLCAzOm5jb2wodGV4X21tbCldLCByb3cubmFtZXMgPSBGKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IFQpICU+JQ0KICBzY3JvbGxfYm94KHdpZHRoID0gImF1dG8iKQ0KYGBgDQoNCmBgYHtyfQ0Ka2FibGUodGV4X21tbFt0ZXhfbW1sJEdyb3VwID09IDQsIDM6bmNvbCh0ZXhfbW1sKV0sIHJvdy5uYW1lcyA9IEYpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gVCkgJT4lDQogIHNjcm9sbF9ib3god2lkdGggPSAiYXV0byIpDQpgYGANCg0KYGBge3J9DQprYWJsZSh0ZXhfbW1sW3RleF9tbWwkR3JvdXAgPT0gNSwgMzpuY29sKHRleF9tbWwpXSwgcm93Lm5hbWVzID0gRikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBUKSAlPiUNCiAgc2Nyb2xsX2JveCh3aWR0aCA9ICJhdXRvIikNCmBgYA0KDQpgYGB7cn0NCmthYmxlKHRleF9tbWxbdGV4X21tbCRHcm91cCA9PSA2LCAzOm5jb2wodGV4X21tbCldLCByb3cubmFtZXMgPSBGKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IFQpICU+JQ0KICBzY3JvbGxfYm94KHdpZHRoID0gImF1dG8iKQ0KYGBgDQoNCmBgYHtyfQ0Ka2FibGUodGV4X21tbFt0ZXhfbW1sJEdyb3VwID09IDcsIDM6bmNvbCh0ZXhfbW1sKV0sIHJvdy5uYW1lcyA9IEYpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gVCkgJT4lDQogIHNjcm9sbF9ib3god2lkdGggPSAiYXV0byIpDQpgYGANCg0KPGRpdj5gJFxiZWdpbntwbWF0cml4fTAgJiAxIFxcIDIgJiAzXGVuZHtwbWF0cml4fSRgDQokXGJlZ2lue3BtYXRyaXh9MCAmIDEgXFwgMiAmIDNcZW5ke3BtYXRyaXh9JDwvZGl2Pg0KDQpgYGB7cn0NCmthYmxlKHRleF9tbWxbdGV4X21tbCRHcm91cCA9PSA4LCAzOm5jb2wodGV4X21tbCldLCByb3cubmFtZXMgPSBGKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IFQpICU+JQ0KICBzY3JvbGxfYm94KHdpZHRoID0gImF1dG8iKQ0KYGBgDQpgJFxjZXtTTzReMi0rQmFeMistPkJhU080IHZ9JGAgJFxjZXtTTzReMi0rQmFeMistPkJhU080IHZ9JA0KDQpgJFxjZXtTT31fNF57Mi19XGNleytCYV4yKy0+QmFTTzQgdn0kYCAkXGNle1NPfV80XnsyLX1cY2V7K0JhXjIrLT5CYVNPNCB2fSQNCg0KDQo8IS0tDQojYXMuZmFjdG9yKHRleF9tbWwkTWF0aE1MKQ0KI3RleF9tbWwkTWF0aE1MWzFdDQojb3B0aW9ucyhrZWVwLnNvdXJjZSA9IEZBTFNFKQ0KDQojcHJpbnQoa2FibGUodGV4X21tbFsyOm5jb2wodGV4X21tbCldKSAlPiUga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lIHNjcm9sbF9ib3god2lkdGggPSAiYXV0byIpKQ0KDQojaHRtbHRvb2xzOjpodG1sX3ByaW50KA0KIyAga2FibGUodGV4X21tbFsyOm5jb2wodGV4X21tbCldKSAlPiUga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAjImhvdmVyIikpICU+JSBzY3JvbGxfYm94KHdpZHRoID0gImF1dG8iKQ0KIykNCg0KDQpgYGB7cn0NCnQgPSBjKCJJbmxpbmU6IFxcJC4uLlxcJDsgRGlzcGxheTogJiN4MDAyNDsmI3gwMDI0Oy4uLiYjeDAwMjQ7JiN4MDAyNDsiKQ0KDQprYWJsZSh0KSAlPiUga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lIHNjcm9sbF9ib3god2lkdGggPSAiYXV0byIpDQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBwYWRkaW5nOiA1cHg7IG92ZXJmbG93LXg6IHNjcm9sbDsgd2lkdGg6YXV0bzsgIj48dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIiIHN0eWxlPSJtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyI+DQogPHRoZWFkPg0KICA8dHI+DQogICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsiPiBOYW1lIDwvdGg+DQogICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsiPiBMYVRlWCA8L3RoPg0KICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij4gTWF0aE1MIDwvdGg+DQogICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsiPiBIVE1MRXhhbXBsZSA8L3RoPg0KICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij4gSFRNTERlc2NyaXB0aW9uIDwvdGg+DQogIDwvdHI+DQogPC90aGVhZD4NCjx0Ym9keT4NCiAgPHRyPg0KICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij4gRXF1YXRpb25zIDwvdGQ+DQogICA8dGQgc3R5bGU9InRleHQtYWxpZ246bGVmdDsiPiBJbmxpbmU6IDxjb2RlPiZic29sOyguLi4mYnNvbDspPC9jb2RlPiwgPGNvZGU+JmRvbGxhcjsuLi4mZG9sbGFyOzwvY29kZT47IERpc3BsYXk6IGBcWy4uLlxdYCwgPGNvZGU+JmRvbGxhcjsmZG9sbGFyOy4uLiZkb2xsYXI7JmRvbGxhcjs8L2NvZGU+PC90ZD4NCiAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyI+IGBodG1sIDxtYXRoPi4uLjwvbWF0aD5gIGhheSA8Y29kZT4mbHQ7bWF0aCB4bWxucz0iW2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxdKGh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwpIiZndDsuLi4mbHQ7L21hdGgmZ3Q7PC9jb2RlPiA8L3RkPg0KICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij4gTkEgPC90ZD4NCiAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyI+IMSQw6FuaCBk4bqldSBDw7RuZyB0aOG7qWMgdG/DoW4gaOG7jWMuIDwvdGQ+DQogIDwvdHI+DQo8L3Rib2R5Pg0KPC90YWJsZT48L2Rpdj4NCi0tPg0KDQo8YnIvPjxici8+PGJyLz48YnIvPg0K