From 3fcc70b891dd225a8fd24c76c491f190b2565740 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 19 Jan 2019 23:33:33 +0200 Subject: [PATCH 001/418] init of v11.2.0: add context#FullRequestURI and NewConditionalHandler As requested at: https://github.com/kataras/iris/issues/1167 and https://github.com/kataras/iris/issues/1170 Former-commit-id: 781c92f444b3e362011be886b32cf88f89998589 --- _examples/routing/conditional-chain/main.go | 49 +++++++++++++++++++ context/context.go | 30 ++++++++++-- context/handler.go | 52 +++++++++++++++++++++ go19.go | 6 +++ httptest/httptest.go | 3 +- iris.go | 18 +++++++ 6 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 _examples/routing/conditional-chain/main.go diff --git a/_examples/routing/conditional-chain/main.go b/_examples/routing/conditional-chain/main.go new file mode 100644 index 00000000..ec2765f8 --- /dev/null +++ b/_examples/routing/conditional-chain/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "github.com/kataras/iris" +) + +func main() { + app := iris.New() + v1 := app.Party("/api/v1") + + myFilter := func(ctx iris.Context) bool { + // don't do that on production, use session or/and database calls and etc. + ok, _ := ctx.URLParamBool("admin") + return ok + } + + onlyWhenFilter1 := func(ctx iris.Context) { + ctx.Application().Logger().Infof("admin: %s", ctx.Params()) + ctx.Next() + } + + onlyWhenFilter2 := func(ctx iris.Context) { + // You can always use the per-request storage + // to perform actions like this ofc. + // + // this handler: ctx.Values().Set("is_admin", true) + // next handler: isAdmin := ctx.Values().GetBoolDefault("is_admin", false) + // + // but, let's simplify it: + ctx.HTML("

Hello Admin


") + ctx.Next() + } + + // HERE: + // It can be registered anywhere, as a middleware. + // It will fire the `onlyWhenFilter1` and `onlyWhenFilter2` as middlewares (with ctx.Next()) + // if myFilter pass otherwise it will just continue the handler chain with ctx.Next() by ignoring + // the `onlyWhenFilter1` and `onlyWhenFilter2`. + myMiddleware := iris.NewConditionalHandler(myFilter, onlyWhenFilter1, onlyWhenFilter2) + + v1UsersRouter := v1.Party("/users", myMiddleware) + v1UsersRouter.Get("/", func(ctx iris.Context) { + ctx.HTML("requested: /api/v1/users") + }) + + // http://localhost:8080/api/v1/users + // http://localhost:8080/api/v1/users?admin=true + app.Run(iris.Addr(":8080")) +} diff --git a/context/context.go b/context/context.go index f437e447..0b37b8d8 100644 --- a/context/context.go +++ b/context/context.go @@ -292,7 +292,6 @@ type Context interface { // RequestPath returns the full request path, // based on the 'escape'. RequestPath(escape bool) string - // Host returns the host part of the current url. Host() string // Subdomain returns the subdomain of this request, if any. @@ -300,6 +299,9 @@ type Context interface { Subdomain() (subdomain string) // IsWWW returns true if the current subdomain (if any) is www. IsWWW() bool + // FullRqeuestURI returns the full URI, + // including the scheme, the host and the relative requested path/resource. + FullRequestURI() string // RemoteAddr tries to parse and return the real client's request IP. // // Based on allowed headers names that can be modified from Configuration.RemoteAddrHeaders. @@ -1465,11 +1467,11 @@ func (ctx *context) Host() string { // GetHost returns the host part of the current URI. func GetHost(r *http.Request) string { - h := r.URL.Host - if h == "" { - h = r.Host + if host := r.Host; host != "" { + return host } - return h + + return r.URL.Host } // Subdomain returns the subdomain of this request, if any. @@ -1502,6 +1504,24 @@ func (ctx *context) IsWWW() bool { return false } +// FullRqeuestURI returns the full URI, +// including the scheme, the host and the relative requested path/resource. +func (ctx *context) FullRequestURI() string { + scheme := ctx.request.URL.Scheme + if scheme == "" { + if ctx.request.TLS != nil { + scheme = "https:" + } else { + scheme = "http:" + } + } + + host := ctx.Host() + path := ctx.Path() + + return scheme + "//" + host + path +} + const xForwardedForHeaderKey = "X-Forwarded-For" // RemoteAddr tries to parse and return the real client's request IP. diff --git a/context/handler.go b/context/handler.go index 6d980513..1dcf1a02 100644 --- a/context/handler.go +++ b/context/handler.go @@ -34,3 +34,55 @@ func HandlerName(h Handler) string { // return fmt.Sprintf("%s:%d", l, n) return runtime.FuncForPC(pc).Name() } + +// Filter is just a type of func(Handler) bool which reports whether an action must be performed +// based on the incoming request. +// +// See `NewConditionalHandler` for more. +type Filter func(Context) bool + +// NewConditionalHandler returns a single Handler which can be registered +// as a middleware. +// Filter is just a type of Handler which returns a boolean. +// Handlers here should act like middleware, they should contain `ctx.Next` to proceed +// to the next handler of the chain. Those "handlers" are registed to the per-request context. +// +// +// It checks the "filter" and if passed then +// it, correctly, executes the "handlers". +// +// If passed, this function makes sure that the Context's information +// about its per-request handler chain based on the new "handlers" is always updated. +// +// If not passed, then simply the Next handler(if any) is executed and "handlers" are ignored. +// +// Example can be found at: _examples/routing/conditional-chain. +func NewConditionalHandler(filter Filter, handlers ...Handler) Handler { + return func(ctx Context) { + if filter(ctx) { + // Note that we don't want just to fire the incoming handlers, we must make sure + // that it won't break any further handler chain + // information that may be required for the next handlers. + // + // The below code makes sure that this conditional handler does not break + // the ability that iris provides to its end-devs + // to check and modify the per-request handlers chain at runtime. + currIdx := ctx.HandlerIndex(-1) + currHandlers := ctx.Handlers() + if currIdx == len(currHandlers)-1 { + // if this is the last handler of the chain + // just add to the last the new handlers and call Next to fire those. + ctx.AddHandler(handlers...) + ctx.Next() + return + } + // otherwise insert the new handlers in the middle of the current executed chain and the next chain. + newHandlers := append(currHandlers[:currIdx], append(handlers, currHandlers[currIdx+1:]...)...) + ctx.SetHandlers(newHandlers) + ctx.Next() + return + } + // if not pass, then just execute the next. + ctx.Next() + } +} diff --git a/go19.go b/go19.go index dd196196..6d6c979e 100644 --- a/go19.go +++ b/go19.go @@ -42,6 +42,12 @@ type ( // If Handler panics, the server (the caller of Handler) assumes that the effect of the panic was isolated to the active request. // It recovers the panic, logs a stack trace to the server error log, and hangs up the connection. Handler = context.Handler + // Filter is just a type of func(Handler) bool which reports whether an action must be performed + // based on the incoming request. + // + // See `NewConditionalHandler` for more. + // An alias for the `context/Filter`. + Filter = context.Filter // A Map is a shortcut of the map[string]interface{}. Map = context.Map diff --git a/httptest/httptest.go b/httptest/httptest.go index 50253c53..243f765b 100644 --- a/httptest/httptest.go +++ b/httptest/httptest.go @@ -5,8 +5,9 @@ import ( "net/http" "testing" - "github.com/iris-contrib/httpexpect" "github.com/kataras/iris" + + "github.com/iris-contrib/httpexpect" ) type ( diff --git a/iris.go b/iris.go index d2e3e0df..f899fcdf 100644 --- a/iris.go +++ b/iris.go @@ -341,6 +341,24 @@ var ( // // A shortcut for the `context#LimitRequestBodySize`. LimitRequestBodySize = context.LimitRequestBodySize + // NewConditionalHandler returns a single Handler which can be registered + // as a middleware. + // Filter is just a type of Handler which returns a boolean. + // Handlers here should act like middleware, they should contain `ctx.Next` to proceed + // to the next handler of the chain. Those "handlers" are registed to the per-request context. + // + // + // It checks the "filter" and if passed then + // it, correctly, executes the "handlers". + // + // If passed, this function makes sure that the Context's information + // about its per-request handler chain based on the new "handlers" is always updated. + // + // If not passed, then simply the Next handler(if any) is executed and "handlers" are ignored. + // Example can be found at: _examples/routing/conditional-chain. + // + // A shortcut for the `context#NewConditionalHandler`. + NewConditionalHandler = context.NewConditionalHandler // StaticEmbeddedHandler returns a Handler which can serve // embedded into executable files. // From 3dc3fa10ee0a90f53e4aa131559ddb31c953bca4 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 19 Jan 2019 23:34:41 +0200 Subject: [PATCH 002/418] minor misspell fix Former-commit-id: 55408a6c25d55cd052bb613db201723eac977232 --- context/handler.go | 2 +- iris.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/context/handler.go b/context/handler.go index 1dcf1a02..a78423b9 100644 --- a/context/handler.go +++ b/context/handler.go @@ -45,7 +45,7 @@ type Filter func(Context) bool // as a middleware. // Filter is just a type of Handler which returns a boolean. // Handlers here should act like middleware, they should contain `ctx.Next` to proceed -// to the next handler of the chain. Those "handlers" are registed to the per-request context. +// to the next handler of the chain. Those "handlers" are registered to the per-request context. // // // It checks the "filter" and if passed then diff --git a/iris.go b/iris.go index f899fcdf..3cc537b7 100644 --- a/iris.go +++ b/iris.go @@ -345,7 +345,7 @@ var ( // as a middleware. // Filter is just a type of Handler which returns a boolean. // Handlers here should act like middleware, they should contain `ctx.Next` to proceed - // to the next handler of the chain. Those "handlers" are registed to the per-request context. + // to the next handler of the chain. Those "handlers" are registered to the per-request context. // // // It checks the "filter" and if passed then From d451335aa2167e79a077cdcd0c9448839a6d15b8 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 20 Jan 2019 00:00:54 +0200 Subject: [PATCH 003/418] gofmt Former-commit-id: 75992b3aeae2228a7a7f0e698ce78b2f323cc33a --- _examples/view/template_html_5/main.go | 2 +- _examples/websocket/native-messages/main.go | 4 ++-- cache/entry/entry.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_examples/view/template_html_5/main.go b/_examples/view/template_html_5/main.go index 9fcc7fdb..0a7a44ab 100644 --- a/_examples/view/template_html_5/main.go +++ b/_examples/view/template_html_5/main.go @@ -11,7 +11,7 @@ func main() { // TIP: append .Reload(true) to reload the templates on each request. app.Get("/home", func(ctx iris.Context) { - ctx.ViewData("title", "Home page"); + ctx.ViewData("title", "Home page") ctx.View("home.html") // Note that: you can pass "layout" : "otherLayout.html" to bypass the config's Layout property // or view.NoLayout to disable layout on this render action. diff --git a/_examples/websocket/native-messages/main.go b/_examples/websocket/native-messages/main.go index 254cb2a6..33de1d56 100644 --- a/_examples/websocket/native-messages/main.go +++ b/_examples/websocket/native-messages/main.go @@ -27,8 +27,8 @@ func main() { app.RegisterView(iris.HTML("./templates", ".html")) // select the html engine to serve templates ws := websocket.New(websocket.Config{ - // to enable binary messages (useful for protobuf): - // BinaryMessages: true, + // to enable binary messages (useful for protobuf): + // BinaryMessages: true, }) // register the server on an endpoint. diff --git a/cache/entry/entry.go b/cache/entry/entry.go index 7beab739..f875323c 100644 --- a/cache/entry/entry.go +++ b/cache/entry/entry.go @@ -115,7 +115,7 @@ func (e *Entry) Reset(statusCode int, headers map[string][]string, e.response.headers = newHeaders } - e.response.body = make([]byte,len(body)) + e.response.body = make([]byte, len(body)) copy(e.response.body, body) // check if a given life changer provided // and if it does then execute the change life time From 443776c423b95751949381dfbc3d6a3428f6e447 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 20 Jan 2019 14:06:06 +0200 Subject: [PATCH 004/418] add a warning on mvc if someone didn't read the examples or the godocs and .Register dependencies after .Handle a developer sent a direct question message from our facebook page: https://www.facebook.com/iris.framework/ Former-commit-id: ebd7b4bc9078d4952799b4498ce4dfb0ed4c8072 --- mvc/mvc.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/mvc/mvc.go b/mvc/mvc.go index f11e02d4..d80102b8 100644 --- a/mvc/mvc.go +++ b/mvc/mvc.go @@ -1,10 +1,14 @@ package mvc import ( + "strings" + "github.com/kataras/iris/context" "github.com/kataras/iris/core/router" "github.com/kataras/iris/hero" "github.com/kataras/iris/hero/di" + + "github.com/kataras/golog" ) var ( @@ -37,6 +41,7 @@ var ( type Application struct { Dependencies di.Values Router router.Party + Controllers []*ControllerActivator } func newApp(subRouter router.Party, values di.Values) *Application { @@ -105,7 +110,19 @@ func (app *Application) Configure(configurators ...func(*Application)) *Applicat // // Example: `.Register(loggerService{prefix: "dev"}, func(ctx iris.Context) User {...})`. func (app *Application) Register(values ...interface{}) *Application { + if len(values) > 0 && app.Dependencies.Len() == 0 && len(app.Controllers) > 0 { + allControllerNamesSoFar := make([]string, len(app.Controllers)) + for i := range app.Controllers { + allControllerNamesSoFar[i] = app.Controllers[i].Name() + } + + golog.Warnf(`mvc.Application#Register called after mvc.Application#Handle. +The controllers[%s] may miss required dependencies. +Set the Logger's Level to "debug" to view the active dependencies per controller.`, strings.Join(allControllerNamesSoFar, ",")) + } + app.Dependencies.Add(values...) + return app } @@ -173,6 +190,8 @@ func (app *Application) Handle(controller interface{}) *Application { }); okAfter { after.AfterActivation(c) } + + app.Controllers = append(app.Controllers, c) return app } From 680b5a09231f451a6551d2d1d5314f740fd3a537 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Fri, 25 Jan 2019 23:47:31 +0200 Subject: [PATCH 005/418] websocket: replace sync.Map with custom map[string]*connection. Add translate template function example. Fix ctx.HandlerName() does not return the end-dev-defined current route's name, this will give better warnings when using MVC in a wrong way Former-commit-id: 38fda8a20da9bc7665cdd209b7b367c1337dbd94 --- _examples/miscellaneous/i18n/main.go | 13 +++ .../miscellaneous/i18n/templates/index.html | 1 + _examples/mvc/basic/main.go | 2 + _examples/websocket/custom-go-client/run.bat | 4 + context/context.go | 9 +- websocket/server.go | 91 +++++++------------ 6 files changed, 59 insertions(+), 61 deletions(-) create mode 100644 _examples/miscellaneous/i18n/templates/index.html create mode 100644 _examples/websocket/custom-go-client/run.bat diff --git a/_examples/miscellaneous/i18n/main.go b/_examples/miscellaneous/i18n/main.go index ab7b53cc..8b0e93d9 100644 --- a/_examples/miscellaneous/i18n/main.go +++ b/_examples/miscellaneous/i18n/main.go @@ -59,6 +59,19 @@ func newApp() *iris.Application { "key2", fromSecondFileValue) }) + // using in inside your templates: + view := iris.HTML("./templates", ".html") + app.RegisterView(view) + + app.Get("/templates", func(ctx iris.Context) { + ctx.View("index.html", iris.Map{ + "tr": ctx.Translate, + }) + // it will return "hello, iris" + // when {{call .tr "hi" "iris"}} + }) + // + return app } diff --git a/_examples/miscellaneous/i18n/templates/index.html b/_examples/miscellaneous/i18n/templates/index.html new file mode 100644 index 00000000..7fc7cae8 --- /dev/null +++ b/_examples/miscellaneous/i18n/templates/index.html @@ -0,0 +1 @@ +{{call .tr "hi" "iris"}} \ No newline at end of file diff --git a/_examples/mvc/basic/main.go b/_examples/mvc/basic/main.go index b5299221..c28b06af 100644 --- a/_examples/mvc/basic/main.go +++ b/_examples/mvc/basic/main.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/kataras/iris" + "github.com/kataras/iris/middleware/recover" "github.com/kataras/iris/sessions" "github.com/kataras/iris/mvc" @@ -11,6 +12,7 @@ import ( func main() { app := iris.New() + app.Use(recover.New()) app.Logger().SetLevel("debug") mvc.Configure(app.Party("/basic"), basicMVC) diff --git a/_examples/websocket/custom-go-client/run.bat b/_examples/websocket/custom-go-client/run.bat new file mode 100644 index 00000000..3e483188 --- /dev/null +++ b/_examples/websocket/custom-go-client/run.bat @@ -0,0 +1,4 @@ +@echo off +REM run.bat 30 +start go run main.go server +for /L %%n in (1,1,%1) do start go run main.go client \ No newline at end of file diff --git a/context/context.go b/context/context.go index 0b37b8d8..7fa1a95e 100644 --- a/context/context.go +++ b/context/context.go @@ -275,7 +275,8 @@ type Context interface { // that can be used to share information between handlers and middleware. Values() *memstore.Store // Translate is the i18n (localization) middleware's function, - // it calls the Get("translate") to return the translated value. + // it calls the Values().Get(ctx.Application().ConfigurationReadOnly().GetTranslateFunctionContextKey()) + // to execute the translate function and return the localized text value. // // Example: https://github.com/kataras/iris/tree/master/_examples/miscellaneous/i18n Translate(format string, args ...interface{}) string @@ -1180,6 +1181,9 @@ func (ctx *context) Proceed(h Handler) bool { // HandlerName returns the current handler's name, helpful for debugging. func (ctx *context) HandlerName() string { + if name := ctx.currentRouteName; name != "" { + return name + } return HandlerName(ctx.handlers[ctx.currentHandlerIndex]) } @@ -1380,7 +1384,8 @@ func (ctx *context) Values() *memstore.Store { } // Translate is the i18n (localization) middleware's function, -// it calls the Get("translate") to return the translated value. +// it calls the Values().Get(ctx.Application().ConfigurationReadOnly().GetTranslateFunctionContextKey()) +// to execute the translate function and return the localized text value. // // Example: https://github.com/kataras/iris/tree/master/_examples/miscellaneous/i18n func (ctx *context) Translate(format string, args ...interface{}) string { diff --git a/websocket/server.go b/websocket/server.go index 28a25992..9bf323ad 100644 --- a/websocket/server.go +++ b/websocket/server.go @@ -44,9 +44,9 @@ type ( // app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(mywebsocketServer.ClientSource) }) ClientSource []byte messageSerializer *messageSerializer - connections sync.Map // key = the Connection ID. - rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name - mu sync.RWMutex // for rooms. + connections map[string]*connection // key = the Connection ID. + rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name + mu sync.RWMutex // for rooms and connections. onConnectionListeners []ConnectionFunc //connectionPool sync.Pool // sadly we can't make this because the websocket connection is live until is closed. upgrader websocket.Upgrader @@ -64,7 +64,7 @@ func New(cfg Config) *Server { config: cfg, ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), messageSerializer: newMessageSerializer(cfg.EvtMessagePrefix), - connections: sync.Map{}, // ready-to-use, this is not necessary. + connections: make(map[string]*connection), rooms: make(map[string][]string), onConnectionListeners: make([]ConnectionFunc, 0), upgrader: websocket.Upgrader{ @@ -133,19 +133,14 @@ func (s *Server) Upgrade(ctx context.Context) Connection { } func (s *Server) addConnection(c *connection) { - s.connections.Store(c.id, c) + s.mu.Lock() + s.connections[c.id] = c + s.mu.Unlock() } func (s *Server) getConnection(connID string) (*connection, bool) { - if cValue, ok := s.connections.Load(connID); ok { - // this cast is not necessary, - // we know that we always save a connection, but for good or worse let it be here. - if conn, ok := cValue.(*connection); ok { - return conn, ok - } - } - - return nil, false + c, ok := s.connections[connID] + return c, ok } // wrapConnection wraps an underline connection to an iris websocket connection. @@ -290,34 +285,24 @@ func (s *Server) leave(roomName string, connID string) (left bool) { // GetTotalConnections returns the number of total connections func (s *Server) GetTotalConnections() (n int) { - s.connections.Range(func(k, v interface{}) bool { - n++ - return true - }) + s.mu.RLock() + n = len(s.connections) + s.mu.RUnlock() - return n + return } // GetConnections returns all connections func (s *Server) GetConnections() []Connection { - // first call of Range to get the total length, we don't want to use append or manually grow the list here for many reasons. - length := s.GetTotalConnections() - conns := make([]Connection, length, length) + s.mu.RLock() + conns := make([]Connection, len(s.connections)) i := 0 - // second call of Range. - s.connections.Range(func(k, v interface{}) bool { - conn, ok := v.(*connection) - if !ok { - // if for some reason (should never happen), the value is not stored as *connection - // then stop the iteration and don't continue insertion of the result connections - // in order to avoid any issues while end-dev will try to iterate a nil entry. - return false - } - conns[i] = conn + for _, c := range s.connections { + conns[i] = c i++ - return true - }) + } + s.mu.RUnlock() return conns } @@ -339,10 +324,8 @@ func (s *Server) GetConnectionsByRoom(roomName string) []Connection { if connIDs, found := s.rooms[roomName]; found { for _, connID := range connIDs { // existence check is not necessary here. - if cValue, ok := s.connections.Load(connID); ok { - if conn, ok := cValue.(*connection); ok { - conns = append(conns, conn) - } + if conn, ok := s.connections[connID]; ok { + conns = append(conns, conn) } } } @@ -382,32 +365,20 @@ func (s *Server) emitMessage(from, to string, data []byte) { } } } else { + s.mu.RLock() // it suppose to send the message to all opened connections or to all except the sender. - s.connections.Range(func(k, v interface{}) bool { - connID, ok := k.(string) - if !ok { - // should never happen. - return true - } - - if to != All && to != connID { // if it's not suppose to send to all connections (including itself) - if to == Broadcast && from == connID { // if broadcast to other connections except this + for _, conn := range s.connections { + if to != All && to != conn.id { // if it's not suppose to send to all connections (including itself) + if to == Broadcast && from == conn.id { // if broadcast to other connections except this // here we do the opossite of previous block, // just skip this connection when it's suppose to send the message to all connections except the sender. - return true + continue } - } - // not necessary cast. - conn, ok := v.(*connection) - if ok { - // send to the client(s) when the top validators passed - conn.writeDefault(data) - } - - return ok - }) + conn.writeDefault(data) + } + s.mu.RUnlock() } } @@ -432,7 +403,9 @@ func (s *Server) Disconnect(connID string) (err error) { // close the underline connection and return its error, if any. err = conn.underline.Close() - s.connections.Delete(connID) + s.mu.Lock() + delete(s.connections, conn.id) + s.mu.Unlock() } return From 4284739151cad071b6f4e08981ec05aaa9155d98 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Mon, 28 Jan 2019 05:36:44 +0200 Subject: [PATCH 006/418] add tutorial for the official mongodb go driver Former-commit-id: 8353dd101c37c223bba404403f9f8fa2d042fede --- HISTORY.md | 4 + README.md | 2 +- VERSION | 2 +- _examples/tutorial/mongodb/.env | 2 + _examples/tutorial/mongodb/0_create_movie.png | Bin 0 -> 93838 bytes _examples/tutorial/mongodb/1_update_movie.png | Bin 0 -> 70592 bytes .../tutorial/mongodb/2_get_all_movies.png | Bin 0 -> 104362 bytes _examples/tutorial/mongodb/3_get_movie.png | Bin 0 -> 85269 bytes _examples/tutorial/mongodb/4_delete_movie.png | Bin 0 -> 49580 bytes _examples/tutorial/mongodb/README.md | 58 ++++++ _examples/tutorial/mongodb/api/store/movie.go | 101 ++++++++++ _examples/tutorial/mongodb/env/env.go | 71 +++++++ _examples/tutorial/mongodb/httputil/error.go | 130 +++++++++++++ _examples/tutorial/mongodb/main.go | 81 ++++++++ _examples/tutorial/mongodb/store/movie.go | 180 ++++++++++++++++++ doc.go | 7 +- iris.go | 2 +- 17 files changed, 635 insertions(+), 5 deletions(-) create mode 100644 _examples/tutorial/mongodb/.env create mode 100644 _examples/tutorial/mongodb/0_create_movie.png create mode 100644 _examples/tutorial/mongodb/1_update_movie.png create mode 100644 _examples/tutorial/mongodb/2_get_all_movies.png create mode 100644 _examples/tutorial/mongodb/3_get_movie.png create mode 100644 _examples/tutorial/mongodb/4_delete_movie.png create mode 100644 _examples/tutorial/mongodb/README.md create mode 100644 _examples/tutorial/mongodb/api/store/movie.go create mode 100644 _examples/tutorial/mongodb/env/env.go create mode 100644 _examples/tutorial/mongodb/httputil/error.go create mode 100644 _examples/tutorial/mongodb/main.go create mode 100644 _examples/tutorial/mongodb/store/movie.go diff --git a/HISTORY.md b/HISTORY.md index 587e1562..340eb0d1 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -17,6 +17,10 @@ Developers are not forced to upgrade if they don't really need it. Upgrade whene **How to upgrade**: Open your command-line and execute this command: `go get -u github.com/kataras/iris` or let the automatic updater do that for you. +# Soon + +Coming soon, stay tuned by reading the [PR](https://github.com/kataras/iris/pull/1175) progress. + # Fr, 11 January 2019 | v11.1.1 Happy new year! This is a minor release, contains mostly bug fixes. diff --git a/README.md b/README.md index c5f97e9a..dfb02623 100644 --- a/README.md +++ b/README.md @@ -1020,7 +1020,7 @@ Iris, unlike others, is 100% compatible with the standards and that's why the ma ## Support -- [HISTORY](HISTORY.md#fr-11-january-2019--v1111) file is your best friend, it contains information about the latest features and changes +- [HISTORY](HISTORY.md#soon) file is your best friend, it contains information about the latest features and changes - Did you happen to find a bug? Post it at [github issues](https://github.com/kataras/iris/issues) - Do you have any questions or need to speak with someone experienced to solve a problem at real-time? Join us to the [community chat](https://chat.iris-go.com) - Complete our form-based user experience report by clicking [here](https://docs.google.com/forms/d/e/1FAIpQLSdCxZXPANg_xHWil4kVAdhmh7EBBHQZ_4_xSZVDL-oCC_z5pA/viewform?usp=sf_link) diff --git a/VERSION b/VERSION index 27271c12..ccea1b39 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -11.1.1:https://github.com/kataras/iris/blob/master/HISTORY.md#fr-11-january-2019--v1111 \ No newline at end of file +11.2.0:https://github.com/kataras/iris/blob/master/HISTORY.md#soon \ No newline at end of file diff --git a/_examples/tutorial/mongodb/.env b/_examples/tutorial/mongodb/.env new file mode 100644 index 00000000..c41f59a0 --- /dev/null +++ b/_examples/tutorial/mongodb/.env @@ -0,0 +1,2 @@ +PORT=8080 +DSN=mongodb://localhost:27017 \ No newline at end of file diff --git a/_examples/tutorial/mongodb/0_create_movie.png b/_examples/tutorial/mongodb/0_create_movie.png new file mode 100644 index 0000000000000000000000000000000000000000..17e8a71e53565a240bdf9f111b1d6449b6b194b7 GIT binary patch literal 93838 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 aGdm`|tF1?T?t$rXAik%opUXO@geCy%3SdJ3 literal 0 HcmV?d00001 diff --git a/_examples/tutorial/mongodb/1_update_movie.png b/_examples/tutorial/mongodb/1_update_movie.png new file mode 100644 index 0000000000000000000000000000000000000000..d0482aa6b2e9d8ab5d749c3459480fbb169d4c25 GIT binary patch literal 70592 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³nU|tXH#H%a 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 J{%!v8e*wU#>-+!! literal 0 HcmV?d00001 diff --git a/_examples/tutorial/mongodb/2_get_all_movies.png b/_examples/tutorial/mongodb/2_get_all_movies.png new file mode 100644 index 0000000000000000000000000000000000000000..1360c0a813a67eac79806f5644521f721aa10f7a GIT binary patch literal 104362 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

+
+
+
\ No newline at end of file
diff --git a/_examples/websocket/basic/browserify/README.md b/_examples/websocket/basic/browserify/README.md
new file mode 100644
index 00000000..6d8d4993
--- /dev/null
+++ b/_examples/websocket/basic/browserify/README.md
@@ -0,0 +1,11 @@
+# Browserify example
+
+```sh
+$ npm install --only=dev # install browserify from the devDependencies.
+$ npm run-script build # browserify and minify the `app.js` into `bundle.js`.
+$ cd ../ && go run server.go # start the neffos server.
+```
+
+> make sure that you have [golang](https://golang.org/dl) installed to run and edit the neffos (server-side).
+
+That's all, now navigate to .
diff --git a/_examples/websocket/basic/browserify/app.js b/_examples/websocket/basic/browserify/app.js
new file mode 100644
index 00000000..967a8480
--- /dev/null
+++ b/_examples/websocket/basic/browserify/app.js
@@ -0,0 +1,61 @@
+const neffos = require('neffos.js');
+
+var scheme = document.location.protocol == "https:" ? "wss" : "ws";
+var port = document.location.port ? ":" + document.location.port : "";
+
+var wsURL = scheme + "://" + document.location.hostname + port + "/echo";
+
+var outputTxt = document.getElementById("output");
+function addMessage(msg) {
+  outputTxt.innerHTML += msg + "\n";
+}
+
+function handleError(reason) {
+  console.log(reason);
+  window.alert(reason);
+}
+
+function handleNamespaceConnectedConn(nsConn) {
+  const inputTxt = document.getElementById("input");
+  const sendBtn = document.getElementById("sendBtn");
+
+  sendBtn.disabled = false;
+  sendBtn.onclick = function () {
+    const input = inputTxt.value;
+    inputTxt.value = "";
+
+    nsConn.emit("chat", input);
+    addMessage("Me: " + input);
+  };
+}
+
+async function runExample() {
+  try {
+    const conn = await neffos.dial(wsURL, {
+      default: { // "default" namespace.
+        _OnNamespaceConnected: function (nsConn, msg) {
+          addMessage("connected to namespace: " + msg.Namespace);
+          handleNamespaceConnectedConn(nsConn);
+        },
+        _OnNamespaceDisconnect: function (nsConn, msg) {
+          addMessage("disconnected from namespace: " + msg.Namespace);
+        },
+        chat: function (nsConn, msg) { // "chat" event.
+          addMessage(msg.Body);
+        }
+      }
+    });
+
+    // You can either wait to conenct or just conn.connect("connect")
+    // and put the `handleNamespaceConnectedConn` inside `_OnNamespaceConnected` callback instead.
+    // const nsConn = await conn.connect("default");
+    // handleNamespaceConnectedConn(nsConn);
+    conn.connect("default");
+
+  } catch (err) {
+    handleError(err);
+  }
+}
+
+runExample();
+
diff --git a/_examples/websocket/basic/browserify/bundle.js b/_examples/websocket/basic/browserify/bundle.js
new file mode 100644
index 00000000..33831280
--- /dev/null
+++ b/_examples/websocket/basic/browserify/bundle.js
@@ -0,0 +1 @@
+(function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;ci[0]&&c[1]
+
+
+
+
+
+
+

+
+
diff --git a/_examples/websocket/basic/browserify/package.json b/_examples/websocket/basic/browserify/package.json
new file mode 100644
index 00000000..de851367
--- /dev/null
+++ b/_examples/websocket/basic/browserify/package.json
@@ -0,0 +1,16 @@
+{
+    "name": "neffos.js.example.browserify",
+    "version": "0.0.1",
+    "scripts": {
+        "browserify": "browserify ./app.js -o ./bundle.js",
+        "minifyES6": "minify ./bundle.js --outFile ./bundle.js",
+        "build": "npm run-script browserify && npm run-script minifyES6"
+    },
+    "dependencies": {
+        "neffos.js": "latest"
+    },
+    "devDependencies": {
+        "browserify": "^16.2.3",
+        "babel-minify": "^0.5.0"
+    }
+}
diff --git a/_examples/websocket/basic/go-client/client.go b/_examples/websocket/basic/go-client/client.go
new file mode 100644
index 00000000..5437ae9f
--- /dev/null
+++ b/_examples/websocket/basic/go-client/client.go
@@ -0,0 +1,85 @@
+package main
+
+import (
+	"bufio"
+	"bytes"
+	"context"
+	"fmt"
+	"log"
+	"os"
+	"time"
+
+	"github.com/kataras/iris/websocket"
+)
+
+const (
+	endpoint              = "ws://localhost:8080/echo"
+	namespace             = "default"
+	dialAndConnectTimeout = 5 * time.Second
+)
+
+// this can be shared with the server.go's.
+// `NSConn.Conn` has the `IsClient() bool` method which can be used to
+// check if that's is a client or a server-side callback.
+var clientEvents = websocket.Namespaces{
+	namespace: websocket.Events{
+		websocket.OnNamespaceConnected: func(c *websocket.NSConn, msg websocket.Message) error {
+			log.Printf("[%s] connected to namespace [%s]", c, msg.Namespace)
+			return nil
+		},
+		websocket.OnNamespaceDisconnect: func(c *websocket.NSConn, msg websocket.Message) error {
+			log.Printf("[%s] disconnected from namespace [%s]", c, msg.Namespace)
+			return nil
+		},
+		"chat": func(c *websocket.NSConn, msg websocket.Message) error {
+			log.Printf("[%s] sent: %s", c.Conn.ID(), string(msg.Body))
+
+			// Write message back to the client message owner with:
+			// c.Emit("chat", msg)
+			// Write message to all except this client with:
+			c.Conn.Server().Broadcast(c, msg)
+			return nil
+		},
+	},
+}
+
+func main() {
+	ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(dialAndConnectTimeout))
+	defer cancel()
+
+	client, err := websocket.Dial(ctx, websocket.GorillaDialer, endpoint, clientEvents)
+	if err != nil {
+		panic(err)
+	}
+	defer client.Close()
+
+	c, err := client.Connect(ctx, namespace)
+	if err != nil {
+		panic(err)
+	}
+
+	fmt.Fprint(os.Stdout, ">> ")
+	scanner := bufio.NewScanner(os.Stdin)
+	for {
+		if !scanner.Scan() {
+			log.Printf("ERROR: %v", scanner.Err())
+			return
+		}
+
+		text := scanner.Bytes()
+
+		if bytes.Equal(text, []byte("exit")) {
+			if err := c.Disconnect(nil); err != nil {
+				log.Printf("reply from server: %v", err)
+			}
+			break
+		}
+
+		ok := c.Emit("chat", text)
+		if !ok {
+			break
+		}
+
+		fmt.Fprint(os.Stdout, ">> ")
+	}
+} // try running this program twice or/and run the server's http://localhost:8080 to check the browser client as well.
diff --git a/_examples/websocket/basic/server.go b/_examples/websocket/basic/server.go
new file mode 100644
index 00000000..9c462dac
--- /dev/null
+++ b/_examples/websocket/basic/server.go
@@ -0,0 +1,53 @@
+package main
+
+import (
+	"log"
+
+	"github.com/kataras/iris"
+	"github.com/kataras/iris/websocket"
+)
+
+const namespace = "default"
+
+// if namespace is empty then simply websocket.Events{...} can be used instead.
+var serverEvents = websocket.Namespaces{
+	namespace: websocket.Events{
+		websocket.OnNamespaceConnected: func(c *websocket.NSConn, msg websocket.Message) error {
+			log.Printf("[%s] connected to namespace [%s]", c, msg.Namespace)
+			return nil
+		},
+		websocket.OnNamespaceDisconnect: func(c *websocket.NSConn, msg websocket.Message) error {
+			log.Printf("[%s] disconnected from namespace [%s]", c, msg.Namespace)
+			return nil
+		},
+		"chat": func(c *websocket.NSConn, msg websocket.Message) error {
+			log.Printf("[%s] sent: %s", c.Conn.ID(), string(msg.Body))
+
+			// Write message back to the client message owner with:
+			// c.Emit("chat", msg)
+			// Write message to all except this client with:
+			c.Conn.Server().Broadcast(c, msg)
+			return nil
+		},
+	},
+}
+
+func main() {
+	app := iris.New()
+	websocketServer := websocket.New(
+		websocket.DefaultGorillaUpgrader, /*DefaultGobwasUpgrader can be used as well*/
+		serverEvents)
+
+	// serves the endpoint of ws://localhost:8080/echo
+	app.Get("/echo", websocket.Handler(websocketServer))
+
+	// serves the browser-based websocket client.
+	app.Get("/", func(ctx iris.Context) {
+		ctx.ServeFile("./browser/index.html", false)
+	})
+
+	// serves the npm browser websocket client usage example.
+	app.StaticWeb("/browserify", "./browserify")
+
+	app.Run(iris.Addr(":8080"))
+}
diff --git a/_examples/websocket/chat/main.go b/_examples/websocket/chat/main.go
deleted file mode 100644
index 86246418..00000000
--- a/_examples/websocket/chat/main.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package main
-
-import (
-	"fmt"
-
-	"github.com/kataras/iris"
-	"github.com/kataras/iris/websocket"
-)
-
-func main() {
-	app := iris.New()
-
-	app.Get("/", func(ctx iris.Context) {
-		ctx.ServeFile("websockets.html", false) // second parameter: enable gzip?
-	})
-
-	setupWebsocket(app)
-
-	// x2
-	// http://localhost:8080
-	// http://localhost:8080
-	// write something, press submit, see the result.
-	app.Run(iris.Addr(":8080"))
-}
-
-func setupWebsocket(app *iris.Application) {
-	// create our echo websocket server
-	ws := websocket.New(websocket.Config{
-		// These are low-level optionally fields,
-		// user/client can't see those values.
-		ReadBufferSize:  1024,
-		WriteBufferSize: 1024,
-		// only javascript client-side code has the same rule,
-		// which you serve using the ws.ClientSource (see below).
-		EvtMessagePrefix: []byte("my-custom-prefix:"),
-	})
-	ws.OnConnection(handleConnection)
-
-	// register the server on an endpoint.
-	// see the inline javascript code in the websockets.html, this endpoint is used to connect to the server.
-	app.Get("/echo", ws.Handler())
-
-	// serve the javascript builtin client-side library,
-	// see websockets.html script tags, this path is used.
-	app.Any("/iris-ws.js", func(ctx iris.Context) {
-		ctx.Write(ws.ClientSource)
-	})
-}
-
-func handleConnection(c websocket.Connection) {
-	// Read events from browser
-	c.On("chat", func(msg string) {
-		// Print the message to the console, c.Context() is the iris's http context.
-		fmt.Printf("[%s <%s>] %s\n", c.ID(), c.Context().RemoteAddr(), msg)
-		// Write message back to the client message owner with:
-		// c.Emit("chat", msg)
-		// Write message to all except this client with:
-		c.To(websocket.Broadcast).Emit("chat", msg)
-	})
-}
diff --git a/_examples/websocket/chat/websockets.html b/_examples/websocket/chat/websockets.html
deleted file mode 100644
index 3604bfd0..00000000
--- a/_examples/websocket/chat/websockets.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-

-
-
-
-
\ No newline at end of file
diff --git a/_examples/websocket/connectionlist/main.go b/_examples/websocket/connectionlist/main.go
deleted file mode 100644
index ef808f8f..00000000
--- a/_examples/websocket/connectionlist/main.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"sync"
-	"time"
-
-	"github.com/kataras/iris"
-
-	"github.com/kataras/iris/websocket"
-)
-
-type clientPage struct {
-	Title string
-	Host  string
-}
-
-func main() {
-	app := iris.New()
-	app.RegisterView(iris.HTML("./templates", ".html")) // select the html engine to serve templates
-
-	ws := websocket.New(websocket.Config{})
-
-	// register the server on an endpoint.
-	// see the inline javascript code i the websockets.html, this endpoint is used to connect to the server.
-	app.Get("/my_endpoint", ws.Handler())
-
-	// serve the javascript builtin client-side library,
-	// see websockets.html script tags, this path is used.
-	app.Any("/iris-ws.js", func(ctx iris.Context) {
-		ctx.Write(websocket.ClientSource)
-	})
-
-	app.StaticWeb("/js", "./static/js") // serve our custom javascript code
-
-	app.Get("/", func(ctx iris.Context) {
-		ctx.ViewData("", clientPage{"Client Page", "localhost:8080"})
-		ctx.View("client.html")
-	})
-
-	Conn := make(map[websocket.Connection]bool)
-	var myChatRoom = "room1"
-	var mutex = new(sync.Mutex)
-
-	ws.OnConnection(func(c websocket.Connection) {
-		c.Join(myChatRoom)
-		mutex.Lock()
-		Conn[c] = true
-		mutex.Unlock()
-		c.On("chat", func(message string) {
-			if message == "leave" {
-				c.Leave(myChatRoom)
-				c.To(myChatRoom).Emit("chat", "Client with ID: "+c.ID()+" left from the room and cannot send or receive message to/from this room.")
-				c.Emit("chat", "You have left from the room: "+myChatRoom+" you cannot send or receive any messages from others inside that room.")
-				return
-			}
-		})
-		c.OnDisconnect(func() {
-			mutex.Lock()
-			delete(Conn, c)
-			mutex.Unlock()
-			fmt.Printf("\nConnection with ID: %s has been disconnected!\n", c.ID())
-		})
-	})
-
-	var delay = 1 * time.Second
-	go func() {
-		i := 0
-		for {
-			mutex.Lock()
-			broadcast(Conn, fmt.Sprintf("aaaa %d\n", i))
-			mutex.Unlock()
-			time.Sleep(delay)
-			i++
-		}
-	}()
-
-	go func() {
-		i := 0
-		for range time.Tick(1 * time.Second) { //another way to get clock signal
-			mutex.Lock()
-			broadcast(Conn, fmt.Sprintf("aaaa2 %d\n", i))
-			mutex.Unlock()
-			time.Sleep(delay)
-			i++
-		}
-	}()
-
-	app.Run(iris.Addr(":8080"))
-}
-
-func broadcast(Conn map[websocket.Connection]bool, message string) {
-	for k := range Conn {
-		k.To("room1").Emit("chat", message)
-	}
-}
diff --git a/_examples/websocket/connectionlist/static/js/chat.js b/_examples/websocket/connectionlist/static/js/chat.js
deleted file mode 100644
index f9fb8d22..00000000
--- a/_examples/websocket/connectionlist/static/js/chat.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var messageTxt;
-var messages;
-
-$(function () {
-
-	messageTxt = $("#messageTxt");
-	messages = $("#messages");
-
-
-	w = new Ws("ws://" + HOST + "/my_endpoint");
-	w.OnConnect(function () {
-		console.log("Websocket connection established");
-	});
-
-	w.OnDisconnect(function () {
-		appendMessage($("

Disconnected

")); - }); - - w.On("chat", function (message) { - appendMessage($("
" + message + "
")); - }); - - $("#sendBtn").click(function () { - w.Emit("chat", messageTxt.val().toString()); - messageTxt.val(""); - }); - -}) - - -function appendMessage(messageDiv) { - var theDiv = messages[0]; - var doScroll = theDiv.scrollTop == theDiv.scrollHeight - theDiv.clientHeight; - messageDiv.appendTo(messages); - if (doScroll) { - theDiv.scrollTop = theDiv.scrollHeight - theDiv.clientHeight; - } -} diff --git a/_examples/websocket/connectionlist/templates/client.html b/_examples/websocket/connectionlist/templates/client.html deleted file mode 100644 index b957433c..00000000 --- a/_examples/websocket/connectionlist/templates/client.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -{{ .Title}} - - - -
- -
- - - - - - - - - - - diff --git a/_examples/websocket/custom-go-client/main.go b/_examples/websocket/custom-go-client/main.go deleted file mode 100644 index 7dba7e16..00000000 --- a/_examples/websocket/custom-go-client/main.go +++ /dev/null @@ -1,179 +0,0 @@ -package main - -// Run first `go run main.go server` -// and `go run main.go client` as many times as you want. -// Originally written by: github.com/antlaw to describe an old issue. -import ( - "fmt" - "os" - "strings" - "time" - - "github.com/kataras/iris" - "github.com/kataras/iris/websocket" - - xwebsocket "golang.org/x/net/websocket" -) - -// WS is the current websocket connection -var WS *xwebsocket.Conn - -// $ go run main.go server -// $ go run main.go client -func main() { - if len(os.Args) == 2 && strings.ToLower(os.Args[1]) == "server" { - ServerLoop() - } else if len(os.Args) == 2 && strings.ToLower(os.Args[1]) == "client" { - ClientLoop() - } else { - fmt.Println("wsserver [server|client]") - } -} - -///////////////////////////////////////////////////////////////////////// -// client side -func sendUntilErr(sendInterval int) { - i := 1 - for { - time.Sleep(time.Duration(sendInterval) * time.Second) - err := SendMessage("2", "all", "objectupdate", "2.UsrSchedule_v1_1") - if err != nil { - fmt.Println("failed to send join message", err.Error()) - return - } - fmt.Println("objectupdate", i) - i++ - } -} - -func recvUntilErr() { - var msg = make([]byte, 2048) - var n int - var err error - i := 1 - for { - if n, err = WS.Read(msg); err != nil { - fmt.Println(err.Error()) - return - } - fmt.Printf("%v Received: %s.%v\n", time.Now(), string(msg[:n]), i) - i++ - } - -} - -//ConnectWebSocket connect a websocket to host -func ConnectWebSocket() error { - var origin = "http://localhost/" - var url = "ws://localhost:8080/socket" - var err error - WS, err = xwebsocket.Dial(url, "", origin) - return err -} - -// CloseWebSocket closes the current websocket connection -func CloseWebSocket() error { - if WS != nil { - return WS.Close() - } - return nil -} - -// SendMessage broadcast a message to server -func SendMessage(serverID, to, method, message string) error { - buffer := []byte(message) - return SendtBytes(serverID, to, method, buffer) -} - -// SendtBytes broadcast a message to server -func SendtBytes(serverID, to, method string, message []byte) error { - // look https://github.com/kataras/iris/blob/master/websocket/message.go , client.js.go and client.js - // to understand the buffer line: - buffer := []byte(fmt.Sprintf("%s%v;0;%v;%v;", websocket.DefaultEvtMessageKey, method, serverID, to)) - buffer = append(buffer, message...) - _, err := WS.Write(buffer) - if err != nil { - fmt.Println(err) - return err - } - return nil -} - -// ClientLoop connects to websocket server, the keep send and recv dataS -func ClientLoop() { - for { - time.Sleep(time.Second) - err := ConnectWebSocket() - if err != nil { - fmt.Println("failed to connect websocket", err.Error()) - continue - } - // time.Sleep(time.Second) - err = SendMessage("2", "all", "join", "dummy2") - go sendUntilErr(1) - recvUntilErr() - err = CloseWebSocket() - if err != nil { - fmt.Println("failed to close websocket", err.Error()) - } - } - -} - -///////////////////////////////////////////////////////////////////////// -// server side - -// OnConnect handles incoming websocket connection -func OnConnect(c websocket.Connection) { - fmt.Println("socket.OnConnect()") - c.On("join", func(message string) { OnJoin(message, c) }) - c.On("objectupdate", func(message string) { OnObjectUpdated(message, c) }) - // ok works too c.EmitMessage([]byte("dsadsa")) - c.OnDisconnect(func() { OnDisconnect(c) }) - -} - -// ServerLoop listen and serve websocket requests -func ServerLoop() { - app := iris.New() - - ws := websocket.New(websocket.Config{}) - - // register the server on an endpoint. - // see the inline javascript code i the websockets.html, this endpoint is used to connect to the server. - app.Get("/socket", ws.Handler()) - - ws.OnConnection(OnConnect) - app.Run(iris.Addr(":8080")) -} - -// OnJoin handles Join broadcast group request -func OnJoin(message string, c websocket.Connection) { - t := time.Now() - c.Join("server2") - fmt.Println("OnJoin() time taken:", time.Since(t)) -} - -// OnObjectUpdated broadcasts to all client an incoming message -func OnObjectUpdated(message string, c websocket.Connection) { - t := time.Now() - s := strings.Split(message, ";") - if len(s) != 3 { - fmt.Println("OnObjectUpdated() invalid message format:" + message) - return - } - serverID, _, objectID := s[0], s[1], s[2] - err := c.To("server"+serverID).Emit("objectupdate", objectID) - if err != nil { - fmt.Println(err, "failed to broacast object") - return - } - fmt.Println(fmt.Sprintf("OnObjectUpdated() message:%v, time taken: %v", message, time.Since(t))) -} - -// OnDisconnect clean up things when a client is disconnected -func OnDisconnect(c websocket.Connection) { - c.Leave("server2") - fmt.Println("OnDisconnect(): client disconnected!") - -} diff --git a/_examples/websocket/custom-go-client/run.bat b/_examples/websocket/custom-go-client/run.bat deleted file mode 100644 index 3e483188..00000000 --- a/_examples/websocket/custom-go-client/run.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -REM run.bat 30 -start go run main.go server -for /L %%n in (1,1,%1) do start go run main.go client \ No newline at end of file diff --git a/_examples/websocket/go-client/client/main.go b/_examples/websocket/go-client/client/main.go deleted file mode 100644 index 6d3f744d..00000000 --- a/_examples/websocket/go-client/client/main.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "os" - - "github.com/kataras/iris/websocket" -) - -const ( - url = "ws://localhost:8080/socket" - prompt = ">> " -) - -/* -How to run: -Start the server, if it is not already started by executing `go run ../server/main.go` -And open two or more terminal windows and start the clients: -$ go run main.go ->> hi! -*/ -func main() { - c, err := websocket.Dial(nil, url, websocket.ConnectionConfig{}) - if err != nil { - panic(err) - } - - c.OnError(func(err error) { - fmt.Printf("error: %v", err) - }) - - c.OnDisconnect(func() { - fmt.Println("Server was force-closed[see ../server/main.go#L17] this connection after 20 seconds, therefore I am disconnected.") - os.Exit(0) - }) - - c.On("chat", func(message string) { - fmt.Printf("\n%s\n", message) - }) - - fmt.Println("Start by typing a message to send") - scanner := bufio.NewScanner(os.Stdin) - for { - fmt.Print(prompt) - if !scanner.Scan() || scanner.Err() != nil { - break - } - msgToSend := scanner.Text() - if msgToSend == "exit" { - break - } - - c.Emit("chat", msgToSend) - } - - fmt.Println("Terminated.") -} diff --git a/_examples/websocket/go-client/server/main.go b/_examples/websocket/go-client/server/main.go deleted file mode 100644 index 0c6bed81..00000000 --- a/_examples/websocket/go-client/server/main.go +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import ( - "fmt" - "time" - - "github.com/kataras/iris" - "github.com/kataras/iris/websocket" -) - -func main() { - app := iris.New() - ws := websocket.New(websocket.Config{}) - ws.OnConnection(func(c websocket.Connection) { - go func() { - <-time.After(20 * time.Second) - c.Disconnect() - }() - - c.On("chat", func(message string) { - c.To(websocket.Broadcast).Emit("chat", c.ID()+": "+message) - }) - - c.OnDisconnect(func() { - fmt.Printf("Connection with ID: %s has been disconnected!\n", c.ID()) - }) - }) - - app.Get("/socket", ws.Handler()) - - app.Run(iris.Addr(":8080")) -} diff --git a/go.mod b/go.mod index 3199ff89..dc3ca374 100644 --- a/go.mod +++ b/go.mod @@ -1,57 +1,29 @@ module github.com/kataras/iris +go 1.12 + require ( - github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 // indirect github.com/BurntSushi/toml v0.3.1 github.com/Joker/jade v1.0.0 github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 - github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f // indirect github.com/aymerick/raymond v2.0.2+incompatible - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dgraph-io/badger v1.5.4 - github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 // indirect github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 - github.com/etcd-io/bbolt v1.3.0 github.com/fatih/structs v1.1.0 - github.com/flosch/pongo2 v0.0.0-20180809100617-24195e6d38b0 - github.com/gavv/monotime v0.0.0-20171021193802-6f8212e8d10d // indirect - github.com/golang/protobuf v1.2.0 // indirect - github.com/gomodule/redigo v2.0.0+incompatible - github.com/google/go-querystring v1.0.0 // indirect - github.com/gorilla/websocket v1.4.0 - github.com/hashicorp/go-version v1.0.0 - github.com/imkira/go-interpol v1.1.0 // indirect + github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164 github.com/iris-contrib/blackfriday v2.0.0+incompatible github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 github.com/iris-contrib/go.uuid v2.0.0+incompatible - github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce - github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 - github.com/json-iterator/go v1.1.5 - github.com/juju/errors v0.0.0-20181012004132-a4583d0a56ea // indirect + github.com/json-iterator/go v1.1.6 github.com/kataras/golog v0.0.0-20180321173939-03be10146386 + github.com/kataras/neffos v0.0.0-20190602135205-38e9cc9b65c6 github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect - github.com/klauspost/compress v1.4.1 - github.com/klauspost/cpuid v1.2.0 // indirect - github.com/microcosm-cc/bluemonday v1.0.1 - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect - github.com/moul/http2curl v1.0.0 // indirect - github.com/pkg/errors v0.8.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/microcosm-cc/bluemonday v1.0.2 github.com/ryanuber/columnize v2.1.0+incompatible - github.com/sergi/go-diff v1.0.0 // indirect - github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 // indirect - github.com/stretchr/testify v1.2.2 // indirect - github.com/valyala/bytebufferpool v1.0.0 - github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56 // indirect - github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect - github.com/yudai/gojsondiff v1.0.0 // indirect - github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect - golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 - golang.org/x/net v0.0.0-20181114220301-adae6a3d119a // indirect - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect - gopkg.in/ini.v1 v1.39.0 // indirect - gopkg.in/yaml.v2 v2.2.1 + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 + golang.org/x/net v0.0.0-20190522155817-f3200d17e092 // indirect + golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed // indirect + golang.org/x/text v0.3.2 // indirect + golang.org/x/tools v0.0.0-20190602112858-2de7f9bf822c // indirect + gopkg.in/yaml.v2 v2.2.2 ) diff --git a/go.sum b/go.sum index 5c1b1605..50cadf86 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Joker/hpp v0.0.0-20180418125244-6893e659854a/go.mod h1:MzD2WMdSxvbHw5fM/OXOFily/lipJWRc9C1px0Mt0ZE= @@ -6,77 +5,63 @@ github.com/Joker/jade v1.0.0 h1:lOCEPvTAtWfLpSZYMOv/g44MGQFAolbKh2khHHGu0Kc= github.com/Joker/jade v1.0.0/go.mod h1:efZIdO0py/LtcJRSa/j2WEklMSAw84WV0zZVMxNToB8= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.4/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/etcd-io/bbolt v1.3.0/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/flosch/pongo2 v0.0.0-20180809100617-24195e6d38b0 h1:ZHx2BEERvWkuwuE7qWN9TuRxucHDH2JrsvneZjVJfo0= -github.com/flosch/pongo2 v0.0.0-20180809100617-24195e6d38b0/go.mod h1:rE0ErqqBaMcp9pzj8JxV1GcfDBpuypXYxlR1c37AUwg= -github.com/gavv/monotime v0.0.0-20171021193802-6f8212e8d10d/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164 h1:/HMcOGZC5Bi8JPgfbwz13ELWn/91+vY59HXS3z0qY5w= +github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164/go.mod h1:tbAXHifHQWNSpWbiJHpJTZH5fi3XHhDMdP//vuz9WS4= +github.com/go-check/check v1.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.0 h1:1WdyfgUcImUfVBvYbsW2krIsnko+1QU2t45soaF8v1M= +github.com/gobwas/ws v1.0.0/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 h1:7GsNnSLoVceNylMpwcfy5aFNz/S5/TV25crb34I5PEo= github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1/go.mod h1:i8kTYUOEstd/S8TG0ChTXQdf4ermA/e8vJX0+QruD9w= github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce/go.mod h1:VER17o2JZqquOx41avolD/wMGQSFEFBKWmhag9/RQRY= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/juju/errors v0.0.0-20181012004132-a4583d0a56ea h1:g2k+8WR7cHch4g0tBDhfiEvAp7fXxTNBiD1oC1Oxj3E= -github.com/juju/errors v0.0.0-20181012004132-a4583d0a56ea/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/kataras/golog v0.0.0-20180321173939-03be10146386 h1:VT6AeCHO/mc+VedKBMhoqb5eAK8B1i9F6nZl7EGlHvA= github.com/kataras/golog v0.0.0-20180321173939-03be10146386/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= +github.com/kataras/neffos v0.0.0-20190602135205-38e9cc9b65c6 h1:Kt26efzwR6OeuQ9IO8ufl6MjoJRvl0P6/fSnzHrW638= +github.com/kataras/neffos v0.0.0-20190602135205-38e9cc9b65c6/go.mod h1:q/Hkityxm91OTjAXtQDTgaNhIrAe7JcDVDkvqSP+YGE= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d h1:V5Rs9ztEWdp58oayPq/ulmlqJJZeJP6pP79uP3qjcao= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/microcosm-cc/bluemonday v1.0.1 h1:SIYunPjnlXcW+gVfvm0IlSeR5U3WZUOLfVmqg85Go44= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 h1:/vdW8Cb7EXrkqWGufVMES1OH2sU9gKVb2n9/1y5NMBY= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 h1:kkXA53yGe04D0adEYJwEVQjeBppL01Exg+fnMjfUraU= -golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/ini.v1 v1.39.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190602112858-2de7f9bf822c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/websocket/AUTHORS b/websocket/AUTHORS deleted file mode 100644 index 7d08458d..00000000 --- a/websocket/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -# This is the official list of Iris Websocket authors for copyright -# purposes. - -Gerasimos Maropoulos diff --git a/websocket/LICENSE b/websocket/LICENSE deleted file mode 100644 index 1ea6d9b5..00000000 --- a/websocket/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2017-2019 The Iris Websocket Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Iris nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/websocket/client.js b/websocket/client.js deleted file mode 100644 index ff323057..00000000 --- a/websocket/client.js +++ /dev/null @@ -1,208 +0,0 @@ -var websocketStringMessageType = 0; -var websocketIntMessageType = 1; -var websocketBoolMessageType = 2; -var websocketJSONMessageType = 4; -var websocketMessagePrefix = "iris-websocket-message:"; -var websocketMessageSeparator = ";"; -var websocketMessagePrefixLen = websocketMessagePrefix.length; -var websocketMessageSeparatorLen = websocketMessageSeparator.length; -var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; -var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; -var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; -var Ws = (function () { - function Ws(endpoint, protocols) { - var _this = this; - // events listeners - this.connectListeners = []; - this.disconnectListeners = []; - this.nativeMessageListeners = []; - this.messageListeners = {}; - if (!window["WebSocket"]) { - return; - } - if (endpoint.indexOf("ws") == -1) { - endpoint = "ws://" + endpoint; - } - if (protocols != null && protocols.length > 0) { - this.conn = new WebSocket(endpoint, protocols); - } - else { - this.conn = new WebSocket(endpoint); - } - this.conn.onopen = (function (evt) { - _this.fireConnect(); - _this.isReady = true; - return null; - }); - this.conn.onclose = (function (evt) { - _this.fireDisconnect(); - return null; - }); - this.conn.onmessage = (function (evt) { - _this.messageReceivedFromConn(evt); - }); - } - //utils - Ws.prototype.isNumber = function (obj) { - return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; - }; - Ws.prototype.isString = function (obj) { - return Object.prototype.toString.call(obj) == "[object String]"; - }; - Ws.prototype.isBoolean = function (obj) { - return typeof obj === 'boolean' || - (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); - }; - Ws.prototype.isJSON = function (obj) { - return typeof obj === 'object'; - }; - // - // messages - Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { - return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; - }; - Ws.prototype.encodeMessage = function (event, data) { - var m = ""; - var t = 0; - if (this.isNumber(data)) { - t = websocketIntMessageType; - m = data.toString(); - } - else if (this.isBoolean(data)) { - t = websocketBoolMessageType; - m = data.toString(); - } - else if (this.isString(data)) { - t = websocketStringMessageType; - m = data.toString(); - } - else if (this.isJSON(data)) { - //propably json-object - t = websocketJSONMessageType; - m = JSON.stringify(data); - } - else if (data !== null && typeof(data) !== "undefined" ) { - // if it has a second parameter but it's not a type we know, then fire this: - console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); - } - return this._msg(event, t, m); - }; - Ws.prototype.decodeMessage = function (event, websocketMessage) { - //iris-websocket-message;user;4;themarshaledstringfromajsonstruct - var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; - if (websocketMessage.length < skipLen + 1) { - return null; - } - var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); - var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); - if (websocketMessageType == websocketIntMessageType) { - return parseInt(theMessage); - } - else if (websocketMessageType == websocketBoolMessageType) { - return Boolean(theMessage); - } - else if (websocketMessageType == websocketStringMessageType) { - return theMessage; - } - else if (websocketMessageType == websocketJSONMessageType) { - return JSON.parse(theMessage); - } - else { - return null; // invalid - } - }; - Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { - if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { - return ""; - } - var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); - var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); - return evt; - }; - Ws.prototype.getCustomMessage = function (event, websocketMessage) { - var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); - var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); - return s; - }; - // - // Ws Events - // messageReceivedFromConn this is the func which decides - // if it's a native websocket message or a custom qws message - // if native message then calls the fireNativeMessage - // else calls the fireMessage - // - // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. - Ws.prototype.messageReceivedFromConn = function (evt) { - //check if qws message - var message = evt.data; - if (message.indexOf(websocketMessagePrefix) != -1) { - var event_1 = this.getWebsocketCustomEvent(message); - if (event_1 != "") { - // it's a custom message - this.fireMessage(event_1, this.getCustomMessage(event_1, message)); - return; - } - } - // it's a native websocket message - this.fireNativeMessage(message); - }; - Ws.prototype.OnConnect = function (fn) { - if (this.isReady) { - fn(); - } - this.connectListeners.push(fn); - }; - Ws.prototype.fireConnect = function () { - for (var i = 0; i < this.connectListeners.length; i++) { - this.connectListeners[i](); - } - }; - Ws.prototype.OnDisconnect = function (fn) { - this.disconnectListeners.push(fn); - }; - Ws.prototype.fireDisconnect = function () { - for (var i = 0; i < this.disconnectListeners.length; i++) { - this.disconnectListeners[i](); - } - }; - Ws.prototype.OnMessage = function (cb) { - this.nativeMessageListeners.push(cb); - }; - Ws.prototype.fireNativeMessage = function (websocketMessage) { - for (var i = 0; i < this.nativeMessageListeners.length; i++) { - this.nativeMessageListeners[i](websocketMessage); - } - }; - Ws.prototype.On = function (event, cb) { - if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { - this.messageListeners[event] = []; - } - this.messageListeners[event].push(cb); - }; - Ws.prototype.fireMessage = function (event, message) { - for (var key in this.messageListeners) { - if (this.messageListeners.hasOwnProperty(key)) { - if (key == event) { - for (var i = 0; i < this.messageListeners[key].length; i++) { - this.messageListeners[key][i](message); - } - } - } - } - }; - // - // Ws Actions - Ws.prototype.Disconnect = function () { - this.conn.close(); - }; - // EmitMessage sends a native websocket message - Ws.prototype.EmitMessage = function (websocketMessage) { - this.conn.send(websocketMessage); - }; - // Emit sends an iris-custom websocket message - Ws.prototype.Emit = function (event, data) { - var messageStr = this.encodeMessage(event, data); - this.EmitMessage(messageStr); - }; - return Ws; -}()); \ No newline at end of file diff --git a/websocket/client.js.go b/websocket/client.js.go deleted file mode 100644 index 2144411a..00000000 --- a/websocket/client.js.go +++ /dev/null @@ -1,233 +0,0 @@ -package websocket - -import ( - "time" - - "github.com/kataras/iris/context" -) - -// ClientHandler is the handler which serves the javascript client-side -// library. It uses a small cache based on the iris/context.WriteWithExpiration. -func ClientHandler() context.Handler { - modNow := time.Now() - return func(ctx context.Context) { - ctx.ContentType("application/javascript") - if _, err := ctx.WriteWithExpiration(ClientSource, modNow); err != nil { - ctx.StatusCode(500) - ctx.StopExecution() - // ctx.Application().Logger().Infof("error while serving []byte via StaticContent: %s", err.Error()) - } - } -} - -// ClientSource the client-side javascript raw source code. -var ClientSource = []byte(`var websocketStringMessageType = 0; -var websocketIntMessageType = 1; -var websocketBoolMessageType = 2; -var websocketJSONMessageType = 4; -var websocketMessagePrefix = "` + DefaultEvtMessageKey + `"; -var websocketMessageSeparator = ";"; -var websocketMessagePrefixLen = websocketMessagePrefix.length; -var websocketMessageSeparatorLen = websocketMessageSeparator.length; -var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; -var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; -var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; -var Ws = (function () { - // - function Ws(endpoint, protocols) { - var _this = this; - // events listeners - this.connectListeners = []; - this.disconnectListeners = []; - this.nativeMessageListeners = []; - this.messageListeners = {}; - if (!window["WebSocket"]) { - return; - } - if (endpoint.indexOf("ws") == -1) { - endpoint = "ws://" + endpoint; - } - if (protocols != null && protocols.length > 0) { - this.conn = new WebSocket(endpoint, protocols); - } - else { - this.conn = new WebSocket(endpoint); - } - this.conn.onopen = (function (evt) { - _this.fireConnect(); - _this.isReady = true; - return null; - }); - this.conn.onclose = (function (evt) { - _this.fireDisconnect(); - return null; - }); - this.conn.onmessage = (function (evt) { - _this.messageReceivedFromConn(evt); - }); - } - //utils - Ws.prototype.isNumber = function (obj) { - return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; - }; - Ws.prototype.isString = function (obj) { - return Object.prototype.toString.call(obj) == "[object String]"; - }; - Ws.prototype.isBoolean = function (obj) { - return typeof obj === 'boolean' || - (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); - }; - Ws.prototype.isJSON = function (obj) { - return typeof obj === 'object'; - }; - // - // messages - Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { - return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; - }; - Ws.prototype.encodeMessage = function (event, data) { - var m = ""; - var t = 0; - if (this.isNumber(data)) { - t = websocketIntMessageType; - m = data.toString(); - } - else if (this.isBoolean(data)) { - t = websocketBoolMessageType; - m = data.toString(); - } - else if (this.isString(data)) { - t = websocketStringMessageType; - m = data.toString(); - } - else if (this.isJSON(data)) { - //propably json-object - t = websocketJSONMessageType; - m = JSON.stringify(data); - } - else if (data !== null && typeof(data) !== "undefined" ) { - // if it has a second parameter but it's not a type we know, then fire this: - console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); - } - return this._msg(event, t, m); - }; - Ws.prototype.decodeMessage = function (event, websocketMessage) { - //iris-websocket-message;user;4;themarshaledstringfromajsonstruct - var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; - if (websocketMessage.length < skipLen + 1) { - return null; - } - var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); - var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); - if (websocketMessageType == websocketIntMessageType) { - return parseInt(theMessage); - } - else if (websocketMessageType == websocketBoolMessageType) { - return Boolean(theMessage); - } - else if (websocketMessageType == websocketStringMessageType) { - return theMessage; - } - else if (websocketMessageType == websocketJSONMessageType) { - return JSON.parse(theMessage); - } - else { - return null; // invalid - } - }; - Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { - if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { - return ""; - } - var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); - var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); - return evt; - }; - Ws.prototype.getCustomMessage = function (event, websocketMessage) { - var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); - var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); - return s; - }; - // - // Ws Events - // messageReceivedFromConn this is the func which decides - // if it's a native websocket message or a custom qws message - // if native message then calls the fireNativeMessage - // else calls the fireMessage - // - // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. - Ws.prototype.messageReceivedFromConn = function (evt) { - //check if qws message - var message = evt.data; - if (message.indexOf(websocketMessagePrefix) != -1) { - var event_1 = this.getWebsocketCustomEvent(message); - if (event_1 != "") { - // it's a custom message - this.fireMessage(event_1, this.getCustomMessage(event_1, message)); - return; - } - } - // it's a native websocket message - this.fireNativeMessage(message); - }; - Ws.prototype.OnConnect = function (fn) { - if (this.isReady) { - fn(); - } - this.connectListeners.push(fn); - }; - Ws.prototype.fireConnect = function () { - for (var i = 0; i < this.connectListeners.length; i++) { - this.connectListeners[i](); - } - }; - Ws.prototype.OnDisconnect = function (fn) { - this.disconnectListeners.push(fn); - }; - Ws.prototype.fireDisconnect = function () { - for (var i = 0; i < this.disconnectListeners.length; i++) { - this.disconnectListeners[i](); - } - }; - Ws.prototype.OnMessage = function (cb) { - this.nativeMessageListeners.push(cb); - }; - Ws.prototype.fireNativeMessage = function (websocketMessage) { - for (var i = 0; i < this.nativeMessageListeners.length; i++) { - this.nativeMessageListeners[i](websocketMessage); - } - }; - Ws.prototype.On = function (event, cb) { - if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { - this.messageListeners[event] = []; - } - this.messageListeners[event].push(cb); - }; - Ws.prototype.fireMessage = function (event, message) { - for (var key in this.messageListeners) { - if (this.messageListeners.hasOwnProperty(key)) { - if (key == event) { - for (var i = 0; i < this.messageListeners[key].length; i++) { - this.messageListeners[key][i](message); - } - } - } - } - }; - // - // Ws Actions - Ws.prototype.Disconnect = function () { - this.conn.close(); - }; - // EmitMessage sends a native websocket message - Ws.prototype.EmitMessage = function (websocketMessage) { - this.conn.send(websocketMessage); - }; - // Emit sends an iris-custom websocket message - Ws.prototype.Emit = function (event, data) { - var messageStr = this.encodeMessage(event, data); - this.EmitMessage(messageStr); - }; - return Ws; -}()); -`) diff --git a/websocket/client.min.js b/websocket/client.min.js deleted file mode 100644 index 3d930f50..00000000 --- a/websocket/client.min.js +++ /dev/null @@ -1 +0,0 @@ -var websocketStringMessageType=0,websocketIntMessageType=1,websocketBoolMessageType=2,websocketJSONMessageType=4,websocketMessagePrefix="iris-websocket-message:",websocketMessageSeparator=";",websocketMessagePrefixLen=websocketMessagePrefix.length,websocketMessageSeparatorLen=websocketMessageSeparator.length,websocketMessagePrefixAndSepIdx=websocketMessagePrefixLen+websocketMessageSeparatorLen-1,websocketMessagePrefixIdx=websocketMessagePrefixLen-1,websocketMessageSeparatorIdx=websocketMessageSeparatorLen-1,Ws=function(){function e(e,s){var t=this;this.connectListeners=[],this.disconnectListeners=[],this.nativeMessageListeners=[],this.messageListeners={},window.WebSocket&&(-1==e.indexOf("ws")&&(e="ws://"+e),null!=s&&0 void; -type onWebsocketDisconnectFunc = () => void; -type onWebsocketNativeMessageFunc = (websocketMessage: string) => void; -type onMessageFunc = (message: any) => void; - -class Ws { - private conn: WebSocket; - private isReady: boolean; - - // events listeners - - private connectListeners: onConnectFunc[] = []; - private disconnectListeners: onWebsocketDisconnectFunc[] = []; - private nativeMessageListeners: onWebsocketNativeMessageFunc[] = []; - private messageListeners: { [event: string]: onMessageFunc[] } = {}; - - // - - constructor(endpoint: string, protocols?: string[]) { - if (!window["WebSocket"]) { - return; - } - - if (endpoint.indexOf("ws") == -1) { - endpoint = "ws://" + endpoint; - } - if (protocols != null && protocols.length > 0) { - this.conn = new WebSocket(endpoint, protocols); - } else { - this.conn = new WebSocket(endpoint); - } - - this.conn.onopen = ((evt: Event): any => { - this.fireConnect(); - this.isReady = true; - return null; - }); - - this.conn.onclose = ((evt: Event): any => { - this.fireDisconnect(); - return null; - }); - - this.conn.onmessage = ((evt: MessageEvent) => { - this.messageReceivedFromConn(evt); - }); - } - - //utils - - private isNumber(obj: any): boolean { - return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; - } - - private isString(obj: any): boolean { - return Object.prototype.toString.call(obj) == "[object String]"; - } - - private isBoolean(obj: any): boolean { - return typeof obj === 'boolean' || - (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); - } - - private isJSON(obj: any): boolean { - return typeof obj === 'object'; - } - - // - - // messages - private _msg(event: string, websocketMessageType: number, dataMessage: string): string { - - return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; - } - - private encodeMessage(event: string, data: any): string { - let m = ""; - let t = 0; - if (this.isNumber(data)) { - t = websocketIntMessageType; - m = data.toString(); - } else if (this.isBoolean(data)) { - t = websocketBoolMessageType; - m = data.toString(); - } else if (this.isString(data)) { - t = websocketStringMessageType; - m = data.toString(); - } else if (this.isJSON(data)) { - //propably json-object - t = websocketJSONMessageType; - m = JSON.stringify(data); - } else if (data !== null && typeof (data) !== "undefined") { - // if it has a second parameter but it's not a type we know, then fire this: - console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); - } - - return this._msg(event, t, m); - } - - private decodeMessage(event: string, websocketMessage: string): T | any { - //iris-websocket-message;user;4;themarshaledstringfromajsonstruct - let skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; - if (websocketMessage.length < skipLen + 1) { - return null; - } - let websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); - let theMessage = websocketMessage.substring(skipLen, websocketMessage.length); - if (websocketMessageType == websocketIntMessageType) { - return parseInt(theMessage); - } else if (websocketMessageType == websocketBoolMessageType) { - return Boolean(theMessage); - } else if (websocketMessageType == websocketStringMessageType) { - return theMessage; - } else if (websocketMessageType == websocketJSONMessageType) { - return JSON.parse(theMessage); - } else { - return null; // invalid - } - } - - private getWebsocketCustomEvent(websocketMessage: string): string { - if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { - return ""; - } - let s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); - let evt = s.substring(0, s.indexOf(websocketMessageSeparator)); - - return evt; - } - - private getCustomMessage(event: string, websocketMessage: string): string { - let eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); - let s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); - return s; - } - - // - - // Ws Events - - // messageReceivedFromConn this is the func which decides - // if it's a native websocket message or a custom qws message - // if native message then calls the fireNativeMessage - // else calls the fireMessage - // - // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. - private messageReceivedFromConn(evt: MessageEvent): void { - //check if qws message - let message = evt.data; - if (message.indexOf(websocketMessagePrefix) != -1) { - let event = this.getWebsocketCustomEvent(message); - if (event != "") { - // it's a custom message - this.fireMessage(event, this.getCustomMessage(event, message)); - return; - } - } - - // it's a native websocket message - this.fireNativeMessage(message); - } - - OnConnect(fn: onConnectFunc): void { - if (this.isReady) { - fn(); - } - this.connectListeners.push(fn); - } - - fireConnect(): void { - for (let i = 0; i < this.connectListeners.length; i++) { - this.connectListeners[i](); - } - } - - OnDisconnect(fn: onWebsocketDisconnectFunc): void { - this.disconnectListeners.push(fn); - } - - fireDisconnect(): void { - for (let i = 0; i < this.disconnectListeners.length; i++) { - this.disconnectListeners[i](); - } - } - - OnMessage(cb: onWebsocketNativeMessageFunc): void { - this.nativeMessageListeners.push(cb); - } - - fireNativeMessage(websocketMessage: string): void { - for (let i = 0; i < this.nativeMessageListeners.length; i++) { - this.nativeMessageListeners[i](websocketMessage); - } - } - - On(event: string, cb: onMessageFunc): void { - if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { - this.messageListeners[event] = []; - } - this.messageListeners[event].push(cb); - } - - fireMessage(event: string, message: any): void { - for (let key in this.messageListeners) { - if (this.messageListeners.hasOwnProperty(key)) { - if (key == event) { - for (let i = 0; i < this.messageListeners[key].length; i++) { - this.messageListeners[key][i](message); - } - } - } - } - } - - - // - - // Ws Actions - - Disconnect(): void { - this.conn.close(); - } - - // EmitMessage sends a native websocket message - EmitMessage(websocketMessage: string): void { - this.conn.send(websocketMessage); - } - - // Emit sends an iris-custom websocket message - Emit(event: string, data: any): void { - let messageStr = this.encodeMessage(event, data); - this.EmitMessage(messageStr); - } - - // - -} - -// node-modules export {Ws}; diff --git a/websocket/config.go b/websocket/config.go deleted file mode 100644 index 0636ae53..00000000 --- a/websocket/config.go +++ /dev/null @@ -1,159 +0,0 @@ -package websocket - -import ( - "net/http" - "strconv" - "time" - - "github.com/kataras/iris/context" - - "github.com/iris-contrib/go.uuid" -) - -const ( - // DefaultWebsocketWriteTimeout 0, no timeout - DefaultWebsocketWriteTimeout = 0 - // DefaultWebsocketReadTimeout 0, no timeout - DefaultWebsocketReadTimeout = 0 - // DefaultWebsocketPingPeriod is 0 but - // could be 10 * time.Second. - DefaultWebsocketPingPeriod = 0 - // DefaultWebsocketMaxMessageSize 0 - DefaultWebsocketMaxMessageSize = 0 - // DefaultWebsocketReadBufferSize 0 - DefaultWebsocketReadBufferSize = 0 - // DefaultWebsocketWriterBufferSize 0 - DefaultWebsocketWriterBufferSize = 0 - // DefaultEvtMessageKey is the default prefix of the underline websocket events - // that are being established under the hoods. - // - // Defaults to "iris-websocket-message:". - // Last character of the prefix should be ':'. - DefaultEvtMessageKey = "iris-websocket-message:" -) - -var ( - // DefaultIDGenerator returns a random unique string for a new connection. - // Used when config.IDGenerator is nil. - DefaultIDGenerator = func(context.Context) string { - id, err := uuid.NewV4() - if err != nil { - return strconv.FormatInt(time.Now().Unix(), 10) - } - return id.String() - } -) - -// Config contains the websocket server's configuration, optional. -type Config struct { - // IDGenerator used to create (and later on, set) - // an ID for each incoming websocket connections (clients). - // The request is an input parameter which you can use to generate the ID (from headers for example). - // If empty then the ID is generated by DefaultIDGenerator: randomString(64) - IDGenerator func(ctx context.Context) string - // EvtMessagePrefix is the prefix of the underline websocket events that are being established under the hoods. - // This prefix is visible only to the javascript side (code) and it has nothing to do - // with the message that the end-user receives. - // Do not change it unless it is absolutely necessary. - // - // If empty then defaults to []byte("iris-websocket-message:"). - EvtMessagePrefix []byte - // Error is the function that will be fired if any client couldn't upgrade the HTTP connection - // to a websocket connection, a handshake error. - Error func(w http.ResponseWriter, r *http.Request, status int, reason error) - // CheckOrigin a function that is called right before the handshake, - // if returns false then that client is not allowed to connect with the websocket server. - CheckOrigin func(r *http.Request) bool - // HandshakeTimeout specifies the duration for the handshake to complete. - HandshakeTimeout time.Duration - // WriteTimeout time allowed to write a message to the connection. - // 0 means no timeout. - // Default value is 0 - WriteTimeout time.Duration - // ReadTimeout time allowed to read a message from the connection. - // 0 means no timeout. - // Default value is 0 - ReadTimeout time.Duration - // PingPeriod send ping messages to the connection repeatedly after this period. - // The value should be close to the ReadTimeout to avoid issues. - // Default value is 0. - PingPeriod time.Duration - // MaxMessageSize max message size allowed from connection. - // Default value is 1024 - MaxMessageSize int64 - // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text - // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. - // Default value is false - BinaryMessages bool - // ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer - // size is zero, then buffers allocated by the HTTP server are used. The - // I/O buffer sizes do not limit the size of the messages that can be sent - // or received. - // - // Default value is 0. - ReadBufferSize, WriteBufferSize int - // EnableCompression specify if the server should attempt to negotiate per - // message compression (RFC 7692). Setting this value to true does not - // guarantee that compression will be supported. Currently only "no context - // takeover" modes are supported. - // - // Defaults to false and it should be remain as it is, unless special requirements. - EnableCompression bool - - // Subprotocols specifies the server's supported protocols in order of - // preference. If this field is set, then the Upgrade method negotiates a - // subprotocol by selecting the first match in this list with a protocol - // requested by the client. - Subprotocols []string -} - -// Validate validates the configuration -func (c Config) Validate() Config { - // 0 means no timeout. - if c.WriteTimeout < 0 { - c.WriteTimeout = DefaultWebsocketWriteTimeout - } - - if c.ReadTimeout < 0 { - c.ReadTimeout = DefaultWebsocketReadTimeout - } - - if c.PingPeriod <= 0 { - c.PingPeriod = DefaultWebsocketPingPeriod - } - - if c.MaxMessageSize <= 0 { - c.MaxMessageSize = DefaultWebsocketMaxMessageSize - } - - if c.ReadBufferSize <= 0 { - c.ReadBufferSize = DefaultWebsocketReadBufferSize - } - - if c.WriteBufferSize <= 0 { - c.WriteBufferSize = DefaultWebsocketWriterBufferSize - } - - if c.Error == nil { - c.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) { - //empty - } - } - - if c.CheckOrigin == nil { - c.CheckOrigin = func(r *http.Request) bool { - // allow all connections by default - return true - } - } - - if len(c.EvtMessagePrefix) == 0 { - c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) - } - - if c.IDGenerator == nil { - c.IDGenerator = DefaultIDGenerator - } - - return c -} diff --git a/websocket/connection.go b/websocket/connection.go deleted file mode 100644 index ef6ef3a0..00000000 --- a/websocket/connection.go +++ /dev/null @@ -1,689 +0,0 @@ -package websocket - -import ( - "bytes" - stdContext "context" - "errors" - "net" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/gorilla/websocket" - "github.com/kataras/iris/context" -) - -const ( - // TextMessage denotes a text data message. The text message payload is - // interpreted as UTF-8 encoded text data. - TextMessage = websocket.TextMessage - - // BinaryMessage denotes a binary data message. - BinaryMessage = websocket.BinaryMessage - - // CloseMessage denotes a close control message. The optional message - // payload contains a numeric code and text. Use the FormatCloseMessage - // function to format a close message payload. - CloseMessage = websocket.CloseMessage - - // PingMessage denotes a ping control message. The optional message payload - // is UTF-8 encoded text. - PingMessage = websocket.PingMessage - - // PongMessage denotes a ping control message. The optional message payload - // is UTF-8 encoded text. - PongMessage = websocket.PongMessage -) - -type ( - connectionValue struct { - key []byte - value interface{} - } -) - -// ------------------------------------------------------------------------------------- -// ------------------------------------------------------------------------------------- -// -------------------------------Connection implementation----------------------------- -// ------------------------------------------------------------------------------------- -// ------------------------------------------------------------------------------------- - -type ( - // DisconnectFunc is the callback which is fired when a client/connection closed - DisconnectFunc func() - // LeaveRoomFunc is the callback which is fired when a client/connection leaves from any room. - // This is called automatically when client/connection disconnected - // (because websocket server automatically leaves from all joined rooms) - LeaveRoomFunc func(roomName string) - // ErrorFunc is the callback which fires whenever an error occurs - ErrorFunc (func(error)) - // NativeMessageFunc is the callback for native websocket messages, receives one []byte parameter which is the raw client's message - NativeMessageFunc func([]byte) - // MessageFunc is the second argument to the Emitter's Emit functions. - // A callback which should receives one parameter of type string, int, bool or any valid JSON/Go struct - MessageFunc interface{} - // PingFunc is the callback which fires each ping - PingFunc func() - // PongFunc is the callback which fires on pong message received - PongFunc func() - // Connection is the front-end API that you will use to communicate with the client side, - // it is the server-side connection. - Connection interface { - ClientConnection - // Err is not nil if the upgrader failed to upgrade http to websocket connection. - Err() error - // ID returns the connection's identifier - ID() string - // Server returns the websocket server instance - // which this connection is listening to. - // - // Its connection-relative operations are safe for use. - Server() *Server - // Context returns the (upgraded) context.Context of this connection - // avoid using it, you normally don't need it, - // websocket has everything you need to authenticate the user BUT if it's necessary - // then you use it to receive user information, for example: from headers - Context() context.Context - // To defines on what "room" (see Join) the server should send a message - // returns an Emitter(`EmitMessage` & `Emit`) to send messages. - To(string) Emitter - // Join registers this connection to a room, if it doesn't exist then it creates a new. One room can have one or more connections. One connection can be joined to many rooms. All connections are joined to a room specified by their `ID` automatically. - Join(string) - // IsJoined returns true when this connection is joined to the room, otherwise false. - // It Takes the room name as its input parameter. - IsJoined(roomName string) bool - // Leave removes this connection entry from a room - // Returns true if the connection has actually left from the particular room. - Leave(string) bool - // OnLeave registers a callback which fires when this connection left from any joined room. - // This callback is called automatically on Disconnected client, because websocket server automatically - // deletes the disconnected connection from any joined rooms. - // - // Note: the callback(s) called right before the server deletes the connection from the room - // so the connection theoretical can still send messages to its room right before it is being disconnected. - OnLeave(roomLeaveCb LeaveRoomFunc) - } - - // ClientConnection is the client-side connection interface. Server shares some of its methods but the underline actions differs. - ClientConnection interface { - Emitter - // Write writes a raw websocket message with a specific type to the client - // used by ping messages and any CloseMessage types. - Write(websocketMessageType int, data []byte) error - // OnMessage registers a callback which fires when native websocket message received - OnMessage(NativeMessageFunc) - // On registers a callback to a particular event which is fired when a message to this event is received - On(string, MessageFunc) - // OnError registers a callback which fires when this connection occurs an error - OnError(ErrorFunc) - // OnPing registers a callback which fires on each ping - OnPing(PingFunc) - // OnPong registers a callback which fires on pong message received - OnPong(PongFunc) - // FireOnError can be used to send a custom error message to the connection - // - // It does nothing more than firing the OnError listeners. It doesn't send anything to the client. - FireOnError(err error) - // OnDisconnect registers a callback which is fired when this connection is closed by an error or manual - OnDisconnect(DisconnectFunc) - // Disconnect disconnects the client, close the underline websocket conn and removes it from the conn list - // returns the error, if any, from the underline connection - Disconnect() error - // Wait starts the pinger and the messages reader, - // it's named as "Wait" because it should be called LAST, - // after the "On" events IF server's `Upgrade` is used, - // otherwise you don't have to call it because the `Handler()` does it automatically. - Wait() - // UnderlyingConn returns the underline gorilla websocket connection. - UnderlyingConn() *websocket.Conn - } - - connection struct { - err error - underline *websocket.Conn - config ConnectionConfig - defaultMessageType int - serializer *messageSerializer - id string - - onErrorListeners []ErrorFunc - onPingListeners []PingFunc - onPongListeners []PongFunc - onNativeMessageListeners []NativeMessageFunc - onEventListeners map[string][]MessageFunc - onRoomLeaveListeners []LeaveRoomFunc - onDisconnectListeners []DisconnectFunc - disconnected uint32 - - started bool - // these were maden for performance only - self Emitter // pre-defined emitter than sends message to its self client - broadcast Emitter // pre-defined emitter that sends message to all except this - all Emitter // pre-defined emitter which sends message to all clients - - // access to the Context, use with caution, you can't use response writer as you imagine. - ctx context.Context - server *Server - // #119 , websocket writers are not protected by locks inside the gorilla's websocket code - // so we must protect them otherwise we're getting concurrent connection error on multi writers in the same time. - writerMu sync.Mutex - // same exists for reader look here: https://godoc.org/github.com/gorilla/websocket#hdr-Control_Messages - // but we only use one reader in one goroutine, so we are safe. - // readerMu sync.Mutex - } -) - -var _ Connection = &connection{} - -// WrapConnection wraps the underline websocket connection into a new iris websocket connection. -// The caller should call the `connection#Wait` (which blocks) to enable its read and write functionality. -func WrapConnection(underlineConn *websocket.Conn, cfg ConnectionConfig) Connection { - return newConnection(underlineConn, cfg) -} - -func newConnection(underlineConn *websocket.Conn, cfg ConnectionConfig) *connection { - cfg = cfg.Validate() - c := &connection{ - underline: underlineConn, - config: cfg, - serializer: newMessageSerializer(cfg.EvtMessagePrefix), - defaultMessageType: websocket.TextMessage, - onErrorListeners: make([]ErrorFunc, 0), - onPingListeners: make([]PingFunc, 0), - onPongListeners: make([]PongFunc, 0), - onNativeMessageListeners: make([]NativeMessageFunc, 0), - onEventListeners: make(map[string][]MessageFunc, 0), - onDisconnectListeners: make([]DisconnectFunc, 0), - disconnected: 0, - } - - if cfg.BinaryMessages { - c.defaultMessageType = websocket.BinaryMessage - } - - return c -} - -func newServerConnection(ctx context.Context, s *Server, underlineConn *websocket.Conn, id string) *connection { - c := newConnection(underlineConn, ConnectionConfig{ - EvtMessagePrefix: s.config.EvtMessagePrefix, - WriteTimeout: s.config.WriteTimeout, - ReadTimeout: s.config.ReadTimeout, - PingPeriod: s.config.PingPeriod, - MaxMessageSize: s.config.MaxMessageSize, - BinaryMessages: s.config.BinaryMessages, - ReadBufferSize: s.config.ReadBufferSize, - WriteBufferSize: s.config.WriteBufferSize, - EnableCompression: s.config.EnableCompression, - }) - - c.id = id - c.server = s - c.ctx = ctx - c.onRoomLeaveListeners = make([]LeaveRoomFunc, 0) - c.started = false - - c.self = newEmitter(c, c.id) - c.broadcast = newEmitter(c, Broadcast) - c.all = newEmitter(c, All) - - return c -} - -func (c *connection) UnderlyingConn() *websocket.Conn { - return c.underline -} - -// Err is not nil if the upgrader failed to upgrade http to websocket connection. -func (c *connection) Err() error { - return c.err -} - -// Write writes a raw websocket message with a specific type to the client -// used by ping messages and any CloseMessage types. -func (c *connection) Write(websocketMessageType int, data []byte) error { - // for any-case the app tries to write from different goroutines, - // we must protect them because they're reporting that as bug... - c.writerMu.Lock() - if writeTimeout := c.config.WriteTimeout; writeTimeout > 0 { - // set the write deadline based on the configuration - c.underline.SetWriteDeadline(time.Now().Add(writeTimeout)) - } - - // .WriteMessage same as NextWriter and close (flush) - err := c.underline.WriteMessage(websocketMessageType, data) - c.writerMu.Unlock() - if err != nil { - // if failed then the connection is off, fire the disconnect - c.Disconnect() - } - return err -} - -// writeDefault is the same as write but the message type is the configured by c.messageType -// if BinaryMessages is enabled then it's raw []byte as you expected to work with protobufs -func (c *connection) writeDefault(data []byte) error { - return c.Write(c.defaultMessageType, data) -} - -const ( - // WriteWait is 1 second at the internal implementation, - // same as here but this can be changed at the future* - WriteWait = 1 * time.Second -) - -func (c *connection) startPinger() { - - // this is the default internal handler, we just change the writeWait because of the actions we must do before - // the server sends the ping-pong. - - pingHandler := func(message string) error { - err := c.underline.WriteControl(websocket.PongMessage, []byte(message), time.Now().Add(WriteWait)) - if err == websocket.ErrCloseSent { - return nil - } else if e, ok := err.(net.Error); ok && e.Temporary() { - return nil - } - return err - } - - c.underline.SetPingHandler(pingHandler) - - if c.config.PingPeriod > 0 { - go func() { - for { - time.Sleep(c.config.PingPeriod) - if c == nil || atomic.LoadUint32(&c.disconnected) > 0 { - // verifies if already disconnected. - return - } - //fire all OnPing methods - c.fireOnPing() - // try to ping the client, if failed then it disconnects. - err := c.Write(websocket.PingMessage, []byte{}) - if err != nil { - // must stop to exit the loop and exit from the routine. - return - } - } - }() - } -} - -func (c *connection) fireOnPing() { - // fire the onPingListeners - for i := range c.onPingListeners { - c.onPingListeners[i]() - } -} - -func (c *connection) fireOnPong() { - // fire the onPongListeners - for i := range c.onPongListeners { - c.onPongListeners[i]() - } -} - -func (c *connection) startReader() { - conn := c.underline - hasReadTimeout := c.config.ReadTimeout > 0 - - conn.SetReadLimit(c.config.MaxMessageSize) - conn.SetPongHandler(func(s string) error { - if hasReadTimeout { - conn.SetReadDeadline(time.Now().Add(c.config.ReadTimeout)) - } - //fire all OnPong methods - go c.fireOnPong() - - return nil - }) - - defer func() { - c.Disconnect() - }() - - for { - if hasReadTimeout { - // set the read deadline based on the configuration - conn.SetReadDeadline(time.Now().Add(c.config.ReadTimeout)) - } - - _, data, err := conn.ReadMessage() - if err != nil { - if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure, websocket.CloseNormalClosure) { - c.FireOnError(err) - } - return - } - - c.messageReceived(data) - } - -} - -// messageReceived checks the incoming message and fire the nativeMessage listeners or the event listeners (ws custom message) -func (c *connection) messageReceived(data []byte) { - - if bytes.HasPrefix(data, c.config.EvtMessagePrefix) { - //it's a custom ws message - receivedEvt := c.serializer.getWebsocketCustomEvent(data) - listeners, ok := c.onEventListeners[string(receivedEvt)] - if !ok || len(listeners) == 0 { - return // if not listeners for this event exit from here - } - - customMessage, err := c.serializer.deserialize(receivedEvt, data) - if customMessage == nil || err != nil { - return - } - - for i := range listeners { - if fn, ok := listeners[i].(func()); ok { // its a simple func(){} callback - fn() - } else if fnString, ok := listeners[i].(func(string)); ok { - - if msgString, is := customMessage.(string); is { - fnString(msgString) - } else if msgInt, is := customMessage.(int); is { - // here if server side waiting for string but client side sent an int, just convert this int to a string - fnString(strconv.Itoa(msgInt)) - } - - } else if fnInt, ok := listeners[i].(func(int)); ok { - fnInt(customMessage.(int)) - } else if fnBool, ok := listeners[i].(func(bool)); ok { - fnBool(customMessage.(bool)) - } else if fnBytes, ok := listeners[i].(func([]byte)); ok { - fnBytes(customMessage.([]byte)) - } else { - listeners[i].(func(interface{}))(customMessage) - } - - } - } else { - // it's native websocket message - for i := range c.onNativeMessageListeners { - c.onNativeMessageListeners[i](data) - } - } - -} - -func (c *connection) ID() string { - return c.id -} - -func (c *connection) Server() *Server { - return c.server -} - -func (c *connection) Context() context.Context { - return c.ctx -} - -func (c *connection) fireDisconnect() { - for i := range c.onDisconnectListeners { - c.onDisconnectListeners[i]() - } -} - -func (c *connection) OnDisconnect(cb DisconnectFunc) { - c.onDisconnectListeners = append(c.onDisconnectListeners, cb) -} - -func (c *connection) OnError(cb ErrorFunc) { - c.onErrorListeners = append(c.onErrorListeners, cb) -} - -func (c *connection) OnPing(cb PingFunc) { - c.onPingListeners = append(c.onPingListeners, cb) -} - -func (c *connection) OnPong(cb PongFunc) { - c.onPongListeners = append(c.onPongListeners, cb) -} - -func (c *connection) FireOnError(err error) { - for _, cb := range c.onErrorListeners { - cb(err) - } -} - -func (c *connection) To(to string) Emitter { - if to == Broadcast { // if send to all except me, then return the pre-defined emitter, and so on - return c.broadcast - } else if to == All { - return c.all - } else if to == c.id { - return c.self - } - - // is an emitter to another client/connection - return newEmitter(c, to) -} - -func (c *connection) EmitMessage(nativeMessage []byte) error { - if c.server != nil { - return c.self.EmitMessage(nativeMessage) - } - return c.writeDefault(nativeMessage) -} - -func (c *connection) Emit(event string, message interface{}) error { - if c.server != nil { - return c.self.Emit(event, message) - } - - b, err := c.serializer.serialize(event, message) - if err != nil { - return err - } - - return c.EmitMessage(b) -} - -func (c *connection) OnMessage(cb NativeMessageFunc) { - c.onNativeMessageListeners = append(c.onNativeMessageListeners, cb) -} - -func (c *connection) On(event string, cb MessageFunc) { - if c.onEventListeners[event] == nil { - c.onEventListeners[event] = make([]MessageFunc, 0) - } - - c.onEventListeners[event] = append(c.onEventListeners[event], cb) -} - -func (c *connection) Join(roomName string) { - c.server.Join(roomName, c.id) -} - -func (c *connection) IsJoined(roomName string) bool { - return c.server.IsJoined(roomName, c.id) -} - -func (c *connection) Leave(roomName string) bool { - return c.server.Leave(roomName, c.id) -} - -func (c *connection) OnLeave(roomLeaveCb LeaveRoomFunc) { - c.onRoomLeaveListeners = append(c.onRoomLeaveListeners, roomLeaveCb) - // note: the callbacks are called from the server on the '.leave' and '.LeaveAll' funcs. -} - -func (c *connection) fireOnLeave(roomName string) { - // check if connection is already closed - if c == nil { - return - } - // fire the onRoomLeaveListeners - for i := range c.onRoomLeaveListeners { - c.onRoomLeaveListeners[i](roomName) - } -} - -// Wait starts the pinger and the messages reader, -// it's named as "Wait" because it should be called LAST, -// after the "On" events IF server's `Upgrade` is used, -// otherwise you don't have to call it because the `Handler()` does it automatically. -func (c *connection) Wait() { - // if c.server != nil && c.server.config.MaxConcurrentConnections > 0 { - // defer func() { - // go func() { - // c.server.threads <- struct{}{} - // }() - // }() - // } - - if c.started { - return - } - c.started = true - // start the ping - c.startPinger() - - // start the messages reader - c.startReader() -} - -// ErrAlreadyDisconnected can be reported on the `Connection#Disconnect` function whenever the caller tries to close the -// connection when it is already closed by the client or the caller previously. -var ErrAlreadyDisconnected = errors.New("already disconnected") - -func (c *connection) Disconnect() error { - if c == nil || !atomic.CompareAndSwapUint32(&c.disconnected, 0, 1) { - return ErrAlreadyDisconnected - } - - if c.server != nil { - return c.server.Disconnect(c.ID()) - } - - err := c.underline.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) - if err != nil { - err = c.underline.Close() - } - - if err == nil { - c.fireDisconnect() - } - - return err -} - -// ConnectionConfig is the base configuration for both server and client connections. -// Clients must use `ConnectionConfig` in order to `Dial`, server's connection configuration is set by the `Config` structure. -type ConnectionConfig struct { - // EvtMessagePrefix is the prefix of the underline websocket events that are being established under the hoods. - // This prefix is visible only to the javascript side (code) and it has nothing to do - // with the message that the end-user receives. - // Do not change it unless it is absolutely necessary. - // - // If empty then defaults to []byte("iris-websocket-message:"). - // Should match with the server's EvtMessagePrefix. - EvtMessagePrefix []byte - // WriteTimeout time allowed to write a message to the connection. - // 0 means no timeout. - // Default value is 0 - WriteTimeout time.Duration - // ReadTimeout time allowed to read a message from the connection. - // 0 means no timeout. - // Default value is 0 - ReadTimeout time.Duration - // PingPeriod send ping messages to the connection repeatedly after this period. - // The value should be close to the ReadTimeout to avoid issues. - // Default value is 0 - PingPeriod time.Duration - // MaxMessageSize max message size allowed from connection. - // Default value is 0. Unlimited but it is recommended to be 1024 for medium to large messages. - MaxMessageSize int64 - // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text - // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. - // Default value is false - BinaryMessages bool - // ReadBufferSize is the buffer size for the connection reader. - // Default value is 4096 - ReadBufferSize int - // WriteBufferSize is the buffer size for the connection writer. - // Default value is 4096 - WriteBufferSize int - // EnableCompression specify if the server should attempt to negotiate per - // message compression (RFC 7692). Setting this value to true does not - // guarantee that compression will be supported. Currently only "no context - // takeover" modes are supported. - // - // Defaults to false and it should be remain as it is, unless special requirements. - EnableCompression bool -} - -// Validate validates the connection configuration. -func (c ConnectionConfig) Validate() ConnectionConfig { - if len(c.EvtMessagePrefix) == 0 { - c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) - } - - // 0 means no timeout. - if c.WriteTimeout < 0 { - c.WriteTimeout = DefaultWebsocketWriteTimeout - } - - if c.ReadTimeout < 0 { - c.ReadTimeout = DefaultWebsocketReadTimeout - } - - if c.PingPeriod <= 0 { - c.PingPeriod = DefaultWebsocketPingPeriod - } - - if c.MaxMessageSize <= 0 { - c.MaxMessageSize = DefaultWebsocketMaxMessageSize - } - - if c.ReadBufferSize <= 0 { - c.ReadBufferSize = DefaultWebsocketReadBufferSize - } - - if c.WriteBufferSize <= 0 { - c.WriteBufferSize = DefaultWebsocketWriterBufferSize - } - - return c -} - -// ErrBadHandshake is returned when the server response to opening handshake is -// invalid. -var ErrBadHandshake = websocket.ErrBadHandshake - -// Dial creates a new client connection. -// -// The context will be used in the request and in the Dialer. -// -// If the WebSocket handshake fails, `ErrBadHandshake` is returned. -// -// The "url" input parameter is the url to connect to the server, it should be -// the ws:// (or wss:// if secure) + the host + the endpoint of the -// open socket of the server, i.e ws://localhost:8080/my_websocket_endpoint. -// -// Custom dialers can be used by wrapping the iris websocket connection via `websocket.WrapConnection`. -func Dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { - if ctx == nil { - ctx = stdContext.Background() - } - - if !strings.HasPrefix(url, "ws://") && !strings.HasPrefix(url, "wss://") { - url = "ws://" + url - } - - conn, _, err := websocket.DefaultDialer.DialContext(ctx, url, nil) - if err != nil { - return nil, err - } - - clientConn := WrapConnection(conn, cfg) - go clientConn.Wait() - - return clientConn, nil -} diff --git a/websocket/emitter.go b/websocket/emitter.go deleted file mode 100644 index 84d1fa48..00000000 --- a/websocket/emitter.go +++ /dev/null @@ -1,43 +0,0 @@ -package websocket - -const ( - // All is the string which the Emitter use to send a message to all. - All = "" - // Broadcast is the string which the Emitter use to send a message to all except this connection. - Broadcast = ";to;all;except;me;" -) - -type ( - // Emitter is the message/or/event manager - Emitter interface { - // EmitMessage sends a native websocket message - EmitMessage([]byte) error - // Emit sends a message on a particular event - Emit(string, interface{}) error - } - - emitter struct { - conn *connection - to string - } -) - -var _ Emitter = &emitter{} - -func newEmitter(c *connection, to string) *emitter { - return &emitter{conn: c, to: to} -} - -func (e *emitter) EmitMessage(nativeMessage []byte) error { - e.conn.server.emitMessage(e.conn.id, e.to, nativeMessage) - return nil -} - -func (e *emitter) Emit(event string, data interface{}) error { - message, err := e.conn.serializer.serialize(event, data) - if err != nil { - return err - } - e.EmitMessage(message) - return nil -} diff --git a/websocket/message.go b/websocket/message.go deleted file mode 100644 index 6b27fbee..00000000 --- a/websocket/message.go +++ /dev/null @@ -1,182 +0,0 @@ -package websocket - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "strconv" - - "github.com/kataras/iris/core/errors" - "github.com/valyala/bytebufferpool" -) - -type ( - messageType uint8 -) - -func (m messageType) String() string { - return strconv.Itoa(int(m)) -} - -func (m messageType) Name() string { - switch m { - case messageTypeString: - return "string" - case messageTypeInt: - return "int" - case messageTypeBool: - return "bool" - case messageTypeBytes: - return "[]byte" - case messageTypeJSON: - return "json" - default: - return "Invalid(" + m.String() + ")" - } -} - -// The same values are exists on client side too. -const ( - messageTypeString messageType = iota - messageTypeInt - messageTypeBool - messageTypeBytes - messageTypeJSON -) - -const ( - messageSeparator = ";" -) - -var messageSeparatorByte = messageSeparator[0] - -type messageSerializer struct { - prefix []byte - - prefixLen int - separatorLen int - prefixAndSepIdx int - prefixIdx int - separatorIdx int - - buf *bytebufferpool.Pool -} - -func newMessageSerializer(messagePrefix []byte) *messageSerializer { - return &messageSerializer{ - prefix: messagePrefix, - prefixLen: len(messagePrefix), - separatorLen: len(messageSeparator), - prefixAndSepIdx: len(messagePrefix) + len(messageSeparator) - 1, - prefixIdx: len(messagePrefix) - 1, - separatorIdx: len(messageSeparator) - 1, - - buf: new(bytebufferpool.Pool), - } -} - -var ( - boolTrueB = []byte("true") - boolFalseB = []byte("false") -) - -// websocketMessageSerialize serializes a custom websocket message from websocketServer to be delivered to the client -// returns the string form of the message -// Supported data types are: string, int, bool, bytes and JSON. -func (ms *messageSerializer) serialize(event string, data interface{}) ([]byte, error) { - b := ms.buf.Get() - b.Write(ms.prefix) - b.WriteString(event) - b.WriteByte(messageSeparatorByte) - - switch v := data.(type) { - case string: - b.WriteString(messageTypeString.String()) - b.WriteByte(messageSeparatorByte) - b.WriteString(v) - case int: - b.WriteString(messageTypeInt.String()) - b.WriteByte(messageSeparatorByte) - binary.Write(b, binary.LittleEndian, v) - case bool: - b.WriteString(messageTypeBool.String()) - b.WriteByte(messageSeparatorByte) - if v { - b.Write(boolTrueB) - } else { - b.Write(boolFalseB) - } - case []byte: - b.WriteString(messageTypeBytes.String()) - b.WriteByte(messageSeparatorByte) - b.Write(v) - default: - //we suppose is json - res, err := json.Marshal(data) - if err != nil { - ms.buf.Put(b) - return nil, err - } - b.WriteString(messageTypeJSON.String()) - b.WriteByte(messageSeparatorByte) - b.Write(res) - } - - message := b.Bytes() - ms.buf.Put(b) - - return message, nil -} - -var errInvalidTypeMessage = errors.New("Type %s is invalid for message: %s") - -// deserialize deserializes a custom websocket message from the client -// ex: iris-websocket-message;chat;4;themarshaledstringfromajsonstruct will return 'hello' as string -// Supported data types are: string, int, bool, bytes and JSON. -func (ms *messageSerializer) deserialize(event []byte, websocketMessage []byte) (interface{}, error) { - dataStartIdx := ms.prefixAndSepIdx + len(event) + 3 - if len(websocketMessage) <= dataStartIdx { - return nil, errors.New("websocket invalid message: " + string(websocketMessage)) - } - - typ, err := strconv.Atoi(string(websocketMessage[ms.prefixAndSepIdx+len(event)+1 : ms.prefixAndSepIdx+len(event)+2])) // in order to iris-websocket-message;user;-> 4 - if err != nil { - return nil, err - } - - data := websocketMessage[dataStartIdx:] // in order to iris-websocket-message;user;4; -> themarshaledstringfromajsonstruct - - switch messageType(typ) { - case messageTypeString: - return string(data), nil - case messageTypeInt: - msg, err := strconv.Atoi(string(data)) - if err != nil { - return nil, err - } - return msg, nil - case messageTypeBool: - if bytes.Equal(data, boolTrueB) { - return true, nil - } - return false, nil - case messageTypeBytes: - return data, nil - case messageTypeJSON: - var msg interface{} - err := json.Unmarshal(data, &msg) - return msg, err - default: - return nil, errInvalidTypeMessage.Format(messageType(typ).Name(), websocketMessage) - } -} - -// getWebsocketCustomEvent return empty string when the websocketMessage is native message -func (ms *messageSerializer) getWebsocketCustomEvent(websocketMessage []byte) []byte { - if len(websocketMessage) < ms.prefixAndSepIdx { - return nil - } - s := websocketMessage[ms.prefixAndSepIdx:] - evt := s[:bytes.IndexByte(s, messageSeparatorByte)] - return evt -} diff --git a/websocket/server.go b/websocket/server.go deleted file mode 100644 index 6aaaccac..00000000 --- a/websocket/server.go +++ /dev/null @@ -1,395 +0,0 @@ -package websocket - -import ( - "bytes" - "sync" - "sync/atomic" - - "github.com/kataras/iris/context" - - "github.com/gorilla/websocket" -) - -type ( - // ConnectionFunc is the callback which fires when a client/connection is connected to the Server. - // Receives one parameter which is the Connection - ConnectionFunc func(Connection) - - // Server is the websocket Server's implementation. - // - // It listens for websocket clients (either from the javascript client-side or from any websocket implementation). - // See `OnConnection` , to register a single event which will handle all incoming connections and - // the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. - // - // To serve the builtin javascript client-side library look the `websocket.ClientHandler`. - Server struct { - config Config - // ClientSource contains the javascript side code - // for the iris websocket communication - // based on the configuration's `EvtMessagePrefix`. - // - // Use a route to serve this file on a specific path, i.e - // app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(mywebsocketServer.ClientSource) }) - ClientSource []byte - connections sync.Map // key = the Connection ID. - rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name - mu sync.RWMutex // for rooms. - onConnectionListeners []ConnectionFunc - //connectionPool sync.Pool // sadly we can't make this because the websocket connection is live until is closed. - upgrader websocket.Upgrader - } -) - -// New returns a new websocket Server based on a configuration. -// See `OnConnection` , to register a single event which will handle all incoming connections and -// the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. -// -// To serve the builtin javascript client-side library look the `websocket.ClientHandler`. -func New(cfg Config) *Server { - cfg = cfg.Validate() - - s := &Server{ - config: cfg, - ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), - connections: sync.Map{}, // ready-to-use, this is not necessary. - rooms: make(map[string][]string), - onConnectionListeners: make([]ConnectionFunc, 0), - upgrader: websocket.Upgrader{ - HandshakeTimeout: cfg.HandshakeTimeout, - ReadBufferSize: cfg.ReadBufferSize, - WriteBufferSize: cfg.WriteBufferSize, - Error: cfg.Error, - CheckOrigin: cfg.CheckOrigin, - Subprotocols: cfg.Subprotocols, - EnableCompression: cfg.EnableCompression, - }, - } - - return s -} - -// Handler builds the handler based on the configuration and returns it. -// It should be called once per Server, its result should be passed -// as a middleware to an iris route which will be responsible -// to register the websocket's endpoint. -// -// Endpoint is the path which the websocket Server will listen for clients/connections. -// -// To serve the builtin javascript client-side library look the `websocket.ClientHandler`. -func (s *Server) Handler() context.Handler { - return func(ctx context.Context) { - c := s.Upgrade(ctx) - if c.Err() != nil { - return - } - // NOTE TO ME: fire these first BEFORE startReader and startPinger - // in order to set the events and any messages to send - // the startPinger will send the OK to the client and only - // then the client is able to send and receive from Server - // when all things are ready and only then. DO NOT change this order. - - // fire the on connection event callbacks, if any - for i := range s.onConnectionListeners { - s.onConnectionListeners[i](c) - } - - // start the ping and the messages reader - c.Wait() - } -} - -// Upgrade upgrades the HTTP Server connection to the WebSocket protocol. -// -// The responseHeader is included in the response to the client's upgrade -// request. Use the responseHeader to specify cookies (Set-Cookie) and the -// application negotiated subprotocol (Sec--Protocol). -// -// If the upgrade fails, then Upgrade replies to the client with an HTTP error -// response and the return `Connection.Err()` is filled with that error. -// -// For a more high-level function use the `Handler()` and `OnConnection` events. -// This one does not starts the connection's writer and reader, so after your `On/OnMessage` events registration -// the caller has to call the `Connection#Wait` function, otherwise the connection will be not handled. -func (s *Server) Upgrade(ctx context.Context) Connection { - conn, err := s.upgrader.Upgrade(ctx.ResponseWriter(), ctx.Request(), ctx.ResponseWriter().Header()) - if err != nil { - ctx.Application().Logger().Warnf("websocket error: %v\n", err) - // ctx.StatusCode(503) // Status Service Unavailable - return &connection{err: err} - } - - return s.handleConnection(ctx, conn) -} - -func (s *Server) addConnection(c *connection) { - s.connections.Store(c.id, c) -} - -func (s *Server) getConnection(connID string) (*connection, bool) { - if cValue, ok := s.connections.Load(connID); ok { - // this cast is not necessary, - // we know that we always save a connection, but for good or worse let it be here. - if conn, ok := cValue.(*connection); ok { - return conn, ok - } - } - - return nil, false -} - -// wrapConnection wraps an underline connection to an iris websocket connection. -// It does NOT starts its writer, reader and event mux, the caller is responsible for that. -func (s *Server) handleConnection(ctx context.Context, websocketConn *websocket.Conn) *connection { - // use the config's id generator (or the default) to create a websocket client/connection id - cid := s.config.IDGenerator(ctx) - // create the new connection - c := newServerConnection(ctx, s, websocketConn, cid) - // add the connection to the Server's list - s.addConnection(c) - - // join to itself - s.Join(c.id, c.id) - - return c -} - -// OnConnection is the main event you, as developer, will work with each of the websocket connections. -func (s *Server) OnConnection(cb ConnectionFunc) { - s.onConnectionListeners = append(s.onConnectionListeners, cb) -} - -// IsConnected returns true if the connection with that ID is connected to the Server -// useful when you have defined a custom connection id generator (based on a database) -// and you want to check if that connection is already connected (on multiple tabs) -func (s *Server) IsConnected(connID string) bool { - _, found := s.getConnection(connID) - return found -} - -// Join joins a websocket client to a room, -// first parameter is the room name and the second the connection.ID() -// -// You can use connection.Join("room name") instead. -func (s *Server) Join(roomName string, connID string) { - s.mu.Lock() - s.join(roomName, connID) - s.mu.Unlock() -} - -// join used internally, no locks used. -func (s *Server) join(roomName string, connID string) { - if s.rooms[roomName] == nil { - s.rooms[roomName] = make([]string, 0) - } - s.rooms[roomName] = append(s.rooms[roomName], connID) -} - -// IsJoined reports if a specific room has a specific connection into its values. -// First parameter is the room name, second is the connection's id. -// -// It returns true when the "connID" is joined to the "roomName". -func (s *Server) IsJoined(roomName string, connID string) bool { - s.mu.RLock() - room := s.rooms[roomName] - s.mu.RUnlock() - - if room == nil { - return false - } - - for _, connid := range room { - if connID == connid { - return true - } - } - - return false -} - -// LeaveAll kicks out a connection from ALL of its joined rooms -func (s *Server) LeaveAll(connID string) { - s.mu.Lock() - for name := range s.rooms { - s.leave(name, connID) - } - s.mu.Unlock() -} - -// Leave leaves a websocket client from a room, -// first parameter is the room name and the second the connection.ID() -// -// You can use connection.Leave("room name") instead. -// Returns true if the connection has actually left from the particular room. -func (s *Server) Leave(roomName string, connID string) bool { - s.mu.Lock() - left := s.leave(roomName, connID) - s.mu.Unlock() - return left -} - -// leave used internally, no locks used. -func (s *Server) leave(roomName string, connID string) (left bool) { - ///THINK: we could add locks to its room but we still use the lock for the whole rooms or we can just do what we do with connections - // I will think about it on the next revision, so far we use the locks only for rooms so we are ok... - if s.rooms[roomName] != nil { - for i := range s.rooms[roomName] { - if s.rooms[roomName][i] == connID { - s.rooms[roomName] = append(s.rooms[roomName][:i], s.rooms[roomName][i+1:]...) - left = true - break - } - } - if len(s.rooms[roomName]) == 0 { // if room is empty then delete it - delete(s.rooms, roomName) - } - } - - if left { - // fire the on room leave connection's listeners, - // the existence check is not necessary here. - if c, ok := s.getConnection(connID); ok { - c.fireOnLeave(roomName) - } - } - return -} - -// GetTotalConnections returns the number of total connections. -func (s *Server) GetTotalConnections() (n int) { - s.connections.Range(func(k, v interface{}) bool { - n++ - return true - }) - - return n -} - -// GetConnections returns all connections. -func (s *Server) GetConnections() (conns []Connection) { - s.connections.Range(func(k, v interface{}) bool { - conn, ok := v.(*connection) - if !ok { - // if for some reason (should never happen), the value is not stored as *connection - // then stop the iteration and don't continue insertion of the result connections - // in order to avoid any issues while end-dev will try to iterate a nil entry. - return false - } - conns = append(conns, conn) - return true - }) - - return -} - -// GetConnection returns single connection -func (s *Server) GetConnection(connID string) Connection { - conn, ok := s.getConnection(connID) - if !ok { - return nil - } - - return conn -} - -// GetConnectionsByRoom returns a list of Connection -// which are joined to this room. -func (s *Server) GetConnectionsByRoom(roomName string) (conns []Connection) { - if connIDs, found := s.rooms[roomName]; found { - for _, connID := range connIDs { - // existence check is not necessary here. - if cValue, ok := s.connections.Load(connID); ok { - if conn, ok := cValue.(*connection); ok { - conns = append(conns, conn) - } - } - } - } - - return -} - -// emitMessage is the main 'router' of the messages coming from the connection -// this is the main function which writes the RAW websocket messages to the client. -// It sends them(messages) to the correct room (self, broadcast or to specific client) -// -// You don't have to use this generic method, exists only for extreme -// apps which you have an external goroutine with a list of custom connection list. -// -// You SHOULD use connection.EmitMessage/Emit/To().Emit/EmitMessage instead. -// let's keep it unexported for the best. -func (s *Server) emitMessage(from, to string, data []byte) { - if to != All && to != Broadcast { - s.mu.RLock() - room := s.rooms[to] - s.mu.RUnlock() - if room != nil { - // it suppose to send the message to a specific room/or a user inside its own room - for _, connectionIDInsideRoom := range room { - if c, ok := s.getConnection(connectionIDInsideRoom); ok { - c.writeDefault(data) //send the message to the client(s) - } else { - // the connection is not connected but it's inside the room, we remove it on disconnect but for ANY CASE: - cid := connectionIDInsideRoom - if c != nil { - cid = c.id - } - s.Leave(cid, to) - } - } - } - } else { - // it suppose to send the message to all opened connections or to all except the sender. - s.connections.Range(func(k, v interface{}) bool { - connID, ok := k.(string) - if !ok { - // should never happen. - return true - } - - if to != All && to != connID { // if it's not suppose to send to all connections (including itself) - if to == Broadcast && from == connID { // if broadcast to other connections except this - // here we do the opossite of previous block, - // just skip this connection when it's suppose to send the message to all connections except the sender. - return true - } - - } - - // not necessary cast. - conn, ok := v.(*connection) - if ok { - // send to the client(s) when the top validators passed - conn.writeDefault(data) - } - - return ok - }) - } -} - -// Disconnect force-disconnects a websocket connection based on its connection.ID() -// What it does? -// 1. remove the connection from the list -// 2. leave from all joined rooms -// 3. fire the disconnect callbacks, if any -// 4. close the underline connection and return its error, if any. -// -// You can use the connection.Disconnect() instead. -func (s *Server) Disconnect(connID string) (err error) { - // leave from all joined rooms before remove the actual connection from the list. - // note: we cannot use that to send data if the client is actually closed. - s.LeaveAll(connID) - - // remove the connection from the list. - if conn, ok := s.getConnection(connID); ok { - atomic.StoreUint32(&conn.disconnected, 1) - // fire the disconnect callbacks, if any. - conn.fireDisconnect() - // close the underline connection and return its error, if any. - err = conn.underline.Close() - - s.connections.Delete(connID) - } - - return -} diff --git a/websocket/websocket.go b/websocket/websocket.go index fff59634..88cc0199 100644 --- a/websocket/websocket.go +++ b/websocket/websocket.go @@ -1,69 +1,107 @@ -/*Package websocket provides rich websocket support for the iris web framework. - -Source code and other details for the project are available at GitHub: - - https://github.com/kataras/iris/tree/master/websocket - -Example code: - - - package main - - import ( - "fmt" - - "github.com/kataras/iris" - "github.com/kataras/iris/context" - - "github.com/kataras/iris/websocket" - ) - - func main() { - app := iris.New() - - app.Get("/", func(ctx context.Context) { - ctx.ServeFile("websockets.html", false) - }) - - setupWebsocket(app) - - // x2 - // http://localhost:8080 - // http://localhost:8080 - // write something, press submit, see the result. - app.Run(iris.Addr(":8080")) - } - - func setupWebsocket(app *iris.Application) { - // create our echo websocket server - ws := websocket.New(websocket.Config{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, - }) - ws.OnConnection(handleConnection) - - // register the server's endpoint. - // see the inline javascript code in the websockets.html, - // this endpoint is used to connect to the server. - app.Get("/echo", ws.Handler()) - - // serve the javascript builtin client-side library, - // see websockets.html script tags, this path is used. - app.Any("/iris-ws.js", func(ctx context.Context) { - ctx.Write(websocket.ClientSource) - }) - } - - func handleConnection(c websocket.Connection) { - // Read events from browser - c.On("chat", func(msg string) { - // Print the message to the console - fmt.Printf("%s sent: %s\n", c.Context().RemoteAddr(), msg) - // Write message back to the client message owner: - // c.Emit("chat", msg) - c.To(websocket.Broadcast).Emit("chat", msg) - }) - } - -*/ package websocket + +import ( + "github.com/kataras/iris/context" + + "github.com/kataras/neffos" + "github.com/kataras/neffos/gobwas" + "github.com/kataras/neffos/gorilla" +) + +var ( + // GorillaUpgrader is an upgrader type for the gorilla/websocket subprotocol implementation. + // Should be used on `New` to construct the websocket server. + GorillaUpgrader = gorilla.Upgrader + // GobwasUpgrader is an upgrader type for the gobwas/ws subprotocol implementation. + // Should be used on `New` to construct the websocket server. + GobwasUpgrader = gobwas.Upgrader + // DefaultGorillaUpgrader is a gorilla/websocket Upgrader with all fields set to the default values. + DefaultGorillaUpgrader = gorilla.DefaultUpgrader + // DefaultGobwasUpgrader is a gobwas/ws Upgrader with all fields set to the default values. + DefaultGobwasUpgrader = gobwas.DefaultUpgrader + // New constructs and returns a new websocket server. + // Listens to incoming connections automatically, no further action is required from the caller. + // The second parameter is the "connHandler", it can be + // filled as `Namespaces`, `Events` or `WithTimeout`, same namespaces and events can be used on the client-side as well, + // Use the `Conn#IsClient` on any event callback to determinate if it's a client-side connection or a server-side one. + // + // See examples for more. + New = neffos.New + + // GorillaDialer is a gorilla/websocket dialer with all fields set to the default values. + GorillaDialer = gorilla.DefaultDialer + // GobwasDialer is a gobwas/ws dialer with all fields set to the default values. + GobwasDialer = gobwas.DefaultDialer + // Dial establishes a new websocket client connection. + // Context "ctx" is used for handshake timeout. + // Dialer "dial" can be either `GorillaDialer` or `GobwasDialer`, + // custom dialers can be used as well when complete the `Socket` and `Dialer` interfaces for valid client. + // URL "url" is the endpoint of the websocket server, i.e "ws://localhost:8080/echo". + // The last parameter, and the most important one is the "connHandler", it can be + // filled as `Namespaces`, `Events` or `WithTimeout`, same namespaces and events can be used on the server-side as well. + // + // See examples for more. + Dial = neffos.Dial + + // OnNamespaceConnect is the event name which its callback is fired right before namespace connect, + // if non-nil error then the remote connection's `Conn.Connect` will fail and send that error text. + // Connection is not ready to emit data to the namespace. + OnNamespaceConnect = neffos.OnNamespaceConnect + // OnNamespaceConnected is the event name which its callback is fired after namespace successfully connected. + // Connection is ready to emit data back to the namespace. + OnNamespaceConnected = neffos.OnNamespaceConnected + // OnNamespaceDisconnect is the event name which its callback is fired when + // remote namespace disconnection or local namespace disconnection is happening. + // For server-side connections the reply matters, so if error returned then the client-side cannot disconnect yet, + // for client-side the return value does not matter. + OnNamespaceDisconnect = neffos.OnNamespaceDisconnect // if allowed to connect then it's allowed to disconnect as well. + // OnRoomJoin is the event name which its callback is fired right before room join. + OnRoomJoin = neffos.OnRoomJoin // able to check if allowed to join. + // OnRoomJoined is the event name which its callback is fired after the connection has successfully joined to a room. + OnRoomJoined = neffos.OnRoomJoined // able to broadcast messages to room. + // OnRoomLeave is the event name which its callback is fired right before room leave. + OnRoomLeave = neffos.OnRoomLeave // able to broadcast bye-bye messages to room. + // OnRoomLeft is the event name which its callback is fired after the connection has successfully left from a room. + OnRoomLeft = neffos.OnRoomLeft // if allowed to join to a room, then its allowed to leave from it. + // OnAnyEvent is the event name which its callback is fired when incoming message's event is not declared to the ConnHandler(`Events` or `Namespaces`). + OnAnyEvent = neffos.OnAnyEvent // when event no match. + // OnNativeMessage is fired on incoming native/raw websocket messages. + // If this event defined then an incoming message can pass the check (it's an invalid message format) + // with just the Message's Body filled, the Event is "OnNativeMessage" and IsNative always true. + // This event should be defined under an empty namespace in order this to work. + OnNativeMessage = neffos.OnNativeMessage + + // IsSystemEvent reports whether the "event" is a system event, + // OnNamespaceConnect, OnNamespaceConnected, OnNamespaceDisconnect, + // OnRoomJoin, OnRoomJoined, OnRoomLeave and OnRoomLeft. + IsSystemEvent = neffos.IsSystemEvent + // Reply is a special type of custom error which sends a message back to the other side + // with the exact same incoming Message's Namespace (and Room if specified) + // except its body which would be the given "body". + Reply = neffos.Reply +) + +// Handler returns an Iris handler to be served in a route of an Iris application. +func Handler(s *neffos.Server) context.Handler { + return func(ctx context.Context) { + s.Upgrade(ctx.ResponseWriter(), ctx.Request(), func(socket neffos.Socket) neffos.Socket { + return &socketWrapper{ + Socket: socket, + ctx: ctx, + } + }) + } +} + +type socketWrapper struct { + neffos.Socket + ctx context.Context +} + +// GetContext returns the Iris Context from a websocket connection. +func GetContext(c *neffos.Conn) context.Context { + if sw, ok := c.Socket().(*socketWrapper); ok { + return sw.ctx + } + return nil +} diff --git a/websocket/websocket_go19.go b/websocket/websocket_go19.go new file mode 100644 index 00000000..34d4802c --- /dev/null +++ b/websocket/websocket_go19.go @@ -0,0 +1,63 @@ +// +build go1.9 + +package websocket + +import ( + "github.com/kataras/neffos" +) + +type ( + // Conn describes the main websocket connection's functionality. + // Its `Connection` will return a new `NSConn` instance. + // Each connection can connect to one or more declared namespaces. + // Each `NSConn` can join to multiple rooms. + Conn = neffos.Conn + // NSConn describes a connected connection to a specific namespace, + // it emits with the `Message.Namespace` filled and it can join to multiple rooms. + // A single `Conn` can be connected to one or more namespaces, + // each connected namespace is described by this structure. + NSConn = neffos.NSConn + // Room describes a connected connection to a room, + // emits messages with the `Message.Room` filled to the specific room + // and `Message.Namespace` to the underline `NSConn`'s namespace. + Room = neffos.Room + // CloseError can be used to send and close a remote connection in the event callback's return statement. + CloseError = neffos.CloseError + + // MessageHandlerFunc is the definition type of the events' callback. + // Its error can be written to the other side on specific events, + // i.e on `OnNamespaceConnect` it will abort a remote namespace connection. + // See examples for more. + MessageHandlerFunc = neffos.MessageHandlerFunc + + // Events completes the `ConnHandler` interface. + // It is a map which its key is the event name + // and its value the event's callback. + // + // Events type completes the `ConnHandler` itself therefore, + // can be used as standalone value on the `New` and `Dial` functions + // to register events on empty namespace as well. + // + // See `Namespaces`, `New` and `Dial` too. + Events = neffos.Events + // Namespaces completes the `ConnHandler` interface. + // Can be used to register one or more namespaces on the `New` and `Dial` functions. + // The key is the namespace literal and the value is the `Events`, + // a map with event names and their callbacks. + // + // See `WithTimeout`, `New` and `Dial` too. + Namespaces = neffos.Namespaces + // WithTimeout completes the `ConnHandler` interface. + // Can be used to register namespaces and events or just events on an empty namespace + // with Read and Write timeouts. + // + // See `New` and `Dial`. + WithTimeout = neffos.WithTimeout + // The Message is the structure which describes the incoming and outcoming data. + // Emitter's "body" argument is the `Message.Body` field. + // Emitter's return non-nil error is the `Message.Err` field. + // If native message sent then the `Message.Body` is filled with the body and + // when incoming native message then the `Message.Event` is the `OnNativeMessage`, + // native messages are allowed only when an empty namespace("") and its `OnNativeMessage` callback are present. + Message = neffos.Message +) From 2495be17f650cdc7758e1d35669c337894afbc96 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 2 Jun 2019 18:27:51 +0300 Subject: [PATCH 028/418] add example line on how to get the upgraded conn's `iris.Context` with `websocket.GetContext`. Former-commit-id: 7d9cae97e2736d59dccb60c13b0cc5b6ca36a9fd --- _examples/websocket/basic/server.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/_examples/websocket/basic/server.go b/_examples/websocket/basic/server.go index 9c462dac..4b7508a6 100644 --- a/_examples/websocket/basic/server.go +++ b/_examples/websocket/basic/server.go @@ -12,21 +12,26 @@ const namespace = "default" // if namespace is empty then simply websocket.Events{...} can be used instead. var serverEvents = websocket.Namespaces{ namespace: websocket.Events{ - websocket.OnNamespaceConnected: func(c *websocket.NSConn, msg websocket.Message) error { - log.Printf("[%s] connected to namespace [%s]", c, msg.Namespace) + websocket.OnNamespaceConnected: func(nsConn *websocket.NSConn, msg websocket.Message) error { + log.Printf("[%s] connected to namespace [%s] with IP [%s]", + nsConn, msg.Namespace, + // with `GetContext` you can retrieve the Iris' `Context`, alternatively + // you can use the `nsConn.Conn.Socket().Request()` to get the raw `*http.Request`. + websocket.GetContext(nsConn.Conn).RemoteAddr()) return nil }, - websocket.OnNamespaceDisconnect: func(c *websocket.NSConn, msg websocket.Message) error { - log.Printf("[%s] disconnected from namespace [%s]", c, msg.Namespace) + websocket.OnNamespaceDisconnect: func(nsConn *websocket.NSConn, msg websocket.Message) error { + log.Printf("[%s] disconnected from namespace [%s]", nsConn, msg.Namespace) return nil }, - "chat": func(c *websocket.NSConn, msg websocket.Message) error { - log.Printf("[%s] sent: %s", c.Conn.ID(), string(msg.Body)) + "chat": func(nsConn *websocket.NSConn, msg websocket.Message) error { + // room.String() returns -> NSConn.String() returns -> Conn.String() returns -> Conn.ID() + log.Printf("[%s] sent: %s", nsConn, string(msg.Body)) // Write message back to the client message owner with: - // c.Emit("chat", msg) + // nsConn.Emit("chat", msg) // Write message to all except this client with: - c.Conn.Server().Broadcast(c, msg) + nsConn.Conn.Server().Broadcast(nsConn, msg) return nil }, }, From 162c1b9cfec4b8909c30527f57c32c744e5bcf78 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 2 Jun 2019 18:29:22 +0300 Subject: [PATCH 029/418] add go1.12 to the travis builds (there are 4 tested versions, and this delays the result - we may just use go1.12 in the future Former-commit-id: a57466a1b29d324dda045bb69de9e79b60e42c5b --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index a1912a50..3c42b19e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ go: - 1.9.x - 1.10.x - 1.11.x + - 1.12.x go_import_path: github.com/kataras/iris # we disable test caching via GOCACHE=off # env: From e19a519c6e97b90a71b7fa4498b1bfb190d58951 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Mon, 3 Jun 2019 12:06:18 +0300 Subject: [PATCH 030/418] add `neffos.Object` based on the latest neffos API and update the go.mod for neffos Former-commit-id: 47836caf61d3c951f1599714a4310bbdef1c87b7 --- go.mod | 2 +- go.sum | 10 +++------- websocket/websocket.go | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index dc3ca374..9ac9c9f6 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/iris-contrib/go.uuid v2.0.0+incompatible github.com/json-iterator/go v1.1.6 github.com/kataras/golog v0.0.0-20180321173939-03be10146386 - github.com/kataras/neffos v0.0.0-20190602135205-38e9cc9b65c6 + github.com/kataras/neffos v0.0.0-20190603085547-9fba63259400 github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect github.com/microcosm-cc/bluemonday v1.0.2 github.com/ryanuber/columnize v2.1.0+incompatible diff --git a/go.sum b/go.sum index 50cadf86..cd8e9fa3 100644 --- a/go.sum +++ b/go.sum @@ -13,13 +13,9 @@ github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164 h1:/HMcOGZC5Bi8JPgfbwz13ELWn/91+vY59HXS3z0qY5w= github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164/go.mod h1:tbAXHifHQWNSpWbiJHpJTZH5fi3XHhDMdP//vuz9WS4= -github.com/go-check/check v1.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.0 h1:1WdyfgUcImUfVBvYbsW2krIsnko+1QU2t45soaF8v1M= -github.com/gobwas/ws v1.0.0/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.0.1/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= @@ -32,8 +28,8 @@ github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwK github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/kataras/golog v0.0.0-20180321173939-03be10146386 h1:VT6AeCHO/mc+VedKBMhoqb5eAK8B1i9F6nZl7EGlHvA= github.com/kataras/golog v0.0.0-20180321173939-03be10146386/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= -github.com/kataras/neffos v0.0.0-20190602135205-38e9cc9b65c6 h1:Kt26efzwR6OeuQ9IO8ufl6MjoJRvl0P6/fSnzHrW638= -github.com/kataras/neffos v0.0.0-20190602135205-38e9cc9b65c6/go.mod h1:q/Hkityxm91OTjAXtQDTgaNhIrAe7JcDVDkvqSP+YGE= +github.com/kataras/neffos v0.0.0-20190603085547-9fba63259400 h1:4Vmw9gER3G+QRYFP9Kt8KK01kwVfAE+EoXgiuCzn4oI= +github.com/kataras/neffos v0.0.0-20190603085547-9fba63259400/go.mod h1:XfxmcgJUtbPmzK9wPLE7ybFHXoCqZKGptaW1frrxFhw= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d h1:V5Rs9ztEWdp58oayPq/ulmlqJJZeJP6pP79uP3qjcao= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= diff --git a/websocket/websocket.go b/websocket/websocket.go index 88cc0199..7d22a1cf 100644 --- a/websocket/websocket.go +++ b/websocket/websocket.go @@ -79,8 +79,25 @@ var ( // with the exact same incoming Message's Namespace (and Room if specified) // except its body which would be the given "body". Reply = neffos.Reply + // Object marshals the "v" value and returns a Message's Body. + // The "v" serialized value can be customized by implementing a `Marshal() ([]byte, error) ` method, + // otherwise the default one will be used instead ( see `SetDefaultMarshaler` and `SetDefaultUnmarshaler`). + // Errors are pushed to the result, use the object's Marshal method to catch those when necessary. + Object = neffos.Object ) +// SetDefaultMarshaler changes the default json marshaler. +// See `Object` package-level function and `Message.Object` method for more. +func SetDefaultMarshaler(fn func(v interface{}) ([]byte, error)) { + neffos.DefaultMarshaler = fn +} + +// SetDefaultUnmarshaler changes the default json unmarshaler. +// See `Object` package-level function and `Message.Object` method for more. +func SetDefaultUnmarshaler(fn func(data []byte, v interface{}) error) { + neffos.DefaultUnmarshaler = fn +} + // Handler returns an Iris handler to be served in a route of an Iris application. func Handler(s *neffos.Server) context.Handler { return func(ctx context.Context) { From e10fada695d36807347bc1aa0e9c30f61eefbaff Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Thu, 6 Jun 2019 23:05:17 +0300 Subject: [PATCH 031/418] updates for neffos and re-push the fix of the request path with uri unescaped codes Former-commit-id: fda1edb3e8dfc538da541070366f5f8f997bf367 --- context/context.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- websocket/websocket.go | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/context/context.go b/context/context.go index 46badde5..898fbf79 100644 --- a/context/context.go +++ b/context/context.go @@ -1473,7 +1473,7 @@ func DecodeURL(uri string) string { // based on the 'escape'. func (ctx *context) RequestPath(escape bool) string { if escape { - return DecodeQuery(ctx.request.URL.EscapedPath()) + return ctx.request.URL.EscapedPath() // DecodeQuery(ctx.request.URL.EscapedPath()) } return ctx.request.URL.Path // RawPath returns empty, requesturi can be used instead also. } diff --git a/go.mod b/go.mod index 9ac9c9f6..37d70dea 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/iris-contrib/go.uuid v2.0.0+incompatible github.com/json-iterator/go v1.1.6 github.com/kataras/golog v0.0.0-20180321173939-03be10146386 - github.com/kataras/neffos v0.0.0-20190603085547-9fba63259400 + github.com/kataras/neffos v0.0.0-20190606200227-c8dd500b4cdf github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect github.com/microcosm-cc/bluemonday v1.0.2 github.com/ryanuber/columnize v2.1.0+incompatible diff --git a/go.sum b/go.sum index cd8e9fa3..53c6e2db 100644 --- a/go.sum +++ b/go.sum @@ -28,8 +28,8 @@ github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwK github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/kataras/golog v0.0.0-20180321173939-03be10146386 h1:VT6AeCHO/mc+VedKBMhoqb5eAK8B1i9F6nZl7EGlHvA= github.com/kataras/golog v0.0.0-20180321173939-03be10146386/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= -github.com/kataras/neffos v0.0.0-20190603085547-9fba63259400 h1:4Vmw9gER3G+QRYFP9Kt8KK01kwVfAE+EoXgiuCzn4oI= -github.com/kataras/neffos v0.0.0-20190603085547-9fba63259400/go.mod h1:XfxmcgJUtbPmzK9wPLE7ybFHXoCqZKGptaW1frrxFhw= +github.com/kataras/neffos v0.0.0-20190606200227-c8dd500b4cdf h1:rHFU6nupBNP5RejMwghFnhjUoOFXAYxmE07s4f5aeXQ= +github.com/kataras/neffos v0.0.0-20190606200227-c8dd500b4cdf/go.mod h1:XfxmcgJUtbPmzK9wPLE7ybFHXoCqZKGptaW1frrxFhw= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d h1:V5Rs9ztEWdp58oayPq/ulmlqJJZeJP6pP79uP3qjcao= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= diff --git a/websocket/websocket.go b/websocket/websocket.go index 7d22a1cf..5b097cce 100644 --- a/websocket/websocket.go +++ b/websocket/websocket.go @@ -79,21 +79,21 @@ var ( // with the exact same incoming Message's Namespace (and Room if specified) // except its body which would be the given "body". Reply = neffos.Reply - // Object marshals the "v" value and returns a Message's Body. - // The "v" serialized value can be customized by implementing a `Marshal() ([]byte, error) ` method, + // Marshal marshals the "v" value and returns a Message's Body. + // The "v" value's serialized value can be customized by implementing a `Marshal() ([]byte, error) ` method, // otherwise the default one will be used instead ( see `SetDefaultMarshaler` and `SetDefaultUnmarshaler`). // Errors are pushed to the result, use the object's Marshal method to catch those when necessary. - Object = neffos.Object + Marshal = neffos.Marshal ) // SetDefaultMarshaler changes the default json marshaler. -// See `Object` package-level function and `Message.Object` method for more. +// See `Marshal` package-level function and `Message.Unmarshal` method for more. func SetDefaultMarshaler(fn func(v interface{}) ([]byte, error)) { neffos.DefaultMarshaler = fn } // SetDefaultUnmarshaler changes the default json unmarshaler. -// See `Object` package-level function and `Message.Object` method for more. +// See `Message.Unmarshal` method and package-level `Marshal` function for more. func SetDefaultUnmarshaler(fn func(data []byte, v interface{}) error) { neffos.DefaultUnmarshaler = fn } From af751c760231385f40e072beb6cf62c3161b08fe Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Thu, 6 Jun 2019 23:06:41 +0300 Subject: [PATCH 032/418] fix https://github.com/kataras/iris/issues/1271#issuecomment-499642546 Former-commit-id: 30043802c9eadcb4b378e773ca79f8e33bd5d573 --- context/context.go | 2 +- go.mod | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/context/context.go b/context/context.go index f437e447..46f0d6ac 100644 --- a/context/context.go +++ b/context/context.go @@ -1439,7 +1439,7 @@ func DecodeURL(uri string) string { // based on the 'escape'. func (ctx *context) RequestPath(escape bool) string { if escape { - return DecodeQuery(ctx.request.URL.EscapedPath()) + return ctx.request.URL.EscapedPath() // DecodeQuery(ctx.request.URL.EscapedPath()) } return ctx.request.URL.Path // RawPath returns empty, requesturi can be used instead also. } diff --git a/go.mod b/go.mod index a78a5582..3199ff89 100644 --- a/go.mod +++ b/go.mod @@ -22,13 +22,13 @@ require ( github.com/hashicorp/go-version v1.0.0 github.com/imkira/go-interpol v1.1.0 // indirect github.com/iris-contrib/blackfriday v2.0.0+incompatible - github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 // indirect + github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 github.com/iris-contrib/go.uuid v2.0.0+incompatible github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 github.com/json-iterator/go v1.1.5 github.com/juju/errors v0.0.0-20181012004132-a4583d0a56ea // indirect - github.com/kataras/golog v0.0.0-20180321173939-03be10146386 // indirect + github.com/kataras/golog v0.0.0-20180321173939-03be10146386 github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect github.com/klauspost/compress v1.4.1 github.com/klauspost/cpuid v1.2.0 // indirect From 9c92952a40df3ec0b2c5c30949069da9b71fc061 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Fri, 7 Jun 2019 20:45:00 +0300 Subject: [PATCH 033/418] remove the 3rd party socket io example because its API has a breaking-change now and some features are not reproducable to that Former-commit-id: 8d89947be6a3ee6942d596c15f346c3ed6cf6728 --- _examples/README.md | 1 - _examples/README_ZH.md | 1 - .../websocket/third-party-socketio/main.go | 44 - .../third-party-socketio/public/index.html | 38 - .../public/jquery-1.11.1.js | 10309 ---------------- .../public/socket.io-1.3.7.js | 3 - 6 files changed, 10396 deletions(-) delete mode 100644 _examples/websocket/third-party-socketio/main.go delete mode 100644 _examples/websocket/third-party-socketio/public/index.html delete mode 100644 _examples/websocket/third-party-socketio/public/jquery-1.11.1.js delete mode 100644 _examples/websocket/third-party-socketio/public/socket.io-1.3.7.js diff --git a/_examples/README.md b/_examples/README.md index 38a3faa2..7288b914 100644 --- a/_examples/README.md +++ b/_examples/README.md @@ -482,7 +482,6 @@ The package is designed to work with raw websockets although its API is similar - [Connection List](websocket/connectionlist/main.go) - [TLS Enabled](websocket/secure/main.go) - [Custom Raw Go Client](websocket/custom-go-client/main.go) -- [Third-Party socket.io](websocket/third-party-socketio/main.go) > You're free to use your own favourite websockets package if you'd like so. diff --git a/_examples/README_ZH.md b/_examples/README_ZH.md index 53e2a755..19fe6ecf 100644 --- a/_examples/README_ZH.md +++ b/_examples/README_ZH.md @@ -435,7 +435,6 @@ iris websocket库依赖于它自己的[包](https://github.com/kataras/iris/tree - [连接列表](websocket/connectionlist/main.go) - [TLS支持](websocket/secure/main.go) - [自定义原始Go客户端](websocket/custom-go-client/main.go) -- [第三方socket.io](websocket/third-party-socketio/main.go) > 如果你愿意,你可以自由使用你自己喜欢的websockets包。 diff --git a/_examples/websocket/third-party-socketio/main.go b/_examples/websocket/third-party-socketio/main.go deleted file mode 100644 index c2a762e7..00000000 --- a/_examples/websocket/third-party-socketio/main.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "github.com/kataras/iris" - - "github.com/googollee/go-socket.io" -) - -/* - go get -u github.com/googollee/go-socket.io -*/ - -func main() { - app := iris.New() - server, err := socketio.NewServer(nil) - if err != nil { - app.Logger().Fatal(err) - } - - server.On("connection", func(so socketio.Socket) { - app.Logger().Infof("on connection") - so.Join("chat") - so.On("chat message", func(msg string) { - app.Logger().Infof("emit: %v", so.Emit("chat message", msg)) - so.BroadcastTo("chat", "chat message", msg) - }) - so.On("disconnection", func() { - app.Logger().Infof("on disconnect") - }) - }) - - server.On("error", func(so socketio.Socket, err error) { - app.Logger().Errorf("error: %v", err) - }) - - // serve the socket.io endpoint. - app.Any("/socket.io/{p:path}", iris.FromStd(server)) - - // serve the index.html and the javascript libraries at - // http://localhost:8080 - app.StaticWeb("/", "./public") - - app.Run(iris.Addr("localhost:8080"), iris.WithoutPathCorrection) -} diff --git a/_examples/websocket/third-party-socketio/public/index.html b/_examples/websocket/third-party-socketio/public/index.html deleted file mode 100644 index 1b485aaf..00000000 --- a/_examples/websocket/third-party-socketio/public/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - Socket.IO chat - - - -
    -
    - -
    - - - - - \ No newline at end of file diff --git a/_examples/websocket/third-party-socketio/public/jquery-1.11.1.js b/_examples/websocket/third-party-socketio/public/jquery-1.11.1.js deleted file mode 100644 index e27f4c5f..00000000 --- a/_examples/websocket/third-party-socketio/public/jquery-1.11.1.js +++ /dev/null @@ -1,10309 +0,0 @@ -/*! - * jQuery JavaScript Library v1.11.1 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-05-01T17:42Z - */ - -(function (global, factory) { - - if (typeof module === "object" && typeof module.exports === "object") { - // For CommonJS and CommonJS-like environments where a proper window is present, - // execute the factory and get jQuery - // For environments that do not inherently posses a window with a document - // (such as Node.js), expose a jQuery-making factory as module.exports - // This accentuates the need for the creation of a real window - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info - module.exports = global.document ? - factory(global, true) : - function (w) { - if (!w.document) { - throw new Error("jQuery requires a window with a document"); - } - return factory(w); - }; - } else { - factory(global); - } - - // Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function (window, noGlobal) { - - // Can't do this because several apps including ASP.NET trace - // the stack via arguments.caller.callee and Firefox dies if - // you try to trace through "use strict" call chains. (#13335) - // Support: Firefox 18+ - // - - var deletedIds = []; - - var slice = deletedIds.slice; - - var concat = deletedIds.concat; - - var push = deletedIds.push; - - var indexOf = deletedIds.indexOf; - - var class2type = {}; - - var toString = class2type.toString; - - var hasOwn = class2type.hasOwnProperty; - - var support = {}; - - - - var - version = "1.11.1", - - // Define a local copy of jQuery - jQuery = function (selector, context) { - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init(selector, context); - }, - - // Support: Android<4.1, IE<9 - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function (all, letter) { - return letter.toUpperCase(); - }; - - jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function () { - return slice.call(this); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function (num) { - return num != null ? - - // Return just the one element from the set - (num < 0 ? this[num + this.length] : this[num]) : - - // Return all the elements in a clean array - slice.call(this); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function (elems) { - - // Build a new jQuery matched element set - var ret = jQuery.merge(this.constructor(), elems); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function (callback, args) { - return jQuery.each(this, callback, args); - }, - - map: function (callback) { - return this.pushStack(jQuery.map(this, function (elem, i) { - return callback.call(elem, i, elem); - })); - }, - - slice: function () { - return this.pushStack(slice.apply(this, arguments)); - }, - - first: function () { - return this.eq(0); - }, - - last: function () { - return this.eq(-1); - }, - - eq: function (i) { - var len = this.length, - j = +i + (i < 0 ? len : 0); - return this.pushStack(j >= 0 && j < len ? [this[j]] : []); - }, - - end: function () { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: deletedIds.sort, - splice: deletedIds.splice - }; - - jQuery.extend = jQuery.fn.extend = function () { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if (typeof target === "boolean") { - deep = target; - - // skip the boolean and the target - target = arguments[i] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if (typeof target !== "object" && !jQuery.isFunction(target)) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if (i === length) { - target = this; - i--; - } - - for (; i < length; i++) { - // Only deal with non-null/undefined values - if ((options = arguments[i]) != null) { - // Extend the base object - for (name in options) { - src = target[name]; - copy = options[name]; - - // Prevent never-ending loop - if (target === copy) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[name] = jQuery.extend(deep, clone, copy); - - // Don't bring in undefined values - } else if (copy !== undefined) { - target[name] = copy; - } - } - } - } - - // Return the modified object - return target; - }; - - jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function (msg) { - throw new Error(msg); - }, - - noop: function () { }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function (obj) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function (obj) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function (obj) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function (obj) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - return !jQuery.isArray(obj) && obj - parseFloat(obj) >= 0; - }, - - isEmptyObject: function (obj) { - var name; - for (name in obj) { - return false; - } - return true; - }, - - isPlainObject: function (obj) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { - return false; - } - - try { - // Not own constructor property must be Object - if (obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { - return false; - } - } catch (e) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if (support.ownLast) { - for (key in obj) { - return hasOwn.call(obj, key); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for (key in obj) { } - - return key === undefined || hasOwn.call(obj, key); - }, - - type: function (obj) { - if (obj == null) { - return obj + ""; - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[toString.call(obj)] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function (data) { - if (data && jQuery.trim(data)) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - (window.execScript || function (data) { - window["eval"].call(window, data); - })(data); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function (string) { - return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); - }, - - nodeName: function (elem, name) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function (obj, callback, args) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike(obj); - - if (args) { - if (isArray) { - for (; i < length; i++) { - value = callback.apply(obj[i], args); - - if (value === false) { - break; - } - } - } else { - for (i in obj) { - value = callback.apply(obj[i], args); - - if (value === false) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if (isArray) { - for (; i < length; i++) { - value = callback.call(obj[i], i, obj[i]); - - if (value === false) { - break; - } - } - } else { - for (i in obj) { - value = callback.call(obj[i], i, obj[i]); - - if (value === false) { - break; - } - } - } - } - - return obj; - }, - - // Support: Android<4.1, IE<9 - trim: function (text) { - return text == null ? - "" : - (text + "").replace(rtrim, ""); - }, - - // results is for internal usage only - makeArray: function (arr, results) { - var ret = results || []; - - if (arr != null) { - if (isArraylike(Object(arr))) { - jQuery.merge(ret, - typeof arr === "string" ? - [arr] : arr - ); - } else { - push.call(ret, arr); - } - } - - return ret; - }, - - inArray: function (elem, arr, i) { - var len; - - if (arr) { - if (indexOf) { - return indexOf.call(arr, elem, i); - } - - len = arr.length; - i = i ? i < 0 ? Math.max(0, len + i) : i : 0; - - for (; i < len; i++) { - // Skip accessing in sparse arrays - if (i in arr && arr[i] === elem) { - return i; - } - } - } - - return -1; - }, - - merge: function (first, second) { - var len = +second.length, - j = 0, - i = first.length; - - while (j < len) { - first[i++] = second[j++]; - } - - // Support: IE<9 - // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) - if (len !== len) { - while (second[j] !== undefined) { - first[i++] = second[j++]; - } - } - - first.length = i; - - return first; - }, - - grep: function (elems, callback, invert) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for (; i < length; i++) { - callbackInverse = !callback(elems[i], i); - if (callbackInverse !== callbackExpect) { - matches.push(elems[i]); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function (elems, callback, arg) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike(elems), - ret = []; - - // Go through the array, translating each of the items to their new values - if (isArray) { - for (; i < length; i++) { - value = callback(elems[i], i, arg); - - if (value != null) { - ret.push(value); - } - } - - // Go through every key on the object, - } else { - for (i in elems) { - value = callback(elems[i], i, arg); - - if (value != null) { - ret.push(value); - } - } - } - - // Flatten any nested arrays - return concat.apply([], ret); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function (fn, context) { - var args, proxy, tmp; - - if (typeof context === "string") { - tmp = fn[context]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if (!jQuery.isFunction(fn)) { - return undefined; - } - - // Simulated bind - args = slice.call(arguments, 2); - proxy = function () { - return fn.apply(context || this, args.concat(slice.call(arguments))); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: function () { - return +(new Date()); - }, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support - }); - - // Populate the class2type map - jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) { - class2type["[object " + name + "]"] = name.toLowerCase(); - }); - - function isArraylike(obj) { - var length = obj.length, - type = jQuery.type(obj); - - if (type === "function" || jQuery.isWindow(obj)) { - return false; - } - - if (obj.nodeType === 1 && length) { - return true; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && (length - 1) in obj; - } - var Sizzle = - /*! - * Sizzle CSS Selector Engine v1.10.19 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-04-18 - */ - (function (window) { - - var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function (a, b) { - if (a === b) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function (elem) { - var i = 0, - len = this.length; - for (; i < len; i++) { - if (this[i] === elem) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace("w", "w#"), - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + characterEncoding + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), - - rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), - rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), - - rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"), - - rpseudo = new RegExp(pseudos), - ridentifier = new RegExp("^" + identifier + "$"), - - matchExpr = { - "ID": new RegExp("^#(" + characterEncoding + ")"), - "CLASS": new RegExp("^\\.(" + characterEncoding + ")"), - "TAG": new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"), - "ATTR": new RegExp("^" + attributes), - "PSEUDO": new RegExp("^" + pseudos), - "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i"), - "bool": new RegExp("^(?:" + booleans + ")$", "i"), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"), - funescape = function (_, escaped, escapedWhitespace) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode(high + 0x10000) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); - }; - - // Optimize for push.apply( _, NodeList ) - try { - push.apply( - (arr = slice.call(preferredDoc.childNodes)), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[preferredDoc.childNodes.length].nodeType; - } catch (e) { - push = { - apply: arr.length ? - - // Leverage slice if possible - function (target, els) { - push_native.apply(target, slice.call(els)); - } : - - // Support: IE<9 - // Otherwise append directly - function (target, els) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ((target[j++] = els[i++])) { } - target.length = j - 1; - } - }; - } - - function Sizzle(selector, context, results, seed) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ((context ? context.ownerDocument || context : preferredDoc) !== document) { - setDocument(context); - } - - context = context || document; - results = results || []; - - if (!selector || typeof selector !== "string") { - return results; - } - - if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) { - return []; - } - - if (documentIsHTML && !seed) { - - // Shortcuts - if ((match = rquickExpr.exec(selector))) { - // Speed-up: Sizzle("#ID") - if ((m = match[1])) { - if (nodeType === 9) { - elem = context.getElementById(m); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if (elem && elem.parentNode) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if (elem.id === m) { - results.push(elem); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && - contains(context, elem) && elem.id === m) { - results.push(elem); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if (match[2]) { - push.apply(results, context.getElementsByTagName(selector)); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) { - push.apply(results, context.getElementsByClassName(m)); - return results; - } - } - - // QSA path - if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if (nodeType === 1 && context.nodeName.toLowerCase() !== "object") { - groups = tokenize(selector); - - if ((old = context.getAttribute("id"))) { - nid = old.replace(rescape, "\\$&"); - } else { - context.setAttribute("id", nid); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while (i--) { - groups[i] = nid + toSelector(groups[i]); - } - newContext = rsibling.test(selector) && testContext(context.parentNode) || context; - newSelector = groups.join(","); - } - - if (newSelector) { - try { - push.apply(results, - newContext.querySelectorAll(newSelector) - ); - return results; - } catch (qsaError) { - } finally { - if (!old) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select(selector.replace(rtrim, "$1"), context, results, seed); - } - - /** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ - function createCache() { - var keys = []; - - function cache(key, value) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if (keys.push(key + " ") > Expr.cacheLength) { - // Only keep the most recent entries - delete cache[keys.shift()]; - } - return (cache[key + " "] = value); - } - return cache; - } - - /** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ - function markFunction(fn) { - fn[expando] = true; - return fn; - } - - /** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ - function assert(fn) { - var div = document.createElement("div"); - - try { - return !!fn(div); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if (div.parentNode) { - div.parentNode.removeChild(div); - } - // release memory in IE - div = null; - } - } - - /** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ - function addHandle(attrs, handler) { - var arr = attrs.split("|"), - i = attrs.length; - - while (i--) { - Expr.attrHandle[arr[i]] = handler; - } - } - - /** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ - function siblingCheck(a, b) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - (~b.sourceIndex || MAX_NEGATIVE) - - (~a.sourceIndex || MAX_NEGATIVE); - - // Use IE sourceIndex if available on both nodes - if (diff) { - return diff; - } - - // Check if b follows a - if (cur) { - while ((cur = cur.nextSibling)) { - if (cur === b) { - return -1; - } - } - } - - return a ? 1 : -1; - } - - /** - * Returns a function to use in pseudos for input types - * @param {String} type - */ - function createInputPseudo(type) { - return function (elem) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ - function createButtonPseudo(type) { - return function (elem) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ - function createPositionalPseudo(fn) { - return markFunction(function (argument) { - argument = +argument; - return markFunction(function (seed, matches) { - var j, - matchIndexes = fn([], seed.length, argument), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while (i--) { - if (seed[(j = matchIndexes[i])]) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); - } - - /** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ - function testContext(context) { - return context && typeof context.getElementsByTagName !== strundefined && context; - } - - // Expose support vars for convenience - support = Sizzle.support = {}; - - /** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ - isXML = Sizzle.isXML = function (elem) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; - }; - - /** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ - setDocument = Sizzle.setDocument = function (node) { - var hasCompare, - doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML(doc); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if (parent && parent !== parent.top) { - // IE11 does not have attachEvent, so all must suffer - if (parent.addEventListener) { - parent.addEventListener("unload", function () { - setDocument(); - }, false); - } else if (parent.attachEvent) { - parent.attachEvent("onunload", function () { - setDocument(); - }); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function (div) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function (div) { - div.appendChild(doc.createComment("")); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = rnative.test(doc.getElementsByClassName) && assert(function (div) { - div.innerHTML = "
    "; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function (div) { - docElem.appendChild(div).id = expando; - return !doc.getElementsByName || !doc.getElementsByName(expando).length; - }); - - // ID find and filter - if (support.getById) { - Expr.find["ID"] = function (id, context) { - if (typeof context.getElementById !== strundefined && documentIsHTML) { - var m = context.getElementById(id); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function (id) { - var attrId = id.replace(runescape, funescape); - return function (elem) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function (id) { - var attrId = id.replace(runescape, funescape); - return function (elem) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function (tag, context) { - if (typeof context.getElementsByTagName !== strundefined) { - return context.getElementsByTagName(tag); - } - } : - function (tag, context) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName(tag); - - // Filter out possible comments - if (tag === "*") { - while ((elem = results[i++])) { - if (elem.nodeType === 1) { - tmp.push(elem); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { - if (typeof context.getElementsByClassName !== strundefined && documentIsHTML) { - return context.getElementsByClassName(className); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ((support.qsa = rnative.test(doc.querySelectorAll))) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function (div) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if (div.querySelectorAll("[msallowclip^='']").length) { - rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if (!div.querySelectorAll("[selected]").length) { - rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if (!div.querySelectorAll(":checked").length) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function (div) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute("type", "hidden"); - div.appendChild(input).setAttribute("name", "D"); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if (div.querySelectorAll("[name=d]").length) { - rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if (!div.querySelectorAll(":enabled").length) { - rbuggyQSA.push(":enabled", ":disabled"); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ((support.matchesSelector = rnative.test((matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector)))) { - - assert(function (div) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call(div, "div"); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call(div, "[s!='']:x"); - rbuggyMatches.push("!=", pseudos); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); - rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test(docElem.compareDocumentPosition); - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = hasCompare || rnative.test(docElem.contains) ? - function (a, b) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!(bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains(bup) : - a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16 - )); - } : - function (a, b) { - if (b) { - while ((b = b.parentNode)) { - if (b === a) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function (a, b) { - - // Flag for duplicate removal - if (a === b) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if (compare) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? - a.compareDocumentPosition(b) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if (compare & 1 || - (!support.sortDetached && b.compareDocumentPosition(a) === compare)) { - - // Choose the first element that is related to our preferred document - if (a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) { - return -1; - } - if (b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) { - return 1; - } - - // Maintain original order - return sortInput ? - (indexOf.call(sortInput, a) - indexOf.call(sortInput, b)) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function (a, b) { - // Exit early if the nodes are identical - if (a === b) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [a], - bp = [b]; - - // Parentless nodes are either documents or disconnected - if (!aup || !bup) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - (indexOf.call(sortInput, a) - indexOf.call(sortInput, b)) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if (aup === bup) { - return siblingCheck(a, b); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ((cur = cur.parentNode)) { - ap.unshift(cur); - } - cur = b; - while ((cur = cur.parentNode)) { - bp.unshift(cur); - } - - // Walk down the tree looking for a discrepancy - while (ap[i] === bp[i]) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck(ap[i], bp[i]) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; - }; - - Sizzle.matches = function (expr, elements) { - return Sizzle(expr, null, null, elements); - }; - - Sizzle.matchesSelector = function (elem, expr) { - // Set document vars if needed - if ((elem.ownerDocument || elem) !== document) { - setDocument(elem); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace(rattributeQuotes, "='$1']"); - - if (support.matchesSelector && documentIsHTML && - (!rbuggyMatches || !rbuggyMatches.test(expr)) && - (!rbuggyQSA || !rbuggyQSA.test(expr))) { - - try { - var ret = matches.call(elem, expr); - - // IE 9's matchesSelector returns false on disconnected nodes - if (ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11) { - return ret; - } - } catch (e) { } - } - - return Sizzle(expr, document, null, [elem]).length > 0; - }; - - Sizzle.contains = function (context, elem) { - // Set document vars if needed - if ((context.ownerDocument || context) !== document) { - setDocument(context); - } - return contains(context, elem); - }; - - Sizzle.attr = function (elem, name) { - // Set document vars if needed - if ((elem.ownerDocument || elem) !== document) { - setDocument(elem); - } - - var fn = Expr.attrHandle[name.toLowerCase()], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? - fn(elem, name, !documentIsHTML) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute(name) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; - }; - - Sizzle.error = function (msg) { - throw new Error("Syntax error, unrecognized expression: " + msg); - }; - - /** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ - Sizzle.uniqueSort = function (results) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice(0); - results.sort(sortOrder); - - if (hasDuplicate) { - while ((elem = results[i++])) { - if (elem === results[i]) { - j = duplicates.push(i); - } - } - while (j--) { - results.splice(duplicates[j], 1); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; - }; - - /** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ - getText = Sizzle.getText = function (elem) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if (!nodeType) { - // If no nodeType, this is expected to be an array - while ((node = elem[i++])) { - // Do not traverse comment nodes - ret += getText(node); - } - } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if (typeof elem.textContent === "string") { - return elem.textContent; - } else { - // Traverse its children - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText(elem); - } - } - } else if (nodeType === 3 || nodeType === 4) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; - }; - - Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function (match) { - match[1] = match[1].replace(runescape, funescape); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape); - - if (match[2] === "~=") { - match[3] = " " + match[3] + " "; - } - - return match.slice(0, 4); - }, - - "CHILD": function (match) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if (match[1].slice(0, 3) === "nth") { - // nth-* requires argument - if (!match[3]) { - Sizzle.error(match[0]); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); - match[5] = +((match[7] + match[8]) || match[3] === "odd"); - - // other types prohibit arguments - } else if (match[3]) { - Sizzle.error(match[0]); - } - - return match; - }, - - "PSEUDO": function (match) { - var excess, - unquoted = !match[6] && match[2]; - - if (matchExpr["CHILD"].test(match[0])) { - return null; - } - - // Accept quoted arguments as-is - if (match[3]) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if (unquoted && rpseudo.test(unquoted) && - // Get excess from tokenize (recursively) - (excess = tokenize(unquoted, true)) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { - - // excess is a negative index - match[0] = match[0].slice(0, excess); - match[2] = unquoted.slice(0, excess); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice(0, 3); - } - }, - - filter: { - - "TAG": function (nodeNameSelector) { - var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); - return nodeNameSelector === "*" ? - function () { return true; } : - function (elem) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function (className) { - var pattern = classCache[className + " "]; - - return pattern || - (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && - classCache(className, function (elem) { - return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || ""); - }); - }, - - "ATTR": function (name, operator, check) { - return function (elem) { - var result = Sizzle.attr(elem, name); - - if (result == null) { - return operator === "!="; - } - if (!operator) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf(check) === 0 : - operator === "*=" ? check && result.indexOf(check) > -1 : - operator === "$=" ? check && result.slice(-check.length) === check : - operator === "~=" ? (" " + result + " ").indexOf(check) > -1 : - operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : - false; - }; - }, - - "CHILD": function (type, what, argument, first, last) { - var simple = type.slice(0, 3) !== "nth", - forward = type.slice(-4) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function (elem) { - return !!elem.parentNode; - } : - - function (elem, context, xml) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if (parent) { - - // :(first|last|only)-(child|of-type) - if (simple) { - while (dir) { - node = elem; - while ((node = node[dir])) { - if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [forward ? parent.firstChild : parent.lastChild]; - - // non-xml :nth-child(...) stores cache data on `parent` - if (forward && useCache) { - // Seek `elem` from a previously-cached index - outerCache = parent[expando] || (parent[expando] = {}); - cache = outerCache[type] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[nodeIndex]; - - while ((node = ++nodeIndex && node && node[dir] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop())) { - - // When found, cache indexes on `parent` and break - if (node.nodeType === 1 && ++diff && node === elem) { - outerCache[type] = [dirruns, nodeIndex, diff]; - break; - } - } - - // Use previously-cached element index if available - } else if (useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ((node = ++nodeIndex && node && node[dir] || - (diff = nodeIndex = 0) || start.pop())) { - - if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) { - // Cache the index of each encountered element - if (useCache) { - (node[expando] || (node[expando] = {}))[type] = [dirruns, diff]; - } - - if (node === elem) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || (diff % first === 0 && diff / first >= 0); - } - }; - }, - - "PSEUDO": function (pseudo, argument) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || - Sizzle.error("unsupported pseudo: " + pseudo); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if (fn[expando]) { - return fn(argument); - } - - // But maintain support for old signatures - if (fn.length > 1) { - args = [pseudo, pseudo, "", argument]; - return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? - markFunction(function (seed, matches) { - var idx, - matched = fn(seed, argument), - i = matched.length; - while (i--) { - idx = indexOf.call(seed, matched[i]); - seed[idx] = !(matches[idx] = matched[i]); - } - }) : - function (elem) { - return fn(elem, 0, args); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function (selector) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile(selector.replace(rtrim, "$1")); - - return matcher[expando] ? - markFunction(function (seed, matches, context, xml) { - var elem, - unmatched = matcher(seed, null, xml, []), - i = seed.length; - - // Match elements unmatched by `matcher` - while (i--) { - if ((elem = unmatched[i])) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function (elem, context, xml) { - input[0] = elem; - matcher(input, null, xml, results); - return !results.pop(); - }; - }), - - "has": markFunction(function (selector) { - return function (elem) { - return Sizzle(selector, elem).length > 0; - }; - }), - - "contains": markFunction(function (text) { - return function (elem) { - return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction(function (lang) { - // lang value must be a valid identifier - if (!ridentifier.test(lang || "")) { - Sizzle.error("unsupported lang: " + lang); - } - lang = lang.replace(runescape, funescape).toLowerCase(); - return function (elem) { - var elemLang; - do { - if ((elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf(lang + "-") === 0; - } - } while ((elem = elem.parentNode) && elem.nodeType === 1); - return false; - }; - }), - - // Miscellaneous - "target": function (elem) { - var hash = window.location && window.location.hash; - return hash && hash.slice(1) === elem.id; - }, - - "root": function (elem) { - return elem === docElem; - }, - - "focus": function (elem) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function (elem) { - return elem.disabled === false; - }, - - "disabled": function (elem) { - return elem.disabled === true; - }, - - "checked": function (elem) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function (elem) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if (elem.parentNode) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function (elem) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - if (elem.nodeType < 6) { - return false; - } - } - return true; - }, - - "parent": function (elem) { - return !Expr.pseudos["empty"](elem); - }, - - // Element/input types - "header": function (elem) { - return rheader.test(elem.nodeName); - }, - - "input": function (elem) { - return rinputs.test(elem.nodeName); - }, - - "button": function (elem) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function (elem) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text"); - }, - - // Position-in-collection - "first": createPositionalPseudo(function () { - return [0]; - }), - - "last": createPositionalPseudo(function (matchIndexes, length) { - return [length - 1]; - }), - - "eq": createPositionalPseudo(function (matchIndexes, length, argument) { - return [argument < 0 ? argument + length : argument]; - }), - - "even": createPositionalPseudo(function (matchIndexes, length) { - var i = 0; - for (; i < length; i += 2) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function (matchIndexes, length) { - var i = 1; - for (; i < length; i += 2) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function (matchIndexes, length, argument) { - var i = argument < 0 ? argument + length : argument; - for (; --i >= 0;) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function (matchIndexes, length, argument) { - var i = argument < 0 ? argument + length : argument; - for (; ++i < length;) { - matchIndexes.push(i); - } - return matchIndexes; - }) - } - }; - - Expr.pseudos["nth"] = Expr.pseudos["eq"]; - - // Add button/input type pseudos - for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) { - Expr.pseudos[i] = createInputPseudo(i); - } - for (i in { submit: true, reset: true }) { - Expr.pseudos[i] = createButtonPseudo(i); - } - - // Easy API for creating new setFilters - function setFilters() { } - setFilters.prototype = Expr.filters = Expr.pseudos; - Expr.setFilters = new setFilters(); - - tokenize = Sizzle.tokenize = function (selector, parseOnly) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[selector + " "]; - - if (cached) { - return parseOnly ? 0 : cached.slice(0); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while (soFar) { - - // Comma and first run - if (!matched || (match = rcomma.exec(soFar))) { - if (match) { - // Don't consume trailing commas as valid - soFar = soFar.slice(match[0].length) || soFar; - } - groups.push((tokens = [])); - } - - matched = false; - - // Combinators - if ((match = rcombinators.exec(soFar))) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace(rtrim, " ") - }); - soFar = soFar.slice(matched.length); - } - - // Filters - for (type in Expr.filter) { - if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || - (match = preFilters[type](match)))) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice(matched.length); - } - } - - if (!matched) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error(selector) : - // Cache the tokens - tokenCache(selector, groups).slice(0); - }; - - function toSelector(tokens) { - var i = 0, - len = tokens.length, - selector = ""; - for (; i < len; i++) { - selector += tokens[i].value; - } - return selector; - } - - function addCombinator(matcher, combinator, base) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function (elem, context, xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - return matcher(elem, context, xml); - } - } - } : - - // Check against all ancestor/preceding elements - function (elem, context, xml) { - var oldCache, outerCache, - newCache = [dirruns, doneName]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if (xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - if (matcher(elem, context, xml)) { - return true; - } - } - } - } else { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - outerCache = elem[expando] || (elem[expando] = {}); - if ((oldCache = outerCache[dir]) && - oldCache[0] === dirruns && oldCache[1] === doneName) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[2] = oldCache[2]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[dir] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ((newCache[2] = matcher(elem, context, xml))) { - return true; - } - } - } - } - } - }; - } - - function elementMatcher(matchers) { - return matchers.length > 1 ? - function (elem, context, xml) { - var i = matchers.length; - while (i--) { - if (!matchers[i](elem, context, xml)) { - return false; - } - } - return true; - } : - matchers[0]; - } - - function multipleContexts(selector, contexts, results) { - var i = 0, - len = contexts.length; - for (; i < len; i++) { - Sizzle(selector, contexts[i], results); - } - return results; - } - - function condense(unmatched, map, filter, context, xml) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for (; i < len; i++) { - if ((elem = unmatched[i])) { - if (!filter || filter(elem, context, xml)) { - newUnmatched.push(elem); - if (mapped) { - map.push(i); - } - } - } - } - - return newUnmatched; - } - - function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { - if (postFilter && !postFilter[expando]) { - postFilter = setMatcher(postFilter); - } - if (postFinder && !postFinder[expando]) { - postFinder = setMatcher(postFinder, postSelector); - } - return markFunction(function (seed, results, context, xml) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && (seed || !selector) ? - condense(elems, preMap, preFilter, context, xml) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || (seed ? preFilter : preexisting || postFilter) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if (matcher) { - matcher(matcherIn, matcherOut, context, xml); - } - - // Apply postFilter - if (postFilter) { - temp = condense(matcherOut, postMap); - postFilter(temp, [], context, xml); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while (i--) { - if ((elem = temp[i])) { - matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); - } - } - } - - if (seed) { - if (postFinder || preFilter) { - if (postFinder) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while (i--) { - if ((elem = matcherOut[i])) { - // Restore matcherIn since elem is not yet a final match - temp.push((matcherIn[i] = elem)); - } - } - postFinder(null, (matcherOut = []), temp, xml); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while (i--) { - if ((elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice(preexisting, matcherOut.length) : - matcherOut - ); - if (postFinder) { - postFinder(null, results, matcherOut, xml); - } else { - push.apply(results, matcherOut); - } - } - }); - } - - function matcherFromTokens(tokens) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[tokens[0].type], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator(function (elem) { - return elem === checkContext; - }, implicitRelative, true), - matchAnyContext = addCombinator(function (elem) { - return indexOf.call(checkContext, elem) > -1; - }, implicitRelative, true), - matchers = [function (elem, context, xml) { - return (!leadingRelative && (xml || context !== outermostContext)) || ( - (checkContext = context).nodeType ? - matchContext(elem, context, xml) : - matchAnyContext(elem, context, xml)); - }]; - - for (; i < len; i++) { - if ((matcher = Expr.relative[tokens[i].type])) { - matchers = [addCombinator(elementMatcher(matchers), matcher)]; - } else { - matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); - - // Return special upon seeing a positional matcher - if (matcher[expando]) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for (; j < len; j++) { - if (Expr.relative[tokens[j].type]) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher(matchers), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" }) - ).replace(rtrim, "$1"), - matcher, - i < j && matcherFromTokens(tokens.slice(i, j)), - j < len && matcherFromTokens((tokens = tokens.slice(j))), - j < len && toSelector(tokens) - ); - } - matchers.push(matcher); - } - } - - return elementMatcher(matchers); - } - - function matcherFromGroupMatchers(elementMatchers, setMatchers) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function (seed, context, xml, results, outermost) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]("*", outermost), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if (outermost) { - outermostContext = context !== document && context; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for (; i !== len && (elem = elems[i]) != null; i++) { - if (byElement && elem) { - j = 0; - while ((matcher = elementMatchers[j++])) { - if (matcher(elem, context, xml)) { - results.push(elem); - break; - } - } - if (outermost) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if (bySet) { - // They will have gone through all possible matchers - if ((elem = !matcher && elem)) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if (seed) { - unmatched.push(elem); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if (bySet && i !== matchedCount) { - j = 0; - while ((matcher = setMatchers[j++])) { - matcher(unmatched, setMatched, context, xml); - } - - if (seed) { - // Reintegrate element matches to eliminate the need for sorting - if (matchedCount > 0) { - while (i--) { - if (!(unmatched[i] || setMatched[i])) { - setMatched[i] = pop.call(results); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense(setMatched); - } - - // Add matches to results - push.apply(results, setMatched); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if (outermost && !seed && setMatched.length > 0 && - (matchedCount + setMatchers.length) > 1) { - - Sizzle.uniqueSort(results); - } - } - - // Override manipulation of globals by nested matchers - if (outermost) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction(superMatcher) : - superMatcher; - } - - compile = Sizzle.compile = function (selector, match /* Internal Use Only */) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[selector + " "]; - - if (!cached) { - // Generate a function of recursive functions that can be used to check each element - if (!match) { - match = tokenize(selector); - } - i = match.length; - while (i--) { - cached = matcherFromTokens(match[i]); - if (cached[expando]) { - setMatchers.push(cached); - } else { - elementMatchers.push(cached); - } - } - - // Cache the compiled function - cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; - }; - - /** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ - select = Sizzle.select = function (selector, context, results, seed) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize((selector = compiled.selector || selector)); - - results = results || []; - - // Try to minimize operations if there is no seed and only one group - if (match.length === 1) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice(0); - if (tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[tokens[1].type]) { - - context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0]; - if (!context) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if (compiled) { - context = context.parentNode; - } - - selector = selector.slice(tokens.shift().value.length); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length; - while (i--) { - token = tokens[i]; - - // Abort if we hit a combinator - if (Expr.relative[(type = token.type)]) { - break; - } - if ((find = Expr.find[type])) { - // Search, expanding context for leading sibling combinators - if ((seed = find( - token.matches[0].replace(runescape, funescape), - rsibling.test(tokens[0].type) && testContext(context.parentNode) || context - ))) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice(i, 1); - selector = seed.length && toSelector(tokens); - if (!selector) { - push.apply(results, seed); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - (compiled || compile(selector, match))( - seed, - context, - !documentIsHTML, - results, - rsibling.test(selector) && testContext(context.parentNode) || context - ); - return results; - }; - - // One-time assignments - - // Sort stability - support.sortStable = expando.split("").sort(sortOrder).join("") === expando; - - // Support: Chrome<14 - // Always assume duplicates if they aren't passed to the comparison function - support.detectDuplicates = !!hasDuplicate; - - // Initialize against the default document - setDocument(); - - // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) - // Detached nodes confoundingly follow *each other* - support.sortDetached = assert(function (div1) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition(document.createElement("div")) & 1; - }); - - // Support: IE<8 - // Prevent attribute/property "interpolation" - // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx - if (!assert(function (div) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#"; - })) { - addHandle("type|href|height|width", function (elem, name, isXML) { - if (!isXML) { - return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2); - } - }); - } - - // Support: IE<9 - // Use defaultValue in place of getAttribute("value") - if (!support.attributes || !assert(function (div) { - div.innerHTML = ""; - div.firstChild.setAttribute("value", ""); - return div.firstChild.getAttribute("value") === ""; - })) { - addHandle("value", function (elem, name, isXML) { - if (!isXML && elem.nodeName.toLowerCase() === "input") { - return elem.defaultValue; - } - }); - } - - // Support: IE<9 - // Use getAttributeNode to fetch booleans when getAttribute lies - if (!assert(function (div) { - return div.getAttribute("disabled") == null; - })) { - addHandle(booleans, function (elem, name, isXML) { - var val; - if (!isXML) { - return elem[name] === true ? name.toLowerCase() : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; - } - }); - } - - return Sizzle; - - })(window); - - - - jQuery.find = Sizzle; - jQuery.expr = Sizzle.selectors; - jQuery.expr[":"] = jQuery.expr.pseudos; - jQuery.unique = Sizzle.uniqueSort; - jQuery.text = Sizzle.getText; - jQuery.isXMLDoc = Sizzle.isXML; - jQuery.contains = Sizzle.contains; - - - - var rneedsContext = jQuery.expr.match.needsContext; - - var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); - - - - var risSimple = /^.[^:#\[\.,]*$/; - - // Implement the identical functionality for filter and not - function winnow(elements, qualifier, not) { - if (jQuery.isFunction(qualifier)) { - return jQuery.grep(elements, function (elem, i) { - /* jshint -W018 */ - return !!qualifier.call(elem, i, elem) !== not; - }); - - } - - if (qualifier.nodeType) { - return jQuery.grep(elements, function (elem) { - return (elem === qualifier) !== not; - }); - - } - - if (typeof qualifier === "string") { - if (risSimple.test(qualifier)) { - return jQuery.filter(qualifier, elements, not); - } - - qualifier = jQuery.filter(qualifier, elements); - } - - return jQuery.grep(elements, function (elem) { - return (jQuery.inArray(elem, qualifier) >= 0) !== not; - }); - } - - jQuery.filter = function (expr, elems, not) { - var elem = elems[0]; - - if (not) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : - jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { - return elem.nodeType === 1; - })); - }; - - jQuery.fn.extend({ - find: function (selector) { - var i, - ret = [], - self = this, - len = self.length; - - if (typeof selector !== "string") { - return this.pushStack(jQuery(selector).filter(function () { - for (i = 0; i < len; i++) { - if (jQuery.contains(self[i], this)) { - return true; - } - } - })); - } - - for (i = 0; i < len; i++) { - jQuery.find(selector, self[i], ret); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function (selector) { - return this.pushStack(winnow(this, selector || [], false)); - }, - not: function (selector) { - return this.pushStack(winnow(this, selector || [], true)); - }, - is: function (selector) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test(selector) ? - jQuery(selector) : - selector || [], - false - ).length; - } - }); - - - // Initialize a jQuery object - - - // A central reference to the root jQuery(document) - var rootjQuery, - - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function (selector, context) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if (!selector) { - return this; - } - - // Handle HTML strings - if (typeof selector === "string") { - if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [null, selector, null]; - - } else { - match = rquickExpr.exec(selector); - } - - // Match html or make sure no context is specified for #id - if (match && (match[1] || !context)) { - - // HANDLE: $(html) -> $(array) - if (match[1]) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge(this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - )); - - // HANDLE: $(html, props) - if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) { - for (match in context) { - // Properties of context are called as methods if possible - if (jQuery.isFunction(this[match])) { - this[match](context[match]); - - // ...and otherwise set as attributes - } else { - this.attr(match, context[match]); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById(match[2]); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if (elem && elem.parentNode) { - // Handle the case where IE and Opera return items - // by name instead of ID - if (elem.id !== match[2]) { - return rootjQuery.find(selector); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if (!context || context.jquery) { - return (context || rootjQuery).find(selector); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor(context).find(selector); - } - - // HANDLE: $(DOMElement) - } else if (selector.nodeType) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if (jQuery.isFunction(selector)) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready(selector) : - // Execute immediately if ready is not present - selector(jQuery); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray(selector, this); - }; - - // Give the init function the jQuery prototype for later instantiation - init.prototype = jQuery.fn; - - // Initialize central reference - rootjQuery = jQuery(document); - - - var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - - jQuery.extend({ - dir: function (elem, dir, until) { - var matched = [], - cur = elem[dir]; - - while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { - if (cur.nodeType === 1) { - matched.push(cur); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function (n, elem) { - var r = []; - - for (; n; n = n.nextSibling) { - if (n.nodeType === 1 && n !== elem) { - r.push(n); - } - } - - return r; - } - }); - - jQuery.fn.extend({ - has: function (target) { - var i, - targets = jQuery(target, this), - len = targets.length; - - return this.filter(function () { - for (i = 0; i < len; i++) { - if (jQuery.contains(this, targets[i])) { - return true; - } - } - }); - }, - - closest: function (selectors, context) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? - jQuery(selectors, context || this.context) : - 0; - - for (; i < l; i++) { - for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { - // Always skip document fragments - if (cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors))) { - - matched.push(cur); - break; - } - } - } - - return this.pushStack(matched.length > 1 ? jQuery.unique(matched) : matched); - }, - - // Determine the position of an element within - // the matched set of elements - index: function (elem) { - - // No argument, return index in parent - if (!elem) { - return (this[0] && this[0].parentNode) ? this.first().prevAll().length : -1; - } - - // index in selector - if (typeof elem === "string") { - return jQuery.inArray(this[0], jQuery(elem)); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this); - }, - - add: function (selector, context) { - return this.pushStack( - jQuery.unique( - jQuery.merge(this.get(), jQuery(selector, context)) - ) - ); - }, - - addBack: function (selector) { - return this.add(selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } - }); - - function sibling(cur, dir) { - do { - cur = cur[dir]; - } while (cur && cur.nodeType !== 1); - - return cur; - } - - jQuery.each({ - parent: function (elem) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function (elem) { - return jQuery.dir(elem, "parentNode"); - }, - parentsUntil: function (elem, i, until) { - return jQuery.dir(elem, "parentNode", until); - }, - next: function (elem) { - return sibling(elem, "nextSibling"); - }, - prev: function (elem) { - return sibling(elem, "previousSibling"); - }, - nextAll: function (elem) { - return jQuery.dir(elem, "nextSibling"); - }, - prevAll: function (elem) { - return jQuery.dir(elem, "previousSibling"); - }, - nextUntil: function (elem, i, until) { - return jQuery.dir(elem, "nextSibling", until); - }, - prevUntil: function (elem, i, until) { - return jQuery.dir(elem, "previousSibling", until); - }, - siblings: function (elem) { - return jQuery.sibling((elem.parentNode || {}).firstChild, elem); - }, - children: function (elem) { - return jQuery.sibling(elem.firstChild); - }, - contents: function (elem) { - return jQuery.nodeName(elem, "iframe") ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge([], elem.childNodes); - } - }, function (name, fn) { - jQuery.fn[name] = function (until, selector) { - var ret = jQuery.map(this, fn, until); - - if (name.slice(-5) !== "Until") { - selector = until; - } - - if (selector && typeof selector === "string") { - ret = jQuery.filter(selector, ret); - } - - if (this.length > 1) { - // Remove duplicates - if (!guaranteedUnique[name]) { - ret = jQuery.unique(ret); - } - - // Reverse order for parents* and prev-derivatives - if (rparentsprev.test(name)) { - ret = ret.reverse(); - } - } - - return this.pushStack(ret); - }; - }); - var rnotwhite = (/\S+/g); - - - - // String to Object options format cache - var optionsCache = {}; - - // Convert String-formatted options into Object-formatted ones and store in cache - function createOptions(options) { - var object = optionsCache[options] = {}; - jQuery.each(options.match(rnotwhite) || [], function (_, flag) { - object[flag] = true; - }); - return object; - } - - /* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ - jQuery.Callbacks = function (options) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - (optionsCache[options] || createOptions(options)) : - jQuery.extend({}, options); - - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function (data) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for (; list && firingIndex < firingLength; firingIndex++) { - if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if (list) { - if (stack) { - if (stack.length) { - fire(stack.shift()); - } - } else if (memory) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function () { - if (list) { - // First, we save the current length - var start = list.length; - (function add(args) { - jQuery.each(args, function (_, arg) { - var type = jQuery.type(arg); - if (type === "function") { - if (!options.unique || !self.has(arg)) { - list.push(arg); - } - } else if (arg && arg.length && type !== "string") { - // Inspect recursively - add(arg); - } - }); - })(arguments); - // Do we need to add the callbacks to the - // current firing batch? - if (firing) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if (memory) { - firingStart = start; - fire(memory); - } - } - return this; - }, - // Remove a callback from the list - remove: function () { - if (list) { - jQuery.each(arguments, function (_, arg) { - var index; - while ((index = jQuery.inArray(arg, list, index)) > -1) { - list.splice(index, 1); - // Handle firing indexes - if (firing) { - if (index <= firingLength) { - firingLength--; - } - if (index <= firingIndex) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function (fn) { - return fn ? jQuery.inArray(fn, list) > -1 : !!(list && list.length); - }, - // Remove all callbacks from the list - empty: function () { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function () { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function () { - return !list; - }, - // Lock the list in its current state - lock: function () { - stack = undefined; - if (!memory) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function () { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function (context, args) { - if (list && (!fired || stack)) { - args = args || []; - args = [context, args.slice ? args.slice() : args]; - if (firing) { - stack.push(args); - } else { - fire(args); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function () { - self.fireWith(this, arguments); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function () { - return !!fired; - } - }; - - return self; - }; - - - jQuery.extend({ - - Deferred: function (func) { - var tuples = [ - // action, add listener, listener list, final state - ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], - ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], - ["notify", "progress", jQuery.Callbacks("memory")] - ], - state = "pending", - promise = { - state: function () { - return state; - }, - always: function () { - deferred.done(arguments).fail(arguments); - return this; - }, - then: function ( /* fnDone, fnFail, fnProgress */) { - var fns = arguments; - return jQuery.Deferred(function (newDefer) { - jQuery.each(tuples, function (i, tuple) { - var fn = jQuery.isFunction(fns[i]) && fns[i]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[tuple[1]](function () { - var returned = fn && fn.apply(this, arguments); - if (returned && jQuery.isFunction(returned.promise)) { - returned.promise() - .done(newDefer.resolve) - .fail(newDefer.reject) - .progress(newDefer.notify); - } else { - newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function (obj) { - return obj != null ? jQuery.extend(obj, promise) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each(tuples, function (i, tuple) { - var list = tuple[2], - stateString = tuple[3]; - - // promise[ done | fail | progress ] = list.add - promise[tuple[1]] = list.add; - - // Handle state - if (stateString) { - list.add(function () { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[i ^ 1][2].disable, tuples[2][2].lock); - } - - // deferred[ resolve | reject | notify ] - deferred[tuple[0]] = function () { - deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments); - return this; - }; - deferred[tuple[0] + "With"] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise(deferred); - - // Call given func if any - if (func) { - func.call(deferred, deferred); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function (subordinate /* , ..., subordinateN */) { - var i = 0, - resolveValues = slice.call(arguments), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || (subordinate && jQuery.isFunction(subordinate.promise)) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function (i, contexts, values) { - return function (value) { - contexts[i] = this; - values[i] = arguments.length > 1 ? slice.call(arguments) : value; - if (values === progressValues) { - deferred.notifyWith(contexts, values); - - } else if (!(--remaining)) { - deferred.resolveWith(contexts, values); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if (length > 1) { - progressValues = new Array(length); - progressContexts = new Array(length); - resolveContexts = new Array(length); - for (; i < length; i++) { - if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) { - resolveValues[i].promise() - .done(updateFunc(i, resolveContexts, resolveValues)) - .fail(deferred.reject) - .progress(updateFunc(i, progressContexts, progressValues)); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if (!remaining) { - deferred.resolveWith(resolveContexts, resolveValues); - } - - return deferred.promise(); - } - }); - - - // The deferred used on DOM ready - var readyList; - - jQuery.fn.ready = function (fn) { - // Add the callback - jQuery.ready.promise().done(fn); - - return this; - }; - - jQuery.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function (hold) { - if (hold) { - jQuery.readyWait++; - } else { - jQuery.ready(true); - } - }, - - // Handle when the DOM is ready - ready: function (wait) { - - // Abort if there are pending holds or we're already ready - if (wait === true ? --jQuery.readyWait : jQuery.isReady) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if (!document.body) { - return setTimeout(jQuery.ready); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if (wait !== true && --jQuery.readyWait > 0) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith(document, [jQuery]); - - // Trigger any bound ready events - if (jQuery.fn.triggerHandler) { - jQuery(document).triggerHandler("ready"); - jQuery(document).off("ready"); - } - } - }); - - /** - * Clean-up method for dom ready events - */ - function detach() { - if (document.addEventListener) { - document.removeEventListener("DOMContentLoaded", completed, false); - window.removeEventListener("load", completed, false); - - } else { - document.detachEvent("onreadystatechange", completed); - window.detachEvent("onload", completed); - } - } - - /** - * The ready event handler and self cleanup method - */ - function completed() { - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if (document.addEventListener || event.type === "load" || document.readyState === "complete") { - detach(); - jQuery.ready(); - } - } - - jQuery.ready.promise = function (obj) { - if (!readyList) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if (document.readyState === "complete") { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout(jQuery.ready); - - // Standards-based browsers support DOMContentLoaded - } else if (document.addEventListener) { - // Use the handy event callback - document.addEventListener("DOMContentLoaded", completed, false); - - // A fallback to window.onload, that will always work - window.addEventListener("load", completed, false); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent("onreadystatechange", completed); - - // A fallback to window.onload, that will always work - window.attachEvent("onload", completed); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch (e) { } - - if (top && top.doScroll) { - (function doScrollCheck() { - if (!jQuery.isReady) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch (e) { - return setTimeout(doScrollCheck, 50); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise(obj); - }; - - - var strundefined = typeof undefined; - - - - // Support: IE<9 - // Iteration over object's inherited properties before its own - var i; - for (i in jQuery(support)) { - break; - } - support.ownLast = i !== "0"; - - // Note: most support tests are defined in their respective modules. - // false until the test is run - support.inlineBlockNeedsLayout = false; - - // Execute ASAP in case we need to set body.style.zoom - jQuery(function () { - // Minified: var a,b,c,d - var val, div, body, container; - - body = document.getElementsByTagName("body")[0]; - if (!body || !body.style) { - // Return for frameset docs that don't have a body - return; - } - - // Setup - div = document.createElement("div"); - container = document.createElement("div"); - container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; - body.appendChild(container).appendChild(div); - - if (typeof div.style.zoom !== strundefined) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; - - support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; - if (val) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild(container); - }); - - - - - (function () { - var div = document.createElement("div"); - - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch (e) { - support.deleteExpando = false; - } - } - - // Null elements to avoid leaks in IE. - div = null; - })(); - - - /** - * Determines whether an object can have data - */ - jQuery.acceptData = function (elem) { - var noData = jQuery.noData[(elem.nodeName + " ").toLowerCase()], - nodeType = +elem.nodeType || 1; - - // Do not set data on non-element DOM nodes because it will not be cleared (#8335). - return nodeType !== 1 && nodeType !== 9 ? - false : - - // Nodes accept data unless otherwise specified; rejection can be conditional - !noData || noData !== true && elem.getAttribute("classid") === noData; - }; - - - var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - - function dataAttr(elem, key, data) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if (data === undefined && elem.nodeType === 1) { - - var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase(); - - data = elem.getAttribute(name); - - if (typeof data === "string") { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test(data) ? jQuery.parseJSON(data) : - data; - } catch (e) { } - - // Make sure we set the data so it isn't changed later - jQuery.data(elem, key, data); - - } else { - data = undefined; - } - } - - return data; - } - - // checks a cache object for emptiness - function isEmptyDataObject(obj) { - var name; - for (name in obj) { - - // if the public data object is empty, the private is still empty - if (name === "data" && jQuery.isEmptyObject(obj[name])) { - continue; - } - if (name !== "toJSON") { - return false; - } - } - - return true; - } - - function internalData(elem, name, data, pvt /* Internal Use Only */) { - if (!jQuery.acceptData(elem)) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[internalKey] : elem[internalKey] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ((!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string") { - return; - } - - if (!id) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if (isNode) { - id = elem[internalKey] = deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if (!cache[id]) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[id] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if (typeof name === "object" || typeof name === "function") { - if (pvt) { - cache[id] = jQuery.extend(cache[id], name); - } else { - cache[id].data = jQuery.extend(cache[id].data, name); - } - } - - thisCache = cache[id]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if (!pvt) { - if (!thisCache.data) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if (data !== undefined) { - thisCache[jQuery.camelCase(name)] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if (typeof name === "string") { - - // First Try to find as-is property data - ret = thisCache[name]; - - // Test for null|undefined property data - if (ret == null) { - - // Try to find the camelCased property - ret = thisCache[jQuery.camelCase(name)]; - } - } else { - ret = thisCache; - } - - return ret; - } - - function internalRemoveData(elem, name, pvt) { - if (!jQuery.acceptData(elem)) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[jQuery.expando] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if (!cache[id]) { - return; - } - - if (name) { - - thisCache = pvt ? cache[id] : cache[id].data; - - if (thisCache) { - - // Support array or space separated string names for data keys - if (!jQuery.isArray(name)) { - - // try the string as a key before any manipulation - if (name in thisCache) { - name = [name]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase(name); - if (name in thisCache) { - name = [name]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat(jQuery.map(name, jQuery.camelCase)); - } - - i = name.length; - while (i--) { - delete thisCache[name[i]]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if (pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache)) { - return; - } - } - } - - // See jQuery.data for more information - if (!pvt) { - delete cache[id].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if (!isEmptyDataObject(cache[id])) { - return; - } - } - - // Destroy the cache - if (isNode) { - jQuery.cleanData([elem], true); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if (support.deleteExpando || cache != cache.window) { - /* jshint eqeqeq: true */ - delete cache[id]; - - // When all else fails, null - } else { - cache[id] = null; - } - } - - jQuery.extend({ - cache: {}, - - // The following elements (space-suffixed to avoid Object.prototype collisions) - // throw uncatchable exceptions if you attempt to set expando properties - noData: { - "applet ": true, - "embed ": true, - // ...but Flash objects (which have this classid) *can* handle expandos - "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function (elem) { - elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando]; - return !!elem && !isEmptyDataObject(elem); - }, - - data: function (elem, name, data) { - return internalData(elem, name, data); - }, - - removeData: function (elem, name) { - return internalRemoveData(elem, name); - }, - - // For internal use only. - _data: function (elem, name, data) { - return internalData(elem, name, data, true); - }, - - _removeData: function (elem, name) { - return internalRemoveData(elem, name, true); - } - }); - - jQuery.fn.extend({ - data: function (key, value) { - var i, name, data, - elem = this[0], - attrs = elem && elem.attributes; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if (key === undefined) { - if (this.length) { - data = jQuery.data(elem); - - if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) { - i = attrs.length; - while (i--) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if (attrs[i]) { - name = attrs[i].name; - if (name.indexOf("data-") === 0) { - name = jQuery.camelCase(name.slice(5)); - dataAttr(elem, name, data[name]); - } - } - } - jQuery._data(elem, "parsedAttrs", true); - } - } - - return data; - } - - // Sets multiple values - if (typeof key === "object") { - return this.each(function () { - jQuery.data(this, key); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function () { - jQuery.data(this, key, value); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr(elem, key, jQuery.data(elem, key)) : undefined; - }, - - removeData: function (key) { - return this.each(function () { - jQuery.removeData(this, key); - }); - } - }); - - - jQuery.extend({ - queue: function (elem, type, data) { - var queue; - - if (elem) { - type = (type || "fx") + "queue"; - queue = jQuery._data(elem, type); - - // Speed up dequeue by getting out quickly if this is just a lookup - if (data) { - if (!queue || jQuery.isArray(data)) { - queue = jQuery._data(elem, type, jQuery.makeArray(data)); - } else { - queue.push(data); - } - } - return queue || []; - } - }, - - dequeue: function (elem, type) { - type = type || "fx"; - - var queue = jQuery.queue(elem, type), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks(elem, type), - next = function () { - jQuery.dequeue(elem, type); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if (fn === "inprogress") { - fn = queue.shift(); - startLength--; - } - - if (fn) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if (type === "fx") { - queue.unshift("inprogress"); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call(elem, next, hooks); - } - - if (!startLength && hooks) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function (elem, type) { - var key = type + "queueHooks"; - return jQuery._data(elem, key) || jQuery._data(elem, key, { - empty: jQuery.Callbacks("once memory").add(function () { - jQuery._removeData(elem, type + "queue"); - jQuery._removeData(elem, key); - }) - }); - } - }); - - jQuery.fn.extend({ - queue: function (type, data) { - var setter = 2; - - if (typeof type !== "string") { - data = type; - type = "fx"; - setter--; - } - - if (arguments.length < setter) { - return jQuery.queue(this[0], type); - } - - return data === undefined ? - this : - this.each(function () { - var queue = jQuery.queue(this, type, data); - - // ensure a hooks for this queue - jQuery._queueHooks(this, type); - - if (type === "fx" && queue[0] !== "inprogress") { - jQuery.dequeue(this, type); - } - }); - }, - dequeue: function (type) { - return this.each(function () { - jQuery.dequeue(this, type); - }); - }, - clearQueue: function (type) { - return this.queue(type || "fx", []); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function (type, obj) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function () { - if (!(--count)) { - defer.resolveWith(elements, [elements]); - } - }; - - if (typeof type !== "string") { - obj = type; - type = undefined; - } - type = type || "fx"; - - while (i--) { - tmp = jQuery._data(elements[i], type + "queueHooks"); - if (tmp && tmp.empty) { - count++; - tmp.empty.add(resolve); - } - } - resolve(); - return defer.promise(obj); - } - }); - var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - - var cssExpand = ["Top", "Right", "Bottom", "Left"]; - - var isHidden = function (elem, el) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem); - }; - - - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - var access = jQuery.access = function (elems, fn, key, value, chainable, emptyGet, raw) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if (jQuery.type(key) === "object") { - chainable = true; - for (i in key) { - jQuery.access(elems, fn, i, key[i], true, emptyGet, raw); - } - - // Sets one value - } else if (value !== undefined) { - chainable = true; - - if (!jQuery.isFunction(value)) { - raw = true; - } - - if (bulk) { - // Bulk operations run against the entire set - if (raw) { - fn.call(elems, value); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function (elem, key, value) { - return bulk.call(jQuery(elem), value); - }; - } - } - - if (fn) { - for (; i < length; i++) { - fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key))); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call(elems) : - length ? fn(elems[0], key) : emptyGet; - }; - var rcheckableType = (/^(?:checkbox|radio)$/i); - - - - (function () { - // Minified: var a,b,c - var input = document.createElement("input"), - div = document.createElement("div"), - fragment = document.createDocumentFragment(); - - // Setup - div.innerHTML = "
    a"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName("tbody").length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName("link").length; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = - document.createElement("nav").cloneNode(true).outerHTML !== "<:nav>"; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - input.type = "checkbox"; - input.checked = true; - fragment.appendChild(input); - support.appendChecked = input.checked; - - // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE6-IE11+ - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; - - // #11217 - WebKit loses check when the name is after the checked attribute - fragment.appendChild(div); - div.innerHTML = ""; - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - support.noCloneEvent = true; - if (div.attachEvent) { - div.attachEvent("onclick", function () { - support.noCloneEvent = false; - }); - - div.cloneNode(true).click(); - } - - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch (e) { - support.deleteExpando = false; - } - } - })(); - - - (function () { - var i, eventName, - div = document.createElement("div"); - - // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) - for (i in { submit: true, change: true, focusin: true }) { - eventName = "on" + i; - - if (!(support[i + "Bubbles"] = eventName in window)) { - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - div.setAttribute(eventName, "t"); - support[i + "Bubbles"] = div.attributes[eventName].expando === false; - } - } - - // Null elements to avoid leaks in IE. - div = null; - })(); - - - var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - - function returnTrue() { - return true; - } - - function returnFalse() { - return false; - } - - function safeActiveElement() { - try { - return document.activeElement; - } catch (err) { } - } - - /* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ - jQuery.event = { - - global: {}, - - add: function (elem, types, handler, data, selector) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data(elem); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if (!elemData) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if (handler.handler) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if (!handler.guid) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if (!(events = elemData.events)) { - events = elemData.events = {}; - } - if (!(eventHandle = elemData.handle)) { - eventHandle = elemData.handle = function (e) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply(eventHandle.elem, arguments) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = (types || "").match(rnotwhite) || [""]; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || "").split(".").sort(); - - // There *must* be a type, no attaching namespace-only handlers - if (!type) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[type] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = (selector ? special.delegateType : special.bindType) || type; - - // Update special based on newly reset type - special = jQuery.event.special[type] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test(selector), - namespace: namespaces.join(".") - }, handleObjIn); - - // Init the event handler queue if we're the first - if (!(handlers = events[type])) { - handlers = events[type] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { - // Bind the global event handler to the element - if (elem.addEventListener) { - elem.addEventListener(type, eventHandle, false); - - } else if (elem.attachEvent) { - elem.attachEvent("on" + type, eventHandle); - } - } - } - - if (special.add) { - special.add.call(elem, handleObj); - - if (!handleObj.handler.guid) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if (selector) { - handlers.splice(handlers.delegateCount++, 0, handleObj); - } else { - handlers.push(handleObj); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[type] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function (elem, types, handler, selector, mappedTypes) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData(elem) && jQuery._data(elem); - - if (!elemData || !(events = elemData.events)) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = (types || "").match(rnotwhite) || [""]; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || "").split(".").sort(); - - // Unbind all events (on this namespace, if provided) for the element - if (!type) { - for (type in events) { - jQuery.event.remove(elem, type + types[t], handler, selector, true); - } - continue; - } - - special = jQuery.event.special[type] || {}; - type = (selector ? special.delegateType : special.bindType) || type; - handlers = events[type] || []; - tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); - - // Remove matching events - origCount = j = handlers.length; - while (j--) { - handleObj = handlers[j]; - - if ((mappedTypes || origType === handleObj.origType) && - (!handler || handler.guid === handleObj.guid) && - (!tmp || tmp.test(handleObj.namespace)) && - (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { - handlers.splice(j, 1); - - if (handleObj.selector) { - handlers.delegateCount--; - } - if (special.remove) { - special.remove.call(elem, handleObj); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if (origCount && !handlers.length) { - if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) { - jQuery.removeEvent(elem, type, elemData.handle); - } - - delete events[type]; - } - } - - // Remove the expando if it's no longer used - if (jQuery.isEmptyObject(events)) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData(elem, "events"); - } - }, - - trigger: function (event, data, elem, onlyHandlers) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [elem || document], - type = hasOwn.call(event, "type") ? event.type : event, - namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if (elem.nodeType === 3 || elem.nodeType === 8) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if (rfocusMorph.test(type + jQuery.event.triggered)) { - return; - } - - if (type.indexOf(".") >= 0) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[jQuery.expando] ? - event : - new jQuery.Event(type, typeof event === "object" && event); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if (!event.target) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [event] : - jQuery.makeArray(data, [event]); - - // Allow special events to draw outside the lines - special = jQuery.event.special[type] || {}; - if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) { - - bubbleType = special.delegateType || type; - if (!rfocusMorph.test(bubbleType + type)) { - cur = cur.parentNode; - } - for (; cur; cur = cur.parentNode) { - eventPath.push(cur); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if (tmp === (elem.ownerDocument || document)) { - eventPath.push(tmp.defaultView || tmp.parentWindow || window); - } - } - - // Fire handlers on the event path - i = 0; - while ((cur = eventPath[i++]) && !event.isPropagationStopped()) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle"); - if (handle) { - handle.apply(cur, data); - } - - // Native handler - handle = ontype && cur[ontype]; - if (handle && handle.apply && jQuery.acceptData(cur)) { - event.result = handle.apply(cur, data); - if (event.result === false) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if (!onlyHandlers && !event.isDefaultPrevented()) { - - if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && - jQuery.acceptData(elem)) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if (ontype && elem[type] && !jQuery.isWindow(elem)) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ontype]; - - if (tmp) { - elem[ontype] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[type](); - } catch (e) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if (tmp) { - elem[ontype] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function (event) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix(event); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = slice.call(arguments), - handlers = (jQuery._data(this, "events") || {})[event.type] || [], - special = jQuery.event.special[event.type] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if (special.preDispatch && special.preDispatch.call(this, event) === false) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call(this, event, handlers); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { - event.currentTarget = matched.elem; - - j = 0; - while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if (!event.namespace_re || event.namespace_re.test(handleObj.namespace)) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler) - .apply(matched.elem, args); - - if (ret !== undefined) { - if ((event.result = ret) === false) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if (special.postDispatch) { - special.postDispatch.call(this, event); - } - - return event.result; - }, - - handlers: function (event, handlers) { - var sel, handleObj, matches, i, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if (delegateCount && cur.nodeType && (!event.button || event.type !== "click")) { - - /* jshint eqeqeq: false */ - for (; cur != this; cur = cur.parentNode || this) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) { - matches = []; - for (i = 0; i < delegateCount; i++) { - handleObj = handlers[i]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if (matches[sel] === undefined) { - matches[sel] = handleObj.needsContext ? - jQuery(sel, this).index(cur) >= 0 : - jQuery.find(sel, this, null, [cur]).length; - } - if (matches[sel]) { - matches.push(handleObj); - } - } - if (matches.length) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if (delegateCount < handlers.length) { - handlerQueue.push({ elem: this, handlers: handlers.slice(delegateCount) }); - } - - return handlerQueue; - }, - - fix: function (event) { - if (event[jQuery.expando]) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[type]; - - if (!fixHook) { - this.fixHooks[type] = fixHook = - rmouseEvent.test(type) ? this.mouseHooks : - rkeyEvent.test(type) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat(fixHook.props) : this.props; - - event = new jQuery.Event(originalEvent); - - i = copy.length; - while (i--) { - prop = copy[i]; - event[prop] = originalEvent[prop]; - } - - // Support: IE<9 - // Fix target property (#1925) - if (!event.target) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if (event.target.nodeType === 3) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter(event, originalEvent) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function (event, original) { - - // Add which for key events - if (event.which == null) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function (event, original) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if (event.pageX == null && original.clientX != null) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add relatedTarget, if necessary - if (!event.relatedTarget && fromElement) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if (!event.which && button !== undefined) { - event.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); - } - - return event; - } - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function () { - if (this !== safeActiveElement() && this.focus) { - try { - this.focus(); - return false; - } catch (e) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function () { - if (this === safeActiveElement() && this.blur) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function () { - if (jQuery.nodeName(this, "input") && this.type === "checkbox" && this.click) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function (event) { - return jQuery.nodeName(event.target, "a"); - } - }, - - beforeunload: { - postDispatch: function (event) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if (event.result !== undefined && event.originalEvent) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function (type, elem, event, bubble) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if (bubble) { - jQuery.event.trigger(e, null, elem); - } else { - jQuery.event.dispatch.call(elem, e); - } - if (e.isDefaultPrevented()) { - event.preventDefault(); - } - } - }; - - jQuery.removeEvent = document.removeEventListener ? - function (elem, type, handle) { - if (elem.removeEventListener) { - elem.removeEventListener(type, handle, false); - } - } : - function (elem, type, handle) { - var name = "on" + type; - - if (elem.detachEvent) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if (typeof elem[name] === strundefined) { - elem[name] = null; - } - - elem.detachEvent(name, handle); - } - }; - - jQuery.Event = function (src, props) { - // Allow instantiation without the 'new' keyword - if (!(this instanceof jQuery.Event)) { - return new jQuery.Event(src, props); - } - - // Event object - if (src && src.type) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - // Support: IE < 9, Android < 4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if (props) { - jQuery.extend(this, props); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[jQuery.expando] = true; - }; - - // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding - // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html - jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function () { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if (!e) { - return; - } - - // If preventDefault exists, run it on the original event - if (e.preventDefault) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function () { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - if (!e) { - return; - } - // If stopPropagation exists, run it on the original event - if (e.stopPropagation) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function () { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if (e && e.stopImmediatePropagation) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } - }; - - // Create mouseenter/leave events using mouseover/out and event-time checks - jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function (orig, fix) { - jQuery.event.special[orig] = { - delegateType: fix, - bindType: fix, - - handle: function (event) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if (!related || (related !== target && !jQuery.contains(target, related))) { - event.type = handleObj.origType; - ret = handleObj.handler.apply(this, arguments); - event.type = fix; - } - return ret; - } - }; - }); - - // IE submit delegation - if (!support.submitBubbles) { - - jQuery.event.special.submit = { - setup: function () { - // Only need this for delegated form submit events - if (jQuery.nodeName(this, "form")) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add(this, "click._submit keypress._submit", function (e) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.form : undefined; - if (form && !jQuery._data(form, "submitBubbles")) { - jQuery.event.add(form, "submit._submit", function (event) { - event._submit_bubble = true; - }); - jQuery._data(form, "submitBubbles", true); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function (event) { - // If form was submitted by the user, bubble the event up the tree - if (event._submit_bubble) { - delete event._submit_bubble; - if (this.parentNode && !event.isTrigger) { - jQuery.event.simulate("submit", this.parentNode, event, true); - } - } - }, - - teardown: function () { - // Only need this for delegated form submit events - if (jQuery.nodeName(this, "form")) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove(this, "._submit"); - } - }; - } - - // IE change delegation and checkbox/radio fix - if (!support.changeBubbles) { - - jQuery.event.special.change = { - - setup: function () { - - if (rformElems.test(this.nodeName)) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if (this.type === "checkbox" || this.type === "radio") { - jQuery.event.add(this, "propertychange._change", function (event) { - if (event.originalEvent.propertyName === "checked") { - this._just_changed = true; - } - }); - jQuery.event.add(this, "click._change", function (event) { - if (this._just_changed && !event.isTrigger) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate("change", this, event, true); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add(this, "beforeactivate._change", function (e) { - var elem = e.target; - - if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "changeBubbles")) { - jQuery.event.add(elem, "change._change", function (event) { - if (this.parentNode && !event.isSimulated && !event.isTrigger) { - jQuery.event.simulate("change", this.parentNode, event, true); - } - }); - jQuery._data(elem, "changeBubbles", true); - } - }); - }, - - handle: function (event) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if (this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox")) { - return event.handleObj.handler.apply(this, arguments); - } - }, - - teardown: function () { - jQuery.event.remove(this, "._change"); - - return !rformElems.test(this.nodeName); - } - }; - } - - // Create "bubbling" focus and blur events - if (!support.focusinBubbles) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function (event) { - jQuery.event.simulate(fix, event.target, jQuery.event.fix(event), true); - }; - - jQuery.event.special[fix] = { - setup: function () { - var doc = this.ownerDocument || this, - attaches = jQuery._data(doc, fix); - - if (!attaches) { - doc.addEventListener(orig, handler, true); - } - jQuery._data(doc, fix, (attaches || 0) + 1); - }, - teardown: function () { - var doc = this.ownerDocument || this, - attaches = jQuery._data(doc, fix) - 1; - - if (!attaches) { - doc.removeEventListener(orig, handler, true); - jQuery._removeData(doc, fix); - } else { - jQuery._data(doc, fix, attaches); - } - } - }; - }); - } - - jQuery.fn.extend({ - - on: function (types, selector, data, fn, /*INTERNAL*/ one) { - var type, origFn; - - // Types can be a map of types/handlers - if (typeof types === "object") { - // ( types-Object, selector, data ) - if (typeof selector !== "string") { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for (type in types) { - this.on(type, selector, data, types[type], one); - } - return this; - } - - if (data == null && fn == null) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if (fn == null) { - if (typeof selector === "string") { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if (fn === false) { - fn = returnFalse; - } else if (!fn) { - return this; - } - - if (one === 1) { - origFn = fn; - fn = function (event) { - // Can use an empty set, since event contains the info - jQuery().off(event); - return origFn.apply(this, arguments); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); - } - return this.each(function () { - jQuery.event.add(this, types, fn, data, selector); - }); - }, - one: function (types, selector, data, fn) { - return this.on(types, selector, data, fn, 1); - }, - off: function (types, selector, fn) { - var handleObj, type; - if (types && types.preventDefault && types.handleObj) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery(types.delegateTarget).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if (typeof types === "object") { - // ( types-object [, selector] ) - for (type in types) { - this.off(type, selector, types[type]); - } - return this; - } - if (selector === false || typeof selector === "function") { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if (fn === false) { - fn = returnFalse; - } - return this.each(function () { - jQuery.event.remove(this, types, fn, selector); - }); - }, - - trigger: function (type, data) { - return this.each(function () { - jQuery.event.trigger(type, data, this); - }); - }, - triggerHandler: function (type, data) { - var elem = this[0]; - if (elem) { - return jQuery.event.trigger(type, data, elem, true); - } - } - }); - - - function createSafeFragment(document) { - var list = nodeNames.split("|"), - safeFrag = document.createDocumentFragment(); - - if (safeFrag.createElement) { - while (list.length) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; - } - - var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [1, ""], - legend: [1, "
    ", "
    "], - area: [1, "", ""], - param: [1, "", ""], - thead: [1, "", "
    "], - tr: [2, "", "
    "], - col: [2, "", "
    "], - td: [3, "", "
    "], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: support.htmlSerialize ? [0, "", ""] : [1, "X
    ", "
    "] - }, - safeFragment = createSafeFragment(document), - fragmentDiv = safeFragment.appendChild(document.createElement("div")); - - wrapMap.optgroup = wrapMap.option; - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; - wrapMap.th = wrapMap.td; - - function getAll(context, tag) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName(tag || "*") : - typeof context.querySelectorAll !== strundefined ? context.querySelectorAll(tag || "*") : - undefined; - - if (!found) { - for (found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++) { - if (!tag || jQuery.nodeName(elem, tag)) { - found.push(elem); - } else { - jQuery.merge(found, getAll(elem, tag)); - } - } - } - - return tag === undefined || tag && jQuery.nodeName(context, tag) ? - jQuery.merge([context], found) : - found; - } - - // Used in buildFragment, fixes the defaultChecked property - function fixDefaultChecked(elem) { - if (rcheckableType.test(elem.type)) { - elem.defaultChecked = elem.checked; - } - } - - // Support: IE<8 - // Manipulating tables requires a tbody - function manipulationTarget(elem, content) { - return jQuery.nodeName(elem, "table") && - jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild(elem.ownerDocument.createElement("tbody")) : - elem; - } - - // Replace/restore the type attribute of script elements for safe DOM manipulation - function disableScript(elem) { - elem.type = (jQuery.find.attr(elem, "type") !== null) + "/" + elem.type; - return elem; - } - function restoreScript(elem) { - var match = rscriptTypeMasked.exec(elem.type); - if (match) { - elem.type = match[1]; - } else { - elem.removeAttribute("type"); - } - return elem; - } - - // Mark scripts as having already been evaluated - function setGlobalEval(elems, refElements) { - var elem, - i = 0; - for (; (elem = elems[i]) != null; i++) { - jQuery._data(elem, "globalEval", !refElements || jQuery._data(refElements[i], "globalEval")); - } - } - - function cloneCopyEvent(src, dest) { - - if (dest.nodeType !== 1 || !jQuery.hasData(src)) { - return; - } - - var type, i, l, - oldData = jQuery._data(src), - curData = jQuery._data(dest, oldData), - events = oldData.events; - - if (events) { - delete curData.handle; - curData.events = {}; - - for (type in events) { - for (i = 0, l = events[type].length; i < l; i++) { - jQuery.event.add(dest, type, events[type][i]); - } - } - } - - // make the cloned public data object a copy from the original - if (curData.data) { - curData.data = jQuery.extend({}, curData.data); - } - } - - function fixCloneNodeIssues(src, dest) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if (dest.nodeType !== 1) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if (!support.noCloneEvent && dest[jQuery.expando]) { - data = jQuery._data(dest); - - for (e in data.events) { - jQuery.removeEvent(dest, e, data.handle); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute(jQuery.expando); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if (nodeName === "script" && dest.text !== src.text) { - disableScript(dest).text = src.text; - restoreScript(dest); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if (nodeName === "object") { - if (dest.parentNode) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if (support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML))) { - dest.innerHTML = src.innerHTML; - } - - } else if (nodeName === "input" && rcheckableType.test(src.type)) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if (dest.value !== src.value) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if (nodeName === "option") { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if (nodeName === "input" || nodeName === "textarea") { - dest.defaultValue = src.defaultValue; - } - } - - jQuery.extend({ - clone: function (elem, dataAndEvents, deepDataAndEvents) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains(elem.ownerDocument, elem); - - if (support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) { - clone = elem.cloneNode(true); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild(clone = fragmentDiv.firstChild); - } - - if ((!support.noCloneEvent || !support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll(clone); - srcElements = getAll(elem); - - // Fix all IE cloning issues - for (i = 0; (node = srcElements[i]) != null; ++i) { - // Ensure that the destination node is not null; Fixes #9587 - if (destElements[i]) { - fixCloneNodeIssues(node, destElements[i]); - } - } - } - - // Copy the events from the original to the clone - if (dataAndEvents) { - if (deepDataAndEvents) { - srcElements = srcElements || getAll(elem); - destElements = destElements || getAll(clone); - - for (i = 0; (node = srcElements[i]) != null; i++) { - cloneCopyEvent(node, destElements[i]); - } - } else { - cloneCopyEvent(elem, clone); - } - } - - // Preserve script evaluation history - destElements = getAll(clone, "script"); - if (destElements.length > 0) { - setGlobalEval(destElements, !inPage && getAll(elem, "script")); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - buildFragment: function (elems, context, scripts, selection) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment(context), - - nodes = [], - i = 0; - - for (; i < l; i++) { - elem = elems[i]; - - if (elem || elem === 0) { - - // Add nodes directly - if (jQuery.type(elem) === "object") { - jQuery.merge(nodes, elem.nodeType ? [elem] : elem); - - // Convert non-html into a text node - } else if (!rhtml.test(elem)) { - nodes.push(context.createTextNode(elem)); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild(context.createElement("div")); - - // Deserialize a standard representation - tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); - wrap = wrapMap[tag] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace(rxhtmlTag, "<$1>") + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while (j--) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if (!support.leadingWhitespace && rleadingWhitespace.test(elem)) { - nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0])); - } - - // Remove IE's autoinserted from table fragments - if (!support.tbody) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test(elem) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
    " && !rtbody.test(elem) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while (j--) { - if (jQuery.nodeName((tbody = elem.childNodes[j]), "tbody") && !tbody.childNodes.length) { - elem.removeChild(tbody); - } - } - } - - jQuery.merge(nodes, tmp.childNodes); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while (tmp.firstChild) { - tmp.removeChild(tmp.firstChild); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if (tmp) { - safe.removeChild(tmp); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if (!support.appendChecked) { - jQuery.grep(getAll(nodes, "input"), fixDefaultChecked); - } - - i = 0; - while ((elem = nodes[i++])) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if (selection && jQuery.inArray(elem, selection) !== -1) { - continue; - } - - contains = jQuery.contains(elem.ownerDocument, elem); - - // Append to fragment - tmp = getAll(safe.appendChild(elem), "script"); - - // Preserve script evaluation history - if (contains) { - setGlobalEval(tmp); - } - - // Capture executables - if (scripts) { - j = 0; - while ((elem = tmp[j++])) { - if (rscriptType.test(elem.type || "")) { - scripts.push(elem); - } - } - } - } - - tmp = null; - - return safe; - }, - - cleanData: function (elems, /* internal */ acceptData) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = support.deleteExpando, - special = jQuery.event.special; - - for (; (elem = elems[i]) != null; i++) { - if (acceptData || jQuery.acceptData(elem)) { - - id = elem[internalKey]; - data = id && cache[id]; - - if (data) { - if (data.events) { - for (type in data.events) { - if (special[type]) { - jQuery.event.remove(elem, type); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent(elem, type, data.handle); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if (cache[id]) { - - delete cache[id]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if (deleteExpando) { - delete elem[internalKey]; - - } else if (typeof elem.removeAttribute !== strundefined) { - elem.removeAttribute(internalKey); - - } else { - elem[internalKey] = null; - } - - deletedIds.push(id); - } - } - } - } - } - }); - - jQuery.fn.extend({ - text: function (value) { - return access(this, function (value) { - return value === undefined ? - jQuery.text(this) : - this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value)); - }, null, value, arguments.length); - }, - - append: function () { - return this.domManip(arguments, function (elem) { - if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { - var target = manipulationTarget(this, elem); - target.appendChild(elem); - } - }); - }, - - prepend: function () { - return this.domManip(arguments, function (elem) { - if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { - var target = manipulationTarget(this, elem); - target.insertBefore(elem, target.firstChild); - } - }); - }, - - before: function () { - return this.domManip(arguments, function (elem) { - if (this.parentNode) { - this.parentNode.insertBefore(elem, this); - } - }); - }, - - after: function () { - return this.domManip(arguments, function (elem) { - if (this.parentNode) { - this.parentNode.insertBefore(elem, this.nextSibling); - } - }); - }, - - remove: function (selector, keepData /* Internal Use Only */) { - var elem, - elems = selector ? jQuery.filter(selector, this) : this, - i = 0; - - for (; (elem = elems[i]) != null; i++) { - - if (!keepData && elem.nodeType === 1) { - jQuery.cleanData(getAll(elem)); - } - - if (elem.parentNode) { - if (keepData && jQuery.contains(elem.ownerDocument, elem)) { - setGlobalEval(getAll(elem, "script")); - } - elem.parentNode.removeChild(elem); - } - } - - return this; - }, - - empty: function () { - var elem, - i = 0; - - for (; (elem = this[i]) != null; i++) { - // Remove element nodes and prevent memory leaks - if (elem.nodeType === 1) { - jQuery.cleanData(getAll(elem, false)); - } - - // Remove any remaining nodes - while (elem.firstChild) { - elem.removeChild(elem.firstChild); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if (elem.options && jQuery.nodeName(elem, "select")) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function (dataAndEvents, deepDataAndEvents) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function () { - return jQuery.clone(this, dataAndEvents, deepDataAndEvents); - }); - }, - - html: function (value) { - return access(this, function (value) { - var elem = this[0] || {}, - i = 0, - l = this.length; - - if (value === undefined) { - return elem.nodeType === 1 ? - elem.innerHTML.replace(rinlinejQuery, "") : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if (typeof value === "string" && !rnoInnerhtml.test(value) && - (support.htmlSerialize || !rnoshimcache.test(value)) && - (support.leadingWhitespace || !rleadingWhitespace.test(value)) && - !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { - - value = value.replace(rxhtmlTag, "<$1>"); - - try { - for (; i < l; i++) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if (elem.nodeType === 1) { - jQuery.cleanData(getAll(elem, false)); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch (e) { } - } - - if (elem) { - this.empty().append(value); - } - }, null, value, arguments.length); - }, - - replaceWith: function () { - var arg = arguments[0]; - - // Make the changes, replacing each context element with the new content - this.domManip(arguments, function (elem) { - arg = this.parentNode; - - jQuery.cleanData(getAll(this)); - - if (arg) { - arg.replaceChild(elem, this); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function (selector) { - return this.remove(selector, true); - }, - - domManip: function (args, callback) { - - // Flatten any nested arrays - args = concat.apply([], args); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction(value); - - // We can't cloneNode fragments that contain checked, in WebKit - if (isFunction || - (l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test(value))) { - return this.each(function (index) { - var self = set.eq(index); - if (isFunction) { - args[0] = value.call(this, index, self.html()); - } - self.domManip(args, callback); - }); - } - - if (l) { - fragment = jQuery.buildFragment(args, this[0].ownerDocument, false, this); - first = fragment.firstChild; - - if (fragment.childNodes.length === 1) { - fragment = first; - } - - if (first) { - scripts = jQuery.map(getAll(fragment, "script"), disableScript); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for (; i < l; i++) { - node = fragment; - - if (i !== iNoClone) { - node = jQuery.clone(node, true, true); - - // Keep references to cloned scripts for later restoration - if (hasScripts) { - jQuery.merge(scripts, getAll(node, "script")); - } - } - - callback.call(this[i], node, i); - } - - if (hasScripts) { - doc = scripts[scripts.length - 1].ownerDocument; - - // Reenable scripts - jQuery.map(scripts, restoreScript); - - // Evaluate executable scripts on first document insertion - for (i = 0; i < hasScripts; i++) { - node = scripts[i]; - if (rscriptType.test(node.type || "") && - !jQuery._data(node, "globalEval") && jQuery.contains(doc, node)) { - - if (node.src) { - // Optional AJAX dependency, but won't run scripts if not present - if (jQuery._evalUrl) { - jQuery._evalUrl(node.src); - } - } else { - jQuery.globalEval((node.text || node.textContent || node.innerHTML || "").replace(rcleanScript, "")); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return this; - } - }); - - jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function (name, original) { - jQuery.fn[name] = function (selector) { - var elems, - i = 0, - ret = [], - insert = jQuery(selector), - last = insert.length - 1; - - for (; i <= last; i++) { - elems = i === last ? this : this.clone(true); - jQuery(insert[i])[original](elems); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - push.apply(ret, elems.get()); - } - - return this.pushStack(ret); - }; - }); - - - var iframe, - elemdisplay = {}; - - /** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ - // Called only from within defaultDisplay - function actualDisplay(name, doc) { - var style, - elem = jQuery(doc.createElement(name)).appendTo(doc.body), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && (style = window.getDefaultComputedStyle(elem[0])) ? - - // Use of this method is a temporary fix (more like optmization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css(elem[0], "display"); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; - } - - /** - * Try to determine the default display value of an element - * @param {String} nodeName - */ - function defaultDisplay(nodeName) { - var doc = document, - display = elemdisplay[nodeName]; - - if (!display) { - display = actualDisplay(nodeName, doc); - - // If the simple way fails, read from inside an iframe - if (display === "none" || !display) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery("

    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π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 literal 0 HcmV?d00001 diff --git a/_examples/tutorial/mongodb/3_get_movie.png b/_examples/tutorial/mongodb/3_get_movie.png new file mode 100644 index 0000000000000000000000000000000000000000..71eca41ed0130821a783a6e3707395a9e0f6cded GIT binary patch literal 85269 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 z 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 literal 0 HcmV?d00001 diff --git a/_examples/tutorial/mongodb/4_delete_movie.png b/_examples/tutorial/mongodb/4_delete_movie.png new file mode 100644 index 0000000000000000000000000000000000000000..185b730a711e86cb6fa3f2930c1e5decbeca2ab9 GIT binary patch literal 49580 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 literal 0 HcmV?d00001 diff --git a/_examples/tutorial/mongodb/README.md b/_examples/tutorial/mongodb/README.md new file mode 100644 index 00000000..644a93d0 --- /dev/null +++ b/_examples/tutorial/mongodb/README.md @@ -0,0 +1,58 @@ +# Build RESTful API with the official MongoDB Go Driver and Iris + +Article is coming soon, follow and stay tuned + +- +- + +Read [the fully functional example](main.go). + +```sh +$ go get -u github.com/mongodb/mongo-go-driver +$ go get -u github.com/joho/godotenv +``` + + +```sh +# .env file contents +PORT=8080 +DSN=mongodb://localhost:27017 +``` + +```sh +$ go run main.go +> 2019/01/28 05:17:59 Loading environment variables from file: .env +> 2019/01/28 05:17:59 ◽ PORT=8080 +> 2019/01/28 05:17:59 ◽ DSN=mongodb://localhost:27017 +> Now listening on: http://localhost:8080 +``` + +```sh +GET : http://localhost:8080/api/store/movies +POST : http://localhost:8080/api/store/movies +GET : http://localhost:8080/api/store/movies/{id} +PUT : http://localhost:8080/api/store/movies/{id} +DELETE : http://localhost:8080/api/store/movies/{id} +``` + +## Screens + +### Add a Movie +![](0_create_movie.png) + +### Update a Movie + +![](1_update_movie.png) + +### Get all Movies + +![](2_get_all_movies.png) + +### Get a Movie by its ID + +![](3_get_movie.png) + +### Delete a Movie by its ID + +![](4_delete_movie.png) + diff --git a/_examples/tutorial/mongodb/api/store/movie.go b/_examples/tutorial/mongodb/api/store/movie.go new file mode 100644 index 00000000..2004d06c --- /dev/null +++ b/_examples/tutorial/mongodb/api/store/movie.go @@ -0,0 +1,101 @@ +package storeapi + +import ( + "github.com/kataras/iris/_examples/tutorial/mongodb/httputil" + "github.com/kataras/iris/_examples/tutorial/mongodb/store" + + "github.com/kataras/iris" +) + +type MovieHandler struct { + service store.MovieService +} + +func NewMovieHandler(service store.MovieService) *MovieHandler { + return &MovieHandler{service: service} +} + +func (h *MovieHandler) GetAll(ctx iris.Context) { + movies, err := h.service.GetAll(nil) + if err != nil { + httputil.InternalServerErrorJSON(ctx, err, "Server was unable to retrieve all movies") + return + } + + if movies == nil { + // will return "null" if empty, with this "trick" we return "[]" json. + movies = make([]store.Movie, 0) + } + + ctx.JSON(movies) +} + +func (h *MovieHandler) Get(ctx iris.Context) { + id := ctx.Params().Get("id") + + m, err := h.service.GetByID(nil, id) + if err != nil { + if err == store.ErrNotFound { + ctx.NotFound() + } else { + httputil.InternalServerErrorJSON(ctx, err, "Server was unable to retrieve movie [%s]", id) + } + return + } + + ctx.JSON(m) +} + +func (h *MovieHandler) Add(ctx iris.Context) { + m := new(store.Movie) + + err := ctx.ReadJSON(m) + if err != nil { + httputil.FailJSON(ctx, iris.StatusBadRequest, err, "Malformed request payload") + return + } + + err = h.service.Create(nil, m) + if err != nil { + httputil.InternalServerErrorJSON(ctx, err, "Server was unable to create a movie") + return + } + + ctx.StatusCode(iris.StatusCreated) + ctx.JSON(m) +} + +func (h *MovieHandler) Update(ctx iris.Context) { + id := ctx.Params().Get("id") + + var m store.Movie + err := ctx.ReadJSON(&m) + if err != nil { + httputil.FailJSON(ctx, iris.StatusBadRequest, err, "Malformed request payload") + return + } + + err = h.service.Update(nil, id, m) + if err != nil { + if err == store.ErrNotFound { + ctx.NotFound() + return + } + httputil.InternalServerErrorJSON(ctx, err, "Server was unable to update movie [%s]", id) + return + } +} + +func (h *MovieHandler) Delete(ctx iris.Context) { + id := ctx.Params().Get("id") + + err := h.service.Delete(nil, id) + if err != nil { + if err == store.ErrNotFound { + ctx.NotFound() + return + } + httputil.InternalServerErrorJSON(ctx, err, "Server was unable to delete movie [%s]", id) + return + } +} diff --git a/_examples/tutorial/mongodb/env/env.go b/_examples/tutorial/mongodb/env/env.go new file mode 100644 index 00000000..24ead415 --- /dev/null +++ b/_examples/tutorial/mongodb/env/env.go @@ -0,0 +1,71 @@ +package env + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/joho/godotenv" +) + +var ( + // Port is the PORT environment variable or 8080 if missing. + // Used to open the tcp listener for our web server. + Port string + // DSN is the DSN environment variable or mongodb://localhost:27017 if missing. + // Used to connect to the mongodb. + DSN string +) + +func parse() { + Port = getDefault("PORT", "8080") + DSN = getDefault("DSN", "mongodb://localhost:27017") +} + +// Load loads environment variables that are being used across the whole app. +// Loading from file(s), i.e .env or dev.env +// +// Example of a 'dev.env': +// PORT=8080 +// DSN=mongodb://localhost:27017 +// +// After `Load` the callers can get an environment variable via `os.Getenv`. +func Load(envFileName string) { + if args := os.Args; len(args) > 1 && args[1] == "help" { + fmt.Fprintln(os.Stderr, "https://github.com/kataras/iris/blob/master/_examples/tutorials/mongodb/README.md") + os.Exit(-1) + } + + log.Printf("Loading environment variables from file: %s\n", envFileName) + // If more than one filename passed with comma separated then load from all + // of these, a env file can be a partial too. + envFiles := strings.Split(envFileName, ",") + for i := range envFiles { + if filepath.Ext(envFiles[i]) == "" { + envFiles[i] += ".env" + } + } + + if err := godotenv.Load(envFiles...); err != nil { + panic(fmt.Sprintf("error loading environment variables from [%s]: %v", envFileName, err)) + } + + envMap, _ := godotenv.Read(envFiles...) + for k, v := range envMap { + log.Printf("◽ %s=%s\n", k, v) + } + + parse() +} + +func getDefault(key string, def string) string { + value := os.Getenv(key) + if value == "" { + os.Setenv(key, def) + value = def + } + + return value +} diff --git a/_examples/tutorial/mongodb/httputil/error.go b/_examples/tutorial/mongodb/httputil/error.go new file mode 100644 index 00000000..5bf7837b --- /dev/null +++ b/_examples/tutorial/mongodb/httputil/error.go @@ -0,0 +1,130 @@ +package httputil + +import ( + "errors" + "fmt" + "io" + "net/http" + "os" + "runtime" + "runtime/debug" + "strings" + "time" + + "github.com/kataras/iris" +) + +var validStackFuncs = []func(string) bool{ + func(file string) bool { + return strings.Contains(file, "/mongodb/api/") + }, +} + +// RuntimeCallerStack returns the app's `file:line` stacktrace +// to give more information about an error cause. +func RuntimeCallerStack() (s string) { + var pcs [10]uintptr + n := runtime.Callers(1, pcs[:]) + frames := runtime.CallersFrames(pcs[:n]) + + for { + frame, more := frames.Next() + for _, fn := range validStackFuncs { + if fn(frame.File) { + s += fmt.Sprintf("\n\t\t\t%s:%d", frame.File, frame.Line) + } + } + + if !more { + break + } + } + + return s +} + +// HTTPError describes an HTTP error. +type HTTPError struct { + error + Stack string `json:"-"` // the whole stacktrace. + CallerStack string `json:"-"` // the caller, file:lineNumber + When time.Time `json:"-"` // the time that the error occurred. + // ErrorCode int: maybe a collection of known error codes. + StatusCode int `json:"statusCode"` + // could be named as "reason" as well + // it's the message of the error. + Description string `json:"description"` +} + +func newError(statusCode int, err error, format string, args ...interface{}) HTTPError { + if format == "" { + format = http.StatusText(statusCode) + } + + desc := fmt.Sprintf(format, args...) + if err == nil { + err = errors.New(desc) + } + + return HTTPError{ + err, + string(debug.Stack()), + RuntimeCallerStack(), + time.Now(), + statusCode, + desc, + } +} + +func (err HTTPError) writeHeaders(ctx iris.Context) { + ctx.StatusCode(err.StatusCode) + ctx.Header("X-Content-Type-Options", "nosniff") +} + +// LogFailure will print out the failure to the "logger". +func LogFailure(logger io.Writer, ctx iris.Context, err HTTPError) { + timeFmt := err.When.Format("2006/01/02 15:04:05") + firstLine := fmt.Sprintf("%s %s: %s", timeFmt, http.StatusText(err.StatusCode), err.Error()) + whitespace := strings.Repeat(" ", len(timeFmt)+1) + fmt.Fprintf(logger, "%s\n%sIP: %s\n%sURL: %s\n%sSource: %s\n", + firstLine, whitespace, ctx.RemoteAddr(), whitespace, ctx.FullRequestURI(), whitespace, err.CallerStack) +} + +// Fail will send the status code, write the error's reason +// and return the HTTPError for further use, i.e logging, see `InternalServerError`. +func Fail(ctx iris.Context, statusCode int, err error, format string, args ...interface{}) HTTPError { + httpErr := newError(statusCode, err, format, args...) + httpErr.writeHeaders(ctx) + + ctx.WriteString(httpErr.Description) + return httpErr +} + +// FailJSON will send to the client the error data as JSON. +// Useful for APIs. +func FailJSON(ctx iris.Context, statusCode int, err error, format string, args ...interface{}) HTTPError { + httpErr := newError(statusCode, err, format, args...) + httpErr.writeHeaders(ctx) + + ctx.JSON(httpErr) + + return httpErr +} + +// InternalServerError logs to the server's terminal +// and dispatches to the client the 500 Internal Server Error. +// Internal Server errors are critical, so we log them to the `os.Stderr`. +func InternalServerError(ctx iris.Context, err error, format string, args ...interface{}) { + LogFailure(os.Stderr, ctx, Fail(ctx, iris.StatusInternalServerError, err, format, args...)) +} + +// InternalServerErrorJSON acts exactly like `InternalServerError` but instead it sends the data as JSON. +// Useful for APIs. +func InternalServerErrorJSON(ctx iris.Context, err error, format string, args ...interface{}) { + LogFailure(os.Stderr, ctx, FailJSON(ctx, iris.StatusInternalServerError, err, format, args...)) +} + +// UnauthorizedJSON sends JSON format of StatusUnauthorized(401) HTTPError value. +func UnauthorizedJSON(ctx iris.Context, err error, format string, args ...interface{}) HTTPError { + return FailJSON(ctx, iris.StatusUnauthorized, err, format, args...) +} diff --git a/_examples/tutorial/mongodb/main.go b/_examples/tutorial/mongodb/main.go new file mode 100644 index 00000000..56702ebd --- /dev/null +++ b/_examples/tutorial/mongodb/main.go @@ -0,0 +1,81 @@ +package main + +// go get -u github.com/mongodb/mongo-go-driver +// go get -u github.com/joho/godotenv + +import ( + "context" + "flag" + "fmt" + "log" + "os" + + // APIs + storeapi "github.com/kataras/iris/_examples/tutorial/mongodb/api/store" + + // + "github.com/kataras/iris/_examples/tutorial/mongodb/env" + "github.com/kataras/iris/_examples/tutorial/mongodb/store" + + "github.com/kataras/iris" + + "github.com/mongodb/mongo-go-driver/mongo" +) + +const version = "0.0.1" + +func init() { + var envFileName = ".env" + + flagset := flag.CommandLine + flagset.StringVar(&envFileName, "env", envFileName, "the env file which web app will use to extract its environment variables") + flag.CommandLine.Parse(os.Args[1:]) + + env.Load(envFileName) +} + +func main() { + client, err := mongo.Connect(context.Background(), env.DSN) + if err != nil { + log.Fatal(err) + } + + err = client.Ping(context.Background(), nil) + if err != nil { + log.Fatal(err) + } + defer client.Disconnect(context.TODO()) + + db := client.Database("store") + + var ( + // Collections. + moviesCollection = db.Collection("movies") + + // Services. + movieService = store.NewMovieService(moviesCollection) + ) + + app := iris.New() + app.Use(func(ctx iris.Context) { + ctx.Header("Server", "Iris MongoDB/"+version) + ctx.Next() + }) + + storeAPI := app.Party("/api/store") + { + movieHandler := storeapi.NewMovieHandler(movieService) + storeAPI.Get("/movies", movieHandler.GetAll) + storeAPI.Post("/movies", movieHandler.Add) + storeAPI.Get("/movies/{id}", movieHandler.Get) + storeAPI.Put("/movies/{id}", movieHandler.Update) + storeAPI.Delete("/movies/{id}", movieHandler.Delete) + } + + // GET: http://localhost:8080/api/store/movies + // POST: http://localhost:8080/api/store/movies + // GET: http://localhost:8080/api/store/movies/{id} + // PUT: http://localhost:8080/api/store/movies/{id} + // DELETE: http://localhost:8080/api/store/movies/{id} + app.Run(iris.Addr(fmt.Sprintf(":%s", env.Port)), iris.WithOptimizations) +} diff --git a/_examples/tutorial/mongodb/store/movie.go b/_examples/tutorial/mongodb/store/movie.go new file mode 100644 index 00000000..3b995e47 --- /dev/null +++ b/_examples/tutorial/mongodb/store/movie.go @@ -0,0 +1,180 @@ +package store + +import ( + "context" + "errors" + + "github.com/mongodb/mongo-go-driver/bson" + "github.com/mongodb/mongo-go-driver/bson/primitive" + "github.com/mongodb/mongo-go-driver/mongo" + // up to you: + // "github.com/mongodb/mongo-go-driver/mongo/options" +) + +type Movie struct { + ID primitive.ObjectID `json:"_id" bson:"_id"` /* you need the bson:"_id" to be able to retrieve with ID filled */ + Name string `json:"name"` + Cover string `json:"cover"` + Description string `json:"description"` +} + +type MovieService interface { + GetAll(ctx context.Context) ([]Movie, error) + GetByID(ctx context.Context, id string) (Movie, error) + Create(ctx context.Context, m *Movie) error + Update(ctx context.Context, id string, m Movie) error + Delete(ctx context.Context, id string) error +} + +type movieService struct { + C *mongo.Collection +} + +var _ MovieService = (*movieService)(nil) + +func NewMovieService(collection *mongo.Collection) MovieService { + // up to you: + // indexOpts := new(options.IndexOptions) + // indexOpts.SetName("movieIndex"). + // SetUnique(true). + // SetBackground(true). + // SetSparse(true) + + // collection.Indexes().CreateOne(context.Background(), mongo.IndexModel{ + // Keys: []string{"_id", "name"}, + // Options: indexOpts, + // }) + + return &movieService{C: collection} +} + +func (s *movieService) GetAll(ctx context.Context) ([]Movie, error) { + // Note: + // The mongodb's go-driver's docs says that you can pass `nil` to "find all" but this gives NilDocument error, + // probably it's a bug or a documentation's mistake, you have to pass `bson.D{}` instead. + cur, err := s.C.Find(ctx, bson.D{}) + if err != nil { + return nil, err + } + defer cur.Close(ctx) + + var results []Movie + + for cur.Next(ctx) { + if err = cur.Err(); err != nil { + return nil, err + } + + // elem := bson.D{} + var elem Movie + err = cur.Decode(&elem) + if err != nil { + return nil, err + } + + // results = append(results, Movie{ID: elem[0].Value.(primitive.ObjectID)}) + + results = append(results, elem) + } + + return results, nil +} + +func matchID(id string) (bson.D, error) { + objectID, err := primitive.ObjectIDFromHex(id) + if err != nil { + return nil, err + } + + filter := bson.D{{Key: "_id", Value: objectID}} + return filter, nil +} + +var ErrNotFound = errors.New("not found") + +func (s *movieService) GetByID(ctx context.Context, id string) (Movie, error) { + var movie Movie + filter, err := matchID(id) + if err != nil { + return movie, err + } + + err = s.C.FindOne(ctx, filter).Decode(&movie) + if err == mongo.ErrNoDocuments { + return movie, ErrNotFound + } + return movie, err +} + +func (s *movieService) Create(ctx context.Context, m *Movie) error { + if m.ID.IsZero() { + m.ID = primitive.NewObjectID() + } + + _, err := s.C.InsertOne(ctx, m) + if err != nil { + return err + } + + // The following doesn't work if you have the `bson:"_id` on Movie.ID field, + // therefore we manually generate a new ID (look above). + // res, err := ...InsertOne + // objectID := res.InsertedID.(primitive.ObjectID) + // m.ID = objectID + return nil +} + +func (s *movieService) Update(ctx context.Context, id string, m Movie) error { + filter, err := matchID(id) + if err != nil { + return err + } + + // update := bson.D{ + // {Key: "$set", Value: m}, + // } + // ^ this will override all fields, you can do that, depending on your design. but let's check each field: + elem := bson.D{} + + if m.Name != "" { + elem = append(elem, bson.E{Key: "name", Value: m.Name}) + } + + if m.Description != "" { + elem = append(elem, bson.E{Key: "description", Value: m.Description}) + } + + if m.Cover != "" { + elem = append(elem, bson.E{Key: "cover", Value: m.Cover}) + } + + update := bson.D{ + {Key: "$set", Value: elem}, + } + + _, err = s.C.UpdateOne(ctx, filter, update) + if err != nil { + if err == mongo.ErrNoDocuments { + return ErrNotFound + } + return err + } + + return nil +} + +func (s *movieService) Delete(ctx context.Context, id string) error { + filter, err := matchID(id) + if err != nil { + return err + } + _, err = s.C.DeleteOne(ctx, filter) + if err != nil { + if err == mongo.ErrNoDocuments { + return ErrNotFound + } + return err + } + + return nil +} diff --git a/doc.go b/doc.go index 8f473373..84b0b61f 100644 --- a/doc.go +++ b/doc.go @@ -27,7 +27,10 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* -Package iris provides a beautifully expressive and easy to use foundation for your next website, API, or distributed app. +Package iris implements the highest realistic performance, easy to learn Go web framework. +Iris provides a beautifully expressive and easy to use foundation for your next website, API, or distributed app. +Low-level handlers compatible with `net/http` and high-level fastest MVC implementation and handlers dependency injection. +Easy to learn for new gophers and advanced features for experienced, it goes as far as you dive into it! Source code and other details for the project are available at GitHub: @@ -35,7 +38,7 @@ Source code and other details for the project are available at GitHub: Current Version -11.1.1 +11.2.0 Installation diff --git a/iris.go b/iris.go index 3cc537b7..496c5eb1 100644 --- a/iris.go +++ b/iris.go @@ -33,7 +33,7 @@ import ( var ( // Version is the current version number of the Iris Web Framework. - Version = "11.1.1" + Version = "11.2.0" ) // HTTP status codes as registered with IANA. From 7278bcd537e31de8ab3ed78c5f2e1dcae4b65f3f Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 2 Feb 2019 04:25:04 +0200 Subject: [PATCH 007/418] minor fmt Former-commit-id: d22d8c4a715326901cd12368268eb3fb3e087a5f --- .../bindata_gzip.go | 7118 ++++++++--------- _examples/tutorial/url-shortener/README.md | 3 + _examples/tutorial/url-shortener/factory.go | 2 +- _examples/tutorial/url-shortener/main.go | 2 +- _examples/tutorial/vuejs-todo-mvc/README.md | 2 + 5 files changed, 3563 insertions(+), 3564 deletions(-) create mode 100644 _examples/tutorial/url-shortener/README.md diff --git a/_examples/file-server/embedding-gziped-files-into-app/bindata_gzip.go b/_examples/file-server/embedding-gziped-files-into-app/bindata_gzip.go index 0e300f6d..a6699d98 100644 --- a/_examples/file-server/embedding-gziped-files-into-app/bindata_gzip.go +++ b/_examples/file-server/embedding-gziped-files-into-app/bindata_gzip.go @@ -6,7 +6,6 @@ package main - import ( "fmt" "os" @@ -14,7 +13,6 @@ import ( "time" ) - type gzipAsset struct { bytes []byte info gzipFileInfoEx @@ -57,763 +55,763 @@ func (fi gzipBindataFileInfo) Sys() interface{} { var _gzipBindataAssetsCssBootstrapmincss = []byte( "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xef\x8f\xe3\x38\x92\x20\xfa\xb9\x1a\xe8\xff\x41\x5b\x8d\x41\x57" + - "\x4d\x59\x2e\xf9\x77\xda\x89\xce\xb7\xfb\xe6\x0e\xb7\x03\xdc\xec\x97\x9b\x0f\x07\xf4\xf4\x7b\xa0\x25\xda\xd6\x94" + - "\x2c\x69\x24\x39\x2b\xb3\xfb\xf6\xfe\xf6\x83\xf8\x4b\x41\x32\x48\xd1\x4e\x77\xcf\xdc\x62\xb7\xee\x7a\x9c\x62\x44" + - "\x30\x18\x0c\x06\x83\x41\x32\xf8\xf9\xf7\xff\xf4\xed\x37\xd1\xef\xa3\xff\xb7\xaa\xba\xb6\x6b\x48\x1d\x3d\x2f\xa6" + - "\x8b\xe9\x32\xfa\x70\xea\xba\x7a\xf7\xf9\xf3\x91\x76\x7b\x59\x36\x4d\xab\xf3\x47\x06\xfe\x87\xaa\x7e\x6d\xf2\xe3" + - "\xa9\x8b\xe6\xc9\x6c\x16\xcf\x93\xd9\x2a\xfa\xf3\xd7\xbc\xeb\x68\x33\x89\xfe\x58\xa6\x53\x06\xf5\xdf\xf3\x94\x96" + - "\x2d\xcd\xa2\x4b\x99\xd1\x26\xfa\xd3\x1f\xff\xcc\xc9\xb6\x3d\xdd\xbc\x3b\x5d\xf6\x3d\xc5\xcf\xdd\xd7\x7d\xfb\x59" + - "\x55\xf2\x79\x5f\x54\xfb\xcf\x67\xd2\x76\xb4\xf9\xfc\xdf\xff\xf8\x87\xff\xfa\x6f\xff\xe3\xbf\xb2\x4a\x3f\x47\x9f" + - "\x7f\xff\x4f\x51\x59\x35\x67\x52\xe4\x3f\xd3\x69\xda\xb6\x3d\xb3\xc9\x74\x1e\xfd\x2f\x46\x5b\x54\x17\xfd\xaf\xe8" + - "\x98\x77\xd3\xbc\xfa\xac\x60\xa3\xdf\x7f\xfe\xf6\x9b\x53\x77\x2e\xa2\x5f\xbe\xfd\xe6\xdd\xa1\x2a\xbb\xf8\x40\xce" + - "\x79\xf1\xba\x8b\x5a\x52\xb6\x71\x4b\x9b\xfc\xf0\xf8\xed\x37\xef\xe2\xaf\x74\xff\x25\xef\xe2\x8e\xbe\x74\x71\x9b" + - "\xff\x4c\x63\x92\xfd\xf5\xd2\x76\xbb\x68\x96\x24\xbf\x63\x10\xe7\xd6\x51\xfa\xed\x37\xff\xfe\xed\x37\xdf\x7e\xb3" + - "\xaf\xb2\x57\x56\xcd\x99\x34\xc7\xbc\xdc\x45\x89\x28\x20\x4d\x97\xa7\x05\x9d\x44\xa4\xcd\x33\x3a\x89\x32\xda\x91" + - "\xbc\x68\x27\xd1\x21\x3f\xa6\xa4\xee\xf2\xaa\x64\xbf\x2f\x0d\x9d\x44\x87\xaa\x62\xb2\x3c\x51\x92\xb1\xff\x3d\x36" + - "\xd5\xa5\x9e\x30\xb2\x79\x39\x89\xce\xb4\xbc\x4c\xa2\x92\x3c\x4f\xa2\x96\xa6\x1c\xb7\xbd\x9c\xcf\xa4\xe1\x95\x67" + - "\x79\x5b\x17\xe4\x75\x17\xed\x8b\x2a\xfd\x22\x39\xb8\x64\x79\x35\x89\x52\x52\x3e\x93\x76\x12\xd5\x4d\x75\x6c\x68" + - "\xdb\x4e\xa2\xe7\x3c\xa3\x95\x8e\x97\x97\x45\x5e\xd2\x98\xa1\xf7\xed\x7e\xa6\x3d\xfb\xa4\x88\x49\x91\x1f\xcb\x5d" + - "\xb4\x27\x2d\xed\x21\x20\xe9\x5d\x59\x75\xd1\x87\x1f\xd3\xaa\xec\x9a\xaa\x68\x7f\x8a\x3e\x6a\x24\xcb\xaa\xa4\x3d" + - "\xa9\x13\xed\x35\x67\x10\xcc\x8f\xa7\x3c\xcb\x68\xf9\xd3\x24\xea\xe8\xb9\x2e\x48\x47\x23\x0b\x4f\x56\xc3\x4a\xf6" + - "\x24\xfd\xd2\xcb\xa3\xcc\xe2\xb4\x2a\xaa\x66\x17\x75\x0d\x29\xdb\x9a\x34\xb4\xec\x24\xe4\x8e\xa4\x5d\xfe\xdc\x8b" + - "\x7b\x77\xaa\x9e\x69\xc3\x30\xab\x4b\xd7\x33\x0d\x3a\x65\xbf\x6f\x7e\xec\xf2\xae\xa0\x3f\x71\xd2\x55\x93\xd1\x26" + - "\xde\x57\x5d\x57\x9d\x77\xd1\xac\x7e\x89\xb2\xaa\xeb\x68\x26\x7b\x77\x12\xb5\x5d\x53\x95\xc7\x41\x93\xbe\x8a\xe6" + - "\x6c\x12\x49\x34\x3b\x94\x43\x71\xdb\xbd\x16\x74\x17\xe5\x1d\x29\xf2\x54\x00\x9c\x66\x9a\x86\x4c\xd7\x1b\x7a\x8e" + - "\x92\x47\x85\x92\xff\x4c\x77\xd1\x9c\x9e\x05\xf8\x99\x34\x5f\x18\x82\x68\xed\x77\x49\xc2\x80\x07\x39\xec\xa2\xef" + - "\x0e\x07\x59\x7d\x7b\x26\x05\xd0\x74\x4e\xed\x41\x29\x68\x7b\xe9\x1b\x71\xa9\x19\x44\x5d\xb5\x79\xaf\x3d\xbb\xa8" + - "\xa1\x05\xe9\x05\x66\x70\xb1\x59\x31\xb5\x67\xca\xa0\x3a\x2e\x40\x21\x64\x05\x5d\x55\xef\xa2\x78\xba\x52\x8d\x69" + - "\x2f\x7b\x21\x69\x2e\xe2\x78\x3a\x1f\x0a\xf3\xf3\x11\x74\xc3\xd0\x4d\xed\xf3\x91\x2b\xd7\xae\xa9\xaa\x8e\xeb\x55" + - "\xdf\xa9\x87\xa2\xfa\xba\x8b\xb8\xfe\x08\x50\x3e\x82\x34\xf9\xce\xe8\x39\x5a\x26\xf5\x8b\x94\x3e\xd7\x05\xad\x35" + - "\x72\xe0\xef\xab\x97\xbe\xe1\x79\x79\xdc\x45\xbd\x1e\xd3\x92\x7d\xe3\x23\xbf\xfa\xd9\x57\xee\x28\x12\x95\xd6\x82" + - "\xa7\x81\x6b\x72\xe9\x2a\x51\x98\x56\xbd\x41\xf8\xb2\xcf\xfa\x41\x49\x27\x51\x4b\xce\xb5\x6d\xaa\xce\x55\x59\xb5" + - "\x35\x49\xe9\x64\xf8\x69\xf4\xd6\x4c\x49\x72\x7f\xe9\xba\xde\x28\xe4\x65\x7d\xe9\x26\x51\x55\x77\xdc\x82\x44\x2d" + - "\x2d\x68\xda\xf5\x63\xed\xa5\x23\x0d\x25\xba\xad\x92\xf4\x7a\x03\x70\xa2\x4d\xde\x3d\x0e\x6a\x27\xbe\x68\x15\x18" + - "\x6d\x7a\xce\xdb\x7c\x5f\x50\x83\x07\x5e\x25\x57\x87\xde\x74\xb2\xd1\x7a\xa8\x9a\xb3\x36\xb6\x25\x34\xb3\xd3\x8c" + - "\xed\x1f\xbb\xd7\x9a\xfe\xc0\xbf\xff\x34\x81\xdf\x1a\xda\xd2\x4e\xff\xd4\x5e\xf6\xe7\xbc\xe3\xa3\x58\xf6\x26\xa9" + - "\x6b\x4a\x1a\x52\xa6\x74\x17\x71\x32\xac\x39\x97\xa6\xed\xdb\x53\x57\x79\xd9\xd1\x46\xab\xfe\xc7\x2c\x6f\xc9\xbe" + - "\xa0\xd9\x4f\x1a\x23\xea\x2b\x1f\x86\x82\x40\x46\x0f\xe4\x52\xe8\x02\xd9\xed\x98\x9e\x1c\xaa\xf4\xd2\xc6\x79\x59" + - "\xf6\xc6\x9b\xd1\xb0\x0b\xf8\x00\x24\x59\xc6\x54\x86\x8f\x68\x43\xef\x19\x26\x83\xd3\x06\x20\x9f\xd8\x20\x0c\x97" + - "\x41\x7a\xa2\xe9\x97\x7d\xf5\x62\x08\x8b\x64\x79\xa5\x0b\x06\xea\xaa\x32\x79\xb8\x96\xeb\xc5\xee\x92\xa1\x21\x36" + - "\x5f\xe5\xe5\xbc\xa7\xcd\x4f\xbb\x9d\xac\x9f\xb5\x3f\x6e\xeb\xbc\x8c\x35\x45\x75\x80\x57\x97\x4e\x07\xff\xf6\x9b" + - "\x77\x70\x08\x83\xa1\x04\x35\x82\x92\x26\x3d\xb9\x1b\x7e\x9f\xf1\xfd\xe8\xd0\xb7\x5e\xd3\x0f\x39\x2d\x32\x27\x63" + - "\x43\xfb\xf8\x87\x38\xed\x31\x0b\x4c\x22\x2e\x8c\x8c\xa6\x55\x43\x7a\x03\x2e\x24\x82\x71\x02\xc6\x18\x63\xa8\xa5" + - "\x9d\xae\x7a\xd3\xc5\x8a\x9e\xa3\xe9\x7a\xce\xfe\x67\xb3\xa2\xe7\x47\x68\x13\xa2\x79\xfd\x02\x95\xb3\x9f\x14\xdb" + - "\xaa\xc8\xb3\xa8\xcd\x8b\x67\x35\x80\x0a\x7a\xa4\x65\x16\xa0\xd4\x9a\xe5\x41\xed\xa1\xb4\x56\xbe\x49\xb6\xeb\x07" + - "\x24\x9c\xb3\x7b\x7b\x68\x56\xda\xfb\x07\x05\xa9\x5b\xda\x77\x19\xff\x25\xd1\xb3\x49\xd4\x9d\x0c\x6e\x59\xd9\xbb" + - "\xde\xcd\xfc\x1f\xd5\xa5\xe9\x65\x87\xb8\xab\xa7\xd5\xbe\xfe\xdc\xdb\x86\x55\xbc\xaf\xf2\x82\x36\xcc\x65\xd1\xdc" + - "\xd6\xb6\x49\x3f\xa7\x6d\xfb\xb9\xf7\xd5\x98\x9f\xda\xfb\x9f\xff\x7c\xa6\x59\x4e\xa2\xba\xc9\x4b\x2e\xff\xdf\x4f" + - "\xa2\x1d\x39\x30\x37\x6f\xb7\xa7\x87\x4a\xcc\x10\x70\x96\x8f\xfe\x29\x3f\xd7\x55\xd3\x91\x92\x19\x62\x6e\x3e\xdb" + - "\x13\xc9\x7a\x81\xf5\xfd\x6a\x02\x40\x97\x20\x89\x2c\x7c\x6d\x18\xf8\xc8\xb8\xcb\xbf\xfd\xe6\x5d\x2f\x24\xd2\x3b" + - "\x56\xbd\xb9\xef\x28\xef\x73\xce\xdb\xa0\x90\x3b\xee\xf5\x73\x97\x80\xa3\xfc\x78\x6a\xe8\xe1\x27\xde\x66\xd9\x54" + - "\x36\x8e\x76\xd1\xfb\xe8\xc3\xfb\x88\x74\x5d\xf3\xa1\x87\xf9\x18\xbd\xff\xf8\x5e\x62\x0d\x1e\xda\x08\x26\x03\xd2" + - "\x50\x59\x85\xff\xdf\x0f\xef\xff\x4a\x9e\x49\x9b\x36\x79\xdd\xed\xde\xff\x24\x65\xae\x4a\xbf\x7b\xef\xa0\x2c\xe9" + - "\x30\x27\xf8\x6f\x97\xaa\xa3\x6c\x7e\xe6\x60\xf6\x68\xf8\x6e\xbb\xdd\x32\xe9\xd5\xe4\x48\xe3\x7d\x43\xc9\x97\x38" + - "\x2f\x7b\x67\x7f\x17\x91\xe7\x2a\xcf\x04\xb9\xae\x77\xea\x39\x11\xe5\xe3\x32\x6d\x8e\xb9\xb7\x1f\x33\xdd\x17\xc0" + - "\xf9\xf9\x38\x89\x3a\xc1\xda\x08\x61\xe9\x3d\xbd\x3b\x93\x97\xf8\x6b\x9e\x75\x27\xbe\x32\xb1\x7b\xef\x34\x9f\x44" + - "\xa7\xc5\x24\xe2\x23\xec\x5d\xd5\xd4\x27\x52\xb6\xbb\x68\xc1\xf8\xff\x9a\x67\xd5\xd7\xfe\x2f\x0d\xda\x62\x81\xc9" + - "\x4c\xe7\x00\xcc\xf4\xa6\x77\x7a\xb0\xb9\x98\x96\xe4\x79\x4f\x1a\x43\x14\xdc\x5c\x71\x80\x7d\x57\x3e\x4d\x53\xd2" + - "\xd0\x6e\x12\x4d\xb3\xa6\xaa\x2f\xf5\x13\xf8\x08\x7b\x22\xee\xaa\x3a\xc6\x87\x8e\xa4\x56\x90\x3d\x2d\x9c\xbd\x97" + - "\xf4\xa6\x85\x03\x0e\xb6\xc5\x6d\x47\x10\xfa\x1c\xad\xb7\x2c\xf2\xe7\xc9\x14\x85\xe2\x10\x17\x08\x57\x03\x5e\x27" + - "\xcd\x00\x29\xf0\xed\xe4\x6c\x41\x96\x65\x16\x4d\x66\xec\xfe\x59\xf8\x91\x29\xb5\xbd\xca\xef\xff\x5b\xf1\x5a\x9f" + - "\xf2\xb4\x2a\xdb\xe8\x5f\x49\x71\x28\xf2\xf2\xd8\x7e\xdf\xeb\x41\xdb\xa4\xbb\xe8\xd2\x14\x1f\xa6\xd3\xcf\x3d\x4a" + - "\xfb\xf9\xa8\x40\xe3\x93\x04\x8d\x1b\x7a\xbc\x14\xa4\x99\xd2\xaa\xfb\x78\x1b\xda\xff\xf3\x5d\x4e\x0f\xf9\xcb\xc7" + - "\xbe\x59\xbd\x5b\x48\xba\x0f\xdf\xd3\xf3\x9e\x66\x19\xcd\xe2\xaa\xa6\x65\x3f\x07\x7e\xff\xb1\x5f\xfd\xbe\x0b\x27" + - "\xfc\xb5\x3a\x1c\xe6\x1f\x23\x49\x90\xfd\x79\x13\x11\x9d\xc6\xd5\x24\xba\x0e\x50\xe8\x9a\x0b\xbd\xa9\x35\xed\xf3" + - "\xf1\xbb\x01\xe0\xff\x57\x00\xa2\x5c\x93\x5d\xfb\x7c\xfc\xfe\xa3\xe8\xfa\xa9\x42\xf2\xac\xf7\xd8\x22\x6d\xc6\x67" + - "\x79\x67\x04\x20\x50\x6b\xe0\xa2\x97\xfb\xa9\x8f\xe6\x24\xbe\xe4\xcb\x57\xcd\xa5\x9d\x41\x3f\x8a\xd3\x38\x57\x55" + - "\x77\x62\x13\x33\x29\xbb\x9c\x14\x39\x69\x69\xa6\x3c\xb5\xaa\x7d\xb1\xe0\x8e\x0d\x79\x6d\x53\xa2\x16\x20\x43\xe3" + - "\x63\x36\x31\xe7\xed\x17\x38\xd3\x0e\x96\xfe\x2f\x73\xf2\xde\xc6\xa9\x8b\x4b\xeb\x82\xdf\x23\xf0\xf4\xd2\x08\xf0" + - "\x49\xa4\x7f\xae\x5c\x64\x12\x92\x22\x84\xce\x79\xe9\xae\x79\x3e\x9b\x23\x28\x69\x51\x5d\x32\x17\xca\x3a\x99\x61" + - "\xec\x96\xcf\xb4\xa8\x6a\xea\xc2\xda\x24\x5b\x4c\x28\xb4\x4c\xf3\xc2\x8d\x73\x40\x70\x8e\x05\x69\x5d\xed\xa1\x09" + - "\xca\xdc\xf9\xd2\xe6\xa9\x1b\x05\x13\x01\xf7\x89\xdd\x38\x0b\x04\xe7\x44\x49\xd3\xb9\x51\x56\x58\x35\x1d\x69\xdc" + - "\x18\x6b\x07\x46\x4c\xcf\x75\xf7\xea\xc6\xdb\x20\x78\x97\x96\x7a\x6a\x7a\x40\x30\x0e\x79\x71\x76\x63\x60\xdd\xd9" + - "\x9d\xe2\x82\x34\x47\x97\x12\xd0\x64\x96\xa0\x58\x6e\x78\xac\x37\xfb\x5a\xf2\xd6\x2d\x68\x54\xa5\x2b\xd7\x60\xa5" + - "\xc9\x0c\xeb\xcb\x86\x9e\xab\x67\x4f\x43\x96\x08\xce\xcf\x55\x75\x8e\xf3\xd2\x8d\x84\x69\x00\x43\xaa\x2e\x9e\xe6" + - "\x60\x5a\x50\x1d\x0e\x6e\x04\xac\xfb\xdb\xfc\x58\x12\xd7\x48\xa3\xc9\x0c\x53\x80\xb4\x3a\xba\x11\xd0\xfe\x6f\x48" + - "\xeb\xee\xcc\x39\xd6\xf9\xa7\xea\xec\x96\xf2\x1c\xeb\xfe\x43\x5e\x78\x30\xb0\xbe\xef\x72\x5f\x1d\x68\xef\x57\xc4" + - "\x65\xff\x68\x32\xc7\xfa\x3e\xab\xbe\x96\x45\x45\xb2\x98\x14\xee\xae\x9c\x63\x0a\x20\x31\xdd\x58\x98\x02\x5c\x6a" + - "\x3f\x0e\xa6\x03\x79\xb9\xaf\x5e\xdc\x28\x98\x0a\xf4\xb3\x77\x9c\xe6\x4d\xea\x93\x39\xa6\x0a\x0d\xad\x29\x71\x4b" + - "\x62\x81\xe9\x42\x43\x0f\x0d\xf5\x28\xd0\x02\x53\x87\xde\x14\x78\x85\xbe\xc0\x54\xa2\xf7\x43\xdc\x18\x98\x4a\x1c" + - "\x0a\xe2\x1e\x0d\x0b\x4c\x25\xfa\x05\x58\x7d\xaa\x4a\xea\x9e\xad\x16\x98\x42\x3c\x57\xc5\xe5\x4c\xbd\x43\x7c\x81" + - "\xa9\x84\xc0\xeb\xf5\xc9\x8d\x88\xe9\x85\x40\xbc\xd4\x6e\x34\x4c\x37\xfe\xd6\xa4\x55\xe6\x56\x8b\x05\xa6\x16\x7b" + - "\xe2\x47\x5a\xa2\x13\x84\x47\xf2\x4b\x74\x86\x20\x47\xb7\xcc\x97\x98\x3e\xec\x2b\xcf\x04\xb1\xc4\xf4\xa1\xc7\x38" + - "\x93\xc6\x83\x85\xe9\x04\x0b\xd8\xb8\x51\x30\x75\x48\xc9\x99\x36\xc4\x8d\x83\xa9\x02\x8b\xba\x3b\x31\x30\x1d\xd8" + - "\x57\x85\xdb\x9a\x2c\xb1\xee\xe7\x9b\x50\x6e\x1c\x74\x82\xa0\x2f\x9d\xf4\xd2\x5d\x88\x2b\x54\x05\x7a\x44\x1e\x85" + - "\x70\xe2\x61\x9a\xc0\xf6\x93\xe2\x82\x1e\x3c\xf5\x61\xfa\xc0\xf1\x52\x5a\x76\x1e\xaf\x69\x85\xe9\x05\xc7\x6c\xfc" + - "\x4d\xc4\x54\x83\x23\xfe\xf5\xd2\x76\xf9\xc1\xed\xdb\xad\x30\x15\xf1\xba\x43\x2b\x4c\x41\xf2\x32\xa3\x65\x37\x22" + - "\x18\x7c\x0e\x61\x88\x23\xed\x43\xdd\x49\x92\xd2\x7e\x26\x8e\xd9\x06\xb1\x1b\x17\x5d\x27\xe4\x69\x77\x69\xdc\x66" + - "\x63\x8d\xe9\xcc\x99\xd4\x71\x3f\x42\x3d\x3d\xb8\x46\xfb\x9e\xef\xc3\x3b\x71\xb0\x5e\xef\x7c\xc3\x7a\x8d\x75\x37" + - "\xcd\x72\x0f\x06\xba\x56\x38\x11\x9f\x08\xb0\x6e\x66\x7b\x38\x6e\x14\xac\x83\xbd\x6e\xef\x1a\xeb\xd8\xb6\xa3\x75" + - "\xbc\x27\xe9\x97\xaf\xa4\x71\xdb\x90\x35\xd6\xaf\x07\xd2\x76\xe3\xa8\x1b\xac\x77\xc7\xb1\x30\x7b\xc0\xa2\x11\x4e" + - "\x0c\x4c\x1b\x6a\x72\x69\xdd\x02\xd9\x60\xca\xd0\x76\x95\x7b\x2a\xdd\x60\xca\x70\xa8\x1a\x7f\x5b\x30\x7d\x60\xc2" + - "\x1b\xc5\xc4\xd7\x90\xb4\x1e\xc7\xc4\xb4\x83\xfe\x95\xa6\x6e\xb5\xdd\xa0\xab\x88\x13\x7d\x6e\xaa\x11\x23\xbc\xc1" + - "\xb4\x43\x62\xfa\x8d\xcd\x03\xa6\x1d\x75\x71\x69\xd9\x9a\xc7\x8d\x86\x06\x0a\xf2\x72\x14\x0f\x53\x12\xbe\x5a\x1c" + - "\x41\xc4\x54\xa5\xfa\x32\x82\x84\x69\xcb\xdf\x2e\xb4\xed\x72\xb1\xa8\x73\xa3\x62\x3a\x93\x97\x87\x6a\x04\x0d\x55" + - "\x98\xb4\xa1\xb4\x6c\x4f\x95\xa7\x1b\x30\x75\x11\x72\x19\x59\x40\x3c\x60\x6a\x53\x7d\x19\x45\xc3\x1d\xcc\x72\x0c" + - "\x6f\x8b\x29\x0c\x69\x9a\xea\xab\x5f\x47\xb7\xa8\x83\xc1\xf0\xfc\x1a\xba\x45\x67\x19\x86\xe8\xf1\xb9\xb7\xa8\x77" + - "\xc1\xb0\xbc\x2e\xfe\x16\x53\x19\x36\x77\x78\x97\x49\x5b\x4c\x5d\x1a\xca\x4e\xa6\x1d\x2e\x85\x3b\x74\xb0\xc5\x14" + - "\x46\x20\xb2\xd3\x43\x6e\x4c\xd4\xc2\xbc\xa4\x05\x39\x93\x51\xfd\x9e\xa1\x91\xbe\x63\xee\xee\xc0\x19\x1a\xe8\x2b" + - "\x28\x71\xae\xb3\x66\x68\x98\xef\x90\xbb\xa7\xe1\x59\x82\xce\xf5\xaf\x94\x6d\x3d\xb8\xb1\x30\xe1\xf7\x58\x69\x51" + - "\xb9\x67\x9f\x19\x1a\x20\xfc\x4a\x9a\x32\x2f\x8f\x23\xc2\xc3\x44\x5f\x17\xa4\xf4\x54\x86\x1a\x77\x52\xd0\x32\x73" + - "\xc7\x30\x67\x68\x9c\xb0\x21\x65\x56\x39\x63\x8b\x33\x34\x4a\x98\x56\xe7\x33\x75\x3b\x59\x33\x34\x54\x78\x26\xc7" + - "\x92\x7a\x70\xd0\xe0\xb7\x98\x75\xdc\x43\x73\x86\x46\x0c\x25\x9e\x6f\x70\xce\xd0\xb8\x61\x43\xbb\xaf\xd4\xc7\x26" + - "\xee\x0d\x56\x75\xdd\xf7\x73\xea\x09\x3a\xcf\xd0\xe0\xe1\xa1\x2a\xd8\x36\xa4\x57\xb7\xd0\x28\xa2\xc0\xf4\xea\x32" + - "\x1a\x4a\x14\xf6\x40\x9e\xf3\x73\x23\xe3\xb1\x24\x86\x7c\xaa\x9a\xfc\xe7\xaa\xec\x3c\xe8\x78\x88\x31\x73\x3a\x39" + - "\x33\x34\xc2\xb8\xbf\x14\xc5\xa9\x6a\xdc\x4d\x44\xa3\x8c\x7b\xea\x36\x75\x33\x34\xca\x98\xf6\xd2\x38\xe4\x29\xe9" + - "\xdc\xdd\x80\x06\x1b\xbb\xd3\xe5\xbc\x6f\x7d\x1a\x8a\x46\x1a\x05\x9a\x57\x41\xd1\x60\xe3\x89\x94\x99\x7f\x8e\x9b" + - "\xa1\x01\x47\x86\xe7\x9b\x53\x67\x68\xd0\x91\xa1\xf9\x1a\x87\x29\x09\x43\xf2\x36\x0d\x8d\x39\x72\x5f\x21\x64\x1a" + - "\x9f\xa1\xe1\x47\x0d\xdf\xdb\x54\x34\x0e\xa9\xa1\x7b\x9a\x8c\x86\x24\x35\x64\x7f\xd3\x31\x2d\x3a\x16\xd5\xde\xad" + - "\x78\x68\x68\xf2\x6b\x43\x4b\xf7\xae\xd8\x0c\x0d\x4b\x76\xa4\xfd\xe2\x8c\xc6\xcd\xd0\x80\xe4\x21\x2f\x3c\x71\x97" + - "\x19\x1a\x8d\xdc\x37\x39\x3d\xa4\xc4\x63\xd1\xd0\x80\x64\xef\xda\x70\xef\xd6\x89\x87\xc6\x24\x33\xd2\x9e\xf6\x95" + - "\x67\xfd\x34\x43\x23\x93\x35\xa9\x69\x93\x16\xb9\xbb\xa7\xd1\xf0\x24\xdb\x59\xf4\xef\xfa\xcd\xd0\x28\x65\x91\x97" + - "\xce\xf5\xff\x0c\x8f\x50\x9e\x2a\x8f\x13\x80\x46\x28\xeb\x4b\x7b\xaa\xdd\xfb\x5e\x33\x34\x44\x79\x69\x3d\xa2\xc3" + - "\x3a\xf8\xb8\xf7\x08\x0d\xeb\xda\xb6\xf2\x4c\x8c\x68\x94\xb1\xc7\x88\xf7\xaf\x31\x29\xea\x13\xd9\x7b\x66\x64\x34" + - "\xd6\x68\x62\xfb\xdc\xed\x19\x1a\x75\x94\x14\xf8\x69\x1c\x27\x2a\x1a\x73\x80\xa8\xfe\x9a\xd1\xf5\x81\xe4\xbd\xeb" + - "\x9a\x7c\x7f\xe9\xdc\x7b\x16\x33\x34\x02\x69\xe3\xfb\x79\x40\x35\xa2\x64\xe1\x2a\xea\xd6\x0b\x34\x22\x49\x5f\x6a" + - "\x52\x7a\x70\xf0\x9d\x4d\x7e\xee\xca\x6f\x35\xd1\x50\xa4\x42\xf5\x58\x6b\x34\x1c\x59\x54\x47\xcf\xe6\xf0\x6c\x8d" + - "\xee\x75\x16\x9e\x0d\xd5\x19\x1a\xbd\xec\xab\xf1\x6c\x27\xcf\xd0\xf0\x65\x49\xbf\xc6\x5f\xf3\x32\xab\xbe\xba\xf1" + - "\x70\xcf\x35\xad\x3c\x26\x10\x0f\x63\x12\x77\x80\x71\x86\x46\x31\xbd\xee\x26\x1a\xc4\xec\xeb\xf0\xb0\x85\x6e\x67" + - "\xb0\xa3\x6e\x6e\x1c\x4c\x17\xe8\x8b\x17\x07\x8d\x5b\xb6\xd4\xa3\xac\x68\xcc\xf2\x50\x54\x75\xfd\x1a\x67\xee\x03" + - "\x47\x74\x86\x86\x2e\x05\xa2\x5f\x18\x68\x04\x53\x60\xfa\x0f\x41\xcc\xf0\x50\xe6\x50\xa9\x1b\x11\x0d\x67\x72\x44" + - "\x6f\x67\xa3\xd1\xcc\xb4\xa1\x59\xde\xf5\xeb\x20\x4f\x2b\x31\x2d\xe1\x57\x47\x3c\x96\x16\x8f\x67\x5e\xba\x82\x36" + - "\xee\x79\x18\x0d\x65\xf2\xc3\xb8\x4e\x1c\x34\x86\x99\x56\xe7\xba\xa1\x6d\xeb\xe9\x3c\x34\x88\x49\x49\xe3\x9f\xc4" + - "\xd1\x10\x26\x43\xf1\x1a\x6d\x34\x80\xd9\x55\x5f\x7d\xed\x42\xe7\x9a\x8e\x74\xee\xe9\x05\x0d\x5b\xb6\x99\x7f\xd7" + - "\x68\x86\x46\x2d\x4f\xa3\x58\xa8\xed\xb8\xec\xd9\xe1\x6f\x0f\x8b\xe8\x2e\x08\x3b\x91\xdb\x76\xb4\xf1\x55\x88\xfb" + - "\x29\x17\xb6\x74\x29\xf6\x6e\xa5\x42\x63\x96\x1c\x71\x15\xcf\xdc\x68\xb8\x9f\xd2\xa3\xad\x7d\x68\xb8\x73\xd2\xa3" + - "\x6d\x7c\x68\xe8\x22\x45\xde\xee\x8d\x7d\xbb\xe5\x33\x34\x6a\xd9\xd0\x63\xde\x76\xfc\x0a\xc0\x08\x3a\xba\x73\x5e" + - "\x54\x97\x6c\xf4\x7c\xcd\x0c\x0d\x43\x72\x5c\xff\x29\x9b\xd9\x16\x53\x84\xae\xa1\x34\x4e\xab\x32\xf7\x59\x96\x2d" + - "\x7e\x7c\x8a\xd2\x38\xa3\x69\x9e\x5d\x2a\xe7\x91\x4d\x3a\x4f\x50\x63\xe1\xe4\x72\x8e\x06\x4a\x7b\xfb\xec\x3d\x4a" + - "\x35\x47\xa3\xa5\xbd\x75\x1e\x41\x43\x97\x21\xf4\x99\x16\x1e\x8f\x69\x8e\x86\x4d\x7b\xd5\x71\x63\xa0\x2b\x11\xd2" + - "\xba\x63\x29\x73\x34\x5c\x4a\x0a\xea\x9e\xc2\xe7\x68\xf8\x92\xfe\xed\xc2\x6e\x82\x3b\xbb\x77\x8e\x46\x30\xbf\xe4" + - "\xa5\xf3\x1c\xcb\x1c\x0d\x5f\xfe\xed\xe2\x59\x97\xe2\x47\x77\x6b\xe2\x76\x68\xe7\x68\xdc\x72\x9f\xb7\x27\xf7\x7e" + - "\xe5\x1c\x8d\x58\x7e\x29\x7d\x91\x92\x39\x1a\xb0\xdc\x93\xfd\x6b\x7c\xa8\x9a\xf3\xa5\x70\x9e\x66\x99\xa3\xf1\xca" + - "\xce\x1d\xf7\x9d\xaf\x0f\xd8\x61\xeb\x7d\x41\xd2\x2f\xde\xe5\xf9\x1c\x0d\x53\xee\xdd\x73\xed\x1c\x0d\x4d\x92\xba" + - "\x76\x8e\x85\xc3\xc3\x01\x3b\xbf\x4c\x1b\x4f\x90\x62\x8e\x06\x24\x4f\xd5\xa5\xf1\x1d\x7b\x9e\x2f\x66\xd8\x11\xf2" + - "\x82\x9c\xdd\xfd\x8a\x46\x24\xb3\x4b\x5d\x78\xe3\x91\x73\x34\x1e\x59\xe7\xc7\xe3\x6b\xbc\x27\xee\x58\xc3\x1c\x0d" + - "\x48\xb6\x69\xde\xb6\x55\xe3\x36\x75\x68\x34\x72\x9f\x77\x69\xe5\x5e\x49\xcd\xd1\x50\xe4\xbe\x73\x1e\x55\xc2\x11" + - "\x5e\xf6\x6e\xfd\x46\x11\x5e\x9d\x43\x35\x49\x08\xd6\xfa\xbf\x3a\xad\x9b\x03\xa1\xb9\xec\x9d\xca\x36\x4f\xf6\x19" + - "\x8e\x72\x1d\x02\xbb\xf1\xe0\x6c\x38\x1a\x42\xcd\x53\x1a\x17\x55\x51\xb8\x6d\x35\x1a\x39\x55\x68\x71\xd7\x5b\x6d" + - "\xf7\xc0\x43\x03\xa7\x34\xbb\xa4\xfc\x6a\xa0\x13\x0d\xdd\x6f\x67\xa9\x31\x02\xb6\x12\xe6\x68\xc8\x54\xa0\x8f\x6d" + - "\x63\xcc\xd1\xe0\xe9\x99\x96\x97\xf8\x44\xce\xfb\x4b\x73\xf4\xcc\x1d\x68\x10\xf5\x5c\x65\xa4\x18\x59\xa2\xcf\xd1" + - "\x58\x6a\xe5\xbc\x5f\x41\xe7\x68\x20\xf5\xd8\x10\xcf\xe0\x42\x83\xa8\xed\xa5\x64\xe6\xc9\xed\x33\xcf\xf1\x83\x9d" + - "\x32\xf7\x89\x1b\x0d\x3d\xde\xd9\xa3\xf1\xbb\x6f\x4e\x3c\xf4\x1c\x78\x8f\x07\x6e\x12\x3a\x91\x51\xcd\xd9\xff\x95" + - "\xa6\x9d\x38\xa5\xe7\x39\xe0\x33\x47\xa3\xaa\x1a\xb6\xc8\x56\xe1\x24\x80\x29\x8f\x46\x20\x40\x7d\xd1\x98\xab\x46" + - "\xc4\xb7\x59\x31\x47\xcf\x88\x6a\xe8\xa3\x63\x00\x0d\xe2\x6a\x24\xbc\xdb\x2d\x73\xfc\x00\x69\x93\x93\xf2\x58\xd0" + - "\x11\x5c\xfc\x0c\xa9\xc4\xf5\xb6\x1c\x0d\xed\x2a\xd4\x91\xae\x43\xa3\xba\x0a\xd9\xa7\x35\x68\x50\x37\xad\xca\xb6" + - "\xf2\x98\x63\x3c\x94\x7b\xa9\x69\x23\x2e\x28\x3b\x11\xd1\xd9\xf8\xb2\x1f\x43\x43\x4d\x53\x6f\xd6\xfc\x22\x45\xcf" + - "\x19\xf6\x68\x23\xbd\x88\x69\x10\xc3\xf3\x85\x6d\xe7\x68\xd8\x96\xa1\x79\x16\x20\x43\xc8\xf6\xf7\xac\xf0\x57\x4a" + - "\x6e\x21\xea\xc0\xae\xea\xff\xba\x35\xea\x09\xab\x44\x82\x97\xa4\xd6\x32\x4e\x74\xa4\x8e\x4f\xf9\xf1\x54\xb0\xe5" + - "\xba\xb8\x5c\xdc\x1c\xf7\xe4\x43\x32\x89\xc4\xff\x93\x57\x41\x55\x66\x2a\xed\x26\xe7\xfb\x7f\xa5\xc5\x33\xed\xed" + - "\x42\xf4\x6f\xf4\x42\xdf\x4f\x22\xf5\x61\x12\xfd\x4b\x93\x93\x62\x62\x24\xc9\x82\xec\x2c\x39\x3b\xfa\x55\xce\xe9" + - "\x72\xfe\xb0\xda\xcc\x96\x0b\x90\x3c\xe6\xbb\xc5\x62\xf1\x88\xe6\x6e\xfa\xee\x70\x38\x48\x0e\xf5\xa4\x35\x68\xaa" + - "\x1a\x8d\x79\x90\xa4\x06\x70\x05\xbe\x6a\x8c\xe9\x09\x6c\x88\xd0\x28\xc9\xde\x86\xec\x37\x8f\x32\x45\x0d\xcc\x63" + - "\x00\xf3\x4f\xed\x58\xfe\x16\x3d\xa9\x94\x24\x31\x5f\xac\xe6\x9b\x14\x25\x01\x52\x21\x40\x3a\x0c\x5d\xe5\xa4\xea" + - "\x4e\x79\x29\xb2\x4d\x3d\xc2\xef\xab\xfa\x85\x25\xc7\x88\x86\xeb\xb1\xe9\xa5\x8d\x1b\x76\x92\xa4\xaf\x1b\x40\xc7" + - "\xd5\xe1\xd0\xd2\x6e\x17\xc5\x73\x95\xef\x08\xc9\x88\xa4\x72\xb4\x88\x8c\x01\x66\x32\xa7\x73\x9e\x65\xc3\x2d\xda" + - "\x94\x34\xd5\xa5\xa5\x05\x4f\xdb\xf2\x34\xcd\x3b\x7a\x7e\x22\x4f\x2c\x35\x01\x5e\xc8\x8b\xf2\xf3\x31\x6e\x68\x5b" + - "\x57\x65\x9b\x3f\xd3\x09\xbb\xe0\x7e\xba\x9c\xf7\x25\xc9\x8b\x48\xe2\xab\x2f\x4f\x92\x19\x3d\x77\x19\x4f\x45\xa2" + - "\xe5\x33\x78\xc4\x53\xbf\xf0\xfa\x7a\xd5\x12\x29\x29\xc4\x88\x6a\x48\x96\x5f\xda\x5d\xb4\x56\x12\x61\x90\x03\x2b" + - "\xbf\xf8\xae\x3d\x8f\xd4\xad\xa5\xbe\x19\x1f\x0d\xb8\xfa\xe3\xd9\x55\xbe\xcb\xb2\xec\xd1\x6e\xc6\xd2\xb0\x00\x0d" + - "\x29\xe5\x9d\x6e\x52\x14\xd1\x74\xde\x46\x94\xb4\x34\xce\xcb\xb8\xba\xb0\x41\x10\x57\x21\x50\x23\x20\x50\x74\xfc" + - "\x14\x03\x26\xe3\x95\x4a\x33\x26\xb2\x6c\x71\x8d\x63\xf3\x68\x34\x17\xc6\x4b\x7c\x93\x19\xc0\xe4\x67\x95\x27\x06" + - "\x34\x5a\xde\x4c\x97\x22\xa1\x54\x69\x65\xdb\xc4\x55\x59\x70\x8b\x36\x5c\x6b\x27\xfb\xb6\x2a\x2e\x1d\xbb\xd6\x2e" + - "\xbb\x8d\x93\x57\x1d\x52\x1b\xf9\x8a\x60\xb2\x9b\x58\x94\x9a\xc9\xc5\x98\x25\x2b\xf2\x7a\x17\x35\x34\xed\xa0\x71" + - "\xc5\x32\xdc\x48\xde\xf8\x48\x25\xfd\x12\x50\x66\xa3\x43\x8a\x06\x53\x30\x34\xa3\xed\x48\x97\xa7\xa0\x11\x52\xd7" + - "\x4c\xdd\xd3\x32\x77\x59\x89\xb8\x06\xb6\xc1\x38\xf9\xb1\xa9\x0a\x95\x56\x8b\x5b\x30\x34\x23\xd6\xf4\x34\x9b\x44" + - "\xd3\xd3\xbc\xff\xcf\xa2\xff\xcf\xb2\xff\xcf\xaa\xff\xcf\x7a\x12\xf5\x85\x32\x8d\x48\x5f\xd2\x17\x9c\xd6\xe3\x26" + - "\x5a\x26\x01\x58\x61\x49\x00\xa6\x33\x67\xbe\xb1\xe9\x69\x16\x4d\xd9\xe1\xd4\x9e\x81\x59\xa4\x7e\xce\xc1\xe7\xf9" + - "\xf0\x79\x01\x3e\x2f\x86\xcf\x4b\xf9\xb9\xb7\x46\xa7\xe5\x50\xb0\x02\xf0\xab\xe1\xf3\x1a\x7c\x5e\xcb\xcf\x80\x15" + - "\xc5\x09\xcb\x93\x32\x7c\x56\x9c\x00\x46\x06\x3e\x06\x36\xa2\x81\x87\x81\x85\x9e\x96\xe2\x01\xb0\x20\x39\x18\xa4" + - "\x3c\x9a\x52\x41\x5a\x99\xcd\x66\x83\x77\xeb\xd0\x8f\xa1\xe3\x75\x36\xa4\xd2\xbb\x4b\xa7\x0c\x34\xfa\x76\x2b\x22" + - "\xa1\xd2\x34\x5d\xa4\xf5\xea\x77\x8a\x3b\x5d\x63\x75\x2d\x85\x2d\x9d\x05\xb4\x74\x09\x78\xbf\x55\x6f\xa0\xf6\x61" + - "\x1d\x1f\x05\x76\xbb\xca\xcd\x08\xfb\x54\x64\x95\x04\x00\x0b\x30\xe5\xb1\x3e\x9e\x5b\x10\xb0\x85\x0b\xa5\x05\x30" + - "\x0d\xe5\x12\xca\x80\xb5\xc1\xf4\x49\x1f\x00\xc4\x8a\xb5\xc1\x84\x80\x34\xd6\xba\x9d\x10\x10\x83\xbb\x52\xeb\x9e" + - "\x4a\x94\x68\xdd\x50\xc8\xdc\x49\x8e\x49\x04\xd2\x5c\x83\x4f\x72\xa0\x2c\x50\xb3\xb3\x14\xe4\x45\x8e\xae\x0f\xd1" + - "\x39\x2f\xf9\xac\x1f\xed\x36\xeb\x87\xfa\xe5\x23\xab\x73\xa8\x5d\x93\xd0\xac\x67\x4f\x25\xdb\x91\xbd\x86\xa7\xe1" + - "\x1c\xba\xec\x4c\x9a\x2f\x93\x48\xe5\xf6\x1c\xb2\xb1\xcd\x79\xfe\x35\xcc\x55\x48\x0f\x0f\x74\x21\x09\x30\x2f\xb3" + - "\x5f\xc5\x31\x7c\xf6\x97\x70\xdf\xfa\x8f\x1a\x14\xcf\xd5\x6b\x82\xb1\xaf\x1a\x1c\xbf\x3d\x69\x01\xf2\xcf\x1a\xa4" + - "\xb8\xf4\x68\x81\x8a\xef\x1a\x6c\x59\x7d\x6d\x08\xef\xd6\xaf\xa7\xbc\xa3\x2c\x55\x1b\x4b\x0f\xd3\x7f\xd7\x9b\x53" + - "\x7d\xa5\x4d\x4a\x5a\x3a\x10\x06\xd9\x22\x55\xa9\x86\x73\xa9\x6b\x0f\x8e\x2a\xd5\x1b\x4a\x6a\x76\x19\xf6\x67\x1c" + - "\x69\x28\xd6\xb0\xce\x17\x99\xed\x0c\x31\xab\x0c\xa2\x6e\x72\x95\x83\x57\x5f\x5a\x48\xcf\x5f\x83\xc3\x56\x11\x0f" + - "\xeb\x64\x9b\x68\x44\xdb\x4b\x9a\xd2\xb6\xd5\x89\xa6\x9b\xf5\x22\xd3\x89\x0a\x38\x8c\xe8\x7e\xb5\x9c\xa7\x1a\xd1" + - "\xbc\x3c\x54\x3a\xc5\xd9\x26\x79\x38\xe8\x14\x7b\x20\x8c\xdc\x72\x35\x5f\x6f\x35\x72\xe2\x0a\x83\x06\xf6\x40\xd6" + - "\xd9\x62\xaf\x53\x14\x70\x08\xd1\xf5\x7a\x35\x33\x78\xcc\x48\x79\x34\xa0\xc8\x76\xb9\x5c\xce\x75\x9a\x1c\x0c\x21" + - "\xf9\xb0\x5c\xac\x16\x72\x6c\x4f\xf7\x47\xb4\x7b\xa4\xff\x6d\x0f\x37\xa3\xe3\x06\x7c\x50\x15\x82\xa6\xf7\xe0\xfe" + - "\xa8\xf5\x1f\x02\x9f\x1d\x0e\x49\xf6\x00\xab\xb1\x3b\x12\x41\x4b\x67\x74\xbe\x5f\x80\x6a\x54\x8f\x62\x75\x6c\x69" + - "\x76\xd0\x9a\x62\x74\x2d\x82\x43\x0e\xd9\x76\x70\xb7\xf7\x47\xad\x8f\xc7\xac\x13\x01\x08\xfe\x6a\x0e\x1b\x9a\xee" + - "\x57\xa0\x1a\xd0\xeb\x18\xf8\x3c\xa3\x19\x85\xb5\x58\xdd\x8f\x60\xd1\xe5\x7e\xbb\x57\x1a\xcb\x92\xd8\xf1\xf3\x3d" + - "\xd0\xf6\xaa\xc9\x64\x0b\xbd\x81\x1d\xcb\x1d\x1c\x25\xc6\x3a\x45\xcb\x11\x6d\xad\x4e\xaa\x62\x12\x5d\x0a\xcb\xcf" + - "\x48\xfc\x4e\x46\x55\x44\x3d\x62\x55\x44\x17\x8e\x2f\xc8\xe8\x94\x24\xa2\x52\x31\x96\x4f\xe3\x52\xb2\xa4\x5b\x5a" + - "\x02\x4e\x1e\xe3\x8b\xc4\x8c\xd7\x82\xbc\x5c\x2a\x12\xc1\x91\xf9\xa2\xd7\x85\x2a\xea\xe5\x5f\xe2\x95\x5c\xe4\x8e" + - "\xd2\x7b\x2a\x72\xff\xda\x5a\xd6\xd5\x88\x25\x81\xb6\x32\x13\xf5\xad\x94\x74\xb2\x30\x79\xce\x07\x79\x66\xd9\x24" + - "\xca\x90\xfc\xb9\xc3\x9a\x5c\x02\x76\xb6\x4b\x0d\xf2\x79\x6b\x1e\x87\x10\x4c\xa0\xc7\x90\x15\x20\xf4\x2f\x99\x79" + - "\x77\x28\x2a\xd2\xf1\x79\x5a\x66\x5c\x64\x2b\xd5\xb5\x50\x31\x74\xfd\xf9\x2e\x2d\x28\x69\x00\x96\x35\x97\x0f\x5f" + - "\x07\x7c\x5a\x14\x79\xdd\xe6\x2d\xaf\x07\x9b\x7e\x79\xea\x41\x83\x51\xe1\xe6\x68\x6d\x9e\x3d\x24\x9a\xa7\xc3\x52" + - "\x73\x66\xa4\x23\x71\xd5\xe4\xc7\xbc\x24\x45\xcc\x13\x75\x4e\x22\x33\xaf\xba\x5c\x61\x9e\x68\x51\x3b\xc6\x10\x8f" + - "\x7c\x69\x53\x6a\x5e\xe6\x2c\xf1\x5b\x7b\x36\xfd\xa8\x2d\x8f\xc4\x8c\x4d\xf6\x43\xe6\x4e\xdd\xc7\xea\xc7\x9c\xb1" + - "\xbc\xe1\xae\x26\xe6\x46\x6e\xa6\x2b\x6d\xe0\x2b\xbd\xb4\x87\x3d\xa8\xaf\x2a\x76\x05\x69\xbb\x38\x3d\xe5\x45\x36" + - "\x89\x40\x49\xed\x2a\xb8\x40\x14\x91\xd0\xd7\x31\xe6\x01\x96\xf4\x37\xc1\x27\xf9\x7a\x00\xf8\x34\x78\xa3\x76\x78" + - "\x4d\x4f\x13\x1f\x18\xcf\x1d\xba\xc9\xe2\x45\x84\xc8\x11\x96\xb0\x12\x88\x22\x1a\xad\xc2\xfc\xdf\xff\x65\x9e\xcc" + - "\x96\xd1\x5f\x92\xe4\x5f\x92\xef\xd5\x14\xa1\x70\xe3\x86\x3e\xd3\xa6\xd5\xe8\x4d\xeb\x4b\x51\x00\x87\xd7\xb0\x31" + - "\x33\xd4\xc8\x24\x8f\x98\x6b\x0c\x83\x6f\xca\x42\x81\x4e\xb7\x74\x22\x71\xb3\x68\x8a\x06\x03\xd1\x65\xc4\xf2\x9f" + - "\xda\x40\x2e\x09\xc3\x76\xeb\x75\x69\x19\x6c\x21\x98\xb3\x4f\x20\x90\xb7\x7b\x3c\x7d\x22\x99\x10\xdb\x26\x9e\xf6" + - "\x72\x08\x6f\x73\x05\x11\x6f\x6b\x15\x19\x6f\x63\xbd\x94\x00\xa1\xc8\xd0\xc3\x5e\x03\x23\xa6\x8d\xb2\xcd\x24\xcb" + - "\x1a\xe9\xd5\x79\x17\xa3\x66\x2e\x4c\xff\x54\x14\xf6\x16\xc0\x9f\x68\x59\x54\x93\xe8\x4f\x55\x49\xd2\x6a\x12\xfd" + - "\x81\xed\x3a\x92\x76\x12\xbd\xff\x43\x75\x69\x72\xda\x44\xff\x46\xbf\xbe\x07\x0f\x05\x00\xea\xba\x29\x9c\xd7\x2f" + - "\x32\xa4\x6c\xdb\x57\xe5\x6b\x6e\xe6\xab\x25\x75\xad\x4a\xb7\x87\xf9\x61\x89\x47\xaa\x45\xb5\x5f\xf6\xd9\x0d\xb5" + - "\xfa\x3c\xf3\x05\x52\xdf\x42\x8f\x8c\xc3\x24\xd6\x79\xd9\xd2\x2e\x4a\x58\x7c\x37\x4a\x8c\x1d\xb2\xe9\x7c\xf5\x51" + - "\xed\xc6\x85\x22\x80\x96\x59\xad\x33\x9f\xf2\x90\x1b\x07\xa6\x7f\xe1\xe2\x56\xbe\x94\x62\x7e\x93\x11\x12\xb1\x9b" + - "\x63\x5b\x72\xc5\xc1\x56\xce\x59\x66\x1c\xc5\xe4\x6c\x71\xed\x06\xde\xd7\xaa\xc9\x78\x02\xe8\x5d\x24\xf2\x40\x17" + - "\x85\x2a\xe8\x3d\x0a\xf9\xbd\xff\xe0\x52\x99\x55\xff\xcf\xb1\xed\x91\xa6\xa9\x57\x99\xfa\xe6\xdb\x7a\x6c\xca\xdc" + - "\xf9\x7e\xc5\xa3\x19\x86\xa8\x1b\xca\xf8\xc6\x79\x05\x4f\xcb\x20\x5c\x29\x8b\xdf\x13\x69\xd3\xa6\x2a\x0a\x95\x3b" + - "\xfa\x4c\x5e\x94\x48\x17\xcb\x44\xdf\x58\x88\x5f\x77\x11\x87\x57\xbb\x6c\xbd\xe7\x95\x1b\xef\x42\xf8\xa7\xad\x99" + - "\xd6\xc9\x12\x56\xdf\x1a\x10\xa0\x20\xfe\x3f\xe6\xb2\xea\x8c\x48\xdf\x74\xb3\xd2\x9d\x3f\x8c\xca\x76\x3b\x1f\xa1" + - "\xb2\xdd\x8c\x53\x99\xcd\x93\x64\x84\xcc\x6c\x66\xd0\x19\xe0\xe2\x43\x71\xc9\xb3\x5f\x5b\x86\xd3\xa6\xfa\x0a\x2d" + - "\xbf\x40\x8b\x0d\x6a\x62\xc9\x34\x1b\x16\x31\xd3\xb4\x2a\xe2\xe2\x18\xcf\x26\x91\xfa\x99\x80\xdf\xf0\xfb\x7c\xf8" + - "\x0d\x7e\x2e\x26\x5c\x2e\xec\x8f\xe5\xf0\x7d\x35\xfc\x5c\x0f\x3f\x37\xc3\xcf\x87\xe1\xe7\x56\xd1\x38\x67\x8a\x95" + - "\xfe\x67\x02\x7e\xc3\xef\xf3\xe1\x37\xf8\xb9\x80\x64\x96\xc3\xf7\xd5\xf0\x73\x3d\xfc\xdc\x0c\x3f\x1f\x86\x9f\x03" + - "\x2b\xed\x59\xb1\xd2\xff\x4c\xc0\x6f\xf8\x7d\x3e\xfc\x06\x3f\x17\x90\xcc\x72\xf8\xbe\x1a\x7e\xae\x87\x9f\x9b\xe1" + - "\xe7\xc3\xf0\x73\x60\xe5\xa5\x55\xac\xf4\x3f\x13\xf0\x1b\x7e\x9f\x0f\xbf\xc1\xcf\x05\x24\xb3\x1c\xbe\xaf\x86\x9f" + - "\xeb\xe1\xe7\x66\xf8\xf9\x30\xfc\xdc\x1a\xfb\x81\x30\x5b\x77\x3f\x54\xf0\xcd\xcc\x71\x4d\x87\x5a\xf8\x0f\xd2\x48" + - "\xb0\x16\x36\xb9\xe3\xdb\x15\x60\xf7\xdd\x04\x98\x41\x80\xed\x6c\xba\xe6\xff\xb7\xb1\x00\x13\x08\xf8\xb0\x98\x2e" + - "\xc4\xff\x99\x80\x5b\x08\x07\xf6\x57\x24\xf3\xb0\x78\xbd\x76\xd6\xb7\x81\x70\xab\x07\x67\x75\x6b\x0d\xce\x6a\xdf" + - "\x0a\x16\x2f\xdd\xcd\x5b\x42\xb8\x85\xbb\x75\x0b\x08\x37\xb7\x5a\xa7\x8b\xdb\xdd\x3a\x4d\xea\xee\xc6\x31\xc7\x5a" + - "\xf4\xa1\x54\x4c\xbb\x0f\x39\xd4\x0c\x42\x79\x3a\x92\x43\x27\x10\xda\xd3\x9b\x0c\x7a\x0b\x81\xed\x2e\x65\x30\x0f" + - "\x10\xc6\xd3\xaf\x0c\x78\x03\x81\x3d\x9d\xcb\x80\xd7\x1a\x30\xde\xfa\x15\x84\xf1\x74\x33\x03\x5e\x42\x60\x4f\x5f" + - "\x33\xe0\x05\x04\xb6\x3b\x9c\xc1\xe8\x1d\x34\xd2\x76\xad\x9f\x46\x9a\xae\xf5\x12\x9c\x3b\x15\x50\x7b\x92\xfa\x21" + - "\x2c\x14\xa6\x1e\x3d\xd0\x0c\x00\x79\xb5\xa3\x07\x4e\x00\xb0\x57\x39\xda\x93\x50\x0e\x0e\x8b\xe9\x46\x7b\x12\xba" + - "\xc1\x41\xbc\xaa\xd1\x9e\x84\x6a\x88\x00\x91\x4f\x3c\xed\x49\x68\x86\x80\xc5\xdb\xbd\x02\x20\x5e\xbd\x68\x4f\x42" + - "\x2f\x38\xac\x57\x2d\xda\x93\x50\x0b\x0e\x8b\x69\x45\x7b\x8a\xb5\x6e\x19\x69\x35\xec\x9d\x91\x46\xc3\xbe\x41\x54" + - "\x82\x9f\x5e\x93\x4a\xa1\x07\x1f\x6d\xdd\x90\xd0\x33\x1b\xda\xa3\x24\x12\x2b\xb1\xb1\x3c\xda\x22\xb0\xb6\x36\x92" + - "\xad\x36\x02\xf6\xc1\x86\xf5\xe8\x8f\x40\xda\xd8\x48\x1e\x45\x12\x48\x6b\x04\xc9\x25\xad\x95\x0d\xeb\x51\x2d\x81" + - "\xb4\xb4\x91\x3c\x3a\x26\x90\x16\x36\x92\xad\x6c\x02\x16\xeb\xf0\x51\x59\x21\xfd\x3e\x2a\x2a\xa4\xd7\x43\x43\xf9" + - "\xf7\xf1\x51\xdf\xec\xa4\x5a\x3b\x08\x32\x82\xaf\x2a\xd7\x97\x4a\x6c\xdc\xe8\x10\x33\x7d\x4d\xa6\x75\xbf\x0e\x99" + - "\x68\x90\xfa\xf8\xd0\x20\xb7\xc6\x62\xd1\x2c\x7f\xd0\xca\xf5\x71\xa0\x01\x6e\x34\x40\x5d\xf7\x35\xc0\xb5\x0e\x68" + - "\xb5\x72\xa5\x95\x2f\xdd\x8d\x5c\x6a\x80\x0b\x77\x1b\x17\x1a\xe0\xdc\x6a\xa3\x21\x78\x77\x1b\x75\xf9\xbb\x9b\x08" + - "\x3d\x28\xdd\x85\x42\xc0\x66\x1a\x98\xa7\x53\xa1\x0f\x85\x3b\x51\x36\xf8\x56\x83\xb6\xbb\x17\x78\x51\xb8\x1b\x65" + - "\x43\x6f\x34\x68\x4f\x47\x03\x3f\x4a\x73\xa4\x6c\xa0\x95\x06\xe4\xe9\x72\xe0\x49\xe1\xae\x94\x0d\xbd\xd0\xa0\xed" + - "\xce\x07\xbe\x14\xee\x4c\x21\x7d\xa0\x77\x81\xbf\x7e\xbd\xbf\xf8\xdc\x69\x40\x0d\xee\x94\xe6\x4f\x21\x50\x33\x08" + - "\xe5\x55\x95\xc1\xa1\x42\x3d\x2a\x1b\x7a\x0b\x81\x31\x45\x51\x2e\x15\xea\x53\xd9\xc0\x1b\x08\xec\x55\x13\xe5\x54" + - "\x41\xaf\xca\x86\x59\x41\x18\xaf\x92\x28\xb7\x0a\xf5\xab\x6c\xe0\x05\x04\xc6\x54\x44\x39\x56\xa8\x67\x85\x88\x5e" + - "\x93\xbc\xbf\x72\xad\x97\x10\xfd\xd0\x7d\x2b\xcc\xb9\x42\xc1\x67\x08\xb8\x47\x63\x74\xef\xca\xe7\x5e\x61\x68\x5b" + - "\x04\xcb\xd6\x21\xcd\xbf\xf2\x39\x58\x18\xd6\x06\xc1\xf2\x68\x95\xe6\x61\x21\x2e\x16\x06\xbc\x42\x80\x3d\x7a\xa6" + - "\xf9\x58\x3e\x27\x0b\xc3\x5a\x20\x58\xb6\xe6\x69\x5e\x96\xcf\xcd\x42\xfb\x12\xeb\xca\x31\xbe\xb0\xfe\x4f\xae\x0a" + - "\x1f\xdf\x23\x36\xf9\xe6\xe0\xa4\xd7\xd9\x62\x95\x7b\x9d\x2d\xc6\x6a\x90\xb3\xc5\x1a\x18\xe4\x6c\x0d\x6c\xe1\xce" + - "\x56\xdf\x82\x20\x67\xab\x6f\x75\x90\xb3\xd5\x4b\xca\xe7\x6c\xf5\x42\x0d\x72\xb6\xfa\x8e\x08\x72\xb6\xfa\xfe\xf3" + - "\x39\x5b\x7d\x57\x07\x39\x5b\xbd\x58\x43\x9c\xad\x73\x16\xe4\x6c\x29\xb0\x30\x67\x4b\x81\x87\x39\x5b\x12\xdc\xeb" + - "\x6c\x49\xa0\x30\x67\x4b\x42\x87\x39\x5b\x12\xda\xeb\x6c\x49\xa0\x30\x67\x4b\x42\x87\x39\x5b\x12\xda\xeb\x6c\x49" + - "\xa0\x30\x67\x4b\xf5\x41\x88\xb3\x25\x81\xfd\xce\x16\x83\x1a\x75\xb6\x14\x54\x90\xb3\xa5\xa0\x83\x9c\x2d\x09\xed" + - "\x73\xb6\x24\x4c\x90\xb3\x25\x81\x83\x9c\x2d\x09\xec\x73\xb6\x24\x4c\x90\xb3\x25\x81\x83\x9c\x2d\x09\xec\x73\xb6" + - "\x24\x4c\x90\xb3\xa5\x44\x1f\xe0\x6c\x49\x58\xaf\xb3\x75\xce\xae\x72\xb6\x00\xf8\x35\xce\x16\x40\xbb\xc6\xd9\x1a" + - "\xd0\x02\x9c\xad\x01\xf8\x1a\x67\x6b\xc0\xba\xc6\xd9\x1a\xb0\x02\x9c\xad\x01\xf8\x1a\x67\x6b\xc0\xba\xc6\xd9\x1a" + - "\xb0\x02\x9c\xad\x01\xf8\x1a\x67\x0b\xf4\x65\xb8\xb3\x35\x20\xdd\xe2\x6c\x19\xbb\xec\xf7\xd8\x94\x7e\xf3\xae\xb4" + - "\xd7\xdb\x62\x95\x7b\xbd\x2d\xc6\x6a\x90\xb7\xc5\x1a\x18\xe4\x6d\x0d\x6c\xe1\xde\x56\xdf\x82\x20\x6f\xab\x6f\x75" + - "\x90\xb7\xd5\x4b\xca\xe7\x6d\xf5\x42\x0d\xf2\xb6\xfa\x8e\x08\xf2\xb6\xfa\xfe\xf3\x79\x5b\x7d\x57\x07\x79\x5b\xbd" + - "\x58\x43\xbc\xad\xe2\x18\xe4\x6d\x29\xb0\x30\x6f\x4b\x81\x87\x79\x5b\x12\xdc\xeb\x6d\x49\xa0\x30\x6f\x4b\x42\x87" + - "\x79\x5b\x12\xda\xeb\x6d\x49\xa0\x30\x6f\x4b\x42\x87\x79\x5b\x12\xda\xeb\x6d\x49\xa0\x30\x6f\x4b\xf5\x41\x88\xb7" + - "\x25\x81\xfd\xde\x16\x83\x1a\xf5\xb6\x14\x54\x90\xb7\xa5\xa0\x83\xbc\x2d\x09\xed\xf3\xb6\x24\x4c\x90\xb7\x25\x81" + - "\x83\xbc\x2d\x09\xec\xf3\xb6\x24\x4c\x90\xb7\x25\x81\x83\xbc\x2d\x09\xec\xf3\xb6\x24\x4c\x90\xb7\xa5\x44\x1f\xe0" + - "\x6d\x49\x58\xaf\xb7\x55\x1c\xaf\xf2\xb6\x00\xf8\x35\xde\x16\x40\xbb\xc6\xdb\x1a\xd0\x02\xbc\xad\x01\xf8\x1a\x6f" + - "\x6b\xc0\xba\xc6\xdb\x1a\xb0\x02\xbc\xad\x01\xf8\x1a\x6f\x6b\xc0\xba\xc6\xdb\x1a\xb0\x02\xbc\xad\x01\xf8\x1a\x6f" + - "\x0b\xf4\x65\xb8\xb7\x35\x20\x8d\x79\x5b\x9d\x3a\x01\xea\x3d\x4d\x2a\x4f\x64\x13\x96\xa0\x8e\xc1\xcb\xf3\x5a\xec" + - "\x6e\xd3\x83\x7e\x86\x4b\x9e\x2d\x17\x9f\xc1\x35\x0c\xf3\xee\x02\x38\x49\xd5\x9d\x18\x5d\xe7\xdd\x60\xc5\xa9\x91" + - "\xe1\x04\x49\x7a\xe2\xbe\x65\xc5\xc9\x3c\x75\xfb\x2a\x7b\x7d\xea\x9a\xa7\x2e\x9b\x44\xd6\xb7\xd3\xf0\xed\x50\x55" + - "\x9d\x09\xa7\xbe\x9d\x78\x9a\x18\xfe\xf5\x44\x49\x66\x42\xaa\x6f\x27\x28\x32\x25\x17\xcf\x41\x66\x33\xc9\x4d\x57" + - "\xd5\x9e\x4c\x23\x59\x96\x19\xed\x33\x6a\x36\xc9\x71\xc9\x20\x97\x9b\xe6\x1e\xa2\xa2\xf7\x3f\x49\xe2\xbb\x43\xde" + - "\xc8\x1b\x40\xb0\xd9\x7e\x38\x28\xb4\xb4\x2a\x7a\x95\xab\xc7\x49\xfa\x01\xad\x8e\xd0\x8b\x9d\x64\xc7\x61\x4f\xe2" + - "\x1a\x09\x14\x7c\x82\xe8\xd2\xa7\x4e\x65\xac\x82\xa0\x1e\x71\x46\x53\xdf\xd8\x03\x89\xa6\x38\x5c\x9c\x56\x65\x46" + - "\xcb\x96\x66\x98\xf2\xa2\xa5\x40\x2a\xb0\xdc\x56\x69\xb4\xd4\x81\x6d\xab\x39\x5a\x6a\x28\xfc\xca\x18\x80\x31\x17" + - "\x92\x96\xfb\xc8\xab\xd1\x0a\x01\x6d\x3d\x52\x08\xd9\x1f\x8a\x91\xb6\x23\x85\x38\x2e\xd2\x72\xa4\xf0\x74\x43\x8b" + - "\xae\xa7\x2c\xc6\xab\xb4\x7b\x73\x53\xbc\x6d\xd7\xe4\x35\x90\xc7\xae\xec\x4e\x71\x75\x88\xbb\xd7\x9a\x7e\xa8\xb2" + - "\xec\xa3\x53\xed\xb6\xfd\x3f\x9d\x18\xbb\xac\x3c\x90\xf2\x5f\x90\x66\x97\x25\xb4\xc9\x25\xad\x8a\x1f\xd3\x82\xb4" + - "\xed\xef\x7f\xe8\xe7\x26\x7e\xc7\x12\xcb\x1e\xa4\xae\x88\x48\xb5\x2a\x2e\x67\x76\x99\x54\x2c\xb2\xc1\xad\x12\x4e" + - "\xb9\xcb\x34\xc2\x93\x48\x7c\x3e\xdd\x56\x1f\xe5\x77\x43\xec\xda\x8c\x09\x62\xca\xf3\x23\x61\x73\x87\x2a\x3a\x21" + - "\xd3\x4a\x26\x4a\xa1\xb1\x1a\xf4\x75\xaa\xb2\x2e\xe9\xd3\x0c\x56\x9b\x59\xa4\xd9\xbf\x41\xc7\x5d\x24\xb1\xda\x84" + - "\x9a\x81\xda\xec\xb9\x0d\x6b\xdd\xa0\xbb\x2e\x92\x43\x6d\xd2\x96\x8e\xa8\x0d\xaa\x76\x82\xc4\x4e\x7c\x1d\x46\x8a" + - "\x17\x0c\x8e\x64\x4c\x8d\x9f\x0c\xa6\x0d\xa0\xa1\x55\x1c\xdc\x49\x6d\x68\xe3\xc8\xd5\xfe\x87\xfe\x9f\x43\xad\x44" + - "\x26\x05\x54\xaf\x54\x19\xae\x58\xa2\xd8\xa1\x59\xb2\xd4\xd2\x1f\xac\x46\xab\xcc\xa5\x5c\x2e\xaa\x68\x8d\x52\x83" + - "\x40\x8d\x88\x7e\x61\xad\x04\x0a\xe6\xa2\x0a\x6a\x74\xab\x98\x96\xb9\x02\xd7\x1d\x2d\x95\x85\x47\xc7\x0c\xb8\x71" + - "\x25\x33\x18\x47\xb4\x4c\x23\xe9\x55\xb3\xa0\x7c\x1b\x59\x42\xb7\xe9\xda\xa1\x67\x79\x79\xa8\x50\x25\xe3\x05\xb8" + - "\x86\xf5\x65\x0e\xf5\x62\x45\x96\xfe\x58\xb5\xe8\x05\x2e\xad\x42\x89\xd9\xb5\x48\x8d\x91\xb5\x20\xca\x64\xb5\x06" + - "\x68\x12\x4a\x4c\xd6\xe2\xd1\x21\x98\x99\x04\xd7\x8d\x21\x55\x89\x47\x81\x20\xd0\xb8\xf6\x40\x66\x11\xd5\x19\x88" + - "\x79\xf5\x66\x3c\x87\x4a\xba\xa4\x8b\xc3\xc2\xa1\x34\x22\x3d\x0a\xaa\x37\xaa\x0c\x57\x1d\x51\xec\xd0\x1e\x59\x6a" + - "\xe9\x09\x56\xa3\x55\xe6\x52\x23\x17\x55\xb4\x46\xa9\x31\xa0\x46\x44\x9f\xb0\x56\x02\x95\x72\x51\x05\x35\x7a\xe6" + - "\x3f\x3d\x59\x16\xa6\x33\x5a\x7e\x1a\x8f\x6e\x19\x70\xe3\xea\x65\x30\x8e\x68\x98\x46\xd2\xab\x64\x61\x49\x74\xc8" + - "\x61\x9e\xa6\x0e\x3d\xe3\x09\x72\x50\x35\x93\x45\xb8\x96\xf1\x52\x87\x92\x89\x42\x4b\x8f\x90\xda\xcc\x22\x97\x86" + - "\x39\x48\x62\xb5\x49\x0d\x1a\x6a\x43\xd4\x0b\x69\x1d\xd0\x2e\x07\xc9\xa1\x36\x8f\x6e\xc1\x24\x44\xb8\xce\xc0\xac" + - "\x44\x1e\xd5\xd2\xc1\xc6\x35\x4b\x67\x1a\x51\x2c\x48\xd0\xab\x57\x41\x69\x93\xf6\x69\x6a\xa8\x15\xc8\xe8\xcb\xb0" + - "\xe0\x6d\xc4\x69\x32\xfb\x9d\x76\xc9\xf9\x05\xbb\x78\xcc\xdf\x6e\x8d\x48\x99\x45\x1f\x86\x40\xd3\x66\xbd\x51\xdb" + - "\x91\x68\x45\x66\x8c\xca\xca\xa3\xb4\x32\x72\xe7\xc4\xaf\x5a\xf6\x9c\xf8\xdc\xaa\xb4\x38\x32\x29\x43\xff\xad\x67" + - "\xf0\x94\xb3\x18\x1b\xbf\x90\xbd\x27\x2c\xa3\xb2\x73\xc1\xc9\x63\x82\x26\x8f\x4f\x20\xf6\x80\x64\x6d\xf1\x22\xa1" + - "\x0b\x70\x1f\xd4\x89\x6f\xb7\x3a\x01\x91\x35\xb9\x0f\x6a\x8c\x1c\xb2\x98\xf6\x41\x9d\x7a\x6a\xbc\xcb\xdc\xf9\x86" + - "\x1c\x64\xf4\x28\x06\xcc\xac\x1b\x86\x06\x45\x09\xc3\x4e\xde\x16\xa2\xc1\x8e\x5b\xb0\x07\xb9\xbf\x09\xfb\xa6\xba" + - "\x87\x4e\x7a\x13\xb6\x56\x37\xec\x04\x3d\xd2\x7d\x65\x4f\x80\x8c\x47\xd7\x77\xc4\xf5\xc8\xa0\x1f\xde\x80\x7c\x4b" + - "\xcd\xa0\x17\xde\x80\x0c\x6b\xd6\xfa\x40\xec\x91\x5e\xdf\x09\x80\xa0\x98\x2c\x6f\x45\xf6\x1b\x0b\x5b\x8e\xb7\xd5" + - "\x8c\x21\x9f\x34\x51\x18\xc6\x95\xcd\x30\x87\x9c\x16\x59\x4b\x3b\x35\x33\x89\x39\x23\x71\x67\xfc\x4e\xb0\x04\xde" + - "\x05\x3d\xd2\x92\x4b\xde\x4e\xb2\x62\xcc\x43\x18\x59\x5f\x5a\xda\xf9\x0c\xd9\xa9\xb0\xb3\x95\xe8\x39\x6e\xf4\xac" + - "\xe8\x58\xea\xc1\x55\xff\x4f\xb2\x4f\xf6\xf4\xfa\xb4\xf6\x06\xeb\x2b\x24\x7b\xee\x90\x13\x8f\x3d\xd1\xf0\x63\xf7" + - "\x5a\xd3\x1f\x5a\x4a\x9a\xf4\xc4\x63\x82\xbf\xee\x8b\x18\xa0\x52\xf6\xee\xf4\xbe\x7a\xf9\x49\xbc\x16\xc1\xbf\x36" + - "\x24\xcb\x2b\xce\x89\x4a\xde\xc8\xf2\xf7\xc0\xbe\x51\x3b\x3d\x7f\xd9\x5a\xfd\xc0\xb3\x34\xd9\xd5\x1d\x72\x99\xc9" + - "\x4e\xd7\x07\x1b\xb2\xe9\xdd\x2a\x0c\xf4\x11\x4d\x65\xc0\xdf\xb8\xf8\xf1\x7c\x29\xba\xbc\x66\xa9\xf3\xc4\x97\x5e" + - "\x59\x38\x19\xe4\xa9\x03\x93\x33\xf9\x2c\x05\x26\x20\xa4\x8c\x8b\x89\x17\x08\x27\xf7\x57\x7f\x85\xa2\xba\x74\xf5" + - "\xa5\x73\xc8\x45\xdb\xf8\xdc\xd8\x59\x8a\xc2\x9f\x19\x59\xad\x54\xc8\xf3\x50\x35\xe7\x38\xad\xca\xae\xa9\x5c\x99" + - "\xef\x1c\x0f\x3b\x2c\x96\xc6\x1b\x01\xeb\xfa\x85\xa5\xa8\x7e\x13\x5f\xae\x5c\x48\x56\x96\xab\xfc\x4c\x8e\x14\x66" + - "\x81\x0a\x4f\x91\x34\x96\xff\xaa\xa7\xd1\xff\x7f\x23\x9f\x55\xb2\x71\x67\xc0\x1a\x41\xc1\xde\xa1\x10\x7c\xb1\x16" + - "\xc2\x37\x24\xa2\xe9\x6c\xd5\x4e\x22\x9b\xc1\xde\xac\x9b\x70\x8f\xf6\xcb\x15\x23\x74\x07\x7a\xfa\xc3\x15\xef\xde" + - "\x49\x7a\x6f\x26\xc6\x0a\x31\x05\x03\xaf\x38\x40\xc2\x2c\xaf\x31\x39\xd0\xad\x36\x96\x9c\x89\xbf\x02\x64\x3e\x61" + - "\xa9\xbc\x58\xca\xf5\x77\xef\x58\xf9\x2c\x99\x4f\xa2\xd9\x66\x35\x89\xe6\x8b\xc5\x24\x9a\xae\x6f\xe9\xca\x10\xb2" + - "\x68\xbb\x77\xcc\xa0\xd7\x05\x49\xe9\xa9\x2a\x32\x23\x03\xf3\x76\xcb\x5b\x5e\x93\x34\xef\x5e\x77\xd1\x0c\xa5\xd1" + - "\x2f\xc3\x98\x79\xf2\xd1\x71\xd4\x2e\xa4\x78\x13\xfa\x8f\x59\xce\x9e\xe0\xc8\x7e\x9a\x44\x7a\x41\x43\x49\x56\x95" + - "\xc5\xeb\x4f\x93\x48\xfa\x14\x03\xb0\x0e\xeb\x8e\x12\x88\x14\x91\xfe\xc6\x43\x1e\xc6\xaa\xe2\x6d\x12\xa9\x54\xcb" + - "\xaa\x8b\x49\x51\x54\x5f\xa9\xdc\x04\x95\xef\x24\xd9\x38\xfe\x29\x04\x9b\xc0\x49\x5d\x53\xd2\x90\x32\xd5\xd3\xfb" + - "\x22\x4b\x78\x89\xd1\xbb\x5b\x19\x7d\xce\x53\x1a\xd7\xf9\x0b\x2d\x62\xf6\xf8\xd1\x2e\xe1\x6b\x7a\x50\x5d\x46\x3a" + - "\xaa\x4f\xdb\x5d\x7e\x36\xbe\xf4\x30\xfd\xd7\xb8\xa8\x52\x52\xe8\x65\xe7\xaa\xec\x4e\x3f\xa9\x35\xa6\x66\x7c\x17" + - "\x4b\x99\x16\xec\xdd\x94\xab\x04\x3b\xe3\x10\xb7\x67\x93\x7a\xdf\xe5\x6e\x08\xce\x11\x33\x1d\x7e\x32\x1a\x93\x1e" + - "\x58\xce\x34\xa3\x68\x32\x22\xb0\xda\xb3\x2d\x13\xbc\xc8\xa8\x77\x00\x32\xa8\xf3\x3a\x55\x71\x84\x88\x2b\xc1\xc5" + - "\x55\x1c\xc7\xc4\xa5\x43\x38\xc4\x65\x93\x71\x8b\x4b\x87\x1d\x17\x57\x71\x74\x8a\xcb\x28\xc2\xc5\x55\x1c\xbd\xe2" + - "\x2a\x8e\x88\xb8\x96\x6b\x3d\xe9\x1c\x1b\x67\x8c\x7d\xe0\x72\x6a\x01\x29\x95\x84\x42\x78\x63\x93\x68\xca\x9c\x2f" + - "\x63\x03\x1d\xa6\xf7\xc2\x9e\xbf\xba\xea\xa5\x12\x59\x57\xc4\x96\x01\xaa\xc6\x61\x51\x00\x43\x76\x72\x81\xa2\xa7" + - "\x0a\x73\xbc\xfc\x92\x58\x0b\x02\xf1\xee\x8c\xe3\x01\x21\xc5\x09\xee\xb8\xab\x72\x99\x7f\x1c\x05\xeb\x75\x93\xb7" + - "\xc0\xf2\x60\x65\xdb\x10\x7c\xb0\x12\xc0\x1f\x87\x82\x42\x5d\xaa\xc5\x80\x9e\xb7\x6f\x8e\x48\xf5\x93\xd5\x97\x9f" + - "\x40\x97\x42\xaa\x31\xd2\xff\x82\x53\x93\xf1\x00\x6d\x70\xe5\x4e\xbf\xad\xc3\xf0\x07\xdf\x02\xba\x52\x70\xfc\x69" + - "\xa4\x45\x9f\xec\xf6\xb9\xf2\xb6\xcb\x63\xba\xe0\xbd\x3a\x6b\x16\xc4\xf5\xc7\x0f\x28\x54\x44\x9f\x7b\x14\xf6\x54" + - "\xe2\xe0\x8b\x26\x38\x2b\x5b\x34\x07\x5c\x9d\x38\x2f\x05\xdc\xf8\xa7\x6b\x53\x84\x80\x25\x4d\x7a\xe0\x3b\xe6\x20" + - "\x98\x1d\xd1\xf7\x38\x02\x66\xf5\x47\x00\x63\xaa\x66\xdd\x94\x58\x9f\x7d\x6c\x09\x18\x1f\x57\xc0\x34\x79\x98\x82" + - "\x4e\x4d\xcc\x4f\x1c\x59\xd6\xcc\x58\xb8\x69\xeb\x49\xf3\x20\xed\x06\x1f\x31\x9e\xea\xc0\xf4\xe2\x29\x16\x13\xad" + - "\x91\x92\x31\x41\x92\x8e\xcb\xaa\x34\x3c\x38\x35\x3f\x1a\xe7\xfd\xd0\x0c\xbe\x73\x74\x0d\xba\xc2\xf3\x23\x6b\x51" + - "\x07\x7f\xc5\x88\xa3\x80\x46\x2c\x80\x8f\xa2\x1c\x50\x94\x30\xcc\xf7\x35\xcc\x9c\x3d\x94\xdb\x61\xfd\x2d\xa4\x70" + - "\x2d\x2f\xc1\x82\xf1\x10\x06\xb2\xf2\x40\x89\xa5\xc5\x95\x02\x84\x83\xc3\xe4\x5d\x1b\x2c\xf3\xb7\xc9\x56\x57\x5f" + - "\xe1\x30\x41\x57\xe9\xd1\x7a\x72\x41\x7b\x92\x6b\x78\x3d\x0c\xa1\x2e\x8e\xe0\x23\xfd\xb7\xc6\xb5\xd8\x51\x3f\xe2" + - "\xbf\xf9\xb4\xb8\x1f\xdb\x86\x16\x1b\x84\x1d\x9d\x50\x1c\x3d\x9a\xf3\x1b\x0a\xe3\x5a\x96\x82\xe5\xe3\x21\x8c\x2b" + - "\xb3\x09\x15\xa6\xcc\x26\x16\xa6\xcc\x92\x77\x4d\x99\x1f\xee\x22\x62\xc9\xd1\x89\xb4\xf1\x81\xd2\xac\x5f\xd5\x3b" + - "\xbc\x33\x14\xd4\x16\xb8\x31\x0f\x2c\xe7\x53\xe0\x16\x6a\x2d\x75\xd4\x07\x9d\xd6\xc1\x79\x82\xd3\xca\xcf\x71\x5e" + - "\x66\xf4\x65\x17\xcd\xf1\xf5\x83\xbc\xfe\xb9\xd4\x1f\x42\x5d\x60\xd1\x4b\xf9\xd1\x7e\xfe\x8d\x49\x97\x3b\x85\x31" + - "\x7d\xa6\x65\xd7\xea\x07\x7a\xe5\x68\xf9\xe4\x69\x95\xbc\xb1\xba\xd6\x39\x19\x53\x46\x35\x9f\x04\xd0\x96\x96\x2e" + - "\xd4\x6a\xb3\xfe\x93\x2f\x74\x41\xdf\x1e\xfd\x3e\x78\xbb\x7a\xb1\x60\x48\xf9\x3a\x7a\xf1\x89\x16\x35\xf7\xdc\x4d" + - "\x44\xe6\xff\xa0\x1f\x81\x3b\x07\x4b\xed\xd5\x1d\x56\x28\xfd\x3c\x94\x1f\xe8\x74\x19\xf8\x9a\x93\x08\xbc\x32\xec" + - "\xd1\x39\x9d\x67\x4b\xef\x8d\x28\x28\x47\xfd\x6d\xc3\xd3\xa3\x8c\xba\x83\xb6\xfc\xc1\xbc\x37\x87\x69\xd7\xf5\x4b" + - "\xf4\xdd\x7a\xb3\x9f\xad\x1f\x6e\x8e\xc9\x02\x1a\x68\x83\x60\x10\x85\x64\x99\xb8\x4a\x66\xcb\xdd\x79\x7e\xf7\xd1" + - "\xd5\x5b\xa3\xf2\xd3\x07\xa0\x1b\x59\x3e\x1c\x67\x0e\x2f\xeb\xbb\x3e\xbc\x86\x62\x74\x78\xa9\x62\x6b\x78\xa9\x12" + - "\x38\xbc\xf4\x8f\xe6\xf0\x12\xa5\xf8\xf0\x32\x0b\xf1\xe1\x25\xa1\xec\xe1\xa5\x95\xb8\x87\x97\xf6\x5e\xa2\xce\xf3" + - "\xd8\xf0\xe2\xa8\x7f\xbf\xe1\x85\x32\xea\xdb\x13\x59\xcd\xee\x35\xbc\xd2\x84\xcc\xd6\xfb\xb7\x0d\x2f\x4e\x03\x6d" + - "\x90\x7f\x78\x0d\x72\x77\x9e\x40\x45\x86\x57\x60\x47\xe3\xc3\xcb\x46\xa6\x4d\x53\x35\xd6\xe0\x32\xbe\xea\x43\x4b" + - "\x16\xa2\x03\x4b\x14\x5a\xc3\x4a\x7c\x87\x83\x0a\x7e\x32\x87\x14\x2b\xc3\x07\x94\x5e\xa4\x0f\x27\x08\x01\x87\x92" + - "\x4e\x76\x64\x28\x69\xcf\x84\x42\x4e\xc7\x06\x12\x47\xfc\xfb\x0d\x24\x84\x4d\xf7\x30\xe2\xef\x9b\xde\x69\x18\xd1" + - "\x87\xe5\xc3\xe2\x8d\xc3\x88\xd1\x40\x9a\xe3\x1f\x44\x83\xcc\x9d\x47\x6d\x91\x41\x14\xd4\xc5\xf8\x10\xb2\x51\x15" + - "\x18\x57\xa5\xff\xed\x21\xc2\x2f\xa1\xae\x74\x07\x52\xc7\x97\x8f\xfc\x8f\xd3\x51\x31\xa0\x61\xb0\x39\x8e\x2a\xc0" + - "\xf0\xe9\xca\xb9\x07\x00\x8f\x1c\x6c\x16\xfd\xbf\xc0\xe4\xd6\x8c\x4f\x31\x9c\xcc\x7d\x0d\x77\x10\x1a\x8d\x37\x3b" + - "\x82\xcb\x72\x9f\xc9\xae\x09\x0e\x47\x4f\x5d\xc2\xc1\x97\x4f\xf3\xdc\x5a\x0d\x5c\x51\xe2\xb5\xa1\x24\x80\x0a\xe3" + - "\xa8\xec\x04\xdb\xb5\x8c\x41\xaa\xc6\x9a\xda\x03\x68\x0d\x27\xbe\xf5\x16\x86\xb0\xef\x4a\xed\x3c\x35\xcc\xa7\xe1" + - "\xa2\xf0\x84\x74\x14\x92\x84\x49\x43\xd7\xe6\x16\xfc\x58\xf4\xb5\xd2\x02\x33\x9c\xf6\x7d\xd8\x7f\x19\x57\xd5\x61" + - "\x09\x7d\x37\x76\xd4\xc4\x85\x30\x05\x5a\x6f\x45\x7f\x7d\x24\x1d\x3b\x66\x48\x0d\xd6\x06\x84\xda\x19\xc7\x77\x94" + - "\xd0\xc4\x15\x06\x1b\xee\x98\x86\x6e\xc3\x94\x11\x33\xf6\x44\xc1\x4b\xb2\x56\xa7\x61\x65\xd0\x75\xb0\x80\xa4\xbf" + - "\x81\x17\x60\x6f\x17\xc3\xb0\xff\xd8\x73\xc1\xc9\x4d\x8c\x83\x1d\x3f\xb8\x99\xba\x31\x42\x3b\x10\x05\xdf\x2c\x0e" + - "\x7e\x38\x2c\xc8\x80\x6b\xec\xdb\xe3\x0f\x93\x0f\x3e\x0a\xac\xb7\x50\xbd\x5d\x1c\xaa\x2e\xe0\x79\xaa\x5b\x5b\x65" + - "\x84\x0a\xc7\x1a\x39\x5b\x4e\x17\x8b\xd1\x17\xe7\x42\x6b\x6c\xcf\xe3\x35\x1a\x47\x04\xa4\xb5\x1d\xdb\xc7\xd5\xcf" + - "\x18\x3a\xb7\x71\xf5\x73\x87\xd8\xce\xae\xe7\x2c\x22\x1e\xd3\x43\xee\x68\xf8\x77\x88\xe3\x73\x1b\x77\xd5\x25\x3d" + - "\xc5\x24\xe5\xe6\xe5\x4c\xca\xbc\xbe\xf4\x26\xa6\x2a\x79\x98\xd2\x57\x6a\xec\x30\x43\xf7\xf5\xd2\xd2\x26\xe6\xa1" + - "\xe7\xe1\xfc\x23\x3b\x60\xe6\x28\x69\xf1\x02\xf4\xe3\x35\x27\x2c\xfd\xaf\x3e\x0e\x6f\x51\xf6\xfd\x2b\x6e\xa9\x4f" + - "\xc5\x39\x5b\xf0\x69\x07\x3f\x81\xdf\x3b\x0d\xa3\xd7\xba\xe1\x23\xc4\x01\x9e\xff\xaf\x7e\x3e\xd7\xe2\x11\xfe\x1e" + - "\x2e\x89\x19\xa7\xd3\x99\x4a\x65\x34\xad\xd8\x61\xaf\x52\x8f\x08\x0f\x82\xd0\x9a\x6d\x5e\x36\x33\x3a\x23\xfc\x94" + - "\xe4\xa2\x7e\x61\xcd\x36\x16\x25\x33\xcf\x73\xae\x1e\x14\xc8\x35\xd8\x89\xdf\x77\xe5\xd8\x11\x3d\x39\xc6\xb1\xe8" + - "\xf8\x23\xbe\xa9\xcd\x46\x6f\x5e\x74\xbd\xd6\x91\xa2\x3e\x91\x0f\xe2\x94\x60\xf4\x43\xb4\xd6\x0f\xd6\x86\x3c\x0c" + - "\xab\x1d\x33\x9c\xae\x57\xa0\x2d\x71\x46\x0f\xe4\x52\x74\x58\xef\x79\x4e\x23\xeb\x6b\x2d\x70\x09\x10\x90\xd4\x3a" + - "\x57\x7d\x04\x7a\x23\xbf\xed\x40\x92\x0e\xf8\x19\x03\xe5\x17\x17\xa3\x69\x55\xd3\xf2\x69\x9a\x35\x55\x9d\x55\x5f" + - "\xfb\xf9\xfb\x78\x2c\x28\x84\x54\x8f\x51\x8f\x35\x89\xae\xfb\x7f\xd8\x0a\x32\xeb\xff\x85\x36\x6c\xa7\x3e\x86\xb2" + - "\x86\xeb\x38\x56\x9f\xae\x6f\xd6\x67\x5c\xd0\xaa\x54\x33\x23\x56\xf1\xce\x8b\x8c\xf5\xc1\x50\x38\xdc\x22\x05\xc5" + - "\xda\xa9\x59\xf4\x3b\xca\x2f\x28\x46\x19\x1e\xca\x51\x8e\x41\xf1\x18\xba\x50\x21\xc7\x50\x95\x08\xa3\x00\x20\xb5" + - "\xcc\x18\xa4\x10\xe2\x08\xd8\x2e\x98\xe0\x2e\x90\x20\x6b\xa9\xe7\x9a\xf2\x15\x83\x39\x9a\xee\x49\x76\xa4\x9a\x99" + - "\xf0\x3e\xc0\x0d\x69\xd4\x4d\x7e\x26\xcd\x6b\x30\xf2\x86\xec\x37\x08\x67\x73\xba\xce\xc8\x12\x21\xac\x2b\x94\xfc" + - "\x08\x55\x57\x7c\x33\x2d\x8d\xfc\x8c\x81\x8e\x5b\x1a\x01\x69\x58\x1a\x77\xc3\xe6\x0f\xeb\x64\x9b\x60\x0d\x4b\x96" + - "\xd9\x26\xb8\x61\x21\x96\x46\x67\x6d\xdc\xd2\xc8\xfa\x0c\x4b\x63\x7e\xc6\x05\xed\xb0\x34\x66\xf1\xce\x8b\x8c\xf5" + - "\x81\xcb\xd2\x88\x62\xcb\xd2\x58\xdf\x51\x7e\x9d\x96\xc6\x2a\x47\x39\x76\x5a\x1a\xbb\x7c\xc4\xd2\x08\x84\x51\x80" + - "\x00\x4b\x63\xe8\xfc\x08\x58\x80\xa5\x31\x46\xc6\x18\xd8\x88\xa5\xb9\x7e\x48\x63\xf6\x06\x50\xf1\x66\xef\xeb\xc9" + - "\xc8\x0d\xc9\xb0\x91\xb9\x4a\xf7\x0f\xab\x14\xe1\x6f\x99\x12\xba\x4c\x11\xc2\xba\x66\xc9\x8f\x50\x87\x65\xd6\x20" + - "\xc3\xe4\xc8\xcf\x18\xe8\xb8\xc9\xd1\x73\x2e\x8d\x37\x6c\xb9\xdc\x66\xcb\x25\xb6\x85\xbb\x7d\x58\x2e\xb6\xa1\x0d" + - "\x0b\x31\x39\xce\x74\x50\x0e\x93\x23\xeb\x33\x4c\x8e\xf9\x19\x17\xb4\xc3\xe4\x98\xc5\x3b\x2f\x32\xd6\x07\x2e\x93" + - "\x23\x8a\x2d\x93\x63\x7d\x47\xf9\x75\x9a\x1c\xab\x1c\xe5\xd8\x69\x72\xec\xf2\x11\x93\xa3\xd2\x62\x8d\x00\x04\x98" + - "\x1c\x43\xe7\x47\xc0\x02\x4c\x8e\x31\x32\xc6\xc0\x46\x4c\xce\xf5\x43\x1a\x33\x39\x80\xca\xa8\xc9\xc9\xcb\x43\x15" + - "\x6a\x6f\xf6\x69\x82\xee\x5a\x2d\xd7\xfb\x87\x8c\x98\x54\x75\x9d\x62\x5f\xa0\xea\xb2\x3c\x53\x16\x88\xa1\x2a\x20" + - "\x67\x95\x6f\x14\x5f\xd1\x88\xc5\x6c\x9f\x64\x2b\xcc\xa8\xaf\xb7\x64\x9f\x8e\x37\x22\xc4\xaa\x28\x7e\xc6\x0d\x0a" + - "\xab\xc4\xb0\x26\xda\x37\x44\x8c\x0e\x3b\xa2\x95\xd9\xa2\xc5\x2d\x88\x5e\xa2\x9b\x8f\xbe\xcc\xb2\x1d\xfa\x47\x9b" + - "\x3b\xa7\xd5\xd0\x0b\x6d\xfe\x2c\x7b\x81\x16\x29\x0e\x5d\x23\x8d\x67\x41\xf3\x95\x06\x98\x09\xa8\xad\x3e\x98\x00" + - "\x03\x01\xb4\xda\x4f\x6a\xcc\x34\x5c\x37\xfa\x50\xbb\x30\x90\x18\xb5\x0b\xf2\xf0\x46\xd8\xa8\x3a\x24\x24\x5b\x62" + - "\xcc\x51\x4a\xe6\x8b\x35\x42\x58\x57\x1c\xf9\x11\x76\xbc\xcc\x11\x66\xb8\x22\xf2\x33\x06\x3a\x6e\x29\xf4\x0c\x6b" + - "\xe3\x0d\xa3\xe9\x76\x33\xc3\x16\x9c\xd9\xea\x61\x35\x9b\x87\x36\x2c\xc4\x68\x38\x93\xbf\x39\x2c\x87\xac\xcf\x30" + - "\x1e\xe6\x67\x5c\xd0\x0e\x13\x62\x16\xef\xbc\xc8\x58\x1f\xb8\x6c\x89\x28\xb6\xcc\x89\xf5\x1d\xe5\xd7\x69\x54\xac" + - "\x72\x94\x63\xa7\x2b\x62\x97\x8f\xb8\x22\x2a\x09\xde\x08\x40\x80\x8d\x31\x74\x7e\x04\x2c\xc0\xd2\x18\x23\x63\x0c" + - "\x6c\x2c\xce\x72\xf5\x90\x46\xa3\x2d\x03\x95\x51\x93\xc3\x93\xb7\x05\x5a\x9c\x6c\xbb\x5a\x2c\xd1\x81\xb9\x5c\x1c" + - "\x16\xc4\xa6\x6b\xc4\xef\xf8\x37\x2d\x50\xc8\x73\xc7\x21\x60\x66\x70\x0e\x66\xa3\xf3\x46\x4e\xaf\x69\x50\xba\x5d" + - "\x24\x73\xcc\xf5\x23\xe9\x7c\x3b\x5f\x85\x35\x28\x28\x9e\xeb\xc8\x03\xe8\x0a\xe7\xf2\xca\xcc\x68\xae\xfe\x15\x15" + - "\xae\x2b\x96\xab\x97\x62\x02\x77\x44\x72\x8d\x32\x23\x90\xcb\x4a\xed\x38\xae\xf1\x19\xe3\xd4\x1d\xc5\x35\x8a\x31" + - "\x5e\x1d\x6e\x8b\x55\x38\xea\xb8\xc8\x2c\x88\xfe\xf2\x90\x00\xae\xa6\xdb\x7e\xa8\x90\xf0\x2d\x1c\x03\x63\xe4\x46" + - "\x8c\xca\xd5\xa3\x16\xb3\x29\x80\xc8\xa8\x4d\x29\xf2\x92\x6f\xd3\xa3\x37\xbc\x5d\x81\x1e\xb9\x27\x9a\x98\xa4\x44" + - "\xe7\xf6\x3f\x75\x45\xea\xbf\xec\xac\x2f\x40\x1b\x3d\x02\x56\x3c\x7a\x9f\x56\xb9\x76\xfb\xcc\xc3\xba\xcd\xa8\xa6" + - "\xba\xec\x03\x48\xa1\xa9\xf5\x94\xfd\xd8\x4b\x10\x11\xb5\xca\x5a\xac\xe6\x9b\x14\xdd\x65\xbd\x94\x19\x6d\x8a\xdc" + - "\xda\xd7\x1e\xaf\xd8\x31\x04\x8d\xa2\x91\x99\x1d\xb4\x60\xa4\xaf\x90\x66\xc1\x17\x6b\x3c\x3b\xc7\xea\x90\xc7\x53" + - "\xff\x97\x64\xf3\x08\xcf\xf9\xfc\x2a\xf7\xe8\x40\xdd\xed\x19\xd6\xad\xdf\xeb\xbd\xef\x4d\x54\x50\xe9\x4b\x0b\x2b" + - "\x7d\x69\x8d\x06\xf3\xfd\xeb\xbb\xd5\xe9\x3b\x71\x6a\x27\x2b\x1b\x50\x3e\x19\xd8\xc6\xe9\x54\x3b\xc7\xcc\xfe\xd2" + - "\x75\x55\xf9\xd3\x80\xa6\xdf\xab\xa7\x2d\xed\x5c\x85\xed\x65\x7f\xce\x61\xa9\xb0\x99\x08\x7f\x07\x92\x71\xfb\xa7" + - "\x36\xc3\xb5\x43\x04\x30\xfd\x93\xdc\x6f\x9f\xce\x56\x6d\xd4\x0b\x8e\x67\x7d\x35\x32\x4e\x39\xa0\x46\x40\x20\x3b" + - "\xd3\xbc\xd4\x39\x52\x59\x80\xd2\xaa\x28\x48\xdd\x52\x5d\xfc\x70\x18\x48\x08\x49\x03\xcd\x3d\xd7\x35\x6e\x38\x91" + - "\x67\xb1\xfa\x2a\x61\xf7\x55\xf6\x1a\x00\xce\x75\xd1\x60\x43\x2e\x71\xf1\x63\x85\x52\xed\x98\xc0\x65\x9e\x5d\x98" + - "\x80\xd7\xee\x84\xb8\xcb\xcf\x79\x79\x8c\x0f\x97\x52\x1c\x15\xa2\xa4\xa5\x56\x2f\xb8\xc1\x82\x48\xd9\xd5\x66\x17" + - "\x69\x73\xa6\x0b\x24\xcf\x18\x52\xee\x47\xb6\x6b\xa8\x9b\xaa\xa6\x4d\xdf\xdb\x5c\x2c\x93\xe8\x39\x6f\xf3\x7d\x5e" + - "\xe4\xdd\xab\x5d\xdf\x18\x74\x20\xa8\xea\x2e\xd2\xd0\xce\x7f\xe8\x0c\xa6\xc5\xd4\x3a\x4e\x7f\x6c\x8d\x5b\x15\xf7" + - "\x49\x30\xf8\x2c\xd3\xb2\x7e\x89\x32\xd2\x9e\xf8\xd9\x16\x3d\x5d\xe9\x72\xe4\x5c\x95\x78\x47\x0e\x83\x92\x8d\x92" + - "\xde\xf9\x24\x62\x3f\xc5\x21\x4a\xf7\xad\x5c\xc3\x9b\xc7\x4e\x52\x25\x16\xec\x99\x96\x97\xb1\xdb\xb7\x32\x57\xa0" + - "\x38\x3e\xfb\x08\xef\xdf\xce\x12\xee\x2c\x69\x83\xf9\x71\x78\xff\xa6\xc7\x79\xd4\x33\x93\xce\xd6\x58\x86\x03\x2d" + - "\x43\xe9\x7c\xc8\x60\x89\x9c\x01\x34\xdf\x76\xe3\xf3\x40\xdb\xc9\x14\xd7\xc8\xe9\x37\x63\x81\xa5\x3c\x25\x00\x51" + - "\xe4\xf5\x2e\x1a\x32\x66\xbc\x98\x14\xd0\xf2\x91\x3c\x85\xb0\xc4\x3c\x7f\x25\x4f\x6c\x85\xe6\x33\x4c\xd4\x71\x49" + - "\x8b\x14\x72\x07\xc7\x0f\x8d\xaa\xc1\x94\xbd\x4c\xca\xf4\x17\x1e\x5d\x4d\x86\xae\x87\x17\xd8\x75\x0d\x9a\x66\xf9" + - "\x73\x2e\x53\xd0\xa9\xe9\x18\x9e\xec\xdc\x45\x5b\xd9\xcb\x98\xa9\xc4\x82\x6b\x30\xbf\xab\x5e\xdf\x53\x91\x3f\x11" + - "\x7f\x62\x4d\x36\xef\xab\x24\x41\x69\x41\x49\xc3\x1e\xac\x3b\xdd\x70\x8a\xd4\x38\x70\x85\xa6\xf8\x76\x71\xa9\x7c" + - "\x4e\xa4\x08\x71\x80\xd7\xfd\x3f\xa7\xb3\xe8\xd2\x6a\xed\xdd\x23\xbd\x22\xf9\xda\x12\xb1\x58\x50\x25\x0e\x16\x87" + - "\x72\xb8\x6c\x33\x46\xd2\x35\x6c\x0e\x0b\xa9\x11\x83\xf4\xa4\x56\xf1\x18\xdb\x43\x19\x88\xbc\xb8\x61\x50\x77\x7c" + - "\xb4\x5a\x97\x4c\x50\xc2\x4e\x21\x38\x8e\x41\x8e\xae\xe4\xdc\x47\x45\xe5\x09\xca\xba\xa9\x8e\x79\xb6\xfb\x2f\xff" + - "\xf3\x8f\x7d\xf9\x9f\x7b\xf4\x43\xd5\x9c\xa7\x7f\xca\xd3\xa6\x6a\xab\x43\x37\x3d\xf6\x36\x85\x96\xdd\x07\x5a\x32" + - "\x8e\x7f\x38\x90\xa2\xa5\x6a\xe8\x1b\x11\x20\x35\x0f\xa0\x0e\x17\x87\x26\x21\x93\xc9\x6d\x06\x84\xcd\x87\x10\x49" + - "\x5e\x79\x32\xf2\x06\x29\xa4\x13\x25\xd2\xdc\x04\x9a\x80\xf1\xc5\x03\x36\xe4\xc5\xd2\x2d\x64\xc8\xf7\x9d\xd6\xff" + - "\x61\x4c\xa7\x87\xfc\x85\xf7\x3a\x9e\xc9\x42\x3b\xf0\x8e\xcd\xb0\xdb\xad\x6a\xfd\x60\xa0\xb1\x9e\x1b\x17\xf7\xa5" + - "\x8e\xb8\xab\x34\x89\xa6\x25\x79\xde\x93\x26\x66\xdc\x89\x53\xf7\x83\xb2\x47\xc0\xa3\x4a\xab\xb2\xa3\x65\xb7\x8b" + - "\xde\xbf\x37\x1d\x20\x2c\x41\xb7\x72\x69\xcc\x8a\x35\x86\xc7\x19\xb0\xdb\xc7\xaa\x94\x7a\x31\xdc\x00\xc4\xdf\x6a" + - "\x0d\xbe\x6e\x21\xd8\xe0\x5a\x8b\xd4\xaa\x89\x15\x79\x8f\xd9\x83\x3f\x28\xb5\xa9\xd5\xef\xec\x27\x74\x87\xf5\xb0" + - "\x58\x07\xf3\xb5\xb1\xf4\x44\x6f\xc9\x97\xe7\xba\xd7\x65\xae\xbf\x25\x1c\x5c\x85\x8b\x3b\x70\xc3\x39\x6f\xac\x66" + - "\xe0\xe3\x8d\x50\xd5\xc3\x61\x08\x80\xb9\x8f\x87\x81\xc0\xe8\x0d\x56\xae\x47\x7c\x87\x16\x20\x95\x6b\x75\x5a\xdf" + - "\xf5\x30\x2f\x28\x18\x4c\xfe\x90\x80\xc6\x6a\x39\x23\xf7\xc9\x94\xe5\xf0\xd5\xee\x65\xf0\x93\xe3\x69\x55\x9b\xa5" + - "\xf6\x8d\x2a\x79\x75\x4a\x0f\x74\x74\x55\x55\xec\x49\x83\x00\xae\x70\x40\x8b\x39\x55\x60\xde\x04\x75\x74\xbc\x80" + - "\x87\x7a\x04\x3f\x61\xb4\x9f\x2c\xda\xfa\xab\xdc\x48\xbc\x88\x77\x45\x59\x75\xd1\x07\xed\xe1\x8e\x8f\xe2\x1b\x78" + - "\x47\x42\x7c\x32\x97\x46\xdf\x7e\xf3\xee\xe3\x2f\x23\xf1\x5c\xa8\x0e\xc6\xeb\x20\xe6\x6d\xc2\x31\xa4\x60\xbe\x22" + - "\xc8\x55\x57\xd5\xdc\xaa\x0c\xfc\x59\xe6\xd6\x04\x70\xf0\x32\xd4\x8c\x89\x4d\xd7\x7f\x73\x15\x59\x56\xdd\xb7\xdf" + - "\xbc\x33\x50\x0c\x36\x7b\x49\xf8\xb8\xd4\xcb\x71\x26\xc7\xb5\xcb\x84\x0d\x54\x81\xc1\x88\x85\x75\xb7\x20\xee\xef" + - "\x3f\x53\xae\x88\xb1\x08\xa4\x63\xaa\xc0\xaf\xa2\x01\x82\x17\xbf\x1e\xe0\xca\x7e\xbf\x6e\x8e\x2c\xdd\xb2\xed\x2f" + - "\x73\x34\x2d\x40\x87\xdf\xa9\xb7\xf1\x13\x8a\x65\xe4\x22\x7b\xc0\x52\xff\x3e\xb8\x8c\x0c\x4b\xed\x15\x40\x75\x36" + - "\xc7\xc8\xce\xe6\x08\x5d\x4f\x03\xff\x2e\xf7\xbe\x7c\x5c\xe9\xdb\x4f\x37\xee\x2e\x41\x57\xd2\x6d\x38\xd9\xc5\x56" + - "\x05\x27\xd4\x4a\xc4\x8b\x56\xa2\x21\x88\xc6\xc9\xa0\x9e\xe9\x6b\x8e\x91\x4c\x24\xd1\x2b\x9c\x21\xbd\x44\xcc\x65" + - "\x1e\x77\xc5\x74\xa1\xec\x65\x0a\x78\x22\xfa\xd1\x7e\x99\xc3\x78\xae\x66\x84\x53\xb3\x36\xe4\xf9\x69\x07\xa6\xe5" + - "\xa9\x20\xc5\xa1\xad\x1d\xa1\x65\x39\x31\x22\xa6\xa0\xa5\x90\x9e\x21\xb7\xc2\xed\x21\x6f\xb8\x7e\x61\x53\x41\xd0" + - "\x24\x60\x3a\x9d\x5e\xfb\xed\xb5\xd6\x22\x98\xe7\xb5\xd7\x57\x5b\x51\x83\x3d\xbf\x49\x0f\x35\xe0\x41\x33\x8d\x86" + - "\xbd\x1c\x1d\x3b\xd7\x4f\xd2\xf2\x60\xc0\x75\x3d\x74\x87\xf9\xfa\x26\x82\xb6\x4f\xf9\xcb\xaf\xdc\xd9\xb7\xcd\xe2" + - "\x3a\x63\xd7\xaa\x81\xcd\xd2\x5f\x2f\x6d\x97\x1f\x72\x9a\x21\x1b\x69\x88\x19\xe3\x1b\x6c\x05\x79\xad\x2e\x1d\x08" + - "\x86\x0c\xc7\x06\xd8\xbe\xdc\x2e\x6a\x69\x4d\x1a\xd2\x21\xd6\x4a\x55\x68\x9b\x64\xbd\x08\xb8\x90\xe3\x8f\xf2\x43" + - "\x56\x11\xe3\x8a\x52\x56\xd6\xd5\x6b\x97\x71\x54\x3b\xb2\x60\xc5\x68\x7e\xcc\x48\x47\x84\x3a\x89\xdd\xe3\xf6\x27" + - "\x6e\xd2\xf1\xdc\x28\x61\x08\x43\x56\x78\x37\x3c\x9c\x3e\xae\xad\xcb\x81\xab\x32\xb3\xb8\x77\x97\xf8\x9e\x4a\x43" + - "\xd3\x6e\x70\x50\x12\xe6\xd0\x8c\x67\x5d\x1d\xfa\x7a\x24\x2a\xa2\x14\x73\x54\xe5\x00\xe1\x1f\xd3\x82\xb4\xed\xef" + - "\x7f\x48\xab\x22\xfe\xc9\x9c\x50\x1f\x6f\xc9\x75\x7e\xb4\x13\x1e\x79\xb8\xd7\xf3\xdb\x1a\x7b\x69\xfe\x47\xec\xb0" + - "\x7a\xd9\x99\x12\x23\xd7\x92\x59\x8c\x66\x58\xf2\x42\xed\xbb\x72\x70\x38\xfe\x6e\x59\xb0\x5d\x0d\x74\x00\xa1\xcd" + - "\x0c\x80\xf5\x36\xf6\xca\x94\xdb\x7e\x96\x3d\xe0\x1e\xe6\x03\xb1\x64\x33\xac\x9c\xdf\x0e\x9e\xc4\xee\x06\x0a\x68" + - "\x73\xe3\x26\x8a\xf1\xe0\x49\x8f\xad\xbf\x2a\xe4\xd5\xdd\xbe\x78\x5c\x77\x4d\x28\xb4\x3b\x7f\xbb\x07\x08\x5c\x2d" + - "\x73\x00\x85\x2a\xed\x55\xad\xbc\xf2\xb5\x03\x3f\xcb\x1e\xf0\xeb\x95\xd6\xd5\x0c\x87\x7e\x59\x3c\xb9\x94\x16\xe7" + - "\xc6\x4d\xf4\x76\xa5\xb5\x32\xdb\x21\xd5\xa2\x29\xea\x10\xc7\x65\x94\x7c\xa0\x8f\x6d\x8d\x09\xc6\xc7\xad\xc8\xf7" + - "\x59\x75\x85\x8a\x45\x79\x6a\x8e\xcd\xb8\xf1\xed\x0e\x3c\x1f\x67\xe8\x73\x97\xe3\x07\x06\x1e\xed\x97\x2f\xf1\xe4" + - "\x53\xee\x57\xf3\xae\x79\xf5\xd2\xd9\x2c\xf4\x49\x96\x51\x4b\xe6\x3e\x32\xe9\xaa\xe0\xda\x73\xa9\xee\xd3\xa7\x76" + - "\xcf\x38\x32\x01\x7a\x01\x35\x77\x53\xcb\x80\x37\x3e\x7e\xe0\xe3\xe1\x48\x35\xe6\xe3\xe2\xd6\x38\x00\xe5\x72\x8d" + - "\x32\x06\x02\x9c\xe6\x71\x92\xc6\x52\x13\x21\x0f\xde\x8c\xd6\xd7\xde\x2c\x76\x6f\xad\x84\xc7\x29\x58\xe3\xf8\xdb" + - "\x6f\xde\xfd\xda\xbb\x16\x5e\xc1\x6b\x11\x7c\xf5\x24\xf8\x58\xcf\x82\x15\x3f\xd6\xb1\x46\x40\x20\xac\xd3\x9c\xab" + - "\xee\x20\x1a\x8e\x1d\x98\x91\xee\x40\x49\xa3\x9d\x1e\xd2\xbf\xde\xd0\xc5\xed\x91\x7e\x9f\x7c\x61\xf7\xb9\xd7\x47" + - "\xf1\xc8\x7e\xf3\x60\x56\x92\x91\x53\x19\x4e\x2f\xc8\x7d\x7e\x12\x43\xf9\xa4\xf0\x9c\x5b\xad\x18\xda\xb0\xb3\x81" + - "\x96\x0e\xfb\xcb\x68\xb1\x6f\x97\xf9\x6e\xa6\x47\xb7\x94\x2a\x27\xa7\xb3\x5d\x96\x46\x06\x1a\x21\xbd\x1e\x5b\x7c" + - "\x25\x79\xd6\xb6\x54\xc0\x11\x18\x2c\x25\xa4\x79\xce\x13\x90\x79\x2a\xf2\x90\x78\x80\x76\xae\x89\xa3\x89\x93\x4d" + - "\xa1\x8f\x53\x1a\x73\xde\x4a\x6b\x8c\x7e\xe8\x4f\x7d\x08\x38\x2c\x86\x3b\x06\x3a\x69\x70\xfe\xcc\x75\xa4\xcd\x02" + - "\x34\x98\x19\x3d\x1b\xe7\x3d\xd6\x77\xcb\x89\x36\xd8\xd5\xe2\x24\x19\xe7\x46\xfe\x05\x39\x54\xdf\xc0\x15\xa3\x11" + - "\x8f\xc9\x38\x60\xa8\x55\x57\x92\xe7\xf8\x57\x3f\x9b\x2a\x7b\xf9\x29\x3f\x1f\x85\xb1\x50\x7b\x37\x86\x92\xc6\x1d" + - "\xd9\x6b\x89\xed\xd5\x41\xa6\xc1\xe9\xcb\xb2\xcc\xc4\x90\xba\x6d\x9e\xaa\xd6\x47\x88\x31\xae\x24\xa6\xd0\x15\x7d" + - "\xa8\x8f\x1f\x81\xbb\x21\x45\x28\xfb\xff\xc9\x60\xda\x35\x26\x9c\x97\xc6\xfa\xde\x14\xff\xc1\x9b\x0e\xcf\xb0\x62" + - "\x9f\xa1\xfe\xd8\x85\xd8\xe9\x55\xe1\xa1\x4b\x6d\x16\x09\xe1\x5c\xc7\x6b\x61\x4e\x39\xb3\xa7\xec\xc9\xd1\x3b\x00" + - "\x18\x7b\xec\x87\x1e\x47\x37\x62\x7a\x86\x72\x58\x02\xd5\x29\x18\xda\x81\xa9\x9c\x85\xa0\x2b\x85\xac\x68\xe5\x7a" + - "\x0a\x6b\x84\x5e\xf8\xc1\x3d\x2b\xea\x1d\x70\x40\xcf\xd3\x64\x57\xa4\x1f\xc6\xf6\xd5\x41\x3d\xaf\x24\x90\x38\xea" + - "\x70\x38\x2f\x50\x8c\xfa\xc1\x4e\xd7\x9a\xcd\x25\x43\x44\xcb\x5d\x20\xc0\x85\x18\x05\x35\x87\x9d\xc3\xd6\xdc\xdc" + - "\x0f\x52\x7e\x5e\x83\xf6\x08\x20\x50\x83\xe1\xed\xa4\xdb\x44\x73\x95\x6c\xf0\x41\xcc\x2f\x0c\xeb\x7a\x50\xe7\x45" + - "\x81\x19\x64\x0c\x46\xc8\xc6\xaf\x0b\x12\xf8\x93\xa0\x69\xde\x48\xc2\x60\x4d\x89\x58\xdf\x35\x9b\x68\x97\x7a\x8e" + - "\xf4\x3b\x4f\xee\x43\x3e\xda\x8e\xa4\x5f\x46\x2d\xcf\x00\x65\xb4\x8d\xbf\x28\xe2\xdb\xe9\xf7\x9a\x48\x14\x68\x84" + - "\x97\x3b\x19\xbf\xdf\xcc\xe6\xbd\xd1\xd4\xdd\x6a\xe1\x0c\xa1\x8f\x4d\x44\x77\x33\x86\x23\xa3\x3d\xd0\x08\xfe\x16" + - "\x06\xf0\x57\x37\x7e\x6f\x12\x45\xb0\x2c\xc2\x0c\x5e\x47\xf6\xb1\xb8\x01\xf0\xc4\xfe\xa8\x49\xe9\xb9\xbe\xab\x81" + - "\x83\xdc\xe7\xce\xd5\x17\xf7\x87\x91\x01\x84\x9d\x09\x7a\xe3\x19\x06\x7e\x54\xdf\xb3\xd4\x83\x0f\x5b\xac\xf0\xe7" + - "\xe5\xe5\x6d\x12\xaf\x73\x7c\xd5\xd5\x03\xad\x33\xb4\x01\x12\xfc\x80\x83\xb8\x83\x00\xee\xc4\xe8\xf3\x92\x36\xca" + - "\x7b\x48\xed\x1e\xb6\x79\x98\x71\x85\x1e\x66\x14\x5f\xe5\xfa\x28\x7e\xd9\xf1\x7b\xb8\x85\x76\xe5\x58\x15\xb7\x69" + - "\x53\x15\x05\x5b\x25\xb3\xa7\x11\xcc\xab\x23\xce\x45\xc5\xd8\xb3\x5e\x09\x3f\xd0\x38\x5f\xad\x26\xd1\xf0\x9f\xe9" + - "\xcc\xfb\x0a\x99\x13\xc9\x21\x17\x75\x83\x5d\x36\xe7\xf5\x5a\xf3\x6d\x49\xd9\x7a\xcb\xc9\xba\x48\xe3\x3d\x61\x89" + - "\x1c\xb1\xd4\xee\x9f\x28\xce\xf5\x4a\xf5\x71\x17\xfd\x53\x7e\xae\xab\xa6\x23\x5c\xd4\xda\x26\x96\x59\x66\xbe\x1d" + - "\xcf\x59\x1c\x96\xc7\xa2\xf3\x01\x9a\x8b\x23\x21\x4b\x4d\x98\x02\xdb\x40\xd1\xef\x02\x19\x74\xcc\x2b\x43\x5d\x55" + - "\xdb\x30\xd2\x00\xf6\x1f\xf9\xa3\x57\x28\x1c\x67\x08\x3b\xc3\x81\x3f\x59\xa4\x29\xc9\x9b\xb9\x54\x21\xb1\x17\xf0" + - "\x06\x71\x82\xdc\x58\x22\x2f\x71\x46\x9f\xf3\x94\x4a\x25\x5b\x3e\x24\xf5\xcb\x47\x52\x66\xd1\x87\xaa\xc9\x69\xd9" + - "\xf1\xe8\x4c\x41\xca\xac\x4d\x49\x4d\x75\xfd\xbb\x07\xa3\xef\x84\xe3\x30\xb0\x3a\x4f\x12\xfd\xbd\x97\xde\xde\x93" + - "\xbc\xa4\x4d\x7c\x28\x2e\x79\xf6\x84\xd4\xe4\x02\xe1\x16\x8b\xcd\xe0\x0a\xc4\x8b\xff\x84\xd8\xba\x7b\x3f\x2b\x74" + - "\x97\xf6\xbc\xa5\x41\x98\x03\x85\x3e\x61\xa5\xa9\x25\x50\xf7\x5f\xb0\x1b\xfa\xe6\x09\x68\x66\x19\xaf\x33\x68\x46" + - "\x15\xc8\xae\xae\x77\xb0\x60\x2a\xf7\x0b\x7e\x57\xd2\xbe\xcb\x68\xa6\x1d\x58\x24\xd7\xf1\x1e\xc2\x48\x78\x83\x24" + - "\x86\x75\x0d\x12\x15\x2f\x3a\x20\x7f\x31\x2f\x7f\x62\xe1\x6e\x9d\xea\xcc\x8a\xae\xf5\x54\xf7\x4d\x6f\x10\x90\xe8" + - "\xa0\xe9\xca\x0c\x71\xeb\x95\x88\x5b\x87\x1c\xc9\x9a\x27\x56\x3b\x58\x8d\x70\x81\x39\x7c\x1c\x89\x73\x63\x84\x54" + - "\xd4\x14\x75\x12\xc3\xba\xf7\x69\x18\x51\x3a\x43\x8a\xbf\x27\x73\xd0\xea\x70\xc0\xd4\xd9\x66\xc3\x52\x02\x78\x15" + - "\xc4\x77\x33\x92\xa9\xb1\x26\xfa\x2d\xd8\x87\x87\x2e\xee\x83\xf6\xc9\x70\xc5\x0c\xcd\x90\x3b\xea\xb7\xdf\x22\x7f" + - "\xc3\xeb\x4f\x9a\x04\xbc\x39\x46\x74\x59\x4d\xf3\xb4\x2a\x63\xe9\xef\x3a\x53\x2f\xcd\xe7\xfa\x5b\xf6\xf8\xf9\x04" + - "\x7b\x68\x99\xb5\x7c\xd2\xeb\x83\xa2\x5e\x5e\x6b\xf6\x40\x6f\x9b\xab\x1e\x4b\x33\xe4\x76\x96\xdc\x58\xd8\x4c\xfb" + - "\xb1\x16\x1b\x9b\x44\x02\x12\x6c\x3d\x69\x2f\xb8\xe9\xe3\xd5\x7a\xed\xd4\x35\x3c\x35\xc7\x41\x35\x67\x63\x36\x47" + - "\x6d\xb2\xa0\xd7\x9d\x07\x7d\xe6\xd6\xfe\x11\xac\x26\x94\x33\x6a\xfa\xb2\xf6\x43\x93\xa3\xca\xa9\x74\xf0\xed\xbe" + - "\xaf\xb3\x41\x66\xba\x80\xc1\x58\xb9\x50\x58\x8f\x0c\xaf\x49\x6a\xa7\x67\xe4\x3d\xa4\xb9\xb2\x09\xa3\x1c\x80\x00" + - "\x01\xd2\x69\xe1\x24\x4c\x5b\xeb\x07\x96\xb1\x3d\xde\x08\x57\x0e\xcf\x6b\x57\x97\x52\xb3\xcd\x59\x46\xa9\x7a\x62" + - "\xb7\x48\x85\xae\xac\xe5\xe8\x3b\x74\x18\x18\xe3\x40\x98\x3f\x7b\x20\xe0\x56\xf9\x50\x35\x67\xec\x50\xd2\x2a\xd0" + - "\xdc\x9a\xae\xa3\x61\x6f\xed\x99\x21\x78\x51\xeb\x8c\x0e\xdd\x6b\xf1\x3b\x91\x00\x2c\xd9\xc0\x1d\x17\xc8\x21\x84" + - "\xaf\x74\xc4\xfa\x5e\xfa\x75\xdf\x5b\xb6\x6b\xfa\x55\xde\x5b\x76\x56\x13\xfe\xde\xb2\x46\xe2\x6e\xef\x2d\x3b\xa9" + - "\x9a\xa7\x52\xdd\x80\x8e\xf7\x96\xc3\x10\x7c\xef\x2d\xbb\x28\x04\xbe\xb7\xac\xa1\xdf\xe7\xbd\x65\x9d\xe4\xf0\x02" + - "\xae\xf6\xfd\xb7\x7b\x6f\x19\x65\x47\xbd\xb7\x8c\x30\x35\xfe\xde\x32\x4e\xd2\x71\xca\x12\xa9\xe1\x4e\xef\x2d\x6b" + - "\x94\x6f\x7f\x6f\x39\xd0\xcd\xc1\xed\x8c\xbd\xe5\xe3\x1e\xcd\xe6\x75\xbb\xd1\x4d\x94\x6b\x2c\x20\x1a\x13\xd4\xa6" + - "\xbf\xc4\x13\x87\x1b\x8f\x10\xdc\xc7\xc7\xc2\x3c\xd6\x91\x60\xbd\x19\x8c\xbf\x3d\x52\x8f\x07\xb0\x46\xb9\xc0\x16" + - "\xd0\x16\x23\x4b\x6b\x47\xe1\xd7\xbb\xbb\x2b\xd7\x99\xfa\x49\x42\xc4\x0f\x01\x0e\x87\x8d\x3b\x05\x19\x79\x21\x89" + - "\x19\xbe\x51\x31\x43\x96\xed\x82\x88\xc8\xb0\xab\x11\x59\xe2\x44\x90\x85\x1f\x7d\xe9\x6c\x74\xdc\x71\xba\x22\xe8" + - "\x66\x52\x77\x78\x99\xe6\xca\x58\x57\x7a\xc3\x2f\x0c\xac\x73\xc8\xd2\x04\xea\x74\xc7\xb5\x87\xfc\x66\xda\x2a\xdf" + - "\x8c\x9f\x23\xae\x25\x4a\xe8\x7f\x23\x74\x8d\xd1\x8d\x0c\x45\xf8\xc2\x2d\x76\x62\xe9\xa1\xff\x87\x9c\x90\xa3\x9b" + - "\xfe\x9f\x83\x98\x1d\x50\xc2\x8f\x17\x3a\x71\xcc\x65\x0a\x0e\x84\x9e\xc7\x62\x07\xea\xae\x39\x49\x88\xd1\x57\xda" + - "\x13\xce\xb7\xb6\xfc\xb8\x1e\x6d\xac\xc5\xfa\xf9\xcf\xd0\xf7\x7b\xc3\x5b\xdc\xd3\x37\xf6\x88\x47\xc1\xf4\x6d\xf3" + - "\x71\x70\xfb\x90\xa8\x38\x3d\x87\x9d\x8b\x0c\xd1\x2f\x46\x5e\xcb\xf0\x18\x06\x18\xc8\xb8\xf7\x7c\xab\xbc\x50\xf3" + - "\x16\x2d\xb3\x12\xf5\xa8\xa7\x07\xb4\xd3\x8b\x6e\xdc\x31\xad\x11\x50\x63\xaf\x25\x04\xd6\x66\x84\xde\x10\x4a\x0f" + - "\x0f\x0f\x23\x94\xec\x5d\x23\x13\x42\x39\x35\xb7\x58\x1c\xd6\x6f\xf0\x64\xf0\x08\x50\xa0\x26\x58\x27\x89\xaf\x54" + - "\xe0\x40\x4f\x13\xa9\x7b\x2c\x1a\xa4\x59\x1a\x6d\x56\xb8\x8a\x98\x71\xec\xe3\x7a\x7c\x70\x1c\xc4\xb0\x4a\x63\x43" + - "\xe4\x36\xa6\x07\x5b\x75\x13\xcf\xae\xf3\x2e\x37\x12\x41\x5a\x2f\x34\xc3\xa7\x1a\x37\xb6\x1c\x18\xbc\xdb\xd8\xc6" + - "\x0c\xe1\xdb\xc8\x20\xed\x17\xf6\x31\xa4\xf7\xbd\x23\x5a\xa5\x8d\x0a\x9f\x53\x1d\x8f\x67\x80\x77\xb7\x4d\x44\x2d" + - "\x3f\x55\x40\x45\xd6\x53\x24\x4e\x80\x9b\xd8\x40\x1e\x1a\x09\x00\xf5\xbe\xfc\x33\xd6\x82\xab\x70\x30\x1f\x04\xbc" + - "\x8c\x2e\xf0\xf2\xf2\x99\x36\xe2\x88\x04\xf6\xe0\xf7\x7c\x8e\xf8\x95\xc9\x43\xff\xcf\x41\xc9\xed\x57\x6e\xb3\xfe" + - "\x5f\x08\x9a\x29\x51\x1c\xe8\xaa\x53\xad\xee\x19\xdf\x24\x6e\xf9\x95\x41\x7c\xa3\xae\xe5\x55\x98\x63\x8d\xf6\x7a" + - "\x97\x77\x68\xb7\xc3\xbb\xf4\x82\xd9\x53\xb3\x1f\xdc\x1e\x69\xee\x63\xc8\x41\x5a\xe6\xf4\x2e\x47\x00\x03\x19\xf7" + - "\x7a\x97\x4b\xf1\x2e\xf5\x5b\x74\xcd\xe9\x5d\xda\x16\x08\xc7\x1d\xd3\x9a\x30\xef\x32\xb4\xb6\x71\xef\x12\xbc\xb9" + - "\xe5\xa0\x64\x7b\x97\x26\x84\xcb\xbb\x9c\x25\xfd\xbf\x10\x8d\x30\xbd\x4b\x0f\x50\xa0\x26\x38\xbd\xcb\x40\x05\x0e" + - "\xf4\x2e\x91\xba\x5d\x33\x3b\x92\x1c\xdd\x65\xa8\x35\x27\x26\xb4\x0a\xfd\x99\x07\x5f\x03\x6f\x22\x8f\xf8\xc7\xd2" + - "\x5c\xde\x4e\x0f\xf1\x95\xae\xc3\x47\x9c\x24\xd1\xc1\x57\xb9\xc8\xe1\xdd\x88\xba\xc8\xd7\xa3\xbf\xa5\xe1\x5e\x17" + - "\xd9\xdd\xfa\x37\x76\xbf\xcb\x45\xbe\x85\xc0\x9b\x5a\xef\x77\x91\x85\x91\xbf\xda\x45\x36\xeb\xb7\x3c\xd7\x20\xdf" + - "\xc0\xe1\x9e\x7a\x8c\x2c\xea\x25\xfb\xeb\x72\x39\xca\x36\xc0\x4d\x9c\xb8\x1d\x65\x1f\x68\x88\xa3\xec\x6c\xc1\x55" + - "\x38\x98\x3b\xb5\x5c\x2e\x65\xb3\xf6\x0d\x25\x59\xda\x5c\xce\x7b\xfd\xb4\xc1\x83\x7d\xd8\xc0\xbc\x36\x10\xfa\x4c" + - "\x11\x7b\xd0\xc5\x7f\x10\x6b\xe0\x42\x9e\xb2\x70\xec\x34\x23\xe0\x9f\x8a\x7c\xb7\xa7\x87\xaa\xa1\x7a\x0b\x12\x79" + - "\x07\xca\x58\x0e\x0e\x6f\x40\x7c\xfe\x4b\x92\x90\xe4\x3d\x42\x15\x5e\xf7\x40\xd6\x62\x35\x39\xe6\x25\x3b\x09\xe8" + - "\xe6\xd5\xbe\x76\xa0\xbf\x0a\x95\x18\x59\x80\x11\xa9\x0c\xd5\x38\xa4\x82\x02\x32\xc7\x40\xff\xd2\xd6\x24\xf0\xe9" + - "\x83\x47\x57\x1e\x21\x2b\xe7\x81\x75\x78\xcb\xf5\xcc\x90\x7c\x27\xe7\xaa\x47\x80\x7c\xb7\x94\xd1\x56\x6b\x99\x21" + - "\x2c\x09\x68\xa5\x4a\x1a\xf6\x26\x63\xd8\x0e\xdb\x48\x0e\x59\xbd\x66\x90\x48\xc2\x66\x0b\x14\x2a\xae\xde\xb2\x8d" + - "\xe7\xe2\x02\x2c\xbf\xcc\xef\xf2\x6d\x67\x5b\x63\x80\xeb\x88\x14\xfa\x1e\x3c\x0d\x4e\x72\x80\xf7\x26\x5c\xa6\x61" + - "\x9f\xb1\xb6\x18\xb3\xbc\xc9\xb5\x2c\xee\x59\xc7\x11\x41\x8b\xdd\xe5\xd0\x98\xea\x69\x2d\x0d\xcd\x0d\xbb\x8c\x6f" + - "\xbd\xc6\x8b\xdf\x51\x85\xdc\x68\x8b\x41\xbc\x00\x6d\x85\xe9\x06\x58\x02\x52\x00\x88\x88\xb4\x32\x5c\x2d\x0c\x18" + - "\x67\x32\x8e\xe0\x9c\x1b\xba\x0d\xf0\x6b\x4c\x5c\x1c\x6d\xc3\x27\x3e\x0e\xb6\x2f\x24\xbb\x97\x8b\xb6\xc7\xbc\x20" + - "\x00\xd8\x58\xd6\xac\xc5\x7a\xd4\x9e\xac\x3d\xbc\x38\x4d\x8a\x5d\x3e\x6e\x55\x50\x56\x2c\x10\x84\x97\xf6\x8c\xc8" + - "\x9c\x7f\xb4\x65\xee\x49\xd9\xe6\x22\xed\x13\xb9\x0d\x30\x2a\xf2\xc5\xa8\xc8\x17\x1e\x5e\xdc\x22\xb7\xca\xc7\x45" + - "\x8e\xb2\x62\x81\x00\x5e\xc4\x50\x0a\x72\x27\xf0\x44\x7d\xae\x54\x43\x9c\xf8\xa8\x77\xc1\x60\x64\xcb\xf9\x1f\xaa" + - "\x99\x63\xde\x8f\xe8\xfc\xa5\xeb\xa0\x7f\x70\x4a\x12\x75\x60\x7e\x65\x0a\xc7\x9c\xe0\xe4\xa7\x37\x27\x2a\xe2\xb4" + - "\xa6\x25\x7d\xe9\x40\xeb\xf9\xdf\x4a\x00\xf0\xe4\x84\x81\x58\x37\xf4\x39\xaf\x2e\x2d\x44\x56\xdf\x4c\x02\x30\xef" + - "\x82\x80\x35\xad\xbd\xfe\xcd\x68\xb2\xd3\xc6\x6b\x65\xaa\xd6\xb7\x18\x66\xc9\xe6\x70\x5c\xcf\xd0\x02\xad\xff\xa7" + - "\x73\x7a\x8e\xa6\xeb\xfe\x3f\x0b\x7a\x36\x4c\xc0\x66\xf5\xbb\x47\x33\x29\xe5\x66\x2c\x29\x25\x7c\xb0\xd1\xd2\xf5" + - "\xc0\x94\x9a\x7b\xd2\x52\xf5\x06\xbb\xae\x61\xd3\xf9\x8a\x9e\x45\x1b\x09\x6f\xa4\x94\xb5\xfc\xd3\x19\x29\x1b\xcd" + - "\x36\x25\xd2\x81\x6b\x22\xdc\xd1\x73\xdd\xbd\xea\x82\xb4\xde\x1e\x19\x84\x8d\xbb\xf1\xea\x7a\xb9\x46\x7a\xec\x78" + - "\x0d\x58\xd6\x68\xf0\x3f\x9e\x1a\x7a\x18\xd6\xb4\x58\x99\x37\xab\x15\x3f\x05\xa3\x93\xae\x9b\xfc\x4c\x9a\x57\x17" + - "\x8a\xee\xf5\x68\x28\x28\x37\x7a\x99\x97\x9b\xf9\xc3\x3a\x19\xde\x1e\xe4\xe8\xed\x25\x4d\x69\xdb\x3a\x1b\x90\xee" + - "\x1f\x56\x29\x8a\x82\x72\xa3\x97\x79\xb9\x59\x2e\xb7\xd9\xb0\x04\xe7\xe8\x79\x79\xa8\x9c\xac\xec\xd3\x24\xa3\x36" + - "\x3c\xca\x07\x28\xf0\x32\xb1\x98\xed\x93\x6c\xa5\x13\xfd\x4a\x9a\x52\xbe\x13\x8e\x8d\xfc\x84\x64\x4b\x8a\xa2\xa0" + - "\xac\xe8\x65\xfe\x24\x68\xe9\x76\x33\x3b\x18\x9a\x48\xca\xa3\x1b\x23\xdb\xae\x16\x4b\x14\x03\x57\x5d\x58\xe4\x65" + - "\x25\xdd\x2e\x92\xb9\xea\xf8\x3d\xc9\x8e\xd4\x3f\xd1\xc1\xf7\xa0\xcd\xeb\x89\x8b\xfa\x25\xda\x38\x53\xd5\xfe\x9d" + - "\xad\x1e\x6a\x0d\xb0\x19\x17\x9c\xbf\x64\xf2\x08\xb2\x57\x83\xe4\x02\xed\xd5\xf0\xec\xc4\x4b\xfb\x04\x68\x88\x67" + - "\x32\x5e\x5a\x48\x73\x38\x9f\x3b\x38\xf6\xda\x3b\x48\x44\xb0\xaa\x0c\x37\xff\xf3\x7e\x86\xbb\x77\xa9\x38\xbb\x79" + - "\x47\xcf\x72\x9d\xa8\x58\x1e\x72\x15\xa9\xb5\xe9\x13\xe0\x1f\x59\x03\xfa\xa7\x5a\xbd\x3a\x48\x0a\x73\x40\x70\xf0" + - "\x4f\x00\x4b\x3f\x98\xb9\xc2\x53\x33\xe9\x3c\x6b\x01\x13\xe0\xa2\xfe\xf5\x72\xde\x57\x5d\x63\xe6\xa1\x5e\x20\x37" + - "\x96\x64\x10\x51\x26\x6e\x17\x2d\xcd\xcb\x13\x6d\x72\xd7\x3a\x19\x78\x64\x43\x55\xd3\xd3\x6c\x12\x81\xbf\x4f\x33" + - "\x28\x57\x41\xd0\x46\xab\xb1\xe3\xd5\xc8\xfd\xe1\xf9\x0c\x19\xa2\xf3\x24\xb1\x28\x3e\x9d\x1a\xd3\xdd\x57\x26\x6a" + - "\xd5\xff\xb3\x72\x0b\x00\xae\xed\xfb\xf7\x91\x21\x4d\x77\xae\x69\x20\x8a\x81\xf4\x2f\xce\xd7\xb6\xc4\x16\x5d\x9b" + - "\x36\x94\x96\x11\xcb\xbb\x30\x18\x2e\x78\x94\x58\xaf\x7f\xe8\xce\xe5\x83\xb8\x3b\xf5\xef\x5a\x66\x81\xab\x5a\x63" + - "\xe6\xa9\x90\xcf\xe7\x1b\x6b\x9b\x35\xb8\x53\x38\xda\xe3\xb0\xd7\xd6\x0b\xfd\x36\x5d\x77\xba\x9c\xf7\x25\xc9\x0d" + - "\x27\xd5\x5e\xa3\xe0\x67\xc6\xe7\xd8\x2d\x55\x23\xb3\xe4\xdb\x17\x34\xc6\x43\xf9\x6c\xe7\x45\xd8\x4b\x0e\x19\x4d" + - "\xe7\x6d\x44\x49\x4b\xe3\xbc\x8c\xab\x0b\xbf\x5e\x57\x05\x02\x8e\x43\xd9\xc2\x62\xd9\x3f\x27\xd1\xf0\x05\x64\x03" + - "\x85\x56\x43\x5e\xf6\xd0\x0c\x03\x48\x2e\x43\x06\x0a\xea\xe1\x5a\xf0\x6d\xb0\xcd\xc3\x27\x67\x62\x4d\xdd\x3b\x1c" + - "\x78\x9d\xa6\xa4\x56\xa1\x78\x78\x37\xfd\x11\x3f\xf1\x44\x0a\xda\x74\x46\x44\xc8\xbf\xd1\xf1\x86\x1b\xe6\xbc\xb2" + - "\xd3\x12\xbf\x59\x82\xdb\x2a\x8e\xc3\xff\x67\xd8\xec\x32\x5d\x05\x0d\xfa\xa9\x9e\x08\x84\xa7\x4b\x81\xde\x1f\x31" + - "\xc0\x3f\xd5\x16\x47\x2b\x83\xeb\x38\xcb\xdb\x73\xde\xb2\x65\xa3\xa4\x2e\xbf\xb1\x6c\x39\xbf\xd8\xf9\x96\x16\x3e" + - "\x22\xd1\x34\x2d\xaa\x16\xa7\xc5\x8b\x46\x9d\x05\xe1\x36\xc9\x8b\x08\xd2\x46\x7b\xe4\xa8\x79\xf9\x4a\x1b\xd2\xcd" + - "\x7a\xe1\x5a\xde\x66\x87\x43\x92\x61\xf7\x0d\xb2\x35\xdd\xa6\x6b\x9c\xba\x7b\x0e\x48\xb7\x74\xbe\x5f\xe0\x58\x66" + - "\x1f\xab\xd5\xca\x7e\xb5\x1c\x3c\x50\x0e\xa4\xd6\x07\x83\xff\xbe\x49\x1e\x5c\x87\x33\xb2\x2d\xcd\x0e\x58\x64\x79" + - "\x9f\xd2\x87\xc3\x0c\x21\xed\x6e\x01\x59\xd3\x19\xc5\xb8\x71\xb2\xbf\x5c\xcd\xd7\x5b\x1d\x01\xae\x2c\xd4\x51\x6d" + - "\xb2\xce\x16\x7b\x97\x11\x4d\x0f\x0f\x74\x81\xb4\xe0\x40\xe8\x3e\x4d\x71\xea\xee\x46\x1c\x36\x74\xb6\x5f\xe1\x58" + - "\xae\x76\xac\xd7\xab\x99\xd9\x0d\x60\x4d\xa2\xe4\xb3\x5d\x2e\x97\x73\x57\x33\xe6\x19\xcd\xb0\xad\x8f\xbe\x11\xd9" + - "\x0c\x25\xee\x6e\x05\x5d\xee\xb7\x69\x82\x22\xb9\x1a\xf1\xb0\x5c\xac\x16\x72\xad\xf9\xcf\xdf\x7e\x23\x67\x99\x2f" + - "\xf4\xf5\xd0\x90\x33\x6d\xa3\xba\xa9\x8e\x0d\x6d\xdb\x78\xcf\xd2\xe2\x34\x79\x4d\xf9\x70\x39\x34\xd5\x39\xfa\x05" + - "\x34\x6a\x18\x9a\xcb\x84\xfb\x02\x8c\x6a\x67\x2d\x5c\x07\xc0\x21\xc5\xcb\xbf\xf3\xea\xab\xbf\x57\xcd\x7f\x8f\x6a" + - "\xa7\xb2\x2a\x06\x0f\x33\x26\x78\xa6\x9b\xc0\xb4\xdd\xbe\x7d\xf5\xc7\x80\xfb\xf7\x73\xe4\x3d\x5d\xef\xbd\x7a\x14" + - "\x41\x05\x2c\x81\x4c\xcd\xa0\xe6\xe3\x90\x12\x85\x4d\x7b\xca\x91\x12\x09\xa2\xc7\x5e\xa3\x9a\xeb\x6b\x05\xff\x3a" + - "\xd8\xbb\xcd\xe6\x93\x49\x0c\x72\x07\x80\x16\xba\x1f\x25\xf6\x22\x60\xce\x1c\x3f\x17\x37\x5d\x73\xe7\x0b\x71\xe2" + - "\x6c\x00\x77\x29\x26\x78\xa1\xcc\xd9\x24\x1a\x3e\x8b\x4f\x91\xdd\x43\x76\x32\x0d\xc9\x74\x2f\x7d\xd2\xc4\xc7\x5e" + - "\xa3\x68\xd9\x7d\x58\xae\x32\x7a\x9c\x38\xd2\x2a\xac\x3e\xf6\x3e\xf8\x7c\xf5\xbb\x09\x74\x8b\x22\xeb\xc3\x2a\xf9" + - "\x9d\x9b\x04\x2b\x75\xa7\x65\x58\x7d\x8c\x36\x26\x3d\xf3\xc3\xc7\x47\xbc\x4d\xd5\xb5\xcd\x61\xac\xb3\xdb\xda\xff" + - "\x80\xcd\xf9\xbf\xb7\x2d\x6a\xec\x0d\x6d\xe2\x63\x9e\x99\xd6\x65\x62\xed\x0f\x19\xa5\x98\xc2\xab\x45\x85\xfa\x2a" + - "\x4f\xee\xd8\xea\x2e\xeb\x27\x65\x7e\x16\x11\x1e\x74\x22\x98\xb7\x42\xc8\x51\x5e\x1e\xf2\x32\xef\xe4\x48\xbd\x0d" + - "\xf1\x7a\x2c\x7c\x64\x5f\x13\xac\xf6\x0f\x7e\x17\xad\xff\x34\x02\xff\x98\x03\xe7\x3f\x8a\x11\x40\xf5\x3a\x7c\xdb" + - "\x63\x44\xa9\x31\x42\xff\xa9\xd1\xff\x78\x5a\xf0\x1f\x5e\xa3\xaf\xda\x43\x1b\x51\x6a\x07\xad\xff\xd4\xeb\x7f\x3c" + - "\x5d\xf8\x0f\xaf\xd7\xd7\xec\xc6\x8e\xa8\x35\x4e\xea\x3f\xb5\xfa\x1f\x4f\x13\xfe\x23\x6a\x35\xdf\x07\x33\xc3\xdf" + - "\xf0\x54\x19\x83\xb0\x1e\xec\x44\x1f\x62\x65\xa0\x93\x88\xff\x6f\xbc\xaf\x32\xbe\x2b\x8e\xc5\x70\x7e\xae\xd8\x56" + - "\xa3\x86\x39\x60\x0c\x1b\x76\x49\x62\x70\x12\x57\xfb\xbf\xd2\xb4\x43\xb6\xb0\x74\x30\x16\x16\x97\xbc\x3c\x4d\xeb" + - "\x4b\x51\x80\x4c\x3c\xc6\x1b\x08\x56\x25\xfd\x77\x03\x59\x65\x13\x32\x9f\x55\xb0\x90\xfb\x66\x28\x29\x40\x4a\x80" + - "\x01\xc7\x93\x2f\xe6\x09\x85\xae\xaa\x75\xda\x3c\xa5\x1c\x23\xe1\x7f\x16\x59\xb2\xa2\x52\x52\x5b\x87\x1f\x58\x91" + - "\x0e\x7e\xa2\x24\x93\x53\xac\xb5\x41\x83\x65\x58\xd3\x64\x96\xb7\x98\x70\xbd\xaf\x3b\x0e\x3b\xf3\xfe\x43\x9d\x5a" + - "\x5c\xd0\xb1\xad\xef\xd9\x30\x09\x79\xea\x11\xa9\x4c\x3d\x4f\x72\xe3\xa5\x0c\x83\x41\xd7\xab\xb7\xb7\xe4\x30\x73" + - "\x55\x61\x24\xb5\xf3\x64\x4e\x73\xdd\x99\x18\x39\x18\xbc\x04\x67\x4a\xb0\x0e\x00\xf9\x36\x9c\x70\xe6\x07\x4d\xef" + - "\xec\x5d\x4a\x8b\x00\x38\x7f\x68\x14\x38\x33\xc2\x5c\x75\xe1\x86\x05\x93\x5d\x47\x5b\xe4\xe1\xd1\x89\xd5\x0c\x55" + - "\x04\x6e\x05\x38\x41\xee\x70\x29\x00\x9c\x04\x71\x55\xe3\x14\xf5\x28\xf7\x6e\xcc\x80\x66\x85\x74\xb0\xb1\x41\x19" + - "\xde\x82\xbe\x2b\x6f\x60\x9f\xa1\xdd\xc2\xbb\x2f\xf9\x18\x7e\xee\x09\xe1\x8e\x17\x0c\xc7\xf0\xf0\xe2\xe0\x2b\x35" + - "\xb7\xdf\x9f\xc1\x6b\xbe\x46\x4f\x46\x30\x9e\xa6\xed\x99\x14\x05\x2a\xea\x31\xd4\x31\xcc\x5b\x54\x33\x08\x73\x9c" + - "\xe9\x31\x02\xa3\xf8\xfe\x91\x71\x3b\x66\x00\xeb\x23\x04\x18\xfe\x15\x43\xd3\xd5\x8b\x8e\x81\xe9\x97\x9f\x73\x58" + - "\xfa\x79\xb7\x06\x65\xba\xc9\x32\xea\x3a\x20\x78\xeb\xc1\x07\xd7\x04\xe4\xa1\x37\x8a\x72\xbd\x6d\x74\xd2\x72\xce" + - "\x83\x0a\x00\x49\x77\xe4\x6d\x75\x02\x4e\x75\x38\xa9\x82\xd3\x4b\x7e\x88\x61\x1e\x1c\x85\xbc\x26\xd9\x06\x68\x82" + - "\x61\xe9\x60\x0f\x58\x35\xde\x72\x68\xc4\x29\x0a\x07\x31\x3f\xfc\x3d\xba\xbe\x27\xe4\xee\x77\x56\x8a\x74\xba\xaf" + - "\xa5\xe9\x92\x2e\x0e\x4e\x5f\x8b\x91\xf4\xf4\x38\x28\xf6\xb3\x85\xcd\x71\x01\x7d\x3d\x70\x6e\xf4\x35\x94\xb7\x55" + - "\xe1\x8d\x27\x6c\x9c\x42\x70\xd3\x1b\x45\xb9\x47\xa7\x0b\x5a\x6e\x01\x4b\x00\xbb\xeb\xfd\xad\x26\x87\xb9\x3a\x3e" + - "\xe4\xa4\xea\xe9\x7d\x1d\xc2\x37\xde\x0d\xc8\x6b\xc6\x3b\x68\x82\xae\x03\x5a\x0f\x58\x35\xde\x76\x3a\xc9\x29\x0c" + - "\x27\xb9\x31\x8c\x7b\x28\x00\x27\xe5\xee\x7f\x51\x6e\x4b\xd5\xdb\x62\xba\x4f\x53\x4f\xf7\x73\xa2\x9e\xde\xd7\x00" + - "\x7c\x9d\xaf\x03\x5e\xd3\xf7\x80\x7f\xbd\xef\x35\xd9\x7b\x45\x7c\x45\x20\xc3\xe9\x65\x60\xeb\x68\xe3\x1c\xf4\x62" + - "\xb8\xae\x58\x52\xf4\xdc\xe9\xdc\xde\xd6\x1f\x0d\x27\x8c\x1e\xae\x75\x9d\xe4\xe1\xc7\x94\x66\xf6\x31\xa5\xc4\x3e" + - "\xc4\xe3\x83\xd5\x5a\x35\x44\xe8\xb4\xe3\xc2\x3a\x0c\x94\x3d\x1e\x66\x09\x7d\x35\x25\xec\xfa\x32\x7a\xa7\x18\x65" + - "\x09\x7d\xd9\x19\xe4\x65\xc3\xdd\x5f\x4e\xa2\xcb\xbb\x82\x06\xe9\x53\x62\x1e\xe3\x5a\xfb\x0e\xe6\x02\xea\xd2\x93" + - "\x8f\x90\x8f\xe2\xd2\xeb\xf0\xd9\xfc\x7b\x58\x04\x58\x5f\xf5\x4c\x85\x68\xfd\x87\xaa\xea\xf4\x8b\xd5\x66\x97\x05" + - "\x9c\xb9\x33\x9e\xca\x31\x0e\xf8\xbb\xae\x76\x8f\xc4\x9b\xcc\xbe\x7c\x02\x83\x54\x8a\xe0\x49\xb4\x42\xa6\x9b\x7b" + - "\x32\xe3\x8a\xae\x03\xe0\x16\x45\xcb\x58\x07\x55\x61\x22\xc9\xe4\x7b\xf6\x1b\x7f\xc8\x18\x76\x33\xa3\xc5\x0b\x7d" + - "\xc1\xc4\x10\x26\x83\x89\xe9\xcc\x8f\xbf\xfc\x70\xed\x60\xd4\x98\x02\xe1\x4a\x4f\x28\x33\xa8\x7d\x61\xa4\xf4\xd6" + - "\x05\xc7\x45\xaf\xd7\x53\x69\x73\x3e\xf9\x14\xc5\x17\x11\x96\x87\x44\xed\xb9\xe9\x93\x3d\x68\x3d\x78\x0e\xc9\x75" + - "\xe2\x2a\x83\x28\xc6\xfe\x8c\x1b\xda\xd6\x55\xd9\xb2\x9b\x7c\xec\x8b\x7a\xe0\xd6\x3b\x9c\xd0\xaa\x22\x71\x33\xc5" + - "\xa8\xc3\xf1\xd9\xae\x5a\x02\x0a\x16\x82\xdf\xb6\x36\x78\x33\xa9\x6b\x79\x33\x78\x29\x3e\xb2\xac\x22\x6b\x9c\xbc" + - "\x75\x58\x5c\xc9\xda\x53\xd7\x4f\xc6\xfa\x97\x46\xe3\x5d\x4d\x06\x37\xd0\xee\xb5\xf7\x1a\xda\xd7\x71\xe6\x96\xea" + - "\x68\xcd\xff\xf0\x62\x8f\xba\xec\x6e\xbd\x30\x5a\xd5\xe9\xb7\xea\xf0\x7b\xb6\x6a\xb4\x2a\x7f\xab\xee\xda\x1b\x77" + - "\x95\xf7\x5d\x25\xfa\x16\x99\x8d\x0f\x92\xdf\x60\x10\x80\xf9\xfb\x57\x1e\x03\x77\xaa\x29\xa0\xc3\x7e\xab\x9a\xbc" + - "\x6d\xba\x67\x4f\xdc\x53\xd6\xf7\x94\xe6\x1b\xe4\x65\x2b\xff\xd5\x53\x00\xc8\x60\x25\xd8\xc1\x9c\x51\xb3\x04\xf3" + - "\x2d\xef\xb0\xde\xb9\x8a\x3b\xd1\x87\xf0\x43\x13\xaa\xb5\x7e\xba\xbd\xb7\x19\x4e\xf7\x0a\x96\x9c\xf2\x1c\xa9\xf3" + - "\xff\x02\x71\x5f\x33\x6b\xbe\xa9\x9a\x70\x3f\xe0\x0d\x9d\x7c\xbf\xd6\x8c\x54\x33\x32\xcb\xde\x4d\xfc\xf7\x93\xf0" + - "\xfd\x84\x78\xb3\x9c\xd0\xe1\xf0\x1b\xeb\xfa\x5d\x0c\xcd\x68\x47\xfc\xfa\xe6\xec\x6e\x6d\x19\xed\xc0\xbb\x98\xd0" + - "\xb1\xb9\xf4\x5e\xd2\xbd\x9b\x00\x6f\x95\x51\x14\x60\xf0\xd1\x60\x44\xdf\xea\x4f\x66\x90\xc3\x2a\x02\xfd\x6a\xcc" + - "\x4a\x9f\x00\xb0\x4f\x1d\x3e\x99\x71\x72\x77\x68\x14\x1b\x8a\x21\xde\x9c\xc1\x59\x88\xd3\x86\x85\xf4\x50\x4b\xc0" + - "\x21\xa8\x59\x87\x1d\x8d\x51\x90\xa0\x91\x63\x44\x39\xa7\x4f\x5d\xf3\x64\x98\xc0\x68\x14\x7e\x64\x7a\x1b\x30\x7a" + - "\x5d\xba\xa6\x06\x05\x1f\x5c\x43\xef\x8a\x5e\x53\x83\x82\x0f\x9e\xa2\x83\xe5\x76\x1b\x8d\x37\xf0\xe1\x90\xee\x6d" + - "\x34\xde\xc0\x87\xa3\x0f\x6e\xa3\x71\x72\x05\x61\xd5\x23\xd7\xa1\x3a\xed\xf4\x69\xf1\x6e\xf0\x4d\x30\xa8\xcc\x43" + - "\xe8\x03\xf1\x86\xd1\x07\xb2\x0c\xa1\x0f\xc4\x16\x36\x41\xde\x28\xb1\x40\x55\xbe\x95\x87\x20\xa9\x06\xaa\xf1\xad" + - "\x3c\x04\x49\x3e\x50\x85\x5d\xab\xa2\xe1\xa5\xe1\x10\x25\xd6\x67\x91\x71\x2d\x36\x16\xe9\x01\x6a\x16\x5c\x03\x0a" + - "\x8f\xd4\x10\xa0\x27\x66\x9d\x6f\xa7\x71\x25\x1f\x8e\xb6\xbf\x9d\xc6\xc9\xf6\x87\xc2\xfb\x1a\x7a\x5c\x01\x5d\x0d" + - "\xc1\xbd\x3d\x2d\x46\x46\x28\x7d\x0c\xfc\xc6\x7e\xf6\xd6\x78\x2d\x81\x2b\x79\x08\x6a\xf5\xb5\x04\x4e\x8e\xdd\xca" + - "\x91\x55\xdc\xc8\xcd\x0f\x93\x80\x7b\x9f\x1c\x5e\xb6\x81\xa0\xfc\x8f\xb1\x0b\x26\xe8\x3b\x1c\x26\x91\x4f\x36\x2d" + - "\x33\x01\x9b\x8d\xa4\x1d\x31\xf1\x0a\x07\x45\xfb\xe4\xd9\x46\x56\xa7\x2a\xc2\x10\x07\x6f\x1f\xf1\xb1\x3d\xfe\xbe" + - "\x4e\x1e\xdd\xc8\xf5\x37\x85\xa3\x98\x0c\x45\x8e\xe5\x87\x7d\xd2\xc6\xe6\x48\x4b\x8d\xed\x79\x67\x02\xc0\x3e\x21" + - "\xdd\x01\xae\xef\x84\x9e\x1b\xb9\xb2\x1a\x5f\x2f\x38\x93\x8f\x06\xb6\x00\xc9\x49\x0b\xd8\xf5\x3e\xa6\x88\xd2\xc5" + - "\xbb\xc9\xc5\xb1\x58\xd2\x3a\x99\xd6\x52\x86\xfb\x2e\x79\x68\xe0\xbe\x5e\x7a\xf3\x75\x12\x5f\x4d\xb7\x74\xd4\x15" + - "\xed\x78\x43\xfe\x60\x94\xee\x9b\xfa\x0a\xe3\x5b\x4b\x2d\xe3\x4b\x9f\xa8\x81\x7b\x07\xd5\x1d\x72\x35\xfa\x2a\xbb" + - "\x69\x68\x85\x37\x05\xe9\x31\xc0\xb4\xeb\xa0\xbf\x97\xf4\xdb\x06\x18\xc2\xfa\x90\x3a\xc5\x97\x2b\x72\x80\xf5\x76" + - "\xd7\x1d\xb2\x52\x3a\x6b\xba\xa5\xaf\x42\x1b\x81\x75\xd4\xc0\xae\xeb\x94\xbe\x9b\xee\x9b\x7a\x09\x63\x5a\xcb\x05" + - "\xe2\x4b\x89\xa9\x81\xfb\xfa\xea\x1e\xf9\x37\x7d\x95\xdd\xd2\x5d\x57\x34\x05\x9b\xb8\x06\xa6\x5d\x67\xea\xbd\xa4" + - "\xdf\xd4\x69\x18\xeb\x30\xd3\x85\x2f\xff\x27\x84\xf6\x75\xd9\x3d\x72\x8d\x7a\xea\xba\xa5\xc7\xc2\x1b\x82\x75\xd8" + - "\xc0\xb2\xeb\x20\xbc\x8f\xf2\x9b\xfa\x4b\x67\x9c\x9e\xf7\x34\x33\x57\x14\xa1\x57\xeb\xe5\x91\x78\xfd\x3d\x82\x04" + - "\xcb\xe6\xe9\xac\xcf\xfa\x22\x0f\xe3\x5a\x90\xec\x03\x5b\xab\x59\x45\x39\x4b\x71\x8a\x21\xf1\x1c\x12\x58\xc9\x73" + - "\x9e\xd1\x4a\x9e\x31\x54\x0d\x26\xfb\xb6\x2a\x2e\xdd\x90\x7c\x59\xac\x73\xe0\x6d\x80\x21\x65\x01\x48\x37\x8f\x65" + - "\xf8\xb4\x56\x61\x56\x5b\x67\xeb\xfd\xeb\x56\x4b\x88\xa0\xee\x2a\xac\xa7\xf3\xd5\xef\x9c\x88\xcb\xfd\xeb\x02\xc5" + - "\xdb\x0c\x48\x5f\xa9\xb8\xec\x79\xce\x4b\x2b\xab\xe8\x70\xf8\x7b\xeb\xcf\x02\x3e\xee\xd6\x6b\xab\x0d\xba\xe8\xff" + - "\xdd\x9e\x9f\x35\xec\x1e\xc3\x38\x86\x26\x04\xa6\xb1\x7f\xbb\x54\x1d\xfa\x2a\xbb\x7e\x7a\x5d\x7c\xb5\xf3\x9b\x42" + - "\x8a\x71\x61\xdc\x7a\x98\xeb\xf9\x14\x90\x77\x0b\x18\x5a\x7b\xd6\xd1\xb6\x28\x16\xd8\xdb\x1a\x12\x84\xc3\xe7\x2e" + - "\x1e\x03\x1e\x6d\x18\x7d\x57\x25\x49\x86\x97\xd3\xf4\xfb\x21\x89\x5a\x2e\x1c\xf2\xa2\xeb\x3b\x98\x14\xf5\x89\x7c" + - "\xa8\x6a\x92\xe6\xdd\x6b\xf4\x43\x34\x4f\x58\x97\x88\x0f\xbb\x68\x3a\xd7\x18\x56\xb7\xdf\xf9\x5f\xf6\x35\x20\x58" + - "\x77\xc0\xe3\x23\x3e\x56\x56\x26\x2b\x32\x9f\xc3\xfe\xd2\x75\x55\x09\x24\xa8\x52\x61\xd6\x35\x25\x0d\x29\x53\xf0" + - "\x82\xaf\x6e\xbd\x90\xea\x87\x71\xc0\x92\x1d\xa3\xc3\xfb\x5c\x65\xa4\x88\xd9\x7b\xd4\x58\x36\x1c\x0d\xcc\x30\xb4" + - "\x87\xfc\x85\x67\x7f\x18\x8c\x4e\x03\x8c\xab\xcb\x00\xa9\xd4\x01\xb3\x64\x95\x3c\x9a\xef\xd2\x60\x86\x18\x8e\x41" + - "\x59\x16\xb7\x69\x53\x15\x05\x6b\x7f\x57\x5d\xd2\x13\x43\xbc\x74\xbd\xee\x98\xcd\x9b\x1e\x48\x46\x23\xd1\xd4\x2c" + - "\x27\x45\x75\xd4\x84\x0b\x53\xf7\x6a\xdf\xd8\xfb\xff\xd3\x85\x78\x82\x01\x7f\xce\x41\xfe\x89\xc2\x42\x40\x0f\x45" + - "\xb3\x4e\x01\x5c\x90\x8e\xf6\xe3\x39\x9e\xaf\x7e\xc7\x13\xb3\x9e\xdb\x00\xa0\x6a\x1c\xc6\x0b\xa0\xcb\x2e\x2f\xc7" + - "\x24\x87\xd0\x49\x46\xd9\x4d\xc6\x78\x4d\xbc\x8c\x26\x1f\x11\x05\x06\x5a\xaa\xd4\xe4\x05\x2a\x91\xfa\xfa\xaa\xbd" + - "\x7d\x61\xb7\x0f\xf7\x26\xc4\xd4\xa9\x3f\xa5\x61\xe4\x58\x62\x94\xc4\xc3\xd5\x1e\x52\xee\x5b\x76\x48\xf2\xdd\xb4" + - "\xc8\xeb\x5d\x34\xcc\x9a\xd6\x24\x87\x96\xdb\xf3\xdc\x76\xbb\xc5\x4b\x8c\x89\x63\xfe\x11\x9f\x16\xf4\x21\xe6\xbe" + - "\xdb\xb7\xa8\x5f\xfa\x59\xc2\x24\x8b\x5d\xed\x73\x82\xea\x02\xed\x1b\x9b\x35\x55\x7d\x77\x0b\xb4\x4c\x1c\xbd\x91" + - "\x24\x09\xce\x02\x37\x26\xbf\x78\xac\xbb\x61\xdc\x5d\x74\xf2\xd2\x4b\xc5\x39\x47\x08\x3a\xbd\xab\x2e\x5f\x11\x02" + - "\xbe\xd2\x6c\x3d\x5d\x2e\x4c\x77\x69\xec\x66\xe3\x77\xec\x05\x40\xbc\x02\x30\x19\xc1\x10\x78\x3c\x37\x95\xde\xbc" + - "\x83\x88\x5f\x44\x95\x0f\xf2\x18\x42\x51\x37\x37\xd1\xd1\x82\xde\xe7\xe4\x98\xe8\xdd\x40\xd1\x5e\x98\x76\x5e\xf9" + - "\x20\x8e\x18\x38\x26\x01\x41\x7b\xba\xef\xca\x4f\xec\x91\x33\xd7\x9e\x82\xf6\xa8\x8e\x8b\xc5\xe1\xd1\x34\x9c\xe2" + - "\xf0\x60\xbb\x1b\x9d\x39\x85\x9f\x86\x9f\x36\xbe\xa1\x6d\x7c\x96\xdc\x93\x26\x3e\x53\xd2\x5e\x1a\x73\xb1\x64\xad" + - "\x1d\xe2\xed\x76\x2b\x3c\x3c\x61\xee\x56\xc2\xab\x96\x7d\xb8\xb2\x1e\x3f\xe0\x95\x88\x8a\xc5\xe3\x55\x1f\x22\xf5" + - "\x64\x55\xa4\xbd\x59\x65\xd9\x5a\x59\xcf\x3a\x91\x2f\x4c\x49\xfd\x61\xaf\x92\x71\x3b\xcd\x1f\x98\xb2\xad\xab\xc3" + - "\x02\xad\xc4\xe5\x50\xdc\x04\xbd\x0b\x05\xd6\xeb\x15\x8e\xb0\xe4\x77\x91\x24\xda\x0b\x56\x58\xc3\xb7\xdb\xb9\xd1" + - "\xf0\x42\x6f\xf4\xd6\x20\x32\xed\xaa\xaa\xe8\x72\xd3\xd0\xc1\x6e\x02\xd6\x6b\x93\xe0\x8b\x5c\xe6\x54\x1f\xc8\x39" + - "\x2f\x5e\x77\xd1\xfb\x7f\xa5\xc5\x33\xed\xf2\x94\x44\xff\x46\x2f\xf4\xfd\x24\x52\x1f\x26\xd1\xbf\x34\x39\x29\x26" + - "\x51\x4b\xca\x36\x6e\x69\x93\x1f\xcc\xeb\xc1\xd8\xf3\x87\x4b\xcc\x4d\x9f\x2e\x7d\x1e\xaf\xcb\x26\x8a\xe6\x8e\x19" + - "\xc3\xad\x69\x0c\xb7\x26\x81\xae\xaa\x75\x23\xb0\x92\x37\x5a\x35\xab\x05\x96\x29\x12\xd3\xca\xbb\x28\x74\xc2\x1a" + - "\xd8\x08\x2e\xc8\x60\xe8\xaf\x18\xc1\x35\x53\x36\xba\xaa\x45\x78\x8e\xf3\x12\x79\x41\x6e\x9e\x60\x4f\x5a\x3e\x5c" + - "\xf1\x22\xc7\x35\x79\xe8\xc4\x72\xc8\xbd\x9d\x2a\x79\x25\x4d\x53\x7d\xf5\xe8\x33\xf6\xde\x48\x62\x2f\x6e\xf1\xdb" + - "\xf7\x22\x6b\x23\x33\xe2\x98\x4a\x20\x5c\x20\x5e\xc1\x8a\xc7\x3e\x74\xb1\xeb\x93\xa6\x34\x86\xfc\xe1\x4a\xeb\xd2" + - "\x31\xe2\x36\x00\x36\x78\x7a\x4e\x84\x97\xe1\x49\x47\xcb\x5f\x31\xb3\x3d\xde\x93\x1d\xae\xf2\x81\xb2\xc1\x93\x4f" + - "\xde\x8b\x1d\x27\x2b\x7c\xa3\x9d\x77\x8c\x9d\x71\x93\x8f\x66\x2f\x13\x26\x23\xfc\x2c\xae\x87\x15\x57\x27\x41\x4e" + - "\xa0\x7b\x19\xc6\x4a\x22\x99\x79\xd4\x0f\xef\xf9\x38\x11\x66\xc5\xc5\xcb\x4d\x9a\x8b\xf1\x61\x84\x59\x9d\x9c\x38" + - "\xf5\xd7\xf2\xbb\x75\x6d\xf1\x88\xe6\x4d\xec\xf8\x95\xc6\xa9\xbc\x77\x63\xa7\xae\x6a\x15\x1e\x1a\x8b\xc3\xe2\xeb" + - "\x8e\x35\x1e\xf9\x80\xd6\x7c\xb3\x36\xdd\x78\x30\x15\xdf\x67\x72\x5f\x86\x4f\xee\xe0\x1d\x4d\x38\x77\xa8\x47\xa3" + - "\xf4\x37\x8d\x9b\x33\x29\xfe\x6e\xcb\xdc\x34\x4d\xdf\xbc\xcc\xf5\xb8\x95\x89\xed\x29\xce\x91\x95\xad\x1b\xd6\xd0" + - "\x22\xe5\xba\x68\x5a\x0a\x83\x0a\x12\x70\xf0\x54\xb4\xf1\x8e\x81\x02\xc7\x44\x4b\x9d\x8d\x80\x2a\x3f\xc4\x58\x87" + - "\xd8\xa0\x60\x89\xa7\x94\xf2\xa1\x6f\xa6\xf6\x24\x2b\x92\x63\x66\xe9\x8e\xcb\x6f\xfa\x7f\x23\x8b\xd3\x7d\xff\x0f" + - "\xe9\x2b\x65\xe5\x23\x73\x64\xea\x11\x18\x10\xb9\x66\xbc\x18\xc0\x4f\x53\x66\x40\x26\x91\xf1\x61\x47\x0e\x9d\x77" + - "\x90\xdb\x8e\xf7\xdd\x7d\x19\x9d\xa3\x08\x49\xdc\x32\x73\xb5\x07\xb0\x2f\xa4\xb1\x8b\xde\xbf\xb7\x4d\x1f\xa6\x13" + - "\x5d\x55\xeb\x55\xca\x94\xd3\xc2\x06\x79\x26\x1f\x09\x82\x4c\xff\x5a\xfc\x09\x96\x98\x43\x64\xf5\xd1\x36\xc3\x56" + - "\xe6\x10\x8b\x55\xd0\x60\xa0\x45\x08\x87\xea\x91\x3a\x29\x95\xe8\xbd\x83\x63\x2d\xf3\xd5\x18\x27\x6c\x78\x42\xb1" + - "\xd9\x2e\x8c\x92\x8e\x3e\xd6\x75\x91\xe9\x8e\x8a\x2e\x34\xad\xcc\x2b\x36\xe6\x63\x84\xb0\x8a\x88\x4d\x89\x48\x18" + - "\x18\xaf\xbc\x74\x76\x75\x89\x79\x99\xe0\xb5\x59\x02\xbb\x51\xc9\xe0\xd0\xc3\x27\x70\x5d\x92\x7a\xa1\x2d\x4a\x2f" + - "\xb7\x40\x66\x32\x90\x74\x93\x9e\x8d\x33\x0d\xcf\x85\x01\x83\xed\x52\x33\xf9\xde\x6e\xb8\x9e\x21\x2c\x68\xee\xa9" + - "\x2e\x35\x58\x34\x2e\x33\xc0\x29\x90\x98\xcc\x8a\xa3\x2f\x7a\xc6\xc4\x15\xc6\x2d\x10\x57\x4a\x9a\xea\xd2\x52\x73" + - "\xd7\x4a\xc6\x15\x4d\x30\xb0\xa6\xf6\x46\xff\xe5\x46\xb9\x6b\xa7\x4c\xa7\xf7\x34\x0d\x4d\xfe\x2f\x5d\x40\x6c\x53" + - "\x4a\xbe\x24\x29\x5e\x01\x57\x5e\x97\xb1\x15\xe5\x02\x1b\x83\xf1\xb1\xfe\x24\x1f\x18\x47\x0b\xe5\x5b\xe3\xba\xb7" + - "\xa8\x07\xc4\x48\x51\xf0\x37\xec\xd5\x5e\x4e\xbc\xc8\x3e\x46\x93\xe8\x83\xbd\xd9\x16\x2f\xb2\x48\x84\xcb\x9c\x72" + - "\x0c\xdd\xb6\x5b\x5b\xef\xab\xfb\xb7\xee\x10\x78\xc7\xf6\x1d\x46\x19\xb8\xb3\x07\x92\xd2\xf8\x39\x6f\xf3\x7d\x5e" + - "\xb0\x68\xd5\xb0\x01\xf5\x6e\xac\x5c\xd2\xa9\x69\xd3\xd6\x94\x67\xa4\x64\x2f\x8d\xb0\x52\xeb\xab\x7a\xe2\x1f\x11" + - "\x96\x48\x68\x39\x95\x6f\x8d\xa0\x30\xa5\xcc\x21\x09\xd7\x29\xde\xed\xbd\x45\xf6\xa1\x1f\x02\x7c\xd8\x7f\x1c\xc4" + - "\xe4\x05\x0b\xe1\x53\xbc\x45\x82\x82\xd4\x0d\x7d\xbe\x9a\xcd\x38\x90\xcf\xf8\x3a\x46\x7d\xa2\xe4\x8d\xe8\xeb\x72" + - "\xb7\x03\xb8\xf1\xd7\xb4\x26\x09\x68\x49\xa2\xb5\x02\x1f\xd4\xce\x46\x94\x3c\x41\xba\xf9\x59\x89\x1e\x7f\xcf\x06" + - "\x27\xcf\x8d\x82\xbe\x21\x71\x6d\x7d\x63\x0b\x6b\x60\x8f\x7d\x55\x00\x56\x7c\xa0\xaa\x5a\x35\x79\xfb\xc9\xba\xd4" + - "\xd5\xe8\xe1\x11\x19\x00\xd5\x0f\xad\x1c\x8e\xea\xb1\xb6\xf5\x53\x69\x53\x99\x33\xe0\x6d\xe7\xc5\x56\xe6\x03\xd0" + - "\x57\xbd\xf5\x8c\x9c\xd8\x41\x1e\xa9\x5e\x33\xed\xbe\x7e\x47\xd4\x6c\xf0\x20\xd0\xf0\x47\xcb\x78\x7f\x5a\x5b\x40" + - "\x51\x32\x3c\x66\x05\x0e\x6b\x25\xc9\xec\x23\x93\x79\xf8\x33\x62\x77\xae\x40\x34\x63\x20\xcf\xaa\x9b\xb0\x09\x3d" + - "\xea\xaa\x7a\xc2\xb7\x3c\xf9\xcf\x43\x53\x9d\x3f\x58\x55\x7f\xe4\x4f\x7d\x55\x66\x09\xab\xfc\x63\xe0\x8b\x62\x5d" + - "\x15\x89\x19\xe6\xb6\xa6\xc9\xde\xae\x9b\xea\x98\x67\xbb\xff\xf2\x3f\xff\xd8\xd7\xf3\x67\x69\xe0\xa6\x7f\xca\xd3" + - "\xa6\x6a\xab\x43\x37\x55\x55\xb6\x1d\x69\xba\x3f\xf4\x6a\xd7\x76\xcd\x0f\xdf\x7f\xf7\x90\xf0\xff\xfb\x9e\x55\x47" + - "\xcb\x0c\x94\x25\xaa\x2c\xfa\x6f\x02\xff\xcf\xaf\x35\xfd\x61\x66\x36\xaf\xa1\x35\x65\x87\xd5\xd8\xff\xc6\x2f\x4e" + - "\xdd\x1a\x46\x1e\x0c\x06\xf3\x11\x23\x8f\x86\xbc\x51\xed\xb8\x88\x50\xe9\xad\xee\xa2\x76\xb7\x57\xf0\x66\xb5\xe3" + - "\xca\xe5\xd0\xbc\xd5\xdb\xd5\x2e\xb0\x69\x77\x50\xbb\xc4\xa3\x76\x0f\xf7\x56\xbb\xe1\x78\xa2\x59\xe0\x4c\x58\xee" + - "\xdc\xcd\x1b\xdb\x65\xd5\x8e\xf8\x20\x7b\xae\xd6\xfc\x32\x3d\x16\xaf\xf5\x29\x4f\xab\x32\x4e\x4f\xf4\xb9\xa9\xca" + - "\xd8\x9c\x1e\x3d\xa0\xbc\x1f\x35\xaf\x4b\x41\x33\x40\xd3\x53\xd0\x4b\x43\x1c\x06\xb1\x3a\x56\x01\xf8\x95\xb6\xf4" + - "\xca\x4b\xb6\x7e\xc1\xfd\x9a\x5b\xda\xa8\xf8\x12\x67\xb5\x7d\x91\x0c\x10\x7d\x0b\x17\x96\xb3\xd2\x5e\x54\xa2\x52" + - "\xb9\x23\xa3\xd5\xaa\xe2\x03\xde\x6a\xaf\x91\xba\xda\x7c\xd6\x4f\x89\xc8\xbf\xad\xa0\xb6\xb5\x85\xa1\x76\x26\xd0" + - "\x45\xa4\xaf\xfe\xdd\x9e\x1e\xaa\x86\xea\x21\xce\xef\xff\x32\x4f\x16\xdb\xef\x03\x1a\xe7\x46\x27\x36\x7a\x5e\x66" + - "\x79\x4a\xba\xaa\x69\x3d\xba\xa6\xc2\x8e\x09\x12\xc1\x1a\x76\x7f\x56\xc0\xaf\x5a\xf3\x42\xf7\xdb\x82\xf2\x10\x00" + - "\x87\xc3\xbd\x2b\xd7\x03\x86\x18\xf7\x45\xae\x7b\xf3\x50\xf9\x35\xb7\x5a\xef\xcf\x59\xa2\xc7\xf8\x67\xe0\x88\x55" + - "\xdf\xae\x5e\x76\xb1\x3a\x3a\xe4\x3d\x8c\x0c\x77\xd4\xa2\xbf\x6c\xf1\x42\xdd\x74\x27\x1f\x1d\x7b\x3d\x7a\xb8\x51" + - "\x6e\x0c\xa0\xda\x0d\x64\x00\x57\x29\xb2\xbd\x73\xa3\xbd\x73\x64\x4f\xc3\x7f\x6f\x73\x50\x35\x9e\x0c\xda\xa3\x28" + - "\x2a\x31\xf4\xef\xa0\xda\xcc\xf5\xa8\xeb\xca\x50\x1b\x78\x65\x85\x0f\x28\xe3\x62\x84\x75\x11\xe2\xae\xae\xb9\xb3" + - "\x99\xea\x20\x9b\x46\x09\xe8\xa1\x08\x04\xb5\x69\x43\x69\xc9\x63\x41\xea\x8c\x94\x76\x36\xec\xd7\x9a\x58\xde\x3a" + - "\xb3\x0c\x47\xbe\xc4\x09\x35\xa9\x25\x0b\xfd\xc8\x9a\x34\x73\x62\x1f\x19\xae\x96\x16\xea\x9c\xd7\x1b\x9b\x09\xe7" + - "\x16\x66\xe7\xcd\x09\x65\x75\x5d\x45\x61\x13\x8a\x56\x93\x9a\x44\xd0\xaa\x80\xf2\x4b\x3d\x9f\x73\xe3\x25\x14\x5b" + - "\xfe\x65\x6a\x2d\x2a\x22\xc3\xee\xbe\xd3\xb3\x3f\x0c\x61\x0e\x75\xb8\x32\x96\x4f\xc9\x3e\x0d\xdf\x78\xf0\x79\x12" + - "\x8d\x40\xf1\xf9\x80\x79\x22\xfd\xc7\xae\xaa\x8a\x3d\x69\x34\x64\xf9\x4d\x80\x46\xd3\xb4\xa0\xa4\x39\xe4\x2f\x0a" + - "\x4a\x7d\x00\xd4\x7a\x91\x92\xbc\xa4\x4d\x7c\x28\x2e\x79\x36\xc0\x1a\xdf\x07\xaa\xb2\x40\x80\x6a\x44\x06\xb0\xac" + - "\x88\x4f\x55\x93\xff\xdc\x97\x14\x51\x36\x10\xb6\x0a\x00\x33\x2c\xce\x0a\x4a\xf9\x07\x5d\x4e\x3e\x18\x40\x0a\x1e" + - "\x50\x55\xb8\xda\x47\xc5\x6a\x49\x9e\x15\x44\xff\x1b\x50\x29\xc9\xf3\x9e\x34\xea\x4e\x20\x04\xd3\xbe\x43\x5a\x7d" + - "\x01\x3f\xa0\x0c\x24\xa4\x7f\x37\xc0\x0d\xb2\x43\x71\x4d\x8e\x1a\x15\xfe\x37\x28\x96\x17\x14\x15\x05\xf0\x49\x81" + - "\xa9\x2d\x0e\xf1\x9b\x17\x08\x57\x4c\x7f\x4f\xd9\xdc\xe4\xb8\x5e\x85\x4d\xcd\x34\x94\x30\x48\xe5\xdc\xba\x32\x10" + - "\x09\x51\x15\x54\x07\x86\xde\x0e\xe8\x60\xad\x1f\xad\xee\xb2\xbb\xc7\xea\x0f\x63\xb3\xbb\x17\x06\x7b\x41\xfa\xa4" + - "\xa6\x2c\x36\xd9\x81\x23\xd3\xf6\xce\xbd\x6e\xda\xf4\x2b\x1e\xf1\xb0\xb8\x57\x3b\x5c\xfa\x8b\xdd\xf0\xa2\x5b\xf4" + - "\x4f\xf9\xb9\xae\x9a\x8e\x94\x9d\x06\xad\x62\x52\x02\x98\xfd\x6d\xc3\x9e\x72\x71\xbd\x40\xdb\x19\x42\x00\xdb\x93" + - "\xd8\xff\xd3\x1b\x83\x40\xe6\x25\xdb\x6d\x90\x2f\x73\x5b\x3b\x0f\xea\x94\x55\x3f\x7f\xab\xfa\xfb\xc9\x6b\x17\x25" + - "\x9f\x93\x88\x00\x5f\xc2\x38\xba\x60\x4d\xf9\xb8\x9b\x84\x1e\x78\x00\x71\x51\xce\x47\x50\xb3\xc9\xe1\x90\xbf\x60" + - "\xf7\x40\xa4\xb3\xf1\xed\x37\xf1\xb9\x8d\x9f\x73\xfa\xb5\xc7\x84\x3e\x5e\x46\x9f\xf3\x94\x72\xbf\x43\x92\x13\x92" + - "\x89\x8b\xe3\x24\x52\x7f\x9c\x33\xf0\x47\x7b\x06\x7f\xbc\xb4\x41\x4c\x0e\x54\xb9\xd2\x01\x0a\xc5\x31\xe6\x2e\x37" + - "\xf6\x4d\x40\xf7\x7a\x3e\xf0\x62\x91\x38\x67\x36\x09\xf5\x0d\x21\xd1\x9e\x2d\x12\xed\xd9\x26\xa1\xbe\x21\x24\x5e" + - "\x5a\x8b\xc4\x4b\x6b\x93\x50\xdf\xb0\xb1\x86\xcb\x6a\x38\x36\x2f\xcf\xbe\x45\xbb\xcd\x7a\xa3\x7c\x42\x43\xf2\x3e" + - "\x6d\x67\xae\x03\x33\xb1\x6e\x2c\x56\x2c\x41\x9b\x11\xb8\xb8\xa9\xbe\x22\x35\x64\x00\x6d\x12\x75\xa7\x31\x2a\x29" + - "\x2d\x0a\x8b\xcc\x95\x8d\x07\x02\x1d\x13\xc1\xb5\x94\x79\x8f\x19\xa4\xc5\xc7\xfb\xd0\x46\x99\xd7\x8a\x46\xea\x31" + - "\xaf\x92\xf0\x35\x84\x3a\x2c\xb9\xdd\xce\xac\xca\xe5\x6d\x8d\xeb\xf4\xc5\xc2\x72\xe8\x0b\x0e\x37\xaa\x2f\xbd\x2d" + - "\x01\xfa\xe2\xa0\x12\xa2\x2f\x37\x49\xe4\x76\x25\xba\xad\xba\x37\x68\xd6\x5b\x2a\xbc\xa3\xba\xf1\x0b\x3c\x46\xe5" + - "\xb3\xd9\x76\x6b\xd5\x7e\xce\x6e\xd1\x37\x0b\xcb\xa1\x6f\x38\xdc\xa8\xbe\xf5\x13\x19\xd0\x37\x07\x95\xeb\xf4\xed" + - "\x1a\x91\xdc\x43\xe1\xae\xaa\xef\x2e\x1a\x77\x43\x8d\x77\x54\xb9\x19\xbb\xc7\x63\x54\x24\xaf\x8d\x5d\xa7\x5d\x16" + - "\x96\x43\xbb\x70\xb8\x51\xed\xea\x7d\x26\xa0\x5d\x0e\x2a\xd7\x69\x97\xa3\xf5\xf7\x50\x24\x17\xe9\xbb\xe8\x8c\x9f" + - "\xf8\x9b\xd5\x03\x9f\x68\xb9\xdb\x6c\xbb\x1d\x96\xa7\xf5\x36\x03\x2b\xaa\xb1\x66\xab\xeb\xaa\x19\x1f\x55\xa2\x1e" + - "\xcb\x4a\x5d\x57\x8f\xd6\x13\x82\xa4\xa5\x9a\x6e\x92\xaa\xf3\xea\x26\x17\x07\xc8\xc3\x3c\xd8\x01\x1e\x21\x71\xe5" + - "\xc0\xc5\x10\x1d\x63\xd7\x09\x3a\x3a\x7c\x19\xa6\x36\x82\xdd\xb4\xdc\x83\x58\x47\xbe\xda\xef\x77\x49\xed\xda\x01" + - "\x6f\x60\x83\x31\xfd\x46\x3e\xae\xb6\x0e\x28\xfe\xfd\xe4\x72\x0f\x83\x02\x88\x8b\x01\x82\xf5\x3c\x3e\x46\xfe\x4f" + - "\x00\x00\x00\xff\xff\x47\x37\xb0\x07\xc9\x28\x02\x00") + "\x4d\x59\x2e\xf9\x77\xda\x89\xce\xb7\xfb\xe6\x0e\xb7\x03\xdc\xec\x97\x9b\x0f\x07\xf4\xf4\x7b\xa0\x25\xda\xd6\x94" + + "\x2c\x69\x24\x39\x2b\xb3\xfb\xf6\xfe\xf6\x83\xf8\x4b\x41\x32\x48\xd1\x4e\x77\xcf\xdc\x62\xb7\xee\x7a\x9c\x62\x44" + + "\x30\x18\x0c\x06\x83\x41\x32\xf8\xf9\xf7\xff\xf4\xed\x37\xd1\xef\xa3\xff\xb7\xaa\xba\xb6\x6b\x48\x1d\x3d\x2f\xa6" + + "\x8b\xe9\x32\xfa\x70\xea\xba\x7a\xf7\xf9\xf3\x91\x76\x7b\x59\x36\x4d\xab\xf3\x47\x06\xfe\x87\xaa\x7e\x6d\xf2\xe3" + + "\xa9\x8b\xe6\xc9\x6c\x16\xcf\x93\xd9\x2a\xfa\xf3\xd7\xbc\xeb\x68\x33\x89\xfe\x58\xa6\x53\x06\xf5\xdf\xf3\x94\x96" + + "\x2d\xcd\xa2\x4b\x99\xd1\x26\xfa\xd3\x1f\xff\xcc\xc9\xb6\x3d\xdd\xbc\x3b\x5d\xf6\x3d\xc5\xcf\xdd\xd7\x7d\xfb\x59" + + "\x55\xf2\x79\x5f\x54\xfb\xcf\x67\xd2\x76\xb4\xf9\xfc\xdf\xff\xf8\x87\xff\xfa\x6f\xff\xe3\xbf\xb2\x4a\x3f\x47\x9f" + + "\x7f\xff\x4f\x51\x59\x35\x67\x52\xe4\x3f\xd3\x69\xda\xb6\x3d\xb3\xc9\x74\x1e\xfd\x2f\x46\x5b\x54\x17\xfd\xaf\xe8" + + "\x98\x77\xd3\xbc\xfa\xac\x60\xa3\xdf\x7f\xfe\xf6\x9b\x53\x77\x2e\xa2\x5f\xbe\xfd\xe6\xdd\xa1\x2a\xbb\xf8\x40\xce" + + "\x79\xf1\xba\x8b\x5a\x52\xb6\x71\x4b\x9b\xfc\xf0\xf8\xed\x37\xef\xe2\xaf\x74\xff\x25\xef\xe2\x8e\xbe\x74\x71\x9b" + + "\xff\x4c\x63\x92\xfd\xf5\xd2\x76\xbb\x68\x96\x24\xbf\x63\x10\xe7\xd6\x51\xfa\xed\x37\xff\xfe\xed\x37\xdf\x7e\xb3" + + "\xaf\xb2\x57\x56\xcd\x99\x34\xc7\xbc\xdc\x45\x89\x28\x20\x4d\x97\xa7\x05\x9d\x44\xa4\xcd\x33\x3a\x89\x32\xda\x91" + + "\xbc\x68\x27\xd1\x21\x3f\xa6\xa4\xee\xf2\xaa\x64\xbf\x2f\x0d\x9d\x44\x87\xaa\x62\xb2\x3c\x51\x92\xb1\xff\x3d\x36" + + "\xd5\xa5\x9e\x30\xb2\x79\x39\x89\xce\xb4\xbc\x4c\xa2\x92\x3c\x4f\xa2\x96\xa6\x1c\xb7\xbd\x9c\xcf\xa4\xe1\x95\x67" + + "\x79\x5b\x17\xe4\x75\x17\xed\x8b\x2a\xfd\x22\x39\xb8\x64\x79\x35\x89\x52\x52\x3e\x93\x76\x12\xd5\x4d\x75\x6c\x68" + + "\xdb\x4e\xa2\xe7\x3c\xa3\x95\x8e\x97\x97\x45\x5e\xd2\x98\xa1\xf7\xed\x7e\xa6\x3d\xfb\xa4\x88\x49\x91\x1f\xcb\x5d" + + "\xb4\x27\x2d\xed\x21\x20\xe9\x5d\x59\x75\xd1\x87\x1f\xd3\xaa\xec\x9a\xaa\x68\x7f\x8a\x3e\x6a\x24\xcb\xaa\xa4\x3d" + + "\xa9\x13\xed\x35\x67\x10\xcc\x8f\xa7\x3c\xcb\x68\xf9\xd3\x24\xea\xe8\xb9\x2e\x48\x47\x23\x0b\x4f\x56\xc3\x4a\xf6" + + "\x24\xfd\xd2\xcb\xa3\xcc\xe2\xb4\x2a\xaa\x66\x17\x75\x0d\x29\xdb\x9a\x34\xb4\xec\x24\xe4\x8e\xa4\x5d\xfe\xdc\x8b" + + "\x7b\x77\xaa\x9e\x69\xc3\x30\xab\x4b\xd7\x33\x0d\x3a\x65\xbf\x6f\x7e\xec\xf2\xae\xa0\x3f\x71\xd2\x55\x93\xd1\x26" + + "\xde\x57\x5d\x57\x9d\x77\xd1\xac\x7e\x89\xb2\xaa\xeb\x68\x26\x7b\x77\x12\xb5\x5d\x53\x95\xc7\x41\x93\xbe\x8a\xe6" + + "\x6c\x12\x49\x34\x3b\x94\x43\x71\xdb\xbd\x16\x74\x17\xe5\x1d\x29\xf2\x54\x00\x9c\x66\x9a\x86\x4c\xd7\x1b\x7a\x8e" + + "\x92\x47\x85\x92\xff\x4c\x77\xd1\x9c\x9e\x05\xf8\x99\x34\x5f\x18\x82\x68\xed\x77\x49\xc2\x80\x07\x39\xec\xa2\xef" + + "\x0e\x07\x59\x7d\x7b\x26\x05\xd0\x74\x4e\xed\x41\x29\x68\x7b\xe9\x1b\x71\xa9\x19\x44\x5d\xb5\x79\xaf\x3d\xbb\xa8" + + "\xa1\x05\xe9\x05\x66\x70\xb1\x59\x31\xb5\x67\xca\xa0\x3a\x2e\x40\x21\x64\x05\x5d\x55\xef\xa2\x78\xba\x52\x8d\x69" + + "\x2f\x7b\x21\x69\x2e\xe2\x78\x3a\x1f\x0a\xf3\xf3\x11\x74\xc3\xd0\x4d\xed\xf3\x91\x2b\xd7\xae\xa9\xaa\x8e\xeb\x55" + + "\xdf\xa9\x87\xa2\xfa\xba\x8b\xb8\xfe\x08\x50\x3e\x82\x34\xf9\xce\xe8\x39\x5a\x26\xf5\x8b\x94\x3e\xd7\x05\xad\x35" + + "\x72\xe0\xef\xab\x97\xbe\xe1\x79\x79\xdc\x45\xbd\x1e\xd3\x92\x7d\xe3\x23\xbf\xfa\xd9\x57\xee\x28\x12\x95\xd6\x82" + + "\xa7\x81\x6b\x72\xe9\x2a\x51\x98\x56\xbd\x41\xf8\xb2\xcf\xfa\x41\x49\x27\x51\x4b\xce\xb5\x6d\xaa\xce\x55\x59\xb5" + + "\x35\x49\xe9\x64\xf8\x69\xf4\xd6\x4c\x49\x72\x7f\xe9\xba\xde\x28\xe4\x65\x7d\xe9\x26\x51\x55\x77\xdc\x82\x44\x2d" + + "\x2d\x68\xda\xf5\x63\xed\xa5\x23\x0d\x25\xba\xad\x92\xf4\x7a\x03\x70\xa2\x4d\xde\x3d\x0e\x6a\x27\xbe\x68\x15\x18" + + "\x6d\x7a\xce\xdb\x7c\x5f\x50\x83\x07\x5e\x25\x57\x87\xde\x74\xb2\xd1\x7a\xa8\x9a\xb3\x36\xb6\x25\x34\xb3\xd3\x8c" + + "\xed\x1f\xbb\xd7\x9a\xfe\xc0\xbf\xff\x34\x81\xdf\x1a\xda\xd2\x4e\xff\xd4\x5e\xf6\xe7\xbc\xe3\xa3\x58\xf6\x26\xa9" + + "\x6b\x4a\x1a\x52\xa6\x74\x17\x71\x32\xac\x39\x97\xa6\xed\xdb\x53\x57\x79\xd9\xd1\x46\xab\xfe\xc7\x2c\x6f\xc9\xbe" + + "\xa0\xd9\x4f\x1a\x23\xea\x2b\x1f\x86\x82\x40\x46\x0f\xe4\x52\xe8\x02\xd9\xed\x98\x9e\x1c\xaa\xf4\xd2\xc6\x79\x59" + + "\xf6\xc6\x9b\xd1\xb0\x0b\xf8\x00\x24\x59\xc6\x54\x86\x8f\x68\x43\xef\x19\x26\x83\xd3\x06\x20\x9f\xd8\x20\x0c\x97" + + "\x41\x7a\xa2\xe9\x97\x7d\xf5\x62\x08\x8b\x64\x79\xa5\x0b\x06\xea\xaa\x32\x79\xb8\x96\xeb\xc5\xee\x92\xa1\x21\x36" + + "\x5f\xe5\xe5\xbc\xa7\xcd\x4f\xbb\x9d\xac\x9f\xb5\x3f\x6e\xeb\xbc\x8c\x35\x45\x75\x80\x57\x97\x4e\x07\xff\xf6\x9b" + + "\x77\x70\x08\x83\xa1\x04\x35\x82\x92\x26\x3d\xb9\x1b\x7e\x9f\xf1\xfd\xe8\xd0\xb7\x5e\xd3\x0f\x39\x2d\x32\x27\x63" + + "\x43\xfb\xf8\x87\x38\xed\x31\x0b\x4c\x22\x2e\x8c\x8c\xa6\x55\x43\x7a\x03\x2e\x24\x82\x71\x02\xc6\x18\x63\xa8\xa5" + + "\x9d\xae\x7a\xd3\xc5\x8a\x9e\xa3\xe9\x7a\xce\xfe\x67\xb3\xa2\xe7\x47\x68\x13\xa2\x79\xfd\x02\x95\xb3\x9f\x14\xdb" + + "\xaa\xc8\xb3\xa8\xcd\x8b\x67\x35\x80\x0a\x7a\xa4\x65\x16\xa0\xd4\x9a\xe5\x41\xed\xa1\xb4\x56\xbe\x49\xb6\xeb\x07" + + "\x24\x9c\xb3\x7b\x7b\x68\x56\xda\xfb\x07\x05\xa9\x5b\xda\x77\x19\xff\x25\xd1\xb3\x49\xd4\x9d\x0c\x6e\x59\xd9\xbb" + + "\xde\xcd\xfc\x1f\xd5\xa5\xe9\x65\x87\xb8\xab\xa7\xd5\xbe\xfe\xdc\xdb\x86\x55\xbc\xaf\xf2\x82\x36\xcc\x65\xd1\xdc" + + "\xd6\xb6\x49\x3f\xa7\x6d\xfb\xb9\xf7\xd5\x98\x9f\xda\xfb\x9f\xff\x7c\xa6\x59\x4e\xa2\xba\xc9\x4b\x2e\xff\xdf\x4f" + + "\xa2\x1d\x39\x30\x37\x6f\xb7\xa7\x87\x4a\xcc\x10\x70\x96\x8f\xfe\x29\x3f\xd7\x55\xd3\x91\x92\x19\x62\x6e\x3e\xdb" + + "\x13\xc9\x7a\x81\xf5\xfd\x6a\x02\x40\x97\x20\x89\x2c\x7c\x6d\x18\xf8\xc8\xb8\xcb\xbf\xfd\xe6\x5d\x2f\x24\xd2\x3b" + + "\x56\xbd\xb9\xef\x28\xef\x73\xce\xdb\xa0\x90\x3b\xee\xf5\x73\x97\x80\xa3\xfc\x78\x6a\xe8\xe1\x27\xde\x66\xd9\x54" + + "\x36\x8e\x76\xd1\xfb\xe8\xc3\xfb\x88\x74\x5d\xf3\xa1\x87\xf9\x18\xbd\xff\xf8\x5e\x62\x0d\x1e\xda\x08\x26\x03\xd2" + + "\x50\x59\x85\xff\xdf\x0f\xef\xff\x4a\x9e\x49\x9b\x36\x79\xdd\xed\xde\xff\x24\x65\xae\x4a\xbf\x7b\xef\xa0\x2c\xe9" + + "\x30\x27\xf8\x6f\x97\xaa\xa3\x6c\x7e\xe6\x60\xf6\x68\xf8\x6e\xbb\xdd\x32\xe9\xd5\xe4\x48\xe3\x7d\x43\xc9\x97\x38" + + "\x2f\x7b\x67\x7f\x17\x91\xe7\x2a\xcf\x04\xb9\xae\x77\xea\x39\x11\xe5\xe3\x32\x6d\x8e\xb9\xb7\x1f\x33\xdd\x17\xc0" + + "\xf9\xf9\x38\x89\x3a\xc1\xda\x08\x61\xe9\x3d\xbd\x3b\x93\x97\xf8\x6b\x9e\x75\x27\xbe\x32\xb1\x7b\xef\x34\x9f\x44" + + "\xa7\xc5\x24\xe2\x23\xec\x5d\xd5\xd4\x27\x52\xb6\xbb\x68\xc1\xf8\xff\x9a\x67\xd5\xd7\xfe\x2f\x0d\xda\x62\x81\xc9" + + "\x4c\xe7\x00\xcc\xf4\xa6\x77\x7a\xb0\xb9\x98\x96\xe4\x79\x4f\x1a\x43\x14\xdc\x5c\x71\x80\x7d\x57\x3e\x4d\x53\xd2" + + "\xd0\x6e\x12\x4d\xb3\xa6\xaa\x2f\xf5\x13\xf8\x08\x7b\x22\xee\xaa\x3a\xc6\x87\x8e\xa4\x56\x90\x3d\x2d\x9c\xbd\x97" + + "\xf4\xa6\x85\x03\x0e\xb6\xc5\x6d\x47\x10\xfa\x1c\xad\xb7\x2c\xf2\xe7\xc9\x14\x85\xe2\x10\x17\x08\x57\x03\x5e\x27" + + "\xcd\x00\x29\xf0\xed\xe4\x6c\x41\x96\x65\x16\x4d\x66\xec\xfe\x59\xf8\x91\x29\xb5\xbd\xca\xef\xff\x5b\xf1\x5a\x9f" + + "\xf2\xb4\x2a\xdb\xe8\x5f\x49\x71\x28\xf2\xf2\xd8\x7e\xdf\xeb\x41\xdb\xa4\xbb\xe8\xd2\x14\x1f\xa6\xd3\xcf\x3d\x4a" + + "\xfb\xf9\xa8\x40\xe3\x93\x04\x8d\x1b\x7a\xbc\x14\xa4\x99\xd2\xaa\xfb\x78\x1b\xda\xff\xf3\x5d\x4e\x0f\xf9\xcb\xc7" + + "\xbe\x59\xbd\x5b\x48\xba\x0f\xdf\xd3\xf3\x9e\x66\x19\xcd\xe2\xaa\xa6\x65\x3f\x07\x7e\xff\xb1\x5f\xfd\xbe\x0b\x27" + + "\xfc\xb5\x3a\x1c\xe6\x1f\x23\x49\x90\xfd\x79\x13\x11\x9d\xc6\xd5\x24\xba\x0e\x50\xe8\x9a\x0b\xbd\xa9\x35\xed\xf3" + + "\xf1\xbb\x01\xe0\xff\x57\x00\xa2\x5c\x93\x5d\xfb\x7c\xfc\xfe\xa3\xe8\xfa\xa9\x42\xf2\xac\xf7\xd8\x22\x6d\xc6\x67" + + "\x79\x67\x04\x20\x50\x6b\xe0\xa2\x97\xfb\xa9\x8f\xe6\x24\xbe\xe4\xcb\x57\xcd\xa5\x9d\x41\x3f\x8a\xd3\x38\x57\x55" + + "\x77\x62\x13\x33\x29\xbb\x9c\x14\x39\x69\x69\xa6\x3c\xb5\xaa\x7d\xb1\xe0\x8e\x0d\x79\x6d\x53\xa2\x16\x20\x43\xe3" + + "\x63\x36\x31\xe7\xed\x17\x38\xd3\x0e\x96\xfe\x2f\x73\xf2\xde\xc6\xa9\x8b\x4b\xeb\x82\xdf\x23\xf0\xf4\xd2\x08\xf0" + + "\x49\xa4\x7f\xae\x5c\x64\x12\x92\x22\x84\xce\x79\xe9\xae\x79\x3e\x9b\x23\x28\x69\x51\x5d\x32\x17\xca\x3a\x99\x61" + + "\xec\x96\xcf\xb4\xa8\x6a\xea\xc2\xda\x24\x5b\x4c\x28\xb4\x4c\xf3\xc2\x8d\x73\x40\x70\x8e\x05\x69\x5d\xed\xa1\x09" + + "\xca\xdc\xf9\xd2\xe6\xa9\x1b\x05\x13\x01\xf7\x89\xdd\x38\x0b\x04\xe7\x44\x49\xd3\xb9\x51\x56\x58\x35\x1d\x69\xdc" + + "\x18\x6b\x07\x46\x4c\xcf\x75\xf7\xea\xc6\xdb\x20\x78\x97\x96\x7a\x6a\x7a\x40\x30\x0e\x79\x71\x76\x63\x60\xdd\xd9" + + "\x9d\xe2\x82\x34\x47\x97\x12\xd0\x64\x96\xa0\x58\x6e\x78\xac\x37\xfb\x5a\xf2\xd6\x2d\x68\x54\xa5\x2b\xd7\x60\xa5" + + "\xc9\x0c\xeb\xcb\x86\x9e\xab\x67\x4f\x43\x96\x08\xce\xcf\x55\x75\x8e\xf3\xd2\x8d\x84\x69\x00\x43\xaa\x2e\x9e\xe6" + + "\x60\x5a\x50\x1d\x0e\x6e\x04\xac\xfb\xdb\xfc\x58\x12\xd7\x48\xa3\xc9\x0c\x53\x80\xb4\x3a\xba\x11\xd0\xfe\x6f\x48" + + "\xeb\xee\xcc\x39\xd6\xf9\xa7\xea\xec\x96\xf2\x1c\xeb\xfe\x43\x5e\x78\x30\xb0\xbe\xef\x72\x5f\x1d\x68\xef\x57\xc4" + + "\x65\xff\x68\x32\xc7\xfa\x3e\xab\xbe\x96\x45\x45\xb2\x98\x14\xee\xae\x9c\x63\x0a\x20\x31\xdd\x58\x98\x02\x5c\x6a" + + "\x3f\x0e\xa6\x03\x79\xb9\xaf\x5e\xdc\x28\x98\x0a\xf4\xb3\x77\x9c\xe6\x4d\xea\x93\x39\xa6\x0a\x0d\xad\x29\x71\x4b" + + "\x62\x81\xe9\x42\x43\x0f\x0d\xf5\x28\xd0\x02\x53\x87\xde\x14\x78\x85\xbe\xc0\x54\xa2\xf7\x43\xdc\x18\x98\x4a\x1c" + + "\x0a\xe2\x1e\x0d\x0b\x4c\x25\xfa\x05\x58\x7d\xaa\x4a\xea\x9e\xad\x16\x98\x42\x3c\x57\xc5\xe5\x4c\xbd\x43\x7c\x81" + + "\xa9\x84\xc0\xeb\xf5\xc9\x8d\x88\xe9\x85\x40\xbc\xd4\x6e\x34\x4c\x37\xfe\xd6\xa4\x55\xe6\x56\x8b\x05\xa6\x16\x7b" + + "\xe2\x47\x5a\xa2\x13\x84\x47\xf2\x4b\x74\x86\x20\x47\xb7\xcc\x97\x98\x3e\xec\x2b\xcf\x04\xb1\xc4\xf4\xa1\xc7\x38" + + "\x93\xc6\x83\x85\xe9\x04\x0b\xd8\xb8\x51\x30\x75\x48\xc9\x99\x36\xc4\x8d\x83\xa9\x02\x8b\xba\x3b\x31\x30\x1d\xd8" + + "\x57\x85\xdb\x9a\x2c\xb1\xee\xe7\x9b\x50\x6e\x1c\x74\x82\xa0\x2f\x9d\xf4\xd2\x5d\x88\x2b\x54\x05\x7a\x44\x1e\x85" + + "\x70\xe2\x61\x9a\xc0\xf6\x93\xe2\x82\x1e\x3c\xf5\x61\xfa\xc0\xf1\x52\x5a\x76\x1e\xaf\x69\x85\xe9\x05\xc7\x6c\xfc" + + "\x4d\xc4\x54\x83\x23\xfe\xf5\xd2\x76\xf9\xc1\xed\xdb\xad\x30\x15\xf1\xba\x43\x2b\x4c\x41\xf2\x32\xa3\x65\x37\x22" + + "\x18\x7c\x0e\x61\x88\x23\xed\x43\xdd\x49\x92\xd2\x7e\x26\x8e\xd9\x06\xb1\x1b\x17\x5d\x27\xe4\x69\x77\x69\xdc\x66" + + "\x63\x8d\xe9\xcc\x99\xd4\x71\x3f\x42\x3d\x3d\xb8\x46\xfb\x9e\xef\xc3\x3b\x71\xb0\x5e\xef\x7c\xc3\x7a\x8d\x75\x37" + + "\xcd\x72\x0f\x06\xba\x56\x38\x11\x9f\x08\xb0\x6e\x66\x7b\x38\x6e\x14\xac\x83\xbd\x6e\xef\x1a\xeb\xd8\xb6\xa3\x75" + + "\xbc\x27\xe9\x97\xaf\xa4\x71\xdb\x90\x35\xd6\xaf\x07\xd2\x76\xe3\xa8\x1b\xac\x77\xc7\xb1\x30\x7b\xc0\xa2\x11\x4e" + + "\x0c\x4c\x1b\x6a\x72\x69\xdd\x02\xd9\x60\xca\xd0\x76\x95\x7b\x2a\xdd\x60\xca\x70\xa8\x1a\x7f\x5b\x30\x7d\x60\xc2" + + "\x1b\xc5\xc4\xd7\x90\xb4\x1e\xc7\xc4\xb4\x83\xfe\x95\xa6\x6e\xb5\xdd\xa0\xab\x88\x13\x7d\x6e\xaa\x11\x23\xbc\xc1" + + "\xb4\x43\x62\xfa\x8d\xcd\x03\xa6\x1d\x75\x71\x69\xd9\x9a\xc7\x8d\x86\x06\x0a\xf2\x72\x14\x0f\x53\x12\xbe\x5a\x1c" + + "\x41\xc4\x54\xa5\xfa\x32\x82\x84\x69\xcb\xdf\x2e\xb4\xed\x72\xb1\xa8\x73\xa3\x62\x3a\x93\x97\x87\x6a\x04\x0d\x55" + + "\x98\xb4\xa1\xb4\x6c\x4f\x95\xa7\x1b\x30\x75\x11\x72\x19\x59\x40\x3c\x60\x6a\x53\x7d\x19\x45\xc3\x1d\xcc\x72\x0c" + + "\x6f\x8b\x29\x0c\x69\x9a\xea\xab\x5f\x47\xb7\xa8\x83\xc1\xf0\xfc\x1a\xba\x45\x67\x19\x86\xe8\xf1\xb9\xb7\xa8\x77" + + "\xc1\xb0\xbc\x2e\xfe\x16\x53\x19\x36\x77\x78\x97\x49\x5b\x4c\x5d\x1a\xca\x4e\xa6\x1d\x2e\x85\x3b\x74\xb0\xc5\x14" + + "\x46\x20\xb2\xd3\x43\x6e\x4c\xd4\xc2\xbc\xa4\x05\x39\x93\x51\xfd\x9e\xa1\x91\xbe\x63\xee\xee\xc0\x19\x1a\xe8\x2b" + + "\x28\x71\xae\xb3\x66\x68\x98\xef\x90\xbb\xa7\xe1\x59\x82\xce\xf5\xaf\x94\x6d\x3d\xb8\xb1\x30\xe1\xf7\x58\x69\x51" + + "\xb9\x67\x9f\x19\x1a\x20\xfc\x4a\x9a\x32\x2f\x8f\x23\xc2\xc3\x44\x5f\x17\xa4\xf4\x54\x86\x1a\x77\x52\xd0\x32\x73" + + "\xc7\x30\x67\x68\x9c\xb0\x21\x65\x56\x39\x63\x8b\x33\x34\x4a\x98\x56\xe7\x33\x75\x3b\x59\x33\x34\x54\x78\x26\xc7" + + "\x92\x7a\x70\xd0\xe0\xb7\x98\x75\xdc\x43\x73\x86\x46\x0c\x25\x9e\x6f\x70\xce\xd0\xb8\x61\x43\xbb\xaf\xd4\xc7\x26" + + "\xee\x0d\x56\x75\xdd\xf7\x73\xea\x09\x3a\xcf\xd0\xe0\xe1\xa1\x2a\xd8\x36\xa4\x57\xb7\xd0\x28\xa2\xc0\xf4\xea\x32" + + "\x1a\x4a\x14\xf6\x40\x9e\xf3\x73\x23\xe3\xb1\x24\x86\x7c\xaa\x9a\xfc\xe7\xaa\xec\x3c\xe8\x78\x88\x31\x73\x3a\x39" + + "\x33\x34\xc2\xb8\xbf\x14\xc5\xa9\x6a\xdc\x4d\x44\xa3\x8c\x7b\xea\x36\x75\x33\x34\xca\x98\xf6\xd2\x38\xe4\x29\xe9" + + "\xdc\xdd\x80\x06\x1b\xbb\xd3\xe5\xbc\x6f\x7d\x1a\x8a\x46\x1a\x05\x9a\x57\x41\xd1\x60\xe3\x89\x94\x99\x7f\x8e\x9b" + + "\xa1\x01\x47\x86\xe7\x9b\x53\x67\x68\xd0\x91\xa1\xf9\x1a\x87\x29\x09\x43\xf2\x36\x0d\x8d\x39\x72\x5f\x21\x64\x1a" + + "\x9f\xa1\xe1\x47\x0d\xdf\xdb\x54\x34\x0e\xa9\xa1\x7b\x9a\x8c\x86\x24\x35\x64\x7f\xd3\x31\x2d\x3a\x16\xd5\xde\xad" + + "\x78\x68\x68\xf2\x6b\x43\x4b\xf7\xae\xd8\x0c\x0d\x4b\x76\xa4\xfd\xe2\x8c\xc6\xcd\xd0\x80\xe4\x21\x2f\x3c\x71\x97" + + "\x19\x1a\x8d\xdc\x37\x39\x3d\xa4\xc4\x63\xd1\xd0\x80\x64\xef\xda\x70\xef\xd6\x89\x87\xc6\x24\x33\xd2\x9e\xf6\x95" + + "\x67\xfd\x34\x43\x23\x93\x35\xa9\x69\x93\x16\xb9\xbb\xa7\xd1\xf0\x24\xdb\x59\xf4\xef\xfa\xcd\xd0\x28\x65\x91\x97" + + "\xce\xf5\xff\x0c\x8f\x50\x9e\x2a\x8f\x13\x80\x46\x28\xeb\x4b\x7b\xaa\xdd\xfb\x5e\x33\x34\x44\x79\x69\x3d\xa2\xc3" + + "\x3a\xf8\xb8\xf7\x08\x0d\xeb\xda\xb6\xf2\x4c\x8c\x68\x94\xb1\xc7\x88\xf7\xaf\x31\x29\xea\x13\xd9\x7b\x66\x64\x34" + + "\xd6\x68\x62\xfb\xdc\xed\x19\x1a\x75\x94\x14\xf8\x69\x1c\x27\x2a\x1a\x73\x80\xa8\xfe\x9a\xd1\xf5\x81\xe4\xbd\xeb" + + "\x9a\x7c\x7f\xe9\xdc\x7b\x16\x33\x34\x02\x69\xe3\xfb\x79\x40\x35\xa2\x64\xe1\x2a\xea\xd6\x0b\x34\x22\x49\x5f\x6a" + + "\x52\x7a\x70\xf0\x9d\x4d\x7e\xee\xca\x6f\x35\xd1\x50\xa4\x42\xf5\x58\x6b\x34\x1c\x59\x54\x47\xcf\xe6\xf0\x6c\x8d" + + "\xee\x75\x16\x9e\x0d\xd5\x19\x1a\xbd\xec\xab\xf1\x6c\x27\xcf\xd0\xf0\x65\x49\xbf\xc6\x5f\xf3\x32\xab\xbe\xba\xf1" + + "\x70\xcf\x35\xad\x3c\x26\x10\x0f\x63\x12\x77\x80\x71\x86\x46\x31\xbd\xee\x26\x1a\xc4\xec\xeb\xf0\xb0\x85\x6e\x67" + + "\xb0\xa3\x6e\x6e\x1c\x4c\x17\xe8\x8b\x17\x07\x8d\x5b\xb6\xd4\xa3\xac\x68\xcc\xf2\x50\x54\x75\xfd\x1a\x67\xee\x03" + + "\x47\x74\x86\x86\x2e\x05\xa2\x5f\x18\x68\x04\x53\x60\xfa\x0f\x41\xcc\xf0\x50\xe6\x50\xa9\x1b\x11\x0d\x67\x72\x44" + + "\x6f\x67\xa3\xd1\xcc\xb4\xa1\x59\xde\xf5\xeb\x20\x4f\x2b\x31\x2d\xe1\x57\x47\x3c\x96\x16\x8f\x67\x5e\xba\x82\x36" + + "\xee\x79\x18\x0d\x65\xf2\xc3\xb8\x4e\x1c\x34\x86\x99\x56\xe7\xba\xa1\x6d\xeb\xe9\x3c\x34\x88\x49\x49\xe3\x9f\xc4" + + "\xd1\x10\x26\x43\xf1\x1a\x6d\x34\x80\xd9\x55\x5f\x7d\xed\x42\xe7\x9a\x8e\x74\xee\xe9\x05\x0d\x5b\xb6\x99\x7f\xd7" + + "\x68\x86\x46\x2d\x4f\xa3\x58\xa8\xed\xb8\xec\xd9\xe1\x6f\x0f\x8b\xe8\x2e\x08\x3b\x91\xdb\x76\xb4\xf1\x55\x88\xfb" + + "\x29\x17\xb6\x74\x29\xf6\x6e\xa5\x42\x63\x96\x1c\x71\x15\xcf\xdc\x68\xb8\x9f\xd2\xa3\xad\x7d\x68\xb8\x73\xd2\xa3" + + "\x6d\x7c\x68\xe8\x22\x45\xde\xee\x8d\x7d\xbb\xe5\x33\x34\x6a\xd9\xd0\x63\xde\x76\xfc\x0a\xc0\x08\x3a\xba\x73\x5e" + + "\x54\x97\x6c\xf4\x7c\xcd\x0c\x0d\x43\x72\x5c\xff\x29\x9b\xd9\x16\x53\x84\xae\xa1\x34\x4e\xab\x32\xf7\x59\x96\x2d" + + "\x7e\x7c\x8a\xd2\x38\xa3\x69\x9e\x5d\x2a\xe7\x91\x4d\x3a\x4f\x50\x63\xe1\xe4\x72\x8e\x06\x4a\x7b\xfb\xec\x3d\x4a" + + "\x35\x47\xa3\xa5\xbd\x75\x1e\x41\x43\x97\x21\xf4\x99\x16\x1e\x8f\x69\x8e\x86\x4d\x7b\xd5\x71\x63\xa0\x2b\x11\xd2" + + "\xba\x63\x29\x73\x34\x5c\x4a\x0a\xea\x9e\xc2\xe7\x68\xf8\x92\xfe\xed\xc2\x6e\x82\x3b\xbb\x77\x8e\x46\x30\xbf\xe4" + + "\xa5\xf3\x1c\xcb\x1c\x0d\x5f\xfe\xed\xe2\x59\x97\xe2\x47\x77\x6b\xe2\x76\x68\xe7\x68\xdc\x72\x9f\xb7\x27\xf7\x7e" + + "\xe5\x1c\x8d\x58\x7e\x29\x7d\x91\x92\x39\x1a\xb0\xdc\x93\xfd\x6b\x7c\xa8\x9a\xf3\xa5\x70\x9e\x66\x99\xa3\xf1\xca" + + "\xce\x1d\xf7\x9d\xaf\x0f\xd8\x61\xeb\x7d\x41\xd2\x2f\xde\xe5\xf9\x1c\x0d\x53\xee\xdd\x73\xed\x1c\x0d\x4d\x92\xba" + + "\x76\x8e\x85\xc3\xc3\x01\x3b\xbf\x4c\x1b\x4f\x90\x62\x8e\x06\x24\x4f\xd5\xa5\xf1\x1d\x7b\x9e\x2f\x66\xd8\x11\xf2" + + "\x82\x9c\xdd\xfd\x8a\x46\x24\xb3\x4b\x5d\x78\xe3\x91\x73\x34\x1e\x59\xe7\xc7\xe3\x6b\xbc\x27\xee\x58\xc3\x1c\x0d" + + "\x48\xb6\x69\xde\xb6\x55\xe3\x36\x75\x68\x34\x72\x9f\x77\x69\xe5\x5e\x49\xcd\xd1\x50\xe4\xbe\x73\x1e\x55\xc2\x11" + + "\x5e\xf6\x6e\xfd\x46\x11\x5e\x9d\x43\x35\x49\x08\xd6\xfa\xbf\x3a\xad\x9b\x03\xa1\xb9\xec\x9d\xca\x36\x4f\xf6\x19" + + "\x8e\x72\x1d\x02\xbb\xf1\xe0\x6c\x38\x1a\x42\xcd\x53\x1a\x17\x55\x51\xb8\x6d\x35\x1a\x39\x55\x68\x71\xd7\x5b\x6d" + + "\xf7\xc0\x43\x03\xa7\x34\xbb\xa4\xfc\x6a\xa0\x13\x0d\xdd\x6f\x67\xa9\x31\x02\xb6\x12\xe6\x68\xc8\x54\xa0\x8f\x6d" + + "\x63\xcc\xd1\xe0\xe9\x99\x96\x97\xf8\x44\xce\xfb\x4b\x73\xf4\xcc\x1d\x68\x10\xf5\x5c\x65\xa4\x18\x59\xa2\xcf\xd1" + + "\x58\x6a\xe5\xbc\x5f\x41\xe7\x68\x20\xf5\xd8\x10\xcf\xe0\x42\x83\xa8\xed\xa5\x64\xe6\xc9\xed\x33\xcf\xf1\x83\x9d" + + "\x32\xf7\x89\x1b\x0d\x3d\xde\xd9\xa3\xf1\xbb\x6f\x4e\x3c\xf4\x1c\x78\x8f\x07\x6e\x12\x3a\x91\x51\xcd\xd9\xff\x95" + + "\xa6\x9d\x38\xa5\xe7\x39\xe0\x33\x47\xa3\xaa\x1a\xb6\xc8\x56\xe1\x24\x80\x29\x8f\x46\x20\x40\x7d\xd1\x98\xab\x46" + + "\xc4\xb7\x59\x31\x47\xcf\x88\x6a\xe8\xa3\x63\x00\x0d\xe2\x6a\x24\xbc\xdb\x2d\x73\xfc\x00\x69\x93\x93\xf2\x58\xd0" + + "\x11\x5c\xfc\x0c\xa9\xc4\xf5\xb6\x1c\x0d\xed\x2a\xd4\x91\xae\x43\xa3\xba\x0a\xd9\xa7\x35\x68\x50\x37\xad\xca\xb6" + + "\xf2\x98\x63\x3c\x94\x7b\xa9\x69\x23\x2e\x28\x3b\x11\xd1\xd9\xf8\xb2\x1f\x43\x43\x4d\x53\x6f\xd6\xfc\x22\x45\xcf" + + "\x19\xf6\x68\x23\xbd\x88\x69\x10\xc3\xf3\x85\x6d\xe7\x68\xd8\x96\xa1\x79\x16\x20\x43\xc8\xf6\xf7\xac\xf0\x57\x4a" + + "\x6e\x21\xea\xc0\xae\xea\xff\xba\x35\xea\x09\xab\x44\x82\x97\xa4\xd6\x32\x4e\x74\xa4\x8e\x4f\xf9\xf1\x54\xb0\xe5" + + "\xba\xb8\x5c\xdc\x1c\xf7\xe4\x43\x32\x89\xc4\xff\x93\x57\x41\x55\x66\x2a\xed\x26\xe7\xfb\x7f\xa5\xc5\x33\xed\xed" + + "\x42\xf4\x6f\xf4\x42\xdf\x4f\x22\xf5\x61\x12\xfd\x4b\x93\x93\x62\x62\x24\xc9\x82\xec\x2c\x39\x3b\xfa\x55\xce\xe9" + + "\x72\xfe\xb0\xda\xcc\x96\x0b\x90\x3c\xe6\xbb\xc5\x62\xf1\x88\xe6\x6e\xfa\xee\x70\x38\x48\x0e\xf5\xa4\x35\x68\xaa" + + "\x1a\x8d\x79\x90\xa4\x06\x70\x05\xbe\x6a\x8c\xe9\x09\x6c\x88\xd0\x28\xc9\xde\x86\xec\x37\x8f\x32\x45\x0d\xcc\x63" + + "\x00\xf3\x4f\xed\x58\xfe\x16\x3d\xa9\x94\x24\x31\x5f\xac\xe6\x9b\x14\x25\x01\x52\x21\x40\x3a\x0c\x5d\xe5\xa4\xea" + + "\x4e\x79\x29\xb2\x4d\x3d\xc2\xef\xab\xfa\x85\x25\xc7\x88\x86\xeb\xb1\xe9\xa5\x8d\x1b\x76\x92\xa4\xaf\x1b\x40\xc7" + + "\xd5\xe1\xd0\xd2\x6e\x17\xc5\x73\x95\xef\x08\xc9\x88\xa4\x72\xb4\x88\x8c\x01\x66\x32\xa7\x73\x9e\x65\xc3\x2d\xda" + + "\x94\x34\xd5\xa5\xa5\x05\x4f\xdb\xf2\x34\xcd\x3b\x7a\x7e\x22\x4f\x2c\x35\x01\x5e\xc8\x8b\xf2\xf3\x31\x6e\x68\x5b" + + "\x57\x65\x9b\x3f\xd3\x09\xbb\xe0\x7e\xba\x9c\xf7\x25\xc9\x8b\x48\xe2\xab\x2f\x4f\x92\x19\x3d\x77\x19\x4f\x45\xa2" + + "\xe5\x33\x78\xc4\x53\xbf\xf0\xfa\x7a\xd5\x12\x29\x29\xc4\x88\x6a\x48\x96\x5f\xda\x5d\xb4\x56\x12\x61\x90\x03\x2b" + + "\xbf\xf8\xae\x3d\x8f\xd4\xad\xa5\xbe\x19\x1f\x0d\xb8\xfa\xe3\xd9\x55\xbe\xcb\xb2\xec\xd1\x6e\xc6\xd2\xb0\x00\x0d" + + "\x29\xe5\x9d\x6e\x52\x14\xd1\x74\xde\x46\x94\xb4\x34\xce\xcb\xb8\xba\xb0\x41\x10\x57\x21\x50\x23\x20\x50\x74\xfc" + + "\x14\x03\x26\xe3\x95\x4a\x33\x26\xb2\x6c\x71\x8d\x63\xf3\x68\x34\x17\xc6\x4b\x7c\x93\x19\xc0\xe4\x67\x95\x27\x06" + + "\x34\x5a\xde\x4c\x97\x22\xa1\x54\x69\x65\xdb\xc4\x55\x59\x70\x8b\x36\x5c\x6b\x27\xfb\xb6\x2a\x2e\x1d\xbb\xd6\x2e" + + "\xbb\x8d\x93\x57\x1d\x52\x1b\xf9\x8a\x60\xb2\x9b\x58\x94\x9a\xc9\xc5\x98\x25\x2b\xf2\x7a\x17\x35\x34\xed\xa0\x71" + + "\xc5\x32\xdc\x48\xde\xf8\x48\x25\xfd\x12\x50\x66\xa3\x43\x8a\x06\x53\x30\x34\xa3\xed\x48\x97\xa7\xa0\x11\x52\xd7" + + "\x4c\xdd\xd3\x32\x77\x59\x89\xb8\x06\xb6\xc1\x38\xf9\xb1\xa9\x0a\x95\x56\x8b\x5b\x30\x34\x23\xd6\xf4\x34\x9b\x44" + + "\xd3\xd3\xbc\xff\xcf\xa2\xff\xcf\xb2\xff\xcf\xaa\xff\xcf\x7a\x12\xf5\x85\x32\x8d\x48\x5f\xd2\x17\x9c\xd6\xe3\x26" + + "\x5a\x26\x01\x58\x61\x49\x00\xa6\x33\x67\xbe\xb1\xe9\x69\x16\x4d\xd9\xe1\xd4\x9e\x81\x59\xa4\x7e\xce\xc1\xe7\xf9" + + "\xf0\x79\x01\x3e\x2f\x86\xcf\x4b\xf9\xb9\xb7\x46\xa7\xe5\x50\xb0\x02\xf0\xab\xe1\xf3\x1a\x7c\x5e\xcb\xcf\x80\x15" + + "\xc5\x09\xcb\x93\x32\x7c\x56\x9c\x00\x46\x06\x3e\x06\x36\xa2\x81\x87\x81\x85\x9e\x96\xe2\x01\xb0\x20\x39\x18\xa4" + + "\x3c\x9a\x52\x41\x5a\x99\xcd\x66\x83\x77\xeb\xd0\x8f\xa1\xe3\x75\x36\xa4\xd2\xbb\x4b\xa7\x0c\x34\xfa\x76\x2b\x22" + + "\xa1\xd2\x34\x5d\xa4\xf5\xea\x77\x8a\x3b\x5d\x63\x75\x2d\x85\x2d\x9d\x05\xb4\x74\x09\x78\xbf\x55\x6f\xa0\xf6\x61" + + "\x1d\x1f\x05\x76\xbb\xca\xcd\x08\xfb\x54\x64\x95\x04\x00\x0b\x30\xe5\xb1\x3e\x9e\x5b\x10\xb0\x85\x0b\xa5\x05\x30" + + "\x0d\xe5\x12\xca\x80\xb5\xc1\xf4\x49\x1f\x00\xc4\x8a\xb5\xc1\x84\x80\x34\xd6\xba\x9d\x10\x10\x83\xbb\x52\xeb\x9e" + + "\x4a\x94\x68\xdd\x50\xc8\xdc\x49\x8e\x49\x04\xd2\x5c\x83\x4f\x72\xa0\x2c\x50\xb3\xb3\x14\xe4\x45\x8e\xae\x0f\xd1" + + "\x39\x2f\xf9\xac\x1f\xed\x36\xeb\x87\xfa\xe5\x23\xab\x73\xa8\x5d\x93\xd0\xac\x67\x4f\x25\xdb\x91\xbd\x86\xa7\xe1" + + "\x1c\xba\xec\x4c\x9a\x2f\x93\x48\xe5\xf6\x1c\xb2\xb1\xcd\x79\xfe\x35\xcc\x55\x48\x0f\x0f\x74\x21\x09\x30\x2f\xb3" + + "\x5f\xc5\x31\x7c\xf6\x97\x70\xdf\xfa\x8f\x1a\x14\xcf\xd5\x6b\x82\xb1\xaf\x1a\x1c\xbf\x3d\x69\x01\xf2\xcf\x1a\xa4" + + "\xb8\xf4\x68\x81\x8a\xef\x1a\x6c\x59\x7d\x6d\x08\xef\xd6\xaf\xa7\xbc\xa3\x2c\x55\x1b\x4b\x0f\xd3\x7f\xd7\x9b\x53" + + "\x7d\xa5\x4d\x4a\x5a\x3a\x10\x06\xd9\x22\x55\xa9\x86\x73\xa9\x6b\x0f\x8e\x2a\xd5\x1b\x4a\x6a\x76\x19\xf6\x67\x1c" + + "\x69\x28\xd6\xb0\xce\x17\x99\xed\x0c\x31\xab\x0c\xa2\x6e\x72\x95\x83\x57\x5f\x5a\x48\xcf\x5f\x83\xc3\x56\x11\x0f" + + "\xeb\x64\x9b\x68\x44\xdb\x4b\x9a\xd2\xb6\xd5\x89\xa6\x9b\xf5\x22\xd3\x89\x0a\x38\x8c\xe8\x7e\xb5\x9c\xa7\x1a\xd1" + + "\xbc\x3c\x54\x3a\xc5\xd9\x26\x79\x38\xe8\x14\x7b\x20\x8c\xdc\x72\x35\x5f\x6f\x35\x72\xe2\x0a\x83\x06\xf6\x40\xd6" + + "\xd9\x62\xaf\x53\x14\x70\x08\xd1\xf5\x7a\x35\x33\x78\xcc\x48\x79\x34\xa0\xc8\x76\xb9\x5c\xce\x75\x9a\x1c\x0c\x21" + + "\xf9\xb0\x5c\xac\x16\x72\x6c\x4f\xf7\x47\xb4\x7b\xa4\xff\x6d\x0f\x37\xa3\xe3\x06\x7c\x50\x15\x82\xa6\xf7\xe0\xfe" + + "\xa8\xf5\x1f\x02\x9f\x1d\x0e\x49\xf6\x00\xab\xb1\x3b\x12\x41\x4b\x67\x74\xbe\x5f\x80\x6a\x54\x8f\x62\x75\x6c\x69" + + "\x76\xd0\x9a\x62\x74\x2d\x82\x43\x0e\xd9\x76\x70\xb7\xf7\x47\xad\x8f\xc7\xac\x13\x01\x08\xfe\x6a\x0e\x1b\x9a\xee" + + "\x57\xa0\x1a\xd0\xeb\x18\xf8\x3c\xa3\x19\x85\xb5\x58\xdd\x8f\x60\xd1\xe5\x7e\xbb\x57\x1a\xcb\x92\xd8\xf1\xf3\x3d" + + "\xd0\xf6\xaa\xc9\x64\x0b\xbd\x81\x1d\xcb\x1d\x1c\x25\xc6\x3a\x45\xcb\x11\x6d\xad\x4e\xaa\x62\x12\x5d\x0a\xcb\xcf" + + "\x48\xfc\x4e\x46\x55\x44\x3d\x62\x55\x44\x17\x8e\x2f\xc8\xe8\x94\x24\xa2\x52\x31\x96\x4f\xe3\x52\xb2\xa4\x5b\x5a" + + "\x02\x4e\x1e\xe3\x8b\xc4\x8c\xd7\x82\xbc\x5c\x2a\x12\xc1\x91\xf9\xa2\xd7\x85\x2a\xea\xe5\x5f\xe2\x95\x5c\xe4\x8e" + + "\xd2\x7b\x2a\x72\xff\xda\x5a\xd6\xd5\x88\x25\x81\xb6\x32\x13\xf5\xad\x94\x74\xb2\x30\x79\xce\x07\x79\x66\xd9\x24" + + "\xca\x90\xfc\xb9\xc3\x9a\x5c\x02\x76\xb6\x4b\x0d\xf2\x79\x6b\x1e\x87\x10\x4c\xa0\xc7\x90\x15\x20\xf4\x2f\x99\x79" + + "\x77\x28\x2a\xd2\xf1\x79\x5a\x66\x5c\x64\x2b\xd5\xb5\x50\x31\x74\xfd\xf9\x2e\x2d\x28\x69\x00\x96\x35\x97\x0f\x5f" + + "\x07\x7c\x5a\x14\x79\xdd\xe6\x2d\xaf\x07\x9b\x7e\x79\xea\x41\x83\x51\xe1\xe6\x68\x6d\x9e\x3d\x24\x9a\xa7\xc3\x52" + + "\x73\x66\xa4\x23\x71\xd5\xe4\xc7\xbc\x24\x45\xcc\x13\x75\x4e\x22\x33\xaf\xba\x5c\x61\x9e\x68\x51\x3b\xc6\x10\x8f" + + "\x7c\x69\x53\x6a\x5e\xe6\x2c\xf1\x5b\x7b\x36\xfd\xa8\x2d\x8f\xc4\x8c\x4d\xf6\x43\xe6\x4e\xdd\xc7\xea\xc7\x9c\xb1" + + "\xbc\xe1\xae\x26\xe6\x46\x6e\xa6\x2b\x6d\xe0\x2b\xbd\xb4\x87\x3d\xa8\xaf\x2a\x76\x05\x69\xbb\x38\x3d\xe5\x45\x36" + + "\x89\x40\x49\xed\x2a\xb8\x40\x14\x91\xd0\xd7\x31\xe6\x01\x96\xf4\x37\xc1\x27\xf9\x7a\x00\xf8\x34\x78\xa3\x76\x78" + + "\x4d\x4f\x13\x1f\x18\xcf\x1d\xba\xc9\xe2\x45\x84\xc8\x11\x96\xb0\x12\x88\x22\x1a\xad\xc2\xfc\xdf\xff\x65\x9e\xcc" + + "\x96\xd1\x5f\x92\xe4\x5f\x92\xef\xd5\x14\xa1\x70\xe3\x86\x3e\xd3\xa6\xd5\xe8\x4d\xeb\x4b\x51\x00\x87\xd7\xb0\x31" + + "\x33\xd4\xc8\x24\x8f\x98\x6b\x0c\x83\x6f\xca\x42\x81\x4e\xb7\x74\x22\x71\xb3\x68\x8a\x06\x03\xd1\x65\xc4\xf2\x9f" + + "\xda\x40\x2e\x09\xc3\x76\xeb\x75\x69\x19\x6c\x21\x98\xb3\x4f\x20\x90\xb7\x7b\x3c\x7d\x22\x99\x10\xdb\x26\x9e\xf6" + + "\x72\x08\x6f\x73\x05\x11\x6f\x6b\x15\x19\x6f\x63\xbd\x94\x00\xa1\xc8\xd0\xc3\x5e\x03\x23\xa6\x8d\xb2\xcd\x24\xcb" + + "\x1a\xe9\xd5\x79\x17\xa3\x66\x2e\x4c\xff\x54\x14\xf6\x16\xc0\x9f\x68\x59\x54\x93\xe8\x4f\x55\x49\xd2\x6a\x12\xfd" + + "\x81\xed\x3a\x92\x76\x12\xbd\xff\x43\x75\x69\x72\xda\x44\xff\x46\xbf\xbe\x07\x0f\x05\x00\xea\xba\x29\x9c\xd7\x2f" + + "\x32\xa4\x6c\xdb\x57\xe5\x6b\x6e\xe6\xab\x25\x75\xad\x4a\xb7\x87\xf9\x61\x89\x47\xaa\x45\xb5\x5f\xf6\xd9\x0d\xb5" + + "\xfa\x3c\xf3\x05\x52\xdf\x42\x8f\x8c\xc3\x24\xd6\x79\xd9\xd2\x2e\x4a\x58\x7c\x37\x4a\x8c\x1d\xb2\xe9\x7c\xf5\x51" + + "\xed\xc6\x85\x22\x80\x96\x59\xad\x33\x9f\xf2\x90\x1b\x07\xa6\x7f\xe1\xe2\x56\xbe\x94\x62\x7e\x93\x11\x12\xb1\x9b" + + "\x63\x5b\x72\xc5\xc1\x56\xce\x59\x66\x1c\xc5\xe4\x6c\x71\xed\x06\xde\xd7\xaa\xc9\x78\x02\xe8\x5d\x24\xf2\x40\x17" + + "\x85\x2a\xe8\x3d\x0a\xf9\xbd\xff\xe0\x52\x99\x55\xff\xcf\xb1\xed\x91\xa6\xa9\x57\x99\xfa\xe6\xdb\x7a\x6c\xca\xdc" + + "\xf9\x7e\xc5\xa3\x19\x86\xa8\x1b\xca\xf8\xc6\x79\x05\x4f\xcb\x20\x5c\x29\x8b\xdf\x13\x69\xd3\xa6\x2a\x0a\x95\x3b" + + "\xfa\x4c\x5e\x94\x48\x17\xcb\x44\xdf\x58\x88\x5f\x77\x11\x87\x57\xbb\x6c\xbd\xe7\x95\x1b\xef\x42\xf8\xa7\xad\x99" + + "\xd6\xc9\x12\x56\xdf\x1a\x10\xa0\x20\xfe\x3f\xe6\xb2\xea\x8c\x48\xdf\x74\xb3\xd2\x9d\x3f\x8c\xca\x76\x3b\x1f\xa1" + + "\xb2\xdd\x8c\x53\x99\xcd\x93\x64\x84\xcc\x6c\x66\xd0\x19\xe0\xe2\x43\x71\xc9\xb3\x5f\x5b\x86\xd3\xa6\xfa\x0a\x2d" + + "\xbf\x40\x8b\x0d\x6a\x62\xc9\x34\x1b\x16\x31\xd3\xb4\x2a\xe2\xe2\x18\xcf\x26\x91\xfa\x99\x80\xdf\xf0\xfb\x7c\xf8" + + "\x0d\x7e\x2e\x26\x5c\x2e\xec\x8f\xe5\xf0\x7d\x35\xfc\x5c\x0f\x3f\x37\xc3\xcf\x87\xe1\xe7\x56\xd1\x38\x67\x8a\x95" + + "\xfe\x67\x02\x7e\xc3\xef\xf3\xe1\x37\xf8\xb9\x80\x64\x96\xc3\xf7\xd5\xf0\x73\x3d\xfc\xdc\x0c\x3f\x1f\x86\x9f\x03" + + "\x2b\xed\x59\xb1\xd2\xff\x4c\xc0\x6f\xf8\x7d\x3e\xfc\x06\x3f\x17\x90\xcc\x72\xf8\xbe\x1a\x7e\xae\x87\x9f\x9b\xe1" + + "\xe7\xc3\xf0\x73\x60\xe5\xa5\x55\xac\xf4\x3f\x13\xf0\x1b\x7e\x9f\x0f\xbf\xc1\xcf\x05\x24\xb3\x1c\xbe\xaf\x86\x9f" + + "\xeb\xe1\xe7\x66\xf8\xf9\x30\xfc\xdc\x1a\xfb\x81\x30\x5b\x77\x3f\x54\xf0\xcd\xcc\x71\x4d\x87\x5a\xf8\x0f\xd2\x48" + + "\xb0\x16\x36\xb9\xe3\xdb\x15\x60\xf7\xdd\x04\x98\x41\x80\xed\x6c\xba\xe6\xff\xb7\xb1\x00\x13\x08\xf8\xb0\x98\x2e" + + "\xc4\xff\x99\x80\x5b\x08\x07\xf6\x57\x24\xf3\xb0\x78\xbd\x76\xd6\xb7\x81\x70\xab\x07\x67\x75\x6b\x0d\xce\x6a\xdf" + + "\x0a\x16\x2f\xdd\xcd\x5b\x42\xb8\x85\xbb\x75\x0b\x08\x37\xb7\x5a\xa7\x8b\xdb\xdd\x3a\x4d\xea\xee\xc6\x31\xc7\x5a" + + "\xf4\xa1\x54\x4c\xbb\x0f\x39\xd4\x0c\x42\x79\x3a\x92\x43\x27\x10\xda\xd3\x9b\x0c\x7a\x0b\x81\xed\x2e\x65\x30\x0f" + + "\x10\xc6\xd3\xaf\x0c\x78\x03\x81\x3d\x9d\xcb\x80\xd7\x1a\x30\xde\xfa\x15\x84\xf1\x74\x33\x03\x5e\x42\x60\x4f\x5f" + + "\x33\xe0\x05\x04\xb6\x3b\x9c\xc1\xe8\x1d\x34\xd2\x76\xad\x9f\x46\x9a\xae\xf5\x12\x9c\x3b\x15\x50\x7b\x92\xfa\x21" + + "\x2c\x14\xa6\x1e\x3d\xd0\x0c\x00\x79\xb5\xa3\x07\x4e\x00\xb0\x57\x39\xda\x93\x50\x0e\x0e\x8b\xe9\x46\x7b\x12\xba" + + "\xc1\x41\xbc\xaa\xd1\x9e\x84\x6a\x88\x00\x91\x4f\x3c\xed\x49\x68\x86\x80\xc5\xdb\xbd\x02\x20\x5e\xbd\x68\x4f\x42" + + "\x2f\x38\xac\x57\x2d\xda\x93\x50\x0b\x0e\x8b\x69\x45\x7b\x8a\xb5\x6e\x19\x69\x35\xec\x9d\x91\x46\xc3\xbe\x41\x54" + + "\x82\x9f\x5e\x93\x4a\xa1\x07\x1f\x6d\xdd\x90\xd0\x33\x1b\xda\xa3\x24\x12\x2b\xb1\xb1\x3c\xda\x22\xb0\xb6\x36\x92" + + "\xad\x36\x02\xf6\xc1\x86\xf5\xe8\x8f\x40\xda\xd8\x48\x1e\x45\x12\x48\x6b\x04\xc9\x25\xad\x95\x0d\xeb\x51\x2d\x81" + + "\xb4\xb4\x91\x3c\x3a\x26\x90\x16\x36\x92\xad\x6c\x02\x16\xeb\xf0\x51\x59\x21\xfd\x3e\x2a\x2a\xa4\xd7\x43\x43\xf9" + + "\xf7\xf1\x51\xdf\xec\xa4\x5a\x3b\x08\x32\x82\xaf\x2a\xd7\x97\x4a\x6c\xdc\xe8\x10\x33\x7d\x4d\xa6\x75\xbf\x0e\x99" + + "\x68\x90\xfa\xf8\xd0\x20\xb7\xc6\x62\xd1\x2c\x7f\xd0\xca\xf5\x71\xa0\x01\x6e\x34\x40\x5d\xf7\x35\xc0\xb5\x0e\x68" + + "\xb5\x72\xa5\x95\x2f\xdd\x8d\x5c\x6a\x80\x0b\x77\x1b\x17\x1a\xe0\xdc\x6a\xa3\x21\x78\x77\x1b\x75\xf9\xbb\x9b\x08" + + "\x3d\x28\xdd\x85\x42\xc0\x66\x1a\x98\xa7\x53\xa1\x0f\x85\x3b\x51\x36\xf8\x56\x83\xb6\xbb\x17\x78\x51\xb8\x1b\x65" + + "\x43\x6f\x34\x68\x4f\x47\x03\x3f\x4a\x73\xa4\x6c\xa0\x95\x06\xe4\xe9\x72\xe0\x49\xe1\xae\x94\x0d\xbd\xd0\xa0\xed" + + "\xce\x07\xbe\x14\xee\x4c\x21\x7d\xa0\x77\x81\xbf\x7e\xbd\xbf\xf8\xdc\x69\x40\x0d\xee\x94\xe6\x4f\x21\x50\x33\x08" + + "\xe5\x55\x95\xc1\xa1\x42\x3d\x2a\x1b\x7a\x0b\x81\x31\x45\x51\x2e\x15\xea\x53\xd9\xc0\x1b\x08\xec\x55\x13\xe5\x54" + + "\x41\xaf\xca\x86\x59\x41\x18\xaf\x92\x28\xb7\x0a\xf5\xab\x6c\xe0\x05\x04\xc6\x54\x44\x39\x56\xa8\x67\x85\x88\x5e" + + "\x93\xbc\xbf\x72\xad\x97\x10\xfd\xd0\x7d\x2b\xcc\xb9\x42\xc1\x67\x08\xb8\x47\x63\x74\xef\xca\xe7\x5e\x61\x68\x5b" + + "\x04\xcb\xd6\x21\xcd\xbf\xf2\x39\x58\x18\xd6\x06\xc1\xf2\x68\x95\xe6\x61\x21\x2e\x16\x06\xbc\x42\x80\x3d\x7a\xa6" + + "\xf9\x58\x3e\x27\x0b\xc3\x5a\x20\x58\xb6\xe6\x69\x5e\x96\xcf\xcd\x42\xfb\x12\xeb\xca\x31\xbe\xb0\xfe\x4f\xae\x0a" + + "\x1f\xdf\x23\x36\xf9\xe6\xe0\xa4\xd7\xd9\x62\x95\x7b\x9d\x2d\xc6\x6a\x90\xb3\xc5\x1a\x18\xe4\x6c\x0d\x6c\xe1\xce" + + "\x56\xdf\x82\x20\x67\xab\x6f\x75\x90\xb3\xd5\x4b\xca\xe7\x6c\xf5\x42\x0d\x72\xb6\xfa\x8e\x08\x72\xb6\xfa\xfe\xf3" + + "\x39\x5b\x7d\x57\x07\x39\x5b\xbd\x58\x43\x9c\xad\x73\x16\xe4\x6c\x29\xb0\x30\x67\x4b\x81\x87\x39\x5b\x12\xdc\xeb" + + "\x6c\x49\xa0\x30\x67\x4b\x42\x87\x39\x5b\x12\xda\xeb\x6c\x49\xa0\x30\x67\x4b\x42\x87\x39\x5b\x12\xda\xeb\x6c\x49" + + "\xa0\x30\x67\x4b\xf5\x41\x88\xb3\x25\x81\xfd\xce\x16\x83\x1a\x75\xb6\x14\x54\x90\xb3\xa5\xa0\x83\x9c\x2d\x09\xed" + + "\x73\xb6\x24\x4c\x90\xb3\x25\x81\x83\x9c\x2d\x09\xec\x73\xb6\x24\x4c\x90\xb3\x25\x81\x83\x9c\x2d\x09\xec\x73\xb6" + + "\x24\x4c\x90\xb3\xa5\x44\x1f\xe0\x6c\x49\x58\xaf\xb3\x75\xce\xae\x72\xb6\x00\xf8\x35\xce\x16\x40\xbb\xc6\xd9\x1a" + + "\xd0\x02\x9c\xad\x01\xf8\x1a\x67\x6b\xc0\xba\xc6\xd9\x1a\xb0\x02\x9c\xad\x01\xf8\x1a\x67\x6b\xc0\xba\xc6\xd9\x1a" + + "\xb0\x02\x9c\xad\x01\xf8\x1a\x67\x0b\xf4\x65\xb8\xb3\x35\x20\xdd\xe2\x6c\x19\xbb\xec\xf7\xd8\x94\x7e\xf3\xae\xb4" + + "\xd7\xdb\x62\x95\x7b\xbd\x2d\xc6\x6a\x90\xb7\xc5\x1a\x18\xe4\x6d\x0d\x6c\xe1\xde\x56\xdf\x82\x20\x6f\xab\x6f\x75" + + "\x90\xb7\xd5\x4b\xca\xe7\x6d\xf5\x42\x0d\xf2\xb6\xfa\x8e\x08\xf2\xb6\xfa\xfe\xf3\x79\x5b\x7d\x57\x07\x79\x5b\xbd" + + "\x58\x43\xbc\xad\xe2\x18\xe4\x6d\x29\xb0\x30\x6f\x4b\x81\x87\x79\x5b\x12\xdc\xeb\x6d\x49\xa0\x30\x6f\x4b\x42\x87" + + "\x79\x5b\x12\xda\xeb\x6d\x49\xa0\x30\x6f\x4b\x42\x87\x79\x5b\x12\xda\xeb\x6d\x49\xa0\x30\x6f\x4b\xf5\x41\x88\xb7" + + "\x25\x81\xfd\xde\x16\x83\x1a\xf5\xb6\x14\x54\x90\xb7\xa5\xa0\x83\xbc\x2d\x09\xed\xf3\xb6\x24\x4c\x90\xb7\x25\x81" + + "\x83\xbc\x2d\x09\xec\xf3\xb6\x24\x4c\x90\xb7\x25\x81\x83\xbc\x2d\x09\xec\xf3\xb6\x24\x4c\x90\xb7\xa5\x44\x1f\xe0" + + "\x6d\x49\x58\xaf\xb7\x55\x1c\xaf\xf2\xb6\x00\xf8\x35\xde\x16\x40\xbb\xc6\xdb\x1a\xd0\x02\xbc\xad\x01\xf8\x1a\x6f" + + "\x6b\xc0\xba\xc6\xdb\x1a\xb0\x02\xbc\xad\x01\xf8\x1a\x6f\x6b\xc0\xba\xc6\xdb\x1a\xb0\x02\xbc\xad\x01\xf8\x1a\x6f" + + "\x0b\xf4\x65\xb8\xb7\x35\x20\x8d\x79\x5b\x9d\x3a\x01\xea\x3d\x4d\x2a\x4f\x64\x13\x96\xa0\x8e\xc1\xcb\xf3\x5a\xec" + + "\x6e\xd3\x83\x7e\x86\x4b\x9e\x2d\x17\x9f\xc1\x35\x0c\xf3\xee\x02\x38\x49\xd5\x9d\x18\x5d\xe7\xdd\x60\xc5\xa9\x91" + + "\xe1\x04\x49\x7a\xe2\xbe\x65\xc5\xc9\x3c\x75\xfb\x2a\x7b\x7d\xea\x9a\xa7\x2e\x9b\x44\xd6\xb7\xd3\xf0\xed\x50\x55" + + "\x9d\x09\xa7\xbe\x9d\x78\x9a\x18\xfe\xf5\x44\x49\x66\x42\xaa\x6f\x27\x28\x32\x25\x17\xcf\x41\x66\x33\xc9\x4d\x57" + + "\xd5\x9e\x4c\x23\x59\x96\x19\xed\x33\x6a\x36\xc9\x71\xc9\x20\x97\x9b\xe6\x1e\xa2\xa2\xf7\x3f\x49\xe2\xbb\x43\xde" + + "\xc8\x1b\x40\xb0\xd9\x7e\x38\x28\xb4\xb4\x2a\x7a\x95\xab\xc7\x49\xfa\x01\xad\x8e\xd0\x8b\x9d\x64\xc7\x61\x4f\xe2" + + "\x1a\x09\x14\x7c\x82\xe8\xd2\xa7\x4e\x65\xac\x82\xa0\x1e\x71\x46\x53\xdf\xd8\x03\x89\xa6\x38\x5c\x9c\x56\x65\x46" + + "\xcb\x96\x66\x98\xf2\xa2\xa5\x40\x2a\xb0\xdc\x56\x69\xb4\xd4\x81\x6d\xab\x39\x5a\x6a\x28\xfc\xca\x18\x80\x31\x17" + + "\x92\x96\xfb\xc8\xab\xd1\x0a\x01\x6d\x3d\x52\x08\xd9\x1f\x8a\x91\xb6\x23\x85\x38\x2e\xd2\x72\xa4\xf0\x74\x43\x8b" + + "\xae\xa7\x2c\xc6\xab\xb4\x7b\x73\x53\xbc\x6d\xd7\xe4\x35\x90\xc7\xae\xec\x4e\x71\x75\x88\xbb\xd7\x9a\x7e\xa8\xb2" + + "\xec\xa3\x53\xed\xb6\xfd\x3f\x9d\x18\xbb\xac\x3c\x90\xf2\x5f\x90\x66\x97\x25\xb4\xc9\x25\xad\x8a\x1f\xd3\x82\xb4" + + "\xed\xef\x7f\xe8\xe7\x26\x7e\xc7\x12\xcb\x1e\xa4\xae\x88\x48\xb5\x2a\x2e\x67\x76\x99\x54\x2c\xb2\xc1\xad\x12\x4e" + + "\xb9\xcb\x34\xc2\x93\x48\x7c\x3e\xdd\x56\x1f\xe5\x77\x43\xec\xda\x8c\x09\x62\xca\xf3\x23\x61\x73\x87\x2a\x3a\x21" + + "\xd3\x4a\x26\x4a\xa1\xb1\x1a\xf4\x75\xaa\xb2\x2e\xe9\xd3\x0c\x56\x9b\x59\xa4\xd9\xbf\x41\xc7\x5d\x24\xb1\xda\x84" + + "\x9a\x81\xda\xec\xb9\x0d\x6b\xdd\xa0\xbb\x2e\x92\x43\x6d\xd2\x96\x8e\xa8\x0d\xaa\x76\x82\xc4\x4e\x7c\x1d\x46\x8a" + + "\x17\x0c\x8e\x64\x4c\x8d\x9f\x0c\xa6\x0d\xa0\xa1\x55\x1c\xdc\x49\x6d\x68\xe3\xc8\xd5\xfe\x87\xfe\x9f\x43\xad\x44" + + "\x26\x05\x54\xaf\x54\x19\xae\x58\xa2\xd8\xa1\x59\xb2\xd4\xd2\x1f\xac\x46\xab\xcc\xa5\x5c\x2e\xaa\x68\x8d\x52\x83" + + "\x40\x8d\x88\x7e\x61\xad\x04\x0a\xe6\xa2\x0a\x6a\x74\xab\x98\x96\xb9\x02\xd7\x1d\x2d\x95\x85\x47\xc7\x0c\xb8\x71" + + "\x25\x33\x18\x47\xb4\x4c\x23\xe9\x55\xb3\xa0\x7c\x1b\x59\x42\xb7\xe9\xda\xa1\x67\x79\x79\xa8\x50\x25\xe3\x05\xb8" + + "\x86\xf5\x65\x0e\xf5\x62\x45\x96\xfe\x58\xb5\xe8\x05\x2e\xad\x42\x89\xd9\xb5\x48\x8d\x91\xb5\x20\xca\x64\xb5\x06" + + "\x68\x12\x4a\x4c\xd6\xe2\xd1\x21\x98\x99\x04\xd7\x8d\x21\x55\x89\x47\x81\x20\xd0\xb8\xf6\x40\x66\x11\xd5\x19\x88" + + "\x79\xf5\x66\x3c\x87\x4a\xba\xa4\x8b\xc3\xc2\xa1\x34\x22\x3d\x0a\xaa\x37\xaa\x0c\x57\x1d\x51\xec\xd0\x1e\x59\x6a" + + "\xe9\x09\x56\xa3\x55\xe6\x52\x23\x17\x55\xb4\x46\xa9\x31\xa0\x46\x44\x9f\xb0\x56\x02\x95\x72\x51\x05\x35\x7a\xe6" + + "\x3f\x3d\x59\x16\xa6\x33\x5a\x7e\x1a\x8f\x6e\x19\x70\xe3\xea\x65\x30\x8e\x68\x98\x46\xd2\xab\x64\x61\x49\x74\xc8" + + "\x61\x9e\xa6\x0e\x3d\xe3\x09\x72\x50\x35\x93\x45\xb8\x96\xf1\x52\x87\x92\x89\x42\x4b\x8f\x90\xda\xcc\x22\x97\x86" + + "\x39\x48\x62\xb5\x49\x0d\x1a\x6a\x43\xd4\x0b\x69\x1d\xd0\x2e\x07\xc9\xa1\x36\x8f\x6e\xc1\x24\x44\xb8\xce\xc0\xac" + + "\x44\x1e\xd5\xd2\xc1\xc6\x35\x4b\x67\x1a\x51\x2c\x48\xd0\xab\x57\x41\x69\x93\xf6\x69\x6a\xa8\x15\xc8\xe8\xcb\xb0" + + "\xe0\x6d\xc4\x69\x32\xfb\x9d\x76\xc9\xf9\x05\xbb\x78\xcc\xdf\x6e\x8d\x48\x99\x45\x1f\x86\x40\xd3\x66\xbd\x51\xdb" + + "\x91\x68\x45\x66\x8c\xca\xca\xa3\xb4\x32\x72\xe7\xc4\xaf\x5a\xf6\x9c\xf8\xdc\xaa\xb4\x38\x32\x29\x43\xff\xad\x67" + + "\xf0\x94\xb3\x18\x1b\xbf\x90\xbd\x27\x2c\xa3\xb2\x73\xc1\xc9\x63\x82\x26\x8f\x4f\x20\xf6\x80\x64\x6d\xf1\x22\xa1" + + "\x0b\x70\x1f\xd4\x89\x6f\xb7\x3a\x01\x91\x35\xb9\x0f\x6a\x8c\x1c\xb2\x98\xf6\x41\x9d\x7a\x6a\xbc\xcb\xdc\xf9\x86" + + "\x1c\x64\xf4\x28\x06\xcc\xac\x1b\x86\x06\x45\x09\xc3\x4e\xde\x16\xa2\xc1\x8e\x5b\xb0\x07\xb9\xbf\x09\xfb\xa6\xba" + + "\x87\x4e\x7a\x13\xb6\x56\x37\xec\x04\x3d\xd2\x7d\x65\x4f\x80\x8c\x47\xd7\x77\xc4\xf5\xc8\xa0\x1f\xde\x80\x7c\x4b" + + "\xcd\xa0\x17\xde\x80\x0c\x6b\xd6\xfa\x40\xec\x91\x5e\xdf\x09\x80\xa0\x98\x2c\x6f\x45\xf6\x1b\x0b\x5b\x8e\xb7\xd5" + + "\x8c\x21\x9f\x34\x51\x18\xc6\x95\xcd\x30\x87\x9c\x16\x59\x4b\x3b\x35\x33\x89\x39\x23\x71\x67\xfc\x4e\xb0\x04\xde" + + "\x05\x3d\xd2\x92\x4b\xde\x4e\xb2\x62\xcc\x43\x18\x59\x5f\x5a\xda\xf9\x0c\xd9\xa9\xb0\xb3\x95\xe8\x39\x6e\xf4\xac" + + "\xe8\x58\xea\xc1\x55\xff\x4f\xb2\x4f\xf6\xf4\xfa\xb4\xf6\x06\xeb\x2b\x24\x7b\xee\x90\x13\x8f\x3d\xd1\xf0\x63\xf7" + + "\x5a\xd3\x1f\x5a\x4a\x9a\xf4\xc4\x63\x82\xbf\xee\x8b\x18\xa0\x52\xf6\xee\xf4\xbe\x7a\xf9\x49\xbc\x16\xc1\xbf\x36" + + "\x24\xcb\x2b\xce\x89\x4a\xde\xc8\xf2\xf7\xc0\xbe\x51\x3b\x3d\x7f\xd9\x5a\xfd\xc0\xb3\x34\xd9\xd5\x1d\x72\x99\xc9" + + "\x4e\xd7\x07\x1b\xb2\xe9\xdd\x2a\x0c\xf4\x11\x4d\x65\xc0\xdf\xb8\xf8\xf1\x7c\x29\xba\xbc\x66\xa9\xf3\xc4\x97\x5e" + + "\x59\x38\x19\xe4\xa9\x03\x93\x33\xf9\x2c\x05\x26\x20\xa4\x8c\x8b\x89\x17\x08\x27\xf7\x57\x7f\x85\xa2\xba\x74\xf5" + + "\xa5\x73\xc8\x45\xdb\xf8\xdc\xd8\x59\x8a\xc2\x9f\x19\x59\xad\x54\xc8\xf3\x50\x35\xe7\x38\xad\xca\xae\xa9\x5c\x99" + + "\xef\x1c\x0f\x3b\x2c\x96\xc6\x1b\x01\xeb\xfa\x85\xa5\xa8\x7e\x13\x5f\xae\x5c\x48\x56\x96\xab\xfc\x4c\x8e\x14\x66" + + "\x81\x0a\x4f\x91\x34\x96\xff\xaa\xa7\xd1\xff\x7f\x23\x9f\x55\xb2\x71\x67\xc0\x1a\x41\xc1\xde\xa1\x10\x7c\xb1\x16" + + "\xc2\x37\x24\xa2\xe9\x6c\xd5\x4e\x22\x9b\xc1\xde\xac\x9b\x70\x8f\xf6\xcb\x15\x23\x74\x07\x7a\xfa\xc3\x15\xef\xde" + + "\x49\x7a\x6f\x26\xc6\x0a\x31\x05\x03\xaf\x38\x40\xc2\x2c\xaf\x31\x39\xd0\xad\x36\x96\x9c\x89\xbf\x02\x64\x3e\x61" + + "\xa9\xbc\x58\xca\xf5\x77\xef\x58\xf9\x2c\x99\x4f\xa2\xd9\x66\x35\x89\xe6\x8b\xc5\x24\x9a\xae\x6f\xe9\xca\x10\xb2" + + "\x68\xbb\x77\xcc\xa0\xd7\x05\x49\xe9\xa9\x2a\x32\x23\x03\xf3\x76\xcb\x5b\x5e\x93\x34\xef\x5e\x77\xd1\x0c\xa5\xd1" + + "\x2f\xc3\x98\x79\xf2\xd1\x71\xd4\x2e\xa4\x78\x13\xfa\x8f\x59\xce\x9e\xe0\xc8\x7e\x9a\x44\x7a\x41\x43\x49\x56\x95" + + "\xc5\xeb\x4f\x93\x48\xfa\x14\x03\xb0\x0e\xeb\x8e\x12\x88\x14\x91\xfe\xc6\x43\x1e\xc6\xaa\xe2\x6d\x12\xa9\x54\xcb" + + "\xaa\x8b\x49\x51\x54\x5f\xa9\xdc\x04\x95\xef\x24\xd9\x38\xfe\x29\x04\x9b\xc0\x49\x5d\x53\xd2\x90\x32\xd5\xd3\xfb" + + "\x22\x4b\x78\x89\xd1\xbb\x5b\x19\x7d\xce\x53\x1a\xd7\xf9\x0b\x2d\x62\xf6\xf8\xd1\x2e\xe1\x6b\x7a\x50\x5d\x46\x3a" + + "\xaa\x4f\xdb\x5d\x7e\x36\xbe\xf4\x30\xfd\xd7\xb8\xa8\x52\x52\xe8\x65\xe7\xaa\xec\x4e\x3f\xa9\x35\xa6\x66\x7c\x17" + + "\x4b\x99\x16\xec\xdd\x94\xab\x04\x3b\xe3\x10\xb7\x67\x93\x7a\xdf\xe5\x6e\x08\xce\x11\x33\x1d\x7e\x32\x1a\x93\x1e" + + "\x58\xce\x34\xa3\x68\x32\x22\xb0\xda\xb3\x2d\x13\xbc\xc8\xa8\x77\x00\x32\xa8\xf3\x3a\x55\x71\x84\x88\x2b\xc1\xc5" + + "\x55\x1c\xc7\xc4\xa5\x43\x38\xc4\x65\x93\x71\x8b\x4b\x87\x1d\x17\x57\x71\x74\x8a\xcb\x28\xc2\xc5\x55\x1c\xbd\xe2" + + "\x2a\x8e\x88\xb8\x96\x6b\x3d\xe9\x1c\x1b\x67\x8c\x7d\xe0\x72\x6a\x01\x29\x95\x84\x42\x78\x63\x93\x68\xca\x9c\x2f" + + "\x63\x03\x1d\xa6\xf7\xc2\x9e\xbf\xba\xea\xa5\x12\x59\x57\xc4\x96\x01\xaa\xc6\x61\x51\x00\x43\x76\x72\x81\xa2\xa7" + + "\x0a\x73\xbc\xfc\x92\x58\x0b\x02\xf1\xee\x8c\xe3\x01\x21\xc5\x09\xee\xb8\xab\x72\x99\x7f\x1c\x05\xeb\x75\x93\xb7" + + "\xc0\xf2\x60\x65\xdb\x10\x7c\xb0\x12\xc0\x1f\x87\x82\x42\x5d\xaa\xc5\x80\x9e\xb7\x6f\x8e\x48\xf5\x93\xd5\x97\x9f" + + "\x40\x97\x42\xaa\x31\xd2\xff\x82\x53\x93\xf1\x00\x6d\x70\xe5\x4e\xbf\xad\xc3\xf0\x07\xdf\x02\xba\x52\x70\xfc\x69" + + "\xa4\x45\x9f\xec\xf6\xb9\xf2\xb6\xcb\x63\xba\xe0\xbd\x3a\x6b\x16\xc4\xf5\xc7\x0f\x28\x54\x44\x9f\x7b\x14\xf6\x54" + + "\xe2\xe0\x8b\x26\x38\x2b\x5b\x34\x07\x5c\x9d\x38\x2f\x05\xdc\xf8\xa7\x6b\x53\x84\x80\x25\x4d\x7a\xe0\x3b\xe6\x20" + + "\x98\x1d\xd1\xf7\x38\x02\x66\xf5\x47\x00\x63\xaa\x66\xdd\x94\x58\x9f\x7d\x6c\x09\x18\x1f\x57\xc0\x34\x79\x98\x82" + + "\x4e\x4d\xcc\x4f\x1c\x59\xd6\xcc\x58\xb8\x69\xeb\x49\xf3\x20\xed\x06\x1f\x31\x9e\xea\xc0\xf4\xe2\x29\x16\x13\xad" + + "\x91\x92\x31\x41\x92\x8e\xcb\xaa\x34\x3c\x38\x35\x3f\x1a\xe7\xfd\xd0\x0c\xbe\x73\x74\x0d\xba\xc2\xf3\x23\x6b\x51" + + "\x07\x7f\xc5\x88\xa3\x80\x46\x2c\x80\x8f\xa2\x1c\x50\x94\x30\xcc\xf7\x35\xcc\x9c\x3d\x94\xdb\x61\xfd\x2d\xa4\x70" + + "\x2d\x2f\xc1\x82\xf1\x10\x06\xb2\xf2\x40\x89\xa5\xc5\x95\x02\x84\x83\xc3\xe4\x5d\x1b\x2c\xf3\xb7\xc9\x56\x57\x5f" + + "\xe1\x30\x41\x57\xe9\xd1\x7a\x72\x41\x7b\x92\x6b\x78\x3d\x0c\xa1\x2e\x8e\xe0\x23\xfd\xb7\xc6\xb5\xd8\x51\x3f\xe2" + + "\xbf\xf9\xb4\xb8\x1f\xdb\x86\x16\x1b\x84\x1d\x9d\x50\x1c\x3d\x9a\xf3\x1b\x0a\xe3\x5a\x96\x82\xe5\xe3\x21\x8c\x2b" + + "\xb3\x09\x15\xa6\xcc\x26\x16\xa6\xcc\x92\x77\x4d\x99\x1f\xee\x22\x62\xc9\xd1\x89\xb4\xf1\x81\xd2\xac\x5f\xd5\x3b" + + "\xbc\x33\x14\xd4\x16\xb8\x31\x0f\x2c\xe7\x53\xe0\x16\x6a\x2d\x75\xd4\x07\x9d\xd6\xc1\x79\x82\xd3\xca\xcf\x71\x5e" + + "\x66\xf4\x65\x17\xcd\xf1\xf5\x83\xbc\xfe\xb9\xd4\x1f\x42\x5d\x60\xd1\x4b\xf9\xd1\x7e\xfe\x8d\x49\x97\x3b\x85\x31" + + "\x7d\xa6\x65\xd7\xea\x07\x7a\xe5\x68\xf9\xe4\x69\x95\xbc\xb1\xba\xd6\x39\x19\x53\x46\x35\x9f\x04\xd0\x96\x96\x2e" + + "\xd4\x6a\xb3\xfe\x93\x2f\x74\x41\xdf\x1e\xfd\x3e\x78\xbb\x7a\xb1\x60\x48\xf9\x3a\x7a\xf1\x89\x16\x35\xf7\xdc\x4d" + + "\x44\xe6\xff\xa0\x1f\x81\x3b\x07\x4b\xed\xd5\x1d\x56\x28\xfd\x3c\x94\x1f\xe8\x74\x19\xf8\x9a\x93\x08\xbc\x32\xec" + + "\xd1\x39\x9d\x67\x4b\xef\x8d\x28\x28\x47\xfd\x6d\xc3\xd3\xa3\x8c\xba\x83\xb6\xfc\xc1\xbc\x37\x87\x69\xd7\xf5\x4b" + + "\xf4\xdd\x7a\xb3\x9f\xad\x1f\x6e\x8e\xc9\x02\x1a\x68\x83\x60\x10\x85\x64\x99\xb8\x4a\x66\xcb\xdd\x79\x7e\xf7\xd1" + + "\xd5\x5b\xa3\xf2\xd3\x07\xa0\x1b\x59\x3e\x1c\x67\x0e\x2f\xeb\xbb\x3e\xbc\x86\x62\x74\x78\xa9\x62\x6b\x78\xa9\x12" + + "\x38\xbc\xf4\x8f\xe6\xf0\x12\xa5\xf8\xf0\x32\x0b\xf1\xe1\x25\xa1\xec\xe1\xa5\x95\xb8\x87\x97\xf6\x5e\xa2\xce\xf3" + + "\xd8\xf0\xe2\xa8\x7f\xbf\xe1\x85\x32\xea\xdb\x13\x59\xcd\xee\x35\xbc\xd2\x84\xcc\xd6\xfb\xb7\x0d\x2f\x4e\x03\x6d" + + "\x90\x7f\x78\x0d\x72\x77\x9e\x40\x45\x86\x57\x60\x47\xe3\xc3\xcb\x46\xa6\x4d\x53\x35\xd6\xe0\x32\xbe\xea\x43\x4b" + + "\x16\xa2\x03\x4b\x14\x5a\xc3\x4a\x7c\x87\x83\x0a\x7e\x32\x87\x14\x2b\xc3\x07\x94\x5e\xa4\x0f\x27\x08\x01\x87\x92" + + "\x4e\x76\x64\x28\x69\xcf\x84\x42\x4e\xc7\x06\x12\x47\xfc\xfb\x0d\x24\x84\x4d\xf7\x30\xe2\xef\x9b\xde\x69\x18\xd1" + + "\x87\xe5\xc3\xe2\x8d\xc3\x88\xd1\x40\x9a\xe3\x1f\x44\x83\xcc\x9d\x47\x6d\x91\x41\x14\xd4\xc5\xf8\x10\xb2\x51\x15" + + "\x18\x57\xa5\xff\xed\x21\xc2\x2f\xa1\xae\x74\x07\x52\xc7\x97\x8f\xfc\x8f\xd3\x51\x31\xa0\x61\xb0\x39\x8e\x2a\xc0" + + "\xf0\xe9\xca\xb9\x07\x00\x8f\x1c\x6c\x16\xfd\xbf\xc0\xe4\xd6\x8c\x4f\x31\x9c\xcc\x7d\x0d\x77\x10\x1a\x8d\x37\x3b" + + "\x82\xcb\x72\x9f\xc9\xae\x09\x0e\x47\x4f\x5d\xc2\xc1\x97\x4f\xf3\xdc\x5a\x0d\x5c\x51\xe2\xb5\xa1\x24\x80\x0a\xe3" + + "\xa8\xec\x04\xdb\xb5\x8c\x41\xaa\xc6\x9a\xda\x03\x68\x0d\x27\xbe\xf5\x16\x86\xb0\xef\x4a\xed\x3c\x35\xcc\xa7\xe1" + + "\xa2\xf0\x84\x74\x14\x92\x84\x49\x43\xd7\xe6\x16\xfc\x58\xf4\xb5\xd2\x02\x33\x9c\xf6\x7d\xd8\x7f\x19\x57\xd5\x61" + + "\x09\x7d\x37\x76\xd4\xc4\x85\x30\x05\x5a\x6f\x45\x7f\x7d\x24\x1d\x3b\x66\x48\x0d\xd6\x06\x84\xda\x19\xc7\x77\x94" + + "\xd0\xc4\x15\x06\x1b\xee\x98\x86\x6e\xc3\x94\x11\x33\xf6\x44\xc1\x4b\xb2\x56\xa7\x61\x65\xd0\x75\xb0\x80\xa4\xbf" + + "\x81\x17\x60\x6f\x17\xc3\xb0\xff\xd8\x73\xc1\xc9\x4d\x8c\x83\x1d\x3f\xb8\x99\xba\x31\x42\x3b\x10\x05\xdf\x2c\x0e" + + "\x7e\x38\x2c\xc8\x80\x6b\xec\xdb\xe3\x0f\x93\x0f\x3e\x0a\xac\xb7\x50\xbd\x5d\x1c\xaa\x2e\xe0\x79\xaa\x5b\x5b\x65" + + "\x84\x0a\xc7\x1a\x39\x5b\x4e\x17\x8b\xd1\x17\xe7\x42\x6b\x6c\xcf\xe3\x35\x1a\x47\x04\xa4\xb5\x1d\xdb\xc7\xd5\xcf" + + "\x18\x3a\xb7\x71\xf5\x73\x87\xd8\xce\xae\xe7\x2c\x22\x1e\xd3\x43\xee\x68\xf8\x77\x88\xe3\x73\x1b\x77\xd5\x25\x3d" + + "\xc5\x24\xe5\xe6\xe5\x4c\xca\xbc\xbe\xf4\x26\xa6\x2a\x79\x98\xd2\x57\x6a\xec\x30\x43\xf7\xf5\xd2\xd2\x26\xe6\xa1" + + "\xe7\xe1\xfc\x23\x3b\x60\xe6\x28\x69\xf1\x02\xf4\xe3\x35\x27\x2c\xfd\xaf\x3e\x0e\x6f\x51\xf6\xfd\x2b\x6e\xa9\x4f" + + "\xc5\x39\x5b\xf0\x69\x07\x3f\x81\xdf\x3b\x0d\xa3\xd7\xba\xe1\x23\xc4\x01\x9e\xff\xaf\x7e\x3e\xd7\xe2\x11\xfe\x1e" + + "\x2e\x89\x19\xa7\xd3\x99\x4a\x65\x34\xad\xd8\x61\xaf\x52\x8f\x08\x0f\x82\xd0\x9a\x6d\x5e\x36\x33\x3a\x23\xfc\x94" + + "\xe4\xa2\x7e\x61\xcd\x36\x16\x25\x33\xcf\x73\xae\x1e\x14\xc8\x35\xd8\x89\xdf\x77\xe5\xd8\x11\x3d\x39\xc6\xb1\xe8" + + "\xf8\x23\xbe\xa9\xcd\x46\x6f\x5e\x74\xbd\xd6\x91\xa2\x3e\x91\x0f\xe2\x94\x60\xf4\x43\xb4\xd6\x0f\xd6\x86\x3c\x0c" + + "\xab\x1d\x33\x9c\xae\x57\xa0\x2d\x71\x46\x0f\xe4\x52\x74\x58\xef\x79\x4e\x23\xeb\x6b\x2d\x70\x09\x10\x90\xd4\x3a" + + "\x57\x7d\x04\x7a\x23\xbf\xed\x40\x92\x0e\xf8\x19\x03\xe5\x17\x17\xa3\x69\x55\xd3\xf2\x69\x9a\x35\x55\x9d\x55\x5f" + + "\xfb\xf9\xfb\x78\x2c\x28\x84\x54\x8f\x51\x8f\x35\x89\xae\xfb\x7f\xd8\x0a\x32\xeb\xff\x85\x36\x6c\xa7\x3e\x86\xb2" + + "\x86\xeb\x38\x56\x9f\xae\x6f\xd6\x67\x5c\xd0\xaa\x54\x33\x23\x56\xf1\xce\x8b\x8c\xf5\xc1\x50\x38\xdc\x22\x05\xc5" + + "\xda\xa9\x59\xf4\x3b\xca\x2f\x28\x46\x19\x1e\xca\x51\x8e\x41\xf1\x18\xba\x50\x21\xc7\x50\x95\x08\xa3\x00\x20\xb5" + + "\xcc\x18\xa4\x10\xe2\x08\xd8\x2e\x98\xe0\x2e\x90\x20\x6b\xa9\xe7\x9a\xf2\x15\x83\x39\x9a\xee\x49\x76\xa4\x9a\x99" + + "\xf0\x3e\xc0\x0d\x69\xd4\x4d\x7e\x26\xcd\x6b\x30\xf2\x86\xec\x37\x08\x67\x73\xba\xce\xc8\x12\x21\xac\x2b\x94\xfc" + + "\x08\x55\x57\x7c\x33\x2d\x8d\xfc\x8c\x81\x8e\x5b\x1a\x01\x69\x58\x1a\x77\xc3\xe6\x0f\xeb\x64\x9b\x60\x0d\x4b\x96" + + "\xd9\x26\xb8\x61\x21\x96\x46\x67\x6d\xdc\xd2\xc8\xfa\x0c\x4b\x63\x7e\xc6\x05\xed\xb0\x34\x66\xf1\xce\x8b\x8c\xf5" + + "\x81\xcb\xd2\x88\x62\xcb\xd2\x58\xdf\x51\x7e\x9d\x96\xc6\x2a\x47\x39\x76\x5a\x1a\xbb\x7c\xc4\xd2\x08\x84\x51\x80" + + "\x00\x4b\x63\xe8\xfc\x08\x58\x80\xa5\x31\x46\xc6\x18\xd8\x88\xa5\xb9\x7e\x48\x63\xf6\x06\x50\xf1\x66\xef\xeb\xc9" + + "\xc8\x0d\xc9\xb0\x91\xb9\x4a\xf7\x0f\xab\x14\xe1\x6f\x99\x12\xba\x4c\x11\xc2\xba\x66\xc9\x8f\x50\x87\x65\xd6\x20" + + "\xc3\xe4\xc8\xcf\x18\xe8\xb8\xc9\xd1\x73\x2e\x8d\x37\x6c\xb9\xdc\x66\xcb\x25\xb6\x85\xbb\x7d\x58\x2e\xb6\xa1\x0d" + + "\x0b\x31\x39\xce\x74\x50\x0e\x93\x23\xeb\x33\x4c\x8e\xf9\x19\x17\xb4\xc3\xe4\x98\xc5\x3b\x2f\x32\xd6\x07\x2e\x93" + + "\x23\x8a\x2d\x93\x63\x7d\x47\xf9\x75\x9a\x1c\xab\x1c\xe5\xd8\x69\x72\xec\xf2\x11\x93\xa3\xd2\x62\x8d\x00\x04\x98" + + "\x1c\x43\xe7\x47\xc0\x02\x4c\x8e\x31\x32\xc6\xc0\x46\x4c\xce\xf5\x43\x1a\x33\x39\x80\xca\xa8\xc9\xc9\xcb\x43\x15" + + "\x6a\x6f\xf6\x69\x82\xee\x5a\x2d\xd7\xfb\x87\x8c\x98\x54\x75\x9d\x62\x5f\xa0\xea\xb2\x3c\x53\x16\x88\xa1\x2a\x20" + + "\x67\x95\x6f\x14\x5f\xd1\x88\xc5\x6c\x9f\x64\x2b\xcc\xa8\xaf\xb7\x64\x9f\x8e\x37\x22\xc4\xaa\x28\x7e\xc6\x0d\x0a" + + "\xab\xc4\xb0\x26\xda\x37\x44\x8c\x0e\x3b\xa2\x95\xd9\xa2\xc5\x2d\x88\x5e\xa2\x9b\x8f\xbe\xcc\xb2\x1d\xfa\x47\x9b" + + "\x3b\xa7\xd5\xd0\x0b\x6d\xfe\x2c\x7b\x81\x16\x29\x0e\x5d\x23\x8d\x67\x41\xf3\x95\x06\x98\x09\xa8\xad\x3e\x98\x00" + + "\x03\x01\xb4\xda\x4f\x6a\xcc\x34\x5c\x37\xfa\x50\xbb\x30\x90\x18\xb5\x0b\xf2\xf0\x46\xd8\xa8\x3a\x24\x24\x5b\x62" + + "\xcc\x51\x4a\xe6\x8b\x35\x42\x58\x57\x1c\xf9\x11\x76\xbc\xcc\x11\x66\xb8\x22\xf2\x33\x06\x3a\x6e\x29\xf4\x0c\x6b" + + "\xe3\x0d\xa3\xe9\x76\x33\xc3\x16\x9c\xd9\xea\x61\x35\x9b\x87\x36\x2c\xc4\x68\x38\x93\xbf\x39\x2c\x87\xac\xcf\x30" + + "\x1e\xe6\x67\x5c\xd0\x0e\x13\x62\x16\xef\xbc\xc8\x58\x1f\xb8\x6c\x89\x28\xb6\xcc\x89\xf5\x1d\xe5\xd7\x69\x54\xac" + + "\x72\x94\x63\xa7\x2b\x62\x97\x8f\xb8\x22\x2a\x09\xde\x08\x40\x80\x8d\x31\x74\x7e\x04\x2c\xc0\xd2\x18\x23\x63\x0c" + + "\x6c\x2c\xce\x72\xf5\x90\x46\xa3\x2d\x03\x95\x51\x93\xc3\x93\xb7\x05\x5a\x9c\x6c\xbb\x5a\x2c\xd1\x81\xb9\x5c\x1c" + + "\x16\xc4\xa6\x6b\xc4\xef\xf8\x37\x2d\x50\xc8\x73\xc7\x21\x60\x66\x70\x0e\x66\xa3\xf3\x46\x4e\xaf\x69\x50\xba\x5d" + + "\x24\x73\xcc\xf5\x23\xe9\x7c\x3b\x5f\x85\x35\x28\x28\x9e\xeb\xc8\x03\xe8\x0a\xe7\xf2\xca\xcc\x68\xae\xfe\x15\x15" + + "\xae\x2b\x96\xab\x97\x62\x02\x77\x44\x72\x8d\x32\x23\x90\xcb\x4a\xed\x38\xae\xf1\x19\xe3\xd4\x1d\xc5\x35\x8a\x31" + + "\x5e\x1d\x6e\x8b\x55\x38\xea\xb8\xc8\x2c\x88\xfe\xf2\x90\x00\xae\xa6\xdb\x7e\xa8\x90\xf0\x2d\x1c\x03\x63\xe4\x46" + + "\x8c\xca\xd5\xa3\x16\xb3\x29\x80\xc8\xa8\x4d\x29\xf2\x92\x6f\xd3\xa3\x37\xbc\x5d\x81\x1e\xb9\x27\x9a\x98\xa4\x44" + + "\xe7\xf6\x3f\x75\x45\xea\xbf\xec\xac\x2f\x40\x1b\x3d\x02\x56\x3c\x7a\x9f\x56\xb9\x76\xfb\xcc\xc3\xba\xcd\xa8\xa6" + + "\xba\xec\x03\x48\xa1\xa9\xf5\x94\xfd\xd8\x4b\x10\x11\xb5\xca\x5a\xac\xe6\x9b\x14\xdd\x65\xbd\x94\x19\x6d\x8a\xdc" + + "\xda\xd7\x1e\xaf\xd8\x31\x04\x8d\xa2\x91\x99\x1d\xb4\x60\xa4\xaf\x90\x66\xc1\x17\x6b\x3c\x3b\xc7\xea\x90\xc7\x53" + + "\xff\x97\x64\xf3\x08\xcf\xf9\xfc\x2a\xf7\xe8\x40\xdd\xed\x19\xd6\xad\xdf\xeb\xbd\xef\x4d\x54\x50\xe9\x4b\x0b\x2b" + + "\x7d\x69\x8d\x06\xf3\xfd\xeb\xbb\xd5\xe9\x3b\x71\x6a\x27\x2b\x1b\x50\x3e\x19\xd8\xc6\xe9\x54\x3b\xc7\xcc\xfe\xd2" + + "\x75\x55\xf9\xd3\x80\xa6\xdf\xab\xa7\x2d\xed\x5c\x85\xed\x65\x7f\xce\x61\xa9\xb0\x99\x08\x7f\x07\x92\x71\xfb\xa7" + + "\x36\xc3\xb5\x43\x04\x30\xfd\x93\xdc\x6f\x9f\xce\x56\x6d\xd4\x0b\x8e\x67\x7d\x35\x32\x4e\x39\xa0\x46\x40\x20\x3b" + + "\xd3\xbc\xd4\x39\x52\x59\x80\xd2\xaa\x28\x48\xdd\x52\x5d\xfc\x70\x18\x48\x08\x49\x03\xcd\x3d\xd7\x35\x6e\x38\x91" + + "\x67\xb1\xfa\x2a\x61\xf7\x55\xf6\x1a\x00\xce\x75\xd1\x60\x43\x2e\x71\xf1\x63\x85\x52\xed\x98\xc0\x65\x9e\x5d\x98" + + "\x80\xd7\xee\x84\xb8\xcb\xcf\x79\x79\x8c\x0f\x97\x52\x1c\x15\xa2\xa4\xa5\x56\x2f\xb8\xc1\x82\x48\xd9\xd5\x66\x17" + + "\x69\x73\xa6\x0b\x24\xcf\x18\x52\xee\x47\xb6\x6b\xa8\x9b\xaa\xa6\x4d\xdf\xdb\x5c\x2c\x93\xe8\x39\x6f\xf3\x7d\x5e" + + "\xe4\xdd\xab\x5d\xdf\x18\x74\x20\xa8\xea\x2e\xd2\xd0\xce\x7f\xe8\x0c\xa6\xc5\xd4\x3a\x4e\x7f\x6c\x8d\x5b\x15\xf7" + + "\x49\x30\xf8\x2c\xd3\xb2\x7e\x89\x32\xd2\x9e\xf8\xd9\x16\x3d\x5d\xe9\x72\xe4\x5c\x95\x78\x47\x0e\x83\x92\x8d\x92" + + "\xde\xf9\x24\x62\x3f\xc5\x21\x4a\xf7\xad\x5c\xc3\x9b\xc7\x4e\x52\x25\x16\xec\x99\x96\x97\xb1\xdb\xb7\x32\x57\xa0" + + "\x38\x3e\xfb\x08\xef\xdf\xce\x12\xee\x2c\x69\x83\xf9\x71\x78\xff\xa6\xc7\x79\xd4\x33\x93\xce\xd6\x58\x86\x03\x2d" + + "\x43\xe9\x7c\xc8\x60\x89\x9c\x01\x34\xdf\x76\xe3\xf3\x40\xdb\xc9\x14\xd7\xc8\xe9\x37\x63\x81\xa5\x3c\x25\x00\x51" + + "\xe4\xf5\x2e\x1a\x32\x66\xbc\x98\x14\xd0\xf2\x91\x3c\x85\xb0\xc4\x3c\x7f\x25\x4f\x6c\x85\xe6\x33\x4c\xd4\x71\x49" + + "\x8b\x14\x72\x07\xc7\x0f\x8d\xaa\xc1\x94\xbd\x4c\xca\xf4\x17\x1e\x5d\x4d\x86\xae\x87\x17\xd8\x75\x0d\x9a\x66\xf9" + + "\x73\x2e\x53\xd0\xa9\xe9\x18\x9e\xec\xdc\x45\x5b\xd9\xcb\x98\xa9\xc4\x82\x6b\x30\xbf\xab\x5e\xdf\x53\x91\x3f\x11" + + "\x7f\x62\x4d\x36\xef\xab\x24\x41\x69\x41\x49\xc3\x1e\xac\x3b\xdd\x70\x8a\xd4\x38\x70\x85\xa6\xf8\x76\x71\xa9\x7c" + + "\x4e\xa4\x08\x71\x80\xd7\xfd\x3f\xa7\xb3\xe8\xd2\x6a\xed\xdd\x23\xbd\x22\xf9\xda\x12\xb1\x58\x50\x25\x0e\x16\x87" + + "\x72\xb8\x6c\x33\x46\xd2\x35\x6c\x0e\x0b\xa9\x11\x83\xf4\xa4\x56\xf1\x18\xdb\x43\x19\x88\xbc\xb8\x61\x50\x77\x7c" + + "\xb4\x5a\x97\x4c\x50\xc2\x4e\x21\x38\x8e\x41\x8e\xae\xe4\xdc\x47\x45\xe5\x09\xca\xba\xa9\x8e\x79\xb6\xfb\x2f\xff" + + "\xf3\x8f\x7d\xf9\x9f\x7b\xf4\x43\xd5\x9c\xa7\x7f\xca\xd3\xa6\x6a\xab\x43\x37\x3d\xf6\x36\x85\x96\xdd\x07\x5a\x32" + + "\x8e\x7f\x38\x90\xa2\xa5\x6a\xe8\x1b\x11\x20\x35\x0f\xa0\x0e\x17\x87\x26\x21\x93\xc9\x6d\x06\x84\xcd\x87\x10\x49" + + "\x5e\x79\x32\xf2\x06\x29\xa4\x13\x25\xd2\xdc\x04\x9a\x80\xf1\xc5\x03\x36\xe4\xc5\xd2\x2d\x64\xc8\xf7\x9d\xd6\xff" + + "\x61\x4c\xa7\x87\xfc\x85\xf7\x3a\x9e\xc9\x42\x3b\xf0\x8e\xcd\xb0\xdb\xad\x6a\xfd\x60\xa0\xb1\x9e\x1b\x17\xf7\xa5" + + "\x8e\xb8\xab\x34\x89\xa6\x25\x79\xde\x93\x26\x66\xdc\x89\x53\xf7\x83\xb2\x47\xc0\xa3\x4a\xab\xb2\xa3\x65\xb7\x8b" + + "\xde\xbf\x37\x1d\x20\x2c\x41\xb7\x72\x69\xcc\x8a\x35\x86\xc7\x19\xb0\xdb\xc7\xaa\x94\x7a\x31\xdc\x00\xc4\xdf\x6a" + + "\x0d\xbe\x6e\x21\xd8\xe0\x5a\x8b\xd4\xaa\x89\x15\x79\x8f\xd9\x83\x3f\x28\xb5\xa9\xd5\xef\xec\x27\x74\x87\xf5\xb0" + + "\x58\x07\xf3\xb5\xb1\xf4\x44\x6f\xc9\x97\xe7\xba\xd7\x65\xae\xbf\x25\x1c\x5c\x85\x8b\x3b\x70\xc3\x39\x6f\xac\x66" + + "\xe0\xe3\x8d\x50\xd5\xc3\x61\x08\x80\xb9\x8f\x87\x81\xc0\xe8\x0d\x56\xae\x47\x7c\x87\x16\x20\x95\x6b\x75\x5a\xdf" + + "\xf5\x30\x2f\x28\x18\x4c\xfe\x90\x80\xc6\x6a\x39\x23\xf7\xc9\x94\xe5\xf0\xd5\xee\x65\xf0\x93\xe3\x69\x55\x9b\xa5" + + "\xf6\x8d\x2a\x79\x75\x4a\x0f\x74\x74\x55\x55\xec\x49\x83\x00\xae\x70\x40\x8b\x39\x55\x60\xde\x04\x75\x74\xbc\x80" + + "\x87\x7a\x04\x3f\x61\xb4\x9f\x2c\xda\xfa\xab\xdc\x48\xbc\x88\x77\x45\x59\x75\xd1\x07\xed\xe1\x8e\x8f\xe2\x1b\x78" + + "\x47\x42\x7c\x32\x97\x46\xdf\x7e\xf3\xee\xe3\x2f\x23\xf1\x5c\xa8\x0e\xc6\xeb\x20\xe6\x6d\xc2\x31\xa4\x60\xbe\x22" + + "\xc8\x55\x57\xd5\xdc\xaa\x0c\xfc\x59\xe6\xd6\x04\x70\xf0\x32\xd4\x8c\x89\x4d\xd7\x7f\x73\x15\x59\x56\xdd\xb7\xdf" + + "\xbc\x33\x50\x0c\x36\x7b\x49\xf8\xb8\xd4\xcb\x71\x26\xc7\xb5\xcb\x84\x0d\x54\x81\xc1\x88\x85\x75\xb7\x20\xee\xef" + + "\x3f\x53\xae\x88\xb1\x08\xa4\x63\xaa\xc0\xaf\xa2\x01\x82\x17\xbf\x1e\xe0\xca\x7e\xbf\x6e\x8e\x2c\xdd\xb2\xed\x2f" + + "\x73\x34\x2d\x40\x87\xdf\xa9\xb7\xf1\x13\x8a\x65\xe4\x22\x7b\xc0\x52\xff\x3e\xb8\x8c\x0c\x4b\xed\x15\x40\x75\x36" + + "\xc7\xc8\xce\xe6\x08\x5d\x4f\x03\xff\x2e\xf7\xbe\x7c\x5c\xe9\xdb\x4f\x37\xee\x2e\x41\x57\xd2\x6d\x38\xd9\xc5\x56" + + "\x05\x27\xd4\x4a\xc4\x8b\x56\xa2\x21\x88\xc6\xc9\xa0\x9e\xe9\x6b\x8e\x91\x4c\x24\xd1\x2b\x9c\x21\xbd\x44\xcc\x65" + + "\x1e\x77\xc5\x74\xa1\xec\x65\x0a\x78\x22\xfa\xd1\x7e\x99\xc3\x78\xae\x66\x84\x53\xb3\x36\xe4\xf9\x69\x07\xa6\xe5" + + "\xa9\x20\xc5\xa1\xad\x1d\xa1\x65\x39\x31\x22\xa6\xa0\xa5\x90\x9e\x21\xb7\xc2\xed\x21\x6f\xb8\x7e\x61\x53\x41\xd0" + + "\x24\x60\x3a\x9d\x5e\xfb\xed\xb5\xd6\x22\x98\xe7\xb5\xd7\x57\x5b\x51\x83\x3d\xbf\x49\x0f\x35\xe0\x41\x33\x8d\x86" + + "\xbd\x1c\x1d\x3b\xd7\x4f\xd2\xf2\x60\xc0\x75\x3d\x74\x87\xf9\xfa\x26\x82\xb6\x4f\xf9\xcb\xaf\xdc\xd9\xb7\xcd\xe2" + + "\x3a\x63\xd7\xaa\x81\xcd\xd2\x5f\x2f\x6d\x97\x1f\x72\x9a\x21\x1b\x69\x88\x19\xe3\x1b\x6c\x05\x79\xad\x2e\x1d\x08" + + "\x86\x0c\xc7\x06\xd8\xbe\xdc\x2e\x6a\x69\x4d\x1a\xd2\x21\xd6\x4a\x55\x68\x9b\x64\xbd\x08\xb8\x90\xe3\x8f\xf2\x43" + + "\x56\x11\xe3\x8a\x52\x56\xd6\xd5\x6b\x97\x71\x54\x3b\xb2\x60\xc5\x68\x7e\xcc\x48\x47\x84\x3a\x89\xdd\xe3\xf6\x27" + + "\x6e\xd2\xf1\xdc\x28\x61\x08\x43\x56\x78\x37\x3c\x9c\x3e\xae\xad\xcb\x81\xab\x32\xb3\xb8\x77\x97\xf8\x9e\x4a\x43" + + "\xd3\x6e\x70\x50\x12\xe6\xd0\x8c\x67\x5d\x1d\xfa\x7a\x24\x2a\xa2\x14\x73\x54\xe5\x00\xe1\x1f\xd3\x82\xb4\xed\xef" + + "\x7f\x48\xab\x22\xfe\xc9\x9c\x50\x1f\x6f\xc9\x75\x7e\xb4\x13\x1e\x79\xb8\xd7\xf3\xdb\x1a\x7b\x69\xfe\x47\xec\xb0" + + "\x7a\xd9\x99\x12\x23\xd7\x92\x59\x8c\x66\x58\xf2\x42\xed\xbb\x72\x70\x38\xfe\x6e\x59\xb0\x5d\x0d\x74\x00\xa1\xcd" + + "\x0c\x80\xf5\x36\xf6\xca\x94\xdb\x7e\x96\x3d\xe0\x1e\xe6\x03\xb1\x64\x33\xac\x9c\xdf\x0e\x9e\xc4\xee\x06\x0a\x68" + + "\x73\xe3\x26\x8a\xf1\xe0\x49\x8f\xad\xbf\x2a\xe4\xd5\xdd\xbe\x78\x5c\x77\x4d\x28\xb4\x3b\x7f\xbb\x07\x08\x5c\x2d" + + "\x73\x00\x85\x2a\xed\x55\xad\xbc\xf2\xb5\x03\x3f\xcb\x1e\xf0\xeb\x95\xd6\xd5\x0c\x87\x7e\x59\x3c\xb9\x94\x16\xe7" + + "\xc6\x4d\xf4\x76\xa5\xb5\x32\xdb\x21\xd5\xa2\x29\xea\x10\xc7\x65\x94\x7c\xa0\x8f\x6d\x8d\x09\xc6\xc7\xad\xc8\xf7" + + "\x59\x75\x85\x8a\x45\x79\x6a\x8e\xcd\xb8\xf1\xed\x0e\x3c\x1f\x67\xe8\x73\x97\xe3\x07\x06\x1e\xed\x97\x2f\xf1\xe4" + + "\x53\xee\x57\xf3\xae\x79\xf5\xd2\xd9\x2c\xf4\x49\x96\x51\x4b\xe6\x3e\x32\xe9\xaa\xe0\xda\x73\xa9\xee\xd3\xa7\x76" + + "\xcf\x38\x32\x01\x7a\x01\x35\x77\x53\xcb\x80\x37\x3e\x7e\xe0\xe3\xe1\x48\x35\xe6\xe3\xe2\xd6\x38\x00\xe5\x72\x8d" + + "\x32\x06\x02\x9c\xe6\x71\x92\xc6\x52\x13\x21\x0f\xde\x8c\xd6\xd7\xde\x2c\x76\x6f\xad\x84\xc7\x29\x58\xe3\xf8\xdb" + + "\x6f\xde\xfd\xda\xbb\x16\x5e\xc1\x6b\x11\x7c\xf5\x24\xf8\x58\xcf\x82\x15\x3f\xd6\xb1\x46\x40\x20\xac\xd3\x9c\xab" + + "\xee\x20\x1a\x8e\x1d\x98\x91\xee\x40\x49\xa3\x9d\x1e\xd2\xbf\xde\xd0\xc5\xed\x91\x7e\x9f\x7c\x61\xf7\xb9\xd7\x47" + + "\xf1\xc8\x7e\xf3\x60\x56\x92\x91\x53\x19\x4e\x2f\xc8\x7d\x7e\x12\x43\xf9\xa4\xf0\x9c\x5b\xad\x18\xda\xb0\xb3\x81" + + "\x96\x0e\xfb\xcb\x68\xb1\x6f\x97\xf9\x6e\xa6\x47\xb7\x94\x2a\x27\xa7\xb3\x5d\x96\x46\x06\x1a\x21\xbd\x1e\x5b\x7c" + + "\x25\x79\xd6\xb6\x54\xc0\x11\x18\x2c\x25\xa4\x79\xce\x13\x90\x79\x2a\xf2\x90\x78\x80\x76\xae\x89\xa3\x89\x93\x4d" + + "\xa1\x8f\x53\x1a\x73\xde\x4a\x6b\x8c\x7e\xe8\x4f\x7d\x08\x38\x2c\x86\x3b\x06\x3a\x69\x70\xfe\xcc\x75\xa4\xcd\x02" + + "\x34\x98\x19\x3d\x1b\xe7\x3d\xd6\x77\xcb\x89\x36\xd8\xd5\xe2\x24\x19\xe7\x46\xfe\x05\x39\x54\xdf\xc0\x15\xa3\x11" + + "\x8f\xc9\x38\x60\xa8\x55\x57\x92\xe7\xf8\x57\x3f\x9b\x2a\x7b\xf9\x29\x3f\x1f\x85\xb1\x50\x7b\x37\x86\x92\xc6\x1d" + + "\xd9\x6b\x89\xed\xd5\x41\xa6\xc1\xe9\xcb\xb2\xcc\xc4\x90\xba\x6d\x9e\xaa\xd6\x47\x88\x31\xae\x24\xa6\xd0\x15\x7d" + + "\xa8\x8f\x1f\x81\xbb\x21\x45\x28\xfb\xff\xc9\x60\xda\x35\x26\x9c\x97\xc6\xfa\xde\x14\xff\xc1\x9b\x0e\xcf\xb0\x62" + + "\x9f\xa1\xfe\xd8\x85\xd8\xe9\x55\xe1\xa1\x4b\x6d\x16\x09\xe1\x5c\xc7\x6b\x61\x4e\x39\xb3\xa7\xec\xc9\xd1\x3b\x00" + + "\x18\x7b\xec\x87\x1e\x47\x37\x62\x7a\x86\x72\x58\x02\xd5\x29\x18\xda\x81\xa9\x9c\x85\xa0\x2b\x85\xac\x68\xe5\x7a" + + "\x0a\x6b\x84\x5e\xf8\xc1\x3d\x2b\xea\x1d\x70\x40\xcf\xd3\x64\x57\xa4\x1f\xc6\xf6\xd5\x41\x3d\xaf\x24\x90\x38\xea" + + "\x70\x38\x2f\x50\x8c\xfa\xc1\x4e\xd7\x9a\xcd\x25\x43\x44\xcb\x5d\x20\xc0\x85\x18\x05\x35\x87\x9d\xc3\xd6\xdc\xdc" + + "\x0f\x52\x7e\x5e\x83\xf6\x08\x20\x50\x83\xe1\xed\xa4\xdb\x44\x73\x95\x6c\xf0\x41\xcc\x2f\x0c\xeb\x7a\x50\xe7\x45" + + "\x81\x19\x64\x0c\x46\xc8\xc6\xaf\x0b\x12\xf8\x93\xa0\x69\xde\x48\xc2\x60\x4d\x89\x58\xdf\x35\x9b\x68\x97\x7a\x8e" + + "\xf4\x3b\x4f\xee\x43\x3e\xda\x8e\xa4\x5f\x46\x2d\xcf\x00\x65\xb4\x8d\xbf\x28\xe2\xdb\xe9\xf7\x9a\x48\x14\x68\x84" + + "\x97\x3b\x19\xbf\xdf\xcc\xe6\xbd\xd1\xd4\xdd\x6a\xe1\x0c\xa1\x8f\x4d\x44\x77\x33\x86\x23\xa3\x3d\xd0\x08\xfe\x16" + + "\x06\xf0\x57\x37\x7e\x6f\x12\x45\xb0\x2c\xc2\x0c\x5e\x47\xf6\xb1\xb8\x01\xf0\xc4\xfe\xa8\x49\xe9\xb9\xbe\xab\x81" + + "\x83\xdc\xe7\xce\xd5\x17\xf7\x87\x91\x01\x84\x9d\x09\x7a\xe3\x19\x06\x7e\x54\xdf\xb3\xd4\x83\x0f\x5b\xac\xf0\xe7" + + "\xe5\xe5\x6d\x12\xaf\x73\x7c\xd5\xd5\x03\xad\x33\xb4\x01\x12\xfc\x80\x83\xb8\x83\x00\xee\xc4\xe8\xf3\x92\x36\xca" + + "\x7b\x48\xed\x1e\xb6\x79\x98\x71\x85\x1e\x66\x14\x5f\xe5\xfa\x28\x7e\xd9\xf1\x7b\xb8\x85\x76\xe5\x58\x15\xb7\x69" + + "\x53\x15\x05\x5b\x25\xb3\xa7\x11\xcc\xab\x23\xce\x45\xc5\xd8\xb3\x5e\x09\x3f\xd0\x38\x5f\xad\x26\xd1\xf0\x9f\xe9" + + "\xcc\xfb\x0a\x99\x13\xc9\x21\x17\x75\x83\x5d\x36\xe7\xf5\x5a\xf3\x6d\x49\xd9\x7a\xcb\xc9\xba\x48\xe3\x3d\x61\x89" + + "\x1c\xb1\xd4\xee\x9f\x28\xce\xf5\x4a\xf5\x71\x17\xfd\x53\x7e\xae\xab\xa6\x23\x5c\xd4\xda\x26\x96\x59\x66\xbe\x1d" + + "\xcf\x59\x1c\x96\xc7\xa2\xf3\x01\x9a\x8b\x23\x21\x4b\x4d\x98\x02\xdb\x40\xd1\xef\x02\x19\x74\xcc\x2b\x43\x5d\x55" + + "\xdb\x30\xd2\x00\xf6\x1f\xf9\xa3\x57\x28\x1c\x67\x08\x3b\xc3\x81\x3f\x59\xa4\x29\xc9\x9b\xb9\x54\x21\xb1\x17\xf0" + + "\x06\x71\x82\xdc\x58\x22\x2f\x71\x46\x9f\xf3\x94\x4a\x25\x5b\x3e\x24\xf5\xcb\x47\x52\x66\xd1\x87\xaa\xc9\x69\xd9" + + "\xf1\xe8\x4c\x41\xca\xac\x4d\x49\x4d\x75\xfd\xbb\x07\xa3\xef\x84\xe3\x30\xb0\x3a\x4f\x12\xfd\xbd\x97\xde\xde\x93" + + "\xbc\xa4\x4d\x7c\x28\x2e\x79\xf6\x84\xd4\xe4\x02\xe1\x16\x8b\xcd\xe0\x0a\xc4\x8b\xff\x84\xd8\xba\x7b\x3f\x2b\x74" + + "\x97\xf6\xbc\xa5\x41\x98\x03\x85\x3e\x61\xa5\xa9\x25\x50\xf7\x5f\xb0\x1b\xfa\xe6\x09\x68\x66\x19\xaf\x33\x68\x46" + + "\x15\xc8\xae\xae\x77\xb0\x60\x2a\xf7\x0b\x7e\x57\xd2\xbe\xcb\x68\xa6\x1d\x58\x24\xd7\xf1\x1e\xc2\x48\x78\x83\x24" + + "\x86\x75\x0d\x12\x15\x2f\x3a\x20\x7f\x31\x2f\x7f\x62\xe1\x6e\x9d\xea\xcc\x8a\xae\xf5\x54\xf7\x4d\x6f\x10\x90\xe8" + + "\xa0\xe9\xca\x0c\x71\xeb\x95\x88\x5b\x87\x1c\xc9\x9a\x27\x56\x3b\x58\x8d\x70\x81\x39\x7c\x1c\x89\x73\x63\x84\x54" + + "\xd4\x14\x75\x12\xc3\xba\xf7\x69\x18\x51\x3a\x43\x8a\xbf\x27\x73\xd0\xea\x70\xc0\xd4\xd9\x66\xc3\x52\x02\x78\x15" + + "\xc4\x77\x33\x92\xa9\xb1\x26\xfa\x2d\xd8\x87\x87\x2e\xee\x83\xf6\xc9\x70\xc5\x0c\xcd\x90\x3b\xea\xb7\xdf\x22\x7f" + + "\xc3\xeb\x4f\x9a\x04\xbc\x39\x46\x74\x59\x4d\xf3\xb4\x2a\x63\xe9\xef\x3a\x53\x2f\xcd\xe7\xfa\x5b\xf6\xf8\xf9\x04" + + "\x7b\x68\x99\xb5\x7c\xd2\xeb\x83\xa2\x5e\x5e\x6b\xf6\x40\x6f\x9b\xab\x1e\x4b\x33\xe4\x76\x96\xdc\x58\xd8\x4c\xfb" + + "\xb1\x16\x1b\x9b\x44\x02\x12\x6c\x3d\x69\x2f\xb8\xe9\xe3\xd5\x7a\xed\xd4\x35\x3c\x35\xc7\x41\x35\x67\x63\x36\x47" + + "\x6d\xb2\xa0\xd7\x9d\x07\x7d\xe6\xd6\xfe\x11\xac\x26\x94\x33\x6a\xfa\xb2\xf6\x43\x93\xa3\xca\xa9\x74\xf0\xed\xbe" + + "\xaf\xb3\x41\x66\xba\x80\xc1\x58\xb9\x50\x58\x8f\x0c\xaf\x49\x6a\xa7\x67\xe4\x3d\xa4\xb9\xb2\x09\xa3\x1c\x80\x00" + + "\x01\xd2\x69\xe1\x24\x4c\x5b\xeb\x07\x96\xb1\x3d\xde\x08\x57\x0e\xcf\x6b\x57\x97\x52\xb3\xcd\x59\x46\xa9\x7a\x62" + + "\xb7\x48\x85\xae\xac\xe5\xe8\x3b\x74\x18\x18\xe3\x40\x98\x3f\x7b\x20\xe0\x56\xf9\x50\x35\x67\xec\x50\xd2\x2a\xd0" + + "\xdc\x9a\xae\xa3\x61\x6f\xed\x99\x21\x78\x51\xeb\x8c\x0e\xdd\x6b\xf1\x3b\x91\x00\x2c\xd9\xc0\x1d\x17\xc8\x21\x84" + + "\xaf\x74\xc4\xfa\x5e\xfa\x75\xdf\x5b\xb6\x6b\xfa\x55\xde\x5b\x76\x56\x13\xfe\xde\xb2\x46\xe2\x6e\xef\x2d\x3b\xa9" + + "\x9a\xa7\x52\xdd\x80\x8e\xf7\x96\xc3\x10\x7c\xef\x2d\xbb\x28\x04\xbe\xb7\xac\xa1\xdf\xe7\xbd\x65\x9d\xe4\xf0\x02" + + "\xae\xf6\xfd\xb7\x7b\x6f\x19\x65\x47\xbd\xb7\x8c\x30\x35\xfe\xde\x32\x4e\xd2\x71\xca\x12\xa9\xe1\x4e\xef\x2d\x6b" + + "\x94\x6f\x7f\x6f\x39\xd0\xcd\xc1\xed\x8c\xbd\xe5\xe3\x1e\xcd\xe6\x75\xbb\xd1\x4d\x94\x6b\x2c\x20\x1a\x13\xd4\xa6" + + "\xbf\xc4\x13\x87\x1b\x8f\x10\xdc\xc7\xc7\xc2\x3c\xd6\x91\x60\xbd\x19\x8c\xbf\x3d\x52\x8f\x07\xb0\x46\xb9\xc0\x16" + + "\xd0\x16\x23\x4b\x6b\x47\xe1\xd7\xbb\xbb\x2b\xd7\x99\xfa\x49\x42\xc4\x0f\x01\x0e\x87\x8d\x3b\x05\x19\x79\x21\x89" + + "\x19\xbe\x51\x31\x43\x96\xed\x82\x88\xc8\xb0\xab\x11\x59\xe2\x44\x90\x85\x1f\x7d\xe9\x6c\x74\xdc\x71\xba\x22\xe8" + + "\x66\x52\x77\x78\x99\xe6\xca\x58\x57\x7a\xc3\x2f\x0c\xac\x73\xc8\xd2\x04\xea\x74\xc7\xb5\x87\xfc\x66\xda\x2a\xdf" + + "\x8c\x9f\x23\xae\x25\x4a\xe8\x7f\x23\x74\x8d\xd1\x8d\x0c\x45\xf8\xc2\x2d\x76\x62\xe9\xa1\xff\x87\x9c\x90\xa3\x9b" + + "\xfe\x9f\x83\x98\x1d\x50\xc2\x8f\x17\x3a\x71\xcc\x65\x0a\x0e\x84\x9e\xc7\x62\x07\xea\xae\x39\x49\x88\xd1\x57\xda" + + "\x13\xce\xb7\xb6\xfc\xb8\x1e\x6d\xac\xc5\xfa\xf9\xcf\xd0\xf7\x7b\xc3\x5b\xdc\xd3\x37\xf6\x88\x47\xc1\xf4\x6d\xf3" + + "\x71\x70\xfb\x90\xa8\x38\x3d\x87\x9d\x8b\x0c\xd1\x2f\x46\x5e\xcb\xf0\x18\x06\x18\xc8\xb8\xf7\x7c\xab\xbc\x50\xf3" + + "\x16\x2d\xb3\x12\xf5\xa8\xa7\x07\xb4\xd3\x8b\x6e\xdc\x31\xad\x11\x50\x63\xaf\x25\x04\xd6\x66\x84\xde\x10\x4a\x0f" + + "\x0f\x0f\x23\x94\xec\x5d\x23\x13\x42\x39\x35\xb7\x58\x1c\xd6\x6f\xf0\x64\xf0\x08\x50\xa0\x26\x58\x27\x89\xaf\x54" + + "\xe0\x40\x4f\x13\xa9\x7b\x2c\x1a\xa4\x59\x1a\x6d\x56\xb8\x8a\x98\x71\xec\xe3\x7a\x7c\x70\x1c\xc4\xb0\x4a\x63\x43" + + "\xe4\x36\xa6\x07\x5b\x75\x13\xcf\xae\xf3\x2e\x37\x12\x41\x5a\x2f\x34\xc3\xa7\x1a\x37\xb6\x1c\x18\xbc\xdb\xd8\xc6" + + "\x0c\xe1\xdb\xc8\x20\xed\x17\xf6\x31\xa4\xf7\xbd\x23\x5a\xa5\x8d\x0a\x9f\x53\x1d\x8f\x67\x80\x77\xb7\x4d\x44\x2d" + + "\x3f\x55\x40\x45\xd6\x53\x24\x4e\x80\x9b\xd8\x40\x1e\x1a\x09\x00\xf5\xbe\xfc\x33\xd6\x82\xab\x70\x30\x1f\x04\xbc" + + "\x8c\x2e\xf0\xf2\xf2\x99\x36\xe2\x88\x04\xf6\xe0\xf7\x7c\x8e\xf8\x95\xc9\x43\xff\xcf\x41\xc9\xed\x57\x6e\xb3\xfe" + + "\x5f\x08\x9a\x29\x51\x1c\xe8\xaa\x53\xad\xee\x19\xdf\x24\x6e\xf9\x95\x41\x7c\xa3\xae\xe5\x55\x98\x63\x8d\xf6\x7a" + + "\x97\x77\x68\xb7\xc3\xbb\xf4\x82\xd9\x53\xb3\x1f\xdc\x1e\x69\xee\x63\xc8\x41\x5a\xe6\xf4\x2e\x47\x00\x03\x19\xf7" + + "\x7a\x97\x4b\xf1\x2e\xf5\x5b\x74\xcd\xe9\x5d\xda\x16\x08\xc7\x1d\xd3\x9a\x30\xef\x32\xb4\xb6\x71\xef\x12\xbc\xb9" + + "\xe5\xa0\x64\x7b\x97\x26\x84\xcb\xbb\x9c\x25\xfd\xbf\x10\x8d\x30\xbd\x4b\x0f\x50\xa0\x26\x38\xbd\xcb\x40\x05\x0e" + + "\xf4\x2e\x91\xba\x5d\x33\x3b\x92\x1c\xdd\x65\xa8\x35\x27\x26\xb4\x0a\xfd\x99\x07\x5f\x03\x6f\x22\x8f\xf8\xc7\xd2" + + "\x5c\xde\x4e\x0f\xf1\x95\xae\xc3\x47\x9c\x24\xd1\xc1\x57\xb9\xc8\xe1\xdd\x88\xba\xc8\xd7\xa3\xbf\xa5\xe1\x5e\x17" + + "\xd9\xdd\xfa\x37\x76\xbf\xcb\x45\xbe\x85\xc0\x9b\x5a\xef\x77\x91\x85\x91\xbf\xda\x45\x36\xeb\xb7\x3c\xd7\x20\xdf" + + "\xc0\xe1\x9e\x7a\x8c\x2c\xea\x25\xfb\xeb\x72\x39\xca\x36\xc0\x4d\x9c\xb8\x1d\x65\x1f\x68\x88\xa3\xec\x6c\xc1\x55" + + "\x38\x98\x3b\xb5\x5c\x2e\x65\xb3\xf6\x0d\x25\x59\xda\x5c\xce\x7b\xfd\xb4\xc1\x83\x7d\xd8\xc0\xbc\x36\x10\xfa\x4c" + + "\x11\x7b\xd0\xc5\x7f\x10\x6b\xe0\x42\x9e\xb2\x70\xec\x34\x23\xe0\x9f\x8a\x7c\xb7\xa7\x87\xaa\xa1\x7a\x0b\x12\x79" + + "\x07\xca\x58\x0e\x0e\x6f\x40\x7c\xfe\x4b\x92\x90\xe4\x3d\x42\x15\x5e\xf7\x40\xd6\x62\x35\x39\xe6\x25\x3b\x09\xe8" + + "\xe6\xd5\xbe\x76\xa0\xbf\x0a\x95\x18\x59\x80\x11\xa9\x0c\xd5\x38\xa4\x82\x02\x32\xc7\x40\xff\xd2\xd6\x24\xf0\xe9" + + "\x83\x47\x57\x1e\x21\x2b\xe7\x81\x75\x78\xcb\xf5\xcc\x90\x7c\x27\xe7\xaa\x47\x80\x7c\xb7\x94\xd1\x56\x6b\x99\x21" + + "\x2c\x09\x68\xa5\x4a\x1a\xf6\x26\x63\xd8\x0e\xdb\x48\x0e\x59\xbd\x66\x90\x48\xc2\x66\x0b\x14\x2a\xae\xde\xb2\x8d" + + "\xe7\xe2\x02\x2c\xbf\xcc\xef\xf2\x6d\x67\x5b\x63\x80\xeb\x88\x14\xfa\x1e\x3c\x0d\x4e\x72\x80\xf7\x26\x5c\xa6\x61" + + "\x9f\xb1\xb6\x18\xb3\xbc\xc9\xb5\x2c\xee\x59\xc7\x11\x41\x8b\xdd\xe5\xd0\x98\xea\x69\x2d\x0d\xcd\x0d\xbb\x8c\x6f" + + "\xbd\xc6\x8b\xdf\x51\x85\xdc\x68\x8b\x41\xbc\x00\x6d\x85\xe9\x06\x58\x02\x52\x00\x88\x88\xb4\x32\x5c\x2d\x0c\x18" + + "\x67\x32\x8e\xe0\x9c\x1b\xba\x0d\xf0\x6b\x4c\x5c\x1c\x6d\xc3\x27\x3e\x0e\xb6\x2f\x24\xbb\x97\x8b\xb6\xc7\xbc\x20" + + "\x00\xd8\x58\xd6\xac\xc5\x7a\xd4\x9e\xac\x3d\xbc\x38\x4d\x8a\x5d\x3e\x6e\x55\x50\x56\x2c\x10\x84\x97\xf6\x8c\xc8" + + "\x9c\x7f\xb4\x65\xee\x49\xd9\xe6\x22\xed\x13\xb9\x0d\x30\x2a\xf2\xc5\xa8\xc8\x17\x1e\x5e\xdc\x22\xb7\xca\xc7\x45" + + "\x8e\xb2\x62\x81\x00\x5e\xc4\x50\x0a\x72\x27\xf0\x44\x7d\xae\x54\x43\x9c\xf8\xa8\x77\xc1\x60\x64\xcb\xf9\x1f\xaa" + + "\x99\x63\xde\x8f\xe8\xfc\xa5\xeb\xa0\x7f\x70\x4a\x12\x75\x60\x7e\x65\x0a\xc7\x9c\xe0\xe4\xa7\x37\x27\x2a\xe2\xb4" + + "\xa6\x25\x7d\xe9\x40\xeb\xf9\xdf\x4a\x00\xf0\xe4\x84\x81\x58\x37\xf4\x39\xaf\x2e\x2d\x44\x56\xdf\x4c\x02\x30\xef" + + "\x82\x80\x35\xad\xbd\xfe\xcd\x68\xb2\xd3\xc6\x6b\x65\xaa\xd6\xb7\x18\x66\xc9\xe6\x70\x5c\xcf\xd0\x02\xad\xff\xa7" + + "\x73\x7a\x8e\xa6\xeb\xfe\x3f\x0b\x7a\x36\x4c\xc0\x66\xf5\xbb\x47\x33\x29\xe5\x66\x2c\x29\x25\x7c\xb0\xd1\xd2\xf5" + + "\xc0\x94\x9a\x7b\xd2\x52\xf5\x06\xbb\xae\x61\xd3\xf9\x8a\x9e\x45\x1b\x09\x6f\xa4\x94\xb5\xfc\xd3\x19\x29\x1b\xcd" + + "\x36\x25\xd2\x81\x6b\x22\xdc\xd1\x73\xdd\xbd\xea\x82\xb4\xde\x1e\x19\x84\x8d\xbb\xf1\xea\x7a\xb9\x46\x7a\xec\x78" + + "\x0d\x58\xd6\x68\xf0\x3f\x9e\x1a\x7a\x18\xd6\xb4\x58\x99\x37\xab\x15\x3f\x05\xa3\x93\xae\x9b\xfc\x4c\x9a\x57\x17" + + "\x8a\xee\xf5\x68\x28\x28\x37\x7a\x99\x97\x9b\xf9\xc3\x3a\x19\xde\x1e\xe4\xe8\xed\x25\x4d\x69\xdb\x3a\x1b\x90\xee" + + "\x1f\x56\x29\x8a\x82\x72\xa3\x97\x79\xb9\x59\x2e\xb7\xd9\xb0\x04\xe7\xe8\x79\x79\xa8\x9c\xac\xec\xd3\x24\xa3\x36" + + "\x3c\xca\x07\x28\xf0\x32\xb1\x98\xed\x93\x6c\xa5\x13\xfd\x4a\x9a\x52\xbe\x13\x8e\x8d\xfc\x84\x64\x4b\x8a\xa2\xa0" + + "\xac\xe8\x65\xfe\x24\x68\xe9\x76\x33\x3b\x18\x9a\x48\xca\xa3\x1b\x23\xdb\xae\x16\x4b\x14\x03\x57\x5d\x58\xe4\x65" + + "\x25\xdd\x2e\x92\xb9\xea\xf8\x3d\xc9\x8e\xd4\x3f\xd1\xc1\xf7\xa0\xcd\xeb\x89\x8b\xfa\x25\xda\x38\x53\xd5\xfe\x9d" + + "\xad\x1e\x6a\x0d\xb0\x19\x17\x9c\xbf\x64\xf2\x08\xb2\x57\x83\xe4\x02\xed\xd5\xf0\xec\xc4\x4b\xfb\x04\x68\x88\x67" + + "\x32\x5e\x5a\x48\x73\x38\x9f\x3b\x38\xf6\xda\x3b\x48\x44\xb0\xaa\x0c\x37\xff\xf3\x7e\x86\xbb\x77\xa9\x38\xbb\x79" + + "\x47\xcf\x72\x9d\xa8\x58\x1e\x72\x15\xa9\xb5\xe9\x13\xe0\x1f\x59\x03\xfa\xa7\x5a\xbd\x3a\x48\x0a\x73\x40\x70\xf0" + + "\x4f\x00\x4b\x3f\x98\xb9\xc2\x53\x33\xe9\x3c\x6b\x01\x13\xe0\xa2\xfe\xf5\x72\xde\x57\x5d\x63\xe6\xa1\x5e\x20\x37" + + "\x96\x64\x10\x51\x26\x6e\x17\x2d\xcd\xcb\x13\x6d\x72\xd7\x3a\x19\x78\x64\x43\x55\xd3\xd3\x6c\x12\x81\xbf\x4f\x33" + + "\x28\x57\x41\xd0\x46\xab\xb1\xe3\xd5\xc8\xfd\xe1\xf9\x0c\x19\xa2\xf3\x24\xb1\x28\x3e\x9d\x1a\xd3\xdd\x57\x26\x6a" + + "\xd5\xff\xb3\x72\x0b\x00\xae\xed\xfb\xf7\x91\x21\x4d\x77\xae\x69\x20\x8a\x81\xf4\x2f\xce\xd7\xb6\xc4\x16\x5d\x9b" + + "\x36\x94\x96\x11\xcb\xbb\x30\x18\x2e\x78\x94\x58\xaf\x7f\xe8\xce\xe5\x83\xb8\x3b\xf5\xef\x5a\x66\x81\xab\x5a\x63" + + "\xe6\xa9\x90\xcf\xe7\x1b\x6b\x9b\x35\xb8\x53\x38\xda\xe3\xb0\xd7\xd6\x0b\xfd\x36\x5d\x77\xba\x9c\xf7\x25\xc9\x0d" + + "\x27\xd5\x5e\xa3\xe0\x67\xc6\xe7\xd8\x2d\x55\x23\xb3\xe4\xdb\x17\x34\xc6\x43\xf9\x6c\xe7\x45\xd8\x4b\x0e\x19\x4d" + + "\xe7\x6d\x44\x49\x4b\xe3\xbc\x8c\xab\x0b\xbf\x5e\x57\x05\x02\x8e\x43\xd9\xc2\x62\xd9\x3f\x27\xd1\xf0\x05\x64\x03" + + "\x85\x56\x43\x5e\xf6\xd0\x0c\x03\x48\x2e\x43\x06\x0a\xea\xe1\x5a\xf0\x6d\xb0\xcd\xc3\x27\x67\x62\x4d\xdd\x3b\x1c" + + "\x78\x9d\xa6\xa4\x56\xa1\x78\x78\x37\xfd\x11\x3f\xf1\x44\x0a\xda\x74\x46\x44\xc8\xbf\xd1\xf1\x86\x1b\xe6\xbc\xb2" + + "\xd3\x12\xbf\x59\x82\xdb\x2a\x8e\xc3\xff\x67\xd8\xec\x32\x5d\x05\x0d\xfa\xa9\x9e\x08\x84\xa7\x4b\x81\xde\x1f\x31" + + "\xc0\x3f\xd5\x16\x47\x2b\x83\xeb\x38\xcb\xdb\x73\xde\xb2\x65\xa3\xa4\x2e\xbf\xb1\x6c\x39\xbf\xd8\xf9\x96\x16\x3e" + + "\x22\xd1\x34\x2d\xaa\x16\xa7\xc5\x8b\x46\x9d\x05\xe1\x36\xc9\x8b\x08\xd2\x46\x7b\xe4\xa8\x79\xf9\x4a\x1b\xd2\xcd" + + "\x7a\xe1\x5a\xde\x66\x87\x43\x92\x61\xf7\x0d\xb2\x35\xdd\xa6\x6b\x9c\xba\x7b\x0e\x48\xb7\x74\xbe\x5f\xe0\x58\x66" + + "\x1f\xab\xd5\xca\x7e\xb5\x1c\x3c\x50\x0e\xa4\xd6\x07\x83\xff\xbe\x49\x1e\x5c\x87\x33\xb2\x2d\xcd\x0e\x58\x64\x79" + + "\x9f\xd2\x87\xc3\x0c\x21\xed\x6e\x01\x59\xd3\x19\xc5\xb8\x71\xb2\xbf\x5c\xcd\xd7\x5b\x1d\x01\xae\x2c\xd4\x51\x6d" + + "\xb2\xce\x16\x7b\x97\x11\x4d\x0f\x0f\x74\x81\xb4\xe0\x40\xe8\x3e\x4d\x71\xea\xee\x46\x1c\x36\x74\xb6\x5f\xe1\x58" + + "\xae\x76\xac\xd7\xab\x99\xd9\x0d\x60\x4d\xa2\xe4\xb3\x5d\x2e\x97\x73\x57\x33\xe6\x19\xcd\xb0\xad\x8f\xbe\x11\xd9" + + "\x0c\x25\xee\x6e\x05\x5d\xee\xb7\x69\x82\x22\xb9\x1a\xf1\xb0\x5c\xac\x16\x72\xad\xf9\xcf\xdf\x7e\x23\x67\x99\x2f" + + "\xf4\xf5\xd0\x90\x33\x6d\xa3\xba\xa9\x8e\x0d\x6d\xdb\x78\xcf\xd2\xe2\x34\x79\x4d\xf9\x70\x39\x34\xd5\x39\xfa\x05" + + "\x34\x6a\x18\x9a\xcb\x84\xfb\x02\x8c\x6a\x67\x2d\x5c\x07\xc0\x21\xc5\xcb\xbf\xf3\xea\xab\xbf\x57\xcd\x7f\x8f\x6a" + + "\xa7\xb2\x2a\x06\x0f\x33\x26\x78\xa6\x9b\xc0\xb4\xdd\xbe\x7d\xf5\xc7\x80\xfb\xf7\x73\xe4\x3d\x5d\xef\xbd\x7a\x14" + + "\x41\x05\x2c\x81\x4c\xcd\xa0\xe6\xe3\x90\x12\x85\x4d\x7b\xca\x91\x12\x09\xa2\xc7\x5e\xa3\x9a\xeb\x6b\x05\xff\x3a" + + "\xd8\xbb\xcd\xe6\x93\x49\x0c\x72\x07\x80\x16\xba\x1f\x25\xf6\x22\x60\xce\x1c\x3f\x17\x37\x5d\x73\xe7\x0b\x71\xe2" + + "\x6c\x00\x77\x29\x26\x78\xa1\xcc\xd9\x24\x1a\x3e\x8b\x4f\x91\xdd\x43\x76\x32\x0d\xc9\x74\x2f\x7d\xd2\xc4\xc7\x5e" + + "\xa3\x68\xd9\x7d\x58\xae\x32\x7a\x9c\x38\xd2\x2a\xac\x3e\xf6\x3e\xf8\x7c\xf5\xbb\x09\x74\x8b\x22\xeb\xc3\x2a\xf9" + + "\x9d\x9b\x04\x2b\x75\xa7\x65\x58\x7d\x8c\x36\x26\x3d\xf3\xc3\xc7\x47\xbc\x4d\xd5\xb5\xcd\x61\xac\xb3\xdb\xda\xff" + + "\x80\xcd\xf9\xbf\xb7\x2d\x6a\xec\x0d\x6d\xe2\x63\x9e\x99\xd6\x65\x62\xed\x0f\x19\xa5\x98\xc2\xab\x45\x85\xfa\x2a" + + "\x4f\xee\xd8\xea\x2e\xeb\x27\x65\x7e\x16\x11\x1e\x74\x22\x98\xb7\x42\xc8\x51\x5e\x1e\xf2\x32\xef\xe4\x48\xbd\x0d" + + "\xf1\x7a\x2c\x7c\x64\x5f\x13\xac\xf6\x0f\x7e\x17\xad\xff\x34\x02\xff\x98\x03\xe7\x3f\x8a\x11\x40\xf5\x3a\x7c\xdb" + + "\x63\x44\xa9\x31\x42\xff\xa9\xd1\xff\x78\x5a\xf0\x1f\x5e\xa3\xaf\xda\x43\x1b\x51\x6a\x07\xad\xff\xd4\xeb\x7f\x3c" + + "\x5d\xf8\x0f\xaf\xd7\xd7\xec\xc6\x8e\xa8\x35\x4e\xea\x3f\xb5\xfa\x1f\x4f\x13\xfe\x23\x6a\x35\xdf\x07\x33\xc3\xdf" + + "\xf0\x54\x19\x83\xb0\x1e\xec\x44\x1f\x62\x65\xa0\x93\x88\xff\x6f\xbc\xaf\x32\xbe\x2b\x8e\xc5\x70\x7e\xae\xd8\x56" + + "\xa3\x86\x39\x60\x0c\x1b\x76\x49\x62\x70\x12\x57\xfb\xbf\xd2\xb4\x43\xb6\xb0\x74\x30\x16\x16\x97\xbc\x3c\x4d\xeb" + + "\x4b\x51\x80\x4c\x3c\xc6\x1b\x08\x56\x25\xfd\x77\x03\x59\x65\x13\x32\x9f\x55\xb0\x90\xfb\x66\x28\x29\x40\x4a\x80" + + "\x01\xc7\x93\x2f\xe6\x09\x85\xae\xaa\x75\xda\x3c\xa5\x1c\x23\xe1\x7f\x16\x59\xb2\xa2\x52\x52\x5b\x87\x1f\x58\x91" + + "\x0e\x7e\xa2\x24\x93\x53\xac\xb5\x41\x83\x65\x58\xd3\x64\x96\xb7\x98\x70\xbd\xaf\x3b\x0e\x3b\xf3\xfe\x43\x9d\x5a" + + "\x5c\xd0\xb1\xad\xef\xd9\x30\x09\x79\xea\x11\xa9\x4c\x3d\x4f\x72\xe3\xa5\x0c\x83\x41\xd7\xab\xb7\xb7\xe4\x30\x73" + + "\x55\x61\x24\xb5\xf3\x64\x4e\x73\xdd\x99\x18\x39\x18\xbc\x04\x67\x4a\xb0\x0e\x00\xf9\x36\x9c\x70\xe6\x07\x4d\xef" + + "\xec\x5d\x4a\x8b\x00\x38\x7f\x68\x14\x38\x33\xc2\x5c\x75\xe1\x86\x05\x93\x5d\x47\x5b\xe4\xe1\xd1\x89\xd5\x0c\x55" + + "\x04\x6e\x05\x38\x41\xee\x70\x29\x00\x9c\x04\x71\x55\xe3\x14\xf5\x28\xf7\x6e\xcc\x80\x66\x85\x74\xb0\xb1\x41\x19" + + "\xde\x82\xbe\x2b\x6f\x60\x9f\xa1\xdd\xc2\xbb\x2f\xf9\x18\x7e\xee\x09\xe1\x8e\x17\x0c\xc7\xf0\xf0\xe2\xe0\x2b\x35" + + "\xb7\xdf\x9f\xc1\x6b\xbe\x46\x4f\x46\x30\x9e\xa6\xed\x99\x14\x05\x2a\xea\x31\xd4\x31\xcc\x5b\x54\x33\x08\x73\x9c" + + "\xe9\x31\x02\xa3\xf8\xfe\x91\x71\x3b\x66\x00\xeb\x23\x04\x18\xfe\x15\x43\xd3\xd5\x8b\x8e\x81\xe9\x97\x9f\x73\x58" + + "\xfa\x79\xb7\x06\x65\xba\xc9\x32\xea\x3a\x20\x78\xeb\xc1\x07\xd7\x04\xe4\xa1\x37\x8a\x72\xbd\x6d\x74\xd2\x72\xce" + + "\x83\x0a\x00\x49\x77\xe4\x6d\x75\x02\x4e\x75\x38\xa9\x82\xd3\x4b\x7e\x88\x61\x1e\x1c\x85\xbc\x26\xd9\x06\x68\x82" + + "\x61\xe9\x60\x0f\x58\x35\xde\x72\x68\xc4\x29\x0a\x07\x31\x3f\xfc\x3d\xba\xbe\x27\xe4\xee\x77\x56\x8a\x74\xba\xaf" + + "\xa5\xe9\x92\x2e\x0e\x4e\x5f\x8b\x91\xf4\xf4\x38\x28\xf6\xb3\x85\xcd\x71\x01\x7d\x3d\x70\x6e\xf4\x35\x94\xb7\x55" + + "\xe1\x8d\x27\x6c\x9c\x42\x70\xd3\x1b\x45\xb9\x47\xa7\x0b\x5a\x6e\x01\x4b\x00\xbb\xeb\xfd\xad\x26\x87\xb9\x3a\x3e" + + "\xe4\xa4\xea\xe9\x7d\x1d\xc2\x37\xde\x0d\xc8\x6b\xc6\x3b\x68\x82\xae\x03\x5a\x0f\x58\x35\xde\x76\x3a\xc9\x29\x0c" + + "\x27\xb9\x31\x8c\x7b\x28\x00\x27\xe5\xee\x7f\x51\x6e\x4b\xd5\xdb\x62\xba\x4f\x53\x4f\xf7\x73\xa2\x9e\xde\xd7\x00" + + "\x7c\x9d\xaf\x03\x5e\xd3\xf7\x80\x7f\xbd\xef\x35\xd9\x7b\x45\x7c\x45\x20\xc3\xe9\x65\x60\xeb\x68\xe3\x1c\xf4\x62" + + "\xb8\xae\x58\x52\xf4\xdc\xe9\xdc\xde\xd6\x1f\x0d\x27\x8c\x1e\xae\x75\x9d\xe4\xe1\xc7\x94\x66\xf6\x31\xa5\xc4\x3e" + + "\xc4\xe3\x83\xd5\x5a\x35\x44\xe8\xb4\xe3\xc2\x3a\x0c\x94\x3d\x1e\x66\x09\x7d\x35\x25\xec\xfa\x32\x7a\xa7\x18\x65" + + "\x09\x7d\xd9\x19\xe4\x65\xc3\xdd\x5f\x4e\xa2\xcb\xbb\x82\x06\xe9\x53\x62\x1e\xe3\x5a\xfb\x0e\xe6\x02\xea\xd2\x93" + + "\x8f\x90\x8f\xe2\xd2\xeb\xf0\xd9\xfc\x7b\x58\x04\x58\x5f\xf5\x4c\x85\x68\xfd\x87\xaa\xea\xf4\x8b\xd5\x66\x97\x05" + + "\x9c\xb9\x33\x9e\xca\x31\x0e\xf8\xbb\xae\x76\x8f\xc4\x9b\xcc\xbe\x7c\x02\x83\x54\x8a\xe0\x49\xb4\x42\xa6\x9b\x7b" + + "\x32\xe3\x8a\xae\x03\xe0\x16\x45\xcb\x58\x07\x55\x61\x22\xc9\xe4\x7b\xf6\x1b\x7f\xc8\x18\x76\x33\xa3\xc5\x0b\x7d" + + "\xc1\xc4\x10\x26\x83\x89\xe9\xcc\x8f\xbf\xfc\x70\xed\x60\xd4\x98\x02\xe1\x4a\x4f\x28\x33\xa8\x7d\x61\xa4\xf4\xd6" + + "\x05\xc7\x45\xaf\xd7\x53\x69\x73\x3e\xf9\x14\xc5\x17\x11\x96\x87\x44\xed\xb9\xe9\x93\x3d\x68\x3d\x78\x0e\xc9\x75" + + "\xe2\x2a\x83\x28\xc6\xfe\x8c\x1b\xda\xd6\x55\xd9\xb2\x9b\x7c\xec\x8b\x7a\xe0\xd6\x3b\x9c\xd0\xaa\x22\x71\x33\xc5" + + "\xa8\xc3\xf1\xd9\xae\x5a\x02\x0a\x16\x82\xdf\xb6\x36\x78\x33\xa9\x6b\x79\x33\x78\x29\x3e\xb2\xac\x22\x6b\x9c\xbc" + + "\x75\x58\x5c\xc9\xda\x53\xd7\x4f\xc6\xfa\x97\x46\xe3\x5d\x4d\x06\x37\xd0\xee\xb5\xf7\x1a\xda\xd7\x71\xe6\x96\xea" + + "\x68\xcd\xff\xf0\x62\x8f\xba\xec\x6e\xbd\x30\x5a\xd5\xe9\xb7\xea\xf0\x7b\xb6\x6a\xb4\x2a\x7f\xab\xee\xda\x1b\x77" + + "\x95\xf7\x5d\x25\xfa\x16\x99\x8d\x0f\x92\xdf\x60\x10\x80\xf9\xfb\x57\x1e\x03\x77\xaa\x29\xa0\xc3\x7e\xab\x9a\xbc" + + "\x6d\xba\x67\x4f\xdc\x53\xd6\xf7\x94\xe6\x1b\xe4\x65\x2b\xff\xd5\x53\x00\xc8\x60\x25\xd8\xc1\x9c\x51\xb3\x04\xf3" + + "\x2d\xef\xb0\xde\xb9\x8a\x3b\xd1\x87\xf0\x43\x13\xaa\xb5\x7e\xba\xbd\xb7\x19\x4e\xf7\x0a\x96\x9c\xf2\x1c\xa9\xf3" + + "\xff\x02\x71\x5f\x33\x6b\xbe\xa9\x9a\x70\x3f\xe0\x0d\x9d\x7c\xbf\xd6\x8c\x54\x33\x32\xcb\xde\x4d\xfc\xf7\x93\xf0" + + "\xfd\x84\x78\xb3\x9c\xd0\xe1\xf0\x1b\xeb\xfa\x5d\x0c\xcd\x68\x47\xfc\xfa\xe6\xec\x6e\x6d\x19\xed\xc0\xbb\x98\xd0" + + "\xb1\xb9\xf4\x5e\xd2\xbd\x9b\x00\x6f\x95\x51\x14\x60\xf0\xd1\x60\x44\xdf\xea\x4f\x66\x90\xc3\x2a\x02\xfd\x6a\xcc" + + "\x4a\x9f\x00\xb0\x4f\x1d\x3e\x99\x71\x72\x77\x68\x14\x1b\x8a\x21\xde\x9c\xc1\x59\x88\xd3\x86\x85\xf4\x50\x4b\xc0" + + "\x21\xa8\x59\x87\x1d\x8d\x51\x90\xa0\x91\x63\x44\x39\xa7\x4f\x5d\xf3\x64\x98\xc0\x68\x14\x7e\x64\x7a\x1b\x30\x7a" + + "\x5d\xba\xa6\x06\x05\x1f\x5c\x43\xef\x8a\x5e\x53\x83\x82\x0f\x9e\xa2\x83\xe5\x76\x1b\x8d\x37\xf0\xe1\x90\xee\x6d" + + "\x34\xde\xc0\x87\xa3\x0f\x6e\xa3\x71\x72\x05\x61\xd5\x23\xd7\xa1\x3a\xed\xf4\x69\xf1\x6e\xf0\x4d\x30\xa8\xcc\x43" + + "\xe8\x03\xf1\x86\xd1\x07\xb2\x0c\xa1\x0f\xc4\x16\x36\x41\xde\x28\xb1\x40\x55\xbe\x95\x87\x20\xa9\x06\xaa\xf1\xad" + + "\x3c\x04\x49\x3e\x50\x85\x5d\xab\xa2\xe1\xa5\xe1\x10\x25\xd6\x67\x91\x71\x2d\x36\x16\xe9\x01\x6a\x16\x5c\x03\x0a" + + "\x8f\xd4\x10\xa0\x27\x66\x9d\x6f\xa7\x71\x25\x1f\x8e\xb6\xbf\x9d\xc6\xc9\xf6\x87\xc2\xfb\x1a\x7a\x5c\x01\x5d\x0d" + + "\xc1\xbd\x3d\x2d\x46\x46\x28\x7d\x0c\xfc\xc6\x7e\xf6\xd6\x78\x2d\x81\x2b\x79\x08\x6a\xf5\xb5\x04\x4e\x8e\xdd\xca" + + "\x91\x55\xdc\xc8\xcd\x0f\x93\x80\x7b\x9f\x1c\x5e\xb6\x81\xa0\xfc\x8f\xb1\x0b\x26\xe8\x3b\x1c\x26\x91\x4f\x36\x2d" + + "\x33\x01\x9b\x8d\xa4\x1d\x31\xf1\x0a\x07\x45\xfb\xe4\xd9\x46\x56\xa7\x2a\xc2\x10\x07\x6f\x1f\xf1\xb1\x3d\xfe\xbe" + + "\x4e\x1e\xdd\xc8\xf5\x37\x85\xa3\x98\x0c\x45\x8e\xe5\x87\x7d\xd2\xc6\xe6\x48\x4b\x8d\xed\x79\x67\x02\xc0\x3e\x21" + + "\xdd\x01\xae\xef\x84\x9e\x1b\xb9\xb2\x1a\x5f\x2f\x38\x93\x8f\x06\xb6\x00\xc9\x49\x0b\xd8\xf5\x3e\xa6\x88\xd2\xc5" + + "\xbb\xc9\xc5\xb1\x58\xd2\x3a\x99\xd6\x52\x86\xfb\x2e\x79\x68\xe0\xbe\x5e\x7a\xf3\x75\x12\x5f\x4d\xb7\x74\xd4\x15" + + "\xed\x78\x43\xfe\x60\x94\xee\x9b\xfa\x0a\xe3\x5b\x4b\x2d\xe3\x4b\x9f\xa8\x81\x7b\x07\xd5\x1d\x72\x35\xfa\x2a\xbb" + + "\x69\x68\x85\x37\x05\xe9\x31\xc0\xb4\xeb\xa0\xbf\x97\xf4\xdb\x06\x18\xc2\xfa\x90\x3a\xc5\x97\x2b\x72\x80\xf5\x76" + + "\xd7\x1d\xb2\x52\x3a\x6b\xba\xa5\xaf\x42\x1b\x81\x75\xd4\xc0\xae\xeb\x94\xbe\x9b\xee\x9b\x7a\x09\x63\x5a\xcb\x05" + + "\xe2\x4b\x89\xa9\x81\xfb\xfa\xea\x1e\xf9\x37\x7d\x95\xdd\xd2\x5d\x57\x34\x05\x9b\xb8\x06\xa6\x5d\x67\xea\xbd\xa4" + + "\xdf\xd4\x69\x18\xeb\x30\xd3\x85\x2f\xff\x27\x84\xf6\x75\xd9\x3d\x72\x8d\x7a\xea\xba\xa5\xc7\xc2\x1b\x82\x75\xd8" + + "\xc0\xb2\xeb\x20\xbc\x8f\xf2\x9b\xfa\x4b\x67\x9c\x9e\xf7\x34\x33\x57\x14\xa1\x57\xeb\xe5\x91\x78\xfd\x3d\x82\x04" + + "\xcb\xe6\xe9\xac\xcf\xfa\x22\x0f\xe3\x5a\x90\xec\x03\x5b\xab\x59\x45\x39\x4b\x71\x8a\x21\xf1\x1c\x12\x58\xc9\x73" + + "\x9e\xd1\x4a\x9e\x31\x54\x0d\x26\xfb\xb6\x2a\x2e\xdd\x90\x7c\x59\xac\x73\xe0\x6d\x80\x21\x65\x01\x48\x37\x8f\x65" + + "\xf8\xb4\x56\x61\x56\x5b\x67\xeb\xfd\xeb\x56\x4b\x88\xa0\xee\x2a\xac\xa7\xf3\xd5\xef\x9c\x88\xcb\xfd\xeb\x02\xc5" + + "\xdb\x0c\x48\x5f\xa9\xb8\xec\x79\xce\x4b\x2b\xab\xe8\x70\xf8\x7b\xeb\xcf\x02\x3e\xee\xd6\x6b\xab\x0d\xba\xe8\xff" + + "\xdd\x9e\x9f\x35\xec\x1e\xc3\x38\x86\x26\x04\xa6\xb1\x7f\xbb\x54\x1d\xfa\x2a\xbb\x7e\x7a\x5d\x7c\xb5\xf3\x9b\x42" + + "\x8a\x71\x61\xdc\x7a\x98\xeb\xf9\x14\x90\x77\x0b\x18\x5a\x7b\xd6\xd1\xb6\x28\x16\xd8\xdb\x1a\x12\x84\xc3\xe7\x2e" + + "\x1e\x03\x1e\x6d\x18\x7d\x57\x25\x49\x86\x97\xd3\xf4\xfb\x21\x89\x5a\x2e\x1c\xf2\xa2\xeb\x3b\x98\x14\xf5\x89\x7c" + + "\xa8\x6a\x92\xe6\xdd\x6b\xf4\x43\x34\x4f\x58\x97\x88\x0f\xbb\x68\x3a\xd7\x18\x56\xb7\xdf\xf9\x5f\xf6\x35\x20\x58" + + "\x77\xc0\xe3\x23\x3e\x56\x56\x26\x2b\x32\x9f\xc3\xfe\xd2\x75\x55\x09\x24\xa8\x52\x61\xd6\x35\x25\x0d\x29\x53\xf0" + + "\x82\xaf\x6e\xbd\x90\xea\x87\x71\xc0\x92\x1d\xa3\xc3\xfb\x5c\x65\xa4\x88\xd9\x7b\xd4\x58\x36\x1c\x0d\xcc\x30\xb4" + + "\x87\xfc\x85\x67\x7f\x18\x8c\x4e\x03\x8c\xab\xcb\x00\xa9\xd4\x01\xb3\x64\x95\x3c\x9a\xef\xd2\x60\x86\x18\x8e\x41" + + "\x59\x16\xb7\x69\x53\x15\x05\x6b\x7f\x57\x5d\xd2\x13\x43\xbc\x74\xbd\xee\x98\xcd\x9b\x1e\x48\x46\x23\xd1\xd4\x2c" + + "\x27\x45\x75\xd4\x84\x0b\x53\xf7\x6a\xdf\xd8\xfb\xff\xd3\x85\x78\x82\x01\x7f\xce\x41\xfe\x89\xc2\x42\x40\x0f\x45" + + "\xb3\x4e\x01\x5c\x90\x8e\xf6\xe3\x39\x9e\xaf\x7e\xc7\x13\xb3\x9e\xdb\x00\xa0\x6a\x1c\xc6\x0b\xa0\xcb\x2e\x2f\xc7" + + "\x24\x87\xd0\x49\x46\xd9\x4d\xc6\x78\x4d\xbc\x8c\x26\x1f\x11\x05\x06\x5a\xaa\xd4\xe4\x05\x2a\x91\xfa\xfa\xaa\xbd" + + "\x7d\x61\xb7\x0f\xf7\x26\xc4\xd4\xa9\x3f\xa5\x61\xe4\x58\x62\x94\xc4\xc3\xd5\x1e\x52\xee\x5b\x76\x48\xf2\xdd\xb4" + + "\xc8\xeb\x5d\x34\xcc\x9a\xd6\x24\x87\x96\xdb\xf3\xdc\x76\xbb\xc5\x4b\x8c\x89\x63\xfe\x11\x9f\x16\xf4\x21\xe6\xbe" + + "\xdb\xb7\xa8\x5f\xfa\x59\xc2\x24\x8b\x5d\xed\x73\x82\xea\x02\xed\x1b\x9b\x35\x55\x7d\x77\x0b\xb4\x4c\x1c\xbd\x91" + + "\x24\x09\xce\x02\x37\x26\xbf\x78\xac\xbb\x61\xdc\x5d\x74\xf2\xd2\x4b\xc5\x39\x47\x08\x3a\xbd\xab\x2e\x5f\x11\x02" + + "\xbe\xd2\x6c\x3d\x5d\x2e\x4c\x77\x69\xec\x66\xe3\x77\xec\x05\x40\xbc\x02\x30\x19\xc1\x10\x78\x3c\x37\x95\xde\xbc" + + "\x83\x88\x5f\x44\x95\x0f\xf2\x18\x42\x51\x37\x37\xd1\xd1\x82\xde\xe7\xe4\x98\xe8\xdd\x40\xd1\x5e\x98\x76\x5e\xf9" + + "\x20\x8e\x18\x38\x26\x01\x41\x7b\xba\xef\xca\x4f\xec\x91\x33\xd7\x9e\x82\xf6\xa8\x8e\x8b\xc5\xe1\xd1\x34\x9c\xe2" + + "\xf0\x60\xbb\x1b\x9d\x39\x85\x9f\x86\x9f\x36\xbe\xa1\x6d\x7c\x96\xdc\x93\x26\x3e\x53\xd2\x5e\x1a\x73\xb1\x64\xad" + + "\x1d\xe2\xed\x76\x2b\x3c\x3c\x61\xee\x56\xc2\xab\x96\x7d\xb8\xb2\x1e\x3f\xe0\x95\x88\x8a\xc5\xe3\x55\x1f\x22\xf5" + + "\x64\x55\xa4\xbd\x59\x65\xd9\x5a\x59\xcf\x3a\x91\x2f\x4c\x49\xfd\x61\xaf\x92\x71\x3b\xcd\x1f\x98\xb2\xad\xab\xc3" + + "\x02\xad\xc4\xe5\x50\xdc\x04\xbd\x0b\x05\xd6\xeb\x15\x8e\xb0\xe4\x77\x91\x24\xda\x0b\x56\x58\xc3\xb7\xdb\xb9\xd1" + + "\xf0\x42\x6f\xf4\xd6\x20\x32\xed\xaa\xaa\xe8\x72\xd3\xd0\xc1\x6e\x02\xd6\x6b\x93\xe0\x8b\x5c\xe6\x54\x1f\xc8\x39" + + "\x2f\x5e\x77\xd1\xfb\x7f\xa5\xc5\x33\xed\xf2\x94\x44\xff\x46\x2f\xf4\xfd\x24\x52\x1f\x26\xd1\xbf\x34\x39\x29\x26" + + "\x51\x4b\xca\x36\x6e\x69\x93\x1f\xcc\xeb\xc1\xd8\xf3\x87\x4b\xcc\x4d\x9f\x2e\x7d\x1e\xaf\xcb\x26\x8a\xe6\x8e\x19" + + "\xc3\xad\x69\x0c\xb7\x26\x81\xae\xaa\x75\x23\xb0\x92\x37\x5a\x35\xab\x05\x96\x29\x12\xd3\xca\xbb\x28\x74\xc2\x1a" + + "\xd8\x08\x2e\xc8\x60\xe8\xaf\x18\xc1\x35\x53\x36\xba\xaa\x45\x78\x8e\xf3\x12\x79\x41\x6e\x9e\x60\x4f\x5a\x3e\x5c" + + "\xf1\x22\xc7\x35\x79\xe8\xc4\x72\xc8\xbd\x9d\x2a\x79\x25\x4d\x53\x7d\xf5\xe8\x33\xf6\xde\x48\x62\x2f\x6e\xf1\xdb" + + "\xf7\x22\x6b\x23\x33\xe2\x98\x4a\x20\x5c\x20\x5e\xc1\x8a\xc7\x3e\x74\xb1\xeb\x93\xa6\x34\x86\xfc\xe1\x4a\xeb\xd2" + + "\x31\xe2\x36\x00\x36\x78\x7a\x4e\x84\x97\xe1\x49\x47\xcb\x5f\x31\xb3\x3d\xde\x93\x1d\xae\xf2\x81\xb2\xc1\x93\x4f" + + "\xde\x8b\x1d\x27\x2b\x7c\xa3\x9d\x77\x8c\x9d\x71\x93\x8f\x66\x2f\x13\x26\x23\xfc\x2c\xae\x87\x15\x57\x27\x41\x4e" + + "\xa0\x7b\x19\xc6\x4a\x22\x99\x79\xd4\x0f\xef\xf9\x38\x11\x66\xc5\xc5\xcb\x4d\x9a\x8b\xf1\x61\x84\x59\x9d\x9c\x38" + + "\xf5\xd7\xf2\xbb\x75\x6d\xf1\x88\xe6\x4d\xec\xf8\x95\xc6\xa9\xbc\x77\x63\xa7\xae\x6a\x15\x1e\x1a\x8b\xc3\xe2\xeb" + + "\x8e\x35\x1e\xf9\x80\xd6\x7c\xb3\x36\xdd\x78\x30\x15\xdf\x67\x72\x5f\x86\x4f\xee\xe0\x1d\x4d\x38\x77\xa8\x47\xa3" + + "\xf4\x37\x8d\x9b\x33\x29\xfe\x6e\xcb\xdc\x34\x4d\xdf\xbc\xcc\xf5\xb8\x95\x89\xed\x29\xce\x91\x95\xad\x1b\xd6\xd0" + + "\x22\xe5\xba\x68\x5a\x0a\x83\x0a\x12\x70\xf0\x54\xb4\xf1\x8e\x81\x02\xc7\x44\x4b\x9d\x8d\x80\x2a\x3f\xc4\x58\x87" + + "\xd8\xa0\x60\x89\xa7\x94\xf2\xa1\x6f\xa6\xf6\x24\x2b\x92\x63\x66\xe9\x8e\xcb\x6f\xfa\x7f\x23\x8b\xd3\x7d\xff\x0f" + + "\xe9\x2b\x65\xe5\x23\x73\x64\xea\x11\x18\x10\xb9\x66\xbc\x18\xc0\x4f\x53\x66\x40\x26\x91\xf1\x61\x47\x0e\x9d\x77" + + "\x90\xdb\x8e\xf7\xdd\x7d\x19\x9d\xa3\x08\x49\xdc\x32\x73\xb5\x07\xb0\x2f\xa4\xb1\x8b\xde\xbf\xb7\x4d\x1f\xa6\x13" + + "\x5d\x55\xeb\x55\xca\x94\xd3\xc2\x06\x79\x26\x1f\x09\x82\x4c\xff\x5a\xfc\x09\x96\x98\x43\x64\xf5\xd1\x36\xc3\x56" + + "\xe6\x10\x8b\x55\xd0\x60\xa0\x45\x08\x87\xea\x91\x3a\x29\x95\xe8\xbd\x83\x63\x2d\xf3\xd5\x18\x27\x6c\x78\x42\xb1" + + "\xd9\x2e\x8c\x92\x8e\x3e\xd6\x75\x91\xe9\x8e\x8a\x2e\x34\xad\xcc\x2b\x36\xe6\x63\x84\xb0\x8a\x88\x4d\x89\x48\x18" + + "\x18\xaf\xbc\x74\x76\x75\x89\x79\x99\xe0\xb5\x59\x02\xbb\x51\xc9\xe0\xd0\xc3\x27\x70\x5d\x92\x7a\xa1\x2d\x4a\x2f" + + "\xb7\x40\x66\x32\x90\x74\x93\x9e\x8d\x33\x0d\xcf\x85\x01\x83\xed\x52\x33\xf9\xde\x6e\xb8\x9e\x21\x2c\x68\xee\xa9" + + "\x2e\x35\x58\x34\x2e\x33\xc0\x29\x90\x98\xcc\x8a\xa3\x2f\x7a\xc6\xc4\x15\xc6\x2d\x10\x57\x4a\x9a\xea\xd2\x52\x73" + + "\xd7\x4a\xc6\x15\x4d\x30\xb0\xa6\xf6\x46\xff\xe5\x46\xb9\x6b\xa7\x4c\xa7\xf7\x34\x0d\x4d\xfe\x2f\x5d\x40\x6c\x53" + + "\x4a\xbe\x24\x29\x5e\x01\x57\x5e\x97\xb1\x15\xe5\x02\x1b\x83\xf1\xb1\xfe\x24\x1f\x18\x47\x0b\xe5\x5b\xe3\xba\xb7" + + "\xa8\x07\xc4\x48\x51\xf0\x37\xec\xd5\x5e\x4e\xbc\xc8\x3e\x46\x93\xe8\x83\xbd\xd9\x16\x2f\xb2\x48\x84\xcb\x9c\x72" + + "\x0c\xdd\xb6\x5b\x5b\xef\xab\xfb\xb7\xee\x10\x78\xc7\xf6\x1d\x46\x19\xb8\xb3\x07\x92\xd2\xf8\x39\x6f\xf3\x7d\x5e" + + "\xb0\x68\xd5\xb0\x01\xf5\x6e\xac\x5c\xd2\xa9\x69\xd3\xd6\x94\x67\xa4\x64\x2f\x8d\xb0\x52\xeb\xab\x7a\xe2\x1f\x11" + + "\x96\x48\x68\x39\x95\x6f\x8d\xa0\x30\xa5\xcc\x21\x09\xd7\x29\xde\xed\xbd\x45\xf6\xa1\x1f\x02\x7c\xd8\x7f\x1c\xc4" + + "\xe4\x05\x0b\xe1\x53\xbc\x45\x82\x82\xd4\x0d\x7d\xbe\x9a\xcd\x38\x90\xcf\xf8\x3a\x46\x7d\xa2\xe4\x8d\xe8\xeb\x72" + + "\xb7\x03\xb8\xf1\xd7\xb4\x26\x09\x68\x49\xa2\xb5\x02\x1f\xd4\xce\x46\x94\x3c\x41\xba\xf9\x59\x89\x1e\x7f\xcf\x06" + + "\x27\xcf\x8d\x82\xbe\x21\x71\x6d\x7d\x63\x0b\x6b\x60\x8f\x7d\x55\x00\x56\x7c\xa0\xaa\x5a\x35\x79\xfb\xc9\xba\xd4" + + "\xd5\xe8\xe1\x11\x19\x00\xd5\x0f\xad\x1c\x8e\xea\xb1\xb6\xf5\x53\x69\x53\x99\x33\xe0\x6d\xe7\xc5\x56\xe6\x03\xd0" + + "\x57\xbd\xf5\x8c\x9c\xd8\x41\x1e\xa9\x5e\x33\xed\xbe\x7e\x47\xd4\x6c\xf0\x20\xd0\xf0\x47\xcb\x78\x7f\x5a\x5b\x40" + + "\x51\x32\x3c\x66\x05\x0e\x6b\x25\xc9\xec\x23\x93\x79\xf8\x33\x62\x77\xae\x40\x34\x63\x20\xcf\xaa\x9b\xb0\x09\x3d" + + "\xea\xaa\x7a\xc2\xb7\x3c\xf9\xcf\x43\x53\x9d\x3f\x58\x55\x7f\xe4\x4f\x7d\x55\x66\x09\xab\xfc\x63\xe0\x8b\x62\x5d" + + "\x15\x89\x19\xe6\xb6\xa6\xc9\xde\xae\x9b\xea\x98\x67\xbb\xff\xf2\x3f\xff\xd8\xd7\xf3\x67\x69\xe0\xa6\x7f\xca\xd3" + + "\xa6\x6a\xab\x43\x37\x55\x55\xb6\x1d\x69\xba\x3f\xf4\x6a\xd7\x76\xcd\x0f\xdf\x7f\xf7\x90\xf0\xff\xfb\x9e\x55\x47" + + "\xcb\x0c\x94\x25\xaa\x2c\xfa\x6f\x02\xff\xcf\xaf\x35\xfd\x61\x66\x36\xaf\xa1\x35\x65\x87\xd5\xd8\xff\xc6\x2f\x4e" + + "\xdd\x1a\x46\x1e\x0c\x06\xf3\x11\x23\x8f\x86\xbc\x51\xed\xb8\x88\x50\xe9\xad\xee\xa2\x76\xb7\x57\xf0\x66\xb5\xe3" + + "\xca\xe5\xd0\xbc\xd5\xdb\xd5\x2e\xb0\x69\x77\x50\xbb\xc4\xa3\x76\x0f\xf7\x56\xbb\xe1\x78\xa2\x59\xe0\x4c\x58\xee" + + "\xdc\xcd\x1b\xdb\x65\xd5\x8e\xf8\x20\x7b\xae\xd6\xfc\x32\x3d\x16\xaf\xf5\x29\x4f\xab\x32\x4e\x4f\xf4\xb9\xa9\xca" + + "\xd8\x9c\x1e\x3d\xa0\xbc\x1f\x35\xaf\x4b\x41\x33\x40\xd3\x53\xd0\x4b\x43\x1c\x06\xb1\x3a\x56\x01\xf8\x95\xb6\xf4" + + "\xca\x4b\xb6\x7e\xc1\xfd\x9a\x5b\xda\xa8\xf8\x12\x67\xb5\x7d\x91\x0c\x10\x7d\x0b\x17\x96\xb3\xd2\x5e\x54\xa2\x52" + + "\xb9\x23\xa3\xd5\xaa\xe2\x03\xde\x6a\xaf\x91\xba\xda\x7c\xd6\x4f\x89\xc8\xbf\xad\xa0\xb6\xb5\x85\xa1\x76\x26\xd0" + + "\x45\xa4\xaf\xfe\xdd\x9e\x1e\xaa\x86\xea\x21\xce\xef\xff\x32\x4f\x16\xdb\xef\x03\x1a\xe7\x46\x27\x36\x7a\x5e\x66" + + "\x79\x4a\xba\xaa\x69\x3d\xba\xa6\xc2\x8e\x09\x12\xc1\x1a\x76\x7f\x56\xc0\xaf\x5a\xf3\x42\xf7\xdb\x82\xf2\x10\x00" + + "\x87\xc3\xbd\x2b\xd7\x03\x86\x18\xf7\x45\xae\x7b\xf3\x50\xf9\x35\xb7\x5a\xef\xcf\x59\xa2\xc7\xf8\x67\xe0\x88\x55" + + "\xdf\xae\x5e\x76\xb1\x3a\x3a\xe4\x3d\x8c\x0c\x77\xd4\xa2\xbf\x6c\xf1\x42\xdd\x74\x27\x1f\x1d\x7b\x3d\x7a\xb8\x51" + + "\x6e\x0c\xa0\xda\x0d\x64\x00\x57\x29\xb2\xbd\x73\xa3\xbd\x73\x64\x4f\xc3\x7f\x6f\x73\x50\x35\x9e\x0c\xda\xa3\x28" + + "\x2a\x31\xf4\xef\xa0\xda\xcc\xf5\xa8\xeb\xca\x50\x1b\x78\x65\x85\x0f\x28\xe3\x62\x84\x75\x11\xe2\xae\xae\xb9\xb3" + + "\x99\xea\x20\x9b\x46\x09\xe8\xa1\x08\x04\xb5\x69\x43\x69\xc9\x63\x41\xea\x8c\x94\x76\x36\xec\xd7\x9a\x58\xde\x3a" + + "\xb3\x0c\x47\xbe\xc4\x09\x35\xa9\x25\x0b\xfd\xc8\x9a\x34\x73\x62\x1f\x19\xae\x96\x16\xea\x9c\xd7\x1b\x9b\x09\xe7" + + "\x16\x66\xe7\xcd\x09\x65\x75\x5d\x45\x61\x13\x8a\x56\x93\x9a\x44\xd0\xaa\x80\xf2\x4b\x3d\x9f\x73\xe3\x25\x14\x5b" + + "\xfe\x65\x6a\x2d\x2a\x22\xc3\xee\xbe\xd3\xb3\x3f\x0c\x61\x0e\x75\xb8\x32\x96\x4f\xc9\x3e\x0d\xdf\x78\xf0\x79\x12" + + "\x8d\x40\xf1\xf9\x80\x79\x22\xfd\xc7\xae\xaa\x8a\x3d\x69\x34\x64\xf9\x4d\x80\x46\xd3\xb4\xa0\xa4\x39\xe4\x2f\x0a" + + "\x4a\x7d\x00\xd4\x7a\x91\x92\xbc\xa4\x4d\x7c\x28\x2e\x79\x36\xc0\x1a\xdf\x07\xaa\xb2\x40\x80\x6a\x44\x06\xb0\xac" + + "\x88\x4f\x55\x93\xff\xdc\x97\x14\x51\x36\x10\xb6\x0a\x00\x33\x2c\xce\x0a\x4a\xf9\x07\x5d\x4e\x3e\x18\x40\x0a\x1e" + + "\x50\x55\xb8\xda\x47\xc5\x6a\x49\x9e\x15\x44\xff\x1b\x50\x29\xc9\xf3\x9e\x34\xea\x4e\x20\x04\xd3\xbe\x43\x5a\x7d" + + "\x01\x3f\xa0\x0c\x24\xa4\x7f\x37\xc0\x0d\xb2\x43\x71\x4d\x8e\x1a\x15\xfe\x37\x28\x96\x17\x14\x15\x05\xf0\x49\x81" + + "\xa9\x2d\x0e\xf1\x9b\x17\x08\x57\x4c\x7f\x4f\xd9\xdc\xe4\xb8\x5e\x85\x4d\xcd\x34\x94\x30\x48\xe5\xdc\xba\x32\x10" + + "\x09\x51\x15\x54\x07\x86\xde\x0e\xe8\x60\xad\x1f\xad\xee\xb2\xbb\xc7\xea\x0f\x63\xb3\xbb\x17\x06\x7b\x41\xfa\xa4" + + "\xa6\x2c\x36\xd9\x81\x23\xd3\xf6\xce\xbd\x6e\xda\xf4\x2b\x1e\xf1\xb0\xb8\x57\x3b\x5c\xfa\x8b\xdd\xf0\xa2\x5b\xf4" + + "\x4f\xf9\xb9\xae\x9a\x8e\x94\x9d\x06\xad\x62\x52\x02\x98\xfd\x6d\xc3\x9e\x72\x71\xbd\x40\xdb\x19\x42\x00\xdb\x93" + + "\xd8\xff\xd3\x1b\x83\x40\xe6\x25\xdb\x6d\x90\x2f\x73\x5b\x3b\x0f\xea\x94\x55\x3f\x7f\xab\xfa\xfb\xc9\x6b\x17\x25" + + "\x9f\x93\x88\x00\x5f\xc2\x38\xba\x60\x4d\xf9\xb8\x9b\x84\x1e\x78\x00\x71\x51\xce\x47\x50\xb3\xc9\xe1\x90\xbf\x60" + + "\xf7\x40\xa4\xb3\xf1\xed\x37\xf1\xb9\x8d\x9f\x73\xfa\xb5\xc7\x84\x3e\x5e\x46\x9f\xf3\x94\x72\xbf\x43\x92\x13\x92" + + "\x89\x8b\xe3\x24\x52\x7f\x9c\x33\xf0\x47\x7b\x06\x7f\xbc\xb4\x41\x4c\x0e\x54\xb9\xd2\x01\x0a\xc5\x31\xe6\x2e\x37" + + "\xf6\x4d\x40\xf7\x7a\x3e\xf0\x62\x91\x38\x67\x36\x09\xf5\x0d\x21\xd1\x9e\x2d\x12\xed\xd9\x26\xa1\xbe\x21\x24\x5e" + + "\x5a\x8b\xc4\x4b\x6b\x93\x50\xdf\xb0\xb1\x86\xcb\x6a\x38\x36\x2f\xcf\xbe\x45\xbb\xcd\x7a\xa3\x7c\x42\x43\xf2\x3e" + + "\x6d\x67\xae\x03\x33\xb1\x6e\x2c\x56\x2c\x41\x9b\x11\xb8\xb8\xa9\xbe\x22\x35\x64\x00\x6d\x12\x75\xa7\x31\x2a\x29" + + "\x2d\x0a\x8b\xcc\x95\x8d\x07\x02\x1d\x13\xc1\xb5\x94\x79\x8f\x19\xa4\xc5\xc7\xfb\xd0\x46\x99\xd7\x8a\x46\xea\x31" + + "\xaf\x92\xf0\x35\x84\x3a\x2c\xb9\xdd\xce\xac\xca\xe5\x6d\x8d\xeb\xf4\xc5\xc2\x72\xe8\x0b\x0e\x37\xaa\x2f\xbd\x2d" + + "\x01\xfa\xe2\xa0\x12\xa2\x2f\x37\x49\xe4\x76\x25\xba\xad\xba\x37\x68\xd6\x5b\x2a\xbc\xa3\xba\xf1\x0b\x3c\x46\xe5" + + "\xb3\xd9\x76\x6b\xd5\x7e\xce\x6e\xd1\x37\x0b\xcb\xa1\x6f\x38\xdc\xa8\xbe\xf5\x13\x19\xd0\x37\x07\x95\xeb\xf4\xed" + + "\x1a\x91\xdc\x43\xe1\xae\xaa\xef\x2e\x1a\x77\x43\x8d\x77\x54\xb9\x19\xbb\xc7\x63\x54\x24\xaf\x8d\x5d\xa7\x5d\x16" + + "\x96\x43\xbb\x70\xb8\x51\xed\xea\x7d\x26\xa0\x5d\x0e\x2a\xd7\x69\x97\xa3\xf5\xf7\x50\x24\x17\xe9\xbb\xe8\x8c\x9f" + + "\xf8\x9b\xd5\x03\x9f\x68\xb9\xdb\x6c\xbb\x1d\x96\xa7\xf5\x36\x03\x2b\xaa\xb1\x66\xab\xeb\xaa\x19\x1f\x55\xa2\x1e" + + "\xcb\x4a\x5d\x57\x8f\xd6\x13\x82\xa4\xa5\x9a\x6e\x92\xaa\xf3\xea\x26\x17\x07\xc8\xc3\x3c\xd8\x01\x1e\x21\x71\xe5" + + "\xc0\xc5\x10\x1d\x63\xd7\x09\x3a\x3a\x7c\x19\xa6\x36\x82\xdd\xb4\xdc\x83\x58\x47\xbe\xda\xef\x77\x49\xed\xda\x01" + + "\x6f\x60\x83\x31\xfd\x46\x3e\xae\xb6\x0e\x28\xfe\xfd\xe4\x72\x0f\x83\x02\x88\x8b\x01\x82\xf5\x3c\x3e\x46\xfe\x4f" + + "\x00\x00\x00\xff\xff\x47\x37\xb0\x07\xc9\x28\x02\x00") func gzipBindataAssetsCssBootstrapmincss() (*gzipAsset, error) { bytes := _gzipBindataAssetsCssBootstrapmincss info := gzipBindataFileInfo{ - name: "assets/css/bootstrap.min.css", - size: 141513, + name: "assets/css/bootstrap.min.css", + size: 141513, md5checksum: "", - mode: os.FileMode(511), - modTime: time.Unix(1521004692, 0), + mode: os.FileMode(511), + modTime: time.Unix(1521004692, 0), } a := &gzipAsset{bytes: bytes, info: info} @@ -823,158 +821,158 @@ func gzipBindataAssetsCssBootstrapmincss() (*gzipAsset, error) { var _gzipBindataAssetsFaviconico = []byte( "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x0b\x70\x55\xc7\x79\xde\x7b\xce\x45\x12\xb2\x90\xc4\xc3\xe6\x61" + - "\x3b\x90\xf8\x31\xc4\x19\x6c\x32\xe3\xc4\x34\xe3\xc6\x34\x6d\xed\xd4\x69\x62\x32\x49\x9a\xa6\x75\xea\x36\x33\xee" + - "\xd8\x9e\xb4\x75\xdc\x7a\xa6\xc5\x31\x02\xa6\xd3\x84\x47\x28\x6f\x3b\xc6\x3c\xcc\xeb\x9e\xbd\x08\x21\x04\x92\x28" + - "\x12\x0e\x08\x5b\x3c\xec\x02\x92\x78\x08\x21\x09\x41\x25\x24\x10\xe8\x71\xb5\xe7\xdc\xd7\xb9\xf7\xef\xfc\xff\x9e" + - "\x73\x74\x25\xdd\x97\x24\x82\x33\x1e\xce\xcc\x3f\x7b\xee\x9e\xdd\xff\xff\xf6\xdf\x7f\xff\xfd\xf7\xdf\xcb\x98\x8b" + - "\xa9\x2c\x3f\x1f\xcb\x19\xec\x15\x37\x63\x5f\x67\x8c\xcd\x98\x21\x7f\x6b\xf9\x8c\x6d\x72\x33\x36\x7b\xb6\xf5\xfb" + - "\x11\xc6\x9e\xbd\x97\xb1\x99\x8c\xb1\x7c\x6c\xc7\x64\x3d\x3d\x6e\x76\xdb\x1f\xe1\x75\xab\x42\x53\x7e\x22\x3c\x6c" + - "\x91\xf0\xb0\x02\x22\xae\x14\x08\x8f\xab\x40\xec\x64\x92\xf0\x5d\x53\xfe\x59\xec\x64\x5f\x15\x1e\xa6\x08\x4f\x7f" + - "\x7f\xdf\x7a\x96\xa1\x97\x3c\xb8\x3f\x78\xfa\x0d\x08\x9e\x5d\x08\xc1\xda\x5f\x82\x51\xf6\x65\x30\xca\x67\x41\xf0" + - "\xcc\xbf\x11\x19\x07\x1e\x07\xbd\x78\x2a\x18\x65\x8f\xb5\x0b\x4d\x7d\xad\x6f\x07\x73\x0b\xcd\x45\xfd\xbb\x17\xb3" + - "\x0c\xa3\x62\xce\xfe\xa8\xd1\x0a\xf8\x98\x6d\x25\x10\x38\xfe\x53\x88\xdc\x3a\x01\x66\x6b\x11\x11\xbe\x07\x8e\xfd" + - "\x2d\x84\x2e\x2c\x05\xff\xd1\x79\x3d\xc2\xc3\x7e\x20\x78\x06\x13\x5c\x89\xe9\xdf\x06\xd1\x50\x2f\x04\x4e\xfc\x0c" + - "\xcc\x6b\xa5\x60\x1c\xfd\x21\x74\x6c\x1e\x47\x84\xef\x58\x17\xf8\xe4\x65\x30\x6f\x54\x81\x71\xe0\x89\xea\xbe\x2d" + - "\x6c\xd2\x80\xfe\xfe\x76\x30\x6f\x1c\x81\x60\xed\x7c\x08\x9e\x5d\x0c\x2d\xeb\xc7\x41\xed\xd2\x29\x50\xbb\x74\x32" + - "\xbd\x63\x1d\x7e\xc3\x36\xa1\x73\xff\x19\x14\x1e\x36\x4f\x78\xc7\xc4\xf4\xef\x80\x70\xd3\xfb\x10\x6e\x5c\x0f\xdd" + - "\x65\x73\xe1\xdc\xf2\x89\xd0\xb1\x25\x0f\x6e\x7c\x90\x07\xe7\x7f\x33\x81\xea\xf0\x5b\xb8\x79\x13\x61\xd0\x8b\xa7" + - "\x2c\x09\x7c\xfc\x57\xac\x7b\x11\xf6\x7f\x6a\x5f\xd4\xb8\x06\xa1\xfa\x15\x10\x6e\x7a\x0f\x3a\xb4\xc7\xa0\x61\x55" + - "\x3e\x04\x8f\xfc\x39\x84\x3e\xfa\x4b\x68\x5c\x93\x4f\x75\xf8\x2d\x74\x71\x05\x44\x45\x13\xea\x54\xeb\x7c\x85\xa9" + - "\x48\xf8\x1e\x15\xcd\xf4\xcd\xee\x7f\x71\x65\x3e\x04\x3e\x7c\x86\x78\x5c\x5a\x1d\xd3\xbf\x7e\x05\xa0\x2c\x94\x89" + - "\xb2\x03\xd5\x3f\x66\x88\x05\x31\x21\x36\x1b\xff\xd9\xe5\x13\xe1\xda\xc6\x5c\x68\xdf\x94\x4b\x63\x71\xf0\x37\xbd" + - "\x0f\x38\x56\x1c\x33\x8e\x1d\x75\x80\xba\x40\x9d\x0c\xd6\x5f\xcd\x92\x29\x44\x83\xf5\x87\xba\x76\xfa\x73\x85\xe1" + - "\x5c\x18\x07\x9e\x38\x86\x18\x68\x8e\xac\xf9\xbb\xbe\x39\x87\xc8\x99\xbf\x13\x3f\xa3\x39\xc6\xb9\x8e\xed\x4f\xb6" + - "\xe0\x61\x3f\x40\xdb\x40\x1b\x41\x5b\x19\x62\x3f\xc7\x7f\x4a\xb6\x85\x0f\xda\x9a\xdd\x9f\xd6\x80\xe6\x62\xd2\x26" + - "\xd5\xd7\xd0\x46\xc9\x56\x0f\x3c\xde\x6f\xbf\xe5\xb3\xc8\xa6\xd1\xb6\xc9\xc6\x4f\xbf\x01\x68\xf3\x68\xfb\xce\x3a" + - "\xf2\x30\x26\x76\x32\x85\xd6\x08\xae\x95\xc1\xeb\x87\xd6\x14\xb3\x69\x11\xad\x39\xaf\x5b\x1d\xed\xfa\x05\x60\x8c" + - "\x65\x32\xc6\x54\x8b\x5c\x31\x64\x3d\x0b\x63\xe8\xb0\x45\x2d\x56\xdf\x99\x96\x8f\x99\x1b\xeb\x67\xf2\x47\x8b\xea" + - "\xf3\xf9\x08\xae\x22\xe5\x09\xae\x4e\x17\x5c\xfd\xc2\x28\x69\x8a\xe0\xca\x58\xb4\x3d\xdb\x17\xa6\x29\xff\x5f\x04" + - "\x57\x5b\x85\xe6\xba\x92\x90\xb8\x1a\x43\x4a\x4c\xbd\x62\xd7\xb7\x08\xae\xd6\x0b\xae\xfe\x8f\xe0\xea\x9b\x38\x1e" + - "\x1f\x1f\x4b\xfe\x34\xb5\x7c\xa5\x40\xec\xca\x02\xbd\x64\x3a\xe8\xfb\xbe\x38\x94\x4a\xa6\x83\xf0\x66\x82\xd0\x14" + - "\x10\x9a\x0b\x44\xe1\x38\x5c\x2b\x44\xf8\x4e\x75\x5c\x01\xe1\x75\x03\xf2\x11\x9a\x2b\x2a\xb8\x52\x2b\xb8\x3a\x4f" + - "\x68\x8a\x92\x0c\x03\xc9\xf7\xb0\x02\xa3\xfc\x2b\x10\xe9\xae\x85\xa8\x7e\x15\xa2\xfa\x95\x18\xba\x0a\xa1\xb3\x8b" + - "\x49\xbe\xbe\xe7\x5e\x08\xfe\xef\x3f\x81\xd9\x51\x09\x91\xbe\x4b\x44\xf8\x8e\x75\xf8\x4d\x70\x37\x04\x3e\xfe\x11" + - "\xf9\x14\xbd\x68\x3c\xe2\xe8\x14\x5c\x7d\x49\x78\x99\x2b\x11\x06\x47\xfe\x81\xd9\x10\x0d\xde\x82\xc1\x8f\x79\xe3" + - "\x30\xe8\x7b\xa7\x81\x51\xfa\x28\x98\xd7\xca\x00\xa2\xa6\xfc\x80\x65\xcc\x3b\x7e\xc3\x36\xfa\xde\x07\x08\x93\xd9" + - "\x5a\x0c\xfa\xfe\x87\x41\x68\xac\x43\x70\xf5\x59\x92\xe3\x1d\xea\x1a\x92\xc9\x8f\x06\x3a\xc1\xff\xe1\x5c\xda\x67" + - "\x91\x27\x3e\x91\xde\x0b\xe4\xaf\xfc\x47\x5f\x20\xc2\x77\xac\x23\xac\x1d\x95\xd4\xd6\xff\xe1\x9f\x10\x2f\xfa\x5d" + - "\xf2\x05\xc4\x70\x4c\x70\xf5\x7e\x94\x35\x1c\xf9\xa1\xc6\x77\x68\x3e\x43\x17\x57\x4a\xfe\xe8\xc3\xcb\xbe\x8c\xfc" + - "\xa0\xcf\x23\x09\xdf\xb1\x0e\xbf\x51\x9f\x8b\x2b\x65\x9f\xc6\x77\xe8\x37\xee\x4f\x62\xd7\x58\xb4\x8f\x05\x3e\x9e" + - "\x35\xc4\x1e\x13\xc9\x8f\x06\xbb\xc0\xa8\xfc\x23\xf0\x1f\xfa\x63\x88\x86\xba\x21\x72\xeb\x24\x18\xfb\x1f\x82\xde" + - "\x1d\x2e\x68\xdd\x30\x0e\x1a\x56\x4f\x24\xc2\x77\xac\xc3\x6f\xd8\x06\xdb\x62\x1f\xec\x8b\xef\x10\xd6\xc1\xff\xd1" + - "\xf7\x11\x67\x83\xe0\xea\x97\x06\xeb\x20\x91\x7c\xd2\xdd\xee\x3c\x08\x37\x6f\x04\x30\x0d\x08\x7c\x34\x8f\xe4\x34" + - "\xae\x99\x00\xa7\x7f\x3d\x0d\x4e\xfd\xea\x7e\x22\x7c\xc7\x3a\xfc\x86\x6d\xb0\x6d\xb8\x69\x23\xf5\xb5\xe7\xcc\x6c" + - "\x3f\x00\x62\x77\x6e\x54\x68\xae\x57\xad\xf5\x96\x52\x7e\xb0\x6e\x01\xe8\xfb\x66\xd0\x1a\x30\xaf\x95\x83\x28\xcc" + - "\x81\x2b\xef\xe6\x92\x3c\x24\x8a\x63\x96\x4d\x71\x7e\xe3\x37\x6c\x83\x6d\xb1\x0f\xf6\x0d\xd6\x15\x48\x5d\x86\x7c" + - "\x64\x47\xc2\xc3\xf6\x0a\xae\x66\xc6\xea\x20\xae\xfc\x48\x08\xfc\x55\xdf\x05\x7f\xd5\x77\x00\x22\x41\x08\x7e\xfa" + - "\x2a\x74\x6d\x53\xa1\x6e\xf9\x64\x92\x75\x69\xcd\x44\xb8\xb9\x35\x13\x6e\x6d\xcb\x80\xe6\x75\xe3\xa9\x0e\xbf\x61" + - "\x1b\x6c\x8b\x7d\xb0\xaf\xbf\xea\x7b\xc4\x8b\xec\xe2\xec\x22\x9c\x83\x66\xc1\xd5\x19\xa9\xe4\xd3\xdc\x1f\x98\x0d" + - "\xc1\x33\x6f\x42\x34\xec\x03\x7f\xe5\x1c\x68\xdb\x30\x96\xe4\x9c\xfb\xcd\x7d\xd0\xbd\x63\x0c\xe8\x85\x63\x41\x2f" + - "\xbc\x07\x7a\x3d\x6e\xa8\x5f\x39\x89\xbe\x61\x1b\x6c\x8b\x7d\xb0\xaf\xe4\xd9\x65\xd9\x6e\x19\x88\x5d\xd9\xba\xd0" + - "\x5c\x73\x53\xca\xd7\xff\x0f\xf4\xfd\x0f\x41\xa8\x61\x35\xf9\x1f\x7d\xdf\x74\x68\x5e\x97\x47\xf3\xdd\xf2\x4e\x1e" + - "\xc9\x0d\x9f\xfc\x3b\x30\x4f\xbd\x02\xc6\x9e\x09\xd0\xba\x21\x07\x4e\xfd\x6a\x1a\xb5\xc1\xb6\xe4\xb3\x1a\x56\x13" + - "\x0f\xe4\x25\xd7\xed\x39\x5c\x9b\x51\xa1\xb1\x17\xe3\xc8\x7f\x0b\x63\x13\x5c\xef\xd4\xb6\xaf\x91\x7c\x6b\xf8\xf2" + - "\x16\x5a\xdb\x62\xcf\x64\xb8\xb4\x7a\x3c\xc9\x68\xdb\x90\x0d\xfe\xb2\x87\x01\x2e\x2d\x07\x68\x5a\x05\x81\xca\x27" + - "\xe1\xfa\xe6\x4c\x39\x2f\xab\xc7\x53\xdb\x88\xaf\x9e\xfa\x22\x0f\xe4\xe5\xc4\x47\xa5\x8f\xa2\x0d\xfc\x22\x8e\xfc" + - "\x5f\xe0\x37\x3b\x5e\x4f\x2e\xff\x1e\xf0\x97\x7e\x11\xa2\x0d\x4b\x00\x9a\x56\x42\xe0\xe0\x13\x70\x7d\x53\x56\x6a" + - "\xf9\x81\x4e\x8a\xbf\x70\xac\x43\xe4\x6b\xec\x45\xd4\x0d\xea\x28\xbe\xfe\x67\x38\xfa\x6f\x5e\x97\x2f\xfd\xcb\xd1" + - "\xe7\x21\x74\xec\x87\xa0\xef\xce\x81\xab\xbf\x1d\x67\x7d\xcb\xb3\xd6\xcc\x50\xfd\xe3\xdc\xe2\x1c\xcb\xb3\xd0\x60" + - "\xf9\xae\xb9\x68\x1b\xe4\xdf\x53\xd8\x1f\xda\x39\xda\xbe\xee\x55\x41\xf7\xba\xc9\x16\xcf\xaf\xb8\x2f\xa5\xfd\x25" + - "\x95\x8f\x6b\x42\x63\xcd\xb8\xcf\x25\x5c\x7f\x5b\xe5\xfa\xc3\x39\xb8\xf0\xdf\xf7\x42\xfb\xc6\x7b\xa0\x63\x53\x36" + - "\x5c\x5c\x35\x29\xad\xf5\x97\x42\x7e\x26\xfa\x06\xda\x37\xc2\xbe\xb4\xfc\x0f\xd2\x99\x25\xd3\xd2\xf2\x3f\xc9\xe5" + - "\x2b\xf6\x1c\xbc\x86\x3e\x12\x7d\xe5\x50\xff\xeb\x8f\xe3\x7f\x25\x0d\xf5\xbf\xfe\x21\xfe\x37\x99\xfc\x18\x1d\x7c" + - "\x09\xf7\x08\xdc\x2b\xc0\xd4\x69\xef\x30\x2a\x46\xb9\xff\x58\x73\x9f\x5a\xbe\xc2\x7c\x1a\xed\x8d\x0b\x70\xaf\xc4" + - "\x3d\x53\xee\xbf\xef\x8e\x7a\xff\x4d\x47\x7e\x8c\x0e\xee\xc7\x58\x01\x63\x06\xd4\x1d\xf6\x41\x9b\x18\x51\xfc\x61" + - "\xf9\xb2\xb4\xe5\x7b\x55\x1b\xc3\xb3\x18\x33\x61\xec\x84\x31\x14\xf1\xdc\xfb\x40\x5a\xf1\x97\x4e\xf1\xd7\x34\x8a" + - "\xd9\x06\x3f\xa9\xe4\x3b\xb6\x48\xb1\xa2\xfa\x12\xc6\x8e\x18\x43\x62\x2c\x89\x31\x25\xc6\x96\x29\xe3\x4f\x6f\x26" + - "\xc5\xaa\xf1\x62\x58\x8c\x6d\x31\xc6\x4d\x26\xbf\x7f\x3d\x60\xcc\xac\xce\xa3\x18\x1a\x63\x69\x8c\xa9\xb9\x5b\xc6" + - "\xd8\x14\x7f\xe7\xc4\xc4\xdf\x39\xb2\x0e\x63\x73\x8c\x91\x93\xc5\xf0\xc4\x47\x49\x2a\x9f\x30\x68\x0a\xf3\x15\x65" + - "\x31\x6b\xaf\x7e\xd3\x3a\x53\xd4\x5b\x67\x8c\x44\xe7\x0f\x49\xc9\xcf\x30\xad\xd6\x59\x27\xa9\xfc\x58\x5d\xf4\x69" + - "\x14\x2f\x8d\x95\x67\xab\x51\x9f\xcf\xa6\x5b\x67\xbd\xb4\xe4\x7f\xde\x1f\x7b\x6d\x1c\x66\x2a\x1c\x66\x0c\xe9\x99" + - "\xc3\x8c\x4d\xb7\x28\xcf\xa2\x4c\x8b\xd4\x74\xa8\xc5\xa2\x1e\x8b\x02\x16\x99\x8c\xa9\xc0\x48\x90\x6a\xcb\x9d\xc9" + - "\x18\x9b\xcd\x18\xfb\xfb\xd8\x3c\xc5\xc3\x9f\xb5\x56\xee\x3e\x77\x9f\x3f\xcc\xc7\xda\x1f\x1f\x16\x5c\x7d\x5b\x70" + - "\x75\xa1\xe0\x6a\xc1\xef\x89\x6c\xde\xff\x2a\xb8\xfa\x37\x82\x2b\xb3\x05\x57\x72\x7a\x35\xc6\x0c\x2d\x79\x3e\x29" + - "\x0d\xfc\xdf\x16\x5c\x0d\x0a\xae\xc2\x1d\x22\x53\x70\xb5\x53\x70\xf5\x20\xed\xeb\x5c\xc9\xc7\x58\xc3\x48\x33\x3f" + - "\x97\x18\xbf\x42\xb1\x57\x5a\x84\x6d\x07\x60\x4a\xd2\x37\x6e\x5b\x97\xfd\x1b\xf5\x56\x2a\xb8\xfa\x24\xec\x67\x4c" + - "\xe7\xc3\x1b\x83\x83\x5f\x73\x05\x31\xc6\x0b\xd6\xbe\x45\xe7\xf2\x64\x14\x3c\xbb\x08\x8c\x8a\xa7\xfa\x71\x21\xc6" + - "\xc2\x1c\x30\x0e\x7e\x0d\x02\x27\xfe\x81\x78\x20\xe1\x3b\xd6\xc9\x78\x84\x39\xd8\xf5\xe2\x29\x60\x94\xcd\x04\xe1" + - "\xcd\x8a\x1d\x47\xa3\xe0\xea\x0b\x7e\xce\x5c\x7a\x8a\xfc\x64\x7c\xfc\x2c\x48\xf1\x75\xb8\x6f\x48\x9c\x37\xf8\x31" + - "\xdb\x4a\x64\x9c\x84\xb2\xbd\x19\xe0\x3f\xf2\x17\x60\xb6\xee\x85\x68\xe0\x26\x40\x34\x12\x13\x20\x46\xa8\x0e\xbf" + - "\x61\x1b\x6c\x8b\x7d\xf4\xe2\xc9\x10\x6a\x58\x0b\xe1\xcb\x5b\xc1\xa8\xfc\x46\xff\x9c\x70\xb5\x0d\xc7\xd0\xa3\x65" + - "\x33\x91\xe6\x3c\x0c\x17\x7f\xa4\xeb\x14\xc5\xb4\xc2\xc3\xe8\x3c\x43\xb1\x65\xb0\x3b\xe5\x98\xb1\x0d\xb6\xc5\x3e" + - "\xf2\x7c\x30\x13\x22\xdd\x35\x10\xf5\x5f\xa7\x73\xa9\x28\xbc\xc7\x1e\x43\x93\xe0\xca\x53\x14\x73\x16\xa6\x8e\x89" + - "\x86\x83\x9f\xce\x41\x55\xdf\x23\xec\x62\x77\x2e\x9d\xc7\xed\xb3\xa8\x1c\x5c\x10\xa2\xa2\x05\x22\xb7\x3e\x21\xc2" + - "\x77\xac\xeb\xff\x1e\xa2\x3e\xd8\x17\x79\x20\xaf\x68\xa8\x87\xda\x84\xea\x97\xcb\xbc\xb3\x1c\x43\xa5\xe0\xea\xe4" + - "\x74\x62\xba\xe1\xe0\x0f\x35\xac\x91\x36\xc0\xdd\x10\xac\x7b\xbb\x1f\x7b\x34\x0c\x66\x47\x05\xdd\x3d\xe9\xa5\x8f" + - "\x80\x5e\x34\x51\x52\xe9\x23\xf2\x3e\xaa\xa3\x82\xda\xd8\x63\x08\xd6\xfe\x52\xc6\xee\xde\x0c\xe2\x69\x8f\x1d\xcf" + - "\x4d\x92\xbf\x1a\x45\x7f\xeb\xf3\x32\x57\x5f\x0a\x3b\x4a\x17\x3f\xea\xd2\x28\x9f\x25\xf5\x76\xe4\x3b\xfd\x79\xad" + - "\x70\x1f\x84\xce\xff\x17\xe8\x7b\x26\x59\xfe\xc6\xca\xdb\xdb\x3e\x46\x63\xf4\x0d\xdb\xd8\xbc\xe9\x0c\x78\xe4\x79" + - "\xe2\x85\x3c\x69\x9e\x68\x7e\x7b\x21\x50\xfd\x63\x7b\x4d\x5f\x13\x5c\xfd\x7a\xca\x73\x45\x9a\xf8\x69\x7e\xad\xb5" + - "\x67\xde\xa8\xea\xd7\x59\xdd\x02\x79\x0f\xc1\xa5\x1f\xe9\xd9\x39\x06\x6e\x6e\xcd\x22\xc2\x77\xb9\x36\x5d\xd4\x06" + - "\xdb\xda\xf6\x64\xde\x38\x42\xbc\x90\x27\xf2\x76\x4c\xac\xbb\x86\x72\x44\xd6\x18\xde\xd3\xb9\xcb\x9d\xcc\x1f\xa5" + - "\x83\x9f\xf2\x5c\x15\x73\x48\x5f\x81\x4f\x5f\x75\xce\xa8\xe1\xcb\x5b\x1c\x9b\x45\xac\x57\xde\xcd\xa3\x5c\x66\xcd" + - "\xd2\x29\x44\xf8\x8e\x75\x72\x1c\x0a\xb5\xc5\x3e\x92\xa9\x49\xbc\x68\x0e\x2a\xe6\x0c\x38\x5b\x87\x2e\x2c\xb1\xce" + - "\x86\x6a\xbb\xe0\xea\x57\x93\x9f\x2d\x53\xe3\xa7\x5c\xcf\xae\x6c\xb2\x03\xb3\xb3\x5a\xea\xa9\xaf\x51\x9e\x5d\x35" + - "\x06\xdd\xdb\x33\x9c\x9c\x53\x3c\xc2\x6f\xd8\x86\xfc\x4e\xf9\x57\x9c\xfc\x9f\xd9\xf9\xb1\xb4\xbb\xc2\x6c\x30\xdb" + - "\xcb\xfb\xf5\xa5\x5f\x95\x79\x41\xb9\x67\x2c\x12\xdc\x9d\xf0\xce\x2a\x1d\xfc\xe4\xdf\xc8\x5f\x7c\x97\x72\xf1\x54" + - "\x57\xf3\xef\x64\x17\xbd\x1e\x37\xe5\x6c\x12\x61\xb7\x09\xdb\x60\x5b\xec\x83\x7d\xe5\x00\x0c\xe2\x89\xbc\x51\xc6" + - "\x00\x99\x75\x0b\x6d\x1b\x3a\x2e\xb8\x32\x61\xa4\xf8\xf1\x37\xe5\xe9\x35\x06\xa1\x86\x55\x96\x7e\x5a\xc0\x28\x9d" + - "\x49\x75\xad\xef\x8d\x1b\x82\xb5\x76\xd9\xc0\x7b\x00\x9b\xb0\xad\xed\xfb\xa3\xfa\x15\x69\x2b\x17\x57\x51\x1d\xca" + - "\x88\x95\x8d\xfe\x57\xde\x9f\x29\x3e\xc1\xd5\x6f\x26\xce\x8f\x24\xc7\x1f\xf1\x35\x80\x5e\xf2\x00\xe8\xbb\xf3\x21" + - "\x72\xf3\x98\x65\xf7\x1f\x80\xf0\x8e\x81\x9e\x1d\x63\xc8\xc6\x6d\x7c\x35\x4b\xa7\x92\xbd\xdf\xda\x96\x09\x5d\xdb" + - "\x33\xa1\x6d\x43\x8e\x73\xbf\x60\xe7\xf9\xb1\x0f\xfa\x48\xdc\x7b\x89\xff\xcd\x6a\xe2\x4d\x79\x65\x5f\xc3\x40\xbd" + - "\xfd\xee\x5b\xb6\x0d\x51\x7e\x3b\xde\x3a\x4e\x85\xdf\xec\x38\x44\xb6\x6f\x94\x3d\x46\xff\x67\xc0\x27\x70\xf2\x65" + - "\xe2\x7b\xed\xfd\x9c\x98\xbc\xe7\x54\xa9\x5f\x27\x16\x50\x40\xe7\x2a\x5c\xdf\x9c\x4d\xf7\x32\x76\x3b\xec\x83\x7d" + - "\x03\x9f\xfc\xa3\xc4\xe9\x6f\x27\xde\x28\x03\x65\x0d\xb0\xa1\x9a\xff\xb0\xf1\x6f\xd3\xb9\x2b\xee\x9d\x69\x2a\xfc" + - "\xa4\x6b\x9c\xdf\xc3\xcf\x01\x44\x02\x94\xcb\x35\x2a\x9f\xa6\xba\xa6\xb5\x13\x9c\x7c\x29\xae\x51\x9f\x47\xe6\x93" + - "\xf4\xc2\x6c\xd0\x77\x8f\x73\xe2\xcd\xcb\xeb\xf3\x9d\xfc\x2a\xf6\x21\x7e\x87\x9e\x96\x79\xe1\x48\x80\x78\x63\x1d" + - "\xca\x1a\x20\xfb\x2a\xb7\xf7\xb3\x6a\xc1\x95\xdc\x91\xe0\x0f\x5d\x58\x26\xfd\xe6\xf1\x97\xa4\xbe\xc4\x65\xca\x5d" + - "\xf5\xee\x54\x29\xe7\x6d\xeb\xb5\x0d\xf5\xca\x5d\x60\xec\x9d\x4a\x77\x30\x91\xda\x37\xc0\x5f\x3e\x93\xc6\xd3\xf9" + - "\xc1\x58\xb2\x2d\x3b\x4f\xee\xdb\xa9\x12\x0f\xe4\x45\xf3\x79\xfc\x25\x92\x81\xb2\x06\xd8\xee\xcd\x13\xf2\xce\x98" + - "\x2b\x4d\x82\xab\x0f\x26\xc9\x91\x3e\x97\x08\x3f\xed\x4f\x3b\x19\x04\x4f\xbd\x2e\x79\xf6\xd4\xd2\xbe\xd3\xbd\x7d" + - "\x0c\x9c\xb5\x6c\x1b\xb1\xe1\x7e\xa5\x7b\x55\x08\x1d\xfb\x11\x40\xf3\x5a\x22\xf3\xf4\xcf\x69\x2e\xd0\xff\xa3\xed" + - "\x23\x7e\xec\xd3\xbd\xdd\x4d\x31\x74\xa4\xa7\x4e\xca\x38\xf5\xba\x94\x81\xfb\x5b\xac\xef\x10\xcd\x74\xf7\x64\xdd" + - "\x79\xcf\x4a\x82\xff\x5b\x42\x63\x86\x71\xf0\xc9\x21\xb1\x24\xf9\x4e\xe4\x5d\x3b\xdf\xd2\xc9\x71\xd0\x8b\xf2\xa1" + - "\x6b\x5b\x86\xe3\x63\xb0\xec\xda\x9e\x41\xf7\x6f\x66\xcd\xeb\x00\xcd\x6b\x00\x9a\x56\x43\xb4\x7e\x31\x18\x7b\x27" + - "\x83\xcf\x23\xe7\x0a\xf1\x3b\x6d\x8b\xf2\xe9\xff\x3a\x24\xa3\x76\xbe\x94\x31\xc8\x87\x62\x6c\x4a\x31\x8b\xc6\xfa" + - "\x04\x57\x9f\x4e\x82\xff\x69\x6c\x43\xb1\x88\xff\xfa\xc8\xf0\x6f\xcb\x00\x7d\x57\x16\x98\x67\x7e\xde\x8f\xff\x42" + - "\x01\x18\xc5\x93\x08\xff\xf9\x91\xe0\x0f\x76\x03\xea\x14\x75\x4b\x3a\x4e\x8c\x7f\x16\xe5\x96\xf7\xcd\xa0\x39\x4b" + - "\x6e\x3f\x75\x34\xf7\x68\x03\xb6\xfd\xa0\xef\xb9\xb1\x85\xee\xd3\x21\x78\xe4\xcf\xe8\x0e\x10\xed\x27\x7c\xe2\x45" + - "\xd0\xbd\x19\xd0\xbd\x23\x83\xda\x0e\xdb\x7e\xc2\x7d\x74\x67\x81\xb6\x4d\x36\x9e\x18\xff\x83\xb8\x46\xf4\xa2\x09" + - "\x74\xdf\x31\x92\xf5\x7b\xf5\xb7\xb9\x96\xef\xc9\x81\x60\xd5\x73\x10\xaa\xfe\x3e\xe8\xc5\xf7\x82\xce\x15\xba\xd3" + - "\xc2\x31\x9e\xfa\xb5\xbd\x7e\x95\xb4\xd6\xef\x20\xfc\xdf\x8e\x8f\x9f\x72\xeb\xb9\xe4\xa3\x70\x5f\xb9\xca\x07\xf0" + - "\x48\xd7\x7f\x9e\x5b\x81\x7b\x53\x46\x7f\xec\x6c\x91\x4f\xeb\x8f\x2f\xb0\x6d\xe3\x30\xfc\x67\xba\xf8\xe5\xde\xa0" + - "\x6e\x47\x1e\xc1\x9a\xf9\x03\x78\xa4\xbb\x7f\x21\x35\xad\x1b\x0f\xbd\x9e\x31\xd6\x3d\xa6\x0a\x7d\x9a\x9b\xe6\x05" + - "\x75\x3f\x64\xff\x3a\xf9\xb2\xb5\x46\x13\xef\x5f\xe9\xe0\xd7\xed\xbb\x3e\xdc\xa3\x51\x2f\xbf\xfb\xd3\x81\x71\x48" + - "\xdc\xf8\x61\x6b\xdc\xf8\xc1\xde\xc7\x30\x6e\x40\x9c\xa8\xeb\x58\xec\xc3\x89\x1f\xd2\xc5\x1f\xb3\x06\xbe\x29\xb8" + - "\xd2\xa7\xef\xb9\x0f\x22\x5d\x9f\x0e\xe0\xe1\xc4\x6f\x17\xd3\x8b\xdf\x12\xd1\x70\xe2\xb7\xe1\xe1\xa7\x35\x30\x81" + - "\x62\x55\xcd\x45\xe7\xd0\xd8\xe7\xb3\x88\x9f\x87\x85\x5f\x53\x18\xfd\x3f\x95\xab\x8b\xe5\x19\xe3\x71\x3a\x43\x38" + - "\x6b\xe0\xf7\x76\x7e\xa9\x8e\x7b\x7e\x19\x2e\xfe\x18\x1b\xc2\xb3\x5a\x07\x9e\xdd\xf0\x0c\xe7\xf0\xb9\x23\xe7\xc7" + - "\x9b\xa3\xc4\x4f\x7e\xc8\x8d\x67\x66\x3a\xa7\xef\x7f\x88\xce\xd2\xf6\x93\xf6\xf9\x7d\x47\xcc\xf9\x7d\x47\xb2\xf3" + - "\x7b\x55\xdc\xf3\xfb\x48\xf1\xc7\xcc\xc1\xd7\x28\x77\x81\x3e\xae\xfa\xaf\x29\xa7\x01\x43\xf2\x27\xcf\x0f\xcc\x9f" + - "\x9c\xbb\x3d\xf9\x93\xd1\xe2\xef\xe3\x2e\xe6\xe3\x4c\x91\x67\x66\x35\x8a\x7e\x8e\xd6\xb2\xa5\xb3\xd4\xf9\xab\x17" + - "\xc1\x28\x7d\x04\xf4\x3d\x13\x89\x8c\x44\xf9\xab\xba\xb7\x87\xe6\xaf\x6e\x03\xfe\x98\x39\x98\x2c\xb8\x7a\xc8\xb6" + - "\xd9\x50\xfd\x32\x99\x1b\x0c\xf5\x38\xfe\xe2\xf6\xe5\x0f\x13\xe7\x4e\x47\x84\xbf\x50\xb5\xfd\xe9\x1c\x2b\x97\x4a" + - "\xb9\x55\xfa\xdf\x50\xe0\x3a\x44\xba\xcf\xc8\xdc\x37\xda\x8a\x9d\xbf\x4d\x82\xc1\xc1\x62\xe5\x6f\xb1\x0f\xe5\x7e" + - "\x4b\x1f\xa5\x5c\x70\xd2\x3e\x23\xc0\x4f\x63\xf0\xba\x58\x8f\x27\x1b\xe7\xe1\x05\x99\xd3\x56\x68\xbe\x8d\xca\x6f" + - "\xd0\xbe\x19\x6a\x58\xeb\xac\x3d\x27\x7f\xde\x56\x92\x7e\xfe\xbc\xe4\x41\x30\xdb\xf6\xa5\x1e\xf3\x08\xf1\xe3\xa3" + - "\x7b\x15\x66\xec\xa2\xff\x6d\xbc\x60\xdd\x2d\x48\xbc\xbb\xb2\xe8\xbf\x31\x7a\xf1\xd4\x24\xf7\x17\xf3\x89\x12\xdd" + - "\x5f\x18\x15\x4f\xd1\x1d\x48\xca\x7b\x92\xda\xb7\xac\xff\xda\xba\x86\x8d\x9f\xc6\xc0\x5d\x0c\xbc\xe4\x5b\xd1\x27" + - "\x95\x39\x77\x64\x8e\x8f\x19\xcd\xfd\xd1\xb0\xee\xa9\x46\x84\x1f\x1f\x43\x73\xd9\x6b\x7a\xbc\xbc\x6b\xa3\x3b\xb7" + - "\x4e\xeb\x0e\xee\x4e\xdd\xf7\x8d\x18\xbf\x33\x0e\x8f\xc2\x7a\x8b\x54\x8c\x35\x72\x04\x57\x67\x0b\xae\xfe\xc4\xba" + - "\x0b\x2d\xb8\x03\xf7\xae\x6f\x5b\x77\xbc\x23\xc6\x7f\xf7\xb9\xfb\x7c\x9e\x1e\xb9\x43\x24\x2e\x5b\x18\x63\xcf\x58" + - "\x65\x9e\x55\x66\x5a\xa5\x6b\x50\xc9\xec\xb2\xc0\x2a\x9f\x19\x54\x4e\x4f\x50\xe6\x25\x28\x33\x6f\x5f\xd9\x93\xa0" + - "\x0c\x24\x28\xcd\x41\x65\xd4\x2a\xc1\x2e\x17\x0e\x2a\x5b\xac\xb2\xc7\x2a\x4d\xab\x4c\xa1\xdf\xff\x0f\x00\x00\xff" + - "\xff\xc6\xb9\x24\x2f\xee\x3a\x00\x00") + "\x3b\x90\xf8\x31\xc4\x19\x6c\x32\xe3\xc4\x34\xe3\xc6\x34\x6d\xed\xd4\x69\x62\x32\x49\x9a\xa6\x75\xea\x36\x33\xee" + + "\xd8\x9e\xb4\x75\xdc\x7a\xa6\xc5\x31\x02\xa6\xd3\x84\x47\x28\x6f\x3b\xc6\x3c\xcc\xeb\x9e\xbd\x08\x21\x04\x92\x28" + + "\x12\x0e\x08\x5b\x3c\xec\x02\x92\x78\x08\x21\x09\x41\x25\x24\x10\xe8\x71\xb5\xe7\xdc\xd7\xb9\xf7\xef\xfc\xff\x9e" + + "\x73\x74\x25\xdd\x97\x24\x82\x33\x1e\xce\xcc\x3f\x7b\xee\x9e\xdd\xff\xff\xf6\xdf\x7f\xff\xfd\xf7\xdf\xcb\x98\x8b" + + "\xa9\x2c\x3f\x1f\xcb\x19\xec\x15\x37\x63\x5f\x67\x8c\xcd\x98\x21\x7f\x6b\xf9\x8c\x6d\x72\x33\x36\x7b\xb6\xf5\xfb" + + "\x11\xc6\x9e\xbd\x97\xb1\x99\x8c\xb1\x7c\x6c\xc7\x64\x3d\x3d\x6e\x76\xdb\x1f\xe1\x75\xab\x42\x53\x7e\x22\x3c\x6c" + + "\x91\xf0\xb0\x02\x22\xae\x14\x08\x8f\xab\x40\xec\x64\x92\xf0\x5d\x53\xfe\x59\xec\x64\x5f\x15\x1e\xa6\x08\x4f\x7f" + + "\x7f\xdf\x7a\x96\xa1\x97\x3c\xb8\x3f\x78\xfa\x0d\x08\x9e\x5d\x08\xc1\xda\x5f\x82\x51\xf6\x65\x30\xca\x67\x41\xf0" + + "\xcc\xbf\x11\x19\x07\x1e\x07\xbd\x78\x2a\x18\x65\x8f\xb5\x0b\x4d\x7d\xad\x6f\x07\x73\x0b\xcd\x45\xfd\xbb\x17\xb3" + + "\x0c\xa3\x62\xce\xfe\xa8\xd1\x0a\xf8\x98\x6d\x25\x10\x38\xfe\x53\x88\xdc\x3a\x01\x66\x6b\x11\x11\xbe\x07\x8e\xfd" + + "\x2d\x84\x2e\x2c\x05\xff\xd1\x79\x3d\xc2\xc3\x7e\x20\x78\x06\x13\x5c\x89\xe9\xdf\x06\xd1\x50\x2f\x04\x4e\xfc\x0c" + + "\xcc\x6b\xa5\x60\x1c\xfd\x21\x74\x6c\x1e\x47\x84\xef\x58\x17\xf8\xe4\x65\x30\x6f\x54\x81\x71\xe0\x89\xea\xbe\x2d" + + "\x6c\xd2\x80\xfe\xfe\x76\x30\x6f\x1c\x81\x60\xed\x7c\x08\x9e\x5d\x0c\x2d\xeb\xc7\x41\xed\xd2\x29\x50\xbb\x74\x32" + + "\xbd\x63\x1d\x7e\xc3\x36\xa1\x73\xff\x19\x14\x1e\x36\x4f\x78\xc7\xc4\xf4\xef\x80\x70\xd3\xfb\x10\x6e\x5c\x0f\xdd" + + "\x65\x73\xe1\xdc\xf2\x89\xd0\xb1\x25\x0f\x6e\x7c\x90\x07\xe7\x7f\x33\x81\xea\xf0\x5b\xb8\x79\x13\x61\xd0\x8b\xa7" + + "\x2c\x09\x7c\xfc\x57\xac\x7b\x11\xf6\x7f\x6a\x5f\xd4\xb8\x06\xa1\xfa\x15\x10\x6e\x7a\x0f\x3a\xb4\xc7\xa0\x61\x55" + + "\x3e\x04\x8f\xfc\x39\x84\x3e\xfa\x4b\x68\x5c\x93\x4f\x75\xf8\x2d\x74\x71\x05\x44\x45\x13\xea\x54\xeb\x7c\x85\xa9" + + "\x48\xf8\x1e\x15\xcd\xf4\xcd\xee\x7f\x71\x65\x3e\x04\x3e\x7c\x86\x78\x5c\x5a\x1d\xd3\xbf\x7e\x05\xa0\x2c\x94\x89" + + "\xb2\x03\xd5\x3f\x66\x88\x05\x31\x21\x36\x1b\xff\xd9\xe5\x13\xe1\xda\xc6\x5c\x68\xdf\x94\x4b\x63\x71\xf0\x37\xbd" + + "\x0f\x38\x56\x1c\x33\x8e\x1d\x75\x80\xba\x40\x9d\x0c\xd6\x5f\xcd\x92\x29\x44\x83\xf5\x87\xba\x76\xfa\x73\x85\xe1" + + "\x5c\x18\x07\x9e\x38\x86\x18\x68\x8e\xac\xf9\xbb\xbe\x39\x87\xc8\x99\xbf\x13\x3f\xa3\x39\xc6\xb9\x8e\xed\x4f\xb6" + + "\xe0\x61\x3f\x40\xdb\x40\x1b\x41\x5b\x19\x62\x3f\xc7\x7f\x4a\xb6\x85\x0f\xda\x9a\xdd\x9f\xd6\x80\xe6\x62\xd2\x26" + + "\xd5\xd7\xd0\x46\xc9\x56\x0f\x3c\xde\x6f\xbf\xe5\xb3\xc8\xa6\xd1\xb6\xc9\xc6\x4f\xbf\x01\x68\xf3\x68\xfb\xce\x3a" + + "\xf2\x30\x26\x76\x32\x85\xd6\x08\xae\x95\xc1\xeb\x87\xd6\x14\xb3\x69\x11\xad\x39\xaf\x5b\x1d\xed\xfa\x05\x60\x8c" + + "\x65\x32\xc6\x54\x8b\x5c\x31\x64\x3d\x0b\x63\xe8\xb0\x45\x2d\x56\xdf\x99\x96\x8f\x99\x1b\xeb\x67\xf2\x47\x8b\xea" + + "\xf3\xf9\x08\xae\x22\xe5\x09\xae\x4e\x17\x5c\xfd\xc2\x28\x69\x8a\xe0\xca\x58\xb4\x3d\xdb\x17\xa6\x29\xff\x5f\x04" + + "\x57\x5b\x85\xe6\xba\x92\x90\xb8\x1a\x43\x4a\x4c\xbd\x62\xd7\xb7\x08\xae\xd6\x0b\xae\xfe\x8f\xe0\xea\x9b\x38\x1e" + + "\x1f\x1f\x4b\xfe\x34\xb5\x7c\xa5\x40\xec\xca\x02\xbd\x64\x3a\xe8\xfb\xbe\x38\x94\x4a\xa6\x83\xf0\x66\x82\xd0\x14" + + "\x10\x9a\x0b\x44\xe1\x38\x5c\x2b\x44\xf8\x4e\x75\x5c\x01\xe1\x75\x03\xf2\x11\x9a\x2b\x2a\xb8\x52\x2b\xb8\x3a\x4f" + + "\x68\x8a\x92\x0c\x03\xc9\xf7\xb0\x02\xa3\xfc\x2b\x10\xe9\xae\x85\xa8\x7e\x15\xa2\xfa\x95\x18\xba\x0a\xa1\xb3\x8b" + + "\x49\xbe\xbe\xe7\x5e\x08\xfe\xef\x3f\x81\xd9\x51\x09\x91\xbe\x4b\x44\xf8\x8e\x75\xf8\x4d\x70\x37\x04\x3e\xfe\x11" + + "\xf9\x14\xbd\x68\x3c\xe2\xe8\x14\x5c\x7d\x49\x78\x99\x2b\x11\x06\x47\xfe\x81\xd9\x10\x0d\xde\x82\xc1\x8f\x79\xe3" + + "\x30\xe8\x7b\xa7\x81\x51\xfa\x28\x98\xd7\xca\x00\xa2\xa6\xfc\x80\x65\xcc\x3b\x7e\xc3\x36\xfa\xde\x07\x08\x93\xd9" + + "\x5a\x0c\xfa\xfe\x87\x41\x68\xac\x43\x70\xf5\x59\x92\xe3\x1d\xea\x1a\x92\xc9\x8f\x06\x3a\xc1\xff\xe1\x5c\xda\x67" + + "\x91\x27\x3e\x91\xde\x0b\xe4\xaf\xfc\x47\x5f\x20\xc2\x77\xac\x23\xac\x1d\x95\xd4\xd6\xff\xe1\x9f\x10\x2f\xfa\x5d" + + "\xf2\x05\xc4\x70\x4c\x70\xf5\x7e\x94\x35\x1c\xf9\xa1\xc6\x77\x68\x3e\x43\x17\x57\x4a\xfe\xe8\xc3\xcb\xbe\x8c\xfc" + + "\xa0\xcf\x23\x09\xdf\xb1\x0e\xbf\x51\x9f\x8b\x2b\x65\x9f\xc6\x77\xe8\x37\xee\x4f\x62\xd7\x58\xb4\x8f\x05\x3e\x9e" + + "\x35\xc4\x1e\x13\xc9\x8f\x06\xbb\xc0\xa8\xfc\x23\xf0\x1f\xfa\x63\x88\x86\xba\x21\x72\xeb\x24\x18\xfb\x1f\x82\xde" + + "\x1d\x2e\x68\xdd\x30\x0e\x1a\x56\x4f\x24\xc2\x77\xac\xc3\x6f\xd8\x06\xdb\x62\x1f\xec\x8b\xef\x10\xd6\xc1\xff\xd1" + + "\xf7\x11\x67\x83\xe0\xea\x97\x06\xeb\x20\x91\x7c\xd2\xdd\xee\x3c\x08\x37\x6f\x04\x30\x0d\x08\x7c\x34\x8f\xe4\x34" + + "\xae\x99\x00\xa7\x7f\x3d\x0d\x4e\xfd\xea\x7e\x22\x7c\xc7\x3a\xfc\x86\x6d\xb0\x6d\xb8\x69\x23\xf5\xb5\xe7\xcc\x6c" + + "\x3f\x00\x62\x77\x6e\x54\x68\xae\x57\xad\xf5\x96\x52\x7e\xb0\x6e\x01\xe8\xfb\x66\xd0\x1a\x30\xaf\x95\x83\x28\xcc" + + "\x81\x2b\xef\xe6\x92\x3c\x24\x8a\x63\x96\x4d\x71\x7e\xe3\x37\x6c\x83\x6d\xb1\x0f\xf6\x0d\xd6\x15\x48\x5d\x86\x7c" + + "\x64\x47\xc2\xc3\xf6\x0a\xae\x66\xc6\xea\x20\xae\xfc\x48\x08\xfc\x55\xdf\x05\x7f\xd5\x77\x00\x22\x41\x08\x7e\xfa" + + "\x2a\x74\x6d\x53\xa1\x6e\xf9\x64\x92\x75\x69\xcd\x44\xb8\xb9\x35\x13\x6e\x6d\xcb\x80\xe6\x75\xe3\xa9\x0e\xbf\x61" + + "\x1b\x6c\x8b\x7d\xb0\xaf\xbf\xea\x7b\xc4\x8b\xec\xe2\xec\x22\x9c\x83\x66\xc1\xd5\x19\xa9\xe4\xd3\xdc\x1f\x98\x0d" + + "\xc1\x33\x6f\x42\x34\xec\x03\x7f\xe5\x1c\x68\xdb\x30\x96\xe4\x9c\xfb\xcd\x7d\xd0\xbd\x63\x0c\xe8\x85\x63\x41\x2f" + + "\xbc\x07\x7a\x3d\x6e\xa8\x5f\x39\x89\xbe\x61\x1b\x6c\x8b\x7d\xb0\xaf\xe4\xd9\x65\xd9\x6e\x19\x88\x5d\xd9\xba\xd0" + + "\x5c\x73\x53\xca\xd7\xff\x0f\xf4\xfd\x0f\x41\xa8\x61\x35\xf9\x1f\x7d\xdf\x74\x68\x5e\x97\x47\xf3\xdd\xf2\x4e\x1e" + + "\xc9\x0d\x9f\xfc\x3b\x30\x4f\xbd\x02\xc6\x9e\x09\xd0\xba\x21\x07\x4e\xfd\x6a\x1a\xb5\xc1\xb6\xe4\xb3\x1a\x56\x13" + + "\x0f\xe4\x25\xd7\xed\x39\x5c\x9b\x51\xa1\xb1\x17\xe3\xc8\x7f\x0b\x63\x13\x5c\xef\xd4\xb6\xaf\x91\x7c\x6b\xf8\xf2" + + "\x16\x5a\xdb\x62\xcf\x64\xb8\xb4\x7a\x3c\xc9\x68\xdb\x90\x0d\xfe\xb2\x87\x01\x2e\x2d\x07\x68\x5a\x05\x81\xca\x27" + + "\xe1\xfa\xe6\x4c\x39\x2f\xab\xc7\x53\xdb\x88\xaf\x9e\xfa\x22\x0f\xe4\xe5\xc4\x47\xa5\x8f\xa2\x0d\xfc\x22\x8e\xfc" + + "\x5f\xe0\x37\x3b\x5e\x4f\x2e\xff\x1e\xf0\x97\x7e\x11\xa2\x0d\x4b\x00\x9a\x56\x42\xe0\xe0\x13\x70\x7d\x53\x56\x6a" + + "\xf9\x81\x4e\x8a\xbf\x70\xac\x43\xe4\x6b\xec\x45\xd4\x0d\xea\x28\xbe\xfe\x67\x38\xfa\x6f\x5e\x97\x2f\xfd\xcb\xd1" + + "\xe7\x21\x74\xec\x87\xa0\xef\xce\x81\xab\xbf\x1d\x67\x7d\xcb\xb3\xd6\xcc\x50\xfd\xe3\xdc\xe2\x1c\xcb\xb3\xd0\x60" + + "\xf9\xae\xb9\x68\x1b\xe4\xdf\x53\xd8\x1f\xda\x39\xda\xbe\xee\x55\x41\xf7\xba\xc9\x16\xcf\xaf\xb8\x2f\xa5\xfd\x25" + + "\x95\x8f\x6b\x42\x63\xcd\xb8\xcf\x25\x5c\x7f\x5b\xe5\xfa\xc3\x39\xb8\xf0\xdf\xf7\x42\xfb\xc6\x7b\xa0\x63\x53\x36" + + "\x5c\x5c\x35\x29\xad\xf5\x97\x42\x7e\x26\xfa\x06\xda\x37\xc2\xbe\xb4\xfc\x0f\xd2\x99\x25\xd3\xd2\xf2\x3f\xc9\xe5" + + "\x2b\xf6\x1c\xbc\x86\x3e\x12\x7d\xe5\x50\xff\xeb\x8f\xe3\x7f\x25\x0d\xf5\xbf\xfe\x21\xfe\x37\x99\xfc\x18\x1d\x7c" + + "\x09\xf7\x08\xdc\x2b\xc0\xd4\x69\xef\x30\x2a\x46\xb9\xff\x58\x73\x9f\x5a\xbe\xc2\x7c\x1a\xed\x8d\x0b\x70\xaf\xc4" + + "\x3d\x53\xee\xbf\xef\x8e\x7a\xff\x4d\x47\x7e\x8c\x0e\xee\xc7\x58\x01\x63\x06\xd4\x1d\xf6\x41\x9b\x18\x51\xfc\x61" + + "\xf9\xb2\xb4\xe5\x7b\x55\x1b\xc3\xb3\x18\x33\x61\xec\x84\x31\x14\xf1\xdc\xfb\x40\x5a\xf1\x97\x4e\xf1\xd7\x34\x8a" + + "\xd9\x06\x3f\xa9\xe4\x3b\xb6\x48\xb1\xa2\xfa\x12\xc6\x8e\x18\x43\x62\x2c\x89\x31\x25\xc6\x96\x29\xe3\x4f\x6f\x26" + + "\xc5\xaa\xf1\x62\x58\x8c\x6d\x31\xc6\x4d\x26\xbf\x7f\x3d\x60\xcc\xac\xce\xa3\x18\x1a\x63\x69\x8c\xa9\xb9\x5b\xc6" + + "\xd8\x14\x7f\xe7\xc4\xc4\xdf\x39\xb2\x0e\x63\x73\x8c\x91\x93\xc5\xf0\xc4\x47\x49\x2a\x9f\x30\x68\x0a\xf3\x15\x65" + + "\x31\x6b\xaf\x7e\xd3\x3a\x53\xd4\x5b\x67\x8c\x44\xe7\x0f\x49\xc9\xcf\x30\xad\xd6\x59\x27\xa9\xfc\x58\x5d\xf4\x69" + + "\x14\x2f\x8d\x95\x67\xab\x51\x9f\xcf\xa6\x5b\x67\xbd\xb4\xe4\x7f\xde\x1f\x7b\x6d\x1c\x66\x2a\x1c\x66\x0c\xe9\x99" + + "\xc3\x8c\x4d\xb7\x28\xcf\xa2\x4c\x8b\xd4\x74\xa8\xc5\xa2\x1e\x8b\x02\x16\x99\x8c\xa9\xc0\x48\x90\x6a\xcb\x9d\xc9" + + "\x18\x9b\xcd\x18\xfb\xfb\xd8\x3c\xc5\xc3\x9f\xb5\x56\xee\x3e\x77\x9f\x3f\xcc\xc7\xda\x1f\x1f\x16\x5c\x7d\x5b\x70" + + "\x75\xa1\xe0\x6a\xc1\xef\x89\x6c\xde\xff\x2a\xb8\xfa\x37\x82\x2b\xb3\x05\x57\x72\x7a\x35\xc6\x0c\x2d\x79\x3e\x29" + + "\x0d\xfc\xdf\x16\x5c\x0d\x0a\xae\xc2\x1d\x22\x53\x70\xb5\x53\x70\xf5\x20\xed\xeb\x5c\xc9\xc7\x58\xc3\x48\x33\x3f" + + "\x97\x18\xbf\x42\xb1\x57\x5a\x84\x6d\x07\x60\x4a\xd2\x37\x6e\x5b\x97\xfd\x1b\xf5\x56\x2a\xb8\xfa\x24\xec\x67\x4c" + + "\xe7\xc3\x1b\x83\x83\x5f\x73\x05\x31\xc6\x0b\xd6\xbe\x45\xe7\xf2\x64\x14\x3c\xbb\x08\x8c\x8a\xa7\xfa\x71\x21\xc6" + + "\xc2\x1c\x30\x0e\x7e\x0d\x02\x27\xfe\x81\x78\x20\xe1\x3b\xd6\xc9\x78\x84\x39\xd8\xf5\xe2\x29\x60\x94\xcd\x04\xe1" + + "\xcd\x8a\x1d\x47\xa3\xe0\xea\x0b\x7e\xce\x5c\x7a\x8a\xfc\x64\x7c\xfc\x2c\x48\xf1\x75\xb8\x6f\x48\x9c\x37\xf8\x31" + + "\xdb\x4a\x64\x9c\x84\xb2\xbd\x19\xe0\x3f\xf2\x17\x60\xb6\xee\x85\x68\xe0\x26\x40\x34\x12\x13\x20\x46\xa8\x0e\xbf" + + "\x61\x1b\x6c\x8b\x7d\xf4\xe2\xc9\x10\x6a\x58\x0b\xe1\xcb\x5b\xc1\xa8\xfc\x46\xff\x9c\x70\xb5\x0d\xc7\xd0\xa3\x65" + + "\x33\x91\xe6\x3c\x0c\x17\x7f\xa4\xeb\x14\xc5\xb4\xc2\xc3\xe8\x3c\x43\xb1\x65\xb0\x3b\xe5\x98\xb1\x0d\xb6\xc5\x3e" + + "\xf2\x7c\x30\x13\x22\xdd\x35\x10\xf5\x5f\xa7\x73\xa9\x28\xbc\xc7\x1e\x43\x93\xe0\xca\x53\x14\x73\x16\xa6\x8e\x89" + + "\x86\x83\x9f\xce\x41\x55\xdf\x23\xec\x62\x77\x2e\x9d\xc7\xed\xb3\xa8\x1c\x5c\x10\xa2\xa2\x05\x22\xb7\x3e\x21\xc2" + + "\x77\xac\xeb\xff\x1e\xa2\x3e\xd8\x17\x79\x20\xaf\x68\xa8\x87\xda\x84\xea\x97\xcb\xbc\xb3\x1c\x43\xa5\xe0\xea\xe4" + + "\x74\x62\xba\xe1\xe0\x0f\x35\xac\x91\x36\xc0\xdd\x10\xac\x7b\xbb\x1f\x7b\x34\x0c\x66\x47\x05\xdd\x3d\xe9\xa5\x8f" + + "\x80\x5e\x34\x51\x52\xe9\x23\xf2\x3e\xaa\xa3\x82\xda\xd8\x63\x08\xd6\xfe\x52\xc6\xee\xde\x0c\xe2\x69\x8f\x1d\xcf" + + "\x4d\x92\xbf\x1a\x45\x7f\xeb\xf3\x32\x57\x5f\x0a\x3b\x4a\x17\x3f\xea\xd2\x28\x9f\x25\xf5\x76\xe4\x3b\xfd\x79\xad" + + "\x70\x1f\x84\xce\xff\x17\xe8\x7b\x26\x59\xfe\xc6\xca\xdb\xdb\x3e\x46\x63\xf4\x0d\xdb\xd8\xbc\xe9\x0c\x78\xe4\x79" + + "\xe2\x85\x3c\x69\x9e\x68\x7e\x7b\x21\x50\xfd\x63\x7b\x4d\x5f\x13\x5c\xfd\x7a\xca\x73\x45\x9a\xf8\x69\x7e\xad\xb5" + + "\x67\xde\xa8\xea\xd7\x59\xdd\x02\x79\x0f\xc1\xa5\x1f\xe9\xd9\x39\x06\x6e\x6e\xcd\x22\xc2\x77\xb9\x36\x5d\xd4\x06" + + "\xdb\xda\xf6\x64\xde\x38\x42\xbc\x90\x27\xf2\x76\x4c\xac\xbb\x86\x72\x44\xd6\x18\xde\xd3\xb9\xcb\x9d\xcc\x1f\xa5" + + "\x83\x9f\xf2\x5c\x15\x73\x48\x5f\x81\x4f\x5f\x75\xce\xa8\xe1\xcb\x5b\x1c\x9b\x45\xac\x57\xde\xcd\xa3\x5c\x66\xcd" + + "\xd2\x29\x44\xf8\x8e\x75\x72\x1c\x0a\xb5\xc5\x3e\x92\xa9\x49\xbc\x68\x0e\x2a\xe6\x0c\x38\x5b\x87\x2e\x2c\xb1\xce" + + "\x86\x6a\xbb\xe0\xea\x57\x93\x9f\x2d\x53\xe3\xa7\x5c\xcf\xae\x6c\xb2\x03\xb3\xb3\x5a\xea\xa9\xaf\x51\x9e\x5d\x35" + + "\x06\xdd\xdb\x33\x9c\x9c\x53\x3c\xc2\x6f\xd8\x86\xfc\x4e\xf9\x57\x9c\xfc\x9f\xd9\xf9\xb1\xb4\xbb\xc2\x6c\x30\xdb" + + "\xcb\xfb\xf5\xa5\x5f\x95\x79\x41\xb9\x67\x2c\x12\xdc\x9d\xf0\xce\x2a\x1d\xfc\xe4\xdf\xc8\x5f\x7c\x97\x72\xf1\x54" + + "\x57\xf3\xef\x64\x17\xbd\x1e\x37\xe5\x6c\x12\x61\xb7\x09\xdb\x60\x5b\xec\x83\x7d\xe5\x00\x0c\xe2\x89\xbc\x51\xc6" + + "\x00\x99\x75\x0b\x6d\x1b\x3a\x2e\xb8\x32\x61\xa4\xf8\xf1\x37\xe5\xe9\x35\x06\xa1\x86\x55\x96\x7e\x5a\xc0\x28\x9d" + + "\x49\x75\xad\xef\x8d\x1b\x82\xb5\x76\xd9\xc0\x7b\x00\x9b\xb0\xad\xed\xfb\xa3\xfa\x15\x69\x2b\x17\x57\x51\x1d\xca" + + "\x88\x95\x8d\xfe\x57\xde\x9f\x29\x3e\xc1\xd5\x6f\x26\xce\x8f\x24\xc7\x1f\xf1\x35\x80\x5e\xf2\x00\xe8\xbb\xf3\x21" + + "\x72\xf3\x98\x65\xf7\x1f\x80\xf0\x8e\x81\x9e\x1d\x63\xc8\xc6\x6d\x7c\x35\x4b\xa7\x92\xbd\xdf\xda\x96\x09\x5d\xdb" + + "\x33\xa1\x6d\x43\x8e\x73\xbf\x60\xe7\xf9\xb1\x0f\xfa\x48\xdc\x7b\x89\xff\xcd\x6a\xe2\x4d\x79\x65\x5f\xc3\x40\xbd" + + "\xfd\xee\x5b\xb6\x0d\x51\x7e\x3b\xde\x3a\x4e\x85\xdf\xec\x38\x44\xb6\x6f\x94\x3d\x46\xff\x67\xc0\x27\x70\xf2\x65" + + "\xe2\x7b\xed\xfd\x9c\x98\xbc\xe7\x54\xa9\x5f\x27\x16\x50\x40\xe7\x2a\x5c\xdf\x9c\x4d\xf7\x32\x76\x3b\xec\x83\x7d" + + "\x03\x9f\xfc\xa3\xc4\xe9\x6f\x27\xde\x28\x03\x65\x0d\xb0\xa1\x9a\xff\xb0\xf1\x6f\xd3\xb9\x2b\xee\x9d\x69\x2a\xfc" + + "\xa4\x6b\x9c\xdf\xc3\xcf\x01\x44\x02\x94\xcb\x35\x2a\x9f\xa6\xba\xa6\xb5\x13\x9c\x7c\x29\xae\x51\x9f\x47\xe6\x93" + + "\xf4\xc2\x6c\xd0\x77\x8f\x73\xe2\xcd\xcb\xeb\xf3\x9d\xfc\x2a\xf6\x21\x7e\x87\x9e\x96\x79\xe1\x48\x80\x78\x63\x1d" + + "\xca\x1a\x20\xfb\x2a\xb7\xf7\xb3\x6a\xc1\x95\xdc\x91\xe0\x0f\x5d\x58\x26\xfd\xe6\xf1\x97\xa4\xbe\xc4\x65\xca\x5d" + + "\xf5\xee\x54\x29\xe7\x6d\xeb\xb5\x0d\xf5\xca\x5d\x60\xec\x9d\x4a\x77\x30\x91\xda\x37\xc0\x5f\x3e\x93\xc6\xd3\xf9" + + "\xc1\x58\xb2\x2d\x3b\x4f\xee\xdb\xa9\x12\x0f\xe4\x45\xf3\x79\xfc\x25\x92\x81\xb2\x06\xd8\xee\xcd\x13\xf2\xce\x98" + + "\x2b\x4d\x82\xab\x0f\x26\xc9\x91\x3e\x97\x08\x3f\xed\x4f\x3b\x19\x04\x4f\xbd\x2e\x79\xf6\xd4\xd2\xbe\xd3\xbd\x7d" + + "\x0c\x9c\xb5\x6c\x1b\xb1\xe1\x7e\xa5\x7b\x55\x08\x1d\xfb\x11\x40\xf3\x5a\x22\xf3\xf4\xcf\x69\x2e\xd0\xff\xa3\xed" + + "\x23\x7e\xec\xd3\xbd\xdd\x4d\x31\x74\xa4\xa7\x4e\xca\x38\xf5\xba\x94\x81\xfb\x5b\xac\xef\x10\xcd\x74\xf7\x64\xdd" + + "\x79\xcf\x4a\x82\xff\x5b\x42\x63\x86\x71\xf0\xc9\x21\xb1\x24\xf9\x4e\xe4\x5d\x3b\xdf\xd2\xc9\x71\xd0\x8b\xf2\xa1" + + "\x6b\x5b\x86\xe3\x63\xb0\xec\xda\x9e\x41\xf7\x6f\x66\xcd\xeb\x00\xcd\x6b\x00\x9a\x56\x43\xb4\x7e\x31\x18\x7b\x27" + + "\x83\xcf\x23\xe7\x0a\xf1\x3b\x6d\x8b\xf2\xe9\xff\x3a\x24\xa3\x76\xbe\x94\x31\xc8\x87\x62\x6c\x4a\x31\x8b\xc6\xfa" + + "\x04\x57\x9f\x4e\x82\xff\x69\x6c\x43\xb1\x88\xff\xfa\xc8\xf0\x6f\xcb\x00\x7d\x57\x16\x98\x67\x7e\xde\x8f\xff\x42" + + "\x01\x18\xc5\x93\x08\xff\xf9\x91\xe0\x0f\x76\x03\xea\x14\x75\x4b\x3a\x4e\x8c\x7f\x16\xe5\x96\xf7\xcd\xa0\x39\x4b" + + "\x6e\x3f\x75\x34\xf7\x68\x03\xb6\xfd\xa0\xef\xb9\xb1\x85\xee\xd3\x21\x78\xe4\xcf\xe8\x0e\x10\xed\x27\x7c\xe2\x45" + + "\xd0\xbd\x19\xd0\xbd\x23\x83\xda\x0e\xdb\x7e\xc2\x7d\x74\x67\x81\xb6\x4d\x36\x9e\x18\xff\x83\xb8\x46\xf4\xa2\x09" + + "\x74\xdf\x31\x92\xf5\x7b\xf5\xb7\xb9\x96\xef\xc9\x81\x60\xd5\x73\x10\xaa\xfe\x3e\xe8\xc5\xf7\x82\xce\x15\xba\xd3" + + "\xc2\x31\x9e\xfa\xb5\xbd\x7e\x95\xb4\xd6\xef\x20\xfc\xdf\x8e\x8f\x9f\x72\xeb\xb9\xe4\xa3\x70\x5f\xb9\xca\x07\xf0" + + "\x48\xd7\x7f\x9e\x5b\x81\x7b\x53\x46\x7f\xec\x6c\x91\x4f\xeb\x8f\x2f\xb0\x6d\xe3\x30\xfc\x67\xba\xf8\xe5\xde\xa0" + + "\x6e\x47\x1e\xc1\x9a\xf9\x03\x78\xa4\xbb\x7f\x21\x35\xad\x1b\x0f\xbd\x9e\x31\xd6\x3d\xa6\x0a\x7d\x9a\x9b\xe6\x05" + + "\x75\x3f\x64\xff\x3a\xf9\xb2\xb5\x46\x13\xef\x5f\xe9\xe0\xd7\xed\xbb\x3e\xdc\xa3\x51\x2f\xbf\xfb\xd3\x81\x71\x48" + + "\xdc\xf8\x61\x6b\xdc\xf8\xc1\xde\xc7\x30\x6e\x40\x9c\xa8\xeb\x58\xec\xc3\x89\x1f\xd2\xc5\x1f\xb3\x06\xbe\x29\xb8" + + "\xd2\xa7\xef\xb9\x0f\x22\x5d\x9f\x0e\xe0\xe1\xc4\x6f\x17\xd3\x8b\xdf\x12\xd1\x70\xe2\xb7\xe1\xe1\xa7\x35\x30\x81" + + "\x62\x55\xcd\x45\xe7\xd0\xd8\xe7\xb3\x88\x9f\x87\x85\x5f\x53\x18\xfd\x3f\x95\xab\x8b\xe5\x19\xe3\x71\x3a\x43\x38" + + "\x6b\xe0\xf7\x76\x7e\xa9\x8e\x7b\x7e\x19\x2e\xfe\x18\x1b\xc2\xb3\x5a\x07\x9e\xdd\xf0\x0c\xe7\xf0\xb9\x23\xe7\xc7" + + "\x9b\xa3\xc4\x4f\x7e\xc8\x8d\x67\x66\x3a\xa7\xef\x7f\x88\xce\xd2\xf6\x93\xf6\xf9\x7d\x47\xcc\xf9\x7d\x47\xb2\xf3" + + "\x7b\x55\xdc\xf3\xfb\x48\xf1\xc7\xcc\xc1\xd7\x28\x77\x81\x3e\xae\xfa\xaf\x29\xa7\x01\x43\xf2\x27\xcf\x0f\xcc\x9f" + + "\x9c\xbb\x3d\xf9\x93\xd1\xe2\xef\xe3\x2e\xe6\xe3\x4c\x91\x67\x66\x35\x8a\x7e\x8e\xd6\xb2\xa5\xb3\xd4\xf9\xab\x17" + + "\xc1\x28\x7d\x04\xf4\x3d\x13\x89\x8c\x44\xf9\xab\xba\xb7\x87\xe6\xaf\x6e\x03\xfe\x98\x39\x98\x2c\xb8\x7a\xc8\xb6" + + "\xd9\x50\xfd\x32\x99\x1b\x0c\xf5\x38\xfe\xe2\xf6\xe5\x0f\x13\xe7\x4e\x47\x84\xbf\x50\xb5\xfd\xe9\x1c\x2b\x97\x4a" + + "\xb9\x55\xfa\xdf\x50\xe0\x3a\x44\xba\xcf\xc8\xdc\x37\xda\x8a\x9d\xbf\x4d\x82\xc1\xc1\x62\xe5\x6f\xb1\x0f\xe5\x7e" + + "\x4b\x1f\xa5\x5c\x70\xd2\x3e\x23\xc0\x4f\x63\xf0\xba\x58\x8f\x27\x1b\xe7\xe1\x05\x99\xd3\x56\x68\xbe\x8d\xca\x6f" + + "\xd0\xbe\x19\x6a\x58\xeb\xac\x3d\x27\x7f\xde\x56\x92\x7e\xfe\xbc\xe4\x41\x30\xdb\xf6\xa5\x1e\xf3\x08\xf1\xe3\xa3" + + "\x7b\x15\x66\xec\xa2\xff\x6d\xbc\x60\xdd\x2d\x48\xbc\xbb\xb2\xe8\xbf\x31\x7a\xf1\xd4\x24\xf7\x17\xf3\x89\x12\xdd" + + "\x5f\x18\x15\x4f\xd1\x1d\x48\xca\x7b\x92\xda\xb7\xac\xff\xda\xba\x86\x8d\x9f\xc6\xc0\x5d\x0c\xbc\xe4\x5b\xd1\x27" + + "\x95\x39\x77\x64\x8e\x8f\x19\xcd\xfd\xd1\xb0\xee\xa9\x46\x84\x1f\x1f\x43\x73\xd9\x6b\x7a\xbc\xbc\x6b\xa3\x3b\xb7" + + "\x4e\xeb\x0e\xee\x4e\xdd\xf7\x8d\x18\xbf\x33\x0e\x8f\xc2\x7a\x8b\x54\x8c\x35\x72\x04\x57\x67\x0b\xae\xfe\xc4\xba" + + "\x0b\x2d\xb8\x03\xf7\xae\x6f\x5b\x77\xbc\x23\xc6\x7f\xf7\xb9\xfb\x7c\x9e\x1e\xb9\x43\x24\x2e\x5b\x18\x63\xcf\x58" + + "\x65\x9e\x55\x66\x5a\xa5\x6b\x50\xc9\xec\xb2\xc0\x2a\x9f\x19\x54\x4e\x4f\x50\xe6\x25\x28\x33\x6f\x5f\xd9\x93\xa0" + + "\x0c\x24\x28\xcd\x41\x65\xd4\x2a\xc1\x2e\x17\x0e\x2a\x5b\xac\xb2\xc7\x2a\x4d\xab\x4c\xa1\xdf\xff\x0f\x00\x00\xff" + + "\xff\xc6\xb9\x24\x2f\xee\x3a\x00\x00") func gzipBindataAssetsFaviconico() (*gzipAsset, error) { bytes := _gzipBindataAssetsFaviconico info := gzipBindataFileInfo{ - name: "assets/favicon.ico", - size: 15086, + name: "assets/favicon.ico", + size: 15086, md5checksum: "", - mode: os.FileMode(511), - modTime: time.Unix(1521004692, 0), + mode: os.FileMode(511), + modTime: time.Unix(1521004692, 0), } a := &gzipAsset{bytes: bytes, info: info} @@ -984,2664 +982,2664 @@ func gzipBindataAssetsFaviconico() (*gzipAsset, error) { var _gzipBindataAssetsJsJquery211js = []byte( "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\xfd\x7b\x77\xdb\x46\x96\x28\x8a\xff\x2d\xaf\xe5\xef\x50\xa2\x73\x64" + - "\xd0\xe2\x43\xb2\x93\x74\x42\x99\xd6\xcf\xb1\x9d\x1e\x9d\x5f\xec\xb8\x23\x67\x32\xf7\x4a\xca\xa4\x48\x14\xc5\xb2" + - "\x41\x80\x41\x81\x92\xd8\xa1\xfa\xb3\xdf\xb5\x1f\xf5\x02\x40\xd9\xee\x4e\xcf\x39\x3d\x6b\x62\x11\x28\xd4\x63\xd7" + - "\xae\x5d\xfb\xbd\x87\x8f\x76\xef\xdf\x13\x8f\xc4\xfb\xbf\xad\x54\xb9\x16\xff\x5b\x5e\xc9\xd3\x69\xa9\x97\x95\xf8" + - "\x41\x4f\x4a\x59\xae\xc5\xd5\xe3\xc1\xe1\xe0\x10\x1b\xcd\xab\x6a\x39\x1a\x0e\xdf\xff\x0e\x6d\x07\xd3\x62\x31\x84" + - "\xc7\xf8\xea\x24\x9f\x66\xab\x54\x19\x71\xaa\xff\xfe\xf7\x4c\x0d\xde\x9b\xf0\x0b\x83\x0f\xdf\x9b\xf8\x9b\x17\xc5" + - "\x72\x5d\xea\xcb\x79\x25\x1e\x1f\x1c\x7c\xd5\x13\x8f\x0f\x0e\xbf\xb4\x13\xf9\xbe\x58\xe5\xa9\xac\x74\x91\xf7\xa0" + - "\xef\x81\x90\x79\x2a\x8a\x6a\xae\x4a\x31\x2d\xf2\xaa\xd4\x93\x55\x55\x94\x34\xc8\x4f\x2a\x53\xd2\xa8\x54\xac\xf2" + - "\x54\x95\xa2\x9a\x2b\xf1\xfa\xe4\x9d\xc8\xf4\x54\xe5\x46\xb5\xcc\xbc\x28\x2f\x87\xc1\x5b\x6c\xf1\x52\x56\x6a\x84" + - "\x53\xe8\x1f\x7c\xd5\x3f\x38\x7c\x77\xf8\x97\xd1\xe1\xe1\xff\x0b\xef\x86\xf7\xef\xdd\xbf\x97\xcc\x56\xf9\x14\xe6" + - "\x93\x88\xcb\xac\x98\xc8\xac\x27\x66\x72\x5a\x15\xe5\x5a\x74\xc5\x1f\xd0\x62\x47\xcf\x44\x22\xaa\xf5\x52\x15\x33" + - "\xb1\x28\xd2\x55\xa6\xc4\x78\x3c\x16\x9d\x62\xf2\x5e\x4d\xab\x8e\xd8\xdb\x8b\xdf\x0e\xd4\xcd\xb2\x28\x2b\x13\xb7" + - "\xc2\xde\x76\x76\x86\x43\xf1\x7d\x51\x8a\x17\xc5\x62\x51\xe4\xff\xfb\x14\xd7\x6f\x7f\xf4\x33\xfd\x41\x09\x95\x5f" + - "\xe9\xb2\xc8\x17\x2a\xaf\x8c\xb8\x9e\xab\x52\x09\x29\x96\x65\xb1\x54\xa5\xb8\xd6\x79\x5a\x5c\x0b\x6d\xc4\xb2\x54" + - "\x46\xe5\x55\x8f\xfb\x54\x37\x6a\xba\xaa\x14\x02\xc9\xce\x1f\xba\xbe\x54\x15\x83\x3e\x18\x3c\x1a\xa1\x9a\xcb\x4a" + - "\xa4\x85\xc8\x8b\x4a\xe8\x1c\x86\xcb\xab\x6c\x2d\x96\x85\x31\xca\x08\x69\x87\xbc\xd6\xd5\x5c\x48\x91\x16\xd3\x15" + - "\x7c\xc7\xbd\x25\x66\x35\x9d\x0b\x69\xc4\x9b\x22\x05\xe4\xe8\xf6\x04\x2c\xde\xc0\x94\x69\xd8\xfe\x42\x7e\xd0\xf9" + - "\xa5\x9f\x94\xa9\x41\x89\x7b\x7a\x37\xd7\x46\xc8\xe9\x54\xe5\xd5\x4a\x56\xca\xe0\x4a\x72\xa5\x52\x31\x2b\x68\xef" + - "\xa7\xa5\x42\xc4\x11\xc5\x4c\x48\x51\x2a\x99\xf1\xdc\x2c\x08\x06\x97\x03\x71\x25\x4b\x8b\x6a\x63\x51\xaa\xdf\x57" + - "\xba\x54\x49\x87\xf0\xa3\xd3\x4d\xe8\x83\xee\x11\x7f\x72\xaa\x94\xa8\xf4\xf4\x83\xaa\xc4\x83\xc3\x2f\xbf\xfa\xf2" + - "\x5b\x1c\x6c\x51\x94\x4a\xe8\x7c\x56\x40\xab\xfa\x96\x32\x96\x0c\x2c\x20\xc4\x31\xb4\xda\xe1\xe5\x79\x24\xaa\xca" + - "\x95\x12\x5d\x31\xa2\xb7\x0e\xc7\xae\x2d\x1e\xec\x10\x5a\xed\x5e\xfb\x9e\xdc\x9b\x9d\x6a\x5e\x16\xd7\x22\x57\xd7" + - "\xe2\x55\x59\x16\x65\x22\x3a\xbc\x26\x5e\xd1\xf6\x7d\xe9\x08\x5a\xdc\xce\xce\x2d\xfd\x53\xaa\x6a\x55\xe6\xc2\xcd" + - "\xef\xda\x36\xb8\x85\x7f\x6e\x85\xca\x8c\xa2\x71\x6b\x4b\xa0\x76\xb7\x70\x02\x86\x43\xf1\x56\x1a\xd8\x12\x6d\x84" + - "\x9e\x05\x58\x08\x48\x93\xaa\x99\xce\x55\x2a\xd6\xaa\xba\x7f\xef\x36\xe1\xa3\xc0\x6d\x76\xe1\x08\xc0\xf9\xc5\x36" + - "\x1d\x71\x6c\x5f\x8c\xb0\xb7\x9e\x08\x40\x83\x2f\x7a\x22\x2f\xfe\xca\x13\xa0\xf3\x37\x1c\x8a\x17\x32\x7f\x88\x48" + - "\x8a\x33\x98\xa8\xa9\x5c\x19\x25\x8c\xba\x52\xa5\xcc\x84\x5c\x2e\x8d\xd0\x48\xa8\x00\xd3\x9e\x9f\xbe\x1d\xbc\x79" + - "\xf5\x4e\x54\xa5\x9c\x2a\xfc\x1c\xb0\xc7\x54\x72\xfa\x41\x5c\x69\x29\x64\x79\x89\xa0\x32\x83\xa9\xcc\x32\x55\xd2" + - "\x3f\x0a\x8f\xcb\xf7\xba\x54\xb3\xe2\x46\xa4\x5a\xc1\x4a\xf1\xeb\x75\xb1\x12\x55\xb9\x16\x55\x41\x5d\x0a\xd8\x9d" + - "\xd5\xe5\x5c\x74\x70\x12\x55\xa9\xe1\x78\x43\x27\x62\x3a\x97\x3a\x37\x03\x91\x3c\x38\x7c\xf2\xe4\xc9\x57\x5d\xfc" + - "\xfe\x74\xb5\x04\xdc\x19\xb9\xce\x0f\xbf\xd9\x87\x17\xb0\x36\x40\x57\x59\x96\x62\x2c\xce\x2e\x8e\xec\x03\x03\x34" + - "\x4c\x8c\xe1\xc5\x00\xff\x76\x6f\xa6\x45\x3e\x95\x15\xbf\xa2\x1f\xee\xdd\x72\x65\xe6\xfc\x06\xfe\x74\xcf\x75\x9e" + - "\xaa\x9b\x1f\x67\xfc\x8a\x7f\xf9\x1e\x33\x69\xcc\x63\xd8\x33\x31\x16\x7f\xdc\xba\xe7\x55\x71\x5a\x95\x00\xcd\x71" + - "\xd0\x64\x60\x9f\xba\x66\x73\x69\x7e\xbc\xce\xe3\x46\xf4\xec\x2d\x12\xac\x6a\xed\x57\x45\x60\xf0\xc3\xf0\x8b\xfb" + - "\xf7\xe0\x24\xfe\x6c\x88\x76\x4d\x8b\xb2\x54\xd3\xca\xe1\x33\x90\x84\xa2\x84\x7d\xcd\xd6\x84\xeb\x8c\x3f\x76\x17" + - "\x45\x62\x64\x9e\x4e\x8a\x9b\xee\xfd\x7b\x3b\xee\xab\x31\x37\x73\x87\xab\x87\x94\xfc\x4a\x95\x06\x28\xc8\x58\x74" + - "\xf0\xf6\xeb\xd0\xe3\xe1\x50\xbc\x44\x04\x15\x52\x64\xc5\x54\x66\x62\x5a\x2c\xd7\x40\x67\x1c\xe9\x74\x34\xc5\xe3" + - "\xab\x51\x99\x82\x13\xd3\xc3\x9b\x4b\xdd\x54\x01\x89\x7f\x37\x57\x96\x0c\x11\xfd\x17\x48\xdd\xaa\x95\xcc\xb2\xb5" + - "\x78\xbf\x32\x15\xae\x56\xe7\xba\x82\xaf\x4d\x55\xae\xa0\x2b\xf1\x50\xe5\x73\x99\x4f\x55\xfa\x90\x3b\x7a\x03\x14" + - "\x10\x9b\x69\x3b\x1b\xe8\x0a\x51\x36\x15\x09\xf6\x24\xb3\xac\xb8\x16\x0a\x28\x05\x20\xe9\x84\x30\xf4\x3a\x87\x4f" + - "\x88\xaa\xe3\x1d\x9e\x02\x84\x2c\x3d\x00\xda\x42\xdd\x0d\x66\xf9\x00\x06\x68\x5d\x10\x92\x00\x07\x24\x87\xc9\xcf" + - "\xf3\xb4\x2c\x74\xfa\xf4\x4b\x60\x20\xe0\xcd\x6b\xf9\x41\x09\xb3\x2a\x95\xb8\x56\xa2\x2a\xf5\x42\x7c\xf7\xe3\x6b" + - "\x3c\x51\x6f\xbe\x3b\x7d\x7b\xff\xde\x4e\x89\x0f\xc7\x62\xf8\xeb\xd9\xb9\x39\x5f\x7d\xff\xea\xfb\xef\xcf\x6f\x9e" + - "\x1f\x5c\xec\x6f\x6a\xbf\xbf\x18\x5e\xba\xf1\x5e\xcb\x6a\x3a\x57\x46\xa4\xd2\xcc\x55\x8a\x47\x0d\x6e\x92\xa2\x14" + - "\x53\xb9\x50\x99\xfe\xbb\xce\x2f\xa1\xef\x85\x79\x5b\xaa\x99\xbe\xc1\xfe\xfb\x0b\xd3\x1f\xc2\xb5\x58\xc2\x67\xcf" + - "\xb3\xe5\x5c\xc2\xf3\x7e\x72\x76\x9e\xca\xfe\xdf\x2f\xba\xc3\x4b\xed\x46\xf8\x19\xd8\x8b\xc9\xda\x82\x02\xbb\x7d" + - "\x21\xe1\xfa\x22\x18\x4f\x80\x68\x54\x85\x28\xd5\x32\x93\x53\x95\x00\x08\x67\xbe\x55\x88\x0e\x32\xcb\x7a\x22\x53" + - "\x55\xa5\x4a\x8b\x08\x0c\x6b\x7a\x38\xa8\x8a\x9f\x97\x4b\x55\xc2\x87\x09\x01\x16\x8f\x81\xdb\x05\x31\xb6\xd3\x58" + - "\x96\x45\x55\xd8\x33\x49\x13\x05\x84\x9a\xae\x4a\xb8\x9c\x85\xc5\x62\x87\x9f\x62\xa2\x00\x30\x2b\xa3\x52\x40\x55" + - "\xbc\xec\x46\xb6\x19\xad\x35\x40\xb2\x11\x7f\xe5\xb7\xb5\x92\x65\xc5\x17\x49\x2e\xd4\x62\x59\xad\x1d\x2e\xdc\xbf" + - "\xb7\x63\xff\x1c\x89\x8e\x3f\x2f\x30\x9f\x54\xcd\xe4\x2a\xab\x44\xa6\xf2\xcb\x6a\x4e\xd7\x72\x03\xe9\x0f\xee\xdf" + - "\xdb\xa1\x06\x23\x71\x40\x9f\x57\xc5\xf3\xb2\x94\xeb\x91\x07\x5e\x0c\x2f\xa4\x79\x48\x95\x13\x22\xf8\x35\x34\xfc" + - "\xab\xa2\xd3\xf3\xa6\x9a\x0b\x95\x29\x3c\xf0\x3a\xc7\x47\x0b\xc4\x98\xd4\x3d\x36\xaa\x12\x3f\xfe\x14\x7f\x76\x3d" + - "\x2f\xb2\xf6\x96\x12\xee\xd5\x69\xa6\x64\x0e\xb4\x52\xc2\xb9\xbf\x54\x55\x30\x4f\x91\xaf\x16\xb5\xcd\x85\x27\xbb" + - "\x63\x91\xaf\xb2\x0c\x58\x01\xbc\x5a\x87\x43\xf1\x13\xbd\x75\x27\xbd\xc8\x95\x1b\x6a\x56\x16\x0b\xba\x93\x14\xf2" + - "\x51\x3b\xd4\xef\x53\x71\x20\x8e\x71\xc1\x67\xf8\x7b\x1f\xff\x1e\x30\x74\x2f\xf8\xc6\xa4\x77\x17\xc4\x5a\xd4\x46" + - "\x83\x2b\x08\xfa\xe5\x81\xe0\x52\x6c\x2c\x68\x67\xe7\x63\xe0\x7d\x07\x67\xd9\x7e\x01\xbb\xea\xba\x83\xf3\x8c\xd7" + - "\x8c\xae\x44\x91\xc3\x7d\x68\x2f\x56\xfa\x32\x21\x98\x00\x2e\x12\xf7\x76\xdd\x06\x66\x38\x43\xd0\xcb\x29\x7c\x18" + - "\x02\x17\xda\x18\xc7\x75\x43\x87\xdf\xad\x74\x96\x0a\x19\x50\xab\xb6\x0e\xa1\x31\xdc\x30\xa5\xaa\xfc\x19\x5a\xa8" + - "\xf2\x52\xd1\x02\x07\x01\xf2\x27\xc0\xa1\xd2\x38\x47\x6e\x98\xe7\x69\x4a\x9b\x94\xa5\x16\x73\xe3\xe5\x89\x04\x51" + - "\xa3\x54\x33\x60\x8f\xa7\xca\x52\xd2\xc1\xb2\x54\x57\x3f\xd2\x17\x63\x1c\xeb\xc8\xbe\xb1\x24\x74\xec\xa6\x00\x3f" + - "\xfd\x98\xbc\x65\x0c\xa7\x6c\xdd\x9f\x15\xe5\xa2\xb9\x2e\xc6\xb2\x52\x55\xf1\x26\xbd\x62\x7e\x5f\x7a\x32\x05\x74" + - "\x11\x38\xa2\xf5\xb6\x43\x61\x54\x35\xe0\x8d\xfa\x7f\x8a\x95\x98\xca\x5c\x18\xb8\x5e\xa0\x8d\x63\x8a\x1c\x1d\x70" + - "\xdb\x2f\xcb\x4b\xd3\x13\x93\x55\xc5\xfc\x9f\xa1\x3e\x8a\x3c\x5b\x23\xc9\x11\x3a\xaf\x54\x99\xc3\xcd\x36\x00\xc0" + - "\x28\x39\x9d\x87\xdb\x6a\x27\xd8\xc3\x9e\x6a\xc7\x87\x77\x0b\xbe\x49\x98\x23\xac\xb7\x0f\x16\xbe\x90\xcb\xb6\x9e" + - "\x6b\x7d\x22\xc0\x1d\x86\x25\x0e\x23\xe4\x32\xa9\xf3\x9c\x00\xa9\x9e\xd0\x8e\xf5\xe6\x1e\x6c\xc7\x7c\x4a\xb8\x15" + - "\x61\x0e\xf3\xcf\xb7\xdd\x70\x62\x78\xa6\xb6\x12\xb4\xfa\x84\xe8\x04\xca\xe5\x32\x5b\xdb\x45\x7b\xf8\x77\xa3\x15" + - "\xcf\x74\x69\xaa\xbb\x3b\x56\xbf\x27\xe2\x20\xfa\x28\x93\x9f\xf2\x4d\xff\x30\xfa\x48\xfd\x1e\x82\xd6\x81\x04\x0e" + - "\x56\xa6\x72\x8b\xc7\x44\x8d\x50\xea\xdc\x79\x2f\xc6\x62\x5f\x8b\x7d\x01\xcd\x89\x7a\x41\xcb\x91\x9d\xcd\xd6\xfd" + - "\x10\xcf\xc6\xe2\x00\xc4\xe6\xf7\xe2\x29\x7e\x72\x2c\xce\x88\xb8\xbd\xbf\x40\x42\x77\x76\x11\x4f\x2d\x4f\x3f\x02" + - "\x5b\x7f\x0c\x37\x9b\xe6\x99\x07\xe2\x5c\x23\x72\x20\x06\x5b\xbc\x05\x2c\x46\x74\xe6\xd3\xf1\x9d\x9a\xcb\x2b\x65" + - "\x04\x4a\xe3\x32\x17\x78\x5b\x3d\x34\x62\xa1\xaa\x79\x91\xf6\x90\xa7\xa2\x77\x8e\x28\xe1\x9b\x01\x13\xb6\x11\x12" + - "\x49\x80\x91\x41\x6e\x09\xf9\xf8\xa2\x44\x59\xdd\x2c\x09\x53\xf0\x19\xfe\x7d\xff\x5e\xc4\x07\xa8\x9b\x4a\xe5\xa9" + - "\xa7\x63\xb3\xdc\x3f\xaa\x81\x00\xb6\xa6\x58\xc2\x03\xd3\x13\xb9\x5c\xa8\x9e\x30\xe5\xb4\x87\xcc\x2b\xfd\xf7\xc4" + - "\xe0\xdc\x7b\x62\x9a\x15\xb9\xc2\x5d\xab\x64\x79\xa9\x48\x84\x60\x8c\x3b\x3b\xb8\x00\xa8\xfd\x71\x8b\xef\xb5\x18" + - "\x8b\x43\xfc\x8b\x2f\x9e\xa0\x65\xb8\xfb\xa9\x52\x4b\x98\x92\xcc\x0c\xc9\x27\x00\xb9\xff\x90\x79\x9a\x01\x5c\xf0" + - "\x2d\x32\xd1\x46\x83\x3c\xaf\x8b\xbc\xa6\x48\xb1\xf3\x00\xf9\x70\x52\x14\x70\x47\x39\x1d\x09\xf7\x4d\x4d\x3c\xc9" + - "\x34\x1f\xf4\x12\x89\x15\xb7\xc7\xfb\x08\x7e\x53\xc3\x2d\xab\x13\x5a\xf0\xfa\x10\x27\xf5\xfe\xbe\x93\x6b\x83\x29" + - "\x4f\x81\x9d\xbb\x9e\xab\xdc\x4e\x0c\xf8\x75\xcb\x71\x16\xa5\x30\x05\xec\x31\xfc\x48\x96\x85\x31\x7a\x92\x01\xf7" + - "\xee\xd7\xd9\x6d\x5f\xde\x6e\x4d\x4f\xb4\xcb\xbb\xaa\xcd\xf7\x76\x2f\xa9\x65\xd7\xae\xdd\xad\x80\xe6\xeb\xe6\xc9" + - "\x48\x60\x45\x80\xca\xa8\x6c\x06\x0c\x3e\x92\x61\xe0\x2e\x9c\x40\xa4\x8d\x58\x4a\x43\xbc\x20\x4e\x49\x23\x94\x79" + - "\x3b\xeb\xc3\xb8\x4b\x4b\xf7\xfb\x7e\x40\xb8\x4b\x12\x71\x84\xe7\x9a\x3e\x3c\x12\x7a\x7f\x3f\x90\x70\x7e\x84\x71" + - "\x53\x52\xc2\x54\x73\x91\x17\x79\x1f\x8e\xd9\xd0\xc9\xfa\xe2\x4a\x66\x2b\x85\xea\x1d\x9c\x45\xc2\xa8\xda\xd8\x9c" + - "\xae\xe3\x9f\x2c\x15\xc6\xfb\x0d\x97\x8b\xbb\x0d\x5b\x43\x30\x24\x65\x0a\xce\x0d\xf0\x1d\x76\xc0\xf6\xea\x94\x27" + - "\xa6\x9c\x3a\xdc\x39\xa3\x66\x17\xac\x12\x41\x84\x1c\xdb\x4f\x82\x97\xf4\x7a\x38\x14\x6f\x4b\x75\x05\x30\xcc\xe1" + - "\x22\xed\xab\x1c\x15\x0a\x59\x51\x2c\x03\x95\x4d\x80\xb9\xd8\xa1\x57\xdb\xc0\x25\xaf\xf3\x95\xf2\x1a\x18\xd7\xf1" + - "\x4f\x6a\xba\x2a\x8d\x42\xed\x89\x7a\x58\x2a\x01\xfc\x09\x74\xbe\xcc\x24\xac\x02\x97\x67\x00\xd3\xf0\xde\x35\xc1" + - "\x78\x88\x63\x7b\x7b\x34\xd8\xde\x9e\x70\x17\x9a\x36\x6f\xe1\x63\x22\x7c\x09\x62\x21\x20\x7a\x12\x9c\x7c\x4f\x47" + - "\x34\x3d\xa0\x66\x80\x6d\x7e\xda\x38\x4a\xf8\x91\x7f\xb5\x13\xf7\x65\x4f\x3b\xbf\x03\xa2\x22\xc6\x40\x74\x90\x98" + - "\xc7\x03\x99\x72\xda\x15\xc7\xf8\x72\x64\xb5\x1b\xf8\x59\xa8\x73\xba\xab\x9b\x70\x71\x51\x67\x7c\x92\x43\x08\x93" + - "\xa8\x7c\xa5\x4a\xb1\x28\xae\x94\x28\x4a\x7d\xa9\x81\xb2\x33\x5c\x99\x00\x02\x3a\x2d\xac\x8a\x2d\x42\x10\x0f\x27" + - "\x3a\x67\x04\x75\x4b\x37\x79\x9f\x43\x44\x79\x59\xe4\x0f\x2b\x31\x41\xf2\xa0\x73\xd1\x86\xf5\x6e\xa5\x0e\xbe\x48" + - "\x0e\x7c\xd3\x40\xdf\x57\x9f\x0c\xb4\x8e\xf4\x78\xf8\xdf\xdb\x90\x20\x04\x0c\xe4\xa2\x48\xf5\x4c\xab\xd4\x9f\x12" + - "\x7b\x39\x5a\x0a\xda\x72\xc5\x24\x2c\x59\xfe\x9c\xeb\xdf\x57\x8a\xb8\x47\x39\x9d\xd7\x54\x1f\xa2\xa0\x21\x96\xf2" + - "\x52\xc1\x4d\x7c\xb3\x94\x79\x5a\x8c\xac\x42\xb2\x83\xb7\xbf\x15\x48\xf7\x41\x62\x9f\x0f\x4a\x68\xb2\x48\xba\xa2" + - "\x3b\xb0\x72\xb3\x18\x9e\xbf\x1c\x5e\xf6\x44\xa7\x23\xba\xee\x0e\x7e\x6e\xcc\x6a\xa1\x02\xad\x46\xa9\x64\x4a\x5a" + - "\x9e\x62\x45\x62\x13\x3d\x21\x1d\x2c\x90\x33\xf3\x13\x3c\x18\xa1\x76\x95\x79\x83\xb2\x04\xd1\xd4\x73\x2e\x0b\x73" + - "\xe9\x88\x5c\x5d\x8d\x8a\xef\x02\x46\x20\x2f\x8a\x65\xcc\x59\x04\xca\x0e\xa5\x44\xa5\x4c\x35\x5c\xe5\xba\x1a\x4e" + - "\x8b\x52\x0d\xde\x1b\x04\x53\xaa\x2a\xa9\x33\x83\xda\x38\x45\xe2\x8e\xa7\xe7\xcc\x43\x9c\xea\x7c\xaa\x1c\x60\x0e" + - "\x07\x4f\x7a\xe2\xe5\x8f\xaf\x99\x51\x20\x49\xca\x0e\x6b\x19\x8d\x4c\x95\x15\x7d\x2c\x4b\x05\xd8\xc5\x1a\x33\x95" + - "\x0e\x40\xdc\x5e\x0b\xa7\xca\xcd\x90\x5f\x11\x27\xaf\x44\xf2\xe0\xf1\xb7\x5f\x7f\xd3\x1d\x20\x6c\xec\x14\x42\x68" + - "\x14\x93\xf7\xed\x1c\x37\xdc\x53\x49\x31\x79\xdf\xa5\x2b\xd8\x7e\xd1\x09\xa0\xc3\x27\x79\x44\x0c\x90\x3d\xd8\xf6" + - "\xdd\x2f\xa8\x60\xbb\x7b\x2c\x78\x62\x89\xfb\xde\x1e\xfe\x84\xd1\x8a\xc9\xfb\x01\xe9\xe7\xa2\xd1\xde\xac\x16\xaa" + - "\xd4\xd3\x2d\x5d\x0e\x87\x62\x29\x4b\xa3\xbe\xcf\x0a\x59\x89\x37\xf2\x8d\x01\x49\x18\x3e\xe8\x4f\xa5\xa9\x18\x2c" + - "\xcb\xc2\xe8\x4a\x03\xf7\x86\x5c\xdf\x06\x10\x65\x83\xaf\x36\x9d\x4e\x97\xfb\x19\x0c\x06\x20\xce\x2c\xb4\x41\x16" + - "\x70\x59\xaa\xca\x88\x4c\x49\xa0\xf6\xfd\x7c\xb5\x98\xa8\x92\xaf\x7e\xd3\x83\x41\x2b\x3d\x5d\x65\xb2\xcc\xd6\x62" + - "\xae\x6e\x44\xa6\x2b\x55\xca\xcc\x88\xa4\x73\x70\x33\x18\x0c\x5c\xb7\x66\x35\xa9\x4a\x89\x33\x07\x3c\x99\x2a\x10" + - "\xc0\x67\x3a\xd7\x95\x56\x46\x54\x05\x4c\x3a\x00\xce\x6e\x8d\x60\xf2\x62\x19\x4e\xfd\x60\xb5\xf6\x15\xb0\xcd\x11" + - "\xc4\x02\x12\xb9\x1d\x6a\x6f\x8a\x2a\xbe\x65\x46\xfc\xa2\x2f\x9e\xe7\x4e\x55\x53\x94\x44\xba\xc4\xf5\xbc\x00\x9a" + - "\x65\x79\xe3\xb3\xb3\x17\x99\x34\xe6\xe2\x82\x4d\x50\xd5\xda\xea\xfd\x3b\x67\xfc\x29\x4d\xe0\xa2\xe3\xba\x05\x4c" + - "\xcf\x8b\x54\x19\xf7\xc4\x1b\x6a\x90\x18\x86\x38\xc8\xb3\x8d\x38\xa5\xcd\x06\x71\x04\xfa\x78\xb7\x5e\x2a\xf8\xed" + - "\x80\x45\x78\x67\x3f\xab\x09\x6e\xfe\x82\xe2\xab\x01\x87\x83\xbe\x42\x2d\xeb\xde\x1e\x91\xd6\x5d\x52\x55\xb3\x94" + - "\x57\x6b\xe5\xb5\x70\x3d\xd1\xd1\xe6\xad\xfd\xf5\xe3\xac\xf3\x09\xe3\x0e\x87\xe2\x64\x46\xd6\x38\xde\x16\x31\x97" + - "\x06\x4e\x35\x7d\xa1\x52\x21\x33\xa4\x6e\x3d\x66\x08\xa6\x45\x3e\xd3\x29\x30\x1f\xd5\x5c\x5a\xfb\xda\xa6\x98\xbc" + - "\xdf\x10\x2f\x1a\x6e\x61\x8f\x8c\x61\xa4\xbb\xfc\xe3\x16\x36\xcf\xcd\x5c\xa5\xcc\x91\xa9\x6b\xde\x99\x50\x5a\x2a" + - "\x89\x3b\x71\x18\xf4\x6a\xb1\xac\xd6\x77\x62\x10\x48\x19\x70\x2f\xe1\xea\x6a\xbc\x97\x6f\xd5\x0a\x88\x6d\xc3\x02" + - "\x18\xb7\x8c\x66\xf7\x4b\x8c\x6b\x3c\x61\x40\x51\xf6\x45\xa7\xe3\x87\x68\xd1\x4b\x8b\xa7\xe2\xcb\xc1\x41\x4f\xe8" + - "\x1f\x4f\xc5\x53\xf1\xb5\x70\x36\x5e\x6d\xe6\xe2\x27\x75\xf9\xea\x66\x19\xea\xc2\x99\x65\xb7\xd4\x29\xc4\xc2\xfa" + - "\x2b\x47\x26\xd9\xec\xe7\xcd\x1e\x67\xce\x64\x42\xe8\x84\xa4\x15\x05\x0f\xd7\x1f\xd9\x02\x7d\x97\x35\x8d\x0e\x1c" + - "\x3f\xb4\x7c\x4a\x61\xc8\x54\x8f\xea\x3b\xb6\xc6\xb1\x02\xe9\xfe\xbd\x1d\x7a\x00\xcd\x23\x5d\x48\x91\xaa\x70\xcb" + - "\xa8\x0b\x12\xd4\x75\x9e\xea\x92\x74\x54\xea\x4a\x66\xcc\xc7\xe0\x17\x8e\xef\xa9\x4a\xbd\xb0\xbd\x1c\x05\x67\x27" + - "\xec\x37\xc0\x6a\x7c\xac\xad\x73\x80\x04\xda\xa1\xd3\x1e\xd0\x88\xac\xb8\x5c\x59\x3a\x8c\x52\x1f\xd1\x46\x34\x93" + - "\xc1\x4d\xae\xc4\xb2\x94\x97\x0b\xd9\x73\x36\x6b\xec\x6b\xb2\x16\x3a\x07\x38\xc1\x75\x2a\xdd\x67\x04\x88\x4a\x02" + - "\x97\xc5\x1a\x39\x6b\xd2\x19\xd0\xda\xec\x24\xad\x69\x2b\x09\xcd\x72\x74\xbb\x1d\x06\xd2\x01\x75\x38\xf6\xbd\xd0" + - "\x49\x7a\x45\x2a\xb3\xa4\x43\x0d\x3a\xd6\x8a\x4a\x3f\x07\xac\xca\x83\x71\xf8\x85\xfb\x7e\xae\x64\x3a\x90\xcb\xa5" + - "\xca\xd3\x17\x73\x9d\xa5\x89\x9d\x74\x77\xb0\x84\x8b\xbc\x42\xd3\x78\xa9\x80\x31\xad\x35\x60\x43\x6c\xc8\x0f\x83" + - "\x64\x55\xcd\x55\x79\xad\x8d\xea\x09\x79\x05\xd8\x0c\x8b\xb6\x24\xd5\x59\xc1\x7b\x42\xe7\x46\x95\x21\x8c\x81\xa9" + - "\xc0\x71\x64\x06\xe0\x5c\x19\x04\x65\x2e\xdc\xf6\x33\x2a\x01\x0e\xb0\x7c\xc1\x6f\x82\x8d\x8f\x78\x4d\x87\x9c\x2f" + - "\x8a\xfc\x4a\x95\x95\xb5\xc4\x54\x85\x70\x46\x90\x23\x52\x02\x4e\xd6\x84\x17\x86\x98\x9b\x54\x56\x92\xf9\x36\xd6" + - "\x17\xbe\xd6\xd3\xb2\x30\xc5\xac\x82\xbb\xf1\xb2\xa8\xa0\x93\xf9\x6a\x81\x12\xbd\x2e\xc5\x95\xca\xd3\xa2\x14\x4b" + - "\x32\xe4\x24\x0f\xbe\xfd\xea\x2f\x8f\xe1\x90\xba\x71\x42\x64\x67\xb9\xbc\x66\x36\xa0\xd3\xe7\x58\x4e\x67\x16\xea" + - "\x89\xce\xc2\xf4\x3b\x21\x3b\xea\x6d\x43\x3d\x11\xd8\x73\x62\xde\x30\x55\x6f\xe4\x42\xd5\x35\xd4\xa4\x6a\xa9\x8d" + - "\x0d\x2f\x06\xf6\x0b\xb8\xc2\xa3\x07\x83\xaa\xf8\xa1\xb8\xb6\xa6\x1f\x44\xc9\xbc\xf1\x38\xa6\x06\xa8\xfa\xd4\xc4" + - "\x6f\x06\x7a\x2a\x79\x49\x9a\xaa\x16\x35\x6b\x31\x79\xdf\xd4\x9d\x7a\x7a\x80\x97\x3b\x93\x03\x31\x46\x53\xcc\x4e" + - "\xa0\xe3\x81\xcb\x2f\xd4\xed\x69\x27\xf3\xf1\x5f\xc0\xa3\x32\xa5\x0e\xc9\x43\x38\x0c\x6b\x1b\xea\x42\xe4\x47\x74" + - "\x09\x3b\x30\x3f\x60\x3c\xc6\x5e\xed\xca\xaa\xd1\x62\xf2\x1e\x35\x04\x81\x26\x38\x14\x59\xf9\xb3\x31\xcb\xa5\xa1" + - "\xd8\x3a\x29\x95\xfc\x10\x48\x89\x81\x20\x15\x49\x9f\x34\x37\x5d\xbf\xcc\xfe\x87\xa7\xe4\x0d\x11\xc2\x2c\xd5\x54" + - "\x93\x13\x92\x81\x6b\x1e\xb0\xd2\x3a\xc0\x2c\x0a\x53\x89\x29\xfa\x0a\x91\xca\x72\x86\x12\x1b\x9e\xd6\x70\x55\x7f" + - "\xda\x36\x38\xbe\x88\x97\xac\x7b\xee\xc7\xff\xd9\xcd\xf8\xf7\x4f\x2c\x60\xe5\x3c\xe7\xf1\x49\xd6\x70\xb8\x48\xc3" + - "\x73\x19\x7a\x06\x58\x86\x03\x6f\x13\x6f\x34\xdc\xd9\xd9\xe9\x58\xf6\x80\x3f\xd8\x47\x51\x39\x20\x58\xd0\x2d\xc9" + - "\xcf\xf1\x2c\x4a\x65\x56\x59\xf5\x11\x5a\xb1\x90\x1f\x54\xdd\xe6\x2a\x64\x59\xf6\xdc\xe7\x01\xa5\x20\x33\x9a\x7d" + - "\xb1\xd9\x78\xe5\x0d\x9f\xf8\xb2\xa1\xb0\x0b\x31\x8e\x08\x05\xeb\x6d\x64\x59\x46\xba\xa6\xd8\x38\x57\x2a\x66\x50" + - "\x1c\x57\x84\xbe\x30\xc0\x68\x11\x31\xb7\x6c\xd6\xce\xce\x19\xbe\xba\x10\xa8\x39\xa7\x67\x6d\xd7\x27\xea\xdf\x19" + - "\x3d\xa0\x77\xfc\xaa\x76\xad\xdd\xdf\x66\x56\xd3\x79\x03\x46\x44\xf0\x11\x52\xba\xb6\x89\x34\x55\xde\x43\xd1\x3f" + - "\x14\x23\xeb\x6a\xc3\xe3\xe3\x57\xce\xc0\x14\x5a\xb1\x60\xf5\xe1\x28\x68\xe4\xe9\x09\xa3\xa6\x45\x9e\x36\x0d\x2f" + - "\xfb\xf4\xa2\x61\x7b\x39\xf0\xe4\x1c\x7b\xe0\x06\xbc\x59\xf6\xbc\xb3\x8d\xe5\x48\xbc\x0f\x0e\x3b\xb6\x3f\xc3\xf3" + - "\x7f\x21\xc6\x3c\xf2\x99\x78\xcf\xaa\x52\x86\x52\xd8\x2b\xdc\x04\x47\x11\xf0\xf0\x6d\xb0\xac\xcb\x52\x2d\x1b\xe6" + - "\xdc\xf0\x4a\xd2\xc4\x43\x04\xeb\xb3\xef\x4e\xe0\x8d\xe1\xeb\x69\xc1\x5e\x1f\x63\x71\x76\xb1\xfd\xc2\xc2\xde\x23" + - "\x90\xd8\xce\x5e\xdd\x2c\x89\xd7\xdd\xa5\x01\xbd\x01\xe1\xaf\x85\xf3\xdd\x22\x9b\x27\xda\x46\x50\x83\x6e\xe4\x95" + - "\x35\x5b\xeb\x4a\x2d\xac\xe4\x8a\xce\x91\x4b\xf2\x7d\x53\xc4\xe4\x4a\x90\x20\xed\x2a\x43\x40\x6f\x23\xac\xb5\x45" + - "\xc2\xc4\xec\x23\x06\x92\xa5\x62\x16\x53\x89\xa7\xad\x7d\x06\x02\x72\x6d\x89\xee\x58\x31\xc8\xd0\xc8\x16\xf6\x79" + - "\x07\xea\xf3\x27\x0d\xae\xe3\x63\x84\xe4\xee\x2d\x86\x0e\x3e\x9d\xe9\x68\xee\xe1\x16\xb6\x83\x2d\xf6\x3d\x2b\x09" + - "\x7a\x7f\xb9\x3b\xf6\xb5\x2a\x65\x6e\x32\x89\x02\x05\x6a\x36\x8b\x99\xdf\x5f\x41\xc2\x84\x2e\x51\x4e\xae\x99\x2a" + - "\xea\x77\xe7\x47\xaf\xce\xfa\x05\x55\xdb\x57\x86\x8b\xbb\x98\x82\x7b\xa9\x4e\x49\xd9\xad\x00\xf7\x91\x5a\x74\xeb" + - "\x7a\xe0\xe6\xa2\xc9\xea\xff\x41\x39\x6d\x2d\x6b\x09\x1a\x9c\x41\x70\xc3\x06\xce\x16\xff\xe3\x2b\x08\x97\xf1\x7d" + - "\x26\xab\x4a\xe5\x42\xe6\x6b\x91\x2b\x53\xa9\x34\xb0\x80\x58\x73\x3c\x7a\x3a\x5a\x16\xec\xec\xa2\x87\x77\x54\xed" + - "\x22\x7c\x6e\xc5\x9b\xbf\xfe\x7c\xf2\x52\x4c\x8b\x15\x20\x30\xa2\x32\xab\xbd\x80\x44\xad\x74\x3a\x42\xf3\x26\x5b" + - "\x7a\x75\x9e\x0a\xe9\x55\x34\x55\x21\xa4\x95\xb4\x7b\x6c\x27\x42\x8f\x3d\x54\x02\xe2\x5f\x38\x09\x12\xac\xd6\xee" + - "\xd0\xb0\x79\xf4\xfe\xbd\x9d\x65\x59\xdc\x44\x37\xc8\x2c\x6f\xf8\x07\xa2\x7f\xe5\x62\xd9\x63\xcf\x0a\xfc\x24\xbc" + - "\x61\xf9\x2e\x74\x1e\x24\xe1\x7d\x68\xa1\x5c\x2d\xd0\xfa\x9a\x9f\xb9\x66\x6c\xe4\xf2\x7e\x27\xb3\x9c\x9e\xa0\x67" + - "\x59\xb5\x58\xd6\xd4\x53\x7f\x5b\xe9\xe9\x07\x31\x9d\x2b\xf2\x70\x4b\x55\xa5\xca\x85\xce\xd1\x5c\xe1\x6d\xa0\x80" + - "\x0f\x72\x92\xa9\x9e\x75\x26\x01\x06\xd5\x11\x47\x6d\xc8\xd5\xd0\x08\x29\xde\xad\x97\x0a\xd5\xec\xe4\x2b\x72\xad" + - "\xc4\xb5\xce\x32\xf2\x80\xe2\x7d\x74\xa6\x8f\x81\x5b\x6b\x8b\x41\x54\xcc\xf2\xa6\x82\xcd\x7d\x5a\x5b\xc5\xa9\x5e" + - "\xac\x32\xd2\x84\xe9\x3c\x85\x87\xc8\x97\x8f\x23\x27\x32\xb7\x43\x3d\xf1\x98\xb1\x11\x81\xde\x34\xa9\xfb\xcb\x2d" + - "\xb7\xe8\x66\x01\xca\x8e\x05\xb4\x6b\xec\x7c\x9b\xb4\x0f\x83\xd3\x67\x37\x11\x4f\xa5\x4e\xd9\xff\x0c\x90\x10\x68" + - "\xd1\x8a\x0c\x2f\x73\x34\x40\x97\xc2\xfa\x1b\x81\x00\x59\xcc\xbc\x09\x8b\xdf\xf7\x84\x29\x84\xae\xd0\x6b\x67\xa2" + - "\x48\xce\x47\x13\x2f\x2d\x65\x80\xbd\xc2\xa6\xd7\xff\xf2\xba\x53\xf8\x89\xd6\xef\xe0\x68\x59\xe4\xf3\x52\xef\xf5" + - "\x08\x63\x26\x06\x79\x71\xed\xce\x09\x77\x60\x5d\x78\x59\x01\xcc\xce\x3f\xe2\x45\x51\x2a\xdc\x73\x8a\xe3\x58\x96" + - "\x05\x19\x33\x65\x55\x01\xd9\x45\x32\x4b\xfd\xb0\x0a\x99\xd5\xe1\xba\xe2\x35\xe5\x4a\xa5\xf8\x44\xdd\x68\x83\x7a" + - "\x1d\x63\x79\x6b\xfe\xe3\xfe\xbd\x5b\x22\x3e\xc3\xa1\x78\x5b\x2c\x71\xcb\x49\xdf\xe0\xfd\x97\x17\x72\xe9\x4d\x5c" + - "\x72\x3a\x4f\x3a\xdf\xb1\x9f\xc0\x1b\x52\xe9\xb3\x47\xb3\x45\x34\x32\x6b\xe0\x62\x59\x29\xc8\x5c\x2b\x59\x8b\x3a" + - "\xe8\x9f\x51\x25\x1d\xd1\xe9\x06\x2e\x43\x9a\xe4\x7f\x42\x97\x50\xfd\xe7\xd4\xe1\x1d\xb1\x4f\x2a\x82\x7d\xd1\xb9" + - "\xe8\x20\x7f\xd5\x2a\xed\xf3\x8a\x1c\xf1\x69\x0a\xda\xce\xcb\x63\x9b\x98\xce\x3e\xa2\x4d\x75\xfa\x51\x1c\xb8\x52" + - "\x57\x5e\x7e\x54\x9f\x5e\xd7\xe6\xde\xfa\xfe\x22\xc5\x3c\x69\xd7\xf6\xf6\x6a\xde\x05\x75\xb5\x2f\x7e\x1d\x68\x5b" + - "\x69\x3e\x48\xe7\x71\x32\x76\x7d\xe3\xb1\x38\x10\x9b\x8d\x5d\x5a\x31\x0b\xdf\x74\xc8\x32\xd3\x09\x86\x7b\x46\x6e" + - "\x44\x89\xfd\xdd\x47\x55\x9f\xb6\xc2\xda\x2d\x79\x9e\x53\xe8\x92\x18\xdf\xbf\x67\xa3\xa2\xf8\xc9\x8b\xd3\x53\x71" + - "\xca\xde\xad\xe2\x55\x7e\x09\xd4\xef\xea\x70\x70\x78\x30\x38\xfc\xf6\xf3\xc2\x9c\x0e\x9f\xfc\x5f\x11\xe0\xf4\x65" + - "\xff\xf0\x1b\x8e\x6c\x4a\xea\x81\x15\xd6\xb1\x12\x63\x02\x7a\xfe\x8c\xc1\x9f\xaf\x6e\x96\x65\x8f\xbc\x5d\xdf\xc1" + - "\xd5\x87\xa6\x81\xff\x7a\xfd\x43\x0f\xbd\x75\x3f\xa8\x5c\xff\x1d\xd9\xb8\x69\xb1\x58\xea\x0c\xff\x24\xaf\x60\xf8" + - "\xab\x58\xc1\xcd\x51\x98\xea\x05\x5f\x9c\xec\xf8\x74\x92\x2f\x57\xf8\x63\x2e\xcd\xcb\xd5\x32\xd3\x53\x59\x29\x47" + - "\x52\x7e\x40\x3f\x7b\xe7\xb0\x7f\x25\x01\x26\x3b\x46\x55\x2f\xbd\xc7\xfe\x4e\x1a\xff\xfd\x0a\x84\xa9\xe0\xf1\x89" + - "\xf9\x8f\x77\x34\xc9\x72\xb2\xba\xbc\x5c\xff\xed\xf4\xb9\xff\xc1\xce\xe3\x3d\xe4\x5a\xdd\x9f\xb0\x07\x52\xe7\xc6" + - "\xcd\xe3\x24\x37\x95\xcc\xa7\xaa\x8f\x9a\x97\x99\x9e\xa2\xea\xd2\x9b\xba\x05\x5c\xbe\xb8\xff\x70\xae\xfb\x09\xb0" + - "\x8b\x00\xf2\xa4\x8b\xec\xe8\x12\x7d\x42\x4b\x95\xbe\x2c\xa6\xad\x51\x07\x3b\xa9\x2e\xcb\x15\xba\xbd\x1c\xd0\xdc" + - "\xd1\xd9\x01\xff\x46\xf2\xf1\x42\x4e\xe7\xc8\x79\xa1\x1e\x1a\x7f\x25\x5d\x07\xf8\xad\x6f\x79\x2b\xca\xad\x0d\x60" + - "\x0b\x7e\x2c\x01\xaf\x22\x2f\xf5\x9e\x98\x44\xb6\x16\x89\x67\xcb\x3d\x8b\x36\x0b\xf8\x06\x3e\xc2\x91\x39\xe7\xa0" + - "\xee\x8f\x9d\xab\x52\x66\xfd\xe5\xaa\xc4\xd0\x2f\x34\x45\xc9\x1c\x39\x2e\x53\x95\xde\xe1\x61\x6c\x59\x1b\xf7\x08" + - "\x26\xfa\xfa\xf9\x7f\xfd\xf7\x9b\x57\x7f\x7d\xfe\xee\xe4\x3f\x5f\x09\x20\x27\x4f\x9f\x8a\x27\x87\x8d\x0d\xb2\xb6" + - "\x73\x42\x28\x8a\x3a\x49\xfe\xb8\xed\xd6\xe2\x4d\xa0\x47\x1b\x51\x83\x1b\x54\x2c\x6d\x54\x4c\xb1\xec\xb1\x87\xde" + - "\x7f\xe7\xb2\xd2\x57\x2a\x08\x97\xb1\x6f\x6a\x8f\x1a\xa1\x38\x3d\x1f\xae\x42\xee\x61\xcb\xa5\x4a\xfb\x29\x46\x5b" + - "\x70\xa0\x0d\xba\xf8\xc0\x3d\xfd\x10\xaf\x48\x21\x05\x8f\x56\xe4\xe8\xc3\xd0\x16\x8f\x03\x44\x30\x16\xab\x42\x66" + - "\x31\x96\x9d\x62\x57\xcc\xa3\x16\x11\x34\x96\x4e\xe8\x16\x98\x6b\x73\xa6\x2f\x70\xb3\xc3\xee\xdd\x9e\xea\x9a\xee" + - "\xdf\x3e\xef\x1f\x06\x9b\xcd\x8e\x77\x80\xcc\x1d\xe4\x1c\x55\xba\x21\x42\xa0\xd2\x8d\x34\xeb\x7c\xba\x91\xab\xaa" + - "\x98\x15\xd3\x95\xc1\xbf\x96\x99\x5c\x6f\x90\xee\x15\x99\xd9\xa4\x70\x56\x36\xa9\x36\xc0\x51\xa6\x9b\xb9\x4e\x53" + - "\x95\x6f\xb4\x59\xc8\xe5\x26\x2b\x8a\xe5\x66\xb1\xca\x2a\xbd\xcc\xd4\xa6\x58\xaa\x7c\x53\x2a\x99\x82\xdc\xb9\xe1" + - "\xa8\xb7\x74\x63\xa6\xc5\x52\xa5\x3e\x0a\xe1\x27\x75\xb9\xca\x64\x29\xd4\xcd\xb2\x54\xc6\xe8\x22\x37\xf6\xd5\x2f" + - "\x73\x5d\x29\xb3\x94\x53\x25\xa6\x73\x59\xca\x69\xa5\x4a\x63\xc9\xe9\xf5\xf5\xf5\xe0\xfa\x09\x92\xd3\x77\x3f\x0d" + - "\xa7\xc6\x3c\xe9\xdb\x28\x07\x33\x7c\x70\xed\x3e\xbd\x7f\x6f\xc7\xff\x80\x45\x9f\x9d\x9f\xdf\x3c\x3e\x38\x3f\xaf" + - "\xce\xcf\xcb\xf3\xf3\xfc\xfc\x7c\x76\xd1\x61\x94\xb8\xa3\xeb\x75\x5e\xc9\x9b\xe1\x03\x3f\x0f\x38\xbf\xf6\xc7\xab" + - "\x7c\x5a\xa4\x14\x69\xd5\x49\x8e\x47\xe7\xe7\xe7\xe7\x83\xcd\xd9\xf9\xf9\x75\xff\x62\x73\xf6\xeb\xf9\xf9\xcd\xc1" + - "\x41\xff\xfc\xfc\x46\x1e\x5c\x74\xf7\x3b\x01\xf9\x2c\x8c\xca\xd0\x35\x46\x65\x2a\x05\xc1\x0f\x6e\x33\x34\x20\xeb" + - "\x99\x86\xdb\x26\x1c\x0d\xe4\x23\x60\xa2\x7f\x5f\x15\x95\x75\x52\x12\x66\x5e\xac\xb2\x14\xb8\x49\x59\xff\xf8\x93" + - "\xe0\x24\x2b\xba\xce\x94\x7f\x48\x43\xd1\x59\x14\xb4\xee\x51\x7b\x67\x2f\x4e\x4f\x1f\x1f\x0e\xcd\x1a\x2e\x4b\x39" + - "\x98\x57\x8b\xec\x01\xce\xaa\x9f\xaa\x59\xdf\xcf\x04\x0e\x8c\x9f\xd6\x58\x34\xc0\xe6\x55\xa4\x9d\xeb\x4e\x4f\x74" + - "\xae\x1f\x44\x2e\x46\x76\x8a\x2e\xa0\xc5\x6c\x99\xcf\x47\xd7\xe5\x9e\x22\xf6\x9f\x9f\x9f\xc1\x7d\x10\x60\xc7\xbe" + - "\xe8\x3c\x4a\xe0\x59\x73\x67\xf7\x45\xa7\x9b\x1c\x8f\xea\x1f\xb0\x5c\xf0\xe3\x52\x95\xa8\x54\x4a\xa6\x72\x59\xad" + - "\x4a\x25\xd0\xf0\xb5\xd3\x79\x94\x9c\x3d\xfa\xf5\x8b\xcd\xee\x3f\x2e\x8e\xc7\xdd\x2d\x1f\x77\xfc\x0a\x49\x89\x21" + - "\x16\x20\x70\x4d\x54\x6d\x47\x8d\x38\xb3\xbd\x7f\x75\x81\x0e\xad\xe4\xdf\xe2\x1f\x3f\x41\x2f\x02\xfe\xf1\x25\x79" + - "\x73\x74\x1e\x25\xc7\xa3\x87\x89\x47\xcb\x5f\xe1\xdf\x87\x17\xdd\x47\xdd\x87\x9b\xf3\x4e\xfd\xc5\x79\x07\xde\x9c" + - "\x77\x36\x08\x87\x60\xdf\x00\x00\xdd\x4d\xeb\x1a\x3a\x8f\xce\xcf\x2f\x18\xaf\x97\x46\xad\xd2\x02\xe1\x3b\xba\x1b" + - "\x94\xe7\xe7\x09\x34\x60\x20\xbc\x2b\x44\xa9\xd2\xd5\x94\x44\x02\x76\xe0\x29\x66\x7e\xcf\x51\xc2\x40\xfd\x1e\x33" + - "\x33\x56\x9a\x5d\x96\xea\x7b\x9d\x55\x20\x5e\xd1\x4d\xee\x85\x38\xeb\x25\x73\x38\x10\x7c\x6a\xdc\xfe\x3c\x39\xf2" + - "\x80\x0a\xa1\xf6\x15\xed\x5b\xf2\xf9\x10\xeb\x6e\xfc\x6a\x1e\x0f\x84\xd1\x8b\x65\xa6\xfc\x80\x5f\x73\xc7\xb5\xaf" + - "\x93\xee\xd9\xf9\xf9\xc5\x05\x7c\x2b\x02\xf4\x04\x18\x3d\x0a\x7b\x7c\x02\x5c\xe8\x9a\xdc\x97\x51\x1b\x54\xc7\xb4" + - "\xc1\x23\x6e\xdc\xe9\x9e\x9f\xc3\x46\x79\x3a\x43\x5e\x51\xc8\xc5\xe6\x45\xde\x57\x66\x2a\x97\x2a\x15\x55\x29\x75" + - "\x06\x2f\xfc\x7e\xf6\x18\x0e\xf0\xd4\x14\x0b\x85\xed\xaf\x5b\xc9\xf0\xb2\x54\x53\xde\x90\xb9\x12\xa8\x01\x2a\x83" + - "\x20\x41\xe0\xb1\x48\x22\x4b\x44\xe7\xd7\xe6\x39\xdb\xdf\x00\x24\x7e\x65\x28\x5c\x74\x2d\x58\xba\x8f\x1a\x28\x26" + - "\x3a\xfb\x5f\x00\x59\xb8\x74\x54\xa1\x9c\x16\x8b\x85\xfc\x84\x51\x1e\xf5\x5a\x9e\x51\x37\xd8\xc9\x44\xe7\x12\x91" + - "\xeb\x13\xba\x4a\xce\x9e\xed\xff\x83\x36\x2a\x7e\xd3\x32\xe1\x47\x7e\xaa\x6e\x53\xff\x06\x18\xd8\x18\x69\xdc\x3a" + - "\xd2\xaf\xe7\xe7\x17\x0f\xcf\x3b\x17\x8f\x8e\xdb\x3a\xc7\xd3\x16\xc1\x83\x4e\x5d\xad\x6f\x7b\x14\x69\xb5\x11\x09" + - "\x6e\x2e\x36\x3e\xe9\x5f\xb8\xae\x91\xef\x06\xd9\x82\xe3\x18\x77\x3a\x27\x2f\x3b\xa3\x5a\x07\x0f\xee\x38\xe9\x0c" + - "\xed\x9d\xce\x8b\x1f\x9e\x9f\x9e\x36\x3e\x3d\x3f\x1f\x7c\xca\xc7\xef\x9e\xff\xb5\xf1\x69\xfb\x77\x8d\xcb\x04\xf6" + - "\x22\xee\xec\xf9\xbb\x77\x3f\x35\x7a\xab\x1d\x40\x6e\xfa\xf6\xf4\xd5\xcf\x2f\x7f\x6c\x6d\x1c\x81\x77\xa7\xf3\xe2" + - "\x3f\x4e\x7e\x68\x42\x66\x94\x20\xf7\x83\x76\x96\x4d\x26\x4d\xb5\xc9\xab\x39\xfc\x7f\x1f\x7e\x74\xfb\xc9\x74\xae" + - "\xb3\x74\x53\xcc\xfa\xc0\x56\x33\x59\x6c\xa3\xb1\x40\xc7\xd5\x95\xca\x37\x45\x9a\x6e\x92\xe4\x6c\xbf\x7f\xb1\xe9" + - "\x26\xe7\xe7\xe9\xa3\x6e\xde\xa4\xca\x02\xa9\x3e\xb7\xda\xd6\xdd\xf9\x79\xba\xdf\xdd\x74\xdb\x31\x0c\x29\x88\xe8" + - "\x68\x07\x34\xe0\x1b\x9b\x5b\x40\x37\xa2\xe3\x29\x01\xcc\x5f\x44\xdf\x71\x9c\xce\x0a\xfd\x11\x45\x86\x89\x4b\x30" + - "\x30\x1f\xa8\x23\x10\x69\xd8\xea\x81\x36\x89\xf5\xc0\xfc\x45\x61\x63\x54\x4c\x02\x4f\xfc\xf6\xc7\x53\x32\x74\xb0" + - "\x9b\xf6\x6f\x74\x23\xfc\x86\x93\x42\xad\x13\xcb\xac\xad\x9b\x54\x5b\x17\x1d\xe1\x91\x87\xa4\xfa\x7d\x73\x59\x6d" + - "\x32\xda\x16\xbf\x4b\x7e\x23\x10\x58\x75\xd0\x26\xc7\xa3\xfe\xf9\x79\xda\x3d\x46\xf8\x6f\x83\x5f\x72\x3c\x3e\xfb" + - "\xb5\x7f\xb1\xf9\xc2\x41\xd2\x73\xe1\xa5\x06\xc9\xda\x60\xb4\x73\x72\x3c\xc2\x5f\xcc\x86\x6f\x60\x31\xb2\x54\x72" + - "\x33\x59\x55\x55\x91\x77\xbf\x18\xa2\xac\x5f\xce\x95\x24\x51\x70\xf8\xeb\xfc\x3c\xa5\xa7\xf0\xdc\x09\x42\xc3\x5f" + - "\xcf\x7e\xfd\xe3\x62\xff\xfc\x8f\x73\xf3\xe8\xfc\x8c\x1f\x9f\x5f\x0f\xbd\x7f\x9a\x34\x3a\x5b\xf7\xd1\x2b\x15\xf8" + - "\xf7\x61\xa9\xaa\x52\xab\x2b\xf8\x5b\x9c\xbc\x84\x7b\xf0\xdd\xf3\xbf\xc2\x3f\x78\x58\x45\xc8\x3b\x95\xbf\xaf\x34" + - "\x5a\xad\x4a\x3b\xe9\x07\xc9\x19\x70\xb8\xfb\xdd\x4d\x72\x7e\xbd\xdf\xdd\x9c\x0f\xec\x83\xee\x17\x3c\x66\x69\xf4" + - "\x24\x23\xc6\x78\x78\xb6\xff\x8f\x0b\x0a\xea\xa6\x0b\x08\x9e\x3d\xdc\x9c\x9f\x07\xc1\xe2\xc0\xef\xd0\xcb\x2d\x6c" + - "\x7e\x0b\xc7\xc9\xb7\x59\x3f\xe2\x95\xcb\x55\xee\x06\x89\x90\x02\xaf\xdc\xb3\xf3\xf3\x54\xf6\x67\x17\x7f\x1c\xf6" + - "\xbe\xbe\x6d\xee\xde\xf1\xa6\x71\x02\x45\xa7\xbb\x19\xd0\x36\x32\xd5\xdd\x99\x05\x43\x78\xb1\xef\xbf\x7b\xbc\x80" + - "\xd4\xfd\x11\x48\x31\x81\x3c\x38\xd7\x97\x20\xa8\x76\x0e\x6e\x60\x2c\x7b\x25\xf7\xc5\xc1\xcd\xe1\xc1\xc1\xc1\x81" + - "\xcd\x6e\xf2\x46\xbe\x11\x0b\x3c\x5a\x70\x13\x4f\x8b\x54\x2d\x0b\xed\x52\xb7\xd4\xd3\x52\x3c\x7d\xfc\xa5\x3d\x45" + - "\x45\xf9\x41\x96\xc5\x2a\x4f\x31\xa9\x40\xae\x8a\x95\xf3\xb5\x16\xce\x63\xda\xe5\x62\xd9\x87\x79\x04\x12\x23\xce" + - "\x6e\x77\x3c\xa6\x3f\x36\x9b\x96\xb5\x90\x55\xdf\x4e\x9c\x1c\x1f\xb0\x35\x46\x11\xde\xb7\x41\x16\xdf\xbd\x7e\x2b" + - "\xa2\x69\xef\xec\xb0\x8b\xe5\xac\x2c\x16\x2f\xe6\xb2\x7c\x51\xa4\x2a\xa1\x81\xf6\xed\xf2\x5d\xd6\x15\xbb\x4a\xa2" + - "\x15\x32\x13\x6f\x33\x99\x2b\xdf\xa3\x48\xcc\xaa\x2c\x8b\x4b\x59\x29\xb1\x94\xba\xec\x7e\x6c\x88\x67\xcf\xc4\xe1" + - "\x81\xd8\x88\x83\x9b\x97\xdf\x1c\x1c\xf4\xe8\xe1\x9e\x38\xb8\x79\xf2\xfd\xf7\xf4\xf8\xc5\x81\x8d\xc4\xb4\xda\xea" + - "\x1f\x97\x95\x5e\x00\xc7\x09\xf4\x08\xbd\x13\xd8\xae\xf0\xdf\x3d\x4c\x9a\xf3\x83\x36\x15\x1c\xee\xaa\x5c\xe3\x06" + - "\x07\x4d\x60\x3a\x09\xe9\x32\x42\x33\x43\xa8\x72\x1a\xe0\x15\x00\xfd\x18\x41\x0a\xa9\x9d\x2d\xaf\xef\xdf\x23\x87" + - "\x89\x76\xc7\x95\x03\x9b\x05\xa3\x52\xd3\x4a\x18\x9d\x51\x12\xa0\x19\x33\x79\x7e\x52\xa4\x5d\x39\xdb\x36\x09\x17" + - "\xad\xee\x54\xc4\x47\xf7\xef\xdd\x8a\x29\xd0\x60\x91\x08\x8b\xc5\xac\x69\xf9\x83\xac\x69\x14\x0d\xc9\x5f\x1e\x3b" + - "\x7b\xc9\x0f\x98\xde\xe5\x52\x71\x3e\x14\x3d\x13\x36\xf2\x0e\x55\x1e\xde\xc1\x06\x8d\x55\x3d\xe0\x6c\x9d\x56\x23" + - "\x50\xf2\xb8\x38\x5b\x6e\x16\x80\x52\x65\xc6\xd9\x69\x6c\x38\x7d\x08\x9f\x93\x57\x4f\xbf\xb5\x42\x9a\x75\xca\x14" + - "\xe4\xea\x29\xc8\x71\x12\x01\xf2\x91\xb9\x60\x4a\x22\x17\x92\x16\x99\xbb\xc9\x2a\x4e\x9a\x17\x97\xe6\xa6\x2a\x41" + - "\x82\xb3\xb8\xc1\xed\xed\x55\x02\x52\x81\xe0\x98\xc1\xb3\xf7\xfb\xfb\x17\x68\x46\x37\x67\x7a\x7f\xff\x02\xb5\xf7" + - "\x64\x64\x8d\xc6\x12\x63\xf1\x5e\xf4\xc5\xa1\xd3\xe3\xdd\x92\x6e\x3c\xb0\x3d\x90\x42\xbc\x25\x05\x88\xf3\x10\xea" + - "\x51\xac\xb8\xb7\x49\xe0\xbd\x6a\x1d\x5c\x16\x3d\x61\x37\xdc\xde\xdc\x7f\x3b\x7d\x6e\xb5\xba\x3b\xba\x27\x2e\xcb" + - "\x62\xb5\x34\x3d\x51\x64\x69\x4f\xe4\x1a\xfe\xa3\xae\xad\xc6\x18\xfe\xb6\x8a\xf8\xc0\x74\xe1\x8d\x6f\xc7\xf6\xaf" + - "\x41\x71\x9d\xab\xd2\xea\x88\x81\xba\xd8\x26\xa3\x08\x27\x39\xa2\xa0\x9e\x5b\x29\xd0\x2f\x27\xb5\x2c\x27\x36\x4d" + - "\x86\x73\xf5\x75\x66\x3f\xdb\xc9\x11\xdd\x3f\xe8\x16\xd5\xea\x20\x45\x16\x4d\x0b\xc3\xc0\x7f\xdc\x3d\xda\x6d\xb1" + - "\xe5\x3a\x5f\x24\xec\xaf\x66\x6d\x49\xbc\xa9\xc5\x81\xc0\x3e\xa2\x25\xa2\xf9\xc5\xb5\x82\x27\xdf\xd6\x7a\xc6\xe9" + - "\x85\x9d\xc6\xfa\x73\x8c\x4b\xf5\x9b\x6b\x0f\xc1\xbc\x28\xab\xe9\xaa\x0a\x02\x38\x71\xc7\x61\xe5\xee\x36\x1f\xa8" + - "\x1b\x35\xf5\x58\x23\xba\xdd\xd0\x55\xfc\x74\xa9\x54\xda\x5f\x2d\x47\x16\xbd\x3a\x0f\x4e\x5e\x52\xb4\x8c\xed\x51" + - "\x8c\x09\x8f\xce\x0e\x2f\xba\xb5\xcc\x58\x91\x8d\xe9\xdb\xc0\xbd\x00\xd5\x97\x1e\x1a\x97\xaa\x62\xe7\xed\xef\xd6" + - "\x27\x69\x22\x16\xce\xdf\x00\x8f\x14\xda\xb7\xbd\x23\x36\xb9\x2e\xc3\x3a\x30\xd8\xf7\xbb\x4c\x4e\x3f\x4c\x54\x59" + - "\xae\xc5\x97\x83\xaf\xd9\x4e\x6d\xfc\xe7\x18\xc5\x42\x5e\x40\xb2\x04\x89\x56\x64\x45\x7e\xa9\x4a\xab\x3f\x70\xf8" + - "\x95\xb0\xf9\xe7\xc1\xd7\xdf\x7e\xfd\x84\x2f\x12\x5a\x07\x4e\xd7\x7a\x04\x07\x13\x09\xfc\x10\x7d\x18\x32\x9a\x34" + - "\x39\x14\xb9\x54\xe2\xe4\x55\x8f\xd4\x43\x3d\x14\xc0\x7f\x51\x93\x0f\xda\x59\xd3\x9d\x9f\x12\x77\x31\x59\xdb\xc0" + - "\x0c\x53\x29\x89\x26\xe6\x93\x97\xf6\xbd\x9b\xca\x40\xa7\x08\xd1\x45\x38\x01\x8b\xd6\x81\x03\x91\x87\x62\x1b\x86" + - "\x86\x1e\x93\x8d\x80\xce\xf6\xe6\xd6\xbf\x32\x6e\x4c\xbe\xe5\x78\xd2\xd8\xaa\x1c\xe7\x98\xf3\x1e\xfe\x6d\xc7\x7f" + - "\x6f\x4f\x24\x35\x74\x88\x1a\xb4\x21\x47\xd7\x85\xff\xec\x38\x6b\x50\xe2\xc9\x1d\x2b\xc7\xed\x86\xb5\x41\xeb\x4e" + - "\x60\xdd\xbd\x78\x9f\xb2\xa5\x79\x38\x40\x4c\x25\xcc\x09\xe3\x46\xe9\x78\x3c\xbe\xf0\x13\x08\x99\x08\x47\x9c\x9b" + - "\xa7\xc1\x7c\xb7\x7e\x27\x2f\xdf\xc8\x85\x0a\x0f\xa8\x9b\x69\x63\x9e\xdb\x27\x36\x20\xe9\xbb\x39\xb7\xe0\xfc\x3e" + - "\xb9\x40\x98\xb1\x4d\x31\x9e\x06\x06\x90\x59\xc7\xf8\xd6\x89\xfa\x16\xff\xc4\x2a\xdd\xc7\xb8\xbd\xdb\x17\xd8\xf4" + - "\x3d\x82\x2b\x6a\x29\xe9\x72\xc5\x05\xd9\xe9\xff\x6e\x24\xe2\xd6\xae\xb3\x2b\x02\x31\xf7\xbf\x06\x95\x32\x55\x3b" + - "\xdd\xcb\xd1\xf9\xa2\xc8\xe0\xbf\x6c\x42\xa4\xb1\xfd\x75\xe7\xb1\xd5\xbd\x71\x56\xe8\x71\x9d\xee\x01\x50\xa3\x9b" + - "\x11\x67\xfe\xfb\xe9\x73\x71\x5d\x94\x1f\x8c\x30\x55\x29\xf3\x4b\x85\x49\x00\x04\x03\xa5\x5f\x16\xa8\xb0\xfc\x7d" + - "\xa5\x40\x5e\xb6\x1f\xfd\x82\x56\x29\xfc\x4e\x30\x7f\x4f\xf9\xf4\xd6\xe4\x76\x3e\x63\xbf\x26\xa1\x6e\xaa\x52\xa2" + - "\x4c\x47\x54\x0e\xba\xb3\x9d\x00\x1d\x82\x1e\x30\xe1\xd4\xd2\xe5\x32\x2a\x95\x48\xde\xcd\x65\xfe\x01\xfd\x38\x80" + - "\xb1\x54\xd7\xe2\xe5\x6a\x59\xe4\x95\xf3\x5f\xaf\xd4\x74\x8e\x3e\x2f\x5d\xdb\xd9\xc9\x2b\xf1\x8d\x48\x0b\x85\x81" + - "\x71\x38\xaf\xc2\x86\xb8\xb9\xac\x43\xfe\xba\x68\x7a\x1d\x84\x37\x62\x4b\xa0\xc5\x6e\x4b\xfe\xcd\x9d\x1d\xe2\x44" + - "\x80\x21\x63\x65\x70\xb8\x91\xb1\x87\x5b\x42\xfb\x18\xa0\x9d\x53\xb7\x27\x1d\x9d\x76\xba\x61\x18\xbd\xdb\xf9\xc0" + - "\x6b\x9b\x44\x9c\x1e\xc8\x8e\x5f\xec\x05\xb9\x19\x63\x22\x68\xfb\x37\x61\xff\x02\x06\x40\x56\xa9\x9e\xd2\x91\x06" + - "\xea\x9c\xe9\x74\xfc\x10\x9d\x4d\x74\x0a\x52\xe6\xc3\x0b\xd1\xf1\xd3\x17\x63\x66\xb9\x42\x3b\xa1\x67\x21\x75\xbf" + - "\x1f\x4c\x9d\x5a\xa2\x7d\x90\x7b\xab\x0a\x8b\x92\x89\xf0\x6f\xeb\x13\x09\x51\xda\x8a\xeb\x8d\xb3\x81\xf9\x51\x95" + - "\x73\x0f\xf0\xb4\x3c\xba\x0c\x3d\x27\x77\xe4\x3a\x0f\x4e\x05\xaf\xe5\x7d\xa1\xf3\xa4\xd3\xeb\x78\xbf\xd6\x00\x3d" + - "\x82\x0f\xdc\xd2\xac\x58\xb5\x8d\xa4\x58\xb2\xed\x97\x32\x40\x57\x0b\xdb\xd3\x73\x90\xb8\xa2\x9e\xf9\x0b\x47\xf1" + - "\x5b\x09\x3e\x8b\x3c\xc9\xef\x46\xa2\x33\x91\x9b\xcf\xad\x98\x69\x72\x29\x8c\xb2\x2f\xec\x02\xa2\x45\x69\x17\x68" + - "\x2e\xe4\xe6\x55\x43\xba\x3b\x23\x16\x7c\x82\x80\xe7\x59\x46\x8e\x27\xc6\x3b\xdf\xd0\xae\xf8\xdd\x69\x06\x18\x7c" + - "\x71\xd8\x11\xdd\xed\xec\xbf\x95\x1c\x86\x8f\xd8\x09\x06\xdd\x0e\xc4\x07\xb5\xee\x93\x51\x71\x2a\xd1\x79\xbb\x98" + - "\x89\x4c\x2f\x34\x50\x21\xa3\xff\x4e\xbe\x2c\xff\x3f\x66\xaf\xc4\x1f\xce\xd7\x8f\x58\xe1\x1e\x3b\x5e\x75\x6f\x39" + - "\xab\x01\xb9\x5b\xb3\x37\x16\x86\x92\xc9\x59\x85\x41\xd9\x05\x65\x5c\xa8\x80\x50\x70\x12\x94\x6b\x0d\x14\x5c\x3c" + - "\xda\x71\x01\xca\xc8\x06\x41\x0f\x09\xaa\x1b\xfa\x66\x35\x9b\xe9\x1b\x95\x76\x6d\xe0\x18\x10\xb1\x44\x73\x24\x23" + - "\x3a\x50\x68\x23\x32\x90\x99\x80\x52\xc9\x5c\x20\x73\x8b\x6f\x7e\xc0\xd3\xd3\xc5\x01\x52\x95\xa9\xca\x5a\x2d\x8a" + - "\x2c\x55\xa6\x12\x2a\xaf\xca\x35\xfb\xdc\x38\x71\x2a\x72\xc6\x70\x12\xd3\x07\xb5\x36\x81\xe7\xb2\x6f\x8d\xed\xe0" + - "\x75\xcf\x7a\xcc\xba\xe0\xed\x9f\x8d\x12\xc9\x07\xb5\x86\x03\x2e\x3a\x5d\xf4\x50\xc5\xa0\xc0\x69\x91\x65\x1a\x93" + - "\x0b\x50\xb4\x2f\x29\xec\x7c\xe6\xc0\xc0\xd5\x2e\x31\x4a\x89\x13\x63\x56\x4a\x3c\x38\xfc\xea\x2f\x5d\x77\xdd\xc1" + - "\x84\x98\x8b\x71\x43\x88\xae\x78\xd6\x58\x7e\xc8\xd5\x63\xe2\x97\x0f\x4a\x2d\x7d\x4c\x52\xa9\xa6\xc0\x8d\x01\x28" + - "\xec\x75\x83\xa0\x62\xe0\x9e\xd1\x40\x66\xae\x67\x55\xd2\xf5\x21\x06\xee\xec\x24\xbe\x19\x4f\x02\x08\x11\x82\xc2" + - "\xca\x66\x3e\x33\xd7\x74\xae\xea\x48\xf8\x5a\xc2\x8d\xe6\xdd\x78\xe1\xc2\xe1\x40\x2a\xd4\x07\x4f\xd6\xcc\xcb\x10" + - "\x1a\x2e\x65\x29\x17\x1e\x09\x6f\xc5\x2c\xc7\x7c\x86\xa1\x1b\xf0\x42\x96\x1f\xea\xbb\x0a\xcf\x6a\x5e\xaa\x00\x95" + - "\x59\x7e\x66\x6f\x7a\x9c\xb7\x75\x99\x71\x9e\xa4\xf5\xe9\xb2\x7e\x01\x89\x22\xe5\x6d\xb4\xf7\x2e\x5d\x79\xdb\x67" + - "\xf9\x16\xf3\xfa\xf8\x6c\xc8\x2a\x15\xa9\xbe\x42\x74\x56\x18\x12\x60\x84\x74\xd9\x91\xe8\xe4\xd6\x17\x01\x3d\x94" + - "\x55\x30\x7d\xc0\x4c\xe8\x64\x7b\x48\x6c\xaa\xaf\x3a\x7c\x31\x3a\x72\x6a\x73\x18\xec\xce\xf2\x04\x3f\xa7\x8d\xb2" + - "\x9a\x1e\xb5\xcd\x8f\x30\x26\x7f\xe8\xc2\x81\x19\x5b\x90\x8f\xd0\x95\x61\x51\x0d\xb6\x8c\xd3\x4b\x3a\x6c\x4d\xf5" + - "\x55\x9b\xfc\x14\x3f\x8e\x03\x6d\xdd\xc4\x5c\xa8\x78\x49\x2e\x77\x62\xa1\x16\x45\xb9\x06\x31\xee\xe4\x15\xbc\x22" + - "\x08\xe4\xab\x2c\x63\x84\x8b\x76\xec\x79\x9a\x1a\xef\x9d\x6b\x3d\x76\x01\xcd\x24\x10\xd9\x99\xf3\x8c\xa6\x34\x2c" + - "\xb2\xaa\xd8\xc3\xcf\xee\x22\xe9\x14\x6f\xe9\x8d\x78\xab\x97\xaa\x6f\x14\xbc\x83\x2d\xcc\xb4\xa9\x30\xd1\x9e\xb3" + - "\x20\x6d\xc1\x00\x3b\x30\x20\x2b\x79\x43\x91\x68\x8a\x8e\xd6\x13\x54\x4d\x65\x5a\xa5\x8d\x2d\x4f\x53\x12\x2f\x13" + - "\x1a\xbf\xe7\x3a\xf2\x18\x40\x6a\x46\x7c\x6d\xfd\x5e\x37\x9d\xae\xcb\x08\x46\x2f\xc2\xf8\xa2\x16\x46\x02\xa9\x06" + - "\xb4\xa4\xd1\x30\x64\x0b\xb8\x06\x38\x14\x3c\x62\x1b\x70\x51\x44\x37\x5e\x94\x2e\xd0\x69\x0d\x80\x7a\x5d\x08\x66" + - "\x2a\x62\x88\x30\x66\xde\x0a\xd9\xfe\x78\x52\xbb\x6e\xc8\xff\xd7\x5f\x2e\x99\xc2\x80\x1e\x99\x8b\x03\x10\x64\x24" + - "\xdb\xa3\x95\x11\x93\x9e\xb8\x44\xe4\x2f\xa3\xf7\xb3\x22\xcb\x8a\x6b\x43\x1d\x87\xa0\xe5\xe9\xe1\x12\x22\xe7\x3a" + - "\x8c\x6e\x5a\x01\x4c\x27\xc0\xff\x48\xca\x99\xa6\x67\x33\x60\x27\x57\x25\x3e\x6b\x71\xa3\x9d\x34\x9f\x21\x92\x27" + - "\xe2\x1f\x93\x81\x29\x56\xe5\x54\x9d\xe4\xa9\xba\x01\x76\x29\xf2\x9b\xeb\x8a\xbe\x6d\x28\xef\x6e\xe8\x92\xb5\xc1" + - "\xd5\x72\xf2\x4a\x84\x8d\x61\xb1\x57\x52\xa3\xc7\x3f\xdc\xb0\x93\x02\x53\x7b\x91\xfa\x98\x0f\xe1\x6c\x56\x53\x2f" + - "\xc1\xa3\x28\x55\x19\xe9\x5c\xf4\x4c\x4c\x1c\xe0\xa4\xfd\x1e\xd6\xce\x9f\x3b\x6d\x26\xc1\x69\xba\x2a\x07\xb9\xba" + - "\xa9\x4e\x09\xa4\xdd\xd8\x7f\x0d\xdb\x44\x8e\x8a\xb1\x83\x5a\x83\x01\xb2\x51\x7a\xe2\x58\x1c\x8a\x11\xb5\x8a\xd0" + - "\xce\x22\x43\x1c\xfe\xc1\xb6\x46\x6b\x9f\xa5\x48\xa8\xe5\xaa\x42\x4d\x5e\xfb\x99\x86\x37\xed\x0c\x00\x7a\xc0\xbe" + - "\xc5\xae\xd8\x0f\x9b\x26\x6f\xa9\xe2\x56\x87\x3f\x64\x60\xc6\x77\x05\x91\x87\xf9\x15\xa9\x35\xc8\x3a\x38\xd5\x8e" + - "\x53\x5e\x38\x57\xeb\x8a\x14\xf1\x5e\xf1\xfb\xd9\x40\x20\x73\xe2\xe7\x02\xe0\x3b\xfc\xea\xdf\x0f\x81\xa4\x01\x82" + - "\xcd\x26\x00\x0b\x4d\xbe\xd3\xfd\x77\x00\xc6\x26\xba\x90\xd9\x36\xaa\x3d\xcb\xdb\x81\xf3\xd6\x7d\x69\x01\xe4\xee" + - "\x64\x17\xa3\x17\x30\x1c\x61\xe0\xee\x65\xa4\xd4\x76\xbf\xc7\x62\xdf\xfe\x1d\x42\x67\x4b\x37\xc0\xd0\xf7\x6c\x1c" + - "\x60\x6c\xad\x60\xb1\x08\xdf\x21\x65\x40\xdf\x13\xb8\xea\xcf\x2e\x48\x12\xb0\x66\x8c\x60\x32\x81\x49\x23\xfc\x30" + - "\x8e\x4a\x75\x69\xbd\x7d\x56\xe1\x19\x6a\x22\x64\x55\xbb\x44\x35\x7d\x1e\x19\x3e\x22\xa9\x95\x34\x36\x4a\xa5\x67" + - "\x22\x79\x5f\x1b\xf4\x4c\x5f\x74\x45\xa0\x33\xdb\xc1\x76\xef\xe1\x26\xda\x4d\x78\xc9\xf4\x93\x5f\xb4\xc5\xa8\x11" + - "\x4b\xd3\x14\x79\xe8\xbe\x92\x94\x8f\x63\x46\x89\x93\x74\xaa\xab\x35\x25\x90\xe6\xe0\x02\x97\xb0\xa5\x79\x43\x6d" + - "\x48\xb2\x19\xdf\xc6\x8d\xdc\x7d\x15\x37\xdb\x70\x18\xcb\x2d\xde\xfb\x44\x8d\x70\x68\xa0\xd6\xd3\xa9\x5a\x56\x14" + - "\xa0\x55\x78\x13\x15\x32\x5c\x6b\xe2\xa0\xeb\xc8\xd7\x26\x8a\xc7\x68\x67\x1f\xfa\xba\x26\x77\x69\x17\x51\xcb\x12" + - "\xb9\x79\x7b\xc5\x8c\x03\xdd\x10\x44\x8a\xc2\x28\x57\x05\xe0\x4a\x96\x74\x7e\xa6\x45\x7e\xa5\x72\xad\xf2\xa9\xba" + - "\x7f\xcf\xd7\x08\xe0\x72\x33\x8d\xa2\x01\x76\x13\xc8\x52\x69\xc4\x7f\xbd\xfe\xc1\x5e\x50\x5b\xe1\x7c\x4b\xd4\xe5" + - "\xb9\x63\xb0\x31\xcd\x62\xa0\x66\x8e\x80\xef\xa1\x5d\xae\x00\xc6\x94\xff\x9a\x72\x30\xe5\x45\xde\x47\x93\x89\x1d" + - "\x96\x81\x8b\xc1\x12\x7e\xd6\xf6\x67\x2b\x79\x1b\x0e\xdd\xc8\xaf\x6c\x9e\x66\x23\xae\x54\x49\x68\x4f\xd9\xed\x8d" + - "\xb2\xa5\x5f\x74\xe5\x14\x64\x6b\x55\x51\x84\x14\x27\x71\xb6\xb5\x57\xb2\x82\x7c\xf4\xf4\xac\x94\x0b\x4c\x3a\x06" + - "\xf7\x7a\x5f\x3c\xf8\xf2\x9b\x27\x68\x8b\x40\x16\xbf\x36\xe6\xd8\x19\x26\x50\x83\xde\xb4\xab\xc1\xd3\xee\xa0\xf6" + - "\x59\x20\xd7\xd4\x3b\x3c\xae\x3f\xf1\xf9\x50\x50\x0f\x07\x70\xeb\x88\x91\x93\x05\xe2\xfd\x3c\x55\x95\x67\x01\xfb" + - "\xa5\xa2\x98\xbe\x2b\x59\x6a\x40\x6e\x23\x8a\x7c\x4a\x99\x40\x53\xab\x94\xb4\xd9\xf0\xe3\x6d\xdc\x82\x00\x67\x69" + - "\x31\xbd\xa8\x61\x80\x67\x38\x49\xcf\xc0\xf4\xbd\x2a\x30\x17\x7c\x68\xdd\xa9\x61\x88\xed\x34\xd4\x55\xb4\xcd\x66" + - "\x78\xff\x5e\x60\x6f\x0c\x90\x3a\x7a\x18\x24\x97\xf7\x62\x0d\xd7\xd6\x78\x51\x2c\x40\xb4\x21\xe6\x11\x03\x4c\xb0" + - "\xcd\x31\xfe\xd3\xdc\x32\x7c\x19\xdb\x41\xc9\x25\x80\x64\x2a\x94\xf0\x06\x2c\x56\xfd\xa7\x56\xd7\x8e\x15\x3c\x99" + - "\x89\xbc\x08\x6a\x6e\xe4\x69\x1b\x8e\x3a\xd6\xb0\xc7\x26\xa8\xc0\x9e\x88\xb7\x69\x1a\xcc\x05\x86\xaa\x59\x25\x37" + - "\x1b\xb1\x8b\x33\xa8\x75\x5d\x63\x27\x03\x6b\xeb\xad\x4f\xc6\x58\x89\x62\x55\x86\xa6\xa1\xa0\xd6\x47\x5a\x4c\x8f" + - "\x7c\x84\x90\x5d\x67\x03\x73\x23\xef\x07\xa4\x83\xa6\x11\x4c\x84\x69\x03\xe0\xf8\xd2\xaa\xba\xf5\xcf\x46\xe2\xe4" + - "\xd5\xb3\x6f\x1c\xd4\xe8\xc8\xf9\x85\x03\x94\x8c\xd1\x97\x39\x25\x49\xea\xf8\xb2\x3c\x16\x95\x11\xb8\xda\x7d\x39" + - "\x97\x46\x4c\x94\x02\x69\x1d\x8e\x31\x45\xc4\x90\x66\x1c\xa5\x3a\x4a\x61\xd9\x59\xaa\x72\xa1\x31\xc0\x41\xa4\x40" + - "\x2d\xd3\x0e\xd7\xfb\x40\x2b\x26\xdc\x02\x06\x95\x08\x2d\x03\xe2\x7d\x6d\xa3\xd3\x1e\x1c\x3e\xf9\xf6\xc9\xd7\x76" + - "\x88\xaf\xfb\xdf\xd8\xca\x4f\x96\xd0\x56\xbe\xae\x03\x60\x88\x4f\xfa\x67\x0a\x2b\x9a\x5b\x69\xd3\x11\x7c\x8b\x06" + - "\xfc\x7e\x6f\xcf\xfe\x05\xdb\x4e\x7f\x0e\xaa\x62\x19\x68\xb5\x4e\x5e\x1d\x1e\x22\x59\xc3\xb1\xe7\xf2\x4a\x71\xb0" + - "\xe8\xab\x2b\x95\x57\x18\xea\x0a\x82\x35\xba\xb2\x9b\xd5\x6c\x86\xde\xc1\xe1\x20\x03\x99\xa6\xd8\xf6\x07\x6d\x2a" + - "\x95\xfb\x92\x1b\x3b\x5b\xde\x27\xa2\xb3\xca\x01\xc2\x9d\x5e\x33\xe6\x37\x72\x0b\xb0\xaa\xe5\x9e\xcd\x17\xc3\xfe" + - "\x21\xde\xec\x65\x87\xf0\x33\x6e\x8c\xee\x5f\x25\xa2\x53\xe4\x9f\x39\xb4\x57\x59\xf0\x01\x78\xe4\x03\x19\x00\x65" + - "\xfb\x7f\xca\xff\xb8\x00\x5a\xdd\xe3\x85\x91\xfb\x3f\xe1\x42\x5a\x93\x7e\x21\xb4\x7b\x60\xe1\xad\xcc\x26\x23\x35" + - "\xa1\xdb\x2b\xf9\x88\x57\x91\xea\x51\xdd\x00\x83\x02\xa8\x79\xf2\xea\x1b\xe7\xeb\xd9\xf5\xe1\x87\x83\x28\xae\x82" + - "\xb5\x53\x9e\x26\xa2\x06\x87\x60\x95\xea\xab\xc1\xd4\x19\x0a\x81\xd5\xef\x84\x5c\xee\x2e\xbc\x8f\x2d\x34\xae\x75" + - "\xc7\xb3\x72\x04\x4e\xcf\xc8\x24\xa6\xfb\xdd\xfa\xd1\xbf\x03\xa8\x4e\x0c\x6e\xb5\xc9\x76\x1e\x75\xba\x0e\x88\x98" + - "\x82\x24\x30\x78\xb5\x9a\x51\x2d\xbf\xf5\x71\x28\x45\xd9\xe8\x80\x16\xb2\x3e\xba\x58\x90\x42\xaf\xd3\x8d\x13\xf4" + - "\x5b\xd0\xb5\xcf\x32\x30\x20\xdd\x7a\x7a\xd8\xbe\x3a\x6f\xc8\xe5\x38\x75\x74\x66\x42\x12\xf1\x11\xd3\xf0\x58\xb0" + - "\x2f\x2a\xdb\x8f\x60\xda\x5b\x6d\xc4\x7b\x7b\x1f\x85\x81\xce\x73\x55\x32\x45\xef\x3c\x85\x97\x88\x0d\xe3\x87\xf2" + - "\xe1\xb3\xa7\xc3\x54\x5f\x3d\x8b\x1e\x0a\x6d\x1f\x77\x8e\x9a\x8e\x60\xa7\x72\x26\x4b\xfd\xd4\x3a\x48\xbe\x40\x01" + - "\x06\x3f\x15\xc5\x95\x2a\xfb\x53\x89\x2e\xc6\x76\x6c\xf4\x05\x46\xf0\xb7\x22\x6c\xd8\x33\x7a\x77\x3c\x3d\x3c\x88" + - "\x7a\xbe\x7c\xf5\xdd\x8b\x37\xe8\x7c\xb7\x2a\x91\x21\x99\x69\x0e\xbf\xe0\x24\xb5\x34\xb6\x32\x91\x16\xe6\x6a\x9b" + - "\x59\xbc\xa3\xdd\x26\xe2\x35\xfd\xb8\xb6\x95\xe1\xe9\x3f\x3c\xd8\xba\xbd\xdf\xad\x4f\x52\x87\xb1\x4e\x7a\x63\xaf" + - "\x13\x5f\x15\x68\x52\x16\x1f\x54\x5e\xff\xce\x26\x3e\x4e\x31\x6f\xf6\x52\x4f\x3f\x88\xd5\x12\x28\xc5\x65\x29\x17" + - "\xb2\xd2\x53\x20\x2a\x7d\x60\xbc\xa0\x37\xc3\xb7\xa0\x29\x38\x82\x12\xad\xd5\x72\x52\xac\xaa\x18\xdf\x10\xb2\x80" + - "\x30\x31\x82\xe1\x90\x1f\x39\x27\xc4\x2c\xd4\xce\x0a\xbc\x47\x9f\x8f\xc8\x76\xef\x8e\x49\x1d\x27\x71\x78\xcb\xd6" + - "\x34\xde\x24\xce\x2c\xb0\xe5\x0c\x9d\xbc\xa4\x9d\xc5\x6c\xd0\x18\x86\x64\xaf\xd2\xfa\x5a\x42\x0d\x2b\x7c\x72\xd6" + - "\x39\x79\xd9\xb9\x88\xb8\x47\x9d\x36\x12\x8d\xb4\xa5\x13\xa9\xb9\xc4\xb4\x4a\x6f\x35\x96\x28\x48\x12\x53\x8a\xbb" + - "\x5c\xaf\x02\x53\xf5\xbf\xe6\x7a\xf5\x39\x9e\x57\xe8\x71\x15\x69\x04\x51\xaa\x89\x7c\xad\x8e\xc5\x99\x58\x70\x65" + - "\x91\x50\x5b\x78\x14\x00\x15\xc0\xdf\x0a\xd6\x48\x35\x02\xb7\x15\xe2\x96\x0e\xcd\xfc\xd6\x9d\x1b\x2f\x78\xf6\xec" + - "\x66\x48\xdc\xa9\xe9\x8a\xf3\x47\x36\xdd\x0b\xf0\xb8\xd2\x90\x3c\x6d\x97\x54\x24\xf2\x21\x88\x0f\xf1\xd7\xc3\xbf" + - "\xf0\xc3\xda\x5e\xb3\x87\x55\xa9\x32\x66\x45\x51\xbf\x05\x18\x68\xd8\xdb\x0f\x4f\x06\x99\xee\x6a\xb8\xc6\x54\xb1" + - "\x0d\x58\xff\x73\xd0\x42\xcd\x20\xa5\xad\x65\xac\x6e\x00\x0e\xf7\xbb\x0d\xa9\x5b\x5b\x46\x06\x75\xab\x4e\x85\x1e" + - "\xd8\xa7\x72\xe0\xb3\x07\x6e\xdb\x06\x7b\x98\xdf\xc9\x4b\xce\xa4\xc0\x50\x7b\xf7\xfc\xaf\x08\x9e\x3b\x2f\x73\x74" + - "\x76\x0f\xfd\x87\x2f\x3f\xf7\x14\xdf\xa5\x89\xa9\xa3\xd9\xdd\x5e\x62\x95\xbc\x8c\x13\x86\x91\x1f\xfd\x47\x66\x07" + - "\x7b\xa2\x38\x31\x83\x4b\x4c\x64\x33\xb7\x85\x69\xbf\x02\xdf\xd9\x4f\x9b\x87\xd5\x17\x52\x84\xa6\x00\xe2\xef\x6a" + - "\xaf\x4c\x89\x97\x09\xbc\x83\xe0\x2b\xd4\xf6\x3e\x0a\x7c\x7d\x9c\x8d\x81\xbd\x04\x79\x0a\xde\x5d\xfa\x7e\xcd\x53" + - "\xb3\x6e\x7f\x09\x7c\x32\xaa\xc5\xb2\xd5\xe5\xaf\xe6\xdb\xe7\xf2\x9c\x70\xc6\x25\x7e\xdf\xe2\x26\x72\xeb\x99\x29" + - "\xb8\xab\x63\xec\x21\x9f\xbb\xad\xf8\x13\xf9\xd4\x05\x59\xa0\xed\xe3\xc6\x3e\x7d\x14\x89\x7c\x8f\x9f\x71\x25\xdc" + - "\x85\x57\x81\x5f\x9e\xe7\x82\xba\x91\x13\x3a\x31\xe3\x7f\x3b\x7d\x3e\x64\x9d\xec\xa9\x2f\x3b\xf8\xa7\xf3\xe3\x7f" + - "\x3b\x7d\x8e\x37\x6d\x6d\x28\x9f\x62\x88\x9a\xd5\x5e\x27\x23\x39\x05\xb6\x14\x98\x75\x2a\x01\x4c\x62\x21\xd5\x0a" + - "\x2a\x57\x4a\x24\x27\xaf\xbe\x1d\x22\x1f\x27\x0e\x0f\x07\x18\x03\x1c\x65\x20\x09\x5c\x3e\xd0\x73\x4f\x26\x23\x4c" + - "\x90\x70\x47\x8f\x2f\xe6\x65\xb1\x50\xe2\xf1\x61\x97\x93\x19\x28\x2e\xf2\x19\xd5\xbf\xc5\x82\x8b\x93\xd5\x25\x29" + - "\xfc\xbe\x19\x7e\x4b\xd7\xa5\xcd\xc8\x95\x93\x8a\x80\x7a\x80\xce\xb1\x3e\xca\x6f\xce\xca\x4f\xeb\xe2\xfd\xfa\x4d" + - "\x70\xf9\x65\xc3\x2a\x36\x99\xb3\x8a\x82\x79\xc4\xa2\x27\xae\xed\x2c\x68\xfe\x70\x9f\x73\x6a\x44\x4a\x43\x87\x00" + - "\xe6\x12\x84\x95\x5e\x28\xef\xac\x02\x4f\x4e\x5e\x85\xf3\x39\x55\xca\x46\x69\x4d\x56\x97\x66\x10\xd4\x1e\xa7\x82" + - "\xcc\xc3\xc3\x27\x4f\xfe\xf2\x4d\x98\xda\x25\x80\x23\x39\xe7\x85\xde\x9a\x6d\xe2\x43\xdd\x91\x2b\x70\xd3\x74\xb5" + - "\x05\xa1\xdf\x52\x5d\xaa\x1b\xe7\x8e\x70\xa9\x6e\xd0\xa9\xb2\x52\x97\x6b\x21\xd3\x62\x59\xa9\x94\xdc\x13\x5e\x6a" + - "\x75\x59\x88\xb7\xaa\xd4\xb9\x46\xbb\xcb\x1d\xec\x25\xad\x31\xe3\x22\x98\xa8\x50\x2c\x6c\x69\x4d\x2e\x2a\x95\x0b" + - "\x4e\x98\x62\xdb\xbf\xa3\xf2\x7a\x98\x09\x4c\x99\x4a\x9c\xbc\x7a\x68\x44\x05\xa2\x1b\xa9\x29\xa9\x9a\xab\xba\x59" + - "\x66\x7a\xaa\x39\xf4\x04\xb9\x64\x55\x51\xd6\x74\xe7\xfa\x81\xe7\x31\xaf\xbc\x70\xde\x73\x6d\xb1\x2e\x09\x3a\x5a" + - "\x60\x01\xf1\x69\x98\x06\x42\xe5\xb0\x8f\xb6\xe9\x47\xb6\xe7\xf1\x93\xaf\xbe\x75\x0e\x18\xb1\xb4\x45\xde\x65\x62" + - "\x61\x10\x5d\xa6\x99\x5e\x8e\x1f\x3e\x7c\xf6\x94\xf2\xe9\x09\x9b\x30\x04\x9f\x0d\xe9\xe1\xb3\xa7\x9c\x80\xc1\x89" + - "\x5f\x35\x9e\xe6\x1b\x76\x84\x17\x87\x87\xfd\xc3\xc7\x83\xc3\xaf\x6d\x9b\x37\x05\xc5\xb5\xfb\x55\xd8\xfe\xe9\x40" + - "\x85\x30\x37\x6c\x8f\x16\xbf\x8e\x45\x51\x8a\x2f\xf0\xbf\x8f\xc6\x1e\xfe\x24\x4b\x78\xb0\xb9\x64\x0a\xab\xfc\x43" + - "\x4e\x39\x5e\x78\x1a\x93\x55\x25\x3a\x46\xce\x54\x07\x35\xf6\xbf\xe8\xfc\xa7\x77\x35\xc0\x2d\x4c\x9a\x0f\x16\x36" + - "\xeb\x39\xc2\x4e\xe5\xfd\x95\x19\x52\x20\xeb\x7a\xa8\xd5\x70\x3e\xff\xf2\xeb\xaf\x9e\x7c\xf3\xcd\x40\x9a\xe5\x8d" + - "\x4f\x3c\xf1\xdf\x46\xb9\xf4\xa2\xde\xf9\xa5\xe1\x98\xd8\x39\x0b\x40\xfc\xeb\xf8\xe1\xc3\x0b\x2f\xe8\xf9\xab\xdf" + - "\x39\x2d\xd3\xe5\xd5\x39\x7b\xf4\xeb\x17\x17\xad\xa1\xe3\xc7\xa3\x87\x0f\x37\xe7\x9d\x73\x0c\x77\x8e\x3d\x2c\x6b" + - "\xbb\x61\x9f\xd9\x0c\x6b\x35\x2d\x50\x07\xd9\xa6\x0e\x73\xee\x15\x21\xb1\x4a\x6d\x75\x67\x46\x5d\xf2\x7c\xdc\xb2" + - "\x32\xbb\x8b\x9f\xb4\xa4\x2d\xd9\x38\x8e\x47\x38\x8f\x4d\x23\xcc\xb8\x6d\x79\x14\x5c\xc1\x84\xbc\x2f\x46\x9c\xdf" + - "\xc6\x22\x56\xe4\x40\x09\x24\x92\x90\x39\xf2\x52\xde\x96\x05\xe6\xf1\xc1\xe1\xe1\xf0\xa7\x57\x2f\xfa\x71\x06\x95" + - "\x3e\x3c\x3f\xf8\xf6\xf1\xb7\xc3\x07\x3c\xd8\x7d\xe7\x17\xfd\x8d\x25\xe3\xa4\xe6\x45\x53\x10\xba\x5e\xeb\x2c\x23" + - "\x85\xad\xc2\xc4\x09\xaa\x74\x8a\xec\xbb\x01\x6a\xd7\xf3\x71\x70\x06\x4d\x8f\x6a\xd6\xd0\x4f\xa2\x7a\x16\x4d\x28" + - "\xb1\x9c\x11\xdf\x88\x37\xe4\x9c\xf8\x7c\xb9\x34\xd1\x59\x03\x36\x0b\x95\x86\xc0\x19\x84\x28\x54\x2a\x60\x94\xb0" + - "\x84\x83\x4a\x45\x4a\x39\x25\x02\x22\x43\x3a\x76\x17\x23\x42\x65\xce\x97\x2b\x6b\xe2\xa8\xf9\xaf\x91\x4b\x80\xcd" + - "\xad\x0b\x3f\xea\x9e\xd6\x30\x93\x4e\x4f\x74\x28\x23\x91\xc3\x8e\x86\x2e\x8d\x06\xe9\xd6\x3f\x87\xf9\xc3\xe7\x2f" + - "\x3b\x11\xdf\xda\x76\x60\x5e\xe5\x58\x19\x08\x4d\x7c\x7d\xa3\x72\xac\x56\xa4\x2b\xac\xb8\x15\x83\xe1\xa3\x67\x1f" + - "\x9a\x8f\x3f\xed\x7c\xe0\x04\x5b\x22\xda\x5d\x7a\x99\xb6\x03\xf1\xfd\xf7\xe2\xc9\xe0\x2b\x38\x0a\x2a\xc7\x84\x4d" + - "\xc3\x91\x4d\xdd\x84\xbb\x46\xc0\xf2\x9a\xa0\xa4\xfe\x00\xb6\xd1\x54\x80\xb0\xdc\x41\xf7\xdf\x89\xdf\x3c\xc6\xa7" + - "\x80\xc3\xb5\xed\x89\x8e\x5b\x53\x1b\x08\xf8\xca\x39\xe8\x87\xe6\x0a\x32\xc9\xc0\xf5\x5d\x98\xaa\x4f\xd9\x44\x74" + - "\x8e\x3e\x00\xd6\x33\xc4\x61\x4f\x73\x9e\x8f\x7a\xa3\x1b\x8b\x8b\xf5\x83\xd7\x1b\x3c\x1a\x75\x6c\x79\xd9\x7a\x20" + - "\xa0\xe5\x76\xea\xec\x6b\x9d\xf3\x49\x7c\xfe\x6c\xab\xe3\xb2\x4f\x28\xb3\xa2\x7d\x7a\x8d\x04\xef\x75\xad\xbb\xb8" + - "\xcd\xa2\xf8\xfb\xdd\x0d\x8a\x8f\x7c\x6f\x6a\xef\xbb\x8e\x09\xfb\x14\x5a\xf2\xc2\x66\xa7\x05\x6c\xd0\x33\xa1\xab" + - "\x87\xc6\xcb\x80\x55\x21\xd2\xa2\xce\xaf\xdb\x4f\x81\x85\x15\xa9\x36\xd3\x22\xcf\x89\x62\xa3\x5c\x9f\x9c\xbc\x12" + - "\xdf\x12\x1e\x5a\x80\x86\x8d\x5e\x73\x88\xa3\x4d\xa8\x4d\x11\xd7\xa9\xbe\xea\x09\x74\x83\x8d\xce\x37\xf2\x6b\x7c" + - "\x3d\xcc\xa4\xce\x7c\x09\x75\x32\x7a\xf8\xca\x2c\x7f\x55\xd3\x0f\x85\xc7\x20\x45\x69\x72\xad\x2e\x95\xd8\x7f\x0e" + - "\xdb\xc3\x4f\xda\x86\x3f\x33\xbb\x70\xc3\x8f\x6e\x1c\xa2\x46\x52\x86\xc5\xed\xdd\x71\xa7\xe7\xd3\x8b\x34\x70\x29" + - "\xe4\xa6\x3d\xfa\xf1\x89\xd9\xdb\x8b\x12\x1e\xf8\xf7\x14\x76\xb1\xb1\x76\x83\xba\x78\x13\x4f\xe4\xae\xce\x6c\x9b" + - "\xb8\x43\x12\x03\x5f\x70\x30\xde\x9f\x2b\xfb\xed\x78\x33\x7a\x9b\x90\x80\x58\x3a\xa5\xf7\xd6\x0e\x67\x1d\xb3\x02" + - "\xeb\xaf\x35\x55\xdb\x80\x41\x21\x73\x74\xb7\xe1\x7c\x67\xc4\xc7\xcf\x56\x59\xb6\xf6\xbb\xec\xb2\x94\x50\x9d\x24" + - "\x03\x57\x60\xaa\xcc\x54\xe5\x29\x5d\x5c\x58\x02\x51\xe8\xbc\x17\xf8\x7e\xfb\xcf\x79\x28\x8e\x72\x08\x52\x57\xa2" + - "\x37\xad\x5b\xd3\x66\xb3\x75\x51\xdc\xbc\x5b\x57\x32\x85\x39\x20\x49\x4d\x87\xf9\x0b\xc7\x75\x8f\xd4\x6f\xc5\xb1" + - "\x90\x0d\x6b\xfd\x88\x9d\x59\x77\x76\x26\xab\xa5\xf5\x6f\x9d\x04\xda\xd6\x48\x93\xc7\xe9\x25\x57\x4b\x54\x93\xef" + - "\x26\xf8\x27\x7c\xb0\x5a\xb6\xb8\xbf\x26\xd4\x31\xce\xc7\x2f\xc0\xd6\x80\x88\x1f\x53\x57\x2e\xd7\xc3\x8e\xdc\xba" + - "\x8d\xe8\x6b\xbb\xe5\xa5\xed\x65\x4f\xb0\x48\xd1\x0d\xf2\x01\x6c\x05\x1a\x52\xe4\x49\x8b\x9a\x69\x02\x00\x09\x60" + - "\xd1\xd0\x31\x4d\x48\x97\x18\x87\x93\x46\xc9\x72\xdb\x23\x7b\x5a\xea\xab\xb9\x83\x73\x5a\x94\x15\x59\x9f\xfe\xc4" + - "\x73\xc3\x09\x21\x62\xa7\x6c\xe3\x46\x0a\xb3\x8b\x06\xd8\x78\x1c\xc4\xb5\x84\x30\xbb\xef\x92\xbd\x5f\x52\x09\x4d" + - "\x97\x62\x94\x0b\x56\xdd\xff\xdc\x7c\xa4\x51\x2e\xd2\x30\x21\x78\x51\x62\x70\x10\xfb\xc7\xa3\xbf\x14\x8a\xb9\x61" + - "\xad\x64\xe2\xe3\xe6\xd2\x88\x2d\x68\x71\xdf\x16\xa8\x70\x94\x63\x77\x3b\x7e\xf5\xc5\xee\x64\xdb\xcb\xa3\xfb\xbe" + - "\x90\x1a\x75\xd5\x50\x9d\xe1\xe3\xda\x2a\x5e\xc8\x6c\x4a\x49\xae\xad\x7f\x29\xfa\x53\x17\xd5\x5c\x70\xf2\x9f\x89" + - "\xca\x0a\x4c\x68\xe7\xe3\x12\xc2\xb8\x69\x3f\xf1\x44\xc8\xa6\xa7\x10\x20\x20\xc0\x39\x11\x93\xe6\xcb\x89\x25\x19" + - "\xdb\xcf\x14\x61\xff\x28\xe0\x94\x9c\xf3\xe1\xb5\x12\x20\x2b\xc3\xb4\xd6\xc8\x02\x86\xf7\x2b\x36\x3f\xf4\x16\xd6" + - "\x97\xf5\x0b\xda\x34\xe0\xb5\x27\x0e\x99\xa9\xd8\x49\x76\xed\x9d\x0d\xe8\xf7\x52\x55\x72\x3a\x27\xf5\xe4\x56\xf8" + - "\x27\x6e\xa9\xdc\x20\xe0\x3e\x88\xc3\x28\x0a\x43\xc1\x62\x68\xb5\x75\x74\x18\x55\x69\x58\x93\x96\x5c\xd1\xaa\x02" + - "\x1d\x90\x9c\x6f\x55\x1c\xa5\x1e\xa0\x6e\x5a\x4c\x11\xc2\x35\xb8\xc2\xab\x28\x41\x05\x7b\x49\x22\x29\x8b\x3c\xb6" + - "\x84\xec\xde\xed\xe4\x1e\x52\x12\x1e\xad\xbe\x8b\x9f\x31\xda\xa4\x39\xda\x61\x83\x11\x7e\x2d\x35\xdd\x46\xbe\xb2" + - "\x32\x1c\xfe\x10\x91\x5d\xca\x67\x4b\xaf\x93\x5a\x3d\x1c\x9f\x13\x1a\xf7\xa4\xbf\xfd\xf5\x04\x13\x91\x33\x61\x8f" + - "\x0e\x78\x7c\x68\xc4\x9e\xf8\xd2\xd6\xde\xa1\x34\xb5\xf8\x51\x3b\xd1\x46\x1f\x54\x5d\x09\x85\x85\x5c\x39\xf8\x8f" + - "\xac\x8c\xd0\x15\xe5\xb0\x9b\xfe\x59\x94\x88\xe3\x3f\x1a\xb5\x4f\x24\xde\x99\x32\xb8\x22\xe8\x39\xdf\xa5\x8d\xe7" + - "\x12\xad\x29\x42\x0a\x36\xa8\x4c\xe8\xf7\x44\x04\xe5\x4f\xde\xe2\x37\x18\xd4\xe2\xd7\xa3\x34\xe6\x1c\xb7\x58\x8a" + - "\xa5\xc5\xeb\x27\x91\xe4\x29\xc9\x97\x33\x5d\x84\x7f\x34\x6f\x6f\xc0\x31\x82\x32\xdf\xfb\xc1\x53\xf7\x10\x7a\x89" + - "\x1a\xe1\x6f\xf7\xf3\xdf\x89\x1d\xf7\xa3\x7a\xab\x1e\x04\x36\x76\xa8\xc7\xf9\x98\x41\x5a\x90\xe2\x77\x5f\xf7\xe2" + - "\x7e\xcd\xb1\x0b\x37\x87\xd9\x95\x1a\x24\xda\x02\x7d\x6a\x34\x3b\x22\x81\xb9\x52\xa9\x00\x86\x10\xa3\xbb\x0c\xc7" + - "\x88\xe9\x52\xc8\x7c\xaa\x0c\xa6\x8d\x24\xef\x67\x40\x64\x6d\xe8\xc6\xa1\x40\x18\x89\xfd\xb6\x44\xc7\xb4\xb1\x15" + - "\x72\x39\x58\xe5\x14\x59\x49\xb1\x35\x3e\xda\x8d\xc3\x8f\x3e\xa7\xb7\xc9\xb6\xde\x78\x89\xbf\xc8\xec\x83\x40\x66" + - "\x11\x75\xfc\x25\xc8\xe8\x45\x81\xb9\x00\x66\xe4\x53\xad\xcd\xb4\x54\x4b\x99\x4f\xd7\xe1\xb0\x72\x69\x73\x4f\x4f" + - "\xf0\x2f\xc7\x47\x61\x39\x8a\xfa\xe9\xd6\x8c\x23\xc8\x7f\x08\x69\x61\xcf\xb5\x4a\xa2\x93\x4b\xae\x83\xb6\x28\x9e" + - "\x85\x2d\x89\x77\xf1\x8e\xc1\xb8\x3d\x37\x7c\xeb\xcd\x45\x5d\x02\x91\x0b\x3c\x4d\x11\xf3\xe8\x6e\x60\x80\xdb\xa5" + - "\x44\xf4\x35\x40\xfd\xc9\xb6\x16\xb6\xc1\x81\x4f\x10\x16\x38\xbd\x3a\x97\x68\xf6\x12\xf6\x62\x7c\x60\x0d\xbf\x59" + - "\x72\x4d\x31\x2e\x33\x12\x78\xed\xdb\x14\x4e\xd4\x26\x5f\x65\x99\xfd\xaf\x6f\xbf\x65\x8c\x40\x97\x50\x2f\x7d\x06" + - "\xbd\x79\xc7\xf5\x53\x55\xc5\x29\xfb\x61\x37\x00\xd5\xbd\x13\x28\x9b\x51\x5b\xdd\xc9\x3f\x25\x29\x93\xb7\xad\x3a" + - "\xcb\xfa\x6b\xf9\x41\x09\x83\xae\x50\xe8\x0e\xd2\xcc\xe9\x8c\xc7\x9d\xb2\xf4\x52\xe6\xfe\x92\x3c\x78\xc2\xf8\xf6" + - "\x5a\x2e\xd5\x9e\xe8\x8c\x1f\x7e\x71\xf8\xf0\xa2\x13\x55\xcb\xd8\xa6\x65\x69\x9a\x40\x29\x32\x2f\xb1\x59\x41\x5e" + - "\x3b\x1d\x4b\xed\x09\x8b\x65\x0c\xc8\x6e\xfd\x3b\x10\xc5\xe1\x7f\x6d\xf9\x45\xdc\x37\x8e\x65\xf1\xe9\x0c\x7c\xa5" + - "\xbe\x58\x59\x10\x6e\x5b\xa0\xab\x38\x79\x25\xbe\x7d\x68\x1a\xb6\xcf\x58\x05\x51\xe4\x4d\x8d\x49\xa0\x79\x83\xe1" + - "\x36\x1b\xb1\x5d\x6f\xc2\x6c\xda\x0e\x4b\xb6\xd7\x0a\xb0\xaf\xd9\x23\x11\x67\xa9\x91\xa9\x9a\x28\x2a\x73\x5c\x4b" + - "\xfa\x33\x1c\x8a\x59\x29\x2f\x59\x7c\xc6\xe9\xf3\x1b\x44\xaf\x34\xc8\x00\x14\x3d\x88\x7d\xce\x0f\x0f\x1b\xbc\x0d" + - "\x97\xfc\x73\x2e\x0e\x94\xa7\x41\x71\xe6\xb4\x28\x76\x30\x3e\x51\xae\xa6\x03\x9f\xaa\x33\x42\xd5\x0b\xe7\xdc\x25" + - "\x9e\x21\x0b\x10\x1d\xb0\x40\x66\x0f\x4b\x35\xc7\xb9\x86\x3e\xe7\x70\x7d\x34\x0d\xda\x3f\x91\xf7\x2c\xb4\xe2\xb7" + - "\x66\x43\xaa\xaf\x0a\x8e\x52\x0b\xad\x08\xea\xe2\xfe\x9f\xa1\x15\x70\x26\xb0\xda\x55\x23\x12\xb9\x59\x80\x87\x19" + - "\x2a\xbc\x63\xf2\x87\xe8\x56\x28\x66\x45\x91\x51\x29\x63\x0a\xf1\x18\xb4\xa7\x53\xf0\xbe\xf4\xdf\x1c\x50\x36\x85" + - "\x2b\x99\x61\x7c\x1c\xa0\x63\x54\x53\xbe\x36\x91\x5e\xdb\x44\xac\xb0\x35\x8b\x00\xd9\x43\xa7\xc2\xd8\xe7\x82\xae" + - "\x8f\xb0\x14\x96\xdf\x3c\x98\x02\x00\xcc\x7b\x6d\x1c\xdb\x99\xe1\x67\x2d\xee\xd6\xec\xb8\x18\x8e\xc1\x89\x39\x1b" + - "\xde\x68\x76\x6f\xb9\x46\x29\xad\xb7\xdd\xa3\x0a\xab\x23\xa1\x8b\xee\x95\xcc\x06\x3e\x9e\x8f\xf9\x3e\x78\x48\x4e" + - "\x55\xcc\xc1\x71\xcc\x7d\x84\x60\x64\x14\x08\x31\x6c\x61\x6c\x61\x41\x52\xbf\xe7\xea\x9a\xca\x34\x25\xa2\x73\x8a" + - "\x75\x06\xac\x56\x75\x95\x97\x6a\x5a\x5c\xe6\xfa\xef\x2a\x0d\x0a\x43\x8c\xb0\x2e\x13\x76\xd3\x08\x3e\x7a\x19\xde" + - "\xf5\x36\x3f\x08\x2a\x26\xe0\x87\xd3\x55\xc4\x31\x66\x58\xac\xe9\x07\xfd\x41\xdd\x5a\xa7\x1e\x8e\xf9\xe1\x35\x50" + - "\x79\xaf\x53\x8a\x5e\xf3\x0b\x89\x0b\xae\x46\xce\x53\x7e\x20\xef\x41\xe5\xeb\x7c\xda\x54\x91\x1c\xbc\x9d\x23\xbf" + - "\x7f\xad\xc4\x23\x90\xb6\x1f\x39\x16\x97\x32\x78\xfa\xae\x7a\x42\x1a\xb3\xa2\x7c\x28\xba\x74\x56\xff\x5a\x59\x1e" + - "\x31\x16\x4e\xb6\xa6\x2e\xdc\x2b\xf4\x55\xf2\xec\x7b\xd0\x10\x1e\x9e\x62\xf0\x21\xec\xb6\xcd\x8a\x86\xf9\x35\x13" + - "\xc1\x79\x50\xdd\xd3\xa2\xac\x88\x8b\x27\xad\x51\x78\xe7\x46\x13\xa9\x07\x87\xdf\xe9\xb8\xe5\x13\xec\x01\xbb\x65" + - "\xdb\x50\xe5\x4b\x4b\xf7\x01\x82\x1e\x1c\xac\x26\xd7\x8d\x5a\xe7\x6e\xc4\xf7\x41\x8c\xa9\x9b\xfd\x92\x16\xe5\xfb" + - "\xc1\x5a\xa9\x3d\x71\x28\x1a\xb1\x1a\x43\xf1\x22\x53\xce\x20\xc9\x79\x6b\x18\xaf\xaa\xc2\x25\xa0\xf0\x45\x09\x03" + - "\x6f\x18\x33\x1a\x0e\x2f\x75\x35\x5f\xa1\x3e\x83\xab\x3e\x71\xf9\xa9\xe1\x72\x95\x65\xc3\xc7\x8f\xbf\xaa\x6d\x07" + - "\x9f\x1f\x4f\x09\xbc\x8b\x59\x8c\xe5\x3f\x57\x3a\xd3\xd5\x3a\x4e\x93\xc2\x49\x9c\x6d\x52\x1b\xbc\x17\xe8\x78\x16" + - "\x33\x21\x73\xaa\xc5\x08\x7f\xdb\x02\xf4\x2d\x87\x60\xe3\x12\x2f\xc0\x56\xf0\x29\xe0\x52\x52\x3e\xea\xcd\x3f\x68" + - "\xf5\xee\xb4\xae\x9d\x3d\x16\x04\xc4\x58\x74\x3a\x1e\xf1\xf1\xaf\x20\x17\x66\xe4\xab\x17\x66\xdf\x74\x6d\x82\x68" + - "\x23\x8c\x6e\x73\xf9\x49\xc9\x89\x4a\x1b\x4e\x99\xa2\x2c\x1b\x62\x57\x1b\xa1\x1f\x7b\x9b\xc2\x70\x35\xdc\x23\xe9" + - "\x84\xbc\x1b\x24\x95\x68\x65\xa7\xc4\x80\x6f\x82\x85\xec\x8f\x05\xaf\xdd\x86\xf8\x79\x94\x09\x84\xcf\x9a\x36\x9c" + - "\xc3\xf9\x02\x65\x7c\xfd\x89\x67\x6e\x38\x99\x03\x6c\xde\x0b\xf6\xfc\x81\xbd\x0d\x7d\x13\x86\x43\x81\xe6\x73\xdc" + - "\x02\x2a\xe9\xca\x25\x04\x6d\x14\xae\x21\x45\x29\x59\xa2\xd5\xb5\xc8\x74\x1e\x5d\x76\x87\x87\x5f\x3d\xf1\xa9\x83" + - "\x42\xf7\xdb\x70\xdc\xd6\x62\x95\xa1\x93\x73\xd0\x38\x0c\xac\x72\x30\x7d\x67\x81\xa9\x2b\x23\x30\xb1\x70\xa9\xc8" + - "\x8e\x46\x45\x8e\x98\x1e\x60\x5f\x3e\xce\xe2\x08\x1f\x1c\x45\x6f\x83\x64\x12\x11\x17\x18\x6d\x48\xe8\xca\x79\xfb" + - "\xd1\x6d\x79\xd2\xd8\x84\x2f\x6b\xd1\x8b\x0e\x2f\xff\x13\x0e\x91\x65\xb0\x3c\xae\xa0\x29\x28\xf5\xa8\x52\x60\xbd" + - "\x44\x1b\xbe\xa7\x73\x53\x95\x2b\x3a\x9d\x8c\x44\xe1\xb9\xae\xdc\x99\xe6\x54\xea\x2e\xa0\xd4\xca\x41\x63\x16\x14" + - "\x28\x99\x30\x62\x75\xfa\x1e\x23\x70\x80\xab\x81\x13\xbe\x32\xa8\xb6\x0b\x92\x3b\x8d\xc4\x57\x07\x94\x45\x9d\xf3" + - "\x12\xa0\xf1\x70\x14\xa5\x0d\x08\xea\x39\x8c\x84\x2b\xeb\x40\x4f\x3d\x7b\x33\x12\x7f\x70\x8a\xfa\x99\xce\x53\xff" + - "\x0b\x75\xa8\xfa\x0a\xde\x03\xa8\x3a\xcf\x3a\x23\xf1\x87\x48\x75\x39\x12\x1d\xaf\x86\xe8\xf4\x48\xcc\x1e\x91\x13" + - "\xe4\x2d\x95\x0e\x10\xed\x6d\xed\xeb\xfd\xf0\x75\xa9\xae\x74\xb1\x32\xbc\xe9\xed\xfd\xfd\xe3\x8e\x0f\xc4\xad\x4f" + - "\xb2\xef\x2a\xc3\xd8\x49\x73\xe1\x87\x80\x25\x41\x99\xc7\x62\x96\x4d\x63\x1b\x64\xb4\xfd\x04\x97\x77\xa7\x5f\x2d" + - "\xae\x48\x09\x7d\xa9\xaf\x54\xce\x14\xb8\x2a\x5c\x72\x4d\x71\x3d\x57\xa8\xcf\xe3\x52\x34\x45\xe9\x8a\x39\x05\xa3" + - "\x3f\xb9\x40\x7d\xbf\xfb\xb1\xd9\xf0\xdf\x5f\x06\x7f\x7f\x85\x7f\xd7\xaa\xcb\xdf\x39\xbf\x38\x0f\x29\x9e\xf0\x7f" + - "\x8c\x03\x27\xeb\x60\xf0\x0e\x71\x59\xf6\x01\x26\xf3\x8a\x95\xc9\x61\xf9\x69\xc7\x2b\xf4\xe0\x1c\x11\x39\x20\xe8" + - "\xfb\x92\x18\xdb\xe0\x3d\x7c\xe4\x52\x57\xa0\x73\xa6\x43\xca\x33\xfe\xf4\x82\x26\x77\x48\x6e\x46\x54\x4a\x23\xaf" + - "\xe6\x9b\xc1\x60\xc0\x39\xfc\x1e\x8b\xeb\xb9\xac\x44\xad\x8c\x06\xbd\x7b\xe2\x13\x5b\xf8\x82\x0f\xe7\xe9\x23\xf8" + - "\xff\x1c\x6b\x63\x9c\xa7\xfb\xdd\xe3\xa0\xb7\x2f\xc5\x4d\xde\x9f\x16\x8b\x65\x91\xb3\xb7\xe6\x4d\xbe\xbf\x0e\xba" + - "\x81\x8f\x8e\xe1\xf3\x0d\x7f\xf1\x95\x30\xfa\x32\xa7\x96\xfe\x4b\x7a\xf7\xb5\xb8\x69\x7f\xf1\x17\xf7\xd1\xba\xfe" + - "\xea\x1b\xb1\x6e\x7b\x8e\x56\xf0\x76\x04\xad\x27\x54\xa9\x6f\xf7\xe1\x45\xb0\x45\x4f\xd8\x90\xd2\xc9\xab\x79\xb0" + - "\xfb\xc3\xa1\xc8\xab\x79\xff\x91\xe0\x2a\x6d\xc6\x2d\x99\xde\xd3\xb5\xec\x50\xc2\x1b\x3e\x43\x5e\xdf\x0e\x78\x10" + - "\xe5\x98\xf4\x03\x70\xf1\x81\x1b\xe4\xcc\xb1\x1c\xb3\x5c\x28\x2c\x25\x04\xb7\x42\x10\x94\x32\xc0\xcd\x77\x1f\x96" + - "\x6a\xa1\xb0\x1a\x14\x6a\x8e\x50\xcb\x31\x44\x6a\x30\x95\x98\xb7\x0e\xc4\x13\xa0\x4c\xd9\x1a\x4e\xdb\xc1\xf0\x30" + - "\xc4\xe8\x2f\x01\x56\xfb\x89\x3f\x43\xc7\xfe\x08\xed\xb3\x9f\xcd\xd9\xd7\x78\x9c\x0e\xbb\x62\x24\x1e\x8b\x47\xe1" + - "\xe9\x43\x58\x01\xee\x74\xfc\xe1\xb3\x8f\x8b\x34\xed\x04\xb9\x6a\x5d\xb7\x38\x9e\xed\xe3\x2f\x17\xee\x2c\x7d\x73" + - "\x41\x29\x32\xdb\x7a\x09\xc8\x08\xd5\x19\xc5\x54\x45\x70\xad\xcc\xf5\x44\x57\xbe\xa2\x15\x9d\xc3\x46\x6e\xe1\x70" + - "\x53\xee\xde\x93\xb6\x33\x1c\x9f\x5a\x57\xf2\x66\xdb\xb1\x45\x81\xe7\x06\xee\x3b\x76\x22\x70\x35\xe9\xc6\x16\x49" + - "\xbe\xbe\xc0\xf8\x2d\xa6\x37\x4d\xac\x8c\x0e\x39\x6b\xca\xfc\x4c\x1b\x0a\x1f\x9b\xd3\x2d\xb2\x67\x3d\xc7\xbc\x29" + - "\x96\x9a\xfa\xc2\xcd\xd2\xf4\xb5\xa9\x9f\x82\x10\x40\x9e\x0c\xde\x41\x5a\x43\x1f\xc0\xaa\xd4\x4b\x5e\x71\x58\x01" + - "\x0b\x69\x96\x5b\xfb\xf6\x2d\x72\x4d\x40\xc2\x22\xb7\x1e\x5e\xb2\x7b\xe3\x13\x5a\xa3\xa7\x51\x65\x47\xa3\xd4\xbc" + - "\xb6\xe0\x59\x52\xaa\xe9\xaa\x34\x88\xeb\x4c\x7f\x12\x6e\x18\x66\xc2\xb5\xbd\xf6\xe8\xd2\xec\x46\x9d\xcb\xf4\x0a" + - "\x2b\x71\xb2\xd1\x19\x18\x2c\x31\xcd\x0a\x64\x5d\xe8\x6e\x9e\x2b\xc3\xf0\x0b\x7a\xb7\x7d\xda\x62\x97\x89\xe8\x74" + - "\x3b\x3d\xff\xd8\x15\xef\xe5\x2f\xba\xa2\x5f\x7f\x19\x5a\x6d\x61\x26\xdc\x92\x92\xb2\xa8\x4b\xf2\x2f\xc5\xee\xc3" + - "\x6d\x3a\xf0\xdb\x74\x10\x52\x32\x3b\xce\x51\x63\x4f\xdd\xb0\xdb\x1a\x07\x38\x44\xe9\x3f\xc8\xa9\x80\xeb\xa9\x19" + - "\x56\x70\x59\x66\x8b\x4b\x6b\x11\x69\xb2\x2e\x09\x89\xf3\x7b\xb5\xdb\xde\xbd\xeb\x66\x7c\x12\xca\x0b\x96\xbb\x72" + - "\x8c\xc9\x7d\x5f\xe0\x2a\x4e\x24\xf2\x46\x2e\x54\x23\x1d\xae\x15\xb2\x38\x20\xb9\xde\xee\x63\x0c\x41\x4b\x02\xae" + - "\x30\x68\x2e\x1a\xd2\x86\x62\xb1\xda\x27\x4c\x7c\x20\x42\x8f\x17\x71\x6b\x15\x41\xdb\x82\xfe\x1a\xac\xb5\x0d\x7b" + - "\xba\x23\x39\x18\x0e\x6f\x5f\xd9\x0b\xa5\xc6\x60\x70\x49\xb1\x96\xe0\xa9\x08\x5e\x4b\xac\x4e\x97\x8b\xb1\xf0\xe5" + - "\x7a\xcf\x82\xb6\x9c\xb0\xf4\x28\xa6\x8d\xf6\x2b\xab\x12\x4f\x7c\x37\x51\x4d\xa1\xe4\xd7\x6d\x45\xe1\xa2\x11\x5a" + - "\x8a\x0a\x6d\xbe\xe8\x76\xc2\xf3\xe9\x67\x17\x85\x81\x7d\x0c\xaa\x3c\x2f\x26\x2a\xa1\x58\x17\x84\xae\x87\x42\x9d" + - "\x05\xbc\x7f\xed\xeb\x5c\x34\x34\x82\x9f\x16\x89\xc9\x99\x1a\x3a\x5d\xcb\x99\xda\x1d\xab\xf1\x84\x0d\x16\x9c\x14" + - "\xa5\x05\x17\xd0\xec\xb1\x85\xb0\x26\x76\xde\x15\x4c\x4a\xba\x12\x2f\x49\x81\x2c\x13\xab\xb3\xe3\x84\xe0\xb6\x3d" + - "\xa9\x5d\x9a\xd0\xb4\x53\x21\x90\xed\x8e\x3b\x71\xc2\x6c\xce\xf5\x6c\x1b\x35\x3e\x0f\x7c\xc0\x82\x70\x42\x1c\x72" + - "\x7f\x1c\x5c\x2c\xed\xc3\x8d\x3b\xe2\xd8\xcf\x70\xcc\xd0\xb0\xfe\x71\x8d\xa9\xf9\xc6\xbb\x1f\x69\xfc\x2b\x36\xa6" + - "\x16\x4e\xd3\xe7\xa9\xb9\x85\x3a\x95\x6f\x6f\xef\xe2\xd1\xa7\x75\xf1\x2c\xf0\x20\xa8\xf5\xf0\x45\x6b\x0f\x4c\x27" + - "\xfb\xf8\xdc\x7b\x7e\x7f\x6c\xf9\xff\xc0\xce\x12\x96\x57\x2c\x88\x29\xff\xf1\x67\xcd\x6a\xd3\x0e\xf4\xcd\xa6\x36" + - "\xc1\x03\x46\x4e\x3b\xc5\x7d\x8c\x2d\xf5\x1f\xec\x8b\x4e\xbf\xe3\xc6\xf0\x5e\x7e\x0d\xaa\xd5\x10\x8b\x2a\xd4\x69" + - "\x81\x24\xe3\x93\xf1\xb1\xe4\xdb\x13\x19\xb0\xb9\x21\x35\xe3\xca\xa2\x14\x3f\x5d\x63\xee\x77\x2d\x73\xcf\xac\xd9" + - "\xac\x28\xaf\x65\x99\xd6\x1a\xf7\xbf\xb4\x4d\xa1\x73\xdb\xb6\x98\xb1\x62\x0e\x45\x2a\xe2\x4e\x49\xa0\xea\xd4\x28" + - "\x23\xb9\x59\x39\x97\x4f\x9c\x21\x61\xce\x71\x70\xc1\xdb\xf2\x33\xc8\xdf\x8f\x50\xc0\x48\xf2\xee\xa7\x5d\x14\xbb" + - "\xbb\xb5\x5a\x2b\x2e\x29\xbb\x35\xfb\xef\xd4\x4d\x57\xce\xe0\x75\xb3\x08\x4f\x35\x7a\xf1\x00\x49\xed\x09\xac\x72" + - "\xff\x82\xfe\x46\x3d\x25\xe6\x3d\xa5\xbf\x31\xe9\x60\x4f\x98\x4a\x52\x39\x7d\xfc\x5f\xaa\xb1\x70\x17\xc1\x1b\xe0" + - "\x65\xc1\x79\x2c\x3a\x81\x6a\xaa\x23\xda\x34\x17\xb6\x13\x97\xb9\xab\xb6\x22\x9f\xb7\x9e\x6e\x72\x06\xff\xdd\x97" + - "\xa2\xfb\x68\x65\x94\x2d\x1b\xbf\x0b\x0b\xde\xdb\x13\xbb\xd4\x83\x23\x30\x51\x46\xa7\x80\xf7\xc2\xcd\x19\x25\x41" + - "\x4d\x4a\xe0\x7f\x1a\xb5\x28\x6d\x63\xb2\xa9\x13\x0c\x02\x97\x57\xa7\x5f\x05\x20\x85\xcf\x77\x02\x7d\xeb\x91\x7f" + - "\x5a\x57\xc7\xc2\x3f\x67\xf8\x71\x14\xc5\xed\x46\x64\x70\x70\x9e\xb4\xbb\x58\x04\x00\xdf\xc8\x37\x6b\x8f\xfc\xde" + - "\x69\xf3\xbf\xe5\xff\xdd\xfa\xbf\x83\x3f\x91\x3d\x24\x3d\x26\x15\x0a\xb3\xfa\xf6\x11\x80\xab\xff\x08\xb3\xcf\x5f" + - "\x2b\xf4\x5f\xb1\xa9\xfd\xd2\x22\x57\xc2\x14\x5d\xdf\x0b\x22\x94\x18\x0b\x42\x25\x97\xb4\xb4\x03\x7d\x74\xa8\x6c" + - "\x13\xb6\xd8\xdb\x8b\x51\xca\xcf\xcf\x4f\xa9\xc5\xcb\xd8\xdf\x31\x7e\xa8\xb3\x00\x4d\x39\x99\x95\xd7\xb2\x8a\x91" + - "\x7d\x06\x3b\x4f\x8f\x2e\x8e\x22\xd4\xc8\x8b\xbc\x0f\x28\x85\x47\x16\x71\x22\x19\x0c\x06\x5d\xcc\xdc\xaf\x0c\x27" + - "\xdb\xc7\x8c\xfe\x45\x2e\x7e\xa3\xde\x7e\x8b\xb0\xc5\x8e\xbf\xb7\x27\x1c\x9e\x86\x7b\x41\xe6\x92\x0f\xe2\x37\xc0" + - "\x91\xdf\x48\xca\xc1\x0c\xce\x78\x82\xb2\x35\x26\xe3\xb1\xf9\x43\xdd\x57\xfe\xf8\x0a\x9b\x93\x2c\xcc\xda\xbe\xd9" + - "\x88\xa4\xf9\x74\x2c\xfe\xb8\x0d\xca\x20\x4d\xf9\x73\xdf\xd7\x19\x6d\xca\x85\x2b\x02\x16\x60\x31\x65\x54\x1e\x73" + - "\x0a\xfc\x03\x12\xd9\x53\x5d\x96\xab\xdc\xa0\x3b\x26\x3e\x3f\x0c\xbe\xb2\xe9\xa1\xef\xfc\xe0\x71\x6d\x18\x3e\x0d" + - "\x34\x9a\x4b\xbd\x16\x94\xe4\x3b\x0b\xde\x87\x9b\xd5\x38\x54\xfb\xfb\x51\x47\x61\x1a\x0c\x3e\x6b\xc8\xcd\x46\x48" + - "\xfe\xbd\xcc\xb2\x89\x74\x31\x3a\xe8\x09\x16\x6e\x0c\xfa\x26\x03\x6a\xf9\xaf\x12\x5e\x66\x08\xa3\x03\xe4\xfc\xb0" + - "\xe1\x60\x59\x2c\x93\x6e\x37\xa6\x39\xe4\x7c\x36\x57\x39\x25\x8b\xed\xd9\xa2\x0d\x9c\x9a\x36\x40\x25\x94\xab\x26" + - "\xa5\x92\x1f\xfc\xb7\x4e\x8f\xdf\x12\x71\xb0\xbf\x8f\xd3\xb1\xeb\x85\xe7\xb5\x4b\x25\xc6\x1e\xb7\xe3\x70\x54\x78" + - "\x73\xa2\x4b\x00\xbb\xbb\x08\x29\x04\xce\xe6\xa8\x8d\x4c\xdc\x46\x47\xe7\x67\xa3\x5a\xd0\x58\xb9\x18\x92\x7a\x82" + - "\x6e\x77\x8a\x43\x75\x81\x3d\x31\x7b\x7b\x5c\x55\x41\x8c\xc9\x86\x5a\xc7\xf6\xfa\x33\xc4\xf5\xae\x5d\x5e\xd7\x23" + - "\x5c\x0d\x11\x43\xc0\x44\x08\x7b\x58\xa3\x04\x6d\x54\xc0\xde\xe5\x40\x3e\x5a\x9e\x27\x54\xd8\xf8\xb8\xcf\xd7\x48" + - "\xe2\xb5\xab\xcd\x2a\x63\xce\xea\x65\xdd\xdf\xb3\xa2\x58\x62\x4a\x9b\x09\x2a\xd3\x09\x21\x3f\x82\x8d\xff\xe4\x19" + - "\xf8\xd7\x70\x99\x7d\x5f\xfe\x9c\x4b\xca\xe3\x70\x8c\xb2\x68\x01\x82\xfd\xaf\xec\x41\x11\x20\xa0\xc9\xe9\x5c\xa8" + - "\x7c\x5a\xac\xf2\x4a\x95\x1e\xbd\xea\x17\x68\x2b\xe5\x85\x05\x13\x24\x62\x54\xaa\x3f\x8b\x51\x29\x3e\x29\xcd\xe3" + - "\x71\x1b\x82\xc6\x9f\xd5\x6d\x47\xb1\x71\x9c\xda\x6f\xe0\xdb\x96\x3b\x6e\x38\x14\x27\xf9\xb4\x28\x97\x45\x29\x2b" + - "\x02\x4c\x31\x9b\x19\x55\xf5\xe0\xef\x9c\x39\x71\x79\x29\x75\x6e\x2a\x31\x5d\x4f\x33\xc5\xc5\x6b\x02\x74\xef\x8f" + - "\x91\x65\x75\x13\x08\x92\xe0\xe3\x94\x89\xbd\x05\xb0\xd0\xb3\xff\x15\x30\xbc\x07\xe8\x46\x08\x4f\x87\xfc\xf4\xd9" + - "\xd8\x3a\x4a\x04\x93\xbe\xfd\xa8\x4e\x95\xf4\x4a\xbd\x46\x26\x70\x58\x22\xbd\xeb\x53\x76\x3a\x4c\xa6\x86\xfe\x76" + - "\x18\x70\xac\x73\x1b\x72\xec\x92\x4e\xb4\x06\xac\x3b\x83\xe2\xf0\x41\xd8\x9d\x2f\x25\xf6\xb6\xd4\x45\xa9\x2b\xfd" + - "\x77\x2c\xae\x82\x15\x0b\xc3\x60\x66\x9d\xd3\xb3\xe9\xca\x54\xc5\xc2\x85\x23\xc2\x3c\x64\x9a\xaa\x94\x22\x25\x57" + - "\xcb\xa5\x2a\xb1\x5d\xa6\x2a\x2e\xbe\x6c\x6b\x82\x04\x5a\x7b\xa3\x2a\xb2\xc4\x19\xa1\xf3\xb9\x2a\x75\xc5\xba\xcd" + - "\x30\xd8\x96\x6a\x58\x5c\x5a\xad\xb2\xf7\x02\xe3\x46\x67\x56\x17\x87\x28\x8b\x6f\x7c\xbf\xf6\x65\xdd\x43\xcc\x9f" + - "\xf5\x58\x2f\xde\x59\xe5\xec\x03\xa3\x6c\xc8\x2f\xb9\x17\xf1\x18\x71\x90\x28\xd9\x5c\xc5\x42\xae\x31\x99\x5d\x68" + - "\x64\x05\x2a\xa5\xf3\x94\x3c\x5f\x60\xb1\xf6\xab\x40\x23\x5d\x2a\xab\x54\xac\x0a\xfe\x98\xc3\x55\x50\xa9\x68\x91" + - "\xc2\x7e\xf9\x7e\x65\x2a\xa0\x82\x9c\x85\x3c\x2d\x42\x0f\xce\xb8\x54\x4d\x5d\x53\x3e\x8b\x72\xcb\x37\xf4\x9d\xdf" + - "\xad\x2a\xb1\xb0\x71\x20\x36\x5f\x2c\xf0\xb4\x45\x96\xa2\x51\x4a\xa2\x0a\x34\x1c\xcd\x7b\x46\x06\xfc\x34\x6c\x13" + - "\x12\x05\x8b\xc5\xf6\xdf\x4e\x27\xc0\xe8\x8b\x38\x29\x57\x6d\xc7\x06\xe4\x65\xf7\x96\xb3\xd3\x26\xed\x1b\xd8\x75" + - "\xa1\x83\x9f\x95\x02\xdf\x66\x14\x48\x6f\x9c\xc4\xc4\x11\xb9\x29\x67\xc1\xa7\xef\x1a\xa9\xef\xc3\xec\xf7\x4e\x75" + - "\xed\x28\x45\x7b\xe9\xb5\x9d\x1d\x9d\xc2\xb5\x51\x0b\x77\x08\x26\x96\x86\x95\xd7\x6c\x2a\x7b\x98\x9d\xa0\x74\xf6" + - "\x76\xfe\xfe\x59\xeb\x77\xae\x5a\xa7\x0f\x99\xdc\x2a\x48\x87\x18\x41\x02\xf2\x01\x2e\xd7\x04\xb4\xaa\xd5\x24\x34" + - "\xcb\xeb\xba\x6a\x3e\x7f\x23\xe7\xa9\xf2\xb6\xa8\x54\x5e\x69\x4c\x22\x3b\x2d\x40\x32\xbc\x09\x4f\x72\x27\x2f\xaa" + - "\xce\x68\x7b\xcd\x82\x9a\x46\x1b\x3d\x46\x34\x5f\xed\xf6\xe5\x92\xcb\x24\x15\x38\x80\xce\x1c\xb1\xf3\x09\x89\xe0" + - "\x1c\x01\xb3\x6a\x13\x6a\x02\xdb\x58\x95\x54\xee\xda\xb6\x46\x55\xab\x11\x14\x25\x38\xd1\xb9\xe4\x6a\xf6\x71\xc2" + - "\x09\x97\xea\xcc\xa7\x37\x73\x8f\x68\x23\x30\xe2\x82\x26\xf2\xd1\xca\x6b\x9e\x76\x84\xe6\x00\x55\x86\xe7\xf6\xd8" + - "\x76\xfe\x71\x9c\xbe\x53\xb3\x11\x64\x6d\xdb\xd9\x59\xe5\x1e\xc5\x79\x4c\xdb\x17\xf9\x3b\xdf\x2c\xb2\x9e\x38\xbb" + - "\x08\x90\x5d\x73\xf9\x84\x5a\x85\x87\xb6\x1a\x0f\xbe\xf7\xc9\x5a\xfc\xc6\xfd\x5b\xb9\x6f\xcb\xc1\x20\x36\x89\x3d" + - "\x7a\x5c\x07\x58\xd9\x21\x3c\x3e\x78\x1c\x74\x5c\xd9\x41\x5f\xb0\x0e\xa1\x05\xfd\xf9\x8e\xed\xb6\x9b\x1d\xb6\x02" + - "\x0c\xb7\x9b\x2c\x4a\xa1\x72\xc2\x81\x4a\x53\x70\x52\x00\x2b\xe7\xe9\x79\x54\x53\x4f\xb9\xfa\xb1\xc0\x1d\xc6\xc6" + - "\x89\xae\xbd\xf4\xe7\xd2\x7c\xc6\x29\xf8\xb4\x24\x93\xcd\x22\xdf\xd4\x2c\xf6\x5f\x6f\x99\x8c\x75\x0c\xdf\x3e\xa3" + - "\x28\x23\xe0\xa7\xcd\x26\x69\x3a\x8f\xb1\xeb\xf7\xc0\x7b\xaa\x6d\x36\x75\x57\xad\x50\x3f\xcb\xa3\x3e\xf3\xe1\x91" + - "\xf1\xc4\x87\x43\xd1\xf9\x85\x1d\x67\x82\x10\x7b\x8c\xea\x24\x47\x58\x76\x8c\x92\x62\x94\xc9\xfc\x32\xe9\x3a\xd8" + - "\xf0\xe7\xda\x70\xd1\x01\x53\x64\x5c\x63\x15\x28\x0d\xf7\xf4\xd0\x08\xf8\x6c\x25\x2f\x95\xad\xb5\x41\x95\x98\x15" + - "\x90\x14\xf5\xfb\x4a\x66\xd6\x56\x4a\xe1\x85\x33\xad\x4a\xf1\xc2\x3a\x9e\x17\xa5\x98\xa8\x4b\x9d\xe7\xd0\x1a\x39" + - "\xa2\x7a\x4b\xa1\x17\x0b\x95\x6a\x59\xc1\xd8\x94\xbb\x8a\x26\xdc\xe9\x77\x06\xdc\x0b\x16\x03\x03\x2c\xc4\xa4\x62" + - "\x33\xf1\xc2\x71\xb0\x77\xcd\x14\x56\xb6\x54\xe5\xac\x28\x17\x2a\x6d\x30\x87\xd9\x3a\xec\x3d\x9a\x51\x9c\xb5\x9d" + - "\x3d\x27\xa9\x02\x8a\x1f\x02\xbd\xdc\x3b\xdc\xc5\xc7\x38\x4c\xf8\xaa\x4f\x37\x00\x62\x1b\xfc\xae\x63\x5a\x80\x4c" + - "\xf0\x3a\x24\xff\xf8\x9b\xd6\x64\xb3\x75\xd9\xf9\xf8\x89\x7b\xa6\x64\xb7\xf4\x4f\xc9\xe8\x85\x1d\xa0\xe1\xa9\xbb" + - "\xcd\x11\x22\x62\xf8\xa0\x3d\xb1\x7b\x34\x95\x30\x32\x17\x9f\x8c\xf1\xc5\xbf\x60\x4c\xbd\xcb\x62\x05\x4f\x7e\x90" + - "\xf9\x25\xd3\x8d\xb4\x88\xf3\x0b\x24\xf6\x7d\x50\xcf\x2f\xf2\xed\xb7\xee\xfd\x38\xd3\x51\xf4\x28\x36\xc9\xdd\x2c" + - "\x32\x3c\x14\x64\x95\x6b\x69\x40\x2f\x6b\xd2\x6d\x30\xbc\xfd\xb3\x6d\xa1\xb1\x55\x97\x3e\x18\x13\xdc\xec\x68\xf8" + - "\xa9\x3b\xea\xf8\x86\x8c\x24\x6c\x68\xaa\x0b\x4d\xa2\xee\x32\x5e\x53\x99\x77\x23\xed\x78\x28\x43\xc7\x9c\x66\xd3" + - "\xf6\x12\x90\x93\xd7\xda\x4c\x55\x96\xc9\x5c\x15\x2b\x62\x57\x2a\x59\x5e\xaa\x2a\x92\xce\xa2\x4d\xe3\x4a\x1e\x73" + - "\x31\x16\xd7\x98\x10\x6b\x90\x15\x53\x69\xf3\x52\xd4\x1e\x01\x5b\x3b\x8f\x50\x01\x3f\xa5\xa8\x12\xe7\x14\x60\x2d" + - "\x47\x44\x2b\xd3\x58\x5a\x2c\x8b\xe2\x8e\xd9\x04\x40\xb7\x41\xbc\xaf\xec\x6d\xe6\xba\xc0\xec\x8e\x9f\xd5\x47\x4b" + - "\x42\x49\xaa\x9f\xed\xde\xcd\xa5\xf9\x1e\x93\x46\x52\x69\x90\xf8\x61\x42\xf1\x22\xbb\xbb\x89\xaf\xce\x65\x71\x6e" + - "\x5e\xaa\x19\xfc\xf8\x07\xbd\x92\x13\xd4\xb3\xc4\x86\xe1\x20\x11\x9d\x8f\xd3\xc1\xa5\xd8\x44\x4f\x9f\xb2\x98\x81" + - "\xcb\x6e\x85\x72\xbc\x4f\xb4\x61\xe1\xe2\x32\x45\x7d\x7e\x6f\x4e\xed\xee\x3a\xb3\x39\xd6\xb6\xf6\x85\xda\x0a\xf1" + - "\xe2\xf4\xf4\x49\x6f\x5b\x32\x3a\xcc\x07\x61\x5f\x01\x07\xeb\xb2\xd3\xfd\x1b\xd2\xd2\xd5\x7c\x47\xee\xb0\x33\x45" + - "\x08\x9c\xf8\x6f\xe2\x0a\x75\x6c\xa5\xe3\x21\xba\x4e\x93\xe4\xdb\x52\x8a\xbd\xb0\xb1\x5d\x5f\xcd\x2f\xc0\x3e\xbe" + - "\x13\x98\xcf\x5d\x91\x14\xf4\xff\x77\x85\x4d\x16\xf2\x83\x32\x0e\x72\xfd\xc9\xba\x1f\x14\x1e\xc5\x6b\x1a\xa7\x81" + - "\x81\xc1\x54\x07\x80\x2a\x95\x53\x07\x61\x2a\xc3\x1a\xc1\xf1\x74\xbb\xf6\xc2\x2d\x03\x51\xb9\x55\x8e\x8a\x56\xdb" + - "\x8e\x41\xc3\xa1\x60\xbe\x89\x51\x7d\xb1\xac\xd6\x77\x42\xe0\x63\x17\x31\xf6\x10\xdc\xc4\x68\xea\xa3\xfc\x99\xda" + - "\x90\x9b\x15\x71\x1f\x96\x91\x4a\x0e\x51\x75\x6b\xb3\x8d\x52\x70\x67\x02\x5c\xd9\x48\x3c\x39\x12\xd3\x54\x56\x72" + - "\x24\xbe\x3c\x12\x70\xe1\x56\x6b\x51\xaa\xd9\x48\x7c\xd5\x75\xc9\x48\x05\xa6\xd1\x04\x66\x62\xb2\xe6\x52\xd5\x22" + - "\x61\xcf\xf8\x91\xf8\xe6\x68\x8b\x6b\xfc\x48\xfc\xe5\x48\xa8\x6a\x3a\x70\xf9\xe4\x1c\x45\x7f\x2a\xbe\xe6\xba\xf8" + - "\x36\x49\x6e\x10\xef\x96\x3c\xee\xda\x72\x37\x72\xb9\x54\xb2\x44\xd1\xee\x4f\x0f\x31\x68\xc9\x25\x0d\xd3\x6a\x98" + - "\xa9\x43\x53\x62\x4b\xa6\x9f\x26\xc9\x20\x0c\xfa\x28\xf5\xd9\x8d\xf4\x5e\x8c\x17\x17\x51\xa8\x43\x80\x43\x4c\xae" + - "\x87\x51\x95\x4b\x10\x40\x94\x4c\x55\xf9\xd1\xc1\x4a\x6a\x67\x03\x96\x23\x17\xad\xda\x29\xa5\xa3\xff\xd1\x0e\x29" + - "\xbf\xcd\xa7\x74\xc8\x65\x1d\xef\xbc\x7a\x3f\xb1\x8e\xe4\xa7\x97\xd2\xb4\xa3\xb6\x56\x98\x8c\xe7\x07\x07\xe1\xee" + - "\xd9\x01\x72\x1e\x35\xce\xfd\x1d\xa6\x00\x3f\xad\x80\xb2\xf8\xb9\xe1\x88\xf8\x92\x5e\xb7\x94\xf6\xe1\xac\xb9\xea" + - "\x5a\x00\x53\xf8\x55\x10\x4d\x8f\x3c\xb4\x11\x89\x1a\x5c\x0e\x7a\xa2\x63\x94\x2c\xa7\xf3\x4e\xd7\x9e\x15\x14\x50" + - "\xda\xc6\xa3\x4e\x13\x91\x70\x58\x70\x0b\xab\x88\x7e\x20\xdd\xae\xf3\x9b\xda\x6c\x70\xdc\xb6\x05\xd2\x12\x1a\x68" + - "\x6a\xf3\xf9\xf4\x75\xde\x9f\x16\x59\xe6\xf3\xe3\x76\xf0\x88\x76\x46\xdb\xaa\x6a\x36\x4a\x2e\x31\xa8\xcf\xc4\x81" + - "\x2d\x45\xee\x04\x5d\xf4\x68\xf9\x78\x4f\x51\xa9\xc9\x9e\xa8\xe5\x9b\x74\xfd\x3b\xbf\xd6\xc3\xc6\x40\xea\xf7\x7f" + - "\x76\x98\x16\xa5\xbf\x1b\xd0\xbd\x79\x2a\x0e\xc4\xb1\xff\xb9\x6f\xa7\x32\xaa\xeb\x57\x83\x19\x5d\xa9\xfc\x5f\x5e" + - "\x3a\xea\xc5\x84\x63\xce\x89\x9c\x1e\x09\x2d\x9e\x72\x4b\xf8\x7b\x7f\x2c\x1e\xd7\x1c\xaa\x6d\xa9\xd0\xb6\xe0\xcc" + - "\x48\x11\xc6\x0d\x6b\x73\x2f\xd2\xf4\x4f\x9b\xfa\xe1\xff\xec\xd4\xb3\x7f\x1a\xdf\x5a\x10\xc1\xae\xe1\x33\xf0\x20" + - "\x5e\x6d\xbf\xaf\xd1\x24\x75\xf4\xe7\x2e\xf2\xf2\xff\xaa\x45\xee\xef\x87\x9b\xfa\xa7\x2c\x94\xab\x9a\xbb\xd0\x3c" + - "\x7f\xfb\xe6\xd5\x1c\x8b\x38\xd4\xee\xe4\xdf\xb9\xa0\x0a\xf0\xa5\x69\xca\xd5\x95\x83\x3b\xd8\x6b\xc4\x69\xd6\x1a" + - "\xb8\xcf\x3f\x44\x29\x53\x5d\x50\x3c\x1b\xfb\x13\x4e\x8a\x1b\xfb\x7b\xa6\x33\x65\xff\x5e\x4a\x63\xae\x8b\x32\xb5" + - "\xbf\xf5\x42\x5e\x2a\x1b\x08\xc7\x6b\x8e\xcd\x63\x1a\x2d\x07\x2d\x75\xab\x09\x08\xb7\xb5\x99\x98\xd5\x64\xa1\x2b" + - "\xdb\x7d\xa9\x8c\xaa\x3e\xb9\xfb\xb8\x2a\xb4\xeb\x9f\xca\xc4\x4a\xb3\x16\xcf\xdf\x9e\x50\x54\xaa\xd5\xd2\xe7\xea" + - "\x3a\x30\x03\x86\xf5\xd7\xdd\xc3\x84\x32\x78\x04\x26\x22\x9f\xbc\x61\x1c\x46\x08\x99\xda\x6e\x1c\xf1\x96\x05\x66" + - "\xc6\x71\x6d\x40\x8e\x8d\x72\xb1\x14\xce\x5d\x38\x78\xd2\xd4\xce\xc2\x2e\x94\x46\xfd\x98\x67\xeb\x20\xc6\x99\xd5" + - "\xd8\xac\xa1\xef\x51\xe8\x85\xe9\x91\x1b\x27\x60\x93\x29\xbe\x97\x65\x4f\x5c\x96\xc5\x6a\x69\x7a\xc2\xc5\x21\x92" + - "\x69\x93\xbd\x42\x38\x64\x83\x5d\x52\x9c\x3e\x38\xf2\x45\xa7\x2c\x7a\xd4\x3e\x0e\x52\xf5\xf3\x3a\x16\x07\x62\xc4" + - "\x8d\x6a\x91\xfb\x24\x91\xe0\x6c\x50\xcf\x4f\x43\xc0\x1b\x9a\x9a\x2d\xc7\xe0\x23\x25\x3d\x64\xed\x13\x9a\x88\x55" + - "\xcc\x50\x5f\x61\x3e\xc8\x17\x98\x3c\x99\xca\x5f\x95\xa6\x12\xe5\x0a\xaf\xf4\x20\x64\x4c\xa5\x28\x18\x2e\x38\x2f" + - "\x6f\x89\xe9\x96\x07\xea\x46\x4d\x5d\x7f\xb5\x74\x00\x71\xbc\x91\x4f\xf0\x31\x2d\x72\xca\x83\xc0\x56\x1e\x0c\xc1" + - "\x95\x68\xde\x41\x6d\x21\x35\x77\xeb\x85\x7f\x2d\x44\x5c\x08\x89\xbb\x33\x36\x1b\x6a\x11\x92\x07\x02\x0b\x93\x8e" + - "\x84\xf6\x15\x81\xd4\x8d\xf3\x68\x05\xa6\x44\x96\x00\x3c\x34\x42\x2b\x13\xe9\xf3\xc2\x95\xdb\xb7\xdb\xd6\x5f\xb3" + - "\xe0\x0c\x28\x93\x17\xd3\x30\x9a\x10\x4d\xcf\xe9\x13\xb3\x95\x1a\x39\x94\x74\x00\x7b\x21\x4d\x65\x53\xd5\x4a\xcc" + - "\x7a\xeb\x86\x46\xbf\x9a\xa5\x9c\xb2\x53\x04\x60\xed\xc8\xc3\xa7\x61\xd3\x12\x1d\x41\x42\x9a\xf5\xa3\xdb\x0e\x5f" + - "\x1f\x08\x54\xcf\x3a\xe6\x8e\xbd\xa5\xe1\x78\xa8\x75\x1e\x9e\xea\x18\x07\x1c\xd4\x7c\xc0\x18\x7b\xa3\xd4\x41\x87" + - "\x5a\x2a\x8f\xc1\x81\x43\x1f\xb3\xb5\xb6\xa7\x66\x1b\x87\x6a\xc1\x0e\xdc\xbd\x05\x6d\x7b\xd0\xbe\x09\x0c\x58\x47" + - "\x14\x7c\x4e\x68\x6e\xc9\x62\xa3\xed\xf8\xd3\xc1\xea\xa2\xdc\x9b\x07\xcd\x65\x81\x73\x1e\x36\x51\x5a\x0b\x8e\x77" + - "\xaa\xe6\xca\xde\xb0\x94\xd4\xce\x25\x3f\xa7\x48\x29\x6a\x8c\xee\xad\x0f\x4b\x45\xfe\x08\x40\x70\xc8\xb0\x1a\x26" + - "\x5c\xeb\x71\x2a\x75\x5b\xa9\x46\xb8\x84\x54\x4c\x15\x7d\xec\x7b\x40\xb1\x1c\x8d\xb4\xeb\x1a\xb9\x27\xac\xe2\x8e" + - "\x75\xf7\x81\xb1\x6c\x64\xf5\x05\xde\x33\xca\x0d\xc4\x9b\xc3\x01\x34\x9e\x86\x33\xb1\xeb\xc6\xd4\x91\xae\x7a\x5f" + - "\x53\xbd\x70\xe5\x82\xb8\xc7\x80\xe2\xfb\xfc\x15\x99\xca\x2d\xe5\xb6\x69\xb2\x89\xe4\xfb\xfc\x6b\x18\xe3\x51\xe7" + - "\x3e\x8f\x84\xde\xdf\xf7\x19\x90\x2c\xb1\xb7\x5d\x9d\xe9\x0b\x4a\xa9\x53\xcb\xe7\x14\xd0\xec\xdb\x68\xba\x32\x4d" + - "\x3d\xad\xb1\x78\x52\xf6\x82\x73\xde\x43\xb3\x57\xb0\x08\x72\x41\xf6\x0d\x06\xa9\xa6\xe4\x96\xc8\x85\xbc\x29\x72" + - "\x5b\xf7\x49\x8c\xe9\x53\xf4\x74\xe2\x20\x89\x30\xc6\xff\x3e\x66\x87\xcf\xad\x1a\x11\xfe\xc4\x24\x80\x61\x1a\x2a" + - "\x37\x08\xdd\x0a\xc7\x96\x3e\xc6\xfe\x59\x59\x61\xb0\x58\x0b\x27\xfd\x1b\x2e\x4b\x35\x55\x68\xcc\x0f\x9c\xda\x3e" + - "\xc9\xba\xdb\x66\x39\x68\xba\x97\x6f\xad\x11\xb6\xd9\x88\x06\x14\x1a\xda\x1e\x67\x28\x6e\x9b\x47\x53\x0b\xe4\x62" + - "\x15\x1a\xeb\x96\x59\x76\xc7\x9a\xcd\x27\x2f\x1a\x76\xb5\xc8\xd2\x17\x8d\xf0\x06\x9a\x4b\xae\xae\xad\xbb\x74\xe8" + - "\xbe\x67\x77\xee\x22\x70\x71\xfa\x05\x53\x0f\x3d\x44\x4f\x2d\x21\xcb\x89\xae\x4a\x59\xae\x9d\x97\xb7\x2b\xd1\x8f" + - "\x75\x9d\x31\x2d\x30\x55\x01\x9d\xa8\x5c\xcd\x74\x45\xce\x5c\x00\xed\xa0\x8c\x2a\x41\x3b\x32\xc1\x7f\xda\x2e\xfd" + - "\xb3\xdb\x14\x30\x0f\xdb\x76\x29\x72\x3b\xd8\xe2\x4f\x1f\x99\xa4\x68\x3b\x23\xbf\xd5\x7f\xf3\x22\x22\x37\xf7\x4f" + - "\x76\xfb\x3d\x8a\x60\x90\x58\xac\xa8\xb9\xba\xf3\x24\xad\xea\x09\x46\xe3\x86\xa8\x4a\xa9\xbb\xab\xfb\x97\x87\xf6" + - "\xa5\x45\x9e\xd8\x1f\x16\x93\x05\x62\x52\x83\xaa\x10\x0e\xed\x4c\xe1\x1c\x28\x26\x72\xfa\xa1\xbf\x2c\x8b\xa5\xbc" + - "\x44\xe7\xb7\xc2\xb9\x49\xc7\x76\x8e\xd0\xb9\xc0\xf6\x73\x26\x1e\xe3\x2a\xfd\x6c\x1e\x8b\x8b\xc0\x2b\xa4\xc5\xa9" + - "\xf8\x27\xb5\x32\x0a\x26\x32\xfd\x57\x26\xd2\x80\x1c\x49\x15\xf8\xe4\xa8\xb6\x7a\x66\x24\x16\x58\x9f\x88\xae\x4d" + - "\x80\xd5\x91\x90\x54\x57\xc2\xbe\x70\x36\xf7\x0f\x4a\x2d\x09\x0f\xec\x71\xf1\xbb\x57\x5f\xf9\x9d\x28\x5d\x8b\x9e" + - "\x69\x43\xea\xc8\x95\xb6\x05\xbd\xef\x73\x2e\xfa\xf8\x8a\x61\x78\xbc\xb6\x83\xf3\x2c\x6a\x39\x4b\xed\xd3\xd0\x4f" + - "\xf0\xf8\xb3\x28\x98\xf7\xb7\x73\xbd\x1c\x45\x34\x3d\x72\x2a\x0a\xf9\x9d\x12\xee\xcd\x8f\x1e\xf4\xcf\xd5\xd5\x13" + - "\x8f\xe1\x46\x38\xb8\x68\x40\x66\xb1\xca\x2a\xbd\xcc\xd4\x0b\x1a\xd2\x84\xcc\x06\x4f\xc3\xf4\x5a\xd2\xc4\xd5\xd9" + - "\x08\xdb\x36\x58\xf5\x5d\x6c\x43\xd3\xf9\xc7\x76\x80\x89\x71\x23\x67\xa5\xdb\xd6\x64\x62\xd1\x2a\xa6\x45\x9e\xaa" + - "\xdc\x60\xc6\x80\x40\xa4\x5d\xf6\xd8\x2f\xb5\x75\xcb\x22\xa7\xb3\x5c\x5d\xff\x1c\xf8\x9c\xb1\xcf\x5c\x7d\x95\xae" + - "\xf7\x90\x5f\x5a\xc8\xe5\x92\x79\xec\xa5\xd8\x0d\x53\xa0\xdd\x05\x81\x4f\xf0\x27\x23\xfc\x60\x89\x62\xb3\xe1\xb5" + - "\x7c\x0c\x49\xc2\x95\xb4\x55\x08\xe5\x9b\x05\xe7\xec\x31\x6b\x21\x97\x75\x35\x53\x74\xa4\xea\xd9\x48\xc3\x51\x1a" + - "\xdb\x61\x94\x3f\x6a\x4e\x52\xe9\x05\x9b\xed\x78\xbc\x65\x61\x2a\xfb\x9a\xfe\xce\x53\xfb\x77\x2d\x5f\x00\x85\x00" + - "\xba\xf6\x68\x87\xf5\x3f\x5b\x3c\x89\x83\xb6\xe3\x78\x4a\xfe\x85\x43\xb0\xa0\x77\x98\x41\xd0\x3b\xfc\xdc\xda\x7b" + - "\x9e\x6e\xe9\xbd\x6d\x19\x35\x64\xbe\xd3\x63\x92\x31\xbd\x9d\xd6\x00\xe6\x56\x6a\xb1\xec\x09\xdd\x0b\xfc\x26\x97" + - "\xa5\x7a\x2d\xc3\x7a\xb7\x30\x7c\xed\x49\xa9\xb0\x06\x85\x46\x9f\x18\xeb\xfa\xe7\x90\xd9\xf2\x50\x7f\x55\x95\xd0" + - "\xb9\xae\xb4\xcc\xbc\xd7\x24\x32\x46\x30\x3b\x67\x65\xbd\x21\xab\x34\xb4\x30\xec\x7d\x89\xe9\x47\xb6\xd2\x14\x74" + - "\x6c\x7a\xd4\x71\xab\xf2\xfc\xc4\xb1\x38\x73\x99\x60\x2f\xc4\xc8\x2f\x9b\x7d\x3c\xed\xcc\xde\x96\x8a\x0f\x44\x55" + - "\x60\x96\x54\xeb\xd4\xca\x1e\x8f\xe8\x48\x57\x5e\x51\x01\x4a\x38\x90\x70\x06\x61\x62\x7d\x4b\x53\xcc\x3a\x9f\xce" + - "\xcb\x22\xd7\x7f\x97\xce\x53\x9d\x3b\x39\xc9\x43\xd1\x1a\xa5\x71\xb7\xa8\xdd\x40\x72\x63\xdf\x25\x4f\x75\x10\x02" + - "\x38\xf8\x6b\x20\x3a\x01\xce\xd7\xb6\x8f\x5d\x9c\xa8\x3d\xaf\x8a\x07\xff\x71\xe5\xd3\x27\x5b\xd9\x91\xf3\x05\xda" + - "\xbb\x56\x46\xc8\x55\x94\x4c\x11\x54\xca\x48\x53\x94\x18\xf1\x88\x53\x0e\x90\x1c\xb3\xba\xf9\x7d\xb7\xa8\x45\x23" + - "\x04\x78\x8c\x61\x22\xf8\xf1\x71\x00\x85\x51\xf4\xf1\x66\x13\x1d\x1f\x1f\x25\x0d\x53\x1d\x0c\x06\x3a\xaf\x54\xc9" + - "\x5e\x82\x91\xc1\xdc\x88\x5c\xc1\x0f\x59\xae\xf9\x83\xb3\x0b\x1f\x01\xcd\x5f\x17\x2e\xfb\x39\x30\x3d\x76\xc7\x28" + - "\x66\x35\x5b\xbb\x4b\x90\x1e\x8f\x42\x1d\x47\x79\x92\x1f\x05\x2a\x9a\x3c\x15\xcb\x52\x2f\x80\xf1\x67\x4d\x85\xa3" + - "\xb9\x16\xc2\xb1\x9a\xca\x33\x05\x27\xb9\xa3\x4f\x3f\x02\x46\xb5\xc8\x46\x5e\x19\xf4\x7c\xb9\xcc\xd6\x01\x44\xdc" + - "\x28\x11\x90\x68\x20\x38\xb1\x74\x53\x32\xd6\x84\xa3\xd8\xa3\xca\xb4\xd7\x7f\x9e\xf0\x49\x3f\xbb\x68\x99\x8a\x3d" + - "\x15\x3f\xe7\x7d\x62\xda\x66\xac\x4d\x74\x87\x76\xb2\x16\x9c\x38\xb6\x9a\xab\x85\xb0\xd1\x91\x6e\xad\x74\xd1\x88" + - "\x31\x8e\xf2\x89\x2c\x8b\xbd\xb5\xe0\x93\x9a\x03\xb4\x5f\xd2\x99\x5d\xd2\x99\xbe\x10\xa1\x3f\x74\x79\x92\x37\xde" + - "\x85\xce\xd1\xb7\xed\x7a\x21\xc4\xcb\xe8\x66\x8c\x31\xd7\x23\x6c\x3c\xd9\xa0\x95\x9f\x26\x93\x38\x0a\x5c\xc9\x65" + - "\x16\x6c\x05\x46\x10\xd1\x16\x39\xef\x9c\x08\xa9\x75\x0e\x9c\xb6\xef\xd5\x32\x2e\x56\x55\xa6\xb8\xe4\xb8\x65\x59" + - "\x03\x9e\xf0\xc7\x55\x55\x0b\xc3\xf8\x14\x67\xf3\x00\xa6\x75\x6f\x73\x94\x0f\x30\x98\xd9\xef\x28\x17\xd5\xc5\x8f" + - "\xb9\xc4\xfe\x1a\x24\xe1\x70\xa5\xae\x03\xdc\x75\xd6\x11\xfb\xed\xf1\x0e\xeb\x6d\x11\x1b\xfc\xaf\x07\x41\xc2\x7e" + - "\xe6\x49\x44\xc9\xce\x2e\xba\x3d\xc6\xdd\x9a\x56\xc1\x91\x36\xcc\x33\x68\x99\xae\x96\x7b\xa6\xf2\xc2\x8e\x15\x33" + - "\x10\x8b\x3d\x09\x67\x6f\xb0\x3b\x81\xdc\x0e\xe3\xbb\x40\xec\x85\xca\x84\xb7\x33\xd8\xef\xe3\xd6\xe0\x18\x76\xa6" + - "\x18\xf1\x1d\x80\xdd\x60\xa2\x8e\x48\xba\xc4\xe8\x00\xe8\x92\x0e\x84\x4d\x11\x6c\x9f\x44\x31\x02\x75\xb9\xc6\x52" + - "\x9c\x34\x00\x95\x07\x50\xcf\xd5\xbd\x0e\xa6\xaa\x67\x82\x13\xdd\xdc\xaf\xe7\x36\x8d\xb6\xca\x91\xa4\x88\xa2\xe2" + - "\x3b\x9f\xc8\x38\x88\x5e\x72\x70\xb6\x99\x88\x83\x1b\xa2\xd7\xdc\x87\xa0\x2c\x9a\x7f\x87\x0f\x6c\x15\xd4\x6d\x07" + - "\xb5\x89\x63\x6e\xb9\x21\xf1\x0c\xf0\x2b\x16\xa1\x01\xb3\x07\x12\x68\x74\xd2\xf6\x65\x33\xd5\x6a\xb7\x29\x20\x51" + - "\xeb\xef\xcb\x62\xf1\x0e\xf5\x9b\x2d\x3a\x55\x94\x7d\x5f\x58\xe2\xec\x98\xdb\xf7\x77\xaa\x59\x39\xd6\xe7\x27\xce" + - "\x46\x6a\xad\x55\x36\x3b\xe9\x99\x55\xa7\x1e\x5c\x90\x8b\x0b\x4b\x24\x0b\xaa\xb7\x1d\x7c\x56\xef\xc8\x46\x14\xba" + - "\x9e\x3a\xa2\xe3\xc5\x99\x7a\x6b\x2c\x04\x22\x0e\xbc\x6f\xcb\x3b\x20\x8a\xc5\x2a\x4f\x25\x59\xc6\xdd\x85\xa9\x72" + - "\x83\x49\xc5\x30\x0c\x52\x85\x65\x55\x4b\x25\xa7\x73\xcc\xbc\xcd\x59\xde\x96\xfd\x4c\x5d\xa9\xcc\xd2\xc6\xc4\x74" + - "\x9d\x1c\xca\x60\x12\xe3\xba\xde\xf7\x13\xfd\x7b\x43\x58\xb3\x5b\x8e\xa8\x03\xc5\xa6\x8b\xeb\xb9\x51\x9f\xe7\xeb" + - "\x7f\x72\xe0\xf8\xb0\xc7\x3b\xcd\xed\x5d\xc4\xc7\x27\x4d\x85\x2c\x93\x67\x8d\x7a\x05\xad\x4a\x05\x17\x9d\xb2\x5b" + - "\xdf\x37\x64\x4e\xa1\x69\x50\x6d\x61\x77\xcc\x3a\xb2\x45\x61\xaa\x17\xae\x04\x03\x79\xb3\xd2\x89\x48\xc2\x15\x78" + - "\xb9\xbd\x1b\x70\xe2\xe1\x51\xe5\x86\x5b\xe6\x18\x9d\x6a\x0f\xe2\x6d\x12\x2a\xeb\x24\x2e\x3e\x55\x38\xf6\xf1\x6a" + - "\xed\x27\x43\xdb\x93\x51\xb7\x39\x32\x84\xe3\x7d\xde\xae\x03\x72\x47\xb6\x6b\xfd\x90\x5a\x28\x65\x6c\xb6\x6f\xce" + - "\xc1\x92\x19\x22\x53\xfe\xad\x0b\xe7\x3c\x6a\xe4\xea\xc3\x6a\x04\x32\x13\xab\x25\xca\xcc\x8a\x84\x96\xa5\xf3\x49" + - "\xb1\xd3\xf2\x34\xb2\x25\xfc\x2e\x34\x2d\x23\xdf\xeb\x72\x21\x5a\x78\xf9\xbc\x5c\x89\x9e\x09\x99\xaf\xbb\x28\x14" + - "\x91\xc7\xb0\x98\xcb\x3c\x75\x61\x86\x98\x9e\x7e\x7f\x5f\xf3\x1d\x64\xb7\xe8\xbd\xdd\xa2\xf7\x7e\x8b\xec\x94\xda" + - "\xb7\xe6\xbd\x05\x4b\xc8\xae\x44\xb1\xf2\xd1\xf5\xe6\x6d\x44\x6e\x7f\x1c\xf7\xf4\x8c\x52\x63\xdc\xb1\x7d\xf5\xa6" + - "\x81\xfd\xcb\x0e\xed\x0b\x72\x79\x1b\x05\x4e\x55\x5c\x4b\x23\x64\xbb\x79\xb9\x27\x74\x6e\x54\x59\x09\x99\xbb\x73" + - "\x0d\xf0\xeb\x5b\x8f\xe3\xdf\x1e\xb9\x64\x31\x4c\xdf\x7d\x0a\x2b\x8d\x9e\x76\xdd\xc1\xb4\xc8\xa7\xb2\x4a\xfe\x10" + - "\x6c\x59\x65\x00\xe1\xfb\xc7\xe2\x22\x70\x5f\x14\x1d\x71\x8c\x49\x0a\x47\xa2\xd3\x11\xb7\x36\xd5\x44\x77\x4b\x6c" + - "\x66\x6c\x89\x2d\x3d\x14\x9e\x8a\xf7\x2e\x65\x69\xdb\xc5\x65\x27\xa9\x7b\xe2\x3d\x1c\x4b\xfb\x25\xef\xf2\x96\x6f" + - "\xbd\x0b\x41\xdc\xcb\x7b\x54\xdb\xb6\xf4\xd1\x66\x85\xa4\x56\x91\x1b\x93\x53\x97\x12\x17\xea\xa4\xb3\xa3\x56\xb5" + - "\xd3\x76\x2c\xb8\xeb\xe2\xfe\x6b\x59\xac\x96\xfc\x8d\x49\x6a\x9d\x98\x5e\x80\x76\xe1\xad\x3e\x59\x9f\x62\xe2\xff" + - "\xe0\x6d\x10\x9b\x88\x2b\x9e\xac\x6d\x7c\xc9\xb8\xde\x6b\xbd\xa9\x59\x2d\x55\xf9\xda\xd1\x92\xba\xbe\x27\xa4\x95" + - "\x01\x97\xe3\xa8\x79\xa4\x66\x26\xf2\xfa\xde\xb3\x1a\x21\xdf\x96\xbe\x28\x56\x38\x21\xae\xf1\x87\xb7\x7e\xe7\xa0" + - "\xe3\x32\xdc\x7a\x2d\x27\x32\xd9\x7b\x7b\x3e\x42\xd8\x2d\x35\x0d\xe3\x86\x79\x6e\xdf\xc9\xe9\x07\xac\x0b\x58\xbf" + - "\x62\xbc\xab\xc6\x2f\x1c\xf5\x26\xb3\x6b\xb9\xe6\x7a\x68\x5c\xfa\x0f\xc7\x72\x5c\x43\x51\x06\x4b\x0b\x75\x49\x0d" + - "\x65\x92\x07\xf1\xde\x9e\xa5\xc0\x79\x7a\x86\x59\x46\x2f\x12\xd2\x26\x05\x50\xf2\x73\xf9\x19\xab\x58\x57\xea\x52" + - "\x95\xce\x10\xa4\x67\x33\x57\x6f\x01\x13\x6e\xb8\x0f\x43\x52\xbb\xc3\xcd\x7f\xc6\x9a\x29\x62\x2c\x12\xfb\xfd\xbe" + - "\xbb\x30\x2d\x30\xd8\x85\x98\xb8\xa8\xd7\xb2\x9a\x0f\x4a\x20\xcc\x8b\x04\x2f\xdd\x83\xc1\xa1\x9d\x11\xb1\x81\xb8" + - "\xba\x5a\x84\x32\xe5\x08\x6b\x6c\xf4\x4e\xe3\x26\x1f\x47\x17\x7d\x58\x74\x6a\x1a\xf0\x43\x51\x62\xe1\x50\x58\x58" + - "\x4a\x52\xc5\xd4\x10\xd5\xa9\x57\x02\x69\xc2\x7e\xff\xff\x07\x91\xeb\x37\xfd\x9b\x90\x82\x12\x6e\x72\xbd\xbb\x52" + - "\x51\x26\x88\xc2\xf7\x6e\x0a\x1b\x49\x4d\x08\xf8\x1b\x15\xcf\x9f\x28\xd1\x39\x38\xe8\x60\x81\xd8\x6b\xdb\x6d\xe8" + - "\x05\xfe\x6d\x8f\xe3\x58\xec\xcb\x77\x45\xa6\x30\x23\xca\x9b\x22\x55\x3f\x68\x53\x45\xd5\x8e\x4e\x5e\x8d\x44\x87" + - "\xe0\xd7\x39\xe2\x2f\x47\xe2\x69\xbe\x5a\x4c\x54\xf9\xac\xeb\x63\x4f\x43\x0d\x08\xbb\x53\x79\x8e\x03\xe0\xc7\x64" + - "\x2a\x34\x7d\x1a\x14\xdb\xac\x0a\x3f\x64\x48\x6c\x95\xd3\x10\x19\xe3\x68\x48\xaa\x8d\x53\x97\xeb\x03\x1e\xa6\x06" + - "\xf6\xb3\xf7\x51\xfd\x8e\x7f\xc6\xe4\xcb\x71\xdb\x4d\x15\x7f\x23\x2f\x4d\x5d\x76\xdf\x86\x72\x0e\xf5\x85\x33\x9e" + - "\xd2\x21\x68\xde\xda\xee\x9c\xbd\x2b\xe5\xf4\x43\x10\x52\xef\xe5\x78\xd4\xbc\x56\xac\xa4\x34\x11\x18\x81\xb2\x46" + - "\xea\x98\x77\x73\xb5\x26\x8c\x41\xa2\x71\x59\xe4\xca\x49\xb4\x32\xcb\x7c\x99\x7d\x4b\xf1\xdb\xc4\x78\x6b\x4b\xb3" + - "\xbb\x13\x01\x2c\x44\xce\x7e\x3f\x58\x90\x9f\x04\x55\xa0\x50\xe4\x55\x44\xb5\x66\xb0\x72\xc9\x95\x2a\x5d\x98\x91" + - "\xcb\x83\x41\xda\xd6\x2a\x9c\x47\xa4\xa3\x0a\x69\x6d\xeb\x26\xb5\x09\xf8\x5e\xa7\x18\x40\x0e\x0e\x66\x13\xbe\xc1" + - "\xed\xc9\x24\x7f\x7f\x2c\x74\x20\x50\x13\x94\xf7\xf6\x18\xdf\xa3\xa6\x6e\x92\x21\xd6\xb6\x20\x6d\x70\xf7\x35\x10" + - "\xd6\xa1\x6a\x60\x73\xf3\x17\xc8\x76\xa7\x92\x00\x11\x6a\x00\x43\xd6\x18\x69\x36\x12\x00\xcb\x66\x59\x16\xba\x02" + - "\x72\xa3\x17\xc0\x9c\x29\x66\x73\xb9\x60\x8c\xaf\x04\x5e\x3b\x48\xbc\xdc\x67\xe2\x20\xdc\x97\xad\xb9\x4f\xd0\xe0" + - "\x96\x84\xd6\x38\xf4\xad\x74\x8b\x6a\x28\xe0\x76\xa2\x77\xa8\x28\x5a\xb2\xa8\xd8\x48\xb8\xd0\x6e\xbb\xf6\x4b\x7f" + - "\xa9\xcd\x54\x96\x9c\x2a\x50\x20\xcb\x37\x2f\xb2\x54\x95\x36\x16\x86\x2d\x1e\x98\xe2\x5b\x4e\xab\x95\x93\x10\xec" + - "\x61\x88\xae\x6f\xaf\x67\x0e\x1e\xb7\x69\xe1\xe0\x92\x08\x40\x1c\x5e\x01\xed\x0a\x94\x5a\x7f\xae\xa3\x53\xa5\x52" + - "\xac\x03\x66\x94\xdf\x34\xb3\x9a\x4e\x15\x31\xdc\xd6\x2e\x44\xcf\x8c\x99\xad\x32\xcf\xc0\x99\x4a\x2f\xa9\xc6\x78" + - "\xb4\x99\x35\x4a\x85\x59\x26\x99\x6b\xf1\xd3\x08\x78\x2d\xaf\xbb\xab\xa1\xc0\x7e\x1b\x1f\xd7\xf5\xb9\x80\xf8\xab" + - "\x46\xb9\xb4\xe6\x46\x36\x0e\xec\x8f\x57\xaa\x2c\x75\x0a\xb4\x29\xa7\x45\x00\xff\x59\xcc\xc4\x65\x56\x4c\x64\x86" + - "\x57\x50\xae\xb0\xec\x4d\x44\xbd\xb6\x51\xe1\xbb\x69\xf0\x76\xb6\x80\x78\x92\xd6\x08\xce\x55\x60\xab\xdd\xa9\x55" + - "\x7b\x25\x3a\x71\x4c\x0a\x8a\x30\xcb\x41\xc4\xb2\x76\x5d\xe1\x3e\xf7\xcc\xb2\xdc\x9c\x4d\xc6\x3b\xa2\xfb\x07\x6d" + - "\x7e\xe8\x64\xa9\x18\x3e\x12\x27\x79\xa5\x4a\x90\x73\x81\x55\x43\x77\xca\x47\xc3\xd0\xc5\x80\xbd\x11\x3d\xa7\xe2" + - "\x78\xd2\x3a\x0b\xe3\x5e\x38\x87\x74\x9e\x42\xf9\x71\x9f\xf4\xdd\xd8\x29\x1d\x4d\x03\x39\x71\x20\xd2\x57\x27\x2b" + - "\x66\xc2\x95\x2c\x70\x4f\x59\x17\x36\xa5\xda\x46\x2b\x9b\xe5\x07\x1d\xe4\x28\xb7\x9d\x77\xfd\x0b\x9c\x3d\x62\x6d" + - "\x45\x54\xf0\xc0\x44\xc6\x62\x42\x35\xa7\xdb\x0e\xd5\xda\x6d\x24\xcc\x2d\xbe\x45\x7c\x23\xa7\x68\x9f\x82\x29\x70" + - "\xc7\x6f\xd5\x26\x84\x87\x85\x2e\x2f\x0b\xa6\x36\x3d\x6b\x5d\xf6\x69\xfd\xe2\x7e\x64\x39\xf3\x4e\xaf\xbc\x55\x69" + - "\x94\x3c\xac\x7d\x23\x1b\x68\xf4\xcf\xc8\x77\x5d\x6f\x28\x3c\x05\x5e\xc3\xc1\x1c\xb3\x2e\xd1\x56\xc8\x78\x1e\x83" + - "\xc0\x27\x36\x8c\x3d\x08\xcb\x95\x4a\xeb\x0a\x11\x95\xb9\x7b\x2e\xb2\xe2\x9a\xb5\xa1\xf4\x25\xe6\xde\x75\xae\xba" + - "\x80\x3f\x14\x22\x8c\x11\x8d\x74\x80\x1e\x1a\x07\x14\xec\xc4\x4f\xd1\x61\x5e\x54\xf7\xee\x14\x79\xf3\x8d\x3d\xb9" + - "\xb7\xbe\xfd\x73\xff\x27\x56\xc4\x5e\x96\xaa\xff\x91\xae\xc5\x64\xa5\xb3\x2a\x9c\xce\xc0\xe5\xad\x0a\xc6\x74\x55" + - "\xf6\x9c\xf4\x56\x2f\xc4\x77\x2b\xce\x98\x74\x5e\xb4\xbe\x04\x3a\x7e\x81\x33\xc4\xfa\x44\xa1\x51\x83\x0e\x06\xfb" + - "\x98\x72\x09\x3f\x9a\x68\xbd\xcc\xd8\x16\x1a\xe3\x78\x8f\xe0\xd2\x72\x67\x9c\x88\x8b\x8f\x75\x81\x7f\x39\xe4\x45" + - "\x80\x70\x49\x94\xc4\x62\xe5\xd8\x96\x13\x30\x51\x31\x09\x3b\x6a\x87\xae\x22\x1e\xf8\xfe\x3d\x7f\xaa\xdd\x45\xe5" + - "\x8f\x77\x12\xe0\x91\x1d\x60\x10\x3a\x47\xd8\xbf\x1d\x96\xfa\x34\x5e\xf6\x2f\x9b\xdc\x97\xdc\xd7\xdf\x95\x28\xb7" + - "\x2d\x74\xae\x17\xfa\xef\x56\xd7\x47\x19\x02\xac\xa8\x86\x56\x40\x02\x00\xa0\x38\xf2\x0f\xc0\x5f\xa3\x33\xb9\x25" + - "\x83\x21\x85\x09\x73\x4e\xf3\x49\x79\x27\x3f\x00\x3d\x34\x36\x11\x3a\xe5\x77\xa8\xf8\x00\xd3\x45\xc4\xb5\xd0\xcb" + - "\xa2\xa8\x3c\xb0\xb4\x11\x32\x17\x27\x58\x04\xc9\xa9\x90\x6c\x88\x46\x5b\x41\x14\xa6\x17\x54\xd7\x2f\xb4\x9a\x88" + - "\x67\xe2\x31\x4a\x6c\xa4\xb8\x1b\x7b\x03\x49\x37\xd0\xa2\x9d\xbc\xf4\xf1\xc8\xb6\x34\xe8\xa5\xaa\xbe\x5b\x9f\xa4" + - "\x81\xa4\x3c\xa8\x55\x33\xdc\x56\x50\x7b\x67\xa7\x5d\xbf\x79\x18\xeb\x37\x89\xfc\xba\xfb\x38\x09\x15\x15\x27\x2f" + - "\x3b\x17\xbc\x12\xab\x0c\x0e\x83\x53\xda\xd2\xf1\x74\x7b\x41\x01\x65\xdc\x6f\xd1\x25\xe7\x3d\xc7\xa4\xfa\xf7\x71" + - "\x1e\x2b\xef\x21\x67\xb9\x93\xb7\xa5\x72\xb8\xec\xb8\x2d\x94\xb4\x4c\x05\xff\xbd\x52\xa5\x9e\xad\xd9\x89\xbb\x5c" + - "\xa3\x5b\xb4\xa9\xd4\x52\xac\x96\x42\x0a\xa4\x5c\x21\xc5\xa7\x8b\xc3\x76\xe8\x86\x9f\xd6\x99\x91\x46\xc2\x7b\xcb" + - "\x91\xb4\x90\x52\xbb\xf7\x56\xb3\x48\x51\x2a\x14\x45\xb0\x35\x0c\x47\x21\x89\x20\xb4\x46\x61\xa9\x28\x45\xa9\x2f" + - "\xe7\x55\xbf\x2a\xfa\x99\x9a\x55\x4e\x17\x10\x5d\xa2\x54\xaf\x09\x24\x07\xc3\x0c\x94\x2b\xdb\x14\x7a\xf8\x60\x24" + - "\x5a\x84\x7e\x5b\xaf\xdd\x1a\x3a\xea\xd0\x19\xfd\xf9\xa4\x28\x2b\xc1\xd9\xd5\x75\x25\x64\xa0\x5e\xf6\xbb\x59\xc3" + - "\xb1\x84\xc3\x04\x09\x67\x30\x83\x7d\x78\x35\x07\xa2\xfd\xad\xef\x23\x01\x6c\xf3\x46\x8a\x3c\xf5\xc9\x93\x43\x13" + - "\xc1\x29\xc6\xd1\xf7\xf8\xca\xa7\xc0\x33\xda\x39\x80\x9f\xcd\x3f\x68\x38\x8b\x44\x3d\xd3\x20\x0f\x85\x30\x1f\x23" + - "\xad\xb4\x1a\xf6\xad\xf8\xbd\x25\xdf\x94\x55\x18\x97\x3c\x94\xad\xf8\x12\xdb\x3c\x31\x22\x0a\xde\x38\xcb\x52\x13" + - "\xbb\xe8\x88\x44\x3a\xc4\x5a\x1a\x28\x52\xfe\xe3\xa4\xb5\x11\x94\x42\x04\x85\x77\xab\x97\x2e\xd5\x42\xea\xbc\x67" + - "\xab\x16\x5b\x5d\xb3\x2c\x9d\xcf\x91\xc5\xcc\xa5\x53\x9d\xfb\x4c\x4d\x31\x46\x7b\x69\x64\x8b\x0e\xfc\x28\x94\x52" + - "\x77\x1b\xc9\xf3\xb6\x0b\x5d\x81\xf8\xd6\x72\xdc\x6b\xf2\x64\xa8\xff\x69\xf5\xe3\xa4\x08\x3f\x64\xd3\x81\x96\xab" + - "\x1b\x35\x5d\x11\xcb\x8b\x4a\x07\xd8\x7d\xc7\x11\xe8\x19\xde\x17\xec\x4d\xb2\x2c\x8b\x2b\x4d\x75\xd3\x91\xbc\xe0" + - "\x2f\x56\xfe\xfd\xe6\x93\x5a\x96\x2a\xe4\xa5\xf8\x0c\x2c\x8a\x94\xea\x6f\x47\x19\x32\x31\x47\xf6\xfd\x7b\x3b\x01" + - "\x61\xc1\x2d\xad\x25\xa9\xec\xb9\x68\xca\x6e\x42\xa2\x81\xb2\x77\xb5\xd7\x43\xd7\x6a\x88\x73\x01\x5f\xef\xf1\x56" + - "\x43\xb8\x00\xfe\x9f\x8f\x6a\x5c\x53\xba\xbd\xce\xf1\x50\xfc\x98\xab\x7e\xa5\x17\x4a\x48\x0c\x28\x60\xad\x0d\xbe" + - "\xc2\x42\xdc\xa6\x92\x13\x2c\x82\x7c\xff\x5e\x4b\x11\xeb\xb1\x65\xcb\x11\xeb\xaa\xa4\xd3\xe9\x36\xeb\x56\x0f\xde" + - "\x17\x3a\x87\x57\x94\x82\x8b\x3e\xb0\xe3\x3b\x35\xeb\x8b\x79\x59\x2c\xd4\xd3\xc3\x2f\x29\xc4\x9b\x94\xf3\x5c\x88" + - "\x3b\x28\xf3\x4d\xf7\xf7\x5a\xc0\x7a\x1f\x56\x41\xde\x52\xcb\xa5\xcb\x52\x9b\x80\x7b\xf5\xd3\xae\x17\xe9\x06\xee" + - "\x67\x37\x2c\xa4\x6d\xa7\x74\x42\x4e\xa5\xc0\xa9\x84\x79\x01\x39\xc7\x91\xbb\x83\x31\x72\xda\x55\xd6\xef\x36\x16" + - "\xf4\x8b\x9a\x7c\xd0\xd5\xd3\xaf\x9e\xfc\x65\xf0\xe4\xb1\xe8\xdb\x4c\x48\x5f\x0f\x0e\x06\x4f\x86\xb4\x5a\xf1\xf8" + - "\x2b\xa0\x89\x37\x58\x7b\x41\xd8\x67\x7f\xe9\x62\x47\x2f\x55\x45\xf2\x05\x25\x09\x9a\x16\x39\x7a\x3c\xe8\xfc\xd2" + - "\x65\x36\x14\x8f\x50\x82\x43\x8f\xc4\x47\xf1\x06\xb9\xaf\xc7\x00\x44\x55\x56\x81\xf7\x6e\xaa\xaf\x6c\x72\x61\xaa" + - "\x1b\x13\x24\xc8\x3a\xec\x61\x86\x21\xfa\x65\xc4\x97\x22\xa1\xa1\x74\x7e\xd9\xf5\x88\x04\x3d\x0c\x08\xda\xca\x82" + - "\xc0\xe6\x29\x48\x7c\xb6\x32\x0a\x5e\x67\x2e\x3c\xe9\xa4\xfa\x0a\x13\x06\xee\x61\xca\x88\xdb\x26\xc8\x28\xe1\x0a" + - "\xf1\x03\x57\x2a\xaf\x7c\xaa\x95\xa1\x4b\x3e\xd5\x41\x47\xb7\x65\x41\x1a\x8c\x0e\x36\xe7\x34\x4d\x0b\x93\xe6\x83" + - "\x85\x9e\x96\x85\x29\x66\x15\xd6\x03\x57\x79\x7f\x65\x86\x99\x9e\x94\xb2\x5c\x0f\x17\xe6\xab\x27\x5f\x7f\xf9\xf8" + - "\xdb\xff\xf5\xf8\x9b\xff\x3c\x1d\x7c\xf3\xd5\xff\x7a\xfc\xed\x40\x9a\xe5\xcd\xfd\x7b\x44\xe8\xda\x20\xc5\x80\x4a" + - "\xf5\x15\x25\xd9\x44\xc6\x6b\x2c\x3a\x4f\xa5\x98\x97\x6a\x36\x7e\xf8\xe0\xe1\xb3\xa7\x43\xf9\xac\x73\x14\x81\x27" + - "\x48\x83\x54\xcb\xec\x02\x5f\xf1\x59\xe8\x3c\xe8\x08\x84\x04\x0f\x22\xd3\x94\xca\x02\x27\x02\x13\xc0\x6c\xa0\xed" + - "\x66\xae\x80\x63\xd8\x5c\xeb\xb4\x9a\x77\xea\xe5\xc9\x7a\x5c\xd1\x4b\x9b\xff\x7a\xfd\x43\xe4\x9a\xb0\x1b\x3d\x8a" + - "\xd2\xe5\x44\x13\xe2\x0e\xf2\x2d\xe9\x73\x30\x11\x0d\xdb\x8e\x1e\x87\x26\xcf\x30\x07\x41\x64\x2c\xc1\x27\x3f\x1b" + - "\x77\x62\xfe\x93\xb2\x67\xe6\xa4\x2e\x44\x9d\x53\x04\x10\x64\xa1\x3a\x5d\xbb\x09\x16\x8b\x83\x34\x54\x9b\xcd\x67" + - "\xee\x0d\x3a\x5a\x0f\x69\x4f\x6a\x9b\x61\xa2\xb5\xf3\xe0\x3d\x57\x43\xed\x13\x76\xd0\x7e\x64\x8b\xbb\x76\xb6\x6d" + - "\xa1\xed\xfb\x33\x77\xec\x13\xea\xf4\xd9\xa4\x46\xad\x59\xf4\x02\xa8\x7f\xce\x6e\x85\x6b\xc4\x8b\xa4\x2a\xc4\x0c" + - "\x19\xd8\x09\x65\x0a\x34\xe2\x7a\xae\xf2\xa8\x9d\xc8\x30\x6d\xe0\x47\x4f\x4f\x00\xd5\x78\xef\x5d\x82\x40\x97\xe9" + - "\x68\x0b\x30\xed\x1c\x3e\x09\x9a\x20\x3c\x5f\xc9\xec\xe8\x13\xce\xc2\x19\xa5\xa4\xba\x70\x19\xe3\xc4\x71\xdb\x51" + - "\xb0\x5e\x44\xc9\x95\xcc\xda\x12\x36\x01\xc0\x12\xae\x7f\x87\xb7\xf4\x95\xcc\x06\xe8\x3b\x83\x9c\x84\xf5\x57\x82" + - "\xa7\x94\x78\x95\x3b\x74\xa5\x56\xe3\x4d\x8a\xd2\x0f\x23\x99\xbc\xed\x26\x9c\xfa\x92\xa5\x6e\xf8\x3f\xaa\x34\x3f" + - "\x60\xae\xda\xb5\xe6\xc7\xaa\xbd\xe2\x79\xdc\xe0\xac\x33\xc2\x6c\x2b\xc1\xa3\x20\xcd\x07\x3f\x5d\x59\x23\x73\x43" + - "\xf3\xec\xdb\xb0\x64\xc5\x2d\x38\x05\xb1\x7f\x8d\x1b\xf0\xb2\x98\xfa\x26\xf8\xc4\x37\xb0\x19\x93\x43\x0d\x2d\x3d" + - "\x71\xcb\xc5\xf2\x83\xa1\x54\x54\x9b\x37\xa9\x07\xc2\x06\x47\xee\x33\x03\xf7\xa6\x7a\x27\x2f\x41\xf4\x1d\xfe\xfa" + - "\x34\x39\xbf\xde\xef\x9e\x9b\x47\xe7\xc3\xe3\x67\xc9\xf1\xe8\xe9\xf9\xf0\xfc\xf0\xd9\xa6\xfb\xc5\xb0\x1b\x0f\xa7" + - "\xcd\xa9\xad\xff\x36\xfc\x75\x70\xf6\xeb\xe8\xc1\xf9\xd9\xf9\xa0\x77\xf1\xe8\x8b\xa1\xe3\x17\xe0\x3d\x1a\x81\x7c" + - "\x32\xe2\xa9\xcc\x1c\xa2\x4a\x60\x9f\x50\x74\xe1\xa8\x10\xe0\x65\xd1\x2a\xe7\x98\xd7\x6b\x9d\xe7\xc5\xb5\xd3\x0a" + - "\x9a\x9e\xf8\x7d\x25\x33\xcc\xb8\xdb\x43\x7e\x36\x08\x2f\x72\x00\xf5\x4a\x70\xd7\xd8\x9b\x5f\x19\x83\xb8\xf1\x65" + - "\xa9\x96\x61\xef\xf5\x33\xa4\xdd\xd1\x18\x3e\x12\xef\xcd\x5c\xe7\x95\xe8\xff\x72\x70\xf8\x8d\xe0\x52\xd8\xae\x4e" + - "\x9c\x1b\x8a\x2d\x48\xfc\xbd\xf3\x33\xdc\xc5\x2a\xa2\xec\xf5\xc8\xfa\xa1\x5b\xaf\xc8\xf6\x9f\x3b\xe5\xc6\x3f\x31" + - "\xe1\xa6\xeb\xa1\x73\xbd\x0c\x41\xf1\x91\xb9\xb0\xca\xcc\x7f\x11\x15\xed\x0c\x09\xb3\xc3\x02\x66\xc8\x5b\xe0\x5d" + - "\x9b\xbf\x0d\x83\x0b\xb6\xd1\x2f\x06\x37\x34\x54\x15\x04\x53\xf8\x84\x0e\xc2\x64\x33\xff\x0c\xd4\x1c\xd0\x62\xb7" + - "\xd1\xda\x48\xa2\xcb\xa5\x56\x42\x30\x7a\x0a\x15\x4d\x33\x52\x70\xc2\x51\xec\xd9\x68\x23\x8f\xbb\xd6\x27\xc8\xb9" + - "\x31\x70\x32\x39\xbb\x1b\xbe\xe5\x0e\x13\xae\xce\x28\x2f\x2a\x2c\xe3\x8a\x0f\xb0\xca\x6b\x63\xe5\xa1\xb3\x8a\xaf" + - "\x51\xd5\x16\x07\x8e\x34\x38\xa0\x98\x56\x11\xe0\xa5\x5f\xc2\x65\x1c\xac\x8b\xc1\x5e\x38\xdf\x0b\x31\x12\x14\x06" + - "\xd4\xfa\xb9\x5d\x70\x63\x0b\x3e\x8a\xb5\x2d\x93\x64\x54\xf5\xf9\x32\xec\x80\xf9\x40\xdd\x54\x2a\x4f\x31\x07\x0a" + - "\x0c\x3f\x6a\x51\x29\x87\xd7\x1f\x19\xa6\xac\x63\xf7\x5c\x47\x6e\xdd\x30\x83\xc0\x79\xca\xa8\x6c\xc6\xad\x8e\x82" + - "\x68\x96\xba\x4a\x79\xb7\xe5\x78\xb8\x70\x5e\x18\x61\xb9\x32\xf3\xd3\x4a\x4e\x3f\x58\x22\x15\x4e\xcd\x62\x74\x23" + - "\xb9\xe0\x8e\xcd\x92\x85\x59\xd4\xda\x3c\x6d\xad\x22\xa2\x76\x53\x60\xef\x33\x4c\x94\xd5\x23\x8f\xa9\xc8\xee\xdd" + - "\x12\x99\x1d\x7b\x33\xd4\x92\x0c\x7d\x7c\x1a\xc1\xee\x87\x02\x7f\x30\x0b\x80\x6b\x5d\x09\xf8\x86\xeb\x5b\x73\x76" + - "\xd5\x2f\x5a\x4c\x00\xa2\x0b\xaf\x8b\x85\x32\xf0\xda\x3d\xac\x8d\x44\xae\x89\xb4\x75\x75\x78\xc3\x3e\x63\x28\xb8" + - "\x88\xae\xec\x84\x66\x24\x46\xc1\xcc\x4a\x55\x85\xa6\x22\xec\xc9\xfd\x3e\xae\xfd\xde\xe7\x7a\xaf\xee\xc1\x28\xb2" + - "\x2d\x79\xc5\x02\x91\x87\x5e\x50\x6a\x7b\x3b\x7e\x6e\xc1\x19\xbe\x04\xe1\x71\x2f\x8a\xc6\x3c\xbb\xe8\x51\x38\x39" + - "\xef\x18\x0e\x93\x17\xd5\x9f\x3d\x06\xa0\x4a\x38\x84\x36\x9f\x30\xc2\xee\x2e\xf7\x49\x7a\x56\xe8\xd8\xab\x56\x4f" + - "\xbc\x2b\x5f\xe8\x34\x3d\x74\x6e\xcf\x01\x2a\xa0\x45\x96\xaa\x38\x99\xb9\x5e\x82\xc0\x84\x96\x0a\x1c\x86\xf4\xc7" + - "\xb6\x5b\x53\x88\x2f\x92\xce\x72\x44\x79\x3c\xbb\x03\x6d\xe0\x17\xa6\xe2\xec\x8a\x6b\xcc\x14\x12\x60\x3f\xb2\x1e" + - "\x12\xa4\x72\x2e\x99\x70\x5d\x88\xce\x92\xaa\x21\xec\xb4\xda\x8d\x82\xc2\xd5\x11\xbf\xd5\xa2\x83\xa6\x13\xd5\x3c" + - "\xee\x96\xc1\xad\xc1\x18\x1f\xe2\x5e\xc2\x5f\xdd\x40\x6d\x7d\xeb\x34\x02\x0d\x25\x0c\xe3\xb4\x28\x26\xef\xd5\xb4" + - "\x72\x4d\x9e\x8b\xa9\xca\xab\x52\x66\xa2\x54\x33\x55\xaa\xa0\xce\x3e\x9a\x77\x78\x52\x56\x1b\xd1\x65\x8e\xae\x28" + - "\x2a\x7a\xd3\xb3\x3a\xc6\xe7\xb6\xde\xea\xb5\x5c\x7b\xe3\x38\x40\x0d\x05\x4a\x82\x86\xb1\xaa\x44\x57\xc6\xeb\x81" + - "\x4e\x45\x71\xa5\x4a\xf1\xb4\x92\x97\xcf\xbc\x52\xf1\xbf\x4e\x4f\xc5\x95\x96\x22\x4a\x51\x2f\x92\x07\xdf\x7e\xf5" + - "\xf8\xb0\xcb\x3a\x97\xaa\xd4\xd3\x8a\xba\x2f\xd5\xb4\xb8\xcc\x11\x33\x44\xf2\xe0\xf0\xf0\xf1\xb7\x07\x23\xf2\x50" + - "\xa5\x0a\xa3\xb8\x67\x4f\x51\xf9\xf2\xfb\x4a\x4f\x3f\xbc\xa2\xdb\x71\xf8\x6b\x72\x3c\x3a\x37\x8f\x92\xa7\x67\xe7" + - "\xd7\xe7\xbf\x5c\xec\x3f\xeb\x9e\xfd\xfa\xec\xe2\xd1\xe6\x41\x72\x76\x7e\xdd\xbf\x78\xd4\xed\x7e\x31\xa4\x25\xea" + - "\x5c\x07\xac\xf2\x2c\x1f\xf0\x83\x3b\x8c\x92\xe1\x55\x82\x17\x1d\xdd\xe8\xde\x2a\xfd\x1f\xcf\xdf\xbc\xfc\xe1\xd5" + - "\x08\xf0\xb0\xd3\xed\x89\x2f\x12\x90\x64\xf0\x0f\x57\xb8\x1c\x7f\xd1\xb9\xf5\x82\xd8\xb6\x42\x2c\x7c\xf9\x84\x84" + - "\x93\x44\xbf\xfa\x1e\xb4\xdf\x4d\x6d\xac\x9b\x75\xdf\xa2\x26\xb6\x2a\x63\xe7\x69\x64\x0d\xf5\x6e\x17\x83\x30\xf9" + - "\x2c\x35\x7d\x16\x35\x75\x26\xbe\x31\xd6\x7e\xf6\xf6\x8a\xe7\xa4\xa5\xa4\xd2\x6b\x34\x51\xfb\x43\x96\x64\x86\x54" + - "\x39\x57\x70\x7b\xfa\x0c\xbd\x52\x71\x51\x68\x9f\xfc\xa0\x97\x7c\xce\x2f\xd5\x0d\xa1\x1e\x75\x6c\x4d\xb4\x67\x1c" + - "\xae\xe1\xf7\x08\xbd\x79\x9d\x05\x27\xf6\x72\xb0\x5f\x79\x5c\xb1\xf9\xdb\x62\xaf\x8d\xd0\x37\x88\x2a\x0f\xcd\xab" + - "\x45\x26\x8a\x12\xb3\xbb\x0b\xb3\x22\xd7\x59\x67\x36\x35\xc2\x4b\xb3\x70\x32\x1e\xb0\xbf\x6a\x90\x40\x70\x6f\x8f" + - "\xbd\xf2\xce\x0e\xd1\x25\xcd\xda\xff\x22\x43\x47\x84\x3a\x30\x64\x57\xf4\x9f\x89\x2f\x12\xf4\x64\xec\x06\x06\x1c" + - "\xd7\x93\xbf\xd2\x1b\xf6\x3b\x4c\x71\x2e\xf3\x29\xa0\x02\xd3\x88\x63\xfb\x0e\xf6\x7b\x14\x38\x1d\x7b\x3b\x8b\x99" + - "\x96\x7a\x59\x91\x7f\xb5\x25\x8f\x98\xa7\x06\x15\x9a\x55\x60\x90\xc1\x24\xed\x48\xb1\xb3\xb5\xc8\xd8\x92\x4c\x89" + - "\xd7\x26\xe4\xfa\x79\x8d\x46\x03\xcc\xb5\x86\x5b\xea\xcc\x0f\x58\x2a\x87\xbb\xe2\x83\xb7\x50\xe5\xa5\x4a\x04\xdd" + - "\x3d\xfc\xcc\x7d\xe9\xa2\x40\xec\xba\x5d\xcd\x28\xbb\xd6\x36\xc3\xb0\x5b\xed\xa0\xb8\xce\x55\x69\x55\xb1\x61\xbc" + - "\xd5\xc8\xa9\x63\x5d\x8f\xb0\x6a\xfe\x3b\xa8\x9e\xd5\xb2\x37\x3d\x74\x6b\x36\xdd\x90\x09\xf3\x92\x34\xdf\x06\xc1" + - "\x46\xed\xed\x79\xe9\xf4\x6d\x26\x75\xfe\x23\x52\xec\x80\xa5\x09\x19\x34\x62\xb8\x08\x77\x74\x5e\xa7\x3c\x76\x46" + - "\x6f\xbd\x63\x75\x31\x73\x8d\xa8\x3e\x63\x96\xa9\x54\x48\x23\x16\xaa\x9a\x17\x29\x1a\x07\xac\x0f\xee\xfd\xc8\x5f" + - "\xb2\x45\x66\x86\x6d\x38\xe3\xd1\x2f\x6a\x6e\xcb\x3b\xd1\x4b\x37\xfd\xa0\x79\x2d\x1f\xd1\x60\x30\x40\xaf\x05\x97" + - "\x1a\x00\xf3\x7a\x99\x20\x95\xbe\x6b\xdd\xc8\x9f\x84\x83\xa1\xb6\x33\xb1\xa4\xb6\x75\xbc\x9d\xd8\x2d\xb3\xc5\x3f" + - "\x33\x26\xa5\x2d\xe7\xed\x81\x4e\x79\x2f\x6b\xb3\x60\xc1\xcc\x29\xee\x2f\x55\xc5\x5a\xfb\xef\xd6\x27\xa9\xdd\xe3" + - "\xc7\x17\x35\x6c\xa1\x34\x6b\x81\xed\x09\x2e\x4f\x9c\x32\x6a\x0a\xbf\xcb\xe4\xf4\xc3\x44\x95\xe5\x5a\x7c\x39\xf8" + - "\xda\xda\x14\xfc\xe7\x64\xd8\x40\x4a\xc9\x9e\xfa\x59\x91\x5f\x62\x9e\x0c\xb2\xb8\x58\x74\x7e\xf0\xf5\xb7\x5f\x3f" + - "\x09\x91\x10\xe7\x6b\xe5\xbc\xb6\xfa\x11\x7c\x7e\x01\xfb\xc2\xa2\x4e\x3e\x8e\x00\x23\xe4\xe1\x4d\x8d\xb7\x08\xb6" + - "\xc4\x0a\x95\x36\xc1\xb5\xc5\x8b\x46\x45\x33\xbf\x03\xf8\x9d\x27\x53\x76\x01\x47\xe1\xeb\x2d\x6e\x5a\xcd\x0d\xdc" + - "\x89\xa9\xb4\xdf\x46\x12\x38\xbf\xc0\x5a\xbf\xdd\xfb\x75\xbf\x07\xe7\x76\xe1\x89\xc0\xe0\xfd\xef\xb8\xc8\xba\x23" + - "\x86\x3f\x98\x9b\x4d\xc0\x18\xb5\x48\x1e\x47\xdb\xe7\x61\xa9\xbc\x7d\x9f\x5c\xcf\x35\x9c\x68\x43\x89\x2c\xd5\xef" + - "\x2b\x7d\x25\x33\x54\x8f\x15\xf0\x95\x8b\xe6\xc4\x31\xa0\x8f\x6e\xcb\x3d\x16\xf2\xef\xd3\x82\x2b\x59\x80\x90\xbe" + - "\x5d\x3a\x8a\xee\xb5\x68\xa2\x2f\x7f\x7c\xcd\xe8\x8c\x43\x85\xd0\x72\x97\x7b\x5d\x1f\x55\xdf\x4b\xbf\xf5\xf1\xae" + - "\xb5\xa2\x4a\xf3\x24\x46\xf3\xb1\x8c\x57\x97\xdf\x9c\x5a\x8f\x25\x20\x89\x0e\xeb\x4b\x25\xd3\x75\x7d\xbe\x2d\x94" + - "\x2c\x60\xa9\xea\x4c\x15\x71\x49\x7e\x67\x07\xd8\x27\x49\xf2\x8e\x4f\xeb\x58\x2e\xbe\xde\xae\x8d\x9f\x1f\x0e\xc5" + - "\x2b\x36\xc3\x87\x95\xd6\xf4\x8c\xa6\xdb\x7a\x01\x1a\xa7\x61\xb1\xf8\x15\x72\x7a\xf1\x36\x44\xda\x06\x37\xc5\x78" + - "\x53\x5a\xbd\x73\x9a\x9b\xe2\xf7\xce\xb5\x0a\x63\x90\x78\xf8\x58\x83\x06\xcc\x0f\xfa\xfe\x85\x3c\x31\xe9\x16\x50" + - "\x48\xb1\x3a\xdf\xbf\x82\xf0\x46\x99\x5c\x75\x15\xba\x4a\x3a\x82\xe2\x73\x69\xa3\xd3\x8a\xac\x90\xae\x01\xbb\x52" + - "\x69\xf6\xdc\x84\x6f\xa3\x9c\xdb\x8e\x43\x6f\x31\x45\x37\x64\x9d\xfb\xf7\x82\x13\x3b\x76\x1a\x17\x87\x3e\x56\x98" + - "\x42\xa1\x87\x68\xa4\x59\x96\xea\xca\xca\x0e\xfc\x68\x03\xcf\x92\xe3\xd1\xcf\x79\xa5\xb3\xcd\xf3\x2c\xeb\x76\x41" + - "\x6c\x80\x8d\xb6\xd7\xea\xe5\x4a\x96\x32\xaf\x38\xdb\xc5\xb2\x2c\xd2\xd5\x14\xc4\x32\x36\x0b\xc0\x5d\x87\xf4\x1e" + - "\xd9\x5d\x74\xca\x28\x8b\x45\xf4\xfe\xfe\xbd\x1d\xdf\x89\x0b\x59\xc3\x2d\xb5\xd5\x64\x38\x31\xfa\x7d\xeb\x2a\x91" + - "\x57\x26\x78\x94\x63\x85\x1c\xf7\x13\xe6\x4c\x3f\xdd\xa6\x38\x43\x80\x53\x93\xa5\xba\xac\x97\x12\xe9\xc1\x05\xd0" + - "\x13\x2b\x58\x6b\x43\xc4\x89\x02\x0a\xab\x72\x95\x63\x8d\xe1\x31\xb7\x8e\xf0\x91\x0f\xf5\x9d\xa9\x29\x1b\x6a\xc8" + - "\x5d\xf4\xe2\x8b\x84\x93\x36\x3d\x65\x1c\xcd\xe5\xe6\xe1\x78\x2b\xab\x4c\x04\xa9\xdf\xad\xc4\x5f\x7c\x4d\xa7\x9a" + - "\x9d\xed\x01\x3e\xce\xdf\x26\x4e\x2f\x98\x1e\xf9\x6a\xb4\xec\x8a\x12\x42\x32\xef\x45\xfa\xcc\x3a\x00\x8f\x42\x7d" + - "\xda\x91\xc8\x8f\x44\x2e\xc6\x22\x6f\x2d\xfd\x43\xaa\xdf\x3a\x08\xf6\xf6\x44\x8e\xe0\x8a\xc3\xd7\xe2\x75\xe4\x6d" + - "\x4e\xdb\x2d\xcb\x70\x7a\x85\x56\x5d\xea\x5c\x46\x4a\x1e\xaa\x4d\x17\xe5\x30\xc3\x27\x26\x38\x61\xf4\xc4\x92\x05" + - "\xd6\xb3\xc2\x0d\x41\x2d\xe3\xc8\xc9\xf0\x1e\xdb\xa6\x01\xbd\xab\x06\x48\x5b\x84\x5f\x43\x0f\x4a\x22\x05\x8f\x8f" + - "\x0e\xf4\xcd\x7c\x8c\x81\x1e\x34\xf4\xb5\xea\x06\x5b\xcd\xf9\x81\xdb\x94\x5e\xa6\x55\x33\x30\x5d\x71\x58\xaf\xcf" + - "\x41\x48\x90\xa8\xeb\x9b\x9b\xe7\x6b\x59\xa0\xbf\xf0\x1d\xda\x25\x43\x9e\x4c\x35\x49\xdf\xc4\x6a\xe8\x2d\xfa\xa7" + - "\x60\xba\xd0\x45\x78\x1b\xb8\x9b\xec\xa0\x86\xa7\x2d\xe0\xa6\x57\xd3\x95\xd5\x93\x9e\xe9\x8b\x23\xfc\x09\xb2\xd8" + - "\x8a\xee\x28\x7b\xa5\x70\xb3\xe9\xaa\x6c\x65\x48\xbd\x4f\x13\x4a\xfc\x8e\x4a\xcf\x4a\x79\x19\xa4\x41\x25\xcf\xd5" + - "\x55\x19\x16\xc2\x3a\xc4\x03\x91\x00\xc4\xac\x1d\x79\x59\x18\x2a\xf4\x98\x4c\x57\x25\x27\xf1\x89\xf2\x94\x51\x02" + - "\xff\x25\x16\xb4\x2f\xf2\x7e\xe8\xb7\x4e\xd6\x55\x2b\x52\x87\x43\xd9\xc3\x67\xb9\xdd\xbb\x8c\x25\xb0\xf5\x1e\xdc" + - "\x35\x67\xc6\xf8\xa0\x02\x60\x9c\x00\xb3\xdd\xe7\xaf\x7e\x5a\x02\xad\xed\xa2\x1e\x42\xd5\xa2\xe8\xb6\x28\xd6\x15" + - "\x23\xff\x77\x80\xdc\xe4\x51\xa5\xca\x85\xce\xe9\xe6\xb6\xea\x58\x10\x2b\x83\x52\xb7\xd7\xba\x9a\xeb\x9c\x3e\xa8" + - "\xe6\x3e\xf5\x53\x2d\x02\x00\xd5\x6a\xa9\xba\x69\x2f\x56\xc5\x7c\xdd\x9b\xc2\x15\x54\xe9\x89\x30\x57\x0b\x7a\xc3" + - "\x20\x96\x38\x0e\x68\xb7\xdd\xb0\x49\x92\xe8\x81\xb8\x40\xd7\x3f\xfb\x23\x46\xb1\x63\x4b\x5e\x4a\x53\x25\xdd\x01" + - "\x5c\x8e\xcf\xb3\x2c\x71\x55\x8a\x47\x2e\xf7\x8b\x9b\x99\x9b\x45\x58\xbd\x37\xd4\xac\x39\x83\xea\x36\x8b\x4f\x6c" + - "\x3c\x8c\xaf\xa6\x5e\x30\xed\xba\x39\xe4\x87\x62\x6a\x43\x23\xc3\x1d\x20\x0f\x3b\xa3\x4b\x1f\x3d\x1a\x20\x44\x3c" + - "\x58\x53\xc9\xae\x81\x5b\x9e\x2a\x7d\xa5\x4c\x5d\x5d\xdc\xe3\x0c\x6a\xa5\x71\x09\x81\x80\x49\x5d\x19\x4e\xcb\x85" + - "\x57\x30\xcb\x47\xc7\x7c\x83\x1f\xa0\xd1\x0f\xfe\x86\x26\x21\x16\xc9\xb4\xd5\xf2\xd6\xa0\x8e\xed\x88\x7c\x3f\xb0" + - "\x22\x31\xde\x86\xf4\x2b\xd4\x10\x81\x08\x9e\x74\x7b\x0d\x43\x5a\x38\x12\xc9\x4d\xdd\x96\x39\x7e\x27\xa7\x1f\x3e" + - "\xd5\x3a\x22\xd3\x50\x8a\x72\xc9\x02\x3c\x1f\x0d\xf8\x44\x8a\x1c\x31\x12\xb5\x27\xf6\x4e\x73\x31\x21\x7e\x32\xee" + - "\xde\xf5\x29\x57\xe9\xf2\x47\x8a\x80\x9c\x18\x4f\xc7\xb1\x51\x8e\x84\x9e\xa5\xba\x24\x16\x2a\x22\x50\xbb\x96\x41" + - "\x0a\x63\x9a\x56\x65\xcd\x26\xad\xe4\x94\x6a\x45\xd0\x21\xd9\x56\x4e\x0e\x2e\x30\x6a\xd1\xac\x7c\x1b\xda\xb6\xb8" + - "\xcd\xde\x1e\xff\x55\x9b\x0e\x90\x22\x6e\x32\xb2\x0e\x4c\x64\x3e\x62\x06\x7b\xdb\xf8\xb1\xe0\x91\x6a\x67\x80\x0e" + - "\x93\xff\x07\xd6\x28\xee\x0e\xf9\xf4\x26\x5f\xab\x6b\x5c\xed\x27\xf5\xee\xbe\xf1\x56\x35\xe4\xb3\xef\x9c\xb0\xdb" + - "\x45\xee\x2f\x60\xeb\xa2\xe9\x22\x8b\xfe\x59\x3d\xd9\xd4\xe0\x2d\xbd\xc1\x20\xcf\xb3\xc6\xba\x3f\xbe\xda\x3b\x66" + - "\xf7\x4f\xf5\xf7\x91\x39\xfe\xcb\xbb\x13\xce\xb7\xb9\x3d\x30\xfa\xbf\x8e\x00\xb5\x25\x34\x87\xe1\x8d\xf9\x44\xd4" + - "\x75\xdb\xd8\xac\xe7\xba\xd9\x88\x3f\x6e\x51\x55\x63\x5d\x29\x7b\x81\xfc\x81\x63\x79\xf9\xef\xb3\xc6\x52\x71\xa9" + - "\xd1\xb0\x43\x27\x3d\xde\xd9\x21\x76\xc0\x6d\x43\xbd\x79\x4c\x8a\xcf\x2e\x7a\xdc\x12\x46\x79\x83\x0a\x4b\x47\xde" + - "\x42\x07\x0f\xf2\x42\x9c\xe5\x3c\x8a\x93\x35\xbc\x7f\x61\xd0\x18\xe1\xdd\x6b\xf5\xdb\xf0\x9c\xb2\xd3\x48\x2c\x2d" + - "\x83\x3f\xcb\xc3\xad\x72\x37\x36\xba\x2b\x72\x74\x52\xff\x2b\x76\xd8\xe9\x20\x9a\xf8\x5b\x3b\xd0\x99\x60\x17\x5b" + - "\x35\x30\xc8\x67\x7c\x8a\x75\xad\x31\x53\xeb\xb2\x54\x0f\x7f\x4d\x5b\xf4\x3d\xa1\xd6\xec\x59\x20\xf4\x62\x76\x85" + - "\xff\x8f\xbc\x7f\xef\x6e\xdb\xb8\xf6\xc7\xe1\xbf\x95\xb5\xfc\x1e\x46\x70\x8f\x4c\x5a\x14\x29\xd9\xce\x8d\xb2\xa2" + - "\xc7\xb1\x9d\xc6\xdf\xc6\x76\x4e\xe4\x36\xed\x23\xab\xee\x88\x18\x92\x88\x40\x80\x05\x40\x51\x4a\xe4\xf7\xfe\x5b" + - "\xb3\x2f\x33\x7b\x06\xa0\xe4\xb4\x3d\x67\xfd\x2e\xab\xab\x31\x05\x0c\xe6\x3e\x7b\xf6\xf5\xb3\x17\xe5\xa5\xf4\xf9" + - "\xf7\x82\xe2\x76\xac\x44\x70\xb3\xeb\xb1\x22\x36\x70\x85\x2d\xa3\xd7\x4f\xe6\xd2\x54\xb5\x51\x25\x04\x29\x00\xd8" + - "\x18\x12\xd8\x87\x60\x97\xb3\x87\x64\x2f\x35\x55\x76\x09\x86\x7a\xd1\x09\xa9\x4b\x21\x91\x05\xfd\x3e\xdb\x82\x6a" + - "\x85\x6d\xf4\x36\x0b\xaa\x1b\x38\x5d\xaf\x6d\x82\x3b\x14\x1d\x1f\xcb\x66\x3d\xcf\x40\x23\xd1\x1b\xbd\x3f\xd9\x1d" + - "\xcd\xbc\xab\x22\x99\x94\x01\x30\x4c\xd1\x5d\xcd\x49\x98\xa7\x65\xb5\x80\x00\xf0\xc9\xdc\x60\x55\xf4\x86\x33\x56" + - "\xfc\xe6\xb4\x5a\xcf\xcb\xe2\xd2\x54\x0d\xd5\xb5\x87\x5f\x36\x26\x15\x09\x9d\x5d\xfd\xf2\x6d\x61\xd9\xae\x22\x55" + - "\x88\xf2\x9a\x15\xdc\x98\xc7\xbe\x87\x40\x80\xb7\x58\x4b\xcf\x55\xe7\x3d\xc3\x90\x57\x53\x47\x41\xdf\x4e\x5d\xc1" + - "\x33\xee\xe6\x96\xbc\xe3\xf9\x35\x0a\x27\x3d\x31\x45\x7d\xe7\x36\xe2\xce\xdc\x87\x81\x9a\xe6\xda\x69\x1e\xb0\xc1" + - "\x53\x7c\x66\xab\x67\xf9\xf8\xa3\x74\x03\xc7\x52\xce\x75\x1a\xc3\xa5\x9f\xc3\x60\x94\x06\x03\x14\x80\x15\xe7\x59" + - "\xdd\xa8\x15\x61\xf1\x1a\xe5\x22\x26\x14\x44\x13\x5b\xa9\xa3\x1e\xdb\x4f\xed\xff\xb7\xa8\xd3\x63\x2b\x74\xe0\x6f" + - "\x9d\x63\x0d\xf6\xc8\x2d\xf5\xc4\xec\xd5\xc6\x7e\x28\x27\x1e\x63\xb0\xb3\x3c\x57\x93\xb9\x2e\x66\x46\xcd\xcb\x35" + - "\xd4\x66\x79\x34\x13\xf5\xe4\xdc\xcc\xb5\xe5\x84\xc1\xed\x63\x61\x97\xa4\xa9\x74\xca\x80\x7d\x58\xa5\x33\x78\x60" + - "\xaf\xd4\xb7\xd7\x2e\xc0\x25\x1e\x18\x34\xab\x27\x8d\xca\xb3\x0b\x03\xa2\x12\xc4\x66\x84\x85\xec\xf2\x23\xc6\x00" + - "\x54\x97\x4c\x2d\x27\x9f\x78\x38\x8d\x26\x5b\x98\x7a\xe8\x9a\xfb\x91\xa1\x72\x78\x36\xfc\xf4\x14\x13\x33\xde\xda" + - "\xda\x82\x56\x11\xce\x53\xb5\x87\x68\x9b\x82\x18\xe1\x73\xe0\xed\x61\x13\x4e\x8c\xea\x61\x17\xd5\x0b\x33\x35\x55" + - "\x65\xd2\xbe\xab\x76\x61\x16\x65\x75\xed\x2a\x46\x9c\x5e\x40\x05\x2a\xa7\x3e\x27\x09\x81\x98\x68\xb0\xd6\xdb\xc9" + - "\xc6\xd4\x41\xd7\xbe\x75\x9d\xa6\x18\x95\x0e\xd2\xac\x9e\x02\xca\xfb\xdc\x60\xaf\xe6\xba\x56\xe7\xc6\x14\xd4\x25" + - "\x88\xf4\x54\x7a\xad\xaf\xc9\xf1\xc6\x96\xb3\x14\xad\x51\x09\xf4\x27\xfb\xd5\xa4\x89\xab\x8c\xb3\x09\x6f\x1c\x03" + - "\x12\xb5\x78\x72\xc4\x72\xc9\x59\x81\x8e\xd2\xac\x14\xa5\x27\xa7\x6c\x5c\xb3\x1d\xf6\x55\xd7\x4d\xb9\x7c\x5b\x7c" + - "\xa7\xf3\xda\x8c\xb7\x20\xc2\xa6\x5a\x2d\x71\x8d\xc1\x9d\x01\xf4\xbb\xa2\x25\x8e\x0f\x22\x57\x1e\xac\x65\xe4\x58" + - "\xf0\xe7\x54\xae\x0e\xae\xbd\xe0\xd8\x73\x78\x1f\x52\x1c\x47\xac\xaa\x72\xd1\x26\x3f\x5d\x44\x27\x9b\x02\xb4\x0e" + - "\x87\xf8\xf5\xd6\x86\xfc\x76\x98\xfc\xa0\xcc\x67\x05\x12\xae\xdc\x45\xc9\xbb\x07\x2d\x55\x52\x6f\x23\x01\xba\xb9" + - "\xd9\x4c\xc5\xfa\x81\x77\x28\x69\x17\xd5\x6f\x1f\x07\xbe\x0c\x5e\xd8\x96\xd4\x59\x19\x58\xd7\x0d\xec\x11\xdc\x70" + - "\xaa\x37\x25\x54\xfc\x69\x59\xcd\x4c\x83\xb1\x75\x76\x81\x08\x93\x16\xf6\xee\x80\x04\xe8\xef\x2c\xc5\x6a\x4a\x75" + - "\x51\x94\x6b\x3b\x0b\x78\x46\x75\xad\x74\x8e\x26\x18\xd8\x7c\xa0\xd9\xb2\x3f\x6e\xfd\x2c\xab\xad\xfc\x64\xaf\xb3" + - "\x1c\xbe\xa3\x40\x64\xfc\xe5\xbe\x04\xd9\xd9\x2d\x7d\x53\x62\xd7\x7b\x80\x25\x92\x11\x3e\x8a\xdd\x74\xd7\x76\xd3" + - "\x71\x6e\x4a\xf3\x73\xd6\xcc\xfb\xbe\xb6\x93\x46\x57\x0d\x57\xf9\xb2\x48\x59\xe8\xcf\xcb\x72\x89\xdb\x2b\x6e\xff" + - "\x07\xaf\x40\x04\x53\x48\x6a\xae\xc0\x05\x20\xea\xb0\xef\x59\xcf\x45\x6e\x9e\x5f\xab\x0a\xd9\x08\xb7\x4d\x44\x57" + - "\xa0\x2a\xae\xf7\x19\x82\x14\x05\xe4\xc5\xbe\x82\xf9\x71\xfa\x4a\xb8\x60\x89\x5a\xc0\xe8\x6d\x79\x84\x0f\xab\xcc" + - "\xd2\x68\xb1\x64\xb6\x78\x0d\x65\x8f\xd4\x36\xdf\x50\x70\x0e\x3d\x8a\x21\xce\xaa\x27\x6a\x35\x2f\x57\x70\x5e\x20" + - "\x1d\x98\x63\xb7\x60\x13\xf8\x1b\x72\x48\x0f\x76\x76\xa0\x1c\xa9\x8e\x81\xee\x1c\x09\x65\xaf\x18\x31\x44\x43\xbb" + - "\xa5\x00\xe8\x3f\x59\x06\x9f\x1e\x85\x0f\x7f\x60\xc3\xa6\x1d\x5a\x00\x59\x4e\x93\x1f\xb4\x45\x9a\x54\x98\xba\x9d" + - "\x1d\x25\xdb\x7e\xaa\x64\x85\x87\xf2\x5d\x4b\xbf\x6d\xbf\x3f\x0d\xbe\x76\xc8\xb5\x76\xa8\xa0\x9f\x19\xd0\xcf\x03" + - "\x60\xfe\xec\x41\x06\x52\x04\x69\xb4\x68\x82\x04\x4d\x93\x88\x60\x3c\x8f\x98\xa0\x48\x01\x9a\x1f\xdc\x00\xa0\x8e" + - "\x5d\x55\x80\x04\x89\xcb\x8b\x57\xba\x4e\xd3\xdb\x95\x97\x7e\x2e\x44\xd2\x23\x37\x92\x68\x70\xb8\x35\x22\xcf\x66" + - "\x78\x38\x8c\xf2\x6b\xd3\x7a\xf2\x5b\x42\x1c\x68\x63\xb3\x09\xeb\x30\x0d\xce\xd7\xe0\x76\xf1\xe1\xbd\x2e\xbf\x8f" + - "\xda\xe4\xd3\x21\xc5\x60\xf5\xba\x92\x1b\x44\xa7\xc4\xd3\x75\xef\x2f\x41\xde\xe3\x8e\x7f\x7f\x66\x69\x80\x3f\x4f" + - "\xc0\x84\xf8\xfc\xf3\x70\x82\x5d\x2d\xe4\x83\xc1\x67\x2e\x52\xaf\xb5\x77\x45\x88\xc3\x06\x84\x09\x22\xe2\x6b\x4d" + - "\xe6\x58\x22\x0e\x94\x6e\x93\x8a\x5a\xaa\x5b\xd3\xee\x6e\xed\xe3\xad\xad\x9e\xcc\xf2\xd8\x53\xba\x9a\x05\x09\xe2" + - "\x02\x8e\xd3\xbe\x8c\xb8\x4a\x5d\xcd\x02\xe7\x21\x30\x1a\x05\xf6\x5c\xfb\x57\x0f\xcb\x79\x3f\x1e\xa7\x6c\x8d\xa1" + - "\x5a\x02\x47\x24\x14\x7b\x78\x47\x93\x41\x95\x32\xbd\x4c\x87\x73\x5d\x53\xbd\xe1\x57\xb0\xec\xa4\x7d\x8f\x9a\xf5" + - "\xfe\x43\xc1\xc6\xb1\xa5\x76\x76\xec\x3f\x12\x19\x80\x95\x5c\x2d\xd9\xcf\x7b\xd8\xd4\x4b\xcb\xb7\x3b\xd8\x29\x07" + - "\x46\x80\x8b\xd9\x6a\xde\x7b\x2f\xf9\x6d\xdc\xef\x39\x2d\xb9\x80\x1e\x00\x23\x86\x5d\xdb\x82\xec\xce\xf6\x6e\x91" + - "\x8c\x20\xef\x1e\x5f\x9e\x17\x9f\x8e\xe3\xb9\x95\x0a\x8e\xe5\x31\xa3\x17\xe1\x01\xbb\x95\xca\x21\x62\xac\x65\xde" + - "\xe8\x12\xf6\x69\x5a\x8b\xd2\xb5\xd4\xcc\x4d\xe1\x8b\xdb\xfd\x88\x31\xd5\xc0\x3e\x7a\x2e\x90\x07\x7c\xdb\x81\x8d" + - "\x88\x31\x6c\xdb\xc3\x90\x1c\xf0\x37\x9d\x51\x0d\x6d\x1f\x22\x3c\xc3\x42\xb2\x16\x87\x13\xa1\xf0\xe5\x09\xc4\x6b" + - "\xf3\x53\x0f\x61\x7c\x36\x56\xad\xc0\xa3\xf6\x01\x01\x6b\xa7\xa5\xea\x6e\x58\x4e\xff\x4b\x66\x09\x77\x70\xb2\x82" + - "\x7c\x31\x74\x35\x1b\x40\xdb\x03\x2a\xd2\x57\x32\x75\x85\xdc\xf5\x0e\xfe\x02\x2e\x79\x09\x81\x21\x9d\x8a\x69\xe1" + - "\x32\xcc\x49\x1f\x1e\xca\xf6\x2e\xa1\x17\xd8\xf4\xd3\xa3\xe0\x2a\x8b\x4e\x9e\x7c\xe5\x11\x3c\x83\x73\xd7\x59\xd9" + - "\x2b\x1a\x56\xbb\x2e\x78\xb3\xa1\xaa\xb6\x33\x60\x48\xc4\x6f\xdb\x0d\xe8\xbc\x97\x4d\x95\x56\xb3\xec\xd2\x14\x7e" + - "\x57\x40\x36\x19\xb7\x2d\x86\xf7\xbc\x9d\xa5\xf0\x06\x2d\x5b\x0a\xbe\x73\x96\xad\xf5\xdc\xc0\xdd\x89\x98\xa3\x5e" + - "\x22\xf2\x07\x56\x37\x08\x4a\x80\x55\x46\xa6\x77\xa7\x3b\x13\x39\x04\x0b\x6f\xe7\x73\x7b\x61\x5a\x0c\x78\x1b\xa2" + - "\xdd\x53\x6d\x6f\xf7\x1c\xcf\x21\x4e\xb0\x53\xfa\xb4\x0e\x40\x9e\x8b\x4e\xb5\xcf\x00\xa0\xaf\x74\x1d\x81\xf8\x36" + - "\x8d\xa8\x07\x63\x94\xde\x32\xe9\xdf\xf3\x45\x05\x55\xa5\xa5\x9d\x29\x80\x02\xd6\xc5\xb5\x95\xd4\xa1\x1c\x5d\xc8" + - "\xb7\xf4\x80\xf9\x4b\xc7\xcc\x48\xcf\x94\x3b\xba\xf0\xaa\x56\x59\xa3\x38\xf0\xfa\x58\xb6\xd8\x79\xf9\x72\x9c\x8b" + - "\x6d\x3a\xae\xeb\x87\xd2\x0a\x04\x3c\x9c\xac\x50\x59\xe3\x24\x0a\xdb\xc9\x06\x07\x94\x97\x81\x39\xca\x03\xf8\xd1" + - "\x30\xe2\xde\x13\x0e\x61\x4c\x1b\x6f\xe1\x56\xee\x1e\xb0\xed\x03\x0f\x17\x7f\xdf\x36\x58\xe8\x59\xeb\xc4\x80\x36" + - "\x20\xd8\x3c\x4e\xae\xa7\x23\xc4\xee\xc9\x45\xea\xc9\xa1\xe3\xcc\xed\x3d\x22\x77\xbc\x03\x80\x0b\x59\x0e\x4f\x68" + - "\x21\x7f\xc6\x36\x32\xf5\x37\x37\x8e\x75\xf4\x33\x02\x1f\x1e\xe1\xf7\x8c\xb9\x26\x5f\x9c\x86\x6d\xa0\x96\x58\x1d" + - "\x8b\x3f\x7a\x7d\x35\xc6\xef\xcf\x0e\x6f\xbf\x2a\x91\x0b\x75\x4c\x85\xb8\xaa\x63\x97\x66\xbc\xa6\xa2\x32\x9f\x4c" + - "\x96\x78\x92\xc3\xbb\x3e\x9a\xe8\xf6\xe4\x76\xee\x2f\xbb\x61\x78\xe6\x59\x8b\xde\xe6\x35\x6e\xe9\xcd\x3b\x2f\x30" + - "\x87\xfd\xc1\x5c\x77\x24\x71\x83\xce\x87\xdd\xd1\x2d\xf3\x69\xe5\xfb\xb2\xa0\x94\xff\xb0\x7e\xb7\x6d\x36\x5c\x61" + - "\xa9\x23\x0e\xb0\x4f\xed\x28\x5c\x40\x68\x87\xa3\xdb\xbd\xcf\xb6\x58\x57\x14\xd0\xd3\x55\x31\x09\x1c\x99\x56\xcb" + - "\x1c\x50\x6f\x4e\xb1\xf5\xd1\x48\x69\x28\x3a\x00\xd6\xca\x6e\x38\x53\x98\x6a\xe0\x7e\xd1\x85\x8b\x29\xb9\xfc\x61" + - "\xde\x3a\x55\x49\x65\xea\x32\xbf\x04\xdc\x8c\xb4\x2c\xec\xbf\xb1\xe2\xa7\x97\x80\xc8\x8b\x67\x38\xe9\x0f\xdc\x37" + - "\x69\xa2\x38\xb6\x01\x2a\xb2\x62\x84\xad\x67\xaa\xb3\xfc\x13\xeb\xb1\x9f\x44\xf5\x14\x65\x93\x4d\xaf\x13\xb0\x6e" + - "\x95\xb3\xca\xd4\x75\x67\x5d\x5c\x8d\x3a\x83\x2f\x39\xfe\xb5\x41\x47\xbf\x64\x69\x00\x5f\x27\xe1\x3c\x94\xe5\x22" + - "\xab\x9d\xa3\x22\x95\xeb\x5a\x48\xb7\x52\x0d\xc2\x08\x6d\xf9\x3d\xb4\x85\x69\x06\x3a\xbf\x4a\x69\xd5\x86\x76\x0e" + - "\x03\x26\x78\x68\x67\xa3\x93\x2d\xee\x70\x11\xa7\x86\x2c\x13\x2a\xd7\x7f\xf4\x50\x4d\x8b\x17\x65\x01\x66\xa9\xef" + - "\x74\x96\xdb\x7f\x7f\xa4\xd9\xf1\x28\xb6\xcc\x92\x4d\x0b\xa2\x24\xd8\x62\xd4\x1e\x4d\x25\xef\x33\x01\xf2\x51\x98" + - "\x35\x3c\xdd\x28\x32\xe1\xbe\x93\x3c\x61\x36\xc0\x87\x2d\xb1\x69\x5a\x08\xde\x4f\x78\x38\x4f\x31\x19\x09\x85\x98" + - "\xf0\x5f\x01\x5f\xc7\x73\x79\x0a\x79\xa0\xd5\x0d\xa6\x81\xbe\x51\xbc\x1d\xd4\x19\x22\x30\x94\xd5\x5a\x57\x80\x1f" + - "\xa7\x19\x1e\xb7\x74\x63\x70\x15\xfa\xda\xa0\xa3\xa7\x07\x67\xea\xac\x23\x72\x99\xfb\xed\x62\x34\x8f\xec\x10\xa0" + - "\x8b\xac\xb0\xd8\x44\x73\x1c\xa1\x75\xdf\xca\xe0\x19\x3f\x74\x7e\x3d\xe4\xdd\x18\x8b\x7a\x71\x81\x5e\x5f\xbc\xdc" + - "\xa2\xad\xc5\x03\x1c\xd2\x21\x54\x61\x21\xdc\x6d\xa2\x10\x18\x63\xc2\x32\x3c\x91\xa2\x1c\x1e\xba\x50\xba\x6c\x45" + - "\xb7\x6c\x71\x71\x9e\x4b\xf0\xae\xd9\x55\x89\xa5\xc9\x89\x3a\xc3\x29\x02\x21\x98\x87\x78\xec\x9b\x70\x83\x22\xd7" + - "\x93\x01\xf2\x84\xa7\x7e\xda\xce\xf0\xfe\xea\x98\x5e\xc1\x26\x8b\x0c\x81\xfe\x27\xee\x78\x87\xc0\x02\x2f\x7d\x83" + - "\xd1\xe9\xa2\x6c\x8c\xda\x75\xd2\xee\x26\xe8\x39\xef\x15\x57\xee\xd5\x54\x95\xe7\xbf\x58\xfe\x98\x51\xe8\x06\x94" + - "\xd5\x07\xbf\xd4\x28\x33\x67\x35\xe9\xe8\x49\x09\x22\x23\x50\xa8\xa8\x3c\xce\xb6\xca\x16\xc1\xb1\x0f\xb7\x5d\x7a" + - "\x8f\x48\xff\x5c\x9e\xff\x32\x50\x7e\xdb\x8c\xf9\x77\xa8\xe6\xc1\xf1\xf1\x20\xbc\x39\xd0\xe7\xd6\x58\x66\xcb\xce" + - "\x20\x39\xaa\x6e\x08\xef\xdd\xea\x0d\x2d\x1d\xf2\x35\x3c\xa3\xab\x65\x8f\xc2\x07\x27\xec\x55\x7e\xef\xb3\xdf\x4f" + - "\x27\xec\x59\x23\x0e\x98\xf6\xd2\x23\x77\x09\x00\xed\x25\x23\xa8\x7b\xfd\x58\x49\xa0\x4b\xea\xe1\x2d\x24\x82\x34" + - "\x00\xac\xf1\x73\x1f\x78\x2a\x20\x8a\xc8\x98\x18\x94\x2a\xfd\x25\xc9\x5a\x3d\xd7\xa5\x80\x83\x07\x9f\xab\x0e\x72" + - "\x32\x1a\x29\xbe\x8b\xec\x0e\xc7\xfb\x52\xdd\x28\xbe\xf2\xe8\xda\xf2\x37\x96\x68\x41\x46\x7c\x9d\xd2\x17\x1f\x60" + - "\xb2\x6e\xb8\x2a\xfc\xf3\x8c\x59\xe8\x43\x37\xf2\x0f\x28\x35\x95\x1c\x7a\xfa\x91\x26\x1e\xe8\xec\xdf\xd5\x81\x3a" + - "\x83\x99\xe6\x0f\xfd\xdb\x47\xfc\xc6\x7e\xdb\x61\x64\xf7\x74\x94\x09\x0f\x0f\x46\xdd\x28\x22\x1f\x67\xc1\x06\xe4" + - "\xb9\xde\x3f\x0b\x7d\x26\xdc\x24\x75\x14\xec\x24\x26\x6e\x47\x1f\xbb\x33\x30\xfe\x1d\x1c\xe0\xe1\xa6\x5e\xf9\xc6" + - "\x78\x2b\x30\x83\x49\xe0\x1d\x7e\xef\xbf\xd6\x17\x86\xa1\x03\xb1\x2f\x8e\x7c\x04\xe7\x87\x48\x8e\x2f\x26\xea\x00" + - "\x76\x18\x79\x5e\x60\xe8\x30\x3b\xda\x3d\xf6\xa3\x90\x4c\xde\x96\xfd\x83\x5c\x24\xb9\xaa\x41\x58\x69\x90\xa4\x33" + - "\xcf\xe1\x20\x6c\xdf\xf3\xee\x08\x5c\x38\xf6\x9b\xa5\x2a\xe6\x26\x5f\xc2\x2d\xb9\x8e\x78\x8d\x7a\x75\x5e\xda\x5b" + - "\xd5\xee\xca\xd1\x43\x35\x50\xc3\xe1\x70\x20\x9f\xbe\x11\x0c\x47\x98\x9a\x7f\x8b\x76\xc6\x5f\xd0\xfa\x79\xa4\x40" + - "\x2c\xa1\x61\x88\x95\x72\x78\x26\x28\x6b\x07\x5f\xb5\x93\x83\x23\x1a\xe4\xaa\x00\xa3\xfa\xaa\xb0\x44\x2b\x37\xf6" + - "\x04\x89\x3e\xd5\xd4\xfc\x42\x67\x05\x52\x0d\xaa\x1d\xdd\x0c\x31\xd3\xb4\x18\x58\xf7\x05\x2d\x4a\x04\x77\xf4\xb1" + - "\x72\xde\xb7\xfb\x51\xc7\x16\xba\x6e\x4c\xe5\xa6\x75\x68\x6f\x8c\x70\x16\x26\x65\x51\x93\x47\x00\x66\xd2\x50\x18" + - "\x75\xeb\xbe\x19\x60\x70\xdd\xaa\xc6\xb0\xf3\x61\x4c\xc4\xc5\xa8\x10\xfc\x26\x18\xc9\xb8\xc5\xcf\xc9\xf4\xe5\x7f" + - "\x5e\xa6\xb6\x90\xd3\x8a\x03\xe9\x2f\x9b\xb9\x3b\xc3\xe8\x1f\x43\x44\x13\xad\xd6\xf0\xed\x0a\x3e\xb4\x53\x13\x98" + - "\xb1\x32\xe7\xb3\x5a\x0f\xd8\xc2\xde\xd2\xf4\xb8\xd2\x68\x11\x6d\x05\x7d\x13\x03\x78\x24\x39\x5f\xb2\x98\xf3\x1b" + - "\xb7\x59\x42\x3f\xf1\x0d\xfb\x49\x8d\xb1\xa9\x40\xea\xa5\xde\x11\x33\x02\x03\xfc\x4b\xd4\x61\xc1\xb6\x23\x01\x43" + - "\xd9\xb2\x3d\xc2\x48\x3a\xa6\xbc\x2d\x6a\x6f\xcf\xaf\x4d\xbf\xb3\x5a\x9a\xe6\x3b\xeb\x25\x5a\xed\x45\x56\xbe\xb3" + - "\x44\xbf\x07\x6e\x1c\xcf\x5d\x45\x54\x3f\x3f\xf0\xb4\x46\x8a\x81\xc0\x17\xbb\x83\x2f\x4f\xcd\xa1\x6a\x2a\xa3\x1b" + - "\x0c\x76\xae\x95\xae\xdd\x4d\xe5\xa8\x52\x87\x63\x57\x34\x9d\x47\x96\xc5\x53\xa4\xd1\x0b\xd5\x75\x71\x87\x6f\x2b" + - "\x1b\x0d\xe5\xb6\xa2\x51\x2a\x4f\x30\x42\xb6\x43\x6b\x82\x63\x88\x1b\x6b\x13\x5f\x1e\x17\xec\xe4\xd0\x37\x17\xf3" + - "\x7c\x3a\xf1\xe8\xfe\xf4\xc0\x91\x89\x86\x36\x88\x28\x44\xdf\xb3\xe7\xc4\xbe\x8b\xfd\x13\xb2\xef\x82\x75\x8f\xda" + - "\x68\xef\x8d\xd6\xae\xef\x77\x1b\x0e\xc5\x2e\xde\x18\xcc\x31\x1a\x85\xc6\x92\xb5\xce\x20\x3a\xb0\x2c\xec\x15\x06" + - "\x6a\x4f\x37\x2a\x41\x17\xdd\x2e\xda\x96\x07\xe5\xb7\x80\xc2\x85\x67\xe4\xae\xa9\xea\x08\xf7\x74\x15\x05\xfc\x7e" + - "\x84\x41\xf3\x4e\x5e\xdd\xe0\xed\x50\x16\xea\xc5\xdb\xd7\x1c\x99\x8b\xa2\x9f\x4e\xaf\x7f\x40\xd5\xa8\x0c\x31\x43" + - "\xc5\xd0\x51\x97\x7e\x9b\xb8\x62\xa9\x4f\xf2\x8e\x6d\xf0\x9d\xef\x15\xed\x8d\x69\xe1\x73\x2d\x48\x4e\x65\x53\xe8" + - "\x23\x6a\x3d\x6d\x0b\xae\xbb\xf6\x3c\x53\x02\x98\x63\x75\x62\x1a\x10\x3b\xaa\x95\x41\x17\xa1\xac\x51\xe5\x64\xb2" + - "\xaa\xea\x21\xe0\x1e\xfd\x64\xbf\x18\xa3\x39\x5b\xc0\xe4\xc0\x8d\x6a\x2a\xfc\x54\x4f\x2e\xd4\xbc\x5c\xab\x85\x2e" + - "\xae\x55\xd6\x98\x05\x90\x0c\xbb\xc8\x78\x63\x98\x29\xea\xb3\xe9\xd2\xc3\x4e\x90\x95\x3d\xab\x4c\x3d\x54\x27\xc6" + - "\xa8\xfb\x5f\x7c\xf9\xd5\x01\x8c\x4b\xa7\xd7\x3f\xeb\xac\x19\xab\x03\xd7\xe2\xf7\x65\x9e\xaa\x1e\xf8\x58\xe4\x46" + - "\xd7\xa6\x1f\xd7\x74\xef\xb3\xad\x79\x99\xa7\xdc\x5d\x37\xd7\xf6\x61\x80\xe0\x27\x1f\x04\x53\x6d\x9b\xdc\xdd\xc5" + - "\x1d\x22\xb7\x78\x18\x07\x8d\xf9\x91\x79\x1f\x09\xd6\x88\x18\xff\x35\x27\x64\xb3\xd3\x9d\xd5\x2e\x74\xbb\x8a\x3b" + - "\x06\xd3\x23\x43\x84\x1c\xf8\xbe\xcf\x58\x48\x5a\x28\xe8\x33\x38\xf1\xe1\x11\x62\x65\xa3\x0b\x0b\x87\x81\x41\x85" + - "\x02\xbb\x74\x6f\x2f\x1e\x9d\xbf\xed\x69\x5d\xa3\x48\x9e\x88\x2d\xfc\xc9\x20\x06\x15\xba\x1c\x76\x8c\x69\x2b\xaa" + - "\xcd\x79\x80\x50\x05\xaf\xa6\x4a\xab\xa2\xac\x16\x3a\x87\x4f\x7f\x8a\x16\x1e\x78\xd2\x49\x45\x89\xea\xc0\xd5\xce" + - "\xf6\x92\x1c\x75\xc0\x81\x50\x8e\x6d\x9b\xc7\xb6\xb3\xd3\x35\x38\x99\x35\xad\x73\x3c\xaf\xe4\xd4\xfa\xa4\x48\xe7" + - "\xe5\xaa\xb0\x72\x79\xc9\xa8\xf2\x48\x1c\xe8\x30\x87\xf4\xc5\x01\xa8\xa8\x53\x8e\x2d\x3a\x93\x3c\xfa\xbb\x2a\x9b" + - "\xcd\x00\xd7\xf3\x1a\xeb\x95\x5b\xd4\x63\x16\x79\xe2\xd0\xe0\x07\xb8\x79\xaa\x68\x5f\xca\x10\xee\xa8\x64\x4f\x25" + - "\x50\x73\xc2\x64\xb9\xe3\x8b\x72\x3a\x8d\x8b\x7d\x0c\x48\x1b\x67\xfd\x79\x17\x1d\xca\x39\xf5\x06\xb3\xa6\xe4\x53" + - "\x35\xc9\x8d\x2e\x56\x4b\x12\xd8\xc9\xc1\xcf\xbb\xf4\x32\x4b\x4d\xa2\x99\xc3\x0e\x41\x0b\xf2\x4b\x5b\xe7\x0f\xc4" + - "\x4c\xf4\x54\xf2\xe2\xed\xeb\xe7\xe8\x6c\xff\x43\xa9\x53\x93\x26\x03\x5f\x03\xa1\xbb\x61\x6f\x11\xe4\x76\x43\x2d" + - "\x79\xa9\x37\x7f\x19\x1c\xd9\x18\xa8\x32\xa0\xab\xa1\x57\xa2\x53\xac\xf0\xad\x43\x9b\xc0\x9f\x53\xff\xe8\xa8\xcd" + - "\x39\x4b\x59\xad\x99\xcc\xd5\x44\xd7\x06\x1c\x26\x2b\xa3\xfe\xe0\xd1\xc7\xb8\x5f\xe0\x73\x47\xa6\x02\xe7\x3d\x7a" + - "\x5e\x95\xeb\xda\x54\x6e\x25\xbc\x33\x1f\x50\xe5\x8a\x4c\xa6\xe8\x5c\x00\x04\xbb\xa9\x32\x54\x1d\x59\x11\x00\x8a" + - "\x9e\x80\x4e\x00\xe1\xd1\xf5\xa4\xc9\x2e\x4d\xa2\x6c\x27\x10\xd0\x3d\x6b\x14\xe0\x0f\xa6\x2a\xab\x6b\x7b\x2b\x82" + - "\x97\x29\xe8\x9d\x0a\x43\x75\xa7\x59\x3d\x29\x2f\x4d\x85\x0e\x74\xcf\xe7\x55\x56\x9f\x40\x15\x63\x46\x58\x3f\x5f" + - "\xcd\x6a\x0a\x96\x03\x78\xf5\x26\x9b\x5c\x98\x66\x74\xf0\xe8\xd1\x57\x8f\xee\x4f\xca\x85\x1d\xe9\xf8\xe0\x73\xb7" + - "\xe5\xc5\xa6\x70\x3d\x04\x77\x17\x5e\xc1\x44\x7a\xfe\x13\x31\xcd\x1a\xa5\xeb\xeb\x62\x32\xaf\xca\xa2\x5c\xd5\x98" + - "\xf4\x55\x03\xde\x3d\x43\x37\x41\xbf\x01\xc4\x7a\x55\x64\x0d\x14\x48\x4d\xae\x05\x71\xdc\xaa\x4d\xf3\x2e\x5b\x98" + - "\x72\xd5\xb8\x93\x87\x33\xca\x0b\xe6\xc9\xbd\x13\x7c\x6a\x9c\x11\x7b\x12\xae\x23\x2f\x67\x64\x3f\x78\x38\x3a\x4d" + - "\xff\xd5\x0d\xce\x8d\x3d\xb3\xcf\x9c\x47\x25\xed\xfa\xb2\xb0\x3b\x7c\x20\xdc\xbd\x29\x4b\xf1\xba\xac\xb0\x0b\x54" + - "\xb0\xa3\x03\xb7\x9e\x0d\xa6\x01\x1e\xb0\x91\x29\x9d\xd3\x3e\xc0\x39\x90\xa9\x21\xfe\x94\x81\xbf\xe3\x34\xe2\x23" + - "\x28\x75\xdc\xa5\x29\xd8\x2a\xb6\xb2\x5b\x37\x2d\x4d\x8d\xa8\xc6\xdd\x9c\x8c\x8b\x55\x80\xba\x5f\xaf\xf2\x26\xf3" + - "\x00\xc9\x44\x63\x38\x7b\x24\x27\x6e\x22\x91\xa7\x9c\x06\x2e\x64\x8e\x37\x83\xd7\xa3\x1a\xdd\x9e\x97\x0e\xa8\xeb" + - "\xdc\x30\x4d\x07\x2f\xe1\xac\x79\x50\x8b\x2c\x79\xc8\xb6\x69\x48\xee\xe8\x8f\xb3\xfb\x3b\x8c\x19\xa2\xa0\x9b\x0b" + - "\x73\x4d\xf2\xd7\x40\x4d\xe6\x3a\x2b\x50\x0b\x06\x7e\x02\x7f\x34\xcd\x40\x55\x7a\x2d\x82\x19\xbc\x72\xa3\x9d\x50" + - "\x19\x53\x72\xaf\xf2\x0b\x75\x64\xab\x15\xa8\xe7\x84\x0c\x68\x9a\x1a\x59\x2a\x27\x58\xcb\xcb\x03\x5d\xc9\xec\x87" + - "\x04\x04\x8f\x5a\x63\x77\x8c\x5c\xef\xa4\x63\x26\x23\x9b\x66\x05\x7d\x19\xb0\x38\x38\xf4\x60\xbc\x19\x0c\xf9\x34" + - "\x23\x4c\xcc\xd6\x48\xc5\x15\xcb\x5d\x2e\x0b\x5a\x0f\xbb\xcf\x84\xc4\x8b\xe2\x7c\x27\x98\x4b\x47\x5f\x3d\xef\xdf" + - "\x21\x72\xb1\x66\xc0\x5d\xf7\x7a\x2d\x47\x29\xc3\x8b\x60\x82\x05\x65\xf9\xd6\xfe\x2d\xd2\x8e\x55\xab\x22\xc8\xed" + - "\x61\x8a\x26\xab\x8c\x83\xd8\x44\x51\xd0\xad\x29\xd8\x0a\x04\xde\x35\x0b\xe3\x4e\x38\x02\xbb\x95\x5f\x46\x86\x04" + - "\x33\x57\x13\xb3\x24\x6c\x14\xdc\x91\x41\xc6\x1a\xa1\x39\x09\xa5\x2b\xda\x1e\xd3\x42\x56\x1f\xc7\xfb\xf9\x3d\xd9" + - "\x36\x0b\xd8\x0a\x36\x04\x66\x87\x1d\xff\xd8\x0e\x4c\x42\xb5\x62\x11\x61\x20\x6c\x02\xe6\x9d\xf2\x41\x81\xcd\x02" + - "\x7d\xb2\xf3\x76\x4c\xed\x90\x8e\x45\xce\x1d\x14\xcc\xec\x3e\x8b\xbe\x84\x95\x8d\x71\x49\x02\xac\x67\xbf\x61\xc0" + - "\x8d\x03\xb3\xb0\x8f\xdd\xf5\xfb\x47\x83\xcc\x16\x4c\x1f\x3a\x7a\x84\xcb\xe6\xb0\x1f\xec\xb1\x3c\x16\x3d\xd8\x77" + - "\x3d\x18\xbb\xad\x2e\x2c\xee\xcc\x31\x39\xfc\x80\xda\xf9\x3a\x69\x0e\xa4\x01\x22\x04\x4e\x01\xa9\x6e\x74\x18\x0d" + - "\x61\x4f\xd8\xb2\x79\xa1\x1b\x1d\x32\x1e\xeb\xc2\x31\x7f\xe0\x62\x6b\x4b\xd5\xa0\xf0\x1b\xe3\x23\xb5\x07\x09\xc6" + - "\xe9\x0f\xfe\x73\xf8\xf2\x87\x97\xaf\x5f\xbe\x79\xf7\xe1\xcd\xdb\x17\x2f\xe3\x77\x2f\xde\x3e\xff\x73\xfc\x72\x8f" + - "\xa2\x27\x44\xd9\x67\xa0\x43\xee\x04\x7b\x67\xd3\x92\xed\x5d\x8c\x0d\x71\x73\xd3\xf5\xfc\x6b\xf0\x48\xed\xa9\xdd" + - "\xe8\x5d\x5f\xcc\xa1\xdb\xf5\x76\x1a\x7a\x6e\xd0\x2e\x15\xc5\xb3\x22\xad\xca\x2c\x55\x4f\xd5\x13\x42\x1f\x7a\x9b" + - "\xa7\xea\x67\x73\xfe\xa7\xac\x71\x77\x0b\x4e\x30\x45\x9e\x93\xcb\xf6\x4b\x2b\xf5\xd6\xf6\x54\x8f\xa6\x95\x31\xbf" + - "\x1a\xba\x4b\xa8\x16\x1a\x4d\x61\xd6\x9c\x54\x0b\x97\xcb\x1e\x7d\xa3\x09\x94\xb3\x28\xd5\xe9\x69\x6d\x9a\xb3\x33" + - "\xba\x18\x00\x0f\x81\xda\x41\xaa\x45\x30\x84\x64\xd1\x1d\x4e\x5c\xec\xdc\x40\xed\x0f\xf0\x34\xcc\x4c\xd3\x61\xe6" + - "\xa7\x0e\x60\xf4\x9a\x4f\xf3\x70\xef\x33\x0c\xae\xe7\xb4\xa6\x32\x93\x01\x3c\xd8\x0d\x33\xf5\x33\x3b\x6b\xa7\x6f" + - "\xb8\xca\x52\xc2\x1a\x83\x3f\x35\xed\x9c\xe0\x36\xc3\x0d\x77\xe8\xbe\x91\x38\x53\xb6\x67\x17\x26\x10\x4c\xe5\x66" + - "\x04\x9f\x57\x4c\x33\x86\x35\x61\x24\x02\x07\xa9\x30\x8a\x02\xc2\xf7\x65\x85\x5a\x94\xa9\xb1\x54\x07\x99\xd8\x9a" + - "\x7d\xc6\x2d\xdb\xe9\x7d\x61\x8b\xb2\x81\x04\x61\xea\xfe\x57\x8f\x1f\x7f\x3e\x74\x46\x08\x60\x6f\x9c\x56\xc3\xc0" + - "\x39\x44\xc0\xe2\x69\x55\xfe\x6a\xf8\x7c\x0d\xfd\xd5\x20\xc7\xec\x3b\x1e\xcd\xf7\xbe\xbc\x13\xec\xa5\x9c\x1a\x64" + - "\x1e\x21\x04\xf6\xb7\x0e\x37\x48\xe0\x29\xa1\x32\xda\x22\xcc\x82\x03\x3b\x4e\x31\x45\x17\x06\xb9\xcb\x55\x01\x16" + - "\xaf\x23\xfc\xe2\x54\x05\x6b\x79\x16\x08\xc3\x30\x70\x0c\x1d\x62\x5e\x1b\xc7\x41\x75\x70\xc7\x5d\x95\xbc\xc4\xa0" + - "\x96\xe0\x6e\x9e\x98\xc9\xaa\x02\xde\x38\x2b\x40\xbe\x2e\xf6\x4c\xb1\x5a\x98\x0a\x59\x11\xfb\xf7\xba\xca\x30\x0c" + - "\x85\x73\x25\xc1\xb7\x4d\x75\xed\x4d\x67\x3c\x05\x71\x87\xed\x94\x20\xa9\x1e\x2b\xea\x07\x5d\x0d\x9d\xa7\x20\x33" + - "\x3c\xf1\x03\x39\xaf\x92\xbd\xed\x3a\xd8\xfc\xee\x3b\xc1\xf8\x6a\x45\xd9\xb8\x61\x78\xd0\x4a\xd6\x50\x5e\xdb\xad" + - "\x8f\x84\x26\xd9\x53\xe2\x92\xbb\x75\x14\xd8\x79\xea\x7a\x6c\x0f\xef\xec\x70\x5b\x69\xf9\x52\x06\x1d\x4e\x02\xcb" + - "\x3c\x2e\x9c\xa7\x00\xa7\x3c\x5b\x67\x11\x6c\x60\xf4\xf2\x48\x9c\x7f\xa1\x85\xf4\xbd\xc5\xb0\xfb\x80\x80\xb8\xfe" + - "\xea\x46\x47\x37\x3d\x40\x57\x54\xe5\xd2\xbb\xa9\x81\xb4\xb9\xd0\x18\xf9\xc7\x15\x53\x4e\x37\x76\x31\x00\x68\xbe" + - "\xd4\xb8\x8f\xa2\xdc\xab\xa6\xb0\x5b\xc5\xb9\x35\x24\xd0\x7c\x22\xb7\xae\xca\x8a\x3c\xc3\x1d\x0c\xe6\x02\x91\x5e" + - "\xd5\x35\xa8\x9a\x79\xb9\x9a\xcd\xe1\x62\x84\xc3\x84\xd5\xce\x75\xca\xa2\x8c\xb9\xb2\x32\x4b\x1a\xee\x79\x98\xb5" + - "\x0b\x73\xed\xce\x33\xf6\x92\xc9\x6c\xd7\xa4\x1e\x46\x40\xd1\x63\x75\xca\x53\x26\x78\xa3\x33\xf0\x43\xbc\x17\xa1" + - "\xdb\x00\x3d\xeb\x8c\x6a\xa7\x46\xa0\x80\x5d\x37\xb6\x11\x6d\x6a\xea\x37\x3e\x6d\x99\xa9\xd5\x47\xd1\x5c\xc0\xd2" + - "\xd9\x4d\x5f\x99\x7a\x2e\xb3\xec\x59\x19\x9b\x29\x8d\xe5\x3d\xe7\x28\xe2\x4e\xca\x65\x66\x04\xb6\xb2\x63\x84\x5f" + - "\xda\xeb\xcb\x01\xea\xc2\xc4\xf4\x5b\x71\xef\xbc\xd7\xbb\x26\x6c\x40\x01\x65\x87\xdc\xa5\xb7\x0c\x57\x6b\xa5\xc6" + - "\xe5\x35\x3b\xa9\x38\xb8\xdd\xc2\xec\x9d\x5f\xef\xd9\x85\xe7\xfc\x7a\xd1\x71\x88\xf8\x56\x64\x15\x6d\x0d\x96\x48" + - "\x05\xd1\x6b\x6e\x62\xe1\xad\x9d\x58\x0c\xdf\xc2\x3f\x3b\x4d\x08\x5b\x41\xd6\x6a\x77\x48\x66\x9d\x87\x44\xc8\x35" + - "\xf6\x04\x67\xc8\x9c\xd9\xd5\xcb\x52\xea\x76\x56\xab\x29\x2a\xfd\xca\x0a\x65\xeb\x73\x43\x9b\xdb\x69\x57\xde\x98" + - "\x35\x96\xae\xe3\x12\x98\x78\xdb\xef\x74\xf6\x3f\xe2\xcb\x4e\x73\xc8\x37\x22\xcc\xb2\x80\x49\x13\x57\x98\x75\x7e" + - "\xcd\x55\xd1\x17\xc8\x8e\xc0\x2c\xd1\x15\xa7\x9e\x51\x87\x83\x6b\x08\xa0\xe0\xcf\x8d\x73\x26\x1a\x32\x05\xe8\x3a" + - "\x1c\xad\x73\xe4\xce\x09\x4d\x26\xca\x9c\x52\x1a\x3b\x16\x27\x6d\xac\xa8\x1e\x5b\xec\xcc\xcd\x39\x0e\xa6\x7b\xda" + - "\x3b\x48\x13\xc0\x00\xa0\x3f\x2b\xc4\x08\x05\x2a\x31\x03\x6b\x33\xc6\x97\x54\x44\xa9\x83\xa1\x7a\x53\x42\xab\x6b" + - "\x2d\xa0\xc6\xdd\xfb\x47\x76\x72\xf0\xac\xb6\x4b\xa1\x86\xab\x28\xa9\x27\x22\xf7\xa7\x6f\xe2\x1d\xfb\x62\x80\x6a" + - "\x34\x51\x4b\xdd\xcc\xd1\x4d\x1b\x4e\x1d\x78\x16\x9b\x46\xe8\x21\x52\x66\xf6\x59\xf1\x06\xa8\xb6\xd8\x42\x53\xd2" + - "\xfa\x83\xa9\x69\x69\x40\xdb\x96\x5f\x6f\x1e\xdb\x3b\x2f\x63\xc6\x67\x88\x87\x07\xc6\x26\xbb\x19\x70\xf6\x14\x29" + - "\xdf\x89\xe1\xc0\xea\x80\x20\xb4\x57\xf0\xe6\x06\xcf\x4f\xaf\x67\xdf\x79\xfc\x0e\x2e\xc9\x44\x8e\x13\x93\xad\x4c" + - "\x58\x81\x04\x6f\xa3\xd6\x8f\x3c\x08\x55\x70\xc4\xf8\x86\x77\x0e\xaf\x50\x7a\xbb\x63\x43\x71\x4d\xe3\x76\x4d\x8c" + - "\x5f\xa8\x17\x26\x87\xfc\x6a\x17\xe6\xba\xdf\xf2\x4f\x39\x7d\x78\xf6\x33\x9b\x55\x6c\xdb\x84\x2c\xab\x69\x1b\xc0" + - "\x31\x06\xb7\x04\x0d\xaf\xed\x5a\xb2\x02\x02\x0e\xa4\xa5\xa9\x7e\x87\x00\x7c\x5b\xa5\x90\x3e\xaa\x1e\x5c\x42\x60" + - "\x8c\x84\x85\xa8\xfb\x28\x08\x6c\x5c\xc0\x67\x4e\xce\x03\xb8\x00\xa6\x91\xe1\xfe\xec\xe8\x86\xfd\x2f\x61\xd6\x36" + - "\x9d\xa7\x46\xe4\xf9\xcf\x40\xaf\x6b\xb7\x68\x6d\x1a\xda\xa1\x4e\xaa\x6c\xd6\xa5\xc3\x36\xa7\x3b\x75\x59\x66\x64" + - "\x5e\xf0\x72\x0e\x28\x33\xae\x96\xe8\x2d\x06\xdb\xe9\x5c\x93\xe1\x12\x37\x30\xd4\x6a\x4f\x4f\xa3\x2f\x4c\x71\xfa" + - "\xf0\x4c\xd0\x86\x2e\x5d\x8d\x97\xe4\x2f\xcc\xb5\x23\x08\xad\x28\xb1\x0e\x3a\x4c\x19\xec\x11\x18\x07\xd6\x7a\xf0" + - "\x9f\xba\xf3\x37\x9c\x83\x4f\x61\xc1\xba\xae\x66\xe2\x55\x15\xe4\x20\xb0\xbb\x04\x50\x38\x94\x47\xe1\x20\xc2\x83" + - "\x47\xaa\xee\xb8\x9b\xc9\xe3\x80\xb5\x18\x74\xe7\x21\xff\x9f\xd8\x19\x48\x28\xc7\x3c\x35\x81\x15\x0d\x87\x43\x57" + - "\x10\xb6\x3a\x2c\x18\x44\x5f\x01\xec\xaf\xbf\x32\x06\x90\x50\xa4\x97\x5c\x18\xf0\x71\xbf\xd4\x79\xd2\x57\x96\x93" + - "\xd0\xcd\xaa\x32\xde\x45\xd5\xd6\xea\x6f\x2e\xc4\x56\x40\xf6\xcf\x1d\x36\xdf\xa4\xdb\x70\x8e\x05\xa4\xfc\x27\x8d" + - "\xc9\x73\xf5\x61\x5e\xae\x3f\xd0\xd9\x02\x74\x81\x14\x1c\x59\x71\xe5\x5d\x1d\x70\x00\x97\xb9\x26\xd5\x22\xa2\x80" + - "\x50\x4b\xf6\xc9\x50\xdd\x3f\x78\xf4\xe5\x57\x5f\xb8\x0f\xde\x59\xde\x12\x7a\x08\x8e\x4d\x4b\x53\x20\xbc\xb1\xdd" + - "\xb8\x38\x39\x2e\xc0\xcc\x6e\x55\xea\x2d\x00\xec\x80\xc2\x74\x38\x29\x8b\x89\x6e\x60\xae\x11\x1b\x29\xa6\x26\x42" + - "\x8b\x14\x70\x27\x50\xc0\xcb\xc8\x9e\xfa\x38\xca\xc6\x5d\xac\x90\x15\xa2\x55\x07\xe9\xcf\x16\x41\x8b\x36\x58\xf9" + - "\x16\xba\xc8\x96\xab\x5c\x3b\x49\xc5\x6f\x49\x07\x3f\xe1\x59\x1f\xea\xfd\x29\x1e\x7c\xec\xc7\x86\x80\x6c\xb6\x9f" + - "\xc2\xac\x73\xc8\x0b\x6c\x47\x62\x9c\xeb\x01\x58\x7c\x32\x72\xf9\x6a\xf1\x71\x84\x4d\xc3\x3b\xed\xfc\xda\x65\x98" + - "\x47\x19\x71\x9e\x35\x06\xea\x0b\xfb\x06\x9d\x3a\x0c\x9f\xc1\x3f\x6e\x38\x1c\x48\xbb\xe5\x30\x97\xc6\x8c\x3d\xb5" + - "\x09\x7e\x47\xb5\x22\xca\xf1\xe8\x50\xdd\x41\xa0\x6d\x57\xd2\xfa\xad\xd4\xe4\xa6\x31\xcc\x93\xd8\x6f\xd0\x25\xe7" + - "\x2c\xd6\x12\x0e\x10\xc9\xd7\x4a\xce\x1b\x95\x1a\x1c\x6d\xd3\xc9\x50\xb7\xe8\x46\xa7\x5c\x8f\x30\x20\x80\x3e\xe8" + - "\x11\x17\xb7\xd2\xac\x9e\xe8\x2a\xdd\xd8\x30\x6c\x8d\xee\xfa\xbc\x5f\x0b\x0c\xf4\x13\x3a\x10\x18\x74\x09\x1a\xca" + - "\x92\x8d\x0f\xcb\x2a\xbb\x24\xff\x27\x54\xb1\xb9\xdc\x97\xf0\x1a\x6c\x34\xad\xd7\x8c\x6a\xb4\xe5\x72\x58\x62\x22" + - "\xf4\x93\xd5\x62\xa1\xab\x6b\x58\xb0\x83\xa1\x7a\x59\x4c\xcb\x6a\x62\xd4\xb3\x1f\x5f\xa9\x7a\x55\x4d\x2d\x75\x44" + - "\xe9\x6f\xa1\x8b\x26\x9b\x60\xe2\xed\x26\xc3\x4c\xe1\xb8\x71\x0f\x86\x5f\x0f\xaf\xd4\x79\xa5\x8b\xc9\xfc\xde\x67" + - "\x5b\x8f\x86\xea\xd5\xc2\x72\x66\xe4\xea\x53\xa6\xab\xdc\x3c\xa8\xd5\x42\x67\x80\x62\x4c\x59\xc6\x11\xb9\x23\x5d" + - "\x4d\x18\x4b\xc9\x72\x11\x7a\x86\xfe\xb2\xba\x99\xd7\xa8\x33\x20\x6f\xc8\x85\x99\xcc\x75\x91\xd5\x0b\x7b\x18\x1e" + - "\x0f\x9d\x01\xaf\xb6\x1b\x34\x2e\x63\xbf\xa4\xdc\xc2\x2a\x59\x02\xb0\x97\x49\x60\x18\x89\x9d\x9c\x04\xe6\xc9\x56" + - "\xf4\x64\xa8\x3e\xbc\x31\x97\xa6\xfa\x60\xaf\xd2\xb2\x36\xa2\x38\x50\x68\xb4\xba\x56\x6a\x52\xa6\x46\xf5\xde\xbd" + - "\x7d\xf1\x76\xac\x5e\x58\x41\xe6\x03\xca\xea\x1f\x90\x48\xda\x79\xee\xdf\xfb\x6c\xeb\xf3\xa1\x7a\x06\x89\xa1\xa0" + - "\x36\x08\x3b\x0e\x67\x3b\x35\x8d\xce\x72\x2b\x70\x61\xbd\xc4\x93\xa8\x9e\x99\x0d\x39\x5f\xba\x60\x3a\x6c\x9d\x5f" + - "\x0c\x5d\x52\x7b\x0d\x86\xfa\x0a\x6f\x76\x2b\x82\x45\xb5\xaf\x96\xb3\x4a\x63\x6e\x8e\x9f\x8d\xbe\x78\xad\x41\x3a" + - "\x7b\xb4\x7f\xf0\xe4\xde\x67\x0f\x47\xe4\xc5\x74\x5e\xd9\x35\xe5\xac\x52\xbf\x61\x4a\xa9\x87\xef\x3f\xde\xbc\x3f" + - "\xe5\xdf\x67\x98\x4f\x6a\xab\x02\x4c\xa7\x17\xba\x9e\xdb\xf2\xbd\xd3\x67\x7b\xff\xff\xb3\xfe\x68\x16\x42\x7d\xda" + - "\x89\x78\x06\x29\x4d\x84\xb5\x42\x48\x84\xb6\x51\x7b\x9e\x9d\xdd\x0b\x15\x65\x40\xa7\xec\x6d\x03\x92\x9a\x00\x97" + - "\x19\x28\xcb\xf1\xb8\x8c\xc4\xe8\x02\x3d\x1a\x91\x62\x92\x23\x78\xbf\x7f\xf7\xfa\x87\xcf\xe1\xd9\xde\x43\x9f\x7b" + - "\x85\x4d\x68\x4e\xe8\xf7\x1c\xc3\x86\x54\x91\x74\x2c\x89\x0e\x26\x50\x61\xa2\x76\xe1\xce\xa9\x0c\xa4\xb1\xee\x29" + - "\x3f\x0f\x03\x95\xec\xfd\xe1\x20\x51\xfd\x30\x69\x30\x1c\x55\x6c\x74\x53\xda\xed\x10\xc8\xef\x4e\xe5\x84\xd4\xe5" + - "\x61\xbd\xbe\x6c\x53\xad\x20\x4f\x37\xf8\xca\x70\xba\x62\xff\x1a\x6c\xc1\xf6\x3d\x1a\x85\xdb\x05\x8a\x55\x9e\xdb" + - "\xf7\x10\x4b\x32\x16\x97\x8b\xbd\xa6\x89\x95\xc0\xc3\x57\xac\xc0\x3f\x08\x4c\xab\xa0\x9a\x2f\x1e\x34\x0c\x4b\xe6" + - "\xef\x4d\xaa\x61\x17\x5a\xd8\x55\x49\x82\x5e\xf9\xf6\xaf\x63\x85\x4f\xb9\x15\xdc\x7d\x84\xa5\x47\x9b\xe4\x38\xc8" + - "\x90\xf4\x7f\x4e\xde\xbe\x71\xaf\x64\xdf\x0f\xa5\x9e\x90\xd4\x84\x41\x66\x2b\xce\x65\xb5\x36\x4e\x57\x85\x52\x56" + - "\x09\xba\x54\xd1\xf7\x14\x93\x34\x20\x3d\x66\x92\x89\x7c\x7b\x6b\x0f\xb7\xfd\xc5\x68\x3d\xc2\x48\xe6\xc8\xe8\x4e" + - "\x1d\xfe\xd8\xed\xb3\xd7\x71\x7f\x75\xc0\x56\xfa\x9e\x51\x79\x57\xea\xe6\xc6\x5f\x04\xf1\x4b\xe1\xcf\x9f\x76\xb4" + - "\xc1\x5c\xba\x54\xd9\xb4\xda\x93\x76\xe2\xf0\x03\x51\xbb\xa7\x7c\xdd\x6d\x70\xed\xbe\x5a\xfc\x22\x2c\x13\x86\x1f" + - "\x20\x81\x7d\x03\x52\xba\x6e\x5c\x00\x36\x5c\x05\x40\x71\x81\x88\x0b\xa2\x8b\x12\x13\x04\xe5\xd2\x69\x25\x90\x30" + - "\xb8\x98\x48\x41\xe3\xaa\xf0\xb7\x27\x45\x26\x41\xb4\x56\x6d\x08\xce\x4e\xa5\x66\x59\x99\x09\x6b\x89\x3e\xfc\x2b" + - "\xf3\x07\x4b\xf2\x49\xf3\xf7\xe1\x77\x4d\x20\xd4\xbb\x71\x02\x6f\x4f\x7c\x10\x8f\xa3\x5b\x95\x93\xc9\x9e\xa2\x9c" + - "\x41\xb9\x2e\x1c\xc2\x37\x3e\xb5\xd4\xb6\x26\x42\xe7\xc8\xaa\x4f\x7f\x75\x18\x58\x69\x61\x0d\xbd\xf9\xfb\x0e\x71" + - "\xae\x05\x18\xda\xef\x20\x82\xb8\x99\x66\x7c\x5a\x45\xa2\xaa\x8d\x89\x36\x76\x76\xd4\xb6\x9f\xc6\x99\x3f\xe8\x09" + - "\x9d\x1e\x4b\xac\xeb\x24\xf0\xe7\xb6\xbc\x2b\x0c\x35\x42\x89\x69\xb1\xaf\xcc\x2d\x87\xe9\xf6\x0f\x0e\x76\xc5\x8b" + - "\x77\x56\xe6\x81\x79\x73\xf8\xfc\xb4\xe7\x80\x08\xf7\xee\x1f\x3c\xf9\xea\xeb\x27\xce\x8f\x1b\x81\x7a\x6c\x79\x0e" + - "\x86\xf5\x61\x96\x74\x55\xf9\xb7\x43\xba\x5d\xb7\xc4\xb7\xc0\x74\x13\x94\x7a\xcf\x5d\x6b\xe8\x48\xb2\x1f\x86\x95" + - "\x52\x7d\x6d\x59\x49\x80\xcd\x7e\xde\x0f\xc2\x2d\xe3\x2b\xdf\xef\x1b\x8f\xd2\xda\x05\x04\x44\x3f\x3e\x0a\xaa\x8e" + - "\x2b\x52\x6f\x5a\x91\x81\xf4\xc7\x8d\xa5\x8b\x90\xd6\x4a\x85\x12\xba\xd6\x30\x20\x65\xb4\xfd\x62\x95\x59\xe4\x57" + - "\x13\xe0\xb5\x42\xbc\x62\x47\x64\x5a\x78\x69\x60\xac\x99\x90\x2d\x3f\x76\x39\xa2\x33\x55\xa0\xe0\xd6\x0d\x61\x30" + - "\xcc\xc6\x0f\x84\x28\xfb\x27\x73\x7d\xab\x34\x7b\xcf\xdb\x86\x18\xc7\x31\x44\xc6\xc7\xb4\x35\x56\xd2\xa6\xe4\x0e" + - "\x7d\xd6\xb1\x81\x6a\x9a\xbf\xef\x91\xe6\xbb\x42\xf1\x17\xac\xa1\x3e\x5d\x82\x5e\x2e\x8d\xae\x6a\x54\x57\x12\x45" + - "\xe8\xb3\xb2\x9c\xab\xf8\x07\x8c\xe6\x1f\x1e\x0e\x15\x78\x3c\xdb\x92\x3b\xed\xa0\x62\x43\x95\x78\x3b\x23\x1b\x90" + - "\xee\x3c\x57\x95\xa9\x57\x39\x58\x40\xff\xe1\x3e\xfc\x07\xf0\xbc\x31\x51\x22\x6d\x97\xfd\x8a\x6b\x80\x74\x8d\xd0" + - "\x75\x70\xcb\xb1\x5c\x2a\x04\xd3\xd9\x43\x63\x1b\x46\xad\xae\x4e\x95\x46\xb2\xec\xac\x06\x0b\x9d\x92\xd6\x24\xc8" + - "\x3d\xd7\xa1\x48\x0d\x54\x3f\xcf\x7c\xb5\x33\xd3\x44\x9c\x2a\x01\xe4\x6e\xf1\xe0\x48\xd2\x07\x1d\x4a\xbd\x97\xd5" + - "\x77\xd1\xb7\x60\x63\x09\xf6\xb6\x3b\x6b\x56\xfb\x54\x88\xa4\x75\xff\x46\x57\x61\xd7\x65\xbf\x72\xec\xf3\x6d\xdd" + - "\x75\x5b\xf6\x7f\xa0\xcf\x09\x3b\xae\x26\x9e\xbf\xcb\x0a\x57\x12\xa5\x82\xc9\xaa\x6e\xca\x85\x14\x0e\xda\x93\x2c" + - "\xc9\x17\x77\x78\x20\xfb\xf6\x1f\xea\xfb\xcf\xec\xbf\x5b\x19\xd0\xf2\xcd\x75\x45\x46\x0c\xd7\x7f\xe6\xab\x41\xe9" + - "\x43\xba\x1e\xe1\xdf\x2e\x83\x6c\x4f\x04\x5f\xcb\x2a\xc5\xdb\xe8\x94\x47\xce\x13\x3b\x1f\xa1\x9b\x35\x1a\x02\x21" + - "\xe2\x82\x53\x2a\x97\x2e\xe2\x74\xcb\x49\x5c\xc0\x88\x2d\xb2\xd9\xbc\x79\xc0\x9c\x16\x56\x00\xdb\x43\x7b\x1d\x60" + - "\x0a\x32\x13\x7e\xcc\x44\xac\xbd\x45\x90\xf8\x05\x5b\xc4\x77\x95\xd2\x30\xb7\xe5\x3a\x14\x0f\xcb\x25\x20\x00\xa2" + - "\x92\xbc\x74\x9f\x61\x77\xd8\x13\x02\x2e\x20\x02\x91\x49\x75\x3d\x47\xbf\x15\xd1\x4f\x40\xc9\x1e\x86\x5a\x4a\x18" + - "\x1f\xda\x1c\x96\x4b\xe7\x85\x2c\x04\xf1\xe1\x70\xf8\xf0\x16\xd2\xef\x77\x50\xa8\xeb\x87\x16\x1e\x0e\x87\x43\xf5" + - "\xaa\xa0\x13\x56\x9b\xd0\xae\x20\x26\x58\x7d\xd0\x80\xbd\x98\x5f\x7f\x70\x1f\x93\x9f\x99\x1d\xc7\x20\x80\xc8\xcb" + - "\xeb\x78\x25\xa7\x50\x95\xfb\x72\x55\xb0\xb0\xc3\x53\x33\x0c\xf5\x97\x8e\x3f\x48\xf6\x12\x44\x92\xdf\x3b\x60\x8c" + - "\xd1\x8d\xbb\x7d\xd3\xcd\xd7\x72\x37\x0c\xee\xc1\x01\x25\x36\x26\xc7\xda\xae\xf0\x4d\x2e\xe2\xef\xfb\x5b\xe5\x0c" + - "\x61\x7d\xb8\xfb\xbe\x6e\x8b\x20\xf1\x8d\xfd\xb1\x15\x14\xd6\x96\xda\xfe\xb9\x32\x2b\xd3\x66\xd5\x2d\x3b\x11\xca" + - "\x03\x76\xf7\x43\x61\x29\xf1\x07\x39\x7f\xc8\x39\x8b\x50\x21\x6f\x6e\x54\x32\xbd\xb2\x0c\xc8\xae\x4a\xe0\xc3\x04" + - "\x67\x11\x7e\xf3\x19\x8a\x59\xd7\x86\xfd\xee\x1c\x71\x58\xda\xbd\xb1\x5a\xaa\xd4\xe0\x87\xe7\xd7\x96\xc6\xa3\xed" + - "\x6b\xd5\x28\x48\x13\x8d\x09\x1c\x39\x53\x3d\x44\x16\x6b\x95\x97\xe5\xc5\x6a\xe9\xef\xbd\xd0\x9e\x8f\x9e\x30\x58" + - "\xa5\xcf\x9a\xe0\x2c\x21\x54\xd8\x6f\x91\x76\xaf\x43\x79\x08\x27\xac\x95\x85\xd1\x16\xdf\x18\x84\x08\x75\x12\x22" + - "\x95\x74\x6d\x08\xb0\x59\x69\x23\xb8\x9e\x9e\x9e\xc5\x61\x5c\x34\x33\xdd\x8b\xc8\x43\xa0\xc5\x91\x4b\x73\xe8\x9d" + - "\xcb\x78\x74\xd4\x7f\xf8\x33\xac\xc5\x21\x0d\x55\x8d\xc3\x8b\xc3\xfe\xcb\x3c\x69\xe0\xe9\x8b\x8f\x09\xee\x15\x9f" + - "\xcf\xcb\xf2\x42\xf8\xf7\x7d\x80\x22\xdf\xdb\x87\x5d\xad\x14\x98\xf5\xb2\x4d\xf9\x39\x19\x88\xe9\xe8\xa0\xc7\x3d" + - "\xb8\x27\x03\xa7\xd4\xf4\x8a\x46\x07\x50\x27\xf0\x33\x1d\xb0\x2f\x0f\x81\x2c\x93\xe3\x08\x06\x84\xd7\xa6\x68\xb2" + - "\xc2\xe4\xf7\x84\x33\x31\xb0\xd4\x59\xe1\xb0\x99\xbc\x77\x71\x6b\xc0\x87\xf1\x44\x11\xf4\x61\x97\x7b\x32\x6f\x72" + - "\x84\x9c\x6d\xf5\x00\xb3\x55\x62\x1c\x47\x30\x14\xe0\x6d\xce\x0d\x6b\xa9\x46\x23\xa5\x57\x4d\xb9\xd0\x4d\x36\x81" + - "\xfb\x98\xc7\x29\xc4\x4f\x0f\xd4\x7a\x25\x60\x50\xb1\xe7\xab\x02\xfb\x1e\x0d\xb1\x75\x51\xa3\x9e\x76\xb5\x24\x20" + - "\xf8\xba\xa1\xee\xd4\x4d\xb9\x14\xf1\x09\xde\x1e\x00\xcb\x0e\x38\xc6\x14\xc3\x2c\xdd\x99\x07\xaa\x00\x60\x37\xdc" + - "\x1b\xed\x14\x1b\xdb\x72\xb3\xed\xec\x70\x39\xea\x3a\x56\x0d\x0c\x37\x00\x58\xf4\xba\xa2\x1b\xed\xdd\x67\x2f\xd9" + - "\x22\x35\x98\xf5\x7d\xb9\x3a\xcf\x41\xdd\x5f\xd4\xab\x05\xf2\xd0\x7b\x6a\x66\x0a\x53\xe9\x06\x52\x6f\xf9\x8d\xe9" + - "\xd2\x6f\x95\x95\x43\x8b\x97\x08\xbd\xe8\x0a\x29\x76\xf2\xed\xe7\xcf\x9e\x32\x10\xce\xf0\x29\xd3\x44\xf8\x12\x09" + - "\x63\x4b\xe1\x12\x33\xcb\xa1\x86\x2c\x24\x3f\x70\x59\xe1\xcc\x10\xfa\xe3\x1d\x40\x64\x1b\x20\x5c\x36\xa9\x65\x4e" + - "\xc3\x6e\x27\xd8\xa5\x33\x2f\x1a\x76\xdd\x37\x9d\x7a\x9b\x16\xad\xea\xbe\x6a\x6a\xd3\x34\x60\xf1\x79\xd4\xa1\x61" + - "\xde\x0c\xec\x4b\xfc\x99\x2d\x70\x28\x2f\x25\xa2\x77\x18\x57\xd5\x98\xaa\xe3\x50\xb6\xee\xef\xa7\xdc\x89\x48\x86" + - "\x0e\x89\x24\xe5\x55\x0e\xc8\x50\x14\xab\xdd\xd6\xdb\xfb\xec\x64\xa4\x0d\xbe\x8d\xdf\xdd\x4c\xa0\x29\x6f\xa6\x98" + - "\x40\xc9\xa2\xb9\xfc\x0a\x78\x72\x9c\x67\x24\x7c\x1c\x10\xd4\x80\x1e\xfb\x4a\x63\x25\x54\x48\x44\x76\x76\xb0\xa6" + - "\xd3\xfd\x33\x5c\x8b\x2e\xfa\xd8\xa6\xd9\x51\xf5\x31\x5b\x85\x16\xc9\xf6\x8d\x26\xcf\xd2\xdd\xbc\xd1\x9d\x8d\x8a" + - "\xc6\x80\xaa\xfd\xf7\xa7\xb6\xc7\x15\x8a\x7b\x74\xe0\x4c\xc5\x1f\xc9\x69\x3f\x44\xda\x72\x40\x48\x10\x48\x03\x15" + - "\x70\x4c\x98\xa9\x1a\x9d\x61\x9e\x6b\xfc\x52\x57\x06\xb4\x08\x56\xb8\xea\x4d\xaf\xec\xa5\x65\x89\x0e\x34\x77\xee" + - "\x52\x9c\xf4\x21\x95\x56\x0b\x62\x0b\x37\x82\x00\xda\x02\xd8\xc4\x05\xb9\xd9\x22\x9c\xcc\x11\x84\xa7\x33\x14\x41" + - "\x57\x3c\xa8\xd7\x92\x82\x46\xef\x88\xd3\x15\x92\xf6\xb0\x95\x1b\x95\x11\x10\xba\x2e\x6c\x0f\x1a\x82\xad\x4b\x8e" + - "\x2a\x95\x80\x6e\x18\xa8\xcc\x8d\x5a\x7a\xe3\x3a\xd0\x32\xc3\xff\x2e\x82\x60\x67\xa3\x83\x1e\xb4\xed\x1c\xb7\x70" + - "\x48\x5d\xb6\xfd\x66\xb1\xec\xe6\x61\x6d\x9f\x41\x83\x39\xe8\xa2\xf4\x3c\x16\xec\xfc\x62\x09\xde\x6e\x8b\x25\x5e" + - "\x64\x7e\x72\x60\xb6\x28\xac\x1f\xda\xa2\x9b\x0e\x20\xc9\x1d\x06\x5e\xe4\x45\xc0\x2b\x41\x57\xa1\x44\x8a\x68\x47" + - "\x49\x3a\x32\x0d\xbe\xd8\xc5\x6a\x01\x69\x99\x4e\x77\xf7\xce\x8e\x7b\xc7\xe3\xf7\xe9\xc3\xf7\xc3\x9b\xfe\xfb\x74" + - "\xb7\x77\x3c\x3e\x35\x2f\xcf\xe0\xc5\xfb\x74\xf7\xa6\x3f\xea\x0f\xeb\x72\x55\x4d\x8c\xb3\xcf\x4f\xea\xfa\x25\x18" + - "\x79\xc1\x47\x24\x79\x57\x2e\x93\x81\x4a\x7e\xb2\xc2\x9f\xfd\xf1\x6d\xd9\x34\xe5\xc2\xfe\xfa\xc1\x4c\x9b\x84\x9c" + - "\xa0\x40\x39\x5f\x7f\x9f\xa5\xa9\xe9\x8a\x0e\x33\xb9\x70\x87\x75\xe5\x50\xa0\x3c\x37\x1c\x80\x0c\x7c\x10\x6e\xe0" + - "\xfb\x98\xbd\xcb\x55\xc4\xde\x9b\x00\x04\x0d\xe9\xa3\x6a\x33\x10\x49\x52\xd1\xc5\xa8\x36\x93\x52\x40\xdd\xde\xfb" + - "\xcc\x99\x07\x4c\x6e\x37\x81\xfd\x43\x4e\x26\x6b\x2b\xfd\xc5\x9b\xa4\x59\xbd\xcc\xf5\x35\xeb\xa1\x93\xa2\x2c\x4c" + - "\x02\x01\x45\xad\x34\xc7\xa0\xc4\x07\xbf\x88\x17\x2e\x22\x5f\xd8\xb7\xdc\xbc\x54\x10\xa2\xaa\xcf\x73\xd2\xf6\xab" + - "\x1e\x98\xb5\xe1\xe9\x79\x79\x75\x53\xe9\x34\x2b\xfb\x7f\x18\x65\xde\x09\x22\x26\x81\x80\x46\x49\xa9\x79\xed\x3e" + - "\xe5\xc0\x5f\xf4\xaf\xe1\xe6\xbf\xa3\x12\x74\xe8\x53\xf0\xc0\xe0\xcf\x86\x7a\xb9\x34\x45\x0a\xe9\xe9\x7a\x71\x0d" + - "\x2f\x71\x22\x7b\x76\xfc\x97\x60\x62\x80\x1a\xb2\x62\xb9\xea\x68\xcf\x97\x86\x02\x09\x5f\x2c\xa3\x91\xba\x7f\x70" + - "\xf0\xe8\xe0\x4b\xb5\xc7\xa1\x52\x90\xc2\x99\x62\x74\x1d\x2a\x05\x7a\xf2\xd4\x22\xe0\x1c\x0a\x80\x97\xa9\x37\x92" + - "\x4b\x53\xc5\xcf\x10\x66\x5c\xdb\x5a\xd5\xb3\xe5\xb2\x56\xbd\x9f\x7f\x7e\xd6\xc7\x42\xff\xb0\xd5\xfd\x03\x74\xbc" + - "\xff\xb0\x47\xf4\x1f\xa8\x7f\xb0\xb2\xbf\x33\x6f\xc3\x6d\xf9\xf3\xcf\xcf\x20\x4d\xee\x72\xd5\x04\x2f\x7b\x2a\xb1" + - "\xdf\xd9\x2d\x0d\x4b\x41\xa7\xba\xb3\x20\x75\xd4\x96\xe5\x9f\xb7\x94\x06\x57\xbb\x81\x4a\xfc\x14\xa5\x96\xd5\x93" + - "\x0b\x81\x53\xec\x27\xd0\x0d\xf9\x44\x4f\x75\x95\xa9\xcf\x87\x07\x03\x95\xbd\x3d\xc1\x1f\x1c\xbd\xf2\x64\x78\xe5" + - "\xff\x78\x34\x7c\x8c\xdf\x96\x61\x88\x1a\xd8\x92\xf3\xb2\xf0\xd3\x8b\x38\x7d\x93\xb2\xaa\xcc\xa4\xc9\xc1\x39\x4c" + - "\x26\x7c\x26\x77\x94\x21\x14\x7f\x0e\x5f\x1e\x29\xdb\x63\xa8\xe5\x4d\x99\x1a\x86\x1e\xe9\x78\x62\x05\x08\x18\xd3" + - "\x90\x5a\x73\x43\xf2\x56\xef\xc6\x5c\x35\xba\x32\x1a\x95\xf8\x7c\x00\xfa\x7c\x0f\x02\x40\x0e\x01\x55\x2e\x4d\x95" + - "\x5f\x63\xf7\xd3\x68\x66\x5e\xbd\xfc\x7a\x8f\x6d\x57\xb6\x77\x59\x51\x98\xea\xfb\x77\xaf\x7f\xb0\x8c\xe1\x53\x6e" + - "\xe3\x9b\xab\xa7\x23\xf7\x1b\x98\x45\x1e\x5e\x51\xc2\xd8\x9e\xd3\xa4\x1c\xa9\xed\xed\xee\x41\xfa\x21\xc9\x0e\x42" + - "\x16\xbc\x1e\xd3\xda\xba\xa9\x3c\x1f\xe8\x32\x3a\x85\x99\xf9\xed\xff\xb8\xf1\x69\x39\x59\xd5\x59\xf1\xed\xea\xfc" + - "\x1c\xe1\x8f\x93\xb2\xa0\x67\x89\x5d\x0f\x0c\xa8\xa7\xcf\x2e\x75\x75\xef\xb3\xad\xea\xc2\x5c\x43\x74\x3d\x38\xc4" + - "\x5c\x98\x6b\xf2\x7b\x29\x57\xb5\xf1\xcf\x7b\xc7\x63\x78\x72\x03\x7e\xb8\xa6\xba\x21\xa8\xae\x85\x29\x56\xfd\x9b" + - "\x49\x9e\x4d\x2e\xf0\x3b\x68\xed\x75\x59\x2d\xe7\xfc\x1d\xb5\x0f\xff\xdc\xc0\x7f\xcb\x55\x73\x9e\xaf\x2a\x76\xb1" + - "\xb1\xa3\x02\x95\xe5\xd2\xb9\xe5\x9c\xfe\x7d\x78\xf6\xb0\x6f\xef\x96\x61\x6f\xb8\xdb\xbf\xe9\xff\x61\x14\xba\xdc" + - "\x20\x89\x7d\x57\xad\x0c\xd1\xb0\x30\xf1\xfb\xc7\x8e\xc2\x90\x1b\x27\x2c\xcd\x19\x6c\xc2\xe2\xb5\x9e\x9a\x67\xe0" + - "\xe5\xce\xa4\x08\x3f\x72\x0e\x29\x7c\x59\x3a\x80\x04\x59\x18\xa8\xb3\x0f\xe5\xaa\x40\x22\x50\x1f\xc3\xac\x7a\xdf" + - "\x03\xb6\xa0\x40\x68\xb1\x14\x64\xa1\x0b\x3d\xcb\x8a\x19\x41\xa9\xa8\xbd\x3d\x90\x49\x97\xba\x6a\x38\x7f\x14\x89" + - "\xa4\xb0\x04\x53\x3d\x31\x43\xcc\x2f\x57\x95\x4b\x82\x30\xd3\x85\x7a\x99\xae\x75\x95\xd6\x0f\x14\xc3\x26\xa8\x3c" + - "\x3b\xaf\x34\x85\x3b\x41\xb4\x3d\xd5\x96\xa5\x46\x63\x9a\x3a\x1f\xbe\x6b\x68\xc9\x51\xe1\x30\xcb\xcb\x73\x9d\x8f" + - "\x31\x84\xb0\x9d\x11\xda\x4b\xae\xf5\x80\x21\x55\x38\x86\x2b\xcc\xf7\xc9\x0c\x26\x16\x7a\x7b\xfe\xcb\xab\x62\x80" + - "\xe3\xc4\x20\xa3\x81\x67\x3d\x71\xf4\x03\xd5\x0c\x7c\x69\x52\x28\x2d\xcd\x24\xd3\xb9\x6b\xca\x89\x33\x6e\xf7\xd4" + - "\x56\x02\xcf\x66\xf6\x26\xf4\x9c\xe9\x0b\xa1\x86\x0f\xd9\x2f\xe9\x91\x8e\x49\xe4\x31\x69\x03\xaf\x40\x53\xaa\xa2" + - "\x84\xcf\xad\x38\x64\xae\x9a\x11\xc1\x7e\x50\x38\x68\xef\x7c\xd5\x50\x4c\x05\xba\x05\xb3\x83\xfd\xbd\x20\xd1\xf9" + - "\x0b\xa9\x4c\xec\xc4\xed\xb1\x82\x37\x24\x62\x2a\x30\x8d\x7d\x56\x88\x60\x6b\x48\x03\xe6\xec\x39\xf6\x5d\x9e\x99" + - "\x15\x2f\x22\xcd\x85\x6b\x91\xfe\x1e\xce\x23\xbc\x1d\x31\xf3\xea\x88\x4b\x1d\x8a\x57\x95\x7b\x0c\x85\x86\x41\x11" + - "\x91\x51\x55\x96\xe1\xc7\xd1\x70\x04\x4d\x66\x5c\x25\x6e\x03\xe3\x4b\x29\xb7\xcf\xab\x17\x03\x84\x1a\x83\x34\x6b" + - "\x45\x3a\xe2\x3c\x66\x8d\x77\x4f\xc2\x69\xe4\x51\xcd\x56\x59\x1a\x0d\x89\x1e\x3a\xe1\x64\xc6\xd1\xa4\x01\x30\x52" + - "\x91\x11\xf8\x01\x9e\xd2\x07\x35\x41\x9e\x58\x0a\x3b\x69\x40\xf4\x2d\x52\x70\xd0\xf4\x1b\x59\xa8\x89\x5d\x5a\x75" + - "\xdf\xa5\x1e\x6d\x12\x74\x03\x81\x38\x56\x7c\xe2\xe5\x96\x4d\x25\x82\x10\xc9\xb0\x3e\x82\x85\x11\x9f\x60\x77\xa2" + - "\x4a\x37\x15\x0b\xb9\xe3\xc0\x44\xfb\x02\x3d\x77\xd1\x6b\x0d\x59\x59\x9c\x02\x90\x2e\xe5\xf1\x67\x20\xa6\x1e\xd8" + - "\xb6\x5d\x05\x98\x16\x91\x33\x62\xc6\xc8\x3e\x5a\x2d\xf5\x0c\x2d\xe6\x2b\x00\x76\x61\x43\x29\x53\x66\xbc\xbb\xc8" + - "\xde\x6d\xc5\xaf\xe0\x72\xf3\xc0\x83\x41\x17\x28\xde\xc6\x00\x16\x88\x73\xcb\x0e\x4a\x5a\x9e\xda\x52\x5b\x06\x21" + - "\x47\xa2\x14\x82\x5f\x46\x39\x37\x3e\x46\xbb\x83\x66\xd3\xb9\x4b\xd0\x2a\xf9\x98\x88\x73\x40\x25\x65\x4f\x72\x20" + - "\x78\xce\x78\x01\xc9\x28\x92\x44\xf5\x37\xb9\x86\xdb\x97\xa8\x87\x6f\xe8\x0e\x0f\x1c\x6a\x58\x60\x6c\x5a\x02\x63" + - "\x78\x33\x0e\xcd\x95\x99\x50\x93\xa7\xcd\x19\xfb\x9d\x07\x92\x2a\x13\x3f\xdb\xce\x62\x79\x7a\x40\x6f\x3d\x7d\xc4" + - "\x5e\x2f\x96\xa7\x8f\xce\x5c\xb7\xeb\x65\x9e\x59\x76\x7b\x08\x7f\x94\x55\xd3\x8b\x3c\x2a\x2a\xa3\x1e\x2e\x56\x75" + - "\xf3\x10\x02\x6e\x99\xe6\x96\x44\x2c\xc1\xdb\x9e\x1b\xd8\x83\x40\x07\xa6\xcf\x5e\x7a\xdd\x96\x2a\x12\xc4\x39\xcd" + - "\x0a\xc6\x23\x15\x5a\xe3\x57\x53\x86\x22\x02\xcb\x5d\x0d\x39\x56\xb0\xc1\x15\xfb\x3b\xe3\x2d\x10\x02\x79\xb1\xc6" + - "\xca\x38\xff\x46\x52\x93\xb8\x5b\x43\x80\x0e\xc0\xb6\xa1\xc7\xa4\xab\x24\x5f\xf7\xc3\xa0\x27\x8e\xe8\xd1\xe6\x19" + - "\xf8\x38\xb9\xa8\x17\x7a\x99\xb1\x42\x85\xc3\x13\x08\xc7\xd8\x75\xc3\x19\xbc\x5c\xad\xc7\x5c\xc9\x30\x35\xb9\x99" + - "\xe9\x06\x25\xb8\xb1\x7b\x7c\x9e\x15\x29\x62\x4b\xd8\xde\x91\x5a\x82\xfb\x47\xc0\xb5\xdc\x0f\x17\xf9\x84\xd1\x97" + - "\x95\x01\x07\xd0\x7f\x73\x0e\x1c\xa9\x07\xb6\x59\xd7\x35\x5b\x5e\xe3\xd9\x0f\x6f\x18\x89\xef\xe0\x54\xb9\x34\x05" + - "\x63\x9c\x27\x7c\xc0\xdb\x75\x1c\xdd\xda\xe4\xaf\x27\x9c\x80\xa8\xa1\xb1\x23\xce\xf8\xd8\xd2\x7a\xf7\x0c\x28\x3f" + - "\x03\xa4\xd3\x24\x8f\x7d\x82\x6e\x7c\x61\xa5\x37\x86\x00\x1d\x07\x79\xc0\x3d\x24\x45\x85\x27\x79\x28\xcb\x92\xc3" + - "\xae\xe7\x6a\xb8\x3e\xde\xf9\x63\xc1\x85\x0c\x7f\x29\xb3\xa2\x97\x0c\x13\x74\x67\xfb\x38\x90\x97\x66\x60\xb1\xf4" + - "\xf7\x52\x00\x4b\x47\x46\x28\x06\x14\x0d\x6e\x1f\xbe\x2e\xdc\xce\x3f\x22\x7a\xc5\xcb\x28\xf4\x66\x1b\xcb\xc8\xc4" + - "\x4e\x5c\xc8\x6d\xc3\xe7\xa4\xfc\xdb\x97\x0a\x62\x70\x8d\xb6\x67\x30\x46\xe3\x62\x38\x89\xe0\x44\xd4\x6e\x28\x51" + - "\xf2\x5c\xaf\xe8\xe3\x5d\x5e\x9b\x66\xb5\x84\x8c\x3f\xf2\x41\x60\xfb\x41\x8e\x52\x72\x79\xf2\x12\x94\x19\x31\x85" + - "\xf3\xa2\xf3\x84\x6c\x75\x58\x38\xff\x75\x16\x60\xe5\x68\xc0\x9f\x4a\x7c\xb1\x38\xc5\x8f\x0b\xf6\x01\x20\x7c\x1a" + - "\x86\x4e\x85\xd7\x80\x78\x18\x8c\xcc\x9f\x99\x48\x7d\xbe\xed\xde\x0c\x3b\x79\x1f\x71\xdc\x86\x11\x1f\x24\xff\xec" + - "\xf4\x1a\x64\x4c\xd6\x32\xe2\x88\x78\xc9\x30\x15\x0e\xef\x86\x1a\x05\xf9\xb2\x10\xbb\x2f\x4e\xe6\x2f\x36\x11\xa7" + - "\xa4\xeb\xde\x55\xbb\xbb\x00\x21\x13\x0e\xbb\x65\xec\x76\xdf\xa2\xb9\xbb\x5d\xda\x0f\xe4\x4f\x41\x6e\x6b\x74\x84" + - "\x73\x3b\xf0\x12\xce\x55\x85\x3e\x3b\x96\xd1\x1c\xa0\xff\x1c\xb2\x3d\xcb\x26\x5b\x64\xbf\xfa\xb0\xb6\x80\x34\xa2" + - "\xe4\x23\x8e\x4b\x04\xbd\x25\x01\xe3\x41\x64\x70\x8c\x51\x59\x61\xfc\xed\x94\xfb\x01\x8a\x47\xef\x45\xd8\x19\x51" + - "\xda\x2d\x49\x39\xda\xa5\x16\x7a\xb9\x34\x70\x19\xd4\xa1\x40\xf5\x0b\x4a\x3c\x30\xb9\xff\xab\x42\x54\xec\x91\x4f" + - "\x6e\x33\x9b\x24\xac\x48\x1a\x02\x0c\xa5\xbb\x19\xe8\x4e\x61\xe9\x6d\x31\x41\x95\x9b\xb1\xf3\x6e\x3b\x3f\xf4\xea" + - "\x03\x32\x90\xd4\x87\xb8\x72\x84\x12\x52\x2e\xb2\x86\xc0\x08\xfe\x3f\xc5\xbc\xfd\xb9\xb0\x3c\x84\xbf\xb0\x6b\xd5" + - "\x2b\x0b\x42\x47\xe1\x6a\x41\xce\x61\x18\x81\xbe\xe3\xa3\xfc\x6e\xed\x66\xe1\x10\xff\x02\x9e\x65\x05\xd7\xde\xb2" + - "\xe4\xe1\x61\x0a\xcd\xc3\x64\xe9\xc0\xb9\x50\x8d\x3a\xeb\xdc\xf1\x1d\x5e\xcf\x1b\xd8\xc6\xdf\xc9\xdc\xfc\x07\x79" + - "\xb1\x5b\x6f\x58\xb9\xc0\xb0\x23\x68\xe5\x76\x76\x20\x30\xf1\x27\x33\x7b\x79\xb5\xec\xa9\xa4\xf7\xf7\x9b\xf7\xef" + - "\x87\xfd\x44\xed\xb6\x39\x88\xf7\xef\x87\xbd\xe3\xf1\xf0\xe1\xfb\xf7\xc3\x9b\x7e\x02\xde\x51\x3d\xfb\xfb\x0f\xfd" + - "\x24\x60\x23\x28\xd7\xa3\x8b\x7e\xf5\x60\xbc\x5b\x8e\x3a\xd8\xf9\xf1\xb7\x43\xdd\x19\x90\xfa\x8b\x0c\x48\x95\xfc" + - "\x1c\x7f\x75\xaa\x7e\xf1\x59\x66\x70\x5f\xf4\x02\xe2\x74\x73\x23\xf6\xf1\x91\xd0\x16\x0c\xdd\x63\x4b\x2b\x68\x97" + - "\x78\xc9\xde\x7e\x18\xde\x63\xc1\xc7\x74\xf7\xc9\x0f\xed\xa4\xda\xa5\x58\x2c\x89\x37\xf3\xa5\x3d\x39\xe8\x47\x1f" + - "\xb9\x05\xb7\xfc\x86\xd3\x69\x04\x4d\x6d\x2c\x92\x3c\x7c\x08\x86\xec\x8e\xa2\xfd\xd6\xbd\x2c\x6e\xc2\x5f\x38\x31" + - "\xab\xe4\x4c\x3a\x2b\x71\x6c\x49\xf7\xe5\xe9\xf3\xa2\x7e\x94\x55\xf1\x16\x25\xe5\x89\xa8\x26\x7c\x73\x0b\xe3\xb1" + - "\x99\xa5\xf1\x9b\x0b\x3c\x5f\xb2\x49\xc4\xa9\x02\x8f\x4a\xae\x51\xa9\xaa\xcb\x85\xe1\x14\x9f\xa9\x15\x11\x17\xe8" + - "\x45\x4f\x67\x04\xfc\x7b\xb9\xda\x9e\xbe\x2c\xb3\xb4\x56\xcb\xb2\x31\x45\x63\x0f\x30\xd0\x74\x5b\xb4\xae\x39\xc9" + - "\x72\x59\xa8\x74\x05\x91\xe9\xd0\x84\xce\xed\xbd\xda\x2d\x01\xf6\x3d\xa9\xf2\x7b\x7e\x67\xc7\xed\xb0\x76\x44\x4d" + - "\xc8\x87\x36\x46\x57\x69\xb9\x2e\x24\x2b\xca\xcf\x42\x4f\x24\xc9\x87\x46\xea\x97\x6e\x5e\xd4\x81\xc4\x3a\x98\xe7" + - "\xd0\x13\xb0\x55\x4b\xec\x46\x4d\x2e\x52\x21\x85\xe9\xc4\xf3\xfa\xc9\x3b\xa9\x71\x30\x2d\xc3\xc2\x16\xa5\xca\xcb" + - "\x62\x66\x2a\x60\x85\xee\x7d\x76\x2b\xe6\x92\x23\xe8\x51\xd4\x76\xd4\x55\xec\xc3\x26\x47\xa0\x04\x6b\x49\xda\x68" + - "\xf2\xa4\xde\x09\x58\xa0\x4b\xb0\x71\x22\xaf\x8f\xdf\x97\x45\x7e\xfd\x3d\x6f\x9e\x80\xed\xc9\x06\x6a\xb2\xaa\x90" + - "\xe1\x51\xe7\x60\xee\x78\x87\xf2\x77\x81\x53\x3a\x27\xb6\x9d\xd9\x1d\xcf\x15\xfd\xa8\xc1\x1f\x11\x9d\x06\xc0\x4d" + - "\x8a\xf1\xc4\x29\xba\x8b\x6e\x87\xb9\xae\xdf\xfa\x95\xc7\xce\xa1\x29\x0f\x22\x36\x49\x4d\x85\xb7\x04\xbe\x6e\x5f" + - "\xd7\x9d\x75\xb8\x12\xb2\x22\xcf\x29\xe0\x8d\x6e\x85\x47\x35\xc6\x1b\xc4\xd6\x3b\x59\x55\x78\x85\x70\xd8\xd9\x51" + - "\xab\xff\xb1\x2e\x3b\x2d\x79\x15\xed\x9d\xcf\x99\x5a\x03\x0d\xf6\xbd\xcf\x36\x86\x8c\x3d\x66\x93\x76\xf8\xf8\xab" + - "\xdb\x79\x33\xb0\xef\x8c\xce\xf3\x55\x65\x8f\xfe\x12\x43\xd8\xc9\x02\x34\x2a\x57\xcd\x21\x3b\x1a\x75\xa5\x15\x5f" + - "\x50\xfa\xf0\xa2\x5c\xbb\x8e\x09\x83\x12\x91\x79\x62\x1f\x36\x68\x0b\x6f\xe3\x1d\x9d\x13\x88\xf7\xfb\xb6\xb3\xfc" + - "\x8d\x0c\x08\x1b\x8d\xd4\x1b\x5e\x8a\x54\x51\xbd\x87\x0e\x6a\x42\x55\x66\x66\xae\x96\x76\x54\x70\xd9\x12\x0d\x62" + - "\x36\x08\x77\x1d\x65\x3b\x09\x76\x02\x34\xeb\x97\x36\xe0\x43\xc4\xb5\x1f\xf8\x85\xca\xe7\xcc\xd9\xd1\x81\xc7\x6d" + - "\xce\xf5\xba\xe1\x8c\x93\xbe\x7a\xaa\xf6\x2d\xd9\x4b\xca\x22\x21\x2e\xeb\xf0\x56\x3b\x03\xcf\x24\xda\x8a\xd8\x91" + - "\xf1\xad\x77\x68\x44\x17\xe9\x42\x0e\xd5\x47\x3d\xb3\xbd\x08\xfe\x3d\x8d\x71\x3d\xcf\x48\x65\x8b\xa5\xd0\x7b\xcd" + - "\x32\x3f\xb2\x49\x96\xb6\x49\x41\x4c\x15\xca\xb0\xb4\x9d\x1d\x7a\xda\x91\x86\xe0\x3c\x6b\x16\xba\xbe\x18\xab\x1d" + - "\x75\x80\xa0\x9d\xba\xc9\x2e\xfd\x9d\x73\xa8\x76\xd4\x23\x78\x41\x9a\xe7\x1e\x79\xf3\x5a\xfe\xb2\xef\x46\x30\xcc" + - "\x6a\xae\xf1\x28\x24\x3b\xc7\xea\x91\x1a\xab\xc7\x87\xbe\xa8\xb4\x55\x76\xe9\x7c\xba\x8a\x7e\xa8\x0c\x4f\x92\xf8" + - "\xfe\xd8\x4d\xc8\xbf\xcf\x0d\xf2\xec\x7a\x60\x66\xbb\xde\xb9\xd1\x05\x3b\xe1\x92\xde\x1e\x11\xca\x30\x20\x1c\xfd" + - "\x82\x55\x65\xf8\x46\x60\x7e\x1d\x42\xcf\x62\xcf\x27\x92\xe1\xf0\xc4\xe9\x6a\x66\x9a\xd0\x28\xc1\x0f\x8f\xbc\x2b" + - "\x8c\x30\x71\x81\xc5\x1f\xd2\xa7\x14\x93\x72\x01\xe8\x71\x1c\xce\xbc\xac\xcc\xd2\x10\xe4\x1c\x51\x49\x38\x70\x8c" + - "\x8b\xe1\xb2\x35\x54\x33\x97\xb8\x3c\xc4\x04\xa0\xac\x90\xd0\x97\x53\x1a\xe9\x19\x4d\x49\xcb\xcf\x9e\xee\x18\x5f" + - "\x4e\xec\xab\x67\x08\xbd\x1f\xea\xb2\x9a\x52\xa5\x95\x5e\xab\x72\xd5\xd4\x59\xca\x39\xcd\x0b\xa4\x9f\xbf\x5b\xfc" + - "\xc0\x69\x0c\x36\xd9\xce\x8e\x67\x39\x68\x1b\xb6\x1f\x85\x06\x0e\xf2\x81\x6d\xb3\x1b\x9d\x74\xd9\xa1\x39\xd3\x98" + - "\x97\x55\xb9\xd4\x33\xc4\xcc\x00\x2c\x0d\x4b\x09\xd2\x4b\x5d\x58\x79\x70\x69\x2a\xf5\xf3\xe3\xe7\xce\x0c\xb2\x34" + - "\x13\xd5\xbb\xff\xf5\xd7\x9f\x1f\xf4\xa9\x3a\x74\x30\x80\x8d\x55\x8a\x8c\x21\x0d\xf8\xe0\x30\xc0\xff\xa1\x5a\x03" + - "\x89\x44\x80\x5b\x54\xa8\xa8\xc0\xa3\x49\xd9\xab\xbc\x77\xff\xeb\x2f\x1f\x3d\xe9\x6f\x9e\x19\xc7\xa1\x15\x25\xb5" + - "\x6b\x1f\x3a\xb6\x05\xbd\x77\x9c\x1e\xc2\xfb\xca\x7b\xb6\x40\x1d\x75\x8b\x77\x81\x24\x47\x09\x31\x5a\xf7\x8d\xa8" + - "\x66\x97\x3d\x3d\xbd\x21\x03\xae\xe5\xc9\xaa\x1a\x2e\x75\x65\x8a\xe6\x4d\x99\x1a\xc1\x97\x39\x40\xf1\xc9\xaa\x82" + - "\xff\xb4\x0a\xfb\xaa\x1c\x73\x42\x5a\x2f\x5b\xba\xef\x9d\xfa\xf0\xcb\x96\xfe\x0b\xd4\xb2\x3a\x4d\x69\xce\x89\x1f" + - "\x9f\x95\x8d\x5c\x19\xd5\x33\xc3\xd9\x70\x80\xee\x04\x6c\xa8\x56\x60\xd8\x68\xf4\x64\x6e\x52\xf5\xe2\xed\x6b\xc1" + - "\x3f\x43\x73\x47\x47\x18\x33\x1b\x3a\xa1\x49\x86\xa3\xbf\xb9\xf3\x56\x2a\x63\xb7\x96\xcc\xac\x59\x50\xc3\x71\xe3" + - "\x8a\xd9\x67\xd4\xe9\x6e\x68\xda\xef\x32\x29\x3b\x94\x85\x20\x62\x76\xcb\xc2\x86\x21\x2d\xb5\x97\x60\x7b\x38\xc9" + - "\xae\x3f\xa7\xd9\xee\xee\x19\x68\xa7\xb6\x99\xd0\xff\xe8\xf7\xfe\x49\x53\x5a\xd1\xb5\x27\xb7\x8d\x60\xec\x8e\x54" + - "\x86\x79\xf5\x70\x90\x62\x27\x10\x2c\x47\x4b\x3b\xd0\xb6\xd3\xd0\xb5\x23\xcc\xf4\x5b\xce\x54\xdb\x8b\x55\x66\xc0" + - "\xd3\x7a\xae\x19\x89\x86\xea\x9f\x4a\x6e\xf3\xac\x43\xd5\x86\xdf\x61\xbd\xa1\xdb\xa8\x93\x4b\x02\xa1\x9e\x49\x09" + - "\x7c\x27\xa3\x89\xc4\xce\x7a\x13\x5c\xa4\x61\xc7\x89\xfd\xd8\xd9\xb1\x35\x9c\xf2\x9f\x67\xed\x76\x9d\xb8\x8c\x2d" + - "\x0a\x3b\x8b\x87\xed\xa6\xad\x1e\x6d\x26\x7f\x09\xdd\xd1\x65\x62\x60\x83\x6f\x3a\x64\x30\x2c\x40\x11\x32\x2f\x70" + - "\x6b\xf6\x3a\x62\xa8\x3e\xfa\x6b\x50\xb0\x58\x11\xc8\xf5\x79\x99\x5e\x73\xb4\x8d\x49\x39\xed\xa9\xad\xd2\xa5\x99" + - "\x4f\x01\x73\x45\xb2\xb2\x6d\xc2\xc6\x3b\x92\xba\xf3\x23\x57\x18\xec\x47\x54\xb2\x38\x22\xf8\x81\x1b\x12\x62\x2a" + - "\x3f\x73\x37\x84\x3f\x8d\xe5\xb2\xd7\x6f\x5f\x16\x5e\x29\xd2\xb1\x1a\x2d\x42\xca\x9c\xa3\xd2\xcc\x5d\xbd\x78\xfb" + - "\x9a\xd1\x43\xe9\x5c\xd2\xd5\xef\x61\xdc\xf4\x82\x5c\x31\xe1\x3f\xba\xf6\xa7\xd7\x47\x9e\x3a\x39\x25\x9c\x3c\x38" + - "\xec\x48\x1a\x30\x3b\xcc\x03\xc6\x53\xa5\x4b\xe4\x52\x57\x99\x06\x0f\xb7\x73\xa3\x7a\xf7\xbf\x38\xf8\x72\xbf\x2f" + - "\xf6\x82\xdf\x9d\x1d\x89\x35\xec\xe8\xdc\xa5\xdc\xff\xc4\xab\x44\xf4\xb6\x32\x7b\x8d\x4b\x81\xa5\xca\xe2\xbb\xb7" + - "\x6f\x89\x28\x81\x7f\xc4\x1a\xfd\x8d\xc1\x6e\xfd\xdd\xdb\xb7\xbd\xbe\xcb\x28\xb5\xe5\x09\x39\xf6\x41\x9c\x1a\xa9" + - "\xce\xb1\x45\x22\x0b\x95\x2f\x1b\xe7\xf0\x96\xfd\xa3\xed\x23\x7a\x48\x38\x8e\x6e\x3d\x88\xb7\xaa\x01\x0b\x71\xed" + - "\xb3\xac\x21\x61\x4b\x21\x19\xd1\xb9\x43\x3c\xdc\xda\x20\x62\x49\x0f\x79\xee\x1f\xf6\xce\x9d\xa7\xcd\x9f\x86\xbe" + - "\x8b\x9f\x3e\xea\x66\xb1\xdc\xa4\xa7\x8a\x43\x68\x24\x29\x90\x58\x40\xe4\x27\xd2\xd2\x39\xf8\x75\x66\xd7\x25\xad" + - "\x1c\xbc\x7c\x20\x1c\x39\x98\x00\x3a\x06\x46\x88\x4c\x52\x18\x0a\x46\x3f\xcd\xae\x7a\x91\xfc\x42\x1a\x8c\x5f\x06" + - "\xaa\x32\xcd\x80\x10\x29\xd2\x96\xa9\x86\x48\xef\x7f\x53\x38\xcf\x29\xa3\xcf\x54\xb3\x3b\x53\x07\x0b\xb5\x74\xeb" + - "\x92\xc1\xf8\x96\x3b\x6f\x19\xd0\x5f\x07\x36\xa3\x8d\x2c\x6e\xfc\x9d\xcc\xaa\xce\x30\x75\xd3\xec\x6a\xcf\xa4\xe1" + - "\x7c\x56\x1a\xa0\xab\x9b\xb9\x46\x22\xd2\xb3\xdb\x11\x5c\x48\xfa\xc1\x14\xdb\xaa\xec\xa8\x4f\xf7\xcf\xf8\x6e\x17" + - "\x42\x96\x63\xe9\x58\xfa\xa0\x7c\x91\x42\xe6\xa5\xa0\x4d\xf3\x82\xf6\x00\x44\x39\x39\x53\x07\xea\xaf\x49\x0c\xb5" + - "\xf2\x48\x6e\x20\x87\xd8\xb9\xce\x72\xcb\x50\xa5\xa6\xce\x2a\xa1\x31\x63\xb2\x2b\x2b\x14\xec\xba\x78\x4c\xcb\x83" + - "\x33\xce\x9b\xed\x77\xb3\xec\xd2\xcb\x22\xda\x13\xc1\x7a\x38\x45\x67\xab\x55\x6f\xed\x93\xb2\xce\x4f\xab\x42\x58" + - "\x79\xc1\xc1\xe0\xd0\x4e\xc8\x35\x98\xcd\xd6\xba\x60\xb0\x84\x65\x20\x2f\x9c\x9b\xc2\x58\x91\x61\x55\x6f\x60\xc1" + - "\x68\x3f\x7b\xb3\x01\xf4\xf6\x14\x92\xe9\x7c\x32\x2f\xe6\xae\x6c\x8a\xa1\x74\xab\x4b\xb5\x0f\x49\xc6\x44\x11\xcf" + - "\x75\xc2\xf7\x42\x9a\x2f\xf8\x1b\x61\xc6\x68\xf7\xe5\xd5\x62\x61\xd2\x4c\x37\xe6\x0e\x06\x51\xa8\x1f\x0c\xfb\xd0" + - "\x01\x6e\x39\x02\x2a\xab\x83\x3e\x9a\x9e\x8b\x52\x1a\xd9\xca\xca\x7d\xfc\x88\x0b\xf0\xdb\x5e\xdd\x57\x5a\xd5\xab" + - "\x73\x06\x6e\xfe\xe7\x4a\xe7\x68\x9f\x2f\x6b\xb4\x69\xce\x0d\x65\x5b\xc4\xf6\x7a\x80\x45\xeb\x00\x93\x65\x53\x7d" + - "\x09\x72\xb0\xdd\xa1\x87\xb8\xb9\x89\x15\x11\x1f\x2a\x73\x87\x0d\xc5\x5f\x84\x72\xab\x49\xdb\xd0\xdb\xf3\x5f\x0e" + - "\x83\x22\x24\xa0\xfb\x1a\x53\x4e\xd1\xb2\x45\x6e\x81\x40\x9c\x7a\xdd\x24\xa5\xc3\x6e\x44\xa4\xa5\xcf\x5a\x72\x67" + - "\x31\x12\x3e\x10\x3e\x11\xf0\x16\x33\x43\x72\xbf\x80\x5f\x60\xdd\x32\xc6\xd8\xbe\x6c\x82\x7b\x20\xfe\x2b\xe2\x49" + - "\x2b\xd3\x74\xab\xfa\xef\x60\x34\xdd\x7b\x7b\xaa\xc4\x3e\x13\x05\x3e\xde\x75\xcd\x05\x34\xad\xac\x9b\x3b\x89\x5a" + - "\x9b\x70\xc9\xaf\xb8\xef\x5d\x2f\xbb\xe8\x57\x47\xd0\xea\x86\x1b\x97\x4f\x5b\x87\x96\x7f\x1e\x68\xf5\xdd\x8d\x48" + - "\xd8\x4c\x60\x07\xfe\xd4\xeb\x30\xf6\x5a\xea\xb6\x9d\x51\x58\xa3\x17\x0e\x49\x59\x75\x28\xc4\xcd\x22\x75\xe4\x30" + - "\xa0\xb9\xa3\x91\xfa\x36\xd7\x93\x8b\xbd\x79\x99\x1b\x75\xf2\x97\x3f\xaa\xa7\xab\xda\x7c\x03\x69\x95\x34\xe6\xa7" + - "\x34\xa6\x56\xbd\xfb\x07\x8f\x0f\xbe\xda\x67\x1d\x09\xc2\xa0\x16\x65\xb1\x97\x9b\x69\xb3\x07\x31\x12\xc8\x69\x01" + - "\x2a\x6a\x01\xf2\xed\xb4\xbc\x52\xbd\xfb\x8f\xbf\xfa\xe2\xc0\x2b\x40\xc2\x01\xa1\x8c\xe5\x95\xf0\x3b\x3b\xaa\x47" + - "\xa7\xfa\x7c\xd5\x34\x65\xe1\xcf\xb3\x0f\x6c\x84\xc6\x12\x79\x70\x85\x22\x02\xb3\xcc\xda\x3b\xb2\x5b\x23\x61\x65" + - "\xd8\x79\x56\x47\x14\x0f\xb9\xdf\x65\x55\x42\xaa\x07\x68\x00\xf8\xf4\x34\xab\x35\x30\x8f\x2e\x06\xb3\x77\xff\x8b" + - "\xaf\x0f\x0e\x06\xea\xfe\x57\x07\x5f\x7c\x3e\x50\xf7\x0f\x0e\x1e\x7f\xf5\x08\xfe\xfd\xf2\x8b\x27\x92\x4f\xb7\xed" + - "\xba\xcf\x5d\xea\xdb\x8d\xc3\x11\xa7\x8c\xf6\x89\xf4\x62\x73\x89\xff\xec\x4d\x00\x09\xdc\x82\x79\x8c\x52\xb9\x6d" + - "\xb2\x6e\x67\x92\x1d\xf7\xc3\x9e\x94\xc5\x34\xcf\x26\x24\xdf\xb8\x9c\x5c\x9c\x64\x4a\x60\xd9\xd8\x4d\xf0\x68\xff" + - "\xb1\x23\x43\x35\xc0\x70\x77\x58\x7b\x77\x55\xa2\x12\xd1\x16\xcc\x08\x8d\xeb\xd4\xee\x7f\xcb\xf6\x6e\xa2\x49\x5b" + - "\x71\x41\x49\xb8\x85\xd7\xa2\x07\xb2\xf6\xe9\x73\xe1\x68\xe1\x02\xa3\xe1\x80\xe5\x6f\xb0\x83\x8c\xe3\x0f\x86\xd3" + - "\xac\x48\xc5\x57\x8c\x52\x73\x0a\x5f\x9d\xa9\x7e\x04\x0e\xe8\xc1\xee\xba\x46\xd4\x31\x86\x4d\x4e\x5e\x1d\x70\x79" + - "\xb2\xc6\x96\x35\x37\x24\x10\x58\xeb\x6f\xb0\x2b\xc7\xa8\x34\xf0\xe4\x88\xb7\xcf\xc7\x8d\xb6\x6f\x49\x6c\x39\x7f" + - "\xb9\xcf\xd0\xde\x43\x58\xcd\xfc\x7a\x0f\xee\xe4\x7e\x40\x2d\x3a\xce\xf0\xd3\xd8\xeb\x22\x0e\x61\xe8\xe8\x32\xce" + - "\xb5\xef\xb3\x77\x2b\x40\xaf\x82\xb0\x85\xbe\xea\x04\xdc\x93\xd5\x1f\x06\x5e\x6b\xaf\x8a\x49\xbe\x4a\x4d\x0d\x26" + - "\x7b\xa1\x14\xae\x55\x3d\xd7\x94\x14\xf7\x4f\x1c\x19\x66\x79\xe2\xd7\x2e\x20\x0c\xe3\xc9\x97\xf5\x58\x25\x3a\x6f" + - "\xfe\x64\x58\x7e\x04\x40\xc7\x89\xc9\x41\x6e\x9a\x34\x15\xc0\x5b\x85\xdc\x1b\x2a\x26\xe6\xba\x86\xc4\x75\xda\x16" + - "\xa8\x4c\xae\x1b\x93\x52\x01\xb0\x7f\xd9\xc7\xa4\x4f\x68\xb2\x85\x39\x69\xf4\x62\xa9\x2e\x33\xb3\x46\xff\xbe\x84" + - "\xed\x68\x2a\xe9\xe3\x78\xa6\xd9\x15\xa1\x6a\x70\xa0\xd2\x85\xb9\xe6\x27\x76\x3a\xb8\xbf\x93\xb9\xae\x94\xfd\xcf" + - "\x73\x4b\xe8\x2e\xcc\xb5\xfd\xbf\xfd\x1d\xd5\xb9\xb5\x85\x11\xc2\x1d\x37\x97\x65\x47\xb2\x42\xe7\x6d\x50\x16\x74" + - "\x3e\xb4\x64\xc8\x56\x2c\x5c\x70\x84\x82\x0a\xcb\xb0\xbd\x22\xd2\x78\xd1\x4b\xd7\xc4\xd0\xf5\x74\x9b\x0d\x1c\x1d" + - "\xef\xc6\xfe\x19\x0d\x26\x54\xe5\xc9\x3b\x3a\x36\xc3\x43\x4c\x5f\xd7\x44\xd1\xd5\x82\xff\x00\xb9\x37\x45\xf3\x57" + - "\xfa\xf7\x6f\xaa\x9c\x4e\x6b\xd3\xfc\x95\xfe\xfd\x1b\x84\x7e\xfc\x15\xfe\xfb\x37\x55\x4f\x2a\x63\x8a\xbf\xd2\xbf" + - "\x7f\x53\x4d\x49\x91\x71\xff\xea\x1c\x13\xaa\x05\xf2\x53\xe5\x64\xa0\x52\xfb\x9f\xf3\x32\xbd\x26\x1f\x6c\xea\xac" + - "\x98\x38\x7c\x22\xb4\xb0\xcf\x75\x3e\x59\xd9\x8d\x86\x5d\x1d\xfd\xcd\xca\x75\x8b\xac\xae\xd9\x57\x85\x46\x38\xfa" + - "\x9b\xd2\x97\x3a\x83\x3d\x1c\xaf\x1d\x0e\x92\xd7\x6e\x67\x47\xac\x05\x4d\xcf\x76\xe7\xba\xbe\x28\x27\x11\xd3\xb1" + - "\x59\xa5\x4e\xf4\x28\xf5\x9f\xbc\x28\x27\x43\x7e\x2b\x42\x0c\xed\xb0\x4b\x48\x48\xef\x4a\xd9\xbf\xdd\x85\x12\x74" + - "\xb9\xdd\xd3\x5d\xcc\x57\x0d\xaa\xe4\x72\x32\xac\x27\x55\x99\xe7\x3f\x98\x29\x74\x06\x2a\xde\xd9\x81\x7f\xa3\x57" + - "\xfb\xaa\xaf\xf6\xc2\x6f\xb1\xca\xce\x6f\xc3\x57\xfb\x8e\xb2\xfb\xce\xfd\xad\xdd\xb9\xbf\x75\x77\xee\x5d\xb9\x54" + - "\x1b\x3a\xc7\xaf\x36\x76\xae\xf3\xdb\xf0\xd5\x7e\x87\x06\x3c\x3c\xd4\xc0\x84\x8c\xd5\x01\xdc\xca\x96\xa5\x3b\x54" + - "\x8f\xe0\xf7\x22\x4b\xd3\xdc\x1c\xaa\xc7\xf0\x17\xb8\x30\x70\x0d\x6f\xca\xc6\x8c\xe9\x14\x31\xde\x68\x51\x56\x0b" + - "\x48\x03\x92\x0e\x54\x5d\xaa\x14\x18\x0c\x4c\x73\xe1\x77\xdc\xb6\xa4\x08\xb6\xc7\x58\xc5\x06\x21\x25\x24\x1f\x3d" + - "\x2e\xbd\xa3\x0e\xd4\xb1\x3a\x80\xdc\x15\xee\xd1\x23\x75\xac\x1e\x87\x8f\x9e\x90\x91\x7b\x3f\xca\x4a\x7b\x27\xf9" + - "\x98\x66\x57\x1b\xb4\x69\xf2\xe0\x74\x78\x05\x44\x20\x39\x41\xe5\x2c\xe2\xb0\xc7\x85\x53\xc5\x79\x8c\xbf\x50\xf3" + - "\x46\xbe\x66\x34\xab\x78\xa1\x85\x59\x8b\x48\xba\x80\x2c\x82\x50\x4d\xe0\xe8\xe3\xb9\x4d\x7c\xcc\xfb\xf1\xa5\x74" + - "\x6d\x20\xc8\x32\xbc\x68\x18\xd9\x84\xef\x1d\xe1\x91\xe5\x86\xbe\xcd\x65\x9d\x5b\x70\xd7\x17\xea\x48\xb9\x3a\x71" + - "\x2d\x45\xe4\xb5\x74\x78\xe9\xab\x63\x6c\xd3\x93\x6c\xe6\xd5\x5c\x04\x77\x67\x79\xbe\x09\xb9\xb4\x0c\x3c\x84\x19" + - "\x75\x3d\x18\xe2\xfd\x4f\xdf\xc1\x1f\x2e\x01\x4d\x58\xa4\xcf\x89\xae\xe0\x4f\x1a\x35\x2b\x3f\xdb\xfe\x1d\xe1\x84" + - "\x3a\x8f\x70\x2b\x79\x94\xcb\xeb\x2e\x77\x6a\x09\x9e\x02\x59\xf3\xb0\x28\xf3\xe7\xbc\xe5\x45\x86\xbd\xa0\x8d\x20" + - "\xd5\x9e\xc0\x44\xe6\x18\xff\xe7\x65\x95\x96\x97\x5a\x3d\x1a\x7e\xae\x7a\x88\x69\xd0\x47\xce\xfd\xf3\xcf\x9d\xf8" + - "\xe6\x7d\xa6\x29\xa9\x2b\x68\x5a\x34\x71\x26\x87\xae\x92\xd4\x5c\x66\x13\x83\x8a\x74\x02\x46\xb8\xf7\xbb\x9c\x25" + - "\x02\xda\xdf\xd1\x5b\xc2\x6a\xf8\x62\xb8\xbf\x3b\x50\xcf\xe7\x95\xdd\xdf\x4f\xd5\xa3\xaf\xee\x71\xb2\x37\xe2\x9c" + - "\x38\xf3\x2c\x45\xe9\x59\xf6\xbf\x80\xa4\x1d\xf7\x3f\xdf\x7f\x62\xe5\xaf\xc7\x07\x4f\x1e\xf7\xc3\xb3\xc9\x17\x52" + - "\xe4\xfa\xb5\xc9\xad\x43\x7e\x12\x19\xbc\x43\xc6\x93\xf7\x0b\x01\xad\x1c\x47\x0f\x5a\x37\x3d\x6d\x0d\x76\xa5\x13" + - "\xbc\x2a\xa9\x25\x88\x3f\xc9\x4b\x9d\x8e\xbd\xab\x16\x9b\x3c\xbc\x85\x21\x5b\xe8\x99\x19\xda\x62\x41\xf8\x85\x93" + - "\xbb\x9d\x77\x02\x94\x81\x7a\xd8\xad\x60\x0c\xf2\x27\x8c\x05\xd9\x93\x72\xb2\xaa\x45\x63\x60\x8f\x0e\x34\xff\xd9" + - "\xd4\xa7\x29\xab\x4b\x75\x9e\xaf\xaa\x11\x7c\xa5\x6a\xf3\xcf\x15\x00\xca\x66\x35\x23\x62\x20\x11\x68\xf9\x3d\x86" + - "\xde\xa8\x20\x97\x41\x70\x6c\x07\x08\xc1\xce\x0e\x91\x1d\x68\xc2\x0b\x3e\xfe\xa1\x57\x23\x45\x08\x07\x42\xb8\x09" + - "\xb5\x26\x18\x7e\x97\x30\x48\x84\x1f\xbd\x1d\x0c\x0f\xfe\x93\x7a\x7d\x74\x47\xaf\xc1\x29\x30\xea\xb4\x7d\xf6\xef" + - "\xf5\xb9\x5c\x35\xa2\xd3\x74\x47\xfb\x25\xb3\xf7\x36\x01\x81\x0c\xd4\xb4\xb5\x80\x75\x19\xa1\x97\x30\xd6\x8f\xbf" + - "\xc5\x3f\x65\xec\x43\x0f\x76\xc6\xad\x25\x6e\xdc\xa8\xf8\xf1\xc6\x48\x7b\xd4\xde\xe8\x85\x03\x1a\x73\x30\x37\xf1" + - "\xe4\xc0\x87\x9f\x38\x3b\xc1\x80\xab\xb2\xae\xf7\x28\x41\x35\xc0\x17\x42\x5c\xdb\xe4\x7a\x40\xcc\x86\x9c\x07\x6e" + - "\x45\x95\x85\xca\xb3\xe2\x02\x25\x16\x36\x28\x6f\xbc\xdd\x63\x90\x23\x3f\x28\x49\x23\x06\x2a\xd1\x49\xe8\xdd\x41" + - "\x7d\xc5\xf4\x62\x18\x28\xce\xeb\x25\x15\x8f\xb7\x18\xe9\x42\xe2\xc8\x4a\xb4\x47\xfb\xbb\xee\x25\x3f\x63\x98\x1a" + - "\x9d\x9b\xaa\xe1\x30\x45\xec\x37\x82\xc1\x4c\x33\x93\xa7\xcc\x97\xd5\xa6\x91\x9a\xf3\x40\xe1\xbb\xdd\x4a\xa4\x03" + - "\x6f\x63\xea\x15\xfa\x1a\x04\x6f\x87\xb2\xdd\xa3\x96\xc6\xb4\xed\x83\xc0\xe4\x2f\x5b\x80\xdc\xd2\x86\x6e\x23\xec" + - "\x2b\xa4\xa3\x28\x81\x0b\x18\xac\x1f\xb3\xd9\xec\x1a\xf2\x4e\x97\x85\xd2\x76\xe1\x5d\xe0\x5b\x53\x2a\xae\xd5\xbe" + - "\xc9\xa6\x00\x7e\x0d\x20\x95\x9c\x1a\xf6\x3b\x7d\x61\x22\xda\xdc\x94\x0a\x1c\xf6\xb1\xaa\x07\xb5\x8a\x34\xd8\x08" + - "\xe9\x8d\x93\x4c\xb5\x70\x2b\xa9\xd3\x2f\x10\x49\x66\x73\x7f\x43\x16\xf3\xb4\xf4\x36\x6a\xf2\x27\x80\x56\x5c\xf6" + - "\x57\xd3\x0a\x29\x46\xca\x1d\xb3\x1a\x7d\xe1\xe7\x8d\x3f\x37\x85\x1e\x67\xf5\x09\xf7\x0e\xe9\xbe\x08\x49\x76\x83" + - "\x1e\x53\xfa\xb3\x2d\x9f\x04\x0d\x37\x47\x38\xdd\x9d\xd6\xee\x9e\x32\xac\x2a\xf3\xb0\x5d\x61\x9c\x63\x37\x8c\x81" + - "\x0c\x35\x10\x18\x91\xbc\x2d\x6f\x71\x17\xb9\xdd\xf8\x20\xf2\xa8\x39\xb4\x17\x11\x91\xd0\x81\xab\x26\x3d\xe9\xa9" + - "\x05\xef\x2c\x2e\x3e\x8d\x03\x6b\x37\xbd\xef\xa9\xd0\x37\x5f\x84\xd4\xc6\x1d\x6b\x77\xa9\xae\x26\x03\xc5\xec\xe7" + - "\x6f\xa8\xc4\x42\x67\x4d\x54\xc3\x37\x19\x5a\x27\xd7\x59\x33\x2f\x09\x5c\xfe\x41\x61\xd6\x0f\xd4\x85\xb9\x5e\x97" + - "\x55\xca\xbd\xdf\xee\x21\xa8\x07\x29\xef\x1d\x26\x05\xb6\xd9\x8f\x70\x1c\xdb\xdc\xac\xec\x08\x75\x1d\x7b\xf3\x32" + - "\xf4\x06\x40\x8b\x4b\x05\xa2\x68\x5d\x4d\x86\x32\x7c\x0e\xe8\x7b\x2c\x67\xd4\xd5\xe4\xd0\xbd\x24\xd9\x84\x3f\xf4" + - "\x66\x8a\x97\x78\x84\x1c\x43\x43\xce\xbd\xce\xd5\x6f\xa1\xaf\x45\x4a\xa0\x85\xae\x00\xf9\xac\xf6\xde\x4a\x54\x0f" + - "\x40\x5a\xb8\x88\xdf\x72\x6d\x2a\x05\xd1\x2f\xe0\xcc\x53\x19\x73\xa8\x2a\x33\xcd\xad\x78\x05\xa8\x0a\xc8\xc3\x20" + - "\x7c\xf9\xd0\xf5\xb2\xbd\x17\xa9\xcf\x69\xfc\x98\xd3\xf6\x76\xbe\x8c\xf3\x94\xb5\xc9\xbc\x48\xac\x3f\xdc\xf7\x35" + - "\x05\x44\xd5\x59\xe3\x8e\x85\x6c\xf9\xce\x67\x08\x13\x30\x50\x87\xe1\x9a\x91\x91\x4c\x1e\xce\x68\x11\x82\x85\xfe" + - "\x71\xd5\x28\x73\xb5\xcc\xb3\x49\xd6\xe4\xd7\x2e\x76\x32\x4c\x27\xce\xd1\xd5\x1d\x9b\x42\xee\xe2\xae\x5c\xe6\xdd" + - "\xdb\xcb\x09\xc4\x4d\xb6\x30\x35\xe8\x44\xb3\xa9\x77\xa6\xc6\x86\xf8\xca\x83\x1d\x80\xa8\xc3\x38\x12\xa7\x47\x3d" + - "\x0a\xf6\xa4\x7b\xec\x61\xcd\x8b\x72\xdd\xeb\x0b\x78\xb5\xea\x02\xfc\x82\x6a\xcb\xc2\xc3\xee\xc1\xbc\x23\x2d\x99" + - "\xde\x85\x48\xe3\x41\x76\xae\x8f\x74\x96\xb3\xda\x63\x54\xbc\x78\xfb\xfa\x31\x6f\x64\x99\xdb\xda\x6e\x4a\x3b\x69" + - "\x2f\x9f\xbf\x7e\x76\x32\xa9\xb2\x65\xa3\x7e\xd0\xc5\x6c\xa5\x67\x46\x7d\x9b\x15\x29\xc4\x1c\x8c\x46\x6a\xde\x34" + - "\xcb\xf1\x68\xb4\x5e\xaf\x87\xeb\xc7\xc3\xb2\x9a\x8d\xde\xfd\x34\x7a\xb4\xbf\xff\x78\xf4\xf3\x8b\xbd\x17\x6f\x5f" + - "\xef\xfd\x60\x2e\x4d\xbe\xf7\x78\x0f\xdb\xd8\xb3\xaf\xf6\x1f\x3f\x3e\x18\x99\xc9\x42\xef\xd5\x50\xf3\xde\x39\x56" + - "\x38\x9c\x37\x8b\x3c\xa4\x3b\xc2\xb2\x73\x84\x54\xaf\xb5\xcd\xc7\x12\x54\x6c\x00\x45\xda\x5e\x03\x1d\x85\x6e\xf1" + - "\x31\x88\x4b\x83\x9a\x5d\xd2\xf1\x36\x0b\xca\x57\x63\x9b\x9c\x10\xbd\xd8\x7c\x48\xfd\xe9\x08\x20\xfa\x81\xb7\x89" + - "\xee\x0f\x7f\xb9\xdc\x72\xb1\xd8\xe1\x45\x1c\xc1\xbf\xde\xdf\xf6\xe4\xdc\xd5\xe3\xa8\x69\xd1\xe5\x6e\x43\x7b\xd0" + - "\xe7\xae\x45\xf9\xd7\x3b\x7f\xcb\x12\x7f\xca\x28\xba\x3e\x8f\x86\xd3\x55\xa4\x17\x98\x7f\x30\x0b\x77\xd7\xc8\x3f" + - "\x8a\xf3\x49\x14\x05\x34\x4a\x76\x5f\x54\xa3\xdc\xe8\x4b\x07\x7f\xb4\x02\xe5\x38\xbc\x2d\x2f\x4d\x35\xb2\xb7\xaa" + - "\x66\x0f\x94\x3d\x4b\x3a\x50\x78\xaa\xa1\x32\xaf\x5c\x41\x0d\xc5\xc1\xe7\xbb\x1e\x54\x4e\x4f\xe6\x00\x02\xe3\x9b" + - "\x1a\xab\xc4\xd5\x9c\x0c\xf8\x15\xb4\xef\x5e\xad\x1a\x78\x43\x90\x83\xfc\x19\xfd\xe9\x3e\xa4\xbf\xf9\x53\x7e\x0d" + - "\x72\xe1\x47\x99\x65\xca\xae\x99\x15\x02\xaf\x68\x3a\xbb\x1d\x4f\x6c\x29\xcc\xa0\x6d\x27\x32\x14\x39\xa7\xd9\x15" + - "\xca\xc6\xe4\xee\xcd\x4f\xee\x39\xc7\xac\xcd\x02\x13\x60\xb5\x1a\xe2\x4a\xb7\x1a\xe9\xab\x36\x60\x89\x0a\x99\x65" + - "\x2f\x1d\x08\xcb\x58\x80\x83\x83\x56\xeb\xc8\x13\xe7\x30\x94\x02\x61\x0a\xc5\xa2\x4e\xd8\x65\x44\x44\xee\x72\x8b" + - "\x59\x1d\x84\xb6\x90\x82\x87\x6b\x7b\xf3\xed\x58\xbd\x29\x23\x43\x1d\x49\x53\xd0\x0a\x68\xc3\x47\xd0\x18\x39\x43" + - "\xb3\xf0\x89\xaa\x96\x7b\x5e\xad\xcd\x2d\xde\xdc\xa8\x1e\xff\x06\xcb\x3f\xd6\x2a\xbc\x71\x3d\x12\x2e\xcb\x92\x5c" + - "\xbe\xdf\x72\x15\x77\x11\x9b\xb1\xcf\xd0\xa1\x93\x55\x83\xd7\x1c\x68\x4e\x1e\x42\x78\xe7\x0a\x1f\xca\xc3\x8e\xca" + - "\xa7\xd9\x95\x0c\xec\x20\xf6\xb0\x32\x42\x29\x7e\xe8\xc0\xec\xfd\xe1\x4a\x98\x51\x4b\x30\x0c\x12\x4e\x10\xa8\x42" + - "\xd8\x40\xd8\x21\xcd\xb2\x9a\x6f\x40\xba\xbf\x7b\x9f\x51\xa8\x72\x37\xcc\x67\xb8\x9d\xe1\xac\x29\x52\x5e\x39\xc5" + - "\xce\x40\xa1\x42\xc7\x6b\x4d\xd4\x6d\x87\x83\x95\xa0\x08\x87\xe8\x72\x10\x4f\xf4\xb2\xc1\x70\x6c\xde\x45\x4e\x5c" + - "\x23\xf6\x13\x35\xb8\x75\xb9\x30\x65\x61\xc0\x87\xb0\x76\xf1\x9f\xdc\xf4\xbd\x00\x0c\xb2\x0a\x25\x8f\x50\x94\x0e" + - "\xcf\x28\x49\x6c\xa0\x8e\x1e\x44\x9a\x86\x8d\x3e\xb7\x21\x94\x04\x7b\xa6\x76\x1f\x7e\x3b\x7e\x77\xf6\xb7\x00\x88" + - "\xa8\x4b\xf1\x03\xc9\x9d\xc0\x44\x87\x97\x41\x6c\xcd\x13\x87\x7a\x0b\x41\xd2\xc0\x57\xa5\x9d\x8f\x01\x2c\x99\x30" + - "\xe9\x11\xfa\x8f\xfb\x4a\x40\xa0\x97\x93\x0e\xa4\x22\x5c\x37\x87\x9f\xd1\x85\x9a\xb1\xb9\xd9\x01\xe6\x58\xc4\x96" + - "\xc8\x80\xb6\x4b\x60\x05\x5e\xed\xc6\x41\xf0\xff\x4b\x33\xa1\xf6\xd4\xc1\xa7\xcd\x46\xa7\x88\x79\xdb\x84\x74\x04" + - "\xaa\x77\xac\x40\x94\x78\xe7\xb6\xe9\xf3\x1d\xeb\x50\xe2\xc0\x75\xdb\x8f\x72\xe0\x06\xf9\x2d\xee\x7d\xb6\x15\x70" + - "\x1a\x0c\x00\xe4\x51\x50\x30\x52\x71\x5a\x0c\xd4\xe8\xe1\xab\x37\xef\x5e\xfe\xf4\xe6\xd9\x0f\x0f\x47\x96\xb3\x97" + - "\x9e\x73\x76\xcc\xdf\x15\x83\x28\x52\x05\x01\x39\x28\xc9\xa6\x56\x0b\xbd\x54\x84\x7e\x5f\x8f\x5a\x0e\x2b\x02\x1b" + - "\xbf\xee\x4e\x0a\x39\x1a\x31\x66\xce\x1e\x07\x07\x87\xfd\x54\x32\x82\x0c\xab\x73\xde\x4e\x9d\x70\xfb\x5d\x55\x8a" + - "\x8a\x82\x10\x4f\x01\xc6\x41\x53\x2d\x20\x49\x63\x78\x47\xf8\x6f\x08\x50\xd3\x78\xe8\x24\xa7\x60\xf5\xba\xb4\x78" + - "\xc2\x19\x9b\x06\x6c\x74\x03\x9c\xee\x0e\xea\x4f\x8e\xe6\x61\x80\x79\x10\x91\xba\xb3\x83\x19\x81\x42\xbf\x00\x3f" + - "\xee\x01\xa4\xf7\xc1\xfe\x16\x56\x36\x0b\xc6\x48\x13\xb0\x71\xa4\xb4\x53\x7d\xe2\xa1\xb0\x99\xce\x95\xe8\xcc\xb5" + - "\x1d\xf4\xc8\x4f\x86\xeb\x1b\x76\x4e\x24\xf8\xeb\xcc\x00\x1d\x9d\x1c\x59\x27\xef\xe3\x3b\xea\xfb\x7d\x4b\xec\xb5" + - "\x62\x94\x75\x29\x74\xc6\x85\x36\x42\xa1\x3f\x9c\xb2\xed\x69\x11\x5b\xa2\x3b\x57\x14\xa0\xca\x65\xae\xf4\x2d\x3c" + - "\x70\xf6\xe2\xa2\x0c\x85\xd3\xe2\xb6\x5b\x0c\x1c\x50\x0a\x44\xcf\xe3\xc4\x9f\xb5\x71\x91\x38\x58\x9a\x19\x1e\x84" + - "\x66\x2e\xa6\xa5\xbc\x01\x7b\xfd\x61\x39\x9d\xf6\x02\x1f\x5c\xd7\x69\xec\xcd\x1d\xdc\x0c\x41\x1f\x51\x44\x06\xa8" + - "\x5a\x01\x54\xa7\x2e\x11\xc7\x15\x51\x01\x08\x43\x06\x59\x7f\xac\x97\xc6\xc7\xe8\x72\xd4\x18\xfc\x65\xb9\xb8\xe0" + - "\x41\x04\xc2\x2b\xb5\x97\xad\x3c\x2c\xed\xdb\x24\xb8\x93\x21\x7b\x85\x4f\xc5\x52\x23\x15\x8c\xb1\xa5\xb1\x7e\x9f" + - "\x4f\xa5\x2c\x5a\x9a\xf2\x4e\x7a\xda\x95\xad\xe5\x0e\x02\x7c\x20\xd2\xb6\x94\xd3\xe9\xad\xcd\xf8\x06\x02\xd0\xeb" + - "\x81\x8f\x9c\x72\x67\x13\x22\x01\x11\x57\x2c\x12\xbb\xdd\x73\xe1\x1a\x29\x09\x08\x6f\x32\xc5\xaa\xe3\x28\xbc\x06" + - "\x4a\x4a\x81\x21\xaa\xed\x50\x4c\x3a\xf5\x25\x8e\xa5\xc1\x5d\x17\x89\x1e\x12\xc0\xa0\xcb\x4f\x7f\x17\xd0\xc8\x76" + - "\x3b\x63\x09\xc6\x1d\x1f\xc4\xa2\xcd\x30\x82\xec\x6c\xf1\xed\xf0\x98\xb6\x75\xc7\xb9\xfd\x57\x6e\x34\xf2\x24\x39" + - "\xf5\x8b\x78\xc6\x64\xf9\xee\x6b\xc4\x1e\xcc\xf8\x1e\x09\x6e\x90\x3b\x2f\x8f\x18\x56\xd1\x13\x33\x0a\x28\x6e\x51" + - "\x70\xde\x7c\x5d\xa3\xb1\xc3\x98\x16\x67\x9b\xef\x95\xcd\x17\xca\xbf\x42\x51\x3b\x4f\xf7\xed\x87\x3b\x4c\x42\x29" + - "\xce\xf7\xc6\x93\xdd\x8d\x19\xd4\xb4\xd2\x81\xfd\xce\x8e\x38\x63\x8d\xaf\x89\x9d\xa3\x63\xd2\x42\x45\x29\x80\xf7" + - "\xee\xa4\x64\x32\x4b\xf3\xfe\x99\x3f\xf4\x41\x1a\xcc\xd0\x8a\x7a\x4b\x9f\xc8\x22\xe3\xb9\xd9\x8f\x51\xb6\x4e\xca" + - "\xe6\x70\x35\x6f\x16\xf9\x3b\x3d\x53\x47\x6a\xf4\xb4\x77\xbc\xad\x2b\xa3\x6f\xce\xab\x9b\x49\x99\xdf\x98\xc5\xb9" + - "\x49\x6f\xe6\xd5\x4d\xb6\x98\xdd\x80\xd5\xf9\x26\xcf\x8a\x8b\x9b\x85\x69\xf4\x0d\xa4\xab\xee\xf7\x7a\xa7\xef\xd7" + - "\xe3\xb3\xdd\xfe\xe9\xdf\xbf\x39\x7b\xd8\x7f\x3f\xfa\x66\x34\xcb\x30\x4b\x83\x9e\xbd\xc1\x3c\xe9\xa3\xa7\x5c\x08" + - "\xf3\x37\xd8\x16\xe1\xf1\xcd\xce\xfd\xe3\xf7\xeb\xdd\x43\x7c\x5c\x94\xaf\x8a\xc2\xf8\xb7\xbd\xe3\x31\x6a\x5e\x6f" + - "\xea\xe6\x3a\x37\xd0\x74\x7f\x94\x51\x16\x2c\x32\xc3\x1f\xf9\xc4\x27\x6c\xba\x07\x9d\x73\x35\x71\xf9\x34\x46\xf4" + - "\xf3\x7d\xfd\xb0\x77\x3c\x3e\xfd\xfb\xd1\xd9\xcd\xd1\xfb\xfa\x21\x27\x06\x19\x52\x9d\x15\x36\x46\xf0\x0f\xa3\xbf" + - "\xff\xe1\xe6\xfd\xa8\x77\x3c\xfe\x45\x5f\xea\x1b\x33\x59\xe8\x3e\xbe\x6f\x15\x7e\xad\x6b\x6a\xe7\xef\x76\xb6\xdf" + - "\x8f\x7a\xc3\x87\x34\xd0\x49\x6e\x74\x41\x7a\x69\xfb\xfe\x7d\xfd\xf0\xe9\x76\xef\x78\xfc\xfe\xf4\xf9\x8b\x67\xef" + - "\x9e\xbd\x3f\xbd\xd9\xdb\xeb\xdf\xd8\x07\x67\xef\xcf\xec\xef\x6f\xde\xd7\x0f\xff\x30\x9a\x39\xa7\xeb\x9f\x5d\xea" + - "\x5e\x35\xc9\x4b\x0c\x8c\xb4\xff\xd5\x33\xc0\x18\x21\xf1\x5e\xfd\x15\xd2\x8d\x60\x24\x01\x84\x93\xac\x2b\xbd\x7c" + - "\xad\x97\x2e\x2d\x43\x94\xb0\x44\x7d\x6d\x9f\x95\x4b\xd4\x5b\x9e\xaa\x83\x81\x4a\x9e\xe2\x49\x72\x98\xe6\x47\x0f" + - "\xf8\xd7\x83\x6f\x12\xfb\x7e\x84\x05\xbe\x49\x00\xf6\x0a\x95\x86\x46\xa7\xee\x7b\xf0\xb9\xa3\xa2\xf4\x9b\x00\xb2" + - "\x26\x65\x6e\x4b\x3d\xf2\xa5\x9e\x4e\xca\x7c\x56\x95\xab\x25\x95\x77\x7f\xc6\x9f\x36\x55\xfc\x65\x73\x5e\xa6\xd7" + - "\xdc\x0c\xfc\x6e\x7d\x03\x7d\x7a\xdc\xfa\xe6\x69\x53\xf1\x77\xd5\x37\xdd\x1f\xdb\xcf\xbd\x2b\xc3\xa9\xda\x1f\xa8" + - "\xc4\x7e\x92\xa8\x33\x97\x43\xa9\x3d\x95\x34\xdb\xc3\x72\xd9\xc0\x28\xd4\x91\x12\x8f\x32\xf2\x2b\xe6\x47\x0d\xb9" + - "\xe1\xba\xbf\xa7\x65\xd9\x88\xbf\x79\x2e\xe4\x23\x8d\xd9\x24\xc5\x47\x76\xea\x0f\x45\xa5\x73\xf9\x32\x6d\x75\xf4" + - "\x60\x78\xa5\x26\xe5\x62\xa9\x9b\xec\x3c\xcb\xb3\xe6\x1a\x5e\xbf\xd6\x45\xb6\x5c\xe5\x84\x9b\x83\x01\xf2\x95\xf9" + - "\xe7\x2a\xab\x20\x5d\x25\xf4\x54\xe4\x39\x59\xb8\xe2\x65\x81\xf7\xbd\x4b\x07\x5e\x16\x8d\x67\x60\x37\x7a\x7a\x20" + - "\xc6\x1b\x34\x94\x38\x9c\xc5\x56\x31\xaa\xcc\xbb\x98\x59\x59\xf0\xe0\x40\x1d\xbb\x66\xc6\xae\x0c\xc4\xa0\x42\x52" + - "\x1c\x5b\x71\x05\x00\x69\xe4\x5d\x98\x9b\xc5\x70\x66\xd8\x05\xba\xfe\xf6\xfa\x1d\x12\xa4\x5e\x02\xe3\x4a\xfa\xa7" + - "\xfb\x67\x6c\x65\x44\x54\x67\x99\x08\xa9\x0d\x64\x12\x65\x9b\xe2\x5a\x18\x48\x89\xa2\x4b\x3f\xd2\xcc\xff\x64\x96" + - "\xb9\x9e\x98\x51\x65\x30\xe3\xb4\xcb\xb3\xe7\x13\x74\xdb\x2b\x1a\x69\x83\x8b\x84\xb2\xbc\x43\xad\xa7\x84\x97\x20" + - "\xa6\x5b\xac\x02\x05\x40\x21\x59\x09\x6e\x07\xe8\x33\x43\x95\xf2\xf8\x7d\x02\x28\xc4\xa2\xc3\xb4\xd5\x56\xec\x03" + - "\x3c\xa8\x91\x65\xbc\xdc\x87\x87\x7e\xf5\xfc\x78\x44\x5a\x1c\x18\x4b\x47\xcb\xf6\xfa\x42\x78\xb3\x23\xd5\x22\x8d" + - "\x04\x65\xeb\x7b\x47\x9a\x13\x1f\x9c\x13\xf8\x01\xd0\x00\xe0\xc5\xa9\x3a\x40\xa7\x4c\x29\x28\x0a\x6f\x81\xd6\xe0" + - "\xbc\x01\xb4\x35\x0c\xda\xf1\xd5\x05\xcd\x3a\x58\x12\xe7\xfa\x12\x1c\xfa\x19\xd7\xc0\x98\x42\x99\x4b\x9d\xaf\x34" + - "\x18\xbe\x7d\x8a\x1f\xd3\xfc\x11\xa0\x24\x5e\x5e\x6a\x72\xb6\xa8\x07\xaa\x32\x53\xde\x5e\x62\x22\x20\xa2\x0c\x28" + - "\x51\x4e\xd0\x0d\x02\x3b\xf5\xde\x67\x2e\xb2\x2e\x53\x4f\x55\x1e\x84\x99\x79\xcd\x51\x6d\x9a\x9e\xdb\x99\x9c\xf1" + - "\x2f\x99\xb9\x2e\x24\x03\xb5\x2d\x5b\x0f\x92\xb7\xc2\xc1\x14\x6f\x3b\x3e\x47\x56\xcf\x19\x78\xee\xc9\x74\x46\x90" + - "\x79\xea\x79\xb9\xbc\x96\xfe\x0b\xa9\xa9\x1b\x39\xc6\x81\xca\xd9\xdf\x63\x69\x5b\x7e\x6b\x4f\x20\xfc\x7a\xbe\xaa" + - "\x06\x6a\xe5\x9e\xad\xdc\x33\xd4\x5f\x8b\xb5\xb7\x75\x46\xa7\x3c\xe4\xca\x02\x73\xf6\xc1\x50\xd9\x4e\x29\x3b\x44" + - "\xdd\x60\x42\x7f\xf2\xfe\xac\x25\x38\xb5\x69\x26\x43\xd7\x42\x1b\x7d\xba\xae\x26\xde\x73\x8e\xbb\xde\xa9\x61\x84" + - "\x92\x87\xae\xd8\x73\x08\x7d\x0c\x97\x08\x86\xe0\x67\x40\x09\x28\xb7\x5a\x1d\xb9\xe7\x43\x39\x74\xe1\x2d\x56\xc7" + - "\x60\x99\xdc\x50\x00\x96\xe9\x1e\xba\x7a\x7d\xce\x85\xdb\x41\x95\x45\x84\xe3\x40\xe5\x2d\xc4\x61\xde\x95\x1d\x3b" + - "\xb1\x53\xb8\xc6\xc1\x36\x1e\xea\xde\xd5\x04\x3b\xac\x53\xa7\x29\x57\xf0\x11\xad\xe0\xaa\x36\x15\x4c\x64\xb0\x4c" + - "\x90\x6c\xbe\x7b\x99\x56\xd1\x32\x41\xd1\xf6\x32\xad\xfc\x32\x45\x4e\x12\xbf\x7d\xf4\x5b\xd2\x29\x6e\xa3\xbc\xfc" + - "\x38\x3a\x57\x47\xf7\xd9\xb0\x04\x35\xcf\xe9\x8e\xba\xb2\xb3\xa1\x67\xe2\x58\xa0\xdd\x88\x5e\x76\xde\x3e\x7c\x8b" + - "\x6d\x78\xdd\x83\x0a\x6f\x6e\x54\xf2\xd0\x43\xf4\xf1\x07\xff\xb4\x63\x3a\x21\x81\xe7\x19\x44\x77\x6d\x7a\xd5\x59" + - "\x0f\x63\x83\xb2\xc8\x63\x99\xfe\xc0\x91\xc6\xca\x8e\x7a\xd6\xe9\x7a\x1a\x0d\xf8\x58\xdc\xdc\x0b\x53\xcd\x4c\x4f" + - "\x9d\x72\x19\x4b\x6b\x2a\xf0\x5e\x1f\xd3\x51\x16\x04\x58\xb2\x4e\xdf\x1c\x59\xee\xc9\xcd\xed\x34\xbb\x7a\x65\x65" + - "\x8c\x6e\x8a\xc3\x5d\xb1\x7b\x80\xe9\x86\xfd\x7b\xd8\x94\x3f\x94\x6b\x53\x3d\xd7\xb5\x11\x6e\x28\xdf\xe9\x2c\x07" + - "\x1e\x79\x69\xaa\x3a\xab\x9b\x20\xaf\x23\xba\xee\x62\x92\x5c\x48\xe9\xe7\x7c\x7e\x21\x1f\xb7\x4e\xb3\x92\x82\x5d" + - "\x1c\x25\xf1\xcd\x53\x32\xe2\x15\xe2\x4c\x86\xd9\x34\x39\xe9\x87\xf7\xde\x62\xca\x6e\xbb\xec\x45\x12\x5b\x20\xce" + - "\x4b\xe8\x7a\xec\x24\x52\x43\xd2\xad\x49\x15\xf2\x91\x9c\x81\x81\xdd\x21\xdd\x6b\xf2\x45\x9e\x1b\xa4\xde\xa0\x8b" + - "\x83\x2f\x6a\x7f\x77\x6e\x1e\xc6\xcd\x4d\xf4\x9c\x13\x15\x26\x41\xf7\x83\xb4\x88\x81\xd7\x16\x27\x22\x74\xe7\xa5" + - "\x9d\xcd\x05\xe6\xb9\x9d\xc0\xc0\x9e\xb6\x67\x05\xda\xa8\x6a\xbb\xe6\x66\xf9\x42\x3e\x8a\xc2\xfd\xf3\x81\x6d\xf6" + - "\xa5\x4b\xe4\x6b\xfb\xe5\xfe\xc2\xb3\x42\x79\x22\x81\x49\x68\xe5\x50\xa4\x44\xc3\xc5\x8f\x7a\x26\x3c\x44\x3f\x31" + - "\x87\x6a\x87\x1c\x85\x3b\x98\x7c\x88\xaf\x00\xb2\x12\x62\xf5\xeb\x7a\x25\xb0\x72\xb7\x37\xa4\x7a\xdc\xd9\xe9\x04" + - "\xd2\x3d\xe8\x06\xd2\x3d\x38\x10\xd0\xe4\x1e\x82\xea\xaf\xaf\x7f\x78\x51\x4e\x3a\x20\xa8\x50\x7c\x34\xf5\x64\x6e" + - "\xd6\xea\x24\xfb\xf5\xd7\xdc\x28\xc0\xc4\x82\x54\xf5\xa6\x9a\x96\xd5\x02\xc0\x08\x2a\xa3\xeb\xb2\xa8\xc7\xec\x25" + - "\xf5\x4b\x6d\xdf\x0e\x27\xe5\x62\x34\x33\x8d\xce\xf3\xbd\xcb\x7a\xaf\x86\x0a\x46\x8f\xe8\xb6\xf2\xd3\xae\x8e\x3c" + - "\x51\xcc\x85\xdd\x43\xac\x93\x28\x12\x4c\x66\xfb\x7e\x12\x1f\xdd\x7a\x39\x05\xa4\x22\x62\x73\x64\xe7\x82\x7b\x29" + - "\x86\xc4\xb0\x57\x91\xf3\xb8\xab\x3d\x56\x93\x0b\x26\xa5\xd3\x06\xc3\x0a\xac\x35\xad\xed\xc9\xfc\xcc\x86\xdd\x1b" + - "\xcf\x86\xfc\xeb\xe6\xa6\x3d\x39\x5b\xed\x39\x0e\xfe\x14\xdf\xf8\x39\xdf\x70\xe5\x7f\xea\x94\x6e\x75\xb0\x7d\x9f" + - "\x3a\xb3\x7c\xe3\x07\xd6\x9c\xb8\x3e\x92\x14\xf3\xd8\x36\xe6\x57\xe4\xc7\xca\xd4\xa6\xba\x34\x4e\x2c\x42\x46\xdc" + - "\x12\xbe\x79\x66\x45\x8f\x6b\xa6\x45\x9b\x36\xdf\x40\x25\xf8\x2d\x07\x11\x38\x3e\x33\x9a\x03\xf5\x8d\x80\x70\x8e" + - "\x98\xfb\x80\xa8\xa8\x6d\xa2\x16\x3b\x3b\xc1\x3a\xc9\x96\x42\x88\x13\x10\xfe\x1c\x05\xa7\xfb\xa5\x36\x8d\x50\x36" + - "\xc2\x43\xa1\xa8\x3c\x5f\x65\x79\xca\xe9\x92\x63\x22\x59\x0f\xfc\xe5\x4b\x92\x0b\xab\x3d\x85\xa7\x17\x2b\x10\x09" + - "\xe1\xbc\xd1\xb3\x01\xe8\x03\x06\xce\x4c\x34\x50\x04\x8b\x22\x32\x37\x33\xfb\x70\x6b\xe2\xe6\x2d\xcc\x5d\xe9\x01" + - "\x54\xbc\x80\xb3\x41\xc2\xb9\x45\xc4\xd9\x12\x58\xe4\x21\x7c\x86\xd7\x75\x12\xf9\x03\xaa\xb7\x1f\xc5\x71\x3c\x4b" + - "\x53\xca\xa5\xc9\x90\x0a\xf7\xbc\xdd\x9f\x88\xa2\xbd\x7a\x1d\x41\xec\x54\xe4\x87\x84\xfc\xbf\x1b\x0c\xe9\xf3\xaf" + - "\x24\x67\xa3\xce\xcd\x44\xaf\x6a\xa3\x96\xab\x9a\x73\x06\x7e\x18\x28\x5d\x55\xfa\x3a\xcf\x2e\x4c\x5f\x35\xf3\xaa" + - "\x5c\xd7\x21\xdb\x4c\x4c\x11\x74\x75\x10\x51\xf3\x63\xc6\x92\x3f\x53\xe3\x88\x22\x22\x61\x2a\x2e\x4d\xd5\x00\x12" + - "\x0c\x28\x43\xb3\xa2\x29\x65\x80\xde\x3d\xe9\x75\x40\x6e\x52\xb6\x20\x71\x1f\xf2\x26\x80\x2e\x41\x27\x18\x24\x36" + - "\x58\xf1\x77\xe6\xaa\xc1\xfb\x91\x3f\xea\xea\x88\xef\xc4\x8b\xb7\xaf\x3d\x0e\x7c\xcb\xf1\xc1\x65\x2d\xb1\x2b\xd8" + - "\x9d\xe8\x3b\x6c\xde\xe9\x52\xd2\xec\x32\x91\x8d\x23\x9c\x59\x6d\xaa\x0c\x43\x74\xb5\xe5\x70\x8a\x54\x57\xa9\xaa" + - "\xcc\xd2\x92\x89\xa2\xf1\x79\x98\xb6\xb6\x80\x95\x55\x3d\xc5\x4a\x67\xa1\x72\xf0\x69\x79\x50\x8f\xa7\xfa\xa0\x54" + - "\x68\xb1\x8d\x50\x8f\x3d\x31\x5e\x91\x76\x0a\xcc\x2e\xa0\x48\xb1\x6a\x8d\x95\x83\x87\x7e\xc8\x41\xc2\x67\x5b\x0e" + - "\xea\x67\xad\x4a\x85\x7a\xa0\x9e\x72\x8a\xf6\x81\x4a\x9e\xfe\xe1\xe0\x9b\xa7\xa3\x3f\x3c\xfa\x26\x01\xff\x19\xfc" + - "\xe8\x91\x44\x92\xc1\xf1\x4f\x10\xe3\xba\x2a\x57\xb3\x39\x94\xb2\xcc\x2c\x5f\x4b\x08\x7d\x4f\x8a\x30\xde\x7c\xae" + - "\x0b\xfb\xca\xe1\xdc\x74\xe6\x6a\x11\xab\xe5\x13\x4b\x77\xa2\x44\xfe\x2f\x1e\x13\xdb\x99\x89\xed\xc8\x1b\x38\xe1" + - "\xe1\x7e\xf8\xc9\x2c\xcc\xe2\x9c\x32\xb4\x37\xe5\x72\x2f\x37\x97\x26\x67\xf2\x46\x46\x3e\x1e\x96\xdb\x7d\x5e\x41" + - "\x18\x54\xf6\x5d\x76\x65\x6a\x75\xff\xe0\xd1\xe3\x27\x5f\x74\x0c\xf5\x67\x73\x7e\x91\x35\x03\xf5\xea\xa5\x58\x67" + - "\xbb\x71\x9f\x93\x06\xf2\x48\x25\x49\xa7\xb4\x7b\x2f\xc8\xaa\x41\x6b\x86\xbc\x05\xf7\x09\x08\x24\xf7\xaf\xa3\xd2" + - "\x7b\xdd\x20\x79\x44\x38\x61\xaa\x1c\x34\x5e\xc0\xee\xdd\x7f\xb2\xff\xd5\x97\x6a\x4f\xbd\x9a\x12\x0f\x03\xbe\x83" + - "\xf6\x3a\xcb\x0a\xbc\x46\x9d\xa2\x51\x93\x4a\xb2\xd6\x0b\x82\x30\xa4\xc4\xb5\x5c\x17\xe4\xe1\xa5\xe2\x80\x4d\x5b" + - "\x94\x00\xbc\xaa\x8b\x6b\xc8\xd7\xe2\x49\xb6\xbf\x8a\x04\x7e\x6a\x41\xc0\xe9\x78\x25\xc9\xdb\x6a\xfb\xe8\x48\xed" + - "\x1d\x08\x40\xec\xce\x14\x4d\xce\xb7\xe1\x5f\x61\xd2\xe1\x9e\x58\x22\x40\x7c\x19\x4c\x3b\xed\x0e\xbe\xc8\xbb\x69" + - "\x14\xd6\x15\xb1\x12\x5c\xef\xa7\xf1\x28\x04\x57\xc5\x83\xf0\x6c\x60\xc8\x69\x00\x86\x69\x0b\x45\xe2\x39\xf8\x4c" + - "\x1a\x65\x69\xd8\x0a\xb5\xf2\x62\xb6\x49\x77\xe9\x1d\x1e\x3d\x92\x61\x6b\xaf\x34\x8b\xa5\x03\x2e\xf4\x27\x1f\x11" + - "\xec\xbc\x96\x56\x5c\x1b\x28\xb5\x52\xaa\x30\x49\x2c\xa8\x59\xba\x44\x02\x46\xf5\x4e\x78\x55\x9e\x65\xc1\xf0\x80" + - "\x61\xec\x05\x28\xf0\x22\x66\x47\xf2\x33\x81\x21\x13\xb4\x4e\x17\xe6\xfa\x53\x00\x46\x05\x9b\x12\x31\x24\xbd\x16" + - "\xfb\xd1\x0f\x63\x35\x43\x66\x45\x72\x15\x9b\x10\x8f\xed\xd8\x2f\xcc\xb5\x43\xe9\xf5\x1a\x42\x17\xea\x12\x7a\x27" + - "\xda\xc2\x56\xf4\x4b\xe3\x0c\x79\x13\x3d\x99\x9b\x53\x78\xdf\x5e\xb0\x54\x64\x83\x16\x0b\x13\x2a\x00\x37\x14\x0a" + - "\xc0\xfc\x04\x96\xb1\x2f\x70\x67\xfa\x35\x41\x8b\x29\xcb\x2f\xe6\xb9\xd6\xaa\x9e\x97\x55\x33\x59\x89\x80\xcf\x8e" + - "\xba\x1e\xd4\xaa\xbc\x34\xd5\xdc\xe8\xd4\xd5\x12\x71\x0f\x9f\x90\xf6\x28\xed\x48\x79\x24\x01\xc4\x3a\xe1\xbf\xba" + - "\xe7\x57\x8e\x5e\xe4\xba\xd6\xc5\xb5\x80\xed\xfa\x07\xe9\x9a\xff\xc1\xda\xca\xad\x2d\xaf\xab\xed\xae\x77\xf3\xa1" + - "\xb8\xa5\x99\x55\x6d\x2a\xd1\x86\x6c\x00\xf4\x93\xd4\x80\xd8\x5f\xf0\xd8\x87\x52\x9d\x75\x58\xf8\xbb\xfc\x47\xb7" + - "\x30\x8b\xad\x3f\x73\x10\x9e\x17\xb9\x42\xb0\x62\x15\x7d\x2d\x36\x94\xe5\xc2\x97\x2e\x94\xce\xab\x11\x09\x43\x8e" + - "\xb9\x71\x73\x45\x18\xc2\x4e\x11\x89\x6e\x30\xe0\xd6\xd6\xeb\x6f\xf0\xba\x90\xd1\xf2\x6d\xf5\x48\xc7\xe3\x0d\xcf" + - "\xbf\x0e\x78\x1e\x08\x6d\x0b\xae\xdc\x4b\xd6\x5d\xc9\x55\x23\x81\x8e\xe3\x71\xa1\x8c\x70\x91\x73\xa0\x6c\x82\xa4" + - "\xe1\x15\xd2\x76\x79\x96\xfe\x25\x69\xb9\x00\x93\xab\xc0\x5f\x1e\x44\x04\x30\xf2\xc5\xfc\x0f\x8e\xde\x52\xd4\xc6" + - "\x63\xe2\xb6\x4d\xb9\x04\xda\x29\x69\x3b\x05\x76\x74\x5c\x8f\x52\x80\x97\xd3\x40\x99\x59\xfe\xdf\x39\x0f\x59\x51" + - "\x9b\xaa\xf9\x16\xa0\x08\x1c\x65\xc2\x57\x9e\xcf\xdc\x3c\x37\x88\x61\xf0\x3f\x31\x35\x5d\xe9\x41\xa2\x17\xdd\x9d" + - "\xf7\x8e\x4b\x1d\xfd\x85\x3c\xfd\xff\x77\xeb\xee\xb0\x30\x57\xcd\x49\x86\xb1\xcc\x1b\xbb\xde\x4e\x98\xeb\x3d\xed" + - "\x2e\x48\x4d\xa7\x46\x0f\xd5\xab\xa2\x31\x55\xa1\x73\xf0\x71\x85\xd4\x28\x0f\x47\x2d\x95\x8a\xd3\x5b\xd4\xd2\xb7" + - "\xfa\x58\x39\xbc\x4b\x44\xa8\x11\xbe\x7c\x44\xec\x44\x34\xc3\xdd\xcc\x48\x06\xac\x08\xa2\xf5\xb7\x99\x90\x6d\xd7" + - "\xeb\x9d\x9d\x4e\x9d\x71\x1c\x01\xe3\x58\xac\x5e\xa4\x5f\x8c\x39\x4e\x1f\xa1\xdf\xb5\x2c\xc4\xb1\xf8\xb6\x7f\x07" + - "\x3b\x2e\x28\x6f\xc4\xf8\xde\xa1\x49\x73\x84\x38\xea\x16\x71\x06\x1b\x09\x51\xc0\x76\xb2\xbb\x24\xed\x08\xb8\x6d" + - "\x36\x04\x69\xba\x45\xbe\x6d\x95\xc0\x2f\xef\xf6\x45\xda\xb8\x2e\x4e\xa5\xc2\xf8\x43\x0b\xb3\x28\xab\x6b\x95\x1b" + - "\x4d\x00\x2a\x77\x2c\x9b\xc3\x3e\x08\x35\x34\x24\x66\x86\xec\x84\x50\xd0\x20\x4f\xdf\x29\xb7\xde\x3d\x63\x2d\x93" + - "\xcd\xa7\x1a\x6b\x42\x15\xf9\x51\xa4\x32\x77\xb9\xb7\x68\x48\xe3\xf0\x3d\xf4\xae\x5d\xf5\x51\x47\x73\xbe\xa6\xb0" + - "\x85\x71\xbb\xec\x61\x6b\xa0\xc3\x85\x5e\xb6\xb9\x8e\xd0\x75\x09\x66\x80\x2f\x84\xbb\x47\xdf\xf6\x40\x9d\x37\x8b" + - "\xfc\x3f\xc3\x6e\xc5\x0e\xa2\x6a\x9f\xe1\xcd\x19\x9f\xc4\x2b\x65\x41\x2b\x0b\x63\x0c\x94\xb2\xb8\x47\xbb\x18\xb6" + - "\xbb\x48\x8a\xf0\xa5\xf1\xda\xae\x96\xdc\x7a\x62\x0c\x65\x93\x9a\xe8\x42\x35\x98\x17\xc3\x49\x07\xba\x48\x31\x31" + - "\x20\x20\x17\x72\x25\xe2\x62\x40\xa7\x65\xdf\x3d\x17\x73\xb2\xb3\xa3\xb6\xa5\x73\x28\xc9\xab\x3c\x3f\xce\x24\xe6" + - "\xb4\x76\x2d\x3d\x20\x17\xbd\x5b\x11\xc8\x82\x01\xb3\x0a\x68\xea\x44\x10\x8b\x3b\x55\x79\xee\x64\x36\xd5\xb5\xa3" + - "\x7c\xb7\xa8\xc2\xbd\x36\x1c\x97\x34\x8b\x92\x61\x84\x87\x9c\x94\x31\xa4\xfd\xa6\x2c\x78\x1b\x88\xc9\x5d\xf4\x28" + - "\x94\xb7\x3e\x89\xe6\x6c\xf9\x0e\x07\x1a\xcf\x80\x7f\x96\x12\x18\xfd\xa2\x11\xee\x4b\xb2\xf5\x6a\x4a\x01\x23\xbe" + - "\x22\x54\x0e\x42\xb4\xcb\x95\x95\xb3\x01\x20\x68\xc5\xa9\x40\x74\x9e\x03\x34\x91\x4c\x8d\xf3\x51\x4d\x30\x03\x3b" + - "\x1c\x92\x8f\xdd\x77\x5a\xc4\x5f\xb0\xc8\x81\x0c\xad\xdb\x18\x01\xde\xd4\xef\xe0\xf9\x69\x47\xfc\x9c\x35\xf3\xee" + - "\x9b\x45\x57\x33\x75\xe4\xeb\x60\xb5\xec\x3d\x91\x3a\x06\xfd\x12\x74\x31\x33\xe0\x50\x66\x2b\x04\x74\x0e\x3d\x99" + - "\x3b\x87\x0a\x5e\x7a\x97\x2c\xa9\x30\x6b\xa9\xf9\xfd\xdd\xac\x18\xf6\x2b\x62\xb9\x5c\x6e\x8c\x8d\xbb\x82\xf8\x9a" + - "\x7e\x40\x50\x6c\x5d\x6e\x96\x75\x35\xe3\x73\x22\x6e\xe9\x4d\x8c\x26\xcd\xc3\x77\x65\x35\x31\x2e\x5f\x33\x06\x8a" + - "\x57\x46\xad\x35\xa4\x20\x16\x63\xe5\xb4\x74\xa0\x4e\xc5\xa8\x28\x37\xd6\xbe\x24\xa9\x15\x38\xb1\xf4\x6c\x6f\x68" + - "\xd9\x6e\x6e\xec\x53\x77\x18\x18\xed\x92\x71\x29\x49\xe3\x21\x17\x17\x53\xdd\x75\xb1\x90\x5d\xa1\x03\xac\x32\xe9" + - "\xca\x47\xcf\x15\xd2\x02\xc9\x2a\x75\x35\xab\x07\x10\x4f\x05\xfb\x5b\x86\x52\x7f\x97\xeb\xa6\x31\x05\x5c\xee\x85" + - "\xa9\x1b\x93\xa2\x32\x1d\x8e\x38\xa5\xf4\x41\xb4\x4d\x0e\xe4\x3a\x3d\x8b\xd2\x55\xd8\x2d\xc8\xda\xb7\x01\xe6\x6b" + - "\x11\x36\xc4\xb9\xae\x4f\xf8\xb7\x9d\x17\xc4\x49\xf6\x7c\x90\xb7\xf0\x89\xbb\x84\xd4\x6f\x11\x14\x41\xf6\x06\x3d" + - "\x1b\xd4\x91\xca\xd5\x9e\x3a\x18\xd0\x9d\x85\xe4\x13\x32\xf1\xd8\xad\x4f\x85\x5d\x72\x2d\xaf\xbe\x93\x09\xb7\xfc" + - "\xa1\xa4\x99\xf8\x19\x6e\x94\x07\x8d\x72\xfe\x1c\x6e\x54\x35\x2a\xaa\x89\x1b\x65\x07\x9f\x81\xca\x0a\xe5\x8d\x15" + - "\xb0\x4d\x45\xab\x0c\x2d\xd4\x53\x39\x64\xeb\xa3\xb8\xa9\x4d\xb7\x0f\x11\x32\xe7\xc5\x01\x8d\xe0\x70\x9d\x03\x90" + - "\x49\xa3\x5b\x29\x4e\x2b\xdc\x15\x60\xa2\x00\x4d\x3f\x94\x4c\x6b\x93\x4f\x41\xca\x68\x86\xe6\x9f\xae\xc4\xa1\x60" + - "\xc6\xc5\x40\x3c\x2d\x77\x53\xec\x6e\x2b\x99\x88\x03\x6a\x01\x35\xfc\x14\xd0\x6b\x7a\x2d\x46\x1b\x5e\x05\x14\x24" + - "\xd8\x96\x74\x70\xfb\xad\x48\x47\x1f\x3b\x2a\xac\xca\xb4\xa6\x81\x55\x9b\xeb\x74\xcc\x4b\x2c\x32\xc0\x5d\x13\x12" + - "\x0a\xd8\xb0\xb7\x1b\x73\x30\xf4\x88\xdf\x7b\xdb\x11\x1f\xfb\xe8\xce\x13\x9d\xc4\xec\x45\xed\x5b\x03\x1b\xf5\x1a" + - "\x7b\xd2\xb7\xbb\x51\x59\xb6\xb1\x65\x40\x90\x32\xcc\x20\xf4\xd0\x76\x33\xed\x8f\x9b\x5d\x5f\xd2\xa7\x87\x0c\x9a" + - "\x4c\x7f\xe5\xbc\x50\x5c\x9f\x39\x51\x4b\xae\xeb\x46\x65\x8d\x59\x00\x24\x99\xd1\x29\x63\x1c\x63\xd7\xd9\x0e\x97" + - "\x35\xc0\x87\x99\x22\x55\xab\xa5\xab\x1e\xf3\xf7\x5a\xda\x99\x99\x14\xc0\xa0\x2a\x34\xa3\x43\x9e\x5f\x53\xc1\x31" + - "\xaa\xb3\x06\x6d\x1a\xb5\xea\xdd\xff\x6a\xff\xcb\x7d\x4e\x11\x74\x2b\x33\x03\xd8\xb1\x47\x52\xdd\x7f\x4f\x28\xf2" + - "\x32\xd0\xb3\x3b\x42\x21\xd8\x10\xfa\x2e\xe4\xb9\x91\x20\x01\xce\x9e\xa7\xa4\x82\x29\xfa\x93\x31\x4b\x55\x19\x40" + - "\x22\x9c\x98\x9a\x22\x64\xc0\xd5\x82\x26\xd9\xf6\x35\xd7\x8d\xa9\xc8\x6f\x5d\xda\x8b\x39\xe5\xa4\x5b\x11\xc9\x15" + - "\xdd\x62\xf3\xfc\x77\xad\x9e\xb1\xdd\xd3\xd1\x62\xde\x50\x38\xec\x0e\x81\xb8\x8b\xb5\xe2\xf3\x29\xce\x3a\x79\xea" + - "\x60\x35\x99\x3c\xe5\x82\x82\x74\x8e\x1b\x41\x19\xa8\x43\xa7\xd1\x06\xb5\x34\x3d\x3e\xb2\x91\x71\xd6\x14\x80\xb9" + - "\x4d\xdf\xd1\x1b\x79\x66\xdc\x58\x83\x30\x82\xc8\xc8\xfb\x92\x7c\xef\x85\xf1\xcb\x2d\x28\xb8\x88\xda\x1d\xee\xb0" + - "\x43\x50\x47\xe4\x97\xb5\x95\xd1\xc5\x8f\xb4\xc5\x79\xd3\xae\x73\x03\xce\xbc\xee\x7e\x93\x85\xcc\x7e\x12\x5a\xc8" + - "\xdc\xe5\xb0\xb5\xb5\xdd\x76\x20\xa7\xc5\x0c\xdc\xee\x3b\x55\x28\x80\x0f\x51\xa0\xde\x45\x88\x1f\xdc\x13\x68\x17" + - "\x1d\xa2\x85\xb1\x64\x34\x52\x6f\x81\x4f\xd6\xb9\x7a\xf6\x7f\x9e\xfd\x55\xa5\xa0\x79\x45\xdc\xd6\xf3\x55\xa3\xd6" + - "\x98\x7e\x72\x55\xb8\x19\xcc\xa6\x98\xd1\x17\x1d\x28\x7c\x55\xd2\xcc\xf5\xc1\x5c\xea\xfc\xcf\x55\x1e\x36\xb6\x15" + - "\xbd\x95\x9d\xf2\xc2\x81\xb7\xc4\x6c\x36\xee\xcc\x84\x1a\x08\x27\xd4\xab\x27\x84\x88\x25\x42\xe7\x06\x64\x8d\xbc" + - "\xdb\xe0\xb3\xd1\x04\xe9\x34\x1b\xb1\x75\xc4\x01\x4d\xa1\x44\xf0\xae\x1c\xab\x04\x7f\x22\x54\x14\x6a\xb3\xe1\x31" + - "\xfd\x86\xe7\x52\x39\x39\x56\x09\x2a\x76\xc5\x9b\x67\xa8\x39\x4d\x40\x83\x0a\xcf\x69\x64\xcf\xf2\x7c\xac\x12\x21" + - "\x37\xc4\x98\x53\x05\x18\xe4\xa3\x7c\x16\xce\x94\x73\x8a\xc9\x51\xcf\x42\xa0\xcb\x88\x2d\x65\x55\x01\xf1\x66\xe8" + - "\x93\xee\x7c\xb7\xa0\x7f\x8e\xdc\xca\xaf\x89\xdf\xd3\x70\xe7\x62\x39\x71\xfc\x37\x2b\xc8\x32\xf5\xf4\x08\x2e\xa5" + - "\xb6\xa3\x57\x0d\x19\x91\x21\xff\x81\xad\x36\xe4\xb9\x59\xbb\x22\x00\x57\xb8\x53\xd8\x3a\xf9\x18\x9e\xfa\xe9\x38" + - "\x73\x56\x62\x61\x92\xef\x26\xd6\xa3\x91\x82\x40\x98\xfe\xef\x22\xd1\xa2\x0c\xa6\xda\x44\xe7\x36\xac\xa8\x2b\x61" + - "\x0e\xca\x50\xab\x7a\x7e\xd2\xe8\xc9\x05\x66\x86\x43\xa6\xff\x30\x8c\xb5\x55\xd9\xb4\xb2\x6b\x4b\x71\x5a\x69\x56" + - "\x2f\x73\x7d\xed\x83\x39\x46\x0f\x1f\xde\xfb\x4c\x3d\x54\x3f\x99\xa6\xca\xcc\x25\x32\x01\x7a\xd2\xac\x74\xae\xb8" + - "\x30\x78\xac\x93\x30\x08\x85\xff\x7f\x10\x84\xab\x7e\x3b\x01\x66\xf5\x23\xe5\xcf\x65\x5f\x6e\x4e\x7d\xd0\xf1\x01" + - "\xa2\xa7\x7c\x04\x28\x1e\x07\xbf\xc3\xa0\x93\xea\xe1\x08\x11\xa9\x74\x9e\x03\xfe\x62\x7e\x8d\x22\x97\x95\x3f\xb3" + - "\x82\xdd\xcf\x5f\x60\xaf\x84\x07\x3f\x76\x97\x9e\xf3\x5e\xb6\x4d\x78\x37\x7e\x08\xe5\x85\xbd\x44\x8a\x01\x5e\x72" + - "\x48\xbe\x11\x78\x85\xe1\x68\xfa\x8a\xc5\xf5\x77\x25\x96\x82\xf8\x49\x4a\xe4\x63\x97\x79\x66\x18\x01\xe1\x79\xb9" + - "\x58\xae\x1a\x93\x9e\xd8\x46\xd4\x02\x1c\xa4\xce\xad\x64\x99\x67\xfa\x3c\x87\xc0\x13\x1a\x8e\xed\x6c\x43\xa9\xcc" + - "\xdd\xfc\x6c\x6d\xf9\x55\x21\xcc\xf7\x4d\x75\x83\xeb\x36\x8c\xe5\xce\xb2\x9c\x41\x78\x1f\x74\x4b\x2e\x3e\x91\x79" + - "\x3d\x58\xa4\xac\xe6\xec\xc8\x60\x52\x6f\xcc\x62\x59\x56\xba\xba\x06\xa0\xa1\xde\xa2\xac\x8c\xb2\x5b\x55\x95\xcb" + - "\x66\x91\xfd\x0a\x9c\x4c\x5f\xad\x8a\x26\xcb\x01\x39\x0b\x3c\x72\xd4\xb9\x69\x1a\xc0\xef\x5e\x98\x5a\xe9\xbc\x2c" + - "\x66\x03\x6e\x08\x61\x43\xb2\x06\x64\x6a\x14\x55\x53\x5c\x52\x82\xd2\x9c\xa0\x0b\x8b\x2e\x52\x0e\x2a\xe6\x99\xca" + - "\x0a\xf5\xdd\x77\x28\xf4\xd9\xd1\x0c\x79\x8a\xc6\xee\x1a\xab\x6b\x31\xc4\x81\x4a\xa8\x84\x53\x88\xa1\x04\x87\x48" + - "\xe2\x98\x12\xa1\xb8\xc6\xe0\x77\xe0\x03\x5c\x46\x68\xf6\x36\xc2\x4f\xea\x12\xd4\x3f\x09\x8a\xe1\x09\xcf\x8f\xae" + - "\xd5\xd4\x92\x92\xb5\xbe\xb6\x3c\xdf\xcc\x34\xaa\xca\xd2\xd6\x56\x47\x3d\x15\x7e\xcb\x51\x21\x74\x62\xa9\x7b\x2e" + - "\x26\x85\xce\xdd\xbb\x0a\x2a\x4c\x5d\x12\x55\x19\x68\xc1\x83\x46\xe9\xce\x1e\xc3\xe2\xf6\x73\x48\x47\x90\xce\x92" + - "\x8f\xdd\x0c\x4e\x8e\x08\xc7\xf0\x07\x04\xf9\x30\x66\x71\x06\xe1\xae\x14\x94\xe3\xd4\x7f\x7c\x26\x62\xea\xb6\xb9" + - "\x30\xeb\xe2\xdd\xb7\xf1\xe1\xa4\xaf\xe9\x80\x06\xf9\xca\xc1\x33\x2c\x5b\x2c\x73\x03\xf3\x3c\xd5\x59\x0e\x7c\x9b" + - "\xa6\x4d\x93\x15\x00\xfd\xa7\x0b\x22\x6a\x4e\x1c\x74\xad\x59\x09\xba\x28\x0b\x03\xc1\x25\x61\x9f\xe4\xe6\x07\x1a" + - "\x87\xb1\x97\x7b\x78\xf8\x53\xaa\x52\xa6\x4a\x20\xe1\xac\xc2\xe8\x9f\x1e\xfd\x72\x00\xb4\x3d\x95\x3c\xa5\x67\xf0" + - "\xdf\xf3\xb2\x4a\x4d\x75\xf4\x60\xff\x81\x5a\x67\x69\x33\x87\x5f\x73\x63\xa9\x81\xfd\x39\xfa\x26\x51\xfd\x98\xa6" + - "\x44\x09\x93\x42\x57\xb2\x7c\xad\xaf\x6b\x48\x2b\x63\x94\x06\x7d\x14\xa8\x2c\xeb\x0b\x93\x9b\xa6\x2c\xec\x56\x45" + - "\x87\x41\x38\x3f\x1e\x4c\x1e\x54\x16\xf3\xf2\x02\x30\xca\x2b\xb3\xaa\x71\x24\xb8\xc2\xd8\x63\x14\x85\x49\xbd\x15" + - "\x73\xd6\x61\xb0\x09\x7f\x3b\x84\x8e\xb0\xcf\x2a\xe6\x2c\x2a\x7d\xec\xd3\xef\x5a\x72\x37\xaf\xf2\xa8\x04\x39\x45" + - "\x5c\xf0\x32\x03\x3a\x47\x47\x82\x29\x79\xc7\xae\xb4\xdb\xd8\x9d\xb5\x30\x2a\x37\x38\x83\x10\x38\xb7\xd0\xd5\x2c" + - "\x2b\xec\xf2\x8e\xfe\x8e\xbf\x47\x38\x20\x78\x5b\xac\x16\x45\x59\x2c\xaf\x28\x5b\xcc\x4f\x66\xf6\xf2\x6a\xd9\x53" + - "\xc9\xdf\x7b\x89\xda\x55\xcb\x62\xb5\x50\xbb\x2a\xe9\xf7\x8e\xb7\x97\x57\xfd\x53\xbd\xf7\xeb\x7f\x9d\xed\xfe\x21" + - "\x19\xa8\x24\x63\x2a\x64\xab\x99\x99\x06\x28\x72\xdd\x82\x2e\x8f\x34\x7a\x1d\xc1\xdf\x1c\xe9\x94\x19\x20\xf4\x1d" + - "\x14\x7e\x40\x58\x5a\x87\x0e\x29\x20\x8c\xaa\x5d\x55\xcf\x4f\x4e\x5c\x51\x58\x86\x09\xd5\x22\x8e\x3f\xec\xd8\x81" + - "\x5a\x64\xc5\xcf\xf4\x4b\x5f\xd1\x2f\x06\x03\xe5\x6b\x07\x7a\x09\x7f\xe0\xca\xbb\xda\x8e\x7c\xc5\x18\x29\x82\xa3" + - "\x0e\xa3\x6f\xc2\xcd\xf5\x35\x3e\x99\x99\xe6\x47\xc4\xa4\xbe\xc6\x30\xaf\xac\xc6\x5b\xa0\x30\x26\xb5\x57\x46\x59" + - "\x29\x20\xf8\x0f\xd0\xe8\xfd\xa0\x6f\xef\x87\x57\x2f\xbf\x1e\xa8\xda\x18\x75\xff\xe0\xd1\xe7\x8f\xbf\x64\x52\x14" + - "\x8d\x6e\x8b\x83\x23\xf1\xe9\x30\x6e\xcb\xdd\xf7\x37\x37\xae\x10\xf3\xbb\x7e\x03\x75\xd4\xec\xa8\x0f\x34\x60\x29" + - "\x4f\xd2\x8d\x0b\xfa\x09\x96\x6a\xec\x23\x7d\x59\x07\x8b\x0b\x9d\x8b\x8f\x07\xcf\x60\xf6\xf6\x44\x3d\x55\x5f\xd0" + - "\xe3\x67\x8a\x63\xfc\xc9\x57\x3b\xd1\x6b\x03\x69\xa6\xe6\x7a\x72\xa1\xce\xaf\xd5\x0b\xa3\x0b\xf5\x32\x5d\xeb\x2a" + - "\xad\x13\xfa\x8a\xea\x50\x3d\xdd\xa8\xdc\xe8\xba\xe9\x53\x28\x60\xad\x96\xa6\x9a\x98\xa2\xd1\x33\x8c\xde\xd2\x2a" + - "\xd7\xd5\xcc\x54\x0a\xd2\x3f\x93\xda\xb2\x26\xa9\xcf\x6e\x16\xbb\x1a\x0b\x50\x8a\x48\xf6\x67\x99\x5d\x99\x9c\x13" + - "\xd4\x36\xec\xc0\x37\xb3\x93\x83\xf1\x91\xcf\x4f\x4e\xde\xbe\x56\x69\xa5\xa7\x0d\x30\x06\x2e\x24\x2c\x35\x97\x0c" + - "\x9c\x3d\xa9\xeb\x35\xfc\xb7\x5c\x8c\xee\x57\xa6\x2e\xf3\x4b\x93\xee\x61\x0f\xfc\x4a\xf0\x81\x25\xc9\x19\xc3\x41" + - "\x77\x76\xf8\x9c\xb3\x40\x4d\x0c\x9e\xbc\x16\x02\x37\x6f\xc7\xf8\xfb\xfa\xb7\x70\x80\x47\xc8\x7d\x0d\xe1\x2f\xa4" + - "\x64\x7c\x66\xdc\x3b\x7e\x40\xaf\xe9\x20\xf9\xd7\xf4\x40\x7a\xf7\xae\x1a\x4e\x9e\x6d\xe9\x0c\xb6\xca\x7c\x86\xf6" + - "\xfb\x8e\xf8\x00\x44\x26\xdd\x0a\x5b\x6b\xd5\x1f\xf6\x15\x01\x91\x0e\xc5\x6e\x73\x27\x62\x1d\xf5\xe6\x27\x03\xe1" + - "\x17\xde\x42\x94\xca\x79\x08\xeb\x14\xf3\xd0\xea\x4e\x38\x0f\xad\xce\x89\x79\x90\x01\xdb\x1e\xb0\x36\xca\x66\x72" + - "\x1c\x6f\x7e\xbc\x9b\x2c\xeb\xf0\xd2\xed\xd8\x5f\x5f\x81\xe6\x1a\x27\x4a\x83\x61\x2f\x2b\x1a\x33\x33\x98\xa3\xc3" + - "\xd6\xba\x6b\x0f\x6a\x1c\x22\x2c\xa5\x89\x34\xfd\xa3\x69\xbe\x2f\xcb\x8b\x57\x53\x70\xa6\x4e\x33\xfb\xfc\xbb\x62" + - "\x00\x89\xab\xbf\x63\xfd\x37\xc4\x4a\x4c\x99\x65\xb3\xaf\x06\x6a\x6d\x1e\xe4\x39\x9a\x03\x98\xbd\x44\xdd\x51\xb5" + - "\x2a\x00\x05\xbf\x79\x60\x19\x61\x9d\x3b\xda\x36\xf4\x43\x06\x52\x30\x33\x1d\xf8\xe9\xce\xaf\x9b\xbb\x22\x32\x69" + - "\xd8\x7e\x40\x5e\x36\xc8\xd9\x87\xf4\xb2\x57\x56\xd8\x14\xa8\x5d\x38\xf3\x53\x53\x52\xfa\x3e\x95\xae\xe0\x2f\xce" + - "\x2b\xe9\x35\x38\x24\x8c\xdb\x3a\x09\x61\x2f\xe3\x64\x33\x76\xe6\x81\x9d\x47\x2b\x99\xae\x20\x9b\x7b\x09\x99\xe4" + - "\xe7\x90\xb8\xcd\x92\x08\x3c\x67\x3f\x59\xa6\x67\xc0\x55\xd8\x59\x58\x43\x4a\x6a\x94\xf4\xa8\x42\x72\x37\x05\x49" + - "\x76\xc6\x5b\x53\x20\x30\x04\x46\x7e\x1c\x21\x8c\xee\x50\x55\x06\xf7\x84\x1d\x4a\x5d\xa2\x29\x06\x78\x47\xc2\x25" + - "\xb2\xa7\x9c\xb3\xe5\xa0\x42\xcf\xa4\x48\x70\x86\x54\x23\xcd\x78\x8f\x1b\x57\x47\xb4\xb6\xfd\xdb\xd1\x09\x1d\x7c" + - "\x32\xee\x99\xd8\x91\xc3\xde\xa4\x40\xed\x7e\x2c\x6b\x58\xa9\xbf\xe8\x7c\xa0\xce\xcb\xab\x93\xec\xd7\xac\x98\xfd" + - "\x84\x14\xd1\xfc\x85\x5c\xc5\xd3\x12\x42\x1d\x05\xdf\x1d\x33\x84\x84\x63\x44\xa1\x26\xb2\x60\x24\xb3\x42\x28\x13" + - "\xe9\x52\xd2\xec\xf2\xee\x92\x21\xef\x7e\x89\x97\xce\x26\x18\x0c\x57\x60\x78\xae\x27\x17\xb3\xaa\x5c\x15\xe9\xf3" + - "\x3c\x5b\xaa\x23\x95\x10\x13\xb9\x77\x5e\x5e\x81\x8b\x8f\x2d\xdb\x0a\x80\xde\xf8\x35\x7c\xe2\x2c\x5c\xb9\xd1\x15" + - "\xe8\xe9\x4f\x88\xd7\xd8\xdc\xf0\x51\xbb\x69\xe0\x45\x68\xaa\xe8\xab\x49\x5d\xbf\x33\x57\xe0\x7f\x84\xec\xf9\x78" + - "\xff\x10\x48\xd6\x78\xff\x10\x59\xf3\xf1\xfe\x61\x53\x2e\xc7\xfb\x87\xb9\x99\x36\xe3\xbd\xaf\xbf\xfe\xfa\xeb\xe5" + - "\xd5\x21\x6e\xe3\x3d\xfb\xe6\x60\x79\x75\x98\x28\x48\xda\x94\x2c\x69\x59\xc7\xfa\xbc\x2e\xf3\x55\x63\xa0\xfb\xbe" + - "\xd1\xc0\x61\xd5\x2e\x83\x67\x7a\x5e\xc2\x3e\x04\x79\xb9\x6c\xe6\xe1\x2e\x51\x3b\xed\x3d\x02\x9b\xd8\xc1\x22\xb1" + - "\xf6\xc0\xa8\x5c\x5f\x23\xfd\x47\x59\xb5\x99\x9b\xeb\x07\x2e\x68\xc3\x6e\xf3\xc6\xa7\x28\x02\xe8\xfb\xa6\x54\xb5" + - "\xa6\x53\x58\x1b\x4b\x43\x88\xf2\x83\xe8\x6d\xcf\xa2\xe7\x15\xf1\x46\xf8\x51\xf6\xed\x59\x91\x7e\x1b\xf7\xad\xe7" + - "\x84\xbc\xcb\x78\x9e\x5b\x02\x04\x89\x25\x4f\x1f\x7d\x3d\x70\xc9\x51\x1e\x0d\x1f\x73\xb9\xbf\x98\x22\x2d\xab\xbd" + - "\x65\x65\xa6\xd9\x95\x9d\x85\xbd\x1a\x9a\x82\xf7\xc9\xde\x1a\xe4\x9b\x3d\xff\x7c\x8c\xcb\x68\x9f\x1c\xee\x2d\xca" + - "\x5f\x37\xbc\xa2\x05\xdb\x4a\xba\x5f\x93\x1c\x30\x3e\xcf\xcb\xc9\x45\xb0\xd8\xff\x75\x48\xff\x88\x1a\x60\xdf\xd8" + - "\x6d\xb0\xd4\x69\x6a\x6b\xb2\xbf\x71\x17\x3d\xb1\x4f\x3b\x37\x05\x4c\x8e\x74\x58\x21\x07\x38\x3a\xf3\xed\xf0\x44" + - "\x3c\xe1\xd2\x84\x9e\x66\x97\x27\x2d\x55\x4f\x24\x01\xa4\xd9\xa5\x14\x00\xb6\x62\xea\x83\x67\x08\x0a\x0f\x9b\x72" + - "\x89\xf8\xc6\x07\xff\x85\x7d\xe9\x22\x4c\xf2\x03\xba\xe4\xed\x27\x4f\x96\x7c\xc4\xdc\x08\x02\xa7\xc8\x70\x04\x1e" + - "\x7b\xc5\xed\x03\xd0\xb9\xff\x52\xab\x5f\xea\xb4\x5c\xd0\xed\x09\x92\xaa\xae\xeb\x95\xdd\xa6\x96\x88\xc7\xe3\x43" + - "\xb5\x14\xa5\xab\x71\x39\x55\x51\x95\x1f\xe5\xaa\xd9\x30\x43\x4c\xd1\x22\x60\x16\xa2\x38\x03\xba\x43\x83\x59\xeb" + - "\x82\x0f\xe7\xc8\x13\xbe\x59\xdc\x71\xa3\x73\x39\x31\xc8\x04\x1b\x55\x37\x59\x9e\xab\xb4\x04\xef\x28\xbf\x95\xbd" + - "\x36\x8c\xfc\xd4\xd8\xc7\xa8\x7d\xf0\x97\x95\xd9\xc3\x93\x98\x15\x33\x7f\xf9\xbe\x29\xe1\xfe\x03\x8b\x23\xf0\x17" + - "\x94\xd9\x00\xba\xb4\xb6\xac\x0e\x81\x49\x11\xc6\x82\x49\x07\xaa\x99\x97\xab\xd9\x9c\xea\xf8\xf4\xd3\x1d\xa2\xf6" + - "\xc6\x5b\x8a\xee\x66\xe4\x14\x5a\xdd\xdf\x98\x7f\xb0\x7b\xb3\xc5\x89\xa8\x7f\x7f\x2f\x3f\x06\x9d\xed\x6a\x25\xe8" + - "\x30\x49\x25\xe6\xb5\x67\x54\x36\x2c\x78\x2b\xa7\x13\x93\x2d\x08\x96\xe3\x25\xb0\x54\x1e\xfc\xa3\x38\xd1\x12\x49" + - "\x42\x98\xeb\x97\xf8\xa1\x3d\x0c\x9a\x15\x66\x6f\x57\xd1\xcc\x34\xb5\x67\xf0\x83\xe2\x2e\x0d\x11\xd6\x58\x4e\xfd" + - "\x29\x1b\xaa\xde\xfd\xc7\x8f\x1f\x3f\xee\xbb\x7a\xd0\x04\xa1\xbe\x5d\xcd\xd4\xc1\xe3\xc7\x4f\x1e\xab\xbd\xf6\x69" + - "\x62\x26\x79\x5d\x95\xc5\x8c\x78\x64\xcf\xb4\xed\xf9\x5c\x92\x6e\xbf\x33\x47\xe5\xae\x08\x16\xcc\xc5\x01\x98\x40" + - "\x4e\xd1\x42\xec\x78\xe0\xbd\x1c\x77\xdb\xca\x29\xb2\x85\xed\xbd\x40\x36\x25\xbb\x8c\xae\xcd\xdb\xf9\x96\xd8\x11" + - "\xd9\x8a\xa2\xcf\x4f\x4e\xc6\xe2\xee\x38\x74\x7a\x1e\x1a\xd9\xa1\x42\x22\x7e\xa8\x88\x82\xe3\xf7\xae\x1b\x2d\x66" + - "\x61\xd3\xc5\xf6\xe9\x57\xdb\xdd\x97\x5b\xf7\xf5\x26\x58\x9a\xd6\xfd\x26\xdf\xf1\xf5\x14\x5e\x71\xb2\x44\xd7\x1d" + - "\x37\xde\x3f\x74\x6c\x10\x5f\x66\xfb\x1c\x50\x1c\x4f\x87\x60\xe5\x41\x5a\x0b\xdf\xb2\x00\x98\xb8\xef\xd3\xf6\xbb" + - "\x03\xbc\x35\xc8\xce\xff\x29\xf7\x1e\x0b\xa7\xdb\x4b\x5d\xd5\xe6\xbb\xbc\xd4\xcd\x46\xda\xde\xf3\x9d\xe2\x3b\x30" + - "\xe8\xb4\xaf\xf3\x13\xae\xac\x80\x8a\x38\x49\x59\x46\x78\xdc\xfb\xec\x63\xbf\xc7\x96\x35\xd0\xb6\x90\x6d\xc0\x1e" + - "\xa1\x7f\xae\xb2\xc9\x45\x7e\xad\xea\xb5\x5e\x2e\xd1\xc5\x14\xf2\x10\x3d\x3f\x39\x91\xe9\xd6\x48\xa4\x67\xa5\xe6" + - "\x84\xb2\xfd\x67\x65\x51\x0f\x9d\x71\xd8\xd6\xd1\x91\xe5\x90\x90\x95\xbc\x7f\x14\x7b\xdd\x49\x18\x30\x52\xf1\xd9" + - "\x6e\x97\x00\x5c\xc6\x5e\xbd\x2d\x15\x47\x9e\x3a\xfd\x8d\xa5\x55\x64\xa0\x65\x15\x44\x59\x80\xb8\x8f\xb6\x56\xd0" + - "\x97\x64\x05\xf7\x80\xa9\x75\x99\xa7\xc2\x30\xec\xd5\x82\x52\x7b\xb6\xd5\x7e\xac\x8e\xb8\xa2\xb6\x9a\x8d\x34\x13" + - "\xec\x60\x42\xb2\x18\x8e\x1f\x06\x7b\x73\xa3\x4e\xcf\x04\x5b\x2d\x74\x15\x7e\x44\x77\x75\xbc\xbb\x4f\x79\x87\xda" + - "\x2f\xd8\x0f\x1f\x03\x04\x63\x7b\xa1\xdb\xc5\x86\x3b\x1b\x2e\x02\x54\x7f\x83\xdc\x59\x18\x55\x56\xaa\x6e\x74\xd5" + - "\xd4\xe4\x3e\x0b\xe5\xd0\xc9\x98\xb1\x48\x19\x94\x74\x6f\x62\xf2\x3c\x19\xd8\x4f\xf8\x01\x22\xaf\x26\xd4\x8e\x11" + - "\x10\x4a\x81\x4d\x88\xd0\x93\x6a\xd4\x95\x99\xdc\x6e\xb4\xe1\xa2\xfc\x35\xcb\x73\x0d\x6a\x33\x53\xec\xfd\xf9\x64" + - "\x94\x96\x93\x7a\xf4\xfc\xe4\x64\xe4\xb5\xe7\x15\xfd\xa4\xcd\x36\xfa\x7b\xcf\xf6\xfa\x06\x9a\xef\x1d\x6f\xef\x4d" + - "\x4e\x8d\x3e\xeb\x0f\x19\x3b\xb9\x58\x2d\xea\x65\x9e\x35\x77\x69\xc2\x87\x0f\xfb\x4e\x01\x0e\x1f\x56\x26\x7f\xb3" + - "\x5a\xb4\x3f\x3b\xdd\xdd\x3b\xeb\x1f\x85\x5f\x8b\x0f\xad\x58\x55\xd7\x27\xf3\x72\x6d\xf7\xb0\x72\x3c\xb6\x4a\x1c" + - "\x97\x3d\x50\x97\x59\x4d\xb0\xb2\x63\x95\xcc\xb3\x34\x35\x45\x32\xe0\x09\x1a\xab\x04\x48\x5f\xa2\xe0\xe6\x9f\xd4" + - "\xf5\x1b\x48\xbd\xff\xae\xd2\x45\x6d\x19\x24\x4e\x9f\x93\x83\xfd\xf2\x64\x09\x0e\xd0\x63\x4b\xd0\x28\xab\x76\xd1" + - "\xfc\x8c\x22\xa2\x4a\x9e\xec\xef\x27\x22\x42\xa5\xae\x7f\x04\x9a\x8e\xf0\x34\x2a\x41\x33\x8c\xed\xfe\x5b\xfb\x9f" + - "\xd7\xe5\xaf\xf6\x9f\x45\x9d\x90\x8d\x0c\xd4\x29\xe8\x22\xac\x26\x75\xed\x39\xda\x85\x86\x74\x6b\x80\xb3\xb2\x2c" + - "\x2d\xed\xce\x40\x37\x74\x09\x37\x87\xc2\x9b\xc3\x67\x6c\x94\x46\x6f\x2c\xf2\x63\x55\x2e\x11\x29\x0f\x2d\xdc\xac" + - "\xdb\xfc\x8d\x0f\x88\x0b\x84\xb0\x7b\x07\xf0\xed\x91\xd5\x46\xfd\x4d\x13\xb7\xe4\x70\xe7\xe8\xe4\x74\xa8\x05\xe0" + - "\x5d\xc0\xe4\x23\x3f\x6a\x1b\x88\xfb\x0d\x0d\x12\x75\x9a\xe8\x25\x01\xe9\xd9\xa7\xa7\xfb\x67\xc3\xa6\xfc\xf3\x72" + - "\xe9\x42\x20\x76\xe1\xf9\xb0\xce\xb3\x89\xe9\x1d\xa0\x2a\xa3\xac\xb2\x99\xf8\x08\x9e\x41\x3e\x7e\xbf\x02\x81\x2f" + - "\x63\x47\x5e\xfe\x02\x3f\x17\x5f\xa0\x7f\xc7\x2e\x77\xc8\x03\x36\x75\x0e\x3a\x1e\x75\x5b\x55\xc9\x9d\x3c\x8c\x51" + - "\x1b\x6b\xd3\x20\x0b\x7b\x69\xde\xac\x2c\xe5\x65\x52\x46\x4e\xfe\xf5\xea\xbc\xa9\xf4\xa4\x89\xd1\x6c\x61\x5b\xb9" + - "\x23\x17\x06\x93\x08\xa8\x5c\x2e\xcb\x8a\xd1\x3f\xae\x20\xc6\x9b\x14\xeb\x5e\x71\x9a\x70\x3b\xc9\x40\xa1\x23\x3b" + - "\x20\xf6\x81\x57\x82\xae\xc1\x01\xb3\xae\xbf\x2f\x4b\x8c\xe2\x78\xad\x9b\xf9\x70\xa1\xaf\x7a\x6a\x7f\xc0\x4d\x20" + - "\xb4\xcc\x9e\xea\xf9\x2e\x53\x16\x26\xbb\x6c\x3d\x5f\xec\x11\x86\x92\x24\xcb\x2b\x07\xff\xc8\x81\x1a\xe1\xd4\xe8" + - "\x15\x38\x6b\x82\x02\xf8\x6d\xf5\x3d\x9c\xb3\xd0\x48\x65\xae\x9a\x4a\x0f\x54\x56\x7f\x0b\x1c\xcb\xb7\xe5\xd5\x00" + - "\x17\x26\xc6\xbc\x85\x82\x20\xa5\xf6\x64\x69\x75\xcc\x3a\x9f\x44\x8d\x9d\xae\x28\x61\x10\x49\xb4\x38\xaf\x9d\x1d" + - "\x98\x00\xcf\x1d\xc0\xcd\xc2\xe8\x7a\x55\x11\x0e\x09\xe2\x0b\x50\x9f\x9d\x43\xe7\x13\x1c\xe0\x68\xa4\xde\x36\x73" + - "\x53\xad\x33\x88\x30\xca\x1a\x02\x0f\xb2\xe7\x61\x5e\x56\xd9\xaf\x96\xcf\xc8\x15\x9c\x8e\xaa\xc9\x26\x3a\x17\x1c" + - "\x81\xdf\xa1\x56\xca\x06\xc6\x29\x51\xc7\xea\x40\x8d\xc1\x11\x9e\x26\xd0\x7b\x3f\x49\x4f\xd8\x27\xf6\x9f\xdd\x23" + - "\xf5\x88\xb7\xea\x68\x84\xca\xa5\xf3\xf2\x4a\x2d\xca\xd4\xe4\x56\x50\x9d\xe4\xab\xd4\x10\xa7\x34\xb0\x9c\xba\x4e" + - "\x53\x95\x35\x14\x32\xb5\xd6\x45\xa3\x84\xbb\xba\x9f\xcc\x04\x3f\x49\x44\x28\x58\x6e\x5b\x8b\xdd\x2f\x68\xa5\xec" + - "\x79\xaa\xeb\x97\x00\x0d\x40\xde\xa0\xe8\x45\xcb\x6b\xd6\xf2\xe1\x96\x6b\xc5\x6d\xc0\x08\x58\x4d\x63\xe5\x25\xdb" + - "\xf9\x9a\xd9\x76\xe8\xbe\xd3\x4b\xcb\x11\x48\x38\xa2\x78\x1c\x62\xe5\x9d\xc3\x7b\xae\xf6\xba\x46\x92\x50\x43\xc9" + - "\xa7\x8d\x46\x2a\xa8\x41\xef\x96\xd5\x0a\xd2\x3a\xf2\x9c\x64\x90\xe3\x16\x47\xa4\x0a\x27\x69\xc9\x71\xe0\xcb\xb8" + - "\xe3\xdb\x5d\x0b\x70\x4b\xbf\x79\xa3\xc7\xdd\xb6\xd7\x2a\x9c\xb1\x64\xe3\x00\x22\x9f\xc9\xdb\x87\x42\x73\xe9\xf6" + - "\x91\x94\xa7\x36\xee\x8f\xdf\x35\xab\x9f\xde\x09\x98\x50\xb9\x33\x6c\x87\x6e\x99\x4e\xd7\x8b\x60\x3e\xbb\x7b\xfc" + - "\xef\xcd\x67\x7c\x41\x5c\x82\x0e\xa2\x85\xe8\x7b\x17\xf1\x93\xd7\xf8\x89\x65\x25\x91\x93\x2c\xa7\x53\x2b\xf4\x32" + - "\x4b\x60\xa9\x79\x36\x99\x83\x56\xea\x9f\xab\xec\x52\xe7\x94\x05\x1f\xb5\x4b\xee\x30\x01\x1d\x26\xb2\x09\xbf\x5f" + - "\x89\xf3\x77\xe4\x53\xcb\x23\xb9\xe9\xa0\x49\x68\xc6\x86\xc6\xd1\x84\x37\x96\x8f\x70\x14\xde\x51\x80\x30\x12\x43" + - "\x17\x00\xbc\xbf\x83\x76\x3b\x27\x9f\x74\x38\x89\x0b\xcf\x70\x84\x1f\xba\xe4\x47\x95\x38\x41\x00\xcc\xdc\x0e\xba" + - "\xce\x01\x4e\xd1\x0a\xf8\xcb\xd0\x12\x50\x31\x08\xd8\x38\x9e\x7f\xb1\x52\xe4\xc8\x15\xa6\x9a\x2f\x67\x6a\xcf\xb1" + - "\xd9\xe7\xab\x19\x72\xd7\x92\xcb\xae\xe7\xe5\xfa\xc3\xf9\x6a\x36\x9c\xcc\xb2\xe3\x2c\x3d\xfa\xe2\xc9\xd7\x8f\xbe" + - "\xfa\x9c\x13\x53\x37\xf3\xd7\x3f\xfc\xde\x1a\x9e\x7c\x7d\xf0\xc5\x17\x5f\x31\x37\x66\xd7\xe4\xe9\x91\xda\xb7\x77" + - "\xeb\x65\x5b\x6d\x06\x28\xbe\x79\xae\x20\x68\xa6\x29\xbd\x3a\xa9\x81\x7b\xbe\x70\x7f\x5b\xde\x33\x9b\xaa\xc2\x4c" + - "\x4c\x5d\x6b\xc4\x8c\xc2\xf5\xee\x72\x13\x09\xb6\xb6\xef\xc7\xc6\x6e\x50\x55\x1b\x04\x41\x89\x80\x4a\xdd\x59\x15" + - "\x99\xb3\xd3\xa1\x93\xc0\x50\x9d\x34\xe5\x12\x85\x1d\x2b\x95\xe2\xf2\x0d\xef\x6d\x30\xf0\x5f\xea\xbc\x15\xf0\x74" + - "\x49\x0a\x3f\xdf\xde\xda\x90\xe6\x94\xa1\x98\x31\xdf\x01\x2a\x98\x0b\x35\xd1\xb5\x51\xda\xa7\x82\x85\xd3\xc4\xaa" + - "\xb2\x55\xc1\x0a\x43\x61\x03\x1f\x8d\xa0\x86\x96\x7e\xad\xce\xec\xd9\xcb\xaf\x21\x70\xb4\x76\xcb\x01\x4c\x05\xd7" + - "\xe2\x67\xc7\x31\x47\xe1\x41\x94\xc7\x83\xfc\xfc\x9d\xbe\x7a\xd8\x52\x6f\xf6\xfa\x7e\x31\xba\xa6\x5e\x7a\xd8\xa1" + - "\xfc\x63\x59\x93\x24\x19\x28\xbd\x6a\xca\x01\xc7\xf3\x2e\x35\x49\x97\x40\x78\xfc\xb6\x90\x5a\x98\x4b\xf0\x0b\xb7" + - "\x7c\x5f\xc0\xfc\xb3\x22\x5b\x4f\x2c\x9f\x2b\xb4\x5c\xc8\x82\x80\x6c\x93\xa6\x23\xc7\x38\x66\x56\x24\x34\x97\xf6" + - "\xd6\xc6\x0d\xe6\xe9\x24\xb6\x01\x8a\xad\x4e\xfe\xf0\x1e\xfb\x77\x13\x3e\x28\x4b\x04\x5b\x48\x2e\x21\xcb\xdb\xa7" + - "\x70\x80\x22\x4c\x50\xcc\x3d\x85\x18\x72\x9f\xb6\xfa\xf7\x3e\xdb\x82\x5c\x15\xa8\xc4\x8a\x58\xfb\x79\xb9\xfe\x3e" + - "\x63\x04\x4b\x0c\x7a\xb5\xcf\xa4\x47\x25\xca\xa1\x8c\x24\x86\xf2\xe9\xc0\xad\xba\x40\x36\xc5\x68\x3b\x97\xbd\x81" + - "\x42\xc8\x5c\xcd\xdd\x59\x1c\xe0\x9b\xa7\xca\x61\xeb\xda\xbf\xbd\x1b\xbc\x80\xf8\x20\xd8\x5c\x28\x2f\xd2\x3b\x6d" + - "\xfb\xcd\xe2\x8e\x50\x00\x8a\xf7\xd1\xb1\x9f\x2b\xe3\x2b\x08\x90\xc3\x44\x2a\x96\xa4\xcc\xd3\xc0\x03\x37\xf6\x1f" + - "\x1d\x06\x7e\xbc\xbe\x1f\x62\xd6\x84\x4a\x17\x73\x0b\xe6\x59\x61\xa4\x17\x3a\x70\x04\x1c\x95\xdc\x94\x2a\x37\xba" + - "\x22\xbf\x0a\x81\x21\x88\xb1\x66\x38\xdf\xea\xfc\xda\x1e\xf0\x89\x4e\x4d\xaa\xaa\x95\xa5\x67\x96\xcc\x97\x82\x55" + - "\xdc\x8e\x47\xb8\xb3\xd3\xe5\x50\xea\xb8\x86\xf6\x60\x42\x78\x0b\xee\xc6\x89\x11\x19\x56\x90\xaa\x80\x8c\x01\xc9" + - "\x3e\xca\x4b\x53\x55\xd8\x43\xb8\xd4\x9d\xd2\xa2\x20\xd0\x67\xf0\xcc\x2a\x00\x81\xd4\x6e\xc8\xb9\x31\x30\xe2\xf5" + - "\x5c\x37\xe6\x92\x74\x78\xec\x13\xc9\xa4\x8b\x48\x9a\x9b\x08\x20\x73\xab\xc9\x3c\x70\x1b\x0e\x82\xf4\xa3\x61\x38" + - "\x27\xb6\xac\xfe\x1e\x3a\xd7\x86\x9c\xbb\x6d\x3b\x70\x00\x52\x7b\x47\x0c\x62\x17\x64\x07\x11\x60\x05\xe7\xfe\x66" + - "\x76\x94\x56\xf1\xa8\xd5\xa3\x20\x12\x93\x07\xb0\x1d\xfa\xff\xd2\xc7\xae\xef\x51\x12\x8d\xae\x6e\xd2\x27\xc7\x6a" + - "\xb3\xbf\x79\xe0\x6a\xbe\x81\xf1\xa3\xe5\x87\x45\xf2\xdb\x77\x51\xd6\x4d\xe4\x32\x5e\xd3\x22\xa3\x61\x3e\x2f\xcb" + - "\x25\x7e\xed\x40\xed\xd0\x07\xb6\xa8\x1b\x4b\x30\x2b\x33\xcd\x21\x4d\x39\x45\x9c\x31\xdd\xf8\x5f\x22\x07\x0e\x57" + - "\xde\x1e\x59\x06\x8b\xef\xd8\x42\x6e\x05\x36\xef\x31\x19\xad\xd3\x3a\x4c\x50\xff\xb1\x8a\xb7\x1a\x46\xbf\x8d\xa9" + - "\xfe\x6e\x5d\x0c\x8f\xf0\x70\x63\x46\x00\x02\x73\x76\x6a\x1e\xa7\x8b\xf3\x4e\x4c\x74\x38\x21\x3b\x95\x3f\x66\xf8" + - "\xed\xb9\x99\xeb\xcb\x0c\x98\x48\xcb\x00\x80\x47\x07\x84\x2f\xf0\xef\xa8\x5a\x54\x17\x82\x76\x65\x4c\x6a\xf3\xa5" + - "\x9e\x80\xca\x12\x67\x20\x74\xf8\x62\xb8\xf2\xc8\x87\x75\xab\xdb\xb5\xd5\xc1\xed\xd7\xf3\x72\x95\xa7\x4a\xa3\xcb" + - "\x38\x7a\x0d\x16\xa0\x72\x42\x2e\x04\xdc\xe7\xa9\x61\xfa\x50\xe4\x0d\x09\x78\xbf\x84\x8a\x25\x3e\xf2\x4d\xb8\xe4" + - "\xd1\xf2\x1d\xab\xe4\xc0\x2e\x85\x33\x94\xb4\x92\xaf\xb8\x5c\x72\x64\xe5\x5f\x35\xe5\x42\x83\xf6\x23\xbf\x06\x49" + - "\x0d\x74\x44\xc8\x1d\xd5\x86\x9d\xd4\xae\xf7\x2c\x4f\x98\x1b\xaf\x23\x45\x1d\xc9\xa4\xae\x51\x83\x46\xb3\x96\x4c" + - "\xca\x7c\xb5\x28\x9e\x97\xab\xa2\x49\xc6\x5e\x78\x49\xa6\x59\x9e\xbf\xa5\x01\x04\xcf\x73\x73\xf5\xc7\xaa\x5c\xb7" + - "\x1e\x9e\xcc\xab\xac\xb8\x08\x1f\x3b\xcd\x6f\xf0\xd8\x5e\x46\xdf\xb7\x1f\x97\x1d\xad\x21\xd3\x11\x3e\x59\xce\x75" + - "\x51\x07\xcf\xd6\x59\x5a\xae\xc3\x47\xe8\xbe\x18\x3e\x2a\xcb\x05\x3d\x08\xe6\x95\x36\xb1\x30\x2e\xad\xe7\x65\x6d" + - "\x48\xc7\x7b\x5d\xae\xd4\x3a\xab\xe7\x80\x44\x9b\x5d\x29\x0c\x15\x64\x73\x02\x6e\x55\x64\x61\x1b\xde\xe6\x2c\x20" + - "\x82\xa6\xb4\x5c\xf2\x76\x1d\x8d\xac\xa0\x4d\x8c\xe3\xd4\xb2\x82\x81\x0a\x9b\x26\xb2\xd4\x76\x56\x92\x49\x5d\x03" + - "\xb7\x98\x04\x5d\xfd\xa3\x69\xf8\x8c\xa0\x1b\x52\x78\xf0\x4a\x4b\x01\x5f\xbc\x7d\xad\xde\x20\xc8\x38\xbc\x6e\x9f" + - "\x09\x14\x4a\x48\x75\x2a\x04\xe4\x2d\xbf\xcb\x6c\x03\x24\xb5\x94\x05\x02\x97\x6b\xf4\x77\xf2\x10\x36\x21\xc5\xeb" + - "\xce\x79\xf1\xb8\xfb\xf1\x57\x70\xab\x74\x10\x4a\xe1\xb4\xf8\x31\x84\x59\xa9\x57\x15\xf9\xb6\xac\xcd\x83\xca\xa8" + - "\x75\x59\x5d\xd8\x09\x77\x90\x2a\xa8\x6d\x2c\x28\x9a\xc5\x59\xf1\x10\x78\x14\x48\x12\xf2\xa5\x42\x13\xce\x17\x92" + - "\x5e\x98\x1c\x74\xe7\xa4\xf4\x17\x0c\x6c\x87\x9b\x3e\x2b\xc2\xfd\x75\x06\xab\x7c\xea\xd4\xd7\x48\x61\x7b\xb7\x16" + - "\x38\xda\x64\x76\x70\x65\xfa\x52\xe2\x00\xe7\x06\x3b\x08\x07\x22\xe0\x2c\x03\x97\xa6\xaa\x49\x8f\x0a\x9c\x4a\x9e" + - "\x97\x6b\x93\x5a\x76\xcd\x16\x5b\x15\x5d\x05\x91\x42\xcb\x21\x00\x5d\x75\xb2\x8e\x0b\xcd\x11\xaf\x7c\xe7\x7d\xb7" + - "\x9c\xf3\x06\xae\x89\x27\xdd\x7c\x04\x24\x64\x55\xe8\x84\xcc\x2b\x4e\xd9\xe2\x24\x7e\x87\x50\x5e\x4d\x08\xc1\xbe" + - "\x32\xb9\x06\xa9\x88\x68\x31\x82\x7b\xd4\xaa\xb7\x7b\x64\x4f\xdf\xde\x51\x1f\x13\xef\x04\xa5\xea\xa1\xba\xff\xe5" + - "\xe3\x27\x9f\x7b\xf6\xa6\xe1\x0d\x28\xb1\xa9\x7a\x48\xbc\xc9\xc0\x16\x1a\x09\x62\x7e\x0d\x41\xea\x4d\x73\x7a\x70" + - "\xa6\x76\x01\x98\xe2\x21\xfc\xf9\xc8\xfe\x29\x65\xbc\x36\xaf\x53\xf8\x45\xdd\x92\x18\xe6\xe7\xab\x99\xba\xff\xf5" + - "\x23\x08\xbb\xf0\xf3\x91\xe0\x10\xda\xcc\x70\x74\x18\x40\x6d\x60\x8f\xe6\x1b\xfd\x86\xdd\xdd\x75\x65\xe8\x0c\x0f" + - "\xd5\x89\x31\x63\x75\xff\xcb\x83\x83\x2f\xfc\x2c\x30\x48\x0a\x7e\x8c\x52\x2f\xad\x4f\x88\x59\xb6\xc9\x87\xf8\xd5" + - "\xd4\xdf\x8a\x6b\x5d\xab\xa5\xae\x6b\x00\xa3\x18\xc0\x85\xf4\x60\x79\xf5\x80\xc5\xf5\x1e\x19\x6a\xed\xb6\x65\x74" + - "\x8a\xd0\x94\xdf\xef\x5a\x1e\x1a\x7d\x10\x06\xc2\x37\x57\x70\x8e\xa2\xe5\xd9\x3d\x62\x29\x33\xec\x31\xc1\xc5\x7f" + - "\xf5\xf5\xfe\x57\x03\x06\xd6\x38\x87\x98\x46\xa3\x20\x3a\xd3\xc3\x68\x9c\x5f\x53\x4c\xe5\xb5\xdd\xca\x35\xd8\x34" + - "\x03\xdb\x8e\x0b\xca\x3c\x5f\x35\x10\x92\x09\x1c\xc3\xc2\xe8\x02\xe3\x0f\xc1\xa1\x1a\xae\x37\xd5\x03\x4d\xc0\xa5" + - "\xa9\xae\xed\x80\xcf\x73\x03\x37\xb7\x23\xd8\x7d\x95\xa5\xa6\x40\x4b\x06\x13\x69\x01\x15\xbe\xbd\xc9\x9d\x77\x67" + - "\x47\x02\xdd\xc0\x2c\x81\xc5\x0f\xf8\xbb\xb7\xd3\x9e\x4a\xbc\x93\x6f\x42\xba\xbe\x7d\x01\x89\x12\x19\xec\x93\xac" + - "\x98\x9b\x2a\x6b\xda\xd3\x06\x0b\x0d\x64\x07\x96\xb9\x2a\x2f\xb3\xd4\xa4\x8c\xeb\xa5\x1b\xbe\x44\x4a\x67\xb6\x01" + - "\x84\x38\x77\x3d\x61\x6c\x2a\x87\x3d\x88\x91\x21\x01\xb2\x97\x40\x2f\xa9\x4d\x93\xd8\xf9\x85\x67\xa0\x17\xe9\xf1" + - "\x59\x83\x47\x52\xc6\x08\x2f\xad\xfe\x06\x9a\xd2\x1a\xa1\xc0\x38\xa3\xd1\xc5\xaa\xfa\xee\x91\x02\x03\x08\x9e\x1c" + - "\x65\xb1\x17\x05\x8f\x70\xba\xa1\x4a\x8c\x0b\x87\xb5\xb3\xa3\x92\x99\x1c\x94\xa0\x32\x38\x22\x21\xee\x93\x5e\xf6" + - "\xae\x11\x75\xf8\xd3\x70\xd7\xdf\x86\x93\xcf\x5d\x0e\x7b\x49\xac\x82\x73\xf5\x74\x35\x76\xea\x17\x85\x7d\x7e\x13" + - "\xfb\x40\x56\xc5\xc0\x90\xc8\x2a\xf1\x81\x25\x0e\xbf\xf7\xd2\x3d\xfc\xb7\xee\xfb\xff\x99\x3b\xd9\x5f\xfd\xff\x0f" + - "\xbb\x98\xef\xd8\xce\xb7\x6e\xe5\x5b\x77\x72\xa8\xa1\x6e\xed\x66\x34\xe5\xd0\x66\x8e\xd8\x38\xb7\x4f\x07\x96\x63" + - "\xd0\x32\x02\xbc\xa3\x4f\xe6\x2a\xab\x9b\xda\x93\x1a\xc9\x4c\x44\xe8\x97\x61\x9f\xee\x54\xc0\xbb\x1e\x31\x73\x91" + - "\x20\x5b\x9e\x04\x1a\xff\x16\x07\xc3\x12\x39\x16\x25\x92\x4b\xf7\x42\xec\x10\x13\xf5\xa8\x55\x60\x83\x3e\x1f\xd3" + - "\x4e\x0d\x98\xeb\x01\x79\xa2\xe4\x8b\x36\x9b\xda\x2d\x36\x31\xa9\x82\x00\xc2\x7f\xae\x74\x6e\x69\x6b\x15\xae\xb0" + - "\x65\x05\x6c\xab\x39\xac\x56\xb1\x5a\x98\x2a\x9b\xdc\xeb\x30\x4a\xa3\x5a\x41\x32\xff\x5b\x05\xb8\x17\xb5\x34\xd5" + - "\x87\x92\x5c\xf8\x1a\x20\x1e\xc5\xef\xc7\xcc\xde\xce\xb6\xb1\x9e\x6d\x55\xf5\xd5\x31\xfc\x0b\xde\x0d\x63\x69\x4b" + - "\x88\xed\x0b\xdd\x90\x2e\xa7\x2a\xc1\xb0\x92\x64\xe0\x2c\x67\x67\x12\x67\x25\x93\x1e\x3a\x5b\x9b\xce\xcb\x51\x57" + - "\x2c\x58\xa4\x1a\x88\x64\xa0\x4d\x0a\x02\xcb\x8d\x12\x03\xe3\x54\x4e\x96\x8d\x00\x55\x64\x9a\x2d\x4c\x51\x83\x5f" + - "\x6f\x31\x2d\xc9\xa0\x9e\x15\xe0\x57\x95\x5f\xa3\x1e\xa6\x99\x9b\x85\xab\x6a\x5e\xae\x2d\x5f\x00\xcc\xc8\xc2\x92" + - "\x6d\x04\x56\xb0\xbb\xb7\xb2\x12\x16\xeb\x70\x90\x6c\x23\x1d\x04\x3e\xe3\xdc\x14\x66\x9a\x35\x7c\x66\x49\x47\xe9" + - "\xee\x07\xe1\x8c\x46\x31\x9a\x77\x68\xdd\x1c\x76\xac\x34\x48\x22\xc3\x40\x69\x00\xb6\x84\x37\xa5\x9b\x3b\x74\x29" + - "\x1b\x74\x38\x7c\xbb\xbe\x7c\x92\x61\xd6\x01\xf7\xbb\xd4\x02\x5b\xbf\xe3\x3b\x42\xfc\xc4\x03\x54\x77\x2d\x72\x97" + - "\x94\xeb\x71\x4c\x6a\xe7\xf5\x82\xd9\xe1\x5a\x71\xd6\xe2\x9e\xbc\xc3\x05\x09\xab\xa1\x29\xdb\x6c\x74\x91\x66\x17" + - "\x69\x78\x21\xd3\xcb\x20\x9c\xf2\x7f\xd5\x98\xcb\xd5\x78\x1b\xcc\xd6\x56\x5f\x8d\xd5\x3e\xfc\x8c\x22\xf0\xfa\xad" + - "\x64\xf3\x81\x0f\x76\x74\xb4\x22\x6f\xe6\x30\xc6\x93\x19\xd6\x8e\xd8\x80\x81\x88\x8f\xda\xa4\x9c\xeb\x3e\x79\xff" + - "\x69\x9f\x7c\x5b\x5f\x59\x5d\x28\x0d\xfc\x31\xdc\xc7\x04\xd7\x92\xd9\xa3\x4a\x32\x2c\x1b\x47\xf8\x20\x36\x25\x99" + - "\x51\xf6\xc0\x19\x52\x6e\x8d\x8e\xf3\xf1\x9b\x3f\x64\x63\xcb\x5f\xfb\x0f\xc9\x8b\x72\x6b\x6b\x0b\x2f\xaa\x01\xe5" + - "\x92\x1b\xb0\x9b\x0a\xcc\x56\xe2\x72\x33\x92\x62\xd6\x2d\xd2\x3b\xd0\xf2\xe1\x65\xac\x2b\x83\xce\x67\xe7\xd7\x4a" + - "\x17\xd9\x42\x63\xc0\x3a\xa6\x15\x09\xf4\x7e\x31\x5a\x16\x79\xb1\xab\x04\x51\xb2\xc8\x83\x9d\xfe\x24\xcf\x76\x76" + - "\xd0\x88\x00\xae\x90\x6d\x19\xa8\x7a\x35\x9d\x66\x57\x9b\xe8\x2f\xb9\xea\xef\x72\x31\x47\x8a\xb1\x73\x1b\x31\xb5" + - "\xa3\x04\xec\x5c\xde\xa0\x07\xf6\x40\x44\x2c\x60\xb8\x13\x24\xb0\xc9\x8a\x59\x6e\xc4\x3d\x59\x94\x0d\xa8\x8f\x2b" + - "\x17\x22\xb0\x04\xff\xe1\xa3\x5b\x60\x42\x49\x4b\x3e\x04\x4f\xc1\x5e\xa2\x12\x7b\x5e\x4e\xa9\xe4\x59\x98\xf0\xd4" + - "\x7b\x8d\x49\x48\x3a\xee\xa9\x18\x7c\xcb\xe7\xc5\xcf\x06\x9d\x50\xe8\x98\x43\x8e\x76\x7f\xed\xb1\x03\x20\x3d\x71" + - "\xd9\xe0\x3e\x86\x71\xb7\xdc\x66\x70\xa2\x5d\x38\x6a\x18\xac\x4f\xbd\xea\x47\x91\x5c\xb7\xac\xd9\x10\x61\x62\x5b" + - "\xa4\xaf\xf3\xda\x0e\xf3\xd4\x44\x92\x83\x50\x39\x7e\x22\x7a\x7a\x4b\x55\xd9\x41\xbd\x07\x2a\x27\x43\xf0\xd6\xd6" + - "\x02\xbc\xaf\x43\x34\xf5\xc0\xb4\xe5\xf8\x14\xca\x6c\x26\xb1\x0b\x3c\xad\xec\x72\xb6\xa1\x3b\x2a\x07\xf3\x19\x08" + - "\xda\x11\xea\x67\x80\xaa\x69\x8a\x18\xaa\x70\xa1\x97\xc8\x90\xe0\x3a\x9f\x75\x3a\xeb\xb8\xf7\x2d\xea\x1e\x43\x40" + - "\x3a\xa7\xd5\x65\xe7\x96\xe8\x52\xb6\x85\x09\x7d\x5a\xb0\x18\x7e\x86\xc7\x41\xc1\x96\xf6\x0a\xb7\x59\xa4\x41\x6e" + - "\x21\x6c\x7f\xa3\x0e\x3c\x6e\xf2\x96\xe5\x7d\x36\xe6\x20\xf1\xd6\x7f\x5c\xff\x10\x73\x79\x6b\x9e\xa5\x9b\xd3\xad" + - "\x84\xdf\x8a\xaf\x9a\x72\x36\x0b\xf5\xde\x98\x5e\x5b\xde\x32\x44\x08\xf0\x05\x5d\x9f\x65\x6e\xb4\xf0\x12\x74\x02" + - "\xb2\x2d\x82\xc8\x77\x43\xdb\x66\x8f\x13\x83\x0c\x6d\xf7\x7a\x1b\x41\xe5\xba\xd3\x22\x91\xc7\x26\xdb\x60\x19\x91" + - "\x9b\x37\x0b\x23\x22\xe1\x73\x6a\x8f\xd6\x39\x40\x64\x8c\x0a\x8a\xae\xb4\x62\x6d\x0e\x23\x5c\x86\x77\x6b\x63\xda" + - "\xc1\x30\xf6\xba\x18\x28\x53\x58\x7e\x58\x03\x9a\x01\x76\x8a\xbd\xb6\xcd\x1a\x3f\x1c\x2e\xab\xb2\x29\xed\xfc\x0d" + - "\xb3\x22\x6b\x3e\xa5\x1e\xb4\x21\xd2\xa6\x82\x4a\xd4\x11\x56\x06\x5d\x8b\xaa\xa5\x9b\x02\x6c\xb5\xd5\x6a\xd2\x94" + - "\xd5\x18\x0b\x23\x3c\x63\xd6\xc1\xe5\x6d\x6e\x7c\x80\xbe\x51\x34\xbf\xb8\x2e\xde\x84\x7b\xe8\x1e\xda\x0f\xad\xf0" + - "\x53\x95\x4b\xff\x90\xfa\x7f\xc4\x03\xb9\xb9\x51\x49\xbd\xb6\xd7\x85\x2f\xc3\x11\x31\x2e\x16\xc7\xbf\x82\xa8\x15" + - "\x46\xdf\x2e\x20\x00\x03\x71\x13\x57\x15\x2d\x15\xb6\x52\xd8\xcb\xcd\x14\xa9\x7f\x04\x7d\x3e\xc2\xae\x47\x6a\x0b" + - "\xd6\x81\x42\x87\xcf\xd4\x31\x59\x72\xc1\x4f\xdc\x9d\x80\xc9\xaa\x23\xed\x8f\xa5\x9b\xac\x5f\x70\x53\xbe\x24\xda" + - "\xef\x27\xe1\x2c\x4c\xb5\xe1\x14\x01\x4e\xd6\x27\x6a\x22\x64\xff\x20\x37\x58\x54\xb5\xcb\xb8\x2a\x8b\xba\x8e\x56" + - "\x2b\x19\x25\xcc\x30\x39\x01\x10\xa6\xae\x4d\x3a\xf0\x2d\x7e\x5a\xe7\x7d\xaa\x22\x5a\x95\x61\xba\x42\x00\x61\x6f" + - "\x78\x80\x8f\xca\x1a\x97\x17\x18\x0c\xc7\x25\xd9\xd5\x3e\x55\x72\x0f\x9c\x11\xfb\x4e\x3d\x1c\x6c\xa8\xfc\xa1\x72" + - "\x05\xf6\x07\xea\x60\x43\x31\xc9\x85\xcb\x43\xdd\xd1\x25\xaa\xce\x0b\xcf\x62\x33\xd1\x08\xed\xfe\xd9\x53\x62\xc7" + - "\xf5\xd5\x43\xfa\x7e\x57\x3c\xde\x38\x33\x75\x63\x96\xe1\xac\xc8\x37\x02\x9b\x78\x68\x44\x12\x27\x2b\xfc\x09\xac" + - "\x6f\xe9\x8f\x1e\x6d\x99\xda\x78\x38\x6e\xa1\xd0\x95\x1f\xcb\x49\xd8\xb8\x7f\x5a\x5f\xdd\xeb\xc6\x87\xed\xa2\x29" + - "\x40\xaa\x02\x12\x13\x15\x08\x3f\xc2\xa6\x89\x10\x71\x07\xc6\x9d\xba\x84\x06\xc8\x99\xe4\x4d\x2a\x53\x63\x82\x61" + - "\x4f\xef\xa1\xd0\x10\x31\x16\x1b\xd7\x88\x3a\xe3\x54\x44\x0e\x87\xb8\xb7\xed\x8b\x92\x69\xf4\xe6\x46\xc5\xcf\xa2" + - "\x4a\xc8\x92\xd3\x6f\x69\x8b\x37\x35\xdb\x52\x21\x2f\x35\xe2\xd7\xe8\x82\xb2\x32\x20\x57\x0c\xb8\x3f\xea\x71\x95" + - "\x2a\x80\x47\x34\x8d\xa9\xac\x7c\x61\xc9\x90\x5a\x67\x79\x1e\x3a\x23\x70\x65\xba\xb1\xf2\x94\xe5\xc0\xbd\x2a\x09" + - "\xf4\x52\x2e\x0b\x08\x44\x69\x51\x13\x14\x7c\x0f\x45\x11\xa8\x90\xeb\xa9\xcb\x01\x83\x18\x92\x61\x0b\x5d\xb0\x6a" + - "\x95\x1c\xec\x5b\x7a\x67\xc5\x1f\xf8\x0e\xe2\xbe\xa0\x9d\xe1\x3d\x67\x38\xb4\x1f\x5e\xb5\xbe\xac\x4a\x7b\x9d\xf7" + - "\x0e\x2a\x9d\xf6\xb1\x06\x9c\x2b\x8a\xe0\xa9\x87\x74\xf5\xdb\x25\x8c\xf8\x34\x3f\x9b\x03\x31\x9b\x08\x6e\x7c\xc8" + - "\xed\xbe\x14\xd3\x57\x73\x2a\x12\xcf\x88\xd9\x69\x48\xec\xac\x61\xdb\xa4\xe8\xc3\x01\xec\x0f\x25\xdb\xb1\x4d\x7d" + - "\xb8\xb9\x51\xdc\x1b\xcb\xa5\xe0\xb7\xc7\xa0\x54\x73\x1b\x8d\x63\xf2\xeb\xdb\xb6\x26\x79\x98\xc2\x69\x77\x0a\x6b" + - "\x58\x0e\x3b\x57\xba\x51\x7b\xf0\x9e\xc4\x01\xf4\x05\xac\x09\xa3\x08\x5f\xd1\x86\xc4\x37\x6e\xb5\x2f\x75\x96\x83" + - "\x43\xae\x1d\x1b\xc0\xf4\xe6\x3a\x76\xa7\x00\x2f\x64\x2e\xd8\x62\xc9\xa7\x57\x40\x69\xa2\x5d\x1d\xb1\x44\xdd\xa5" + - "\xdc\x20\x03\x16\x29\x3a\x73\xd4\x6f\x80\x7c\x6d\x1f\xa5\x96\x45\x20\xe8\x85\x3f\xa2\x5d\xaa\xf7\xa8\xc3\x71\x97" + - "\x89\xd1\xde\xb4\x71\xf0\xb7\xa5\xe5\xbb\xf4\x1b\x79\x95\x2e\x76\x6f\x23\x05\x39\xf2\xd5\xb4\x1d\xe8\x3e\xb6\x54" + - "\x3b\x80\x14\x38\x1a\xa9\x1f\x75\x91\x4d\x08\x18\x41\x2f\x97\x55\xa9\x27\xe0\xe2\x52\x3b\x3f\x16\xb0\xaf\x97\x00" + - "\xf5\x38\x29\x8b\xc2\x4c\xec\x36\x25\xc7\x8f\x16\xa9\x1c\xd6\x93\xaa\xcc\xf3\x77\xc0\x44\x75\xbf\xfb\xc1\x4c\x1b" + - "\xa2\xa8\xb7\xed\xd3\x78\xed\x9c\xdf\xc8\xce\x8e\x7c\xdc\x91\xea\xee\x93\xa7\x28\x98\x9c\xe0\xce\xa7\xfe\xe5\x59" + - "\x61\x74\x15\x30\x26\x91\xd4\xba\xf4\xe2\xcd\x1a\x34\x27\x9b\x8b\xee\x0f\x3f\x57\x7b\x10\xbc\x30\x9c\x94\xb5\x7d" + - "\xff\x10\xff\xfa\xf1\x95\xea\xab\x91\x7a\x74\xd8\xd1\x9d\xe9\x55\xfb\x8a\x82\x3b\x8c\x17\xf4\x5b\x7b\x70\x9f\xe3" + - "\xc1\x7d\x7a\x30\xfc\x4a\x81\xec\x0d\x1a\x68\x08\xf4\x11\x35\xe1\x05\xff\x7f\x31\xf7\xee\xdf\x6d\xdb\xd8\xfe\xe8" + - "\xcf\xce\x5a\xfe\x1f\x10\xa6\x37\x95\x62\x59\xb2\xd3\xa6\xd3\x2a\xe3\xf1\x4d\xf3\x98\x66\x6e\xd3\xf4\x34\xe9\x69" + - "\xcf\x72\x7c\xba\x60\x11\xb2\x18\x53\xa4\x86\xa0\xfc\x68\xed\xff\xfd\x2e\xec\x07\xb0\x01\x52\x76\x3a\xe7\xf1\xfd" + - "\xce\x5a\xd3\x58\x24\x88\x37\x36\xf6\xf3\xb3\x7d\x00\xbb\x0c\xbd\x9e\x5f\xfe\x00\xf7\x78\xb1\x34\xcd\x6b\xe0\xb2" + - "\x9a\xf9\xa5\x6b\xcb\x62\x24\xf3\xe1\x14\x65\xa9\x6b\x27\x87\x5c\x3b\x19\x63\xf8\xd9\x84\x8a\x55\x7d\xc1\xc8\x87" + - "\x53\x8a\x47\xbe\x1e\x26\xf1\xcc\x08\xea\xd9\x09\x6a\x5e\x3b\x51\x60\xf2\xcf\xb5\x59\x1b\xd8\x2c\x58\x3d\x2a\xb3" + - "\x8a\xba\x82\x48\xd3\x12\x2c\xf0\x07\xea\x88\x1d\x08\xfd\x53\xcc\x48\x03\xab\x8b\x45\xd0\xa7\xed\x51\x36\x55\x47" + - "\x91\xca\xca\x1d\xb7\xae\x16\xa1\x25\x51\x04\xb9\x72\x40\xc9\x20\xd9\x28\xfa\x82\x54\x0a\x3e\xe7\x28\xee\x26\xe0" + - "\xe2\x47\xb1\x7a\x09\xa7\x25\x76\x21\xa1\x22\xc4\xd2\x63\xc9\x87\x0f\x59\xb1\xf3\x45\xd7\x30\x79\x1b\x87\x2f\x15" + - "\x60\x10\xc9\x54\x78\x5d\xa7\xc0\xa2\x52\x85\xc7\xbb\xc2\x38\x1d\x1f\x11\x8d\x22\xc5\xb2\xb0\x14\x68\xca\xaa\x0f" + - "\x14\x54\x6e\xe9\xc5\xf5\x35\x7e\x8a\x01\x60\x97\x60\x00\xdb\xa1\x19\x11\x69\x14\xa2\x09\xd8\x74\x79\x42\x95\x43" + - "\x3f\x33\x76\xa6\xc1\xcf\x6a\xdf\x6b\x72\x2e\x5f\xb7\xa6\xd1\x2c\x57\x3d\x8e\xf5\x38\xd8\xd9\x87\x0f\xf1\x0f\x9c" + - "\x41\xd4\x76\x14\x6d\x64\xad\x79\xdf\x40\xb6\xba\xaa\x80\xe8\x25\x82\xc4\x3e\xb9\x12\xdd\x8a\x56\x86\x85\xad\x50" + - "\xad\xc4\x47\x09\x36\xe9\x0b\xa3\xd6\xab\x1c\x54\xad\x0b\x43\x5b\x48\x5c\x76\x98\xb1\x84\x33\x5a\xf0\xc6\xc0\x7f" + - "\x01\x73\x21\xca\xa3\x86\xe3\x3c\x37\xe5\x15\x52\xe1\x4b\x54\xe2\x82\x71\x47\xab\xaa\xae\x7e\x37\x4d\x8d\x5d\x72" + - "\x2b\x4d\x47\x5b\xae\x19\x2f\xc2\xf5\xb5\xda\x17\x30\x1d\xd2\xad\xf5\xf5\x1c\x32\xcd\x15\xf5\xda\xaa\x82\x67\x56" + - "\xb9\x9a\x4d\xae\xea\x75\x3b\x52\x79\xbd\x76\x37\x38\x02\x92\x5f\x18\xb0\xc9\x3e\xf2\xc0\xe4\x8f\x42\x55\x3f\x43" + - "\x84\x0f\xb1\x6e\x00\xa2\xe0\xbe\x84\x1f\x1a\x92\x10\xd8\xda\x7d\x8f\xd0\xc9\x7a\x36\x03\xff\x16\xf0\x54\xb5\xc6" + - "\x28\x5c\x69\x6d\xd5\xba\x62\x3c\xcc\x13\x83\x7e\xd8\x72\x23\xe0\xbf\x4e\xd8\x1e\x3f\xc9\xa2\xec\x22\xcf\x72\x70" + - "\x71\x70\x9c\x06\x20\x5a\xf0\x87\x34\x17\xf8\xef\x04\x2b\x60\xcb\xd2\xe6\xbb\x18\x0f\x39\x7e\xb4\xa3\xfc\xdd\xeb" + - "\x57\xe7\x67\x5c\x66\xa8\x6d\xa4\xda\xba\x84\xa9\xab\x4e\x61\xea\x54\xdd\x80\xcf\x15\xda\xe1\x02\x45\xf0\x5f\x3f" + - "\xab\x72\x75\xd2\x18\x7d\xc6\x6e\xa1\x65\x5d\xaf\x1c\x6b\x82\xc3\x2b\xe4\x2c\xb8\x23\x6a\x9a\xb9\x99\xb5\x80\x5d" + - "\x81\x0e\x75\xe7\xe4\xd0\xb1\xd0\xb9\x32\x55\xbd\x3e\x5d\x90\x22\x50\x71\x70\x3e\xd6\xe4\x36\xff\x80\xe7\x4e\xf4" + - "\x44\x4d\x28\xb7\x31\xd8\xf8\x42\x59\xc8\x97\xb5\xbb\x1b\x1f\xb3\x6e\x1c\x2e\x8d\x3e\xdd\xe0\xe1\x20\xe2\x9e\x16" + - "\xfa\x53\xd2\x76\x40\x0f\xfc\xf6\xc4\x3f\xae\xaf\xe5\x46\xdd\x7b\x2a\x99\x1a\x71\xfe\x82\x6f\x1c\x38\x30\xec\x1c" + - "\x4c\x76\x0f\x54\x5b\x9f\x99\x2a\x71\x40\x42\x9f\x90\xbc\x46\x6f\x43\xef\xf7\xe7\xef\x8d\x88\x69\x02\xfd\x0a\xd1" + - "\xdb\x7d\x47\x51\xa3\x6d\xb3\xc3\x43\xc1\x97\xec\xd5\x47\x8f\x1e\xab\x63\x6f\x98\xdc\x09\xcf\x7a\x35\xaf\x2d\x69" + - "\xb4\xdc\x12\x1d\x7b\x5d\x3c\x6c\x05\xea\x96\x55\x0c\x92\x6e\xaf\xaa\xd9\xa2\xa9\xab\x7a\x6d\xcb\x2b\x14\xa6\x20" + - "\xd1\x8b\x7c\x2c\xc1\xa7\xe1\xb3\x57\xee\xba\x26\x75\x8e\x35\xed\xfb\x62\x69\xea\x75\xdb\xd1\x31\xc2\xad\xae\x84" + - "\xfe\x17\x38\x0c\x09\x78\x30\x50\x5c\x86\x4e\x47\x05\xf5\x0e\x3d\xa6\xfe\x44\xfd\xdd\x5d\xa9\x6e\x03\x78\xd1\x0f" + - "\x73\x34\x41\x47\x80\x06\xe8\x2a\xc7\x54\xf8\x7e\xce\x45\x4c\x6e\xf5\xea\x72\x40\xbe\xb7\x14\x7c\x8e\x96\x65\x01" + - "\x94\xbd\x28\x66\x0b\x8f\x43\x81\xe6\x1e\xdd\xb6\x78\x8d\x13\xdc\xfb\x14\x5d\x02\x03\xf2\x0e\x1b\xd6\x31\x16\x9f" + - "\xb0\xb6\x81\xbf\x39\x67\xb8\xeb\x7d\xf0\xc2\xab\x95\x2e\xcb\x60\x7f\x61\x84\x1e\x59\x0b\x12\xa9\x5b\xeb\x7a\x0c" + - "\x2c\xf1\x59\xb1\x82\x48\x06\x05\x2c\xac\xab\xed\x27\x32\x26\x46\x43\x3b\x88\x47\x4a\xd8\x03\x4f\x53\xac\x01\xe5" + - "\xc1\x06\x76\xfb\xa6\x66\x0b\x03\x9c\x0e\x12\xdb\xd1\x53\x3f\x3d\x47\x21\x9e\x7d\x87\xa2\xa1\x1c\x8b\xcb\xef\x44" + - "\x88\x78\x78\x49\x1a\x0e\x09\xc1\xdd\xd7\x34\xd4\x31\x26\x3f\x7c\xae\xd3\x83\x50\xc5\x95\xb0\xf9\xc6\x15\xe9\x04" + - "\xf5\x45\xbc\x14\x99\x09\x90\xda\xfa\xdd\x22\x76\x42\xcb\xca\xdd\xad\x59\x5d\x96\x86\x33\x0b\x12\xb1\x36\x8d\x95" + - "\x5c\xc8\xd1\xb1\x1a\x8e\x31\x6d\xa2\x2c\x90\x3d\x02\x93\xe9\x6d\x51\x80\xa1\xf2\x60\xbf\xf9\xd4\x28\x40\x98\xb2" + - "\x01\xf3\x8b\xa1\x26\x1f\x53\x43\x6a\x32\x3f\xbc\x51\xcc\x42\x26\x18\xd9\x4c\xbe\x2a\xc3\xfe\x6c\x45\x1c\x08\xd0" + - "\x43\x52\x48\x4a\x88\xe6\x39\xe5\x87\x59\x1f\xee\xaa\xb2\xa0\x16\x67\x02\x3d\x79\xa4\x3e\xda\x45\x51\x81\xcb\xa6" + - "\x5b\xd0\xc2\x62\x28\x04\xe4\xb7\x40\xbc\xdd\xd0\x61\x77\xdb\x39\xbe\x9f\x64\x54\x76\xe5\x53\x75\x99\xcf\x8b\xc6" + - "\x8c\x42\x48\x26\x84\x01\x53\x2c\x1a\x1e\xe1\xaa\x58\xca\xd4\x92\x75\x53\x9c\x06\xc3\x5c\xd7\xa7\x1e\x1e\xfb\xe0" + - "\xb4\x8e\xc8\x97\x46\xab\x21\x2e\xaf\x6e\x35\x21\x1a\xf5\x87\x50\xce\x2f\x9d\xc0\x22\x13\x98\x2c\x74\x95\x97\x46" + - "\x81\xa0\x31\xa5\xbc\xb8\xab\xa6\x5e\x16\x16\xae\x34\xb4\x97\xba\xf9\x1a\x43\x11\x5e\xf7\xc4\x1f\xef\xb7\x20\xa8" + - "\x88\xb6\x32\x19\xd9\x8d\x1a\xce\x75\x05\x25\xf3\x4e\x64\x77\xfa\x9a\xef\x42\x9a\x59\xef\x53\x07\x6a\xb8\xb1\x7b" + - "\xf4\x54\x7c\x17\x9e\x4a\x58\xb3\x38\xb4\xe9\x7e\xd2\x44\xb0\x43\x52\x1b\x09\xe0\xe3\x4d\x50\xa6\xc6\x5f\xee\xec" + - "\x10\x33\xe4\x96\x74\x8c\x11\x51\x5d\x7b\xd6\x64\x42\xd7\x30\x26\xc1\xd1\x67\xa0\x6d\x63\xdf\x4d\x76\xec\x03\x80" + - "\x6a\x5c\x83\x06\x6f\xbb\x13\x03\xe8\x64\x26\xe7\x5a\x30\xb0\x06\xab\xe1\x4f\x90\xdb\xb8\xb5\xfd\xa4\xd3\xbb\xbb" + - "\x4f\xe5\x5c\xd0\xba\xc1\xbb\x78\xc5\x7c\x3a\x60\x3f\x3d\xe9\x14\xa7\xf3\x14\xa5\x07\xf7\xfb\x0a\xee\xa9\x09\x01" + - "\x4b\x9e\x9b\x66\x5e\xd6\x17\xa0\x4f\xe5\x5d\xd5\x8d\x7e\xd9\x47\x55\x14\x3b\xb8\x71\xf0\x11\xc8\x07\xec\xeb\xe6" + - "\x9f\x0d\x45\x6c\x4e\xea\xfb\x5f\x63\xde\x20\x5b\x19\x7d\x66\x19\xcd\x1e\xfc\x08\x67\xb5\xbb\x99\xcb\x52\x7d\x11" + - "\x3a\xe5\x48\x35\x24\x35\xb0\x3e\xa3\xd6\xeb\x97\xdf\xec\xee\xef\xb9\xdb\x92\x02\x79\x01\x83\xca\xf1\xa4\x08\x04" + - "\xd7\xf9\x14\x01\x8f\xf8\xf9\xaf\xee\x32\xa4\xcf\xf8\xd9\x7f\x80\x62\xd3\x1a\x8f\x9c\x01\x00\xca\xde\x9b\x12\x8e" + - "\x98\xaf\xd7\xc9\xf4\x18\xb3\xc8\x8f\x46\xc9\xef\x5f\xd3\x07\xff\x21\xdd\x5c\xdf\x99\xe0\xa0\xe3\xa3\xa0\x12\x4f" + - "\x1d\x84\x0f\x12\xcb\x44\xdf\xea\xc0\x94\x81\xdb\x1e\x84\x48\x7b\xcf\x3e\x0f\xed\xb5\xd0\xe7\xe8\x76\x9c\xb7\x8b" + - "\x09\x56\xc3\xbe\x36\x30\xf4\x10\x6c\x79\xab\xa3\x5d\xe8\xf3\x7b\x63\x3b\x49\x58\x12\xd8\x3b\x72\x02\x2c\xaf\x28" + - "\x42\x13\xae\x46\x41\x68\x43\x62\x16\x19\x26\x8a\x6c\xed\x27\xc4\x94\xbb\x7d\x96\x26\x32\x8a\xc2\x88\xd5\x50\x4d" + - "\x45\x8a\x17\x4f\xdb\xe2\x3e\x1c\x1c\xb0\x67\x53\x26\x93\x22\x8a\xe1\x63\x34\x1b\xfb\xa7\xc5\xd1\xdf\x9d\xb8\xef" + - "\xc8\x49\x2a\x89\x49\x85\xd6\xe3\xad\x43\xf5\xc4\x9b\xc3\xd5\x43\xf0\x75\x4f\xef\xa4\x5c\x9d\x4f\xa3\x06\x84\xcf" + - "\x4d\xb2\x23\xbb\x25\xf7\xfb\x4b\xfe\x47\xb7\x24\x8b\x0e\x09\x15\x71\xb7\xd5\x64\x51\xe4\x86\x29\x07\xb2\x25\xc0" + - "\xf5\x08\x4a\x40\x46\x51\x8c\x8d\x58\xa1\xb6\x5a\x58\x74\x10\xd8\x83\x14\x78\x49\xe6\x7c\x1e\x34\xe5\x0a\xe8\x7e" + - "\x4c\x5e\x13\xee\xea\xc6\x3f\x7c\x5c\x10\x2c\x1e\x3e\xa4\x08\x91\x28\x8a\xc8\x31\x6a\x3e\xd8\xdb\xcd\xbe\x01\x75" + - "\x15\x5d\xc0\x32\x1d\xa6\xcf\x4d\xd5\x00\x73\xed\x6f\xf1\xd2\xb1\xd5\xc0\x60\x93\xde\xc3\xb6\x35\xa0\xf9\xc1\x8c" + - "\xd4\x0d\xba\xcf\x3a\xbe\xfb\x02\xd3\x25\x9c\xd6\xe4\x1a\xbd\x6a\xea\x99\x31\x39\x32\x51\x16\x1c\x52\x2f\x7c\x0c" + - "\xef\xaa\x31\xad\x93\xfd\x30\x89\x0a\x76\x51\xdc\x0d\xd2\x07\x0c\xfa\xfa\xf0\x61\xe8\x92\xf8\xdb\x33\x9f\x1b\x22" + - "\x33\x02\xf3\xe2\xd8\x29\xbe\x32\xe2\xec\x99\x51\xfc\x77\x14\xe2\x0b\xfc\x91\x6f\xe2\xe0\xf6\x1e\x04\x13\x44\xe4" + - "\xc2\x83\xfa\xb4\x40\x61\x9e\x55\x57\x10\xb0\x32\xe7\xf4\x1d\x6e\x3e\xad\x5a\x5b\x9c\x5f\x4c\xdf\xca\x5a\x09\x9f" + - "\xa1\x25\x82\xc3\xdc\x4e\xad\xb2\xe1\xa0\x46\x52\x65\x7a\x46\xef\x7b\x2f\x2b\x30\x84\x61\x96\xc2\x01\x34\x12\x36" + - "\x21\x22\x0d\xf0\x40\x23\xc7\x18\x3e\xbd\x6e\xd7\x77\x4a\x84\x99\xe6\x57\x63\x7c\xb2\x09\xf3\xa0\x97\x4f\x4c\xb0" + - "\x15\x88\x55\x1c\xa9\x3f\x6e\x3a\x11\x0b\x90\xde\x8e\x1c\x80\xd8\x1e\x86\x87\x63\x57\x61\xba\x5c\xab\xc6\x6e\x72" + - "\x07\xc3\x31\xbe\x18\x40\x1c\x62\xd6\x98\x73\xd3\x58\x24\xdc\x68\xd0\xc0\xcf\x86\x49\xc7\xc6\x7e\x44\xf7\xc5\x48" + - "\x02\x40\x40\x82\xbb\xc0\x3e\x3f\xc8\x0a\x4b\xe7\xa0\x68\xd8\x40\xf5\x9c\x70\xd1\xc3\x2d\x25\x55\x44\x6e\x43\xc2" + - "\xac\x7e\x4b\x15\x2c\x2a\xf8\x6c\x65\x7e\x66\x39\x85\x7e\x0f\x13\xee\x9d\xe4\x98\xa4\xd1\x8e\xe8\xb5\x97\x49\xed" + - "\x5c\x74\x3c\xba\xfe\x4d\xb7\xd5\xea\xa5\x35\x29\x8c\x06\x58\x8a\xf4\x70\x4d\xd5\x9e\x14\x52\x13\x60\x8c\xfb\xa1" + - "\x11\xb1\x2f\x23\x40\x8c\xa8\xb6\x48\x0f\x26\x59\xd2\x14\x4a\x23\x52\x52\x75\xbf\xd9\x8a\xd5\x69\xe8\xa6\x24\xd0" + - "\xc4\xae\xaf\xc5\x33\x66\x28\x85\xea\xa1\x2f\xa9\x2e\xd3\x61\xca\x1f\xa5\xaa\xba\x5e\x61\x7a\x4a\xda\x0f\xf4\x8f" + - "\xcf\xf4\xac\x34\xf2\x7c\x17\x4d\xd1\xb6\xa6\xea\x90\x0a\x69\x76\x1d\xf4\x71\x26\x9f\xce\x6e\x0c\x63\xbe\x22\xba" + - "\xe5\xf3\x94\xfb\x79\xda\x27\x13\xbb\xe9\x78\x45\xd2\x30\xc9\xc1\x10\x87\xa8\xcb\x97\xd2\xad\x0d\xfc\x8c\x31\xad" + - "\x3e\x05\x16\x90\xbf\x18\x09\xc0\x20\x0d\x78\xf1\xd1\x47\xab\xa5\x95\xb9\x5b\x89\xfc\xad\xd9\x72\x1e\x5d\xe1\xa8" + - "\x1e\x48\xef\xf0\x6a\x53\x28\x1c\x16\xc7\xad\xed\x4d\x92\x51\x8b\x51\xe8\x50\xc2\x0b\x74\xb0\x48\x52\x9f\xd7\x94" + - "\x1b\xf0\x4d\xc0\x0b\xc1\xc8\xf4\x57\x1c\x0a\xee\xc5\xb1\x4b\xa4\x51\x72\x85\xdc\x2d\x29\x02\x73\xb6\xb6\xa8\x8a" + - "\xbe\x58\xcc\x98\x19\x91\xbd\xa7\x7a\xef\x08\x87\x4b\xa4\x6e\x08\x57\xc3\xc5\xe8\x8f\x58\x13\x31\xa5\x58\x2c\x02" + - "\x83\x4d\xfb\x53\xc9\x98\x3a\x44\x6f\x68\xd5\x3f\xd7\x45\x6b\xd4\x67\xe4\xea\x4c\x2e\x50\x17\x75\xd5\xfa\x03\x62" + - "\xd4\x99\xb9\x12\x49\x24\x30\x57\xb7\x77\x4c\xd1\xa5\xad\xd5\x2e\x64\x93\x74\x53\xff\x39\x8c\xfa\x73\xe2\x7c\x4e" + - "\x00\xc8\x92\x84\xb3\x0b\x13\xa0\x54\x19\xe7\x3c\x73\x9d\xca\x04\x3d\xf5\xfb\x2b\x89\xdc\x66\xa2\xd5\xd9\x7f\x81" + - "\xf0\x6c\x5a\x5b\xb9\x0e\x8e\xa7\x8d\x77\x5f\x28\x8e\x9b\xa7\x87\xc8\xc8\xbb\xa8\x77\xef\xc6\x1f\xf7\x6a\xb6\xbc" + - "\xca\x5c\x5e\x07\x68\x81\x18\x25\x28\xe4\xc1\xe7\x8a\x54\x4c\xc0\x3c\xde\xa6\x09\xec\x31\x2f\x93\x3a\x00\xd5\x4b" + - "\x66\x6e\x9a\x46\x7a\x04\xbe\xa0\x27\x83\x21\x4b\x13\x5d\xed\x0b\x28\x42\xaa\xcf\x5b\xc4\xf0\xc5\x0b\x96\x52\xd1" + - "\x4d\x59\x60\xf4\xc9\xba\xe5\x76\x6b\x8b\xd9\xd9\xd8\x7b\xa3\xde\xa0\x8a\xcb\x3d\xec\xd3\xf1\x90\x09\x14\xf9\xe3" + - "\xd4\xdf\x0b\xd4\x5a\xe2\x8e\x44\xb4\x68\x14\x26\xdf\x17\x40\x72\x50\xef\x7f\x7d\x1d\x5b\x14\x46\x5c\xcd\x52\x17" + - "\x15\x52\x84\x08\xbd\xd8\x4f\x18\x5e\x44\x50\xd7\x8e\x78\xea\xfd\x1f\x77\xa3\xe6\x44\x12\x34\xdd\xcc\x16\xba\x98" + - "\xa9\x59\xa3\xed\x02\x30\x0f\x30\xbb\xbd\x2e\x9d\xec\xb5\xb6\x9c\x53\x6d\x1f\xc0\x91\xf7\xc6\x4f\x18\x17\x79\xf0" + - "\x60\xff\xf1\x97\xdf\xfc\x85\xec\x6a\xad\x59\xae\x20\x01\x1f\x77\x74\xd2\xd7\x0b\xf7\x29\x5b\xe6\xc9\xa3\xf4\x00" + - "\x6a\x76\x9f\x73\x80\x40\xb4\x35\xfa\x36\xc7\x18\xae\x5e\x9b\x38\xfb\xf7\x2b\x8c\x55\x47\x63\xbc\xb5\x95\x56\x14" + - "\x74\xc5\xcd\x5a\xfa\xba\xc6\xb6\x24\xde\x7c\xe3\xaa\x6e\x8b\xf9\xd5\x2f\x45\xbb\xe0\x23\x70\x14\xa9\x97\xd9\xcf" + - "\x34\xcc\xc5\x71\xcc\xb2\x70\x03\x7f\x45\x85\x53\xaa\xef\xf2\x11\xe5\xf4\x79\x9f\xd7\x91\xef\x0c\xe5\x89\xdc\xd0" + - "\x9b\xc0\x9a\x6d\xda\x89\x37\x5e\x37\xac\x49\xbb\xef\xab\x26\x2d\xec\x80\x6e\xa4\xd2\x2c\x11\x0e\x75\x14\x6e\x0f" + - "\x0f\x1d\xc6\x59\x87\xfe\xb8\x91\x04\x81\xf7\x99\x93\xb5\x3b\x45\x31\x22\xf9\x8f\xf8\x12\x9d\x3a\x6e\xff\x46\x10" + - "\x92\x10\xa5\xee\x64\xa1\x1f\x7d\xd5\x53\x49\x77\xa2\x32\x6f\xf1\xd3\xa9\xf7\x3d\x27\x05\x00\x1d\x8f\xe9\xad\x27" + - "\x8d\x77\xaa\xff\xda\xef\xdd\x51\x60\x5d\xed\xd4\x27\xfd\x17\x2c\xec\xb4\xe3\xd7\xe2\x58\x47\x01\x83\x11\xdc\x5a" + - "\xa4\xc3\xbd\xcf\xfd\xe0\x37\xa5\x9b\x2d\xe9\x30\x4f\xe4\x7e\x2b\x2e\x31\x4e\x08\x78\x90\x44\x93\x72\xc2\xd7\xbf" + - "\x6f\xf3\x43\x8a\xfd\xc4\x5b\xaf\x6b\xe4\xe0\xdc\x42\x8e\xc0\xc9\x81\x9e\xd6\x6d\xfd\x32\x1d\x66\x7a\x82\x83\x65" + - "\x2f\xd2\x11\x00\x46\x5c\x05\x36\x63\x84\xb8\x6e\x6b\x30\xb5\xea\xb2\x0c\x1e\x1c\x36\x54\x11\xb0\x2c\x2e\x0c\xda" + - "\xfe\xd0\x3a\xa3\x1b\xf2\xbc\x08\xa4\x82\xbb\x75\xb8\x89\x68\x08\x2e\xbc\x9f\x70\xa7\xfe\xcb\x21\x0d\x13\x17\x8d" + - "\xd4\x0a\x9f\x4e\x7c\xee\xa2\x3e\xfb\xdd\xb8\x22\xc8\xad\x00\xc7\x1c\xb5\xbc\x17\xe0\xca\x79\x45\x78\xaf\xa5\xb6" + - "\xad\xf2\xc9\xc2\xe3\x99\x72\x44\xc8\xe3\x4a\xe0\x48\x3b\x2b\xf6\xa9\xb4\x64\xe4\x3f\x0d\x44\x25\xd1\xa6\x88\x9a" + - "\x5c\xab\x7f\xa6\xa2\x78\xdf\xf9\x49\xbf\x11\x37\x2f\x32\x4a\xf2\x1e\x80\x27\x48\x5a\x7b\x84\x8b\xdb\xce\x0b\x0b" + - "\x91\x9f\xba\x6e\xde\xef\xb8\x87\x43\xb9\xc5\xd4\x18\x19\xfd\xe2\xfe\x48\xd3\x14\xd5\x9e\xc4\x37\x49\x2f\x62\xaf" + - "\xcc\x21\xd2\xb1\xd4\x2b\x3f\x4e\x41\x83\x22\x33\xae\x08\x38\xf4\xe2\xc6\x2b\x7f\x72\xd3\xd9\xa1\x00\x05\x36\x38" + - "\xf7\xbc\xa5\xe1\x25\xe4\x4a\x66\xc3\x0b\x9e\x8d\xe0\xb8\x08\x91\x19\x29\xd5\x2f\x66\x67\x9c\x93\x2e\xbd\x52\x5c" + - "\x9d\x53\x31\x7d\xf0\x90\x0c\x83\x49\x87\xe0\x29\xee\x8d\xed\x7b\x5b\xc1\x9a\xa8\xdb\x56\xcf\x16\x3e\xbd\x8e\x65" + - "\x58\x40\x06\xf0\x61\xe3\xb8\xdc\x42\xa7\x0d\xa8\x9d\x92\x16\xf8\x85\x02\x06\x07\x55\x2e\x69\x19\xf7\xb0\xb3\xcf" + - "\xbc\x55\x0d\x3f\x9c\xeb\xa2\xec\x7c\xe8\x1e\xd2\x7b\x66\x5b\x93\x12\x84\x73\x38\x4c\x50\x1e\x9f\x89\x8b\x3a\x99" + - "\xd9\x67\x61\xdb\xa1\x62\x97\x6c\xf0\xe9\xbd\x24\xd2\x2b\x45\x7a\xbf\x9e\x3d\x92\x8a\x26\xfe\x3b\x92\x3f\x9f\x06" + - "\x4e\x00\xb3\xc4\x3c\xca\x58\x4c\x94\x84\x81\x0b\xc0\xbf\x22\x8e\x57\x0a\x94\xde\xce\x8d\x6c\x52\x7c\x83\x78\xba" + - "\x8e\x35\x44\x7c\xdf\x27\x53\x5e\x11\x48\x96\xc8\xb4\x5b\x1d\x77\x86\x83\x0d\x1e\x0e\xfd\xc5\xc7\xeb\xca\x2e\x8a" + - "\x79\x3b\x10\x13\x1b\x8e\xed\x88\xe8\x13\x91\x0b\xb9\x1c\x21\xcd\xd5\xaa\x81\x04\xc5\xd1\x82\x24\xcf\xfa\x7c\x6f" + - "\x37\xb7\x9c\xaa\x1d\xd3\x0f\xf1\xd6\xef\xeb\x6f\x1a\x3e\x6c\x57\x06\x6e\x3b\x11\xb4\xe9\x9e\x04\xbd\xcc\x5c\xba" + - "\x8c\xd4\xab\x16\x15\x23\x26\x07\xc7\x70\x8a\xe6\xc4\x3a\x0e\x0e\x54\x86\x40\x47\x99\x3a\xec\x63\x1d\xb1\xdc\x50" + - "\x51\x44\x0f\x1f\xa5\xa9\x6b\xe3\xfa\x5a\xdd\x9f\x57\x80\x8a\xc1\x41\x7f\xdb\x41\xf7\x1a\xed\x5b\xae\xe6\xe1\x43" + - "\xea\x2b\x08\x8f\x9e\xb5\x0b\xcf\x0c\x31\x9d\x49\xbd\xfc\x97\x00\x39\x93\xd5\xfb\x28\x4c\xff\x4d\x88\xef\xae\x57" + - "\x6d\x10\x77\x0e\x44\x20\x45\x3d\x9f\x53\x74\x08\xcd\x49\x5c\x52\x62\xab\x1d\xc6\xef\xc0\xcb\x2d\x7a\x52\x54\x32" + - "\x42\xc3\x8d\xc6\x86\xf9\xf4\x8f\x8e\xe2\x6a\x8e\x03\xd0\xaf\x2f\xe2\x63\xb8\x3c\x01\x0d\x40\x98\xee\x63\x74\xb9" + - "\xd8\x05\x4e\x27\x24\x0d\x98\x80\xe3\xc4\xee\xdf\xc0\x60\x2f\x8c\x80\x54\x5c\xe0\xd7\xc9\x87\x04\x4c\x43\xbb\x59" + - "\xbc\x81\x6a\x22\xab\xdb\xbf\xb9\x17\x38\xad\xae\x1c\xa6\x79\x73\x7f\xf1\x86\x08\x73\xed\xa9\x6d\x57\x24\xdf\x44" + - "\xd5\xb8\xca\x40\xd7\xe8\x89\x88\xa8\xeb\x09\x9e\x0b\x3d\x8e\xb5\xfe\xe3\xdc\x90\x17\x03\x46\x4a\x8b\x72\x69\xf0" + - "\x3f\x67\x53\x5a\x85\x5c\x6b\xbd\x31\xfa\x73\x9d\x9b\xf7\xf5\xb4\x7b\xe4\xda\x3a\x1c\xbb\x98\x88\x6f\x93\x61\x04" + - "\x0d\x72\x57\xac\xcd\xf6\x66\x73\x3d\x6f\x4d\x13\x70\x51\xc9\x93\xac\xad\x11\x79\x44\x46\x47\xb3\xc3\x12\x3b\xf8" + - "\xa8\x21\x9a\x8e\x3d\x0c\xec\xc8\x89\xff\x64\xe3\x08\x3a\x38\x01\x73\x11\x40\xce\x3c\xce\x1c\x94\x1a\xbb\xf1\x0d" + - "\xc7\x54\x72\xf0\x87\xf2\x38\xc1\x6d\xad\xf8\xf4\xf7\x0d\xd0\xc7\x74\xd0\xa7\x5d\x51\x6b\xe3\xa7\x22\x5e\x15\x02" + - "\xc0\x0e\x54\xbf\x21\x0c\x4d\x75\x5e\x5c\x75\x32\x88\x2f\x0a\x95\x77\xc8\x5e\x68\x83\x44\xc7\x5a\x5e\xce\xbd\xf9" + - "\x56\xdf\xae\xd0\x73\x13\xe0\x60\x67\xf5\x0a\x20\xb3\xa1\x65\x5b\xab\x95\x69\x76\xbd\xab\x04\x91\x18\x54\xc5\x9c" + - "\x18\x55\xd6\xb6\x0d\x02\x16\xb9\x72\x09\x55\x1c\x6e\xbd\x0d\xc2\xb8\x1a\xc2\xae\xd4\x94\x42\xd9\x77\x07\x43\xe2" + - "\x82\xbb\x05\xb8\x38\xcf\x8b\xaa\xb0\xe0\xbd\x42\xe2\x80\x55\xc5\x72\x69\xf2\x42\xb7\x86\xfd\xba\xd1\x7d\x06\xbe" + - "\xbe\xbe\x4e\x3d\xbd\xb0\x2b\x19\xd6\x93\x45\x8a\x4d\x30\x5e\x81\x59\x4e\xe0\x09\x24\xfe\x4e\x72\x1e\xc7\x58\x09" + - "\xa4\x7a\xf7\x0f\xe3\x28\x68\xdf\x0b\x1c\xa0\xa0\x36\xe8\x4a\x86\xbe\x17\x21\xec\x5f\xd6\xe4\x23\xa3\xe1\x35\x1d" + - "\x62\x59\xcf\x28\x2e\x1d\x42\x8b\x12\x29\x18\xdd\x69\x01\x0c\xf2\xdf\xf0\xbb\x44\xca\x42\x64\x8c\x7a\xf5\x6f\x44" + - "\xf1\xc2\xa7\xa9\x2a\x1c\xcb\x05\x84\xc5\x96\xc2\xde\x59\x27\x99\x3e\xc6\xd9\xf4\xcd\x21\xc5\x89\x22\x8a\xf1\xb6" + - "\x01\x77\xdd\xfb\x12\x57\x85\xdb\xe4\x6f\x0f\xc4\x00\xb0\xee\xf0\x5b\x38\x99\x7a\x20\xd4\xae\xb9\x99\x7c\x51\xc2" + - "\x57\xc4\x00\x40\xbb\xb8\x1c\x51\x34\x33\x93\x4d\x57\xe4\xfa\x1a\xae\x81\x11\xe7\xbe\xfc\x13\xc0\x0d\x90\x89\xc2" + - "\xf0\x65\xe2\x61\xa5\x03\x17\x49\x7d\xe0\x80\x5e\xfc\xbd\xa3\xb2\xe0\x33\xc8\xb8\x4c\x20\xb6\x08\xbb\x06\xfe\xa6" + - "\x97\x6e\x9f\x77\x1d\x1b\xfd\x6d\x11\xf4\x7b\x64\x2b\x8a\x34\xfe\xee\xab\x38\xff\x82\x7c\x00\x0b\x2a\x0e\x8a\xdf" + - "\x2b\xe9\x87\xc9\x89\x89\xc4\xef\xc4\xee\x00\xdd\x0d\x55\x7e\x72\x2f\x1e\x3e\x54\x4d\xb3\x66\x6c\x1a\x1e\x8b\x40" + - "\x11\xbb\xb3\x73\x2c\xcd\x7b\xd3\xc3\x76\x6a\x16\x39\xc0\xc8\x36\xcf\xca\xe3\xe3\xdd\xdd\xa7\xc9\xac\x61\xa9\xd0" + - "\x41\x44\x88\x38\x40\x2f\x56\x70\xd6\x23\x64\x5a\xcf\x71\xa4\x5f\x08\xee\xe3\x6a\x65\xe4\x38\xd2\x92\x82\x38\xc5" + - "\xc7\x09\x0e\x1f\x6f\x2f\xa1\x3f\xe5\x2a\x40\xa2\x99\xb1\x8d\x70\x14\x6b\x70\xe2\xd0\x0d\x94\xb2\x31\x03\xed\x65" + - "\xcb\x56\x08\xac\x9b\xe2\xad\x41\x9d\x03\xce\xee\x17\x1a\x72\x81\x21\xb6\x20\xd7\x40\x3b\x34\x38\xa2\x81\xcf\xe6" + - "\x8c\x74\x66\x45\x13\x9c\x3a\xbd\x0c\xcc\xe9\xb3\xa0\x24\x8d\x84\xab\x3b\x59\xb7\x98\xed\x1a\x5b\xbf\x52\x17\x06" + - "\x54\x74\x30\xfe\xb0\xa3\x79\xfc\x8e\x07\xef\x28\x90\xfa\xd9\x20\x58\x98\x1e\xdc\x13\x80\x1b\x03\xb2\x9e\x52\xd0" + - "\x0e\x0c\x4c\x1f\xdd\x08\xa0\xd4\x4c\x32\x7a\x21\x07\x6e\x21\x15\xb8\x4a\x77\x1f\x69\x2a\xc2\x0b\x8f\x5b\x3d\x22" + - "\x1d\x99\x22\x2d\xb0\x37\x87\xf6\x14\x42\xfa\xe2\x4b\xde\x4a\x61\xbc\x9c\x8b\x8d\x1e\xe2\xbf\xb1\xca\x92\x57\x0e" + - "\xdd\x5c\xc4\x75\x3d\x2f\xf5\xa9\x02\x33\x7b\x71\xee\x98\x0c\xd7\x17\xbc\x39\x74\xab\xc3\x4d\x4a\x4a\x4b\x5f\x0d" + - "\xdc\x9f\x61\x17\xce\x8b\x86\x38\x8d\xd8\x43\x37\x2c\xea\x48\xa4\x27\xde\x80\x2b\x11\x11\xb3\xf0\x4c\xf0\xd7\xa3" + - "\x88\x01\x10\x27\xa4\xe4\x00\x78\xc7\xc4\x52\xc2\x25\xc9\xa1\x00\x5c\x01\x8e\xc5\xc3\x36\xfe\x8f\x50\x96\xdb\x09" + - "\xc9\xa7\xd1\x91\x88\xc9\xf9\xf3\xd4\x22\x9e\x8b\xe0\x15\x4b\x64\xc3\xc9\x30\xd8\xab\xbb\x27\xe5\xee\xfc\x29\x34" + - "\x2f\x50\x61\x74\x45\xc4\x4f\x78\x23\x85\xf1\xf7\xbe\xef\x8a\x52\x3d\xe3\x43\x61\x68\x3e\x4f\x36\xb1\x64\x77\xc4" + - "\xde\x8d\xdd\x33\xfb\x91\x49\xc9\x19\x72\x44\x9e\x83\x23\x76\x7b\xbc\x05\xa0\x14\x2c\xb1\xd6\xbe\x92\xd2\x7a\x25" + - "\xfd\x18\x3a\x0f\x6f\xd3\x85\xa4\x82\x07\x43\x55\x91\xfe\x23\x5c\x53\x1d\xbd\x88\x47\xb9\x42\x8e\x15\xba\xc4\xd9" + - "\xc1\xf1\xc4\x78\x38\xaf\x98\x6f\x65\x71\x8a\x63\xbb\xd0\x69\x06\xb7\xde\x5d\x32\x55\x84\x32\xe9\x03\xcb\x38\xa1" + - "\x32\xa6\x8a\x99\xad\x6d\x5b\x2f\xc5\xfe\xeb\x82\x16\xda\xb2\xc8\xcd\x8b\xfa\xa2\x9a\x52\x27\x70\xfa\x81\x84\xc2" + - "\xbb\x9f\x57\xfe\x0d\x2c\x48\x78\xf3\x9e\x20\xc1\xe8\x2d\x2d\x20\xbc\x77\x52\xf0\xeb\x6a\xaa\x84\x9c\x48\x0e\xa1" + - "\x37\xfc\xfa\xed\xba\x8d\xdf\xe3\x72\xfb\xf7\x5c\xbb\x2c\x42\x4d\xa8\x9b\x04\x3e\x11\xe7\x4d\x7a\x03\xfd\x77\xac" + - "\x7c\xbc\x44\xc1\xed\xe9\x93\x16\x25\xba\x23\x20\x99\xda\x53\x09\x1f\xd0\xef\x8a\x00\x86\x46\xf7\x45\x12\xc2\xd7" + - "\x7f\xf3\x90\x19\xa4\x27\xe8\xb0\x9b\x8d\x37\xa5\xac\x81\x78\xc0\x1b\x4f\x7b\x43\x5c\x1c\x67\xa2\xb0\x68\xd0\x83" + - "\x52\x0b\x8d\xe9\x10\xd9\x0f\x07\x92\x85\xa1\x87\x62\xee\xaf\xff\xfb\x68\x40\x18\x46\x94\x18\x10\x75\xa8\x91\xc0" + - "\x11\x24\x54\x75\x77\x37\xd0\xd4\xd4\x07\x36\x1a\x40\x82\xb6\x08\x70\x0c\xf5\x6a\xc0\x04\xa6\x37\x58\x33\x81\x82" + - "\x18\xf3\xb8\x05\x23\x23\x3a\x17\x4d\x34\xdb\x59\xf1\xfd\x53\xee\x13\x8f\xb3\xa7\x33\xba\x69\xa9\x37\x82\xcd\x4f" + - "\xea\x14\x1d\x4e\xfb\x56\x54\xad\x69\x10\xe7\x7a\xff\x8b\xe4\x1d\x7b\x2d\x26\x5b\x47\xcc\xd2\xeb\x3c\x5a\xdb\xd7" + - "\x39\xc2\x4d\xbe\xa6\x4a\x25\x44\x0c\x9a\x74\x7a\x1a\xde\xd4\x33\x92\x70\x93\xc6\x41\x6e\x0c\xf5\xfb\x5e\xb8\x4a" + - "\x42\x1f\x1c\x01\xed\x59\x08\x52\x82\x12\x8a\x49\x59\x5f\x4c\xd5\x57\x7b\x7b\x48\x06\x6c\x3b\x55\x8f\xf1\xc7\x64" + - "\xa2\x5e\x50\x80\x07\x7c\x11\x81\x48\x7d\xb9\xb7\xc7\x15\x13\x92\x87\x35\x39\xdc\x4f\x94\xd0\x6c\x55\xae\x4f\x0b" + - "\xc8\xb7\xf7\xbc\x2c\xaa\x56\x7d\x67\xca\xb9\x63\xde\xd0\xcb\x7d\x65\x9a\x65\x61\x6d\x51\x57\x63\xf8\x7c\xd1\xb6" + - "\xab\xe9\x64\x72\x52\x16\x55\x6e\x8b\xd3\x4a\x97\x60\x1b\x9a\xc0\x45\x39\x5e\x2d\x56\x93\xc7\x7b\x7b\xdf\x4c\xf6" + - "\xfe\x32\xf9\xf8\x4f\x37\x8c\xdd\xdc\x94\xfa\x6a\x22\x55\x82\xf0\xa4\xb3\xbd\x46\x92\x03\x69\x0b\xe9\xb0\x38\xbf" + - "\xec\xd5\x03\x43\xa1\x63\x16\x8f\xd4\x14\xfe\x81\x79\xed\x65\xa7\x83\xa6\x32\x15\xd3\x23\x7a\x69\x2e\xdb\x51\xac" + - "\xbf\x60\xd2\x53\xaf\x09\x9d\x94\x03\xa1\xa9\x30\xb4\x8e\x47\x53\x70\x8a\x3d\xca\x32\xd8\x0b\xfe\x63\xae\x32\x68" + - "\x37\x90\x0f\xe0\xb5\x4a\xf9\x7c\xe4\xf2\x57\xd0\x89\xbc\x9e\xc1\xa5\x49\x28\x22\x2f\x51\x1f\x3a\x50\x19\x14\xe0" + - "\x4c\x99\xe8\xfd\x75\x5b\x71\x2c\xc1\xe5\xc9\xca\x01\xcf\xdc\x25\x6d\xaa\xfc\xf9\xa2\x28\xf3\xc1\xe6\x0a\xd0\x06" + - "\x99\x85\x24\x05\xd0\x81\x31\x67\x95\x81\x08\x9e\x28\xdd\xaf\x47\x06\x2a\xde\xbe\x53\x4f\xc6\xfb\x23\x8f\xfe\xfc" + - "\xe5\xf8\x72\x14\x43\x41\x87\x94\x3f\x32\x69\x22\xd7\x39\x69\x74\x5e\xd4\xa4\x92\x1d\x64\x99\x93\x12\x1c\xf3\x88" + - "\xe0\xcd\x4f\x55\xe6\xfa\xe5\x48\x0c\xe0\x41\x0d\xdd\x09\xe2\xfc\x26\xae\x86\xb7\x90\x9c\x10\x7a\x1b\x20\x4c\xb3" + - "\xd0\xd1\x37\x80\xfc\x00\xce\xfb\x8c\x18\x46\xc9\x2b\x97\xfa\x0c\x5d\x94\x61\xec\x34\x5f\xe4\xb8\x03\xba\xc4\x04" + - "\x00\x69\xa4\x5e\xbf\xdc\xdf\x13\xed\xd7\xab\xf6\x1d\x7c\x64\xd8\x02\x60\xe9\x67\x68\x3d\x0e\xbd\x03\xc6\x78\xc5" + - "\x7c\xb2\x2d\x72\x48\x4f\xe8\x44\x25\xf6\xf1\xf3\x69\x78\x96\xba\x39\x43\x74\x31\x2e\x81\x35\x0e\x08\xd4\xda\xbd" + - "\x87\x11\x2d\x65\x19\x98\x1e\x5c\x78\x5f\x71\x70\x05\x11\x1d\x7f\x11\xde\xde\x07\x43\x0c\xfd\xf6\x3d\xf7\x39\x9a" + - "\x74\x45\xdb\x75\xa9\x8b\xaa\xd5\x85\xeb\x7a\x6b\x69\xbd\x50\x71\x7f\x62\x66\xf5\x92\x30\x15\xdc\x62\xde\x32\x77" + - "\x9f\xbc\xf3\x9f\xfa\x4d\xc8\x1e\xb8\x19\x66\x9a\x89\x77\x26\xb4\x97\xc9\xc1\xc1\x93\x7f\xa7\x6f\xa2\x1a\x0e\xb8" + - "\x8e\x9b\xe1\x80\xd1\x4d\xdd\x69\xac\xea\x1c\x04\xe1\x91\x72\x6c\x2e\xfc\xb5\x7d\x0f\xa2\xda\xbf\xc3\xf0\x5f\x61" + - "\xcd\x5e\x35\xe3\xf0\x62\xb3\x8d\xc4\x95\xf9\x57\x80\x8c\xa9\x32\xf7\xf9\x9f\x82\xcb\x05\xa2\xe8\x98\x94\x67\x3d" + - "\x0d\xf7\x31\x7d\xfd\x1a\x08\x6a\x3e\x54\xc5\xfd\x92\x38\xbe\x1b\x84\x9c\xcd\x83\xdf\x88\xc9\xec\xa1\x45\x47\x90" + - "\x74\x0d\xba\x50\x61\xbc\x6b\x1c\xff\x1a\x82\x94\xd0\x57\xf6\xd4\xb4\x13\x6b\x5a\x19\x9b\x4a\xf9\xe6\x46\x3e\xd9" + - "\x1c\xa0\xbd\xf8\x00\xd4\x0d\xa9\xe7\xaa\x38\xe5\x5c\x15\xa7\x9a\x0b\x3f\x1f\x27\xee\x2f\x49\xc4\xcf\x2b\x01\x51" + - "\x08\x36\x0d\xf0\x84\x12\xbd\xd3\x8d\x01\xb6\x92\x36\xa9\xe0\x25\x49\xd6\x82\xe1\x9e\x9a\xf6\x99\xef\xb1\x6b\xd6" + - "\xb6\x4d\x37\x74\x2c\x86\x8f\x77\xcd\xf5\x4e\x71\xd2\xc5\x67\x65\x99\x76\xa8\xac\x2f\x4c\x33\xd3\xd6\x50\x91\xbf" + - "\x37\xfa\x24\xe4\x26\x47\xb4\xbf\x62\xae\xea\x0a\xe3\xee\x7c\x4e\x76\xec\x38\x4e\x0e\x22\xc3\x5c\x5f\x0b\x53\xf4" + - "\xaf\x6f\xbe\x7f\x51\xcf\x3a\x99\x6b\x29\x78\x01\x80\xb0\xdb\xfa\x7b\xd7\x36\x04\x2f\x0c\x45\xa4\x7a\x38\x69\x70" + - "\xc8\x92\x1c\x36\x28\xa8\x0f\xa2\xc3\x08\x5e\xd3\x63\x77\x6e\x49\x25\x4c\x1b\xfe\xd0\x9f\x65\x35\xf5\x07\xbc\xc7" + - "\x6e\xba\x31\xc7\x5c\xd0\x1f\x05\xea\x11\x85\xe4\xf7\x1d\x96\x04\xf4\x5a\xaa\xc1\x93\x78\x03\x7b\x6b\xa2\xa7\x6e" + - "\xea\x2a\xac\xf3\xd3\xf2\x3c\xf5\x68\xdf\x11\x38\x41\x6c\xaf\x98\x24\xed\x08\x34\xca\x08\x10\x3c\xd2\x80\xf5\x8f" + - "\xe4\x93\x53\x56\xc9\x21\x44\x33\xd9\xe9\x7c\xd4\x77\xac\x8d\xa9\x6c\x51\xe5\xb0\x37\xfa\xe7\x1a\x92\xac\x57\xbb" + - "\x90\x04\x08\x68\x40\xd8\xf0\x8c\x47\x0d\xc8\x9a\x17\x46\xb8\x12\xb4\x75\x98\xd1\xa4\x3f\x5e\x29\x42\xd8\x3f\x61" + - "\xe6\xa7\x7e\xae\x52\x5f\x9a\x7e\x3a\x2c\x16\x53\x52\xbf\x20\xd6\xff\xe0\x73\x7a\x88\x34\x06\xae\xff\x3f\x40\x3e" + - "\x51\xce\xb1\xc7\x39\xdc\x70\xe3\x0f\x54\x53\xd5\xed\xc5\xa2\x68\xc3\x24\xc0\xf2\x84\x0f\x39\x4f\x4b\x02\x25\xc0" + - "\x73\xcf\x98\x50\x03\x3a\x9e\xfe\xc3\xa3\x62\x67\xe7\x58\x58\x24\xb8\x8f\x61\x2d\xd0\xa9\xf1\x52\x26\x99\x72\x7f" + - "\x49\x1b\xee\xb7\xa8\x36\x92\xeb\x70\x6a\x5a\x76\xaa\x56\xad\xbb\xfb\x81\x58\x0f\x1e\xec\xef\x7d\xfd\x97\xbd\xa1" + - "\xd0\xf5\x7d\xca\x29\x0f\x7a\x3e\x8a\xea\x87\x80\x17\xbb\xaa\x2b\x48\x1e\x2c\x63\xfb\x41\x53\x4f\x85\x11\xec\xd1" + - "\x8f\xe8\x38\xb1\x9c\x78\xd7\x56\x98\xb8\xb0\x9e\xe2\xe0\x74\xd3\x4e\xe3\xe2\x7b\xb2\x45\x3e\x42\x8e\xba\x73\xa2" + - "\xe1\xcd\x89\x66\xd2\xf8\x9b\x1e\x56\x26\xce\xdd\x87\x5c\x4f\xc0\xcf\xf3\x9a\x11\x8c\x8c\xf3\xb1\x94\xcc\x4c\x75" + - "\x26\xca\x27\x9d\x05\x3e\x0a\x2c\xfe\xc8\x86\x9f\xac\xdb\xd6\xfd\x04\xbe\x2e\xb8\x4a\x34\xc6\x1a\x84\x75\x65\x94" + - "\xa3\x4a\xbd\x7e\xf9\xd5\xee\x37\xa1\x56\xcc\x1b\x8f\x6f\x31\xa1\x21\xb0\xf9\x45\xa5\xdc\x15\x83\x0d\x15\x16\x20" + - "\x1e\xb0\x76\x2c\x9a\xaf\x21\xa6\x18\xd8\x40\x8f\xc0\xc5\x19\xe1\x98\x0f\x10\xb4\xa8\x97\x96\x65\xae\xf6\x2c\xbe" + - "\xfa\x04\xf9\x96\xf6\xc1\x50\x1f\x9e\xa9\xc4\x2a\xd8\x43\xfd\x3a\xa9\x95\xa5\x5a\xf2\x3b\x9f\xb4\xfa\xa4\xb3\xd7" + - "\xb7\xef\xf9\x3b\xa8\x17\xc0\xb4\x87\xc0\x0b\x1b\x53\x58\xee\xd8\xc8\x04\x53\xbd\x84\x88\xaf\xee\xe9\x02\xbe\x83" + - "\x50\x34\xc2\x8e\xbf\xfb\xa6\x4a\x68\xee\xc6\xeb\x42\x7e\x20\x58\x4a\x3a\xf7\xac\x4e\x91\x1a\xd8\x4d\xe7\xd8\xd6" + - "\xeb\x66\xe6\xc9\xd8\xe4\xc3\xc5\xce\xe4\x54\x0d\x6f\xd7\x84\x9f\x42\x56\x4d\xa2\x52\xc8\x82\xf7\xa4\xb8\xf3\x77" + - "\xc4\xd3\x70\x24\xe3\xb2\x07\x1b\x98\x53\xe0\x5d\x24\x79\x86\x54\xc0\x0b\xe6\xf5\xf9\x78\x46\xc5\x80\xb7\x82\x4c" + - "\xf1\x20\x28\xcd\x8b\xca\x11\x63\x00\xed\x4b\x52\x04\xc1\xf4\x7b\xc8\x1b\x1f\xb2\xe6\x53\x2d\xe2\xe8\x90\x19\x62" + - "\xb9\xa3\xdb\xf9\xa7\xfe\x62\xe8\x0c\xca\x67\x79\xc4\x2b\x13\xeb\xeb\x1f\xe1\xfd\xf8\x5e\xeb\x32\x65\x7c\xc1\x91" + - "\x46\x6b\x53\x93\x62\x6e\xe4\x7e\xa0\x9e\x08\x65\x71\x90\xb6\x9a\x79\x3d\x5b\x83\xb0\xc9\x60\xb1\x40\xa5\xae\x51" + - "\x6c\xbd\x76\x4c\xbc\x6e\x8c\xbe\x46\x4a\x34\xfc\x6c\x52\x6c\x16\xb3\x1c\x09\xff\x2f\x88\x59\xe8\x9d\xf5\xaf\x88" + - "\x59\x3f\xf6\x34\xfc\xe9\x62\x16\x47\xf0\x2d\x0a\x7b\x74\xc7\x6d\x9a\x02\x7f\x6c\x14\xba\xe8\x7b\xce\xcf\x3e\xaf" + - "\x9b\x6c\xaa\xb2\x45\xbb\x2c\x5f\xd5\x0d\x7a\x90\x64\xb3\x52\x5b\x0b\x69\xc2\xdd\x1f\x3f\x50\x4c\xa8\xf7\x01\x8e" + - "\x87\x74\xab\xd4\x86\x07\x03\x45\xb7\xaa\x6e\x2f\x97\xe5\xbf\x20\xbd\x89\x50\xac\xff\x73\xd2\x1b\xf6\xde\x09\x26" + - "\x9f\x26\xcf\x48\x2e\x8b\xbe\x15\x94\xe0\x55\x71\x89\xcb\x46\xfd\xd7\xb3\x05\x4e\x93\x14\x81\xee\xe4\x9f\xba\xe2" + - "\x90\xc8\x5a\xd1\x4d\x01\x79\x67\xb2\xec\x34\x27\xc7\x7f\x93\xf4\x71\xe8\x79\x60\xa6\x16\xf8\x59\x1a\xb5\xed\x27" + - "\x2d\xe5\xeb\xe3\x4e\xfd\xeb\x82\x44\xb7\x23\xb2\x1b\x5d\x67\x77\x9a\x4b\xe6\xd1\xf4\x09\x64\xfd\x67\x3e\xad\x27" + - "\xeb\x63\x47\xd0\x82\xfd\xbd\xd0\x36\xe2\x41\xf4\x09\x68\xcf\x09\x2a\x29\xd0\x39\xe2\x59\x53\xf0\x02\x4e\x71\xbf" + - "\x68\xcc\xdc\x83\x8b\xc2\x13\xee\x91\x87\x10\xdd\xdd\x4f\xd9\xcd\xde\x04\x7c\xaf\x5f\x7e\xb3\x83\x4f\x48\x0f\x59" + - "\x19\x6b\xc9\x46\xcf\x6a\xce\xa2\xa2\x1f\xa7\x4d\xbd\x5e\x71\x46\xeb\xa2\xd2\xb3\xd9\xba\xd1\xad\xd9\xbe\x17\xf3" + - "\xa0\x52\xc9\x19\x19\x8e\x04\x50\x7b\x50\x82\xc2\x2c\xdd\x36\x81\x10\x49\x81\x2a\x58\xa2\x12\x01\x92\xfd\x69\x90" + - "\xb9\xa9\x08\x02\x5e\x9b\xaa\xed\x03\x6e\xdf\xea\xbc\xf2\x3d\x81\xd9\x93\x11\xcd\x42\xfa\x8b\xdc\x9e\x6f\x3a\x66" + - "\xfa\xed\x7b\x5b\x19\xcf\x3f\x90\xcd\xac\x31\x3a\x7f\x5b\x95\x57\xf8\x6b\xa9\x2f\xbf\x87\x9b\x01\x7f\xce\x4c\x59" + - "\xbe\x5b\xe9\x19\x24\x58\xe4\x07\x3f\x12\x98\x26\x7e\x5e\x5f\xbc\x5b\xe9\x8a\xde\xd6\x65\xf8\xb1\xb6\xe6\x8d\x5e" + - "\xe1\xdf\x10\x22\xf7\x2d\x64\xd0\xe3\x92\x95\x13\x61\x5f\xe6\x45\xeb\xf6\x50\xb6\x7d\xef\xb8\x93\x36\x33\x25\x24" + - "\x70\xe5\xc4\xd7\xf8\x31\x81\x2a\xf6\xde\xc4\x70\x0d\xb8\x5b\xf8\xe8\x43\xfb\xa1\xf9\x50\x7d\x98\x1f\x4f\x4e\x6f" + - "\x51\x6a\xe6\xf9\x73\xf7\xc5\xc6\x2c\x7c\xe0\xad\xe0\x4a\x18\xcb\xd1\x65\xb3\x75\x33\x72\xcf\x7e\xff\x7d\xa4\x3e" + - "\x8e\xd4\xbc\xa8\x74\x09\x12\x8d\x8f\xd3\x9d\x61\x00\xc7\xe6\x14\x7b\x2c\xfa\x74\xa4\xe3\x32\xa0\xb0\x47\x41\x37" + - "\x9b\x5c\xeb\x53\x18\x8b\xcd\x17\xb5\xfa\x98\xaa\x79\x7c\xc6\x2c\x9e\x04\xaa\x2e\xf2\x1a\xfa\x48\x59\x6e\xfc\xf5" + - "\x1a\x12\xf7\xdf\x74\x55\x4f\x3c\x76\x71\x7d\xbc\x5f\x80\x41\xe0\x23\xf3\x86\x8c\x79\x05\xf2\x05\x32\xbf\xb3\x7a" + - "\xb9\x6a\x8c\xb5\xc5\x49\x51\x16\xed\x95\x1a\x58\x63\xc8\x40\x0d\xfd\x42\x11\x9a\x56\x01\xe0\x50\x71\xd8\xd7\xd7" + - "\xa0\xe3\xe9\xd1\x1b\xc4\xf8\xe2\xb7\x27\xa5\xa3\x24\x58\xc8\xb9\x14\x1e\xed\x61\xb6\x6e\x3a\x28\x9c\x02\xb2\x10" + - "\x5e\x84\x49\x61\x5a\x37\x50\x99\xca\xd4\x4e\xfa\x7a\x07\x1e\x0f\xc7\x8d\x59\x95\x7a\x66\x06\xb4\x4f\x47\xf8\xd8" + - "\xd3\xc4\x4c\x21\xa0\xc5\x56\xf0\x1a\x47\x0f\xdf\x75\x23\xe4\xbd\x8f\x01\x2b\x53\x28\x3b\x60\x43\x82\x4f\x31\x4c" + - "\xd3\xd1\xc7\x58\xd7\x11\x6a\x12\xb9\xf1\xa1\xab\xf8\x21\xf5\x50\xfd\x55\xa6\xc7\xa7\x69\xd8\x39\x90\x85\xb8\x65" + - "\x2f\x5e\x7a\xdd\x02\x44\xc2\x56\xe5\x95\xd2\xd6\x16\xa7\x15\x42\xf9\xcd\xe7\x86\xad\x53\x1a\x64\x8a\x75\x55\x19" + - "\x93\x9b\x5c\x35\xa6\xca\x8d\x3b\x0f\x63\xfa\x3c\x9c\x24\xe1\x34\xd1\x14\x4b\x9a\x80\x48\x04\x4e\x26\x18\x1c\x17" + - "\xc3\xe7\xa9\x70\x1c\x0a\xca\x62\x9b\xbc\x67\xfb\x5c\xa1\x3b\xec\xf2\xff\x1c\xd9\xe8\xf0\xeb\x98\x83\x38\x38\x31" + - "\xfd\x5f\x4f\x50\xc4\x0c\xfd\xcb\x34\x65\x03\x45\xf9\x5f\xa6\x02\x40\xc0\x0a\xab\x9c\xa8\x6f\xac\xa5\x8c\x12\x40" + - "\xc3\xee\x22\x60\x4c\x55\x87\xff\x07\xe9\xc9\xff\x20\x39\x09\x3a\x9b\x47\xba\x2c\x1f\xa9\xa2\xb2\xad\xae\x66\x9c" + - "\x48\x23\x54\x75\x27\xc9\xf9\xdb\x41\x0f\xcd\x81\xec\xf5\x61\x7c\x9d\xef\x68\xa8\xff\x4b\xc4\x08\x77\xda\x61\x0f" + - "\x51\x52\x53\xb4\xcc\xff\x5f\x41\x99\xd0\xd3\xae\x9f\x32\x8d\x10\xbd\xef\xdf\x83\xea\x10\x9c\x47\x82\x3f\x0a\x13" + - "\x96\x9e\x58\x16\xff\x65\xec\x38\xc9\x91\x1d\x07\x7d\x51\x2e\x32\x67\xa8\xfb\x94\xd2\x86\x26\xbc\x86\xf2\x19\x44" + - "\xbb\x34\xa3\xc7\xb4\xf5\x5f\x23\x58\xc5\x46\x82\x25\x26\x2e\x22\x58\x48\xaf\x8a\x94\x5e\x85\xb9\x1c\xca\x69\xed" + - "\x63\x8b\x3e\x31\x0d\xea\xe6\x79\x04\xbf\x5d\xc4\x4c\x2c\xaa\xbc\x38\x2f\xf2\xb5\x2e\xf1\x58\x82\x30\x48\xe7\xcd" + - "\x5f\x38\x3f\x88\x44\xea\x32\x7b\xf4\x96\x35\xe5\xdc\xdf\xab\x89\xcf\xfd\x96\xff\xd4\x9b\x65\xee\xa4\xa7\x11\xad" + - "\xf0\x7b\x38\x54\x74\x04\x04\xf6\x38\x51\xd4\x83\x83\x8b\x32\x80\x19\xe0\x3f\x3b\x2d\xce\x4d\x35\x52\x76\xa5\x67" + - "\x46\x59\xb3\xd2\x0d\x40\x44\x95\x05\xc7\xe0\x11\x66\x88\x29\xe7\x4e\x42\xa5\x75\x8a\xae\x0f\x11\x2d\xe3\x4a\x45" + - "\xbb\x49\x14\xf4\x07\x2b\xc6\xd1\xc0\x8f\xc2\xde\xec\xfb\x62\x3b\x32\xa4\xb8\x8b\x01\x57\xe5\x62\x51\x97\x46\x2c" + - "\x08\x6e\x02\x99\x7e\x8d\xd7\x36\x32\x7d\xd3\x75\xbe\x21\xe3\xae\x48\x4e\x29\x87\x29\x26\x12\xe1\x08\xc3\xcb\x62" + - "\xae\xac\xe1\xe9\x0a\xf1\x15\x56\x44\x08\xfe\xf6\x9b\x2f\xfe\xdb\x6f\x59\xf7\x12\xee\x81\x41\x41\x94\x5a\x9f\x02" + - "\x7e\x01\x69\x10\xc3\x58\x43\x8a\x96\x06\x01\x7b\x4d\xae\x32\x50\xd2\x67\x01\xf0\xaa\x5d\x78\x7f\x53\xa8\x4c\x4c" + - "\x18\xd4\x31\x28\x18\x0a\xf7\x42\x5b\x05\x08\x0f\xae\x18\x42\xc0\x59\x7d\x6e\x72\x55\xb4\xc3\xb1\xaf\xef\xad\x87" + - "\xa5\x39\x01\x3b\x0b\x78\x29\x5c\x2c\x74\x6b\xce\x4d\x43\xd9\x51\x30\xc7\x4f\x79\x45\xdf\x0f\xc0\xe9\xe7\x0a\x40" + - "\xc2\x05\x14\xd7\x5c\x97\xa5\xaf\x81\x01\x72\x64\xd6\x47\xcc\xa0\x0e\x8e\xf2\xae\x5e\x98\xf3\x9c\x7a\x92\xcc\xde" + - "\x41\x3a\x9d\x11\x6a\x30\xc5\x46\x62\x02\xab\xfe\xf8\xcd\x78\x75\xf0\xb4\xf1\xd5\x92\xc4\xf3\x6c\xdf\xdb\xe2\x63" + - "\x10\xc5\x2c\x13\xa4\x5a\x87\x09\xa5\x0e\xe2\x25\xea\x4b\xe1\x3d\xda\x61\x18\x3b\xec\x62\xc2\x3a\xc5\x8c\x93\xdf" + - "\xa7\x47\xc5\x71\x1f\x63\x83\x6d\x72\x81\x84\x83\x09\x0c\x8c\xe0\x5f\x86\x81\x5b\x90\x5b\x3f\xe6\x12\x98\xac\x36" + - "\x6b\xf3\x74\xd3\xe5\xe8\xed\x9f\x37\x7d\x8a\x02\x2a\x74\xa0\x26\x1f\x9a\xdb\x34\x04\xe7\xba\xbc\x95\xcb\x17\xce" + - "\x3e\x2a\xdc\x4b\x38\x97\x92\xa9\xdc\x8b\x12\xf2\xde\xef\x30\xf9\xd1\x84\xc6\x0a\xba\x44\x71\x7a\xae\x4b\xd2\x9b" + - "\xa2\x66\xcd\x4d\xb8\x34\x16\x25\xef\x59\x3d\x97\x6a\x51\x62\x9e\xf0\x5f\xd0\x59\x66\x30\x17\xd9\x2d\x2e\x1c\x89" + - "\xed\x24\x49\xdd\x9e\x5a\x42\xe3\x95\x45\xce\x03\x1d\x16\xc4\xb5\x78\x18\x28\x20\x59\x94\x96\xb5\x6d\x41\xc7\x5e" + - "\x57\x7c\x6c\x67\xda\x7a\x3e\xb4\x31\x6d\xd8\x65\x58\xf9\x48\x65\x59\x60\x92\x43\x4d\xf0\x19\xe5\xe8\xf4\x89\x6f" + - "\xaa\x75\x59\x22\x12\x83\x23\x76\x88\x18\x11\xaa\x0e\xde\x14\x78\xb4\xfd\x48\xe3\x84\x48\x11\x23\xe3\x37\x89\x8c" + - "\x8d\xef\x30\x34\x4f\xef\xe2\x1f\x04\x3b\x43\xa6\xe5\x38\xd1\x2e\xe6\x26\xa6\x03\x79\x3f\xf2\x90\x90\xbd\xf2\x3d" + - "\xa5\x74\xec\xbe\x73\xbe\x30\x1a\xad\xbb\x62\x5c\x31\x4a\x98\x09\xb7\x92\x83\x61\x7f\xd6\x4e\x51\x49\x27\x04\xed" + - "\x7d\x63\x74\x2b\x26\xba\xa0\x1c\xb4\x59\xf6\x94\xf3\xc2\xd2\xc4\x03\x38\x22\x2e\x72\xe8\x33\x54\x9d\x7a\x32\x61" + - "\x7b\x59\xd6\xe7\xb2\x14\xb8\xdd\x18\x06\x24\xfa\x78\x67\xd3\xd7\x3d\x48\xb2\x92\x01\xc1\x86\x25\x6a\xd4\xb9\x2e" + - "\x47\x9b\x28\x48\x62\x9d\x4f\xb7\x53\x70\x65\xe2\xf3\x93\x04\xf0\x6d\x24\x0d\xa8\x37\xdd\x4c\x1a\xfc\xf6\xb8\x8d" + - "\x34\x20\x03\x60\x4d\x4b\xae\x46\x36\x1c\xf2\x11\x5c\x9e\xfe\xe6\x44\xd7\x23\x86\xbb\x08\x6b\x83\x29\x58\xc0\xf8" + - "\x34\x88\x4d\x34\x70\xbf\x25\x49\xb0\x47\x38\x57\x9e\xb0\xc0\xf2\xf4\xd0\x15\xe8\x7c\xc7\xe1\xa1\x37\xd9\x7f\xd7" + - "\xaa\xc8\x73\x40\xb6\x11\xb4\x21\x7c\x92\xa1\x24\x78\x70\x6c\x72\xdd\xf2\x3d\xef\xf8\x9d\xa5\xe6\x69\xd8\x27\x82" + - "\x04\x09\x83\xc7\xfe\xde\xee\xfe\xfe\x8e\x90\x62\x57\x08\x5e\x67\x2e\x5b\xd5\x2e\x9a\xfa\xc2\x2a\x73\x39\x33\xe4" + - "\x73\x3d\x78\xb0\xff\xe5\x57\x5f\x7f\x35\x52\x0f\xf6\xbf\xfc\xfa\xc9\xd7\x43\x96\xea\xa5\xa4\xca\x3f\xcc\x65\x1b" + - "\x7c\x18\xe5\xa4\x09\x9f\xfc\x3f\x33\x13\x4e\xaa\xc4\xde\xb1\x1c\xc1\x9e\xe0\x44\xda\x23\x44\xc8\x80\x0f\x40\xbe" + - "\x18\xc2\xb0\xe1\xbf\xaf\xbc\xa9\x55\x88\x44\x50\x72\x17\x00\xb4\xaf\xaf\x7d\x5c\xa5\x97\x6c\x28\xb3\xf5\x01\xb8" + - "\x75\x1e\xe2\x34\x07\xc4\x48\x48\xa3\xe9\x5f\xe2\xc7\x3b\x00\x0b\xce\x88\x93\x02\xf0\x96\x78\x21\xdf\x84\x5f\x2e" + - "\xa8\x84\xd7\x6b\x4b\xd6\x25\xa2\x84\xdd\x6a\x7d\x5f\xd7\x2b\x58\xa6\xf5\xe9\xc2\x23\x2b\x7a\x73\x52\x00\x46\x4b" + - "\x34\x52\x4b\x7d\x99\x68\xa4\x68\x2e\xd1\x0d\xdf\x7d\xc4\x7a\xa9\xb0\x33\xc0\x5d\x49\xe5\xb5\x81\xb8\x75\xca\xc5" + - "\xe9\xdb\x42\x97\xa4\x79\xdd\x2c\xd1\xd7\x49\x0d\x1e\x3c\x7e\xf2\x64\x7f\x28\x45\xaa\x01\xef\x2e\xff\x95\x9b\x60" + - "\x98\x76\x06\x22\xf0\x1e\x59\xd0\xe4\x0b\x30\x77\x07\x5c\x1d\x58\x6d\x9f\x22\xc6\x3b\xe8\x3b\xb9\xa0\x52\x5a\x3c" + - "\x20\xeb\x9c\xaf\x6b\xa0\xfa\x5c\xf7\x0f\xc1\x75\x1f\x20\x6c\xf9\x11\xaf\x53\xe4\x4a\x3c\x80\x8c\x32\x50\x80\xe9" + - "\x04\xd1\x7f\xd1\xdd\x81\xaf\x4c\xd8\xd3\x7c\xbd\xc2\x20\x1e\x9c\xcc\x3a\xe5\x47\x10\x48\x02\x5d\x47\xa7\xb3\xe0" + - "\x49\x8b\x13\xf2\x77\x83\x31\x10\x84\xbc\x33\x23\x9a\xed\xd6\x36\x84\x46\x70\xf9\xf3\x48\xb9\xcd\xcd\xf1\xcd\xf9" + - "\x34\xaa\xf8\x17\xce\xcb\x57\x19\x48\x97\xae\xb4\xbb\x6f\xa0\x62\xb7\xfd\x28\xb6\x82\x3f\x40\xc4\xa4\x2a\x52\x30" + - "\xf5\x39\x7e\x49\x0d\x19\xc6\x92\x94\x6d\xb1\xfb\x8e\x02\x35\x3c\x5a\x1f\x36\x16\x75\x9b\x03\xea\x12\x87\xb4\x9b" + - "\x2e\x63\xe7\xdb\x64\x4c\x49\xce\xd5\xfb\x29\xee\x82\x84\x69\x56\xd4\xd5\x3b\xc7\x52\xff\x19\xf2\xe2\xe9\x80\xbf" + - "\x7d\xcf\x4c\x0c\xf7\x2e\xcf\x78\x7c\xfa\x3b\x5a\x8d\x62\x77\xf7\x13\xce\xa2\x38\x49\xe9\x41\x0a\xcc\x5d\x45\x9d" + - "\xa0\x12\x44\x38\xa9\xb7\x28\xd9\x44\x1a\x0c\x3f\xfc\x18\xf2\xb4\x33\xd5\x4e\x82\xad\x9b\x99\x93\x83\xeb\x0b\x4b" + - "\xdc\xd1\x89\x01\xa8\xf4\x59\x5d\x59\xf4\x18\x2e\xaf\xd0\x85\xae\xaa\xab\x5d\xd0\xe9\x84\x44\xc9\xe8\xbb\x28\xa4" + - "\x80\xfb\xa1\xe9\xd0\x9f\x2e\xb5\x56\x07\x8a\xcd\xf7\x09\x90\x68\xb4\xec\xdb\x7d\x96\xfd\x9f\x74\x5e\xd4\x16\x9c" + - "\x49\x38\x5c\x0a\x5d\x68\x5b\xd3\x4c\x2c\xf9\x8b\x25\x51\xe6\xe8\x1b\x3a\x12\x41\x5b\x6a\xa3\xe5\x38\x66\x71\xc0" + - "\x58\xfc\x07\xde\x6e\x77\xee\xbd\x4f\x4a\x14\x10\x12\x87\xa2\xfe\xd6\xf5\xa8\x77\xb5\xe9\x8c\xbb\x52\x74\xbe\x43" + - "\x7b\x28\xcc\xa6\xd3\xe4\x63\x54\xef\xa7\xe1\x60\x71\xb0\x6a\x3a\xc4\x31\x26\xe3\xde\x70\x59\x4b\xe6\xe2\x17\x73" + - "\x72\x56\xb4\xfc\x38\xcb\x30\x3d\xb6\x1b\x8f\xc9\x41\x83\x6f\x74\xae\xea\x39\x06\xa8\x15\x73\xa5\xfd\x46\x71\x84" + - "\x28\x06\x17\x93\x6e\x23\x11\x69\x26\x26\x48\x50\xe5\x43\xac\x70\x9a\x7a\xbe\xde\xf4\x49\xe7\x60\x58\x10\xe1\x20" + - "\xe8\xec\xe1\xfd\x41\x77\x11\x3d\xa5\x9a\x95\x6b\x0b\x94\x35\x75\x77\x50\x83\xec\xa4\x5c\xbb\x8b\x6f\xb6\xb6\xf8" + - "\xdf\xa2\xc2\x7f\xeb\x75\xab\xca\x5a\xe7\xee\x3e\x2c\x7e\x37\x0a\xd3\xf1\xab\x75\x05\x0f\x67\x65\x31\x3b\x53\xf9" + - "\x49\x89\x7f\x64\x6a\x07\x9c\x23\xea\xb5\x35\x79\x7d\x51\x29\xf8\x6b\xbd\xc2\x7f\x41\x9b\x05\x7f\x41\xba\x26\xfc" + - "\x6b\xdd\xe2\x1f\xa6\x6a\xf9\x59\x69\xdc\x69\xa4\xba\x28\xa1\x1c\x85\xe5\xd9\xf5\xc9\xb2\x68\xd5\x99\xb9\x82\xea" + - "\xcf\xcc\x15\x18\x91\xdc\x1f\xeb\x95\x32\x4d\x53\x37\x0a\x5c\x26\x2e\xdb\xa5\xa9\xd6\xd9\x50\x20\x79\x6e\x74\x2a" + - "\xc5\x38\x35\x0a\xf2\x32\xe7\xa6\x6a\xd5\x49\x01\xae\xe3\x77\xc6\xd7\xe7\xba\xd5\x02\x5c\xd2\xbb\x19\x76\xdd\x07" + - "\xf7\x24\xca\x57\x70\x52\xc4\x40\x04\x51\x8d\x00\x4d\x68\x9b\xe2\xf4\xd4\x34\xd2\xd5\xbc\x1b\x77\x1f\x6b\x5e\x16" + - "\x6e\x66\xe5\x99\x9d\x57\x6f\xcf\x4d\xe3\xea\x7e\xbb\x6e\xfb\x5c\x13\xc3\xe4\x73\x61\x35\x1c\x87\x65\x18\xd0\x97" + - "\xd7\xd7\xfe\xad\xd0\xa8\xb9\x69\x4a\x11\x72\xec\x68\xd3\xac\xf8\xa1\x53\xb1\x74\xec\x1e\x7a\x67\x5d\x6d\xa8\x78" + - "\x43\x95\xf3\x79\x52\xa7\xac\x6d\xfb\x1e\x38\x5a\x9e\x26\x90\x7c\xac\xd2\x1b\xfd\xc9\x4e\x87\xef\x7a\x3b\xfe\x49" + - "\x4d\x85\x46\x26\x13\x85\xcb\x8b\x7a\xfc\xa1\x02\xf6\x36\xf9\x40\x1d\xb9\x4f\x8e\x11\x8b\x77\xd3\x0e\x43\xf5\xe1" + - "\xa1\x98\x91\x50\x4b\xf6\xe8\x51\x16\xac\x46\x72\xba\xbc\x62\xf3\xfa\x1a\x4a\x89\xf1\x08\x12\x83\xd1\x91\xd5\xcc" + - "\xf4\xa1\x2f\x80\x66\x10\x82\xc3\xd5\x81\x1a\x4c\x3e\x1c\x4e\x02\x65\x92\x74\x34\x8a\x05\x76\xbc\x5a\xdd\x9c\xe9" + - "\xa6\x5e\x57\xb9\x9a\xeb\xa2\x84\xe0\x58\x56\x54\xec\xce\xb4\x45\xed\x06\x86\x6e\xfa\xdd\xbe\xd2\x8d\x35\xff\x78" + - "\xf7\xf6\x87\xce\x29\xa4\x19\xa5\xe9\x71\x45\xb0\x30\xbd\xf5\xa1\x4d\x22\x76\xfe\x79\x53\x5b\xbb\x4b\x8c\x80\xba" + - "\x5c\x96\xca\x7d\x01\xc7\x5e\x36\xf7\xeb\x9b\xef\x37\xb5\xe6\xc6\x7e\xb9\x2c\x47\xaa\x5d\xae\xc2\x4d\x04\x05\x82" + - "\xeb\x01\xfc\xec\x43\xb5\x4b\xbc\xd1\x6e\x3a\x41\xd5\xaf\x5f\x7e\xb3\x7d\x6f\xab\x6d\xae\xc8\x43\x11\xb2\x57\x54" + - "\xe6\x42\xbd\x78\xfb\xe6\x47\xd7\xb5\x86\xc2\xe6\xd0\x75\xb5\x5d\xae\xb0\xc7\xaf\x9a\x7a\xf9\x0e\xda\x62\x0a\x95" + - "\x39\x8a\x38\xb9\x5c\x96\x24\x67\xdf\xa8\x19\xe4\x19\x19\x28\x7f\x95\x63\x1d\x71\xd6\xef\xed\x00\x4b\xe1\x5e\x5f" + - "\x5f\xbb\xd1\xba\x9b\x8b\x02\x75\xed\xb7\x57\xef\xf5\x29\x8a\x01\x19\x34\xdd\x00\x0d\xee\x66\x48\xe5\xdb\xc6\xbd" + - "\x1d\xa8\xec\x75\x05\x89\x84\xd5\xaf\x6f\xbe\x9f\x82\xb6\x1b\x27\x95\x61\x2d\x68\x66\x2e\x97\xa5\x58\xb1\x73\xdd" + - "\x10\x3a\x02\x05\x0d\xab\xb2\x9e\x71\xb4\x88\xfe\xa8\x2f\xbf\xaf\x67\x3f\xea\xa6\x05\xde\x96\x7e\x33\x46\xb7\xab" + - "\x73\xa1\x01\x5b\x6a\xf2\x60\xfc\xe8\xb3\x89\x2b\xd3\xb4\xe0\xf5\x36\x38\x3a\x7c\x78\x3c\xfc\xed\xe0\xe8\x3f\x1f" + - "\x1e\x3f\xc2\x17\x0b\xa3\x73\xc4\x21\x99\xfc\xe7\x60\xfc\xe8\x70\x38\x3d\x52\x1f\xda\xe3\x47\x83\xa3\xff\xfc\xd0" + - "\x7c\xa8\x8e\x1f\x0d\x3f\x9b\x2c\x4f\x09\xac\xe1\xc1\x5f\xbe\x7a\xf2\xc5\x48\x3d\xf8\x7a\xff\xf1\x13\xf8\xe7\xc9" + - "\xe3\x29\x74\xad\x54\xab\xa6\x6e\xeb\x59\x5d\xaa\xdc\xb4\x98\xf2\xd9\xd5\x0e\xef\x7e\xe4\x57\xe4\xfd\xae\x4f\xea" + - "\x75\x7b\xad\x57\x2b\xf7\xff\x5d\xdb\xd6\x8d\x3e\x35\xd7\xe3\x9d\x5d\xa0\xee\xee\xda\xbe\x9e\x17\xa5\xb9\x6e\x8c" + - "\xbd\xbe\x28\xf2\x53\xd3\x0e\xa7\x34\x8c\xaa\x7e\x8e\x5e\x82\x5c\xd7\xdf\x5f\xbe\xbf\xfe\xee\xe5\xb3\x17\x43\x2a" + - "\xb0\x92\x6d\x7d\x98\x7c\x98\xe0\xe3\x75\x43\xad\x1f\x7d\xb8\x18\xef\xec\x1e\xef\x4c\x87\x83\xc3\xa9\x7b\x3f\x38" + - "\x9c\x1e\xfd\xe7\x87\xc9\xe1\x83\xe3\x47\xff\xef\xf5\x70\x80\x7f\x4f\x8f\x1f\xb9\xf7\xd3\xc1\x87\x7c\x67\x78\x3d" + - "\xbc\x1e\x4e\x70\x62\x27\x8f\x54\xc0\x6c\xde\xbe\xb7\xa5\x1e\xa9\xfd\xa1\x7a\xbf\x30\x57\x20\xdf\xae\xad\x99\xaf" + - "\x4b\xcc\xab\xda\x36\x75\xbe\x9e\x19\x86\xeb\x71\x8b\xfe\x1e\x28\x1c\x7a\x7f\x7c\xd4\x97\x93\x8f\xb6\xae\x56\xe3" + - "\x8f\xde\x5f\xd5\x5c\xea\xe5\xaa\x84\x80\x7f\xf5\x48\x3d\x86\x8a\x2d\x26\x69\xc0\x0c\xc0\x53\x7c\xa3\x94\xda\x55" + - "\xdf\xbe\x7c\xf5\xf6\xa7\x97\x4a\xdb\x33\xc0\x69\x72\x35\xa8\xb6\xd1\x95\x75\xe7\x49\x94\x7b\xf6\xea\xfd\xcb\x9f" + - "\x30\x37\xbd\xb2\xa6\x29\x74\x59\xfc\x8e\xf8\x99\x03\x3b\x86\xad\x08\xa9\xcd\x82\x45\x0b\xa0\xd6\x67\xc6\xda\x17" + - "\xf4\xd2\xc9\x18\xd4\xa7\x2f\x86\x8e\xfd\x80\x87\x0b\xe3\xc7\x84\xef\xbe\x1c\x62\x02\x26\x77\xd8\x74\x59\x2a\x7b" + - "\xb5\x3c\xa9\x4b\xc0\x20\x27\x97\x5b\xc7\x29\x61\xd9\x27\x43\x65\x2e\xcd\x6c\x0d\xfd\x00\x1c\x3c\x44\x40\xc1\x1c" + - "\xdf\x3c\x0a\xdf\x00\x88\x03\xef\xbf\x7b\xf9\x83\xe2\xfc\x90\x0a\x78\xa2\xb6\x86\xea\x8b\xb9\x42\x37\x0d\xa8\x7c" + - "\x22\xd1\xbd\x2d\x67\xd4\xc6\xc5\x7b\xcf\x55\x5b\x66\x7b\xc2\x2a\x6e\x1c\xd8\xe3\x3f\x31\xb0\x2f\x86\x74\xcf\xfc" + - "\xd9\x81\x9d\xd6\x9b\x47\xd3\x86\x5e\x8b\xd1\x70\x10\x0e\xc5\x0f\xec\xae\x9a\xba\xac\x4f\xd5\x6c\xa1\x1b\x65\xcd" + - "\x3f\xd7\xc6\x5d\x62\x83\x07\xfb\x7b\x7b\xdf\x7c\x3d\x7c\xaa\x96\x80\x0a\xb1\x5a\x19\x6d\x8d\x02\xb8\x14\xc8\xc8" + - "\x76\xae\x73\x13\x1c\x94\x90\xbe\x94\x25\xee\xd4\x03\x95\x3d\x9a\x64\x9c\x43\x3e\x7b\x94\x79\x29\xed\xc1\xd7\xfb" + - "\x5f\x7c\x3d\x52\xaf\x5f\xaa\xa5\xbe\x42\xad\x23\x6e\x60\xd2\x3b\x52\x34\x38\x44\xa0\xc0\x25\x33\x99\x28\xad\xe6" + - "\x85\x29\x73\x8c\xfe\xb9\x28\xaa\xbc\xbe\x18\x33\x55\x03\xf7\x1b\xc6\x47\xc8\xeb\xa5\x2e\x2a\x30\x26\x03\x16\x11" + - "\xc8\xa0\x7c\x33\x48\x62\xa7\x0e\x3c\x59\x04\x97\x72\x47\x40\x71\x99\x02\xad\x9f\x4c\xd4\xcf\x16\x0d\xcb\xe0\x75" + - "\x1e\x22\x2c\x6a\x00\x7a\x78\xc6\xc6\x6b\xca\x2f\x5b\xb8\x59\x7b\xfd\x12\xd7\x6e\x59\xe7\xc5\xfc\x4a\x15\x2d\xba" + - "\x20\x84\x2e\x76\xa9\xb1\xcf\xd6\xb3\x09\xe5\x41\xd3\x75\x24\xcb\xa3\x23\x3c\x59\x12\xd2\x9a\x3a\x05\xd9\x79\x1b" + - "\xbc\xdd\x4f\xa3\x5b\xc1\xd1\x9b\x1a\x32\xaf\xd8\xed\x7b\xf2\x7e\x50\x07\xca\xd1\x3e\xca\x71\x1b\x55\x19\x2b\xf5" + - "\xa5\xf7\x06\x61\xed\xa8\x6c\x56\x57\xb6\x6d\xd6\x8e\x6b\xca\x80\xc4\x70\xa8\xfa\x47\x7d\xe9\xe9\x20\xec\x23\xf1" + - "\xe2\x7d\x20\x42\x3e\xe2\x4b\xe7\xf9\xfb\x3a\x50\xce\xb7\x4d\x38\x88\x03\x85\x4d\x38\xa6\x48\x88\x28\x7c\x42\x5e" + - "\x46\x9e\x75\xa8\x7f\xd0\x25\xb4\x49\xf1\x96\x96\x0e\x4e\xb8\x4b\x63\xfe\x25\xae\x05\x25\xa3\xa0\xa6\x93\x16\x9f" + - "\x9e\x36\x7b\x11\x7a\xa1\x86\x83\x9e\xe2\x28\xb1\xf7\x54\xe3\x4e\x52\x26\xad\x7c\x80\x91\x4b\xe5\x3a\x36\xf6\x70" + - "\x57\xf4\x35\x12\x2f\xdc\x5d\x7e\x38\x9b\xfc\xa2\x68\x16\x64\x20\x4f\xdd\xa0\xe3\x8d\x27\x4e\x84\x6b\xd8\xed\x02" + - "\x7c\xe2\xfd\x7b\x7c\xf9\xd0\xdb\x4e\x2c\xf5\x64\xe2\x2e\x4e\x48\x9f\x50\xcc\x55\xe3\xc8\x93\x25\x4c\x08\x01\x85" + - "\xeb\x3e\x3d\xda\x43\x54\xb1\x6c\x47\x58\xdc\xb6\x7a\xda\x18\x5b\x44\x18\xdb\x27\x5f\x88\x47\xde\xcf\x6e\xe0\x77" + - "\xd4\x51\x18\x8c\x13\x66\xfb\x9f\xc3\x74\x0d\x43\xea\x06\x9c\x1a\xa9\xb4\x0f\x2e\x25\x88\x2d\x44\xaa\xad\xd8\x49" + - "\xe8\x5f\x6b\x15\x95\xa6\xbe\xc9\xad\x9e\xe0\x5b\x71\xee\xe1\x58\x16\x95\x5d\xd1\x0d\x13\x42\x2a\xeb\x46\x89\x4b" + - "\xcf\x1d\x8f\x70\x6b\x88\x83\x48\xdf\xde\x79\x14\x7d\xc6\xaf\x91\x4a\xf2\x78\x8d\xd4\xc7\x7f\xfe\xfa\xdd\x4f\xfe" + - "\x04\x21\xb8\x13\xd4\x8a\xf1\x30\x6c\x2d\x32\x8e\x31\xf1\x95\x83\x47\x6e\x38\xe9\x98\x7e\xc0\x5f\x6b\x0c\x6e\x97" + - "\x74\x33\xec\x0a\xe9\x52\x21\x20\x87\xb6\xb6\x7c\xd3\xc9\xa4\x7b\xc5\x68\xa4\xfb\xb9\x65\x29\xa4\xca\xe4\xb7\x51" + - "\x98\xcc\xb7\xcd\x2b\xed\x08\xe0\x55\x64\x4e\xe7\xaf\xc5\xf4\x41\x2e\x93\xf4\xa3\xc1\xdd\xf3\x28\x62\x80\x12\x3a" + - "\x14\x55\x9e\xb8\x73\xdf\xef\x4c\xb0\x7b\xd8\x33\x1b\xb2\x92\xe3\x70\xa2\x7c\x3a\x35\x3e\xb1\x61\xff\xf7\x7d\xc9" + - "\x7b\xb3\xb3\x30\x7d\x85\x7a\x52\xdb\x09\x03\x79\xa7\xe3\xa9\xea\xf4\xfe\x40\x09\x2d\xf9\x2d\x0d\xc9\xf4\xc6\xec" + - "\x4f\x2a\xf6\xc6\xcd\xb6\x40\x4e\xf3\x1d\xef\x0c\x1c\x72\xb4\x22\x0d\x91\xf3\x07\xb9\x73\xdc\xa4\xfa\x2f\xdd\x93" + - "\xa1\x38\x8c\xcf\x3c\xaa\x03\x6a\xa5\x90\x09\xff\xa8\x2f\x83\x19\x0f\xdc\xdb\x74\xab\x5a\x7d\x66\xac\xca\xe6\xa5" + - "\x6e\x33\x6f\x16\x1b\x54\x75\x4b\x39\xd7\x73\x63\x56\x54\x0b\x20\x5a\x61\x5c\xa5\xb1\xea\xc1\x37\x5f\x7f\xfd\x17" + - "\x79\x91\x7e\xd4\x97\x2f\x39\x75\x93\x6e\x4e\x4d\x3b\x52\xb6\x99\x09\x19\xfd\xcc\x5c\x8d\xa0\x3e\x38\x86\xae\xc5" + - "\xb7\xde\x2a\x22\x6e\x69\x42\x44\xb0\x63\x59\xe2\xfa\x5a\xfd\x71\x23\x71\x26\x81\x27\xae\x44\x0b\xe4\x69\xd9\xcc" + - "\x8e\xe0\xdd\xa6\x5c\xef\x03\x25\xaa\xe5\xa2\x87\xd4\x63\x35\x05\x04\x6b\xb3\x72\xed\x0d\xe0\x0f\x47\x36\xc0\x7a" + - "\xc6\x65\x0f\x44\x1b\x12\x3a\x92\xe1\xaf\xcd\x2a\x95\xb6\xa3\x2c\x86\x3c\x35\x58\xb0\xb3\x19\xf0\xb5\x5f\xca\x47" + - "\xa4\x10\xb5\x0a\x91\x34\xac\x01\x9e\x42\xe3\x74\xf3\x6d\x35\xdd\xbe\xa7\x1e\xa9\x5d\x35\x2f\xaa\x1c\xc5\x84\xa6" + - "\x38\x5d\x08\x5e\x7e\x40\x59\x19\x1c\xdb\x8a\xe9\xfb\x28\xa2\x6d\xb7\x65\x56\xdf\x5c\x12\x9d\xe4\x8f\x86\x54\x29" + - "\x3b\x50\xf8\x14\xb6\x1e\xd1\x83\xbb\xe4\x0a\x4e\x92\x9d\x80\xdd\xfe\x89\x3b\x3d\x50\x4c\x55\x46\x62\x24\x92\x50" + - "\xcf\x5a\xc6\x8c\x06\x67\xf2\x17\xcc\x81\x20\xcc\xf4\x0b\xc9\x90\x50\xdf\xdd\xb6\xb1\x63\xfe\x81\x89\x7b\x04\x7b" + - "\x22\xce\x91\xc7\x51\x23\xbf\x7f\xbd\x6e\xeb\x58\xd0\x39\x05\xb8\x12\x31\x25\xc4\x60\x90\xbc\xb9\x7d\xcf\xf3\x14" + - "\xc9\xe1\x04\xe2\xf7\xc8\xf3\x03\x81\x66\x21\xc5\x12\x99\xdb\x66\xed\x06\xa7\x10\x40\x13\xb4\xe3\x65\xb1\x44\x8f" + - "\xa7\xeb\x6b\x9c\xa9\xf1\xa9\x69\x79\x02\xbf\x03\x55\xc8\x20\x23\x15\xc3\xae\x2b\x98\xa5\xc8\xa5\x12\x28\x0e\x1d" + - "\x5b\x73\xa3\xc1\x4d\x14\x64\x3c\xad\xce\x2a\x27\x9a\xca\x71\xf2\xb6\x9d\x79\x5a\x87\xa7\x8b\xe7\xc0\x4f\x75\x64" + - "\x69\xe2\xa7\x84\x5f\x0e\xb4\x28\x7d\x46\x71\xb6\xb3\x36\x4d\xb1\x9e\x90\x74\x09\xfe\xbe\x75\xd2\x18\x7d\xd6\xb5" + - "\xc1\x45\xa8\x85\xb5\x23\xd3\x94\x24\x12\x0c\x86\xda\xef\x28\x6f\xbb\xee\x6c\x66\x7f\x3c\xe3\xd5\x2b\xaa\x74\x37" + - "\x52\xf8\xc4\x8b\x3e\xc6\x91\x33\x66\x4b\xee\x0a\x9c\xc0\xae\xd8\xd9\xab\x38\x29\x03\x53\x6a\xbb\xd3\xd9\x69\x4c" + - "\xe8\x2a\x45\xb7\xae\xaf\x71\x63\xbb\x2a\x01\xcf\x96\x61\xe2\xbd\x92\x0e\x0b\xef\x1d\xcb\x7b\x33\xed\x78\x48\xc3" + - "\xd1\x99\x57\x6a\x36\x3a\x5a\xb2\x22\xf9\x58\x56\xe4\x17\x05\x58\xcf\x46\x7d\x74\x92\xfb\xda\x12\x16\xbc\xaa\x2b" + - "\xd3\x37\x83\xf1\xef\xeb\xeb\xf8\x48\x47\x4a\xd7\xd7\xb0\xac\x73\xd0\x47\x6b\xb9\x7a\xe8\x56\xa0\xf3\x3c\xe2\xfb" + - "\xd9\xf5\xb9\x2c\x6c\x1b\x69\x27\x20\xcb\x50\xae\xbc\xf5\x60\x33\xe9\xc2\xa9\x88\xbb\x28\x2f\x94\xf8\x8d\xbb\x53" + - "\x3a\xd7\xf3\x1f\xb1\x68\x24\xd8\xf5\xb8\xd6\x1e\x64\x0e\xda\x0e\x47\x49\xd1\xe3\xa7\x22\x9f\xf6\xe4\x91\x7a\xbe" + - "\xd0\x78\x18\xcf\x4d\x63\xe1\x3e\x44\xa9\x1f\x48\x3d\xde\x01\xc8\x58\x2f\x8c\x67\xe6\x22\xf2\xac\x9e\x95\xd6\x1d" + - "\x1c\x82\x0d\xe2\x57\xbf\xfe\xfa\x2b\xaa\x3e\x10\xf4\x61\x61\x88\xf3\xe3\x90\xa8\x3e\xca\xfe\x1c\xf7\x25\x50\x74" + - "\xae\xc7\xd3\xf6\xc2\xbe\x5b\x23\xbc\x67\xb8\xf6\x5d\xb7\x1f\x8f\x38\x0f\xc5\x08\x7e\x83\xae\x1e\x58\xd9\x73\x26" + - "\xe9\xb4\xd9\x03\x9f\x4e\xd6\x09\x26\x5e\x9c\x04\x29\xd0\x78\x46\x33\xba\x30\xe8\x69\xd2\xd6\x42\x2d\x32\x47\x1b" + - "\x24\x4d\xd8\x2d\x97\x03\x09\x6b\xc3\x00\xb6\x09\xea\x11\x25\xba\xb4\xd4\x2b\xec\x85\x07\xe9\xcb\x21\x41\x7c\x0f" + - "\x55\xd9\x0f\x3b\x02\x8f\xbe\xab\x06\x18\x15\x71\xa0\x03\xe9\x17\x67\xdc\xfd\xdd\x13\x2f\x1e\x13\x02\xa8\xed\x38" + - "\xa1\xfb\x34\xb3\x92\x56\x89\xeb\x87\x06\x45\xde\xa8\x6d\x8d\x92\x34\xaa\xe1\x5a\xc7\x22\x8a\x53\x26\x22\xdf\xa0" + - "\xc6\x58\x17\x61\xc7\xbc\xde\xaf\x60\xcf\x1c\xf9\x72\xe1\x14\xc0\x3e\x38\xba\xb5\x28\xa2\xe3\xe0\xdb\x14\x17\x71" + - "\xb5\x2a\xaf\xfc\x09\xc7\x24\xad\xee\x5c\xaf\x9a\xfa\xbc\xc8\x25\xe8\xb7\xdb\x39\xc0\x02\xfb\x0d\xf7\xf0\x21\xad" + - "\x2a\x7d\x16\xc2\xaa\xe8\x72\x38\x88\xde\x0f\xc4\xe6\x0d\xbb\x21\x8e\xdc\x82\x46\x0e\xb8\xeb\xf0\xe6\xce\xb9\xf6" + - "\x81\x8a\xf1\x04\x62\x3c\x79\x63\x3e\xb7\x18\xdb\x77\xe1\x76\xb6\xe3\x42\x6a\x37\x3e\x2e\x1e\xf4\x1b\x16\xbc\x5e" + - "\x1c\xa3\x22\xae\x5d\x6e\x5b\xf2\x1c\x48\xb2\x43\xb7\x5c\x9f\x85\x17\x2c\xaf\xbb\x9f\x05\x98\x4d\x73\xde\xdb\x14" + - "\xea\xae\x20\xd6\x90\xd2\xa1\x52\xbd\x1d\x49\x09\xaa\xb8\x4f\xfd\x78\xf8\x30\xfc\xee\x0c\x9c\x40\xce\xcc\x19\xf8" + - "\xd4\x35\x66\xd6\x86\x93\x45\x7d\x77\x7b\xfa\x40\xc9\x6d\x0e\xd5\xf1\x7d\x17\x76\xce\xf5\x75\x54\x2a\x7b\x14\xbf" + - "\x7f\x1a\x87\xff\x54\x75\x45\x57\xc9\x08\x24\x3b\xa5\xd5\x4a\x17\x8d\x74\x1a\x82\xa6\x83\x2a\x27\x9c\xd8\xc7\xca" + - "\xd3\xdb\x70\x60\xb7\x83\xf3\xd9\xeb\x39\x15\xab\xd7\xed\x6a\xdd\xda\x68\xa2\xb6\xd8\x48\x08\x45\xc8\xf7\x21\x89" + - "\xfa\x44\xa1\x7a\xb9\x42\x8a\x71\xd0\x3f\x73\xbe\x2d\x98\x0f\xd2\xe8\x73\xaf\x80\xde\xe9\xd9\xcc\xac\x5a\x70\x81" + - "\x01\x03\x2d\x7d\x75\xd7\x94\x42\xc3\x7b\x70\x16\x19\xc9\x73\x2b\x21\x47\x34\xb9\xa1\xa4\xef\xba\xe7\x01\xcf\x23" + - "\x97\x3d\xda\x6d\xb9\x71\xbb\xcc\xfc\x73\x5d\x9c\xeb\x12\x14\xfd\xa1\xd6\x50\x36\x54\x91\x66\x7b\xdc\x3c\x02\x9c" + - "\x70\xe1\x47\x9a\x68\xc0\x46\xee\xda\x32\x94\x34\x09\x90\xe5\x49\xea\x91\x14\x8e\xfe\x27\xf7\x72\x4f\x1b\xb0\x95" + - "\xfb\x7a\xe5\x8f\x19\xcf\xcb\x53\xf1\xb6\x8f\xbb\xe5\x15\x1e\x8a\x82\x37\xe1\x4f\xc1\x98\x45\x6f\x44\x50\x70\xea" + - "\x38\x87\x34\xd2\x77\x1a\x22\xc4\x20\x49\x42\x25\x67\x5d\x82\x37\xc2\x5c\xc6\x23\xda\xf6\x9e\xb8\x3f\x57\xa5\xa3" + - "\x9e\x60\x12\x46\x24\x5a\x5d\xba\x6b\x0e\xb6\xd7\xc9\xfa\xe4\xa4\x34\x23\x32\x53\xc7\x1c\xd5\x72\xfb\x5e\xb2\x94" + - "\x8e\x02\x1f\xa9\x0c\x3d\xbd\x33\xc9\x9a\x46\x54\xd8\x95\x0d\xd4\x77\x73\x64\xa3\xb7\xb8\x7f\x6a\x05\x7d\xf6\xf4" + - "\x2d\xa1\xbd\xf9\x03\x23\x5e\xa7\xb1\x91\x7c\x84\x63\x9f\xe2\x18\x0e\x95\x51\x53\x95\xfd\x50\x0b\xe6\x01\x49\xa1" + - "\x3b\x0d\xfe\x10\xb5\x75\x44\x7a\x6e\xfa\xa2\xb9\xb7\x7a\xd1\x0a\x83\xa8\x1f\xba\x63\xf1\x0a\xcb\xd0\x9b\x65\x1a" + - "\x86\xd6\x41\xc5\xf1\x3e\x46\x7c\xab\xaf\x2b\x72\x95\x56\x8b\xba\xcc\x19\x48\x12\xe3\x42\xc0\x8e\x84\x79\x91\xfe" + - "\xb9\x36\x4d\x01\x12\x09\x3e\x98\x82\x42\x1f\x2b\xf9\x5e\xdb\x76\xf7\x8d\x63\x9c\x0a\x93\x2b\x34\xba\xab\x99\x9e" + - "\x2d\x50\x9e\x82\xf4\x63\xc4\x64\x6e\xdf\xdb\x2a\xb5\x6d\xb9\xf0\x94\x58\x35\xd3\xea\xd3\xa9\x37\xff\x49\x1d\x0e" + - "\xf9\xe4\xaf\x9b\x72\xaa\x12\x67\x00\xc6\xe3\xcc\xfe\xfe\xf2\x3d\x06\xf3\x15\xd6\xbd\x2e\xa7\x2a\xb6\xcd\x93\x24" + - "\x29\x6d\x47\x74\xa6\xe0\xab\xd3\xb2\x3e\x71\x1f\xf9\x6c\x7e\xc2\x46\x2c\x9e\x6a\x7b\x55\xcd\xc4\x6f\x92\x57\xdf" + - "\x63\x1f\xf4\x6a\x55\x16\xd8\xb5\xc9\xe5\xee\xc5\xc5\xc5\xee\xbc\x6e\x96\xbb\xeb\xc6\x1d\xa6\x3a\x37\xf9\x53\xb0" + - "\x5e\x5a\xd3\x1e\xfc\xfc\xfe\xd5\xee\xd7\xd8\xe1\xc9\xa3\x6d\xca\x7a\x51\xaf\xdb\x29\xd9\x48\x70\x09\xc1\x03\x4a" + - "\x72\x9d\xe2\xd1\xda\x9a\xa6\xd2\x4b\xf9\x68\xa5\xad\xbd\xa8\x9b\x5c\x3c\x82\x15\x10\xbf\xf1\x58\x4d\x51\x77\x89" + - "\x4f\x1a\x9d\x17\x68\x75\x92\x8f\xc9\x6d\x82\x17\x67\xcb\x71\xf0\x30\x03\x70\x57\xf0\x92\x6c\x65\x8f\xb2\xa9\x62" + - "\x83\x2a\x5a\x77\x5a\x73\xd9\x4e\xc9\x4b\x65\x55\xea\xa2\xa2\x20\xcb\x45\xbb\x2c\xf9\xb9\xfb\x9b\x1e\x5f\xc2\xd3" + - "\x68\xea\xc0\x0b\x87\x9d\x5c\xb0\xd4\x47\x5b\x57\x49\x31\xf7\x88\xca\x7d\xd4\xe7\xda\xce\x9a\x62\xd5\x02\xe2\x03" + - "\x3b\x5c\xb3\x36\x81\x3b\x0b\x4d\xb9\x4a\x27\xb2\x47\xd0\x99\x89\x6c\x06\xaa\x9e\xc8\x9a\x62\x3e\x34\xaa\x2f\xf3" + - "\x62\xd0\x9b\xef\xb3\x68\x06\xf8\xc5\x7b\x73\xd9\xc6\xc3\xe0\x37\xff\x78\xf7\xf6\x87\xa8\xc7\x93\x89\x02\xaf\x84" + - "\xf8\xb6\x9b\x4c\xd4\xff\x67\xae\xac\x0f\x0d\x57\x88\xb4\xa9\x06\x4e\x3a\x61\xab\x7d\xf6\x28\x1b\x92\xd9\xd0\xb6" + - "\x45\x85\x66\x53\xf4\x39\x23\xd9\xc7\x16\xd5\x69\x69\x30\xcc\x3c\x16\x97\xa6\x9e\x9a\x0b\x66\x8f\x03\x86\x41\x3c" + - "\x36\x97\x2d\xad\x37\xfc\x9d\x4d\x15\x3a\x25\x8d\x44\x18\x1b\x04\xe8\xd4\xca\x4d\xa7\x1a\xc0\x2d\x71\xa0\xaa\x1a" + - "\xcd\x20\xee\x20\x40\x97\xf0\x4a\x81\x5d\x00\x25\x33\x7f\x9a\xb8\x9e\x97\xe7\xba\x5c\x43\x66\x5f\x57\x06\x22\xae" + - "\xdd\xb4\x09\x0c\x12\x51\x85\x7b\x93\xf9\x3c\xd3\xde\xa5\x4c\x54\x07\xce\x55\xbe\xae\xcb\x65\x29\xbe\xbe\x84\xf6" + - "\x13\x07\xb1\x64\x3d\x5e\xd5\x4d\x1c\xe8\x61\x17\xf5\xba\xcc\x29\x4f\x6e\xa4\xd8\x9e\xd2\x27\x57\xf5\x1a\xf8\x2c" + - "\x9d\xe7\xee\xef\x46\x81\xc2\x0c\xfd\x64\xb8\x2a\xc4\x81\x9a\xd3\x17\x6e\xdd\xc0\xa5\x00\x3e\x45\xd1\xd1\x31\x9e" + - "\x9d\x06\xa9\x7c\xd4\x6c\xf0\xb8\x41\xcd\x39\x4c\xb1\xd0\x4f\xf3\x76\x05\xfa\x19\xd2\x95\x92\x6f\x2d\x3e\xda\x8e" + - "\x01\xf5\xbc\x00\xeb\x66\x7f\xbe\x2e\x4b\x35\x2f\x4d\x7e\x0a\x39\x2d\x90\x26\x2b\xcc\xab\x8e\x86\x79\xd4\x37\xe3" + - "\x77\xb0\xd9\x4e\x6a\xb7\xe3\x04\x09\x87\x11\xfa\x6f\x51\x5b\x30\xf6\xda\x1a\xd2\x9b\x17\x56\xd5\xcb\xa2\x6d\x4d" + - "\x3e\x52\x17\x4d\xd1\x82\x74\xee\xf8\x53\xa9\xcf\x0f\x77\xc3\x3a\xce\x89\xcb\xd6\x02\x6e\x24\xf6\xcc\xf3\x8f\x0f" + - "\xc3\xd6\xf8\x76\x5d\xe0\x6d\xa7\xd3\x61\x41\x09\x69\x8b\xe8\xb3\x4b\xf4\x58\x1b\x20\x03\x5a\xe8\xc0\x54\xec\x6a" + - "\xf8\x18\x1a\x13\xe5\x3b\xed\xf4\xd4\xc9\xda\xfe\xc8\x0d\x36\xf2\x50\x98\xde\xee\x7f\x20\xec\xa6\x43\xf6\xa7\xf3" + - "\xef\xef\xf8\x56\xda\x30\xfd\xd6\x78\xa3\x8b\x4a\x2d\x4d\xbb\xa8\x73\xaa\x4e\x2e\xc4\xba\x29\xbd\x75\x35\x12\x5d" + - "\x5f\xcf\xdd\x3b\x70\xc7\xaa\x68\x9e\x47\xca\x16\xcb\x75\xe9\xb6\xfb\xaa\x31\xbb\xfb\xe3\x27\x0a\x52\x17\xb5\xeb" + - "\xc6\x6c\x27\xde\x0b\xe0\xe2\x26\x33\xfa\x33\x73\x16\xa2\x62\xd6\x0d\xc5\x42\xa2\x3b\x5c\x27\x63\x70\x38\xd2\xb3" + - "\x90\xb5\x05\x2d\x54\xbe\x4b\xdb\xf7\x64\x8d\x75\xd7\x72\x84\xc0\x31\x3c\x2f\x23\x5e\xe0\x9f\x7f\xfa\x1e\xf6\x7e" + - "\xbd\x76\xa4\xb3\x2d\x76\x91\xf9\x01\xc7\x34\x3c\x6f\xee\xf7\xcf\x3f\x7d\xef\xbf\x60\xb5\x3c\x71\x4b\x36\x52\x34" + - "\xa0\xae\xde\x7a\x2a\xdb\x7d\xe5\xeb\xe1\x74\x45\x18\xc6\x8d\x37\x10\x3e\x7a\xef\xd3\xb2\x6d\x79\x1f\x59\xf2\x3e" + - "\xf2\x5e\x8c\xea\x5c\x53\xd3\x2b\x76\xb8\x24\x78\x0f\xd0\xf4\x3b\xe9\x06\x99\x23\x74\xa7\x47\xee\x9e\xac\x7a\x85" + - "\x5d\xb9\xeb\x87\xfc\x1c\xe6\x45\x63\xfe\x0e\x45\x43\x2d\x10\x0e\x78\xae\x9b\x42\x9f\x50\xd7\x0a\xd1\x1f\xa0\x73" + - "\x8e\xd5\x04\xc5\xa5\x9f\x6c\x71\x06\xbb\x56\xbd\xf5\x0a\x13\x8d\xfb\x1d\x16\xea\xe3\x04\xb4\x1c\x36\x40\xd3\x8e" + - "\x4f\x9f\xe3\xb3\x60\xee\xb9\x04\x4f\xf8\xd0\x55\x2e\xe0\xd8\xd5\x78\xc4\x85\x55\x69\x2d\xc5\x5c\x15\x2d\x7a\x16" + - "\xbe\x78\xfb\x06\xd0\x6c\x95\xf7\x1f\x52\xb3\xba\x2c\xbd\x8f\x28\x33\x97\x2f\x5d\x65\x7d\xbd\x00\x00\xac\xa4\x81" + - "\x10\xba\x7e\x7d\xdd\x79\x87\xf9\xbb\xd4\x90\xa3\x33\x39\x9c\x2e\xed\xa4\x0f\xf2\x67\xc6\xdf\xf5\xc0\x8f\xf7\x85" + - "\x99\x9b\xa6\x31\x39\x2e\x7e\x4e\xbf\xc2\x7c\xf3\xfb\xc1\x90\xef\x0b\x4c\xf4\xfb\xa2\x53\xd2\x4f\xfc\x20\x03\xcf" + - "\xf2\xa5\x59\xd6\xcd\x55\x16\x56\xe6\x5d\xab\xdb\xb5\xdd\xcd\xc1\x41\xc6\x89\x3a\x3e\x57\x30\x2e\x32\xbc\x7e\xee" + - "\xe6\xd0\xcd\x8b\xf8\x09\xc7\xce\x57\x43\x1b\x5f\x0d\x5a\x76\x48\xb5\x00\x2c\x0c\x79\x50\x54\xed\x05\x56\x92\x33" + - "\xbe\xf3\x9e\xbf\x5c\x47\xfc\x82\xf1\x7e\x44\x0b\xef\xbd\xf2\x1a\xa4\x2a\xdf\x3b\x13\x9c\x97\x44\x4a\x37\x7d\x52" + - "\x37\xad\x5a\x1a\x6b\xf5\x29\x97\x6d\x9e\x9d\xa0\xaf\x44\x36\xd3\xd5\xcc\x94\x26\xcf\xfc\x77\xaf\xf4\x99\x51\x97" + - "\x0b\x54\x1e\x61\x33\x07\xc1\x37\x40\xe7\x57\xef\x50\x94\xdb\x1b\x09\x49\x1d\x2e\x29\xcb\x34\x42\x2d\xb4\x5d\x00" + - "\x7c\x68\x64\xa9\xc0\x80\xe5\xd8\xce\x27\x69\xf2\x99\xb9\x12\xb2\xac\x23\x60\xe0\x56\x15\x45\xf0\xd1\x38\x23\x70" + - "\x65\xaf\xe3\x4a\x68\x4f\x22\x18\xc7\xef\x0e\x90\x54\xd2\x5b\xef\x46\x05\x2d\xaa\x03\xc5\x1e\xd9\xe4\xb3\xd7\x4b" + - "\xf0\xd4\x70\x18\x2b\x4d\x92\x52\x47\xd8\xff\xa3\xfd\xe3\x1e\x65\x37\xbe\x52\x8f\xa5\x5e\xa5\xa3\x13\xd9\xf2\xdd" + - "\x49\x6b\x3e\x33\x57\x3d\x80\x00\xd1\xc7\xc4\x53\x50\x15\x3e\xca\x8b\x22\xaf\xe5\xd4\xde\xc8\xa5\xfc\x49\x5f\x48" + - "\xf4\x06\xb7\x64\xcf\xca\x32\x5e\x35\x89\x68\xd3\x01\x49\x90\x4b\x74\xb8\x61\xe6\xa6\x01\x12\x37\x69\xfe\xb9\xbb" + - "\x80\xd0\x74\x83\x4b\x80\x6f\xac\xdb\x38\xe2\x5c\xdc\x81\xbe\x4e\xfb\xa7\xbc\x23\xf9\x8f\x4f\x7c\x01\x5d\x16\x6b" + - "\x49\xdf\xf5\x1c\xc5\x23\xaa\xf4\xf8\xae\xd7\x11\xac\x76\xe7\x58\xa7\x58\xd5\x1b\x16\x8f\xb1\xe3\xd2\x59\x7a\x7b" + - "\x6e\x9a\xa6\xc8\x85\xb3\x44\x6c\xd3\x97\x53\x57\x53\xd9\x37\x64\x75\xdf\x94\x61\x7c\xf3\x6c\x08\x8b\x7d\x64\x6b" + - "\xfd\xd4\xde\xde\x41\x59\x05\x69\x95\x7d\x5b\xea\x55\xb2\x9c\x33\x0f\xd6\x4c\x5d\x8d\x8b\x48\x0a\xf1\xd7\x98\x3e" + - "\x78\x7d\x77\x0e\xc6\xe9\xe4\x3b\x64\x02\xf4\xef\x57\xbb\x6c\x75\xad\xcc\x45\x48\x40\x0b\x41\xf2\x17\xe0\x62\xad" + - "\x5b\xc7\x02\x5a\xd3\x9c\x1b\x0b\xd9\x02\xeb\xca\x08\x5d\x6f\x18\xc8\x11\xb6\xe5\xd6\xf7\x48\x75\x1f\x8f\x5c\x17" + - "\x7c\x99\x5e\x12\x90\xa8\x08\x91\x3d\x37\xb3\x35\x31\x23\x7a\xb5\x6a\xea\x55\x03\x4a\xdf\x64\x3a\x99\x6e\x8f\x75" + - "\x79\xa1\xaf\xec\x00\xdb\xc2\x47\xd8\x95\x48\x4b\x7b\xf3\xe7\x16\xf3\x39\xdc\x18\xd2\x1e\x8b\xaf\xe0\x9e\x89\xa2" + - "\xd0\xa0\xa9\xf7\x78\xc7\xcb\x65\x04\x3e\xea\x3d\x31\x18\xa1\x90\xe3\x73\xe8\x66\x8a\x16\xb9\xed\xfa\xa8\x6d\x05" + - "\x6f\xfc\x31\xb4\x3b\x10\x95\xa6\x51\xef\x5b\x79\x5d\x99\x81\xda\x1b\xf5\x95\xe9\x19\x2c\xfc\x73\x13\x92\x07\x3c" + - "\x43\x38\xfd\x5c\x72\x22\xfc\x63\xbc\x6a\xea\x65\x61\xcd\x80\xfd\x08\xc7\xcc\x80\x80\xf2\x36\xe6\x45\xc6\x3a\x47" + - "\x26\x9f\x96\x82\xac\x79\x07\xb4\x34\xae\x9b\xe2\x35\xc6\x96\xf2\xcb\xb9\x2e\xca\xd0\x25\x72\xee\x81\x00\xa3\xd9" + - "\x42\x37\x7a\x06\xea\xf1\x07\x7f\x79\xf2\xc5\xfe\x14\xa5\x58\xa4\xb3\xae\x7b\xb5\xd7\x68\xb8\xc1\xe4\x79\x08\x12" + - "\x22\x75\x3a\x9b\x1c\xd5\x40\x08\x61\x4b\x70\xab\x42\xef\x12\x55\xb4\xfc\x3d\x05\xad\xce\x75\x69\xaf\x50\x50\xaa" + - "\x08\x3c\x23\x96\xb8\x31\xe4\xe1\x8b\x69\x88\x71\x9f\x5d\xa1\xd4\xed\x4e\x8d\x17\x9f\xb8\xda\x5f\x8c\xd2\xa5\xad" + - "\xc1\xc1\xc2\x55\xe7\x6a\x06\xa1\xc4\x90\x59\x54\x9f\xeb\xa2\x64\xf6\xdc\x8e\x51\x74\x1a\x28\x10\xe4\xd0\x89\x84" + - "\xfe\x88\xfc\xf7\x87\x14\x86\x27\x30\x58\xdd\x9c\x8d\xe0\x21\xac\xb3\x78\xc3\xd3\x32\xea\xd1\xbf\xee\xa8\x6c\x32" + - "\xc9\xbc\x3f\x32\xe4\xb5\x2b\xb4\x25\xf9\x92\x21\x22\xda\x1a\x09\xaa\xb6\x6a\x65\x1a\xd5\x16\xb3\x33\xd3\xaa\x07" + - "\xfb\x8f\xf7\xf6\xbe\xc4\x7e\x13\x94\x27\xbb\x3f\xd2\xe7\xd7\xd7\xfe\x09\x27\x9d\x95\xef\xf0\x69\x68\xfa\xe5\x65" + - "\xeb\x56\x5c\xb8\x07\x30\x08\xa3\xb0\xf5\xa7\xe8\xcc\xc2\xf0\x8b\x7e\xda\x80\xa8\xf9\x09\x3e\xec\x6e\xae\x8e\xc5" + - "\xb8\xd5\x4c\x4a\x68\xec\x92\x51\x80\x8f\x02\xe0\xc8\xa3\x8e\x28\xb8\x2c\xf1\xbc\x4e\x17\xb5\x6d\xa7\x70\x90\x97" + - "\x85\x85\xd6\xb6\x83\xbd\x1d\x6a\x7d\x81\x95\xa6\x40\x51\xab\x6e\x10\x05\xac\x77\x1a\x3d\x81\x27\x38\xa9\x4b\xdd" + - "\xbf\x3f\xc0\xa0\x0c\x0f\x3b\x42\xbf\x71\x69\xef\x1f\x1c\xf4\x2c\xf8\xf5\x35\x97\x79\xdc\x5b\xe6\xb1\xb4\x27\xfa" + - "\xfa\xbe\xc0\x2f\xa3\xfa\x41\x1b\x00\x69\x8f\x33\x75\xa8\xb2\xaf\xf7\x32\x35\x55\xd9\x97\x5f\x7e\x81\x50\x25\xf7" + - "\x0f\x0e\x98\xa6\xa5\x8a\x7f\x5f\x5b\xb7\x7b\x77\x54\x8a\x7b\x3b\x4d\xc5\xc8\x3a\x53\x8c\x37\x9b\x47\xf9\xc6\xb5" + - "\xe0\xf9\x68\x45\xa0\x18\xb8\x1a\xc8\x50\x34\xc2\x93\xad\xe7\x5c\xa2\x37\x38\x83\xde\x1d\x08\xb5\xa5\xf6\x9b\x70" + - "\xe4\x76\x74\x50\xe8\x77\x53\x46\x82\xd9\x6f\x25\x43\xfc\xb6\xee\x70\x99\x0f\x85\x47\xca\x0a\xb7\xf9\xe0\xdd\xbd" + - "\xed\xd5\x3b\xbc\x65\x2f\xb4\x45\xe1\x08\x61\x15\x8a\x1c\x37\x2b\x55\x34\x52\x90\x86\x19\x30\x2f\xc3\xa4\xf4\x48" + - "\x1f\x9c\x16\xd3\xb5\x94\x0c\xe4\x17\x03\x1a\xd6\x79\xd1\x98\x54\x3d\x61\x55\xed\x16\x00\x34\x17\xda\x9e\x81\x0d" + - "\x72\xfb\x5e\xa4\x9e\x00\x31\x13\x3f\x0b\xfd\xff\x05\xb8\x79\x0c\x34\x74\x4c\x8a\x35\xad\xaa\xfd\x98\x42\xae\x1a" + - "\x59\xcf\xc3\x87\x5e\x3b\x01\x16\xb1\x9d\x1d\x42\x2b\xf7\x9e\x2c\x42\xf2\xf6\x20\x00\x19\xa8\x32\x5a\xdd\xb4\x59" + - "\xba\x40\x3f\xaf\x56\xe8\x1b\xe4\x53\xb9\x45\xd4\x0d\xff\x18\xb7\x35\x94\xf3\xfc\x36\x7d\xfc\xc2\x91\xf4\x65\x51" + - "\x19\x11\x83\x02\x61\x66\xc4\xc0\x62\x55\x0b\x6d\x43\x8c\xe9\xfd\x10\x71\x4a\x16\x32\x6a\x4b\x54\xfb\x4e\x13\x72" + - "\xe9\xcf\x3f\x7d\x2f\xdc\xa5\x3e\x07\x3d\xd0\x95\xf7\x0c\x75\x25\x5e\xcf\xbd\x0d\x70\xf7\x5d\x51\xcd\x58\x5f\xad" + - "\xab\x7c\x52\x37\xee\xf5\x0f\x75\x65\x76\xdf\xc0\x54\x93\x91\xb0\xd4\xee\x22\x42\x55\x09\xeb\xc8\x60\xa8\xa8\xcd" + - "\xa3\x1a\xde\xd4\x4d\x50\xd9\x81\xa6\x8b\xc3\x42\x79\x81\xb0\x17\x55\x2d\x47\x4b\x5c\xb7\x1c\xf3\x50\xda\x3a\x5e" + - "\x53\x48\x77\x61\xc3\x35\x38\xa2\x20\x18\x7c\xd3\xd6\xee\x1e\x84\xf2\xf2\xf0\x7a\x7e\x49\xf4\x98\x48\xa7\xda\x71" + - "\x7f\x62\x18\x3d\xfb\xaf\x72\xa1\xa1\x23\x29\x0f\x81\xa2\x1c\x66\x70\x87\x72\x7d\x01\x70\xfd\xc1\x37\x5f\x7d\xfd" + - "\x78\xca\x88\xb1\xf0\xd6\xd6\xc8\x20\x17\xed\xe7\x16\x68\xcb\xda\xc2\xc9\x02\x73\xbd\xdb\x5a\x6b\xf0\xd4\x6b\x1b" + - "\x82\x2c\xa2\x6c\x54\x58\x77\x07\x6f\xd0\x31\x2a\x42\x43\x59\x54\xc8\x6d\x44\xea\x04\xbe\x3a\xa0\x44\x37\x63\x9d" + - "\xe7\x13\x9a\xd6\xf6\x8c\x31\x02\xe9\x62\x74\x5b\x37\xc7\x9e\x24\x7e\xfe\xdb\xe7\x81\x0b\x01\x9d\x79\x48\x41\x4d" + - "\xdf\x72\x85\x82\x8f\x68\xed\x48\x65\x9f\xed\xff\x76\x90\xa9\x1d\x44\x31\x00\xc4\xb0\xa9\x6c\x4f\xc4\x32\xe5\x39" + - "\x1a\x51\x08\xd9\x96\xe3\x9a\xc2\x9a\xed\xfc\x89\x85\xca\xa2\x56\xbb\xa8\xab\x94\xae\xb2\xf7\x14\xdc\xb6\xff\x47" + - "\xa0\x4b\xac\x54\x31\xf7\xd6\xf3\x65\x9d\x9b\xb1\xb8\x2e\xc4\xab\x3e\xac\x1e\x69\x4c\x3f\x0a\x43\x10\x9e\x13\xc4" + - "\x15\x27\x82\xfe\x40\x65\x9d\x9e\x66\xa3\xbb\x6b\xed\xb8\x00\x33\x91\x6b\xf5\xe9\x9f\x6f\x3f\x4c\x48\x68\xbb\x5b" + - "\xd3\xad\xf3\x0d\x5e\xb9\xb3\x56\x4e\x28\x9f\xea\x13\xe3\xc8\x84\x95\xe4\x40\x5e\xbf\x82\x2e\xc0\x6f\x61\xcf\x47" + - "\xe4\x7a\xd8\xf5\x82\x89\x94\x05\x22\x6f\xc5\xbe\xd1\x45\x7e\xf6\xa3\xa4\xfa\x94\xf2\xf3\x60\x9e\xa1\x81\x9d\xa9" + - "\x23\x3b\xa3\x83\x60\xdc\x8c\x14\x4a\xfa\x6e\x50\x75\x95\xc6\x72\x6f\xea\x09\xf4\x32\xc3\x8a\x49\x1b\xd9\x89\x0f" + - "\x82\xe1\x93\x71\xff\x48\x7a\xb6\xa2\x7f\xf8\x21\x1f\xfb\xcd\x45\x76\xd4\x40\x75\xaa\x65\xef\xbe\x43\x4c\x59\xb0" + - "\xe3\x7d\x05\xdc\x89\x7a\xaa\xfe\x79\xb0\x37\xde\xdb\x87\x63\x26\x12\x37\x88\x56\x20\x4a\xc9\x3d\x15\xf7\x11\xba" + - "\xf0\x83\xb7\x0a\x69\x1c\x03\xca\x1c\x2a\x23\x0a\xf4\x95\x5d\x24\xca\xca\x4d\x0b\x55\x8c\x42\x61\x40\x36\xeb\x4b" + - "\xb5\x5d\x5f\xb0\x09\x97\x4a\x4e\x96\xc5\xd2\xa0\x81\x1d\x42\x5f\x74\x53\x5e\x21\xd7\x23\xb6\xda\x89\x99\xd7\x8d" + - "\x79\xe7\xae\x13\x50\xf3\xcb\x27\x84\x26\x9b\x68\xed\xbd\x17\xb4\x25\x60\x3f\xbf\x07\x63\x16\x49\x44\xb6\xa2\xca" + - "\x99\xd8\x4e\x27\xeb\x06\x42\xeb\x9d\xad\x3a\x0c\x15\x49\xf7\xe9\x48\xe1\x29\x20\x25\xb8\x9b\x46\x95\x75\x75\x6a" + - "\x1c\x47\x84\xda\xec\xd2\x67\x74\x95\x9a\x6e\xf8\x26\x13\x9c\x60\x65\x5b\x5d\x96\x41\x79\xe2\xf6\x6a\x24\xe4\x8b" + - "\x65\xfa\x43\x91\xb4\x3e\x55\xfb\xde\x8b\x6a\x7f\xe4\x45\xfc\xa9\xda\x57\x37\xa9\x67\x70\xa1\x8e\x07\x6a\xc3\x5a" + - "\x01\x22\xa1\x00\x8a\x08\x0a\x0d\x40\xb6\xbc\x95\xd9\x0d\xe6\xce\xbb\x99\x5d\x76\x6d\x00\x2b\xa0\x13\xca\xf4\xba" + - "\xad\x77\xe3\x0d\x70\xbf\xab\x61\x41\x95\xc9\xee\xfe\x08\xfc\xc3\x7c\xe3\x59\x5f\xd2\x56\x5c\xa8\x60\x1a\x50\x07" + - "\x6a\x5f\xb8\xe5\xc2\xb6\x92\xdc\x6f\x20\xc9\x92\x49\xf5\x64\xb8\x6b\x87\x0a\xb8\x54\xc8\x93\x9a\x2a\xcf\x46\xea" + - "\x28\x6c\xc1\x84\xdc\x4f\x26\xea\x3d\x9a\x16\x25\x97\x00\x5e\x51\x48\x41\xd8\x16\xf9\x37\x89\x56\x2e\xad\x91\x8e" + - "\xb3\x33\x2d\x55\xd2\xcd\x06\xe1\xf5\x6b\xb0\x39\x33\xfa\x32\xf3\xa1\xc3\x23\xd1\x46\x82\x05\x2c\x3c\xfd\xac\x98" + - "\xac\x58\xa5\x65\xc1\xca\x1e\x2b\x8c\x47\x78\x66\x3c\x6e\x73\x8f\xfb\x1f\x84\x77\xd7\x2b\x7d\xea\xea\x0d\x28\x10" + - "\x9a\x5c\x1e\xe5\xd9\xc3\x0f\x36\xea\x4b\xc3\xf2\x1b\xc9\xf4\xbd\x2b\x96\x2b\x48\x28\x8b\x58\x13\x35\x33\x31\x34" + - "\xec\x58\x63\x89\x65\xfa\x73\x19\x33\x8d\x64\x0d\xab\x3b\x69\xa0\x35\x30\xe7\xa6\x21\x87\x9e\xc2\xfa\x9e\xfa\xa0" + - "\x0c\xec\x17\xea\x0c\x47\xaa\xd2\x4e\x9a\x79\xe7\x35\x88\x22\xde\x6e\xa4\x52\xb2\x0a\x11\xd2\xec\x41\x3f\xe2\xe3" + - "\x4c\x67\x59\x86\x77\x2c\x89\x9d\x18\x6d\x0b\xdd\x34\x69\x2b\xd3\x16\xa5\xf7\x39\x60\xc3\x80\x7d\x4f\xec\xba\x3e" + - "\x6b\x55\x1f\xae\x37\x29\xc9\x81\xff\xcc\x72\x00\xd1\xad\xea\x0b\xbc\x04\x69\x9b\x3c\x96\x8d\x95\x46\x37\xde\xa4" + - "\x8e\x66\x5e\x48\x3e\x6f\x43\xdb\xd1\x7e\x0e\x92\x80\xfb\x92\x37\x76\x52\xa6\xd3\xa5\x17\xa6\x31\x90\x8c\x67\x66" + - "\x84\x16\x76\x0e\x10\x05\xee\x1e\x39\xd5\xcd\x89\x3e\x35\xa9\x25\x79\x32\x51\x83\xaa\x56\x4b\x0d\x79\x97\x16\xf5" + - "\x05\x10\x68\x11\x73\x43\x3a\x42\x40\xf7\x20\xe0\x96\x21\x9d\x8e\x40\x04\xa5\x5f\x44\x98\xe4\x99\x08\xe9\xb9\xdb" + - "\x25\x41\x1d\xf8\x7d\xc0\x89\x1a\x02\x59\x6a\x55\xa0\x59\x9b\x08\x19\xa9\xcb\x01\x4d\x4f\x7d\x29\x61\x84\x53\x49" + - "\x96\x36\xd4\x7c\x4d\x62\x98\x0f\xd6\x08\x95\x1c\xa8\xc7\x7b\x7b\x40\x81\xf0\xc1\x5f\xd5\x17\x7b\x7b\x7c\x67\xae" + - "\x2d\x26\x94\xdd\xfb\x52\xb4\xf0\x77\x23\xc2\x19\x1c\xd3\x12\x96\xb7\x1b\x5f\x27\xfd\x86\x3f\x3d\x2e\xb5\xb3\xe8" + - "\xac\x25\x0a\x2b\x78\xe1\xa4\xba\x01\xc8\x76\x17\xfa\xaa\x2f\xa2\x0a\x7d\xa9\x2f\x34\xb8\xff\xb5\xc3\x68\x41\xa8" + - "\x37\x9f\x1a\x4b\x95\xc0\x9a\xfb\x59\xe5\x7c\xd8\xa8\x61\x9d\x2d\x74\x51\x45\x20\xe6\x49\x38\x56\xa0\x59\xff\xdd" + - "\xe2\xce\x6d\x02\xcf\xd6\x16\x53\x0f\xaf\xb8\xef\x89\x6c\x8d\xbc\x90\xb3\xd8\x14\xb9\xec\x56\xb9\x75\x97\xac\x73" + - "\xe0\xbf\x4a\x2d\x1f\x9f\xd2\x1b\x27\xc6\x7c\x7a\x27\x3a\x42\xcf\xc6\xc6\xa5\x23\x3f\xdc\x3c\x52\xe5\x21\xe8\x23" + - "\x6d\xfc\xc7\x7b\x5f\x06\x5d\x37\xea\x37\xbf\x7b\xf9\xec\x85\x84\x1f\x89\x48\x71\x56\xd5\x54\x5f\xf6\x34\x6d\xa9" + - "\xf5\x7d\x8a\x6e\xa6\xb4\xc9\x2f\xf6\xbe\xbc\xa5\xf6\x96\xeb\xc8\x92\x60\x1b\xd6\x6c\xa3\x2a\xb3\x34\xed\xe7\xd6" + - "\x67\x40\x20\xdc\xd6\xf4\x2e\x8c\xea\xe6\xdd\x0f\xb6\x38\x6f\xcf\x0c\xd6\x20\xff\x3e\xe8\x45\xb6\xb6\xd8\x1a\xe4" + - "\x5f\xc2\x03\xbf\x6a\x82\xda\xdc\x97\x6f\xe8\xda\x8d\x7a\x83\x8a\x49\x43\x46\x04\xac\x18\xdc\xfe\x43\x2f\x7d\xc1" + - "\x16\x41\x89\x9b\xa5\x2e\x01\x8b\x35\x8c\x03\x8d\x4c\x30\x97\xe0\x3a\x5f\x57\xc8\x55\x92\x0d\x92\xfb\x6b\xe5\x5d" + - "\x99\xae\xfb\xf5\x35\x1a\x9b\x3b\x56\xc2\x78\x2d\x30\x78\xa1\xe3\x06\x02\x14\x34\x4a\x4a\xc7\x6b\x1b\x52\xe5\xa5" + - "\xb1\x09\x92\xfa\x83\x80\xcd\x92\xeb\x9c\xbc\x5e\xa4\x5b\x57\x64\x31\xe5\xa1\x3c\xed\xbc\xa2\x6e\x0e\x3a\xdc\x41" + - "\x20\xed\x34\xbc\x9d\xe4\x0a\xc2\x35\x9b\xbc\x74\xe3\xdb\x48\xc9\xb6\x84\xdf\xd3\xb8\x31\xb6\x2e\xcf\xcd\x2f\x45" + - "\xbb\xe8\x91\xc9\x8e\x02\x5b\x63\x05\x57\x84\x97\xee\x71\x7f\xce\x0f\x51\xb5\x1b\xf8\xc6\x9a\x99\xd9\x16\xf5\xe2" + - "\x1a\x1f\xf7\xdc\x21\x77\x18\xfc\xe5\xec\x3d\xaf\x73\xcf\xd2\x81\x37\x15\x5b\x71\xa4\xbb\x55\x87\x17\xf8\xd7\xc4" + - "\x87\x30\xb3\x87\x24\x4a\x50\x34\x8a\x13\xed\xc1\xc1\x15\xc3\x64\x68\xf3\x84\x41\x8f\xa2\x4f\xf9\xa8\x4e\x6f\x99" + - "\x81\xe7\x24\x18\xc2\xef\x8e\x21\xd8\xf5\xfc\xd3\x67\x9a\x1a\xf8\xaf\xca\x4d\xdc\xa5\x0d\xb2\x93\xb0\xee\xba\x03" + - "\x41\x12\xdb\xb3\x7f\x3c\xfb\x55\xcd\x30\xf6\x46\x1c\xe0\xfb\x03\xb5\xbb\x1b\x19\x15\xa2\xfc\x6e\xb7\x19\x14\xea" + - "\x55\xd6\x8f\xb1\xb4\x7d\xaf\x6b\x4c\x21\xcf\x83\x53\xd3\xfe\xe3\xdd\xdb\x1f\x3a\x0e\xbc\x48\x82\xbd\xa3\x46\xec" + - "\x4c\x4d\x9d\x80\x64\x48\x3d\xa5\x47\x2a\x03\xbf\xfc\xc8\x63\xf9\xd4\xb4\xef\x20\x44\xa3\xd3\xd4\xa7\x36\x22\x92" + - "\xaf\x88\x96\x28\xee\x23\x45\xba\x8d\x60\x91\x8e\x30\xad\xd3\x48\x65\xab\xda\xb6\x31\x7a\xba\x2a\x46\x6c\x6b\x96" + - "\x40\xea\x47\xfc\x30\x06\x89\xee\x1d\xad\x74\xf5\x99\x4c\x14\x44\xed\x05\x54\x5f\xaf\x8e\xe4\x27\x98\xe7\x0d\x1d" + - "\xdd\xb7\x6f\x81\x30\x23\x43\x03\xaf\xbd\xc8\x55\x29\x9d\x42\x71\xc1\xfd\x1c\x62\x48\x71\x00\x6a\xdb\xe4\x06\x1d" + - "\x4f\xb2\xdb\x3f\x03\x11\x25\xe0\x86\xe9\x1b\x9d\xd2\x54\xc4\xe0\x6d\x53\x04\x5a\xf1\xcf\x30\xaf\x1b\x69\x17\x59" + - "\xa3\xc3\xdd\xda\x0e\xa9\x69\x9e\x4a\x34\x7c\x72\x00\xd1\xea\x64\x5d\xcd\x16\xaa\x9e\xfb\xa9\xc6\xbb\xcf\x1b\x7a" + - "\x28\xc1\x15\x9c\x19\x34\xf4\x75\x97\x38\x58\xd5\x46\x2a\x9c\x88\x51\xe7\x88\x4a\x7a\x14\x13\xab\x91\x50\x83\x74" + - "\x36\x89\x58\x65\x01\x24\xde\x32\x20\x97\xc4\xe9\xbe\x0d\x77\x5a\xc0\x32\xcb\x0c\xee\x54\xe5\x6f\xe6\x5c\x97\x3f" + - "\x83\x69\x25\xda\x74\x31\x24\x72\x67\xd5\xa2\x45\x4b\x23\xe2\xc2\x8a\xf1\x61\x91\xb1\x6c\x21\xe4\x8b\x63\xe0\xc2" + - "\x13\x8e\xc2\xf4\x31\x22\x37\x12\x76\xb9\x17\xb5\xfc\xa2\xd1\xab\x67\x65\x94\x33\x0e\x02\x82\x04\xbe\x99\x2b\x72" + - "\x07\x7a\x1f\x7d\x92\x18\x82\xff\x5c\x52\x53\xea\x09\x56\x16\xe5\x33\xbd\x2d\x85\x3b\x66\x40\xf6\x90\x1c\x7c\xe9" + - "\xbc\x0f\x59\x20\x21\x62\xc0\x55\x8e\x26\x5a\x8c\xcd\x40\xf4\x6b\x28\x0d\xaf\x42\x8e\x13\xd7\xfa\x28\x54\x3b\xae" + - "\x2f\x2a\xd3\x78\xd8\xe3\xe1\xd8\xfc\x73\xe0\x58\xad\xf1\xac\x04\x0d\x0c\x46\xd7\x76\x52\x99\xe1\xb7\x21\x2f\x4b" + - "\x18\xb5\x6b\x6e\x8c\x31\xcb\xdf\x82\x6a\x39\x1a\x43\x7c\x7b\x42\xd9\xa5\x5e\xf5\xe8\xdd\xdc\xc2\x88\x7c\x7d\x9d" + - "\x7c\x20\x90\xba\x00\x20\x57\x08\xf2\xf3\xf9\xa2\x28\xf3\x24\x4d\x06\x27\x26\xe9\x94\x7b\x9a\x08\x2e\x22\x79\x02" + - "\xaf\xc4\x18\xad\xae\xbc\x7c\x3d\xb4\x2a\xc9\xf6\xeb\x06\xf3\xba\xaa\x62\x87\x55\xb9\xd7\xfe\xa7\x37\x17\x34\xfe" + - "\xe9\xdb\xeb\xee\x54\xb8\x04\xfe\xb7\x31\x4d\xad\x84\xac\x32\xe5\xdc\xa3\x56\x0d\xe2\xfd\xc2\x8f\xd3\xd4\x8a\xfe" + - "\xfb\xf8\x68\x84\xdd\x16\xb3\xaf\x98\x13\x96\x16\xc5\x17\xec\xcd\xc6\xe9\xea\xbb\xed\xc4\xdf\x95\xf3\x2f\xea\xc6" + - "\x27\xad\xc7\xa6\xb3\x2e\x5a\x3a\xec\x5b\x99\xa9\x1c\x49\x34\x86\x75\x95\x8c\xa2\x87\x86\xe3\xf9\x1b\x0c\x6f\x4b" + - "\x65\xdc\x4d\xaa\x44\x09\x4e\x4f\xea\xfc\x2a\x93\xbc\x5c\x27\x6b\x3c\x98\xb9\x91\x79\xc5\x64\xaa\xee\xe8\xb8\xd3" + - "\x6e\x93\xa9\x1f\xbb\x35\xe9\x40\xfb\xfb\xf0\xee\x55\x33\x26\xeb\xc6\x78\x51\xe4\x39\xa4\xc0\xef\xcd\x8e\x22\x01" + - "\xea\xdf\xae\x4c\xa3\xd5\x5f\x0f\xd4\xfe\xe3\xf1\xfe\x63\x7c\x89\xcf\x1a\x83\x01\x60\xf5\x7c\x6e\x4d\xfb\x4b\x91" + - "\xb7\x0b\x34\x79\xe1\x83\xef\x4c\x71\xba\x68\xad\x02\x04\x80\x76\xa1\x2b\xf5\xbb\x69\x6a\x55\x57\xca\xd6\xcb\x40" + - "\x35\xc3\xed\x85\xb9\x8b\x42\x65\xae\x51\x50\xde\x89\x17\x58\x29\xbc\xa1\x1b\xa7\x6f\x74\xe7\x85\x05\xb0\xac\x0d" + - "\xc3\x63\xbc\xc5\xcd\x13\xc3\xc5\xc5\xad\xb6\xcd\x79\x10\x1e\xef\xa9\x03\x35\xf9\x7f\x1e\xef\x4d\x20\xfe\xaa\x39" + - "\x69\x34\x38\x1d\x1e\xa8\xc9\x87\xa3\x0f\xc7\x84\xc7\xfe\xfc\xa7\xef\x5f\x61\x16\xd5\xc3\x0f\x15\x95\xc4\xcc\x26" + - "\xad\x69\xd8\x5d\x10\x90\xdc\xf1\xe9\xf5\xc9\xba\x6d\xeb\xea\xba\x58\xea\x53\x40\x80\x37\x2d\x80\xc1\x0f\x3f\x9b" + - "\x14\xf2\x63\x8d\xe3\x82\x2f\x01\x96\xe3\x1a\xa1\x1f\xaf\x9d\xf8\xa1\x1b\xa3\xaf\xcf\xcc\xd5\xa9\xa9\x86\x93\x02" + - "\x3a\xee\x15\xf9\x27\xeb\xa2\xcc\x7f\xd4\x8d\x5e\xb2\xf3\xd6\xe5\xc8\x89\xde\x23\x25\x1c\xc3\x46\xe0\x1c\x11\xd0" + - "\x95\xc8\x9d\x9e\xa1\x88\xd2\x24\x40\xf5\xc9\xc7\xb0\x71\x41\xc6\x47\x9c\x75\x43\x49\xb9\x8a\xd6\x2c\x41\x83\x17" + - "\xb1\x64\xd0\x68\xc4\x42\x9d\xc7\xfe\x0b\xd2\x53\xed\xfa\x5a\xf1\x0c\x93\x2f\x06\xf6\x5d\xc5\x20\xbb\x98\x2b\x13" + - "\xc0\x87\x42\xd3\x18\x24\x6c\x67\xba\xd4\x0d\x29\x12\x75\x9e\x87\xd1\x9f\x6f\x22\x71\x93\x89\x7a\xed\xbe\x27\xf4" + - "\x1a\xac\x41\x0d\xb0\xe6\x9a\x35\x16\xc3\x91\xc2\xf8\x7d\x70\x51\xa9\xd6\x4b\xd3\x14\x33\xcc\x0f\x47\xad\xf5\xcc" + - "\xb9\xda\x51\xd9\x51\x06\x46\x71\xce\xb7\x19\x47\x2f\x1e\xaa\x82\xcd\xde\x3b\x2a\x3b\xce\x46\xea\xbc\x6f\x89\x52" + - "\x92\x1b\x90\xe3\xbc\x81\xd1\xcf\x61\xf0\x46\x73\x4d\xf2\xb2\xf5\xc5\x4c\x46\x6b\xc8\x91\xbc\xbc\x88\x68\x9c\x85" + - "\x20\x8a\xa2\xa2\x4a\x70\xc2\x6e\x1b\x67\x45\x69\x8d\xdd\x48\xea\x93\x8f\x1c\x85\xb1\x71\x4c\x37\x72\x2c\xdd\x4e" + - "\xd1\x5a\xf8\x4e\x45\x0b\x0a\x7d\x8a\xd0\xcd\xa2\x3d\xc9\xb9\xe2\x9c\x38\x51\x37\xcb\xc0\xb8\x81\x6f\x1f\xfa\xf5" + - "\xc1\x37\x67\xe6\x6a\x42\x79\xc8\x30\xd0\x58\x61\x64\x1d\x3b\x6c\x4a\x17\xcb\x88\xc8\xe8\x68\x58\xe2\x20\x51\x0f" + - "\x5d\x8f\xdd\xc1\xa7\x24\x8c\x6e\xd4\x07\x71\x38\x56\x1a\x55\x83\x0a\x50\x9f\x97\x4c\xfb\xd2\x23\x55\x54\xe7\xf5" + - "\x99\xdb\x7c\x12\x3b\x25\xf6\x96\x8a\x13\xeb\xf5\xe5\xd3\x55\x87\xf8\xd7\x60\x08\xf0\xa4\xb7\xa4\x5b\x65\x2d\xd1" + - "\x91\xf2\x1c\x84\x93\x6f\xf0\x08\xfc\xfc\xd3\x6b\x27\x49\xd5\x15\x80\xbe\x63\x58\xd9\x8e\xca\xc0\x35\xaa\xaf\x84" + - "\xac\xf2\xc6\xe3\x88\xbd\x43\x13\xbd\x9f\xbf\xb6\x46\xbe\x37\x40\xb0\xc3\x45\x34\xfe\x62\xfc\x18\x13\xba\x15\x35" + - "\x1c\xec\x0e\xd5\xe8\xc5\xc2\x8c\x0a\xf4\x46\x69\x0b\xb7\x4d\x19\x5a\x2e\x3e\x4c\xf1\x04\xfd\x9e\x82\xfc\xea\x98" + - "\xe9\xbd\xa8\x46\x4a\x5b\xbb\x5e\x1a\xf6\xce\xa3\xd8\xe6\xfe\xdd\x37\xde\x44\x5d\x35\xba\x83\x0f\x94\xe6\xc8\xce" + - "\x87\x0f\xfd\xa5\x55\xd8\x1f\x4b\x5d\x54\x6f\xe1\x8c\x62\xd9\x7e\x4a\xdc\x22\xd2\xca\x52\x5e\xb8\x31\x3d\xd6\x9d" + - "\x9c\x71\x74\xac\x30\x19\x2e\x84\x7a\x89\xd4\xb2\x82\x47\xea\x1e\xd4\xd7\xf3\xf8\x5c\x13\x81\x74\x9d\xc8\xea\x32" + - "\xcf\xc0\x9c\x35\x80\x74\xf7\xfa\x8a\x56\xd2\x11\xd4\x92\x62\xa7\x26\x13\x95\x17\x90\xd8\x7e\x14\x8c\xdd\x5c\x0b" + - "\x9c\x37\xab\x1a\x33\x5b\x37\xb6\x38\x37\xe5\x95\xa0\x4b\x44\x76\x20\x72\xe8\x16\xba\x34\x52\xfa\x88\xcb\xde\x4a" + - "\x84\xc2\x32\xff\x14\x70\x1e\x1b\x63\xd7\x65\x8b\xae\x63\x22\xa5\x48\xe0\x29\xec\xf8\x63\x5d\x54\x03\xf0\x11\x94" + - "\x31\x10\x8f\xf7\x46\x88\xec\xee\x39\x8a\x5e\x29\x99\x6b\x35\x1b\xf9\xcd\xd8\xbb\x1b\x96\xc5\x7f\x84\xfb\x66\x28" + - "\x92\x55\xc5\xaf\x6e\x67\x62\x7b\xe5\x3f\x8c\x3e\x82\x99\x59\x35\xf5\xea\xbb\xba\x46\xd7\x81\x8c\x77\x13\xa0\x15" + - "\x51\x42\x04\x47\x46\xf3\xbc\xbb\xdb\xbc\x10\x49\x42\x0a\x8f\xa1\xa9\x57\x9e\x0b\x0e\xf5\x11\x9d\x11\x4c\x21\x7c" + - "\x76\xd8\x93\xbe\xd2\xbf\xe4\xc4\x57\xb4\x35\xdd\x7f\x89\xa3\xeb\x97\xa6\x58\x67\xc6\xd9\xa0\x85\x89\xe0\x67\x6b" + - "\xd4\xb8\xb0\x03\x95\x4d\x65\x2a\x55\x76\xb5\x45\xf3\xab\x69\x8f\xf8\xe5\x31\xa0\xed\xd9\x8e\xc8\x08\xd7\x5c\x38" + - "\xb0\x9e\x9d\xef\x56\xcd\x31\x12\x92\xc5\x23\x5e\x27\x4a\x47\x0d\x45\xd5\xfd\x84\x8d\xe4\x92\xa8\x85\x0a\xf1\x16" + - "\x24\x29\x60\x1a\xc6\xeb\x6b\x75\xbf\x81\x1f\xae\x72\xc8\x22\x10\x7d\x36\x94\x13\x17\x6d\x04\xc7\x9e\x45\x79\x13" + - "\xd3\x6c\xcf\x71\x96\x73\x9e\x48\x91\xe1\xf9\x20\xce\xf0\x8c\xc1\xb0\x52\xd2\x49\x73\x86\x1f\xc6\x2a\xed\x0d\xc9" + - "\xc2\x63\xfc\x2f\xc2\xbc\x42\xe0\x23\xcc\xef\x1f\x42\x54\xe1\x06\x13\x87\xd1\xf1\xe6\x23\x95\x7d\x68\x3e\x54\x6e" + - "\xfe\x7d\x50\xf2\x4d\xc8\x7e\xff\x5f\xaa\xea\x66\x08\xda\xe9\x4d\x82\x58\x74\xb7\x5c\x2e\x1a\xc9\x02\xe0\xa0\xbc" + - "\xcb\x12\xa7\x0f\x33\x17\xea\xd7\x37\xdf\x7f\xd7\xb6\x2b\x72\x51\x1c\xc8\x14\x5f\xe4\x92\x74\xc3\xa4\x05\x52\x96" + - "\x2d\x9a\xd7\x39\x47\xa7\x5f\x2e\x9a\x00\x82\xc0\x81\xed\x97\x8b\x86\xf4\x9b\xef\xd8\xde\xc6\x54\xdc\x09\x1e\x21" + - "\x66\x8d\xdc\x0c\xae\xd0\xf1\x80\x8c\x73\x40\x90\xf7\xfc\x45\xf7\x78\x6f\xcf\x7d\xbb\x37\x75\x7f\x31\xc0\x6a\x92" + - "\xe4\x0c\x9c\xd8\xf7\xbf\x7c\xb2\x37\x05\x09\xb0\x2d\x96\xc6\xaa\xd7\x2f\x3d\x06\xf8\xfe\xe3\xc7\x5f\xa0\x4f\x52" + - "\xc1\xe0\x36\xea\xc4\x55\x0d\x91\x5c\xee\xed\x94\x7e\x84\xfe\x43\x03\x12\x73\x20\x9d\xdc\x81\xd7\x29\xc7\xbd\x41" + - "\x29\xb6\x0a\x51\x02\x90\x27\xe8\xc4\xa8\xa5\xae\xd6\xba\x64\x97\x4d\xf0\x2f\xe2\x4c\x98\x83\x07\x4f\x1e\x7f\xbd" + - "\x37\xdc\xbe\x07\xd7\x35\xa5\xf2\x79\x06\xb6\x98\x5f\xf1\x22\x8e\xf4\xc0\x5c\x44\x0d\x41\xc9\x9b\x61\x2d\x59\xf7" + - "\xb6\xc5\x0b\x8c\x40\xec\xdd\x0d\x16\xad\x17\xef\x73\xf9\x90\x10\xe2\x07\xe2\xb6\xf2\x08\xfd\x3e\x49\x6a\x0d\x31" + - "\xf7\xf7\xef\x47\x13\x05\xde\xa6\xd9\x45\xd1\x2e\x9e\x37\x26\x47\x90\x56\x9b\x51\xa3\xa1\x98\xab\x8d\x2b\x02\x30" + - "\xf8\x03\x95\xcc\x77\x5c\xef\xd3\x64\x7f\x7b\xff\x45\x41\x49\x22\xec\x17\x8c\x2e\x0e\xb6\x0a\x06\x17\xaa\xad\x55" + - "\x14\xe8\x06\x50\xa6\x8c\x17\x08\xfe\x3e\xdc\x3a\xe7\x11\x8f\xcf\x04\xf3\x51\xd1\x04\x5c\x5f\xab\x74\xfc\xf7\xbd" + - "\xd3\xb6\x08\x5a\x8b\x2f\x44\x0a\xa9\x32\x71\x86\xca\x05\xfb\x05\xfa\x88\xd3\x48\x4d\x5a\xb0\x15\x13\xcf\x34\xb7" + - "\x02\x9b\xd0\x67\x58\x76\x53\xb7\xb3\x03\xa7\xd3\xeb\x52\x2f\x17\xcd\xb8\x5e\x99\x30\x45\x63\x34\x08\xf0\x2f\x89" + - "\x9c\x83\x4e\x95\xe2\x1d\xc1\xbd\x85\x27\x8c\xf6\x16\xa7\x72\x21\x60\x47\xf4\x54\x26\x1f\xa2\x04\xfb\x96\xb3\x65" + - "\x87\x7e\x23\xac\x59\x07\xc3\x14\xfc\x73\x6f\x2b\xe6\x46\x84\x4e\xb8\x07\xdd\x72\x51\x8e\xe8\x1e\xcf\x15\x0e\xb4" + - "\x57\xcb\x62\x49\xbe\x47\x09\xa4\x45\xd4\x4d\x1f\x27\xff\xf0\xa1\x82\x89\x4c\x62\xef\x45\xb7\xfa\x5e\xf7\x54\x34" + - "\x4c\xb5\xd2\x93\x89\xfa\x75\xf7\x27\xce\xdd\xb3\xfb\x4b\xd1\x2e\xa2\x70\x7f\x42\x03\xeb\x8b\xd2\x84\xfc\x9b\x10" + - "\x6b\x80\xe1\x56\xc8\x6c\x52\xe6\x3b\xe0\x43\x4b\x50\x68\xe9\xc6\xf8\xba\xf4\x59\x01\x81\xad\x5a\x7d\x2c\x4e\xad" + - "\xbe\x50\xab\xf5\xef\xbf\x97\x06\x7c\x89\x2d\xfa\x83\x56\xe6\xdc\x34\x14\x1d\x43\xa0\x3b\x76\xdd\xb0\xb7\xd4\x64" + - "\xa2\x06\x45\x8b\x50\x63\x48\xbb\x4f\x0c\x8a\xb7\x8e\x39\x5e\x99\x66\x97\x83\xc0\x4e\xb4\x2d\x40\xfc\x35\xe7\xa6" + - "\x52\x6b\x2b\x70\xa8\xd6\xab\x61\x34\x3a\xab\x97\xa6\x3b\xb8\x0b\x48\xc5\x4e\x09\x7c\x29\x34\xa1\x98\x7b\x3f\x73" + - "\xde\x5e\xd2\x8d\xab\xf7\xf8\xb9\x63\xc9\x9e\xf6\x59\x3a\xd9\x99\x04\xfb\xbc\xad\xd4\x81\xca\x62\x92\x90\xf5\x2c" + - "\xa5\x13\x32\xa5\x1b\xa3\xdc\xd4\xa9\x0b\x2b\xee\x99\xde\xc8\x80\x9e\xb8\x80\xb8\x9d\xe7\xc2\xc6\x19\x19\x62\x37" + - "\x62\x41\xa4\x69\xbc\x52\x9c\x85\xd4\x20\xbe\xb5\x15\x62\xba\xe2\xdb\xa1\xc8\x25\xc2\x81\x68\x1b\x8e\x00\xde\x66" + - "\xfc\x83\xfd\x86\x08\x1e\xc4\x7f\xe5\x31\xb6\x50\x53\x84\xce\xfc\x31\x86\x83\xab\x40\x86\x0b\x6c\x6d\x25\xae\x5f" + - "\xe1\x73\xce\x19\x2a\x3f\x67\x32\x3a\x08\x8f\x98\xfb\x98\xde\xc1\x7e\xec\x3d\x85\x44\x0d\x0f\xbe\xfe\x6a\xef\xc9" + - "\xc8\x71\x15\x8f\xf7\xfe\x22\x6a\x81\x55\x43\x9f\xe5\xde\xa7\xc1\xe3\x6a\xcb\x47\xed\xca\xce\xdf\xd1\xc9\x94\x75" + - "\x3a\x52\xa1\x6a\x8c\x20\xfe\x94\x0e\x8c\xe2\x61\xa7\xdc\x52\x78\xf3\x8c\xf3\x09\xaa\x93\xa2\xd2\xcd\xd5\x2e\x18" + - "\xf0\x25\x8c\x24\xa6\x22\xb4\x51\x2e\xc2\xb8\x8e\xc1\x83\xfd\xfd\x2f\x1f\x7f\x35\x14\x4f\x49\xff\xe8\x3a\x15\xd5" + - "\x15\xa5\x5c\x3a\x94\x73\xc1\x10\x96\xe9\x27\xa2\xc4\x8d\x9a\x0a\x87\x8c\x64\xec\xbd\xc0\x36\x83\x61\xff\x4a\xf0" + - "\x5f\x1e\x2c\x83\xcf\x98\xbc\xd6\xbe\x07\xa0\x03\x00\x9e\x3f\xf7\xe2\xe6\x56\xb4\xcb\x79\xf7\xfb\x3d\x1a\x6f\x7b" + - "\xff\x9a\xb6\x68\x74\x6b\x0a\x28\x32\x04\x75\x9a\x6d\x3a\xd4\xdd\xf3\x17\xd5\x8d\xa7\x27\xd4\x2d\xe1\x87\x21\xdd" + - "\xad\x72\xcc\x46\x94\x72\x01\x8c\x53\x90\x67\xb2\xd1\x10\xb6\x28\xd6\x76\x18\x51\xa7\x2a\x0f\xb7\x58\x1c\xb9\x26" + - "\x93\x3e\x01\x3c\x0e\xc4\xf8\xf3\x44\xf6\x02\x1a\x23\x93\xfe\xd5\xd7\x5f\x4c\xd5\xdb\x4a\x84\x1e\x14\x73\x14\xf4" + - "\x16\xda\x22\xe4\x24\xb8\x29\xb6\xe8\xb5\xaa\x71\xeb\xc1\x94\x5e\x19\xde\x0f\x1b\x89\x56\x1c\xa8\x90\xb8\x0c\x32" + - "\xf2\x49\x8a\x6e\xe2\xbf\xdf\x54\x6d\x67\xa1\xa5\xb3\x53\x2a\x8b\x91\x50\xc0\x21\x49\xe8\x00\x21\x82\xe6\x3a\xe0" + - "\x72\x7f\x00\xbc\xb1\x04\xb9\xb5\xe4\xb6\x94\x25\x58\xb3\x10\x28\x1c\xe0\x68\x37\x3c\x37\xb3\x65\xef\xf3\xcb\xdd" + - "\xf0\x26\x63\x59\x27\x41\xac\xe5\x96\x27\x83\xc3\xa9\xab\xff\xda\x7d\x32\xc4\xa7\x13\xf1\x8d\x84\x71\x65\x6c\x53" + - "\xaa\x39\x82\x24\x92\xae\xa0\xec\x5e\x45\xbe\x6d\xba\xe4\xf7\x91\x5a\xa6\x65\xf7\xd2\x9b\x68\x5e\x83\x43\x1b\xf8" + - "\x2b\x7f\x6e\x7d\xaa\x30\x08\x0e\xd7\x55\xae\xc4\xad\x1f\xcd\xb2\x0f\xbd\x1a\x04\x77\x14\x09\x6d\x43\x1d\xec\x04" + - "\x20\x77\xd4\xbc\xfe\x65\x48\xc4\x76\x23\x3e\xec\xf2\xfc\x3e\x8a\x1e\x5c\x63\x9e\xa6\x03\xfa\xb6\xa8\x72\xde\x1f" + - "\xad\x3e\x55\x0b\xb7\xeb\x44\x20\x59\xaf\xd4\x73\xeb\x18\xc0\x6f\x04\x12\x0c\x73\xec\x05\x88\x3a\xb9\xd1\x25\x45" + - "\xab\xcf\xa4\x1c\x24\x90\x06\x36\x0f\x02\x7c\x04\x68\x3b\x45\x2e\x60\xb7\x4a\x34\xbf\xf5\xc9\x32\x34\x56\xaf\xe0" + - "\xc9\xfe\x8a\x4f\xfe\x96\x0d\x51\x67\xc7\x07\x2e\x45\xbd\x76\x67\x10\x71\xac\xa7\xca\x8e\xf1\xa3\xe7\xf8\x80\xdf" + - "\xdb\x66\x36\xc5\x70\x78\x3a\xa2\x20\x1b\xd3\xcb\x0c\x28\xb6\x89\x3c\x42\x7b\xf9\x26\x73\x1e\x21\x13\x61\x4b\x63" + - "\x8c\x8c\x17\xac\x88\xf8\x56\x60\x9f\x11\x01\x49\xea\x08\xf7\xbc\x7b\x33\xee\x30\x2e\x87\xea\xcb\xbd\x2f\x15\xaa" + - "\x37\x42\x89\x8d\x90\x4e\xfc\xc2\xa7\xc5\x75\xec\x22\x79\x4d\x80\xe7\xcb\x80\x56\x2b\xf6\xc7\x19\xfd\x2f\x51\x3e" + - "\xb7\x5b\xea\x32\x97\x4a\x21\x34\x49\x35\x90\x9b\x1b\x52\xa6\x1f\x0c\x3f\x1c\x0e\x0e\x0f\x1e\x5e\x7f\x36\xbc\xfe" + - "\x70\xf8\xe1\x70\xc2\x07\x82\x61\x0e\xb1\xa8\xf5\x90\xb5\xbd\x24\x13\x0a\x4d\x55\xc6\x5d\x84\x85\x85\x87\xdc\x78" + - "\x77\xa0\x52\x35\xe0\x24\x48\xd1\xd1\xf1\xaa\x5e\x0d\xc8\x2c\x12\xcc\xf7\xba\xca\x6b\x08\xc5\x47\xc3\x6a\x40\x00" + - "\xc0\xf9\x40\xbf\x27\x5f\x63\x94\x26\x93\x8e\x87\x3c\x32\xd1\xe9\x7f\x01\x78\xa8\x23\xe1\x91\xcf\x6a\x0c\x47\xcc" + - "\x8a\x4e\x44\x2b\x98\xaa\x60\x62\xc2\xb1\xdd\x40\xe5\x00\xbd\x1a\xca\xc6\x54\x22\xa4\xcc\x0c\x50\xbf\xdd\xdc\xa3" + - "\xdc\xe4\x0f\x28\xfc\x9f\x9b\xe6\xa2\x29\xda\xd6\x54\x21\xd8\xc7\x31\x02\xba\xa8\x08\xea\xd5\xb5\xf4\x63\x53\xaf" + - "\x00\x43\x03\xbb\x18\x42\xd9\x41\x2d\x84\x8b\xef\xf1\x3e\xd0\xbd\x10\xb5\xb1\xd9\xba\x29\x33\xd2\x8e\xc6\x60\x34" + - "\x9d\x04\x9d\x83\x24\xa0\x1d\xc2\xc0\xd4\x70\x0c\x86\xf1\xb7\xf3\xc1\xdd\x70\xf8\x19\x28\xba\x93\xde\x90\xd7\xeb" + - "\xc3\x87\x2a\x73\x7f\x02\x3c\x7a\xc8\x40\x44\xb7\x4e\x31\x9f\x77\x53\xb4\x91\x0e\xc1\xe2\x8c\xaf\x32\x27\xef\x0a" + - "\xac\x24\x8f\x79\x05\xc9\xdf\xbc\x16\xc9\x4f\x17\x84\xc8\xf4\x25\xe6\xa3\xda\xbc\x3f\x20\x45\x8f\xf9\x7d\x86\x6a" + - "\x99\xc6\x2c\xcd\xf2\xc4\x10\x36\x98\x81\x98\x41\xf7\x37\x1a\xd3\xb4\xb5\xf5\xac\xd0\xae\xab\x40\xf8\x31\x9a\x45" + - "\xae\x6d\x58\xae\xe7\xe1\x48\xf4\xd8\x73\xd3\x42\xbc\x72\xc9\xf3\x01\xeb\xb8\x93\xe7\x51\x94\xb6\x11\x9c\x2e\x5a" + - "\xc0\xdd\x5e\xa8\x1b\x34\xed\x70\x54\x5c\x3c\x4d\x1e\x87\xe8\x28\x3c\x83\x14\x53\xf2\xb7\xd0\x9c\x43\xeb\x00\xdb" + - "\x01\xb9\x2e\xe4\x88\xa3\x88\x67\xba\xf2\xd2\x0d\x1b\x60\x8f\xfa\xa1\x55\xfc\xf6\xed\xe0\xaa\x60\x4d\x6c\x9c\x96" + - "\x0d\xa7\x98\x3b\x14\x01\x28\xd2\xa1\xb4\x35\xc0\xa9\x14\xe6\xdc\x20\xf8\xbc\x9e\xbb\xc7\x74\x63\xfa\xd4\xfe\xc4" + - "\x86\x84\xd4\x2f\xc4\x0d\x20\x2c\xfd\x71\x57\xe1\x9f\xc2\xa9\xfa\x93\x9b\x7a\x85\x61\x10\xd2\x20\x9e\xaf\x1d\x95" + - "\x81\xfd\xb9\xaa\x71\xd9\xc0\xac\x24\xc3\xb3\x93\x8c\x70\xbe\xf6\x90\x64\x46\x80\xef\xcd\x01\x05\x1b\x46\x27\x31" + - "\x24\xba\x67\x80\xbc\xf9\x37\xc7\xf7\xbb\xc7\x82\x30\xa9\x03\x52\x88\x1f\xc5\xdd\xc7\x1e\xf4\xbf\xea\x9b\xaa\xee" + - "\x24\x1d\x04\xaf\xfa\x74\x34\xcf\x4b\xa3\xab\xdd\xf5\x2a\xa4\x8c\x1e\xcc\x8b\xc6\x58\x5a\xb9\xb0\x46\x20\x52\x45" + - "\x20\x8e\x7d\xc6\xd0\x9f\x8c\x6d\xeb\xc6\x74\x4f\x32\x14\xd8\x38\x06\x31\x0b\x32\x1a\xc9\x51\x20\x38\x63\xda\xaa" + - "\x79\x63\x64\x18\x73\xa7\x12\xe9\xed\xb4\xd4\x67\xa8\xf0\x43\x9b\x64\x63\x76\x51\x75\x07\x19\xfa\xe8\x7a\xca\x6b" + - "\x03\x82\x9a\x9d\x35\xe6\x42\x41\x80\xb7\x95\xee\xc8\x29\x01\x70\xbd\x4c\xae\x9d\x5e\x0a\x81\xa1\x0c\x0c\xfd\x14" + - "\x11\x3b\xb8\xfc\xe6\x6b\x48\x74\xbd\xe6\x18\xf5\xf8\xf6\x86\xac\xdf\x3d\x87\x3d\x0a\xe4\x71\x7b\x08\x23\xac\x01" + - "\x30\x2c\x2c\x1d\xa4\x43\xe8\x24\xe6\x0c\xb3\xd6\xdd\x19\xc1\xa3\x43\xd2\x4a\xb9\x29\x85\x1f\x99\x78\xdc\x53\x57" + - "\xaf\xe7\x74\xdf\x5e\x8c\xb7\x7c\x12\x65\x11\xc1\x72\x95\x06\x80\x03\xdc\xc5\x03\xf4\x41\x30\x24\x2c\x3f\x6c\x90" + - "\x5b\x31\xb2\x82\x20\x27\xeb\x39\x78\xaf\xc2\x0b\x06\x0f\x1f\xe0\x3e\xd0\xe5\x70\x0a\x51\xbd\x4e\x0c\x83\x18\x7b" + - "\x74\x08\x69\xf4\x29\x86\x9c\x50\x40\x38\xe6\x96\xc8\x11\x5b\xb2\xf0\x48\xe9\x23\x95\x23\xb3\x67\x31\x9d\x1c\x32" + - "\xb3\xe4\x23\x65\x56\x18\xb8\x63\xd3\xc6\x30\x17\x31\x54\x5d\x54\xb3\x72\x9d\x1b\x1a\x9f\x70\x91\x41\xb8\xe1\x76" + - "\x59\xf6\x38\x55\x59\xf3\xdd\xfb\x37\xdf\x47\x1c\x3f\x85\xd6\x70\xaf\x64\xe3\x42\x2e\xbc\xcf\x7a\x0e\x91\x50\xbc" + - "\x17\x2d\x8f\xed\xaa\x24\x15\x78\xf9\x90\xbe\xe3\x49\x84\x6b\xfe\xa4\xae\x1d\x0d\xf1\xdf\xca\xb6\x0f\xb8\x28\x2c" + - "\xae\xff\x2c\x96\x3c\xc3\x63\x81\x2f\xcf\x73\xf9\xd4\x33\x74\x30\xf0\x5c\x1d\xa8\x06\x13\xb2\xbc\xd7\xa7\x84\xbc" + - "\x88\xac\xcf\x28\x48\xfe\x60\xd7\x93\xfd\x78\xf8\x50\x1d\x1d\x07\x37\x2a\x4c\xe8\xd2\xea\x53\x1e\x17\xd5\x1d\x8f" + - "\xfe\x88\xfb\x33\xc6\xd5\x27\xc7\x7c\x2e\x7d\xb4\xef\x88\xce\x71\xf0\x78\xf2\x1d\xa4\x95\x02\xef\x9a\x57\xb4\x93" + - "\x06\x0a\x53\xaf\xab\x63\xb1\x4c\xdc\xdb\xa1\xf0\x21\xb5\xa1\xcb\xf4\x67\xe2\x8f\xce\xc6\x53\xff\x71\x24\xd8\x45" + - "\x49\xae\xd8\x43\xc0\x34\xa7\x66\x00\xb9\xec\xb1\x8f\xa9\x87\x34\xfb\xf0\x42\xc2\x1c\xb3\x12\xf9\x3e\x81\x62\x96" + - "\xb9\x02\xc9\x93\x53\x57\xb8\xd5\xf8\x8d\xb4\x87\xc1\x4d\xc7\x3d\x40\xa9\xe0\xd1\x23\xc8\x7a\xfa\xbd\x2b\xa1\x09" + - "\x92\x15\xec\x35\x2b\xc0\x7b\x87\xac\xa6\xf1\x77\xdd\x58\x31\xf4\x65\xea\x04\xb9\xa5\x89\x2d\xee\x27\xdc\x35\x76" + - "\x2b\x5e\x47\x78\xe6\x64\xcb\xf2\x8a\xdd\x69\x42\x90\x99\x98\x34\x0a\x23\x30\xb3\xb6\x6e\x38\x1d\xb6\xc7\x05\x80" + - "\xcd\x85\x31\x06\x50\x05\xdc\xdd\xf3\x39\x26\xcf\x08\xbc\xbb\xca\xe4\x5a\xba\x02\x7f\x13\xb0\x86\x5c\x7b\x8a\x84" + - "\xea\xaa\xc0\x44\xa8\xf0\x09\xcb\x65\x94\x8d\x23\xbc\xdc\x1b\xe1\xfb\xd4\xcb\x0e\xf0\xed\xc2\x3d\xd0\x71\x98\x0b" + - "\x94\x9d\x5c\xc4\x86\x11\x57\xfe\x8b\x49\xfc\xf1\x3e\xb7\xd1\xe5\x25\x59\x6e\x75\x40\x75\x40\x0f\xa9\xba\x4e\x38" + - "\x6c\x9c\x19\x10\x0e\x02\x8b\x12\x01\xd5\x33\x4a\x69\x89\x15\x05\x28\x4f\xae\xb9\xc7\x09\x97\xb5\x51\x3f\xbe\x7d" + - "\xe7\xd5\x51\x32\x81\x31\x5c\x7f\x32\xe8\x08\xf3\xd2\x8e\x90\x2d\x88\x51\xa2\xf1\xc8\x99\x72\xce\x87\x4c\x00\xf0" + - "\xdc\x1a\xe3\xc7\x97\x71\x31\x57\x99\xeb\x50\xe6\xb3\x75\x38\x49\x4a\x84\x5c\x42\xbc\x3a\x68\xce\x38\x32\x52\x82" + - "\x8c\x78\x81\x31\x0d\x0b\xa4\xc0\x33\x91\xf0\x0b\xaf\x34\x9c\x17\xbc\x2a\x01\x9f\x59\x38\x10\x44\x56\x8a\x28\x0c" + - "\x0b\x38\xa9\x28\x51\xf7\xda\x52\x8a\x71\xd2\x6e\x45\x8a\x7b\x09\x94\x21\x18\x47\x52\x91\x95\xf3\xb1\xeb\xd6\xc0" + - "\x1f\x96\x00\x5c\x48\x4e\x9f\xe1\x8d\x63\x50\xc4\xdd\x5a\xd6\x33\xb6\x17\x60\x92\x7c\xbf\x4c\xe0\x97\x98\xaf\x97" + - "\xcb\x2b\x95\x17\xe7\xbe\xb6\x97\x97\xf1\xfd\xe8\xc8\xc8\x79\x5d\xe4\xea\xf5\x4b\xf5\xf9\x8f\xa6\x59\x16\x90\xd9" + - "\x4a\xbd\x30\x55\x61\xf2\xcf\x29\x93\xa2\x94\x08\x06\xd9\x5f\xf3\xe2\xfc\x6f\x59\x08\x94\x4a\x2f\xd2\xce\xc4\x0d" + - "\xc7\xf3\xc2\x15\xf4\xa3\x10\x50\x89\x11\x52\x22\x63\x43\x43\xa6\x27\xf4\x7d\xc4\x52\x71\x85\x34\x75\x37\x01\x8a" + - "\x5b\x68\xa9\x1e\x3e\x14\xa4\x2f\x0a\xb4\x0e\x32\x9c\x9b\x72\xf4\x45\x0d\xc1\xb3\x7e\x8d\x00\x11\x99\x81\x62\x42" + - "\xb3\x23\x0f\x4a\x14\x07\xdb\xdf\x74\xaf\x09\xf2\x0c\x94\x91\x1c\x7d\xa1\x1f\xba\x2a\x96\x1a\x9d\x5b\x6e\x0b\x1b" + - "\x61\x05\x79\x63\x56\x03\xa6\x72\xc5\x12\xfc\x42\x6e\x89\xf5\xc4\x30\x38\x27\xbe\x56\x63\x0e\x6f\xbb\x19\xd2\xa9" + - "\xec\x09\x33\xc9\xeb\xd9\x4b\x8c\x9c\x23\x3f\x23\xaf\x49\xe4\x3f\xe8\xba\x8e\xae\xa4\xbf\x9b\xd6\x11\x4a\xf2\x3b" + - "\x02\x88\x09\xed\x7d\x28\xd3\x7c\xdb\xa7\xa6\xfd\x05\x0a\xde\x32\xca\xc2\x26\x45\x0e\xf1\x0f\xf6\x8c\xe3\x6c\x34" + - "\x6e\x64\xdf\xf8\x58\x1d\x62\x1a\xff\xbd\x30\x17\x49\x8e\x49\x8c\xe2\x21\x57\x33\x6b\xda\xb7\xf0\x7b\x9a\x4c\xb8" + - "\x40\x58\x2b\xa4\x82\x7b\xb6\x6e\x7e\xac\x6d\x81\xee\xef\xb3\x75\xf3\xbd\x99\xb7\xf0\xc7\xf3\x77\xef\xde\xd7\x2b" + - "\xf8\x93\xff\xc5\x9a\xf9\x2d\x95\xd4\xe5\x0c\xb2\x4a\xf9\x5a\x60\xff\xad\xe8\x57\xb8\xb6\x66\xd6\x72\x4f\x32\x7e" + - "\x9b\x71\xbc\xdd\x6c\xdd\xd0\xd2\x30\xab\x82\x73\x43\x95\x35\xf5\xca\xe7\x3a\xd9\x0e\x18\x8e\xbe\x11\x08\x82\x1c" + - "\xa9\xa2\xda\x45\x3c\xdf\x7a\x35\x29\x0d\x04\x86\xa3\x93\x06\xb8\x62\xd4\x98\xd4\xa3\x98\x41\xdd\x5e\xdb\x12\x7a" + - "\x8a\x7c\x81\x2b\x11\x8c\xea\x30\xf7\xb6\xbd\x2a\xcd\x58\x0c\x29\x6b\x4c\x09\x30\x19\x99\xd4\x6f\xf8\x19\xc2\x14" + - "\xd4\x2f\x43\x88\x15\x29\x91\xfd\xac\xf6\xcf\x4a\x5b\xaf\x58\xc9\x10\x66\xb8\xbf\xa8\x1b\x9d\x2f\x9b\xae\x00\xc0" + - "\x78\xc4\xc3\xd2\x27\xb6\x2e\xd7\xad\xc9\x00\x12\x3c\x7a\x35\x2f\x2e\x23\x9f\xd9\x41\x58\x7c\x4c\x98\xca\x1d\x91" + - "\xea\xc6\x75\x5b\x67\x43\xf5\x37\xb5\xbb\x1f\x56\xe4\x07\x4a\xe9\x7e\x62\x14\xdc\x69\x6d\x1d\x36\x47\x68\xb3\x98" + - "\x2b\x53\x38\x6a\xe8\x56\x49\xd5\x8d\x82\x85\x2a\xac\xf2\xf9\xac\x43\x51\xcb\x45\xb9\xfb\xa0\x2f\x73\xfd\xf5\xab" + - "\xd7\x1d\x3c\xaf\x9c\xd8\xd8\x62\x3d\xb8\x72\x56\xeb\xe3\xee\xc6\x02\x5c\x7c\xdc\xd6\x2b\xff\x96\xd6\x40\xbe\x76" + - "\x3d\x66\xfa\x2c\x7d\x1b\x7c\x5d\x70\x4d\xbc\x2a\x6b\xdd\xca\xc9\x04\x15\xfb\x5e\x5a\x71\xb7\x2c\x4e\x76\x28\x7c" + - "\x73\x7b\xfc\x76\x70\x01\xe4\x91\x77\x52\xaa\x11\xfa\x25\xee\x9d\x42\x1c\x65\xd5\x0d\xca\xf6\xee\x72\xf5\x4a\xdd" + - "\x4f\x11\xec\xdd\x39\x84\x37\x07\x49\xc9\xdd\x50\x27\xfc\x1e\xe2\xd6\x79\x4f\x13\x79\xd3\xa9\x1e\x56\xbd\xbf\xfe" + - "\x12\x27\x26\x29\x2b\x5b\x28\x71\x86\x76\x98\x5e\x75\x06\x91\x81\xee\x26\x13\x3e\x75\xe9\xe4\x8c\xa1\x44\x34\x31" + - "\x48\x65\x86\x1b\x56\x16\x76\x0f\x1c\xc1\x50\x2e\x98\x6a\x37\x87\x1f\xd4\x1d\x6a\x9c\xf4\x08\x3a\xec\x59\xa6\x34" + - "\x90\x98\xae\x0e\xbf\xa4\x91\x75\x96\xbc\xba\x41\xbb\x30\x0d\x7f\xdf\x12\x5a\xbd\x15\xdd\x19\x63\x7f\x5b\xb0\x90" + - "\x23\xef\x08\xb6\x7b\x45\x7b\x44\xdc\xa3\x23\x77\x27\x8e\x3c\x95\x24\x29\x07\x54\x3a\xf8\xf4\xa4\xbe\x74\x44\xdb" + - "\x1d\xf4\xa9\x93\x43\xdc\xb2\x4d\xd5\x9e\x22\x93\x5c\x5e\xcf\x28\x88\x3d\x04\xa4\xca\x80\x7d\x89\x5b\x70\xdf\x15" + - "\x8e\xe7\x44\xf6\x2a\xdc\xec\x79\x3d\xeb\xbd\xcd\x11\xd8\xdc\xeb\xf8\x3c\xba\xb7\x56\x79\x61\x67\x75\x55\xa1\x6d" + - "\x83\x13\xcc\x85\x86\x99\xf8\xa2\x32\xca\x0e\xc2\xe8\xe9\xf6\x4e\x56\xea\xa4\xbe\x4c\x74\xde\x28\x61\xe4\xe0\xd5" + - "\x07\x72\xc6\xe9\xb7\xcf\x7f\x1a\xa9\x8f\x6b\x0b\xe0\xe2\x6a\x6f\xb4\xa7\x1a\x8d\x24\x71\xc1\x2e\x1f\xf4\xed\xb7" + - "\xa5\x9e\x9d\x7d\x6b\x9a\xe6\x4a\x3d\x19\xa9\xe2\xed\x3b\xf5\x85\x1a\xb0\x4e\x51\x15\x3f\x2e\xea\x0a\xb3\x8f\x48" + - "\x21\x17\xa6\xf2\xd4\xb4\xdf\xd6\x6b\x80\x2f\x7e\x5e\x16\xa6\x6a\x7f\x32\xb3\x16\x64\x5f\xdb\x36\x1d\x03\x3f\xad" + - "\xd5\xe6\x2f\x85\x5b\xf4\xd6\x05\x24\xa4\x10\xac\x0e\x2c\x4e\xd7\x32\x0e\xeb\x7e\x52\x5f\x02\x45\xd8\x71\xbb\x65" + - "\xec\xa4\xf9\xff\x20\xda\xb3\xcb\x53\x39\x9e\x41\x33\x8e\xcb\x80\xef\x70\x9f\xb8\x0f\xe1\xa0\x87\x2f\x7f\xdd\xf0" + - "\xa5\xa3\x01\xdb\xde\x2e\x8b\x92\x16\x13\xfa\xae\x29\x94\x82\x39\x63\xf0\x89\xde\x6d\x05\x26\x5d\x68\xf2\x47\x88" + - "\x46\x1f\xd1\xaf\xdb\x36\x3d\xc6\xad\x7b\x3e\xa0\x67\xf7\x87\xfd\xf8\xca\x5d\x65\x41\x9e\x71\xdc\x0a\x31\x73\xc0" + - "\x66\x12\xcb\x39\x48\xab\x74\x35\x86\x0a\x6f\x46\xea\xc4\xcc\x34\x08\x67\x98\xc1\xa4\xb5\xe8\xfc\x40\x75\xe1\xe7" + - "\xe9\x15\xb2\x81\x1d\x4b\x78\x02\xaf\xa4\x4f\xe4\xfd\xfe\xdd\x25\xa1\xfd\x31\xea\xc0\x09\x2f\x6b\x77\xb0\xe4\xa5" + - "\xee\x6f\xf0\x2d\xcf\xba\xde\xb1\xf1\x3a\x04\x99\xec\x82\x8f\x1a\xa3\xcb\x47\xd1\x1a\x89\x7a\xf1\x01\xc7\x24\xc9" + - "\x67\x83\x61\x02\x4f\xc9\xb0\xe6\x58\xc8\xc6\x9d\x13\x9f\x33\xdb\xb0\x01\x7e\x40\xb6\x81\x7b\x82\xc4\x71\xa9\x12" + - "\x4f\x96\x53\x7e\x93\xb4\x92\x24\x12\x88\x46\x75\x02\x59\x6a\x6c\x67\xcf\xe1\x61\x8b\x99\xc6\xbe\x6e\xe1\xf7\xef" + - "\xeb\x15\xe0\x02\x64\xa3\x80\x86\x92\x56\x88\x87\xf0\x53\x6b\x74\x67\xb1\xa7\x4a\x01\xbe\xbe\x3e\x41\xcc\x3e\x6c" + - "\x84\xa7\x1c\x81\xbd\xf1\x28\xa8\xa5\x6e\x4e\x8b\xca\xf6\x53\x94\x3a\x8c\x73\x57\x75\x86\xbe\xdb\xb7\xc1\xb1\xbe" + - "\xf7\x00\x51\x84\x9d\x92\x94\xa6\x16\xe3\x4c\x6a\xa4\x67\x1b\xab\x74\xa3\xf5\x75\xa6\x24\x48\x4e\xd2\xbf\x10\x27" + - "\x98\x52\x9f\xbe\x8d\x4c\x6a\xef\x97\x28\xfd\xc2\x67\x8c\x22\x13\x15\x03\x5f\x84\xdb\xf7\xab\xd8\xaa\xc1\xc2\xd3" + - "\x59\xec\x3e\x6a\x11\x64\xa6\x60\xf6\x89\xfb\xdd\xb3\xc7\xf1\x47\x6a\xf9\x41\x66\x67\xe3\x00\x85\x2a\x22\xb8\x93" + - "\x90\x43\xa9\x9d\x35\x75\x59\x02\xf3\xac\xd1\xbb\xac\x2e\x4b\xc7\x77\xa3\x0a\x2d\x05\xb1\xfa\x43\x7c\x30\x55\x99" + - "\xb8\x5e\xb2\x51\xf8\x98\xde\xd0\x95\x95\xa9\x1b\xa9\x90\x20\xa8\x2e\x60\x08\x45\x04\x0e\xf2\xc7\xf1\x77\x6e\x9e" + - "\x5c\x31\x5c\x24\x81\x69\xd5\x8b\x7c\x26\x42\xf1\x68\x4a\x34\xb8\x2b\x33\x97\x96\x4a\xf6\xdc\x11\x19\xc2\x07\xe8" + - "\x4f\xe9\x45\xed\x11\x38\x02\x11\x3b\xdf\x14\xda\xed\xdb\x76\xb5\x1c\xba\xff\x1e\xe1\x48\x8f\x49\x53\x11\x3a\x1f" + - "\xaf\x22\x47\x72\x09\xdc\xa4\xa2\x1a\xf3\x94\xb2\x63\xda\x7d\x37\x4d\x10\x28\xaf\xa6\xac\x8f\x11\x8b\xc0\xbe\x6a" + - "\x1b\x4a\xd1\xc4\x6e\x7b\xc7\x30\xec\x41\xe4\x69\x1e\xf7\x11\x53\x54\x4a\x88\x87\x68\xde\x46\x1d\x16\x7c\x24\x3c" + - "\x7b\x13\x24\x35\x4a\xaf\xe8\xd5\x0c\x33\x6b\xbf\xab\xeb\x33\x4b\xd1\x1e\x41\x0e\xe0\xa3\x02\x9f\xfd\x62\x4e\xce" + - "\x8a\x56\x9d\xac\x4f\xa7\x6a\xd1\xb6\x2b\x3b\x9d\x4c\x4e\xd6\xa7\x76\x7c\x01\x2f\xc6\x75\x73\x3a\xb1\x8b\xfa\xe2" + - "\xb7\x93\xf5\xe9\x78\x76\x5a\x1c\x16\xf9\xc1\xe3\x6f\xf6\xbe\xfe\x12\xbe\x3e\x35\xed\x73\xba\x4c\xdf\xb5\x57\xa5" + - "\xf1\x21\x7e\x2b\xd3\xcc\xc0\xec\xe8\xee\x5b\xaf\x37\x45\x48\x50\xea\xe0\xe4\xa4\x6e\xdb\x7a\x39\x01\xfd\x29\xd4" + - "\x26\xf9\x4d\xaf\xe2\x9e\x59\xab\x96\x75\xbe\x2e\x0d\xa5\xbe\xe0\xbc\x17\x74\x13\xe2\x3b\x88\x99\x01\xe6\x75\xe6" + - "\x93\x43\x14\xad\xc2\x0c\x53\x29\x4e\x1c\xa1\xc2\xa1\xba\x22\x45\x79\x13\xe7\x26\x90\x1b\x98\x48\xbf\xd3\x0e\x94" + - "\xce\xf3\xbf\x9b\xd6\x3d\x7d\x3d\x0f\x71\x68\xab\xe2\xd2\x94\x91\xc6\x29\x3d\x13\x9e\xf3\x88\xbc\x41\x3a\x4f\xb7" + - "\xfc\x93\x03\x12\xbf\xa5\x38\x28\x51\x25\x8b\x39\x15\x48\x67\x5e\x9f\x9a\x91\x9a\xb3\x6e\xb6\xad\x69\xba\xa2\x33" + - "\xd4\x54\xeb\x65\x55\x57\xab\x4b\x4e\x7e\x13\xfa\x11\x87\xe6\xf2\x19\x15\x8a\x0a\x3f\x19\x3b\x2a\x5b\x5d\x66\x3e" + - "\x9e\x96\xeb\x90\x7b\x7a\xfb\x1e\x9c\x06\x6f\xda\x0e\xe4\xb1\xa8\x2a\xd3\x20\xd4\xcf\x08\x7f\xc0\x2d\x3d\x52\x0b" + - "\x7a\x76\x81\x3f\xeb\x75\xcb\xe5\x10\x78\xc8\xfd\x46\xec\xa0\x4d\x84\x14\x4b\x4f\x55\x86\x55\x65\x23\x05\xe5\xa7" + - "\x2a\x83\x3a\x13\xaa\x49\xe0\x07\x1d\x84\x3f\xae\x6d\xa5\x73\xc7\x01\x4e\x55\x06\xbd\x64\xbc\x93\x11\x63\x6d\x91" + - "\xd5\x43\x65\xd9\x54\x65\xd0\x3b\x0f\x89\x12\xb5\x43\x0a\x53\x48\x33\x88\xcf\x29\xe0\x9b\x23\x72\xf1\x06\x77\x0c" + - "\x29\x70\xcb\x6e\x1f\x8b\xc1\x8f\xc4\xc8\xb7\x83\x65\xc7\xd1\x6c\x5f\x57\x4c\xb5\xb1\xbe\x14\x6c\x04\x74\xac\x0b" + - "\x5d\x54\x84\x32\xd4\x91\xf4\xe1\x6a\x96\x9d\x15\xc6\x76\xea\xe2\xfd\xd8\x66\x4e\xb4\x11\xb0\x8f\x9d\xc8\x9b\x7c" + - "\xcb\x3d\x01\xb2\x0e\x9c\xc9\xf5\xb5\x07\x21\xa1\x27\x87\xcc\xc0\x80\x1f\x17\x72\x6e\x21\x31\xe4\xa7\xdd\x3a\xb8" + - "\x0c\x49\xc2\x62\xd2\x0f\x78\xc7\x96\x58\x6b\x95\x28\xbe\xa3\x08\x89\x67\x90\x4c\xee\xc9\xe4\xeb\xc9\xe3\xbd\xfd" + - "\xc7\xe8\x32\x01\x66\x2f\x88\x52\x52\x45\xc5\x3c\x3a\x1a\x4d\xd0\x2d\xf4\x4d\x7d\xe2\xb8\x9d\x77\x7a\xae\x9b\x62" + - "\xa4\x4e\xd6\x6d\xc8\x75\x47\xc7\x16\x3c\x76\xb4\xba\x58\xd4\xa5\x51\x65\xdd\x3a\xf2\x35\xd3\x95\xca\xeb\xb1\x7a" + - "\x67\x8c\x5a\xa1\x21\x06\x03\x44\x74\x8b\x0d\xff\xfc\xd3\xf7\x50\x7f\x5e\xd8\xd9\x1a\xcc\x45\xd3\x50\x25\x13\xef" + - "\xd3\xa2\x5d\xac\x4f\xc6\xb3\x7a\x39\x41\x30\x11\xfe\xc7\x55\x39\xf9\xcb\x57\x5f\xd2\x27\x12\x8b\x6b\x93\xc9\xe1" + - "\x48\x65\x28\xcb\xfa\xcd\x7c\xdc\x13\xff\xe6\x44\x15\xfe\x10\x0f\xac\x82\xd4\x3c\x48\xd7\x83\x1f\x76\x8f\x1d\x21" + - "\xcc\x75\xd0\xbb\x6c\xd0\x94\x90\x19\x0d\x55\xaf\x78\x6f\x1f\xc1\x39\x98\xe0\xd1\x38\x06\x78\x11\x20\x72\xdd\xe7" + - "\x38\x8a\xf8\xf9\x28\xd4\x7a\xb1\x28\x66\x0b\x88\xb4\x2c\xac\x3a\x05\xd2\xc4\xa9\x77\x79\x9e\xde\xe8\x76\x31\x5e" + - "\xea\x4b\x1f\x1d\x06\x5d\x3d\xa9\xf3\xab\x23\x70\xe1\xa9\xcb\x32\x4c\xd2\xc8\xcd\x47\xdf\xf3\xbe\x8f\x6b\xe2\xc6" + - "\xd2\x8f\x3b\xcf\xf9\x63\x7c\x9d\x2e\x0c\xbd\xed\x04\x28\x06\x80\x86\x75\x1a\x47\x71\x18\x66\xc0\xad\x61\xb2\x74" + - "\x7c\xcf\x92\xf8\x33\xe2\xed\x08\xe1\x69\xeb\x16\x14\x55\xf3\xba\x99\x81\xbf\xab\xd7\x17\xc7\x1a\x3d\x21\x9b\xe0" + - "\xc1\x44\xf2\x90\x64\x6c\x7b\x77\x67\xe3\x71\xad\x60\xf9\xe8\x39\xf0\xbe\x7a\x76\xb2\xa7\x97\x81\xd2\x1d\x32\x15" + - "\x9a\x46\x60\xc2\xfc\x5e\x72\x57\x24\x34\xa5\x17\xd7\xfb\x85\x51\xd5\x7a\x79\x62\xdc\x66\x0b\x5a\x12\xd2\xc4\x05" + - "\x8f\x27\xc8\xc1\x1a\xf4\x28\xe8\x70\x1c\x78\x30\x5b\xfc\x6e\xba\x2e\x8f\x52\xfa\x4a\x0c\x86\xe1\x53\x5d\xe5\xef" + - "\x24\x46\x24\x3c\xcb\xf3\x6f\xd9\x73\xcf\x77\xf5\x27\x73\x5a\xd8\xd6\x34\x88\x8e\xe6\x76\x49\xae\x9e\xbd\x79\xe1" + - "\x39\x26\x0b\xa9\x1a\x08\x6e\xc9\x11\x9f\x13\xc8\x74\x3e\xd3\xad\xa9\x82\xa3\x32\x80\xf3\x40\x7d\xf3\xa2\x84\xec" + - "\xf1\xba\x85\x60\xb5\xb5\x75\x1c\x99\x9b\xc2\x91\xdf\x0f\xe7\x85\xc6\xac\xb4\x2b\x74\xb9\xa4\xba\x8a\xba\xf2\x81" + - "\x35\x0b\x8d\xcc\x9e\x9b\xff\xc6\xb6\xba\xca\x9d\x94\x5d\x57\x57\xcb\x7a\x6d\x45\xff\xec\x58\x3d\x13\x9d\x2e\xac" + - "\xb2\x7a\x0e\xd4\xb0\xca\xd5\xb2\xb6\xad\x6a\xea\x93\xb5\xc5\xca\x20\x83\x78\xad\x1a\x1a\xf1\x58\x41\xee\x5a\x30" + - "\xbb\x11\xa2\x52\x61\x31\x67\x22\x6b\xa5\x42\x43\xd0\x88\xc5\xc0\xec\xc9\x44\xe5\xa6\x29\xce\x1d\xab\xda\x40\xfc" + - "\x3c\xbf\x1f\x41\xbb\x34\x59\x00\x17\xd7\x2c\x01\x3d\x22\x37\x65\x71\x6e\x1a\x4a\xc7\xa8\x4a\x6e\xd8\x4f\x19\x66" + - "\xc8\x57\x2f\x6a\x24\xe2\xe4\x8e\xea\x88\x0c\x7b\x72\x12\x1e\xb8\x4f\xf2\x08\x68\x53\xa2\x83\x17\x1a\x02\x1e\x27" + - "\x13\xb2\x5e\x95\x0a\x72\x76\xce\xcb\x62\x06\x41\xe1\x8b\x02\x90\x97\x0a\xab\xce\x4d\x03\x5e\x04\xf5\x9c\xba\x3a" + - "\x02\xe7\x4a\x77\x61\x5d\xd4\xcd\xd9\x98\x76\xc6\x0f\x75\x4b\x2a\x33\x77\x9d\x2c\xf5\x65\xb1\x5c\x2f\x95\xe3\x61" + - "\xf5\x49\x51\x16\xed\xd5\x48\x95\xc5\x49\xa3\x9b\x82\x17\x5c\x37\x06\x16\x98\x26\x00\x41\x3b\x68\xbe\x66\xa5\x06" + - "\x07\x55\xb3\xb4\xa6\x3c\x37\x16\x83\x04\x79\x45\x69\x35\x71\xfe\xd0\xe5\x81\x22\x49\x94\xe6\x91\xc3\x88\x51\x8a" + - "\x79\xf3\x02\x5c\xb4\x90\x14\x43\x3e\xf8\xaa\x1d\x8b\x79\xd7\x51\xa0\xd9\x18\x22\xd6\x97\x75\xe3\x58\xc9\xb9\x5b" + - "\x12\x34\x19\x5b\x83\xf3\xdf\x77\x29\x36\x27\xeb\xe6\xcc\x4c\x1c\x35\x2b\x1a\xf3\xd1\x4e\x2e\x8a\xb3\x62\xf2\xf3" + - "\x2a\x87\x05\xd9\x65\x6f\xdf\x5d\x3f\x03\x0f\x5c\x81\x5d\x37\x22\x37\x7d\x52\xa7\x8d\xdb\x9f\xb4\x93\x74\x94\xc1" + - "\x7b\x0b\x5f\x8c\xf5\x92\x79\x7a\x7c\x30\x50\x19\x6e\xc7\x6c\x04\x4e\x6c\xb7\x42\x3f\x3d\x8d\xc0\x3e\xbc\xc3\x00" + - "\x3a\x08\xbd\xd1\x2b\x70\x3f\xf5\x33\x43\x59\x59\xeb\xb9\xf7\x4a\x75\xec\xc6\x6f\xf4\xda\x3b\x17\xd0\xae\x60\x3f" + - "\x23\x5f\x8d\xdb\x86\x9f\x6d\xac\xe5\xb3\x50\xc1\x67\x92\x1a\x89\x6d\x18\xf9\x70\x1a\xb3\x92\x6e\x6e\xfc\x29\x4c" + - "\x14\xf5\x88\x46\x1c\x5e\xa9\xdf\x3e\x0b\xfe\x1c\xf0\x19\x54\xf3\xf0\x61\xdc\xf5\xcd\x75\xf8\xa1\xfe\x26\xe6\xaf" + - "\xeb\x44\xe8\x29\x2a\x38\xe5\xac\x6a\xeb\x49\xa0\xdb\xa0\x9f\xa9\x02\xb0\x52\xe6\x05\xf8\x79\x80\x89\xbe\x08\x5b" + - "\x73\xf0\xe0\x2f\xfb\x7b\x8f\x1f\xcc\xea\xa5\x23\xea\xd3\xfd\xbd\xd1\x27\xf2\x5d\x4f\x9e\xfc\x65\x08\xb5\xb8\x46" + - "\x9e\x03\x96\xf9\x3f\xde\xc1\xe9\x3b\x69\xea\x0b\x6b\x1a\x65\x96\xeb\x52\xb7\x75\x63\xd5\xe0\xc1\xfe\x17\x4f\xbe" + - "\xfa\x6a\x18\xef\xb5\xaa\xc6\xb4\x04\x30\x01\x3d\xd6\x92\x74\x16\xc4\xcc\x86\x81\x87\x9d\x94\xce\x89\xbb\xe5\xdc" + - "\x66\xfb\xff\x03\x00\x00\xff\xff\x1d\x30\x27\xdd\x1d\xea\x03\x00") + "\xd0\xe2\x43\xb2\x93\x74\x42\x99\xd6\xcf\xb1\x9d\x1e\x9d\x5f\xec\xb8\x23\x67\x32\xf7\x4a\xca\xa4\x48\x14\xc5\xb2" + + "\x41\x80\x41\x81\x92\xd8\xa1\xfa\xb3\xdf\xb5\x1f\xf5\x02\x40\xd9\xee\x4e\xcf\x39\x3d\x6b\x62\x11\x28\xd4\x63\xd7" + + "\xae\x5d\xfb\xbd\x87\x8f\x76\xef\xdf\x13\x8f\xc4\xfb\xbf\xad\x54\xb9\x16\xff\x5b\x5e\xc9\xd3\x69\xa9\x97\x95\xf8" + + "\x41\x4f\x4a\x59\xae\xc5\xd5\xe3\xc1\xe1\xe0\x10\x1b\xcd\xab\x6a\x39\x1a\x0e\xdf\xff\x0e\x6d\x07\xd3\x62\x31\x84" + + "\xc7\xf8\xea\x24\x9f\x66\xab\x54\x19\x71\xaa\xff\xfe\xf7\x4c\x0d\xde\x9b\xf0\x0b\x83\x0f\xdf\x9b\xf8\x9b\x17\xc5" + + "\x72\x5d\xea\xcb\x79\x25\x1e\x1f\x1c\x7c\xd5\x13\x8f\x0f\x0e\xbf\xb4\x13\xf9\xbe\x58\xe5\xa9\xac\x74\x91\xf7\xa0" + + "\xef\x81\x90\x79\x2a\x8a\x6a\xae\x4a\x31\x2d\xf2\xaa\xd4\x93\x55\x55\x94\x34\xc8\x4f\x2a\x53\xd2\xa8\x54\xac\xf2" + + "\x54\x95\xa2\x9a\x2b\xf1\xfa\xe4\x9d\xc8\xf4\x54\xe5\x46\xb5\xcc\xbc\x28\x2f\x87\xc1\x5b\x6c\xf1\x52\x56\x6a\x84" + + "\x53\xe8\x1f\x7c\xd5\x3f\x38\x7c\x77\xf8\x97\xd1\xe1\xe1\xff\x0b\xef\x86\xf7\xef\xdd\xbf\x97\xcc\x56\xf9\x14\xe6" + + "\x93\x88\xcb\xac\x98\xc8\xac\x27\x66\x72\x5a\x15\xe5\x5a\x74\xc5\x1f\xd0\x62\x47\xcf\x44\x22\xaa\xf5\x52\x15\x33" + + "\xb1\x28\xd2\x55\xa6\xc4\x78\x3c\x16\x9d\x62\xf2\x5e\x4d\xab\x8e\xd8\xdb\x8b\xdf\x0e\xd4\xcd\xb2\x28\x2b\x13\xb7" + + "\xc2\xde\x76\x76\x86\x43\xf1\x7d\x51\x8a\x17\xc5\x62\x51\xe4\xff\xfb\x14\xd7\x6f\x7f\xf4\x33\xfd\x41\x09\x95\x5f" + + "\xe9\xb2\xc8\x17\x2a\xaf\x8c\xb8\x9e\xab\x52\x09\x29\x96\x65\xb1\x54\xa5\xb8\xd6\x79\x5a\x5c\x0b\x6d\xc4\xb2\x54" + + "\x46\xe5\x55\x8f\xfb\x54\x37\x6a\xba\xaa\x14\x02\xc9\xce\x1f\xba\xbe\x54\x15\x83\x3e\x18\x3c\x1a\xa1\x9a\xcb\x4a" + + "\xa4\x85\xc8\x8b\x4a\xe8\x1c\x86\xcb\xab\x6c\x2d\x96\x85\x31\xca\x08\x69\x87\xbc\xd6\xd5\x5c\x48\x91\x16\xd3\x15" + + "\x7c\xc7\xbd\x25\x66\x35\x9d\x0b\x69\xc4\x9b\x22\x05\xe4\xe8\xf6\x04\x2c\xde\xc0\x94\x69\xd8\xfe\x42\x7e\xd0\xf9" + + "\xa5\x9f\x94\xa9\x41\x89\x7b\x7a\x37\xd7\x46\xc8\xe9\x54\xe5\xd5\x4a\x56\xca\xe0\x4a\x72\xa5\x52\x31\x2b\x68\xef" + + "\xa7\xa5\x42\xc4\x11\xc5\x4c\x48\x51\x2a\x99\xf1\xdc\x2c\x08\x06\x97\x03\x71\x25\x4b\x8b\x6a\x63\x51\xaa\xdf\x57" + + "\xba\x54\x49\x87\xf0\xa3\xd3\x4d\xe8\x83\xee\x11\x7f\x72\xaa\x94\xa8\xf4\xf4\x83\xaa\xc4\x83\xc3\x2f\xbf\xfa\xf2" + + "\x5b\x1c\x6c\x51\x94\x4a\xe8\x7c\x56\x40\xab\xfa\x96\x32\x96\x0c\x2c\x20\xc4\x31\xb4\xda\xe1\xe5\x79\x24\xaa\xca" + + "\x95\x12\x5d\x31\xa2\xb7\x0e\xc7\xae\x2d\x1e\xec\x10\x5a\xed\x5e\xfb\x9e\xdc\x9b\x9d\x6a\x5e\x16\xd7\x22\x57\xd7" + + "\xe2\x55\x59\x16\x65\x22\x3a\xbc\x26\x5e\xd1\xf6\x7d\xe9\x08\x5a\xdc\xce\xce\x2d\xfd\x53\xaa\x6a\x55\xe6\xc2\xcd" + + "\xef\xda\x36\xb8\x85\x7f\x6e\x85\xca\x8c\xa2\x71\x6b\x4b\xa0\x76\xb7\x70\x02\x86\x43\xf1\x56\x1a\xd8\x12\x6d\x84" + + "\x9e\x05\x58\x08\x48\x93\xaa\x99\xce\x55\x2a\xd6\xaa\xba\x7f\xef\x36\xe1\xa3\xc0\x6d\x76\xe1\x08\xc0\xf9\xc5\x36" + + "\x1d\x71\x6c\x5f\x8c\xb0\xb7\x9e\x08\x40\x83\x2f\x7a\x22\x2f\xfe\xca\x13\xa0\xf3\x37\x1c\x8a\x17\x32\x7f\x88\x48" + + "\x8a\x33\x98\xa8\xa9\x5c\x19\x25\x8c\xba\x52\xa5\xcc\x84\x5c\x2e\x8d\xd0\x48\xa8\x00\xd3\x9e\x9f\xbe\x1d\xbc\x79" + + "\xf5\x4e\x54\xa5\x9c\x2a\xfc\x1c\xb0\xc7\x54\x72\xfa\x41\x5c\x69\x29\x64\x79\x89\xa0\x32\x83\xa9\xcc\x32\x55\xd2" + + "\x3f\x0a\x8f\xcb\xf7\xba\x54\xb3\xe2\x46\xa4\x5a\xc1\x4a\xf1\xeb\x75\xb1\x12\x55\xb9\x16\x55\x41\x5d\x0a\xd8\x9d" + + "\xd5\xe5\x5c\x74\x70\x12\x55\xa9\xe1\x78\x43\x27\x62\x3a\x97\x3a\x37\x03\x91\x3c\x38\x7c\xf2\xe4\xc9\x57\x5d\xfc" + + "\xfe\x74\xb5\x04\xdc\x19\xb9\xce\x0f\xbf\xd9\x87\x17\xb0\x36\x40\x57\x59\x96\x62\x2c\xce\x2e\x8e\xec\x03\x03\x34" + + "\x4c\x8c\xe1\xc5\x00\xff\x76\x6f\xa6\x45\x3e\x95\x15\xbf\xa2\x1f\xee\xdd\x72\x65\xe6\xfc\x06\xfe\x74\xcf\x75\x9e" + + "\xaa\x9b\x1f\x67\xfc\x8a\x7f\xf9\x1e\x33\x69\xcc\x63\xd8\x33\x31\x16\x7f\xdc\xba\xe7\x55\x71\x5a\x95\x00\xcd\x71" + + "\xd0\x64\x60\x9f\xba\x66\x73\x69\x7e\xbc\xce\xe3\x46\xf4\xec\x2d\x12\xac\x6a\xed\x57\x45\x60\xf0\xc3\xf0\x8b\xfb" + + "\xf7\xe0\x24\xfe\x6c\x88\x76\x4d\x8b\xb2\x54\xd3\xca\xe1\x33\x90\x84\xa2\x84\x7d\xcd\xd6\x84\xeb\x8c\x3f\x76\x17" + + "\x45\x62\x64\x9e\x4e\x8a\x9b\xee\xfd\x7b\x3b\xee\xab\x31\x37\x73\x87\xab\x87\x94\xfc\x4a\x95\x06\x28\xc8\x58\x74" + + "\xf0\xf6\xeb\xd0\xe3\xe1\x50\xbc\x44\x04\x15\x52\x64\xc5\x54\x66\x62\x5a\x2c\xd7\x40\x67\x1c\xe9\x74\x34\xc5\xe3" + + "\xab\x51\x99\x82\x13\xd3\xc3\x9b\x4b\xdd\x54\x01\x89\x7f\x37\x57\x96\x0c\x11\xfd\x17\x48\xdd\xaa\x95\xcc\xb2\xb5" + + "\x78\xbf\x32\x15\xae\x56\xe7\xba\x82\xaf\x4d\x55\xae\xa0\x2b\xf1\x50\xe5\x73\x99\x4f\x55\xfa\x90\x3b\x7a\x03\x14" + + "\x10\x9b\x69\x3b\x1b\xe8\x0a\x51\x36\x15\x09\xf6\x24\xb3\xac\xb8\x16\x0a\x28\x05\x20\xe9\x84\x30\xf4\x3a\x87\x4f" + + "\x88\xaa\xe3\x1d\x9e\x02\x84\x2c\x3d\x00\xda\x42\xdd\x0d\x66\xf9\x00\x06\x68\x5d\x10\x92\x00\x07\x24\x87\xc9\xcf" + + "\xf3\xb4\x2c\x74\xfa\xf4\x4b\x60\x20\xe0\xcd\x6b\xf9\x41\x09\xb3\x2a\x95\xb8\x56\xa2\x2a\xf5\x42\x7c\xf7\xe3\x6b" + + "\x3c\x51\x6f\xbe\x3b\x7d\x7b\xff\xde\x4e\x89\x0f\xc7\x62\xf8\xeb\xd9\xb9\x39\x5f\x7d\xff\xea\xfb\xef\xcf\x6f\x9e" + + "\x1f\x5c\xec\x6f\x6a\xbf\xbf\x18\x5e\xba\xf1\x5e\xcb\x6a\x3a\x57\x46\xa4\xd2\xcc\x55\x8a\x47\x0d\x6e\x92\xa2\x14" + + "\x53\xb9\x50\x99\xfe\xbb\xce\x2f\xa1\xef\x85\x79\x5b\xaa\x99\xbe\xc1\xfe\xfb\x0b\xd3\x1f\xc2\xb5\x58\xc2\x67\xcf" + + "\xb3\xe5\x5c\xc2\xf3\x7e\x72\x76\x9e\xca\xfe\xdf\x2f\xba\xc3\x4b\xed\x46\xf8\x19\xd8\x8b\xc9\xda\x82\x02\xbb\x7d" + + "\x21\xe1\xfa\x22\x18\x4f\x80\x68\x54\x85\x28\xd5\x32\x93\x53\x95\x00\x08\x67\xbe\x55\x88\x0e\x32\xcb\x7a\x22\x53" + + "\x55\xa5\x4a\x8b\x08\x0c\x6b\x7a\x38\xa8\x8a\x9f\x97\x4b\x55\xc2\x87\x09\x01\x16\x8f\x81\xdb\x05\x31\xb6\xd3\x58" + + "\x96\x45\x55\xd8\x33\x49\x13\x05\x84\x9a\xae\x4a\xb8\x9c\x85\xc5\x62\x87\x9f\x62\xa2\x00\x30\x2b\xa3\x52\x40\x55" + + "\xbc\xec\x46\xb6\x19\xad\x35\x40\xb2\x11\x7f\xe5\xb7\xb5\x92\x65\xc5\x17\x49\x2e\xd4\x62\x59\xad\x1d\x2e\xdc\xbf" + + "\xb7\x63\xff\x1c\x89\x8e\x3f\x2f\x30\x9f\x54\xcd\xe4\x2a\xab\x44\xa6\xf2\xcb\x6a\x4e\xd7\x72\x03\xe9\x0f\xee\xdf" + + "\xdb\xa1\x06\x23\x71\x40\x9f\x57\xc5\xf3\xb2\x94\xeb\x91\x07\x5e\x0c\x2f\xa4\x79\x48\x95\x13\x22\xf8\x35\x34\xfc" + + "\xab\xa2\xd3\xf3\xa6\x9a\x0b\x95\x29\x3c\xf0\x3a\xc7\x47\x0b\xc4\x98\xd4\x3d\x36\xaa\x12\x3f\xfe\x14\x7f\x76\x3d" + + "\x2f\xb2\xf6\x96\x12\xee\xd5\x69\xa6\x64\x0e\xb4\x52\xc2\xb9\xbf\x54\x55\x30\x4f\x91\xaf\x16\xb5\xcd\x85\x27\xbb" + + "\x63\x91\xaf\xb2\x0c\x58\x01\xbc\x5a\x87\x43\xf1\x13\xbd\x75\x27\xbd\xc8\x95\x1b\x6a\x56\x16\x0b\xba\x93\x14\xf2" + + "\x51\x3b\xd4\xef\x53\x71\x20\x8e\x71\xc1\x67\xf8\x7b\x1f\xff\x1e\x30\x74\x2f\xf8\xc6\xa4\x77\x17\xc4\x5a\xd4\x46" + + "\x83\x2b\x08\xfa\xe5\x81\xe0\x52\x6c\x2c\x68\x67\xe7\x63\xe0\x7d\x07\x67\xd9\x7e\x01\xbb\xea\xba\x83\xf3\x8c\xd7" + + "\x8c\xae\x44\x91\xc3\x7d\x68\x2f\x56\xfa\x32\x21\x98\x00\x2e\x12\xf7\x76\xdd\x06\x66\x38\x43\xd0\xcb\x29\x7c\x18" + + "\x02\x17\xda\x18\xc7\x75\x43\x87\xdf\xad\x74\x96\x0a\x19\x50\xab\xb6\x0e\xa1\x31\xdc\x30\xa5\xaa\xfc\x19\x5a\xa8" + + "\xf2\x52\xd1\x02\x07\x01\xf2\x27\xc0\xa1\xd2\x38\x47\x6e\x98\xe7\x69\x4a\x9b\x94\xa5\x16\x73\xe3\xe5\x89\x04\x51" + + "\xa3\x54\x33\x60\x8f\xa7\xca\x52\xd2\xc1\xb2\x54\x57\x3f\xd2\x17\x63\x1c\xeb\xc8\xbe\xb1\x24\x74\xec\xa6\x00\x3f" + + "\xfd\x98\xbc\x65\x0c\xa7\x6c\xdd\x9f\x15\xe5\xa2\xb9\x2e\xc6\xb2\x52\x55\xf1\x26\xbd\x62\x7e\x5f\x7a\x32\x05\x74" + + "\x11\x38\xa2\xf5\xb6\x43\x61\x54\x35\xe0\x8d\xfa\x7f\x8a\x95\x98\xca\x5c\x18\xb8\x5e\xa0\x8d\x63\x8a\x1c\x1d\x70" + + "\xdb\x2f\xcb\x4b\xd3\x13\x93\x55\xc5\xfc\x9f\xa1\x3e\x8a\x3c\x5b\x23\xc9\x11\x3a\xaf\x54\x99\xc3\xcd\x36\x00\xc0" + + "\x28\x39\x9d\x87\xdb\x6a\x27\xd8\xc3\x9e\x6a\xc7\x87\x77\x0b\xbe\x49\x98\x23\xac\xb7\x0f\x16\xbe\x90\xcb\xb6\x9e" + + "\x6b\x7d\x22\xc0\x1d\x86\x25\x0e\x23\xe4\x32\xa9\xf3\x9c\x00\xa9\x9e\xd0\x8e\xf5\xe6\x1e\x6c\xc7\x7c\x4a\xb8\x15" + + "\x61\x0e\xf3\xcf\xb7\xdd\x70\x62\x78\xa6\xb6\x12\xb4\xfa\x84\xe8\x04\xca\xe5\x32\x5b\xdb\x45\x7b\xf8\x77\xa3\x15" + + "\xcf\x74\x69\xaa\xbb\x3b\x56\xbf\x27\xe2\x20\xfa\x28\x93\x9f\xf2\x4d\xff\x30\xfa\x48\xfd\x1e\x82\xd6\x81\x04\x0e" + + "\x56\xa6\x72\x8b\xc7\x44\x8d\x50\xea\xdc\x79\x2f\xc6\x62\x5f\x8b\x7d\x01\xcd\x89\x7a\x41\xcb\x91\x9d\xcd\xd6\xfd" + + "\x10\xcf\xc6\xe2\x00\xc4\xe6\xf7\xe2\x29\x7e\x72\x2c\xce\x88\xb8\xbd\xbf\x40\x42\x77\x76\x11\x4f\x2d\x4f\x3f\x02" + + "\x5b\x7f\x0c\x37\x9b\xe6\x99\x07\xe2\x5c\x23\x72\x20\x06\x5b\xbc\x05\x2c\x46\x74\xe6\xd3\xf1\x9d\x9a\xcb\x2b\x65" + + "\x04\x4a\xe3\x32\x17\x78\x5b\x3d\x34\x62\xa1\xaa\x79\x91\xf6\x90\xa7\xa2\x77\x8e\x28\xe1\x9b\x01\x13\xb6\x11\x12" + + "\x49\x80\x91\x41\x6e\x09\xf9\xf8\xa2\x44\x59\xdd\x2c\x09\x53\xf0\x19\xfe\x7d\xff\x5e\xc4\x07\xa8\x9b\x4a\xe5\xa9" + + "\xa7\x63\xb3\xdc\x3f\xaa\x81\x00\xb6\xa6\x58\xc2\x03\xd3\x13\xb9\x5c\xa8\x9e\x30\xe5\xb4\x87\xcc\x2b\xfd\xf7\xc4" + + "\xe0\xdc\x7b\x62\x9a\x15\xb9\xc2\x5d\xab\x64\x79\xa9\x48\x84\x60\x8c\x3b\x3b\xb8\x00\xa8\xfd\x71\x8b\xef\xb5\x18" + + "\x8b\x43\xfc\x8b\x2f\x9e\xa0\x65\xb8\xfb\xa9\x52\x4b\x98\x92\xcc\x0c\xc9\x27\x00\xb9\xff\x90\x79\x9a\x01\x5c\xf0" + + "\x2d\x32\xd1\x46\x83\x3c\xaf\x8b\xbc\xa6\x48\xb1\xf3\x00\xf9\x70\x52\x14\x70\x47\x39\x1d\x09\xf7\x4d\x4d\x3c\xc9" + + "\x34\x1f\xf4\x12\x89\x15\xb7\xc7\xfb\x08\x7e\x53\xc3\x2d\xab\x13\x5a\xf0\xfa\x10\x27\xf5\xfe\xbe\x93\x6b\x83\x29" + + "\x4f\x81\x9d\xbb\x9e\xab\xdc\x4e\x0c\xf8\x75\xcb\x71\x16\xa5\x30\x05\xec\x31\xfc\x48\x96\x85\x31\x7a\x92\x01\xf7" + + "\xee\xd7\xd9\x6d\x5f\xde\x6e\x4d\x4f\xb4\xcb\xbb\xaa\xcd\xf7\x76\x2f\xa9\x65\xd7\xae\xdd\xad\x80\xe6\xeb\xe6\xc9" + + "\x48\x60\x45\x80\xca\xa8\x6c\x06\x0c\x3e\x92\x61\xe0\x2e\x9c\x40\xa4\x8d\x58\x4a\x43\xbc\x20\x4e\x49\x23\x94\x79" + + "\x3b\xeb\xc3\xb8\x4b\x4b\xf7\xfb\x7e\x40\xb8\x4b\x12\x71\x84\xe7\x9a\x3e\x3c\x12\x7a\x7f\x3f\x90\x70\x7e\x84\x71" + + "\x53\x52\xc2\x54\x73\x91\x17\x79\x1f\x8e\xd9\xd0\xc9\xfa\xe2\x4a\x66\x2b\x85\xea\x1d\x9c\x45\xc2\xa8\xda\xd8\x9c" + + "\xae\xe3\x9f\x2c\x15\xc6\xfb\x0d\x97\x8b\xbb\x0d\x5b\x43\x30\x24\x65\x0a\xce\x0d\xf0\x1d\x76\xc0\xf6\xea\x94\x27" + + "\xa6\x9c\x3a\xdc\x39\xa3\x66\x17\xac\x12\x41\x84\x1c\xdb\x4f\x82\x97\xf4\x7a\x38\x14\x6f\x4b\x75\x05\x30\xcc\xe1" + + "\x22\xed\xab\x1c\x15\x0a\x59\x51\x2c\x03\x95\x4d\x80\xb9\xd8\xa1\x57\xdb\xc0\x25\xaf\xf3\x95\xf2\x1a\x18\xd7\xf1" + + "\x4f\x6a\xba\x2a\x8d\x42\xed\x89\x7a\x58\x2a\x01\xfc\x09\x74\xbe\xcc\x24\xac\x02\x97\x67\x00\xd3\xf0\xde\x35\xc1" + + "\x78\x88\x63\x7b\x7b\x34\xd8\xde\x9e\x70\x17\x9a\x36\x6f\xe1\x63\x22\x7c\x09\x62\x21\x20\x7a\x12\x9c\x7c\x4f\x47" + + "\x34\x3d\xa0\x66\x80\x6d\x7e\xda\x38\x4a\xf8\x91\x7f\xb5\x13\xf7\x65\x4f\x3b\xbf\x03\xa2\x22\xc6\x40\x74\x90\x98" + + "\xc7\x03\x99\x72\xda\x15\xc7\xf8\x72\x64\xb5\x1b\xf8\x59\xa8\x73\xba\xab\x9b\x70\x71\x51\x67\x7c\x92\x43\x08\x93" + + "\xa8\x7c\xa5\x4a\xb1\x28\xae\x94\x28\x4a\x7d\xa9\x81\xb2\x33\x5c\x99\x00\x02\x3a\x2d\xac\x8a\x2d\x42\x10\x0f\x27" + + "\x3a\x67\x04\x75\x4b\x37\x79\x9f\x43\x44\x79\x59\xe4\x0f\x2b\x31\x41\xf2\xa0\x73\xd1\x86\xf5\x6e\xa5\x0e\xbe\x48" + + "\x0e\x7c\xd3\x40\xdf\x57\x9f\x0c\xb4\x8e\xf4\x78\xf8\xdf\xdb\x90\x20\x04\x0c\xe4\xa2\x48\xf5\x4c\xab\xd4\x9f\x12" + + "\x7b\x39\x5a\x0a\xda\x72\xc5\x24\x2c\x59\xfe\x9c\xeb\xdf\x57\x8a\xb8\x47\x39\x9d\xd7\x54\x1f\xa2\xa0\x21\x96\xf2" + + "\x52\xc1\x4d\x7c\xb3\x94\x79\x5a\x8c\xac\x42\xb2\x83\xb7\xbf\x15\x48\xf7\x41\x62\x9f\x0f\x4a\x68\xb2\x48\xba\xa2" + + "\x3b\xb0\x72\xb3\x18\x9e\xbf\x1c\x5e\xf6\x44\xa7\x23\xba\xee\x0e\x7e\x6e\xcc\x6a\xa1\x02\xad\x46\xa9\x64\x4a\x5a" + + "\x9e\x62\x45\x62\x13\x3d\x21\x1d\x2c\x90\x33\xf3\x13\x3c\x18\xa1\x76\x95\x79\x83\xb2\x04\xd1\xd4\x73\x2e\x0b\x73" + + "\xe9\x88\x5c\x5d\x8d\x8a\xef\x02\x46\x20\x2f\x8a\x65\xcc\x59\x04\xca\x0e\xa5\x44\xa5\x4c\x35\x5c\xe5\xba\x1a\x4e" + + "\x8b\x52\x0d\xde\x1b\x04\x53\xaa\x2a\xa9\x33\x83\xda\x38\x45\xe2\x8e\xa7\xe7\xcc\x43\x9c\xea\x7c\xaa\x1c\x60\x0e" + + "\x07\x4f\x7a\xe2\xe5\x8f\xaf\x99\x51\x20\x49\xca\x0e\x6b\x19\x8d\x4c\x95\x15\x7d\x2c\x4b\x05\xd8\xc5\x1a\x33\x95" + + "\x0e\x40\xdc\x5e\x0b\xa7\xca\xcd\x90\x5f\x11\x27\xaf\x44\xf2\xe0\xf1\xb7\x5f\x7f\xd3\x1d\x20\x6c\xec\x14\x42\x68" + + "\x14\x93\xf7\xed\x1c\x37\xdc\x53\x49\x31\x79\xdf\xa5\x2b\xd8\x7e\xd1\x09\xa0\xc3\x27\x79\x44\x0c\x90\x3d\xd8\xf6" + + "\xdd\x2f\xa8\x60\xbb\x7b\x2c\x78\x62\x89\xfb\xde\x1e\xfe\x84\xd1\x8a\xc9\xfb\x01\xe9\xe7\xa2\xd1\xde\xac\x16\xaa" + + "\xd4\xd3\x2d\x5d\x0e\x87\x62\x29\x4b\xa3\xbe\xcf\x0a\x59\x89\x37\xf2\x8d\x01\x49\x18\x3e\xe8\x4f\xa5\xa9\x18\x2c" + + "\xcb\xc2\xe8\x4a\x03\xf7\x86\x5c\xdf\x06\x10\x65\x83\xaf\x36\x9d\x4e\x97\xfb\x19\x0c\x06\x20\xce\x2c\xb4\x41\x16" + + "\x70\x59\xaa\xca\x88\x4c\x49\xa0\xf6\xfd\x7c\xb5\x98\xa8\x92\xaf\x7e\xd3\x83\x41\x2b\x3d\x5d\x65\xb2\xcc\xd6\x62" + + "\xae\x6e\x44\xa6\x2b\x55\xca\xcc\x88\xa4\x73\x70\x33\x18\x0c\x5c\xb7\x66\x35\xa9\x4a\x89\x33\x07\x3c\x99\x2a\x10" + + "\xc0\x67\x3a\xd7\x95\x56\x46\x54\x05\x4c\x3a\x00\xce\x6e\x8d\x60\xf2\x62\x19\x4e\xfd\x60\xb5\xf6\x15\xb0\xcd\x11" + + "\xc4\x02\x12\xb9\x1d\x6a\x6f\x8a\x2a\xbe\x65\x46\xfc\xa2\x2f\x9e\xe7\x4e\x55\x53\x94\x44\xba\xc4\xf5\xbc\x00\x9a" + + "\x65\x79\xe3\xb3\xb3\x17\x99\x34\xe6\xe2\x82\x4d\x50\xd5\xda\xea\xfd\x3b\x67\xfc\x29\x4d\xe0\xa2\xe3\xba\x05\x4c" + + "\xcf\x8b\x54\x19\xf7\xc4\x1b\x6a\x90\x18\x86\x38\xc8\xb3\x8d\x38\xa5\xcd\x06\x71\x04\xfa\x78\xb7\x5e\x2a\xf8\xed" + + "\x80\x45\x78\x67\x3f\xab\x09\x6e\xfe\x82\xe2\xab\x01\x87\x83\xbe\x42\x2d\xeb\xde\x1e\x91\xd6\x5d\x52\x55\xb3\x94" + + "\x57\x6b\xe5\xb5\x70\x3d\xd1\xd1\xe6\xad\xfd\xf5\xe3\xac\xf3\x09\xe3\x0e\x87\xe2\x64\x46\xd6\x38\xde\x16\x31\x97" + + "\x06\x4e\x35\x7d\xa1\x52\x21\x33\xa4\x6e\x3d\x66\x08\xa6\x45\x3e\xd3\x29\x30\x1f\xd5\x5c\x5a\xfb\xda\xa6\x98\xbc" + + "\xdf\x10\x2f\x1a\x6e\x61\x8f\x8c\x61\xa4\xbb\xfc\xe3\x16\x36\xcf\xcd\x5c\xa5\xcc\x91\xa9\x6b\xde\x99\x50\x5a\x2a" + + "\x89\x3b\x71\x18\xf4\x6a\xb1\xac\xd6\x77\x62\x10\x48\x19\x70\x2f\xe1\xea\x6a\xbc\x97\x6f\xd5\x0a\x88\x6d\xc3\x02" + + "\x18\xb7\x8c\x66\xf7\x4b\x8c\x6b\x3c\x61\x40\x51\xf6\x45\xa7\xe3\x87\x68\xd1\x4b\x8b\xa7\xe2\xcb\xc1\x41\x4f\xe8" + + "\x1f\x4f\xc5\x53\xf1\xb5\x70\x36\x5e\x6d\xe6\xe2\x27\x75\xf9\xea\x66\x19\xea\xc2\x99\x65\xb7\xd4\x29\xc4\xc2\xfa" + + "\x2b\x47\x26\xd9\xec\xe7\xcd\x1e\x67\xce\x64\x42\xe8\x84\xa4\x15\x05\x0f\xd7\x1f\xd9\x02\x7d\x97\x35\x8d\x0e\x1c" + + "\x3f\xb4\x7c\x4a\x61\xc8\x54\x8f\xea\x3b\xb6\xc6\xb1\x02\xe9\xfe\xbd\x1d\x7a\x00\xcd\x23\x5d\x48\x91\xaa\x70\xcb" + + "\xa8\x0b\x12\xd4\x75\x9e\xea\x92\x74\x54\xea\x4a\x66\xcc\xc7\xe0\x17\x8e\xef\xa9\x4a\xbd\xb0\xbd\x1c\x05\x67\x27" + + "\xec\x37\xc0\x6a\x7c\xac\xad\x73\x80\x04\xda\xa1\xd3\x1e\xd0\x88\xac\xb8\x5c\x59\x3a\x8c\x52\x1f\xd1\x46\x34\x93" + + "\xc1\x4d\xae\xc4\xb2\x94\x97\x0b\xd9\x73\x36\x6b\xec\x6b\xb2\x16\x3a\x07\x38\xc1\x75\x2a\xdd\x67\x04\x88\x4a\x02" + + "\x97\xc5\x1a\x39\x6b\xd2\x19\xd0\xda\xec\x24\xad\x69\x2b\x09\xcd\x72\x74\xbb\x1d\x06\xd2\x01\x75\x38\xf6\xbd\xd0" + + "\x49\x7a\x45\x2a\xb3\xa4\x43\x0d\x3a\xd6\x8a\x4a\x3f\x07\xac\xca\x83\x71\xf8\x85\xfb\x7e\xae\x64\x3a\x90\xcb\xa5" + + "\xca\xd3\x17\x73\x9d\xa5\x89\x9d\x74\x77\xb0\x84\x8b\xbc\x42\xd3\x78\xa9\x80\x31\xad\x35\x60\x43\x6c\xc8\x0f\x83" + + "\x64\x55\xcd\x55\x79\xad\x8d\xea\x09\x79\x05\xd8\x0c\x8b\xb6\x24\xd5\x59\xc1\x7b\x42\xe7\x46\x95\x21\x8c\x81\xa9" + + "\xc0\x71\x64\x06\xe0\x5c\x19\x04\x65\x2e\xdc\xf6\x33\x2a\x01\x0e\xb0\x7c\xc1\x6f\x82\x8d\x8f\x78\x4d\x87\x9c\x2f" + + "\x8a\xfc\x4a\x95\x95\xb5\xc4\x54\x85\x70\x46\x90\x23\x52\x02\x4e\xd6\x84\x17\x86\x98\x9b\x54\x56\x92\xf9\x36\xd6" + + "\x17\xbe\xd6\xd3\xb2\x30\xc5\xac\x82\xbb\xf1\xb2\xa8\xa0\x93\xf9\x6a\x81\x12\xbd\x2e\xc5\x95\xca\xd3\xa2\x14\x4b" + + "\x32\xe4\x24\x0f\xbe\xfd\xea\x2f\x8f\xe1\x90\xba\x71\x42\x64\x67\xb9\xbc\x66\x36\xa0\xd3\xe7\x58\x4e\x67\x16\xea" + + "\x89\xce\xc2\xf4\x3b\x21\x3b\xea\x6d\x43\x3d\x11\xd8\x73\x62\xde\x30\x55\x6f\xe4\x42\xd5\x35\xd4\xa4\x6a\xa9\x8d" + + "\x0d\x2f\x06\xf6\x0b\xb8\xc2\xa3\x07\x83\xaa\xf8\xa1\xb8\xb6\xa6\x1f\x44\xc9\xbc\xf1\x38\xa6\x06\xa8\xfa\xd4\xc4" + + "\x6f\x06\x7a\x2a\x79\x49\x9a\xaa\x16\x35\x6b\x31\x79\xdf\xd4\x9d\x7a\x7a\x80\x97\x3b\x93\x03\x31\x46\x53\xcc\x4e" + + "\xa0\xe3\x81\xcb\x2f\xd4\xed\x69\x27\xf3\xf1\x5f\xc0\xa3\x32\xa5\x0e\xc9\x43\x38\x0c\x6b\x1b\xea\x42\xe4\x47\x74" + + "\x09\x3b\x30\x3f\x60\x3c\xc6\x5e\xed\xca\xaa\xd1\x62\xf2\x1e\x35\x04\x81\x26\x38\x14\x59\xf9\xb3\x31\xcb\xa5\xa1" + + "\xd8\x3a\x29\x95\xfc\x10\x48\x89\x81\x20\x15\x49\x9f\x34\x37\x5d\xbf\xcc\xfe\x87\xa7\xe4\x0d\x11\xc2\x2c\xd5\x54" + + "\x93\x13\x92\x81\x6b\x1e\xb0\xd2\x3a\xc0\x2c\x0a\x53\x89\x29\xfa\x0a\x91\xca\x72\x86\x12\x1b\x9e\xd6\x70\x55\x7f" + + "\xda\x36\x38\xbe\x88\x97\xac\x7b\xee\xc7\xff\xd9\xcd\xf8\xf7\x4f\x2c\x60\xe5\x3c\xe7\xf1\x49\xd6\x70\xb8\x48\xc3" + + "\x73\x19\x7a\x06\x58\x86\x03\x6f\x13\x6f\x34\xdc\xd9\xd9\xe9\x58\xf6\x80\x3f\xd8\x47\x51\x39\x20\x58\xd0\x2d\xc9" + + "\xcf\xf1\x2c\x4a\x65\x56\x59\xf5\x11\x5a\xb1\x90\x1f\x54\xdd\xe6\x2a\x64\x59\xf6\xdc\xe7\x01\xa5\x20\x33\x9a\x7d" + + "\xb1\xd9\x78\xe5\x0d\x9f\xf8\xb2\xa1\xb0\x0b\x31\x8e\x08\x05\xeb\x6d\x64\x59\x46\xba\xa6\xd8\x38\x57\x2a\x66\x50" + + "\x1c\x57\x84\xbe\x30\xc0\x68\x11\x31\xb7\x6c\xd6\xce\xce\x19\xbe\xba\x10\xa8\x39\xa7\x67\x6d\xd7\x27\xea\xdf\x19" + + "\x3d\xa0\x77\xfc\xaa\x76\xad\xdd\xdf\x66\x56\xd3\x79\x03\x46\x44\xf0\x11\x52\xba\xb6\x89\x34\x55\xde\x43\xd1\x3f" + + "\x14\x23\xeb\x6a\xc3\xe3\xe3\x57\xce\xc0\x14\x5a\xb1\x60\xf5\xe1\x28\x68\xe4\xe9\x09\xa3\xa6\x45\x9e\x36\x0d\x2f" + + "\xfb\xf4\xa2\x61\x7b\x39\xf0\xe4\x1c\x7b\xe0\x06\xbc\x59\xf6\xbc\xb3\x8d\xe5\x48\xbc\x0f\x0e\x3b\xb6\x3f\xc3\xf3" + + "\x7f\x21\xc6\x3c\xf2\x99\x78\xcf\xaa\x52\x86\x52\xd8\x2b\xdc\x04\x47\x11\xf0\xf0\x6d\xb0\xac\xcb\x52\x2d\x1b\xe6" + + "\xdc\xf0\x4a\xd2\xc4\x43\x04\xeb\xb3\xef\x4e\xe0\x8d\xe1\xeb\x69\xc1\x5e\x1f\x63\x71\x76\xb1\xfd\xc2\xc2\xde\x23" + + "\x90\xd8\xce\x5e\xdd\x2c\x89\xd7\xdd\xa5\x01\xbd\x01\xe1\xaf\x85\xf3\xdd\x22\x9b\x27\xda\x46\x50\x83\x6e\xe4\x95" + + "\x35\x5b\xeb\x4a\x2d\xac\xe4\x8a\xce\x91\x4b\xf2\x7d\x53\xc4\xe4\x4a\x90\x20\xed\x2a\x43\x40\x6f\x23\xac\xb5\x45" + + "\xc2\xc4\xec\x23\x06\x92\xa5\x62\x16\x53\x89\xa7\xad\x7d\x06\x02\x72\x6d\x89\xee\x58\x31\xc8\xd0\xc8\x16\xf6\x79" + + "\x07\xea\xf3\x27\x0d\xae\xe3\x63\x84\xe4\xee\x2d\x86\x0e\x3e\x9d\xe9\x68\xee\xe1\x16\xb6\x83\x2d\xf6\x3d\x2b\x09" + + "\x7a\x7f\xb9\x3b\xf6\xb5\x2a\x65\x6e\x32\x89\x02\x05\x6a\x36\x8b\x99\xdf\x5f\x41\xc2\x84\x2e\x51\x4e\xae\x99\x2a" + + "\xea\x77\xe7\x47\xaf\xce\xfa\x05\x55\xdb\x57\x86\x8b\xbb\x98\x82\x7b\xa9\x4e\x49\xd9\xad\x00\xf7\x91\x5a\x74\xeb" + + "\x7a\xe0\xe6\xa2\xc9\xea\xff\x41\x39\x6d\x2d\x6b\x09\x1a\x9c\x41\x70\xc3\x06\xce\x16\xff\xe3\x2b\x08\x97\xf1\x7d" + + "\x26\xab\x4a\xe5\x42\xe6\x6b\x91\x2b\x53\xa9\x34\xb0\x80\x58\x73\x3c\x7a\x3a\x5a\x16\xec\xec\xa2\x87\x77\x54\xed" + + "\x22\x7c\x6e\xc5\x9b\xbf\xfe\x7c\xf2\x52\x4c\x8b\x15\x20\x30\xa2\x32\xab\xbd\x80\x44\xad\x74\x3a\x42\xf3\x26\x5b" + + "\x7a\x75\x9e\x0a\xe9\x55\x34\x55\x21\xa4\x95\xb4\x7b\x6c\x27\x42\x8f\x3d\x54\x02\xe2\x5f\x38\x09\x12\xac\xd6\xee" + + "\xd0\xb0\x79\xf4\xfe\xbd\x9d\x65\x59\xdc\x44\x37\xc8\x2c\x6f\xf8\x07\xa2\x7f\xe5\x62\xd9\x63\xcf\x0a\xfc\x24\xbc" + + "\x61\xf9\x2e\x74\x1e\x24\xe1\x7d\x68\xa1\x5c\x2d\xd0\xfa\x9a\x9f\xb9\x66\x6c\xe4\xf2\x7e\x27\xb3\x9c\x9e\xa0\x67" + + "\x59\xb5\x58\xd6\xd4\x53\x7f\x5b\xe9\xe9\x07\x31\x9d\x2b\xf2\x70\x4b\x55\xa5\xca\x85\xce\xd1\x5c\xe1\x6d\xa0\x80" + + "\x0f\x72\x92\xa9\x9e\x75\x26\x01\x06\xd5\x11\x47\x6d\xc8\xd5\xd0\x08\x29\xde\xad\x97\x0a\xd5\xec\xe4\x2b\x72\xad" + + "\xc4\xb5\xce\x32\xf2\x80\xe2\x7d\x74\xa6\x8f\x81\x5b\x6b\x8b\x41\x54\xcc\xf2\xa6\x82\xcd\x7d\x5a\x5b\xc5\xa9\x5e" + + "\xac\x32\xd2\x84\xe9\x3c\x85\x87\xc8\x97\x8f\x23\x27\x32\xb7\x43\x3d\xf1\x98\xb1\x11\x81\xde\x34\xa9\xfb\xcb\x2d" + + "\xb7\xe8\x66\x01\xca\x8e\x05\xb4\x6b\xec\x7c\x9b\xb4\x0f\x83\xd3\x67\x37\x11\x4f\xa5\x4e\xd9\xff\x0c\x90\x10\x68" + + "\xd1\x8a\x0c\x2f\x73\x34\x40\x97\xc2\xfa\x1b\x81\x00\x59\xcc\xbc\x09\x8b\xdf\xf7\x84\x29\x84\xae\xd0\x6b\x67\xa2" + + "\x48\xce\x47\x13\x2f\x2d\x65\x80\xbd\xc2\xa6\xd7\xff\xf2\xba\x53\xf8\x89\xd6\xef\xe0\x68\x59\xe4\xf3\x52\xef\xf5" + + "\x08\x63\x26\x06\x79\x71\xed\xce\x09\x77\x60\x5d\x78\x59\x01\xcc\xce\x3f\xe2\x45\x51\x2a\xdc\x73\x8a\xe3\x58\x96" + + "\x05\x19\x33\x65\x55\x01\xd9\x45\x32\x4b\xfd\xb0\x0a\x99\xd5\xe1\xba\xe2\x35\xe5\x4a\xa5\xf8\x44\xdd\x68\x83\x7a" + + "\x1d\x63\x79\x6b\xfe\xe3\xfe\xbd\x5b\x22\x3e\xc3\xa1\x78\x5b\x2c\x71\xcb\x49\xdf\xe0\xfd\x97\x17\x72\xe9\x4d\x5c" + + "\x72\x3a\x4f\x3a\xdf\xb1\x9f\xc0\x1b\x52\xe9\xb3\x47\xb3\x45\x34\x32\x6b\xe0\x62\x59\x29\xc8\x5c\x2b\x59\x8b\x3a" + + "\xe8\x9f\x51\x25\x1d\xd1\xe9\x06\x2e\x43\x9a\xe4\x7f\x42\x97\x50\xfd\xe7\xd4\xe1\x1d\xb1\x4f\x2a\x82\x7d\xd1\xb9" + + "\xe8\x20\x7f\xd5\x2a\xed\xf3\x8a\x1c\xf1\x69\x0a\xda\xce\xcb\x63\x9b\x98\xce\x3e\xa2\x4d\x75\xfa\x51\x1c\xb8\x52" + + "\x57\x5e\x7e\x54\x9f\x5e\xd7\xe6\xde\xfa\xfe\x22\xc5\x3c\x69\xd7\xf6\xf6\x6a\xde\x05\x75\xb5\x2f\x7e\x1d\x68\x5b" + + "\x69\x3e\x48\xe7\x71\x32\x76\x7d\xe3\xb1\x38\x10\x9b\x8d\x5d\x5a\x31\x0b\xdf\x74\xc8\x32\xd3\x09\x86\x7b\x46\x6e" + + "\x44\x89\xfd\xdd\x47\x55\x9f\xb6\xc2\xda\x2d\x79\x9e\x53\xe8\x92\x18\xdf\xbf\x67\xa3\xa2\xf8\xc9\x8b\xd3\x53\x71" + + "\xca\xde\xad\xe2\x55\x7e\x09\xd4\xef\xea\x70\x70\x78\x30\x38\xfc\xf6\xf3\xc2\x9c\x0e\x9f\xfc\x5f\x11\xe0\xf4\x65" + + "\xff\xf0\x1b\x8e\x6c\x4a\xea\x81\x15\xd6\xb1\x12\x63\x02\x7a\xfe\x8c\xc1\x9f\xaf\x6e\x96\x65\x8f\xbc\x5d\xdf\xc1" + + "\xd5\x87\xa6\x81\xff\x7a\xfd\x43\x0f\xbd\x75\x3f\xa8\x5c\xff\x1d\xd9\xb8\x69\xb1\x58\xea\x0c\xff\x24\xaf\x60\xf8" + + "\xab\x58\xc1\xcd\x51\x98\xea\x05\x5f\x9c\xec\xf8\x74\x92\x2f\x57\xf8\x63\x2e\xcd\xcb\xd5\x32\xd3\x53\x59\x29\x47" + + "\x52\x7e\x40\x3f\x7b\xe7\xb0\x7f\x25\x01\x26\x3b\x46\x55\x2f\xbd\xc7\xfe\x4e\x1a\xff\xfd\x0a\x84\xa9\xe0\xf1\x89" + + "\xf9\x8f\x77\x34\xc9\x72\xb2\xba\xbc\x5c\xff\xed\xf4\xb9\xff\xc1\xce\xe3\x3d\xe4\x5a\xdd\x9f\xb0\x07\x52\xe7\xc6" + + "\xcd\xe3\x24\x37\x95\xcc\xa7\xaa\x8f\x9a\x97\x99\x9e\xa2\xea\xd2\x9b\xba\x05\x5c\xbe\xb8\xff\x70\xae\xfb\x09\xb0" + + "\x8b\x00\xf2\xa4\x8b\xec\xe8\x12\x7d\x42\x4b\x95\xbe\x2c\xa6\xad\x51\x07\x3b\xa9\x2e\xcb\x15\xba\xbd\x1c\xd0\xdc" + + "\xd1\xd9\x01\xff\x46\xf2\xf1\x42\x4e\xe7\xc8\x79\xa1\x1e\x1a\x7f\x25\x5d\x07\xf8\xad\x6f\x79\x2b\xca\xad\x0d\x60" + + "\x0b\x7e\x2c\x01\xaf\x22\x2f\xf5\x9e\x98\x44\xb6\x16\x89\x67\xcb\x3d\x8b\x36\x0b\xf8\x06\x3e\xc2\x91\x39\xe7\xa0" + + "\xee\x8f\x9d\xab\x52\x66\xfd\xe5\xaa\xc4\xd0\x2f\x34\x45\xc9\x1c\x39\x2e\x53\x95\xde\xe1\x61\x6c\x59\x1b\xf7\x08" + + "\x26\xfa\xfa\xf9\x7f\xfd\xf7\x9b\x57\x7f\x7d\xfe\xee\xe4\x3f\x5f\x09\x20\x27\x4f\x9f\x8a\x27\x87\x8d\x0d\xb2\xb6" + + "\x73\x42\x28\x8a\x3a\x49\xfe\xb8\xed\xd6\xe2\x4d\xa0\x47\x1b\x51\x83\x1b\x54\x2c\x6d\x54\x4c\xb1\xec\xb1\x87\xde" + + "\x7f\xe7\xb2\xd2\x57\x2a\x08\x97\xb1\x6f\x6a\x8f\x1a\xa1\x38\x3d\x1f\xae\x42\xee\x61\xcb\xa5\x4a\xfb\x29\x46\x5b" + + "\x70\xa0\x0d\xba\xf8\xc0\x3d\xfd\x10\xaf\x48\x21\x05\x8f\x56\xe4\xe8\xc3\xd0\x16\x8f\x03\x44\x30\x16\xab\x42\x66" + + "\x31\x96\x9d\x62\x57\xcc\xa3\x16\x11\x34\x96\x4e\xe8\x16\x98\x6b\x73\xa6\x2f\x70\xb3\xc3\xee\xdd\x9e\xea\x9a\xee" + + "\xdf\x3e\xef\x1f\x06\x9b\xcd\x8e\x77\x80\xcc\x1d\xe4\x1c\x55\xba\x21\x42\xa0\xd2\x8d\x34\xeb\x7c\xba\x91\xab\xaa" + + "\x98\x15\xd3\x95\xc1\xbf\x96\x99\x5c\x6f\x90\xee\x15\x99\xd9\xa4\x70\x56\x36\xa9\x36\xc0\x51\xa6\x9b\xb9\x4e\x53" + + "\x95\x6f\xb4\x59\xc8\xe5\x26\x2b\x8a\xe5\x66\xb1\xca\x2a\xbd\xcc\xd4\xa6\x58\xaa\x7c\x53\x2a\x99\x82\xdc\xb9\xe1" + + "\xa8\xb7\x74\x63\xa6\xc5\x52\xa5\x3e\x0a\xe1\x27\x75\xb9\xca\x64\x29\xd4\xcd\xb2\x54\xc6\xe8\x22\x37\xf6\xd5\x2f" + + "\x73\x5d\x29\xb3\x94\x53\x25\xa6\x73\x59\xca\x69\xa5\x4a\x63\xc9\xe9\xf5\xf5\xf5\xe0\xfa\x09\x92\xd3\x77\x3f\x0d" + + "\xa7\xc6\x3c\xe9\xdb\x28\x07\x33\x7c\x70\xed\x3e\xbd\x7f\x6f\xc7\xff\x80\x45\x9f\x9d\x9f\xdf\x3c\x3e\x38\x3f\xaf" + + "\xce\xcf\xcb\xf3\xf3\xfc\xfc\x7c\x76\xd1\x61\x94\xb8\xa3\xeb\x75\x5e\xc9\x9b\xe1\x03\x3f\x0f\x38\xbf\xf6\xc7\xab" + + "\x7c\x5a\xa4\x14\x69\xd5\x49\x8e\x47\xe7\xe7\xe7\xe7\x83\xcd\xd9\xf9\xf9\x75\xff\x62\x73\xf6\xeb\xf9\xf9\xcd\xc1" + + "\x41\xff\xfc\xfc\x46\x1e\x5c\x74\xf7\x3b\x01\xf9\x2c\x8c\xca\xd0\x35\x46\x65\x2a\x05\xc1\x0f\x6e\x33\x34\x20\xeb" + + "\x99\x86\xdb\x26\x1c\x0d\xe4\x23\x60\xa2\x7f\x5f\x15\x95\x75\x52\x12\x66\x5e\xac\xb2\x14\xb8\x49\x59\xff\xf8\x93" + + "\xe0\x24\x2b\xba\xce\x94\x7f\x48\x43\xd1\x59\x14\xb4\xee\x51\x7b\x67\x2f\x4e\x4f\x1f\x1f\x0e\xcd\x1a\x2e\x4b\x39" + + "\x98\x57\x8b\xec\x01\xce\xaa\x9f\xaa\x59\xdf\xcf\x04\x0e\x8c\x9f\xd6\x58\x34\xc0\xe6\x55\xa4\x9d\xeb\x4e\x4f\x74" + + "\xae\x1f\x44\x2e\x46\x76\x8a\x2e\xa0\xc5\x6c\x99\xcf\x47\xd7\xe5\x9e\x22\xf6\x9f\x9f\x9f\xc1\x7d\x10\x60\xc7\xbe" + + "\xe8\x3c\x4a\xe0\x59\x73\x67\xf7\x45\xa7\x9b\x1c\x8f\xea\x1f\xb0\x5c\xf0\xe3\x52\x95\xa8\x54\x4a\xa6\x72\x59\xad" + + "\x4a\x25\xd0\xf0\xb5\xd3\x79\x94\x9c\x3d\xfa\xf5\x8b\xcd\xee\x3f\x2e\x8e\xc7\xdd\x2d\x1f\x77\xfc\x0a\x49\x89\x21" + + "\x16\x20\x70\x4d\x54\x6d\x47\x8d\x38\xb3\xbd\x7f\x75\x81\x0e\xad\xe4\xdf\xe2\x1f\x3f\x41\x2f\x02\xfe\xf1\x25\x79" + + "\x73\x74\x1e\x25\xc7\xa3\x87\x89\x47\xcb\x5f\xe1\xdf\x87\x17\xdd\x47\xdd\x87\x9b\xf3\x4e\xfd\xc5\x79\x07\xde\x9c" + + "\x77\x36\x08\x87\x60\xdf\x00\x00\xdd\x4d\xeb\x1a\x3a\x8f\xce\xcf\x2f\x18\xaf\x97\x46\xad\xd2\x02\xe1\x3b\xba\x1b" + + "\x94\xe7\xe7\x09\x34\x60\x20\xbc\x2b\x44\xa9\xd2\xd5\x94\x44\x02\x76\xe0\x29\x66\x7e\xcf\x51\xc2\x40\xfd\x1e\x33" + + "\x33\x56\x9a\x5d\x96\xea\x7b\x9d\x55\x20\x5e\xd1\x4d\xee\x85\x38\xeb\x25\x73\x38\x10\x7c\x6a\xdc\xfe\x3c\x39\xf2" + + "\x80\x0a\xa1\xf6\x15\xed\x5b\xf2\xf9\x10\xeb\x6e\xfc\x6a\x1e\x0f\x84\xd1\x8b\x65\xa6\xfc\x80\x5f\x73\xc7\xb5\xaf" + + "\x93\xee\xd9\xf9\xf9\xc5\x05\x7c\x2b\x02\xf4\x04\x18\x3d\x0a\x7b\x7c\x02\x5c\xe8\x9a\xdc\x97\x51\x1b\x54\xc7\xb4" + + "\xc1\x23\x6e\xdc\xe9\x9e\x9f\xc3\x46\x79\x3a\x43\x5e\x51\xc8\xc5\xe6\x45\xde\x57\x66\x2a\x97\x2a\x15\x55\x29\x75" + + "\x06\x2f\xfc\x7e\xf6\x18\x0e\xf0\xd4\x14\x0b\x85\xed\xaf\x5b\xc9\xf0\xb2\x54\x53\xde\x90\xb9\x12\xa8\x01\x2a\x83" + + "\x20\x41\xe0\xb1\x48\x22\x4b\x44\xe7\xd7\xe6\x39\xdb\xdf\x00\x24\x7e\x65\x28\x5c\x74\x2d\x58\xba\x8f\x1a\x28\x26" + + "\x3a\xfb\x5f\x00\x59\xb8\x74\x54\xa1\x9c\x16\x8b\x85\xfc\x84\x51\x1e\xf5\x5a\x9e\x51\x37\xd8\xc9\x44\xe7\x12\x91" + + "\xeb\x13\xba\x4a\xce\x9e\xed\xff\x83\x36\x2a\x7e\xd3\x32\xe1\x47\x7e\xaa\x6e\x53\xff\x06\x18\xd8\x18\x69\xdc\x3a" + + "\xd2\xaf\xe7\xe7\x17\x0f\xcf\x3b\x17\x8f\x8e\xdb\x3a\xc7\xd3\x16\xc1\x83\x4e\x5d\xad\x6f\x7b\x14\x69\xb5\x11\x09" + + "\x6e\x2e\x36\x3e\xe9\x5f\xb8\xae\x91\xef\x06\xd9\x82\xe3\x18\x77\x3a\x27\x2f\x3b\xa3\x5a\x07\x0f\xee\x38\xe9\x0c" + + "\xed\x9d\xce\x8b\x1f\x9e\x9f\x9e\x36\x3e\x3d\x3f\x1f\x7c\xca\xc7\xef\x9e\xff\xb5\xf1\x69\xfb\x77\x8d\xcb\x04\xf6" + + "\x22\xee\xec\xf9\xbb\x77\x3f\x35\x7a\xab\x1d\x40\x6e\xfa\xf6\xf4\xd5\xcf\x2f\x7f\x6c\x6d\x1c\x81\x77\xa7\xf3\xe2" + + "\x3f\x4e\x7e\x68\x42\x66\x94\x20\xf7\x83\x76\x96\x4d\x26\x4d\xb5\xc9\xab\x39\xfc\x7f\x1f\x7e\x74\xfb\xc9\x74\xae" + + "\xb3\x74\x53\xcc\xfa\xc0\x56\x33\x59\x6c\xa3\xb1\x40\xc7\xd5\x95\xca\x37\x45\x9a\x6e\x92\xe4\x6c\xbf\x7f\xb1\xe9" + + "\x26\xe7\xe7\xe9\xa3\x6e\xde\xa4\xca\x02\xa9\x3e\xb7\xda\xd6\xdd\xf9\x79\xba\xdf\xdd\x74\xdb\x31\x0c\x29\x88\xe8" + + "\x68\x07\x34\xe0\x1b\x9b\x5b\x40\x37\xa2\xe3\x29\x01\xcc\x5f\x44\xdf\x71\x9c\xce\x0a\xfd\x11\x45\x86\x89\x4b\x30" + + "\x30\x1f\xa8\x23\x10\x69\xd8\xea\x81\x36\x89\xf5\xc0\xfc\x45\x61\x63\x54\x4c\x02\x4f\xfc\xf6\xc7\x53\x32\x74\xb0" + + "\x9b\xf6\x6f\x74\x23\xfc\x86\x93\x42\xad\x13\xcb\xac\xad\x9b\x54\x5b\x17\x1d\xe1\x91\x87\xa4\xfa\x7d\x73\x59\x6d" + + "\x32\xda\x16\xbf\x4b\x7e\x23\x10\x58\x75\xd0\x26\xc7\xa3\xfe\xf9\x79\xda\x3d\x46\xf8\x6f\x83\x5f\x72\x3c\x3e\xfb" + + "\xb5\x7f\xb1\xf9\xc2\x41\xd2\x73\xe1\xa5\x06\xc9\xda\x60\xb4\x73\x72\x3c\xc2\x5f\xcc\x86\x6f\x60\x31\xb2\x54\x72" + + "\x33\x59\x55\x55\x91\x77\xbf\x18\xa2\xac\x5f\xce\x95\x24\x51\x70\xf8\xeb\xfc\x3c\xa5\xa7\xf0\xdc\x09\x42\xc3\x5f" + + "\xcf\x7e\xfd\xe3\x62\xff\xfc\x8f\x73\xf3\xe8\xfc\x8c\x1f\x9f\x5f\x0f\xbd\x7f\x9a\x34\x3a\x5b\xf7\xd1\x2b\x15\xf8" + + "\xf7\x61\xa9\xaa\x52\xab\x2b\xf8\x5b\x9c\xbc\x84\x7b\xf0\xdd\xf3\xbf\xc2\x3f\x78\x58\x45\xc8\x3b\x95\xbf\xaf\x34" + + "\x5a\xad\x4a\x3b\xe9\x07\xc9\x19\x70\xb8\xfb\xdd\x4d\x72\x7e\xbd\xdf\xdd\x9c\x0f\xec\x83\xee\x17\x3c\x66\x69\xf4" + + "\x24\x23\xc6\x78\x78\xb6\xff\x8f\x0b\x0a\xea\xa6\x0b\x08\x9e\x3d\xdc\x9c\x9f\x07\xc1\xe2\xc0\xef\xd0\xcb\x2d\x6c" + + "\x7e\x0b\xc7\xc9\xb7\x59\x3f\xe2\x95\xcb\x55\xee\x06\x89\x90\x02\xaf\xdc\xb3\xf3\xf3\x54\xf6\x67\x17\x7f\x1c\xf6" + + "\xbe\xbe\x6d\xee\xde\xf1\xa6\x71\x02\x45\xa7\xbb\x19\xd0\x36\x32\xd5\xdd\x99\x05\x43\x78\xb1\xef\xbf\x7b\xbc\x80" + + "\xd4\xfd\x11\x48\x31\x81\x3c\x38\xd7\x97\x20\xa8\x76\x0e\x6e\x60\x2c\x7b\x25\xf7\xc5\xc1\xcd\xe1\xc1\xc1\xc1\x81" + + "\xcd\x6e\xf2\x46\xbe\x11\x0b\x3c\x5a\x70\x13\x4f\x8b\x54\x2d\x0b\xed\x52\xb7\xd4\xd3\x52\x3c\x7d\xfc\xa5\x3d\x45" + + "\x45\xf9\x41\x96\xc5\x2a\x4f\x31\xa9\x40\xae\x8a\x95\xf3\xb5\x16\xce\x63\xda\xe5\x62\xd9\x87\x79\x04\x12\x23\xce" + + "\x6e\x77\x3c\xa6\x3f\x36\x9b\x96\xb5\x90\x55\xdf\x4e\x9c\x1c\x1f\xb0\x35\x46\x11\xde\xb7\x41\x16\xdf\xbd\x7e\x2b" + + "\xa2\x69\xef\xec\xb0\x8b\xe5\xac\x2c\x16\x2f\xe6\xb2\x7c\x51\xa4\x2a\xa1\x81\xf6\xed\xf2\x5d\xd6\x15\xbb\x4a\xa2" + + "\x15\x32\x13\x6f\x33\x99\x2b\xdf\xa3\x48\xcc\xaa\x2c\x8b\x4b\x59\x29\xb1\x94\xba\xec\x7e\x6c\x88\x67\xcf\xc4\xe1" + + "\x81\xd8\x88\x83\x9b\x97\xdf\x1c\x1c\xf4\xe8\xe1\x9e\x38\xb8\x79\xf2\xfd\xf7\xf4\xf8\xc5\x81\x8d\xc4\xb4\xda\xea" + + "\x1f\x97\x95\x5e\x00\xc7\x09\xf4\x08\xbd\x13\xd8\xae\xf0\xdf\x3d\x4c\x9a\xf3\x83\x36\x15\x1c\xee\xaa\x5c\xe3\x06" + + "\x07\x4d\x60\x3a\x09\xe9\x32\x42\x33\x43\xa8\x72\x1a\xe0\x15\x00\xfd\x18\x41\x0a\xa9\x9d\x2d\xaf\xef\xdf\x23\x87" + + "\x89\x76\xc7\x95\x03\x9b\x05\xa3\x52\xd3\x4a\x18\x9d\x51\x12\xa0\x19\x33\x79\x7e\x52\xa4\x5d\x39\xdb\x36\x09\x17" + + "\xad\xee\x54\xc4\x47\xf7\xef\xdd\x8a\x29\xd0\x60\x91\x08\x8b\xc5\xac\x69\xf9\x83\xac\x69\x14\x0d\xc9\x5f\x1e\x3b" + + "\x7b\xc9\x0f\x98\xde\xe5\x52\x71\x3e\x14\x3d\x13\x36\xf2\x0e\x55\x1e\xde\xc1\x06\x8d\x55\x3d\xe0\x6c\x9d\x56\x23" + + "\x50\xf2\xb8\x38\x5b\x6e\x16\x80\x52\x65\xc6\xd9\x69\x6c\x38\x7d\x08\x9f\x93\x57\x4f\xbf\xb5\x42\x9a\x75\xca\x14" + + "\xe4\xea\x29\xc8\x71\x12\x01\xf2\x91\xb9\x60\x4a\x22\x17\x92\x16\x99\xbb\xc9\x2a\x4e\x9a\x17\x97\xe6\xa6\x2a\x41" + + "\x82\xb3\xb8\xc1\xed\xed\x55\x02\x52\x81\xe0\x98\xc1\xb3\xf7\xfb\xfb\x17\x68\x46\x37\x67\x7a\x7f\xff\x02\xb5\xf7" + + "\x64\x64\x8d\xc6\x12\x63\xf1\x5e\xf4\xc5\xa1\xd3\xe3\xdd\x92\x6e\x3c\xb0\x3d\x90\x42\xbc\x25\x05\x88\xf3\x10\xea" + + "\x51\xac\xb8\xb7\x49\xe0\xbd\x6a\x1d\x5c\x16\x3d\x61\x37\xdc\xde\xdc\x7f\x3b\x7d\x6e\xb5\xba\x3b\xba\x27\x2e\xcb" + + "\x62\xb5\x34\x3d\x51\x64\x69\x4f\xe4\x1a\xfe\xa3\xae\xad\xc6\x18\xfe\xb6\x8a\xf8\xc0\x74\xe1\x8d\x6f\xc7\xf6\xaf" + + "\x41\x71\x9d\xab\xd2\xea\x88\x81\xba\xd8\x26\xa3\x08\x27\x39\xa2\xa0\x9e\x5b\x29\xd0\x2f\x27\xb5\x2c\x27\x36\x4d" + + "\x86\x73\xf5\x75\x66\x3f\xdb\xc9\x11\xdd\x3f\xe8\x16\xd5\xea\x20\x45\x16\x4d\x0b\xc3\xc0\x7f\xdc\x3d\xda\x6d\xb1" + + "\xe5\x3a\x5f\x24\xec\xaf\x66\x6d\x49\xbc\xa9\xc5\x81\xc0\x3e\xa2\x25\xa2\xf9\xc5\xb5\x82\x27\xdf\xd6\x7a\xc6\xe9" + + "\x85\x9d\xc6\xfa\x73\x8c\x4b\xf5\x9b\x6b\x0f\xc1\xbc\x28\xab\xe9\xaa\x0a\x02\x38\x71\xc7\x61\xe5\xee\x36\x1f\xa8" + + "\x1b\x35\xf5\x58\x23\xba\xdd\xd0\x55\xfc\x74\xa9\x54\xda\x5f\x2d\x47\x16\xbd\x3a\x0f\x4e\x5e\x52\xb4\x8c\xed\x51" + + "\x8c\x09\x8f\xce\x0e\x2f\xba\xb5\xcc\x58\x91\x8d\xe9\xdb\xc0\xbd\x00\xd5\x97\x1e\x1a\x97\xaa\x62\xe7\xed\xef\xd6" + + "\x27\x69\x22\x16\xce\xdf\x00\x8f\x14\xda\xb7\xbd\x23\x36\xb9\x2e\xc3\x3a\x30\xd8\xf7\xbb\x4c\x4e\x3f\x4c\x54\x59" + + "\xae\xc5\x97\x83\xaf\xd9\x4e\x6d\xfc\xe7\x18\xc5\x42\x5e\x40\xb2\x04\x89\x56\x64\x45\x7e\xa9\x4a\xab\x3f\x70\xf8" + + "\x95\xb0\xf9\xe7\xc1\xd7\xdf\x7e\xfd\x84\x2f\x12\x5a\x07\x4e\xd7\x7a\x04\x07\x13\x09\xfc\x10\x7d\x18\x32\x9a\x34" + + "\x39\x14\xb9\x54\xe2\xe4\x55\x8f\xd4\x43\x3d\x14\xc0\x7f\x51\x93\x0f\xda\x59\xd3\x9d\x9f\x12\x77\x31\x59\xdb\xc0" + + "\x0c\x53\x29\x89\x26\xe6\x93\x97\xf6\xbd\x9b\xca\x40\xa7\x08\xd1\x45\x38\x01\x8b\xd6\x81\x03\x91\x87\x62\x1b\x86" + + "\x86\x1e\x93\x8d\x80\xce\xf6\xe6\xd6\xbf\x32\x6e\x4c\xbe\xe5\x78\xd2\xd8\xaa\x1c\xe7\x98\xf3\x1e\xfe\x6d\xc7\x7f" + + "\x6f\x4f\x24\x35\x74\x88\x1a\xb4\x21\x47\xd7\x85\xff\xec\x38\x6b\x50\xe2\xc9\x1d\x2b\xc7\xed\x86\xb5\x41\xeb\x4e" + + "\x60\xdd\xbd\x78\x9f\xb2\xa5\x79\x38\x40\x4c\x25\xcc\x09\xe3\x46\xe9\x78\x3c\xbe\xf0\x13\x08\x99\x08\x47\x9c\x9b" + + "\xa7\xc1\x7c\xb7\x7e\x27\x2f\xdf\xc8\x85\x0a\x0f\xa8\x9b\x69\x63\x9e\xdb\x27\x36\x20\xe9\xbb\x39\xb7\xe0\xfc\x3e" + + "\xb9\x40\x98\xb1\x4d\x31\x9e\x06\x06\x90\x59\xc7\xf8\xd6\x89\xfa\x16\xff\xc4\x2a\xdd\xc7\xb8\xbd\xdb\x17\xd8\xf4" + + "\x3d\x82\x2b\x6a\x29\xe9\x72\xc5\x05\xd9\xe9\xff\x6e\x24\xe2\xd6\xae\xb3\x2b\x02\x31\xf7\xbf\x06\x95\x32\x55\x3b" + + "\xdd\xcb\xd1\xf9\xa2\xc8\xe0\xbf\x6c\x42\xa4\xb1\xfd\x75\xe7\xb1\xd5\xbd\x71\x56\xe8\x71\x9d\xee\x01\x50\xa3\x9b" + + "\x11\x67\xfe\xfb\xe9\x73\x71\x5d\x94\x1f\x8c\x30\x55\x29\xf3\x4b\x85\x49\x00\x04\x03\xa5\x5f\x16\xa8\xb0\xfc\x7d" + + "\xa5\x40\x5e\xb6\x1f\xfd\x82\x56\x29\xfc\x4e\x30\x7f\x4f\xf9\xf4\xd6\xe4\x76\x3e\x63\xbf\x26\xa1\x6e\xaa\x52\xa2" + + "\x4c\x47\x54\x0e\xba\xb3\x9d\x00\x1d\x82\x1e\x30\xe1\xd4\xd2\xe5\x32\x2a\x95\x48\xde\xcd\x65\xfe\x01\xfd\x38\x80" + + "\xb1\x54\xd7\xe2\xe5\x6a\x59\xe4\x95\xf3\x5f\xaf\xd4\x74\x8e\x3e\x2f\x5d\xdb\xd9\xc9\x2b\xf1\x8d\x48\x0b\x85\x81" + + "\x71\x38\xaf\xc2\x86\xb8\xb9\xac\x43\xfe\xba\x68\x7a\x1d\x84\x37\x62\x4b\xa0\xc5\x6e\x4b\xfe\xcd\x9d\x1d\xe2\x44" + + "\x80\x21\x63\x65\x70\xb8\x91\xb1\x87\x5b\x42\xfb\x18\xa0\x9d\x53\xb7\x27\x1d\x9d\x76\xba\x61\x18\xbd\xdb\xf9\xc0" + + "\x6b\x9b\x44\x9c\x1e\xc8\x8e\x5f\xec\x05\xb9\x19\x63\x22\x68\xfb\x37\x61\xff\x02\x06\x40\x56\xa9\x9e\xd2\x91\x06" + + "\xea\x9c\xe9\x74\xfc\x10\x9d\x4d\x74\x0a\x52\xe6\xc3\x0b\xd1\xf1\xd3\x17\x63\x66\xb9\x42\x3b\xa1\x67\x21\x75\xbf" + + "\x1f\x4c\x9d\x5a\xa2\x7d\x90\x7b\xab\x0a\x8b\x92\x89\xf0\x6f\xeb\x13\x09\x51\xda\x8a\xeb\x8d\xb3\x81\xf9\x51\x95" + + "\x73\x0f\xf0\xb4\x3c\xba\x0c\x3d\x27\x77\xe4\x3a\x0f\x4e\x05\xaf\xe5\x7d\xa1\xf3\xa4\xd3\xeb\x78\xbf\xd6\x00\x3d" + + "\x82\x0f\xdc\xd2\xac\x58\xb5\x8d\xa4\x58\xb2\xed\x97\x32\x40\x57\x0b\xdb\xd3\x73\x90\xb8\xa2\x9e\xf9\x0b\x47\xf1" + + "\x5b\x09\x3e\x8b\x3c\xc9\xef\x46\xa2\x33\x91\x9b\xcf\xad\x98\x69\x72\x29\x8c\xb2\x2f\xec\x02\xa2\x45\x69\x17\x68" + + "\x2e\xe4\xe6\x55\x43\xba\x3b\x23\x16\x7c\x82\x80\xe7\x59\x46\x8e\x27\xc6\x3b\xdf\xd0\xae\xf8\xdd\x69\x06\x18\x7c" + + "\x71\xd8\x11\xdd\xed\xec\xbf\x95\x1c\x86\x8f\xd8\x09\x06\xdd\x0e\xc4\x07\xb5\xee\x93\x51\x71\x2a\xd1\x79\xbb\x98" + + "\x89\x4c\x2f\x34\x50\x21\xa3\xff\x4e\xbe\x2c\xff\x3f\x66\xaf\xc4\x1f\xce\xd7\x8f\x58\xe1\x1e\x3b\x5e\x75\x6f\x39" + + "\xab\x01\xb9\x5b\xb3\x37\x16\x86\x92\xc9\x59\x85\x41\xd9\x05\x65\x5c\xa8\x80\x50\x70\x12\x94\x6b\x0d\x14\x5c\x3c" + + "\xda\x71\x01\xca\xc8\x06\x41\x0f\x09\xaa\x1b\xfa\x66\x35\x9b\xe9\x1b\x95\x76\x6d\xe0\x18\x10\xb1\x44\x73\x24\x23" + + "\x3a\x50\x68\x23\x32\x90\x99\x80\x52\xc9\x5c\x20\x73\x8b\x6f\x7e\xc0\xd3\xd3\xc5\x01\x52\x95\xa9\xca\x5a\x2d\x8a" + + "\x2c\x55\xa6\x12\x2a\xaf\xca\x35\xfb\xdc\x38\x71\x2a\x72\xc6\x70\x12\xd3\x07\xb5\x36\x81\xe7\xb2\x6f\x8d\xed\xe0" + + "\x75\xcf\x7a\xcc\xba\xe0\xed\x9f\x8d\x12\xc9\x07\xb5\x86\x03\x2e\x3a\x5d\xf4\x50\xc5\xa0\xc0\x69\x91\x65\x1a\x93" + + "\x0b\x50\xb4\x2f\x29\xec\x7c\xe6\xc0\xc0\xd5\x2e\x31\x4a\x89\x13\x63\x56\x4a\x3c\x38\xfc\xea\x2f\x5d\x77\xdd\xc1" + + "\x84\x98\x8b\x71\x43\x88\xae\x78\xd6\x58\x7e\xc8\xd5\x63\xe2\x97\x0f\x4a\x2d\x7d\x4c\x52\xa9\xa6\xc0\x8d\x01\x28" + + "\xec\x75\x83\xa0\x62\xe0\x9e\xd1\x40\x66\xae\x67\x55\xd2\xf5\x21\x06\xee\xec\x24\xbe\x19\x4f\x02\x08\x11\x82\xc2" + + "\xca\x66\x3e\x33\xd7\x74\xae\xea\x48\xf8\x5a\xc2\x8d\xe6\xdd\x78\xe1\xc2\xe1\x40\x2a\xd4\x07\x4f\xd6\xcc\xcb\x10" + + "\x1a\x2e\x65\x29\x17\x1e\x09\x6f\xc5\x2c\xc7\x7c\x86\xa1\x1b\xf0\x42\x96\x1f\xea\xbb\x0a\xcf\x6a\x5e\xaa\x00\x95" + + "\x59\x7e\x66\x6f\x7a\x9c\xb7\x75\x99\x71\x9e\xa4\xf5\xe9\xb2\x7e\x01\x89\x22\xe5\x6d\xb4\xf7\x2e\x5d\x79\xdb\x67" + + "\xf9\x16\xf3\xfa\xf8\x6c\xc8\x2a\x15\xa9\xbe\x42\x74\x56\x18\x12\x60\x84\x74\xd9\x91\xe8\xe4\xd6\x17\x01\x3d\x94" + + "\x55\x30\x7d\xc0\x4c\xe8\x64\x7b\x48\x6c\xaa\xaf\x3a\x7c\x31\x3a\x72\x6a\x73\x18\xec\xce\xf2\x04\x3f\xa7\x8d\xb2" + + "\x9a\x1e\xb5\xcd\x8f\x30\x26\x7f\xe8\xc2\x81\x19\x5b\x90\x8f\xd0\x95\x61\x51\x0d\xb6\x8c\xd3\x4b\x3a\x6c\x4d\xf5" + + "\x55\x9b\xfc\x14\x3f\x8e\x03\x6d\xdd\xc4\x5c\xa8\x78\x49\x2e\x77\x62\xa1\x16\x45\xb9\x06\x31\xee\xe4\x15\xbc\x22" + + "\x08\xe4\xab\x2c\x63\x84\x8b\x76\xec\x79\x9a\x1a\xef\x9d\x6b\x3d\x76\x01\xcd\x24\x10\xd9\x99\xf3\x8c\xa6\x34\x2c" + + "\xb2\xaa\xd8\xc3\xcf\xee\x22\xe9\x14\x6f\xe9\x8d\x78\xab\x97\xaa\x6f\x14\xbc\x83\x2d\xcc\xb4\xa9\x30\xd1\x9e\xb3" + + "\x20\x6d\xc1\x00\x3b\x30\x20\x2b\x79\x43\x91\x68\x8a\x8e\xd6\x13\x54\x4d\x65\x5a\xa5\x8d\x2d\x4f\x53\x12\x2f\x13" + + "\x1a\xbf\xe7\x3a\xf2\x18\x40\x6a\x46\x7c\x6d\xfd\x5e\x37\x9d\xae\xcb\x08\x46\x2f\xc2\xf8\xa2\x16\x46\x02\xa9\x06" + + "\xb4\xa4\xd1\x30\x64\x0b\xb8\x06\x38\x14\x3c\x62\x1b\x70\x51\x44\x37\x5e\x94\x2e\xd0\x69\x0d\x80\x7a\x5d\x08\x66" + + "\x2a\x62\x88\x30\x66\xde\x0a\xd9\xfe\x78\x52\xbb\x6e\xc8\xff\xd7\x5f\x2e\x99\xc2\x80\x1e\x99\x8b\x03\x10\x64\x24" + + "\xdb\xa3\x95\x11\x93\x9e\xb8\x44\xe4\x2f\xa3\xf7\xb3\x22\xcb\x8a\x6b\x43\x1d\x87\xa0\xe5\xe9\xe1\x12\x22\xe7\x3a" + + "\x8c\x6e\x5a\x01\x4c\x27\xc0\xff\x48\xca\x99\xa6\x67\x33\x60\x27\x57\x25\x3e\x6b\x71\xa3\x9d\x34\x9f\x21\x92\x27" + + "\xe2\x1f\x93\x81\x29\x56\xe5\x54\x9d\xe4\xa9\xba\x01\x76\x29\xf2\x9b\xeb\x8a\xbe\x6d\x28\xef\x6e\xe8\x92\xb5\xc1" + + "\xd5\x72\xf2\x4a\x84\x8d\x61\xb1\x57\x52\xa3\xc7\x3f\xdc\xb0\x93\x02\x53\x7b\x91\xfa\x98\x0f\xe1\x6c\x56\x53\x2f" + + "\xc1\xa3\x28\x55\x19\xe9\x5c\xf4\x4c\x4c\x1c\xe0\xa4\xfd\x1e\xd6\xce\x9f\x3b\x6d\x26\xc1\x69\xba\x2a\x07\xb9\xba" + + "\xa9\x4e\x09\xa4\xdd\xd8\x7f\x0d\xdb\x44\x8e\x8a\xb1\x83\x5a\x83\x01\xb2\x51\x7a\xe2\x58\x1c\x8a\x11\xb5\x8a\xd0" + + "\xce\x22\x43\x1c\xfe\xc1\xb6\x46\x6b\x9f\xa5\x48\xa8\xe5\xaa\x42\x4d\x5e\xfb\x99\x86\x37\xed\x0c\x00\x7a\xc0\xbe" + + "\xc5\xae\xd8\x0f\x9b\x26\x6f\xa9\xe2\x56\x87\x3f\x64\x60\xc6\x77\x05\x91\x87\xf9\x15\xa9\x35\xc8\x3a\x38\xd5\x8e" + + "\x53\x5e\x38\x57\xeb\x8a\x14\xf1\x5e\xf1\xfb\xd9\x40\x20\x73\xe2\xe7\x02\xe0\x3b\xfc\xea\xdf\x0f\x81\xa4\x01\x82" + + "\xcd\x26\x00\x0b\x4d\xbe\xd3\xfd\x77\x00\xc6\x26\xba\x90\xd9\x36\xaa\x3d\xcb\xdb\x81\xf3\xd6\x7d\x69\x01\xe4\xee" + + "\x64\x17\xa3\x17\x30\x1c\x61\xe0\xee\x65\xa4\xd4\x76\xbf\xc7\x62\xdf\xfe\x1d\x42\x67\x4b\x37\xc0\xd0\xf7\x6c\x1c" + + "\x60\x6c\xad\x60\xb1\x08\xdf\x21\x65\x40\xdf\x13\xb8\xea\xcf\x2e\x48\x12\xb0\x66\x8c\x60\x32\x81\x49\x23\xfc\x30" + + "\x8e\x4a\x75\x69\xbd\x7d\x56\xe1\x19\x6a\x22\x64\x55\xbb\x44\x35\x7d\x1e\x19\x3e\x22\xa9\x95\x34\x36\x4a\xa5\x67" + + "\x22\x79\x5f\x1b\xf4\x4c\x5f\x74\x45\xa0\x33\xdb\xc1\x76\xef\xe1\x26\xda\x4d\x78\xc9\xf4\x93\x5f\xb4\xc5\xa8\x11" + + "\x4b\xd3\x14\x79\xe8\xbe\x92\x94\x8f\x63\x46\x89\x93\x74\xaa\xab\x35\x25\x90\xe6\xe0\x02\x97\xb0\xa5\x79\x43\x6d" + + "\x48\xb2\x19\xdf\xc6\x8d\xdc\x7d\x15\x37\xdb\x70\x18\xcb\x2d\xde\xfb\x44\x8d\x70\x68\xa0\xd6\xd3\xa9\x5a\x56\x14" + + "\xa0\x55\x78\x13\x15\x32\x5c\x6b\xe2\xa0\xeb\xc8\xd7\x26\x8a\xc7\x68\x67\x1f\xfa\xba\x26\x77\x69\x17\x51\xcb\x12" + + "\xb9\x79\x7b\xc5\x8c\x03\xdd\x10\x44\x8a\xc2\x28\x57\x05\xe0\x4a\x96\x74\x7e\xa6\x45\x7e\xa5\x72\xad\xf2\xa9\xba" + + "\x7f\xcf\xd7\x08\xe0\x72\x33\x8d\xa2\x01\x76\x13\xc8\x52\x69\xc4\x7f\xbd\xfe\xc1\x5e\x50\x5b\xe1\x7c\x4b\xd4\xe5" + + "\xb9\x63\xb0\x31\xcd\x62\xa0\x66\x8e\x80\xef\xa1\x5d\xae\x00\xc6\x94\xff\x9a\x72\x30\xe5\x45\xde\x47\x93\x89\x1d" + + "\x96\x81\x8b\xc1\x12\x7e\xd6\xf6\x67\x2b\x79\x1b\x0e\xdd\xc8\xaf\x6c\x9e\x66\x23\xae\x54\x49\x68\x4f\xd9\xed\x8d" + + "\xb2\xa5\x5f\x74\xe5\x14\x64\x6b\x55\x51\x84\x14\x27\x71\xb6\xb5\x57\xb2\x82\x7c\xf4\xf4\xac\x94\x0b\x4c\x3a\x06" + + "\xf7\x7a\x5f\x3c\xf8\xf2\x9b\x27\x68\x8b\x40\x16\xbf\x36\xe6\xd8\x19\x26\x50\x83\xde\xb4\xab\xc1\xd3\xee\xa0\xf6" + + "\x59\x20\xd7\xd4\x3b\x3c\xae\x3f\xf1\xf9\x50\x50\x0f\x07\x70\xeb\x88\x91\x93\x05\xe2\xfd\x3c\x55\x95\x67\x01\xfb" + + "\xa5\xa2\x98\xbe\x2b\x59\x6a\x40\x6e\x23\x8a\x7c\x4a\x99\x40\x53\xab\x94\xb4\xd9\xf0\xe3\x6d\xdc\x82\x00\x67\x69" + + "\x31\xbd\xa8\x61\x80\x67\x38\x49\xcf\xc0\xf4\xbd\x2a\x30\x17\x7c\x68\xdd\xa9\x61\x88\xed\x34\xd4\x55\xb4\xcd\x66" + + "\x78\xff\x5e\x60\x6f\x0c\x90\x3a\x7a\x18\x24\x97\xf7\x62\x0d\xd7\xd6\x78\x51\x2c\x40\xb4\x21\xe6\x11\x03\x4c\xb0" + + "\xcd\x31\xfe\xd3\xdc\x32\x7c\x19\xdb\x41\xc9\x25\x80\x64\x2a\x94\xf0\x06\x2c\x56\xfd\xa7\x56\xd7\x8e\x15\x3c\x99" + + "\x89\xbc\x08\x6a\x6e\xe4\x69\x1b\x8e\x3a\xd6\xb0\xc7\x26\xa8\xc0\x9e\x88\xb7\x69\x1a\xcc\x05\x86\xaa\x59\x25\x37" + + "\x1b\xb1\x8b\x33\xa8\x75\x5d\x63\x27\x03\x6b\xeb\xad\x4f\xc6\x58\x89\x62\x55\x86\xa6\xa1\xa0\xd6\x47\x5a\x4c\x8f" + + "\x7c\x84\x90\x5d\x67\x03\x73\x23\xef\x07\xa4\x83\xa6\x11\x4c\x84\x69\x03\xe0\xf8\xd2\xaa\xba\xf5\xcf\x46\xe2\xe4" + + "\xd5\xb3\x6f\x1c\xd4\xe8\xc8\xf9\x85\x03\x94\x8c\xd1\x97\x39\x25\x49\xea\xf8\xb2\x3c\x16\x95\x11\xb8\xda\x7d\x39" + + "\x97\x46\x4c\x94\x02\x69\x1d\x8e\x31\x45\xc4\x90\x66\x1c\xa5\x3a\x4a\x61\xd9\x59\xaa\x72\xa1\x31\xc0\x41\xa4\x40" + + "\x2d\xd3\x0e\xd7\xfb\x40\x2b\x26\xdc\x02\x06\x95\x08\x2d\x03\xe2\x7d\x6d\xa3\xd3\x1e\x1c\x3e\xf9\xf6\xc9\xd7\x76" + + "\x88\xaf\xfb\xdf\xd8\xca\x4f\x96\xd0\x56\xbe\xae\x03\x60\x88\x4f\xfa\x67\x0a\x2b\x9a\x5b\x69\xd3\x11\x7c\x8b\x06" + + "\xfc\x7e\x6f\xcf\xfe\x05\xdb\x4e\x7f\x0e\xaa\x62\x19\x68\xb5\x4e\x5e\x1d\x1e\x22\x59\xc3\xb1\xe7\xf2\x4a\x71\xb0" + + "\xe8\xab\x2b\x95\x57\x18\xea\x0a\x82\x35\xba\xb2\x9b\xd5\x6c\x86\xde\xc1\xe1\x20\x03\x99\xa6\xd8\xf6\x07\x6d\x2a" + + "\x95\xfb\x92\x1b\x3b\x5b\xde\x27\xa2\xb3\xca\x01\xc2\x9d\x5e\x33\xe6\x37\x72\x0b\xb0\xaa\xe5\x9e\xcd\x17\xc3\xfe" + + "\x21\xde\xec\x65\x87\xf0\x33\x6e\x8c\xee\x5f\x25\xa2\x53\xe4\x9f\x39\xb4\x57\x59\xf0\x01\x78\xe4\x03\x19\x00\x65" + + "\xfb\x7f\xca\xff\xb8\x00\x5a\xdd\xe3\x85\x91\xfb\x3f\xe1\x42\x5a\x93\x7e\x21\xb4\x7b\x60\xe1\xad\xcc\x26\x23\x35" + + "\xa1\xdb\x2b\xf9\x88\x57\x91\xea\x51\xdd\x00\x83\x02\xa8\x79\xf2\xea\x1b\xe7\xeb\xd9\xf5\xe1\x87\x83\x28\xae\x82" + + "\xb5\x53\x9e\x26\xa2\x06\x87\x60\x95\xea\xab\xc1\xd4\x19\x0a\x81\xd5\xef\x84\x5c\xee\x2e\xbc\x8f\x2d\x34\xae\x75" + + "\xc7\xb3\x72\x04\x4e\xcf\xc8\x24\xa6\xfb\xdd\xfa\xd1\xbf\x03\xa8\x4e\x0c\x6e\xb5\xc9\x76\x1e\x75\xba\x0e\x88\x98" + + "\x82\x24\x30\x78\xb5\x9a\x51\x2d\xbf\xf5\x71\x28\x45\xd9\xe8\x80\x16\xb2\x3e\xba\x58\x90\x42\xaf\xd3\x8d\x13\xf4" + + "\x5b\xd0\xb5\xcf\x32\x30\x20\xdd\x7a\x7a\xd8\xbe\x3a\x6f\xc8\xe5\x38\x75\x74\x66\x42\x12\xf1\x11\xd3\xf0\x58\xb0" + + "\x2f\x2a\xdb\x8f\x60\xda\x5b\x6d\xc4\x7b\x7b\x1f\x85\x81\xce\x73\x55\x32\x45\xef\x3c\x85\x97\x88\x0d\xe3\x87\xf2" + + "\xe1\xb3\xa7\xc3\x54\x5f\x3d\x8b\x1e\x0a\x6d\x1f\x77\x8e\x9a\x8e\x60\xa7\x72\x26\x4b\xfd\xd4\x3a\x48\xbe\x40\x01" + + "\x06\x3f\x15\xc5\x95\x2a\xfb\x53\x89\x2e\xc6\x76\x6c\xf4\x05\x46\xf0\xb7\x22\x6c\xd8\x33\x7a\x77\x3c\x3d\x3c\x88" + + "\x7a\xbe\x7c\xf5\xdd\x8b\x37\xe8\x7c\xb7\x2a\x91\x21\x99\x69\x0e\xbf\xe0\x24\xb5\x34\xb6\x32\x91\x16\xe6\x6a\x9b" + + "\x59\xbc\xa3\xdd\x26\xe2\x35\xfd\xb8\xb6\x95\xe1\xe9\x3f\x3c\xd8\xba\xbd\xdf\xad\x4f\x52\x87\xb1\x4e\x7a\x63\xaf" + + "\x13\x5f\x15\x68\x52\x16\x1f\x54\x5e\xff\xce\x26\x3e\x4e\x31\x6f\xf6\x52\x4f\x3f\x88\xd5\x12\x28\xc5\x65\x29\x17" + + "\xb2\xd2\x53\x20\x2a\x7d\x60\xbc\xa0\x37\xc3\xb7\xa0\x29\x38\x82\x12\xad\xd5\x72\x52\xac\xaa\x18\xdf\x10\xb2\x80" + + "\x30\x31\x82\xe1\x90\x1f\x39\x27\xc4\x2c\xd4\xce\x0a\xbc\x47\x9f\x8f\xc8\x76\xef\x8e\x49\x1d\x27\x71\x78\xcb\xd6" + + "\x34\xde\x24\xce\x2c\xb0\xe5\x0c\x9d\xbc\xa4\x9d\xc5\x6c\xd0\x18\x86\x64\xaf\xd2\xfa\x5a\x42\x0d\x2b\x7c\x72\xd6" + + "\x39\x79\xd9\xb9\x88\xb8\x47\x9d\x36\x12\x8d\xb4\xa5\x13\xa9\xb9\xc4\xb4\x4a\x6f\x35\x96\x28\x48\x12\x53\x8a\xbb" + + "\x5c\xaf\x02\x53\xf5\xbf\xe6\x7a\xf5\x39\x9e\x57\xe8\x71\x15\x69\x04\x51\xaa\x89\x7c\xad\x8e\xc5\x99\x58\x70\x65" + + "\x91\x50\x5b\x78\x14\x00\x15\xc0\xdf\x0a\xd6\x48\x35\x02\xb7\x15\xe2\x96\x0e\xcd\xfc\xd6\x9d\x1b\x2f\x78\xf6\xec" + + "\x66\x48\xdc\xa9\xe9\x8a\xf3\x47\x36\xdd\x0b\xf0\xb8\xd2\x90\x3c\x6d\x97\x54\x24\xf2\x21\x88\x0f\xf1\xd7\xc3\xbf" + + "\xf0\xc3\xda\x5e\xb3\x87\x55\xa9\x32\x66\x45\x51\xbf\x05\x18\x68\xd8\xdb\x0f\x4f\x06\x99\xee\x6a\xb8\xc6\x54\xb1" + + "\x0d\x58\xff\x73\xd0\x42\xcd\x20\xa5\xad\x65\xac\x6e\x00\x0e\xf7\xbb\x0d\xa9\x5b\x5b\x46\x06\x75\xab\x4e\x85\x1e" + + "\xd8\xa7\x72\xe0\xb3\x07\x6e\xdb\x06\x7b\x98\xdf\xc9\x4b\xce\xa4\xc0\x50\x7b\xf7\xfc\xaf\x08\x9e\x3b\x2f\x73\x74" + + "\x76\x0f\xfd\x87\x2f\x3f\xf7\x14\xdf\xa5\x89\xa9\xa3\xd9\xdd\x5e\x62\x95\xbc\x8c\x13\x86\x91\x1f\xfd\x47\x66\x07" + + "\x7b\xa2\x38\x31\x83\x4b\x4c\x64\x33\xb7\x85\x69\xbf\x02\xdf\xd9\x4f\x9b\x87\xd5\x17\x52\x84\xa6\x00\xe2\xef\x6a" + + "\xaf\x4c\x89\x97\x09\xbc\x83\xe0\x2b\xd4\xf6\x3e\x0a\x7c\x7d\x9c\x8d\x81\xbd\x04\x79\x0a\xde\x5d\xfa\x7e\xcd\x53" + + "\xb3\x6e\x7f\x09\x7c\x32\xaa\xc5\xb2\xd5\xe5\xaf\xe6\xdb\xe7\xf2\x9c\x70\xc6\x25\x7e\xdf\xe2\x26\x72\xeb\x99\x29" + + "\xb8\xab\x63\xec\x21\x9f\xbb\xad\xf8\x13\xf9\xd4\x05\x59\xa0\xed\xe3\xc6\x3e\x7d\x14\x89\x7c\x8f\x9f\x71\x25\xdc" + + "\x85\x57\x81\x5f\x9e\xe7\x82\xba\x91\x13\x3a\x31\xe3\x7f\x3b\x7d\x3e\x64\x9d\xec\xa9\x2f\x3b\xf8\xa7\xf3\xe3\x7f" + + "\x3b\x7d\x8e\x37\x6d\x6d\x28\x9f\x62\x88\x9a\xd5\x5e\x27\x23\x39\x05\xb6\x14\x98\x75\x2a\x01\x4c\x62\x21\xd5\x0a" + + "\x2a\x57\x4a\x24\x27\xaf\xbe\x1d\x22\x1f\x27\x0e\x0f\x07\x18\x03\x1c\x65\x20\x09\x5c\x3e\xd0\x73\x4f\x26\x23\x4c" + + "\x90\x70\x47\x8f\x2f\xe6\x65\xb1\x50\xe2\xf1\x61\x97\x93\x19\x28\x2e\xf2\x19\xd5\xbf\xc5\x82\x8b\x93\xd5\x25\x29" + + "\xfc\xbe\x19\x7e\x4b\xd7\xa5\xcd\xc8\x95\x93\x8a\x80\x7a\x80\xce\xb1\x3e\xca\x6f\xce\xca\x4f\xeb\xe2\xfd\xfa\x4d" + + "\x70\xf9\x65\xc3\x2a\x36\x99\xb3\x8a\x82\x79\xc4\xa2\x27\xae\xed\x2c\x68\xfe\x70\x9f\x73\x6a\x44\x4a\x43\x87\x00" + + "\xe6\x12\x84\x95\x5e\x28\xef\xac\x02\x4f\x4e\x5e\x85\xf3\x39\x55\xca\x46\x69\x4d\x56\x97\x66\x10\xd4\x1e\xa7\x82" + + "\xcc\xc3\xc3\x27\x4f\xfe\xf2\x4d\x98\xda\x25\x80\x23\x39\xe7\x85\xde\x9a\x6d\xe2\x43\xdd\x91\x2b\x70\xd3\x74\xb5" + + "\x05\xa1\xdf\x52\x5d\xaa\x1b\xe7\x8e\x70\xa9\x6e\xd0\xa9\xb2\x52\x97\x6b\x21\xd3\x62\x59\xa9\x94\xdc\x13\x5e\x6a" + + "\x75\x59\x88\xb7\xaa\xd4\xb9\x46\xbb\xcb\x1d\xec\x25\xad\x31\xe3\x22\x98\xa8\x50\x2c\x6c\x69\x4d\x2e\x2a\x95\x0b" + + "\x4e\x98\x62\xdb\xbf\xa3\xf2\x7a\x98\x09\x4c\x99\x4a\x9c\xbc\x7a\x68\x44\x05\xa2\x1b\xa9\x29\xa9\x9a\xab\xba\x59" + + "\x66\x7a\xaa\x39\xf4\x04\xb9\x64\x55\x51\xd6\x74\xe7\xfa\x81\xe7\x31\xaf\xbc\x70\xde\x73\x6d\xb1\x2e\x09\x3a\x5a" + + "\x60\x01\xf1\x69\x98\x06\x42\xe5\xb0\x8f\xb6\xe9\x47\xb6\xe7\xf1\x93\xaf\xbe\x75\x0e\x18\xb1\xb4\x45\xde\x65\x62" + + "\x61\x10\x5d\xa6\x99\x5e\x8e\x1f\x3e\x7c\xf6\x94\xf2\xe9\x09\x9b\x30\x04\x9f\x0d\xe9\xe1\xb3\xa7\x9c\x80\xc1\x89" + + "\x5f\x35\x9e\xe6\x1b\x76\x84\x17\x87\x87\xfd\xc3\xc7\x83\xc3\xaf\x6d\x9b\x37\x05\xc5\xb5\xfb\x55\xd8\xfe\xe9\x40" + + "\x85\x30\x37\x6c\x8f\x16\xbf\x8e\x45\x51\x8a\x2f\xf0\xbf\x8f\xc6\x1e\xfe\x24\x4b\x78\xb0\xb9\x64\x0a\xab\xfc\x43" + + "\x4e\x39\x5e\x78\x1a\x93\x55\x25\x3a\x46\xce\x54\x07\x35\xf6\xbf\xe8\xfc\xa7\x77\x35\xc0\x2d\x4c\x9a\x0f\x16\x36" + + "\xeb\x39\xc2\x4e\xe5\xfd\x95\x19\x52\x20\xeb\x7a\xa8\xd5\x70\x3e\xff\xf2\xeb\xaf\x9e\x7c\xf3\xcd\x40\x9a\xe5\x8d" + + "\x4f\x3c\xf1\xdf\x46\xb9\xf4\xa2\xde\xf9\xa5\xe1\x98\xd8\x39\x0b\x40\xfc\xeb\xf8\xe1\xc3\x0b\x2f\xe8\xf9\xab\xdf" + + "\x39\x2d\xd3\xe5\xd5\x39\x7b\xf4\xeb\x17\x17\xad\xa1\xe3\xc7\xa3\x87\x0f\x37\xe7\x9d\x73\x0c\x77\x8e\x3d\x2c\x6b" + + "\xbb\x61\x9f\xd9\x0c\x6b\x35\x2d\x50\x07\xd9\xa6\x0e\x73\xee\x15\x21\xb1\x4a\x6d\x75\x67\x46\x5d\xf2\x7c\xdc\xb2" + + "\x32\xbb\x8b\x9f\xb4\xa4\x2d\xd9\x38\x8e\x47\x38\x8f\x4d\x23\xcc\xb8\x6d\x79\x14\x5c\xc1\x84\xbc\x2f\x46\x9c\xdf" + + "\xc6\x22\x56\xe4\x40\x09\x24\x92\x90\x39\xf2\x52\xde\x96\x05\xe6\xf1\xc1\xe1\xe1\xf0\xa7\x57\x2f\xfa\x71\x06\x95" + + "\x3e\x3c\x3f\xf8\xf6\xf1\xb7\xc3\x07\x3c\xd8\x7d\xe7\x17\xfd\x8d\x25\xe3\xa4\xe6\x45\x53\x10\xba\x5e\xeb\x2c\x23" + + "\x85\xad\xc2\xc4\x09\xaa\x74\x8a\xec\xbb\x01\x6a\xd7\xf3\x71\x70\x06\x4d\x8f\x6a\xd6\xd0\x4f\xa2\x7a\x16\x4d\x28" + + "\xb1\x9c\x11\xdf\x88\x37\xe4\x9c\xf8\x7c\xb9\x34\xd1\x59\x03\x36\x0b\x95\x86\xc0\x19\x84\x28\x54\x2a\x60\x94\xb0" + + "\x84\x83\x4a\x45\x4a\x39\x25\x02\x22\x43\x3a\x76\x17\x23\x42\x65\xce\x97\x2b\x6b\xe2\xa8\xf9\xaf\x91\x4b\x80\xcd" + + "\xad\x0b\x3f\xea\x9e\xd6\x30\x93\x4e\x4f\x74\x28\x23\x91\xc3\x8e\x86\x2e\x8d\x06\xe9\xd6\x3f\x87\xf9\xc3\xe7\x2f" + + "\x3b\x11\xdf\xda\x76\x60\x5e\xe5\x58\x19\x08\x4d\x7c\x7d\xa3\x72\xac\x56\xa4\x2b\xac\xb8\x15\x83\xe1\xa3\x67\x1f" + + "\x9a\x8f\x3f\xed\x7c\xe0\x04\x5b\x22\xda\x5d\x7a\x99\xb6\x03\xf1\xfd\xf7\xe2\xc9\xe0\x2b\x38\x0a\x2a\xc7\x84\x4d" + + "\xc3\x91\x4d\xdd\x84\xbb\x46\xc0\xf2\x9a\xa0\xa4\xfe\x00\xb6\xd1\x54\x80\xb0\xdc\x41\xf7\xdf\x89\xdf\x3c\xc6\xa7" + + "\x80\xc3\xb5\xed\x89\x8e\x5b\x53\x1b\x08\xf8\xca\x39\xe8\x87\xe6\x0a\x32\xc9\xc0\xf5\x5d\x98\xaa\x4f\xd9\x44\x74" + + "\x8e\x3e\x00\xd6\x33\xc4\x61\x4f\x73\x9e\x8f\x7a\xa3\x1b\x8b\x8b\xf5\x83\xd7\x1b\x3c\x1a\x75\x6c\x79\xd9\x7a\x20" + + "\xa0\xe5\x76\xea\xec\x6b\x9d\xf3\x49\x7c\xfe\x6c\xab\xe3\xb2\x4f\x28\xb3\xa2\x7d\x7a\x8d\x04\xef\x75\xad\xbb\xb8" + + "\xcd\xa2\xf8\xfb\xdd\x0d\x8a\x8f\x7c\x6f\x6a\xef\xbb\x8e\x09\xfb\x14\x5a\xf2\xc2\x66\xa7\x05\x6c\xd0\x33\xa1\xab" + + "\x87\xc6\xcb\x80\x55\x21\xd2\xa2\xce\xaf\xdb\x4f\x81\x85\x15\xa9\x36\xd3\x22\xcf\x89\x62\xa3\x5c\x9f\x9c\xbc\x12" + + "\xdf\x12\x1e\x5a\x80\x86\x8d\x5e\x73\x88\xa3\x4d\xa8\x4d\x11\xd7\xa9\xbe\xea\x09\x74\x83\x8d\xce\x37\xf2\x6b\x7c" + + "\x3d\xcc\xa4\xce\x7c\x09\x75\x32\x7a\xf8\xca\x2c\x7f\x55\xd3\x0f\x85\xc7\x20\x45\x69\x72\xad\x2e\x95\xd8\x7f\x0e" + + "\xdb\xc3\x4f\xda\x86\x3f\x33\xbb\x70\xc3\x8f\x6e\x1c\xa2\x46\x52\x86\xc5\xed\xdd\x71\xa7\xe7\xd3\x8b\x34\x70\x29" + + "\xe4\xa6\x3d\xfa\xf1\x89\xd9\xdb\x8b\x12\x1e\xf8\xf7\x14\x76\xb1\xb1\x76\x83\xba\x78\x13\x4f\xe4\xae\xce\x6c\x9b" + + "\xb8\x43\x12\x03\x5f\x70\x30\xde\x9f\x2b\xfb\xed\x78\x33\x7a\x9b\x90\x80\x58\x3a\xa5\xf7\xd6\x0e\x67\x1d\xb3\x02" + + "\xeb\xaf\x35\x55\xdb\x80\x41\x21\x73\x74\xb7\xe1\x7c\x67\xc4\xc7\xcf\x56\x59\xb6\xf6\xbb\xec\xb2\x94\x50\x9d\x24" + + "\x03\x57\x60\xaa\xcc\x54\xe5\x29\x5d\x5c\x58\x02\x51\xe8\xbc\x17\xf8\x7e\xfb\xcf\x79\x28\x8e\x72\x08\x52\x57\xa2" + + "\x37\xad\x5b\xd3\x66\xb3\x75\x51\xdc\xbc\x5b\x57\x32\x85\x39\x20\x49\x4d\x87\xf9\x0b\xc7\x75\x8f\xd4\x6f\xc5\xb1" + + "\x90\x0d\x6b\xfd\x88\x9d\x59\x77\x76\x26\xab\xa5\xf5\x6f\x9d\x04\xda\xd6\x48\x93\xc7\xe9\x25\x57\x4b\x54\x93\xef" + + "\x26\xf8\x27\x7c\xb0\x5a\xb6\xb8\xbf\x26\xd4\x31\xce\xc7\x2f\xc0\xd6\x80\x88\x1f\x53\x57\x2e\xd7\xc3\x8e\xdc\xba" + + "\x8d\xe8\x6b\xbb\xe5\xa5\xed\x65\x4f\xb0\x48\xd1\x0d\xf2\x01\x6c\x05\x1a\x52\xe4\x49\x8b\x9a\x69\x02\x00\x09\x60" + + "\xd1\xd0\x31\x4d\x48\x97\x18\x87\x93\x46\xc9\x72\xdb\x23\x7b\x5a\xea\xab\xb9\x83\x73\x5a\x94\x15\x59\x9f\xfe\xc4" + + "\x73\xc3\x09\x21\x62\xa7\x6c\xe3\x46\x0a\xb3\x8b\x06\xd8\x78\x1c\xc4\xb5\x84\x30\xbb\xef\x92\xbd\x5f\x52\x09\x4d" + + "\x97\x62\x94\x0b\x56\xdd\xff\xdc\x7c\xa4\x51\x2e\xd2\x30\x21\x78\x51\x62\x70\x10\xfb\xc7\xa3\xbf\x14\x8a\xb9\x61" + + "\xad\x64\xe2\xe3\xe6\xd2\x88\x2d\x68\x71\xdf\x16\xa8\x70\x94\x63\x77\x3b\x7e\xf5\xc5\xee\x64\xdb\xcb\xa3\xfb\xbe" + + "\x90\x1a\x75\xd5\x50\x9d\xe1\xe3\xda\x2a\x5e\xc8\x6c\x4a\x49\xae\xad\x7f\x29\xfa\x53\x17\xd5\x5c\x70\xf2\x9f\x89" + + "\xca\x0a\x4c\x68\xe7\xe3\x12\xc2\xb8\x69\x3f\xf1\x44\xc8\xa6\xa7\x10\x20\x20\xc0\x39\x11\x93\xe6\xcb\x89\x25\x19" + + "\xdb\xcf\x14\x61\xff\x28\xe0\x94\x9c\xf3\xe1\xb5\x12\x20\x2b\xc3\xb4\xd6\xc8\x02\x86\xf7\x2b\x36\x3f\xf4\x16\xd6" + + "\x97\xf5\x0b\xda\x34\xe0\xb5\x27\x0e\x99\xa9\xd8\x49\x76\xed\x9d\x0d\xe8\xf7\x52\x55\x72\x3a\x27\xf5\xe4\x56\xf8" + + "\x27\x6e\xa9\xdc\x20\xe0\x3e\x88\xc3\x28\x0a\x43\xc1\x62\x68\xb5\x75\x74\x18\x55\x69\x58\x93\x96\x5c\xd1\xaa\x02" + + "\x1d\x90\x9c\x6f\x55\x1c\xa5\x1e\xa0\x6e\x5a\x4c\x11\xc2\x35\xb8\xc2\xab\x28\x41\x05\x7b\x49\x22\x29\x8b\x3c\xb6" + + "\x84\xec\xde\xed\xe4\x1e\x52\x12\x1e\xad\xbe\x8b\x9f\x31\xda\xa4\x39\xda\x61\x83\x11\x7e\x2d\x35\xdd\x46\xbe\xb2" + + "\x32\x1c\xfe\x10\x91\x5d\xca\x67\x4b\xaf\x93\x5a\x3d\x1c\x9f\x13\x1a\xf7\xa4\xbf\xfd\xf5\x04\x13\x91\x33\x61\x8f" + + "\x0e\x78\x7c\x68\xc4\x9e\xf8\xd2\xd6\xde\xa1\x34\xb5\xf8\x51\x3b\xd1\x46\x1f\x54\x5d\x09\x85\x85\x5c\x39\xf8\x8f" + + "\xac\x8c\xd0\x15\xe5\xb0\x9b\xfe\x59\x94\x88\xe3\x3f\x1a\xb5\x4f\x24\xde\x99\x32\xb8\x22\xe8\x39\xdf\xa5\x8d\xe7" + + "\x12\xad\x29\x42\x0a\x36\xa8\x4c\xe8\xf7\x44\x04\xe5\x4f\xde\xe2\x37\x18\xd4\xe2\xd7\xa3\x34\xe6\x1c\xb7\x58\x8a" + + "\xa5\xc5\xeb\x27\x91\xe4\x29\xc9\x97\x33\x5d\x84\x7f\x34\x6f\x6f\xc0\x31\x82\x32\xdf\xfb\xc1\x53\xf7\x10\x7a\x89" + + "\x1a\xe1\x6f\xf7\xf3\xdf\x89\x1d\xf7\xa3\x7a\xab\x1e\x04\x36\x76\xa8\xc7\xf9\x98\x41\x5a\x90\xe2\x77\x5f\xf7\xe2" + + "\x7e\xcd\xb1\x0b\x37\x87\xd9\x95\x1a\x24\xda\x02\x7d\x6a\x34\x3b\x22\x81\xb9\x52\xa9\x00\x86\x10\xa3\xbb\x0c\xc7" + + "\x88\xe9\x52\xc8\x7c\xaa\x0c\xa6\x8d\x24\xef\x67\x40\x64\x6d\xe8\xc6\xa1\x40\x18\x89\xfd\xb6\x44\xc7\xb4\xb1\x15" + + "\x72\x39\x58\xe5\x14\x59\x49\xb1\x35\x3e\xda\x8d\xc3\x8f\x3e\xa7\xb7\xc9\xb6\xde\x78\x89\xbf\xc8\xec\x83\x40\x66" + + "\x11\x75\xfc\x25\xc8\xe8\x45\x81\xb9\x00\x66\xe4\x53\xad\xcd\xb4\x54\x4b\x99\x4f\xd7\xe1\xb0\x72\x69\x73\x4f\x4f" + + "\xf0\x2f\xc7\x47\x61\x39\x8a\xfa\xe9\xd6\x8c\x23\xc8\x7f\x08\x69\x61\xcf\xb5\x4a\xa2\x93\x4b\xae\x83\xb6\x28\x9e" + + "\x85\x2d\x89\x77\xf1\x8e\xc1\xb8\x3d\x37\x7c\xeb\xcd\x45\x5d\x02\x91\x0b\x3c\x4d\x11\xf3\xe8\x6e\x60\x80\xdb\xa5" + + "\x44\xf4\x35\x40\xfd\xc9\xb6\x16\xb6\xc1\x81\x4f\x10\x16\x38\xbd\x3a\x97\x68\xf6\x12\xf6\x62\x7c\x60\x0d\xbf\x59" + + "\x72\x4d\x31\x2e\x33\x12\x78\xed\xdb\x14\x4e\xd4\x26\x5f\x65\x99\xfd\xaf\x6f\xbf\x65\x8c\x40\x97\x50\x2f\x7d\x06" + + "\xbd\x79\xc7\xf5\x53\x55\xc5\x29\xfb\x61\x37\x00\xd5\xbd\x13\x28\x9b\x51\x5b\xdd\xc9\x3f\x25\x29\x93\xb7\xad\x3a" + + "\xcb\xfa\x6b\xf9\x41\x09\x83\xae\x50\xe8\x0e\xd2\xcc\xe9\x8c\xc7\x9d\xb2\xf4\x52\xe6\xfe\x92\x3c\x78\xc2\xf8\xf6" + + "\x5a\x2e\xd5\x9e\xe8\x8c\x1f\x7e\x71\xf8\xf0\xa2\x13\x55\xcb\xd8\xa6\x65\x69\x9a\x40\x29\x32\x2f\xb1\x59\x41\x5e" + + "\x3b\x1d\x4b\xed\x09\x8b\x65\x0c\xc8\x6e\xfd\x3b\x10\xc5\xe1\x7f\x6d\xf9\x45\xdc\x37\x8e\x65\xf1\xe9\x0c\x7c\xa5" + + "\xbe\x58\x59\x10\x6e\x5b\xa0\xab\x38\x79\x25\xbe\x7d\x68\x1a\xb6\xcf\x58\x05\x51\xe4\x4d\x8d\x49\xa0\x79\x83\xe1" + + "\x36\x1b\xb1\x5d\x6f\xc2\x6c\xda\x0e\x4b\xb6\xd7\x0a\xb0\xaf\xd9\x23\x11\x67\xa9\x91\xa9\x9a\x28\x2a\x73\x5c\x4b" + + "\xfa\x33\x1c\x8a\x59\x29\x2f\x59\x7c\xc6\xe9\xf3\x1b\x44\xaf\x34\xc8\x00\x14\x3d\x88\x7d\xce\x0f\x0f\x1b\xbc\x0d" + + "\x97\xfc\x73\x2e\x0e\x94\xa7\x41\x71\xe6\xb4\x28\x76\x30\x3e\x51\xae\xa6\x03\x9f\xaa\x33\x42\xd5\x0b\xe7\xdc\x25" + + "\x9e\x21\x0b\x10\x1d\xb0\x40\x66\x0f\x4b\x35\xc7\xb9\x86\x3e\xe7\x70\x7d\x34\x0d\xda\x3f\x91\xf7\x2c\xb4\xe2\xb7" + + "\x66\x43\xaa\xaf\x0a\x8e\x52\x0b\xad\x08\xea\xe2\xfe\x9f\xa1\x15\x70\x26\xb0\xda\x55\x23\x12\xb9\x59\x80\x87\x19" + + "\x2a\xbc\x63\xf2\x87\xe8\x56\x28\x66\x45\x91\x51\x29\x63\x0a\xf1\x18\xb4\xa7\x53\xf0\xbe\xf4\xdf\x1c\x50\x36\x85" + + "\x2b\x99\x61\x7c\x1c\xa0\x63\x54\x53\xbe\x36\x91\x5e\xdb\x44\xac\xb0\x35\x8b\x00\xd9\x43\xa7\xc2\xd8\xe7\x82\xae" + + "\x8f\xb0\x14\x96\xdf\x3c\x98\x02\x00\xcc\x7b\x6d\x1c\xdb\x99\xe1\x67\x2d\xee\xd6\xec\xb8\x18\x8e\xc1\x89\x39\x1b" + + "\xde\x68\x76\x6f\xb9\x46\x29\xad\xb7\xdd\xa3\x0a\xab\x23\xa1\x8b\xee\x95\xcc\x06\x3e\x9e\x8f\xf9\x3e\x78\x48\x4e" + + "\x55\xcc\xc1\x71\xcc\x7d\x84\x60\x64\x14\x08\x31\x6c\x61\x6c\x61\x41\x52\xbf\xe7\xea\x9a\xca\x34\x25\xa2\x73\x8a" + + "\x75\x06\xac\x56\x75\x95\x97\x6a\x5a\x5c\xe6\xfa\xef\x2a\x0d\x0a\x43\x8c\xb0\x2e\x13\x76\xd3\x08\x3e\x7a\x19\xde" + + "\xf5\x36\x3f\x08\x2a\x26\xe0\x87\xd3\x55\xc4\x31\x66\x58\xac\xe9\x07\xfd\x41\xdd\x5a\xa7\x1e\x8e\xf9\xe1\x35\x50" + + "\x79\xaf\x53\x8a\x5e\xf3\x0b\x89\x0b\xae\x46\xce\x53\x7e\x20\xef\x41\xe5\xeb\x7c\xda\x54\x91\x1c\xbc\x9d\x23\xbf" + + "\x7f\xad\xc4\x23\x90\xb6\x1f\x39\x16\x97\x32\x78\xfa\xae\x7a\x42\x1a\xb3\xa2\x7c\x28\xba\x74\x56\xff\x5a\x59\x1e" + + "\x31\x16\x4e\xb6\xa6\x2e\xdc\x2b\xf4\x55\xf2\xec\x7b\xd0\x10\x1e\x9e\x62\xf0\x21\xec\xb6\xcd\x8a\x86\xf9\x35\x13" + + "\xc1\x79\x50\xdd\xd3\xa2\xac\x88\x8b\x27\xad\x51\x78\xe7\x46\x13\xa9\x07\x87\xdf\xe9\xb8\xe5\x13\xec\x01\xbb\x65" + + "\xdb\x50\xe5\x4b\x4b\xf7\x01\x82\x1e\x1c\xac\x26\xd7\x8d\x5a\xe7\x6e\xc4\xf7\x41\x8c\xa9\x9b\xfd\x92\x16\xe5\xfb" + + "\xc1\x5a\xa9\x3d\x71\x28\x1a\xb1\x1a\x43\xf1\x22\x53\xce\x20\xc9\x79\x6b\x18\xaf\xaa\xc2\x25\xa0\xf0\x45\x09\x03" + + "\x6f\x18\x33\x1a\x0e\x2f\x75\x35\x5f\xa1\x3e\x83\xab\x3e\x71\xf9\xa9\xe1\x72\x95\x65\xc3\xc7\x8f\xbf\xaa\x6d\x07" + + "\x9f\x1f\x4f\x09\xbc\x8b\x59\x8c\xe5\x3f\x57\x3a\xd3\xd5\x3a\x4e\x93\xc2\x49\x9c\x6d\x52\x1b\xbc\x17\xe8\x78\x16" + + "\x33\x21\x73\xaa\xc5\x08\x7f\xdb\x02\xf4\x2d\x87\x60\xe3\x12\x2f\xc0\x56\xf0\x29\xe0\x52\x52\x3e\xea\xcd\x3f\x68" + + "\xf5\xee\xb4\xae\x9d\x3d\x16\x04\xc4\x58\x74\x3a\x1e\xf1\xf1\xaf\x20\x17\x66\xe4\xab\x17\x66\xdf\x74\x6d\x82\x68" + + "\x23\x8c\x6e\x73\xf9\x49\xc9\x89\x4a\x1b\x4e\x99\xa2\x2c\x1b\x62\x57\x1b\xa1\x1f\x7b\x9b\xc2\x70\x35\xdc\x23\xe9" + + "\x84\xbc\x1b\x24\x95\x68\x65\xa7\xc4\x80\x6f\x82\x85\xec\x8f\x05\xaf\xdd\x86\xf8\x79\x94\x09\x84\xcf\x9a\x36\x9c" + + "\xc3\xf9\x02\x65\x7c\xfd\x89\x67\x6e\x38\x99\x03\x6c\xde\x0b\xf6\xfc\x81\xbd\x0d\x7d\x13\x86\x43\x81\xe6\x73\xdc" + + "\x02\x2a\xe9\xca\x25\x04\x6d\x14\xae\x21\x45\x29\x59\xa2\xd5\xb5\xc8\x74\x1e\x5d\x76\x87\x87\x5f\x3d\xf1\xa9\x83" + + "\x42\xf7\xdb\x70\xdc\xd6\x62\x95\xa1\x93\x73\xd0\x38\x0c\xac\x72\x30\x7d\x67\x81\xa9\x2b\x23\x30\xb1\x70\xa9\xc8" + + "\x8e\x46\x45\x8e\x98\x1e\x60\x5f\x3e\xce\xe2\x08\x1f\x1c\x45\x6f\x83\x64\x12\x11\x17\x18\x6d\x48\xe8\xca\x79\xfb" + + "\xd1\x6d\x79\xd2\xd8\x84\x2f\x6b\xd1\x8b\x0e\x2f\xff\x13\x0e\x91\x65\xb0\x3c\xae\xa0\x29\x28\xf5\xa8\x52\x60\xbd" + + "\x44\x1b\xbe\xa7\x73\x53\x95\x2b\x3a\x9d\x8c\x44\xe1\xb9\xae\xdc\x99\xe6\x54\xea\x2e\xa0\xd4\xca\x41\x63\x16\x14" + + "\x28\x99\x30\x62\x75\xfa\x1e\x23\x70\x80\xab\x81\x13\xbe\x32\xa8\xb6\x0b\x92\x3b\x8d\xc4\x57\x07\x94\x45\x9d\xf3" + + "\x12\xa0\xf1\x70\x14\xa5\x0d\x08\xea\x39\x8c\x84\x2b\xeb\x40\x4f\x3d\x7b\x33\x12\x7f\x70\x8a\xfa\x99\xce\x53\xff" + + "\x0b\x75\xa8\xfa\x0a\xde\x03\xa8\x3a\xcf\x3a\x23\xf1\x87\x48\x75\x39\x12\x1d\xaf\x86\xe8\xf4\x48\xcc\x1e\x91\x13" + + "\xe4\x2d\x95\x0e\x10\xed\x6d\xed\xeb\xfd\xf0\x75\xa9\xae\x74\xb1\x32\xbc\xe9\xed\xfd\xfd\xe3\x8e\x0f\xc4\xad\x4f" + + "\xb2\xef\x2a\xc3\xd8\x49\x73\xe1\x87\x80\x25\x41\x99\xc7\x62\x96\x4d\x63\x1b\x64\xb4\xfd\x04\x97\x77\xa7\x5f\x2d" + + "\xae\x48\x09\x7d\xa9\xaf\x54\xce\x14\xb8\x2a\x5c\x72\x4d\x71\x3d\x57\xa8\xcf\xe3\x52\x34\x45\xe9\x8a\x39\x05\xa3" + + "\x3f\xb9\x40\x7d\xbf\xfb\xb1\xd9\xf0\xdf\x5f\x06\x7f\x7f\x85\x7f\xd7\xaa\xcb\xdf\x39\xbf\x38\x0f\x29\x9e\xf0\x7f" + + "\x8c\x03\x27\xeb\x60\xf0\x0e\x71\x59\xf6\x01\x26\xf3\x8a\x95\xc9\x61\xf9\x69\xc7\x2b\xf4\xe0\x1c\x11\x39\x20\xe8" + + "\xfb\x92\x18\xdb\xe0\x3d\x7c\xe4\x52\x57\xa0\x73\xa6\x43\xca\x33\xfe\xf4\x82\x26\x77\x48\x6e\x46\x54\x4a\x23\xaf" + + "\xe6\x9b\xc1\x60\xc0\x39\xfc\x1e\x8b\xeb\xb9\xac\x44\xad\x8c\x06\xbd\x7b\xe2\x13\x5b\xf8\x82\x0f\xe7\xe9\x23\xf8" + + "\xff\x1c\x6b\x63\x9c\xa7\xfb\xdd\xe3\xa0\xb7\x2f\xc5\x4d\xde\x9f\x16\x8b\x65\x91\xb3\xb7\xe6\x4d\xbe\xbf\x0e\xba" + + "\x81\x8f\x8e\xe1\xf3\x0d\x7f\xf1\x95\x30\xfa\x32\xa7\x96\xfe\x4b\x7a\xf7\xb5\xb8\x69\x7f\xf1\x17\xf7\xd1\xba\xfe" + + "\xea\x1b\xb1\x6e\x7b\x8e\x56\xf0\x76\x04\xad\x27\x54\xa9\x6f\xf7\xe1\x45\xb0\x45\x4f\xd8\x90\xd2\xc9\xab\x79\xb0" + + "\xfb\xc3\xa1\xc8\xab\x79\xff\x91\xe0\x2a\x6d\xc6\x2d\x99\xde\xd3\xb5\xec\x50\xc2\x1b\x3e\x43\x5e\xdf\x0e\x78\x10" + + "\xe5\x98\xf4\x03\x70\xf1\x81\x1b\xe4\xcc\xb1\x1c\xb3\x5c\x28\x2c\x25\x04\xb7\x42\x10\x94\x32\xc0\xcd\x77\x1f\x96" + + "\x6a\xa1\xb0\x1a\x14\x6a\x8e\x50\xcb\x31\x44\x6a\x30\x95\x98\xb7\x0e\xc4\x13\xa0\x4c\xd9\x1a\x4e\xdb\xc1\xf0\x30" + + "\xc4\xe8\x2f\x01\x56\xfb\x89\x3f\x43\xc7\xfe\x08\xed\xb3\x9f\xcd\xd9\xd7\x78\x9c\x0e\xbb\x62\x24\x1e\x8b\x47\xe1" + + "\xe9\x43\x58\x01\xee\x74\xfc\xe1\xb3\x8f\x8b\x34\xed\x04\xb9\x6a\x5d\xb7\x38\x9e\xed\xe3\x2f\x17\xee\x2c\x7d\x73" + + "\x41\x29\x32\xdb\x7a\x09\xc8\x08\xd5\x19\xc5\x54\x45\x70\xad\xcc\xf5\x44\x57\xbe\xa2\x15\x9d\xc3\x46\x6e\xe1\x70" + + "\x53\xee\xde\x93\xb6\x33\x1c\x9f\x5a\x57\xf2\x66\xdb\xb1\x45\x81\xe7\x06\xee\x3b\x76\x22\x70\x35\xe9\xc6\x16\x49" + + "\xbe\xbe\xc0\xf8\x2d\xa6\x37\x4d\xac\x8c\x0e\x39\x6b\xca\xfc\x4c\x1b\x0a\x1f\x9b\xd3\x2d\xb2\x67\x3d\xc7\xbc\x29" + + "\x96\x9a\xfa\xc2\xcd\xd2\xf4\xb5\xa9\x9f\x82\x10\x40\x9e\x0c\xde\x41\x5a\x43\x1f\xc0\xaa\xd4\x4b\x5e\x71\x58\x01" + + "\x0b\x69\x96\x5b\xfb\xf6\x2d\x72\x4d\x40\xc2\x22\xb7\x1e\x5e\xb2\x7b\xe3\x13\x5a\xa3\xa7\x51\x65\x47\xa3\xd4\xbc" + + "\xb6\xe0\x59\x52\xaa\xe9\xaa\x34\x88\xeb\x4c\x7f\x12\x6e\x18\x66\xc2\xb5\xbd\xf6\xe8\xd2\xec\x46\x9d\xcb\xf4\x0a" + + "\x2b\x71\xb2\xd1\x19\x18\x2c\x31\xcd\x0a\x64\x5d\xe8\x6e\x9e\x2b\xc3\xf0\x0b\x7a\xb7\x7d\xda\x62\x97\x89\xe8\x74" + + "\x3b\x3d\xff\xd8\x15\xef\xe5\x2f\xba\xa2\x5f\x7f\x19\x5a\x6d\x61\x26\xdc\x92\x92\xb2\xa8\x4b\xf2\x2f\xc5\xee\xc3" + + "\x6d\x3a\xf0\xdb\x74\x10\x52\x32\x3b\xce\x51\x63\x4f\xdd\xb0\xdb\x1a\x07\x38\x44\xe9\x3f\xc8\xa9\x80\xeb\xa9\x19" + + "\x56\x70\x59\x66\x8b\x4b\x6b\x11\x69\xb2\x2e\x09\x89\xf3\x7b\xb5\xdb\xde\xbd\xeb\x66\x7c\x12\xca\x0b\x96\xbb\x72" + + "\x8c\xc9\x7d\x5f\xe0\x2a\x4e\x24\xf2\x46\x2e\x54\x23\x1d\xae\x15\xb2\x38\x20\xb9\xde\xee\x63\x0c\x41\x4b\x02\xae" + + "\x30\x68\x2e\x1a\xd2\x86\x62\xb1\xda\x27\x4c\x7c\x20\x42\x8f\x17\x71\x6b\x15\x41\xdb\x82\xfe\x1a\xac\xb5\x0d\x7b" + + "\xba\x23\x39\x18\x0e\x6f\x5f\xd9\x0b\xa5\xc6\x60\x70\x49\xb1\x96\xe0\xa9\x08\x5e\x4b\xac\x4e\x97\x8b\xb1\xf0\xe5" + + "\x7a\xcf\x82\xb6\x9c\xb0\xf4\x28\xa6\x8d\xf6\x2b\xab\x12\x4f\x7c\x37\x51\x4d\xa1\xe4\xd7\x6d\x45\xe1\xa2\x11\x5a" + + "\x8a\x0a\x6d\xbe\xe8\x76\xc2\xf3\xe9\x67\x17\x85\x81\x7d\x0c\xaa\x3c\x2f\x26\x2a\xa1\x58\x17\x84\xae\x87\x42\x9d" + + "\x05\xbc\x7f\xed\xeb\x5c\x34\x34\x82\x9f\x16\x89\xc9\x99\x1a\x3a\x5d\xcb\x99\xda\x1d\xab\xf1\x84\x0d\x16\x9c\x14" + + "\xa5\x05\x17\xd0\xec\xb1\x85\xb0\x26\x76\xde\x15\x4c\x4a\xba\x12\x2f\x49\x81\x2c\x13\xab\xb3\xe3\x84\xe0\xb6\x3d" + + "\xa9\x5d\x9a\xd0\xb4\x53\x21\x90\xed\x8e\x3b\x71\xc2\x6c\xce\xf5\x6c\x1b\x35\x3e\x0f\x7c\xc0\x82\x70\x42\x1c\x72" + + "\x7f\x1c\x5c\x2c\xed\xc3\x8d\x3b\xe2\xd8\xcf\x70\xcc\xd0\xb0\xfe\x71\x8d\xa9\xf9\xc6\xbb\x1f\x69\xfc\x2b\x36\xa6" + + "\x16\x4e\xd3\xe7\xa9\xb9\x85\x3a\x95\x6f\x6f\xef\xe2\xd1\xa7\x75\xf1\x2c\xf0\x20\xa8\xf5\xf0\x45\x6b\x0f\x4c\x27" + + "\xfb\xf8\xdc\x7b\x7e\x7f\x6c\xf9\xff\xc0\xce\x12\x96\x57\x2c\x88\x29\xff\xf1\x67\xcd\x6a\xd3\x0e\xf4\xcd\xa6\x36" + + "\xc1\x03\x46\x4e\x3b\xc5\x7d\x8c\x2d\xf5\x1f\xec\x8b\x4e\xbf\xe3\xc6\xf0\x5e\x7e\x0d\xaa\xd5\x10\x8b\x2a\xd4\x69" + + "\x81\x24\xe3\x93\xf1\xb1\xe4\xdb\x13\x19\xb0\xb9\x21\x35\xe3\xca\xa2\x14\x3f\x5d\x63\xee\x77\x2d\x73\xcf\xac\xd9" + + "\xac\x28\xaf\x65\x99\xd6\x1a\xf7\xbf\xb4\x4d\xa1\x73\xdb\xb6\x98\xb1\x62\x0e\x45\x2a\xe2\x4e\x49\xa0\xea\xd4\x28" + + "\x23\xb9\x59\x39\x97\x4f\x9c\x21\x61\xce\x71\x70\xc1\xdb\xf2\x33\xc8\xdf\x8f\x50\xc0\x48\xf2\xee\xa7\x5d\x14\xbb" + + "\xbb\xb5\x5a\x2b\x2e\x29\xbb\x35\xfb\xef\xd4\x4d\x57\xce\xe0\x75\xb3\x08\x4f\x35\x7a\xf1\x00\x49\xed\x09\xac\x72" + + "\xff\x82\xfe\x46\x3d\x25\xe6\x3d\xa5\xbf\x31\xe9\x60\x4f\x98\x4a\x52\x39\x7d\xfc\x5f\xaa\xb1\x70\x17\xc1\x1b\xe0" + + "\x65\xc1\x79\x2c\x3a\x81\x6a\xaa\x23\xda\x34\x17\xb6\x13\x97\xb9\xab\xb6\x22\x9f\xb7\x9e\x6e\x72\x06\xff\xdd\x97" + + "\xa2\xfb\x68\x65\x94\x2d\x1b\xbf\x0b\x0b\xde\xdb\x13\xbb\xd4\x83\x23\x30\x51\x46\xa7\x80\xf7\xc2\xcd\x19\x25\x41" + + "\x4d\x4a\xe0\x7f\x1a\xb5\x28\x6d\x63\xb2\xa9\x13\x0c\x02\x97\x57\xa7\x5f\x05\x20\x85\xcf\x77\x02\x7d\xeb\x91\x7f" + + "\x5a\x57\xc7\xc2\x3f\x67\xf8\x71\x14\xc5\xed\x46\x64\x70\x70\x9e\xb4\xbb\x58\x04\x00\xdf\xc8\x37\x6b\x8f\xfc\xde" + + "\x69\xf3\xbf\xe5\xff\xdd\xfa\xbf\x83\x3f\x91\x3d\x24\x3d\x26\x15\x0a\xb3\xfa\xf6\x11\x80\xab\xff\x08\xb3\xcf\x5f" + + "\x2b\xf4\x5f\xb1\xa9\xfd\xd2\x22\x57\xc2\x14\x5d\xdf\x0b\x22\x94\x18\x0b\x42\x25\x97\xb4\xb4\x03\x7d\x74\xa8\x6c" + + "\x13\xb6\xd8\xdb\x8b\x51\xca\xcf\xcf\x4f\xa9\xc5\xcb\xd8\xdf\x31\x7e\xa8\xb3\x00\x4d\x39\x99\x95\xd7\xb2\x8a\x91" + + "\x7d\x06\x3b\x4f\x8f\x2e\x8e\x22\xd4\xc8\x8b\xbc\x0f\x28\x85\x47\x16\x71\x22\x19\x0c\x06\x5d\xcc\xdc\xaf\x0c\x27" + + "\xdb\xc7\x8c\xfe\x45\x2e\x7e\xa3\xde\x7e\x8b\xb0\xc5\x8e\xbf\xb7\x27\x1c\x9e\x86\x7b\x41\xe6\x92\x0f\xe2\x37\xc0" + + "\x91\xdf\x48\xca\xc1\x0c\xce\x78\x82\xb2\x35\x26\xe3\xb1\xf9\x43\xdd\x57\xfe\xf8\x0a\x9b\x93\x2c\xcc\xda\xbe\xd9" + + "\x88\xa4\xf9\x74\x2c\xfe\xb8\x0d\xca\x20\x4d\xf9\x73\xdf\xd7\x19\x6d\xca\x85\x2b\x02\x16\x60\x31\x65\x54\x1e\x73" + + "\x0a\xfc\x03\x12\xd9\x53\x5d\x96\xab\xdc\xa0\x3b\x26\x3e\x3f\x0c\xbe\xb2\xe9\xa1\xef\xfc\xe0\x71\x6d\x18\x3e\x0d" + + "\x34\x9a\x4b\xbd\x16\x94\xe4\x3b\x0b\xde\x87\x9b\xd5\x38\x54\xfb\xfb\x51\x47\x61\x1a\x0c\x3e\x6b\xc8\xcd\x46\x48" + + "\xfe\xbd\xcc\xb2\x89\x74\x31\x3a\xe8\x09\x16\x6e\x0c\xfa\x26\x03\x6a\xf9\xaf\x12\x5e\x66\x08\xa3\x03\xe4\xfc\xb0" + + "\xe1\x60\x59\x2c\x93\x6e\x37\xa6\x39\xe4\x7c\x36\x57\x39\x25\x8b\xed\xd9\xa2\x0d\x9c\x9a\x36\x40\x25\x94\xab\x26" + + "\xa5\x92\x1f\xfc\xb7\x4e\x8f\xdf\x12\x71\xb0\xbf\x8f\xd3\xb1\xeb\x85\xe7\xb5\x4b\x25\xc6\x1e\xb7\xe3\x70\x54\x78" + + "\x73\xa2\x4b\x00\xbb\xbb\x08\x29\x04\xce\xe6\xa8\x8d\x4c\xdc\x46\x47\xe7\x67\xa3\x5a\xd0\x58\xb9\x18\x92\x7a\x82" + + "\x6e\x77\x8a\x43\x75\x81\x3d\x31\x7b\x7b\x5c\x55\x41\x8c\xc9\x86\x5a\xc7\xf6\xfa\x33\xc4\xf5\xae\x5d\x5e\xd7\x23" + + "\x5c\x0d\x11\x43\xc0\x44\x08\x7b\x58\xa3\x04\x6d\x54\xc0\xde\xe5\x40\x3e\x5a\x9e\x27\x54\xd8\xf8\xb8\xcf\xd7\x48" + + "\xe2\xb5\xab\xcd\x2a\x63\xce\xea\x65\xdd\xdf\xb3\xa2\x58\x62\x4a\x9b\x09\x2a\xd3\x09\x21\x3f\x82\x8d\xff\xe4\x19" + + "\xf8\xd7\x70\x99\x7d\x5f\xfe\x9c\x4b\xca\xe3\x70\x8c\xb2\x68\x01\x82\xfd\xaf\xec\x41\x11\x20\xa0\xc9\xe9\x5c\xa8" + + "\x7c\x5a\xac\xf2\x4a\x95\x1e\xbd\xea\x17\x68\x2b\xe5\x85\x05\x13\x24\x62\x54\xaa\x3f\x8b\x51\x29\x3e\x29\xcd\xe3" + + "\x71\x1b\x82\xc6\x9f\xd5\x6d\x47\xb1\x71\x9c\xda\x6f\xe0\xdb\x96\x3b\x6e\x38\x14\x27\xf9\xb4\x28\x97\x45\x29\x2b" + + "\x02\x4c\x31\x9b\x19\x55\xf5\xe0\xef\x9c\x39\x71\x79\x29\x75\x6e\x2a\x31\x5d\x4f\x33\xc5\xc5\x6b\x02\x74\xef\x8f" + + "\x91\x65\x75\x13\x08\x92\xe0\xe3\x94\x89\xbd\x05\xb0\xd0\xb3\xff\x15\x30\xbc\x07\xe8\x46\x08\x4f\x87\xfc\xf4\xd9" + + "\xd8\x3a\x4a\x04\x93\xbe\xfd\xa8\x4e\x95\xf4\x4a\xbd\x46\x26\x70\x58\x22\xbd\xeb\x53\x76\x3a\x4c\xa6\x86\xfe\x76" + + "\x18\x70\xac\x73\x1b\x72\xec\x92\x4e\xb4\x06\xac\x3b\x83\xe2\xf0\x41\xd8\x9d\x2f\x25\xf6\xb6\xd4\x45\xa9\x2b\xfd" + + "\x77\x2c\xae\x82\x15\x0b\xc3\x60\x66\x9d\xd3\xb3\xe9\xca\x54\xc5\xc2\x85\x23\xc2\x3c\x64\x9a\xaa\x94\x22\x25\x57" + + "\xcb\xa5\x2a\xb1\x5d\xa6\x2a\x2e\xbe\x6c\x6b\x82\x04\x5a\x7b\xa3\x2a\xb2\xc4\x19\xa1\xf3\xb9\x2a\x75\xc5\xba\xcd" + + "\x30\xd8\x96\x6a\x58\x5c\x5a\xad\xb2\xf7\x02\xe3\x46\x67\x56\x17\x87\x28\x8b\x6f\x7c\xbf\xf6\x65\xdd\x43\xcc\x9f" + + "\xf5\x58\x2f\xde\x59\xe5\xec\x03\xa3\x6c\xc8\x2f\xb9\x17\xf1\x18\x71\x90\x28\xd9\x5c\xc5\x42\xae\x31\x99\x5d\x68" + + "\x64\x05\x2a\xa5\xf3\x94\x3c\x5f\x60\xb1\xf6\xab\x40\x23\x5d\x2a\xab\x54\xac\x0a\xfe\x98\xc3\x55\x50\xa9\x68\x91" + + "\xc2\x7e\xf9\x7e\x65\x2a\xa0\x82\x9c\x85\x3c\x2d\x42\x0f\xce\xb8\x54\x4d\x5d\x53\x3e\x8b\x72\xcb\x37\xf4\x9d\xdf" + + "\xad\x2a\xb1\xb0\x71\x20\x36\x5f\x2c\xf0\xb4\x45\x96\xa2\x51\x4a\xa2\x0a\x34\x1c\xcd\x7b\x46\x06\xfc\x34\x6c\x13" + + "\x12\x05\x8b\xc5\xf6\xdf\x4e\x27\xc0\xe8\x8b\x38\x29\x57\x6d\xc7\x06\xe4\x65\xf7\x96\xb3\xd3\x26\xed\x1b\xd8\x75" + + "\xa1\x83\x9f\x95\x02\xdf\x66\x14\x48\x6f\x9c\xc4\xc4\x11\xb9\x29\x67\xc1\xa7\xef\x1a\xa9\xef\xc3\xec\xf7\x4e\x75" + + "\xed\x28\x45\x7b\xe9\xb5\x9d\x1d\x9d\xc2\xb5\x51\x0b\x77\x08\x26\x96\x86\x95\xd7\x6c\x2a\x7b\x98\x9d\xa0\x74\xf6" + + "\x76\xfe\xfe\x59\xeb\x77\xae\x5a\xa7\x0f\x99\xdc\x2a\x48\x87\x18\x41\x02\xf2\x01\x2e\xd7\x04\xb4\xaa\xd5\x24\x34" + + "\xcb\xeb\xba\x6a\x3e\x7f\x23\xe7\xa9\xf2\xb6\xa8\x54\x5e\x69\x4c\x22\x3b\x2d\x40\x32\xbc\x09\x4f\x72\x27\x2f\xaa" + + "\xce\x68\x7b\xcd\x82\x9a\x46\x1b\x3d\x46\x34\x5f\xed\xf6\xe5\x92\xcb\x24\x15\x38\x80\xce\x1c\xb1\xf3\x09\x89\xe0" + + "\x1c\x01\xb3\x6a\x13\x6a\x02\xdb\x58\x95\x54\xee\xda\xb6\x46\x55\xab\x11\x14\x25\x38\xd1\xb9\xe4\x6a\xf6\x71\xc2" + + "\x09\x97\xea\xcc\xa7\x37\x73\x8f\x68\x23\x30\xe2\x82\x26\xf2\xd1\xca\x6b\x9e\x76\x84\xe6\x00\x55\x86\xe7\xf6\xd8" + + "\x76\xfe\x71\x9c\xbe\x53\xb3\x11\x64\x6d\xdb\xd9\x59\xe5\x1e\xc5\x79\x4c\xdb\x17\xf9\x3b\xdf\x2c\xb2\x9e\x38\xbb" + + "\x08\x90\x5d\x73\xf9\x84\x5a\x85\x87\xb6\x1a\x0f\xbe\xf7\xc9\x5a\xfc\xc6\xfd\x5b\xb9\x6f\xcb\xc1\x20\x36\x89\x3d" + + "\x7a\x5c\x07\x58\xd9\x21\x3c\x3e\x78\x1c\x74\x5c\xd9\x41\x5f\xb0\x0e\xa1\x05\xfd\xf9\x8e\xed\xb6\x9b\x1d\xb6\x02" + + "\x0c\xb7\x9b\x2c\x4a\xa1\x72\xc2\x81\x4a\x53\x70\x52\x00\x2b\xe7\xe9\x79\x54\x53\x4f\xb9\xfa\xb1\xc0\x1d\xc6\xc6" + + "\x89\xae\xbd\xf4\xe7\xd2\x7c\xc6\x29\xf8\xb4\x24\x93\xcd\x22\xdf\xd4\x2c\xf6\x5f\x6f\x99\x8c\x75\x0c\xdf\x3e\xa3" + + "\x28\x23\xe0\xa7\xcd\x26\x69\x3a\x8f\xb1\xeb\xf7\xc0\x7b\xaa\x6d\x36\x75\x57\xad\x50\x3f\xcb\xa3\x3e\xf3\xe1\x91" + + "\xf1\xc4\x87\x43\xd1\xf9\x85\x1d\x67\x82\x10\x7b\x8c\xea\x24\x47\x58\x76\x8c\x92\x62\x94\xc9\xfc\x32\xe9\x3a\xd8" + + "\xf0\xe7\xda\x70\xd1\x01\x53\x64\x5c\x63\x15\x28\x0d\xf7\xf4\xd0\x08\xf8\x6c\x25\x2f\x95\xad\xb5\x41\x95\x98\x15" + + "\x90\x14\xf5\xfb\x4a\x66\xd6\x56\x4a\xe1\x85\x33\xad\x4a\xf1\xc2\x3a\x9e\x17\xa5\x98\xa8\x4b\x9d\xe7\xd0\x1a\x39" + + "\xa2\x7a\x4b\xa1\x17\x0b\x95\x6a\x59\xc1\xd8\x94\xbb\x8a\x26\xdc\xe9\x77\x06\xdc\x0b\x16\x03\x03\x2c\xc4\xa4\x62" + + "\x33\xf1\xc2\x71\xb0\x77\xcd\x14\x56\xb6\x54\xe5\xac\x28\x17\x2a\x6d\x30\x87\xd9\x3a\xec\x3d\x9a\x51\x9c\xb5\x9d" + + "\x3d\x27\xa9\x02\x8a\x1f\x02\xbd\xdc\x3b\xdc\xc5\xc7\x38\x4c\xf8\xaa\x4f\x37\x00\x62\x1b\xfc\xae\x63\x5a\x80\x4c" + + "\xf0\x3a\x24\xff\xf8\x9b\xd6\x64\xb3\x75\xd9\xf9\xf8\x89\x7b\xa6\x64\xb7\xf4\x4f\xc9\xe8\x85\x1d\xa0\xe1\xa9\xbb" + + "\xcd\x11\x22\x62\xf8\xa0\x3d\xb1\x7b\x34\x95\x30\x32\x17\x9f\x8c\xf1\xc5\xbf\x60\x4c\xbd\xcb\x62\x05\x4f\x7e\x90" + + "\xf9\x25\xd3\x8d\xb4\x88\xf3\x0b\x24\xf6\x7d\x50\xcf\x2f\xf2\xed\xb7\xee\xfd\x38\xd3\x51\xf4\x28\x36\xc9\xdd\x2c" + + "\x32\x3c\x14\x64\x95\x6b\x69\x40\x2f\x6b\xd2\x6d\x30\xbc\xfd\xb3\x6d\xa1\xb1\x55\x97\x3e\x18\x13\xdc\xec\x68\xf8" + + "\xa9\x3b\xea\xf8\x86\x8c\x24\x6c\x68\xaa\x0b\x4d\xa2\xee\x32\x5e\x53\x99\x77\x23\xed\x78\x28\x43\xc7\x9c\x66\xd3" + + "\xf6\x12\x90\x93\xd7\xda\x4c\x55\x96\xc9\x5c\x15\x2b\x62\x57\x2a\x59\x5e\xaa\x2a\x92\xce\xa2\x4d\xe3\x4a\x1e\x73" + + "\x31\x16\xd7\x98\x10\x6b\x90\x15\x53\x69\xf3\x52\xd4\x1e\x01\x5b\x3b\x8f\x50\x01\x3f\xa5\xa8\x12\xe7\x14\x60\x2d" + + "\x47\x44\x2b\xd3\x58\x5a\x2c\x8b\xe2\x8e\xd9\x04\x40\xb7\x41\xbc\xaf\xec\x6d\xe6\xba\xc0\xec\x8e\x9f\xd5\x47\x4b" + + "\x42\x49\xaa\x9f\xed\xde\xcd\xa5\xf9\x1e\x93\x46\x52\x69\x90\xf8\x61\x42\xf1\x22\xbb\xbb\x89\xaf\xce\x65\x71\x6e" + + "\x5e\xaa\x19\xfc\xf8\x07\xbd\x92\x13\xd4\xb3\xc4\x86\xe1\x20\x11\x9d\x8f\xd3\xc1\xa5\xd8\x44\x4f\x9f\xb2\x98\x81" + + "\xcb\x6e\x85\x72\xbc\x4f\xb4\x61\xe1\xe2\x32\x45\x7d\x7e\x6f\x4e\xed\xee\x3a\xb3\x39\xd6\xb6\xf6\x85\xda\x0a\xf1" + + "\xe2\xf4\xf4\x49\x6f\x5b\x32\x3a\xcc\x07\x61\x5f\x01\x07\xeb\xb2\xd3\xfd\x1b\xd2\xd2\xd5\x7c\x47\xee\xb0\x33\x45" + + "\x08\x9c\xf8\x6f\xe2\x0a\x75\x6c\xa5\xe3\x21\xba\x4e\x93\xe4\xdb\x52\x8a\xbd\xb0\xb1\x5d\x5f\xcd\x2f\xc0\x3e\xbe" + + "\x13\x98\xcf\x5d\x91\x14\xf4\xff\x77\x85\x4d\x16\xf2\x83\x32\x0e\x72\xfd\xc9\xba\x1f\x14\x1e\xc5\x6b\x1a\xa7\x81" + + "\x81\xc1\x54\x07\x80\x2a\x95\x53\x07\x61\x2a\xc3\x1a\xc1\xf1\x74\xbb\xf6\xc2\x2d\x03\x51\xb9\x55\x8e\x8a\x56\xdb" + + "\x8e\x41\xc3\xa1\x60\xbe\x89\x51\x7d\xb1\xac\xd6\x77\x42\xe0\x63\x17\x31\xf6\x10\xdc\xc4\x68\xea\xa3\xfc\x99\xda" + + "\x90\x9b\x15\x71\x1f\x96\x91\x4a\x0e\x51\x75\x6b\xb3\x8d\x52\x70\x67\x02\x5c\xd9\x48\x3c\x39\x12\xd3\x54\x56\x72" + + "\x24\xbe\x3c\x12\x70\xe1\x56\x6b\x51\xaa\xd9\x48\x7c\xd5\x75\xc9\x48\x05\xa6\xd1\x04\x66\x62\xb2\xe6\x52\xd5\x22" + + "\x61\xcf\xf8\x91\xf8\xe6\x68\x8b\x6b\xfc\x48\xfc\xe5\x48\xa8\x6a\x3a\x70\xf9\xe4\x1c\x45\x7f\x2a\xbe\xe6\xba\xf8" + + "\x36\x49\x6e\x10\xef\x96\x3c\xee\xda\x72\x37\x72\xb9\x54\xb2\x44\xd1\xee\x4f\x0f\x31\x68\xc9\x25\x0d\xd3\x6a\x98" + + "\xa9\x43\x53\x62\x4b\xa6\x9f\x26\xc9\x20\x0c\xfa\x28\xf5\xd9\x8d\xf4\x5e\x8c\x17\x17\x51\xa8\x43\x80\x43\x4c\xae" + + "\x87\x51\x95\x4b\x10\x40\x94\x4c\x55\xf9\xd1\xc1\x4a\x6a\x67\x03\x96\x23\x17\xad\xda\x29\xa5\xa3\xff\xd1\x0e\x29" + + "\xbf\xcd\xa7\x74\xc8\x65\x1d\xef\xbc\x7a\x3f\xb1\x8e\xe4\xa7\x97\xd2\xb4\xa3\xb6\x56\x98\x8c\xe7\x07\x07\xe1\xee" + + "\xd9\x01\x72\x1e\x35\xce\xfd\x1d\xa6\x00\x3f\xad\x80\xb2\xf8\xb9\xe1\x88\xf8\x92\x5e\xb7\x94\xf6\xe1\xac\xb9\xea" + + "\x5a\x00\x53\xf8\x55\x10\x4d\x8f\x3c\xb4\x11\x89\x1a\x5c\x0e\x7a\xa2\x63\x94\x2c\xa7\xf3\x4e\xd7\x9e\x15\x14\x50" + + "\xda\xc6\xa3\x4e\x13\x91\x70\x58\x70\x0b\xab\x88\x7e\x20\xdd\xae\xf3\x9b\xda\x6c\x70\xdc\xb6\x05\xd2\x12\x1a\x68" + + "\x6a\xf3\xf9\xf4\x75\xde\x9f\x16\x59\xe6\xf3\xe3\x76\xf0\x88\x76\x46\xdb\xaa\x6a\x36\x4a\x2e\x31\xa8\xcf\xc4\x81" + + "\x2d\x45\xee\x04\x5d\xf4\x68\xf9\x78\x4f\x51\xa9\xc9\x9e\xa8\xe5\x9b\x74\xfd\x3b\xbf\xd6\xc3\xc6\x40\xea\xf7\x7f" + + "\x76\x98\x16\xa5\xbf\x1b\xd0\xbd\x79\x2a\x0e\xc4\xb1\xff\xb9\x6f\xa7\x32\xaa\xeb\x57\x83\x19\x5d\xa9\xfc\x5f\x5e" + + "\x3a\xea\xc5\x84\x63\xce\x89\x9c\x1e\x09\x2d\x9e\x72\x4b\xf8\x7b\x7f\x2c\x1e\xd7\x1c\xaa\x6d\xa9\xd0\xb6\xe0\xcc" + + "\x48\x11\xc6\x0d\x6b\x73\x2f\xd2\xf4\x4f\x9b\xfa\xe1\xff\xec\xd4\xb3\x7f\x1a\xdf\x5a\x10\xc1\xae\xe1\x33\xf0\x20" + + "\x5e\x6d\xbf\xaf\xd1\x24\x75\xf4\xe7\x2e\xf2\xf2\xff\xaa\x45\xee\xef\x87\x9b\xfa\xa7\x2c\x94\xab\x9a\xbb\xd0\x3c" + + "\x7f\xfb\xe6\xd5\x1c\x8b\x38\xd4\xee\xe4\xdf\xb9\xa0\x0a\xf0\xa5\x69\xca\xd5\x95\x83\x3b\xd8\x6b\xc4\x69\xd6\x1a" + + "\xb8\xcf\x3f\x44\x29\x53\x5d\x50\x3c\x1b\xfb\x13\x4e\x8a\x1b\xfb\x7b\xa6\x33\x65\xff\x5e\x4a\x63\xae\x8b\x32\xb5" + + "\xbf\xf5\x42\x5e\x2a\x1b\x08\xc7\x6b\x8e\xcd\x63\x1a\x2d\x07\x2d\x75\xab\x09\x08\xb7\xb5\x99\x98\xd5\x64\xa1\x2b" + + "\xdb\x7d\xa9\x8c\xaa\x3e\xb9\xfb\xb8\x2a\xb4\xeb\x9f\xca\xc4\x4a\xb3\x16\xcf\xdf\x9e\x50\x54\xaa\xd5\xd2\xe7\xea" + + "\x3a\x30\x03\x86\xf5\xd7\xdd\xc3\x84\x32\x78\x04\x26\x22\x9f\xbc\x61\x1c\x46\x08\x99\xda\x6e\x1c\xf1\x96\x05\x66" + + "\xc6\x71\x6d\x40\x8e\x8d\x72\xb1\x14\xce\x5d\x38\x78\xd2\xd4\xce\xc2\x2e\x94\x46\xfd\x98\x67\xeb\x20\xc6\x99\xd5" + + "\xd8\xac\xa1\xef\x51\xe8\x85\xe9\x91\x1b\x27\x60\x93\x29\xbe\x97\x65\x4f\x5c\x96\xc5\x6a\x69\x7a\xc2\xc5\x21\x92" + + "\x69\x93\xbd\x42\x38\x64\x83\x5d\x52\x9c\x3e\x38\xf2\x45\xa7\x2c\x7a\xd4\x3e\x0e\x52\xf5\xf3\x3a\x16\x07\x62\xc4" + + "\x8d\x6a\x91\xfb\x24\x91\xe0\x6c\x50\xcf\x4f\x43\xc0\x1b\x9a\x9a\x2d\xc7\xe0\x23\x25\x3d\x64\xed\x13\x9a\x88\x55" + + "\xcc\x50\x5f\x61\x3e\xc8\x17\x98\x3c\x99\xca\x5f\x95\xa6\x12\xe5\x0a\xaf\xf4\x20\x64\x4c\xa5\x28\x18\x2e\x38\x2f" + + "\x6f\x89\xe9\x96\x07\xea\x46\x4d\x5d\x7f\xb5\x74\x00\x71\xbc\x91\x4f\xf0\x31\x2d\x72\xca\x83\xc0\x56\x1e\x0c\xc1" + + "\x95\x68\xde\x41\x6d\x21\x35\x77\xeb\x85\x7f\x2d\x44\x5c\x08\x89\xbb\x33\x36\x1b\x6a\x11\x92\x07\x02\x0b\x93\x8e" + + "\x84\xf6\x15\x81\xd4\x8d\xf3\x68\x05\xa6\x44\x96\x00\x3c\x34\x42\x2b\x13\xe9\xf3\xc2\x95\xdb\xb7\xdb\xd6\x5f\xb3" + + "\xe0\x0c\x28\x93\x17\xd3\x30\x9a\x10\x4d\xcf\xe9\x13\xb3\x95\x1a\x39\x94\x74\x00\x7b\x21\x4d\x65\x53\xd5\x4a\xcc" + + "\x7a\xeb\x86\x46\xbf\x9a\xa5\x9c\xb2\x53\x04\x60\xed\xc8\xc3\xa7\x61\xd3\x12\x1d\x41\x42\x9a\xf5\xa3\xdb\x0e\x5f" + + "\x1f\x08\x54\xcf\x3a\xe6\x8e\xbd\xa5\xe1\x78\xa8\x75\x1e\x9e\xea\x18\x07\x1c\xd4\x7c\xc0\x18\x7b\xa3\xd4\x41\x87" + + "\x5a\x2a\x8f\xc1\x81\x43\x1f\xb3\xb5\xb6\xa7\x66\x1b\x87\x6a\xc1\x0e\xdc\xbd\x05\x6d\x7b\xd0\xbe\x09\x0c\x58\x47" + + "\x14\x7c\x4e\x68\x6e\xc9\x62\xa3\xed\xf8\xd3\xc1\xea\xa2\xdc\x9b\x07\xcd\x65\x81\x73\x1e\x36\x51\x5a\x0b\x8e\x77" + + "\xaa\xe6\xca\xde\xb0\x94\xd4\xce\x25\x3f\xa7\x48\x29\x6a\x8c\xee\xad\x0f\x4b\x45\xfe\x08\x40\x70\xc8\xb0\x1a\x26" + + "\x5c\xeb\x71\x2a\x75\x5b\xa9\x46\xb8\x84\x54\x4c\x15\x7d\xec\x7b\x40\xb1\x1c\x8d\xb4\xeb\x1a\xb9\x27\xac\xe2\x8e" + + "\x75\xf7\x81\xb1\x6c\x64\xf5\x05\xde\x33\xca\x0d\xc4\x9b\xc3\x01\x34\x9e\x86\x33\xb1\xeb\xc6\xd4\x91\xae\x7a\x5f" + + "\x53\xbd\x70\xe5\x82\xb8\xc7\x80\xe2\xfb\xfc\x15\x99\xca\x2d\xe5\xb6\x69\xb2\x89\xe4\xfb\xfc\x6b\x18\xe3\x51\xe7" + + "\x3e\x8f\x84\xde\xdf\xf7\x19\x90\x2c\xb1\xb7\x5d\x9d\xe9\x0b\x4a\xa9\x53\xcb\xe7\x14\xd0\xec\xdb\x68\xba\x32\x4d" + + "\x3d\xad\xb1\x78\x52\xf6\x82\x73\xde\x43\xb3\x57\xb0\x08\x72\x41\xf6\x0d\x06\xa9\xa6\xe4\x96\xc8\x85\xbc\x29\x72" + + "\x5b\xf7\x49\x8c\xe9\x53\xf4\x74\xe2\x20\x89\x30\xc6\xff\x3e\x66\x87\xcf\xad\x1a\x11\xfe\xc4\x24\x80\x61\x1a\x2a" + + "\x37\x08\xdd\x0a\xc7\x96\x3e\xc6\xfe\x59\x59\x61\xb0\x58\x0b\x27\xfd\x1b\x2e\x4b\x35\x55\x68\xcc\x0f\x9c\xda\x3e" + + "\xc9\xba\xdb\x66\x39\x68\xba\x97\x6f\xad\x11\xb6\xd9\x88\x06\x14\x1a\xda\x1e\x67\x28\x6e\x9b\x47\x53\x0b\xe4\x62" + + "\x15\x1a\xeb\x96\x59\x76\xc7\x9a\xcd\x27\x2f\x1a\x76\xb5\xc8\xd2\x17\x8d\xf0\x06\x9a\x4b\xae\xae\xad\xbb\x74\xe8" + + "\xbe\x67\x77\xee\x22\x70\x71\xfa\x05\x53\x0f\x3d\x44\x4f\x2d\x21\xcb\x89\xae\x4a\x59\xae\x9d\x97\xb7\x2b\xd1\x8f" + + "\x75\x9d\x31\x2d\x30\x55\x01\x9d\xa8\x5c\xcd\x74\x45\xce\x5c\x00\xed\xa0\x8c\x2a\x41\x3b\x32\xc1\x7f\xda\x2e\xfd" + + "\xb3\xdb\x14\x30\x0f\xdb\x76\x29\x72\x3b\xd8\xe2\x4f\x1f\x99\xa4\x68\x3b\x23\xbf\xd5\x7f\xf3\x22\x22\x37\xf7\x4f" + + "\x76\xfb\x3d\x8a\x60\x90\x58\xac\xa8\xb9\xba\xf3\x24\xad\xea\x09\x46\xe3\x86\xa8\x4a\xa9\xbb\xab\xfb\x97\x87\xf6" + + "\xa5\x45\x9e\xd8\x1f\x16\x93\x05\x62\x52\x83\xaa\x10\x0e\xed\x4c\xe1\x1c\x28\x26\x72\xfa\xa1\xbf\x2c\x8b\xa5\xbc" + + "\x44\xe7\xb7\xc2\xb9\x49\xc7\x76\x8e\xd0\xb9\xc0\xf6\x73\x26\x1e\xe3\x2a\xfd\x6c\x1e\x8b\x8b\xc0\x2b\xa4\xc5\xa9" + + "\xf8\x27\xb5\x32\x0a\x26\x32\xfd\x57\x26\xd2\x80\x1c\x49\x15\xf8\xe4\xa8\xb6\x7a\x66\x24\x16\x58\x9f\x88\xae\x4d" + + "\x80\xd5\x91\x90\x54\x57\xc2\xbe\x70\x36\xf7\x0f\x4a\x2d\x09\x0f\xec\x71\xf1\xbb\x57\x5f\xf9\x9d\x28\x5d\x8b\x9e" + + "\x69\x43\xea\xc8\x95\xb6\x05\xbd\xef\x73\x2e\xfa\xf8\x8a\x61\x78\xbc\xb6\x83\xf3\x2c\x6a\x39\x4b\xed\xd3\xd0\x4f" + + "\xf0\xf8\xb3\x28\x98\xf7\xb7\x73\xbd\x1c\x45\x34\x3d\x72\x2a\x0a\xf9\x9d\x12\xee\xcd\x8f\x1e\xf4\xcf\xd5\xd5\x13" + + "\x8f\xe1\x46\x38\xb8\x68\x40\x66\xb1\xca\x2a\xbd\xcc\xd4\x0b\x1a\xd2\x84\xcc\x06\x4f\xc3\xf4\x5a\xd2\xc4\xd5\xd9" + + "\x08\xdb\x36\x58\xf5\x5d\x6c\x43\xd3\xf9\xc7\x76\x80\x89\x71\x23\x67\xa5\xdb\xd6\x64\x62\xd1\x2a\xa6\x45\x9e\xaa" + + "\xdc\x60\xc6\x80\x40\xa4\x5d\xf6\xd8\x2f\xb5\x75\xcb\x22\xa7\xb3\x5c\x5d\xff\x1c\xf8\x9c\xb1\xcf\x5c\x7d\x95\xae" + + "\xf7\x90\x5f\x5a\xc8\xe5\x92\x79\xec\xa5\xd8\x0d\x53\xa0\xdd\x05\x81\x4f\xf0\x27\x23\xfc\x60\x89\x62\xb3\xe1\xb5" + + "\x7c\x0c\x49\xc2\x95\xb4\x55\x08\xe5\x9b\x05\xe7\xec\x31\x6b\x21\x97\x75\x35\x53\x74\xa4\xea\xd9\x48\xc3\x51\x1a" + + "\xdb\x61\x94\x3f\x6a\x4e\x52\xe9\x05\x9b\xed\x78\xbc\x65\x61\x2a\xfb\x9a\xfe\xce\x53\xfb\x77\x2d\x5f\x00\x85\x00" + + "\xba\xf6\x68\x87\xf5\x3f\x5b\x3c\x89\x83\xb6\xe3\x78\x4a\xfe\x85\x43\xb0\xa0\x77\x98\x41\xd0\x3b\xfc\xdc\xda\x7b" + + "\x9e\x6e\xe9\xbd\x6d\x19\x35\x64\xbe\xd3\x63\x92\x31\xbd\x9d\xd6\x00\xe6\x56\x6a\xb1\xec\x09\xdd\x0b\xfc\x26\x97" + + "\xa5\x7a\x2d\xc3\x7a\xb7\x30\x7c\xed\x49\xa9\xb0\x06\x85\x46\x9f\x18\xeb\xfa\xe7\x90\xd9\xf2\x50\x7f\x55\x95\xd0" + + "\xb9\xae\xb4\xcc\xbc\xd7\x24\x32\x46\x30\x3b\x67\x65\xbd\x21\xab\x34\xb4\x30\xec\x7d\x89\xe9\x47\xb6\xd2\x14\x74" + + "\x6c\x7a\xd4\x71\xab\xf2\xfc\xc4\xb1\x38\x73\x99\x60\x2f\xc4\xc8\x2f\x9b\x7d\x3c\xed\xcc\xde\x96\x8a\x0f\x44\x55" + + "\x60\x96\x54\xeb\xd4\xca\x1e\x8f\xe8\x48\x57\x5e\x51\x01\x4a\x38\x90\x70\x06\x61\x62\x7d\x4b\x53\xcc\x3a\x9f\xce" + + "\xcb\x22\xd7\x7f\x97\xce\x53\x9d\x3b\x39\xc9\x43\xd1\x1a\xa5\x71\xb7\xa8\xdd\x40\x72\x63\xdf\x25\x4f\x75\x10\x02" + + "\x38\xf8\x6b\x20\x3a\x01\xce\xd7\xb6\x8f\x5d\x9c\xa8\x3d\xaf\x8a\x07\xff\x71\xe5\xd3\x27\x5b\xd9\x91\xf3\x05\xda" + + "\xbb\x56\x46\xc8\x55\x94\x4c\x11\x54\xca\x48\x53\x94\x18\xf1\x88\x53\x0e\x90\x1c\xb3\xba\xf9\x7d\xb7\xa8\x45\x23" + + "\x04\x78\x8c\x61\x22\xf8\xf1\x71\x00\x85\x51\xf4\xf1\x66\x13\x1d\x1f\x1f\x25\x0d\x53\x1d\x0c\x06\x3a\xaf\x54\xc9" + + "\x5e\x82\x91\xc1\xdc\x88\x5c\xc1\x0f\x59\xae\xf9\x83\xb3\x0b\x1f\x01\xcd\x5f\x17\x2e\xfb\x39\x30\x3d\x76\xc7\x28" + + "\x66\x35\x5b\xbb\x4b\x90\x1e\x8f\x42\x1d\x47\x79\x92\x1f\x05\x2a\x9a\x3c\x15\xcb\x52\x2f\x80\xf1\x67\x4d\x85\xa3" + + "\xb9\x16\xc2\xb1\x9a\xca\x33\x05\x27\xb9\xa3\x4f\x3f\x02\x46\xb5\xc8\x46\x5e\x19\xf4\x7c\xb9\xcc\xd6\x01\x44\xdc" + + "\x28\x11\x90\x68\x20\x38\xb1\x74\x53\x32\xd6\x84\xa3\xd8\xa3\xca\xb4\xd7\x7f\x9e\xf0\x49\x3f\xbb\x68\x99\x8a\x3d" + + "\x15\x3f\xe7\x7d\x62\xda\x66\xac\x4d\x74\x87\x76\xb2\x16\x9c\x38\xb6\x9a\xab\x85\xb0\xd1\x91\x6e\xad\x74\xd1\x88" + + "\x31\x8e\xf2\x89\x2c\x8b\xbd\xb5\xe0\x93\x9a\x03\xb4\x5f\xd2\x99\x5d\xd2\x99\xbe\x10\xa1\x3f\x74\x79\x92\x37\xde" + + "\x85\xce\xd1\xb7\xed\x7a\x21\xc4\xcb\xe8\x66\x8c\x31\xd7\x23\x6c\x3c\xd9\xa0\x95\x9f\x26\x93\x38\x0a\x5c\xc9\x65" + + "\x16\x6c\x05\x46\x10\xd1\x16\x39\xef\x9c\x08\xa9\x75\x0e\x9c\xb6\xef\xd5\x32\x2e\x56\x55\xa6\xb8\xe4\xb8\x65\x59" + + "\x03\x9e\xf0\xc7\x55\x55\x0b\xc3\xf8\x14\x67\xf3\x00\xa6\x75\x6f\x73\x94\x0f\x30\x98\xd9\xef\x28\x17\xd5\xc5\x8f" + + "\xb9\xc4\xfe\x1a\x24\xe1\x70\xa5\xae\x03\xdc\x75\xd6\x11\xfb\xed\xf1\x0e\xeb\x6d\x11\x1b\xfc\xaf\x07\x41\xc2\x7e" + + "\xe6\x49\x44\xc9\xce\x2e\xba\x3d\xc6\xdd\x9a\x56\xc1\x91\x36\xcc\x33\x68\x99\xae\x96\x7b\xa6\xf2\xc2\x8e\x15\x33" + + "\x10\x8b\x3d\x09\x67\x6f\xb0\x3b\x81\xdc\x0e\xe3\xbb\x40\xec\x85\xca\x84\xb7\x33\xd8\xef\xe3\xd6\xe0\x18\x76\xa6" + + "\x18\xf1\x1d\x80\xdd\x60\xa2\x8e\x48\xba\xc4\xe8\x00\xe8\x92\x0e\x84\x4d\x11\x6c\x9f\x44\x31\x02\x75\xb9\xc6\x52" + + "\x9c\x34\x00\x95\x07\x50\xcf\xd5\xbd\x0e\xa6\xaa\x67\x82\x13\xdd\xdc\xaf\xe7\x36\x8d\xb6\xca\x91\xa4\x88\xa2\xe2" + + "\x3b\x9f\xc8\x38\x88\x5e\x72\x70\xb6\x99\x88\x83\x1b\xa2\xd7\xdc\x87\xa0\x2c\x9a\x7f\x87\x0f\x6c\x15\xd4\x6d\x07" + + "\xb5\x89\x63\x6e\xb9\x21\xf1\x0c\xf0\x2b\x16\xa1\x01\xb3\x07\x12\x68\x74\xd2\xf6\x65\x33\xd5\x6a\xb7\x29\x20\x51" + + "\xeb\xef\xcb\x62\xf1\x0e\xf5\x9b\x2d\x3a\x55\x94\x7d\x5f\x58\xe2\xec\x98\xdb\xf7\x77\xaa\x59\x39\xd6\xe7\x27\xce" + + "\x46\x6a\xad\x55\x36\x3b\xe9\x99\x55\xa7\x1e\x5c\x90\x8b\x0b\x4b\x24\x0b\xaa\xb7\x1d\x7c\x56\xef\xc8\x46\x14\xba" + + "\x9e\x3a\xa2\xe3\xc5\x99\x7a\x6b\x2c\x04\x22\x0e\xbc\x6f\xcb\x3b\x20\x8a\xc5\x2a\x4f\x25\x59\xc6\xdd\x85\xa9\x72" + + "\x83\x49\xc5\x30\x0c\x52\x85\x65\x55\x4b\x25\xa7\x73\xcc\xbc\xcd\x59\xde\x96\xfd\x4c\x5d\xa9\xcc\xd2\xc6\xc4\x74" + + "\x9d\x1c\xca\x60\x12\xe3\xba\xde\xf7\x13\xfd\x7b\x43\x58\xb3\x5b\x8e\xa8\x03\xc5\xa6\x8b\xeb\xb9\x51\x9f\xe7\xeb" + + "\x7f\x72\xe0\xf8\xb0\xc7\x3b\xcd\xed\x5d\xc4\xc7\x27\x4d\x85\x2c\x93\x67\x8d\x7a\x05\xad\x4a\x05\x17\x9d\xb2\x5b" + + "\xdf\x37\x64\x4e\xa1\x69\x50\x6d\x61\x77\xcc\x3a\xb2\x45\x61\xaa\x17\xae\x04\x03\x79\xb3\xd2\x89\x48\xc2\x15\x78" + + "\xb9\xbd\x1b\x70\xe2\xe1\x51\xe5\x86\x5b\xe6\x18\x9d\x6a\x0f\xe2\x6d\x12\x2a\xeb\x24\x2e\x3e\x55\x38\xf6\xf1\x6a" + + "\xed\x27\x43\xdb\x93\x51\xb7\x39\x32\x84\xe3\x7d\xde\xae\x03\x72\x47\xb6\x6b\xfd\x90\x5a\x28\x65\x6c\xb6\x6f\xce" + + "\xc1\x92\x19\x22\x53\xfe\xad\x0b\xe7\x3c\x6a\xe4\xea\xc3\x6a\x04\x32\x13\xab\x25\xca\xcc\x8a\x84\x96\xa5\xf3\x49" + + "\xb1\xd3\xf2\x34\xb2\x25\xfc\x2e\x34\x2d\x23\xdf\xeb\x72\x21\x5a\x78\xf9\xbc\x5c\x89\x9e\x09\x99\xaf\xbb\x28\x14" + + "\x91\xc7\xb0\x98\xcb\x3c\x75\x61\x86\x98\x9e\x7e\x7f\x5f\xf3\x1d\x64\xb7\xe8\xbd\xdd\xa2\xf7\x7e\x8b\xec\x94\xda" + + "\xb7\xe6\xbd\x05\x4b\xc8\xae\x44\xb1\xf2\xd1\xf5\xe6\x6d\x44\x6e\x7f\x1c\xf7\xf4\x8c\x52\x63\xdc\xb1\x7d\xf5\xa6" + + "\x81\xfd\xcb\x0e\xed\x0b\x72\x79\x1b\x05\x4e\x55\x5c\x4b\x23\x64\xbb\x79\xb9\x27\x74\x6e\x54\x59\x09\x99\xbb\x73" + + "\x0d\xf0\xeb\x5b\x8f\xe3\xdf\x1e\xb9\x64\x31\x4c\xdf\x7d\x0a\x2b\x8d\x9e\x76\xdd\xc1\xb4\xc8\xa7\xb2\x4a\xfe\x10" + + "\x6c\x59\x65\x00\xe1\xfb\xc7\xe2\x22\x70\x5f\x14\x1d\x71\x8c\x49\x0a\x47\xa2\xd3\x11\xb7\x36\xd5\x44\x77\x4b\x6c" + + "\x66\x6c\x89\x2d\x3d\x14\x9e\x8a\xf7\x2e\x65\x69\xdb\xc5\x65\x27\xa9\x7b\xe2\x3d\x1c\x4b\xfb\x25\xef\xf2\x96\x6f" + + "\xbd\x0b\x41\xdc\xcb\x7b\x54\xdb\xb6\xf4\xd1\x66\x85\xa4\x56\x91\x1b\x93\x53\x97\x12\x17\xea\xa4\xb3\xa3\x56\xb5" + + "\xd3\x76\x2c\xb8\xeb\xe2\xfe\x6b\x59\xac\x96\xfc\x8d\x49\x6a\x9d\x98\x5e\x80\x76\xe1\xad\x3e\x59\x9f\x62\xe2\xff" + + "\xe0\x6d\x10\x9b\x88\x2b\x9e\xac\x6d\x7c\xc9\xb8\xde\x6b\xbd\xa9\x59\x2d\x55\xf9\xda\xd1\x92\xba\xbe\x27\xa4\x95" + + "\x01\x97\xe3\xa8\x79\xa4\x66\x26\xf2\xfa\xde\xb3\x1a\x21\xdf\x96\xbe\x28\x56\x38\x21\xae\xf1\x87\xb7\x7e\xe7\xa0" + + "\xe3\x32\xdc\x7a\x2d\x27\x32\xd9\x7b\x7b\x3e\x42\xd8\x2d\x35\x0d\xe3\x86\x79\x6e\xdf\xc9\xe9\x07\xac\x0b\x58\xbf" + + "\x62\xbc\xab\xc6\x2f\x1c\xf5\x26\xb3\x6b\xb9\xe6\x7a\x68\x5c\xfa\x0f\xc7\x72\x5c\x43\x51\x06\x4b\x0b\x75\x49\x0d" + + "\x65\x92\x07\xf1\xde\x9e\xa5\xc0\x79\x7a\x86\x59\x46\x2f\x12\xd2\x26\x05\x50\xf2\x73\xf9\x19\xab\x58\x57\xea\x52" + + "\x95\xce\x10\xa4\x67\x33\x57\x6f\x01\x13\x6e\xb8\x0f\x43\x52\xbb\xc3\xcd\x7f\xc6\x9a\x29\x62\x2c\x12\xfb\xfd\xbe" + + "\xbb\x30\x2d\x30\xd8\x85\x98\xb8\xa8\xd7\xb2\x9a\x0f\x4a\x20\xcc\x8b\x04\x2f\xdd\x83\xc1\xa1\x9d\x11\xb1\x81\xb8" + + "\xba\x5a\x84\x32\xe5\x08\x6b\x6c\xf4\x4e\xe3\x26\x1f\x47\x17\x7d\x58\x74\x6a\x1a\xf0\x43\x51\x62\xe1\x50\x58\x58" + + "\x4a\x52\xc5\xd4\x10\xd5\xa9\x57\x02\x69\xc2\x7e\xff\xff\x07\x91\xeb\x37\xfd\x9b\x90\x82\x12\x6e\x72\xbd\xbb\x52" + + "\x51\x26\x88\xc2\xf7\x6e\x0a\x1b\x49\x4d\x08\xf8\x1b\x15\xcf\x9f\x28\xd1\x39\x38\xe8\x60\x81\xd8\x6b\xdb\x6d\xe8" + + "\x05\xfe\x6d\x8f\xe3\x58\xec\xcb\x77\x45\xa6\x30\x23\xca\x9b\x22\x55\x3f\x68\x53\x45\xd5\x8e\x4e\x5e\x8d\x44\x87" + + "\xe0\xd7\x39\xe2\x2f\x47\xe2\x69\xbe\x5a\x4c\x54\xf9\xac\xeb\x63\x4f\x43\x0d\x08\xbb\x53\x79\x8e\x03\xe0\xc7\x64" + + "\x2a\x34\x7d\x1a\x14\xdb\xac\x0a\x3f\x64\x48\x6c\x95\xd3\x10\x19\xe3\x68\x48\xaa\x8d\x53\x97\xeb\x03\x1e\xa6\x06" + + "\xf6\xb3\xf7\x51\xfd\x8e\x7f\xc6\xe4\xcb\x71\xdb\x4d\x15\x7f\x23\x2f\x4d\x5d\x76\xdf\x86\x72\x0e\xf5\x85\x33\x9e" + + "\xd2\x21\x68\xde\xda\xee\x9c\xbd\x2b\xe5\xf4\x43\x10\x52\xef\xe5\x78\xd4\xbc\x56\xac\xa4\x34\x11\x18\x81\xb2\x46" + + "\xea\x98\x77\x73\xb5\x26\x8c\x41\xa2\x71\x59\xe4\xca\x49\xb4\x32\xcb\x7c\x99\x7d\x4b\xf1\xdb\xc4\x78\x6b\x4b\xb3" + + "\xbb\x13\x01\x2c\x44\xce\x7e\x3f\x58\x90\x9f\x04\x55\xa0\x50\xe4\x55\x44\xb5\x66\xb0\x72\xc9\x95\x2a\x5d\x98\x91" + + "\xcb\x83\x41\xda\xd6\x2a\x9c\x47\xa4\xa3\x0a\x69\x6d\xeb\x26\xb5\x09\xf8\x5e\xa7\x18\x40\x0e\x0e\x66\x13\xbe\xc1" + + "\xed\xc9\x24\x7f\x7f\x2c\x74\x20\x50\x13\x94\xf7\xf6\x18\xdf\xa3\xa6\x6e\x92\x21\xd6\xb6\x20\x6d\x70\xf7\x35\x10" + + "\xd6\xa1\x6a\x60\x73\xf3\x17\xc8\x76\xa7\x92\x00\x11\x6a\x00\x43\xd6\x18\x69\x36\x12\x00\xcb\x66\x59\x16\xba\x02" + + "\x72\xa3\x17\xc0\x9c\x29\x66\x73\xb9\x60\x8c\xaf\x04\x5e\x3b\x48\xbc\xdc\x67\xe2\x20\xdc\x97\xad\xb9\x4f\xd0\xe0" + + "\x96\x84\xd6\x38\xf4\xad\x74\x8b\x6a\x28\xe0\x76\xa2\x77\xa8\x28\x5a\xb2\xa8\xd8\x48\xb8\xd0\x6e\xbb\xf6\x4b\x7f" + + "\xa9\xcd\x54\x96\x9c\x2a\x50\x20\xcb\x37\x2f\xb2\x54\x95\x36\x16\x86\x2d\x1e\x98\xe2\x5b\x4e\xab\x95\x93\x10\xec" + + "\x61\x88\xae\x6f\xaf\x67\x0e\x1e\xb7\x69\xe1\xe0\x92\x08\x40\x1c\x5e\x01\xed\x0a\x94\x5a\x7f\xae\xa3\x53\xa5\x52" + + "\xac\x03\x66\x94\xdf\x34\xb3\x9a\x4e\x15\x31\xdc\xd6\x2e\x44\xcf\x8c\x99\xad\x32\xcf\xc0\x99\x4a\x2f\xa9\xc6\x78" + + "\xb4\x99\x35\x4a\x85\x59\x26\x99\x6b\xf1\xd3\x08\x78\x2d\xaf\xbb\xab\xa1\xc0\x7e\x1b\x1f\xd7\xf5\xb9\x80\xf8\xab" + + "\x46\xb9\xb4\xe6\x46\x36\x0e\xec\x8f\x57\xaa\x2c\x75\x0a\xb4\x29\xa7\x45\x00\xff\x59\xcc\xc4\x65\x56\x4c\x64\x86" + + "\x57\x50\xae\xb0\xec\x4d\x44\xbd\xb6\x51\xe1\xbb\x69\xf0\x76\xb6\x80\x78\x92\xd6\x08\xce\x55\x60\xab\xdd\xa9\x55" + + "\x7b\x25\x3a\x71\x4c\x0a\x8a\x30\xcb\x41\xc4\xb2\x76\x5d\xe1\x3e\xf7\xcc\xb2\xdc\x9c\x4d\xc6\x3b\xa2\xfb\x07\x6d" + + "\x7e\xe8\x64\xa9\x18\x3e\x12\x27\x79\xa5\x4a\x90\x73\x81\x55\x43\x77\xca\x47\xc3\xd0\xc5\x80\xbd\x11\x3d\xa7\xe2" + + "\x78\xd2\x3a\x0b\xe3\x5e\x38\x87\x74\x9e\x42\xf9\x71\x9f\xf4\xdd\xd8\x29\x1d\x4d\x03\x39\x71\x20\xd2\x57\x27\x2b" + + "\x66\xc2\x95\x2c\x70\x4f\x59\x17\x36\xa5\xda\x46\x2b\x9b\xe5\x07\x1d\xe4\x28\xb7\x9d\x77\xfd\x0b\x9c\x3d\x62\x6d" + + "\x45\x54\xf0\xc0\x44\xc6\x62\x42\x35\xa7\xdb\x0e\xd5\xda\x6d\x24\xcc\x2d\xbe\x45\x7c\x23\xa7\x68\x9f\x82\x29\x70" + + "\xc7\x6f\xd5\x26\x84\x87\x85\x2e\x2f\x0b\xa6\x36\x3d\x6b\x5d\xf6\x69\xfd\xe2\x7e\x64\x39\xf3\x4e\xaf\xbc\x55\x69" + + "\x94\x3c\xac\x7d\x23\x1b\x68\xf4\xcf\xc8\x77\x5d\x6f\x28\x3c\x05\x5e\xc3\xc1\x1c\xb3\x2e\xd1\x56\xc8\x78\x1e\x83" + + "\xc0\x27\x36\x8c\x3d\x08\xcb\x95\x4a\xeb\x0a\x11\x95\xb9\x7b\x2e\xb2\xe2\x9a\xb5\xa1\xf4\x25\xe6\xde\x75\xae\xba" + + "\x80\x3f\x14\x22\x8c\x11\x8d\x74\x80\x1e\x1a\x07\x14\xec\xc4\x4f\xd1\x61\x5e\x54\xf7\xee\x14\x79\xf3\x8d\x3d\xb9" + + "\xb7\xbe\xfd\x73\xff\x27\x56\xc4\x5e\x96\xaa\xff\x91\xae\xc5\x64\xa5\xb3\x2a\x9c\xce\xc0\xe5\xad\x0a\xc6\x74\x55" + + "\xf6\x9c\xf4\x56\x2f\xc4\x77\x2b\xce\x98\x74\x5e\xb4\xbe\x04\x3a\x7e\x81\x33\xc4\xfa\x44\xa1\x51\x83\x0e\x06\xfb" + + "\x98\x72\x09\x3f\x9a\x68\xbd\xcc\xd8\x16\x1a\xe3\x78\x8f\xe0\xd2\x72\x67\x9c\x88\x8b\x8f\x75\x81\x7f\x39\xe4\x45" + + "\x80\x70\x49\x94\xc4\x62\xe5\xd8\x96\x13\x30\x51\x31\x09\x3b\x6a\x87\xae\x22\x1e\xf8\xfe\x3d\x7f\xaa\xdd\x45\xe5" + + "\x8f\x77\x12\xe0\x91\x1d\x60\x10\x3a\x47\xd8\xbf\x1d\x96\xfa\x34\x5e\xf6\x2f\x9b\xdc\x97\xdc\xd7\xdf\x95\x28\xb7" + + "\x2d\x74\xae\x17\xfa\xef\x56\xd7\x47\x19\x02\xac\xa8\x86\x56\x40\x02\x00\xa0\x38\xf2\x0f\xc0\x5f\xa3\x33\xb9\x25" + + "\x83\x21\x85\x09\x73\x4e\xf3\x49\x79\x27\x3f\x00\x3d\x34\x36\x11\x3a\xe5\x77\xa8\xf8\x00\xd3\x45\xc4\xb5\xd0\xcb" + + "\xa2\xa8\x3c\xb0\xb4\x11\x32\x17\x27\x58\x04\xc9\xa9\x90\x6c\x88\x46\x5b\x41\x14\xa6\x17\x54\xd7\x2f\xb4\x9a\x88" + + "\x67\xe2\x31\x4a\x6c\xa4\xb8\x1b\x7b\x03\x49\x37\xd0\xa2\x9d\xbc\xf4\xf1\xc8\xb6\x34\xe8\xa5\xaa\xbe\x5b\x9f\xa4" + + "\x81\xa4\x3c\xa8\x55\x33\xdc\x56\x50\x7b\x67\xa7\x5d\xbf\x79\x18\xeb\x37\x89\xfc\xba\xfb\x38\x09\x15\x15\x27\x2f" + + "\x3b\x17\xbc\x12\xab\x0c\x0e\x83\x53\xda\xd2\xf1\x74\x7b\x41\x01\x65\xdc\x6f\xd1\x25\xe7\x3d\xc7\xa4\xfa\xf7\x71" + + "\x1e\x2b\xef\x21\x67\xb9\x93\xb7\xa5\x72\xb8\xec\xb8\x2d\x94\xb4\x4c\x05\xff\xbd\x52\xa5\x9e\xad\xd9\x89\xbb\x5c" + + "\xa3\x5b\xb4\xa9\xd4\x52\xac\x96\x42\x0a\xa4\x5c\x21\xc5\xa7\x8b\xc3\x76\xe8\x86\x9f\xd6\x99\x91\x46\xc2\x7b\xcb" + + "\x91\xb4\x90\x52\xbb\xf7\x56\xb3\x48\x51\x2a\x14\x45\xb0\x35\x0c\x47\x21\x89\x20\xb4\x46\x61\xa9\x28\x45\xa9\x2f" + + "\xe7\x55\xbf\x2a\xfa\x99\x9a\x55\x4e\x17\x10\x5d\xa2\x54\xaf\x09\x24\x07\xc3\x0c\x94\x2b\xdb\x14\x7a\xf8\x60\x24" + + "\x5a\x84\x7e\x5b\xaf\xdd\x1a\x3a\xea\xd0\x19\xfd\xf9\xa4\x28\x2b\xc1\xd9\xd5\x75\x25\x64\xa0\x5e\xf6\xbb\x59\xc3" + + "\xb1\x84\xc3\x04\x09\x67\x30\x83\x7d\x78\x35\x07\xa2\xfd\xad\xef\x23\x01\x6c\xf3\x46\x8a\x3c\xf5\xc9\x93\x43\x13" + + "\xc1\x29\xc6\xd1\xf7\xf8\xca\xa7\xc0\x33\xda\x39\x80\x9f\xcd\x3f\x68\x38\x8b\x44\x3d\xd3\x20\x0f\x85\x30\x1f\x23" + + "\xad\xb4\x1a\xf6\xad\xf8\xbd\x25\xdf\x94\x55\x18\x97\x3c\x94\xad\xf8\x12\xdb\x3c\x31\x22\x0a\xde\x38\xcb\x52\x13" + + "\xbb\xe8\x88\x44\x3a\xc4\x5a\x1a\x28\x52\xfe\xe3\xa4\xb5\x11\x94\x42\x04\x85\x77\xab\x97\x2e\xd5\x42\xea\xbc\x67" + + "\xab\x16\x5b\x5d\xb3\x2c\x9d\xcf\x91\xc5\xcc\xa5\x53\x9d\xfb\x4c\x4d\x31\x46\x7b\x69\x64\x8b\x0e\xfc\x28\x94\x52" + + "\x77\x1b\xc9\xf3\xb6\x0b\x5d\x81\xf8\xd6\x72\xdc\x6b\xf2\x64\xa8\xff\x69\xf5\xe3\xa4\x08\x3f\x64\xd3\x81\x96\xab" + + "\x1b\x35\x5d\x11\xcb\x8b\x4a\x07\xd8\x7d\xc7\x11\xe8\x19\xde\x17\xec\x4d\xb2\x2c\x8b\x2b\x4d\x75\xd3\x91\xbc\xe0" + + "\x2f\x56\xfe\xfd\xe6\x93\x5a\x96\x2a\xe4\xa5\xf8\x0c\x2c\x8a\x94\xea\x6f\x47\x19\x32\x31\x47\xf6\xfd\x7b\x3b\x01" + + "\x61\xc1\x2d\xad\x25\xa9\xec\xb9\x68\xca\x6e\x42\xa2\x81\xb2\x77\xb5\xd7\x43\xd7\x6a\x88\x73\x01\x5f\xef\xf1\x56" + + "\x43\xb8\x00\xfe\x9f\x8f\x6a\x5c\x53\xba\xbd\xce\xf1\x50\xfc\x98\xab\x7e\xa5\x17\x4a\x48\x0c\x28\x60\xad\x0d\xbe" + + "\xc2\x42\xdc\xa6\x92\x13\x2c\x82\x7c\xff\x5e\x4b\x11\xeb\xb1\x65\xcb\x11\xeb\xaa\xa4\xd3\xe9\x36\xeb\x56\x0f\xde" + + "\x17\x3a\x87\x57\x94\x82\x8b\x3e\xb0\xe3\x3b\x35\xeb\x8b\x79\x59\x2c\xd4\xd3\xc3\x2f\x29\xc4\x9b\x94\xf3\x5c\x88" + + "\x3b\x28\xf3\x4d\xf7\xf7\x5a\xc0\x7a\x1f\x56\x41\xde\x52\xcb\xa5\xcb\x52\x9b\x80\x7b\xf5\xd3\xae\x17\xe9\x06\xee" + + "\x67\x37\x2c\xa4\x6d\xa7\x74\x42\x4e\xa5\xc0\xa9\x84\x79\x01\x39\xc7\x91\xbb\x83\x31\x72\xda\x55\xd6\xef\x36\x16" + + "\xf4\x8b\x9a\x7c\xd0\xd5\xd3\xaf\x9e\xfc\x65\xf0\xe4\xb1\xe8\xdb\x4c\x48\x5f\x0f\x0e\x06\x4f\x86\xb4\x5a\xf1\xf8" + + "\x2b\xa0\x89\x37\x58\x7b\x41\xd8\x67\x7f\xe9\x62\x47\x2f\x55\x45\xf2\x05\x25\x09\x9a\x16\x39\x7a\x3c\xe8\xfc\xd2" + + "\x65\x36\x14\x8f\x50\x82\x43\x8f\xc4\x47\xf1\x06\xb9\xaf\xc7\x00\x44\x55\x56\x81\xf7\x6e\xaa\xaf\x6c\x72\x61\xaa" + + "\x1b\x13\x24\xc8\x3a\xec\x61\x86\x21\xfa\x65\xc4\x97\x22\xa1\xa1\x74\x7e\xd9\xf5\x88\x04\x3d\x0c\x08\xda\xca\x82" + + "\xc0\xe6\x29\x48\x7c\xb6\x32\x0a\x5e\x67\x2e\x3c\xe9\xa4\xfa\x0a\x13\x06\xee\x61\xca\x88\xdb\x26\xc8\x28\xe1\x0a" + + "\xf1\x03\x57\x2a\xaf\x7c\xaa\x95\xa1\x4b\x3e\xd5\x41\x47\xb7\x65\x41\x1a\x8c\x0e\x36\xe7\x34\x4d\x0b\x93\xe6\x83" + + "\x85\x9e\x96\x85\x29\x66\x15\xd6\x03\x57\x79\x7f\x65\x86\x99\x9e\x94\xb2\x5c\x0f\x17\xe6\xab\x27\x5f\x7f\xf9\xf8" + + "\xdb\xff\xf5\xf8\x9b\xff\x3c\x1d\x7c\xf3\xd5\xff\x7a\xfc\xed\x40\x9a\xe5\xcd\xfd\x7b\x44\xe8\xda\x20\xc5\x80\x4a" + + "\xf5\x15\x25\xd9\x44\xc6\x6b\x2c\x3a\x4f\xa5\x98\x97\x6a\x36\x7e\xf8\xe0\xe1\xb3\xa7\x43\xf9\xac\x73\x14\x81\x27" + + "\x48\x83\x54\xcb\xec\x02\x5f\xf1\x59\xe8\x3c\xe8\x08\x84\x04\x0f\x22\xd3\x94\xca\x02\x27\x02\x13\xc0\x6c\xa0\xed" + + "\x66\xae\x80\x63\xd8\x5c\xeb\xb4\x9a\x77\xea\xe5\xc9\x7a\x5c\xd1\x4b\x9b\xff\x7a\xfd\x43\xe4\x9a\xb0\x1b\x3d\x8a" + + "\xd2\xe5\x44\x13\xe2\x0e\xf2\x2d\xe9\x73\x30\x11\x0d\xdb\x8e\x1e\x87\x26\xcf\x30\x07\x41\x64\x2c\xc1\x27\x3f\x1b" + + "\x77\x62\xfe\x93\xb2\x67\xe6\xa4\x2e\x44\x9d\x53\x04\x10\x64\xa1\x3a\x5d\xbb\x09\x16\x8b\x83\x34\x54\x9b\xcd\x67" + + "\xee\x0d\x3a\x5a\x0f\x69\x4f\x6a\x9b\x61\xa2\xb5\xf3\xe0\x3d\x57\x43\xed\x13\x76\xd0\x7e\x64\x8b\xbb\x76\xb6\x6d" + + "\xa1\xed\xfb\x33\x77\xec\x13\xea\xf4\xd9\xa4\x46\xad\x59\xf4\x02\xa8\x7f\xce\x6e\x85\x6b\xc4\x8b\xa4\x2a\xc4\x0c" + + "\x19\xd8\x09\x65\x0a\x34\xe2\x7a\xae\xf2\xa8\x9d\xc8\x30\x6d\xe0\x47\x4f\x4f\x00\xd5\x78\xef\x5d\x82\x40\x97\xe9" + + "\x68\x0b\x30\xed\x1c\x3e\x09\x9a\x20\x3c\x5f\xc9\xec\xe8\x13\xce\xc2\x19\xa5\xa4\xba\x70\x19\xe3\xc4\x71\xdb\x51" + + "\xb0\x5e\x44\xc9\x95\xcc\xda\x12\x36\x01\xc0\x12\xae\x7f\x87\xb7\xf4\x95\xcc\x06\xe8\x3b\x83\x9c\x84\xf5\x57\x82" + + "\xa7\x94\x78\x95\x3b\x74\xa5\x56\xe3\x4d\x8a\xd2\x0f\x23\x99\xbc\xed\x26\x9c\xfa\x92\xa5\x6e\xf8\x3f\xaa\x34\x3f" + + "\x60\xae\xda\xb5\xe6\xc7\xaa\xbd\xe2\x79\xdc\xe0\xac\x33\xc2\x6c\x2b\xc1\xa3\x20\xcd\x07\x3f\x5d\x59\x23\x73\x43" + + "\xf3\xec\xdb\xb0\x64\xc5\x2d\x38\x05\xb1\x7f\x8d\x1b\xf0\xb2\x98\xfa\x26\xf8\xc4\x37\xb0\x19\x93\x43\x0d\x2d\x3d" + + "\x71\xcb\xc5\xf2\x83\xa1\x54\x54\x9b\x37\xa9\x07\xc2\x06\x47\xee\x33\x03\xf7\xa6\x7a\x27\x2f\x41\xf4\x1d\xfe\xfa" + + "\x34\x39\xbf\xde\xef\x9e\x9b\x47\xe7\xc3\xe3\x67\xc9\xf1\xe8\xe9\xf9\xf0\xfc\xf0\xd9\xa6\xfb\xc5\xb0\x1b\x0f\xa7" + + "\xcd\xa9\xad\xff\x36\xfc\x75\x70\xf6\xeb\xe8\xc1\xf9\xd9\xf9\xa0\x77\xf1\xe8\x8b\xa1\xe3\x17\xe0\x3d\x1a\x81\x7c" + + "\x32\xe2\xa9\xcc\x1c\xa2\x4a\x60\x9f\x50\x74\xe1\xa8\x10\xe0\x65\xd1\x2a\xe7\x98\xd7\x6b\x9d\xe7\xc5\xb5\xd3\x0a" + + "\x9a\x9e\xf8\x7d\x25\x33\xcc\xb8\xdb\x43\x7e\x36\x08\x2f\x72\x00\xf5\x4a\x70\xd7\xd8\x9b\x5f\x19\x83\xb8\xf1\x65" + + "\xa9\x96\x61\xef\xf5\x33\xa4\xdd\xd1\x18\x3e\x12\xef\xcd\x5c\xe7\x95\xe8\xff\x72\x70\xf8\x8d\xe0\x52\xd8\xae\x4e" + + "\x9c\x1b\x8a\x2d\x48\xfc\xbd\xf3\x33\xdc\xc5\x2a\xa2\xec\xf5\xc8\xfa\xa1\x5b\xaf\xc8\xf6\x9f\x3b\xe5\xc6\x3f\x31" + + "\xe1\xa6\xeb\xa1\x73\xbd\x0c\x41\xf1\x91\xb9\xb0\xca\xcc\x7f\x11\x15\xed\x0c\x09\xb3\xc3\x02\x66\xc8\x5b\xe0\x5d" + + "\x9b\xbf\x0d\x83\x0b\xb6\xd1\x2f\x06\x37\x34\x54\x15\x04\x53\xf8\x84\x0e\xc2\x64\x33\xff\x0c\xd4\x1c\xd0\x62\xb7" + + "\xd1\xda\x48\xa2\xcb\xa5\x56\x42\x30\x7a\x0a\x15\x4d\x33\x52\x70\xc2\x51\xec\xd9\x68\x23\x8f\xbb\xd6\x27\xc8\xb9" + + "\x31\x70\x32\x39\xbb\x1b\xbe\xe5\x0e\x13\xae\xce\x28\x2f\x2a\x2c\xe3\x8a\x0f\xb0\xca\x6b\x63\xe5\xa1\xb3\x8a\xaf" + + "\x51\xd5\x16\x07\x8e\x34\x38\xa0\x98\x56\x11\xe0\xa5\x5f\xc2\x65\x1c\xac\x8b\xc1\x5e\x38\xdf\x0b\x31\x12\x14\x06" + + "\xd4\xfa\xb9\x5d\x70\x63\x0b\x3e\x8a\xb5\x2d\x93\x64\x54\xf5\xf9\x32\xec\x80\xf9\x40\xdd\x54\x2a\x4f\x31\x07\x0a" + + "\x0c\x3f\x6a\x51\x29\x87\xd7\x1f\x19\xa6\xac\x63\xf7\x5c\x47\x6e\xdd\x30\x83\xc0\x79\xca\xa8\x6c\xc6\xad\x8e\x82" + + "\x68\x96\xba\x4a\x79\xb7\xe5\x78\xb8\x70\x5e\x18\x61\xb9\x32\xf3\xd3\x4a\x4e\x3f\x58\x22\x15\x4e\xcd\x62\x74\x23" + + "\xb9\xe0\x8e\xcd\x92\x85\x59\xd4\xda\x3c\x6d\xad\x22\xa2\x76\x53\x60\xef\x33\x4c\x94\xd5\x23\x8f\xa9\xc8\xee\xdd" + + "\x12\x99\x1d\x7b\x33\xd4\x92\x0c\x7d\x7c\x1a\xc1\xee\x87\x02\x7f\x30\x0b\x80\x6b\x5d\x09\xf8\x86\xeb\x5b\x73\x76" + + "\xd5\x2f\x5a\x4c\x00\xa2\x0b\xaf\x8b\x85\x32\xf0\xda\x3d\xac\x8d\x44\xae\x89\xb4\x75\x75\x78\xc3\x3e\x63\x28\xb8" + + "\x88\xae\xec\x84\x66\x24\x46\xc1\xcc\x4a\x55\x85\xa6\x22\xec\xc9\xfd\x3e\xae\xfd\xde\xe7\x7a\xaf\xee\xc1\x28\xb2" + + "\x2d\x79\xc5\x02\x91\x87\x5e\x50\x6a\x7b\x3b\x7e\x6e\xc1\x19\xbe\x04\xe1\x71\x2f\x8a\xc6\x3c\xbb\xe8\x51\x38\x39" + + "\xef\x18\x0e\x93\x17\xd5\x9f\x3d\x06\xa0\x4a\x38\x84\x36\x9f\x30\xc2\xee\x2e\xf7\x49\x7a\x56\xe8\xd8\xab\x56\x4f" + + "\xbc\x2b\x5f\xe8\x34\x3d\x74\x6e\xcf\x01\x2a\xa0\x45\x96\xaa\x38\x99\xb9\x5e\x82\xc0\x84\x96\x0a\x1c\x86\xf4\xc7" + + "\xb6\x5b\x53\x88\x2f\x92\xce\x72\x44\x79\x3c\xbb\x03\x6d\xe0\x17\xa6\xe2\xec\x8a\x6b\xcc\x14\x12\x60\x3f\xb2\x1e" + + "\x12\xa4\x72\x2e\x99\x70\x5d\x88\xce\x92\xaa\x21\xec\xb4\xda\x8d\x82\xc2\xd5\x11\xbf\xd5\xa2\x83\xa6\x13\xd5\x3c" + + "\xee\x96\xc1\xad\xc1\x18\x1f\xe2\x5e\xc2\x5f\xdd\x40\x6d\x7d\xeb\x34\x02\x0d\x25\x0c\xe3\xb4\x28\x26\xef\xd5\xb4" + + "\x72\x4d\x9e\x8b\xa9\xca\xab\x52\x66\xa2\x54\x33\x55\xaa\xa0\xce\x3e\x9a\x77\x78\x52\x56\x1b\xd1\x65\x8e\xae\x28" + + "\x2a\x7a\xd3\xb3\x3a\xc6\xe7\xb6\xde\xea\xb5\x5c\x7b\xe3\x38\x40\x0d\x05\x4a\x82\x86\xb1\xaa\x44\x57\xc6\xeb\x81" + + "\x4e\x45\x71\xa5\x4a\xf1\xb4\x92\x97\xcf\xbc\x52\xf1\xbf\x4e\x4f\xc5\x95\x96\x22\x4a\x51\x2f\x92\x07\xdf\x7e\xf5" + + "\xf8\xb0\xcb\x3a\x97\xaa\xd4\xd3\x8a\xba\x2f\xd5\xb4\xb8\xcc\x11\x33\x44\xf2\xe0\xf0\xf0\xf1\xb7\x07\x23\xf2\x50" + + "\xa5\x0a\xa3\xb8\x67\x4f\x51\xf9\xf2\xfb\x4a\x4f\x3f\xbc\xa2\xdb\x71\xf8\x6b\x72\x3c\x3a\x37\x8f\x92\xa7\x67\xe7" + + "\xd7\xe7\xbf\x5c\xec\x3f\xeb\x9e\xfd\xfa\xec\xe2\xd1\xe6\x41\x72\x76\x7e\xdd\xbf\x78\xd4\xed\x7e\x31\xa4\x25\xea" + + "\x5c\x07\xac\xf2\x2c\x1f\xf0\x83\x3b\x8c\x92\xe1\x55\x82\x17\x1d\xdd\xe8\xde\x2a\xfd\x1f\xcf\xdf\xbc\xfc\xe1\xd5" + + "\x08\xf0\xb0\xd3\xed\x89\x2f\x12\x90\x64\xf0\x0f\x57\xb8\x1c\x7f\xd1\xb9\xf5\x82\xd8\xb6\x42\x2c\x7c\xf9\x84\x84" + + "\x93\x44\xbf\xfa\x1e\xb4\xdf\x4d\x6d\xac\x9b\x75\xdf\xa2\x26\xb6\x2a\x63\xe7\x69\x64\x0d\xf5\x6e\x17\x83\x30\xf9" + + "\x2c\x35\x7d\x16\x35\x75\x26\xbe\x31\xd6\x7e\xf6\xf6\x8a\xe7\xa4\xa5\xa4\xd2\x6b\x34\x51\xfb\x43\x96\x64\x86\x54" + + "\x39\x57\x70\x7b\xfa\x0c\xbd\x52\x71\x51\x68\x9f\xfc\xa0\x97\x7c\xce\x2f\xd5\x0d\xa1\x1e\x75\x6c\x4d\xb4\x67\x1c" + + "\xae\xe1\xf7\x08\xbd\x79\x9d\x05\x27\xf6\x72\xb0\x5f\x79\x5c\xb1\xf9\xdb\x62\xaf\x8d\xd0\x37\x88\x2a\x0f\xcd\xab" + + "\x45\x26\x8a\x12\xb3\xbb\x0b\xb3\x22\xd7\x59\x67\x36\x35\xc2\x4b\xb3\x70\x32\x1e\xb0\xbf\x6a\x90\x40\x70\x6f\x8f" + + "\xbd\xf2\xce\x0e\xd1\x25\xcd\xda\xff\x22\x43\x47\x84\x3a\x30\x64\x57\xf4\x9f\x89\x2f\x12\xf4\x64\xec\x06\x06\x1c" + + "\xd7\x93\xbf\xd2\x1b\xf6\x3b\x4c\x71\x2e\xf3\x29\xa0\x02\xd3\x88\x63\xfb\x0e\xf6\x7b\x14\x38\x1d\x7b\x3b\x8b\x99" + + "\x96\x7a\x59\x91\x7f\xb5\x25\x8f\x98\xa7\x06\x15\x9a\x55\x60\x90\xc1\x24\xed\x48\xb1\xb3\xb5\xc8\xd8\x92\x4c\x89" + + "\xd7\x26\xe4\xfa\x79\x8d\x46\x03\xcc\xb5\x86\x5b\xea\xcc\x0f\x58\x2a\x87\xbb\xe2\x83\xb7\x50\xe5\xa5\x4a\x04\xdd" + + "\x3d\xfc\xcc\x7d\xe9\xa2\x40\xec\xba\x5d\xcd\x28\xbb\xd6\x36\xc3\xb0\x5b\xed\xa0\xb8\xce\x55\x69\x55\xb1\x61\xbc" + + "\xd5\xc8\xa9\x63\x5d\x8f\xb0\x6a\xfe\x3b\xa8\x9e\xd5\xb2\x37\x3d\x74\x6b\x36\xdd\x90\x09\xf3\x92\x34\xdf\x06\xc1" + + "\x46\xed\xed\x79\xe9\xf4\x6d\x26\x75\xfe\x23\x52\xec\x80\xa5\x09\x19\x34\x62\xb8\x08\x77\x74\x5e\xa7\x3c\x76\x46" + + "\x6f\xbd\x63\x75\x31\x73\x8d\xa8\x3e\x63\x96\xa9\x54\x48\x23\x16\xaa\x9a\x17\x29\x1a\x07\xac\x0f\xee\xfd\xc8\x5f" + + "\xb2\x45\x66\x86\x6d\x38\xe3\xd1\x2f\x6a\x6e\xcb\x3b\xd1\x4b\x37\xfd\xa0\x79\x2d\x1f\xd1\x60\x30\x40\xaf\x05\x97" + + "\x1a\x00\xf3\x7a\x99\x20\x95\xbe\x6b\xdd\xc8\x9f\x84\x83\xa1\xb6\x33\xb1\xa4\xb6\x75\xbc\x9d\xd8\x2d\xb3\xc5\x3f" + + "\x33\x26\xa5\x2d\xe7\xed\x81\x4e\x79\x2f\x6b\xb3\x60\xc1\xcc\x29\xee\x2f\x55\xc5\x5a\xfb\xef\xd6\x27\xa9\xdd\xe3" + + "\xc7\x17\x35\x6c\xa1\x34\x6b\x81\xed\x09\x2e\x4f\x9c\x32\x6a\x0a\xbf\xcb\xe4\xf4\xc3\x44\x95\xe5\x5a\x7c\x39\xf8" + + "\xda\xda\x14\xfc\xe7\x64\xd8\x40\x4a\xc9\x9e\xfa\x59\x91\x5f\x62\x9e\x0c\xb2\xb8\x58\x74\x7e\xf0\xf5\xb7\x5f\x3f" + + "\x09\x91\x10\xe7\x6b\xe5\xbc\xb6\xfa\x11\x7c\x7e\x01\xfb\xc2\xa2\x4e\x3e\x8e\x00\x23\xe4\xe1\x4d\x8d\xb7\x08\xb6" + + "\xc4\x0a\x95\x36\xc1\xb5\xc5\x8b\x46\x45\x33\xbf\x03\xf8\x9d\x27\x53\x76\x01\x47\xe1\xeb\x2d\x6e\x5a\xcd\x0d\xdc" + + "\x89\xa9\xb4\xdf\x46\x12\x38\xbf\xc0\x5a\xbf\xdd\xfb\x75\xbf\x07\xe7\x76\xe1\x89\xc0\xe0\xfd\xef\xb8\xc8\xba\x23" + + "\x86\x3f\x98\x9b\x4d\xc0\x18\xb5\x48\x1e\x47\xdb\xe7\x61\xa9\xbc\x7d\x9f\x5c\xcf\x35\x9c\x68\x43\x89\x2c\xd5\xef" + + "\x2b\x7d\x25\x33\x54\x8f\x15\xf0\x95\x8b\xe6\xc4\x31\xa0\x8f\x6e\xcb\x3d\x16\xf2\xef\xd3\x82\x2b\x59\x80\x90\xbe" + + "\x5d\x3a\x8a\xee\xb5\x68\xa2\x2f\x7f\x7c\xcd\xe8\x8c\x43\x85\xd0\x72\x97\x7b\x5d\x1f\x55\xdf\x4b\xbf\xf5\xf1\xae" + + "\xb5\xa2\x4a\xf3\x24\x46\xf3\xb1\x8c\x57\x97\xdf\x9c\x5a\x8f\x25\x20\x89\x0e\xeb\x4b\x25\xd3\x75\x7d\xbe\x2d\x94" + + "\x2c\x60\xa9\xea\x4c\x15\x71\x49\x7e\x67\x07\xd8\x27\x49\xf2\x8e\x4f\xeb\x58\x2e\xbe\xde\xae\x8d\x9f\x1f\x0e\xc5" + + "\x2b\x36\xc3\x87\x95\xd6\xf4\x8c\xa6\xdb\x7a\x01\x1a\xa7\x61\xb1\xf8\x15\x72\x7a\xf1\x36\x44\xda\x06\x37\xc5\x78" + + "\x53\x5a\xbd\x73\x9a\x9b\xe2\xf7\xce\xb5\x0a\x63\x90\x78\xf8\x58\x83\x06\xcc\x0f\xfa\xfe\x85\x3c\x31\xe9\x16\x50" + + "\x48\xb1\x3a\xdf\xbf\x82\xf0\x46\x99\x5c\x75\x15\xba\x4a\x3a\x82\xe2\x73\x69\xa3\xd3\x8a\xac\x90\xae\x01\xbb\x52" + + "\x69\xf6\xdc\x84\x6f\xa3\x9c\xdb\x8e\x43\x6f\x31\x45\x37\x64\x9d\xfb\xf7\x82\x13\x3b\x76\x1a\x17\x87\x3e\x56\x98" + + "\x42\xa1\x87\x68\xa4\x59\x96\xea\xca\xca\x0e\xfc\x68\x03\xcf\x92\xe3\xd1\xcf\x79\xa5\xb3\xcd\xf3\x2c\xeb\x76\x41" + + "\x6c\x80\x8d\xb6\xd7\xea\xe5\x4a\x96\x32\xaf\x38\xdb\xc5\xb2\x2c\xd2\xd5\x14\xc4\x32\x36\x0b\xc0\x5d\x87\xf4\x1e" + + "\xd9\x5d\x74\xca\x28\x8b\x45\xf4\xfe\xfe\xbd\x1d\xdf\x89\x0b\x59\xc3\x2d\xb5\xd5\x64\x38\x31\xfa\x7d\xeb\x2a\x91" + + "\x57\x26\x78\x94\x63\x85\x1c\xf7\x13\xe6\x4c\x3f\xdd\xa6\x38\x43\x80\x53\x93\xa5\xba\xac\x97\x12\xe9\xc1\x05\xd0" + + "\x13\x2b\x58\x6b\x43\xc4\x89\x02\x0a\xab\x72\x95\x63\x8d\xe1\x31\xb7\x8e\xf0\x91\x0f\xf5\x9d\xa9\x29\x1b\x6a\xc8" + + "\x5d\xf4\xe2\x8b\x84\x93\x36\x3d\x65\x1c\xcd\xe5\xe6\xe1\x78\x2b\xab\x4c\x04\xa9\xdf\xad\xc4\x5f\x7c\x4d\xa7\x9a" + + "\x9d\xed\x01\x3e\xce\xdf\x26\x4e\x2f\x98\x1e\xf9\x6a\xb4\xec\x8a\x12\x42\x32\xef\x45\xfa\xcc\x3a\x00\x8f\x42\x7d" + + "\xda\x91\xc8\x8f\x44\x2e\xc6\x22\x6f\x2d\xfd\x43\xaa\xdf\x3a\x08\xf6\xf6\x44\x8e\xe0\x8a\xc3\xd7\xe2\x75\xe4\x6d" + + "\x4e\xdb\x2d\xcb\x70\x7a\x85\x56\x5d\xea\x5c\x46\x4a\x1e\xaa\x4d\x17\xe5\x30\xc3\x27\x26\x38\x61\xf4\xc4\x92\x05" + + "\xd6\xb3\xc2\x0d\x41\x2d\xe3\xc8\xc9\xf0\x1e\xdb\xa6\x01\xbd\xab\x06\x48\x5b\x84\x5f\x43\x0f\x4a\x22\x05\x8f\x8f" + + "\x0e\xf4\xcd\x7c\x8c\x81\x1e\x34\xf4\xb5\xea\x06\x5b\xcd\xf9\x81\xdb\x94\x5e\xa6\x55\x33\x30\x5d\x71\x58\xaf\xcf" + + "\x41\x48\x90\xa8\xeb\x9b\x9b\xe7\x6b\x59\xa0\xbf\xf0\x1d\xda\x25\x43\x9e\x4c\x35\x49\xdf\xc4\x6a\xe8\x2d\xfa\xa7" + + "\x60\xba\xd0\x45\x78\x1b\xb8\x9b\xec\xa0\x86\xa7\x2d\xe0\xa6\x57\xd3\x95\xd5\x93\x9e\xe9\x8b\x23\xfc\x09\xb2\xd8" + + "\x8a\xee\x28\x7b\xa5\x70\xb3\xe9\xaa\x6c\x65\x48\xbd\x4f\x13\x4a\xfc\x8e\x4a\xcf\x4a\x79\x19\xa4\x41\x25\xcf\xd5" + + "\x55\x19\x16\xc2\x3a\xc4\x03\x91\x00\xc4\xac\x1d\x79\x59\x18\x2a\xf4\x98\x4c\x57\x25\x27\xf1\x89\xf2\x94\x51\x02" + + "\xff\x25\x16\xb4\x2f\xf2\x7e\xe8\xb7\x4e\xd6\x55\x2b\x52\x87\x43\xd9\xc3\x67\xb9\xdd\xbb\x8c\x25\xb0\xf5\x1e\xdc" + + "\x35\x67\xc6\xf8\xa0\x02\x60\x9c\x00\xb3\xdd\xe7\xaf\x7e\x5a\x02\xad\xed\xa2\x1e\x42\xd5\xa2\xe8\xb6\x28\xd6\x15" + + "\x23\xff\x77\x80\xdc\xe4\x51\xa5\xca\x85\xce\xe9\xe6\xb6\xea\x58\x10\x2b\x83\x52\xb7\xd7\xba\x9a\xeb\x9c\x3e\xa8" + + "\xe6\x3e\xf5\x53\x2d\x02\x00\xd5\x6a\xa9\xba\x69\x2f\x56\xc5\x7c\xdd\x9b\xc2\x15\x54\xe9\x89\x30\x57\x0b\x7a\xc3" + + "\x20\x96\x38\x0e\x68\xb7\xdd\xb0\x49\x92\xe8\x81\xb8\x40\xd7\x3f\xfb\x23\x46\xb1\x63\x4b\x5e\x4a\x53\x25\xdd\x01" + + "\x5c\x8e\xcf\xb3\x2c\x71\x55\x8a\x47\x2e\xf7\x8b\x9b\x99\x9b\x45\x58\xbd\x37\xd4\xac\x39\x83\xea\x36\x8b\x4f\x6c" + + "\x3c\x8c\xaf\xa6\x5e\x30\xed\xba\x39\xe4\x87\x62\x6a\x43\x23\xc3\x1d\x20\x0f\x3b\xa3\x4b\x1f\x3d\x1a\x20\x44\x3c" + + "\x58\x53\xc9\xae\x81\x5b\x9e\x2a\x7d\xa5\x4c\x5d\x5d\xdc\xe3\x0c\x6a\xa5\x71\x09\x81\x80\x49\x5d\x19\x4e\xcb\x85" + + "\x57\x30\xcb\x47\xc7\x7c\x83\x1f\xa0\xd1\x0f\xfe\x86\x26\x21\x16\xc9\xb4\xd5\xf2\xd6\xa0\x8e\xed\x88\x7c\x3f\xb0" + + "\x22\x31\xde\x86\xf4\x2b\xd4\x10\x81\x08\x9e\x74\x7b\x0d\x43\x5a\x38\x12\xc9\x4d\xdd\x96\x39\x7e\x27\xa7\x1f\x3e" + + "\xd5\x3a\x22\xd3\x50\x8a\x72\xc9\x02\x3c\x1f\x0d\xf8\x44\x8a\x1c\x31\x12\xb5\x27\xf6\x4e\x73\x31\x21\x7e\x32\xee" + + "\xde\xf5\x29\x57\xe9\xf2\x47\x8a\x80\x9c\x18\x4f\xc7\xb1\x51\x8e\x84\x9e\xa5\xba\x24\x16\x2a\x22\x50\xbb\x96\x41" + + "\x0a\x63\x9a\x56\x65\xcd\x26\xad\xe4\x94\x6a\x45\xd0\x21\xd9\x56\x4e\x0e\x2e\x30\x6a\xd1\xac\x7c\x1b\xda\xb6\xb8" + + "\xcd\xde\x1e\xff\x55\x9b\x0e\x90\x22\x6e\x32\xb2\x0e\x4c\x64\x3e\x62\x06\x7b\xdb\xf8\xb1\xe0\x91\x6a\x67\x80\x0e" + + "\x93\xff\x07\xd6\x28\xee\x0e\xf9\xf4\x26\x5f\xab\x6b\x5c\xed\x27\xf5\xee\xbe\xf1\x56\x35\xe4\xb3\xef\x9c\xb0\xdb" + + "\x45\xee\x2f\x60\xeb\xa2\xe9\x22\x8b\xfe\x59\x3d\xd9\xd4\xe0\x2d\xbd\xc1\x20\xcf\xb3\xc6\xba\x3f\xbe\xda\x3b\x66" + + "\xf7\x4f\xf5\xf7\x91\x39\xfe\xcb\xbb\x13\xce\xb7\xb9\x3d\x30\xfa\xbf\x8e\x00\xb5\x25\x34\x87\xe1\x8d\xf9\x44\xd4" + + "\x75\xdb\xd8\xac\xe7\xba\xd9\x88\x3f\x6e\x51\x55\x63\x5d\x29\x7b\x81\xfc\x81\x63\x79\xf9\xef\xb3\xc6\x52\x71\xa9" + + "\xd1\xb0\x43\x27\x3d\xde\xd9\x21\x76\xc0\x6d\x43\xbd\x79\x4c\x8a\xcf\x2e\x7a\xdc\x12\x46\x79\x83\x0a\x4b\x47\xde" + + "\x42\x07\x0f\xf2\x42\x9c\xe5\x3c\x8a\x93\x35\xbc\x7f\x61\xd0\x18\xe1\xdd\x6b\xf5\xdb\xf0\x9c\xb2\xd3\x48\x2c\x2d" + + "\x83\x3f\xcb\xc3\xad\x72\x37\x36\xba\x2b\x72\x74\x52\xff\x2b\x76\xd8\xe9\x20\x9a\xf8\x5b\x3b\xd0\x99\x60\x17\x5b" + + "\x35\x30\xc8\x67\x7c\x8a\x75\xad\x31\x53\xeb\xb2\x54\x0f\x7f\x4d\x5b\xf4\x3d\xa1\xd6\xec\x59\x20\xf4\x62\x76\x85" + + "\xff\x8f\xbc\x7f\xef\x6e\xdb\xb8\xf6\xc7\xe1\xbf\x95\xb5\xfc\x1e\x46\x70\x8f\x4c\x5a\x14\x29\xd9\xce\x8d\xb2\xa2" + + "\xc7\xb1\x9d\xc6\xdf\xc6\x76\x4e\xe4\x36\xed\x23\xab\xee\x88\x18\x92\x88\x40\x80\x05\x40\x51\x4a\xe4\xf7\xfe\x5b" + + "\xb3\x2f\x33\x7b\x06\xa0\xe4\xb4\x3d\x67\xfd\x2e\xab\xab\x31\x05\x0c\xe6\x3e\x7b\xf6\xf5\xb3\x17\xe5\xa5\xf4\xf9" + + "\xf7\x82\xe2\x76\xac\x44\x70\xb3\xeb\xb1\x22\x36\x70\x85\x2d\xa3\xd7\x4f\xe6\xd2\x54\xb5\x51\x25\x04\x29\x00\xd8" + + "\x18\x12\xd8\x87\x60\x97\xb3\x87\x64\x2f\x35\x55\x76\x09\x86\x7a\xd1\x09\xa9\x4b\x21\x91\x05\xfd\x3e\xdb\x82\x6a" + + "\x85\x6d\xf4\x36\x0b\xaa\x1b\x38\x5d\xaf\x6d\x82\x3b\x14\x1d\x1f\xcb\x66\x3d\xcf\x40\x23\xd1\x1b\xbd\x3f\xd9\x1d" + + "\xcd\xbc\xab\x22\x99\x94\x01\x30\x4c\xd1\x5d\xcd\x49\x98\xa7\x65\xb5\x80\x00\xf0\xc9\xdc\x60\x55\xf4\x86\x33\x56" + + "\xfc\xe6\xb4\x5a\xcf\xcb\xe2\xd2\x54\x0d\xd5\xb5\x87\x5f\x36\x26\x15\x09\x9d\x5d\xfd\xf2\x6d\x61\xd9\xae\x22\x55" + + "\x88\xf2\x9a\x15\xdc\x98\xc7\xbe\x87\x40\x80\xb7\x58\x4b\xcf\x55\xe7\x3d\xc3\x90\x57\x53\x47\x41\xdf\x4e\x5d\xc1" + + "\x33\xee\xe6\x96\xbc\xe3\xf9\x35\x0a\x27\x3d\x31\x45\x7d\xe7\x36\xe2\xce\xdc\x87\x81\x9a\xe6\xda\x69\x1e\xb0\xc1" + + "\x53\x7c\x66\xab\x67\xf9\xf8\xa3\x74\x03\xc7\x52\xce\x75\x1a\xc3\xa5\x9f\xc3\x60\x94\x06\x03\x14\x80\x15\xe7\x59" + + "\xdd\xa8\x15\x61\xf1\x1a\xe5\x22\x26\x14\x44\x13\x5b\xa9\xa3\x1e\xdb\x4f\xed\xff\xb7\xa8\xd3\x63\x2b\x74\xe0\x6f" + + "\x9d\x63\x0d\xf6\xc8\x2d\xf5\xc4\xec\xd5\xc6\x7e\x28\x27\x1e\x63\xb0\xb3\x3c\x57\x93\xb9\x2e\x66\x46\xcd\xcb\x35" + + "\xd4\x66\x79\x34\x13\xf5\xe4\xdc\xcc\xb5\xe5\x84\xc1\xed\x63\x61\x97\xa4\xa9\x74\xca\x80\x7d\x58\xa5\x33\x78\x60" + + "\xaf\xd4\xb7\xd7\x2e\xc0\x25\x1e\x18\x34\xab\x27\x8d\xca\xb3\x0b\x03\xa2\x12\xc4\x66\x84\x85\xec\xf2\x23\xc6\x00" + + "\x54\x97\x4c\x2d\x27\x9f\x78\x38\x8d\x26\x5b\x98\x7a\xe8\x9a\xfb\x91\xa1\x72\x78\x36\xfc\xf4\x14\x13\x33\xde\xda" + + "\xda\x82\x56\x11\xce\x53\xb5\x87\x68\x9b\x82\x18\xe1\x73\xe0\xed\x61\x13\x4e\x8c\xea\x61\x17\xd5\x0b\x33\x35\x55" + + "\x65\xd2\xbe\xab\x76\x61\x16\x65\x75\xed\x2a\x46\x9c\x5e\x40\x05\x2a\xa7\x3e\x27\x09\x81\x98\x68\xb0\xd6\xdb\xc9" + + "\xc6\xd4\x41\xd7\xbe\x75\x9d\xa6\x18\x95\x0e\xd2\xac\x9e\x02\xca\xfb\xdc\x60\xaf\xe6\xba\x56\xe7\xc6\x14\xd4\x25" + + "\x88\xf4\x54\x7a\xad\xaf\xc9\xf1\xc6\x96\xb3\x14\xad\x51\x09\xf4\x27\xfb\xd5\xa4\x89\xab\x8c\xb3\x09\x6f\x1c\x03" + + "\x12\xb5\x78\x72\xc4\x72\xc9\x59\x81\x8e\xd2\xac\x14\xa5\x27\xa7\x6c\x5c\xb3\x1d\xf6\x55\xd7\x4d\xb9\x7c\x5b\x7c" + + "\xa7\xf3\xda\x8c\xb7\x20\xc2\xa6\x5a\x2d\x71\x8d\xc1\x9d\x01\xf4\xbb\xa2\x25\x8e\x0f\x22\x57\x1e\xac\x65\xe4\x58" + + "\xf0\xe7\x54\xae\x0e\xae\xbd\xe0\xd8\x73\x78\x1f\x52\x1c\x47\xac\xaa\x72\xd1\x26\x3f\x5d\x44\x27\x9b\x02\xb4\x0e" + + "\x87\xf8\xf5\xd6\x86\xfc\x76\x98\xfc\xa0\xcc\x67\x05\x12\xae\xdc\x45\xc9\xbb\x07\x2d\x55\x52\x6f\x23\x01\xba\xb9" + + "\xd9\x4c\xc5\xfa\x81\x77\x28\x69\x17\xd5\x6f\x1f\x07\xbe\x0c\x5e\xd8\x96\xd4\x59\x19\x58\xd7\x0d\xec\x11\xdc\x70" + + "\xaa\x37\x25\x54\xfc\x69\x59\xcd\x4c\x83\xb1\x75\x76\x81\x08\x93\x16\xf6\xee\x80\x04\xe8\xef\x2c\xc5\x6a\x4a\x75" + + "\x51\x94\x6b\x3b\x0b\x78\x46\x75\xad\x74\x8e\x26\x18\xd8\x7c\xa0\xd9\xb2\x3f\x6e\xfd\x2c\xab\xad\xfc\x64\xaf\xb3" + + "\x1c\xbe\xa3\x40\x64\xfc\xe5\xbe\x04\xd9\xd9\x2d\x7d\x53\x62\xd7\x7b\x80\x25\x92\x11\x3e\x8a\xdd\x74\xd7\x76\xd3" + + "\x71\x6e\x4a\xf3\x73\xd6\xcc\xfb\xbe\xb6\x93\x46\x57\x0d\x57\xf9\xb2\x48\x59\xe8\xcf\xcb\x72\x89\xdb\x2b\x6e\xff" + + "\x07\xaf\x40\x04\x53\x48\x6a\xae\xc0\x05\x20\xea\xb0\xef\x59\xcf\x45\x6e\x9e\x5f\xab\x0a\xd9\x08\xb7\x4d\x44\x57" + + "\xa0\x2a\xae\xf7\x19\x82\x14\x05\xe4\xc5\xbe\x82\xf9\x71\xfa\x4a\xb8\x60\x89\x5a\xc0\xe8\x6d\x79\x84\x0f\xab\xcc" + + "\xd2\x68\xb1\x64\xb6\x78\x0d\x65\x8f\xd4\x36\xdf\x50\x70\x0e\x3d\x8a\x21\xce\xaa\x27\x6a\x35\x2f\x57\x70\x5e\x20" + + "\x1d\x98\x63\xb7\x60\x13\xf8\x1b\x72\x48\x0f\x76\x76\xa0\x1c\xa9\x8e\x81\xee\x1c\x09\x65\xaf\x18\x31\x44\x43\xbb" + + "\xa5\x00\xe8\x3f\x59\x06\x9f\x1e\x85\x0f\x7f\x60\xc3\xa6\x1d\x5a\x00\x59\x4e\x93\x1f\xb4\x45\x9a\x54\x98\xba\x9d" + + "\x1d\x25\xdb\x7e\xaa\x64\x85\x87\xf2\x5d\x4b\xbf\x6d\xbf\x3f\x0d\xbe\x76\xc8\xb5\x76\xa8\xa0\x9f\x19\xd0\xcf\x03" + + "\x60\xfe\xec\x41\x06\x52\x04\x69\xb4\x68\x82\x04\x4d\x93\x88\x60\x3c\x8f\x98\xa0\x48\x01\x9a\x1f\xdc\x00\xa0\x8e" + + "\x5d\x55\x80\x04\x89\xcb\x8b\x57\xba\x4e\xd3\xdb\x95\x97\x7e\x2e\x44\xd2\x23\x37\x92\x68\x70\xb8\x35\x22\xcf\x66" + + "\x78\x38\x8c\xf2\x6b\xd3\x7a\xf2\x5b\x42\x1c\x68\x63\xb3\x09\xeb\x30\x0d\xce\xd7\xe0\x76\xf1\xe1\xbd\x2e\xbf\x8f" + + "\xda\xe4\xd3\x21\xc5\x60\xf5\xba\x92\x1b\x44\xa7\xc4\xd3\x75\xef\x2f\x41\xde\xe3\x8e\x7f\x7f\x66\x69\x80\x3f\x4f" + + "\xc0\x84\xf8\xfc\xf3\x70\x82\x5d\x2d\xe4\x83\xc1\x67\x2e\x52\xaf\xb5\x77\x45\x88\xc3\x06\x84\x09\x22\xe2\x6b\x4d" + + "\xe6\x58\x22\x0e\x94\x6e\x93\x8a\x5a\xaa\x5b\xd3\xee\x6e\xed\xe3\xad\xad\x9e\xcc\xf2\xd8\x53\xba\x9a\x05\x09\xe2" + + "\x02\x8e\xd3\xbe\x8c\xb8\x4a\x5d\xcd\x02\xe7\x21\x30\x1a\x05\xf6\x5c\xfb\x57\x0f\xcb\x79\x3f\x1e\xa7\x6c\x8d\xa1" + + "\x5a\x02\x47\x24\x14\x7b\x78\x47\x93\x41\x95\x32\xbd\x4c\x87\x73\x5d\x53\xbd\xe1\x57\xb0\xec\xa4\x7d\x8f\x9a\xf5" + + "\xfe\x43\xc1\xc6\xb1\xa5\x76\x76\xec\x3f\x12\x19\x80\x95\x5c\x2d\xd9\xcf\x7b\xd8\xd4\x4b\xcb\xb7\x3b\xd8\x29\x07" + + "\x46\x80\x8b\xd9\x6a\xde\x7b\x2f\xf9\x6d\xdc\xef\x39\x2d\xb9\x80\x1e\x00\x23\x86\x5d\xdb\x82\xec\xce\xf6\x6e\x91" + + "\x8c\x20\xef\x1e\x5f\x9e\x17\x9f\x8e\xe3\xb9\x95\x0a\x8e\xe5\x31\xa3\x17\xe1\x01\xbb\x95\xca\x21\x62\xac\x65\xde" + + "\xe8\x12\xf6\x69\x5a\x8b\xd2\xb5\xd4\xcc\x4d\xe1\x8b\xdb\xfd\x88\x31\xd5\xc0\x3e\x7a\x2e\x90\x07\x7c\xdb\x81\x8d" + + "\x88\x31\x6c\xdb\xc3\x90\x1c\xf0\x37\x9d\x51\x0d\x6d\x1f\x22\x3c\xc3\x42\xb2\x16\x87\x13\xa1\xf0\xe5\x09\xc4\x6b" + + "\xf3\x53\x0f\x61\x7c\x36\x56\xad\xc0\xa3\xf6\x01\x01\x6b\xa7\xa5\xea\x6e\x58\x4e\xff\x4b\x66\x09\x77\x70\xb2\x82" + + "\x7c\x31\x74\x35\x1b\x40\xdb\x03\x2a\xd2\x57\x32\x75\x85\xdc\xf5\x0e\xfe\x02\x2e\x79\x09\x81\x21\x9d\x8a\x69\xe1" + + "\x32\xcc\x49\x1f\x1e\xca\xf6\x2e\xa1\x17\xd8\xf4\xd3\xa3\xe0\x2a\x8b\x4e\x9e\x7c\xe5\x11\x3c\x83\x73\xd7\x59\xd9" + + "\x2b\x1a\x56\xbb\x2e\x78\xb3\xa1\xaa\xb6\x33\x60\x48\xc4\x6f\xdb\x0d\xe8\xbc\x97\x4d\x95\x56\xb3\xec\xd2\x14\x7e" + + "\x57\x40\x36\x19\xb7\x2d\x86\xf7\xbc\x9d\xa5\xf0\x06\x2d\x5b\x0a\xbe\x73\x96\xad\xf5\xdc\xc0\xdd\x89\x98\xa3\x5e" + + "\x22\xf2\x07\x56\x37\x08\x4a\x80\x55\x46\xa6\x77\xa7\x3b\x13\x39\x04\x0b\x6f\xe7\x73\x7b\x61\x5a\x0c\x78\x1b\xa2" + + "\xdd\x53\x6d\x6f\xf7\x1c\xcf\x21\x4e\xb0\x53\xfa\xb4\x0e\x40\x9e\x8b\x4e\xb5\xcf\x00\xa0\xaf\x74\x1d\x81\xf8\x36" + + "\x8d\xa8\x07\x63\x94\xde\x32\xe9\xdf\xf3\x45\x05\x55\xa5\xa5\x9d\x29\x80\x02\xd6\xc5\xb5\x95\xd4\xa1\x1c\x5d\xc8" + + "\xb7\xf4\x80\xf9\x4b\xc7\xcc\x48\xcf\x94\x3b\xba\xf0\xaa\x56\x59\xa3\x38\xf0\xfa\x58\xb6\xd8\x79\xf9\x72\x9c\x8b" + + "\x6d\x3a\xae\xeb\x87\xd2\x0a\x04\x3c\x9c\xac\x50\x59\xe3\x24\x0a\xdb\xc9\x06\x07\x94\x97\x81\x39\xca\x03\xf8\xd1" + + "\x30\xe2\xde\x13\x0e\x61\x4c\x1b\x6f\xe1\x56\xee\x1e\xb0\xed\x03\x0f\x17\x7f\xdf\x36\x58\xe8\x59\xeb\xc4\x80\x36" + + "\x20\xd8\x3c\x4e\xae\xa7\x23\xc4\xee\xc9\x45\xea\xc9\xa1\xe3\xcc\xed\x3d\x22\x77\xbc\x03\x80\x0b\x59\x0e\x4f\x68" + + "\x21\x7f\xc6\x36\x32\xf5\x37\x37\x8e\x75\xf4\x33\x02\x1f\x1e\xe1\xf7\x8c\xb9\x26\x5f\x9c\x86\x6d\xa0\x96\x58\x1d" + + "\x8b\x3f\x7a\x7d\x35\xc6\xef\xcf\x0e\x6f\xbf\x2a\x91\x0b\x75\x4c\x85\xb8\xaa\x63\x97\x66\xbc\xa6\xa2\x32\x9f\x4c" + + "\x96\x78\x92\xc3\xbb\x3e\x9a\xe8\xf6\xe4\x76\xee\x2f\xbb\x61\x78\xe6\x59\x8b\xde\xe6\x35\x6e\xe9\xcd\x3b\x2f\x30" + + "\x87\xfd\xc1\x5c\x77\x24\x71\x83\xce\x87\xdd\xd1\x2d\xf3\x69\xe5\xfb\xb2\xa0\x94\xff\xb0\x7e\xb7\x6d\x36\x5c\x61" + + "\xa9\x23\x0e\xb0\x4f\xed\x28\x5c\x40\x68\x87\xa3\xdb\xbd\xcf\xb6\x58\x57\x14\xd0\xd3\x55\x31\x09\x1c\x99\x56\xcb" + + "\x1c\x50\x6f\x4e\xb1\xf5\xd1\x48\x69\x28\x3a\x00\xd6\xca\x6e\x38\x53\x98\x6a\xe0\x7e\xd1\x85\x8b\x29\xb9\xfc\x61" + + "\xde\x3a\x55\x49\x65\xea\x32\xbf\x04\xdc\x8c\xb4\x2c\xec\xbf\xb1\xe2\xa7\x97\x80\xc8\x8b\x67\x38\xe9\x0f\xdc\x37" + + "\x69\xa2\x38\xb6\x01\x2a\xb2\x62\x84\xad\x67\xaa\xb3\xfc\x13\xeb\xb1\x9f\x44\xf5\x14\x65\x93\x4d\xaf\x13\xb0\x6e" + + "\x95\xb3\xca\xd4\x75\x67\x5d\x5c\x8d\x3a\x83\x2f\x39\xfe\xb5\x41\x47\xbf\x64\x69\x00\x5f\x27\xe1\x3c\x94\xe5\x22" + + "\xab\x9d\xa3\x22\x95\xeb\x5a\x48\xb7\x52\x0d\xc2\x08\x6d\xf9\x3d\xb4\x85\x69\x06\x3a\xbf\x4a\x69\xd5\x86\x76\x0e" + + "\x03\x26\x78\x68\x67\xa3\x93\x2d\xee\x70\x11\xa7\x86\x2c\x13\x2a\xd7\x7f\xf4\x50\x4d\x8b\x17\x65\x01\x66\xa9\xef" + + "\x74\x96\xdb\x7f\x7f\xa4\xd9\xf1\x28\xb6\xcc\x92\x4d\x0b\xa2\x24\xd8\x62\xd4\x1e\x4d\x25\xef\x33\x01\xf2\x51\x98" + + "\x35\x3c\xdd\x28\x32\xe1\xbe\x93\x3c\x61\x36\xc0\x87\x2d\xb1\x69\x5a\x08\xde\x4f\x78\x38\x4f\x31\x19\x09\x85\x98" + + "\xf0\x5f\x01\x5f\xc7\x73\x79\x0a\x79\xa0\xd5\x0d\xa6\x81\xbe\x51\xbc\x1d\xd4\x19\x22\x30\x94\xd5\x5a\x57\x80\x1f" + + "\xa7\x19\x1e\xb7\x74\x63\x70\x15\xfa\xda\xa0\xa3\xa7\x07\x67\xea\xac\x23\x72\x99\xfb\xed\x62\x34\x8f\xec\x10\xa0" + + "\x8b\xac\xb0\xd8\x44\x73\x1c\xa1\x75\xdf\xca\xe0\x19\x3f\x74\x7e\x3d\xe4\xdd\x18\x8b\x7a\x71\x81\x5e\x5f\xbc\xdc" + + "\xa2\xad\xc5\x03\x1c\xd2\x21\x54\x61\x21\xdc\x6d\xa2\x10\x18\x63\xc2\x32\x3c\x91\xa2\x1c\x1e\xba\x50\xba\x6c\x45" + + "\xb7\x6c\x71\x71\x9e\x4b\xf0\xae\xd9\x55\x89\xa5\xc9\x89\x3a\xc3\x29\x02\x21\x98\x87\x78\xec\x9b\x70\x83\x22\xd7" + + "\x93\x01\xf2\x84\xa7\x7e\xda\xce\xf0\xfe\xea\x98\x5e\xc1\x26\x8b\x0c\x81\xfe\x27\xee\x78\x87\xc0\x02\x2f\x7d\x83" + + "\xd1\xe9\xa2\x6c\x8c\xda\x75\xd2\xee\x26\xe8\x39\xef\x15\x57\xee\xd5\x54\x95\xe7\xbf\x58\xfe\x98\x51\xe8\x06\x94" + + "\xd5\x07\xbf\xd4\x28\x33\x67\x35\xe9\xe8\x49\x09\x22\x23\x50\xa8\xa8\x3c\xce\xb6\xca\x16\xc1\xb1\x0f\xb7\x5d\x7a" + + "\x8f\x48\xff\x5c\x9e\xff\x32\x50\x7e\xdb\x8c\xf9\x77\xa8\xe6\xc1\xf1\xf1\x20\xbc\x39\xd0\xe7\xd6\x58\x66\xcb\xce" + + "\x20\x39\xaa\x6e\x08\xef\xdd\xea\x0d\x2d\x1d\xf2\x35\x3c\xa3\xab\x65\x8f\xc2\x07\x27\xec\x55\x7e\xef\xb3\xdf\x4f" + + "\x27\xec\x59\x23\x0e\x98\xf6\xd2\x23\x77\x09\x00\xed\x25\x23\xa8\x7b\xfd\x58\x49\xa0\x4b\xea\xe1\x2d\x24\x82\x34" + + "\x00\xac\xf1\x73\x1f\x78\x2a\x20\x8a\xc8\x98\x18\x94\x2a\xfd\x25\xc9\x5a\x3d\xd7\xa5\x80\x83\x07\x9f\xab\x0e\x72" + + "\x32\x1a\x29\xbe\x8b\xec\x0e\xc7\xfb\x52\xdd\x28\xbe\xf2\xe8\xda\xf2\x37\x96\x68\x41\x46\x7c\x9d\xd2\x17\x1f\x60" + + "\xb2\x6e\xb8\x2a\xfc\xf3\x8c\x59\xe8\x43\x37\xf2\x0f\x28\x35\x95\x1c\x7a\xfa\x91\x26\x1e\xe8\xec\xdf\xd5\x81\x3a" + + "\x83\x99\xe6\x0f\xfd\xdb\x47\xfc\xc6\x7e\xdb\x61\x64\xf7\x74\x94\x09\x0f\x0f\x46\xdd\x28\x22\x1f\x67\xc1\x06\xe4" + + "\xb9\xde\x3f\x0b\x7d\x26\xdc\x24\x75\x14\xec\x24\x26\x6e\x47\x1f\xbb\x33\x30\xfe\x1d\x1c\xe0\xe1\xa6\x5e\xf9\xc6" + + "\x78\x2b\x30\x83\x49\xe0\x1d\x7e\xef\xbf\xd6\x17\x86\xa1\x03\xb1\x2f\x8e\x7c\x04\xe7\x87\x48\x8e\x2f\x26\xea\x00" + + "\x76\x18\x79\x5e\x60\xe8\x30\x3b\xda\x3d\xf6\xa3\x90\x4c\xde\x96\xfd\x83\x5c\x24\xb9\xaa\x41\x58\x69\x90\xa4\x33" + + "\xcf\xe1\x20\x6c\xdf\xf3\xee\x08\x5c\x38\xf6\x9b\xa5\x2a\xe6\x26\x5f\xc2\x2d\xb9\x8e\x78\x8d\x7a\x75\x5e\xda\x5b" + + "\xd5\xee\xca\xd1\x43\x35\x50\xc3\xe1\x70\x20\x9f\xbe\x11\x0c\x47\x98\x9a\x7f\x8b\x76\xc6\x5f\xd0\xfa\x79\xa4\x40" + + "\x2c\xa1\x61\x88\x95\x72\x78\x26\x28\x6b\x07\x5f\xb5\x93\x83\x23\x1a\xe4\xaa\x00\xa3\xfa\xaa\xb0\x44\x2b\x37\xf6" + + "\x04\x89\x3e\xd5\xd4\xfc\x42\x67\x05\x52\x0d\xaa\x1d\xdd\x0c\x31\xd3\xb4\x18\x58\xf7\x05\x2d\x4a\x04\x77\xf4\xb1" + + "\x72\xde\xb7\xfb\x51\xc7\x16\xba\x6e\x4c\xe5\xa6\x75\x68\x6f\x8c\x70\x16\x26\x65\x51\x93\x47\x00\x66\xd2\x50\x18" + + "\x75\xeb\xbe\x19\x60\x70\xdd\xaa\xc6\xb0\xf3\x61\x4c\xc4\xc5\xa8\x10\xfc\x26\x18\xc9\xb8\xc5\xcf\xc9\xf4\xe5\x7f" + + "\x5e\xa6\xb6\x90\xd3\x8a\x03\xe9\x2f\x9b\xb9\x3b\xc3\xe8\x1f\x43\x44\x13\xad\xd6\xf0\xed\x0a\x3e\xb4\x53\x13\x98" + + "\xb1\x32\xe7\xb3\x5a\x0f\xd8\xc2\xde\xd2\xf4\xb8\xd2\x68\x11\x6d\x05\x7d\x13\x03\x78\x24\x39\x5f\xb2\x98\xf3\x1b" + + "\xb7\x59\x42\x3f\xf1\x0d\xfb\x49\x8d\xb1\xa9\x40\xea\xa5\xde\x11\x33\x02\x03\xfc\x4b\xd4\x61\xc1\xb6\x23\x01\x43" + + "\xd9\xb2\x3d\xc2\x48\x3a\xa6\xbc\x2d\x6a\x6f\xcf\xaf\x4d\xbf\xb3\x5a\x9a\xe6\x3b\xeb\x25\x5a\xed\x45\x56\xbe\xb3" + + "\x44\xbf\x07\x6e\x1c\xcf\x5d\x45\x54\x3f\x3f\xf0\xb4\x46\x8a\x81\xc0\x17\xbb\x83\x2f\x4f\xcd\xa1\x6a\x2a\xa3\x1b" + + "\x0c\x76\xae\x95\xae\xdd\x4d\xe5\xa8\x52\x87\x63\x57\x34\x9d\x47\x96\xc5\x53\xa4\xd1\x0b\xd5\x75\x71\x87\x6f\x2b" + + "\x1b\x0d\xe5\xb6\xa2\x51\x2a\x4f\x30\x42\xb6\x43\x6b\x82\x63\x88\x1b\x6b\x13\x5f\x1e\x17\xec\xe4\xd0\x37\x17\xf3" + + "\x7c\x3a\xf1\xe8\xfe\xf4\xc0\x91\x89\x86\x36\x88\x28\x44\xdf\xb3\xe7\xc4\xbe\x8b\xfd\x13\xb2\xef\x82\x75\x8f\xda" + + "\x68\xef\x8d\xd6\xae\xef\x77\x1b\x0e\xc5\x2e\xde\x18\xcc\x31\x1a\x85\xc6\x92\xb5\xce\x20\x3a\xb0\x2c\xec\x15\x06" + + "\x6a\x4f\x37\x2a\x41\x17\xdd\x2e\xda\x96\x07\xe5\xb7\x80\xc2\x85\x67\xe4\xae\xa9\xea\x08\xf7\x74\x15\x05\xfc\x7e" + + "\x84\x41\xf3\x4e\x5e\xdd\xe0\xed\x50\x16\xea\xc5\xdb\xd7\x1c\x99\x8b\xa2\x9f\x4e\xaf\x7f\x40\xd5\xa8\x0c\x31\x43" + + "\xc5\xd0\x51\x97\x7e\x9b\xb8\x62\xa9\x4f\xf2\x8e\x6d\xf0\x9d\xef\x15\xed\x8d\x69\xe1\x73\x2d\x48\x4e\x65\x53\xe8" + + "\x23\x6a\x3d\x6d\x0b\xae\xbb\xf6\x3c\x53\x02\x98\x63\x75\x62\x1a\x10\x3b\xaa\x95\x41\x17\xa1\xac\x51\xe5\x64\xb2" + + "\xaa\xea\x21\xe0\x1e\xfd\x64\xbf\x18\xa3\x39\x5b\xc0\xe4\xc0\x8d\x6a\x2a\xfc\x54\x4f\x2e\xd4\xbc\x5c\xab\x85\x2e" + + "\xae\x55\xd6\x98\x05\x90\x0c\xbb\xc8\x78\x63\x98\x29\xea\xb3\xe9\xd2\xc3\x4e\x90\x95\x3d\xab\x4c\x3d\x54\x27\xc6" + + "\xa8\xfb\x5f\x7c\xf9\xd5\x01\x8c\x4b\xa7\xd7\x3f\xeb\xac\x19\xab\x03\xd7\xe2\xf7\x65\x9e\xaa\x1e\xf8\x58\xe4\x46" + + "\xd7\xa6\x1f\xd7\x74\xef\xb3\xad\x79\x99\xa7\xdc\x5d\x37\xd7\xf6\x61\x80\xe0\x27\x1f\x04\x53\x6d\x9b\xdc\xdd\xc5" + + "\x1d\x22\xb7\x78\x18\x07\x8d\xf9\x91\x79\x1f\x09\xd6\x88\x18\xff\x35\x27\x64\xb3\xd3\x9d\xd5\x2e\x74\xbb\x8a\x3b" + + "\x06\xd3\x23\x43\x84\x1c\xf8\xbe\xcf\x58\x48\x5a\x28\xe8\x33\x38\xf1\xe1\x11\x62\x65\xa3\x0b\x0b\x87\x81\x41\x85" + + "\x02\xbb\x74\x6f\x2f\x1e\x9d\xbf\xed\x69\x5d\xa3\x48\x9e\x88\x2d\xfc\xc9\x20\x06\x15\xba\x1c\x76\x8c\x69\x2b\xaa" + + "\xcd\x79\x80\x50\x05\xaf\xa6\x4a\xab\xa2\xac\x16\x3a\x87\x4f\x7f\x8a\x16\x1e\x78\xd2\x49\x45\x89\xea\xc0\xd5\xce" + + "\xf6\x92\x1c\x75\xc0\x81\x50\x8e\x6d\x9b\xc7\xb6\xb3\xd3\x35\x38\x99\x35\xad\x73\x3c\xaf\xe4\xd4\xfa\xa4\x48\xe7" + + "\xe5\xaa\xb0\x72\x79\xc9\xa8\xf2\x48\x1c\xe8\x30\x87\xf4\xc5\x01\xa8\xa8\x53\x8e\x2d\x3a\x93\x3c\xfa\xbb\x2a\x9b" + + "\xcd\x00\xd7\xf3\x1a\xeb\x95\x5b\xd4\x63\x16\x79\xe2\xd0\xe0\x07\xb8\x79\xaa\x68\x5f\xca\x10\xee\xa8\x64\x4f\x25" + + "\x50\x73\xc2\x64\xb9\xe3\x8b\x72\x3a\x8d\x8b\x7d\x0c\x48\x1b\x67\xfd\x79\x17\x1d\xca\x39\xf5\x06\xb3\xa6\xe4\x53" + + "\x35\xc9\x8d\x2e\x56\x4b\x12\xd8\xc9\xc1\xcf\xbb\xf4\x32\x4b\x4d\xa2\x99\xc3\x0e\x41\x0b\xf2\x4b\x5b\xe7\x0f\xc4" + + "\x4c\xf4\x54\xf2\xe2\xed\xeb\xe7\xe8\x6c\xff\x43\xa9\x53\x93\x26\x03\x5f\x03\xa1\xbb\x61\x6f\x11\xe4\x76\x43\x2d" + + "\x79\xa9\x37\x7f\x19\x1c\xd9\x18\xa8\x32\xa0\xab\xa1\x57\xa2\x53\xac\xf0\xad\x43\x9b\xc0\x9f\x53\xff\xe8\xa8\xcd" + + "\x39\x4b\x59\xad\x99\xcc\xd5\x44\xd7\x06\x1c\x26\x2b\xa3\xfe\xe0\xd1\xc7\xb8\x5f\xe0\x73\x47\xa6\x02\xe7\x3d\x7a" + + "\x5e\x95\xeb\xda\x54\x6e\x25\xbc\x33\x1f\x50\xe5\x8a\x4c\xa6\xe8\x5c\x00\x04\xbb\xa9\x32\x54\x1d\x59\x11\x00\x8a" + + "\x9e\x80\x4e\x00\xe1\xd1\xf5\xa4\xc9\x2e\x4d\xa2\x6c\x27\x10\xd0\x3d\x6b\x14\xe0\x0f\xa6\x2a\xab\x6b\x7b\x2b\x82" + + "\x97\x29\xe8\x9d\x0a\x43\x75\xa7\x59\x3d\x29\x2f\x4d\x85\x0e\x74\xcf\xe7\x55\x56\x9f\x40\x15\x63\x46\x58\x3f\x5f" + + "\xcd\x6a\x0a\x96\x03\x78\xf5\x26\x9b\x5c\x98\x66\x74\xf0\xe8\xd1\x57\x8f\xee\x4f\xca\x85\x1d\xe9\xf8\xe0\x73\xb7" + + "\xe5\xc5\xa6\x70\x3d\x04\x77\x17\x5e\xc1\x44\x7a\xfe\x13\x31\xcd\x1a\xa5\xeb\xeb\x62\x32\xaf\xca\xa2\x5c\xd5\x98" + + "\xf4\x55\x03\xde\x3d\x43\x37\x41\xbf\x01\xc4\x7a\x55\x64\x0d\x14\x48\x4d\xae\x05\x71\xdc\xaa\x4d\xf3\x2e\x5b\x98" + + "\x72\xd5\xb8\x93\x87\x33\xca\x0b\xe6\xc9\xbd\x13\x7c\x6a\x9c\x11\x7b\x12\xae\x23\x2f\x67\x64\x3f\x78\x38\x3a\x4d" + + "\xff\xd5\x0d\xce\x8d\x3d\xb3\xcf\x9c\x47\x25\xed\xfa\xb2\xb0\x3b\x7c\x20\xdc\xbd\x29\x4b\xf1\xba\xac\xb0\x0b\x54" + + "\xb0\xa3\x03\xb7\x9e\x0d\xa6\x01\x1e\xb0\x91\x29\x9d\xd3\x3e\xc0\x39\x90\xa9\x21\xfe\x94\x81\xbf\xe3\x34\xe2\x23" + + "\x28\x75\xdc\xa5\x29\xd8\x2a\xb6\xb2\x5b\x37\x2d\x4d\x8d\xa8\xc6\xdd\x9c\x8c\x8b\x55\x80\xba\x5f\xaf\xf2\x26\xf3" + + "\x00\xc9\x44\x63\x38\x7b\x24\x27\x6e\x22\x91\xa7\x9c\x06\x2e\x64\x8e\x37\x83\xd7\xa3\x1a\xdd\x9e\x97\x0e\xa8\xeb" + + "\xdc\x30\x4d\x07\x2f\xe1\xac\x79\x50\x8b\x2c\x79\xc8\xb6\x69\x48\xee\xe8\x8f\xb3\xfb\x3b\x8c\x19\xa2\xa0\x9b\x0b" + + "\x73\x4d\xf2\xd7\x40\x4d\xe6\x3a\x2b\x50\x0b\x06\x7e\x02\x7f\x34\xcd\x40\x55\x7a\x2d\x82\x19\xbc\x72\xa3\x9d\x50" + + "\x19\x53\x72\xaf\xf2\x0b\x75\x64\xab\x15\xa8\xe7\x84\x0c\x68\x9a\x1a\x59\x2a\x27\x58\xcb\xcb\x03\x5d\xc9\xec\x87" + + "\x04\x04\x8f\x5a\x63\x77\x8c\x5c\xef\xa4\x63\x26\x23\x9b\x66\x05\x7d\x19\xb0\x38\x38\xf4\x60\xbc\x19\x0c\xf9\x34" + + "\x23\x4c\xcc\xd6\x48\xc5\x15\xcb\x5d\x2e\x0b\x5a\x0f\xbb\xcf\x84\xc4\x8b\xe2\x7c\x27\x98\x4b\x47\x5f\x3d\xef\xdf" + + "\x21\x72\xb1\x66\xc0\x5d\xf7\x7a\x2d\x47\x29\xc3\x8b\x60\x82\x05\x65\xf9\xd6\xfe\x2d\xd2\x8e\x55\xab\x22\xc8\xed" + + "\x61\x8a\x26\xab\x8c\x83\xd8\x44\x51\xd0\xad\x29\xd8\x0a\x04\xde\x35\x0b\xe3\x4e\x38\x02\xbb\x95\x5f\x46\x86\x04" + + "\x33\x57\x13\xb3\x24\x6c\x14\xdc\x91\x41\xc6\x1a\xa1\x39\x09\xa5\x2b\xda\x1e\xd3\x42\x56\x1f\xc7\xfb\xf9\x3d\xd9" + + "\x36\x0b\xd8\x0a\x36\x04\x66\x87\x1d\xff\xd8\x0e\x4c\x42\xb5\x62\x11\x61\x20\x6c\x02\xe6\x9d\xf2\x41\x81\xcd\x02" + + "\x7d\xb2\xf3\x76\x4c\xed\x90\x8e\x45\xce\x1d\x14\xcc\xec\x3e\x8b\xbe\x84\x95\x8d\x71\x49\x02\xac\x67\xbf\x61\xc0" + + "\x8d\x03\xb3\xb0\x8f\xdd\xf5\xfb\x47\x83\xcc\x16\x4c\x1f\x3a\x7a\x84\xcb\xe6\xb0\x1f\xec\xb1\x3c\x16\x3d\xd8\x77" + + "\x3d\x18\xbb\xad\x2e\x2c\xee\xcc\x31\x39\xfc\x80\xda\xf9\x3a\x69\x0e\xa4\x01\x22\x04\x4e\x01\xa9\x6e\x74\x18\x0d" + + "\x61\x4f\xd8\xb2\x79\xa1\x1b\x1d\x32\x1e\xeb\xc2\x31\x7f\xe0\x62\x6b\x4b\xd5\xa0\xf0\x1b\xe3\x23\xb5\x07\x09\xc6" + + "\xe9\x0f\xfe\x73\xf8\xf2\x87\x97\xaf\x5f\xbe\x79\xf7\xe1\xcd\xdb\x17\x2f\xe3\x77\x2f\xde\x3e\xff\x73\xfc\x72\x8f" + + "\xa2\x27\x44\xd9\x67\xa0\x43\xee\x04\x7b\x67\xd3\x92\xed\x5d\x8c\x0d\x71\x73\xd3\xf5\xfc\x6b\xf0\x48\xed\xa9\xdd" + + "\xe8\x5d\x5f\xcc\xa1\xdb\xf5\x76\x1a\x7a\x6e\xd0\x2e\x15\xc5\xb3\x22\xad\xca\x2c\x55\x4f\xd5\x13\x42\x1f\x7a\x9b" + + "\xa7\xea\x67\x73\xfe\xa7\xac\x71\x77\x0b\x4e\x30\x45\x9e\x93\xcb\xf6\x4b\x2b\xf5\xd6\xf6\x54\x8f\xa6\x95\x31\xbf" + + "\x1a\xba\x4b\xa8\x16\x1a\x4d\x61\xd6\x9c\x54\x0b\x97\xcb\x1e\x7d\xa3\x09\x94\xb3\x28\xd5\xe9\x69\x6d\x9a\xb3\x33" + + "\xba\x18\x00\x0f\x81\xda\x41\xaa\x45\x30\x84\x64\xd1\x1d\x4e\x5c\xec\xdc\x40\xed\x0f\xf0\x34\xcc\x4c\xd3\x61\xe6" + + "\xa7\x0e\x60\xf4\x9a\x4f\xf3\x70\xef\x33\x0c\xae\xe7\xb4\xa6\x32\x93\x01\x3c\xd8\x0d\x33\xf5\x33\x3b\x6b\xa7\x6f" + + "\xb8\xca\x52\xc2\x1a\x83\x3f\x35\xed\x9c\xe0\x36\xc3\x0d\x77\xe8\xbe\x91\x38\x53\xb6\x67\x17\x26\x10\x4c\xe5\x66" + + "\x04\x9f\x57\x4c\x33\x86\x35\x61\x24\x02\x07\xa9\x30\x8a\x02\xc2\xf7\x65\x85\x5a\x94\xa9\xb1\x54\x07\x99\xd8\x9a" + + "\x7d\xc6\x2d\xdb\xe9\x7d\x61\x8b\xb2\x81\x04\x61\xea\xfe\x57\x8f\x1f\x7f\x3e\x74\x46\x08\x60\x6f\x9c\x56\xc3\xc0" + + "\x39\x44\xc0\xe2\x69\x55\xfe\x6a\xf8\x7c\x0d\xfd\xd5\x20\xc7\xec\x3b\x1e\xcd\xf7\xbe\xbc\x13\xec\xa5\x9c\x1a\x64" + + "\x1e\x21\x04\xf6\xb7\x0e\x37\x48\xe0\x29\xa1\x32\xda\x22\xcc\x82\x03\x3b\x4e\x31\x45\x17\x06\xb9\xcb\x55\x01\x16" + + "\xaf\x23\xfc\xe2\x54\x05\x6b\x79\x16\x08\xc3\x30\x70\x0c\x1d\x62\x5e\x1b\xc7\x41\x75\x70\xc7\x5d\x95\xbc\xc4\xa0" + + "\x96\xe0\x6e\x9e\x98\xc9\xaa\x02\xde\x38\x2b\x40\xbe\x2e\xf6\x4c\xb1\x5a\x98\x0a\x59\x11\xfb\xf7\xba\xca\x30\x0c" + + "\x85\x73\x25\xc1\xb7\x4d\x75\xed\x4d\x67\x3c\x05\x71\x87\xed\x94\x20\xa9\x1e\x2b\xea\x07\x5d\x0d\x9d\xa7\x20\x33" + + "\x3c\xf1\x03\x39\xaf\x92\xbd\xed\x3a\xd8\xfc\xee\x3b\xc1\xf8\x6a\x45\xd9\xb8\x61\x78\xd0\x4a\xd6\x50\x5e\xdb\xad" + + "\x8f\x84\x26\xd9\x53\xe2\x92\xbb\x75\x14\xd8\x79\xea\x7a\x6c\x0f\xef\xec\x70\x5b\x69\xf9\x52\x06\x1d\x4e\x02\xcb" + + "\x3c\x2e\x9c\xa7\x00\xa7\x3c\x5b\x67\x11\x6c\x60\xf4\xf2\x48\x9c\x7f\xa1\x85\xf4\xbd\xc5\xb0\xfb\x80\x80\xb8\xfe" + + "\xea\x46\x47\x37\x3d\x40\x57\x54\xe5\xd2\xbb\xa9\x81\xb4\xb9\xd0\x18\xf9\xc7\x15\x53\x4e\x37\x76\x31\x00\x68\xbe" + + "\xd4\xb8\x8f\xa2\xdc\xab\xa6\xb0\x5b\xc5\xb9\x35\x24\xd0\x7c\x22\xb7\xae\xca\x8a\x3c\xc3\x1d\x0c\xe6\x02\x91\x5e" + + "\xd5\x35\xa8\x9a\x79\xb9\x9a\xcd\xe1\x62\x84\xc3\x84\xd5\xce\x75\xca\xa2\x8c\xb9\xb2\x32\x4b\x1a\xee\x79\x98\xb5" + + "\x0b\x73\xed\xce\x33\xf6\x92\xc9\x6c\xd7\xa4\x1e\x46\x40\xd1\x63\x75\xca\x53\x26\x78\xa3\x33\xf0\x43\xbc\x17\xa1" + + "\xdb\x00\x3d\xeb\x8c\x6a\xa7\x46\xa0\x80\x5d\x37\xb6\x11\x6d\x6a\xea\x37\x3e\x6d\x99\xa9\xd5\x47\xd1\x5c\xc0\xd2" + + "\xd9\x4d\x5f\x99\x7a\x2e\xb3\xec\x59\x19\x9b\x29\x8d\xe5\x3d\xe7\x28\xe2\x4e\xca\x65\x66\x04\xb6\xb2\x63\x84\x5f" + + "\xda\xeb\xcb\x01\xea\xc2\xc4\xf4\x5b\x71\xef\xbc\xd7\xbb\x26\x6c\x40\x01\x65\x87\xdc\xa5\xb7\x0c\x57\x6b\xa5\xc6" + + "\xe5\x35\x3b\xa9\x38\xb8\xdd\xc2\xec\x9d\x5f\xef\xd9\x85\xe7\xfc\x7a\xd1\x71\x88\xf8\x56\x64\x15\x6d\x0d\x96\x48" + + "\x05\xd1\x6b\x6e\x62\xe1\xad\x9d\x58\x0c\xdf\xc2\x3f\x3b\x4d\x08\x5b\x41\xd6\x6a\x77\x48\x66\x9d\x87\x44\xc8\x35" + + "\xf6\x04\x67\xc8\x9c\xd9\xd5\xcb\x52\xea\x76\x56\xab\x29\x2a\xfd\xca\x0a\x65\xeb\x73\x43\x9b\xdb\x69\x57\xde\x98" + + "\x35\x96\xae\xe3\x12\x98\x78\xdb\xef\x74\xf6\x3f\xe2\xcb\x4e\x73\xc8\x37\x22\xcc\xb2\x80\x49\x13\x57\x98\x75\x7e" + + "\xcd\x55\xd1\x17\xc8\x8e\xc0\x2c\xd1\x15\xa7\x9e\x51\x87\x83\x6b\x08\xa0\xe0\xcf\x8d\x73\x26\x1a\x32\x05\xe8\x3a" + + "\x1c\xad\x73\xe4\xce\x09\x4d\x26\xca\x9c\x52\x1a\x3b\x16\x27\x6d\xac\xa8\x1e\x5b\xec\xcc\xcd\x39\x0e\xa6\x7b\xda" + + "\x3b\x48\x13\xc0\x00\xa0\x3f\x2b\xc4\x08\x05\x2a\x31\x03\x6b\x33\xc6\x97\x54\x44\xa9\x83\xa1\x7a\x53\x42\xab\x6b" + + "\x2d\xa0\xc6\xdd\xfb\x47\x76\x72\xf0\xac\xb6\x4b\xa1\x86\xab\x28\xa9\x27\x22\xf7\xa7\x6f\xe2\x1d\xfb\x62\x80\x6a" + + "\x34\x51\x4b\xdd\xcc\xd1\x4d\x1b\x4e\x1d\x78\x16\x9b\x46\xe8\x21\x52\x66\xf6\x59\xf1\x06\xa8\xb6\xd8\x42\x53\xd2" + + "\xfa\x83\xa9\x69\x69\x40\xdb\x96\x5f\x6f\x1e\xdb\x3b\x2f\x63\xc6\x67\x88\x87\x07\xc6\x26\xbb\x19\x70\xf6\x14\x29" + + "\xdf\x89\xe1\xc0\xea\x80\x20\xb4\x57\xf0\xe6\x06\xcf\x4f\xaf\x67\xdf\x79\xfc\x0e\x2e\xc9\x44\x8e\x13\x93\xad\x4c" + + "\x58\x81\x04\x6f\xa3\xd6\x8f\x3c\x08\x55\x70\xc4\xf8\x86\x77\x0e\xaf\x50\x7a\xbb\x63\x43\x71\x4d\xe3\x76\x4d\x8c" + + "\x5f\xa8\x17\x26\x87\xfc\x6a\x17\xe6\xba\xdf\xf2\x4f\x39\x7d\x78\xf6\x33\x9b\x55\x6c\xdb\x84\x2c\xab\x69\x1b\xc0" + + "\x31\x06\xb7\x04\x0d\xaf\xed\x5a\xb2\x02\x02\x0e\xa4\xa5\xa9\x7e\x87\x00\x7c\x5b\xa5\x90\x3e\xaa\x1e\x5c\x42\x60" + + "\x8c\x84\x85\xa8\xfb\x28\x08\x6c\x5c\xc0\x67\x4e\xce\x03\xb8\x00\xa6\x91\xe1\xfe\xec\xe8\x86\xfd\x2f\x61\xd6\x36" + + "\x9d\xa7\x46\xe4\xf9\xcf\x40\xaf\x6b\xb7\x68\x6d\x1a\xda\xa1\x4e\xaa\x6c\xd6\xa5\xc3\x36\xa7\x3b\x75\x59\x66\x64" + + "\x5e\xf0\x72\x0e\x28\x33\xae\x96\xe8\x2d\x06\xdb\xe9\x5c\x93\xe1\x12\x37\x30\xd4\x6a\x4f\x4f\xa3\x2f\x4c\x71\xfa" + + "\xf0\x4c\xd0\x86\x2e\x5d\x8d\x97\xe4\x2f\xcc\xb5\x23\x08\xad\x28\xb1\x0e\x3a\x4c\x19\xec\x11\x18\x07\xd6\x7a\xf0" + + "\x9f\xba\xf3\x37\x9c\x83\x4f\x61\xc1\xba\xae\x66\xe2\x55\x15\xe4\x20\xb0\xbb\x04\x50\x38\x94\x47\xe1\x20\xc2\x83" + + "\x47\xaa\xee\xb8\x9b\xc9\xe3\x80\xb5\x18\x74\xe7\x21\xff\x9f\xd8\x19\x48\x28\xc7\x3c\x35\x81\x15\x0d\x87\x43\x57" + + "\x10\xb6\x3a\x2c\x18\x44\x5f\x01\xec\xaf\xbf\x32\x06\x90\x50\xa4\x97\x5c\x18\xf0\x71\xbf\xd4\x79\xd2\x57\x96\x93" + + "\xd0\xcd\xaa\x32\xde\x45\xd5\xd6\xea\x6f\x2e\xc4\x56\x40\xf6\xcf\x1d\x36\xdf\xa4\xdb\x70\x8e\x05\xa4\xfc\x27\x8d" + + "\xc9\x73\xf5\x61\x5e\xae\x3f\xd0\xd9\x02\x74\x81\x14\x1c\x59\x71\xe5\x5d\x1d\x70\x00\x97\xb9\x26\xd5\x22\xa2\x80" + + "\x50\x4b\xf6\xc9\x50\xdd\x3f\x78\xf4\xe5\x57\x5f\xb8\x0f\xde\x59\xde\x12\x7a\x08\x8e\x4d\x4b\x53\x20\xbc\xb1\xdd" + + "\xb8\x38\x39\x2e\xc0\xcc\x6e\x55\xea\x2d\x00\xec\x80\xc2\x74\x38\x29\x8b\x89\x6e\x60\xae\x11\x1b\x29\xa6\x26\x42" + + "\x8b\x14\x70\x27\x50\xc0\xcb\xc8\x9e\xfa\x38\xca\xc6\x5d\xac\x90\x15\xa2\x55\x07\xe9\xcf\x16\x41\x8b\x36\x58\xf9" + + "\x16\xba\xc8\x96\xab\x5c\x3b\x49\xc5\x6f\x49\x07\x3f\xe1\x59\x1f\xea\xfd\x29\x1e\x7c\xec\xc7\x86\x80\x6c\xb6\x9f" + + "\xc2\xac\x73\xc8\x0b\x6c\x47\x62\x9c\xeb\x01\x58\x7c\x32\x72\xf9\x6a\xf1\x71\x84\x4d\xc3\x3b\xed\xfc\xda\x65\x98" + + "\x47\x19\x71\x9e\x35\x06\xea\x0b\xfb\x06\x9d\x3a\x0c\x9f\xc1\x3f\x6e\x38\x1c\x48\xbb\xe5\x30\x97\xc6\x8c\x3d\xb5" + + "\x09\x7e\x47\xb5\x22\xca\xf1\xe8\x50\xdd\x41\xa0\x6d\x57\xd2\xfa\xad\xd4\xe4\xa6\x31\xcc\x93\xd8\x6f\xd0\x25\xe7" + + "\x2c\xd6\x12\x0e\x10\xc9\xd7\x4a\xce\x1b\x95\x1a\x1c\x6d\xd3\xc9\x50\xb7\xe8\x46\xa7\x5c\x8f\x30\x20\x80\x3e\xe8" + + "\x11\x17\xb7\xd2\xac\x9e\xe8\x2a\xdd\xd8\x30\x6c\x8d\xee\xfa\xbc\x5f\x0b\x0c\xf4\x13\x3a\x10\x18\x74\x09\x1a\xca" + + "\x92\x8d\x0f\xcb\x2a\xbb\x24\xff\x27\x54\xb1\xb9\xdc\x97\xf0\x1a\x6c\x34\xad\xd7\x8c\x6a\xb4\xe5\x72\x58\x62\x22" + + "\xf4\x93\xd5\x62\xa1\xab\x6b\x58\xb0\x83\xa1\x7a\x59\x4c\xcb\x6a\x62\xd4\xb3\x1f\x5f\xa9\x7a\x55\x4d\x2d\x75\x44" + + "\xe9\x6f\xa1\x8b\x26\x9b\x60\xe2\xed\x26\xc3\x4c\xe1\xb8\x71\x0f\x86\x5f\x0f\xaf\xd4\x79\xa5\x8b\xc9\xfc\xde\x67" + + "\x5b\x8f\x86\xea\xd5\xc2\x72\x66\xe4\xea\x53\xa6\xab\xdc\x3c\xa8\xd5\x42\x67\x80\x62\x4c\x59\xc6\x11\xb9\x23\x5d" + + "\x4d\x18\x4b\xc9\x72\x11\x7a\x86\xfe\xb2\xba\x99\xd7\xa8\x33\x20\x6f\xc8\x85\x99\xcc\x75\x91\xd5\x0b\x7b\x18\x1e" + + "\x0f\x9d\x01\xaf\xb6\x1b\x34\x2e\x63\xbf\xa4\xdc\xc2\x2a\x59\x02\xb0\x97\x49\x60\x18\x89\x9d\x9c\x04\xe6\xc9\x56" + + "\xf4\x64\xa8\x3e\xbc\x31\x97\xa6\xfa\x60\xaf\xd2\xb2\x36\xa2\x38\x50\x68\xb4\xba\x56\x6a\x52\xa6\x46\xf5\xde\xbd" + + "\x7d\xf1\x76\xac\x5e\x58\x41\xe6\x03\xca\xea\x1f\x90\x48\xda\x79\xee\xdf\xfb\x6c\xeb\xf3\xa1\x7a\x06\x89\xa1\xa0" + + "\x36\x08\x3b\x0e\x67\x3b\x35\x8d\xce\x72\x2b\x70\x61\xbd\xc4\x93\xa8\x9e\x99\x0d\x39\x5f\xba\x60\x3a\x6c\x9d\x5f" + + "\x0c\x5d\x52\x7b\x0d\x86\xfa\x0a\x6f\x76\x2b\x82\x45\xb5\xaf\x96\xb3\x4a\x63\x6e\x8e\x9f\x8d\xbe\x78\xad\x41\x3a" + + "\x7b\xb4\x7f\xf0\xe4\xde\x67\x0f\x47\xe4\xc5\x74\x5e\xd9\x35\xe5\xac\x52\xbf\x61\x4a\xa9\x87\xef\x3f\xde\xbc\x3f" + + "\xe5\xdf\x67\x98\x4f\x6a\xab\x02\x4c\xa7\x17\xba\x9e\xdb\xf2\xbd\xd3\x67\x7b\xff\xff\xb3\xfe\x68\x16\x42\x7d\xda" + + "\x89\x78\x06\x29\x4d\x84\xb5\x42\x48\x84\xb6\x51\x7b\x9e\x9d\xdd\x0b\x15\x65\x40\xa7\xec\x6d\x03\x92\x9a\x00\x97" + + "\x19\x28\xcb\xf1\xb8\x8c\xc4\xe8\x02\x3d\x1a\x91\x62\x92\x23\x78\xbf\x7f\xf7\xfa\x87\xcf\xe1\xd9\xde\x43\x9f\x7b" + + "\x85\x4d\x68\x4e\xe8\xf7\x1c\xc3\x86\x54\x91\x74\x2c\x89\x0e\x26\x50\x61\xa2\x76\xe1\xce\xa9\x0c\xa4\xb1\xee\x29" + + "\x3f\x0f\x03\x95\xec\xfd\xe1\x20\x51\xfd\x30\x69\x30\x1c\x55\x6c\x74\x53\xda\xed\x10\xc8\xef\x4e\xe5\x84\xd4\xe5" + + "\x61\xbd\xbe\x6c\x53\xad\x20\x4f\x37\xf8\xca\x70\xba\x62\xff\x1a\x6c\xc1\xf6\x3d\x1a\x85\xdb\x05\x8a\x55\x9e\xdb" + + "\xf7\x10\x4b\x32\x16\x97\x8b\xbd\xa6\x89\x95\xc0\xc3\x57\xac\xc0\x3f\x08\x4c\xab\xa0\x9a\x2f\x1e\x34\x0c\x4b\xe6" + + "\xef\x4d\xaa\x61\x17\x5a\xd8\x55\x49\x82\x5e\xf9\xf6\xaf\x63\x85\x4f\xb9\x15\xdc\x7d\x84\xa5\x47\x9b\xe4\x38\xc8" + + "\x90\xf4\x7f\x4e\xde\xbe\x71\xaf\x64\xdf\x0f\xa5\x9e\x90\xd4\x84\x41\x66\x2b\xce\x65\xb5\x36\x4e\x57\x85\x52\x56" + + "\x09\xba\x54\xd1\xf7\x14\x93\x34\x20\x3d\x66\x92\x89\x7c\x7b\x6b\x0f\xb7\xfd\xc5\x68\x3d\xc2\x48\xe6\xc8\xe8\x4e" + + "\x1d\xfe\xd8\xed\xb3\xd7\x71\x7f\x75\xc0\x56\xfa\x9e\x51\x79\x57\xea\xe6\xc6\x5f\x04\xf1\x4b\xe1\xcf\x9f\x76\xb4" + + "\xc1\x5c\xba\x54\xd9\xb4\xda\x93\x76\xe2\xf0\x03\x51\xbb\xa7\x7c\xdd\x6d\x70\xed\xbe\x5a\xfc\x22\x2c\x13\x86\x1f" + + "\x20\x81\x7d\x03\x52\xba\x6e\x5c\x00\x36\x5c\x05\x40\x71\x81\x88\x0b\xa2\x8b\x12\x13\x04\xe5\xd2\x69\x25\x90\x30" + + "\xb8\x98\x48\x41\xe3\xaa\xf0\xb7\x27\x45\x26\x41\xb4\x56\x6d\x08\xce\x4e\xa5\x66\x59\x99\x09\x6b\x89\x3e\xfc\x2b" + + "\xf3\x07\x4b\xf2\x49\xf3\xf7\xe1\x77\x4d\x20\xd4\xbb\x71\x02\x6f\x4f\x7c\x10\x8f\xa3\x5b\x95\x93\xc9\x9e\xa2\x9c" + + "\x41\xb9\x2e\x1c\xc2\x37\x3e\xb5\xd4\xb6\x26\x42\xe7\xc8\xaa\x4f\x7f\x75\x18\x58\x69\x61\x0d\xbd\xf9\xfb\x0e\x71" + + "\xae\x05\x18\xda\xef\x20\x82\xb8\x99\x66\x7c\x5a\x45\xa2\xaa\x8d\x89\x36\x76\x76\xd4\xb6\x9f\xc6\x99\x3f\xe8\x09" + + "\x9d\x1e\x4b\xac\xeb\x24\xf0\xe7\xb6\xbc\x2b\x0c\x35\x42\x89\x69\xb1\xaf\xcc\x2d\x87\xe9\xf6\x0f\x0e\x76\xc5\x8b" + + "\x77\x56\xe6\x81\x79\x73\xf8\xfc\xb4\xe7\x80\x08\xf7\xee\x1f\x3c\xf9\xea\xeb\x27\xce\x8f\x1b\x81\x7a\x6c\x79\x0e" + + "\x86\xf5\x61\x96\x74\x55\xf9\xb7\x43\xba\x5d\xb7\xc4\xb7\xc0\x74\x13\x94\x7a\xcf\x5d\x6b\xe8\x48\xb2\x1f\x86\x95" + + "\x52\x7d\x6d\x59\x49\x80\xcd\x7e\xde\x0f\xc2\x2d\xe3\x2b\xdf\xef\x1b\x8f\xd2\xda\x05\x04\x44\x3f\x3e\x0a\xaa\x8e" + + "\x2b\x52\x6f\x5a\x91\x81\xf4\xc7\x8d\xa5\x8b\x90\xd6\x4a\x85\x12\xba\xd6\x30\x20\x65\xb4\xfd\x62\x95\x59\xe4\x57" + + "\x13\xe0\xb5\x42\xbc\x62\x47\x64\x5a\x78\x69\x60\xac\x99\x90\x2d\x3f\x76\x39\xa2\x33\x55\xa0\xe0\xd6\x0d\x61\x30" + + "\xcc\xc6\x0f\x84\x28\xfb\x27\x73\x7d\xab\x34\x7b\xcf\xdb\x86\x18\xc7\x31\x44\xc6\xc7\xb4\x35\x56\xd2\xa6\xe4\x0e" + + "\x7d\xd6\xb1\x81\x6a\x9a\xbf\xef\x91\xe6\xbb\x42\xf1\x17\xac\xa1\x3e\x5d\x82\x5e\x2e\x8d\xae\x6a\x54\x57\x12\x45" + + "\xe8\xb3\xb2\x9c\xab\xf8\x07\x8c\xe6\x1f\x1e\x0e\x15\x78\x3c\xdb\x92\x3b\xed\xa0\x62\x43\x95\x78\x3b\x23\x1b\x90" + + "\xee\x3c\x57\x95\xa9\x57\x39\x58\x40\xff\xe1\x3e\xfc\x07\xf0\xbc\x31\x51\x22\x6d\x97\xfd\x8a\x6b\x80\x74\x8d\xd0" + + "\x75\x70\xcb\xb1\x5c\x2a\x04\xd3\xd9\x43\x63\x1b\x46\xad\xae\x4e\x95\x46\xb2\xec\xac\x06\x0b\x9d\x92\xd6\x24\xc8" + + "\x3d\xd7\xa1\x48\x0d\x54\x3f\xcf\x7c\xb5\x33\xd3\x44\x9c\x2a\x01\xe4\x6e\xf1\xe0\x48\xd2\x07\x1d\x4a\xbd\x97\xd5" + + "\x77\xd1\xb7\x60\x63\x09\xf6\xb6\x3b\x6b\x56\xfb\x54\x88\xa4\x75\xff\x46\x57\x61\xd7\x65\xbf\x72\xec\xf3\x6d\xdd" + + "\x75\x5b\xf6\x7f\xa0\xcf\x09\x3b\xae\x26\x9e\xbf\xcb\x0a\x57\x12\xa5\x82\xc9\xaa\x6e\xca\x85\x14\x0e\xda\x93\x2c" + + "\xc9\x17\x77\x78\x20\xfb\xf6\x1f\xea\xfb\xcf\xec\xbf\x5b\x19\xd0\xf2\xcd\x75\x45\x46\x0c\xd7\x7f\xe6\xab\x41\xe9" + + "\x43\xba\x1e\xe1\xdf\x2e\x83\x6c\x4f\x04\x5f\xcb\x2a\xc5\xdb\xe8\x94\x47\xce\x13\x3b\x1f\xa1\x9b\x35\x1a\x02\x21" + + "\xe2\x82\x53\x2a\x97\x2e\xe2\x74\xcb\x49\x5c\xc0\x88\x2d\xb2\xd9\xbc\x79\xc0\x9c\x16\x56\x00\xdb\x43\x7b\x1d\x60" + + "\x0a\x32\x13\x7e\xcc\x44\xac\xbd\x45\x90\xf8\x05\x5b\xc4\x77\x95\xd2\x30\xb7\xe5\x3a\x14\x0f\xcb\x25\x20\x00\xa2" + + "\x92\xbc\x74\x9f\x61\x77\xd8\x13\x02\x2e\x20\x02\x91\x49\x75\x3d\x47\xbf\x15\xd1\x4f\x40\xc9\x1e\x86\x5a\x4a\x18" + + "\x1f\xda\x1c\x96\x4b\xe7\x85\x2c\x04\xf1\xe1\x70\xf8\xf0\x16\xd2\xef\x77\x50\xa8\xeb\x87\x16\x1e\x0e\x87\x43\xf5" + + "\xaa\xa0\x13\x56\x9b\xd0\xae\x20\x26\x58\x7d\xd0\x80\xbd\x98\x5f\x7f\x70\x1f\x93\x9f\x99\x1d\xc7\x20\x80\xc8\xcb" + + "\xeb\x78\x25\xa7\x50\x95\xfb\x72\x55\xb0\xb0\xc3\x53\x33\x0c\xf5\x97\x8e\x3f\x48\xf6\x12\x44\x92\xdf\x3b\x60\x8c" + + "\xd1\x8d\xbb\x7d\xd3\xcd\xd7\x72\x37\x0c\xee\xc1\x01\x25\x36\x26\xc7\xda\xae\xf0\x4d\x2e\xe2\xef\xfb\x5b\xe5\x0c" + + "\x61\x7d\xb8\xfb\xbe\x6e\x8b\x20\xf1\x8d\xfd\xb1\x15\x14\xd6\x96\xda\xfe\xb9\x32\x2b\xd3\x66\xd5\x2d\x3b\x11\xca" + + "\x03\x76\xf7\x43\x61\x29\xf1\x07\x39\x7f\xc8\x39\x8b\x50\x21\x6f\x6e\x54\x32\xbd\xb2\x0c\xc8\xae\x4a\xe0\xc3\x04" + + "\x67\x11\x7e\xf3\x19\x8a\x59\xd7\x86\xfd\xee\x1c\x71\x58\xda\xbd\xb1\x5a\xaa\xd4\xe0\x87\xe7\xd7\x96\xc6\xa3\xed" + + "\x6b\xd5\x28\x48\x13\x8d\x09\x1c\x39\x53\x3d\x44\x16\x6b\x95\x97\xe5\xc5\x6a\xe9\xef\xbd\xd0\x9e\x8f\x9e\x30\x58" + + "\xa5\xcf\x9a\xe0\x2c\x21\x54\xd8\x6f\x91\x76\xaf\x43\x79\x08\x27\xac\x95\x85\xd1\x16\xdf\x18\x84\x08\x75\x12\x22" + + "\x95\x74\x6d\x08\xb0\x59\x69\x23\xb8\x9e\x9e\x9e\xc5\x61\x5c\x34\x33\xdd\x8b\xc8\x43\xa0\xc5\x91\x4b\x73\xe8\x9d" + + "\xcb\x78\x74\xd4\x7f\xf8\x33\xac\xc5\x21\x0d\x55\x8d\xc3\x8b\xc3\xfe\xcb\x3c\x69\xe0\xe9\x8b\x8f\x09\xee\x15\x9f" + + "\xcf\xcb\xf2\x42\xf8\xf7\x7d\x80\x22\xdf\xdb\x87\x5d\xad\x14\x98\xf5\xb2\x4d\xf9\x39\x19\x88\xe9\xe8\xa0\xc7\x3d" + + "\xb8\x27\x03\xa7\xd4\xf4\x8a\x46\x07\x50\x27\xf0\x33\x1d\xb0\x2f\x0f\x81\x2c\x93\xe3\x08\x06\x84\xd7\xa6\x68\xb2" + + "\xc2\xe4\xf7\x84\x33\x31\xb0\xd4\x59\xe1\xb0\x99\xbc\x77\x71\x6b\xc0\x87\xf1\x44\x11\xf4\x61\x97\x7b\x32\x6f\x72" + + "\x84\x9c\x6d\xf5\x00\xb3\x55\x62\x1c\x47\x30\x14\xe0\x6d\xce\x0d\x6b\xa9\x46\x23\xa5\x57\x4d\xb9\xd0\x4d\x36\x81" + + "\xfb\x98\xc7\x29\xc4\x4f\x0f\xd4\x7a\x25\x60\x50\xb1\xe7\xab\x02\xfb\x1e\x0d\xb1\x75\x51\xa3\x9e\x76\xb5\x24\x20" + + "\xf8\xba\xa1\xee\xd4\x4d\xb9\x14\xf1\x09\xde\x1e\x00\xcb\x0e\x38\xc6\x14\xc3\x2c\xdd\x99\x07\xaa\x00\x60\x37\xdc" + + "\x1b\xed\x14\x1b\xdb\x72\xb3\xed\xec\x70\x39\xea\x3a\x56\x0d\x0c\x37\x00\x58\xf4\xba\xa2\x1b\xed\xdd\x67\x2f\xd9" + + "\x22\x35\x98\xf5\x7d\xb9\x3a\xcf\x41\xdd\x5f\xd4\xab\x05\xf2\xd0\x7b\x6a\x66\x0a\x53\xe9\x06\x52\x6f\xf9\x8d\xe9" + + "\xd2\x6f\x95\x95\x43\x8b\x97\x08\xbd\xe8\x0a\x29\x76\xf2\xed\xe7\xcf\x9e\x32\x10\xce\xf0\x29\xd3\x44\xf8\x12\x09" + + "\x63\x4b\xe1\x12\x33\xcb\xa1\x86\x2c\x24\x3f\x70\x59\xe1\xcc\x10\xfa\xe3\x1d\x40\x64\x1b\x20\x5c\x36\xa9\x65\x4e" + + "\xc3\x6e\x27\xd8\xa5\x33\x2f\x1a\x76\xdd\x37\x9d\x7a\x9b\x16\xad\xea\xbe\x6a\x6a\xd3\x34\x60\xf1\x79\xd4\xa1\x61" + + "\xde\x0c\xec\x4b\xfc\x99\x2d\x70\x28\x2f\x25\xa2\x77\x18\x57\xd5\x98\xaa\xe3\x50\xb6\xee\xef\xa7\xdc\x89\x48\x86" + + "\x0e\x89\x24\xe5\x55\x0e\xc8\x50\x14\xab\xdd\xd6\xdb\xfb\xec\x64\xa4\x0d\xbe\x8d\xdf\xdd\x4c\xa0\x29\x6f\xa6\x98" + + "\x40\xc9\xa2\xb9\xfc\x0a\x78\x72\x9c\x67\x24\x7c\x1c\x10\xd4\x80\x1e\xfb\x4a\x63\x25\x54\x48\x44\x76\x76\xb0\xa6" + + "\xd3\xfd\x33\x5c\x8b\x2e\xfa\xd8\xa6\xd9\x51\xf5\x31\x5b\x85\x16\xc9\xf6\x8d\x26\xcf\xd2\xdd\xbc\xd1\x9d\x8d\x8a" + + "\xc6\x80\xaa\xfd\xf7\xa7\xb6\xc7\x15\x8a\x7b\x74\xe0\x4c\xc5\x1f\xc9\x69\x3f\x44\xda\x72\x40\x48\x10\x48\x03\x15" + + "\x70\x4c\x98\xa9\x1a\x9d\x61\x9e\x6b\xfc\x52\x57\x06\xb4\x08\x56\xb8\xea\x4d\xaf\xec\xa5\x65\x89\x0e\x34\x77\xee" + + "\x52\x9c\xf4\x21\x95\x56\x0b\x62\x0b\x37\x82\x00\xda\x02\xd8\xc4\x05\xb9\xd9\x22\x9c\xcc\x11\x84\xa7\x33\x14\x41" + + "\x57\x3c\xa8\xd7\x92\x82\x46\xef\x88\xd3\x15\x92\xf6\xb0\x95\x1b\x95\x11\x10\xba\x2e\x6c\x0f\x1a\x82\xad\x4b\x8e" + + "\x2a\x95\x80\x6e\x18\xa8\xcc\x8d\x5a\x7a\xe3\x3a\xd0\x32\xc3\xff\x2e\x82\x60\x67\xa3\x83\x1e\xb4\xed\x1c\xb7\x70" + + "\x48\x5d\xb6\xfd\x66\xb1\xec\xe6\x61\x6d\x9f\x41\x83\x39\xe8\xa2\xf4\x3c\x16\xec\xfc\x62\x09\xde\x6e\x8b\x25\x5e" + + "\x64\x7e\x72\x60\xb6\x28\xac\x1f\xda\xa2\x9b\x0e\x20\xc9\x1d\x06\x5e\xe4\x45\xc0\x2b\x41\x57\xa1\x44\x8a\x68\x47" + + "\x49\x3a\x32\x0d\xbe\xd8\xc5\x6a\x01\x69\x99\x4e\x77\xf7\xce\x8e\x7b\xc7\xe3\xf7\xe9\xc3\xf7\xc3\x9b\xfe\xfb\x74" + + "\xb7\x77\x3c\x3e\x35\x2f\xcf\xe0\xc5\xfb\x74\xf7\xa6\x3f\xea\x0f\xeb\x72\x55\x4d\x8c\xb3\xcf\x4f\xea\xfa\x25\x18" + + "\x79\xc1\x47\x24\x79\x57\x2e\x93\x81\x4a\x7e\xb2\xc2\x9f\xfd\xf1\x6d\xd9\x34\xe5\xc2\xfe\xfa\xc1\x4c\x9b\x84\x9c" + + "\xa0\x40\x39\x5f\x7f\x9f\xa5\xa9\xe9\x8a\x0e\x33\xb9\x70\x87\x75\xe5\x50\xa0\x3c\x37\x1c\x80\x0c\x7c\x10\x6e\xe0" + + "\xfb\x98\xbd\xcb\x55\xc4\xde\x9b\x00\x04\x0d\xe9\xa3\x6a\x33\x10\x49\x52\xd1\xc5\xa8\x36\x93\x52\x40\xdd\xde\xfb" + + "\xcc\x99\x07\x4c\x6e\x37\x81\xfd\x43\x4e\x26\x6b\x2b\xfd\xc5\x9b\xa4\x59\xbd\xcc\xf5\x35\xeb\xa1\x93\xa2\x2c\x4c" + + "\x02\x01\x45\xad\x34\xc7\xa0\xc4\x07\xbf\x88\x17\x2e\x22\x5f\xd8\xb7\xdc\xbc\x54\x10\xa2\xaa\xcf\x73\xd2\xf6\xab" + + "\x1e\x98\xb5\xe1\xe9\x79\x79\x75\x53\xe9\x34\x2b\xfb\x7f\x18\x65\xde\x09\x22\x26\x81\x80\x46\x49\xa9\x79\xed\x3e" + + "\xe5\xc0\x5f\xf4\xaf\xe1\xe6\xbf\xa3\x12\x74\xe8\x53\xf0\xc0\xe0\xcf\x86\x7a\xb9\x34\x45\x0a\xe9\xe9\x7a\x71\x0d" + + "\x2f\x71\x22\x7b\x76\xfc\x97\x60\x62\x80\x1a\xb2\x62\xb9\xea\x68\xcf\x97\x86\x02\x09\x5f\x2c\xa3\x91\xba\x7f\x70" + + "\xf0\xe8\xe0\x4b\xb5\xc7\xa1\x52\x90\xc2\x99\x62\x74\x1d\x2a\x05\x7a\xf2\xd4\x22\xe0\x1c\x0a\x80\x97\xa9\x37\x92" + + "\x4b\x53\xc5\xcf\x10\x66\x5c\xdb\x5a\xd5\xb3\xe5\xb2\x56\xbd\x9f\x7f\x7e\xd6\xc7\x42\xff\xb0\xd5\xfd\x03\x74\xbc" + + "\xff\xb0\x47\xf4\x1f\xa8\x7f\xb0\xb2\xbf\x33\x6f\xc3\x6d\xf9\xf3\xcf\xcf\x20\x4d\xee\x72\xd5\x04\x2f\x7b\x2a\xb1" + + "\xdf\xd9\x2d\x0d\x4b\x41\xa7\xba\xb3\x20\x75\xd4\x96\xe5\x9f\xb7\x94\x06\x57\xbb\x81\x4a\xfc\x14\xa5\x96\xd5\x93" + + "\x0b\x81\x53\xec\x27\xd0\x0d\xf9\x44\x4f\x75\x95\xa9\xcf\x87\x07\x03\x95\xbd\x3d\xc1\x1f\x1c\xbd\xf2\x64\x78\xe5" + + "\xff\x78\x34\x7c\x8c\xdf\x96\x61\x88\x1a\xd8\x92\xf3\xb2\xf0\xd3\x8b\x38\x7d\x93\xb2\xaa\xcc\xa4\xc9\xc1\x39\x4c" + + "\x26\x7c\x26\x77\x94\x21\x14\x7f\x0e\x5f\x1e\x29\xdb\x63\xa8\xe5\x4d\x99\x1a\x86\x1e\xe9\x78\x62\x05\x08\x18\xd3" + + "\x90\x5a\x73\x43\xf2\x56\xef\xc6\x5c\x35\xba\x32\x1a\x95\xf8\x7c\x00\xfa\x7c\x0f\x02\x40\x0e\x01\x55\x2e\x4d\x95" + + "\x5f\x63\xf7\xd3\x68\x66\x5e\xbd\xfc\x7a\x8f\x6d\x57\xb6\x77\x59\x51\x98\xea\xfb\x77\xaf\x7f\xb0\x8c\xe1\x53\x6e" + + "\xe3\x9b\xab\xa7\x23\xf7\x1b\x98\x45\x1e\x5e\x51\xc2\xd8\x9e\xd3\xa4\x1c\xa9\xed\xed\xee\x41\xfa\x21\xc9\x0e\x42" + + "\x16\xbc\x1e\xd3\xda\xba\xa9\x3c\x1f\xe8\x32\x3a\x85\x99\xf9\xed\xff\xb8\xf1\x69\x39\x59\xd5\x59\xf1\xed\xea\xfc" + + "\x1c\xe1\x8f\x93\xb2\xa0\x67\x89\x5d\x0f\x0c\xa8\xa7\xcf\x2e\x75\x75\xef\xb3\xad\xea\xc2\x5c\x43\x74\x3d\x38\xc4" + + "\x5c\x98\x6b\xf2\x7b\x29\x57\xb5\xf1\xcf\x7b\xc7\x63\x78\x72\x03\x7e\xb8\xa6\xba\x21\xa8\xae\x85\x29\x56\xfd\x9b" + + "\x49\x9e\x4d\x2e\xf0\x3b\x68\xed\x75\x59\x2d\xe7\xfc\x1d\xb5\x0f\xff\xdc\xc0\x7f\xcb\x55\x73\x9e\xaf\x2a\x76\xb1" + + "\xb1\xa3\x02\x95\xe5\xd2\xb9\xe5\x9c\xfe\x7d\x78\xf6\xb0\x6f\xef\x96\x61\x6f\xb8\xdb\xbf\xe9\xff\x61\x14\xba\xdc" + + "\x20\x89\x7d\x57\xad\x0c\xd1\xb0\x30\xf1\xfb\xc7\x8e\xc2\x90\x1b\x27\x2c\xcd\x19\x6c\xc2\xe2\xb5\x9e\x9a\x67\xe0" + + "\xe5\xce\xa4\x08\x3f\x72\x0e\x29\x7c\x59\x3a\x80\x04\x59\x18\xa8\xb3\x0f\xe5\xaa\x40\x22\x50\x1f\xc3\xac\x7a\xdf" + + "\x03\xb6\xa0\x40\x68\xb1\x14\x64\xa1\x0b\x3d\xcb\x8a\x19\x41\xa9\xa8\xbd\x3d\x90\x49\x97\xba\x6a\x38\x7f\x14\x89" + + "\xa4\xb0\x04\x53\x3d\x31\x43\xcc\x2f\x57\x95\x4b\x82\x30\xd3\x85\x7a\x99\xae\x75\x95\xd6\x0f\x14\xc3\x26\xa8\x3c" + + "\x3b\xaf\x34\x85\x3b\x41\xb4\x3d\xd5\x96\xa5\x46\x63\x9a\x3a\x1f\xbe\x6b\x68\xc9\x51\xe1\x30\xcb\xcb\x73\x9d\x8f" + + "\x31\x84\xb0\x9d\x11\xda\x4b\xae\xf5\x80\x21\x55\x38\x86\x2b\xcc\xf7\xc9\x0c\x26\x16\x7a\x7b\xfe\xcb\xab\x62\x80" + + "\xe3\xc4\x20\xa3\x81\x67\x3d\x71\xf4\x03\xd5\x0c\x7c\x69\x52\x28\x2d\xcd\x24\xd3\xb9\x6b\xca\x89\x33\x6e\xf7\xd4" + + "\x56\x02\xcf\x66\xf6\x26\xf4\x9c\xe9\x0b\xa1\x86\x0f\xd9\x2f\xe9\x91\x8e\x49\xe4\x31\x69\x03\xaf\x40\x53\xaa\xa2" + + "\x84\xcf\xad\x38\x64\xae\x9a\x11\xc1\x7e\x50\x38\x68\xef\x7c\xd5\x50\x4c\x05\xba\x05\xb3\x83\xfd\xbd\x20\xd1\xf9" + + "\x0b\xa9\x4c\xec\xc4\xed\xb1\x82\x37\x24\x62\x2a\x30\x8d\x7d\x56\x88\x60\x6b\x48\x03\xe6\xec\x39\xf6\x5d\x9e\x99" + + "\x15\x2f\x22\xcd\x85\x6b\x91\xfe\x1e\xce\x23\xbc\x1d\x31\xf3\xea\x88\x4b\x1d\x8a\x57\x95\x7b\x0c\x85\x86\x41\x11" + + "\x91\x51\x55\x96\xe1\xc7\xd1\x70\x04\x4d\x66\x5c\x25\x6e\x03\xe3\x4b\x29\xb7\xcf\xab\x17\x03\x84\x1a\x83\x34\x6b" + + "\x45\x3a\xe2\x3c\x66\x8d\x77\x4f\xc2\x69\xe4\x51\xcd\x56\x59\x1a\x0d\x89\x1e\x3a\xe1\x64\xc6\xd1\xa4\x01\x30\x52" + + "\x91\x11\xf8\x01\x9e\xd2\x07\x35\x41\x9e\x58\x0a\x3b\x69\x40\xf4\x2d\x52\x70\xd0\xf4\x1b\x59\xa8\x89\x5d\x5a\x75" + + "\xdf\xa5\x1e\x6d\x12\x74\x03\x81\x38\x56\x7c\xe2\xe5\x96\x4d\x25\x82\x10\xc9\xb0\x3e\x82\x85\x11\x9f\x60\x77\xa2" + + "\x4a\x37\x15\x0b\xb9\xe3\xc0\x44\xfb\x02\x3d\x77\xd1\x6b\x0d\x59\x59\x9c\x02\x90\x2e\xe5\xf1\x67\x20\xa6\x1e\xd8" + + "\xb6\x5d\x05\x98\x16\x91\x33\x62\xc6\xc8\x3e\x5a\x2d\xf5\x0c\x2d\xe6\x2b\x00\x76\x61\x43\x29\x53\x66\xbc\xbb\xc8" + + "\xde\x6d\xc5\xaf\xe0\x72\xf3\xc0\x83\x41\x17\x28\xde\xc6\x00\x16\x88\x73\xcb\x0e\x4a\x5a\x9e\xda\x52\x5b\x06\x21" + + "\x47\xa2\x14\x82\x5f\x46\x39\x37\x3e\x46\xbb\x83\x66\xd3\xb9\x4b\xd0\x2a\xf9\x98\x88\x73\x40\x25\x65\x4f\x72\x20" + + "\x78\xce\x78\x01\xc9\x28\x92\x44\xf5\x37\xb9\x86\xdb\x97\xa8\x87\x6f\xe8\x0e\x0f\x1c\x6a\x58\x60\x6c\x5a\x02\x63" + + "\x78\x33\x0e\xcd\x95\x99\x50\x93\xa7\xcd\x19\xfb\x9d\x07\x92\x2a\x13\x3f\xdb\xce\x62\x79\x7a\x40\x6f\x3d\x7d\xc4" + + "\x5e\x2f\x96\xa7\x8f\xce\x5c\xb7\xeb\x65\x9e\x59\x76\x7b\x08\x7f\x94\x55\xd3\x8b\x3c\x2a\x2a\xa3\x1e\x2e\x56\x75" + + "\xf3\x10\x02\x6e\x99\xe6\x96\x44\x2c\xc1\xdb\x9e\x1b\xd8\x83\x40\x07\xa6\xcf\x5e\x7a\xdd\x96\x2a\x12\xc4\x39\xcd" + + "\x0a\xc6\x23\x15\x5a\xe3\x57\x53\x86\x22\x02\xcb\x5d\x0d\x39\x56\xb0\xc1\x15\xfb\x3b\xe3\x2d\x10\x02\x79\xb1\xc6" + + "\xca\x38\xff\x46\x52\x93\xb8\x5b\x43\x80\x0e\xc0\xb6\xa1\xc7\xa4\xab\x24\x5f\xf7\xc3\xa0\x27\x8e\xe8\xd1\xe6\x19" + + "\xf8\x38\xb9\xa8\x17\x7a\x99\xb1\x42\x85\xc3\x13\x08\xc7\xd8\x75\xc3\x19\xbc\x5c\xad\xc7\x5c\xc9\x30\x35\xb9\x99" + + "\xe9\x06\x25\xb8\xb1\x7b\x7c\x9e\x15\x29\x62\x4b\xd8\xde\x91\x5a\x82\xfb\x47\xc0\xb5\xdc\x0f\x17\xf9\x84\xd1\x97" + + "\x95\x01\x07\xd0\x7f\x73\x0e\x1c\xa9\x07\xb6\x59\xd7\x35\x5b\x5e\xe3\xd9\x0f\x6f\x18\x89\xef\xe0\x54\xb9\x34\x05" + + "\x63\x9c\x27\x7c\xc0\xdb\x75\x1c\xdd\xda\xe4\xaf\x27\x9c\x80\xa8\xa1\xb1\x23\xce\xf8\xd8\xd2\x7a\xf7\x0c\x28\x3f" + + "\x03\xa4\xd3\x24\x8f\x7d\x82\x6e\x7c\x61\xa5\x37\x86\x00\x1d\x07\x79\xc0\x3d\x24\x45\x85\x27\x79\x28\xcb\x92\xc3" + + "\xae\xe7\x6a\xb8\x3e\xde\xf9\x63\xc1\x85\x0c\x7f\x29\xb3\xa2\x97\x0c\x13\x74\x67\xfb\x38\x90\x97\x66\x60\xb1\xf4" + + "\xf7\x52\x00\x4b\x47\x46\x28\x06\x14\x0d\x6e\x1f\xbe\x2e\xdc\xce\x3f\x22\x7a\xc5\xcb\x28\xf4\x66\x1b\xcb\xc8\xc4" + + "\x4e\x5c\xc8\x6d\xc3\xe7\xa4\xfc\xdb\x97\x0a\x62\x70\x8d\xb6\x67\x30\x46\xe3\x62\x38\x89\xe0\x44\xd4\x6e\x28\x51" + + "\xf2\x5c\xaf\xe8\xe3\x5d\x5e\x9b\x66\xb5\x84\x8c\x3f\xf2\x41\x60\xfb\x41\x8e\x52\x72\x79\xf2\x12\x94\x19\x31\x85" + + "\xf3\xa2\xf3\x84\x6c\x75\x58\x38\xff\x75\x16\x60\xe5\x68\xc0\x9f\x4a\x7c\xb1\x38\xc5\x8f\x0b\xf6\x01\x20\x7c\x1a" + + "\x86\x4e\x85\xd7\x80\x78\x18\x8c\xcc\x9f\x99\x48\x7d\xbe\xed\xde\x0c\x3b\x79\x1f\x71\xdc\x86\x11\x1f\x24\xff\xec" + + "\xf4\x1a\x64\x4c\xd6\x32\xe2\x88\x78\xc9\x30\x15\x0e\xef\x86\x1a\x05\xf9\xb2\x10\xbb\x2f\x4e\xe6\x2f\x36\x11\xa7" + + "\xa4\xeb\xde\x55\xbb\xbb\x00\x21\x13\x0e\xbb\x65\xec\x76\xdf\xa2\xb9\xbb\x5d\xda\x0f\xe4\x4f\x41\x6e\x6b\x74\x84" + + "\x73\x3b\xf0\x12\xce\x55\x85\x3e\x3b\x96\xd1\x1c\xa0\xff\x1c\xb2\x3d\xcb\x26\x5b\x64\xbf\xfa\xb0\xb6\x80\x34\xa2" + + "\xe4\x23\x8e\x4b\x04\xbd\x25\x01\xe3\x41\x64\x70\x8c\x51\x59\x61\xfc\xed\x94\xfb\x01\x8a\x47\xef\x45\xd8\x19\x51" + + "\xda\x2d\x49\x39\xda\xa5\x16\x7a\xb9\x34\x70\x19\xd4\xa1\x40\xf5\x0b\x4a\x3c\x30\xb9\xff\xab\x42\x54\xec\x91\x4f" + + "\x6e\x33\x9b\x24\xac\x48\x1a\x02\x0c\xa5\xbb\x19\xe8\x4e\x61\xe9\x6d\x31\x41\x95\x9b\xb1\xf3\x6e\x3b\x3f\xf4\xea" + + "\x03\x32\x90\xd4\x87\xb8\x72\x84\x12\x52\x2e\xb2\x86\xc0\x08\xfe\x3f\xc5\xbc\xfd\xb9\xb0\x3c\x84\xbf\xb0\x6b\xd5" + + "\x2b\x0b\x42\x47\xe1\x6a\x41\xce\x61\x18\x81\xbe\xe3\xa3\xfc\x6e\xed\x66\xe1\x10\xff\x02\x9e\x65\x05\xd7\xde\xb2" + + "\xe4\xe1\x61\x0a\xcd\xc3\x64\xe9\xc0\xb9\x50\x8d\x3a\xeb\xdc\xf1\x1d\x5e\xcf\x1b\xd8\xc6\xdf\xc9\xdc\xfc\x07\x79" + + "\xb1\x5b\x6f\x58\xb9\xc0\xb0\x23\x68\xe5\x76\x76\x20\x30\xf1\x27\x33\x7b\x79\xb5\xec\xa9\xa4\xf7\xf7\x9b\xf7\xef" + + "\x87\xfd\x44\xed\xb6\x39\x88\xf7\xef\x87\xbd\xe3\xf1\xf0\xe1\xfb\xf7\xc3\x9b\x7e\x02\xde\x51\x3d\xfb\xfb\x0f\xfd" + + "\x24\x60\x23\x28\xd7\xa3\x8b\x7e\xf5\x60\xbc\x5b\x8e\x3a\xd8\xf9\xf1\xb7\x43\xdd\x19\x90\xfa\x8b\x0c\x48\x95\xfc" + + "\x1c\x7f\x75\xaa\x7e\xf1\x59\x66\x70\x5f\xf4\x02\xe2\x74\x73\x23\xf6\xf1\x91\xd0\x16\x0c\xdd\x63\x4b\x2b\x68\x97" + + "\x78\xc9\xde\x7e\x18\xde\x63\xc1\xc7\x74\xf7\xc9\x0f\xed\xa4\xda\xa5\x58\x2c\x89\x37\xf3\xa5\x3d\x39\xe8\x47\x1f" + + "\xb9\x05\xb7\xfc\x86\xd3\x69\x04\x4d\x6d\x2c\x92\x3c\x7c\x08\x86\xec\x8e\xa2\xfd\xd6\xbd\x2c\x6e\xc2\x5f\x38\x31" + + "\xab\xe4\x4c\x3a\x2b\x71\x6c\x49\xf7\xe5\xe9\xf3\xa2\x7e\x94\x55\xf1\x16\x25\xe5\x89\xa8\x26\x7c\x73\x0b\xe3\xb1" + + "\x99\xa5\xf1\x9b\x0b\x3c\x5f\xb2\x49\xc4\xa9\x02\x8f\x4a\xae\x51\xa9\xaa\xcb\x85\xe1\x14\x9f\xa9\x15\x11\x17\xe8" + + "\x45\x4f\x67\x04\xfc\x7b\xb9\xda\x9e\xbe\x2c\xb3\xb4\x56\xcb\xb2\x31\x45\x63\x0f\x30\xd0\x74\x5b\xb4\xae\x39\xc9" + + "\x72\x59\xa8\x74\x05\x91\xe9\xd0\x84\xce\xed\xbd\xda\x2d\x01\xf6\x3d\xa9\xf2\x7b\x7e\x67\xc7\xed\xb0\x76\x44\x4d" + + "\xc8\x87\x36\x46\x57\x69\xb9\x2e\x24\x2b\xca\xcf\x42\x4f\x24\xc9\x87\x46\xea\x97\x6e\x5e\xd4\x81\xc4\x3a\x98\xe7" + + "\xd0\x13\xb0\x55\x4b\xec\x46\x4d\x2e\x52\x21\x85\xe9\xc4\xf3\xfa\xc9\x3b\xa9\x71\x30\x2d\xc3\xc2\x16\xa5\xca\xcb" + + "\x62\x66\x2a\x60\x85\xee\x7d\x76\x2b\xe6\x92\x23\xe8\x51\xd4\x76\xd4\x55\xec\xc3\x26\x47\xa0\x04\x6b\x49\xda\x68" + + "\xf2\xa4\xde\x09\x58\xa0\x4b\xb0\x71\x22\xaf\x8f\xdf\x97\x45\x7e\xfd\x3d\x6f\x9e\x80\xed\xc9\x06\x6a\xb2\xaa\x90" + + "\xe1\x51\xe7\x60\xee\x78\x87\xf2\x77\x81\x53\x3a\x27\xb6\x9d\xd9\x1d\xcf\x15\xfd\xa8\xc1\x1f\x11\x9d\x06\xc0\x4d" + + "\x8a\xf1\xc4\x29\xba\x8b\x6e\x87\xb9\xae\xdf\xfa\x95\xc7\xce\xa1\x29\x0f\x22\x36\x49\x4d\x85\xb7\x04\xbe\x6e\x5f" + + "\xd7\x9d\x75\xb8\x12\xb2\x22\xcf\x29\xe0\x8d\x6e\x85\x47\x35\xc6\x1b\xc4\xd6\x3b\x59\x55\x78\x85\x70\xd8\xd9\x51" + + "\xab\xff\xb1\x2e\x3b\x2d\x79\x15\xed\x9d\xcf\x99\x5a\x03\x0d\xf6\xbd\xcf\x36\x86\x8c\x3d\x66\x93\x76\xf8\xf8\xab" + + "\xdb\x79\x33\xb0\xef\x8c\xce\xf3\x55\x65\x8f\xfe\x12\x43\xd8\xc9\x02\x34\x2a\x57\xcd\x21\x3b\x1a\x75\xa5\x15\x5f" + + "\x50\xfa\xf0\xa2\x5c\xbb\x8e\x09\x83\x12\x91\x79\x62\x1f\x36\x68\x0b\x6f\xe3\x1d\x9d\x13\x88\xf7\xfb\xb6\xb3\xfc" + + "\x8d\x0c\x08\x1b\x8d\xd4\x1b\x5e\x8a\x54\x51\xbd\x87\x0e\x6a\x42\x55\x66\x66\xae\x96\x76\x54\x70\xd9\x12\x0d\x62" + + "\x36\x08\x77\x1d\x65\x3b\x09\x76\x02\x34\xeb\x97\x36\xe0\x43\xc4\xb5\x1f\xf8\x85\xca\xe7\xcc\xd9\xd1\x81\xc7\x6d" + + "\xce\xf5\xba\xe1\x8c\x93\xbe\x7a\xaa\xf6\x2d\xd9\x4b\xca\x22\x21\x2e\xeb\xf0\x56\x3b\x03\xcf\x24\xda\x8a\xd8\x91" + + "\xf1\xad\x77\x68\x44\x17\xe9\x42\x0e\xd5\x47\x3d\xb3\xbd\x08\xfe\x3d\x8d\x71\x3d\xcf\x48\x65\x8b\xa5\xd0\x7b\xcd" + + "\x32\x3f\xb2\x49\x96\xb6\x49\x41\x4c\x15\xca\xb0\xb4\x9d\x1d\x7a\xda\x91\x86\xe0\x3c\x6b\x16\xba\xbe\x18\xab\x1d" + + "\x75\x80\xa0\x9d\xba\xc9\x2e\xfd\x9d\x73\xa8\x76\xd4\x23\x78\x41\x9a\xe7\x1e\x79\xf3\x5a\xfe\xb2\xef\x46\x30\xcc" + + "\x6a\xae\xf1\x28\x24\x3b\xc7\xea\x91\x1a\xab\xc7\x87\xbe\xa8\xb4\x55\x76\xe9\x7c\xba\x8a\x7e\xa8\x0c\x4f\x92\xf8" + + "\xfe\xd8\x4d\xc8\xbf\xcf\x0d\xf2\xec\x7a\x60\x66\xbb\xde\xb9\xd1\x05\x3b\xe1\x92\xde\x1e\x11\xca\x30\x20\x1c\xfd" + + "\x82\x55\x65\xf8\x46\x60\x7e\x1d\x42\xcf\x62\xcf\x27\x92\xe1\xf0\xc4\xe9\x6a\x66\x9a\xd0\x28\xc1\x0f\x8f\xbc\x2b" + + "\x8c\x30\x71\x81\xc5\x1f\xd2\xa7\x14\x93\x72\x01\xe8\x71\x1c\xce\xbc\xac\xcc\xd2\x10\xe4\x1c\x51\x49\x38\x70\x8c" + + "\x8b\xe1\xb2\x35\x54\x33\x97\xb8\x3c\xc4\x04\xa0\xac\x90\xd0\x97\x53\x1a\xe9\x19\x4d\x49\xcb\xcf\x9e\xee\x18\x5f" + + "\x4e\xec\xab\x67\x08\xbd\x1f\xea\xb2\x9a\x52\xa5\x95\x5e\xab\x72\xd5\xd4\x59\xca\x39\xcd\x0b\xa4\x9f\xbf\x5b\xfc" + + "\xc0\x69\x0c\x36\xd9\xce\x8e\x67\x39\x68\x1b\xb6\x1f\x85\x06\x0e\xf2\x81\x6d\xb3\x1b\x9d\x74\xd9\xa1\x39\xd3\x98" + + "\x97\x55\xb9\xd4\x33\xc4\xcc\x00\x2c\x0d\x4b\x09\xd2\x4b\x5d\x58\x79\x70\x69\x2a\xf5\xf3\xe3\xe7\xce\x0c\xb2\x34" + + "\x13\xd5\xbb\xff\xf5\xd7\x9f\x1f\xf4\xa9\x3a\x74\x30\x80\x8d\x55\x8a\x8c\x21\x0d\xf8\xe0\x30\xc0\xff\xa1\x5a\x03" + + "\x89\x44\x80\x5b\x54\xa8\xa8\xc0\xa3\x49\xd9\xab\xbc\x77\xff\xeb\x2f\x1f\x3d\xe9\x6f\x9e\x19\xc7\xa1\x15\x25\xb5" + + "\x6b\x1f\x3a\xb6\x05\xbd\x77\x9c\x1e\xc2\xfb\xca\x7b\xb6\x40\x1d\x75\x8b\x77\x81\x24\x47\x09\x31\x5a\xf7\x8d\xa8" + + "\x66\x97\x3d\x3d\xbd\x21\x03\xae\xe5\xc9\xaa\x1a\x2e\x75\x65\x8a\xe6\x4d\x99\x1a\xc1\x97\x39\x40\xf1\xc9\xaa\x82" + + "\xff\xb4\x0a\xfb\xaa\x1c\x73\x42\x5a\x2f\x5b\xba\xef\x9d\xfa\xf0\xcb\x96\xfe\x0b\xd4\xb2\x3a\x4d\x69\xce\x89\x1f" + + "\x9f\x95\x8d\x5c\x19\xd5\x33\xc3\xd9\x70\x80\xee\x04\x6c\xa8\x56\x60\xd8\x68\xf4\x64\x6e\x52\xf5\xe2\xed\x6b\xc1" + + "\x3f\x43\x73\x47\x47\x18\x33\x1b\x3a\xa1\x49\x86\xa3\xbf\xb9\xf3\x56\x2a\x63\xb7\x96\xcc\xac\x59\x50\xc3\x71\xe3" + + "\x8a\xd9\x67\xd4\xe9\x6e\x68\xda\xef\x32\x29\x3b\x94\x85\x20\x62\x76\xcb\xc2\x86\x21\x2d\xb5\x97\x60\x7b\x38\xc9" + + "\xae\x3f\xa7\xd9\xee\xee\x19\x68\xa7\xb6\x99\xd0\xff\xe8\xf7\xfe\x49\x53\x5a\xd1\xb5\x27\xb7\x8d\x60\xec\x8e\x54" + + "\x86\x79\xf5\x70\x90\x62\x27\x10\x2c\x47\x4b\x3b\xd0\xb6\xd3\xd0\xb5\x23\xcc\xf4\x5b\xce\x54\xdb\x8b\x55\x66\xc0" + + "\xd3\x7a\xae\x19\x89\x86\xea\x9f\x4a\x6e\xf3\xac\x43\xd5\x86\xdf\x61\xbd\xa1\xdb\xa8\x93\x4b\x02\xa1\x9e\x49\x09" + + "\x7c\x27\xa3\x89\xc4\xce\x7a\x13\x5c\xa4\x61\xc7\x89\xfd\xd8\xd9\xb1\x35\x9c\xf2\x9f\x67\xed\x76\x9d\xb8\x8c\x2d" + + "\x0a\x3b\x8b\x87\xed\xa6\xad\x1e\x6d\x26\x7f\x09\xdd\xd1\x65\x62\x60\x83\x6f\x3a\x64\x30\x2c\x40\x11\x32\x2f\x70" + + "\x6b\xf6\x3a\x62\xa8\x3e\xfa\x6b\x50\xb0\x58\x11\xc8\xf5\x79\x99\x5e\x73\xb4\x8d\x49\x39\xed\xa9\xad\xd2\xa5\x99" + + "\x4f\x01\x73\x45\xb2\xb2\x6d\xc2\xc6\x3b\x92\xba\xf3\x23\x57\x18\xec\x47\x54\xb2\x38\x22\xf8\x81\x1b\x12\x62\x2a" + + "\x3f\x73\x37\x84\x3f\x8d\xe5\xb2\xd7\x6f\x5f\x16\x5e\x29\xd2\xb1\x1a\x2d\x42\xca\x9c\xa3\xd2\xcc\x5d\xbd\x78\xfb" + + "\x9a\xd1\x43\xe9\x5c\xd2\xd5\xef\x61\xdc\xf4\x82\x5c\x31\xe1\x3f\xba\xf6\xa7\xd7\x47\x9e\x3a\x39\x25\x9c\x3c\x38" + + "\xec\x48\x1a\x30\x3b\xcc\x03\xc6\x53\xa5\x4b\xe4\x52\x57\x99\x06\x0f\xb7\x73\xa3\x7a\xf7\xbf\x38\xf8\x72\xbf\x2f" + + "\xf6\x82\xdf\x9d\x1d\x89\x35\xec\xe8\xdc\xa5\xdc\xff\xc4\xab\x44\xf4\xb6\x32\x7b\x8d\x4b\x81\xa5\xca\xe2\xbb\xb7" + + "\x6f\x89\x28\x81\x7f\xc4\x1a\xfd\x8d\xc1\x6e\xfd\xdd\xdb\xb7\xbd\xbe\xcb\x28\xb5\xe5\x09\x39\xf6\x41\x9c\x1a\xa9" + + "\xce\xb1\x45\x22\x0b\x95\x2f\x1b\xe7\xf0\x96\xfd\xa3\xed\x23\x7a\x48\x38\x8e\x6e\x3d\x88\xb7\xaa\x01\x0b\x71\xed" + + "\xb3\xac\x21\x61\x4b\x21\x19\xd1\xb9\x43\x3c\xdc\xda\x20\x62\x49\x0f\x79\xee\x1f\xf6\xce\x9d\xa7\xcd\x9f\x86\xbe" + + "\x8b\x9f\x3e\xea\x66\xb1\xdc\xa4\xa7\x8a\x43\x68\x24\x29\x90\x58\x40\xe4\x27\xd2\xd2\x39\xf8\x75\x66\xd7\x25\xad" + + "\x1c\xbc\x7c\x20\x1c\x39\x98\x00\x3a\x06\x46\x88\x4c\x52\x18\x0a\x46\x3f\xcd\xae\x7a\x91\xfc\x42\x1a\x8c\x5f\x06" + + "\xaa\x32\xcd\x80\x10\x29\xd2\x96\xa9\x86\x48\xef\x7f\x53\x38\xcf\x29\xa3\xcf\x54\xb3\x3b\x53\x07\x0b\xb5\x74\xeb" + + "\x92\xc1\xf8\x96\x3b\x6f\x19\xd0\x5f\x07\x36\xa3\x8d\x2c\x6e\xfc\x9d\xcc\xaa\xce\x30\x75\xd3\xec\x6a\xcf\xa4\xe1" + + "\x7c\x56\x1a\xa0\xab\x9b\xb9\x46\x22\xd2\xb3\xdb\x11\x5c\x48\xfa\xc1\x14\xdb\xaa\xec\xa8\x4f\xf7\xcf\xf8\x6e\x17" + + "\x42\x96\x63\xe9\x58\xfa\xa0\x7c\x91\x42\xe6\xa5\xa0\x4d\xf3\x82\xf6\x00\x44\x39\x39\x53\x07\xea\xaf\x49\x0c\xb5" + + "\xf2\x48\x6e\x20\x87\xd8\xb9\xce\x72\xcb\x50\xa5\xa6\xce\x2a\xa1\x31\x63\xb2\x2b\x2b\x14\xec\xba\x78\x4c\xcb\x83" + + "\x33\xce\x9b\xed\x77\xb3\xec\xd2\xcb\x22\xda\x13\xc1\x7a\x38\x45\x67\xab\x55\x6f\xed\x93\xb2\xce\x4f\xab\x42\x58" + + "\x79\xc1\xc1\xe0\xd0\x4e\xc8\x35\x98\xcd\xd6\xba\x60\xb0\x84\x65\x20\x2f\x9c\x9b\xc2\x58\x91\x61\x55\x6f\x60\xc1" + + "\x68\x3f\x7b\xb3\x01\xf4\xf6\x14\x92\xe9\x7c\x32\x2f\xe6\xae\x6c\x8a\xa1\x74\xab\x4b\xb5\x0f\x49\xc6\x44\x11\xcf" + + "\x75\xc2\xf7\x42\x9a\x2f\xf8\x1b\x61\xc6\x68\xf7\xe5\xd5\x62\x61\xd2\x4c\x37\xe6\x0e\x06\x51\xa8\x1f\x0c\xfb\xd0" + + "\x01\x6e\x39\x02\x2a\xab\x83\x3e\x9a\x9e\x8b\x52\x1a\xd9\xca\xca\x7d\xfc\x88\x0b\xf0\xdb\x5e\xdd\x57\x5a\xd5\xab" + + "\x73\x06\x6e\xfe\xe7\x4a\xe7\x68\x9f\x2f\x6b\xb4\x69\xce\x0d\x65\x5b\xc4\xf6\x7a\x80\x45\xeb\x00\x93\x65\x53\x7d" + + "\x09\x72\xb0\xdd\xa1\x87\xb8\xb9\x89\x15\x11\x1f\x2a\x73\x87\x0d\xc5\x5f\x84\x72\xab\x49\xdb\xd0\xdb\xf3\x5f\x0e" + + "\x83\x22\x24\xa0\xfb\x1a\x53\x4e\xd1\xb2\x45\x6e\x81\x40\x9c\x7a\xdd\x24\xa5\xc3\x6e\x44\xa4\xa5\xcf\x5a\x72\x67" + + "\x31\x12\x3e\x10\x3e\x11\xf0\x16\x33\x43\x72\xbf\x80\x5f\x60\xdd\x32\xc6\xd8\xbe\x6c\x82\x7b\x20\xfe\x2b\xe2\x49" + + "\x2b\xd3\x74\xab\xfa\xef\x60\x34\xdd\x7b\x7b\xaa\xc4\x3e\x13\x05\x3e\xde\x75\xcd\x05\x34\xad\xac\x9b\x3b\x89\x5a" + + "\x9b\x70\xc9\xaf\xb8\xef\x5d\x2f\xbb\xe8\x57\x47\xd0\xea\x86\x1b\x97\x4f\x5b\x87\x96\x7f\x1e\x68\xf5\xdd\x8d\x48" + + "\xd8\x4c\x60\x07\xfe\xd4\xeb\x30\xf6\x5a\xea\xb6\x9d\x51\x58\xa3\x17\x0e\x49\x59\x75\x28\xc4\xcd\x22\x75\xe4\x30" + + "\xa0\xb9\xa3\x91\xfa\x36\xd7\x93\x8b\xbd\x79\x99\x1b\x75\xf2\x97\x3f\xaa\xa7\xab\xda\x7c\x03\x69\x95\x34\xe6\xa7" + + "\x34\xa6\x56\xbd\xfb\x07\x8f\x0f\xbe\xda\x67\x1d\x09\xc2\xa0\x16\x65\xb1\x97\x9b\x69\xb3\x07\x31\x12\xc8\x69\x01" + + "\x2a\x6a\x01\xf2\xed\xb4\xbc\x52\xbd\xfb\x8f\xbf\xfa\xe2\xc0\x2b\x40\xc2\x01\xa1\x8c\xe5\x95\xf0\x3b\x3b\xaa\x47" + + "\xa7\xfa\x7c\xd5\x34\x65\xe1\xcf\xb3\x0f\x6c\x84\xc6\x12\x79\x70\x85\x22\x02\xb3\xcc\xda\x3b\xb2\x5b\x23\x61\x65" + + "\xd8\x79\x56\x47\x14\x0f\xb9\xdf\x65\x55\x42\xaa\x07\x68\x00\xf8\xf4\x34\xab\x35\x30\x8f\x2e\x06\xb3\x77\xff\x8b" + + "\xaf\x0f\x0e\x06\xea\xfe\x57\x07\x5f\x7c\x3e\x50\xf7\x0f\x0e\x1e\x7f\xf5\x08\xfe\xfd\xf2\x8b\x27\x92\x4f\xb7\xed" + + "\xba\xcf\x5d\xea\xdb\x8d\xc3\x11\xa7\x8c\xf6\x89\xf4\x62\x73\x89\xff\xec\x4d\x00\x09\xdc\x82\x79\x8c\x52\xb9\x6d" + + "\xb2\x6e\x67\x92\x1d\xf7\xc3\x9e\x94\xc5\x34\xcf\x26\x24\xdf\xb8\x9c\x5c\x9c\x64\x4a\x60\xd9\xd8\x4d\xf0\x68\xff" + + "\xb1\x23\x43\x35\xc0\x70\x77\x58\x7b\x77\x55\xa2\x12\xd1\x16\xcc\x08\x8d\xeb\xd4\xee\x7f\xcb\xf6\x6e\xa2\x49\x5b" + + "\x71\x41\x49\xb8\x85\xd7\xa2\x07\xb2\xf6\xe9\x73\xe1\x68\xe1\x02\xa3\xe1\x80\xe5\x6f\xb0\x83\x8c\xe3\x0f\x86\xd3" + + "\xac\x48\xc5\x57\x8c\x52\x73\x0a\x5f\x9d\xa9\x7e\x04\x0e\xe8\xc1\xee\xba\x46\xd4\x31\x86\x4d\x4e\x5e\x1d\x70\x79" + + "\xb2\xc6\x96\x35\x37\x24\x10\x58\xeb\x6f\xb0\x2b\xc7\xa8\x34\xf0\xe4\x88\xb7\xcf\xc7\x8d\xb6\x6f\x49\x6c\x39\x7f" + + "\xb9\xcf\xd0\xde\x43\x58\xcd\xfc\x7a\x0f\xee\xe4\x7e\x40\x2d\x3a\xce\xf0\xd3\xd8\xeb\x22\x0e\x61\xe8\xe8\x32\xce" + + "\xb5\xef\xb3\x77\x2b\x40\xaf\x82\xb0\x85\xbe\xea\x04\xdc\x93\xd5\x1f\x06\x5e\x6b\xaf\x8a\x49\xbe\x4a\x4d\x0d\x26" + + "\x7b\xa1\x14\xae\x55\x3d\xd7\x94\x14\xf7\x4f\x1c\x19\x66\x79\xe2\xd7\x2e\x20\x0c\xe3\xc9\x97\xf5\x58\x25\x3a\x6f" + + "\xfe\x64\x58\x7e\x04\x40\xc7\x89\xc9\x41\x6e\x9a\x34\x15\xc0\x5b\x85\xdc\x1b\x2a\x26\xe6\xba\x86\xc4\x75\xda\x16" + + "\xa8\x4c\xae\x1b\x93\x52\x01\xb0\x7f\xd9\xc7\xa4\x4f\x68\xb2\x85\x39\x69\xf4\x62\xa9\x2e\x33\xb3\x46\xff\xbe\x84" + + "\xed\x68\x2a\xe9\xe3\x78\xa6\xd9\x15\xa1\x6a\x70\xa0\xd2\x85\xb9\xe6\x27\x76\x3a\xb8\xbf\x93\xb9\xae\x94\xfd\xcf" + + "\x73\x4b\xe8\x2e\xcc\xb5\xfd\xbf\xfd\x1d\xd5\xb9\xb5\x85\x11\xc2\x1d\x37\x97\x65\x47\xb2\x42\xe7\x6d\x50\x16\x74" + + "\x3e\xb4\x64\xc8\x56\x2c\x5c\x70\x84\x82\x0a\xcb\xb0\xbd\x22\xd2\x78\xd1\x4b\xd7\xc4\xd0\xf5\x74\x9b\x0d\x1c\x1d" + + "\xef\xc6\xfe\x19\x0d\x26\x54\xe5\xc9\x3b\x3a\x36\xc3\x43\x4c\x5f\xd7\x44\xd1\xd5\x82\xff\x00\xb9\x37\x45\xf3\x57" + + "\xfa\xf7\x6f\xaa\x9c\x4e\x6b\xd3\xfc\x95\xfe\xfd\x1b\x84\x7e\xfc\x15\xfe\xfb\x37\x55\x4f\x2a\x63\x8a\xbf\xd2\xbf" + + "\x7f\x53\x4d\x49\x91\x71\xff\xea\x1c\x13\xaa\x05\xf2\x53\xe5\x64\xa0\x52\xfb\x9f\xf3\x32\xbd\x26\x1f\x6c\xea\xac" + + "\x98\x38\x7c\x22\xb4\xb0\xcf\x75\x3e\x59\xd9\x8d\x86\x5d\x1d\xfd\xcd\xca\x75\x8b\xac\xae\xd9\x57\x85\x46\x38\xfa" + + "\x9b\xd2\x97\x3a\x83\x3d\x1c\xaf\x1d\x0e\x92\xd7\x6e\x67\x47\xac\x05\x4d\xcf\x76\xe7\xba\xbe\x28\x27\x11\xd3\xb1" + + "\x59\xa5\x4e\xf4\x28\xf5\x9f\xbc\x28\x27\x43\x7e\x2b\x42\x0c\xed\xb0\x4b\x48\x48\xef\x4a\xd9\xbf\xdd\x85\x12\x74" + + "\xb9\xdd\xd3\x5d\xcc\x57\x0d\xaa\xe4\x72\x32\xac\x27\x55\x99\xe7\x3f\x98\x29\x74\x06\x2a\xde\xd9\x81\x7f\xa3\x57" + + "\xfb\xaa\xaf\xf6\xc2\x6f\xb1\xca\xce\x6f\xc3\x57\xfb\x8e\xb2\xfb\xce\xfd\xad\xdd\xb9\xbf\x75\x77\xee\x5d\xb9\x54" + + "\x1b\x3a\xc7\xaf\x36\x76\xae\xf3\xdb\xf0\xd5\x7e\x87\x06\x3c\x3c\xd4\xc0\x84\x8c\xd5\x01\xdc\xca\x96\xa5\x3b\x54" + + "\x8f\xe0\xf7\x22\x4b\xd3\xdc\x1c\xaa\xc7\xf0\x17\xb8\x30\x70\x0d\x6f\xca\xc6\x8c\xe9\x14\x31\xde\x68\x51\x56\x0b" + + "\x48\x03\x92\x0e\x54\x5d\xaa\x14\x18\x0c\x4c\x73\xe1\x77\xdc\xb6\xa4\x08\xb6\xc7\x58\xc5\x06\x21\x25\x24\x1f\x3d" + + "\x2e\xbd\xa3\x0e\xd4\xb1\x3a\x80\xdc\x15\xee\xd1\x23\x75\xac\x1e\x87\x8f\x9e\x90\x91\x7b\x3f\xca\x4a\x7b\x27\xf9" + + "\x98\x66\x57\x1b\xb4\x69\xf2\xe0\x74\x78\x05\x44\x20\x39\x41\xe5\x2c\xe2\xb0\xc7\x85\x53\xc5\x79\x8c\xbf\x50\xf3" + + "\x46\xbe\x66\x34\xab\x78\xa1\x85\x59\x8b\x48\xba\x80\x2c\x82\x50\x4d\xe0\xe8\xe3\xb9\x4d\x7c\xcc\xfb\xf1\xa5\x74" + + "\x6d\x20\xc8\x32\xbc\x68\x18\xd9\x84\xef\x1d\xe1\x91\xe5\x86\xbe\xcd\x65\x9d\x5b\x70\xd7\x17\xea\x48\xb9\x3a\x71" + + "\x2d\x45\xe4\xb5\x74\x78\xe9\xab\x63\x6c\xd3\x93\x6c\xe6\xd5\x5c\x04\x77\x67\x79\xbe\x09\xb9\xb4\x0c\x3c\x84\x19" + + "\x75\x3d\x18\xe2\xfd\x4f\xdf\xc1\x1f\x2e\x01\x4d\x58\xa4\xcf\x89\xae\xe0\x4f\x1a\x35\x2b\x3f\xdb\xfe\x1d\xe1\x84" + + "\x3a\x8f\x70\x2b\x79\x94\xcb\xeb\x2e\x77\x6a\x09\x9e\x02\x59\xf3\xb0\x28\xf3\xe7\xbc\xe5\x45\x86\xbd\xa0\x8d\x20" + + "\xd5\x9e\xc0\x44\xe6\x18\xff\xe7\x65\x95\x96\x97\x5a\x3d\x1a\x7e\xae\x7a\x88\x69\xd0\x47\xce\xfd\xf3\xcf\x9d\xf8" + + "\xe6\x7d\xa6\x29\xa9\x2b\x68\x5a\x34\x71\x26\x87\xae\x92\xd4\x5c\x66\x13\x83\x8a\x74\x02\x46\xb8\xf7\xbb\x9c\x25" + + "\x02\xda\xdf\xd1\x5b\xc2\x6a\xf8\x62\xb8\xbf\x3b\x50\xcf\xe7\x95\xdd\xdf\x4f\xd5\xa3\xaf\xee\x71\xb2\x37\xe2\x9c" + + "\x38\xf3\x2c\x45\xe9\x59\xf6\xbf\x80\xa4\x1d\xf7\x3f\xdf\x7f\x62\xe5\xaf\xc7\x07\x4f\x1e\xf7\xc3\xb3\xc9\x17\x52" + + "\xe4\xfa\xb5\xc9\xad\x43\x7e\x12\x19\xbc\x43\xc6\x93\xf7\x0b\x01\xad\x1c\x47\x0f\x5a\x37\x3d\x6d\x0d\x76\xa5\x13" + + "\xbc\x2a\xa9\x25\x88\x3f\xc9\x4b\x9d\x8e\xbd\xab\x16\x9b\x3c\xbc\x85\x21\x5b\xe8\x99\x19\xda\x62\x41\xf8\x85\x93" + + "\xbb\x9d\x77\x02\x94\x81\x7a\xd8\xad\x60\x0c\xf2\x27\x8c\x05\xd9\x93\x72\xb2\xaa\x45\x63\x60\x8f\x0e\x34\xff\xd9" + + "\xd4\xa7\x29\xab\x4b\x75\x9e\xaf\xaa\x11\x7c\xa5\x6a\xf3\xcf\x15\x00\xca\x66\x35\x23\x62\x20\x11\x68\xf9\x3d\x86" + + "\xde\xa8\x20\x97\x41\x70\x6c\x07\x08\xc1\xce\x0e\x91\x1d\x68\xc2\x0b\x3e\xfe\xa1\x57\x23\x45\x08\x07\x42\xb8\x09" + + "\xb5\x26\x18\x7e\x97\x30\x48\x84\x1f\xbd\x1d\x0c\x0f\xfe\x93\x7a\x7d\x74\x47\xaf\xc1\x29\x30\xea\xb4\x7d\xf6\xef" + + "\xf5\xb9\x5c\x35\xa2\xd3\x74\x47\xfb\x25\xb3\xf7\x36\x01\x81\x0c\xd4\xb4\xb5\x80\x75\x19\xa1\x97\x30\xd6\x8f\xbf" + + "\xc5\x3f\x65\xec\x43\x0f\x76\xc6\xad\x25\x6e\xdc\xa8\xf8\xf1\xc6\x48\x7b\xd4\xde\xe8\x85\x03\x1a\x73\x30\x37\xf1" + + "\xe4\xc0\x87\x9f\x38\x3b\xc1\x80\xab\xb2\xae\xf7\x28\x41\x35\xc0\x17\x42\x5c\xdb\xe4\x7a\x40\xcc\x86\x9c\x07\x6e" + + "\x45\x95\x85\xca\xb3\xe2\x02\x25\x16\x36\x28\x6f\xbc\xdd\x63\x90\x23\x3f\x28\x49\x23\x06\x2a\xd1\x49\xe8\xdd\x41" + + "\x7d\xc5\xf4\x62\x18\x28\xce\xeb\x25\x15\x8f\xb7\x18\xe9\x42\xe2\xc8\x4a\xb4\x47\xfb\xbb\xee\x25\x3f\x63\x98\x1a" + + "\x9d\x9b\xaa\xe1\x30\x45\xec\x37\x82\xc1\x4c\x33\x93\xa7\xcc\x97\xd5\xa6\x91\x9a\xf3\x40\xe1\xbb\xdd\x4a\xa4\x03" + + "\x6f\x63\xea\x15\xfa\x1a\x04\x6f\x87\xb2\xdd\xa3\x96\xc6\xb4\xed\x83\xc0\xe4\x2f\x5b\x80\xdc\xd2\x86\x6e\x23\xec" + + "\x2b\xa4\xa3\x28\x81\x0b\x18\xac\x1f\xb3\xd9\xec\x1a\xf2\x4e\x97\x85\xd2\x76\xe1\x5d\xe0\x5b\x53\x2a\xae\xd5\xbe" + + "\xc9\xa6\x00\x7e\x0d\x20\x95\x9c\x1a\xf6\x3b\x7d\x61\x22\xda\xdc\x94\x0a\x1c\xf6\xb1\xaa\x07\xb5\x8a\x34\xd8\x08" + + "\xe9\x8d\x93\x4c\xb5\x70\x2b\xa9\xd3\x2f\x10\x49\x66\x73\x7f\x43\x16\xf3\xb4\xf4\x36\x6a\xf2\x27\x80\x56\x5c\xf6" + + "\x57\xd3\x0a\x29\x46\xca\x1d\xb3\x1a\x7d\xe1\xe7\x8d\x3f\x37\x85\x1e\x67\xf5\x09\xf7\x0e\xe9\xbe\x08\x49\x76\x83" + + "\x1e\x53\xfa\xb3\x2d\x9f\x04\x0d\x37\x47\x38\xdd\x9d\xd6\xee\x9e\x32\xac\x2a\xf3\xb0\x5d\x61\x9c\x63\x37\x8c\x81" + + "\x0c\x35\x10\x18\x91\xbc\x2d\x6f\x71\x17\xb9\xdd\xf8\x20\xf2\xa8\x39\xb4\x17\x11\x91\xd0\x81\xab\x26\x3d\xe9\xa9" + + "\x05\xef\x2c\x2e\x3e\x8d\x03\x6b\x37\xbd\xef\xa9\xd0\x37\x5f\x84\xd4\xc6\x1d\x6b\x77\xa9\xae\x26\x03\xc5\xec\xe7" + + "\x6f\xa8\xc4\x42\x67\x4d\x54\xc3\x37\x19\x5a\x27\xd7\x59\x33\x2f\x09\x5c\xfe\x41\x61\xd6\x0f\xd4\x85\xb9\x5e\x97" + + "\x55\xca\xbd\xdf\xee\x21\xa8\x07\x29\xef\x1d\x26\x05\xb6\xd9\x8f\x70\x1c\xdb\xdc\xac\xec\x08\x75\x1d\x7b\xf3\x32" + + "\xf4\x06\x40\x8b\x4b\x05\xa2\x68\x5d\x4d\x86\x32\x7c\x0e\xe8\x7b\x2c\x67\xd4\xd5\xe4\xd0\xbd\x24\xd9\x84\x3f\xf4" + + "\x66\x8a\x97\x78\x84\x1c\x43\x43\xce\xbd\xce\xd5\x6f\xa1\xaf\x45\x4a\xa0\x85\xae\x00\xf9\xac\xf6\xde\x4a\x54\x0f" + + "\x40\x5a\xb8\x88\xdf\x72\x6d\x2a\x05\xd1\x2f\xe0\xcc\x53\x19\x73\xa8\x2a\x33\xcd\xad\x78\x05\xa8\x0a\xc8\xc3\x20" + + "\x7c\xf9\xd0\xf5\xb2\xbd\x17\xa9\xcf\x69\xfc\x98\xd3\xf6\x76\xbe\x8c\xf3\x94\xb5\xc9\xbc\x48\xac\x3f\xdc\xf7\x35" + + "\x05\x44\xd5\x59\xe3\x8e\x85\x6c\xf9\xce\x67\x08\x13\x30\x50\x87\xe1\x9a\x91\x91\x4c\x1e\xce\x68\x11\x82\x85\xfe" + + "\x71\xd5\x28\x73\xb5\xcc\xb3\x49\xd6\xe4\xd7\x2e\x76\x32\x4c\x27\xce\xd1\xd5\x1d\x9b\x42\xee\xe2\xae\x5c\xe6\xdd" + + "\xdb\xcb\x09\xc4\x4d\xb6\x30\x35\xe8\x44\xb3\xa9\x77\xa6\xc6\x86\xf8\xca\x83\x1d\x80\xa8\xc3\x38\x12\xa7\x47\x3d" + + "\x0a\xf6\xa4\x7b\xec\x61\xcd\x8b\x72\xdd\xeb\x0b\x78\xb5\xea\x02\xfc\x82\x6a\xcb\xc2\xc3\xee\xc1\xbc\x23\x2d\x99" + + "\xde\x85\x48\xe3\x41\x76\xae\x8f\x74\x96\xb3\xda\x63\x54\xbc\x78\xfb\xfa\x31\x6f\x64\x99\xdb\xda\x6e\x4a\x3b\x69" + + "\x2f\x9f\xbf\x7e\x76\x32\xa9\xb2\x65\xa3\x7e\xd0\xc5\x6c\xa5\x67\x46\x7d\x9b\x15\x29\xc4\x1c\x8c\x46\x6a\xde\x34" + + "\xcb\xf1\x68\xb4\x5e\xaf\x87\xeb\xc7\xc3\xb2\x9a\x8d\xde\xfd\x34\x7a\xb4\xbf\xff\x78\xf4\xf3\x8b\xbd\x17\x6f\x5f" + + "\xef\xfd\x60\x2e\x4d\xbe\xf7\x78\x0f\xdb\xd8\xb3\xaf\xf6\x1f\x3f\x3e\x18\x99\xc9\x42\xef\xd5\x50\xf3\xde\x39\x56" + + "\x38\x9c\x37\x8b\x3c\xa4\x3b\xc2\xb2\x73\x84\x54\xaf\xb5\xcd\xc7\x12\x54\x6c\x00\x45\xda\x5e\x03\x1d\x85\x6e\xf1" + + "\x31\x88\x4b\x83\x9a\x5d\xd2\xf1\x36\x0b\xca\x57\x63\x9b\x9c\x10\xbd\xd8\x7c\x48\xfd\xe9\x08\x20\xfa\x81\xb7\x89" + + "\xee\x0f\x7f\xb9\xdc\x72\xb1\xd8\xe1\x45\x1c\xc1\xbf\xde\xdf\xf6\xe4\xdc\xd5\xe3\xa8\x69\xd1\xe5\x6e\x43\x7b\xd0" + + "\xe7\xae\x45\xf9\xd7\x3b\x7f\xcb\x12\x7f\xca\x28\xba\x3e\x8f\x86\xd3\x55\xa4\x17\x98\x7f\x30\x0b\x77\xd7\xc8\x3f" + + "\x8a\xf3\x49\x14\x05\x34\x4a\x76\x5f\x54\xa3\xdc\xe8\x4b\x07\x7f\xb4\x02\xe5\x38\xbc\x2d\x2f\x4d\x35\xb2\xb7\xaa" + + "\x66\x0f\x94\x3d\x4b\x3a\x50\x78\xaa\xa1\x32\xaf\x5c\x41\x0d\xc5\xc1\xe7\xbb\x1e\x54\x4e\x4f\xe6\x00\x02\xe3\x9b" + + "\x1a\xab\xc4\xd5\x9c\x0c\xf8\x15\xb4\xef\x5e\xad\x1a\x78\x43\x90\x83\xfc\x19\xfd\xe9\x3e\xa4\xbf\xf9\x53\x7e\x0d" + + "\x72\xe1\x47\x99\x65\xca\xae\x99\x15\x02\xaf\x68\x3a\xbb\x1d\x4f\x6c\x29\xcc\xa0\x6d\x27\x32\x14\x39\xa7\xd9\x15" + + "\xca\xc6\xe4\xee\xcd\x4f\xee\x39\xc7\xac\xcd\x02\x13\x60\xb5\x1a\xe2\x4a\xb7\x1a\xe9\xab\x36\x60\x89\x0a\x99\x65" + + "\x2f\x1d\x08\xcb\x58\x80\x83\x83\x56\xeb\xc8\x13\xe7\x30\x94\x02\x61\x0a\xc5\xa2\x4e\xd8\x65\x44\x44\xee\x72\x8b" + + "\x59\x1d\x84\xb6\x90\x82\x87\x6b\x7b\xf3\xed\x58\xbd\x29\x23\x43\x1d\x49\x53\xd0\x0a\x68\xc3\x47\xd0\x18\x39\x43" + + "\xb3\xf0\x89\xaa\x96\x7b\x5e\xad\xcd\x2d\xde\xdc\xa8\x1e\xff\x06\xcb\x3f\xd6\x2a\xbc\x71\x3d\x12\x2e\xcb\x92\x5c" + + "\xbe\xdf\x72\x15\x77\x11\x9b\xb1\xcf\xd0\xa1\x93\x55\x83\xd7\x1c\x68\x4e\x1e\x42\x78\xe7\x0a\x1f\xca\xc3\x8e\xca" + + "\xa7\xd9\x95\x0c\xec\x20\xf6\xb0\x32\x42\x29\x7e\xe8\xc0\xec\xfd\xe1\x4a\x98\x51\x4b\x30\x0c\x12\x4e\x10\xa8\x42" + + "\xd8\x40\xd8\x21\xcd\xb2\x9a\x6f\x40\xba\xbf\x7b\x9f\x51\xa8\x72\x37\xcc\x67\xb8\x9d\xe1\xac\x29\x52\x5e\x39\xc5" + + "\xce\x40\xa1\x42\xc7\x6b\x4d\xd4\x6d\x87\x83\x95\xa0\x08\x87\xe8\x72\x10\x4f\xf4\xb2\xc1\x70\x6c\xde\x45\x4e\x5c" + + "\x23\xf6\x13\x35\xb8\x75\xb9\x30\x65\x61\xc0\x87\xb0\x76\xf1\x9f\xdc\xf4\xbd\x00\x0c\xb2\x0a\x25\x8f\x50\x94\x0e" + + "\xcf\x28\x49\x6c\xa0\x8e\x1e\x44\x9a\x86\x8d\x3e\xb7\x21\x94\x04\x7b\xa6\x76\x1f\x7e\x3b\x7e\x77\xf6\xb7\x00\x88" + + "\xa8\x4b\xf1\x03\xc9\x9d\xc0\x44\x87\x97\x41\x6c\xcd\x13\x87\x7a\x0b\x41\xd2\xc0\x57\xa5\x9d\x8f\x01\x2c\x99\x30" + + "\xe9\x11\xfa\x8f\xfb\x4a\x40\xa0\x97\x93\x0e\xa4\x22\x5c\x37\x87\x9f\xd1\x85\x9a\xb1\xb9\xd9\x01\xe6\x58\xc4\x96" + + "\xc8\x80\xb6\x4b\x60\x05\x5e\xed\xc6\x41\xf0\xff\x4b\x33\xa1\xf6\xd4\xc1\xa7\xcd\x46\xa7\x88\x79\xdb\x84\x74\x04" + + "\xaa\x77\xac\x40\x94\x78\xe7\xb6\xe9\xf3\x1d\xeb\x50\xe2\xc0\x75\xdb\x8f\x72\xe0\x06\xf9\x2d\xee\x7d\xb6\x15\x70" + + "\x1a\x0c\x00\xe4\x51\x50\x30\x52\x71\x5a\x0c\xd4\xe8\xe1\xab\x37\xef\x5e\xfe\xf4\xe6\xd9\x0f\x0f\x47\x96\xb3\x97" + + "\x9e\x73\x76\xcc\xdf\x15\x83\x28\x52\x05\x01\x39\x28\xc9\xa6\x56\x0b\xbd\x54\x84\x7e\x5f\x8f\x5a\x0e\x2b\x02\x1b" + + "\xbf\xee\x4e\x0a\x39\x1a\x31\x66\xce\x1e\x07\x07\x87\xfd\x54\x32\x82\x0c\xab\x73\xde\x4e\x9d\x70\xfb\x5d\x55\x8a" + + "\x8a\x82\x10\x4f\x01\xc6\x41\x53\x2d\x20\x49\x63\x78\x47\xf8\x6f\x08\x50\xd3\x78\xe8\x24\xa7\x60\xf5\xba\xb4\x78" + + "\xc2\x19\x9b\x06\x6c\x74\x03\x9c\xee\x0e\xea\x4f\x8e\xe6\x61\x80\x79\x10\x91\xba\xb3\x83\x19\x81\x42\xbf\x00\x3f" + + "\xee\x01\xa4\xf7\xc1\xfe\x16\x56\x36\x0b\xc6\x48\x13\xb0\x71\xa4\xb4\x53\x7d\xe2\xa1\xb0\x99\xce\x95\xe8\xcc\xb5" + + "\x1d\xf4\xc8\x4f\x86\xeb\x1b\x76\x4e\x24\xf8\xeb\xcc\x00\x1d\x9d\x1c\x59\x27\xef\xe3\x3b\xea\xfb\x7d\x4b\xec\xb5" + + "\x62\x94\x75\x29\x74\xc6\x85\x36\x42\xa1\x3f\x9c\xb2\xed\x69\x11\x5b\xa2\x3b\x57\x14\xa0\xca\x65\xae\xf4\x2d\x3c" + + "\x70\xf6\xe2\xa2\x0c\x85\xd3\xe2\xb6\x5b\x0c\x1c\x50\x0a\x44\xcf\xe3\xc4\x9f\xb5\x71\x91\x38\x58\x9a\x19\x1e\x84" + + "\x66\x2e\xa6\xa5\xbc\x01\x7b\xfd\x61\x39\x9d\xf6\x02\x1f\x5c\xd7\x69\xec\xcd\x1d\xdc\x0c\x41\x1f\x51\x44\x06\xa8" + + "\x5a\x01\x54\xa7\x2e\x11\xc7\x15\x51\x01\x08\x43\x06\x59\x7f\xac\x97\xc6\xc7\xe8\x72\xd4\x18\xfc\x65\xb9\xb8\xe0" + + "\x41\x04\xc2\x2b\xb5\x97\xad\x3c\x2c\xed\xdb\x24\xb8\x93\x21\x7b\x85\x4f\xc5\x52\x23\x15\x8c\xb1\xa5\xb1\x7e\x9f" + + "\x4f\xa5\x2c\x5a\x9a\xf2\x4e\x7a\xda\x95\xad\xe5\x0e\x02\x7c\x20\xd2\xb6\x94\xd3\xe9\xad\xcd\xf8\x06\x02\xd0\xeb" + + "\x81\x8f\x9c\x72\x67\x13\x22\x01\x11\x57\x2c\x12\xbb\xdd\x73\xe1\x1a\x29\x09\x08\x6f\x32\xc5\xaa\xe3\x28\xbc\x06" + + "\x4a\x4a\x81\x21\xaa\xed\x50\x4c\x3a\xf5\x25\x8e\xa5\xc1\x5d\x17\x89\x1e\x12\xc0\xa0\xcb\x4f\x7f\x17\xd0\xc8\x76" + + "\x3b\x63\x09\xc6\x1d\x1f\xc4\xa2\xcd\x30\x82\xec\x6c\xf1\xed\xf0\x98\xb6\x75\xc7\xb9\xfd\x57\x6e\x34\xf2\x24\x39" + + "\xf5\x8b\x78\xc6\x64\xf9\xee\x6b\xc4\x1e\xcc\xf8\x1e\x09\x6e\x90\x3b\x2f\x8f\x18\x56\xd1\x13\x33\x0a\x28\x6e\x51" + + "\x70\xde\x7c\x5d\xa3\xb1\xc3\x98\x16\x67\x9b\xef\x95\xcd\x17\xca\xbf\x42\x51\x3b\x4f\xf7\xed\x87\x3b\x4c\x42\x29" + + "\xce\xf7\xc6\x93\xdd\x8d\x19\xd4\xb4\xd2\x81\xfd\xce\x8e\x38\x63\x8d\xaf\x89\x9d\xa3\x63\xd2\x42\x45\x29\x80\xf7" + + "\xee\xa4\x64\x32\x4b\xf3\xfe\x99\x3f\xf4\x41\x1a\xcc\xd0\x8a\x7a\x4b\x9f\xc8\x22\xe3\xb9\xd9\x8f\x51\xb6\x4e\xca" + + "\xe6\x70\x35\x6f\x16\xf9\x3b\x3d\x53\x47\x6a\xf4\xb4\x77\xbc\xad\x2b\xa3\x6f\xce\xab\x9b\x49\x99\xdf\x98\xc5\xb9" + + "\x49\x6f\xe6\xd5\x4d\xb6\x98\xdd\x80\xd5\xf9\x26\xcf\x8a\x8b\x9b\x85\x69\xf4\x0d\xa4\xab\xee\xf7\x7a\xa7\xef\xd7" + + "\xe3\xb3\xdd\xfe\xe9\xdf\xbf\x39\x7b\xd8\x7f\x3f\xfa\x66\x34\xcb\x30\x4b\x83\x9e\xbd\xc1\x3c\xe9\xa3\xa7\x5c\x08" + + "\xf3\x37\xd8\x16\xe1\xf1\xcd\xce\xfd\xe3\xf7\xeb\xdd\x43\x7c\x5c\x94\xaf\x8a\xc2\xf8\xb7\xbd\xe3\x31\x6a\x5e\x6f" + + "\xea\xe6\x3a\x37\xd0\x74\x7f\x94\x51\x16\x2c\x32\xc3\x1f\xf9\xc4\x27\x6c\xba\x07\x9d\x73\x35\x71\xf9\x34\x46\xf4" + + "\xf3\x7d\xfd\xb0\x77\x3c\x3e\xfd\xfb\xd1\xd9\xcd\xd1\xfb\xfa\x21\x27\x06\x19\x52\x9d\x15\x36\x46\xf0\x0f\xa3\xbf" + + "\xff\xe1\xe6\xfd\xa8\x77\x3c\xfe\x45\x5f\xea\x1b\x33\x59\xe8\x3e\xbe\x6f\x15\x7e\xad\x6b\x6a\xe7\xef\x76\xb6\xdf" + + "\x8f\x7a\xc3\x87\x34\xd0\x49\x6e\x74\x41\x7a\x69\xfb\xfe\x7d\xfd\xf0\xe9\x76\xef\x78\xfc\xfe\xf4\xf9\x8b\x67\xef" + + "\x9e\xbd\x3f\xbd\xd9\xdb\xeb\xdf\xd8\x07\x67\xef\xcf\xec\xef\x6f\xde\xd7\x0f\xff\x30\x9a\x39\xa7\xeb\x9f\x5d\xea" + + "\x5e\x35\xc9\x4b\x0c\x8c\xb4\xff\xd5\x33\xc0\x18\x21\xf1\x5e\xfd\x15\xd2\x8d\x60\x24\x01\x84\x93\xac\x2b\xbd\x7c" + + "\xad\x97\x2e\x2d\x43\x94\xb0\x44\x7d\x6d\x9f\x95\x4b\xd4\x5b\x9e\xaa\x83\x81\x4a\x9e\xe2\x49\x72\x98\xe6\x47\x0f" + + "\xf8\xd7\x83\x6f\x12\xfb\x7e\x84\x05\xbe\x49\x00\xf6\x0a\x95\x86\x46\xa7\xee\x7b\xf0\xb9\xa3\xa2\xf4\x9b\x00\xb2" + + "\x26\x65\x6e\x4b\x3d\xf2\xa5\x9e\x4e\xca\x7c\x56\x95\xab\x25\x95\x77\x7f\xc6\x9f\x36\x55\xfc\x65\x73\x5e\xa6\xd7" + + "\xdc\x0c\xfc\x6e\x7d\x03\x7d\x7a\xdc\xfa\xe6\x69\x53\xf1\x77\xd5\x37\xdd\x1f\xdb\xcf\xbd\x2b\xc3\xa9\xda\x1f\xa8" + + "\xc4\x7e\x92\xa8\x33\x97\x43\xa9\x3d\x95\x34\xdb\xc3\x72\xd9\xc0\x28\xd4\x91\x12\x8f\x32\xf2\x2b\xe6\x47\x0d\xb9" + + "\xe1\xba\xbf\xa7\x65\xd9\x88\xbf\x79\x2e\xe4\x23\x8d\xd9\x24\xc5\x47\x76\xea\x0f\x45\xa5\x73\xf9\x32\x6d\x75\xf4" + + "\x60\x78\xa5\x26\xe5\x62\xa9\x9b\xec\x3c\xcb\xb3\xe6\x1a\x5e\xbf\xd6\x45\xb6\x5c\xe5\x84\x9b\x83\x01\xf2\x95\xf9" + + "\xe7\x2a\xab\x20\x5d\x25\xf4\x54\xe4\x39\x59\xb8\xe2\x65\x81\xf7\xbd\x4b\x07\x5e\x16\x8d\x67\x60\x37\x7a\x7a\x20" + + "\xc6\x1b\x34\x94\x38\x9c\xc5\x56\x31\xaa\xcc\xbb\x98\x59\x59\xf0\xe0\x40\x1d\xbb\x66\xc6\xae\x0c\xc4\xa0\x42\x52" + + "\x1c\x5b\x71\x05\x00\x69\xe4\x5d\x98\x9b\xc5\x70\x66\xd8\x05\xba\xfe\xf6\xfa\x1d\x12\xa4\x5e\x02\xe3\x4a\xfa\xa7" + + "\xfb\x67\x6c\x65\x44\x54\x67\x99\x08\xa9\x0d\x64\x12\x65\x9b\xe2\x5a\x18\x48\x89\xa2\x4b\x3f\xd2\xcc\xff\x64\x96" + + "\xb9\x9e\x98\x51\x65\x30\xe3\xb4\xcb\xb3\xe7\x13\x74\xdb\x2b\x1a\x69\x83\x8b\x84\xb2\xbc\x43\xad\xa7\x84\x97\x20" + + "\xa6\x5b\xac\x02\x05\x40\x21\x59\x09\x6e\x07\xe8\x33\x43\x95\xf2\xf8\x7d\x02\x28\xc4\xa2\xc3\xb4\xd5\x56\xec\x03" + + "\x3c\xa8\x91\x65\xbc\xdc\x87\x87\x7e\xf5\xfc\x78\x44\x5a\x1c\x18\x4b\x47\xcb\xf6\xfa\x42\x78\xb3\x23\xd5\x22\x8d" + + "\x04\x65\xeb\x7b\x47\x9a\x13\x1f\x9c\x13\xf8\x01\xd0\x00\xe0\xc5\xa9\x3a\x40\xa7\x4c\x29\x28\x0a\x6f\x81\xd6\xe0" + + "\xbc\x01\xb4\x35\x0c\xda\xf1\xd5\x05\xcd\x3a\x58\x12\xe7\xfa\x12\x1c\xfa\x19\xd7\xc0\x98\x42\x99\x4b\x9d\xaf\x34" + + "\x18\xbe\x7d\x8a\x1f\xd3\xfc\x11\xa0\x24\x5e\x5e\x6a\x72\xb6\xa8\x07\xaa\x32\x53\xde\x5e\x62\x22\x20\xa2\x0c\x28" + + "\x51\x4e\xd0\x0d\x02\x3b\xf5\xde\x67\x2e\xb2\x2e\x53\x4f\x55\x1e\x84\x99\x79\xcd\x51\x6d\x9a\x9e\xdb\x99\x9c\xf1" + + "\x2f\x99\xb9\x2e\x24\x03\xb5\x2d\x5b\x0f\x92\xb7\xc2\xc1\x14\x6f\x3b\x3e\x47\x56\xcf\x19\x78\xee\xc9\x74\x46\x90" + + "\x79\xea\x79\xb9\xbc\x96\xfe\x0b\xa9\xa9\x1b\x39\xc6\x81\xca\xd9\xdf\x63\x69\x5b\x7e\x6b\x4f\x20\xfc\x7a\xbe\xaa" + + "\x06\x6a\xe5\x9e\xad\xdc\x33\xd4\x5f\x8b\xb5\xb7\x75\x46\xa7\x3c\xe4\xca\x02\x73\xf6\xc1\x50\xd9\x4e\x29\x3b\x44" + + "\xdd\x60\x42\x7f\xf2\xfe\xac\x25\x38\xb5\x69\x26\x43\xd7\x42\x1b\x7d\xba\xae\x26\xde\x73\x8e\xbb\xde\xa9\x61\x84" + + "\x92\x87\xae\xd8\x73\x08\x7d\x0c\x97\x08\x86\xe0\x67\x40\x09\x28\xb7\x5a\x1d\xb9\xe7\x43\x39\x74\xe1\x2d\x56\xc7" + + "\x60\x99\xdc\x50\x00\x96\xe9\x1e\xba\x7a\x7d\xce\x85\xdb\x41\x95\x45\x84\xe3\x40\xe5\x2d\xc4\x61\xde\x95\x1d\x3b" + + "\xb1\x53\xb8\xc6\xc1\x36\x1e\xea\xde\xd5\x04\x3b\xac\x53\xa7\x29\x57\xf0\x11\xad\xe0\xaa\x36\x15\x4c\x64\xb0\x4c" + + "\x90\x6c\xbe\x7b\x99\x56\xd1\x32\x41\xd1\xf6\x32\xad\xfc\x32\x45\x4e\x12\xbf\x7d\xf4\x5b\xd2\x29\x6e\xa3\xbc\xfc" + + "\x38\x3a\x57\x47\xf7\xd9\xb0\x04\x35\xcf\xe9\x8e\xba\xb2\xb3\xa1\x67\xe2\x58\xa0\xdd\x88\x5e\x76\xde\x3e\x7c\x8b" + + "\x6d\x78\xdd\x83\x0a\x6f\x6e\x54\xf2\xd0\x43\xf4\xf1\x07\xff\xb4\x63\x3a\x21\x81\xe7\x19\x44\x77\x6d\x7a\xd5\x59" + + "\x0f\x63\x83\xb2\xc8\x63\x99\xfe\xc0\x91\xc6\xca\x8e\x7a\xd6\xe9\x7a\x1a\x0d\xf8\x58\xdc\xdc\x0b\x53\xcd\x4c\x4f" + + "\x9d\x72\x19\x4b\x6b\x2a\xf0\x5e\x1f\xd3\x51\x16\x04\x58\xb2\x4e\xdf\x1c\x59\xee\xc9\xcd\xed\x34\xbb\x7a\x65\x65" + + "\x8c\x6e\x8a\xc3\x5d\xb1\x7b\x80\xe9\x86\xfd\x7b\xd8\x94\x3f\x94\x6b\x53\x3d\xd7\xb5\x11\x6e\x28\xdf\xe9\x2c\x07" + + "\x1e\x79\x69\xaa\x3a\xab\x9b\x20\xaf\x23\xba\xee\x62\x92\x5c\x48\xe9\xe7\x7c\x7e\x21\x1f\xb7\x4e\xb3\x92\x82\x5d" + + "\x1c\x25\xf1\xcd\x53\x32\xe2\x15\xe2\x4c\x86\xd9\x34\x39\xe9\x87\xf7\xde\x62\xca\x6e\xbb\xec\x45\x12\x5b\x20\xce" + + "\x4b\xe8\x7a\xec\x24\x52\x43\xd2\xad\x49\x15\xf2\x91\x9c\x81\x81\xdd\x21\xdd\x6b\xf2\x45\x9e\x1b\xa4\xde\xa0\x8b" + + "\x83\x2f\x6a\x7f\x77\x6e\x1e\xc6\xcd\x4d\xf4\x9c\x13\x15\x26\x41\xf7\x83\xb4\x88\x81\xd7\x16\x27\x22\x74\xe7\xa5" + + "\x9d\xcd\x05\xe6\xb9\x9d\xc0\xc0\x9e\xb6\x67\x05\xda\xa8\x6a\xbb\xe6\x66\xf9\x42\x3e\x8a\xc2\xfd\xf3\x81\x6d\xf6" + + "\xa5\x4b\xe4\x6b\xfb\xe5\xfe\xc2\xb3\x42\x79\x22\x81\x49\x68\xe5\x50\xa4\x44\xc3\xc5\x8f\x7a\x26\x3c\x44\x3f\x31" + + "\x87\x6a\x87\x1c\x85\x3b\x98\x7c\x88\xaf\x00\xb2\x12\x62\xf5\xeb\x7a\x25\xb0\x72\xb7\x37\xa4\x7a\xdc\xd9\xe9\x04" + + "\xd2\x3d\xe8\x06\xd2\x3d\x38\x10\xd0\xe4\x1e\x82\xea\xaf\xaf\x7f\x78\x51\x4e\x3a\x20\xa8\x50\x7c\x34\xf5\x64\x6e" + + "\xd6\xea\x24\xfb\xf5\xd7\xdc\x28\xc0\xc4\x82\x54\xf5\xa6\x9a\x96\xd5\x02\xc0\x08\x2a\xa3\xeb\xb2\xa8\xc7\xec\x25" + + "\xf5\x4b\x6d\xdf\x0e\x27\xe5\x62\x34\x33\x8d\xce\xf3\xbd\xcb\x7a\xaf\x86\x0a\x46\x8f\xe8\xb6\xf2\xd3\xae\x8e\x3c" + + "\x51\xcc\x85\xdd\x43\xac\x93\x28\x12\x4c\x66\xfb\x7e\x12\x1f\xdd\x7a\x39\x05\xa4\x22\x62\x73\x64\xe7\x82\x7b\x29" + + "\x86\xc4\xb0\x57\x91\xf3\xb8\xab\x3d\x56\x93\x0b\x26\xa5\xd3\x06\xc3\x0a\xac\x35\xad\xed\xc9\xfc\xcc\x86\xdd\x1b" + + "\xcf\x86\xfc\xeb\xe6\xa6\x3d\x39\x5b\xed\x39\x0e\xfe\x14\xdf\xf8\x39\xdf\x70\xe5\x7f\xea\x94\x6e\x75\xb0\x7d\x9f" + + "\x3a\xb3\x7c\xe3\x07\xd6\x9c\xb8\x3e\x92\x14\xf3\xd8\x36\xe6\x57\xe4\xc7\xca\xd4\xa6\xba\x34\x4e\x2c\x42\x46\xdc" + + "\x12\xbe\x79\x66\x45\x8f\x6b\xa6\x45\x9b\x36\xdf\x40\x25\xf8\x2d\x07\x11\x38\x3e\x33\x9a\x03\xf5\x8d\x80\x70\x8e" + + "\x98\xfb\x80\xa8\xa8\x6d\xa2\x16\x3b\x3b\xc1\x3a\xc9\x96\x42\x88\x13\x10\xfe\x1c\x05\xa7\xfb\xa5\x36\x8d\x50\x36" + + "\xc2\x43\xa1\xa8\x3c\x5f\x65\x79\xca\xe9\x92\x63\x22\x59\x0f\xfc\xe5\x4b\x92\x0b\xab\x3d\x85\xa7\x17\x2b\x10\x09" + + "\xe1\xbc\xd1\xb3\x01\xe8\x03\x06\xce\x4c\x34\x50\x04\x8b\x22\x32\x37\x33\xfb\x70\x6b\xe2\xe6\x2d\xcc\x5d\xe9\x01" + + "\x54\xbc\x80\xb3\x41\xc2\xb9\x45\xc4\xd9\x12\x58\xe4\x21\x7c\x86\xd7\x75\x12\xf9\x03\xaa\xb7\x1f\xc5\x71\x3c\x4b" + + "\x53\xca\xa5\xc9\x90\x0a\xf7\xbc\xdd\x9f\x88\xa2\xbd\x7a\x1d\x41\xec\x54\xe4\x87\x84\xfc\xbf\x1b\x0c\xe9\xf3\xaf" + + "\x24\x67\xa3\xce\xcd\x44\xaf\x6a\xa3\x96\xab\x9a\x73\x06\x7e\x18\x28\x5d\x55\xfa\x3a\xcf\x2e\x4c\x5f\x35\xf3\xaa" + + "\x5c\xd7\x21\xdb\x4c\x4c\x11\x74\x75\x10\x51\xf3\x63\xc6\x92\x3f\x53\xe3\x88\x22\x22\x61\x2a\x2e\x4d\xd5\x00\x12" + + "\x0c\x28\x43\xb3\xa2\x29\x65\x80\xde\x3d\xe9\x75\x40\x6e\x52\xb6\x20\x71\x1f\xf2\x26\x80\x2e\x41\x27\x18\x24\x36" + + "\x58\xf1\x77\xe6\xaa\xc1\xfb\x91\x3f\xea\xea\x88\xef\xc4\x8b\xb7\xaf\x3d\x0e\x7c\xcb\xf1\xc1\x65\x2d\xb1\x2b\xd8" + + "\x9d\xe8\x3b\x6c\xde\xe9\x52\xd2\xec\x32\x91\x8d\x23\x9c\x59\x6d\xaa\x0c\x43\x74\xb5\xe5\x70\x8a\x54\x57\xa9\xaa" + + "\xcc\xd2\x92\x89\xa2\xf1\x79\x98\xb6\xb6\x80\x95\x55\x3d\xc5\x4a\x67\xa1\x72\xf0\x69\x79\x50\x8f\xa7\xfa\xa0\x54" + + "\x68\xb1\x8d\x50\x8f\x3d\x31\x5e\x91\x76\x0a\xcc\x2e\xa0\x48\xb1\x6a\x8d\x95\x83\x87\x7e\xc8\x41\xc2\x67\x5b\x0e" + + "\xea\x67\xad\x4a\x85\x7a\xa0\x9e\x72\x8a\xf6\x81\x4a\x9e\xfe\xe1\xe0\x9b\xa7\xa3\x3f\x3c\xfa\x26\x01\xff\x19\xfc" + + "\xe8\x91\x44\x92\xc1\xf1\x4f\x10\xe3\xba\x2a\x57\xb3\x39\x94\xb2\xcc\x2c\x5f\x4b\x08\x7d\x4f\x8a\x30\xde\x7c\xae" + + "\x0b\xfb\xca\xe1\xdc\x74\xe6\x6a\x11\xab\xe5\x13\x4b\x77\xa2\x44\xfe\x2f\x1e\x13\xdb\x99\x89\xed\xc8\x1b\x38\xe1" + + "\xe1\x7e\xf8\xc9\x2c\xcc\xe2\x9c\x32\xb4\x37\xe5\x72\x2f\x37\x97\x26\x67\xf2\x46\x46\x3e\x1e\x96\xdb\x7d\x5e\x41" + + "\x18\x54\xf6\x5d\x76\x65\x6a\x75\xff\xe0\xd1\xe3\x27\x5f\x74\x0c\xf5\x67\x73\x7e\x91\x35\x03\xf5\xea\xa5\x58\x67" + + "\xbb\x71\x9f\x93\x06\xf2\x48\x25\x49\xa7\xb4\x7b\x2f\xc8\xaa\x41\x6b\x86\xbc\x05\xf7\x09\x08\x24\xf7\xaf\xa3\xd2" + + "\x7b\xdd\x20\x79\x44\x38\x61\xaa\x1c\x34\x5e\xc0\xee\xdd\x7f\xb2\xff\xd5\x97\x6a\x4f\xbd\x9a\x12\x0f\x03\xbe\x83" + + "\xf6\x3a\xcb\x0a\xbc\x46\x9d\xa2\x51\x93\x4a\xb2\xd6\x0b\x82\x30\xa4\xc4\xb5\x5c\x17\xe4\xe1\xa5\xe2\x80\x4d\x5b" + + "\x94\x00\xbc\xaa\x8b\x6b\xc8\xd7\xe2\x49\xb6\xbf\x8a\x04\x7e\x6a\x41\xc0\xe9\x78\x25\xc9\xdb\x6a\xfb\xe8\x48\xed" + + "\x1d\x08\x40\xec\xce\x14\x4d\xce\xb7\xe1\x5f\x61\xd2\xe1\x9e\x58\x22\x40\x7c\x19\x4c\x3b\xed\x0e\xbe\xc8\xbb\x69" + + "\x14\xd6\x15\xb1\x12\x5c\xef\xa7\xf1\x28\x04\x57\xc5\x83\xf0\x6c\x60\xc8\x69\x00\x86\x69\x0b\x45\xe2\x39\xf8\x4c" + + "\x1a\x65\x69\xd8\x0a\xb5\xf2\x62\xb6\x49\x77\xe9\x1d\x1e\x3d\x92\x61\x6b\xaf\x34\x8b\xa5\x03\x2e\xf4\x27\x1f\x11" + + "\xec\xbc\x96\x56\x5c\x1b\x28\xb5\x52\xaa\x30\x49\x2c\xa8\x59\xba\x44\x02\x46\xf5\x4e\x78\x55\x9e\x65\xc1\xf0\x80" + + "\x61\xec\x05\x28\xf0\x22\x66\x47\xf2\x33\x81\x21\x13\xb4\x4e\x17\xe6\xfa\x53\x00\x46\x05\x9b\x12\x31\x24\xbd\x16" + + "\xfb\xd1\x0f\x63\x35\x43\x66\x45\x72\x15\x9b\x10\x8f\xed\xd8\x2f\xcc\xb5\x43\xe9\xf5\x1a\x42\x17\xea\x12\x7a\x27" + + "\xda\xc2\x56\xf4\x4b\xe3\x0c\x79\x13\x3d\x99\x9b\x53\x78\xdf\x5e\xb0\x54\x64\x83\x16\x0b\x13\x2a\x00\x37\x14\x0a" + + "\xc0\xfc\x04\x96\xb1\x2f\x70\x67\xfa\x35\x41\x8b\x29\xcb\x2f\xe6\xb9\xd6\xaa\x9e\x97\x55\x33\x59\x89\x80\xcf\x8e" + + "\xba\x1e\xd4\xaa\xbc\x34\xd5\xdc\xe8\xd4\xd5\x12\x71\x0f\x9f\x90\xf6\x28\xed\x48\x79\x24\x01\xc4\x3a\xe1\xbf\xba" + + "\xe7\x57\x8e\x5e\xe4\xba\xd6\xc5\xb5\x80\xed\xfa\x07\xe9\x9a\xff\xc1\xda\xca\xad\x2d\xaf\xab\xed\xae\x77\xf3\xa1" + + "\xb8\xa5\x99\x55\x6d\x2a\xd1\x86\x6c\x00\xf4\x93\xd4\x80\xd8\x5f\xf0\xd8\x87\x52\x9d\x75\x58\xf8\xbb\xfc\x47\xb7" + + "\x30\x8b\xad\x3f\x73\x10\x9e\x17\xb9\x42\xb0\x62\x15\x7d\x2d\x36\x94\xe5\xc2\x97\x2e\x94\xce\xab\x11\x09\x43\x8e" + + "\xb9\x71\x73\x45\x18\xc2\x4e\x11\x89\x6e\x30\xe0\xd6\xd6\xeb\x6f\xf0\xba\x90\xd1\xf2\x6d\xf5\x48\xc7\xe3\x0d\xcf" + + "\xbf\x0e\x78\x1e\x08\x6d\x0b\xae\xdc\x4b\xd6\x5d\xc9\x55\x23\x81\x8e\xe3\x71\xa1\x8c\x70\x91\x73\xa0\x6c\x82\xa4" + + "\xe1\x15\xd2\x76\x79\x96\xfe\x25\x69\xb9\x00\x93\xab\xc0\x5f\x1e\x44\x04\x30\xf2\xc5\xfc\x0f\x8e\xde\x52\xd4\xc6" + + "\x63\xe2\xb6\x4d\xb9\x04\xda\x29\x69\x3b\x05\x76\x74\x5c\x8f\x52\x80\x97\xd3\x40\x99\x59\xfe\xdf\x39\x0f\x59\x51" + + "\x9b\xaa\xf9\x16\xa0\x08\x1c\x65\xc2\x57\x9e\xcf\xdc\x3c\x37\x88\x61\xf0\x3f\x31\x35\x5d\xe9\x41\xa2\x17\xdd\x9d" + + "\xf7\x8e\x4b\x1d\xfd\x85\x3c\xfd\xff\x77\xeb\xee\xb0\x30\x57\xcd\x49\x86\xb1\xcc\x1b\xbb\xde\x4e\x98\xeb\x3d\xed" + + "\x2e\x48\x4d\xa7\x46\x0f\xd5\xab\xa2\x31\x55\xa1\x73\xf0\x71\x85\xd4\x28\x0f\x47\x2d\x95\x8a\xd3\x5b\xd4\xd2\xb7" + + "\xfa\x58\x39\xbc\x4b\x44\xa8\x11\xbe\x7c\x44\xec\x44\x34\xc3\xdd\xcc\x48\x06\xac\x08\xa2\xf5\xb7\x99\x90\x6d\xd7" + + "\xeb\x9d\x9d\x4e\x9d\x71\x1c\x01\xe3\x58\xac\x5e\xa4\x5f\x8c\x39\x4e\x1f\xa1\xdf\xb5\x2c\xc4\xb1\xf8\xb6\x7f\x07" + + "\x3b\x2e\x28\x6f\xc4\xf8\xde\xa1\x49\x73\x84\x38\xea\x16\x71\x06\x1b\x09\x51\xc0\x76\xb2\xbb\x24\xed\x08\xb8\x6d" + + "\x36\x04\x69\xba\x45\xbe\x6d\x95\xc0\x2f\xef\xf6\x45\xda\xb8\x2e\x4e\xa5\xc2\xf8\x43\x0b\xb3\x28\xab\x6b\x95\x1b" + + "\x4d\x00\x2a\x77\x2c\x9b\xc3\x3e\x08\x35\x34\x24\x66\x86\xec\x84\x50\xd0\x20\x4f\xdf\x29\xb7\xde\x3d\x63\x2d\x93" + + "\xcd\xa7\x1a\x6b\x42\x15\xf9\x51\xa4\x32\x77\xb9\xb7\x68\x48\xe3\xf0\x3d\xf4\xae\x5d\xf5\x51\x47\x73\xbe\xa6\xb0" + + "\x85\x71\xbb\xec\x61\x6b\xa0\xc3\x85\x5e\xb6\xb9\x8e\xd0\x75\x09\x66\x80\x2f\x84\xbb\x47\xdf\xf6\x40\x9d\x37\x8b" + + "\xfc\x3f\xc3\x6e\xc5\x0e\xa2\x6a\x9f\xe1\xcd\x19\x9f\xc4\x2b\x65\x41\x2b\x0b\x63\x0c\x94\xb2\xb8\x47\xbb\x18\xb6" + + "\xbb\x48\x8a\xf0\xa5\xf1\xda\xae\x96\xdc\x7a\x62\x0c\x65\x93\x9a\xe8\x42\x35\x98\x17\xc3\x49\x07\xba\x48\x31\x31" + + "\x20\x20\x17\x72\x25\xe2\x62\x40\xa7\x65\xdf\x3d\x17\x73\xb2\xb3\xa3\xb6\xa5\x73\x28\xc9\xab\x3c\x3f\xce\x24\xe6" + + "\xb4\x76\x2d\x3d\x20\x17\xbd\x5b\x11\xc8\x82\x01\xb3\x0a\x68\xea\x44\x10\x8b\x3b\x55\x79\xee\x64\x36\xd5\xb5\xa3" + + "\x7c\xb7\xa8\xc2\xbd\x36\x1c\x97\x34\x8b\x92\x61\x84\x87\x9c\x94\x31\xa4\xfd\xa6\x2c\x78\x1b\x88\xc9\x5d\xf4\x28" + + "\x94\xb7\x3e\x89\xe6\x6c\xf9\x0e\x07\x1a\xcf\x80\x7f\x96\x12\x18\xfd\xa2\x11\xee\x4b\xb2\xf5\x6a\x4a\x01\x23\xbe" + + "\x22\x54\x0e\x42\xb4\xcb\x95\x95\xb3\x01\x20\x68\xc5\xa9\x40\x74\x9e\x03\x34\x91\x4c\x8d\xf3\x51\x4d\x30\x03\x3b" + + "\x1c\x92\x8f\xdd\x77\x5a\xc4\x5f\xb0\xc8\x81\x0c\xad\xdb\x18\x01\xde\xd4\xef\xe0\xf9\x69\x47\xfc\x9c\x35\xf3\xee" + + "\x9b\x45\x57\x33\x75\xe4\xeb\x60\xb5\xec\x3d\x91\x3a\x06\xfd\x12\x74\x31\x33\xe0\x50\x66\x2b\x04\x74\x0e\x3d\x99" + + "\x3b\x87\x0a\x5e\x7a\x97\x2c\xa9\x30\x6b\xa9\xf9\xfd\xdd\xac\x18\xf6\x2b\x62\xb9\x5c\x6e\x8c\x8d\xbb\x82\xf8\x9a" + + "\x7e\x40\x50\x6c\x5d\x6e\x96\x75\x35\xe3\x73\x22\x6e\xe9\x4d\x8c\x26\xcd\xc3\x77\x65\x35\x31\x2e\x5f\x33\x06\x8a" + + "\x57\x46\xad\x35\xa4\x20\x16\x63\xe5\xb4\x74\xa0\x4e\xc5\xa8\x28\x37\xd6\xbe\x24\xa9\x15\x38\xb1\xf4\x6c\x6f\x68" + + "\xd9\x6e\x6e\xec\x53\x77\x18\x18\xed\x92\x71\x29\x49\xe3\x21\x17\x17\x53\xdd\x75\xb1\x90\x5d\xa1\x03\xac\x32\xe9" + + "\xca\x47\xcf\x15\xd2\x02\xc9\x2a\x75\x35\xab\x07\x10\x4f\x05\xfb\x5b\x86\x52\x7f\x97\xeb\xa6\x31\x05\x5c\xee\x85" + + "\xa9\x1b\x93\xa2\x32\x1d\x8e\x38\xa5\xf4\x41\xb4\x4d\x0e\xe4\x3a\x3d\x8b\xd2\x55\xd8\x2d\xc8\xda\xb7\x01\xe6\x6b" + + "\x11\x36\xc4\xb9\xae\x4f\xf8\xb7\x9d\x17\xc4\x49\xf6\x7c\x90\xb7\xf0\x89\xbb\x84\xd4\x6f\x11\x14\x41\xf6\x06\x3d" + + "\x1b\xd4\x91\xca\xd5\x9e\x3a\x18\xd0\x9d\x85\xe4\x13\x32\xf1\xd8\xad\x4f\x85\x5d\x72\x2d\xaf\xbe\x93\x09\xb7\xfc" + + "\xa1\xa4\x99\xf8\x19\x6e\x94\x07\x8d\x72\xfe\x1c\x6e\x54\x35\x2a\xaa\x89\x1b\x65\x07\x9f\x81\xca\x0a\xe5\x8d\x15" + + "\xb0\x4d\x45\xab\x0c\x2d\xd4\x53\x39\x64\xeb\xa3\xb8\xa9\x4d\xb7\x0f\x11\x32\xe7\xc5\x01\x8d\xe0\x70\x9d\x03\x90" + + "\x49\xa3\x5b\x29\x4e\x2b\xdc\x15\x60\xa2\x00\x4d\x3f\x94\x4c\x6b\x93\x4f\x41\xca\x68\x86\xe6\x9f\xae\xc4\xa1\x60" + + "\xc6\xc5\x40\x3c\x2d\x77\x53\xec\x6e\x2b\x99\x88\x03\x6a\x01\x35\xfc\x14\xd0\x6b\x7a\x2d\x46\x1b\x5e\x05\x14\x24" + + "\xd8\x96\x74\x70\xfb\xad\x48\x47\x1f\x3b\x2a\xac\xca\xb4\xa6\x81\x55\x9b\xeb\x74\xcc\x4b\x2c\x32\xc0\x5d\x13\x12" + + "\x0a\xd8\xb0\xb7\x1b\x73\x30\xf4\x88\xdf\x7b\xdb\x11\x1f\xfb\xe8\xce\x13\x9d\xc4\xec\x45\xed\x5b\x03\x1b\xf5\x1a" + + "\x7b\xd2\xb7\xbb\x51\x59\xb6\xb1\x65\x40\x90\x32\xcc\x20\xf4\xd0\x76\x33\xed\x8f\x9b\x5d\x5f\xd2\xa7\x87\x0c\x9a" + + "\x4c\x7f\xe5\xbc\x50\x5c\x9f\x39\x51\x4b\xae\xeb\x46\x65\x8d\x59\x00\x24\x99\xd1\x29\x63\x1c\x63\xd7\xd9\x0e\x97" + + "\x35\xc0\x87\x99\x22\x55\xab\xa5\xab\x1e\xf3\xf7\x5a\xda\x99\x99\x14\xc0\xa0\x2a\x34\xa3\x43\x9e\x5f\x53\xc1\x31" + + "\xaa\xb3\x06\x6d\x1a\xb5\xea\xdd\xff\x6a\xff\xcb\x7d\x4e\x11\x74\x2b\x33\x03\xd8\xb1\x47\x52\xdd\x7f\x4f\x28\xf2" + + "\x32\xd0\xb3\x3b\x42\x21\xd8\x10\xfa\x2e\xe4\xb9\x91\x20\x01\xce\x9e\xa7\xa4\x82\x29\xfa\x93\x31\x4b\x55\x19\x40" + + "\x22\x9c\x98\x9a\x22\x64\xc0\xd5\x82\x26\xd9\xf6\x35\xd7\x8d\xa9\xc8\x6f\x5d\xda\x8b\x39\xe5\xa4\x5b\x11\xc9\x15" + + "\xdd\x62\xf3\xfc\x77\xad\x9e\xb1\xdd\xd3\xd1\x62\xde\x50\x38\xec\x0e\x81\xb8\x8b\xb5\xe2\xf3\x29\xce\x3a\x79\xea" + + "\x60\x35\x99\x3c\xe5\x82\x82\x74\x8e\x1b\x41\x19\xa8\x43\xa7\xd1\x06\xb5\x34\x3d\x3e\xb2\x91\x71\xd6\x14\x80\xb9" + + "\x4d\xdf\xd1\x1b\x79\x66\xdc\x58\x83\x30\x82\xc8\xc8\xfb\x92\x7c\xef\x85\xf1\xcb\x2d\x28\xb8\x88\xda\x1d\xee\xb0" + + "\x43\x50\x47\xe4\x97\xb5\x95\xd1\xc5\x8f\xb4\xc5\x79\xd3\xae\x73\x03\xce\xbc\xee\x7e\x93\x85\xcc\x7e\x12\x5a\xc8" + + "\xdc\xe5\xb0\xb5\xb5\xdd\x76\x20\xa7\xc5\x0c\xdc\xee\x3b\x55\x28\x80\x0f\x51\xa0\xde\x45\x88\x1f\xdc\x13\x68\x17" + + "\x1d\xa2\x85\xb1\x64\x34\x52\x6f\x81\x4f\xd6\xb9\x7a\xf6\x7f\x9e\xfd\x55\xa5\xa0\x79\x45\xdc\xd6\xf3\x55\xa3\xd6" + + "\x98\x7e\x72\x55\xb8\x19\xcc\xa6\x98\xd1\x17\x1d\x28\x7c\x55\xd2\xcc\xf5\xc1\x5c\xea\xfc\xcf\x55\x1e\x36\xb6\x15" + + "\xbd\x95\x9d\xf2\xc2\x81\xb7\xc4\x6c\x36\xee\xcc\x84\x1a\x08\x27\xd4\xab\x27\x84\x88\x25\x42\xe7\x06\x64\x8d\xbc" + + "\xdb\xe0\xb3\xd1\x04\xe9\x34\x1b\xb1\x75\xc4\x01\x4d\xa1\x44\xf0\xae\x1c\xab\x04\x7f\x22\x54\x14\x6a\xb3\xe1\x31" + + "\xfd\x86\xe7\x52\x39\x39\x56\x09\x2a\x76\xc5\x9b\x67\xa8\x39\x4d\x40\x83\x0a\xcf\x69\x64\xcf\xf2\x7c\xac\x12\x21" + + "\x37\xc4\x98\x53\x05\x18\xe4\xa3\x7c\x16\xce\x94\x73\x8a\xc9\x51\xcf\x42\xa0\xcb\x88\x2d\x65\x55\x01\xf1\x66\xe8" + + "\x93\xee\x7c\xb7\xa0\x7f\x8e\xdc\xca\xaf\x89\xdf\xd3\x70\xe7\x62\x39\x71\xfc\x37\x2b\xc8\x32\xf5\xf4\x08\x2e\xa5" + + "\xb6\xa3\x57\x0d\x19\x91\x21\xff\x81\xad\x36\xe4\xb9\x59\xbb\x22\x00\x57\xb8\x53\xd8\x3a\xf9\x18\x9e\xfa\xe9\x38" + + "\x73\x56\x62\x61\x92\xef\x26\xd6\xa3\x91\x82\x40\x98\xfe\xef\x22\xd1\xa2\x0c\xa6\xda\x44\xe7\x36\xac\xa8\x2b\x61" + + "\x0e\xca\x50\xab\x7a\x7e\xd2\xe8\xc9\x05\x66\x86\x43\xa6\xff\x30\x8c\xb5\x55\xd9\xb4\xb2\x6b\x4b\x71\x5a\x69\x56" + + "\x2f\x73\x7d\xed\x83\x39\x46\x0f\x1f\xde\xfb\x4c\x3d\x54\x3f\x99\xa6\xca\xcc\x25\x32\x01\x7a\xd2\xac\x74\xae\xb8" + + "\x30\x78\xac\x93\x30\x08\x85\xff\x7f\x10\x84\xab\x7e\x3b\x01\x66\xf5\x23\xe5\xcf\x65\x5f\x6e\x4e\x7d\xd0\xf1\x01" + + "\xa2\xa7\x7c\x04\x28\x1e\x07\xbf\xc3\xa0\x93\xea\xe1\x08\x11\xa9\x74\x9e\x03\xfe\x62\x7e\x8d\x22\x97\x95\x3f\xb3" + + "\x82\xdd\xcf\x5f\x60\xaf\x84\x07\x3f\x76\x97\x9e\xf3\x5e\xb6\x4d\x78\x37\x7e\x08\xe5\x85\xbd\x44\x8a\x01\x5e\x72" + + "\x48\xbe\x11\x78\x85\xe1\x68\xfa\x8a\xc5\xf5\x77\x25\x96\x82\xf8\x49\x4a\xe4\x63\x97\x79\x66\x18\x01\xe1\x79\xb9" + + "\x58\xae\x1a\x93\x9e\xd8\x46\xd4\x02\x1c\xa4\xce\xad\x64\x99\x67\xfa\x3c\x87\xc0\x13\x1a\x8e\xed\x6c\x43\xa9\xcc" + + "\xdd\xfc\x6c\x6d\xf9\x55\x21\xcc\xf7\x4d\x75\x83\xeb\x36\x8c\xe5\xce\xb2\x9c\x41\x78\x1f\x74\x4b\x2e\x3e\x91\x79" + + "\x3d\x58\xa4\xac\xe6\xec\xc8\x60\x52\x6f\xcc\x62\x59\x56\xba\xba\x06\xa0\xa1\xde\xa2\xac\x8c\xb2\x5b\x55\x95\xcb" + + "\x66\x91\xfd\x0a\x9c\x4c\x5f\xad\x8a\x26\xcb\x01\x39\x0b\x3c\x72\xd4\xb9\x69\x1a\xc0\xef\x5e\x98\x5a\xe9\xbc\x2c" + + "\x66\x03\x6e\x08\x61\x43\xb2\x06\x64\x6a\x14\x55\x53\x5c\x52\x82\xd2\x9c\xa0\x0b\x8b\x2e\x52\x0e\x2a\xe6\x99\xca" + + "\x0a\xf5\xdd\x77\x28\xf4\xd9\xd1\x0c\x79\x8a\xc6\xee\x1a\xab\x6b\x31\xc4\x81\x4a\xa8\x84\x53\x88\xa1\x04\x87\x48" + + "\xe2\x98\x12\xa1\xb8\xc6\xe0\x77\xe0\x03\x5c\x46\x68\xf6\x36\xc2\x4f\xea\x12\xd4\x3f\x09\x8a\xe1\x09\xcf\x8f\xae" + + "\xd5\xd4\x92\x92\xb5\xbe\xb6\x3c\xdf\xcc\x34\xaa\xca\xd2\xd6\x56\x47\x3d\x15\x7e\xcb\x51\x21\x74\x62\xa9\x7b\x2e" + + "\x26\x85\xce\xdd\xbb\x0a\x2a\x4c\x5d\x12\x55\x19\x68\xc1\x83\x46\xe9\xce\x1e\xc3\xe2\xf6\x73\x48\x47\x90\xce\x92" + + "\x8f\xdd\x0c\x4e\x8e\x08\xc7\xf0\x07\x04\xf9\x30\x66\x71\x06\xe1\xae\x14\x94\xe3\xd4\x7f\x7c\x26\x62\xea\xb6\xb9" + + "\x30\xeb\xe2\xdd\xb7\xf1\xe1\xa4\xaf\xe9\x80\x06\xf9\xca\xc1\x33\x2c\x5b\x2c\x73\x03\xf3\x3c\xd5\x59\x0e\x7c\x9b" + + "\xa6\x4d\x93\x15\x00\xfd\xa7\x0b\x22\x6a\x4e\x1c\x74\xad\x59\x09\xba\x28\x0b\x03\xc1\x25\x61\x9f\xe4\xe6\x07\x1a" + + "\x87\xb1\x97\x7b\x78\xf8\x53\xaa\x52\xa6\x4a\x20\xe1\xac\xc2\xe8\x9f\x1e\xfd\x72\x00\xb4\x3d\x95\x3c\xa5\x67\xf0" + + "\xdf\xf3\xb2\x4a\x4d\x75\xf4\x60\xff\x81\x5a\x67\x69\x33\x87\x5f\x73\x63\xa9\x81\xfd\x39\xfa\x26\x51\xfd\x98\xa6" + + "\x44\x09\x93\x42\x57\xb2\x7c\xad\xaf\x6b\x48\x2b\x63\x94\x06\x7d\x14\xa8\x2c\xeb\x0b\x93\x9b\xa6\x2c\xec\x56\x45" + + "\x87\x41\x38\x3f\x1e\x4c\x1e\x54\x16\xf3\xf2\x02\x30\xca\x2b\xb3\xaa\x71\x24\xb8\xc2\xd8\x63\x14\x85\x49\xbd\x15" + + "\x73\xd6\x61\xb0\x09\x7f\x3b\x84\x8e\xb0\xcf\x2a\xe6\x2c\x2a\x7d\xec\xd3\xef\x5a\x72\x37\xaf\xf2\xa8\x04\x39\x45" + + "\x5c\xf0\x32\x03\x3a\x47\x47\x82\x29\x79\xc7\xae\xb4\xdb\xd8\x9d\xb5\x30\x2a\x37\x38\x83\x10\x38\xb7\xd0\xd5\x2c" + + "\x2b\xec\xf2\x8e\xfe\x8e\xbf\x47\x38\x20\x78\x5b\xac\x16\x45\x59\x2c\xaf\x28\x5b\xcc\x4f\x66\xf6\xf2\x6a\xd9\x53" + + "\xc9\xdf\x7b\x89\xda\x55\xcb\x62\xb5\x50\xbb\x2a\xe9\xf7\x8e\xb7\x97\x57\xfd\x53\xbd\xf7\xeb\x7f\x9d\xed\xfe\x21" + + "\x19\xa8\x24\x63\x2a\x64\xab\x99\x99\x06\x28\x72\xdd\x82\x2e\x8f\x34\x7a\x1d\xc1\xdf\x1c\xe9\x94\x19\x20\xf4\x1d" + + "\x14\x7e\x40\x58\x5a\x87\x0e\x29\x20\x8c\xaa\x5d\x55\xcf\x4f\x4e\x5c\x51\x58\x86\x09\xd5\x22\x8e\x3f\xec\xd8\x81" + + "\x5a\x64\xc5\xcf\xf4\x4b\x5f\xd1\x2f\x06\x03\xe5\x6b\x07\x7a\x09\x7f\xe0\xca\xbb\xda\x8e\x7c\xc5\x18\x29\x82\xa3" + + "\x0e\xa3\x6f\xc2\xcd\xf5\x35\x3e\x99\x99\xe6\x47\xc4\xa4\xbe\xc6\x30\xaf\xac\xc6\x5b\xa0\x30\x26\xb5\x57\x46\x59" + + "\x29\x20\xf8\x0f\xd0\xe8\xfd\xa0\x6f\xef\x87\x57\x2f\xbf\x1e\xa8\xda\x18\x75\xff\xe0\xd1\xe7\x8f\xbf\x64\x52\x14" + + "\x8d\x6e\x8b\x83\x23\xf1\xe9\x30\x6e\xcb\xdd\xf7\x37\x37\xae\x10\xf3\xbb\x7e\x03\x75\xd4\xec\xa8\x0f\x34\x60\x29" + + "\x4f\xd2\x8d\x0b\xfa\x09\x96\x6a\xec\x23\x7d\x59\x07\x8b\x0b\x9d\x8b\x8f\x07\xcf\x60\xf6\xf6\x44\x3d\x55\x5f\xd0" + + "\xe3\x67\x8a\x63\xfc\xc9\x57\x3b\xd1\x6b\x03\x69\xa6\xe6\x7a\x72\xa1\xce\xaf\xd5\x0b\xa3\x0b\xf5\x32\x5d\xeb\x2a" + + "\xad\x13\xfa\x8a\xea\x50\x3d\xdd\xa8\xdc\xe8\xba\xe9\x53\x28\x60\xad\x96\xa6\x9a\x98\xa2\xd1\x33\x8c\xde\xd2\x2a" + + "\xd7\xd5\xcc\x54\x0a\xd2\x3f\x93\xda\xb2\x26\xa9\xcf\x6e\x16\xbb\x1a\x0b\x50\x8a\x48\xf6\x67\x99\x5d\x99\x9c\x13" + + "\xd4\x36\xec\xc0\x37\xb3\x93\x83\xf1\x91\xcf\x4f\x4e\xde\xbe\x56\x69\xa5\xa7\x0d\x30\x06\x2e\x24\x2c\x35\x97\x0c" + + "\x9c\x3d\xa9\xeb\x35\xfc\xb7\x5c\x8c\xee\x57\xa6\x2e\xf3\x4b\x93\xee\x61\x0f\xfc\x4a\xf0\x81\x25\xc9\x19\xc3\x41" + + "\x77\x76\xf8\x9c\xb3\x40\x4d\x0c\x9e\xbc\x16\x02\x37\x6f\xc7\xf8\xfb\xfa\xb7\x70\x80\x47\xc8\x7d\x0d\xe1\x2f\xa4" + + "\x64\x7c\x66\xdc\x3b\x7e\x40\xaf\xe9\x20\xf9\xd7\xf4\x40\x7a\xf7\xae\x1a\x4e\x9e\x6d\xe9\x0c\xb6\xca\x7c\x86\xf6" + + "\xfb\x8e\xf8\x00\x44\x26\xdd\x0a\x5b\x6b\xd5\x1f\xf6\x15\x01\x91\x0e\xc5\x6e\x73\x27\x62\x1d\xf5\xe6\x27\x03\xe1" + + "\x17\xde\x42\x94\xca\x79\x08\xeb\x14\xf3\xd0\xea\x4e\x38\x0f\xad\xce\x89\x79\x90\x01\xdb\x1e\xb0\x36\xca\x66\x72" + + "\x1c\x6f\x7e\xbc\x9b\x2c\xeb\xf0\xd2\xed\xd8\x5f\x5f\x81\xe6\x1a\x27\x4a\x83\x61\x2f\x2b\x1a\x33\x33\x98\xa3\xc3" + + "\xd6\xba\x6b\x0f\x6a\x1c\x22\x2c\xa5\x89\x34\xfd\xa3\x69\xbe\x2f\xcb\x8b\x57\x53\x70\xa6\x4e\x33\xfb\xfc\xbb\x62" + + "\x00\x89\xab\xbf\x63\xfd\x37\xc4\x4a\x4c\x99\x65\xb3\xaf\x06\x6a\x6d\x1e\xe4\x39\x9a\x03\x98\xbd\x44\xdd\x51\xb5" + + "\x2a\x00\x05\xbf\x79\x60\x19\x61\x9d\x3b\xda\x36\xf4\x43\x06\x52\x30\x33\x1d\xf8\xe9\xce\xaf\x9b\xbb\x22\x32\x69" + + "\xd8\x7e\x40\x5e\x36\xc8\xd9\x87\xf4\xb2\x57\x56\xd8\x14\xa8\x5d\x38\xf3\x53\x53\x52\xfa\x3e\x95\xae\xe0\x2f\xce" + + "\x2b\xe9\x35\x38\x24\x8c\xdb\x3a\x09\x61\x2f\xe3\x64\x33\x76\xe6\x81\x9d\x47\x2b\x99\xae\x20\x9b\x7b\x09\x99\xe4" + + "\xe7\x90\xb8\xcd\x92\x08\x3c\x67\x3f\x59\xa6\x67\xc0\x55\xd8\x59\x58\x43\x4a\x6a\x94\xf4\xa8\x42\x72\x37\x05\x49" + + "\x76\xc6\x5b\x53\x20\x30\x04\x46\x7e\x1c\x21\x8c\xee\x50\x55\x06\xf7\x84\x1d\x4a\x5d\xa2\x29\x06\x78\x47\xc2\x25" + + "\xb2\xa7\x9c\xb3\xe5\xa0\x42\xcf\xa4\x48\x70\x86\x54\x23\xcd\x78\x8f\x1b\x57\x47\xb4\xb6\xfd\xdb\xd1\x09\x1d\x7c" + + "\x32\xee\x99\xd8\x91\xc3\xde\xa4\x40\xed\x7e\x2c\x6b\x58\xa9\xbf\xe8\x7c\xa0\xce\xcb\xab\x93\xec\xd7\xac\x98\xfd" + + "\x84\x14\xd1\xfc\x85\x5c\xc5\xd3\x12\x42\x1d\x05\xdf\x1d\x33\x84\x84\x63\x44\xa1\x26\xb2\x60\x24\xb3\x42\x28\x13" + + "\xe9\x52\xd2\xec\xf2\xee\x92\x21\xef\x7e\x89\x97\xce\x26\x18\x0c\x57\x60\x78\xae\x27\x17\xb3\xaa\x5c\x15\xe9\xf3" + + "\x3c\x5b\xaa\x23\x95\x10\x13\xb9\x77\x5e\x5e\x81\x8b\x8f\x2d\xdb\x0a\x80\xde\xf8\x35\x7c\xe2\x2c\x5c\xb9\xd1\x15" + + "\xe8\xe9\x4f\x88\xd7\xd8\xdc\xf0\x51\xbb\x69\xe0\x45\x68\xaa\xe8\xab\x49\x5d\xbf\x33\x57\xe0\x7f\x84\xec\xf9\x78" + + "\xff\x10\x48\xd6\x78\xff\x10\x59\xf3\xf1\xfe\x61\x53\x2e\xc7\xfb\x87\xb9\x99\x36\xe3\xbd\xaf\xbf\xfe\xfa\xeb\xe5" + + "\xd5\x21\x6e\xe3\x3d\xfb\xe6\x60\x79\x75\x98\x28\x48\xda\x94\x2c\x69\x59\xc7\xfa\xbc\x2e\xf3\x55\x63\xa0\xfb\xbe" + + "\xd1\xc0\x61\xd5\x2e\x83\x67\x7a\x5e\xc2\x3e\x04\x79\xb9\x6c\xe6\xe1\x2e\x51\x3b\xed\x3d\x02\x9b\xd8\xc1\x22\xb1" + + "\xf6\xc0\xa8\x5c\x5f\x23\xfd\x47\x59\xb5\x99\x9b\xeb\x07\x2e\x68\xc3\x6e\xf3\xc6\xa7\x28\x02\xe8\xfb\xa6\x54\xb5" + + "\xa6\x53\x58\x1b\x4b\x43\x88\xf2\x83\xe8\x6d\xcf\xa2\xe7\x15\xf1\x46\xf8\x51\xf6\xed\x59\x91\x7e\x1b\xf7\xad\xe7" + + "\x84\xbc\xcb\x78\x9e\x5b\x02\x04\x89\x25\x4f\x1f\x7d\x3d\x70\xc9\x51\x1e\x0d\x1f\x73\xb9\xbf\x98\x22\x2d\xab\xbd" + + "\x65\x65\xa6\xd9\x95\x9d\x85\xbd\x1a\x9a\x82\xf7\xc9\xde\x1a\xe4\x9b\x3d\xff\x7c\x8c\xcb\x68\x9f\x1c\xee\x2d\xca" + + "\x5f\x37\xbc\xa2\x05\xdb\x4a\xba\x5f\x93\x1c\x30\x3e\xcf\xcb\xc9\x45\xb0\xd8\xff\x75\x48\xff\x88\x1a\x60\xdf\xd8" + + "\x6d\xb0\xd4\x69\x6a\x6b\xb2\xbf\x71\x17\x3d\xb1\x4f\x3b\x37\x05\x4c\x8e\x74\x58\x21\x07\x38\x3a\xf3\xed\xf0\x44" + + "\x3c\xe1\xd2\x84\x9e\x66\x97\x27\x2d\x55\x4f\x24\x01\xa4\xd9\xa5\x14\x00\xb6\x62\xea\x83\x67\x08\x0a\x0f\x9b\x72" + + "\x89\xf8\xc6\x07\xff\x85\x7d\xe9\x22\x4c\xf2\x03\xba\xe4\xed\x27\x4f\x96\x7c\xc4\xdc\x08\x02\xa7\xc8\x70\x04\x1e" + + "\x7b\xc5\xed\x03\xd0\xb9\xff\x52\xab\x5f\xea\xb4\x5c\xd0\xed\x09\x92\xaa\xae\xeb\x95\xdd\xa6\x96\x88\xc7\xe3\x43" + + "\xb5\x14\xa5\xab\x71\x39\x55\x51\x95\x1f\xe5\xaa\xd9\x30\x43\x4c\xd1\x22\x60\x16\xa2\x38\x03\xba\x43\x83\x59\xeb" + + "\x82\x0f\xe7\xc8\x13\xbe\x59\xdc\x71\xa3\x73\x39\x31\xc8\x04\x1b\x55\x37\x59\x9e\xab\xb4\x04\xef\x28\xbf\x95\xbd" + + "\x36\x8c\xfc\xd4\xd8\xc7\xa8\x7d\xf0\x97\x95\xd9\xc3\x93\x98\x15\x33\x7f\xf9\xbe\x29\xe1\xfe\x03\x8b\x23\xf0\x17" + + "\x94\xd9\x00\xba\xb4\xb6\xac\x0e\x81\x49\x11\xc6\x82\x49\x07\xaa\x99\x97\xab\xd9\x9c\xea\xf8\xf4\xd3\x1d\xa2\xf6" + + "\xc6\x5b\x8a\xee\x66\xe4\x14\x5a\xdd\xdf\x98\x7f\xb0\x7b\xb3\xc5\x89\xa8\x7f\x7f\x2f\x3f\x06\x9d\xed\x6a\x25\xe8" + + "\x30\x49\x25\xe6\xb5\x67\x54\x36\x2c\x78\x2b\xa7\x13\x93\x2d\x08\x96\xe3\x25\xb0\x54\x1e\xfc\xa3\x38\xd1\x12\x49" + + "\x42\x98\xeb\x97\xf8\xa1\x3d\x0c\x9a\x15\x66\x6f\x57\xd1\xcc\x34\xb5\x67\xf0\x83\xe2\x2e\x0d\x11\xd6\x58\x4e\xfd" + + "\x29\x1b\xaa\xde\xfd\xc7\x8f\x1f\x3f\xee\xbb\x7a\xd0\x04\xa1\xbe\x5d\xcd\xd4\xc1\xe3\xc7\x4f\x1e\xab\xbd\xf6\x69" + + "\x62\x26\x79\x5d\x95\xc5\x8c\x78\x64\xcf\xb4\xed\xf9\x5c\x92\x6e\xbf\x33\x47\xe5\xae\x08\x16\xcc\xc5\x01\x98\x40" + + "\x4e\xd1\x42\xec\x78\xe0\xbd\x1c\x77\xdb\xca\x29\xb2\x85\xed\xbd\x40\x36\x25\xbb\x8c\xae\xcd\xdb\xf9\x96\xd8\x11" + + "\xd9\x8a\xa2\xcf\x4f\x4e\xc6\xe2\xee\x38\x74\x7a\x1e\x1a\xd9\xa1\x42\x22\x7e\xa8\x88\x82\xe3\xf7\xae\x1b\x2d\x66" + + "\x61\xd3\xc5\xf6\xe9\x57\xdb\xdd\x97\x5b\xf7\xf5\x26\x58\x9a\xd6\xfd\x26\xdf\xf1\xf5\x14\x5e\x71\xb2\x44\xd7\x1d" + + "\x37\xde\x3f\x74\x6c\x10\x5f\x66\xfb\x1c\x50\x1c\x4f\x87\x60\xe5\x41\x5a\x0b\xdf\xb2\x00\x98\xb8\xef\xd3\xf6\xbb" + + "\x03\xbc\x35\xc8\xce\xff\x29\xf7\x1e\x0b\xa7\xdb\x4b\x5d\xd5\xe6\xbb\xbc\xd4\xcd\x46\xda\xde\xf3\x9d\xe2\x3b\x30" + + "\xe8\xb4\xaf\xf3\x13\xae\xac\x80\x8a\x38\x49\x59\x46\x78\xdc\xfb\xec\x63\xbf\xc7\x96\x35\xd0\xb6\x90\x6d\xc0\x1e" + + "\xa1\x7f\xae\xb2\xc9\x45\x7e\xad\xea\xb5\x5e\x2e\xd1\xc5\x14\xf2\x10\x3d\x3f\x39\x91\xe9\xd6\x48\xa4\x67\xa5\xe6" + + "\x84\xb2\xfd\x67\x65\x51\x0f\x9d\x71\xd8\xd6\xd1\x91\xe5\x90\x90\x95\xbc\x7f\x14\x7b\xdd\x49\x18\x30\x52\xf1\xd9" + + "\x6e\x97\x00\x5c\xc6\x5e\xbd\x2d\x15\x47\x9e\x3a\xfd\x8d\xa5\x55\x64\xa0\x65\x15\x44\x59\x80\xb8\x8f\xb6\x56\xd0" + + "\x97\x64\x05\xf7\x80\xa9\x75\x99\xa7\xc2\x30\xec\xd5\x82\x52\x7b\xb6\xd5\x7e\xac\x8e\xb8\xa2\xb6\x9a\x8d\x34\x13" + + "\xec\x60\x42\xb2\x18\x8e\x1f\x06\x7b\x73\xa3\x4e\xcf\x04\x5b\x2d\x74\x15\x7e\x44\x77\x75\xbc\xbb\x4f\x79\x87\xda" + + "\x2f\xd8\x0f\x1f\x03\x04\x63\x7b\xa1\xdb\xc5\x86\x3b\x1b\x2e\x02\x54\x7f\x83\xdc\x59\x18\x55\x56\xaa\x6e\x74\xd5" + + "\xd4\xe4\x3e\x0b\xe5\xd0\xc9\x98\xb1\x48\x19\x94\x74\x6f\x62\xf2\x3c\x19\xd8\x4f\xf8\x01\x22\xaf\x26\xd4\x8e\x11" + + "\x10\x4a\x81\x4d\x88\xd0\x93\x6a\xd4\x95\x99\xdc\x6e\xb4\xe1\xa2\xfc\x35\xcb\x73\x0d\x6a\x33\x53\xec\xfd\xf9\x64" + + "\x94\x96\x93\x7a\xf4\xfc\xe4\x64\xe4\xb5\xe7\x15\xfd\xa4\xcd\x36\xfa\x7b\xcf\xf6\xfa\x06\x9a\xef\x1d\x6f\xef\x4d" + + "\x4e\x8d\x3e\xeb\x0f\x19\x3b\xb9\x58\x2d\xea\x65\x9e\x35\x77\x69\xc2\x87\x0f\xfb\x4e\x01\x0e\x1f\x56\x26\x7f\xb3" + + "\x5a\xb4\x3f\x3b\xdd\xdd\x3b\xeb\x1f\x85\x5f\x8b\x0f\xad\x58\x55\xd7\x27\xf3\x72\x6d\xf7\xb0\x72\x3c\xb6\x4a\x1c" + + "\x97\x3d\x50\x97\x59\x4d\xb0\xb2\x63\x95\xcc\xb3\x34\x35\x45\x32\xe0\x09\x1a\xab\x04\x48\x5f\xa2\xe0\xe6\x9f\xd4" + + "\xf5\x1b\x48\xbd\xff\xae\xd2\x45\x6d\x19\x24\x4e\x9f\x93\x83\xfd\xf2\x64\x09\x0e\xd0\x63\x4b\xd0\x28\xab\x76\xd1" + + "\xfc\x8c\x22\xa2\x4a\x9e\xec\xef\x27\x22\x42\xa5\xae\x7f\x04\x9a\x8e\xf0\x34\x2a\x41\x33\x8c\xed\xfe\x5b\xfb\x9f" + + "\xd7\xe5\xaf\xf6\x9f\x45\x9d\x90\x8d\x0c\xd4\x29\xe8\x22\xac\x26\x75\xed\x39\xda\x85\x86\x74\x6b\x80\xb3\xb2\x2c" + + "\x2d\xed\xce\x40\x37\x74\x09\x37\x87\xc2\x9b\xc3\x67\x6c\x94\x46\x6f\x2c\xf2\x63\x55\x2e\x11\x29\x0f\x2d\xdc\xac" + + "\xdb\xfc\x8d\x0f\x88\x0b\x84\xb0\x7b\x07\xf0\xed\x91\xd5\x46\xfd\x4d\x13\xb7\xe4\x70\xe7\xe8\xe4\x74\xa8\x05\xe0" + + "\x5d\xc0\xe4\x23\x3f\x6a\x1b\x88\xfb\x0d\x0d\x12\x75\x9a\xe8\x25\x01\xe9\xd9\xa7\xa7\xfb\x67\xc3\xa6\xfc\xf3\x72" + + "\xe9\x42\x20\x76\xe1\xf9\xb0\xce\xb3\x89\xe9\x1d\xa0\x2a\xa3\xac\xb2\x99\xf8\x08\x9e\x41\x3e\x7e\xbf\x02\x81\x2f" + + "\x63\x47\x5e\xfe\x02\x3f\x17\x5f\xa0\x7f\xc7\x2e\x77\xc8\x03\x36\x75\x0e\x3a\x1e\x75\x5b\x55\xc9\x9d\x3c\x8c\x51" + + "\x1b\x6b\xd3\x20\x0b\x7b\x69\xde\xac\x2c\xe5\x65\x52\x46\x4e\xfe\xf5\xea\xbc\xa9\xf4\xa4\x89\xd1\x6c\x61\x5b\xb9" + + "\x23\x17\x06\x93\x08\xa8\x5c\x2e\xcb\x8a\xd1\x3f\xae\x20\xc6\x9b\x14\xeb\x5e\x71\x9a\x70\x3b\xc9\x40\xa1\x23\x3b" + + "\x20\xf6\x81\x57\x82\xae\xc1\x01\xb3\xae\xbf\x2f\x4b\x8c\xe2\x78\xad\x9b\xf9\x70\xa1\xaf\x7a\x6a\x7f\xc0\x4d\x20" + + "\xb4\xcc\x9e\xea\xf9\x2e\x53\x16\x26\xbb\x6c\x3d\x5f\xec\x11\x86\x92\x24\xcb\x2b\x07\xff\xc8\x81\x1a\xe1\xd4\xe8" + + "\x15\x38\x6b\x82\x02\xf8\x6d\xf5\x3d\x9c\xb3\xd0\x48\x65\xae\x9a\x4a\x0f\x54\x56\x7f\x0b\x1c\xcb\xb7\xe5\xd5\x00" + + "\x17\x26\xc6\xbc\x85\x82\x20\xa5\xf6\x64\x69\x75\xcc\x3a\x9f\x44\x8d\x9d\xae\x28\x61\x10\x49\xb4\x38\xaf\x9d\x1d" + + "\x98\x00\xcf\x1d\xc0\xcd\xc2\xe8\x7a\x55\x11\x0e\x09\xe2\x0b\x50\x9f\x9d\x43\xe7\x13\x1c\xe0\x68\xa4\xde\x36\x73" + + "\x53\xad\x33\x88\x30\xca\x1a\x02\x0f\xb2\xe7\x61\x5e\x56\xd9\xaf\x96\xcf\xc8\x15\x9c\x8e\xaa\xc9\x26\x3a\x17\x1c" + + "\x81\xdf\xa1\x56\xca\x06\xc6\x29\x51\xc7\xea\x40\x8d\xc1\x11\x9e\x26\xd0\x7b\x3f\x49\x4f\xd8\x27\xf6\x9f\xdd\x23" + + "\xf5\x88\xb7\xea\x68\x84\xca\xa5\xf3\xf2\x4a\x2d\xca\xd4\xe4\x56\x50\x9d\xe4\xab\xd4\x10\xa7\x34\xb0\x9c\xba\x4e" + + "\x53\x95\x35\x14\x32\xb5\xd6\x45\xa3\x84\xbb\xba\x9f\xcc\x04\x3f\x49\x44\x28\x58\x6e\x5b\x8b\xdd\x2f\x68\xa5\xec" + + "\x79\xaa\xeb\x97\x00\x0d\x40\xde\xa0\xe8\x45\xcb\x6b\xd6\xf2\xe1\x96\x6b\xc5\x6d\xc0\x08\x58\x4d\x63\xe5\x25\xdb" + + "\xf9\x9a\xd9\x76\xe8\xbe\xd3\x4b\xcb\x11\x48\x38\xa2\x78\x1c\x62\xe5\x9d\xc3\x7b\xae\xf6\xba\x46\x92\x50\x43\xc9" + + "\xa7\x8d\x46\x2a\xa8\x41\xef\x96\xd5\x0a\xd2\x3a\xf2\x9c\x64\x90\xe3\x16\x47\xa4\x0a\x27\x69\xc9\x71\xe0\xcb\xb8" + + "\xe3\xdb\x5d\x0b\x70\x4b\xbf\x79\xa3\xc7\xdd\xb6\xd7\x2a\x9c\xb1\x64\xe3\x00\x22\x9f\xc9\xdb\x87\x42\x73\xe9\xf6" + + "\x91\x94\xa7\x36\xee\x8f\xdf\x35\xab\x9f\xde\x09\x98\x50\xb9\x33\x6c\x87\x6e\x99\x4e\xd7\x8b\x60\x3e\xbb\x7b\xfc" + + "\xef\xcd\x67\x7c\x41\x5c\x82\x0e\xa2\x85\xe8\x7b\x17\xf1\x93\xd7\xf8\x89\x65\x25\x91\x93\x2c\xa7\x53\x2b\xf4\x32" + + "\x4b\x60\xa9\x79\x36\x99\x83\x56\xea\x9f\xab\xec\x52\xe7\x94\x05\x1f\xb5\x4b\xee\x30\x01\x1d\x26\xb2\x09\xbf\x5f" + + "\x89\xf3\x77\xe4\x53\xcb\x23\xb9\xe9\xa0\x49\x68\xc6\x86\xc6\xd1\x84\x37\x96\x8f\x70\x14\xde\x51\x80\x30\x12\x43" + + "\x17\x00\xbc\xbf\x83\x76\x3b\x27\x9f\x74\x38\x89\x0b\xcf\x70\x84\x1f\xba\xe4\x47\x95\x38\x41\x00\xcc\xdc\x0e\xba" + + "\xce\x01\x4e\xd1\x0a\xf8\xcb\xd0\x12\x50\x31\x08\xd8\x38\x9e\x7f\xb1\x52\xe4\xc8\x15\xa6\x9a\x2f\x67\x6a\xcf\xb1" + + "\xd9\xe7\xab\x19\x72\xd7\x92\xcb\xae\xe7\xe5\xfa\xc3\xf9\x6a\x36\x9c\xcc\xb2\xe3\x2c\x3d\xfa\xe2\xc9\xd7\x8f\xbe" + + "\xfa\x9c\x13\x53\x37\xf3\xd7\x3f\xfc\xde\x1a\x9e\x7c\x7d\xf0\xc5\x17\x5f\x31\x37\x66\xd7\xe4\xe9\x91\xda\xb7\x77" + + "\xeb\x65\x5b\x6d\x06\x28\xbe\x79\xae\x20\x68\xa6\x29\xbd\x3a\xa9\x81\x7b\xbe\x70\x7f\x5b\xde\x33\x9b\xaa\xc2\x4c" + + "\x4c\x5d\x6b\xc4\x8c\xc2\xf5\xee\x72\x13\x09\xb6\xb6\xef\xc7\xc6\x6e\x50\x55\x1b\x04\x41\x89\x80\x4a\xdd\x59\x15" + + "\x99\xb3\xd3\xa1\x93\xc0\x50\x9d\x34\xe5\x12\x85\x1d\x2b\x95\xe2\xf2\x0d\xef\x6d\x30\xf0\x5f\xea\xbc\x15\xf0\x74" + + "\x49\x0a\x3f\xdf\xde\xda\x90\xe6\x94\xa1\x98\x31\xdf\x01\x2a\x98\x0b\x35\xd1\xb5\x51\xda\xa7\x82\x85\xd3\xc4\xaa" + + "\xb2\x55\xc1\x0a\x43\x61\x03\x1f\x8d\xa0\x86\x96\x7e\xad\xce\xec\xd9\xcb\xaf\x21\x70\xb4\x76\xcb\x01\x4c\x05\xd7" + + "\xe2\x67\xc7\x31\x47\xe1\x41\x94\xc7\x83\xfc\xfc\x9d\xbe\x7a\xd8\x52\x6f\xf6\xfa\x7e\x31\xba\xa6\x5e\x7a\xd8\xa1" + + "\xfc\x63\x59\x93\x24\x19\x28\xbd\x6a\xca\x01\xc7\xf3\x2e\x35\x49\x97\x40\x78\xfc\xb6\x90\x5a\x98\x4b\xf0\x0b\xb7" + + "\x7c\x5f\xc0\xfc\xb3\x22\x5b\x4f\x2c\x9f\x2b\xb4\x5c\xc8\x82\x80\x6c\x93\xa6\x23\xc7\x38\x66\x56\x24\x34\x97\xf6" + + "\xd6\xc6\x0d\xe6\xe9\x24\xb6\x01\x8a\xad\x4e\xfe\xf0\x1e\xfb\x77\x13\x3e\x28\x4b\x04\x5b\x48\x2e\x21\xcb\xdb\xa7" + + "\x70\x80\x22\x4c\x50\xcc\x3d\x85\x18\x72\x9f\xb6\xfa\xf7\x3e\xdb\x82\x5c\x15\xa8\xc4\x8a\x58\xfb\x79\xb9\xfe\x3e" + + "\x63\x04\x4b\x0c\x7a\xb5\xcf\xa4\x47\x25\xca\xa1\x8c\x24\x86\xf2\xe9\xc0\xad\xba\x40\x36\xc5\x68\x3b\x97\xbd\x81" + + "\x42\xc8\x5c\xcd\xdd\x59\x1c\xe0\x9b\xa7\xca\x61\xeb\xda\xbf\xbd\x1b\xbc\x80\xf8\x20\xd8\x5c\x28\x2f\xd2\x3b\x6d" + + "\xfb\xcd\xe2\x8e\x50\x00\x8a\xf7\xd1\xb1\x9f\x2b\xe3\x2b\x08\x90\xc3\x44\x2a\x96\xa4\xcc\xd3\xc0\x03\x37\xf6\x1f" + + "\x1d\x06\x7e\xbc\xbe\x1f\x62\xd6\x84\x4a\x17\x73\x0b\xe6\x59\x61\xa4\x17\x3a\x70\x04\x1c\x95\xdc\x94\x2a\x37\xba" + + "\x22\xbf\x0a\x81\x21\x88\xb1\x66\x38\xdf\xea\xfc\xda\x1e\xf0\x89\x4e\x4d\xaa\xaa\x95\xa5\x67\x96\xcc\x97\x82\x55" + + "\xdc\x8e\x47\xb8\xb3\xd3\xe5\x50\xea\xb8\x86\xf6\x60\x42\x78\x0b\xee\xc6\x89\x11\x19\x56\x90\xaa\x80\x8c\x01\xc9" + + "\x3e\xca\x4b\x53\x55\xd8\x43\xb8\xd4\x9d\xd2\xa2\x20\xd0\x67\xf0\xcc\x2a\x00\x81\xd4\x6e\xc8\xb9\x31\x30\xe2\xf5" + + "\x5c\x37\xe6\x92\x74\x78\xec\x13\xc9\xa4\x8b\x48\x9a\x9b\x08\x20\x73\xab\xc9\x3c\x70\x1b\x0e\x82\xf4\xa3\x61\x38" + + "\x27\xb6\xac\xfe\x1e\x3a\xd7\x86\x9c\xbb\x6d\x3b\x70\x00\x52\x7b\x47\x0c\x62\x17\x64\x07\x11\x60\x05\xe7\xfe\x66" + + "\x76\x94\x56\xf1\xa8\xd5\xa3\x20\x12\x93\x07\xb0\x1d\xfa\xff\xd2\xc7\xae\xef\x51\x12\x8d\xae\x6e\xd2\x27\xc7\x6a" + + "\xb3\xbf\x79\xe0\x6a\xbe\x81\xf1\xa3\xe5\x87\x45\xf2\xdb\x77\x51\xd6\x4d\xe4\x32\x5e\xd3\x22\xa3\x61\x3e\x2f\xcb" + + "\x25\x7e\xed\x40\xed\xd0\x07\xb6\xa8\x1b\x4b\x30\x2b\x33\xcd\x21\x4d\x39\x45\x9c\x31\xdd\xf8\x5f\x22\x07\x0e\x57" + + "\xde\x1e\x59\x06\x8b\xef\xd8\x42\x6e\x05\x36\xef\x31\x19\xad\xd3\x3a\x4c\x50\xff\xb1\x8a\xb7\x1a\x46\xbf\x8d\xa9" + + "\xfe\x6e\x5d\x0c\x8f\xf0\x70\x63\x46\x00\x02\x73\x76\x6a\x1e\xa7\x8b\xf3\x4e\x4c\x74\x38\x21\x3b\x95\x3f\x66\xf8" + + "\xed\xb9\x99\xeb\xcb\x0c\x98\x48\xcb\x00\x80\x47\x07\x84\x2f\xf0\xef\xa8\x5a\x54\x17\x82\x76\x65\x4c\x6a\xf3\xa5" + + "\x9e\x80\xca\x12\x67\x20\x74\xf8\x62\xb8\xf2\xc8\x87\x75\xab\xdb\xb5\xd5\xc1\xed\xd7\xf3\x72\x95\xa7\x4a\xa3\xcb" + + "\x38\x7a\x0d\x16\xa0\x72\x42\x2e\x04\xdc\xe7\xa9\x61\xfa\x50\xe4\x0d\x09\x78\xbf\x84\x8a\x25\x3e\xf2\x4d\xb8\xe4" + + "\xd1\xf2\x1d\xab\xe4\xc0\x2e\x85\x33\x94\xb4\x92\xaf\xb8\x5c\x72\x64\xe5\x5f\x35\xe5\x42\x83\xf6\x23\xbf\x06\x49" + + "\x0d\x74\x44\xc8\x1d\xd5\x86\x9d\xd4\xae\xf7\x2c\x4f\x98\x1b\xaf\x23\x45\x1d\xc9\xa4\xae\x51\x83\x46\xb3\x96\x4c" + + "\xca\x7c\xb5\x28\x9e\x97\xab\xa2\x49\xc6\x5e\x78\x49\xa6\x59\x9e\xbf\xa5\x01\x04\xcf\x73\x73\xf5\xc7\xaa\x5c\xb7" + + "\x1e\x9e\xcc\xab\xac\xb8\x08\x1f\x3b\xcd\x6f\xf0\xd8\x5e\x46\xdf\xb7\x1f\x97\x1d\xad\x21\xd3\x11\x3e\x59\xce\x75" + + "\x51\x07\xcf\xd6\x59\x5a\xae\xc3\x47\xe8\xbe\x18\x3e\x2a\xcb\x05\x3d\x08\xe6\x95\x36\xb1\x30\x2e\xad\xe7\x65\x6d" + + "\x48\xc7\x7b\x5d\xae\xd4\x3a\xab\xe7\x80\x44\x9b\x5d\x29\x0c\x15\x64\x73\x02\x6e\x55\x64\x61\x1b\xde\xe6\x2c\x20" + + "\x82\xa6\xb4\x5c\xf2\x76\x1d\x8d\xac\xa0\x4d\x8c\xe3\xd4\xb2\x82\x81\x0a\x9b\x26\xb2\xd4\x76\x56\x92\x49\x5d\x03" + + "\xb7\x98\x04\x5d\xfd\xa3\x69\xf8\x8c\xa0\x1b\x52\x78\xf0\x4a\x4b\x01\x5f\xbc\x7d\xad\xde\x20\xc8\x38\xbc\x6e\x9f" + + "\x09\x14\x4a\x48\x75\x2a\x04\xe4\x2d\xbf\xcb\x6c\x03\x24\xb5\x94\x05\x02\x97\x6b\xf4\x77\xf2\x10\x36\x21\xc5\xeb" + + "\xce\x79\xf1\xb8\xfb\xf1\x57\x70\xab\x74\x10\x4a\xe1\xb4\xf8\x31\x84\x59\xa9\x57\x15\xf9\xb6\xac\xcd\x83\xca\xa8" + + "\x75\x59\x5d\xd8\x09\x77\x90\x2a\xa8\x6d\x2c\x28\x9a\xc5\x59\xf1\x10\x78\x14\x48\x12\xf2\xa5\x42\x13\xce\x17\x92" + + "\x5e\x98\x1c\x74\xe7\xa4\xf4\x17\x0c\x6c\x87\x9b\x3e\x2b\xc2\xfd\x75\x06\xab\x7c\xea\xd4\xd7\x48\x61\x7b\xb7\x16" + + "\x38\xda\x64\x76\x70\x65\xfa\x52\xe2\x00\xe7\x06\x3b\x08\x07\x22\xe0\x2c\x03\x97\xa6\xaa\x49\x8f\x0a\x9c\x4a\x9e" + + "\x97\x6b\x93\x5a\x76\xcd\x16\x5b\x15\x5d\x05\x91\x42\xcb\x21\x00\x5d\x75\xb2\x8e\x0b\xcd\x11\xaf\x7c\xe7\x7d\xb7" + + "\x9c\xf3\x06\xae\x89\x27\xdd\x7c\x04\x24\x64\x55\xe8\x84\xcc\x2b\x4e\xd9\xe2\x24\x7e\x87\x50\x5e\x4d\x08\xc1\xbe" + + "\x32\xb9\x06\xa9\x88\x68\x31\x82\x7b\xd4\xaa\xb7\x7b\x64\x4f\xdf\xde\x51\x1f\x13\xef\x04\xa5\xea\xa1\xba\xff\xe5" + + "\xe3\x27\x9f\x7b\xf6\xa6\xe1\x0d\x28\xb1\xa9\x7a\x48\xbc\xc9\xc0\x16\x1a\x09\x62\x7e\x0d\x41\xea\x4d\x73\x7a\x70" + + "\xa6\x76\x01\x98\xe2\x21\xfc\xf9\xc8\xfe\x29\x65\xbc\x36\xaf\x53\xf8\x45\xdd\x92\x18\xe6\xe7\xab\x99\xba\xff\xf5" + + "\x23\x08\xbb\xf0\xf3\x91\xe0\x10\xda\xcc\x70\x74\x18\x40\x6d\x60\x8f\xe6\x1b\xfd\x86\xdd\xdd\x75\x65\xe8\x0c\x0f" + + "\xd5\x89\x31\x63\x75\xff\xcb\x83\x83\x2f\xfc\x2c\x30\x48\x0a\x7e\x8c\x52\x2f\xad\x4f\x88\x59\xb6\xc9\x87\xf8\xd5" + + "\xd4\xdf\x8a\x6b\x5d\xab\xa5\xae\x6b\x00\xa3\x18\xc0\x85\xf4\x60\x79\xf5\x80\xc5\xf5\x1e\x19\x6a\xed\xb6\x65\x74" + + "\x8a\xd0\x94\xdf\xef\x5a\x1e\x1a\x7d\x10\x06\xc2\x37\x57\x70\x8e\xa2\xe5\xd9\x3d\x62\x29\x33\xec\x31\xc1\xc5\x7f" + + "\xf5\xf5\xfe\x57\x03\x06\xd6\x38\x87\x98\x46\xa3\x20\x3a\xd3\xc3\x68\x9c\x5f\x53\x4c\xe5\xb5\xdd\xca\x35\xd8\x34" + + "\x03\xdb\x8e\x0b\xca\x3c\x5f\x35\x10\x92\x09\x1c\xc3\xc2\xe8\x02\xe3\x0f\xc1\xa1\x1a\xae\x37\xd5\x03\x4d\xc0\xa5" + + "\xa9\xae\xed\x80\xcf\x73\x03\x37\xb7\x23\xd8\x7d\x95\xa5\xa6\x40\x4b\x06\x13\x69\x01\x15\xbe\xbd\xc9\x9d\x77\x67" + + "\x47\x02\xdd\xc0\x2c\x81\xc5\x0f\xf8\xbb\xb7\xd3\x9e\x4a\xbc\x93\x6f\x42\xba\xbe\x7d\x01\x89\x12\x19\xec\x93\xac" + + "\x98\x9b\x2a\x6b\xda\xd3\x06\x0b\x0d\x64\x07\x96\xb9\x2a\x2f\xb3\xd4\xa4\x8c\xeb\xa5\x1b\xbe\x44\x4a\x67\xb6\x01" + + "\x84\x38\x77\x3d\x61\x6c\x2a\x87\x3d\x88\x91\x21\x01\xb2\x97\x40\x2f\xa9\x4d\x93\xd8\xf9\x85\x67\xa0\x17\xe9\xf1" + + "\x59\x83\x47\x52\xc6\x08\x2f\xad\xfe\x06\x9a\xd2\x1a\xa1\xc0\x38\xa3\xd1\xc5\xaa\xfa\xee\x91\x02\x03\x08\x9e\x1c" + + "\x65\xb1\x17\x05\x8f\x70\xba\xa1\x4a\x8c\x0b\x87\xb5\xb3\xa3\x92\x99\x1c\x94\xa0\x32\x38\x22\x21\xee\x93\x5e\xf6" + + "\xae\x11\x75\xf8\xd3\x70\xd7\xdf\x86\x93\xcf\x5d\x0e\x7b\x49\xac\x82\x73\xf5\x74\x35\x76\xea\x17\x85\x7d\x7e\x13" + + "\xfb\x40\x56\xc5\xc0\x90\xc8\x2a\xf1\x81\x25\x0e\xbf\xf7\xd2\x3d\xfc\xb7\xee\xfb\xff\x99\x3b\xd9\x5f\xfd\xff\x0f" + + "\xbb\x98\xef\xd8\xce\xb7\x6e\xe5\x5b\x77\x72\xa8\xa1\x6e\xed\x66\x34\xe5\xd0\x66\x8e\xd8\x38\xb7\x4f\x07\x96\x63" + + "\xd0\x32\x02\xbc\xa3\x4f\xe6\x2a\xab\x9b\xda\x93\x1a\xc9\x4c\x44\xe8\x97\x61\x9f\xee\x54\xc0\xbb\x1e\x31\x73\x91" + + "\x20\x5b\x9e\x04\x1a\xff\x16\x07\xc3\x12\x39\x16\x25\x92\x4b\xf7\x42\xec\x10\x13\xf5\xa8\x55\x60\x83\x3e\x1f\xd3" + + "\x4e\x0d\x98\xeb\x01\x79\xa2\xe4\x8b\x36\x9b\xda\x2d\x36\x31\xa9\x82\x00\xc2\x7f\xae\x74\x6e\x69\x6b\x15\xae\xb0" + + "\x65\x05\x6c\xab\x39\xac\x56\xb1\x5a\x98\x2a\x9b\xdc\xeb\x30\x4a\xa3\x5a\x41\x32\xff\x5b\x05\xb8\x17\xb5\x34\xd5" + + "\x87\x92\x5c\xf8\x1a\x20\x1e\xc5\xef\xc7\xcc\xde\xce\xb6\xb1\x9e\x6d\x55\xf5\xd5\x31\xfc\x0b\xde\x0d\x63\x69\x4b" + + "\x88\xed\x0b\xdd\x90\x2e\xa7\x2a\xc1\xb0\x92\x64\xe0\x2c\x67\x67\x12\x67\x25\x93\x1e\x3a\x5b\x9b\xce\xcb\x51\x57" + + "\x2c\x58\xa4\x1a\x88\x64\xa0\x4d\x0a\x02\xcb\x8d\x12\x03\xe3\x54\x4e\x96\x8d\x00\x55\x64\x9a\x2d\x4c\x51\x83\x5f" + + "\x6f\x31\x2d\xc9\xa0\x9e\x15\xe0\x57\x95\x5f\xa3\x1e\xa6\x99\x9b\x85\xab\x6a\x5e\xae\x2d\x5f\x00\xcc\xc8\xc2\x92" + + "\x6d\x04\x56\xb0\xbb\xb7\xb2\x12\x16\xeb\x70\x90\x6c\x23\x1d\x04\x3e\xe3\xdc\x14\x66\x9a\x35\x7c\x66\x49\x47\xe9" + + "\xee\x07\xe1\x8c\x46\x31\x9a\x77\x68\xdd\x1c\x76\xac\x34\x48\x22\xc3\x40\x69\x00\xb6\x84\x37\xa5\x9b\x3b\x74\x29" + + "\x1b\x74\x38\x7c\xbb\xbe\x7c\x92\x61\xd6\x01\xf7\xbb\xd4\x02\x5b\xbf\xe3\x3b\x42\xfc\xc4\x03\x54\x77\x2d\x72\x97" + + "\x94\xeb\x71\x4c\x6a\xe7\xf5\x82\xd9\xe1\x5a\x71\xd6\xe2\x9e\xbc\xc3\x05\x09\xab\xa1\x29\xdb\x6c\x74\x91\x66\x17" + + "\x69\x78\x21\xd3\xcb\x20\x9c\xf2\x7f\xd5\x98\xcb\xd5\x78\x1b\xcc\xd6\x56\x5f\x8d\xd5\x3e\xfc\x8c\x22\xf0\xfa\xad" + + "\x64\xf3\x81\x0f\x76\x74\xb4\x22\x6f\xe6\x30\xc6\x93\x19\xd6\x8e\xd8\x80\x81\x88\x8f\xda\xa4\x9c\xeb\x3e\x79\xff" + + "\x69\x9f\x7c\x5b\x5f\x59\x5d\x28\x0d\xfc\x31\xdc\xc7\x04\xd7\x92\xd9\xa3\x4a\x32\x2c\x1b\x47\xf8\x20\x36\x25\x99" + + "\x51\xf6\xc0\x19\x52\x6e\x8d\x8e\xf3\xf1\x9b\x3f\x64\x63\xcb\x5f\xfb\x0f\xc9\x8b\x72\x6b\x6b\x0b\x2f\xaa\x01\xe5" + + "\x92\x1b\xb0\x9b\x0a\xcc\x56\xe2\x72\x33\x92\x62\xd6\x2d\xd2\x3b\xd0\xf2\xe1\x65\xac\x2b\x83\xce\x67\xe7\xd7\x4a" + + "\x17\xd9\x42\x63\xc0\x3a\xa6\x15\x09\xf4\x7e\x31\x5a\x16\x79\xb1\xab\x04\x51\xb2\xc8\x83\x9d\xfe\x24\xcf\x76\x76" + + "\xd0\x88\x00\xae\x90\x6d\x19\xa8\x7a\x35\x9d\x66\x57\x9b\xe8\x2f\xb9\xea\xef\x72\x31\x47\x8a\xb1\x73\x1b\x31\xb5" + + "\xa3\x04\xec\x5c\xde\xa0\x07\xf6\x40\x44\x2c\x60\xb8\x13\x24\xb0\xc9\x8a\x59\x6e\xc4\x3d\x59\x94\x0d\xa8\x8f\x2b" + + "\x17\x22\xb0\x04\xff\xe1\xa3\x5b\x60\x42\x49\x4b\x3e\x04\x4f\xc1\x5e\xa2\x12\x7b\x5e\x4e\xa9\xe4\x59\x98\xf0\xd4" + + "\x7b\x8d\x49\x48\x3a\xee\xa9\x18\x7c\xcb\xe7\xc5\xcf\x06\x9d\x50\xe8\x98\x43\x8e\x76\x7f\xed\xb1\x03\x20\x3d\x71" + + "\xd9\xe0\x3e\x86\x71\xb7\xdc\x66\x70\xa2\x5d\x38\x6a\x18\xac\x4f\xbd\xea\x47\x91\x5c\xb7\xac\xd9\x10\x61\x62\x5b" + + "\xa4\xaf\xf3\xda\x0e\xf3\xd4\x44\x92\x83\x50\x39\x7e\x22\x7a\x7a\x4b\x55\xd9\x41\xbd\x07\x2a\x27\x43\xf0\xd6\xd6" + + "\x02\xbc\xaf\x43\x34\xf5\xc0\xb4\xe5\xf8\x14\xca\x6c\x26\xb1\x0b\x3c\xad\xec\x72\xb6\xa1\x3b\x2a\x07\xf3\x19\x08" + + "\xda\x11\xea\x67\x80\xaa\x69\x8a\x18\xaa\x70\xa1\x97\xc8\x90\xe0\x3a\x9f\x75\x3a\xeb\xb8\xf7\x2d\xea\x1e\x43\x40" + + "\x3a\xa7\xd5\x65\xe7\x96\xe8\x52\xb6\x85\x09\x7d\x5a\xb0\x18\x7e\x86\xc7\x41\xc1\x96\xf6\x0a\xb7\x59\xa4\x41\x6e" + + "\x21\x6c\x7f\xa3\x0e\x3c\x6e\xf2\x96\xe5\x7d\x36\xe6\x20\xf1\xd6\x7f\x5c\xff\x10\x73\x79\x6b\x9e\xa5\x9b\xd3\xad" + + "\x84\xdf\x8a\xaf\x9a\x72\x36\x0b\xf5\xde\x98\x5e\x5b\xde\x32\x44\x08\xf0\x05\x5d\x9f\x65\x6e\xb4\xf0\x12\x74\x02" + + "\xb2\x2d\x82\xc8\x77\x43\xdb\x66\x8f\x13\x83\x0c\x6d\xf7\x7a\x1b\x41\xe5\xba\xd3\x22\x91\xc7\x26\xdb\x60\x19\x91" + + "\x9b\x37\x0b\x23\x22\xe1\x73\x6a\x8f\xd6\x39\x40\x64\x8c\x0a\x8a\xae\xb4\x62\x6d\x0e\x23\x5c\x86\x77\x6b\x63\xda" + + "\xc1\x30\xf6\xba\x18\x28\x53\x58\x7e\x58\x03\x9a\x01\x76\x8a\xbd\xb6\xcd\x1a\x3f\x1c\x2e\xab\xb2\x29\xed\xfc\x0d" + + "\xb3\x22\x6b\x3e\xa5\x1e\xb4\x21\xd2\xa6\x82\x4a\xd4\x11\x56\x06\x5d\x8b\xaa\xa5\x9b\x02\x6c\xb5\xd5\x6a\xd2\x94" + + "\xd5\x18\x0b\x23\x3c\x63\xd6\xc1\xe5\x6d\x6e\x7c\x80\xbe\x51\x34\xbf\xb8\x2e\xde\x84\x7b\xe8\x1e\xda\x0f\xad\xf0" + + "\x53\x95\x4b\xff\x90\xfa\x7f\xc4\x03\xb9\xb9\x51\x49\xbd\xb6\xd7\x85\x2f\xc3\x11\x31\x2e\x16\xc7\xbf\x82\xa8\x15" + + "\x46\xdf\x2e\x20\x00\x03\x71\x13\x57\x15\x2d\x15\xb6\x52\xd8\xcb\xcd\x14\xa9\x7f\x04\x7d\x3e\xc2\xae\x47\x6a\x0b" + + "\xd6\x81\x42\x87\xcf\xd4\x31\x59\x72\xc1\x4f\xdc\x9d\x80\xc9\xaa\x23\xed\x8f\xa5\x9b\xac\x5f\x70\x53\xbe\x24\xda" + + "\xef\x27\xe1\x2c\x4c\xb5\xe1\x14\x01\x4e\xd6\x27\x6a\x22\x64\xff\x20\x37\x58\x54\xb5\xcb\xb8\x2a\x8b\xba\x8e\x56" + + "\x2b\x19\x25\xcc\x30\x39\x01\x10\xa6\xae\x4d\x3a\xf0\x2d\x7e\x5a\xe7\x7d\xaa\x22\x5a\x95\x61\xba\x42\x00\x61\x6f" + + "\x78\x80\x8f\xca\x1a\x97\x17\x18\x0c\xc7\x25\xd9\xd5\x3e\x55\x72\x0f\x9c\x11\xfb\x4e\x3d\x1c\x6c\xa8\xfc\xa1\x72" + + "\x05\xf6\x07\xea\x60\x43\x31\xc9\x85\xcb\x43\xdd\xd1\x25\xaa\xce\x0b\xcf\x62\x33\xd1\x08\xed\xfe\xd9\x53\x62\xc7" + + "\xf5\xd5\x43\xfa\x7e\x57\x3c\xde\x38\x33\x75\x63\x96\xe1\xac\xc8\x37\x02\x9b\x78\x68\x44\x12\x27\x2b\xfc\x09\xac" + + "\x6f\xe9\x8f\x1e\x6d\x99\xda\x78\x38\x6e\xa1\xd0\x95\x1f\xcb\x49\xd8\xb8\x7f\x5a\x5f\xdd\xeb\xc6\x87\xed\xa2\x29" + + "\x40\xaa\x02\x12\x13\x15\x08\x3f\xc2\xa6\x89\x10\x71\x07\xc6\x9d\xba\x84\x06\xc8\x99\xe4\x4d\x2a\x53\x63\x82\x61" + + "\x4f\xef\xa1\xd0\x10\x31\x16\x1b\xd7\x88\x3a\xe3\x54\x44\x0e\x87\xb8\xb7\xed\x8b\x92\x69\xf4\xe6\x46\xc5\xcf\xa2" + + "\x4a\xc8\x92\xd3\x6f\x69\x8b\x37\x35\xdb\x52\x21\x2f\x35\xe2\xd7\xe8\x82\xb2\x32\x20\x57\x0c\xb8\x3f\xea\x71\x95" + + "\x2a\x80\x47\x34\x8d\xa9\xac\x7c\x61\xc9\x90\x5a\x67\x79\x1e\x3a\x23\x70\x65\xba\xb1\xf2\x94\xe5\xc0\xbd\x2a\x09" + + "\xf4\x52\x2e\x0b\x08\x44\x69\x51\x13\x14\x7c\x0f\x45\x11\xa8\x90\xeb\xa9\xcb\x01\x83\x18\x92\x61\x0b\x5d\xb0\x6a" + + "\x95\x1c\xec\x5b\x7a\x67\xc5\x1f\xf8\x0e\xe2\xbe\xa0\x9d\xe1\x3d\x67\x38\xb4\x1f\x5e\xb5\xbe\xac\x4a\x7b\x9d\xf7" + + "\x0e\x2a\x9d\xf6\xb1\x06\x9c\x2b\x8a\xe0\xa9\x87\x74\xf5\xdb\x25\x8c\xf8\x34\x3f\x9b\x03\x31\x9b\x08\x6e\x7c\xc8" + + "\xed\xbe\x14\xd3\x57\x73\x2a\x12\xcf\x88\xd9\x69\x48\xec\xac\x61\xdb\xa4\xe8\xc3\x01\xec\x0f\x25\xdb\xb1\x4d\x7d" + + "\xb8\xb9\x51\xdc\x1b\xcb\xa5\xe0\xb7\xc7\xa0\x54\x73\x1b\x8d\x63\xf2\xeb\xdb\xb6\x26\x79\x98\xc2\x69\x77\x0a\x6b" + + "\x58\x0e\x3b\x57\xba\x51\x7b\xf0\x9e\xc4\x01\xf4\x05\xac\x09\xa3\x08\x5f\xd1\x86\xc4\x37\x6e\xb5\x2f\x75\x96\x83" + + "\x43\xae\x1d\x1b\xc0\xf4\xe6\x3a\x76\xa7\x00\x2f\x64\x2e\xd8\x62\xc9\xa7\x57\x40\x69\xa2\x5d\x1d\xb1\x44\xdd\xa5" + + "\xdc\x20\x03\x16\x29\x3a\x73\xd4\x6f\x80\x7c\x6d\x1f\xa5\x96\x45\x20\xe8\x85\x3f\xa2\x5d\xaa\xf7\xa8\xc3\x71\x97" + + "\x89\xd1\xde\xb4\x71\xf0\xb7\xa5\xe5\xbb\xf4\x1b\x79\x95\x2e\x76\x6f\x23\x05\x39\xf2\xd5\xb4\x1d\xe8\x3e\xb6\x54" + + "\x3b\x80\x14\x38\x1a\xa9\x1f\x75\x91\x4d\x08\x18\x41\x2f\x97\x55\xa9\x27\xe0\xe2\x52\x3b\x3f\x16\xb0\xaf\x97\x00" + + "\xf5\x38\x29\x8b\xc2\x4c\xec\x36\x25\xc7\x8f\x16\xa9\x1c\xd6\x93\xaa\xcc\xf3\x77\xc0\x44\x75\xbf\xfb\xc1\x4c\x1b" + + "\xa2\xa8\xb7\xed\xd3\x78\xed\x9c\xdf\xc8\xce\x8e\x7c\xdc\x91\xea\xee\x93\xa7\x28\x98\x9c\xe0\xce\xa7\xfe\xe5\x59" + + "\x61\x74\x15\x30\x26\x91\xd4\xba\xf4\xe2\xcd\x1a\x34\x27\x9b\x8b\xee\x0f\x3f\x57\x7b\x10\xbc\x30\x9c\x94\xb5\x7d" + + "\xff\x10\xff\xfa\xf1\x95\xea\xab\x91\x7a\x74\xd8\xd1\x9d\xe9\x55\xfb\x8a\x82\x3b\x8c\x17\xf4\x5b\x7b\x70\x9f\xe3" + + "\xc1\x7d\x7a\x30\xfc\x4a\x81\xec\x0d\x1a\x68\x08\xf4\x11\x35\xe1\x05\xff\x7f\x31\xf7\xee\xdf\x6d\xdb\xd8\xfe\xe8" + + "\xcf\xce\x5a\xfe\x1f\x10\xa6\x37\x95\x62\x59\xb2\xd3\xa6\xd3\x2a\xe3\xf1\x4d\xf3\x98\x66\x6e\xd3\xf4\x34\xe9\x69" + + "\xcf\x72\x7c\xba\x60\x11\xb2\x18\x53\xa4\x86\xa0\xfc\x68\xed\xff\xfd\x2e\xec\x07\xb0\x01\x52\x76\x3a\xe7\xf1\xfd" + + "\xce\x5a\xd3\x58\x24\x88\x37\x36\xf6\xf3\xb3\x7d\x00\xbb\x0c\xbd\x9e\x5f\xfe\x00\xf7\x78\xb1\x34\xcd\x6b\xe0\xb2" + + "\x9a\xf9\xa5\x6b\xcb\x62\x24\xf3\xe1\x14\x65\xa9\x6b\x27\x87\x5c\x3b\x19\x63\xf8\xd9\x84\x8a\x55\x7d\xc1\xc8\x87" + + "\x53\x8a\x47\xbe\x1e\x26\xf1\xcc\x08\xea\xd9\x09\x6a\x5e\x3b\x51\x60\xf2\xcf\xb5\x59\x1b\xd8\x2c\x58\x3d\x2a\xb3" + + "\x8a\xba\x82\x48\xd3\x12\x2c\xf0\x07\xea\x88\x1d\x08\xfd\x53\xcc\x48\x03\xab\x8b\x45\xd0\xa7\xed\x51\x36\x55\x47" + + "\x91\xca\xca\x1d\xb7\xae\x16\xa1\x25\x51\x04\xb9\x72\x40\xc9\x20\xd9\x28\xfa\x82\x54\x0a\x3e\xe7\x28\xee\x26\xe0" + + "\xe2\x47\xb1\x7a\x09\xa7\x25\x76\x21\xa1\x22\xc4\xd2\x63\xc9\x87\x0f\x59\xb1\xf3\x45\xd7\x30\x79\x1b\x87\x2f\x15" + + "\x60\x10\xc9\x54\x78\x5d\xa7\xc0\xa2\x52\x85\xc7\xbb\xc2\x38\x1d\x1f\x11\x8d\x22\xc5\xb2\xb0\x14\x68\xca\xaa\x0f" + + "\x14\x54\x6e\xe9\xc5\xf5\x35\x7e\x8a\x01\x60\x97\x60\x00\xdb\xa1\x19\x11\x69\x14\xa2\x09\xd8\x74\x79\x42\x95\x43" + + "\x3f\x33\x76\xa6\xc1\xcf\x6a\xdf\x6b\x72\x2e\x5f\xb7\xa6\xd1\x2c\x57\x3d\x8e\xf5\x38\xd8\xd9\x87\x0f\xf1\x0f\x9c" + + "\x41\xd4\x76\x14\x6d\x64\xad\x79\xdf\x40\xb6\xba\xaa\x80\xe8\x25\x82\xc4\x3e\xb9\x12\xdd\x8a\x56\x86\x85\xad\x50" + + "\xad\xc4\x47\x09\x36\xe9\x0b\xa3\xd6\xab\x1c\x54\xad\x0b\x43\x5b\x48\x5c\x76\x98\xb1\x84\x33\x5a\xf0\xc6\xc0\x7f" + + "\x01\x73\x21\xca\xa3\x86\xe3\x3c\x37\xe5\x15\x52\xe1\x4b\x54\xe2\x82\x71\x47\xab\xaa\xae\x7e\x37\x4d\x8d\x5d\x72" + + "\x2b\x4d\x47\x5b\xae\x19\x2f\xc2\xf5\xb5\xda\x17\x30\x1d\xd2\xad\xf5\xf5\x1c\x32\xcd\x15\xf5\xda\xaa\x82\x67\x56" + + "\xb9\x9a\x4d\xae\xea\x75\x3b\x52\x79\xbd\x76\x37\x38\x02\x92\x5f\x18\xb0\xc9\x3e\xf2\xc0\xe4\x8f\x42\x55\x3f\x43" + + "\x84\x0f\xb1\x6e\x00\xa2\xe0\xbe\x84\x1f\x1a\x92\x10\xd8\xda\x7d\x8f\xd0\xc9\x7a\x36\x03\xff\x16\xf0\x54\xb5\xc6" + + "\x28\x5c\x69\x6d\xd5\xba\x62\x3c\xcc\x13\x83\x7e\xd8\x72\x23\xe0\xbf\x4e\xd8\x1e\x3f\xc9\xa2\xec\x22\xcf\x72\x70" + + "\x71\x70\x9c\x06\x20\x5a\xf0\x87\x34\x17\xf8\xef\x04\x2b\x60\xcb\xd2\xe6\xbb\x18\x0f\x39\x7e\xb4\xa3\xfc\xdd\xeb" + + "\x57\xe7\x67\x5c\x66\xa8\x6d\xa4\xda\xba\x84\xa9\xab\x4e\x61\xea\x54\xdd\x80\xcf\x15\xda\xe1\x02\x45\xf0\x5f\x3f" + + "\xab\x72\x75\xd2\x18\x7d\xc6\x6e\xa1\x65\x5d\xaf\x1c\x6b\x82\xc3\x2b\xe4\x2c\xb8\x23\x6a\x9a\xb9\x99\xb5\x80\x5d" + + "\x81\x0e\x75\xe7\xe4\xd0\xb1\xd0\xb9\x32\x55\xbd\x3e\x5d\x90\x22\x50\x71\x70\x3e\xd6\xe4\x36\xff\x80\xe7\x4e\xf4" + + "\x44\x4d\x28\xb7\x31\xd8\xf8\x42\x59\xc8\x97\xb5\xbb\x1b\x1f\xb3\x6e\x1c\x2e\x8d\x3e\xdd\xe0\xe1\x20\xe2\x9e\x16" + + "\xfa\x53\xd2\x76\x40\x0f\xfc\xf6\xc4\x3f\xae\xaf\xe5\x46\xdd\x7b\x2a\x99\x1a\x71\xfe\x82\x6f\x1c\x38\x30\xec\x1c" + + "\x4c\x76\x0f\x54\x5b\x9f\x99\x2a\x71\x40\x42\x9f\x90\xbc\x46\x6f\x43\xef\xf7\xe7\xef\x8d\x88\x69\x02\xfd\x0a\xd1" + + "\xdb\x7d\x47\x51\xa3\x6d\xb3\xc3\x43\xc1\x97\xec\xd5\x47\x8f\x1e\xab\x63\x6f\x98\xdc\x09\xcf\x7a\x35\xaf\x2d\x69" + + "\xb4\xdc\x12\x1d\x7b\x5d\x3c\x6c\x05\xea\x96\x55\x0c\x92\x6e\xaf\xaa\xd9\xa2\xa9\xab\x7a\x6d\xcb\x2b\x14\xa6\x20" + + "\xd1\x8b\x7c\x2c\xc1\xa7\xe1\xb3\x57\xee\xba\x26\x75\x8e\x35\xed\xfb\x62\x69\xea\x75\xdb\xd1\x31\xc2\xad\xae\x84" + + "\xfe\x17\x38\x0c\x09\x78\x30\x50\x5c\x86\x4e\x47\x05\xf5\x0e\x3d\xa6\xfe\x44\xfd\xdd\x5d\xa9\x6e\x03\x78\xd1\x0f" + + "\x73\x34\x41\x47\x80\x06\xe8\x2a\xc7\x54\xf8\x7e\xce\x45\x4c\x6e\xf5\xea\x72\x40\xbe\xb7\x14\x7c\x8e\x96\x65\x01" + + "\x94\xbd\x28\x66\x0b\x8f\x43\x81\xe6\x1e\xdd\xb6\x78\x8d\x13\xdc\xfb\x14\x5d\x02\x03\xf2\x0e\x1b\xd6\x31\x16\x9f" + + "\xb0\xb6\x81\xbf\x39\x67\xb8\xeb\x7d\xf0\xc2\xab\x95\x2e\xcb\x60\x7f\x61\x84\x1e\x59\x0b\x12\xa9\x5b\xeb\x7a\x0c" + + "\x2c\xf1\x59\xb1\x82\x48\x06\x05\x2c\xac\xab\xed\x27\x32\x26\x46\x43\x3b\x88\x47\x4a\xd8\x03\x4f\x53\xac\x01\xe5" + + "\xc1\x06\x76\xfb\xa6\x66\x0b\x03\x9c\x0e\x12\xdb\xd1\x53\x3f\x3d\x47\x21\x9e\x7d\x87\xa2\xa1\x1c\x8b\xcb\xef\x44" + + "\x88\x78\x78\x49\x1a\x0e\x09\xc1\xdd\xd7\x34\xd4\x31\x26\x3f\x7c\xae\xd3\x83\x50\xc5\x95\xb0\xf9\xc6\x15\xe9\x04" + + "\xf5\x45\xbc\x14\x99\x09\x90\xda\xfa\xdd\x22\x76\x42\xcb\xca\xdd\xad\x59\x5d\x96\x86\x33\x0b\x12\xb1\x36\x8d\x95" + + "\x5c\xc8\xd1\xb1\x1a\x8e\x31\x6d\xa2\x2c\x90\x3d\x02\x93\xe9\x6d\x51\x80\xa1\xf2\x60\xbf\xf9\xd4\x28\x40\x98\xb2" + + "\x01\xf3\x8b\xa1\x26\x1f\x53\x43\x6a\x32\x3f\xbc\x51\xcc\x42\x26\x18\xd9\x4c\xbe\x2a\xc3\xfe\x6c\x45\x1c\x08\xd0" + + "\x43\x52\x48\x4a\x88\xe6\x39\xe5\x87\x59\x1f\xee\xaa\xb2\xa0\x16\x67\x02\x3d\x79\xa4\x3e\xda\x45\x51\x81\xcb\xa6" + + "\x5b\xd0\xc2\x62\x28\x04\xe4\xb7\x40\xbc\xdd\xd0\x61\x77\xdb\x39\xbe\x9f\x64\x54\x76\xe5\x53\x75\x99\xcf\x8b\xc6" + + "\x8c\x42\x48\x26\x84\x01\x53\x2c\x1a\x1e\xe1\xaa\x58\xca\xd4\x92\x75\x53\x9c\x06\xc3\x5c\xd7\xa7\x1e\x1e\xfb\xe0" + + "\xb4\x8e\xc8\x97\x46\xab\x21\x2e\xaf\x6e\x35\x21\x1a\xf5\x87\x50\xce\x2f\x9d\xc0\x22\x13\x98\x2c\x74\x95\x97\x46" + + "\x81\xa0\x31\xa5\xbc\xb8\xab\xa6\x5e\x16\x16\xae\x34\xb4\x97\xba\xf9\x1a\x43\x11\x5e\xf7\xc4\x1f\xef\xb7\x20\xa8" + + "\x88\xb6\x32\x19\xd9\x8d\x1a\xce\x75\x05\x25\xf3\x4e\x64\x77\xfa\x9a\xef\x42\x9a\x59\xef\x53\x07\x6a\xb8\xb1\x7b" + + "\xf4\x54\x7c\x17\x9e\x4a\x58\xb3\x38\xb4\xe9\x7e\xd2\x44\xb0\x43\x52\x1b\x09\xe0\xe3\x4d\x50\xa6\xc6\x5f\xee\xec" + + "\x10\x33\xe4\x96\x74\x8c\x11\x51\x5d\x7b\xd6\x64\x42\xd7\x30\x26\xc1\xd1\x67\xa0\x6d\x63\xdf\x4d\x76\xec\x03\x80" + + "\x6a\x5c\x83\x06\x6f\xbb\x13\x03\xe8\x64\x26\xe7\x5a\x30\xb0\x06\xab\xe1\x4f\x90\xdb\xb8\xb5\xfd\xa4\xd3\xbb\xbb" + + "\x4f\xe5\x5c\xd0\xba\xc1\xbb\x78\xc5\x7c\x3a\x60\x3f\x3d\xe9\x14\xa7\xf3\x14\xa5\x07\xf7\xfb\x0a\xee\xa9\x09\x01" + + "\x4b\x9e\x9b\x66\x5e\xd6\x17\xa0\x4f\xe5\x5d\xd5\x8d\x7e\xd9\x47\x55\x14\x3b\xb8\x71\xf0\x11\xc8\x07\xec\xeb\xe6" + + "\x9f\x0d\x45\x6c\x4e\xea\xfb\x5f\x63\xde\x20\x5b\x19\x7d\x66\x19\xcd\x1e\xfc\x08\x67\xb5\xbb\x99\xcb\x52\x7d\x11" + + "\x3a\xe5\x48\x35\x24\x35\xb0\x3e\xa3\xd6\xeb\x97\xdf\xec\xee\xef\xb9\xdb\x92\x02\x79\x01\x83\xca\xf1\xa4\x08\x04" + + "\xd7\xf9\x14\x01\x8f\xf8\xf9\xaf\xee\x32\xa4\xcf\xf8\xd9\x7f\x80\x62\xd3\x1a\x8f\x9c\x01\x00\xca\xde\x9b\x12\x8e" + + "\x98\xaf\xd7\xc9\xf4\x18\xb3\xc8\x8f\x46\xc9\xef\x5f\xd3\x07\xff\x21\xdd\x5c\xdf\x99\xe0\xa0\xe3\xa3\xa0\x12\x4f" + + "\x1d\x84\x0f\x12\xcb\x44\xdf\xea\xc0\x94\x81\xdb\x1e\x84\x48\x7b\xcf\x3e\x0f\xed\xb5\xd0\xe7\xe8\x76\x9c\xb7\x8b" + + "\x09\x56\xc3\xbe\x36\x30\xf4\x10\x6c\x79\xab\xa3\x5d\xe8\xf3\x7b\x63\x3b\x49\x58\x12\xd8\x3b\x72\x02\x2c\xaf\x28" + + "\x42\x13\xae\x46\x41\x68\x43\x62\x16\x19\x26\x8a\x6c\xed\x27\xc4\x94\xbb\x7d\x96\x26\x32\x8a\xc2\x88\xd5\x50\x4d" + + "\x45\x8a\x17\x4f\xdb\xe2\x3e\x1c\x1c\xb0\x67\x53\x26\x93\x22\x8a\xe1\x63\x34\x1b\xfb\xa7\xc5\xd1\xdf\x9d\xb8\xef" + + "\xc8\x49\x2a\x89\x49\x85\xd6\xe3\xad\x43\xf5\xc4\x9b\xc3\xd5\x43\xf0\x75\x4f\xef\xa4\x5c\x9d\x4f\xa3\x06\x84\xcf" + + "\x4d\xb2\x23\xbb\x25\xf7\xfb\x4b\xfe\x47\xb7\x24\x8b\x0e\x09\x15\x71\xb7\xd5\x64\x51\xe4\x86\x29\x07\xb2\x25\xc0" + + "\xf5\x08\x4a\x40\x46\x51\x8c\x8d\x58\xa1\xb6\x5a\x58\x74\x10\xd8\x83\x14\x78\x49\xe6\x7c\x1e\x34\xe5\x0a\xe8\x7e" + + "\x4c\x5e\x13\xee\xea\xc6\x3f\x7c\x5c\x10\x2c\x1e\x3e\xa4\x08\x91\x28\x8a\xc8\x31\x6a\x3e\xd8\xdb\xcd\xbe\x01\x75" + + "\x15\x5d\xc0\x32\x1d\xa6\xcf\x4d\xd5\x00\x73\xed\x6f\xf1\xd2\xb1\xd5\xc0\x60\x93\xde\xc3\xb6\x35\xa0\xf9\xc1\x8c" + + "\xd4\x0d\xba\xcf\x3a\xbe\xfb\x02\xd3\x25\x9c\xd6\xe4\x1a\xbd\x6a\xea\x99\x31\x39\x32\x51\x16\x1c\x52\x2f\x7c\x0c" + + "\xef\xaa\x31\xad\x93\xfd\x30\x89\x0a\x76\x51\xdc\x0d\xd2\x07\x0c\xfa\xfa\xf0\x61\xe8\x92\xf8\xdb\x33\x9f\x1b\x22" + + "\x33\x02\xf3\xe2\xd8\x29\xbe\x32\xe2\xec\x99\x51\xfc\x77\x14\xe2\x0b\xfc\x91\x6f\xe2\xe0\xf6\x1e\x04\x13\x44\xe4" + + "\xc2\x83\xfa\xb4\x40\x61\x9e\x55\x57\x10\xb0\x32\xe7\xf4\x1d\x6e\x3e\xad\x5a\x5b\x9c\x5f\x4c\xdf\xca\x5a\x09\x9f" + + "\xa1\x25\x82\xc3\xdc\x4e\xad\xb2\xe1\xa0\x46\x52\x65\x7a\x46\xef\x7b\x2f\x2b\x30\x84\x61\x96\xc2\x01\x34\x12\x36" + + "\x21\x22\x0d\xf0\x40\x23\xc7\x18\x3e\xbd\x6e\xd7\x77\x4a\x84\x99\xe6\x57\x63\x7c\xb2\x09\xf3\xa0\x97\x4f\x4c\xb0" + + "\x15\x88\x55\x1c\xa9\x3f\x6e\x3a\x11\x0b\x90\xde\x8e\x1c\x80\xd8\x1e\x86\x87\x63\x57\x61\xba\x5c\xab\xc6\x6e\x72" + + "\x07\xc3\x31\xbe\x18\x40\x1c\x62\xd6\x98\x73\xd3\x58\x24\xdc\x68\xd0\xc0\xcf\x86\x49\xc7\xc6\x7e\x44\xf7\xc5\x48" + + "\x02\x40\x40\x82\xbb\xc0\x3e\x3f\xc8\x0a\x4b\xe7\xa0\x68\xd8\x40\xf5\x9c\x70\xd1\xc3\x2d\x25\x55\x44\x6e\x43\xc2" + + "\xac\x7e\x4b\x15\x2c\x2a\xf8\x6c\x65\x7e\x66\x39\x85\x7e\x0f\x13\xee\x9d\xe4\x98\xa4\xd1\x8e\xe8\xb5\x97\x49\xed" + + "\x5c\x74\x3c\xba\xfe\x4d\xb7\xd5\xea\xa5\x35\x29\x8c\x06\x58\x8a\xf4\x70\x4d\xd5\x9e\x14\x52\x13\x60\x8c\xfb\xa1" + + "\x11\xb1\x2f\x23\x40\x8c\xa8\xb6\x48\x0f\x26\x59\xd2\x14\x4a\x23\x52\x52\x75\xbf\xd9\x8a\xd5\x69\xe8\xa6\x24\xd0" + + "\xc4\xae\xaf\xc5\x33\x66\x28\x85\xea\xa1\x2f\xa9\x2e\xd3\x61\xca\x1f\xa5\xaa\xba\x5e\x61\x7a\x4a\xda\x0f\xf4\x8f" + + "\xcf\xf4\xac\x34\xf2\x7c\x17\x4d\xd1\xb6\xa6\xea\x90\x0a\x69\x76\x1d\xf4\x71\x26\x9f\xce\x6e\x0c\x63\xbe\x22\xba" + + "\xe5\xf3\x94\xfb\x79\xda\x27\x13\xbb\xe9\x78\x45\xd2\x30\xc9\xc1\x10\x87\xa8\xcb\x97\xd2\xad\x0d\xfc\x8c\x31\xad" + + "\x3e\x05\x16\x90\xbf\x18\x09\xc0\x20\x0d\x78\xf1\xd1\x47\xab\xa5\x95\xb9\x5b\x89\xfc\xad\xd9\x72\x1e\x5d\xe1\xa8" + + "\x1e\x48\xef\xf0\x6a\x53\x28\x1c\x16\xc7\xad\xed\x4d\x92\x51\x8b\x51\xe8\x50\xc2\x0b\x74\xb0\x48\x52\x9f\xd7\x94" + + "\x1b\xf0\x4d\xc0\x0b\xc1\xc8\xf4\x57\x1c\x0a\xee\xc5\xb1\x4b\xa4\x51\x72\x85\xdc\x2d\x29\x02\x73\xb6\xb6\xa8\x8a" + + "\xbe\x58\xcc\x98\x19\x91\xbd\xa7\x7a\xef\x08\x87\x4b\xa4\x6e\x08\x57\xc3\xc5\xe8\x8f\x58\x13\x31\xa5\x58\x2c\x02" + + "\x83\x4d\xfb\x53\xc9\x98\x3a\x44\x6f\x68\xd5\x3f\xd7\x45\x6b\xd4\x67\xe4\xea\x4c\x2e\x50\x17\x75\xd5\xfa\x03\x62" + + "\xd4\x99\xb9\x12\x49\x24\x30\x57\xb7\x77\x4c\xd1\xa5\xad\xd5\x2e\x64\x93\x74\x53\xff\x39\x8c\xfa\x73\xe2\x7c\x4e" + + "\x00\xc8\x92\x84\xb3\x0b\x13\xa0\x54\x19\xe7\x3c\x73\x9d\xca\x04\x3d\xf5\xfb\x2b\x89\xdc\x66\xa2\xd5\xd9\x7f\x81" + + "\xf0\x6c\x5a\x5b\xb9\x0e\x8e\xa7\x8d\x77\x5f\x28\x8e\x9b\xa7\x87\xc8\xc8\xbb\xa8\x77\xef\xc6\x1f\xf7\x6a\xb6\xbc" + + "\xca\x5c\x5e\x07\x68\x81\x18\x25\x28\xe4\xc1\xe7\x8a\x54\x4c\xc0\x3c\xde\xa6\x09\xec\x31\x2f\x93\x3a\x00\xd5\x4b" + + "\x66\x6e\x9a\x46\x7a\x04\xbe\xa0\x27\x83\x21\x4b\x13\x5d\xed\x0b\x28\x42\xaa\xcf\x5b\xc4\xf0\xc5\x0b\x96\x52\xd1" + + "\x4d\x59\x60\xf4\xc9\xba\xe5\x76\x6b\x8b\xd9\xd9\xd8\x7b\xa3\xde\xa0\x8a\xcb\x3d\xec\xd3\xf1\x90\x09\x14\xf9\xe3" + + "\xd4\xdf\x0b\xd4\x5a\xe2\x8e\x44\xb4\x68\x14\x26\xdf\x17\x40\x72\x50\xef\x7f\x7d\x1d\x5b\x14\x46\x5c\xcd\x52\x17" + + "\x15\x52\x84\x08\xbd\xd8\x4f\x18\x5e\x44\x50\xd7\x8e\x78\xea\xfd\x1f\x77\xa3\xe6\x44\x12\x34\xdd\xcc\x16\xba\x98" + + "\xa9\x59\xa3\xed\x02\x30\x0f\x30\xbb\xbd\x2e\x9d\xec\xb5\xb6\x9c\x53\x6d\x1f\xc0\x91\xf7\xc6\x4f\x18\x17\x79\xf0" + + "\x60\xff\xf1\x97\xdf\xfc\x85\xec\x6a\xad\x59\xae\x20\x01\x1f\x77\x74\xd2\xd7\x0b\xf7\x29\x5b\xe6\xc9\xa3\xf4\x00" + + "\x6a\x76\x9f\x73\x80\x40\xb4\x35\xfa\x36\xc7\x18\xae\x5e\x9b\x38\xfb\xf7\x2b\x8c\x55\x47\x63\xbc\xb5\x95\x56\x14" + + "\x74\xc5\xcd\x5a\xfa\xba\xc6\xb6\x24\xde\x7c\xe3\xaa\x6e\x8b\xf9\xd5\x2f\x45\xbb\xe0\x23\x70\x14\xa9\x97\xd9\xcf" + + "\x34\xcc\xc5\x71\xcc\xb2\x70\x03\x7f\x45\x85\x53\xaa\xef\xf2\x11\xe5\xf4\x79\x9f\xd7\x91\xef\x0c\xe5\x89\xdc\xd0" + + "\x9b\xc0\x9a\x6d\xda\x89\x37\x5e\x37\xac\x49\xbb\xef\xab\x26\x2d\xec\x80\x6e\xa4\xd2\x2c\x11\x0e\x75\x14\x6e\x0f" + + "\x0f\x1d\xc6\x59\x87\xfe\xb8\x91\x04\x81\xf7\x99\x93\xb5\x3b\x45\x31\x22\xf9\x8f\xf8\x12\x9d\x3a\x6e\xff\x46\x10" + + "\x92\x10\xa5\xee\x64\xa1\x1f\x7d\xd5\x53\x49\x77\xa2\x32\x6f\xf1\xd3\xa9\xf7\x3d\x27\x05\x00\x1d\x8f\xe9\xad\x27" + + "\x8d\x77\xaa\xff\xda\xef\xdd\x51\x60\x5d\xed\xd4\x27\xfd\x17\x2c\xec\xb4\xe3\xd7\xe2\x58\x47\x01\x83\x11\xdc\x5a" + + "\xa4\xc3\xbd\xcf\xfd\xe0\x37\xa5\x9b\x2d\xe9\x30\x4f\xe4\x7e\x2b\x2e\x31\x4e\x08\x78\x90\x44\x93\x72\xc2\xd7\xbf" + + "\x6f\xf3\x43\x8a\xfd\xc4\x5b\xaf\x6b\xe4\xe0\xdc\x42\x8e\xc0\xc9\x81\x9e\xd6\x6d\xfd\x32\x1d\x66\x7a\x82\x83\x65" + + "\x2f\xd2\x11\x00\x46\x5c\x05\x36\x63\x84\xb8\x6e\x6b\x30\xb5\xea\xb2\x0c\x1e\x1c\x36\x54\x11\xb0\x2c\x2e\x0c\xda" + + "\xfe\xd0\x3a\xa3\x1b\xf2\xbc\x08\xa4\x82\xbb\x75\xb8\x89\x68\x08\x2e\xbc\x9f\x70\xa7\xfe\xcb\x21\x0d\x13\x17\x8d" + + "\xd4\x0a\x9f\x4e\x7c\xee\xa2\x3e\xfb\xdd\xb8\x22\xc8\xad\x00\xc7\x1c\xb5\xbc\x17\xe0\xca\x79\x45\x78\xaf\xa5\xb6" + + "\xad\xf2\xc9\xc2\xe3\x99\x72\x44\xc8\xe3\x4a\xe0\x48\x3b\x2b\xf6\xa9\xb4\x64\xe4\x3f\x0d\x44\x25\xd1\xa6\x88\x9a" + + "\x5c\xab\x7f\xa6\xa2\x78\xdf\xf9\x49\xbf\x11\x37\x2f\x32\x4a\xf2\x1e\x80\x27\x48\x5a\x7b\x84\x8b\xdb\xce\x0b\x0b" + + "\x91\x9f\xba\x6e\xde\xef\xb8\x87\x43\xb9\xc5\xd4\x18\x19\xfd\xe2\xfe\x48\xd3\x14\xd5\x9e\xc4\x37\x49\x2f\x62\xaf" + + "\xcc\x21\xd2\xb1\xd4\x2b\x3f\x4e\x41\x83\x22\x33\xae\x08\x38\xf4\xe2\xc6\x2b\x7f\x72\xd3\xd9\xa1\x00\x05\x36\x38" + + "\xf7\xbc\xa5\xe1\x25\xe4\x4a\x66\xc3\x0b\x9e\x8d\xe0\xb8\x08\x91\x19\x29\xd5\x2f\x66\x67\x9c\x93\x2e\xbd\x52\x5c" + + "\x9d\x53\x31\x7d\xf0\x90\x0c\x83\x49\x87\xe0\x29\xee\x8d\xed\x7b\x5b\xc1\x9a\xa8\xdb\x56\xcf\x16\x3e\xbd\x8e\x65" + + "\x58\x40\x06\xf0\x61\xe3\xb8\xdc\x42\xa7\x0d\xa8\x9d\x92\x16\xf8\x85\x02\x06\x07\x55\x2e\x69\x19\xf7\xb0\xb3\xcf" + + "\xbc\x55\x0d\x3f\x9c\xeb\xa2\xec\x7c\xe8\x1e\xd2\x7b\x66\x5b\x93\x12\x84\x73\x38\x4c\x50\x1e\x9f\x89\x8b\x3a\x99" + + "\xd9\x67\x61\xdb\xa1\x62\x97\x6c\xf0\xe9\xbd\x24\xd2\x2b\x45\x7a\xbf\x9e\x3d\x92\x8a\x26\xfe\x3b\x92\x3f\x9f\x06" + + "\x4e\x00\xb3\xc4\x3c\xca\x58\x4c\x94\x84\x81\x0b\xc0\xbf\x22\x8e\x57\x0a\x94\xde\xce\x8d\x6c\x52\x7c\x83\x78\xba" + + "\x8e\x35\x44\x7c\xdf\x27\x53\x5e\x11\x48\x96\xc8\xb4\x5b\x1d\x77\x86\x83\x0d\x1e\x0e\xfd\xc5\xc7\xeb\xca\x2e\x8a" + + "\x79\x3b\x10\x13\x1b\x8e\xed\x88\xe8\x13\x91\x0b\xb9\x1c\x21\xcd\xd5\xaa\x81\x04\xc5\xd1\x82\x24\xcf\xfa\x7c\x6f" + + "\x37\xb7\x9c\xaa\x1d\xd3\x0f\xf1\xd6\xef\xeb\x6f\x1a\x3e\x6c\x57\x06\x6e\x3b\x11\xb4\xe9\x9e\x04\xbd\xcc\x5c\xba" + + "\x8c\xd4\xab\x16\x15\x23\x26\x07\xc7\x70\x8a\xe6\xc4\x3a\x0e\x0e\x54\x86\x40\x47\x99\x3a\xec\x63\x1d\xb1\xdc\x50" + + "\x51\x44\x0f\x1f\xa5\xa9\x6b\xe3\xfa\x5a\xdd\x9f\x57\x80\x8a\xc1\x41\x7f\xdb\x41\xf7\x1a\xed\x5b\xae\xe6\xe1\x43" + + "\xea\x2b\x08\x8f\x9e\xb5\x0b\xcf\x0c\x31\x9d\x49\xbd\xfc\x97\x00\x39\x93\xd5\xfb\x28\x4c\xff\x4d\x88\xef\xae\x57" + + "\x6d\x10\x77\x0e\x44\x20\x45\x3d\x9f\x53\x74\x08\xcd\x49\x5c\x52\x62\xab\x1d\xc6\xef\xc0\xcb\x2d\x7a\x52\x54\x32" + + "\x42\xc3\x8d\xc6\x86\xf9\xf4\x8f\x8e\xe2\x6a\x8e\x03\xd0\xaf\x2f\xe2\x63\xb8\x3c\x01\x0d\x40\x98\xee\x63\x74\xb9" + + "\xd8\x05\x4e\x27\x24\x0d\x98\x80\xe3\xc4\xee\xdf\xc0\x60\x2f\x8c\x80\x54\x5c\xe0\xd7\xc9\x87\x04\x4c\x43\xbb\x59" + + "\xbc\x81\x6a\x22\xab\xdb\xbf\xb9\x17\x38\xad\xae\x1c\xa6\x79\x73\x7f\xf1\x86\x08\x73\xed\xa9\x6d\x57\x24\xdf\x44" + + "\xd5\xb8\xca\x40\xd7\xe8\x89\x88\xa8\xeb\x09\x9e\x0b\x3d\x8e\xb5\xfe\xe3\xdc\x90\x17\x03\x46\x4a\x8b\x72\x69\xf0" + + "\x3f\x67\x53\x5a\x85\x5c\x6b\xbd\x31\xfa\x73\x9d\x9b\xf7\xf5\xb4\x7b\xe4\xda\x3a\x1c\xbb\x98\x88\x6f\x93\x61\x04" + + "\x0d\x72\x57\xac\xcd\xf6\x66\x73\x3d\x6f\x4d\x13\x70\x51\xc9\x93\xac\xad\x11\x79\x44\x46\x47\xb3\xc3\x12\x3b\xf8" + + "\xa8\x21\x9a\x8e\x3d\x0c\xec\xc8\x89\xff\x64\xe3\x08\x3a\x38\x01\x73\x11\x40\xce\x3c\xce\x1c\x94\x1a\xbb\xf1\x0d" + + "\xc7\x54\x72\xf0\x87\xf2\x38\xc1\x6d\xad\xf8\xf4\xf7\x0d\xd0\xc7\x74\xd0\xa7\x5d\x51\x6b\xe3\xa7\x22\x5e\x15\x02" + + "\xc0\x0e\x54\xbf\x21\x0c\x4d\x75\x5e\x5c\x75\x32\x88\x2f\x0a\x95\x77\xc8\x5e\x68\x83\x44\xc7\x5a\x5e\xce\xbd\xf9" + + "\x56\xdf\xae\xd0\x73\x13\xe0\x60\x67\xf5\x0a\x20\xb3\xa1\x65\x5b\xab\x95\x69\x76\xbd\xab\x04\x91\x18\x54\xc5\x9c" + + "\x18\x55\xd6\xb6\x0d\x02\x16\xb9\x72\x09\x55\x1c\x6e\xbd\x0d\xc2\xb8\x1a\xc2\xae\xd4\x94\x42\xd9\x77\x07\x43\xe2" + + "\x82\xbb\x05\xb8\x38\xcf\x8b\xaa\xb0\xe0\xbd\x42\xe2\x80\x55\xc5\x72\x69\xf2\x42\xb7\x86\xfd\xba\xd1\x7d\x06\xbe" + + "\xbe\xbe\x4e\x3d\xbd\xb0\x2b\x19\xd6\x93\x45\x8a\x4d\x30\x5e\x81\x59\x4e\xe0\x09\x24\xfe\x4e\x72\x1e\xc7\x58\x09" + + "\xa4\x7a\xf7\x0f\xe3\x28\x68\xdf\x0b\x1c\xa0\xa0\x36\xe8\x4a\x86\xbe\x17\x21\xec\x5f\xd6\xe4\x23\xa3\xe1\x35\x1d" + + "\x62\x59\xcf\x28\x2e\x1d\x42\x8b\x12\x29\x18\xdd\x69\x01\x0c\xf2\xdf\xf0\xbb\x44\xca\x42\x64\x8c\x7a\xf5\x6f\x44" + + "\xf1\xc2\xa7\xa9\x2a\x1c\xcb\x05\x84\xc5\x96\xc2\xde\x59\x27\x99\x3e\xc6\xd9\xf4\xcd\x21\xc5\x89\x22\x8a\xf1\xb6" + + "\x01\x77\xdd\xfb\x12\x57\x85\xdb\xe4\x6f\x0f\xc4\x00\xb0\xee\xf0\x5b\x38\x99\x7a\x20\xd4\xae\xb9\x99\x7c\x51\xc2" + + "\x57\xc4\x00\x40\xbb\xb8\x1c\x51\x34\x33\x93\x4d\x57\xe4\xfa\x1a\xae\x81\x11\xe7\xbe\xfc\x13\xc0\x0d\x90\x89\xc2" + + "\xf0\x65\xe2\x61\xa5\x03\x17\x49\x7d\xe0\x80\x5e\xfc\xbd\xa3\xb2\xe0\x33\xc8\xb8\x4c\x20\xb6\x08\xbb\x06\xfe\xa6" + + "\x97\x6e\x9f\x77\x1d\x1b\xfd\x6d\x11\xf4\x7b\x64\x2b\x8a\x34\xfe\xee\xab\x38\xff\x82\x7c\x00\x0b\x2a\x0e\x8a\xdf" + + "\x2b\xe9\x87\xc9\x89\x89\xc4\xef\xc4\xee\x00\xdd\x0d\x55\x7e\x72\x2f\x1e\x3e\x54\x4d\xb3\x66\x6c\x1a\x1e\x8b\x40" + + "\x11\xbb\xb3\x73\x2c\xcd\x7b\xd3\xc3\x76\x6a\x16\x39\xc0\xc8\x36\xcf\xca\xe3\xe3\xdd\xdd\xa7\xc9\xac\x61\xa9\xd0" + + "\x41\x44\x88\x38\x40\x2f\x56\x70\xd6\x23\x64\x5a\xcf\x71\xa4\x5f\x08\xee\xe3\x6a\x65\xe4\x38\xd2\x92\x82\x38\xc5" + + "\xc7\x09\x0e\x1f\x6f\x2f\xa1\x3f\xe5\x2a\x40\xa2\x99\xb1\x8d\x70\x14\x6b\x70\xe2\xd0\x0d\x94\xb2\x31\x03\xed\x65" + + "\xcb\x56\x08\xac\x9b\xe2\xad\x41\x9d\x03\xce\xee\x17\x1a\x72\x81\x21\xb6\x20\xd7\x40\x3b\x34\x38\xa2\x81\xcf\xe6" + + "\x8c\x74\x66\x45\x13\x9c\x3a\xbd\x0c\xcc\xe9\xb3\xa0\x24\x8d\x84\xab\x3b\x59\xb7\x98\xed\x1a\x5b\xbf\x52\x17\x06" + + "\x54\x74\x30\xfe\xb0\xa3\x79\xfc\x8e\x07\xef\x28\x90\xfa\xd9\x20\x58\x98\x1e\xdc\x13\x80\x1b\x03\xb2\x9e\x52\xd0" + + "\x0e\x0c\x4c\x1f\xdd\x08\xa0\xd4\x4c\x32\x7a\x21\x07\x6e\x21\x15\xb8\x4a\x77\x1f\x69\x2a\xc2\x0b\x8f\x5b\x3d\x22" + + "\x1d\x99\x22\x2d\xb0\x37\x87\xf6\x14\x42\xfa\xe2\x4b\xde\x4a\x61\xbc\x9c\x8b\x8d\x1e\xe2\xbf\xb1\xca\x92\x57\x0e" + + "\xdd\x5c\xc4\x75\x3d\x2f\xf5\xa9\x02\x33\x7b\x71\xee\x98\x0c\xd7\x17\xbc\x39\x74\xab\xc3\x4d\x4a\x4a\x4b\x5f\x0d" + + "\xdc\x9f\x61\x17\xce\x8b\x86\x38\x8d\xd8\x43\x37\x2c\xea\x48\xa4\x27\xde\x80\x2b\x11\x11\xb3\xf0\x4c\xf0\xd7\xa3" + + "\x88\x01\x10\x27\xa4\xe4\x00\x78\xc7\xc4\x52\xc2\x25\xc9\xa1\x00\x5c\x01\x8e\xc5\xc3\x36\xfe\x8f\x50\x96\xdb\x09" + + "\xc9\xa7\xd1\x91\x88\xc9\xf9\xf3\xd4\x22\x9e\x8b\xe0\x15\x4b\x64\xc3\xc9\x30\xd8\xab\xbb\x27\xe5\xee\xfc\x29\x34" + + "\x2f\x50\x61\x74\x45\xc4\x4f\x78\x23\x85\xf1\xf7\xbe\xef\x8a\x52\x3d\xe3\x43\x61\x68\x3e\x4f\x36\xb1\x64\x77\xc4" + + "\xde\x8d\xdd\x33\xfb\x91\x49\xc9\x19\x72\x44\x9e\x83\x23\x76\x7b\xbc\x05\xa0\x14\x2c\xb1\xd6\xbe\x92\xd2\x7a\x25" + + "\xfd\x18\x3a\x0f\x6f\xd3\x85\xa4\x82\x07\x43\x55\x91\xfe\x23\x5c\x53\x1d\xbd\x88\x47\xb9\x42\x8e\x15\xba\xc4\xd9" + + "\xc1\xf1\xc4\x78\x38\xaf\x98\x6f\x65\x71\x8a\x63\xbb\xd0\x69\x06\xb7\xde\x5d\x32\x55\x84\x32\xe9\x03\xcb\x38\xa1" + + "\x32\xa6\x8a\x99\xad\x6d\x5b\x2f\xc5\xfe\xeb\x82\x16\xda\xb2\xc8\xcd\x8b\xfa\xa2\x9a\x52\x27\x70\xfa\x81\x84\xc2" + + "\xbb\x9f\x57\xfe\x0d\x2c\x48\x78\xf3\x9e\x20\xc1\xe8\x2d\x2d\x20\xbc\x77\x52\xf0\xeb\x6a\xaa\x84\x9c\x48\x0e\xa1" + + "\x37\xfc\xfa\xed\xba\x8d\xdf\xe3\x72\xfb\xf7\x5c\xbb\x2c\x42\x4d\xa8\x9b\x04\x3e\x11\xe7\x4d\x7a\x03\xfd\x77\xac" + + "\x7c\xbc\x44\xc1\xed\xe9\x93\x16\x25\xba\x23\x20\x99\xda\x53\x09\x1f\xd0\xef\x8a\x00\x86\x46\xf7\x45\x12\xc2\xd7" + + "\x7f\xf3\x90\x19\xa4\x27\xe8\xb0\x9b\x8d\x37\xa5\xac\x81\x78\xc0\x1b\x4f\x7b\x43\x5c\x1c\x67\xa2\xb0\x68\xd0\x83" + + "\x52\x0b\x8d\xe9\x10\xd9\x0f\x07\x92\x85\xa1\x87\x62\xee\xaf\xff\xfb\x68\x40\x18\x46\x94\x18\x10\x75\xa8\x91\xc0" + + "\x11\x24\x54\x75\x77\x37\xd0\xd4\xd4\x07\x36\x1a\x40\x82\xb6\x08\x70\x0c\xf5\x6a\xc0\x04\xa6\x37\x58\x33\x81\x82" + + "\x18\xf3\xb8\x05\x23\x23\x3a\x17\x4d\x34\xdb\x59\xf1\xfd\x53\xee\x13\x8f\xb3\xa7\x33\xba\x69\xa9\x37\x82\xcd\x4f" + + "\xea\x14\x1d\x4e\xfb\x56\x54\xad\x69\x10\xe7\x7a\xff\x8b\xe4\x1d\x7b\x2d\x26\x5b\x47\xcc\xd2\xeb\x3c\x5a\xdb\xd7" + + "\x39\xc2\x4d\xbe\xa6\x4a\x25\x44\x0c\x9a\x74\x7a\x1a\xde\xd4\x33\x92\x70\x93\xc6\x41\x6e\x0c\xf5\xfb\x5e\xb8\x4a" + + "\x42\x1f\x1c\x01\xed\x59\x08\x52\x82\x12\x8a\x49\x59\x5f\x4c\xd5\x57\x7b\x7b\x48\x06\x6c\x3b\x55\x8f\xf1\xc7\x64" + + "\xa2\x5e\x50\x80\x07\x7c\x11\x81\x48\x7d\xb9\xb7\xc7\x15\x13\x92\x87\x35\x39\xdc\x4f\x94\xd0\x6c\x55\xae\x4f\x0b" + + "\xc8\xb7\xf7\xbc\x2c\xaa\x56\x7d\x67\xca\xb9\x63\xde\xd0\xcb\x7d\x65\x9a\x65\x61\x6d\x51\x57\x63\xf8\x7c\xd1\xb6" + + "\xab\xe9\x64\x72\x52\x16\x55\x6e\x8b\xd3\x4a\x97\x60\x1b\x9a\xc0\x45\x39\x5e\x2d\x56\x93\xc7\x7b\x7b\xdf\x4c\xf6" + + "\xfe\x32\xf9\xf8\x4f\x37\x8c\xdd\xdc\x94\xfa\x6a\x22\x55\x82\xf0\xa4\xb3\xbd\x46\x92\x03\x69\x0b\xe9\xb0\x38\xbf" + + "\xec\xd5\x03\x43\xa1\x63\x16\x8f\xd4\x14\xfe\x81\x79\xed\x65\xa7\x83\xa6\x32\x15\xd3\x23\x7a\x69\x2e\xdb\x51\xac" + + "\xbf\x60\xd2\x53\xaf\x09\x9d\x94\x03\xa1\xa9\x30\xb4\x8e\x47\x53\x70\x8a\x3d\xca\x32\xd8\x0b\xfe\x63\xae\x32\x68" + + "\x37\x90\x0f\xe0\xb5\x4a\xf9\x7c\xe4\xf2\x57\xd0\x89\xbc\x9e\xc1\xa5\x49\x28\x22\x2f\x51\x1f\x3a\x50\x19\x14\xe0" + + "\x4c\x99\xe8\xfd\x75\x5b\x71\x2c\xc1\xe5\xc9\xca\x01\xcf\xdc\x25\x6d\xaa\xfc\xf9\xa2\x28\xf3\xc1\xe6\x0a\xd0\x06" + + "\x99\x85\x24\x05\xd0\x81\x31\x67\x95\x81\x08\x9e\x28\xdd\xaf\x47\x06\x2a\xde\xbe\x53\x4f\xc6\xfb\x23\x8f\xfe\xfc" + + "\xe5\xf8\x72\x14\x43\x41\x87\x94\x3f\x32\x69\x22\xd7\x39\x69\x74\x5e\xd4\xa4\x92\x1d\x64\x99\x93\x12\x1c\xf3\x88" + + "\xe0\xcd\x4f\x55\xe6\xfa\xe5\x48\x0c\xe0\x41\x0d\xdd\x09\xe2\xfc\x26\xae\x86\xb7\x90\x9c\x10\x7a\x1b\x20\x4c\xb3" + + "\xd0\xd1\x37\x80\xfc\x00\xce\xfb\x8c\x18\x46\xc9\x2b\x97\xfa\x0c\x5d\x94\x61\xec\x34\x5f\xe4\xb8\x03\xba\xc4\x04" + + "\x00\x69\xa4\x5e\xbf\xdc\xdf\x13\xed\xd7\xab\xf6\x1d\x7c\x64\xd8\x02\x60\xe9\x67\x68\x3d\x0e\xbd\x03\xc6\x78\xc5" + + "\x7c\xb2\x2d\x72\x48\x4f\xe8\x44\x25\xf6\xf1\xf3\x69\x78\x96\xba\x39\x43\x74\x31\x2e\x81\x35\x0e\x08\xd4\xda\xbd" + + "\x87\x11\x2d\x65\x19\x98\x1e\x5c\x78\x5f\x71\x70\x05\x11\x1d\x7f\x11\xde\xde\x07\x43\x0c\xfd\xf6\x3d\xf7\x39\x9a" + + "\x74\x45\xdb\x75\xa9\x8b\xaa\xd5\x85\xeb\x7a\x6b\x69\xbd\x50\x71\x7f\x62\x66\xf5\x92\x30\x15\xdc\x62\xde\x32\x77" + + "\x9f\xbc\xf3\x9f\xfa\x4d\xc8\x1e\xb8\x19\x66\x9a\x89\x77\x26\xb4\x97\xc9\xc1\xc1\x93\x7f\xa7\x6f\xa2\x1a\x0e\xb8" + + "\x8e\x9b\xe1\x80\xd1\x4d\xdd\x69\xac\xea\x1c\x04\xe1\x91\x72\x6c\x2e\xfc\xb5\x7d\x0f\xa2\xda\xbf\xc3\xf0\x5f\x61" + + "\xcd\x5e\x35\xe3\xf0\x62\xb3\x8d\xc4\x95\xf9\x57\x80\x8c\xa9\x32\xf7\xf9\x9f\x82\xcb\x05\xa2\xe8\x98\x94\x67\x3d" + + "\x0d\xf7\x31\x7d\xfd\x1a\x08\x6a\x3e\x54\xc5\xfd\x92\x38\xbe\x1b\x84\x9c\xcd\x83\xdf\x88\xc9\xec\xa1\x45\x47\x90" + + "\x74\x0d\xba\x50\x61\xbc\x6b\x1c\xff\x1a\x82\x94\xd0\x57\xf6\xd4\xb4\x13\x6b\x5a\x19\x9b\x4a\xf9\xe6\x46\x3e\xd9" + + "\x1c\xa0\xbd\xf8\x00\xd4\x0d\xa9\xe7\xaa\x38\xe5\x5c\x15\xa7\x9a\x0b\x3f\x1f\x27\xee\x2f\x49\xc4\xcf\x2b\x01\x51" + + "\x08\x36\x0d\xf0\x84\x12\xbd\xd3\x8d\x01\xb6\x92\x36\xa9\xe0\x25\x49\xd6\x82\xe1\x9e\x9a\xf6\x99\xef\xb1\x6b\xd6" + + "\xb6\x4d\x37\x74\x2c\x86\x8f\x77\xcd\xf5\x4e\x71\xd2\xc5\x67\x65\x99\x76\xa8\xac\x2f\x4c\x33\xd3\xd6\x50\x91\xbf" + + "\x37\xfa\x24\xe4\x26\x47\xb4\xbf\x62\xae\xea\x0a\xe3\xee\x7c\x4e\x76\xec\x38\x4e\x0e\x22\xc3\x5c\x5f\x0b\x53\xf4" + + "\xaf\x6f\xbe\x7f\x51\xcf\x3a\x99\x6b\x29\x78\x01\x80\xb0\xdb\xfa\x7b\xd7\x36\x04\x2f\x0c\x45\xa4\x7a\x38\x69\x70" + + "\xc8\x92\x1c\x36\x28\xa8\x0f\xa2\xc3\x08\x5e\xd3\x63\x77\x6e\x49\x25\x4c\x1b\xfe\xd0\x9f\x65\x35\xf5\x07\xbc\xc7" + + "\x6e\xba\x31\xc7\x5c\xd0\x1f\x05\xea\x11\x85\xe4\xf7\x1d\x96\x04\xf4\x5a\xaa\xc1\x93\x78\x03\x7b\x6b\xa2\xa7\x6e" + + "\xea\x2a\xac\xf3\xd3\xf2\x3c\xf5\x68\xdf\x11\x38\x41\x6c\xaf\x98\x24\xed\x08\x34\xca\x08\x10\x3c\xd2\x80\xf5\x8f" + + "\xe4\x93\x53\x56\xc9\x21\x44\x33\xd9\xe9\x7c\xd4\x77\xac\x8d\xa9\x6c\x51\xe5\xb0\x37\xfa\xe7\x1a\x92\xac\x57\xbb" + + "\x90\x04\x08\x68\x40\xd8\xf0\x8c\x47\x0d\xc8\x9a\x17\x46\xb8\x12\xb4\x75\x98\xd1\xa4\x3f\x5e\x29\x42\xd8\x3f\x61" + + "\xe6\xa7\x7e\xae\x52\x5f\x9a\x7e\x3a\x2c\x16\x53\x52\xbf\x20\xd6\xff\xe0\x73\x7a\x88\x34\x06\xae\xff\x3f\x40\x3e" + + "\x51\xce\xb1\xc7\x39\xdc\x70\xe3\x0f\x54\x53\xd5\xed\xc5\xa2\x68\xc3\x24\xc0\xf2\x84\x0f\x39\x4f\x4b\x02\x25\xc0" + + "\x73\xcf\x98\x50\x03\x3a\x9e\xfe\xc3\xa3\x62\x67\xe7\x58\x58\x24\xb8\x8f\x61\x2d\xd0\xa9\xf1\x52\x26\x99\x72\x7f" + + "\x49\x1b\xee\xb7\xa8\x36\x92\xeb\x70\x6a\x5a\x76\xaa\x56\xad\xbb\xfb\x81\x58\x0f\x1e\xec\xef\x7d\xfd\x97\xbd\xa1" + + "\xd0\xf5\x7d\xca\x29\x0f\x7a\x3e\x8a\xea\x87\x80\x17\xbb\xaa\x2b\x48\x1e\x2c\x63\xfb\x41\x53\x4f\x85\x11\xec\xd1" + + "\x8f\xe8\x38\xb1\x9c\x78\xd7\x56\x98\xb8\xb0\x9e\xe2\xe0\x74\xd3\x4e\xe3\xe2\x7b\xb2\x45\x3e\x42\x8e\xba\x73\xa2" + + "\xe1\xcd\x89\x66\xd2\xf8\x9b\x1e\x56\x26\xce\xdd\x87\x5c\x4f\xc0\xcf\xf3\x9a\x11\x8c\x8c\xf3\xb1\x94\xcc\x4c\x75" + + "\x26\xca\x27\x9d\x05\x3e\x0a\x2c\xfe\xc8\x86\x9f\xac\xdb\xd6\xfd\x04\xbe\x2e\xb8\x4a\x34\xc6\x1a\x84\x75\x65\x94" + + "\xa3\x4a\xbd\x7e\xf9\xd5\xee\x37\xa1\x56\xcc\x1b\x8f\x6f\x31\xa1\x21\xb0\xf9\x45\xa5\xdc\x15\x83\x0d\x15\x16\x20" + + "\x1e\xb0\x76\x2c\x9a\xaf\x21\xa6\x18\xd8\x40\x8f\xc0\xc5\x19\xe1\x98\x0f\x10\xb4\xa8\x97\x96\x65\xae\xf6\x2c\xbe" + + "\xfa\x04\xf9\x96\xf6\xc1\x50\x1f\x9e\xa9\xc4\x2a\xd8\x43\xfd\x3a\xa9\x95\xa5\x5a\xf2\x3b\x9f\xb4\xfa\xa4\xb3\xd7" + + "\xb7\xef\xf9\x3b\xa8\x17\xc0\xb4\x87\xc0\x0b\x1b\x53\x58\xee\xd8\xc8\x04\x53\xbd\x84\x88\xaf\xee\xe9\x02\xbe\x83" + + "\x50\x34\xc2\x8e\xbf\xfb\xa6\x4a\x68\xee\xc6\xeb\x42\x7e\x20\x58\x4a\x3a\xf7\xac\x4e\x91\x1a\xd8\x4d\xe7\xd8\xd6" + + "\xeb\x66\xe6\xc9\xd8\xe4\xc3\xc5\xce\xe4\x54\x0d\x6f\xd7\x84\x9f\x42\x56\x4d\xa2\x52\xc8\x82\xf7\xa4\xb8\xf3\x77" + + "\xc4\xd3\x70\x24\xe3\xb2\x07\x1b\x98\x53\xe0\x5d\x24\x79\x86\x54\xc0\x0b\xe6\xf5\xf9\x78\x46\xc5\x80\xb7\x82\x4c" + + "\xf1\x20\x28\xcd\x8b\xca\x11\x63\x00\xed\x4b\x52\x04\xc1\xf4\x7b\xc8\x1b\x1f\xb2\xe6\x53\x2d\xe2\xe8\x90\x19\x62" + + "\xb9\xa3\xdb\xf9\xa7\xfe\x62\xe8\x0c\xca\x67\x79\xc4\x2b\x13\xeb\xeb\x1f\xe1\xfd\xf8\x5e\xeb\x32\x65\x7c\xc1\x91" + + "\x46\x6b\x53\x93\x62\x6e\xe4\x7e\xa0\x9e\x08\x65\x71\x90\xb6\x9a\x79\x3d\x5b\x83\xb0\xc9\x60\xb1\x40\xa5\xae\x51" + + "\x6c\xbd\x76\x4c\xbc\x6e\x8c\xbe\x46\x4a\x34\xfc\x6c\x52\x6c\x16\xb3\x1c\x09\xff\x2f\x88\x59\xe8\x9d\xf5\xaf\x88" + + "\x59\x3f\xf6\x34\xfc\xe9\x62\x16\x47\xf0\x2d\x0a\x7b\x74\xc7\x6d\x9a\x02\x7f\x6c\x14\xba\xe8\x7b\xce\xcf\x3e\xaf" + + "\x9b\x6c\xaa\xb2\x45\xbb\x2c\x5f\xd5\x0d\x7a\x90\x64\xb3\x52\x5b\x0b\x69\xc2\xdd\x1f\x3f\x50\x4c\xa8\xf7\x01\x8e" + + "\x87\x74\xab\xd4\x86\x07\x03\x45\xb7\xaa\x6e\x2f\x97\xe5\xbf\x20\xbd\x89\x50\xac\xff\x73\xd2\x1b\xf6\xde\x09\x26" + + "\x9f\x26\xcf\x48\x2e\x8b\xbe\x15\x94\xe0\x55\x71\x89\xcb\x46\xfd\xd7\xb3\x05\x4e\x93\x14\x81\xee\xe4\x9f\xba\xe2" + + "\x90\xc8\x5a\xd1\x4d\x01\x79\x67\xb2\xec\x34\x27\xc7\x7f\x93\xf4\x71\xe8\x79\x60\xa6\x16\xf8\x59\x1a\xb5\xed\x27" + + "\x2d\xe5\xeb\xe3\x4e\xfd\xeb\x82\x44\xb7\x23\xb2\x1b\x5d\x67\x77\x9a\x4b\xe6\xd1\xf4\x09\x64\xfd\x67\x3e\xad\x27" + + "\xeb\x63\x47\xd0\x82\xfd\xbd\xd0\x36\xe2\x41\xf4\x09\x68\xcf\x09\x2a\x29\xd0\x39\xe2\x59\x53\xf0\x02\x4e\x71\xbf" + + "\x68\xcc\xdc\x83\x8b\xc2\x13\xee\x91\x87\x10\xdd\xdd\x4f\xd9\xcd\xde\x04\x7c\xaf\x5f\x7e\xb3\x83\x4f\x48\x0f\x59" + + "\x19\x6b\xc9\x46\xcf\x6a\xce\xa2\xa2\x1f\xa7\x4d\xbd\x5e\x71\x46\xeb\xa2\xd2\xb3\xd9\xba\xd1\xad\xd9\xbe\x17\xf3" + + "\xa0\x52\xc9\x19\x19\x8e\x04\x50\x7b\x50\x82\xc2\x2c\xdd\x36\x81\x10\x49\x81\x2a\x58\xa2\x12\x01\x92\xfd\x69\x90" + + "\xb9\xa9\x08\x02\x5e\x9b\xaa\xed\x03\x6e\xdf\xea\xbc\xf2\x3d\x81\xd9\x93\x11\xcd\x42\xfa\x8b\xdc\x9e\x6f\x3a\x66" + + "\xfa\xed\x7b\x5b\x19\xcf\x3f\x90\xcd\xac\x31\x3a\x7f\x5b\x95\x57\xf8\x6b\xa9\x2f\xbf\x87\x9b\x01\x7f\xce\x4c\x59" + + "\xbe\x5b\xe9\x19\x24\x58\xe4\x07\x3f\x12\x98\x26\x7e\x5e\x5f\xbc\x5b\xe9\x8a\xde\xd6\x65\xf8\xb1\xb6\xe6\x8d\x5e" + + "\xe1\xdf\x10\x22\xf7\x2d\x64\xd0\xe3\x92\x95\x13\x61\x5f\xe6\x45\xeb\xf6\x50\xb6\x7d\xef\xb8\x93\x36\x33\x25\x24" + + "\x70\xe5\xc4\xd7\xf8\x31\x81\x2a\xf6\xde\xc4\x70\x0d\xb8\x5b\xf8\xe8\x43\xfb\xa1\xf9\x50\x7d\x98\x1f\x4f\x4e\x6f" + + "\x51\x6a\xe6\xf9\x73\xf7\xc5\xc6\x2c\x7c\xe0\xad\xe0\x4a\x18\xcb\xd1\x65\xb3\x75\x33\x72\xcf\x7e\xff\x7d\xa4\x3e" + + "\x8e\xd4\xbc\xa8\x74\x09\x12\x8d\x8f\xd3\x9d\x61\x00\xc7\xe6\x14\x7b\x2c\xfa\x74\xa4\xe3\x32\xa0\xb0\x47\x41\x37" + + "\x9b\x5c\xeb\x53\x18\x8b\xcd\x17\xb5\xfa\x98\xaa\x79\x7c\xc6\x2c\x9e\x04\xaa\x2e\xf2\x1a\xfa\x48\x59\x6e\xfc\xf5" + + "\x1a\x12\xf7\xdf\x74\x55\x4f\x3c\x76\x71\x7d\xbc\x5f\x80\x41\xe0\x23\xf3\x86\x8c\x79\x05\xf2\x05\x32\xbf\xb3\x7a" + + "\xb9\x6a\x8c\xb5\xc5\x49\x51\x16\xed\x95\x1a\x58\x63\xc8\x40\x0d\xfd\x42\x11\x9a\x56\x01\xe0\x50\x71\xd8\xd7\xd7" + + "\xa0\xe3\xe9\xd1\x1b\xc4\xf8\xe2\xb7\x27\xa5\xa3\x24\x58\xc8\xb9\x14\x1e\xed\x61\xb6\x6e\x3a\x28\x9c\x02\xb2\x10" + + "\x5e\x84\x49\x61\x5a\x37\x50\x99\xca\xd4\x4e\xfa\x7a\x07\x1e\x0f\xc7\x8d\x59\x95\x7a\x66\x06\xb4\x4f\x47\xf8\xd8" + + "\xd3\xc4\x4c\x21\xa0\xc5\x56\xf0\x1a\x47\x0f\xdf\x75\x23\xe4\xbd\x8f\x01\x2b\x53\x28\x3b\x60\x43\x82\x4f\x31\x4c" + + "\xd3\xd1\xc7\x58\xd7\x11\x6a\x12\xb9\xf1\xa1\xab\xf8\x21\xf5\x50\xfd\x55\xa6\xc7\xa7\x69\xd8\x39\x90\x85\xb8\x65" + + "\x2f\x5e\x7a\xdd\x02\x44\xc2\x56\xe5\x95\xd2\xd6\x16\xa7\x15\x42\xf9\xcd\xe7\x86\xad\x53\x1a\x64\x8a\x75\x55\x19" + + "\x93\x9b\x5c\x35\xa6\xca\x8d\x3b\x0f\x63\xfa\x3c\x9c\x24\xe1\x34\xd1\x14\x4b\x9a\x80\x48\x04\x4e\x26\x18\x1c\x17" + + "\xc3\xe7\xa9\x70\x1c\x0a\xca\x62\x9b\xbc\x67\xfb\x5c\xa1\x3b\xec\xf2\xff\x1c\xd9\xe8\xf0\xeb\x98\x83\x38\x38\x31" + + "\xfd\x5f\x4f\x50\xc4\x0c\xfd\xcb\x34\x65\x03\x45\xf9\x5f\xa6\x02\x40\xc0\x0a\xab\x9c\xa8\x6f\xac\xa5\x8c\x12\x40" + + "\xc3\xee\x22\x60\x4c\x55\x87\xff\x07\xe9\xc9\xff\x20\x39\x09\x3a\x9b\x47\xba\x2c\x1f\xa9\xa2\xb2\xad\xae\x66\x9c" + + "\x48\x23\x54\x75\x27\xc9\xf9\xdb\x41\x0f\xcd\x81\xec\xf5\x61\x7c\x9d\xef\x68\xa8\xff\x4b\xc4\x08\x77\xda\x61\x0f" + + "\x51\x52\x53\xb4\xcc\xff\x5f\x41\x99\xd0\xd3\xae\x9f\x32\x8d\x10\xbd\xef\xdf\x83\xea\x10\x9c\x47\x82\x3f\x0a\x13" + + "\x96\x9e\x58\x16\xff\x65\xec\x38\xc9\x91\x1d\x07\x7d\x51\x2e\x32\x67\xa8\xfb\x94\xd2\x86\x26\xbc\x86\xf2\x19\x44" + + "\xbb\x34\xa3\xc7\xb4\xf5\x5f\x23\x58\xc5\x46\x82\x25\x26\x2e\x22\x58\x48\xaf\x8a\x94\x5e\x85\xb9\x1c\xca\x69\xed" + + "\x63\x8b\x3e\x31\x0d\xea\xe6\x79\x04\xbf\x5d\xc4\x4c\x2c\xaa\xbc\x38\x2f\xf2\xb5\x2e\xf1\x58\x82\x30\x48\xe7\xcd" + + "\x5f\x38\x3f\x88\x44\xea\x32\x7b\xf4\x96\x35\xe5\xdc\xdf\xab\x89\xcf\xfd\x96\xff\xd4\x9b\x65\xee\xa4\xa7\x11\xad" + + "\xf0\x7b\x38\x54\x74\x04\x04\xf6\x38\x51\xd4\x83\x83\x8b\x32\x80\x19\xe0\x3f\x3b\x2d\xce\x4d\x35\x52\x76\xa5\x67" + + "\x46\x59\xb3\xd2\x0d\x40\x44\x95\x05\xc7\xe0\x11\x66\x88\x29\xe7\x4e\x42\xa5\x75\x8a\xae\x0f\x11\x2d\xe3\x4a\x45" + + "\xbb\x49\x14\xf4\x07\x2b\xc6\xd1\xc0\x8f\xc2\xde\xec\xfb\x62\x3b\x32\xa4\xb8\x8b\x01\x57\xe5\x62\x51\x97\x46\x2c" + + "\x08\x6e\x02\x99\x7e\x8d\xd7\x36\x32\x7d\xd3\x75\xbe\x21\xe3\xae\x48\x4e\x29\x87\x29\x26\x12\xe1\x08\xc3\xcb\x62" + + "\xae\xac\xe1\xe9\x0a\xf1\x15\x56\x44\x08\xfe\xf6\x9b\x2f\xfe\xdb\x6f\x59\xf7\x12\xee\x81\x41\x41\x94\x5a\x9f\x02" + + "\x7e\x01\x69\x10\xc3\x58\x43\x8a\x96\x06\x01\x7b\x4d\xae\x32\x50\xd2\x67\x01\xf0\xaa\x5d\x78\x7f\x53\xa8\x4c\x4c" + + "\x18\xd4\x31\x28\x18\x0a\xf7\x42\x5b\x05\x08\x0f\xae\x18\x42\xc0\x59\x7d\x6e\x72\x55\xb4\xc3\xb1\xaf\xef\xad\x87" + + "\xa5\x39\x01\x3b\x0b\x78\x29\x5c\x2c\x74\x6b\xce\x4d\x43\xd9\x51\x30\xc7\x4f\x79\x45\xdf\x0f\xc0\xe9\xe7\x0a\x40" + + "\xc2\x05\x14\xd7\x5c\x97\xa5\xaf\x81\x01\x72\x64\xd6\x47\xcc\xa0\x0e\x8e\xf2\xae\x5e\x98\xf3\x9c\x7a\x92\xcc\xde" + + "\x41\x3a\x9d\x11\x6a\x30\xc5\x46\x62\x02\xab\xfe\xf8\xcd\x78\x75\xf0\xb4\xf1\xd5\x92\xc4\xf3\x6c\xdf\xdb\xe2\x63" + + "\x10\xc5\x2c\x13\xa4\x5a\x87\x09\xa5\x0e\xe2\x25\xea\x4b\xe1\x3d\xda\x61\x18\x3b\xec\x62\xc2\x3a\xc5\x8c\x93\xdf" + + "\xa7\x47\xc5\x71\x1f\x63\x83\x6d\x72\x81\x84\x83\x09\x0c\x8c\xe0\x5f\x86\x81\x5b\x90\x5b\x3f\xe6\x12\x98\xac\x36" + + "\x6b\xf3\x74\xd3\xe5\xe8\xed\x9f\x37\x7d\x8a\x02\x2a\x74\xa0\x26\x1f\x9a\xdb\x34\x04\xe7\xba\xbc\x95\xcb\x17\xce" + + "\x3e\x2a\xdc\x4b\x38\x97\x92\xa9\xdc\x8b\x12\xf2\xde\xef\x30\xf9\xd1\x84\xc6\x0a\xba\x44\x71\x7a\xae\x4b\xd2\x9b" + + "\xa2\x66\xcd\x4d\xb8\x34\x16\x25\xef\x59\x3d\x97\x6a\x51\x62\x9e\xf0\x5f\xd0\x59\x66\x30\x17\xd9\x2d\x2e\x1c\x89" + + "\xed\x24\x49\xdd\x9e\x5a\x42\xe3\x95\x45\xce\x03\x1d\x16\xc4\xb5\x78\x18\x28\x20\x59\x94\x96\xb5\x6d\x41\xc7\x5e" + + "\x57\x7c\x6c\x67\xda\x7a\x3e\xb4\x31\x6d\xd8\x65\x58\xf9\x48\x65\x59\x60\x92\x43\x4d\xf0\x19\xe5\xe8\xf4\x89\x6f" + + "\xaa\x75\x59\x22\x12\x83\x23\x76\x88\x18\x11\xaa\x0e\xde\x14\x78\xb4\xfd\x48\xe3\x84\x48\x11\x23\xe3\x37\x89\x8c" + + "\x8d\xef\x30\x34\x4f\xef\xe2\x1f\x04\x3b\x43\xa6\xe5\x38\xd1\x2e\xe6\x26\xa6\x03\x79\x3f\xf2\x90\x90\xbd\xf2\x3d" + + "\xa5\x74\xec\xbe\x73\xbe\x30\x1a\xad\xbb\x62\x5c\x31\x4a\x98\x09\xb7\x92\x83\x61\x7f\xd6\x4e\x51\x49\x27\x04\xed" + + "\x7d\x63\x74\x2b\x26\xba\xa0\x1c\xb4\x59\xf6\x94\xf3\xc2\xd2\xc4\x03\x38\x22\x2e\x72\xe8\x33\x54\x9d\x7a\x32\x61" + + "\x7b\x59\xd6\xe7\xb2\x14\xb8\xdd\x18\x06\x24\xfa\x78\x67\xd3\xd7\x3d\x48\xb2\x92\x01\xc1\x86\x25\x6a\xd4\xb9\x2e" + + "\x47\x9b\x28\x48\x62\x9d\x4f\xb7\x53\x70\x65\xe2\xf3\x93\x04\xf0\x6d\x24\x0d\xa8\x37\xdd\x4c\x1a\xfc\xf6\xb8\x8d" + + "\x34\x20\x03\x60\x4d\x4b\xae\x46\x36\x1c\xf2\x11\x5c\x9e\xfe\xe6\x44\xd7\x23\x86\xbb\x08\x6b\x83\x29\x58\xc0\xf8" + + "\x34\x88\x4d\x34\x70\xbf\x25\x49\xb0\x47\x38\x57\x9e\xb0\xc0\xf2\xf4\xd0\x15\xe8\x7c\xc7\xe1\xa1\x37\xd9\x7f\xd7" + + "\xaa\xc8\x73\x40\xb6\x11\xb4\x21\x7c\x92\xa1\x24\x78\x70\x6c\x72\xdd\xf2\x3d\xef\xf8\x9d\xa5\xe6\x69\xd8\x27\x82" + + "\x04\x09\x83\xc7\xfe\xde\xee\xfe\xfe\x8e\x90\x62\x57\x08\x5e\x67\x2e\x5b\xd5\x2e\x9a\xfa\xc2\x2a\x73\x39\x33\xe4" + + "\x73\x3d\x78\xb0\xff\xe5\x57\x5f\x7f\x35\x52\x0f\xf6\xbf\xfc\xfa\xc9\xd7\x43\x96\xea\xa5\xa4\xca\x3f\xcc\x65\x1b" + + "\x7c\x18\xe5\xa4\x09\x9f\xfc\x3f\x33\x13\x4e\xaa\xc4\xde\xb1\x1c\xc1\x9e\xe0\x44\xda\x23\x44\xc8\x80\x0f\x40\xbe" + + "\x18\xc2\xb0\xe1\xbf\xaf\xbc\xa9\x55\x88\x44\x50\x72\x17\x00\xb4\xaf\xaf\x7d\x5c\xa5\x97\x6c\x28\xb3\xf5\x01\xb8" + + "\x75\x1e\xe2\x34\x07\xc4\x48\x48\xa3\xe9\x5f\xe2\xc7\x3b\x00\x0b\xce\x88\x93\x02\xf0\x96\x78\x21\xdf\x84\x5f\x2e" + + "\xa8\x84\xd7\x6b\x4b\xd6\x25\xa2\x84\xdd\x6a\x7d\x5f\xd7\x2b\x58\xa6\xf5\xe9\xc2\x23\x2b\x7a\x73\x52\x00\x46\x4b" + + "\x34\x52\x4b\x7d\x99\x68\xa4\x68\x2e\xd1\x0d\xdf\x7d\xc4\x7a\xa9\xb0\x33\xc0\x5d\x49\xe5\xb5\x81\xb8\x75\xca\xc5" + + "\xe9\xdb\x42\x97\xa4\x79\xdd\x2c\xd1\xd7\x49\x0d\x1e\x3c\x7e\xf2\x64\x7f\x28\x45\xaa\x01\xef\x2e\xff\x95\x9b\x60" + + "\x98\x76\x06\x22\xf0\x1e\x59\xd0\xe4\x0b\x30\x77\x07\x5c\x1d\x58\x6d\x9f\x22\xc6\x3b\xe8\x3b\xb9\xa0\x52\x5a\x3c" + + "\x20\xeb\x9c\xaf\x6b\xa0\xfa\x5c\xf7\x0f\xc1\x75\x1f\x20\x6c\xf9\x11\xaf\x53\xe4\x4a\x3c\x80\x8c\x32\x50\x80\xe9" + + "\x04\xd1\x7f\xd1\xdd\x81\xaf\x4c\xd8\xd3\x7c\xbd\xc2\x20\x1e\x9c\xcc\x3a\xe5\x47\x10\x48\x02\x5d\x47\xa7\xb3\xe0" + + "\x49\x8b\x13\xf2\x77\x83\x31\x10\x84\xbc\x33\x23\x9a\xed\xd6\x36\x84\x46\x70\xf9\xf3\x48\xb9\xcd\xcd\xf1\xcd\xf9" + + "\x34\xaa\xf8\x17\xce\xcb\x57\x19\x48\x97\xae\xb4\xbb\x6f\xa0\x62\xb7\xfd\x28\xb6\x82\x3f\x40\xc4\xa4\x2a\x52\x30" + + "\xf5\x39\x7e\x49\x0d\x19\xc6\x92\x94\x6d\xb1\xfb\x8e\x02\x35\x3c\x5a\x1f\x36\x16\x75\x9b\x03\xea\x12\x87\xb4\x9b" + + "\x2e\x63\xe7\xdb\x64\x4c\x49\xce\xd5\xfb\x29\xee\x82\x84\x69\x56\xd4\xd5\x3b\xc7\x52\xff\x19\xf2\xe2\xe9\x80\xbf" + + "\x7d\xcf\x4c\x0c\xf7\x2e\xcf\x78\x7c\xfa\x3b\x5a\x8d\x62\x77\xf7\x13\xce\xa2\x38\x49\xe9\x41\x0a\xcc\x5d\x45\x9d" + + "\xa0\x12\x44\x38\xa9\xb7\x28\xd9\x44\x1a\x0c\x3f\xfc\x18\xf2\xb4\x33\xd5\x4e\x82\xad\x9b\x99\x93\x83\xeb\x0b\x4b" + + "\xdc\xd1\x89\x01\xa8\xf4\x59\x5d\x59\xf4\x18\x2e\xaf\xd0\x85\xae\xaa\xab\x5d\xd0\xe9\x84\x44\xc9\xe8\xbb\x28\xa4" + + "\x80\xfb\xa1\xe9\xd0\x9f\x2e\xb5\x56\x07\x8a\xcd\xf7\x09\x90\x68\xb4\xec\xdb\x7d\x96\xfd\x9f\x74\x5e\xd4\x16\x9c" + + "\x49\x38\x5c\x0a\x5d\x68\x5b\xd3\x4c\x2c\xf9\x8b\x25\x51\xe6\xe8\x1b\x3a\x12\x41\x5b\x6a\xa3\xe5\x38\x66\x71\xc0" + + "\x58\xfc\x07\xde\x6e\x77\xee\xbd\x4f\x4a\x14\x10\x12\x87\xa2\xfe\xd6\xf5\xa8\x77\xb5\xe9\x8c\xbb\x52\x74\xbe\x43" + + "\x7b\x28\xcc\xa6\xd3\xe4\x63\x54\xef\xa7\xe1\x60\x71\xb0\x6a\x3a\xc4\x31\x26\xe3\xde\x70\x59\x4b\xe6\xe2\x17\x73" + + "\x72\x56\xb4\xfc\x38\xcb\x30\x3d\xb6\x1b\x8f\xc9\x41\x83\x6f\x74\xae\xea\x39\x06\xa8\x15\x73\xa5\xfd\x46\x71\x84" + + "\x28\x06\x17\x93\x6e\x23\x11\x69\x26\x26\x48\x50\xe5\x43\xac\x70\x9a\x7a\xbe\xde\xf4\x49\xe7\x60\x58\x10\xe1\x20" + + "\xe8\xec\xe1\xfd\x41\x77\x11\x3d\xa5\x9a\x95\x6b\x0b\x94\x35\x75\x77\x50\x83\xec\xa4\x5c\xbb\x8b\x6f\xb6\xb6\xf8" + + "\xdf\xa2\xc2\x7f\xeb\x75\xab\xca\x5a\xe7\xee\x3e\x2c\x7e\x37\x0a\xd3\xf1\xab\x75\x05\x0f\x67\x65\x31\x3b\x53\xf9" + + "\x49\x89\x7f\x64\x6a\x07\x9c\x23\xea\xb5\x35\x79\x7d\x51\x29\xf8\x6b\xbd\xc2\x7f\x41\x9b\x05\x7f\x41\xba\x26\xfc" + + "\x6b\xdd\xe2\x1f\xa6\x6a\xf9\x59\x69\xdc\x69\xa4\xba\x28\xa1\x1c\x85\xe5\xd9\xf5\xc9\xb2\x68\xd5\x99\xb9\x82\xea" + + "\xcf\xcc\x15\x18\x91\xdc\x1f\xeb\x95\x32\x4d\x53\x37\x0a\x5c\x26\x2e\xdb\xa5\xa9\xd6\xd9\x50\x20\x79\x6e\x74\x2a" + + "\xc5\x38\x35\x0a\xf2\x32\xe7\xa6\x6a\xd5\x49\x01\xae\xe3\x77\xc6\xd7\xe7\xba\xd5\x02\x5c\xd2\xbb\x19\x76\xdd\x07" + + "\xf7\x24\xca\x57\x70\x52\xc4\x40\x04\x51\x8d\x00\x4d\x68\x9b\xe2\xf4\xd4\x34\xd2\xd5\xbc\x1b\x77\x1f\x6b\x5e\x16" + + "\x6e\x66\xe5\x99\x9d\x57\x6f\xcf\x4d\xe3\xea\x7e\xbb\x6e\xfb\x5c\x13\xc3\xe4\x73\x61\x35\x1c\x87\x65\x18\xd0\x97" + + "\xd7\xd7\xfe\xad\xd0\xa8\xb9\x69\x4a\x11\x72\xec\x68\xd3\xac\xf8\xa1\x53\xb1\x74\xec\x1e\x7a\x67\x5d\x6d\xa8\x78" + + "\x43\x95\xf3\x79\x52\xa7\xac\x6d\xfb\x1e\x38\x5a\x9e\x26\x90\x7c\xac\xd2\x1b\xfd\xc9\x4e\x87\xef\x7a\x3b\xfe\x49" + + "\x4d\x85\x46\x26\x13\x85\xcb\x8b\x7a\xfc\xa1\x02\xf6\x36\xf9\x40\x1d\xb9\x4f\x8e\x11\x8b\x77\xd3\x0e\x43\xf5\xe1" + + "\xa1\x98\x91\x50\x4b\xf6\xe8\x51\x16\xac\x46\x72\xba\xbc\x62\xf3\xfa\x1a\x4a\x89\xf1\x08\x12\x83\xd1\x91\xd5\xcc" + + "\xf4\xa1\x2f\x80\x66\x10\x82\xc3\xd5\x81\x1a\x4c\x3e\x1c\x4e\x02\x65\x92\x74\x34\x8a\x05\x76\xbc\x5a\xdd\x9c\xe9" + + "\xa6\x5e\x57\xb9\x9a\xeb\xa2\x84\xe0\x58\x56\x54\xec\xce\xb4\x45\xed\x06\x86\x6e\xfa\xdd\xbe\xd2\x8d\x35\xff\x78" + + "\xf7\xf6\x87\xce\x29\xa4\x19\xa5\xe9\x71\x45\xb0\x30\xbd\xf5\xa1\x4d\x22\x76\xfe\x79\x53\x5b\xbb\x4b\x8c\x80\xba" + + "\x5c\x96\xca\x7d\x01\xc7\x5e\x36\xf7\xeb\x9b\xef\x37\xb5\xe6\xc6\x7e\xb9\x2c\x47\xaa\x5d\xae\xc2\x4d\x04\x05\x82" + + "\xeb\x01\xfc\xec\x43\xb5\x4b\xbc\xd1\x6e\x3a\x41\xd5\xaf\x5f\x7e\xb3\x7d\x6f\xab\x6d\xae\xc8\x43\x11\xb2\x57\x54" + + "\xe6\x42\xbd\x78\xfb\xe6\x47\xd7\xb5\x86\xc2\xe6\xd0\x75\xb5\x5d\xae\xb0\xc7\xaf\x9a\x7a\xf9\x0e\xda\x62\x0a\x95" + + "\x39\x8a\x38\xb9\x5c\x96\x24\x67\xdf\xa8\x19\xe4\x19\x19\x28\x7f\x95\x63\x1d\x71\xd6\xef\xed\x00\x4b\xe1\x5e\x5f" + + "\x5f\xbb\xd1\xba\x9b\x8b\x02\x75\xed\xb7\x57\xef\xf5\x29\x8a\x01\x19\x34\xdd\x00\x0d\xee\x66\x48\xe5\xdb\xc6\xbd" + + "\x1d\xa8\xec\x75\x05\x89\x84\xd5\xaf\x6f\xbe\x9f\x82\xb6\x1b\x27\x95\x61\x2d\x68\x66\x2e\x97\xa5\x58\xb1\x73\xdd" + + "\x10\x3a\x02\x05\x0d\xab\xb2\x9e\x71\xb4\x88\xfe\xa8\x2f\xbf\xaf\x67\x3f\xea\xa6\x05\xde\x96\x7e\x33\x46\xb7\xab" + + "\x73\xa1\x01\x5b\x6a\xf2\x60\xfc\xe8\xb3\x89\x2b\xd3\xb4\xe0\xf5\x36\x38\x3a\x7c\x78\x3c\xfc\xed\xe0\xe8\x3f\x1f" + + "\x1e\x3f\xc2\x17\x0b\xa3\x73\xc4\x21\x99\xfc\xe7\x60\xfc\xe8\x70\x38\x3d\x52\x1f\xda\xe3\x47\x83\xa3\xff\xfc\xd0" + + "\x7c\xa8\x8e\x1f\x0d\x3f\x9b\x2c\x4f\x09\xac\xe1\xc1\x5f\xbe\x7a\xf2\xc5\x48\x3d\xf8\x7a\xff\xf1\x13\xf8\xe7\xc9" + + "\xe3\x29\x74\xad\x54\xab\xa6\x6e\xeb\x59\x5d\xaa\xdc\xb4\x98\xf2\xd9\xd5\x0e\xef\x7e\xe4\x57\xe4\xfd\xae\x4f\xea" + + "\x75\x7b\xad\x57\x2b\xf7\xff\x5d\xdb\xd6\x8d\x3e\x35\xd7\xe3\x9d\x5d\xa0\xee\xee\xda\xbe\x9e\x17\xa5\xb9\x6e\x8c" + + "\xbd\xbe\x28\xf2\x53\xd3\x0e\xa7\x34\x8c\xaa\x7e\x8e\x5e\x82\x5c\xd7\xdf\x5f\xbe\xbf\xfe\xee\xe5\xb3\x17\x43\x2a" + + "\xb0\x92\x6d\x7d\x98\x7c\x98\xe0\xe3\x75\x43\xad\x1f\x7d\xb8\x18\xef\xec\x1e\xef\x4c\x87\x83\xc3\xa9\x7b\x3f\x38" + + "\x9c\x1e\xfd\xe7\x87\xc9\xe1\x83\xe3\x47\xff\xef\xf5\x70\x80\x7f\x4f\x8f\x1f\xb9\xf7\xd3\xc1\x87\x7c\x67\x78\x3d" + + "\xbc\x1e\x4e\x70\x62\x27\x8f\x54\xc0\x6c\xde\xbe\xb7\xa5\x1e\xa9\xfd\xa1\x7a\xbf\x30\x57\x20\xdf\xae\xad\x99\xaf" + + "\x4b\xcc\xab\xda\x36\x75\xbe\x9e\x19\x86\xeb\x71\x8b\xfe\x1e\x28\x1c\x7a\x7f\x7c\xd4\x97\x93\x8f\xb6\xae\x56\xe3" + + "\x8f\xde\x5f\xd5\x5c\xea\xe5\xaa\x84\x80\x7f\xf5\x48\x3d\x86\x8a\x2d\x26\x69\xc0\x0c\xc0\x53\x7c\xa3\x94\xda\x55" + + "\xdf\xbe\x7c\xf5\xf6\xa7\x97\x4a\xdb\x33\xc0\x69\x72\x35\xa8\xb6\xd1\x95\x75\xe7\x49\x94\x7b\xf6\xea\xfd\xcb\x9f" + + "\x30\x37\xbd\xb2\xa6\x29\x74\x59\xfc\x8e\xf8\x99\x03\x3b\x86\xad\x08\xa9\xcd\x82\x45\x0b\xa0\xd6\x67\xc6\xda\x17" + + "\xf4\xd2\xc9\x18\xd4\xa7\x2f\x86\x8e\xfd\x80\x87\x0b\xe3\xc7\x84\xef\xbe\x1c\x62\x02\x26\x77\xd8\x74\x59\x2a\x7b" + + "\xb5\x3c\xa9\x4b\xc0\x20\x27\x97\x5b\xc7\x29\x61\xd9\x27\x43\x65\x2e\xcd\x6c\x0d\xfd\x00\x1c\x3c\x44\x40\xc1\x1c" + + "\xdf\x3c\x0a\xdf\x00\x88\x03\xef\xbf\x7b\xf9\x83\xe2\xfc\x90\x0a\x78\xa2\xb6\x86\xea\x8b\xb9\x42\x37\x0d\xa8\x7c" + + "\x22\xd1\xbd\x2d\x67\xd4\xc6\xc5\x7b\xcf\x55\x5b\x66\x7b\xc2\x2a\x6e\x1c\xd8\xe3\x3f\x31\xb0\x2f\x86\x74\xcf\xfc" + + "\xd9\x81\x9d\xd6\x9b\x47\xd3\x86\x5e\x8b\xd1\x70\x10\x0e\xc5\x0f\xec\xae\x9a\xba\xac\x4f\xd5\x6c\xa1\x1b\x65\xcd" + + "\x3f\xd7\xc6\x5d\x62\x83\x07\xfb\x7b\x7b\xdf\x7c\x3d\x7c\xaa\x96\x80\x0a\xb1\x5a\x19\x6d\x8d\x02\xb8\x14\xc8\xc8" + + "\x76\xae\x73\x13\x1c\x94\x90\xbe\x94\x25\xee\xd4\x03\x95\x3d\x9a\x64\x9c\x43\x3e\x7b\x94\x79\x29\xed\xc1\xd7\xfb" + + "\x5f\x7c\x3d\x52\xaf\x5f\xaa\xa5\xbe\x42\xad\x23\x6e\x60\xd2\x3b\x52\x34\x38\x44\xa0\xc0\x25\x33\x99\x28\xad\xe6" + + "\x85\x29\x73\x8c\xfe\xb9\x28\xaa\xbc\xbe\x18\x33\x55\x03\xf7\x1b\xc6\x47\xc8\xeb\xa5\x2e\x2a\x30\x26\x03\x16\x11" + + "\xc8\xa0\x7c\x33\x48\x62\xa7\x0e\x3c\x59\x04\x97\x72\x47\x40\x71\x99\x02\xad\x9f\x4c\xd4\xcf\x16\x0d\xcb\xe0\x75" + + "\x1e\x22\x2c\x6a\x00\x7a\x78\xc6\xc6\x6b\xca\x2f\x5b\xb8\x59\x7b\xfd\x12\xd7\x6e\x59\xe7\xc5\xfc\x4a\x15\x2d\xba" + + "\x20\x84\x2e\x76\xa9\xb1\xcf\xd6\xb3\x09\xe5\x41\xd3\x75\x24\xcb\xa3\x23\x3c\x59\x12\xd2\x9a\x3a\x05\xd9\x79\x1b" + + "\xbc\xdd\x4f\xa3\x5b\xc1\xd1\x9b\x1a\x32\xaf\xd8\xed\x7b\xf2\x7e\x50\x07\xca\xd1\x3e\xca\x71\x1b\x55\x19\x2b\xf5" + + "\xa5\xf7\x06\x61\xed\xa8\x6c\x56\x57\xb6\x6d\xd6\x8e\x6b\xca\x80\xc4\x70\xa8\xfa\x47\x7d\xe9\xe9\x20\xec\x23\xf1" + + "\xe2\x7d\x20\x42\x3e\xe2\x4b\xe7\xf9\xfb\x3a\x50\xce\xb7\x4d\x38\x88\x03\x85\x4d\x38\xa6\x48\x88\x28\x7c\x42\x5e" + + "\x46\x9e\x75\xa8\x7f\xd0\x25\xb4\x49\xf1\x96\x96\x0e\x4e\xb8\x4b\x63\xfe\x25\xae\x05\x25\xa3\xa0\xa6\x93\x16\x9f" + + "\x9e\x36\x7b\x11\x7a\xa1\x86\x83\x9e\xe2\x28\xb1\xf7\x54\xe3\x4e\x52\x26\xad\x7c\x80\x91\x4b\xe5\x3a\x36\xf6\x70" + + "\x57\xf4\x35\x12\x2f\xdc\x5d\x7e\x38\x9b\xfc\xa2\x68\x16\x64\x20\x4f\xdd\xa0\xe3\x8d\x27\x4e\x84\x6b\xd8\xed\x02" + + "\x7c\xe2\xfd\x7b\x7c\xf9\xd0\xdb\x4e\x2c\xf5\x64\xe2\x2e\x4e\x48\x9f\x50\xcc\x55\xe3\xc8\x93\x25\x4c\x08\x01\x85" + + "\xeb\x3e\x3d\xda\x43\x54\xb1\x6c\x47\x58\xdc\xb6\x7a\xda\x18\x5b\x44\x18\xdb\x27\x5f\x88\x47\xde\xcf\x6e\xe0\x77" + + "\xd4\x51\x18\x8c\x13\x66\xfb\x9f\xc3\x74\x0d\x43\xea\x06\x9c\x1a\xa9\xb4\x0f\x2e\x25\x88\x2d\x44\xaa\xad\xd8\x49" + + "\xe8\x5f\x6b\x15\x95\xa6\xbe\xc9\xad\x9e\xe0\x5b\x71\xee\xe1\x58\x16\x95\x5d\xd1\x0d\x13\x42\x2a\xeb\x46\x89\x4b" + + "\xcf\x1d\x8f\x70\x6b\x88\x83\x48\xdf\xde\x79\x14\x7d\xc6\xaf\x91\x4a\xf2\x78\x8d\xd4\xc7\x7f\xfe\xfa\xdd\x4f\xfe" + + "\x04\x21\xb8\x13\xd4\x8a\xf1\x30\x6c\x2d\x32\x8e\x31\xf1\x95\x83\x47\x6e\x38\xe9\x98\x7e\xc0\x5f\x6b\x0c\x6e\x97" + + "\x74\x33\xec\x0a\xe9\x52\x21\x20\x87\xb6\xb6\x7c\xd3\xc9\xa4\x7b\xc5\x68\xa4\xfb\xb9\x65\x29\xa4\xca\xe4\xb7\x51" + + "\x98\xcc\xb7\xcd\x2b\xed\x08\xe0\x55\x64\x4e\xe7\xaf\xc5\xf4\x41\x2e\x93\xf4\xa3\xc1\xdd\xf3\x28\x62\x80\x12\x3a" + + "\x14\x55\x9e\xb8\x73\xdf\xef\x4c\xb0\x7b\xd8\x33\x1b\xb2\x92\xe3\x70\xa2\x7c\x3a\x35\x3e\xb1\x61\xff\xf7\x7d\xc9" + + "\x7b\xb3\xb3\x30\x7d\x85\x7a\x52\xdb\x09\x03\x79\xa7\xe3\xa9\xea\xf4\xfe\x40\x09\x2d\xf9\x2d\x0d\xc9\xf4\xc6\xec" + + "\x4f\x2a\xf6\xc6\xcd\xb6\x40\x4e\xf3\x1d\xef\x0c\x1c\x72\xb4\x22\x0d\x91\xf3\x07\xb9\x73\xdc\xa4\xfa\x2f\xdd\x93" + + "\xa1\x38\x8c\xcf\x3c\xaa\x03\x6a\xa5\x90\x09\xff\xa8\x2f\x83\x19\x0f\xdc\xdb\x74\xab\x5a\x7d\x66\xac\xca\xe6\xa5" + + "\x6e\x33\x6f\x16\x1b\x54\x75\x4b\x39\xd7\x73\x63\x56\x54\x0b\x20\x5a\x61\x5c\xa5\xb1\xea\xc1\x37\x5f\x7f\xfd\x17" + + "\x79\x91\x7e\xd4\x97\x2f\x39\x75\x93\x6e\x4e\x4d\x3b\x52\xb6\x99\x09\x19\xfd\xcc\x5c\x8d\xa0\x3e\x38\x86\xae\xc5" + + "\xb7\xde\x2a\x22\x6e\x69\x42\x44\xb0\x63\x59\xe2\xfa\x5a\xfd\x71\x23\x71\x26\x81\x27\xae\x44\x0b\xe4\x69\xd9\xcc" + + "\x8e\xe0\xdd\xa6\x5c\xef\x03\x25\xaa\xe5\xa2\x87\xd4\x63\x35\x05\x04\x6b\xb3\x72\xed\x0d\xe0\x0f\x47\x36\xc0\x7a" + + "\xc6\x65\x0f\x44\x1b\x12\x3a\x92\xe1\xaf\xcd\x2a\x95\xb6\xa3\x2c\x86\x3c\x35\x58\xb0\xb3\x19\xf0\xb5\x5f\xca\x47" + + "\xa4\x10\xb5\x0a\x91\x34\xac\x01\x9e\x42\xe3\x74\xf3\x6d\x35\xdd\xbe\xa7\x1e\xa9\x5d\x35\x2f\xaa\x1c\xc5\x84\xa6" + + "\x38\x5d\x08\x5e\x7e\x40\x59\x19\x1c\xdb\x8a\xe9\xfb\x28\xa2\x6d\xb7\x65\x56\xdf\x5c\x12\x9d\xe4\x8f\x86\x54\x29" + + "\x3b\x50\xf8\x14\xb6\x1e\xd1\x83\xbb\xe4\x0a\x4e\x92\x9d\x80\xdd\xfe\x89\x3b\x3d\x50\x4c\x55\x46\x62\x24\x92\x50" + + "\xcf\x5a\xc6\x8c\x06\x67\xf2\x17\xcc\x81\x20\xcc\xf4\x0b\xc9\x90\x50\xdf\xdd\xb6\xb1\x63\xfe\x81\x89\x7b\x04\x7b" + + "\x22\xce\x91\xc7\x51\x23\xbf\x7f\xbd\x6e\xeb\x58\xd0\x39\x05\xb8\x12\x31\x25\xc4\x60\x90\xbc\xb9\x7d\xcf\xf3\x14" + + "\xc9\xe1\x04\xe2\xf7\xc8\xf3\x03\x81\x66\x21\xc5\x12\x99\xdb\x66\xed\x06\xa7\x10\x40\x13\xb4\xe3\x65\xb1\x44\x8f" + + "\xa7\xeb\x6b\x9c\xa9\xf1\xa9\x69\x79\x02\xbf\x03\x55\xc8\x20\x23\x15\xc3\xae\x2b\x98\xa5\xc8\xa5\x12\x28\x0e\x1d" + + "\x5b\x73\xa3\xc1\x4d\x14\x64\x3c\xad\xce\x2a\x27\x9a\xca\x71\xf2\xb6\x9d\x79\x5a\x87\xa7\x8b\xe7\xc0\x4f\x75\x64" + + "\x69\xe2\xa7\x84\x5f\x0e\xb4\x28\x7d\x46\x71\xb6\xb3\x36\x4d\xb1\x9e\x90\x74\x09\xfe\xbe\x75\xd2\x18\x7d\xd6\xb5" + + "\xc1\x45\xa8\x85\xb5\x23\xd3\x94\x24\x12\x0c\x86\xda\xef\x28\x6f\xbb\xee\x6c\x66\x7f\x3c\xe3\xd5\x2b\xaa\x74\x37" + + "\x52\xf8\xc4\x8b\x3e\xc6\x91\x33\x66\x4b\xee\x0a\x9c\xc0\xae\xd8\xd9\xab\x38\x29\x03\x53\x6a\xbb\xd3\xd9\x69\x4c" + + "\xe8\x2a\x45\xb7\xae\xaf\x71\x63\xbb\x2a\x01\xcf\x96\x61\xe2\xbd\x92\x0e\x0b\xef\x1d\xcb\x7b\x33\xed\x78\x48\xc3" + + "\xd1\x99\x57\x6a\x36\x3a\x5a\xb2\x22\xf9\x58\x56\xe4\x17\x05\x58\xcf\x46\x7d\x74\x92\xfb\xda\x12\x16\xbc\xaa\x2b" + + "\xd3\x37\x83\xf1\xef\xeb\xeb\xf8\x48\x47\x4a\xd7\xd7\xb0\xac\x73\xd0\x47\x6b\xb9\x7a\xe8\x56\xa0\xf3\x3c\xe2\xfb" + + "\xd9\xf5\xb9\x2c\x6c\x1b\x69\x27\x20\xcb\x50\xae\xbc\xf5\x60\x33\xe9\xc2\xa9\x88\xbb\x28\x2f\x94\xf8\x8d\xbb\x53" + + "\x3a\xd7\xf3\x1f\xb1\x68\x24\xd8\xf5\xb8\xd6\x1e\x64\x0e\xda\x0e\x47\x49\xd1\xe3\xa7\x22\x9f\xf6\xe4\x91\x7a\xbe" + + "\xd0\x78\x18\xcf\x4d\x63\xe1\x3e\x44\xa9\x1f\x48\x3d\xde\x01\xc8\x58\x2f\x8c\x67\xe6\x22\xf2\xac\x9e\x95\xd6\x1d" + + "\x1c\x82\x0d\xe2\x57\xbf\xfe\xfa\x2b\xaa\x3e\x10\xf4\x61\x61\x88\xf3\xe3\x90\xa8\x3e\xca\xfe\x1c\xf7\x25\x50\x74" + + "\xae\xc7\xd3\xf6\xc2\xbe\x5b\x23\xbc\x67\xb8\xf6\x5d\xb7\x1f\x8f\x38\x0f\xc5\x08\x7e\x83\xae\x1e\x58\xd9\x73\x26" + + "\xe9\xb4\xd9\x03\x9f\x4e\xd6\x09\x26\x5e\x9c\x04\x29\xd0\x78\x46\x33\xba\x30\xe8\x69\xd2\xd6\x42\x2d\x32\x47\x1b" + + "\x24\x4d\xd8\x2d\x97\x03\x09\x6b\xc3\x00\xb6\x09\xea\x11\x25\xba\xb4\xd4\x2b\xec\x85\x07\xe9\xcb\x21\x41\x7c\x0f" + + "\x55\xd9\x0f\x3b\x02\x8f\xbe\xab\x06\x18\x15\x71\xa0\x03\xe9\x17\x67\xdc\xfd\xdd\x13\x2f\x1e\x13\x02\xa8\xed\x38" + + "\xa1\xfb\x34\xb3\x92\x56\x89\xeb\x87\x06\x45\xde\xa8\x6d\x8d\x92\x34\xaa\xe1\x5a\xc7\x22\x8a\x53\x26\x22\xdf\xa0" + + "\xc6\x58\x17\x61\xc7\xbc\xde\xaf\x60\xcf\x1c\xf9\x72\xe1\x14\xc0\x3e\x38\xba\xb5\x28\xa2\xe3\xe0\xdb\x14\x17\x71" + + "\xb5\x2a\xaf\xfc\x09\xc7\x24\xad\xee\x5c\xaf\x9a\xfa\xbc\xc8\x25\xe8\xb7\xdb\x39\xc0\x02\xfb\x0d\xf7\xf0\x21\xad" + + "\x2a\x7d\x16\xc2\xaa\xe8\x72\x38\x88\xde\x0f\xc4\xe6\x0d\xbb\x21\x8e\xdc\x82\x46\x0e\xb8\xeb\xf0\xe6\xce\xb9\xf6" + + "\x81\x8a\xf1\x04\x62\x3c\x79\x63\x3e\xb7\x18\xdb\x77\xe1\x76\xb6\xe3\x42\x6a\x37\x3e\x2e\x1e\xf4\x1b\x16\xbc\x5e" + + "\x1c\xa3\x22\xae\x5d\x6e\x5b\xf2\x1c\x48\xb2\x43\xb7\x5c\x9f\x85\x17\x2c\xaf\xbb\x9f\x05\x98\x4d\x73\xde\xdb\x14" + + "\xea\xae\x20\xd6\x90\xd2\xa1\x52\xbd\x1d\x49\x09\xaa\xb8\x4f\xfd\x78\xf8\x30\xfc\xee\x0c\x9c\x40\xce\xcc\x19\xf8" + + "\xd4\x35\x66\xd6\x86\x93\x45\x7d\x77\x7b\xfa\x40\xc9\x6d\x0e\xd5\xf1\x7d\x17\x76\xce\xf5\x75\x54\x2a\x7b\x14\xbf" + + "\x7f\x1a\x87\xff\x54\x75\x45\x57\xc9\x08\x24\x3b\xa5\xd5\x4a\x17\x8d\x74\x1a\x82\xa6\x83\x2a\x27\x9c\xd8\xc7\xca" + + "\xd3\xdb\x70\x60\xb7\x83\xf3\xd9\xeb\x39\x15\xab\xd7\xed\x6a\xdd\xda\x68\xa2\xb6\xd8\x48\x08\x45\xc8\xf7\x21\x89" + + "\xfa\x44\xa1\x7a\xb9\x42\x8a\x71\xd0\x3f\x73\xbe\x2d\x98\x0f\xd2\xe8\x73\xaf\x80\xde\xe9\xd9\xcc\xac\x5a\x70\x81" + + "\x01\x03\x2d\x7d\x75\xd7\x94\x42\xc3\x7b\x70\x16\x19\xc9\x73\x2b\x21\x47\x34\xb9\xa1\xa4\xef\xba\xe7\x01\xcf\x23" + + "\x97\x3d\xda\x6d\xb9\x71\xbb\xcc\xfc\x73\x5d\x9c\xeb\x12\x14\xfd\xa1\xd6\x50\x36\x54\x91\x66\x7b\xdc\x3c\x02\x9c" + + "\x70\xe1\x47\x9a\x68\xc0\x46\xee\xda\x32\x94\x34\x09\x90\xe5\x49\xea\x91\x14\x8e\xfe\x27\xf7\x72\x4f\x1b\xb0\x95" + + "\xfb\x7a\xe5\x8f\x19\xcf\xcb\x53\xf1\xb6\x8f\xbb\xe5\x15\x1e\x8a\x82\x37\xe1\x4f\xc1\x98\x45\x6f\x44\x50\x70\xea" + + "\x38\x87\x34\xd2\x77\x1a\x22\xc4\x20\x49\x42\x25\x67\x5d\x82\x37\xc2\x5c\xc6\x23\xda\xf6\x9e\xb8\x3f\x57\xa5\xa3" + + "\x9e\x60\x12\x46\x24\x5a\x5d\xba\x6b\x0e\xb6\xd7\xc9\xfa\xe4\xa4\x34\x23\x32\x53\xc7\x1c\xd5\x72\xfb\x5e\xb2\x94" + + "\x8e\x02\x1f\xa9\x0c\x3d\xbd\x33\xc9\x9a\x46\x54\xd8\x95\x0d\xd4\x77\x73\x64\xa3\xb7\xb8\x7f\x6a\x05\x7d\xf6\xf4" + + "\x2d\xa1\xbd\xf9\x03\x23\x5e\xa7\xb1\x91\x7c\x84\x63\x9f\xe2\x18\x0e\x95\x51\x53\x95\xfd\x50\x0b\xe6\x01\x49\xa1" + + "\x3b\x0d\xfe\x10\xb5\x75\x44\x7a\x6e\xfa\xa2\xb9\xb7\x7a\xd1\x0a\x83\xa8\x1f\xba\x63\xf1\x0a\xcb\xd0\x9b\x65\x1a" + + "\x86\xd6\x41\xc5\xf1\x3e\x46\x7c\xab\xaf\x2b\x72\x95\x56\x8b\xba\xcc\x19\x48\x12\xe3\x42\xc0\x8e\x84\x79\x91\xfe" + + "\xb9\x36\x4d\x01\x12\x09\x3e\x98\x82\x42\x1f\x2b\xf9\x5e\xdb\x76\xf7\x8d\x63\x9c\x0a\x93\x2b\x34\xba\xab\x99\x9e" + + "\x2d\x50\x9e\x82\xf4\x63\xc4\x64\x6e\xdf\xdb\x2a\xb5\x6d\xb9\xf0\x94\x58\x35\xd3\xea\xd3\xa9\x37\xff\x49\x1d\x0e" + + "\xf9\xe4\xaf\x9b\x72\xaa\x12\x67\x00\xc6\xe3\xcc\xfe\xfe\xf2\x3d\x06\xf3\x15\xd6\xbd\x2e\xa7\x2a\xb6\xcd\x93\x24" + + "\x29\x6d\x47\x74\xa6\xe0\xab\xd3\xb2\x3e\x71\x1f\xf9\x6c\x7e\xc2\x46\x2c\x9e\x6a\x7b\x55\xcd\xc4\x6f\x92\x57\xdf" + + "\x63\x1f\xf4\x6a\x55\x16\xd8\xb5\xc9\xe5\xee\xc5\xc5\xc5\xee\xbc\x6e\x96\xbb\xeb\xc6\x1d\xa6\x3a\x37\xf9\x53\xb0" + + "\x5e\x5a\xd3\x1e\xfc\xfc\xfe\xd5\xee\xd7\xd8\xe1\xc9\xa3\x6d\xca\x7a\x51\xaf\xdb\x29\xd9\x48\x70\x09\xc1\x03\x4a" + + "\x72\x9d\xe2\xd1\xda\x9a\xa6\xd2\x4b\xf9\x68\xa5\xad\xbd\xa8\x9b\x5c\x3c\x82\x15\x10\xbf\xf1\x58\x4d\x51\x77\x89" + + "\x4f\x1a\x9d\x17\x68\x75\x92\x8f\xc9\x6d\x82\x17\x67\xcb\x71\xf0\x30\x03\x70\x57\xf0\x92\x6c\x65\x8f\xb2\xa9\x62" + + "\x83\x2a\x5a\x77\x5a\x73\xd9\x4e\xc9\x4b\x65\x55\xea\xa2\xa2\x20\xcb\x45\xbb\x2c\xf9\xb9\xfb\x9b\x1e\x5f\xc2\xd3" + + "\x68\xea\xc0\x0b\x87\x9d\x5c\xb0\xd4\x47\x5b\x57\x49\x31\xf7\x88\xca\x7d\xd4\xe7\xda\xce\x9a\x62\xd5\x02\xe2\x03" + + "\x3b\x5c\xb3\x36\x81\x3b\x0b\x4d\xb9\x4a\x27\xb2\x47\xd0\x99\x89\x6c\x06\xaa\x9e\xc8\x9a\x62\x3e\x34\xaa\x2f\xf3" + + "\x62\xd0\x9b\xef\xb3\x68\x06\xf8\xc5\x7b\x73\xd9\xc6\xc3\xe0\x37\xff\x78\xf7\xf6\x87\xa8\xc7\x93\x89\x02\xaf\x84" + + "\xf8\xb6\x9b\x4c\xd4\xff\x67\xae\xac\x0f\x0d\x57\x88\xb4\xa9\x06\x4e\x3a\x61\xab\x7d\xf6\x28\x1b\x92\xd9\xd0\xb6" + + "\x45\x85\x66\x53\xf4\x39\x23\xd9\xc7\x16\xd5\x69\x69\x30\xcc\x3c\x16\x97\xa6\x9e\x9a\x0b\x66\x8f\x03\x86\x41\x3c" + + "\x36\x97\x2d\xad\x37\xfc\x9d\x4d\x15\x3a\x25\x8d\x44\x18\x1b\x04\xe8\xd4\xca\x4d\xa7\x1a\xc0\x2d\x71\xa0\xaa\x1a" + + "\xcd\x20\xee\x20\x40\x97\xf0\x4a\x81\x5d\x00\x25\x33\x7f\x9a\xb8\x9e\x97\xe7\xba\x5c\x43\x66\x5f\x57\x06\x22\xae" + + "\xdd\xb4\x09\x0c\x12\x51\x85\x7b\x93\xf9\x3c\xd3\xde\xa5\x4c\x54\x07\xce\x55\xbe\xae\xcb\x65\x29\xbe\xbe\x84\xf6" + + "\x13\x07\xb1\x64\x3d\x5e\xd5\x4d\x1c\xe8\x61\x17\xf5\xba\xcc\x29\x4f\x6e\xa4\xd8\x9e\xd2\x27\x57\xf5\x1a\xf8\x2c" + + "\x9d\xe7\xee\xef\x46\x81\xc2\x0c\xfd\x64\xb8\x2a\xc4\x81\x9a\xd3\x17\x6e\xdd\xc0\xa5\x00\x3e\x45\xd1\xd1\x31\x9e" + + "\x9d\x06\xa9\x7c\xd4\x6c\xf0\xb8\x41\xcd\x39\x4c\xb1\xd0\x4f\xf3\x76\x05\xfa\x19\xd2\x95\x92\x6f\x2d\x3e\xda\x8e" + + "\x01\xf5\xbc\x00\xeb\x66\x7f\xbe\x2e\x4b\x35\x2f\x4d\x7e\x0a\x39\x2d\x90\x26\x2b\xcc\xab\x8e\x86\x79\xd4\x37\xe3" + + "\x77\xb0\xd9\x4e\x6a\xb7\xe3\x04\x09\x87\x11\xfa\x6f\x51\x5b\x30\xf6\xda\x1a\xd2\x9b\x17\x56\xd5\xcb\xa2\x6d\x4d" + + "\x3e\x52\x17\x4d\xd1\x82\x74\xee\xf8\x53\xa9\xcf\x0f\x77\xc3\x3a\xce\x89\xcb\xd6\x02\x6e\x24\xf6\xcc\xf3\x8f\x0f" + + "\xc3\xd6\xf8\x76\x5d\xe0\x6d\xa7\xd3\x61\x41\x09\x69\x8b\xe8\xb3\x4b\xf4\x58\x1b\x20\x03\x5a\xe8\xc0\x54\xec\x6a" + + "\xf8\x18\x1a\x13\xe5\x3b\xed\xf4\xd4\xc9\xda\xfe\xc8\x0d\x36\xf2\x50\x98\xde\xee\x7f\x20\xec\xa6\x43\xf6\xa7\xf3" + + "\xef\xef\xf8\x56\xda\x30\xfd\xd6\x78\xa3\x8b\x4a\x2d\x4d\xbb\xa8\x73\xaa\x4e\x2e\xc4\xba\x29\xbd\x75\x35\x12\x5d" + + "\x5f\xcf\xdd\x3b\x70\xc7\xaa\x68\x9e\x47\xca\x16\xcb\x75\xe9\xb6\xfb\xaa\x31\xbb\xfb\xe3\x27\x0a\x52\x17\xb5\xeb" + + "\xc6\x6c\x27\xde\x0b\xe0\xe2\x26\x33\xfa\x33\x73\x16\xa2\x62\xd6\x0d\xc5\x42\xa2\x3b\x5c\x27\x63\x70\x38\xd2\xb3" + + "\x90\xb5\x05\x2d\x54\xbe\x4b\xdb\xf7\x64\x8d\x75\xd7\x72\x84\xc0\x31\x3c\x2f\x23\x5e\xe0\x9f\x7f\xfa\x1e\xf6\x7e" + + "\xbd\x76\xa4\xb3\x2d\x76\x91\xf9\x01\xc7\x34\x3c\x6f\xee\xf7\xcf\x3f\x7d\xef\xbf\x60\xb5\x3c\x71\x4b\x36\x52\x34" + + "\xa0\xae\xde\x7a\x2a\xdb\x7d\xe5\xeb\xe1\x74\x45\x18\xc6\x8d\x37\x10\x3e\x7a\xef\xd3\xb2\x6d\x79\x1f\x59\xf2\x3e" + + "\xf2\x5e\x8c\xea\x5c\x53\xd3\x2b\x76\xb8\x24\x78\x0f\xd0\xf4\x3b\xe9\x06\x99\x23\x74\xa7\x47\xee\x9e\xac\x7a\x85" + + "\x5d\xb9\xeb\x87\xfc\x1c\xe6\x45\x63\xfe\x0e\x45\x43\x2d\x10\x0e\x78\xae\x9b\x42\x9f\x50\xd7\x0a\xd1\x1f\xa0\x73" + + "\x8e\xd5\x04\xc5\xa5\x9f\x6c\x71\x06\xbb\x56\xbd\xf5\x0a\x13\x8d\xfb\x1d\x16\xea\xe3\x04\xb4\x1c\x36\x40\xd3\x8e" + + "\x4f\x9f\xe3\xb3\x60\xee\xb9\x04\x4f\xf8\xd0\x55\x2e\xe0\xd8\xd5\x78\xc4\x85\x55\x69\x2d\xc5\x5c\x15\x2d\x7a\x16" + + "\xbe\x78\xfb\x06\xd0\x6c\x95\xf7\x1f\x52\xb3\xba\x2c\xbd\x8f\x28\x33\x97\x2f\x5d\x65\x7d\xbd\x00\x00\xac\xa4\x81" + + "\x10\xba\x7e\x7d\xdd\x79\x87\xf9\xbb\xd4\x90\xa3\x33\x39\x9c\x2e\xed\xa4\x0f\xf2\x67\xc6\xdf\xf5\xc0\x8f\xf7\x85" + + "\x99\x9b\xa6\x31\x39\x2e\x7e\x4e\xbf\xc2\x7c\xf3\xfb\xc1\x90\xef\x0b\x4c\xf4\xfb\xa2\x53\xd2\x4f\xfc\x20\x03\xcf" + + "\xf2\xa5\x59\xd6\xcd\x55\x16\x56\xe6\x5d\xab\xdb\xb5\xdd\xcd\xc1\x41\xc6\x89\x3a\x3e\x57\x30\x2e\x32\xbc\x7e\xee" + + "\xe6\xd0\xcd\x8b\xf8\x09\xc7\xce\x57\x43\x1b\x5f\x0d\x5a\x76\x48\xb5\x00\x2c\x0c\x79\x50\x54\xed\x05\x56\x92\x33" + + "\xbe\xf3\x9e\xbf\x5c\x47\xfc\x82\xf1\x7e\x44\x0b\xef\xbd\xf2\x1a\xa4\x2a\xdf\x3b\x13\x9c\x97\x44\x4a\x37\x7d\x52" + + "\x37\xad\x5a\x1a\x6b\xf5\x29\x97\x6d\x9e\x9d\xa0\xaf\x44\x36\xd3\xd5\xcc\x94\x26\xcf\xfc\x77\xaf\xf4\x99\x51\x97" + + "\x0b\x54\x1e\x61\x33\x07\xc1\x37\x40\xe7\x57\xef\x50\x94\xdb\x1b\x09\x49\x1d\x2e\x29\xcb\x34\x42\x2d\xb4\x5d\x00" + + "\x7c\x68\x64\xa9\xc0\x80\xe5\xd8\xce\x27\x69\xf2\x99\xb9\x12\xb2\xac\x23\x60\xe0\x56\x15\x45\xf0\xd1\x38\x23\x70" + + "\x65\xaf\xe3\x4a\x68\x4f\x22\x18\xc7\xef\x0e\x90\x54\xd2\x5b\xef\x46\x05\x2d\xaa\x03\xc5\x1e\xd9\xe4\xb3\xd7\x4b" + + "\xf0\xd4\x70\x18\x2b\x4d\x92\x52\x47\xd8\xff\xa3\xfd\xe3\x1e\x65\x37\xbe\x52\x8f\xa5\x5e\xa5\xa3\x13\xd9\xf2\xdd" + + "\x49\x6b\x3e\x33\x57\x3d\x80\x00\xd1\xc7\xc4\x53\x50\x15\x3e\xca\x8b\x22\xaf\xe5\xd4\xde\xc8\xa5\xfc\x49\x5f\x48" + + "\xf4\x06\xb7\x64\xcf\xca\x32\x5e\x35\x89\x68\xd3\x01\x49\x90\x4b\x74\xb8\x61\xe6\xa6\x01\x12\x37\x69\xfe\xb9\xbb" + + "\x80\xd0\x74\x83\x4b\x80\x6f\xac\xdb\x38\xe2\x5c\xdc\x81\xbe\x4e\xfb\xa7\xbc\x23\xf9\x8f\x4f\x7c\x01\x5d\x16\x6b" + + "\x49\xdf\xf5\x1c\xc5\x23\xaa\xf4\xf8\xae\xd7\x11\xac\x76\xe7\x58\xa7\x58\xd5\x1b\x16\x8f\xb1\xe3\xd2\x59\x7a\x7b" + + "\x6e\x9a\xa6\xc8\x85\xb3\x44\x6c\xd3\x97\x53\x57\x53\xd9\x37\x64\x75\xdf\x94\x61\x7c\xf3\x6c\x08\x8b\x7d\x64\x6b" + + "\xfd\xd4\xde\xde\x41\x59\x05\x69\x95\x7d\x5b\xea\x55\xb2\x9c\x33\x0f\xd6\x4c\x5d\x8d\x8b\x48\x0a\xf1\xd7\x98\x3e" + + "\x78\x7d\x77\x0e\xc6\xe9\xe4\x3b\x64\x02\xf4\xef\x57\xbb\x6c\x75\xad\xcc\x45\x48\x40\x0b\x41\xf2\x17\xe0\x62\xad" + + "\x5b\xc7\x02\x5a\xd3\x9c\x1b\x0b\xd9\x02\xeb\xca\x08\x5d\x6f\x18\xc8\x11\xb6\xe5\xd6\xf7\x48\x75\x1f\x8f\x5c\x17" + + "\x7c\x99\x5e\x12\x90\xa8\x08\x91\x3d\x37\xb3\x35\x31\x23\x7a\xb5\x6a\xea\x55\x03\x4a\xdf\x64\x3a\x99\x6e\x8f\x75" + + "\x79\xa1\xaf\xec\x00\xdb\xc2\x47\xd8\x95\x48\x4b\x7b\xf3\xe7\x16\xf3\x39\xdc\x18\xd2\x1e\x8b\xaf\xe0\x9e\x89\xa2" + + "\xd0\xa0\xa9\xf7\x78\xc7\xcb\x65\x04\x3e\xea\x3d\x31\x18\xa1\x90\xe3\x73\xe8\x66\x8a\x16\xb9\xed\xfa\xa8\x6d\x05" + + "\x6f\xfc\x31\xb4\x3b\x10\x95\xa6\x51\xef\x5b\x79\x5d\x99\x81\xda\x1b\xf5\x95\xe9\x19\x2c\xfc\x73\x13\x92\x07\x3c" + + "\x43\x38\xfd\x5c\x72\x22\xfc\x63\xbc\x6a\xea\x65\x61\xcd\x80\xfd\x08\xc7\xcc\x80\x80\xf2\x36\xe6\x45\xc6\x3a\x47" + + "\x26\x9f\x96\x82\xac\x79\x07\xb4\x34\xae\x9b\xe2\x35\xc6\x96\xf2\xcb\xb9\x2e\xca\xd0\x25\x72\xee\x81\x00\xa3\xd9" + + "\x42\x37\x7a\x06\xea\xf1\x07\x7f\x79\xf2\xc5\xfe\x14\xa5\x58\xa4\xb3\xae\x7b\xb5\xd7\x68\xb8\xc1\xe4\x79\x08\x12" + + "\x22\x75\x3a\x9b\x1c\xd5\x40\x08\x61\x4b\x70\xab\x42\xef\x12\x55\xb4\xfc\x3d\x05\xad\xce\x75\x69\xaf\x50\x50\xaa" + + "\x08\x3c\x23\x96\xb8\x31\xe4\xe1\x8b\x69\x88\x71\x9f\x5d\xa1\xd4\xed\x4e\x8d\x17\x9f\xb8\xda\x5f\x8c\xd2\xa5\xad" + + "\xc1\xc1\xc2\x55\xe7\x6a\x06\xa1\xc4\x90\x59\x54\x9f\xeb\xa2\x64\xf6\xdc\x8e\x51\x74\x1a\x28\x10\xe4\xd0\x89\x84" + + "\xfe\x88\xfc\xf7\x87\x14\x86\x27\x30\x58\xdd\x9c\x8d\xe0\x21\xac\xb3\x78\xc3\xd3\x32\xea\xd1\xbf\xee\xa8\x6c\x32" + + "\xc9\xbc\x3f\x32\xe4\xb5\x2b\xb4\x25\xf9\x92\x21\x22\xda\x1a\x09\xaa\xb6\x6a\x65\x1a\xd5\x16\xb3\x33\xd3\xaa\x07" + + "\xfb\x8f\xf7\xf6\xbe\xc4\x7e\x13\x94\x27\xbb\x3f\xd2\xe7\xd7\xd7\xfe\x09\x27\x9d\x95\xef\xf0\x69\x68\xfa\xe5\x65" + + "\xeb\x56\x5c\xb8\x07\x30\x08\xa3\xb0\xf5\xa7\xe8\xcc\xc2\xf0\x8b\x7e\xda\x80\xa8\xf9\x09\x3e\xec\x6e\xae\x8e\xc5" + + "\xb8\xd5\x4c\x4a\x68\xec\x92\x51\x80\x8f\x02\xe0\xc8\xa3\x8e\x28\xb8\x2c\xf1\xbc\x4e\x17\xb5\x6d\xa7\x70\x90\x97" + + "\x85\x85\xd6\xb6\x83\xbd\x1d\x6a\x7d\x81\x95\xa6\x40\x51\xab\x6e\x10\x05\xac\x77\x1a\x3d\x81\x27\x38\xa9\x4b\xdd" + + "\xbf\x3f\xc0\xa0\x0c\x0f\x3b\x42\xbf\x71\x69\xef\x1f\x1c\xf4\x2c\xf8\xf5\x35\x97\x79\xdc\x5b\xe6\xb1\xb4\x27\xfa" + + "\xfa\xbe\xc0\x2f\xa3\xfa\x41\x1b\x00\x69\x8f\x33\x75\xa8\xb2\xaf\xf7\x32\x35\x55\xd9\x97\x5f\x7e\x81\x50\x25\xf7" + + "\x0f\x0e\x98\xa6\xa5\x8a\x7f\x5f\x5b\xb7\x7b\x77\x54\x8a\x7b\x3b\x4d\xc5\xc8\x3a\x53\x8c\x37\x9b\x47\xf9\xc6\xb5" + + "\xe0\xf9\x68\x45\xa0\x18\xb8\x1a\xc8\x50\x34\xc2\x93\xad\xe7\x5c\xa2\x37\x38\x83\xde\x1d\x08\xb5\xa5\xf6\x9b\x70" + + "\xe4\x76\x74\x50\xe8\x77\x53\x46\x82\xd9\x6f\x25\x43\xfc\xb6\xee\x70\x99\x0f\x85\x47\xca\x0a\xb7\xf9\xe0\xdd\xbd" + + "\xed\xd5\x3b\xbc\x65\x2f\xb4\x45\xe1\x08\x61\x15\x8a\x1c\x37\x2b\x55\x34\x52\x90\x86\x19\x30\x2f\xc3\xa4\xf4\x48" + + "\x1f\x9c\x16\xd3\xb5\x94\x0c\xe4\x17\x03\x1a\xd6\x79\xd1\x98\x54\x3d\x61\x55\xed\x16\x00\x34\x17\xda\x9e\x81\x0d" + + "\x72\xfb\x5e\xa4\x9e\x00\x31\x13\x3f\x0b\xfd\xff\x05\xb8\x79\x0c\x34\x74\x4c\x8a\x35\xad\xaa\xfd\x98\x42\xae\x1a" + + "\x59\xcf\xc3\x87\x5e\x3b\x01\x16\xb1\x9d\x1d\x42\x2b\xf7\x9e\x2c\x42\xf2\xf6\x20\x00\x19\xa8\x32\x5a\xdd\xb4\x59" + + "\xba\x40\x3f\xaf\x56\xe8\x1b\xe4\x53\xb9\x45\xd4\x0d\xff\x18\xb7\x35\x94\xf3\xfc\x36\x7d\xfc\xc2\x91\xf4\x65\x51" + + "\x19\x11\x83\x02\x61\x66\xc4\xc0\x62\x55\x0b\x6d\x43\x8c\xe9\xfd\x10\x71\x4a\x16\x32\x6a\x4b\x54\xfb\x4e\x13\x72" + + "\xe9\xcf\x3f\x7d\x2f\xdc\xa5\x3e\x07\x3d\xd0\x95\xf7\x0c\x75\x25\x5e\xcf\xbd\x0d\x70\xf7\x5d\x51\xcd\x58\x5f\xad" + + "\xab\x7c\x52\x37\xee\xf5\x0f\x75\x65\x76\xdf\xc0\x54\x93\x91\xb0\xd4\xee\x22\x42\x55\x09\xeb\xc8\x60\xa8\xa8\xcd" + + "\xa3\x1a\xde\xd4\x4d\x50\xd9\x81\xa6\x8b\xc3\x42\x79\x81\xb0\x17\x55\x2d\x47\x4b\x5c\xb7\x1c\xf3\x50\xda\x3a\x5e" + + "\x53\x48\x77\x61\xc3\x35\x38\xa2\x20\x18\x7c\xd3\xd6\xee\x1e\x84\xf2\xf2\xf0\x7a\x7e\x49\xf4\x98\x48\xa7\xda\x71" + + "\x7f\x62\x18\x3d\xfb\xaf\x72\xa1\xa1\x23\x29\x0f\x81\xa2\x1c\x66\x70\x87\x72\x7d\x01\x70\xfd\xc1\x37\x5f\x7d\xfd" + + "\x78\xca\x88\xb1\xf0\xd6\xd6\xc8\x20\x17\xed\xe7\x16\x68\xcb\xda\xc2\xc9\x02\x73\xbd\xdb\x5a\x6b\xf0\xd4\x6b\x1b" + + "\x82\x2c\xa2\x6c\x54\x58\x77\x07\x6f\xd0\x31\x2a\x42\x43\x59\x54\xc8\x6d\x44\xea\x04\xbe\x3a\xa0\x44\x37\x63\x9d" + + "\xe7\x13\x9a\xd6\xf6\x8c\x31\x02\xe9\x62\x74\x5b\x37\xc7\x9e\x24\x7e\xfe\xdb\xe7\x81\x0b\x01\x9d\x79\x48\x41\x4d" + + "\xdf\x72\x85\x82\x8f\x68\xed\x48\x65\x9f\xed\xff\x76\x90\xa9\x1d\x44\x31\x00\xc4\xb0\xa9\x6c\x4f\xc4\x32\xe5\x39" + + "\x1a\x51\x08\xd9\x96\xe3\x9a\xc2\x9a\xed\xfc\x89\x85\xca\xa2\x56\xbb\xa8\xab\x94\xae\xb2\xf7\x14\xdc\xb6\xff\x47" + + "\xa0\x4b\xac\x54\x31\xf7\xd6\xf3\x65\x9d\x9b\xb1\xb8\x2e\xc4\xab\x3e\xac\x1e\x69\x4c\x3f\x0a\x43\x10\x9e\x13\xc4" + + "\x15\x27\x82\xfe\x40\x65\x9d\x9e\x66\xa3\xbb\x6b\xed\xb8\x00\x33\x91\x6b\xf5\xe9\x9f\x6f\x3f\x4c\x48\x68\xbb\x5b" + + "\xd3\xad\xf3\x0d\x5e\xb9\xb3\x56\x4e\x28\x9f\xea\x13\xe3\xc8\x84\x95\xe4\x40\x5e\xbf\x82\x2e\xc0\x6f\x61\xcf\x47" + + "\xe4\x7a\xd8\xf5\x82\x89\x94\x05\x22\x6f\xc5\xbe\xd1\x45\x7e\xf6\xa3\xa4\xfa\x94\xf2\xf3\x60\x9e\xa1\x81\x9d\xa9" + + "\x23\x3b\xa3\x83\x60\xdc\x8c\x14\x4a\xfa\x6e\x50\x75\x95\xc6\x72\x6f\xea\x09\xf4\x32\xc3\x8a\x49\x1b\xd9\x89\x0f" + + "\x82\xe1\x93\x71\xff\x48\x7a\xb6\xa2\x7f\xf8\x21\x1f\xfb\xcd\x45\x76\xd4\x40\x75\xaa\x65\xef\xbe\x43\x4c\x59\xb0" + + "\xe3\x7d\x05\xdc\x89\x7a\xaa\xfe\x79\xb0\x37\xde\xdb\x87\x63\x26\x12\x37\x88\x56\x20\x4a\xc9\x3d\x15\xf7\x11\xba" + + "\xf0\x83\xb7\x0a\x69\x1c\x03\xca\x1c\x2a\x23\x0a\xf4\x95\x5d\x24\xca\xca\x4d\x0b\x55\x8c\x42\x61\x40\x36\xeb\x4b" + + "\xb5\x5d\x5f\xb0\x09\x97\x4a\x4e\x96\xc5\xd2\xa0\x81\x1d\x42\x5f\x74\x53\x5e\x21\xd7\x23\xb6\xda\x89\x99\xd7\x8d" + + "\x79\xe7\xae\x13\x50\xf3\xcb\x27\x84\x26\x9b\x68\xed\xbd\x17\xb4\x25\x60\x3f\xbf\x07\x63\x16\x49\x44\xb6\xa2\xca" + + "\x99\xd8\x4e\x27\xeb\x06\x42\xeb\x9d\xad\x3a\x0c\x15\x49\xf7\xe9\x48\xe1\x29\x20\x25\xb8\x9b\x46\x95\x75\x75\x6a" + + "\x1c\x47\x84\xda\xec\xd2\x67\x74\x95\x9a\x6e\xf8\x26\x13\x9c\x60\x65\x5b\x5d\x96\x41\x79\xe2\xf6\x6a\x24\xe4\x8b" + + "\x65\xfa\x43\x91\xb4\x3e\x55\xfb\xde\x8b\x6a\x7f\xe4\x45\xfc\xa9\xda\x57\x37\xa9\x67\x70\xa1\x8e\x07\x6a\xc3\x5a" + + "\x01\x22\xa1\x00\x8a\x08\x0a\x0d\x40\xb6\xbc\x95\xd9\x0d\xe6\xce\xbb\x99\x5d\x76\x6d\x00\x2b\xa0\x13\xca\xf4\xba" + + "\xad\x77\xe3\x0d\x70\xbf\xab\x61\x41\x95\xc9\xee\xfe\x08\xfc\xc3\x7c\xe3\x59\x5f\xd2\x56\x5c\xa8\x60\x1a\x50\x07" + + "\x6a\x5f\xb8\xe5\xc2\xb6\x92\xdc\x6f\x20\xc9\x92\x49\xf5\x64\xb8\x6b\x87\x0a\xb8\x54\xc8\x93\x9a\x2a\xcf\x46\xea" + + "\x28\x6c\xc1\x84\xdc\x4f\x26\xea\x3d\x9a\x16\x25\x97\x00\x5e\x51\x48\x41\xd8\x16\xf9\x37\x89\x56\x2e\xad\x91\x8e" + + "\xb3\x33\x2d\x55\xd2\xcd\x06\xe1\xf5\x6b\xb0\x39\x33\xfa\x32\xf3\xa1\xc3\x23\xd1\x46\x82\x05\x2c\x3c\xfd\xac\x98" + + "\xac\x58\xa5\x65\xc1\xca\x1e\x2b\x8c\x47\x78\x66\x3c\x6e\x73\x8f\xfb\x1f\x84\x77\xd7\x2b\x7d\xea\xea\x0d\x28\x10" + + "\x9a\x5c\x1e\xe5\xd9\xc3\x0f\x36\xea\x4b\xc3\xf2\x1b\xc9\xf4\xbd\x2b\x96\x2b\x48\x28\x8b\x58\x13\x35\x33\x31\x34" + + "\xec\x58\x63\x89\x65\xfa\x73\x19\x33\x8d\x64\x0d\xab\x3b\x69\xa0\x35\x30\xe7\xa6\x21\x87\x9e\xc2\xfa\x9e\xfa\xa0" + + "\x0c\xec\x17\xea\x0c\x47\xaa\xd2\x4e\x9a\x79\xe7\x35\x88\x22\xde\x6e\xa4\x52\xb2\x0a\x11\xd2\xec\x41\x3f\xe2\xe3" + + "\x4c\x67\x59\x86\x77\x2c\x89\x9d\x18\x6d\x0b\xdd\x34\x69\x2b\xd3\x16\xa5\xf7\x39\x60\xc3\x80\x7d\x4f\xec\xba\x3e" + + "\x6b\x55\x1f\xae\x37\x29\xc9\x81\xff\xcc\x72\x00\xd1\xad\xea\x0b\xbc\x04\x69\x9b\x3c\x96\x8d\x95\x46\x37\xde\xa4" + + "\x8e\x66\x5e\x48\x3e\x6f\x43\xdb\xd1\x7e\x0e\x92\x80\xfb\x92\x37\x76\x52\xa6\xd3\xa5\x17\xa6\x31\x90\x8c\x67\x66" + + "\x84\x16\x76\x0e\x10\x05\xee\x1e\x39\xd5\xcd\x89\x3e\x35\xa9\x25\x79\x32\x51\x83\xaa\x56\x4b\x0d\x79\x97\x16\xf5" + + "\x05\x10\x68\x11\x73\x43\x3a\x42\x40\xf7\x20\xe0\x96\x21\x9d\x8e\x40\x04\xa5\x5f\x44\x98\xe4\x99\x08\xe9\xb9\xdb" + + "\x25\x41\x1d\xf8\x7d\xc0\x89\x1a\x02\x59\x6a\x55\xa0\x59\x9b\x08\x19\xa9\xcb\x01\x4d\x4f\x7d\x29\x61\x84\x53\x49" + + "\x96\x36\xd4\x7c\x4d\x62\x98\x0f\xd6\x08\x95\x1c\xa8\xc7\x7b\x7b\x40\x81\xf0\xc1\x5f\xd5\x17\x7b\x7b\x7c\x67\xae" + + "\x2d\x26\x94\xdd\xfb\x52\xb4\xf0\x77\x23\xc2\x19\x1c\xd3\x12\x96\xb7\x1b\x5f\x27\xfd\x86\x3f\x3d\x2e\xb5\xb3\xe8" + + "\xac\x25\x0a\x2b\x78\xe1\xa4\xba\x01\xc8\x76\x17\xfa\xaa\x2f\xa2\x0a\x7d\xa9\x2f\x34\xb8\xff\xb5\xc3\x68\x41\xa8" + + "\x37\x9f\x1a\x4b\x95\xc0\x9a\xfb\x59\xe5\x7c\xd8\xa8\x61\x9d\x2d\x74\x51\x45\x20\xe6\x49\x38\x56\xa0\x59\xff\xdd" + + "\xe2\xce\x6d\x02\xcf\xd6\x16\x53\x0f\xaf\xb8\xef\x89\x6c\x8d\xbc\x90\xb3\xd8\x14\xb9\xec\x56\xb9\x75\x97\xac\x73" + + "\xe0\xbf\x4a\x2d\x1f\x9f\xd2\x1b\x27\xc6\x7c\x7a\x27\x3a\x42\xcf\xc6\xc6\xa5\x23\x3f\xdc\x3c\x52\xe5\x21\xe8\x23" + + "\x6d\xfc\xc7\x7b\x5f\x06\x5d\x37\xea\x37\xbf\x7b\xf9\xec\x85\x84\x1f\x89\x48\x71\x56\xd5\x54\x5f\xf6\x34\x6d\xa9" + + "\xf5\x7d\x8a\x6e\xa6\xb4\xc9\x2f\xf6\xbe\xbc\xa5\xf6\x96\xeb\xc8\x92\x60\x1b\xd6\x6c\xa3\x2a\xb3\x34\xed\xe7\xd6" + + "\x67\x40\x20\xdc\xd6\xf4\x2e\x8c\xea\xe6\xdd\x0f\xb6\x38\x6f\xcf\x0c\xd6\x20\xff\x3e\xe8\x45\xb6\xb6\xd8\x1a\xe4" + + "\x5f\xc2\x03\xbf\x6a\x82\xda\xdc\x97\x6f\xe8\xda\x8d\x7a\x83\x8a\x49\x43\x46\x04\xac\x18\xdc\xfe\x43\x2f\x7d\xc1" + + "\x16\x41\x89\x9b\xa5\x2e\x01\x8b\x35\x8c\x03\x8d\x4c\x30\x97\xe0\x3a\x5f\x57\xc8\x55\x92\x0d\x92\xfb\x6b\xe5\x5d" + + "\x99\xae\xfb\xf5\x35\x1a\x9b\x3b\x56\xc2\x78\x2d\x30\x78\xa1\xe3\x06\x02\x14\x34\x4a\x4a\xc7\x6b\x1b\x52\xe5\xa5" + + "\xb1\x09\x92\xfa\x83\x80\xcd\x92\xeb\x9c\xbc\x5e\xa4\x5b\x57\x64\x31\xe5\xa1\x3c\xed\xbc\xa2\x6e\x0e\x3a\xdc\x41" + + "\x20\xed\x34\xbc\x9d\xe4\x0a\xc2\x35\x9b\xbc\x74\xe3\xdb\x48\xc9\xb6\x84\xdf\xd3\xb8\x31\xb6\x2e\xcf\xcd\x2f\x45" + + "\xbb\xe8\x91\xc9\x8e\x02\x5b\x63\x05\x57\x84\x97\xee\x71\x7f\xce\x0f\x51\xb5\x1b\xf8\xc6\x9a\x99\xd9\x16\xf5\xe2" + + "\x1a\x1f\xf7\xdc\x21\x77\x18\xfc\xe5\xec\x3d\xaf\x73\xcf\xd2\x81\x37\x15\x5b\x71\xa4\xbb\x55\x87\x17\xf8\xd7\xc4" + + "\x87\x30\xb3\x87\x24\x4a\x50\x34\x8a\x13\xed\xc1\xc1\x15\xc3\x64\x68\xf3\x84\x41\x8f\xa2\x4f\xf9\xa8\x4e\x6f\x99" + + "\x81\xe7\x24\x18\xc2\xef\x8e\x21\xd8\xf5\xfc\xd3\x67\x9a\x1a\xf8\xaf\xca\x4d\xdc\xa5\x0d\xb2\x93\xb0\xee\xba\x03" + + "\x41\x12\xdb\xb3\x7f\x3c\xfb\x55\xcd\x30\xf6\x46\x1c\xe0\xfb\x03\xb5\xbb\x1b\x19\x15\xa2\xfc\x6e\xb7\x19\x14\xea" + + "\x55\xd6\x8f\xb1\xb4\x7d\xaf\x6b\x4c\x21\xcf\x83\x53\xd3\xfe\xe3\xdd\xdb\x1f\x3a\x0e\xbc\x48\x82\xbd\xa3\x46\xec" + + "\x4c\x4d\x9d\x80\x64\x48\x3d\xa5\x47\x2a\x03\xbf\xfc\xc8\x63\xf9\xd4\xb4\xef\x20\x44\xa3\xd3\xd4\xa7\x36\x22\x92" + + "\xaf\x88\x96\x28\xee\x23\x45\xba\x8d\x60\x91\x8e\x30\xad\xd3\x48\x65\xab\xda\xb6\x31\x7a\xba\x2a\x46\x6c\x6b\x96" + + "\x40\xea\x47\xfc\x30\x06\x89\xee\x1d\xad\x74\xf5\x99\x4c\x14\x44\xed\x05\x54\x5f\xaf\x8e\xe4\x27\x98\xe7\x0d\x1d" + + "\xdd\xb7\x6f\x81\x30\x23\x43\x03\xaf\xbd\xc8\x55\x29\x9d\x42\x71\xc1\xfd\x1c\x62\x48\x71\x00\x6a\xdb\xe4\x06\x1d" + + "\x4f\xb2\xdb\x3f\x03\x11\x25\xe0\x86\xe9\x1b\x9d\xd2\x54\xc4\xe0\x6d\x53\x04\x5a\xf1\xcf\x30\xaf\x1b\x69\x17\x59" + + "\xa3\xc3\xdd\xda\x0e\xa9\x69\x9e\x4a\x34\x7c\x72\x00\xd1\xea\x64\x5d\xcd\x16\xaa\x9e\xfb\xa9\xc6\xbb\xcf\x1b\x7a" + + "\x28\xc1\x15\x9c\x19\x34\xf4\x75\x97\x38\x58\xd5\x46\x2a\x9c\x88\x51\xe7\x88\x4a\x7a\x14\x13\xab\x91\x50\x83\x74" + + "\x36\x89\x58\x65\x01\x24\xde\x32\x20\x97\xc4\xe9\xbe\x0d\x77\x5a\xc0\x32\xcb\x0c\xee\x54\xe5\x6f\xe6\x5c\x97\x3f" + + "\x83\x69\x25\xda\x74\x31\x24\x72\x67\xd5\xa2\x45\x4b\x23\xe2\xc2\x8a\xf1\x61\x91\xb1\x6c\x21\xe4\x8b\x63\xe0\xc2" + + "\x13\x8e\xc2\xf4\x31\x22\x37\x12\x76\xb9\x17\xb5\xfc\xa2\xd1\xab\x67\x65\x94\x33\x0e\x02\x82\x04\xbe\x99\x2b\x72" + + "\x07\x7a\x1f\x7d\x92\x18\x82\xff\x5c\x52\x53\xea\x09\x56\x16\xe5\x33\xbd\x2d\x85\x3b\x66\x40\xf6\x90\x1c\x7c\xe9" + + "\xbc\x0f\x59\x20\x21\x62\xc0\x55\x8e\x26\x5a\x8c\xcd\x40\xf4\x6b\x28\x0d\xaf\x42\x8e\x13\xd7\xfa\x28\x54\x3b\xae" + + "\x2f\x2a\xd3\x78\xd8\xe3\xe1\xd8\xfc\x73\xe0\x58\xad\xf1\xac\x04\x0d\x0c\x46\xd7\x76\x52\x99\xe1\xb7\x21\x2f\x4b" + + "\x18\xb5\x6b\x6e\x8c\x31\xcb\xdf\x82\x6a\x39\x1a\x43\x7c\x7b\x42\xd9\xa5\x5e\xf5\xe8\xdd\xdc\xc2\x88\x7c\x7d\x9d" + + "\x7c\x20\x90\xba\x00\x20\x57\x08\xf2\xf3\xf9\xa2\x28\xf3\x24\x4d\x06\x27\x26\xe9\x94\x7b\x9a\x08\x2e\x22\x79\x02" + + "\xaf\xc4\x18\xad\xae\xbc\x7c\x3d\xb4\x2a\xc9\xf6\xeb\x06\xf3\xba\xaa\x62\x87\x55\xb9\xd7\xfe\xa7\x37\x17\x34\xfe" + + "\xe9\xdb\xeb\xee\x54\xb8\x04\xfe\xb7\x31\x4d\xad\x84\xac\x32\xe5\xdc\xa3\x56\x0d\xe2\xfd\xc2\x8f\xd3\xd4\x8a\xfe" + + "\xfb\xf8\x68\x84\xdd\x16\xb3\xaf\x98\x13\x96\x16\xc5\x17\xec\xcd\xc6\xe9\xea\xbb\xed\xc4\xdf\x95\xf3\x2f\xea\xc6" + + "\x27\xad\xc7\xa6\xb3\x2e\x5a\x3a\xec\x5b\x99\xa9\x1c\x49\x34\x86\x75\x95\x8c\xa2\x87\x86\xe3\xf9\x1b\x0c\x6f\x4b" + + "\x65\xdc\x4d\xaa\x44\x09\x4e\x4f\xea\xfc\x2a\x93\xbc\x5c\x27\x6b\x3c\x98\xb9\x91\x79\xc5\x64\xaa\xee\xe8\xb8\xd3" + + "\x6e\x93\xa9\x1f\xbb\x35\xe9\x40\xfb\xfb\xf0\xee\x55\x33\x26\xeb\xc6\x78\x51\xe4\x39\xa4\xc0\xef\xcd\x8e\x22\x01" + + "\xea\xdf\xae\x4c\xa3\xd5\x5f\x0f\xd4\xfe\xe3\xf1\xfe\x63\x7c\x89\xcf\x1a\x83\x01\x60\xf5\x7c\x6e\x4d\xfb\x4b\x91" + + "\xb7\x0b\x34\x79\xe1\x83\xef\x4c\x71\xba\x68\xad\x02\x04\x80\x76\xa1\x2b\xf5\xbb\x69\x6a\x55\x57\xca\xd6\xcb\x40" + + "\x35\xc3\xed\x85\xb9\x8b\x42\x65\xae\x51\x50\xde\x89\x17\x58\x29\xbc\xa1\x1b\xa7\x6f\x74\xe7\x85\x05\xb0\xac\x0d" + + "\xc3\x63\xbc\xc5\xcd\x13\xc3\xc5\xc5\xad\xb6\xcd\x79\x10\x1e\xef\xa9\x03\x35\xf9\x7f\x1e\xef\x4d\x20\xfe\xaa\x39" + + "\x69\x34\x38\x1d\x1e\xa8\xc9\x87\xa3\x0f\xc7\x84\xc7\xfe\xfc\xa7\xef\x5f\x61\x16\xd5\xc3\x0f\x15\x95\xc4\xcc\x26" + + "\xad\x69\xd8\x5d\x10\x90\xdc\xf1\xe9\xf5\xc9\xba\x6d\xeb\xea\xba\x58\xea\x53\x40\x80\x37\x2d\x80\xc1\x0f\x3f\x9b" + + "\x14\xf2\x63\x8d\xe3\x82\x2f\x01\x96\xe3\x1a\xa1\x1f\xaf\x9d\xf8\xa1\x1b\xa3\xaf\xcf\xcc\xd5\xa9\xa9\x86\x93\x02" + + "\x3a\xee\x15\xf9\x27\xeb\xa2\xcc\x7f\xd4\x8d\x5e\xb2\xf3\xd6\xe5\xc8\x89\xde\x23\x25\x1c\xc3\x46\xe0\x1c\x11\xd0" + + "\x95\xc8\x9d\x9e\xa1\x88\xd2\x24\x40\xf5\xc9\xc7\xb0\x71\x41\xc6\x47\x9c\x75\x43\x49\xb9\x8a\xd6\x2c\x41\x83\x17" + + "\xb1\x64\xd0\x68\xc4\x42\x9d\xc7\xfe\x0b\xd2\x53\xed\xfa\x5a\xf1\x0c\x93\x2f\x06\xf6\x5d\xc5\x20\xbb\x98\x2b\x13" + + "\xc0\x87\x42\xd3\x18\x24\x6c\x67\xba\xd4\x0d\x29\x12\x75\x9e\x87\xd1\x9f\x6f\x22\x71\x93\x89\x7a\xed\xbe\x27\xf4" + + "\x1a\xac\x41\x0d\xb0\xe6\x9a\x35\x16\xc3\x91\xc2\xf8\x7d\x70\x51\xa9\xd6\x4b\xd3\x14\x33\xcc\x0f\x47\xad\xf5\xcc" + + "\xb9\xda\x51\xd9\x51\x06\x46\x71\xce\xb7\x19\x47\x2f\x1e\xaa\x82\xcd\xde\x3b\x2a\x3b\xce\x46\xea\xbc\x6f\x89\x52" + + "\x92\x1b\x90\xe3\xbc\x81\xd1\xcf\x61\xf0\x46\x73\x4d\xf2\xb2\xf5\xc5\x4c\x46\x6b\xc8\x91\xbc\xbc\x88\x68\x9c\x85" + + "\x20\x8a\xa2\xa2\x4a\x70\xc2\x6e\x1b\x67\x45\x69\x8d\xdd\x48\xea\x93\x8f\x1c\x85\xb1\x71\x4c\x37\x72\x2c\xdd\x4e" + + "\xd1\x5a\xf8\x4e\x45\x0b\x0a\x7d\x8a\xd0\xcd\xa2\x3d\xc9\xb9\xe2\x9c\x38\x51\x37\xcb\xc0\xb8\x81\x6f\x1f\xfa\xf5" + + "\xc1\x37\x67\xe6\x6a\x42\x79\xc8\x30\xd0\x58\x61\x64\x1d\x3b\x6c\x4a\x17\xcb\x88\xc8\xe8\x68\x58\xe2\x20\x51\x0f" + + "\x5d\x8f\xdd\xc1\xa7\x24\x8c\x6e\xd4\x07\x71\x38\x56\x1a\x55\x83\x0a\x50\x9f\x97\x4c\xfb\xd2\x23\x55\x54\xe7\xf5" + + "\x99\xdb\x7c\x12\x3b\x25\xf6\x96\x8a\x13\xeb\xf5\xe5\xd3\x55\x87\xf8\xd7\x60\x08\xf0\xa4\xb7\xa4\x5b\x65\x2d\xd1" + + "\x91\xf2\x1c\x84\x93\x6f\xf0\x08\xfc\xfc\xd3\x6b\x27\x49\xd5\x15\x80\xbe\x63\x58\xd9\x8e\xca\xc0\x35\xaa\xaf\x84" + + "\xac\xf2\xc6\xe3\x88\xbd\x43\x13\xbd\x9f\xbf\xb6\x46\xbe\x37\x40\xb0\xc3\x45\x34\xfe\x62\xfc\x18\x13\xba\x15\x35" + + "\x1c\xec\x0e\xd5\xe8\xc5\xc2\x8c\x0a\xf4\x46\x69\x0b\xb7\x4d\x19\x5a\x2e\x3e\x4c\xf1\x04\xfd\x9e\x82\xfc\xea\x98" + + "\xe9\xbd\xa8\x46\x4a\x5b\xbb\x5e\x1a\xf6\xce\xa3\xd8\xe6\xfe\xdd\x37\xde\x44\x5d\x35\xba\x83\x0f\x94\xe6\xc8\xce" + + "\x87\x0f\xfd\xa5\x55\xd8\x1f\x4b\x5d\x54\x6f\xe1\x8c\x62\xd9\x7e\x4a\xdc\x22\xd2\xca\x52\x5e\xb8\x31\x3d\xd6\x9d" + + "\x9c\x71\x74\xac\x30\x19\x2e\x84\x7a\x89\xd4\xb2\x82\x47\xea\x1e\xd4\xd7\xf3\xf8\x5c\x13\x81\x74\x9d\xc8\xea\x32" + + "\xcf\xc0\x9c\x35\x80\x74\xf7\xfa\x8a\x56\xd2\x11\xd4\x92\x62\xa7\x26\x13\x95\x17\x90\xd8\x7e\x14\x8c\xdd\x5c\x0b" + + "\x9c\x37\xab\x1a\x33\x5b\x37\xb6\x38\x37\xe5\x95\xa0\x4b\x44\x76\x20\x72\xe8\x16\xba\x34\x52\xfa\x88\xcb\xde\x4a" + + "\x84\xc2\x32\xff\x14\x70\x1e\x1b\x63\xd7\x65\x8b\xae\x63\x22\xa5\x48\xe0\x29\xec\xf8\x63\x5d\x54\x03\xf0\x11\x94" + + "\x31\x10\x8f\xf7\x46\x88\xec\xee\x39\x8a\x5e\x29\x99\x6b\x35\x1b\xf9\xcd\xd8\xbb\x1b\x96\xc5\x7f\x84\xfb\x66\x28" + + "\x92\x55\xc5\xaf\x6e\x67\x62\x7b\xe5\x3f\x8c\x3e\x82\x99\x59\x35\xf5\xea\xbb\xba\x46\xd7\x81\x8c\x77\x13\xa0\x15" + + "\x51\x42\x04\x47\x46\xf3\xbc\xbb\xdb\xbc\x10\x49\x42\x0a\x8f\xa1\xa9\x57\x9e\x0b\x0e\xf5\x11\x9d\x11\x4c\x21\x7c" + + "\x76\xd8\x93\xbe\xd2\xbf\xe4\xc4\x57\xb4\x35\xdd\x7f\x89\xa3\xeb\x97\xa6\x58\x67\xc6\xd9\xa0\x85\x89\xe0\x67\x6b" + + "\xd4\xb8\xb0\x03\x95\x4d\x65\x2a\x55\x76\xb5\x45\xf3\xab\x69\x8f\xf8\xe5\x31\xa0\xed\xd9\x8e\xc8\x08\xd7\x5c\x38" + + "\xb0\x9e\x9d\xef\x56\xcd\x31\x12\x92\xc5\x23\x5e\x27\x4a\x47\x0d\x45\xd5\xfd\x84\x8d\xe4\x92\xa8\x85\x0a\xf1\x16" + + "\x24\x29\x60\x1a\xc6\xeb\x6b\x75\xbf\x81\x1f\xae\x72\xc8\x22\x10\x7d\x36\x94\x13\x17\x6d\x04\xc7\x9e\x45\x79\x13" + + "\xd3\x6c\xcf\x71\x96\x73\x9e\x48\x91\xe1\xf9\x20\xce\xf0\x8c\xc1\xb0\x52\xd2\x49\x73\x86\x1f\xc6\x2a\xed\x0d\xc9" + + "\xc2\x63\xfc\x2f\xc2\xbc\x42\xe0\x23\xcc\xef\x1f\x42\x54\xe1\x06\x13\x87\xd1\xf1\xe6\x23\x95\x7d\x68\x3e\x54\x6e" + + "\xfe\x7d\x50\xf2\x4d\xc8\x7e\xff\x5f\xaa\xea\x66\x08\xda\xe9\x4d\x82\x58\x74\xb7\x5c\x2e\x1a\xc9\x02\xe0\xa0\xbc" + + "\xcb\x12\xa7\x0f\x33\x17\xea\xd7\x37\xdf\x7f\xd7\xb6\x2b\x72\x51\x1c\xc8\x14\x5f\xe4\x92\x74\xc3\xa4\x05\x52\x96" + + "\x2d\x9a\xd7\x39\x47\xa7\x5f\x2e\x9a\x00\x82\xc0\x81\xed\x97\x8b\x86\xf4\x9b\xef\xd8\xde\xc6\x54\xdc\x09\x1e\x21" + + "\x66\x8d\xdc\x0c\xae\xd0\xf1\x80\x8c\x73\x40\x90\xf7\xfc\x45\xf7\x78\x6f\xcf\x7d\xbb\x37\x75\x7f\x31\xc0\x6a\x92" + + "\xe4\x0c\x9c\xd8\xf7\xbf\x7c\xb2\x37\x05\x09\xb0\x2d\x96\xc6\xaa\xd7\x2f\x3d\x06\xf8\xfe\xe3\xc7\x5f\xa0\x4f\x52" + + "\xc1\xe0\x36\xea\xc4\x55\x0d\x91\x5c\xee\xed\x94\x7e\x84\xfe\x43\x03\x12\x73\x20\x9d\xdc\x81\xd7\x29\xc7\xbd\x41" + + "\x29\xb6\x0a\x51\x02\x90\x27\xe8\xc4\xa8\xa5\xae\xd6\xba\x64\x97\x4d\xf0\x2f\xe2\x4c\x98\x83\x07\x4f\x1e\x7f\xbd" + + "\x37\xdc\xbe\x07\xd7\x35\xa5\xf2\x79\x06\xb6\x98\x5f\xf1\x22\x8e\xf4\xc0\x5c\x44\x0d\x41\xc9\x9b\x61\x2d\x59\xf7" + + "\xb6\xc5\x0b\x8c\x40\xec\xdd\x0d\x16\xad\x17\xef\x73\xf9\x90\x10\xe2\x07\xe2\xb6\xf2\x08\xfd\x3e\x49\x6a\x0d\x31" + + "\xf7\xf7\xef\x47\x13\x05\xde\xa6\xd9\x45\xd1\x2e\x9e\x37\x26\x47\x90\x56\x9b\x51\xa3\xa1\x98\xab\x8d\x2b\x02\x30" + + "\xf8\x03\x95\xcc\x77\x5c\xef\xd3\x64\x7f\x7b\xff\x45\x41\x49\x22\xec\x17\x8c\x2e\x0e\xb6\x0a\x06\x17\xaa\xad\x55" + + "\x14\xe8\x06\x50\xa6\x8c\x17\x08\xfe\x3e\xdc\x3a\xe7\x11\x8f\xcf\x04\xf3\x51\xd1\x04\x5c\x5f\xab\x74\xfc\xf7\xbd" + + "\xd3\xb6\x08\x5a\x8b\x2f\x44\x0a\xa9\x32\x71\x86\xca\x05\xfb\x05\xfa\x88\xd3\x48\x4d\x5a\xb0\x15\x13\xcf\x34\xb7" + + "\x02\x9b\xd0\x67\x58\x76\x53\xb7\xb3\x03\xa7\xd3\xeb\x52\x2f\x17\xcd\xb8\x5e\x99\x30\x45\x63\x34\x08\xf0\x2f\x89" + + "\x9c\x83\x4e\x95\xe2\x1d\xc1\xbd\x85\x27\x8c\xf6\x16\xa7\x72\x21\x60\x47\xf4\x54\x26\x1f\xa2\x04\xfb\x96\xb3\x65" + + "\x87\x7e\x23\xac\x59\x07\xc3\x14\xfc\x73\x6f\x2b\xe6\x46\x84\x4e\xb8\x07\xdd\x72\x51\x8e\xe8\x1e\xcf\x15\x0e\xb4" + + "\x57\xcb\x62\x49\xbe\x47\x09\xa4\x45\xd4\x4d\x1f\x27\xff\xf0\xa1\x82\x89\x4c\x62\xef\x45\xb7\xfa\x5e\xf7\x54\x34" + + "\x4c\xb5\xd2\x93\x89\xfa\x75\xf7\x27\xce\xdd\xb3\xfb\x4b\xd1\x2e\xa2\x70\x7f\x42\x03\xeb\x8b\xd2\x84\xfc\x9b\x10" + + "\x6b\x80\xe1\x56\xc8\x6c\x52\xe6\x3b\xe0\x43\x4b\x50\x68\xe9\xc6\xf8\xba\xf4\x59\x01\x81\xad\x5a\x7d\x2c\x4e\xad" + + "\xbe\x50\xab\xf5\xef\xbf\x97\x06\x7c\x89\x2d\xfa\x83\x56\xe6\xdc\x34\x14\x1d\x43\xa0\x3b\x76\xdd\xb0\xb7\xd4\x64" + + "\xa2\x06\x45\x8b\x50\x63\x48\xbb\x4f\x0c\x8a\xb7\x8e\x39\x5e\x99\x66\x97\x83\xc0\x4e\xb4\x2d\x40\xfc\x35\xe7\xa6" + + "\x52\x6b\x2b\x70\xa8\xd6\xab\x61\x34\x3a\xab\x97\xa6\x3b\xb8\x0b\x48\xc5\x4e\x09\x7c\x29\x34\xa1\x98\x7b\x3f\x73" + + "\xde\x5e\xd2\x8d\xab\xf7\xf8\xb9\x63\xc9\x9e\xf6\x59\x3a\xd9\x99\x04\xfb\xbc\xad\xd4\x81\xca\x62\x92\x90\xf5\x2c" + + "\xa5\x13\x32\xa5\x1b\xa3\xdc\xd4\xa9\x0b\x2b\xee\x99\xde\xc8\x80\x9e\xb8\x80\xb8\x9d\xe7\xc2\xc6\x19\x19\x62\x37" + + "\x62\x41\xa4\x69\xbc\x52\x9c\x85\xd4\x20\xbe\xb5\x15\x62\xba\xe2\xdb\xa1\xc8\x25\xc2\x81\x68\x1b\x8e\x00\xde\x66" + + "\xfc\x83\xfd\x86\x08\x1e\xc4\x7f\xe5\x31\xb6\x50\x53\x84\xce\xfc\x31\x86\x83\xab\x40\x86\x0b\x6c\x6d\x25\xae\x5f" + + "\xe1\x73\xce\x19\x2a\x3f\x67\x32\x3a\x08\x8f\x98\xfb\x98\xde\xc1\x7e\xec\x3d\x85\x44\x0d\x0f\xbe\xfe\x6a\xef\xc9" + + "\xc8\x71\x15\x8f\xf7\xfe\x22\x6a\x81\x55\x43\x9f\xe5\xde\xa7\xc1\xe3\x6a\xcb\x47\xed\xca\xce\xdf\xd1\xc9\x94\x75" + + "\x3a\x52\xa1\x6a\x8c\x20\xfe\x94\x0e\x8c\xe2\x61\xa7\xdc\x52\x78\xf3\x8c\xf3\x09\xaa\x93\xa2\xd2\xcd\xd5\x2e\x18" + + "\xf0\x25\x8c\x24\xa6\x22\xb4\x51\x2e\xc2\xb8\x8e\xc1\x83\xfd\xfd\x2f\x1f\x7f\x35\x14\x4f\x49\xff\xe8\x3a\x15\xd5" + + "\x15\xa5\x5c\x3a\x94\x73\xc1\x10\x96\xe9\x27\xa2\xc4\x8d\x9a\x0a\x87\x8c\x64\xec\xbd\xc0\x36\x83\x61\xff\x4a\xf0" + + "\x5f\x1e\x2c\x83\xcf\x98\xbc\xd6\xbe\x07\xa0\x03\x00\x9e\x3f\xf7\xe2\xe6\x56\xb4\xcb\x79\xf7\xfb\x3d\x1a\x6f\x7b" + + "\xff\x9a\xb6\x68\x74\x6b\x0a\x28\x32\x04\x75\x9a\x6d\x3a\xd4\xdd\xf3\x17\xd5\x8d\xa7\x27\xd4\x2d\xe1\x87\x21\xdd" + + "\xad\x72\xcc\x46\x94\x72\x01\x8c\x53\x90\x67\xb2\xd1\x10\xb6\x28\xd6\x76\x18\x51\xa7\x2a\x0f\xb7\x58\x1c\xb9\x26" + + "\x93\x3e\x01\x3c\x0e\xc4\xf8\xf3\x44\xf6\x02\x1a\x23\x93\xfe\xd5\xd7\x5f\x4c\xd5\xdb\x4a\x84\x1e\x14\x73\x14\xf4" + + "\x16\xda\x22\xe4\x24\xb8\x29\xb6\xe8\xb5\xaa\x71\xeb\xc1\x94\x5e\x19\xde\x0f\x1b\x89\x56\x1c\xa8\x90\xb8\x0c\x32" + + "\xf2\x49\x8a\x6e\xe2\xbf\xdf\x54\x6d\x67\xa1\xa5\xb3\x53\x2a\x8b\x91\x50\xc0\x21\x49\xe8\x00\x21\x82\xe6\x3a\xe0" + + "\x72\x7f\x00\xbc\xb1\x04\xb9\xb5\xe4\xb6\x94\x25\x58\xb3\x10\x28\x1c\xe0\x68\x37\x3c\x37\xb3\x65\xef\xf3\xcb\xdd" + + "\xf0\x26\x63\x59\x27\x41\xac\xe5\x96\x27\x83\xc3\xa9\xab\xff\xda\x7d\x32\xc4\xa7\x13\xf1\x8d\x84\x71\x65\x6c\x53" + + "\xaa\x39\x82\x24\x92\xae\xa0\xec\x5e\x45\xbe\x6d\xba\xe4\xf7\x91\x5a\xa6\x65\xf7\xd2\x9b\x68\x5e\x83\x43\x1b\xf8" + + "\x2b\x7f\x6e\x7d\xaa\x30\x08\x0e\xd7\x55\xae\xc4\xad\x1f\xcd\xb2\x0f\xbd\x1a\x04\x77\x14\x09\x6d\x43\x1d\xec\x04" + + "\x20\x77\xd4\xbc\xfe\x65\x48\xc4\x76\x23\x3e\xec\xf2\xfc\x3e\x8a\x1e\x5c\x63\x9e\xa6\x03\xfa\xb6\xa8\x72\xde\x1f" + + "\xad\x3e\x55\x0b\xb7\xeb\x44\x20\x59\xaf\xd4\x73\xeb\x18\xc0\x6f\x04\x12\x0c\x73\xec\x05\x88\x3a\xb9\xd1\x25\x45" + + "\xab\xcf\xa4\x1c\x24\x90\x06\x36\x0f\x02\x7c\x04\x68\x3b\x45\x2e\x60\xb7\x4a\x34\xbf\xf5\xc9\x32\x34\x56\xaf\xe0" + + "\xc9\xfe\x8a\x4f\xfe\x96\x0d\x51\x67\xc7\x07\x2e\x45\xbd\x76\x67\x10\x71\xac\xa7\xca\x8e\xf1\xa3\xe7\xf8\x80\xdf" + + "\xdb\x66\x36\xc5\x70\x78\x3a\xa2\x20\x1b\xd3\xcb\x0c\x28\xb6\x89\x3c\x42\x7b\xf9\x26\x73\x1e\x21\x13\x61\x4b\x63" + + "\x8c\x8c\x17\xac\x88\xf8\x56\x60\x9f\x11\x01\x49\xea\x08\xf7\xbc\x7b\x33\xee\x30\x2e\x87\xea\xcb\xbd\x2f\x15\xaa" + + "\x37\x42\x89\x8d\x90\x4e\xfc\xc2\xa7\xc5\x75\xec\x22\x79\x4d\x80\xe7\xcb\x80\x56\x2b\xf6\xc7\x19\xfd\x2f\x51\x3e" + + "\xb7\x5b\xea\x32\x97\x4a\x21\x34\x49\x35\x90\x9b\x1b\x52\xa6\x1f\x0c\x3f\x1c\x0e\x0e\x0f\x1e\x5e\x7f\x36\xbc\xfe" + + "\x70\xf8\xe1\x70\xc2\x07\x82\x61\x0e\xb1\xa8\xf5\x90\xb5\xbd\x24\x13\x0a\x4d\x55\xc6\x5d\x84\x85\x85\x87\xdc\x78" + + "\x77\xa0\x52\x35\xe0\x24\x48\xd1\xd1\xf1\xaa\x5e\x0d\xc8\x2c\x12\xcc\xf7\xba\xca\x6b\x08\xc5\x47\xc3\x6a\x40\x00" + + "\xc0\xf9\x40\xbf\x27\x5f\x63\x94\x26\x93\x8e\x87\x3c\x32\xd1\xe9\x7f\x01\x78\xa8\x23\xe1\x91\xcf\x6a\x0c\x47\xcc" + + "\x8a\x4e\x44\x2b\x98\xaa\x60\x62\xc2\xb1\xdd\x40\xe5\x00\xbd\x1a\xca\xc6\x54\x22\xa4\xcc\x0c\x50\xbf\xdd\xdc\xa3" + + "\xdc\xe4\x0f\x28\xfc\x9f\x9b\xe6\xa2\x29\xda\xd6\x54\x21\xd8\xc7\x31\x02\xba\xa8\x08\xea\xd5\xb5\xf4\x63\x53\xaf" + + "\x00\x43\x03\xbb\x18\x42\xd9\x41\x2d\x84\x8b\xef\xf1\x3e\xd0\xbd\x10\xb5\xb1\xd9\xba\x29\x33\xd2\x8e\xc6\x60\x34" + + "\x9d\x04\x9d\x83\x24\xa0\x1d\xc2\xc0\xd4\x70\x0c\x86\xf1\xb7\xf3\xc1\xdd\x70\xf8\x19\x28\xba\x93\xde\x90\xd7\xeb" + + "\xc3\x87\x2a\x73\x7f\x02\x3c\x7a\xc8\x40\x44\xb7\x4e\x31\x9f\x77\x53\xb4\x91\x0e\xc1\xe2\x8c\xaf\x32\x27\xef\x0a" + + "\xac\x24\x8f\x79\x05\xc9\xdf\xbc\x16\xc9\x4f\x17\x84\xc8\xf4\x25\xe6\xa3\xda\xbc\x3f\x20\x45\x8f\xf9\x7d\x86\x6a" + + "\x99\xc6\x2c\xcd\xf2\xc4\x10\x36\x98\x81\x98\x41\xf7\x37\x1a\xd3\xb4\xb5\xf5\xac\xd0\xae\xab\x40\xf8\x31\x9a\x45" + + "\xae\x6d\x58\xae\xe7\xe1\x48\xf4\xd8\x73\xd3\x42\xbc\x72\xc9\xf3\x01\xeb\xb8\x93\xe7\x51\x94\xb6\x11\x9c\x2e\x5a" + + "\xc0\xdd\x5e\xa8\x1b\x34\xed\x70\x54\x5c\x3c\x4d\x1e\x87\xe8\x28\x3c\x83\x14\x53\xf2\xb7\xd0\x9c\x43\xeb\x00\xdb" + + "\x01\xb9\x2e\xe4\x88\xa3\x88\x67\xba\xf2\xd2\x0d\x1b\x60\x8f\xfa\xa1\x55\xfc\xf6\xed\xe0\xaa\x60\x4d\x6c\x9c\x96" + + "\x0d\xa7\x98\x3b\x14\x01\x28\xd2\xa1\xb4\x35\xc0\xa9\x14\xe6\xdc\x20\xf8\xbc\x9e\xbb\xc7\x74\x63\xfa\xd4\xfe\xc4" + + "\x86\x84\xd4\x2f\xc4\x0d\x20\x2c\xfd\x71\x57\xe1\x9f\xc2\xa9\xfa\x93\x9b\x7a\x85\x61\x10\xd2\x20\x9e\xaf\x1d\x95" + + "\x81\xfd\xb9\xaa\x71\xd9\xc0\xac\x24\xc3\xb3\x93\x8c\x70\xbe\xf6\x90\x64\x46\x80\xef\xcd\x01\x05\x1b\x46\x27\x31" + + "\x24\xba\x67\x80\xbc\xf9\x37\xc7\xf7\xbb\xc7\x82\x30\xa9\x03\x52\x88\x1f\xc5\xdd\xc7\x1e\xf4\xbf\xea\x9b\xaa\xee" + + "\x24\x1d\x04\xaf\xfa\x74\x34\xcf\x4b\xa3\xab\xdd\xf5\x2a\xa4\x8c\x1e\xcc\x8b\xc6\x58\x5a\xb9\xb0\x46\x20\x52\x45" + + "\x20\x8e\x7d\xc6\xd0\x9f\x8c\x6d\xeb\xc6\x74\x4f\x32\x14\xd8\x38\x06\x31\x0b\x32\x1a\xc9\x51\x20\x38\x63\xda\xaa" + + "\x79\x63\x64\x18\x73\xa7\x12\xe9\xed\xb4\xd4\x67\xa8\xf0\x43\x9b\x64\x63\x76\x51\x75\x07\x19\xfa\xe8\x7a\xca\x6b" + + "\x03\x82\x9a\x9d\x35\xe6\x42\x41\x80\xb7\x95\xee\xc8\x29\x01\x70\xbd\x4c\xae\x9d\x5e\x0a\x81\xa1\x0c\x0c\xfd\x14" + + "\x11\x3b\xb8\xfc\xe6\x6b\x48\x74\xbd\xe6\x18\xf5\xf8\xf6\x86\xac\xdf\x3d\x87\x3d\x0a\xe4\x71\x7b\x08\x23\xac\x01" + + "\x30\x2c\x2c\x1d\xa4\x43\xe8\x24\xe6\x0c\xb3\xd6\xdd\x19\xc1\xa3\x43\xd2\x4a\xb9\x29\x85\x1f\x99\x78\xdc\x53\x57" + + "\xaf\xe7\x74\xdf\x5e\x8c\xb7\x7c\x12\x65\x11\xc1\x72\x95\x06\x80\x03\xdc\xc5\x03\xf4\x41\x30\x24\x2c\x3f\x6c\x90" + + "\x5b\x31\xb2\x82\x20\x27\xeb\x39\x78\xaf\xc2\x0b\x06\x0f\x1f\xe0\x3e\xd0\xe5\x70\x0a\x51\xbd\x4e\x0c\x83\x18\x7b" + + "\x74\x08\x69\xf4\x29\x86\x9c\x50\x40\x38\xe6\x96\xc8\x11\x5b\xb2\xf0\x48\xe9\x23\x95\x23\xb3\x67\x31\x9d\x1c\x32" + + "\xb3\xe4\x23\x65\x56\x18\xb8\x63\xd3\xc6\x30\x17\x31\x54\x5d\x54\xb3\x72\x9d\x1b\x1a\x9f\x70\x91\x41\xb8\xe1\x76" + + "\x59\xf6\x38\x55\x59\xf3\xdd\xfb\x37\xdf\x47\x1c\x3f\x85\xd6\x70\xaf\x64\xe3\x42\x2e\xbc\xcf\x7a\x0e\x91\x50\xbc" + + "\x17\x2d\x8f\xed\xaa\x24\x15\x78\xf9\x90\xbe\xe3\x49\x84\x6b\xfe\xa4\xae\x1d\x0d\xf1\xdf\xca\xb6\x0f\xb8\x28\x2c" + + "\xae\xff\x2c\x96\x3c\xc3\x63\x81\x2f\xcf\x73\xf9\xd4\x33\x74\x30\xf0\x5c\x1d\xa8\x06\x13\xb2\xbc\xd7\xa7\x84\xbc" + + "\x88\xac\xcf\x28\x48\xfe\x60\xd7\x93\xfd\x78\xf8\x50\x1d\x1d\x07\x37\x2a\x4c\xe8\xd2\xea\x53\x1e\x17\xd5\x1d\x8f" + + "\xfe\x88\xfb\x33\xc6\xd5\x27\xc7\x7c\x2e\x7d\xb4\xef\x88\xce\x71\xf0\x78\xf2\x1d\xa4\x95\x02\xef\x9a\x57\xb4\x93" + + "\x06\x0a\x53\xaf\xab\x63\xb1\x4c\xdc\xdb\xa1\xf0\x21\xb5\xa1\xcb\xf4\x67\xe2\x8f\xce\xc6\x53\xff\x71\x24\xd8\x45" + + "\x49\xae\xd8\x43\xc0\x34\xa7\x66\x00\xb9\xec\xb1\x8f\xa9\x87\x34\xfb\xf0\x42\xc2\x1c\xb3\x12\xf9\x3e\x81\x62\x96" + + "\xb9\x02\xc9\x93\x53\x57\xb8\xd5\xf8\x8d\xb4\x87\xc1\x4d\xc7\x3d\x40\xa9\xe0\xd1\x23\xc8\x7a\xfa\xbd\x2b\xa1\x09" + + "\x92\x15\xec\x35\x2b\xc0\x7b\x87\xac\xa6\xf1\x77\xdd\x58\x31\xf4\x65\xea\x04\xb9\xa5\x89\x2d\xee\x27\xdc\x35\x76" + + "\x2b\x5e\x47\x78\xe6\x64\xcb\xf2\x8a\xdd\x69\x42\x90\x99\x98\x34\x0a\x23\x30\xb3\xb6\x6e\x38\x1d\xb6\xc7\x05\x80" + + "\xcd\x85\x31\x06\x50\x05\xdc\xdd\xf3\x39\x26\xcf\x08\xbc\xbb\xca\xe4\x5a\xba\x02\x7f\x13\xb0\x86\x5c\x7b\x8a\x84" + + "\xea\xaa\xc0\x44\xa8\xf0\x09\xcb\x65\x94\x8d\x23\xbc\xdc\x1b\xe1\xfb\xd4\xcb\x0e\xf0\xed\xc2\x3d\xd0\x71\x98\x0b" + + "\x94\x9d\x5c\xc4\x86\x11\x57\xfe\x8b\x49\xfc\xf1\x3e\xb7\xd1\xe5\x25\x59\x6e\x75\x40\x75\x40\x0f\xa9\xba\x4e\x38" + + "\x6c\x9c\x19\x10\x0e\x02\x8b\x12\x01\xd5\x33\x4a\x69\x89\x15\x05\x28\x4f\xae\xb9\xc7\x09\x97\xb5\x51\x3f\xbe\x7d" + + "\xe7\xd5\x51\x32\x81\x31\x5c\x7f\x32\xe8\x08\xf3\xd2\x8e\x90\x2d\x88\x51\xa2\xf1\xc8\x99\x72\xce\x87\x4c\x00\xf0" + + "\xdc\x1a\xe3\xc7\x97\x71\x31\x57\x99\xeb\x50\xe6\xb3\x75\x38\x49\x4a\x84\x5c\x42\xbc\x3a\x68\xce\x38\x32\x52\x82" + + "\x8c\x78\x81\x31\x0d\x0b\xa4\xc0\x33\x91\xf0\x0b\xaf\x34\x9c\x17\xbc\x2a\x01\x9f\x59\x38\x10\x44\x56\x8a\x28\x0c" + + "\x0b\x38\xa9\x28\x51\xf7\xda\x52\x8a\x71\xd2\x6e\x45\x8a\x7b\x09\x94\x21\x18\x47\x52\x91\x95\xf3\xb1\xeb\xd6\xc0" + + "\x1f\x96\x00\x5c\x48\x4e\x9f\xe1\x8d\x63\x50\xc4\xdd\x5a\xd6\x33\xb6\x17\x60\x92\x7c\xbf\x4c\xe0\x97\x98\xaf\x97" + + "\xcb\x2b\x95\x17\xe7\xbe\xb6\x97\x97\xf1\xfd\xe8\xc8\xc8\x79\x5d\xe4\xea\xf5\x4b\xf5\xf9\x8f\xa6\x59\x16\x90\xd9" + + "\x4a\xbd\x30\x55\x61\xf2\xcf\x29\x93\xa2\x94\x08\x06\xd9\x5f\xf3\xe2\xfc\x6f\x59\x08\x94\x4a\x2f\xd2\xce\xc4\x0d" + + "\xc7\xf3\xc2\x15\xf4\xa3\x10\x50\x89\x11\x52\x22\x63\x43\x43\xa6\x27\xf4\x7d\xc4\x52\x71\x85\x34\x75\x37\x01\x8a" + + "\x5b\x68\xa9\x1e\x3e\x14\xa4\x2f\x0a\xb4\x0e\x32\x9c\x9b\x72\xf4\x45\x0d\xc1\xb3\x7e\x8d\x00\x11\x99\x81\x62\x42" + + "\xb3\x23\x0f\x4a\x14\x07\xdb\xdf\x74\xaf\x09\xf2\x0c\x94\x91\x1c\x7d\xa1\x1f\xba\x2a\x96\x1a\x9d\x5b\x6e\x0b\x1b" + + "\x61\x05\x79\x63\x56\x03\xa6\x72\xc5\x12\xfc\x42\x6e\x89\xf5\xc4\x30\x38\x27\xbe\x56\x63\x0e\x6f\xbb\x19\xd2\xa9" + + "\xec\x09\x33\xc9\xeb\xd9\x4b\x8c\x9c\x23\x3f\x23\xaf\x49\xe4\x3f\xe8\xba\x8e\xae\xa4\xbf\x9b\xd6\x11\x4a\xf2\x3b" + + "\x02\x88\x09\xed\x7d\x28\xd3\x7c\xdb\xa7\xa6\xfd\x05\x0a\xde\x32\xca\xc2\x26\x45\x0e\xf1\x0f\xf6\x8c\xe3\x6c\x34" + + "\x6e\x64\xdf\xf8\x58\x1d\x62\x1a\xff\xbd\x30\x17\x49\x8e\x49\x8c\xe2\x21\x57\x33\x6b\xda\xb7\xf0\x7b\x9a\x4c\xb8" + + "\x40\x58\x2b\xa4\x82\x7b\xb6\x6e\x7e\xac\x6d\x81\xee\xef\xb3\x75\xf3\xbd\x99\xb7\xf0\xc7\xf3\x77\xef\xde\xd7\x2b" + + "\xf8\x93\xff\xc5\x9a\xf9\x2d\x95\xd4\xe5\x0c\xb2\x4a\xf9\x5a\x60\xff\xad\xe8\x57\xb8\xb6\x66\xd6\x72\x4f\x32\x7e" + + "\x9b\x71\xbc\xdd\x6c\xdd\xd0\xd2\x30\xab\x82\x73\x43\x95\x35\xf5\xca\xe7\x3a\xd9\x0e\x18\x8e\xbe\x11\x08\x82\x1c" + + "\xa9\xa2\xda\x45\x3c\xdf\x7a\x35\x29\x0d\x04\x86\xa3\x93\x06\xb8\x62\xd4\x98\xd4\xa3\x98\x41\xdd\x5e\xdb\x12\x7a" + + "\x8a\x7c\x81\x2b\x11\x8c\xea\x30\xf7\xb6\xbd\x2a\xcd\x58\x0c\x29\x6b\x4c\x09\x30\x19\x99\xd4\x6f\xf8\x19\xc2\x14" + + "\xd4\x2f\x43\x88\x15\x29\x91\xfd\xac\xf6\xcf\x4a\x5b\xaf\x58\xc9\x10\x66\xb8\xbf\xa8\x1b\x9d\x2f\x9b\xae\x00\xc0" + + "\x78\xc4\xc3\xd2\x27\xb6\x2e\xd7\xad\xc9\x00\x12\x3c\x7a\x35\x2f\x2e\x23\x9f\xd9\x41\x58\x7c\x4c\x98\xca\x1d\x91" + + "\xea\xc6\x75\x5b\x67\x43\xf5\x37\xb5\xbb\x1f\x56\xe4\x07\x4a\xe9\x7e\x62\x14\xdc\x69\x6d\x1d\x36\x47\x68\xb3\x98" + + "\x2b\x53\x38\x6a\xe8\x56\x49\xd5\x8d\x82\x85\x2a\xac\xf2\xf9\xac\x43\x51\xcb\x45\xb9\xfb\xa0\x2f\x73\xfd\xf5\xab" + + "\xd7\x1d\x3c\xaf\x9c\xd8\xd8\x62\x3d\xb8\x72\x56\xeb\xe3\xee\xc6\x02\x5c\x7c\xdc\xd6\x2b\xff\x96\xd6\x40\xbe\x76" + + "\x3d\x66\xfa\x2c\x7d\x1b\x7c\x5d\x70\x4d\xbc\x2a\x6b\xdd\xca\xc9\x04\x15\xfb\x5e\x5a\x71\xb7\x2c\x4e\x76\x28\x7c" + + "\x73\x7b\xfc\x76\x70\x01\xe4\x91\x77\x52\xaa\x11\xfa\x25\xee\x9d\x42\x1c\x65\xd5\x0d\xca\xf6\xee\x72\xf5\x4a\xdd" + + "\x4f\x11\xec\xdd\x39\x84\x37\x07\x49\xc9\xdd\x50\x27\xfc\x1e\xe2\xd6\x79\x4f\x13\x79\xd3\xa9\x1e\x56\xbd\xbf\xfe" + + "\x12\x27\x26\x29\x2b\x5b\x28\x71\x86\x76\x98\x5e\x75\x06\x91\x81\xee\x26\x13\x3e\x75\xe9\xe4\x8c\xa1\x44\x34\x31" + + "\x48\x65\x86\x1b\x56\x16\x76\x0f\x1c\xc1\x50\x2e\x98\x6a\x37\x87\x1f\xd4\x1d\x6a\x9c\xf4\x08\x3a\xec\x59\xa6\x34" + + "\x90\x98\xae\x0e\xbf\xa4\x91\x75\x96\xbc\xba\x41\xbb\x30\x0d\x7f\xdf\x12\x5a\xbd\x15\xdd\x19\x63\x7f\x5b\xb0\x90" + + "\x23\xef\x08\xb6\x7b\x45\x7b\x44\xdc\xa3\x23\x77\x27\x8e\x3c\x95\x24\x29\x07\x54\x3a\xf8\xf4\xa4\xbe\x74\x44\xdb" + + "\x1d\xf4\xa9\x93\x43\xdc\xb2\x4d\xd5\x9e\x22\x93\x5c\x5e\xcf\x28\x88\x3d\x04\xa4\xca\x80\x7d\x89\x5b\x70\xdf\x15" + + "\x8e\xe7\x44\xf6\x2a\xdc\xec\x79\x3d\xeb\xbd\xcd\x11\xd8\xdc\xeb\xf8\x3c\xba\xb7\x56\x79\x61\x67\x75\x55\xa1\x6d" + + "\x83\x13\xcc\x85\x86\x99\xf8\xa2\x32\xca\x0e\xc2\xe8\xe9\xf6\x4e\x56\xea\xa4\xbe\x4c\x74\xde\x28\x61\xe4\xe0\xd5" + + "\x07\x72\xc6\xe9\xb7\xcf\x7f\x1a\xa9\x8f\x6b\x0b\xe0\xe2\x6a\x6f\xb4\xa7\x1a\x8d\x24\x71\xc1\x2e\x1f\xf4\xed\xb7" + + "\xa5\x9e\x9d\x7d\x6b\x9a\xe6\x4a\x3d\x19\xa9\xe2\xed\x3b\xf5\x85\x1a\xb0\x4e\x51\x15\x3f\x2e\xea\x0a\xb3\x8f\x48" + + "\x21\x17\xa6\xf2\xd4\xb4\xdf\xd6\x6b\x80\x2f\x7e\x5e\x16\xa6\x6a\x7f\x32\xb3\x16\x64\x5f\xdb\x36\x1d\x03\x3f\xad" + + "\xd5\xe6\x2f\x85\x5b\xf4\xd6\x05\x24\xa4\x10\xac\x0e\x2c\x4e\xd7\x32\x0e\xeb\x7e\x52\x5f\x02\x45\xd8\x71\xbb\x65" + + "\xec\xa4\xf9\xff\x20\xda\xb3\xcb\x53\x39\x9e\x41\x33\x8e\xcb\x80\xef\x70\x9f\xb8\x0f\xe1\xa0\x87\x2f\x7f\xdd\xf0" + + "\xa5\xa3\x01\xdb\xde\x2e\x8b\x92\x16\x13\xfa\xae\x29\x94\x82\x39\x63\xf0\x89\xde\x6d\x05\x26\x5d\x68\xf2\x47\x88" + + "\x46\x1f\xd1\xaf\xdb\x36\x3d\xc6\xad\x7b\x3e\xa0\x67\xf7\x87\xfd\xf8\xca\x5d\x65\x41\x9e\x71\xdc\x0a\x31\x73\xc0" + + "\x66\x12\xcb\x39\x48\xab\x74\x35\x86\x0a\x6f\x46\xea\xc4\xcc\x34\x08\x67\x98\xc1\xa4\xb5\xe8\xfc\x40\x75\xe1\xe7" + + "\xe9\x15\xb2\x81\x1d\x4b\x78\x02\xaf\xa4\x4f\xe4\xfd\xfe\xdd\x25\xa1\xfd\x31\xea\xc0\x09\x2f\x6b\x77\xb0\xe4\xa5" + + "\xee\x6f\xf0\x2d\xcf\xba\xde\xb1\xf1\x3a\x04\x99\xec\x82\x8f\x1a\xa3\xcb\x47\xd1\x1a\x89\x7a\xf1\x01\xc7\x24\xc9" + + "\x67\x83\x61\x02\x4f\xc9\xb0\xe6\x58\xc8\xc6\x9d\x13\x9f\x33\xdb\xb0\x01\x7e\x40\xb6\x81\x7b\x82\xc4\x71\xa9\x12" + + "\x4f\x96\x53\x7e\x93\xb4\x92\x24\x12\x88\x46\x75\x02\x59\x6a\x6c\x67\xcf\xe1\x61\x8b\x99\xc6\xbe\x6e\xe1\xf7\xef" + + "\xeb\x15\xe0\x02\x64\xa3\x80\x86\x92\x56\x88\x87\xf0\x53\x6b\x74\x67\xb1\xa7\x4a\x01\xbe\xbe\x3e\x41\xcc\x3e\x6c" + + "\x84\xa7\x1c\x81\xbd\xf1\x28\xa8\xa5\x6e\x4e\x8b\xca\xf6\x53\x94\x3a\x8c\x73\x57\x75\x86\xbe\xdb\xb7\xc1\xb1\xbe" + + "\xf7\x00\x51\x84\x9d\x92\x94\xa6\x16\xe3\x4c\x6a\xa4\x67\x1b\xab\x74\xa3\xf5\x75\xa6\x24\x48\x4e\xd2\xbf\x10\x27" + + "\x98\x52\x9f\xbe\x8d\x4c\x6a\xef\x97\x28\xfd\xc2\x67\x8c\x22\x13\x15\x03\x5f\x84\xdb\xf7\xab\xd8\xaa\xc1\xc2\xd3" + + "\x59\xec\x3e\x6a\x11\x64\xa6\x60\xf6\x89\xfb\xdd\xb3\xc7\xf1\x47\x6a\xf9\x41\x66\x67\xe3\x00\x85\x2a\x22\xb8\x93" + + "\x90\x43\xa9\x9d\x35\x75\x59\x02\xf3\xac\xd1\xbb\xac\x2e\x4b\xc7\x77\xa3\x0a\x2d\x05\xb1\xfa\x43\x7c\x30\x55\x99" + + "\xb8\x5e\xb2\x51\xf8\x98\xde\xd0\x95\x95\xa9\x1b\xa9\x90\x20\xa8\x2e\x60\x08\x45\x04\x0e\xf2\xc7\xf1\x77\x6e\x9e" + + "\x5c\x31\x5c\x24\x81\x69\xd5\x8b\x7c\x26\x42\xf1\x68\x4a\x34\xb8\x2b\x33\x97\x96\x4a\xf6\xdc\x11\x19\xc2\x07\xe8" + + "\x4f\xe9\x45\xed\x11\x38\x02\x11\x3b\xdf\x14\xda\xed\xdb\x76\xb5\x1c\xba\xff\x1e\xe1\x48\x8f\x49\x53\x11\x3a\x1f" + + "\xaf\x22\x47\x72\x09\xdc\xa4\xa2\x1a\xf3\x94\xb2\x63\xda\x7d\x37\x4d\x10\x28\xaf\xa6\xac\x8f\x11\x8b\xc0\xbe\x6a" + + "\x1b\x4a\xd1\xc4\x6e\x7b\xc7\x30\xec\x41\xe4\x69\x1e\xf7\x11\x53\x54\x4a\x88\x87\x68\xde\x46\x1d\x16\x7c\x24\x3c" + + "\x7b\x13\x24\x35\x4a\xaf\xe8\xd5\x0c\x33\x6b\xbf\xab\xeb\x33\x4b\xd1\x1e\x41\x0e\xe0\xa3\x02\x9f\xfd\x62\x4e\xce" + + "\x8a\x56\x9d\xac\x4f\xa7\x6a\xd1\xb6\x2b\x3b\x9d\x4c\x4e\xd6\xa7\x76\x7c\x01\x2f\xc6\x75\x73\x3a\xb1\x8b\xfa\xe2" + + "\xb7\x93\xf5\xe9\x78\x76\x5a\x1c\x16\xf9\xc1\xe3\x6f\xf6\xbe\xfe\x12\xbe\x3e\x35\xed\x73\xba\x4c\xdf\xb5\x57\xa5" + + "\xf1\x21\x7e\x2b\xd3\xcc\xc0\xec\xe8\xee\x5b\xaf\x37\x45\x48\x50\xea\xe0\xe4\xa4\x6e\xdb\x7a\x39\x01\xfd\x29\xd4" + + "\x26\xf9\x4d\xaf\xe2\x9e\x59\xab\x96\x75\xbe\x2e\x0d\xa5\xbe\xe0\xbc\x17\x74\x13\xe2\x3b\x88\x99\x01\xe6\x75\xe6" + + "\x93\x43\x14\xad\xc2\x0c\x53\x29\x4e\x1c\xa1\xc2\xa1\xba\x22\x45\x79\x13\xe7\x26\x90\x1b\x98\x48\xbf\xd3\x0e\x94" + + "\xce\xf3\xbf\x9b\xd6\x3d\x7d\x3d\x0f\x71\x68\xab\xe2\xd2\x94\x91\xc6\x29\x3d\x13\x9e\xf3\x88\xbc\x41\x3a\x4f\xb7" + + "\xfc\x93\x03\x12\xbf\xa5\x38\x28\x51\x25\x8b\x39\x15\x48\x67\x5e\x9f\x9a\x91\x9a\xb3\x6e\xb6\xad\x69\xba\xa2\x33" + + "\xd4\x54\xeb\x65\x55\x57\xab\x4b\x4e\x7e\x13\xfa\x11\x87\xe6\xf2\x19\x15\x8a\x0a\x3f\x19\x3b\x2a\x5b\x5d\x66\x3e" + + "\x9e\x96\xeb\x90\x7b\x7a\xfb\x1e\x9c\x06\x6f\xda\x0e\xe4\xb1\xa8\x2a\xd3\x20\xd4\xcf\x08\x7f\xc0\x2d\x3d\x52\x0b" + + "\x7a\x76\x81\x3f\xeb\x75\xcb\xe5\x10\x78\xc8\xfd\x46\xec\xa0\x4d\x84\x14\x4b\x4f\x55\x86\x55\x65\x23\x05\xe5\xa7" + + "\x2a\x83\x3a\x13\xaa\x49\xe0\x07\x1d\x84\x3f\xae\x6d\xa5\x73\xc7\x01\x4e\x55\x06\xbd\x64\xbc\x93\x11\x63\x6d\x91" + + "\xd5\x43\x65\xd9\x54\x65\xd0\x3b\x0f\x89\x12\xb5\x43\x0a\x53\x48\x33\x88\xcf\x29\xe0\x9b\x23\x72\xf1\x06\x77\x0c" + + "\x29\x70\xcb\x6e\x1f\x8b\xc1\x8f\xc4\xc8\xb7\x83\x65\xc7\xd1\x6c\x5f\x57\x4c\xb5\xb1\xbe\x14\x6c\x04\x74\xac\x0b" + + "\x5d\x54\x84\x32\xd4\x91\xf4\xe1\x6a\x96\x9d\x15\xc6\x76\xea\xe2\xfd\xd8\x66\x4e\xb4\x11\xb0\x8f\x9d\xc8\x9b\x7c" + + "\xcb\x3d\x01\xb2\x0e\x9c\xc9\xf5\xb5\x07\x21\xa1\x27\x87\xcc\xc0\x80\x1f\x17\x72\x6e\x21\x31\xe4\xa7\xdd\x3a\xb8" + + "\x0c\x49\xc2\x62\xd2\x0f\x78\xc7\x96\x58\x6b\x95\x28\xbe\xa3\x08\x89\x67\x90\x4c\xee\xc9\xe4\xeb\xc9\xe3\xbd\xfd" + + "\xc7\xe8\x32\x01\x66\x2f\x88\x52\x52\x45\xc5\x3c\x3a\x1a\x4d\xd0\x2d\xf4\x4d\x7d\xe2\xb8\x9d\x77\x7a\xae\x9b\x62" + + "\xa4\x4e\xd6\x6d\xc8\x75\x47\xc7\x16\x3c\x76\xb4\xba\x58\xd4\xa5\x51\x65\xdd\x3a\xf2\x35\xd3\x95\xca\xeb\xb1\x7a" + + "\x67\x8c\x5a\xa1\x21\x06\x03\x44\x74\x8b\x0d\xff\xfc\xd3\xf7\x50\x7f\x5e\xd8\xd9\x1a\xcc\x45\xd3\x50\x25\x13\xef" + + "\xd3\xa2\x5d\xac\x4f\xc6\xb3\x7a\x39\x41\x30\x11\xfe\xc7\x55\x39\xf9\xcb\x57\x5f\xd2\x27\x12\x8b\x6b\x93\xc9\xe1" + + "\x48\x65\x28\xcb\xfa\xcd\x7c\xdc\x13\xff\xe6\x44\x15\xfe\x10\x0f\xac\x82\xd4\x3c\x48\xd7\x83\x1f\x76\x8f\x1d\x21" + + "\xcc\x75\xd0\xbb\x6c\xd0\x94\x90\x19\x0d\x55\xaf\x78\x6f\x1f\xc1\x39\x98\xe0\xd1\x38\x06\x78\x11\x20\x72\xdd\xe7" + + "\x38\x8a\xf8\xf9\x28\xd4\x7a\xb1\x28\x66\x0b\x88\xb4\x2c\xac\x3a\x05\xd2\xc4\xa9\x77\x79\x9e\xde\xe8\x76\x31\x5e" + + "\xea\x4b\x1f\x1d\x06\x5d\x3d\xa9\xf3\xab\x23\x70\xe1\xa9\xcb\x32\x4c\xd2\xc8\xcd\x47\xdf\xf3\xbe\x8f\x6b\xe2\xc6" + + "\xd2\x8f\x3b\xcf\xf9\x63\x7c\x9d\x2e\x0c\xbd\xed\x04\x28\x06\x80\x86\x75\x1a\x47\x71\x18\x66\xc0\xad\x61\xb2\x74" + + "\x7c\xcf\x92\xf8\x33\xe2\xed\x08\xe1\x69\xeb\x16\x14\x55\xf3\xba\x99\x81\xbf\xab\xd7\x17\xc7\x1a\x3d\x21\x9b\xe0" + + "\xc1\x44\xf2\x90\x64\x6c\x7b\x77\x67\xe3\x71\xad\x60\xf9\xe8\x39\xf0\xbe\x7a\x76\xb2\xa7\x97\x81\xd2\x1d\x32\x15" + + "\x9a\x46\x60\xc2\xfc\x5e\x72\x57\x24\x34\xa5\x17\xd7\xfb\x85\x51\xd5\x7a\x79\x62\xdc\x66\x0b\x5a\x12\xd2\xc4\x05" + + "\x8f\x27\xc8\xc1\x1a\xf4\x28\xe8\x70\x1c\x78\x30\x5b\xfc\x6e\xba\x2e\x8f\x52\xfa\x4a\x0c\x86\xe1\x53\x5d\xe5\xef" + + "\x24\x46\x24\x3c\xcb\xf3\x6f\xd9\x73\xcf\x77\xf5\x27\x73\x5a\xd8\xd6\x34\x88\x8e\xe6\x76\x49\xae\x9e\xbd\x79\xe1" + + "\x39\x26\x0b\xa9\x1a\x08\x6e\xc9\x11\x9f\x13\xc8\x74\x3e\xd3\xad\xa9\x82\xa3\x32\x80\xf3\x40\x7d\xf3\xa2\x84\xec" + + "\xf1\xba\x85\x60\xb5\xb5\x75\x1c\x99\x9b\xc2\x91\xdf\x0f\xe7\x85\xc6\xac\xb4\x2b\x74\xb9\xa4\xba\x8a\xba\xf2\x81" + + "\x35\x0b\x8d\xcc\x9e\x9b\xff\xc6\xb6\xba\xca\x9d\x94\x5d\x57\x57\xcb\x7a\x6d\x45\xff\xec\x58\x3d\x13\x9d\x2e\xac" + + "\xb2\x7a\x0e\xd4\xb0\xca\xd5\xb2\xb6\xad\x6a\xea\x93\xb5\xc5\xca\x20\x83\x78\xad\x1a\x1a\xf1\x58\x41\xee\x5a\x30" + + "\xbb\x11\xa2\x52\x61\x31\x67\x22\x6b\xa5\x42\x43\xd0\x88\xc5\xc0\xec\xc9\x44\xe5\xa6\x29\xce\x1d\xab\xda\x40\xfc" + + "\x3c\xbf\x1f\x41\xbb\x34\x59\x00\x17\xd7\x2c\x01\x3d\x22\x37\x65\x71\x6e\x1a\x4a\xc7\xa8\x4a\x6e\xd8\x4f\x19\x66" + + "\xc8\x57\x2f\x6a\x24\xe2\xe4\x8e\xea\x88\x0c\x7b\x72\x12\x1e\xb8\x4f\xf2\x08\x68\x53\xa2\x83\x17\x1a\x02\x1e\x27" + + "\x13\xb2\x5e\x95\x0a\x72\x76\xce\xcb\x62\x06\x41\xe1\x8b\x02\x90\x97\x0a\xab\xce\x4d\x03\x5e\x04\xf5\x9c\xba\x3a" + + "\x02\xe7\x4a\x77\x61\x5d\xd4\xcd\xd9\x98\x76\xc6\x0f\x75\x4b\x2a\x33\x77\x9d\x2c\xf5\x65\xb1\x5c\x2f\x95\xe3\x61" + + "\xf5\x49\x51\x16\xed\xd5\x48\x95\xc5\x49\xa3\x9b\x82\x17\x5c\x37\x06\x16\x98\x26\x00\x41\x3b\x68\xbe\x66\xa5\x06" + + "\x07\x55\xb3\xb4\xa6\x3c\x37\x16\x83\x04\x79\x45\x69\x35\x71\xfe\xd0\xe5\x81\x22\x49\x94\xe6\x91\xc3\x88\x51\x8a" + + "\x79\xf3\x02\x5c\xb4\x90\x14\x43\x3e\xf8\xaa\x1d\x8b\x79\xd7\x51\xa0\xd9\x18\x22\xd6\x97\x75\xe3\x58\xc9\xb9\x5b" + + "\x12\x34\x19\x5b\x83\xf3\xdf\x77\x29\x36\x27\xeb\xe6\xcc\x4c\x1c\x35\x2b\x1a\xf3\xd1\x4e\x2e\x8a\xb3\x62\xf2\xf3" + + "\x2a\x87\x05\xd9\x65\x6f\xdf\x5d\x3f\x03\x0f\x5c\x81\x5d\x37\x22\x37\x7d\x52\xa7\x8d\xdb\x9f\xb4\x93\x74\x94\xc1" + + "\x7b\x0b\x5f\x8c\xf5\x92\x79\x7a\x7c\x30\x50\x19\x6e\xc7\x6c\x04\x4e\x6c\xb7\x42\x3f\x3d\x8d\xc0\x3e\xbc\xc3\x00" + + "\x3a\x08\xbd\xd1\x2b\x70\x3f\xf5\x33\x43\x59\x59\xeb\xb9\xf7\x4a\x75\xec\xc6\x6f\xf4\xda\x3b\x17\xd0\xae\x60\x3f" + + "\x23\x5f\x8d\xdb\x86\x9f\x6d\xac\xe5\xb3\x50\xc1\x67\x92\x1a\x89\x6d\x18\xf9\x70\x1a\xb3\x92\x6e\x6e\xfc\x29\x4c" + + "\x14\xf5\x88\x46\x1c\x5e\xa9\xdf\x3e\x0b\xfe\x1c\xf0\x19\x54\xf3\xf0\x61\xdc\xf5\xcd\x75\xf8\xa1\xfe\x26\xe6\xaf" + + "\xeb\x44\xe8\x29\x2a\x38\xe5\xac\x6a\xeb\x49\xa0\xdb\xa0\x9f\xa9\x02\xb0\x52\xe6\x05\xf8\x79\x80\x89\xbe\x08\x5b" + + "\x73\xf0\xe0\x2f\xfb\x7b\x8f\x1f\xcc\xea\xa5\x23\xea\xd3\xfd\xbd\xd1\x27\xf2\x5d\x4f\x9e\xfc\x65\x08\xb5\xb8\x46" + + "\x9e\x03\x96\xf9\x3f\xde\xc1\xe9\x3b\x69\xea\x0b\x6b\x1a\x65\x96\xeb\x52\xb7\x75\x63\xd5\xe0\xc1\xfe\x17\x4f\xbe" + + "\xfa\x6a\x18\xef\xb5\xaa\xc6\xb4\x04\x30\x01\x3d\xd6\x92\x74\x16\xc4\xcc\x86\x81\x87\x9d\x94\xce\x89\xbb\xe5\xdc" + + "\x66\xfb\xff\x03\x00\x00\xff\xff\x1d\x30\x27\xdd\x1d\xea\x03\x00") func gzipBindataAssetsJsJquery211js() (*gzipAsset, error) { bytes := _gzipBindataAssetsJsJquery211js info := gzipBindataFileInfo{ - name: "assets/js/jquery-2.1.1.js", - size: 256541, + name: "assets/js/jquery-2.1.1.js", + size: 256541, md5checksum: "", - mode: os.FileMode(511), - modTime: time.Unix(1521004692, 0), + mode: os.FileMode(511), + modTime: time.Unix(1521004692, 0), } a := &gzipAsset{bytes: bytes, info: info} @@ -3649,8 +3647,6 @@ func gzipBindataAssetsJsJquery211js() (*gzipAsset, error) { return a, nil } - - // GzipAsset loads and returns the asset for the given name. // It returns an error if the asset could not be found or // could not be loaded. @@ -3711,7 +3707,6 @@ var _gzipbindata = map[string]func() (*gzipAsset, error){ "assets/js/jquery-2.1.1.js": gzipBindataAssetsJsJquery211js, } - // GzipAssetDir returns the file names below a certain // directory embedded in the file by bindata. // For example if you run bindata on data/... and data contains the @@ -3734,18 +3729,18 @@ func GzipAssetDir(name string) ([]string, error) { node = node.Children[p] if node == nil { return nil, &os.PathError{ - Op: "open", + Op: "open", Path: name, - Err: os.ErrNotExist, + Err: os.ErrNotExist, } } } } if node.Func != nil { return nil, &os.PathError{ - Op: "open", + Op: "open", Path: name, - Err: os.ErrNotExist, + Err: os.ErrNotExist, } } rv := make([]string, 0, len(node.Children)) @@ -3755,7 +3750,6 @@ func GzipAssetDir(name string) ([]string, error) { return rv, nil } - type gzipBintree struct { Func func() (*gzipAsset, error) Children map[string]*gzipBintree diff --git a/_examples/tutorial/url-shortener/README.md b/_examples/tutorial/url-shortener/README.md new file mode 100644 index 00000000..b6098c25 --- /dev/null +++ b/_examples/tutorial/url-shortener/README.md @@ -0,0 +1,3 @@ +## A URL Shortener Service using Go, Iris and Bolt + +Hackernoon Article: https://hackernoon.com/a-url-shortener-service-using-go-iris-and-bolt-4182f0b00ae7 \ No newline at end of file diff --git a/_examples/tutorial/url-shortener/factory.go b/_examples/tutorial/url-shortener/factory.go index 9df9ae95..66d6b408 100644 --- a/_examples/tutorial/url-shortener/factory.go +++ b/_examples/tutorial/url-shortener/factory.go @@ -3,7 +3,7 @@ package main import ( "net/url" - "github.com/satori/go.uuid" + "github.com/iris-contrib/go.uuid" ) // Generator the type to generate keys(short urls) diff --git a/_examples/tutorial/url-shortener/main.go b/_examples/tutorial/url-shortener/main.go index 7fa91123..1771f766 100644 --- a/_examples/tutorial/url-shortener/main.go +++ b/_examples/tutorial/url-shortener/main.go @@ -3,7 +3,7 @@ // Article: https://medium.com/@kataras/a-url-shortener-service-using-go-iris-and-bolt-4182f0b00ae7 // // $ go get github.com/etcd-io/bbolt -// $ go get github.com/satori/go.uuid +// $ go get github.com/iris-contrib/go.uuid // $ cd $GOPATH/src/github.com/kataras/iris/_examples/tutorial/url-shortener // $ go build // $ ./url-shortener diff --git a/_examples/tutorial/vuejs-todo-mvc/README.md b/_examples/tutorial/vuejs-todo-mvc/README.md index b856373b..9e0e582a 100644 --- a/_examples/tutorial/vuejs-todo-mvc/README.md +++ b/_examples/tutorial/vuejs-todo-mvc/README.md @@ -1,5 +1,7 @@ # A Todo MVC Application using Iris and Vue.js +## Hackernoon Article: https://twitter.com/vuejsdevelopers/status/954805901789224960 + Vue.js is a front-end framework for building web applications using javascript. It has a blazing fast Virtual DOM renderer. Iris is a back-end framework for building web applications using The Go Programming Language (disclaimer: author here). It's one of the fastest and featured web frameworks out there. We wanna use this to serve our "todo service". From 2cdbe17bd5e7c59af509bf419daaccbe73751f48 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 2 Feb 2019 04:49:58 +0200 Subject: [PATCH 008/418] add Context#ResetRequest and core/handlerconv.FromStdWithNext updates the request for any incoming request changes - https://github.com/kataras/iris/issues/1180 Former-commit-id: 764bf26bcaa3b7bdae0a2bdbf3bf2b6f8c5c546e --- context/context.go | 27 +++++++++++++++++++++++++++ core/handlerconv/from_std.go | 1 + core/handlerconv/from_std_test.go | 6 ++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/context/context.go b/context/context.go index 7fa1a95e..fced0607 100644 --- a/context/context.go +++ b/context/context.go @@ -114,6 +114,18 @@ type Context interface { // Request returns the original *http.Request, as expected. Request() *http.Request + // ResetRequest sets the Context's Request, + // It is useful to store the new request created by a std *http.Request#WithContext() into Iris' Context. + // Use `ResetRequest` when for some reason you want to make a full + // override of the *http.Request. + // Note that: when you just want to change one of each fields you can use the Request() which returns a pointer to Request, + // so the changes will have affect without a full override. + // Usage: you use a native http handler which uses the standard "context" package + // to get values instead of the Iris' Context#Values(): + // r := c.Request() + // stdCtx := context.WithValue(r.Context(), key, val) + // ctx.ResetRequest(r.WithContext(stdCtx)). + ResetRequest(r *http.Request) // SetCurrentRouteName sets the route's name internally, // in order to be able to find the correct current "read-only" Route when @@ -1068,6 +1080,21 @@ func (ctx *context) Request() *http.Request { return ctx.request } +// ResetRequest sets the Context's Request, +// It is useful to store the new request created by a std *http.Request#WithContext() into Iris' Context. +// Use `ResetRequest` when for some reason you want to make a full +// override of the *http.Request. +// Note that: when you just want to change one of each fields you can use the Request() which returns a pointer to Request, +// so the changes will have affect without a full override. +// Usage: you use a native http handler which uses the standard "context" package +// to get values instead of the Iris' Context#Values(): +// r := c.Request() +// stdCtx := context.WithValue(r.Context(), key, val) +// ctx.ResetRequest(r.WithContext(stdCtx)). +func (ctx *context) ResetRequest(r *http.Request) { + ctx.request = r +} + // SetCurrentRouteName sets the route's name internally, // in order to be able to find the correct current "read-only" Route when // end-developer calls the `GetCurrentRoute()` function. diff --git a/core/handlerconv/from_std.go b/core/handlerconv/from_std.go index 98c22deb..255bcaa9 100644 --- a/core/handlerconv/from_std.go +++ b/core/handlerconv/from_std.go @@ -75,6 +75,7 @@ func FromStd(handler interface{}) context.Handler { func FromStdWithNext(h func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc)) context.Handler { return func(ctx context.Context) { next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx.ResetRequest(r) ctx.Next() }) diff --git a/core/handlerconv/from_std_test.go b/core/handlerconv/from_std_test.go index 17f5adcb..49bb7938 100644 --- a/core/handlerconv/from_std_test.go +++ b/core/handlerconv/from_std_test.go @@ -2,6 +2,7 @@ package handlerconv_test import ( + stdContext "context" "net/http" "testing" @@ -42,7 +43,8 @@ func TestFromStdWithNext(t *testing.T) { stdWNext := func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { if username, password, ok := r.BasicAuth(); ok && username == basicauth && password == basicauth { - next.ServeHTTP(w, r) + ctx := stdContext.WithValue(r.Context(), "key", "ok") + next.ServeHTTP(w, r.WithContext(ctx)) return } w.WriteHeader(iris.StatusForbidden) @@ -50,7 +52,7 @@ func TestFromStdWithNext(t *testing.T) { h := handlerconv.FromStdWithNext(stdWNext) next := func(ctx context.Context) { - ctx.WriteString(passed) + ctx.WriteString(ctx.Request().Context().Value("key").(string)) } app := iris.New() From d30f17eb3fa0e4572848780d488bbe80145ded1f Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 2 Feb 2019 04:56:32 +0200 Subject: [PATCH 009/418] minor Former-commit-id: eca4c3d2962cc4e0b6108144a7b59f2519b531da --- context/context.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/context/context.go b/context/context.go index fced0607..fd751eb2 100644 --- a/context/context.go +++ b/context/context.go @@ -122,7 +122,7 @@ type Context interface { // so the changes will have affect without a full override. // Usage: you use a native http handler which uses the standard "context" package // to get values instead of the Iris' Context#Values(): - // r := c.Request() + // r := ctx.Request() // stdCtx := context.WithValue(r.Context(), key, val) // ctx.ResetRequest(r.WithContext(stdCtx)). ResetRequest(r *http.Request) @@ -1088,7 +1088,7 @@ func (ctx *context) Request() *http.Request { // so the changes will have affect without a full override. // Usage: you use a native http handler which uses the standard "context" package // to get values instead of the Iris' Context#Values(): -// r := c.Request() +// r := ctx.Request() // stdCtx := context.WithValue(r.Context(), key, val) // ctx.ResetRequest(r.WithContext(stdCtx)). func (ctx *context) ResetRequest(r *http.Request) { From 280872fd59253f1a033e073e67fc0053068a899e Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 9 Feb 2019 04:28:00 +0200 Subject: [PATCH 010/418] add iris websocket client side for Go and a simple chat example Former-commit-id: af1c555b6b092a3d0484fee2e200fd8767d7239e --- _examples/README.md | 3 + _examples/README_ZH.md | 3 + _examples/websocket/custom-go-client/main.go | 2 +- _examples/websocket/go-client/client/main.go | 58 +++ _examples/websocket/go-client/server/main.go | 32 ++ websocket/client.go | 427 +++++++++---------- websocket/client.js.go | 233 ++++++++++ websocket/client.ts | 2 +- websocket/connection.go | 2 +- 9 files changed, 536 insertions(+), 226 deletions(-) create mode 100644 _examples/websocket/go-client/client/main.go create mode 100644 _examples/websocket/go-client/server/main.go create mode 100644 websocket/client.js.go diff --git a/_examples/README.md b/_examples/README.md index 38a3faa2..17ce3df0 100644 --- a/_examples/README.md +++ b/_examples/README.md @@ -478,6 +478,9 @@ iris websocket library lives on its own [package](https://github.com/kataras/iri The package is designed to work with raw websockets although its API is similar to the famous [socket.io](https://socket.io). I have read an article recently and I felt very contented about my decision to design a **fast** websocket-**only** package for Iris and not a backwards socket.io-like package. You can read that article by following this link: https://medium.com/@ivanderbyl/why-you-don-t-need-socket-io-6848f1c871cd. - [Chat](websocket/chat/main.go) +- [Chat with Iris Go Client Side](websocket/go-client) **NEW** + * [Server](websocket/go-client/server/main.go) + * [Client](websocket/go-client/client/main.go) - [Native Messages](websocket/native-messages/main.go) - [Connection List](websocket/connectionlist/main.go) - [TLS Enabled](websocket/secure/main.go) diff --git a/_examples/README_ZH.md b/_examples/README_ZH.md index 53e2a755..cae15a08 100644 --- a/_examples/README_ZH.md +++ b/_examples/README_ZH.md @@ -431,6 +431,9 @@ iris websocket库依赖于它自己的[包](https://github.com/kataras/iris/tree 决定给iris设计一个**快速的**websocket**限定**包并且不是一个向后传递类socket.io的包。你可以阅读这个链接里的文章https://medium.com/@ivanderbyl/why-you-don-t-need-socket-io-6848f1c871cd。 - [聊天](websocket/chat/main.go) +- [Chat with Iris Go Client Side](websocket/go-client) **NEW** + * [Server](websocket/go-client/server/main.go) + * [Client](websocket/go-client/client/main.go) - [原生消息](websocket/native-messages/main.go) - [连接列表](websocket/connectionlist/main.go) - [TLS支持](websocket/secure/main.go) diff --git a/_examples/websocket/custom-go-client/main.go b/_examples/websocket/custom-go-client/main.go index 32ff53db..7dba7e16 100644 --- a/_examples/websocket/custom-go-client/main.go +++ b/_examples/websocket/custom-go-client/main.go @@ -87,7 +87,7 @@ func SendMessage(serverID, to, method, message string) error { // SendtBytes broadcast a message to server func SendtBytes(serverID, to, method string, message []byte) error { - // look https://github.com/kataras/iris/blob/master/websocket/message.go , client.go and client.js + // look https://github.com/kataras/iris/blob/master/websocket/message.go , client.js.go and client.js // to understand the buffer line: buffer := []byte(fmt.Sprintf("%s%v;0;%v;%v;", websocket.DefaultEvtMessageKey, method, serverID, to)) buffer = append(buffer, message...) diff --git a/_examples/websocket/go-client/client/main.go b/_examples/websocket/go-client/client/main.go new file mode 100644 index 00000000..6a36b6a2 --- /dev/null +++ b/_examples/websocket/go-client/client/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "bufio" + "fmt" + "os" + + "github.com/kataras/iris/websocket" +) + +const ( + url = "ws://localhost:8080/socket" + prompt = ">> " +) + +/* +How to run: +Start the server, if it is not already started by executing `go run ../server/main.go` +And open two or more terminal windows and start the clients: +$ go run main.go +>> hi! +*/ +func main() { + conn, err := websocket.Dial(url, websocket.DefaultEvtMessageKey) + if err != nil { + panic(err) + } + + conn.OnError(func(err error) { + fmt.Printf("error: %v", err) + }) + + conn.OnDisconnect(func() { + fmt.Println("Server was force-closed[see ../server/main.go#L19] this connection after 20 seconds, therefore I am disconnected.") + os.Exit(0) + }) + + conn.On("chat", func(message string) { + fmt.Printf("\n%s\n", message) + }) + + fmt.Println("Start by typing a message to send") + scanner := bufio.NewScanner(os.Stdin) + for { + fmt.Print(prompt) + if !scanner.Scan() || scanner.Err() != nil { + break + } + msgToSend := scanner.Text() + if msgToSend == "exit" { + break + } + + conn.Emit("chat", msgToSend) + } + + fmt.Println("Terminated.") +} diff --git a/_examples/websocket/go-client/server/main.go b/_examples/websocket/go-client/server/main.go new file mode 100644 index 00000000..34e880d9 --- /dev/null +++ b/_examples/websocket/go-client/server/main.go @@ -0,0 +1,32 @@ +package main + +import ( + "fmt" + "time" + + "github.com/kataras/iris" + "github.com/kataras/iris/websocket" +) + +func main() { + app := iris.New() + ws := websocket.New(websocket.Config{}) + app.Get("/socket", ws.Handler()) + + ws.OnConnection(func(c websocket.Connection) { + go func() { + <-time.After(20 * time.Second) + c.Disconnect() + }() + + c.On("chat", func(message string) { + c.To(websocket.Broadcast).Emit("chat", c.ID()+": "+message) + }) + + c.OnDisconnect(func() { + fmt.Printf("Connection with ID: %s has been disconnected!\n", c.ID()) + }) + }) + + app.Run(iris.Addr(":8080")) +} diff --git a/websocket/client.go b/websocket/client.go index 2144411a..2220e07d 100644 --- a/websocket/client.go +++ b/websocket/client.go @@ -1,233 +1,214 @@ package websocket import ( - "time" + "bytes" + "strconv" + "strings" + "sync" + "sync/atomic" - "github.com/kataras/iris/context" + "github.com/gorilla/websocket" ) -// ClientHandler is the handler which serves the javascript client-side -// library. It uses a small cache based on the iris/context.WriteWithExpiration. -func ClientHandler() context.Handler { - modNow := time.Now() - return func(ctx context.Context) { - ctx.ContentType("application/javascript") - if _, err := ctx.WriteWithExpiration(ClientSource, modNow); err != nil { - ctx.StatusCode(500) - ctx.StopExecution() - // ctx.Application().Logger().Infof("error while serving []byte via StaticContent: %s", err.Error()) +// Dial opens a new client connection to a WebSocket. +func Dial(url, evtMessagePrefix string) (ws *ClientConn, err error) { + if !strings.HasPrefix(url, "ws://") { + url = "ws://" + url + } + + conn, _, err := websocket.DefaultDialer.Dial(url, nil) + if err != nil { + return nil, err + } + + return NewClientConn(conn, evtMessagePrefix), nil +} + +type ClientConn struct { + underline UnderlineConnection // TODO make it using gorilla's one, because the 'startReader' will not know when to stop otherwise, we have a fixed length currently... + messageType int + serializer *messageSerializer + + onErrorListeners []ErrorFunc + onDisconnectListeners []DisconnectFunc + onNativeMessageListeners []NativeMessageFunc + onEventListeners map[string][]MessageFunc + + writerMu sync.Mutex + + disconnected uint32 +} + +func NewClientConn(conn UnderlineConnection, evtMessagePrefix string) *ClientConn { + if evtMessagePrefix == "" { + evtMessagePrefix = DefaultEvtMessageKey + } + + c := &ClientConn{ + underline: conn, + serializer: newMessageSerializer([]byte(evtMessagePrefix)), + + onErrorListeners: make([]ErrorFunc, 0), + onDisconnectListeners: make([]DisconnectFunc, 0), + onNativeMessageListeners: make([]NativeMessageFunc, 0), + onEventListeners: make(map[string][]MessageFunc, 0), + } + + c.SetBinaryMessages(false) + + go c.startReader() + + return c +} + +func (c *ClientConn) SetBinaryMessages(binaryMessages bool) { + if binaryMessages { + c.messageType = websocket.BinaryMessage + } else { + c.messageType = websocket.TextMessage + } +} + +func (c *ClientConn) startReader() { + defer c.Disconnect() + + for { + _, data, err := c.underline.ReadMessage() + if err != nil { + if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { + c.FireOnError(err) + } + + break + } else { + c.messageReceived(data) } } } -// ClientSource the client-side javascript raw source code. -var ClientSource = []byte(`var websocketStringMessageType = 0; -var websocketIntMessageType = 1; -var websocketBoolMessageType = 2; -var websocketJSONMessageType = 4; -var websocketMessagePrefix = "` + DefaultEvtMessageKey + `"; -var websocketMessageSeparator = ";"; -var websocketMessagePrefixLen = websocketMessagePrefix.length; -var websocketMessageSeparatorLen = websocketMessageSeparator.length; -var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; -var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; -var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; -var Ws = (function () { - // - function Ws(endpoint, protocols) { - var _this = this; - // events listeners - this.connectListeners = []; - this.disconnectListeners = []; - this.nativeMessageListeners = []; - this.messageListeners = {}; - if (!window["WebSocket"]) { - return; - } - if (endpoint.indexOf("ws") == -1) { - endpoint = "ws://" + endpoint; - } - if (protocols != null && protocols.length > 0) { - this.conn = new WebSocket(endpoint, protocols); - } - else { - this.conn = new WebSocket(endpoint); - } - this.conn.onopen = (function (evt) { - _this.fireConnect(); - _this.isReady = true; - return null; - }); - this.conn.onclose = (function (evt) { - _this.fireDisconnect(); - return null; - }); - this.conn.onmessage = (function (evt) { - _this.messageReceivedFromConn(evt); - }); - } - //utils - Ws.prototype.isNumber = function (obj) { - return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; - }; - Ws.prototype.isString = function (obj) { - return Object.prototype.toString.call(obj) == "[object String]"; - }; - Ws.prototype.isBoolean = function (obj) { - return typeof obj === 'boolean' || - (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); - }; - Ws.prototype.isJSON = function (obj) { - return typeof obj === 'object'; - }; - // - // messages - Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { - return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; - }; - Ws.prototype.encodeMessage = function (event, data) { - var m = ""; - var t = 0; - if (this.isNumber(data)) { - t = websocketIntMessageType; - m = data.toString(); - } - else if (this.isBoolean(data)) { - t = websocketBoolMessageType; - m = data.toString(); - } - else if (this.isString(data)) { - t = websocketStringMessageType; - m = data.toString(); - } - else if (this.isJSON(data)) { - //propably json-object - t = websocketJSONMessageType; - m = JSON.stringify(data); - } - else if (data !== null && typeof(data) !== "undefined" ) { - // if it has a second parameter but it's not a type we know, then fire this: - console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); - } - return this._msg(event, t, m); - }; - Ws.prototype.decodeMessage = function (event, websocketMessage) { - //iris-websocket-message;user;4;themarshaledstringfromajsonstruct - var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; - if (websocketMessage.length < skipLen + 1) { - return null; - } - var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); - var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); - if (websocketMessageType == websocketIntMessageType) { - return parseInt(theMessage); - } - else if (websocketMessageType == websocketBoolMessageType) { - return Boolean(theMessage); - } - else if (websocketMessageType == websocketStringMessageType) { - return theMessage; - } - else if (websocketMessageType == websocketJSONMessageType) { - return JSON.parse(theMessage); - } - else { - return null; // invalid - } - }; - Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { - if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { - return ""; - } - var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); - var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); - return evt; - }; - Ws.prototype.getCustomMessage = function (event, websocketMessage) { - var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); - var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); - return s; - }; - // - // Ws Events - // messageReceivedFromConn this is the func which decides - // if it's a native websocket message or a custom qws message - // if native message then calls the fireNativeMessage - // else calls the fireMessage - // - // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. - Ws.prototype.messageReceivedFromConn = function (evt) { - //check if qws message - var message = evt.data; - if (message.indexOf(websocketMessagePrefix) != -1) { - var event_1 = this.getWebsocketCustomEvent(message); - if (event_1 != "") { - // it's a custom message - this.fireMessage(event_1, this.getCustomMessage(event_1, message)); - return; - } - } - // it's a native websocket message - this.fireNativeMessage(message); - }; - Ws.prototype.OnConnect = function (fn) { - if (this.isReady) { - fn(); - } - this.connectListeners.push(fn); - }; - Ws.prototype.fireConnect = function () { - for (var i = 0; i < this.connectListeners.length; i++) { - this.connectListeners[i](); - } - }; - Ws.prototype.OnDisconnect = function (fn) { - this.disconnectListeners.push(fn); - }; - Ws.prototype.fireDisconnect = function () { - for (var i = 0; i < this.disconnectListeners.length; i++) { - this.disconnectListeners[i](); - } - }; - Ws.prototype.OnMessage = function (cb) { - this.nativeMessageListeners.push(cb); - }; - Ws.prototype.fireNativeMessage = function (websocketMessage) { - for (var i = 0; i < this.nativeMessageListeners.length; i++) { - this.nativeMessageListeners[i](websocketMessage); - } - }; - Ws.prototype.On = function (event, cb) { - if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { - this.messageListeners[event] = []; - } - this.messageListeners[event].push(cb); - }; - Ws.prototype.fireMessage = function (event, message) { - for (var key in this.messageListeners) { - if (this.messageListeners.hasOwnProperty(key)) { - if (key == event) { - for (var i = 0; i < this.messageListeners[key].length; i++) { - this.messageListeners[key][i](message); - } - } - } - } - }; - // - // Ws Actions - Ws.prototype.Disconnect = function () { - this.conn.close(); - }; - // EmitMessage sends a native websocket message - Ws.prototype.EmitMessage = function (websocketMessage) { - this.conn.send(websocketMessage); - }; - // Emit sends an iris-custom websocket message - Ws.prototype.Emit = function (event, data) { - var messageStr = this.encodeMessage(event, data); - this.EmitMessage(messageStr); - }; - return Ws; -}()); -`) +func (c *ClientConn) messageReceived(data []byte) error { + if bytes.HasPrefix(data, c.serializer.prefix) { + // is a custom iris message. + receivedEvt := c.serializer.getWebsocketCustomEvent(data) + listeners, ok := c.onEventListeners[string(receivedEvt)] + if !ok || len(listeners) == 0 { + return nil // if not listeners for this event exit from here + } + + customMessage, err := c.serializer.deserialize(receivedEvt, data) + if customMessage == nil || err != nil { + return err + } + + for i := range listeners { + if fn, ok := listeners[i].(func()); ok { // its a simple func(){} callback + fn() + } else if fnString, ok := listeners[i].(func(string)); ok { + + if msgString, is := customMessage.(string); is { + fnString(msgString) + } else if msgInt, is := customMessage.(int); is { + // here if server side waiting for string but client side sent an int, just convert this int to a string + fnString(strconv.Itoa(msgInt)) + } + + } else if fnInt, ok := listeners[i].(func(int)); ok { + fnInt(customMessage.(int)) + } else if fnBool, ok := listeners[i].(func(bool)); ok { + fnBool(customMessage.(bool)) + } else if fnBytes, ok := listeners[i].(func([]byte)); ok { + fnBytes(customMessage.([]byte)) + } else { + listeners[i].(func(interface{}))(customMessage) + } + + } + } else { + // it's native websocket message + for i := range c.onNativeMessageListeners { + c.onNativeMessageListeners[i](data) + } + } + + return nil +} + +func (c *ClientConn) OnMessage(cb NativeMessageFunc) { + c.onNativeMessageListeners = append(c.onNativeMessageListeners, cb) +} + +func (c *ClientConn) On(event string, cb MessageFunc) { + if c.onEventListeners[event] == nil { + c.onEventListeners[event] = make([]MessageFunc, 0) + } + + c.onEventListeners[event] = append(c.onEventListeners[event], cb) +} + +func (c *ClientConn) OnError(cb ErrorFunc) { + c.onErrorListeners = append(c.onErrorListeners, cb) +} + +func (c *ClientConn) FireOnError(err error) { + for _, cb := range c.onErrorListeners { + cb(err) + } +} + +func (c *ClientConn) OnDisconnect(cb DisconnectFunc) { + c.onDisconnectListeners = append(c.onDisconnectListeners, cb) +} + +func (c *ClientConn) Disconnect() error { + if c == nil || !atomic.CompareAndSwapUint32(&c.disconnected, 0, 1) { + return ErrAlreadyDisconnected + } + + err := c.underline.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) + if err != nil { + err = c.underline.Close() + } + + if err == nil { + for i := range c.onDisconnectListeners { + c.onDisconnectListeners[i]() + } + } + + return err +} + +func (c *ClientConn) EmitMessage(nativeMessage []byte) error { + return c.writeDefault(nativeMessage) +} + +func (c *ClientConn) Emit(event string, data interface{}) error { + b, err := c.serializer.serialize(event, data) + if err != nil { + return err + } + + return c.EmitMessage(b) +} + +// Write writes a raw websocket message with a specific type to the client +// used by ping messages and any CloseMessage types. +func (c *ClientConn) Write(websocketMessageType int, data []byte) error { + // for any-case the app tries to write from different goroutines, + // we must protect them because they're reporting that as bug... + c.writerMu.Lock() + // .WriteMessage same as NextWriter and close (flush) + err := c.underline.WriteMessage(websocketMessageType, data) + c.writerMu.Unlock() + if err != nil { + // if failed then the connection is off, fire the disconnect + c.Disconnect() + } + return err +} + +// writeDefault is the same as write but the message type is the configured by c.messageType +// if BinaryMessages is enabled then it's raw []byte as you expected to work with protobufs +func (c *ClientConn) writeDefault(data []byte) error { + return c.Write(c.messageType, data) +} diff --git a/websocket/client.js.go b/websocket/client.js.go new file mode 100644 index 00000000..2144411a --- /dev/null +++ b/websocket/client.js.go @@ -0,0 +1,233 @@ +package websocket + +import ( + "time" + + "github.com/kataras/iris/context" +) + +// ClientHandler is the handler which serves the javascript client-side +// library. It uses a small cache based on the iris/context.WriteWithExpiration. +func ClientHandler() context.Handler { + modNow := time.Now() + return func(ctx context.Context) { + ctx.ContentType("application/javascript") + if _, err := ctx.WriteWithExpiration(ClientSource, modNow); err != nil { + ctx.StatusCode(500) + ctx.StopExecution() + // ctx.Application().Logger().Infof("error while serving []byte via StaticContent: %s", err.Error()) + } + } +} + +// ClientSource the client-side javascript raw source code. +var ClientSource = []byte(`var websocketStringMessageType = 0; +var websocketIntMessageType = 1; +var websocketBoolMessageType = 2; +var websocketJSONMessageType = 4; +var websocketMessagePrefix = "` + DefaultEvtMessageKey + `"; +var websocketMessageSeparator = ";"; +var websocketMessagePrefixLen = websocketMessagePrefix.length; +var websocketMessageSeparatorLen = websocketMessageSeparator.length; +var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; +var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; +var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; +var Ws = (function () { + // + function Ws(endpoint, protocols) { + var _this = this; + // events listeners + this.connectListeners = []; + this.disconnectListeners = []; + this.nativeMessageListeners = []; + this.messageListeners = {}; + if (!window["WebSocket"]) { + return; + } + if (endpoint.indexOf("ws") == -1) { + endpoint = "ws://" + endpoint; + } + if (protocols != null && protocols.length > 0) { + this.conn = new WebSocket(endpoint, protocols); + } + else { + this.conn = new WebSocket(endpoint); + } + this.conn.onopen = (function (evt) { + _this.fireConnect(); + _this.isReady = true; + return null; + }); + this.conn.onclose = (function (evt) { + _this.fireDisconnect(); + return null; + }); + this.conn.onmessage = (function (evt) { + _this.messageReceivedFromConn(evt); + }); + } + //utils + Ws.prototype.isNumber = function (obj) { + return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; + }; + Ws.prototype.isString = function (obj) { + return Object.prototype.toString.call(obj) == "[object String]"; + }; + Ws.prototype.isBoolean = function (obj) { + return typeof obj === 'boolean' || + (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); + }; + Ws.prototype.isJSON = function (obj) { + return typeof obj === 'object'; + }; + // + // messages + Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { + return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; + }; + Ws.prototype.encodeMessage = function (event, data) { + var m = ""; + var t = 0; + if (this.isNumber(data)) { + t = websocketIntMessageType; + m = data.toString(); + } + else if (this.isBoolean(data)) { + t = websocketBoolMessageType; + m = data.toString(); + } + else if (this.isString(data)) { + t = websocketStringMessageType; + m = data.toString(); + } + else if (this.isJSON(data)) { + //propably json-object + t = websocketJSONMessageType; + m = JSON.stringify(data); + } + else if (data !== null && typeof(data) !== "undefined" ) { + // if it has a second parameter but it's not a type we know, then fire this: + console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); + } + return this._msg(event, t, m); + }; + Ws.prototype.decodeMessage = function (event, websocketMessage) { + //iris-websocket-message;user;4;themarshaledstringfromajsonstruct + var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; + if (websocketMessage.length < skipLen + 1) { + return null; + } + var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); + var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); + if (websocketMessageType == websocketIntMessageType) { + return parseInt(theMessage); + } + else if (websocketMessageType == websocketBoolMessageType) { + return Boolean(theMessage); + } + else if (websocketMessageType == websocketStringMessageType) { + return theMessage; + } + else if (websocketMessageType == websocketJSONMessageType) { + return JSON.parse(theMessage); + } + else { + return null; // invalid + } + }; + Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { + if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { + return ""; + } + var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); + var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); + return evt; + }; + Ws.prototype.getCustomMessage = function (event, websocketMessage) { + var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); + var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); + return s; + }; + // + // Ws Events + // messageReceivedFromConn this is the func which decides + // if it's a native websocket message or a custom qws message + // if native message then calls the fireNativeMessage + // else calls the fireMessage + // + // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. + Ws.prototype.messageReceivedFromConn = function (evt) { + //check if qws message + var message = evt.data; + if (message.indexOf(websocketMessagePrefix) != -1) { + var event_1 = this.getWebsocketCustomEvent(message); + if (event_1 != "") { + // it's a custom message + this.fireMessage(event_1, this.getCustomMessage(event_1, message)); + return; + } + } + // it's a native websocket message + this.fireNativeMessage(message); + }; + Ws.prototype.OnConnect = function (fn) { + if (this.isReady) { + fn(); + } + this.connectListeners.push(fn); + }; + Ws.prototype.fireConnect = function () { + for (var i = 0; i < this.connectListeners.length; i++) { + this.connectListeners[i](); + } + }; + Ws.prototype.OnDisconnect = function (fn) { + this.disconnectListeners.push(fn); + }; + Ws.prototype.fireDisconnect = function () { + for (var i = 0; i < this.disconnectListeners.length; i++) { + this.disconnectListeners[i](); + } + }; + Ws.prototype.OnMessage = function (cb) { + this.nativeMessageListeners.push(cb); + }; + Ws.prototype.fireNativeMessage = function (websocketMessage) { + for (var i = 0; i < this.nativeMessageListeners.length; i++) { + this.nativeMessageListeners[i](websocketMessage); + } + }; + Ws.prototype.On = function (event, cb) { + if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { + this.messageListeners[event] = []; + } + this.messageListeners[event].push(cb); + }; + Ws.prototype.fireMessage = function (event, message) { + for (var key in this.messageListeners) { + if (this.messageListeners.hasOwnProperty(key)) { + if (key == event) { + for (var i = 0; i < this.messageListeners[key].length; i++) { + this.messageListeners[key][i](message); + } + } + } + } + }; + // + // Ws Actions + Ws.prototype.Disconnect = function () { + this.conn.close(); + }; + // EmitMessage sends a native websocket message + Ws.prototype.EmitMessage = function (websocketMessage) { + this.conn.send(websocketMessage); + }; + // Emit sends an iris-custom websocket message + Ws.prototype.Emit = function (event, data) { + var messageStr = this.encodeMessage(event, data); + this.EmitMessage(messageStr); + }; + return Ws; +}()); +`) diff --git a/websocket/client.ts b/websocket/client.ts index 98392492..c346154c 100644 --- a/websocket/client.ts +++ b/websocket/client.ts @@ -1,4 +1,4 @@ -// export to client.go:ClientSource []byte +// export to client.js.go:ClientSource []byte const websocketStringMessageType = 0; const websocketIntMessageType = 1; diff --git a/websocket/connection.go b/websocket/connection.go index 11f1e787..66acb0df 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -400,7 +400,7 @@ func (c *connection) startReader() { _, data, err := conn.ReadMessage() if err != nil { - if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) { + if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { c.FireOnError(err) } break From 946c100f7d24074d9af86793c38ddf6317856d6d Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 10 Feb 2019 17:16:43 +0200 Subject: [PATCH 011/418] use the same connection structure for both client and server-side connections interfaces, the 'Connection' interface could be changed to 'ServerConn' but this would produce breaking naming change to the iris users, so keep it as it's. Former-commit-id: 3440871b368709e33d2d2a5080c66f7ad9338970 --- _examples/websocket/go-client/client/main.go | 12 +- _examples/websocket/go-client/server/main.go | 4 +- websocket/client.go | 214 ------------- websocket/connection.go | 319 ++++++++++++++----- websocket/server.go | 5 +- 5 files changed, 258 insertions(+), 296 deletions(-) delete mode 100644 websocket/client.go diff --git a/_examples/websocket/go-client/client/main.go b/_examples/websocket/go-client/client/main.go index 6a36b6a2..f89f1803 100644 --- a/_examples/websocket/go-client/client/main.go +++ b/_examples/websocket/go-client/client/main.go @@ -21,21 +21,21 @@ $ go run main.go >> hi! */ func main() { - conn, err := websocket.Dial(url, websocket.DefaultEvtMessageKey) + c, err := websocket.Dial(url, websocket.ConnectionConfig{}) if err != nil { panic(err) } - conn.OnError(func(err error) { + c.OnError(func(err error) { fmt.Printf("error: %v", err) }) - conn.OnDisconnect(func() { - fmt.Println("Server was force-closed[see ../server/main.go#L19] this connection after 20 seconds, therefore I am disconnected.") + c.OnDisconnect(func() { + fmt.Println("Server was force-closed[see ../server/main.go#L17] this connection after 20 seconds, therefore I am disconnected.") os.Exit(0) }) - conn.On("chat", func(message string) { + c.On("chat", func(message string) { fmt.Printf("\n%s\n", message) }) @@ -51,7 +51,7 @@ func main() { break } - conn.Emit("chat", msgToSend) + c.Emit("chat", msgToSend) } fmt.Println("Terminated.") diff --git a/_examples/websocket/go-client/server/main.go b/_examples/websocket/go-client/server/main.go index 34e880d9..0c6bed81 100644 --- a/_examples/websocket/go-client/server/main.go +++ b/_examples/websocket/go-client/server/main.go @@ -11,8 +11,6 @@ import ( func main() { app := iris.New() ws := websocket.New(websocket.Config{}) - app.Get("/socket", ws.Handler()) - ws.OnConnection(func(c websocket.Connection) { go func() { <-time.After(20 * time.Second) @@ -28,5 +26,7 @@ func main() { }) }) + app.Get("/socket", ws.Handler()) + app.Run(iris.Addr(":8080")) } diff --git a/websocket/client.go b/websocket/client.go deleted file mode 100644 index 2220e07d..00000000 --- a/websocket/client.go +++ /dev/null @@ -1,214 +0,0 @@ -package websocket - -import ( - "bytes" - "strconv" - "strings" - "sync" - "sync/atomic" - - "github.com/gorilla/websocket" -) - -// Dial opens a new client connection to a WebSocket. -func Dial(url, evtMessagePrefix string) (ws *ClientConn, err error) { - if !strings.HasPrefix(url, "ws://") { - url = "ws://" + url - } - - conn, _, err := websocket.DefaultDialer.Dial(url, nil) - if err != nil { - return nil, err - } - - return NewClientConn(conn, evtMessagePrefix), nil -} - -type ClientConn struct { - underline UnderlineConnection // TODO make it using gorilla's one, because the 'startReader' will not know when to stop otherwise, we have a fixed length currently... - messageType int - serializer *messageSerializer - - onErrorListeners []ErrorFunc - onDisconnectListeners []DisconnectFunc - onNativeMessageListeners []NativeMessageFunc - onEventListeners map[string][]MessageFunc - - writerMu sync.Mutex - - disconnected uint32 -} - -func NewClientConn(conn UnderlineConnection, evtMessagePrefix string) *ClientConn { - if evtMessagePrefix == "" { - evtMessagePrefix = DefaultEvtMessageKey - } - - c := &ClientConn{ - underline: conn, - serializer: newMessageSerializer([]byte(evtMessagePrefix)), - - onErrorListeners: make([]ErrorFunc, 0), - onDisconnectListeners: make([]DisconnectFunc, 0), - onNativeMessageListeners: make([]NativeMessageFunc, 0), - onEventListeners: make(map[string][]MessageFunc, 0), - } - - c.SetBinaryMessages(false) - - go c.startReader() - - return c -} - -func (c *ClientConn) SetBinaryMessages(binaryMessages bool) { - if binaryMessages { - c.messageType = websocket.BinaryMessage - } else { - c.messageType = websocket.TextMessage - } -} - -func (c *ClientConn) startReader() { - defer c.Disconnect() - - for { - _, data, err := c.underline.ReadMessage() - if err != nil { - if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { - c.FireOnError(err) - } - - break - } else { - c.messageReceived(data) - } - } -} - -func (c *ClientConn) messageReceived(data []byte) error { - if bytes.HasPrefix(data, c.serializer.prefix) { - // is a custom iris message. - receivedEvt := c.serializer.getWebsocketCustomEvent(data) - listeners, ok := c.onEventListeners[string(receivedEvt)] - if !ok || len(listeners) == 0 { - return nil // if not listeners for this event exit from here - } - - customMessage, err := c.serializer.deserialize(receivedEvt, data) - if customMessage == nil || err != nil { - return err - } - - for i := range listeners { - if fn, ok := listeners[i].(func()); ok { // its a simple func(){} callback - fn() - } else if fnString, ok := listeners[i].(func(string)); ok { - - if msgString, is := customMessage.(string); is { - fnString(msgString) - } else if msgInt, is := customMessage.(int); is { - // here if server side waiting for string but client side sent an int, just convert this int to a string - fnString(strconv.Itoa(msgInt)) - } - - } else if fnInt, ok := listeners[i].(func(int)); ok { - fnInt(customMessage.(int)) - } else if fnBool, ok := listeners[i].(func(bool)); ok { - fnBool(customMessage.(bool)) - } else if fnBytes, ok := listeners[i].(func([]byte)); ok { - fnBytes(customMessage.([]byte)) - } else { - listeners[i].(func(interface{}))(customMessage) - } - - } - } else { - // it's native websocket message - for i := range c.onNativeMessageListeners { - c.onNativeMessageListeners[i](data) - } - } - - return nil -} - -func (c *ClientConn) OnMessage(cb NativeMessageFunc) { - c.onNativeMessageListeners = append(c.onNativeMessageListeners, cb) -} - -func (c *ClientConn) On(event string, cb MessageFunc) { - if c.onEventListeners[event] == nil { - c.onEventListeners[event] = make([]MessageFunc, 0) - } - - c.onEventListeners[event] = append(c.onEventListeners[event], cb) -} - -func (c *ClientConn) OnError(cb ErrorFunc) { - c.onErrorListeners = append(c.onErrorListeners, cb) -} - -func (c *ClientConn) FireOnError(err error) { - for _, cb := range c.onErrorListeners { - cb(err) - } -} - -func (c *ClientConn) OnDisconnect(cb DisconnectFunc) { - c.onDisconnectListeners = append(c.onDisconnectListeners, cb) -} - -func (c *ClientConn) Disconnect() error { - if c == nil || !atomic.CompareAndSwapUint32(&c.disconnected, 0, 1) { - return ErrAlreadyDisconnected - } - - err := c.underline.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) - if err != nil { - err = c.underline.Close() - } - - if err == nil { - for i := range c.onDisconnectListeners { - c.onDisconnectListeners[i]() - } - } - - return err -} - -func (c *ClientConn) EmitMessage(nativeMessage []byte) error { - return c.writeDefault(nativeMessage) -} - -func (c *ClientConn) Emit(event string, data interface{}) error { - b, err := c.serializer.serialize(event, data) - if err != nil { - return err - } - - return c.EmitMessage(b) -} - -// Write writes a raw websocket message with a specific type to the client -// used by ping messages and any CloseMessage types. -func (c *ClientConn) Write(websocketMessageType int, data []byte) error { - // for any-case the app tries to write from different goroutines, - // we must protect them because they're reporting that as bug... - c.writerMu.Lock() - // .WriteMessage same as NextWriter and close (flush) - err := c.underline.WriteMessage(websocketMessageType, data) - c.writerMu.Unlock() - if err != nil { - // if failed then the connection is off, fire the disconnect - c.Disconnect() - } - return err -} - -// writeDefault is the same as write but the message type is the configured by c.messageType -// if BinaryMessages is enabled then it's raw []byte as you expected to work with protobufs -func (c *ClientConn) writeDefault(data []byte) error { - return c.Write(c.messageType, data) -} diff --git a/websocket/connection.go b/websocket/connection.go index 66acb0df..821d812b 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -6,13 +6,37 @@ import ( "io" "net" "strconv" + "strings" "sync" + "sync/atomic" "time" "github.com/gorilla/websocket" "github.com/kataras/iris/context" ) +const ( + // TextMessage denotes a text data message. The text message payload is + // interpreted as UTF-8 encoded text data. + TextMessage = websocket.TextMessage + + // BinaryMessage denotes a binary data message. + BinaryMessage = websocket.BinaryMessage + + // CloseMessage denotes a close control message. The optional message + // payload contains a numeric code and text. Use the FormatCloseMessage + // function to format a close message payload. + CloseMessage = websocket.CloseMessage + + // PingMessage denotes a ping control message. The optional message payload + // is UTF-8 encoded text. + PingMessage = websocket.PingMessage + + // PongMessage denotes a ping control message. The optional message payload + // is UTF-8 encoded text. + PongMessage = websocket.PongMessage +) + type ( connectionValue struct { key []byte @@ -136,51 +160,27 @@ type ( PingFunc func() // PongFunc is the callback which fires on pong message received PongFunc func() - // Connection is the front-end API that you will use to communicate with the client side + // Connection is the front-end API that you will use to communicate with the client side, + // it is the server-side connection. Connection interface { - // Emitter implements EmitMessage & Emit - Emitter + ClientConnection // Err is not nil if the upgrader failed to upgrade http to websocket connection. Err() error - // ID returns the connection's identifier ID() string - // Server returns the websocket server instance // which this connection is listening to. // // Its connection-relative operations are safe for use. Server() *Server - - // Write writes a raw websocket message with a specific type to the client - // used by ping messages and any CloseMessage types. - Write(websocketMessageType int, data []byte) error - // Context returns the (upgraded) context.Context of this connection // avoid using it, you normally don't need it, // websocket has everything you need to authenticate the user BUT if it's necessary // then you use it to receive user information, for example: from headers Context() context.Context - - // OnDisconnect registers a callback which is fired when this connection is closed by an error or manual - OnDisconnect(DisconnectFunc) - // OnError registers a callback which fires when this connection occurs an error - OnError(ErrorFunc) - // OnPing registers a callback which fires on each ping - OnPing(PingFunc) - // OnPong registers a callback which fires on pong message received - OnPong(PongFunc) - // FireOnError can be used to send a custom error message to the connection - // - // It does nothing more than firing the OnError listeners. It doesn't send anything to the client. - FireOnError(err error) // To defines on what "room" (see Join) the server should send a message // returns an Emmiter(`EmitMessage` & `Emit`) to send messages. To(string) Emitter - // OnMessage registers a callback which fires when native websocket message received - OnMessage(NativeMessageFunc) - // On registers a callback to a particular event which is fired when a message to this event is received - On(string, MessageFunc) // Join registers this connection to a room, if it doesn't exist then it creates a new. One room can have one or more connections. One connection can be joined to many rooms. All connections are joined to a room specified by their `ID` automatically. Join(string) // IsJoined returns true when this connection is joined to the room, otherwise false. @@ -201,9 +201,6 @@ type ( // after the "On" events IF server's `Upgrade` is used, // otherise you don't have to call it because the `Handler()` does it automatically. Wait() - // Disconnect disconnects the client, close the underline websocket conn and removes it from the conn list - // returns the error, if any, from the underline connection - Disconnect() error // SetValue sets a key-value pair on the connection's mem store. SetValue(key string, value interface{}) // GetValue gets a value by its key from the connection's mem store. @@ -216,20 +213,51 @@ type ( GetValueInt(key string) int } + // ClientConnection is the client-side connection interface. Server shares some of its methods but the underline actions differs. + ClientConnection interface { + Emitter + // Write writes a raw websocket message with a specific type to the client + // used by ping messages and any CloseMessage types. + Write(websocketMessageType int, data []byte) error + // OnMessage registers a callback which fires when native websocket message received + OnMessage(NativeMessageFunc) + // On registers a callback to a particular event which is fired when a message to this event is received + On(string, MessageFunc) + // OnError registers a callback which fires when this connection occurs an error + OnError(ErrorFunc) + // OnPing registers a callback which fires on each ping + OnPing(PingFunc) + // OnPong registers a callback which fires on pong message received + OnPong(PongFunc) + // FireOnError can be used to send a custom error message to the connection + // + // It does nothing more than firing the OnError listeners. It doesn't send anything to the client. + FireOnError(err error) + // OnDisconnect registers a callback which is fired when this connection is closed by an error or manual + OnDisconnect(DisconnectFunc) + // Disconnect disconnects the client, close the underline websocket conn and removes it from the conn list + // returns the error, if any, from the underline connection + Disconnect() error + } + connection struct { - err error - underline UnderlineConnection - id string - messageType int - disconnected bool - onDisconnectListeners []DisconnectFunc - onRoomLeaveListeners []LeaveRoomFunc + err error + underline UnderlineConnection + config ConnectionConfig + defaultMessageType int + serializer *messageSerializer + id string + onErrorListeners []ErrorFunc onPingListeners []PingFunc onPongListeners []PongFunc onNativeMessageListeners []NativeMessageFunc onEventListeners map[string][]MessageFunc - started bool + onRoomLeaveListeners []LeaveRoomFunc + onDisconnectListeners []DisconnectFunc + disconnected uint32 + + started bool // these were maden for performance only self Emitter // pre-defined emitter than sends message to its self client broadcast Emitter // pre-defined emitter that sends message to all except this @@ -250,33 +278,49 @@ type ( var _ Connection = &connection{} -// CloseMessage denotes a close control message. The optional message -// payload contains a numeric code and text. Use the FormatCloseMessage -// function to format a close message payload. -// -// Use the `Connection#Disconnect` instead. -const CloseMessage = websocket.CloseMessage - -func newConnection(ctx context.Context, s *Server, underlineConn UnderlineConnection, id string) *connection { +func newConnection(underlineConn UnderlineConnection, cfg ConnectionConfig) *connection { + cfg = cfg.Validate() c := &connection{ underline: underlineConn, - id: id, - messageType: websocket.TextMessage, - onDisconnectListeners: make([]DisconnectFunc, 0), - onRoomLeaveListeners: make([]LeaveRoomFunc, 0), + config: cfg, + serializer: newMessageSerializer(cfg.EvtMessagePrefix), + defaultMessageType: websocket.TextMessage, onErrorListeners: make([]ErrorFunc, 0), + onPingListeners: make([]PingFunc, 0), + onPongListeners: make([]PongFunc, 0), onNativeMessageListeners: make([]NativeMessageFunc, 0), onEventListeners: make(map[string][]MessageFunc, 0), - onPongListeners: make([]PongFunc, 0), - started: false, - ctx: ctx, - server: s, + onDisconnectListeners: make([]DisconnectFunc, 0), + disconnected: 0, } - if s.config.BinaryMessages { - c.messageType = websocket.BinaryMessage + if cfg.BinaryMessages { + c.defaultMessageType = websocket.BinaryMessage } + return c +} + +func newServerConnection(ctx context.Context, s *Server, underlineConn UnderlineConnection, id string) *connection { + c := newConnection(underlineConn, ConnectionConfig{ + EvtMessagePrefix: s.config.EvtMessagePrefix, + WriteTimeout: s.config.WriteTimeout, + ReadTimeout: s.config.ReadTimeout, + PongTimeout: s.config.PongTimeout, + PingPeriod: s.config.PingPeriod, + MaxMessageSize: s.config.MaxMessageSize, + BinaryMessages: s.config.BinaryMessages, + ReadBufferSize: s.config.ReadBufferSize, + WriteBufferSize: s.config.WriteBufferSize, + EnableCompression: s.config.EnableCompression, + }) + + c.id = id + c.server = s + c.ctx = ctx + c.onRoomLeaveListeners = make([]LeaveRoomFunc, 0) + c.started = false + c.self = newEmitter(c, c.id) c.broadcast = newEmitter(c, Broadcast) c.all = newEmitter(c, All) @@ -295,7 +339,7 @@ func (c *connection) Write(websocketMessageType int, data []byte) error { // for any-case the app tries to write from different goroutines, // we must protect them because they're reporting that as bug... c.writerMu.Lock() - if writeTimeout := c.server.config.WriteTimeout; writeTimeout > 0 { + if writeTimeout := c.config.WriteTimeout; writeTimeout > 0 { // set the write deadline based on the configuration c.underline.SetWriteDeadline(time.Now().Add(writeTimeout)) } @@ -312,8 +356,8 @@ func (c *connection) Write(websocketMessageType int, data []byte) error { // writeDefault is the same as write but the message type is the configured by c.messageType // if BinaryMessages is enabled then it's raw []byte as you expected to work with protobufs -func (c *connection) writeDefault(data []byte) { - c.Write(c.messageType, data) +func (c *connection) writeDefault(data []byte) error { + return c.Write(c.defaultMessageType, data) } const ( @@ -342,8 +386,8 @@ func (c *connection) startPinger() { go func() { for { // using sleep avoids the ticker error that causes a memory leak - time.Sleep(c.server.config.PingPeriod) - if c.disconnected { + time.Sleep(c.config.PingPeriod) + if atomic.LoadUint32(&c.disconnected) > 0 { // verifies if already disconected break } @@ -375,12 +419,12 @@ func (c *connection) fireOnPong() { func (c *connection) startReader() { conn := c.underline - hasReadTimeout := c.server.config.ReadTimeout > 0 + hasReadTimeout := c.config.ReadTimeout > 0 - conn.SetReadLimit(c.server.config.MaxMessageSize) + conn.SetReadLimit(c.config.MaxMessageSize) conn.SetPongHandler(func(s string) error { if hasReadTimeout { - conn.SetReadDeadline(time.Now().Add(c.server.config.ReadTimeout)) + conn.SetReadDeadline(time.Now().Add(c.config.ReadTimeout)) } //fire all OnPong methods go c.fireOnPong() @@ -395,7 +439,7 @@ func (c *connection) startReader() { for { if hasReadTimeout { // set the read deadline based on the configuration - conn.SetReadDeadline(time.Now().Add(c.server.config.ReadTimeout)) + conn.SetReadDeadline(time.Now().Add(c.config.ReadTimeout)) } _, data, err := conn.ReadMessage() @@ -415,15 +459,15 @@ func (c *connection) startReader() { // messageReceived checks the incoming message and fire the nativeMessage listeners or the event listeners (ws custom message) func (c *connection) messageReceived(data []byte) { - if bytes.HasPrefix(data, c.server.config.EvtMessagePrefix) { + if bytes.HasPrefix(data, c.config.EvtMessagePrefix) { //it's a custom ws message - receivedEvt := c.server.messageSerializer.getWebsocketCustomEvent(data) + receivedEvt := c.serializer.getWebsocketCustomEvent(data) listeners, ok := c.onEventListeners[string(receivedEvt)] if !ok || len(listeners) == 0 { return // if not listeners for this event exit from here } - customMessage, err := c.server.messageSerializer.deserialize(receivedEvt, data) + customMessage, err := c.serializer.deserialize(receivedEvt, data) if customMessage == nil || err != nil { return } @@ -518,11 +562,23 @@ func (c *connection) To(to string) Emitter { } func (c *connection) EmitMessage(nativeMessage []byte) error { - return c.self.EmitMessage(nativeMessage) + if c.server != nil { + return c.self.EmitMessage(nativeMessage) + } + return c.writeDefault(nativeMessage) } func (c *connection) Emit(event string, message interface{}) error { - return c.self.Emit(event, message) + if c.server != nil { + return c.self.Emit(event, message) + } + + b, err := c.serializer.serialize(event, message) + if err != nil { + return err + } + + return c.EmitMessage(b) } func (c *connection) OnMessage(cb NativeMessageFunc) { @@ -586,10 +642,24 @@ func (c *connection) Wait() { var ErrAlreadyDisconnected = errors.New("already disconnected") func (c *connection) Disconnect() error { - if c == nil || c.disconnected { + if c == nil || !atomic.CompareAndSwapUint32(&c.disconnected, 0, 1) { return ErrAlreadyDisconnected } - return c.server.Disconnect(c.ID()) + + if c.server != nil { + return c.server.Disconnect(c.ID()) + } + + err := c.underline.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) + if err != nil { + err = c.underline.Close() + } + + if err == nil { + c.fireDisconnect() + } + + return err } // mem per-conn store @@ -632,3 +702,108 @@ func (c *connection) GetValueInt(key string) int { } return 0 } + +// ConnectionConfig is the base configuration for both server and client connections. +// Clients must use `ConnectionConfig` in order to `Dial`, server's connection configuration is set by the `Config` structure. +type ConnectionConfig struct { + // EvtMessagePrefix is the prefix of the underline websocket events that are being established under the hoods. + // This prefix is visible only to the javascript side (code) and it has nothing to do + // with the message that the end-user receives. + // Do not change it unless it is absolutely necessary. + // + // If empty then defaults to []byte("iris-websocket-message:"). + // Should match with the server's EvtMessagePrefix. + EvtMessagePrefix []byte + // WriteTimeout time allowed to write a message to the connection. + // 0 means no timeout. + // Default value is 0 + WriteTimeout time.Duration + // ReadTimeout time allowed to read a message from the connection. + // 0 means no timeout. + // Default value is 0 + ReadTimeout time.Duration + // PongTimeout allowed to read the next pong message from the connection. + // Default value is 60 * time.Second + PongTimeout time.Duration + // PingPeriod send ping messages to the connection within this period. Must be less than PongTimeout. + // Default value is 60 *time.Second + PingPeriod time.Duration + // MaxMessageSize max message size allowed from connection. + // Default value is 1024 + MaxMessageSize int64 + // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text + // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. + // Default value is false + BinaryMessages bool + // ReadBufferSize is the buffer size for the connection reader. + // Default value is 4096 + ReadBufferSize int + // WriteBufferSize is the buffer size for the connection writer. + // Default value is 4096 + WriteBufferSize int + // EnableCompression specify if the server should attempt to negotiate per + // message compression (RFC 7692). Setting this value to true does not + // guarantee that compression will be supported. Currently only "no context + // takeover" modes are supported. + // + // Defaults to false and it should be remain as it is, unless special requirements. + EnableCompression bool +} + +// Validate validates the connection configuration. +func (c ConnectionConfig) Validate() ConnectionConfig { + if len(c.EvtMessagePrefix) == 0 { + c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) + } + + // 0 means no timeout. + if c.WriteTimeout < 0 { + c.WriteTimeout = DefaultWebsocketWriteTimeout + } + + if c.ReadTimeout < 0 { + c.ReadTimeout = DefaultWebsocketReadTimeout + } + + if c.PongTimeout < 0 { + c.PongTimeout = DefaultWebsocketPongTimeout + } + + if c.PingPeriod <= 0 { + c.PingPeriod = DefaultWebsocketPingPeriod + } + + if c.MaxMessageSize <= 0 { + c.MaxMessageSize = DefaultWebsocketMaxMessageSize + } + + if c.ReadBufferSize <= 0 { + c.ReadBufferSize = DefaultWebsocketReadBufferSize + } + + if c.WriteBufferSize <= 0 { + c.WriteBufferSize = DefaultWebsocketWriterBufferSize + } + + return c +} + +// Dial opens a new client connection to a WebSocket. +// The "url" input parameter is the url to connect to the server, it should be +// the ws:// (or wss:// if secure) + the host + the endpoint of the +// open socket of the server, i.e ws://localhost:8080/my_websocket_endpoint. +func Dial(url string, cfg ConnectionConfig) (ClientConnection, error) { + if !strings.HasPrefix(url, "ws://") { + url = "ws://" + url + } + + conn, _, err := websocket.DefaultDialer.Dial(url, nil) + if err != nil { + return nil, err + } + + clientConn := newConnection(conn, cfg) + go clientConn.Wait() + + return clientConn, nil +} diff --git a/websocket/server.go b/websocket/server.go index 9bf323ad..1de429da 100644 --- a/websocket/server.go +++ b/websocket/server.go @@ -3,6 +3,7 @@ package websocket import ( "bytes" "sync" + "sync/atomic" "github.com/kataras/iris/context" @@ -149,7 +150,7 @@ func (s *Server) handleConnection(ctx context.Context, websocketConn UnderlineCo // use the config's id generator (or the default) to create a websocket client/connection id cid := s.config.IDGenerator(ctx) // create the new connection - c := newConnection(ctx, s, websocketConn, cid) + c := newServerConnection(ctx, s, websocketConn, cid) // add the connection to the Server's list s.addConnection(c) @@ -397,7 +398,7 @@ func (s *Server) Disconnect(connID string) (err error) { // remove the connection from the list. if conn, ok := s.getConnection(connID); ok { - conn.disconnected = true + atomic.StoreUint32(&conn.disconnected, 1) // fire the disconnect callbacks, if any. conn.fireDisconnect() // close the underline connection and return its error, if any. From 07994adabb0b26b75263687548d3f5ca7e8022a0 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Thu, 14 Feb 2019 03:28:41 +0200 Subject: [PATCH 012/418] add websocket client stress test, passed and update the vendors (this commit fixes the https://github.com/kataras/iris/issues/1178 and https://github.com/kataras/iris/issues/1173) Former-commit-id: 74ccd8f4bf60a71f1eb0e34149a6f19de95a9148 --- .../go-client-stress-test/client/main.go | 85 +++++++++++++++++ .../go-client-stress-test/client/test.data | 19 ++++ .../go-client-stress-test/server/main.go | 64 +++++++++++++ _examples/websocket/go-client/client/main.go | 1 + websocket/config.go | 44 ++++----- websocket/connection.go | 92 +++++++++++-------- websocket/emitter.go | 2 +- websocket/message.go | 3 +- websocket/server.go | 2 - websocket/websocket.go | 5 - 10 files changed, 247 insertions(+), 70 deletions(-) create mode 100644 _examples/websocket/go-client-stress-test/client/main.go create mode 100644 _examples/websocket/go-client-stress-test/client/test.data create mode 100644 _examples/websocket/go-client-stress-test/server/main.go diff --git a/_examples/websocket/go-client-stress-test/client/main.go b/_examples/websocket/go-client-stress-test/client/main.go new file mode 100644 index 00000000..7d49a1cf --- /dev/null +++ b/_examples/websocket/go-client-stress-test/client/main.go @@ -0,0 +1,85 @@ +package main + +import ( + "bufio" + "fmt" + "math/rand" + "os" + "sync" + "time" + + "github.com/kataras/iris/websocket" +) + +var ( + url = "ws://localhost:8080/socket" + f *os.File +) + +const totalClients = 1200 + +func main() { + var err error + f, err = os.Open("./test.data") + if err != nil { + panic(err) + } + defer f.Close() + + wg := new(sync.WaitGroup) + for i := 0; i < totalClients/2; i++ { + wg.Add(1) + go connect(wg, 5*time.Second) + } + + for i := 0; i < totalClients/2; i++ { + wg.Add(1) + waitTime := time.Duration(rand.Intn(10)) * time.Millisecond + time.Sleep(waitTime) + go connect(wg, 10*time.Second+waitTime) + } + + wg.Wait() + fmt.Println("ALL OK.") + time.Sleep(5 * time.Second) +} + +func connect(wg *sync.WaitGroup, alive time.Duration) { + + c, err := websocket.Dial(url, websocket.ConnectionConfig{}) + if err != nil { + panic(err) + } + + c.OnError(func(err error) { + fmt.Printf("error: %v", err) + }) + + disconnected := false + c.OnDisconnect(func() { + fmt.Printf("I am disconnected after [%s].\n", alive) + disconnected = true + }) + + c.On("chat", func(message string) { + fmt.Printf("\n%s\n", message) + }) + + go func() { + time.Sleep(alive) + if err := c.Disconnect(); err != nil { + panic(err) + } + + wg.Done() + }() + + scanner := bufio.NewScanner(f) + for !disconnected { + if !scanner.Scan() || scanner.Err() != nil { + break + } + + c.Emit("chat", scanner.Text()) + } +} diff --git a/_examples/websocket/go-client-stress-test/client/test.data b/_examples/websocket/go-client-stress-test/client/test.data new file mode 100644 index 00000000..be5eb502 --- /dev/null +++ b/_examples/websocket/go-client-stress-test/client/test.data @@ -0,0 +1,19 @@ +Σκουπίζει τη τι αρματωσιά ευρυδίκης κι αποδεχθεί αν εχτύπεσεν. Οι το ζητούσε δεκτικό αφήσουν μπράτσο βλ απ. Φυγή τι έτσι εκ πλάι αυτή θεός ας αδάμ. Αποβαίνει να τι βλ κατάγεται γεγονότος. Μπουφάν ξάπλωσε σχέσεις βλ ας να να. Υποδηλώσει τα τι κι σιδερένιων εξελικτική ως συγκράτησε παιγνιώδης. Προφανώς μου μία σύγχρονο ιστορίας. + +Νερά ψηλά λύπη αφτί ας ψυχή τι λόγω. Του φίλ διά γεφυρώνει ανίχνευση διεύρυνση. Όλο μήπως τομέα πρώτο στους δις νόημα εάν του. Παιδείας ομορφιάς καλύτερα ας με. Παραγωγή προθέαση σε κουλιζάρ παραπάνω υπ. Πώς δικούς στήθος πόντου πως θέατρο θέληση σίδερο. Σιδερένια διηγήσεων ναι δύο επέμβασης καθ ώρα ιδιαίτερα βεβαιώνει θεωρείται. Βλ νερο τη να ύλης μτφρ τέλη. Ας ρόλων τη χώρων υπ αφορά είδος είπεν. + +Ου πάρκαρε παιδικό μάλιστα ιι. Σκοτωθεί απαγωγής ανάλυσης άνθρωποι ιι τραγικού οι. Αναπνοή επέλεξα πομπούς εφ δράσεις να. Νε υλικό ας ως ευρήκ νόρμα ου. Ιι εμάζεψα δεύτερη αλλαγές ατ τα σύζευξη επίπεδο. Συγγραφέα νεότερους κατέγραψε ζωή διά υφολογική. Που απέσ νου στον άρα είδη σούκ νικά ήρωά. Το κανένα τι ιι γωνίας να δεσμός. + +Ροή ρευστότητα στο έλα παραμυθιού διαδικασία ειδυλλιακή. Ελλάδας σύμβαση δε με πομπούς εμφανής. Ατ ως εποχή τρόπο εβγάλ αυτές πεδίο γωνία. Των άνθρωπος μπανιέρα ροζ υφίστατο φίλ. Εδώ ροζ πήρε τύπο πια μην δική. Έζησαν μάλλον ως με δε τρόπου. Παράλληλη από αδιόρατης επισκίασε άρα rites ναι. Πολιτισμού του ειδολογική νέο συνάντησης στα ταυτότητας δημοσίευση. + +Παραλλαγές τόζλουτζας κι ατ συγγραφέας παρωδώντας συνείδησης να. Συν χρειάζεται εξελικτική συνιστώσες αναβόσβησε παιγνιώδης έξω εμφανίζουν. Περίτεχνο κοινωνίας ρου του ηθελημένα την σύγχρονων ζώγ. Συν στα υποτίθεται εις ανακάλυψης νέο κατασκευές. Τεκμήρια επίλογοι περίοδος σου εξω στα αγγελίες ποικίλες. Γι παραμένει συμβάντος ακολούθως δε κι να υπόστρωμα. Τη θάρρος θεϊκού να μικρές αηδίες σοφίας πρέπει. Γιατί ευρήκ σοφία αίσια και όνομά για επικό την. Έστειλεν οι σύνδρομο αληθινής κι με εξυπνάδα υπέδειξε αδειάσει. + +Πω δε φοβηθώ ας σε μιχάλη ακουσε όμορφα εφόδιο. Ελέγχοντας διαχείριση όλα αναπαράγει συν στα εάν. Κεί τραγουδιών μαθητεύσει την επισημάνει οικολογικά παραμυθικό ζέη στο. Λαϊκού ατότες εξω μια την ακούμε. Δεδομένου ας τα αγαπημένο παρουσίας διαθέσεων αν. Αντίστροφα ρεαλιστικό περιπέτεια διαδικασία άρα ατο ημερολόγια. + +Άντλησης νεόφερτο μοναδικό εκ ιι δυναμική μηνύματα. Συγγραφική προ έξω την περιπέτεια εγχειρίδια μαθητεύσει εκφέρονται. Εάν δεν μαρί άρα ήχοι ατο κόρη. Εν ας επομένως κινήματα άνθρωποι. Ου δάσος τι υπ γιατί πόνος όποια αυτός. Δεύτερη δέχεται το χρονικά αχιλλέα μη. Τα απαγωγή ου ακριβώς θηλάσει. Οι παραγωγή τα παιγνίδι απ παιδικών τρομάξει. + +Ιστορικά ανθρώπου οπλιστεί εκκίνηση στα μερ χάσματος αργότερα. Κοινωνία επιδίωξη κοιμάται πια πειστική διά πιο απ΄. Εκ οι εύκολα γονείς σύζυγο κι πολλοί με φυσερά. Εκ τα μέτωπο το κύματα δηλαδή όμορφα φανερό πράγμα. Νωρίτερα ομορφιάς διαμέσου ζώγ ανέδειξε υπό πρόσμιξη. Επιδιώκει τις όλη μια βεβαιώνει μελετηθεί μία. Παρατηρεί υιοθετούν ροή ανθρώπινη τον επέστρεψε κατασκευή πια. + +Αναπνοή επί νυχτικά εις σηκώνει τράβηξε γερανού χάλκενα. Αν αδειάσει ποικίλες νε δυναμικό. Όπως δύο αυτό ένα δέβα αυτο από νέοι πάλι. Έως υποβάλλουν αποτέλεσμα εξω σην συγχρονική μεσημεριού. Όλα νέο νου εναντίον σκέπαζαν τον διδάσκει σπουδαίο. Ακόμη πι ως έργου σοφοί δε τα. Σώματος απόλυτα εν τέτοιες διάφορα ατ πι τι. Ως ατ κοινού έμαθες πλάκες. Τα τη συνοχή έκρυβε οποίος σταθεί παίκτη. + +Με σύγχρονης βρίσκεται αποτέλεσε πα τα ελληνικής. Ανακοίνωσή τις στο ουσιαστικό πολλαπλούς τις φιλολογική σου. Φιλολογική να κι κι μορφολογία μυθοπλασία πω. Τυχόν βαθιά ου λόγια έχουν να. Μικρούς έχοντας με χαμένης τη μη. Μοντέλα συνήθως επί θεωρίες χρονικά όλα χάλκενα. Διήγημα θεωρίας ατ βαγγέλη βλ νε αρ ευτελής μαγείας. diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go new file mode 100644 index 00000000..0519323a --- /dev/null +++ b/_examples/websocket/go-client-stress-test/server/main.go @@ -0,0 +1,64 @@ +package main + +import ( + "fmt" + "os" + "sync/atomic" + "time" + + "github.com/kataras/iris" + "github.com/kataras/iris/websocket" +) + +const totalClients = 1200 + +func main() { + app := iris.New() + + // websocket.Config{PingPeriod: ((60 * time.Second) * 9) / 10} + ws := websocket.New(websocket.Config{}) + ws.OnConnection(handleConnection) + app.Get("/socket", ws.Handler()) + + go func() { + t := time.NewTicker(2 * time.Second) + for { + <-t.C + + conns := ws.GetConnections() + for _, conn := range conns { + // fmt.Println(conn.ID()) + // Do nothing. + _ = conn + } + + if atomic.LoadUint64(&count) == totalClients { + fmt.Println("ALL CLIENTS DISCONNECTED SUCCESSFULLY.") + t.Stop() + os.Exit(0) + return + } + } + }() + + app.Run(iris.Addr(":8080")) +} + +func handleConnection(c websocket.Connection) { + c.OnError(func(err error) { handleErr(c, err) }) + c.OnDisconnect(func() { handleDisconnect(c) }) + c.On("chat", func(message string) { + c.To(websocket.Broadcast).Emit("chat", c.ID()+": "+message) + }) +} + +var count uint64 + +func handleDisconnect(c websocket.Connection) { + atomic.AddUint64(&count, 1) + fmt.Printf("client [%s] disconnected!\n", c.ID()) +} + +func handleErr(c websocket.Connection, err error) { + fmt.Printf("client [%s] errored: %v\n", c.ID(), err) +} diff --git a/_examples/websocket/go-client/client/main.go b/_examples/websocket/go-client/client/main.go index f89f1803..2d1ded6d 100644 --- a/_examples/websocket/go-client/client/main.go +++ b/_examples/websocket/go-client/client/main.go @@ -21,6 +21,7 @@ $ go run main.go >> hi! */ func main() { + // `websocket.DialContext` is also available. c, err := websocket.Dial(url, websocket.ConnectionConfig{}) if err != nil { panic(err) diff --git a/websocket/config.go b/websocket/config.go index 68be4f75..145ea2a6 100644 --- a/websocket/config.go +++ b/websocket/config.go @@ -15,16 +15,15 @@ const ( DefaultWebsocketWriteTimeout = 0 // DefaultWebsocketReadTimeout 0, no timeout DefaultWebsocketReadTimeout = 0 - // DefaultWebsocketPongTimeout 60 * time.Second - DefaultWebsocketPongTimeout = 60 * time.Second - // DefaultWebsocketPingPeriod (DefaultPongTimeout * 9) / 10 - DefaultWebsocketPingPeriod = (DefaultWebsocketPongTimeout * 9) / 10 - // DefaultWebsocketMaxMessageSize 1024 - DefaultWebsocketMaxMessageSize = 1024 - // DefaultWebsocketReadBufferSize 4096 - DefaultWebsocketReadBufferSize = 4096 - // DefaultWebsocketWriterBufferSize 4096 - DefaultWebsocketWriterBufferSize = 4096 + // DefaultWebsocketPingPeriod is 0 but + // could be 10 * time.Second. + DefaultWebsocketPingPeriod = 0 + // DefaultWebsocketMaxMessageSize 0 + DefaultWebsocketMaxMessageSize = 0 + // DefaultWebsocketReadBufferSize 0 + DefaultWebsocketReadBufferSize = 0 + // DefaultWebsocketWriterBufferSize 0 + DefaultWebsocketWriterBufferSize = 0 // DefaultEvtMessageKey is the default prefix of the underline websocket events // that are being established under the hoods. // @@ -76,11 +75,9 @@ type Config struct { // 0 means no timeout. // Default value is 0 ReadTimeout time.Duration - // PongTimeout allowed to read the next pong message from the connection. - // Default value is 60 * time.Second - PongTimeout time.Duration - // PingPeriod send ping messages to the connection within this period. Must be less than PongTimeout. - // Default value is 60 *time.Second + // PingPeriod send ping messages to the connection repeatedly after this period. + // The value should be close to the ReadTimeout to avoid issues. + // Default value is 0. PingPeriod time.Duration // MaxMessageSize max message size allowed from connection. // Default value is 1024 @@ -89,12 +86,13 @@ type Config struct { // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. // Default value is false BinaryMessages bool - // ReadBufferSize is the buffer size for the connection reader. - // Default value is 4096 - ReadBufferSize int - // WriteBufferSize is the buffer size for the connection writer. - // Default value is 4096 - WriteBufferSize int + // ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer + // size is zero, then buffers allocated by the HTTP server are used. The + // I/O buffer sizes do not limit the size of the messages that can be sent + // or received. + // + // Default value is 0. + ReadBufferSize, WriteBufferSize int // EnableCompression specify if the server should attempt to negotiate per // message compression (RFC 7692). Setting this value to true does not // guarantee that compression will be supported. Currently only "no context @@ -121,10 +119,6 @@ func (c Config) Validate() Config { c.ReadTimeout = DefaultWebsocketReadTimeout } - if c.PongTimeout < 0 { - c.PongTimeout = DefaultWebsocketPongTimeout - } - if c.PingPeriod <= 0 { c.PingPeriod = DefaultWebsocketPingPeriod } diff --git a/websocket/connection.go b/websocket/connection.go index 821d812b..b2b7afab 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -2,6 +2,7 @@ package websocket import ( "bytes" + stdContext "context" "errors" "io" "net" @@ -278,6 +279,12 @@ type ( var _ Connection = &connection{} +// WrapConnection wraps the underline websocket connection into a new iris websocket connection. +// The caller should call the `connection#Wait` (which blocks) to enable its read and write functionality. +func WrapConnection(underlineConn UnderlineConnection, cfg ConnectionConfig) Connection { + return newConnection(underlineConn, cfg) +} + func newConnection(underlineConn UnderlineConnection, cfg ConnectionConfig) *connection { cfg = cfg.Validate() c := &connection{ @@ -306,7 +313,6 @@ func newServerConnection(ctx context.Context, s *Server, underlineConn Underline EvtMessagePrefix: s.config.EvtMessagePrefix, WriteTimeout: s.config.WriteTimeout, ReadTimeout: s.config.ReadTimeout, - PongTimeout: s.config.PongTimeout, PingPeriod: s.config.PingPeriod, MaxMessageSize: s.config.MaxMessageSize, BinaryMessages: s.config.BinaryMessages, @@ -383,24 +389,25 @@ func (c *connection) startPinger() { c.underline.SetPingHandler(pingHandler) - go func() { - for { - // using sleep avoids the ticker error that causes a memory leak - time.Sleep(c.config.PingPeriod) - if atomic.LoadUint32(&c.disconnected) > 0 { - // verifies if already disconected - break + if c.config.PingPeriod > 0 { + go func() { + for { + time.Sleep(c.config.PingPeriod) + if c == nil || atomic.LoadUint32(&c.disconnected) > 0 { + // verifies if already disconected. + return + } + //fire all OnPing methods + c.fireOnPing() + // try to ping the client, if failed then it disconnects. + err := c.Write(websocket.PingMessage, []byte{}) + if err != nil { + // must stop to exit the loop and exit from the routine. + return + } } - //fire all OnPing methods - c.fireOnPing() - // try to ping the client, if failed then it disconnects - err := c.Write(websocket.PingMessage, []byte{}) - if err != nil { - // must stop to exit the loop and finish the go routine - break - } - } - }() + }() + } } func (c *connection) fireOnPing() { @@ -444,14 +451,13 @@ func (c *connection) startReader() { _, data, err := conn.ReadMessage() if err != nil { - if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { + if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure, websocket.CloseNormalClosure) { c.FireOnError(err) } - break - } else { - c.messageReceived(data) + return } + c.messageReceived(data) } } @@ -722,14 +728,12 @@ type ConnectionConfig struct { // 0 means no timeout. // Default value is 0 ReadTimeout time.Duration - // PongTimeout allowed to read the next pong message from the connection. - // Default value is 60 * time.Second - PongTimeout time.Duration - // PingPeriod send ping messages to the connection within this period. Must be less than PongTimeout. - // Default value is 60 *time.Second + // PingPeriod send ping messages to the connection repeatedly after this period. + // The value should be close to the ReadTimeout to avoid issues. + // Default value is 0 PingPeriod time.Duration // MaxMessageSize max message size allowed from connection. - // Default value is 1024 + // Default value is 0. Unlimited but it is recommended to be 1024 for medium to large messages. MaxMessageSize int64 // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. @@ -765,10 +769,6 @@ func (c ConnectionConfig) Validate() ConnectionConfig { c.ReadTimeout = DefaultWebsocketReadTimeout } - if c.PongTimeout < 0 { - c.PongTimeout = DefaultWebsocketPongTimeout - } - if c.PingPeriod <= 0 { c.PingPeriod = DefaultWebsocketPingPeriod } @@ -788,22 +788,42 @@ func (c ConnectionConfig) Validate() ConnectionConfig { return c } -// Dial opens a new client connection to a WebSocket. +// ErrBadHandshake is returned when the server response to opening handshake is +// invalid. +var ErrBadHandshake = websocket.ErrBadHandshake + +// DialContext creates a new client connection. +// +// The context will be used in the request and in the Dialer. +// +// If the WebSocket handshake fails, `ErrBadHandshake` is returned. +// // The "url" input parameter is the url to connect to the server, it should be // the ws:// (or wss:// if secure) + the host + the endpoint of the // open socket of the server, i.e ws://localhost:8080/my_websocket_endpoint. -func Dial(url string, cfg ConnectionConfig) (ClientConnection, error) { +// +// Custom dialers can be used by wrapping the iris websocket connection via `websocket.WrapConnection`. +func DialContext(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { + if ctx == nil { + ctx = stdContext.Background() + } + if !strings.HasPrefix(url, "ws://") { url = "ws://" + url } - conn, _, err := websocket.DefaultDialer.Dial(url, nil) + conn, _, err := websocket.DefaultDialer.DialContext(ctx, url, nil) if err != nil { return nil, err } - clientConn := newConnection(conn, cfg) + clientConn := WrapConnection(conn, cfg) go clientConn.Wait() return clientConn, nil } + +// Dial creates a new client connection by calling `DialContext` with a background context. +func Dial(url string, cfg ConnectionConfig) (ClientConnection, error) { + return DialContext(stdContext.Background(), url, cfg) +} diff --git a/websocket/emitter.go b/websocket/emitter.go index d8ae087d..84d1fa48 100644 --- a/websocket/emitter.go +++ b/websocket/emitter.go @@ -34,7 +34,7 @@ func (e *emitter) EmitMessage(nativeMessage []byte) error { } func (e *emitter) Emit(event string, data interface{}) error { - message, err := e.conn.server.messageSerializer.serialize(event, data) + message, err := e.conn.serializer.serialize(event, data) if err != nil { return err } diff --git a/websocket/message.go b/websocket/message.go index 804baa3c..6b27fbee 100644 --- a/websocket/message.go +++ b/websocket/message.go @@ -81,7 +81,7 @@ var ( ) // websocketMessageSerialize serializes a custom websocket message from websocketServer to be delivered to the client -// returns the string form of the message +// returns the string form of the message // Supported data types are: string, int, bool, bytes and JSON. func (ms *messageSerializer) serialize(event string, data interface{}) ([]byte, error) { b := ms.buf.Get() @@ -114,6 +114,7 @@ func (ms *messageSerializer) serialize(event string, data interface{}) ([]byte, //we suppose is json res, err := json.Marshal(data) if err != nil { + ms.buf.Put(b) return nil, err } b.WriteString(messageTypeJSON.String()) diff --git a/websocket/server.go b/websocket/server.go index 1de429da..6b9b6130 100644 --- a/websocket/server.go +++ b/websocket/server.go @@ -44,7 +44,6 @@ type ( // Use a route to serve this file on a specific path, i.e // app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(mywebsocketServer.ClientSource) }) ClientSource []byte - messageSerializer *messageSerializer connections map[string]*connection // key = the Connection ID. rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name mu sync.RWMutex // for rooms and connections. @@ -64,7 +63,6 @@ func New(cfg Config) *Server { return &Server{ config: cfg, ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), - messageSerializer: newMessageSerializer(cfg.EvtMessagePrefix), connections: make(map[string]*connection), rooms: make(map[string][]string), onConnectionListeners: make([]ConnectionFunc, 0), diff --git a/websocket/websocket.go b/websocket/websocket.go index 9cf4fdf0..1792e0dc 100644 --- a/websocket/websocket.go +++ b/websocket/websocket.go @@ -4,11 +4,6 @@ Source code and other details for the project are available at GitHub: https://github.com/kataras/iris/tree/master/websocket -Installation - - $ go get -u github.com/kataras/iris/websocket - - Example code: From 9cfaff07d6792150d561f8fa9d4a24f2804f9b42 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 16 Feb 2019 00:42:26 +0200 Subject: [PATCH 013/418] add support for mvc and hero dynamic dependencies to understand the error type as a second output value as requested at: https://github.com/kataras/iris/issues/1187 Former-commit-id: 49e29c06aaaa22743354981342c29fc9d5953d0e --- hero/di/object.go | 39 +++++++++++++++++++++++++++++---------- hero/di/reflect.go | 7 +++++++ mvc/controller.go | 4 ++++ mvc/controller_test.go | 17 +++++++++++++++++ websocket/connection.go | 2 +- 5 files changed, 58 insertions(+), 11 deletions(-) diff --git a/hero/di/object.go b/hero/di/object.go index 385162bd..047d7362 100644 --- a/hero/di/object.go +++ b/hero/di/object.go @@ -77,8 +77,10 @@ func MakeReturnValue(fn reflect.Value, goodFunc TypeChecker) (func([]reflect.Val return nil, typ, errBad } - // invalid if not returns one single value. - if typ.NumOut() != 1 { + n := typ.NumOut() + + // invalid if not returns one single value or two values but the second is not an error. + if !(n == 1 || (n == 2 && IsError(typ.Out(1)))) { return nil, typ, errBad } @@ -88,19 +90,36 @@ func MakeReturnValue(fn reflect.Value, goodFunc TypeChecker) (func([]reflect.Val } } - outTyp := typ.Out(0) - zeroOutVal := reflect.New(outTyp).Elem() + firstOutTyp := typ.Out(0) + firstZeroOutVal := reflect.New(firstOutTyp).Elem() bf := func(ctxValue []reflect.Value) reflect.Value { results := fn.Call(ctxValue) - if len(results) == 0 { - return zeroOutVal - } v := results[0] - if !v.IsValid() { - return zeroOutVal + if !v.IsValid() { // check the first value, second is error. + return firstZeroOutVal } + + if n == 2 { + // two, second is always error. + errVal := results[1] + if !errVal.IsNil() { + // error is not nil, do something with it. + if ctx, ok := ctxValue[0].Interface().(interface { + StatusCode(int) + WriteString(string) (int, error) + StopExecution() + }); ok { + ctx.StatusCode(400) + ctx.WriteString(errVal.Interface().(error).Error()) + ctx.StopExecution() + } + + return firstZeroOutVal + } + } + // if v.String() == "" { // println("di/object.go: " + v.String()) // // println("di/object.go: because it's interface{} it should be returned as: " + v.Elem().Type().String() + " and its value: " + v.Elem().Interface().(string)) @@ -109,7 +128,7 @@ func MakeReturnValue(fn reflect.Value, goodFunc TypeChecker) (func([]reflect.Val return v } - return bf, outTyp, nil + return bf, firstOutTyp, nil } // IsAssignable checks if "to" type can be used as "b.Value/ReturnValue". diff --git a/hero/di/reflect.go b/hero/di/reflect.go index 08fc7f2a..e2c68700 100644 --- a/hero/di/reflect.go +++ b/hero/di/reflect.go @@ -59,6 +59,13 @@ func IsZero(v reflect.Value) bool { return v.Interface() == zero.Interface() } +var errTyp = reflect.TypeOf((*error)(nil)).Elem() + +// IsError returns true if "typ" is type of `error`. +func IsError(typ reflect.Type) bool { + return typ.Implements(errTyp) +} + // IndirectValue returns the reflect.Value that "v" points to. // If "v" is a nil pointer, Indirect returns a zero Value. // If "v" is not a pointer, Indirect returns v. diff --git a/mvc/controller.go b/mvc/controller.go index 804b1b00..cb0cbd9d 100644 --- a/mvc/controller.go +++ b/mvc/controller.go @@ -398,6 +398,10 @@ func (c *ControllerActivator) handlerOf(m reflect.Method, funcDependencies []ref in[0] = ctrl funcInjector.Inject(&in, ctxValue) + if ctx.IsStopped() { + return // stop as soon as possible, although it would stop later on if `ctx.StopExecution` called. + } + // for idxx, inn := range in { // println("controller.go: execution: in.Value = "+inn.String()+" and in.Type = "+inn.Type().Kind().String()+" of index: ", idxx) // } diff --git a/mvc/controller_test.go b/mvc/controller_test.go index 7103c9e9..eb41ab7a 100644 --- a/mvc/controller_test.go +++ b/mvc/controller_test.go @@ -272,11 +272,22 @@ type testControllerBindDeep struct { testControllerBindStruct } +func (t *testControllerBindDeep) BeforeActivation(b BeforeActivation) { + b.Dependencies().Add(func(ctx iris.Context) (v testCustomStruct, err error) { + err = ctx.ReadJSON(&v) + return + }) +} + func (t *testControllerBindDeep) Get() { // t.testControllerBindStruct.Get() t.Ctx.Writef(t.TitlePointer.title + t.TitleValue.title + t.Other) } +func (t *testControllerBindDeep) Post(v testCustomStruct) string { + return v.Name +} + func TestControllerDependencies(t *testing.T) { app := iris.New() // app.Logger().SetLevel("debug") @@ -299,6 +310,12 @@ func TestControllerDependencies(t *testing.T) { e.GET("/deep").Expect().Status(iris.StatusOK). Body().Equal(expected) + + e.POST("/deep").WithJSON(iris.Map{"name": "kataras"}).Expect().Status(iris.StatusOK). + Body().Equal("kataras") + + e.POST("/deep").Expect().Status(iris.StatusBadRequest). + Body().Equal("unexpected end of JSON input") } type testCtrl0 struct { diff --git a/websocket/connection.go b/websocket/connection.go index b2b7afab..8a8a416b 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -808,7 +808,7 @@ func DialContext(ctx stdContext.Context, url string, cfg ConnectionConfig) (Clie ctx = stdContext.Background() } - if !strings.HasPrefix(url, "ws://") { + if !strings.HasPrefix(url, "ws://") || !strings.HasPrefix(url, "wss://") { url = "ws://" + url } From 6ca19e0bca2559b5c33439db18d19b47e68a1e1e Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 16 Feb 2019 21:03:48 +0200 Subject: [PATCH 014/418] sessions: give ability to the end-user to modify the cookie via context.CookieOption on Start and Update/ShiftExpiration as requested at: https://github.com/kataras/iris/issues/1186, add a StartWithPath helper as well Former-commit-id: a9f8715b07049a5720a38c9352bb1ff781dfc04d --- sessions/sessions.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/sessions/sessions.go b/sessions/sessions.go index 009f7fca..046972d3 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -35,7 +35,7 @@ func (s *Sessions) UseDatabase(db Database) { } // updateCookie gains the ability of updating the session browser cookie to any method which wants to update it -func (s *Sessions) updateCookie(ctx context.Context, sid string, expires time.Duration) { +func (s *Sessions) updateCookie(ctx context.Context, sid string, expires time.Duration, options ...context.CookieOption) { cookie := &http.Cookie{} // The RFC makes no mention of encoding url value, so here I think to encode both sessionid key and the value using the safe(to put and to use as cookie) url-encoding @@ -65,11 +65,16 @@ func (s *Sessions) updateCookie(ctx context.Context, sid string, expires time.Du // encode the session id cookie client value right before send it. cookie.Value = s.encodeCookieValue(cookie.Value) + + for _, opt := range options { + opt(cookie) + } + AddCookie(ctx, cookie, s.config.AllowReclaim) } -// Start should start the session for the particular request. -func (s *Sessions) Start(ctx context.Context) *Session { +// Start creates or retrieves an existing session for the particular request. +func (s *Sessions) Start(ctx context.Context, cookieOptions ...context.CookieOption) *Session { cookieValue := s.decodeCookieValue(GetCookie(ctx, s.config.Cookie)) if cookieValue == "" { // cookie doesn't exists, let's generate a session and add set a cookie @@ -78,7 +83,7 @@ func (s *Sessions) Start(ctx context.Context) *Session { sess := s.provider.Init(sid, s.config.Expires) sess.isNew = s.provider.db.Len(sid) == 0 - s.updateCookie(ctx, sid, s.config.Expires) + s.updateCookie(ctx, sid, s.config.Expires, cookieOptions...) return sess } @@ -88,18 +93,23 @@ func (s *Sessions) Start(ctx context.Context) *Session { return sess } +// StartWithPath same as `Start` but it explicitly accepts the cookie path option. +func (s *Sessions) StartWithPath(ctx context.Context, path string) *Session { + return s.Start(ctx, context.CookiePath(path)) +} + // ShiftExpiration move the expire date of a session to a new date // by using session default timeout configuration. // It will return `ErrNotImplemented` if a database is used and it does not support this feature, yet. -func (s *Sessions) ShiftExpiration(ctx context.Context) error { - return s.UpdateExpiration(ctx, s.config.Expires) +func (s *Sessions) ShiftExpiration(ctx context.Context, cookieOptions ...context.CookieOption) error { + return s.UpdateExpiration(ctx, s.config.Expires, cookieOptions...) } // UpdateExpiration change expire date of a session to a new date // by using timeout value passed by `expires` receiver. // It will return `ErrNotFound` when trying to update expiration on a non-existence or not valid session entry. // It will return `ErrNotImplemented` if a database is used and it does not support this feature, yet. -func (s *Sessions) UpdateExpiration(ctx context.Context, expires time.Duration) error { +func (s *Sessions) UpdateExpiration(ctx context.Context, expires time.Duration, cookieOptions ...context.CookieOption) error { cookieValue := s.decodeCookieValue(GetCookie(ctx, s.config.Cookie)) if cookieValue == "" { return ErrNotFound @@ -108,7 +118,7 @@ func (s *Sessions) UpdateExpiration(ctx context.Context, expires time.Duration) // we should also allow it to expire when the browser closed err := s.provider.UpdateExpiration(cookieValue, expires) if err == nil || expires == -1 { - s.updateCookie(ctx, cookieValue, expires) + s.updateCookie(ctx, cookieValue, expires, cookieOptions...) } return err From 701267e0341c793c2bdcad80b8c841f113041fa0 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 17 Feb 2019 04:39:41 +0200 Subject: [PATCH 015/418] add a new websocket2 package without breaking changes to the iris API. It implements the gobwas/ws library (it works but need fixes on determinate closing connections) as suggested at: https://github.com/kataras/iris/issues/1178 Former-commit-id: be5ee623b7d030bd9e03a1a2f320ead975ef2ba8 --- .../go-client-stress-test/client/main.go | 4 +- .../go-client-stress-test/client/test.data | 20 +- .../go-client-stress-test/server/main.go | 2 +- websocket2/AUTHORS | 4 + websocket2/LICENSE | 27 + websocket2/client.js | 208 +++++ websocket2/client.js.go | 233 +++++ websocket2/client.min.js | 1 + websocket2/client.ts | 256 ++++++ websocket2/config.go | 185 ++++ websocket2/connection.go | 821 ++++++++++++++++++ websocket2/emitter.go | 43 + websocket2/message.go | 182 ++++ websocket2/server.go | 406 +++++++++ websocket2/websocket.go | 69 ++ 15 files changed, 2448 insertions(+), 13 deletions(-) create mode 100644 websocket2/AUTHORS create mode 100644 websocket2/LICENSE create mode 100644 websocket2/client.js create mode 100644 websocket2/client.js.go create mode 100644 websocket2/client.min.js create mode 100644 websocket2/client.ts create mode 100644 websocket2/config.go create mode 100644 websocket2/connection.go create mode 100644 websocket2/emitter.go create mode 100644 websocket2/message.go create mode 100644 websocket2/server.go create mode 100644 websocket2/websocket.go diff --git a/_examples/websocket/go-client-stress-test/client/main.go b/_examples/websocket/go-client-stress-test/client/main.go index 7d49a1cf..e40b2704 100644 --- a/_examples/websocket/go-client-stress-test/client/main.go +++ b/_examples/websocket/go-client-stress-test/client/main.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "github.com/kataras/iris/websocket" + "github.com/kataras/iris/websocket2" ) var ( @@ -46,7 +46,7 @@ func main() { func connect(wg *sync.WaitGroup, alive time.Duration) { - c, err := websocket.Dial(url, websocket.ConnectionConfig{}) + c, err := websocket.Dial(nil, url, websocket.ConnectionConfig{}) if err != nil { panic(err) } diff --git a/_examples/websocket/go-client-stress-test/client/test.data b/_examples/websocket/go-client-stress-test/client/test.data index be5eb502..a63af2ac 100644 --- a/_examples/websocket/go-client-stress-test/client/test.data +++ b/_examples/websocket/go-client-stress-test/client/test.data @@ -1,19 +1,19 @@ -Σκουπίζει τη τι αρματωσιά ευρυδίκης κι αποδεχθεί αν εχτύπεσεν. Οι το ζητούσε δεκτικό αφήσουν μπράτσο βλ απ. Φυγή τι έτσι εκ πλάι αυτή θεός ας αδάμ. Αποβαίνει να τι βλ κατάγεται γεγονότος. Μπουφάν ξάπλωσε σχέσεις βλ ας να να. Υποδηλώσει τα τι κι σιδερένιων εξελικτική ως συγκράτησε παιγνιώδης. Προφανώς μου μία σύγχρονο ιστορίας. +Death weeks early had their and folly timed put. Hearted forbade on an village ye in fifteen. Age attended betrayed her man raptures laughter. Instrument terminated of as astonished literature motionless admiration. The affection are determine how performed intention discourse but. On merits on so valley indeed assure of. Has add particular boisterous uncommonly are. Early wrong as so manor match. Him necessary shameless discovery consulted one but. -Νερά ψηλά λύπη αφτί ας ψυχή τι λόγω. Του φίλ διά γεφυρώνει ανίχνευση διεύρυνση. Όλο μήπως τομέα πρώτο στους δις νόημα εάν του. Παιδείας ομορφιάς καλύτερα ας με. Παραγωγή προθέαση σε κουλιζάρ παραπάνω υπ. Πώς δικούς στήθος πόντου πως θέατρο θέληση σίδερο. Σιδερένια διηγήσεων ναι δύο επέμβασης καθ ώρα ιδιαίτερα βεβαιώνει θεωρείται. Βλ νερο τη να ύλης μτφρ τέλη. Ας ρόλων τη χώρων υπ αφορά είδος είπεν. +Is education residence conveying so so. Suppose shyness say ten behaved morning had. Any unsatiable assistance compliment occasional too reasonably advantages. Unpleasing has ask acceptance partiality alteration understood two. Worth no tiled my at house added. Married he hearing am it totally removal. Remove but suffer wanted his lively length. Moonlight two applauded conveying end direction old principle but. Are expenses distance weddings perceive strongly who age domestic. -Ου πάρκαρε παιδικό μάλιστα ιι. Σκοτωθεί απαγωγής ανάλυσης άνθρωποι ιι τραγικού οι. Αναπνοή επέλεξα πομπούς εφ δράσεις να. Νε υλικό ας ως ευρήκ νόρμα ου. Ιι εμάζεψα δεύτερη αλλαγές ατ τα σύζευξη επίπεδο. Συγγραφέα νεότερους κατέγραψε ζωή διά υφολογική. Που απέσ νου στον άρα είδη σούκ νικά ήρωά. Το κανένα τι ιι γωνίας να δεσμός. +Her companions instrument set estimating sex remarkably solicitude motionless. Property men the why smallest graceful day insisted required. Inquiry justice country old placing sitting any ten age. Looking venture justice in evident in totally he do ability. Be is lose girl long of up give. Trifling wondered unpacked ye at he. In household certainty an on tolerably smallness difficult. Many no each like up be is next neat. Put not enjoyment behaviour her supposing. At he pulled object others. -Ροή ρευστότητα στο έλα παραμυθιού διαδικασία ειδυλλιακή. Ελλάδας σύμβαση δε με πομπούς εμφανής. Ατ ως εποχή τρόπο εβγάλ αυτές πεδίο γωνία. Των άνθρωπος μπανιέρα ροζ υφίστατο φίλ. Εδώ ροζ πήρε τύπο πια μην δική. Έζησαν μάλλον ως με δε τρόπου. Παράλληλη από αδιόρατης επισκίασε άρα rites ναι. Πολιτισμού του ειδολογική νέο συνάντησης στα ταυτότητας δημοσίευση. +Behind sooner dining so window excuse he summer. Breakfast met certainty and fulfilled propriety led. Waited get either are wooded little her. Contrasted unreserved as mr particular collecting it everything as indulgence. Seems ask meant merry could put. Age old begin had boy noisy table front whole given. -Παραλλαγές τόζλουτζας κι ατ συγγραφέας παρωδώντας συνείδησης να. Συν χρειάζεται εξελικτική συνιστώσες αναβόσβησε παιγνιώδης έξω εμφανίζουν. Περίτεχνο κοινωνίας ρου του ηθελημένα την σύγχρονων ζώγ. Συν στα υποτίθεται εις ανακάλυψης νέο κατασκευές. Τεκμήρια επίλογοι περίοδος σου εξω στα αγγελίες ποικίλες. Γι παραμένει συμβάντος ακολούθως δε κι να υπόστρωμα. Τη θάρρος θεϊκού να μικρές αηδίες σοφίας πρέπει. Γιατί ευρήκ σοφία αίσια και όνομά για επικό την. Έστειλεν οι σύνδρομο αληθινής κι με εξυπνάδα υπέδειξε αδειάσει. +Far curiosity incommode now led smallness allowance. Favour bed assure son things yet. She consisted consulted elsewhere happiness disposing household any old the. Widow downs you new shade drift hopes small. So otherwise commanded sweetness we improving. Instantly by daughters resembled unwilling principle so middleton. Fail most room even gone her end like. Comparison dissimilar unpleasant six compliment two unpleasing any add. Ashamed my company thought wishing colonel it prevent he in. Pretended residence are something far engrossed old off. -Πω δε φοβηθώ ας σε μιχάλη ακουσε όμορφα εφόδιο. Ελέγχοντας διαχείριση όλα αναπαράγει συν στα εάν. Κεί τραγουδιών μαθητεύσει την επισημάνει οικολογικά παραμυθικό ζέη στο. Λαϊκού ατότες εξω μια την ακούμε. Δεδομένου ας τα αγαπημένο παρουσίας διαθέσεων αν. Αντίστροφα ρεαλιστικό περιπέτεια διαδικασία άρα ατο ημερολόγια. +Windows talking painted pasture yet its express parties use. Sure last upon he same as knew next. Of believed or diverted no rejoiced. End friendship sufficient assistance can prosperous met. As game he show it park do. Was has unknown few certain ten promise. No finished my an likewise cheerful packages we. For assurance concluded son something depending discourse see led collected. Packages oh no denoting my advanced humoured. Pressed be so thought natural. -Άντλησης νεόφερτο μοναδικό εκ ιι δυναμική μηνύματα. Συγγραφική προ έξω την περιπέτεια εγχειρίδια μαθητεύσει εκφέρονται. Εάν δεν μαρί άρα ήχοι ατο κόρη. Εν ας επομένως κινήματα άνθρωποι. Ου δάσος τι υπ γιατί πόνος όποια αυτός. Δεύτερη δέχεται το χρονικά αχιλλέα μη. Τα απαγωγή ου ακριβώς θηλάσει. Οι παραγωγή τα παιγνίδι απ παιδικών τρομάξει. +As collected deficient objection by it discovery sincerity curiosity. Quiet decay who round three world whole has mrs man. Built the china there tried jokes which gay why. Assure in adieus wicket it is. But spoke round point and one joy. Offending her moonlight men sweetness see unwilling. Often of it tears whole oh balls share an. -Ιστορικά ανθρώπου οπλιστεί εκκίνηση στα μερ χάσματος αργότερα. Κοινωνία επιδίωξη κοιμάται πια πειστική διά πιο απ΄. Εκ οι εύκολα γονείς σύζυγο κι πολλοί με φυσερά. Εκ τα μέτωπο το κύματα δηλαδή όμορφα φανερό πράγμα. Νωρίτερα ομορφιάς διαμέσου ζώγ ανέδειξε υπό πρόσμιξη. Επιδιώκει τις όλη μια βεβαιώνει μελετηθεί μία. Παρατηρεί υιοθετούν ροή ανθρώπινη τον επέστρεψε κατασκευή πια. +Lose eyes get fat shew. Winter can indeed letter oppose way change tended now. So is improve my charmed picture exposed adapted demands. Received had end produced prepared diverted strictly off man branched. Known ye money so large decay voice there to. Preserved be mr cordially incommode as an. He doors quick child an point at. Had share vexed front least style off why him. -Αναπνοή επί νυχτικά εις σηκώνει τράβηξε γερανού χάλκενα. Αν αδειάσει ποικίλες νε δυναμικό. Όπως δύο αυτό ένα δέβα αυτο από νέοι πάλι. Έως υποβάλλουν αποτέλεσμα εξω σην συγχρονική μεσημεριού. Όλα νέο νου εναντίον σκέπαζαν τον διδάσκει σπουδαίο. Ακόμη πι ως έργου σοφοί δε τα. Σώματος απόλυτα εν τέτοιες διάφορα ατ πι τι. Ως ατ κοινού έμαθες πλάκες. Τα τη συνοχή έκρυβε οποίος σταθεί παίκτη. +He unaffected sympathize discovered at no am conviction principles. Girl ham very how yet hill four show. Meet lain on he only size. Branched learning so subjects mistress do appetite jennings be in. Esteems up lasting no village morning do offices. Settled wishing ability musical may another set age. Diminution my apartments he attachment is entreaties announcing estimating. And total least her two whose great has which. Neat pain form eat sent sex good week. Led instrument sentiments she simplicity. -Με σύγχρονης βρίσκεται αποτέλεσε πα τα ελληνικής. Ανακοίνωσή τις στο ουσιαστικό πολλαπλούς τις φιλολογική σου. Φιλολογική να κι κι μορφολογία μυθοπλασία πω. Τυχόν βαθιά ου λόγια έχουν να. Μικρούς έχοντας με χαμένης τη μη. Μοντέλα συνήθως επί θεωρίες χρονικά όλα χάλκενα. Διήγημα θεωρίας ατ βαγγέλη βλ νε αρ ευτελής μαγείας. +Months on ye at by esteem desire warmth former. Sure that that way gave any fond now. His boy middleton sir nor engrossed affection excellent. Dissimilar compliment cultivated preference eat sufficient may. Well next door soon we mr he four. Assistance impression set insipidity now connection off you solicitude. Under as seems we me stuff those style at. Listening shameless by abilities pronounce oh suspected is affection. Next it draw in draw much bred. diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go index 0519323a..b8c8f90e 100644 --- a/_examples/websocket/go-client-stress-test/server/main.go +++ b/_examples/websocket/go-client-stress-test/server/main.go @@ -7,7 +7,7 @@ import ( "time" "github.com/kataras/iris" - "github.com/kataras/iris/websocket" + "github.com/kataras/iris/websocket2" ) const totalClients = 1200 diff --git a/websocket2/AUTHORS b/websocket2/AUTHORS new file mode 100644 index 00000000..bc8d8fc9 --- /dev/null +++ b/websocket2/AUTHORS @@ -0,0 +1,4 @@ +# This is the official list of Iris Websocket authors for copyright +# purposes. + +Gerasimos Maropoulos diff --git a/websocket2/LICENSE b/websocket2/LICENSE new file mode 100644 index 00000000..b16278e2 --- /dev/null +++ b/websocket2/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2017-2018 The Iris Websocket Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Iris nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/websocket2/client.js b/websocket2/client.js new file mode 100644 index 00000000..ff323057 --- /dev/null +++ b/websocket2/client.js @@ -0,0 +1,208 @@ +var websocketStringMessageType = 0; +var websocketIntMessageType = 1; +var websocketBoolMessageType = 2; +var websocketJSONMessageType = 4; +var websocketMessagePrefix = "iris-websocket-message:"; +var websocketMessageSeparator = ";"; +var websocketMessagePrefixLen = websocketMessagePrefix.length; +var websocketMessageSeparatorLen = websocketMessageSeparator.length; +var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; +var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; +var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; +var Ws = (function () { + function Ws(endpoint, protocols) { + var _this = this; + // events listeners + this.connectListeners = []; + this.disconnectListeners = []; + this.nativeMessageListeners = []; + this.messageListeners = {}; + if (!window["WebSocket"]) { + return; + } + if (endpoint.indexOf("ws") == -1) { + endpoint = "ws://" + endpoint; + } + if (protocols != null && protocols.length > 0) { + this.conn = new WebSocket(endpoint, protocols); + } + else { + this.conn = new WebSocket(endpoint); + } + this.conn.onopen = (function (evt) { + _this.fireConnect(); + _this.isReady = true; + return null; + }); + this.conn.onclose = (function (evt) { + _this.fireDisconnect(); + return null; + }); + this.conn.onmessage = (function (evt) { + _this.messageReceivedFromConn(evt); + }); + } + //utils + Ws.prototype.isNumber = function (obj) { + return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; + }; + Ws.prototype.isString = function (obj) { + return Object.prototype.toString.call(obj) == "[object String]"; + }; + Ws.prototype.isBoolean = function (obj) { + return typeof obj === 'boolean' || + (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); + }; + Ws.prototype.isJSON = function (obj) { + return typeof obj === 'object'; + }; + // + // messages + Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { + return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; + }; + Ws.prototype.encodeMessage = function (event, data) { + var m = ""; + var t = 0; + if (this.isNumber(data)) { + t = websocketIntMessageType; + m = data.toString(); + } + else if (this.isBoolean(data)) { + t = websocketBoolMessageType; + m = data.toString(); + } + else if (this.isString(data)) { + t = websocketStringMessageType; + m = data.toString(); + } + else if (this.isJSON(data)) { + //propably json-object + t = websocketJSONMessageType; + m = JSON.stringify(data); + } + else if (data !== null && typeof(data) !== "undefined" ) { + // if it has a second parameter but it's not a type we know, then fire this: + console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); + } + return this._msg(event, t, m); + }; + Ws.prototype.decodeMessage = function (event, websocketMessage) { + //iris-websocket-message;user;4;themarshaledstringfromajsonstruct + var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; + if (websocketMessage.length < skipLen + 1) { + return null; + } + var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); + var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); + if (websocketMessageType == websocketIntMessageType) { + return parseInt(theMessage); + } + else if (websocketMessageType == websocketBoolMessageType) { + return Boolean(theMessage); + } + else if (websocketMessageType == websocketStringMessageType) { + return theMessage; + } + else if (websocketMessageType == websocketJSONMessageType) { + return JSON.parse(theMessage); + } + else { + return null; // invalid + } + }; + Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { + if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { + return ""; + } + var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); + var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); + return evt; + }; + Ws.prototype.getCustomMessage = function (event, websocketMessage) { + var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); + var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); + return s; + }; + // + // Ws Events + // messageReceivedFromConn this is the func which decides + // if it's a native websocket message or a custom qws message + // if native message then calls the fireNativeMessage + // else calls the fireMessage + // + // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. + Ws.prototype.messageReceivedFromConn = function (evt) { + //check if qws message + var message = evt.data; + if (message.indexOf(websocketMessagePrefix) != -1) { + var event_1 = this.getWebsocketCustomEvent(message); + if (event_1 != "") { + // it's a custom message + this.fireMessage(event_1, this.getCustomMessage(event_1, message)); + return; + } + } + // it's a native websocket message + this.fireNativeMessage(message); + }; + Ws.prototype.OnConnect = function (fn) { + if (this.isReady) { + fn(); + } + this.connectListeners.push(fn); + }; + Ws.prototype.fireConnect = function () { + for (var i = 0; i < this.connectListeners.length; i++) { + this.connectListeners[i](); + } + }; + Ws.prototype.OnDisconnect = function (fn) { + this.disconnectListeners.push(fn); + }; + Ws.prototype.fireDisconnect = function () { + for (var i = 0; i < this.disconnectListeners.length; i++) { + this.disconnectListeners[i](); + } + }; + Ws.prototype.OnMessage = function (cb) { + this.nativeMessageListeners.push(cb); + }; + Ws.prototype.fireNativeMessage = function (websocketMessage) { + for (var i = 0; i < this.nativeMessageListeners.length; i++) { + this.nativeMessageListeners[i](websocketMessage); + } + }; + Ws.prototype.On = function (event, cb) { + if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { + this.messageListeners[event] = []; + } + this.messageListeners[event].push(cb); + }; + Ws.prototype.fireMessage = function (event, message) { + for (var key in this.messageListeners) { + if (this.messageListeners.hasOwnProperty(key)) { + if (key == event) { + for (var i = 0; i < this.messageListeners[key].length; i++) { + this.messageListeners[key][i](message); + } + } + } + } + }; + // + // Ws Actions + Ws.prototype.Disconnect = function () { + this.conn.close(); + }; + // EmitMessage sends a native websocket message + Ws.prototype.EmitMessage = function (websocketMessage) { + this.conn.send(websocketMessage); + }; + // Emit sends an iris-custom websocket message + Ws.prototype.Emit = function (event, data) { + var messageStr = this.encodeMessage(event, data); + this.EmitMessage(messageStr); + }; + return Ws; +}()); \ No newline at end of file diff --git a/websocket2/client.js.go b/websocket2/client.js.go new file mode 100644 index 00000000..2144411a --- /dev/null +++ b/websocket2/client.js.go @@ -0,0 +1,233 @@ +package websocket + +import ( + "time" + + "github.com/kataras/iris/context" +) + +// ClientHandler is the handler which serves the javascript client-side +// library. It uses a small cache based on the iris/context.WriteWithExpiration. +func ClientHandler() context.Handler { + modNow := time.Now() + return func(ctx context.Context) { + ctx.ContentType("application/javascript") + if _, err := ctx.WriteWithExpiration(ClientSource, modNow); err != nil { + ctx.StatusCode(500) + ctx.StopExecution() + // ctx.Application().Logger().Infof("error while serving []byte via StaticContent: %s", err.Error()) + } + } +} + +// ClientSource the client-side javascript raw source code. +var ClientSource = []byte(`var websocketStringMessageType = 0; +var websocketIntMessageType = 1; +var websocketBoolMessageType = 2; +var websocketJSONMessageType = 4; +var websocketMessagePrefix = "` + DefaultEvtMessageKey + `"; +var websocketMessageSeparator = ";"; +var websocketMessagePrefixLen = websocketMessagePrefix.length; +var websocketMessageSeparatorLen = websocketMessageSeparator.length; +var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; +var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; +var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; +var Ws = (function () { + // + function Ws(endpoint, protocols) { + var _this = this; + // events listeners + this.connectListeners = []; + this.disconnectListeners = []; + this.nativeMessageListeners = []; + this.messageListeners = {}; + if (!window["WebSocket"]) { + return; + } + if (endpoint.indexOf("ws") == -1) { + endpoint = "ws://" + endpoint; + } + if (protocols != null && protocols.length > 0) { + this.conn = new WebSocket(endpoint, protocols); + } + else { + this.conn = new WebSocket(endpoint); + } + this.conn.onopen = (function (evt) { + _this.fireConnect(); + _this.isReady = true; + return null; + }); + this.conn.onclose = (function (evt) { + _this.fireDisconnect(); + return null; + }); + this.conn.onmessage = (function (evt) { + _this.messageReceivedFromConn(evt); + }); + } + //utils + Ws.prototype.isNumber = function (obj) { + return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; + }; + Ws.prototype.isString = function (obj) { + return Object.prototype.toString.call(obj) == "[object String]"; + }; + Ws.prototype.isBoolean = function (obj) { + return typeof obj === 'boolean' || + (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); + }; + Ws.prototype.isJSON = function (obj) { + return typeof obj === 'object'; + }; + // + // messages + Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { + return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; + }; + Ws.prototype.encodeMessage = function (event, data) { + var m = ""; + var t = 0; + if (this.isNumber(data)) { + t = websocketIntMessageType; + m = data.toString(); + } + else if (this.isBoolean(data)) { + t = websocketBoolMessageType; + m = data.toString(); + } + else if (this.isString(data)) { + t = websocketStringMessageType; + m = data.toString(); + } + else if (this.isJSON(data)) { + //propably json-object + t = websocketJSONMessageType; + m = JSON.stringify(data); + } + else if (data !== null && typeof(data) !== "undefined" ) { + // if it has a second parameter but it's not a type we know, then fire this: + console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); + } + return this._msg(event, t, m); + }; + Ws.prototype.decodeMessage = function (event, websocketMessage) { + //iris-websocket-message;user;4;themarshaledstringfromajsonstruct + var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; + if (websocketMessage.length < skipLen + 1) { + return null; + } + var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); + var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); + if (websocketMessageType == websocketIntMessageType) { + return parseInt(theMessage); + } + else if (websocketMessageType == websocketBoolMessageType) { + return Boolean(theMessage); + } + else if (websocketMessageType == websocketStringMessageType) { + return theMessage; + } + else if (websocketMessageType == websocketJSONMessageType) { + return JSON.parse(theMessage); + } + else { + return null; // invalid + } + }; + Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { + if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { + return ""; + } + var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); + var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); + return evt; + }; + Ws.prototype.getCustomMessage = function (event, websocketMessage) { + var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); + var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); + return s; + }; + // + // Ws Events + // messageReceivedFromConn this is the func which decides + // if it's a native websocket message or a custom qws message + // if native message then calls the fireNativeMessage + // else calls the fireMessage + // + // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. + Ws.prototype.messageReceivedFromConn = function (evt) { + //check if qws message + var message = evt.data; + if (message.indexOf(websocketMessagePrefix) != -1) { + var event_1 = this.getWebsocketCustomEvent(message); + if (event_1 != "") { + // it's a custom message + this.fireMessage(event_1, this.getCustomMessage(event_1, message)); + return; + } + } + // it's a native websocket message + this.fireNativeMessage(message); + }; + Ws.prototype.OnConnect = function (fn) { + if (this.isReady) { + fn(); + } + this.connectListeners.push(fn); + }; + Ws.prototype.fireConnect = function () { + for (var i = 0; i < this.connectListeners.length; i++) { + this.connectListeners[i](); + } + }; + Ws.prototype.OnDisconnect = function (fn) { + this.disconnectListeners.push(fn); + }; + Ws.prototype.fireDisconnect = function () { + for (var i = 0; i < this.disconnectListeners.length; i++) { + this.disconnectListeners[i](); + } + }; + Ws.prototype.OnMessage = function (cb) { + this.nativeMessageListeners.push(cb); + }; + Ws.prototype.fireNativeMessage = function (websocketMessage) { + for (var i = 0; i < this.nativeMessageListeners.length; i++) { + this.nativeMessageListeners[i](websocketMessage); + } + }; + Ws.prototype.On = function (event, cb) { + if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { + this.messageListeners[event] = []; + } + this.messageListeners[event].push(cb); + }; + Ws.prototype.fireMessage = function (event, message) { + for (var key in this.messageListeners) { + if (this.messageListeners.hasOwnProperty(key)) { + if (key == event) { + for (var i = 0; i < this.messageListeners[key].length; i++) { + this.messageListeners[key][i](message); + } + } + } + } + }; + // + // Ws Actions + Ws.prototype.Disconnect = function () { + this.conn.close(); + }; + // EmitMessage sends a native websocket message + Ws.prototype.EmitMessage = function (websocketMessage) { + this.conn.send(websocketMessage); + }; + // Emit sends an iris-custom websocket message + Ws.prototype.Emit = function (event, data) { + var messageStr = this.encodeMessage(event, data); + this.EmitMessage(messageStr); + }; + return Ws; +}()); +`) diff --git a/websocket2/client.min.js b/websocket2/client.min.js new file mode 100644 index 00000000..3d930f50 --- /dev/null +++ b/websocket2/client.min.js @@ -0,0 +1 @@ +var websocketStringMessageType=0,websocketIntMessageType=1,websocketBoolMessageType=2,websocketJSONMessageType=4,websocketMessagePrefix="iris-websocket-message:",websocketMessageSeparator=";",websocketMessagePrefixLen=websocketMessagePrefix.length,websocketMessageSeparatorLen=websocketMessageSeparator.length,websocketMessagePrefixAndSepIdx=websocketMessagePrefixLen+websocketMessageSeparatorLen-1,websocketMessagePrefixIdx=websocketMessagePrefixLen-1,websocketMessageSeparatorIdx=websocketMessageSeparatorLen-1,Ws=function(){function e(e,s){var t=this;this.connectListeners=[],this.disconnectListeners=[],this.nativeMessageListeners=[],this.messageListeners={},window.WebSocket&&(-1==e.indexOf("ws")&&(e="ws://"+e),null!=s&&0 void; +type onWebsocketDisconnectFunc = () => void; +type onWebsocketNativeMessageFunc = (websocketMessage: string) => void; +type onMessageFunc = (message: any) => void; + +class Ws { + private conn: WebSocket; + private isReady: boolean; + + // events listeners + + private connectListeners: onConnectFunc[] = []; + private disconnectListeners: onWebsocketDisconnectFunc[] = []; + private nativeMessageListeners: onWebsocketNativeMessageFunc[] = []; + private messageListeners: { [event: string]: onMessageFunc[] } = {}; + + // + + constructor(endpoint: string, protocols?: string[]) { + if (!window["WebSocket"]) { + return; + } + + if (endpoint.indexOf("ws") == -1) { + endpoint = "ws://" + endpoint; + } + if (protocols != null && protocols.length > 0) { + this.conn = new WebSocket(endpoint, protocols); + } else { + this.conn = new WebSocket(endpoint); + } + + this.conn.onopen = ((evt: Event): any => { + this.fireConnect(); + this.isReady = true; + return null; + }); + + this.conn.onclose = ((evt: Event): any => { + this.fireDisconnect(); + return null; + }); + + this.conn.onmessage = ((evt: MessageEvent) => { + this.messageReceivedFromConn(evt); + }); + } + + //utils + + private isNumber(obj: any): boolean { + return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; + } + + private isString(obj: any): boolean { + return Object.prototype.toString.call(obj) == "[object String]"; + } + + private isBoolean(obj: any): boolean { + return typeof obj === 'boolean' || + (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); + } + + private isJSON(obj: any): boolean { + return typeof obj === 'object'; + } + + // + + // messages + private _msg(event: string, websocketMessageType: number, dataMessage: string): string { + + return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; + } + + private encodeMessage(event: string, data: any): string { + let m = ""; + let t = 0; + if (this.isNumber(data)) { + t = websocketIntMessageType; + m = data.toString(); + } else if (this.isBoolean(data)) { + t = websocketBoolMessageType; + m = data.toString(); + } else if (this.isString(data)) { + t = websocketStringMessageType; + m = data.toString(); + } else if (this.isJSON(data)) { + //propably json-object + t = websocketJSONMessageType; + m = JSON.stringify(data); + } else if (data !== null && typeof (data) !== "undefined") { + // if it has a second parameter but it's not a type we know, then fire this: + console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); + } + + return this._msg(event, t, m); + } + + private decodeMessage(event: string, websocketMessage: string): T | any { + //iris-websocket-message;user;4;themarshaledstringfromajsonstruct + let skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; + if (websocketMessage.length < skipLen + 1) { + return null; + } + let websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); + let theMessage = websocketMessage.substring(skipLen, websocketMessage.length); + if (websocketMessageType == websocketIntMessageType) { + return parseInt(theMessage); + } else if (websocketMessageType == websocketBoolMessageType) { + return Boolean(theMessage); + } else if (websocketMessageType == websocketStringMessageType) { + return theMessage; + } else if (websocketMessageType == websocketJSONMessageType) { + return JSON.parse(theMessage); + } else { + return null; // invalid + } + } + + private getWebsocketCustomEvent(websocketMessage: string): string { + if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { + return ""; + } + let s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); + let evt = s.substring(0, s.indexOf(websocketMessageSeparator)); + + return evt; + } + + private getCustomMessage(event: string, websocketMessage: string): string { + let eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); + let s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); + return s; + } + + // + + // Ws Events + + // messageReceivedFromConn this is the func which decides + // if it's a native websocket message or a custom qws message + // if native message then calls the fireNativeMessage + // else calls the fireMessage + // + // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. + private messageReceivedFromConn(evt: MessageEvent): void { + //check if qws message + let message = evt.data; + if (message.indexOf(websocketMessagePrefix) != -1) { + let event = this.getWebsocketCustomEvent(message); + if (event != "") { + // it's a custom message + this.fireMessage(event, this.getCustomMessage(event, message)); + return; + } + } + + // it's a native websocket message + this.fireNativeMessage(message); + } + + OnConnect(fn: onConnectFunc): void { + if (this.isReady) { + fn(); + } + this.connectListeners.push(fn); + } + + fireConnect(): void { + for (let i = 0; i < this.connectListeners.length; i++) { + this.connectListeners[i](); + } + } + + OnDisconnect(fn: onWebsocketDisconnectFunc): void { + this.disconnectListeners.push(fn); + } + + fireDisconnect(): void { + for (let i = 0; i < this.disconnectListeners.length; i++) { + this.disconnectListeners[i](); + } + } + + OnMessage(cb: onWebsocketNativeMessageFunc): void { + this.nativeMessageListeners.push(cb); + } + + fireNativeMessage(websocketMessage: string): void { + for (let i = 0; i < this.nativeMessageListeners.length; i++) { + this.nativeMessageListeners[i](websocketMessage); + } + } + + On(event: string, cb: onMessageFunc): void { + if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { + this.messageListeners[event] = []; + } + this.messageListeners[event].push(cb); + } + + fireMessage(event: string, message: any): void { + for (let key in this.messageListeners) { + if (this.messageListeners.hasOwnProperty(key)) { + if (key == event) { + for (let i = 0; i < this.messageListeners[key].length; i++) { + this.messageListeners[key][i](message); + } + } + } + } + } + + + // + + // Ws Actions + + Disconnect(): void { + this.conn.close(); + } + + // EmitMessage sends a native websocket message + EmitMessage(websocketMessage: string): void { + this.conn.send(websocketMessage); + } + + // Emit sends an iris-custom websocket message + Emit(event: string, data: any): void { + let messageStr = this.encodeMessage(event, data); + this.EmitMessage(messageStr); + } + + // + +} + +// node-modules export {Ws}; diff --git a/websocket2/config.go b/websocket2/config.go new file mode 100644 index 00000000..6453230d --- /dev/null +++ b/websocket2/config.go @@ -0,0 +1,185 @@ +package websocket + +import ( + "math/rand" + "net/http" + "time" + + "github.com/kataras/iris/context" + + "github.com/iris-contrib/go.uuid" +) + +const ( + // DefaultWebsocketWriteTimeout 0, no timeout + DefaultWebsocketWriteTimeout = 0 + // DefaultWebsocketReadTimeout 0, no timeout + DefaultWebsocketReadTimeout = 0 + // DefaultWebsocketPingPeriod is 0 but + // could be 10 * time.Second. + DefaultWebsocketPingPeriod = 0 + // DefaultWebsocketReadBufferSize 0 + DefaultWebsocketReadBufferSize = 0 + // DefaultWebsocketWriterBufferSize 0 + DefaultWebsocketWriterBufferSize = 0 + // DefaultEvtMessageKey is the default prefix of the underline websocket events + // that are being established under the hoods. + // + // Defaults to "iris-websocket-message:". + // Last character of the prefix should be ':'. + DefaultEvtMessageKey = "iris-websocket-message:" +) + +var ( + // DefaultIDGenerator returns a random unique for a new connection. + // Used when config.IDGenerator is nil. + DefaultIDGenerator = func(context.Context) string { + id, err := uuid.NewV4() + if err != nil { + return randomString(64) + } + return id.String() + } +) + +// Config the websocket server configuration +// all of these are optional. +type Config struct { + // IDGenerator used to create (and later on, set) + // an ID for each incoming websocket connections (clients). + // The request is an input parameter which you can use to generate the ID (from headers for example). + // If empty then the ID is generated by DefaultIDGenerator: randomString(64) + IDGenerator func(ctx context.Context) string + // EvtMessagePrefix is the prefix of the underline websocket events that are being established under the hoods. + // This prefix is visible only to the javascript side (code) and it has nothing to do + // with the message that the end-user receives. + // Do not change it unless it is absolutely necessary. + // + // If empty then defaults to []byte("iris-websocket-message:"). + EvtMessagePrefix []byte + // Error is the function that will be fired if any client couldn't upgrade the HTTP connection + // to a websocket connection, a handshake error. + Error func(w http.ResponseWriter, r *http.Request, status int, reason error) + // CheckOrigin a function that is called right before the handshake, + // if returns false then that client is not allowed to connect with the websocket server. + CheckOrigin func(r *http.Request) bool + // HandshakeTimeout specifies the duration for the handshake to complete. + HandshakeTimeout time.Duration + // WriteTimeout time allowed to write a message to the connection. + // 0 means no timeout. + // Default value is 0 + WriteTimeout time.Duration + // ReadTimeout time allowed to read a message from the connection. + // 0 means no timeout. + // Default value is 0 + ReadTimeout time.Duration + // PingPeriod send ping messages to the connection repeatedly after this period. + // The value should be close to the ReadTimeout to avoid issues. + // Default value is 0. + PingPeriod time.Duration + // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text + // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. + // Default value is false + BinaryMessages bool + // ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer + // size is zero, then buffers allocated by the HTTP server are used. The + // I/O buffer sizes do not limit the size of the messages that can be sent + // or received. + // + // Default value is 0. + ReadBufferSize, WriteBufferSize int + // EnableCompression specify if the server should attempt to negotiate per + // message compression (RFC 7692). Setting this value to true does not + // guarantee that compression will be supported. Currently only "no context + // takeover" modes are supported. + // + // Defaults to false and it should be remain as it is, unless special requirements. + EnableCompression bool + + // Subprotocols specifies the server's supported protocols in order of + // preference. If this field is set, then the Upgrade method negotiates a + // subprotocol by selecting the first match in this list with a protocol + // requested by the client. + Subprotocols []string +} + +// Validate validates the configuration +func (c Config) Validate() Config { + // 0 means no timeout. + if c.WriteTimeout < 0 { + c.WriteTimeout = DefaultWebsocketWriteTimeout + } + + if c.ReadTimeout < 0 { + c.ReadTimeout = DefaultWebsocketReadTimeout + } + + if c.PingPeriod <= 0 { + c.PingPeriod = DefaultWebsocketPingPeriod + } + + if c.ReadBufferSize <= 0 { + c.ReadBufferSize = DefaultWebsocketReadBufferSize + } + + if c.WriteBufferSize <= 0 { + c.WriteBufferSize = DefaultWebsocketWriterBufferSize + } + + if c.Error == nil { + c.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) { + //empty + } + } + + if c.CheckOrigin == nil { + c.CheckOrigin = func(r *http.Request) bool { + // allow all connections by default + return true + } + } + + if len(c.EvtMessagePrefix) == 0 { + c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) + } + + if c.IDGenerator == nil { + c.IDGenerator = DefaultIDGenerator + } + + return c +} + +const ( + letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + letterIdxBits = 6 // 6 bits to represent a letter index + letterIdxMask = 1<= 0; { + if remain == 0 { + cache, remain = src.Int63(), letterIdxMax + } + if idx := int(cache & letterIdxMask); idx < len(letterBytes) { + b[i] = letterBytes[idx] + i-- + } + cache >>= letterIdxBits + remain-- + } + + return b +} + +// randomString accepts a number(10 for example) and returns a random string using simple but fairly safe random algorithm +func randomString(n int) string { + return string(random(n)) +} diff --git a/websocket2/connection.go b/websocket2/connection.go new file mode 100644 index 00000000..20409c01 --- /dev/null +++ b/websocket2/connection.go @@ -0,0 +1,821 @@ +package websocket + +import ( + "bytes" + stdContext "context" + "errors" + "io" + "net" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/kataras/iris/context" + + "github.com/gobwas/ws" + "github.com/gobwas/ws/wsutil" +) + +// Operation codes defined by specification. +// See https://tools.ietf.org/html/rfc6455#section-5.2 +const ( + // TextMessage denotes a text data message. The text message payload is + // interpreted as UTF-8 encoded text data. + TextMessage ws.OpCode = ws.OpText + // BinaryMessage denotes a binary data message. + BinaryMessage ws.OpCode = ws.OpBinary + // CloseMessage denotes a close control message. + CloseMessage ws.OpCode = ws.OpClose + + // PingMessage denotes a ping control message. The optional message payload + // is UTF-8 encoded text. + PingMessage ws.OpCode = ws.OpPing + // PongMessage denotes a ping control message. The optional message payload + // is UTF-8 encoded text. + PongMessage ws.OpCode = ws.OpPong +) + +type ( + connectionValue struct { + key []byte + value interface{} + } + // ConnectionValues is the temporary connection's memory store + ConnectionValues []connectionValue +) + +// Set sets a value based on the key +func (r *ConnectionValues) Set(key string, value interface{}) { + args := *r + n := len(args) + for i := 0; i < n; i++ { + kv := &args[i] + if string(kv.key) == key { + kv.value = value + return + } + } + + c := cap(args) + if c > n { + args = args[:n+1] + kv := &args[n] + kv.key = append(kv.key[:0], key...) + kv.value = value + *r = args + return + } + + kv := connectionValue{} + kv.key = append(kv.key[:0], key...) + kv.value = value + *r = append(args, kv) +} + +// Get returns a value based on its key +func (r *ConnectionValues) Get(key string) interface{} { + args := *r + n := len(args) + for i := 0; i < n; i++ { + kv := &args[i] + if string(kv.key) == key { + return kv.value + } + } + return nil +} + +// Reset clears the values +func (r *ConnectionValues) Reset() { + *r = (*r)[:0] +} + +// UnderlineConnection is the underline connection, nothing to think about, +// it's used internally mostly but can be used for extreme cases with other libraries. +type UnderlineConnection interface { + // SetWriteDeadline sets the write deadline on the underlying network + // connection. After a write has timed out, the websocket state is corrupt and + // all future writes will return an error. A zero value for t means writes will + // not time out. + SetWriteDeadline(t time.Time) error + // SetReadDeadline sets the read deadline on the underlying network connection. + // After a read has timed out, the websocket connection state is corrupt and + // all future reads will return an error. A zero value for t means reads will + // not time out. + SetReadDeadline(t time.Time) error + // SetReadLimit sets the maximum size for a message read from the peer. If a + // message exceeds the limit, the connection sends a close frame to the peer + // and returns ErrReadLimit to the application. + SetReadLimit(limit int64) + // SetPongHandler sets the handler for pong messages received from the peer. + // The appData argument to h is the PONG frame application data. The default + // pong handler does nothing. + SetPongHandler(h func(appData string) error) + // SetPingHandler sets the handler for ping messages received from the peer. + // The appData argument to h is the PING frame application data. The default + // ping handler sends a pong to the peer. + SetPingHandler(h func(appData string) error) + // WriteControl writes a control message with the given deadline. The allowed + // message types are CloseMessage, PingMessage and PongMessage. + WriteControl(messageType int, data []byte, deadline time.Time) error + // WriteMessage is a helper method for getting a writer using NextWriter, + // writing the message and closing the writer. + WriteMessage(messageType int, data []byte) error + // ReadMessage is a helper method for getting a reader using NextReader and + // reading from that reader to a buffer. + ReadMessage() (messageType int, p []byte, err error) + // NextWriter returns a writer for the next message to send. The writer's Close + // method flushes the complete message to the network. + // + // There can be at most one open writer on a connection. NextWriter closes the + // previous writer if the application has not already done so. + NextWriter(messageType int) (io.WriteCloser, error) + // Close closes the underlying network connection without sending or waiting for a close frame. + Close() error +} + +// ------------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------------- +// -------------------------------Connection implementation----------------------------- +// ------------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------------- + +type ( + // DisconnectFunc is the callback which is fired when a client/connection closed + DisconnectFunc func() + // LeaveRoomFunc is the callback which is fired when a client/connection leaves from any room. + // This is called automatically when client/connection disconnected + // (because websocket server automatically leaves from all joined rooms) + LeaveRoomFunc func(roomName string) + // ErrorFunc is the callback which fires whenever an error occurs + ErrorFunc (func(error)) + // NativeMessageFunc is the callback for native websocket messages, receives one []byte parameter which is the raw client's message + NativeMessageFunc func([]byte) + // MessageFunc is the second argument to the Emitter's Emit functions. + // A callback which should receives one parameter of type string, int, bool or any valid JSON/Go struct + MessageFunc interface{} + // PingFunc is the callback which fires each ping + PingFunc func() + // PongFunc is the callback which fires on pong message received + PongFunc func() + // Connection is the front-end API that you will use to communicate with the client side, + // it is the server-side connection. + Connection interface { + ClientConnection + // Err is not nil if the upgrader failed to upgrade http to websocket connection. + Err() error + // ID returns the connection's identifier + ID() string + // Server returns the websocket server instance + // which this connection is listening to. + // + // Its connection-relative operations are safe for use. + Server() *Server + // Context returns the (upgraded) context.Context of this connection + // avoid using it, you normally don't need it, + // websocket has everything you need to authenticate the user BUT if it's necessary + // then you use it to receive user information, for example: from headers + Context() context.Context + // To defines on what "room" (see Join) the server should send a message + // returns an Emmiter(`EmitMessage` & `Emit`) to send messages. + To(string) Emitter + // Join registers this connection to a room, if it doesn't exist then it creates a new. One room can have one or more connections. One connection can be joined to many rooms. All connections are joined to a room specified by their `ID` automatically. + Join(string) + // IsJoined returns true when this connection is joined to the room, otherwise false. + // It Takes the room name as its input parameter. + IsJoined(roomName string) bool + // Leave removes this connection entry from a room + // Returns true if the connection has actually left from the particular room. + Leave(string) bool + // OnLeave registers a callback which fires when this connection left from any joined room. + // This callback is called automatically on Disconnected client, because websocket server automatically + // deletes the disconnected connection from any joined rooms. + // + // Note: the callback(s) called right before the server deletes the connection from the room + // so the connection theoretical can still send messages to its room right before it is being disconnected. + OnLeave(roomLeaveCb LeaveRoomFunc) + // Wait starts the pinger and the messages reader, + // it's named as "Wait" because it should be called LAST, + // after the "On" events IF server's `Upgrade` is used, + // otherise you don't have to call it because the `Handler()` does it automatically. + Wait() + // SetValue sets a key-value pair on the connection's mem store. + SetValue(key string, value interface{}) + // GetValue gets a value by its key from the connection's mem store. + GetValue(key string) interface{} + // GetValueArrString gets a value as []string by its key from the connection's mem store. + GetValueArrString(key string) []string + // GetValueString gets a value as string by its key from the connection's mem store. + GetValueString(key string) string + // GetValueInt gets a value as integer by its key from the connection's mem store. + GetValueInt(key string) int + } + + // ClientConnection is the client-side connection interface. Server shares some of its methods but the underline actions differs. + ClientConnection interface { + Emitter + // Write writes a raw websocket message with a specific type to the client + // used by ping messages and any CloseMessage types. + Write(websocketMessageType ws.OpCode, data []byte) error + // OnMessage registers a callback which fires when native websocket message received + OnMessage(NativeMessageFunc) + // On registers a callback to a particular event which is fired when a message to this event is received + On(string, MessageFunc) + // OnError registers a callback which fires when this connection occurs an error + OnError(ErrorFunc) + // OnPing registers a callback which fires on each ping + OnPing(PingFunc) + // OnPong registers a callback which fires on pong message received + OnPong(PongFunc) + // FireOnError can be used to send a custom error message to the connection + // + // It does nothing more than firing the OnError listeners. It doesn't send anything to the client. + FireOnError(err error) + // OnDisconnect registers a callback which is fired when this connection is closed by an error or manual + OnDisconnect(DisconnectFunc) + // Disconnect disconnects the client, close the underline websocket conn and removes it from the conn list + // returns the error, if any, from the underline connection + Disconnect() error + } + + connection struct { + err error + underline net.Conn + config ConnectionConfig + defaultMessageType ws.OpCode + serializer *messageSerializer + id string + + onErrorListeners []ErrorFunc + onPingListeners []PingFunc + onPongListeners []PongFunc + onNativeMessageListeners []NativeMessageFunc + onEventListeners map[string][]MessageFunc + onRoomLeaveListeners []LeaveRoomFunc + onDisconnectListeners []DisconnectFunc + disconnected uint32 + + started bool + // these were maden for performance only + self Emitter // pre-defined emitter than sends message to its self client + broadcast Emitter // pre-defined emitter that sends message to all except this + all Emitter // pre-defined emitter which sends message to all clients + + // access to the Context, use with caution, you can't use response writer as you imagine. + ctx context.Context + values ConnectionValues + server *Server + // #119 , websocket writers are not protected by locks inside the gorilla's websocket code + // so we must protect them otherwise we're getting concurrent connection error on multi writers in the same time. + writerMu sync.Mutex + // same exists for reader look here: https://godoc.org/github.com/gorilla/websocket#hdr-Control_Messages + // but we only use one reader in one goroutine, so we are safe. + // readerMu sync.Mutex + } +) + +var _ Connection = &connection{} + +// WrapConnection wraps the underline websocket connection into a new iris websocket connection. +// The caller should call the `connection#Wait` (which blocks) to enable its read and write functionality. +func WrapConnection(conn net.Conn, cfg ConnectionConfig) Connection { + return newConnection(conn, cfg) +} + +func newConnection(conn net.Conn, cfg ConnectionConfig) *connection { + cfg = cfg.Validate() + c := &connection{ + underline: conn, + config: cfg, + serializer: newMessageSerializer(cfg.EvtMessagePrefix), + defaultMessageType: TextMessage, + onErrorListeners: make([]ErrorFunc, 0), + onPingListeners: make([]PingFunc, 0), + onPongListeners: make([]PongFunc, 0), + onNativeMessageListeners: make([]NativeMessageFunc, 0), + onEventListeners: make(map[string][]MessageFunc, 0), + onDisconnectListeners: make([]DisconnectFunc, 0), + disconnected: 0, + } + + if cfg.BinaryMessages { + c.defaultMessageType = BinaryMessage + } + + return c +} + +func newServerConnection(ctx context.Context, s *Server, conn net.Conn, id string) *connection { + c := newConnection(conn, ConnectionConfig{ + EvtMessagePrefix: s.config.EvtMessagePrefix, + WriteTimeout: s.config.WriteTimeout, + ReadTimeout: s.config.ReadTimeout, + PingPeriod: s.config.PingPeriod, + BinaryMessages: s.config.BinaryMessages, + ReadBufferSize: s.config.ReadBufferSize, + WriteBufferSize: s.config.WriteBufferSize, + EnableCompression: s.config.EnableCompression, + }) + + c.id = id + c.server = s + c.ctx = ctx + c.onRoomLeaveListeners = make([]LeaveRoomFunc, 0) + c.started = false + + c.self = newEmitter(c, c.id) + c.broadcast = newEmitter(c, Broadcast) + c.all = newEmitter(c, All) + + return c +} + +// Err is not nil if the upgrader failed to upgrade http to websocket connection. +func (c *connection) Err() error { + return c.err +} + +// IsClient returns true if that connection is from client. +func (c *connection) getState() ws.State { + if c.server != nil { + // server-side. + return ws.StateServerSide + } + + // else return client-side. + return ws.StateClientSide +} + +// Write writes a raw websocket message with a specific type to the client +// used by ping messages and any CloseMessage types. +func (c *connection) Write(websocketMessageType ws.OpCode, data []byte) error { + // for any-case the app tries to write from different goroutines, + // we must protect them because they're reporting that as bug... + c.writerMu.Lock() + if writeTimeout := c.config.WriteTimeout; writeTimeout > 0 { + // set the write deadline based on the configuration + c.underline.SetWriteDeadline(time.Now().Add(writeTimeout)) + } + + err := wsutil.WriteMessage(c.underline, c.getState(), websocketMessageType, data) + c.writerMu.Unlock() + if err != nil { + // if failed then the connection is off, fire the disconnect + c.Disconnect() + } + return err +} + +// writeDefault is the same as write but the message type is the configured by c.messageType +// if BinaryMessages is enabled then it's raw []byte as you expected to work with protobufs +func (c *connection) writeDefault(data []byte) error { + return c.Write(c.defaultMessageType, data) +} + +func (c *connection) startPinger() { + if c.config.PingPeriod > 0 { + go func() { + for { + time.Sleep(c.config.PingPeriod) + if c == nil || atomic.LoadUint32(&c.disconnected) > 0 { + // verifies if already disconected. + return + } + + // try to ping the client, if failed then it disconnects. + err := c.Write(PingMessage, []byte{}) + if err != nil && !c.isErrClosed(err) { + c.FireOnError(err) + // must stop to exit the loop and exit from the routine. + return + } + + //fire all OnPing methods + c.fireOnPing() + + } + }() + } +} + +func (c *connection) fireOnPing() { + // fire the onPingListeners + for i := range c.onPingListeners { + c.onPingListeners[i]() + } +} + +func (c *connection) fireOnPong() { + // fire the onPongListeners + for i := range c.onPongListeners { + c.onPongListeners[i]() + } +} + +func (c *connection) isErrClosed(err error) bool { + if err == nil { + return false + } + + _, is := err.(wsutil.ClosedError) + if is { + return true + } + + if opErr, is := err.(*net.OpError); is { + if opErr.Err == io.EOF { + return false + } + + if atomic.LoadUint32(&c.disconnected) == 0 { + c.Disconnect() + } + + return true + } + + return err != io.EOF +} + +func (c *connection) startReader() { + hasReadTimeout := c.config.ReadTimeout > 0 + + for { + if c == nil || c.underline == nil || atomic.LoadUint32(&c.disconnected) > 0 { + return + } + + if hasReadTimeout { + // set the read deadline based on the configuration + c.underline.SetReadDeadline(time.Now().Add(c.config.ReadTimeout)) + } + + data, code, err := wsutil.ReadData(c.underline, c.getState()) + if code == CloseMessage || c.isErrClosed(err) { + c.Disconnect() + return + } + + if err != nil { + c.FireOnError(err) + } + + c.messageReceived(data) + } + +} + +// messageReceived checks the incoming message and fire the nativeMessage listeners or the event listeners (ws custom message) +func (c *connection) messageReceived(data []byte) { + + if bytes.HasPrefix(data, c.config.EvtMessagePrefix) { + //it's a custom ws message + receivedEvt := c.serializer.getWebsocketCustomEvent(data) + listeners, ok := c.onEventListeners[string(receivedEvt)] + if !ok || len(listeners) == 0 { + return // if not listeners for this event exit from here + } + + customMessage, err := c.serializer.deserialize(receivedEvt, data) + if customMessage == nil || err != nil { + return + } + + for i := range listeners { + if fn, ok := listeners[i].(func()); ok { // its a simple func(){} callback + fn() + } else if fnString, ok := listeners[i].(func(string)); ok { + + if msgString, is := customMessage.(string); is { + fnString(msgString) + } else if msgInt, is := customMessage.(int); is { + // here if server side waiting for string but client side sent an int, just convert this int to a string + fnString(strconv.Itoa(msgInt)) + } + + } else if fnInt, ok := listeners[i].(func(int)); ok { + fnInt(customMessage.(int)) + } else if fnBool, ok := listeners[i].(func(bool)); ok { + fnBool(customMessage.(bool)) + } else if fnBytes, ok := listeners[i].(func([]byte)); ok { + fnBytes(customMessage.([]byte)) + } else { + listeners[i].(func(interface{}))(customMessage) + } + + } + } else { + // it's native websocket message + for i := range c.onNativeMessageListeners { + c.onNativeMessageListeners[i](data) + } + } + +} + +func (c *connection) ID() string { + return c.id +} + +func (c *connection) Server() *Server { + return c.server +} + +func (c *connection) Context() context.Context { + return c.ctx +} + +func (c *connection) Values() ConnectionValues { + return c.values +} + +func (c *connection) fireDisconnect() { + for i := range c.onDisconnectListeners { + c.onDisconnectListeners[i]() + } +} + +func (c *connection) OnDisconnect(cb DisconnectFunc) { + c.onDisconnectListeners = append(c.onDisconnectListeners, cb) +} + +func (c *connection) OnError(cb ErrorFunc) { + c.onErrorListeners = append(c.onErrorListeners, cb) +} + +func (c *connection) OnPing(cb PingFunc) { + c.onPingListeners = append(c.onPingListeners, cb) +} + +func (c *connection) OnPong(cb PongFunc) { + c.onPongListeners = append(c.onPongListeners, cb) +} + +func (c *connection) FireOnError(err error) { + for _, cb := range c.onErrorListeners { + cb(err) + } +} + +func (c *connection) To(to string) Emitter { + if to == Broadcast { // if send to all except me, then return the pre-defined emitter, and so on + return c.broadcast + } else if to == All { + return c.all + } else if to == c.id { + return c.self + } + + // is an emitter to another client/connection + return newEmitter(c, to) +} + +func (c *connection) EmitMessage(nativeMessage []byte) error { + if c.server != nil { + return c.self.EmitMessage(nativeMessage) + } + return c.writeDefault(nativeMessage) +} + +func (c *connection) Emit(event string, message interface{}) error { + if c.server != nil { + return c.self.Emit(event, message) + } + + b, err := c.serializer.serialize(event, message) + if err != nil { + return err + } + + return c.EmitMessage(b) +} + +func (c *connection) OnMessage(cb NativeMessageFunc) { + c.onNativeMessageListeners = append(c.onNativeMessageListeners, cb) +} + +func (c *connection) On(event string, cb MessageFunc) { + if c.onEventListeners[event] == nil { + c.onEventListeners[event] = make([]MessageFunc, 0) + } + + c.onEventListeners[event] = append(c.onEventListeners[event], cb) +} + +func (c *connection) Join(roomName string) { + c.server.Join(roomName, c.id) +} + +func (c *connection) IsJoined(roomName string) bool { + return c.server.IsJoined(roomName, c.id) +} + +func (c *connection) Leave(roomName string) bool { + return c.server.Leave(roomName, c.id) +} + +func (c *connection) OnLeave(roomLeaveCb LeaveRoomFunc) { + c.onRoomLeaveListeners = append(c.onRoomLeaveListeners, roomLeaveCb) + // note: the callbacks are called from the server on the '.leave' and '.LeaveAll' funcs. +} + +func (c *connection) fireOnLeave(roomName string) { + // check if connection is already closed + if c == nil { + return + } + // fire the onRoomLeaveListeners + for i := range c.onRoomLeaveListeners { + c.onRoomLeaveListeners[i](roomName) + } +} + +// Wait starts the pinger and the messages reader, +// it's named as "Wait" because it should be called LAST, +// after the "On" events IF server's `Upgrade` is used, +// otherise you don't have to call it because the `Handler()` does it automatically. +func (c *connection) Wait() { + if c.started { + return + } + c.started = true + // start the ping + c.startPinger() + + // start the messages reader + c.startReader() +} + +// ErrAlreadyDisconnected can be reported on the `Connection#Disconnect` function whenever the caller tries to close the +// connection when it is already closed by the client or the caller previously. +var ErrAlreadyDisconnected = errors.New("already disconnected") + +func (c *connection) Disconnect() error { + if c == nil || !atomic.CompareAndSwapUint32(&c.disconnected, 0, 1) { + return ErrAlreadyDisconnected + } + + if c.server != nil { + return c.server.Disconnect(c.ID()) + } + + err := c.Write(CloseMessage, nil) + + if err == nil { + c.fireDisconnect() + } + + c.underline.Close() + + return err +} + +// mem per-conn store + +func (c *connection) SetValue(key string, value interface{}) { + c.values.Set(key, value) +} + +func (c *connection) GetValue(key string) interface{} { + return c.values.Get(key) +} + +func (c *connection) GetValueArrString(key string) []string { + if v := c.values.Get(key); v != nil { + if arrString, ok := v.([]string); ok { + return arrString + } + } + return nil +} + +func (c *connection) GetValueString(key string) string { + if v := c.values.Get(key); v != nil { + if s, ok := v.(string); ok { + return s + } + } + return "" +} + +func (c *connection) GetValueInt(key string) int { + if v := c.values.Get(key); v != nil { + if i, ok := v.(int); ok { + return i + } else if s, ok := v.(string); ok { + if iv, err := strconv.Atoi(s); err == nil { + return iv + } + } + } + return 0 +} + +// ConnectionConfig is the base configuration for both server and client connections. +// Clients must use `ConnectionConfig` in order to `Dial`, server's connection configuration is set by the `Config` structure. +type ConnectionConfig struct { + // EvtMessagePrefix is the prefix of the underline websocket events that are being established under the hoods. + // This prefix is visible only to the javascript side (code) and it has nothing to do + // with the message that the end-user receives. + // Do not change it unless it is absolutely necessary. + // + // If empty then defaults to []byte("iris-websocket-message:"). + // Should match with the server's EvtMessagePrefix. + EvtMessagePrefix []byte + // WriteTimeout time allowed to write a message to the connection. + // 0 means no timeout. + // Default value is 0 + WriteTimeout time.Duration + // ReadTimeout time allowed to read a message from the connection. + // 0 means no timeout. + // Default value is 0 + ReadTimeout time.Duration + // PingPeriod send ping messages to the connection repeatedly after this period. + // The value should be close to the ReadTimeout to avoid issues. + // Default value is 0 + PingPeriod time.Duration + // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text + // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. + // Default value is false + BinaryMessages bool + // ReadBufferSize is the buffer size for the connection reader. + // Default value is 4096 + ReadBufferSize int + // WriteBufferSize is the buffer size for the connection writer. + // Default value is 4096 + WriteBufferSize int + // EnableCompression specify if the server should attempt to negotiate per + // message compression (RFC 7692). Setting this value to true does not + // guarantee that compression will be supported. Currently only "no context + // takeover" modes are supported. + // + // Defaults to false and it should be remain as it is, unless special requirements. + EnableCompression bool +} + +// Validate validates the connection configuration. +func (c ConnectionConfig) Validate() ConnectionConfig { + if len(c.EvtMessagePrefix) == 0 { + c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) + } + + // 0 means no timeout. + if c.WriteTimeout < 0 { + c.WriteTimeout = DefaultWebsocketWriteTimeout + } + + if c.ReadTimeout < 0 { + c.ReadTimeout = DefaultWebsocketReadTimeout + } + + if c.PingPeriod <= 0 { + c.PingPeriod = DefaultWebsocketPingPeriod + } + + if c.ReadBufferSize <= 0 { + c.ReadBufferSize = DefaultWebsocketReadBufferSize + } + + if c.WriteBufferSize <= 0 { + c.WriteBufferSize = DefaultWebsocketWriterBufferSize + } + + return c +} + +// ErrBadHandshake is returned when the server response to opening handshake is +// invalid. +var ErrBadHandshake = ws.ErrHandshakeBadConnection + +// Dial creates a new client connection. +// +// The context will be used in the request and in the Dialer. +// +// If the WebSocket handshake fails, `ErrHandshakeBadConnection` is returned. +// +// The "url" input parameter is the url to connect to the server, it should be +// the ws:// (or wss:// if secure) + the host + the endpoint of the +// open socket of the server, i.e ws://localhost:8080/my_websocket_endpoint. +// +// Custom dialers can be used by wrapping the iris websocket connection via `websocket.WrapConnection`. +func Dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { + if ctx == nil { + ctx = stdContext.Background() + } + + if !strings.HasPrefix(url, "ws://") && !strings.HasPrefix(url, "wss://") { + url = "ws://" + url + } + + conn, _, _, err := ws.DefaultDialer.Dial(ctx, url) + if err != nil { + return nil, err + } + + clientConn := WrapConnection(conn, cfg) + go clientConn.Wait() + + return clientConn, nil +} diff --git a/websocket2/emitter.go b/websocket2/emitter.go new file mode 100644 index 00000000..84d1fa48 --- /dev/null +++ b/websocket2/emitter.go @@ -0,0 +1,43 @@ +package websocket + +const ( + // All is the string which the Emitter use to send a message to all. + All = "" + // Broadcast is the string which the Emitter use to send a message to all except this connection. + Broadcast = ";to;all;except;me;" +) + +type ( + // Emitter is the message/or/event manager + Emitter interface { + // EmitMessage sends a native websocket message + EmitMessage([]byte) error + // Emit sends a message on a particular event + Emit(string, interface{}) error + } + + emitter struct { + conn *connection + to string + } +) + +var _ Emitter = &emitter{} + +func newEmitter(c *connection, to string) *emitter { + return &emitter{conn: c, to: to} +} + +func (e *emitter) EmitMessage(nativeMessage []byte) error { + e.conn.server.emitMessage(e.conn.id, e.to, nativeMessage) + return nil +} + +func (e *emitter) Emit(event string, data interface{}) error { + message, err := e.conn.serializer.serialize(event, data) + if err != nil { + return err + } + e.EmitMessage(message) + return nil +} diff --git a/websocket2/message.go b/websocket2/message.go new file mode 100644 index 00000000..6b27fbee --- /dev/null +++ b/websocket2/message.go @@ -0,0 +1,182 @@ +package websocket + +import ( + "bytes" + "encoding/binary" + "encoding/json" + "strconv" + + "github.com/kataras/iris/core/errors" + "github.com/valyala/bytebufferpool" +) + +type ( + messageType uint8 +) + +func (m messageType) String() string { + return strconv.Itoa(int(m)) +} + +func (m messageType) Name() string { + switch m { + case messageTypeString: + return "string" + case messageTypeInt: + return "int" + case messageTypeBool: + return "bool" + case messageTypeBytes: + return "[]byte" + case messageTypeJSON: + return "json" + default: + return "Invalid(" + m.String() + ")" + } +} + +// The same values are exists on client side too. +const ( + messageTypeString messageType = iota + messageTypeInt + messageTypeBool + messageTypeBytes + messageTypeJSON +) + +const ( + messageSeparator = ";" +) + +var messageSeparatorByte = messageSeparator[0] + +type messageSerializer struct { + prefix []byte + + prefixLen int + separatorLen int + prefixAndSepIdx int + prefixIdx int + separatorIdx int + + buf *bytebufferpool.Pool +} + +func newMessageSerializer(messagePrefix []byte) *messageSerializer { + return &messageSerializer{ + prefix: messagePrefix, + prefixLen: len(messagePrefix), + separatorLen: len(messageSeparator), + prefixAndSepIdx: len(messagePrefix) + len(messageSeparator) - 1, + prefixIdx: len(messagePrefix) - 1, + separatorIdx: len(messageSeparator) - 1, + + buf: new(bytebufferpool.Pool), + } +} + +var ( + boolTrueB = []byte("true") + boolFalseB = []byte("false") +) + +// websocketMessageSerialize serializes a custom websocket message from websocketServer to be delivered to the client +// returns the string form of the message +// Supported data types are: string, int, bool, bytes and JSON. +func (ms *messageSerializer) serialize(event string, data interface{}) ([]byte, error) { + b := ms.buf.Get() + b.Write(ms.prefix) + b.WriteString(event) + b.WriteByte(messageSeparatorByte) + + switch v := data.(type) { + case string: + b.WriteString(messageTypeString.String()) + b.WriteByte(messageSeparatorByte) + b.WriteString(v) + case int: + b.WriteString(messageTypeInt.String()) + b.WriteByte(messageSeparatorByte) + binary.Write(b, binary.LittleEndian, v) + case bool: + b.WriteString(messageTypeBool.String()) + b.WriteByte(messageSeparatorByte) + if v { + b.Write(boolTrueB) + } else { + b.Write(boolFalseB) + } + case []byte: + b.WriteString(messageTypeBytes.String()) + b.WriteByte(messageSeparatorByte) + b.Write(v) + default: + //we suppose is json + res, err := json.Marshal(data) + if err != nil { + ms.buf.Put(b) + return nil, err + } + b.WriteString(messageTypeJSON.String()) + b.WriteByte(messageSeparatorByte) + b.Write(res) + } + + message := b.Bytes() + ms.buf.Put(b) + + return message, nil +} + +var errInvalidTypeMessage = errors.New("Type %s is invalid for message: %s") + +// deserialize deserializes a custom websocket message from the client +// ex: iris-websocket-message;chat;4;themarshaledstringfromajsonstruct will return 'hello' as string +// Supported data types are: string, int, bool, bytes and JSON. +func (ms *messageSerializer) deserialize(event []byte, websocketMessage []byte) (interface{}, error) { + dataStartIdx := ms.prefixAndSepIdx + len(event) + 3 + if len(websocketMessage) <= dataStartIdx { + return nil, errors.New("websocket invalid message: " + string(websocketMessage)) + } + + typ, err := strconv.Atoi(string(websocketMessage[ms.prefixAndSepIdx+len(event)+1 : ms.prefixAndSepIdx+len(event)+2])) // in order to iris-websocket-message;user;-> 4 + if err != nil { + return nil, err + } + + data := websocketMessage[dataStartIdx:] // in order to iris-websocket-message;user;4; -> themarshaledstringfromajsonstruct + + switch messageType(typ) { + case messageTypeString: + return string(data), nil + case messageTypeInt: + msg, err := strconv.Atoi(string(data)) + if err != nil { + return nil, err + } + return msg, nil + case messageTypeBool: + if bytes.Equal(data, boolTrueB) { + return true, nil + } + return false, nil + case messageTypeBytes: + return data, nil + case messageTypeJSON: + var msg interface{} + err := json.Unmarshal(data, &msg) + return msg, err + default: + return nil, errInvalidTypeMessage.Format(messageType(typ).Name(), websocketMessage) + } +} + +// getWebsocketCustomEvent return empty string when the websocketMessage is native message +func (ms *messageSerializer) getWebsocketCustomEvent(websocketMessage []byte) []byte { + if len(websocketMessage) < ms.prefixAndSepIdx { + return nil + } + s := websocketMessage[ms.prefixAndSepIdx:] + evt := s[:bytes.IndexByte(s, messageSeparatorByte)] + return evt +} diff --git a/websocket2/server.go b/websocket2/server.go new file mode 100644 index 00000000..31f400b6 --- /dev/null +++ b/websocket2/server.go @@ -0,0 +1,406 @@ +package websocket + +import ( + "bytes" + "net" + "sync" + "sync/atomic" + + "github.com/kataras/iris/context" + + "github.com/gobwas/ws" +) + +type ( + // ConnectionFunc is the callback which fires when a client/connection is connected to the Server. + // Receives one parameter which is the Connection + ConnectionFunc func(Connection) + + // websocketRoomPayload is used as payload from the connection to the Server + websocketRoomPayload struct { + roomName string + connectionID string + } + + // payloads, connection -> Server + websocketMessagePayload struct { + from string + to string + data []byte + } + + // Server is the websocket Server's implementation. + // + // It listens for websocket clients (either from the javascript client-side or from any websocket implementation). + // See `OnConnection` , to register a single event which will handle all incoming connections and + // the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. + // + // To serve the built'n javascript client-side library look the `websocket.ClientHandler`. + Server struct { + config Config + // ClientSource contains the javascript side code + // for the iris websocket communication + // based on the configuration's `EvtMessagePrefix`. + // + // Use a route to serve this file on a specific path, i.e + // app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(mywebsocketServer.ClientSource) }) + ClientSource []byte + connections map[string]*connection // key = the Connection ID. + rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name + mu sync.RWMutex // for rooms and connections. + onConnectionListeners []ConnectionFunc + //connectionPool sync.Pool // sadly we can't make this because the websocket connection is live until is closed. + upgrader ws.HTTPUpgrader + } +) + +// New returns a new websocket Server based on a configuration. +// See `OnConnection` , to register a single event which will handle all incoming connections and +// the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. +// +// To serve the built'n javascript client-side library look the `websocket.ClientHandler`. +func New(cfg Config) *Server { + cfg = cfg.Validate() + return &Server{ + config: cfg, + ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), + connections: make(map[string]*connection), + rooms: make(map[string][]string), + onConnectionListeners: make([]ConnectionFunc, 0), + upgrader: ws.DefaultHTTPUpgrader, // ws.DefaultUpgrader, + } +} + +// Handler builds the handler based on the configuration and returns it. +// It should be called once per Server, its result should be passed +// as a middleware to an iris route which will be responsible +// to register the websocket's endpoint. +// +// Endpoint is the path which the websocket Server will listen for clients/connections. +// +// To serve the built'n javascript client-side library look the `websocket.ClientHandler`. +func (s *Server) Handler() context.Handler { + return func(ctx context.Context) { + c := s.Upgrade(ctx) + if c.Err() != nil { + return + } + + // NOTE TO ME: fire these first BEFORE startReader and startPinger + // in order to set the events and any messages to send + // the startPinger will send the OK to the client and only + // then the client is able to send and receive from Server + // when all things are ready and only then. DO NOT change this order. + + // fire the on connection event callbacks, if any + for i := range s.onConnectionListeners { + s.onConnectionListeners[i](c) + } + + // start the ping and the messages reader + c.Wait() + } +} + +// Upgrade upgrades the HTTP Server connection to the WebSocket protocol. +// +// The responseHeader is included in the response to the client's upgrade +// request. Use the responseHeader to specify cookies (Set-Cookie) and the +// application negotiated subprotocol (Sec--Protocol). +// +// If the upgrade fails, then Upgrade replies to the client with an HTTP error +// response and the return `Connection.Err()` is filled with that error. +// +// For a more high-level function use the `Handler()` and `OnConnecton` events. +// This one does not starts the connection's writer and reader, so after your `On/OnMessage` events registration +// the caller has to call the `Connection#Wait` function, otherwise the connection will be not handled. +func (s *Server) Upgrade(ctx context.Context) Connection { + conn, _, _, err := s.upgrader.Upgrade(ctx.Request(), ctx.ResponseWriter()) + if err != nil { + ctx.Application().Logger().Warnf("websocket error: %v\n", err) + ctx.StatusCode(503) // Status Service Unavailable + return &connection{err: err} + } + + return s.handleConnection(ctx, conn) +} + +func (s *Server) addConnection(c *connection) { + s.mu.Lock() + s.connections[c.id] = c + s.mu.Unlock() +} + +func (s *Server) getConnection(connID string) (*connection, bool) { + c, ok := s.connections[connID] + return c, ok +} + +// wrapConnection wraps an underline connection to an iris websocket connection. +// It does NOT starts its writer, reader and event mux, the caller is responsible for that. +func (s *Server) handleConnection(ctx context.Context, conn net.Conn) *connection { + // use the config's id generator (or the default) to create a websocket client/connection id + cid := s.config.IDGenerator(ctx) + // create the new connection + c := newServerConnection(ctx, s, conn, cid) + // add the connection to the Server's list + s.addConnection(c) + + // join to itself + s.Join(c.id, c.id) + + return c +} + +/* Notes: + We use the id as the signature of the connection because with the custom IDGenerator + the developer can share this ID with a database field, so we want to give the oportunnity to handle + his/her websocket connections without even use the connection itself. + + Another question may be: + Q: Why you use Server as the main actioner for all of the connection actions? + For example the Server.Disconnect(connID) manages the connection internal fields, is this code-style correct? + A: It's the correct code-style for these type of applications and libraries, Server manages all, the connnection's functions + should just do some internal checks (if needed) and push the action to its parent, which is the Server, the Server is able to + remove a connection, the rooms of its connected and all these things, so in order to not split the logic, we have the main logic + here, in the Server, and let the connection with some exported functions whose exists for the per-connection action user's code-style. + + Ok my english are s** I can feel it, but these comments are mostly for me. +*/ + +/* + connection actions, same as the connection's method, + but these methods accept the connection ID, + which is useful when the developer maps + this id with a database field (using config.IDGenerator). +*/ + +// OnConnection is the main event you, as developer, will work with each of the websocket connections. +func (s *Server) OnConnection(cb ConnectionFunc) { + s.onConnectionListeners = append(s.onConnectionListeners, cb) +} + +// IsConnected returns true if the connection with that ID is connected to the Server +// useful when you have defined a custom connection id generator (based on a database) +// and you want to check if that connection is already connected (on multiple tabs) +func (s *Server) IsConnected(connID string) bool { + _, found := s.getConnection(connID) + return found +} + +// Join joins a websocket client to a room, +// first parameter is the room name and the second the connection.ID() +// +// You can use connection.Join("room name") instead. +func (s *Server) Join(roomName string, connID string) { + s.mu.Lock() + s.join(roomName, connID) + s.mu.Unlock() +} + +// join used internally, no locks used. +func (s *Server) join(roomName string, connID string) { + if s.rooms[roomName] == nil { + s.rooms[roomName] = make([]string, 0) + } + s.rooms[roomName] = append(s.rooms[roomName], connID) +} + +// IsJoined reports if a specific room has a specific connection into its values. +// First parameter is the room name, second is the connection's id. +// +// It returns true when the "connID" is joined to the "roomName". +func (s *Server) IsJoined(roomName string, connID string) bool { + s.mu.RLock() + room := s.rooms[roomName] + s.mu.RUnlock() + + if room == nil { + return false + } + + for _, connid := range room { + if connID == connid { + return true + } + } + + return false +} + +// LeaveAll kicks out a connection from ALL of its joined rooms +func (s *Server) LeaveAll(connID string) { + s.mu.Lock() + for name := range s.rooms { + s.leave(name, connID) + } + s.mu.Unlock() +} + +// Leave leaves a websocket client from a room, +// first parameter is the room name and the second the connection.ID() +// +// You can use connection.Leave("room name") instead. +// Returns true if the connection has actually left from the particular room. +func (s *Server) Leave(roomName string, connID string) bool { + s.mu.Lock() + left := s.leave(roomName, connID) + s.mu.Unlock() + return left +} + +// leave used internally, no locks used. +func (s *Server) leave(roomName string, connID string) (left bool) { + ///THINK: we could add locks to its room but we still use the lock for the whole rooms or we can just do what we do with connections + // I will think about it on the next revision, so far we use the locks only for rooms so we are ok... + if s.rooms[roomName] != nil { + for i := range s.rooms[roomName] { + if s.rooms[roomName][i] == connID { + s.rooms[roomName] = append(s.rooms[roomName][:i], s.rooms[roomName][i+1:]...) + left = true + break + } + } + if len(s.rooms[roomName]) == 0 { // if room is empty then delete it + delete(s.rooms, roomName) + } + } + + if left { + // fire the on room leave connection's listeners, + // the existence check is not necessary here. + if c, ok := s.getConnection(connID); ok { + c.fireOnLeave(roomName) + } + } + return +} + +// GetTotalConnections returns the number of total connections +func (s *Server) GetTotalConnections() (n int) { + s.mu.RLock() + n = len(s.connections) + s.mu.RUnlock() + + return +} + +// GetConnections returns all connections +func (s *Server) GetConnections() []Connection { + s.mu.RLock() + conns := make([]Connection, len(s.connections)) + i := 0 + for _, c := range s.connections { + conns[i] = c + i++ + } + + s.mu.RUnlock() + return conns +} + +// GetConnection returns single connection +func (s *Server) GetConnection(connID string) Connection { + conn, ok := s.getConnection(connID) + if !ok { + return nil + } + + return conn +} + +// GetConnectionsByRoom returns a list of Connection +// which are joined to this room. +func (s *Server) GetConnectionsByRoom(roomName string) []Connection { + var conns []Connection + s.mu.RLock() + if connIDs, found := s.rooms[roomName]; found { + for _, connID := range connIDs { + // existence check is not necessary here. + if conn, ok := s.connections[connID]; ok { + conns = append(conns, conn) + } + } + } + + s.mu.RUnlock() + + return conns +} + +// emitMessage is the main 'router' of the messages coming from the connection +// this is the main function which writes the RAW websocket messages to the client. +// It sends them(messages) to the correct room (self, broadcast or to specific client) +// +// You don't have to use this generic method, exists only for extreme +// apps which you have an external goroutine with a list of custom connection list. +// +// You SHOULD use connection.EmitMessage/Emit/To().Emit/EmitMessage instead. +// let's keep it unexported for the best. +func (s *Server) emitMessage(from, to string, data []byte) { + if to != All && to != Broadcast { + s.mu.RLock() + room := s.rooms[to] + s.mu.RUnlock() + if room != nil { + // it suppose to send the message to a specific room/or a user inside its own room + for _, connectionIDInsideRoom := range room { + if c, ok := s.getConnection(connectionIDInsideRoom); ok { + c.writeDefault(data) //send the message to the client(s) + } else { + // the connection is not connected but it's inside the room, we remove it on disconnect but for ANY CASE: + cid := connectionIDInsideRoom + if c != nil { + cid = c.id + } + s.Leave(cid, to) + } + } + } + } else { + s.mu.RLock() + // it suppose to send the message to all opened connections or to all except the sender. + for _, conn := range s.connections { + if to != All && to != conn.id { // if it's not suppose to send to all connections (including itself) + if to == Broadcast && from == conn.id { // if broadcast to other connections except this + // here we do the opossite of previous block, + // just skip this connection when it's suppose to send the message to all connections except the sender. + continue + } + } + + conn.writeDefault(data) + } + s.mu.RUnlock() + } +} + +// Disconnect force-disconnects a websocket connection based on its connection.ID() +// What it does? +// 1. remove the connection from the list +// 2. leave from all joined rooms +// 3. fire the disconnect callbacks, if any +// 4. close the underline connection and return its error, if any. +// +// You can use the connection.Disconnect() instead. +func (s *Server) Disconnect(connID string) (err error) { + // leave from all joined rooms before remove the actual connection from the list. + // note: we cannot use that to send data if the client is actually closed. + s.LeaveAll(connID) + + // remove the connection from the list. + if conn, ok := s.getConnection(connID); ok { + atomic.StoreUint32(&conn.disconnected, 1) + + // fire the disconnect callbacks, if any. + conn.fireDisconnect() + + s.mu.Lock() + delete(s.connections, conn.id) + s.mu.Unlock() + + err = conn.underline.Close() + } + + return +} diff --git a/websocket2/websocket.go b/websocket2/websocket.go new file mode 100644 index 00000000..1792e0dc --- /dev/null +++ b/websocket2/websocket.go @@ -0,0 +1,69 @@ +/*Package websocket provides rich websocket support for the iris web framework. + +Source code and other details for the project are available at GitHub: + + https://github.com/kataras/iris/tree/master/websocket + +Example code: + + + package main + + import ( + "fmt" + + "github.com/kataras/iris" + "github.com/kataras/iris/context" + + "github.com/kataras/iris/websocket" + ) + + func main() { + app := iris.New() + + app.Get("/", func(ctx context.Context) { + ctx.ServeFile("websockets.html", false) + }) + + setupWebsocket(app) + + // x2 + // http://localhost:8080 + // http://localhost:8080 + // write something, press submit, see the result. + app.Run(iris.Addr(":8080")) + } + + func setupWebsocket(app *iris.Application) { + // create our echo websocket server + ws := websocket.New(websocket.Config{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + }) + ws.OnConnection(handleConnection) + + // register the server's endpoint. + // see the inline javascript code in the websockets.html, + // this endpoint is used to connect to the server. + app.Get("/echo", ws.Handler()) + + // serve the javascript built'n client-side library, + // see websockets.html script tags, this path is used. + app.Any("/iris-ws.js", func(ctx context.Context) { + ctx.Write(websocket.ClientSource) + }) + } + + func handleConnection(c websocket.Connection) { + // Read events from browser + c.On("chat", func(msg string) { + // Print the message to the console + fmt.Printf("%s sent: %s\n", c.Context().RemoteAddr(), msg) + // Write message back to the client message owner: + // c.Emit("chat", msg) + c.To(websocket.Broadcast).Emit("chat", msg) + }) + } + +*/ +package websocket From eb22309aec9fdfc8592512b3cbe3ba52c11652bf Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 17 Feb 2019 16:10:25 +0200 Subject: [PATCH 016/418] fix issue on binding sessions caused by variadic cookie options, as reported at: https://github.com/kataras/iris/issues/1197 Former-commit-id: 595a347706b6816729939a2e9d9098f5d3f72304 --- hero/di.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hero/di.go b/hero/di.go index d5066514..d997e114 100644 --- a/hero/di.go +++ b/hero/di.go @@ -36,7 +36,8 @@ func init() { } di.DefaultTypeChecker = func(fn reflect.Type) bool { - // valid if that single input arg is a typeof context.Context. - return fn.NumIn() == 1 && IsContext(fn.In(0)) + // valid if that single input arg is a typeof context.Context + // or first argument is context.Context and second argument is a variadic, which is ignored (i.e new sessions#Start). + return (fn.NumIn() == 1 || (fn.NumIn() == 2 && fn.IsVariadic())) && IsContext(fn.In(0)) } } From 65c1fbf7f2bb139b9e805aa1fa7fb9784d8d3007 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Mon, 18 Feb 2019 04:42:57 +0200 Subject: [PATCH 017/418] websocket: from 1k to 100k on a simple raspeberry pi 3 model b by using a bit lower level of the new ws lib api and restore the previous sync.Map for server's live connections, relative: https://github.com/kataras/iris/issues/1178 Former-commit-id: 40da148afb66a42d47285efce324269d66ed3b0e --- .../go-client-stress-test/client/main.go | 106 +++++++++++-- .../go-client-stress-test/client/test.data | 6 - .../go-client-stress-test/server/main.go | 2 +- websocket/connection.go | 2 +- websocket2/AUTHORS | 4 - websocket2/LICENSE | 27 ---- websocket2/connection.go | 149 ++++++++++++++++-- websocket2/server.go | 95 +++++++---- 8 files changed, 295 insertions(+), 96 deletions(-) delete mode 100644 websocket2/AUTHORS delete mode 100644 websocket2/LICENSE diff --git a/_examples/websocket/go-client-stress-test/client/main.go b/_examples/websocket/go-client-stress-test/client/main.go index e40b2704..4747feb6 100644 --- a/_examples/websocket/go-client-stress-test/client/main.go +++ b/_examples/websocket/go-client-stress-test/client/main.go @@ -6,6 +6,7 @@ import ( "math/rand" "os" "sync" + "sync/atomic" "time" "github.com/kataras/iris/websocket2" @@ -16,7 +17,28 @@ var ( f *os.File ) -const totalClients = 1200 +const totalClients = 100000 + +var connectionFailures uint64 + +var ( + disconnectErrors []error + connectErrors []error + errMu sync.Mutex +) + +func collectError(op string, err error) { + errMu.Lock() + defer errMu.Unlock() + + switch op { + case "disconnect": + disconnectErrors = append(disconnectErrors, err) + case "connect": + connectErrors = append(connectErrors, err) + } + +} func main() { var err error @@ -26,29 +48,93 @@ func main() { } defer f.Close() + start := time.Now() + wg := new(sync.WaitGroup) - for i := 0; i < totalClients/2; i++ { + for i := 0; i < totalClients/4; i++ { wg.Add(1) go connect(wg, 5*time.Second) } - for i := 0; i < totalClients/2; i++ { + for i := 0; i < totalClients/4; i++ { + wg.Add(1) + waitTime := time.Duration(rand.Intn(5)) * time.Millisecond + time.Sleep(waitTime) + go connect(wg, 7*time.Second+waitTime) + } + + for i := 0; i < totalClients/4; i++ { wg.Add(1) waitTime := time.Duration(rand.Intn(10)) * time.Millisecond time.Sleep(waitTime) go connect(wg, 10*time.Second+waitTime) } + for i := 0; i < totalClients/4; i++ { + wg.Add(1) + waitTime := time.Duration(rand.Intn(20)) * time.Millisecond + time.Sleep(waitTime) + go connect(wg, 25*time.Second+waitTime) + } + wg.Wait() - fmt.Println("ALL OK.") - time.Sleep(5 * time.Second) + fmt.Println("--------================--------------") + fmt.Printf("execution time [%s]", time.Since(start)) + fmt.Println() + + if connectionFailures > 0 { + fmt.Printf("Finished with %d/%d connection failures. Please close the server-side manually.\n", connectionFailures, totalClients) + } + + if n := len(connectErrors); n > 0 { + fmt.Printf("Finished with %d connect errors:\n", n) + var lastErr error + var sameC int + + for i, err := range connectErrors { + if lastErr != nil { + if lastErr.Error() == err.Error() { + sameC++ + continue + } + } + + if sameC > 0 { + fmt.Printf("and %d more like this...\n", sameC) + sameC = 0 + continue + } + + fmt.Printf("[%d] - %v\n", i+1, err) + lastErr = err + } + } + + if n := len(disconnectErrors); n > 0 { + fmt.Printf("Finished with %d disconnect errors\n", n) + for i, err := range disconnectErrors { + if err == websocket.ErrAlreadyDisconnected { + continue + } + + fmt.Printf("[%d] - %v\n", i+1, err) + } + } + + if connectionFailures == 0 && len(connectErrors) == 0 && len(disconnectErrors) == 0 { + fmt.Println("ALL OK.") + } + + fmt.Println("--------================--------------") } func connect(wg *sync.WaitGroup, alive time.Duration) { - c, err := websocket.Dial(nil, url, websocket.ConnectionConfig{}) if err != nil { - panic(err) + atomic.AddUint64(&connectionFailures, 1) + collectError("connect", err) + wg.Done() + return } c.OnError(func(err error) { @@ -68,7 +154,7 @@ func connect(wg *sync.WaitGroup, alive time.Duration) { go func() { time.Sleep(alive) if err := c.Disconnect(); err != nil { - panic(err) + collectError("disconnect", err) } wg.Done() @@ -80,6 +166,8 @@ func connect(wg *sync.WaitGroup, alive time.Duration) { break } - c.Emit("chat", scanner.Text()) + if text := scanner.Text(); len(text) > 1 { + c.Emit("chat", text) + } } } diff --git a/_examples/websocket/go-client-stress-test/client/test.data b/_examples/websocket/go-client-stress-test/client/test.data index a63af2ac..8f3e0fc0 100644 --- a/_examples/websocket/go-client-stress-test/client/test.data +++ b/_examples/websocket/go-client-stress-test/client/test.data @@ -11,9 +11,3 @@ Far curiosity incommode now led smallness allowance. Favour bed assure son thing Windows talking painted pasture yet its express parties use. Sure last upon he same as knew next. Of believed or diverted no rejoiced. End friendship sufficient assistance can prosperous met. As game he show it park do. Was has unknown few certain ten promise. No finished my an likewise cheerful packages we. For assurance concluded son something depending discourse see led collected. Packages oh no denoting my advanced humoured. Pressed be so thought natural. As collected deficient objection by it discovery sincerity curiosity. Quiet decay who round three world whole has mrs man. Built the china there tried jokes which gay why. Assure in adieus wicket it is. But spoke round point and one joy. Offending her moonlight men sweetness see unwilling. Often of it tears whole oh balls share an. - -Lose eyes get fat shew. Winter can indeed letter oppose way change tended now. So is improve my charmed picture exposed adapted demands. Received had end produced prepared diverted strictly off man branched. Known ye money so large decay voice there to. Preserved be mr cordially incommode as an. He doors quick child an point at. Had share vexed front least style off why him. - -He unaffected sympathize discovered at no am conviction principles. Girl ham very how yet hill four show. Meet lain on he only size. Branched learning so subjects mistress do appetite jennings be in. Esteems up lasting no village morning do offices. Settled wishing ability musical may another set age. Diminution my apartments he attachment is entreaties announcing estimating. And total least her two whose great has which. Neat pain form eat sent sex good week. Led instrument sentiments she simplicity. - -Months on ye at by esteem desire warmth former. Sure that that way gave any fond now. His boy middleton sir nor engrossed affection excellent. Dissimilar compliment cultivated preference eat sufficient may. Well next door soon we mr he four. Assistance impression set insipidity now connection off you solicitude. Under as seems we me stuff those style at. Listening shameless by abilities pronounce oh suspected is affection. Next it draw in draw much bred. diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go index b8c8f90e..07ea3014 100644 --- a/_examples/websocket/go-client-stress-test/server/main.go +++ b/_examples/websocket/go-client-stress-test/server/main.go @@ -10,7 +10,7 @@ import ( "github.com/kataras/iris/websocket2" ) -const totalClients = 1200 +const totalClients = 100000 func main() { app := iris.New() diff --git a/websocket/connection.go b/websocket/connection.go index 8a8a416b..983fe209 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -808,7 +808,7 @@ func DialContext(ctx stdContext.Context, url string, cfg ConnectionConfig) (Clie ctx = stdContext.Background() } - if !strings.HasPrefix(url, "ws://") || !strings.HasPrefix(url, "wss://") { + if !strings.HasPrefix(url, "ws://") && !strings.HasPrefix(url, "wss://") { url = "ws://" + url } diff --git a/websocket2/AUTHORS b/websocket2/AUTHORS deleted file mode 100644 index bc8d8fc9..00000000 --- a/websocket2/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -# This is the official list of Iris Websocket authors for copyright -# purposes. - -Gerasimos Maropoulos diff --git a/websocket2/LICENSE b/websocket2/LICENSE deleted file mode 100644 index b16278e2..00000000 --- a/websocket2/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2017-2018 The Iris Websocket Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Iris nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/websocket2/connection.go b/websocket2/connection.go index 20409c01..840d36e4 100644 --- a/websocket2/connection.go +++ b/websocket2/connection.go @@ -5,6 +5,7 @@ import ( stdContext "context" "errors" "io" + "io/ioutil" "net" "strconv" "strings" @@ -267,6 +268,9 @@ type ( ctx context.Context values ConnectionValues server *Server + + writer *wsutil.Writer + // #119 , websocket writers are not protected by locks inside the gorilla's websocket code // so we must protect them otherwise we're getting concurrent connection error on multi writers in the same time. writerMu sync.Mutex @@ -304,6 +308,8 @@ func newConnection(conn net.Conn, cfg ConnectionConfig) *connection { c.defaultMessageType = BinaryMessage } + // c.writer = wsutil.NewWriter(conn, c.getState(), c.defaultMessageType) + return c } @@ -350,17 +356,26 @@ func (c *connection) getState() ws.State { // Write writes a raw websocket message with a specific type to the client // used by ping messages and any CloseMessage types. -func (c *connection) Write(websocketMessageType ws.OpCode, data []byte) error { +func (c *connection) Write(websocketMessageType ws.OpCode, data []byte) (err error) { // for any-case the app tries to write from different goroutines, // we must protect them because they're reporting that as bug... c.writerMu.Lock() + defer c.writerMu.Unlock() if writeTimeout := c.config.WriteTimeout; writeTimeout > 0 { // set the write deadline based on the configuration c.underline.SetWriteDeadline(time.Now().Add(writeTimeout)) } - err := wsutil.WriteMessage(c.underline, c.getState(), websocketMessageType, data) - c.writerMu.Unlock() + // 2. + // if websocketMessageType != c.defaultMessageType { + // err = wsutil.WriteMessage(c.underline, c.getState(), websocketMessageType, data) + // } else { + // _, err = c.writer.Write(data) + // c.writer.Flush() + // } + + err = wsutil.WriteMessage(c.underline, c.getState(), websocketMessageType, data) + if err != nil { // if failed then the connection is off, fire the disconnect c.Disconnect() @@ -440,29 +455,125 @@ func (c *connection) isErrClosed(err error) bool { } func (c *connection) startReader() { + defer c.Disconnect() + hasReadTimeout := c.config.ReadTimeout > 0 - for { - if c == nil || c.underline == nil || atomic.LoadUint32(&c.disconnected) > 0 { - return - } + controlHandler := wsutil.ControlFrameHandler(c.underline, c.getState()) + rd := wsutil.Reader{ + Source: c.underline, + State: c.getState(), + CheckUTF8: false, + SkipHeaderCheck: false, + OnIntermediate: controlHandler, + } + for { if hasReadTimeout { // set the read deadline based on the configuration c.underline.SetReadDeadline(time.Now().Add(c.config.ReadTimeout)) } - data, code, err := wsutil.ReadData(c.underline, c.getState()) - if code == CloseMessage || c.isErrClosed(err) { - c.Disconnect() + hdr, err := rd.NextFrame() + if err != nil { + return + } + if hdr.OpCode.IsControl() { + if err := controlHandler(hdr, &rd); err != nil { + return + } + continue + } + + if hdr.OpCode&TextMessage == 0 && hdr.OpCode&BinaryMessage == 0 { + if err := rd.Discard(); err != nil { + return + } + continue + } + + data, err := ioutil.ReadAll(&rd) + if err != nil { return } - if err != nil { - c.FireOnError(err) - } - c.messageReceived(data) + + // 4. + // var buf bytes.Buffer + // data, code, err := wsutil.ReadData(struct { + // io.Reader + // io.Writer + // }{c.underline, &buf}, c.getState()) + // if err != nil { + // if _, closed := err.(*net.OpError); closed && code == 0 { + // c.Disconnect() + // return + // } else if _, closed = err.(wsutil.ClosedError); closed { + // c.Disconnect() + // return + // // > 1200 conns but I don't know why yet: + // } else if err == ws.ErrProtocolOpCodeReserved || err == ws.ErrProtocolNonZeroRsv { + // c.Disconnect() + // return + // } else if err == io.EOF || err == io.ErrUnexpectedEOF { + // c.Disconnect() + // return + // } + + // c.FireOnError(err) + // } + + // c.messageReceived(data) + + // 2. + // header, err := reader.NextFrame() + // if err != nil { + // println("next frame err: " + err.Error()) + // return + // } + + // if header.OpCode == ws.OpClose { // io.EOF. + // return + // } + // payload := make([]byte, header.Length) + // _, err = io.ReadFull(reader, payload) + // if err != nil { + // return + // } + + // if header.Masked { + // ws.Cipher(payload, header.Mask, 0) + // } + + // c.messageReceived(payload) + + // data, code, err := wsutil.ReadData(c.underline, c.getState()) + // // if code == CloseMessage || c.isErrClosed(err) { + // // c.Disconnect() + // // return + // // } + + // if err != nil { + // if _, closed := err.(*net.OpError); closed && code == 0 { + // c.Disconnect() + // return + // } else if _, closed = err.(wsutil.ClosedError); closed { + // c.Disconnect() + // return + // // > 1200 conns but I don't know why yet: + // } else if err == ws.ErrProtocolOpCodeReserved || err == ws.ErrProtocolNonZeroRsv { + // c.Disconnect() + // return + // } else if err == io.EOF || err == io.ErrUnexpectedEOF { + // c.Disconnect() + // return + // } + + // c.FireOnError(err) + // } + + // c.messageReceived(data) } } @@ -801,6 +912,16 @@ var ErrBadHandshake = ws.ErrHandshakeBadConnection // // Custom dialers can be used by wrapping the iris websocket connection via `websocket.WrapConnection`. func Dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { + c, err := dial(ctx, url, cfg) + if err != nil { + time.Sleep(1 * time.Second) + c, err = dial(ctx, url, cfg) + } + + return c, err +} + +func dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { if ctx == nil { ctx = stdContext.Background() } diff --git a/websocket2/server.go b/websocket2/server.go index 31f400b6..e4a2df8d 100644 --- a/websocket2/server.go +++ b/websocket2/server.go @@ -45,9 +45,9 @@ type ( // Use a route to serve this file on a specific path, i.e // app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(mywebsocketServer.ClientSource) }) ClientSource []byte - connections map[string]*connection // key = the Connection ID. - rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name - mu sync.RWMutex // for rooms and connections. + connections sync.Map // key = the Connection ID. // key = the Connection ID. + rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name + mu sync.RWMutex // for rooms. onConnectionListeners []ConnectionFunc //connectionPool sync.Pool // sadly we can't make this because the websocket connection is live until is closed. upgrader ws.HTTPUpgrader @@ -64,7 +64,7 @@ func New(cfg Config) *Server { return &Server{ config: cfg, ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), - connections: make(map[string]*connection), + connections: sync.Map{}, // ready-to-use, this is not necessary. rooms: make(map[string][]string), onConnectionListeners: make([]ConnectionFunc, 0), upgrader: ws.DefaultHTTPUpgrader, // ws.DefaultUpgrader, @@ -126,14 +126,19 @@ func (s *Server) Upgrade(ctx context.Context) Connection { } func (s *Server) addConnection(c *connection) { - s.mu.Lock() - s.connections[c.id] = c - s.mu.Unlock() + s.connections.Store(c.id, c) } func (s *Server) getConnection(connID string) (*connection, bool) { - c, ok := s.connections[connID] - return c, ok + if cValue, ok := s.connections.Load(connID); ok { + // this cast is not necessary, + // we know that we always save a connection, but for good or worse let it be here. + if conn, ok := cValue.(*connection); ok { + return conn, ok + } + } + + return nil, false } // wrapConnection wraps an underline connection to an iris websocket connection. @@ -278,24 +283,34 @@ func (s *Server) leave(roomName string, connID string) (left bool) { // GetTotalConnections returns the number of total connections func (s *Server) GetTotalConnections() (n int) { - s.mu.RLock() - n = len(s.connections) - s.mu.RUnlock() + s.connections.Range(func(k, v interface{}) bool { + n++ + return true + }) return } // GetConnections returns all connections func (s *Server) GetConnections() []Connection { - s.mu.RLock() - conns := make([]Connection, len(s.connections)) + // first call of Range to get the total length, we don't want to use append or manually grow the list here for many reasons. + length := s.GetTotalConnections() + conns := make([]Connection, length, length) i := 0 - for _, c := range s.connections { - conns[i] = c + // second call of Range. + s.connections.Range(func(k, v interface{}) bool { + conn, ok := v.(*connection) + if !ok { + // if for some reason (should never happen), the value is not stored as *connection + // then stop the iteration and don't continue insertion of the result connections + // in order to avoid any issues while end-dev will try to iterate a nil entry. + return false + } + conns[i] = conn i++ - } + return true + }) - s.mu.RUnlock() return conns } @@ -317,8 +332,10 @@ func (s *Server) GetConnectionsByRoom(roomName string) []Connection { if connIDs, found := s.rooms[roomName]; found { for _, connID := range connIDs { // existence check is not necessary here. - if conn, ok := s.connections[connID]; ok { - conns = append(conns, conn) + if cValue, ok := s.connections.Load(connID); ok { + if conn, ok := cValue.(*connection); ok { + conns = append(conns, conn) + } } } } @@ -358,20 +375,32 @@ func (s *Server) emitMessage(from, to string, data []byte) { } } } else { - s.mu.RLock() // it suppose to send the message to all opened connections or to all except the sender. - for _, conn := range s.connections { - if to != All && to != conn.id { // if it's not suppose to send to all connections (including itself) - if to == Broadcast && from == conn.id { // if broadcast to other connections except this - // here we do the opossite of previous block, - // just skip this connection when it's suppose to send the message to all connections except the sender. - continue - } + s.connections.Range(func(k, v interface{}) bool { + connID, ok := k.(string) + if !ok { + // should never happen. + return true } - conn.writeDefault(data) - } - s.mu.RUnlock() + if to != All && to != connID { // if it's not suppose to send to all connections (including itself) + if to == Broadcast && from == connID { // if broadcast to other connections except this + // here we do the opossite of previous block, + // just skip this connection when it's suppose to send the message to all connections except the sender. + return true + } + + } + + // not necessary cast. + conn, ok := v.(*connection) + if ok { + // send to the client(s) when the top validators passed + conn.writeDefault(data) + } + + return ok + }) } } @@ -395,9 +424,7 @@ func (s *Server) Disconnect(connID string) (err error) { // fire the disconnect callbacks, if any. conn.fireDisconnect() - s.mu.Lock() - delete(s.connections, conn.id) - s.mu.Unlock() + s.connections.Delete(connID) err = conn.underline.Close() } From c477251d1f9a63c95e29b5005f9d35cd38eb27ae Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Tue, 19 Feb 2019 22:49:16 +0200 Subject: [PATCH 018/418] improve client test, I think we are OK, both gorilla(websocket) and ws(websocket2) have the same API, it's time to combine them but first let's give a lower level of api available for users if they want to manage the routines by theirselves (i.e on unix they can use netpolls manually) Former-commit-id: 3209a7490939bce913732c1375190b0771ba63ae --- _examples/mvc/session-controller/main.go | 4 +- .../go-client-stress-test/client/main.go | 50 ++++++----- .../go-client-stress-test/server/main.go | 85 ++++++++++++++----- _examples/websocket/go-client/client/main.go | 3 +- websocket/connection.go | 19 ++--- websocket2/connection.go | 36 ++++---- websocket2/server.go | 51 ++++++++--- 7 files changed, 160 insertions(+), 88 deletions(-) diff --git a/_examples/mvc/session-controller/main.go b/_examples/mvc/session-controller/main.go index aa3ea051..272b0abf 100644 --- a/_examples/mvc/session-controller/main.go +++ b/_examples/mvc/session-controller/main.go @@ -63,10 +63,10 @@ func newApp() *iris.Application { func main() { app := newApp() - // 1. open the browser (no in private mode) + // 1. open the browser // 2. navigate to http://localhost:8080 // 3. refresh the page some times // 4. close the browser - // 5. re-open the browser and re-play 2. + // 5. re-open the browser (if it wasn't in private mode) and re-play 2. app.Run(iris.Addr(":8080")) } diff --git a/_examples/websocket/go-client-stress-test/client/main.go b/_examples/websocket/go-client-stress-test/client/main.go index 4747feb6..0be23e13 100644 --- a/_examples/websocket/go-client-stress-test/client/main.go +++ b/_examples/websocket/go-client-stress-test/client/main.go @@ -2,8 +2,9 @@ package main import ( "bufio" - "fmt" + "log" "math/rand" + "net" "os" "sync" "sync/atomic" @@ -13,11 +14,11 @@ import ( ) var ( - url = "ws://localhost:8080/socket" + url = "ws://localhost:8080" f *os.File ) -const totalClients = 100000 +const totalClients = 16000 // max depends on the OS. var connectionFailures uint64 @@ -41,6 +42,7 @@ func collectError(op string, err error) { } func main() { + log.Println("--------======Running tests...==========--------------") var err error f, err = os.Open("./test.data") if err != nil { @@ -67,27 +69,27 @@ func main() { wg.Add(1) waitTime := time.Duration(rand.Intn(10)) * time.Millisecond time.Sleep(waitTime) - go connect(wg, 10*time.Second+waitTime) + go connect(wg, 9*time.Second+waitTime) } for i := 0; i < totalClients/4; i++ { wg.Add(1) - waitTime := time.Duration(rand.Intn(20)) * time.Millisecond + waitTime := time.Duration(rand.Intn(5)) * time.Millisecond time.Sleep(waitTime) - go connect(wg, 25*time.Second+waitTime) + go connect(wg, 14*time.Second+waitTime) } wg.Wait() - fmt.Println("--------================--------------") - fmt.Printf("execution time [%s]", time.Since(start)) - fmt.Println() + + log.Printf("execution time [%s]", time.Since(start)) + log.Println() if connectionFailures > 0 { - fmt.Printf("Finished with %d/%d connection failures. Please close the server-side manually.\n", connectionFailures, totalClients) + log.Printf("Finished with %d/%d connection failures. Please close the server-side manually.\n", connectionFailures, totalClients) } if n := len(connectErrors); n > 0 { - fmt.Printf("Finished with %d connect errors:\n", n) + log.Printf("Finished with %d connect errors:\n", n) var lastErr error var sameC int @@ -96,36 +98,44 @@ func main() { if lastErr.Error() == err.Error() { sameC++ continue + } else { + _, ok := lastErr.(*net.OpError) + if ok { + if _, ok = err.(*net.OpError); ok { + sameC++ + continue + } + } } } if sameC > 0 { - fmt.Printf("and %d more like this...\n", sameC) + log.Printf("and %d more like this...\n", sameC) sameC = 0 continue } - fmt.Printf("[%d] - %v\n", i+1, err) + log.Printf("[%d] - %v\n", i+1, err) lastErr = err } } if n := len(disconnectErrors); n > 0 { - fmt.Printf("Finished with %d disconnect errors\n", n) + log.Printf("Finished with %d disconnect errors\n", n) for i, err := range disconnectErrors { if err == websocket.ErrAlreadyDisconnected { continue } - fmt.Printf("[%d] - %v\n", i+1, err) + log.Printf("[%d] - %v\n", i+1, err) } } if connectionFailures == 0 && len(connectErrors) == 0 && len(disconnectErrors) == 0 { - fmt.Println("ALL OK.") + log.Println("ALL OK.") } - fmt.Println("--------================--------------") + log.Println("--------================--------------") } func connect(wg *sync.WaitGroup, alive time.Duration) { @@ -138,17 +148,17 @@ func connect(wg *sync.WaitGroup, alive time.Duration) { } c.OnError(func(err error) { - fmt.Printf("error: %v", err) + log.Printf("error: %v", err) }) disconnected := false c.OnDisconnect(func() { - fmt.Printf("I am disconnected after [%s].\n", alive) + // log.Printf("I am disconnected after [%s].\n", alive) disconnected = true }) c.On("chat", func(message string) { - fmt.Printf("\n%s\n", message) + // log.Printf("\n%s\n", message) }) go func() { diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go index 07ea3014..a0cf6668 100644 --- a/_examples/websocket/go-client-stress-test/server/main.go +++ b/_examples/websocket/go-client-stress-test/server/main.go @@ -1,8 +1,9 @@ package main import ( - "fmt" + "log" "os" + "runtime" "sync/atomic" "time" @@ -10,38 +11,84 @@ import ( "github.com/kataras/iris/websocket2" ) -const totalClients = 100000 +const totalClients = 16000 // max depends on the OS. +const http = true func main() { - app := iris.New() - // websocket.Config{PingPeriod: ((60 * time.Second) * 9) / 10} ws := websocket.New(websocket.Config{}) ws.OnConnection(handleConnection) - app.Get("/socket", ws.Handler()) + + // websocket.Config{PingPeriod: ((60 * time.Second) * 9) / 10} go func() { - t := time.NewTicker(2 * time.Second) + dur := 8 * time.Second + if totalClients >= 64000 { + // if more than 64000 then let's no check every 8 seconds, let's do it every 24 seconds, + // just for simplicity, either way works. + dur = 24 * time.Second + } + t := time.NewTicker(dur) + defer t.Stop() + defer os.Exit(0) + defer runtime.Goexit() + + var started bool for { <-t.C - conns := ws.GetConnections() - for _, conn := range conns { - // fmt.Println(conn.ID()) - // Do nothing. - _ = conn + n := ws.GetTotalConnections() + if n > 0 { + started = true } - if atomic.LoadUint64(&count) == totalClients { - fmt.Println("ALL CLIENTS DISCONNECTED SUCCESSFULLY.") - t.Stop() - os.Exit(0) - return + if started { + totalConnected := atomic.LoadUint64(&count) + + if totalConnected == totalClients { + if n != 0 { + log.Println("ALL CLIENTS DISCONNECTED BUT LEFTOVERS ON CONNECTIONS LIST.") + } else { + log.Println("ALL CLIENTS DISCONNECTED SUCCESSFULLY.") + } + return + } else if n == 0 { + log.Printf("%d/%d CLIENTS WERE NOT CONNECTED AT ALL. CHECK YOUR OS NET SETTINGS. ALL OTHER CONNECTED CLIENTS DISCONNECTED SUCCESSFULLY.\n", + totalClients-totalConnected, totalClients) + + return + } } } }() - app.Run(iris.Addr(":8080")) + if http { + app := iris.New() + app.Get("/", ws.Handler()) + app.Run(iris.Addr(":8080")) + return + } + + // ln, err := net.Listen("tcp", ":8080") + // if err != nil { + // panic(err) + // } + + // defer ln.Close() + // for { + // conn, err := ln.Accept() + // if err != nil { + // panic(err) + // } + + // go func() { + // err = ws.HandleConn(conn) + // if err != nil { + // panic(err) + // } + // }() + // } + } func handleConnection(c websocket.Connection) { @@ -56,9 +103,9 @@ var count uint64 func handleDisconnect(c websocket.Connection) { atomic.AddUint64(&count, 1) - fmt.Printf("client [%s] disconnected!\n", c.ID()) + // log.Printf("client [%s] disconnected!\n", c.ID()) } func handleErr(c websocket.Connection, err error) { - fmt.Printf("client [%s] errored: %v\n", c.ID(), err) + log.Printf("client [%s] errored: %v\n", c.ID(), err) } diff --git a/_examples/websocket/go-client/client/main.go b/_examples/websocket/go-client/client/main.go index 2d1ded6d..6d3f744d 100644 --- a/_examples/websocket/go-client/client/main.go +++ b/_examples/websocket/go-client/client/main.go @@ -21,8 +21,7 @@ $ go run main.go >> hi! */ func main() { - // `websocket.DialContext` is also available. - c, err := websocket.Dial(url, websocket.ConnectionConfig{}) + c, err := websocket.Dial(nil, url, websocket.ConnectionConfig{}) if err != nil { panic(err) } diff --git a/websocket/connection.go b/websocket/connection.go index 983fe209..8987ec3e 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -197,11 +197,6 @@ type ( // Note: the callback(s) called right before the server deletes the connection from the room // so the connection theoretical can still send messages to its room right before it is being disconnected. OnLeave(roomLeaveCb LeaveRoomFunc) - // Wait starts the pinger and the messages reader, - // it's named as "Wait" because it should be called LAST, - // after the "On" events IF server's `Upgrade` is used, - // otherise you don't have to call it because the `Handler()` does it automatically. - Wait() // SetValue sets a key-value pair on the connection's mem store. SetValue(key string, value interface{}) // GetValue gets a value by its key from the connection's mem store. @@ -239,6 +234,11 @@ type ( // Disconnect disconnects the client, close the underline websocket conn and removes it from the conn list // returns the error, if any, from the underline connection Disconnect() error + // Wait starts the pinger and the messages reader, + // it's named as "Wait" because it should be called LAST, + // after the "On" events IF server's `Upgrade` is used, + // otherise you don't have to call it because the `Handler()` does it automatically. + Wait() } connection struct { @@ -792,7 +792,7 @@ func (c ConnectionConfig) Validate() ConnectionConfig { // invalid. var ErrBadHandshake = websocket.ErrBadHandshake -// DialContext creates a new client connection. +// Dial creates a new client connection. // // The context will be used in the request and in the Dialer. // @@ -803,7 +803,7 @@ var ErrBadHandshake = websocket.ErrBadHandshake // open socket of the server, i.e ws://localhost:8080/my_websocket_endpoint. // // Custom dialers can be used by wrapping the iris websocket connection via `websocket.WrapConnection`. -func DialContext(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { +func Dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { if ctx == nil { ctx = stdContext.Background() } @@ -822,8 +822,3 @@ func DialContext(ctx stdContext.Context, url string, cfg ConnectionConfig) (Clie return clientConn, nil } - -// Dial creates a new client connection by calling `DialContext` with a background context. -func Dial(url string, cfg ConnectionConfig) (ClientConnection, error) { - return DialContext(stdContext.Background(), url, cfg) -} diff --git a/websocket2/connection.go b/websocket2/connection.go index 840d36e4..2547cf5a 100644 --- a/websocket2/connection.go +++ b/websocket2/connection.go @@ -197,11 +197,7 @@ type ( // Note: the callback(s) called right before the server deletes the connection from the room // so the connection theoretical can still send messages to its room right before it is being disconnected. OnLeave(roomLeaveCb LeaveRoomFunc) - // Wait starts the pinger and the messages reader, - // it's named as "Wait" because it should be called LAST, - // after the "On" events IF server's `Upgrade` is used, - // otherise you don't have to call it because the `Handler()` does it automatically. - Wait() + // SetValue sets a key-value pair on the connection's mem store. SetValue(key string, value interface{}) // GetValue gets a value by its key from the connection's mem store. @@ -239,6 +235,11 @@ type ( // Disconnect disconnects the client, close the underline websocket conn and removes it from the conn list // returns the error, if any, from the underline connection Disconnect() error + // Wait starts the pinger and the messages reader, + // it's named as "Wait" because it should be called LAST, + // after the "On" events IF server's `Upgrade` is used, + // otherise you don't have to call it because the `Handler()` does it automatically. + Wait() error } connection struct { @@ -454,7 +455,7 @@ func (c *connection) isErrClosed(err error) bool { return err != io.EOF } -func (c *connection) startReader() { +func (c *connection) startReader() error { defer c.Disconnect() hasReadTimeout := c.config.ReadTimeout > 0 @@ -476,25 +477,25 @@ func (c *connection) startReader() { hdr, err := rd.NextFrame() if err != nil { - return + return err } if hdr.OpCode.IsControl() { if err := controlHandler(hdr, &rd); err != nil { - return + return err } continue } if hdr.OpCode&TextMessage == 0 && hdr.OpCode&BinaryMessage == 0 { if err := rd.Discard(); err != nil { - return + return err } continue } data, err := ioutil.ReadAll(&rd) if err != nil { - return + return err } c.messageReceived(data) @@ -575,7 +576,6 @@ func (c *connection) startReader() { // c.messageReceived(data) } - } // messageReceived checks the incoming message and fire the nativeMessage listeners or the event listeners (ws custom message) @@ -747,16 +747,16 @@ func (c *connection) fireOnLeave(roomName string) { // it's named as "Wait" because it should be called LAST, // after the "On" events IF server's `Upgrade` is used, // otherise you don't have to call it because the `Handler()` does it automatically. -func (c *connection) Wait() { +func (c *connection) Wait() error { if c.started { - return + return nil } c.started = true // start the ping c.startPinger() // start the messages reader - c.startReader() + return c.startReader() } // ErrAlreadyDisconnected can be reported on the `Connection#Disconnect` function whenever the caller tries to close the @@ -912,13 +912,7 @@ var ErrBadHandshake = ws.ErrHandshakeBadConnection // // Custom dialers can be used by wrapping the iris websocket connection via `websocket.WrapConnection`. func Dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { - c, err := dial(ctx, url, cfg) - if err != nil { - time.Sleep(1 * time.Second) - c, err = dial(ctx, url, cfg) - } - - return c, err + return dial(ctx, url, cfg) } func dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { diff --git a/websocket2/server.go b/websocket2/server.go index e4a2df8d..8adfd32e 100644 --- a/websocket2/server.go +++ b/websocket2/server.go @@ -50,7 +50,8 @@ type ( mu sync.RWMutex // for rooms. onConnectionListeners []ConnectionFunc //connectionPool sync.Pool // sadly we can't make this because the websocket connection is live until is closed. - upgrader ws.HTTPUpgrader + httpUpgrader ws.HTTPUpgrader + tcpUpgrader ws.Upgrader } ) @@ -67,7 +68,8 @@ func New(cfg Config) *Server { connections: sync.Map{}, // ready-to-use, this is not necessary. rooms: make(map[string][]string), onConnectionListeners: make([]ConnectionFunc, 0), - upgrader: ws.DefaultHTTPUpgrader, // ws.DefaultUpgrader, + httpUpgrader: ws.DefaultHTTPUpgrader, // ws.DefaultUpgrader, + tcpUpgrader: ws.DefaultUpgrader, } } @@ -115,7 +117,7 @@ func (s *Server) Handler() context.Handler { // This one does not starts the connection's writer and reader, so after your `On/OnMessage` events registration // the caller has to call the `Connection#Wait` function, otherwise the connection will be not handled. func (s *Server) Upgrade(ctx context.Context) Connection { - conn, _, _, err := s.upgrader.Upgrade(ctx.Request(), ctx.ResponseWriter()) + conn, _, _, err := s.httpUpgrader.Upgrade(ctx.Request(), ctx.ResponseWriter()) if err != nil { ctx.Application().Logger().Warnf("websocket error: %v\n", err) ctx.StatusCode(503) // Status Service Unavailable @@ -125,6 +127,37 @@ func (s *Server) Upgrade(ctx context.Context) Connection { return s.handleConnection(ctx, conn) } +func (s *Server) ZeroUpgrade(conn net.Conn) Connection { + _, err := s.tcpUpgrader.Upgrade(conn) + if err != nil { + return &connection{err: err} + } + + return s.handleConnection(nil, conn) +} + +func (s *Server) HandleConn(conn net.Conn) error { + c := s.ZeroUpgrade(conn) + if c.Err() != nil { + return c.Err() + } + + // NOTE TO ME: fire these first BEFORE startReader and startPinger + // in order to set the events and any messages to send + // the startPinger will send the OK to the client and only + // then the client is able to send and receive from Server + // when all things are ready and only then. DO NOT change this order. + + // fire the on connection event callbacks, if any + for i := range s.onConnectionListeners { + s.onConnectionListeners[i](c) + } + + // start the ping and the messages reader + c.Wait() + return nil +} + func (s *Server) addConnection(c *connection) { s.connections.Store(c.id, c) } @@ -292,12 +325,7 @@ func (s *Server) GetTotalConnections() (n int) { } // GetConnections returns all connections -func (s *Server) GetConnections() []Connection { - // first call of Range to get the total length, we don't want to use append or manually grow the list here for many reasons. - length := s.GetTotalConnections() - conns := make([]Connection, length, length) - i := 0 - // second call of Range. +func (s *Server) GetConnections() (conns []Connection) { s.connections.Range(func(k, v interface{}) bool { conn, ok := v.(*connection) if !ok { @@ -306,12 +334,11 @@ func (s *Server) GetConnections() []Connection { // in order to avoid any issues while end-dev will try to iterate a nil entry. return false } - conns[i] = conn - i++ + conns = append(conns, conn) return true }) - return conns + return } // GetConnection returns single connection From bda36145e54ecff8e57db6b26d5eae680e7b3d82 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Fri, 22 Feb 2019 21:24:10 +0200 Subject: [PATCH 019/418] some cleanup, and remove the test 'testwebocket2' package at all; A lower-level fast websocket impl based on gobwas/ws will be published on a different repo, it is a WIP Former-commit-id: b680974c593196ce20865ed12778929ced6afea1 --- LICENSE | 2 +- .../go-client-stress-test/client/main.go | 22 +- .../go-client-stress-test/server/main.go | 37 +- cache/LICENSE | 2 +- doc.go | 2 +- hero/LICENSE | 2 +- macro/LICENSE | 2 +- mvc/LICENSE | 2 +- sessions/LICENSE | 2 +- typescript/LICENSE | 2 +- versioning/LICENSE | 2 +- websocket/LICENSE | 2 +- websocket/config.go | 43 +- websocket/connection.go | 58 +- websocket/server.go | 126 +-- websocket2/client.js | 208 ---- websocket2/client.js.go | 233 ----- websocket2/client.min.js | 1 - websocket2/client.ts | 256 ----- websocket2/config.go | 185 ---- websocket2/connection.go | 936 ------------------ websocket2/emitter.go | 43 - websocket2/message.go | 182 ---- websocket2/server.go | 460 --------- websocket2/websocket.go | 69 -- 25 files changed, 110 insertions(+), 2769 deletions(-) delete mode 100644 websocket2/client.js delete mode 100644 websocket2/client.js.go delete mode 100644 websocket2/client.min.js delete mode 100644 websocket2/client.ts delete mode 100644 websocket2/config.go delete mode 100644 websocket2/connection.go delete mode 100644 websocket2/emitter.go delete mode 100644 websocket2/message.go delete mode 100644 websocket2/server.go delete mode 100644 websocket2/websocket.go diff --git a/LICENSE b/LICENSE index c9eada50..a56c9e1a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2018 The Iris Authors. All rights reserved. +Copyright (c) 2017-2019 The Iris Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/_examples/websocket/go-client-stress-test/client/main.go b/_examples/websocket/go-client-stress-test/client/main.go index 0be23e13..fb5d9806 100644 --- a/_examples/websocket/go-client-stress-test/client/main.go +++ b/_examples/websocket/go-client-stress-test/client/main.go @@ -10,7 +10,7 @@ import ( "sync/atomic" "time" - "github.com/kataras/iris/websocket2" + "github.com/kataras/iris/websocket" ) var ( @@ -19,6 +19,7 @@ var ( ) const totalClients = 16000 // max depends on the OS. +const verbose = true var connectionFailures uint64 @@ -42,7 +43,7 @@ func collectError(op string, err error) { } func main() { - log.Println("--------======Running tests...==========--------------") + log.Println("--Running...") var err error f, err = os.Open("./test.data") if err != nil { @@ -85,11 +86,11 @@ func main() { log.Println() if connectionFailures > 0 { - log.Printf("Finished with %d/%d connection failures. Please close the server-side manually.\n", connectionFailures, totalClients) + log.Printf("Finished with %d/%d connection failures.", connectionFailures, totalClients) } if n := len(connectErrors); n > 0 { - log.Printf("Finished with %d connect errors:\n", n) + log.Printf("Finished with %d connect errors: ", n) var lastErr error var sameC int @@ -123,7 +124,7 @@ func main() { if n := len(disconnectErrors); n > 0 { log.Printf("Finished with %d disconnect errors\n", n) for i, err := range disconnectErrors { - if err == websocket.ErrAlreadyDisconnected { + if err == websocket.ErrAlreadyDisconnected && i > 0 { continue } @@ -135,7 +136,7 @@ func main() { log.Println("ALL OK.") } - log.Println("--------================--------------") + log.Println("--Finished.") } func connect(wg *sync.WaitGroup, alive time.Duration) { @@ -153,12 +154,17 @@ func connect(wg *sync.WaitGroup, alive time.Duration) { disconnected := false c.OnDisconnect(func() { - // log.Printf("I am disconnected after [%s].\n", alive) + if verbose { + log.Printf("I am disconnected after [%s].\n", alive) + } + disconnected = true }) c.On("chat", func(message string) { - // log.Printf("\n%s\n", message) + if verbose { + log.Printf("\n%s\n", message) + } }) go func() { diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go index a0cf6668..37fe7383 100644 --- a/_examples/websocket/go-client-stress-test/server/main.go +++ b/_examples/websocket/go-client-stress-test/server/main.go @@ -8,11 +8,11 @@ import ( "time" "github.com/kataras/iris" - "github.com/kataras/iris/websocket2" + "github.com/kataras/iris/websocket" ) const totalClients = 16000 // max depends on the OS. -const http = true +const verbose = true func main() { @@ -62,32 +62,9 @@ func main() { } }() - if http { - app := iris.New() - app.Get("/", ws.Handler()) - app.Run(iris.Addr(":8080")) - return - } - - // ln, err := net.Listen("tcp", ":8080") - // if err != nil { - // panic(err) - // } - - // defer ln.Close() - // for { - // conn, err := ln.Accept() - // if err != nil { - // panic(err) - // } - - // go func() { - // err = ws.HandleConn(conn) - // if err != nil { - // panic(err) - // } - // }() - // } + app := iris.New() + app.Get("/", ws.Handler()) + app.Run(iris.Addr(":8080")) } @@ -103,7 +80,9 @@ var count uint64 func handleDisconnect(c websocket.Connection) { atomic.AddUint64(&count, 1) - // log.Printf("client [%s] disconnected!\n", c.ID()) + if verbose { + log.Printf("client [%s] disconnected!\n", c.ID()) + } } func handleErr(c websocket.Connection, err error) { diff --git a/cache/LICENSE b/cache/LICENSE index 6beda715..568450b0 100644 --- a/cache/LICENSE +++ b/cache/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2018 The Iris Cache Authors. All rights reserved. +Copyright (c) 2017-2019 The Iris Cache Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/doc.go b/doc.go index 84b0b61f..b40c8aa3 100644 --- a/doc.go +++ b/doc.go @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2018 The Iris Authors. All rights reserved. +// Copyright (c) 2017-2019 The Iris Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are diff --git a/hero/LICENSE b/hero/LICENSE index a0b2d92f..970e41a7 100644 --- a/hero/LICENSE +++ b/hero/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018 Gerasimos Maropoulos. All rights reserved. +Copyright (c) 2018-2019 Gerasimos Maropoulos. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/macro/LICENSE b/macro/LICENSE index c73df4ce..8f0865b2 100644 --- a/macro/LICENSE +++ b/macro/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2018 The Iris Macro and Route path interpreter. All rights reserved. +Copyright (c) 2017-2019 The Iris Macro and Route path interpreter. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/mvc/LICENSE b/mvc/LICENSE index 469fb44d..fb9b3b8a 100644 --- a/mvc/LICENSE +++ b/mvc/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018 Gerasimos Maropoulos. All rights reserved. +Copyright (c) 2018-2019 Gerasimos Maropoulos. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/sessions/LICENSE b/sessions/LICENSE index 6a39906b..ca7456f2 100644 --- a/sessions/LICENSE +++ b/sessions/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2018 The Iris Sessions Authors. All rights reserved. +Copyright (c) 2017-2019 The Iris Sessions Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/typescript/LICENSE b/typescript/LICENSE index ec401599..50c59d41 100644 --- a/typescript/LICENSE +++ b/typescript/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2018 The Iris Typescript Authors. All rights reserved. +Copyright (c) 2017-2019 The Iris Typescript Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/versioning/LICENSE b/versioning/LICENSE index 469fb44d..fb9b3b8a 100644 --- a/versioning/LICENSE +++ b/versioning/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018 Gerasimos Maropoulos. All rights reserved. +Copyright (c) 2018-2019 Gerasimos Maropoulos. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/websocket/LICENSE b/websocket/LICENSE index 47aea48d..1ea6d9b5 100644 --- a/websocket/LICENSE +++ b/websocket/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2018 The Iris Websocket Authors. All rights reserved. +Copyright (c) 2017-2019 The Iris Websocket Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/websocket/config.go b/websocket/config.go index 145ea2a6..0636ae53 100644 --- a/websocket/config.go +++ b/websocket/config.go @@ -1,8 +1,8 @@ package websocket import ( - "math/rand" "net/http" + "strconv" "time" "github.com/kataras/iris/context" @@ -33,19 +33,18 @@ const ( ) var ( - // DefaultIDGenerator returns a random unique for a new connection. + // DefaultIDGenerator returns a random unique string for a new connection. // Used when config.IDGenerator is nil. DefaultIDGenerator = func(context.Context) string { id, err := uuid.NewV4() if err != nil { - return randomString(64) + return strconv.FormatInt(time.Now().Unix(), 10) } return id.String() } ) -// Config the websocket server configuration -// all of these are optional. +// Config contains the websocket server's configuration, optional. type Config struct { // IDGenerator used to create (and later on, set) // an ID for each incoming websocket connections (clients). @@ -158,37 +157,3 @@ func (c Config) Validate() Config { return c } - -const ( - letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - letterIdxBits = 6 // 6 bits to represent a letter index - letterIdxMask = 1<= 0; { - if remain == 0 { - cache, remain = src.Int63(), letterIdxMax - } - if idx := int(cache & letterIdxMask); idx < len(letterBytes) { - b[i] = letterBytes[idx] - i-- - } - cache >>= letterIdxBits - remain-- - } - - return b -} - -// randomString accepts a number(10 for example) and returns a random string using simple but fairly safe random algorithm -func randomString(n int) string { - return string(random(n)) -} diff --git a/websocket/connection.go b/websocket/connection.go index 8987ec3e..2203e399 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -4,7 +4,6 @@ import ( "bytes" stdContext "context" "errors" - "io" "net" "strconv" "strings" @@ -93,50 +92,6 @@ func (r *ConnectionValues) Reset() { *r = (*r)[:0] } -// UnderlineConnection is the underline connection, nothing to think about, -// it's used internally mostly but can be used for extreme cases with other libraries. -type UnderlineConnection interface { - // SetWriteDeadline sets the write deadline on the underlying network - // connection. After a write has timed out, the websocket state is corrupt and - // all future writes will return an error. A zero value for t means writes will - // not time out. - SetWriteDeadline(t time.Time) error - // SetReadDeadline sets the read deadline on the underlying network connection. - // After a read has timed out, the websocket connection state is corrupt and - // all future reads will return an error. A zero value for t means reads will - // not time out. - SetReadDeadline(t time.Time) error - // SetReadLimit sets the maximum size for a message read from the peer. If a - // message exceeds the limit, the connection sends a close frame to the peer - // and returns ErrReadLimit to the application. - SetReadLimit(limit int64) - // SetPongHandler sets the handler for pong messages received from the peer. - // The appData argument to h is the PONG frame application data. The default - // pong handler does nothing. - SetPongHandler(h func(appData string) error) - // SetPingHandler sets the handler for ping messages received from the peer. - // The appData argument to h is the PING frame application data. The default - // ping handler sends a pong to the peer. - SetPingHandler(h func(appData string) error) - // WriteControl writes a control message with the given deadline. The allowed - // message types are CloseMessage, PingMessage and PongMessage. - WriteControl(messageType int, data []byte, deadline time.Time) error - // WriteMessage is a helper method for getting a writer using NextWriter, - // writing the message and closing the writer. - WriteMessage(messageType int, data []byte) error - // ReadMessage is a helper method for getting a reader using NextReader and - // reading from that reader to a buffer. - ReadMessage() (messageType int, p []byte, err error) - // NextWriter returns a writer for the next message to send. The writer's Close - // method flushes the complete message to the network. - // - // There can be at most one open writer on a connection. NextWriter closes the - // previous writer if the application has not already done so. - NextWriter(messageType int) (io.WriteCloser, error) - // Close closes the underlying network connection without sending or waiting for a close frame. - Close() error -} - // ------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------- // -------------------------------Connection implementation----------------------------- @@ -239,11 +194,12 @@ type ( // after the "On" events IF server's `Upgrade` is used, // otherise you don't have to call it because the `Handler()` does it automatically. Wait() + UnderlyingConn() *websocket.Conn } connection struct { err error - underline UnderlineConnection + underline *websocket.Conn config ConnectionConfig defaultMessageType int serializer *messageSerializer @@ -281,11 +237,11 @@ var _ Connection = &connection{} // WrapConnection wraps the underline websocket connection into a new iris websocket connection. // The caller should call the `connection#Wait` (which blocks) to enable its read and write functionality. -func WrapConnection(underlineConn UnderlineConnection, cfg ConnectionConfig) Connection { +func WrapConnection(underlineConn *websocket.Conn, cfg ConnectionConfig) Connection { return newConnection(underlineConn, cfg) } -func newConnection(underlineConn UnderlineConnection, cfg ConnectionConfig) *connection { +func newConnection(underlineConn *websocket.Conn, cfg ConnectionConfig) *connection { cfg = cfg.Validate() c := &connection{ underline: underlineConn, @@ -308,7 +264,7 @@ func newConnection(underlineConn UnderlineConnection, cfg ConnectionConfig) *con return c } -func newServerConnection(ctx context.Context, s *Server, underlineConn UnderlineConnection, id string) *connection { +func newServerConnection(ctx context.Context, s *Server, underlineConn *websocket.Conn, id string) *connection { c := newConnection(underlineConn, ConnectionConfig{ EvtMessagePrefix: s.config.EvtMessagePrefix, WriteTimeout: s.config.WriteTimeout, @@ -334,6 +290,10 @@ func newServerConnection(ctx context.Context, s *Server, underlineConn Underline return c } +func (c *connection) UnderlyingConn() *websocket.Conn { + return c.underline +} + // Err is not nil if the upgrader failed to upgrade http to websocket connection. func (c *connection) Err() error { return c.err diff --git a/websocket/server.go b/websocket/server.go index 6b9b6130..da747e3e 100644 --- a/websocket/server.go +++ b/websocket/server.go @@ -15,19 +15,6 @@ type ( // Receives one parameter which is the Connection ConnectionFunc func(Connection) - // websocketRoomPayload is used as payload from the connection to the Server - websocketRoomPayload struct { - roomName string - connectionID string - } - - // payloads, connection -> Server - websocketMessagePayload struct { - from string - to string - data []byte - } - // Server is the websocket Server's implementation. // // It listens for websocket clients (either from the javascript client-side or from any websocket implementation). @@ -44,9 +31,9 @@ type ( // Use a route to serve this file on a specific path, i.e // app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(mywebsocketServer.ClientSource) }) ClientSource []byte - connections map[string]*connection // key = the Connection ID. - rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name - mu sync.RWMutex // for rooms and connections. + connections sync.Map // key = the Connection ID. + rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name + mu sync.RWMutex // for rooms. onConnectionListeners []ConnectionFunc //connectionPool sync.Pool // sadly we can't make this because the websocket connection is live until is closed. upgrader websocket.Upgrader @@ -63,7 +50,7 @@ func New(cfg Config) *Server { return &Server{ config: cfg, ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), - connections: make(map[string]*connection), + connections: sync.Map{}, // ready-to-use, this is not necessary. rooms: make(map[string][]string), onConnectionListeners: make([]ConnectionFunc, 0), upgrader: websocket.Upgrader{ @@ -132,19 +119,24 @@ func (s *Server) Upgrade(ctx context.Context) Connection { } func (s *Server) addConnection(c *connection) { - s.mu.Lock() - s.connections[c.id] = c - s.mu.Unlock() + s.connections.Store(c.id, c) } func (s *Server) getConnection(connID string) (*connection, bool) { - c, ok := s.connections[connID] - return c, ok + if cValue, ok := s.connections.Load(connID); ok { + // this cast is not necessary, + // we know that we always save a connection, but for good or worse let it be here. + if conn, ok := cValue.(*connection); ok { + return conn, ok + } + } + + return nil, false } // wrapConnection wraps an underline connection to an iris websocket connection. // It does NOT starts its writer, reader and event mux, the caller is responsible for that. -func (s *Server) handleConnection(ctx context.Context, websocketConn UnderlineConnection) *connection { +func (s *Server) handleConnection(ctx context.Context, websocketConn *websocket.Conn) *connection { // use the config's id generator (or the default) to create a websocket client/connection id cid := s.config.IDGenerator(ctx) // create the new connection @@ -282,27 +274,31 @@ func (s *Server) leave(roomName string, connID string) (left bool) { return } -// GetTotalConnections returns the number of total connections +// GetTotalConnections returns the number of total connections. func (s *Server) GetTotalConnections() (n int) { - s.mu.RLock() - n = len(s.connections) - s.mu.RUnlock() + s.connections.Range(func(k, v interface{}) bool { + n++ + return true + }) - return + return n } -// GetConnections returns all connections -func (s *Server) GetConnections() []Connection { - s.mu.RLock() - conns := make([]Connection, len(s.connections)) - i := 0 - for _, c := range s.connections { - conns[i] = c - i++ - } +// GetConnections returns all connections. +func (s *Server) GetConnections() (conns []Connection) { + s.connections.Range(func(k, v interface{}) bool { + conn, ok := v.(*connection) + if !ok { + // if for some reason (should never happen), the value is not stored as *connection + // then stop the iteration and don't continue insertion of the result connections + // in order to avoid any issues while end-dev will try to iterate a nil entry. + return false + } + conns = append(conns, conn) + return true + }) - s.mu.RUnlock() - return conns + return } // GetConnection returns single connection @@ -317,21 +313,19 @@ func (s *Server) GetConnection(connID string) Connection { // GetConnectionsByRoom returns a list of Connection // which are joined to this room. -func (s *Server) GetConnectionsByRoom(roomName string) []Connection { - var conns []Connection - s.mu.RLock() +func (s *Server) GetConnectionsByRoom(roomName string) (conns []Connection) { if connIDs, found := s.rooms[roomName]; found { for _, connID := range connIDs { // existence check is not necessary here. - if conn, ok := s.connections[connID]; ok { - conns = append(conns, conn) + if cValue, ok := s.connections.Load(connID); ok { + if conn, ok := cValue.(*connection); ok { + conns = append(conns, conn) + } } } } - s.mu.RUnlock() - - return conns + return } // emitMessage is the main 'router' of the messages coming from the connection @@ -364,20 +358,32 @@ func (s *Server) emitMessage(from, to string, data []byte) { } } } else { - s.mu.RLock() // it suppose to send the message to all opened connections or to all except the sender. - for _, conn := range s.connections { - if to != All && to != conn.id { // if it's not suppose to send to all connections (including itself) - if to == Broadcast && from == conn.id { // if broadcast to other connections except this - // here we do the opossite of previous block, - // just skip this connection when it's suppose to send the message to all connections except the sender. - continue - } + s.connections.Range(func(k, v interface{}) bool { + connID, ok := k.(string) + if !ok { + // should never happen. + return true } - conn.writeDefault(data) - } - s.mu.RUnlock() + if to != All && to != connID { // if it's not suppose to send to all connections (including itself) + if to == Broadcast && from == connID { // if broadcast to other connections except this + // here we do the opossite of previous block, + // just skip this connection when it's suppose to send the message to all connections except the sender. + return true + } + + } + + // not necessary cast. + conn, ok := v.(*connection) + if ok { + // send to the client(s) when the top validators passed + conn.writeDefault(data) + } + + return ok + }) } } @@ -402,9 +408,7 @@ func (s *Server) Disconnect(connID string) (err error) { // close the underline connection and return its error, if any. err = conn.underline.Close() - s.mu.Lock() - delete(s.connections, conn.id) - s.mu.Unlock() + s.connections.Delete(connID) } return diff --git a/websocket2/client.js b/websocket2/client.js deleted file mode 100644 index ff323057..00000000 --- a/websocket2/client.js +++ /dev/null @@ -1,208 +0,0 @@ -var websocketStringMessageType = 0; -var websocketIntMessageType = 1; -var websocketBoolMessageType = 2; -var websocketJSONMessageType = 4; -var websocketMessagePrefix = "iris-websocket-message:"; -var websocketMessageSeparator = ";"; -var websocketMessagePrefixLen = websocketMessagePrefix.length; -var websocketMessageSeparatorLen = websocketMessageSeparator.length; -var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; -var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; -var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; -var Ws = (function () { - function Ws(endpoint, protocols) { - var _this = this; - // events listeners - this.connectListeners = []; - this.disconnectListeners = []; - this.nativeMessageListeners = []; - this.messageListeners = {}; - if (!window["WebSocket"]) { - return; - } - if (endpoint.indexOf("ws") == -1) { - endpoint = "ws://" + endpoint; - } - if (protocols != null && protocols.length > 0) { - this.conn = new WebSocket(endpoint, protocols); - } - else { - this.conn = new WebSocket(endpoint); - } - this.conn.onopen = (function (evt) { - _this.fireConnect(); - _this.isReady = true; - return null; - }); - this.conn.onclose = (function (evt) { - _this.fireDisconnect(); - return null; - }); - this.conn.onmessage = (function (evt) { - _this.messageReceivedFromConn(evt); - }); - } - //utils - Ws.prototype.isNumber = function (obj) { - return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; - }; - Ws.prototype.isString = function (obj) { - return Object.prototype.toString.call(obj) == "[object String]"; - }; - Ws.prototype.isBoolean = function (obj) { - return typeof obj === 'boolean' || - (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); - }; - Ws.prototype.isJSON = function (obj) { - return typeof obj === 'object'; - }; - // - // messages - Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { - return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; - }; - Ws.prototype.encodeMessage = function (event, data) { - var m = ""; - var t = 0; - if (this.isNumber(data)) { - t = websocketIntMessageType; - m = data.toString(); - } - else if (this.isBoolean(data)) { - t = websocketBoolMessageType; - m = data.toString(); - } - else if (this.isString(data)) { - t = websocketStringMessageType; - m = data.toString(); - } - else if (this.isJSON(data)) { - //propably json-object - t = websocketJSONMessageType; - m = JSON.stringify(data); - } - else if (data !== null && typeof(data) !== "undefined" ) { - // if it has a second parameter but it's not a type we know, then fire this: - console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); - } - return this._msg(event, t, m); - }; - Ws.prototype.decodeMessage = function (event, websocketMessage) { - //iris-websocket-message;user;4;themarshaledstringfromajsonstruct - var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; - if (websocketMessage.length < skipLen + 1) { - return null; - } - var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); - var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); - if (websocketMessageType == websocketIntMessageType) { - return parseInt(theMessage); - } - else if (websocketMessageType == websocketBoolMessageType) { - return Boolean(theMessage); - } - else if (websocketMessageType == websocketStringMessageType) { - return theMessage; - } - else if (websocketMessageType == websocketJSONMessageType) { - return JSON.parse(theMessage); - } - else { - return null; // invalid - } - }; - Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { - if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { - return ""; - } - var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); - var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); - return evt; - }; - Ws.prototype.getCustomMessage = function (event, websocketMessage) { - var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); - var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); - return s; - }; - // - // Ws Events - // messageReceivedFromConn this is the func which decides - // if it's a native websocket message or a custom qws message - // if native message then calls the fireNativeMessage - // else calls the fireMessage - // - // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. - Ws.prototype.messageReceivedFromConn = function (evt) { - //check if qws message - var message = evt.data; - if (message.indexOf(websocketMessagePrefix) != -1) { - var event_1 = this.getWebsocketCustomEvent(message); - if (event_1 != "") { - // it's a custom message - this.fireMessage(event_1, this.getCustomMessage(event_1, message)); - return; - } - } - // it's a native websocket message - this.fireNativeMessage(message); - }; - Ws.prototype.OnConnect = function (fn) { - if (this.isReady) { - fn(); - } - this.connectListeners.push(fn); - }; - Ws.prototype.fireConnect = function () { - for (var i = 0; i < this.connectListeners.length; i++) { - this.connectListeners[i](); - } - }; - Ws.prototype.OnDisconnect = function (fn) { - this.disconnectListeners.push(fn); - }; - Ws.prototype.fireDisconnect = function () { - for (var i = 0; i < this.disconnectListeners.length; i++) { - this.disconnectListeners[i](); - } - }; - Ws.prototype.OnMessage = function (cb) { - this.nativeMessageListeners.push(cb); - }; - Ws.prototype.fireNativeMessage = function (websocketMessage) { - for (var i = 0; i < this.nativeMessageListeners.length; i++) { - this.nativeMessageListeners[i](websocketMessage); - } - }; - Ws.prototype.On = function (event, cb) { - if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { - this.messageListeners[event] = []; - } - this.messageListeners[event].push(cb); - }; - Ws.prototype.fireMessage = function (event, message) { - for (var key in this.messageListeners) { - if (this.messageListeners.hasOwnProperty(key)) { - if (key == event) { - for (var i = 0; i < this.messageListeners[key].length; i++) { - this.messageListeners[key][i](message); - } - } - } - } - }; - // - // Ws Actions - Ws.prototype.Disconnect = function () { - this.conn.close(); - }; - // EmitMessage sends a native websocket message - Ws.prototype.EmitMessage = function (websocketMessage) { - this.conn.send(websocketMessage); - }; - // Emit sends an iris-custom websocket message - Ws.prototype.Emit = function (event, data) { - var messageStr = this.encodeMessage(event, data); - this.EmitMessage(messageStr); - }; - return Ws; -}()); \ No newline at end of file diff --git a/websocket2/client.js.go b/websocket2/client.js.go deleted file mode 100644 index 2144411a..00000000 --- a/websocket2/client.js.go +++ /dev/null @@ -1,233 +0,0 @@ -package websocket - -import ( - "time" - - "github.com/kataras/iris/context" -) - -// ClientHandler is the handler which serves the javascript client-side -// library. It uses a small cache based on the iris/context.WriteWithExpiration. -func ClientHandler() context.Handler { - modNow := time.Now() - return func(ctx context.Context) { - ctx.ContentType("application/javascript") - if _, err := ctx.WriteWithExpiration(ClientSource, modNow); err != nil { - ctx.StatusCode(500) - ctx.StopExecution() - // ctx.Application().Logger().Infof("error while serving []byte via StaticContent: %s", err.Error()) - } - } -} - -// ClientSource the client-side javascript raw source code. -var ClientSource = []byte(`var websocketStringMessageType = 0; -var websocketIntMessageType = 1; -var websocketBoolMessageType = 2; -var websocketJSONMessageType = 4; -var websocketMessagePrefix = "` + DefaultEvtMessageKey + `"; -var websocketMessageSeparator = ";"; -var websocketMessagePrefixLen = websocketMessagePrefix.length; -var websocketMessageSeparatorLen = websocketMessageSeparator.length; -var websocketMessagePrefixAndSepIdx = websocketMessagePrefixLen + websocketMessageSeparatorLen - 1; -var websocketMessagePrefixIdx = websocketMessagePrefixLen - 1; -var websocketMessageSeparatorIdx = websocketMessageSeparatorLen - 1; -var Ws = (function () { - // - function Ws(endpoint, protocols) { - var _this = this; - // events listeners - this.connectListeners = []; - this.disconnectListeners = []; - this.nativeMessageListeners = []; - this.messageListeners = {}; - if (!window["WebSocket"]) { - return; - } - if (endpoint.indexOf("ws") == -1) { - endpoint = "ws://" + endpoint; - } - if (protocols != null && protocols.length > 0) { - this.conn = new WebSocket(endpoint, protocols); - } - else { - this.conn = new WebSocket(endpoint); - } - this.conn.onopen = (function (evt) { - _this.fireConnect(); - _this.isReady = true; - return null; - }); - this.conn.onclose = (function (evt) { - _this.fireDisconnect(); - return null; - }); - this.conn.onmessage = (function (evt) { - _this.messageReceivedFromConn(evt); - }); - } - //utils - Ws.prototype.isNumber = function (obj) { - return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; - }; - Ws.prototype.isString = function (obj) { - return Object.prototype.toString.call(obj) == "[object String]"; - }; - Ws.prototype.isBoolean = function (obj) { - return typeof obj === 'boolean' || - (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); - }; - Ws.prototype.isJSON = function (obj) { - return typeof obj === 'object'; - }; - // - // messages - Ws.prototype._msg = function (event, websocketMessageType, dataMessage) { - return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; - }; - Ws.prototype.encodeMessage = function (event, data) { - var m = ""; - var t = 0; - if (this.isNumber(data)) { - t = websocketIntMessageType; - m = data.toString(); - } - else if (this.isBoolean(data)) { - t = websocketBoolMessageType; - m = data.toString(); - } - else if (this.isString(data)) { - t = websocketStringMessageType; - m = data.toString(); - } - else if (this.isJSON(data)) { - //propably json-object - t = websocketJSONMessageType; - m = JSON.stringify(data); - } - else if (data !== null && typeof(data) !== "undefined" ) { - // if it has a second parameter but it's not a type we know, then fire this: - console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); - } - return this._msg(event, t, m); - }; - Ws.prototype.decodeMessage = function (event, websocketMessage) { - //iris-websocket-message;user;4;themarshaledstringfromajsonstruct - var skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; - if (websocketMessage.length < skipLen + 1) { - return null; - } - var websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); - var theMessage = websocketMessage.substring(skipLen, websocketMessage.length); - if (websocketMessageType == websocketIntMessageType) { - return parseInt(theMessage); - } - else if (websocketMessageType == websocketBoolMessageType) { - return Boolean(theMessage); - } - else if (websocketMessageType == websocketStringMessageType) { - return theMessage; - } - else if (websocketMessageType == websocketJSONMessageType) { - return JSON.parse(theMessage); - } - else { - return null; // invalid - } - }; - Ws.prototype.getWebsocketCustomEvent = function (websocketMessage) { - if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { - return ""; - } - var s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); - var evt = s.substring(0, s.indexOf(websocketMessageSeparator)); - return evt; - }; - Ws.prototype.getCustomMessage = function (event, websocketMessage) { - var eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); - var s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); - return s; - }; - // - // Ws Events - // messageReceivedFromConn this is the func which decides - // if it's a native websocket message or a custom qws message - // if native message then calls the fireNativeMessage - // else calls the fireMessage - // - // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. - Ws.prototype.messageReceivedFromConn = function (evt) { - //check if qws message - var message = evt.data; - if (message.indexOf(websocketMessagePrefix) != -1) { - var event_1 = this.getWebsocketCustomEvent(message); - if (event_1 != "") { - // it's a custom message - this.fireMessage(event_1, this.getCustomMessage(event_1, message)); - return; - } - } - // it's a native websocket message - this.fireNativeMessage(message); - }; - Ws.prototype.OnConnect = function (fn) { - if (this.isReady) { - fn(); - } - this.connectListeners.push(fn); - }; - Ws.prototype.fireConnect = function () { - for (var i = 0; i < this.connectListeners.length; i++) { - this.connectListeners[i](); - } - }; - Ws.prototype.OnDisconnect = function (fn) { - this.disconnectListeners.push(fn); - }; - Ws.prototype.fireDisconnect = function () { - for (var i = 0; i < this.disconnectListeners.length; i++) { - this.disconnectListeners[i](); - } - }; - Ws.prototype.OnMessage = function (cb) { - this.nativeMessageListeners.push(cb); - }; - Ws.prototype.fireNativeMessage = function (websocketMessage) { - for (var i = 0; i < this.nativeMessageListeners.length; i++) { - this.nativeMessageListeners[i](websocketMessage); - } - }; - Ws.prototype.On = function (event, cb) { - if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { - this.messageListeners[event] = []; - } - this.messageListeners[event].push(cb); - }; - Ws.prototype.fireMessage = function (event, message) { - for (var key in this.messageListeners) { - if (this.messageListeners.hasOwnProperty(key)) { - if (key == event) { - for (var i = 0; i < this.messageListeners[key].length; i++) { - this.messageListeners[key][i](message); - } - } - } - } - }; - // - // Ws Actions - Ws.prototype.Disconnect = function () { - this.conn.close(); - }; - // EmitMessage sends a native websocket message - Ws.prototype.EmitMessage = function (websocketMessage) { - this.conn.send(websocketMessage); - }; - // Emit sends an iris-custom websocket message - Ws.prototype.Emit = function (event, data) { - var messageStr = this.encodeMessage(event, data); - this.EmitMessage(messageStr); - }; - return Ws; -}()); -`) diff --git a/websocket2/client.min.js b/websocket2/client.min.js deleted file mode 100644 index 3d930f50..00000000 --- a/websocket2/client.min.js +++ /dev/null @@ -1 +0,0 @@ -var websocketStringMessageType=0,websocketIntMessageType=1,websocketBoolMessageType=2,websocketJSONMessageType=4,websocketMessagePrefix="iris-websocket-message:",websocketMessageSeparator=";",websocketMessagePrefixLen=websocketMessagePrefix.length,websocketMessageSeparatorLen=websocketMessageSeparator.length,websocketMessagePrefixAndSepIdx=websocketMessagePrefixLen+websocketMessageSeparatorLen-1,websocketMessagePrefixIdx=websocketMessagePrefixLen-1,websocketMessageSeparatorIdx=websocketMessageSeparatorLen-1,Ws=function(){function e(e,s){var t=this;this.connectListeners=[],this.disconnectListeners=[],this.nativeMessageListeners=[],this.messageListeners={},window.WebSocket&&(-1==e.indexOf("ws")&&(e="ws://"+e),null!=s&&0 void; -type onWebsocketDisconnectFunc = () => void; -type onWebsocketNativeMessageFunc = (websocketMessage: string) => void; -type onMessageFunc = (message: any) => void; - -class Ws { - private conn: WebSocket; - private isReady: boolean; - - // events listeners - - private connectListeners: onConnectFunc[] = []; - private disconnectListeners: onWebsocketDisconnectFunc[] = []; - private nativeMessageListeners: onWebsocketNativeMessageFunc[] = []; - private messageListeners: { [event: string]: onMessageFunc[] } = {}; - - // - - constructor(endpoint: string, protocols?: string[]) { - if (!window["WebSocket"]) { - return; - } - - if (endpoint.indexOf("ws") == -1) { - endpoint = "ws://" + endpoint; - } - if (protocols != null && protocols.length > 0) { - this.conn = new WebSocket(endpoint, protocols); - } else { - this.conn = new WebSocket(endpoint); - } - - this.conn.onopen = ((evt: Event): any => { - this.fireConnect(); - this.isReady = true; - return null; - }); - - this.conn.onclose = ((evt: Event): any => { - this.fireDisconnect(); - return null; - }); - - this.conn.onmessage = ((evt: MessageEvent) => { - this.messageReceivedFromConn(evt); - }); - } - - //utils - - private isNumber(obj: any): boolean { - return !isNaN(obj - 0) && obj !== null && obj !== "" && obj !== false; - } - - private isString(obj: any): boolean { - return Object.prototype.toString.call(obj) == "[object String]"; - } - - private isBoolean(obj: any): boolean { - return typeof obj === 'boolean' || - (typeof obj === 'object' && typeof obj.valueOf() === 'boolean'); - } - - private isJSON(obj: any): boolean { - return typeof obj === 'object'; - } - - // - - // messages - private _msg(event: string, websocketMessageType: number, dataMessage: string): string { - - return websocketMessagePrefix + event + websocketMessageSeparator + String(websocketMessageType) + websocketMessageSeparator + dataMessage; - } - - private encodeMessage(event: string, data: any): string { - let m = ""; - let t = 0; - if (this.isNumber(data)) { - t = websocketIntMessageType; - m = data.toString(); - } else if (this.isBoolean(data)) { - t = websocketBoolMessageType; - m = data.toString(); - } else if (this.isString(data)) { - t = websocketStringMessageType; - m = data.toString(); - } else if (this.isJSON(data)) { - //propably json-object - t = websocketJSONMessageType; - m = JSON.stringify(data); - } else if (data !== null && typeof (data) !== "undefined") { - // if it has a second parameter but it's not a type we know, then fire this: - console.log("unsupported type of input argument passed, try to not include this argument to the 'Emit'"); - } - - return this._msg(event, t, m); - } - - private decodeMessage(event: string, websocketMessage: string): T | any { - //iris-websocket-message;user;4;themarshaledstringfromajsonstruct - let skipLen = websocketMessagePrefixLen + websocketMessageSeparatorLen + event.length + 2; - if (websocketMessage.length < skipLen + 1) { - return null; - } - let websocketMessageType = parseInt(websocketMessage.charAt(skipLen - 2)); - let theMessage = websocketMessage.substring(skipLen, websocketMessage.length); - if (websocketMessageType == websocketIntMessageType) { - return parseInt(theMessage); - } else if (websocketMessageType == websocketBoolMessageType) { - return Boolean(theMessage); - } else if (websocketMessageType == websocketStringMessageType) { - return theMessage; - } else if (websocketMessageType == websocketJSONMessageType) { - return JSON.parse(theMessage); - } else { - return null; // invalid - } - } - - private getWebsocketCustomEvent(websocketMessage: string): string { - if (websocketMessage.length < websocketMessagePrefixAndSepIdx) { - return ""; - } - let s = websocketMessage.substring(websocketMessagePrefixAndSepIdx, websocketMessage.length); - let evt = s.substring(0, s.indexOf(websocketMessageSeparator)); - - return evt; - } - - private getCustomMessage(event: string, websocketMessage: string): string { - let eventIdx = websocketMessage.indexOf(event + websocketMessageSeparator); - let s = websocketMessage.substring(eventIdx + event.length + websocketMessageSeparator.length + 2, websocketMessage.length); - return s; - } - - // - - // Ws Events - - // messageReceivedFromConn this is the func which decides - // if it's a native websocket message or a custom qws message - // if native message then calls the fireNativeMessage - // else calls the fireMessage - // - // remember iris gives you the freedom of native websocket messages if you don't want to use this client side at all. - private messageReceivedFromConn(evt: MessageEvent): void { - //check if qws message - let message = evt.data; - if (message.indexOf(websocketMessagePrefix) != -1) { - let event = this.getWebsocketCustomEvent(message); - if (event != "") { - // it's a custom message - this.fireMessage(event, this.getCustomMessage(event, message)); - return; - } - } - - // it's a native websocket message - this.fireNativeMessage(message); - } - - OnConnect(fn: onConnectFunc): void { - if (this.isReady) { - fn(); - } - this.connectListeners.push(fn); - } - - fireConnect(): void { - for (let i = 0; i < this.connectListeners.length; i++) { - this.connectListeners[i](); - } - } - - OnDisconnect(fn: onWebsocketDisconnectFunc): void { - this.disconnectListeners.push(fn); - } - - fireDisconnect(): void { - for (let i = 0; i < this.disconnectListeners.length; i++) { - this.disconnectListeners[i](); - } - } - - OnMessage(cb: onWebsocketNativeMessageFunc): void { - this.nativeMessageListeners.push(cb); - } - - fireNativeMessage(websocketMessage: string): void { - for (let i = 0; i < this.nativeMessageListeners.length; i++) { - this.nativeMessageListeners[i](websocketMessage); - } - } - - On(event: string, cb: onMessageFunc): void { - if (this.messageListeners[event] == null || this.messageListeners[event] == undefined) { - this.messageListeners[event] = []; - } - this.messageListeners[event].push(cb); - } - - fireMessage(event: string, message: any): void { - for (let key in this.messageListeners) { - if (this.messageListeners.hasOwnProperty(key)) { - if (key == event) { - for (let i = 0; i < this.messageListeners[key].length; i++) { - this.messageListeners[key][i](message); - } - } - } - } - } - - - // - - // Ws Actions - - Disconnect(): void { - this.conn.close(); - } - - // EmitMessage sends a native websocket message - EmitMessage(websocketMessage: string): void { - this.conn.send(websocketMessage); - } - - // Emit sends an iris-custom websocket message - Emit(event: string, data: any): void { - let messageStr = this.encodeMessage(event, data); - this.EmitMessage(messageStr); - } - - // - -} - -// node-modules export {Ws}; diff --git a/websocket2/config.go b/websocket2/config.go deleted file mode 100644 index 6453230d..00000000 --- a/websocket2/config.go +++ /dev/null @@ -1,185 +0,0 @@ -package websocket - -import ( - "math/rand" - "net/http" - "time" - - "github.com/kataras/iris/context" - - "github.com/iris-contrib/go.uuid" -) - -const ( - // DefaultWebsocketWriteTimeout 0, no timeout - DefaultWebsocketWriteTimeout = 0 - // DefaultWebsocketReadTimeout 0, no timeout - DefaultWebsocketReadTimeout = 0 - // DefaultWebsocketPingPeriod is 0 but - // could be 10 * time.Second. - DefaultWebsocketPingPeriod = 0 - // DefaultWebsocketReadBufferSize 0 - DefaultWebsocketReadBufferSize = 0 - // DefaultWebsocketWriterBufferSize 0 - DefaultWebsocketWriterBufferSize = 0 - // DefaultEvtMessageKey is the default prefix of the underline websocket events - // that are being established under the hoods. - // - // Defaults to "iris-websocket-message:". - // Last character of the prefix should be ':'. - DefaultEvtMessageKey = "iris-websocket-message:" -) - -var ( - // DefaultIDGenerator returns a random unique for a new connection. - // Used when config.IDGenerator is nil. - DefaultIDGenerator = func(context.Context) string { - id, err := uuid.NewV4() - if err != nil { - return randomString(64) - } - return id.String() - } -) - -// Config the websocket server configuration -// all of these are optional. -type Config struct { - // IDGenerator used to create (and later on, set) - // an ID for each incoming websocket connections (clients). - // The request is an input parameter which you can use to generate the ID (from headers for example). - // If empty then the ID is generated by DefaultIDGenerator: randomString(64) - IDGenerator func(ctx context.Context) string - // EvtMessagePrefix is the prefix of the underline websocket events that are being established under the hoods. - // This prefix is visible only to the javascript side (code) and it has nothing to do - // with the message that the end-user receives. - // Do not change it unless it is absolutely necessary. - // - // If empty then defaults to []byte("iris-websocket-message:"). - EvtMessagePrefix []byte - // Error is the function that will be fired if any client couldn't upgrade the HTTP connection - // to a websocket connection, a handshake error. - Error func(w http.ResponseWriter, r *http.Request, status int, reason error) - // CheckOrigin a function that is called right before the handshake, - // if returns false then that client is not allowed to connect with the websocket server. - CheckOrigin func(r *http.Request) bool - // HandshakeTimeout specifies the duration for the handshake to complete. - HandshakeTimeout time.Duration - // WriteTimeout time allowed to write a message to the connection. - // 0 means no timeout. - // Default value is 0 - WriteTimeout time.Duration - // ReadTimeout time allowed to read a message from the connection. - // 0 means no timeout. - // Default value is 0 - ReadTimeout time.Duration - // PingPeriod send ping messages to the connection repeatedly after this period. - // The value should be close to the ReadTimeout to avoid issues. - // Default value is 0. - PingPeriod time.Duration - // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text - // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. - // Default value is false - BinaryMessages bool - // ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer - // size is zero, then buffers allocated by the HTTP server are used. The - // I/O buffer sizes do not limit the size of the messages that can be sent - // or received. - // - // Default value is 0. - ReadBufferSize, WriteBufferSize int - // EnableCompression specify if the server should attempt to negotiate per - // message compression (RFC 7692). Setting this value to true does not - // guarantee that compression will be supported. Currently only "no context - // takeover" modes are supported. - // - // Defaults to false and it should be remain as it is, unless special requirements. - EnableCompression bool - - // Subprotocols specifies the server's supported protocols in order of - // preference. If this field is set, then the Upgrade method negotiates a - // subprotocol by selecting the first match in this list with a protocol - // requested by the client. - Subprotocols []string -} - -// Validate validates the configuration -func (c Config) Validate() Config { - // 0 means no timeout. - if c.WriteTimeout < 0 { - c.WriteTimeout = DefaultWebsocketWriteTimeout - } - - if c.ReadTimeout < 0 { - c.ReadTimeout = DefaultWebsocketReadTimeout - } - - if c.PingPeriod <= 0 { - c.PingPeriod = DefaultWebsocketPingPeriod - } - - if c.ReadBufferSize <= 0 { - c.ReadBufferSize = DefaultWebsocketReadBufferSize - } - - if c.WriteBufferSize <= 0 { - c.WriteBufferSize = DefaultWebsocketWriterBufferSize - } - - if c.Error == nil { - c.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) { - //empty - } - } - - if c.CheckOrigin == nil { - c.CheckOrigin = func(r *http.Request) bool { - // allow all connections by default - return true - } - } - - if len(c.EvtMessagePrefix) == 0 { - c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) - } - - if c.IDGenerator == nil { - c.IDGenerator = DefaultIDGenerator - } - - return c -} - -const ( - letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - letterIdxBits = 6 // 6 bits to represent a letter index - letterIdxMask = 1<= 0; { - if remain == 0 { - cache, remain = src.Int63(), letterIdxMax - } - if idx := int(cache & letterIdxMask); idx < len(letterBytes) { - b[i] = letterBytes[idx] - i-- - } - cache >>= letterIdxBits - remain-- - } - - return b -} - -// randomString accepts a number(10 for example) and returns a random string using simple but fairly safe random algorithm -func randomString(n int) string { - return string(random(n)) -} diff --git a/websocket2/connection.go b/websocket2/connection.go deleted file mode 100644 index 2547cf5a..00000000 --- a/websocket2/connection.go +++ /dev/null @@ -1,936 +0,0 @@ -package websocket - -import ( - "bytes" - stdContext "context" - "errors" - "io" - "io/ioutil" - "net" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/kataras/iris/context" - - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" -) - -// Operation codes defined by specification. -// See https://tools.ietf.org/html/rfc6455#section-5.2 -const ( - // TextMessage denotes a text data message. The text message payload is - // interpreted as UTF-8 encoded text data. - TextMessage ws.OpCode = ws.OpText - // BinaryMessage denotes a binary data message. - BinaryMessage ws.OpCode = ws.OpBinary - // CloseMessage denotes a close control message. - CloseMessage ws.OpCode = ws.OpClose - - // PingMessage denotes a ping control message. The optional message payload - // is UTF-8 encoded text. - PingMessage ws.OpCode = ws.OpPing - // PongMessage denotes a ping control message. The optional message payload - // is UTF-8 encoded text. - PongMessage ws.OpCode = ws.OpPong -) - -type ( - connectionValue struct { - key []byte - value interface{} - } - // ConnectionValues is the temporary connection's memory store - ConnectionValues []connectionValue -) - -// Set sets a value based on the key -func (r *ConnectionValues) Set(key string, value interface{}) { - args := *r - n := len(args) - for i := 0; i < n; i++ { - kv := &args[i] - if string(kv.key) == key { - kv.value = value - return - } - } - - c := cap(args) - if c > n { - args = args[:n+1] - kv := &args[n] - kv.key = append(kv.key[:0], key...) - kv.value = value - *r = args - return - } - - kv := connectionValue{} - kv.key = append(kv.key[:0], key...) - kv.value = value - *r = append(args, kv) -} - -// Get returns a value based on its key -func (r *ConnectionValues) Get(key string) interface{} { - args := *r - n := len(args) - for i := 0; i < n; i++ { - kv := &args[i] - if string(kv.key) == key { - return kv.value - } - } - return nil -} - -// Reset clears the values -func (r *ConnectionValues) Reset() { - *r = (*r)[:0] -} - -// UnderlineConnection is the underline connection, nothing to think about, -// it's used internally mostly but can be used for extreme cases with other libraries. -type UnderlineConnection interface { - // SetWriteDeadline sets the write deadline on the underlying network - // connection. After a write has timed out, the websocket state is corrupt and - // all future writes will return an error. A zero value for t means writes will - // not time out. - SetWriteDeadline(t time.Time) error - // SetReadDeadline sets the read deadline on the underlying network connection. - // After a read has timed out, the websocket connection state is corrupt and - // all future reads will return an error. A zero value for t means reads will - // not time out. - SetReadDeadline(t time.Time) error - // SetReadLimit sets the maximum size for a message read from the peer. If a - // message exceeds the limit, the connection sends a close frame to the peer - // and returns ErrReadLimit to the application. - SetReadLimit(limit int64) - // SetPongHandler sets the handler for pong messages received from the peer. - // The appData argument to h is the PONG frame application data. The default - // pong handler does nothing. - SetPongHandler(h func(appData string) error) - // SetPingHandler sets the handler for ping messages received from the peer. - // The appData argument to h is the PING frame application data. The default - // ping handler sends a pong to the peer. - SetPingHandler(h func(appData string) error) - // WriteControl writes a control message with the given deadline. The allowed - // message types are CloseMessage, PingMessage and PongMessage. - WriteControl(messageType int, data []byte, deadline time.Time) error - // WriteMessage is a helper method for getting a writer using NextWriter, - // writing the message and closing the writer. - WriteMessage(messageType int, data []byte) error - // ReadMessage is a helper method for getting a reader using NextReader and - // reading from that reader to a buffer. - ReadMessage() (messageType int, p []byte, err error) - // NextWriter returns a writer for the next message to send. The writer's Close - // method flushes the complete message to the network. - // - // There can be at most one open writer on a connection. NextWriter closes the - // previous writer if the application has not already done so. - NextWriter(messageType int) (io.WriteCloser, error) - // Close closes the underlying network connection without sending or waiting for a close frame. - Close() error -} - -// ------------------------------------------------------------------------------------- -// ------------------------------------------------------------------------------------- -// -------------------------------Connection implementation----------------------------- -// ------------------------------------------------------------------------------------- -// ------------------------------------------------------------------------------------- - -type ( - // DisconnectFunc is the callback which is fired when a client/connection closed - DisconnectFunc func() - // LeaveRoomFunc is the callback which is fired when a client/connection leaves from any room. - // This is called automatically when client/connection disconnected - // (because websocket server automatically leaves from all joined rooms) - LeaveRoomFunc func(roomName string) - // ErrorFunc is the callback which fires whenever an error occurs - ErrorFunc (func(error)) - // NativeMessageFunc is the callback for native websocket messages, receives one []byte parameter which is the raw client's message - NativeMessageFunc func([]byte) - // MessageFunc is the second argument to the Emitter's Emit functions. - // A callback which should receives one parameter of type string, int, bool or any valid JSON/Go struct - MessageFunc interface{} - // PingFunc is the callback which fires each ping - PingFunc func() - // PongFunc is the callback which fires on pong message received - PongFunc func() - // Connection is the front-end API that you will use to communicate with the client side, - // it is the server-side connection. - Connection interface { - ClientConnection - // Err is not nil if the upgrader failed to upgrade http to websocket connection. - Err() error - // ID returns the connection's identifier - ID() string - // Server returns the websocket server instance - // which this connection is listening to. - // - // Its connection-relative operations are safe for use. - Server() *Server - // Context returns the (upgraded) context.Context of this connection - // avoid using it, you normally don't need it, - // websocket has everything you need to authenticate the user BUT if it's necessary - // then you use it to receive user information, for example: from headers - Context() context.Context - // To defines on what "room" (see Join) the server should send a message - // returns an Emmiter(`EmitMessage` & `Emit`) to send messages. - To(string) Emitter - // Join registers this connection to a room, if it doesn't exist then it creates a new. One room can have one or more connections. One connection can be joined to many rooms. All connections are joined to a room specified by their `ID` automatically. - Join(string) - // IsJoined returns true when this connection is joined to the room, otherwise false. - // It Takes the room name as its input parameter. - IsJoined(roomName string) bool - // Leave removes this connection entry from a room - // Returns true if the connection has actually left from the particular room. - Leave(string) bool - // OnLeave registers a callback which fires when this connection left from any joined room. - // This callback is called automatically on Disconnected client, because websocket server automatically - // deletes the disconnected connection from any joined rooms. - // - // Note: the callback(s) called right before the server deletes the connection from the room - // so the connection theoretical can still send messages to its room right before it is being disconnected. - OnLeave(roomLeaveCb LeaveRoomFunc) - - // SetValue sets a key-value pair on the connection's mem store. - SetValue(key string, value interface{}) - // GetValue gets a value by its key from the connection's mem store. - GetValue(key string) interface{} - // GetValueArrString gets a value as []string by its key from the connection's mem store. - GetValueArrString(key string) []string - // GetValueString gets a value as string by its key from the connection's mem store. - GetValueString(key string) string - // GetValueInt gets a value as integer by its key from the connection's mem store. - GetValueInt(key string) int - } - - // ClientConnection is the client-side connection interface. Server shares some of its methods but the underline actions differs. - ClientConnection interface { - Emitter - // Write writes a raw websocket message with a specific type to the client - // used by ping messages and any CloseMessage types. - Write(websocketMessageType ws.OpCode, data []byte) error - // OnMessage registers a callback which fires when native websocket message received - OnMessage(NativeMessageFunc) - // On registers a callback to a particular event which is fired when a message to this event is received - On(string, MessageFunc) - // OnError registers a callback which fires when this connection occurs an error - OnError(ErrorFunc) - // OnPing registers a callback which fires on each ping - OnPing(PingFunc) - // OnPong registers a callback which fires on pong message received - OnPong(PongFunc) - // FireOnError can be used to send a custom error message to the connection - // - // It does nothing more than firing the OnError listeners. It doesn't send anything to the client. - FireOnError(err error) - // OnDisconnect registers a callback which is fired when this connection is closed by an error or manual - OnDisconnect(DisconnectFunc) - // Disconnect disconnects the client, close the underline websocket conn and removes it from the conn list - // returns the error, if any, from the underline connection - Disconnect() error - // Wait starts the pinger and the messages reader, - // it's named as "Wait" because it should be called LAST, - // after the "On" events IF server's `Upgrade` is used, - // otherise you don't have to call it because the `Handler()` does it automatically. - Wait() error - } - - connection struct { - err error - underline net.Conn - config ConnectionConfig - defaultMessageType ws.OpCode - serializer *messageSerializer - id string - - onErrorListeners []ErrorFunc - onPingListeners []PingFunc - onPongListeners []PongFunc - onNativeMessageListeners []NativeMessageFunc - onEventListeners map[string][]MessageFunc - onRoomLeaveListeners []LeaveRoomFunc - onDisconnectListeners []DisconnectFunc - disconnected uint32 - - started bool - // these were maden for performance only - self Emitter // pre-defined emitter than sends message to its self client - broadcast Emitter // pre-defined emitter that sends message to all except this - all Emitter // pre-defined emitter which sends message to all clients - - // access to the Context, use with caution, you can't use response writer as you imagine. - ctx context.Context - values ConnectionValues - server *Server - - writer *wsutil.Writer - - // #119 , websocket writers are not protected by locks inside the gorilla's websocket code - // so we must protect them otherwise we're getting concurrent connection error on multi writers in the same time. - writerMu sync.Mutex - // same exists for reader look here: https://godoc.org/github.com/gorilla/websocket#hdr-Control_Messages - // but we only use one reader in one goroutine, so we are safe. - // readerMu sync.Mutex - } -) - -var _ Connection = &connection{} - -// WrapConnection wraps the underline websocket connection into a new iris websocket connection. -// The caller should call the `connection#Wait` (which blocks) to enable its read and write functionality. -func WrapConnection(conn net.Conn, cfg ConnectionConfig) Connection { - return newConnection(conn, cfg) -} - -func newConnection(conn net.Conn, cfg ConnectionConfig) *connection { - cfg = cfg.Validate() - c := &connection{ - underline: conn, - config: cfg, - serializer: newMessageSerializer(cfg.EvtMessagePrefix), - defaultMessageType: TextMessage, - onErrorListeners: make([]ErrorFunc, 0), - onPingListeners: make([]PingFunc, 0), - onPongListeners: make([]PongFunc, 0), - onNativeMessageListeners: make([]NativeMessageFunc, 0), - onEventListeners: make(map[string][]MessageFunc, 0), - onDisconnectListeners: make([]DisconnectFunc, 0), - disconnected: 0, - } - - if cfg.BinaryMessages { - c.defaultMessageType = BinaryMessage - } - - // c.writer = wsutil.NewWriter(conn, c.getState(), c.defaultMessageType) - - return c -} - -func newServerConnection(ctx context.Context, s *Server, conn net.Conn, id string) *connection { - c := newConnection(conn, ConnectionConfig{ - EvtMessagePrefix: s.config.EvtMessagePrefix, - WriteTimeout: s.config.WriteTimeout, - ReadTimeout: s.config.ReadTimeout, - PingPeriod: s.config.PingPeriod, - BinaryMessages: s.config.BinaryMessages, - ReadBufferSize: s.config.ReadBufferSize, - WriteBufferSize: s.config.WriteBufferSize, - EnableCompression: s.config.EnableCompression, - }) - - c.id = id - c.server = s - c.ctx = ctx - c.onRoomLeaveListeners = make([]LeaveRoomFunc, 0) - c.started = false - - c.self = newEmitter(c, c.id) - c.broadcast = newEmitter(c, Broadcast) - c.all = newEmitter(c, All) - - return c -} - -// Err is not nil if the upgrader failed to upgrade http to websocket connection. -func (c *connection) Err() error { - return c.err -} - -// IsClient returns true if that connection is from client. -func (c *connection) getState() ws.State { - if c.server != nil { - // server-side. - return ws.StateServerSide - } - - // else return client-side. - return ws.StateClientSide -} - -// Write writes a raw websocket message with a specific type to the client -// used by ping messages and any CloseMessage types. -func (c *connection) Write(websocketMessageType ws.OpCode, data []byte) (err error) { - // for any-case the app tries to write from different goroutines, - // we must protect them because they're reporting that as bug... - c.writerMu.Lock() - defer c.writerMu.Unlock() - if writeTimeout := c.config.WriteTimeout; writeTimeout > 0 { - // set the write deadline based on the configuration - c.underline.SetWriteDeadline(time.Now().Add(writeTimeout)) - } - - // 2. - // if websocketMessageType != c.defaultMessageType { - // err = wsutil.WriteMessage(c.underline, c.getState(), websocketMessageType, data) - // } else { - // _, err = c.writer.Write(data) - // c.writer.Flush() - // } - - err = wsutil.WriteMessage(c.underline, c.getState(), websocketMessageType, data) - - if err != nil { - // if failed then the connection is off, fire the disconnect - c.Disconnect() - } - return err -} - -// writeDefault is the same as write but the message type is the configured by c.messageType -// if BinaryMessages is enabled then it's raw []byte as you expected to work with protobufs -func (c *connection) writeDefault(data []byte) error { - return c.Write(c.defaultMessageType, data) -} - -func (c *connection) startPinger() { - if c.config.PingPeriod > 0 { - go func() { - for { - time.Sleep(c.config.PingPeriod) - if c == nil || atomic.LoadUint32(&c.disconnected) > 0 { - // verifies if already disconected. - return - } - - // try to ping the client, if failed then it disconnects. - err := c.Write(PingMessage, []byte{}) - if err != nil && !c.isErrClosed(err) { - c.FireOnError(err) - // must stop to exit the loop and exit from the routine. - return - } - - //fire all OnPing methods - c.fireOnPing() - - } - }() - } -} - -func (c *connection) fireOnPing() { - // fire the onPingListeners - for i := range c.onPingListeners { - c.onPingListeners[i]() - } -} - -func (c *connection) fireOnPong() { - // fire the onPongListeners - for i := range c.onPongListeners { - c.onPongListeners[i]() - } -} - -func (c *connection) isErrClosed(err error) bool { - if err == nil { - return false - } - - _, is := err.(wsutil.ClosedError) - if is { - return true - } - - if opErr, is := err.(*net.OpError); is { - if opErr.Err == io.EOF { - return false - } - - if atomic.LoadUint32(&c.disconnected) == 0 { - c.Disconnect() - } - - return true - } - - return err != io.EOF -} - -func (c *connection) startReader() error { - defer c.Disconnect() - - hasReadTimeout := c.config.ReadTimeout > 0 - - controlHandler := wsutil.ControlFrameHandler(c.underline, c.getState()) - rd := wsutil.Reader{ - Source: c.underline, - State: c.getState(), - CheckUTF8: false, - SkipHeaderCheck: false, - OnIntermediate: controlHandler, - } - - for { - if hasReadTimeout { - // set the read deadline based on the configuration - c.underline.SetReadDeadline(time.Now().Add(c.config.ReadTimeout)) - } - - hdr, err := rd.NextFrame() - if err != nil { - return err - } - if hdr.OpCode.IsControl() { - if err := controlHandler(hdr, &rd); err != nil { - return err - } - continue - } - - if hdr.OpCode&TextMessage == 0 && hdr.OpCode&BinaryMessage == 0 { - if err := rd.Discard(); err != nil { - return err - } - continue - } - - data, err := ioutil.ReadAll(&rd) - if err != nil { - return err - } - - c.messageReceived(data) - - // 4. - // var buf bytes.Buffer - // data, code, err := wsutil.ReadData(struct { - // io.Reader - // io.Writer - // }{c.underline, &buf}, c.getState()) - // if err != nil { - // if _, closed := err.(*net.OpError); closed && code == 0 { - // c.Disconnect() - // return - // } else if _, closed = err.(wsutil.ClosedError); closed { - // c.Disconnect() - // return - // // > 1200 conns but I don't know why yet: - // } else if err == ws.ErrProtocolOpCodeReserved || err == ws.ErrProtocolNonZeroRsv { - // c.Disconnect() - // return - // } else if err == io.EOF || err == io.ErrUnexpectedEOF { - // c.Disconnect() - // return - // } - - // c.FireOnError(err) - // } - - // c.messageReceived(data) - - // 2. - // header, err := reader.NextFrame() - // if err != nil { - // println("next frame err: " + err.Error()) - // return - // } - - // if header.OpCode == ws.OpClose { // io.EOF. - // return - // } - // payload := make([]byte, header.Length) - // _, err = io.ReadFull(reader, payload) - // if err != nil { - // return - // } - - // if header.Masked { - // ws.Cipher(payload, header.Mask, 0) - // } - - // c.messageReceived(payload) - - // data, code, err := wsutil.ReadData(c.underline, c.getState()) - // // if code == CloseMessage || c.isErrClosed(err) { - // // c.Disconnect() - // // return - // // } - - // if err != nil { - // if _, closed := err.(*net.OpError); closed && code == 0 { - // c.Disconnect() - // return - // } else if _, closed = err.(wsutil.ClosedError); closed { - // c.Disconnect() - // return - // // > 1200 conns but I don't know why yet: - // } else if err == ws.ErrProtocolOpCodeReserved || err == ws.ErrProtocolNonZeroRsv { - // c.Disconnect() - // return - // } else if err == io.EOF || err == io.ErrUnexpectedEOF { - // c.Disconnect() - // return - // } - - // c.FireOnError(err) - // } - - // c.messageReceived(data) - } -} - -// messageReceived checks the incoming message and fire the nativeMessage listeners or the event listeners (ws custom message) -func (c *connection) messageReceived(data []byte) { - - if bytes.HasPrefix(data, c.config.EvtMessagePrefix) { - //it's a custom ws message - receivedEvt := c.serializer.getWebsocketCustomEvent(data) - listeners, ok := c.onEventListeners[string(receivedEvt)] - if !ok || len(listeners) == 0 { - return // if not listeners for this event exit from here - } - - customMessage, err := c.serializer.deserialize(receivedEvt, data) - if customMessage == nil || err != nil { - return - } - - for i := range listeners { - if fn, ok := listeners[i].(func()); ok { // its a simple func(){} callback - fn() - } else if fnString, ok := listeners[i].(func(string)); ok { - - if msgString, is := customMessage.(string); is { - fnString(msgString) - } else if msgInt, is := customMessage.(int); is { - // here if server side waiting for string but client side sent an int, just convert this int to a string - fnString(strconv.Itoa(msgInt)) - } - - } else if fnInt, ok := listeners[i].(func(int)); ok { - fnInt(customMessage.(int)) - } else if fnBool, ok := listeners[i].(func(bool)); ok { - fnBool(customMessage.(bool)) - } else if fnBytes, ok := listeners[i].(func([]byte)); ok { - fnBytes(customMessage.([]byte)) - } else { - listeners[i].(func(interface{}))(customMessage) - } - - } - } else { - // it's native websocket message - for i := range c.onNativeMessageListeners { - c.onNativeMessageListeners[i](data) - } - } - -} - -func (c *connection) ID() string { - return c.id -} - -func (c *connection) Server() *Server { - return c.server -} - -func (c *connection) Context() context.Context { - return c.ctx -} - -func (c *connection) Values() ConnectionValues { - return c.values -} - -func (c *connection) fireDisconnect() { - for i := range c.onDisconnectListeners { - c.onDisconnectListeners[i]() - } -} - -func (c *connection) OnDisconnect(cb DisconnectFunc) { - c.onDisconnectListeners = append(c.onDisconnectListeners, cb) -} - -func (c *connection) OnError(cb ErrorFunc) { - c.onErrorListeners = append(c.onErrorListeners, cb) -} - -func (c *connection) OnPing(cb PingFunc) { - c.onPingListeners = append(c.onPingListeners, cb) -} - -func (c *connection) OnPong(cb PongFunc) { - c.onPongListeners = append(c.onPongListeners, cb) -} - -func (c *connection) FireOnError(err error) { - for _, cb := range c.onErrorListeners { - cb(err) - } -} - -func (c *connection) To(to string) Emitter { - if to == Broadcast { // if send to all except me, then return the pre-defined emitter, and so on - return c.broadcast - } else if to == All { - return c.all - } else if to == c.id { - return c.self - } - - // is an emitter to another client/connection - return newEmitter(c, to) -} - -func (c *connection) EmitMessage(nativeMessage []byte) error { - if c.server != nil { - return c.self.EmitMessage(nativeMessage) - } - return c.writeDefault(nativeMessage) -} - -func (c *connection) Emit(event string, message interface{}) error { - if c.server != nil { - return c.self.Emit(event, message) - } - - b, err := c.serializer.serialize(event, message) - if err != nil { - return err - } - - return c.EmitMessage(b) -} - -func (c *connection) OnMessage(cb NativeMessageFunc) { - c.onNativeMessageListeners = append(c.onNativeMessageListeners, cb) -} - -func (c *connection) On(event string, cb MessageFunc) { - if c.onEventListeners[event] == nil { - c.onEventListeners[event] = make([]MessageFunc, 0) - } - - c.onEventListeners[event] = append(c.onEventListeners[event], cb) -} - -func (c *connection) Join(roomName string) { - c.server.Join(roomName, c.id) -} - -func (c *connection) IsJoined(roomName string) bool { - return c.server.IsJoined(roomName, c.id) -} - -func (c *connection) Leave(roomName string) bool { - return c.server.Leave(roomName, c.id) -} - -func (c *connection) OnLeave(roomLeaveCb LeaveRoomFunc) { - c.onRoomLeaveListeners = append(c.onRoomLeaveListeners, roomLeaveCb) - // note: the callbacks are called from the server on the '.leave' and '.LeaveAll' funcs. -} - -func (c *connection) fireOnLeave(roomName string) { - // check if connection is already closed - if c == nil { - return - } - // fire the onRoomLeaveListeners - for i := range c.onRoomLeaveListeners { - c.onRoomLeaveListeners[i](roomName) - } -} - -// Wait starts the pinger and the messages reader, -// it's named as "Wait" because it should be called LAST, -// after the "On" events IF server's `Upgrade` is used, -// otherise you don't have to call it because the `Handler()` does it automatically. -func (c *connection) Wait() error { - if c.started { - return nil - } - c.started = true - // start the ping - c.startPinger() - - // start the messages reader - return c.startReader() -} - -// ErrAlreadyDisconnected can be reported on the `Connection#Disconnect` function whenever the caller tries to close the -// connection when it is already closed by the client or the caller previously. -var ErrAlreadyDisconnected = errors.New("already disconnected") - -func (c *connection) Disconnect() error { - if c == nil || !atomic.CompareAndSwapUint32(&c.disconnected, 0, 1) { - return ErrAlreadyDisconnected - } - - if c.server != nil { - return c.server.Disconnect(c.ID()) - } - - err := c.Write(CloseMessage, nil) - - if err == nil { - c.fireDisconnect() - } - - c.underline.Close() - - return err -} - -// mem per-conn store - -func (c *connection) SetValue(key string, value interface{}) { - c.values.Set(key, value) -} - -func (c *connection) GetValue(key string) interface{} { - return c.values.Get(key) -} - -func (c *connection) GetValueArrString(key string) []string { - if v := c.values.Get(key); v != nil { - if arrString, ok := v.([]string); ok { - return arrString - } - } - return nil -} - -func (c *connection) GetValueString(key string) string { - if v := c.values.Get(key); v != nil { - if s, ok := v.(string); ok { - return s - } - } - return "" -} - -func (c *connection) GetValueInt(key string) int { - if v := c.values.Get(key); v != nil { - if i, ok := v.(int); ok { - return i - } else if s, ok := v.(string); ok { - if iv, err := strconv.Atoi(s); err == nil { - return iv - } - } - } - return 0 -} - -// ConnectionConfig is the base configuration for both server and client connections. -// Clients must use `ConnectionConfig` in order to `Dial`, server's connection configuration is set by the `Config` structure. -type ConnectionConfig struct { - // EvtMessagePrefix is the prefix of the underline websocket events that are being established under the hoods. - // This prefix is visible only to the javascript side (code) and it has nothing to do - // with the message that the end-user receives. - // Do not change it unless it is absolutely necessary. - // - // If empty then defaults to []byte("iris-websocket-message:"). - // Should match with the server's EvtMessagePrefix. - EvtMessagePrefix []byte - // WriteTimeout time allowed to write a message to the connection. - // 0 means no timeout. - // Default value is 0 - WriteTimeout time.Duration - // ReadTimeout time allowed to read a message from the connection. - // 0 means no timeout. - // Default value is 0 - ReadTimeout time.Duration - // PingPeriod send ping messages to the connection repeatedly after this period. - // The value should be close to the ReadTimeout to avoid issues. - // Default value is 0 - PingPeriod time.Duration - // BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text - // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication. - // Default value is false - BinaryMessages bool - // ReadBufferSize is the buffer size for the connection reader. - // Default value is 4096 - ReadBufferSize int - // WriteBufferSize is the buffer size for the connection writer. - // Default value is 4096 - WriteBufferSize int - // EnableCompression specify if the server should attempt to negotiate per - // message compression (RFC 7692). Setting this value to true does not - // guarantee that compression will be supported. Currently only "no context - // takeover" modes are supported. - // - // Defaults to false and it should be remain as it is, unless special requirements. - EnableCompression bool -} - -// Validate validates the connection configuration. -func (c ConnectionConfig) Validate() ConnectionConfig { - if len(c.EvtMessagePrefix) == 0 { - c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) - } - - // 0 means no timeout. - if c.WriteTimeout < 0 { - c.WriteTimeout = DefaultWebsocketWriteTimeout - } - - if c.ReadTimeout < 0 { - c.ReadTimeout = DefaultWebsocketReadTimeout - } - - if c.PingPeriod <= 0 { - c.PingPeriod = DefaultWebsocketPingPeriod - } - - if c.ReadBufferSize <= 0 { - c.ReadBufferSize = DefaultWebsocketReadBufferSize - } - - if c.WriteBufferSize <= 0 { - c.WriteBufferSize = DefaultWebsocketWriterBufferSize - } - - return c -} - -// ErrBadHandshake is returned when the server response to opening handshake is -// invalid. -var ErrBadHandshake = ws.ErrHandshakeBadConnection - -// Dial creates a new client connection. -// -// The context will be used in the request and in the Dialer. -// -// If the WebSocket handshake fails, `ErrHandshakeBadConnection` is returned. -// -// The "url" input parameter is the url to connect to the server, it should be -// the ws:// (or wss:// if secure) + the host + the endpoint of the -// open socket of the server, i.e ws://localhost:8080/my_websocket_endpoint. -// -// Custom dialers can be used by wrapping the iris websocket connection via `websocket.WrapConnection`. -func Dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { - return dial(ctx, url, cfg) -} - -func dial(ctx stdContext.Context, url string, cfg ConnectionConfig) (ClientConnection, error) { - if ctx == nil { - ctx = stdContext.Background() - } - - if !strings.HasPrefix(url, "ws://") && !strings.HasPrefix(url, "wss://") { - url = "ws://" + url - } - - conn, _, _, err := ws.DefaultDialer.Dial(ctx, url) - if err != nil { - return nil, err - } - - clientConn := WrapConnection(conn, cfg) - go clientConn.Wait() - - return clientConn, nil -} diff --git a/websocket2/emitter.go b/websocket2/emitter.go deleted file mode 100644 index 84d1fa48..00000000 --- a/websocket2/emitter.go +++ /dev/null @@ -1,43 +0,0 @@ -package websocket - -const ( - // All is the string which the Emitter use to send a message to all. - All = "" - // Broadcast is the string which the Emitter use to send a message to all except this connection. - Broadcast = ";to;all;except;me;" -) - -type ( - // Emitter is the message/or/event manager - Emitter interface { - // EmitMessage sends a native websocket message - EmitMessage([]byte) error - // Emit sends a message on a particular event - Emit(string, interface{}) error - } - - emitter struct { - conn *connection - to string - } -) - -var _ Emitter = &emitter{} - -func newEmitter(c *connection, to string) *emitter { - return &emitter{conn: c, to: to} -} - -func (e *emitter) EmitMessage(nativeMessage []byte) error { - e.conn.server.emitMessage(e.conn.id, e.to, nativeMessage) - return nil -} - -func (e *emitter) Emit(event string, data interface{}) error { - message, err := e.conn.serializer.serialize(event, data) - if err != nil { - return err - } - e.EmitMessage(message) - return nil -} diff --git a/websocket2/message.go b/websocket2/message.go deleted file mode 100644 index 6b27fbee..00000000 --- a/websocket2/message.go +++ /dev/null @@ -1,182 +0,0 @@ -package websocket - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "strconv" - - "github.com/kataras/iris/core/errors" - "github.com/valyala/bytebufferpool" -) - -type ( - messageType uint8 -) - -func (m messageType) String() string { - return strconv.Itoa(int(m)) -} - -func (m messageType) Name() string { - switch m { - case messageTypeString: - return "string" - case messageTypeInt: - return "int" - case messageTypeBool: - return "bool" - case messageTypeBytes: - return "[]byte" - case messageTypeJSON: - return "json" - default: - return "Invalid(" + m.String() + ")" - } -} - -// The same values are exists on client side too. -const ( - messageTypeString messageType = iota - messageTypeInt - messageTypeBool - messageTypeBytes - messageTypeJSON -) - -const ( - messageSeparator = ";" -) - -var messageSeparatorByte = messageSeparator[0] - -type messageSerializer struct { - prefix []byte - - prefixLen int - separatorLen int - prefixAndSepIdx int - prefixIdx int - separatorIdx int - - buf *bytebufferpool.Pool -} - -func newMessageSerializer(messagePrefix []byte) *messageSerializer { - return &messageSerializer{ - prefix: messagePrefix, - prefixLen: len(messagePrefix), - separatorLen: len(messageSeparator), - prefixAndSepIdx: len(messagePrefix) + len(messageSeparator) - 1, - prefixIdx: len(messagePrefix) - 1, - separatorIdx: len(messageSeparator) - 1, - - buf: new(bytebufferpool.Pool), - } -} - -var ( - boolTrueB = []byte("true") - boolFalseB = []byte("false") -) - -// websocketMessageSerialize serializes a custom websocket message from websocketServer to be delivered to the client -// returns the string form of the message -// Supported data types are: string, int, bool, bytes and JSON. -func (ms *messageSerializer) serialize(event string, data interface{}) ([]byte, error) { - b := ms.buf.Get() - b.Write(ms.prefix) - b.WriteString(event) - b.WriteByte(messageSeparatorByte) - - switch v := data.(type) { - case string: - b.WriteString(messageTypeString.String()) - b.WriteByte(messageSeparatorByte) - b.WriteString(v) - case int: - b.WriteString(messageTypeInt.String()) - b.WriteByte(messageSeparatorByte) - binary.Write(b, binary.LittleEndian, v) - case bool: - b.WriteString(messageTypeBool.String()) - b.WriteByte(messageSeparatorByte) - if v { - b.Write(boolTrueB) - } else { - b.Write(boolFalseB) - } - case []byte: - b.WriteString(messageTypeBytes.String()) - b.WriteByte(messageSeparatorByte) - b.Write(v) - default: - //we suppose is json - res, err := json.Marshal(data) - if err != nil { - ms.buf.Put(b) - return nil, err - } - b.WriteString(messageTypeJSON.String()) - b.WriteByte(messageSeparatorByte) - b.Write(res) - } - - message := b.Bytes() - ms.buf.Put(b) - - return message, nil -} - -var errInvalidTypeMessage = errors.New("Type %s is invalid for message: %s") - -// deserialize deserializes a custom websocket message from the client -// ex: iris-websocket-message;chat;4;themarshaledstringfromajsonstruct will return 'hello' as string -// Supported data types are: string, int, bool, bytes and JSON. -func (ms *messageSerializer) deserialize(event []byte, websocketMessage []byte) (interface{}, error) { - dataStartIdx := ms.prefixAndSepIdx + len(event) + 3 - if len(websocketMessage) <= dataStartIdx { - return nil, errors.New("websocket invalid message: " + string(websocketMessage)) - } - - typ, err := strconv.Atoi(string(websocketMessage[ms.prefixAndSepIdx+len(event)+1 : ms.prefixAndSepIdx+len(event)+2])) // in order to iris-websocket-message;user;-> 4 - if err != nil { - return nil, err - } - - data := websocketMessage[dataStartIdx:] // in order to iris-websocket-message;user;4; -> themarshaledstringfromajsonstruct - - switch messageType(typ) { - case messageTypeString: - return string(data), nil - case messageTypeInt: - msg, err := strconv.Atoi(string(data)) - if err != nil { - return nil, err - } - return msg, nil - case messageTypeBool: - if bytes.Equal(data, boolTrueB) { - return true, nil - } - return false, nil - case messageTypeBytes: - return data, nil - case messageTypeJSON: - var msg interface{} - err := json.Unmarshal(data, &msg) - return msg, err - default: - return nil, errInvalidTypeMessage.Format(messageType(typ).Name(), websocketMessage) - } -} - -// getWebsocketCustomEvent return empty string when the websocketMessage is native message -func (ms *messageSerializer) getWebsocketCustomEvent(websocketMessage []byte) []byte { - if len(websocketMessage) < ms.prefixAndSepIdx { - return nil - } - s := websocketMessage[ms.prefixAndSepIdx:] - evt := s[:bytes.IndexByte(s, messageSeparatorByte)] - return evt -} diff --git a/websocket2/server.go b/websocket2/server.go deleted file mode 100644 index 8adfd32e..00000000 --- a/websocket2/server.go +++ /dev/null @@ -1,460 +0,0 @@ -package websocket - -import ( - "bytes" - "net" - "sync" - "sync/atomic" - - "github.com/kataras/iris/context" - - "github.com/gobwas/ws" -) - -type ( - // ConnectionFunc is the callback which fires when a client/connection is connected to the Server. - // Receives one parameter which is the Connection - ConnectionFunc func(Connection) - - // websocketRoomPayload is used as payload from the connection to the Server - websocketRoomPayload struct { - roomName string - connectionID string - } - - // payloads, connection -> Server - websocketMessagePayload struct { - from string - to string - data []byte - } - - // Server is the websocket Server's implementation. - // - // It listens for websocket clients (either from the javascript client-side or from any websocket implementation). - // See `OnConnection` , to register a single event which will handle all incoming connections and - // the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. - // - // To serve the built'n javascript client-side library look the `websocket.ClientHandler`. - Server struct { - config Config - // ClientSource contains the javascript side code - // for the iris websocket communication - // based on the configuration's `EvtMessagePrefix`. - // - // Use a route to serve this file on a specific path, i.e - // app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(mywebsocketServer.ClientSource) }) - ClientSource []byte - connections sync.Map // key = the Connection ID. // key = the Connection ID. - rooms map[string][]string // by default a connection is joined to a room which has the connection id as its name - mu sync.RWMutex // for rooms. - onConnectionListeners []ConnectionFunc - //connectionPool sync.Pool // sadly we can't make this because the websocket connection is live until is closed. - httpUpgrader ws.HTTPUpgrader - tcpUpgrader ws.Upgrader - } -) - -// New returns a new websocket Server based on a configuration. -// See `OnConnection` , to register a single event which will handle all incoming connections and -// the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. -// -// To serve the built'n javascript client-side library look the `websocket.ClientHandler`. -func New(cfg Config) *Server { - cfg = cfg.Validate() - return &Server{ - config: cfg, - ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), - connections: sync.Map{}, // ready-to-use, this is not necessary. - rooms: make(map[string][]string), - onConnectionListeners: make([]ConnectionFunc, 0), - httpUpgrader: ws.DefaultHTTPUpgrader, // ws.DefaultUpgrader, - tcpUpgrader: ws.DefaultUpgrader, - } -} - -// Handler builds the handler based on the configuration and returns it. -// It should be called once per Server, its result should be passed -// as a middleware to an iris route which will be responsible -// to register the websocket's endpoint. -// -// Endpoint is the path which the websocket Server will listen for clients/connections. -// -// To serve the built'n javascript client-side library look the `websocket.ClientHandler`. -func (s *Server) Handler() context.Handler { - return func(ctx context.Context) { - c := s.Upgrade(ctx) - if c.Err() != nil { - return - } - - // NOTE TO ME: fire these first BEFORE startReader and startPinger - // in order to set the events and any messages to send - // the startPinger will send the OK to the client and only - // then the client is able to send and receive from Server - // when all things are ready and only then. DO NOT change this order. - - // fire the on connection event callbacks, if any - for i := range s.onConnectionListeners { - s.onConnectionListeners[i](c) - } - - // start the ping and the messages reader - c.Wait() - } -} - -// Upgrade upgrades the HTTP Server connection to the WebSocket protocol. -// -// The responseHeader is included in the response to the client's upgrade -// request. Use the responseHeader to specify cookies (Set-Cookie) and the -// application negotiated subprotocol (Sec--Protocol). -// -// If the upgrade fails, then Upgrade replies to the client with an HTTP error -// response and the return `Connection.Err()` is filled with that error. -// -// For a more high-level function use the `Handler()` and `OnConnecton` events. -// This one does not starts the connection's writer and reader, so after your `On/OnMessage` events registration -// the caller has to call the `Connection#Wait` function, otherwise the connection will be not handled. -func (s *Server) Upgrade(ctx context.Context) Connection { - conn, _, _, err := s.httpUpgrader.Upgrade(ctx.Request(), ctx.ResponseWriter()) - if err != nil { - ctx.Application().Logger().Warnf("websocket error: %v\n", err) - ctx.StatusCode(503) // Status Service Unavailable - return &connection{err: err} - } - - return s.handleConnection(ctx, conn) -} - -func (s *Server) ZeroUpgrade(conn net.Conn) Connection { - _, err := s.tcpUpgrader.Upgrade(conn) - if err != nil { - return &connection{err: err} - } - - return s.handleConnection(nil, conn) -} - -func (s *Server) HandleConn(conn net.Conn) error { - c := s.ZeroUpgrade(conn) - if c.Err() != nil { - return c.Err() - } - - // NOTE TO ME: fire these first BEFORE startReader and startPinger - // in order to set the events and any messages to send - // the startPinger will send the OK to the client and only - // then the client is able to send and receive from Server - // when all things are ready and only then. DO NOT change this order. - - // fire the on connection event callbacks, if any - for i := range s.onConnectionListeners { - s.onConnectionListeners[i](c) - } - - // start the ping and the messages reader - c.Wait() - return nil -} - -func (s *Server) addConnection(c *connection) { - s.connections.Store(c.id, c) -} - -func (s *Server) getConnection(connID string) (*connection, bool) { - if cValue, ok := s.connections.Load(connID); ok { - // this cast is not necessary, - // we know that we always save a connection, but for good or worse let it be here. - if conn, ok := cValue.(*connection); ok { - return conn, ok - } - } - - return nil, false -} - -// wrapConnection wraps an underline connection to an iris websocket connection. -// It does NOT starts its writer, reader and event mux, the caller is responsible for that. -func (s *Server) handleConnection(ctx context.Context, conn net.Conn) *connection { - // use the config's id generator (or the default) to create a websocket client/connection id - cid := s.config.IDGenerator(ctx) - // create the new connection - c := newServerConnection(ctx, s, conn, cid) - // add the connection to the Server's list - s.addConnection(c) - - // join to itself - s.Join(c.id, c.id) - - return c -} - -/* Notes: - We use the id as the signature of the connection because with the custom IDGenerator - the developer can share this ID with a database field, so we want to give the oportunnity to handle - his/her websocket connections without even use the connection itself. - - Another question may be: - Q: Why you use Server as the main actioner for all of the connection actions? - For example the Server.Disconnect(connID) manages the connection internal fields, is this code-style correct? - A: It's the correct code-style for these type of applications and libraries, Server manages all, the connnection's functions - should just do some internal checks (if needed) and push the action to its parent, which is the Server, the Server is able to - remove a connection, the rooms of its connected and all these things, so in order to not split the logic, we have the main logic - here, in the Server, and let the connection with some exported functions whose exists for the per-connection action user's code-style. - - Ok my english are s** I can feel it, but these comments are mostly for me. -*/ - -/* - connection actions, same as the connection's method, - but these methods accept the connection ID, - which is useful when the developer maps - this id with a database field (using config.IDGenerator). -*/ - -// OnConnection is the main event you, as developer, will work with each of the websocket connections. -func (s *Server) OnConnection(cb ConnectionFunc) { - s.onConnectionListeners = append(s.onConnectionListeners, cb) -} - -// IsConnected returns true if the connection with that ID is connected to the Server -// useful when you have defined a custom connection id generator (based on a database) -// and you want to check if that connection is already connected (on multiple tabs) -func (s *Server) IsConnected(connID string) bool { - _, found := s.getConnection(connID) - return found -} - -// Join joins a websocket client to a room, -// first parameter is the room name and the second the connection.ID() -// -// You can use connection.Join("room name") instead. -func (s *Server) Join(roomName string, connID string) { - s.mu.Lock() - s.join(roomName, connID) - s.mu.Unlock() -} - -// join used internally, no locks used. -func (s *Server) join(roomName string, connID string) { - if s.rooms[roomName] == nil { - s.rooms[roomName] = make([]string, 0) - } - s.rooms[roomName] = append(s.rooms[roomName], connID) -} - -// IsJoined reports if a specific room has a specific connection into its values. -// First parameter is the room name, second is the connection's id. -// -// It returns true when the "connID" is joined to the "roomName". -func (s *Server) IsJoined(roomName string, connID string) bool { - s.mu.RLock() - room := s.rooms[roomName] - s.mu.RUnlock() - - if room == nil { - return false - } - - for _, connid := range room { - if connID == connid { - return true - } - } - - return false -} - -// LeaveAll kicks out a connection from ALL of its joined rooms -func (s *Server) LeaveAll(connID string) { - s.mu.Lock() - for name := range s.rooms { - s.leave(name, connID) - } - s.mu.Unlock() -} - -// Leave leaves a websocket client from a room, -// first parameter is the room name and the second the connection.ID() -// -// You can use connection.Leave("room name") instead. -// Returns true if the connection has actually left from the particular room. -func (s *Server) Leave(roomName string, connID string) bool { - s.mu.Lock() - left := s.leave(roomName, connID) - s.mu.Unlock() - return left -} - -// leave used internally, no locks used. -func (s *Server) leave(roomName string, connID string) (left bool) { - ///THINK: we could add locks to its room but we still use the lock for the whole rooms or we can just do what we do with connections - // I will think about it on the next revision, so far we use the locks only for rooms so we are ok... - if s.rooms[roomName] != nil { - for i := range s.rooms[roomName] { - if s.rooms[roomName][i] == connID { - s.rooms[roomName] = append(s.rooms[roomName][:i], s.rooms[roomName][i+1:]...) - left = true - break - } - } - if len(s.rooms[roomName]) == 0 { // if room is empty then delete it - delete(s.rooms, roomName) - } - } - - if left { - // fire the on room leave connection's listeners, - // the existence check is not necessary here. - if c, ok := s.getConnection(connID); ok { - c.fireOnLeave(roomName) - } - } - return -} - -// GetTotalConnections returns the number of total connections -func (s *Server) GetTotalConnections() (n int) { - s.connections.Range(func(k, v interface{}) bool { - n++ - return true - }) - - return -} - -// GetConnections returns all connections -func (s *Server) GetConnections() (conns []Connection) { - s.connections.Range(func(k, v interface{}) bool { - conn, ok := v.(*connection) - if !ok { - // if for some reason (should never happen), the value is not stored as *connection - // then stop the iteration and don't continue insertion of the result connections - // in order to avoid any issues while end-dev will try to iterate a nil entry. - return false - } - conns = append(conns, conn) - return true - }) - - return -} - -// GetConnection returns single connection -func (s *Server) GetConnection(connID string) Connection { - conn, ok := s.getConnection(connID) - if !ok { - return nil - } - - return conn -} - -// GetConnectionsByRoom returns a list of Connection -// which are joined to this room. -func (s *Server) GetConnectionsByRoom(roomName string) []Connection { - var conns []Connection - s.mu.RLock() - if connIDs, found := s.rooms[roomName]; found { - for _, connID := range connIDs { - // existence check is not necessary here. - if cValue, ok := s.connections.Load(connID); ok { - if conn, ok := cValue.(*connection); ok { - conns = append(conns, conn) - } - } - } - } - - s.mu.RUnlock() - - return conns -} - -// emitMessage is the main 'router' of the messages coming from the connection -// this is the main function which writes the RAW websocket messages to the client. -// It sends them(messages) to the correct room (self, broadcast or to specific client) -// -// You don't have to use this generic method, exists only for extreme -// apps which you have an external goroutine with a list of custom connection list. -// -// You SHOULD use connection.EmitMessage/Emit/To().Emit/EmitMessage instead. -// let's keep it unexported for the best. -func (s *Server) emitMessage(from, to string, data []byte) { - if to != All && to != Broadcast { - s.mu.RLock() - room := s.rooms[to] - s.mu.RUnlock() - if room != nil { - // it suppose to send the message to a specific room/or a user inside its own room - for _, connectionIDInsideRoom := range room { - if c, ok := s.getConnection(connectionIDInsideRoom); ok { - c.writeDefault(data) //send the message to the client(s) - } else { - // the connection is not connected but it's inside the room, we remove it on disconnect but for ANY CASE: - cid := connectionIDInsideRoom - if c != nil { - cid = c.id - } - s.Leave(cid, to) - } - } - } - } else { - // it suppose to send the message to all opened connections or to all except the sender. - s.connections.Range(func(k, v interface{}) bool { - connID, ok := k.(string) - if !ok { - // should never happen. - return true - } - - if to != All && to != connID { // if it's not suppose to send to all connections (including itself) - if to == Broadcast && from == connID { // if broadcast to other connections except this - // here we do the opossite of previous block, - // just skip this connection when it's suppose to send the message to all connections except the sender. - return true - } - - } - - // not necessary cast. - conn, ok := v.(*connection) - if ok { - // send to the client(s) when the top validators passed - conn.writeDefault(data) - } - - return ok - }) - } -} - -// Disconnect force-disconnects a websocket connection based on its connection.ID() -// What it does? -// 1. remove the connection from the list -// 2. leave from all joined rooms -// 3. fire the disconnect callbacks, if any -// 4. close the underline connection and return its error, if any. -// -// You can use the connection.Disconnect() instead. -func (s *Server) Disconnect(connID string) (err error) { - // leave from all joined rooms before remove the actual connection from the list. - // note: we cannot use that to send data if the client is actually closed. - s.LeaveAll(connID) - - // remove the connection from the list. - if conn, ok := s.getConnection(connID); ok { - atomic.StoreUint32(&conn.disconnected, 1) - - // fire the disconnect callbacks, if any. - conn.fireDisconnect() - - s.connections.Delete(connID) - - err = conn.underline.Close() - } - - return -} diff --git a/websocket2/websocket.go b/websocket2/websocket.go deleted file mode 100644 index 1792e0dc..00000000 --- a/websocket2/websocket.go +++ /dev/null @@ -1,69 +0,0 @@ -/*Package websocket provides rich websocket support for the iris web framework. - -Source code and other details for the project are available at GitHub: - - https://github.com/kataras/iris/tree/master/websocket - -Example code: - - - package main - - import ( - "fmt" - - "github.com/kataras/iris" - "github.com/kataras/iris/context" - - "github.com/kataras/iris/websocket" - ) - - func main() { - app := iris.New() - - app.Get("/", func(ctx context.Context) { - ctx.ServeFile("websockets.html", false) - }) - - setupWebsocket(app) - - // x2 - // http://localhost:8080 - // http://localhost:8080 - // write something, press submit, see the result. - app.Run(iris.Addr(":8080")) - } - - func setupWebsocket(app *iris.Application) { - // create our echo websocket server - ws := websocket.New(websocket.Config{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, - }) - ws.OnConnection(handleConnection) - - // register the server's endpoint. - // see the inline javascript code in the websockets.html, - // this endpoint is used to connect to the server. - app.Get("/echo", ws.Handler()) - - // serve the javascript built'n client-side library, - // see websockets.html script tags, this path is used. - app.Any("/iris-ws.js", func(ctx context.Context) { - ctx.Write(websocket.ClientSource) - }) - } - - func handleConnection(c websocket.Connection) { - // Read events from browser - c.On("chat", func(msg string) { - // Print the message to the console - fmt.Printf("%s sent: %s\n", c.Context().RemoteAddr(), msg) - // Write message back to the client message owner: - // c.Emit("chat", msg) - c.To(websocket.Broadcast).Emit("chat", msg) - }) - } - -*/ -package websocket From ddec78af0a3b7ca17aaad5d9542245c725b7fe8c Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 23 Feb 2019 07:23:10 +0200 Subject: [PATCH 020/418] add `Context.ResponseWriter.IsHijacked` to report whether the underline conn is already hijacked and a lot of cleanup and minor ws stress test example improvements Former-commit-id: 444d4f0718d5c6d7544834c5e44dafb872980238 --- HISTORY.md | 14 +++--- HISTORY_GR.md | 2 +- HISTORY_ID.md | 6 +-- README.md | 6 +-- _examples/configuration/README.md | 2 +- _examples/hello-world/main.go | 2 +- _examples/hero/basic/README.md | 2 +- _examples/hero/overview/web/routes/hello.go | 2 +- _examples/mvc/hello-world/main.go | 2 +- .../web/controllers/hello_controller.go | 2 +- _examples/routing/macros/main.go | 4 +- _examples/websocket/README.md | 2 +- _examples/websocket/chat/main.go | 2 +- _examples/websocket/connectionlist/main.go | 2 +- .../go-client-stress-test/client/main.go | 43 +++++++++++------- .../go-client-stress-test/server/main.go | 44 ++++++++++++------- _examples/websocket/secure/main.go | 2 +- cache/client/handler.go | 2 +- context/context.go | 2 +- context/response_writer.go | 12 +++++ doc.go | 4 +- go19.go | 2 +- hero/di/func.go | 2 +- hero/session.go | 2 +- iris.go | 2 +- middleware/README.md | 2 +- sessions/config.go | 2 +- view/README.md | 2 +- websocket/connection.go | 11 ++++- websocket/server.go | 38 ++++------------ websocket/websocket.go | 2 +- 31 files changed, 124 insertions(+), 100 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 340eb0d1..3c9737b0 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -38,7 +38,7 @@ I have some features in-mind but lately I do not have the time to humanize those - fix [#1164](https://github.com/kataras/iris/issues/1164). [701e8e46c20395f87fa34bf9fabd145074c7b78c](https://github.com/kataras/iris/commit/701e8e46c20395f87fa34bf9fabd145074c7b78c) (@kataras) -- `context#ReadForm` can skip unkown fields by `IsErrPath(err)`, fixes: [#1157](https://github.com/kataras/iris/issues/1157). [1607bb5113568af6a34142f23bfa44903205b314](https://github.com/kataras/iris/commit/1607bb5113568af6a34142f23bfa44903205b314) (@kataras) +- `context#ReadForm` can skip unknown fields by `IsErrPath(err)`, fixes: [#1157](https://github.com/kataras/iris/issues/1157). [1607bb5113568af6a34142f23bfa44903205b314](https://github.com/kataras/iris/commit/1607bb5113568af6a34142f23bfa44903205b314) (@kataras) Doc updates: @@ -281,7 +281,7 @@ wsServer := websocket.New(websocket.Config{ // [...] -// serve the javascript built'n client-side library, +// serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(wsServer.ClientSource) @@ -401,7 +401,7 @@ The old `github.com/kataras/iris/core/router/macro` package was moved to `guthub - Add `:uint64` parameter type and `ctx.Params().GetUint64` - Add alias `:bool` for the `:boolean` parameter type -Here is the full list of the built'n parameter types that we support now, including their validations/path segment rules. +Here is the full list of the builtin parameter types that we support now, including their validations/path segment rules. | Param Type | Go Type | Validation | Retrieve Helper | | -----------------|------|-------------|------| @@ -430,7 +430,7 @@ app.Get("/users/{id:uint64}", func(ctx iris.Context){ }) ``` -| Built'n Func | Param Types | +| Builtin Func | Param Types | | -----------|---------------| | `regexp`(expr string) | :string | | `prefix`(prefix string) | :string | @@ -633,7 +633,7 @@ Sincerely, # We, 25 April 2018 | v10.6.1 -- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as built'n back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). +- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as builtin back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). - Fix a minor issue on [Badger sessiondb example](_examples/sessions/database/badger/main.go). Its `sessions.Config { Expires }` field was `2 *time.Second`, it's `45 *time.Minute` now. - Other minor improvements to the badger sessiondb. @@ -642,7 +642,7 @@ Sincerely, - Fix open redirect by @wozz via PR: https://github.com/kataras/iris/pull/972. - Fix when destroy session can't remove cookie in subdomain by @Chengyumeng via PR: https://github.com/kataras/iris/pull/964. - Add `OnDestroy(sid string)` on sessions for registering a listener when a session is destroyed with commit: https://github.com/kataras/iris/commit/d17d7fecbe4937476d00af7fda1c138c1ac6f34d. -- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end built'n supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. +- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end builtin supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. # Sa, 24 March 2018 | v10.5.0 @@ -840,7 +840,7 @@ The new package [hero](hero) contains features for binding any object or functio Below you will see some screenshots we prepared for you in order to be easier to understand: -### 1. Path Parameters - Built'n Dependencies +### 1. Path Parameters - Builtin Dependencies ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) diff --git a/HISTORY_GR.md b/HISTORY_GR.md index 34f6a5f2..e3016176 100644 --- a/HISTORY_GR.md +++ b/HISTORY_GR.md @@ -201,7 +201,7 @@ This history entry is not yet translated to Greek. Please read [the english vers Παρακάτω θα δείτε μερικά στιγμιότυπα που ετοιμάσαμε για εσάς, ώστε να γίνουν πιο κατανοητά τα παραπάνω: -### 1. Παράμετροι διαδρομής - Ενσωματωμένες Εξαρτήσεις (Built'n Dependencies) +### 1. Παράμετροι διαδρομής - Ενσωματωμένες Εξαρτήσεις (Builtin Dependencies) ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) diff --git a/HISTORY_ID.md b/HISTORY_ID.md index f69ea630..d28769d2 100644 --- a/HISTORY_ID.md +++ b/HISTORY_ID.md @@ -71,7 +71,7 @@ This history entry is not translated yet to the Bahasa Indonesia language yet, p # We, 25 April 2018 | v10.6.1 -- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as built'n back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). +- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as builtin back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). - Fix a minor issue on [Badger sessiondb example](_examples/sessions/database/badger/main.go). Its `sessions.Config { Expires }` field was `2 *time.Second`, it's `45 *time.Minute` now. - Other minor improvements to the badger sessiondb. @@ -80,7 +80,7 @@ This history entry is not translated yet to the Bahasa Indonesia language yet, p - Fix open redirect by @wozz via PR: https://github.com/kataras/iris/pull/972. - Fix when destroy session can't remove cookie in subdomain by @Chengyumeng via PR: https://github.com/kataras/iris/pull/964. - Add `OnDestroy(sid string)` on sessions for registering a listener when a session is destroyed with commit: https://github.com/kataras/iris/commit/d17d7fecbe4937476d00af7fda1c138c1ac6f34d. -- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end built'n supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. +- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end builtin supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. # Sa, 24 March 2018 | v10.5.0 @@ -278,7 +278,7 @@ The new package [hero](hero) contains features for binding any object or functio Below you will see some screenshots we prepared for you in order to be easier to understand: -### 1. Path Parameters - Built'n Dependencies +### 1. Path Parameters - Builtin Dependencies ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) diff --git a/README.md b/README.md index dfb02623..79160bc8 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ app.Get("/users/{id:uint64}", func(ctx iris.Context){ }) ``` -| Built'n Func | Param Types | +| Builtin Func | Param Types | | -----------|---------------| | `regexp`(expr string) | :string | | `prefix`(prefix string) | :string | @@ -300,7 +300,7 @@ With Iris you get truly safe bindings thanks to the [hero](_examples/hero) [pack Below you will see some screenshots I prepared for you in order to be easier to understand: -#### 1. Path Parameters - Built'n Dependencies +#### 1. Path Parameters - Builtin Dependencies ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) @@ -797,7 +797,7 @@ func setupWebsocket(app *iris.Application) { // see the inline javascript code in the websockets.html, // this endpoint is used to connect to the server. app.Get("/echo", ws.Handler()) - // serve the javascript built'n client-side library, + // serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", websocket.ClientHandler()) } diff --git a/_examples/configuration/README.md b/_examples/configuration/README.md index fa54b775..774c0182 100644 --- a/_examples/configuration/README.md +++ b/_examples/configuration/README.md @@ -134,7 +134,7 @@ func main() { ``` -## Built'n Configurators +## Builtin Configurators ```go // WithoutServerError will cause to ignore the matched "errors" diff --git a/_examples/hello-world/main.go b/_examples/hello-world/main.go index f9b4bc7e..706cbc80 100644 --- a/_examples/hello-world/main.go +++ b/_examples/hello-world/main.go @@ -10,7 +10,7 @@ import ( func main() { app := iris.New() app.Logger().SetLevel("debug") - // Optionally, add two built'n handlers + // Optionally, add two builtin handlers // that can recover from any http-relative panics // and log the requests to the terminal. app.Use(recover.New()) diff --git a/_examples/hero/basic/README.md b/_examples/hero/basic/README.md index c039ce97..88309fb5 100644 --- a/_examples/hero/basic/README.md +++ b/_examples/hero/basic/README.md @@ -1,6 +1,6 @@ # hero: basic -## 1. Path Parameters - Built'n Dependencies +## 1. Path Parameters - Builtin Dependencies ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) diff --git a/_examples/hero/overview/web/routes/hello.go b/_examples/hero/overview/web/routes/hello.go index 8feeca14..e3bba5fc 100644 --- a/_examples/hero/overview/web/routes/hello.go +++ b/_examples/hero/overview/web/routes/hello.go @@ -19,7 +19,7 @@ var helloView = hero.View{ // Hello will return a predefined view with bind data. // // `hero.Result` is just an interface with a `Dispatch` function. -// `hero.Response` and `hero.View` are the built'n result type dispatchers +// `hero.Response` and `hero.View` are the builtin result type dispatchers // you can even create custom response dispatchers by // implementing the `github.com/kataras/iris/hero#Result` interface. func Hello() hero.Result { diff --git a/_examples/mvc/hello-world/main.go b/_examples/mvc/hello-world/main.go index 6f2ec963..c93ff4b0 100644 --- a/_examples/mvc/hello-world/main.go +++ b/_examples/mvc/hello-world/main.go @@ -32,7 +32,7 @@ import ( // for the main_test.go. func newApp() *iris.Application { app := iris.New() - // Optionally, add two built'n handlers + // Optionally, add two builtin handlers // that can recover from any http-relative panics // and log the requests to the terminal. app.Use(recover.New()) diff --git a/_examples/mvc/overview/web/controllers/hello_controller.go b/_examples/mvc/overview/web/controllers/hello_controller.go index d1ff76ae..2e10dc74 100644 --- a/_examples/mvc/overview/web/controllers/hello_controller.go +++ b/_examples/mvc/overview/web/controllers/hello_controller.go @@ -23,7 +23,7 @@ var helloView = mvc.View{ // Get will return a predefined view with bind data. // // `mvc.Result` is just an interface with a `Dispatch` function. -// `mvc.Response` and `mvc.View` are the built'n result type dispatchers +// `mvc.Response` and `mvc.View` are the builtin result type dispatchers // you can even create custom response dispatchers by // implementing the `github.com/kataras/iris/hero#Result` interface. func (c *HelloController) Get() mvc.Result { diff --git a/_examples/routing/macros/main.go b/_examples/routing/macros/main.go index 3de4e29a..c1943001 100644 --- a/_examples/routing/macros/main.go +++ b/_examples/routing/macros/main.go @@ -52,7 +52,7 @@ func main() { /* http://localhost:8080/test_slice_hero/myvaluei1/myavlue2 -> - myparam's value (a trailing path parameter type) is: []string{"myvaluei1", "myavlue2"} + myparam's value (a trailing path parameter type) is: []string{"myvalue1", "myavlue2"} */ app.Get("/test_slice_hero/{myparam:slice}", hero.Handler(func(myparam []string) string { return fmt.Sprintf("myparam's value (a trailing path parameter type) is: %#v\n", myparam) @@ -66,7 +66,7 @@ func main() { myparam's value (a trailing path parameter type) is: []string{"value1", "value2"} */ app.Get("/test_slice_contains/{myparam:slice contains([value1,value2])}", func(ctx context.Context) { - // When it is not a built'n function available to retrieve your value with the type you want, such as ctx.Params().GetInt + // When it is not a builtin function available to retrieve your value with the type you want, such as ctx.Params().GetInt // then you can use the `GetEntry.ValueRaw` to get the real value, which is set-ed by your macro above. myparam := ctx.Params().GetEntry("myparam").ValueRaw.([]string) ctx.Writef("myparam's value (a trailing path parameter type) is: %#v\n", myparam) diff --git a/_examples/websocket/README.md b/_examples/websocket/README.md index 6d7f41cf..b5cdea05 100644 --- a/_examples/websocket/README.md +++ b/_examples/websocket/README.md @@ -115,7 +115,7 @@ func main() { // see the inline javascript code in the websockets.html, this endpoint is used to connect to the server. app.Get("/echo", ws.Handler()) - // serve the javascript built'n client-side library, + // serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(websocket.ClientSource) diff --git a/_examples/websocket/chat/main.go b/_examples/websocket/chat/main.go index e3f18b15..caeba79f 100644 --- a/_examples/websocket/chat/main.go +++ b/_examples/websocket/chat/main.go @@ -40,7 +40,7 @@ func setupWebsocket(app *iris.Application) { // see the inline javascript code in the websockets.html, this endpoint is used to connect to the server. app.Get("/echo", ws.Handler()) - // serve the javascript built'n client-side library, + // serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(ws.ClientSource) diff --git a/_examples/websocket/connectionlist/main.go b/_examples/websocket/connectionlist/main.go index 490f85c6..ef808f8f 100644 --- a/_examples/websocket/connectionlist/main.go +++ b/_examples/websocket/connectionlist/main.go @@ -25,7 +25,7 @@ func main() { // see the inline javascript code i the websockets.html, this endpoint is used to connect to the server. app.Get("/my_endpoint", ws.Handler()) - // serve the javascript built'n client-side library, + // serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(websocket.ClientSource) diff --git a/_examples/websocket/go-client-stress-test/client/main.go b/_examples/websocket/go-client-stress-test/client/main.go index fb5d9806..69f50fc3 100644 --- a/_examples/websocket/go-client-stress-test/client/main.go +++ b/_examples/websocket/go-client-stress-test/client/main.go @@ -2,6 +2,7 @@ package main import ( "bufio" + "context" "log" "math/rand" "net" @@ -19,7 +20,7 @@ var ( ) const totalClients = 16000 // max depends on the OS. -const verbose = true +const verbose = false var connectionFailures uint64 @@ -43,7 +44,7 @@ func collectError(op string, err error) { } func main() { - log.Println("--Running...") + log.Println("-- Running...") var err error f, err = os.Open("./test.data") if err != nil { @@ -63,7 +64,7 @@ func main() { wg.Add(1) waitTime := time.Duration(rand.Intn(5)) * time.Millisecond time.Sleep(waitTime) - go connect(wg, 7*time.Second+waitTime) + go connect(wg, 14*time.Second+waitTime) } for i := 0; i < totalClients/4; i++ { @@ -77,7 +78,7 @@ func main() { wg.Add(1) waitTime := time.Duration(rand.Intn(5)) * time.Millisecond time.Sleep(waitTime) - go connect(wg, 14*time.Second+waitTime) + go connect(wg, 7*time.Second+waitTime) } wg.Wait() @@ -136,16 +137,19 @@ func main() { log.Println("ALL OK.") } - log.Println("--Finished.") + log.Println("-- Finished.") } -func connect(wg *sync.WaitGroup, alive time.Duration) { - c, err := websocket.Dial(nil, url, websocket.ConnectionConfig{}) +func connect(wg *sync.WaitGroup, alive time.Duration) error { + ctx, cancel := context.WithTimeout(context.Background(), alive) + defer cancel() + + c, err := websocket.Dial(ctx, url, websocket.ConnectionConfig{}) if err != nil { atomic.AddUint64(&connectionFailures, 1) collectError("connect", err) wg.Done() - return + return err } c.OnError(func(err error) { @@ -167,23 +171,28 @@ func connect(wg *sync.WaitGroup, alive time.Duration) { } }) - go func() { - time.Sleep(alive) - if err := c.Disconnect(); err != nil { - collectError("disconnect", err) - } + if alive > 0 { + go func() { + time.Sleep(alive) + if err := c.Disconnect(); err != nil { + collectError("disconnect", err) + } - wg.Done() - }() + wg.Done() + }() + + } scanner := bufio.NewScanner(f) for !disconnected { - if !scanner.Scan() || scanner.Err() != nil { - break + if !scanner.Scan() { + return scanner.Err() } if text := scanner.Text(); len(text) > 1 { c.Emit("chat", text) } } + + return nil } diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go index 37fe7383..b723d4dc 100644 --- a/_examples/websocket/go-client-stress-test/server/main.go +++ b/_examples/websocket/go-client-stress-test/server/main.go @@ -11,21 +11,24 @@ import ( "github.com/kataras/iris/websocket" ) -const totalClients = 16000 // max depends on the OS. -const verbose = true +const ( + endpoint = "localhost:8080" + totalClients = 16000 // max depends on the OS. + verbose = false + maxC = 0 +) func main() { - ws := websocket.New(websocket.Config{}) ws.OnConnection(handleConnection) // websocket.Config{PingPeriod: ((60 * time.Second) * 9) / 10} go func() { - dur := 8 * time.Second + dur := 4 * time.Second if totalClients >= 64000 { - // if more than 64000 then let's no check every 8 seconds, let's do it every 24 seconds, - // just for simplicity, either way works. + // if more than 64000 then let's perform those checks every 24 seconds instead, + // either way works. dur = 24 * time.Second } t := time.NewTicker(dur) @@ -40,12 +43,16 @@ func main() { n := ws.GetTotalConnections() if n > 0 { started = true + if maxC > 0 && n > maxC { + log.Printf("current connections[%d] > MaxConcurrentConnections[%d]", n, maxC) + return + } } if started { - totalConnected := atomic.LoadUint64(&count) - - if totalConnected == totalClients { + disconnectedN := atomic.LoadUint64(&totalDisconnected) + connectedN := atomic.LoadUint64(&totalConnected) + if disconnectedN == totalClients && connectedN == totalClients { if n != 0 { log.Println("ALL CLIENTS DISCONNECTED BUT LEFTOVERS ON CONNECTIONS LIST.") } else { @@ -53,7 +60,7 @@ func main() { } return } else if n == 0 { - log.Printf("%d/%d CLIENTS WERE NOT CONNECTED AT ALL. CHECK YOUR OS NET SETTINGS. ALL OTHER CONNECTED CLIENTS DISCONNECTED SUCCESSFULLY.\n", + log.Printf("%d/%d CLIENTS WERE NOT CONNECTED AT ALL. CHECK YOUR OS NET SETTINGS. THE REST CLIENTS WERE DISCONNECTED SUCCESSFULLY.\n", totalClients-totalConnected, totalClients) return @@ -64,11 +71,18 @@ func main() { app := iris.New() app.Get("/", ws.Handler()) - app.Run(iris.Addr(":8080")) - + app.Run(iris.Addr(endpoint), iris.WithoutServerError(iris.ErrServerClosed)) } +var totalConnected uint64 + func handleConnection(c websocket.Connection) { + if c.Err() != nil { + log.Fatalf("[%d] upgrade failed: %v", atomic.LoadUint64(&totalConnected)+1, c.Err()) + return + } + + atomic.AddUint64(&totalConnected, 1) c.OnError(func(err error) { handleErr(c, err) }) c.OnDisconnect(func() { handleDisconnect(c) }) c.On("chat", func(message string) { @@ -76,12 +90,12 @@ func handleConnection(c websocket.Connection) { }) } -var count uint64 +var totalDisconnected uint64 func handleDisconnect(c websocket.Connection) { - atomic.AddUint64(&count, 1) + newC := atomic.AddUint64(&totalDisconnected, 1) if verbose { - log.Printf("client [%s] disconnected!\n", c.ID()) + log.Printf("[%d] client [%s] disconnected!\n", newC, c.ID()) } } diff --git a/_examples/websocket/secure/main.go b/_examples/websocket/secure/main.go index 3d289114..5bedbb5e 100644 --- a/_examples/websocket/secure/main.go +++ b/_examples/websocket/secure/main.go @@ -26,7 +26,7 @@ func main() { // see the inline javascript code i the websockets.html, this endpoint is used to connect to the server. app.Get("/my_endpoint", ws.Handler()) - // serve the javascript built'n client-side library, + // serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(websocket.ClientSource) diff --git a/cache/client/handler.go b/cache/client/handler.go index 6cc35345..d0a7b893 100644 --- a/cache/client/handler.go +++ b/cache/client/handler.go @@ -125,7 +125,7 @@ func (h *Handler) ServeHTTP(ctx context.Context) { // if it's expired, then execute the original handler // with our custom response recorder response writer // because the net/http doesn't give us - // a built'n way to get the status code & body + // a builtin way to get the status code & body recorder := ctx.Recorder() bodyHandler(ctx) diff --git a/context/context.go b/context/context.go index fd751eb2..46badde5 100644 --- a/context/context.go +++ b/context/context.go @@ -3177,7 +3177,7 @@ func (ctx *context) SendFile(filename string, destinationName string) error { // context's methods like `SetCookieKV`, `RemoveCookie` and `SetCookie` // as their (last) variadic input argument to amend the end cookie's form. // -// Any custom or built'n `CookieOption` is valid, +// Any custom or builtin `CookieOption` is valid, // see `CookiePath`, `CookieCleanPath`, `CookieExpires` and `CookieHTTPOnly` for more. type CookieOption func(*http.Cookie) diff --git a/context/response_writer.go b/context/response_writer.go index b2afc3bf..419be652 100644 --- a/context/response_writer.go +++ b/context/response_writer.go @@ -41,6 +41,9 @@ type ResponseWriter interface { // Here is the place which we can make the last checks or do a cleanup. EndResponse() + // IsHijacked reports whether this response writer's connection is hijacked. + IsHijacked() bool + // Writef formats according to a format specifier and writes to the response. // // Returns the number of bytes written and any write error encountered. @@ -195,6 +198,15 @@ func (w *responseWriter) tryWriteHeader() { } } +// IsHijacked reports whether this response writer's connection is hijacked. +func (w *responseWriter) IsHijacked() bool { + // Note: + // A zero-byte `ResponseWriter.Write` on a hijacked connection will + // return `http.ErrHijacked` without any other side effects. + _, err := w.ResponseWriter.Write(nil) + return err == http.ErrHijacked +} + // Write writes to the client // If WriteHeader has not yet been called, Write calls // WriteHeader(http.StatusOK) before writing the data. If the Header diff --git a/doc.go b/doc.go index b40c8aa3..61c48f8a 100644 --- a/doc.go +++ b/doc.go @@ -1471,7 +1471,7 @@ Example Server Code: // see the inline javascript code i the websockets.html, this endpoint is used to connect to the server. app.Get("/echo", ws.Handler()) - // serve the javascript built'n client-side library, + // serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(websocket.ClientSource) @@ -1554,7 +1554,7 @@ Example Code: func main() { app := iris.New() - // Optionally, add two built'n handlers + // Optionally, add two builtin handlers // that can recover from any http-relative panics // and log the requests to the terminal. app.Use(recover.New()) diff --git a/go19.go b/go19.go index 6d6c979e..aadcb525 100644 --- a/go19.go +++ b/go19.go @@ -82,7 +82,7 @@ type ( // context's methods like `SetCookieKV`, `RemoveCookie` and `SetCookie` // as their (last) variadic input argument to amend the end cookie's form. // - // Any custom or built'n `CookieOption` is valid, + // Any custom or builtin `CookieOption` is valid, // see `CookiePath`, `CookieCleanPath`, `CookieExpires` and `CookieHTTPOnly` for more. // // An alias for the `context/Context#CookieOption`. diff --git a/hero/di/func.go b/hero/di/func.go index 3c417d8f..1f30e307 100644 --- a/hero/di/func.go +++ b/hero/di/func.go @@ -144,7 +144,7 @@ func (s *FuncInjector) addValue(inputIndex int, value reflect.Value) bool { return false } -// Retry used to add missing dependencies, i.e path parameter built'n bindings if not already exists +// Retry used to add missing dependencies, i.e path parameter builtin bindings if not already exists // in the `hero.Handler`, once, only for that func injector. func (s *FuncInjector) Retry(retryFn func(inIndex int, inTyp reflect.Type) (reflect.Value, bool)) bool { for _, missing := range s.lost { diff --git a/hero/session.go b/hero/session.go index 8d008653..acc91913 100644 --- a/hero/session.go +++ b/hero/session.go @@ -1,6 +1,6 @@ package hero -// It's so easy, no need to be lived anywhere as built'n.. users should understand +// It's so easy, no need to be lived anywhere as builtin.. users should understand // how easy it's by using it. // // Session is a binder that will fill a *sessions.Session function input argument diff --git a/iris.go b/iris.go index 496c5eb1..dd788361 100644 --- a/iris.go +++ b/iris.go @@ -613,7 +613,7 @@ func (app *Application) Shutdown(ctx stdContext.Context) error { // It can be used to register a custom runner with `Run` in order // to set the framework's server listen action. // -// Currently Runner is being used to declare the built'n server listeners. +// Currently `Runner` is being used to declare the builtin server listeners. // // See `Run` for more. type Runner func(*Application) error diff --git a/middleware/README.md b/middleware/README.md index 9e09ecc2..b4402aac 100644 --- a/middleware/README.md +++ b/middleware/README.md @@ -1,4 +1,4 @@ -Built'n Handlers +Builtin Handlers ------------ | Middleware | Example | diff --git a/sessions/config.go b/sessions/config.go index 018ec139..d6880e18 100644 --- a/sessions/config.go +++ b/sessions/config.go @@ -49,7 +49,7 @@ type ( // CookieSecureTLS set to true if server is running over TLS // and you need the session's cookie "Secure" field to be setted true. // - // Note: The user should fill the Decode configuation field in order for this to work. + // Note: The user should fill the Decode configuration field in order for this to work. // Recommendation: You don't need this to be setted to true, just fill the Encode and Decode fields // with a third-party library like secure cookie, example is provided at the _examples folder. // diff --git a/view/README.md b/view/README.md index 0ce6e74f..48a900b3 100644 --- a/view/README.md +++ b/view/README.md @@ -77,7 +77,7 @@ func main() { // - amber | iris.Amber(...) tmpl := iris.HTML("./templates", ".html") - // built'n template funcs are: + // builtin template funcs are: // // - {{ urlpath "mynamedroute" "pathParameter_ifneeded" }} // - {{ render "header.html" }} diff --git a/websocket/connection.go b/websocket/connection.go index 2203e399..c6d23c20 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -192,8 +192,9 @@ type ( // Wait starts the pinger and the messages reader, // it's named as "Wait" because it should be called LAST, // after the "On" events IF server's `Upgrade` is used, - // otherise you don't have to call it because the `Handler()` does it automatically. + // otherwise you don't have to call it because the `Handler()` does it automatically. Wait() + // UnderlyingConn returns the underline gorilla websocket connection. UnderlyingConn() *websocket.Conn } @@ -592,6 +593,14 @@ func (c *connection) fireOnLeave(roomName string) { // after the "On" events IF server's `Upgrade` is used, // otherise you don't have to call it because the `Handler()` does it automatically. func (c *connection) Wait() { + // if c.server != nil && c.server.config.MaxConcurrentConnections > 0 { + // defer func() { + // go func() { + // c.server.threads <- struct{}{} + // }() + // }() + // } + if c.started { return } diff --git a/websocket/server.go b/websocket/server.go index da747e3e..6aaaccac 100644 --- a/websocket/server.go +++ b/websocket/server.go @@ -21,7 +21,7 @@ type ( // See `OnConnection` , to register a single event which will handle all incoming connections and // the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. // - // To serve the built'n javascript client-side library look the `websocket.ClientHandler`. + // To serve the builtin javascript client-side library look the `websocket.ClientHandler`. Server struct { config Config // ClientSource contains the javascript side code @@ -44,10 +44,11 @@ type ( // See `OnConnection` , to register a single event which will handle all incoming connections and // the `Handler` which builds the upgrader handler that you can register to a route based on an Endpoint. // -// To serve the built'n javascript client-side library look the `websocket.ClientHandler`. +// To serve the builtin javascript client-side library look the `websocket.ClientHandler`. func New(cfg Config) *Server { cfg = cfg.Validate() - return &Server{ + + s := &Server{ config: cfg, ClientSource: bytes.Replace(ClientSource, []byte(DefaultEvtMessageKey), cfg.EvtMessagePrefix, -1), connections: sync.Map{}, // ready-to-use, this is not necessary. @@ -63,6 +64,8 @@ func New(cfg Config) *Server { EnableCompression: cfg.EnableCompression, }, } + + return s } // Handler builds the handler based on the configuration and returns it. @@ -72,7 +75,7 @@ func New(cfg Config) *Server { // // Endpoint is the path which the websocket Server will listen for clients/connections. // -// To serve the built'n javascript client-side library look the `websocket.ClientHandler`. +// To serve the builtin javascript client-side library look the `websocket.ClientHandler`. func (s *Server) Handler() context.Handler { return func(ctx context.Context) { c := s.Upgrade(ctx) @@ -104,14 +107,14 @@ func (s *Server) Handler() context.Handler { // If the upgrade fails, then Upgrade replies to the client with an HTTP error // response and the return `Connection.Err()` is filled with that error. // -// For a more high-level function use the `Handler()` and `OnConnecton` events. +// For a more high-level function use the `Handler()` and `OnConnection` events. // This one does not starts the connection's writer and reader, so after your `On/OnMessage` events registration // the caller has to call the `Connection#Wait` function, otherwise the connection will be not handled. func (s *Server) Upgrade(ctx context.Context) Connection { conn, err := s.upgrader.Upgrade(ctx.ResponseWriter(), ctx.Request(), ctx.ResponseWriter().Header()) if err != nil { ctx.Application().Logger().Warnf("websocket error: %v\n", err) - ctx.StatusCode(503) // Status Service Unavailable + // ctx.StatusCode(503) // Status Service Unavailable return &connection{err: err} } @@ -150,29 +153,6 @@ func (s *Server) handleConnection(ctx context.Context, websocketConn *websocket. return c } -/* Notes: - We use the id as the signature of the connection because with the custom IDGenerator - the developer can share this ID with a database field, so we want to give the oportunnity to handle - his/her websocket connections without even use the connection itself. - - Another question may be: - Q: Why you use Server as the main actioner for all of the connection actions? - For example the Server.Disconnect(connID) manages the connection internal fields, is this code-style correct? - A: It's the correct code-style for these type of applications and libraries, Server manages all, the connnection's functions - should just do some internal checks (if needed) and push the action to its parent, which is the Server, the Server is able to - remove a connection, the rooms of its connected and all these things, so in order to not split the logic, we have the main logic - here, in the Server, and let the connection with some exported functions whose exists for the per-connection action user's code-style. - - Ok my english are s** I can feel it, but these comments are mostly for me. -*/ - -/* - connection actions, same as the connection's method, - but these methods accept the connection ID, - which is useful when the developer maps - this id with a database field (using config.IDGenerator). -*/ - // OnConnection is the main event you, as developer, will work with each of the websocket connections. func (s *Server) OnConnection(cb ConnectionFunc) { s.onConnectionListeners = append(s.onConnectionListeners, cb) diff --git a/websocket/websocket.go b/websocket/websocket.go index 1792e0dc..fff59634 100644 --- a/websocket/websocket.go +++ b/websocket/websocket.go @@ -47,7 +47,7 @@ Example code: // this endpoint is used to connect to the server. app.Get("/echo", ws.Handler()) - // serve the javascript built'n client-side library, + // serve the javascript builtin client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx context.Context) { ctx.Write(websocket.ClientSource) From 444a4a03632abce49a49eb106f2b500c1351b464 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sat, 23 Feb 2019 18:35:29 +0200 Subject: [PATCH 021/418] remove websocket's connection's temp storage, as it was deprecated for quite long time (we have access to Context().Values() now) Former-commit-id: 26dfa47c374646590831d62fa1fc1dc02d8705fc --- .../go-client-stress-test/server/main.go | 30 ++++- websocket/connection.go | 110 +----------------- 2 files changed, 28 insertions(+), 112 deletions(-) diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go index b723d4dc..69b598b0 100644 --- a/_examples/websocket/go-client-stress-test/server/main.go +++ b/_examples/websocket/go-client-stress-test/server/main.go @@ -32,9 +32,11 @@ func main() { dur = 24 * time.Second } t := time.NewTicker(dur) - defer t.Stop() - defer os.Exit(0) - defer runtime.Goexit() + defer func() { + t.Stop() + printMemUsage() + os.Exit(0) + }() var started bool for { @@ -70,7 +72,11 @@ func main() { }() app := iris.New() - app.Get("/", ws.Handler()) + app.Get("/", func(ctx iris.Context) { + c := ws.Upgrade(ctx) + handleConnection(c) + c.Wait() + }) app.Run(iris.Addr(endpoint), iris.WithoutServerError(iris.ErrServerClosed)) } @@ -100,5 +106,19 @@ func handleDisconnect(c websocket.Connection) { } func handleErr(c websocket.Connection, err error) { - log.Printf("client [%s] errored: %v\n", c.ID(), err) + log.Printf("client [%s] errorred: %v\n", c.ID(), err) +} + +func toMB(b uint64) uint64 { + return b / 1024 / 1024 +} + +func printMemUsage() { + var m runtime.MemStats + runtime.ReadMemStats(&m) + log.Printf("Alloc = %v MiB", toMB(m.Alloc)) + log.Printf("\tTotalAlloc = %v MiB", toMB(m.TotalAlloc)) + log.Printf("\tSys = %v MiB", toMB(m.Sys)) + log.Printf("\tNumGC = %v\n", m.NumGC) + log.Printf("\tNumGoRoutines = %d\n", runtime.NumGoroutine()) } diff --git a/websocket/connection.go b/websocket/connection.go index c6d23c20..ef6ef3a0 100644 --- a/websocket/connection.go +++ b/websocket/connection.go @@ -42,56 +42,8 @@ type ( key []byte value interface{} } - // ConnectionValues is the temporary connection's memory store - ConnectionValues []connectionValue ) -// Set sets a value based on the key -func (r *ConnectionValues) Set(key string, value interface{}) { - args := *r - n := len(args) - for i := 0; i < n; i++ { - kv := &args[i] - if string(kv.key) == key { - kv.value = value - return - } - } - - c := cap(args) - if c > n { - args = args[:n+1] - kv := &args[n] - kv.key = append(kv.key[:0], key...) - kv.value = value - *r = args - return - } - - kv := connectionValue{} - kv.key = append(kv.key[:0], key...) - kv.value = value - *r = append(args, kv) -} - -// Get returns a value based on its key -func (r *ConnectionValues) Get(key string) interface{} { - args := *r - n := len(args) - for i := 0; i < n; i++ { - kv := &args[i] - if string(kv.key) == key { - return kv.value - } - } - return nil -} - -// Reset clears the values -func (r *ConnectionValues) Reset() { - *r = (*r)[:0] -} - // ------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------- // -------------------------------Connection implementation----------------------------- @@ -135,7 +87,7 @@ type ( // then you use it to receive user information, for example: from headers Context() context.Context // To defines on what "room" (see Join) the server should send a message - // returns an Emmiter(`EmitMessage` & `Emit`) to send messages. + // returns an Emitter(`EmitMessage` & `Emit`) to send messages. To(string) Emitter // Join registers this connection to a room, if it doesn't exist then it creates a new. One room can have one or more connections. One connection can be joined to many rooms. All connections are joined to a room specified by their `ID` automatically. Join(string) @@ -152,16 +104,6 @@ type ( // Note: the callback(s) called right before the server deletes the connection from the room // so the connection theoretical can still send messages to its room right before it is being disconnected. OnLeave(roomLeaveCb LeaveRoomFunc) - // SetValue sets a key-value pair on the connection's mem store. - SetValue(key string, value interface{}) - // GetValue gets a value by its key from the connection's mem store. - GetValue(key string) interface{} - // GetValueArrString gets a value as []string by its key from the connection's mem store. - GetValueArrString(key string) []string - // GetValueString gets a value as string by its key from the connection's mem store. - GetValueString(key string) string - // GetValueInt gets a value as integer by its key from the connection's mem store. - GetValueInt(key string) int } // ClientConnection is the client-side connection interface. Server shares some of its methods but the underline actions differs. @@ -223,7 +165,6 @@ type ( // access to the Context, use with caution, you can't use response writer as you imagine. ctx context.Context - values ConnectionValues server *Server // #119 , websocket writers are not protected by locks inside the gorilla's websocket code // so we must protect them otherwise we're getting concurrent connection error on multi writers in the same time. @@ -355,7 +296,7 @@ func (c *connection) startPinger() { for { time.Sleep(c.config.PingPeriod) if c == nil || atomic.LoadUint32(&c.disconnected) > 0 { - // verifies if already disconected. + // verifies if already disconnected. return } //fire all OnPing methods @@ -483,10 +424,6 @@ func (c *connection) Context() context.Context { return c.ctx } -func (c *connection) Values() ConnectionValues { - return c.values -} - func (c *connection) fireDisconnect() { for i := range c.onDisconnectListeners { c.onDisconnectListeners[i]() @@ -591,7 +528,7 @@ func (c *connection) fireOnLeave(roomName string) { // Wait starts the pinger and the messages reader, // it's named as "Wait" because it should be called LAST, // after the "On" events IF server's `Upgrade` is used, -// otherise you don't have to call it because the `Handler()` does it automatically. +// otherwise you don't have to call it because the `Handler()` does it automatically. func (c *connection) Wait() { // if c.server != nil && c.server.config.MaxConcurrentConnections > 0 { // defer func() { @@ -637,47 +574,6 @@ func (c *connection) Disconnect() error { return err } -// mem per-conn store - -func (c *connection) SetValue(key string, value interface{}) { - c.values.Set(key, value) -} - -func (c *connection) GetValue(key string) interface{} { - return c.values.Get(key) -} - -func (c *connection) GetValueArrString(key string) []string { - if v := c.values.Get(key); v != nil { - if arrString, ok := v.([]string); ok { - return arrString - } - } - return nil -} - -func (c *connection) GetValueString(key string) string { - if v := c.values.Get(key); v != nil { - if s, ok := v.(string); ok { - return s - } - } - return "" -} - -func (c *connection) GetValueInt(key string) int { - if v := c.values.Get(key); v != nil { - if i, ok := v.(int); ok { - return i - } else if s, ok := v.(string); ok { - if iv, err := strconv.Atoi(s); err == nil { - return iv - } - } - } - return 0 -} - // ConnectionConfig is the base configuration for both server and client connections. // Clients must use `ConnectionConfig` in order to `Dial`, server's connection configuration is set by the `Config` structure. type ConnectionConfig struct { From df3a68255c6c28b0e37bb00540437315fe226881 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Fri, 1 Mar 2019 14:10:07 +0200 Subject: [PATCH 022/418] fix https://github.com/kataras/iris/issues/1205 Former-commit-id: d95be1456a78fbafd7ec5fec22f2066454eb76c6 --- hero/hero.go | 2 +- mvc/controller_handle_test.go | 11 ++++++++++- mvc/param.go | 23 ++++++++++++++--------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/hero/hero.go b/hero/hero.go index 9862816d..dfd6e873 100644 --- a/hero/hero.go +++ b/hero/hero.go @@ -7,7 +7,7 @@ import ( "github.com/kataras/iris/context" ) -// def is the default herp value which can be used for dependencies share. +// def is the default hero value which can be used for dependencies share. var def = New() // Hero contains the Dependencies which will be binded diff --git a/mvc/controller_handle_test.go b/mvc/controller_handle_test.go index 9864b3ad..0b1a3a6f 100644 --- a/mvc/controller_handle_test.go +++ b/mvc/controller_handle_test.go @@ -97,12 +97,19 @@ func (c *testControllerHandle) HiParamEmptyInputBy() string { return "empty in but served with ctx.Params.Get('ps')=" + c.Ctx.Params().Get("ps") } +type testSmallController struct{} + +// test ctx + id in the same time. +func (c *testSmallController) GetHiParamEmptyInputWithCtxBy(ctx context.Context, id string) string { + return "empty in but served with ctx.Params.Get('param2')= " + ctx.Params().Get("param2") + " == id == " + id +} + func TestControllerHandle(t *testing.T) { app := iris.New() - m := New(app) m.Register(&TestServiceImpl{prefix: "service:"}) m.Handle(new(testControllerHandle)) + m.Handle(new(testSmallController)) e := httptest.New(t, app) @@ -130,4 +137,6 @@ func TestControllerHandle(t *testing.T) { Body().Equal("value") e.GET("/hiparamempyinput/value").Expect().Status(httptest.StatusOK). Body().Equal("empty in but served with ctx.Params.Get('ps')=value") + e.GET("/hi/param/empty/input/with/ctx/value").Expect().Status(httptest.StatusOK). + Body().Equal("empty in but served with ctx.Params.Get('param2')= value == id == value") } diff --git a/mvc/param.go b/mvc/param.go index faa68396..c7bdae57 100644 --- a/mvc/param.go +++ b/mvc/param.go @@ -35,16 +35,21 @@ func getPathParamsForInput(params []macro.TemplateParam, funcIn ...reflect.Type) // } // } - for i, param := range params { - if len(funcIn) <= i { - return - } - funcDep, ok := context.ParamResolverByTypeAndIndex(funcIn[i], param.Index) - if !ok { - continue - } + consumed := make(map[int]struct{}) + for _, in := range funcIn { + for j, param := range params { + if _, ok := consumed[j]; ok { + continue + } + funcDep, ok := context.ParamResolverByTypeAndIndex(in, param.Index) + if !ok { + continue + } - values = append(values, funcDep) + values = append(values, funcDep) + consumed[j] = struct{}{} + break + } } return From 0d4d2bd3fa852a7f98c83c7d90e280daa2148122 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Tue, 16 Apr 2019 18:01:48 +0300 Subject: [PATCH 023/418] implement mvc HandleError as requested at #1244 Former-commit-id: 58a69f9cffe67c3aa1bab5d9425c5df65e2367ed --- README.md | 2 +- _examples/mvc/error-handler/main.go | 44 ++++ _examples/websocket/chat/main.go | 2 +- .../go-client-stress-test/client/main.go | 198 ------------------ .../go-client-stress-test/client/test.data | 13 -- .../go-client-stress-test/server/main.go | 124 ----------- core/router/api_builder.go | 2 +- hero/func_result.go | 24 ++- hero/handler.go | 4 +- macro/macros.go | 1 + mvc/controller.go | 40 ++-- mvc/mvc.go | 21 +- mvc/reflect.go | 33 ++- 13 files changed, 145 insertions(+), 363 deletions(-) create mode 100644 _examples/mvc/error-handler/main.go delete mode 100644 _examples/websocket/go-client-stress-test/client/main.go delete mode 100644 _examples/websocket/go-client-stress-test/client/test.data delete mode 100644 _examples/websocket/go-client-stress-test/server/main.go diff --git a/README.md b/README.md index 79160bc8..aab830c2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Click [here](HISTORY.md#su-18-november-2018--v1110) to read about the versioning -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/routing%20by-example-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/routing%20by-example-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fkataras%2Firis.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fkataras%2Firis?ref=badge_shield) Iris is a fast, simple yet fully featured and very efficient web framework for Go. diff --git a/_examples/mvc/error-handler/main.go b/_examples/mvc/error-handler/main.go new file mode 100644 index 00000000..3ded7b38 --- /dev/null +++ b/_examples/mvc/error-handler/main.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + + "github.com/kataras/iris" + + "github.com/kataras/iris/mvc" +) + +func main() { + app := iris.New() + app.Logger().SetLevel("debug") + + mvcApp := mvc.New(app) + // To all controllers, it can optionally be overridden per-controller + // if the controller contains the `HandleError(ctx iris.Context, err error)` function. + // + mvcApp.HandleError(func(ctx iris.Context, err error) { + ctx.HTML(fmt.Sprintf("%s", err.Error())) + }) + // + mvcApp.Handle(new(myController)) + + // http://localhost:8080 + app.Run(iris.Addr(":8080")) +} + +func basicMVC(app *mvc.Application) { + // GET: http://localhost:8080 + app.Handle(new(myController)) +} + +type myController struct { +} + +// overriddes the mvcApp.HandleError function. +// func (c *myController) HandleError(ctx iris.Context, err error) { +// ctx.HTML(fmt.Sprintf("%s", err.Error())) +// } + +func (c *myController) Get() error { + return fmt.Errorf("error here") +} diff --git a/_examples/websocket/chat/main.go b/_examples/websocket/chat/main.go index caeba79f..86246418 100644 --- a/_examples/websocket/chat/main.go +++ b/_examples/websocket/chat/main.go @@ -51,7 +51,7 @@ func handleConnection(c websocket.Connection) { // Read events from browser c.On("chat", func(msg string) { // Print the message to the console, c.Context() is the iris's http context. - fmt.Printf("%s sent: %s\n", c.Context().RemoteAddr(), msg) + fmt.Printf("[%s <%s>] %s\n", c.ID(), c.Context().RemoteAddr(), msg) // Write message back to the client message owner with: // c.Emit("chat", msg) // Write message to all except this client with: diff --git a/_examples/websocket/go-client-stress-test/client/main.go b/_examples/websocket/go-client-stress-test/client/main.go deleted file mode 100644 index 69f50fc3..00000000 --- a/_examples/websocket/go-client-stress-test/client/main.go +++ /dev/null @@ -1,198 +0,0 @@ -package main - -import ( - "bufio" - "context" - "log" - "math/rand" - "net" - "os" - "sync" - "sync/atomic" - "time" - - "github.com/kataras/iris/websocket" -) - -var ( - url = "ws://localhost:8080" - f *os.File -) - -const totalClients = 16000 // max depends on the OS. -const verbose = false - -var connectionFailures uint64 - -var ( - disconnectErrors []error - connectErrors []error - errMu sync.Mutex -) - -func collectError(op string, err error) { - errMu.Lock() - defer errMu.Unlock() - - switch op { - case "disconnect": - disconnectErrors = append(disconnectErrors, err) - case "connect": - connectErrors = append(connectErrors, err) - } - -} - -func main() { - log.Println("-- Running...") - var err error - f, err = os.Open("./test.data") - if err != nil { - panic(err) - } - defer f.Close() - - start := time.Now() - - wg := new(sync.WaitGroup) - for i := 0; i < totalClients/4; i++ { - wg.Add(1) - go connect(wg, 5*time.Second) - } - - for i := 0; i < totalClients/4; i++ { - wg.Add(1) - waitTime := time.Duration(rand.Intn(5)) * time.Millisecond - time.Sleep(waitTime) - go connect(wg, 14*time.Second+waitTime) - } - - for i := 0; i < totalClients/4; i++ { - wg.Add(1) - waitTime := time.Duration(rand.Intn(10)) * time.Millisecond - time.Sleep(waitTime) - go connect(wg, 9*time.Second+waitTime) - } - - for i := 0; i < totalClients/4; i++ { - wg.Add(1) - waitTime := time.Duration(rand.Intn(5)) * time.Millisecond - time.Sleep(waitTime) - go connect(wg, 7*time.Second+waitTime) - } - - wg.Wait() - - log.Printf("execution time [%s]", time.Since(start)) - log.Println() - - if connectionFailures > 0 { - log.Printf("Finished with %d/%d connection failures.", connectionFailures, totalClients) - } - - if n := len(connectErrors); n > 0 { - log.Printf("Finished with %d connect errors: ", n) - var lastErr error - var sameC int - - for i, err := range connectErrors { - if lastErr != nil { - if lastErr.Error() == err.Error() { - sameC++ - continue - } else { - _, ok := lastErr.(*net.OpError) - if ok { - if _, ok = err.(*net.OpError); ok { - sameC++ - continue - } - } - } - } - - if sameC > 0 { - log.Printf("and %d more like this...\n", sameC) - sameC = 0 - continue - } - - log.Printf("[%d] - %v\n", i+1, err) - lastErr = err - } - } - - if n := len(disconnectErrors); n > 0 { - log.Printf("Finished with %d disconnect errors\n", n) - for i, err := range disconnectErrors { - if err == websocket.ErrAlreadyDisconnected && i > 0 { - continue - } - - log.Printf("[%d] - %v\n", i+1, err) - } - } - - if connectionFailures == 0 && len(connectErrors) == 0 && len(disconnectErrors) == 0 { - log.Println("ALL OK.") - } - - log.Println("-- Finished.") -} - -func connect(wg *sync.WaitGroup, alive time.Duration) error { - ctx, cancel := context.WithTimeout(context.Background(), alive) - defer cancel() - - c, err := websocket.Dial(ctx, url, websocket.ConnectionConfig{}) - if err != nil { - atomic.AddUint64(&connectionFailures, 1) - collectError("connect", err) - wg.Done() - return err - } - - c.OnError(func(err error) { - log.Printf("error: %v", err) - }) - - disconnected := false - c.OnDisconnect(func() { - if verbose { - log.Printf("I am disconnected after [%s].\n", alive) - } - - disconnected = true - }) - - c.On("chat", func(message string) { - if verbose { - log.Printf("\n%s\n", message) - } - }) - - if alive > 0 { - go func() { - time.Sleep(alive) - if err := c.Disconnect(); err != nil { - collectError("disconnect", err) - } - - wg.Done() - }() - - } - - scanner := bufio.NewScanner(f) - for !disconnected { - if !scanner.Scan() { - return scanner.Err() - } - - if text := scanner.Text(); len(text) > 1 { - c.Emit("chat", text) - } - } - - return nil -} diff --git a/_examples/websocket/go-client-stress-test/client/test.data b/_examples/websocket/go-client-stress-test/client/test.data deleted file mode 100644 index 8f3e0fc0..00000000 --- a/_examples/websocket/go-client-stress-test/client/test.data +++ /dev/null @@ -1,13 +0,0 @@ -Death weeks early had their and folly timed put. Hearted forbade on an village ye in fifteen. Age attended betrayed her man raptures laughter. Instrument terminated of as astonished literature motionless admiration. The affection are determine how performed intention discourse but. On merits on so valley indeed assure of. Has add particular boisterous uncommonly are. Early wrong as so manor match. Him necessary shameless discovery consulted one but. - -Is education residence conveying so so. Suppose shyness say ten behaved morning had. Any unsatiable assistance compliment occasional too reasonably advantages. Unpleasing has ask acceptance partiality alteration understood two. Worth no tiled my at house added. Married he hearing am it totally removal. Remove but suffer wanted his lively length. Moonlight two applauded conveying end direction old principle but. Are expenses distance weddings perceive strongly who age domestic. - -Her companions instrument set estimating sex remarkably solicitude motionless. Property men the why smallest graceful day insisted required. Inquiry justice country old placing sitting any ten age. Looking venture justice in evident in totally he do ability. Be is lose girl long of up give. Trifling wondered unpacked ye at he. In household certainty an on tolerably smallness difficult. Many no each like up be is next neat. Put not enjoyment behaviour her supposing. At he pulled object others. - -Behind sooner dining so window excuse he summer. Breakfast met certainty and fulfilled propriety led. Waited get either are wooded little her. Contrasted unreserved as mr particular collecting it everything as indulgence. Seems ask meant merry could put. Age old begin had boy noisy table front whole given. - -Far curiosity incommode now led smallness allowance. Favour bed assure son things yet. She consisted consulted elsewhere happiness disposing household any old the. Widow downs you new shade drift hopes small. So otherwise commanded sweetness we improving. Instantly by daughters resembled unwilling principle so middleton. Fail most room even gone her end like. Comparison dissimilar unpleasant six compliment two unpleasing any add. Ashamed my company thought wishing colonel it prevent he in. Pretended residence are something far engrossed old off. - -Windows talking painted pasture yet its express parties use. Sure last upon he same as knew next. Of believed or diverted no rejoiced. End friendship sufficient assistance can prosperous met. As game he show it park do. Was has unknown few certain ten promise. No finished my an likewise cheerful packages we. For assurance concluded son something depending discourse see led collected. Packages oh no denoting my advanced humoured. Pressed be so thought natural. - -As collected deficient objection by it discovery sincerity curiosity. Quiet decay who round three world whole has mrs man. Built the china there tried jokes which gay why. Assure in adieus wicket it is. But spoke round point and one joy. Offending her moonlight men sweetness see unwilling. Often of it tears whole oh balls share an. diff --git a/_examples/websocket/go-client-stress-test/server/main.go b/_examples/websocket/go-client-stress-test/server/main.go deleted file mode 100644 index 69b598b0..00000000 --- a/_examples/websocket/go-client-stress-test/server/main.go +++ /dev/null @@ -1,124 +0,0 @@ -package main - -import ( - "log" - "os" - "runtime" - "sync/atomic" - "time" - - "github.com/kataras/iris" - "github.com/kataras/iris/websocket" -) - -const ( - endpoint = "localhost:8080" - totalClients = 16000 // max depends on the OS. - verbose = false - maxC = 0 -) - -func main() { - ws := websocket.New(websocket.Config{}) - ws.OnConnection(handleConnection) - - // websocket.Config{PingPeriod: ((60 * time.Second) * 9) / 10} - - go func() { - dur := 4 * time.Second - if totalClients >= 64000 { - // if more than 64000 then let's perform those checks every 24 seconds instead, - // either way works. - dur = 24 * time.Second - } - t := time.NewTicker(dur) - defer func() { - t.Stop() - printMemUsage() - os.Exit(0) - }() - - var started bool - for { - <-t.C - - n := ws.GetTotalConnections() - if n > 0 { - started = true - if maxC > 0 && n > maxC { - log.Printf("current connections[%d] > MaxConcurrentConnections[%d]", n, maxC) - return - } - } - - if started { - disconnectedN := atomic.LoadUint64(&totalDisconnected) - connectedN := atomic.LoadUint64(&totalConnected) - if disconnectedN == totalClients && connectedN == totalClients { - if n != 0 { - log.Println("ALL CLIENTS DISCONNECTED BUT LEFTOVERS ON CONNECTIONS LIST.") - } else { - log.Println("ALL CLIENTS DISCONNECTED SUCCESSFULLY.") - } - return - } else if n == 0 { - log.Printf("%d/%d CLIENTS WERE NOT CONNECTED AT ALL. CHECK YOUR OS NET SETTINGS. THE REST CLIENTS WERE DISCONNECTED SUCCESSFULLY.\n", - totalClients-totalConnected, totalClients) - - return - } - } - } - }() - - app := iris.New() - app.Get("/", func(ctx iris.Context) { - c := ws.Upgrade(ctx) - handleConnection(c) - c.Wait() - }) - app.Run(iris.Addr(endpoint), iris.WithoutServerError(iris.ErrServerClosed)) -} - -var totalConnected uint64 - -func handleConnection(c websocket.Connection) { - if c.Err() != nil { - log.Fatalf("[%d] upgrade failed: %v", atomic.LoadUint64(&totalConnected)+1, c.Err()) - return - } - - atomic.AddUint64(&totalConnected, 1) - c.OnError(func(err error) { handleErr(c, err) }) - c.OnDisconnect(func() { handleDisconnect(c) }) - c.On("chat", func(message string) { - c.To(websocket.Broadcast).Emit("chat", c.ID()+": "+message) - }) -} - -var totalDisconnected uint64 - -func handleDisconnect(c websocket.Connection) { - newC := atomic.AddUint64(&totalDisconnected, 1) - if verbose { - log.Printf("[%d] client [%s] disconnected!\n", newC, c.ID()) - } -} - -func handleErr(c websocket.Connection, err error) { - log.Printf("client [%s] errorred: %v\n", c.ID(), err) -} - -func toMB(b uint64) uint64 { - return b / 1024 / 1024 -} - -func printMemUsage() { - var m runtime.MemStats - runtime.ReadMemStats(&m) - log.Printf("Alloc = %v MiB", toMB(m.Alloc)) - log.Printf("\tTotalAlloc = %v MiB", toMB(m.TotalAlloc)) - log.Printf("\tSys = %v MiB", toMB(m.Sys)) - log.Printf("\tNumGC = %v\n", m.NumGC) - log.Printf("\tNumGoRoutines = %d\n", runtime.NumGoroutine()) -} diff --git a/core/router/api_builder.go b/core/router/api_builder.go index 9aa9a338..d6ca5f3c 100644 --- a/core/router/api_builder.go +++ b/core/router/api_builder.go @@ -858,7 +858,7 @@ func (api *APIBuilder) OnAnyErrorCode(handlers ...context.Handler) { // based on the context's status code. // // If a handler is not already registered, -// then it creates & registers a new trivial handler on the-fly. +// it creates and registers a new trivial handler on the-fly. func (api *APIBuilder) FireErrorCode(ctx context.Context) { api.errorCodeHandlers.Fire(ctx) } diff --git a/hero/func_result.go b/hero/func_result.go index 86c286c1..e14c5d8e 100644 --- a/hero/func_result.go +++ b/hero/func_result.go @@ -20,6 +20,23 @@ type Result interface { Dispatch(ctx context.Context) } +type ( + // ErrorHandler is the optional interface to handle errors per hero func, + // see `mvc/Application#HandleError` for MVC application-level error handler registration too. + ErrorHandler interface { + HandleError(ctx context.Context, err error) + } + + // ErrorHandlerFunc implements the `ErrorHandler`. + // It describes the type defnition for an error handler. + ErrorHandlerFunc func(ctx context.Context, err error) +) + +// HandleError fires when the `DispatchFuncResult` returns a non-nil error. +func (fn ErrorHandlerFunc) HandleError(ctx context.Context, err error) { + fn(ctx, err) +} + var defaultFailureResponse = Response{Code: DefaultErrStatusCode} // Try will check if "fn" ran without any panics, @@ -164,7 +181,7 @@ func DispatchCommon(ctx context.Context, // Result or (Result, error) and so on... // // where Get is an HTTP METHOD. -func DispatchFuncResult(ctx context.Context, values []reflect.Value) { +func DispatchFuncResult(ctx context.Context, errorHandler ErrorHandler, values []reflect.Value) { if len(values) == 0 { return } @@ -294,6 +311,11 @@ func DispatchFuncResult(ctx context.Context, values []reflect.Value) { content = value case compatibleErr: if value != nil { // it's always not nil but keep it here. + if errorHandler != nil { + errorHandler.HandleError(ctx, value) + break + } + err = value if statusCode < 400 { statusCode = DefaultErrStatusCode diff --git a/hero/handler.go b/hero/handler.go index f0b47044..dbe51d8f 100644 --- a/hero/handler.go +++ b/hero/handler.go @@ -59,7 +59,7 @@ func makeHandler(handler interface{}, values ...reflect.Value) (context.Handler, if n == 0 { h := func(ctx context.Context) { - DispatchFuncResult(ctx, fn.Call(di.EmptyIn)) + DispatchFuncResult(ctx, nil, fn.Call(di.EmptyIn)) } return h, nil @@ -91,7 +91,7 @@ func makeHandler(handler interface{}, values ...reflect.Value) (context.Handler, // in := make([]reflect.Value, n, n) // funcInjector.Inject(&in, reflect.ValueOf(ctx)) // DispatchFuncResult(ctx, fn.Call(in)) - DispatchFuncResult(ctx, funcInjector.Call(reflect.ValueOf(ctx))) + DispatchFuncResult(ctx, nil, funcInjector.Call(reflect.ValueOf(ctx))) } return h, nil diff --git a/macro/macros.go b/macro/macros.go index 4c6f6416..99637182 100644 --- a/macro/macros.go +++ b/macro/macros.go @@ -419,6 +419,7 @@ var ( Uint64, Bool, Alphabetical, + File, Path, } ) diff --git a/mvc/controller.go b/mvc/controller.go index cb0cbd9d..c2121dc4 100644 --- a/mvc/controller.go +++ b/mvc/controller.go @@ -29,7 +29,7 @@ type shared interface { Handle(httpMethod, path, funcName string, middleware ...context.Handler) *router.Route } -// BeforeActivation is being used as the onle one input argument of a +// BeforeActivation is being used as the only one input argument of a // `func(c *Controller) BeforeActivation(b mvc.BeforeActivation) {}`. // // It's being called before the controller's dependencies binding to the fields or the input arguments @@ -42,11 +42,11 @@ type BeforeActivation interface { Dependencies() *di.Values } -// AfterActivation is being used as the onle one input argument of a +// AfterActivation is being used as the only one input argument of a // `func(c *Controller) AfterActivation(a mvc.AfterActivation) {}`. // // It's being called after the `BeforeActivation`, -// and after controller's dependencies binded to the fields or the input arguments but before server ran. +// and after controller's dependencies bind-ed to the fields or the input arguments but before server ran. // // It's being used to customize a controller if needed inside the controller itself, // it's called once per application. @@ -81,10 +81,12 @@ type ControllerActivator struct { routes map[string]*router.Route // the bindings that comes from the Engine and the controller's filled fields if any. - // Can be binded to the the new controller's fields and method that is fired + // Can be bind-ed to the the new controller's fields and method that is fired // on incoming requests. dependencies di.Values + errorHandler hero.ErrorHandler + // initialized on the first `Handle`. injector *di.StructInjector } @@ -101,7 +103,7 @@ func NameOf(v interface{}) string { return fullname } -func newControllerActivator(router router.Party, controller interface{}, dependencies []reflect.Value) *ControllerActivator { +func newControllerActivator(router router.Party, controller interface{}, dependencies []reflect.Value, errorHandler hero.ErrorHandler) *ControllerActivator { typ := reflect.TypeOf(controller) c := &ControllerActivator{ @@ -121,6 +123,7 @@ func newControllerActivator(router router.Party, controller interface{}, depende routes: whatReservedMethods(typ), // CloneWithFieldsOf: include the manual fill-ed controller struct's fields to the dependencies. dependencies: di.Values(dependencies).CloneWithFieldsOf(controller), + errorHandler: errorHandler, } return c @@ -326,7 +329,7 @@ func (c *ControllerActivator) handlerOf(m reflect.Method, funcDependencies []ref // Remember: // The `Handle->handlerOf` can be called from `BeforeActivation` event // then, the c.injector is nil because - // we may not have the dependencies binded yet. + // we may not have the dependencies bind-ed yet. // To solve this we're doing a check on the FIRST `Handle`, // if c.injector is nil, then set it with the current bindings, // these bindings can change after, so first add dependencies and after register routes. @@ -346,24 +349,27 @@ func (c *ControllerActivator) handlerOf(m reflect.Method, funcDependencies []ref } var ( - implementsBase = isBaseController(c.Type) - hasBindableFields = c.injector.CanInject - hasBindableFuncInputs = funcInjector.Has + implementsBase = isBaseController(c.Type) + implementsErrorHandler = isErrorHandler(c.Type) + hasBindableFields = c.injector.CanInject + hasBindableFuncInputs = funcInjector.Has + funcHasErrorOut = hasErrorOutArgs(m) call = m.Func.Call ) - if !implementsBase && !hasBindableFields && !hasBindableFuncInputs { + if !implementsBase && !hasBindableFields && !hasBindableFuncInputs && !implementsErrorHandler { return func(ctx context.Context) { - hero.DispatchFuncResult(ctx, call(c.injector.AcquireSlice())) + hero.DispatchFuncResult(ctx, c.errorHandler, call(c.injector.AcquireSlice())) } } n := m.Type.NumIn() return func(ctx context.Context) { var ( - ctrl = c.injector.Acquire() - ctxValue reflect.Value + ctrl = c.injector.Acquire() + ctxValue reflect.Value + errorHandler = c.errorHandler ) // inject struct fields first before the BeginRequest and EndRequest, if any, @@ -388,6 +394,10 @@ func (c *ControllerActivator) handlerOf(m reflect.Method, funcDependencies []ref defer b.EndRequest(ctx) } + if funcHasErrorOut && implementsErrorHandler { + errorHandler = ctrl.Interface().(hero.ErrorHandler) + } + if hasBindableFuncInputs { // means that ctxValue is not initialized before by the controller's struct injector. if !hasBindableFields { @@ -406,11 +416,11 @@ func (c *ControllerActivator) handlerOf(m reflect.Method, funcDependencies []ref // println("controller.go: execution: in.Value = "+inn.String()+" and in.Type = "+inn.Type().Kind().String()+" of index: ", idxx) // } - hero.DispatchFuncResult(ctx, call(in)) + hero.DispatchFuncResult(ctx, errorHandler, call(in)) return } - hero.DispatchFuncResult(ctx, ctrl.Method(m.Index).Call(emptyIn)) + hero.DispatchFuncResult(ctx, errorHandler, ctrl.Method(m.Index).Call(emptyIn)) } } diff --git a/mvc/mvc.go b/mvc/mvc.go index d80102b8..da438c63 100644 --- a/mvc/mvc.go +++ b/mvc/mvc.go @@ -27,7 +27,7 @@ var ( HeroDependencies = true ) -// Application is the high-level compoment of the "mvc" package. +// Application is the high-level component of the "mvc" package. // It's the API that you will be using to register controllers among with their // dependencies that your controllers may expecting. // It contains the Router(iris.Party) in order to be able to register @@ -42,6 +42,7 @@ type Application struct { Dependencies di.Values Router router.Party Controllers []*ControllerActivator + ErrorHandler hero.ErrorHandler } func newApp(subRouter router.Party, values di.Values) *Application { @@ -99,7 +100,7 @@ func (app *Application) Configure(configurators ...func(*Application)) *Applicat // The value can be a single struct value-instance or a function // which has one input and one output, the input should be // an `iris.Context` and the output can be any type, that output type -// will be binded to the controller's field, if matching or to the +// will be bind-ed to the controller's field, if matching or to the // controller's methods, if matching. // // These dependencies "values" can be changed per-controller as well, @@ -172,7 +173,7 @@ Set the Logger's Level to "debug" to view the active dependencies per controller // Examples at: https://github.com/kataras/iris/tree/master/_examples/mvc func (app *Application) Handle(controller interface{}) *Application { // initialize the controller's activator, nothing too magical so far. - c := newControllerActivator(app.Router, controller, app.Dependencies) + c := newControllerActivator(app.Router, controller, app.Dependencies, app.ErrorHandler) // check the controller's "BeforeActivation" or/and "AfterActivation" method(s) between the `activate` // call, which is simply parses the controller's methods, end-dev can register custom controller's methods @@ -195,12 +196,22 @@ func (app *Application) Handle(controller interface{}) *Application { return app } +// HandleError registers a `hero.ErrorHandlerFunc` which will be fired when +// application's controllers' functions returns an non-nil error. +// Each controller can override it by implementing the `hero.ErrorHandler`. +func (app *Application) HandleError(errHandler hero.ErrorHandlerFunc) *Application { + app.ErrorHandler = errHandler + return app +} + // Clone returns a new mvc Application which has the dependencies -// of the current mvc Mpplication's dependencies. +// of the current mvc Application's `Dependencies` and its `ErrorHandler`. // // Example: `.Clone(app.Party("/path")).Handle(new(TodoSubController))`. func (app *Application) Clone(party router.Party) *Application { - return newApp(party, app.Dependencies.Clone()) + cloned := newApp(party, app.Dependencies.Clone()) + cloned.ErrorHandler = app.ErrorHandler + return cloned } // Party returns a new child mvc Application based on the current path + "relativePath". diff --git a/mvc/reflect.go b/mvc/reflect.go index 1b13bbe6..37ed174f 100644 --- a/mvc/reflect.go +++ b/mvc/reflect.go @@ -1,13 +1,42 @@ package mvc -import "reflect" +import ( + "reflect" -var baseControllerTyp = reflect.TypeOf((*BaseController)(nil)).Elem() + "github.com/kataras/iris/hero" +) + +var ( + baseControllerTyp = reflect.TypeOf((*BaseController)(nil)).Elem() + errorHandlerTyp = reflect.TypeOf((*hero.ErrorHandler)(nil)).Elem() + errorTyp = reflect.TypeOf((*error)(nil)).Elem() +) func isBaseController(ctrlTyp reflect.Type) bool { return ctrlTyp.Implements(baseControllerTyp) } +func isErrorHandler(ctrlTyp reflect.Type) bool { + return ctrlTyp.Implements(errorHandlerTyp) +} + +func hasErrorOutArgs(fn reflect.Method) bool { + n := fn.Type.NumOut() + if n == 0 { + return false + } + + for i := 0; i < n; i++ { + if out := fn.Type.Out(i); out.Kind() == reflect.Interface { + if out.Implements(errorTyp) { + return true + } + } + } + + return false +} + func getInputArgsFromFunc(funcTyp reflect.Type) []reflect.Type { n := funcTyp.NumIn() funcIn := make([]reflect.Type, n, n) From 7df7f0fea2df63902eab51f27d798ca8c143be5d Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Tue, 16 Apr 2019 18:08:03 +0300 Subject: [PATCH 024/418] clean up the mvc error handler example Former-commit-id: 30e42fe0a6c39909739ec6423d75a2be0fe4f1f6 --- _examples/mvc/error-handler/main.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/_examples/mvc/error-handler/main.go b/_examples/mvc/error-handler/main.go index 3ded7b38..1104e861 100644 --- a/_examples/mvc/error-handler/main.go +++ b/_examples/mvc/error-handler/main.go @@ -26,18 +26,13 @@ func main() { app.Run(iris.Addr(":8080")) } -func basicMVC(app *mvc.Application) { - // GET: http://localhost:8080 - app.Handle(new(myController)) -} - type myController struct { } // overriddes the mvcApp.HandleError function. -// func (c *myController) HandleError(ctx iris.Context, err error) { -// ctx.HTML(fmt.Sprintf("%s", err.Error())) -// } +func (c *myController) HandleError(ctx iris.Context, err error) { + ctx.HTML(fmt.Sprintf("%s", err.Error())) +} func (c *myController) Get() error { return fmt.Errorf("error here") From adb6fd764a9b3981de6231bdcb44587976436c87 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Thu, 30 May 2019 10:48:07 +0300 Subject: [PATCH 025/418] extract the `Delim` for redis sessiondb as requested at https://github.com/kataras/iris/issues/1256 and add a mvc/regexp example and some other trivial changes Former-commit-id: f9e09320bfe07ae10ac74f54a78272cf21d21cc7 --- CONTRIBUTING.md | 2 +- FAQ.md | 26 +--- HISTORY.md | 16 +-- HISTORY_GR.md | 2 +- HISTORY_ID.md | 6 +- README.md | 148 +++++++++++---------- README_GR.md | 2 +- README_ID.md | 2 +- README_JPN.md | 2 +- README_PT_BR.md | 2 +- README_RU.md | 2 +- README_ZH.md | 2 +- _examples/README.md | 44 +++--- _examples/README_ZH.md | 9 +- _examples/mvc/regexp/main.go | 49 +++++++ doc.go | 13 +- go.mod | 4 +- go.sum | 26 ++++ sessions/sessiondb/redis/database.go | 14 +- sessions/sessiondb/redis/service/config.go | 27 ++-- 20 files changed, 230 insertions(+), 168 deletions(-) create mode 100644 _examples/mvc/regexp/main.go diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ad7fa15d..6d79185d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ First of all read our [Code of Conduct](https://github.com/kataras/iris/blob/mas * Write version of your local Go programming language. * Describe your problem, what did you expect to see and what you see instead. * If it's a feature request, describe your idea as better as you can - * optionally, navigate to the [chat](https://kataras.rocket.chat/channel/iris) to push other members to participate and share their thoughts about your brilliant idea. + * optionally, navigate to the [chat](https://chat.iris-go.com) to push other members to participate and share their thoughts about your brilliant idea. 2. Fork the [repository](https://github.com/kataras/iris). 3. Make your changes. 4. Compare & Push the PR from [here](https://github.com/kataras/iris/compare). diff --git a/FAQ.md b/FAQ.md index 15a7b2d2..5a77c3d6 100644 --- a/FAQ.md +++ b/FAQ.md @@ -62,8 +62,7 @@ Available type aliases; | Go 1.8 | Go 1.8 usage | Go 1.9 usage (optionally) | | -----------|--------|--------| | `import "github.com/kataras/iris/context"` | `func(context.Context) {}`, `context.Handler`, `context.Map` | `func(iris.Context) {}`, `iris.Handler`, `iris.Map` | -| `import "github.com/kataras/iris/mvc"` | `type MyController struct { mvc.Controller }` , `mvc.SessionController` | `type MyController struct { iris.Controller }`, `iris.SessionController` | -| `import "github.com/kataras/iris/core/router"` | `app.PartyFunc("/users", func(p router.Party) {})` | `app.PartyFunc("/users", func(p iris.Party) {})` | +| `import "github.com/kataras/iris/core/router"` | `app.PartyFunc("/users", func(p router.Party) {})`, `router.ExecutionOptions`, `router.ExecutionRules` | `app.PartyFunc("/users", func(p iris.Party) {})`, `iris.ExecutionOptions`, `iris.ExecutionRules` | | `import "github.com/kataras/iris/core/host"` | `app.ConfigureHost(func(s *host.Supervisor) {})` | `app.ConfigureHost(func(s *iris.Supervisor) {})` | You can find all type aliases and their original package import statements at the [./context.go file](context.go). @@ -72,7 +71,7 @@ You can find all type aliases and their original package import statements at th ## Active development mode -Iris may have reached version 10, but we're not stopping there. We have many feature ideas on our board that we're anxious to add and other innovative web development solutions that we're planning to build into Iris. +Iris may have reached version 11, but we're not stopping there. We have many feature ideas on our board that we're anxious to add and other innovative web development solutions that we're planning to build into Iris. ## Can I find a job if I learn how to use Iris? @@ -81,31 +80,10 @@ open for Iris-specific developers the time we speak. Go to our facebook page, like it and receive notifications about new job offers, we already have couple of them stay at the top of the page: https://www.facebook.com/iris.framework - - ## Do we have a community Chat? Yes, https://chat.iris-go.com -https://github.com/kataras/iris/issues/646 - ## How is the development of Iris supported? By normal people, like you, who help us by donating small or large amounts of money. diff --git a/HISTORY.md b/HISTORY.md index 3c9737b0..d2bc925b 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -38,7 +38,7 @@ I have some features in-mind but lately I do not have the time to humanize those - fix [#1164](https://github.com/kataras/iris/issues/1164). [701e8e46c20395f87fa34bf9fabd145074c7b78c](https://github.com/kataras/iris/commit/701e8e46c20395f87fa34bf9fabd145074c7b78c) (@kataras) -- `context#ReadForm` can skip unknown fields by `IsErrPath(err)`, fixes: [#1157](https://github.com/kataras/iris/issues/1157). [1607bb5113568af6a34142f23bfa44903205b314](https://github.com/kataras/iris/commit/1607bb5113568af6a34142f23bfa44903205b314) (@kataras) +- `context#ReadForm` can skip unkown fields by `IsErrPath(err)`, fixes: [#1157](https://github.com/kataras/iris/issues/1157). [1607bb5113568af6a34142f23bfa44903205b314](https://github.com/kataras/iris/commit/1607bb5113568af6a34142f23bfa44903205b314) (@kataras) Doc updates: @@ -281,7 +281,7 @@ wsServer := websocket.New(websocket.Config{ // [...] -// serve the javascript builtin client-side library, +// serve the javascript built-in client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(wsServer.ClientSource) @@ -401,7 +401,7 @@ The old `github.com/kataras/iris/core/router/macro` package was moved to `guthub - Add `:uint64` parameter type and `ctx.Params().GetUint64` - Add alias `:bool` for the `:boolean` parameter type -Here is the full list of the builtin parameter types that we support now, including their validations/path segment rules. +Here is the full list of the built-in parameter types that we support now, including their validations/path segment rules. | Param Type | Go Type | Validation | Retrieve Helper | | -----------------|------|-------------|------| @@ -430,7 +430,7 @@ app.Get("/users/{id:uint64}", func(ctx iris.Context){ }) ``` -| Builtin Func | Param Types | +| Built-in Func | Param Types | | -----------|---------------| | `regexp`(expr string) | :string | | `prefix`(prefix string) | :string | @@ -609,7 +609,7 @@ Don't forget to [star](https://github.com/kataras/iris/stargazers) the Iris' git Be part of this, - complete our User Experience Report: https://goo.gl/forms/lnRbVgA6ICTkPyk02 -- join to our Community live chat: https://kataras.rocket.chat/channel/iris +- join to our Community live chat: https://chat.iris-go.com - connect to our [new facebook group](https://www.facebook.com/iris.framework) to get notifications about new job opportunities relatively to Iris! Sincerely, @@ -633,7 +633,7 @@ Sincerely, # We, 25 April 2018 | v10.6.1 -- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as builtin back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). +- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as built-in back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). - Fix a minor issue on [Badger sessiondb example](_examples/sessions/database/badger/main.go). Its `sessions.Config { Expires }` field was `2 *time.Second`, it's `45 *time.Minute` now. - Other minor improvements to the badger sessiondb. @@ -642,7 +642,7 @@ Sincerely, - Fix open redirect by @wozz via PR: https://github.com/kataras/iris/pull/972. - Fix when destroy session can't remove cookie in subdomain by @Chengyumeng via PR: https://github.com/kataras/iris/pull/964. - Add `OnDestroy(sid string)` on sessions for registering a listener when a session is destroyed with commit: https://github.com/kataras/iris/commit/d17d7fecbe4937476d00af7fda1c138c1ac6f34d. -- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end builtin supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. +- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end built-in supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. # Sa, 24 March 2018 | v10.5.0 @@ -840,7 +840,7 @@ The new package [hero](hero) contains features for binding any object or functio Below you will see some screenshots we prepared for you in order to be easier to understand: -### 1. Path Parameters - Builtin Dependencies +### 1. Path Parameters - Built-in Dependencies ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) diff --git a/HISTORY_GR.md b/HISTORY_GR.md index e3016176..628a5087 100644 --- a/HISTORY_GR.md +++ b/HISTORY_GR.md @@ -201,7 +201,7 @@ This history entry is not yet translated to Greek. Please read [the english vers Παρακάτω θα δείτε μερικά στιγμιότυπα που ετοιμάσαμε για εσάς, ώστε να γίνουν πιο κατανοητά τα παραπάνω: -### 1. Παράμετροι διαδρομής - Ενσωματωμένες Εξαρτήσεις (Builtin Dependencies) +### 1. Παράμετροι διαδρομής - Ενσωματωμένες Εξαρτήσεις (Built-in Dependencies) ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) diff --git a/HISTORY_ID.md b/HISTORY_ID.md index d28769d2..b37c2d09 100644 --- a/HISTORY_ID.md +++ b/HISTORY_ID.md @@ -71,7 +71,7 @@ This history entry is not translated yet to the Bahasa Indonesia language yet, p # We, 25 April 2018 | v10.6.1 -- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as builtin back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). +- Re-implement the [BoltDB](https://github.com/coreos/bbolt) as built-in back-end storage for sessions(`sessiondb`) using the latest features: [/sessions/sessiondb/boltdb/database.go](sessions/sessiondb/boltdb/database.go), example can be found at [/_examples/sessions/database/boltdb/main.go](_examples/sessions/database/boltdb/main.go). - Fix a minor issue on [Badger sessiondb example](_examples/sessions/database/badger/main.go). Its `sessions.Config { Expires }` field was `2 *time.Second`, it's `45 *time.Minute` now. - Other minor improvements to the badger sessiondb. @@ -80,7 +80,7 @@ This history entry is not translated yet to the Bahasa Indonesia language yet, p - Fix open redirect by @wozz via PR: https://github.com/kataras/iris/pull/972. - Fix when destroy session can't remove cookie in subdomain by @Chengyumeng via PR: https://github.com/kataras/iris/pull/964. - Add `OnDestroy(sid string)` on sessions for registering a listener when a session is destroyed with commit: https://github.com/kataras/iris/commit/d17d7fecbe4937476d00af7fda1c138c1ac6f34d. -- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end builtin supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. +- Finally, sessions are in full-sync with the registered database now. That required a lot of internal code changed but **zero code change requirements by your side**. We kept only `badger` and `redis` as the back-end built-in supported sessions storages, they are enough. Made with commit: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c relative to many issues that you've requested it. # Sa, 24 March 2018 | v10.5.0 @@ -278,7 +278,7 @@ The new package [hero](hero) contains features for binding any object or functio Below you will see some screenshots we prepared for you in order to be easier to understand: -### 1. Path Parameters - Builtin Dependencies +### 1. Path Parameters - Built-in Dependencies ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) diff --git a/README.md b/README.md index aab830c2..5e450b55 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,10 @@ -# ⚡️ Update: community-driven version 11.1.0 - -Click [here](HISTORY.md#su-18-november-2018--v1110) to read about the versioning API that the most recent version of Iris brings to you. - # Iris Web Framework -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/routing%20by-example-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fkataras%2Firis.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fkataras%2Firis?ref=badge_shield) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fkataras%2Firis.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fkataras%2Firis?ref=badge_shield) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://chat.iris-go.com) [![view examples](https://img.shields.io/badge/routing%20by-example-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) -Iris is a fast, simple yet fully featured and very efficient web framework for Go. +Iris is a fast, simple yet fully featured and very efficient web framework for Go. Routing is powered by the [muxie](https://github.com/kataras/muxie#philosophy) project. Iris provides a beautifully expressive and easy to use foundation for your next website or API. @@ -16,6 +12,36 @@ Iris offers a complete and decent solution and support for all gophers around th Learn what [others say about Iris](#support) and [star](https://github.com/kataras/iris/stargazers) this github repository to stay [up to date](https://facebook.com/iris.framework). +## Ghost? No More! Support as first class citizen + +Have you bored of waiting weeks or months for someone to respond to your github issue? Yes, **me too**. If you choose Iris for your main backend development you will never be like a ghost again. + +Iris is one of the few public github repositories that offers real support to individuals and collectivities, including companies. Unbeatable **free support**[*](#support) for three years and still counting. Navigate to the issues to see by yourself. + +In these difficult and restless days **we stand beside you**. We **do not judge bad english writing**, no matter who you are, we will be here for you. + +Check below the features and the hard work that we putted to improve how the internet is built. If you really like it and appreciate it, give a star to this github **repository for the public.** + +## Benchmarks + +### Iris vs .NET Core vs Expressjs + +[![Iris vs .NET Core(C#) vs Node.js (Express)](_benchmarks/benchmarks_graph_22_october_2018_gray.png)](_benchmarks/README.md) + +_Updated at: [Monday, 22 October 2018](_benchmarks/README.md)_ + +### Third-party + +[![](_benchmarks/benchmarks_third_party_source_snapshot_go_23_october_2018.png)](https://github.com/iris-contrib/third-party-benchmarks#full-table) + +> Last updated at: 01 March of 2019. Click to the image to view all results. You can run this in your own hardware by following the [steps here](https://github.com/iris-contrib/third-party-benchmarks#usage). + +## Philosophy + +The Iris philosophy is to provide robust tooling for HTTP, making it a great solution for single page applications, web sites, hybrids, or public HTTP APIs. Keep note that, so far, iris is the fastest web framework ever created in terms of performance. + +Iris does not force you to use any specific ORM or template engine. With support for the most used template engines, you can quickly craft the perfect application. + ## Installation The only requirement is the [Go Programming Language](https://golang.org/dl/) @@ -45,28 +71,6 @@ import ( -## Benchmarks - -### Iris vs .NET Core vs Expressjs - -[![Iris vs .NET Core(C#) vs Node.js (Express)](_benchmarks/benchmarks_graph_22_october_2018_gray.png)](_benchmarks/README.md) - -_Updated at: [Monday, 22 October 2018](_benchmarks/README.md)_ - -### Iris vs the rest Go web frameworks and routers vs any other alternative - -[![](_benchmarks/benchmarks_third_party_source_snapshot_go_23_october_2018.png)](https://github.com/the-benchmarker/web-frameworks#full-table) - -As shown in the benchmarks (from a [third-party source](https://github.com/the-benchmarker)), Iris is the fastest open-source Go web framework in the planet. The net/http 100% compatible router [muxie](https://github.com/kataras/muxie) I've created some weeks ago is also trending there with amazing results, fastest net/http router ever created as well. View the results at: - -https://github.com/the-benchmarker/web-frameworks#full-table - -## Philosophy - -The Iris philosophy is to provide robust tooling for HTTP, making it a great solution for single page applications, web sites, hybrids, or public HTTP APIs. Keep note that, so far, iris is the fastest web framework ever created in terms of performance. - -Iris does not force you to use any specific ORM or template engine. With support for the most used template engines, you can quickly craft the perfect application. - ## Quick start ```sh @@ -96,35 +100,6 @@ func main() { $ go run example.go ``` -## Iris starter kits - - - -1. [snowlyg/IrisApiProject: Iris + gorm + jwt + sqlite3](https://github.com/snowlyg/IrisApiProject) **NEW-Chinese** -2. [yz124/superstar: Iris + xorm to implement the star library](https://github.com/yz124/superstar) **NEW-Chinese** -3. [jebzmos4/Iris-golang: A basic CRUD API in golang with Iris](https://github.com/jebzmos4/Iris-golang) -4. [gauravtiwari/go_iris_app: A basic web app built in Iris for Go](https://github.com/gauravtiwari/go_iris_app) -5. [A mini social-network created with the awesome Iris💖💖](https://github.com/iris-contrib/Iris-Mini-Social-Network) -6. [Iris isomorphic react/hot reloadable/redux/css-modules starter kit](https://github.com/iris-contrib/iris-starter-kit) -7. [ionutvilie/react-ts: Demo project with react using typescript and Iris](https://github.com/ionutvilie/react-ts) -8. [Self-hosted Localization Management Platform built with Iris and Angular](https://github.com/iris-contrib/parrot) -9. [Iris + Docker and Kubernetes](https://github.com/iris-contrib/cloud-native-go) -10. [nanobox.io: Quickstart for Iris with Nanobox](https://guides.nanobox.io/golang/iris/from-scratch) -11. [hasura.io: A Hasura starter project with a ready to deploy Golang hello-world web app with IRIS](https://hasura.io/hub/project/hasura/hello-golang-iris) - -> Did you build something similar? Let us [know](https://github.com/kataras/iris/pulls)! - ## API Examples ### Using Get, Post, Put, Patch, Delete and Options @@ -176,7 +151,7 @@ app.Get("/users/{id:uint64}", func(ctx iris.Context){ }) ``` -| Builtin Func | Param Types | +| Built-in Func | Param Types | | -----------|---------------| | `regexp`(expr string) | :string | | `prefix`(prefix string) | :string | @@ -296,11 +271,11 @@ func main() { The package [hero](hero) contains features for binding any object or functions that `handlers` can use, these are called dependencies. -With Iris you get truly safe bindings thanks to the [hero](_examples/hero) [package](hero). It is blazing-fast, near to raw handlers performance because Iris calculates everything before even server goes online! +With Iris you get truly safe bindings thanks to the [hero](_examples/hero) [package](hero). It is blazing-fast, near to raw handlers performance because Iris calculates everything before the server even goes online! -Below you will see some screenshots I prepared for you in order to be easier to understand: +Below you will see some screenshots I prepared to facilitate understanding: -#### 1. Path Parameters - Builtin Dependencies +#### 1. Path Parameters - Built-in Dependencies ![](https://github.com/kataras/explore/raw/master/iris/hero/hero-1-monokai.png) @@ -797,7 +772,7 @@ func setupWebsocket(app *iris.Application) { // see the inline javascript code in the websockets.html, // this endpoint is used to connect to the server. app.Get("/echo", ws.Handler()) - // serve the javascript builtin client-side library, + // serve the javascript built-in client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", websocket.ClientHandler()) } @@ -992,6 +967,15 @@ Iris has a great collection of handlers[[1]](middleware/)[[2]](https://github.co Iris, unlike others, is 100% compatible with the standards and that's why the majority of the big companies that adapt Go to their workflow, like a very famous US Television Network, trust Iris; it's up-to-date and it will be always aligned with the std `net/http` package which is modernized by the Go Authors on each new release of the Go Programming Language. +### Video Courses + +| Description | Link | Author | Year | +| -----------|-------------|-------------|-----| +| Installing Iris | https://www.youtube.com/watch?v=BmOLFQ29J3s | WarnabiruTV | 2018 | +| Iris & Mongo DB Complete | https://www.youtube.com/watch?v=uXiNYhJqh2I&index=1&list=PLMrwI6jIZn-1tzskocnh1pptKhVmWdcbS | Musobar Media | 2018 | +| Quick Start with Iris | https://www.youtube.com/watch?v=x5OSXX9vitU&list=PLJ39kWiJXSizebElabidQeVaKeJuY6b4I | J-Secur1ty | **2019** | +| Getting Started with Iris | https://www.youtube.com/watch?v=rQxRoN6ub78&index=27&list=PLidHThAppdAH4y0DeEf-dGjB-xITVKszL | stephgdesign | 2018 | + ### Articles * [CRUD REST API in Iris (a framework for golang)](https://medium.com/@jebzmos4/crud-rest-api-in-iris-a-framework-for-golang-a5d33652401e) @@ -1008,19 +992,23 @@ Iris, unlike others, is 100% compatible with the standards and that's why the ma * [Deploying a Iris Golang app in hasura](https://medium.com/@HasuraHQ/deploy-an-iris-golang-app-with-backend-apis-in-minutes-25a559bf530b) * [A URL Shortener Service using Go, Iris and Bolt](https://medium.com/@kataras/a-url-shortener-service-using-go-iris-and-bolt-4182f0b00ae7) -### Video Courses +## Iris starter kits -* [Daily Coding - Web Framework Golang: Iris Framework]( https://www.youtube.com/watch?v=BmOLFQ29J3s) by WarnabiruTV, source: youtube, cost: **FREE** -* [Tutorial Golang MVC dengan Iris Framework & Mongo DB](https://www.youtube.com/watch?v=uXiNYhJqh2I&list=PLMrwI6jIZn-1tzskocnh1pptKhVmWdcbS) (19 parts so far) by Musobar Media, source: youtube, cost: **FREE** -* [Go/Golang 27 - Iris framework : Routage de base](https://www.youtube.com/watch?v=rQxRoN6ub78) by stephgdesign, source: youtube, cost: **FREE** -* [Go/Golang 28 - Iris framework : Templating](https://www.youtube.com/watch?v=nOKYV073S2Y) by stephgdesignn, source: youtube, cost: **FREE** -* [Go/Golang 29 - Iris framework : Paramètres](https://www.youtube.com/watch?v=K2FsprfXs1E) by stephgdesign, source: youtube, cost: **FREE** -* [Go/Golang 30 - Iris framework : Les middelwares](https://www.youtube.com/watch?v=BLPy1So6bhE) by stephgdesign, source: youtube, cost: **FREE** -* [Go/Golang 31 - Iris framework : Les sessions](https://www.youtube.com/watch?v=RnBwUrwgEZ8) by stephgdesign, source: youtube, cost: **FREE** +1. [snowlyg/IrisApiProject: Iris + gorm + jwt + sqlite3](https://github.com/snowlyg/IrisApiProject) **NEW-Chinese** +2. [yz124/superstar: Iris + xorm to implement the star library](https://github.com/yz124/superstar) **NEW-Chinese** +3. [jebzmos4/Iris-golang: A basic CRUD API in golang with Iris](https://github.com/jebzmos4/Iris-golang) +4. [gauravtiwari/go_iris_app: A basic web app built in Iris for Go](https://github.com/gauravtiwari/go_iris_app) +5. [A mini social-network created with the awesome Iris💖💖](https://github.com/iris-contrib/Iris-Mini-Social-Network) +6. [Iris isomorphic react/hot reloadable/redux/css-modules starter kit](https://github.com/iris-contrib/iris-starter-kit) +7. [ionutvilie/react-ts: Demo project with react using typescript and Iris](https://github.com/ionutvilie/react-ts) +8. [Self-hosted Localization Management Platform built with Iris and Angular](https://github.com/iris-contrib/parrot) +9. [Iris + Docker and Kubernetes](https://github.com/iris-contrib/cloud-native-go) +10. [nanobox.io: Quickstart for Iris with Nanobox](https://guides.nanobox.io/golang/iris/from-scratch) +11. [hasura.io: A Hasura starter project with a ready to deploy Golang hello-world web app with IRIS](https://hasura.io/hub/project/hasura/hello-golang-iris) ## Support -- [HISTORY](HISTORY.md#soon) file is your best friend, it contains information about the latest features and changes +- [HISTORY](HISTORY.md#fr-11-january-2019--v1111) file is your best friend, it contains information about the latest features and changes - Did you happen to find a bug? Post it at [github issues](https://github.com/kataras/iris/issues) - Do you have any questions or need to speak with someone experienced to solve a problem at real-time? Join us to the [community chat](https://chat.iris-go.com) - Complete our form-based user experience report by clicking [here](https://docs.google.com/forms/d/e/1FAIpQLSdCxZXPANg_xHWil4kVAdhmh7EBBHQZ_4_xSZVDL-oCC_z5pA/viewform?usp=sf_link) @@ -1077,6 +1065,24 @@ Iris, unlike others, is 100% compatible with the standards and that's why the ma There are many companies and start-ups looking for Go web developers with Iris experience as requirement, we are searching for you every day and we post those information via our [facebook page](https://www.facebook.com/iris.framework), like the page to get notified, we have already posted some of them. +### Author + + + + + +
    + + +Gerasimos Maropoulos + +

    + + + +

    +
    + ### Backers Thank you to all our backers! 🙏 [Become a backer](https://iris-go.com/donate) diff --git a/README_GR.md b/README_GR.md index 19399496..f7ce9d9f 100644 --- a/README_GR.md +++ b/README_GR.md @@ -2,7 +2,7 @@ -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://chat.iris-go.com) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) Το Iris είναι ένα γρήγορο, απλό αλλά και πλήρως λειτουργικό και πολύ αποδοτικό web framework για τη Go. diff --git a/README_ID.md b/README_ID.md index 687b4260..ceb49502 100644 --- a/README_ID.md +++ b/README_ID.md @@ -2,7 +2,7 @@ -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://chat.iris-go.com) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) Iris adalah web framework yang cepat, sederhana namun berfitur lengkap dan sangat efisien untuk Go. diff --git a/README_JPN.md b/README_JPN.md index 60cd9ff2..8e063c77 100644 --- a/README_JPN.md +++ b/README_JPN.md @@ -2,7 +2,7 @@ -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://chat.iris-go.com) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) Irisはシンプルで高速、それにも関わらず充実した機能を有する効率的なGo言語のウェブフレームワークです。 diff --git a/README_PT_BR.md b/README_PT_BR.md index e0d34b8a..a7387a3e 100644 --- a/README_PT_BR.md +++ b/README_PT_BR.md @@ -2,7 +2,7 @@ -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://chat.iris-go.com) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) Iris é um framework rápido, simples porém completo e muito eficiente para a linguagem Go. diff --git a/README_RU.md b/README_RU.md index 8b1baccc..cb90fecf 100644 --- a/README_RU.md +++ b/README_RU.md @@ -2,7 +2,7 @@ -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://chat.iris-go.com) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) Iris - это быстрая, простая, но полнофункциональная и очень эффективная веб-платформа для Go. diff --git a/README_ZH.md b/README_ZH.md index 17cbdd62..6a0fcae8 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -2,7 +2,7 @@ -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://kataras.rocket.chat/channel/iris) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=flat-square)](https://travis-ci.org/kataras/iris) [![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/kataras/iris) [![vscode-iris](https://img.shields.io/badge/ext%20-vscode-0c77e3.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=kataras2006.iris) [![chat](https://img.shields.io/badge/community-%20chat-00BCD4.svg?style=flat-square)](https://chat.iris-go.com) [![view examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/tree/master/_examples/routing) [![release](https://img.shields.io/badge/release%20-v11.1-0077b3.svg?style=flat-square)](https://github.com/kataras/iris/releases) Iris 是一款超快、简洁高效的 Go 语言 Web开发框架。 diff --git a/_examples/README.md b/_examples/README.md index 17ce3df0..92408f26 100644 --- a/_examples/README.md +++ b/_examples/README.md @@ -51,7 +51,7 @@ $ go run main.go ### Overview - [Hello world!](hello-world/main.go) -- [Hello WebAssemply!](webassembly/basic/main.go) **NEW** +- [Hello WebAssemply!](webassembly/basic/main.go) - [Glimpse](overview/main.go) - [Tutorial: Online Visitors](tutorial/online-visitors/main.go) - [Tutorial: A Todo MVC Application using Iris and Vue.js](https://hackernoon.com/a-todo-mvc-application-using-iris-and-vue-js-5019ff870064) @@ -62,7 +62,7 @@ $ go run main.go - [Tutorial: DropzoneJS Uploader](tutorial/dropzonejs) - [Tutorial: Caddy](tutorial/caddy) - [Tutorial:Iris Go Framework + MongoDB](https://medium.com/go-language/iris-go-framework-mongodb-552e349eab9c) -- [Tutorial: API for Apache Kafka](tutorial/api-for-apache-kafka) **NEW** +- [Tutorial: API for Apache Kafka](tutorial/api-for-apache-kafka) ### Structuring @@ -146,9 +146,9 @@ Navigate through examples for a better understanding. - [Custom HTTP Errors](routing/http-errors/main.go) - [Dynamic Path](routing/dynamic-path/main.go) * [root level wildcard path](routing/dynamic-path/root-wildcard/main.go) -- [Write your own custom parameter types](routing/macros/main.go) **NEW** +- [Write your own custom parameter types](routing/macros/main.go) - [Reverse routing](routing/reverse/main.go) -- [Custom Router (high-level)](routing/custom-high-level-router/main.go) **NEW** +- [Custom Router (high-level)](routing/custom-high-level-router/main.go) - [Custom Wrapper](routing/custom-wrapper/main.go) - Custom Context * [method overriding](routing/custom-context/method-overriding/main.go) @@ -167,7 +167,7 @@ Navigate through examples for a better understanding. - [Basic](hero/basic/main.go) - [Overview](hero/overview) -- [Sessions](hero/sessions) **NEW** +- [Sessions](hero/sessions) - [Yet another dependency injection example and good practises at general](hero/smart-contract/main.go) **NEW** ### MVC @@ -306,14 +306,15 @@ If you're new to back-end web development read about the MVC architectural patte Follow the examples below, -- [Hello world](mvc/hello-world/main.go) **UPDATED** -- [Session Controller](mvc/session-controller/main.go) **UPDATED** -- [Overview - Plus Repository and Service layers](mvc/overview) **UPDATED** -- [Login showcase - Plus Repository and Service layers](mvc/login) **UPDATED** -- [Singleton](mvc/singleton) **NEW** -- [Websocket Controller](mvc/websocket) **NEW** -- [Register Middleware](mvc/middleware) **NEW** -- [Vue.js Todo MVC](tutorial/vuejs-todo-mvc) **NEW** +- [Hello world](mvc/hello-world/main.go) +- [Regexp](mvc/regexp/main.go) **NEW** +- [Session Controller](mvc/session-controller/main.go) +- [Overview - Plus Repository and Service layers](mvc/overview) +- [Login showcase - Plus Repository and Service layers](mvc/login) +- [Singleton](mvc/singleton) +- [Websocket Controller](mvc/websocket) +- [Register Middleware](mvc/middleware) +- [Vue.js Todo MVC](tutorial/vuejs-todo-mvc) ### Subdomains @@ -367,7 +368,7 @@ You can serve [quicktemplate](https://github.com/valyala/quicktemplate) and [her - [Favicon](file-server/favicon/main.go) - [Basic](file-server/basic/main.go) - [Embedding Files Into App Executable File](file-server/embedding-files-into-app/main.go) -- [Embedding Gziped Files Into App Executable File](file-server/embedding-gziped-files-into-app/main.go) **NEW** +- [Embedding Gziped Files Into App Executable File](file-server/embedding-gziped-files-into-app/main.go) - [Send/Force-Download Files](file-server/send-files/main.go) - Single Page Applications * [single Page Application](file-server/single-page-application/basic/main.go) @@ -384,7 +385,7 @@ You can serve [quicktemplate](https://github.com/valyala/quicktemplate) and [her - [Read Custom via Unmarshaler](http_request/read-custom-via-unmarshaler/main.go) - [Upload/Read File](http_request/upload-file/main.go) - [Upload multiple files with an easy way](http_request/upload-files/main.go) -- [Extract referrer from "referer" header or URL query parameter](http_request/extract-referer/main.go) **NEW** +- [Extract referrer from "referer" header or URL query parameter](http_request/extract-referer/main.go) > The `context.Request()` returns the same *http.Request you already know, these examples show some places where the Context uses this object. Besides that you can use it as you did before iris. @@ -396,7 +397,7 @@ You can serve [quicktemplate](https://github.com/valyala/quicktemplate) and [her - [Write Gzip](http_responsewriter/write-gzip/main.go) - [Stream Writer](http_responsewriter/stream-writer/main.go) - [Transactions](http_responsewriter/transactions/main.go) -- [SSE](http_responsewriter/sse/main.go) **NEW** +- [SSE](http_responsewriter/sse/main.go) - [SSE (third-party package usage for server sent events)](http_responsewriter/sse-third-party/main.go) > The `context/context#ResponseWriter()` returns an enchament version of a http.ResponseWriter, these examples show some places where the Context uses this object. Besides that you can use it as you did before iris. @@ -473,14 +474,15 @@ iris session manager lives on its own [package](https://github.com/kataras/iris/ ### Websockets -iris websocket library lives on its own [package](https://github.com/kataras/iris/tree/master/websocket). +iris websocket library lives on its own [package](https://github.com/kataras/iris/tree/master/websocket) which depends on the [kataras/neffos](https://github.com/kataras/neffos) external package. The package is designed to work with raw websockets although its API is similar to the famous [socket.io](https://socket.io). I have read an article recently and I felt very contented about my decision to design a **fast** websocket-**only** package for Iris and not a backwards socket.io-like package. You can read that article by following this link: https://medium.com/@ivanderbyl/why-you-don-t-need-socket-io-6848f1c871cd. -- [Chat](websocket/chat/main.go) -- [Chat with Iris Go Client Side](websocket/go-client) **NEW** - * [Server](websocket/go-client/server/main.go) - * [Client](websocket/go-client/client/main.go) +- [Basic](websocket/basic) **NEW** + * [Server](websocket/basic/server.go) + * [Go Client](websocket/basic/go-client/client.go) + * [Browser Client](websocket/basic/browser/index.html) + * [Browser NPM Client (browserify)](websocket/basic/browserify/app.js) - [Native Messages](websocket/native-messages/main.go) - [Connection List](websocket/connectionlist/main.go) - [TLS Enabled](websocket/secure/main.go) diff --git a/_examples/README_ZH.md b/_examples/README_ZH.md index cae15a08..d8aea7a9 100644 --- a/_examples/README_ZH.md +++ b/_examples/README_ZH.md @@ -430,10 +430,11 @@ iris websocket库依赖于它自己的[包](https://github.com/kataras/iris/tree 设计这个包的目的是处理原始websockets,虽然它的API和著名的[socket.io](https://socket.io)很像。我最近读了一片文章,并且对我 决定给iris设计一个**快速的**websocket**限定**包并且不是一个向后传递类socket.io的包。你可以阅读这个链接里的文章https://medium.com/@ivanderbyl/why-you-don-t-need-socket-io-6848f1c871cd。 -- [聊天](websocket/chat/main.go) -- [Chat with Iris Go Client Side](websocket/go-client) **NEW** - * [Server](websocket/go-client/server/main.go) - * [Client](websocket/go-client/client/main.go) +- [Basic](websocket/basic) **NEW** + * [Server](websocket/basic/server.go) + * [Go Client](websocket/basic/go-client/client.go) + * [Browser Client](websocket/basic/browser/index.html) + * [Browser NPM Client (browserify)](websocket/basic/browserify/app.js) - [原生消息](websocket/native-messages/main.go) - [连接列表](websocket/connectionlist/main.go) - [TLS支持](websocket/secure/main.go) diff --git a/_examples/mvc/regexp/main.go b/_examples/mvc/regexp/main.go new file mode 100644 index 00000000..1c94866b --- /dev/null +++ b/_examples/mvc/regexp/main.go @@ -0,0 +1,49 @@ +// Package main shows how to match "/xxx.json" in MVC handler. +package main + +/* +There is no MVC naming pattern for such these things,you can imagine the limitations of that. +Instead you can use the `BeforeActivation` on your controller to add more advanced routing features +(https://github.com/kataras/iris/tree/master/_examples/routing). + +You can also create your own macro, +i.e: /{file:json} or macro function of a specific parameter type i.e: (/{file:string json()}). +Read the routing examples and you will gain a deeper view, there are all covered. +*/ + +import ( + "github.com/kataras/iris" + "github.com/kataras/iris/mvc" +) + +func main() { + app := iris.New() + + mvcApp := mvc.New(app.Party("/module")) + mvcApp.Handle(new(myController)) + + // http://localhost:8080/module/xxx.json (OK) + // http://localhost:8080/module/xxx.xml (Not Found) + app.Run(iris.Addr(":8080")) +} + +type myController struct{} + +func (m *myController) BeforeActivation(b mvc.BeforeActivation) { + // b.Dependencies().Add/Remove + // b.Router().Use/UseGlobal/Done // and any standard API call you already know + + // 1-> Method + // 2-> Path + // 3-> The controller's function name to be parsed as handler + // 4-> Any handlers that should run before the HandleJSON + + // "^[a-zA-Z0-9_.-]+.json$)" to validate file-name pattern and json + // or just: ".json$" to validate suffix. + + b.Handle("GET", "/{file:string regexp(^[a-zA-Z0-9_.-]+.json$))}", "HandleJSON" /*optionalMiddleware*/) +} + +func (m *myController) HandleJSON(file string) string { + return "custom serving of json: " + file +} diff --git a/doc.go b/doc.go index 61c48f8a..41522132 100644 --- a/doc.go +++ b/doc.go @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2019 The Iris Authors. All rights reserved. +// Copyright (c) 2017-2018 The Iris Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -27,10 +27,7 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* -Package iris implements the highest realistic performance, easy to learn Go web framework. -Iris provides a beautifully expressive and easy to use foundation for your next website, API, or distributed app. -Low-level handlers compatible with `net/http` and high-level fastest MVC implementation and handlers dependency injection. -Easy to learn for new gophers and advanced features for experienced, it goes as far as you dive into it! +Package iris provides a beautifully expressive and easy to use foundation for your next website, API, or distributed app. Source code and other details for the project are available at GitHub: @@ -38,7 +35,7 @@ Source code and other details for the project are available at GitHub: Current Version -11.2.0 +11.1.1 Installation @@ -1471,7 +1468,7 @@ Example Server Code: // see the inline javascript code i the websockets.html, this endpoint is used to connect to the server. app.Get("/echo", ws.Handler()) - // serve the javascript builtin client-side library, + // serve the javascript built-in client-side library, // see websockets.html script tags, this path is used. app.Any("/iris-ws.js", func(ctx iris.Context) { ctx.Write(websocket.ClientSource) @@ -1554,7 +1551,7 @@ Example Code: func main() { app := iris.New() - // Optionally, add two builtin handlers + // Optionally, add two built-in handlers // that can recover from any http-relative panics // and log the requests to the terminal. app.Use(recover.New()) diff --git a/go.mod b/go.mod index a78a5582..3199ff89 100644 --- a/go.mod +++ b/go.mod @@ -22,13 +22,13 @@ require ( github.com/hashicorp/go-version v1.0.0 github.com/imkira/go-interpol v1.1.0 // indirect github.com/iris-contrib/blackfriday v2.0.0+incompatible - github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 // indirect + github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 github.com/iris-contrib/go.uuid v2.0.0+incompatible github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 github.com/json-iterator/go v1.1.5 github.com/juju/errors v0.0.0-20181012004132-a4583d0a56ea // indirect - github.com/kataras/golog v0.0.0-20180321173939-03be10146386 // indirect + github.com/kataras/golog v0.0.0-20180321173939-03be10146386 github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect github.com/klauspost/compress v1.4.1 github.com/klauspost/cpuid v1.2.0 // indirect diff --git a/go.sum b/go.sum index 5c1b1605..ab14902b 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 h1:PqzgE6kAMi81xWQA2QIVxjWkFHptGgC547vchpUbtFo= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -6,26 +7,37 @@ github.com/Joker/jade v1.0.0 h1:lOCEPvTAtWfLpSZYMOv/g44MGQFAolbKh2khHHGu0Kc= github.com/Joker/jade v1.0.0/go.mod h1:efZIdO0py/LtcJRSa/j2WEklMSAw84WV0zZVMxNToB8= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f h1:zvClvFQwU++UpIUBGC8YmDlfhUrweEy1R1Fj1gu5iIM= github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger v1.5.4 h1:gVTrpUTbbr/T24uvoCaqY2KSHfNLVGm0w+hbee2HMeg= github.com/dgraph-io/badger v1.5.4/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 h1:afESQBXJEnj3fu+34X//E8Wg3nEbMJxJkwSc0tPePK0= github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/etcd-io/bbolt v1.3.0 h1:ec0U3x11Mk69A8YwQyZEhNaUqHkQSv2gDR3Bioz5DfU= github.com/etcd-io/bbolt v1.3.0/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flosch/pongo2 v0.0.0-20180809100617-24195e6d38b0 h1:ZHx2BEERvWkuwuE7qWN9TuRxucHDH2JrsvneZjVJfo0= github.com/flosch/pongo2 v0.0.0-20180809100617-24195e6d38b0/go.mod h1:rE0ErqqBaMcp9pzj8JxV1GcfDBpuypXYxlR1c37AUwg= +github.com/gavv/monotime v0.0.0-20171021193802-6f8212e8d10d h1:oYXrtNhqNKL1dVtKdv8XUq5zqdGVFNQ0/4tvccXZOLM= github.com/gavv/monotime v0.0.0-20171021193802-6f8212e8d10d/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/hashicorp/go-version v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnnCPtE8= github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= @@ -33,7 +45,9 @@ github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 h1:7GsNnSL github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1/go.mod h1:i8kTYUOEstd/S8TG0ChTXQdf4ermA/e8vJX0+QruD9w= github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce h1:q8Ka/exfHNgK7izJE+aUOZd7KZXJ7oQbnJWiZakEiMo= github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce/go.mod h1:VER17o2JZqquOx41avolD/wMGQSFEFBKWmhag9/RQRY= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 h1:Kyp9KiXwsyZRTeoNjgVCrWks7D8ht9+kg6yCjh8K97o= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -53,22 +67,33 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 h1:/vdW8Cb7EXrkqWGufVMES1OH2sU9gKVb2n9/1y5NMBY= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56 h1:yhqBHs09SmmUoNOHc9jgK4a60T3XFRtPAkYxVnqgY50= github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 h1:kkXA53yGe04D0adEYJwEVQjeBppL01Exg+fnMjfUraU= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -77,6 +102,7 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4r golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.39.0 h1:Jf2sFGT+sAd7i+4ftUN1Jz90uw8XNH8NXbbOY16taA8= gopkg.in/ini.v1 v1.39.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/sessions/sessiondb/redis/database.go b/sessions/sessiondb/redis/database.go index 6477af76..8665bea3 100644 --- a/sessions/sessiondb/redis/database.go +++ b/sessions/sessiondb/redis/database.go @@ -61,10 +61,8 @@ func (db *Database) OnUpdateExpiration(sid string, newExpires time.Duration) err return db.redis.UpdateTTLMany(sid, int64(newExpires.Seconds())) } -const delim = "_" - -func makeKey(sid, key string) string { - return sid + delim + key +func (db *Database) makeKey(sid, key string) string { + return sid + db.redis.Config.Delim + key } // Set sets a key value of a specific session. @@ -76,14 +74,14 @@ func (db *Database) Set(sid string, lifetime sessions.LifeTime, key string, valu return } - if err = db.redis.Set(makeKey(sid, key), valueBytes, int64(lifetime.DurationUntilExpiration().Seconds())); err != nil { + if err = db.redis.Set(db.makeKey(sid, key), valueBytes, int64(lifetime.DurationUntilExpiration().Seconds())); err != nil { golog.Debug(err) } } // Get retrieves a session value based on the key. func (db *Database) Get(sid string, key string) (value interface{}) { - db.get(makeKey(sid, key), &value) + db.get(db.makeKey(sid, key), &value) return } @@ -100,7 +98,7 @@ func (db *Database) get(key string, outPtr interface{}) { } func (db *Database) keys(sid string) []string { - keys, err := db.redis.GetKeys(sid + delim) + keys, err := db.redis.GetKeys(sid + db.redis.Config.Delim) if err != nil { golog.Debugf("unable to get all redis keys of session '%s': %v", sid, err) return nil @@ -126,7 +124,7 @@ func (db *Database) Len(sid string) (n int) { // Delete removes a session key value based on its key. func (db *Database) Delete(sid string, key string) (deleted bool) { - err := db.redis.Delete(makeKey(sid, key)) + err := db.redis.Delete(db.makeKey(sid, key)) if err != nil { golog.Error(err) } diff --git a/sessions/sessiondb/redis/service/config.go b/sessions/sessiondb/redis/service/config.go index 1715ffb1..e635fcbd 100644 --- a/sessions/sessiondb/redis/service/config.go +++ b/sessions/sessiondb/redis/service/config.go @@ -5,32 +5,36 @@ import ( ) const ( - // DefaultRedisNetwork the redis network option, "tcp" + // DefaultRedisNetwork the redis network option, "tcp". DefaultRedisNetwork = "tcp" - // DefaultRedisAddr the redis address option, "127.0.0.1:6379" + // DefaultRedisAddr the redis address option, "127.0.0.1:6379". DefaultRedisAddr = "127.0.0.1:6379" - // DefaultRedisIdleTimeout the redis idle timeout option, time.Duration(5) * time.Minute + // DefaultRedisIdleTimeout the redis idle timeout option, time.Duration(5) * time.Minute. DefaultRedisIdleTimeout = time.Duration(5) * time.Minute + // DefaultDelim ths redis delim option, "-". + DefaultDelim = "-" ) // Config the redis configuration used inside sessions type Config struct { - // Network "tcp" + // Network protocol. Defaults to "tcp". Network string - // Addr "127.0.0.1:6379" + // Addr of the redis server. Defaults to "127.0.0.1:6379". Addr string - // Password string .If no password then no 'AUTH'. Default "" + // Password string .If no password then no 'AUTH'. Defaults to "". Password string - // If Database is empty "" then no 'SELECT'. Default "" + // If Database is empty "" then no 'SELECT'. Defaults to "". Database string - // MaxIdle 0 no limit + // MaxIdle 0 no limit. MaxIdle int - // MaxActive 0 no limit + // MaxActive 0 no limit. MaxActive int - // IdleTimeout time.Duration(5) * time.Minute + // IdleTimeout time.Duration(5) * time.Minute. IdleTimeout time.Duration - // Prefix "myprefix-for-this-website". Default "" + // Prefix "myprefix-for-this-website". Defaults to "". Prefix string + // Delim the delimeter for the values. Defaults to "-". + Delim string } // DefaultConfig returns the default configuration for Redis service. @@ -44,5 +48,6 @@ func DefaultConfig() Config { MaxActive: 0, IdleTimeout: DefaultRedisIdleTimeout, Prefix: "", + Delim: DefaultDelim, } } From 8d388fb1c66df9563610a4e68ed66930228d3e05 Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Thu, 30 May 2019 10:54:42 +0300 Subject: [PATCH 026/418] fix go.mod caused by prev commit Former-commit-id: a93e1794c6d8ef01a5539577835fe997d60ec86a --- doc.go | 9 ++++++--- go.sum | 26 -------------------------- 2 files changed, 6 insertions(+), 29 deletions(-) diff --git a/doc.go b/doc.go index 41522132..be9ff2a6 100644 --- a/doc.go +++ b/doc.go @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2018 The Iris Authors. All rights reserved. +// Copyright (c) 2017-2019 The Iris Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -27,7 +27,10 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* -Package iris provides a beautifully expressive and easy to use foundation for your next website, API, or distributed app. +Package iris implements the highest realistic performance, easy to learn Go web framework. +Iris provides a beautifully expressive and easy to use foundation for your next website, API, or distributed app. +Low-level handlers compatible with `net/http` and high-level fastest MVC implementation and handlers dependency injection. +Easy to learn for new gophers and advanced features for experienced, it goes as far as you dive into it! Source code and other details for the project are available at GitHub: @@ -35,7 +38,7 @@ Source code and other details for the project are available at GitHub: Current Version -11.1.1 +11.2.0 Installation diff --git a/go.sum b/go.sum index ab14902b..5c1b1605 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 h1:PqzgE6kAMi81xWQA2QIVxjWkFHptGgC547vchpUbtFo= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -7,37 +6,26 @@ github.com/Joker/jade v1.0.0 h1:lOCEPvTAtWfLpSZYMOv/g44MGQFAolbKh2khHHGu0Kc= github.com/Joker/jade v1.0.0/go.mod h1:efZIdO0py/LtcJRSa/j2WEklMSAw84WV0zZVMxNToB8= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f h1:zvClvFQwU++UpIUBGC8YmDlfhUrweEy1R1Fj1gu5iIM= github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.4 h1:gVTrpUTbbr/T24uvoCaqY2KSHfNLVGm0w+hbee2HMeg= github.com/dgraph-io/badger v1.5.4/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 h1:afESQBXJEnj3fu+34X//E8Wg3nEbMJxJkwSc0tPePK0= github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/etcd-io/bbolt v1.3.0 h1:ec0U3x11Mk69A8YwQyZEhNaUqHkQSv2gDR3Bioz5DfU= github.com/etcd-io/bbolt v1.3.0/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flosch/pongo2 v0.0.0-20180809100617-24195e6d38b0 h1:ZHx2BEERvWkuwuE7qWN9TuRxucHDH2JrsvneZjVJfo0= github.com/flosch/pongo2 v0.0.0-20180809100617-24195e6d38b0/go.mod h1:rE0ErqqBaMcp9pzj8JxV1GcfDBpuypXYxlR1c37AUwg= -github.com/gavv/monotime v0.0.0-20171021193802-6f8212e8d10d h1:oYXrtNhqNKL1dVtKdv8XUq5zqdGVFNQ0/4tvccXZOLM= github.com/gavv/monotime v0.0.0-20171021193802-6f8212e8d10d/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/hashicorp/go-version v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnnCPtE8= github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= @@ -45,9 +33,7 @@ github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 h1:7GsNnSL github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1/go.mod h1:i8kTYUOEstd/S8TG0ChTXQdf4ermA/e8vJX0+QruD9w= github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce h1:q8Ka/exfHNgK7izJE+aUOZd7KZXJ7oQbnJWiZakEiMo= github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce/go.mod h1:VER17o2JZqquOx41avolD/wMGQSFEFBKWmhag9/RQRY= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 h1:Kyp9KiXwsyZRTeoNjgVCrWks7D8ht9+kg6yCjh8K97o= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -67,33 +53,22 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 h1:/vdW8Cb7EXrkqWGufVMES1OH2sU9gKVb2n9/1y5NMBY= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56 h1:yhqBHs09SmmUoNOHc9jgK4a60T3XFRtPAkYxVnqgY50= github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 h1:kkXA53yGe04D0adEYJwEVQjeBppL01Exg+fnMjfUraU= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -102,7 +77,6 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4r golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/ini.v1 v1.39.0 h1:Jf2sFGT+sAd7i+4ftUN1Jz90uw8XNH8NXbbOY16taA8= gopkg.in/ini.v1 v1.39.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 04bc21dd3b701d43404e640254c520b3b134a47f Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Sun, 2 Jun 2019 17:49:45 +0300 Subject: [PATCH 027/418] Add the new websocket package (which is just a helper for kataras/neffos) and an example for go server, client, browser client and nodejs client. Add a .fossa.yml and the generated NOTICE file for 3rd-party libs. Update go.mod, go.sum. Update the vendor folder for pongo2 to its latest master as well Former-commit-id: 89c05079415977d65e7328a1eb8a1c602d76f78a --- .fossa.yml | 11 + NOTICE | 98 +++ README.md | 2 +- _examples/websocket/basic/browser/index.html | 93 +++ .../websocket/basic/browserify/README.md | 11 + _examples/websocket/basic/browserify/app.js | 61 ++ .../websocket/basic/browserify/bundle.js | 1 + .../websocket/basic/browserify/index.html | 10 + .../websocket/basic/browserify/package.json | 16 + _examples/websocket/basic/go-client/client.go | 85 +++ _examples/websocket/basic/server.go | 53 ++ _examples/websocket/chat/main.go | 60 -- _examples/websocket/chat/websockets.html | 45 -- _examples/websocket/connectionlist/main.go | 96 --- .../connectionlist/static/js/chat.js | 38 - .../connectionlist/templates/client.html | 24 - _examples/websocket/custom-go-client/main.go | 179 ----- _examples/websocket/custom-go-client/run.bat | 4 - _examples/websocket/go-client/client/main.go | 58 -- _examples/websocket/go-client/server/main.go | 32 - go.mod | 54 +- go.sum | 93 +-- websocket/AUTHORS | 4 - websocket/LICENSE | 27 - websocket/client.js | 208 ------ websocket/client.js.go | 233 ------ websocket/client.min.js | 1 - websocket/client.ts | 256 ------- websocket/config.go | 159 ---- websocket/connection.go | 689 ------------------ websocket/emitter.go | 43 -- websocket/message.go | 182 ----- websocket/server.go | 395 ---------- websocket/websocket.go | 174 +++-- websocket/websocket_go19.go | 63 ++ 35 files changed, 661 insertions(+), 2897 deletions(-) create mode 100644 .fossa.yml create mode 100644 NOTICE create mode 100644 _examples/websocket/basic/browser/index.html create mode 100644 _examples/websocket/basic/browserify/README.md create mode 100644 _examples/websocket/basic/browserify/app.js create mode 100644 _examples/websocket/basic/browserify/bundle.js create mode 100644 _examples/websocket/basic/browserify/index.html create mode 100644 _examples/websocket/basic/browserify/package.json create mode 100644 _examples/websocket/basic/go-client/client.go create mode 100644 _examples/websocket/basic/server.go delete mode 100644 _examples/websocket/chat/main.go delete mode 100644 _examples/websocket/chat/websockets.html delete mode 100644 _examples/websocket/connectionlist/main.go delete mode 100644 _examples/websocket/connectionlist/static/js/chat.js delete mode 100644 _examples/websocket/connectionlist/templates/client.html delete mode 100644 _examples/websocket/custom-go-client/main.go delete mode 100644 _examples/websocket/custom-go-client/run.bat delete mode 100644 _examples/websocket/go-client/client/main.go delete mode 100644 _examples/websocket/go-client/server/main.go delete mode 100644 websocket/AUTHORS delete mode 100644 websocket/LICENSE delete mode 100644 websocket/client.js delete mode 100644 websocket/client.js.go delete mode 100644 websocket/client.min.js delete mode 100644 websocket/client.ts delete mode 100644 websocket/config.go delete mode 100644 websocket/connection.go delete mode 100644 websocket/emitter.go delete mode 100644 websocket/message.go delete mode 100644 websocket/server.go create mode 100644 websocket/websocket_go19.go diff --git a/.fossa.yml b/.fossa.yml new file mode 100644 index 00000000..cb3f48ee --- /dev/null +++ b/.fossa.yml @@ -0,0 +1,11 @@ +version: 2 +cli: + server: https://app.fossa.com + fetcher: custom + project: https://github.com/kataras/iris.git +analyze: + modules: + - name: iris + type: go + target: . + path: . \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 00000000..41cb2f41 --- /dev/null +++ b/NOTICE @@ -0,0 +1,98 @@ +================================================================================ + + Third-Party Software for iris + +================================================================================ + +The following 3rd-party software components may be used by or distributed with iris. This document was automatically generated by FOSSA on 2019-6-2; any information relevant to third-party vendors listed below are collected using common, reasonable means. + +Revision ID: 1e956950f72efdd080b904c952d4162fc7f309e9 + + +================================================================================ + + Direct Dependencies + +================================================================================ + +----------------- ----------------- ------------------------------------------ + Library Version Website +----------------- ----------------- ------------------------------------------ + amber cdade1c073850f4 https://github.com/eknkc/amber + ffc70a829e31235 + ea6892853b + blackfriday 48b3da6a6f3865c https://github.com/iris-contrib/ + 7eb1eba96d74cf0 blackfriday + a16f63faca + bluemonday 89802068f71166e https://github.com/microcosm-cc/ + 95c92040512bf2e bluemonday + 11767721ed + columnize 9e6335e58db3b4c https://github.com/ryanuber/columnize + fe3c3c5c881f51f + fbc1091b34 + formBinder fbd5963f41e18ae https://github.com/iris-contrib/ + 1f1423ba0462350 formBinder + 94b0721ea1 + go e369490fb7db5f2 https://github.com/golang/go + d42bb0e8ee19b48 + 378dee0ebf + go-version 192140e6f3e645d https://github.com/hashicorp/go-version + 971b134d4e35b51 + 91adb9dfd3 + go.uuid 36e9d2ebbde5e3f https://github.com/iris-contrib/go.uuid + 13ab2e25625fd45 + 3271d6522e + golog 03be101463868ed https://github.com/kataras/golog + c5a81f094fc68a5 + f6c1b5503a + goreferrer ec9c9a553398739 https://github.com/Shopify/goreferrer + f0dcf817e0ad5e0 + 1c4e7dcd08 + httpexpect ebe99fcebbcedf6 https://github.com/iris-contrib/ + e7916320cce24c3 httpexpect + e1832766ac + i18n 987a633949d087b https://github.com/iris-contrib/i18n + a52207b587792e8 + c67d65780b + jade 9ffefa50b5f3141 https://github.com/Joker/jade + 6ac643e9d9ad611 + 6f4688705f + json-iterator 08047c174c6c03e https://github.com/json-iterator/go + 8ec963a411bde1b + 6d1ee67b26 + neffos 38e9cc9b65c6ae0 https://github.com/kataras/neffos + 2998cc1a2df8767 + ecd5951e52 + pongo2 8914e1cf9164420 https://github.com/flosch/pongo2 + c91423cdefc7d97 + 8a76c38213 + raymond b565731e1464263 https://github.com/aymerick/raymond + de0bda75f2e45d9 + 7b54b60110 + structs 878a968ab225483 https://github.com/fatih/structs + 62a09bdb3322f98 + b00f470d46 + toml 3012a1dbe2e4bd1 https://github.com/BurntSushi/toml + 391d42b32f0577c + b7bbc7f005 + yaml.v2 51d6538a90f86fe https://gopkg.in/yaml.v2 + 93ac480b35f37b2 + be17fef232 + + + +================================================================================ + + Deep Dependencies + +================================================================================ + + badger e9447c910efd3c6 https://github.com/dgraph-io/badger + 7c5453ea1f65d2f + 355544dd82 + bbolt 2eb7227adea1d5c https://github.com/etcd-io/bbolt + f85f0bc2a82b705 + 9b13c2fa68 + redigo 39e2c31b7ca38b5 https://github.com/gomodule/redigo + 21ceb836620a269 + e62c895dc9 \ No newline at end of file diff --git a/README.md b/README.md index 5e450b55..51d093c9 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ import ( ## Quick start ```sh -# assume the following codes in example.go file +# assume the following code in example.go file $ cat example.go ``` diff --git a/_examples/websocket/basic/browser/index.html b/_examples/websocket/basic/browser/index.html new file mode 100644 index 00000000..2f846405 --- /dev/null +++ b/_examples/websocket/basic/browser/index.html @@ -0,0 +1,93 @@ + + + + + + + +