├── .github └── workflows │ ├── go.yml │ └── golangci-lint.yml ├── .gitignore ├── LICENSE ├── README.md ├── bcrypt.go ├── bcrypt_test.go ├── cryptsha.go ├── cryptsha_test.go ├── go.mod ├── go.sum ├── htgroup.go ├── htgroup_test.go ├── htpasswd.go ├── htpasswd_test.go ├── md5.go ├── md5_test.go ├── plain.go ├── plain_test.go ├── sha.go ├── sha_test.go ├── ssha.go ├── ssha_test.go ├── util.go └── util_test.go /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: Go 2 | on: 3 | push: 4 | branches: [ master ] 5 | pull_request: 6 | branches: [ master ] 7 | jobs: 8 | 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | with: 14 | fetch-depth: 0 15 | 16 | - name: Set up Go 17 | uses: actions/setup-go@v3 18 | with: 19 | go-version: ^1.20 20 | cache: true 21 | 22 | - name: test 23 | run: go test -race -coverprofile=profile.cov -v 24 | 25 | - name: Send coverage 26 | uses: shogo82148/actions-goveralls@v1 27 | with: 28 | path-to-profile: profile.cov 29 | parallel: true 30 | 31 | # notifies that all test jobs are finished. 32 | finish: 33 | needs: build 34 | runs-on: ubuntu-latest 35 | steps: 36 | - uses: shogo82148/actions-goveralls@v1 37 | with: 38 | parallel-finished: true 39 | -------------------------------------------------------------------------------- /.github/workflows/golangci-lint.yml: -------------------------------------------------------------------------------- 1 | name: golangci-lint 2 | on: 3 | push: 4 | tags: 5 | - v* 6 | branches: 7 | - master 8 | pull_request: 9 | permissions: 10 | contents: read 11 | # Optional: allow read access to pull request. Use with `only-new-issues` option. 12 | # pull-requests: read 13 | jobs: 14 | golangci: 15 | name: lint 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Check out code into the Go module directory 19 | uses: actions/checkout@v3 20 | with: 21 | fetch-depth: 0 22 | 23 | - name: Set up Go 1.x 24 | uses: actions/setup-go@v3 25 | with: 26 | go-version: ^1.20 27 | cache: true 28 | 29 | - name: golangci-lint 30 | uses: golangci/golangci-lint-action@v3 31 | with: 32 | args: -E gofmt 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files, Static and Dynamic libs (Shared Objects) 2 | *.o 3 | *.a 4 | *.so 5 | 6 | # Folders 7 | _obj 8 | _test 9 | 10 | # Architecture specific extensions/prefixes 11 | *.[568vq] 12 | [568vq].out 13 | 14 | *.cgo1.go 15 | *.cgo2.c 16 | _cgo_defun.c 17 | _cgo_gotypes.go 18 | _cgo_export.* 19 | 20 | _testmain.go 21 | 22 | *.exe 23 | *.test 24 | *.prof 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 tgic 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # htpasswd for Go 2 | 3 | ![](https://github.com/tg123/go-htpasswd/workflows/Go/badge.svg) 4 | [![Go Doc](https://godoc.org/github.com/tg123/go-htpasswd?status.svg)](https://godoc.org/github.com/tg123/go-htpasswd) 5 | [![Go Report Card](https://goreportcard.com/badge/github.com/tg123/go-htpasswd)](https://goreportcard.com/report/github.com/tg123/go-htpasswd) 6 | 7 | 8 | This is a libary to validate user credentials against an HTTPasswd file. 9 | 10 | This was forked from 11 | with modifications by @brian-avery to support SSHA, Md5Crypt, and Bcrypt and @jespersoderlund to support Crypt with SHA-256 and SHA-512 support. 12 | 13 | ## Currently, this supports: 14 | * SSHA 15 | * MD5Crypt 16 | * APR1Crypt 17 | * SHA 18 | * Bcrypt 19 | * Plain text 20 | * Crypt with SHA-256 and SHA-512 21 | -------------------------------------------------------------------------------- /bcrypt.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | 7 | "golang.org/x/crypto/bcrypt" 8 | ) 9 | 10 | type bcryptPassword struct { 11 | hashed []byte 12 | } 13 | 14 | // AcceptBcrypt accepts any valid password encoded using bcrypt. 15 | func AcceptBcrypt(src string) (EncodedPasswd, error) { 16 | if !strings.HasPrefix(src, "$2y$") && !strings.HasPrefix(src, "$2a$") && !strings.HasPrefix(src, "$2b$") && !strings.HasPrefix(src, "$2x$") { 17 | return nil, nil 18 | } 19 | 20 | return &bcryptPassword{hashed: []byte(src)}, nil 21 | } 22 | 23 | // RejectBcrypt rejects any password encoded using bcrypt. 24 | func RejectBcrypt(src string) (EncodedPasswd, error) { 25 | if strings.HasPrefix(src, "$2y$") || strings.HasPrefix(src, "$2a$") || strings.HasPrefix(src, "$2b$") || strings.HasPrefix(src, "$2x$") { 26 | return nil, fmt.Errorf("bcrypt passwords are not accepted: %s", src) 27 | } 28 | 29 | return nil, nil 30 | } 31 | 32 | func (b *bcryptPassword) MatchesPassword(password string) bool { 33 | if err := bcrypt.CompareHashAndPassword(b.hashed, []byte(password)); err != nil { 34 | return false 35 | } 36 | return true 37 | } 38 | -------------------------------------------------------------------------------- /bcrypt_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func Test_Bcrypt(t *testing.T) { 8 | testParserGood(t, "bcrypt", AcceptBcrypt, nil, "$2y$05$bWBMg3oUStnhfy5rFvoyreviPySU6hvEmBub5wIlM/D.c5FeYJQ6O", "bar") 9 | testParserGood(t, "bcrypt", AcceptBcrypt, nil, "$2b$08$hQbZuw.cHsECArUAP9mOjehaJxTG9NMJfioQIHcbC0YyXpVybhoQa", "bar") 10 | testParserGood(t, "bcrypt", AcceptBcrypt, nil, "$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e", "\xff\xff\xa3") 11 | testParserBad(t, "bcrypt", nil, RejectBcrypt, "$2y$0") 12 | testParserNot(t, "bcrypt", nil, RejectBcrypt, "plaintext") 13 | } 14 | -------------------------------------------------------------------------------- /cryptsha.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | 7 | "github.com/GehirnInc/crypt" 8 | _ "github.com/GehirnInc/crypt/sha256_crypt" 9 | _ "github.com/GehirnInc/crypt/sha512_crypt" 10 | ) 11 | 12 | type cryptPassword struct { 13 | prefix string 14 | rounds string 15 | salt string 16 | hashed string 17 | } 18 | 19 | // Prefixes 20 | const PrefixCryptSha256 = "$5$" 21 | const PrefixCryptSha512 = "$6$" 22 | const Separator = "$" 23 | 24 | // Accepts valid passwords 25 | func AcceptCryptSha(src string) (EncodedPasswd, error) { 26 | if !strings.HasPrefix(src, PrefixCryptSha256) && !strings.HasPrefix(src, PrefixCryptSha512) { 27 | return nil, nil 28 | } 29 | 30 | prefix := PrefixCryptSha512 31 | if strings.HasPrefix(src, PrefixCryptSha256) { 32 | prefix = PrefixCryptSha256 33 | } 34 | 35 | rest := strings.TrimPrefix(src, prefix) 36 | mparts := strings.SplitN(rest, "$", 3) 37 | if len(mparts) < 2 { 38 | return nil, fmt.Errorf("malformed crypt-SHA password: %s", src) 39 | } 40 | 41 | var rounds, salt, hashed string 42 | // Do we have a "rounds-component" 43 | if len(mparts) == 3 { 44 | rounds, salt, hashed = mparts[0], mparts[1], mparts[2] 45 | } else { 46 | salt, hashed = mparts[0], mparts[1] 47 | } 48 | 49 | if len(salt) > 16 { 50 | salt = salt[0:16] 51 | } 52 | return &cryptPassword{prefix, rounds, salt, hashed}, nil 53 | } 54 | 55 | // PK04832_45b047bab2bf:$6$rounds=5000$e4fb4910470fd97e$afWSvXIlcC4KnENaYStPG/ELJ.uBAnG7r/rFz8fkNwpkU.salSCchDjtxyh.qA.fftcd5hmIcem7A4oA76HCE0 56 | 57 | // RejectCryptSha known indexes 58 | func RejectCryptSha(src string) (EncodedPasswd, error) { 59 | if !strings.HasPrefix(src, PrefixCryptSha512) && !strings.HasPrefix(src, PrefixCryptSha256) { 60 | return nil, nil 61 | } 62 | return nil, fmt.Errorf("crypt-sha password rejected: %s", src) 63 | } 64 | 65 | func shaCrypt(password string, rounds string, salt string, prefix string) string { 66 | 67 | var ret string 68 | var sb strings.Builder 69 | sb.WriteString(prefix) 70 | if len(rounds) > 0 { 71 | sb.WriteString(rounds) 72 | sb.WriteString(Separator) 73 | } 74 | sb.WriteString(salt) 75 | totalSalt := sb.String() 76 | 77 | if prefix == PrefixCryptSha512 { 78 | crypt := crypt.SHA512.New() 79 | ret, _ = crypt.Generate([]byte(password), []byte(totalSalt)) 80 | 81 | } else if prefix == PrefixCryptSha256 { 82 | crypt := crypt.SHA256.New() 83 | ret, _ = crypt.Generate([]byte(password), []byte(totalSalt)) 84 | } 85 | 86 | return ret[len(totalSalt)+1:] 87 | } 88 | 89 | func (m *cryptPassword) MatchesPassword(pw string) bool { 90 | hashed := shaCrypt(pw, m.rounds, m.salt, m.prefix) 91 | return constantTimeEquals(hashed, m.hashed) 92 | } 93 | -------------------------------------------------------------------------------- /cryptsha_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | ) 7 | 8 | type shacryptDatum struct { 9 | password string 10 | rounds uint16 // 0 means, don't use an explicit rounds configuration 11 | salt string 12 | hashed string 13 | prefix string 14 | } 15 | 16 | var sha256TestData = []shacryptDatum{ 17 | {"mickey", 0, "123456", "2hClNSDw3lZ0X/9PFBSI2eCGMOS06v6IbChiRsjy6tA", PrefixCryptSha256}, 18 | {"paul1", 0, "654321", "yXh20wwTHRwjSLcw20kQtiViO9n7HXDgEvzWf.cDks4", PrefixCryptSha256}, 19 | {"princessbuttercup", 0, "gildor", "/96zrUL6Si5ApMDxKlIvMHefBZz04JXJeg.Lp1fjhg1", PrefixCryptSha256}, 20 | } 21 | 22 | var sha512TestData = []shacryptDatum{ 23 | {"vinnie6", 0, "123456", "By3XGEfRf2RwFvWYR0kHRVJGq2/IKwLEGQxwyncoP88TGiBzHMBmvrTNxHgyqrmhZ/M7CGtkfIw0rBRfewW.y1", PrefixCryptSha512}, 24 | {"mickey5", 0, "iklkG8zV969+0x+f", "XKxre3pm8QNHezNxyEXj51AkNy5AXJQKifFhVWqhVaLLUAUAZkDy6Dp1Th/mTE/e/MkImK30.pByqu0CGsQZW1", PrefixCryptSha512}, 25 | {"andrew1", 0, "654321", "Qro3QWOs61UCarx1PAwAlL1.vJgZJXsIXml3.3vVhV.2xUwIRBmmyQzK9yFAqYY5iD1wkAdhUko6hl6T9N7s5.", PrefixCryptSha512}, 26 | {"dreadpirateroberts", 0, "98765432101234567890", "FPU3HtJ9RcPVUvxifkIJ/AlrBxWLqJQvyxK2f8x4qDX/A1RpcIvgjToU5erVkR6XUl7qwPsm7idpbMH5f/pBn0", PrefixCryptSha512}, 27 | {"dreadpirateroberts", 5000, "98765432101234567890", "FPU3HtJ9RcPVUvxifkIJ/AlrBxWLqJQvyxK2f8x4qDX/A1RpcIvgjToU5erVkR6XUl7qwPsm7idpbMH5f/pBn0", PrefixCryptSha512}, 28 | } 29 | 30 | func Test_CryptSha(t *testing.T) { 31 | 32 | for _, v := range sha256TestData { 33 | var text string 34 | if v.rounds > 0 { 35 | text = fmt.Sprintf(v.prefix+"rounds=%v$%s$%s", v.salt, v.hashed) 36 | } else { 37 | text = fmt.Sprintf(v.prefix+"%s$%s", v.salt, v.hashed) 38 | } 39 | testParserGood(t, "crypt-sha256", AcceptCryptSha, RejectCryptSha, text, v.password) 40 | } 41 | 42 | for _, v := range sha512TestData { 43 | var text string 44 | if v.rounds > 0 { 45 | text = fmt.Sprintf(v.prefix+"rounds=%v$%s$%s", v.rounds, v.salt, v.hashed) 46 | } else { 47 | text = fmt.Sprintf(v.prefix+"%s$%s", v.salt, v.hashed) 48 | } 49 | 50 | testParserGood(t, "crypt-sha512", AcceptCryptSha, RejectCryptSha, text, v.password) 51 | } 52 | 53 | testParserBad(t, "crypt-sha256", AcceptCryptSha, RejectCryptSha, "$5$nosalt") 54 | testParserBad(t, "crypt-sha512", AcceptCryptSha, RejectCryptSha, "$6$nosalt") 55 | testParserNot(t, "crypt-sha512", AcceptCryptSha, RejectCryptSha, "plain") 56 | testParserNot(t, "crypt-sha512", AcceptCryptSha, RejectCryptSha, "{SHA}plain") 57 | } 58 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/tg123/go-htpasswd 2 | 3 | go 1.23.0 4 | 5 | toolchain go1.24.2 6 | 7 | require ( 8 | github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 9 | github.com/stretchr/testify v1.10.0 10 | golang.org/x/crypto v0.37.0 11 | ) 12 | 13 | require ( 14 | github.com/davecgh/go-spew v1.1.1 // indirect 15 | github.com/pmezard/go-difflib v1.0.0 // indirect 16 | gopkg.in/yaml.v3 v3.0.1 // indirect 17 | ) 18 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= 2 | github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec= 3 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 4 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 5 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 6 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 7 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 8 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 9 | golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= 10 | golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= 11 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 12 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 13 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 14 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 15 | -------------------------------------------------------------------------------- /htgroup.go: -------------------------------------------------------------------------------- 1 | // Package htpasswd groups provides an autorisation mechanism using Apache-style group files. 2 | // 3 | // An Apache group file looks like this: 4 | // users: user1 user2 user3 5 | // admins: user1 6 | // 7 | // Basic usage of this package: 8 | // 9 | // userGroups, groupLoadErr := htgroup.NewGroups("./my-group-file", nil) 10 | // ok := userGroups.IsUserInGroup(username, "admins") 11 | package htpasswd 12 | 13 | import ( 14 | "bufio" 15 | "fmt" 16 | "io" 17 | "os" 18 | "strings" 19 | "sync/atomic" 20 | ) 21 | 22 | // Data structure for users and theirs groups (map). 23 | // The map key is the user, the value is an array of groups. 24 | type userGroupMap map[string][]string 25 | 26 | // A HTGroup encompasses an Apache-style group file. 27 | type HTGroup struct { 28 | filePath string 29 | userGroups atomic.Pointer[userGroupMap] 30 | } 31 | 32 | // NewGroups creates a HTGroup from an Apache-style group file. 33 | // 34 | // The filename must exist and be accessible to the process, as well as being a valid group file. 35 | // 36 | // bad is a function, which if not nil will be called for each malformed or rejected entry in the group file. 37 | func NewGroups(filename string, bad BadLineHandler) (*HTGroup, error) { 38 | htGroup := HTGroup{ 39 | filePath: filename, 40 | } 41 | return &htGroup, htGroup.ReloadGroups(bad) 42 | } 43 | 44 | // NewGroupsFromReader is like NewGroups but reads from r instead of a named file. 45 | func NewGroupsFromReader(r io.Reader, bad BadLineHandler) (*HTGroup, error) { 46 | htGroup := HTGroup{} 47 | 48 | readFileErr := htGroup.ReloadGroupsFromReader(r, bad) 49 | if readFileErr != nil { 50 | return nil, readFileErr 51 | } 52 | 53 | return &htGroup, nil 54 | } 55 | 56 | // ReloadGroups rereads the group file. 57 | func (htGroup *HTGroup) ReloadGroups(bad BadLineHandler) error { 58 | file, err := os.Open(htGroup.filePath) 59 | if err != nil { 60 | return err 61 | } 62 | defer file.Close() 63 | 64 | return htGroup.ReloadGroupsFromReader(file, bad) 65 | } 66 | 67 | // ReloadGroupsFromReader rereads the group file from a Reader. 68 | func (htGroup *HTGroup) ReloadGroupsFromReader(r io.Reader, bad BadLineHandler) error { 69 | userGroups := make(userGroupMap) 70 | scanner := bufio.NewScanner(r) 71 | 72 | for scanner.Scan() { 73 | line := scanner.Text() 74 | if lineErr := processLine(&userGroups, line); lineErr != nil && bad != nil { 75 | bad(lineErr) 76 | } 77 | } 78 | if scannerErr := scanner.Err(); scannerErr != nil { 79 | return fmt.Errorf("Error scanning group file: %s", scannerErr.Error()) 80 | } 81 | 82 | htGroup.userGroups.Store(&userGroups) 83 | 84 | return nil 85 | } 86 | 87 | func processLine(userGroups *userGroupMap, rawLine string) error { 88 | line := strings.TrimSpace(rawLine) 89 | if line == "" { 90 | return nil 91 | } 92 | 93 | groupAndUsers := strings.SplitN(line, ":", 2) 94 | if len(groupAndUsers) != 2 { 95 | return fmt.Errorf("malformed line, no colon: %s", line) 96 | } 97 | 98 | var group = strings.TrimSpace(groupAndUsers[0]) 99 | var users = strings.Fields(groupAndUsers[1]) 100 | for _, user := range users { 101 | if (*userGroups)[user] == nil { 102 | (*userGroups)[user] = []string{} 103 | } 104 | (*userGroups)[user] = append((*userGroups)[user], group) 105 | } 106 | 107 | return nil 108 | } 109 | 110 | // IsUserInGroup checks whether the user is in a group. 111 | // Returns true of user is in that group, otherwise false. 112 | func (htGroup *HTGroup) IsUserInGroup(user string, group string) bool { 113 | groups := htGroup.GetUserGroups(user) 114 | return containsGroup(groups, group) 115 | } 116 | 117 | // GetUserGroups reads all groups of a user. 118 | // Returns all groups as a string array or an empty array. 119 | func (htGroup *HTGroup) GetUserGroups(user string) []string { 120 | groups := (*htGroup.userGroups.Load())[user] 121 | 122 | if groups == nil { 123 | return []string{} 124 | } 125 | return groups 126 | } 127 | 128 | func containsGroup(groups []string, group string) bool { 129 | for _, g := range groups { 130 | if g == group { 131 | return true 132 | } 133 | } 134 | return false 135 | } 136 | -------------------------------------------------------------------------------- /htgroup_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "os" 5 | "strings" 6 | "testing" 7 | 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | var contents = `users: user1 user2 user3 12 | admins: user1 13 | ` 14 | 15 | var contents2 = `users: user1 user2 user3 16 | admins: user1 user2 17 | ` 18 | 19 | func TestGroups(t *testing.T) { 20 | // create temp file and write "contents" into it 21 | var f, err = os.CreateTemp("", "gogroups") 22 | filename := f.Name() 23 | assert.NoError(t, err) 24 | if _, err := f.WriteString(contents); err != nil { 25 | t.Fatalf("Failed to write temporary file: %s", err.Error()) 26 | } 27 | f.Close() 28 | 29 | // Read the file and check the contents 30 | htGroup, err := NewGroups(filename, nil) 31 | assert.NoError(t, err) 32 | assert.True(t, htGroup.IsUserInGroup("user1", "users")) 33 | assert.True(t, htGroup.IsUserInGroup("user1", "admins")) 34 | assert.True(t, htGroup.IsUserInGroup("user2", "users")) 35 | assert.False(t, htGroup.IsUserInGroup("user2", "admin")) 36 | assert.False(t, htGroup.IsUserInGroup("unknownuser", "users")) 37 | assert.False(t, htGroup.IsUserInGroup("user1", "unknowngroup")) 38 | assert.False(t, htGroup.IsUserInGroup("unknownuser", "unknowngroup")) 39 | assert.Len(t, htGroup.GetUserGroups("user1"), 2) 40 | assert.Len(t, htGroup.GetUserGroups("user2"), 1) 41 | assert.Len(t, htGroup.GetUserGroups("user3"), 1) 42 | assert.Len(t, htGroup.GetUserGroups("unknownuser"), 0) 43 | 44 | // Replace temp file with another one (contents2) 45 | os.Remove(filename) 46 | f2, errCreate := os.Create(filename) 47 | if errCreate != nil { 48 | t.Fatalf("Failed to create temporary file: %s", errCreate.Error()) 49 | } 50 | if _, err := f2.WriteString(contents2); err != nil { 51 | t.Fatalf("Failed to write temporary file: %s", err.Error()) 52 | } 53 | f2.Close() 54 | defer os.Remove(filename) 55 | 56 | // Reread the file and check the contents again, user2 should now be member of admins too. 57 | reloadError := htGroup.ReloadGroups(nil) 58 | assert.NoError(t, reloadError) 59 | assert.True(t, htGroup.IsUserInGroup("user1", "users")) 60 | assert.True(t, htGroup.IsUserInGroup("user1", "admins")) 61 | assert.True(t, htGroup.IsUserInGroup("user2", "users")) 62 | assert.True(t, htGroup.IsUserInGroup("user2", "admins")) 63 | assert.False(t, htGroup.IsUserInGroup("unknownuser", "users")) 64 | assert.False(t, htGroup.IsUserInGroup("user1", "unknowngroup")) 65 | assert.False(t, htGroup.IsUserInGroup("unknownuser", "unknowngroup")) 66 | assert.Len(t, htGroup.GetUserGroups("user1"), 2) 67 | assert.Len(t, htGroup.GetUserGroups("user2"), 2) 68 | assert.Len(t, htGroup.GetUserGroups("user3"), 1) 69 | assert.Len(t, htGroup.GetUserGroups("unknownuser"), 0) 70 | 71 | // Test load from reader as well 72 | r := strings.NewReader(contents2) 73 | htGroup, err = NewGroupsFromReader(r, nil) 74 | assert.NoError(t, err) 75 | assert.True(t, htGroup.IsUserInGroup("user1", "users")) 76 | assert.True(t, htGroup.IsUserInGroup("user1", "admins")) 77 | assert.True(t, htGroup.IsUserInGroup("user2", "users")) 78 | assert.True(t, htGroup.IsUserInGroup("user2", "admins")) 79 | assert.False(t, htGroup.IsUserInGroup("unknownuser", "users")) 80 | assert.False(t, htGroup.IsUserInGroup("user1", "unknowngroup")) 81 | assert.False(t, htGroup.IsUserInGroup("unknownuser", "unknowngroup")) 82 | assert.Len(t, htGroup.GetUserGroups("user1"), 2) 83 | assert.Len(t, htGroup.GetUserGroups("user2"), 2) 84 | assert.Len(t, htGroup.GetUserGroups("user3"), 1) 85 | assert.Len(t, htGroup.GetUserGroups("unknownuser"), 0) 86 | } 87 | -------------------------------------------------------------------------------- /htpasswd.go: -------------------------------------------------------------------------------- 1 | // Package htpasswd provides HTTP Basic Authentication using Apache-style htpasswd files 2 | // for the user and password data. 3 | // 4 | // It supports most common hashing systems used over the decades and can be easily extended 5 | // by the programmer to support others. (See the sha.go source file as a guide.) 6 | // 7 | // You will want to use something like... 8 | // 9 | // myauth := htpasswd.New("./my-htpasswd-file", htpasswd.DefaultSystems, nil) 10 | // ok := myauth.Match(user, password) 11 | // 12 | // ...to use in your handler code. 13 | // You should read about that nil, as well as Reread() too. 14 | package htpasswd 15 | 16 | import ( 17 | "bufio" 18 | "fmt" 19 | "io" 20 | "os" 21 | "strings" 22 | "sync/atomic" 23 | ) 24 | 25 | // An EncodedPasswd is created from the encoded password in a password file by a PasswdParser. 26 | // 27 | // The password files consist of lines like "user:passwd-encoding". The user part is stripped off and 28 | // the passwd-encoding part is captured in an EncodedPasswd. 29 | type EncodedPasswd interface { 30 | // Return true if the string matches the password. 31 | // This may cache the result in the case of expensive comparison functions. 32 | MatchesPassword(pw string) bool 33 | } 34 | 35 | // PasswdParser examines an encoded password, and if it is formatted correctly and sane, return an 36 | // EncodedPasswd which will recognize it. 37 | // 38 | // If the format is not understood, then return nil 39 | // so that another parser may have a chance. If the format is understood but not sane, 40 | // return an error to prevent other formats from possibly claiming it 41 | // 42 | // You may write and supply one of these functions to support a format (e.g. bcrypt) not 43 | // already included in this package. Use sha.c as a template, it is simple but not too simple. 44 | type PasswdParser func(pw string) (EncodedPasswd, error) 45 | 46 | type passwdTable map[string]EncodedPasswd 47 | 48 | // A BadLineHandler is used to notice bad lines in a password file. If not nil, it will be 49 | // called for each bad line with a descriptive error. Think about what you do with these, they 50 | // will sometimes contain hashed passwords. 51 | type BadLineHandler func(err error) 52 | 53 | // An File encompasses an Apache-style htpasswd file for HTTP Basic authentication 54 | type File struct { 55 | filePath string 56 | passwds atomic.Pointer[passwdTable] 57 | parsers []PasswdParser 58 | } 59 | 60 | // DefaultSystems is an array of PasswdParser including all builtin parsers. Notice that Plain is last, since it accepts anything 61 | var DefaultSystems = []PasswdParser{AcceptMd5, AcceptSha, AcceptBcrypt, AcceptSsha, AcceptCryptSha, AcceptPlain} 62 | 63 | // New creates an File from an Apache-style htpasswd file for HTTP Basic Authentication. 64 | // 65 | // The realm is presented to the user in the login dialog. 66 | // 67 | // The filename must exist and be accessible to the process, as well as being a valid htpasswd file. 68 | // 69 | // parsers is a list of functions to handle various hashing systems. In practice you will probably 70 | // just pass htpasswd.DefaultSystems, but you could make your own to explicitly reject some formats or 71 | // implement your own. 72 | // 73 | // bad is a function, which if not nil will be called for each malformed or rejected entry in 74 | // the password file. 75 | func New(filename string, parsers []PasswdParser, bad BadLineHandler) (*File, error) { 76 | bf := File{ 77 | filePath: filename, 78 | parsers: parsers, 79 | } 80 | 81 | if err := bf.Reload(bad); err != nil { 82 | return nil, err 83 | } 84 | 85 | return &bf, nil 86 | } 87 | 88 | // NewFromReader is like new but reads from r instead of a named file. Calling 89 | // Reload on the returned File will result in an error; use 90 | // ReloadFromReader instead. 91 | func NewFromReader(r io.Reader, parsers []PasswdParser, bad BadLineHandler) (*File, error) { 92 | bf := File{ 93 | parsers: parsers, 94 | } 95 | 96 | if err := bf.ReloadFromReader(r, bad); err != nil { 97 | return nil, err 98 | } 99 | 100 | return &bf, nil 101 | } 102 | 103 | // Match checks the username and password combination to see if it represents 104 | // a valid account from the htpassword file. 105 | func (bf *File) Match(username, password string) bool { 106 | matcher, ok := (*bf.passwds.Load())[username] 107 | 108 | if ok && matcher.MatchesPassword(password) { 109 | // we are good 110 | return true 111 | } 112 | 113 | return false 114 | } 115 | 116 | // Reload rereads the htpassword file.. 117 | // You will need to call this to notice any changes to the password file. 118 | // This function is thread safe. Someone versed in fsnotify might make it 119 | // happen automatically. Likewise you might also connect a SIGHUP handler to 120 | // this function. 121 | func (bf *File) Reload(bad BadLineHandler) error { 122 | // with the file... 123 | f, err := os.Open(bf.filePath) 124 | if err != nil { 125 | return err 126 | } 127 | defer f.Close() 128 | 129 | return bf.ReloadFromReader(f, bad) 130 | } 131 | 132 | // ReloadFromReader is like Reload but reads credentials from r instead of a named 133 | // file. If File was created by New, it is okay to call Reload and 134 | // ReloadFromReader as desired. 135 | func (bf *File) ReloadFromReader(r io.Reader, bad BadLineHandler) error { 136 | // ... and a new map ... 137 | newPasswdMap := passwdTable{} 138 | 139 | // ... for each line ... 140 | scanner := bufio.NewScanner(r) 141 | for scanner.Scan() { 142 | line := scanner.Text() 143 | 144 | // ... add it to the map, noting errors along the way 145 | if perr := bf.addHtpasswdUser(&newPasswdMap, line); perr != nil && bad != nil { 146 | bad(perr) 147 | } 148 | } 149 | if err := scanner.Err(); err != nil { 150 | return fmt.Errorf("Error scanning htpasswd file: %s", err.Error()) 151 | } 152 | 153 | // .. finally, safely swap in the new map 154 | bf.passwds.Store(&newPasswdMap) 155 | 156 | return nil 157 | } 158 | 159 | // addHtpasswdUser processes a line from an htpasswd file and add it to the user/password map. We may 160 | // encounter some malformed lines, this will not be an error, but we will log them if 161 | // the caller has given us a logger. 162 | func (bf *File) addHtpasswdUser(pwmap *passwdTable, rawLine string) error { 163 | // ignore white space lines 164 | line := strings.TrimSpace(rawLine) 165 | if line == "" { 166 | return nil 167 | } 168 | 169 | // split "user:encoding" at colon 170 | parts := strings.SplitN(line, ":", 2) 171 | if len(parts) != 2 { 172 | return fmt.Errorf("malformed line, no colon: %s", line) 173 | } 174 | 175 | user := parts[0] 176 | encoding := parts[1] 177 | 178 | // give each parser a shot. The first one to produce a matcher wins. 179 | // If one produces an error then stop (to prevent Plain from catching it) 180 | for _, p := range bf.parsers { 181 | matcher, err := p(encoding) 182 | if err != nil { 183 | return err 184 | } 185 | if matcher != nil { 186 | (*pwmap)[user] = matcher 187 | return nil // we are done, we took to first match 188 | } 189 | } 190 | 191 | // No one liked this line 192 | return fmt.Errorf("unable to recognize password for %s in %s", user, encoding) 193 | } 194 | -------------------------------------------------------------------------------- /htpasswd_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "os" 5 | "strings" 6 | "testing" 7 | ) 8 | 9 | type testUser struct { 10 | username string 11 | password string 12 | } 13 | 14 | var testUsers = []testUser{ 15 | {"user1", "mickey5"}, 16 | {"user2", "alexandrew"}, 17 | {"user3", "hawaiicats78"}, 18 | {"user4", "DIENOW"}, 19 | {"user5", "e8f685"}, 20 | {"user6", "Rickygirl03"}, 21 | {"user7", "123vb123"}, 22 | {"user8", "sheng060576"}, 23 | {"user9", "hansisme"}, 24 | {"user10", "h4ck3rs311t3"}, 25 | {"user11", "K90JyTGA"}, 26 | {"user12", "aspire5101"}, 27 | {"user13", "553568"}, 28 | {"user14", "SRI"}, 29 | {"user15", "maxmus"}, 30 | {"user16", "a5xp9707"}, 31 | {"user17", "tomasrim"}, 32 | {"user18", "2a0mag"}, 33 | {"user19", "wmsfht"}, 34 | {"user20", "webmaster2364288"}, 35 | {"user21", "121516m"}, 36 | {"user22", "T69228803"}, 37 | {"user23", "qq820221"}, 38 | {"user24", "chenfy"}, 39 | {"user25", "www.debure.net"}, 40 | {"user26", "1333e763"}, 41 | {"user27", "burberries"}, 42 | {"user28", "chanmee14"}, 43 | {"user29", "65432106543210"}, 44 | {"user30", "powernet"}, 45 | {"user31", "a2d8i6a7"}, 46 | {"user32", "gvs9ptc"}, 47 | {"user33", "Pookie"}, 48 | {"user34", "lorissss"}, 49 | {"user35", "ess"}, 50 | {"user36", "sparra"}, 51 | {"user37", "allysson"}, 52 | {"user38", "99128008"}, 53 | {"user39", "evisanne"}, 54 | {"user40", "qfxg7x9l"}, 55 | {"user41", "03415"}, 56 | {"user42", "87832309"}, 57 | {"user43", "816283"}, 58 | {"user44", "banach12"}, 59 | {"user45", "sjdszpsc"}, 60 | {"user46", "changsing"}, 61 | {"user47", "56339388"}, 62 | {"user48", "52114157"}, 63 | {"user49", "jinebimb"}, 64 | {"user50", "erol43"}, 65 | {"user51", "2yagos"}, 66 | {"user52", "habparty!"}, 67 | {"user53", "tangjianhui"}, 68 | {"user54", "serandah"}, 69 | {"user55", "mirrages"}, 70 | {"user56", "mantgaxxl"}, 71 | {"user57", "45738901"}, 72 | {"user58", "g523minna"}, 73 | {"user59", "j202020"}, 74 | {"user60", "g@mmaecho"}, 75 | {"user61", "042380"}, 76 | {"user62", "ASRuin"}, 77 | {"user63", "061990"}, 78 | {"user64", "ysoline"}, 79 | {"user65", "liuzhouzhou"}, 80 | {"user66", "b0000000wind"}, 81 | {"user67", "7913456852"}, 82 | {"user68", "9008"}, 83 | {"user69", "waitlin11"}, 84 | {"user70", "8fdakar"}, 85 | {"user71", "eisball"}, 86 | {"user72", "jenna17"}, 87 | {"user73", "belkadonam"}, 88 | {"user74", "tfyuj9JW"}, 89 | {"user75", "nihaijidema"}, 90 | {"user76", "talapia"}, 91 | {"user77", "7376220"}, 92 | {"user78", "c7m8e1xsc3"}, 93 | {"user79", "84129793"}, 94 | {"user80", "test1000"}, 95 | {"user81", "ecmanhatten"}, 96 | {"user82", "EvanYo3327"}, 97 | {"user83", "269john139"}, 98 | {"user84", "3348159zw"}, 99 | {"user85", "lu184020"}, 100 | {"user86", "aszasw"}, 101 | {"user87", "33059049"}, 102 | {"user88", "li3255265"}, 103 | {"user89", "kerrihayes"}, 104 | {"user90", "0167681809"}, 105 | {"user91", "stefano123"}, 106 | {"user92", "15054652730"}, 107 | {"user93", "natdvd213"}, 108 | {"user94", "680929"}, 109 | {"user95", "steelpad8"}, 110 | {"user96", "374710"}, 111 | {"user97", "394114"}, 112 | {"user98", "24347"}, 113 | {"user99", "krait93"}, 114 | {"user100", "5164794"}, 115 | {"user101", "rswCyJE5"}, 116 | {"user102", "31480019"}, 117 | {"user103", "19830907ok"}, 118 | {"user104", "zlsmhzlsmh"}, 119 | {"user105", "Zengatsu"}, 120 | {"user106", "0127603331"}, 121 | {"user107", "axelle77"}, 122 | {"user108", "password2147"}, 123 | {"user109", "olixkl8b"}, 124 | {"user110", "maiwen"}, 125 | {"user111", "198613"}, 126 | {"user112", "s17kr8wu"}, 127 | {"user113", "biker02"}, 128 | {"user114", "m1399"}, 129 | {"user115", "a2dc6a"}, 130 | {"user116", "zhd8902960"}, 131 | {"user117", "parasuta"}, 132 | {"user118", "the1secret"}, 133 | {"user119", "teddy14"}, 134 | {"user120", "4516388amt"}, 135 | {"user121", "245520"}, 136 | {"user122", "D34dw00d"}, 137 | {"user123", "officiel"}, 138 | {"user124", "36653665"}, 139 | {"user125", "hipol"}, 140 | {"user126", "Nylon0"}, 141 | {"user127", "caitlyne6"}, 142 | {"user128", "dogzilla"}, 143 | {"user129", "lemegaboss"}, 144 | {"user130", "c0valerius"}, 145 | {"user131", "liseczek44"}, 146 | {"user132", "saulosi"}, 147 | {"user133", "53522"}, 148 | {"user134", "ajgebam"}, 149 | {"user135", "freshplayer"}, 150 | {"user136", "logistica1"}, 151 | {"user137", "12calo66"}, 152 | {"user138", "kenno"}, 153 | {"user139", "34639399"}, 154 | {"user140", "0408636405"}, 155 | {"user141", "weezer12"}, 156 | {"user142", "9888735777"}, 157 | {"user143", "7771877"}, 158 | {"user144", "6620852"}, 159 | {"user145", "98billiards"}, 160 | {"user146", "angelik"}, 161 | {"user147", "86815057"}, 162 | {"user148", "p16alfalfa"}, 163 | {"user149", "7236118"}, 164 | {"user150", "glock17l"}, 165 | {"user151", "sigmundm"}, 166 | {"user152", "ltbgeqsd"}, 167 | {"user153", "wqnd8k2m"}, 168 | {"user154", "yangjunjie"}, 169 | {"user155", "manjinder"}, 170 | {"user156", "nick2000"}, 171 | {"user157", "193416"}, 172 | {"user158", "pang168"}, 173 | {"user159", "454016"}, 174 | {"user160", "phair08"}, 175 | {"user161", "10252007cw"}, 176 | {"user162", "zhuzhuzhu"}, 177 | {"user163", "metafunds"}, 178 | {"user164", "smash"}, 179 | {"user165", "76387638"}, 180 | {"user166", "S226811954"}, 181 | {"user167", "mintymoo00"}, 182 | {"user168", "seven711"}, 183 | {"user169", "924414"}, 184 | {"user170", "changchengxu"}, 185 | {"user171", "alaska58"}, 186 | {"user172", "7678208"}, 187 | {"user173", "szazsoo73"}, 188 | {"user174", "3830371"}, 189 | {"user175", "0qdzx66b"}, 190 | {"user176", "09124248099"}, 191 | {"user177", "bachrain"}, 192 | {"user178", "sJsSdFBY"}, 193 | {"user179", "676215000"}, 194 | {"user180", "nimamapwoaini"}, 195 | {"user181", "nitsuj"}, 196 | {"user182", "cukierek2003"}, 197 | {"user183", "seeder"}, 198 | {"user184", "00167148786"}, 199 | {"user185", "ashok198"}, 200 | {"user186", "kt2116"}, 201 | {"user187", "another82"}, 202 | {"user188", "75995794"}, 203 | {"user189", "19901130"}, 204 | {"user190", "gijs010389"}, 205 | {"user191", "26263199"}, 206 | {"user192", "hi1j42x8"}, 207 | {"user193", "6922235"}, 208 | {"user194", "67749330"}, 209 | {"user195", "ccpatrik"}, 210 | {"user196", "summer3011"}, 211 | {"user197", "331516"}, 212 | {"user198", "135745"}, 213 | {"user199", "603762004"}, 214 | {"user200", "29011985"}, 215 | {"user201", "29011985"}, 216 | } 217 | var textPlain = `user1:mickey5 218 | user2:alexandrew 219 | user3:hawaiicats78 220 | user4:DIENOW 221 | user5:e8f685 222 | user6:Rickygirl03 223 | user7:123vb123 224 | user8:sheng060576 225 | user9:hansisme 226 | user10:h4ck3rs311t3 227 | user11:K90JyTGA 228 | user12:aspire5101 229 | user13:553568 230 | user14:SRI 231 | user15:maxmus 232 | user16:a5xp9707 233 | user17:tomasrim 234 | user18:2a0mag 235 | user19:wmsfht 236 | user20:webmaster2364288 237 | user21:121516m 238 | user22:T69228803 239 | user23:qq820221 240 | user24:chenfy 241 | user25:www.debure.net 242 | user26:1333e763 243 | user27:burberries 244 | user28:chanmee14 245 | user29:65432106543210 246 | user30:powernet 247 | user31:a2d8i6a7 248 | user32:gvs9ptc 249 | user33:Pookie 250 | user34:lorissss 251 | user35:ess 252 | user36:sparra 253 | user37:allysson 254 | user38:99128008 255 | user39:evisanne 256 | user40:qfxg7x9l 257 | user41:03415 258 | user42:87832309 259 | user43:816283 260 | user44:banach12 261 | user45:sjdszpsc 262 | user46:changsing 263 | user47:56339388 264 | user48:52114157 265 | user49:jinebimb 266 | user50:erol43 267 | user51:2yagos 268 | user52:habparty! 269 | user53:tangjianhui 270 | user54:serandah 271 | user55:mirrages 272 | user56:mantgaxxl 273 | user57:45738901 274 | user58:g523minna 275 | user59:j202020 276 | user60:g@mmaecho 277 | user61:042380 278 | user62:ASRuin 279 | user63:061990 280 | user64:ysoline 281 | user65:liuzhouzhou 282 | user66:b0000000wind 283 | user67:7913456852 284 | user68:9008 285 | user69:waitlin11 286 | user70:8fdakar 287 | user71:eisball 288 | user72:jenna17 289 | user73:belkadonam 290 | user74:tfyuj9JW 291 | user75:nihaijidema 292 | user76:talapia 293 | user77:7376220 294 | user78:c7m8e1xsc3 295 | user79:84129793 296 | user80:test1000 297 | user81:ecmanhatten 298 | user82:EvanYo3327 299 | user83:269john139 300 | user84:3348159zw 301 | user85:lu184020 302 | user86:aszasw 303 | user87:33059049 304 | user88:li3255265 305 | user89:kerrihayes 306 | user90:0167681809 307 | user91:stefano123 308 | user92:15054652730 309 | user93:natdvd213 310 | user94:680929 311 | user95:steelpad8 312 | user96:374710 313 | user97:394114 314 | user98:24347 315 | user99:krait93 316 | user100:5164794 317 | user101:rswCyJE5 318 | user102:31480019 319 | user103:19830907ok 320 | user104:zlsmhzlsmh 321 | user105:Zengatsu 322 | user106:0127603331 323 | user107:axelle77 324 | user108:password2147 325 | user109:olixkl8b 326 | user110:maiwen 327 | user111:198613 328 | user112:s17kr8wu 329 | user113:biker02 330 | user114:m1399 331 | user115:a2dc6a 332 | user116:zhd8902960 333 | user117:parasuta 334 | user118:the1secret 335 | user119:teddy14 336 | user120:4516388amt 337 | user121:245520 338 | user122:D34dw00d 339 | user123:officiel 340 | user124:36653665 341 | user125:hipol 342 | user126:Nylon0 343 | user127:caitlyne6 344 | user128:dogzilla 345 | user129:lemegaboss 346 | user130:c0valerius 347 | user131:liseczek44 348 | user132:saulosi 349 | user133:53522 350 | user134:ajgebam 351 | user135:freshplayer 352 | user136:logistica1 353 | user137:12calo66 354 | user138:kenno 355 | user139:34639399 356 | user140:0408636405 357 | user141:weezer12 358 | user142:9888735777 359 | user143:7771877 360 | user144:6620852 361 | user145:98billiards 362 | user146:angelik 363 | user147:86815057 364 | user148:p16alfalfa 365 | user149:7236118 366 | user150:glock17l 367 | user151:sigmundm 368 | user152:ltbgeqsd 369 | user153:wqnd8k2m 370 | user154:yangjunjie 371 | user155:manjinder 372 | user156:nick2000 373 | user157:193416 374 | user158:pang168 375 | user159:454016 376 | user160:phair08 377 | user161:10252007cw 378 | user162:zhuzhuzhu 379 | user163:metafunds 380 | user164:smash 381 | user165:76387638 382 | user166:S226811954 383 | user167:mintymoo00 384 | user168:seven711 385 | user169:924414 386 | user170:changchengxu 387 | user171:alaska58 388 | user172:7678208 389 | user173:szazsoo73 390 | user174:3830371 391 | user175:0qdzx66b 392 | user176:09124248099 393 | user177:bachrain 394 | user178:sJsSdFBY 395 | user179:676215000 396 | user180:nimamapwoaini 397 | user181:nitsuj 398 | user182:cukierek2003 399 | user183:seeder 400 | user184:00167148786 401 | user185:ashok198 402 | user186:kt2116 403 | user187:another82 404 | user188:75995794 405 | user189:19901130 406 | user190:gijs010389 407 | user191:26263199 408 | user192:hi1j42x8 409 | user193:6922235 410 | user194:67749330 411 | user195:ccpatrik 412 | user196:summer3011 413 | user197:331516 414 | user198:135745 415 | user199:603762004 416 | user200:29011985 417 | user201:29011985` 418 | 419 | var textApr1 = `user1:$apr1$gxNb79DX$6wi9QaGNM5TA0kBKiC4710 420 | user2:$apr1$kv1uUfCO$iEwrWojf92uZ/9uhTQmMo. 421 | user3:$apr1$UQ6GxE7V$OrIqWONGuSV9RfS3B2dfO1 422 | user4:$apr1$OZ.RwYJH$AwfW2h0gJnu2fQi0GegVe1 423 | user5:$apr1$9r9GyMpL$3IiaLNos/tbouLJwsW8ey/ 424 | user6:$apr1$0tlsxL/0$cfS6c2JZjwISRTgFvrMWL1 425 | user7:$apr1$/4XFfQuK$bnMIHM0j/Cf8apmbvPzn/. 426 | user8:$apr1$NEJJUzVT$o/CWI9InAMXWAsbl5gx0p1 427 | user9:$apr1$JAOXCriK$gB/Yox3wTae3NujwKUiFv1 428 | user10:$apr1$KmkPgS2r$5qIFMPNVAXzlevkzOQwhj. 429 | user11:$apr1$mM7q5ZHN$03LeGh9D1CujEBwiVRO6B0 430 | user12:$apr1$tlxr3zoa$dQJiJmk4pEtRTssYiLwlv0 431 | user13:$apr1$YI.r2X/w$H/1DtcmTHSgcdkgz8NS1W0 432 | user14:$apr1$StJ5t4wb$tIVEx.MPZR1SqDm5y9VCs1 433 | user15:$apr1$ad29tH08$xEHwr706Yz/3FFGqnVB6l/ 434 | user16:$apr1$aH0sN4io$y0heNz5hL67/HA7/7mDRS. 435 | user17:$apr1$SgbYnJV9$7Z.enu6vZ7b6Zo7/lYce60 436 | user18:$apr1$lSOzbc7i$Ae21yFmdTMpSz.aQsjyoE1 437 | user19:$apr1$yicl6/5x$p/dCDdQ0q9lLaZbBJsIDP0 438 | user20:$apr1$PLoY5sMf$KEDmvJskiSNFwiygtWXin1 439 | user21:$apr1$3T5gmyrq$AucgLmXU53aTQJuRKCFo50 440 | user22:$apr1$Aajhupso$/EPFyux8bd7Iw.tLevaVE. 441 | user23:$apr1$G43B4jFl$4TUFaOD7Fz5.lZiq5v8P40 442 | user24:$apr1$mDnux.Mf$vXsdihwaTLCJTHnuk9/cK/ 443 | user25:$apr1$bZzoRW4K$DfI3Col55.57HP3FW4L1h. 444 | user26:$apr1$rRvCcrzo$plG5/rpEPSM7uc3bro6P51 445 | user27:$apr1$Qx6JtYcz$10t2dI6u0LyNBjeCAQ.3z1 446 | user28:$apr1$p9t9dUC1$Nlr96oZWIe/VVpYBUgG6q0 447 | user29:$apr1$CBG7TUqG$Olyygy0L6HfSPfkLg24U60 448 | user30:$apr1$ogVPlakG$.SLiqbN/KUECQ6pgdck2/. 449 | user31:$apr1$sNrtmvPF$rvbRuKdcPPvN.dK.mHeYq/ 450 | user32:$apr1$gQgMMxVG$5sI4ezBQxqpfh14AvEEVU0 451 | user33:$apr1$x.wVLgoG$HTj5gT.lQ71BpifSlcQVy1 452 | user34:$apr1$O0ySiIf4$AmmYBbHWjfiVcGEbl4wiy/ 453 | user35:$apr1$nE19zEmy$Rg3/wMTNMVOkbhez/QhD// 454 | user36:$apr1$By1OjZuF$PRY4G6D8u3aFhruSTgIQC. 455 | user37:$apr1$mI6fsU64$WqCg/f9CpYr4586AVr6nP. 456 | user38:$apr1$LQLXA.du$kazspxn165TFSiDavu75N/ 457 | user39:$apr1$AhDCR8bW$2lR137DLMfr1mQ9xLlMsw0 458 | user40:$apr1$ZAGBUFGw$HI3fWMR0Y6Z4U3MSc70sd. 459 | user41:$apr1$nkFIBpLJ$AvABMUIgvoMp0zmOTCwCG1 460 | user42:$apr1$WbCq7Hv8$dxe0LoM3vlD.t/A/3Cfd11 461 | user43:$apr1$PrEjUTNt$vGLTgLqJp9XEtwEJBv5XF. 462 | user44:$apr1$S1G5jLiH$CySeS1zgVlMLLElxG6Dmw0 463 | user45:$apr1$QmuQrgcB$xZk5zcK2QRF8PZ24P9vPr1 464 | user46:$apr1$Z0i29yA5$KnTYiWEZQYzQlH/SxQ7Qp/ 465 | user47:$apr1$RZlCHiTm$8mFKCLkRHxoJ2ieVa.K79/ 466 | user48:$apr1$3NkMs.IK$02HiBvqlIVA.hLbktlHsD1 467 | user49:$apr1$1ww3avga$haxtp7TGUm9PHPBrBeM9u. 468 | user50:$apr1$.aE1EJya$3zkhvRyNbF.DOOyJSPSJ21 469 | user51:$apr1$L0YlhvFW$R0J.Bk9wYb7sQKXBbP4AN/ 470 | user52:$apr1$vveX0m/D$hPoF3j.Ac5zSOAmHBZklT. 471 | user53:$apr1$8Ivzj66d$J4A.NOn6TRk4RYC9oGqIB/ 472 | user54:$apr1$v9AJex0e$qn/isKH9e6EG66KCtFdmI1 473 | user55:$apr1$UM0E3yNn$4V4IJI2Q0Bqh0EG8HAHbq0 474 | user56:$apr1$1spakyg4$NwPcxatLI7bWUpeDzAw2h1 475 | user57:$apr1$oepJpf/s$p0F.JGVJCyvUHfWnpF.Wy1 476 | user58:$apr1$yWpavB.B$q4KExAyIKMKWTLq86n0820 477 | user59:$apr1$DTRNSWt7$2At.lEmBM2waU9F2QsDvd. 478 | user60:$apr1$QGA07jk6$U9Uw/dD666GNV60hX6AKM/ 479 | user61:$apr1$FDnW17iI$6jkNwkfAi.4LMYkIkNO2v1 480 | user62:$apr1$GKFI0Se3$go4Tko/O9UCA2WtSJBjgc. 481 | user63:$apr1$yJR0EnuF$CzzsiUo2Q5cRhtlptUf7D1 482 | user64:$apr1$7D0hCvVq$HLIRmi013HBi2TgATkgJM. 483 | user65:$apr1$m.MSvKt4$oFYUki/pESjwOfF5YH9VO0 484 | user66:$apr1$qOQrkTXw$PJXv2X.0Efe4VUPcvyxA61 485 | user67:$apr1$lPKDpKzC$q9kt0R9.I4rxhlIcNe2gg1 486 | user68:$apr1$PYsksC92$3oqtOxrMnQc1n3GfSIAJM. 487 | user69:$apr1$x5UDLNO2$yHLWIm/50ORtDhT56f9bi0 488 | user70:$apr1$E9a2XIvt$fcsw4gZfbiDXPywMzwhik1 489 | user71:$apr1$gHg16GuT$DGI/O8HzZemhsQ4o2jA560 490 | user72:$apr1$yzwqt8mS$3QqqiFB9Z6q1fp4z/q1pU. 491 | user73:$apr1$iGU4vuaZ$w3xf5rVAIJYz0dgImL8a2. 492 | user74:$apr1$5cPUmio7$wttScNV7Fk4Njs9QX1yUi. 493 | user75:$apr1$DZW4Gt4h$EXlVFPbqnXGPp2vLQT5TK0 494 | user76:$apr1$61i3ruRm$cNcNvti2hQ8mXjLahFnSb/ 495 | user77:$apr1$Z89Ynh0K$A2k6aLQnMOa2uwXX8MJZf1 496 | user78:$apr1$QRn4AsCM$gUztH0RWKuX1Vy0WaYfdC1 497 | user79:$apr1$rghudgt5$XA7QLtfRq84JHtbjdke0I. 498 | user80:$apr1$zwkIVA3j$Iuz7zNyLvIiKWIl2VA8bl. 499 | user81:$apr1$zfVlWDS.$emJhRC3N0SnvZLo5en4zE0 500 | user82:$apr1$VDajAiZs$lMKGzN91BhIX0hHCNqErU1 501 | user83:$apr1$Ryash8LF$u96Rir1Izuwf/oHnaykmS/ 502 | user84:$apr1$fdErikUY$.gX/8MNguTOTWT35m4DCy/ 503 | user85:$apr1$uabGv1xC$X5NNdH/1dzD0gQUyHwzKB0 504 | user86:$apr1$41WiK.i.$2q1CW/s4oRBLAFxmLESmO1 505 | user87:$apr1$bYPWMY2a$fvKkFR1RRccGtIUhLuvBR0 506 | user88:$apr1$FTGQVCcu$QS/ub5DGLK/wgfkYQ0DBR. 507 | user89:$apr1$cFc9bc86$3cVFy8/qB/fNGNueG65vG0 508 | user90:$apr1$A5TvYYWy$s4HBh0Wum2QQj1c9e0s79. 509 | user91:$apr1$YNrpseN3$Yt52Yo9IEBs2LpX7A/CUb0 510 | user92:$apr1$12CL4km4$NJm8fh.JFi5dE.p6A9g7v/ 511 | user93:$apr1$hssJjJTG$dDK3pbBFTLbEigu.eCN7s. 512 | user94:$apr1$iaZlOft5$w7iC6f5BUzuXox9THmHuj1 513 | user95:$apr1$mAoHmdUe$5HePkkuSVu9F2UYgCvn0M. 514 | user96:$apr1$RFR4xs7H$9GH0NjiDIgBD0t.w5/fwt0 515 | user97:$apr1$Jt2syL5H$tJ18tBNlcBEBqphUQc9jm. 516 | user98:$apr1$QnSWI03c$8GC6c0AwpC.c8j4H7/9QU0 517 | user99:$apr1$bwzDGet.$ntnX3fwzi3Zzhy0eHuwA9. 518 | user100:$apr1$gkhv.jfD$2fljug5HHu01vs.6KGJXQ. 519 | user101:$apr1$HzyuhjzZ$pXmWtTfn0/1voBaBkNaRy0 520 | user102:$apr1$ZZc0Ogd8$1TNy1gTG6GLc.P/98kXXT. 521 | user103:$apr1$4t6oHDY9$kFoi2gvPcKMZs.AiGq1yb1 522 | user104:$apr1$cih9diuY$AwNc6TaKzFm9c8.kQxfwN1 523 | user105:$apr1$wuXDXGlS$FXFvRPPs7HHg96sSCFnFM1 524 | user106:$apr1$z3inhAFw$vkfbG7KVT4SYHiUn7Yqrz1 525 | user107:$apr1$jydGNcWd$qz3N5yqg0woVcZ6TN7SHr0 526 | user108:$apr1$GoP2TF8P$c/b36Y.Qg/Grq7b7p.jbl. 527 | user109:$apr1$wxkU6WKQ$IlhCpPwTWvESASvpOToqh. 528 | user110:$apr1$7JgCOFuj$0WVRunftYuoR3o5ktLMdM1 529 | user111:$apr1$Vai72CeM$6WWXwZhxx/EW0IONm7n0A. 530 | user112:$apr1$uNqfw7fr$NAmeX1Mag2xf5lOCxGrcx/ 531 | user113:$apr1$.dmc8gVd$ZB4OmwWIeJ5Iy66Ta/7mU0 532 | user114:$apr1$vg1vnQVK$UUqQibheBizuB0JxR1rbz/ 533 | user115:$apr1$lsH2FMPS$dBBuRArwOlN/1p1BuncB3/ 534 | user116:$apr1$rMGc2ODd$jG6/9kzAkMHFVAYYVEKN60 535 | user117:$apr1$GeWoySy2$WZ9pwqAb72tKP0xob81Ho0 536 | user118:$apr1$7LW61iOz$a9dFA0cRmBIuaxbBqnT/w/ 537 | user119:$apr1$GJ9nS.Cn$jwpBiFBLr1XIo.J5klB39. 538 | user120:$apr1$NEgOG19t$CjfmPSbrJqUx6imCL4WPD/ 539 | user121:$apr1$rEzCqOtj$sSblCTbLq2XDMTeDjYHMu0 540 | user122:$apr1$Bugn2T/z$gTZ/TZ24SMiL1AVQIPgam1 541 | user123:$apr1$oCnbHp3p$lXVZn0P1qWe7dGRkwiJkj0 542 | user124:$apr1$cCwY3el7$.sx/Uv4UADYdLSGjfI0gD0 543 | user125:$apr1$b0jFoiEY$BELMMlTsgKPQ8jSloicdh. 544 | user126:$apr1$cIw8xXs1$uiDYDxgJsujwuQtU9Rjyr/ 545 | user127:$apr1$UffYyvRf$IHrP6qbFVQEFwcl5BNh9j/ 546 | user128:$apr1$2wvpCP1I$vudGA0I1SLgEMr6xmmizy. 547 | user129:$apr1$QOdrh1Z.$tFHoBTGKnHwf.MWzX7IBD/ 548 | user130:$apr1$z4ckUwmA$hq0/DLKdj/0PaR9uJ67fd1 549 | user131:$apr1$nPnWx0Kv$FF9VO/i4rbKiD8p.Kor0x0 550 | user132:$apr1$Ox3Y2bAv$HBZQJd7esDSp/3StMc4xs1 551 | user133:$apr1$VJn0Rpzz$7CCQCvpxd3vVsBTIQNHmA1 552 | user134:$apr1$3wMf8geF$vyqUHs9babWmAeAIHgcCJ0 553 | user135:$apr1$H6BJsnhE$sdUNxVuP0wbG8GXYaaE3H0 554 | user136:$apr1$ycXMTiTE$8cXiewb9rsL9EuNi.ygaa/ 555 | user137:$apr1$.DEY1oqo$TWeDNa7xX7W3sZWNTZKjG/ 556 | user138:$apr1$QTq2YDtZ$3b9BdtbYMbObjKa8.Fvy3/ 557 | user139:$apr1$qAOAsxTH$2c8ueVqVPiKAN2ihhA/xw. 558 | user140:$apr1$cLdGrOiq$WedaFW4qjBLvBKWNZ98ik/ 559 | user141:$apr1$mY8WCPXG$8xEw.ExVVzBOa9u3lJe/W/ 560 | user142:$apr1$4l3ZZKUa$Nor5nWfN0h2HaeQwWBL3u. 561 | user143:$apr1$3J0yl1xy$1h9c1aatf.IaVJvkATLhE0 562 | user144:$apr1$UNtXqO0n$Ag6gmPaH1guubjCy4bJHr0 563 | user145:$apr1$4GJSSWxR$wNggaBr4TH94zYGEuDvWX1 564 | user146:$apr1$Wo9Y7PP9$btm.n8EiQMUnAFXtlqMpp/ 565 | user147:$apr1$59qG1lpq$C1efDS5Cyz33AEdcqNNjP/ 566 | user148:$apr1$VW75OiLp$EeU9NvGQn3l0es.EqOJyt1 567 | user149:$apr1$3mis3uOG$sXNyXtdsWoNUpMaipVw3a. 568 | user150:$apr1$J1Vs.bJ4$AULv/cwYjMeBoMTvEZXvU. 569 | user151:$apr1$.k9ZvRfT$lbGDjiA90kolu9DzQLOvv1 570 | user152:$apr1$WT1wTKP8$UDawOWZ73u8wBBZ7ohlSP0 571 | user153:$apr1$mqiUjAJl$xYZ0sN8LEwKrxU1g1Did30 572 | user154:$apr1$wMWIiKAK$yScptAfXmU8DVl6AVoAWB0 573 | user155:$apr1$dOljUCkA$pEb7LT2zG/qezaTTzd1Nj. 574 | user156:$apr1$9qhbsAfO$.peZB9DgrJqAKlp2R1Nq70 575 | user157:$apr1$Tke5EI49$2suXXCRZuzJvjJ7QcJQMU1 576 | user158:$apr1$goNotyBA$/lhn.zMA5z.a2VF31jaO3. 577 | user159:$apr1$1MdFKwJb$/MBNPsDN66rZdg1SGQeKj1 578 | user160:$apr1$B3uB4Hl/$LUqRKHuzcnb2q6xwqVok11 579 | user161:$apr1$ewVqnTQ1$HkdOCIGKHYg193aUfQuer. 580 | user162:$apr1$BiILrcFo$tqGhsuOrQDvg/JPV00RSd/ 581 | user163:$apr1$dLMwXEWa$Hq/WjMSgbxkp.wCelyfRX. 582 | user164:$apr1$aMgvovYi$op3FHJ5OuM2tS93TKnhoc1 583 | user165:$apr1$GanQOcQh$G5qdkoizpSOjWFc3PeL8D. 584 | user166:$apr1$GF9EM5zg$whu07gAcDNRBfRInKdQz2. 585 | user167:$apr1$jDnIOwmz$vBkkiacYuF8kcp1Nw3tf/1 586 | user168:$apr1$mwX.ezPE$58Q31F7jya8UTnrFUzwO41 587 | user169:$apr1$wcsVK7PY$iOErsaSDD8l478QPn/ecp. 588 | user170:$apr1$ON3zxaJ9$4K0aR4n6JwbGM8jiE78eo1 589 | user171:$apr1$KIIvW1ib$ZqJQRoEoDpx30bt4HkZNO0 590 | user172:$apr1$xLTFhFu0$wgkf1zwnwG.rwUGaHlzKK/ 591 | user173:$apr1$S8RvlMwv$XKeXw9RfHH163LjG.yQ4/0 592 | user174:$apr1$E1WhUznq$qUOza3gf2ZzUohYpnA/Gt/ 593 | user175:$apr1$zSbUMRoi$EJKnTL40qyiKNTWdOkg8K1 594 | user176:$apr1$vkxQrmli$gfLBcPOpLI.x4BHcGgG5o1 595 | user177:$apr1$i74JdOeY$l/rxskCai9U2yu6QAuYiP0 596 | user178:$apr1$Ucs2cgJv$ltZWhw3rvDThU3h4wTiMR0 597 | user179:$apr1$PJ52qkEa$FVxkESgiPU8HVk9CVr5Aw0 598 | user180:$apr1$iJhvvMzV$c11ZLkLbU3oTL0tO4Uc2b0 599 | user181:$apr1$Eg6C/017$PBjnkuRuhfwSMso1of0CU/ 600 | user182:$apr1$DtaGU5uw$wj9U6W39HosDe4d20aq9b0 601 | user183:$apr1$Hu7E7fh9$ro5jNBVSUr7P3xXB7bWTs1 602 | user184:$apr1$kIAtp5Qp$0mGyQcPNotlS9PXmD8VLX/ 603 | user185:$apr1$yz/u5zIx$TcuTnX2cLRkGGPWuQ1DHe0 604 | user186:$apr1$zIlMHa5m$v.HKzAXRicCxQlNwap5r5/ 605 | user187:$apr1$kf0a2hjv$.8kEpY7NyyNfBs4Udeu2T. 606 | user188:$apr1$2AcSlaOt$PdPz3ooJyaCM4rD9AuS4c/ 607 | user189:$apr1$4wioa3Us$uaKSWrWjJlqHdsqBdF7Zr. 608 | user190:$apr1$4D9hzr6I$PsnXK455GeQ3NCdOHmoSY1 609 | user191:$apr1$rXOrEHJ9$atQhaNEYAfdzht02mRZcg. 610 | user192:$apr1$i8PdGfO7$Xv.aSLFQjyqbJ1KnM9hCs1 611 | user193:$apr1$I2xWkhl3$oth511sBJphjpr0chWodC1 612 | user194:$apr1$AGNgrF8B$KBcUjzo9d3pXFNsUCD6Ur1 613 | user195:$apr1$zuNtiCs2$54MqesBdp3RoL98/fklXb/ 614 | user196:$apr1$ZK2FB9JV$8x8Ug7Jh3oWXgxWrLBuhr. 615 | user197:$apr1$UoqGMAIH$bEG70EwRgt0SC6h5nr1wY1 616 | user198:$apr1$DTVm48a7$KE/H8KTGE0gi9wxM.ZzOs/ 617 | user199:$apr1$0B44zHt5$Xsbx3F0DtToD.KHYc5ViP1 618 | user200:$apr1$2YOvrTZM$/n5Fol4IfYqLv9tS/QWWj0 619 | user201:$apr1$2YOvrTZM$/n5Fol4IfYqLv9tS/QWWj0` 620 | 621 | var textSha = `user1:{SHA}D9rQ8iK6feNAniulHNKdr5V38ok= 622 | user2:{SHA}KS7VQqgAnMUfXgWmFCCa6DVhY+M= 623 | user3:{SHA}mzD9ouM0P06arY0Obdb2KojkFeY= 624 | user4:{SHA}2HrOk971ockoAr1Ct1o7GpvFLdU= 625 | user5:{SHA}IyrjpSzIjrlLT7KjVh1q1LBDCFA= 626 | user6:{SHA}gh5ZdWJ6UypV+CRv8Kd0herEe8U= 627 | user7:{SHA}19j8b+o4MIImvb7zkv4gncUWs1s= 628 | user8:{SHA}u5hjc4kFFwv2QrMa49uCmn7RmPQ= 629 | user9:{SHA}Au92ail1kvpgW+HC4PiuJu1Yays= 630 | user10:{SHA}KvvqIY6j/LU3D/orcNYioTE4yOQ= 631 | user11:{SHA}QftskBtqwp5hsovHb+dGB7azRsI= 632 | user12:{SHA}vjUxr9fJRAYTdO0lZb83C2z0FKo= 633 | user13:{SHA}FTguhILOzfejAav4aWK2X4D51qE= 634 | user14:{SHA}7CPWhF7FKaS6fBC+zAuncRjVDOo= 635 | user15:{SHA}tHLz2JrCsGMOAPUh38Td1yP65rI= 636 | user16:{SHA}qTzg8xc+MFLHwsR9DFVuUTPiFA8= 637 | user17:{SHA}BxtDkfZMLEfKDlqluTcU/UOFknw= 638 | user18:{SHA}cnCoTKX3EK7nIA+zmxcu3ovItrM= 639 | user19:{SHA}pBahyhKlvfj+JoJNul/LNITFz+A= 640 | user20:{SHA}NQb47c348gpwiOL+NqztAYm6LVQ= 641 | user21:{SHA}Oy/RamubYWzVZ1IxxiezV5G8ODc= 642 | user22:{SHA}gN1LmPBMrRxZkzhipSu/vEKgqnY= 643 | user23:{SHA}zMx1exH6oGOtF78Y8ZY7KPp2E5k= 644 | user24:{SHA}5wQp5hYE/N3i/i6Yjz97fBQwh/s= 645 | user25:{SHA}quy6WOPSGssG33/XYI1GjM1EcSw= 646 | user26:{SHA}rmbzU+tedWkSg4z19JgtmpXoO60= 647 | user27:{SHA}lCe4FgTHpkpOhbCp0K5JqA5Ze9Q= 648 | user28:{SHA}AJnAjBWd4U8wze/raohAgH69VJk= 649 | user29:{SHA}CesAlg5KhkapACkKNGlfyDZu1RA= 650 | user30:{SHA}K3p3TiyMMAcQ5vVa+dGNV3x4dXs= 651 | user31:{SHA}w5xupnv3GzEjrZeRTaN/BAIwZG0= 652 | user32:{SHA}5i89qVd8KDVGIj/6WCs42qiLz78= 653 | user33:{SHA}dyfp5ehLdcgD8DV5OTPFMOgapMw= 654 | user34:{SHA}nPBPyIWbALLxg9JZQfsMjS4RcwU= 655 | user35:{SHA}Uk8l/rcR+Og3uJP/+q604N8MY40= 656 | user36:{SHA}hIoJ2Qv4wRE3IOC0T+2PhtuhIRs= 657 | user37:{SHA}zoSpRZj3pbSShQ9O/SQs+72Let8= 658 | user38:{SHA}6LIl/XA9I2XAqwjj2oyYbAGtbOE= 659 | user39:{SHA}+04wmC0awrfmGiRG+HJXjzB3ksw= 660 | user40:{SHA}8ppTyzpxZSWxqsnvxLtFJrvJV0E= 661 | user41:{SHA}7D+UYPYha3+V5/PRn2lmCoLkE3E= 662 | user42:{SHA}DdMdedbyWGN2wXXkFEiaq0aH9r4= 663 | user43:{SHA}apgv+JsqqKiGnwxX93atjb/XRDU= 664 | user44:{SHA}7k3SGIwIJzTmBgFXSlJuO7OvLx8= 665 | user45:{SHA}jTKQDFGg8jCZfA7Z7NTvF9ayFNQ= 666 | user46:{SHA}9Ugo2jB2WaxPh24gPzBGY1zk8XA= 667 | user47:{SHA}VziiTWLQk/9DswnexDFgWnA0i7Q= 668 | user48:{SHA}4DANwobCvUtq/rIntyXbGBRx1Ag= 669 | user49:{SHA}3Hrb7SJv64iKtC6+p/hkSwt7DqI= 670 | user50:{SHA}mhvtao9e4qlisxYyuFvpiDgk9AA= 671 | user51:{SHA}gOUVpYSGfZS2G1e1ETbr9xh3s2w= 672 | user52:{SHA}uwszyh+dmQGG7TTF+og53Ktkoxs= 673 | user53:{SHA}aARgf7klVi/pz8VN86UyQTGzz1Q= 674 | user54:{SHA}zsl2jAqcqruDzXNA8N0mSLUZbzY= 675 | user55:{SHA}UTUesDbSS6/GgPE9iZf3lrCWZTQ= 676 | user56:{SHA}l7my97BzljjfxmBiJckh4YSyb98= 677 | user57:{SHA}BvqybCxPG+FdshJEASmykXCKFJs= 678 | user58:{SHA}8vtQDuXJUEzst96ogzkYvG8uxng= 679 | user59:{SHA}Kdw33gVp/H9JnSZLlWsnPsima8k= 680 | user60:{SHA}pngHweDVwzvWLbkxKI0jpOFMTM8= 681 | user61:{SHA}BVd3k63K6BSYJK1B/hjI8yNXfN0= 682 | user62:{SHA}smmoa8r9gdt2lp7HcRV2K5/IIIc= 683 | user63:{SHA}mQqcr8Htt8OdiJfi6ZATYKrThEY= 684 | user64:{SHA}+r2NvWFQ5X+4vorvec9K2mFDuOE= 685 | user65:{SHA}sEmnRhZegMdBDNnYnyVB47TeLdg= 686 | user66:{SHA}aSdcYgX9Dm3KW/Za/tlT57vxgEs= 687 | user67:{SHA}Mw6kTqFaODDOJj5VpTT2ch/YmeE= 688 | user68:{SHA}VUcPEIUzSnM4hAcg6rxZjmLVDJ0= 689 | user69:{SHA}ZLBhQrXPeeuv1cCPi+7jJPxgXVI= 690 | user70:{SHA}n3eCpjIH9zhOq8ZPlEXJu6p7z+4= 691 | user71:{SHA}rV5kTR4QT6OUb5x34+U4V7KCLaY= 692 | user72:{SHA}7p5fBYB+sDLAAUlXN7mRGpplD68= 693 | user73:{SHA}cTgM/9Qsi2NMwHIVfkRcURDXsdc= 694 | user74:{SHA}yxMuwJUB/2qDA4nryzDaWwDTwkw= 695 | user75:{SHA}eRz741UJnWDv3as1Zr2hXD+V5NY= 696 | user76:{SHA}cgoLdQ4IZQJsWhuAk+JCTQ8t9ro= 697 | user77:{SHA}fySbHcTbxJwfik52qAUS8rI+hzo= 698 | user78:{SHA}lzR3In34RL83gu8qY87y0YHheew= 699 | user79:{SHA}15alyIIv299z3WG9HSMyypwPHrk= 700 | user80:{SHA}d6DZQ826zlJxap75+uEuReJ4jTk= 701 | user81:{SHA}7KJnN2t/mNwfOL+l3iWaxOhxoTM= 702 | user82:{SHA}vM6SgURZ4FWN09Qkhg9GKfYNlvI= 703 | user83:{SHA}Opk05mxS7TatlO37aS/U9IIVQ8g= 704 | user84:{SHA}C9q9Bn45z0QrZmQ39373SmzvDIU= 705 | user85:{SHA}kVVGcThWup+til7v26KfKky9tF0= 706 | user86:{SHA}8vG8fcwUCtnsSxWNTQOZyjmMN9U= 707 | user87:{SHA}rTkBT+vWAX8AkrMCneVIoGWMPIs= 708 | user88:{SHA}4z+IIfZ6CC3UooUH+pntq40RGLU= 709 | user89:{SHA}97ep9vYDA8k3ULenovM1JUP/ZuM= 710 | user90:{SHA}4LkUGAH8SUWCmhpgSR+UoVEuoIU= 711 | user91:{SHA}VMb2w8BIouL+pnejIpju4YvSFrA= 712 | user92:{SHA}TDOwuWHnpr8IWec4G4BV0C1dugY= 713 | user93:{SHA}YU7zF05TgscOFcJyYpoQqYEsYZU= 714 | user94:{SHA}0q/yO/YHEg+nTHaZj9wUMpYXc8U= 715 | user95:{SHA}XRyWxrZ4CYOdZetXUtoBNOYBgkA= 716 | user96:{SHA}B9utQxyZ22KOIV5ucDFQOQBHOmI= 717 | user97:{SHA}pBSxqpqhhW+Gwpq+mPNsstCr8tM= 718 | user98:{SHA}lLeRG7AY/3SvGfvIWXrJLuAFLHo= 719 | user99:{SHA}QzZbE1LP+9XcLOc+2FxJuydCQZY= 720 | user100:{SHA}Ycbe25pEYtUEXhwcEhb4KQjdJmU= 721 | user101:{SHA}bIPx+G5TLj+NPl0MfyVy85moTJ8= 722 | user102:{SHA}ooI9TrVVE7LkLKm5UWwTZT5NDW4= 723 | user103:{SHA}bEIqh9ertcOn4weApT0AoOM04oU= 724 | user104:{SHA}o51ovielNeyLtb8WuWL0r4PNXus= 725 | user105:{SHA}kJDexedKxfHbXeo9MDBUZgagMJA= 726 | user106:{SHA}Q5t2BVGrnc6e0WXfX3dmgPeFdw8= 727 | user107:{SHA}2gUrA8RSDeAsBqTLEjZdaMn+jgo= 728 | user108:{SHA}7/hIGwVORnrIkQ45Kam+1bQAvzg= 729 | user109:{SHA}Ys9f3svSIg9qsti6VK/KO73Whyw= 730 | user110:{SHA}wFrYvAKCXwBKqeLvEN/vpLPDqiY= 731 | user111:{SHA}jCtBfLQYgycvbgwtlsTk0RaBcyk= 732 | user112:{SHA}1ndFd2yaVGQ++IN3o4s7nhmJd6c= 733 | user113:{SHA}3xG++i1ZRHjEAMWIwuLa/lln4Os= 734 | user114:{SHA}lFkJRnfrNTNxWWwLVuS4TDdDT2g= 735 | user115:{SHA}xuNHuDtaTcimJJfoic1iM5V3+74= 736 | user116:{SHA}OZ1xZJTVdEVVKSOYEUWsJInUxoY= 737 | user117:{SHA}LqofIkTgPad+sr0Qfmh5xmd7F7k= 738 | user118:{SHA}tzixFK8WpqP0bM0qS5sLHEurrm8= 739 | user119:{SHA}H3PBIct3rsU9JIPys8flehjPd3A= 740 | user120:{SHA}HINCI2ECClS+2vjbEyE/KBDrz08= 741 | user121:{SHA}T2K08XkQmxOIIFMxN7QN/dHtaXk= 742 | user122:{SHA}mMOZxFazBwasFq0MdAVvMQw5b30= 743 | user123:{SHA}BrQDy1wpNzHm2EYj20X3PWbtGIc= 744 | user124:{SHA}POdeGoaJ4u9dDL7+1aSpKG7u7Jo= 745 | user125:{SHA}J+YDaKhmEbjYz71UaVshKoCxg7c= 746 | user126:{SHA}g9Gphl4ckCSIFal2qP1G+WyIWIs= 747 | user127:{SHA}swnIE5GKm3qcHsCdYAVlR9vfldM= 748 | user128:{SHA}cu8KAzVlpHUeCIDL3dDmhoZwu9k= 749 | user129:{SHA}oDyWybc7jVPlmqA+e+F4t/thfRA= 750 | user130:{SHA}8Y2mGtCTaGznCWYhA/K+XrejBB4= 751 | user131:{SHA}digyAvFugxt+pDECZ/1XMyHysGo= 752 | user132:{SHA}huAd/hD7INmNYaTrOKbS4auA4Yk= 753 | user133:{SHA}JK5NmoqlEpzEtwI8cyILiMh710w= 754 | user134:{SHA}t/RpkDJt44MYi97pB25RABGCTdw= 755 | user135:{SHA}FW+1cwXfHQtLjBjt9EkBNwnuHnY= 756 | user136:{SHA}jTj0t+mHSGoxWFexu7ac+v8nHCQ= 757 | user137:{SHA}cKdPr0oYieZ1qSvGpMk7G6hB7mw= 758 | user138:{SHA}7rCX8u5lLwCcAzDReeSjlU/QkgI= 759 | user139:{SHA}r8kaguSOy20qHsPRkQ2uMzKasM8= 760 | user140:{SHA}V7Hjc5P/zB+sxHcqKPkgyodAFT4= 761 | user141:{SHA}YR60ptREeIpQv0B4cho/t2kzODw= 762 | user142:{SHA}zwfYrgeJ508R2yvS/SdyZPNUuw0= 763 | user143:{SHA}pKvhH74q06+iWSbsIg9jOqLIOuw= 764 | user144:{SHA}LYBr5lIErSckQ/wKA3+YEZin728= 765 | user145:{SHA}eXKk+N0xbstCZ6FV28J/XtVSYiY= 766 | user146:{SHA}k80oUNvldNqQwDvS7n9/U7uqyAA= 767 | user147:{SHA}nOQ2Wjlc5BGlvX5BfN+RMbH+mKg= 768 | user148:{SHA}O6wvUOWKPtROfqtXZ4TMjlJ/Eqw= 769 | user149:{SHA}G1oAkkte9vKp330iZKVnwoyV/FE= 770 | user150:{SHA}6Fys40HEBJYb58Xk4MEa3dYmfh0= 771 | user151:{SHA}V0QFZ76ISexnBTXJNn4egImklsI= 772 | user152:{SHA}O5XnrX44sxaey9uUvGLkJQXthkw= 773 | user153:{SHA}uYqLu0+hCAVauHxHhHj9S8K6dLQ= 774 | user154:{SHA}bNXP45UPcI6hnkXMm9XNE4LncRc= 775 | user155:{SHA}u4yMsvZEFcal38qQSk6pK/YeljY= 776 | user156:{SHA}5xFv7yRZIk605O6D1cn52caIorY= 777 | user157:{SHA}eMiZn8p3ZPwXjrzScxmVZDo5W6s= 778 | user158:{SHA}kjiXjei7Tjszq9RunSYjJ++OUHM= 779 | user159:{SHA}TPcur6LmXg4W+FcHKhC2JVIDnwI= 780 | user160:{SHA}2EckYONFyUcDEqgkPhbfah9cHK8= 781 | user161:{SHA}/3sW+7ineIj1jOU0Dby9nP3ZspA= 782 | user162:{SHA}9mONNF7CArnydjmwkhfQebkGaOo= 783 | user163:{SHA}rGImsJEm0Pd8fbE40OBmP6VGfIY= 784 | user164:{SHA}Mf6CeupM9fas594sId4LX2t4OFg= 785 | user165:{SHA}HxRugr3cGBjQB75CJ9urfWG9YSI= 786 | user166:{SHA}Nh+ikcGOUUgInrJh0iHlVlBmsrw= 787 | user167:{SHA}3BrwZ+qGvcyFB/Lc/XDfOFWwxXQ= 788 | user168:{SHA}8mvvCcUzMnsapzC953/XCxfOT+8= 789 | user169:{SHA}3X/lD6ATcOaRHopH+6m27+LVeIM= 790 | user170:{SHA}Ttiw09bDmyeY/YhY0H/YX6MrHWY= 791 | user171:{SHA}wpd/t9fl65nDq3cSCmRYwv9v65E= 792 | user172:{SHA}pltR0K3LNrS/qOcwZjzTlXpmw+U= 793 | user173:{SHA}mU+OEwW2NBcebLfRPZ9C/Ki0vCI= 794 | user174:{SHA}sOfYGqpAMRqXD4e69F6oH3IrqRc= 795 | user175:{SHA}IjbOYS0WcCo0Op0Sz+ETYSVmHNA= 796 | user176:{SHA}e61WLuSD9xNufpbU1Y8wKlgupXM= 797 | user177:{SHA}3Z41BvXKnswJCMrPj94Xj3Lmd0s= 798 | user178:{SHA}p96d7T+S9V6V8NuYLF679N35qHA= 799 | user179:{SHA}yqC6+2MiJondbEaBtxMBn0X81Zw= 800 | user180:{SHA}cC4wcJtLGRSHKlIqwkr72t9/b9w= 801 | user181:{SHA}hgNZhLC7ZcfxDef0KFz/xEabK+E= 802 | user182:{SHA}ptbHX+v+J4WVRvM9a2tlWTOIjaQ= 803 | user183:{SHA}ls+1/MdSymeKHyVoU6OJ2n9VF2s= 804 | user184:{SHA}oRqSqk2/YvT0NNWY9M9ejSNRWms= 805 | user185:{SHA}mFHUN4xN0yWhXLeHSeRxPFXNIUA= 806 | user186:{SHA}W0GRYxTwoVnywElvbpwdNR0wEmk= 807 | user187:{SHA}CVVbc3vnDGApFxvmTX+/4WUErnE= 808 | user188:{SHA}pKxQI+Q6WmVal5D8XMAy9c3jEyM= 809 | user189:{SHA}C91rFij4vkgcUZisF7TTcpMUFKA= 810 | user190:{SHA}nyzMGhYQfLMBCG7rBtXnbj0bF0Y= 811 | user191:{SHA}hw69n/v0JJf7Z1UK0hn6NcQOiMY= 812 | user192:{SHA}iTz0n/olV3SiPW9zQX2v2/sYZHE= 813 | user193:{SHA}NM/XeJbQkI57FPhUn0pU4pV6tYc= 814 | user194:{SHA}ws12wS7j4dCN+IItHQi8SZS00kc= 815 | user195:{SHA}HhYw12y7WG8xahUNKf4MHlUPitA= 816 | user196:{SHA}KrCi609b3nk3uKVCgw76/cbsAZc= 817 | user197:{SHA}uSyZbnpZu1t1TsvoUyp4TsQvePs= 818 | user198:{SHA}oLBO8TyN9/yjytrlYF6NW0o6He0= 819 | user199:{SHA}axYN5gmBWHFLDMoMf4Oj/t4ND9I= 820 | user200:{SHA}KdFYg6fHUtb8tvbRWak+g+kyk/A= 821 | user201:{SHA}KdFYg6fHUtb8tvbRWak+g+kyk/A=` 822 | 823 | var textBcrypt = `user1:$2y$05$fpu.jNd5fPlx3ggfZ2BWR.Wc3/hc7ke7LsIpwZM6/e0B6VniqFRIW 824 | user2:$2y$05$4QmbRfzXERVFyLbUdtCd8ekz1pAfNB5ZsmXevnKgSMc3XHqDYm2wa 825 | user3:$2y$05$.V03HbzL5HAdwq8DYbt/JOVi/crBiqSXvsgNLHucGLLBpApHjK0Di 826 | user4:$2y$05$/jwDvqAoKjNWwRpUzyLvcuhcSloP9tjxAlPfAUlVvVtmMpBPEC9s2 827 | user5:$2y$05$yVjPeTy8/FIUZAJWSSmnAO7GsWHFA2jVeBWFF6Y6RoWEpoxGxtFzS 828 | user6:$2y$05$Uz/8nUK2oWYfFMOoQhLwE.o85Gafb5u7OFEXRNMZkelfsbTtsdi3m 829 | user7:$2y$05$QSeGLMX.BNEWjt8DwcbUYueQFSfVuf0gwcSu/T7zOvpbbRDnwt582 830 | user8:$2y$05$nC1kboym4OaWP8cc3oFEEONouDrId2o40NC/C56c053rOJwGBqdyy 831 | user9:$2y$05$KFX8G2lHpD/LrSTibb/iX.4QX..YIwFj8GnoRWLEwRwa0rZNOnikK 832 | user10:$2y$05$7n20IQEM7RsnxRBn5ds2ReFfkXE0UhkBB5XW.iIA2JLlhZPQTGmOG 833 | user11:$2y$05$EHl3eN3r7/iZKKboeY8y.e9La6ml6JEi8kqL80wOI5f.8/KsT.sDq 834 | user12:$2y$05$Ry11P2IUf7.UGz82PbxGj.oSQaicbeKQPkcvclA5oCb33pkP2Ek4S 835 | user13:$2y$05$Mp5n.vpAZ82i.XVzFDY4Y.dwwrk77L9rk.ZqJ7jYTMLkfuSCohw96 836 | user14:$2y$05$/VPBacHpWoMJaahkq7awD.uarLFUkbNFBfT8wIFrb1zhfg9CpdCum 837 | user15:$2y$05$nB38MWqy2iwUColqIJ.I1OloxpIB3TUNrc4hvufeosSPIMD3qqtpa 838 | user16:$2y$05$5KQoqgOOYc71s4QvTqg8ZO25WO8yDVx3g3Px96JWmu7fc6ocwFCgu 839 | user17:$2y$05$ZZu2PGdDrylM20olrR6j9uQy0555GAzQMPDLZwKxzS4Sh6nasgqA6 840 | user18:$2y$05$YBTVQ1cMDPzI6bHSOTyty.CKWmKMck4Dop01w0HnXO4LmxG503blK 841 | user19:$2y$05$f2yjibPOiBMsNkiXQnRQneMSdvsg7QzCgUkJNL2pAJGeVrJOxFx/S 842 | user20:$2y$05$OXCKpftzXrsbmvgx2zQxlu2EhOpX1KvuVdxhienfxmfY4fZpODjs. 843 | user21:$2y$05$p2hv8h3/12F1VyZPFb.CmO5Hk5lPof/la9fvBwj24sTRBw/3OxNAe 844 | user22:$2y$05$J4Azn9Gi2DoPrYes5G2le.JZzFSJDLCI7RpR8N/uFD9z2A7o8hRkO 845 | user23:$2y$05$Zwd23lXN0R.zEmT9cDGF7.iqxW8NbLVxSrwPzn22N2EZFCjYyq0Ry 846 | user24:$2y$05$VsTetsE8n0hzFj5tORkklu2K3dy2vFWhZz9yBicf36e0p5DbUj6a6 847 | user25:$2y$05$rebFy/Me6yRqeQE0yQiz3uXmGPc16M0rSHVzlv3as.P7WEdrtC1i6 848 | user26:$2y$05$p9RZpnoQb4RqJDTByGjZQupvOeAG63A3gt5OewQWefayCW.aCsx9y 849 | user27:$2y$05$cvqRVup2fO/uygOTy9vTIuWUaBLtT1mXuJrFuJCEjAkjFKo4R8dzC 850 | user28:$2y$05$Q/eCxYpUEH9pTHPGIXIuh..eT1OJ7u44SaQlub1VzM/ZzT4YCLemS 851 | user29:$2y$05$TVU69Aqn3ii9Rr6jKrEq1eMdrkNbdqLwzkBG38UEOoacDmnzWykbu 852 | user30:$2y$05$yRULBrC3eRp.axPNpKXqu.CyaBmXHLKdlLWVs3qEERfs7MaUvLj1W 853 | user31:$2y$05$QG9Cz/BxJMceHX5rh7eqOehwynSjsLvnP7hcx1/CKjbLvKzOSp1AO 854 | user32:$2y$05$oH5mMKeiWfZRMZIooNowI.BA9IynCkq0IXRLzfUNEK2snM8jNFXIK 855 | user33:$2y$05$J3xANq9Au66dzOEzDkbUxuUF/ZnrX51EbkLoaNud6KokVEnrZ1NAm 856 | user34:$2y$05$hyXHnEENS2CXFuRna7UtpeCI2BvkcjqvxDRI1SHylVoagNTLgyHHO 857 | user35:$2y$05$PquIRYSdFTsD/iksRadiy.PHerfiURxHnXx.3WqSCuX1PRZm79LKa 858 | user36:$2y$05$8YhuTDyWXi.BTjXBD9bp9..Pakffo/6Ms/1FYHs1tX9IGXoofFfm. 859 | user37:$2y$05$AHw4z2ftObVNtAqY2ifDQ.SapTREZqpPd3.otexEd7nWwpx4G3WrC 860 | user38:$2y$05$EQMKPMeRKfvweG3LLIjf0.fU.QJIfdckuKx06DCEETGBq7az5MvQ2 861 | user39:$2y$05$7MoTa.ShO5OvRuMHbBaDkuPgF6vCDrm4ZNs3JixBomyxTAEcI/OAK 862 | user40:$2y$05$S96TthOpyBSih2M2/s/Si.S0R/K18Z9WrnU.1Jcvshf7IwJNQFSAm 863 | user41:$2y$05$ofV8eWu/gq7Cl5jeM/g8gOjxagMPBgafEcLokUQjFVjMPOtUeYb7W 864 | user42:$2y$05$oqpzIgFFdmZZclNRzCTctenR3593tQeIB2.Kng2n.77mxAZVofDvC 865 | user43:$2y$05$G4r6paxV3Vnb2TznoUnXUubqluay82LplRZcRfFPsgbrGEP1VvS16 866 | user44:$2y$05$d2J4qIkZwLt.DMuEZnztcu/rza9sfvWJ4x5orOYTl/4e1sbX7AxLO 867 | user45:$2y$05$GvzkFUAI6eVVpqAPSmgy/OyS8WQAzIEGJL1U3nRJGFgUD8LGY9rAC 868 | user46:$2y$05$0VhRbZS7CqiUTDZVwvF.ce9h5WXc2wmVcTyDTUZhVfNB5Ksu71BYC 869 | user47:$2y$05$0Aa6On.Cg8u36U/.GxZVI.hDTxsijKfpfGTQbPL0Ayj7zq6Ve5zVS 870 | user48:$2y$05$Ia.EF4y53dlX098YHRODmO3shsjof0Yg5t11V2JOReJV/EbHNSzNu 871 | user49:$2y$05$UmLUkDgUtFLZ/JSoVTbzWu7cAMwEQ.S5qZU9Tb.y35Jnh0vgNNIta 872 | user50:$2y$05$JgjmiFUGIcr7IWusuoO36egNqkCfihmrzvkYeiZznBDoOesOOK93e 873 | user51:$2y$05$VReKSINlgML6BOqS8jvFjuIj1sS/4mTTgCZXlqX1BW8GVZ9qiKNCm 874 | user52:$2y$05$ow.TPBduyugHa3whAX90ouL05LtRjCN9Ero/2W.qRVXbcDFt.xgSK 875 | user53:$2y$05$wuBbsrneEjs.HloFV0jrF.J4E311zZS2OpUN46Hs8r.jv8rxxBm72 876 | user54:$2y$05$k022XhSDlXPzG91vP6wJk.U.nos5dCfr.nnyxkFkaCPphyYRy8wqG 877 | user55:$2y$05$2.7736YD25ngfQjTw3f.I.dBeXeuelhD.6pDzSs624d9Rhn5wm6zW 878 | user56:$2y$05$vs4S..Iw8DZac0gPbVFlROt9rMZTwQkBDBVeafBPC3QZ.PQ2yrcYy 879 | user57:$2y$05$3U8kq/6QwtAMX8gQcnqGfuDLa9T2.LjXeJasgB6jxEqeejBoolHRK 880 | user58:$2y$05$IQfXyv6F3oOCx0CJTmm.seXeDTjsy2A4dpm8nu4IfcsOGEfulidbm 881 | user59:$2y$05$I711r.W404fDV.BFMf1lcOW1Ui0t.VHP944JBtgHOZLFumPWFhLd6 882 | user60:$2y$05$Y7589tyt.8DCM./Qd7zNke3lqrE2/NVOIwYHUWndeG4b8H/RxfOgm 883 | user61:$2y$05$Ppig7aA.K7QNRFzJSLqtsOMyMOsZ1q2zX2ylaiBHMw7OuBymV2FmC 884 | user62:$2y$05$h5ywSTTkq/OO.qmZCGLO9.u/DpWgtfPmQV9iWuKolim3xxg1FBxe2 885 | user63:$2y$05$2J3ilSS54gUgWd2QHa3Za.AJ2I3U9qwa4Yt5fCOZXUtZC64c6CE1q 886 | user64:$2y$05$hArtMCE/kwCP4A8qpUk7C.dUpBN64BEWh4S3JLVwk7juqyi/TbiQu 887 | user65:$2y$05$rjaN9UndVJkCn28n/IxFC.Z9ZZaXNyKta6IOi.YMfIQneIjRYW1JS 888 | user66:$2y$05$RvjpQJ0c7fr1oqhidGnZhul4xZ4Wz5OOxyoKZS9zIJd04PFxOKKXK 889 | user67:$2y$05$KW7YOYlGCj.xILSDc2qj1ukAbLP8T1j1C8CdvV/fubqojMHuUROQq 890 | user68:$2y$05$yoNxBJYVpko7Tdl4wlUiiO4gaPISGiJ2hYMEGdR.iJ3EcfKLHT7Jm 891 | user69:$2y$05$IRQm9evZEMNLncGSRd0aH.Qsb21GH0B9wvjqiZ3vwxenyM0lwVM1y 892 | user70:$2y$05$FyjSXqjUxZwXF4R5m6c4qOyFKqTVwBv/0ZeRN0jDaUvufm9FL/Lk. 893 | user71:$2y$05$7rNZytgyH2HlBGsF16rZjOMHMELgT05vUidO2WGJTU11Xgmgcf4Vu 894 | user72:$2y$05$emeKtLWD/6e72aIkBMHRROCqx21mN.Gm1x.5EPFn5Lbyms9BfH.0O 895 | user73:$2y$05$R8uipqZiBjQz9fLfskIIT.9KZcPmr8qHY4AEkD14vyB2jXuQmyJPa 896 | user74:$2y$05$T2pEQR1szpQ47GbwDaA5qullwCIeDq1BG1a2ceYBSdAKXnPH7/doe 897 | user75:$2y$05$KF3l/wQFIlMBzieNfFogs.nk4YC8Vw0loswEo2DEE9Syi6WAvf.S6 898 | user76:$2y$05$Nml8AAAQKado2b863fFxR.S9XCFuLuytdIrsIvL/Br5A5mrjJsTBa 899 | user77:$2y$05$ip4kF7zLCcJD9sE7Q9ef7On2AE4R4W8tvanyFEXMG.WLqFGdntJ.e 900 | user78:$2y$05$2ovSeGnlvBUJqcLlus8spex40G2dHaUAN/QarQtEUNn1nbSj/gAs. 901 | user79:$2y$05$p7I29qcE.eQPBecOCDe7keix3IIAbzqUu3Ir4s.g1Oiz57IclsIJy 902 | user80:$2y$05$JQoJ3yuvIlAX/IZBWD8juOdcHFpToKj5nXvNi8u2R07rbdMVTGBzW 903 | user81:$2y$05$npr1gqlBk5MfC1xxMa/81.Fvz1dQClMf5fkX1760ZwBsk9Z1C6JyK 904 | user82:$2y$05$PUxmaztoq6LEvEH7Z1lVhupdFDn8QAC9kZJZhn7jWvjNH3uVlsWIi 905 | user83:$2y$05$JCFzyR2crPQWxAUGbhOmxuCRvPtWh9DBifl6BLqxjtIgYA6t3.Y7. 906 | user84:$2y$05$Zlm7cBEHc82Cr45U6s4mF.yns7SIbQfzvud8zLn4JIzuJrfIN5uD. 907 | user85:$2y$05$vnXd3b7mwQBHvhM03QyROus/aIvNWzlMbTbd2Scaq0jqz8wixqzSC 908 | user86:$2y$05$iZeCnIlKhbGPM1CyNPhPBuSA2N.HfdQ3PptdHxMiV27ztq2mqYWj6 909 | user87:$2y$05$lrZkYmIAS3wi/7qoYDVZf.BGqYjJi5HrHGYJeNCYNrddTBoZbKwbK 910 | user88:$2y$05$xYkdPF.werZJ/BlsCu4zouTSRGlMmx5ZVATJRcFCpi.BwLdIRICMK 911 | user89:$2y$05$cPWffLKZediydMyTmyfWbunBqJKrbiRbg8SZVOGfoGlHII6o3IkcO 912 | user90:$2y$05$8rvpHcG22H4suih5Fg6mHerW8wxYyIgB43ZDq.OMWVxOYfo/nyquu 913 | user91:$2y$05$MLrLmkwjOMAYEtWnCw5TDeWY4Ue8K7pKQK/ZJJZSMKGq6kxl9tLXG 914 | user92:$2y$05$cn0765.8hUJO/1MogfCR7Ol/frYuteDprFpIgJl9J9QQGIYRnjMXq 915 | user93:$2y$05$/aZy1Cry/kN5CMzA96JViOLEwXd7u1Aadmm3iPr5QNuaM72bOjpui 916 | user94:$2y$05$iN2UCtmqV7klZdZOHb.R7e5TYKijn5NDkE.os5hvemoA3nwQoeJT. 917 | user95:$2y$05$NjE.eJP0.jWObEol7gNBYeVQFi1/aovArVQ7x9DeVqmwxWBqt5o5i 918 | user96:$2y$05$41JNXQpdNJPkiOBM3F1PXeTlu/T.hgI1bZEQhe/pf0eCXDIpXS7ei 919 | user97:$2y$05$OAxCZPaPALCAfBQvoSb3B.udhGRpmH7RdCrGKZTXPqXQAry4v6Qfm 920 | user98:$2y$05$zUykSYNsiLVEB.f52zRC.e8sXXIkQPy5Shj/4mPPyYwsODX6GuS/e 921 | user99:$2y$05$51OkkDCIFjrvG/bGBDNo0.bFRx4RzQbnNh5AnN0oNnbp06ueJGSdK 922 | user100:$2y$05$TqRBmY9bVNdwoviMt.2o/eNxvvwIAYx1szbqtlp9sF5FxK8aAsSfW 923 | user101:$2y$05$C5Gfb24e1Vt2p8He.I1pA.vukWSdP8bP8y2wHFxPc9b1YgHLuNGje 924 | user102:$2y$05$RDnVwwP1Lw8zc2qoFb201ONE8RXGhAdcStEhpcoEtD9zjclCCGU3i 925 | user103:$2y$05$2zABVzL9tnfu8Bap4d886OoWLeW7Qu9gkxDT5YvFc8iHW4xexNuEu 926 | user104:$2y$05$vh5bmiqTDrSJ4.FcnPGuLup25v80rTU.KSAfpLCyf3WMQc/mmHZiW 927 | user105:$2y$05$vWB0WGXgQeohXNXwtpp0B.yZ1hU82QWI041sbuzlJTzDqn6dG79y6 928 | user106:$2y$05$WyevYNKgnxiNNMttQOAjVuFuO94BVvlAOqLVoky1IxMrjsgeHhvJK 929 | user107:$2y$05$wxSeMKJpmDZtgLqfnQ09QOT177hEG7yWF.6Gkm9hjj/CoWA7Rg57S 930 | user108:$2y$05$o8M8DdHSULopvLbdOxHgq.8wWfzSFyVIuKg0rPTSd.Kekhh5QPiFK 931 | user109:$2y$05$elje9vjVayPOY9K5WE6WsOVkSB82RQy2ScVbgMCZaZA8DrBKWfjiC 932 | user110:$2y$05$1YFeINEvVqmcHhnpoE7Cx.LAgAML/5UHhdnwPcIueRQkTGcG8Naji 933 | user111:$2y$05$4PAzaOnaEcVCTt3PeJIEsuqjtkV.sqOGQmCyLCH7dxUOoKxvzYtz6 934 | user112:$2y$05$.PgLHC9D6Lx87FD4zMtj8eYE.RXsXqIfBJy4pvUJ3s6F3E55HABGa 935 | user113:$2y$05$/Zl25uha8SuQed5cpnJgB..fy3tGi1b9BrDRfwOFwFe6Xm99ywVwO 936 | user114:$2y$05$vxsYCWHExy97KIr0uqlb/.zQldEGJ9b7tUwxGRdlBnuSK2Ch/9CSi 937 | user115:$2y$05$IiUlNTxdbyATh79DTVkKOeom.mEpCoolj4Hze7HuXE9iyierxW0wu 938 | user116:$2y$05$28uYLgKrXKMoXD//2/DuC.yWORZ7bmvGe/edVT68wGRF5g2tEY/46 939 | user117:$2y$05$Xqw0nSoJcwGOhV/ysuEKG.0MP6PL5MAypXTvlER5hQcN706ci8SNO 940 | user118:$2y$05$7LV5GmyW6OsZO9/2WIWvW.PP6Nudxke6irVZpJ/1XBsn86Np0ya62 941 | user119:$2y$05$fsiHzJCe920m5s7rXm8XdOaXm0//n.B2IzkoP4yMwnWhkyiALfvcO 942 | user120:$2y$05$IX.gWZo.Wqjh9Iovo5sweuPM0ajoEf.RMhYkZyn2JL2lkGi07ft9. 943 | user121:$2y$05$2FYLncq4yV55YOpLP/wJdeoVGAa3BjDR7krPE097eSG8gde/eC0R6 944 | user122:$2y$05$0Nxu3s2mO5vA.BNc0fxvB.KkgXEjFUQjcHvwhg3ZYF.6xJqeBZVKi 945 | user123:$2y$05$aXGniNsIWKP/T67g6Pcx0udcqhNI60a80f.WureeWkoANKt5FgW3G 946 | user124:$2y$05$n.phXNC4bIjaXOwgnIlJ..D2AVGyC5kF7XMdvQxiXntJlHd5vJ1.a 947 | user125:$2y$05$e08FDibQZ0etegypI1VbnesPMDSq2J30usqlHWfvFXgPBcxCXAvRW 948 | user126:$2y$05$XR2gWLZyqll7CLoBBVgcquGJa7daRfuZYu6UmFHR.lm/AH.zacwCO 949 | user127:$2y$05$TBMOzQV3M7oylv3vEEIFZuMUnE8VLPbWCVj2E6ZVTYX0WR3cgP44i 950 | user128:$2y$05$QG16ACPoPgoWCM4x.OVkMuRgJFWmG3ju48kgqxTi3jKXOa2JrU7jO 951 | user129:$2y$05$2zvNfbv3OtAfpserCAHuEOjV5VnjteIpFQL0E4YdDhDjwFyo3BXbu 952 | user130:$2y$05$J71u6qftS8rgZaf2ZbsnHO3fZspP.hxoNwqORBTLCdcUs.O/cXtLm 953 | user131:$2y$05$g986dBMr.1xh7o5CkGIpsOZFzEQXKa8sZ/1zPSNIOLu9xtigzb9Am 954 | user132:$2y$05$Zin4JporBoAOj4IcI68ZmeDrEm40eKq2bBpHx70pL5V8N90wSlocG 955 | user133:$2y$05$MJ2Y1Zyq4KPwcubkZ4OkHOYVu/WHE2I3yS4zeDMVrKw6QScGa5p.O 956 | user134:$2y$05$7D69czCOO.ue7FOqOItLOOkAV4fD53LO560Vh3ZXFdeZI9ztFiAI2 957 | user135:$2y$05$flASl2xIJbu1S6eh6qKsU.8evfNyRhFnD4YHOb3jQG7IkU81IHeWa 958 | user136:$2y$05$HYwFWzdVdy32MFc4925GluQgvFeYYuFFo57sdW2JfXRNjvVUdoz8e 959 | user137:$2y$05$bc123OMzliw3Fs7tKAG52.dpLrXq/pLVa51zzxNTC6aoT2lB0DJrK 960 | user138:$2y$05$lzROdSwfnB1eL.KRcnoxSeHw9rvC3Yzedlapp4Linl5S4Nqp62jnS 961 | user139:$2y$05$tqpPCbpoNRPuvOD7Ft3TsOUSMjkBVCvuoNgJ7H6befM6hSFHXO8Ee 962 | user140:$2y$05$Idrf81gkXnukRSBMoYUCwua/qzATCR6Nvcd2Q7vQjdgPVn/aA27He 963 | user141:$2y$05$ivAiXWgWojZGYZxzQNExi.6rEGnFs8B9LVDly8jbS4N9AK3CvjHlW 964 | user142:$2y$05$aL2JG7sPcfpSxZuRnMVJwuAFmPyiXQRrHgyUBgsTjKSLf018ErI/W 965 | user143:$2y$05$Kqs5Yevpa1uxfCF.LiqIbenCVOeH5jIKG.FnxmnGyBVrDnD.dhRGa 966 | user144:$2y$05$x18HY2fc5kpkMAGC0c17/.7fjI/z4YxsBuR.04UDZIlOJAK6U0yqq 967 | user145:$2y$05$40qblQzCoH7Iuo8kQnkPx.1J0SES.pmtJsLxaHgMDdDe4//iSJU5u 968 | user146:$2y$05$unAahznVcDZpP0hVqAeda.Peqrlrv2deezG3fgo4I6AsBq91J8cda 969 | user147:$2y$05$o6c0UELvAMeu4d60YzffrOL4A4aXjaj1WuppDOhVmWxJScAqHA602 970 | user148:$2y$05$PA4qcZuBBvDmkoy2nltcR.ondB20vQkpuP1n734QSi8uP64Z4z78. 971 | user149:$2y$05$VV5oiqyBLpgFA8Mx3Q73Iu9m14eqecHgLZNXpF70L.IB/1dkxUNQ2 972 | user150:$2y$05$XMZ3A3J09fSaDQVG3nBZReWI.lhvywnY1MoQJeWY7gLxj0NnkV7sO 973 | user151:$2y$05$Foegw9N2dp3KzovQf.VhzuNwKlM596h8E3jooZlvK4sydyq/wXOS6 974 | user152:$2y$05$USV/siqS6k4A2EVZCjItSOOVkiCGJjUTFP5GWuwpEyoSYcOWqtFTS 975 | user153:$2y$05$a6Bme5bWs2jZ5miW/OwWTOeEMnufQke5toRgI3UeylZEh.cfF87uK 976 | user154:$2y$05$slN6WWU1G/OY5U2QmvTW9uBc.e5EUTHZhJVBSqjYwxovxszF1L9fe 977 | user155:$2y$05$wMe2..gX8czpGmZ1w5x1P.UhslzONBdj2ctmeIWb8ouketL5i4RM6 978 | user156:$2y$05$HsbkKhLMPS/4wBJrL429quKQeF/Qdcf/rAZWg9xzz9e1FaRiILTia 979 | user157:$2y$05$ZZKt/HNdOin.hroEcUN16eORw/MZVIkEB9LnI5XZn1yEa2rkwRNCe 980 | user158:$2y$05$XJAZY9u2MoaGjPx/ZXgbjOpIZDxQpKEDZ/Md665Nx1ccuuMPZQaii 981 | user159:$2y$05$j5z75UZHASfKp.NTop0pMeqEVCXyozMm36TJpyOpdtfdvSe.UMhmy 982 | user160:$2y$05$q2ovZcoy..57uh6g2Akw/u4R4DEPU8HZKbObd6UV5w6r/ShNRgzk6 983 | user161:$2y$05$5kkpP0chaCA0Dws11TsgC.qJvU.6kQnTzZgbWgonn6u/QpRYUkYoG 984 | user162:$2y$05$wXfSl2ej.X5ob39Nf6h9Oeqsu.3f4FBi96rd/zmG.LWt3UY/rrHSO 985 | user163:$2y$05$PoRCSHwtuRaIDAPrl4IFu.XQ4BZo82qSrRQ6dfj.1sBDIoh325XBi 986 | user164:$2y$05$VCdqzvFQNYVz351tBHTqWe5MGtqeQ8W6mX0BdN5ejYmDwQDkpO/wa 987 | user165:$2y$05$1ObuLcibu0t5IYEqr59fD.ZGTl71sokNBbe05YesJ1WmrDQEikeBy 988 | user166:$2y$05$VzJrKDUQDwwdLQQy2tjQreGvzJHlsuA.EArBc8E9IDdj7L0849DKa 989 | user167:$2y$05$NZPa7SOEWodCYfSXAqYk0unt4X77OHufus4l1HOF5qlWI0Jy1GlLe 990 | user168:$2y$05$HFlvCvLD/F256wCMZUBlnuopUOUCis0V8rcW5oa2MksRO2sQ60k9O 991 | user169:$2y$05$C6E2pBOz2IbvINEcnD3eZuoihoZVGzRnJ4bkfvW0Z56sPraSXqHtO 992 | user170:$2y$05$AN05MYUjH.uCfnWMcu.qSOZG9ZorKROPlOk7IjgNXKv13peLz1/TG 993 | user171:$2y$05$V4tACKJFPT4j2myrLna7Q.8Wo0rzr3vlCWIouRgz6AKxZ9D09IY1i 994 | user172:$2y$05$u2vl6vGV9M3QGGlOynsuI.eCWOgj.NfEK3a/TBupNGLS/t0fbMUZ2 995 | user173:$2y$05$.gcHT5HClXOfMpvYxjktW.z7dF0OedXuF0kbjl/Z9hq8G6LvMeM56 996 | user174:$2y$05$CvKw6kGjjmz1hr1ek6VvZOi.yEzc7yah5PWmeup.H5fwto2bgKSbu 997 | user175:$2y$05$5JS2jsi.FTkbhMFD2OghbObXKq0e8VlU0k03OQqqXygWCP5Pc3ydu 998 | user176:$2y$05$Otk4kuVJg4N6Sk.ppwVEl.RLzUr/fFdPOhQ68jJVzdZkxE4mTmeH6 999 | user177:$2y$05$ol9zBezfUmheimpVvYAGDuGVK7/q5Q1NMSF1/ph3iA1kn/MJzhv5q 1000 | user178:$2y$05$j2ASG7XBQks27NaXQ9UPkOvQwQT1cJks3gDm3c3E6pvxBU2RC/rdG 1001 | user179:$2y$05$PVDmQKnaOI//Q22C0A88H.IgwTdSwWBKaacJ91mPy/9l/.t.o17Yy 1002 | user180:$2y$05$TEh236aWbGFowb3dDLynZO5x00duGa3xDlNYz3zPTSe/ICp1Led96 1003 | user181:$2y$05$idwthhR8KpqzZ.eI.JemmuikpYwjE6rp6gIgPbPbztzWFpiqrrE3W 1004 | user182:$2y$05$bgv7RlB1KwdDc82YrY7JqOrPRWh0F5yVg67Xq5epbk1tA4hZM0uJ2 1005 | user183:$2y$05$xpv9YpSwREc14RguzkaSquJtQZDZA9mqlp3L.iZEnPbCR41Wjn9r. 1006 | user184:$2y$05$XhDVxSxipFBkP00Xdjd8cuBBLbdXIAs8M91NUt29ryvB6ttI1snEe 1007 | user185:$2y$05$t9er2Dy5F6zdk4fgXw.lFuJF1X32udmV9aSx7pps3oY9sfKgcFsmm 1008 | user186:$2y$05$gDr.uxsBEulmKBIzGdkmMO18YYYz4tpmn6sUofvpek/Hqa4lNbQcS 1009 | user187:$2y$05$oInWaewy8ndw/qXBYVEp3e9Wv12uXG6tlYulvPPtlxyCQIJ1w9GdC 1010 | user188:$2y$05$16bz5v17uC39Koc.rV97R.AmwRjhOGhCceEtx.1uFtFLFA3XDsY1u 1011 | user189:$2y$05$AP55Jluw4VQ3hW5UkrHjz./3iECPnoMFjLGelK0rFtkgkrdflF0T. 1012 | user190:$2y$05$ZsDnjCAxhgevU.J5SZKc.eF1lQIJ3gcL.n5IwgOVOFcq5QZfzjmkW 1013 | user191:$2y$05$pSMMwCuW/8cUNiOF7LqBDO32bJQE.gdAznWiCfkyYls8LI5wyJIeK 1014 | user192:$2y$05$pLa34zaUzmy4DJQ97Qi2Mu/79OnttIYtsU9O09a/qRK4QAVNADB6q 1015 | user193:$2y$05$uWKyW.hPmXgVXImS53u8ie.RYxui6so1Frk06kg6zL4.RGDcoff5u 1016 | user194:$2y$05$Y9V2kSmgnoXHCoYLxIDzGOq47Hr3frXcwHhYJy9dz/0FYfE4Uhpfq 1017 | user195:$2y$05$pA3YGc/uz0Z0wtE84BOn9OhkhqqZ9eYD4jJTuJ7hQPvjEj1J1keuK 1018 | user196:$2y$05$Mr/Wy6f850nVpk6DqBwnXefHGX8VbCbNoRzsEOeERkOHCUkxVptKO 1019 | user197:$2y$05$0wcbcdEB8/ibQsNnf4euHuBEr.sb9ELtNM/cNddIdCMyq40WgU/la 1020 | user198:$2y$05$qt4IdndlY3VjMhi2CkmUUOWhCrkUEi72.DrPIhZqynnlo4AM.M8Ou 1021 | user199:$2y$05$wXHemFAraZVila6SRTYCluqzby34ZlAMnTuC76f9ZAKHPpOV.vdYe 1022 | user200:$2y$05$m2/Q/xtOckFnDGWbPFfh4.iTVNQlmx0MZP5MURF7adM8qqtBVgC3u 1023 | user201:$2y$05$m2/Q/xtOckFnDGWbPFfh4.iTVNQlmx0MZP5MURF7adM8qqtBVgC3u` 1024 | 1025 | var textSsha = `user1:{SSHA}KHQzbbDgqjRkfd7li1NBL7kI0D5oMzBM 1026 | user2:{SSHA}OFxiAyw1TSNiyGybLyjVg+yewdhoMzBM 1027 | user3:{SSHA}FeUKUVnpp9IlolmuqfIMUYaa3/doMzBM 1028 | user4:{SSHA}mfDeU9QRfvED1gfBExrJgDsi74xoMzBM 1029 | user5:{SSHA}Y3eY1xbgHUOFKOPoiLwluYlsd3FoMzBM 1030 | user6:{SSHA}8YIr07hiZ/xCLZuv+tl/PamyNzloMzBM 1031 | user7:{SSHA}Lv4FvMGR79gPrNXb6GM0rsYr1kFoMzBM 1032 | user8:{SSHA}eI/7z5Fbz6fS55+uY4mNXDyFzVhoMzBM 1033 | user9:{SSHA}HhVE6yZC4cGYZJrjp8bNizVNkvtoMzBM 1034 | user10:{SSHA}jPcUc3pza/FTKrZwNWY1pXogrc1oMzBM 1035 | user11:{SSHA}YWLQZmFWYYRPa8d52wlNqHce+31oMzBM 1036 | user12:{SSHA}+QLebXR4nY1xqIYuN5fLMuj/OcFoMzBM 1037 | user13:{SSHA}E9DwGVpfo1Wb8pg8FGIsBLMEeYtoMzBM 1038 | user14:{SSHA}bA6g5CWRkOa2+HAdqIP53tXPrItoMzBM 1039 | user15:{SSHA}Hu10u9ozPmwdJUM9ebqDoZstZ3VoMzBM 1040 | user16:{SSHA}ea3lxQVUtjFrm/eTgkWvOJKTVT9oMzBM 1041 | user17:{SSHA}aYJ8z6N2No+WSqoJmMpCw5qRk3toMzBM 1042 | user18:{SSHA}kvYKi+yiReC4aSfym87aJsj95TRoMzBM 1043 | user19:{SSHA}SHVoHbUcvmmXbLc7k4k6O3AZOuZoMzBM 1044 | user20:{SSHA}pmu8UohVZRq9mvn6pyFv4jgmQkRoMzBM 1045 | user21:{SSHA}7+/sVrBRXm9XZbzhk55JUASDUYNoMzBM 1046 | user22:{SSHA}Fp1p+z7cuVujAaohJkgrmnLf9ktoMzBM 1047 | user23:{SSHA}U9dfaNzdeJ1u8zKniQ6Z5Lp2779oMzBM 1048 | user24:{SSHA}i0/C67599TUT9tUmJgAyFtX9xx9oMzBM 1049 | user25:{SSHA}y0Qvlh7EmJBa4m2dnfNEx/j54+ZoMzBM 1050 | user26:{SSHA}O80eZv+Dwv9Nb2J0IW84PKm+6aloMzBM 1051 | user27:{SSHA}aPYp8DM0dOv4gmtpJgd8BMQBK8xoMzBM 1052 | user28:{SSHA}C9srG/+T6iwcBN20hjMiUnaqePhoMzBM 1053 | user29:{SSHA}d53nozT1OQQa+atT7SbO4Fj+Cl9oMzBM 1054 | user30:{SSHA}6hjz/GEbliQkPC3orkmyD6fPMhxoMzBM 1055 | user31:{SSHA}4Rb7U5/frazhx06b3co8j5vqSZZoMzBM 1056 | user32:{SSHA}EisC3/gKFV3MGKJ6igxAB7PWldZoMzBM 1057 | user33:{SSHA}MtIpYndBk+ncjTvVjpjrx7hw1uBoMzBM 1058 | user34:{SSHA}k+vyIDFCycpT3V0ohh/QyraHOFVoMzBM 1059 | user35:{SSHA}HPQI9htwR+vaZwyMGd6AE7P7vZdoMzBM 1060 | user36:{SSHA}V2jfn+UdRewTpv0lTHi0YsUI7dxoMzBM 1061 | user37:{SSHA}nC8ZWb4NJBFXaJBJ2SELqt9NjItoMzBM 1062 | user38:{SSHA}I2BhFvLcOHu3kpJ4ArSAL8r+R4NoMzBM 1063 | user39:{SSHA}krXqIY0wTLcGf8wZcPTRtAWApYxoMzBM 1064 | user40:{SSHA}4l4OVj6kaQ3dSjJspefFtkLs98doMzBM 1065 | user41:{SSHA}w7UKTyr7fYAv9EP5BdF5MwzhmOFoMzBM 1066 | user42:{SSHA}RS7w5ZTbFZ4cK8WSX98yTG++NVtoMzBM 1067 | user43:{SSHA}3IV3vZpo/3Bfyn6MZvxbf2wF+yRoMzBM 1068 | user44:{SSHA}bmWZRmCB2pf0lAXTKgZiYVec96hoMzBM 1069 | user45:{SSHA}hlLhgGiThrJDeYTiSQK/wCzJqVloMzBM 1070 | user46:{SSHA}po82UhfKIkGikuNPovsI72sbgntoMzBM 1071 | user47:{SSHA}hetH7xSE8xI7zLsBuEO9ufALkE5oMzBM 1072 | user48:{SSHA}FV4R3Z4Uf8znN8C2eaFi6E7QchZoMzBM 1073 | user49:{SSHA}ca/9mXQqLEoVRSnzQR9vc/fcVKFoMzBM 1074 | user50:{SSHA}TppiH0dqE4KbmOOsCWbsJJowHcFoMzBM 1075 | user51:{SSHA}wyzYVvmUtlVYDYl6JicC5RotqsloMzBM 1076 | user52:{SSHA}Y+cjO4EZgMvWKAo+WgyAX2Q8SExoMzBM 1077 | user53:{SSHA}gHwpYMGY8pH6wEwRVw/Cm5w2lHNoMzBM 1078 | user54:{SSHA}poxdGbfnmdKvpLcQt71kZNH/D7poMzBM 1079 | user55:{SSHA}khBK9AqcZTTHHf4zLGducfz5TLxoMzBM 1080 | user56:{SSHA}b1AhE9NpyPkp2xT3yzX+86SMwmpoMzBM 1081 | user57:{SSHA}1Tq/UtIv8HVRiy3SlLYOKSpwQUFoMzBM 1082 | user58:{SSHA}5ZbyAJuunxfFxoiBJuuS3ZU2V0VoMzBM 1083 | user59:{SSHA}qAvT9MYSoXwHsO14aZxxP9CJd3poMzBM 1084 | user60:{SSHA}/0xhnl4FEcqWxVbXltMflVMFpRVoMzBM 1085 | user61:{SSHA}Xy0VSSr2Xx9FFj0s/GiGVOwcwm9oMzBM 1086 | user62:{SSHA}FnkOooLy9YklOp0WHTJRmXcTv6xoMzBM 1087 | user63:{SSHA}aBYmNsX0QeeMmCtuRq0aIJzVB0loMzBM 1088 | user64:{SSHA}kSZWJj9SJcWW2opW69EPjFfjoI9oMzBM 1089 | user65:{SSHA}8w8T0Tx4ocX7JxhgeukJPhKGB6loMzBM 1090 | user66:{SSHA}vX9Crz2xv1l4Kza/R+/VESELpoFoMzBM 1091 | user67:{SSHA}pv0YVoC9d992+Siu9VegZol7vUFoMzBM 1092 | user68:{SSHA}tXggGK/I9Bvk68PJmLOjF4RqiwhoMzBM 1093 | user69:{SSHA}GnWz4il+uLx0e/JnNklEj3ZwJeBoMzBM 1094 | user70:{SSHA}BoEW8ObIfMxBCJT7Ok3bi8+ZSyhoMzBM 1095 | user71:{SSHA}RU+1lSihMmimuwMTDNvv1fCeHCJoMzBM 1096 | user72:{SSHA}Hiw4EAZ2goue4XaSFuyXdqqfxM1oMzBM 1097 | user73:{SSHA}2tLAOEJTpsWsN2JUwKU/mRXxP6xoMzBM 1098 | user74:{SSHA}BWQhdxiP2xUJXIjJU3LeZR3V9xhoMzBM 1099 | user75:{SSHA}dCbng3IitpL7A0zPBXBcrbtBjA5oMzBM 1100 | user76:{SSHA}htqbeTdR8MBN0CmHWEOqslvZRKhoMzBM 1101 | user77:{SSHA}baNLStg1x+cmgzCe7SDJ6rpk4vVoMzBM 1102 | user78:{SSHA}yKnoi2OHHgBWw15tMDblv6xzeSpoMzBM 1103 | user79:{SSHA}Le/e17YF4WJPnJ0YIVUuzRMZaLRoMzBM 1104 | user80:{SSHA}b8eOOUjZ6jdMKkGbKlfZw6lQPIhoMzBM 1105 | user81:{SSHA}JbCEc1aY2BzLkmCD+/qM0jvEYe1oMzBM 1106 | user82:{SSHA}BNOxlQQkbBEy1HjrWxKar7QsdUpoMzBM 1107 | user83:{SSHA}eeLU7ug80NHe8LfPY+oRQLAvdwRoMzBM 1108 | user84:{SSHA}irfuv5ljgC4QOt1R3sOoXAEyhy1oMzBM 1109 | user85:{SSHA}YRDBXhlaWsA0CBRt+myBzpCj2aZoMzBM 1110 | user86:{SSHA}bZ22uNBHwnPcMyXCDbuz3WiZI4toMzBM 1111 | user87:{SSHA}egkSIVwc59/vfe0j1LZ2HJTcpc1oMzBM 1112 | user88:{SSHA}KBCe6qUEmAf8DW0a7gCAdgDSsqpoMzBM 1113 | user89:{SSHA}t4tKWxCQnHBOKeyXOef1mBTXbMFoMzBM 1114 | user90:{SSHA}Ypn8CHHGEp/UxeDe0+VEhRAVmwNoMzBM 1115 | user91:{SSHA}Rmqn/fp3ZYI6pFQf1kHZnMAAgJhoMzBM 1116 | user92:{SSHA}LuQObAdJBOOwJZaj6gjWKDGPXw5oMzBM 1117 | user93:{SSHA}eBWmJJcITESmsI0KvqhVxyGWzHNoMzBM 1118 | user94:{SSHA}JMomFFPTD5mKAMX5RESy5Gzn2L9oMzBM 1119 | user95:{SSHA}2IDJMQu6/qH9vx69lbz1/CAr7E1oMzBM 1120 | user96:{SSHA}0USP7ALYOJbSOA+8dQsPcEB2UAloMzBM 1121 | user97:{SSHA}1kFW8+ZOQaKBYgSjr/+Xg5gSeo1oMzBM 1122 | user98:{SSHA}82K3okDKowglUX07wHUVze194NtoMzBM 1123 | user99:{SSHA}lTGN0Tzz+IMY4SJ9Qrqxa2vVfgdoMzBM 1124 | user100:{SSHA}RQ7u4Q8nsyIP6rTQIwJzVs9BsMVoMzBM 1125 | user101:{SSHA}4TXcpqrGY1cFv8NCXz7MyTI/08FoMzBM 1126 | user102:{SSHA}mjPo5L+y8LsZa9UM6ZAjU1jVsoBoMzBM 1127 | user103:{SSHA}BdnavrD58G4dxZe1T4UEJgmrCMdoMzBM 1128 | user104:{SSHA}1JS0MKf3wbTJO+0NAX95IM+gLoBoMzBM 1129 | user105:{SSHA}hxXVWQY9olJjJrQDUQs1ZvO2mQxoMzBM 1130 | user106:{SSHA}04r3p/bEDY1RFFy4HzViPRwMY8FoMzBM 1131 | user107:{SSHA}ueaYWKFrV5MkkDKz6o0OxDTD2ploMzBM 1132 | user108:{SSHA}Kk5ZWv4cG1/7OkQxbfeX0NC7ZixoMzBM 1133 | user109:{SSHA}jz9UsGxB+WWSa5t/+yO3vEXxTsZoMzBM 1134 | user110:{SSHA}7+mH+eOgnHYRdj3sgCtMZXXbuI5oMzBM 1135 | user111:{SSHA}S/bxP+7k1MFoOtnMI/+jRVEZEHdoMzBM 1136 | user112:{SSHA}DP3/KiVPZUeRKHLqd615V9zheYdoMzBM 1137 | user113:{SSHA}xSBpP/Ks2bHkkNw43ZoWgZwyLXxoMzBM 1138 | user114:{SSHA}Jelh8enXbfVgowFrGAezz7eRU6VoMzBM 1139 | user115:{SSHA}kh/CqFaDa8/qZRefquWGcndqkPtoMzBM 1140 | user116:{SSHA}VI2vj1Up9E4fueC5rBdnqRBxQrVoMzBM 1141 | user117:{SSHA}phVsSEcVMiO8zmw+nA6G9fWS55FoMzBM 1142 | user118:{SSHA}PeEC0PzZzpQG0yZI0GirnjzukEVoMzBM 1143 | user119:{SSHA}fOZPdW6w9c2S18275BNDDVsftGFoMzBM 1144 | user120:{SSHA}3Jrv1Fbonf8IZTNdQJ/B1QLkmvxoMzBM 1145 | user121:{SSHA}tCwozhADmF/uW5bgPNL1VsiCuQZoMzBM 1146 | user122:{SSHA}8pUP8G/zhGTtbGRO1kOR+7d1TUloMzBM 1147 | user123:{SSHA}d/GUjH4rTUr0DZBwUBTJKr7EtCdoMzBM 1148 | user124:{SSHA}1FVlOEVaFsiF0Z9DS8trJf8JSnFoMzBM 1149 | user125:{SSHA}N9yPyRsGOAudEKRb3BWDoceOVbtoMzBM 1150 | user126:{SSHA}5RcrJM9HGxqOgmaLH55GBILygapoMzBM 1151 | user127:{SSHA}J5mAnDnDUHs6c5P0owInZTSUye9oMzBM 1152 | user128:{SSHA}l0ghIM+c2Pzw8A6yTOv3JyGjeRBoMzBM 1153 | user129:{SSHA}w9csbivGGj2ljyQKyb29udb3HhJoMzBM 1154 | user130:{SSHA}rB4TRiWPoN3lpRLb4MLpIZjMWvBoMzBM 1155 | user131:{SSHA}yqEnK3v8994I5+c367UdJE8HfyNoMzBM 1156 | user132:{SSHA}qJc/rZQnzYNlMiadFNhWvOHBvINoMzBM 1157 | user133:{SSHA}PFploR84iEbdtF/x+dwWwpRPokxoMzBM 1158 | user134:{SSHA}5Zt7YJh5RZ+ok0k9tIWpe7byQeloMzBM 1159 | user135:{SSHA}O/kFdl4oTuR7b/hW6v9nBAXZJq5oMzBM 1160 | user136:{SSHA}Z0/jL7eP4UCCz4Nor5Zwv3/7rGVoMzBM 1161 | user137:{SSHA}s3q0nzSa5Kwr4uria6hPkJc+fxpoMzBM 1162 | user138:{SSHA}99o7YV6tFOjsaSJ5Zp61qY40YZ1oMzBM 1163 | user139:{SSHA}DJ9376eJUCmxD4qCgkEeGpL6exFoMzBM 1164 | user140:{SSHA}TiaqzWkzs0yIMVx1jPHfNcC1y59oMzBM 1165 | user141:{SSHA}Iov2I0xZjPDldvg3TyLsbVzu6RFoMzBM 1166 | user142:{SSHA}SicIuNHFniKXqatyD5BqmXQla9doMzBM 1167 | user143:{SSHA}rWqfhuQ4lqvppOtzH85mk23wjZ5oMzBM 1168 | user144:{SSHA}N4k4oB7kXsgBTY5CzozHC6UQcR5oMzBM 1169 | user145:{SSHA}byB/hau+e8lzLKH4hJ7v0AC9FG1oMzBM 1170 | user146:{SSHA}+yHFBPw6dMQNc8nG2Cf/3CwsLcxoMzBM 1171 | user147:{SSHA}PSsVEdn71YdUbTfeNZUdWqZOqjFoMzBM 1172 | user148:{SSHA}dIN7+mJ98Mx3tTN4pUytF/bUyVdoMzBM 1173 | user149:{SSHA}Lpf8jkaR6O6UX9Eo7/6adnlplY1oMzBM 1174 | user150:{SSHA}lSEACsysI/QDB1flO17SfIqLRTNoMzBM 1175 | user151:{SSHA}PyiqiXVdIAUU2vWuWmYluC7/1oloMzBM 1176 | user152:{SSHA}XnoIQTiT7iX4p/LiYaI8/GeidW5oMzBM 1177 | user153:{SSHA}eN4eA+XbcgUJT9yE/0LEfHBCbkJoMzBM 1178 | user154:{SSHA}29JQsa2RAHBzBWvTQYj6xPnmfqNoMzBM 1179 | user155:{SSHA}GKVmTEZjUx9yb9awOj/ytwlJpDZoMzBM 1180 | user156:{SSHA}CQ6EWkVYt2xcPxVTwRG3HIV86lFoMzBM 1181 | user157:{SSHA}odr4eK00XOv39LonI8c2kIZ0AHtoMzBM 1182 | user158:{SSHA}O6SjDJZHsZlK98P2dlpxEvffEPZoMzBM 1183 | user159:{SSHA}3tSTU4yAUjnaD+Yc9N4FGu1myBFoMzBM 1184 | user160:{SSHA}kIxaiwca+r740x+MAg1wUeuho4doMzBM 1185 | user161:{SSHA}lq55WI87UsAETQgRsTq85FJ/+1toMzBM 1186 | user162:{SSHA}M9/mVMsfq9mQp6CR6csTNJ1/OiRoMzBM 1187 | user163:{SSHA}WysDSR2VVHt3q3RaVwTLTu1T0RBoMzBM 1188 | user164:{SSHA}r5Ld2ldElAxot9JhUlicrL4cooNoMzBM 1189 | user165:{SSHA}c7YhRwWq1uUgMV88KPLUTfRHEqhoMzBM 1190 | user166:{SSHA}Qya9WpbcXm4CGe+74snT6+wNvuRoMzBM 1191 | user167:{SSHA}LY1sCSerjc/3yibSTtWoKfaa8YpoMzBM 1192 | user168:{SSHA}GX0QU5/+f0Ay5qztDkNH3uxzk6RoMzBM 1193 | user169:{SSHA}SGVZtFmKPsx6kYD5aBIpKYieFxloMzBM 1194 | user170:{SSHA}Cy0ONo8OzwKV/ARm/84tQp0Y6U9oMzBM 1195 | user171:{SSHA}rcRRLAU6TK3T1Jsl76YX6VOv/MhoMzBM 1196 | user172:{SSHA}5w2j1pCMcEKJh+MzK+d2rTQMiYtoMzBM 1197 | user173:{SSHA}8Pidv4ozJZfpN4eBFfGPuiPgEM5oMzBM 1198 | user174:{SSHA}+BARKI8oCv8CCMVDGC4SPN6gATdoMzBM 1199 | user175:{SSHA}rTeutNoSgHrCpcaJaIgrikrZjTtoMzBM 1200 | user176:{SSHA}25OEOVO23FKntU5+RDo9S6Dkr9JoMzBM 1201 | user177:{SSHA}MKLCUfJGoZBKu9krvcTseI0goLZoMzBM 1202 | user178:{SSHA}plzb6TMfairoikuiP+KK+BBPm3toMzBM 1203 | user179:{SSHA}yZ20fANjvHSNsxWdkG8K56DKc/hoMzBM 1204 | user180:{SSHA}I4jSmOBFOZIY2UHnRw62pYNnBMNoMzBM 1205 | user181:{SSHA}RDvaroyOH+U7n2Q64DQNAN2FStdoMzBM 1206 | user182:{SSHA}aJ+PiZ43i2GyVORiyTc8qmqehVJoMzBM 1207 | user183:{SSHA}CWum4640+nzpvXZsQ1ehiwvc3/RoMzBM 1208 | user184:{SSHA}zq+mHI0UFb801Xqi09kBtnTymJNoMzBM 1209 | user185:{SSHA}wYm1qGO5B0zQX8Y3WQ/3QEYeLfVoMzBM 1210 | user186:{SSHA}e9vu5c+YM4Kve+LoZuVXizjnA35oMzBM 1211 | user187:{SSHA}edOCLF3ylXjmaclBdWmuuRV4IeNoMzBM 1212 | user188:{SSHA}axoiuTXPOrinEInJ+xJZh2wRr25oMzBM 1213 | user189:{SSHA}HvXH6BqE4cItgD5vUNA6c/C0lRZoMzBM 1214 | user190:{SSHA}0qpTjPnBN4/8rv48WF1sRv9/WgNoMzBM 1215 | user191:{SSHA}49TJjIbq8751PplEYqGmiCF/SOFoMzBM 1216 | user192:{SSHA}4mN9pnH3mNN1tw5SbRR60ZW4e1poMzBM 1217 | user193:{SSHA}vha97emDO5P6FQI5LHLzRpphNhpoMzBM 1218 | user194:{SSHA}95fd56CSiwAX1tXtFzKh1NR1y2VoMzBM 1219 | user195:{SSHA}Afyedh7hf2PnO+sByzce5QdXsaJoMzBM 1220 | user196:{SSHA}YrrIbz4n//wQpycwYWWvdaXsmSFoMzBM 1221 | user197:{SSHA}lO9vZbWoLYBXqg7jEKfmWszliFpoMzBM 1222 | user198:{SSHA}Mu4MUUt+JNiV+wC0zqnxjO0Lb0hoMzBM 1223 | user199:{SSHA}e+9w+4XNZlPmc0/c2lyLaIbCWPBoMzBM 1224 | user200:{SSHA}y7fnpcvJRDlQAoU/0zgFLNqr5OxoMzBM 1225 | user201:{SSHA}y7fnpcvJRDlQAoU/0zgFLNqr5OxoMzBM` 1226 | 1227 | var textMd5Crypt = ` 1228 | user1:$1$D89ubl/e$dJ8XW4DfrJHTrnwCdx3Ji1 1229 | user2:$1$D89ubl/e$xuQ74IxhM3J10sv0QHVgA/ 1230 | user3:$1$D89ubl/e$Y07COBJSUbNDlYlFyRYUp. 1231 | user4:$1$D89ubl/e$4IZ.tBiqvtxt7Dpt1MkgE1 1232 | user5:$1$D89ubl/e$mLrBtDw8UTdAX7jDZLQIB0 1233 | user6:$1$D89ubl/e$gDHt/53o.SrKMB2Ts06ll1 1234 | user7:$1$D89ubl/e$rRYNMP4siiirAmmukKbLH1 1235 | user8:$1$D89ubl/e$eZSBBncGvTB0M0FC5y25f/ 1236 | user9:$1$D89ubl/e$ulbSP3eTh0fe.Xi.1yZUK0 1237 | user10:$1$D89ubl/e$.eWY6zxlyQZR2H/Wl1oBv. 1238 | user11:$1$D89ubl/e$z92umtR06bhr7asKE0qys/ 1239 | user12:$1$D89ubl/e$TAcr1BfieDgQrINZM5ob4/ 1240 | user13:$1$D89ubl/e$/hZIUw5diSqk2M17H8ya2/ 1241 | user14:$1$D89ubl/e$sQaL5tfFD85YivTet25eA0 1242 | user15:$1$D89ubl/e$d/DZx6g1NFNtzU4.7a8zz1 1243 | user16:$1$D89ubl/e$Ss.xxvcZk.hyZhfw.uHu./ 1244 | user17:$1$D89ubl/e$0P5vwLE5BrTDStMNUSVvy. 1245 | user18:$1$D89ubl/e$6.cSxEJwebnwRhE3Hzn0p0 1246 | user19:$1$D89ubl/e$C/xkXc8Y1I58TITNT5B000 1247 | user20:$1$D89ubl/e$C793xtKVyHtLgE9kv9F3G/ 1248 | user21:$1$D89ubl/e$l77x/.bF/SKs9j1fzZsxT0 1249 | user22:$1$D89ubl/e$Kyx0nL8mqLVQSTEoLozXf0 1250 | user23:$1$D89ubl/e$/K9HdFFaZs6fQtHeg50i2/ 1251 | user24:$1$D89ubl/e$5KXGSkIs4eVf9.vv784h2/ 1252 | user25:$1$D89ubl/e$Unn6gxvier6BbNqXXggcC1 1253 | user26:$1$D89ubl/e$y6uoa9UFNh89NqUYl52rU1 1254 | user27:$1$D89ubl/e$/hj9e6a9Ka4A6PLtscUAJ/ 1255 | user28:$1$D89ubl/e$FaTM181xgGpilXHhzKspp/ 1256 | user29:$1$D89ubl/e$juw3fg2cPTz96Styto/mD/ 1257 | user30:$1$D89ubl/e$VPgIKROD.HnIac7efgPqp/ 1258 | user31:$1$D89ubl/e$YHiBHNKujH.hOoduR6yI30 1259 | user32:$1$D89ubl/e$EZatY2FiaT38R7pJM28Ta1 1260 | user33:$1$D89ubl/e$nXBo5NIufmx/azSj5c7xn0 1261 | user34:$1$D89ubl/e$4c4jEBluS1Z/5gwpP5IHP1 1262 | user35:$1$D89ubl/e$OTaO6MXXx/9Kzgdax4IFT1 1263 | user36:$1$D89ubl/e$fyLMarn1NGkBlrVvnOkWe/ 1264 | user37:$1$D89ubl/e$BSEg4wMYeZZrqQRbgLZQ40 1265 | user38:$1$D89ubl/e$09Q0RgEq0luH52Q5D1r5h0 1266 | user39:$1$D89ubl/e$0CFkGtb.nFnwY0AsvIZ/p1 1267 | user40:$1$D89ubl/e$mxD6Tg8iiXGn2iuap9dkZ1 1268 | user41:$1$D89ubl/e$jTHXwK8wWOmCWMhV/Nqq6. 1269 | user42:$1$D89ubl/e$eQQM1N3kzqYaJsIHAuma3. 1270 | user43:$1$D89ubl/e$VPIMSuAdaNExEPg1o6BR21 1271 | user44:$1$D89ubl/e$tMKU2NslMUsgBVMJ4Z8Bw1 1272 | user45:$1$D89ubl/e$Zo9sQwDO9imDRzQjAvSit. 1273 | user46:$1$D89ubl/e$BnGW9hkQkwO/Fpj6lLGKK/ 1274 | user47:$1$D89ubl/e$Gc5RbOS3wD6GwQ8rbSJDB. 1275 | user48:$1$D89ubl/e$5lIEMaiA6epkGKq3ZJJr./ 1276 | user49:$1$D89ubl/e$tFt1GFVE6wxs5UhiRIPJo0 1277 | user50:$1$D89ubl/e$WNTQoeaBUI6P1ypLfFBGz1 1278 | user51:$1$D89ubl/e$U/zmE2HZ9arX1CFysF48F0 1279 | user52:$1$D89ubl/e$p.bG9zn.rvJB7E2nGhleK0 1280 | user53:$1$D89ubl/e$zal5AqxTqbMoo36DXwEQi0 1281 | user54:$1$D89ubl/e$s8mCg6jFym06sqZWoOXZr/ 1282 | user55:$1$D89ubl/e$80YBEXI4zCLlO9bOld9ey/ 1283 | user56:$1$D89ubl/e$coCMG.asGxvMHowtOtD/p. 1284 | user57:$1$D89ubl/e$ZSf.3PkORJgZTiW3WmC0S0 1285 | user58:$1$D89ubl/e$Q8Ti7BlgMjNwXCjzsvGz0. 1286 | user59:$1$D89ubl/e$GplTzL8mgIki4Grxkmsnn0 1287 | user60:$1$D89ubl/e$SMrOpSVsLdDZh0fgSv3RQ. 1288 | user61:$1$D89ubl/e$L7c4tHvipozBibsgDlIae. 1289 | user62:$1$D89ubl/e$0kSaA27U/3XSYr8ysXYk00 1290 | user63:$1$D89ubl/e$h0QjZLtAyLFIS0RHzUC0g0 1291 | user64:$1$D89ubl/e$m/HGZlMaYri6dyglbebGq1 1292 | user65:$1$D89ubl/e$ZCeDrrlRD4z0GuWUhkRIp/ 1293 | user66:$1$D89ubl/e$mrunNmbLqlK6GBjHAyXme0 1294 | user67:$1$D89ubl/e$LAleKOBmjHO.JkMqxZJva0 1295 | user68:$1$D89ubl/e$PsZG8hCSDwlu61oK/xVwY/ 1296 | user69:$1$D89ubl/e$FI4Kdq4kuDrE.02FKhu7l. 1297 | user70:$1$D89ubl/e$vM6r7Y64Zfo7Tw0YkPT.T. 1298 | user71:$1$D89ubl/e$AiLLO.VR/Z6HBLIsg59yg/ 1299 | user72:$1$D89ubl/e$NZ7SaJ8LroRQacSqrP7fp0 1300 | user73:$1$D89ubl/e$gfKqHDjTyhd5guuVyAg/i/ 1301 | user74:$1$D89ubl/e$Z45Dy1hE/XhDlnLJh63w80 1302 | user75:$1$D89ubl/e$MmNfgZpCBgohV/RiCqEeh0 1303 | user76:$1$D89ubl/e$yx7VuwWX2kJ3fgelcamZp/ 1304 | user77:$1$D89ubl/e$qSMTwpxirNVKQmnv0LKGt/ 1305 | user78:$1$D89ubl/e$i1mU8nOLP85sWe.XN35Cw/ 1306 | user79:$1$D89ubl/e$/MSgRW0uYjW5NdqyBJdPB. 1307 | user80:$1$D89ubl/e$4pXO/YHKqJ51rx2dWolr.1 1308 | user81:$1$D89ubl/e$xLJthQG.pQzgK8oVOGzNB1 1309 | user82:$1$D89ubl/e$l1Q0BEAEDlXPW44kj5xhR0 1310 | user83:$1$D89ubl/e$qnjT/g8iIRqgJjEdutYMI/ 1311 | user84:$1$D89ubl/e$5zxhC1KC7L1bfJPiZRzXp1 1312 | user85:$1$D89ubl/e$IaTFU11RpmJaS9o4H6Zbd0 1313 | user86:$1$D89ubl/e$pi5D8IwHVYgPyiXuIuW/Z. 1314 | user87:$1$D89ubl/e$mQukEUOQ3Y67xULFLxenN1 1315 | user88:$1$D89ubl/e$pwTwGBzTj/f4qRvrXWDeH1 1316 | user89:$1$D89ubl/e$eSRqyebfyJIf.wGwNWJiF/ 1317 | user90:$1$D89ubl/e$aaKVVJe1BPZbXaKqWDhJH. 1318 | user91:$1$D89ubl/e$myjNwn1J/Xur2sGPb2KDW/ 1319 | user92:$1$D89ubl/e$Sk9rTdAjux9EEWjIi983s. 1320 | user93:$1$D89ubl/e$49aMem462jQkqqZ1YCYtu1 1321 | user94:$1$D89ubl/e$SRje2pCzH8NjNInSkec5p/ 1322 | user95:$1$D89ubl/e$WYHvQD3.AucnP.fo2kgLP/ 1323 | user96:$1$D89ubl/e$MMK0xP5K1qHKsFsERRYCR. 1324 | user97:$1$D89ubl/e$sVVqstvqjaibnGEvVOYci1 1325 | user98:$1$D89ubl/e$VFIhSi8R9JmFPoZA4qDHI1 1326 | user99:$1$D89ubl/e$BlA2Z9tvvxDmV2dhtW14I0 1327 | user100:$1$D89ubl/e$52FunD0ymhST8S2IxFDwB. 1328 | user101:$1$D89ubl/e$3GLf6CNVmDH48iwOIVdYI/ 1329 | user102:$1$D89ubl/e$d2eAdEkBFPJ/CBOM.MHET0 1330 | user103:$1$D89ubl/e$TbhdN5Ec9YD8bplz1A/ce/ 1331 | user104:$1$D89ubl/e$ZCOXuzvrKNSVFOIlo8NWa0 1332 | user105:$1$D89ubl/e$5XqFN00zJn8eZ6mxIlNDn. 1333 | user106:$1$D89ubl/e$Scb3wMWrVNXDw0FtBU2Bx. 1334 | user107:$1$D89ubl/e$NKpZ4pHNMRByBtpN43qaR/ 1335 | user108:$1$D89ubl/e$z3O5D9UC4h8DqIND7HI8e0 1336 | user109:$1$D89ubl/e$ex2DzBcd0OK0xjWCk9gXn/ 1337 | user110:$1$D89ubl/e$nU.oBq2dK8u1/WYTb.qN./ 1338 | user111:$1$D89ubl/e$0DiN4Qgg78qXCKmCgn1v.0 1339 | user112:$1$D89ubl/e$0M452BZ4RsUFJlWmAzC/r0 1340 | user113:$1$D89ubl/e$kon/OQAJaw1jWzUVGF696/ 1341 | user114:$1$D89ubl/e$rffe2sXyO8D4i8b/Zz4fN. 1342 | user115:$1$D89ubl/e$hZxrfcVVudoH/vlLjHbO/0 1343 | user116:$1$D89ubl/e$RXh0ZI2skEE34Okz7ZFkS. 1344 | user117:$1$D89ubl/e$VdO1d5wKNz.082DfQBKdw/ 1345 | user118:$1$D89ubl/e$0O7aLsmdpnkds69gC8F3D0 1346 | user119:$1$D89ubl/e$HWdm5snaFBk8FiDKaaIEQ1 1347 | user120:$1$D89ubl/e$xqw/ieFswTtoXsUl.qFiE/ 1348 | user121:$1$D89ubl/e$SzKFu0pIWn3aYOU4n8vD80 1349 | user122:$1$D89ubl/e$lEOrH/zkoSs9gEPhWFzPY0 1350 | user123:$1$D89ubl/e$12DkA0BGmzbnFiXKQXOoO/ 1351 | user124:$1$D89ubl/e$B4vLgohydtKjuwc3PDmLJ. 1352 | user125:$1$D89ubl/e$jANv18j9YRx4dSRG3e9dR0 1353 | user126:$1$D89ubl/e$5V/VlZE2LSVL/FXTfXSEY/ 1354 | user127:$1$D89ubl/e$iFyY3.Bcpd2jcEQLV5wSf. 1355 | user128:$1$D89ubl/e$DHPXon3QnoN6NBaTv2Mg5/ 1356 | user129:$1$D89ubl/e$DsPKwJLYCgtQGgiV1vsJW1 1357 | user130:$1$D89ubl/e$6DGzvs.WKNeB.s4iVzHL.. 1358 | user131:$1$D89ubl/e$FwjNgb634KqRDONd9mWn10 1359 | user132:$1$D89ubl/e$njQdR835SwHOdC9yOv7t3/ 1360 | user133:$1$D89ubl/e$0wHxUj/ReVsKDnUnPR/Su1 1361 | user134:$1$D89ubl/e$WAD9PbSIhz206tHvVsLIX0 1362 | user135:$1$D89ubl/e$LDUiW43DNTTs3M.00nnTs1 1363 | user136:$1$D89ubl/e$PHYo0bAH5mMVAyjIC8piI0 1364 | user137:$1$D89ubl/e$UyR/Od.i9HQ.st4.tpEI.0 1365 | user138:$1$D89ubl/e$5UD3WvZ/FwruX9YFVaIUT/ 1366 | user139:$1$D89ubl/e$48eSiBnmw5e9w5giOn3ye1 1367 | user140:$1$D89ubl/e$4X3PcQgOz0JVEvHTuFRh9. 1368 | user141:$1$D89ubl/e$I1uauxPkvEIyk8UVXsDAQ. 1369 | user142:$1$D89ubl/e$Ya0d5paah4ZnA8MbLTvqo/ 1370 | user143:$1$D89ubl/e$1kY4BuTtTHHAEqBpDnh2B. 1371 | user144:$1$D89ubl/e$cfbSrTlsCwlAD3l7NWcjg. 1372 | user145:$1$D89ubl/e$gKcTYvUdSIfR9/wxxVKh00 1373 | user146:$1$D89ubl/e$dr3IRAptFJZJihDhfJM6L1 1374 | user147:$1$D89ubl/e$W7HymXzTiMw19qnRxMFQz. 1375 | user148:$1$D89ubl/e$IDzuywgAHby2yNESi/cEu/ 1376 | user149:$1$D89ubl/e$Fj8gIA/n0wzQQeFow.C7X1 1377 | user150:$1$D89ubl/e$bbWZK6Y64mVxUFx/KiX1B1 1378 | user151:$1$D89ubl/e$p/oVop6W/YiSDKNOOKi6D1 1379 | user152:$1$D89ubl/e$Qo8SMcE2S9QFp/zsRZeNG0 1380 | user153:$1$D89ubl/e$q8ae/TEYgiU80vniBKIqo. 1381 | user154:$1$D89ubl/e$gYAm1Win2xeG8VSEwezd30 1382 | user155:$1$D89ubl/e$SFZgFYUGzipDnBs9gWwbr/ 1383 | user156:$1$D89ubl/e$J0Amxd2tBuLkMwRfT.9.l. 1384 | user157:$1$D89ubl/e$s13zGQ31soCmTTRI6dtuO0 1385 | user158:$1$D89ubl/e$sROc1K.SSkTKzz17qcjkR. 1386 | user159:$1$D89ubl/e$RyRsl5a2AMQomSbXxJwKd. 1387 | user160:$1$D89ubl/e$UPDj0.FApBTp/Mf8Pa5tG. 1388 | user161:$1$D89ubl/e$yDOxOyZ8Na.utOWkk19s01 1389 | user162:$1$D89ubl/e$2upo6jW4F5OLgMvJv3PuU1 1390 | user163:$1$D89ubl/e$JpaGvclLj2SHhVAFBOqtT0 1391 | user164:$1$D89ubl/e$XeFap1wOn3vppPM5HYTVp0 1392 | user165:$1$D89ubl/e$hRcYGGfn3HcDZcxeZtL.P1 1393 | user166:$1$D89ubl/e$4t.pGGDRnT.epiS4XemUZ0 1394 | user167:$1$D89ubl/e$MYyxqzymgUVhXkjLDPoeq1 1395 | user168:$1$D89ubl/e$Oes0cPGc7hQF.2nQgHThF0 1396 | user169:$1$D89ubl/e$laB87gR5mmN/aNaQW37.E1 1397 | user170:$1$D89ubl/e$wvY4dNj.Q3U7pnEQgf/je1 1398 | user171:$1$D89ubl/e$jRk3i8CF1C7Sh43qytD.31 1399 | user172:$1$D89ubl/e$0JCRZtaPgouKCrcAiF3290 1400 | user173:$1$D89ubl/e$iZjmNH7GBYKN19Yl5IWF9. 1401 | user174:$1$D89ubl/e$QwDfjzDOqFgbsP52awbrP. 1402 | user175:$1$D89ubl/e$gwfYHJCUhkaGXuCTv9WYO1 1403 | user176:$1$D89ubl/e$w98gHUCztuXegDue.AOTV. 1404 | user177:$1$D89ubl/e$ROjdv8BY.9e3naiqMgt94/ 1405 | user178:$1$D89ubl/e$u0zmiD8YSiNfBZMgjhUkw/ 1406 | user179:$1$D89ubl/e$FvH6jFxbT3BNYSJLNEkRE. 1407 | user180:$1$D89ubl/e$50h2tbqHW9vagG7wL9YP71 1408 | user181:$1$D89ubl/e$BUr/iUuPZAJMn3LC7qzkq/ 1409 | user182:$1$D89ubl/e$70s6Is6uEwtFldtmotDhG. 1410 | user183:$1$D89ubl/e$k7PCEkvp2Pdm3HWWOBgmE0 1411 | user184:$1$D89ubl/e$Cknm.cI/57fbdNnztPqVv/ 1412 | user185:$1$D89ubl/e$z1CwDc9dhBLK/3nPyrjN4/ 1413 | user186:$1$D89ubl/e$vA4kvwltG58Twovn9ia./1 1414 | user187:$1$D89ubl/e$E75YhMUix/GZ6sGKMzKcH. 1415 | user188:$1$D89ubl/e$7Vjp3/aQgDkvrvihk.v020 1416 | user189:$1$D89ubl/e$ZrqfkcX5deYA89WLAiDsW. 1417 | user190:$1$D89ubl/e$s7khoFO35J03/IWR0Au9a/ 1418 | user191:$1$D89ubl/e$oWHcMVYWZe.30EjvdVhSz/ 1419 | user192:$1$D89ubl/e$TqtgsDnP6LyrpDriHI3g1. 1420 | user193:$1$D89ubl/e$BBVL9.H9p0kabiBuuGCP5. 1421 | user194:$1$D89ubl/e$nGYG2N2nmEZA7Xv0gpsUa. 1422 | user195:$1$D89ubl/e$g.ihTAfr9HICtitiMed6U/ 1423 | user196:$1$D89ubl/e$BJ7gzGwNQmCy8WLTAzEcG0 1424 | user197:$1$D89ubl/e$oroQkvFnt80PX9.DFORsH0 1425 | user198:$1$D89ubl/e$SdHoMvPduS1kS3KVqEw9W. 1426 | user199:$1$D89ubl/e$1FQtoOElFQQCBL53IT2LL0 1427 | user200:$1$D89ubl/e$xO3.z/20nsNEXnaWJdsfB/ 1428 | user201:$1$D89ubl/e$xO3.z/20nsNEXnaWJdsfB/` 1429 | 1430 | var testCryptSha256 = ` 1431 | user1:$5$bLwzSej2XBj1YV4F$dXqaTdlpp8juRiUkFJhCYz8Y.p6GQQjCxerNkcGwH58 1432 | user2:$5$3NGsB/bPPYmCGQL8$CbEsQgmtdnVTA4PAIfbeYsXCfKRB6hZ3vmvOibFnuiC 1433 | user3:$5$iWNa/SYBvloAkYqL$29RlFZllybrmh96YHiykXjEphjO5fr/VDkGlNbnAoK2 1434 | user4:$5$+zmopZnpfhTXYMqR$OI3mP.peJI3Fv/wfyES3jdi0Yfc7ckKz6ct5h/RSth6 1435 | user5:$5$7ja21A3HtlJh6Ikc$jrn3r1TS.kMC8hGhijIq2oUpyeEBTWrPrmuZ5w71bH. 1436 | user6:$5$pVsj+PQA33FzWHRM$ncHNYNycNA1DuPsRF5uZPekGCcqep2eR2kZhKgLWNL1 1437 | user7:$5$dhDHo0+E6MCn1Kzk$TVmh9xrPBPoOBruNQoV/OaAjotMBqDqYLSVk4PvJf49 1438 | user8:$5$QXYcM0Nmn42HlD0N$JchICjh2mAE05pMk0U7w3HVE0hH1q/H0CGoyiHD2Tp7 1439 | user9:$5$fs9+uqLpzBgEEmOv$HlX/ABDaoJSyzLvADO1ttzidn7V8vdCmnGAmychpItD 1440 | user10:$5$5zP2/8/DeS3+898o$28V5.tWHs40//FSaTnXH9YHfxdgHnFR8tXa4BoJ0X36 1441 | user11:$5$r9VzFy9Eq5/t9jJ7$ELycym218VUvrZUxLx3XMZP0pzAc11/9WXUF7WMQ0s6 1442 | user12:$5$1rmNOK0fxIiwi6Q/$7q8BjJ4/v0ItFyL0EiZnPErTyCd5hZKquAmKS2zcsV4 1443 | user13:$5$lEEade9Y6JETJrQq$N3sTq8bTJr5aOKQstvIFZwqGxLj8TuvcVH2S7Sue1l5 1444 | user14:$5$IpRJSiyipBbJ/f4s$TTCX6ENm8ks3RszYFFI3AkaEJkhwYBojDFJGWXwDwZ4 1445 | user15:$5$F7ecKtG8vn7iJ6j8$xOUSpuy42ieWn1O/iukcc9nIOi/876JBmW9xHlXbb60 1446 | user16:$5$MjIOIIJ/poOh97ik$aEZZVPEgG1ayy5F6d10Qeis9cB7st3worYfGnJtNVy4 1447 | user17:$5$FrNWjoVrbj4Ytdnc$T9sXU1vwwenUuV5o1Ps5iPEfkRkBBwQMChXYeiREig3 1448 | user18:$5$XmNDt4pLsHbYPoFG$cLPs5NoXkWE42IJ7n64QqEKxqQdcfhHWApPWbQQDAqD 1449 | user19:$5$X0vd0aztkANXbZ0q$oy1LC9n58r.bEmVjUDgU3A1.bhdKZ5yNUVSDySEVC57 1450 | user20:$5$z2fp2cwqgLYgkv6J$QYDxVviFpOAIL/Ct0Bdn4wmUQnJM3FjeF09RTkJW/8/ 1451 | user21:$5$ViRn74UzS+n1yGzs$kkrEdP0li/FmacmUFJeiyq1n3nN5GwfQjJOAW2OGj63 1452 | user22:$5$TorBnfPr96AmHPUY$jJ4ane7XxbEprnqwaSrErteO1PbppHjJ/1CTKyow5S8 1453 | user23:$5$BrXQv0UawHA/JlxZ$DV63Dq9SH4uBFxTuwAXbOj6p2xu9ALTn8cxUraez7z4 1454 | user24:$5$+zqtQxGqndbfz12A$KXS//5SkAfopIRnMoF6/NakJsQeF6YA6zWWOIWnENo4 1455 | user25:$5$m8R16cUNAtjs4LuO$hRj4Oi7aZiPSM5pngFGmw.sTgPmL0.0s.a6gOsnF1l0 1456 | user26:$5$f2zA4NUXO0bW777D$0uucSSEJfCz0wM4.3krQBH1m4YIP1BPkpnqnDHDBAdC 1457 | user27:$5$8yVhw7CrTwfWEXMN$FLznuMo1CLL99AX03qmut0WW33D9GjAVU6xyP9VyA49 1458 | user28:$5$KBu6WrLCyEZBy4OL$svpfQRBboQVx/PAM.RI2z4dLZuTt9aPRJopAExThfc8 1459 | user29:$5$U2jKCjUX3D8PmgOV$SvQBJpqEE.ac0DwJhZREY7eJ4e018cebAbX7znaco20 1460 | user30:$5$dCXZlBjUT02qqkFY$rAI/4.MBH1n2v/tMl31IXp11IJfrjsytjbeISIGQKP/ 1461 | user31:$5$ol5bRuYxCRK0SjeX$srqIRZhMpc5A.Q8b4.xQ0Jqa8vuolgOY3Gv.DnTe7z. 1462 | user32:$5$x37Fa+cjc0Lx58tZ$pSI71Ip4sSVkZ7CFd3PGC6CRnAsnAuVuLtTxYAGs354 1463 | user33:$5$UotTFQECxeZHqAgp$05qcu2W5zrRBg7JiPOzNFYiT4FVdg6r8f1i6ZHVvWj. 1464 | user34:$5$5bWTlJqKLHU6s8TD$JA/MD/RKY2pEa9.ruPj7tKwoX04DilQF5T9dFR.XgHC 1465 | user35:$5$qkHYH2XObRMoNjMr$ZsrNzfD2I7sDosbTSlYmDvufnvGEqboB1bSwT1JcGH4 1466 | user36:$5$H9oiRBNT34Tzz1F0$BNy2F8QMGQQm/BukHfj9KSazaKxKXmC7J0TQQEosHr0 1467 | user37:$5$dxO+Ouz9T/3ScitR$nXK7E8Ay9E3y5cI6aR9VgcK7EeioQ4MEWJS7sadLw75 1468 | user38:$5$zuKQO278f7vHkLo9$ekmqQ4qnxBg7662onqVEl3TlSgKfTiiJcuOXc3l2NP6 1469 | user39:$5$tyXBB9Yv1wbyCkzi$lztDvYLNt/LMOpmkce1mtnYGsbuefPYFwezqseq55K0 1470 | user40:$5$GXJL9CQbphPD8SiD$nZKaEpZuu9HJocyMiDhGSc3BCxj5y6G50FC4PLuook4 1471 | user41:$5$bUb+9JUpfwsaje8u$uN74s9/vR418pHovEICTs4KpfFknW2ID5EqkmbeN591 1472 | user42:$5$zi/ajb1emIW/5ZhA$At/O.PQe7c9iw/uy3ZTtVFyITJ0hDyFx2DyYq7j6FcA 1473 | user43:$5$987V/cX97Ceil3PM$.prAESDmywR3xD5e00zAw8F3.bI0OcGxjf78/sTFO03 1474 | user44:$5$caN9cL9Hny4sPDao$Qp45o4o6L8jB2h/9hfx2jZ7DQS8WbyQ79/rDQhgKGe0 1475 | user45:$5$DtbqQVkXtYED8Sxt$/Lkz5RmK6EGvGfaM1EsE.2h/a3o2yYRH3J.ye0MH6X. 1476 | user46:$5$W8//LiEClUfjX8da$GEgo6CIaNi.bTJJCPBzsVEAiH8gaQoUzppTncUHfO33 1477 | user47:$5$1mLcIwVlyrFVsjHa$HFCkKEaB74PmrbYF4RjcU40dfxGW5RvU/UPBIP89rDA 1478 | user48:$5$y4IyXc9bUe+V6+13$8WtnIHgClR8hp7ijZ.1CzH7ypfyJWSIJoR88scTQ1oB 1479 | user49:$5$ox6YkbE+j0uysxCf$.SiaIgjdAfxcypoKJTVlwXOW2Oi7yjjW.5zWHA1zdo1 1480 | user50:$5$64o5madIHZj8Oahc$rj7L1awakJsQOHeAOrW7dOt6ruS5uJ01ISJYK63g1n. 1481 | user51:$5$hXrQ1Wj48d752Dju$GEqc1kLQThDFjG8/KmQ0/MtKTVbA4ceINKkloFezCT0 1482 | user52:$5$lKqNOBL03FHfzdc5$dnQ2yWDNFKRcYAIHXIq5C0OAA3d8WwI8fVXyDaEX9q8 1483 | user53:$5$GmBdpjB3pHD428Qy$8sFj3xQ/KKroS6NuZcJki0OdOfLRxuf0ko397O8dgm8 1484 | user54:$5$yDGIHvFnl/lxGfPn$atqz9ON7KVSXFXphZlKVglK7iEsPbl4PQYIvimwzYj6 1485 | user55:$5$EOUbw7TtucPBLQmx$qnNlEbydhZFhKTICJBjHVrAfzgfMIKfEMk1I1yNt728 1486 | user56:$5$cTvOXUnE7BhXHgjC$zvnjCfrfM9fHGz.Bi4yyLFQUv.IdkEYUXM0..R8sjB9 1487 | user57:$5$X0uVZdLcIsX/zMaU$I5Gs37if9MrRHn/RC95jCE4aiYOGfbsf2izCg3fKxt6 1488 | user58:$5$+Tt8/stumQliC80E$1nKF5VYrWEsECH2Tjzo1zsQyH4gtLllOyEneEYAh0U9 1489 | user59:$5$TXUUtyCuiF5S3PkN$tmASQUb3h659TGzALJmww9QPPN/CZkW3n1M9HR7GZ28 1490 | user60:$5$m1EPClOTwQuXxg6+$lb9FXdKNE1SKsAd6erIXnn2naxnLhreexg.7mQZapd4 1491 | user61:$5$mYKLwFxMDh4OZeu8$yxW98XjdY3.BE/Hm8sqw64B4gEwQIvxLy5cuMLvGAQ/ 1492 | user62:$5$Sj3qoqd666CUFTCe$QIh0L6gtkd7ih.JSBbv66TILES2yMHT/FlrDGFtZhtA 1493 | user63:$5$ndBOzgZTwItzwGgF$rx04TO3rOytoS7gyKhlg1ZlrWCu4xGYs/fHrNFdLt.7 1494 | user64:$5$ngDoN79Xq+OnqeF5$BNXlZyEIAb.lOjuNlq/cQOs3YrK79mAIKsF/a3nF.13 1495 | user65:$5$fZkYVbPVLyjyMTN8$poE8/iFoeLvbapLlZdj/hyTUhgt.V2DV9moIxvOVmf8 1496 | user66:$5$mVlyBYzGDET03M0N$FuGL1.f/KcTIKGOlLcGVOKMo9sOHNb.MRzMjEbCs213 1497 | user67:$5$ZmGRNU+8I4VWOV30$Sj9/NmHF5.lQEN74y38JPmjCPNjpSf1RUbgwJz8m1R7 1498 | user68:$5$wiSOQ4dmLt+7zPTm$yrcrfu3yCrbogLA.lOE7CW.DDN0aKTGmRXE43wk3tP2 1499 | user69:$5$DdEo7dyQUVQQGkly$OSFtHBkB4TIu4tjqCjIbfD9YU0MLYnhH5ZbQKlJYut5 1500 | user70:$5$GLa5qCOulpx5K/b0$/2soYFafjxT6potOw.8kNT.0Ga4Fy3Sr184RNUnKt89 1501 | user71:$5$i01HnuCxu+R3u5so$IWVlY/EHfbrqNqQkn5ztOsaJY1aGaM3o2x45Hdpp2YB 1502 | user72:$5$uAbfEDuFsfoI4ChP$c9ZYg0XdQlvOr4zZVVHO03odf3ZE3Bvdqn3YMvhH6Z1 1503 | user73:$5$fQ/f4GV6BsuQ0a3a$m1T0LdDYky5lhYgptuwyHhsXqm/3XrRkrwxFd3MrwY9 1504 | user74:$5$+YNZwJQaLTPqAeRj$p34fzCyc4HQ0bbR6np4c3/ZG3BKuLXZpRf440L.DWo/ 1505 | user75:$5$A42qBBZIT5L0ZgC3$9I8KzDSqRO9dRnKco7WjCrAmp/VGH8EsB.mx/szSEhB 1506 | user76:$5$tBJaHflB+61M+/2F$yek5JuretTTSYA4uzpw.nAwPK4cYIMG8OmEkvUVjI00 1507 | user77:$5$i9lolqZrhDHLirvn$mL5RNWxMv.MpL77dzYT9ip/CsH/WRHuoj51m6j1WY6/ 1508 | user78:$5$l2UgwGkT6OMh6K50$n.2ANZxrkRdOJ1rtkcfeOR5FUk0Nwzo7wQpI0sLvLS9 1509 | user79:$5$DIaFz5O8uOBnZBqa$4zBTTYlfSoOPgbxeMPD5uXXdRKEH6plnMiHNhfx.VE3 1510 | user80:$5$I/1VEDmd9NNPVonk$8NfrgGlnaC2PF3vXZYPsJw7l.L3p2M0N5YjkAbZIXR0 1511 | user81:$5$rIMj6qWp89RyN9nP$dx9XGDdu5T7FmaLRK7KY7WzFSkXHdHa81fvDrUyR6LC 1512 | user82:$5$2Bc/TtEapk3qGFfX$TsEDCmQeK3ZPC/2VrZrA2A0.tofVK.vHXfpchhlpZg9 1513 | user83:$5$qf6h/CYDTEjuCwnQ$caMJegPoPIixZXzrrCAeXRLPjiLXejT4fC3i7utKvl4 1514 | user84:$5$NtB3nefClhuRsQdj$tb1gs.CF/n6xU3m/zUbg08FMEJdwvcxUqEJHpTKKPn6 1515 | user85:$5$xQvRB+Yu6qqJ7Jx5$mWAXG3oRebldhJySMZPgeaVlPfFFhp58iQcYm7Zaa01 1516 | user86:$5$zKQSD69H7dInckCk$UUxxHQTHGqHDp7/8U/MV.eGNb6iZFYGGUwjCNmFvhuB 1517 | user87:$5$3IxlH2HbxXWsvpy9$CVP54dew3RWpS.Aw3tOlehfFsSfRs7pjKFX.lJmtLB4 1518 | user88:$5$7a6N2zC70skUM3bw$aWTRSPCUqGz4QERJO9qq8DmT6IhsU0bbQk7eJyTZTX4 1519 | user89:$5$RIijqwzm1uuRH2Zx$B4ogv/eJTMz3XyX1SkRaoHSSYZ/rD2unl3m30oafk97 1520 | user90:$5$HRd+ZVvh5yJSJArb$FXJyQKEmWy6qSz34DwXMMFAjER7mYgUoBty2V5dtwm4 1521 | user91:$5$zMeKRCoFQ20jarZr$n5P7WPMSjH1GOAXYTTDGnWKwNyOaROeNTVaDP/PRio6 1522 | user92:$5$igBUlsLdikkM4nGe$t4ElyPzDiYku6Uc4mW2dhKOFB25AdKc4XwhYFY9AaY0 1523 | user93:$5$pvOf5d4IgQtuervZ$gO.S3M9eHKWv0z4iwSc8AcjZxNcEdCo.D0GkWMHzLo3 1524 | user94:$5$AQuYUjN0SCORoGDm$KN/LjDdQzpcPNmtfw75IhWmNfSJX3maxwudjf1xkBr1 1525 | user95:$5$5aRvn3nWFWeWdoLT$lUWrIgFLfDAFxrCVCW1KLBD2SFBlLj8m8i6F7jcEvj3 1526 | user96:$5$xUgcyAYXHXnZIRDD$PAiRQfvbAQ9YY.hQoC.gQKXYgfb3h6oWMDh0XYR3UR5 1527 | user97:$5$6+gXTn0ZRobvcXU1$LV6oMtJcDgS323qIS4k1ERhtePQ2fr0OmIfFgW80ki1 1528 | user98:$5$tgSnvFwXgAcM59on$LfQfO.SUR97Z/VKNb1Q05RGJT5iZcNV.1.IQaFLpuv3 1529 | user99:$5$5m7SV/EWFXjvesaU$ruMpw2Pi7W6.l19ETvtZRH7btfPcyErzo406Zd4yTp3 1530 | user100:$5$F9ajDJYDVmWL30RH$NhJrNC7xgeffh3E75nDAcEgGFnKOeK5odI6BzIvKqRA 1531 | user101:$5$KrUWzy/DE8/8FpTx$qheJVOQFFwJ4/5FO8CXMC0s6zc5zfYQGc3UG1zTIM1/ 1532 | user102:$5$I6NYDLc7WaTGHfbT$WQJFnuD8grZvMGDQUZipO9kPpYiJStK9lXC6plxjUp2 1533 | user103:$5$gKgUWSTnHmsHMhC5$gmCy4vM8yF7NYUWsX6/bF0ONhM5d6kIMgu04lHFYfbA 1534 | user104:$5$F296non/9FSkLG1d$diijQrJPmhgChehL2MgooWtKBSUOYoI901JZDKXEFvA 1535 | user105:$5$yCjN+T2hpvWli5QH$Ktcx5xQqoQIGAJ/mZZeHS4PFoant8pp6iT43icQM1g. 1536 | user106:$5$fNNG2f5JpucrdYDY$ZcVJwYFcdrd3COes7JK1gBygDi/IZB6axqwtg7RYmG1 1537 | user107:$5$Ndimy889eWO+nvV/$kDKDbtfTbGg9xM354WO82VDH0JRWL7lJqZbn89fovs9 1538 | user108:$5$ahkQKx0an6yyL7g1$bIa1WiU3OkgKQhECko9uxOBd7.NQAN/3VKBf2rgKA58 1539 | user109:$5$1FnwJH+B/sNkYi7S$Ns9H5QUjpxnn7NtJnnbLpbTOBSaZAube7BsOPsxd314 1540 | user110:$5$MdsERDJ6jxJzU9S6$lf2RCI3fa.Dn9OHzQST4hcbOcc07CWGADo3UcKpRhz/ 1541 | user111:$5$B15D6OlJRbgbIgkv$0Szy4jcxCrJ7bcAkXCjrXkqwG8Fk5runkuLMl8MX/m4 1542 | user112:$5$q1GScEWhXFcXxsQr$YHrDkppsHyFCQjtj8R3Wn5/mqu97dMPt.B8ZGrpv7v4 1543 | user113:$5$VQ8WSdf3eN5f6vrz$Hv70fYCWY9hCSZQ66kfb/sxfrjoCDcvq0btJO2NYUv9 1544 | user114:$5$KvzkB3h5oBoY1KvR$149sDqQ8DXEnAd.J8h7nVT8iloNUwRKRJ1UlqJBM0E/ 1545 | user115:$5$kE+gm4stCG/yz28D$J8Gr5Vzz3pS1EseBmX5ryMftptCOGXKhZyTtZ1y4Ef9 1546 | user116:$5$MW7pL38/JjyOgp+5$Vqs04ohTWExEPVpVYHWVouz/TUL4kxS1J7Apbk9pri. 1547 | user117:$5$O8D8vcxZJiXVGklg$51k7U/rW5bFMBFpRQrPohtCAONdGaGuPUpdBqXYkzt3 1548 | user118:$5$/j+yIdC9jQDsnxvy$SUBNOjeLtvRz1lZF2j1Pp4kB3o/HtSmwrmxLmvm.7u0 1549 | user119:$5$3vRwbwuka4cW/4XO$Y6W4jJIz5.XHLTHaiKcL1dq2SpkUm/X/n1HET0m9CFC 1550 | user120:$5$JF39MV2luaOTxZz2$94JhbTS5/Fedv1re.jEGzvycih1bDuNMXYwm7E4zgx2 1551 | user121:$5$UvYpufa5p/u/QffN$NpbPy0L1Pg4nLbDAWe8m3hZ1byrPYa7ODkGhk7/UtC1 1552 | user122:$5$/MHFyh+YJp75JWv1$r04Sfosq.2WObV4AAnP5Y1HhVUQXY7fEvQdNT4uBpH1 1553 | user123:$5$RoqpkKb/M5SOZ7fV$T8e2b0nFAW/BPLrMiXl9uKMH.XyJAlOBrW4mO8QIqtA 1554 | user124:$5$oE+1NlTpN6iQk6uO$5vpVyAAIZVvMTWILkVlUSBcYVaiml3r.QQ/t2JNrQNB 1555 | user125:$5$Aa/ceF7RPuHM8Fxs$m59QRXMMRKg6NIZPOwLEg6ksuHIPYiJKfqk/UTt19x. 1556 | user126:$5$trycyDAuzChoga6O$KnU1B407pPyFsHsARsoPElNprpu9fYu6XPNMmbHefA/ 1557 | user127:$5$ic0z1gWw5AOoEIt4$roV2.PodUt.D9M8OdLmHmxnAd.5JsoO3ayUZwbzkxP5 1558 | user128:$5$d4z6zTMZg+CnxPqC$V6vQLN15TeJSCxPeVTQq8b25PnPJWYMBC5Lhs98V9W4 1559 | user129:$5$hljWHztwoVZUT995$7gWH/EhQRXEORjuxQK4TWkZJ3VZ2T1.liGZn6yHR7wB 1560 | user130:$5$W9YyBH5fF6vlcIZV$dwNZXuIrns2.PGkMFUU6GMJ22xUcI3yKmQm4fHLTV52 1561 | user131:$5$Rsk3eK/JNAtzO//r$Sq4Mqat5z9pPfLN6NwPZM/W9huDps3ikFu23pyTSVx3 1562 | user132:$5$fEVZ1Ri+2Gq9eP5r$gwtwjkOPEgmXfGyuJKquGErZ6I1yF.mwE3uItaiBk21 1563 | user133:$5$iv50sHmEnwB00SBM$X4dF94RSYWOg.0HiMILSFMWOzB7U61wfVRkdPYzju48 1564 | user134:$5$Ea6PIChPUJ65LX/S$qluf5FP4qG1hGklq9L08TlZTCsKi/Ga3q0WMfWF9D.B 1565 | user135:$5$70SOCjUUTFIgJDOg$2OYSjQuS0wadS5eS0bq8N0pscW1B2sF1YDBXdzsTOR. 1566 | user136:$5$f34zP1KQcA4YhFmo$xkAKGhH2vb/KAntbOB0hCoEBjuNLqVVAeAEojVF7QE4 1567 | user137:$5$WYD/Gp0GVoa9az/f$KM7jd3V7AiF6FwJdKXsQ62fHXQl8M/7mUdsAccvEW89 1568 | user138:$5$NBYo1A8rvlTmkU7B$YVbCjelGTVUdYyg7Pxbq0PjCpH0dRqkMudHuETEiuVB 1569 | user139:$5$nhEgtc8ipbP0yv1f$ie1YncbDAaDAP3TaGrlNLjTmC1m/3zGsetvAbjdCd3. 1570 | user140:$5$72b7A5B26RZriyqR$U7csTPbc9x4wwVvKEqjt0bxYGNcTGb8sVcHOZDz1ZH9 1571 | user141:$5$l5ksWGWBuweKyPB2$1LfWzx97dicAp/V/0oafbzAreE0HyGFZTSRn6OegNuB 1572 | user142:$5$fIsHVT5OTqdmaMng$nAI.EbA30AlMODrZh8aCxQfw4gb.7C/K7ZLGKk6wXGB 1573 | user143:$5$dFp/n7At8gruAqJ7$AowlIaZpyjJ3EOUpl0juBTA4woCQcL/Ck7tyNmD9Uq. 1574 | user144:$5$Idqe+8QrJJhsTRjB$a18VF6rJ./zVrWItzoCRyvp9LzIgl/gLTXnLMCL4jH4 1575 | user145:$5$OFN9eZBFDWFSKMgP$ICQz/eHtLIXyegADW58Zdte4voPnghQuWV1v62RW/t9 1576 | user146:$5$F38KsWN8uRF3H4mW$pt.2olQLKu6k6Wsy5mt4QUYviRP.9fRQsCu/sIMCETA 1577 | user147:$5$nIKDQZTDKybxNIaL$un1pZusi72gE78NEk/ztoAveJ0JoxuA4PrPtjJR06W2 1578 | user148:$5$FzNn3lv2CyOt4Evi$sOF4yyJM9uwWK5pGIuSd5G0j6efBm0HjnZtisXkxoH7 1579 | user149:$5$6owWqqBojlra+2xn$acHE5jFuPhyIkWqQ.TcWzEnGL6WhbbZ0QxC6.KHZ2b5 1580 | user150:$5$V0WTaGVbI36R0icT$TN6opZ1o3POtrbzpL9TVosJ9N4VaMu8t..X0jmh2la7 1581 | user151:$5$0o5DZ0+h8PTwNpCm$JjaTqzI8NRr.cSbTMRWjnO.jhuhrNW8XuNqIQaeapt4 1582 | user152:$5$8/I/HhIxbIgkPZxG$UR36TOHjMCy.1DokBal20tjCqyJpF1jKjLbJTWK6Qm3 1583 | user153:$5$RcQo1Kg8+NJjAugp$75Nl//NVHCd4hMTJH1ntvr.DEeJ4r9yoTDoyyMBTlxC 1584 | user154:$5$g5zYe7NWyrElxw10$SpYKAIJ9NEh4g59I0JAVM9biqG9hrw1j9qQExb10yT1 1585 | user155:$5$erIamTecDbcqQQeh$45bKyn/gbmNucxqh/yiibkBMQ4y9rSmkDMR/yZNsgQ2 1586 | user156:$5$kcZNwKswFupLGqLb$R4FqrBJrgx0vumSQNNt4VuRRUbE8fh6Y6S9TEU5Irf2 1587 | user157:$5$ISXxFhhU52Gjhlj5$zzAA6/qg2NbZLQQSSQde/VX0zr0FO4nT.jdgHUg5ir5 1588 | user158:$5$F5pagqnq/EQKfeqt$d6DrmmarymdcTGXrCURvr42L05cwp.31W2HXt4aK5i2 1589 | user159:$5$cKX7sb1rRAPmDyTP$a/o1CAUZlrikapwZK8Jf2zstYZ0hDHsl3B6unKJYnS4 1590 | user160:$5$oev585xVsq99cEXP$0fP.HJ3c1D7xCuXKjGHzVviRzK4T8NDDnFQrDfPc3X6 1591 | user161:$5$gG95RHryqehZBvM4$CzdJQs4I9c7ddI3Bo5NGm/P/ftNb5BW5ppycmNKRL5D 1592 | user162:$5$mQuAGYds6numw9WB$HySzMMMmxYA37gtIAAkmXWNicqd794IEEiDns2UjoI4 1593 | user163:$5$N7sMniS1hQ8wEIVT$26e6FoL2tIYPhgg5i8vMqEQGZEwu1KoqMJtwRgjEMR/ 1594 | user164:$5$32/esHK/C8k5mO4G$HVRU0lfULHGUZRoVwA0AK.Piv6OBQxgrwCUmTtKjVU7 1595 | user165:$5$IJsQfzuH3mGGOX6y$7hhZvlzyIfgknT..hceZIV7/CwEtQra2iJpYM/qvA8. 1596 | user166:$5$qmfo4LQLqsMXjBTI$aDPkyW4oC7H8YBZviI/g5dKSb/kFkhtBNHMnpvwS871 1597 | user167:$5$FMVFY5tpVmWpFILk$KQ4V2gdNjTfbOlKipGIGSIFFL/CkQZfnk.UrIHigeDB 1598 | user168:$5$S2d5pseSm4hXP5mw$xyI2SZtWPbw9V1yXGcviJ2gbDM29xIfbXXBrgaONBRB 1599 | user169:$5$K4+F8F5uNqp+nQMh$X6UIxnPC7oMiQXb5JawWhKdyS1ZjT5m8z87haAHQqe3 1600 | user170:$5$IlWABbQDQcQBLg62$RdIu3zzJ3C4Nl0BzLG6iw7UxnMljOlCzXlF/F2uFIRB 1601 | user171:$5$zUKTCa06d0xD5Lin$5glWJytawahoYsJgligDODBR/Kj81kfs9YfoPGSJ.65 1602 | user172:$5$rjg8GtGRXIO+1mEK$iGpNIONt0Z5XzBLuZzqJHk4snqdFr3iNtf2.l2VHzmD 1603 | user173:$5$VnwyxYrhV6mWTKM2$b1LqkdFnmPOeyG1Us40K2Y5dgkmp05LJiqxev1kdbgB 1604 | user174:$5$jABDRw15BWdsTDpl$BQ6mdf5Usre0HTkFCWZbE5OXFVwZ7zihTiHpNvSpKG3 1605 | user175:$5$JHWuGH0IGrUjpUA4$VzkQfW0p9d2OCLyP9y8fLewlh7s3IpPffQrVBXkGiS9 1606 | user176:$5$bo2maW9T7ubI3heE$cEFq1m92YvBTjvB.6MfBdz.lia86c0RlttELRVwJaz4 1607 | user177:$5$l1XlmGCjILMKR4l/$A4kXxHWddmpYbCD0SB/nnvwaV6umHVdJg4lXFGKBJg4 1608 | user178:$5$KRrf+hWWHAt+tVru$zutADHgZjGuMvduB1gY/YALGqky1DmJlF7iPgfIKVSB 1609 | user179:$5$8KmfNbuPopqFyUil$JUQcaVE7WFZZ2PWCpFpWVcmaCQrpU8QsYiLXvOxy244 1610 | user180:$5$h6MM+TSmyGfaNYnr$0Q/xTh5gHq5OShL/rCx7xt98zHx7y67k67nJJDRt2X. 1611 | user181:$5$u/FT9nbhaB7L6Y72$XsH8NkYu56y5I9bsQ3RccDAvpYZLQDqcRGV1vmG1v9B 1612 | user182:$5$f+608yaJRNSFmM6m$Q57Mjm5AGVxr10ZS4qm3GvSIjsiVA.PKpuc38IP6hQ2 1613 | user183:$5$zk6bUebigNbf6CLN$zz3i8lgQiX1nInY0mNshwHFKQQvfDF1qIpTNi2DHPf4 1614 | user184:$5$zVzKI4uQNam9+m9I$NnrgifYRMs569H6W0Q1lEOI3yHNKMl.4i5M.sELdNm/ 1615 | user185:$5$6z6GW8RqSbJn8Az7$4Gs1fonJdbmLgBeXShrYW7YJihRI3BQm.6x3ShjvRN6 1616 | user186:$5$5XuMHso9UXyRs/9I$U7Yhrxt3RO0JfIgSX6KqnXVY2QoS2qaf8qZ6uw.g4C5 1617 | user187:$5$4ItV0QsvGU2FhScw$Dsm7kE6L4UrIKU75CONrk45R6nktp8ULA6hYu6EtsKB 1618 | user188:$5$74FAYC4aqb+y4KeQ$8umgfTTahW01.zKsWrUVB77D6tMJi7pXexT8TurkXf9 1619 | user189:$5$ywipuLhlXRW3nPgX$bDLM4zul/FxEUAwY40bayeNsR/IM8QQqNjl5en6JOJ7 1620 | user190:$5$bolXhAgGIrxQfdSL$dwuvUG/5p6HAkbe5EcuZbrMv0zbHabDjE5srbe8luh7 1621 | user191:$5$9952NNnPSqlVHe82$CXIdF6QvSxtx/lTcQbCBGHFKSxpIFNIPA1RyGwa0wxA 1622 | user192:$5$1Kus2vUjWvRmb5Jd$u53uNnp62ppYgF8EJS8tqKSmO1K1RirLA.gV25biiyA 1623 | user193:$5$ur6dF40pr5Bm77Zx$bKDGlO7k5.FzfmX0ZaclfP3EmAK2.bZ9n1tcbab0Qn2 1624 | user194:$5$c0obfuNnpi2Jkwo6$ii77UFvjqtsW9.66FfzUAvJK6tfWBpnp74CAX9vlzOC 1625 | user195:$5$K/m5QYrhl1Uj9f7S$dOE.w3vx8a7JPhJ2lSH3/sty296iPdsav3nW/Rhg7SB 1626 | user196:$5$zsB30XJ0QQ7GvZI0$1UJd8WkuZiN3KDcl4soH4IUbpRKeShuBmVJYPk4HHBA 1627 | user197:$5$seC2waG8jzMz95xj$Dl6q9KHYeK5yjE1OZ/g2SWSyj1CJZRq8iNOz9Zu1Si5 1628 | user198:$5$gsipaURd4QYTNkk1$HzQMp0Fvd92xRYYwLQ/eJVGdxAGGS0/qLhTIdh4LdA4 1629 | user199:$5$lqb+rnmb/k6b957a$q4qXGaPi6uWawD4AsaqTzUYt3GiJJFpPDaKFuoAYeG0 1630 | user200:$5$MFy8qvM/otSgysXs$6RvYMcwcLP0HHRtJnwaK/QVUwEqPsCDG2T3OIPmZEH3 1631 | user201:$5$MFy8qvM/otSgysXs$6RvYMcwcLP0HHRtJnwaK/QVUwEqPsCDG2T3OIPmZEH3` 1632 | 1633 | var testCryptSha512 = ` 1634 | user1:$6$iklkG8zV969+0x+f$XKxre3pm8QNHezNxyEXj51AkNy5AXJQKifFhVWqhVaLLUAUAZkDy6Dp1Th/mTE/e/MkImK30.pByqu0CGsQZW1 1635 | user2:$6$4NBZ9hbcxBwv1An8$jT1D8dByqD4LCxQtl1DLfPMAW9a5ZZeWDrBCrFWhWYrgTrU..I9/rmnpScZodnVTFLVVi44iMd18QG0z9rQ5F/ 1636 | user3:$6$sLa9PLzZzwSbugU1$tw552X3F2gfEf2BbGReNS/HaoAqNPeQegUXNE/eRB39dbOpl5R1W4.Oet.tX.NLf.3m5YMTCKII4dpQcYZ5AL0 1637 | user4:$6$8pSvKGFqnoSX3ijZ$r97tWQodRIHDqmmgalqIGAEEckqdcqe0M0ZvPZemLTilH9dndguj/2jXvkUBoCrbyGFysS3Ct0psCgwJhTYZI. 1638 | user5:$6$JIRbFK5hxinn14L1$V15NaQw71W6pGAf5ky4LGoI9rAXBE9OeMIaAnaSWh1CuvnbJtecahnqQkIz8Y4a1alGRA10O.OJlXqI2WkKde. 1639 | user6:$6$62z1m9nkWnTdeFsc$ZhgMjeTqz5mw2CO9xnx2DhFR1JBZ840qbe.A8EUTrXzq4QzGY2sfv2u2LFXLwxFVPtFq6DNYcoGL04JSxm7AT. 1640 | user7:$6$EXfqMvPwLuBEynja$UlkY/zPRNyPd/YNk1bCM1EhRYxuAN2QtBAHqfg7uJB2Tx3IK2Pliq5RQx1Nj.eq1qtg3Z80FCabX3n28iV68L/ 1641 | user8:$6$gIj8euXGoXZwWHJH$vIhCXr799mAsjWTYFC4k8RCKUHIPMANq4WPIfmvDLOJzMY9niucAjHFf1IU4dk/KAwjwCOQggQqQPC7joqgL20 1642 | user9:$6$ZQcZuIB2KvuT9bZf$7HZiCPn62CDM9ORmTRyzG001VCoY8kJ8ebuCBGC0UDdPxSHWdYWnRqOhKvgPyUvm0vHjlJzY84T5Pcf9yIO8x0 1643 | user10:$6$5gSHHD6M98EJfJl5$TwN16HQxk/.Q.17yjquq6drZOw4jZgRtPR.OvDVfHpy.qILiCSZkczc7PWUjRnzmL82OfDJULAiyDiVmtycab1 1644 | user11:$6$tGNQ+LHRafNvDrQt$tpctDFYbblfFlt0.oJWcyQiOknnKxWSYPgeO7.ylX4.cakaNkskoPNwcYQOTCU1vaXZdyhQ/H682tzYA/rzet. 1645 | user12:$6$lFCrSiTTbugXSLkt$UP0r4QSHOFdCtddxQYAW3yQLZpek8MFn.rNpbEFsN2.nnsYlmy/ApYY4a1DwFRctnY8tsydT7XgTJdtejSifY. 1646 | user13:$6$arz3fGMSeE1Pav6m$CluwQY78u2LNbLZBZHNL7E6B5GOfX0FUn4fWGcYAWyNi7169bAOc7kvt22UZl2IVjMiu3l7Sr4sJLcLolsESs1 1647 | user14:$6$IxgT1QGlkun+10PW$D8Mk8TpSSU0Wc3ieD/qiIrds4ceUoZoTa9/26d.CIwYWYdf4oStmxuFZss7c9bax/of10YZETN5w/eaJsE8y10 1648 | user15:$6$led3sv99Hj1VUU5a$QKTmUH2mMAb.KbIMLD/G9tqM78743Qe5wbREf5VYdq3PNi1Q087Y.71ONvDRpOq42Rlgn6uKkc9lstmaIZRvt1 1649 | user16:$6$Y09Mbw5Bh35Ep9ni$dAXtJk17C60rstr2nm7R/Zc4UMcb.b7zi1xAy1NVM1Ikc.xjEIqYxCiEbSkBCOv4qXrQaZOiI48w/kQFxa.Sc. 1650 | user17:$6$lYBVmJdFLTA8UaiS$hG5PicGmT6E64wQjrgyjAkf0qEDsnhLCQ2679BF2C0Gkb7VB/LO1OzLPutki6UmSVnkrCqJ15eaC8.pJ6buBa0 1651 | user18:$6$phq+YqKZyV0+Lctc$3JRoRrHMxi99cJtrHpnvKanjT8zEbpaDvEQ8fpp.Z9dbOgvPIvdtk5Pbm5lctosuIhvBbVqzmjdOFQm.GFchB0 1652 | user19:$6$7mSM9a+bXBiNyPa5$qwuoR2KbCE8wviIAR0qJNavqkZ4fsI9UN/i.l7untkEifd7oApmwag4jfKYC9YvNhLcmnsGA6GkQ651RF.A4o0 1653 | user20:$6$y0vc53JxrYMxyueI$EKPolovFO0j9KpfRBmFHGSsds5opTPp90elJXjUCMCSPk69LwuLKcvMpqtMBDO83TTPzM.7YclqdJGCgvXJEk0 1654 | user21:$6$RjjSqE7UWbsA6Xqt$gUe3H1pRNNcjoVfAn0ApI/wivNO1MZfyUyQ2OvOHGF46.EQGygKvDeGFOzX9D2ZdhxcZegFN6cgfGlZ7STloT1 1655 | user22:$6$CuSyeg0dwI7odal2$QXZP9yvhlncGYwpKOz7HNGOXlekxndFIZFTei8f5rfmCRdAPhQUUKlMj7D2lXbtN34sg0.GhtzI7lD8G/HkuH1 1656 | user23:$6$qPFvoHFSwIu3nphD$MqmfExfKZXDSHc7bYk/I.zdsrNDuuD3N75.wD9qjmFryLmOOfxxobR8KGYJVFb8jGvprc0i9ICIJoK4wD3Gq11 1657 | user24:$6$iLgJcbAEbscQJaoe$hJn09F4rbWrDyQlo8w.CpKbXDuLcmWXZt.4FdpYNohSd7kmzkxP7uPrLDw04WCNFYEyKx3zlzReGCo6KbY0Z/0 1658 | user25:$6$20YMYped4yBPXR/P$Hp0eBMJsTBiyIEBF5zqZbQgzMiyZ/GOezhffgDuEhJluoY.cYLounvBeiXrJilSdQfApDw7Lnlqc62ygQ8gXg/ 1659 | user26:$6$LZvpZ1GjCzVr7s34$zkqi524lYrgNk874hqDrLXGeyr7h4Z83mEWnxvAr4Vbh7OF1OigjPfSbpxRoe.t1Ie0v9Cj.IcMgFOCuwAwjt. 1660 | user27:$6$nhR8cC8ethoNP1zS$NGfjjtZRe5K2Qj51wu7A4jDvDeUAMQfHIAOIec7cXmGqwiHGTsBiOnn6oX4wYtxtqG2KJs0u2FJH5FQZxqXQ51 1661 | user28:$6$nSckDneYj3hmIYRr$NrPSufm3Z2wZs6.gKuH5dHZ1f1gUGMEkCSQCQf/wU.t9ZI/vlYLPLCLlPbIsp2X2o8SB6RssJ7D4xJyM8DGbF0 1662 | user29:$6$LAxOj4+HT6zOGRKG$zUE9.yO0KZ6WBuFddFaGYZQYStQwRU6GKZ.Raww4pBg.hJIWMLB3LtL77T3aAT7EuWfeLGuawmaKhNmg0nSwQ. 1663 | user30:$6$L/VMqcrE32u1lFGo$y0XUPnvR.l.VlufKFJQM35TPrRB2Ff63Uwm8iIb7N11v./vVPNh7iuSH4GBmZpHwQrV7VLiSZOLf0pzzF.A.J0 1664 | user31:$6$Yr7UNm8/8Wom8f5J$QWDiJvPREavC/eh7SwNWvPr4J2V2R0wfYBM65yBFFRdGu78W5Yj.mqUCL6xsM6KkgWyHfAsHLfKE0JJJlg9dY. 1665 | user32:$6$vacsJP87fmJyqkWV$gb9HJfZXosVkSiUoUKb3XkXXJt3/aNNWOH.a4E3S.2CXtUaWwo9fCuUeZ4z6VYQYzO7EhubQXraJ/A12dJQvd/ 1666 | user33:$6$SCWy74jw4OwYNnnp$JRwosT6VWv0Vum/y/k.NBuygmODk5k8sV4fGYfc6xJW2mYzTTPQhPuDSd2oVg7gmQBlSEnC3LJPNAMuej8EKJ1 1667 | user34:$6$ytF9CosB85/gOZVr$.FvvgW/7BvFmiF7Wk7GPGgN6K/.qXa2NOO9SJANY6PpNSuG//J87htzWRDYbkKYqkOFNDg1NtgSNBDd/yHQsz1 1668 | user35:$6$94c6Ivyt+pN3u/1e$H/mL96/1vCuZNwD0b7JstHLOBzXKPrY4sxEBJN9NJzQ7AA46/j/giDznBE.k1wwHHrRt8IHO.fToJX4k6RU/3/ 1669 | user36:$6$KxyUP03HHKLmsYAm$J1LtTtN.Hb14lwlAWrmMb9LysmvfZ5C8E1zFPClPhm7Qf4GrJy/Hwi73Fnciw./HxYu0czR509P9kpqTYo0Y01 1670 | user37:$6$EgG8HDPuTj3tw8Nz$2R.0rccgTSR3l1YBM20Tp1t.bZ6hzcHQ68QeI5x9t/M5fGRDHBXBDr1qdloeNucSls5x3qbOPug88Bpf5od7/. 1671 | user38:$6$3r4YUdPS93ll4k54$l3Q.XuJUdVXPIQRz/AbmMqsmRPbhxHN1e1.2B0jH37iP6dKclV3llfSMOeZkU40pPCPjhnaUGi1Lyg8KuiI9z. 1672 | user39:$6$rP51bUgavAPyqCNz$6zEIvWnFeiAIkYLTtVfpToKEyNcAbsvIYc7sG2Yphy.uospLB59gDDYOo3GKprdyClC7jJ3PWxWzG1mgOGI/a. 1673 | user40:$6$doIz/z0UIr3MI3Vc$qggjm2SRcQT59M/jyFi6X69xR8.HZ.3lxmsrQ4jezDRCbN3AL1Pi0g1OV0CY5VveFoO8NHzRjUMkHsk5s23jv. 1674 | user41:$6$oxDmjRgpddtV1xiR$HdDBlLL2xGBul2BDJgLLKPgsqY7gCfQHXc/vBQcVAomc6sLgDA68cY/4ZHdZbAIRsU/IshWhHVAml.H2QEOtX. 1675 | user42:$6$Ot9yZLmcGaG7i1i4$9KkXL.K0A72NZ0GGAo4xqnlt9N5/KhEepVvl8JEvCd971/EbpjjExOgonW.xagEQLKvj7wBkbN9RrBiMv7Zmd/ 1676 | user43:$6$/LfinHsU1ORlhW9O$C1g8dj0BHkVufhq97AbMHrAdOul7bmR7cm3l1pGdTRNbs.xHBv/ShpmNFhU54c.sPMA2LaLMdbFzF6VQbq8Tj. 1677 | user44:$6$PiFDxXU1oaZWzn3T$O3wMI1rne3/5VdVLro9PGeBqMbzWmpRitGdZmkEsUv9Ksb8JJGgBmNS8OxBEd7/pYJjxzMcgXJUXT4lxaqKzS0 1678 | user45:$6$8dnpAV5FZDzwhN03$5HGHkDm4XKaQsY1weN1xInjxUir2LcV43gk0kdWbgWPDrh5FgiltRnnFPnQZ2liv3v3ellwjn7JgfrdBM7opQ0 1679 | user46:$6$0zqcOkkNe64zhRrW$lNfUSiJnEp6fX.1N8f3YkiTofdO.FTNaY/Q4Np03oNpXt9bNw/moQ7VgKDhl8eQ12iGmZwtc8QF9MybudRXB9/ 1680 | user47:$6$Q2VoguDRsf1cMMWe$4vZXfMIGL4akaC86nq7ideqd9u87X3Q/LVSZNoNS1a.cdWqrbs5vC7c9HqW6Nb2b63lp0kFMWdmZdGlgX1eBk/ 1681 | user48:$6$zPX4pZrp0w1L2gTW$Qa5w5f5hLsR.YWOeNRO4V6nAliU80alnAQYYX4OPfCMOp9QvDXOuVZuT4BYAQXDySxhLX/LKtOsdFqUYurVlw/ 1682 | user49:$6$ZozCcpMNj+f0hpXY$jsXIVHJIxOYRjFgXw1NFQcgeGWTWFXGQGd.efrOYK2S6.eZzLPqJwIqMTUNmlKLAXCtLDZL8KDCxkBi3b8lUv1 1683 | user50:$6$/rYWKtCQKc0/x5ZZ$YgsKZn5R8GiqXcMgRyaKM1ClU5WXBsj8neaSz2VO4t5PEusDG/R6MA8Tdud0gGQP4QTyumFimWRSyXrdapw5w/ 1684 | user51:$6$8qKKAiPd25zHoc12$Bl3pmcoNy9B/kZMWb7s3gSPhsDIklgWqqjgeVG0qicVj7YKc1RVs8ntfM8/sCfj./kD.hDbDHYABovs0mCIrU1 1685 | user52:$6$wzD6hEVzB9uablQm$qgIMnfvQxdePmLYjPGvknRCgyUOSfGX57vgVYBDtj0hUp43oygiBZ/YO4As1wYZwn0dYc7RU9Ul1NQqr0lKoL/ 1686 | user53:$6$A6d5wi0W+4031cMr$wVEu/Y4am5swRzpWLzE2XHQy8xfY7086ch2G2w7MJVE.i71JJJ3ibalIUUnnZmS/35Zkz075l4.upgIj7Obqw0 1687 | user54:$6$Hgv1xhdROf7KEH6E$P.pQOerDbvU9H90NuwigUzicxNs.6pBu91gnInJDM7PyHi3bLGbgBJX08O8qtjybc3ZziF2tIKn46UeNhx.gG0 1688 | user55:$6$02vySxQ1ylcRkcct$Qihgpbx5x3Gr83B.aukR246vLV0jPNvgrJ9EjKEJBVifSSmVlkDtGfE4y0ETqnPFMAmI..uWaW7JAeHk55PDz. 1689 | user56:$6$+9V84MGd3+5p2H7R$jaa2WyPYNQENklURLnsa/8LvvDcH99Aeu9PGnWM06ERWnaQsK4Q.AbjRghSb3nHhiN3nS3yG6LttvJ21QTc29. 1690 | user57:$6$LFTwRPEuwDkpkK3H$GcPRUeEcu6Bu3IvMmNJsXobkkIKbiT1Pad0gLE5XJfb0FsejQefHr3c160DoAngJiQfMFlVrpTmRmO2Udk6Lg. 1691 | user58:$6$FFtu1bXZZZF9YWJ4$pp2bXUx9YJkMC..vH3HPy41XcRJJXGRJG6czG4AmlqarG2kTf0ImakXaYiUKWQ6PyoE5/MNBDIrb2WMFjNeM0/ 1692 | user59:$6$qoGovWwv47nrH/J3$tsVqFir2bFjqI/tcn.I8e2HtvZLDn0TTyKkcMf6XIFrgd1wXBfrFom0nk/xZXEjhgWo0PlVys8ZBjGgE/xIgQ/ 1693 | user60:$6$ix/yZ3NyTRMl1ai4$pIUPiVKNyxY7C7PLRluSWW.6zKHi7Y30z2X/T3kIExvy8/ICBrLi37ol3Rh8T3tUTpm.54DloM5U45vTtGfLc1 1694 | user61:$6$GEIqLw8anFdaxJBa$gv97I0EpzDkj2l7a2GMjt6/Mq7ODOg.cAoVCKXhe854s.RgdvyKL9U89R2BkyKfJJGF4.3zAWDcdOb64xBToQ1 1695 | user62:$6$SUVsKzSEeLDBykn4$8sI2N2cRQ7hk9Gw.xmc99tGRDBQBWJWS4zgeZwJZsiVMK/9YTWSOKnb04xWZfIL9NIs98qCzspn7gkjIVED911 1696 | user63:$6$jYWEcWVyPr4GtErj$m0ZF0viblyk8Ab.4AtH1tc2MOxBTJM4Casm8eC15rv6XOMLHuNvpW4UnZk7uw8hmG6Bo7CS.75okf8QT0iayN. 1697 | user64:$6$nFkMh3V+kxmuXdoO$pNAPLlVhDA22HJZhrO2IS0xWwz.bFShqjBEiZsigXWInWTEWVmoLP3JWOSWJcIGNdZZx33NZ2X6wJcmxH2shv1 1698 | user65:$6$MxRAU9JfzcOImIXa$a4/8HLBHyAtXeD93lnQ4DRsC8lYYwXqp6QdeqBDOkjwqzDndwpI9zDnTXprNykljxdDw1JlXPwUvVrI0vWdlI/ 1699 | user66:$6$6iFcjp4+6jGhgzuY$iY6bcIBuGUi9NS4BXjA9dwr..oP4hz0/u1VXlmKpRfSoPXp.FIlyPNzchzeIh5mjV1GY1VjTmFVR0wPaJ9uIi. 1700 | user67:$6$dTSqje6TMhoN9S7K$nEYSzjeToUZi3yEiRPqvN97Z6L/yQ4vVidv6ME333uI.nrwjAnBlXpkSDduFT/Dgid3cP6POjh351sGV1JN4O/ 1701 | user68:$6$86iC6YgSW37rpm7C$WwYPFV/CTZ22VTGm2H6ljE7jTC.3BbiVVu2KKuhL/38mpLYw2hR22AqP9r1p/LAruBid3A4ezj5zdhZD7Mn/40 1702 | user69:$6$pyGP0ixY65smbM6V$qODK7FzLZV1Dq7Ei6btLySZhvl79mqpPOeZKl2ndLdSDxo93sXOVAfEeScm1oRJ3iVCaYnD7uPaFE.P8aGX9z1 1703 | user70:$6$1HsyxMJfeXqaIHVg$O5yefhtFsMoOVfppcM9K4xRuuCXuP66gEzlUCjQw8KnWS5PvfStC6wojrDCRKxBH5UgU2jT24cczL4jfhOS/s. 1704 | user71:$6$GU2MmlqK/2dKoAXe$iIOas6r1VAHVlKoFGGIOJJkWfdbYAmffBVytYm97cQKweQx6H.6UPMuVb9YIaFUyTqgwUavt0XYavPMsXQCXK. 1705 | user72:$6$yQzGHM0zVb81o5Ae$Za7169Fwqbcn67wM72YqYiwk7iPZZdHos5k6PBe1y9x4HW0l2lFoEURgQw.qClkSfsnrMLNRGhCVZ19l6HDT9. 1706 | user73:$6$tGg0ejk2b6knAk8T$A1l0psadmiFXAkcwNIlrKBW3GTZvPPqU1YCX0irTvlG0oadmbo52UQrcA.lImlyYwW8.WpTmP/cocCecPJdW31 1707 | user74:$6$vok5e8YIYUAm+I7L$GnGpzSI.kbupcAZSp2YH6TlxBCfXTwshr8lWlY6aTeBBRkj3kxtYMbMI7NDotWtChvz6hguKtRlplh1BPlt390 1708 | user75:$6$HzFsfpTZshObVWLM$uF9PUtF8mp8NINC43AA20BxpFDMpZgRaCyw.KMbHdD0AkiyTJBgIrwaZgbTHeE2FTsT1f5Jnu8.o8RqnlaUjj1 1709 | user76:$6$7LdOqPmSAuRQa6qU$nQdfaW3i0fJOxnJgKNRvYXmYppoLsTDVEpYzQkd2fg3SKCRHqcB.LpCojEuQ7Vma4UYXAIBpxnKFFy6ywqcCi0 1710 | user77:$6$ML24ZJeIyE1MatAC$VwY87FGj/nYVtgyD1LbgjhDbLo5dGabiOy6I9ZpGddql4nWSjZvT1TqgDXetPULqLVkFcv/HUUE9TooRMef0z. 1711 | user78:$6$BvNiZxibymwh8xBH$BMnDtBeIwe7GvlfF6aiHbb.P6O1gMVgr1m3SCe7VF.MrahC1.KFCuFi2ITiNzTQljY6rVSdHuSt8hTCCoX.58/ 1712 | user79:$6$jlO5DiTaORgj3WE+$1XDhKYAme/4c3f6H3zNtqS3E5Y15sZA4Qmb7LzQ.0ICIKNZpXiqKIEZXysYm9.3d..f4VjkcRVgdXrb7rjD7x0 1713 | user80:$6$JYa+60qHmjEH8/JZ$7EplTzu7IsFtN1nEBRW.nPJoT/zzMYUsPqB/x/otLAJhQTK4MvpHekeSXDrHrJpUWurLngQwTJPXVSISDStVy/ 1714 | user81:$6$tHGe9yEcHcXdoQlP$a5YWdWD6EKHMrzYYbqQjyLxa4nlQDYNLI0.7lYkJyo1Fh9CxohdvNtBbEl36xsMQEmTnvPfvArVx/4qw8jayX0 1715 | user82:$6$++Sd43u7epwSI9q0$MVJ.b2NyadCA/oCuvCpxJN8Sl2fuZeNrDGrhYSLRvLVT1dFKRypORR2T.ncqoI6rz7edL9kUncqoQDeASqV81. 1716 | user83:$6$fKgkZ9fv2cFbiJHg$tdXtMBt/YdOmyJD8w2BJg0WQS8ZnOLxnY3PnEFuc9ZO1U/Fh0dmx5d7iZLyEYWzK/kXqvccOKB60MGm88TlU31 1717 | user84:$6$O+yJ1kkAzWA6uuqx$2Sj1SV47TQ650s7nr7korwG9hOGRUScqigxAQXR2fNATC2xNutjLqVDkmcABVaaMbv9IZtMutvLPEL3U3VRnG0 1718 | user85:$6$7q+NaEWbfhoCarNb$TXHVEV4VgEuP9sqICUuTokmO/k0v/DS5HV114JOO28mqxDfBUQ2zf.fUQEn6cWjbXaw5mZR2i725HUYDSSGc4. 1719 | user86:$6$TvZ2l5ABlKb7kilS$ZPZ543GN4hhetECpEN8lH0P4USF3/m8YVmB0ig6v5jbtSZBS./T.eVMTcrWnOqb2M2Uqcl/RjuXM0W/jOEELO/ 1720 | user87:$6$PghKZyzrEAVcoJsD$OTDO5dAVs6S6zY40gRxhKL0bpXH.bbCcnt71nHvjw9sBKx6qwa8ATiDt/.djFZxvKHpOxr4Y.XqdNfORNBR./1 1721 | user88:$6$+OOPLFD2/sHcJPso$JdLqceohAnyAM1mD0EodNF2x8zf5HeOOgGo4aF473jfd3fI/KymP.lUo5rxm8nR4YwZRpWYPnyP3BtqvJGdDT. 1722 | user89:$6$ZF36ZgDLQcru0Vts$srlkvSoGwzCYMJYIIGeIjkiMqSlkJbDCg8i7FjNM6faOjmYHX4vvL3hKcyaRM.w30HFnJiThWWEmC1MJ583zB1 1723 | user90:$6$rG5Sd1uxgyb99u6x$ZOLmrkPL5H6jN3Z./ReY5sZ70rMHOFGO9uif8LUJ/A..5QJ0FyyM90/BSCEHfxDWOLt0KsE3VUs/s7BquFDyS/ 1724 | user91:$6$yTGCLGdzGpbKWN3B$isygyCfY4HutP3RyfYUOUbYbJorkTgNbwewMRktIbq64V95NrueawEcXAOJxaMR2fuyyurkqTmxg711dTR4kz. 1725 | user92:$6$l/NMnU/azwUJQFUy$c.jlxSGghccRbAVJculKWR.Km4Tp..Oh8pw905DKolwdWPnKu1Ty97EqfqnYYFXk4sbBNjzGUfI05h0FZzWlB. 1726 | user93:$6$jK3mMBwy4c1VzW+1$NMak69hN6dX38Dx4WstaUpl0yozbs2AJePpypxMUfBkCZ9C2Gf9dxGIuvQsO3UU4EAh0I2eBvdtoOeJXwIN6m1 1727 | user94:$6$PKqxtYKIqV+UJMfT$RwVvcXo8wfJsmUrJx7U1rgF42qlWScx5Og1EprHEX.zjsCROzDdz559qv5vuWNtuSGvNxeSq10GHm.b9W5QyY/ 1728 | user95:$6$YblektRHocaX6g0b$3D5EGIFTKacOtY7VyEpXyxzo8K/xcm/0r.L4YLvn2.LHuuTRknmWsJyfcL2PKtyy4asHHhV2QmaNXJyhIoBA30 1729 | user96:$6$vGuG2lqoBA31/SRn$rNFKKa8/T14BWT6hA83Ur6d51LizBRewgTyJJmUimzmIMEEVM1Jvcko33vO88M7KBy412f3/yDKXfUgB4QaGz. 1730 | user97:$6$cnEItOURElh3dcLP$3kpniN6TtvDZedrW7V985IJu/3dZKmF7qQ4QQ4NLAb35LO96j27ageDDKo9nCG.DuZqT8hI9EGnHfchO12CJ11 1731 | user98:$6$51OwHKzQ7UzS5qB7$2jprA0CJ1/MxFdFSlsopaW8AKbU9g0Gn29RmRepOWYbzR8oArJx20na5ntT4R8kU1sfjQxu5u8GLQJy.ecb3w. 1732 | user99:$6$bgInyBdOv3FdjvnZ$IpLWyQFaYdBJYuYwCtLrEr7JRvP0kqGkI1EPNwBopwLC84amOco8R9GkgLPC70UrlwEn/QAf6Aeyu88jrWCXl/ 1733 | user100:$6$JndMmBkmC1Bv7ag1$96qcT4/t4JGbHixllT12JunxEhaYdtz7W1OrkvzSxo2fQ5fa2Uqmcinvhj3dnXLjd40X7tCulhPZKfMXOt9S3. 1734 | user101:$6$5DLYRR16VW5ldlQf$Bb985Fke1MpIrCib/OAOgbjAzA6uqd2uWPRoQ0x1C5FJjMF/KTck.zb7URTeOj0rEucCWF.LTWzftk9GOiM901 1735 | user102:$6$kwyJp19VevPJgyDD$fsU0I2z5sfbhfK.VGbP86TCHgCvH4m1c/HXmAhighG9QdqdQwPM11UJpRHZBDgZ.E5kw2L.oApIB15qYE6Azx/ 1736 | user103:$6$yKUoppJs0xaEndj8$6TyOWZjX0iVwbZvZPxUqkxmmxJ3ud0FdrA3VzHQREwlXvHwAPNM070RZdLGD5NPn4l2IX/W6bvT.IZeCPmw0z. 1737 | user104:$6$bziREqD82qpUOGHv$xmZovtqSVasQCfF9Q6d.FhOH1J8p2m94HS3KrPTvsT.xa5BHEYJhvtX82Gh6dK5wkXOvPTysgpbsNDeDPpuoe. 1738 | user105:$6$bk/ZD4drQyphuNfq$tNSM0bSs9ZFA9OYCOTUtfLghxgYCw/6JdwmYw.fAnK.3KWQMZzaV/JqKX.pwsJkNW5Ztv3tqeRkNTl2GpxkhE/ 1739 | user106:$6$HYmGByuW23WA+p8D$5446LFGEbkh.VbjY0.OwSMhm.m0EORfPNYuGTwPkfVQomtJcuI.8l6nwUK0NHtn6vVpztRGCcjbDn6dUNI7ap/ 1740 | user107:$6$TL4trSiZUCiHUe4x$.Z19OjW39XfYlNzuFMxYo4mB33atA9KrDcm85MNXo4wMNpT8wRovlqNbjpRCt5M2.bmR.pD7diKTNcDb3htfG0 1741 | user108:$6$DVQsKzXWXLi1ioGY$rh539/HVOg1QXnCWnUQ2jUbNDxDuoNqnYTMOujGjvjUy46jg7COgV6N6sQOjxRpqY/zr/UKVvrACiw85dTTS8/ 1742 | user109:$6$ux2yaM+2Ye/gagJH$mUj6SmooCceJoIsCualxFe6Dy8pzoWgWsi/OxNAW9JV8HSQnNvCz0xN82DDbujPwtUSLnapNpCpM7WiQMpxIl1 1743 | user110:$6$kp7BC/Sq6UFsX90k$HJAyd5U3jITruiNPdb06MB.bnRthk6iJ9RsColdFRCQmC57Z4Eu2RFU7s5kyR9Kj4elZKFXkWKhhbTR.Wmig60 1744 | user111:$6$LK+gby75GClE+3aC$XWiZ/GNPS7VkksYTaCpxAQtWQwLTxDaHmSsa6KfJsSkBY3953CW/AaZ/EFitEgvlSfKvtfEaU2x3asxy5aq/O/ 1745 | user112:$6$CNi3I49CqQ5RkYYi$haqs/J3z2AqneAkxgYyR6lQhwdmzSmTfz3afEseaU9/VPvSfGiNPx3iXcwV25O4ZNXULke9Jm27JAiTwsRnlC1 1746 | user113:$6$nIOK08z+lYsD9lba$v0oogV4vHPF1NR9E5YvDTKBoUQQzLc1CN18KwQ9eYooonZZ8stuhJrZ8HND15g6b1q/5d8wD99.1Wa49yg8HZ0 1747 | user114:$6$MtXgLEKYbrBlmXx5$9LVRdRn1rckiFDhQb.z2.e7eNbdLEzSlFLwVhsxgiVivtxL89xUT7vjJwPajMvtNPznqZdeguSd5nkxV4ha6j/ 1748 | user115:$6$6WaqCCeOPSAwGtlh$.2bHrBZ68neMWH.1IR9Qzpdgo.KnwUrPHXJPYBn9DbY7kL1w9hao89R6PnvFzN9K5gmJ/fFccH.i9fL4UTg5F1 1749 | user116:$6$KAXfNsuJZQK4VnlI$buQsO2/sGI2p.LdJMCzZjFMzfASvI5WaP.SBgGHrl.2WLjahUpGvA1EP0p7MZLgtHgewG9bCo0SOALBhTaICr. 1750 | user117:$6$LBKEATgLhva12BWQ$VyZ/GK34n/5DTXonA7jRiFIFIhI1lQpamfn5owQxjOlyapNCN.IzIVqSZv.n8XgF.IdosimK16rpwrtGTQXtD/ 1751 | user118:$6$thc4EVuK+j15fRYc$voDe0DxIERor4xH7VWGylQ/P31WSX99avKAqIQvWNkYS4xpfOjYKjUvMCxI9yBcKa6GWMB0fH/cNWwssZIE9b. 1752 | user119:$6$Ew7MxGyyTvZaHPkQ$dFGh8vnqg5W/355HMlS.vTUwBQLMuGGN0DLL6Y7iQ8eDdSs4u0hUroJTk9WEx2PUbGVDAOfM2WlCqGfiy/0g1. 1753 | user120:$6$QkdSOP9lU+5TPEz0$lFqkVzcTciFj7OUc97oa1l7PaqxSFzmUIFVRzxnFvApVVXd0xTWO2Wb04jOIlJZj8Err5L7xzM9.Yii.s1Ha7. 1754 | user121:$6$jjzEpmikkQ0CPD5w$GA/sz2aVpxtOJvQ6MSVcoi3WQTtMgdPn.TPuH9pcOCKSPRIfvt2OvPTHhRA74jKU45lpbSn8Nya5CF.RCHx2T1 1755 | user122:$6$7PaxwFMUw+S/kcoE$L5h53c7zhQq08mcq8e061Dg7933a4LQ.7eRDKLoBt3nJMhh4VdEmEppf2PVWVK0CiF.TsHiyrA04mkAd7OYCv/ 1756 | user123:$6$b2c28Mwf9f8SHqoY$7aoRB9lRQSBRrC3Xu5lDoDRtuJ7NkQpvYIeANBKpXY2Azm1Cw0rIy9i9kumEJOunD5c/k0x9Bn.0AILVxwFQ71 1757 | user124:$6$Pt5EmgV6Fj85TzNa$4KHQzcFLrzWtTy69uQ7mh9T2KFtWGWjdmcsIC9MEjzjFogp5GpE0UchcC6vFaHitKfqU5u46bD47iImN5eyf6/ 1758 | user125:$6$i1F8Ad6InnQMeSig$TljGGonZXttg98rQABCpTOAUO/gvS9/34l81jMPXWEOxRUiYfx7jfVG/sW4EZp1rO0RcCj.7zBmDFSXdPQuXX. 1759 | user126:$6$Z1EfuKec0rvD0SAE$QJIys/bQiWXA8mW3YfGVFBTsBYw3a5g.TuromEQIRvCNf/5UV4UQLH.KBVrHA5/Od4QFteQ9nt4hDOk1Grsvm0 1760 | user127:$6$nFv1athHywuJRdea$1JTUyNL8FVij8Gp1cZluN5x/ZnvGWB2emMBip9cP6e3/wEYe1G.yimcnLYrCRVMqzHvM03GsML99eh/4CbUF20 1761 | user128:$6$8QpC3qvHIEn7f3Rx$YCsXgcDN7BRYNhyRnSTGartlPICgCKj3DQtkXSNKdMjgZgK/vk4pL4g2bH/IABldfI5p68z4inLfe3X3ekQSr1 1762 | user129:$6$GhmwqNs3P9u9Z2E1$svQnybuEa3a.B6MfSM5zmqyk2lKjgqeQkDn1v5jvp6x.BoU2g16eaBo8Fwdrczhiv62M5/1hSV8C0lZr2jWnb/ 1763 | user130:$6$5RNl/khtgrDxWUst$tPxow1cdMc7TA1MoUWqS.WGQCWMS3hm4Lidd5qfxsyMM7rHC.Y3VUbbOjko6GJ7W8rVQHDou/MOQ1e7Yltaog0 1764 | user131:$6$DRz8bZMbHDTPJbw7$D0wlwzB/6J/kSwtwuX1yxOvrWmWXrv0zjRKTGpdjO6Ljoc301k4g3kwX6j1T/HE6VfQaQcROsHjzJVB8ZdWIF. 1765 | user132:$6$FOZhSEhGrI/YnpyP$F0vyG9zPJTsT.D3M6nHxidmU8mv92QP5zWfnxnlrvNTkoC.yELRWmrH9fpJNbuiWjSAPOuBJYaogdl.CU.gBX/ 1766 | user133:$6$0sErHhUtWNSa97Uh$494uQaR5vo/pXJyYL45O0jotXC0l6fQQWMAiNwdT5JTBuGG6CMRx8eO8WIO.OX8l1B6SaO3sV7n38GvKtLZ5o/ 1767 | user134:$6$OggwEs6gCsV8uj+o$4FBg3nLytdRsln2.B7DyrceZ9sJ3Q56SXNbTfd26pjtIFnbUZAi48tWKLcAowoTsNkOW3q5DDlNIpg/tHk8RS. 1768 | user135:$6$q7xKBRZ4C0KcbVZR$rcO9wvlod/R27bIU.ZuR78u7r/Bbtzq4JdcnUH7nTg85D3ERGZSUHpFOBkRnRJ5qCO2OHxdU67Hb68FZ2FmPi0 1769 | user136:$6$u21/P5MrH/o/GhSW$sIqnjiYNFi9NZM3szZUyK0So.dbVYz2fBx/4fScTFN9PlV2vGCWki1HyTTuH7ovXcvRETnAD3FouixV1lOhmd0 1770 | user137:$6$ccRzo197OsFyPGSB$aq7yML6ZILpe7pQ5LRkR6Zyt8sQrEewjc.FzaXLHwkdHIAd2gZZ9s10agCp5mT7cfSeDkaXlrMDyxgYIPGCnw1 1771 | user138:$6$12l84ChrF+WLaRZv$ZFoe09eKSsr3gTS3rI6wSn1qUHd9SOCBr5R58eJ7W2Z8Vzd75llb/fc9lTxZ50BIfK1IOfKx3cTIxd2ohiYyv1 1772 | user139:$6$PXiz3IdbWQWlidqh$vgSVHM0rt7wZU2aKgmrGO0E36HnAMbr71F9ivn68//zI0nH0TvwxKhJ1M/1VUo7UwG0kKU2gCG6o4HypL5trI/ 1773 | user140:$6$QP2GZFxeC4S0yM67$CenpHj4jVvlICB9GU9.7PxymL.AISjRia2DluNi1tLLnJheq0bZzeIT.TspxhVJk7.eIP72ckCTov2uPKPf57. 1774 | user141:$6$cAMtbaFuV9MY6J0U$aP9NO/PcGURMWpgIGbMGLPjzeiTVfyiaxRpsr6SSrtjYHQgXpFohnsydUqWP/9niVuOXop25IFWHsY2hi7Yow1 1775 | user142:$6$YrxOYhjx4I6UvpO8$2uwbLVW.32LHfpaEYLMrUDndIAlS0GMkwPBoNmo7D6xKmYHFUqSieqMsIz08ic2QSZ/IfoFyM8o2U25c5stet1 1776 | user143:$6$Q0tF+W5ZIWlh+4Uw$1Yyo/b/1laGRxHhQ32X3zvnsuDBN.V7xqYm3Ptp6ogBT8QjKEl85OTivY8OfFS1OoUH3PTNsj9LSHD.BQ.NrK. 1777 | user144:$6$eKw70jw+hSjrWboM$b5tCiGvJMX3xWNsuY199iWY9T3NOVAd1h3xrbsAeMi4S52uZhLpPf8pyZMqJYZEHIxGTq47KKGPmtvKZl3mgS/ 1778 | user145:$6$JxxBz8ORtj/dbETO$XqLdi/2kNLhya4Nw/NAJu00vpFHNkZ6uzqKqmzp9.ML6ysA0boUsJAtWpcalFtDzSY0BkAvqdpjEACCCt1jPZ. 1779 | user146:$6$NRpzsrONq5FPT/QV$eLkFbTbD9LZa48jFaZJ2OpTEyZO8hh8HVvFgecNhsbU/PSY/j3EKWJRu.xw1XJDdXO5OvAQuYmOxeI.li7Ml00 1780 | user147:$6$/Kz4uY/XPspZGrxx$w0ihIZfWLN4c91RI7GqlOyXIfHwRD//IOB7z1.hyNvOUOMx1lL9NcvvdPbAH5XaioASnkBR44vYD.BsIuBPqb. 1781 | user148:$6$FIw/GnuKTefEFyqD$IZx.hbEELagvuu9DiqkGD/XXPcnHFKQpKK.Kq0IufTT//STdFOHdywIdTkMymsvK24DFIX7lAWacqVG/l79sr0 1782 | user149:$6$98RBi29gmsbXeJsK$Y73bb.fF4eH2m0jwPjOnsmnHeE0QoYyKRyc7KuGZTeabTeKiSEu7sGdQeUxh5CHBqZg/yujnG0S3msWelKN.4/ 1783 | user150:$6$fuI0Le3o+0sUyVaj$dfeeW9KcLTjhJmTxCF4GlVfBqhy9SfUjRGTfX273Bh8ARrxTrYiz/2eXgyKDY5mQ.Px.kRZ3l0KHHqB7WY3AL1 1784 | user151:$6$fY5EaWA8dTnfNLMl$VGDdUZKVe7mpsH6/YcvExnFUk2o4m2QM7hIXNpaRpefS2E/beu9Vsql6PyQ.vByGBvmG9lymBESmzP9CbYSck1 1785 | user152:$6$xtTFIL6EHlkvhubQ$v/mbx5oyvZkiKplWP04gCEVxsslvtThAUWz.w.wscUVsj7vQxLSy5YrxqZJYGKAb57E3PsiDbx6ZtZsgraAUA. 1786 | user153:$6$lUB1q9apE3RPKoSp$8vzMF6AplYVO83SrAff/CQpTKoTsN.1WeQjyueLaDjT9BLqEnarUTtyfE4BjNFKISLEuW35pWv5wbdeHl622M0 1787 | user154:$6$y9yQhkBqffpQwncX$X0y1l9dS93nfuS8Qt0srAMrWlEvdm812BQ7EQGRoyRbMQ15UxDafgqT0hWeySQVit9KconqMcFn07Tq7ZFmfB0 1788 | user155:$6$ijDozdvnVrVLszIV$TI9JrHdNw5SUJxMyrlftxk2eR64/JdS5pmeAy7Kt1hkX3IMj3ZUYEMXSDH5SKKIV.PLpI7KNhcyTUYf8gl8sU. 1789 | user156:$6$hoK9JN4rkVn/bi95$mIHbL90SRgtxQ5l/HjlgmjAwR1j5NRNbBo6hJQQdDrIqgc.za/RAkSKyUrHYudCT2T02/bzpCGq4Q8HUgVtxW. 1790 | user157:$6$sm/PaBDw5/cZejCe$Y44fOjUxWphowQp9C2oVlHZ/Z/fie93fMAjc8.mL.QoVoWxHaEmtT4QHbc107amCfTpnZI/EzaLlyPl5lnztA/ 1791 | user158:$6$PNOGK53lkAj+6lwC$vPnx23g3inTHsR/PthXkMSQ.aUFpchgGXzY9XazU4GB.VCWkXEPjzPthFpcbkSyOguaX7d9w2cajAQ8TJSeLl/ 1792 | user159:$6$GjWe+rReojM3HGh5$m914Nzp/BZfQCrqhigkRCwTk8mJwQt4BeZkxvSZmzjp8MimPk6OFgqsVxPh4DVHwvpEd3v3aN8FFDQ.UhY/Es0 1793 | user160:$6$Vo4BxgT+psFgyz6D$cv/t78a/7xk9XX6dTQe4CWde/r8ZI9KDC.2ccNWbpF5kA2EBJYVpMsJjz7qmgRsddhUNB6gIuaO0mtjHsd6Gr0 1794 | user161:$6$70IM/1eInQmzdgt1$NO4hV1sajBLabg5G74sZxcs0TdmjaVZTPzGcd2NP.fxUXWk6YSpH40oTikJV2azq/vfl7MDLZT8UQzZcVHMb6/ 1795 | user162:$6$LK/aC4dym7KDfiUA$QxSjf06FJ1pQ38guQVUw1X9wtWERVhZ9EurDxTsl0MDbG1DyOWfOYi1j/FdlXd9wLDeY49axQkAY6FgD6Pf3u/ 1796 | user163:$6$uV1/HwgJ3719IBKM$gup8TpVZR.lV8h63OG2h56IXJws7wZ1pl33fajncL476RjI4DXARWtvw6A8EKBUHnI3EDzbHpO7o6j54KN3Y0/ 1797 | user164:$6$59daw1hPFEzbIx+P$8jo9J7dVxeYRvXGQjXFGz0RQbFjoqi8a.EmJGxkXYmXdr479IPog.QzhECi2VFEzQvudWU/P//GGEHnorx1sA0 1798 | user165:$6$m6o3a0Wg9hb+scNH$pjkQqRvtFusglnR8hK6lb1Eh/n/ZZAE3EplaEmQFp5vZHx67JroqqFazxNB4IvpYPTgVnpE/T1Mz8pnPvFSlK/ 1799 | user166:$6$Yr22rRJkwdxPXR0J$yAGeUA53extS8knKYjwwCNE9tDoz2drb4Verir2JeISCQsTQ7A7PsI/LVGtr7ykLjahnhMsHg8exidoH3/goV/ 1800 | user167:$6$pvAQIWaF0XPJjB8g$FdIo0VsYZ4P.lajAv0DyEPvKLANai30k2ZD7SwNpPPGnsH4MAhJi5tMquPVB2KUAUUWN50NIcf1aMMGHEmWQY0 1801 | user168:$6$EhKqVKIPa3vXmBSB$XaotSV4Jyw3bRqhIyv1eqeOwjPIgMyWyy0H8tOfS62k/NlkVSeej2aB028bVZ2hKJgbaAR.NLsyOGzQvzMQVm. 1802 | user169:$6$hJ3hNhPCXJX916Cv$CsWLrikChmXdDGprD9GZaaZne9/RcpYa9QWQfmLGSvi5HDheWHNe6uPw9ivKEGMOgjvnACazLkm7Wj3Ggn8aY. 1803 | user170:$6$fkyOXf8lb1DJdOUk$dqF1kT/FrdVildx9PAItgoDdqfaK0UY31utzHrmKGmIK8kgkHsQhg.DObz.r4DA3/Rh49THduKIZqyoE8Fgxy/ 1804 | user171:$6$YTtwS8u4bK5pqCA3$J/97tmz6kt1JvOL6YUH/mNPYJqMX9.LuAy55BF1jcSd5qQOxFk/zENy.SbnSvUUxP75L8MTlOXCYyHsegSzpr0 1805 | user172:$6$OTLexHePAciITWLc$.Nvny9fhR0MG7LpVOni7ds1XTv73FUP9KvlqMDcCa9u6HOFxhtQWysPZLQ4npxZdAY7xKtNSlaNq5WUWZWgs2. 1806 | user173:$6$uZi+hytOQmZTxAvZ$7uUz93BZPeOgcFSI3JfYrl1MfVQNiMDQRz5ZWUqQOl7xxT5j/ivyhx3ZfI6X8LuoE8xsFlizUk6OPN/HkCTve0 1807 | user174:$6$nSvdx41UzBudU4td$9u7freald.m3WmmXwAqyjN.6qImyVAvhh/E0lx7UEAPHDOYUS6JeQGU/k4LBpDXzqlDwR7H5XLPXC5nybtozp/ 1808 | user175:$6$AhTyZbcOP2+xFjKP$o3VB6GNx2t6EEXfnNmAyzKzddkXsyqemAnW4BtlWjNopXe/VoiujfoohypYKBD8y5tL5.AMnbCNaJ7zFwUBrS0 1809 | user176:$6$iWOFLEO8WMnFlS2Y$5zGJH/2WBw5hmVv2fkVamL6sXLMsrTiUiQeXwnUPigEYWlWVUpyDzNB1TwfN9sqVDrdihL/nl6K4Mfh4gGOYc0 1810 | user177:$6$w5BGrryzNjIkZ1Td$gEH5ddig4fXSAz1yTHFHBwyPIfMrRZ8Y1Y5BVG.3YVxnzo.3bTzaVqB7jzNTacRznllE5xAO5yyGYseLDHyAR. 1811 | user178:$6$pDDmgAL8LiPsEPU6$br.GUGUXOfJ1hE9krnV4lNxH0TpTvXyfmMQSzLcQt2EXppd4JvvHfh2sE7Q.m1rm7t5cvUBnJcVel3MhKJMko. 1812 | user179:$6$Js2duoC78woyKvZK$rH5qmdzyn8RQ1hJmXiugYFPwAUs1w.MgyI2.HMjBI7bj0rGSWAOcdAI7VHIPscCaZSNI6u.r5UvLW1EJf.oP./ 1813 | user180:$6$j01n1nq1s80HwYog$t9n1.xywF8RE61qJ0i6H.zh0YeNJ2tEpOutEq3xokN4IJn35wKGWL.WwCJVTjUtyTaKeZuf3bn8q1Jhcc7aRi. 1814 | user181:$6$TRegjfI+Y1tXIC9N$i.yl5rhyneWbbAc7mKNQNerjiiP382zmyFoToKLtEv24y9XmXVDq18zxrFNgKNNL.0OWboWDeVCo2/PjhDHvG1 1815 | user182:$6$uNYNoakbrkvAmU+0$NBuZt539ctPUE5TtUqT6hKmVdDOxxcPIEa6UzWpouKFmfSq5w/auHbqbAM85nD4nUCIbRvb3/r49sBeG9WPtn0 1816 | user183:$6$ihyCgCnhDJpVD/f7$NjRt8chOyIYgbOd4gFFDMWlrbve4PBXxMPIyVDrzwWTQ0MVG7/zm6HwMILO/JiXducfx4QGqSbjV6Yh0J/vKj/ 1817 | user184:$6$2CEcq6j5s5zQeVvN$dQgL/ntIn7qDG3ThlJV59fasiQSp1T6TmIGJhOIITMGEBGuAfSf9w4t8THXILnO3CcHDsKO1TxQP7Q7TCzkIi1 1818 | user185:$6$ZHi7/wcgLNFY3oaF$Y6DqSZ3ezGfj6ojjiA7et07TmDt2lgCr/0Ym8MiJlWNt4EM.CZv4XrFr/3J8XADQjAI06.3NgfqpE6y8F1p9R. 1819 | user186:$6$jitRjYNpphwo5Jf0$XA85E3AQWfIGgwLBjqRA./wxSMNxAHkNDIRCq3dhNkj6Fvp4nXB7Z7ANTjRKAIZ9sJJkHbO.YSaHiQVtnuQKd0 1820 | user187:$6$dK+IACYCI2tc2p+a$nfusFebmJZgtZqq/3SI.v.SyQwxsA1Y2I/TTLUhTevNyLpTfBosw3iYWSju/t3kMGkU6cW05AeMqlskRJCDsQ1 1821 | user188:$6$ZXsdgPPfhg1+tnYr$Ba6cZXkjZq5H9U/IgyHo9hodhNjKNfmqFi6WCk8yIA.5H3dRvTCTcvt7Fx12q2.YCkYlZFH4nYRb90nUJyd7k. 1822 | user189:$6$EdnDjPHLRd5jGibV$89xKZ77Bwg6q7D0QsqieBSmPX3wL3E5nrEktvDGopiBYgFB1BC9c5G5/Ldf.8KleQZcFqGPL0J..eZ9/OAR6Y0 1823 | user190:$6$ITjKgNRrD++XdXJ+$pcMAUnv/aB0IwRb8R4S9K6JDZJzT9UAAl6uR.5kJpu1MuZlskPYY5yiFJ1.gXnoeelRWALxoB/O/UrKaPgsHd0 1824 | user191:$6$Q7DCbJl/Er1vpghQ$EKpBmaoqLre0Za7eThnwZsreKqwRvwQLjG5bkD8l5q.Bd6dWmn2/1mzbIgGBC5Z4HvPlMAC..IzycD8tEn0.6. 1825 | user192:$6$xoVmQ3lbTGGB/xnH$V/aK4AgHSctqaFESUDJm84xSvOBdYlHCSwCCRXWJr7UBGwsJDJZvX5SMc8AUtmvH.26uYTo.XKtFpPgocJO59. 1826 | user193:$6$HUh0Wchl2UrViUaD$3LRzab2F4nqcISeqpRf8z8VYa3B3yqL71kalkml6WaFSxWpjRB7kTkBpJlhI5wVDR/B.osiXqBiVFdk4LYK7t. 1827 | user194:$6$4e1MqFSPkxbFijGP$lRBYyh3egAUcwORFYywQojgoDeHXXI6iATPbTd2A.lRIjMD1oCikr3FQEtDqMgXuiFUsxD8sGT6YjMjdPXbLj1 1828 | user195:$6$ORr7txV+TWvmYiA7$qWgeIx0h.EFUosDAWr8vJTmj2xVthskOxDJ6jW6mH8yiod5Pi97urCQmaQWMiI2dLG8fbxHVDhhz2KqLhFRWx/ 1829 | user196:$6$sgWbUc3fS+xd0d+9$qJxUrgjxMnSWYy4k6.KfpCjVV2YN2sVgzNENGoykGwrmuP4V0Cw14Gqj9eBbES3TjIPHKkBwa5gIwmBHLv4Qc1 1830 | user197:$6$bsJXFs2QNx8s8Kjk$58D9BnyWb5T320LB6ngHyJSXBPzGlWQVeUmB9rH1Vsq1AAJlojs31LSHCcPGpyknUZRx3eHqRjFXlosmmLAbT1 1831 | user198:$6$xB+YALxpWhnd00nX$b9IhO5pOwjcLqVdxDGbIFftg9XB4cfPZfidQ0wiwy4s0BlkZPD2eR3U9r7q8jcHOYkM8Q4EQ/7FOz3gg.qNKa0 1832 | user199:$6$CZrcxdXYlRS6Ve1L$eY.D.b8QbsF5IpKnuXwhCApe10qTK1ldO3SxtRyO/UQ9cuvyVFUEGixfQgiqXvbraZnDXtnAznLul3C3Yf.wm/ 1833 | user200:$6$AcPNvmcT6HTw4ATb$k04yoxjtaagGJpcazWjRV4hCa3IgtvaIHWxiPmyceofSwSVbkLZATfMmOXDIRWmXupC/nuhwixrm.zF9neHti. 1834 | user201:$6$rounds=5000$AcPNvmcT6HTw4ATb$k04yoxjtaagGJpcazWjRV4hCa3IgtvaIHWxiPmyceofSwSVbkLZATfMmOXDIRWmXupC/nuhwixrm.zF9neHti. 1835 | ` 1836 | 1837 | func testSystemReader(t *testing.T, name string, contents string) { 1838 | r := strings.NewReader(contents) 1839 | 1840 | htp, err := NewFromReader(r, DefaultSystems, nil) 1841 | if err != nil { 1842 | t.Fatalf("Failed to read htpasswd reader") 1843 | } 1844 | 1845 | for _, u := range testUsers { 1846 | if good := htp.Match(u.username, u.password); !good { 1847 | t.Errorf("%s user %s, password %s failed to authenticate: %t", name, u.username, u.password, good) 1848 | } 1849 | 1850 | notPass := u.password + "not" 1851 | if bad := htp.Match(u.username, notPass); bad { 1852 | t.Errorf("%s user %s, password %s erroneously authenticated: %t", name, u.username, notPass, bad) 1853 | } 1854 | } 1855 | } 1856 | 1857 | func testSystem(t *testing.T, name string, contents string) { 1858 | f, err := os.CreateTemp("", "gohtpasswd") 1859 | if err != nil { 1860 | t.Fatalf("Failed to make temp file: %s", err.Error()) 1861 | } 1862 | defer os.Remove(f.Name()) 1863 | 1864 | if _, err := f.WriteString(contents); err != nil { 1865 | t.Fatalf("Failed to write temporary file: %s", err.Error()) 1866 | } 1867 | if err := f.Close(); err != nil { 1868 | t.Fatalf("Failed to close temporary file: %s", err.Error()) 1869 | } 1870 | 1871 | htp, err := New(f.Name(), DefaultSystems, nil) 1872 | if err != nil { 1873 | t.Fatalf("Failed to read htpasswd file") 1874 | } 1875 | 1876 | for _, u := range testUsers { 1877 | 1878 | if good := htp.Match(u.username, u.password); !good { 1879 | t.Errorf("%s user %s, password %s failed to authenticate: %t", name, u.username, u.password, good) 1880 | } 1881 | 1882 | notPass := u.password + "not" 1883 | if bad := htp.Match(u.username, notPass); bad { 1884 | t.Errorf("%s user %s, password %s erroneously authenticated: %t", name, u.username, notPass, bad) 1885 | } 1886 | } 1887 | } 1888 | 1889 | func Test_PlainReader(t *testing.T) { testSystemReader(t, "plain", textPlain) } 1890 | func Test_PlainFile(t *testing.T) { testSystem(t, "plain", textPlain) } 1891 | 1892 | func Test_ShaReader(t *testing.T) { testSystemReader(t, "sha", textSha) } 1893 | func Test_ShaFile(t *testing.T) { testSystem(t, "sha", textSha) } 1894 | 1895 | func Test_Apr1Reader(t *testing.T) { testSystemReader(t, "md5", textApr1) } 1896 | func Test_Apr1File(t *testing.T) { testSystem(t, "md5", textApr1) } 1897 | 1898 | func Test_Md5Reader(t *testing.T) { testSystemReader(t, "md5", textMd5Crypt) } 1899 | func Test_Md5File(t *testing.T) { testSystem(t, "md5", textMd5Crypt) } 1900 | 1901 | func Test_BcryptReader(t *testing.T) { testSystemReader(t, "bcrypt", textBcrypt) } 1902 | func Test_BcryptFile(t *testing.T) { testSystem(t, "bcrypt", textBcrypt) } 1903 | 1904 | func Test_SshaReader(t *testing.T) { testSystemReader(t, "ssha", textSsha) } 1905 | func Test_SshaFile(t *testing.T) { testSystem(t, "ssha", textSsha) } 1906 | 1907 | func Test_CryptSha256Reader(t *testing.T) { testSystemReader(t, "crypt-sha256", testCryptSha256) } 1908 | func Test_CryptSha256File(t *testing.T) { testSystem(t, "crypt-sha256", testCryptSha256) } 1909 | 1910 | func Test_CryptSha512Reader(t *testing.T) { testSystemReader(t, "crypt-sha512", testCryptSha512) } 1911 | func Test_CryptSha512File(t *testing.T) { testSystem(t, "crypt-sha512", testCryptSha512) } 1912 | -------------------------------------------------------------------------------- /md5.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "bytes" 5 | "crypto/md5" 6 | "fmt" 7 | "strings" 8 | ) 9 | 10 | type md5Password struct { 11 | salt string 12 | hashed string 13 | prefix string 14 | } 15 | 16 | // PrefixCryptMd5 is the Md5crypt hash prefix 17 | const PrefixCryptMd5 = "$1$" 18 | 19 | // PrefixCryptApr1 is the Apache Apr1 hash prefix 20 | const PrefixCryptApr1 = "$apr1$" 21 | 22 | // AcceptMd5 accepts valid MD5 encoded passwords 23 | func AcceptMd5(src string) (EncodedPasswd, error) { 24 | if !strings.HasPrefix(src, PrefixCryptApr1) && !strings.HasPrefix(src, PrefixCryptMd5) { 25 | return nil, nil 26 | } 27 | 28 | prefix := PrefixCryptApr1 29 | if strings.HasPrefix(src, PrefixCryptMd5) { 30 | prefix = PrefixCryptMd5 31 | } 32 | rest := strings.TrimPrefix(src, prefix) 33 | mparts := strings.SplitN(rest, "$", 2) 34 | if len(mparts) != 2 { 35 | return nil, fmt.Errorf("malformed md5 password: %s", src) 36 | } 37 | 38 | salt, hashed := mparts[0], mparts[1] 39 | return &md5Password{salt, hashed, prefix}, nil 40 | } 41 | 42 | // RejectMd5 rejects any MD5 encoded password 43 | func RejectMd5(src string) (EncodedPasswd, error) { 44 | if !strings.HasPrefix(src, PrefixCryptApr1) && !strings.HasPrefix(src, PrefixCryptMd5) { 45 | return nil, nil 46 | } 47 | return nil, fmt.Errorf("md5 password rejected: %s", src) 48 | } 49 | 50 | // This is the MD5 hashing function out of Apache's htpasswd program. The algorithm 51 | // is insane, but we have to match it. Mercifully I found a PHP variant of it at 52 | // 53 | // http://stackoverflow.com/questions/2994637/how-to-edit-htpasswd-using-php 54 | // 55 | // in an answer. That reads better than the original C, and is easy to instrument. 56 | // We will eventually go back to the original apr_md5.c for inspiration when the 57 | // PHP gets too weird. 58 | // The algorithm makes more sense if you imagine the original authors in a pub, 59 | // drinking beer and rolling dice as the fundamental design process. 60 | // Note that this is the same algorithm used in md5Crypt except for the prefix in md5Crypt is $1$ 61 | // while in apr1 it's $apr1$ 62 | func md5Crypt(password string, salt string, prefix string) string { 63 | 64 | // start with a hash of password and salt 65 | initBin := md5.Sum([]byte(password + salt + password)) 66 | 67 | // begin an initial string with hash and salt 68 | initText := bytes.NewBufferString(password + prefix + salt) 69 | 70 | // add crap to the string willy-nilly 71 | for i := len(password); i > 0; i -= 16 { 72 | lim := i 73 | if lim > 16 { 74 | lim = 16 75 | } 76 | initText.Write(initBin[0:lim]) 77 | } 78 | 79 | // add more crap to the string willy-nilly 80 | for i := len(password); i > 0; i >>= 1 { 81 | if (i & 1) == 1 { 82 | initText.WriteByte(byte(0)) 83 | } else { 84 | initText.WriteByte(password[0]) 85 | } 86 | } 87 | 88 | // Begin our hashing in earnest using our initial string 89 | bin := md5.Sum(initText.Bytes()) 90 | 91 | n := bytes.NewBuffer([]byte{}) 92 | 93 | for i := 0; i < 1000; i++ { 94 | // prepare to make a new muddle 95 | n.Reset() 96 | 97 | // alternate password+crap+bin with bin+crap+password 98 | if (i & 1) == 1 { 99 | n.WriteString(password) 100 | } else { 101 | n.Write(bin[:]) 102 | } 103 | 104 | // usually add the salt, but not always 105 | if i%3 != 0 { 106 | n.WriteString(salt) 107 | } 108 | 109 | // usually add the password but not always 110 | if i%7 != 0 { 111 | n.WriteString(password) 112 | } 113 | 114 | // the back half of that alternation 115 | if (i & 1) == 1 { 116 | n.Write(bin[:]) 117 | } else { 118 | n.WriteString(password) 119 | } 120 | 121 | // replace bin with the md5 of this muddle 122 | bin = md5.Sum(n.Bytes()) 123 | } 124 | 125 | // At this point we stop transliterating the PHP code and flip back to 126 | // reading the Apache source. The PHP uses their base64 library, but that 127 | // uses the wrong character set so needs to be repaired afterwards and reversed 128 | // and it is just really weird to read. 129 | 130 | result := bytes.NewBuffer([]byte{}) 131 | 132 | // This is our own little similar-to-base64-but-not-quite filler 133 | fill := func(a byte, b byte, c byte) { 134 | v := (uint(a) << 16) + (uint(b) << 8) + uint(c) // take our 24 input bits 135 | 136 | for i := 0; i < 4; i++ { // and pump out a character for each 6 bits 137 | result.WriteByte("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[v&0x3f]) 138 | v >>= 6 139 | } 140 | } 141 | 142 | // The order of these indices is strange, be careful 143 | fill(bin[0], bin[6], bin[12]) 144 | fill(bin[1], bin[7], bin[13]) 145 | fill(bin[2], bin[8], bin[14]) 146 | fill(bin[3], bin[9], bin[15]) 147 | fill(bin[4], bin[10], bin[5]) // 5? Yes. 148 | fill(0, 0, bin[11]) 149 | 150 | resultString := string(result.Bytes()[0:22]) // we wrote two extras since we only need 22. 151 | 152 | return resultString 153 | } 154 | 155 | func (m *md5Password) MatchesPassword(pw string) bool { 156 | hashed := md5Crypt(pw, m.salt, m.prefix) 157 | return constantTimeEquals(hashed, m.hashed) 158 | } 159 | -------------------------------------------------------------------------------- /md5_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | ) 7 | 8 | type md5Datum struct { 9 | password string 10 | salt string 11 | hashed string 12 | prefix string 13 | } 14 | 15 | var md5CryptTestData = []md5Datum{ 16 | {"mickey5", "D89ubl/e", "dJ8XW4DfrJHTrnwCdx3Ji1", PrefixCryptMd5}, 17 | {"alexandrew", "D89ubl/e", "xuQ74IxhM3J10sv0QHVgA/", PrefixCryptMd5}, 18 | {"hawaiicats78", "D89ubl/e", "Y07COBJSUbNDlYlFyRYUp.", PrefixCryptMd5}, 19 | {"DIENOW", "D89ubl/e", "4IZ.tBiqvtxt7Dpt1MkgE1", PrefixCryptMd5}, 20 | {"e8f685", "D89ubl/e", "mLrBtDw8UTdAX7jDZLQIB0", PrefixCryptMd5}, 21 | {"Rickygirl03", "D89ubl/e", "gDHt/53o.SrKMB2Ts06ll1", PrefixCryptMd5}, 22 | {"123vb123", "D89ubl/e", "rRYNMP4siiirAmmukKbLH1", PrefixCryptMd5}, 23 | {"sheng060576", "D89ubl/e", "eZSBBncGvTB0M0FC5y25f/", PrefixCryptMd5}, 24 | {"hansisme", "D89ubl/e", "ulbSP3eTh0fe.Xi.1yZUK0", PrefixCryptMd5}, 25 | {"h4ck3rs311t3", "D89ubl/e", ".eWY6zxlyQZR2H/Wl1oBv.", PrefixCryptMd5}, 26 | {"K90JyTGA", "D89ubl/e", "z92umtR06bhr7asKE0qys/", PrefixCryptMd5}, 27 | {"aspire5101", "D89ubl/e", "TAcr1BfieDgQrINZM5ob4/", PrefixCryptMd5}, 28 | {"553568", "D89ubl/e", "/hZIUw5diSqk2M17H8ya2/", PrefixCryptMd5}, 29 | {"SRI", "D89ubl/e", "sQaL5tfFD85YivTet25eA0", PrefixCryptMd5}, 30 | {"maxmus", "D89ubl/e", "d/DZx6g1NFNtzU4.7a8zz1", PrefixCryptMd5}, 31 | {"a5xp9707", "D89ubl/e", "Ss.xxvcZk.hyZhfw.uHu./", PrefixCryptMd5}, 32 | {"tomasrim", "D89ubl/e", "0P5vwLE5BrTDStMNUSVvy.", PrefixCryptMd5}, 33 | {"2a0mag", "D89ubl/e", "6.cSxEJwebnwRhE3Hzn0p0", PrefixCryptMd5}, 34 | {"wmsfht", "D89ubl/e", "C/xkXc8Y1I58TITNT5B000", PrefixCryptMd5}, 35 | {"webmaster2364288", "D89ubl/e", "C793xtKVyHtLgE9kv9F3G/", PrefixCryptMd5}, 36 | {"121516m", "D89ubl/e", "l77x/.bF/SKs9j1fzZsxT0", PrefixCryptMd5}, 37 | {"T69228803", "D89ubl/e", "Kyx0nL8mqLVQSTEoLozXf0", PrefixCryptMd5}, 38 | {"qq820221", "D89ubl/e", "/K9HdFFaZs6fQtHeg50i2/", PrefixCryptMd5}, 39 | {"chenfy", "D89ubl/e", "5KXGSkIs4eVf9.vv784h2/", PrefixCryptMd5}, 40 | {"www.debure.net", "D89ubl/e", "Unn6gxvier6BbNqXXggcC1", PrefixCryptMd5}, 41 | {"1333e763", "D89ubl/e", "y6uoa9UFNh89NqUYl52rU1", PrefixCryptMd5}, 42 | {"burberries", "D89ubl/e", "/hj9e6a9Ka4A6PLtscUAJ/", PrefixCryptMd5}, 43 | {"chanmee14", "D89ubl/e", "FaTM181xgGpilXHhzKspp/", PrefixCryptMd5}, 44 | {"65432106543210", "D89ubl/e", "juw3fg2cPTz96Styto/mD/", PrefixCryptMd5}, 45 | {"powernet", "D89ubl/e", "VPgIKROD.HnIac7efgPqp/", PrefixCryptMd5}, 46 | {"a2d8i6a7", "D89ubl/e", "YHiBHNKujH.hOoduR6yI30", PrefixCryptMd5}, 47 | {"gvs9ptc", "D89ubl/e", "EZatY2FiaT38R7pJM28Ta1", PrefixCryptMd5}, 48 | {"Pookie", "D89ubl/e", "nXBo5NIufmx/azSj5c7xn0", PrefixCryptMd5}, 49 | {"lorissss", "D89ubl/e", "4c4jEBluS1Z/5gwpP5IHP1", PrefixCryptMd5}, 50 | {"ess", "D89ubl/e", "OTaO6MXXx/9Kzgdax4IFT1", PrefixCryptMd5}, 51 | {"sparra", "D89ubl/e", "fyLMarn1NGkBlrVvnOkWe/", PrefixCryptMd5}, 52 | {"allysson", "D89ubl/e", "BSEg4wMYeZZrqQRbgLZQ40", PrefixCryptMd5}, 53 | {"99128008", "D89ubl/e", "09Q0RgEq0luH52Q5D1r5h0", PrefixCryptMd5}, 54 | {"evisanne", "D89ubl/e", "0CFkGtb.nFnwY0AsvIZ/p1", PrefixCryptMd5}, 55 | {"qfxg7x9l", "D89ubl/e", "mxD6Tg8iiXGn2iuap9dkZ1", PrefixCryptMd5}, 56 | {"03415", "D89ubl/e", "jTHXwK8wWOmCWMhV/Nqq6.", PrefixCryptMd5}, 57 | {"87832309", "D89ubl/e", "eQQM1N3kzqYaJsIHAuma3.", PrefixCryptMd5}, 58 | {"816283", "D89ubl/e", "VPIMSuAdaNExEPg1o6BR21", PrefixCryptMd5}, 59 | {"banach12", "D89ubl/e", "tMKU2NslMUsgBVMJ4Z8Bw1", PrefixCryptMd5}, 60 | {"sjdszpsc", "D89ubl/e", "Zo9sQwDO9imDRzQjAvSit.", PrefixCryptMd5}, 61 | {"changsing", "D89ubl/e", "BnGW9hkQkwO/Fpj6lLGKK/", PrefixCryptMd5}, 62 | {"56339388", "D89ubl/e", "Gc5RbOS3wD6GwQ8rbSJDB.", PrefixCryptMd5}, 63 | {"52114157", "D89ubl/e", "5lIEMaiA6epkGKq3ZJJr./", PrefixCryptMd5}, 64 | {"jinebimb", "D89ubl/e", "tFt1GFVE6wxs5UhiRIPJo0", PrefixCryptMd5}, 65 | {"erol43", "D89ubl/e", "WNTQoeaBUI6P1ypLfFBGz1", PrefixCryptMd5}, 66 | {"2yagos", "D89ubl/e", "U/zmE2HZ9arX1CFysF48F0", PrefixCryptMd5}, 67 | {"habparty!", "D89ubl/e", "p.bG9zn.rvJB7E2nGhleK0", PrefixCryptMd5}, 68 | {"tangjianhui", "D89ubl/e", "zal5AqxTqbMoo36DXwEQi0", PrefixCryptMd5}, 69 | {"serandah", "D89ubl/e", "s8mCg6jFym06sqZWoOXZr/", PrefixCryptMd5}, 70 | {"mirrages", "D89ubl/e", "80YBEXI4zCLlO9bOld9ey/", PrefixCryptMd5}, 71 | {"mantgaxxl", "D89ubl/e", "coCMG.asGxvMHowtOtD/p.", PrefixCryptMd5}, 72 | {"45738901", "D89ubl/e", "ZSf.3PkORJgZTiW3WmC0S0", PrefixCryptMd5}, 73 | {"g523minna", "D89ubl/e", "Q8Ti7BlgMjNwXCjzsvGz0.", PrefixCryptMd5}, 74 | {"j202020", "D89ubl/e", "GplTzL8mgIki4Grxkmsnn0", PrefixCryptMd5}, 75 | {"g@mmaecho", "D89ubl/e", "SMrOpSVsLdDZh0fgSv3RQ.", PrefixCryptMd5}, 76 | {"042380", "D89ubl/e", "L7c4tHvipozBibsgDlIae.", PrefixCryptMd5}, 77 | {"ASRuin", "D89ubl/e", "0kSaA27U/3XSYr8ysXYk00", PrefixCryptMd5}, 78 | {"061990", "D89ubl/e", "h0QjZLtAyLFIS0RHzUC0g0", PrefixCryptMd5}, 79 | {"ysoline", "D89ubl/e", "m/HGZlMaYri6dyglbebGq1", PrefixCryptMd5}, 80 | {"liuzhouzhou", "D89ubl/e", "ZCeDrrlRD4z0GuWUhkRIp/", PrefixCryptMd5}, 81 | {"b0000000wind", "D89ubl/e", "mrunNmbLqlK6GBjHAyXme0", PrefixCryptMd5}, 82 | {"7913456852", "D89ubl/e", "LAleKOBmjHO.JkMqxZJva0", PrefixCryptMd5}, 83 | {"9008", "D89ubl/e", "PsZG8hCSDwlu61oK/xVwY/", PrefixCryptMd5}, 84 | {"waitlin11", "D89ubl/e", "FI4Kdq4kuDrE.02FKhu7l.", PrefixCryptMd5}, 85 | {"8fdakar", "D89ubl/e", "vM6r7Y64Zfo7Tw0YkPT.T.", PrefixCryptMd5}, 86 | {"eisball", "D89ubl/e", "AiLLO.VR/Z6HBLIsg59yg/", PrefixCryptMd5}, 87 | {"jenna17", "D89ubl/e", "NZ7SaJ8LroRQacSqrP7fp0", PrefixCryptMd5}, 88 | {"belkadonam", "D89ubl/e", "gfKqHDjTyhd5guuVyAg/i/", PrefixCryptMd5}, 89 | {"tfyuj9JW", "D89ubl/e", "Z45Dy1hE/XhDlnLJh63w80", PrefixCryptMd5}, 90 | {"nihaijidema", "D89ubl/e", "MmNfgZpCBgohV/RiCqEeh0", PrefixCryptMd5}, 91 | {"talapia", "D89ubl/e", "yx7VuwWX2kJ3fgelcamZp/", PrefixCryptMd5}, 92 | {"7376220", "D89ubl/e", "qSMTwpxirNVKQmnv0LKGt/", PrefixCryptMd5}, 93 | {"c7m8e1xsc3", "D89ubl/e", "i1mU8nOLP85sWe.XN35Cw/", PrefixCryptMd5}, 94 | {"84129793", "D89ubl/e", "/MSgRW0uYjW5NdqyBJdPB.", PrefixCryptMd5}, 95 | {"test1000", "D89ubl/e", "4pXO/YHKqJ51rx2dWolr.1", PrefixCryptMd5}, 96 | {"ecmanhatten", "D89ubl/e", "xLJthQG.pQzgK8oVOGzNB1", PrefixCryptMd5}, 97 | {"EvanYo3327", "D89ubl/e", "l1Q0BEAEDlXPW44kj5xhR0", PrefixCryptMd5}, 98 | {"269john139", "D89ubl/e", "qnjT/g8iIRqgJjEdutYMI/", PrefixCryptMd5}, 99 | {"3348159zw", "D89ubl/e", "5zxhC1KC7L1bfJPiZRzXp1", PrefixCryptMd5}, 100 | {"lu184020", "D89ubl/e", "IaTFU11RpmJaS9o4H6Zbd0", PrefixCryptMd5}, 101 | {"aszasw", "D89ubl/e", "pi5D8IwHVYgPyiXuIuW/Z.", PrefixCryptMd5}, 102 | {"33059049", "D89ubl/e", "mQukEUOQ3Y67xULFLxenN1", PrefixCryptMd5}, 103 | {"li3255265", "D89ubl/e", "pwTwGBzTj/f4qRvrXWDeH1", PrefixCryptMd5}, 104 | {"kerrihayes", "D89ubl/e", "eSRqyebfyJIf.wGwNWJiF/", PrefixCryptMd5}, 105 | {"0167681809", "D89ubl/e", "aaKVVJe1BPZbXaKqWDhJH.", PrefixCryptMd5}, 106 | {"stefano123", "D89ubl/e", "myjNwn1J/Xur2sGPb2KDW/", PrefixCryptMd5}, 107 | {"15054652730", "D89ubl/e", "Sk9rTdAjux9EEWjIi983s.", PrefixCryptMd5}, 108 | {"natdvd213", "D89ubl/e", "49aMem462jQkqqZ1YCYtu1", PrefixCryptMd5}, 109 | {"680929", "D89ubl/e", "SRje2pCzH8NjNInSkec5p/", PrefixCryptMd5}, 110 | {"steelpad8", "D89ubl/e", "WYHvQD3.AucnP.fo2kgLP/", PrefixCryptMd5}, 111 | {"374710", "D89ubl/e", "MMK0xP5K1qHKsFsERRYCR.", PrefixCryptMd5}, 112 | {"394114", "D89ubl/e", "sVVqstvqjaibnGEvVOYci1", PrefixCryptMd5}, 113 | {"24347", "D89ubl/e", "VFIhSi8R9JmFPoZA4qDHI1", PrefixCryptMd5}, 114 | {"krait93", "D89ubl/e", "BlA2Z9tvvxDmV2dhtW14I0", PrefixCryptMd5}, 115 | {"5164794", "D89ubl/e", "52FunD0ymhST8S2IxFDwB.", PrefixCryptMd5}, 116 | {"rswCyJE5", "D89ubl/e", "3GLf6CNVmDH48iwOIVdYI/", PrefixCryptMd5}, 117 | {"31480019", "D89ubl/e", "d2eAdEkBFPJ/CBOM.MHET0", PrefixCryptMd5}, 118 | {"19830907ok", "D89ubl/e", "TbhdN5Ec9YD8bplz1A/ce/", PrefixCryptMd5}, 119 | {"zlsmhzlsmh", "D89ubl/e", "ZCOXuzvrKNSVFOIlo8NWa0", PrefixCryptMd5}, 120 | {"Zengatsu", "D89ubl/e", "5XqFN00zJn8eZ6mxIlNDn.", PrefixCryptMd5}, 121 | {"0127603331", "D89ubl/e", "Scb3wMWrVNXDw0FtBU2Bx.", PrefixCryptMd5}, 122 | {"axelle77", "D89ubl/e", "NKpZ4pHNMRByBtpN43qaR/", PrefixCryptMd5}, 123 | {"password2147", "D89ubl/e", "z3O5D9UC4h8DqIND7HI8e0", PrefixCryptMd5}, 124 | {"olixkl8b", "D89ubl/e", "ex2DzBcd0OK0xjWCk9gXn/", PrefixCryptMd5}, 125 | {"maiwen", "D89ubl/e", "nU.oBq2dK8u1/WYTb.qN./", PrefixCryptMd5}, 126 | {"198613", "D89ubl/e", "0DiN4Qgg78qXCKmCgn1v.0", PrefixCryptMd5}, 127 | {"s17kr8wu", "D89ubl/e", "0M452BZ4RsUFJlWmAzC/r0", PrefixCryptMd5}, 128 | {"biker02", "D89ubl/e", "kon/OQAJaw1jWzUVGF696/", PrefixCryptMd5}, 129 | {"m1399", "D89ubl/e", "rffe2sXyO8D4i8b/Zz4fN.", PrefixCryptMd5}, 130 | {"a2dc6a", "D89ubl/e", "hZxrfcVVudoH/vlLjHbO/0", PrefixCryptMd5}, 131 | {"zhd8902960", "D89ubl/e", "RXh0ZI2skEE34Okz7ZFkS.", PrefixCryptMd5}, 132 | {"parasuta", "D89ubl/e", "VdO1d5wKNz.082DfQBKdw/", PrefixCryptMd5}, 133 | {"the1secret", "D89ubl/e", "0O7aLsmdpnkds69gC8F3D0", PrefixCryptMd5}, 134 | {"teddy14", "D89ubl/e", "HWdm5snaFBk8FiDKaaIEQ1", PrefixCryptMd5}, 135 | {"4516388amt", "D89ubl/e", "xqw/ieFswTtoXsUl.qFiE/", PrefixCryptMd5}, 136 | {"245520", "D89ubl/e", "SzKFu0pIWn3aYOU4n8vD80", PrefixCryptMd5}, 137 | {"D34dw00d", "D89ubl/e", "lEOrH/zkoSs9gEPhWFzPY0", PrefixCryptMd5}, 138 | {"officiel", "D89ubl/e", "12DkA0BGmzbnFiXKQXOoO/", PrefixCryptMd5}, 139 | {"36653665", "D89ubl/e", "B4vLgohydtKjuwc3PDmLJ.", PrefixCryptMd5}, 140 | {"hipol", "D89ubl/e", "jANv18j9YRx4dSRG3e9dR0", PrefixCryptMd5}, 141 | {"Nylon0", "D89ubl/e", "5V/VlZE2LSVL/FXTfXSEY/", PrefixCryptMd5}, 142 | {"caitlyne6", "D89ubl/e", "iFyY3.Bcpd2jcEQLV5wSf.", PrefixCryptMd5}, 143 | {"dogzilla", "D89ubl/e", "DHPXon3QnoN6NBaTv2Mg5/", PrefixCryptMd5}, 144 | {"lemegaboss", "D89ubl/e", "DsPKwJLYCgtQGgiV1vsJW1", PrefixCryptMd5}, 145 | {"c0valerius", "D89ubl/e", "6DGzvs.WKNeB.s4iVzHL..", PrefixCryptMd5}, 146 | {"liseczek44", "D89ubl/e", "FwjNgb634KqRDONd9mWn10", PrefixCryptMd5}, 147 | {"saulosi", "D89ubl/e", "njQdR835SwHOdC9yOv7t3/", PrefixCryptMd5}, 148 | {"53522", "D89ubl/e", "0wHxUj/ReVsKDnUnPR/Su1", PrefixCryptMd5}, 149 | {"ajgebam", "D89ubl/e", "WAD9PbSIhz206tHvVsLIX0", PrefixCryptMd5}, 150 | {"freshplayer", "D89ubl/e", "LDUiW43DNTTs3M.00nnTs1", PrefixCryptMd5}, 151 | {"logistica1", "D89ubl/e", "PHYo0bAH5mMVAyjIC8piI0", PrefixCryptMd5}, 152 | {"12calo66", "D89ubl/e", "UyR/Od.i9HQ.st4.tpEI.0", PrefixCryptMd5}, 153 | {"kenno", "D89ubl/e", "5UD3WvZ/FwruX9YFVaIUT/", PrefixCryptMd5}, 154 | {"34639399", "D89ubl/e", "48eSiBnmw5e9w5giOn3ye1", PrefixCryptMd5}, 155 | {"0408636405", "D89ubl/e", "4X3PcQgOz0JVEvHTuFRh9.", PrefixCryptMd5}, 156 | {"weezer12", "D89ubl/e", "I1uauxPkvEIyk8UVXsDAQ.", PrefixCryptMd5}, 157 | {"9888735777", "D89ubl/e", "Ya0d5paah4ZnA8MbLTvqo/", PrefixCryptMd5}, 158 | {"7771877", "D89ubl/e", "1kY4BuTtTHHAEqBpDnh2B.", PrefixCryptMd5}, 159 | {"6620852", "D89ubl/e", "cfbSrTlsCwlAD3l7NWcjg.", PrefixCryptMd5}, 160 | {"98billiards", "D89ubl/e", "gKcTYvUdSIfR9/wxxVKh00", PrefixCryptMd5}, 161 | {"angelik", "D89ubl/e", "dr3IRAptFJZJihDhfJM6L1", PrefixCryptMd5}, 162 | {"86815057", "D89ubl/e", "W7HymXzTiMw19qnRxMFQz.", PrefixCryptMd5}, 163 | {"p16alfalfa", "D89ubl/e", "IDzuywgAHby2yNESi/cEu/", PrefixCryptMd5}, 164 | {"7236118", "D89ubl/e", "Fj8gIA/n0wzQQeFow.C7X1", PrefixCryptMd5}, 165 | {"glock17l", "D89ubl/e", "bbWZK6Y64mVxUFx/KiX1B1", PrefixCryptMd5}, 166 | {"sigmundm", "D89ubl/e", "p/oVop6W/YiSDKNOOKi6D1", PrefixCryptMd5}, 167 | {"ltbgeqsd", "D89ubl/e", "Qo8SMcE2S9QFp/zsRZeNG0", PrefixCryptMd5}, 168 | {"wqnd8k2m", "D89ubl/e", "q8ae/TEYgiU80vniBKIqo.", PrefixCryptMd5}, 169 | {"yangjunjie", "D89ubl/e", "gYAm1Win2xeG8VSEwezd30", PrefixCryptMd5}, 170 | {"manjinder", "D89ubl/e", "SFZgFYUGzipDnBs9gWwbr/", PrefixCryptMd5}, 171 | {"nick2000", "D89ubl/e", "J0Amxd2tBuLkMwRfT.9.l.", PrefixCryptMd5}, 172 | {"193416", "D89ubl/e", "s13zGQ31soCmTTRI6dtuO0", PrefixCryptMd5}, 173 | {"pang168", "D89ubl/e", "sROc1K.SSkTKzz17qcjkR.", PrefixCryptMd5}, 174 | {"454016", "D89ubl/e", "RyRsl5a2AMQomSbXxJwKd.", PrefixCryptMd5}, 175 | {"phair08", "D89ubl/e", "UPDj0.FApBTp/Mf8Pa5tG.", PrefixCryptMd5}, 176 | {"10252007cw", "D89ubl/e", "yDOxOyZ8Na.utOWkk19s01", PrefixCryptMd5}, 177 | {"zhuzhuzhu", "D89ubl/e", "2upo6jW4F5OLgMvJv3PuU1", PrefixCryptMd5}, 178 | {"metafunds", "D89ubl/e", "JpaGvclLj2SHhVAFBOqtT0", PrefixCryptMd5}, 179 | {"smash", "D89ubl/e", "XeFap1wOn3vppPM5HYTVp0", PrefixCryptMd5}, 180 | {"76387638", "D89ubl/e", "hRcYGGfn3HcDZcxeZtL.P1", PrefixCryptMd5}, 181 | {"S226811954", "D89ubl/e", "4t.pGGDRnT.epiS4XemUZ0", PrefixCryptMd5}, 182 | {"mintymoo00", "D89ubl/e", "MYyxqzymgUVhXkjLDPoeq1", PrefixCryptMd5}, 183 | {"seven711", "D89ubl/e", "Oes0cPGc7hQF.2nQgHThF0", PrefixCryptMd5}, 184 | {"924414", "D89ubl/e", "laB87gR5mmN/aNaQW37.E1", PrefixCryptMd5}, 185 | {"changchengxu", "D89ubl/e", "wvY4dNj.Q3U7pnEQgf/je1", PrefixCryptMd5}, 186 | {"alaska58", "D89ubl/e", "jRk3i8CF1C7Sh43qytD.31", PrefixCryptMd5}, 187 | {"7678208", "D89ubl/e", "0JCRZtaPgouKCrcAiF3290", PrefixCryptMd5}, 188 | {"szazsoo73", "D89ubl/e", "iZjmNH7GBYKN19Yl5IWF9.", PrefixCryptMd5}, 189 | {"3830371", "D89ubl/e", "QwDfjzDOqFgbsP52awbrP.", PrefixCryptMd5}, 190 | {"0qdzx66b", "D89ubl/e", "gwfYHJCUhkaGXuCTv9WYO1", PrefixCryptMd5}, 191 | {"09124248099", "D89ubl/e", "w98gHUCztuXegDue.AOTV.", PrefixCryptMd5}, 192 | {"bachrain", "D89ubl/e", "ROjdv8BY.9e3naiqMgt94/", PrefixCryptMd5}, 193 | {"sJsSdFBY", "D89ubl/e", "u0zmiD8YSiNfBZMgjhUkw/", PrefixCryptMd5}, 194 | {"676215000", "D89ubl/e", "FvH6jFxbT3BNYSJLNEkRE.", PrefixCryptMd5}, 195 | {"nimamapwoaini", "D89ubl/e", "50h2tbqHW9vagG7wL9YP71", PrefixCryptMd5}, 196 | {"nitsuj", "D89ubl/e", "BUr/iUuPZAJMn3LC7qzkq/", PrefixCryptMd5}, 197 | {"cukierek2003", "D89ubl/e", "70s6Is6uEwtFldtmotDhG.", PrefixCryptMd5}, 198 | {"seeder", "D89ubl/e", "k7PCEkvp2Pdm3HWWOBgmE0", PrefixCryptMd5}, 199 | {"00167148786", "D89ubl/e", "Cknm.cI/57fbdNnztPqVv/", PrefixCryptMd5}, 200 | {"ashok198", "D89ubl/e", "z1CwDc9dhBLK/3nPyrjN4/", PrefixCryptMd5}, 201 | {"kt2116", "D89ubl/e", "vA4kvwltG58Twovn9ia./1", PrefixCryptMd5}, 202 | {"another82", "D89ubl/e", "E75YhMUix/GZ6sGKMzKcH.", PrefixCryptMd5}, 203 | {"75995794", "D89ubl/e", "7Vjp3/aQgDkvrvihk.v020", PrefixCryptMd5}, 204 | {"19901130", "D89ubl/e", "ZrqfkcX5deYA89WLAiDsW.", PrefixCryptMd5}, 205 | {"gijs010389", "D89ubl/e", "s7khoFO35J03/IWR0Au9a/", PrefixCryptMd5}, 206 | {"26263199", "D89ubl/e", "oWHcMVYWZe.30EjvdVhSz/", PrefixCryptMd5}, 207 | {"hi1j42x8", "D89ubl/e", "TqtgsDnP6LyrpDriHI3g1.", PrefixCryptMd5}, 208 | {"6922235", "D89ubl/e", "BBVL9.H9p0kabiBuuGCP5.", PrefixCryptMd5}, 209 | {"67749330", "D89ubl/e", "nGYG2N2nmEZA7Xv0gpsUa.", PrefixCryptMd5}, 210 | {"ccpatrik", "D89ubl/e", "g.ihTAfr9HICtitiMed6U/", PrefixCryptMd5}, 211 | {"summer3011", "D89ubl/e", "BJ7gzGwNQmCy8WLTAzEcG0", PrefixCryptMd5}, 212 | {"331516", "D89ubl/e", "oroQkvFnt80PX9.DFORsH0", PrefixCryptMd5}, 213 | {"135745", "D89ubl/e", "SdHoMvPduS1kS3KVqEw9W.", PrefixCryptMd5}, 214 | {"603762004", "D89ubl/e", "1FQtoOElFQQCBL53IT2LL0", PrefixCryptMd5}, 215 | {"29011985", "D89ubl/e", "xO3.z/20nsNEXnaWJdsfB/", PrefixCryptMd5}, 216 | } 217 | 218 | var apr1TestData = []md5Datum{ 219 | {"mickey5", "gxNb79DX", "6wi9QaGNM5TA0kBKiC4710", PrefixCryptApr1}, 220 | {"alexandrew", "kv1uUfCO", "iEwrWojf92uZ/9uhTQmMo.", PrefixCryptApr1}, 221 | {"hawaiicats78", "UQ6GxE7V", "OrIqWONGuSV9RfS3B2dfO1", PrefixCryptApr1}, 222 | {"DIENOW", "OZ.RwYJH", "AwfW2h0gJnu2fQi0GegVe1", PrefixCryptApr1}, 223 | {"e8f685", "9r9GyMpL", "3IiaLNos/tbouLJwsW8ey/", PrefixCryptApr1}, 224 | {"Rickygirl03", "0tlsxL/0", "cfS6c2JZjwISRTgFvrMWL1", PrefixCryptApr1}, 225 | {"123vb123", "/4XFfQuK", "bnMIHM0j/Cf8apmbvPzn/.", PrefixCryptApr1}, 226 | {"sheng060576", "NEJJUzVT", "o/CWI9InAMXWAsbl5gx0p1", PrefixCryptApr1}, 227 | {"hansisme", "JAOXCriK", "gB/Yox3wTae3NujwKUiFv1", PrefixCryptApr1}, 228 | {"h4ck3rs311t3", "KmkPgS2r", "5qIFMPNVAXzlevkzOQwhj.", PrefixCryptApr1}, 229 | {"K90JyTGA", "mM7q5ZHN", "03LeGh9D1CujEBwiVRO6B0", PrefixCryptApr1}, 230 | {"aspire5101", "tlxr3zoa", "dQJiJmk4pEtRTssYiLwlv0", PrefixCryptApr1}, 231 | {"553568", "YI.r2X/w", "H/1DtcmTHSgcdkgz8NS1W0", PrefixCryptApr1}, 232 | {"SRI", "StJ5t4wb", "tIVEx.MPZR1SqDm5y9VCs1", PrefixCryptApr1}, 233 | {"maxmus", "ad29tH08", "xEHwr706Yz/3FFGqnVB6l/", PrefixCryptApr1}, 234 | {"a5xp9707", "aH0sN4io", "y0heNz5hL67/HA7/7mDRS.", PrefixCryptApr1}, 235 | {"tomasrim", "SgbYnJV9", "7Z.enu6vZ7b6Zo7/lYce60", PrefixCryptApr1}, 236 | {"2a0mag", "lSOzbc7i", "Ae21yFmdTMpSz.aQsjyoE1", PrefixCryptApr1}, 237 | {"wmsfht", "yicl6/5x", "p/dCDdQ0q9lLaZbBJsIDP0", PrefixCryptApr1}, 238 | {"webmaster2364288", "PLoY5sMf", "KEDmvJskiSNFwiygtWXin1", PrefixCryptApr1}, 239 | {"121516m", "3T5gmyrq", "AucgLmXU53aTQJuRKCFo50", PrefixCryptApr1}, 240 | {"T69228803", "Aajhupso", "/EPFyux8bd7Iw.tLevaVE.", PrefixCryptApr1}, 241 | {"qq820221", "G43B4jFl", "4TUFaOD7Fz5.lZiq5v8P40", PrefixCryptApr1}, 242 | {"chenfy", "mDnux.Mf", "vXsdihwaTLCJTHnuk9/cK/", PrefixCryptApr1}, 243 | {"www.debure.net", "bZzoRW4K", "DfI3Col55.57HP3FW4L1h.", PrefixCryptApr1}, 244 | {"1333e763", "rRvCcrzo", "plG5/rpEPSM7uc3bro6P51", PrefixCryptApr1}, 245 | {"burberries", "Qx6JtYcz", "10t2dI6u0LyNBjeCAQ.3z1", PrefixCryptApr1}, 246 | {"chanmee14", "p9t9dUC1", "Nlr96oZWIe/VVpYBUgG6q0", PrefixCryptApr1}, 247 | {"65432106543210", "CBG7TUqG", "Olyygy0L6HfSPfkLg24U60", PrefixCryptApr1}, 248 | {"powernet", "ogVPlakG", ".SLiqbN/KUECQ6pgdck2/.", PrefixCryptApr1}, 249 | {"a2d8i6a7", "sNrtmvPF", "rvbRuKdcPPvN.dK.mHeYq/", PrefixCryptApr1}, 250 | {"gvs9ptc", "gQgMMxVG", "5sI4ezBQxqpfh14AvEEVU0", PrefixCryptApr1}, 251 | {"Pookie", "x.wVLgoG", "HTj5gT.lQ71BpifSlcQVy1", PrefixCryptApr1}, 252 | {"lorissss", "O0ySiIf4", "AmmYBbHWjfiVcGEbl4wiy/", PrefixCryptApr1}, 253 | {"ess", "nE19zEmy", "Rg3/wMTNMVOkbhez/QhD//", PrefixCryptApr1}, 254 | {"sparra", "By1OjZuF", "PRY4G6D8u3aFhruSTgIQC.", PrefixCryptApr1}, 255 | {"allysson", "mI6fsU64", "WqCg/f9CpYr4586AVr6nP.", PrefixCryptApr1}, 256 | {"99128008", "LQLXA.du", "kazspxn165TFSiDavu75N/", PrefixCryptApr1}, 257 | {"evisanne", "AhDCR8bW", "2lR137DLMfr1mQ9xLlMsw0", PrefixCryptApr1}, 258 | {"qfxg7x9l", "ZAGBUFGw", "HI3fWMR0Y6Z4U3MSc70sd.", PrefixCryptApr1}, 259 | {"03415", "nkFIBpLJ", "AvABMUIgvoMp0zmOTCwCG1", PrefixCryptApr1}, 260 | {"87832309", "WbCq7Hv8", "dxe0LoM3vlD.t/A/3Cfd11", PrefixCryptApr1}, 261 | {"816283", "PrEjUTNt", "vGLTgLqJp9XEtwEJBv5XF.", PrefixCryptApr1}, 262 | {"banach12", "S1G5jLiH", "CySeS1zgVlMLLElxG6Dmw0", PrefixCryptApr1}, 263 | {"sjdszpsc", "QmuQrgcB", "xZk5zcK2QRF8PZ24P9vPr1", PrefixCryptApr1}, 264 | {"changsing", "Z0i29yA5", "KnTYiWEZQYzQlH/SxQ7Qp/", PrefixCryptApr1}, 265 | {"56339388", "RZlCHiTm", "8mFKCLkRHxoJ2ieVa.K79/", PrefixCryptApr1}, 266 | {"52114157", "3NkMs.IK", "02HiBvqlIVA.hLbktlHsD1", PrefixCryptApr1}, 267 | {"jinebimb", "1ww3avga", "haxtp7TGUm9PHPBrBeM9u.", PrefixCryptApr1}, 268 | {"erol43", ".aE1EJya", "3zkhvRyNbF.DOOyJSPSJ21", PrefixCryptApr1}, 269 | {"2yagos", "L0YlhvFW", "R0J.Bk9wYb7sQKXBbP4AN/", PrefixCryptApr1}, 270 | {"habparty!", "vveX0m/D", "hPoF3j.Ac5zSOAmHBZklT.", PrefixCryptApr1}, 271 | {"tangjianhui", "8Ivzj66d", "J4A.NOn6TRk4RYC9oGqIB/", PrefixCryptApr1}, 272 | {"serandah", "v9AJex0e", "qn/isKH9e6EG66KCtFdmI1", PrefixCryptApr1}, 273 | {"mirrages", "UM0E3yNn", "4V4IJI2Q0Bqh0EG8HAHbq0", PrefixCryptApr1}, 274 | {"mantgaxxl", "1spakyg4", "NwPcxatLI7bWUpeDzAw2h1", PrefixCryptApr1}, 275 | {"45738901", "oepJpf/s", "p0F.JGVJCyvUHfWnpF.Wy1", PrefixCryptApr1}, 276 | {"g523minna", "yWpavB.B", "q4KExAyIKMKWTLq86n0820", PrefixCryptApr1}, 277 | {"j202020", "DTRNSWt7", "2At.lEmBM2waU9F2QsDvd.", PrefixCryptApr1}, 278 | {"g@mmaecho", "QGA07jk6", "U9Uw/dD666GNV60hX6AKM/", PrefixCryptApr1}, 279 | {"042380", "FDnW17iI", "6jkNwkfAi.4LMYkIkNO2v1", PrefixCryptApr1}, 280 | {"ASRuin", "GKFI0Se3", "go4Tko/O9UCA2WtSJBjgc.", PrefixCryptApr1}, 281 | {"061990", "yJR0EnuF", "CzzsiUo2Q5cRhtlptUf7D1", PrefixCryptApr1}, 282 | {"ysoline", "7D0hCvVq", "HLIRmi013HBi2TgATkgJM.", PrefixCryptApr1}, 283 | {"liuzhouzhou", "m.MSvKt4", "oFYUki/pESjwOfF5YH9VO0", PrefixCryptApr1}, 284 | {"b0000000wind", "qOQrkTXw", "PJXv2X.0Efe4VUPcvyxA61", PrefixCryptApr1}, 285 | {"7913456852", "lPKDpKzC", "q9kt0R9.I4rxhlIcNe2gg1", PrefixCryptApr1}, 286 | {"9008", "PYsksC92", "3oqtOxrMnQc1n3GfSIAJM.", PrefixCryptApr1}, 287 | {"waitlin11", "x5UDLNO2", "yHLWIm/50ORtDhT56f9bi0", PrefixCryptApr1}, 288 | {"8fdakar", "E9a2XIvt", "fcsw4gZfbiDXPywMzwhik1", PrefixCryptApr1}, 289 | {"eisball", "gHg16GuT", "DGI/O8HzZemhsQ4o2jA560", PrefixCryptApr1}, 290 | {"jenna17", "yzwqt8mS", "3QqqiFB9Z6q1fp4z/q1pU.", PrefixCryptApr1}, 291 | {"belkadonam", "iGU4vuaZ", "w3xf5rVAIJYz0dgImL8a2.", PrefixCryptApr1}, 292 | {"tfyuj9JW", "5cPUmio7", "wttScNV7Fk4Njs9QX1yUi.", PrefixCryptApr1}, 293 | {"nihaijidema", "DZW4Gt4h", "EXlVFPbqnXGPp2vLQT5TK0", PrefixCryptApr1}, 294 | {"talapia", "61i3ruRm", "cNcNvti2hQ8mXjLahFnSb/", PrefixCryptApr1}, 295 | {"7376220", "Z89Ynh0K", "A2k6aLQnMOa2uwXX8MJZf1", PrefixCryptApr1}, 296 | {"c7m8e1xsc3", "QRn4AsCM", "gUztH0RWKuX1Vy0WaYfdC1", PrefixCryptApr1}, 297 | {"84129793", "rghudgt5", "XA7QLtfRq84JHtbjdke0I.", PrefixCryptApr1}, 298 | {"test1000", "zwkIVA3j", "Iuz7zNyLvIiKWIl2VA8bl.", PrefixCryptApr1}, 299 | {"ecmanhatten", "zfVlWDS.", "emJhRC3N0SnvZLo5en4zE0", PrefixCryptApr1}, 300 | {"EvanYo3327", "VDajAiZs", "lMKGzN91BhIX0hHCNqErU1", PrefixCryptApr1}, 301 | {"269john139", "Ryash8LF", "u96Rir1Izuwf/oHnaykmS/", PrefixCryptApr1}, 302 | {"3348159zw", "fdErikUY", ".gX/8MNguTOTWT35m4DCy/", PrefixCryptApr1}, 303 | {"lu184020", "uabGv1xC", "X5NNdH/1dzD0gQUyHwzKB0", PrefixCryptApr1}, 304 | {"aszasw", "41WiK.i.", "2q1CW/s4oRBLAFxmLESmO1", PrefixCryptApr1}, 305 | {"33059049", "bYPWMY2a", "fvKkFR1RRccGtIUhLuvBR0", PrefixCryptApr1}, 306 | {"li3255265", "FTGQVCcu", "QS/ub5DGLK/wgfkYQ0DBR.", PrefixCryptApr1}, 307 | {"kerrihayes", "cFc9bc86", "3cVFy8/qB/fNGNueG65vG0", PrefixCryptApr1}, 308 | {"0167681809", "A5TvYYWy", "s4HBh0Wum2QQj1c9e0s79.", PrefixCryptApr1}, 309 | {"stefano123", "YNrpseN3", "Yt52Yo9IEBs2LpX7A/CUb0", PrefixCryptApr1}, 310 | {"15054652730", "12CL4km4", "NJm8fh.JFi5dE.p6A9g7v/", PrefixCryptApr1}, 311 | {"natdvd213", "hssJjJTG", "dDK3pbBFTLbEigu.eCN7s.", PrefixCryptApr1}, 312 | {"680929", "iaZlOft5", "w7iC6f5BUzuXox9THmHuj1", PrefixCryptApr1}, 313 | {"steelpad8", "mAoHmdUe", "5HePkkuSVu9F2UYgCvn0M.", PrefixCryptApr1}, 314 | {"374710", "RFR4xs7H", "9GH0NjiDIgBD0t.w5/fwt0", PrefixCryptApr1}, 315 | {"394114", "Jt2syL5H", "tJ18tBNlcBEBqphUQc9jm.", PrefixCryptApr1}, 316 | {"24347", "QnSWI03c", "8GC6c0AwpC.c8j4H7/9QU0", PrefixCryptApr1}, 317 | {"krait93", "bwzDGet.", "ntnX3fwzi3Zzhy0eHuwA9.", PrefixCryptApr1}, 318 | {"5164794", "gkhv.jfD", "2fljug5HHu01vs.6KGJXQ.", PrefixCryptApr1}, 319 | {"rswCyJE5", "HzyuhjzZ", "pXmWtTfn0/1voBaBkNaRy0", PrefixCryptApr1}, 320 | {"31480019", "ZZc0Ogd8", "1TNy1gTG6GLc.P/98kXXT.", PrefixCryptApr1}, 321 | {"19830907ok", "4t6oHDY9", "kFoi2gvPcKMZs.AiGq1yb1", PrefixCryptApr1}, 322 | {"zlsmhzlsmh", "cih9diuY", "AwNc6TaKzFm9c8.kQxfwN1", PrefixCryptApr1}, 323 | {"Zengatsu", "wuXDXGlS", "FXFvRPPs7HHg96sSCFnFM1", PrefixCryptApr1}, 324 | {"0127603331", "z3inhAFw", "vkfbG7KVT4SYHiUn7Yqrz1", PrefixCryptApr1}, 325 | {"axelle77", "jydGNcWd", "qz3N5yqg0woVcZ6TN7SHr0", PrefixCryptApr1}, 326 | {"password2147", "GoP2TF8P", "c/b36Y.Qg/Grq7b7p.jbl.", PrefixCryptApr1}, 327 | {"olixkl8b", "wxkU6WKQ", "IlhCpPwTWvESASvpOToqh.", PrefixCryptApr1}, 328 | {"maiwen", "7JgCOFuj", "0WVRunftYuoR3o5ktLMdM1", PrefixCryptApr1}, 329 | {"198613", "Vai72CeM", "6WWXwZhxx/EW0IONm7n0A.", PrefixCryptApr1}, 330 | {"s17kr8wu", "uNqfw7fr", "NAmeX1Mag2xf5lOCxGrcx/", PrefixCryptApr1}, 331 | {"biker02", ".dmc8gVd", "ZB4OmwWIeJ5Iy66Ta/7mU0", PrefixCryptApr1}, 332 | {"m1399", "vg1vnQVK", "UUqQibheBizuB0JxR1rbz/", PrefixCryptApr1}, 333 | {"a2dc6a", "lsH2FMPS", "dBBuRArwOlN/1p1BuncB3/", PrefixCryptApr1}, 334 | {"zhd8902960", "rMGc2ODd", "jG6/9kzAkMHFVAYYVEKN60", PrefixCryptApr1}, 335 | {"parasuta", "GeWoySy2", "WZ9pwqAb72tKP0xob81Ho0", PrefixCryptApr1}, 336 | {"the1secret", "7LW61iOz", "a9dFA0cRmBIuaxbBqnT/w/", PrefixCryptApr1}, 337 | {"teddy14", "GJ9nS.Cn", "jwpBiFBLr1XIo.J5klB39.", PrefixCryptApr1}, 338 | {"4516388amt", "NEgOG19t", "CjfmPSbrJqUx6imCL4WPD/", PrefixCryptApr1}, 339 | {"245520", "rEzCqOtj", "sSblCTbLq2XDMTeDjYHMu0", PrefixCryptApr1}, 340 | {"D34dw00d", "Bugn2T/z", "gTZ/TZ24SMiL1AVQIPgam1", PrefixCryptApr1}, 341 | {"officiel", "oCnbHp3p", "lXVZn0P1qWe7dGRkwiJkj0", PrefixCryptApr1}, 342 | {"36653665", "cCwY3el7", ".sx/Uv4UADYdLSGjfI0gD0", PrefixCryptApr1}, 343 | {"hipol", "b0jFoiEY", "BELMMlTsgKPQ8jSloicdh.", PrefixCryptApr1}, 344 | {"Nylon0", "cIw8xXs1", "uiDYDxgJsujwuQtU9Rjyr/", PrefixCryptApr1}, 345 | {"caitlyne6", "UffYyvRf", "IHrP6qbFVQEFwcl5BNh9j/", PrefixCryptApr1}, 346 | {"dogzilla", "2wvpCP1I", "vudGA0I1SLgEMr6xmmizy.", PrefixCryptApr1}, 347 | {"lemegaboss", "QOdrh1Z.", "tFHoBTGKnHwf.MWzX7IBD/", PrefixCryptApr1}, 348 | {"c0valerius", "z4ckUwmA", "hq0/DLKdj/0PaR9uJ67fd1", PrefixCryptApr1}, 349 | {"liseczek44", "nPnWx0Kv", "FF9VO/i4rbKiD8p.Kor0x0", PrefixCryptApr1}, 350 | {"saulosi", "Ox3Y2bAv", "HBZQJd7esDSp/3StMc4xs1", PrefixCryptApr1}, 351 | {"53522", "VJn0Rpzz", "7CCQCvpxd3vVsBTIQNHmA1", PrefixCryptApr1}, 352 | {"ajgebam", "3wMf8geF", "vyqUHs9babWmAeAIHgcCJ0", PrefixCryptApr1}, 353 | {"freshplayer", "H6BJsnhE", "sdUNxVuP0wbG8GXYaaE3H0", PrefixCryptApr1}, 354 | {"logistica1", "ycXMTiTE", "8cXiewb9rsL9EuNi.ygaa/", PrefixCryptApr1}, 355 | {"12calo66", ".DEY1oqo", "TWeDNa7xX7W3sZWNTZKjG/", PrefixCryptApr1}, 356 | {"kenno", "QTq2YDtZ", "3b9BdtbYMbObjKa8.Fvy3/", PrefixCryptApr1}, 357 | {"34639399", "qAOAsxTH", "2c8ueVqVPiKAN2ihhA/xw.", PrefixCryptApr1}, 358 | {"0408636405", "cLdGrOiq", "WedaFW4qjBLvBKWNZ98ik/", PrefixCryptApr1}, 359 | {"weezer12", "mY8WCPXG", "8xEw.ExVVzBOa9u3lJe/W/", PrefixCryptApr1}, 360 | {"9888735777", "4l3ZZKUa", "Nor5nWfN0h2HaeQwWBL3u.", PrefixCryptApr1}, 361 | {"7771877", "3J0yl1xy", "1h9c1aatf.IaVJvkATLhE0", PrefixCryptApr1}, 362 | {"6620852", "UNtXqO0n", "Ag6gmPaH1guubjCy4bJHr0", PrefixCryptApr1}, 363 | {"98billiards", "4GJSSWxR", "wNggaBr4TH94zYGEuDvWX1", PrefixCryptApr1}, 364 | {"angelik", "Wo9Y7PP9", "btm.n8EiQMUnAFXtlqMpp/", PrefixCryptApr1}, 365 | {"86815057", "59qG1lpq", "C1efDS5Cyz33AEdcqNNjP/", PrefixCryptApr1}, 366 | {"p16alfalfa", "VW75OiLp", "EeU9NvGQn3l0es.EqOJyt1", PrefixCryptApr1}, 367 | {"7236118", "3mis3uOG", "sXNyXtdsWoNUpMaipVw3a.", PrefixCryptApr1}, 368 | {"glock17l", "J1Vs.bJ4", "AULv/cwYjMeBoMTvEZXvU.", PrefixCryptApr1}, 369 | {"sigmundm", ".k9ZvRfT", "lbGDjiA90kolu9DzQLOvv1", PrefixCryptApr1}, 370 | {"ltbgeqsd", "WT1wTKP8", "UDawOWZ73u8wBBZ7ohlSP0", PrefixCryptApr1}, 371 | {"wqnd8k2m", "mqiUjAJl", "xYZ0sN8LEwKrxU1g1Did30", PrefixCryptApr1}, 372 | {"yangjunjie", "wMWIiKAK", "yScptAfXmU8DVl6AVoAWB0", PrefixCryptApr1}, 373 | {"manjinder", "dOljUCkA", "pEb7LT2zG/qezaTTzd1Nj.", PrefixCryptApr1}, 374 | {"nick2000", "9qhbsAfO", ".peZB9DgrJqAKlp2R1Nq70", PrefixCryptApr1}, 375 | {"193416", "Tke5EI49", "2suXXCRZuzJvjJ7QcJQMU1", PrefixCryptApr1}, 376 | {"pang168", "goNotyBA", "/lhn.zMA5z.a2VF31jaO3.", PrefixCryptApr1}, 377 | {"454016", "1MdFKwJb", "/MBNPsDN66rZdg1SGQeKj1", PrefixCryptApr1}, 378 | {"phair08", "B3uB4Hl/", "LUqRKHuzcnb2q6xwqVok11", PrefixCryptApr1}, 379 | {"10252007cw", "ewVqnTQ1", "HkdOCIGKHYg193aUfQuer.", PrefixCryptApr1}, 380 | {"zhuzhuzhu", "BiILrcFo", "tqGhsuOrQDvg/JPV00RSd/", PrefixCryptApr1}, 381 | {"metafunds", "dLMwXEWa", "Hq/WjMSgbxkp.wCelyfRX.", PrefixCryptApr1}, 382 | {"smash", "aMgvovYi", "op3FHJ5OuM2tS93TKnhoc1", PrefixCryptApr1}, 383 | {"76387638", "GanQOcQh", "G5qdkoizpSOjWFc3PeL8D.", PrefixCryptApr1}, 384 | {"S226811954", "GF9EM5zg", "whu07gAcDNRBfRInKdQz2.", PrefixCryptApr1}, 385 | {"mintymoo00", "jDnIOwmz", "vBkkiacYuF8kcp1Nw3tf/1", PrefixCryptApr1}, 386 | {"seven711", "mwX.ezPE", "58Q31F7jya8UTnrFUzwO41", PrefixCryptApr1}, 387 | {"924414", "wcsVK7PY", "iOErsaSDD8l478QPn/ecp.", PrefixCryptApr1}, 388 | {"changchengxu", "ON3zxaJ9", "4K0aR4n6JwbGM8jiE78eo1", PrefixCryptApr1}, 389 | {"alaska58", "KIIvW1ib", "ZqJQRoEoDpx30bt4HkZNO0", PrefixCryptApr1}, 390 | {"7678208", "xLTFhFu0", "wgkf1zwnwG.rwUGaHlzKK/", PrefixCryptApr1}, 391 | {"szazsoo73", "S8RvlMwv", "XKeXw9RfHH163LjG.yQ4/0", PrefixCryptApr1}, 392 | {"3830371", "E1WhUznq", "qUOza3gf2ZzUohYpnA/Gt/", PrefixCryptApr1}, 393 | {"0qdzx66b", "zSbUMRoi", "EJKnTL40qyiKNTWdOkg8K1", PrefixCryptApr1}, 394 | {"09124248099", "vkxQrmli", "gfLBcPOpLI.x4BHcGgG5o1", PrefixCryptApr1}, 395 | {"bachrain", "i74JdOeY", "l/rxskCai9U2yu6QAuYiP0", PrefixCryptApr1}, 396 | {"sJsSdFBY", "Ucs2cgJv", "ltZWhw3rvDThU3h4wTiMR0", PrefixCryptApr1}, 397 | {"676215000", "PJ52qkEa", "FVxkESgiPU8HVk9CVr5Aw0", PrefixCryptApr1}, 398 | {"nimamapwoaini", "iJhvvMzV", "c11ZLkLbU3oTL0tO4Uc2b0", PrefixCryptApr1}, 399 | {"nitsuj", "Eg6C/017", "PBjnkuRuhfwSMso1of0CU/", PrefixCryptApr1}, 400 | {"cukierek2003", "DtaGU5uw", "wj9U6W39HosDe4d20aq9b0", PrefixCryptApr1}, 401 | {"seeder", "Hu7E7fh9", "ro5jNBVSUr7P3xXB7bWTs1", PrefixCryptApr1}, 402 | {"00167148786", "kIAtp5Qp", "0mGyQcPNotlS9PXmD8VLX/", PrefixCryptApr1}, 403 | {"ashok198", "yz/u5zIx", "TcuTnX2cLRkGGPWuQ1DHe0", PrefixCryptApr1}, 404 | {"kt2116", "zIlMHa5m", "v.HKzAXRicCxQlNwap5r5/", PrefixCryptApr1}, 405 | {"another82", "kf0a2hjv", ".8kEpY7NyyNfBs4Udeu2T.", PrefixCryptApr1}, 406 | {"75995794", "2AcSlaOt", "PdPz3ooJyaCM4rD9AuS4c/", PrefixCryptApr1}, 407 | {"19901130", "4wioa3Us", "uaKSWrWjJlqHdsqBdF7Zr.", PrefixCryptApr1}, 408 | {"gijs010389", "4D9hzr6I", "PsnXK455GeQ3NCdOHmoSY1", PrefixCryptApr1}, 409 | {"26263199", "rXOrEHJ9", "atQhaNEYAfdzht02mRZcg.", PrefixCryptApr1}, 410 | {"hi1j42x8", "i8PdGfO7", "Xv.aSLFQjyqbJ1KnM9hCs1", PrefixCryptApr1}, 411 | {"6922235", "I2xWkhl3", "oth511sBJphjpr0chWodC1", PrefixCryptApr1}, 412 | {"67749330", "AGNgrF8B", "KBcUjzo9d3pXFNsUCD6Ur1", PrefixCryptApr1}, 413 | {"ccpatrik", "zuNtiCs2", "54MqesBdp3RoL98/fklXb/", PrefixCryptApr1}, 414 | {"summer3011", "ZK2FB9JV", "8x8Ug7Jh3oWXgxWrLBuhr.", PrefixCryptApr1}, 415 | {"331516", "UoqGMAIH", "bEG70EwRgt0SC6h5nr1wY1", PrefixCryptApr1}, 416 | {"135745", "DTVm48a7", "KE/H8KTGE0gi9wxM.ZzOs/", PrefixCryptApr1}, 417 | {"603762004", "0B44zHt5", "Xsbx3F0DtToD.KHYc5ViP1", PrefixCryptApr1}, 418 | {"29011985", "2YOvrTZM", "/n5Fol4IfYqLv9tS/QWWj0", PrefixCryptApr1}, 419 | {"V3RySEcRe7", "D89ubl/e", "x7jjQjtlxgJTcrvl54e3W.", PrefixCryptMd5}, 420 | } 421 | 422 | func Test_apr1Md5(t *testing.T) { 423 | for _, v := range apr1TestData { 424 | if r := md5Crypt(v.password, v.salt, v.prefix); r != v.hashed { 425 | t.Errorf("apr1Md5(%v,%v) is wrong: %v != %v", v.password, v.salt, r, v.hashed) 426 | } 427 | } 428 | 429 | for _, v := range md5CryptTestData { 430 | if r := md5Crypt(v.password, v.salt, v.prefix); r != v.hashed { 431 | t.Errorf("apr1Md5(%v,%v) is wrong: %v != %v", v.password, v.salt, r, v.hashed) 432 | } 433 | } 434 | } 435 | 436 | func Test_Md5(t *testing.T) { 437 | for _, v := range apr1TestData { 438 | text := fmt.Sprintf(v.prefix+"%s$%s", v.salt, v.hashed) 439 | testParserGood(t, "md5", AcceptMd5, RejectMd5, text, v.password) 440 | } 441 | 442 | for _, v := range md5CryptTestData { 443 | text := fmt.Sprintf(v.prefix+"%s$%s", v.salt, v.hashed) 444 | testParserGood(t, "md5", AcceptMd5, RejectMd5, text, v.password) 445 | } 446 | testParserBad(t, "md5", AcceptMd5, RejectMd5, "$apr1$nosalt") 447 | testParserBad(t, "md5", AcceptMd5, RejectMd5, "$1$nosalt") 448 | testParserNot(t, "md5", AcceptMd5, RejectMd5, "plain") 449 | testParserNot(t, "md5", AcceptMd5, RejectMd5, "{SHA}plain") 450 | } 451 | -------------------------------------------------------------------------------- /plain.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | type plainPassword struct { 8 | password string 9 | } 10 | 11 | // AcceptPlain accepts any password in the plain text encoding. 12 | // Be careful: This matches any line, so it *must* be the last parser in you list. 13 | func AcceptPlain(pw string) (EncodedPasswd, error) { 14 | return &plainPassword{pw}, nil 15 | } 16 | 17 | // RejectPlain rejects any plain text encoded password. 18 | // Be careful: This matches any line, so it *must* be the last parser in you list. 19 | func RejectPlain(pw string) (EncodedPasswd, error) { 20 | return nil, fmt.Errorf("plain password rejected: %s", pw) 21 | } 22 | 23 | func (p *plainPassword) MatchesPassword(pw string) bool { 24 | // Notice: nginx prefixes plain passwords with {PLAIN}, so we see if that would 25 | // let us match too. I'd split {PLAIN} off, but someone probably uses that 26 | // in their password. It's a big planet. 27 | return constantTimeEquals(pw, p.password) || constantTimeEquals("{PLAIN}"+pw, p.password) 28 | } 29 | -------------------------------------------------------------------------------- /plain_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func Test_Plain(t *testing.T) { 8 | testParserGood(t, "plain", AcceptPlain, RejectPlain, "bar", "bar") 9 | //testParserBad() plain takes anything 10 | // testParserNot() plain takes anything 11 | } 12 | -------------------------------------------------------------------------------- /sha.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "crypto/sha1" 5 | "crypto/subtle" 6 | "encoding/base64" 7 | "fmt" 8 | "strings" 9 | ) 10 | 11 | type shaPassword struct { 12 | hashed []byte 13 | } 14 | 15 | // AcceptSha accepts valid SHA encoded passwords. 16 | func AcceptSha(src string) (EncodedPasswd, error) { 17 | if !strings.HasPrefix(src, "{SHA}") { 18 | return nil, nil 19 | } 20 | 21 | b64 := strings.TrimPrefix(src, "{SHA}") 22 | hashed, err := base64.StdEncoding.DecodeString(b64) 23 | if err != nil { 24 | return nil, fmt.Errorf("Malformed sha1(%s): %s", src, err.Error()) 25 | } 26 | if len(hashed) != sha1.Size { 27 | return nil, fmt.Errorf("Malformed sha1(%s): wrong length", src) 28 | } 29 | return &shaPassword{hashed}, nil 30 | } 31 | 32 | // RejectSha rejects any password encoded as SHA. 33 | func RejectSha(src string) (EncodedPasswd, error) { 34 | if !strings.HasPrefix(src, "{SHA}") { 35 | return nil, nil 36 | } 37 | return nil, fmt.Errorf("sha password rejected: %s", src) 38 | } 39 | 40 | func (s *shaPassword) MatchesPassword(pw string) bool { 41 | h := sha1.Sum([]byte(pw)) 42 | return subtle.ConstantTimeCompare(h[:], s.hashed) == 1 43 | } 44 | -------------------------------------------------------------------------------- /sha_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | type shaDatum struct { 8 | password string 9 | hashed string 10 | } 11 | 12 | var shaTestData = []shaDatum{ 13 | {"mickey5", "{SHA}D9rQ8iK6feNAniulHNKdr5V38ok="}, 14 | {"alexandrew", "{SHA}KS7VQqgAnMUfXgWmFCCa6DVhY+M="}, 15 | {"hawaiicats78", "{SHA}mzD9ouM0P06arY0Obdb2KojkFeY="}, 16 | {"DIENOW", "{SHA}2HrOk971ockoAr1Ct1o7GpvFLdU="}, 17 | {"e8f685", "{SHA}IyrjpSzIjrlLT7KjVh1q1LBDCFA="}, 18 | {"Rickygirl03", "{SHA}gh5ZdWJ6UypV+CRv8Kd0herEe8U="}, 19 | {"123vb123", "{SHA}19j8b+o4MIImvb7zkv4gncUWs1s="}, 20 | {"sheng060576", "{SHA}u5hjc4kFFwv2QrMa49uCmn7RmPQ="}, 21 | {"hansisme", "{SHA}Au92ail1kvpgW+HC4PiuJu1Yays="}, 22 | {"h4ck3rs311t3", "{SHA}KvvqIY6j/LU3D/orcNYioTE4yOQ="}, 23 | {"K90JyTGA", "{SHA}QftskBtqwp5hsovHb+dGB7azRsI="}, 24 | {"aspire5101", "{SHA}vjUxr9fJRAYTdO0lZb83C2z0FKo="}, 25 | {"553568", "{SHA}FTguhILOzfejAav4aWK2X4D51qE="}, 26 | {"SRI", "{SHA}7CPWhF7FKaS6fBC+zAuncRjVDOo="}, 27 | {"maxmus", "{SHA}tHLz2JrCsGMOAPUh38Td1yP65rI="}, 28 | {"a5xp9707", "{SHA}qTzg8xc+MFLHwsR9DFVuUTPiFA8="}, 29 | {"tomasrim", "{SHA}BxtDkfZMLEfKDlqluTcU/UOFknw="}, 30 | {"2a0mag", "{SHA}cnCoTKX3EK7nIA+zmxcu3ovItrM="}, 31 | {"wmsfht", "{SHA}pBahyhKlvfj+JoJNul/LNITFz+A="}, 32 | {"webmaster2364288", "{SHA}NQb47c348gpwiOL+NqztAYm6LVQ="}, 33 | {"121516m", "{SHA}Oy/RamubYWzVZ1IxxiezV5G8ODc="}, 34 | {"T69228803", "{SHA}gN1LmPBMrRxZkzhipSu/vEKgqnY="}, 35 | {"qq820221", "{SHA}zMx1exH6oGOtF78Y8ZY7KPp2E5k="}, 36 | {"chenfy", "{SHA}5wQp5hYE/N3i/i6Yjz97fBQwh/s="}, 37 | {"www.debure.net", "{SHA}quy6WOPSGssG33/XYI1GjM1EcSw="}, 38 | {"1333e763", "{SHA}rmbzU+tedWkSg4z19JgtmpXoO60="}, 39 | {"burberries", "{SHA}lCe4FgTHpkpOhbCp0K5JqA5Ze9Q="}, 40 | {"chanmee14", "{SHA}AJnAjBWd4U8wze/raohAgH69VJk="}, 41 | {"65432106543210", "{SHA}CesAlg5KhkapACkKNGlfyDZu1RA="}, 42 | {"powernet", "{SHA}K3p3TiyMMAcQ5vVa+dGNV3x4dXs="}, 43 | {"a2d8i6a7", "{SHA}w5xupnv3GzEjrZeRTaN/BAIwZG0="}, 44 | {"gvs9ptc", "{SHA}5i89qVd8KDVGIj/6WCs42qiLz78="}, 45 | {"Pookie", "{SHA}dyfp5ehLdcgD8DV5OTPFMOgapMw="}, 46 | {"lorissss", "{SHA}nPBPyIWbALLxg9JZQfsMjS4RcwU="}, 47 | {"ess", "{SHA}Uk8l/rcR+Og3uJP/+q604N8MY40="}, 48 | {"sparra", "{SHA}hIoJ2Qv4wRE3IOC0T+2PhtuhIRs="}, 49 | {"allysson", "{SHA}zoSpRZj3pbSShQ9O/SQs+72Let8="}, 50 | {"99128008", "{SHA}6LIl/XA9I2XAqwjj2oyYbAGtbOE="}, 51 | {"evisanne", "{SHA}+04wmC0awrfmGiRG+HJXjzB3ksw="}, 52 | {"qfxg7x9l", "{SHA}8ppTyzpxZSWxqsnvxLtFJrvJV0E="}, 53 | {"03415", "{SHA}7D+UYPYha3+V5/PRn2lmCoLkE3E="}, 54 | {"87832309", "{SHA}DdMdedbyWGN2wXXkFEiaq0aH9r4="}, 55 | {"816283", "{SHA}apgv+JsqqKiGnwxX93atjb/XRDU="}, 56 | {"banach12", "{SHA}7k3SGIwIJzTmBgFXSlJuO7OvLx8="}, 57 | {"sjdszpsc", "{SHA}jTKQDFGg8jCZfA7Z7NTvF9ayFNQ="}, 58 | {"changsing", "{SHA}9Ugo2jB2WaxPh24gPzBGY1zk8XA="}, 59 | {"56339388", "{SHA}VziiTWLQk/9DswnexDFgWnA0i7Q="}, 60 | {"52114157", "{SHA}4DANwobCvUtq/rIntyXbGBRx1Ag="}, 61 | {"jinebimb", "{SHA}3Hrb7SJv64iKtC6+p/hkSwt7DqI="}, 62 | {"erol43", "{SHA}mhvtao9e4qlisxYyuFvpiDgk9AA="}, 63 | {"2yagos", "{SHA}gOUVpYSGfZS2G1e1ETbr9xh3s2w="}, 64 | {"habparty!", "{SHA}uwszyh+dmQGG7TTF+og53Ktkoxs="}, 65 | {"tangjianhui", "{SHA}aARgf7klVi/pz8VN86UyQTGzz1Q="}, 66 | {"serandah", "{SHA}zsl2jAqcqruDzXNA8N0mSLUZbzY="}, 67 | {"mirrages", "{SHA}UTUesDbSS6/GgPE9iZf3lrCWZTQ="}, 68 | {"mantgaxxl", "{SHA}l7my97BzljjfxmBiJckh4YSyb98="}, 69 | {"45738901", "{SHA}BvqybCxPG+FdshJEASmykXCKFJs="}, 70 | {"g523minna", "{SHA}8vtQDuXJUEzst96ogzkYvG8uxng="}, 71 | {"j202020", "{SHA}Kdw33gVp/H9JnSZLlWsnPsima8k="}, 72 | {"g@mmaecho", "{SHA}pngHweDVwzvWLbkxKI0jpOFMTM8="}, 73 | {"042380", "{SHA}BVd3k63K6BSYJK1B/hjI8yNXfN0="}, 74 | {"ASRuin", "{SHA}smmoa8r9gdt2lp7HcRV2K5/IIIc="}, 75 | {"061990", "{SHA}mQqcr8Htt8OdiJfi6ZATYKrThEY="}, 76 | {"ysoline", "{SHA}+r2NvWFQ5X+4vorvec9K2mFDuOE="}, 77 | {"liuzhouzhou", "{SHA}sEmnRhZegMdBDNnYnyVB47TeLdg="}, 78 | {"b0000000wind", "{SHA}aSdcYgX9Dm3KW/Za/tlT57vxgEs="}, 79 | {"7913456852", "{SHA}Mw6kTqFaODDOJj5VpTT2ch/YmeE="}, 80 | {"9008", "{SHA}VUcPEIUzSnM4hAcg6rxZjmLVDJ0="}, 81 | {"waitlin11", "{SHA}ZLBhQrXPeeuv1cCPi+7jJPxgXVI="}, 82 | {"8fdakar", "{SHA}n3eCpjIH9zhOq8ZPlEXJu6p7z+4="}, 83 | {"eisball", "{SHA}rV5kTR4QT6OUb5x34+U4V7KCLaY="}, 84 | {"jenna17", "{SHA}7p5fBYB+sDLAAUlXN7mRGpplD68="}, 85 | {"belkadonam", "{SHA}cTgM/9Qsi2NMwHIVfkRcURDXsdc="}, 86 | {"tfyuj9JW", "{SHA}yxMuwJUB/2qDA4nryzDaWwDTwkw="}, 87 | {"nihaijidema", "{SHA}eRz741UJnWDv3as1Zr2hXD+V5NY="}, 88 | {"talapia", "{SHA}cgoLdQ4IZQJsWhuAk+JCTQ8t9ro="}, 89 | {"7376220", "{SHA}fySbHcTbxJwfik52qAUS8rI+hzo="}, 90 | {"c7m8e1xsc3", "{SHA}lzR3In34RL83gu8qY87y0YHheew="}, 91 | {"84129793", "{SHA}15alyIIv299z3WG9HSMyypwPHrk="}, 92 | {"test1000", "{SHA}d6DZQ826zlJxap75+uEuReJ4jTk="}, 93 | {"ecmanhatten", "{SHA}7KJnN2t/mNwfOL+l3iWaxOhxoTM="}, 94 | {"EvanYo3327", "{SHA}vM6SgURZ4FWN09Qkhg9GKfYNlvI="}, 95 | {"269john139", "{SHA}Opk05mxS7TatlO37aS/U9IIVQ8g="}, 96 | {"3348159zw", "{SHA}C9q9Bn45z0QrZmQ39373SmzvDIU="}, 97 | {"lu184020", "{SHA}kVVGcThWup+til7v26KfKky9tF0="}, 98 | {"aszasw", "{SHA}8vG8fcwUCtnsSxWNTQOZyjmMN9U="}, 99 | {"33059049", "{SHA}rTkBT+vWAX8AkrMCneVIoGWMPIs="}, 100 | {"li3255265", "{SHA}4z+IIfZ6CC3UooUH+pntq40RGLU="}, 101 | {"kerrihayes", "{SHA}97ep9vYDA8k3ULenovM1JUP/ZuM="}, 102 | {"0167681809", "{SHA}4LkUGAH8SUWCmhpgSR+UoVEuoIU="}, 103 | {"stefano123", "{SHA}VMb2w8BIouL+pnejIpju4YvSFrA="}, 104 | {"15054652730", "{SHA}TDOwuWHnpr8IWec4G4BV0C1dugY="}, 105 | {"natdvd213", "{SHA}YU7zF05TgscOFcJyYpoQqYEsYZU="}, 106 | {"680929", "{SHA}0q/yO/YHEg+nTHaZj9wUMpYXc8U="}, 107 | {"steelpad8", "{SHA}XRyWxrZ4CYOdZetXUtoBNOYBgkA="}, 108 | {"374710", "{SHA}B9utQxyZ22KOIV5ucDFQOQBHOmI="}, 109 | {"394114", "{SHA}pBSxqpqhhW+Gwpq+mPNsstCr8tM="}, 110 | {"24347", "{SHA}lLeRG7AY/3SvGfvIWXrJLuAFLHo="}, 111 | {"krait93", "{SHA}QzZbE1LP+9XcLOc+2FxJuydCQZY="}, 112 | {"5164794", "{SHA}Ycbe25pEYtUEXhwcEhb4KQjdJmU="}, 113 | {"rswCyJE5", "{SHA}bIPx+G5TLj+NPl0MfyVy85moTJ8="}, 114 | {"31480019", "{SHA}ooI9TrVVE7LkLKm5UWwTZT5NDW4="}, 115 | {"19830907ok", "{SHA}bEIqh9ertcOn4weApT0AoOM04oU="}, 116 | {"zlsmhzlsmh", "{SHA}o51ovielNeyLtb8WuWL0r4PNXus="}, 117 | {"Zengatsu", "{SHA}kJDexedKxfHbXeo9MDBUZgagMJA="}, 118 | {"0127603331", "{SHA}Q5t2BVGrnc6e0WXfX3dmgPeFdw8="}, 119 | {"axelle77", "{SHA}2gUrA8RSDeAsBqTLEjZdaMn+jgo="}, 120 | {"password2147", "{SHA}7/hIGwVORnrIkQ45Kam+1bQAvzg="}, 121 | {"olixkl8b", "{SHA}Ys9f3svSIg9qsti6VK/KO73Whyw="}, 122 | {"maiwen", "{SHA}wFrYvAKCXwBKqeLvEN/vpLPDqiY="}, 123 | {"198613", "{SHA}jCtBfLQYgycvbgwtlsTk0RaBcyk="}, 124 | {"s17kr8wu", "{SHA}1ndFd2yaVGQ++IN3o4s7nhmJd6c="}, 125 | {"biker02", "{SHA}3xG++i1ZRHjEAMWIwuLa/lln4Os="}, 126 | {"m1399", "{SHA}lFkJRnfrNTNxWWwLVuS4TDdDT2g="}, 127 | {"a2dc6a", "{SHA}xuNHuDtaTcimJJfoic1iM5V3+74="}, 128 | {"zhd8902960", "{SHA}OZ1xZJTVdEVVKSOYEUWsJInUxoY="}, 129 | {"parasuta", "{SHA}LqofIkTgPad+sr0Qfmh5xmd7F7k="}, 130 | {"the1secret", "{SHA}tzixFK8WpqP0bM0qS5sLHEurrm8="}, 131 | {"teddy14", "{SHA}H3PBIct3rsU9JIPys8flehjPd3A="}, 132 | {"4516388amt", "{SHA}HINCI2ECClS+2vjbEyE/KBDrz08="}, 133 | {"245520", "{SHA}T2K08XkQmxOIIFMxN7QN/dHtaXk="}, 134 | {"D34dw00d", "{SHA}mMOZxFazBwasFq0MdAVvMQw5b30="}, 135 | {"officiel", "{SHA}BrQDy1wpNzHm2EYj20X3PWbtGIc="}, 136 | {"36653665", "{SHA}POdeGoaJ4u9dDL7+1aSpKG7u7Jo="}, 137 | {"hipol", "{SHA}J+YDaKhmEbjYz71UaVshKoCxg7c="}, 138 | {"Nylon0", "{SHA}g9Gphl4ckCSIFal2qP1G+WyIWIs="}, 139 | {"caitlyne6", "{SHA}swnIE5GKm3qcHsCdYAVlR9vfldM="}, 140 | {"dogzilla", "{SHA}cu8KAzVlpHUeCIDL3dDmhoZwu9k="}, 141 | {"lemegaboss", "{SHA}oDyWybc7jVPlmqA+e+F4t/thfRA="}, 142 | {"c0valerius", "{SHA}8Y2mGtCTaGznCWYhA/K+XrejBB4="}, 143 | {"liseczek44", "{SHA}digyAvFugxt+pDECZ/1XMyHysGo="}, 144 | {"saulosi", "{SHA}huAd/hD7INmNYaTrOKbS4auA4Yk="}, 145 | {"53522", "{SHA}JK5NmoqlEpzEtwI8cyILiMh710w="}, 146 | {"ajgebam", "{SHA}t/RpkDJt44MYi97pB25RABGCTdw="}, 147 | {"freshplayer", "{SHA}FW+1cwXfHQtLjBjt9EkBNwnuHnY="}, 148 | {"logistica1", "{SHA}jTj0t+mHSGoxWFexu7ac+v8nHCQ="}, 149 | {"12calo66", "{SHA}cKdPr0oYieZ1qSvGpMk7G6hB7mw="}, 150 | {"kenno", "{SHA}7rCX8u5lLwCcAzDReeSjlU/QkgI="}, 151 | {"34639399", "{SHA}r8kaguSOy20qHsPRkQ2uMzKasM8="}, 152 | {"0408636405", "{SHA}V7Hjc5P/zB+sxHcqKPkgyodAFT4="}, 153 | {"weezer12", "{SHA}YR60ptREeIpQv0B4cho/t2kzODw="}, 154 | {"9888735777", "{SHA}zwfYrgeJ508R2yvS/SdyZPNUuw0="}, 155 | {"7771877", "{SHA}pKvhH74q06+iWSbsIg9jOqLIOuw="}, 156 | {"6620852", "{SHA}LYBr5lIErSckQ/wKA3+YEZin728="}, 157 | {"98billiards", "{SHA}eXKk+N0xbstCZ6FV28J/XtVSYiY="}, 158 | {"angelik", "{SHA}k80oUNvldNqQwDvS7n9/U7uqyAA="}, 159 | {"86815057", "{SHA}nOQ2Wjlc5BGlvX5BfN+RMbH+mKg="}, 160 | {"p16alfalfa", "{SHA}O6wvUOWKPtROfqtXZ4TMjlJ/Eqw="}, 161 | {"7236118", "{SHA}G1oAkkte9vKp330iZKVnwoyV/FE="}, 162 | {"glock17l", "{SHA}6Fys40HEBJYb58Xk4MEa3dYmfh0="}, 163 | {"sigmundm", "{SHA}V0QFZ76ISexnBTXJNn4egImklsI="}, 164 | {"ltbgeqsd", "{SHA}O5XnrX44sxaey9uUvGLkJQXthkw="}, 165 | {"wqnd8k2m", "{SHA}uYqLu0+hCAVauHxHhHj9S8K6dLQ="}, 166 | {"yangjunjie", "{SHA}bNXP45UPcI6hnkXMm9XNE4LncRc="}, 167 | {"manjinder", "{SHA}u4yMsvZEFcal38qQSk6pK/YeljY="}, 168 | {"nick2000", "{SHA}5xFv7yRZIk605O6D1cn52caIorY="}, 169 | {"193416", "{SHA}eMiZn8p3ZPwXjrzScxmVZDo5W6s="}, 170 | {"pang168", "{SHA}kjiXjei7Tjszq9RunSYjJ++OUHM="}, 171 | {"454016", "{SHA}TPcur6LmXg4W+FcHKhC2JVIDnwI="}, 172 | {"phair08", "{SHA}2EckYONFyUcDEqgkPhbfah9cHK8="}, 173 | {"10252007cw", "{SHA}/3sW+7ineIj1jOU0Dby9nP3ZspA="}, 174 | {"zhuzhuzhu", "{SHA}9mONNF7CArnydjmwkhfQebkGaOo="}, 175 | {"metafunds", "{SHA}rGImsJEm0Pd8fbE40OBmP6VGfIY="}, 176 | {"smash", "{SHA}Mf6CeupM9fas594sId4LX2t4OFg="}, 177 | {"76387638", "{SHA}HxRugr3cGBjQB75CJ9urfWG9YSI="}, 178 | {"S226811954", "{SHA}Nh+ikcGOUUgInrJh0iHlVlBmsrw="}, 179 | {"mintymoo00", "{SHA}3BrwZ+qGvcyFB/Lc/XDfOFWwxXQ="}, 180 | {"seven711", "{SHA}8mvvCcUzMnsapzC953/XCxfOT+8="}, 181 | {"924414", "{SHA}3X/lD6ATcOaRHopH+6m27+LVeIM="}, 182 | {"changchengxu", "{SHA}Ttiw09bDmyeY/YhY0H/YX6MrHWY="}, 183 | {"alaska58", "{SHA}wpd/t9fl65nDq3cSCmRYwv9v65E="}, 184 | {"7678208", "{SHA}pltR0K3LNrS/qOcwZjzTlXpmw+U="}, 185 | {"szazsoo73", "{SHA}mU+OEwW2NBcebLfRPZ9C/Ki0vCI="}, 186 | {"3830371", "{SHA}sOfYGqpAMRqXD4e69F6oH3IrqRc="}, 187 | {"0qdzx66b", "{SHA}IjbOYS0WcCo0Op0Sz+ETYSVmHNA="}, 188 | {"09124248099", "{SHA}e61WLuSD9xNufpbU1Y8wKlgupXM="}, 189 | {"bachrain", "{SHA}3Z41BvXKnswJCMrPj94Xj3Lmd0s="}, 190 | {"sJsSdFBY", "{SHA}p96d7T+S9V6V8NuYLF679N35qHA="}, 191 | {"676215000", "{SHA}yqC6+2MiJondbEaBtxMBn0X81Zw="}, 192 | {"nimamapwoaini", "{SHA}cC4wcJtLGRSHKlIqwkr72t9/b9w="}, 193 | {"nitsuj", "{SHA}hgNZhLC7ZcfxDef0KFz/xEabK+E="}, 194 | {"cukierek2003", "{SHA}ptbHX+v+J4WVRvM9a2tlWTOIjaQ="}, 195 | {"seeder", "{SHA}ls+1/MdSymeKHyVoU6OJ2n9VF2s="}, 196 | {"00167148786", "{SHA}oRqSqk2/YvT0NNWY9M9ejSNRWms="}, 197 | {"ashok198", "{SHA}mFHUN4xN0yWhXLeHSeRxPFXNIUA="}, 198 | {"kt2116", "{SHA}W0GRYxTwoVnywElvbpwdNR0wEmk="}, 199 | {"another82", "{SHA}CVVbc3vnDGApFxvmTX+/4WUErnE="}, 200 | {"75995794", "{SHA}pKxQI+Q6WmVal5D8XMAy9c3jEyM="}, 201 | {"19901130", "{SHA}C91rFij4vkgcUZisF7TTcpMUFKA="}, 202 | {"gijs010389", "{SHA}nyzMGhYQfLMBCG7rBtXnbj0bF0Y="}, 203 | {"26263199", "{SHA}hw69n/v0JJf7Z1UK0hn6NcQOiMY="}, 204 | {"hi1j42x8", "{SHA}iTz0n/olV3SiPW9zQX2v2/sYZHE="}, 205 | {"6922235", "{SHA}NM/XeJbQkI57FPhUn0pU4pV6tYc="}, 206 | {"67749330", "{SHA}ws12wS7j4dCN+IItHQi8SZS00kc="}, 207 | {"ccpatrik", "{SHA}HhYw12y7WG8xahUNKf4MHlUPitA="}, 208 | {"summer3011", "{SHA}KrCi609b3nk3uKVCgw76/cbsAZc="}, 209 | {"331516", "{SHA}uSyZbnpZu1t1TsvoUyp4TsQvePs="}, 210 | {"135745", "{SHA}oLBO8TyN9/yjytrlYF6NW0o6He0="}, 211 | {"603762004", "{SHA}axYN5gmBWHFLDMoMf4Oj/t4ND9I="}, 212 | {"29011985", "{SHA}KdFYg6fHUtb8tvbRWak+g+kyk/A="}, 213 | } 214 | 215 | func Test_Sha(t *testing.T) { 216 | for _, v := range shaTestData { 217 | testParserGood(t, "sha", AcceptSha, RejectSha, v.hashed, v.password) 218 | } 219 | testParserBad(t, "sha", AcceptSha, RejectSha, "{SHA}Ys23Ag/5IOWqZCw9dHwH00=") 220 | testParserBad(t, "sha", AcceptSha, RejectSha, "{SHA}plaintext") 221 | testParserNot(t, "sha", AcceptSha, RejectSha, "plaintext") 222 | } 223 | -------------------------------------------------------------------------------- /ssha.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "crypto/sha1" 5 | "crypto/subtle" 6 | "encoding/base64" 7 | "fmt" 8 | "strings" 9 | ) 10 | 11 | type sshaPassword struct { 12 | hashed []byte 13 | salt []byte 14 | } 15 | 16 | // AcceptSsha accepts any valid password encoded using bcrypt. 17 | func AcceptSsha(src string) (EncodedPasswd, error) { 18 | if !strings.HasPrefix(src, "{SSHA}") { 19 | return nil, nil 20 | } 21 | 22 | b64 := strings.TrimPrefix(src, "{SSHA}") 23 | hashed, err := base64.StdEncoding.DecodeString(b64) 24 | if err != nil { 25 | return nil, fmt.Errorf("Malformed ssha(%s): %s", src, err.Error()) 26 | } 27 | 28 | //ssha appends the length onto the end of the SHA, so the length can't be less than sha1.Size. 29 | if len(hashed) < sha1.Size { 30 | return nil, fmt.Errorf("Malformed ssha(%s): wrong length", src) 31 | } 32 | 33 | hash := hashed[:sha1.Size] 34 | salt := hashed[sha1.Size:] 35 | return &sshaPassword{hash, salt}, nil 36 | } 37 | 38 | // RejectSsha rejects any password encoded using SSHA1. 39 | func RejectSsha(src string) (EncodedPasswd, error) { 40 | if !strings.HasPrefix(src, "{SSHA}") { 41 | return nil, nil 42 | } 43 | return nil, fmt.Errorf("ssha passwords are not accepted: %s", src) 44 | } 45 | 46 | func (s *sshaPassword) MatchesPassword(password string) bool { 47 | //SSHA appends the salt onto the password before computing the hash. 48 | sha := append([]byte(password), s.salt[:]...) 49 | hash := sha1.Sum(sha) 50 | return subtle.ConstantTimeCompare(hash[:], s.hashed) == 1 51 | } 52 | -------------------------------------------------------------------------------- /ssha_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func Test_Ssha(t *testing.T) { 8 | testParserGood(t, "ssha", AcceptSsha, nil, "{SSHA}/lLSOXpMWipWr3ifiighLCpqBiFoMzBM", "password") 9 | testParserBad(t, "ssha", nil, RejectSsha, "{SSHA}0") 10 | testParserNot(t, "ssha", nil, RejectSsha, "plaintext") 11 | } 12 | -------------------------------------------------------------------------------- /util.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "crypto/sha1" 5 | "crypto/subtle" 6 | ) 7 | 8 | func constantTimeEquals(a string, b string) bool { 9 | // compare SHA-1 as a gatekeeper in constant time 10 | // then check that we didn't get by because of a collision 11 | aSha := sha1.Sum([]byte(a)) 12 | bSha := sha1.Sum([]byte(b)) 13 | if subtle.ConstantTimeCompare(aSha[:], bSha[:]) == 1 { 14 | // yes, this bit isn't constant, but you had to make a Sha1 collision to get here 15 | return a == b 16 | } 17 | return false 18 | } 19 | -------------------------------------------------------------------------------- /util_test.go: -------------------------------------------------------------------------------- 1 | package htpasswd 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func testParserGood(t *testing.T, name string, accept PasswdParser, reject PasswdParser, hashed string, passwd string) { 8 | if accept != nil { 9 | ep, err := accept(hashed) 10 | if err != nil { 11 | t.Errorf("%s accept (%s) failed to parse: %s", name, hashed, err.Error()) 12 | } else if ep == nil { 13 | t.Errorf("%s accept (%s) failed to yield an EncodedPasswd", name, hashed) 14 | } else { 15 | if !ep.MatchesPassword(passwd) { 16 | t.Errorf("%s accept (%s) failed to match password (%s)", name, hashed, passwd) 17 | } 18 | if ep.MatchesPassword(passwd + "not") { 19 | t.Errorf("%s accept (%s) failed by matching password (%s)", name, hashed, passwd+"not") 20 | } 21 | } 22 | } 23 | 24 | if reject != nil { 25 | ep, err := reject(hashed) 26 | if ep != nil { 27 | t.Errorf("%s reject (%s) yielded an EncodedPasswd", name, hashed) 28 | } else if err == nil { 29 | t.Errorf("%s reject (%s) did not return an error", name, hashed) 30 | } 31 | } 32 | } 33 | 34 | func testParserBad(t *testing.T, name string, accept PasswdParser, reject PasswdParser, hashed string) { 35 | if accept != nil { 36 | ep, err := accept(hashed) 37 | if ep != nil { 38 | t.Errorf("%s accept (%s) yielded a EncodedPasswd", name, hashed) 39 | } else if err == nil { 40 | t.Errorf("%s accept (%s) did not return an error", name, hashed) 41 | } 42 | } 43 | if reject != nil { 44 | ep, err := reject(hashed) 45 | if ep != nil { 46 | t.Errorf("%s reject (%s) yielded a EncodedPasswd", name, hashed) 47 | } else if err == nil { 48 | t.Errorf("%s reject (%s) did not return an error", name, hashed) 49 | } 50 | } 51 | } 52 | 53 | func testParserNot(t *testing.T, name string, accept PasswdParser, reject PasswdParser, hashed string) { 54 | if accept != nil { 55 | ep, err := accept(hashed) 56 | if ep != nil { 57 | t.Errorf("%s accept (%s) yielded a EncodedPasswd", name, hashed) 58 | } else if err != nil { 59 | t.Errorf("%s accept (%s) errored instead of ignoring", name, hashed) 60 | } 61 | } 62 | if reject != nil { 63 | ep, err := reject(hashed) 64 | if ep != nil { 65 | t.Errorf("%s reject (%s) yielded a EncodedPasswd", name, hashed) 66 | } else if err != nil { 67 | t.Errorf("%s reject (%s) errored instead of ignoring", name, hashed) 68 | } 69 | } 70 | } 71 | --------------------------------------------------------------------------------