├── README.md ├── main.go └── src └── bot ├── client └── cookies.go ├── log ├── color.go └── log.go ├── stores └── ambush │ ├── ambush.go │ ├── start.go │ ├── task.go │ └── webhooks.go ├── tasks ├── config.go ├── csv.go ├── proxies.go └── sizes.go ├── utils ├── cookies.go ├── countries.go ├── form.go ├── profiles.go ├── states.go └── utils.go └── webhooks └── webhooks.go /README.md: -------------------------------------------------------------------------------- 1 | # AmbushOpenSource 2 | 3 | https://pastebin.com/Jb0YC3n4 4 | 5 | go get github.com/fatih/color
6 | go get github.com/jszwec/csvutil
7 | go get github.com/mcnijman/go-emailaddress
8 | go get github.com/Pallinder/go-randomdata
9 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bot/log" 5 | "bot/stores/ambush" 6 | "bot/tasks" 7 | "fmt" 8 | "os" 9 | "sync" 10 | ) 11 | 12 | var ( 13 | format = fmt.Sprintf 14 | ) 15 | 16 | func main() { 17 | 18 | log.Infoln(format("TraianBOT"), "-") 19 | log.Infoln(format("Welcome user.."), "-") 20 | 21 | config, err := tasks.ReadConfig() 22 | 23 | if err != nil { 24 | log.Error("Error reading config file", "-") 25 | os.Exit(0) 26 | } 27 | 28 | proxies, err := tasks.ReadProxies() 29 | 30 | if err != nil { 31 | log.Error("Error reading proxies file", "-") 32 | os.Exit(0) 33 | } 34 | 35 | rows, err := tasks.ReadFile("tasks.csv") 36 | 37 | if err != nil { 38 | fmt.Println(err) 39 | log.Error("Error reading tasks file", "-") 40 | os.Exit(0) 41 | } 42 | 43 | if len(rows) > 500 { 44 | log.Error("Max 500 tasks", "-") 45 | os.Exit(0) 46 | } 47 | 48 | wg := sync.WaitGroup{} 49 | 50 | for id, row := range rows { 51 | wg.Add(1) 52 | go ambush.Start(row, config, proxies, id, &wg) 53 | } 54 | 55 | wg.Wait() 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/bot/client/cookies.go: -------------------------------------------------------------------------------- 1 | package client 2 | 3 | import ( 4 | "net/http" 5 | "net/http/cookiejar" 6 | "net/url" 7 | "sync" 8 | ) 9 | 10 | type ExportableCookieJar struct { 11 | jar *cookiejar.Jar 12 | allCookies map[url.URL][]*http.Cookie 13 | sync.RWMutex 14 | } 15 | 16 | func NewExportableCookieJar() *ExportableCookieJar { 17 | realJar, _ := cookiejar.New(nil) 18 | 19 | e := &ExportableCookieJar{ 20 | jar: realJar, 21 | allCookies: make(map[url.URL][]*http.Cookie), 22 | } 23 | 24 | return e 25 | } 26 | 27 | func (jar *ExportableCookieJar) SetCookies(u *url.URL, cookies []*http.Cookie) { 28 | jar.Lock() 29 | defer jar.Unlock() 30 | jar.allCookies[*u] = cookies 31 | jar.jar.SetCookies(u, cookies) 32 | } 33 | 34 | func (jar *ExportableCookieJar) Cookies(u *url.URL) []*http.Cookie { 35 | return jar.jar.Cookies(u) 36 | } 37 | 38 | func (jar *ExportableCookieJar) ExportAllCookies() map[url.URL][]*http.Cookie { 39 | jar.RLock() 40 | defer jar.RUnlock() 41 | 42 | copied := make(map[url.URL][]*http.Cookie) 43 | 44 | for u, c := range jar.allCookies { 45 | copied[u] = c 46 | } 47 | 48 | return copied 49 | } 50 | -------------------------------------------------------------------------------- /src/bot/log/color.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "github.com/fatih/color" 5 | ) 6 | 7 | var ( 8 | whiteColor = color.WhiteString 9 | 10 | DebugColor = color.CyanString 11 | InfoColor = color.GreenString 12 | WarningColor = color.YellowString 13 | ErrorColor = color.RedString 14 | ) 15 | -------------------------------------------------------------------------------- /src/bot/log/log.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "fmt" 5 | "github.com/fatih/color" 6 | "sync" 7 | "time" 8 | ) 9 | 10 | var ( 11 | lock = sync.Mutex{} 12 | ) 13 | 14 | func Print(s string) { 15 | lock.Lock() 16 | defer lock.Unlock() 17 | 18 | fmt.Fprint(color.Output, s) 19 | } 20 | 21 | func format(s, l, t string, c func(string, ...interface{}) string) string { 22 | f := c("[%v] [%v] %v", l, t, s) 23 | return fmt.Sprintf("[%v] %v", whiteColor(time.Now().Format("15:04:05.000")), f) 24 | } 25 | 26 | func formatln(s, l, t string, c func(string, ...interface{}) string) string { 27 | f := c("[%v] [%v] %v\n", l, t, s) 28 | return fmt.Sprintf("[%v] %v", whiteColor(time.Now().Format("15:04:05.000")), f) 29 | } 30 | 31 | func Debug(s, t string) { 32 | s = format(s, "DBG", t, DebugColor) 33 | Print(s) 34 | } 35 | 36 | func Info(s, t string) { 37 | s = format(s, "INF", t, InfoColor) 38 | Print(s) 39 | } 40 | 41 | func Warning(s, t string) { 42 | s = format(s, "WRN", t, WarningColor) 43 | Print(s) 44 | } 45 | 46 | func Warn(s, t string) { 47 | s = format(s, "WRN", t, WarningColor) 48 | Print(s) 49 | } 50 | 51 | func Error(s, t string) { 52 | s = format(s, "ERR", t, ErrorColor) 53 | Print(s) 54 | } 55 | 56 | func Debugln(s, t string) { 57 | s = formatln(s, "DBG", t, DebugColor) 58 | Print(s) 59 | } 60 | 61 | func Infoln(s, t string) { 62 | s = formatln(s, "INF", t, InfoColor) 63 | Print(s) 64 | } 65 | 66 | func Warningln(s, t string) { 67 | s = formatln(s, "WRN", t, WarningColor) 68 | Print(s) 69 | } 70 | 71 | func Warnln(s, t string) { 72 | s = formatln(s, "WRN", t, WarningColor) 73 | Print(s) 74 | } 75 | 76 | func Errorln(s, t string) { 77 | s = formatln(s, "ERR", t, ErrorColor) 78 | Print(s) 79 | } 80 | -------------------------------------------------------------------------------- /src/bot/stores/ambush/ambush.go: -------------------------------------------------------------------------------- 1 | package ambush 2 | 3 | import ( 4 | "bytes" 5 | "encoding/json" 6 | "fmt" 7 | "io/ioutil" 8 | "math/rand" 9 | "net/http" 10 | "strconv" 11 | "strings" 12 | 13 | "bot/utils" 14 | ) 15 | 16 | type apiUsersMeResponse struct { 17 | BagID string `json:"bagId"` 18 | } 19 | 20 | type apiCommerceV1Products struct { 21 | BreadCrumbs []struct { 22 | Text string `json:"text"` 23 | Link string `json:"link"` 24 | } `json:"breadCrumbs"` 25 | ImageGroups []struct { 26 | Images []struct { 27 | URL string `json:"url"` 28 | } `json:"images"` 29 | } `json:"imageGroups"` 30 | Sizes []struct { 31 | SizeID string `json:"sizeId"` 32 | SizeDescription string `json:"sizeDescription"` 33 | Scale string `json:"scale"` 34 | Variants []struct { 35 | MerchantID int `json:"merchantId"` 36 | FormattedPrice string `json:"formattedPrice"` 37 | } `json:"variants"` 38 | } `json:"sizes"` 39 | } 40 | 41 | type apiCommerceV1BagsPayload struct { 42 | MerchantID int `json:"merchantId"` 43 | ProductID string `json:"productId"` 44 | Quantity int `json:"quantity"` 45 | Scale string `json:"scale"` 46 | Size string `json:"size"` 47 | CustomAttributes string `json:"customAttributes"` 48 | } 49 | 50 | type apiCommerceV1BagsResponse struct { 51 | BagSummary struct { 52 | GrandTotal float64 `json:"grandTotal"` 53 | } `json:"BagSummary"` 54 | } 55 | 56 | type apiCheckoutV1OrdersPayload struct { 57 | BagID string `json:"bagId"` 58 | GuestUserEmail string `json:"guestUserEmail"` 59 | UsePaymentIntent bool `json:"usePaymentIntent"` 60 | } 61 | 62 | type apiCheckoutV1OrdersResponse struct { 63 | ID int `json:"id"` 64 | } 65 | 66 | type apiCheckoutV1OrdersResponse2 struct { 67 | CheckoutOrder struct { 68 | GrandTotal float64 `json:"grandTotal"` 69 | PaymentIntentID string `json:"paymentIntentId"` 70 | } 71 | ShippingOptions []struct { 72 | Price float64 `json:"price"` 73 | FormattedPrice string `json:"formattedPrice"` 74 | ShippingCostType int `json:"shippingCostType"` 75 | ShippingService struct { 76 | Description string `json:"description"` 77 | ID int `json:"id"` 78 | Name string `json:"name"` 79 | Type string `json:"type"` 80 | MinEstimatedDeliveryHour float64 `json:"minEstimatedDeliveryHour"` 81 | MaxEstimatedDeliveryHour float64 `json:"maxEstimatedDeliveryHour"` 82 | } `json:"shippingService"` 83 | } `json:"shippingOptions"` 84 | } 85 | 86 | type apiCheckoutV1OrderChargesResponse struct { 87 | RedirectURL string `json:"redirectUrl"` 88 | } 89 | 90 | func (t *Task) Start() { 91 | var err error 92 | 93 | if err = utils.CheckProfile(t.Email, t.FirstName, t.LastName, t.PhoneNumber, t.Address1, t.City, t.Postcode, t.Country); err != nil { 94 | t.HandleError(err) 95 | return 96 | } 97 | 98 | t.Email, t.FirstName, t.LastName, t.PhoneNumber, t.Address1 = utils.WrapProfile(t.Email, t.FirstName, t.LastName, t.PhoneNumber, t.Address1) 99 | 100 | t.Client, err = t.NewClient() 101 | 102 | if t.HandleError(err) { 103 | return 104 | } 105 | 106 | t.SetupClient() 107 | 108 | t.CreateSession() 109 | } 110 | 111 | func (t *Task) CreateSession() { 112 | 113 | t.Warn("Creating session") 114 | 115 | for { 116 | 117 | u := "https://www.ambushdesign.com/en-it/api/users/me" 118 | 119 | req, err := http.NewRequest("GET", u, nil) 120 | 121 | if err != nil { 122 | t.Error("Error creating session - 0 - %v", err.Error()) 123 | continue 124 | } 125 | 126 | req.Header.Set("Cache-Control", "max-age=0") 127 | req.Header.Set("Upgrade-Insecure-Requests", "1") 128 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 129 | req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") 130 | req.Header.Set("Sec-Fetch-Site", "none") 131 | req.Header.Set("Sec-Fetch-Mode", "navigate") 132 | req.Header.Set("Sec-Fetch-User", "?1") 133 | req.Header.Set("Sec-Fetch-Dest", "document") 134 | req.Header.Set("Accept-Language", "en-US,en-GB;q=0.9,en;q=0.8,it;q=0.7") 135 | 136 | resp, err := t.Client.Do(req) 137 | 138 | if err != nil { 139 | t.Error("Error creating session - 1 - %v", err.Error()) 140 | t.Rotate() 141 | continue 142 | } 143 | 144 | b, err := ioutil.ReadAll(resp.Body) 145 | resp.Body.Close() 146 | 147 | if err != nil { 148 | t.Error("Error creating session - 2 - %v", err.Error()) 149 | t.Sleep() 150 | continue 151 | } 152 | 153 | switch resp.StatusCode { 154 | case 200: 155 | body := new(apiUsersMeResponse) 156 | 157 | if err := json.Unmarshal(b, &body); err != nil { 158 | t.Error("Error creating session - 3 - %v", err.Error()) 159 | t.SleepAndRotate() 160 | continue 161 | } 162 | 163 | t.BagID = body.BagID 164 | 165 | t.CheckStock() 166 | return 167 | 168 | case 400: 169 | t.Error("Error creating session - Site error [%v]", resp.StatusCode) 170 | t.Sleep() 171 | continue 172 | case 403: 173 | t.Error("Error creating session - Access Denied [%v]", resp.StatusCode) 174 | t.SleepAndRotate() 175 | continue 176 | case 429: 177 | t.Error("Error creating session - Rate limited [%v]", resp.StatusCode) 178 | t.SleepAndRotate() 179 | continue 180 | case 500, 501, 502, 503: 181 | t.Error("Error creating session - Site error [%v]", resp.StatusCode) 182 | t.Sleep() 183 | continue 184 | default: 185 | t.Error("Error creating session - Unhandled error [%v]", resp.StatusCode) 186 | t.SleepAndRotate() 187 | continue 188 | } 189 | } 190 | } 191 | 192 | func (t *Task) CheckStock() { 193 | 194 | t.Warn("Checking stock") 195 | 196 | for { 197 | 198 | u := fmt.Sprintf("https://www.ambushdesign.com/api/commerce/v1/products/%v", t.SKU) 199 | 200 | req, err := http.NewRequest("GET", u, nil) 201 | 202 | if err != nil { 203 | t.Error("Error checking stock - 0 - %v", err.Error()) 204 | continue 205 | } 206 | 207 | req.Header.Set("Accept", "application/json, text/plain, */*") 208 | req.Header.Set("Accept-Encoding", "deflate, br") 209 | req.Header.Set("Accept-Language", "en-US") 210 | req.Header.Set("Cache-Control", "no-cache") 211 | req.Header.Set("FF-Country", t.Country) 212 | req.Header.Set("FF-Currency", t.Currency) 213 | req.Header.Set("Pragma", "no-cache") 214 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 215 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 216 | req.Header.Set("X-Newrelic-ID", "VQUCV1ZUGwIFVlBRDgcA") 217 | 218 | resp, err := t.Client.Do(req) 219 | 220 | if err != nil { 221 | t.Error("Error checking stock - 1 - %v", err.Error()) 222 | t.Rotate() 223 | continue 224 | } 225 | 226 | b, err := ioutil.ReadAll(resp.Body) 227 | resp.Body.Close() 228 | 229 | if err != nil { 230 | t.Error("Error checking stock - 2 - %v", err.Error()) 231 | t.Sleep() 232 | continue 233 | } 234 | 235 | switch resp.StatusCode { 236 | case 200: 237 | body := new(apiCommerceV1Products) 238 | 239 | if err := json.Unmarshal(b, &body); err != nil { 240 | t.Error("Error checking stock - 3 - %v", err.Error()) 241 | t.SleepAndRotate() 242 | continue 243 | } 244 | 245 | for _, product := range body.BreadCrumbs { 246 | if product.Link == "" { 247 | t.ProductName = product.Text 248 | break 249 | } 250 | } 251 | 252 | if len(body.ImageGroups) > 0 { 253 | if len(body.ImageGroups[0].Images) > 0 { 254 | t.ProductImage = body.ImageGroups[0].Images[0].URL 255 | } 256 | } 257 | 258 | sizes := make([]map[string]string, 0) 259 | 260 | for _, size := range body.Sizes { 261 | if len(size.Variants) > 0 { 262 | t.ProductPrice = size.Variants[0].FormattedPrice 263 | t.MerchantID = size.Variants[0].MerchantID 264 | } 265 | 266 | sizes = append(sizes, map[string]string{ 267 | "size": size.SizeDescription, 268 | "sizeId": size.SizeID, 269 | "scale": size.Scale, 270 | }) 271 | } 272 | 273 | if len(sizes) == 0 { 274 | t.Warn("Waiting for restock") 275 | t.Sleep() 276 | continue 277 | } 278 | 279 | size := sizes[rand.Intn(len(sizes))] 280 | 281 | t.ProductSize = size["size"] 282 | t.ProductVariant = size["sizeId"] 283 | 284 | t.Scale = size["scale"] 285 | 286 | t.Info("Stock found - %v - %v - %v", t.ProductName, t.ProductPrice, t.ProductSize) 287 | 288 | t.AddToCart() 289 | return 290 | 291 | case 400: 292 | t.Error("Error checking stock - Site error [%v]", resp.StatusCode) 293 | t.Sleep() 294 | continue 295 | case 403: 296 | t.Error("Error checking stock - Access Denied [%v]", resp.StatusCode) 297 | t.SleepAndRotate() 298 | continue 299 | case 429: 300 | t.Error("Error checking stock - Rate limited [%v]", resp.StatusCode) 301 | t.SleepAndRotate() 302 | continue 303 | case 500, 501, 502, 503: 304 | t.Error("Error checking stock - Site error [%v]", resp.StatusCode) 305 | t.Sleep() 306 | continue 307 | default: 308 | t.Error("Error checking stock - Unhandled error [%v]", resp.StatusCode) 309 | t.SleepAndRotate() 310 | continue 311 | } 312 | } 313 | } 314 | 315 | func (t *Task) AddToCart() { 316 | 317 | t.Warn("Carting %v", t.ProductName) 318 | 319 | for { 320 | 321 | u := fmt.Sprintf("https://www.ambushdesign.com/api/commerce/v1/bags/%v/items", t.BagID) 322 | 323 | p := apiCommerceV1BagsPayload{ 324 | MerchantID: t.MerchantID, 325 | ProductID: t.SKU, 326 | Quantity: 1, 327 | Scale: t.Scale, 328 | Size: t.ProductVariant, 329 | } 330 | 331 | payload, err := json.Marshal(&p) 332 | 333 | if err != nil { 334 | t.Error("Error adding to cart - 0 - %v", err.Error()) 335 | t.Sleep() 336 | continue 337 | } 338 | 339 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload)) 340 | 341 | if err != nil { 342 | t.Error("Error adding to cart - 1 - %v", err.Error()) 343 | continue 344 | } 345 | 346 | req.Header.Set("Accept", "application/json, text/plain, */*") 347 | req.Header.Set("FF-Country", t.Country) 348 | req.Header.Set("FF-Currency", t.Currency) 349 | req.Header.Set("Accept-Language", "en-US") 350 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 351 | req.Header.Set("Content-Type", "application/json") 352 | req.Header.Set("Origin", "https://www.ambushdesign.com") 353 | req.Header.Set("Sec-Fetch-Site", "same-origin") 354 | req.Header.Set("Sec-Fetch-Mode", "cors") 355 | req.Header.Set("Sec-Fetch-Dest", "empty") 356 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 357 | 358 | resp, err := t.Client.Do(req) 359 | 360 | if err != nil { 361 | t.Error("Error adding to cart - 2 - %v", err.Error()) 362 | t.Rotate() 363 | continue 364 | } 365 | 366 | b, err := ioutil.ReadAll(resp.Body) 367 | resp.Body.Close() 368 | 369 | if err != nil { 370 | t.Error("Error adding to cart - 3 - %v", err.Error()) 371 | t.Sleep() 372 | continue 373 | } 374 | 375 | switch resp.StatusCode { 376 | case 200: 377 | body := new(apiCommerceV1BagsResponse) 378 | 379 | if err := json.Unmarshal(b, &body); err != nil { 380 | t.Error("Error adding to cart - 4 - %v", err.Error()) 381 | t.SleepAndRotate() 382 | continue 383 | } 384 | 385 | if body.BagSummary.GrandTotal > 0 { 386 | t.Info("%v added to cart", t.ProductName) 387 | t.SubmitGuest() 388 | return 389 | } else { 390 | t.Error("Product OOS") 391 | t.CheckStock() 392 | return 393 | } 394 | 395 | case 400: 396 | t.Error("Error adding to cart - Product OOS [%v]", resp.StatusCode) 397 | t.Sleep() 398 | continue 399 | case 403: 400 | t.Error("Error adding to cart - Access Denied [%v]", resp.StatusCode) 401 | t.SleepAndRotate() 402 | continue 403 | case 429: 404 | t.Error("Error adding to cart - Rate limited [%v]", resp.StatusCode) 405 | t.SleepAndRotate() 406 | continue 407 | case 500, 501, 502, 503: 408 | t.Error("Error adding to cart - Site error [%v]", resp.StatusCode) 409 | t.Sleep() 410 | continue 411 | default: 412 | t.Error("Error adding to cart - Unhandled error [%v]", resp.StatusCode) 413 | t.SleepAndRotate() 414 | continue 415 | } 416 | } 417 | } 418 | 419 | func (t *Task) SubmitGuest() { 420 | 421 | t.Warn("Submitting guest") 422 | 423 | for { 424 | 425 | u := "https://www.ambushdesign.com/api/checkout/v1/orders" 426 | 427 | p := apiCheckoutV1OrdersPayload{ 428 | BagID: t.BagID, 429 | GuestUserEmail: t.Email, 430 | UsePaymentIntent: true, 431 | } 432 | 433 | payload, err := json.Marshal(&p) 434 | 435 | if err != nil { 436 | t.Error("Error submitting guest - 0 - %v", err.Error()) 437 | t.Sleep() 438 | continue 439 | } 440 | 441 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload)) 442 | 443 | if err != nil { 444 | t.Error("Error submitting guest - 1 - %v", err.Error()) 445 | continue 446 | } 447 | 448 | req.Header.Set("Accept", "application/json, text/plain, */*") 449 | req.Header.Set("FF-Country", t.Country) 450 | req.Header.Set("FF-Currency", t.Currency) 451 | req.Header.Set("Accept-Language", "en-US") 452 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 453 | req.Header.Set("Content-Type", "application/json") 454 | req.Header.Set("Origin", "https://www.ambushdesign.com") 455 | req.Header.Set("Sec-Fetch-Site", "same-origin") 456 | req.Header.Set("Sec-Fetch-Mode", "cors") 457 | req.Header.Set("Sec-Fetch-Dest", "empty") 458 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 459 | 460 | resp, err := t.Client.Do(req) 461 | 462 | if err != nil { 463 | t.Error("Error submitting guest - 2 - %v", err.Error()) 464 | t.Rotate() 465 | continue 466 | } 467 | 468 | b, err := ioutil.ReadAll(resp.Body) 469 | resp.Body.Close() 470 | 471 | if err != nil { 472 | t.Error("Error submitting guest - 3 - %v", err.Error()) 473 | t.Sleep() 474 | continue 475 | } 476 | 477 | switch resp.StatusCode { 478 | case 201: 479 | body := new(apiCheckoutV1OrdersResponse) 480 | 481 | if err := json.Unmarshal(b, &body); err != nil { 482 | t.Error("Error submitting guest - 4 - %v", err.Error()) 483 | t.SleepAndRotate() 484 | continue 485 | } 486 | 487 | t.OrderID = body.ID 488 | t.SubmitShipping() 489 | return 490 | 491 | case 400: 492 | t.Error("Error submitting guest - Site error [%v]", resp.StatusCode) 493 | t.Sleep() 494 | continue 495 | case 403: 496 | t.Error("Error submitting guest - Access Denied [%v]", resp.StatusCode) 497 | t.SleepAndRotate() 498 | continue 499 | case 429: 500 | t.Error("Error submitting guest - Rate limited [%v]", resp.StatusCode) 501 | t.SleepAndRotate() 502 | continue 503 | case 500, 501, 502, 503: 504 | t.Error("Error submitting guest - Site error [%v]", resp.StatusCode) 505 | t.Sleep() 506 | continue 507 | default: 508 | t.Error("Error submitting guest - Unhandled error [%v]", resp.StatusCode) 509 | t.SleepAndRotate() 510 | continue 511 | } 512 | } 513 | } 514 | 515 | func (t *Task) SubmitShipping() { 516 | 517 | t.Warn("Setting shipping") 518 | 519 | for { 520 | 521 | u := fmt.Sprintf("https://www.ambushdesign.com/api/checkout/v1/orders/%v", t.OrderID) 522 | 523 | p := map[string]interface{}{ 524 | "shippingAddress": map[string]interface{}{ 525 | "firstName": t.FirstName, 526 | "lastName": t.LastName, 527 | "country": map[string]string{ 528 | "name": utils.GetFullCountry(t.Country), 529 | "id": t.CountryID, 530 | }, 531 | "addressLine1": t.Address1, 532 | "addressLine2": t.Address2, 533 | "addressLine3": "", 534 | "city": map[string]string{ 535 | "name": t.City, 536 | }, 537 | "state": map[string]string{ 538 | "name": t.State, 539 | }, 540 | "zipCode": t.Postcode, 541 | "phone": t.PhoneNumber, 542 | "vatNumber": "", 543 | }, 544 | "billingAddress": map[string]interface{}{ 545 | "firstName": t.FirstName, 546 | "lastName": t.LastName, 547 | "country": map[string]string{ 548 | "name": utils.GetFullCountry(t.Country), 549 | "id": t.CountryID, 550 | }, 551 | "addressLine1": t.Address1, 552 | "addressLine2": t.Address2, 553 | "addressLine3": "", 554 | "city": map[string]string{ 555 | "name": t.City, 556 | }, 557 | "state": map[string]string{ 558 | "name": t.State, 559 | }, 560 | "zipCode": t.Postcode, 561 | "phone": t.PhoneNumber, 562 | "vatNumber": "", 563 | }, 564 | } 565 | 566 | payload, err := json.Marshal(&p) 567 | 568 | if err != nil { 569 | t.Error("Error setting shipping - 0 - %v", err.Error()) 570 | t.Sleep() 571 | continue 572 | } 573 | 574 | req, err := http.NewRequest("PATCH", u, bytes.NewReader(payload)) 575 | 576 | if err != nil { 577 | t.Error("Error setting shipping - 1 - %v", err.Error()) 578 | continue 579 | } 580 | 581 | req.Header.Set("Accept", "application/json, text/plain, */*") 582 | req.Header.Set("FF-Country", t.Country) 583 | req.Header.Set("FF-Currency", t.Currency) 584 | req.Header.Set("Accept-Language", "en-US") 585 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 586 | req.Header.Set("Content-Type", "application/json") 587 | req.Header.Set("Origin", "https://www.ambushdesign.com") 588 | req.Header.Set("Sec-Fetch-Site", "same-origin") 589 | req.Header.Set("Sec-Fetch-Mode", "cors") 590 | req.Header.Set("Sec-Fetch-Dest", "empty") 591 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 592 | 593 | resp, err := t.Client.Do(req) 594 | 595 | if err != nil { 596 | t.Error("Error setting shipping - 2 - %v", err.Error()) 597 | t.Rotate() 598 | continue 599 | } 600 | 601 | b, err := ioutil.ReadAll(resp.Body) 602 | resp.Body.Close() 603 | 604 | if err != nil { 605 | t.Error("Error setting shipping - 3 - %v", err.Error()) 606 | t.Sleep() 607 | continue 608 | } 609 | 610 | switch resp.StatusCode { 611 | case 200: 612 | body := new(apiCheckoutV1OrdersResponse2) 613 | 614 | if err := json.Unmarshal(b, &body); err != nil { 615 | t.Error("Error setting shipping - 4 - %v", err.Error()) 616 | t.SleepAndRotate() 617 | continue 618 | } 619 | 620 | t.ShippingPrice = int(body.ShippingOptions[0].Price) 621 | t.ShippingFormattedPrice = body.ShippingOptions[0].FormattedPrice 622 | t.ShippingCostType = body.ShippingOptions[0].ShippingCostType 623 | t.ShippingDescription = body.ShippingOptions[0].ShippingService.Description 624 | t.ShippingID = body.ShippingOptions[0].ShippingService.ID 625 | t.ShippingName = body.ShippingOptions[0].ShippingService.Name 626 | t.ShippingType = body.ShippingOptions[0].ShippingService.Type 627 | t.MinEstimatedDeliveryHour = int(body.ShippingOptions[0].ShippingService.MinEstimatedDeliveryHour) 628 | t.MaxEstimatedDeliveryHour = int(body.ShippingOptions[0].ShippingService.MaxEstimatedDeliveryHour) 629 | t.GrandTotal = int(body.CheckoutOrder.GrandTotal) 630 | t.PaymentIntentID = body.CheckoutOrder.PaymentIntentID 631 | 632 | t.Info("Shipping set") 633 | t.SubmitDelivery() 634 | return 635 | 636 | case 400: 637 | t.Error("Error setting shipping - Site error [%v]", resp.StatusCode) 638 | t.Sleep() 639 | continue 640 | case 403: 641 | t.Error("Error setting shipping - Access Denied [%v]", resp.StatusCode) 642 | t.SleepAndRotate() 643 | continue 644 | case 429: 645 | t.Error("Error setting shipping - Rate limited [%v]", resp.StatusCode) 646 | t.SleepAndRotate() 647 | continue 648 | case 500, 501, 502, 503: 649 | t.Error("Error setting shipping - Site error [%v]", resp.StatusCode) 650 | t.Sleep() 651 | continue 652 | default: 653 | t.Error("Error setting shipping - Unhandled error [%v]", resp.StatusCode) 654 | t.SleepAndRotate() 655 | continue 656 | } 657 | } 658 | } 659 | 660 | func (t *Task) SubmitDelivery() { 661 | 662 | t.Warn("Setting delivery") 663 | 664 | for { 665 | 666 | u := fmt.Sprintf("https://www.ambushdesign.com/api/checkout/v1/orders/%v", t.OrderID) 667 | 668 | p := map[string]interface{}{ 669 | "shippingOption": map[string]interface{}{ 670 | "discount": 0, 671 | "merchants": []int{t.MerchantID}, 672 | "price": t.ShippingPrice, 673 | "formattedPrice": t.ShippingFormattedPrice, 674 | "shippingCostType": t.ShippingCostType, 675 | "shippingService": map[string]interface{}{ 676 | "description": t.ShippingDescription, 677 | "id": t.ShippingID, 678 | "name": t.ShippingName, 679 | "type": t.ShippingType, 680 | "minEstimatedDeliveryHour": t.MinEstimatedDeliveryHour, 681 | "maxEstimatedDeliveryHour": t.MaxEstimatedDeliveryHour, 682 | "trackingCodes": []string{}, 683 | }, 684 | "shippingWithoutCapped": 0, 685 | "baseFlatRate": 0, 686 | }, 687 | } 688 | 689 | payload, err := json.Marshal(&p) 690 | 691 | if err != nil { 692 | t.Error("Error setting delivery - 0 - %v", err.Error()) 693 | t.Sleep() 694 | continue 695 | } 696 | 697 | req, err := http.NewRequest("PATCH", u, bytes.NewReader(payload)) 698 | 699 | if err != nil { 700 | t.Error("Error setting delivery - 1 - %v", err.Error()) 701 | continue 702 | } 703 | 704 | req.Header.Set("Accept", "application/json, text/plain, */*") 705 | req.Header.Set("FF-Country", t.Country) 706 | req.Header.Set("FF-Currency", t.Currency) 707 | req.Header.Set("Accept-Language", "en-US") 708 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 709 | req.Header.Set("Content-Type", "application/json") 710 | req.Header.Set("Origin", "https://www.ambushdesign.com") 711 | req.Header.Set("Sec-Fetch-Site", "same-origin") 712 | req.Header.Set("Sec-Fetch-Mode", "cors") 713 | req.Header.Set("Sec-Fetch-Dest", "empty") 714 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 715 | 716 | resp, err := t.Client.Do(req) 717 | 718 | if err != nil { 719 | t.Error("Error setting delivery - 2 - %v", err.Error()) 720 | t.Rotate() 721 | continue 722 | } 723 | 724 | resp.Body.Close() 725 | 726 | switch resp.StatusCode { 727 | case 200: 728 | t.Info("Delivery set") 729 | t.SubmitPayment() 730 | return 731 | case 400: 732 | t.Error("Error setting delivery - Site error [%v]", resp.StatusCode) 733 | t.Sleep() 734 | continue 735 | case 403: 736 | t.Error("Error setting delivery - Access Denied [%v]", resp.StatusCode) 737 | t.SleepAndRotate() 738 | continue 739 | case 429: 740 | t.Error("Error setting delivery - Rate limited [%v]", resp.StatusCode) 741 | t.SleepAndRotate() 742 | continue 743 | case 500, 501, 502, 503: 744 | t.Error("Error setting delivery - Site error [%v]", resp.StatusCode) 745 | t.Sleep() 746 | continue 747 | default: 748 | t.Error("Error setting delivery - Unhandled error [%v]", resp.StatusCode) 749 | t.SleepAndRotate() 750 | continue 751 | } 752 | } 753 | } 754 | 755 | func (t *Task) SubmitPayment() { 756 | 757 | t.Warn("Setting payment") 758 | 759 | ctx := utils.GetCookie(&t.CookieJar, "ctx") 760 | t.CTX, _ = utils.Extract(ctx, "%3a", "%2c") 761 | i, _ := strconv.Atoi(t.CTX) 762 | 763 | for { 764 | 765 | u := fmt.Sprintf("https://www.ambushdesign.com/api/payment/v1/intents/%v/instruments", t.PaymentIntentID) 766 | 767 | p := map[string]interface{}{ 768 | "method": "PayPal", 769 | "option": "PayPalExp", 770 | "createToken": false, 771 | "payer": map[string]interface{}{ 772 | "id": i, 773 | "firstName": t.FirstName, 774 | "lastName": t.LastName, 775 | "email": t.Email, 776 | "birthDate": nil, 777 | "address": map[string]interface{}{ 778 | "city": map[string]interface{}{ 779 | "countryId": t.CountryID, 780 | "id": 0, 781 | "name": t.City, 782 | }, 783 | "country": map[string]interface{}{ 784 | "alpha2Code": t.Country, 785 | "alpha3Code": t.Country, 786 | "culture": "it-IT", 787 | "id": t.CountryID, 788 | "name": utils.GetFullCountry(t.Country), 789 | "nativeName": utils.GetFullCountry(t.Country), 790 | "region": "Europe", 791 | "regionId": 0, 792 | "continentId": 3, 793 | }, 794 | "id": "00000000-0000-0000-0000-000000000000", 795 | "lastName": t.LastName, 796 | "state": map[string]interface{}{ 797 | "countryId": 0, 798 | "id": 0, 799 | "code": t.State, 800 | "name": t.State, 801 | }, 802 | "userId": 0, 803 | "isDefaultBillingAddress": false, 804 | "isDefaultShippingAddress": false, 805 | "addressLine1": t.Address1, 806 | "addressLine2": t.Address2, 807 | "firstName": t.FirstName, 808 | "phone": t.PhoneNumber, 809 | "vatNumber": "", 810 | "zipCode": t.Postcode, 811 | }, 812 | }, 813 | "amounts": []map[string]interface{}{{ 814 | "value": t.GrandTotal, 815 | }}, 816 | "data": map[string]interface{}{}, 817 | } 818 | 819 | payload, err := json.Marshal(&p) 820 | 821 | if err != nil { 822 | t.Error("Error setting payment - 0 - %v", err.Error()) 823 | t.Sleep() 824 | continue 825 | } 826 | 827 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload)) 828 | 829 | if err != nil { 830 | t.Error("Error setting payment - 1 - %v", err.Error()) 831 | continue 832 | } 833 | 834 | req.Header.Set("Accept", "application/json, text/plain, */*") 835 | req.Header.Set("FF-Country", t.Country) 836 | req.Header.Set("FF-Currency", t.Currency) 837 | req.Header.Set("Accept-Language", "en-US") 838 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 839 | req.Header.Set("Content-Type", "application/json") 840 | req.Header.Set("Origin", "https://www.ambushdesign.com") 841 | req.Header.Set("Sec-Fetch-Site", "same-origin") 842 | req.Header.Set("Sec-Fetch-Mode", "cors") 843 | req.Header.Set("Sec-Fetch-Dest", "empty") 844 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 845 | 846 | resp, err := t.Client.Do(req) 847 | 848 | if err != nil { 849 | t.Error("Error setting payment - 2 - %v", err.Error()) 850 | t.Rotate() 851 | continue 852 | } 853 | 854 | resp.Body.Close() 855 | 856 | switch resp.StatusCode { 857 | case 201: 858 | t.Info("Payment set") 859 | t.CheckCharge() 860 | return 861 | case 400: 862 | t.Error("Error setting payment - Site error [%v]", resp.StatusCode) 863 | t.Sleep() 864 | continue 865 | case 403: 866 | t.Error("Error setting payment - Access Denied [%v]", resp.StatusCode) 867 | t.SleepAndRotate() 868 | continue 869 | case 429: 870 | t.Error("Error setting payment - Rate limited [%v]", resp.StatusCode) 871 | t.SleepAndRotate() 872 | continue 873 | case 500, 501, 502, 503: 874 | t.Error("Error setting payment - Site error [%v]", resp.StatusCode) 875 | t.Sleep() 876 | continue 877 | default: 878 | t.Error("Error setting payment - Unhandled error [%v]", resp.StatusCode) 879 | t.SleepAndRotate() 880 | continue 881 | } 882 | } 883 | } 884 | 885 | func (t *Task) CheckCharge() { 886 | 887 | t.Warn("Checking order") 888 | 889 | for { 890 | 891 | u := fmt.Sprintf("https://www.ambushdesign.com/api/checkout/v1/orders/%v/charges", t.OrderID) 892 | 893 | p := map[string]string{ 894 | "cancelUrl": "https://www.ambushdesign.com/en-it/commerce/checkout", 895 | "returnUrl": fmt.Sprintf("https://www.ambushdesign.com/en-it/checkoutdetails?orderid=%v", t.OrderID), 896 | } 897 | 898 | payload, err := json.Marshal(&p) 899 | 900 | if err != nil { 901 | t.Error("Error checking order - 0 - %v", err.Error()) 902 | t.Sleep() 903 | continue 904 | } 905 | 906 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload)) 907 | 908 | if err != nil { 909 | t.Error("Error checking order - 1 - %v", err.Error()) 910 | continue 911 | } 912 | 913 | req.Header.Set("Accept", "application/json, text/plain, */*") 914 | req.Header.Set("FF-Country", t.Country) 915 | req.Header.Set("FF-Currency", t.Currency) 916 | req.Header.Set("Accept-Language", "en-US") 917 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 918 | req.Header.Set("Content-Type", "application/json") 919 | req.Header.Set("Origin", "https://www.ambushdesign.com") 920 | req.Header.Set("Sec-Fetch-Site", "same-origin") 921 | req.Header.Set("Sec-Fetch-Mode", "cors") 922 | req.Header.Set("Sec-Fetch-Dest", "empty") 923 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 924 | 925 | resp, err := t.Client.Do(req) 926 | 927 | if err != nil { 928 | t.Error("Error checking order - 2 - %v", err.Error()) 929 | t.Rotate() 930 | continue 931 | } 932 | 933 | b, err := ioutil.ReadAll(resp.Body) 934 | resp.Body.Close() 935 | 936 | if err != nil { 937 | t.Error("Error checking order - 3 - %v", err.Error()) 938 | t.Sleep() 939 | continue 940 | } 941 | 942 | switch resp.StatusCode { 943 | case 201: 944 | 945 | text := string(b) 946 | 947 | if strings.Contains(text, "Error") { 948 | t.Error("Payment declined") 949 | t.FailedWebhook() 950 | return 951 | } else if strings.Contains(text, "Processing") { 952 | body := new(apiCheckoutV1OrderChargesResponse) 953 | 954 | if err := json.Unmarshal(b, &body); err != nil { 955 | t.Error("Error checking order - 4 - %v", err.Error()) 956 | t.Sleep() 957 | continue 958 | } 959 | 960 | t.RedirectURL = body.RedirectURL 961 | t.SubmitPayPal() 962 | return 963 | 964 | } else { 965 | t.Error("Error checking order - 5") 966 | t.SleepAndRotate() 967 | continue 968 | } 969 | 970 | case 400: 971 | t.Error("Error checking order - Site error [%v]", resp.StatusCode) 972 | t.Sleep() 973 | continue 974 | case 403: 975 | t.Error("Error checking order - Access Denied [%v]", resp.StatusCode) 976 | t.SleepAndRotate() 977 | continue 978 | case 429: 979 | t.Error("Error checking order - Rate limited [%v]", resp.StatusCode) 980 | t.SleepAndRotate() 981 | continue 982 | case 500, 501, 502, 503: 983 | t.Error("Error checking order - Site error [%v]", resp.StatusCode) 984 | t.Sleep() 985 | continue 986 | default: 987 | t.Error("Error checking order - Unhandled error [%v]", resp.StatusCode) 988 | t.SleepAndRotate() 989 | continue 990 | } 991 | } 992 | } 993 | 994 | func (t *Task) SubmitPayPal() { 995 | 996 | t.Warn("Submitting PayPal") 997 | 998 | for { 999 | 1000 | req, err := http.NewRequest("GET", t.RedirectURL, nil) 1001 | 1002 | if err != nil { 1003 | t.Error("Error submitting PayPal - 1 - %v", err.Error()) 1004 | continue 1005 | } 1006 | 1007 | req.Header.Set("Accept", "application/json, text/plain, */*") 1008 | req.Header.Set("FF-Country", t.Country) 1009 | req.Header.Set("FF-Currency", t.Currency) 1010 | req.Header.Set("Accept-Language", "en-US") 1011 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36") 1012 | req.Header.Set("Content-Type", "application/json") 1013 | req.Header.Set("Origin", "https://www.ambushdesign.com") 1014 | req.Header.Set("Sec-Fetch-Site", "same-origin") 1015 | req.Header.Set("Sec-Fetch-Mode", "cors") 1016 | req.Header.Set("Sec-Fetch-Dest", "empty") 1017 | req.Header.Set("Referer", "https://www.ambushdesign.com/") 1018 | 1019 | t.SetAllowRedirects(false) 1020 | 1021 | resp, err := t.Client.Do(req) 1022 | 1023 | if err != nil { 1024 | t.Error("Error submitting PayPal - 2 - %v", err.Error()) 1025 | t.Rotate() 1026 | continue 1027 | } 1028 | 1029 | switch resp.StatusCode { 1030 | case 302: 1031 | 1032 | if strings.Contains(resp.Header.Get("Location"), "paypal") { 1033 | 1034 | t.PayPalURL = resp.Header.Get("Location") 1035 | t.PaypalWebhook() 1036 | return 1037 | } 1038 | 1039 | return 1040 | case 400: 1041 | t.Error("Error submitting PayPal - Site error [%v]", resp.StatusCode) 1042 | t.Sleep() 1043 | continue 1044 | case 403: 1045 | t.Error("Error submitting PayPal - Access Denied [%v]", resp.StatusCode) 1046 | t.SleepAndRotate() 1047 | continue 1048 | case 429: 1049 | t.Error("Error submitting PayPal - Rate limited [%v]", resp.StatusCode) 1050 | t.SleepAndRotate() 1051 | continue 1052 | case 500, 501, 502, 503: 1053 | t.Error("Error submitting PayPal - Site error [%v]", resp.StatusCode) 1054 | t.Sleep() 1055 | continue 1056 | default: 1057 | t.Error("Error submitting PayPal - Unhandled error [%v]", resp.StatusCode) 1058 | t.SleepAndRotate() 1059 | continue 1060 | } 1061 | } 1062 | } 1063 | -------------------------------------------------------------------------------- /src/bot/stores/ambush/start.go: -------------------------------------------------------------------------------- 1 | package ambush 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | 7 | "bot/tasks" 8 | ) 9 | 10 | func Start(row tasks.Row, config tasks.Config, proxies []string, id int, wg *sync.WaitGroup) { 11 | defer wg.Done() 12 | 13 | task := &Task{ 14 | ID: fmt.Sprint(id), 15 | SKU: row.SKU, 16 | 17 | Email: row.Email, 18 | FirstName: row.FirstName, 19 | LastName: row.LastName, 20 | PhoneNumber: row.PhoneNumber, 21 | Address1: row.Address1, 22 | Address2: row.Address2, 23 | State: row.State, 24 | City: row.City, 25 | Postcode: row.Postcode, 26 | Country: row.Country, 27 | CountryID: row.CountryID, 28 | Currency: row.Currency, 29 | 30 | Delay: config.Delay, 31 | Timeout: config.Timeout, 32 | Webhook: config.Webhook, 33 | 34 | Proxies: proxies, 35 | } 36 | 37 | sizes, err := tasks.ParseSizes(row.Sizes) 38 | 39 | if err != nil { 40 | task.Error("Invalid sizes %v", row.Sizes) 41 | } 42 | 43 | task.Sizes = sizes 44 | 45 | task.Start() 46 | } 47 | -------------------------------------------------------------------------------- /src/bot/stores/ambush/task.go: -------------------------------------------------------------------------------- 1 | package ambush 2 | 3 | import ( 4 | "fmt" 5 | "math/rand" 6 | "net/http" 7 | "net/url" 8 | "time" 9 | 10 | "bot/client" 11 | "bot/log" 12 | ) 13 | 14 | type Task struct { 15 | ID string 16 | 17 | SKU string 18 | Sizes []string 19 | 20 | Email string 21 | FirstName string 22 | LastName string 23 | PhoneNumber string 24 | Address1 string 25 | Address2 string 26 | State string 27 | City string 28 | Postcode string 29 | Country string 30 | CountryID string 31 | Currency string 32 | 33 | Region string 34 | 35 | Delay int 36 | Timeout int 37 | Webhook string 38 | 39 | Proxies []string 40 | 41 | Client *http.Client 42 | CookieJar client.ExportableCookieJar 43 | 44 | BagID string 45 | MerchantID int 46 | Scale string 47 | OrderID int 48 | ShippingPrice int 49 | ShippingFormattedPrice string 50 | ShippingCostType int 51 | ShippingDescription string 52 | ShippingID int 53 | ShippingName string 54 | ShippingType string 55 | MinEstimatedDeliveryHour int 56 | MaxEstimatedDeliveryHour int 57 | GrandTotal int 58 | CTX string 59 | PaymentIntentID string 60 | RedirectURL string 61 | PayPalURL string 62 | CheckoutURL string 63 | 64 | ProductName string 65 | ProductImage string 66 | ProductPrice string 67 | ProductSize string 68 | ProductVariant string 69 | } 70 | 71 | func (t *Task) Debug(format string, a ...interface{}) { 72 | s := fmt.Sprintf(format, a...) 73 | log.Debugln(s, t.ID) 74 | } 75 | 76 | func (t *Task) Info(format string, a ...interface{}) { 77 | s := fmt.Sprintf(format, a...) 78 | log.Infoln(s, t.ID) 79 | } 80 | 81 | func (t *Task) Warn(format string, a ...interface{}) { 82 | s := fmt.Sprintf(format, a...) 83 | log.Warningln(s, t.ID) 84 | } 85 | 86 | func (t *Task) Error(format string, a ...interface{}) { 87 | s := fmt.Sprintf(format, a...) 88 | log.Errorln(s, t.ID) 89 | } 90 | 91 | func (t *Task) HandleError(err error) bool { 92 | if err != nil { 93 | t.Error(err.Error()) 94 | return true 95 | } 96 | return false 97 | } 98 | 99 | func (t *Task) Sleep() { 100 | time.Sleep(time.Millisecond * time.Duration(t.Delay)) 101 | } 102 | 103 | func (t *Task) NewClient() (*http.Client, error) { 104 | return &http.Client{}, nil 105 | } 106 | 107 | func (t *Task) SetupClient() { 108 | jar := client.NewExportableCookieJar() 109 | t.Client.Jar = jar 110 | t.CookieJar = *jar 111 | 112 | t.Client.Timeout = time.Millisecond * time.Duration(t.Timeout) 113 | 114 | t.Rotate() 115 | } 116 | 117 | func newRoundTripper(u string) (*http.Transport, error) { 118 | proxyURL, err := url.Parse(u) 119 | 120 | if err != nil { 121 | return nil, err 122 | } 123 | 124 | return &http.Transport{Proxy: http.ProxyURL(proxyURL)}, nil 125 | } 126 | 127 | func (t *Task) Rotate() { 128 | var roundTripper http.RoundTripper 129 | var err error 130 | 131 | if len(t.Proxies) > 0 { 132 | proxyURL := t.Proxies[rand.Intn(len(t.Proxies))] 133 | roundTripper, err = newRoundTripper(proxyURL) 134 | if err != nil { 135 | t.Error(err.Error()) 136 | return 137 | } 138 | } else { 139 | roundTripper = &http.Transport{} 140 | } 141 | 142 | t.Client.Transport = roundTripper 143 | } 144 | 145 | func (task *Task) SetAllowRedirects(allow bool) { 146 | if allow { 147 | task.Client.CheckRedirect = func(req *http.Request, via []*http.Request) error { 148 | return nil 149 | } 150 | } else { 151 | task.Client.CheckRedirect = func(req *http.Request, via []*http.Request) error { 152 | return http.ErrUseLastResponse 153 | } 154 | } 155 | } 156 | 157 | func (t *Task) SleepAndRotate() { 158 | t.Sleep() 159 | t.Rotate() 160 | } 161 | -------------------------------------------------------------------------------- /src/bot/stores/ambush/webhooks.go: -------------------------------------------------------------------------------- 1 | package ambush 2 | 3 | import ( 4 | "bot/webhooks" 5 | "fmt" 6 | "time" 7 | ) 8 | 9 | func (t *Task) FailedWebhook() { 10 | w := webhooks.Webhook{} 11 | e := webhooks.Embed{} 12 | 13 | e.SetTitle("Checkout failed :disappointed:") 14 | e.SetColor(0xed1c24) 15 | e.SetThumbnail(t.ProductImage) 16 | e.SetFooter(fmt.Sprintf("TraianBot - [%v]", time.Now().Format("2006-02-01 15:04:05.999999")), "https://i.pinimg.com/564x/17/6b/90/176b90a7cf4ca43e88de32369d053dab.jpg") 17 | 18 | e.AddField("Store", "Ambush", false) 19 | e.AddField("PID", t.SKU, true) 20 | e.AddField("Size", t.ProductSize, true) 21 | e.AddField("Email", fmt.Sprintf("||%v||", t.Email), true) 22 | 23 | w.AddEmbed(e) 24 | 25 | err := w.Send(t.Webhook) 26 | 27 | if err != nil { 28 | t.Error("Error sending webhook - %v", err.Error()) 29 | } else { 30 | t.Info("Webhook sent") 31 | } 32 | } 33 | 34 | func (t *Task) PaypalWebhook() { 35 | 36 | w := webhooks.Webhook{} 37 | e := webhooks.Embed{} 38 | 39 | e.SetTitle("Succesful checkout :disappointed:") 40 | e.SetColor(0x00ff00) 41 | e.SetThumbnail(t.ProductImage) 42 | e.SetFooter(fmt.Sprintf("TraianBot - [%v]", time.Now().Format("2006-02-01 15:04:05.999999")), "https://i.pinimg.com/564x/17/6b/90/176b90a7cf4ca43e88de32369d053dab.jpg") 43 | e.SetDescription(fmt.Sprintf("[Click here](%v)", t.PaypalURL)) 44 | e.AddField("Store", "Ambush", false) 45 | e.AddField("PID", t.SKU, true) 46 | e.AddField("Size", t.ProductSize, true) 47 | e.AddField("Email", fmt.Sprintf("||%v||", t.Email), true) 48 | 49 | w.AddEmbed(e) 50 | 51 | err := w.Send(t.Webhook) 52 | 53 | if err != nil { 54 | t.Error("Error sending webhook - %v", err.Error()) 55 | } else { 56 | t.Info("Webhook sent") 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/bot/tasks/config.go: -------------------------------------------------------------------------------- 1 | package tasks 2 | 3 | import ( 4 | "encoding/json" 5 | "io/ioutil" 6 | ) 7 | 8 | type Config struct { 9 | Webhook string `json:"WEBHOOK"` 10 | Delay int `json:"DELAY"` 11 | Timeout int `json:"TIMEOUT"` 12 | } 13 | 14 | func ReadConfig() (Config, error) { 15 | 16 | fileContent, err := ioutil.ReadFile("config.json") 17 | 18 | if err != nil { 19 | return Config{}, err 20 | } 21 | 22 | var config Config 23 | 24 | if err := json.Unmarshal(fileContent, &config); err != nil { 25 | return config, err 26 | } 27 | 28 | return config, nil 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/bot/tasks/csv.go: -------------------------------------------------------------------------------- 1 | package tasks 2 | 3 | import ( 4 | "io/ioutil" 5 | 6 | "github.com/jszwec/csvutil" 7 | ) 8 | 9 | type Row struct { 10 | SKU string `csv:"SKU"` 11 | URL string `csv:"URL"` 12 | Sizes string `csv:"SIZES"` 13 | 14 | Email string `csv:"EMAIL"` 15 | FirstName string `csv:"FIRST NAME"` 16 | LastName string `csv:"LAST NAME"` 17 | PhoneNumber string `csv:"PHONE NUMBER"` 18 | Address1 string `csv:"ADDRESS 1"` 19 | Address2 string `csv:"ADDRESS 2"` 20 | HouseNumber string `csv:"HOUSE NUMBER"` 21 | State string `csv:"STATE"` 22 | City string `csv:"CITY"` 23 | Postcode string `csv:"POSTCODE"` 24 | Country string `csv:"COUNTRY"` 25 | CountryID string `csv:"COUNTRY ID"` 26 | Currency string `csv:"CURRENCY"` 27 | } 28 | 29 | func ReadFile(filename string) ([]Row, error) { 30 | 31 | fileContent, err := ioutil.ReadFile(filename) 32 | 33 | if err != nil { 34 | return nil, err 35 | } 36 | 37 | var rows []Row 38 | 39 | if err := csvutil.Unmarshal(fileContent, &rows); err != nil { 40 | return nil, err 41 | } 42 | 43 | return rows, nil 44 | } 45 | -------------------------------------------------------------------------------- /src/bot/tasks/proxies.go: -------------------------------------------------------------------------------- 1 | package tasks 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "strings" 7 | ) 8 | 9 | func ReadProxies() ([]string, error) { 10 | 11 | fileContent, err := ioutil.ReadFile("proxies.txt") 12 | 13 | if err != nil { 14 | return nil, err 15 | } 16 | 17 | raw := strings.Split(string(fileContent), "\r\n") 18 | 19 | proxies := make([]string, 0) 20 | 21 | for _, proxy := range raw { 22 | 23 | spl := strings.Split(proxy, ":") 24 | 25 | if len(spl) == 2 { 26 | proxies = append(proxies, fmt.Sprintf("http://%v:%v", spl[0], spl[1])) 27 | } else if len(spl) == 4 { 28 | proxies = append(proxies, fmt.Sprintf("http://%v:%v@%v:%v", spl[2], spl[3], spl[0], spl[1])) 29 | } 30 | } 31 | 32 | return proxies, nil 33 | } 34 | -------------------------------------------------------------------------------- /src/bot/tasks/sizes.go: -------------------------------------------------------------------------------- 1 | package tasks 2 | 3 | import ( 4 | "strings" 5 | 6 | "bot/utils" 7 | ) 8 | 9 | func ParseSizes(sizes string) ([]string, error) { 10 | if sizes == "" || strings.ToLower(sizes) == "random" { 11 | return []string{"RANDOM"}, nil 12 | } 13 | 14 | rangeCheck := strings.Split(sizes, ":") 15 | 16 | if len(rangeCheck) > 1 { 17 | return utils.Frange(rangeCheck[0], rangeCheck[1]) 18 | } 19 | 20 | return strings.Split(sizes, ";"), nil 21 | } 22 | -------------------------------------------------------------------------------- /src/bot/utils/cookies.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | 7 | "bot/client" 8 | "net/http" 9 | "net/url" 10 | ) 11 | 12 | type Cookie struct { 13 | Name string `json:"name"` 14 | Value string `json:"value"` 15 | Domain string `json:"domain"` 16 | Path string `json:"path"` 17 | URL string `json:"url"` 18 | Secure bool `json:"secure"` 19 | } 20 | 21 | func GetCookie(jar *client.ExportableCookieJar, name string) string { 22 | 23 | for _, cookies := range jar.ExportAllCookies() { 24 | for _, cookie := range cookies { 25 | if name == cookie.Name { 26 | return cookie.Value 27 | } 28 | } 29 | } 30 | 31 | return "" 32 | } 33 | 34 | func SetCookie(jar *client.ExportableCookieJar, name, value, domain, URL string) (*client.ExportableCookieJar, error) { 35 | 36 | new := client.NewExportableCookieJar() 37 | 38 | for host, cookies := range jar.ExportAllCookies() { 39 | 40 | cks := make([]*http.Cookie, 0) 41 | 42 | for _, cookie := range cookies { 43 | if name != cookie.Name { 44 | cks = append(cks, cookie) 45 | } 46 | } 47 | 48 | new.SetCookies(&host, cks) 49 | } 50 | 51 | cookie := http.Cookie{ 52 | Name: name, 53 | Value: value, 54 | Domain: domain, 55 | Path: "/", 56 | } 57 | 58 | u, err := url.Parse(URL) 59 | 60 | if err != nil { 61 | return nil, err 62 | } 63 | 64 | new.SetCookies(u, []*http.Cookie{&cookie}) 65 | 66 | return new, nil 67 | } 68 | 69 | func PopCookie(jar *client.ExportableCookieJar, name string) *client.ExportableCookieJar { 70 | 71 | new := client.NewExportableCookieJar() 72 | 73 | for host, cookies := range jar.ExportAllCookies() { 74 | 75 | cks := make([]*http.Cookie, 0) 76 | 77 | for _, cookie := range cookies { 78 | if name != cookie.Name { 79 | cks = append(cks, cookie) 80 | } 81 | } 82 | 83 | new.SetCookies(&host, cks) 84 | } 85 | 86 | return new 87 | } 88 | 89 | func ExtractCookies(jar *client.ExportableCookieJar) []*Cookie { 90 | 91 | r := make([]*Cookie, 0) 92 | 93 | for u, cookies := range jar.ExportAllCookies() { 94 | for _, cookie := range cookies { 95 | 96 | c := &Cookie{ 97 | Name: cookie.Name, 98 | Value: cookie.Value, 99 | Domain: cookie.Domain, 100 | Path: cookie.Path, 101 | Secure: true, 102 | } 103 | 104 | if strings.HasPrefix(u.Host, ".") { 105 | c.URL = fmt.Sprintf("https://%v", strings.Trim(u.Host, ".")) 106 | } else { 107 | c.URL = fmt.Sprintf("https://%v", u.Host) 108 | } 109 | 110 | r = append(r, c) 111 | } 112 | } 113 | 114 | return r 115 | } 116 | -------------------------------------------------------------------------------- /src/bot/utils/countries.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | var countries = map[string]string{ 4 | "AF": "Afghanistan", 5 | "AX": "Åland Islands", 6 | "AL": "Albania", 7 | "DZ": "Algeria", 8 | "AS": "American Samoa", 9 | "AD": "Andorra", 10 | "AO": "Angola", 11 | "AI": "Anguilla", 12 | "AQ": "Antarctica", 13 | "AG": "Antigua and Barbuda", 14 | "AR": "Argentina", 15 | "AM": "Armenia", 16 | "AW": "Aruba", 17 | "AU": "Australia", 18 | "AT": "Austria", 19 | "AZ": "Azerbaijan", 20 | "BS": "The Bahamas", 21 | "BH": "Bahrain", 22 | "BD": "Bangladesh", 23 | "BB": "Barbados", 24 | "BY": "Belarus", 25 | "BE": "Belgium", 26 | "BZ": "Belize", 27 | "BJ": "Benin", 28 | "BM": "Bermuda", 29 | "BT": "Bhutan", 30 | "BO": "Bolivia", 31 | "BQ": "Bonaire", 32 | "BA": "Bosnia and Herzegovina", 33 | "BW": "Botswana", 34 | "BV": "Bouvet Island", 35 | "BR": "Brazil", 36 | "IO": "British Indian Ocean Territory", 37 | "UM": "United States Minor Outlying Islands", 38 | "VG": "Virgin Islands (British)", 39 | "VI": "Virgin Islands (U.S.)", 40 | "BN": "Brunei", 41 | "BG": "Bulgaria", 42 | "BF": "Burkina Faso", 43 | "BI": "Burundi", 44 | "KH": "Cambodia", 45 | "CM": "Cameroon", 46 | "CA": "Canada", 47 | "CV": "Cape Verde", 48 | "KY": "Cayman Islands", 49 | "CF": "Central African Republic", 50 | "TD": "Chad", 51 | "CL": "Chile", 52 | "CN": "China", 53 | "CX": "Christmas Island", 54 | "CC": "Cocos (Keeling) Islands", 55 | "CO": "Colombia", 56 | "KM": "Comoros", 57 | "CG": "Republic of the Congo", 58 | "CD": "Democratic Republic of the Congo", 59 | "CK": "Cook Islands", 60 | "CR": "Costa Rica", 61 | "HR": "Croatia", 62 | "CU": "Cuba", 63 | "CW": "Curaçao", 64 | "CY": "Cyprus", 65 | "CZ": "Czech Republic", 66 | "DK": "Denmark", 67 | "DJ": "Djibouti", 68 | "DM": "Dominica", 69 | "DO": "Dominican Republic", 70 | "EC": "Ecuador", 71 | "EG": "Egypt", 72 | "SV": "El Salvador", 73 | "GQ": "Equatorial Guinea", 74 | "ER": "Eritrea", 75 | "EE": "Estonia", 76 | "ET": "Ethiopia", 77 | "FK": "Falkland Islands", 78 | "FO": "Faroe Islands", 79 | "FJ": "Fiji", 80 | "FI": "Finland", 81 | "FR": "France", 82 | "GF": "French Guiana", 83 | "PF": "French Polynesia", 84 | "TF": "French Southern and Antarctic Lands", 85 | "GA": "Gabon", 86 | "GM": "The Gambia", 87 | "GE": "Georgia", 88 | "DE": "Germany", 89 | "GH": "Ghana", 90 | "GI": "Gibraltar", 91 | "GR": "Greece", 92 | "GL": "Greenland", 93 | "GD": "Grenada", 94 | "GP": "Guadeloupe", 95 | "GU": "Guam", 96 | "GT": "Guatemala", 97 | "GG": "Guernsey", 98 | "GN": "Guinea", 99 | "GW": "Guinea-Bissau", 100 | "GY": "Guyana", 101 | "HT": "Haiti", 102 | "HM": "Heard Island and McDonald Islands", 103 | "VA": "Holy See", 104 | "HN": "Honduras", 105 | "HK": "Hong Kong", 106 | "HU": "Hungary", 107 | "IS": "Iceland", 108 | "IN": "India", 109 | "ID": "Indonesia", 110 | "CI": "Ivory Coast", 111 | "IR": "Iran", 112 | "IQ": "Iraq", 113 | "IE": "Republic of Ireland", 114 | "IM": "Isle of Man", 115 | "IL": "Israel", 116 | "IT": "Italy", 117 | "JM": "Jamaica", 118 | "JP": "Japan", 119 | "JE": "Jersey", 120 | "JO": "Jordan", 121 | "KZ": "Kazakhstan", 122 | "KE": "Kenya", 123 | "KI": "Kiribati", 124 | "KW": "Kuwait", 125 | "KG": "Kyrgyzstan", 126 | "LA": "Laos", 127 | "LV": "Latvia", 128 | "LB": "Lebanon", 129 | "LS": "Lesotho", 130 | "LR": "Liberia", 131 | "LY": "Libya", 132 | "LI": "Liechtenstein", 133 | "LT": "Lithuania", 134 | "LU": "Luxembourg", 135 | "MO": "Macau", 136 | "MK": "Republic of Macedonia", 137 | "MG": "Madagascar", 138 | "MW": "Malawi", 139 | "MY": "Malaysia", 140 | "MV": "Maldives", 141 | "ML": "Mali", 142 | "MT": "Malta", 143 | "MH": "Marshall Islands", 144 | "MQ": "Martinique", 145 | "MR": "Mauritania", 146 | "MU": "Mauritius", 147 | "YT": "Mayotte", 148 | "MX": "Mexico", 149 | "FM": "Federated States of Micronesia", 150 | "MD": "Moldova", 151 | "MC": "Monaco", 152 | "MN": "Mongolia", 153 | "ME": "Montenegro", 154 | "MS": "Montserrat", 155 | "MA": "Morocco", 156 | "MZ": "Mozambique", 157 | "MM": "Myanmar", 158 | "NA": "Namibia", 159 | "NR": "Nauru", 160 | "NP": "Nepal", 161 | "NL": "Netherlands", 162 | "NC": "New Caledonia", 163 | "NZ": "New Zealand", 164 | "NI": "Nicaragua", 165 | "NE": "Niger", 166 | "NG": "Nigeria", 167 | "NU": "Niue", 168 | "NF": "Norfolk Island", 169 | "KP": "North Korea", 170 | "MP": "Northern Mariana Islands", 171 | "NO": "Norway", 172 | "OM": "Oman", 173 | "PK": "Pakistan", 174 | "PW": "Palau", 175 | "PS": "Palestine", 176 | "PA": "Panama", 177 | "PG": "Papua New Guinea", 178 | "PY": "Paraguay", 179 | "PE": "Peru", 180 | "PH": "Philippines", 181 | "PN": "Pitcairn Islands", 182 | "PL": "Poland", 183 | "PT": "Portugal", 184 | "PR": "Puerto Rico", 185 | "QA": "Qatar", 186 | "XK": "Republic of Kosovo", 187 | "RE": "Réunion", 188 | "RO": "Romania", 189 | "RU": "Russia", 190 | "RW": "Rwanda", 191 | "BL": "Saint Barthélemy", 192 | "SH": "Saint Helena", 193 | "KN": "Saint Kitts and Nevis", 194 | "LC": "Saint Lucia", 195 | "MF": "Saint Martin", 196 | "PM": "Saint Pierre and Miquelon", 197 | "VC": "Saint Vincent and the Grenadines", 198 | "WS": "Samoa", 199 | "SM": "San Marino", 200 | "ST": "São Tomé and Príncipe", 201 | "SA": "Saudi Arabia", 202 | "SN": "Senegal", 203 | "RS": "Serbia", 204 | "SC": "Seychelles", 205 | "SL": "Sierra Leone", 206 | "SG": "Singapore", 207 | "SX": "Sint Maarten", 208 | "SK": "Slovakia", 209 | "SI": "Slovenia", 210 | "SB": "Solomon Islands", 211 | "SO": "Somalia", 212 | "ZA": "South Africa", 213 | "GS": "South Georgia", 214 | "KR": "South Korea", 215 | "SS": "South Sudan", 216 | "ES": "Spain", 217 | "LK": "Sri Lanka", 218 | "SD": "Sudan", 219 | "SR": "Suriname", 220 | "SJ": "Svalbard and Jan Mayen", 221 | "SZ": "Swaziland", 222 | "SE": "Sweden", 223 | "CH": "Switzerland", 224 | "SY": "Syria", 225 | "TW": "Taiwan", 226 | "TJ": "Tajikistan", 227 | "TZ": "Tanzania", 228 | "TH": "Thailand", 229 | "TL": "East Timor", 230 | "TG": "Togo", 231 | "TK": "Tokelau", 232 | "TO": "Tonga", 233 | "TT": "Trinidad and Tobago", 234 | "TN": "Tunisia", 235 | "TR": "Turkey", 236 | "TM": "Turkmenistan", 237 | "TC": "Turks and Caicos Islands", 238 | "TV": "Tuvalu", 239 | "UG": "Uganda", 240 | "UA": "Ukraine", 241 | "AE": "United Arab Emirates", 242 | "GB": "United Kingdom", 243 | "US": "United States", 244 | "UY": "Uruguay", 245 | "UZ": "Uzbekistan", 246 | "VU": "Vanuatu", 247 | "VE": "Venezuela", 248 | "VN": "Vietnam", 249 | "WF": "Wallis and Futuna", 250 | "EH": "Western Sahara", 251 | "YE": "Yemen", 252 | "ZM": "Zambia", 253 | "ZW": "Zimbabwe", 254 | } 255 | 256 | func GetFullCountry(country string) string { 257 | return countries[country] 258 | } 259 | -------------------------------------------------------------------------------- /src/bot/utils/form.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "fmt" 5 | "net/url" 6 | "strings" 7 | ) 8 | 9 | type Form struct { 10 | Values []map[string]string 11 | } 12 | 13 | func (form *Form) Set(key, value string) { 14 | form.Values = append(form.Values, map[string]string{key: value}) 15 | } 16 | 17 | func (form *Form) Pop(keyToRemove string) { 18 | i := 0 19 | var elementToRemove string 20 | for _, y := range form.Values { 21 | for key, _ := range y { 22 | if keyToRemove == key { 23 | elementToRemove = fmt.Sprintf("%v", form.Values[i]) 24 | } 25 | } 26 | i += 1 27 | } 28 | if elementToRemove == "" { 29 | return 30 | } 31 | for i := 0; i < len(form.Values); i++ { 32 | value := fmt.Sprintf("%v", form.Values[i]) 33 | if value == elementToRemove { 34 | copy(form.Values[i:], form.Values[i+1:]) 35 | form.Values[len(form.Values)-1] = nil 36 | form.Values = form.Values[:len(form.Values)-1] 37 | return 38 | } 39 | continue 40 | } 41 | } 42 | 43 | func (form *Form) Encode() string { 44 | var encoded string 45 | for _, pair := range form.Values { 46 | for key, value := range pair { 47 | encoded += fmt.Sprintf("%v=%v&", url.QueryEscape(key), url.QueryEscape(value)) 48 | } 49 | } 50 | 51 | return strings.Trim(encoded, "&") 52 | } 53 | -------------------------------------------------------------------------------- /src/bot/utils/profiles.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "strings" 7 | 8 | "github.com/Pallinder/go-randomdata" 9 | "github.com/mcnijman/go-emailaddress" 10 | ) 11 | 12 | func CheckProfile(email, firstName, lastName, phoneNumber, address1, city, postcode, country string) error { 13 | 14 | if email == "" { 15 | return errors.New("Email can't be empty") 16 | } 17 | 18 | if _, err := emailaddress.Parse(email); err != nil { 19 | return errors.New("Invalid email") 20 | } 21 | 22 | if firstName == "" { 23 | return errors.New("First name can't be empty") 24 | } 25 | 26 | if lastName == "" { 27 | return errors.New("Last name can't be empty") 28 | } 29 | 30 | if phoneNumber == "" { 31 | return errors.New("Phone number can't be empty") 32 | } 33 | 34 | if address1 == "" { 35 | return errors.New("Address 1 can't be empty") 36 | } 37 | 38 | if city == "" { 39 | return errors.New("City can't be empty") 40 | } 41 | 42 | if postcode == "" { 43 | return errors.New("Postcode can't be empty") 44 | } 45 | 46 | if country == "" { 47 | return errors.New("Country can't be empty") 48 | } 49 | 50 | return nil 51 | } 52 | 53 | func WrapProfile(email, firstName, lastName, phoneNumber, address1 string) (string, string, string, string, string) { 54 | 55 | if strings.ToUpper(firstName) == "RANDOM" { 56 | firstName = randomdata.FirstName(randomdata.RandomGender) 57 | } 58 | 59 | if strings.ToUpper(lastName) == "RANDOM" { 60 | lastName = randomdata.LastName() 61 | } 62 | 63 | if strings.ToUpper(phoneNumber) == "RANDOM" { 64 | phoneNumber = fmt.Sprintf("%v", randomdata.Number(1000000000, 9999999999)) 65 | } 66 | 67 | parsedEmail, _ := emailaddress.Parse(email) 68 | 69 | if strings.ToUpper(parsedEmail.LocalPart) == "RANDOM" { 70 | email = fmt.Sprintf("%v%v%v@%v", firstName, lastName, fmt.Sprintf("%v", randomdata.Number(100, 9999)), parsedEmail.Domain) 71 | } 72 | 73 | if strings.Contains(address1, "XXX") { 74 | address1 = strings.Replace(address1, "XXX", RandomString(3, "ABCDEFGHUJKLMNOPQRSTUVWXYZ"), 1) 75 | } 76 | 77 | return email, firstName, lastName, phoneNumber, address1 78 | } 79 | -------------------------------------------------------------------------------- /src/bot/utils/states.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | var states = map[string]map[string]string{ 4 | "AF": map[string]string{ 5 | "Badakhshān": "BDS", 6 | "Baghlān": "BGL", 7 | "Balkh": "BAL", 8 | "Bādghīs": "BDG", 9 | "Bāmyān": "BAM", 10 | "Dāykundī": "DAY", 11 | "Farāh": "FRA", 12 | "Fāryāb": "FYB", 13 | "Ghaznī": "GHA", 14 | "Ghōr": "GHO", 15 | "Helmand": "HEL", 16 | "Herāt": "HER", 17 | "Jowzjān": "JOW", 18 | "Kandahār": "KAN", 19 | "Khōst": "KHO", 20 | "Kunar": "KNR", 21 | "Kunduz": "KDZ", 22 | "Kābul": "KAB", 23 | "Kāpīsā": "KAP", 24 | "Laghmān": "LAG", 25 | "Lōgar": "LOG", 26 | "Nangarhār": "NAN", 27 | "Nīmrōz": "NIM", 28 | "Nūristān": "NUR", 29 | "Paktiyā": "PIA", 30 | "Paktīkā": "PKA", 31 | "Panjshayr": "PAN", 32 | "Parwān": "PAR", 33 | "Samangān": "SAM", 34 | "Sar-e Pul": "SAR", 35 | "Takhār": "TAK", 36 | "Uruzgān": "URU", 37 | "Wardak": "WAR", 38 | "Zābul": "ZAB", 39 | }, 40 | "AX": map[string]string{}, 41 | "AL": map[string]string{ 42 | "Berat": "01", 43 | "Dibër": "09", 44 | "Durrës": "02", 45 | "Elbasan": "03", 46 | "Fier": "04", 47 | "Gjirokastër": "05", 48 | "Korçë": "06", 49 | "Kukës": "07", 50 | "Lezhë": "08", 51 | "Shkodër": "10", 52 | "Tiranë": "11", 53 | "Vlorë": "12", 54 | }, 55 | "DZ": map[string]string{ 56 | "Adrar": "01", 57 | "Alger": "16", 58 | "Annaba": "23", 59 | "Aïn Defla": "44", 60 | "Aïn Témouchent": "46", 61 | "Batna": "05", 62 | "Biskra": "07", 63 | "Blida": "09", 64 | "Bordj Bou Arréridj": "34", 65 | "Bouira": "10", 66 | "Boumerdès": "35", 67 | "Béchar": "08", 68 | "Béjaïa": "06", 69 | "Chlef": "02", 70 | "Constantine": "25", 71 | "Djelfa": "17", 72 | "El Bayadh": "32", 73 | "El Oued": "39", 74 | "El Tarf": "36", 75 | "Ghardaïa": "47", 76 | "Guelma": "24", 77 | "Illizi": "33", 78 | "Jijel": "18", 79 | "Khenchela": "40", 80 | "Laghouat": "03", 81 | "Mascara": "29", 82 | "Mila": "43", 83 | "Mostaganem": "27", 84 | "Msila": "28", 85 | "Médéa": "26", 86 | "Naama": "45", 87 | "Oran": "31", 88 | "Ouargla": "30", 89 | "Oum el Bouaghi": "04", 90 | "Relizane": "48", 91 | "Saïda": "20", 92 | "Sidi Bel Abbès": "22", 93 | "Skikda": "21", 94 | "Souk Ahras": "41", 95 | "Sétif": "19", 96 | "Tamanghasset": "11", 97 | "Tiaret": "14", 98 | "Tindouf": "37", 99 | "Tipaza": "42", 100 | "Tissemsilt": "38", 101 | "Tizi Ouzou": "15", 102 | "Tlemcen": "13", 103 | "Tébessa": "12", 104 | }, 105 | "AS": map[string]string{}, 106 | "AD": map[string]string{ 107 | "Andorra la Vella": "07", 108 | "Canillo": "02", 109 | "Encamp": "03", 110 | "Escaldes-Engordany": "08", 111 | "La Massana": "04", 112 | "Ordino": "05", 113 | "Sant Julià de Lòria": "06", 114 | }, 115 | "AO": map[string]string{ 116 | "Bengo": "BGO", 117 | "Benguela": "BGU", 118 | "Bié": "BIE", 119 | "Cabinda": "CAB", 120 | "Cunene": "CNN", 121 | "Huambo": "HUA", 122 | "Huíla": "HUI", 123 | "Kuando Kubango": "CCU", 124 | "Kwanza Norte": "CNO", 125 | "Kwanza Sul": "CUS", 126 | "Luanda": "LUA", 127 | "Lunda Norte": "LNO", 128 | "Lunda Sul": "LSU", 129 | "Malange": "MAL", 130 | "Moxico": "MOX", 131 | "Namibe": "NAM", 132 | "Uíge": "UIG", 133 | "Zaire": "ZAI", 134 | }, 135 | "AI": map[string]string{}, 136 | "AQ": map[string]string{}, 137 | "AG": map[string]string{ 138 | "Barbuda": "10", 139 | "Redonda": "11", 140 | "Saint George": "03", 141 | "Saint John": "04", 142 | "Saint Mary": "05", 143 | "Saint Paul": "06", 144 | "Saint Peter": "07", 145 | "Saint Philip": "08", 146 | }, 147 | "AR": map[string]string{ 148 | "Buenos Aires": "B", 149 | "Catamarca": "K", 150 | "Chaco": "H", 151 | "Chubut": "U", 152 | "Ciudad Autónoma de Buenos Aires": "C", 153 | "Corrientes": "W", 154 | "Córdoba": "X", 155 | "Entre Ríos": "E", 156 | "Formosa": "P", 157 | "Jujuy": "Y", 158 | "La Pampa": "L", 159 | "La Rioja": "F", 160 | "Mendoza": "M", 161 | "Misiones": "N", 162 | "Neuquén": "Q", 163 | "Río Negro": "R", 164 | "Salta": "A", 165 | "San Juan": "J", 166 | "San Luis": "D", 167 | "Santa Cruz": "Z", 168 | "Santa Fe": "S", 169 | "Santiago del Estero": "G", 170 | "Tierra del Fuego": "V", 171 | "Tucumán": "T", 172 | }, 173 | "AM": map[string]string{ 174 | "Aragac̣otn": "AG", 175 | "Ararat": "AR", 176 | "Armavir": "AV", 177 | "Erevan": "ER", 178 | "Geġark'unik'": "GR", 179 | "Kotayk'": "KT", 180 | "Loṙi": "LO", 181 | "Syunik'": "SU", 182 | "Tavuš": "TV", 183 | "Vayoć Jor": "VD", 184 | "Širak": "SH", 185 | }, 186 | "AW": map[string]string{}, 187 | "AU": map[string]string{ 188 | "Australian Capital Territory": "ACT", 189 | "New South Wales": "NSW", 190 | "Northern Territory": "NT", 191 | "Queensland": "QLD", 192 | "South Australia": "SA", 193 | "Tasmania": "TAS", 194 | "Victoria": "VIC", 195 | "Western Australia": "WA", 196 | }, 197 | "AT": map[string]string{ 198 | "Burgenland": "B", 199 | "Kärnten": "K", 200 | "Niederösterreich": "NÖ", 201 | "Oberösterreich": "OÖ", 202 | "Salzburg": "S", 203 | "Steiermark": "ST", 204 | "Tirol": "T", 205 | "Vorarlberg": "V", 206 | "Wien": "W", 207 | }, 208 | "AZ": map[string]string{ 209 | "Naxçıvan": "NX", 210 | }, 211 | "BS": map[string]string{ 212 | "Acklins": "AK", 213 | "Berry Islands": "BY", 214 | "Bimini": "BI", 215 | "Black Point": "BP", 216 | "Cat Island": "CI", 217 | "Central Abaco": "CO", 218 | "Central Andros": "CS", 219 | "Central Eleuthera": "CE", 220 | "City of Freeport": "FP", 221 | "Crooked Island and Long Cay": "CK", 222 | "East Grand Bahama": "EG", 223 | "Exuma": "EX", 224 | "Grand Cay": "GC", 225 | "Harbour Island": "HI", 226 | "Hope Town": "HT", 227 | "Inagua": "IN", 228 | "Long Island": "LI", 229 | "Mangrove Cay": "MC", 230 | "Mayaguana": "MG", 231 | "Moores Island": "MI", 232 | "North Abaco": "NO", 233 | "North Andros": "NS", 234 | "North Eleuthera": "NE", 235 | "Ragged Island": "RI", 236 | "Rum Cay": "RC", 237 | "San Salvador": "SS", 238 | "South Abaco": "SO", 239 | "South Andros": "SA", 240 | "South Eleuthera": "SE", 241 | "Spanish Wells": "SW", 242 | "West Grand Bahama": "WG", 243 | }, 244 | "BH": map[string]string{ 245 | "Al Janūbīyah": "14", 246 | "Al Manāmah": "13", 247 | "Al Muḩarraq": "15", 248 | "Al Wusţá": "16", 249 | "Ash Shamālīyah": "17", 250 | }, 251 | "BD": map[string]string{ 252 | "Barisal": "A", 253 | "Chittagong": "B", 254 | "Dhaka": "C", 255 | "Khulna": "D", 256 | "Rajshahi": "E", 257 | "Rangpur": "F", 258 | "Sylhet": "G", 259 | }, 260 | "BB": map[string]string{ 261 | "Christ Church": "01", 262 | "Saint Andrew": "02", 263 | "Saint George": "03", 264 | "Saint James": "04", 265 | "Saint John": "05", 266 | "Saint Joseph": "06", 267 | "Saint Lucy": "07", 268 | "Saint Michael": "08", 269 | "Saint Peter": "09", 270 | "Saint Philip": "10", 271 | "Saint Thomas": "11", 272 | }, 273 | "BY": map[string]string{ 274 | "Brestskaya voblasts'": "BR", 275 | "Homyel'skaya voblasts'": "HO", 276 | "Horad Minsk": "HM", 277 | "Hrodzenskaya voblasts'": "HR", 278 | "Mahilyowskaya voblasts'": "MA", 279 | "Minskaya voblasts'": "MI", 280 | "Vitsyebskaya voblasts'": "VI", 281 | }, 282 | "BE": map[string]string{ 283 | "Brussels Hoofdstedelijk Gewest": "BRU", 284 | "Région Wallonne": "WAL", 285 | "Vlaams Gewest": "VLG", 286 | }, 287 | "BZ": map[string]string{ 288 | "Belize": "BZ", 289 | "Cayo": "CY", 290 | "Corozal": "CZL", 291 | "Orange Walk": "OW", 292 | "Stann Creek": "SC", 293 | "Toledo": "TOL", 294 | }, 295 | "BJ": map[string]string{ 296 | "Alibori": "AL", 297 | "Atakora": "AK", 298 | "Atlantique": "AQ", 299 | "Borgou": "BO", 300 | "Collines": "CO", 301 | "Donga": "DO", 302 | "Kouffo": "KO", 303 | "Littoral": "LI", 304 | "Mono": "MO", 305 | "Ouémé": "OU", 306 | "Plateau": "PL", 307 | "Zou": "ZO", 308 | }, 309 | "BM": map[string]string{}, 310 | "BT": map[string]string{ 311 | "Bumthang": "33", 312 | "Chhukha": "12", 313 | "Dagana": "22", 314 | "Gasa": "GA", 315 | "Ha": "13", 316 | "Lhuentse": "44", 317 | "Monggar": "42", 318 | "Paro": "11", 319 | "Pemagatshel": "43", 320 | "Punakha": "23", 321 | "Samdrup Jongkha": "45", 322 | "Samtse": "14", 323 | "Sarpang": "31", 324 | "Thimphu": "15", 325 | "Trashi Yangtse": "TY", 326 | "Trashigang": "41", 327 | "Trongsa": "32", 328 | "Tsirang": "21", 329 | "Wangdue Phodrang": "24", 330 | "Zhemgang": "34", 331 | }, 332 | "BO": map[string]string{ 333 | "Chuquisaca": "H", 334 | "Cochabamba": "C", 335 | "El Beni": "B", 336 | "La Paz": "L", 337 | "Oruro": "O", 338 | "Pando": "N", 339 | "Potosí": "P", 340 | "Santa Cruz": "S", 341 | "Tarija": "T", 342 | }, 343 | "BQ": map[string]string{}, 344 | "BA": map[string]string{ 345 | "Brčko distrikt": "BRC", 346 | "Federacija Bosna i Hercegovina": "BIH", 347 | "Republika Srpska": "SRP", 348 | }, 349 | "BW": map[string]string{ 350 | "Central": "CE", 351 | "Chobe": "CH", 352 | "Francistown": "FR", 353 | "Gaborone": "GA", 354 | "Ghanzi": "GH", 355 | "Jwaneng": "JW", 356 | "Kgalagadi": "KG", 357 | "Kgatleng": "KL", 358 | "Kweneng": "KW", 359 | "Lobatse": "LO", 360 | "North-East": "NE", 361 | "North-West": "NW", 362 | "Selibe Phikwe": "SP", 363 | "South-East": "SE", 364 | "Southern": "SO", 365 | "Sowa Town": "ST", 366 | }, 367 | "BV": map[string]string{}, 368 | "BR": map[string]string{ 369 | "Acre": "AC", 370 | "Alagoas": "AL", 371 | "Amapá": "AP", 372 | "Amazonas": "AM", 373 | "Bahia": "BA", 374 | "Ceará": "CE", 375 | "Distrito Federal": "DF", 376 | "Espírito Santo": "ES", 377 | "Goiás": "GO", 378 | "Maranhão": "MA", 379 | "Mato Grosso": "MT", 380 | "Mato Grosso do Sul": "MS", 381 | "Minas Gerais": "MG", 382 | "Paraná": "PR", 383 | "Paraíba": "PB", 384 | "Pará": "PA", 385 | "Pernambuco": "PE", 386 | "Piauí": "PI", 387 | "Rio Grande do Norte": "RN", 388 | "Rio Grande do Sul": "RS", 389 | "Rio de Janeiro": "RJ", 390 | "Rondônia": "RO", 391 | "Roraima": "RR", 392 | "Santa Catarina": "SC", 393 | "Sergipe": "SE", 394 | "São Paulo": "SP", 395 | "Tocantins": "TO", 396 | }, 397 | "IO": map[string]string{}, 398 | "UM": map[string]string{ 399 | "Baker Island": "81", 400 | "Howland Island": "84", 401 | "Jarvis Island": "86", 402 | "Johnston Atoll": "67", 403 | "Kingman Reef": "89", 404 | "Midway Islands": "71", 405 | "Navassa Island": "76", 406 | "Palmyra Atoll": "95", 407 | "Wake Island": "79", 408 | }, 409 | "VG": map[string]string{}, 410 | "VI": map[string]string{}, 411 | "BN": map[string]string{ 412 | "Belait": "BE", 413 | "Brunei-Muara": "BM", 414 | "Temburong": "TE", 415 | "Tutong": "TU", 416 | }, 417 | "BG": map[string]string{ 418 | "Blagoevgrad": "01", 419 | "Burgas": "02", 420 | "Dobrich": "08", 421 | "Gabrovo": "07", 422 | "Haskovo": "26", 423 | "Kardzhali": "09", 424 | "Kyustendil": "10", 425 | "Lovech": "11", 426 | "Montana": "12", 427 | "Pazardzhik": "13", 428 | "Pernik": "14", 429 | "Pleven": "15", 430 | "Plovdiv": "16", 431 | "Razgrad": "17", 432 | "Ruse": "18", 433 | "Shumen": "27", 434 | "Silistra": "19", 435 | "Sliven": "20", 436 | "Smolyan": "21", 437 | "Sofia": "23", 438 | "Sofia-Grad": "22", 439 | "Stara Zagora": "24", 440 | "Targovishte": "25", 441 | "Varna": "03", 442 | "Veliko Tarnovo": "04", 443 | "Vidin": "05", 444 | "Vratsa": "06", 445 | "Yambol": "28", 446 | }, 447 | "BF": map[string]string{ 448 | "Boucle du Mouhoun": "01", 449 | "Cascades": "02", 450 | "Centre": "03", 451 | "Centre-Est": "04", 452 | "Centre-Nord": "05", 453 | "Centre-Ouest": "06", 454 | "Centre-Sud": "07", 455 | "Est": "08", 456 | "Hauts-Bassins": "09", 457 | "Nord": "10", 458 | "Plateau-Central": "11", 459 | "Sahel": "12", 460 | "Sud-Ouest": "13", 461 | }, 462 | "BI": map[string]string{ 463 | "Bubanza": "BB", 464 | "Bujumbura Mairie": "BM", 465 | "Bujumbura Rural": "BL", 466 | "Bururi": "BR", 467 | "Cankuzo": "CA", 468 | "Cibitoke": "CI", 469 | "Gitega": "GI", 470 | "Karuzi": "KR", 471 | "Kayanza": "KY", 472 | "Kirundo": "KI", 473 | "Makamba": "MA", 474 | "Muramvya": "MU", 475 | "Muyinga": "MY", 476 | "Mwaro": "MW", 477 | "Ngozi": "NG", 478 | "Rutana": "RT", 479 | "Ruyigi": "RY", 480 | }, 481 | "KH": map[string]string{ 482 | "Baat Dambang": "2", 483 | "Banteay Mean Chey": "1", 484 | "Kampong Chaam": "3", 485 | "Kampong Chhnang": "4", 486 | "Kampong Spueu": "5", 487 | "Kampong Thum": "6", 488 | "Kampot": "7", 489 | "Kandaal": "8", 490 | "Kaoh Kong": "9", 491 | "Kracheh": "10", 492 | "Krong Kaeb": "23", 493 | "Krong Pailin": "24", 494 | "Krong Preah Sihanouk": "18", 495 | "Mondol Kiri": "11", 496 | "Otdar Mean Chey": "22", 497 | "Phnom Penh": "12", 498 | "Pousaat": "15", 499 | "Preah Vihear": "13", 500 | "Prey Veaeng": "14", 501 | "Rotanak Kiri": "16", 502 | "Siem Reab": "17", 503 | "Stueng Traeng": "19", 504 | "Svaay Rieng": "20", 505 | "Taakaev": "21", 506 | }, 507 | "CM": map[string]string{ 508 | "Adamaoua": "AD", 509 | "Centre": "CE", 510 | "East": "ES", 511 | "Far North": "EN", 512 | "Littoral": "LT", 513 | "North": "NO", 514 | "North-West": "NW", 515 | "South": "SU", 516 | "South-West": "SW", 517 | "West": "OU", 518 | }, 519 | "CA": map[string]string{ 520 | "Alberta": "AB", 521 | "British Columbia": "BC", 522 | "Manitoba": "MB", 523 | "New Brunswick": "NB", 524 | "Newfoundland and Labrador": "NL", 525 | "Nova Scotia": "NS", 526 | "Ontario": "ON", 527 | "Prince Edward Island": "PE", 528 | "Quebec": "QC", 529 | "Saskatchewan": "SK", 530 | "Northwest Territories": "NT", 531 | "Nunavut": "NU", 532 | "Yukon": "YT", 533 | }, 534 | "CV": map[string]string{ 535 | "Ilhas de Barlavento": "B", 536 | "Ilhas de Sotavento": "S", 537 | }, 538 | "KY": map[string]string{}, 539 | "CF": map[string]string{ 540 | "Bamingui-Bangoran": "BB", 541 | "Bangui": "BGF", 542 | "Basse-Kotto": "BK", 543 | "Gribingui": "KB", 544 | "Haut-Mbomou": "HM", 545 | "Haute-Kotto": "HK", 546 | "Haute-Sangha / Mambéré-Kadéï": "HS", 547 | "Kémo-Gribingui": "KG", 548 | "Lobaye": "LB", 549 | "Mbomou": "MB", 550 | "Nana-Mambéré": "NM", 551 | "Ombella-Mpoko": "MP", 552 | "Ouaka": "UK", 553 | "Ouham": "AC", 554 | "Ouham-Pendé": "OP", 555 | "Sangha": "SE", 556 | "Vakaga": "VK", 557 | }, 558 | "TD": map[string]string{ 559 | "Al Baṭḩah": "BA", 560 | "Al Buḩayrah": "LC", 561 | "Baḩr al Ghazāl": "BG", 562 | "Būrkū": "BO", 563 | "Innīdī": "EN", 564 | "Kānim": "KA", 565 | "Lūqūn al Gharbī": "LO", 566 | "Lūqūn ash Sharqī": "LR", 567 | "Madīnat Injamīnā": "ND", 568 | "Māndūl": "MA", 569 | "Māyū Kībbī al Gharbī": "MO", 570 | "Māyū Kībbī ash Sharqī": "ME", 571 | "Qīrā": "GR", 572 | "Salāmāt": "SA", 573 | "Shārī Bāqirmī": "CB", 574 | "Shārī al Awsaṭ": "MC", 575 | "Sīlā": "SI", 576 | "Tibastī": "TI", 577 | "Tānjilī": "TA", 578 | "Waddāy": "OD", 579 | "Wādī Fīrā": "WF", 580 | "Ḥajjar Lamīs": "HL", 581 | }, 582 | "CL": map[string]string{ 583 | "Aisén del General Carlos Ibañez del Campo": "AI", 584 | "Antofagasta": "AN", 585 | "Araucanía": "AR", 586 | "Arica y Parinacota": "AP", 587 | "Atacama": "AT", 588 | "Bío-Bío": "BI", 589 | "Coquimbo": "CO", 590 | "Libertador General Bernardo O'Higgins": "LI", 591 | "Los Lagos": "LL", 592 | "Los Ríos": "LR", 593 | "Magallanes": "MA", 594 | "Maule": "ML", 595 | "Región Metropolitana de Santiago": "RM", 596 | "Tarapacá": "TA", 597 | "Valparaíso": "VS", 598 | }, 599 | "CN": map[string]string{ 600 | "Guangxi": "45", 601 | "Nei Mongol": "15", 602 | "Ningxia": "64", 603 | "Xinjiang": "65", 604 | "Xizang": "54", 605 | "Beijing": "11", 606 | "Chongqing": "50", 607 | "Shanghai": "31", 608 | "Tianjin": "12", 609 | "Anhui": "34", 610 | "Fujian": "35", 611 | "Gansu": "62", 612 | "Guangdong": "44", 613 | "Guizhou": "52", 614 | "Hainan": "46", 615 | "Hebei": "13", 616 | "Heilongjiang": "23", 617 | "Henan": "41", 618 | "Hubei": "42", 619 | "Hunan": "43", 620 | "Jiangsu": "32", 621 | "Jiangxi": "36", 622 | "Jilin": "22", 623 | "Liaoning": "21", 624 | "Qinghai": "63", 625 | "Shaanxi": "61", 626 | "Shandong": "37", 627 | "Shanxi": "14", 628 | "Sichuan": "51", 629 | "Taiwan": "71", 630 | "Yunnan": "53", 631 | "Zhejiang": "33", 632 | "Hong Kong": "91", 633 | "Macao": "92", 634 | "Hong Kong Island": "", 635 | "Kowloon": "KOWLOON", 636 | "New Territories": "NEW TERRITORIES", 637 | }, 638 | "CX": map[string]string{}, 639 | "CC": map[string]string{}, 640 | "CO": map[string]string{ 641 | "Amazonas": "AMA", 642 | "Antioquia": "ANT", 643 | "Arauca": "ARA", 644 | "Atlántico": "ATL", 645 | "Bolívar": "BOL", 646 | "Boyacá": "BOY", 647 | "Caldas": "CAL", 648 | "Caquetá": "CAQ", 649 | "Casanare": "CAS", 650 | "Cauca": "CAU", 651 | "Cesar": "CES", 652 | "Chocó": "CHO", 653 | "Cundinamarca": "CUN", 654 | "Córdoba": "COR", 655 | "Distrito Capital de Bogotá": "DC", 656 | "Guainía": "GUA", 657 | "Guaviare": "GUV", 658 | "Huila": "HUI", 659 | "La Guajira": "LAG", 660 | "Magdalena": "MAG", 661 | "Meta": "MET", 662 | "Nariño": "NAR", 663 | "Norte de Santander": "NSA", 664 | "Putumayo": "PUT", 665 | "Quindío": "QUI", 666 | "Risaralda": "RIS", 667 | "San Andrés, Providencia y Santa Catalina": "SAP", 668 | "Santander": "SAN", 669 | "Sucre": "SUC", 670 | "Tolima": "TOL", 671 | "Valle del Cauca": "VAC", 672 | "Vaupés": "VAU", 673 | "Vichada": "VID", 674 | }, 675 | "KM": map[string]string{ 676 | "Anjouan": "A", 677 | "Grande Comore": "G", 678 | "Mohéli": "M", 679 | }, 680 | "CG": map[string]string{ 681 | "Bouenza": "11", 682 | "Brazzaville": "BZV", 683 | "Cuvette": "8", 684 | "Cuvette-Ouest": "15", 685 | "Kouilou": "5", 686 | "Likouala": "7", 687 | "Lékoumou": "2", 688 | "Niari": "9", 689 | "Plateaux": "14", 690 | "Pointe-Noire": "16", 691 | "Pool": "12", 692 | "Sangha": "13", 693 | }, 694 | "CD": map[string]string{ 695 | "Bandundu": "BN", 696 | "Bas-Congo": "BC", 697 | "Kasai-Occidental": "KW", 698 | "Kasai-Oriental": "KE", 699 | "Katanga": "KA", 700 | "Kinshasa": "KN", 701 | "Maniema": "MA", 702 | "Nord-Kivu": "NK", 703 | "Orientale": "OR", 704 | "Sud-Kivu": "SK", 705 | "Équateur": "EQ", 706 | }, 707 | "CK": map[string]string{}, 708 | "CR": map[string]string{ 709 | "Alajuela": "A", 710 | "Cartago": "C", 711 | "Guanacaste": "G", 712 | "Heredia": "H", 713 | "Limón": "L", 714 | "Puntarenas": "P", 715 | "San José": "SJ", 716 | }, 717 | "HR": map[string]string{ 718 | "Bjelovarsko-bilogorska županija": "07", 719 | "Brodsko-posavska županija": "12", 720 | "Dubrovačko-neretvanska županija": "19", 721 | "Grad Zagreb": "21", 722 | "Istarska županija": "18", 723 | "Karlovačka županija": "04", 724 | "Koprivničko-križevačka županija": "06", 725 | "Krapinsko-zagorska županija": "02", 726 | "Ličko-senjska županija": "09", 727 | "Međimurska županija": "20", 728 | "Osječko-baranjska županija": "14", 729 | "Požeško-slavonska županija": "11", 730 | "Primorsko-goranska županija": "08", 731 | "Sisačko-moslavačka županija": "03", 732 | "Splitsko-dalmatinska županija": "17", 733 | "Varaždinska županija": "05", 734 | "Virovitičko-podravska županija": "10", 735 | "Vukovarsko-srijemska županija": "16", 736 | "Zadarska županija": "13", 737 | "Zagrebačka županija": "01", 738 | "Šibensko-kninska županija": "15", 739 | }, 740 | "CU": map[string]string{ 741 | "Artemisa": "15", 742 | "Camagüey": "09", 743 | "Ciego de Ávila": "08", 744 | "Cienfuegos": "06", 745 | "Granma": "12", 746 | "Guantánamo": "14", 747 | "Holguín": "11", 748 | "Isla de la Juventud": "99", 749 | "La Habana": "03", 750 | "Las Tunas": "10", 751 | "Matanzas": "04", 752 | "Mayabeque": "16", 753 | "Pinar del Río": "01", 754 | "Sancti Spíritus": "07", 755 | "Santiago de Cuba": "13", 756 | "Villa Clara": "05", 757 | }, 758 | "CW": map[string]string{}, 759 | "CY": map[string]string{ 760 | "Ammochostos": "04", 761 | "Keryneia": "06", 762 | "Larnaka": "03", 763 | "Lefkosia": "01", 764 | "Lemesos": "02", 765 | "Pafos": "05", 766 | }, 767 | "CZ": map[string]string{ 768 | "Jihomoravský kraj": "JM", 769 | "Jihočeský kraj": "JC", 770 | "Karlovarský kraj": "KA", 771 | "Královéhradecký kraj": "KR", 772 | "Liberecký kraj": "LI", 773 | "Moravskoslezský kraj": "MO", 774 | "Olomoucký kraj": "OL", 775 | "Pardubický kraj": "PA", 776 | "Plzeňský kraj": "PL", 777 | "Praha, hlavní město": "PR", 778 | "Středočeský kraj": "ST", 779 | "Vysočina": "VY", 780 | "Zlínský kraj": "ZL", 781 | "Ústecký kraj": "US", 782 | }, 783 | "DK": map[string]string{ 784 | "Hovedstaden": "84", 785 | "Midtjylland": "82", 786 | "Nordjylland": "81", 787 | "Sjælland": "85", 788 | "Syddanmark": "83", 789 | }, 790 | "DJ": map[string]string{ 791 | "Ali Sabieh": "AS", 792 | "Arta": "AR", 793 | "Dikhil": "DI", 794 | "Djibouti": "DJ", 795 | "Obock": "OB", 796 | "Tadjourah": "TA", 797 | }, 798 | "DM": map[string]string{ 799 | "Saint Andrew": "02", 800 | "Saint David": "03", 801 | "Saint George": "04", 802 | "Saint John": "05", 803 | "Saint Joseph": "06", 804 | "Saint Luke": "07", 805 | "Saint Mark": "08", 806 | "Saint Patrick": "09", 807 | "Saint Paul": "10", 808 | "Saint Peter": "11", 809 | }, 810 | "DO": map[string]string{ 811 | "Cibao Nordeste": "33", 812 | "Cibao Noroeste": "34", 813 | "Cibao Norte": "35", 814 | "Cibao Sur": "36", 815 | "El Valle": "37", 816 | "Enriquillo": "38", 817 | "Higuamo": "39", 818 | "Ozama": "40", 819 | "Valdesia": "41", 820 | "Yuma": "42", 821 | }, 822 | "EC": map[string]string{ 823 | "Azuay": "A", 824 | "Bolívar": "B", 825 | "Carchi": "C", 826 | "Cañar": "F", 827 | "Chimborazo": "H", 828 | "Cotopaxi": "X", 829 | "El Oro": "O", 830 | "Esmeraldas": "E", 831 | "Galápagos": "W", 832 | "Guayas": "G", 833 | "Imbabura": "I", 834 | "Loja": "L", 835 | "Los Ríos": "R", 836 | "Manabí": "M", 837 | "Morona-Santiago": "S", 838 | "Napo": "N", 839 | "Orellana": "D", 840 | "Pastaza": "Y", 841 | "Pichincha": "P", 842 | "Santa Elena": "SE", 843 | "Santo Domingo de los Tsáchilas": "SD", 844 | "Sucumbíos": "U", 845 | "Tungurahua": "T", 846 | "Zamora-Chinchipe": "Z", 847 | }, 848 | "EG": map[string]string{ 849 | "Ad Daqahlīyah": "DK", 850 | "Al Baḩr al Aḩmar": "BA", 851 | "Al Buḩayrah": "BH", 852 | "Al Fayyūm": "FYM", 853 | "Al Gharbīyah": "GH", 854 | "Al Iskandarīyah": "ALX", 855 | "Al Ismāٰīlīyah": "IS", 856 | "Al Jīzah": "GZ", 857 | "Al Minyā": "MN", 858 | "Al Minūfīyah": "MNF", 859 | "Al Qalyūbīyah": "KB", 860 | "Al Qāhirah": "C", 861 | "Al Uqşur": "LX", 862 | "Al Wādī al Jadīd": "WAD", 863 | "As Suways": "SUZ", 864 | "As Sādis min Uktūbar": "SU", 865 | "Ash Sharqīyah": "SHR", 866 | "Aswān": "ASN", 867 | "Asyūţ": "AST", 868 | "Banī Suwayf": "BNS", 869 | "Būr Saٰīd": "PTS", 870 | "Dumyāţ": "DT", 871 | "Janūb Sīnā'": "JS", 872 | "Kafr ash Shaykh": "KFS", 873 | "Maţrūḩ": "MT", 874 | "Qinā": "KN", 875 | "Shamāl Sīnā'": "SIN", 876 | "Sūhāj": "SHG", 877 | "Ḩulwān": "HU", 878 | }, 879 | "SV": map[string]string{ 880 | "Ahuachapán": "AH", 881 | "Cabañas": "CA", 882 | "Chalatenango": "CH", 883 | "Cuscatlán": "CU", 884 | "La Libertad": "LI", 885 | "La Paz": "PA", 886 | "La Unión": "UN", 887 | "Morazán": "MO", 888 | "San Miguel": "SM", 889 | "San Salvador": "SS", 890 | "San Vicente": "SV", 891 | "Santa Ana": "SA", 892 | "Sonsonate": "SO", 893 | "Usulután": "US", 894 | }, 895 | "GQ": map[string]string{ 896 | "Región Continental": "C", 897 | "Región Insular": "I", 898 | }, 899 | "ER": map[string]string{ 900 | "Al Awsaţ": "MA", 901 | "Al Janūbĩ": "DU", 902 | "Ansabā": "AN", 903 | "Janūbī al Baḩrī al Aḩmar": "DK", 904 | "Qāsh-Barkah": "GB", 905 | "Shimālī al Baḩrī al Aḩmar": "SK", 906 | }, 907 | "EE": map[string]string{ 908 | "Harjumaa": "37", 909 | "Hiiumaa": "39", 910 | "Ida-Virumaa": "44", 911 | "Järvamaa": "51", 912 | "Jõgevamaa": "49", 913 | "Lääne-Virumaa": "59", 914 | "Läänemaa": "57", 915 | "Pärnumaa": "67", 916 | "Põlvamaa": "65", 917 | "Raplamaa": "70", 918 | "Saaremaa": "74", 919 | "Tartumaa": "78", 920 | "Valgamaa": "82", 921 | "Viljandimaa": "84", 922 | "Võrumaa": "86", 923 | }, 924 | "ET": map[string]string{ 925 | "Bīnshangul Gumuz": "BE", 926 | "Dirē Dawa": "DD", 927 | "Gambēla Hizboch": "GA", 928 | "Hārerī Hizb": "HA", 929 | "Oromīya": "OR", 930 | "Sumalē": "SO", 931 | "Tigray": "TI", 932 | "YeDebub Bihēroch Bihēreseboch na Hizboch": "SN", 933 | "Ādīs Ābeba": "AA", 934 | "Āfar": "AF", 935 | "Āmara": "AM", 936 | }, 937 | "FK": map[string]string{}, 938 | "FO": map[string]string{}, 939 | "FJ": map[string]string{ 940 | "Central": "C", 941 | "Eastern": "E", 942 | "Northern": "N", 943 | "Rotuma": "R", 944 | "Western": "W", 945 | }, 946 | "FI": map[string]string{ 947 | "Ahvenanmaan maakunta": "01", 948 | "Etelä-Karjala": "02", 949 | "Etelä-Pohjanmaa": "03", 950 | "Etelä-Savo": "04", 951 | "Kainuu": "05", 952 | "Kanta-Häme": "06", 953 | "Keski-Pohjanmaa": "07", 954 | "Keski-Suomi": "08", 955 | "Kymenlaakso": "09", 956 | "Lappi": "10", 957 | "Pirkanmaa": "11", 958 | "Pohjanmaa": "12", 959 | "Pohjois-Karjala": "13", 960 | "Pohjois-Pohjanmaa": "14", 961 | "Pohjois-Savo": "15", 962 | "Päijät-Häme": "16", 963 | "Satakunta": "17", 964 | "Uusimaa": "18", 965 | "Varsinais-Suomi": "19", 966 | }, 967 | "FR": map[string]string{ 968 | "Alsace": "A", 969 | "Aquitaine": "B", 970 | "Auvergne": "C", 971 | "Brittany": "E", 972 | "Burgundy": "D", 973 | "Centre-Val de Loire": "F", 974 | "Champagne-Ardenne": "G", 975 | "Corsica": "H", 976 | "Franche-Comté": "I", 977 | "Languedoc-Roussillon": "K", 978 | "Limousin": "L", 979 | "Lorraine": "M", 980 | "Lower Normandy": "P", 981 | "Midi-Pyrénées": "N", 982 | "Nord-Pas-de-Calais": "O", 983 | "Pays de la Loire": "R", 984 | "Picardy": "S", 985 | "Poitou-Charentes": "T", 986 | "Provence-Alpes-Côte d'Azur": "U", 987 | "Rhône-Alpes": "V", 988 | "Upper Normandy": "Q", 989 | "Île-de-France": "J", 990 | }, 991 | "GF": map[string]string{}, 992 | "PF": map[string]string{}, 993 | "TF": map[string]string{}, 994 | "GA": map[string]string{ 995 | "Estuaire": "1", 996 | "Haut-Ogooué": "2", 997 | "Moyen-Ogooué": "3", 998 | "Ngounié": "4", 999 | "Nyanga": "5", 1000 | "Ogooué-Ivindo": "6", 1001 | "Ogooué-Lolo": "7", 1002 | "Ogooué-Maritime": "8", 1003 | "Woleu-Ntem": "9", 1004 | }, 1005 | "GM": map[string]string{ 1006 | "Banjul": "B", 1007 | "Central River": "M", 1008 | "Lower River": "L", 1009 | "North Bank": "N", 1010 | "Upper River": "U", 1011 | "Western": "W", 1012 | }, 1013 | "GE": map[string]string{ 1014 | "Abkhazia": "AB", 1015 | "Ajaria": "AJ", 1016 | "Guria": "GU", 1017 | "Imereti": "IM", 1018 | "K'akheti": "KA", 1019 | "Kvemo Kartli": "KK", 1020 | "Mtskheta-Mtianeti": "MM", 1021 | "Rach'a-Lechkhumi-Kvemo Svaneti": "RL", 1022 | "Samegrelo-Zemo Svaneti": "SZ", 1023 | "Samtskhe-Javakheti": "SJ", 1024 | "Shida Kartli": "SK", 1025 | "Tbilisi": "TB", 1026 | }, 1027 | "DE": map[string]string{ 1028 | "Baden-Württemberg": "BW", 1029 | "Bayern": "BY", 1030 | "Berlin": "BE", 1031 | "Brandenburg": "BB", 1032 | "Bremen": "HB", 1033 | "Hamburg": "HH", 1034 | "Hessen": "HE", 1035 | "Mecklenburg-Vorpommern": "MV", 1036 | "Niedersachsen": "NI", 1037 | "Nordrhein-Westfalen": "NW", 1038 | "Rheinland-Pfalz": "RP", 1039 | "Saarland": "SL", 1040 | "Sachsen": "SN", 1041 | "Sachsen-Anhalt": "ST", 1042 | "Schleswig-Holstein": "SH", 1043 | "Thüringen": "TH", 1044 | }, 1045 | "GH": map[string]string{ 1046 | "Ashanti": "AH", 1047 | "Brong-Ahafo": "BA", 1048 | "Central": "CP", 1049 | "Eastern": "EP", 1050 | "Greater Accra": "AA", 1051 | "Northern": "NP", 1052 | "Upper East": "UE", 1053 | "Upper West": "UW", 1054 | "Volta": "TV", 1055 | "Western": "WP", 1056 | }, 1057 | "GI": map[string]string{}, 1058 | "GR": map[string]string{ 1059 | "Anatoliki Makedonia kai Thraki": "A", 1060 | "Attiki": "I", 1061 | "Dytiki Ellada": "G", 1062 | "Dytiki Makedonia": "C", 1063 | "Ionia Nisia": "F", 1064 | "Ipeiros": "D", 1065 | "Kentriki Makedonia": "B", 1066 | "Kriti": "M", 1067 | "Notio Aigaio": "L", 1068 | "Peloponnisos": "J", 1069 | "Sterea Ellada": "H", 1070 | "Thessalia": "E", 1071 | "Voreio Aigaio": "K", 1072 | }, 1073 | "GL": map[string]string{ 1074 | "Kommune Kujalleq": "KU", 1075 | "Kommuneqarfik Sermersooq": "SM", 1076 | "Qaasuitsup Kommunia": "QA", 1077 | "Qeqqata Kommunia": "QE", 1078 | }, 1079 | "GD": map[string]string{ 1080 | "Saint Andrew": "01", 1081 | "Saint David": "02", 1082 | "Saint George": "03", 1083 | "Saint John": "04", 1084 | "Saint Mark": "05", 1085 | "Saint Patrick": "06", 1086 | "Southern Grenadine Islands": "10", 1087 | }, 1088 | "GP": map[string]string{}, 1089 | "GU": map[string]string{}, 1090 | "GT": map[string]string{ 1091 | "Alta Verapaz": "AV", 1092 | "Baja Verapaz": "BV", 1093 | "Chimaltenango": "CM", 1094 | "Chiquimula": "CQ", 1095 | "El Progreso": "PR", 1096 | "Escuintla": "ES", 1097 | "Guatemala": "GU", 1098 | "Huehuetenango": "HU", 1099 | "Izabal": "IZ", 1100 | "Jalapa": "JA", 1101 | "Jutiapa": "JU", 1102 | "Petén": "PE", 1103 | "Quetzaltenango": "QZ", 1104 | "Quiché": "QC", 1105 | "Retalhuleu": "RE", 1106 | "Sacatepéquez": "SA", 1107 | "San Marcos": "SM", 1108 | "Santa Rosa": "SR", 1109 | "Sololá": "SO", 1110 | "Suchitepéquez": "SU", 1111 | "Totonicapán": "TO", 1112 | "Zacapa": "ZA", 1113 | }, 1114 | "GG": map[string]string{}, 1115 | "GN": map[string]string{ 1116 | "Boké": "B", 1117 | "Conakry": "C", 1118 | "Faranah": "F", 1119 | "Kankan": "K", 1120 | "Kindia": "D", 1121 | "Labé": "L", 1122 | "Mamou": "M", 1123 | "Nzérékoré": "N", 1124 | }, 1125 | "GW": map[string]string{ 1126 | "Leste": "L", 1127 | "Norte": "N", 1128 | "Sul": "S", 1129 | }, 1130 | "GY": map[string]string{ 1131 | "Barima-Waini": "BA", 1132 | "Cuyuni-Mazaruni": "CU", 1133 | "Demerara-Mahaica": "DE", 1134 | "East Berbice-Corentyne": "EB", 1135 | "Essequibo Islands-West Demerara": "ES", 1136 | "Mahaica-Berbice": "MA", 1137 | "Pomeroon-Supenaam": "PM", 1138 | "Potaro-Siparuni": "PT", 1139 | "Upper Demerara-Berbice": "UD", 1140 | "Upper Takutu-Upper Essequibo": "UT", 1141 | }, 1142 | "HT": map[string]string{ 1143 | "Artibonite": "AR", 1144 | "Centre": "CE", 1145 | "Grande-Anse": "GA", 1146 | "Nippes": "NI", 1147 | "Nord": "ND", 1148 | "Nord-Est": "NE", 1149 | "Nord-Ouest": "NO", 1150 | "Ouest": "OU", 1151 | "Sud": "SD", 1152 | "Sud-Est": "SE", 1153 | }, 1154 | "HM": map[string]string{}, 1155 | "VA": map[string]string{}, 1156 | "HN": map[string]string{ 1157 | "Atlántida": "AT", 1158 | "Choluteca": "CH", 1159 | "Colón": "CL", 1160 | "Comayagua": "CM", 1161 | "Copán": "CP", 1162 | "Cortés": "CR", 1163 | "El Paraíso": "EP", 1164 | "Francisco Morazán": "FM", 1165 | "Gracias a Dios": "GD", 1166 | "Intibucá": "IN", 1167 | "Islas de la Bahía": "IB", 1168 | "La Paz": "LP", 1169 | "Lempira": "LE", 1170 | "Ocotepeque": "OC", 1171 | "Olancho": "OL", 1172 | "Santa Bárbara": "SB", 1173 | "Valle": "VA", 1174 | "Yoro": "YO", 1175 | }, 1176 | "HK": map[string]string{}, 1177 | "HU": map[string]string{ 1178 | "Baranya": "BA", 1179 | "Borsod-Abaúj-Zemplén": "BZ", 1180 | "Budapest": "BU", 1181 | "Bács-Kiskun": "BK", 1182 | "Békés": "BE", 1183 | "Békéscsaba": "BC", 1184 | "Csongrád": "CS", 1185 | "Debrecen": "DE", 1186 | "Dunaújváros": "DU", 1187 | "Eger": "EG", 1188 | "Fejér": "FE", 1189 | "Győr": "GY", 1190 | "Győr-Moson-Sopron": "GS", 1191 | "Hajdú-Bihar": "HB", 1192 | "Heves": "HE", 1193 | "Hódmezővásárhely": "HV", 1194 | "Jász-Nagykun-Szolnok": "JN", 1195 | "Kaposvár": "KV", 1196 | "Kecskemét": "KM", 1197 | "Komárom-Esztergom": "KE", 1198 | "Miskolc": "MI", 1199 | "Nagykanizsa": "NK", 1200 | "Nyíregyháza": "NY", 1201 | "Nógrád": "NO", 1202 | "Pest": "PE", 1203 | "Pécs": "PS", 1204 | "Salgótarján": "ST", 1205 | "Somogy": "SO", 1206 | "Sopron": "SN", 1207 | "Szabolcs-Szatmár-Bereg": "SZ", 1208 | "Szeged": "SD", 1209 | "Szekszárd": "SS", 1210 | "Szolnok": "SK", 1211 | "Szombathely": "SH", 1212 | "Székesfehérvár": "SF", 1213 | "Tatabánya": "TB", 1214 | "Tolna": "TO", 1215 | "Vas": "VA", 1216 | "Veszprém": "VM", 1217 | "Zala": "ZA", 1218 | "Zalaegerszeg": "ZE", 1219 | "Érd": "ER", 1220 | }, 1221 | "IS": map[string]string{ 1222 | "Austurland": "7", 1223 | "Höfuðborgarsvæði utan Reykjavíkur": "1", 1224 | "Norðurland eystra": "6", 1225 | "Norðurland vestra": "5", 1226 | "Reykjavík": "0", 1227 | "Suðurland": "8", 1228 | "Suðurnes": "2", 1229 | "Vestfirðir": "4", 1230 | "Vesturland": "3", 1231 | }, 1232 | "IN": map[string]string{ 1233 | "Andaman and Nicobar Islands": "AN", 1234 | "Chandigarh": "CH", 1235 | "Dadra and Nagar Haveli": "DN", 1236 | "Daman and Diu": "DD", 1237 | "Delhi": "DL", 1238 | "Lakshadweep": "LD", 1239 | "Puducherry": "PY", 1240 | "Andhra Pradesh": "AP", 1241 | "Arunachal Pradesh": "AR", 1242 | "Assam": "AS", 1243 | "Bihar": "BR", 1244 | "Chhattisgarh": "CT", 1245 | "Goa": "GA", 1246 | "Gujarat": "GJ", 1247 | "Haryana": "HR", 1248 | "Himachal Pradesh": "HP", 1249 | "Jammu and Kashmir": "JK", 1250 | "Jharkhand": "JH", 1251 | "Karnataka": "KA", 1252 | "Kerala": "KL", 1253 | "Madhya Pradesh": "MP", 1254 | "Maharashtra": "MH", 1255 | "Manipur": "MN", 1256 | "Meghalaya": "ML", 1257 | "Mizoram": "MZ", 1258 | "Nagaland": "NL", 1259 | "Odisha": "OR", 1260 | "Punjab": "PB", 1261 | "Rajasthan": "RJ", 1262 | "Sikkim": "SK", 1263 | "Tamil Nadu": "TN", 1264 | "Telangana": "TG", 1265 | "Tripura": "TR", 1266 | "Uttar Pradesh": "UP", 1267 | "Uttarakhand": "UT", 1268 | "West Bengal": "WB", 1269 | }, 1270 | "ID": map[string]string{ 1271 | "Jawa": "JW", 1272 | "Kalimantan": "KA", 1273 | "Maluku": "ML", 1274 | "Nusa Tenggara": "NU", 1275 | "Papua": "PP", 1276 | "Sulawesi": "SL", 1277 | "Sumatera": "SM", 1278 | }, 1279 | "CI": map[string]string{ 1280 | "18 Montagnes": "06", 1281 | "Agnébi": "16", 1282 | "Bafing": "17", 1283 | "Bas-Sassandra": "09", 1284 | "Denguélé": "10", 1285 | "Fromager": "18", 1286 | "Haut-Sassandra": "02", 1287 | "Lacs": "07", 1288 | "Lagunes": "01", 1289 | "Marahoué": "12", 1290 | "Moyen-Cavally": "19", 1291 | "Moyen-Comoé": "05", 1292 | "Nzi-Comoé": "11", 1293 | "Savanes": "03", 1294 | "Sud-Bandama": "15", 1295 | "Sud-Comoé": "13", 1296 | "Vallée du Bandama": "04", 1297 | "Worodougou": "14", 1298 | "Zanzan": "08", 1299 | }, 1300 | "IR": map[string]string{ 1301 | "Alborz": "32", 1302 | "Ardabīl": "03", 1303 | "Būshehr": "06", 1304 | "Chahār Maḩāll va Bakhtīārī": "08", 1305 | "Eşfahān": "04", 1306 | "Fārs": "14", 1307 | "Golestān": "27", 1308 | "Gīlān": "19", 1309 | "Hamadān": "24", 1310 | "Hormozgān": "23", 1311 | "Kermān": "15", 1312 | "Kermānshāh": "17", 1313 | "Khorāsān-e Janūbī": "29", 1314 | "Khorāsān-e Razavī": "30", 1315 | "Khorāsān-e Shemālī": "31", 1316 | "Khūzestān": "10", 1317 | "Kohgīlūyeh va Būyer Aḩmad": "18", 1318 | "Kordestān": "16", 1319 | "Lorestān": "20", 1320 | "Markazī": "22", 1321 | "Māzandarān": "21", 1322 | "Qazvīn": "28", 1323 | "Qom": "26", 1324 | "Semnān": "12", 1325 | "Sīstān va Balūchestān": "13", 1326 | "Tehrān": "07", 1327 | "Yazd": "25", 1328 | "Zanjān": "11", 1329 | "Āz̄arbāyjān-e Gharbī": "02", 1330 | "Āz̄arbāyjān-e Sharqī": "01", 1331 | "Īlām": "05", 1332 | }, 1333 | "IQ": map[string]string{ 1334 | "Al Anbār": "AN", 1335 | "Al Başrah": "BA", 1336 | "Al Muthanná": "MU", 1337 | "Al Qādisīyah": "QA", 1338 | "An Najaf": "NA", 1339 | "Arbīl": "AR", 1340 | "As Sulaymānīyah": "SU", 1341 | "At Ta'mīm": "TS", 1342 | "Baghdād": "BG", 1343 | "Bābil": "BB", 1344 | "Dahūk": "DA", 1345 | "Dhī Qār": "DQ", 1346 | "Diyālá": "DI", 1347 | "Karbalā'": "KA", 1348 | "Maysān": "MA", 1349 | "Nīnawá": "NI", 1350 | "Wāsiţ": "WA", 1351 | "Şalāḩ ad Dīn": "SD", 1352 | }, 1353 | "IE": map[string]string{ 1354 | "Connaught": "C", 1355 | "Leinster": "L", 1356 | "Munster": "M", 1357 | "Ulster": "U", 1358 | }, 1359 | "IM": map[string]string{}, 1360 | "IL": map[string]string{ 1361 | "HaDarom": "D", 1362 | "HaMerkaz": "M", 1363 | "HaTsafon": "Z", 1364 | "H̱efa": "HA", 1365 | "Tel-Aviv": "TA", 1366 | "Yerushalayim": "JM", 1367 | }, 1368 | "IT": map[string]string{ 1369 | "Abruzzo": "65", 1370 | "Basilicata": "77", 1371 | "Calabria": "78", 1372 | "Campania": "72", 1373 | "Emilia-Romagna": "45", 1374 | "Friuli-Venezia Giulia": "36", 1375 | "Lazio": "62", 1376 | "Liguria": "42", 1377 | "Lombardia": "25", 1378 | "Marche": "57", 1379 | "Molise": "67", 1380 | "Piemonte": "21", 1381 | "Puglia": "75", 1382 | "Sardegna": "88", 1383 | "Sicilia": "82", 1384 | "Toscana": "52", 1385 | "Trentino-Alto Adige": "32", 1386 | "Umbria": "55", 1387 | "Valle d'Aosta": "23", 1388 | "Veneto": "34", 1389 | }, 1390 | "JM": map[string]string{ 1391 | "Clarendon": "13", 1392 | "Hanover": "09", 1393 | "Kingston": "01", 1394 | "Manchester": "12", 1395 | "Portland": "04", 1396 | "Saint Andrew": "02", 1397 | "Saint Ann": "06", 1398 | "Saint Catherine": "14", 1399 | "Saint Elizabeth": "11", 1400 | "Saint James": "08", 1401 | "Saint Mary": "05", 1402 | "Saint Thomas": "03", 1403 | "Trelawny": "07", 1404 | "Westmoreland": "10", 1405 | }, 1406 | "JP": map[string]string{ 1407 | "Aiti": "23", 1408 | "Akita": "05", 1409 | "Aomori": "02", 1410 | "Ehime": "38", 1411 | "Gihu": "21", 1412 | "Gunma": "10", 1413 | "Hirosima": "34", 1414 | "Hokkaidô": "01", 1415 | "Hukui": "18", 1416 | "Hukuoka": "40", 1417 | "Hukusima": "07", 1418 | "Hyôgo": "28", 1419 | "Ibaraki": "08", 1420 | "Isikawa": "17", 1421 | "Iwate": "03", 1422 | "Kagawa": "37", 1423 | "Kagosima": "46", 1424 | "Kanagawa": "14", 1425 | "Kumamoto": "43", 1426 | "Kyôto": "26", 1427 | "Kôti": "39", 1428 | "Mie": "24", 1429 | "Miyagi": "04", 1430 | "Miyazaki": "45", 1431 | "Nagano": "20", 1432 | "Nagasaki": "42", 1433 | "Nara": "29", 1434 | "Niigata": "15", 1435 | "Okayama": "33", 1436 | "Okinawa": "47", 1437 | "Saga": "41", 1438 | "Saitama": "11", 1439 | "Siga": "25", 1440 | "Simane": "32", 1441 | "Sizuoka": "22", 1442 | "Tiba": "12", 1443 | "Tokusima": "36", 1444 | "Totigi": "09", 1445 | "Tottori": "31", 1446 | "Toyama": "16", 1447 | "Tôkyô": "13", 1448 | "Wakayama": "30", 1449 | "Yamagata": "06", 1450 | "Yamaguti": "35", 1451 | "Yamanasi": "19", 1452 | "Ôita": "44", 1453 | "Ôsaka": "27", 1454 | }, 1455 | "JE": map[string]string{}, 1456 | "JO": map[string]string{ 1457 | "Al Balqā'": "BA", 1458 | "Al ʽAqabah": "AQ", 1459 | "Az Zarqā'": "AZ", 1460 | "Aţ Ţafīlah": "AT", 1461 | "Irbid": "IR", 1462 | "Jerash": "JA", 1463 | "Karak": "KA", 1464 | "Ma'ān": "MN", 1465 | "Mafraq": "MA", 1466 | "Mādabā": "MD", 1467 | "ʽAjlūn": "AJ", 1468 | "‘Ammān": "AM", 1469 | }, 1470 | "KZ": map[string]string{ 1471 | "Almaty": "ALA", 1472 | "Almaty oblysy": "ALM", 1473 | "Aqmola oblysy": "AKM", 1474 | "Aqtöbe oblysy": "AKT", 1475 | "Astana": "AST", 1476 | "Atyraū oblysy": "ATY", 1477 | "Batys Qazaqstan oblysy": "ZAP", 1478 | "Mangghystaū oblysy": "MAN", 1479 | "Ongtüstik Qazaqstan oblysy": "YUZ", 1480 | "Pavlodar oblysy": "PAV", 1481 | "Qaraghandy oblysy": "KAR", 1482 | "Qostanay oblysy": "KUS", 1483 | "Qyzylorda oblysy": "KZY", 1484 | "Shyghys Qazaqstan oblysy": "VOS", 1485 | "Soltüstik Qazaqstan oblysy": "SEV", 1486 | "Zhambyl oblysy": "ZHA", 1487 | }, 1488 | "KE": map[string]string{ 1489 | "Central": "200", 1490 | "Coast": "300", 1491 | "Eastern": "400", 1492 | "Nairobi": "110", 1493 | "North-Eastern": "500", 1494 | "Nyanza": "600", 1495 | "Rift Valley": "700", 1496 | "Western": "800", 1497 | }, 1498 | "KI": map[string]string{ 1499 | "Gilbert Islands": "G", 1500 | "Line Islands": "L", 1501 | "Phoenix Islands": "P", 1502 | }, 1503 | "KW": map[string]string{ 1504 | "Al Aḩmadi": "AH", 1505 | "Al Farwānīyah": "FA", 1506 | "Al Jahrā’": "JA", 1507 | "Al Kuwayt": "KU", 1508 | "Mubārak al Kabīr": "MU", 1509 | "Ḩawallī": "HA", 1510 | }, 1511 | "KG": map[string]string{ 1512 | "Batken": "B", 1513 | "Bishkek": "GB", 1514 | "Chü": "C", 1515 | "Jalal-Abad": "J", 1516 | "Naryn": "N", 1517 | "Osh": "O", 1518 | "Talas": "T", 1519 | "Ysyk-Köl": "Y", 1520 | }, 1521 | "LA": map[string]string{ 1522 | "Attapu": "AT", 1523 | "Bokèo": "BK", 1524 | "Bolikhamxai": "BL", 1525 | "Champasak": "CH", 1526 | "Houaphan": "HO", 1527 | "Khammouan": "KH", 1528 | "Louang Namtha": "LM", 1529 | "Louangphabang": "LP", 1530 | "Oudômxai": "OU", 1531 | "Phôngsali": "PH", 1532 | "Salavan": "SL", 1533 | "Savannakhét": "SV", 1534 | "Vientiane": "VI", 1535 | "Xaignabouli": "XA", 1536 | "Xaisômboun": "XN", 1537 | "Xiangkhoang": "XI", 1538 | "Xékong": "XE", 1539 | }, 1540 | "LV": map[string]string{ 1541 | "Aglonas novads": "001", 1542 | "Aizkraukles novads": "002", 1543 | "Aizputes novads": "003", 1544 | "Aknīstes novads": "004", 1545 | "Alojas novads": "005", 1546 | "Alsungas novads": "006", 1547 | "Alūksnes novads": "007", 1548 | "Amatas novads": "008", 1549 | "Apes novads": "009", 1550 | "Auces novads": "010", 1551 | "Babītes novads": "012", 1552 | "Baldones novads": "013", 1553 | "Baltinavas novads": "014", 1554 | "Balvu novads": "015", 1555 | "Bauskas novads": "016", 1556 | "Beverīnas novads": "017", 1557 | "Brocēnu novads": "018", 1558 | "Burtnieku novads": "019", 1559 | "Carnikavas novads": "020", 1560 | "Cesvaines novads": "021", 1561 | "Ciblas novads": "023", 1562 | "Cēsu novads": "022", 1563 | "Dagdas novads": "024", 1564 | "Daugavpils": "DGV", 1565 | "Daugavpils novads": "025", 1566 | "Dobeles novads": "026", 1567 | "Dundagas novads": "027", 1568 | "Durbes novads": "028", 1569 | "Engures novads": "029", 1570 | "Garkalnes novads": "031", 1571 | "Grobiņas novads": "032", 1572 | "Gulbenes novads": "033", 1573 | "Iecavas novads": "034", 1574 | "Ikšķiles novads": "035", 1575 | "Ilūkstes novads": "036", 1576 | "Inčukalna novads": "037", 1577 | "Jaunjelgavas novads": "038", 1578 | "Jaunpiebalgas novads": "039", 1579 | "Jaunpils novads": "040", 1580 | "Jelgava": "JEL", 1581 | "Jelgavas novads": "041", 1582 | "Jēkabpils": "JKB", 1583 | "Jēkabpils novads": "042", 1584 | "Jūrmala": "JUR", 1585 | "Kandavas novads": "043", 1586 | "Kocēnu novads": "045", 1587 | "Kokneses novads": "046", 1588 | "Krimuldas novads": "048", 1589 | "Krustpils novads": "049", 1590 | "Krāslavas novads": "047", 1591 | "Kuldīgas novads": "050", 1592 | "Kārsavas novads": "044", 1593 | "Lielvārdes novads": "053", 1594 | "Liepāja": "LPX", 1595 | "Limbažu novads": "054", 1596 | "Lubānas novads": "057", 1597 | "Ludzas novads": "058", 1598 | "Līgatnes novads": "055", 1599 | "Līvānu novads": "056", 1600 | "Madonas novads": "059", 1601 | "Mazsalacas novads": "060", 1602 | "Mālpils novads": "061", 1603 | "Mārupes novads": "062", 1604 | "Mērsraga novads": "063", 1605 | "Naukšēnu novads": "064", 1606 | "Neretas novads": "065", 1607 | "Nīcas novads": "066", 1608 | "Ogres novads": "067", 1609 | "Olaines novads": "068", 1610 | "Ozolnieku novads": "069", 1611 | "Preiļu novads": "073", 1612 | "Priekules novads": "074", 1613 | "Priekuļu novads": "075", 1614 | "Pārgaujas novads": "070", 1615 | "Pāvilostas novads": "071", 1616 | "Pļaviņu novads": "072", 1617 | "Raunas novads": "076", 1618 | "Riebiņu novads": "078", 1619 | "Rojas novads": "079", 1620 | "Ropažu novads": "080", 1621 | "Rucavas novads": "081", 1622 | "Rugāju novads": "082", 1623 | "Rundāles novads": "083", 1624 | "Rēzekne": "REZ", 1625 | "Rēzeknes novads": "077", 1626 | "Rīga": "RIX", 1627 | "Rūjienas novads": "084", 1628 | "Salacgrīvas novads": "086", 1629 | "Salas novads": "085", 1630 | "Salaspils novads": "087", 1631 | "Saldus novads": "088", 1632 | "Saulkrastu novads": "089", 1633 | "Siguldas novads": "091", 1634 | "Skrundas novads": "093", 1635 | "Skrīveru novads": "092", 1636 | "Smiltenes novads": "094", 1637 | "Stopiņu novads": "095", 1638 | "Strenču novads": "096", 1639 | "Sējas novads": "090", 1640 | "Talsu novads": "097", 1641 | "Tukuma novads": "099", 1642 | "Tērvetes novads": "098", 1643 | "Vaiņodes novads": "100", 1644 | "Valkas novads": "101", 1645 | "Valmiera": "VMR", 1646 | "Varakļānu novads": "102", 1647 | "Vecpiebalgas novads": "104", 1648 | "Vecumnieku novads": "105", 1649 | "Ventspils": "VEN", 1650 | "Ventspils novads": "106", 1651 | "Viesītes novads": "107", 1652 | "Viļakas novads": "108", 1653 | "Viļānu novads": "109", 1654 | "Vārkavas novads": "103", 1655 | "Zilupes novads": "110", 1656 | "Ādažu novads": "011", 1657 | "Ērgļu novads": "030", 1658 | "Ķeguma novads": "051", 1659 | "Ķekavas novads": "052", 1660 | }, 1661 | "LB": map[string]string{ 1662 | "Aakkâr": "AK", 1663 | "Baalbek-Hermel": "BH", 1664 | "Beyrouth": "BA", 1665 | "Béqaa": "BI", 1666 | "Liban-Nord": "AS", 1667 | "Liban-Sud": "JA", 1668 | "Mont-Liban": "JL", 1669 | "Nabatîyé": "NA", 1670 | }, 1671 | "LS": map[string]string{ 1672 | "Berea": "D", 1673 | "Butha-Buthe": "B", 1674 | "Leribe": "C", 1675 | "Mafeteng": "E", 1676 | "Maseru": "A", 1677 | "Mohale's Hoek": "F", 1678 | "Mokhotlong": "J", 1679 | "Qacha's Nek": "H", 1680 | "Quthing": "G", 1681 | "Thaba-Tseka": "K", 1682 | }, 1683 | "LR": map[string]string{ 1684 | "Bomi": "BM", 1685 | "Bong": "BG", 1686 | "Gbarpolu": "GP", 1687 | "Grand Bassa": "GB", 1688 | "Grand Cape Mount": "CM", 1689 | "Grand Gedeh": "GG", 1690 | "Grand Kru": "GK", 1691 | "Lofa": "LO", 1692 | "Margibi": "MG", 1693 | "Maryland": "MY", 1694 | "Montserrado": "MO", 1695 | "Nimba": "NI", 1696 | "River Gee": "RG", 1697 | "Rivercess": "RI", 1698 | "Sinoe": "SI", 1699 | }, 1700 | "LY": map[string]string{ 1701 | "Al Buţnān": "BU", 1702 | "Al Jabal al Akhḑar": "JA", 1703 | "Al Jabal al Gharbī": "JG", 1704 | "Al Jifārah": "JI", 1705 | "Al Jufrah": "JU", 1706 | "Al Kufrah": "KF", 1707 | "Al Marj": "MJ", 1708 | "Al Marqab": "MB", 1709 | "Al Wāḩāt": "WA", 1710 | "An Nuqaţ al Khams": "NQ", 1711 | "Az Zāwiyah": "ZA", 1712 | "Banghāzī": "BA", 1713 | "Darnah": "DR", 1714 | "Ghāt": "GT", 1715 | "Mişrātah": "MI", 1716 | "Murzuq": "MQ", 1717 | "Nālūt": "NL", 1718 | "Sabhā": "SB", 1719 | "Surt": "SR", 1720 | "Wādī al Ḩayāt": "WD", 1721 | "Wādī ash Shāţiʾ": "WS", 1722 | "Ţarābulus": "TB", 1723 | }, 1724 | "LI": map[string]string{ 1725 | "Balzers": "01", 1726 | "Eschen": "02", 1727 | "Gamprin": "03", 1728 | "Mauren": "04", 1729 | "Planken": "05", 1730 | "Ruggell": "06", 1731 | "Schaan": "07", 1732 | "Schellenberg": "08", 1733 | "Triesen": "09", 1734 | "Triesenberg": "10", 1735 | "Vaduz": "11", 1736 | }, 1737 | "LT": map[string]string{ 1738 | "Alytaus Apskritis": "AL", 1739 | "Kauno Apskritis": "KU", 1740 | "Klaipėdos Apskritis": "KL", 1741 | "Marijampolės Apskritis": "MR", 1742 | "Panevėžio Apskritis": "PN", 1743 | "Tauragės Apskritis": "TA", 1744 | "Telšių Apskritis": "TE", 1745 | "Utenos Apskritis": "UT", 1746 | "Vilniaus Apskritis": "VL", 1747 | "Šiaulių Apskritis": "SA", 1748 | }, 1749 | "LU": map[string]string{ 1750 | "Diekirch": "D", 1751 | "Grevenmacher": "G", 1752 | "Luxembourg": "L", 1753 | }, 1754 | "MO": map[string]string{}, 1755 | "MK": map[string]string{ 1756 | "Aerodrom": "01", 1757 | "Aračinovo": "02", 1758 | "Berovo": "03", 1759 | "Bitola": "04", 1760 | "Bogdanci": "05", 1761 | "Bogovinje": "06", 1762 | "Bosilovo": "07", 1763 | "Brvenica": "08", 1764 | "Butel": "09", 1765 | "Centar": "77", 1766 | "Centar Župa": "78", 1767 | "Debar": "21", 1768 | "Debarca": "22", 1769 | "Delčevo": "23", 1770 | "Demir Hisar": "25", 1771 | "Demir Kapija": "24", 1772 | "Dojran": "26", 1773 | "Dolneni": "27", 1774 | "Drugovo": "28", 1775 | "Gazi Baba": "17", 1776 | "Gevgelija": "18", 1777 | "Gjorče Petrov": "29", 1778 | "Gostivar": "19", 1779 | "Gradsko": "20", 1780 | "Ilinden": "34", 1781 | "Jegunovce": "35", 1782 | "Karbinci": "37", 1783 | "Karpoš": "38", 1784 | "Kavadarci": "36", 1785 | "Kisela Voda": "39", 1786 | "Kičevo": "40", 1787 | "Konče": "41", 1788 | "Kočani": "42", 1789 | "Kratovo": "43", 1790 | "Kriva Palanka": "44", 1791 | "Krivogaštani": "45", 1792 | "Kruševo": "46", 1793 | "Kumanovo": "47", 1794 | "Lipkovo": "48", 1795 | "Lozovo": "49", 1796 | "Makedonska Kamenica": "51", 1797 | "Makedonski Brod": "52", 1798 | "Mavrovo i Rostuša": "50", 1799 | "Mogila": "53", 1800 | "Negotino": "54", 1801 | "Novaci": "55", 1802 | "Novo Selo": "56", 1803 | "Ohrid": "58", 1804 | "Oslomej": "57", 1805 | "Pehčevo": "60", 1806 | "Petrovec": "59", 1807 | "Plasnica": "61", 1808 | "Prilep": "62", 1809 | "Probištip": "63", 1810 | "Radoviš": "64", 1811 | "Rankovce": "65", 1812 | "Resen": "66", 1813 | "Rosoman": "67", 1814 | "Saraj": "68", 1815 | "Sopište": "70", 1816 | "Staro Nagoričane": "71", 1817 | "Struga": "72", 1818 | "Strumica": "73", 1819 | "Studeničani": "74", 1820 | "Sveti Nikole": "69", 1821 | "Tearce": "75", 1822 | "Tetovo": "76", 1823 | "Valandovo": "10", 1824 | "Vasilevo": "11", 1825 | "Veles": "13", 1826 | "Vevčani": "12", 1827 | "Vinica": "14", 1828 | "Vraneštica": "15", 1829 | "Vrapčište": "16", 1830 | "Zajas": "31", 1831 | "Zelenikovo": "32", 1832 | "Zrnovci": "33", 1833 | "Čair": "79", 1834 | "Čaška": "80", 1835 | "Češinovo-Obleševo": "81", 1836 | "Čučer Sandevo": "82", 1837 | "Štip": "83", 1838 | "Šuto Orizari": "84", 1839 | "Želino": "30", 1840 | }, 1841 | "MG": map[string]string{ 1842 | "Antananarivo": "T", 1843 | "Antsiranana": "D", 1844 | "Fianarantsoa": "F", 1845 | "Mahajanga": "M", 1846 | "Toamasina": "A", 1847 | "Toliara": "U", 1848 | }, 1849 | "MW": map[string]string{ 1850 | "Central Region": "C", 1851 | "Northern Region": "N", 1852 | "Southern Region": "S", 1853 | }, 1854 | "MY": map[string]string{ 1855 | "Wilayah Persekutuan Kuala Lumpur": "14", 1856 | "Wilayah Persekutuan Labuan": "15", 1857 | "Wilayah Persekutuan Putrajaya": "16", 1858 | "Johor": "01", 1859 | "Kedah": "02", 1860 | "Kelantan": "03", 1861 | "Melaka": "04", 1862 | "Negeri Sembilan": "05", 1863 | "Pahang": "06", 1864 | "Perak": "08", 1865 | "Perlis": "09", 1866 | "Pulau Pinang": "07", 1867 | "Sabah": "12", 1868 | "Sarawak": "13", 1869 | "Selangor": "10", 1870 | "Terengganu": "11", 1871 | }, 1872 | "MV": map[string]string{ 1873 | "Central": "CE", 1874 | "Male": "MLE", 1875 | "North": "NO", 1876 | "North Central": "NC", 1877 | "South": "SU", 1878 | "South Central": "SC", 1879 | "Upper North": "UN", 1880 | "Upper South": "US", 1881 | }, 1882 | "ML": map[string]string{ 1883 | "Bamako": "BKO", 1884 | "Gao": "7", 1885 | "Kayes": "1", 1886 | "Kidal": "8", 1887 | "Koulikoro": "2", 1888 | "Mopti": "5", 1889 | "Sikasso": "3", 1890 | "Ségou": "4", 1891 | "Tombouctou": "6", 1892 | }, 1893 | "MT": map[string]string{ 1894 | "Attard": "01", 1895 | "Balzan": "02", 1896 | "Birgu": "03", 1897 | "Birkirkara": "04", 1898 | "Birżebbuġa": "05", 1899 | "Bormla": "06", 1900 | "Dingli": "07", 1901 | "Fgura": "08", 1902 | "Floriana": "09", 1903 | "Fontana": "10", 1904 | "Gudja": "11", 1905 | "Għajnsielem": "13", 1906 | "Għarb": "14", 1907 | "Għargħur": "15", 1908 | "Għasri": "16", 1909 | "Għaxaq": "17", 1910 | "Gżira": "12", 1911 | "Iklin": "19", 1912 | "Isla": "20", 1913 | "Kalkara": "21", 1914 | "Kerċem": "22", 1915 | "Kirkop": "23", 1916 | "Lija": "24", 1917 | "Luqa": "25", 1918 | "Marsa": "26", 1919 | "Marsaskala": "27", 1920 | "Marsaxlokk": "28", 1921 | "Mdina": "29", 1922 | "Mellieħa": "30", 1923 | "Mosta": "32", 1924 | "Mqabba": "33", 1925 | "Msida": "34", 1926 | "Mtarfa": "35", 1927 | "Munxar": "36", 1928 | "Mġarr": "31", 1929 | "Nadur": "37", 1930 | "Naxxar": "38", 1931 | "Paola": "39", 1932 | "Pembroke": "40", 1933 | "Pietà": "41", 1934 | "Qala": "42", 1935 | "Qormi": "43", 1936 | "Qrendi": "44", 1937 | "Rabat Għawdex": "45", 1938 | "Rabat Malta": "46", 1939 | "Safi": "47", 1940 | "San Lawrenz": "50", 1941 | "San Pawl il-Baħar": "51", 1942 | "San Ġiljan": "48", 1943 | "San Ġwann": "49", 1944 | "Sannat": "52", 1945 | "Santa Luċija": "53", 1946 | "Santa Venera": "54", 1947 | "Siġġiewi": "55", 1948 | "Sliema": "56", 1949 | "Swieqi": "57", 1950 | "Ta' Xbiex": "58", 1951 | "Tarxien": "59", 1952 | "Valletta": "60", 1953 | "Xagħra": "61", 1954 | "Xewkija": "62", 1955 | "Xgħajra": "63", 1956 | "Ħamrun": "18", 1957 | "Żabbar": "64", 1958 | "Żebbuġ Għawdex": "65", 1959 | "Żebbuġ Malta": "66", 1960 | "Żejtun": "67", 1961 | "Żurrieq": "68", 1962 | }, 1963 | "MH": map[string]string{ 1964 | "Ralik chain": "L", 1965 | "Ratak chain": "T", 1966 | }, 1967 | "MQ": map[string]string{}, 1968 | "MR": map[string]string{ 1969 | "Adrar": "07", 1970 | "Assaba": "03", 1971 | "Brakna": "05", 1972 | "Dakhlet Nouâdhibou": "08", 1973 | "Gorgol": "04", 1974 | "Guidimaka": "10", 1975 | "Hodh ech Chargui": "01", 1976 | "Hodh el Gharbi": "02", 1977 | "Inchiri": "12", 1978 | "Nouakchott": "NKC", 1979 | "Tagant": "09", 1980 | "Tiris Zemmour": "11", 1981 | "Trarza": "06", 1982 | }, 1983 | "MU": map[string]string{ 1984 | "Agalega Islands": "AG", 1985 | "Beau Bassin-Rose Hill": "BR", 1986 | "Black River": "BL", 1987 | "Cargados Carajos Shoals": "CC", 1988 | "Curepipe": "CU", 1989 | "Flacq": "FL", 1990 | "Grand Port": "GP", 1991 | "Moka": "MO", 1992 | "Pamplemousses": "PA", 1993 | "Plaines Wilhems": "PW", 1994 | "Port Louis": "PU", 1995 | "Quatre Bornes": "QB", 1996 | "Rivière du Rempart": "RR", 1997 | "Rodrigues Island": "RO", 1998 | "Savanne": "SA", 1999 | "Vacoas-Phoenix": "VP", 2000 | }, 2001 | "YT": map[string]string{}, 2002 | "MX": map[string]string{ 2003 | "Distrito Federal": "DIF", 2004 | "Aguascalientes": "AGU", 2005 | "Baja California": "BCN", 2006 | "Baja California Sur": "BCS", 2007 | "Campeche": "CAM", 2008 | "Chiapas": "CHP", 2009 | "Chihuahua": "CHH", 2010 | "Coahuila": "COA", 2011 | "Colima": "COL", 2012 | "Durango": "DUR", 2013 | "Guanajuato": "GUA", 2014 | "Guerrero": "GRO", 2015 | "Hidalgo": "HID", 2016 | "Jalisco": "JAL", 2017 | "Michoacán": "MIC", 2018 | "Morelos": "MOR", 2019 | "México": "MEX", 2020 | "Nayarit": "NAY", 2021 | "Nuevo León": "NLE", 2022 | "Oaxaca": "OAX", 2023 | "Puebla": "PUE", 2024 | "Querétaro": "QUE", 2025 | "Quintana Roo": "ROO", 2026 | "San Luis Potosí": "SLP", 2027 | "Sinaloa": "SIN", 2028 | "Sonora": "SON", 2029 | "Tabasco": "TAB", 2030 | "Tamaulipas": "TAM", 2031 | "Tlaxcala": "TLA", 2032 | "Veracruz": "VER", 2033 | "Yucatán": "YUC", 2034 | "Zacatecas": "ZAC", 2035 | }, 2036 | "FM": map[string]string{ 2037 | "Chuuk": "TRK", 2038 | "Kosrae": "KSA", 2039 | "Pohnpei": "PNI", 2040 | "Yap": "YAP", 2041 | }, 2042 | "MD": map[string]string{ 2043 | "Anenii Noi": "AN", 2044 | "Basarabeasca": "BS", 2045 | "Briceni": "BR", 2046 | "Bălţi": "BA", 2047 | "Cahul": "CA", 2048 | "Cantemir": "CT", 2049 | "Chişinău": "CU", 2050 | "Cimişlia": "CM", 2051 | "Criuleni": "CR", 2052 | "Călăraşi": "CL", 2053 | "Căuşeni": "CS", 2054 | "Donduşeni": "DO", 2055 | "Drochia": "DR", 2056 | "Dubăsari": "DU", 2057 | "Edineţ": "ED", 2058 | "Floreşti": "FL", 2059 | "Făleşti": "FA", 2060 | "Glodeni": "GL", 2061 | "Găgăuzia, Unitatea teritorială autonomă": "GA", 2062 | "Hînceşti": "HI", 2063 | "Ialoveni": "IA", 2064 | "Leova": "LE", 2065 | "Nisporeni": "NI", 2066 | "Ocniţa": "OC", 2067 | "Orhei": "OR", 2068 | "Rezina": "RE", 2069 | "Rîşcani": "RI", 2070 | "Soroca": "SO", 2071 | "Străşeni": "ST", 2072 | "Stînga Nistrului, unitatea teritorială din": "SN", 2073 | "Sîngerei": "SI", 2074 | "Taraclia": "TA", 2075 | "Teleneşti": "TE", 2076 | "Tighina": "BD", 2077 | "Ungheni": "UN", 2078 | "Şoldăneşti": "SD", 2079 | "Ştefan Vodă": "SV", 2080 | }, 2081 | "MC": map[string]string{ 2082 | "Fontvieille": "FO", 2083 | "Jardin Exotique": "JE", 2084 | "La Colle": "CL", 2085 | "La Condamine": "CO", 2086 | "La Gare": "GA", 2087 | "La Source": "SO", 2088 | "Larvotto": "LA", 2089 | "Malbousquet": "MA", 2090 | "Monaco-Ville": "MO", 2091 | "Moneghetti": "MG", 2092 | "Monte-Carlo": "MC", 2093 | "Moulins": "MU", 2094 | "Port-Hercule": "PH", 2095 | "Saint-Roman": "SR", 2096 | "Sainte-Dévote": "SD", 2097 | "Spélugues": "SP", 2098 | "Vallon de la Rousse": "VR", 2099 | }, 2100 | "MN": map[string]string{ 2101 | "Arhangay": "073", 2102 | "Bayan-Ölgiy": "071", 2103 | "Bayanhongor": "069", 2104 | "Bulgan": "067", 2105 | "Darhan uul": "037", 2106 | "Dornod": "061", 2107 | "Dornogovĭ": "063", 2108 | "Dundgovĭ": "059", 2109 | "Dzavhan": "057", 2110 | "Govĭ-Altay": "065", 2111 | "Govĭ-Sümber": "064", 2112 | "Hentiy": "039", 2113 | "Hovd": "043", 2114 | "Hövsgöl": "041", 2115 | "Orhon": "035", 2116 | "Selenge": "049", 2117 | "Sühbaatar": "051", 2118 | "Töv": "047", 2119 | "Ulaanbaatar": "1", 2120 | "Uvs": "046", 2121 | "Ömnögovĭ": "053", 2122 | "Övörhangay": "055", 2123 | }, 2124 | "ME": map[string]string{ 2125 | "Andrijevica": "01", 2126 | "Bar": "02", 2127 | "Berane": "03", 2128 | "Bijelo Polje": "04", 2129 | "Budva": "05", 2130 | "Cetinje": "06", 2131 | "Danilovgrad": "07", 2132 | "Gusinje": "22", 2133 | "Herceg-Novi": "08", 2134 | "Kolašin": "09", 2135 | "Kotor": "10", 2136 | "Mojkovac": "11", 2137 | "Nikšić": "12", 2138 | "Petnjica": "23", 2139 | "Plav": "13", 2140 | "Pljevlja": "14", 2141 | "Plužine": "15", 2142 | "Podgorica": "16", 2143 | "Rožaje": "17", 2144 | "Tivat": "19", 2145 | "Ulcinj": "20", 2146 | "Šavnik": "18", 2147 | "Žabljak": "21", 2148 | }, 2149 | "MS": map[string]string{}, 2150 | "MA": map[string]string{ 2151 | "Chaouia-Ouardigha": "09", 2152 | "Doukhala-Abda": "10", 2153 | "Fès-Boulemane": "05", 2154 | "Gharb-Chrarda-Beni Hssen": "02", 2155 | "Grand Casablanca": "08", 2156 | "Guelmim-Es Smara": "14", 2157 | "L'Oriental": "04", 2158 | "Laâyoune-Boujdour-Sakia el Hamra": "15", 2159 | "Marrakech-Tensift-Al Haouz": "11", 2160 | "Meknès-Tafilalet": "06", 2161 | "Oued ed Dahab-Lagouira": "16", 2162 | "Rabat-Salé-Zemmour-Zaer": "07", 2163 | "Souss-Massa-Drâa": "13", 2164 | "Tadla-Azilal": "12", 2165 | "Tanger-Tétouan": "01", 2166 | "Taza-Al Hoceima-Taounate": "03", 2167 | }, 2168 | "MZ": map[string]string{ 2169 | "Cabo Delgado": "P", 2170 | "Gaza": "G", 2171 | "Inhambane": "I", 2172 | "Manica": "B", 2173 | "Maputo": "L", 2174 | "Nampula": "N", 2175 | "Niassa": "A", 2176 | "Sofala": "S", 2177 | "Tete": "T", 2178 | "Zambézia": "Q", 2179 | }, 2180 | "MM": map[string]string{ 2181 | "Ayeyarwady": "07", 2182 | "Bago": "02", 2183 | "Chin": "14", 2184 | "Kachin": "11", 2185 | "Kayah": "12", 2186 | "Kayin": "13", 2187 | "Magway": "03", 2188 | "Mandalay": "04", 2189 | "Mon": "15", 2190 | "Rakhine": "16", 2191 | "Sagaing": "01", 2192 | "Shan": "17", 2193 | "Tanintharyi": "05", 2194 | "Yangon": "06", 2195 | }, 2196 | "NA": map[string]string{ 2197 | "Erongo": "ER", 2198 | "Hardap": "HA", 2199 | "Karas": "KA", 2200 | "Kavango East": "KE", 2201 | "Kavango West": "KW", 2202 | "Khomas": "KH", 2203 | "Kunene": "KU", 2204 | "Ohangwena": "OW", 2205 | "Omaheke": "OH", 2206 | "Omusati": "OS", 2207 | "Oshana": "ON", 2208 | "Oshikoto": "OT", 2209 | "Otjozondjupa": "OD", 2210 | "Zambezi": "CA", 2211 | }, 2212 | "NR": map[string]string{ 2213 | "Aiwo": "01", 2214 | "Anabar": "02", 2215 | "Anetan": "03", 2216 | "Anibare": "04", 2217 | "Baiti": "05", 2218 | "Boe": "06", 2219 | "Buada": "07", 2220 | "Denigomodu": "08", 2221 | "Ewa": "09", 2222 | "Ijuw": "10", 2223 | "Meneng": "11", 2224 | "Nibok": "12", 2225 | "Uaboe": "13", 2226 | "Yaren": "14", 2227 | }, 2228 | "NP": map[string]string{ 2229 | "Madhya Pashchimanchal": "2", 2230 | "Madhyamanchal": "1", 2231 | "Pashchimanchal": "3", 2232 | "Purwanchal": "4", 2233 | "Sudur Pashchimanchal": "5", 2234 | }, 2235 | "NL": map[string]string{ 2236 | "Drenthe": "DR", 2237 | "Flevoland": "FL", 2238 | "Fryslân": "FR", 2239 | "Gelderland": "GE", 2240 | "Groningen": "GR", 2241 | "Limburg": "LI", 2242 | "Noord-Brabant": "NB", 2243 | "Noord-Holland": "NH", 2244 | "Overijssel": "OV", 2245 | "Utrecht": "UT", 2246 | "Zeeland": "ZE", 2247 | "Zuid-Holland": "ZH", 2248 | "Aruba": "AW", 2249 | "Curaçao": "CW", 2250 | "Sint Maarten": "SX", 2251 | "Bonaire": "BQ1", 2252 | "Saba": "BQ2", 2253 | "Sint Eustatius": "BQ3", 2254 | }, 2255 | "NC": map[string]string{}, 2256 | "NZ": map[string]string{ 2257 | "North Island": "N", 2258 | "South Island": "S", 2259 | "Auckland": "AUK", 2260 | "Bay of Plenty": "BOP", 2261 | "Canterbury": "CAN", 2262 | "Hawke's Bay": "HKB", 2263 | "Manawatu-Wanganui": "MWT", 2264 | "Northland": "NTL", 2265 | "Otago": "OTA", 2266 | "Southland": "STL", 2267 | "Taranaki": "TKI", 2268 | "Waikato": "WKO", 2269 | "Wellington": "WGN", 2270 | "West Coast": "WTC", 2271 | "Chatham Islands Territory": "CIT", 2272 | "Gisborne District": "GIS", 2273 | "Marlborough District": "MBH", 2274 | "Nelson City": "NSN", 2275 | "Tasman District": "TAS", 2276 | }, 2277 | "NI": map[string]string{ 2278 | "Atlántico Norte": "AN", 2279 | "Atlántico Sur": "AS", 2280 | "Boaco": "BO", 2281 | "Carazo": "CA", 2282 | "Chinandega": "CI", 2283 | "Chontales": "CO", 2284 | "Estelí": "ES", 2285 | "Granada": "GR", 2286 | "Jinotega": "JI", 2287 | "León": "LE", 2288 | "Madriz": "MD", 2289 | "Managua": "MN", 2290 | "Masaya": "MS", 2291 | "Matagalpa": "MT", 2292 | "Nueva Segovia": "NS", 2293 | "Rivas": "RI", 2294 | "Río San Juan": "SJ", 2295 | }, 2296 | "NE": map[string]string{ 2297 | "Agadez": "1", 2298 | "Diffa": "2", 2299 | "Dosso": "3", 2300 | "Maradi": "4", 2301 | "Niamey": "8", 2302 | "Tahoua": "5", 2303 | "Tillabéri": "6", 2304 | "Zinder": "7", 2305 | }, 2306 | "NG": map[string]string{ 2307 | "Abia": "AB", 2308 | "Abuja Federal Capital Territory": "FC", 2309 | "Adamawa": "AD", 2310 | "Akwa Ibom": "AK", 2311 | "Anambra": "AN", 2312 | "Bauchi": "BA", 2313 | "Bayelsa": "BY", 2314 | "Benue": "BE", 2315 | "Borno": "BO", 2316 | "Cross River": "CR", 2317 | "Delta": "DE", 2318 | "Ebonyi": "EB", 2319 | "Edo": "ED", 2320 | "Ekiti": "EK", 2321 | "Enugu": "EN", 2322 | "Gombe": "GO", 2323 | "Imo": "IM", 2324 | "Jigawa": "JI", 2325 | "Kaduna": "KD", 2326 | "Kano": "KN", 2327 | "Katsina": "KT", 2328 | "Kebbi": "KE", 2329 | "Kogi": "KO", 2330 | "Kwara": "KW", 2331 | "Lagos": "LA", 2332 | "Nassarawa": "NA", 2333 | "Niger": "NI", 2334 | "Ogun": "OG", 2335 | "Ondo": "ON", 2336 | "Osun": "OS", 2337 | "Oyo": "OY", 2338 | "Plateau": "PL", 2339 | "Rivers": "RI", 2340 | "Sokoto": "SO", 2341 | "Taraba": "TA", 2342 | "Yobe": "YO", 2343 | "Zamfara": "ZA", 2344 | }, 2345 | "NU": map[string]string{}, 2346 | "NF": map[string]string{}, 2347 | "KP": map[string]string{ 2348 | "Chagang": "04", 2349 | "Kangwon": "07", 2350 | "North Hamgyong": "09", 2351 | "North Hwanghae": "06", 2352 | "North Pyongan": "03", 2353 | "Pyongyang": "01", 2354 | "Rason": "13", 2355 | "Ryanggang": "10", 2356 | "South Hamgyong": "08", 2357 | "South Hwanghae": "05", 2358 | "South Pyongan": "02", 2359 | }, 2360 | "MP": map[string]string{}, 2361 | "NO": map[string]string{ 2362 | "Akershus": "02", 2363 | "Aust-Agder": "09", 2364 | "Buskerud": "06", 2365 | "Finnmark": "20", 2366 | "Hedmark": "04", 2367 | "Hordaland": "12", 2368 | "Jan Mayen": "22", 2369 | "Møre og Romsdal": "15", 2370 | "Nord-Trøndelag": "17", 2371 | "Nordland": "18", 2372 | "Oppland": "05", 2373 | "Oslo": "03", 2374 | "Rogaland": "11", 2375 | "Sogn og Fjordane": "14", 2376 | "Svalbard": "21", 2377 | "Sør-Trøndelag": "16", 2378 | "Telemark": "08", 2379 | "Troms": "19", 2380 | "Vest-Agder": "10", 2381 | "Vestfold": "07", 2382 | "Østfold": "01", 2383 | }, 2384 | "OM": map[string]string{ 2385 | "Ad Dākhilīyah": "DA", 2386 | "Al Buraymī": "BU", 2387 | "Al Bāţinah": "BA", 2388 | "Al Wusţá": "WU", 2389 | "Ash Sharqīyah": "SH", 2390 | "Az̧ Z̧āhirah": "ZA", 2391 | "Masqaţ": "MA", 2392 | "Musandam": "MU", 2393 | "Z̧ufār": "ZU", 2394 | }, 2395 | "PK": map[string]string{ 2396 | "Azad Kashmir": "JK", 2397 | "Balochistan": "BA", 2398 | "Federally Administered Tribal Areas": "TA", 2399 | "Gilgit-Baltistan": "GB", 2400 | "Islamabad": "IS", 2401 | "Khyber Pakhtunkhwa": "KP", 2402 | "Punjab": "PB", 2403 | "Sindh": "SD", 2404 | }, 2405 | "PW": map[string]string{ 2406 | "Aimeliik": "002", 2407 | "Airai": "004", 2408 | "Angaur": "010", 2409 | "Hatobohei": "050", 2410 | "Kayangel": "100", 2411 | "Koror": "150", 2412 | "Melekeok": "212", 2413 | "Ngaraard": "214", 2414 | "Ngarchelong": "218", 2415 | "Ngardmau": "222", 2416 | "Ngatpang": "224", 2417 | "Ngchesar": "226", 2418 | "Ngeremlengui": "227", 2419 | "Ngiwal": "228", 2420 | "Peleliu": "350", 2421 | "Sonsorol": "370", 2422 | }, 2423 | "PS": map[string]string{ 2424 | "Bethlehem": "BTH", 2425 | "Deir El Balah": "DEB", 2426 | "Gaza": "GZA", 2427 | "Hebron": "HBN", 2428 | "Jenin": "JEN", 2429 | "Jericho – Al Aghwar": "JRH", 2430 | "Jerusalem": "JEM", 2431 | "Khan Yunis": "KYS", 2432 | "Nablus": "NBS", 2433 | "North Gaza": "NGZ", 2434 | "Qalqilya": "QQA", 2435 | "Rafah": "RFH", 2436 | "Ramallah": "RBH", 2437 | "Salfit": "SLT", 2438 | "Tubas": "TBS", 2439 | "Tulkarm": "TKM", 2440 | }, 2441 | "PA": map[string]string{ 2442 | "Bocas del Toro": "1", 2443 | "Chiriquí": "4", 2444 | "Coclé": "2", 2445 | "Colón": "3", 2446 | "Darién": "5", 2447 | "Emberá": "EM", 2448 | "Herrera": "6", 2449 | "Kuna Yala": "KY", 2450 | "Los Santos": "7", 2451 | "Ngöbe-Buglé": "NB", 2452 | "Panamá": "8", 2453 | "Panamá Oeste": "10", 2454 | "Veraguas": "9", 2455 | }, 2456 | "PG": map[string]string{ 2457 | "Bougainville": "NSB", 2458 | "Central": "CPM", 2459 | "Chimbu": "CPK", 2460 | "East New Britain": "EBR", 2461 | "East Sepik": "ESW", 2462 | "Eastern Highlands": "EHG", 2463 | "Enga": "EPW", 2464 | "Gulf": "GPK", 2465 | "Madang": "MPM", 2466 | "Manus": "MRL", 2467 | "Milne Bay": "MBA", 2468 | "Morobe": "MPL", 2469 | "National Capital District": "NCD", 2470 | "New Ireland": "NIK", 2471 | "Northern": "NPP", 2472 | "Sandaun": "SAN", 2473 | "Southern Highlands": "SHM", 2474 | "West New Britain": "WBK", 2475 | "Western": "WPD", 2476 | "Western Highlands": "WHM", 2477 | }, 2478 | "PY": map[string]string{ 2479 | "Alto Paraguay": "16", 2480 | "Alto Paraná": "10", 2481 | "Amambay": "13", 2482 | "Asunción": "ASU", 2483 | "Boquerón": "19", 2484 | "Caaguazú": "5", 2485 | "Caazapá": "6", 2486 | "Canindeyú": "14", 2487 | "Central": "11", 2488 | "Concepción": "1", 2489 | "Cordillera": "3", 2490 | "Guairá": "4", 2491 | "Itapúa": "7", 2492 | "Misiones": "8", 2493 | "Paraguarí": "9", 2494 | "Presidente Hayes": "15", 2495 | "San Pedro": "2", 2496 | "Ñeembucú": "12", 2497 | }, 2498 | "PE": map[string]string{ 2499 | "Amazonas": "AMA", 2500 | "Ancash": "ANC", 2501 | "Apurímac": "APU", 2502 | "Arequipa": "ARE", 2503 | "Ayacucho": "AYA", 2504 | "Cajamarca": "CAJ", 2505 | "Cusco": "CUS", 2506 | "El Callao": "CAL", 2507 | "Huancavelica": "HUV", 2508 | "Huánuco": "HUC", 2509 | "Ica": "ICA", 2510 | "Junín": "JUN", 2511 | "La Libertad": "LAL", 2512 | "Lambayeque": "LAM", 2513 | "Lima": "LIM", 2514 | "Loreto": "LOR", 2515 | "Madre de Dios": "MDD", 2516 | "Moquegua": "MOQ", 2517 | "Municipalidad Metropolitana de Lima": "LMA", 2518 | "Pasco": "PAS", 2519 | "Piura": "PIU", 2520 | "Puno": "PUN", 2521 | "San Martín": "SAM", 2522 | "Tacna": "TAC", 2523 | "Tumbes": "TUM", 2524 | "Ucayali": "UCA", 2525 | }, 2526 | "PH": map[string]string{ 2527 | "Autonomous Region in Muslim Mindanao": "14", 2528 | "Bicol": "05", 2529 | "Cagayan Valley": "02", 2530 | "Calabarzon": "40", 2531 | "Caraga": "13", 2532 | "Central Luzon": "03", 2533 | "Central Visayas": "07", 2534 | "Cordillera Administrative Region": "15", 2535 | "Davao": "11", 2536 | "Eastern Visayas": "08", 2537 | "Ilocos": "01", 2538 | "Mimaropa": "41", 2539 | "National Capital Region": "00", 2540 | "Northern Mindanao": "10", 2541 | "Soccsksargen": "12", 2542 | "Western Visayas": "06", 2543 | "Zamboanga Peninsula": "09", 2544 | }, 2545 | "PN": map[string]string{}, 2546 | "PL": map[string]string{ 2547 | "Dolnośląskie": "DS", 2548 | "Kujawsko-pomorskie": "KP", 2549 | "Lubelskie": "LU", 2550 | "Lubuskie": "LB", 2551 | "Mazowieckie": "MZ", 2552 | "Małopolskie": "MA", 2553 | "Opolskie": "OP", 2554 | "Podkarpackie": "PK", 2555 | "Podlaskie": "PD", 2556 | "Pomorskie": "PM", 2557 | "Warmińsko-mazurskie": "WN", 2558 | "Wielkopolskie": "WP", 2559 | "Zachodniopomorskie": "ZP", 2560 | "Łódzkie": "LD", 2561 | "Śląskie": "SL", 2562 | "Świętokrzyskie": "SK", 2563 | }, 2564 | "PT": map[string]string{ 2565 | "Aveiro": "01", 2566 | "Beja": "02", 2567 | "Braga": "03", 2568 | "Bragança": "04", 2569 | "Castelo Branco": "05", 2570 | "Coimbra": "06", 2571 | "Faro": "08", 2572 | "Guarda": "09", 2573 | "Leiria": "10", 2574 | "Lisboa": "11", 2575 | "Portalegre": "12", 2576 | "Porto": "13", 2577 | "Região Autónoma da Madeira": "30", 2578 | "Região Autónoma dos Açores": "20", 2579 | "Santarém": "14", 2580 | "Setúbal": "15", 2581 | "Viana do Castelo": "16", 2582 | "Vila Real": "17", 2583 | "Viseu": "18", 2584 | "Évora": "07", 2585 | }, 2586 | "PR": map[string]string{}, 2587 | "QA": map[string]string{ 2588 | "Ad Dawḩah": "DA", 2589 | "Al Khawr wa adh Dhakhīrah": "KH", 2590 | "Al Wakrah": "WA", 2591 | "Ar Rayyān": "RA", 2592 | "Ash Shamāl": "MS", 2593 | "Az̧ Za̧`āyin": "ZA", 2594 | "Umm Şalāl": "US", 2595 | }, 2596 | "XK": map[string]string{}, 2597 | "RE": map[string]string{}, 2598 | "RO": map[string]string{ 2599 | "Alba": "AB", 2600 | "Arad": "AR", 2601 | "Argeș": "AG", 2602 | "Bacău": "BC", 2603 | "Bihor": "BH", 2604 | "Bistrița-Năsăud": "BN", 2605 | "Botoșani": "BT", 2606 | "Brașov": "BV", 2607 | "Brăila": "BR", 2608 | "București": "B", 2609 | "Buzău": "BZ", 2610 | "Caraș-Severin": "CS", 2611 | "Cluj": "CJ", 2612 | "Constanța": "CT", 2613 | "Covasna": "CV", 2614 | "Călărași": "CL", 2615 | "Dolj": "DJ", 2616 | "Dâmbovița": "DB", 2617 | "Galați": "GL", 2618 | "Giurgiu": "GR", 2619 | "Gorj": "GJ", 2620 | "Harghita": "HR", 2621 | "Hunedoara": "HD", 2622 | "Ialomița": "IL", 2623 | "Iași": "IS", 2624 | "Ilfov": "IF", 2625 | "Maramureș": "MM", 2626 | "Mehedinți": "MH", 2627 | "Mureș": "MS", 2628 | "Neamț": "NT", 2629 | "Olt": "OT", 2630 | "Prahova": "PH", 2631 | "Satu Mare": "SM", 2632 | "Sibiu": "SB", 2633 | "Suceava": "SV", 2634 | "Sălaj": "SJ", 2635 | "Teleorman": "TR", 2636 | "Timiș": "TM", 2637 | "Tulcea": "TL", 2638 | "Vaslui": "VS", 2639 | "Vrancea": "VN", 2640 | "Vâlcea": "VL", 2641 | }, 2642 | "RU": map[string]string{ 2643 | "Amurskaya oblast'": "AMU", 2644 | "Arkhangel'skaya oblast'": "ARK", 2645 | "Astrakhanskaya oblast'": "AST", 2646 | "Belgorodskaya oblast'": "BEL", 2647 | "Bryanskaya oblast'": "BRY", 2648 | "Chelyabinskaya oblast'": "CHE", 2649 | "Irkutskaya oblast'": "IRK", 2650 | "Ivanovskaya oblast'": "IVA", 2651 | "Kaliningradskaya oblast'": "KGD", 2652 | "Kaluzhskaya oblast'": "KLU", 2653 | "Kemerovskaya oblast'": "KEM", 2654 | "Kirovskaya oblast'": "KIR", 2655 | "Kostromskaya oblast'": "KOS", 2656 | "Kurganskaya oblast'": "KGN", 2657 | "Kurskaya oblast'": "KRS", 2658 | "Leningradskaya oblast'": "LEN", 2659 | "Lipetskaya oblast'": "LIP", 2660 | "Magadanskaya oblast'": "MAG", 2661 | "Moskovskaya oblast'": "MOS", 2662 | "Murmanskaya oblast'": "MUR", 2663 | "Nizhegorodskaya oblast'": "NIZ", 2664 | "Novgorodskaya oblast'": "NGR", 2665 | "Novosibirskaya oblast'": "NVS", 2666 | "Omskaya oblast'": "OMS", 2667 | "Orenburgskaya oblast'": "ORE", 2668 | "Orlovskaya oblast'": "ORL", 2669 | "Penzenskaya oblast'": "PNZ", 2670 | "Pskovskaya oblast'": "PSK", 2671 | "Rostovskaya oblast'": "ROS", 2672 | "Ryazanskaya oblast'": "RYA", 2673 | "Sakhalinskaya oblast'": "SAK", 2674 | "Samarskaya oblast'": "SAM", 2675 | "Saratovskaya oblast'": "SAR", 2676 | "Smolenskaya oblast'": "SMO", 2677 | "Sverdlovskaya oblast'": "SVE", 2678 | "Tambovskaya oblast'": "TAM", 2679 | "Tomskaya oblast'": "TOM", 2680 | "Tul'skaya oblast'": "TUL", 2681 | "Tverskaya oblast'": "TVE", 2682 | "Tyumenskaya oblast'": "TYU", 2683 | "Ul'yanovskaya oblast'": "ULY", 2684 | "Vladimirskaya oblast'": "VLA", 2685 | "Volgogradskaya oblast'": "VGG", 2686 | "Vologodskaya oblast'": "VLG", 2687 | "Voronezhskaya oblast'": "VOR", 2688 | "Yaroslavskaya oblast'": "YAR", 2689 | "Altayskiy kray": "ALT", 2690 | "Kamchatskiy kray": "KAM", 2691 | "Khabarovskiy kray": "KHA", 2692 | "Krasnodarskiy kray": "KDA", 2693 | "Krasnoyarskiy kray": "KYA", 2694 | "Permskiy kray": "PER", 2695 | "Primorskiy kray": "PRI", 2696 | "Stavropol'skiy kray": "STA", 2697 | "Zabaykal'skiy kray": "ZAB", 2698 | "Moskva": "MOW", 2699 | "Sankt-Peterburg": "SPE", 2700 | "Chukotskiy avtonomnyy okrug": "CHU", 2701 | "Khanty-Mansiyskiy avtonomnyy okrug-Yugra": "KHM", 2702 | "Nenetskiy avtonomnyy okrug": "NEN", 2703 | "Yamalo-Nenetskiy avtonomnyy okrug": "YAN", 2704 | "Yevreyskaya avtonomnaya oblast'": "YEV", 2705 | "Adygeya, Respublika": "AD", 2706 | "Altay, Respublika": "AL", 2707 | "Bashkortostan, Respublika": "BA", 2708 | "Buryatiya, Respublika": "BU", 2709 | "Chechenskaya Respublika": "CE", 2710 | "Chuvashskaya Respublika": "CU", 2711 | "Dagestan, Respublika": "DA", 2712 | "Ingushetiya, Respublika": "IN", 2713 | "Kabardino-Balkarskaya Respublika": "KB", 2714 | "Kalmykiya, Respublika": "KL", 2715 | "Karachayevo-Cherkesskaya Respublika": "KC", 2716 | "Kareliya, Respublika": "KR", 2717 | "Khakasiya, Respublika": "KK", 2718 | "Komi, Respublika": "KO", 2719 | "Mariy El, Respublika": "ME", 2720 | "Mordoviya, Respublika": "MO", 2721 | "Sakha, Respublika": "SA", 2722 | "Severnaya Osetiya-Alaniya, Respublika": "SE", 2723 | "Tatarstan, Respublika": "TA", 2724 | "Tyva, Respublika": "TY", 2725 | "Udmurtskaya Respublika": "UD", 2726 | }, 2727 | "RW": map[string]string{ 2728 | "Est": "02", 2729 | "Nord": "03", 2730 | "Ouest": "04", 2731 | "Sud": "05", 2732 | "Ville de Kigali": "01", 2733 | }, 2734 | "BL": map[string]string{}, 2735 | "SH": map[string]string{ 2736 | "Ascension": "AC", 2737 | "Saint Helena": "HL", 2738 | "Tristan da Cunha": "TA", 2739 | }, 2740 | "KN": map[string]string{ 2741 | "Nevis": "N", 2742 | "Saint Kitts": "K", 2743 | }, 2744 | "LC": map[string]string{ 2745 | "Anse la Raye": "01", 2746 | "Castries": "02", 2747 | "Choiseul": "03", 2748 | "Dauphin": "04", 2749 | "Dennery": "05", 2750 | "Gros Islet": "06", 2751 | "Laborie": "07", 2752 | "Micoud": "08", 2753 | "Praslin": "09", 2754 | "Soufrière": "10", 2755 | "Vieux Fort": "11", 2756 | }, 2757 | "MF": map[string]string{}, 2758 | "PM": map[string]string{}, 2759 | "VC": map[string]string{ 2760 | "Charlotte": "01", 2761 | "Grenadines": "06", 2762 | "Saint Andrew": "02", 2763 | "Saint David": "03", 2764 | "Saint George": "04", 2765 | "Saint Patrick": "05", 2766 | }, 2767 | "WS": map[string]string{ 2768 | "A'ana": "AA", 2769 | "Aiga-i-le-Tai": "AL", 2770 | "Atua": "AT", 2771 | "Fa'asaleleaga": "FA", 2772 | "Gaga'emauga": "GE", 2773 | "Gagaifomauga": "GI", 2774 | "Palauli": "PA", 2775 | "Satupa'itea": "SA", 2776 | "Tuamasaga": "TU", 2777 | "Va'a-o-Fonoti": "VF", 2778 | "Vaisigano": "VS", 2779 | }, 2780 | "SM": map[string]string{ 2781 | "Acquaviva": "01", 2782 | "Borgo Maggiore": "06", 2783 | "Chiesanuova": "02", 2784 | "Domagnano": "03", 2785 | "Faetano": "04", 2786 | "Fiorentino": "05", 2787 | "Montegiardino": "08", 2788 | "San Marino": "07", 2789 | "Serravalle": "09", 2790 | }, 2791 | "ST": map[string]string{ 2792 | "Príncipe": "P", 2793 | "São Tomé": "S", 2794 | }, 2795 | "SA": map[string]string{ 2796 | "Al Bāḩah": "11", 2797 | "Al Jawf": "12", 2798 | "Al Madīnah": "03", 2799 | "Al Qaşīm": "05", 2800 | "Al Ḩudūd ash Shamālīyah": "08", 2801 | "Ar Riyāḑ": "01", 2802 | "Ash Sharqīyah": "04", 2803 | "Jīzān": "09", 2804 | "Makkah": "02", 2805 | "Najrān": "10", 2806 | "Tabūk": "07", 2807 | "ٰĀsīr": "14", 2808 | "Ḩā'il": "06", 2809 | }, 2810 | "SN": map[string]string{ 2811 | "Dakar": "DK", 2812 | "Diourbel": "DB", 2813 | "Fatick": "FK", 2814 | "Kaffrine": "KA", 2815 | "Kaolack": "KL", 2816 | "Kolda": "KD", 2817 | "Kédougou": "KE", 2818 | "Louga": "LG", 2819 | "Matam": "MT", 2820 | "Saint-Louis": "SL", 2821 | "Sédhiou": "SE", 2822 | "Tambacounda": "TC", 2823 | "Thiès": "TH", 2824 | "Ziguinchor": "ZG", 2825 | }, 2826 | "RS": map[string]string{ 2827 | "Kosovo-Metohija": "KM", 2828 | "Vojvodina": "VO", 2829 | }, 2830 | "SC": map[string]string{ 2831 | "Anse Boileau": "02", 2832 | "Anse Etoile": "03", 2833 | "Anse Royale": "05", 2834 | "Anse aux Pins": "01", 2835 | "Au Cap": "04", 2836 | "Baie Lazare": "06", 2837 | "Baie Sainte Anne": "07", 2838 | "Beau Vallon": "08", 2839 | "Bel Air": "09", 2840 | "Bel Ombre": "10", 2841 | "Cascade": "11", 2842 | "English River": "16", 2843 | "Glacis": "12", 2844 | "Grand Anse Mahe": "13", 2845 | "Grand Anse Praslin": "14", 2846 | "La Digue": "15", 2847 | "Les Mamelles": "24", 2848 | "Mont Buxton": "17", 2849 | "Mont Fleuri": "18", 2850 | "Plaisance": "19", 2851 | "Pointe Larue": "20", 2852 | "Port Glaud": "21", 2853 | "Roche Caiman": "25", 2854 | "Saint Louis": "22", 2855 | "Takamaka": "23", 2856 | }, 2857 | "SL": map[string]string{ 2858 | "Eastern": "E", 2859 | "Northern": "N", 2860 | "Southern": "S", 2861 | "Western Area": "W", 2862 | }, 2863 | "SG": map[string]string{ 2864 | "Central Singapore": "01", 2865 | "North East": "02", 2866 | "North West": "03", 2867 | "South East": "04", 2868 | "South West": "05", 2869 | }, 2870 | "SX": map[string]string{}, 2871 | "SK": map[string]string{ 2872 | "Banskobystrický kraj": "BC", 2873 | "Bratislavský kraj": "BL", 2874 | "Košický kraj": "KI", 2875 | "Nitriansky kraj": "NI", 2876 | "Prešovský kraj": "PV", 2877 | "Trenčiansky kraj": "TC", 2878 | "Trnavský kraj": "TA", 2879 | "Žilinský kraj": "ZI", 2880 | }, 2881 | "SI": map[string]string{ 2882 | "Ajdovščina": "001", 2883 | "Apače": "195", 2884 | "Beltinci": "002", 2885 | "Benedikt": "148", 2886 | "Bistrica ob Sotli": "149", 2887 | "Bled": "003", 2888 | "Bloke": "150", 2889 | "Bohinj": "004", 2890 | "Borovnica": "005", 2891 | "Bovec": "006", 2892 | "Braslovče": "151", 2893 | "Brda": "007", 2894 | "Brezovica": "008", 2895 | "Brežice": "009", 2896 | "Cankova": "152", 2897 | "Celje": "011", 2898 | "Cerklje na Gorenjskem": "012", 2899 | "Cerknica": "013", 2900 | "Cerkno": "014", 2901 | "Cerkvenjak": "153", 2902 | "Cirkulane": "196", 2903 | "Destrnik": "018", 2904 | "Divača": "019", 2905 | "Dobje": "154", 2906 | "Dobrepolje": "020", 2907 | "Dobrna": "155", 2908 | "Dobrova–Polhov Gradec": "021", 2909 | "Dobrovnik": "156", 2910 | "Dol pri Ljubljani": "022", 2911 | "Dolenjske Toplice": "157", 2912 | "Domžale": "023", 2913 | "Dornava": "024", 2914 | "Dravograd": "025", 2915 | "Duplek": "026", 2916 | "Gorenja vas–Poljane": "027", 2917 | "Gorišnica": "028", 2918 | "Gorje": "207", 2919 | "Gornja Radgona": "029", 2920 | "Gornji Grad": "030", 2921 | "Gornji Petrovci": "031", 2922 | "Grad": "158", 2923 | "Grosuplje": "032", 2924 | "Hajdina": "159", 2925 | "Hodoš": "161", 2926 | "Horjul": "162", 2927 | "Hoče–Slivnica": "160", 2928 | "Hrastnik": "034", 2929 | "Hrpelje-Kozina": "035", 2930 | "Idrija": "036", 2931 | "Ig": "037", 2932 | "Ilirska Bistrica": "038", 2933 | "Ivančna Gorica": "039", 2934 | "Izola": "040", 2935 | "Jesenice": "041", 2936 | "Jezersko": "163", 2937 | "Juršinci": "042", 2938 | "Kamnik": "043", 2939 | "Kanal": "044", 2940 | "Kidričevo": "045", 2941 | "Kobarid": "046", 2942 | "Kobilje": "047", 2943 | "Komen": "049", 2944 | "Komenda": "164", 2945 | "Koper": "050", 2946 | "Kosanjevica na Krki": "197", 2947 | "Kostel": "165", 2948 | "Kozje": "051", 2949 | "Kočevje": "048", 2950 | "Kranj": "052", 2951 | "Kranjska Gora": "053", 2952 | "Križevci": "166", 2953 | "Krško": "054", 2954 | "Kungota": "055", 2955 | "Kuzma": "056", 2956 | "Laško": "057", 2957 | "Lenart": "058", 2958 | "Lendava": "059", 2959 | "Litija": "060", 2960 | "Ljubljana": "061", 2961 | "Ljubno": "062", 2962 | "Ljutomer": "063", 2963 | "Log-Dragomer": "208", 2964 | "Logatec": "064", 2965 | "Lovrenc na Pohorju": "167", 2966 | "Loška Dolina": "065", 2967 | "Loški Potok": "066", 2968 | "Lukovica": "068", 2969 | "Luče": "067", 2970 | "Majšperk": "069", 2971 | "Makole": "198", 2972 | "Maribor": "070", 2973 | "Markovci": "168", 2974 | "Medvode": "071", 2975 | "Mengeš": "072", 2976 | "Metlika": "073", 2977 | "Mežica": "074", 2978 | "Miklavž na Dravskem Polju": "169", 2979 | "Miren–Kostanjevica": "075", 2980 | "Mirna Peč": "170", 2981 | "Mislinja": "076", 2982 | "Mokronog–Trebelno": "199", 2983 | "Moravske Toplice": "078", 2984 | "Moravče": "077", 2985 | "Mozirje": "079", 2986 | "Murska Sobota": "080", 2987 | "Muta": "081", 2988 | "Naklo": "082", 2989 | "Nazarje": "083", 2990 | "Nova Gorica": "084", 2991 | "Novo Mesto": "085", 2992 | "Odranci": "086", 2993 | "Oplotnica": "171", 2994 | "Ormož": "087", 2995 | "Osilnica": "088", 2996 | "Pesnica": "089", 2997 | "Piran": "090", 2998 | "Pivka": "091", 2999 | "Podlehnik": "172", 3000 | "Podvelka": "093", 3001 | "Podčetrtek": "092", 3002 | "Poljčane": "200", 3003 | "Polzela": "173", 3004 | "Postojna": "094", 3005 | "Prebold": "174", 3006 | "Preddvor": "095", 3007 | "Prevalje": "175", 3008 | "Ptuj": "096", 3009 | "Puconci": "097", 3010 | "Radenci": "100", 3011 | "Radeče": "099", 3012 | "Radlje ob Dravi": "101", 3013 | "Radovljica": "102", 3014 | "Ravne na Koroškem": "103", 3015 | "Razkrižje": "176", 3016 | "Rače–Fram": "098", 3017 | "Renče-Vogrsko": "201", 3018 | "Rečica ob Savinji": "209", 3019 | "Ribnica": "104", 3020 | "Ribnica na Pohorju": "177", 3021 | "Rogatec": "107", 3022 | "Rogaška Slatina": "106", 3023 | "Rogašovci": "105", 3024 | "Ruše": "108", 3025 | "Selnica ob Dravi": "178", 3026 | "Semič": "109", 3027 | "Sevnica": "110", 3028 | "Sežana": "111", 3029 | "Slovenj Gradec": "112", 3030 | "Slovenska Bistrica": "113", 3031 | "Slovenske Konjice": "114", 3032 | "Sodražica": "179", 3033 | "Solčava": "180", 3034 | "Središče ob Dravi": "202", 3035 | "Starše": "115", 3036 | "Straža": "203", 3037 | "Sveta Ana": "181", 3038 | "Sveta Trojica v Slovenskih Goricah": "204", 3039 | "Sveti Andraž v Slovenskih Goricah": "182", 3040 | "Sveti Jurij": "116", 3041 | "Sveti Jurij v Slovenskih Goricah": "210", 3042 | "Sveti Tomaž": "205", 3043 | "Tabor": "184", 3044 | "Tišina": "010", 3045 | "Tolmin": "128", 3046 | "Trbovlje": "129", 3047 | "Trebnje": "130", 3048 | "Trnovska Vas": "185", 3049 | "Trzin": "186", 3050 | "Tržič": "131", 3051 | "Turnišče": "132", 3052 | "Velenje": "133", 3053 | "Velika Polana": "187", 3054 | "Velike Lašče": "134", 3055 | "Veržej": "188", 3056 | "Videm": "135", 3057 | "Vipava": "136", 3058 | "Vitanje": "137", 3059 | "Vodice": "138", 3060 | "Vojnik": "139", 3061 | "Vransko": "189", 3062 | "Vrhnika": "140", 3063 | "Vuzenica": "141", 3064 | "Zagorje ob Savi": "142", 3065 | "Zavrč": "143", 3066 | "Zreče": "144", 3067 | "Črenšovci": "015", 3068 | "Črna na Koroškem": "016", 3069 | "Črnomelj": "017", 3070 | "Šalovci": "033", 3071 | "Šempeter–Vrtojba": "183", 3072 | "Šentilj": "118", 3073 | "Šentjernej": "119", 3074 | "Šentjur": "120", 3075 | "Šentrupert": "211", 3076 | "Šenčur": "117", 3077 | "Škocjan": "121", 3078 | "Škofja Loka": "122", 3079 | "Škofljica": "123", 3080 | "Šmarje pri Jelšah": "124", 3081 | "Šmarješke Toplice": "206", 3082 | "Šmartno ob Paki": "125", 3083 | "Šmartno pri Litiji": "194", 3084 | "Šoštanj": "126", 3085 | "Štore": "127", 3086 | "Žalec": "190", 3087 | "Železniki": "146", 3088 | "Žetale": "191", 3089 | "Žiri": "147", 3090 | "Žirovnica": "192", 3091 | "Žužemberk": "193", 3092 | }, 3093 | "SB": map[string]string{ 3094 | "Capital Territory": "CT", 3095 | "Central": "CE", 3096 | "Choiseul": "CH", 3097 | "Guadalcanal": "GU", 3098 | "Isabel": "IS", 3099 | "Makira-Ulawa": "MK", 3100 | "Malaita": "ML", 3101 | "Rennell and Bellona": "RB", 3102 | "Temotu": "TE", 3103 | "Western": "WE", 3104 | }, 3105 | "SO": map[string]string{ 3106 | "Awdal": "AW", 3107 | "Bakool": "BK", 3108 | "Banaadir": "BN", 3109 | "Bari": "BR", 3110 | "Bay": "BY", 3111 | "Galguduud": "GA", 3112 | "Gedo": "GE", 3113 | "Hiiraan": "HI", 3114 | "Jubbada Dhexe": "JD", 3115 | "Jubbada Hoose": "JH", 3116 | "Mudug": "MU", 3117 | "Nugaal": "NU", 3118 | "Sanaag": "SA", 3119 | "Shabeellaha Dhexe": "SD", 3120 | "Shabeellaha Hoose": "SH", 3121 | "Sool": "SO", 3122 | "Togdheer": "TO", 3123 | "Woqooyi Galbeed": "WO", 3124 | }, 3125 | "ZA": map[string]string{ 3126 | "Eastern Cape": "EC", 3127 | "Free State": "FS", 3128 | "Gauteng": "GT", 3129 | "KwaZulu-Natal": "NL", 3130 | "Limpopo": "LP", 3131 | "Mpumalanga": "MP", 3132 | "North West": "NW", 3133 | "Northern Cape": "NC", 3134 | "Western Cape": "WC", 3135 | }, 3136 | "GS": map[string]string{}, 3137 | "KR": map[string]string{ 3138 | "Busan-gwangyeoksi": "26", 3139 | "Chungcheongbuk-do": "43", 3140 | "Chungcheongnam-do": "44", 3141 | "Daegu-gwangyeoksi": "27", 3142 | "Daejeon-gwangyeoksi": "30", 3143 | "Gangwon-do": "42", 3144 | "Gwangju-gwangyeoksi": "29", 3145 | "Gyeonggi-do": "41", 3146 | "Gyeongsangbuk-do": "47", 3147 | "Gyeongsangnam-do": "48", 3148 | "Incheon-gwangyeoksi": "28", 3149 | "Jeju-teukbyeoljachido": "49", 3150 | "Jeollabuk-do": "45", 3151 | "Jeollanam-do": "46", 3152 | "Sejong": "50", 3153 | "Seoul-teukbyeolsi": "11", 3154 | "Ulsan-gwangyeoksi": "31", 3155 | }, 3156 | "SS": map[string]string{ 3157 | "Central Equatoria": "EC", 3158 | "Eastern Equatoria": "EE", 3159 | "Jonglei": "JG", 3160 | "Lakes": "LK", 3161 | "Northern Bahr el Ghazal": "BN", 3162 | "Unity": "UY", 3163 | "Upper Nile": "NU", 3164 | "Warrap": "WR", 3165 | "Western Bahr el Ghazal": "BW", 3166 | "Western Equatoria": "EW", 3167 | }, 3168 | "ES": map[string]string{ 3169 | "A Coruña": "C", 3170 | "Albacete": "AB", 3171 | "Alicante": "A", 3172 | "Almería": "AL", 3173 | "Asturias": "O", 3174 | "Badajoz": "BA", 3175 | "Balears": "PM", 3176 | "Barcelona": "B", 3177 | "Burgos": "BU", 3178 | "Cantabria": "CB", 3179 | "Castellón": "CS", 3180 | "Ciudad Real": "CR", 3181 | "Cuenca": "CU", 3182 | "Cáceres": "CC", 3183 | "Cádiz": "CA", 3184 | "Córdoba": "CO", 3185 | "Girona": "GI", 3186 | "Granada": "GR", 3187 | "Guadalajara": "GU", 3188 | "Guipúzcoa": "SS", 3189 | "Huelva": "H", 3190 | "Huesca": "HU", 3191 | "Jaén": "J", 3192 | "La Rioja": "RI", 3193 | "Las Palmas": "GC", 3194 | "León": "LE", 3195 | "Lleida": "L", 3196 | "Lugo": "LU", 3197 | "Madrid": "M", 3198 | "Murcia": "MU", 3199 | "Málaga": "MA", 3200 | "Navarra": "NA", 3201 | "Ourense": "OR", 3202 | "Palencia": "P", 3203 | "Pontevedra": "PO", 3204 | "Salamanca": "SA", 3205 | "Santa Cruz de Tenerife": "TF", 3206 | "Segovia": "SG", 3207 | "Sevilla": "SE", 3208 | "Soria": "SO", 3209 | "Tarragona": "T", 3210 | "Teruel": "TE", 3211 | "Toledo": "TO", 3212 | "Valencia": "V", 3213 | "Valladolid": "VA", 3214 | "Vizcaya": "BI", 3215 | "Zamora": "ZA", 3216 | "Zaragoza": "Z", 3217 | "Álava": "VI", 3218 | "Ávila": "AV", 3219 | "Ceuta": "CE", 3220 | "Melilla": "ML", 3221 | "Andalucía": "AN", 3222 | "Aragón": "AR", 3223 | "Asturias, Principado de": "AS", 3224 | "Canarias": "CN", 3225 | "Castilla y León": "CL", 3226 | "Castilla-La Mancha": "CM", 3227 | "Catalunya": "CT", 3228 | "Extremadura": "EX", 3229 | "Galicia": "GA", 3230 | "Illes Balears": "IB", 3231 | "Madrid, Comunidad de": "MD", 3232 | "Murcia, Región de": "MC", 3233 | "Navarra, Comunidad Foral de": "NC", 3234 | "País Vasco": "PV", 3235 | "Valenciana, Comunidad": "VC", 3236 | }, 3237 | "LK": map[string]string{ 3238 | "Central Province": "2", 3239 | "Eastern Province": "5", 3240 | "North Central Province": "7", 3241 | "North Western Province": "6", 3242 | "Northern Province": "4", 3243 | "Sabaragamuwa Province": "9", 3244 | "Southern Province": "3", 3245 | "Uva Province": "8", 3246 | "Western Province": "1", 3247 | }, 3248 | "SD": map[string]string{ 3249 | "Al Baḩr al Aḩmar": "RS", 3250 | "Al Jazīrah": "GZ", 3251 | "Al Kharţūm": "KH", 3252 | "Al Qaḑārif": "GD", 3253 | "An Nīl": "NR", 3254 | "An Nīl al Abyaḑ": "NW", 3255 | "An Nīl al Azraq": "NB", 3256 | "Ash Shamālīyah": "NO", 3257 | "Gharb Dārfūr": "DW", 3258 | "Janūb Dārfūr": "DS", 3259 | "Janūb Kurdufān": "KS", 3260 | "Kassalā": "KA", 3261 | "Shamāl Dārfūr": "DN", 3262 | "Shamāl Kurdufān": "KN", 3263 | "Sharq Dārfūr": "DE", 3264 | "Sinnār": "SI", 3265 | "Zalingei": "DC", 3266 | }, 3267 | "SR": map[string]string{ 3268 | "Brokopondo": "BR", 3269 | "Commewijne": "CM", 3270 | "Coronie": "CR", 3271 | "Marowijne": "MA", 3272 | "Nickerie": "NI", 3273 | "Para": "PR", 3274 | "Paramaribo": "PM", 3275 | "Saramacca": "SA", 3276 | "Sipaliwini": "SI", 3277 | "Wanica": "WA", 3278 | }, 3279 | "SJ": map[string]string{}, 3280 | "SZ": map[string]string{ 3281 | "Hhohho": "HH", 3282 | "Lubombo": "LU", 3283 | "Manzini": "MA", 3284 | "Shiselweni": "SH", 3285 | }, 3286 | "SE": map[string]string{ 3287 | "Blekinge län": "K", 3288 | "Dalarnas län": "W", 3289 | "Gotlands län": "I", 3290 | "Gävleborgs län": "X", 3291 | "Hallands län": "N", 3292 | "Jämtlands län": "Z", 3293 | "Jönköpings län": "F", 3294 | "Kalmar län": "H", 3295 | "Kronobergs län": "G", 3296 | "Norrbottens län": "BD", 3297 | "Skåne län": "M", 3298 | "Stockholms län": "AB", 3299 | "Södermanlands län": "D", 3300 | "Uppsala län": "C", 3301 | "Värmlands län": "S", 3302 | "Västerbottens län": "AC", 3303 | "Västernorrlands län": "Y", 3304 | "Västmanlands län": "U", 3305 | "Västra Götalands län": "O", 3306 | "Örebro län": "T", 3307 | "Östergötlands län": "E", 3308 | }, 3309 | "CH": map[string]string{ 3310 | "Aargau": "AG", 3311 | "Appenzell Ausserrhoden": "AR", 3312 | "Appenzell Innerrhoden": "AI", 3313 | "Basel-Landschaft": "BL", 3314 | "Basel-Stadt": "BS", 3315 | "Bern": "BE", 3316 | "Fribourg": "FR", 3317 | "Genève": "GE", 3318 | "Glarus": "GL", 3319 | "Graubünden": "GR", 3320 | "Jura": "JU", 3321 | "Luzern": "LU", 3322 | "Neuchâtel": "NE", 3323 | "Nidwalden": "NW", 3324 | "Obwalden": "OW", 3325 | "Sankt Gallen": "SG", 3326 | "Schaffhausen": "SH", 3327 | "Schwyz": "SZ", 3328 | "Solothurn": "SO", 3329 | "Thurgau": "TG", 3330 | "Ticino": "TI", 3331 | "Uri": "UR", 3332 | "Valais": "VS", 3333 | "Vaud": "VD", 3334 | "Zug": "ZG", 3335 | "Zürich": "ZH", 3336 | }, 3337 | "SY": map[string]string{ 3338 | "Al Lādhiqīyah": "LA", 3339 | "Al Qunayţirah": "QU", 3340 | "Al Ḩasakah": "HA", 3341 | "Ar Raqqah": "RA", 3342 | "As Suwaydā'": "SU", 3343 | "Darٰā": "DR", 3344 | "Dayr az Zawr": "DY", 3345 | "Dimashq": "DI", 3346 | "Idlib": "ID", 3347 | "Rīf Dimashq": "RD", 3348 | "Ţarţūs": "TA", 3349 | "Ḩalab": "HL", 3350 | "Ḩamāh": "HM", 3351 | "Ḩimş": "HI", 3352 | }, 3353 | "TW": map[string]string{ 3354 | "Changhua": "CHA", 3355 | "Chiayi": "CYI", 3356 | "Hsinchu": "HSQ", 3357 | "Hualien": "HUA", 3358 | "Ilan": "ILA", 3359 | "Kaohsiung": "KHH", 3360 | "Keelung": "KEE", 3361 | "Miaoli": "MIA", 3362 | "Nantou": "NAN", 3363 | "Penghu": "PEN", 3364 | "Pingtung": "PIF", 3365 | "Taichung": "TXQ", 3366 | "Tainan": "TNQ", 3367 | "Taipei": "TPQ", 3368 | "Taitung": "TTT", 3369 | "Taoyuan": "TAO", 3370 | "Yunlin": "YUN", 3371 | }, 3372 | "TJ": map[string]string{ 3373 | "Dushanbe": "DU", 3374 | "Khatlon": "KT", 3375 | "Kŭhistoni Badakhshon": "GB", 3376 | "Sughd": "SU", 3377 | }, 3378 | "TZ": map[string]string{ 3379 | "Arusha": "01", 3380 | "Dar es Salaam": "02", 3381 | "Dodoma": "03", 3382 | "Iringa": "04", 3383 | "Kagera": "05", 3384 | "Kaskazini Pemba": "06", 3385 | "Kaskazini Unguja": "07", 3386 | "Kigoma": "08", 3387 | "Kilimanjaro": "09", 3388 | "Kusini Pemba": "10", 3389 | "Kusini Unguja": "11", 3390 | "Lindi": "12", 3391 | "Manyara": "26", 3392 | "Mara": "13", 3393 | "Mbeya": "14", 3394 | "Mjini Magharibi": "15", 3395 | "Morogoro": "16", 3396 | "Mtwara": "17", 3397 | "Mwanza": "18", 3398 | "Pwani": "19", 3399 | "Rukwa": "20", 3400 | "Ruvuma": "21", 3401 | "Shinyanga": "22", 3402 | "Singida": "23", 3403 | "Tabora": "24", 3404 | "Tanga": "25", 3405 | }, 3406 | "TH": map[string]string{ 3407 | "Amnat Charoen": "37", 3408 | "Ang Thong": "15", 3409 | "Bueng Kan": "38", 3410 | "Buri Ram": "31", 3411 | "Chachoengsao": "24", 3412 | "Chai Nat": "18", 3413 | "Chaiyaphum": "36", 3414 | "Chanthaburi": "22", 3415 | "Chiang Mai": "50", 3416 | "Chiang Rai": "57", 3417 | "Chon Buri": "20", 3418 | "Chumphon": "86", 3419 | "Kalasin": "46", 3420 | "Kamphaeng Phet": "62", 3421 | "Kanchanaburi": "71", 3422 | "Khon Kaen": "40", 3423 | "Krabi": "81", 3424 | "Krung Thep Maha Nakhon": "10", 3425 | "Lampang": "52", 3426 | "Lamphun": "51", 3427 | "Loei": "42", 3428 | "Lop Buri": "16", 3429 | "Mae Hong Son": "58", 3430 | "Maha Sarakham": "44", 3431 | "Mukdahan": "49", 3432 | "Nakhon Nayok": "26", 3433 | "Nakhon Pathom": "73", 3434 | "Nakhon Phanom": "48", 3435 | "Nakhon Ratchasima": "30", 3436 | "Nakhon Sawan": "60", 3437 | "Nakhon Si Thammarat": "80", 3438 | "Nan": "55", 3439 | "Narathiwat": "96", 3440 | "Nong Bua Lam Phu": "39", 3441 | "Nong Khai": "43", 3442 | "Nonthaburi": "12", 3443 | "Pathum Thani": "13", 3444 | "Pattani": "94", 3445 | "Phangnga": "82", 3446 | "Phatthalung": "93", 3447 | "Phatthaya": "S", 3448 | "Phayao": "56", 3449 | "Phetchabun": "67", 3450 | "Phetchaburi": "76", 3451 | "Phichit": "66", 3452 | "Phitsanulok": "65", 3453 | "Phra Nakhon Si Ayutthaya": "14", 3454 | "Phrae": "54", 3455 | "Phuket": "83", 3456 | "Prachin Buri": "25", 3457 | "Prachuap Khiri Khan": "77", 3458 | "Ranong": "85", 3459 | "Ratchaburi": "70", 3460 | "Rayong": "21", 3461 | "Roi Et": "45", 3462 | "Sa Kaeo": "27", 3463 | "Sakon Nakhon": "47", 3464 | "Samut Prakan": "11", 3465 | "Samut Sakhon": "74", 3466 | "Samut Songkhram": "75", 3467 | "Saraburi": "19", 3468 | "Satun": "91", 3469 | "Si Sa Ket": "33", 3470 | "Sing Buri": "17", 3471 | "Songkhla": "90", 3472 | "Sukhothai": "64", 3473 | "Suphan Buri": "72", 3474 | "Surat Thani": "84", 3475 | "Surin": "32", 3476 | "Tak": "63", 3477 | "Trang": "92", 3478 | "Trat": "23", 3479 | "Ubon Ratchathani": "34", 3480 | "Udon Thani": "41", 3481 | "Uthai Thani": "61", 3482 | "Uttaradit": "53", 3483 | "Yala": "95", 3484 | "Yasothon": "35", 3485 | }, 3486 | "TL": map[string]string{ 3487 | "Aileu": "AL", 3488 | "Ainaro": "AN", 3489 | "Baucau": "BA", 3490 | "Bobonaro": "BO", 3491 | "Cova Lima": "CO", 3492 | "Díli": "DI", 3493 | "Ermera": "ER", 3494 | "Lautem": "LA", 3495 | "Liquiça": "LI", 3496 | "Manatuto": "MT", 3497 | "Manufahi": "MF", 3498 | "Oecussi": "OE", 3499 | "Viqueque": "VI", 3500 | }, 3501 | "TG": map[string]string{ 3502 | "Centre": "C", 3503 | "Kara": "K", 3504 | "Maritime": "M", 3505 | "Plateaux": "P", 3506 | "Savannes": "S", 3507 | }, 3508 | "TK": map[string]string{}, 3509 | "TO": map[string]string{ 3510 | "'Eua": "01", 3511 | "Ha'apai": "02", 3512 | "Niuas": "03", 3513 | "Tongatapu": "04", 3514 | "Vava'u": "05", 3515 | }, 3516 | "TT": map[string]string{ 3517 | "Arima": "ARI", 3518 | "Chaguanas": "CHA", 3519 | "Couva-Tabaquite-Talparo": "CTT", 3520 | "Diego Martin": "DMN", 3521 | "Eastern Tobago": "ETO", 3522 | "Penal-Debe": "PED", 3523 | "Point Fortin": "PTF", 3524 | "Port of Spain": "POS", 3525 | "Princes Town": "PRT", 3526 | "Rio Claro-Mayaro": "RCM", 3527 | "San Fernando": "SFO", 3528 | "San Juan-Laventille": "SJL", 3529 | "Sangre Grande": "SGE", 3530 | "Siparia": "SIP", 3531 | "Tunapuna-Piarco": "TUP", 3532 | "Western Tobago": "WTO", 3533 | }, 3534 | "TN": map[string]string{ 3535 | "Ariana": "12", 3536 | "Ben Arous": "13", 3537 | "Bizerte": "23", 3538 | "Béja": "31", 3539 | "Gabès": "81", 3540 | "Gafsa": "71", 3541 | "Jendouba": "32", 3542 | "Kairouan": "41", 3543 | "Kasserine": "42", 3544 | "Kebili": "73", 3545 | "La Manouba": "14", 3546 | "Le Kef": "33", 3547 | "Mahdia": "53", 3548 | "Medenine": "82", 3549 | "Monastir": "52", 3550 | "Nabeul": "21", 3551 | "Sfax": "61", 3552 | "Sidi Bouzid": "43", 3553 | "Siliana": "34", 3554 | "Sousse": "51", 3555 | "Tataouine": "83", 3556 | "Tozeur": "72", 3557 | "Tunis": "11", 3558 | "Zaghouan": "22", 3559 | }, 3560 | "TR": map[string]string{ 3561 | "Adana": "01", 3562 | "Adıyaman": "02", 3563 | "Afyonkarahisar": "03", 3564 | "Aksaray": "68", 3565 | "Amasya": "05", 3566 | "Ankara": "06", 3567 | "Antalya": "07", 3568 | "Ardahan": "75", 3569 | "Artvin": "08", 3570 | "Aydın": "09", 3571 | "Ağrı": "04", 3572 | "Balıkesir": "10", 3573 | "Bartın": "74", 3574 | "Batman": "72", 3575 | "Bayburt": "69", 3576 | "Bilecik": "11", 3577 | "Bingöl": "12", 3578 | "Bitlis": "13", 3579 | "Bolu": "14", 3580 | "Burdur": "15", 3581 | "Bursa": "16", 3582 | "Denizli": "20", 3583 | "Diyarbakır": "21", 3584 | "Düzce": "81", 3585 | "Edirne": "22", 3586 | "Elazığ": "23", 3587 | "Erzincan": "24", 3588 | "Erzurum": "25", 3589 | "Eskişehir": "26", 3590 | "Gaziantep": "27", 3591 | "Giresun": "28", 3592 | "Gümüşhane": "29", 3593 | "Hakkâri": "30", 3594 | "Hatay": "31", 3595 | "Isparta": "32", 3596 | "Iğdır": "76", 3597 | "Kahramanmaraş": "46", 3598 | "Karabük": "78", 3599 | "Karaman": "70", 3600 | "Kars": "36", 3601 | "Kastamonu": "37", 3602 | "Kayseri": "38", 3603 | "Kilis": "79", 3604 | "Kocaeli": "41", 3605 | "Konya": "42", 3606 | "Kütahya": "43", 3607 | "Kırklareli": "39", 3608 | "Kırıkkale": "71", 3609 | "Kırşehir": "40", 3610 | "Malatya": "44", 3611 | "Manisa": "45", 3612 | "Mardin": "47", 3613 | "Mersin": "33", 3614 | "Muğla": "48", 3615 | "Muş": "49", 3616 | "Nevşehir": "50", 3617 | "Niğde": "51", 3618 | "Ordu": "52", 3619 | "Osmaniye": "80", 3620 | "Rize": "53", 3621 | "Sakarya": "54", 3622 | "Samsun": "55", 3623 | "Siirt": "56", 3624 | "Sinop": "57", 3625 | "Sivas": "58", 3626 | "Tekirdağ": "59", 3627 | "Tokat": "60", 3628 | "Trabzon": "61", 3629 | "Tunceli": "62", 3630 | "Uşak": "64", 3631 | "Van": "65", 3632 | "Yalova": "77", 3633 | "Yozgat": "66", 3634 | "Zonguldak": "67", 3635 | "Çanakkale": "17", 3636 | "Çankırı": "18", 3637 | "Çorum": "19", 3638 | "İstanbul": "34", 3639 | "İzmir": "35", 3640 | "Şanlıurfa": "63", 3641 | "Şırnak": "73", 3642 | }, 3643 | "TM": map[string]string{ 3644 | "Ahal": "A", 3645 | "Aşgabat": "S", 3646 | "Balkan": "B", 3647 | "Daşoguz": "D", 3648 | "Lebap": "L", 3649 | "Mary": "M", 3650 | }, 3651 | "TC": map[string]string{}, 3652 | "TV": map[string]string{ 3653 | "Funafuti": "FUN", 3654 | "Nanumanga": "NMG", 3655 | "Nanumea": "NMA", 3656 | "Niutao": "NIT", 3657 | "Nui": "NUI", 3658 | "Nukufetau": "NKF", 3659 | "Nukulaelae": "NKL", 3660 | "Vaitupu": "VAI", 3661 | }, 3662 | "UG": map[string]string{ 3663 | "Central": "C", 3664 | "Eastern": "E", 3665 | "Northern": "N", 3666 | "Western": "W", 3667 | }, 3668 | "UA": map[string]string{ 3669 | "Avtonomna Respublika Krym": "43", 3670 | "Cherkas'ka Oblast'": "71", 3671 | "Chernihivs'ka Oblast'": "74", 3672 | "Chernivets'ka Oblast'": "77", 3673 | "Dnipropetrovs'ka Oblast'": "12", 3674 | "Donets'ka Oblast'": "14", 3675 | "Ivano-Frankivs'ka Oblast'": "26", 3676 | "Kharkivs'ka Oblast'": "63", 3677 | "Khersons'ka Oblast'": "65", 3678 | "Khmel'nyts'ka Oblast'": "68", 3679 | "Kirovohrads'ka Oblast'": "35", 3680 | "Kyïv": "30", 3681 | "Kyïvs'ka Oblast'": "32", 3682 | "L'vivs'ka Oblast'": "46", 3683 | "Luhans'ka Oblast'": "09", 3684 | "Mykolaïvs'ka Oblast'": "48", 3685 | "Odes'ka Oblast'": "51", 3686 | "Poltavs'ka Oblast'": "53", 3687 | "Rivnens'ka Oblast'": "56", 3688 | "Sevastopol'": "40", 3689 | "Sums'ka Oblast'": "59", 3690 | "Ternopil's'ka Oblast'": "61", 3691 | "Vinnyts'ka Oblast'": "05", 3692 | "Volyns'ka Oblast'": "07", 3693 | "Zakarpats'ka Oblast'": "21", 3694 | "Zaporiz'ka Oblast'": "23", 3695 | "Zhytomyrs'ka Oblast'": "18", 3696 | }, 3697 | "AE": map[string]string{ 3698 | "'Ajmān": "AJ", 3699 | "Abū Z̧aby": "AZ", 3700 | "Al Fujayrah": "FU", 3701 | "Ash Shāriqah": "SH", 3702 | "Dubayy": "DU", 3703 | "Ra's al Khaymah": "RK", 3704 | "Umm al Qaywayn": "UQ", 3705 | }, 3706 | "GB": map[string]string{ 3707 | "Barking and Dagenham": "BDG", 3708 | "Barnet": "BNE", 3709 | "Bexley": "BEX", 3710 | "Brent": "BEN", 3711 | "Bromley": "BRY", 3712 | "Camden": "CMD", 3713 | "Croydon": "CRY", 3714 | "Ealing": "EAL", 3715 | "Enfield": "ENF", 3716 | "Greenwich": "GRE", 3717 | "Hackney": "HCK", 3718 | "Hammersmith and Fulham": "HMF", 3719 | "Haringey": "HRY", 3720 | "Harrow": "HRW", 3721 | "Havering": "HAV", 3722 | "Hillingdon": "HIL", 3723 | "Hounslow": "HNS", 3724 | "Islington": "ISL", 3725 | "Kensington and Chelsea": "KEC", 3726 | "Kingston upon Thames": "KTT", 3727 | "Lambeth": "LBH", 3728 | "Lewisham": "LEW", 3729 | "Merton": "MRT", 3730 | "Newham": "NWM", 3731 | "Redbridge": "RDB", 3732 | "Richmond upon Thames": "RIC", 3733 | "Southwark": "SWK", 3734 | "Sutton": "STN", 3735 | "Tower Hamlets": "TWH", 3736 | "Waltham Forest": "WFT", 3737 | "Wandsworth": "WND", 3738 | "Westminster": "WSM", 3739 | "England and Wales": "EAW", 3740 | "Great Britain": "GBN", 3741 | "United Kingdom": "UKM", 3742 | "London, City of": "LND", 3743 | "Aberdeen City": "ABE", 3744 | "Aberdeenshire": "ABD", 3745 | "Angus": "ANS", 3746 | "Argyll and Bute": "AGB", 3747 | "Clackmannanshire": "CLK", 3748 | "Dumfries and Galloway": "DGY", 3749 | "Dundee City": "DND", 3750 | "East Ayrshire": "EAY", 3751 | "East Dunbartonshire": "EDU", 3752 | "East Lothian": "ELN", 3753 | "East Renfrewshire": "ERW", 3754 | "Edinburgh, City of": "EDH", 3755 | "Eilean Siar": "ELS", 3756 | "Falkirk": "FAL", 3757 | "Fife": "FIF", 3758 | "Glasgow City": "GLG", 3759 | "Highland": "HLD", 3760 | "Inverclyde": "IVC", 3761 | "Midlothian": "MLN", 3762 | "Moray": "MRY", 3763 | "North Ayrshire": "NAY", 3764 | "North Lanarkshire": "NLK", 3765 | "Orkney Islands": "ORK", 3766 | "Perth and Kinross": "PKN", 3767 | "Renfrewshire": "RFW", 3768 | "Scottish Borders, The": "SCB", 3769 | "Shetland Islands": "ZET", 3770 | "South Ayrshire": "SAY", 3771 | "South Lanarkshire": "SLK", 3772 | "Stirling": "STG", 3773 | "West Dunbartonshire": "WDU", 3774 | "West Lothian": "WLN", 3775 | "England": "ENG", 3776 | "Scotland": "SCT", 3777 | "Wales": "WLS", 3778 | "Antrim": "ANT", 3779 | "Ards": "ARD", 3780 | "Armagh": "ARM", 3781 | "Ballymena": "BLA", 3782 | "Ballymoney": "BLY", 3783 | "Banbridge": "BNB", 3784 | "Belfast": "BFS", 3785 | "Carrickfergus": "CKF", 3786 | "Castlereagh": "CSR", 3787 | "Coleraine": "CLR", 3788 | "Cookstown": "CKT", 3789 | "Craigavon": "CGV", 3790 | "Derry": "DRY", 3791 | "Down": "DOW", 3792 | "Dungannon and South Tyrone": "DGN", 3793 | "Fermanagh": "FER", 3794 | "Larne": "LRN", 3795 | "Limavady": "LMV", 3796 | "Lisburn": "LSB", 3797 | "Magherafelt": "MFT", 3798 | "Moyle": "MYL", 3799 | "Newry and Mourne District": "NYM", 3800 | "Newtownabbey": "NTA", 3801 | "North Down": "NDN", 3802 | "Omagh": "OMH", 3803 | "Strabane": "STB", 3804 | "Barnsley": "BNS", 3805 | "Birmingham": "BIR", 3806 | "Bolton": "BOL", 3807 | "Bradford": "BRD", 3808 | "Bury": "BUR", 3809 | "Calderdale": "CLD", 3810 | "Coventry": "COV", 3811 | "Doncaster": "DNC", 3812 | "Dudley": "DUD", 3813 | "Gateshead": "GAT", 3814 | "Kirklees": "KIR", 3815 | "Knowsley": "KWL", 3816 | "Leeds": "LDS", 3817 | "Liverpool": "LIV", 3818 | "Manchester": "MAN", 3819 | "Newcastle upon Tyne": "NET", 3820 | "North Tyneside": "NTY", 3821 | "Oldham": "OLD", 3822 | "Rochdale": "RCH", 3823 | "Rotherham": "ROT", 3824 | "Salford": "SLF", 3825 | "Sandwell": "SAW", 3826 | "Sefton": "SFT", 3827 | "Sheffield": "SHF", 3828 | "Solihull": "SOL", 3829 | "South Tyneside": "STY", 3830 | "St. Helens": "SHN", 3831 | "Stockport": "SKP", 3832 | "Sunderland": "SND", 3833 | "Tameside": "TAM", 3834 | "Trafford": "TRF", 3835 | "Wakefield": "WKF", 3836 | "Walsall": "WLL", 3837 | "Wigan": "WGN", 3838 | "Wirral": "WRL", 3839 | "Wolverhampton": "WLV", 3840 | "Northern Ireland": "NIR", 3841 | "Buckinghamshire": "BKM", 3842 | "Cambridgeshire": "CAM", 3843 | "Cumbria": "CMA", 3844 | "Derbyshire": "DBY", 3845 | "Devon": "DEV", 3846 | "Dorset": "DOR", 3847 | "East Sussex": "ESX", 3848 | "Essex": "ESS", 3849 | "Gloucestershire": "GLS", 3850 | "Hampshire": "HAM", 3851 | "Hertfordshire": "HRT", 3852 | "Kent": "KEN", 3853 | "Lancashire": "LAN", 3854 | "Leicestershire": "LEC", 3855 | "Lincolnshire": "LIN", 3856 | "Norfolk": "NFK", 3857 | "North Yorkshire": "NYK", 3858 | "Northamptonshire": "NTH", 3859 | "Nottinghamshire": "NTT", 3860 | "Oxfordshire": "OXF", 3861 | "Somerset": "SOM", 3862 | "Staffordshire": "STS", 3863 | "Suffolk": "SFK", 3864 | "Surrey": "SRY", 3865 | "Warwickshire": "WAR", 3866 | "West Sussex": "WSX", 3867 | "Worcestershire": "WOR", 3868 | "Bath and North East Somerset": "BAS", 3869 | "Bedford": "BDF", 3870 | "Blackburn with Darwen": "BBD", 3871 | "Blackpool": "BPL", 3872 | "Blaenau Gwent": "BGW", 3873 | "Bournemouth": "BMH", 3874 | "Bracknell Forest": "BRC", 3875 | "Bridgend": "BGE", 3876 | "Brighton and Hove": "BNH", 3877 | "Bristol, City of": "BST", 3878 | "Caerphilly": "CAY", 3879 | "Cardiff": "CRF", 3880 | "Carmarthenshire": "CMN", 3881 | "Central Bedfordshire": "CBF", 3882 | "Ceredigion": "CGN", 3883 | "Cheshire East": "CHE", 3884 | "Cheshire West and Chester": "CHW", 3885 | "Conwy": "CWY", 3886 | "Cornwall": "CON", 3887 | "Darlington": "DAL", 3888 | "Denbighshire": "DEN", 3889 | "Derby": "DER", 3890 | "Durham, County": "DUR", 3891 | "East Riding of Yorkshire": "ERY", 3892 | "Flintshire": "FLN", 3893 | "Gwynedd": "GWN", 3894 | "Halton": "HAL", 3895 | "Hartlepool": "HPL", 3896 | "Herefordshire": "HEF", 3897 | "Isle of Anglesey": "AGY", 3898 | "Isle of Wight": "IOW", 3899 | "Isles of Scilly": "IOS", 3900 | "Kingston upon Hull": "KHL", 3901 | "Leicester": "LCE", 3902 | "Luton": "LUT", 3903 | "Medway": "MDW", 3904 | "Merthyr Tydfil": "MTY", 3905 | "Middlesbrough": "MDB", 3906 | "Milton Keynes": "MIK", 3907 | "Monmouthshire": "MON", 3908 | "Neath Port Talbot": "NTL", 3909 | "Newport": "NWP", 3910 | "North East Lincolnshire": "NEL", 3911 | "North Lincolnshire": "NLN", 3912 | "North Somerset": "NSM", 3913 | "Northumberland": "NBL", 3914 | "Nottingham": "NGM", 3915 | "Pembrokeshire": "PEM", 3916 | "Peterborough": "PTE", 3917 | "Plymouth": "PLY", 3918 | "Poole": "POL", 3919 | "Portsmouth": "POR", 3920 | "Powys": "POW", 3921 | "Reading": "RDG", 3922 | "Redcar and Cleveland": "RCC", 3923 | "Rhondda, Cynon, Taff": "RCT", 3924 | "Rutland": "RUT", 3925 | "Shropshire": "SHR", 3926 | "Slough": "SLG", 3927 | "South Gloucestershire": "SGC", 3928 | "Southampton": "STH", 3929 | "Southend-on-Sea": "SOS", 3930 | "Stockton-on-Tees": "STT", 3931 | "Stoke-on-Trent": "STE", 3932 | "Swansea": "SWA", 3933 | "Swindon": "SWD", 3934 | "Telford and Wrekin": "TFW", 3935 | "Thurrock": "THR", 3936 | "Torbay": "TOB", 3937 | "Torfaen": "TOF", 3938 | "Vale of Glamorgan, The": "VGL", 3939 | "Warrington": "WRT", 3940 | "West Berkshire": "WBK", 3941 | "Wiltshire": "WIL", 3942 | "Windsor and Maidenhead": "WNM", 3943 | "Wokingham": "WOK", 3944 | "Wrexham": "WRX", 3945 | "York": "YOR", 3946 | }, 3947 | "US": map[string]string{ 3948 | "AL": "Alabama", 3949 | "AK": "Alaska", 3950 | "AS": "American Samoa", 3951 | "AZ": "Arizona", 3952 | "AR": "Arkansas", 3953 | "CA": "California", 3954 | "CO": "Colorado", 3955 | "CT": "Connecticut", 3956 | "DE": "Delaware", 3957 | "DC": "District Of Columbia", 3958 | "FM": "Federated States Of Micronesia", 3959 | "FL": "Florida", 3960 | "GA": "Georgia", 3961 | "GU": "Guam", 3962 | "HI": "Hawaii", 3963 | "ID": "Idaho", 3964 | "IL": "Illinois", 3965 | "IN": "Indiana", 3966 | "IA": "Iowa", 3967 | "KS": "Kansas", 3968 | "KY": "Kentucky", 3969 | "LA": "Louisiana", 3970 | "ME": "Maine", 3971 | "MH": "Marshall Islands", 3972 | "MD": "Maryland", 3973 | "MA": "Massachusetts", 3974 | "MI": "Michigan", 3975 | "MN": "Minnesota", 3976 | "MS": "Mississippi", 3977 | "MO": "Missouri", 3978 | "MT": "Montana", 3979 | "NE": "Nebraska", 3980 | "NV": "Nevada", 3981 | "NH": "New Hampshire", 3982 | "NJ": "New Jersey", 3983 | "NM": "New Mexico", 3984 | "NY": "New York", 3985 | "NC": "North Carolina", 3986 | "ND": "North Dakota", 3987 | "MP": "Northern Mariana Islands", 3988 | "OH": "Ohio", 3989 | "OK": "Oklahoma", 3990 | "OR": "Oregon", 3991 | "PW": "Palau", 3992 | "PA": "Pennsylvania", 3993 | "PR": "Puerto Rico", 3994 | "RI": "Rhode Island", 3995 | "SC": "South Carolina", 3996 | "SD": "South Dakota", 3997 | "TN": "Tennessee", 3998 | "TX": "Texas", 3999 | "UT": "Utah", 4000 | "VT": "Vermont", 4001 | "VI": "Virgin Islands", 4002 | "VA": "Virginia", 4003 | "WA": "Washington", 4004 | "WV": "West Virginia", 4005 | "WI": "Wisconsin", 4006 | "WY": "Wyoming", 4007 | }, 4008 | "UY": map[string]string{ 4009 | "Artigas": "AR", 4010 | "Canelones": "CA", 4011 | "Cerro Largo": "CL", 4012 | "Colonia": "CO", 4013 | "Durazno": "DU", 4014 | "Flores": "FS", 4015 | "Florida": "FD", 4016 | "Lavalleja": "LA", 4017 | "Maldonado": "MA", 4018 | "Montevideo": "MO", 4019 | "Paysandú": "PA", 4020 | "Rivera": "RV", 4021 | "Rocha": "RO", 4022 | "Río Negro": "RN", 4023 | "Salto": "SA", 4024 | "San José": "SJ", 4025 | "Soriano": "SO", 4026 | "Tacuarembó": "TA", 4027 | "Treinta y Tres": "TT", 4028 | }, 4029 | "UZ": map[string]string{ 4030 | "Andijon": "AN", 4031 | "Buxoro": "BU", 4032 | "Farg‘ona": "FA", 4033 | "Jizzax": "JI", 4034 | "Namangan": "NG", 4035 | "Navoiy": "NW", 4036 | "Qashqadaryo": "QA", 4037 | "Qoraqalpog‘iston Respublikasi": "QR", 4038 | "Samarqand": "SA", 4039 | "Sirdaryo": "SI", 4040 | "Surxondaryo": "SU", 4041 | "Toshkent": "TK", 4042 | "Xorazm": "XO", 4043 | }, 4044 | "VU": map[string]string{ 4045 | "Malampa": "MAP", 4046 | "Pénama": "PAM", 4047 | "Sanma": "SAM", 4048 | "Shéfa": "SEE", 4049 | "Taféa": "TAE", 4050 | "Torba": "TOB", 4051 | }, 4052 | "VE": map[string]string{ 4053 | "Amazonas": "Z", 4054 | "Anzoátegui": "B", 4055 | "Apure": "C", 4056 | "Aragua": "D", 4057 | "Barinas": "E", 4058 | "Bolívar": "F", 4059 | "Carabobo": "G", 4060 | "Cojedes": "H", 4061 | "Delta Amacuro": "Y", 4062 | "Dependencias Federales": "W", 4063 | "Distrito Capital": "A", 4064 | "Falcón": "I", 4065 | "Guárico": "J", 4066 | "Lara": "K", 4067 | "Miranda": "M", 4068 | "Monagas": "N", 4069 | "Mérida": "L", 4070 | "Nueva Esparta": "O", 4071 | "Portuguesa": "P", 4072 | "Sucre": "R", 4073 | "Trujillo": "T", 4074 | "Táchira": "S", 4075 | "Vargas": "X", 4076 | "Yaracuy": "U", 4077 | "Zulia": "V", 4078 | }, 4079 | "VN": map[string]string{ 4080 | "An Giang": "44", 4081 | "Bà Rịa–Vũng Tàu": "43", 4082 | "Bình Dương": "57", 4083 | "Bình Phước": "58", 4084 | "Bình Thuận": "40", 4085 | "Bình Định": "31", 4086 | "Bạc Liêu": "55", 4087 | "Bắc Giang": "54", 4088 | "Bắc Kạn": "53", 4089 | "Bắc Ninh": "56", 4090 | "Bến Tre": "50", 4091 | "Cao Bằng": "04", 4092 | "Cà Mau": "59", 4093 | "Cần Thơ": "CT", 4094 | "Gia Lai": "30", 4095 | "Hà Giang": "03", 4096 | "Hà Nam": "63", 4097 | "Hà Nội": "HN", 4098 | "Hà Tây": "15", 4099 | "Hà Tĩnh": "23", 4100 | "Hòa Bình": "14", 4101 | "Hưng Yên": "66", 4102 | "Hải Dương": "61", 4103 | "Hải Phòng": "HP", 4104 | "Hậu Giang": "73", 4105 | "Hồ Chí Minh": "SG", 4106 | "Khánh Hòa": "34", 4107 | "Kiên Giang": "47", 4108 | "Kon Tum": "28", 4109 | "Lai Châu": "01", 4110 | "Long An": "41", 4111 | "Lào Cai": "02", 4112 | "Lâm Đồng": "35", 4113 | "Lạng Sơn": "09", 4114 | "Nam Định": "67", 4115 | "Nghệ An": "22", 4116 | "Ninh Bình": "18", 4117 | "Ninh Thuận": "36", 4118 | "Phú Thọ": "68", 4119 | "Phú Yên": "32", 4120 | "Quảng Bình": "24", 4121 | "Quảng Nam": "27", 4122 | "Quảng Ngãi": "29", 4123 | "Quảng Ninh": "13", 4124 | "Quảng Trị": "25", 4125 | "Sóc Trăng": "52", 4126 | "Sơn La": "05", 4127 | "Thanh Hóa": "21", 4128 | "Thái Bình": "20", 4129 | "Thái Nguyên": "69", 4130 | "Thừa Thiên–Huế": "26", 4131 | "Tiền Giang": "46", 4132 | "Trà Vinh": "51", 4133 | "Tuyên Quang": "07", 4134 | "Tây Ninh": "37", 4135 | "Vĩnh Long": "49", 4136 | "Vĩnh Phúc": "70", 4137 | "Yên Bái": "06", 4138 | "Điện Biên": "71", 4139 | "Đà Nẵng": "DN", 4140 | "Đắk Lắk": "33", 4141 | "Đắk Nông": "72", 4142 | "Đồng Nai": "39", 4143 | "Đồng Tháp": "45", 4144 | }, 4145 | "WF": map[string]string{}, 4146 | "EH": map[string]string{}, 4147 | "YE": map[string]string{ 4148 | "'Adan": "AD", 4149 | "'Amrān": "AM", 4150 | "Abyān": "AB", 4151 | "Al Bayḑā'": "BA", 4152 | "Al Jawf": "JA", 4153 | "Al Mahrah": "MR", 4154 | "Al Maḩwīt": "MW", 4155 | "Al Ḩudaydah": "HU", 4156 | "Aḑ Ḑāli'": "DA", 4157 | "Dhamār": "DH", 4158 | "Ibb": "IB", 4159 | "Laḩij": "LA", 4160 | "Ma'rib": "MA", 4161 | "Raymah": "RA", 4162 | "Shabwah": "SH", 4163 | "Tā‘izz": "TA", 4164 | "Şan‘ā'": "SN", 4165 | "Şā‘dah": "SD", 4166 | "Ḩajjah": "HJ", 4167 | "Ḩaḑramawt": "HD", 4168 | }, 4169 | "ZM": map[string]string{ 4170 | "Central": "02", 4171 | "Copperbelt": "08", 4172 | "Eastern": "03", 4173 | "Luapula": "04", 4174 | "Lusaka": "09", 4175 | "North-Western": "06", 4176 | "Northern": "05", 4177 | "Southern": "07", 4178 | "Western": "01", 4179 | }, 4180 | "ZW": map[string]string{ 4181 | "Bulawayo": "BU", 4182 | "Harare": "HA", 4183 | "Manicaland": "MA", 4184 | "Mashonaland Central": "MC", 4185 | "Mashonaland East": "ME", 4186 | "Mashonaland West": "MW", 4187 | "Masvingo": "MV", 4188 | "Matabeleland North": "MN", 4189 | "Matabeleland South": "MS", 4190 | "Midlands": "MI", 4191 | }, 4192 | } 4193 | 4194 | func GetStateCode(country, state string) string { 4195 | if c, ok := states[country]; ok { 4196 | if s, ok := c[state]; ok { 4197 | return s 4198 | } 4199 | } 4200 | 4201 | return "" 4202 | } 4203 | -------------------------------------------------------------------------------- /src/bot/utils/utils.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "math/rand" 7 | "strconv" 8 | "strings" 9 | ) 10 | 11 | func RandomString(length int, charset string) string { 12 | temp := make([]byte, length) 13 | 14 | for i := range temp { 15 | temp[i] = charset[rand.Intn(len(charset))] 16 | } 17 | 18 | return string(temp) 19 | } 20 | 21 | func Frange(r1, r2 string) ([]string, error) { 22 | 23 | start, err := strconv.ParseFloat(r1, 64) 24 | 25 | if err != nil { 26 | return []string{}, nil 27 | } 28 | 29 | stop, err := strconv.ParseFloat(r2, 64) 30 | 31 | if err != nil { 32 | return []string{}, nil 33 | } 34 | 35 | sizes := []string{} 36 | 37 | for { 38 | if start > stop { 39 | return sizes, nil 40 | } 41 | 42 | sizes = append(sizes, fmt.Sprintf("%g", start)) 43 | start += .5 44 | } 45 | } 46 | 47 | func Extract(target, before, after string) (string, error) { 48 | temp := strings.Split(target, before) 49 | 50 | if len(temp) < 2 { 51 | return "", errors.New("index1 doesn't exist in target") 52 | } 53 | 54 | temp = strings.Split(temp[1], after) 55 | 56 | if len(temp) < 2 { 57 | return "", errors.New("index2 doesn't exist in target") 58 | } 59 | 60 | return temp[0], nil 61 | } 62 | -------------------------------------------------------------------------------- /src/bot/webhooks/webhooks.go: -------------------------------------------------------------------------------- 1 | package webhooks 2 | 3 | import ( 4 | "bytes" 5 | "encoding/json" 6 | "net/http" 7 | "time" 8 | ) 9 | 10 | type Footer struct { 11 | Text string `json:"text"` 12 | IconURL string `json:"icon_url"` 13 | } 14 | 15 | type Field struct { 16 | Name string `json:"name"` 17 | Value string `json:"value"` 18 | Inline bool `json:"inline"` 19 | } 20 | 21 | type Thumbnail struct { 22 | URL string `json:"url"` 23 | } 24 | 25 | type Embed struct { 26 | Title string `json:"title"` 27 | Color int `json:"color"` 28 | Thumbnail Thumbnail `json:"thumbnail"` 29 | Description string `json:"description"` 30 | Footer Footer `json:"footer"` 31 | Fields []Field `json:"fields"` 32 | } 33 | 34 | type Webhook struct { 35 | Content string `json:"content"` 36 | Embeds []Embed `json:"embeds"` 37 | } 38 | 39 | func (e *Embed) SetTitle(title string) { 40 | e.Title = title 41 | } 42 | 43 | func (e *Embed) SetColor(color int) { 44 | e.Color = color 45 | } 46 | 47 | func (e *Embed) SetThumbnail(u string) { 48 | e.Thumbnail = Thumbnail{URL: u} 49 | } 50 | 51 | func (e *Embed) SetDescription(description string) { 52 | e.Description = description 53 | } 54 | 55 | func (e *Embed) SetFooter(text, icon string) { 56 | e.Footer = Footer{Text: text, IconURL: icon} 57 | } 58 | 59 | func (e *Embed) AddField(name, value string, inline bool) { 60 | e.Fields = append(e.Fields, Field{Name: name, Value: value, Inline: inline}) 61 | } 62 | 63 | func (w *Webhook) SetContent(content string) { 64 | w.Content = content 65 | } 66 | 67 | func (w *Webhook) AddEmbed(e Embed) { 68 | w.Embeds = append(w.Embeds, e) 69 | } 70 | 71 | func (w *Webhook) Encode() ([]byte, error) { 72 | encoded, err := json.Marshal(w) 73 | 74 | if err != nil { 75 | return nil, err 76 | } 77 | 78 | return encoded, nil 79 | } 80 | 81 | func (w *Webhook) Send(u string) error { 82 | 83 | payload, err := w.Encode() 84 | 85 | if err != nil { 86 | return err 87 | } 88 | 89 | for { 90 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload)) 91 | 92 | if err != nil { 93 | return err 94 | } 95 | 96 | req.Header.Set("Content-Type", "application/json") 97 | 98 | resp, err := http.DefaultClient.Do(req) 99 | 100 | if err != nil { 101 | return err 102 | } 103 | 104 | resp.Body.Close() 105 | 106 | if resp.StatusCode != 429 { 107 | return nil 108 | } 109 | 110 | time.Sleep(time.Second * 5) 111 | } 112 | } 113 | --------------------------------------------------------------------------------