# *   Copyright (C) 1998-2012, International Business Machines
# *   Corporation and others.  All Rights Reserved.
GENRB_CLDR_VERSION = 22.1.1
# 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
#    locales:
#    _____________________________________________________
#    |  GENRB_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)
GENRB_SYNTHETIC_ALIAS = az_AZ.txt bs_BA.txt en_NH.txt en_RH.txt\
 ha_GH.txt ha_NE.txt ha_NG.txt in.txt in_ID.txt\
 iw.txt iw_IL.txt ja_JP_TRADITIONAL.txt kk_KZ.txt ks_IN.txt\
 mo.txt no.txt no_NO.txt no_NO_NY.txt pa_IN.txt\
 pa_PK.txt sh.txt sh_BA.txt sh_CS.txt sh_YU.txt\
 shi_MA.txt sr_BA.txt sr_CS.txt sr_Cyrl_CS.txt sr_Cyrl_YU.txt\
 sr_Latn_CS.txt sr_Latn_YU.txt sr_ME.txt sr_RS.txt sr_YU.txt\
 th_TH_TRADITIONAL.txt tl.txt tl_PH.txt tzm_MA.txt uz_AF.txt\
 uz_UZ.txt vai_LR.txt zh_CN.txt zh_HK.txt zh_MO.txt\
 zh_SG.txt zh_TW.txt


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


# Ordinary resources
GENRB_SOURCE = af.txt af_NA.txt af_ZA.txt agq.txt\
 agq_CM.txt ak.txt ak_GH.txt am.txt am_ET.txt\
 ar.txt ar_001.txt ar_AE.txt ar_BH.txt ar_DJ.txt\
 ar_DZ.txt ar_EG.txt ar_EH.txt ar_ER.txt ar_IL.txt\
 ar_IQ.txt ar_JO.txt ar_KM.txt ar_KW.txt ar_LB.txt\
 ar_LY.txt ar_MA.txt ar_MR.txt ar_OM.txt ar_PS.txt\
 ar_QA.txt ar_SA.txt ar_SD.txt ar_SO.txt ar_SY.txt\
 ar_TD.txt ar_TN.txt ar_YE.txt as.txt as_IN.txt\
 asa.txt asa_TZ.txt az.txt az_Cyrl.txt az_Cyrl_AZ.txt\
 az_Latn.txt az_Latn_AZ.txt bas.txt bas_CM.txt be.txt\
 be_BY.txt bem.txt bem_ZM.txt bez.txt bez_TZ.txt\
 bg.txt bg_BG.txt bm.txt bm_ML.txt bn.txt\
 bn_BD.txt bn_IN.txt bo.txt bo_CN.txt bo_IN.txt\
 br.txt br_FR.txt brx.txt brx_IN.txt bs.txt\
 bs_Cyrl.txt bs_Cyrl_BA.txt bs_Latn.txt bs_Latn_BA.txt ca.txt\
 ca_AD.txt ca_ES.txt cgg.txt cgg_UG.txt chr.txt\
 chr_US.txt cs.txt cs_CZ.txt cy.txt cy_GB.txt\
 da.txt da_DK.txt dav.txt dav_KE.txt de.txt\
 de_AT.txt de_BE.txt de_CH.txt de_DE.txt de_LI.txt\
 de_LU.txt dje.txt dje_NE.txt dua.txt dua_CM.txt\
 dyo.txt dyo_SN.txt dz.txt dz_BT.txt ebu.txt\
 ebu_KE.txt ee.txt ee_GH.txt ee_TG.txt el.txt\
 el_CY.txt el_GR.txt en.txt en_150.txt en_AG.txt\
 en_AS.txt en_AU.txt en_BB.txt en_BE.txt en_BM.txt\
 en_BS.txt en_BW.txt en_BZ.txt en_CA.txt en_CM.txt\
 en_DM.txt en_FJ.txt en_FM.txt en_GB.txt en_GD.txt\
 en_GG.txt en_GH.txt en_GI.txt en_GM.txt en_GU.txt\
 en_GY.txt en_HK.txt en_IE.txt en_IM.txt en_IN.txt\
 en_JE.txt en_JM.txt en_KE.txt en_KI.txt en_KN.txt\
 en_KY.txt en_LC.txt en_LR.txt en_LS.txt en_MG.txt\
 en_MH.txt en_MP.txt en_MT.txt en_MU.txt en_MW.txt\
 en_NA.txt en_NG.txt en_NZ.txt en_PG.txt en_PH.txt\
 en_PK.txt en_PR.txt en_PW.txt en_SB.txt en_SC.txt\
 en_SG.txt en_SL.txt en_SS.txt en_SZ.txt en_TC.txt\
 en_TO.txt en_TT.txt en_TZ.txt en_UG.txt en_UM.txt\
 en_US.txt en_US_POSIX.txt en_VC.txt en_VG.txt en_VI.txt\
 en_VU.txt en_WS.txt en_ZA.txt en_ZM.txt en_ZW.txt\
 eo.txt es.txt es_419.txt es_AR.txt es_BO.txt\
 es_CL.txt es_CO.txt es_CR.txt es_CU.txt es_DO.txt\
 es_EA.txt es_EC.txt es_ES.txt es_GQ.txt es_GT.txt\
 es_HN.txt es_IC.txt es_MX.txt es_NI.txt es_PA.txt\
 es_PE.txt es_PH.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 ewo.txt ewo_CM.txt fa.txt\
 fa_AF.txt fa_IR.txt ff.txt ff_SN.txt fi.txt\
 fi_FI.txt fil.txt fil_PH.txt fo.txt fo_FO.txt\
 fr.txt fr_BE.txt fr_BF.txt fr_BI.txt fr_BJ.txt\
 fr_BL.txt fr_CA.txt fr_CD.txt fr_CF.txt fr_CG.txt\
 fr_CH.txt fr_CI.txt fr_CM.txt fr_DJ.txt fr_DZ.txt\
 fr_FR.txt fr_GA.txt fr_GF.txt fr_GN.txt fr_GP.txt\
 fr_GQ.txt fr_HT.txt fr_KM.txt fr_LU.txt fr_MA.txt\
 fr_MC.txt fr_MF.txt fr_MG.txt fr_ML.txt fr_MQ.txt\
 fr_MR.txt fr_MU.txt fr_NC.txt fr_NE.txt fr_PF.txt\
 fr_RE.txt fr_RW.txt fr_SC.txt fr_SN.txt fr_SY.txt\
 fr_TD.txt fr_TG.txt fr_TN.txt fr_VU.txt fr_YT.txt\
 ga.txt ga_IE.txt gl.txt gl_ES.txt gsw.txt\
 gsw_CH.txt gu.txt gu_IN.txt guz.txt guz_KE.txt\
 gv.txt gv_GB.txt ha.txt ha_Latn.txt ha_Latn_GH.txt\
 ha_Latn_NE.txt ha_Latn_NG.txt haw.txt haw_US.txt he.txt\
 he_IL.txt hi.txt hi_IN.txt hr.txt hr_BA.txt\
 hr_HR.txt hu.txt hu_HU.txt hy.txt hy_AM.txt\
 id.txt id_ID.txt ig.txt ig_NG.txt ii.txt\
 ii_CN.txt is.txt is_IS.txt it.txt it_CH.txt\
 it_IT.txt it_SM.txt ja.txt ja_JP.txt jgo.txt\
 jgo_CM.txt jmc.txt jmc_TZ.txt ka.txt ka_GE.txt\
 kab.txt kab_DZ.txt kam.txt kam_KE.txt kde.txt\
 kde_TZ.txt kea.txt kea_CV.txt khq.txt khq_ML.txt\
 ki.txt ki_KE.txt kk.txt kk_Cyrl.txt kk_Cyrl_KZ.txt\
 kl.txt kl_GL.txt kln.txt kln_KE.txt km.txt\
 km_KH.txt kn.txt kn_IN.txt ko.txt ko_KP.txt\
 ko_KR.txt kok.txt kok_IN.txt ks.txt ks_Arab.txt\
 ks_Arab_IN.txt ksb.txt ksb_TZ.txt ksf.txt ksf_CM.txt\
 kw.txt kw_GB.txt lag.txt lag_TZ.txt lg.txt\
 lg_UG.txt ln.txt ln_AO.txt ln_CD.txt ln_CF.txt\
 ln_CG.txt lo.txt lo_LA.txt lt.txt lt_LT.txt\
 lu.txt lu_CD.txt luo.txt luo_KE.txt luy.txt\
 luy_KE.txt lv.txt lv_LV.txt mas.txt mas_KE.txt\
 mas_TZ.txt mer.txt mer_KE.txt mfe.txt mfe_MU.txt\
 mg.txt mg_MG.txt mgh.txt mgh_MZ.txt mgo.txt\
 mgo_CM.txt mk.txt mk_MK.txt ml.txt ml_IN.txt\
 mr.txt mr_IN.txt ms.txt ms_BN.txt ms_MY.txt\
 ms_SG.txt mt.txt mt_MT.txt mua.txt mua_CM.txt\
 my.txt my_MM.txt naq.txt naq_NA.txt nb.txt\
 nb_NO.txt nd.txt nd_ZW.txt ne.txt ne_IN.txt\
 ne_NP.txt nl.txt nl_AW.txt nl_BE.txt nl_CW.txt\
 nl_NL.txt nl_SR.txt nl_SX.txt nmg.txt nmg_CM.txt\
 nn.txt nn_NO.txt nus.txt nus_SD.txt nyn.txt\
 nyn_UG.txt om.txt om_ET.txt om_KE.txt or.txt\
 or_IN.txt pa.txt pa_Arab.txt pa_Arab_PK.txt pa_Guru.txt\
 pa_Guru_IN.txt pl.txt pl_PL.txt ps.txt ps_AF.txt\
 pt.txt pt_AO.txt pt_BR.txt pt_CV.txt pt_GW.txt\
 pt_MO.txt pt_MZ.txt pt_PT.txt pt_ST.txt pt_TL.txt\
 rm.txt rm_CH.txt rn.txt rn_BI.txt ro.txt\
 ro_MD.txt ro_RO.txt rof.txt rof_TZ.txt ru.txt\
 ru_BY.txt ru_KG.txt ru_KZ.txt ru_MD.txt ru_RU.txt\
 ru_UA.txt rw.txt rw_RW.txt rwk.txt rwk_TZ.txt\
 saq.txt saq_KE.txt sbp.txt sbp_TZ.txt seh.txt\
 seh_MZ.txt ses.txt ses_ML.txt sg.txt sg_CF.txt\
 shi.txt shi_Latn.txt shi_Latn_MA.txt shi_Tfng.txt shi_Tfng_MA.txt\
 si.txt si_LK.txt sk.txt sk_SK.txt sl.txt\
 sl_SI.txt sn.txt sn_ZW.txt so.txt so_DJ.txt\
 so_ET.txt so_KE.txt so_SO.txt sq.txt sq_AL.txt\
 sq_MK.txt sr.txt sr_Cyrl.txt sr_Cyrl_BA.txt sr_Cyrl_ME.txt\
 sr_Cyrl_RS.txt sr_Latn.txt sr_Latn_BA.txt sr_Latn_ME.txt sr_Latn_RS.txt\
 sv.txt sv_AX.txt sv_FI.txt sv_SE.txt sw.txt\
 sw_KE.txt sw_TZ.txt sw_UG.txt swc.txt swc_CD.txt\
 ta.txt ta_IN.txt ta_LK.txt ta_MY.txt ta_SG.txt\
 te.txt te_IN.txt teo.txt teo_KE.txt teo_UG.txt\
 th.txt th_TH.txt ti.txt ti_ER.txt ti_ET.txt\
 to.txt to_TO.txt tr.txt tr_CY.txt tr_TR.txt\
 twq.txt twq_NE.txt tzm.txt tzm_Latn.txt tzm_Latn_MA.txt\
 uk.txt uk_UA.txt ur.txt ur_IN.txt ur_PK.txt\
 uz.txt uz_Arab.txt uz_Arab_AF.txt uz_Cyrl.txt uz_Cyrl_UZ.txt\
 uz_Latn.txt uz_Latn_UZ.txt vai.txt vai_Latn.txt vai_Latn_LR.txt\
 vai_Vaii.txt vai_Vaii_LR.txt vi.txt vi_VN.txt vun.txt\
 vun_TZ.txt xog.txt xog_UG.txt yav.txt yav_CM.txt\
 yo.txt yo_NG.txt zh.txt zh_Hans.txt zh_Hans_CN.txt\
 zh_Hans_HK.txt zh_Hans_MO.txt zh_Hans_SG.txt zh_Hant.txt zh_Hant_HK.txt\
 zh_Hant_MO.txt zh_Hant_TW.txt zu.txt zu_ZA.txt

