diff --git a/.example/os/gres/gres.go b/.example/os/gres/gres.go
index 124627c5d..010fcf163 100644
--- a/.example/os/gres/gres.go
+++ b/.example/os/gres/gres.go
@@ -8,7 +8,8 @@ import (
func main() {
gres.Dump()
- g.Dump(gres.Scan("/root/image/", "*", true))
- g.Dump(gres.Scan("/template", "*"))
- g.Dump(gres.Scan("/template/layout2", "*.html", true))
+ g.Dump(gres.Scan("/root/image/logo", "*"))
+ //g.Dump(gres.Scan("/root/image/", "*", true))
+ //g.Dump(gres.Scan("/template", "*"))
+ //g.Dump(gres.Scan("/template/layout2", "*.html", true))
}
diff --git a/.example/os/gview/resource/main3.go b/.example/os/gview/resource/main3.go
new file mode 100644
index 000000000..ad3dbfa1d
--- /dev/null
+++ b/.example/os/gview/resource/main3.go
@@ -0,0 +1,18 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/gogf/gf/frame/g"
+ "github.com/gogf/gf/os/gres"
+ _ "github.com/gogf/gf/os/gres/testdata"
+)
+
+func main() {
+ gres.Dump()
+
+ v := g.View()
+ s, err := v.Parse("index.html")
+ fmt.Println(err)
+ fmt.Println(s)
+}
diff --git a/.example/util/gregex/gregex.go b/.example/text/gregex/gregex.go
similarity index 100%
rename from .example/util/gregex/gregex.go
rename to .example/text/gregex/gregex.go
diff --git a/.example/util/gstr/gstr_hidestr.go b/.example/text/gstr/gstr_hidestr.go
similarity index 100%
rename from .example/util/gstr/gstr_hidestr.go
rename to .example/text/gstr/gstr_hidestr.go
diff --git a/.example/util/gstr/gstr_substr.go b/.example/text/gstr/gstr_substr.go
similarity index 100%
rename from .example/util/gstr/gstr_substr.go
rename to .example/text/gstr/gstr_substr.go
diff --git a/.example/util/gi18n/gi18n-dir.go b/.example/util/gi18n/gi18n-dir.go
new file mode 100644
index 000000000..3c6e9c534
--- /dev/null
+++ b/.example/util/gi18n/gi18n-dir.go
@@ -0,0 +1,18 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/gogf/gf/util/gi18n"
+)
+
+func main() {
+ t := gi18n.New()
+ t.SetLanguage("ja")
+ err := t.SetPath("./i18n-dir")
+ if err != nil {
+ panic(err)
+ }
+ fmt.Println(t.Translate(`hello`))
+ fmt.Println(t.Translate(`{#hello}}{#world}}!`))
+}
diff --git a/.example/util/gi18n/gi18n-file.go b/.example/util/gi18n/gi18n-file.go
new file mode 100644
index 000000000..ac8232945
--- /dev/null
+++ b/.example/util/gi18n/gi18n-file.go
@@ -0,0 +1,18 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/gogf/gf/util/gi18n"
+)
+
+func main() {
+ t := gi18n.New()
+ t.SetLanguage("ja")
+ err := t.SetPath("./i18n-file")
+ if err != nil {
+ panic(err)
+ }
+ fmt.Println(t.Translate(`hello`))
+ fmt.Println(t.Translate(`{#hello}}{#world}}!`))
+}
diff --git a/.example/util/gi18n/gi18n.go b/.example/util/gi18n/gi18n.go
new file mode 100644
index 000000000..1df9ed49a
--- /dev/null
+++ b/.example/util/gi18n/gi18n.go
@@ -0,0 +1,15 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/gogf/gf/util/gi18n"
+)
+
+func main() {
+ t := gi18n.New()
+ t.SetLanguage("ja")
+ fmt.Println(t.Translate(`hello`))
+ fmt.Println(t.Translate(`{#hello}}{#world}}!`))
+
+}
diff --git a/.example/util/gi18n/i18n-dir/en/hello.toml b/.example/util/gi18n/i18n-dir/en/hello.toml
new file mode 100644
index 000000000..1680a362c
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/en/hello.toml
@@ -0,0 +1,2 @@
+
+hello = "Hello"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/en/world.toml b/.example/util/gi18n/i18n-dir/en/world.toml
new file mode 100644
index 000000000..f9afd1e67
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/en/world.toml
@@ -0,0 +1,2 @@
+
+world = "World"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/ja/hello.yaml b/.example/util/gi18n/i18n-dir/ja/hello.yaml
new file mode 100644
index 000000000..ec827cd49
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/ja/hello.yaml
@@ -0,0 +1,2 @@
+
+hello: "こんにちは"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/ja/world.yaml b/.example/util/gi18n/i18n-dir/ja/world.yaml
new file mode 100644
index 000000000..04e828b42
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/ja/world.yaml
@@ -0,0 +1 @@
+world: "世界"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/ru/hello.ini b/.example/util/gi18n/i18n-dir/ru/hello.ini
new file mode 100644
index 000000000..d2e2af1ca
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/ru/hello.ini
@@ -0,0 +1 @@
+hello = Привет
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/ru/world.ini b/.example/util/gi18n/i18n-dir/ru/world.ini
new file mode 100644
index 000000000..fffaf192d
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/ru/world.ini
@@ -0,0 +1 @@
+world=мир
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/zh-CN/hello.json b/.example/util/gi18n/i18n-dir/zh-CN/hello.json
new file mode 100644
index 000000000..b8eb10e94
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/zh-CN/hello.json
@@ -0,0 +1,3 @@
+{
+ "hello": "你好"
+}
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/zh-CN/world.json b/.example/util/gi18n/i18n-dir/zh-CN/world.json
new file mode 100644
index 000000000..9d6392149
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/zh-CN/world.json
@@ -0,0 +1,3 @@
+{
+ "world": "世界"
+}
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/zh-TW/hello.xml b/.example/util/gi18n/i18n-dir/zh-TW/hello.xml
new file mode 100644
index 000000000..a4e52ef07
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/zh-TW/hello.xml
@@ -0,0 +1,4 @@
+
+
+ 你好
+
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-dir/zh-TW/world.xml b/.example/util/gi18n/i18n-dir/zh-TW/world.xml
new file mode 100644
index 000000000..877b402c5
--- /dev/null
+++ b/.example/util/gi18n/i18n-dir/zh-TW/world.xml
@@ -0,0 +1,4 @@
+
+
+ 世界
+
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-file/en.toml b/.example/util/gi18n/i18n-file/en.toml
new file mode 100644
index 000000000..17df41597
--- /dev/null
+++ b/.example/util/gi18n/i18n-file/en.toml
@@ -0,0 +1,3 @@
+
+hello = "Hello"
+world = "World"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-file/ja.yaml b/.example/util/gi18n/i18n-file/ja.yaml
new file mode 100644
index 000000000..0166fcefb
--- /dev/null
+++ b/.example/util/gi18n/i18n-file/ja.yaml
@@ -0,0 +1,3 @@
+
+hello: "こんにちは"
+world: "世界"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-file/ru.ini b/.example/util/gi18n/i18n-file/ru.ini
new file mode 100644
index 000000000..f04620fab
--- /dev/null
+++ b/.example/util/gi18n/i18n-file/ru.ini
@@ -0,0 +1,2 @@
+hello = Привет
+world = мир
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-file/zh-CN.json b/.example/util/gi18n/i18n-file/zh-CN.json
new file mode 100644
index 000000000..1de75ba1a
--- /dev/null
+++ b/.example/util/gi18n/i18n-file/zh-CN.json
@@ -0,0 +1,4 @@
+{
+ "hello": "你好",
+ "world": "世界"
+}
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n-file/zh-TW.xml b/.example/util/gi18n/i18n-file/zh-TW.xml
new file mode 100644
index 000000000..9a4356f4c
--- /dev/null
+++ b/.example/util/gi18n/i18n-file/zh-TW.xml
@@ -0,0 +1,5 @@
+
+
+ 你好
+ 世界
+
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n/en.toml b/.example/util/gi18n/i18n/en.toml
new file mode 100644
index 000000000..17df41597
--- /dev/null
+++ b/.example/util/gi18n/i18n/en.toml
@@ -0,0 +1,3 @@
+
+hello = "Hello"
+world = "World"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n/ja.toml b/.example/util/gi18n/i18n/ja.toml
new file mode 100644
index 000000000..8ca47ed7f
--- /dev/null
+++ b/.example/util/gi18n/i18n/ja.toml
@@ -0,0 +1,3 @@
+
+hello = "こんにちは"
+world = "世界"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n/ru.toml b/.example/util/gi18n/i18n/ru.toml
new file mode 100644
index 000000000..938434a5a
--- /dev/null
+++ b/.example/util/gi18n/i18n/ru.toml
@@ -0,0 +1,3 @@
+
+hello = "Привет"
+world = "мир"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n/zh-CN.toml b/.example/util/gi18n/i18n/zh-CN.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/.example/util/gi18n/i18n/zh-CN.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file
diff --git a/.example/util/gi18n/i18n/zh-TW.toml b/.example/util/gi18n/i18n/zh-TW.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/.example/util/gi18n/i18n/zh-TW.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file
diff --git a/.example/util/gi18n/resource/gi18n-resource.go b/.example/util/gi18n/resource/gi18n-resource.go
new file mode 100644
index 000000000..48ea52528
--- /dev/null
+++ b/.example/util/gi18n/resource/gi18n-resource.go
@@ -0,0 +1,20 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/gogf/gf/frame/g"
+
+ _ "github.com/gogf/gf/os/gres/testdata"
+)
+
+func main() {
+ t := g.I18n()
+ t.SetLanguage("ja")
+ err := t.SetPath("/i18n-dir")
+ if err != nil {
+ panic(err)
+ }
+ fmt.Println(t.Translate(`hello`))
+ fmt.Println(t.Translate(`{{hello}}{{world}}!`))
+}
diff --git a/database/gdb/gdb_func.go b/database/gdb/gdb_func.go
index cffab7410..9bd473b12 100644
--- a/database/gdb/gdb_func.go
+++ b/database/gdb/gdb_func.go
@@ -27,17 +27,17 @@ type apiString interface {
}
const (
- OrmTagForStruct = "orm"
- OrmTagForUnique = "unique"
- OrmTagForPrimary = "primary"
+ ORM_TAG_FOR_STRUCT = "orm"
+ ORM_TAG_FOR_UNIQUE = "unique"
+ ORM_TAG_FOR_PRIMARY = "primary"
)
// 获得struct对象对应的where查询条件
func GetWhereConditionOfStruct(pointer interface{}) (where string, args []interface{}) {
array := ([]string)(nil)
- for tag, field := range structs.TagMapField(pointer, []string{OrmTagForStruct}, true) {
+ for tag, field := range structs.TagMapField(pointer, []string{ORM_TAG_FOR_STRUCT}, true) {
array = strings.Split(tag, ",")
- if len(array) > 1 && gstr.InArray([]string{OrmTagForUnique, OrmTagForPrimary}, array[1]) {
+ if len(array) > 1 && gstr.InArray([]string{ORM_TAG_FOR_UNIQUE, ORM_TAG_FOR_PRIMARY}, array[1]) {
return array[0], []interface{}{field.Value()}
}
if len(where) > 0 {
@@ -52,7 +52,7 @@ func GetWhereConditionOfStruct(pointer interface{}) (where string, args []interf
// 获得orm标签与属性的映射关系
func GetOrmMappingOfStruct(pointer interface{}) map[string]string {
mapping := make(map[string]string)
- for tag, attr := range structs.TagMapName(pointer, []string{OrmTagForStruct}, true) {
+ for tag, attr := range structs.TagMapName(pointer, []string{ORM_TAG_FOR_STRUCT}, true) {
mapping[strings.Split(tag, ",")[0]] = attr
}
return mapping
@@ -172,7 +172,7 @@ func getInsertOperationByOption(option int) string {
// 将对象转换为map,如果对象带有继承对象,那么执行递归转换。
// 该方法用于将变量传递给数据库执行之前。
func structToMap(obj interface{}) map[string]interface{} {
- data := gconv.Map(obj, OrmTagForStruct)
+ data := gconv.Map(obj, ORM_TAG_FOR_STRUCT)
for key, value := range data {
rv := reflect.ValueOf(value)
kind := rv.Kind()
diff --git a/debug/gdebug/gdebug.go b/debug/gdebug/gdebug.go
index 132990cfa..002b3525c 100644
--- a/debug/gdebug/gdebug.go
+++ b/debug/gdebug/gdebug.go
@@ -10,6 +10,7 @@ package gdebug
import (
"bytes"
"fmt"
+ "path/filepath"
"runtime"
"strings"
)
@@ -187,6 +188,12 @@ func CallerFilePath() string {
return path
}
+// CallerDirectory returns the directory of the caller.
+func CallerDirectory() string {
+ _, path, _ := Caller()
+ return filepath.Dir(path)
+}
+
// CallerFileLine returns the file path along with the line number of the caller.
func CallerFileLine() string {
_, path, line := Caller()
diff --git a/encoding/gjson/gjson_api_new_load.go b/encoding/gjson/gjson_api_new_load.go
index 53384901c..8341ff5c8 100644
--- a/encoding/gjson/gjson_api_new_load.go
+++ b/encoding/gjson/gjson_api_new_load.go
@@ -161,7 +161,7 @@ func doLoadContent(dataType string, data []byte, safe ...bool) (*Json, error) {
dataType = checkDataType(data)
}
switch dataType {
- case "json", ".json":
+ case "json", ".json", ".js":
case "xml", ".xml":
if data, err = gxml.ToJson(data); err != nil {
diff --git a/frame/g/g_object.go b/frame/g/g_object.go
index 2abdfe826..eb5d1753c 100644
--- a/frame/g/g_object.go
+++ b/frame/g/g_object.go
@@ -17,6 +17,7 @@ import (
"github.com/gogf/gf/os/gcfg"
"github.com/gogf/gf/os/gres"
"github.com/gogf/gf/os/gview"
+ "github.com/gogf/gf/util/gi18n"
)
// Server returns an instance of http server with specified name.
@@ -56,6 +57,12 @@ func Resource(name ...string) *gres.Resource {
return gins.Resource(name...)
}
+// I18n returns an instance of gi18n.Translator.
+// The parameter is the name for the instance.
+func I18n(name ...string) *gi18n.Translator {
+ return gins.I18n(name...)
+}
+
// Res is alias of Resource.
// See Resource.
func Res(name ...string) *gres.Resource {
diff --git a/frame/gins/gins.go b/frame/gins/gins.go
index 5d48999ad..19afbb333 100644
--- a/frame/gins/gins.go
+++ b/frame/gins/gins.go
@@ -26,6 +26,7 @@ import (
"github.com/gogf/gf/text/gregex"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/util/gconv"
+ "github.com/gogf/gf/util/gi18n"
)
const (
@@ -85,6 +86,12 @@ func Resource(name ...string) *gres.Resource {
return gres.Instance(name...)
}
+// I18n returns an instance of gi18n.Translator.
+// The parameter is the name for the instance.
+func I18n(name ...string) *gi18n.Translator {
+ return gi18n.Instance(name...)
+}
+
// Database returns an instance of database ORM object
// with specified configuration group name.
func Database(name ...string) gdb.DB {
diff --git a/os/gfile/gfile_scan.go b/os/gfile/gfile_scan.go
index 269c6a74f..1ecb9c8ce 100644
--- a/os/gfile/gfile_scan.go
+++ b/os/gfile/gfile_scan.go
@@ -35,7 +35,7 @@ func ScanDir(path string, pattern string, recursive ...bool) ([]string, error) {
//
// Note that it returns only files, exclusive of directories.
func ScanDirFile(path string, pattern string, recursive ...bool) ([]string, error) {
- isRecursive := true
+ isRecursive := false
if len(recursive) > 0 {
isRecursive = recursive[0]
}
diff --git a/os/gres/gres.go b/os/gres/gres.go
index f9be294ea..3a927be02 100644
--- a/os/gres/gres.go
+++ b/os/gres/gres.go
@@ -7,6 +7,11 @@
// Package gres provides resource management and packing/unpacking feature between files and bytes.
package gres
+const (
+ // Separator for directories.
+ Separator = "/"
+)
+
var (
// Default resource object.
defaultResource = Instance()
@@ -54,14 +59,22 @@ func IsEmpty() bool {
return defaultResource.tree.IsEmpty()
}
-// Scan returns the files under the given path, the parameter should be a folder type.
+// ScanDir returns the files under the given path, the parameter should be a folder type.
//
// The pattern parameter supports multiple file name patterns,
// using the ',' symbol to separate multiple patterns.
//
// It scans directory recursively if given parameter is true.
-func Scan(path string, pattern string, recursive ...bool) []*File {
- return defaultResource.Scan(path, pattern, recursive...)
+func ScanDir(path string, pattern string, recursive ...bool) []*File {
+ return defaultResource.ScanDir(path, pattern, recursive...)
+}
+
+// ScanDirFile returns all sub-files with absolute paths of given ,
+// It scans directory recursively if given parameter is true.
+//
+// Note that it returns only files, exclusive of directories.
+func ScanDirFile(path string, pattern string, recursive ...bool) []*File {
+ return defaultResource.ScanDirFile(path, pattern, recursive...)
}
// Dump prints the files of the default resource object.
diff --git a/os/gres/gres_http_file.go b/os/gres/gres_http_file.go
index 33f8295ff..c35554268 100644
--- a/os/gres/gres_http_file.go
+++ b/os/gres/gres_http_file.go
@@ -18,7 +18,7 @@ func (f *File) Close() error {
// Readdir implements Readdir interface of http.File.
func (f *File) Readdir(count int) ([]os.FileInfo, error) {
- files := f.resource.Scan(f.Name(), "*", false)
+ files := f.resource.ScanDir(f.Name(), "*", false)
if len(files) > 0 {
if count < 0 || count > len(files) {
count = len(files)
diff --git a/os/gres/gres_resource.go b/os/gres/gres_resource.go
index 29581ff4f..8d30dd07c 100644
--- a/os/gres/gres_resource.go
+++ b/os/gres/gres_resource.go
@@ -122,13 +122,40 @@ func (r *Resource) IsEmpty() bool {
return r.tree.IsEmpty()
}
-// Scan returns the files under the given path, the parameter should be a folder type.
+// ScanDir returns the files under the given path, the parameter should be a folder type.
//
// The pattern parameter supports multiple file name patterns,
// using the ',' symbol to separate multiple patterns.
//
// It scans directory recursively if given parameter is true.
-func (r *Resource) Scan(path string, pattern string, recursive ...bool) []*File {
+func (r *Resource) ScanDir(path string, pattern string, recursive ...bool) []*File {
+ isRecursive := false
+ if len(recursive) > 0 {
+ isRecursive = recursive[0]
+ }
+ return r.doScanDir(path, pattern, isRecursive, false)
+}
+
+// ScanDirFile returns all sub-files with absolute paths of given ,
+// It scans directory recursively if given parameter is true.
+//
+// Note that it returns only files, exclusive of directories.
+func (r *Resource) ScanDirFile(path string, pattern string, recursive ...bool) []*File {
+ isRecursive := false
+ if len(recursive) > 0 {
+ isRecursive = recursive[0]
+ }
+ return r.doScanDir(path, pattern, isRecursive, true)
+}
+
+// doScanDir is an internal method which scans directory
+// and returns the absolute path list of files that are not sorted.
+//
+// The pattern parameter supports multiple file name patterns,
+// using the ',' symbol to separate multiple patterns.
+//
+// It scans directory recursively if given parameter is true.
+func (r *Resource) doScanDir(path string, pattern string, recursive bool, onlyFile bool) []*File {
if path != "/" {
for path[len(path)-1] == '/' {
path = path[:len(path)-1]
@@ -150,6 +177,9 @@ func (r *Resource) Scan(path string, pattern string, recursive ...bool) []*File
}
first = false
}
+ if onlyFile && value.(*File).FileInfo().IsDir() {
+ return true
+ }
name = key.(string)
if len(name) <= length {
return true
@@ -157,7 +187,11 @@ func (r *Resource) Scan(path string, pattern string, recursive ...bool) []*File
if path != name[:length] {
return false
}
- if len(recursive) == 0 || !recursive[0] {
+ // To avoid of, eg: /i18n and /i18n-dir
+ if !first && name[length] != '/' {
+ return true
+ }
+ if !recursive {
if strings.IndexByte(name[length+1:], '/') != -1 {
return true
}
diff --git a/os/gres/testdata/files/i18n-dir/en/hello.toml b/os/gres/testdata/files/i18n-dir/en/hello.toml
new file mode 100644
index 000000000..1680a362c
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/en/hello.toml
@@ -0,0 +1,2 @@
+
+hello = "Hello"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/en/world.toml b/os/gres/testdata/files/i18n-dir/en/world.toml
new file mode 100644
index 000000000..f9afd1e67
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/en/world.toml
@@ -0,0 +1,2 @@
+
+world = "World"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/ja/hello.yaml b/os/gres/testdata/files/i18n-dir/ja/hello.yaml
new file mode 100644
index 000000000..ec827cd49
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/ja/hello.yaml
@@ -0,0 +1,2 @@
+
+hello: "こんにちは"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/ja/world.yaml b/os/gres/testdata/files/i18n-dir/ja/world.yaml
new file mode 100644
index 000000000..04e828b42
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/ja/world.yaml
@@ -0,0 +1 @@
+world: "世界"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/ru/hello.ini b/os/gres/testdata/files/i18n-dir/ru/hello.ini
new file mode 100644
index 000000000..d2e2af1ca
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/ru/hello.ini
@@ -0,0 +1 @@
+hello = Привет
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/ru/world.ini b/os/gres/testdata/files/i18n-dir/ru/world.ini
new file mode 100644
index 000000000..fffaf192d
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/ru/world.ini
@@ -0,0 +1 @@
+world=мир
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/zh-CN/hello.json b/os/gres/testdata/files/i18n-dir/zh-CN/hello.json
new file mode 100644
index 000000000..b8eb10e94
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/zh-CN/hello.json
@@ -0,0 +1,3 @@
+{
+ "hello": "你好"
+}
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/zh-CN/world.json b/os/gres/testdata/files/i18n-dir/zh-CN/world.json
new file mode 100644
index 000000000..9d6392149
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/zh-CN/world.json
@@ -0,0 +1,3 @@
+{
+ "world": "世界"
+}
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/zh-TW/hello.xml b/os/gres/testdata/files/i18n-dir/zh-TW/hello.xml
new file mode 100644
index 000000000..a4e52ef07
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/zh-TW/hello.xml
@@ -0,0 +1,4 @@
+
+
+ 你好
+
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-dir/zh-TW/world.xml b/os/gres/testdata/files/i18n-dir/zh-TW/world.xml
new file mode 100644
index 000000000..877b402c5
--- /dev/null
+++ b/os/gres/testdata/files/i18n-dir/zh-TW/world.xml
@@ -0,0 +1,4 @@
+
+
+ 世界
+
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-file/en.toml b/os/gres/testdata/files/i18n-file/en.toml
new file mode 100644
index 000000000..17df41597
--- /dev/null
+++ b/os/gres/testdata/files/i18n-file/en.toml
@@ -0,0 +1,3 @@
+
+hello = "Hello"
+world = "World"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-file/ja.yaml b/os/gres/testdata/files/i18n-file/ja.yaml
new file mode 100644
index 000000000..0166fcefb
--- /dev/null
+++ b/os/gres/testdata/files/i18n-file/ja.yaml
@@ -0,0 +1,3 @@
+
+hello: "こんにちは"
+world: "世界"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-file/ru.ini b/os/gres/testdata/files/i18n-file/ru.ini
new file mode 100644
index 000000000..f04620fab
--- /dev/null
+++ b/os/gres/testdata/files/i18n-file/ru.ini
@@ -0,0 +1,2 @@
+hello = Привет
+world = мир
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-file/zh-CN.json b/os/gres/testdata/files/i18n-file/zh-CN.json
new file mode 100644
index 000000000..1de75ba1a
--- /dev/null
+++ b/os/gres/testdata/files/i18n-file/zh-CN.json
@@ -0,0 +1,4 @@
+{
+ "hello": "你好",
+ "world": "世界"
+}
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n-file/zh-TW.xml b/os/gres/testdata/files/i18n-file/zh-TW.xml
new file mode 100644
index 000000000..9a4356f4c
--- /dev/null
+++ b/os/gres/testdata/files/i18n-file/zh-TW.xml
@@ -0,0 +1,5 @@
+
+
+ 你好
+ 世界
+
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n/en.toml b/os/gres/testdata/files/i18n/en.toml
new file mode 100644
index 000000000..17df41597
--- /dev/null
+++ b/os/gres/testdata/files/i18n/en.toml
@@ -0,0 +1,3 @@
+
+hello = "Hello"
+world = "World"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n/ja.toml b/os/gres/testdata/files/i18n/ja.toml
new file mode 100644
index 000000000..8ca47ed7f
--- /dev/null
+++ b/os/gres/testdata/files/i18n/ja.toml
@@ -0,0 +1,3 @@
+
+hello = "こんにちは"
+world = "世界"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n/ru.toml b/os/gres/testdata/files/i18n/ru.toml
new file mode 100644
index 000000000..938434a5a
--- /dev/null
+++ b/os/gres/testdata/files/i18n/ru.toml
@@ -0,0 +1,3 @@
+
+hello = "Привет"
+world = "мир"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n/zh-CN.toml b/os/gres/testdata/files/i18n/zh-CN.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/os/gres/testdata/files/i18n/zh-CN.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file
diff --git a/os/gres/testdata/files/i18n/zh-TW.toml b/os/gres/testdata/files/i18n/zh-TW.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/os/gres/testdata/files/i18n/zh-TW.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file
diff --git a/os/gres/testdata/files/template/index.html b/os/gres/testdata/files/template/index.html
new file mode 100644
index 000000000..5044efbc3
--- /dev/null
+++ b/os/gres/testdata/files/template/index.html
@@ -0,0 +1 @@
+It's the index template file.
\ No newline at end of file
diff --git a/os/gres/testdata/testdata.go b/os/gres/testdata/testdata.go
index 228f35f9e..988f7391a 100644
--- a/os/gres/testdata/testdata.go
+++ b/os/gres/testdata/testdata.go
@@ -3,7 +3,7 @@ package testdata
import "github.com/gogf/gf/os/gres"
func init() {
- if err := gres.Add([]byte{80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 157, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 10, 150, 90, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 152, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 0, 150, 90, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 134, 150, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 52, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 53, 34, 80, 75, 7, 8, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 230, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 144, 150, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 54, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 55, 34, 80, 75, 7, 8, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 150, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 253, 149, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 48, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 49, 34, 80, 75, 7, 8, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 135, 150, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 50, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 51, 34, 80, 75, 7, 8, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 116, 101, 115, 116, 49, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 116, 101, 115, 116, 50, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 130, 109, 14, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 37, 16, 84, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 42, 32, 123, 10, 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 51, 50, 112, 120, 59, 10, 32, 32, 32, 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59, 10, 125, 80, 75, 7, 8, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 74, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 44, 176, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 36, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 228, 175, 82, 93, 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 50, 0, 0, 0, 50, 8, 6, 0, 0, 0, 30, 63, 136, 177, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0, 154, 156, 24, 0, 0, 2, 174, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 100, 99, 61, 34, 104, 116, 116, 112, 58, 47, 47, 112, 117, 114, 108, 46, 111, 114, 103, 47, 100, 99, 47, 101, 108, 101, 109, 101, 110, 116, 115, 47, 49, 46, 49, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 50, 58, 51, 50, 58, 49, 53, 90, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 65, 100, 111, 98, 101, 32, 70, 105, 114, 101, 119, 111, 114, 107, 115, 32, 67, 83, 52, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 53, 58, 53, 54, 58, 51, 56, 90, 60, 47, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 105, 109, 97, 103, 101, 47, 112, 110, 103, 60, 47, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 240, 91, 212, 3, 0, 0, 10, 127, 73, 68, 65, 84, 104, 5, 237, 88, 91, 111, 84, 215, 25, 93, 103, 110, 103, 110, 182, 199, 6, 204, 197, 24, 39, 24, 227, 16, 18, 5, 66, 83, 4, 42, 130, 144, 168, 85, 83, 210, 70, 74, 85, 34, 66, 85, 41, 85, 212, 180, 79, 125, 232, 99, 171, 62, 20, 84, 169, 15, 81, 251, 7, 218, 190, 71, 109, 138, 130, 34, 133, 18, 32, 225, 106, 162, 38, 33, 142, 12, 118, 77, 76, 32, 181, 185, 4, 99, 123, 108, 207, 229, 204, 153, 233, 90, 251, 204, 57, 30, 12, 38, 78, 99, 75, 41, 242, 150, 246, 204, 153, 125, 89, 223, 183, 190, 219, 222, 103, 172, 63, 156, 24, 172, 224, 62, 104, 161, 251, 128, 131, 161, 176, 64, 228, 235, 230, 201, 5, 143, 44, 120, 100, 158, 44, 176, 16, 90, 243, 100, 216, 255, 25, 246, 190, 241, 72, 100, 182, 38, 176, 184, 80, 189, 182, 233, 74, 48, 23, 215, 2, 31, 215, 255, 246, 101, 124, 25, 252, 47, 36, 226, 19, 112, 136, 170, 238, 41, 110, 145, 84, 5, 33, 78, 70, 217, 195, 148, 92, 246, 165, 127, 137, 111, 31, 187, 84, 197, 46, 7, 166, 34, 54, 113, 98, 194, 102, 159, 13, 246, 61, 137, 72, 144, 75, 33, 5, 246, 134, 112, 5, 109, 209, 50, 210, 17, 79, 92, 177, 108, 225, 86, 41, 132, 155, 78, 8, 19, 156, 143, 83, 178, 132, 243, 113, 86, 77, 107, 101, 24, 97, 215, 133, 42, 88, 30, 43, 35, 67, 236, 40, 39, 52, 62, 74, 220, 171, 78, 24, 19, 100, 145, 224, 152, 116, 185, 23, 246, 140, 68, 36, 40, 111, 64, 42, 216, 84, 231, 160, 53, 81, 66, 130, 130, 52, 174, 38, 208, 18, 201, 140, 147, 204, 192, 100, 4, 23, 114, 81, 20, 57, 104, 207, 194, 130, 82, 42, 71, 236, 134, 72, 5, 79, 164, 28, 172, 136, 151, 144, 12, 151, 141, 245, 133, 173, 38, 3, 102, 75, 97, 244, 79, 68, 113, 158, 248, 218, 19, 169, 98, 235, 121, 122, 187, 43, 145, 16, 213, 156, 164, 146, 43, 104, 165, 205, 153, 60, 26, 233, 9, 1, 151, 43, 150, 249, 54, 32, 68, 179, 216, 51, 49, 23, 143, 179, 139, 232, 169, 145, 56, 70, 74, 150, 241, 206, 76, 225, 32, 37, 68, 98, 117, 220, 197, 55, 26, 10, 198, 195, 6, 155, 170, 58, 53, 155, 132, 221, 16, 229, 154, 140, 139, 229, 118, 4, 167, 70, 109, 26, 214, 50, 161, 44, 35, 78, 111, 190, 129, 131, 113, 13, 228, 184, 97, 37, 73, 236, 88, 148, 67, 134, 36, 10, 252, 237, 146, 132, 154, 4, 152, 206, 103, 1, 202, 43, 14, 123, 179, 237, 98, 39, 215, 55, 210, 202, 242, 140, 183, 90, 59, 166, 154, 135, 13, 172, 77, 184, 248, 86, 83, 14, 73, 122, 216, 199, 22, 86, 128, 93, 221, 236, 99, 175, 76, 150, 240, 84, 83, 158, 6, 170, 64, 249, 52, 19, 118, 32, 73, 11, 164, 132, 242, 97, 75, 99, 30, 49, 110, 84, 46, 40, 169, 37, 164, 92, 46, 223, 214, 181, 222, 23, 46, 133, 234, 169, 216, 102, 90, 89, 77, 138, 213, 54, 31, 91, 68, 31, 111, 200, 155, 125, 50, 128, 143, 141, 74, 229, 54, 236, 10, 127, 7, 216, 174, 133, 69, 52, 212, 86, 98, 11, 119, 58, 182, 228, 220, 225, 17, 49, 222, 84, 95, 68, 29, 149, 242, 5, 9, 84, 61, 22, 139, 33, 145, 72, 32, 153, 76, 34, 30, 183, 205, 152, 198, 13, 16, 53, 21, 233, 102, 198, 123, 59, 187, 242, 107, 58, 184, 146, 248, 97, 230, 68, 146, 100, 100, 109, 145, 80, 243, 148, 182, 2, 236, 68, 60, 142, 72, 36, 130, 10, 13, 167, 166, 117, 69, 146, 105, 97, 248, 174, 79, 58, 38, 52, 21, 254, 181, 45, 200, 17, 97, 22, 184, 79, 33, 181, 130, 27, 28, 134, 146, 44, 226, 11, 17, 240, 208, 208, 16, 6, 6, 46, 33, 159, 207, 99, 205, 154, 118, 180, 181, 181, 193, 113, 156, 96, 141, 160, 133, 211, 194, 248, 239, 203, 81, 145, 26, 73, 202, 131, 20, 61, 188, 212, 46, 153, 60, 211, 58, 53, 225, 135, 195, 97, 227, 141, 15, 207, 157, 195, 224, 224, 32, 26, 51, 25, 116, 118, 118, 34, 195, 239, 98, 177, 72, 61, 188, 213, 162, 181, 134, 134, 248, 55, 177, 75, 212, 79, 165, 217, 151, 113, 155, 209, 180, 240, 65, 146, 136, 90, 116, 51, 87, 232, 172, 208, 137, 17, 10, 133, 112, 228, 200, 81, 124, 115, 203, 86, 236, 222, 179, 7, 99, 217, 49, 156, 56, 121, 18, 199, 222, 121, 135, 150, 211, 41, 226, 53, 137, 19, 176, 188, 105, 19, 217, 179, 167, 71, 78, 158, 206, 208, 19, 9, 134, 173, 138, 134, 111, 36, 97, 75, 217, 127, 28, 56, 128, 203, 151, 47, 163, 175, 175, 15, 207, 255, 104, 55, 126, 250, 242, 203, 232, 191, 120, 209, 68, 129, 66, 90, 235, 93, 122, 177, 142, 57, 187, 138, 134, 154, 158, 135, 1, 17, 41, 174, 122, 189, 136, 21, 72, 10, 104, 99, 153, 131, 49, 59, 134, 222, 222, 94, 252, 228, 165, 151, 140, 182, 191, 223, 191, 15, 63, 222, 187, 23, 123, 95, 124, 17, 7, 15, 30, 196, 133, 222, 62, 134, 89, 220, 88, 84, 238, 80, 164, 69, 105, 249, 24, 141, 81, 141, 58, 13, 27, 204, 4, 199, 195, 28, 247, 155, 188, 97, 219, 54, 222, 62, 114, 4, 227, 217, 113, 236, 165, 145, 126, 254, 202, 43, 248, 254, 174, 239, 161, 235, 236, 123, 216, 183, 111, 63, 70, 70, 70, 16, 141, 70, 141, 231, 180, 79, 10, 47, 165, 142, 106, 83, 72, 213, 48, 150, 32, 77, 165, 89, 203, 19, 236, 34, 165, 85, 114, 169, 172, 113, 250, 204, 25, 14, 144, 100, 166, 1, 103, 206, 116, 225, 252, 249, 243, 248, 148, 214, 251, 219, 107, 175, 161, 187, 187, 219, 204, 9, 195, 71, 214, 179, 122, 173, 32, 77, 203, 56, 126, 243, 67, 42, 151, 203, 225, 173, 183, 14, 97, 224, 211, 75, 184, 56, 48, 128, 30, 98, 159, 237, 234, 194, 67, 107, 59, 112, 152, 4, 123, 122, 122, 188, 124, 145, 85, 184, 95, 152, 242, 184, 110, 20, 181, 248, 65, 142, 72, 121, 255, 74, 160, 128, 210, 50, 159, 72, 54, 155, 53, 242, 23, 47, 89, 130, 3, 111, 188, 129, 147, 199, 223, 69, 166, 177, 201, 156, 192, 202, 17, 145, 245, 181, 148, 178, 138, 95, 37, 182, 239, 110, 9, 20, 162, 138, 129, 135, 109, 224, 12, 190, 194, 74, 24, 127, 254, 203, 95, 241, 206, 177, 99, 36, 115, 201, 76, 10, 95, 45, 75, 79, 5, 141, 64, 132, 54, 167, 191, 136, 40, 239, 124, 227, 248, 178, 106, 215, 122, 207, 85, 111, 40, 201, 59, 58, 58, 204, 88, 58, 157, 70, 71, 123, 59, 98, 12, 165, 100, 42, 101, 198, 90, 91, 91, 77, 14, 201, 194, 106, 82, 56, 199, 10, 83, 168, 230, 129, 25, 228, 135, 78, 229, 172, 198, 85, 173, 170, 182, 148, 1, 84, 5, 215, 210, 250, 106, 169, 84, 26, 171, 90, 90, 140, 55, 124, 5, 219, 218, 86, 5, 97, 101, 192, 185, 78, 162, 60, 105, 102, 155, 249, 8, 60, 162, 18, 167, 131, 80, 214, 180, 173, 178, 177, 156, 60, 226, 186, 172, 223, 91, 182, 96, 215, 51, 207, 224, 224, 155, 111, 6, 59, 7, 175, 94, 195, 158, 23, 118, 99, 227, 134, 13, 198, 162, 126, 101, 209, 130, 155, 197, 176, 57, 184, 252, 235, 138, 132, 170, 194, 140, 145, 200, 24, 239, 80, 169, 184, 110, 10, 94, 216, 42, 254, 159, 251, 193, 115, 120, 245, 143, 127, 194, 71, 31, 127, 28, 224, 235, 225, 183, 191, 249, 53, 218, 105, 184, 160, 114, 17, 72, 4, 101, 12, 37, 187, 188, 226, 55, 67, 68, 130, 100, 49, 9, 210, 221, 41, 105, 235, 224, 211, 38, 18, 43, 149, 76, 25, 220, 191, 239, 119, 216, 186, 117, 11, 78, 159, 62, 109, 200, 109, 219, 182, 13, 207, 238, 218, 133, 52, 61, 227, 112, 141, 36, 200, 189, 10, 159, 203, 249, 176, 193, 19, 174, 223, 52, 167, 80, 184, 194, 210, 185, 140, 231, 140, 154, 95, 177, 86, 175, 126, 16, 199, 143, 29, 197, 223, 95, 127, 29, 253, 253, 253, 104, 104, 200, 96, 199, 142, 237, 216, 177, 125, 187, 89, 35, 99, 74, 151, 106, 154, 220, 97, 40, 97, 89, 254, 63, 141, 114, 247, 4, 149, 120, 44, 85, 194, 38, 222, 175, 116, 24, 138, 189, 154, 194, 70, 33, 38, 176, 241, 241, 113, 227, 214, 58, 134, 153, 198, 69, 84, 227, 202, 49, 155, 85, 105, 96, 50, 138, 163, 183, 108, 83, 1, 53, 239, 147, 9, 20, 33, 230, 119, 23, 231, 204, 61, 170, 246, 192, 213, 97, 43, 44, 37, 191, 100, 37, 147, 9, 122, 186, 100, 242, 207, 236, 165, 30, 82, 71, 114, 222, 254, 60, 129, 27, 52, 184, 114, 218, 199, 15, 114, 68, 151, 243, 56, 39, 122, 121, 211, 28, 102, 104, 168, 132, 106, 147, 154, 128, 36, 68, 73, 169, 83, 61, 197, 174, 231, 90, 18, 186, 206, 140, 17, 252, 253, 177, 152, 87, 81, 170, 5, 32, 20, 10, 7, 57, 20, 98, 17, 214, 161, 123, 142, 107, 132, 173, 82, 172, 111, 225, 23, 10, 188, 126, 144, 184, 240, 21, 110, 133, 124, 49, 32, 33, 29, 56, 101, 116, 186, 194, 91, 246, 16, 195, 179, 150, 132, 230, 3, 34, 230, 7, 137, 168, 218, 188, 199, 155, 166, 226, 208, 39, 195, 33, 35, 76, 2, 229, 102, 117, 207, 62, 158, 187, 69, 66, 9, 126, 134, 158, 24, 231, 148, 121, 217, 178, 227, 36, 16, 134, 235, 120, 10, 69, 99, 54, 172, 72, 140, 198, 42, 99, 128, 161, 247, 193, 104, 156, 152, 12, 233, 170, 193, 44, 30, 140, 34, 34, 108, 115, 0, 50, 105, 141, 39, 40, 92, 100, 109, 30, 164, 55, 11, 97, 252, 43, 27, 53, 175, 10, 210, 183, 182, 5, 201, 174, 65, 41, 172, 27, 230, 80, 49, 132, 227, 195, 9, 108, 229, 197, 49, 197, 115, 69, 5, 192, 247, 142, 71, 64, 196, 104, 5, 90, 84, 150, 184, 81, 136, 224, 236, 72, 204, 184, 59, 26, 141, 240, 4, 46, 227, 218, 133, 115, 232, 57, 113, 8, 35, 215, 62, 131, 157, 76, 163, 229, 161, 199, 208, 249, 196, 118, 196, 23, 45, 69, 172, 228, 160, 123, 60, 204, 251, 88, 2, 27, 235, 167, 174, 242, 174, 64, 165, 4, 155, 60, 160, 88, 146, 215, 84, 40, 174, 147, 252, 241, 91, 113, 207, 192, 83, 203, 204, 90, 125, 220, 70, 68, 3, 10, 49, 157, 240, 159, 21, 66, 248, 39, 99, 113, 67, 93, 17, 203, 153, 156, 178, 186, 26, 49, 140, 44, 17, 203, 210, 197, 202, 137, 158, 137, 8, 28, 43, 204, 53, 101, 44, 29, 189, 130, 236, 133, 46, 188, 250, 203, 95, 152, 245, 181, 123, 190, 253, 228, 78, 188, 240, 179, 95, 97, 164, 229, 81, 84, 162, 49, 244, 79, 150, 112, 163, 152, 192, 35, 105, 190, 92, 241, 106, 164, 151, 43, 113, 145, 12, 53, 221, 48, 114, 46, 101, 240, 229, 234, 35, 118, 93, 115, 228, 109, 141, 251, 107, 180, 78, 237, 14, 34, 26, 212, 66, 145, 81, 21, 59, 194, 112, 105, 102, 204, 46, 227, 101, 82, 175, 185, 242, 128, 94, 112, 134, 73, 98, 136, 185, 52, 201, 80, 178, 105, 178, 100, 185, 136, 150, 129, 119, 209, 60, 214, 141, 179, 61, 231, 5, 131, 117, 235, 30, 134, 195, 3, 79, 218, 185, 86, 4, 135, 142, 30, 193, 15, 55, 52, 97, 221, 163, 59, 209, 215, 250, 36, 172, 84, 19, 38, 152, 123, 199, 25, 202, 153, 113, 201, 112, 205, 251, 143, 226, 95, 33, 62, 66, 25, 131, 148, 49, 74, 50, 113, 122, 70, 36, 100, 206, 233, 36, 36, 235, 174, 68, 52, 33, 50, 218, 168, 126, 147, 73, 124, 141, 160, 106, 2, 209, 233, 172, 42, 167, 185, 20, 99, 215, 9, 69, 208, 60, 248, 1, 50, 215, 78, 161, 144, 94, 129, 229, 171, 58, 241, 244, 230, 13, 56, 220, 245, 161, 217, 227, 127, 236, 254, 206, 118, 212, 47, 239, 68, 100, 116, 0, 15, 20, 243, 232, 95, 247, 60, 92, 230, 77, 170, 82, 54, 111, 164, 189, 186, 49, 231, 124, 25, 222, 183, 145, 161, 60, 50, 114, 125, 164, 59, 191, 131, 242, 123, 231, 212, 212, 136, 148, 87, 87, 171, 181, 136, 138, 171, 72, 169, 119, 244, 29, 68, 98, 236, 19, 184, 225, 4, 9, 86, 80, 96, 233, 28, 186, 121, 11, 19, 147, 121, 94, 211, 67, 104, 72, 37, 177, 164, 177, 30, 17, 94, 217, 157, 10, 171, 98, 113, 24, 67, 171, 159, 197, 224, 178, 71, 16, 45, 121, 94, 187, 187, 12, 79, 166, 39, 125, 230, 207, 25, 61, 82, 187, 69, 202, 171, 251, 109, 234, 153, 162, 153, 149, 101, 42, 87, 72, 44, 65, 250, 243, 247, 81, 78, 196, 249, 210, 68, 111, 49, 220, 30, 88, 218, 4, 75, 89, 171, 192, 87, 5, 227, 163, 222, 203, 67, 224, 217, 227, 230, 188, 185, 42, 168, 48, 167, 112, 111, 127, 246, 229, 222, 235, 123, 86, 68, 238, 5, 160, 185, 16, 67, 99, 112, 197, 70, 68, 156, 9, 164, 135, 187, 249, 102, 71, 79, 69, 147, 176, 226, 236, 97, 94, 193, 93, 158, 65, 185, 44, 42, 197, 73, 83, 210, 221, 112, 28, 195, 43, 159, 198, 245, 197, 29, 8, 115, 174, 150, 192, 23, 201, 154, 105, 254, 171, 19, 161, 181, 45, 150, 91, 39, 98, 99, 160, 125, 39, 226, 139, 215, 99, 189, 157, 197, 170, 230, 20, 172, 168, 206, 18, 30, 131, 156, 47, 51, 39, 134, 254, 115, 21, 159, 176, 236, 78, 102, 90, 145, 77, 122, 222, 178, 104, 4, 227, 177, 153, 52, 156, 229, 248, 87, 39, 34, 65, 36, 19, 42, 187, 60, 87, 44, 92, 175, 231, 237, 53, 227, 32, 145, 206, 161, 160, 43, 24, 237, 29, 226, 225, 102, 243, 128, 204, 172, 89, 140, 65, 150, 116, 133, 91, 164, 236, 120, 241, 163, 176, 155, 131, 54, 55, 68, 164, 136, 81, 136, 185, 225, 22, 145, 203, 59, 8, 241, 79, 130, 168, 41, 214, 94, 5, 12, 211, 242, 110, 145, 127, 194, 241, 223, 67, 29, 112, 21, 173, 159, 27, 14, 198, 12, 115, 71, 132, 112, 170, 94, 17, 86, 233, 171, 78, 4, 151, 39, 99, 60, 32, 89, 223, 89, 193, 164, 115, 137, 149, 170, 123, 60, 198, 243, 196, 251, 211, 192, 72, 159, 195, 143, 57, 38, 226, 157, 59, 250, 79, 248, 240, 112, 220, 88, 94, 175, 7, 50, 188, 222, 31, 212, 116, 46, 204, 69, 114, 123, 104, 83, 159, 115, 74, 196, 135, 213, 75, 154, 94, 170, 164, 176, 14, 50, 61, 248, 132, 230, 131, 132, 68, 204, 11, 145, 170, 238, 250, 242, 210, 64, 46, 97, 155, 47, 18, 194, 246, 238, 29, 122, 250, 63, 111, 11, 68, 190, 110, 14, 92, 240, 200, 130, 71, 230, 201, 2, 247, 77, 104, 253, 23, 249, 35, 174, 63, 129, 132, 9, 199, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, 80, 75, 7, 8, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 99, 107, 14, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 42, 12, 84, 93, 60, 104, 116, 109, 108, 62, 10, 9, 60, 104, 101, 97, 100, 62, 10, 9, 9, 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, 104, 114, 101, 102, 61, 34, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 99, 115, 115, 34, 32, 47, 62, 10, 9, 60, 47, 104, 101, 97, 100, 62, 10, 9, 60, 98, 111, 100, 121, 62, 10, 9, 60, 100, 105, 118, 62, 60, 105, 109, 103, 32, 115, 114, 99, 61, 34, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 34, 62, 60, 47, 100, 105, 118, 62, 10, 9, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 105, 110, 100, 101, 120, 32, 102, 114, 111, 109, 32, 103, 114, 101, 115, 46, 10, 9, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 175, 134, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 67, 79, 78, 84, 65, 73, 78, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 175, 134, 85, 93, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, 105, 116, 108, 101, 62, 71, 111, 70, 114, 97, 109, 101, 32, 76, 97, 121, 111, 117, 116, 60, 47, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 102, 111, 111, 116, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 197, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 210, 132, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 46, 109, 97, 105, 110, 84, 112, 108, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 80, 75, 7, 8, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 77, 65, 73, 78, 49, 60, 47, 104, 49, 62, 80, 75, 7, 8, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 77, 65, 73, 78, 50, 60, 47, 104, 49, 62, 80, 75, 7, 8, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 157, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 0, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 10, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 152, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 62, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 0, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 134, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 230, 99, 19, 79, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 21, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 58, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 144, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 150, 99, 19, 79, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 236, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 253, 149, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 156, 2, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 135, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 71, 3, 0, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 3, 0, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 211, 3, 0, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 15, 4, 0, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 130, 109, 14, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 95, 4, 0, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 37, 16, 84, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 155, 4, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 219, 4, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 74, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 87, 5, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 44, 176, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 36, 101, 13, 79, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 153, 5, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 228, 175, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 99, 107, 14, 79, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 120, 19, 0, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 42, 12, 84, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 117, 20, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 181, 20, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 175, 134, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 32, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 253, 20, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 133, 21, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 4, 22, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 135, 22, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 175, 134, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 197, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 213, 23, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 210, 132, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 29, 24, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 128, 24, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 227, 24, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 133, 25, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 210, 25, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 56, 26, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 5, 6, 0, 0, 0, 0, 29, 0, 29, 0, 97, 8, 0, 0, 158, 26, 0, 0, 0, 0}); err != nil {
+ if err := gres.Add([]byte{80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 52, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 53, 34, 80, 75, 7, 8, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 54, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 55, 34, 80, 75, 7, 8, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 48, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 49, 34, 80, 75, 7, 8, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 50, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 51, 34, 80, 75, 7, 8, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 116, 101, 115, 116, 49, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 116, 101, 115, 116, 50, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 105, 49, 56, 110, 85, 84, 5, 0, 1, 30, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 236, 22, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 104, 101, 108, 108, 111, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 156, 225, 105, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 72, 101, 108, 108, 111, 34, 80, 75, 7, 8, 114, 235, 106, 99, 16, 0, 0, 0, 16, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 241, 22, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 119, 111, 114, 108, 100, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 166, 225, 105, 93, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 87, 111, 114, 108, 100, 34, 80, 75, 7, 8, 157, 17, 117, 39, 16, 0, 0, 0, 16, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 34, 23, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 104, 101, 108, 108, 111, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 0, 226, 105, 93, 10, 104, 101, 108, 108, 111, 58, 32, 34, 227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175, 34, 80, 75, 7, 8, 188, 102, 42, 89, 25, 0, 0, 0, 25, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 42, 23, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 119, 111, 114, 108, 100, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 17, 226, 105, 93, 119, 111, 114, 108, 100, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 158, 65, 95, 108, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 100, 23, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 104, 101, 108, 108, 111, 46, 105, 110, 105, 85, 84, 5, 0, 1, 124, 226, 105, 93, 104, 101, 108, 108, 111, 32, 61, 32, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 80, 75, 7, 8, 110, 248, 192, 182, 20, 0, 0, 0, 20, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 0, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 119, 111, 114, 108, 100, 46, 105, 110, 105, 85, 84, 5, 0, 1, 177, 226, 105, 93, 119, 111, 114, 108, 100, 61, 208, 188, 208, 184, 209, 128, 80, 75, 7, 8, 89, 25, 94, 98, 12, 0, 0, 0, 12, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 185, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 104, 101, 108, 108, 111, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 15, 228, 105, 93, 123, 10, 32, 32, 32, 32, 34, 104, 101, 108, 108, 111, 34, 58, 32, 34, 228, 189, 160, 229, 165, 189, 34, 10, 125, 80, 75, 7, 8, 190, 33, 11, 186, 25, 0, 0, 0, 25, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 183, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 119, 111, 114, 108, 100, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 11, 228, 105, 93, 123, 10, 32, 32, 32, 32, 34, 119, 111, 114, 108, 100, 34, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 10, 125, 80, 75, 7, 8, 10, 237, 75, 254, 25, 0, 0, 0, 25, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 58, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 104, 101, 108, 108, 111, 46, 120, 109, 108, 85, 84, 5, 0, 1, 33, 227, 105, 93, 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 117, 116, 102, 45, 56, 34, 63, 62, 10, 60, 105, 49, 56, 110, 62, 10, 32, 32, 32, 32, 60, 104, 101, 108, 108, 111, 62, 228, 189, 160, 229, 165, 189, 60, 47, 104, 101, 108, 108, 111, 62, 10, 60, 47, 105, 49, 56, 110, 62, 80, 75, 7, 8, 16, 122, 22, 143, 79, 0, 0, 0, 79, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 67, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 119, 111, 114, 108, 100, 46, 120, 109, 108, 85, 84, 5, 0, 1, 46, 227, 105, 93, 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 117, 116, 102, 45, 56, 34, 63, 62, 10, 60, 105, 49, 56, 110, 62, 10, 32, 32, 32, 32, 60, 119, 111, 114, 108, 100, 62, 228, 184, 150, 231, 149, 140, 60, 47, 119, 111, 114, 108, 100, 62, 10, 60, 47, 105, 49, 56, 110, 62, 80, 75, 7, 8, 250, 38, 76, 149, 79, 0, 0, 0, 79, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 85, 84, 5, 0, 1, 33, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 72, 101, 108, 108, 111, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 87, 111, 114, 108, 100, 34, 80, 75, 7, 8, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 112, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 106, 97, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 133, 227, 105, 93, 10, 104, 101, 108, 108, 111, 58, 32, 34, 227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175, 34, 10, 119, 111, 114, 108, 100, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 20, 198, 203, 88, 41, 0, 0, 0, 41, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 125, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 114, 117, 46, 105, 110, 105, 85, 84, 5, 0, 1, 158, 227, 105, 93, 104, 101, 108, 108, 111, 32, 61, 32, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 10, 119, 111, 114, 108, 100, 32, 61, 32, 208, 188, 208, 184, 209, 128, 80, 75, 7, 8, 216, 229, 125, 35, 35, 0, 0, 0, 35, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 147, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 67, 78, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 199, 227, 105, 93, 123, 10, 32, 32, 34, 104, 101, 108, 108, 111, 34, 58, 32, 34, 228, 189, 160, 229, 165, 189, 34, 44, 10, 32, 32, 34, 119, 111, 114, 108, 100, 34, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 10, 125, 80, 75, 7, 8, 62, 80, 47, 182, 44, 0, 0, 0, 44, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 166, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 84, 87, 46, 120, 109, 108, 85, 84, 5, 0, 1, 232, 227, 105, 93, 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 117, 116, 102, 45, 56, 34, 63, 62, 10, 60, 105, 49, 56, 110, 62, 10, 32, 32, 32, 32, 60, 104, 101, 108, 108, 111, 62, 228, 189, 160, 229, 165, 189, 60, 47, 104, 101, 108, 108, 111, 62, 10, 32, 32, 32, 32, 60, 119, 111, 114, 108, 100, 62, 228, 184, 150, 231, 149, 140, 60, 47, 119, 111, 114, 108, 100, 62, 10, 60, 47, 105, 49, 56, 110, 62, 80, 75, 7, 8, 201, 64, 202, 211, 105, 0, 0, 0, 105, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9, 0, 47, 105, 49, 56, 110, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 72, 101, 108, 108, 111, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 87, 111, 114, 108, 100, 34, 80, 75, 7, 8, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 113, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9, 0, 47, 105, 49, 56, 110, 47, 106, 97, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 214, 41, 106, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 81, 103, 32, 118, 43, 0, 0, 0, 43, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 121, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9, 0, 47, 105, 49, 56, 110, 47, 114, 117, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 231, 41, 106, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 208, 188, 208, 184, 209, 128, 34, 80, 75, 7, 8, 99, 56, 186, 107, 40, 0, 0, 0, 40, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 130, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 67, 78, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 245, 41, 106, 93, 104, 101, 108, 108, 111, 32, 61, 32, 34, 228, 189, 160, 229, 165, 189, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 132, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 84, 87, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 249, 41, 106, 93, 104, 101, 108, 108, 111, 32, 61, 32, 34, 228, 189, 160, 229, 165, 189, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 42, 32, 123, 10, 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 51, 50, 112, 120, 59, 10, 32, 32, 32, 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59, 10, 125, 80, 75, 7, 8, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 50, 0, 0, 0, 50, 8, 6, 0, 0, 0, 30, 63, 136, 177, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0, 154, 156, 24, 0, 0, 2, 174, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 100, 99, 61, 34, 104, 116, 116, 112, 58, 47, 47, 112, 117, 114, 108, 46, 111, 114, 103, 47, 100, 99, 47, 101, 108, 101, 109, 101, 110, 116, 115, 47, 49, 46, 49, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 50, 58, 51, 50, 58, 49, 53, 90, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 65, 100, 111, 98, 101, 32, 70, 105, 114, 101, 119, 111, 114, 107, 115, 32, 67, 83, 52, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 53, 58, 53, 54, 58, 51, 56, 90, 60, 47, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 105, 109, 97, 103, 101, 47, 112, 110, 103, 60, 47, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 240, 91, 212, 3, 0, 0, 10, 127, 73, 68, 65, 84, 104, 5, 237, 88, 91, 111, 84, 215, 25, 93, 103, 110, 103, 110, 182, 199, 6, 204, 197, 24, 39, 24, 227, 16, 18, 5, 66, 83, 4, 42, 130, 144, 168, 85, 83, 210, 70, 74, 85, 34, 66, 85, 41, 85, 212, 180, 79, 125, 232, 99, 171, 62, 20, 84, 169, 15, 81, 251, 7, 218, 190, 71, 109, 138, 130, 34, 133, 18, 32, 225, 106, 162, 38, 33, 142, 12, 118, 77, 76, 32, 181, 185, 4, 99, 123, 108, 207, 229, 204, 153, 233, 90, 251, 204, 57, 30, 12, 38, 78, 99, 75, 41, 242, 150, 246, 204, 153, 125, 89, 223, 183, 190, 219, 222, 103, 172, 63, 156, 24, 172, 224, 62, 104, 161, 251, 128, 131, 161, 176, 64, 228, 235, 230, 201, 5, 143, 44, 120, 100, 158, 44, 176, 16, 90, 243, 100, 216, 255, 25, 246, 190, 241, 72, 100, 182, 38, 176, 184, 80, 189, 182, 233, 74, 48, 23, 215, 2, 31, 215, 255, 246, 101, 124, 25, 252, 47, 36, 226, 19, 112, 136, 170, 238, 41, 110, 145, 84, 5, 33, 78, 70, 217, 195, 148, 92, 246, 165, 127, 137, 111, 31, 187, 84, 197, 46, 7, 166, 34, 54, 113, 98, 194, 102, 159, 13, 246, 61, 137, 72, 144, 75, 33, 5, 246, 134, 112, 5, 109, 209, 50, 210, 17, 79, 92, 177, 108, 225, 86, 41, 132, 155, 78, 8, 19, 156, 143, 83, 178, 132, 243, 113, 86, 77, 107, 101, 24, 97, 215, 133, 42, 88, 30, 43, 35, 67, 236, 40, 39, 52, 62, 74, 220, 171, 78, 24, 19, 100, 145, 224, 152, 116, 185, 23, 246, 140, 68, 36, 40, 111, 64, 42, 216, 84, 231, 160, 53, 81, 66, 130, 130, 52, 174, 38, 208, 18, 201, 140, 147, 204, 192, 100, 4, 23, 114, 81, 20, 57, 104, 207, 194, 130, 82, 42, 71, 236, 134, 72, 5, 79, 164, 28, 172, 136, 151, 144, 12, 151, 141, 245, 133, 173, 38, 3, 102, 75, 97, 244, 79, 68, 113, 158, 248, 218, 19, 169, 98, 235, 121, 122, 187, 43, 145, 16, 213, 156, 164, 146, 43, 104, 165, 205, 153, 60, 26, 233, 9, 1, 151, 43, 150, 249, 54, 32, 68, 179, 216, 51, 49, 23, 143, 179, 139, 232, 169, 145, 56, 70, 74, 150, 241, 206, 76, 225, 32, 37, 68, 98, 117, 220, 197, 55, 26, 10, 198, 195, 6, 155, 170, 58, 53, 155, 132, 221, 16, 229, 154, 140, 139, 229, 118, 4, 167, 70, 109, 26, 214, 50, 161, 44, 35, 78, 111, 190, 129, 131, 113, 13, 228, 184, 97, 37, 73, 236, 88, 148, 67, 134, 36, 10, 252, 237, 146, 132, 154, 4, 152, 206, 103, 1, 202, 43, 14, 123, 179, 237, 98, 39, 215, 55, 210, 202, 242, 140, 183, 90, 59, 166, 154, 135, 13, 172, 77, 184, 248, 86, 83, 14, 73, 122, 216, 199, 22, 86, 128, 93, 221, 236, 99, 175, 76, 150, 240, 84, 83, 158, 6, 170, 64, 249, 52, 19, 118, 32, 73, 11, 164, 132, 242, 97, 75, 99, 30, 49, 110, 84, 46, 40, 169, 37, 164, 92, 46, 223, 214, 181, 222, 23, 46, 133, 234, 169, 216, 102, 90, 89, 77, 138, 213, 54, 31, 91, 68, 31, 111, 200, 155, 125, 50, 128, 143, 141, 74, 229, 54, 236, 10, 127, 7, 216, 174, 133, 69, 52, 212, 86, 98, 11, 119, 58, 182, 228, 220, 225, 17, 49, 222, 84, 95, 68, 29, 149, 242, 5, 9, 84, 61, 22, 139, 33, 145, 72, 32, 153, 76, 34, 30, 183, 205, 152, 198, 13, 16, 53, 21, 233, 102, 198, 123, 59, 187, 242, 107, 58, 184, 146, 248, 97, 230, 68, 146, 100, 100, 109, 145, 80, 243, 148, 182, 2, 236, 68, 60, 142, 72, 36, 130, 10, 13, 167, 166, 117, 69, 146, 105, 97, 248, 174, 79, 58, 38, 52, 21, 254, 181, 45, 200, 17, 97, 22, 184, 79, 33, 181, 130, 27, 28, 134, 146, 44, 226, 11, 17, 240, 208, 208, 16, 6, 6, 46, 33, 159, 207, 99, 205, 154, 118, 180, 181, 181, 193, 113, 156, 96, 141, 160, 133, 211, 194, 248, 239, 203, 81, 145, 26, 73, 202, 131, 20, 61, 188, 212, 46, 153, 60, 211, 58, 53, 225, 135, 195, 97, 227, 141, 15, 207, 157, 195, 224, 224, 32, 26, 51, 25, 116, 118, 118, 34, 195, 239, 98, 177, 72, 61, 188, 213, 162, 181, 134, 134, 248, 55, 177, 75, 212, 79, 165, 217, 151, 113, 155, 209, 180, 240, 65, 146, 136, 90, 116, 51, 87, 232, 172, 208, 137, 17, 10, 133, 112, 228, 200, 81, 124, 115, 203, 86, 236, 222, 179, 7, 99, 217, 49, 156, 56, 121, 18, 199, 222, 121, 135, 150, 211, 41, 226, 53, 137, 19, 176, 188, 105, 19, 217, 179, 167, 71, 78, 158, 206, 208, 19, 9, 134, 173, 138, 134, 111, 36, 97, 75, 217, 127, 28, 56, 128, 203, 151, 47, 163, 175, 175, 15, 207, 255, 104, 55, 126, 250, 242, 203, 232, 191, 120, 209, 68, 129, 66, 90, 235, 93, 122, 177, 142, 57, 187, 138, 134, 154, 158, 135, 1, 17, 41, 174, 122, 189, 136, 21, 72, 10, 104, 99, 153, 131, 49, 59, 134, 222, 222, 94, 252, 228, 165, 151, 140, 182, 191, 223, 191, 15, 63, 222, 187, 23, 123, 95, 124, 17, 7, 15, 30, 196, 133, 222, 62, 134, 89, 220, 88, 84, 238, 80, 164, 69, 105, 249, 24, 141, 81, 141, 58, 13, 27, 204, 4, 199, 195, 28, 247, 155, 188, 97, 219, 54, 222, 62, 114, 4, 227, 217, 113, 236, 165, 145, 126, 254, 202, 43, 248, 254, 174, 239, 161, 235, 236, 123, 216, 183, 111, 63, 70, 70, 70, 16, 141, 70, 141, 231, 180, 79, 10, 47, 165, 142, 106, 83, 72, 213, 48, 150, 32, 77, 165, 89, 203, 19, 236, 34, 165, 85, 114, 169, 172, 113, 250, 204, 25, 14, 144, 100, 166, 1, 103, 206, 116, 225, 252, 249, 243, 248, 148, 214, 251, 219, 107, 175, 161, 187, 187, 219, 204, 9, 195, 71, 214, 179, 122, 173, 32, 77, 203, 56, 126, 243, 67, 42, 151, 203, 225, 173, 183, 14, 97, 224, 211, 75, 184, 56, 48, 128, 30, 98, 159, 237, 234, 194, 67, 107, 59, 112, 152, 4, 123, 122, 122, 188, 124, 145, 85, 184, 95, 152, 242, 184, 110, 20, 181, 248, 65, 142, 72, 121, 255, 74, 160, 128, 210, 50, 159, 72, 54, 155, 53, 242, 23, 47, 89, 130, 3, 111, 188, 129, 147, 199, 223, 69, 166, 177, 201, 156, 192, 202, 17, 145, 245, 181, 148, 178, 138, 95, 37, 182, 239, 110, 9, 20, 162, 138, 129, 135, 109, 224, 12, 190, 194, 74, 24, 127, 254, 203, 95, 241, 206, 177, 99, 36, 115, 201, 76, 10, 95, 45, 75, 79, 5, 141, 64, 132, 54, 167, 191, 136, 40, 239, 124, 227, 248, 178, 106, 215, 122, 207, 85, 111, 40, 201, 59, 58, 58, 204, 88, 58, 157, 70, 71, 123, 59, 98, 12, 165, 100, 42, 101, 198, 90, 91, 91, 77, 14, 201, 194, 106, 82, 56, 199, 10, 83, 168, 230, 129, 25, 228, 135, 78, 229, 172, 198, 85, 173, 170, 182, 148, 1, 84, 5, 215, 210, 250, 106, 169, 84, 26, 171, 90, 90, 140, 55, 124, 5, 219, 218, 86, 5, 97, 101, 192, 185, 78, 162, 60, 105, 102, 155, 249, 8, 60, 162, 18, 167, 131, 80, 214, 180, 173, 178, 177, 156, 60, 226, 186, 172, 223, 91, 182, 96, 215, 51, 207, 224, 224, 155, 111, 6, 59, 7, 175, 94, 195, 158, 23, 118, 99, 227, 134, 13, 198, 162, 126, 101, 209, 130, 155, 197, 176, 57, 184, 252, 235, 138, 132, 170, 194, 140, 145, 200, 24, 239, 80, 169, 184, 110, 10, 94, 216, 42, 254, 159, 251, 193, 115, 120, 245, 143, 127, 194, 71, 31, 127, 28, 224, 235, 225, 183, 191, 249, 53, 218, 105, 184, 160, 114, 17, 72, 4, 101, 12, 37, 187, 188, 226, 55, 67, 68, 130, 100, 49, 9, 210, 221, 41, 105, 235, 224, 211, 38, 18, 43, 149, 76, 25, 220, 191, 239, 119, 216, 186, 117, 11, 78, 159, 62, 109, 200, 109, 219, 182, 13, 207, 238, 218, 133, 52, 61, 227, 112, 141, 36, 200, 189, 10, 159, 203, 249, 176, 193, 19, 174, 223, 52, 167, 80, 184, 194, 210, 185, 140, 231, 140, 154, 95, 177, 86, 175, 126, 16, 199, 143, 29, 197, 223, 95, 127, 29, 253, 253, 253, 104, 104, 200, 96, 199, 142, 237, 216, 177, 125, 187, 89, 35, 99, 74, 151, 106, 154, 220, 97, 40, 97, 89, 254, 63, 141, 114, 247, 4, 149, 120, 44, 85, 194, 38, 222, 175, 116, 24, 138, 189, 154, 194, 70, 33, 38, 176, 241, 241, 113, 227, 214, 58, 134, 153, 198, 69, 84, 227, 202, 49, 155, 85, 105, 96, 50, 138, 163, 183, 108, 83, 1, 53, 239, 147, 9, 20, 33, 230, 119, 23, 231, 204, 61, 170, 246, 192, 213, 97, 43, 44, 37, 191, 100, 37, 147, 9, 122, 186, 100, 242, 207, 236, 165, 30, 82, 71, 114, 222, 254, 60, 129, 27, 52, 184, 114, 218, 199, 15, 114, 68, 151, 243, 56, 39, 122, 121, 211, 28, 102, 104, 168, 132, 106, 147, 154, 128, 36, 68, 73, 169, 83, 61, 197, 174, 231, 90, 18, 186, 206, 140, 17, 252, 253, 177, 152, 87, 81, 170, 5, 32, 20, 10, 7, 57, 20, 98, 17, 214, 161, 123, 142, 107, 132, 173, 82, 172, 111, 225, 23, 10, 188, 126, 144, 184, 240, 21, 110, 133, 124, 49, 32, 33, 29, 56, 101, 116, 186, 194, 91, 246, 16, 195, 179, 150, 132, 230, 3, 34, 230, 7, 137, 168, 218, 188, 199, 155, 166, 226, 208, 39, 195, 33, 35, 76, 2, 229, 102, 117, 207, 62, 158, 187, 69, 66, 9, 126, 134, 158, 24, 231, 148, 121, 217, 178, 227, 36, 16, 134, 235, 120, 10, 69, 99, 54, 172, 72, 140, 198, 42, 99, 128, 161, 247, 193, 104, 156, 152, 12, 233, 170, 193, 44, 30, 140, 34, 34, 108, 115, 0, 50, 105, 141, 39, 40, 92, 100, 109, 30, 164, 55, 11, 97, 252, 43, 27, 53, 175, 10, 210, 183, 182, 5, 201, 174, 65, 41, 172, 27, 230, 80, 49, 132, 227, 195, 9, 108, 229, 197, 49, 197, 115, 69, 5, 192, 247, 142, 71, 64, 196, 104, 5, 90, 84, 150, 184, 81, 136, 224, 236, 72, 204, 184, 59, 26, 141, 240, 4, 46, 227, 218, 133, 115, 232, 57, 113, 8, 35, 215, 62, 131, 157, 76, 163, 229, 161, 199, 208, 249, 196, 118, 196, 23, 45, 69, 172, 228, 160, 123, 60, 204, 251, 88, 2, 27, 235, 167, 174, 242, 174, 64, 165, 4, 155, 60, 160, 88, 146, 215, 84, 40, 174, 147, 252, 241, 91, 113, 207, 192, 83, 203, 204, 90, 125, 220, 70, 68, 3, 10, 49, 157, 240, 159, 21, 66, 248, 39, 99, 113, 67, 93, 17, 203, 153, 156, 178, 186, 26, 49, 140, 44, 17, 203, 210, 197, 202, 137, 158, 137, 8, 28, 43, 204, 53, 101, 44, 29, 189, 130, 236, 133, 46, 188, 250, 203, 95, 152, 245, 181, 123, 190, 253, 228, 78, 188, 240, 179, 95, 97, 164, 229, 81, 84, 162, 49, 244, 79, 150, 112, 163, 152, 192, 35, 105, 190, 92, 241, 106, 164, 151, 43, 113, 145, 12, 53, 221, 48, 114, 46, 101, 240, 229, 234, 35, 118, 93, 115, 228, 109, 141, 251, 107, 180, 78, 237, 14, 34, 26, 212, 66, 145, 81, 21, 59, 194, 112, 105, 102, 204, 46, 227, 101, 82, 175, 185, 242, 128, 94, 112, 134, 73, 98, 136, 185, 52, 201, 80, 178, 105, 178, 100, 185, 136, 150, 129, 119, 209, 60, 214, 141, 179, 61, 231, 5, 131, 117, 235, 30, 134, 195, 3, 79, 218, 185, 86, 4, 135, 142, 30, 193, 15, 55, 52, 97, 221, 163, 59, 209, 215, 250, 36, 172, 84, 19, 38, 152, 123, 199, 25, 202, 153, 113, 201, 112, 205, 251, 143, 226, 95, 33, 62, 66, 25, 131, 148, 49, 74, 50, 113, 122, 70, 36, 100, 206, 233, 36, 36, 235, 174, 68, 52, 33, 50, 218, 168, 126, 147, 73, 124, 141, 160, 106, 2, 209, 233, 172, 42, 167, 185, 20, 99, 215, 9, 69, 208, 60, 248, 1, 50, 215, 78, 161, 144, 94, 129, 229, 171, 58, 241, 244, 230, 13, 56, 220, 245, 161, 217, 227, 127, 236, 254, 206, 118, 212, 47, 239, 68, 100, 116, 0, 15, 20, 243, 232, 95, 247, 60, 92, 230, 77, 170, 82, 54, 111, 164, 189, 186, 49, 231, 124, 25, 222, 183, 145, 161, 60, 50, 114, 125, 164, 59, 191, 131, 242, 123, 231, 212, 212, 136, 148, 87, 87, 171, 181, 136, 138, 171, 72, 169, 119, 244, 29, 68, 98, 236, 19, 184, 225, 4, 9, 86, 80, 96, 233, 28, 186, 121, 11, 19, 147, 121, 94, 211, 67, 104, 72, 37, 177, 164, 177, 30, 17, 94, 217, 157, 10, 171, 98, 113, 24, 67, 171, 159, 197, 224, 178, 71, 16, 45, 121, 94, 187, 187, 12, 79, 166, 39, 125, 230, 207, 25, 61, 82, 187, 69, 202, 171, 251, 109, 234, 153, 162, 153, 149, 101, 42, 87, 72, 44, 65, 250, 243, 247, 81, 78, 196, 249, 210, 68, 111, 49, 220, 30, 88, 218, 4, 75, 89, 171, 192, 87, 5, 227, 163, 222, 203, 67, 224, 217, 227, 230, 188, 185, 42, 168, 48, 167, 112, 111, 127, 246, 229, 222, 235, 123, 86, 68, 238, 5, 160, 185, 16, 67, 99, 112, 197, 70, 68, 156, 9, 164, 135, 187, 249, 102, 71, 79, 69, 147, 176, 226, 236, 97, 94, 193, 93, 158, 65, 185, 44, 42, 197, 73, 83, 210, 221, 112, 28, 195, 43, 159, 198, 245, 197, 29, 8, 115, 174, 150, 192, 23, 201, 154, 105, 254, 171, 19, 161, 181, 45, 150, 91, 39, 98, 99, 160, 125, 39, 226, 139, 215, 99, 189, 157, 197, 170, 230, 20, 172, 168, 206, 18, 30, 131, 156, 47, 51, 39, 134, 254, 115, 21, 159, 176, 236, 78, 102, 90, 145, 77, 122, 222, 178, 104, 4, 227, 177, 153, 52, 156, 229, 248, 87, 39, 34, 65, 36, 19, 42, 187, 60, 87, 44, 92, 175, 231, 237, 53, 227, 32, 145, 206, 161, 160, 43, 24, 237, 29, 226, 225, 102, 243, 128, 204, 172, 89, 140, 65, 150, 116, 133, 91, 164, 236, 120, 241, 163, 176, 155, 131, 54, 55, 68, 164, 136, 81, 136, 185, 225, 22, 145, 203, 59, 8, 241, 79, 130, 168, 41, 214, 94, 5, 12, 211, 242, 110, 145, 127, 194, 241, 223, 67, 29, 112, 21, 173, 159, 27, 14, 198, 12, 115, 71, 132, 112, 170, 94, 17, 86, 233, 171, 78, 4, 151, 39, 99, 60, 32, 89, 223, 89, 193, 164, 115, 137, 149, 170, 123, 60, 198, 243, 196, 251, 211, 192, 72, 159, 195, 143, 57, 38, 226, 157, 59, 250, 79, 248, 240, 112, 220, 88, 94, 175, 7, 50, 188, 222, 31, 212, 116, 46, 204, 69, 114, 123, 104, 83, 159, 115, 74, 196, 135, 213, 75, 154, 94, 170, 164, 176, 14, 50, 61, 248, 132, 230, 131, 132, 68, 204, 11, 145, 170, 238, 250, 242, 210, 64, 46, 97, 155, 47, 18, 194, 246, 238, 29, 122, 250, 63, 111, 11, 68, 190, 110, 14, 92, 240, 200, 130, 71, 230, 201, 2, 247, 77, 104, 253, 23, 249, 35, 174, 63, 129, 132, 9, 199, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, 80, 75, 7, 8, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 116, 109, 108, 62, 10, 9, 60, 104, 101, 97, 100, 62, 10, 9, 9, 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, 104, 114, 101, 102, 61, 34, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 99, 115, 115, 34, 32, 47, 62, 10, 9, 60, 47, 104, 101, 97, 100, 62, 10, 9, 60, 98, 111, 100, 121, 62, 10, 9, 60, 100, 105, 118, 62, 60, 105, 109, 103, 32, 115, 114, 99, 61, 34, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 34, 62, 60, 47, 100, 105, 118, 62, 10, 9, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 105, 110, 100, 101, 120, 32, 102, 114, 111, 109, 32, 103, 114, 101, 115, 46, 10, 9, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 201, 26, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 201, 26, 106, 93, 73, 116, 39, 115, 32, 116, 104, 101, 32, 105, 110, 100, 101, 120, 32, 116, 101, 109, 112, 108, 97, 116, 101, 32, 102, 105, 108, 101, 46, 80, 75, 7, 8, 189, 150, 40, 0, 29, 0, 0, 0, 29, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 67, 79, 78, 84, 65, 73, 78, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, 105, 116, 108, 101, 62, 71, 111, 70, 114, 97, 109, 101, 32, 76, 97, 121, 111, 117, 116, 60, 47, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 102, 111, 111, 116, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 46, 109, 97, 105, 110, 84, 112, 108, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 80, 75, 7, 8, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 77, 65, 73, 78, 49, 60, 47, 104, 49, 62, 80, 75, 7, 8, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 77, 65, 73, 78, 50, 60, 47, 104, 49, 62, 80, 75, 7, 8, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 0, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 62, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 21, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 58, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 236, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 156, 2, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 71, 3, 0, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 3, 0, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 211, 3, 0, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 15, 4, 0, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 95, 4, 0, 0, 47, 105, 49, 56, 110, 85, 84, 5, 0, 1, 30, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 155, 4, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 219, 4, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 236, 22, 31, 79, 114, 235, 106, 99, 16, 0, 0, 0, 16, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 30, 5, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 104, 101, 108, 108, 111, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 156, 225, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 241, 22, 31, 79, 157, 17, 117, 39, 16, 0, 0, 0, 16, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 124, 5, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 119, 111, 114, 108, 100, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 166, 225, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 218, 5, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 34, 23, 31, 79, 188, 102, 42, 89, 25, 0, 0, 0, 25, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 29, 6, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 104, 101, 108, 108, 111, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 0, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 42, 23, 31, 79, 158, 65, 95, 108, 15, 0, 0, 0, 15, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 132, 6, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 119, 111, 114, 108, 100, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 17, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 225, 6, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 100, 23, 31, 79, 110, 248, 192, 182, 20, 0, 0, 0, 20, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 36, 7, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 104, 101, 108, 108, 111, 46, 105, 110, 105, 85, 84, 5, 0, 1, 124, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 0, 24, 31, 79, 89, 25, 94, 98, 12, 0, 0, 0, 12, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 133, 7, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 119, 111, 114, 108, 100, 46, 105, 110, 105, 85, 84, 5, 0, 1, 177, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 222, 7, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 185, 24, 31, 79, 190, 33, 11, 186, 25, 0, 0, 0, 25, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 36, 8, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 104, 101, 108, 108, 111, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 15, 228, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 183, 24, 31, 79, 10, 237, 75, 254, 25, 0, 0, 0, 25, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 142, 8, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 119, 111, 114, 108, 100, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 11, 228, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 248, 8, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 58, 24, 31, 79, 16, 122, 22, 143, 79, 0, 0, 0, 79, 0, 0, 0, 25, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 62, 9, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 104, 101, 108, 108, 111, 46, 120, 109, 108, 85, 84, 5, 0, 1, 33, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 67, 24, 31, 79, 250, 38, 76, 149, 79, 0, 0, 0, 79, 0, 0, 0, 25, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 221, 9, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 119, 111, 114, 108, 100, 46, 120, 109, 108, 85, 84, 5, 0, 1, 46, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 124, 10, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 85, 84, 5, 0, 1, 33, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 18, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 189, 10, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 112, 24, 31, 79, 20, 198, 203, 88, 41, 0, 0, 0, 41, 0, 0, 0, 18, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 38, 11, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 106, 97, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 133, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 125, 24, 31, 79, 216, 229, 125, 35, 35, 0, 0, 0, 35, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 152, 11, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 114, 117, 46, 105, 110, 105, 85, 84, 5, 0, 1, 158, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 147, 24, 31, 79, 62, 80, 47, 182, 44, 0, 0, 0, 44, 0, 0, 0, 21, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 3, 12, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 67, 78, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 199, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 166, 24, 31, 79, 201, 64, 202, 211, 105, 0, 0, 0, 105, 0, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 123, 12, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 84, 87, 46, 120, 109, 108, 85, 84, 5, 0, 1, 232, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 13, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 47, 13, 0, 0, 47, 105, 49, 56, 110, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 113, 64, 31, 79, 81, 103, 32, 118, 43, 0, 0, 0, 43, 0, 0, 0, 13, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 147, 13, 0, 0, 47, 105, 49, 56, 110, 47, 106, 97, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 214, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 121, 64, 31, 79, 99, 56, 186, 107, 40, 0, 0, 0, 40, 0, 0, 0, 13, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 2, 14, 0, 0, 47, 105, 49, 56, 110, 47, 114, 117, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 231, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 130, 64, 31, 79, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 110, 14, 0, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 67, 78, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 245, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 132, 64, 31, 79, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 214, 14, 0, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 84, 87, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 249, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 62, 15, 0, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 122, 15, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 186, 15, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 54, 16, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 120, 16, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 87, 30, 0, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 84, 31, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 201, 26, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 189, 150, 40, 0, 29, 0, 0, 0, 29, 0, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 148, 31, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 201, 26, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 252, 31, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 32, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 68, 32, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 204, 32, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 75, 33, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 206, 33, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 28, 35, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 100, 35, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 199, 35, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 42, 36, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 204, 36, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 25, 37, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 127, 37, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 5, 6, 0, 0, 0, 0, 58, 0, 58, 0, 157, 16, 0, 0, 229, 37, 0, 0, 0, 0}); err != nil {
panic(err)
}
}
diff --git a/os/gview/gview.go b/os/gview/gview.go
index 9ec056e82..c6dcc2059 100644
--- a/os/gview/gview.go
+++ b/os/gview/gview.go
@@ -24,11 +24,12 @@ import (
// View object for template engine.
type View struct {
- mu sync.RWMutex
- paths *garray.StringArray // Searching path array.
- data map[string]interface{} // Global template variables.
- funcMap map[string]interface{} // Global template function map.
- delimiters []string // Customized template delimiters.
+ mu sync.RWMutex
+ paths *garray.StringArray // Searching path array.
+ data map[string]interface{} // Global template variables.
+ funcMap map[string]interface{} // Global template function map.
+ i18nEnabled bool // Is i18n enabled in this template.
+ delimiters []string // Customized template delimiters.
}
// Params is type for template params.
@@ -59,10 +60,11 @@ func ParseContent(content string, params Params) (string, error) {
// The parameter specifies the template directory path to load template files.
func New(path ...string) *View {
view := &View{
- paths: garray.NewStringArray(true),
- data: make(map[string]interface{}),
- funcMap: make(map[string]interface{}),
- delimiters: make([]string, 2),
+ paths: garray.NewStringArray(true),
+ data: make(map[string]interface{}),
+ funcMap: make(map[string]interface{}),
+ i18nEnabled: true,
+ delimiters: make([]string, 2),
}
if len(path) > 0 && len(path[0]) > 0 {
view.SetPath(path[0])
diff --git a/os/gview/gview_config.go b/os/gview/gview_config.go
index b2d2e9e67..5b0da3d1a 100644
--- a/os/gview/gview_config.go
+++ b/os/gview/gview_config.go
@@ -51,3 +51,10 @@ func (view *View) BindFuncMap(funcMap FuncMap) {
}
view.mu.Unlock()
}
+
+// SetI18nEnabled enables/disables i18n feature in this template.
+func (view *View) SetI18nEnabled(enabled bool) {
+ view.mu.Lock()
+ view.i18nEnabled = enabled
+ view.mu.Unlock()
+}
diff --git a/os/gview/gview_doparse.go b/os/gview/gview_doparse.go
index 2d1861105..de6c857d3 100644
--- a/os/gview/gview_doparse.go
+++ b/os/gview/gview_doparse.go
@@ -13,6 +13,8 @@ import (
"strings"
"text/template"
+ "github.com/gogf/gf/util/gi18n"
+
"github.com/gogf/gf/os/gfcache"
"github.com/gogf/gf/os/gres"
@@ -47,12 +49,9 @@ func (view *View) getTemplate(path string, pattern string) (tpl *template.Templa
r := templates.GetOrSetFuncLock(path, func() interface{} {
tpl = template.New(path).Delims(view.delimiters[0], view.delimiters[1]).Funcs(view.funcMap)
// Firstly checking the resource manager.
- if files := gres.Scan(path, pattern, true); len(files) > 0 {
+ if files := gres.ScanDirFile(path, pattern, true); len(files) > 0 {
var err error
for _, v := range files {
- if v.FileInfo().IsDir() {
- continue
- }
_, err = tpl.New(v.FileInfo().Name()).Parse(string(v.Content()))
if err != nil {
glog.Error(err)
@@ -82,19 +81,17 @@ func (view *View) getTemplate(path string, pattern string) (tpl *template.Templa
// searchFile returns the found absolute path for , and its template folder path.
func (view *View) searchFile(file string) (path string, folder string, err error) {
- separator := gfile.Separator
// Firstly checking the resource manager.
- separator = "/"
view.paths.RLockFunc(func(array []string) {
f := (*gres.File)(nil)
for _, v := range array {
- v = strings.TrimRight(v, separator)
- if f = gres.Get(v + separator + file); f != nil {
+ v = strings.TrimRight(v, "/")
+ if f = gres.Get(v + "/" + file); f != nil {
path = f.Name()
folder = gfile.Dir(path)
break
}
- if f = gres.Get(v + separator + "template" + separator + file); f != nil {
+ if f = gres.Get(v + "/template/" + file); f != nil {
path = f.Name()
folder = gfile.Dir(path)
break
@@ -105,19 +102,29 @@ func (view *View) searchFile(file string) (path string, folder string, err error
if path == "" {
view.paths.RLockFunc(func(array []string) {
for _, v := range array {
- v = strings.TrimRight(v, separator)
+ v = strings.TrimRight(v, gfile.Separator)
if path, _ = gspath.Search(v, file); path != "" {
folder = v
break
}
- if path, _ = gspath.Search(v+separator+"template", file); path != "" {
- folder = v + separator + "template"
+ if path, _ = gspath.Search(v+gfile.Separator+"template", file); path != "" {
+ folder = v + gfile.Separator + "template"
break
}
}
})
}
-
+ // Checking the configuration file in default paths.
+ if path == "" && !gres.IsEmpty() {
+ for _, v := range []string{"/template", "/template/"} {
+ if file := gres.Get(v + file); file != nil {
+ path = file.Name()
+ folder = gfile.Dir(path)
+ return
+ }
+ }
+ }
+ // Error checking.
if path == "" {
buffer := bytes.NewBuffer(nil)
if view.paths.Len() > 0 {
@@ -131,7 +138,7 @@ func (view *View) searchFile(file string) (path string, folder string, err error
}
buffer.WriteString(fmt.Sprintf("\n%d. %s", index, v))
index++
- buffer.WriteString(fmt.Sprintf("\n%d. %s", index, strings.TrimRight(v, "/")+separator+"template"))
+ buffer.WriteString(fmt.Sprintf("\n%d. %s", index, strings.TrimRight(v, "/")+gfile.Separator+"template"))
index++
}
})
@@ -202,7 +209,11 @@ func (view *View) Parse(file string, params ...Params) (parsed string, err error
if err := tpl.Execute(buffer, vars); err != nil {
return "", err
}
- return gstr.Replace(buffer.String(), "", ""), nil
+ result := gstr.Replace(buffer.String(), "", "")
+ if view.i18nEnabled {
+ result = gi18n.T(result)
+ }
+ return result, nil
}
// ParseContent parses given template content
@@ -254,5 +265,9 @@ func (view *View) ParseContent(content string, params ...Params) (string, error)
if err := tpl.Execute(buffer, vars); err != nil {
return "", err
}
- return gstr.Replace(buffer.String(), "", ""), nil
+ result := gstr.Replace(buffer.String(), "", "")
+ if view.i18nEnabled {
+ result = gi18n.T(result)
+ }
+ return result, nil
}
diff --git a/os/gview/gview_unit_test.go b/os/gview/gview_unit_basic_test.go
similarity index 94%
rename from os/gview/gview_unit_test.go
rename to os/gview/gview_unit_basic_test.go
index 9c04e2a04..867fcfca4 100644
--- a/os/gview/gview_unit_test.go
+++ b/os/gview/gview_unit_basic_test.go
@@ -1,3 +1,9 @@
+// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
+//
+// This Source Code Form is subject to the terms of the MIT License.
+// If a copy of the MIT was not distributed with this file,
+// You can obtain one at https://github.com/gogf/gf.
+
package gview_test
import (
@@ -16,7 +22,7 @@ func init() {
os.Setenv("GF_GVIEW_ERRORPRINT", "false")
}
-func TestView_Basic(t *testing.T) {
+func Test_Basic(t *testing.T) {
gtest.Case(t, func() {
str := `hello {{.name}},version:{{.version}};hello {{GetName}},version:{{GetVersion}};{{.other}}`
pwd := gfile.Pwd()
@@ -45,7 +51,7 @@ func TestView_Basic(t *testing.T) {
})
}
-func TestView_Func(t *testing.T) {
+func Test_Func(t *testing.T) {
gtest.Case(t, func() {
str := `{{eq 1 1}};{{eq 1 2}};{{eq "A" "B"}}`
result, err := gview.ParseContent(str, nil)
@@ -162,7 +168,7 @@ func TestView_Func(t *testing.T) {
})
}
-func TestView_FuncInclude(t *testing.T) {
+func Test_FuncInclude(t *testing.T) {
gtest.Case(t, func() {
header := `HEADER
`
main := `hello gf
`
@@ -200,7 +206,7 @@ func TestView_FuncInclude(t *testing.T) {
})
}
-func TestView_SetPath(t *testing.T) {
+func Test_SetPath(t *testing.T) {
gtest.Case(t, func() {
view := gview.Instance("addpath")
err := view.AddPath("tmp")
@@ -230,7 +236,7 @@ func TestView_SetPath(t *testing.T) {
})
}
-func TestView_ParseContent(t *testing.T) {
+func Test_ParseContent(t *testing.T) {
gtest.Case(t, func() {
str := `{{.name}}`
view := gview.New()
diff --git a/os/gview/gview_unit_i18n_test.go b/os/gview/gview_unit_i18n_test.go
new file mode 100644
index 000000000..d7e18eb21
--- /dev/null
+++ b/os/gview/gview_unit_i18n_test.go
@@ -0,0 +1,49 @@
+// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved.
+//
+// This Source Code Form is subject to the terms of the MIT License.
+// If a copy of the MIT was not distributed with this file,
+// You can obtain one at https://github.com/gogf/gf.
+
+package gview_test
+
+import (
+ "testing"
+
+ "github.com/gogf/gf/debug/gdebug"
+ "github.com/gogf/gf/os/gfile"
+
+ "github.com/gogf/gf/frame/g"
+ "github.com/gogf/gf/test/gtest"
+)
+
+func Test_I18n(t *testing.T) {
+ gtest.Case(t, func() {
+ content := `{{.name}} says "{#hello}{#world}!"`
+ expect1 := `john says "你好世界!"`
+ expect2 := `john says "こんにちは世界!"`
+ expect3 := `john says "{#hello}{#world}!"`
+
+ g.I18n().SetPath(gdebug.CallerDirectory() + gfile.Separator + "testdata" + gfile.Separator + "i18n")
+
+ g.I18n().SetLanguage("zh-CN")
+ result1, err := g.View().ParseContent(content, g.Map{
+ "name": "john",
+ })
+ gtest.Assert(err, nil)
+ gtest.Assert(result1, expect1)
+
+ g.I18n().SetLanguage("ja")
+ result2, err := g.View().ParseContent(content, g.Map{
+ "name": "john",
+ })
+ gtest.Assert(err, nil)
+ gtest.Assert(result2, expect2)
+
+ g.I18n().SetLanguage("none")
+ result3, err := g.View().ParseContent(content, g.Map{
+ "name": "john",
+ })
+ gtest.Assert(err, nil)
+ gtest.Assert(result3, expect3)
+ })
+}
diff --git a/os/gview/testdata/i18n/en.toml b/os/gview/testdata/i18n/en.toml
new file mode 100644
index 000000000..17df41597
--- /dev/null
+++ b/os/gview/testdata/i18n/en.toml
@@ -0,0 +1,3 @@
+
+hello = "Hello"
+world = "World"
\ No newline at end of file
diff --git a/os/gview/testdata/i18n/ja.toml b/os/gview/testdata/i18n/ja.toml
new file mode 100644
index 000000000..8ca47ed7f
--- /dev/null
+++ b/os/gview/testdata/i18n/ja.toml
@@ -0,0 +1,3 @@
+
+hello = "こんにちは"
+world = "世界"
\ No newline at end of file
diff --git a/os/gview/testdata/i18n/ru.toml b/os/gview/testdata/i18n/ru.toml
new file mode 100644
index 000000000..938434a5a
--- /dev/null
+++ b/os/gview/testdata/i18n/ru.toml
@@ -0,0 +1,3 @@
+
+hello = "Привет"
+world = "мир"
\ No newline at end of file
diff --git a/os/gview/testdata/i18n/zh-CN.toml b/os/gview/testdata/i18n/zh-CN.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/os/gview/testdata/i18n/zh-CN.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file
diff --git a/os/gview/testdata/i18n/zh-TW.toml b/os/gview/testdata/i18n/zh-TW.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/os/gview/testdata/i18n/zh-TW.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file
diff --git a/text/gregex/gregex.go b/text/gregex/gregex.go
index 5a2d1e9da..8ad0292ee 100644
--- a/text/gregex/gregex.go
+++ b/text/gregex/gregex.go
@@ -100,14 +100,14 @@ func ReplaceFunc(pattern string, src []byte, replaceFunc func(b []byte) []byte)
}
}
-// ReplaceFunc replace all matched in bytes
+// ReplaceFuncMatch replace all matched in bytes
// with custom replacement function .
// The parameter type for is [][]byte,
// which is the result contains all sub-patterns of using Match function.
func ReplaceFuncMatch(pattern string, src []byte, replaceFunc func(match [][]byte) []byte) ([]byte, error) {
if r, err := getRegexp(pattern); err == nil {
return r.ReplaceAllFunc(src, func(bytes []byte) []byte {
- match, _ := Match(pattern, src)
+ match, _ := Match(pattern, bytes)
return replaceFunc(match)
}), nil
} else {
@@ -131,7 +131,7 @@ func ReplaceStringFunc(pattern string, src string, replaceFunc func(s string) st
func ReplaceStringFuncMatch(pattern string, src string, replaceFunc func(match []string) string) (string, error) {
if r, err := getRegexp(pattern); err == nil {
return string(r.ReplaceAllFunc([]byte(src), func(bytes []byte) []byte {
- match, _ := MatchString(pattern, src)
+ match, _ := MatchString(pattern, string(bytes))
return []byte(replaceFunc(match))
})), nil
} else {
diff --git a/util/gi18n/gi18n.go b/util/gi18n/gi18n.go
new file mode 100644
index 000000000..dad50f059
--- /dev/null
+++ b/util/gi18n/gi18n.go
@@ -0,0 +1,38 @@
+// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved.
+//
+// This Source Code Form is subject to the terms of the MIT License.
+// If a copy of the MIT was not distributed with this file,
+// You can obtain one at https://github.com/gogf/gf.
+
+// Package gi18n implements internationalization and localization.
+package gi18n
+
+var (
+ defaultTranslator = Instance()
+)
+
+// SetPath sets the directory path storing i18n files.
+func SetPath(path string) error {
+ return defaultTranslator.SetPath(path)
+}
+
+// SetLanguage sets the language for translator.
+func SetLanguage(language string) {
+ defaultTranslator.SetLanguage(language)
+}
+
+// SetDelimiters sets the delimiters for translator.
+func SetDelimiters(left, right string) {
+ defaultTranslator.SetDelimiters(left, right)
+}
+
+// T is alias of Translate.
+func T(content string, language ...string) string {
+ return defaultTranslator.T(content, language...)
+}
+
+// Translate translates with configured language.
+// The parameter specifies custom translation language ignoring configured language.
+func Translate(content string, language ...string) string {
+ return defaultTranslator.Translate(content, language...)
+}
diff --git a/util/gi18n/gi18n_instance.go b/util/gi18n/gi18n_instance.go
new file mode 100644
index 000000000..3d46d26d5
--- /dev/null
+++ b/util/gi18n/gi18n_instance.go
@@ -0,0 +1,31 @@
+// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved.
+//
+// This Source Code Form is subject to the terms of the MIT License.
+// If a copy of the MIT was not distributed with this file,
+// You can obtain one at https://github.com/gogf/gf.
+
+package gi18n
+
+import "github.com/gogf/gf/container/gmap"
+
+const (
+ // Default group name for instance usage.
+ DEFAULT_NAME = "default"
+)
+
+var (
+ // Instances map.
+ instances = gmap.NewStrAnyMap(true)
+)
+
+// Instance returns an instance of Resource.
+// The parameter is the name for the instance.
+func Instance(name ...string) *Translator {
+ key := DEFAULT_NAME
+ if len(name) > 0 && name[0] != "" {
+ key = name[0]
+ }
+ return instances.GetOrSetFuncLock(key, func() interface{} {
+ return New()
+ }).(*Translator)
+}
diff --git a/util/gi18n/gi18n_translator.go b/util/gi18n/gi18n_translator.go
new file mode 100644
index 000000000..683bbe93a
--- /dev/null
+++ b/util/gi18n/gi18n_translator.go
@@ -0,0 +1,208 @@
+// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved.
+//
+// This Source Code Form is subject to the terms of the MIT License.
+// If a copy of the MIT was not distributed with this file,
+// You can obtain one at https://github.com/gogf/gf.
+
+package gi18n
+
+import (
+ "errors"
+ "fmt"
+ "strings"
+ "sync"
+
+ "github.com/gogf/gf/os/gfsnotify"
+
+ "github.com/gogf/gf/text/gregex"
+
+ "github.com/gogf/gf/util/gconv"
+
+ "github.com/gogf/gf/encoding/gjson"
+
+ "github.com/gogf/gf/os/gfile"
+ "github.com/gogf/gf/os/gres"
+)
+
+// Translator, it is concurrent safe, supporting hot reload.
+type Translator struct {
+ mu sync.RWMutex
+ data map[string]map[string]string // Translating map.
+ pattern string // Pattern for regex parsing.
+ options Options // configuration options.
+}
+
+type Options struct {
+ Path string // I18n files storage path.
+ Language string // Local language.
+ Delimiters []string // Delimiters for variable parsing.
+}
+
+var (
+ defaultDelimiters = []string{"{#", "}"}
+)
+
+func New(options ...Options) *Translator {
+ var opts Options
+ if len(options) > 0 {
+ opts = options[0]
+ } else {
+ opts = DefaultOptions()
+ }
+ if len(opts.Delimiters) == 0 {
+ opts.Delimiters = defaultDelimiters
+ }
+ return &Translator{
+ options: opts,
+ pattern: fmt.Sprintf(
+ `%s(\w+)%s`,
+ gregex.Quote(opts.Delimiters[0]),
+ gregex.Quote(opts.Delimiters[1]),
+ ),
+ }
+}
+
+func DefaultOptions() Options {
+ path := "i18n"
+ realPath, _ := gfile.Search(path)
+ if realPath != "" {
+ path = realPath
+ } else {
+ path = "/" + path
+ }
+ return Options{
+ Path: path,
+ Delimiters: []string{"{#", "}"},
+ }
+}
+
+// SetPath sets the directory path storing i18n files.
+func (t *Translator) SetPath(path string) error {
+ if gres.Contains(path) {
+ t.options.Path = path
+ } else {
+ realPath, _ := gfile.Search(path)
+ if realPath == "" {
+ return errors.New(fmt.Sprintf(`%s does not exist`, path))
+ }
+ t.options.Path = realPath
+ }
+ return nil
+}
+
+// SetLanguage sets the language for translator.
+func (t *Translator) SetLanguage(language string) {
+ t.options.Language = language
+}
+
+// SetDelimiters sets the delimiters for translator.
+func (t *Translator) SetDelimiters(left, right string) {
+ t.pattern = fmt.Sprintf(`%s(\w+)%s`, gregex.Quote(left), gregex.Quote(right))
+}
+
+// T is alias of Translate.
+func (t *Translator) T(content string, language ...string) string {
+ return t.Translate(content, language...)
+}
+
+// Translate translates with configured language.
+// The parameter specifies custom translation language ignoring configured language.
+func (t *Translator) Translate(content string, language ...string) string {
+ t.init()
+ t.mu.RLock()
+ defer t.mu.RUnlock()
+ var data map[string]string
+ if len(language) > 0 {
+ data = t.data[language[0]]
+ } else {
+ data = t.data[t.options.Language]
+ }
+ if data == nil {
+ return content
+ }
+ // Parse content as name.
+ if v, ok := data[content]; ok {
+ return v
+ }
+ // Parse content as variables container.
+ result, _ := gregex.ReplaceStringFuncMatch(t.pattern, content, func(match []string) string {
+ if v, ok := data[match[1]]; ok {
+ return v
+ }
+ return match[0]
+ })
+ return result
+}
+
+func (t *Translator) init() {
+ t.mu.RLock()
+ if t.data != nil {
+ t.mu.RUnlock()
+ return
+ }
+ t.mu.RUnlock()
+
+ t.mu.Lock()
+ defer t.mu.Unlock()
+ if gres.Contains(t.options.Path) {
+ files := gres.ScanDirFile(t.options.Path, "*.*", true)
+ if len(files) > 0 {
+ var path string
+ var name string
+ var lang string
+ var array []string
+ t.data = make(map[string]map[string]string)
+ for _, file := range files {
+ name = file.Name()
+ path = name[len(t.options.Path)+1:]
+ array = strings.Split(path, "/")
+ if len(array) > 1 {
+ lang = array[0]
+ } else {
+ lang = gfile.Name(array[0])
+ }
+ if t.data[lang] == nil {
+ t.data[lang] = make(map[string]string)
+ }
+ j, _ := gjson.LoadContent(file.Content())
+ if j != nil {
+ for k, v := range j.ToMap() {
+ t.data[lang][k] = gconv.String(v)
+ }
+ }
+ }
+ }
+ } else {
+ files, _ := gfile.ScanDirFile(t.options.Path, "*.*", true)
+ if len(files) > 0 {
+ var path string
+ var lang string
+ var array []string
+ t.data = make(map[string]map[string]string)
+ for _, file := range files {
+ path = file[len(t.options.Path)+1:]
+ array = strings.Split(path, "/")
+ if len(array) > 1 {
+ lang = array[0]
+ } else {
+ lang = gfile.Name(array[0])
+ }
+ if t.data[lang] == nil {
+ t.data[lang] = make(map[string]string)
+ }
+ j, _ := gjson.LoadContent(gfile.GetBytes(file))
+ if j != nil {
+ for k, v := range j.ToMap() {
+ t.data[lang][k] = gconv.String(v)
+ }
+ }
+ }
+ _, _ = gfsnotify.Add(path, func(event *gfsnotify.Event) {
+ t.mu.Lock()
+ t.data = nil
+ t.mu.Unlock()
+ gfsnotify.Exit()
+ })
+ }
+ }
+}
diff --git a/util/gi18n/gi18n_unit_test.go b/util/gi18n/gi18n_unit_test.go
new file mode 100644
index 000000000..4af872213
--- /dev/null
+++ b/util/gi18n/gi18n_unit_test.go
@@ -0,0 +1,31 @@
+// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved.
+//
+// This Source Code Form is subject to the terms of the MIT License.
+// If a copy of the MIT was not distributed with this file,
+// You can obtain one at https://github.com/gogf/gf.
+
+package gi18n_test
+
+import (
+ "testing"
+
+ "github.com/gogf/gf/util/gi18n"
+
+ "github.com/gogf/gf/debug/gdebug"
+ "github.com/gogf/gf/os/gfile"
+
+ "github.com/gogf/gf/test/gtest"
+)
+
+func Test_Basic(t *testing.T) {
+ gtest.Case(t, func() {
+ t := gi18n.New(gi18n.Options{
+ Path: gdebug.CallerDirectory() + gfile.Separator + "testdata" + gfile.Separator + "i18n",
+ })
+ t.SetLanguage("none")
+ gtest.Assert(t.T("{#hello}{#world}"), "{#hello}{#world}")
+
+ t.SetLanguage("ja")
+ gtest.Assert(t.T("{#hello}{#world}"), "こんにちは世界")
+ })
+}
diff --git a/util/gi18n/testdata/i18n-dir/en/hello.toml b/util/gi18n/testdata/i18n-dir/en/hello.toml
new file mode 100644
index 000000000..1680a362c
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/en/hello.toml
@@ -0,0 +1,2 @@
+
+hello = "Hello"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/en/world.toml b/util/gi18n/testdata/i18n-dir/en/world.toml
new file mode 100644
index 000000000..f9afd1e67
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/en/world.toml
@@ -0,0 +1,2 @@
+
+world = "World"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/ja/hello.yaml b/util/gi18n/testdata/i18n-dir/ja/hello.yaml
new file mode 100644
index 000000000..ec827cd49
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/ja/hello.yaml
@@ -0,0 +1,2 @@
+
+hello: "こんにちは"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/ja/world.yaml b/util/gi18n/testdata/i18n-dir/ja/world.yaml
new file mode 100644
index 000000000..04e828b42
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/ja/world.yaml
@@ -0,0 +1 @@
+world: "世界"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/ru/hello.ini b/util/gi18n/testdata/i18n-dir/ru/hello.ini
new file mode 100644
index 000000000..d2e2af1ca
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/ru/hello.ini
@@ -0,0 +1 @@
+hello = Привет
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/ru/world.ini b/util/gi18n/testdata/i18n-dir/ru/world.ini
new file mode 100644
index 000000000..fffaf192d
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/ru/world.ini
@@ -0,0 +1 @@
+world=мир
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/zh-CN/hello.json b/util/gi18n/testdata/i18n-dir/zh-CN/hello.json
new file mode 100644
index 000000000..b8eb10e94
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/zh-CN/hello.json
@@ -0,0 +1,3 @@
+{
+ "hello": "你好"
+}
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/zh-CN/world.json b/util/gi18n/testdata/i18n-dir/zh-CN/world.json
new file mode 100644
index 000000000..9d6392149
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/zh-CN/world.json
@@ -0,0 +1,3 @@
+{
+ "world": "世界"
+}
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/zh-TW/hello.xml b/util/gi18n/testdata/i18n-dir/zh-TW/hello.xml
new file mode 100644
index 000000000..a4e52ef07
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/zh-TW/hello.xml
@@ -0,0 +1,4 @@
+
+
+ 你好
+
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-dir/zh-TW/world.xml b/util/gi18n/testdata/i18n-dir/zh-TW/world.xml
new file mode 100644
index 000000000..877b402c5
--- /dev/null
+++ b/util/gi18n/testdata/i18n-dir/zh-TW/world.xml
@@ -0,0 +1,4 @@
+
+
+ 世界
+
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-file/en.toml b/util/gi18n/testdata/i18n-file/en.toml
new file mode 100644
index 000000000..17df41597
--- /dev/null
+++ b/util/gi18n/testdata/i18n-file/en.toml
@@ -0,0 +1,3 @@
+
+hello = "Hello"
+world = "World"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-file/ja.yaml b/util/gi18n/testdata/i18n-file/ja.yaml
new file mode 100644
index 000000000..0166fcefb
--- /dev/null
+++ b/util/gi18n/testdata/i18n-file/ja.yaml
@@ -0,0 +1,3 @@
+
+hello: "こんにちは"
+world: "世界"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-file/ru.ini b/util/gi18n/testdata/i18n-file/ru.ini
new file mode 100644
index 000000000..f04620fab
--- /dev/null
+++ b/util/gi18n/testdata/i18n-file/ru.ini
@@ -0,0 +1,2 @@
+hello = Привет
+world = мир
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-file/zh-CN.json b/util/gi18n/testdata/i18n-file/zh-CN.json
new file mode 100644
index 000000000..1de75ba1a
--- /dev/null
+++ b/util/gi18n/testdata/i18n-file/zh-CN.json
@@ -0,0 +1,4 @@
+{
+ "hello": "你好",
+ "world": "世界"
+}
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n-file/zh-TW.xml b/util/gi18n/testdata/i18n-file/zh-TW.xml
new file mode 100644
index 000000000..9a4356f4c
--- /dev/null
+++ b/util/gi18n/testdata/i18n-file/zh-TW.xml
@@ -0,0 +1,5 @@
+
+
+ 你好
+ 世界
+
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n/en.toml b/util/gi18n/testdata/i18n/en.toml
new file mode 100644
index 000000000..17df41597
--- /dev/null
+++ b/util/gi18n/testdata/i18n/en.toml
@@ -0,0 +1,3 @@
+
+hello = "Hello"
+world = "World"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n/ja.toml b/util/gi18n/testdata/i18n/ja.toml
new file mode 100644
index 000000000..8ca47ed7f
--- /dev/null
+++ b/util/gi18n/testdata/i18n/ja.toml
@@ -0,0 +1,3 @@
+
+hello = "こんにちは"
+world = "世界"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n/ru.toml b/util/gi18n/testdata/i18n/ru.toml
new file mode 100644
index 000000000..938434a5a
--- /dev/null
+++ b/util/gi18n/testdata/i18n/ru.toml
@@ -0,0 +1,3 @@
+
+hello = "Привет"
+world = "мир"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n/zh-CN.toml b/util/gi18n/testdata/i18n/zh-CN.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/util/gi18n/testdata/i18n/zh-CN.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file
diff --git a/util/gi18n/testdata/i18n/zh-TW.toml b/util/gi18n/testdata/i18n/zh-TW.toml
new file mode 100644
index 000000000..b3a52c527
--- /dev/null
+++ b/util/gi18n/testdata/i18n/zh-TW.toml
@@ -0,0 +1,2 @@
+hello = "你好"
+world = "世界"
\ No newline at end of file