/*
 * Copyright 2012 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.i18n.client.impl.cldr;

import com.google.gwt.core.client.JavaScriptObject;

// DO NOT EDIT - GENERATED FROM CLDR DATA

/**
 * Localized names for the "sah" locale.
 */
public class LocalizedNamesImpl_sah extends LocalizedNamesImpl {

  @Override
  public String[] loadSortedRegionCodes() {
    return new String[] {
        "AC",
        "AD",
        "AE",
        "AF",
        "AG",
        "AI",
        "AL",
        "AM",
        "AO",
        "AQ",
        "AR",
        "AS",
        "AT",
        "AU",
        "AW",
        "AX",
        "AZ",
        "BA",
        "BB",
        "BD",
        "BE",
        "BF",
        "BG",
        "BH",
        "BI",
        "BJ",
        "BL",
        "BM",
        "BN",
        "BO",
        "BQ",
        "BS",
        "BT",
        "BV",
        "BW",
        "BY",
        "BZ",
        "CC",
        "CD",
        "CF",
        "CG",
        "CH",
        "CI",
        "CK",
        "CM",
        "CO",
        "CP",
        "CR",
        "CV",
        "CW",
        "CX",
        "CY",
        "CZ",
        "DE",
        "DG",
        "DJ",
        "DK",
        "DM",
        "DO",
        "DZ",
        "EA",
        "EC",
        "EG",
        "EH",
        "ER",
        "ES",
        "ET",
        "EU",
        "EZ",
        "FJ",
        "FK",
        "FM",
        "FO",
        "FR",
        "GA",
        "GD",
        "GE",
        "GF",
        "GG",
        "GH",
        "GI",
        "GL",
        "GM",
        "GN",
        "GP",
        "GQ",
        "GR",
        "GS",
        "GT",
        "GU",
        "GW",
        "GY",
        "HK",
        "HM",
        "HN",
        "HR",
        "HT",
        "HU",
        "IC",
        "ID",
        "IL",
        "IN",
        "IO",
        "IQ",
        "IR",
        "IT",
        "JE",
        "JO",
        "JP",
        "KE",
        "KG",
        "KH",
        "KI",
        "KM",
        "KN",
        "KP",
        "KR",
        "KW",
        "KY",
        "KZ",
        "LA",
        "LB",
        "LC",
        "LI",
        "LK",
        "LR",
        "LS",
        "LU",
        "MA",
        "MC",
        "MD",
        "ME",
        "MF",
        "MG",
        "MH",
        "MK",
        "ML",
        "MM",
        "MN",
        "MO",
        "MP",
        "MQ",
        "MR",
        "MS",
        "MT",
        "MU",
        "MV",
        "MW",
        "MY",
        "MZ",
        "NA",
        "NC",
        "NE",
        "NF",
        "NG",
        "NI",
        "NL",
        "NP",
        "NR",
        "NU",
        "NZ",
        "OM",
        "PA",
        "PE",
        "PF",
        "PG",
        "PH",
        "PK",
        "PL",
        "PM",
        "PN",
        "PR",
        "PS",
        "PT",
        "PW",
        "PY",
        "QA",
        "QO",
        "RE",
        "RO",
        "RS",
        "RW",
        "SA",
        "SB",
        "SC",
        "SG",
        "SH",
        "SI",
        "SJ",
        "SK",
        "SL",
        "SM",
        "SN",
        "SO",
        "SR",
        "SS",
        "ST",
        "SV",
        "SX",
        "SY",
        "SZ",
        "TA",
        "TC",
        "TD",
        "TF",
        "TG",
        "TH",
        "TJ",
        "TK",
        "TL",
        "TM",
        "TN",
        "TO",
        "TR",
        "TT",
        "TV",
        "TW",
        "TZ",
        "UA",
        "UG",
        "UM",
        "UN",
        "UY",
        "UZ",
        "VA",
        "VC",
        "VE",
        "VG",
        "VI",
        "VN",
        "VU",
        "WF",
        "WS",
        "XA",
        "XB",
        "XK",
        "YE",
        "YT",
        "ZA",
        "ZM",
        "ZW",
        "US",
        "RU",
        "BR",
        "JM",
        "IE",
        "IS",
        "CA",
        "CU",
        "CN",
        "LV",
        "LY",
        "LT",
        "MX",
        "IM",
        "NO",
        "SD",
        "GB",
        "FI",
        "CL",
        "SE",
        "EE",
    };
  }

  @Override
  protected void loadNameMapJava() {
    super.loadNameMapJava();
    namesMap.put("001", "Аан дойду");
    namesMap.put("002", "Аапырыка");
    namesMap.put("003", "Хотугу Эмиэрикэ");
    namesMap.put("005", "Соҕуруу Эмиэрикэ");
    namesMap.put("BR", "Бразилия");
    namesMap.put("CA", "Канаада");
    namesMap.put("CL", "Чиили");
    namesMap.put("CN", "Кытай");
    namesMap.put("CU", "Кууба");
    namesMap.put("EE", "Эстония");
    namesMap.put("FI", "Финляндия");
    namesMap.put("GB", "Улуу Британия");
    namesMap.put("IE", "Ирландия");
    namesMap.put("IM", "Мэн арыы");
    namesMap.put("IS", "Исландия");
    namesMap.put("JM", "Дьамаайка");
    namesMap.put("LT", "Литва");
    namesMap.put("LV", "Латвия");
    namesMap.put("LY", "Лиибийэ");
    namesMap.put("MX", "Миэксикэ");
    namesMap.put("NO", "Норвегия");
    namesMap.put("RU", "Арассыыйа");
    namesMap.put("SD", "Судаан");
    namesMap.put("SE", "Швеция");
    namesMap.put("US", "Америка Холбоһуктаах Штааттара");
  }

  @Override
  protected JavaScriptObject loadNameMapNative() {
    return overrideMap(super.loadNameMapNative(), loadMyNameMap());
  }

  private native JavaScriptObject loadMyNameMap() /*-{
    return {
        "001": "Аан дойду",
        "002": "Аапырыка",
        "003": "Хотугу Эмиэрикэ",
        "005": "Соҕуруу Эмиэрикэ",
        "BR": "Бразилия",
        "CA": "Канаада",
        "CL": "Чиили",
        "CN": "Кытай",
        "CU": "Кууба",
        "EE": "Эстония",
        "FI": "Финляндия",
        "GB": "Улуу Британия",
        "IE": "Ирландия",
        "IM": "Мэн арыы",
        "IS": "Исландия",
        "JM": "Дьамаайка",
        "LT": "Литва",
        "LV": "Латвия",
        "LY": "Лиибийэ",
        "MX": "Миэксикэ",
        "NO": "Норвегия",
        "RU": "Арассыыйа",
        "SD": "Судаан",
        "SE": "Швеция",
        "US": "Америка Холбоһуктаах Штааттара"
    };
  }-*/;
}
