/*
 * 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 "sr_Cyrl_XK" locale.
 */
public class LocalizedNamesImpl_sr_Cyrl_XK extends LocalizedNamesImpl_sr {

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

  @Override
  protected void loadNameMapJava() {
    super.loadNameMapJava();
    namesMap.put("CG", "Конго");
    namesMap.put("CV", "Кабо Верде");
    namesMap.put("CZ", "Чешка Република");
    namesMap.put("HK", "САР Хонгконг");
    namesMap.put("KN", "Свети Китс и Невис");
    namesMap.put("MO", "САР Макао");
    namesMap.put("PM", "Свети Пјер и Микелон");
    namesMap.put("RE", "Реунион");
    namesMap.put("UM", "Мања удаљена острва САД");
    namesMap.put("VC", "Свети Винсент и Гренадини");
  }

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

  private native JavaScriptObject loadMyNameMap() /*-{
    return {
        "CG": "Конго",
        "CV": "Кабо Верде",
        "CZ": "Чешка Република",
        "HK": "САР Хонгконг",
        "KN": "Свети Китс и Невис",
        "MO": "САР Макао",
        "PM": "Свети Пјер и Микелон",
        "RE": "Реунион",
        "UM": "Мања удаљена острва САД",
        "VC": "Свети Винсент и Гренадини"
    };
  }-*/;
}
