/*
 * Copyright 2010 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;

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA

/**
 * Implementation of DateTimeFormatInfo for the "en_Shaw" locale.
 */
public class DateTimeFormatInfoImpl_en_Shaw extends DateTimeFormatInfoImpl_en {

  @Override
  public String[] ampms() {
    return new String[] {
        "𐑨𐑥",
        "𐑐𐑥"
    };
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "𐑚𐑰𐑓𐑪𐑮 ·𐑒𐑮𐑲𐑕𐑑",
        "𐑨𐑙𐑴 𐑛𐑪𐑥𐑦𐑙𐑰"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "𐑚·𐑒",
        "𐑨𐑛"
    };
  }

  @Override
  public int firstDayOfTheWeek() {
    return 1;
  }

  @Override
  public String[] monthsFull() {
    return new String[] {
        "·𐑡𐑨𐑙𐑘𐑭𐑢𐑺𐑰",
        "·𐑓𐑧𐑚𐑘𐑵𐑢𐑺𐑰",
        "·𐑥𐑸𐑗",
        "·𐑱𐑐𐑮𐑭𐑤",
        "·𐑥𐑱",
        "·𐑡𐑵𐑯",
        "·𐑡𐑫𐑤𐑲",
        "·𐑪𐑜𐑭𐑕𐑑",
        "·𐑕𐑧𐑐𐑑𐑧𐑥𐑚𐑸",
        "·𐑷𐑒𐑑𐑴𐑚𐑸",
        "·𐑯𐑴𐑝𐑧𐑥𐑚𐑸",
        "·𐑛𐑭𐑕𐑧𐑥𐑚𐑸"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "𐑡",
        "𐑓",
        "𐑥",
        "𐑱",
        "𐑥",
        "𐑡",
        "𐑡",
        "𐑪",
        "𐑕",
        "𐑷",
        "𐑯",
        "𐑛"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "·𐑡𐑨",
        "·𐑓𐑧",
        "·𐑥𐑸",
        "·𐑱𐑐",
        "·𐑥𐑱",
        "·𐑡𐑵",
        "·𐑡𐑫",
        "·𐑪𐑜",
        "·𐑕𐑧",
        "·𐑷𐑒",
        "·𐑯𐑴",
        "·𐑛𐑭"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "1𐑕𐑑 𐑒𐑢𐑸𐑛𐑸",
        "2𐑯𐑛 𐑒𐑢𐑸𐑛𐑸",
        "3𐑻𐑛 𐑒𐑢𐑸𐑛𐑸",
        "4𐑹𐑔 𐑒𐑢𐑸𐑛𐑸"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "𐑒1",
        "𐑒2",
        "𐑒3",
        "𐑒4"
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "·𐑕𐑭𐑙𐑛𐑱",
        "·𐑥𐑭𐑙𐑛𐑱",
        "·𐑑𐑵𐑟𐑛𐑱",
        "·𐑢𐑧𐑙𐑟𐑛𐑱",
        "·𐑔𐑻𐑟𐑛𐑱",
        "·𐑓𐑮𐑲𐑛𐑱",
        "·𐑕𐑨𐑛𐑻𐑛𐑱"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "𐑕",
        "𐑥",
        "𐑑",
        "𐑢",
        "𐑔",
        "𐑓",
        "𐑕"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "·𐑕𐑭",
        "·𐑥𐑭",
        "·𐑑𐑵",
        "·𐑢𐑧",
        "·𐑔𐑻",
        "·𐑓𐑮",
        "·𐑕𐑨"
    };
  }
}
