# *   Copyright (C) 1998-2010, International Business Machines
# *   Corporation and others.  All Rights Reserved.
COLLATION_CLDR_VERSION = 1.9
# A list of txt's to build
# Note:
#
#   If you are thinking of modifying this file, READ THIS.
#
# Instead of changing this file [unless you want to check it back in],
# you should consider creating a 'collocal.mk' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example 'collocal.mk' files:
#
#  * To add an additional locale to the list:
#    _____________________________________________________
#    |  COLLATION_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#    locales:
#    _____________________________________________________
#    |  COLLATION_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
#
#
# Generated by LDML2ICUConverter, from LDML source files.

# Aliases without a corresponding xx.xml file (see icu-config.xml & build.xml)
COLLATION_SYNTHETIC_ALIAS = de_.txt de__PHONEBOOK.txt es_.txt es__TRADITIONAL.txt\
 hi_.txt hi__DIRECT.txt in.txt in_ID.txt iw.txt\
 iw_IL.txt mo.txt no.txt no_NO.txt pa_IN.txt\
 sh.txt sh_BA.txt sh_YU.txt sr_BA.txt sr_ME.txt\
 sr_RS.txt zh_.txt zh_CN.txt zh_HK.txt zh_MO.txt\
 zh_SG.txt zh_TW.txt zh_TW_STROKE.txt zh__PINYIN.txt


# All aliases (to not be included under 'installed'), but not including root.
COLLATION_ALIAS_SOURCE = $(COLLATION_SYNTHETIC_ALIAS)


# Empty locales, used for validSubLocale fallback.
COLLATION_EMPTY_SOURCE = af_NA.txt af_ZA.txt ar_AE.txt ar_BH.txt\
 ar_DZ.txt ar_EG.txt ar_IQ.txt ar_JO.txt ar_KW.txt\
 ar_LB.txt ar_LY.txt ar_MA.txt ar_OM.txt ar_QA.txt\
 ar_SA.txt ar_SD.txt ar_SY.txt ar_TN.txt ar_YE.txt\
 as_IN.txt az_Latn.txt az_Latn_AZ.txt be_BY.txt bg_BG.txt\
 bn_BD.txt bn_IN.txt bs_BA.txt ca_ES.txt chr.txt\
 chr_US.txt cs_CZ.txt cy_GB.txt da_DK.txt de_AT.txt\
 de_BE.txt de_CH.txt de_DE.txt de_LI.txt de_LU.txt\
 el_CY.txt el_GR.txt en_AS.txt en_AU.txt en_BE.txt\
 en_BW.txt en_BZ.txt en_CA.txt en_GB.txt en_GU.txt\
 en_HK.txt en_IE.txt en_IN.txt en_JM.txt en_MH.txt\
 en_MP.txt en_MT.txt en_MU.txt en_NA.txt en_NZ.txt\
 en_PH.txt en_PK.txt en_SG.txt en_TT.txt en_UM.txt\
 en_VI.txt en_ZA.txt en_ZW.txt es_419.txt es_AR.txt\
 es_BO.txt es_CL.txt es_CO.txt es_CR.txt es_DO.txt\
 es_EC.txt es_ES.txt es_GQ.txt es_GT.txt es_HN.txt\
 es_MX.txt es_NI.txt es_PA.txt es_PE.txt es_PR.txt\
 es_PY.txt es_SV.txt es_US.txt es_UY.txt es_VE.txt\
 et_EE.txt fa_IR.txt fi_FI.txt fil_PH.txt fo_FO.txt\
 fr_BE.txt fr_BF.txt fr_BI.txt fr_BJ.txt fr_BL.txt\
 fr_CD.txt fr_CF.txt fr_CG.txt fr_CH.txt fr_CI.txt\
 fr_CM.txt fr_DJ.txt fr_FR.txt fr_GA.txt fr_GN.txt\
 fr_GP.txt fr_GQ.txt fr_KM.txt fr_LU.txt fr_MC.txt\
 fr_MF.txt fr_MG.txt fr_ML.txt fr_MQ.txt fr_NE.txt\
 fr_RE.txt fr_RW.txt fr_SN.txt fr_TD.txt fr_TG.txt\
 ga.txt ga_IE.txt gu_IN.txt ha_Latn.txt ha_Latn_GH.txt\
 ha_Latn_NE.txt ha_Latn_NG.txt he_IL.txt hi_IN.txt hr_HR.txt\
 hu_HU.txt hy_AM.txt id.txt id_ID.txt ig_NG.txt\
 is_IS.txt it.txt it_CH.txt it_IT.txt ja_JP.txt\
 ka.txt ka_GE.txt kk_KZ.txt kl_GL.txt kn_IN.txt\
 ko_KR.txt kok_IN.txt lt_LT.txt lv_LV.txt mk_MK.txt\
 ml_IN.txt mr_IN.txt ms.txt ms_BN.txt ms_MY.txt\
 mt_MT.txt my_MM.txt nb_NO.txt nl.txt nl_BE.txt\
 nl_NL.txt nn_NO.txt om_ET.txt om_KE.txt or_IN.txt\
 pa_Arab.txt pa_Arab_PK.txt pa_Guru.txt pa_Guru_IN.txt pl_PL.txt\
 ps_AF.txt pt.txt pt_BR.txt pt_PT.txt ro_MD.txt\
 ro_RO.txt ru_MD.txt ru_RU.txt ru_UA.txt si_LK.txt\
 sk_SK.txt sl_SI.txt sq_AL.txt sr_Cyrl.txt sr_Cyrl_BA.txt\
 sr_Cyrl_ME.txt sr_Cyrl_RS.txt sr_Latn_BA.txt sr_Latn_ME.txt sr_Latn_RS.txt\
 sv_FI.txt sv_SE.txt sw.txt sw_KE.txt sw_TZ.txt\
 ta_IN.txt ta_LK.txt te_IN.txt th_TH.txt tr_TR.txt\
 uk_UA.txt ur_IN.txt ur_PK.txt vi_VN.txt yo_NG.txt\
 zh_Hans.txt zh_Hans_CN.txt zh_Hans_SG.txt zh_Hant_HK.txt zh_Hant_MO.txt\
 zh_Hant_TW.txt zu.txt zu_ZA.txt


# Ordinary resources
COLLATION_SOURCE = $(COLLATION_EMPTY_SOURCE) af.txt ar.txt as.txt az.txt\
 be.txt bg.txt bn.txt bs.txt ca.txt\
 cs.txt cy.txt da.txt de.txt el.txt\
 en.txt en_US.txt en_US_POSIX.txt eo.txt es.txt\
 et.txt fa.txt fa_AF.txt fi.txt fil.txt\
 fo.txt fr.txt fr_CA.txt gu.txt ha.txt\
 haw.txt he.txt hi.txt hr.txt hu.txt\
 hy.txt ig.txt is.txt ja.txt kk.txt\
 kl.txt km.txt kn.txt ko.txt kok.txt\
 lt.txt lv.txt mk.txt ml.txt mr.txt\
 mt.txt my.txt nb.txt nn.txt om.txt\
 or.txt pa.txt pl.txt ps.txt ro.txt\
 ru.txt si.txt sk.txt sl.txt sq.txt\
 sr.txt sr_Latn.txt sv.txt ta.txt te.txt\
 th.txt to.txt tr.txt uk.txt ur.txt\
 vi.txt yo.txt zh.txt zh_Hant.txt

