/*
 * 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[] {
        "XA",
        "XB",
        "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": "Свети Винсент и Гренадини"
    };
  }-*/;
}
