# *   Copyright (C) 1998-2005, International Business Machines
# *   Corporation and others.  All Rights Reserved.
# 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 'reslocal.mk' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example 'reslocal.mk' files:
#
#  * To add an additional locale to the list: 
#    _____________________________________________________
#    |  GENRB_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#     locale:
#    _____________________________________________________
#    |  GENRB_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
#
#
# Generated by LDML2ICUConverter, from LDML source files. 

# Aliases which do not have a corresponding xx.xml file (see deprecatedList.xml)
GENRB_SYNTHETIC_ALIAS = in.txt in_ID.txt iw.txt iw_IL.txt\
 ja_JP_TRADITIONAL.txt no.txt no_NO.txt no_NO_NY.txt th_TH_TRADITIONAL.txt


# All aliases (to not be included under 'installed'), but not including root.
GENRB_ALIAS_SOURCE = $(GENRB_SYNTHETIC_ALIAS) az_AZ.txt sh.txt sh_CS.txt sh_YU.txt\
 sr_CS.txt sr_Cyrl_YU.txt sr_Latn_YU.txt sr_YU.txt uz_UZ.txt\
 zh_CN.txt zh_HK.txt zh_MO.txt zh_SG.txt zh_TW.txt




# Ordinary resources
GENRB_SOURCE = af.txt af_ZA.txt am.txt am_ET.txt\
 ar.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.txt as_IN.txt\
 az.txt az_Cyrl.txt az_Cyrl_AZ.txt az_Latn.txt az_Latn_AZ.txt\
 be.txt be_BY.txt bg.txt bg_BG.txt bn.txt\
 bn_IN.txt ca.txt ca_ES.txt cs.txt cs_CZ.txt\
 cy.txt cy_GB.txt da.txt da_DK.txt de.txt\
 de_AT.txt de_BE.txt de_CH.txt de_DE.txt de_LU.txt\
 el.txt el_GR.txt en.txt en_AU.txt en_BE.txt\
 en_BW.txt en_CA.txt en_GB.txt en_HK.txt en_IE.txt\
 en_IN.txt en_MT.txt en_NZ.txt en_PH.txt en_PK.txt\
 en_SG.txt en_US.txt en_US_POSIX.txt en_VI.txt en_ZA.txt\
 en_ZW.txt eo.txt es.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_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.txt et_EE.txt\
 eu.txt eu_ES.txt fa.txt fa_AF.txt fa_IR.txt\
 fi.txt fi_FI.txt fo.txt fo_FO.txt fr.txt\
 fr_BE.txt fr_CA.txt fr_CH.txt fr_FR.txt fr_LU.txt\
 ga.txt ga_IE.txt gl.txt gl_ES.txt gu.txt\
 gu_IN.txt gv.txt gv_GB.txt he.txt he_IL.txt\
 hi.txt hi_IN.txt hr.txt hr_HR.txt hu.txt\
 hu_HU.txt hy.txt hy_AM.txt hy_AM_REVISED.txt id.txt\
 id_ID.txt is.txt is_IS.txt it.txt it_CH.txt\
 it_IT.txt ja.txt ja_JP.txt kk.txt kk_KZ.txt\
 kl.txt kl_GL.txt kn.txt kn_IN.txt ko.txt\
 ko_KR.txt kok.txt kok_IN.txt kw.txt kw_GB.txt\
 lt.txt lt_LT.txt lv.txt lv_LV.txt mk.txt\
 mk_MK.txt ml.txt ml_IN.txt mr.txt mr_IN.txt\
 ms.txt ms_BN.txt ms_MY.txt mt.txt mt_MT.txt\
 nb.txt nb_NO.txt nl.txt nl_BE.txt nl_NL.txt\
 nn.txt nn_NO.txt om.txt om_ET.txt om_KE.txt\
 or.txt or_IN.txt pa.txt pa_IN.txt pl.txt\
 pl_PL.txt ps.txt ps_AF.txt pt.txt pt_BR.txt\
 pt_PT.txt ro.txt ro_RO.txt ru.txt ru_RU.txt\
 ru_UA.txt sk.txt sk_SK.txt sl.txt sl_SI.txt\
 so.txt so_DJ.txt so_ET.txt so_KE.txt so_SO.txt\
 sq.txt sq_AL.txt sr.txt sr_Cyrl.txt sr_Cyrl_CS.txt\
 sr_Latn.txt sr_Latn_CS.txt sv.txt sv_FI.txt sv_SE.txt\
 sw.txt sw_KE.txt sw_TZ.txt ta.txt ta_IN.txt\
 te.txt te_IN.txt th.txt th_TH.txt ti.txt\
 ti_ER.txt ti_ET.txt tr.txt tr_TR.txt uk.txt\
 uk_UA.txt ur.txt ur_PK.txt uz.txt uz_Cyrl.txt\
 uz_Cyrl_UZ.txt uz_Latn.txt uz_Latn_UZ.txt vi.txt vi_VN.txt\
 zh.txt zh_Hans.txt zh_Hans_CN.txt zh_Hans_SG.txt zh_Hant.txt\
 zh_Hant_HK.txt zh_Hant_MO.txt zh_Hant_TW.txt

