diff --git a/.gitignore b/.gitignore
index 4f1ab8e..8ae94c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
/Goleaf
Goleaf.tar
source/main
+playbook/node_modules/*
diff --git a/kafka/.vscode/launch.json b/kafka/.vscode/launch.json
new file mode 100644
index 0000000..e5dcb5f
--- /dev/null
+++ b/kafka/.vscode/launch.json
@@ -0,0 +1,15 @@
+{
+ // 使用 IntelliSense 了解相关属性。
+ // 悬停以查看现有属性的描述。
+ // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Launch file",
+ "type": "go",
+ "request": "launch",
+ "mode": "debug",
+ "program": "${file}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/kafka/__debug_bin3625240056.exe b/kafka/__debug_bin3625240056.exe
new file mode 100644
index 0000000..88041bd
Binary files /dev/null and b/kafka/__debug_bin3625240056.exe differ
diff --git a/kafka/conf/conf.yml b/kafka/conf/conf.yml
new file mode 100644
index 0000000..34af105
--- /dev/null
+++ b/kafka/conf/conf.yml
@@ -0,0 +1,14 @@
+db:
+ host: "localhost"
+ user: root
+ password: "hef0YMId4DayV0XuGCLmjNjEAVg="
+ port: 3306
+games:
+ - name: "Merge_Pet_Local"
+ topic: "Merge_Pet_Local"
+ partition: 0
+ db_name: "Merge_Pet_Local"
+ - name: "Merge_Pet_Test"
+ topic: "Merge_Pet_Test"
+ partition: 0
+ db_name: "Merge_Pet_Test"
\ No newline at end of file
diff --git a/kafka/config/config.go b/kafka/config/config.go
new file mode 100644
index 0000000..65122f7
--- /dev/null
+++ b/kafka/config/config.go
@@ -0,0 +1,98 @@
+package config
+
+import (
+ "fmt"
+ "log"
+ "os"
+ "path/filepath"
+
+ "gopkg.in/yaml.v2"
+)
+
+type Config struct {
+ DB struct {
+ Host string `yaml:"host"`
+ User string `yaml:"user"`
+ Password string `yaml:"password"`
+ Port int `yaml:"port"`
+ } `yaml:"db"`
+ Games []struct {
+ Name string `yaml:"name"`
+ DBName string `yaml:"db_name"`
+ Topic string `yaml:"topic"`
+ Partition int `yaml:"partition"`
+ } `yaml:"games"`
+}
+
+type Game struct {
+ Name string
+ DBName string
+ Topic string
+ Partition int
+}
+
+type DBConf struct {
+ Host string
+ User string
+ Password string
+ Port int
+ DbNamee string
+}
+
+var Conf *Config
+
+func init() {
+ var err error
+ Conf, err = loadConfig("./conf/conf.yml")
+ if err != nil {
+ log.Fatalf("Error loading config: %v", err)
+ }
+}
+
+func loadConfig(filename string) (*Config, error) {
+ absPath, err := filepath.Abs(filename)
+ if err != nil {
+ return nil, err
+ }
+ fmt.Println(absPath)
+ data, err := os.ReadFile(filename)
+ if err != nil {
+ return nil, err
+ }
+
+ var config Config
+ err = yaml.Unmarshal(data, &config)
+ if err != nil {
+ return nil, err
+ }
+
+ return &config, nil
+}
+
+func GetDbConfig(Key string) *DBConf {
+ DBConf := &DBConf{}
+ for _, game := range Conf.Games {
+ if game.Name == Key {
+ DBConf.Host = Conf.DB.Host
+ DBConf.User = Conf.DB.User
+ DBConf.Password = Conf.DB.Password
+ DBConf.Port = Conf.DB.Port
+ DBConf.DbNamee = game.DBName
+ break
+ }
+ }
+ return DBConf
+}
+
+func GetGames() []*Game {
+ games := make([]*Game, 0)
+ for _, game := range Conf.Games {
+ games = append(games, &Game{
+ Name: game.Name,
+ DBName: game.DBName,
+ Topic: game.Topic,
+ Partition: game.Partition,
+ })
+ }
+ return games
+}
diff --git a/kafka/db/db.go b/kafka/db/db.go
new file mode 100644
index 0000000..534a9cc
--- /dev/null
+++ b/kafka/db/db.go
@@ -0,0 +1,94 @@
+package db
+
+import (
+ "encoding/json"
+ "kafka-comsumer/config"
+ "kafka-comsumer/util"
+ "strconv"
+
+ _ "github.com/go-sql-driver/mysql"
+ "github.com/jmoiron/sqlx"
+ "github.com/segmentio/kafka-go"
+)
+
+var Container = map[string]*sqlx.DB{}
+
+func GetContainer(Key string) *sqlx.DB {
+ v, ok := Container[Key]
+ if !ok {
+ DbConf := config.GetDbConfig(Key)
+ NewDbPass, _ := util.Decrypt(DbConf.Password, util.SECRET_KEY)
+ db, err := sqlx.Connect("mysql", DbConf.User+":"+NewDbPass+"@tcp("+DbConf.Host+":"+strconv.Itoa(DbConf.Port)+")/"+DbConf.DbNamee)
+ if err != nil {
+ return nil
+ }
+ Container[Key] = db
+ return db
+ }
+ return v
+}
+
+func ProcessMsg(SqlDb *sqlx.DB, m kafka.Message) error {
+ if SqlDb == nil {
+ return nil
+ }
+ // fmt.Printf("Message at offset %d: %s = %s\n", m.Offset, string(m.Key), string(m.Value))
+ tx := SqlDb.MustBegin()
+ var err error
+ switch string(m.Key) {
+ case "Login_log":
+ err = login(SqlDb, m)
+ case "Login_Out":
+ err = login(SqlDb, m)
+ default:
+ err = event(SqlDb, m)
+ }
+ if err != nil {
+ tx.Rollback()
+ return err
+ }
+ offset(SqlDb, m)
+ tx.Commit()
+ // fmt.Println("msg process success")
+ return nil
+}
+
+func login(SqlDb *sqlx.DB, m kafka.Message) error {
+ var V map[string]interface{}
+ json.Unmarshal(m.Value, &V)
+ sql := "INSERT INTO log_login (`Uid`, `Event`, `Timestamp`) VALUES (?, ?, ?)"
+
+ _, err := SqlDb.Exec(sql, V["Uid"], m.Key, V["TimeStamp"])
+ return err
+}
+
+func event(SqlDb *sqlx.DB, m kafka.Message) error {
+ var V map[string]interface{}
+ json.Unmarshal(m.Value, &V)
+ Param, err := json.Marshal(V["Param"])
+ if err != nil {
+ return err
+ }
+ sql := "INSERT INTO log_event (`Uid`, `Event`, `Param`, `Timestamp`) VALUES (?, ?, ?, ?)"
+ _, err = SqlDb.Exec(sql, V["Uid"], m.Key, string(Param), V["TimeStamp"])
+ return err
+}
+
+func offset(SqlDb *sqlx.DB, m kafka.Message) error {
+ sql := " INSERT INTO `log_var` (`Key` , `Value`, `Timestamp`) Values (?,?,?) ON DUPLICATE KEY UPDATE `key` = ? , `Value` = ? ,`Timestamp`=?"
+ Value := strconv.FormatInt(m.Offset+1, 10)
+ Timestamp := util.GetNowTime()
+ _, err := SqlDb.Exec(sql, "offset", Value, Timestamp, "offset", Value, Timestamp)
+ return err
+}
+
+func GetOffset(SqlDb *sqlx.DB) int64 {
+ sql := "select `Value` from `log_var` where `Key` = 'offset'"
+ var offset string
+ err := SqlDb.Get(&offset, sql)
+ if offset == "" || err != nil {
+ return kafka.FirstOffset
+ }
+ v, _ := strconv.ParseInt(offset, 10, 64)
+ return v
+}
diff --git a/kafka/go.mod b/kafka/go.mod
new file mode 100644
index 0000000..541ad42
--- /dev/null
+++ b/kafka/go.mod
@@ -0,0 +1,17 @@
+module kafka-comsumer
+
+go 1.23.1
+
+require github.com/segmentio/kafka-go v0.4.47
+
+require (
+ filippo.io/edwards25519 v1.1.0 // indirect
+ github.com/go-sql-driver/mysql v1.8.1 // indirect
+ github.com/jmoiron/sqlx v1.4.0 // indirect
+ github.com/klauspost/compress v1.17.9 // indirect
+ github.com/pierrec/lz4/v4 v4.1.21 // indirect
+ github.com/stretchr/testify v1.9.0 // indirect
+ golang.org/x/net v0.28.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
+ gopkg.in/yaml.v2 v2.4.0 // indirect
+)
diff --git a/kafka/go.sum b/kafka/go.sum
new file mode 100644
index 0000000..795c036
--- /dev/null
+++ b/kafka/go.sum
@@ -0,0 +1,83 @@
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+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/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
+github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
+github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+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/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0=
+github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
+github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
+github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
+github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
+golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/kafka/kafka-comsumer.tar b/kafka/kafka-comsumer.tar
new file mode 100644
index 0000000..ca57c65
Binary files /dev/null and b/kafka/kafka-comsumer.tar differ
diff --git a/kafka/main.go b/kafka/main.go
new file mode 100644
index 0000000..b51f315
--- /dev/null
+++ b/kafka/main.go
@@ -0,0 +1,78 @@
+package main
+
+import (
+ "context"
+ "kafka-comsumer/config"
+ "kafka-comsumer/db"
+ "log"
+ "os"
+ "os/signal"
+ "sync"
+ "syscall"
+
+ "github.com/segmentio/kafka-go"
+)
+
+var (
+ WorkChan = make(chan *kafka.Message, 100)
+ Wait sync.WaitGroup
+)
+
+// GOOS=linux GOARCH=amd64 go build -o /data/pet_home_devops/kafka/release/kafka_comsumer main.go
+
+func main() {
+ // 打开日志文件
+ logFile, err := os.OpenFile("./log/kafka-comsumer.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
+ if err != nil {
+ log.Fatalf("Failed to open log file: %v", err)
+ }
+ defer logFile.Close()
+
+ // 将日志输出重定向到文件
+ log.SetOutput(logFile)
+ log.SetFlags(log.LstdFlags | log.Lshortfile)
+ Games := config.GetGames()
+ for _, game := range Games {
+ go comsumer(game)
+ }
+ c := make(chan os.Signal, 1)
+ signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)
+ sig := <-c
+ log.Printf("kafka comsumer closing down (signal: %v)\n", sig.String())
+ Wait.Wait()
+}
+
+func comsumer(Game *config.Game) {
+ sqlDb := db.GetContainer(Game.Name)
+ if sqlDb == nil {
+ log.Printf("comsumer db %s not exist \n", Game.Name)
+ return
+ }
+ r := kafka.NewReader(kafka.ReaderConfig{
+ Brokers: []string{"kafka-server:9092"},
+ Topic: Game.Topic,
+ Partition: Game.Partition,
+ MinBytes: 10e3, // 10KB
+ MaxBytes: 10e6, // 10MB
+ })
+ defer r.Close()
+ // 设置读取超时时间
+ offset := db.GetOffset(sqlDb)
+ r.SetOffset(offset)
+ ctx := context.Background()
+ log.Println("comsumer start ", Game.Name)
+ for {
+ // 读取消息
+ m, err := r.ReadMessage(ctx)
+ if err != nil {
+ log.Println("comsumer close ", Game.Name)
+ return
+ }
+ Wait.Add(1)
+ err = db.ProcessMsg(sqlDb, m)
+ if err != nil {
+ log.Printf("comsumer %s error :%v", Game.Name, err)
+ }
+ Wait.Done()
+ }
+}
diff --git a/kafka/release/conf/conf.yml b/kafka/release/conf/conf.yml
new file mode 100644
index 0000000..eb1ac63
--- /dev/null
+++ b/kafka/release/conf/conf.yml
@@ -0,0 +1,14 @@
+db:
+ host: "rm-f8zd2030feam53n43.mysql.rds.aliyuncs.com"
+ user: root
+ password: "V00jJQcC5GQOSEoEXmTfFmBCTk1-g2lBT2n-YA9UUg=="
+ port: 3306
+games:
+ - name: "Merge_Pet_Local"
+ topic: "Merge_Pet_Local"
+ partition: 0
+ db_name: "Merge_Pet_Local"
+ - name: "Merge_Pet_Test"
+ topic: "Merge_Pet_Test"
+ partition: 0
+ db_name: "Merge_Pet_Test"
\ No newline at end of file
diff --git a/kafka/release/kafka_comsumer b/kafka/release/kafka_comsumer
new file mode 100644
index 0000000..f2bae31
Binary files /dev/null and b/kafka/release/kafka_comsumer differ
diff --git a/kafka/release/log/kafka-comsumer.log b/kafka/release/log/kafka-comsumer.log
new file mode 100644
index 0000000..c80a274
--- /dev/null
+++ b/kafka/release/log/kafka-comsumer.log
@@ -0,0 +1,2 @@
+2024/12/18 07:00:46 main.go:48: comsumer db Merge_Pet_Online not exist
+2024/12/18 07:00:46 main.go:63: comsumer start Merge_Pet_Local
diff --git a/kafka/release/logs b/kafka/release/logs
new file mode 100644
index 0000000..57c186e
--- /dev/null
+++ b/kafka/release/logs
@@ -0,0 +1,2 @@
+/data/pet_home_devops/kafka/release/conf/conf.yml
+/data/pet_home_devops/kafka/release/conf/conf.yml
diff --git a/kafka/release/start.sh b/kafka/release/start.sh
new file mode 100644
index 0000000..5481fb1
--- /dev/null
+++ b/kafka/release/start.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+# Restart the kafka comsumer service
+
+# 获取命令行参数
+if [ $# -ne 1 ]; then
+ echo "Usage: $0 [start|stop|status|restart]"
+ exit 1
+fi
+
+if [ $1 == "start" ]; then
+ echo "Starting kafka comsumer..."
+ > log/kafka-comsumer.log # 清空 logs 文件
+ nohup ./kafka_comsumer >> logs 2>&1 &
+ echo "kafka comsumer started."
+elif [ $1 == "stop" ]; then
+ echo "Stopping kafka comsumer..."
+ PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}')
+ if [ -z $PID ]; then
+ echo "kafka comsumer is not running."
+ exit 1
+ fi
+ ps -ef | grep kafka_comsumer | grep -v grep | awk '{print $2}' | xargs kill
+ echo "kafka comsumer stopped."
+elif [ $1 == "status" ]; then
+ echo "kafka comsumer status:"
+ PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}')
+ if [ -z $PID ]; then
+ echo "kafka comsumer is not running."
+ else
+ echo "kafka comsumer is running."
+ fi
+elif [ $1 == "restart" ]; then
+ echo "Restarting kafka comsumer..."
+ PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}')
+ if [ -n $PID ]; then
+ echo "kafka comsumer stoping."
+ kill $PID
+ fi
+ while [ -n "$PID" ]; do
+ sleep 1
+ PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}')
+ done
+ echo "kafka comsumer stoped."
+ > log/kafka-comsumer.log # 清空 logs 文件
+ nohup kafka_comsumer >> logs 2>&1 &
+ echo "kafka comsumer restarted."
+else
+ echo "Usage: $0 [start|stop|status|restart]"
+ exit 1
+fi
diff --git a/kafka/sql/create.sql b/kafka/sql/create.sql
new file mode 100644
index 0000000..4160296
--- /dev/null
+++ b/kafka/sql/create.sql
@@ -0,0 +1,37 @@
+/*==============================================================*/
+/* Database name: sg_gamedb */
+/* DBMS name: MySQL 5.5.17 */
+/* Created on: 2014-10-16 10:00:00 */
+/*==============================================================*/
+
+create database if not exists Merge_Pet_Local CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+use Merge_Pet_Local;
+
+
+CREATE TABLE IF NOT EXISTS `log_var` (
+ `Key` varchar(128) DEFAULT '' COMMENT '键',
+ `Value` varchar(128) DEFAULT '' COMMENT '值',
+ `Timestamp` int DEFAULT 0 COMMENT '时间',
+ PRIMARY KEY (`key`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='登录日志';
+
+CREATE TABLE IF NOT EXISTS `log_login` (
+ `id` int unsigned AUTO_INCREMENT COMMENT '自增id',
+ `Uid` int unsigned NOT NULL COMMENT '玩家id',
+ `Event` varchar(128) DEFAULT '' COMMENT '事件',
+ `Timestamp` int DEFAULT 0 COMMENT '时间',
+ PRIMARY KEY (`id`),
+ KEY `Event` (`Event`),
+ KEY `Uid` (`Uid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='登录日志';
+
+CREATE TABLE IF NOT EXISTS `log_event` (
+ `id` int unsigned AUTO_INCREMENT COMMENT '自增id',
+ `Uid` int unsigned NOT NULL COMMENT '玩家id',
+ `Event` varchar(128) DEFAULT '' COMMENT '事件',
+ `Param` text COMMENT '参数',
+ `Timestamp` int DEFAULT 0 COMMENT '时间',
+ PRIMARY KEY (`id`),
+ KEY `Event` (`Event`),
+ KEY `Uid` (`Uid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作事件';
\ No newline at end of file
diff --git a/kafka/unit_test.go b/kafka/unit_test.go
new file mode 100644
index 0000000..52e07f9
--- /dev/null
+++ b/kafka/unit_test.go
@@ -0,0 +1,23 @@
+package main
+
+import (
+ "fmt"
+ "kafka-comsumer/util"
+ "testing"
+)
+
+func TestEncrypt(t *testing.T) {
+ str, err := util.Encrypt("Z4rf7eZZe500dxa", util.SECRET_KEY)
+ if err != nil {
+ t.Errorf("Error: %v", err)
+ }
+ fmt.Print(str)
+}
+
+func TestDecrypt(t *testing.T) {
+ str, err := util.Decrypt("V00jJQcC5GQOSEoEXmTfFmBCTk1-g2lBT2n-YA9UUg==", util.SECRET_KEY)
+ if err != nil {
+ t.Errorf("Error: %v", err)
+ }
+ fmt.Print(str)
+}
diff --git a/kafka/util/util.go b/kafka/util/util.go
new file mode 100644
index 0000000..9274e9f
--- /dev/null
+++ b/kafka/util/util.go
@@ -0,0 +1,64 @@
+package util
+
+import (
+ "crypto/aes"
+ "crypto/cipher"
+ "crypto/rand"
+ "encoding/base64"
+ "fmt"
+ "io"
+ "time"
+)
+
+const (
+ SECRET_KEY = ")VQbB(vpy=U(wcp)"
+)
+
+// 加密字符串
+func Encrypt(plainText, key string) (string, error) {
+ block, err := aes.NewCipher([]byte(key))
+ if err != nil {
+ return "", err
+ }
+
+ cipherText := make([]byte, aes.BlockSize+len(plainText))
+ iv := cipherText[:aes.BlockSize]
+ if _, err := io.ReadFull(rand.Reader, iv); err != nil {
+ return "", err
+ }
+
+ stream := cipher.NewCFBEncrypter(block, iv)
+ stream.XORKeyStream(cipherText[aes.BlockSize:], []byte(plainText))
+
+ return base64.URLEncoding.EncodeToString(cipherText), nil
+}
+
+// 解密字符串
+func Decrypt(cipherText, key string) (string, error) {
+ cipherTextBytes, err := base64.URLEncoding.DecodeString(cipherText)
+ if err != nil {
+ return "", err
+ }
+
+ block, err := aes.NewCipher([]byte(key))
+ if err != nil {
+ return "", err
+ }
+
+ if len(cipherTextBytes) < aes.BlockSize {
+ return "", fmt.Errorf("cipherText too short")
+ }
+
+ iv := cipherTextBytes[:aes.BlockSize]
+ cipherTextBytes = cipherTextBytes[aes.BlockSize:]
+
+ stream := cipher.NewCFBDecrypter(block, iv)
+ stream.XORKeyStream(cipherTextBytes, cipherTextBytes)
+
+ return string(cipherTextBytes), nil
+}
+
+func GetNowTime() int64 {
+ T := time.Now()
+ return T.Unix()
+}
diff --git a/nginx/gitea.conf b/nginx/gitea.conf
new file mode 100644
index 0000000..1ed6f66
--- /dev/null
+++ b/nginx/gitea.conf
@@ -0,0 +1,40 @@
+server {
+ listen 80;
+ server_name gitea.bywaystudios.com;
+
+ # 将 HTTP 请求重定向到 HTTPS
+ location / {
+ return 301 https://$host$request_uri;
+ }
+}
+
+server {
+ listen 443 ssl;
+ server_name gitea.bywaystudios.com;
+
+ ssl_certificate /etc/nginx/ssl/gitea.bywaystudios.com.pem;
+ ssl_certificate_key /etc/nginx/ssl/gitea.bywaystudios.com.key;
+ ssl_protocols TLSv1.2 TLSv1.3;
+ ssl_ciphers HIGH:!aNULL:!MD5;
+
+ location / {
+ proxy_pass http://localhost:8080;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+
+ location /kafka {
+ proxy_pass http://localhost:500/ui;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+
+ # 可选:配置日志文件
+ access_log /var/log/nginx/gitea_access.log;
+ error_log /var/log/nginx/gitea_error.log;
+}
+
diff --git a/nginx/tcp.conf b/nginx/tcp.conf
new file mode 100644
index 0000000..6b38da2
--- /dev/null
+++ b/nginx/tcp.conf
@@ -0,0 +1,31 @@
+server {
+ listen 80;
+ server_name pethome.bywaystudios.com;
+
+ # 将 HTTP 请求重定向到 HTTPS
+ location / {
+ return 301 https://$host$request_uri;
+ }
+}
+
+server {
+ listen 443 ssl;
+ server_name pethome.bywaystudios.com;
+
+ ssl_certificate /etc/nginx/ssl/pethome.bywaystudios.com.pem;
+ ssl_certificate_key /etc/nginx/ssl/pethome.bywaystudios.com.key;
+ ssl_protocols TLSv1.2 TLSv1.3;
+ ssl_ciphers HIGH:!aNULL:!MD5;
+
+ location / {
+ proxy_pass http://localhost:8080;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+
+ # 可选:配置日志文件
+ access_log /var/log/nginx/pethome_access.log;
+ error_log /var/log/nginx/pethome_error.log;
+}
diff --git a/pack.sh b/pack.sh
index a8dfb91..46b317b 100644
--- a/pack.sh
+++ b/pack.sh
@@ -1,2 +1,2 @@
-cd /data/pet_home/src/server
-GOOS=linux GOARCH=amd64 go build -o /data/devops/source/main main.go
+cd /data/pet_home_server/src/server
+GOOS=linux GOARCH=amd64 go build -o /data/pet_home_devops/source/main main.go
diff --git a/playbook/goleaf-com.yml b/playbook/goleaf-com.yml
index dbdeabd..9b87999 100644
--- a/playbook/goleaf-com.yml
+++ b/playbook/goleaf-com.yml
@@ -1,6 +1,6 @@
---
- name: Deploy GoLeaf release
- hosts: compose
+ hosts: zone1
remote_user: root
tasks:
@@ -12,19 +12,19 @@
# - name: tar
# command: tar -xvf /usr/local/Goleaf.tar -C /usr/local/
- name: sh pack.sh
- shell: sh /data/devops/pack.sh
+ shell: sh /data/pet_home_devops/pack.sh
delegate_to: localhost
- name: copy goleaf
copy:
- src: /data/devops/source/main
+ src: /data/pet_home_devops/source/main
dest: /usr/local/Goleaf
- - name: copy config
- copy:
- src: /data/docs/tool/out/
- dest: /usr/local/Goleaf/gamedata/config/
- mode: '0777'
+ # - name: copy config
+ # copy:
+ # src: /data/pet_homedocs/tool/out/
+ # dest: /usr/local/Goleaf/gamedata/config/
+ # mode: '0777'
# - name: restart goleaf
diff --git a/playbook/goleaf-conf.yml b/playbook/goleaf-conf.yml
new file mode 100644
index 0000000..9606e87
--- /dev/null
+++ b/playbook/goleaf-conf.yml
@@ -0,0 +1,27 @@
+---
+- name: Deploy GoLeaf release
+ hosts: test
+ remote_user: root
+
+ tasks:
+
+
+ - name: copy config
+ copy:
+ src: /data/pet_homedocs/tool/out/
+ dest: /usr/local/Goleaf/gamedata/config/
+ mode: '0777'
+ - name: reload config
+ command: echo "1" > /usr/local/Goleaf/gamedata/config/reload
+ register: reload_result
+
+ - name: copy config2
+ copy:
+ src: /data/pet_homedocs/tool/out/
+ dest: /usr/local/game/gamedata/config/
+ mode: '0777'
+ - name: reload config
+ command: echo "1" > /usr/local/game/gamedata/config/reload
+ register: reload_result
+
+
diff --git a/playbook/goleaf-google.yml b/playbook/goleaf-google.yml
new file mode 100644
index 0000000..4d02def
--- /dev/null
+++ b/playbook/goleaf-google.yml
@@ -0,0 +1,53 @@
+---
+- name: Deploy GoLeaf release
+ hosts: google
+ remote_user: root
+ vars:
+ goleaf_src: /data/pet_home_devops/source/main
+ goleaf_dest: /usr/local/game
+ config_src: /data/pet_homedocs/tool/out/
+ config_dest: /usr/local/game/gamedata/config/
+ pack_script: /data/pet_home_devops/pack.sh
+ tar_file: /usr/local/Goleaf.tar
+ tar_dest: /usr/local/game
+
+ tasks:
+ # - name: copy goleaf
+ # command: tar -cvf /usr/local/Goleaf.tar -C /data/pet_home_devops/Goleaf .
+ # delegate_to: localhost
+ # - name: copy tar
+ # copy:
+ # src: /usr/local/Goleaf.tar
+ # dest: /usr/local/game
+ # - name : untar
+ # command: tar -xvf /usr/local/game/Goleaf.tar -C /usr/local/game
+ - name: sh pack.sh
+ shell: sh /data/pet_home_devops/pack.sh
+ delegate_to: localhost
+ - name: stop goleaf
+ command: sh "{{ goleaf_dest }}"/Restart.sh stop
+ register: restart_result
+
+ - name: copy goleaf
+ copy:
+ src: "{{ goleaf_src }}"
+ dest: "{{goleaf_dest}}"
+
+ - name: copy goleaf
+ command: tar -cvf /usr/local/conf.tar -C /data/pet_homedocs/tool/out .
+ delegate_to: localhost
+ - name: copy tar
+ copy:
+ src: /usr/local/conf.tar
+ dest: /usr/local/game
+ - name : untar
+ command: tar -xvf /usr/local/game/conf.tar -C /usr/local/game/gamedata/config/
+
+
+ - name: restart goleaf
+ command: sh "{{ goleaf_dest }}"/Restart.sh start
+ register: restart_result
+
+ - name: show restart result
+ debug:
+ var: restart_result.stdout_lines
diff --git a/playbook/goleaf-sdk.yml b/playbook/goleaf-sdk.yml
new file mode 100644
index 0000000..cee33d0
--- /dev/null
+++ b/playbook/goleaf-sdk.yml
@@ -0,0 +1,53 @@
+---
+- name: Deploy GoLeaf release
+ hosts: test
+ remote_user: root
+ vars:
+ goleaf_src: /data/pet_home_devops/source/main
+ goleaf_dest: /usr/local/game
+ config_src: /data/pet_homedocs/tool/out/
+ config_dest: /usr/local/game/gamedata/config/
+ pack_script: /data/pet_home_devops/pack.sh
+ tar_file: /usr/local/Goleaf.tar
+ tar_dest: /usr/local/game
+
+ tasks:
+ # - name: copy goleaf
+ # command: tar -cvf /usr/local/Goleaf.tar -C /data/pet_home_devops/Goleaf .
+ # delegate_to: localhost
+ # - name: copy tar
+ # copy:
+ # src: /usr/local/Goleaf.tar
+ # dest: /usr/local/game
+ # - name : untar
+ # command: tar -xvf /usr/local/game/Goleaf.tar -C /usr/local/game
+ - name: sh pack.sh
+ shell: sh /data/pet_home_devops/pack.sh
+ delegate_to: localhost
+ - name: restart goleaf
+ command: sh "{{ goleaf_dest }}"/Restart.sh stop
+ register: restart_result
+
+ - name: copy goleaf
+ copy:
+ src: "{{ goleaf_src }}"
+ dest: "{{goleaf_dest}}"
+
+ - name: copy goleaf
+ command: tar -cvf /usr/local/conf.tar -C /data/pet_homedocs/tool/out .
+ delegate_to: localhost
+ - name: copy tar
+ copy:
+ src: /usr/local/conf.tar
+ dest: /usr/local/game
+ - name : untar
+ command: tar -xvf /usr/local/game/conf.tar -C /usr/local/game/gamedata/config/
+
+
+ - name: restart goleaf
+ command: sh "{{ goleaf_dest }}"/Restart.sh start
+ register: restart_result
+
+ - name: show restart result
+ debug:
+ var: restart_result.stdout_lines
diff --git a/playbook/goleaf.yml b/playbook/goleaf.yml
index 60eb8a4..550d327 100644
--- a/playbook/goleaf.yml
+++ b/playbook/goleaf.yml
@@ -4,26 +4,38 @@
remote_user: root
tasks:
- - name: sh pack.sh
- shell: sh /data/devops/pack.sh
- delegate_to: localhost
+ # - name: restart goleaf
+ # command: sh /usr/local/Goleaf/Restart.sh stop
+ # register: restart_result
+
+ # - name: sh pack.sh
+ # shell: sh /data/pet_home_devops/pack.sh
+ # delegate_to: localhost
+
+ # - name: copy goleaf
+ # copy:
+ # src: /data/pet_home_devops/Goleaf/tool/tool
+ # dest: /usr/local/Goleaf/tool
+ # - name: copy goleaf
+ # copy:
+ # src: /data/pet_home_devops/source/main
+ # dest: /usr/local/Goleaf
- name: copy goleaf
+ command: tar -cvf /usr/local/conf.tar -C /data/pet_homedocs/tool/out .
+ delegate_to: localhost
+ - name: copy tar
copy:
- src: /data/devops/source/main
+ src: /usr/local/conf.tar
dest: /usr/local/Goleaf
-
- - name: copy config
- copy:
- src: /data/docs/tool/out/
- dest: /usr/local/Goleaf/gamedata/config/
- mode: '0777'
+ - name : untar
+ command: tar -xvf /usr/local/Goleaf/conf.tar -C /usr/local/Goleaf/gamedata/config/
- - name: restart goleaf
- command: sh /usr/local/Goleaf/Restart.sh restart
- register: restart_result
+ # - name: restart goleaf
+ # command: sh /usr/local/Goleaf/Restart.sh start
+ # register: restart_result
- - name: show restart result
- debug:
- var: restart_result.stdout_lines
+ # - name: show restart result
+ # debug:
+ # var: restart_result.stdout_lines
diff --git a/playbook/hosts b/playbook/hosts
index 9481a75..16d895a 100644
--- a/playbook/hosts
+++ b/playbook/hosts
@@ -1,8 +1,17 @@
[test]
-test ansible_ssh_host=1.15.182.107 ansible_ssh_user="root" ansible_ssh_port=22
+a1 ansible_ssh_host=1.15.182.107 ansible_ssh_user="root" ansible_ssh_port=22
[compose]
-center ansible_ssh_host=172.20.0.2 ansible_ssh_user="root" ansible_ssh_port=22
-zone1 ansible_ssh_host=172.20.0.3 ansible_ssh_user="root" ansible_ssh_port=22
-zone2 ansible_ssh_host=172.20.0.4 ansible_ssh_user="root" ansible_ssh_port=22
+c1 ansible_ssh_host=172.20.0.2 ansible_ssh_user="root" ansible_ssh_port=22
+z1 ansible_ssh_host=172.20.0.3 ansible_ssh_user="root" ansible_ssh_port=22
+z2 ansible_ssh_host=172.20.0.4 ansible_ssh_user="root" ansible_ssh_port=22
+[zone1]
+a2 ansible_ssh_host=172.20.0.3 ansible_ssh_user="root" ansible_ssh_port=22
+
+[google]
+g1 ansible_ssh_host=47.254.83.25 ansible_ssh_user="root" ansible_ssh_port=22
+
+[release]
+a1 ansible_ssh_host=1.15.182.107 ansible_ssh_user="root" ansible_ssh_port=22
+g1 ansible_ssh_host=47.254.83.25 ansible_ssh_user="root" ansible_ssh_port=22
diff --git a/playbook/package-lock.json b/playbook/package-lock.json
new file mode 100644
index 0000000..778da54
--- /dev/null
+++ b/playbook/package-lock.json
@@ -0,0 +1,1344 @@
+{
+ "name": "playbook",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "protobufjs-cli": "^1.1.3"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+ "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+ "dependencies": {
+ "@babel/types": "^7.26.3"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@jsdoc/salty": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz",
+ "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==",
+ "dependencies": {
+ "lodash": "^4.17.21"
+ },
+ "engines": {
+ "node": ">=v12.0.0"
+ }
+ },
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "peer": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "peer": true
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "peer": true
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="
+ },
+ "node_modules/@types/node": {
+ "version": "22.10.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
+ "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/catharsis": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
+ "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
+ "dependencies": {
+ "lodash": "^4.17.15"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/js2xmlparser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
+ "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
+ "dependencies": {
+ "xmlcreate": "^2.0.4"
+ }
+ },
+ "node_modules/jsdoc": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz",
+ "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==",
+ "dependencies": {
+ "@babel/parser": "^7.20.15",
+ "@jsdoc/salty": "^0.2.1",
+ "@types/markdown-it": "^14.1.1",
+ "bluebird": "^3.7.2",
+ "catharsis": "^0.9.0",
+ "escape-string-regexp": "^2.0.0",
+ "js2xmlparser": "^4.0.2",
+ "klaw": "^3.0.0",
+ "markdown-it": "^14.1.0",
+ "markdown-it-anchor": "^8.6.7",
+ "marked": "^4.0.10",
+ "mkdirp": "^1.0.4",
+ "requizzle": "^0.2.3",
+ "strip-json-comments": "^3.1.0",
+ "underscore": "~1.13.2"
+ },
+ "bin": {
+ "jsdoc": "jsdoc.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/klaw": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+ "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+ "dependencies": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/long": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==",
+ "peer": true
+ },
+ "node_modules/markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it-anchor": {
+ "version": "8.6.7",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
+ "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
+ "peerDependencies": {
+ "@types/markdown-it": "*",
+ "markdown-it": "*"
+ }
+ },
+ "node_modules/marked": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
+ },
+ "node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/protobufjs": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
+ "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
+ "hasInstallScript": true,
+ "peer": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/protobufjs-cli": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.3.tgz",
+ "integrity": "sha512-MqD10lqF+FMsOayFiNOdOGNlXc4iKDCf0ZQPkPR+gizYh9gqUeGTWulABUCdI+N67w5RfJ6xhgX4J8pa8qmMXQ==",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "escodegen": "^1.13.0",
+ "espree": "^9.0.0",
+ "estraverse": "^5.1.0",
+ "glob": "^8.0.0",
+ "jsdoc": "^4.0.0",
+ "minimist": "^1.2.0",
+ "semver": "^7.1.2",
+ "tmp": "^0.2.1",
+ "uglify-js": "^3.7.7"
+ },
+ "bin": {
+ "pbjs": "bin/pbjs",
+ "pbts": "bin/pbts"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "protobufjs": "^7.0.0"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/requizzle": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+ "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
+ "dependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.13.7",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+ "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g=="
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "peer": true
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/xmlcreate": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
+ "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg=="
+ }
+ },
+ "dependencies": {
+ "@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
+ },
+ "@babel/parser": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+ "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+ "requires": {
+ "@babel/types": "^7.26.3"
+ }
+ },
+ "@babel/types": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "requires": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ }
+ },
+ "@jsdoc/salty": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz",
+ "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==",
+ "requires": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "peer": true
+ },
+ "@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "peer": true
+ },
+ "@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "peer": true
+ },
+ "@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
+ "peer": true
+ },
+ "@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "peer": true,
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "peer": true
+ },
+ "@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "peer": true
+ },
+ "@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "peer": true
+ },
+ "@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "peer": true
+ },
+ "@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "peer": true
+ },
+ "@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="
+ },
+ "@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "requires": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="
+ },
+ "@types/node": {
+ "version": "22.10.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
+ "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
+ "peer": true,
+ "requires": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "requires": {}
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "catharsis": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
+ "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
+ "requires": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ },
+ "entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+ },
+ "escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+ },
+ "escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
+ },
+ "espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "requires": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "js2xmlparser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
+ "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
+ "requires": {
+ "xmlcreate": "^2.0.4"
+ }
+ },
+ "jsdoc": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz",
+ "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==",
+ "requires": {
+ "@babel/parser": "^7.20.15",
+ "@jsdoc/salty": "^0.2.1",
+ "@types/markdown-it": "^14.1.1",
+ "bluebird": "^3.7.2",
+ "catharsis": "^0.9.0",
+ "escape-string-regexp": "^2.0.0",
+ "js2xmlparser": "^4.0.2",
+ "klaw": "^3.0.0",
+ "markdown-it": "^14.1.0",
+ "markdown-it-anchor": "^8.6.7",
+ "marked": "^4.0.10",
+ "mkdirp": "^1.0.4",
+ "requizzle": "^0.2.3",
+ "strip-json-comments": "^3.1.0",
+ "underscore": "~1.13.2"
+ }
+ },
+ "klaw": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+ "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+ "requires": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "requires": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "long": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==",
+ "peer": true
+ },
+ "markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "requires": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ }
+ },
+ "markdown-it-anchor": {
+ "version": "8.6.7",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
+ "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
+ "requires": {}
+ },
+ "marked": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A=="
+ },
+ "mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ },
+ "minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="
+ },
+ "protobufjs": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
+ "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
+ "peer": true,
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ }
+ },
+ "protobufjs-cli": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.3.tgz",
+ "integrity": "sha512-MqD10lqF+FMsOayFiNOdOGNlXc4iKDCf0ZQPkPR+gizYh9gqUeGTWulABUCdI+N67w5RfJ6xhgX4J8pa8qmMXQ==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "escodegen": "^1.13.0",
+ "espree": "^9.0.0",
+ "estraverse": "^5.1.0",
+ "glob": "^8.0.0",
+ "jsdoc": "^4.0.0",
+ "minimist": "^1.2.0",
+ "semver": "^7.1.2",
+ "tmp": "^0.2.1",
+ "uglify-js": "^3.7.7"
+ }
+ },
+ "punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="
+ },
+ "requizzle": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+ "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
+ "requires": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
+ },
+ "uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="
+ },
+ "underscore": {
+ "version": "1.13.7",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+ "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g=="
+ },
+ "undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "peer": true
+ },
+ "word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "xmlcreate": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
+ "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg=="
+ }
+ }
+}
diff --git a/playbook/package.json b/playbook/package.json
new file mode 100644
index 0000000..1a3fdf9
--- /dev/null
+++ b/playbook/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "protobufjs-cli": "^1.1.3"
+ }
+}
diff --git a/script/20241216.xlsx b/script/20241216.xlsx
new file mode 100644
index 0000000..4d1e438
Binary files /dev/null and b/script/20241216.xlsx differ
diff --git a/script/mysql.py b/script/mysql.py
index 4e97a43..c87c411 100644
--- a/script/mysql.py
+++ b/script/mysql.py
@@ -22,15 +22,16 @@ server = SSHTunnelForwarder(
server.start()
db_host = server.local_bind_host
db_port = server.local_bind_port
-RID = 100016
-MYRID = 100002
+print(db_host, db_port)
+RID = 200090
+MYRID = 100004
conn = pymysql.connect(
host=db_host,
port=db_port,
user="root",
password="Z4rf7eZZe500dxa",
- database="Merge_Pet"
+ database="Merge_Pet_sdk"
)
cursor = conn.cursor()
cursor.execute(("select * from t_player_mod where dwUin = {rid}").format(rid = RID))
diff --git a/script/tools.ipynb b/script/tools.ipynb
index e69de29..ec4787c 100644
--- a/script/tools.ipynb
+++ b/script/tools.ipynb
@@ -0,0 +1,2392 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "34\n",
+ "33\n",
+ "[44, 45, 62, 64, 87, 108, 128, 145, 165, 183, 225, 226, 244, 246, 262, 264, 266, 267, 284, 285, 287, 289, 302, 304, 306, 521, 542, 562, 901, 923, 1001, 1024, 1044, 1044]\n",
+ "[44, 45, 62, 64, 108, 128, 145, 165, 183, 225, 226, 244, 246, 262, 264, 266, 267, 284, 285, 287, 289, 302, 304, 306, 521, 542, 562, 901, 923, 1001, 1024, 1044, 1044]\n"
+ ]
+ },
+ {
+ "ename": "",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m在当前单元格或上一个单元格中执行代码时 Kernel 崩溃。\n",
+ "\u001b[1;31m请查看单元格中的代码,以确定故障的可能原因。\n",
+ "\u001b[1;31m单击此处了解详细信息。\n",
+ "\u001b[1;31m有关更多详细信息,请查看 Jupyter log。"
+ ]
+ }
+ ],
+ "source": [
+ "str = \"\"\"0@0@1@-1:287 0@1@0@21:108 0@2@0@22:1001 0@6@0@-1:45 0@7@1@-1:226 0@8@2@-1:246 1@0@1@-1:262 1@1@0@10:562 1@2@0@-1:64 1@8@1@-1:244 2@0@1@-1:284 2@1@0@8:145 2@2@0@-1:1024 2@8@0@14:183 3@0@2@-1:302 3@1@1@-1:225 3@2@0@-1:44 3@4@0@-1:521 3@6@0@-1:62 3@7@0@11:165 3@8@1@-1:264 4@0@1@-1:289 4@1@0@18:901 4@2@0@-1:1044 4@8@1@-1:306 5@0@1@-1:304 5@1@0@-1:923 5@2@0@-1:1044 5@7@0@23:87 5@8@1@-1:285 6@0@1@-1:266 6@1@0@-1:542 6@7@0@19:128 6@8@1@-1:267\"\"\"\n",
+ "\n",
+ "str2 = \"\"\"267 289 302 287 306 246 285 266 304 262 226 264 542 145 62 225 562 244 165 284 183 901 923 128 1001 108 64 44 45 1044 521 1024 1044\"\"\"\n",
+ "\n",
+ "a1 = str.split(\" \")\n",
+ "a2 = str2.split(\" \")\n",
+ "print(len(a1))\n",
+ "print(len(a2))\n",
+ "l1 = []\n",
+ "l2 = []\n",
+ "for i in a1:\n",
+ " l1.append(int(i.split(\":\")[1]))\n",
+ "for i in a2:\n",
+ " l2.append(int(i))\n",
+ "l1.sort()\n",
+ "l2.sort()\n",
+ "print(l1)\n",
+ "print(l2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ ")VQbB(vpy=U(wcp)\n"
+ ]
+ }
+ ],
+ "source": [
+ "import random\n",
+ "import string\n",
+ "\n",
+ "def generate_random_string(length):\n",
+ " # 定义要使用的字符集\n",
+ " characters = string.ascii_letters + string.digits + string.punctuation\n",
+ " # 生成随机字符串\n",
+ " random_string = ''.join(random.choice(characters) for i in range(length))\n",
+ " return random_string\n",
+ "\n",
+ "# 示例:生成一个长度为 12 的随机字符串\n",
+ "random_string = generate_random_string(16)\n",
+ "print(random_string)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "日期时间: 2024-12-18 17:11:43\n"
+ ]
+ }
+ ],
+ "source": [
+ "from datetime import datetime\n",
+ "\n",
+ "# 示例时间戳\n",
+ "timestamp = 1734513103\n",
+ "\n",
+ "# 将时间戳转换为日期时间\n",
+ "dt_object = datetime.fromtimestamp(timestamp)\n",
+ "\n",
+ "# 打印日期时间\n",
+ "print(\"日期时间:\", dt_object)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n",
+ "Playroom = 0;\n",
+ "Piggybank = 1;\n",
+ "Charge = 2;\n",
+ "Endless = 3;\n",
+ "Levupreward = 4;\n",
+ "Handlechess = 5;\n",
+ "Handbookreward = 6;\n",
+ "Orderreward = 7;\n",
+ "Decoratecost = 8;\n",
+ "Decorateadd = 9;\n",
+ "Buychessbaggrid = 10;\n",
+ "Chessex = 11;\n",
+ "Cardcollectreward = 12;\n",
+ "Exstarreward = 13;\n",
+ "Allcollectreward = 14;\n",
+ "Guidereward = 15;\n",
+ "Dailytaskreward = 16;\n",
+ "Dailyweekreward = 17;\n",
+ "Buyenergy = 18;\n",
+ "Sevenloginreward = 19;\n",
+ "Monthloginreward = 20;\n",
+ "Fastproducereward = 21;\n",
+ "Limitsencereward = 22;\n",
+ "Mailreward = 23;\n",
+ "Freeshop = 24;\n",
+ "Chessshop = 25;\n",
+ "Refreshchessshop = 26;\n",
+ "Endlessreward = 27;\n",
+ "Piggybankreward = 28;\n",
+ "Champshipreward = 29;\n",
+ "Limiteventreward = 30;\n",
+ "Champshiprankreward = 31;\n",
+ "Invite = 32;\n",
+ "Selectlimitevent = 33;\n",
+ "Miningtake = 34;\n",
+ "Miningreward = 35;\n",
+ "Guesscolor = 36;\n",
+ "Guesscolorreward = 37;\n",
+ "Racereward = 38;\n",
+ "Playroomgame = 39;\n",
+ "Playroomdraw = 40;\n",
+ "Playroomchip = 41;\n",
+ "Playroomflip = 42;\n",
+ "Friendtreasurefilp = 43;\n",
+ "Friendtreasureend = 44;\n"
+ ]
+ }
+ ],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.13.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/source/docker-ce-26.1.4-1.el7.x86_64.rpm b/source/docker-ce-26.1.4-1.el7.x86_64.rpm
new file mode 100644
index 0000000..f6107a3
Binary files /dev/null and b/source/docker-ce-26.1.4-1.el7.x86_64.rpm differ
diff --git a/source/mysql80-community-release-el7-11.noarch.rpm b/source/mysql80-community-release-el7-11.noarch.rpm
new file mode 100644
index 0000000..842ec37
Binary files /dev/null and b/source/mysql80-community-release-el7-11.noarch.rpm differ
diff --git a/ssl/pethome.bywaystudios.com.key b/ssl/pethome.bywaystudios.com.key
new file mode 100644
index 0000000..c5bd727
--- /dev/null
+++ b/ssl/pethome.bywaystudios.com.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAo6z7cPVcCIu+rT6ywB5dhhpZfCiKQu155+XPR1kmMFwiFVQe
+XnzcT5kmdHLJVEZOgV+LM76SeiGi7haF3wH9N9uYUMmp91b4H2IAiybaKGl/Xc7M
+WWpn5YJcttCdd3ZfzYqRQoysucmi4qTzSwf3vJqijo+JFmDvolVWO0KtDsRmU6DL
+nocygaKROyyCh5HbWZnikb0bUTLYu58zhYvc1eFwrfwjRSPsGDcTbFHWCl1UNnfZ
+mWO0ydMnbfzUSQTGJmOVwqFkhMVRGFFjrTRUAeDNQpkr9YN8tGc+111Igq+uAfMc
+yrIIlfEy2ltSnu8hxjNb4sk5v9Fv7APkrjGVsQIDAQABAoIBAALK+8Fm/NDyg+iH
+fNv1YknDBYrhhpzZjSGtYYOWQr+pgTViKZOzYSKeLbKBl1J8uDzR6T/fsFBgMykJ
+flnnU6+Fa9k/dhe2RrNplzIvEaLsTFP79UjptwGK320ixl6yL04d337f6qSci07l
+wXcJMquBUf78j22WOt1gxAEGRFcccNj4yTxLOAFUqwegBy9MuH02VCW4z9QEwiWU
+MmQHbFIpHreJaIh+CaBWx9CUEzL4iCYqRnmSNgfw5AE0snvXid1tlQT4IBRvcPE4
+I2bRKUcxvckXHpVKbNPv2A43DoWjF+vlGjU6utMfZ5DRJWyn03s4HOAtrUGY48Sj
+0kNDbOECgYEAzSZYgqJuNXEzuZ9dYeXwvCdmU+krOUGaRu1gAymkRdSu+KFDxaTs
+xnbhbC0uUzSL0idqeUt3DpeV5rGJf8InbCVwTjmV8hKGS9zTMvBWAH4TavZswAJz
+/MNKXZ96UR9xRZFU4988pMF/yqliCLUgN8FI0KvAdIiMgJt4XWa0UUkCgYEAzD7s
+n9F7vo7ZHYt/L81lviw4+BBk1934LIvZsXadxmUE8S46ZgbqRZHbrErQ4GJGpCsc
+tGAsJpubDapGHv8iL5e6eUphHsM1wR18ciCSNjkxcvSiQJcCpzXLgDY8Tg7KxIOF
+c+HKH5O+awCIJcRBBZIXgTC6Gxy6IFee/GXNCSkCgYA0h4YQZSENJCBXflv97k/X
+Dcug3sqHjanAUZXNGYOLserflQNyf0l1hAkyltsOyRyoQhl8V3tzzBLBEGKhyQgp
+I+j+zrX7Vwz2LeQSXgHXfHDiaZjtDXO/nA3VrTk3vnJVmuH+uzGfCkD7lqWYjzBh
+tmc7r07HSBOZ9rU6TUsMqQKBgQCEoPPNEB4X7vDj85rCstE3vcW8qACkALrQSnwx
+dgIcO6sK5mb7q8/jH0UTy315x7dxkaFRLAZfh7oXFJP2Oty7JP7tFjSc4kx8u6X9
+AlOPrHIE4QCfirApXpBoEE/2rDpVg8ZcKqmy+aC0ISNHyvoiIOzscnTXeD8RE3Tl
+F0IeiQKBgAMSt0sbXy7jgBSUgK8GU5Ox2YcstNMJfeXu5F7WjbtuAlwMNJgBLVYd
+gM2lEE8xBUx/5wPkbvzJq4tRPzNO5T7AjOnYH1Ul2iz+kEDOZfPVL0OL/VUYFBYg
+4SZnnt1jC9aHLHVqVIIJK//9cEfOJZ6mz3DtyX2wDm/tdoFOr4cG
+-----END RSA PRIVATE KEY-----
diff --git a/ssl/pethome.bywaystudios.com.pem b/ssl/pethome.bywaystudios.com.pem
new file mode 100644
index 0000000..c703e1f
--- /dev/null
+++ b/ssl/pethome.bywaystudios.com.pem
@@ -0,0 +1,62 @@
+-----BEGIN CERTIFICATE-----
+MIIGCDCCBPCgAwIBAgIQA0IfJS+AMdxZgd8L1fUl/TANBgkqhkiG9w0BAQsFADBu
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
+RFYgVExTIENBIC0gRzIwHhcNMjQxMjA5MDAwMDAwWhcNMjUwMzA5MjM1OTU5WjAj
+MSEwHwYDVQQDExhwZXRob21lLmJ5d2F5c3R1ZGlvcy5jb20wggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCjrPtw9VwIi76tPrLAHl2GGll8KIpC7Xnn5c9H
+WSYwXCIVVB5efNxPmSZ0cslURk6BX4szvpJ6IaLuFoXfAf0325hQyan3VvgfYgCL
+JtooaX9dzsxZamflgly20J13dl/NipFCjKy5yaLipPNLB/e8mqKOj4kWYO+iVVY7
+Qq0OxGZToMuehzKBopE7LIKHkdtZmeKRvRtRMti7nzOFi9zV4XCt/CNFI+wYNxNs
+UdYKXVQ2d9mZY7TJ0ydt/NRJBMYmY5XCoWSExVEYUWOtNFQB4M1CmSv1g3y0Zz7X
+XUiCr64B8xzKsgiV8TLaW1Ke7yHGM1viyTm/0W/sA+SuMZWxAgMBAAGjggLrMIIC
+5zAfBgNVHSMEGDAWgBR435GQX+7erPbFdevVTFVT7yRKtjAdBgNVHQ4EFgQUKDRG
+tBU/MaYUiXNhjO+s2+fcgs0wIwYDVR0RBBwwGoIYcGV0aG9tZS5ieXdheXN0dWRp
+b3MuY29tMD4GA1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6
+Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
+FAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGABggrBgEFBQcBAQR0MHIwJAYIKwYBBQUH
+MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDov
+L2NhY2VydHMuZGlnaWNlcnQuY29tL0VuY3J5cHRpb25FdmVyeXdoZXJlRFZUTFND
+QS1HMi5jcnQwDAYDVR0TAQH/BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFo
+AHYATnWjJ1yaEMM4W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGTqSjTewAABAMA
+RzBFAiBZVs4LrOREOEnv8tQKb5UNFkPVfV2nNqCy24bKLAVr/gIhAMg2KsKQ9a6q
+8Wc64AKJx3DjFqLFpCytkTVKtrBp0tUzAHUAcyAiDwgWivnzxKaLCrJqmkoA7vV3
+hYoITQUA1KVCRFkAAAGTqSjTHwAABAMARjBEAiAiy4Xqcy0oqGMDDBRManyt6VmT
+jCZRVA+mHBzoQT0NAgIgOCW5513LuInmKGlKi5jxRkIM0xh6te0uIQvt4ze9EekA
+dwDm0jFjQHeMwRBBBtdxuc7B0kD2loSG+7qHMh39HjeOUAAAAZOpKNMvAAAEAwBI
+MEYCIQDFKi06ApokpmIizAxE+175uD3bIYO9P3+otQg1ZjSiUQIhAJ0SThOlYjU6
+1nvXCCVCrj96Jsb1KuKUdtPAelusunAHMA0GCSqGSIb3DQEBCwUAA4IBAQCoWphr
+4DagcE2yZJkgbhtJ05HLnFBqaQQ5+7X6SR/MRAPY65nCKzgntzXvBcpexiF04I2u
+ivtR0sH28Riuu+VDL4ltjZQsW20hd0QNeKia4caUaOaX0hEG1EO0sGLfHQI0G+oq
+jtEuSQnnzy2El3gs0kORAFqhGkL2q56rscPpandzdF1H5v2CeM54Q9EmCFzwGW7e
+NbLm7MSbn0enWs9q/Zjs6+t9n4VYFZw2c8BXDXtrim35ZcJpJZ7D91ve5SaMH5yg
+5at5un2nAdDe3D3V1aATz5ebq3M0JHoqkmPE1a3CkzMdfA8CQArmClBn8gquxm/+
+dq4rSsSh89wAz+lO
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
+MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE
+eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv
+NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch
+QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn
+NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP
+ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI
+lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf
+BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
+AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
+Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
+Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
+/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
+MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ
+L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi
+98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe
+xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN
+GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2
+n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==
+-----END CERTIFICATE-----
diff --git a/tool/Merge_Pet.sql b/tool/Merge_Pet.sql
new file mode 100644
index 0000000..8486e71
--- /dev/null
+++ b/tool/Merge_Pet.sql
@@ -0,0 +1,226 @@
+/*==============================================================*/
+/* Database name: sg_gamedb */
+/* DBMS name: MySQL 5.5.17 */
+/* Created on: 2014-10-16 10:00:00 */
+/*==============================================================*/
+
+create database if not exists %database% CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+use %database%;
+
+-- ----------------------------
+-- Table structure for db_version 版本号,每次更新数据库要改这个地方
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `db_version` (
+ `version_2018_02_06_13` int unsigned NOT NULL COMMENT 'version'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库版本号';
+
+/*==============================================================*/
+/* Table: t_account 账号表 */
+/*==============================================================*/
+CREATE TABLE IF NOT EXISTS t_account
+(
+ `user_name` varchar(50) NOT NULL,
+ `user_password` varchar(128) NOT NULL,
+ `login_time` int unsigned DEFAULT '0' COMMENT '上次登录时间',
+ `logout_time` int unsigned DEFAULT '0' COMMENT '上次下线时间',
+ `ip_address` char(24) DEFAULT '' COMMENT '上次登录的ip地址',
+ `gm_level` int DEFAULT '0' COMMENT 'gm等级',
+ `platform` varchar(50) DEFAULT '' COMMENT '平台',
+ `is_online` int unsigned DEFAULT '0' COMMENT '角色是否在线',
+ `channel` varchar(50) DEFAULT '' COMMENT '渠道号',
+ `device_id` varchar(256) DEFAULT '' COMMENT '是否为刷榜账号',
+ `auto_id` bigint NOT NULL auto_increment COMMENT '自增id',
+ PRIMARY KEY (`auto_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='账号密码对照表';
+
+/*==============================================================*/
+/* Table: t_gameserver GameServer表 */
+/*==============================================================*/
+CREATE TABLE IF NOT EXISTS t_gameserver
+(
+ `id` int unsigned COMMENT '服务器id',
+ `start_time` int unsigned COMMENT '开服时间',
+ `close_time` int unsigned COMMENT '关服时间',
+ `is_close` int unsigned COMMENT '是否关服',
+ primary key(`id`)
+) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='服务器设置';
+
+
+/*==============================================================*/
+/* Table: t_gameserver_info GameServer信息表 */
+/*==============================================================*/
+CREATE TABLE IF NOT EXISTS t_gameserver_info
+(
+ `id` int unsigned COMMENT '服务器id',
+ `growthfund_buynum` int unsigned NOT NULL DEFAULT '0' COMMENT '全服购买成长基金数量',
+ `open_servertime` int unsigned NOT NULL DEFAULT '0' COMMENT '开服时间',
+ `open_activeflag` int unsigned NOT NULL DEFAULT '0' COMMENT '开服活动完成发放奖励标示',
+ `DailyRenewTime` int unsigned NOT NULL DEFAULT '0' COMMENT '日常刷新时间',
+ primary key(`id`)
+) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='全服全局数据';
+
+
+
+
+
+-- ----------------------------
+-- Table structure for t_player_baseinfo
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `t_player_baseinfo` (
+ `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin',
+ `energy` int unsigned NOT NULL DEFAULT '0' COMMENT '能量',
+ `star` int unsigned NOT NULL DEFAULT '0' COMMENT '星星',
+ `recover_time` int unsigned NOT NULL DEFAULT '0' COMMENT '能量开始恢复时间',
+ `diamond` int unsigned NOT NULL DEFAULT '1' COMMENT '钻石',
+ `level` int unsigned NOT NULL DEFAULT '0' COMMENT '玩家等级',
+ `exp` int unsigned zerofill NOT NULL DEFAULT '0' COMMENT '玩家经验',
+ `start_order_id` varchar(50) DEFAULT NULL COMMENT '配置订单进度',
+ `music_code` int unsigned NOT NULL DEFAULT '0' COMMENT '音效状态码改为GUID免费改名状态',
+ `guild` int unsigned NOT NULL DEFAULT '0' COMMENT '引导进度 ',
+ `pack_unlock_count` int unsigned NOT NULL DEFAULT '0' COMMENT '背包解锁数量',
+ `last_play_time` int NOT NULL DEFAULT '0' COMMENT '广告能量购买时间',
+ `EnergyBuyCount` int NOT NULL DEFAULT '0' COMMENT '能量购买次数',
+ `user_name` varchar(50) NOT NULL COMMENT '玩家账号',
+ `login_time` int unsigned NOT NULL DEFAULT '0' COMMENT '上次登录时间',
+ `logout_time` int unsigned NOT NULL DEFAULT '0' COMMENT '上次下线时间',
+ `todayolinetime` int unsigned NOT NULL DEFAULT '0' COMMENT '当天的累计在线时间',
+ `rolecreatetime` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间',
+ `EmitOrderCnt` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间',
+ `DailyRenewTime` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间',
+ `NoAd` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间',
+ `ChampshipsGroupID` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间',
+ `LastChampGroupID` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间',
+ `FaceBookId` varchar(128) DEFAULT '' COMMENT '玩家账号',
+ PRIMARY KEY (`dwUin`),
+ KEY `user_name` (`user_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储玩家基本信息';
+
+-- ----------------------------
+-- Table: t_player_auto_pup 客户端数据持久化表
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `t_player_auto_pup` (
+ `dwUin` int unsigned NOT NULL COMMENT 'uid',
+ `ReqKeys` varchar(2048) DEFAULT '' COMMENT 'key',
+ `ReqVals` varchar(2048) DEFAULT '' COMMENT 'value',
+ PRIMARY KEY (`dwUin`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储玩家基本信息';
+
+
+
+/*==============================================================*/
+/* Table: t_player_data 玩家模块表 */
+/*==============================================================*/
+CREATE TABLE IF NOT EXISTS t_player_mod
+(
+ `dwUin` int unsigned COMMENT '玩家uid',
+ `mData` blob DEFAULT NULL COMMENT '数据',
+ `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
+ primary key(`dwUin`)
+) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='玩家模块表';
+
+
+
+
+/*==============================================================*/
+/* Table: t_player_data 玩家订单表 */
+/*==============================================================*/
+CREATE TABLE IF NOT EXISTS t_player_charge
+(
+ `id`int unsigned AUTO_INCREMENT COMMENT '订单id',
+ `Uid` int unsigned NOT NULL COMMENT '玩家id',
+ `OrderId` varchar(128) DEFAULT '' COMMENT '订单号',
+ `ProductId` int unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
+ `ProductName` varchar(128) DEFAULT '' COMMENT '商品名称',
+ `ProductDesc` varchar(128) DEFAULT '' COMMENT '商品描述',
+ `Price` float NOT NULL DEFAULT '0' COMMENT '价格',
+ `Currency` varchar(128) DEFAULT '' COMMENT '货币',
+ `CreateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
+ `PayTime` int unsigned NOT NULL DEFAULT '0' COMMENT '支付时间',
+ `PayStatus` int unsigned NOT NULL DEFAULT '0' COMMENT '支付状态 0 未支付 1 已支付 2 支付失败 3 已发货',
+ `PayType` int unsigned NOT NULL DEFAULT '0' COMMENT '支付类型',
+ `PayPlatform` varchar(128) DEFAULT '' COMMENT '支付平台',
+ `PayChannel` varchar(128) DEFAULT '' COMMENT '支付渠道',
+ `PayChannelOrderId` varchar(128) DEFAULT '' COMMENT '支付渠道订单号',
+ `PayChannelUserId` varchar(128) DEFAULT '' COMMENT '支付渠道用户id',
+ `PayChannelExtra` varchar(128) DEFAULT '' COMMENT '支付渠道额外信息',
+ primary key(`id`)
+) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='玩家订单表';
+
+
+
+-- ----------------------------
+-- Table structure for system_mail_info
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `system_mail_info` (
+ `mail_id` bigint NOT NULL AUTO_INCREMENT COMMENT '邮件ID',
+ `title` varchar(128) DEFAULT "" COMMENT '邮件标题',
+ `content` varchar(2048) DEFAULT "" COMMENT '邮件内容',
+ `items` varchar(2048) DEFAULT "{}" COMMENT '邮件附件',
+ `start_time` int unsigned NOT NULL DEFAULT '0' COMMENT '开始时间',
+ `register_time` int unsigned NOT NULL DEFAULT '0' COMMENT '注册时间',
+ `end_time` int unsigned NOT NULL DEFAULT '0' COMMENT '结束时间',
+ `mail_type` int unsigned NOT NULL DEFAULT '0' COMMENT '邮件类型',
+ `to_uids` varchar(2048) DEFAULT "" COMMENT '发送者ID',
+ PRIMARY KEY (`mail_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统邮件';
+
+
+-- ----------------------------
+-- Table structure for t_player_daily_task_data
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `t_server_global_data` (
+ `Id` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin',
+ `StartMileStoneSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '里程碑时间',
+ `StartChampshipsSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛时间',
+ `InsertChampshipsSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '每半小时插入玩家排行锦标赛时间',
+ `WaitToRank` text COMMENT '排名数据',
+ `Limit4CardExclude` text COMMENT '排名数据',
+ `Limit5CardExclude` text COMMENT '排名数据',
+ `CurChampshipsId` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛全局Id',
+ `LastChampshipsId` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛全局Id',
+ `Limit4Card` int unsigned NOT NULL DEFAULT '0' COMMENT '限时4星金卡ID',
+ `Limit5Card` int unsigned NOT NULL DEFAULT '0' COMMENT '限时5星金卡ID',
+ `LimitCardSwapTime` int unsigned NOT NULL DEFAULT '0' COMMENT '限时5星金卡ID',
+ `OpenSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛全局Id',
+ PRIMARY KEY (`Id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储玩家基本信息';
+
+
+/*==============================================================*/
+/* Table: t_player_data 系统模块表 */
+/*==============================================================*/
+CREATE TABLE IF NOT EXISTS t_server_mod
+(
+ `id` int NOT NULL AUTO_INCREMENT primary key,
+ `key` varchar(128) DEFAULT '' COMMENT '模块key',
+ `mData` mediumblob DEFAULT NULL COMMENT '数据',
+ `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间'
+) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='系统模块表';
+
+
+CREATE TABLE IF NOT EXISTS `t_log_login` (
+ `id` int NOT NULL AUTO_INCREMENT primary key,
+ `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin',
+ `type` int unsigned NOT NULL DEFAULT '0' COMMENT '日志类型',
+ `event` varchar(512) DEFAULT '' COMMENT '事件名',
+ `timestamp` int DEFAULT 0 COMMENT '时间错',
+ KEY (`dwUin`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家日志';
+
+CREATE TABLE IF NOT EXISTS `t_log_evnet` (
+ `id` int NOT NULL AUTO_INCREMENT primary key,
+ `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin',
+ `type` int unsigned NOT NULL DEFAULT '0' COMMENT '日志类型',
+ `event` varchar(512) DEFAULT '' COMMENT '事件名',
+ `param` varchar(512) DEFAULT '' COMMENT '参数',
+ `timestamp` int DEFAULT 0 COMMENT '时间错',
+ KEY (`dwUin`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家日志';
+
+CREATE TABLE IF NOT EXISTS `t_log_item` (
+ `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin',
+ `type` int unsigned NOT NULL DEFAULT '0' COMMENT '日志类型',
+ `event` varchar(512) DEFAULT '' COMMENT '事件名',
+ `timestamp` int DEFAULT 0 COMMENT '时间错',
+ KEY (`dwUin`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家日志';
\ No newline at end of file
diff --git a/tool/app.ini b/tool/app.ini
new file mode 100644
index 0000000..a7fa368
--- /dev/null
+++ b/tool/app.ini
@@ -0,0 +1,31 @@
+[app]
+app_name = pet_home
+app_id = 1001
+app_path = /data/pet_home_devops/Goleaf
+conf_path = /etc/pet_home
+[server]
+tcp_addr = 3600
+ws_addr = 3700
+listen_addr = 3800
+max_conn = 1000
+remote = pethome.bywaystudios.com
+
+[mysql]
+mysql_user = root
+mysql_password = root
+mysql_host = 172.20.0.5
+mysql_port = 3306
+
+[redis]
+redis_host = 172.20.0.6
+redis_port = 6379
+
+[cluster]
+center_id = 0
+center_host = pethome.bywaystudios.com
+center_port = 3800
+
+[log]
+log_level = debug
+te_log_path = /var/log/pet_home/te
+
diff --git a/tool/go.mod b/tool/go.mod
new file mode 100644
index 0000000..6304db1
--- /dev/null
+++ b/tool/go.mod
@@ -0,0 +1,7 @@
+module tool
+
+go 1.23.1
+
+require gopkg.in/ini.v1 v1.67.0
+
+require github.com/stretchr/testify v1.10.0 // indirect
diff --git a/tool/go.sum b/tool/go.sum
new file mode 100644
index 0000000..be248fb
--- /dev/null
+++ b/tool/go.sum
@@ -0,0 +1,10 @@
+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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/tool/main.go b/tool/main.go
new file mode 100644
index 0000000..a725525
--- /dev/null
+++ b/tool/main.go
@@ -0,0 +1,393 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "syscall"
+ "time"
+
+ "gopkg.in/ini.v1"
+)
+
+// GOOS=linux GOARCH=amd64 go build -o /data/pet_home_devops/Goleaf/tool/tool main.go
+var help = `
+Usage: app.ini [options]
+
+start start the server
+stop stop the server
+restart restart the server
+status get the server status
+
+`
+var cfg *ini.File
+var FuncMap map[string]func() error
+var dirPath string
+var app_path string
+
+func main() {
+ FuncMap = make(map[string]func() error)
+ // 检查是否提供了命令行参数
+ if len(os.Args) < 2 {
+ log.Fatal(help)
+ }
+ var err error
+
+ // 获取当前文件的绝对路径
+ execPath, err := os.Executable()
+ if err != nil {
+ log.Fatal(err)
+ }
+ absPath, err := filepath.Abs(execPath)
+ if err != nil {
+ log.Fatal(err)
+ }
+ // 获取当前文件的绝对路径的文件夹路径
+ dirPath = filepath.Dir(absPath)
+
+ // 加载 app.ini 文件
+ cfg, err = ini.Load(dirPath + "/app.ini")
+ if err != nil {
+ log.Fatal(err)
+ }
+ app_path = cfg.Section("app").Key("app_path").String()
+ register("start", start)
+ register("stop", stop)
+ register("install", install)
+ register("status", status)
+ register("restart", restart)
+ funcName := os.Args[1]
+ if f, ok := FuncMap[funcName]; ok {
+ e := f()
+ if e != nil {
+ log.Fatal(e)
+ }
+ } else {
+ log.Fatal(help)
+ }
+}
+
+func register(name string, f func() error) {
+ FuncMap[name] = f
+}
+
+func install() error {
+ fmt.Println("install")
+ if len(os.Args) < 4 {
+ log.Fatal("请输入要安装的服务类型和区号 install [center|node] 区号")
+ }
+ serverType := os.Args[2]
+ zone := os.Args[3]
+ if serverType != "center" && serverType != "node" {
+ log.Fatal("请输入正确的服务类型 center|node")
+ }
+ AppName := cfg.Section("app").Key("app_name").String()
+ // 生成服务名
+ serviceName := fmt.Sprintf("%s_%s_%s", AppName, serverType, zone)
+ // 判断文件夹是否存在
+ folderPath := fmt.Sprintf("%s/zone/%s", app_path, serviceName)
+ if _, err := os.Stat(folderPath); os.IsNotExist(err) {
+ err := os.MkdirAll(folderPath, os.ModePerm)
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Printf("文件夹 %s 创建成功\n", folderPath)
+ } else {
+ fmt.Printf("文件夹 %s 已存在\n", folderPath)
+ }
+
+ // 生成配置文件
+ configPath := fmt.Sprintf("%s/server.json", folderPath)
+ file, err := os.Create(configPath)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer file.Close()
+ zoneId, _ := strconv.Atoi(zone)
+ cf, confs := createConfigFile(zoneId, serverType)
+ file.WriteString(confs)
+
+ // 读取 SQL 文件内容并替换 %database% 字符串
+ sqlFilePath := fmt.Sprintf("%s/tool/Merge_Pet.sql", app_path)
+ sqlContent, err := os.ReadFile(sqlFilePath)
+ if err != nil {
+ log.Fatal(err)
+ }
+ dbName := cf["DbName"].(string)
+ modifiedSQL := strings.ReplaceAll(string(sqlContent), "%database%", dbName)
+
+ // 将修改后的内容写入临时文件
+ tempSQLFile, err := os.CreateTemp("", "modified_*.sql")
+ if err != nil {
+ log.Fatal(err)
+ }
+ // defer os.Remove(tempSQLFile.Name())
+ _, err = tempSQLFile.WriteString(modifiedSQL)
+ if err != nil {
+ log.Fatal(err)
+ }
+ tempSQLFile.Close()
+
+ // 创建数据库
+ dbUser := cfg.Section("mysql").Key("mysql_user").String()
+ dbPassword := cfg.Section("mysql").Key("mysql_password").String()
+ dbHost := cfg.Section("mysql").Key("mysql_host").String()
+ dbPort := cfg.Section("mysql").Key("mysql_port").String()
+ fmt.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, "-e", fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName))
+ createDBCmd := exec.Command("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, "-e", fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName))
+ createDBCmd.Stdout = os.Stdout
+ createDBCmd.Stderr = os.Stderr
+
+ err = createDBCmd.Run()
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, dbName, "-e", fmt.Sprintf("source %s", tempSQLFile.Name()))
+ // 执行修改后的 SQL 文件
+ cmd := exec.Command("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, dbName, "-e", fmt.Sprintf("source %s", tempSQLFile.Name()))
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+
+ err = cmd.Run()
+ if err != nil {
+ log.Fatal(err)
+ }
+ cmd = exec.Command("mkdir", cf["LogPath"].(string))
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ err = cmd.Run()
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Printf("SQL 文件 %s 执行成功\n", sqlFilePath)
+ fmt.Printf("配置文件 %s 创建成功\n", configPath)
+ return nil
+}
+
+func createConfigFile(Id int, Type string) (map[string]interface{}, string) {
+ conf := make(map[string]interface{})
+ conf["LogLevel"] = cfg.Section("log").Key("log_level").String()
+
+ TcpStartAddr, _ := cfg.Section("server").Key("tcp_addr").Int()
+ conf["TcpAddr"] = fmt.Sprintf(":%d", TcpStartAddr+Id)
+
+ WsStartAddr, _ := cfg.Section("server").Key("ws_addr").Int()
+ conf["WsAddr"] = fmt.Sprintf(":%d", WsStartAddr+Id)
+
+ ListenAddr, _ := cfg.Section("server").Key("listen_addr").Int()
+
+ conf["MySqlAddr"] = cfg.Section("mysql").Key("mysql_host").String()
+ conf["MySqlUsr"] = cfg.Section("mysql").Key("mysql_user").String()
+ conf["MySqlPwd"] = cfg.Section("mysql").Key("mysql_password").String()
+ conf["MySqlPort"] = cfg.Section("mysql").Key("mysql_port").String()
+ MaxConnNum, _ := cfg.Section("server").Key("max_conn").Int()
+ conf["MaxConnNum"] = MaxConnNum
+ app_name := cfg.Section("app").Key("app_name").String()
+ conf["LogPath"] = fmt.Sprintf("%s/zone/%s_%s_%d/log/", app_path, app_name, Type, Id)
+ conf["DbName"] = fmt.Sprintf("%s_%d", app_name, Id)
+
+ conf["TELOGDIR"] = cfg.Section("log").Key("te_log_path").String()
+
+ conf["GameName"] = app_name
+ AppId, _ := cfg.Section("app").Key("app_id").Int()
+ conf["GameId"] = AppId
+
+ conf["ServerType"] = Type
+ conf["ServerID"] = Id
+
+ conf["ServerOpenTime"] = "2028-01-01 00:00:00"
+ conf["ServerName"] = fmt.Sprintf("%s_%d", app_name, Id)
+ conf["ServerStatus"] = 1
+ CenterId, _ := cfg.Section("app").Key("center_id").Int()
+ conf["ServerCenter"] = CenterId
+
+ conf["RedisAddr"] = cfg.Section("redis").Key("redis_host").String()
+ conf["RedisPort"] = cfg.Section("redis").Key("redis_port").String()
+ conf["GameConfPath"] = app_path + "/config/"
+ conf["RemoteAddr"] = fmt.Sprintf("%s:%d", cfg.Section("server").Key("remote").String(), ListenAddr+Id) // 服务器地址
+ conf["ListenAddr"] = fmt.Sprintf(":%d", ListenAddr+Id)
+ conf["CenterAddr"] = fmt.Sprintf("%s:%s", cfg.Section("cluster").Key("center_host").String(), cfg.Section("cluster").Key("center_port").String()) // 服务器地址
+ b, _ := json.MarshalIndent(conf, "", " ")
+ return conf, string(b)
+}
+
+func start() error {
+ fmt.Println("start")
+ err := status()
+ if err == nil {
+ return err
+ }
+ NodeType := os.Args[2]
+ Zone := os.Args[3]
+ // 示例命令
+ app_name := cfg.Section("app").Key("app_name").String()
+
+ cmdName := app_path + "/main"
+ cmdArgs := []string{fmt.Sprintf("%s/zone/%s_%s_%s/server.json", app_path, app_name, NodeType, Zone)}
+
+ // 创建命令
+ cmd := exec.Command(cmdName, cmdArgs...)
+ cmd.SysProcAttr = &syscall.SysProcAttr{}
+ // 创建管道
+ stdin, err := cmd.StdinPipe()
+ if err != nil {
+ log.Fatal(err)
+ }
+ cmd.Env = os.Environ()
+ // 打开输出文件
+ outfile, err := os.OpenFile(fmt.Sprintf("%s/zone/%s_%s_%s/output.log", app_path, app_name, NodeType, Zone), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer outfile.Close()
+
+ // 重定向标准输出和标准错误到文件
+ cmd.Stdout = outfile
+ cmd.Stderr = outfile
+ err = cmd.Start()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // 打印进程号
+ fmt.Printf("进程 %d 已启动\n", cmd.Process.Pid)
+
+ // 发送命令到子进程
+ go func() {
+ time.Sleep(2 * time.Second) // 等待子进程启动
+ _, err := stdin.Write([]byte("your_command\n"))
+ if err != nil {
+ log.Fatal(err)
+ }
+ stdin.Close()
+ }()
+
+ // 释放与子进程相关的资源
+ err = cmd.Process.Release()
+ if err != nil {
+ log.Fatal(err)
+ }
+ return nil
+}
+
+func stop() error {
+ fmt.Println("stop")
+ err := status()
+ if err != nil {
+ return err
+ }
+ NodeType := os.Args[2]
+ Zone := os.Args[3]
+ // 示例命令
+ app_name := cfg.Section("app").Key("app_name").String()
+ processName := fmt.Sprintf("%s/zone/%s_%s_%s/server.json", app_path, app_name, NodeType, Zone)
+ // 示例进程名称
+
+ // 获取进程号
+ pid, err := getPidByArgs(processName)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // 查找进程
+ process, err := os.FindProcess(pid)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // 关闭进程
+ err = process.Kill()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // // 等待子进程退出
+ // _, err = process.Wait()
+ // if err != nil {
+ // log.Fatal(err)
+ // }
+
+ fmt.Printf("进程 %d 已关闭\n", pid)
+ return nil
+}
+
+// func getPidByName(name string) (int, error) {
+// cmd := exec.Command("pgrep", name)
+// output, err := cmd.Output()
+// if err != nil {
+// return 0, err
+// }
+
+// // 解析输出,获取第一个匹配的进程号
+// outputStr := strings.TrimSpace(string(output))
+// pidStr := strings.Split(outputStr, "\n")[0]
+// pid, err := strconv.Atoi(pidStr)
+// if err != nil {
+// return 0, err
+// }
+
+// return pid, nil
+// }
+
+func getPidByArgs(args string) (int, error) {
+ cmd := exec.Command("pgrep", "-f", args)
+ output, err := cmd.Output()
+ if err != nil {
+ return 0, err
+ }
+
+ // 解析输出,获取第一个匹配的进程号
+ outputStr := strings.TrimSpace(string(output))
+ pidStr := strings.Split(outputStr, "\n")[0]
+ pid, err := strconv.Atoi(pidStr)
+ if err != nil {
+ return 0, err
+ }
+
+ return pid, nil
+}
+
+func status() error {
+ NodeType := os.Args[2]
+ Zone := os.Args[3]
+ // 示例命令
+ app_name := cfg.Section("app").Key("app_name").String()
+ processName := fmt.Sprintf("%s/zone/%s_%s_%s/server.json", app_path, app_name, NodeType, Zone)
+ // 示例进程名称
+
+ // 获取进程号
+ pid, err := getPidByArgs(processName)
+ if err != nil {
+ return fmt.Errorf("进程 %s_%s 未启动", NodeType, Zone)
+ }
+
+ // 查找进程
+ _, err = os.FindProcess(pid)
+ if err != nil {
+ return fmt.Errorf("进程 %s_%s 未启动", NodeType, Zone)
+ }
+
+ fmt.Printf("节点 %s_%s 启动中, 进程号 %d\n", NodeType, Zone, pid)
+ return nil
+}
+
+func restart() error {
+ fmt.Println("restart")
+ err := stop()
+ if err != nil {
+ return err
+ }
+ for status() == nil {
+ time.Sleep(1 * time.Second)
+ }
+ err = start()
+ if err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/tool/tool b/tool/tool
new file mode 100644
index 0000000..ad1a5ad
Binary files /dev/null and b/tool/tool differ
diff --git a/tool/tool.py b/tool/tool.py
new file mode 100644
index 0000000..22e9b20
--- /dev/null
+++ b/tool/tool.py
@@ -0,0 +1,102 @@
+import os
+import sys
+import subprocess
+import configparser
+
+help_message = """
+Usage: app.ini [options]
+
+start start the server
+stop stop the server
+restart restart the server
+status get the server status
+"""
+
+cfg = None
+FuncMap = {}
+dir_path = ""
+app_path = ""
+
+def main():
+ global cfg, dir_path, app_path
+
+ if len(sys.argv) < 2:
+ print(help_message)
+ sys.exit(1)
+
+ # 获取当前文件的绝对路径
+ exec_path = os.path.abspath(sys.argv[0])
+ dir_path = os.path.dirname(exec_path)
+ # print(f"当前文件的绝对路径的文件夹路径: {dir_path}")
+
+ # 加载 app.ini 文件
+ cfg = configparser.ConfigParser()
+ cfg.read(os.path.join(dir_path, "app.ini"))
+ app_path = cfg.get("app", "app_path")
+
+ register("start", start)
+ register("stop", stop)
+
+ func_name = sys.argv[1]
+ if func_name in FuncMap:
+ FuncMap[func_name]()
+ else:
+ print(help_message)
+ sys.exit(1)
+
+def register(name, func):
+ FuncMap[name] = func
+
+def start():
+ print("start")
+ NodeType = sys.argv[2]
+ Zone = sys.argv[3]
+ app_name = cfg.get("app", "app_name")
+
+ cmd_name = app_path + "/main"
+ cmd_args = [f"{app_path}/zone/{app_name}_{NodeType}_{Zone}/server.json"]
+
+ # 创建命令
+ cmd = [cmd_name] + cmd_args
+ print(cmd)
+
+ # 启动命令
+ process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, start_new_session=True)
+ print(f"p {process.pid} s")
+
+ # 获取命令输出
+ stdout, stderr = process.communicate()
+ print("e:", stdout.decode('utf-8', errors='ignore'))
+ print("e2:", stderr.decode('utf-8', errors='ignore'))
+
+def stop():
+ print("stop")
+ NodeType = sys.argv[2]
+ Zone = sys.argv[3]
+ app_name = cfg.get("app", "app_name")
+ process_args = f"{app_path}/zone/{app_name}_{NodeType}_{Zone}/server.json"
+
+ # 获取进程号
+ pid = get_pid_by_args(process_args)
+ if pid is None:
+ print("未找到进程")
+ sys.exit(1)
+
+ # 关闭进程
+ try:
+ os.kill(pid, 9)
+ print(f"进程 {pid} 已关闭")
+ except OSError as e:
+ print(f"关闭进程失败: {e}")
+ sys.exit(1)
+
+def get_pid_by_args(args):
+ try:
+ output = subprocess.check_output(["pgrep", "-f", args])
+ pid_str = output.decode().strip().split("\n")[0]
+ return int(pid_str)
+ except subprocess.CalledProcessError:
+ return None
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file