├── go.mod ├── structs.go ├── README.md ├── go.sum ├── main.go └── strings.txt /go.mod: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | go 1.19 4 | 5 | require ( 6 | github.com/alexflint/go-arg v1.4.3 7 | github.com/mattn/go-sqlite3 v1.14.16 8 | ) 9 | 10 | require github.com/alexflint/go-scalar v1.1.0 // indirect 11 | -------------------------------------------------------------------------------- /structs.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | type Args struct { 4 | Command string `arg:"positional, required" help:"import or export"` 5 | InPath string `arg:"-i, required" help:"Path of input file. JSON appearance if import, save file if export."` 6 | OutPath string `arg:"-o" help:"Path of output file. Save file if import, JSON appearance if export."` 7 | OrigName bool `arg:"--orig-name" help:"Keep original character name."` 8 | } 9 | 10 | type AppearanceData struct { 11 | PresetType string `json:"presetType"` 12 | PresetName string `json:"presetName"` 13 | } 14 | 15 | type GenderData struct { 16 | DataName string `json:"dataName"` 17 | DataValue string `json:"dataValue"` 18 | } 19 | 20 | type Appearance struct { 21 | FirstName string `json:"firstName"` 22 | LastName string `json:"lastName"` 23 | AppearanceData []*AppearanceData `json:"appearanceData"` 24 | GenderData []*GenderData `json:"genderData"` 25 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HLAT---Hogwarts-Legacy-Appearance-Tool 2 | Tool for appearance manipulation for Hogwarts Legacy written in Go. 3 | [Windows binaries](https://github.com/Sorrow446/HLAT-Hogwarts-Legacy-Appearance-Tool/releases) 4 | 5 | ## Why? 6 | - Allows users to create presets from their own save files and share them for others to use in their saves. 7 | - Allows you to edit parts of characters the game wouldn't allow you to (gender, head etc.). 8 | 9 | ## Usage 10 | Create JSON appearance preset from save file: 11 | `hlat_x64.exe export -i HL-00-00.sav -o eve.json` 12 | 13 | Inject JSON appearance preset into save file: 14 | `hlat_x64.exe import -i eve.json -o HL-00-00.sav` 15 | 16 | ``` 17 | Usage: main.exe --inpath INPATH [--outpath OUTPATH] [--orig-name] COMMAND 18 | 19 | Positional arguments: 20 | COMMAND import or export 21 | 22 | Options: 23 | --inpath INPATH, -i INPATH 24 | Path of input file. JSON appearance if import, save file if export. 25 | --outpath OUTPATH, -o OUTPATH 26 | Path of output file. Save file if import, JSON appearance if export. 27 | --orig-name Keep original character name. 28 | --help, -h display this help and exit 29 | ``` 30 | 31 | ## Disclaimer 32 | - I will not be responsible for any possibility of save corruption. 33 | - Hogwarts Legacy brand and name is the registered trademark of its respective owner. 34 | - HLAT has no partnership, sponsorship or endorsement with Avalanche Software or Warner Bros. Games. 35 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/alexflint/go-arg v1.4.3 h1:9rwwEBpMXfKQKceuZfYcwuc/7YY7tWJbFsgG5cAU/uo= 2 | github.com/alexflint/go-arg v1.4.3/go.mod h1:3PZ/wp/8HuqRZMUUgu7I+e1qcpUbvmS258mRXkFH4IA= 3 | github.com/alexflint/go-scalar v1.1.0 h1:aaAouLLzI9TChcPXotr6gUhq+Scr8rl0P9P4PnltbhM= 4 | github.com/alexflint/go-scalar v1.1.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= 5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= 9 | github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= 10 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 11 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 12 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 13 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 14 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 15 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 16 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 17 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 18 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 19 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "database/sql" 6 | "encoding/binary" 7 | "encoding/json" 8 | "errors" 9 | "fmt" 10 | "os" 11 | "path/filepath" 12 | "strings" 13 | 14 | "github.com/alexflint/go-arg" 15 | _ "github.com/mattn/go-sqlite3" 16 | ) 17 | 18 | var dbPath = filepath.Join(os.TempDir(), "hlse_tmp.db") 19 | 20 | var magic = [4]byte{'\x47', '\x56', '\x41', '\x53'} 21 | 22 | var rawDbImageStr = []byte{ 23 | '\x52', '\x61', '\x77', '\x44', '\x61', '\x74', 24 | '\x61', '\x62', '\x61', '\x73', '\x65', '\x49', 25 | '\x6D', '\x61', '\x67', '\x65', 26 | } 27 | 28 | func extractDb(saveData []byte) (int, int, error) { 29 | imageStrStart := bytes.Index(saveData, rawDbImageStr) 30 | if imageStrStart == -1 { 31 | return 0, 0, errors.New("couldn't find db image string") 32 | } 33 | dbSizeOffset := imageStrStart+61 34 | dbStartOffset := dbSizeOffset+4 35 | dbSizeBytes := saveData[dbSizeOffset:dbStartOffset] 36 | dbSize := binary.LittleEndian.Uint32(dbSizeBytes) 37 | dbEndOffset := dbStartOffset+int(dbSize) 38 | dbData := saveData[dbStartOffset:dbEndOffset] 39 | err := os.WriteFile(dbPath, dbData, 0755) 40 | return imageStrStart, dbEndOffset, err 41 | } 42 | 43 | var resolveCommand = map[string]string{ 44 | "export": "export", 45 | "e": "export", 46 | "import": "import", 47 | "i": "import", 48 | } 49 | 50 | var queries = map[string]string{ 51 | "appearance_data": `SELECT "PresetType", "PresetName" FROM "AvatarFullBodyPresetsDynamic" WHERE "RegistryId" = "Player0"`, 52 | "appearance_data_del": `DELETE FROM "AvatarFullBodyPresetsDynamic" WHERE "RegistryId" = "Player0"`, 53 | "appearance_data_ins": `INSERT INTO "AvatarFullBodyPresetsDynamic" ('RegistryId', 'PresetType', 'PresetName') VALUES ('Player0', '%s', '%s')`, 54 | "gender_data": `SELECT "DataName", "DataValue" FROM "MiscDataDynamic" WHERE "DataOwner" = "Player" AND "DataName" IN("GenderPronoun", "GenderVoice", "GenderRig")`, 55 | "gender_data_updt": `UPDATE "MiscDataDynamic" SET "DataValue" = "%s" WHERE "DataOwner" = "Player" AND "DataName" = "%s"`, 56 | "names": `SELECT "DataValue" FROM "MiscDataDynamic" WHERE "DataName" = "%s"`, 57 | "names_updt": `UPDATE "MiscDataDynamic" SET "DataValue" = "%s" WHERE "DataName" = "%s"`, 58 | } 59 | 60 | 61 | func parseArgs() (*Args, error) { 62 | var args Args 63 | arg.MustParse(&args) 64 | 65 | cmd, ok := resolveCommand[strings.ToLower(args.Command)] 66 | if !ok{ 67 | return nil, errors.New("invalid command, must be import (i) or export (e)") 68 | } 69 | if cmd == "export" { 70 | if !(strings.HasSuffix(args.InPath, ".sav") && strings.HasSuffix(args.OutPath, ".json")) { 71 | return nil, errors.New("invalid input/output file extension") 72 | } 73 | } else { 74 | if !(strings.HasSuffix(args.InPath, ".json") && strings.HasSuffix(args.OutPath, ".sav")) { 75 | return nil, errors.New("invalid input/output file extension") 76 | } 77 | } 78 | args.Command = cmd 79 | return &args, nil 80 | } 81 | 82 | func updateRow(db *sql.DB, q string) error { 83 | res, err := db.Exec(q) 84 | if err != nil { 85 | return err 86 | } 87 | rowsAffected, err := res.RowsAffected() 88 | if err != nil { 89 | return err 90 | } 91 | if rowsAffected == 0 { 92 | return errors.New("db row wasn't updated") 93 | } 94 | return nil 95 | } 96 | 97 | 98 | func writeSave(updatedDbBytes, saveData []byte, imageStrStart, dbEndOffset int, outPath string) error { 99 | f, err := os.OpenFile(outPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0755) 100 | if err != nil { 101 | return err 102 | } 103 | defer f.Close() 104 | 105 | _, err = f.Write(saveData[:imageStrStart+35]) 106 | if err != nil { 107 | return err 108 | } 109 | buf := make([]byte, 4) 110 | 111 | 112 | updatedDbSize := len(updatedDbBytes) 113 | binary.LittleEndian.PutUint32(buf, uint32(updatedDbSize+4)) 114 | 115 | _, err = f.Write(buf) 116 | if err != nil { 117 | return err 118 | } 119 | 120 | _, err = f.Write(saveData[imageStrStart+39:imageStrStart+61]) 121 | if err != nil { 122 | return err 123 | } 124 | 125 | binary.LittleEndian.PutUint32(buf, uint32(updatedDbSize)) 126 | 127 | _, err = f.Write(buf) 128 | if err != nil { 129 | return err 130 | } 131 | 132 | _, err = f.Write(updatedDbBytes) 133 | if err != nil { 134 | return err 135 | } 136 | _, err = f.Write(saveData[dbEndOffset:]) 137 | return err 138 | } 139 | 140 | func parseAppearance(db *sql.DB) (*Appearance, error) { 141 | var ( 142 | appearance Appearance 143 | presetType string 144 | presetName string 145 | name string 146 | ) 147 | 148 | for idx, dataName := range [2]string{"PlayerFirstName", "PlayerLastName"} { 149 | row := db.QueryRow(fmt.Sprintf(queries["names"], dataName)) 150 | err := row.Err() 151 | if err != nil { 152 | return nil, err 153 | } 154 | err = row.Scan(&name) 155 | if err != nil { 156 | return nil, err 157 | } 158 | if idx == 0 { 159 | appearance.FirstName = name 160 | } else { 161 | appearance.LastName = name 162 | } 163 | } 164 | 165 | for idx, key := range [2]string{"appearance_data", "gender_data"} { 166 | rows, err := db.Query(queries[key]) 167 | if err != nil { 168 | return nil, err 169 | } 170 | for rows.Next() { 171 | err = rows.Scan(&presetType, &presetName) 172 | if err != nil { 173 | rows.Close() 174 | return nil, err 175 | } 176 | if idx == 0 { 177 | data := &AppearanceData{ 178 | PresetType: presetType, 179 | PresetName: presetName, 180 | } 181 | appearance.AppearanceData = append(appearance.AppearanceData, data) 182 | } else { 183 | data := &GenderData{ 184 | DataValue: presetName, 185 | DataName: presetType, 186 | } 187 | appearance.GenderData = append(appearance.GenderData, data) 188 | } 189 | } 190 | rows.Close() 191 | } 192 | return &appearance, nil 193 | 194 | } 195 | 196 | func readJsonApp(appPath string) (*Appearance, error) { 197 | data, err := os.ReadFile(appPath) 198 | if err != nil { 199 | return nil, err 200 | } 201 | var obj Appearance 202 | err = json.Unmarshal(data, &obj) 203 | if err != nil { 204 | return nil, err 205 | } 206 | return &obj, nil 207 | } 208 | 209 | func writeJsonApp(outPath string, appearance *Appearance) error { 210 | m, err := json.MarshalIndent(appearance, "", "\t") 211 | if err != nil { 212 | return err 213 | } 214 | fmt.Println(string(m)) 215 | err = os.WriteFile(outPath, m, 0755) 216 | return err 217 | } 218 | 219 | func importApp(db *sql.DB, saveData []byte, imageStrStart, dbEndOffset int, args *Args) error { 220 | appearance, err := readJsonApp(args.InPath) 221 | if err != nil { 222 | db.Close() 223 | return err 224 | } 225 | 226 | if !args.OrigName { 227 | err = updateRow(db, fmt.Sprintf(queries["names_updt"], appearance.FirstName, "PlayerFirstName")) 228 | if err != nil { 229 | db.Close() 230 | return err 231 | } 232 | 233 | err = updateRow(db, fmt.Sprintf(queries["names_updt"], appearance.LastName, "PlayerLastName")) 234 | if err != nil { 235 | db.Close() 236 | return err 237 | } 238 | } 239 | 240 | err = updateRow(db, queries["appearance_data_del"]) 241 | if err != nil { 242 | db.Close() 243 | return err 244 | } 245 | 246 | for _, d := range appearance.AppearanceData { 247 | err = updateRow(db, fmt.Sprintf(queries["appearance_data_ins"], d.PresetType, d.PresetName)) 248 | if err != nil { 249 | db.Close() 250 | return err 251 | } 252 | } 253 | 254 | for _, d := range appearance.GenderData { 255 | err = updateRow(db, fmt.Sprintf(queries["gender_data_updt"], d.DataValue, d.DataName)) 256 | if err != nil { 257 | db.Close() 258 | return err 259 | } 260 | } 261 | db.Close() 262 | updatedDbBytes, err := os.ReadFile(dbPath) 263 | if err != nil { 264 | return err 265 | } 266 | 267 | err = writeSave(updatedDbBytes, saveData, imageStrStart, dbEndOffset, args.OutPath) 268 | return err 269 | } 270 | 271 | func exportApp(db *sql.DB, outPath string) error { 272 | defer db.Close() 273 | appearance, err := parseAppearance(db) 274 | if err != nil { 275 | return err 276 | } 277 | err = writeJsonApp(outPath, appearance) 278 | return err 279 | } 280 | 281 | func main() { 282 | args, err := parseArgs() 283 | if err != nil { 284 | panic(err) 285 | } 286 | 287 | var saveData []byte 288 | 289 | if args.Command == "export" { 290 | saveData, err = os.ReadFile(args.InPath) 291 | } else { 292 | saveData, err = os.ReadFile(args.OutPath) 293 | } 294 | 295 | if err != nil { 296 | panic(err) 297 | } 298 | 299 | if !bytes.Equal(saveData[:4], magic[:]) { 300 | panic("invalid save file magic") 301 | } 302 | 303 | imageStrStart, dbEndOffset, err := extractDb(saveData) 304 | if err != nil { 305 | panic(err) 306 | } 307 | 308 | defer os.Remove(dbPath) 309 | 310 | db, err := sql.Open("sqlite3", dbPath) 311 | if err != nil { 312 | panic(err) 313 | } 314 | switch args.Command { 315 | case "export": 316 | err = exportApp(db, args.OutPath) 317 | case "import": 318 | err = importApp(db, saveData, imageStrStart, dbEndOffset, args) 319 | } 320 | if err != nil { 321 | panic(err) 322 | } 323 | } -------------------------------------------------------------------------------- /strings.txt: -------------------------------------------------------------------------------- 1 | EYEBROWCOLOR 2 | EyebrowColorFemale001 3 | EyebrowColorFemale002 4 | EyebrowColorFemale003 5 | EyebrowColorFemale004 6 | EyebrowColorFemale005 7 | EyebrowColorFemale006 8 | EyebrowColorFemale007 9 | EyebrowColorFemale008 10 | EyebrowColorFemale009 11 | EyebrowColorFemale010 12 | EyebrowColorFemale011 13 | EyebrowColorFemale012 14 | EyebrowColorFemale013 15 | EyebrowColorFemale014 16 | EyebrowColorFemale015 17 | EyebrowColorFemale016 18 | EyebrowColorFemale017 19 | EyebrowColorFemale018 20 | EyebrowColorFemale019 21 | EyebrowColorFemale020 22 | EyebrowColorFemale021 23 | EyebrowColorFemale022 24 | EyebrowColorFemale023 25 | EyebrowColorFemale024 26 | EyebrowColorFemale025 27 | EyebrowColorFemale026 28 | EyebrowColorFemale027 29 | EyebrowColorFemale028 30 | EyebrowColorFemale029 31 | EyebrowColorFemale030 32 | EyebrowColorFemale031 33 | EyebrowColorFemale032 34 | EyebrowColorFemale033 35 | EyebrowColorMale001 36 | EyebrowColorMale002 37 | EyebrowColorMale003 38 | EyebrowColorMale004 39 | EyebrowColorMale005 40 | EyebrowColorMale006 41 | EyebrowColorMale007 42 | EyebrowColorMale008 43 | EyebrowColorMale009 44 | EyebrowColorMale010 45 | EyebrowColorMale011 46 | EyebrowColorMale012 47 | EyebrowColorMale013 48 | EyebrowColorMale014 49 | EyebrowColorMale015 50 | EyebrowColorMale016 51 | EyebrowColorMale017 52 | EyebrowColorMale018 53 | EyebrowColorMale019 54 | EyebrowColorMale020 55 | EyebrowColorMale021 56 | EyebrowColorMale022 57 | EyebrowColorMale023 58 | EyebrowColorMale024 59 | EyebrowColorMale025 60 | EyebrowColorMale026 61 | EyebrowColorMale027 62 | EyebrowColorMale028 63 | EyebrowColorMale029 64 | EyebrowColorMale030 65 | EyebrowColorMale031 66 | EyebrowColorMale032 67 | EyebrowColorMale033 68 | 69 | EYEBROWSHAPE 70 | EyebrowFemale001 71 | EyebrowFemale002 72 | EyebrowFemale003 73 | EyebrowFemale004 74 | EyebrowFemale005 75 | EyebrowFemale006 76 | EyebrowFemale007 77 | EyebrowFemale008 78 | EyebrowFemale009 79 | EyebrowFemale010 80 | EyebrowFemale011 81 | EyebrowFemale012 82 | EyebrowFemale013 83 | EyebrowFemale014 84 | EyebrowFemale015 85 | EyebrowFemale016 86 | EyebrowFemale017 87 | EyebrowFemale018 88 | EyebrowFemale019 89 | EyebrowFemale020 90 | EyebrowMale001 91 | EyebrowMale002 92 | EyebrowMale003 93 | EyebrowMale004 94 | EyebrowMale005 95 | EyebrowMale006 96 | EyebrowMale007 97 | EyebrowMale008 98 | EyebrowMale009 99 | EyebrowMale010 100 | EyebrowMale011 101 | EyebrowMale012 102 | EyebrowMale013 103 | EyebrowMale014 104 | EyebrowMale015 105 | EyebrowMale016 106 | EyebrowMale017 107 | EyebrowMale018 108 | EyebrowMale019 109 | EyebrowMale020 110 | 111 | EYECOLOR 112 | EyeColorFemale001 113 | EyeColorFemale002 114 | EyeColorFemale003 115 | EyeColorFemale004 116 | EyeColorFemale005 117 | EyeColorFemale006 118 | EyeColorFemale007 119 | EyeColorFemale008 120 | EyeColorFemale009 121 | EyeColorFemale010 122 | EyeColorFemale011 123 | EyeColorFemale012 124 | EyeColorFemale013 125 | EyeColorFemale014 126 | EyeColorFemale015 127 | EyeColorFemale016 128 | EyeColorFemale017 129 | EyeColorFemale018 130 | EyeColorFemale019 131 | EyeColorFemale020 132 | EyeColorFemale021 133 | EyeColorFemale022 134 | EyeColorFemale023 135 | EyeColorFemale024 136 | EyeColorFemale025 137 | EyeColorMale001 138 | EyeColorMale002 139 | EyeColorMale003 140 | EyeColorMale004 141 | EyeColorMale005 142 | EyeColorMale006 143 | EyeColorMale007 144 | EyeColorMale008 145 | EyeColorMale009 146 | EyeColorMale010 147 | EyeColorMale011 148 | EyeColorMale012 149 | EyeColorMale013 150 | EyeColorMale014 151 | EyeColorMale015 152 | EyeColorMale016 153 | EyeColorMale017 154 | EyeColorMale018 155 | EyeColorMale019 156 | EyeColorMale020 157 | EyeColorMale021 158 | EyeColorMale022 159 | EyeColorMale023 160 | EyeColorMale024 161 | EyeColorMale025 162 | 163 | FACEMARKING0 164 | MarkingFemale000a 165 | MarkingFemale000b 166 | MarkingFemale000c 167 | MarkingFemale000d 168 | MarkingFemale000e 169 | MarkingFemale000f 170 | MarkingFemale000g 171 | MarkingFemale000h 172 | MarkingFemale000i 173 | MarkingFemale000j 174 | MarkingFemale000k 175 | MarkingFemale000l 176 | MarkingFemale000m 177 | MarkingMale000a 178 | MarkingMale000b 179 | MarkingMale000c 180 | MarkingMale000d 181 | MarkingMale000e 182 | MarkingMale000f 183 | MarkingMale000g 184 | MarkingMale000h 185 | MarkingMale000i 186 | MarkingMale000j 187 | MarkingMale000k 188 | MarkingMale000l 189 | MarkingMale000m 190 | 191 | FACEMARKING1 192 | MarkingFemale001a 193 | MarkingFemale001b 194 | MarkingFemale001c 195 | MarkingFemale001d 196 | MarkingFemale001e 197 | MarkingFemale001f 198 | MarkingFemale001g 199 | MarkingFemale001h 200 | MarkingFemale001i 201 | MarkingFemale001j 202 | MarkingFemale001k 203 | MarkingFemale001l 204 | MarkingFemale001m 205 | MarkingFemale001n 206 | MarkingFemale001o 207 | MarkingFemale001p 208 | MarkingMale001a 209 | MarkingMale001b 210 | MarkingMale001c 211 | MarkingMale001d 212 | MarkingMale001e 213 | MarkingMale001f 214 | MarkingMale001g 215 | MarkingMale001h 216 | MarkingMale001i 217 | MarkingMale001j 218 | MarkingMale001k 219 | MarkingMale001l 220 | MarkingMale001m 221 | MarkingMale001n 222 | MarkingMale001o 223 | MarkingMale001p 224 | 225 | FACEMARKING2 226 | MarkingFemale002a 227 | MarkingFemale002b 228 | MarkingFemale002c 229 | MarkingFemale002d 230 | MarkingFemale002e 231 | MarkingFemale002f 232 | MarkingFemale002g 233 | MarkingFemale002h 234 | MarkingFemale002i 235 | MarkingFemale002j 236 | MarkingFemale002k 237 | MarkingFemale002l 238 | MarkingFemale002m 239 | MarkingMale002a 240 | MarkingMale002b 241 | MarkingMale002c 242 | MarkingMale002d 243 | MarkingMale002e 244 | MarkingMale002f 245 | MarkingMale002g 246 | MarkingMale002h 247 | MarkingMale002i 248 | MarkingMale002j 249 | MarkingMale002k 250 | MarkingMale002l 251 | MarkingMale002m 252 | 253 | FACEMARKING3 254 | MarkingFemale003a 255 | MarkingFemale003b 256 | MarkingFemale003c 257 | MarkingFemale003d 258 | MarkingFemale003e 259 | MarkingMale003a 260 | MarkingMale003b 261 | MarkingMale003c 262 | MarkingMale003d 263 | MarkingMale003e 264 | 265 | HAIRCOLOR 266 | HairColorFemale001 267 | HairColorFemale002 268 | HairColorFemale003 269 | HairColorFemale004 270 | HairColorFemale005 271 | HairColorFemale006 272 | HairColorFemale007 273 | HairColorFemale008 274 | HairColorFemale009 275 | HairColorFemale010 276 | HairColorFemale011 277 | HairColorFemale012 278 | HairColorFemale013 279 | HairColorFemale014 280 | HairColorFemale015 281 | HairColorFemale016 282 | HairColorFemale017 283 | HairColorFemale018 284 | HairColorFemale019 285 | HairColorFemale020 286 | HairColorFemale021 287 | HairColorFemale022 288 | HairColorFemale023 289 | HairColorFemale024 290 | HairColorFemale025 291 | HairColorFemale026 292 | HairColorFemale027 293 | HairColorFemale028 294 | HairColorFemale029 295 | HairColorFemale030 296 | HairColorFemale031 297 | HairColorFemale032 298 | HairColorFemale033 299 | HairColorMale001 300 | HairColorMale002 301 | HairColorMale003 302 | HairColorMale004 303 | HairColorMale005 304 | HairColorMale006 305 | HairColorMale007 306 | HairColorMale008 307 | HairColorMale009 308 | HairColorMale010 309 | HairColorMale011 310 | HairColorMale012 311 | HairColorMale013 312 | HairColorMale014 313 | HairColorMale015 314 | HairColorMale016 315 | HairColorMale017 316 | HairColorMale018 317 | HairColorMale019 318 | HairColorMale020 319 | HairColorMale021 320 | HairColorMale022 321 | HairColorMale023 322 | HairColorMale024 323 | HairColorMale025 324 | HairColorMale026 325 | HairColorMale027 326 | HairColorMale028 327 | HairColorMale029 328 | HairColorMale030 329 | HairColorMale031 330 | HairColorMale032 331 | HairColorMale033 332 | 333 | HAIRSTYLE 334 | HairFemale001 335 | HairFemale002 336 | HairFemale003 337 | HairFemale004 338 | HairFemale005 339 | HairFemale006 340 | HairFemale007 341 | HairFemale008 342 | HairFemale009 343 | HairFemale010 344 | HairFemale011 345 | HairFemale012 346 | HairFemale013 347 | HairFemale014 348 | HairFemale015 349 | HairFemale016 350 | HairFemale017 351 | HairFemale018 352 | HairFemale019 353 | HairFemale020 354 | HairFemale021 355 | HairFemale022 356 | HairFemale023 357 | HairFemale024 358 | HairFemale025 359 | HairFemale026 360 | HairFemale027 361 | HairFemale028 362 | HairFemale029 363 | HairFemale030 364 | HairFemale031 365 | HairFemale032 366 | HairFemale033 367 | HairFemale034 368 | HairFemale035 369 | HairFemale036 370 | HairFemale037 371 | HairFemale038 372 | HairFemale039 373 | HairFemale040 374 | HairFemale041 375 | HairFemale042 376 | HairFemale043 377 | HairFemale044 378 | HairFemale045 379 | HairFemale046 380 | HairFemale047 381 | HairFemale048 382 | HairFemale049 383 | HairFemale050 384 | HairFemale051 385 | HairFemale052 386 | HairMale001 387 | HairMale002 388 | HairMale003 389 | HairMale004 390 | HairMale005 391 | HairMale006 392 | HairMale007 393 | HairMale008 394 | HairMale009 395 | HairMale010 396 | HairMale011 397 | HairMale012 398 | HairMale013 399 | HairMale014 400 | HairMale015 401 | HairMale016 402 | HairMale017 403 | HairMale018 404 | HairMale019 405 | HairMale020 406 | HairMale021 407 | HairMale022 408 | HairMale023 409 | HairMale024 410 | HairMale025 411 | HairMale026 412 | HairMale027 413 | HairMale028 414 | HairMale029 415 | HairMale030 416 | HairMale031 417 | HairMale032 418 | HairMale033 419 | HairMale034 420 | HairMale035 421 | HairMale036 422 | HairMale037 423 | HairMale038 424 | HairMale039 425 | HairMale040 426 | HairMale041 427 | HairMale042 428 | HairMale043 429 | HairMale044 430 | HairMale045 431 | HairMale046 432 | HairMale047 433 | HairMale048 434 | HairMale049 435 | HairMale050 436 | HairMale051 437 | HairMale052 438 | 439 | HEADSTYLE 440 | FaceFemale001 441 | FaceFemale002 442 | FaceFemale003 443 | FaceFemale004 444 | FaceFemale005 445 | FaceFemale006 446 | FaceFemale007 447 | FaceFemale008 448 | FaceFemale009 449 | FaceFemale010 450 | FaceFemale011 451 | FaceFemale012 452 | FaceFemale013 453 | FaceFemale014 454 | FaceFemale015 455 | FaceMale001 456 | FaceMale002 457 | FaceMale003 458 | FaceMale004 459 | FaceMale005 460 | FaceMale006 461 | FaceMale007 462 | FaceMale008 463 | FaceMale009 464 | FaceMale010 465 | FaceMale011 466 | FaceMale012 467 | FaceMale013 468 | FaceMale014 469 | FaceMale015 470 | 471 | MAKEUP_BLUSH 472 | MakeupBlushFemaleColor001 473 | MakeupBlushFemaleColor002 474 | MakeupBlushFemaleColor003 475 | MakeupBlushFemaleColor004 476 | MakeupBlushFemaleColor005 477 | MakeupBlushFemaleColor006 478 | MakeupBlushFemaleColor007 479 | MakeupBlushFemaleColor008 480 | MakeupBlushFemaleColor009 481 | MakeupBlushFemaleColor010 482 | MakeupBlushMaleColor001 483 | MakeupBlushMaleColor002 484 | MakeupBlushMaleColor003 485 | MakeupBlushMaleColor004 486 | MakeupBlushMaleColor005 487 | MakeupBlushMaleColor006 488 | MakeupBlushMaleColor007 489 | MakeupBlushMaleColor008 490 | MakeupBlushMaleColor009 491 | MakeupBlushMaleColor010 492 | 493 | MAKEUP_EYELINER 494 | MakeupEyeLinerFemaleColor001 495 | MakeupEyeLinerFemaleColor002 496 | MakeupEyeLinerFemaleColor003 497 | MakeupEyeLinerFemaleColor004 498 | MakeupEyeLinerFemaleColor005 499 | MakeupEyeLinerFemaleColor006 500 | MakeupEyeLinerFemaleColor007 501 | MakeupEyeLinerFemaleColor008 502 | MakeupEyeLinerFemaleColor009 503 | MakeupEyeLinerFemaleColor010 504 | MakeupEyeLinerMaleColor001 505 | MakeupEyeLinerMaleColor002 506 | MakeupEyeLinerMaleColor003 507 | MakeupEyeLinerMaleColor004 508 | MakeupEyeLinerMaleColor005 509 | MakeupEyeLinerMaleColor006 510 | MakeupEyeLinerMaleColor007 511 | MakeupEyeLinerMaleColor008 512 | MakeupEyeLinerMaleColor009 513 | MakeupEyeLinerMaleColor010 514 | 515 | MAKEUP_EYESHADOW 516 | MakeupEyeShadowFemaleColor001 517 | MakeupEyeShadowFemaleColor002 518 | MakeupEyeShadowFemaleColor003 519 | MakeupEyeShadowFemaleColor004 520 | MakeupEyeShadowFemaleColor005 521 | MakeupEyeShadowFemaleColor006 522 | MakeupEyeShadowFemaleColor007 523 | MakeupEyeShadowFemaleColor008 524 | MakeupEyeShadowFemaleColor009 525 | MakeupEyeShadowFemaleColor010 526 | MakeupEyeShadowMaleColor001 527 | MakeupEyeShadowMaleColor002 528 | MakeupEyeShadowMaleColor003 529 | MakeupEyeShadowMaleColor004 530 | MakeupEyeShadowMaleColor005 531 | MakeupEyeShadowMaleColor006 532 | MakeupEyeShadowMaleColor007 533 | MakeupEyeShadowMaleColor008 534 | MakeupEyeShadowMaleColor009 535 | MakeupEyeShadowMaleColor010 536 | 537 | MAKEUP_LIP 538 | MakeupLipFemaleColor001 539 | MakeupLipFemaleColor002 540 | MakeupLipFemaleColor003 541 | MakeupLipFemaleColor004 542 | MakeupLipFemaleColor005 543 | MakeupLipFemaleColor006 544 | MakeupLipFemaleColor007 545 | MakeupLipFemaleColor008 546 | MakeupLipFemaleColor009 547 | MakeupLipFemaleColor010 548 | MakeupLipMaleColor001 549 | MakeupLipMaleColor002 550 | MakeupLipMaleColor003 551 | MakeupLipMaleColor004 552 | MakeupLipMaleColor005 553 | MakeupLipMaleColor006 554 | MakeupLipMaleColor007 555 | MakeupLipMaleColor008 556 | MakeupLipMaleColor009 557 | MakeupLipMaleColor010 558 | 559 | SKINCOLOR 560 | CA_Dark 561 | SkinColorFemale001 562 | SkinColorFemale002 563 | SkinColorFemale003 564 | SkinColorFemale004 565 | SkinColorFemale005 566 | SkinColorFemale006 567 | SkinColorFemale007 568 | SkinColorFemale008 569 | SkinColorFemale009 570 | SkinColorFemale010 571 | SkinColorFemale011 572 | SkinColorFemale012 573 | SkinColorFemale013 574 | SkinColorFemale014 575 | SkinColorFemale015 576 | SkinColorFemale016 577 | SkinColorFemale017 578 | SkinColorFemale018 579 | SkinColorFemale019 580 | SkinColorFemale020 581 | SkinColorMale001 582 | SkinColorMale002 583 | SkinColorMale003 584 | SkinColorMale004 585 | SkinColorMale005 586 | SkinColorMale006 587 | SkinColorMale007 588 | SkinColorMale008 589 | SkinColorMale009 590 | SkinColorMale010 591 | SkinColorMale011 592 | SkinColorMale012 593 | SkinColorMale013 594 | SkinColorMale014 595 | SkinColorMale015 596 | SkinColorMale015 597 | SkinColorMale017 598 | SkinColorMale018 599 | SkinColorMale019 600 | SkinColorMale020 --------------------------------------------------------------------------------