# *   Copyright (C) 1998-2015, International Business Machines
# *   Corporation and others.  All Rights Reserved.
CURR_CLDR_VERSION = %version%
# 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 '%local%' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example '%local%' files:
#
#  * To add an additional locale to the list:
#    _____________________________________________________
#    |  CURR_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#    locales:
#    _____________________________________________________
#    |  CURR_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)
CURR_SYNTHETIC_ALIAS = az_AZ.txt az_Latn_AZ.txt bs_BA.txt bs_Latn_BA.txt\
 en_NH.txt en_RH.txt fil_PH.txt he_IL.txt id_ID.txt\
 in.txt in_ID.txt iw.txt iw_IL.txt ja_JP.txt\
 ja_JP_TRADITIONAL.txt mo.txt nb_NO.txt nn_NO.txt no.txt\
 no_NO.txt no_NO_NY.txt pa_Arab_PK.txt pa_Guru_IN.txt pa_IN.txt\
 pa_PK.txt sh.txt sh_BA.txt sh_CS.txt sh_YU.txt\
 shi_MA.txt shi_Tfng_MA.txt sr_BA.txt sr_CS.txt sr_Cyrl_BA.txt\
 sr_Cyrl_CS.txt sr_Cyrl_RS.txt sr_Cyrl_XK.txt sr_Cyrl_YU.txt sr_Latn_BA.txt\
 sr_Latn_CS.txt sr_Latn_ME.txt sr_Latn_RS.txt sr_Latn_YU.txt sr_ME.txt\
 sr_RS.txt sr_XK.txt sr_YU.txt th_TH.txt th_TH_TRADITIONAL.txt\
 tl.txt tl_PH.txt uz_AF.txt uz_Arab_AF.txt uz_Latn_UZ.txt\
 uz_UZ.txt vai_LR.txt vai_Vaii_LR.txt zh_CN.txt zh_HK.txt\
 zh_Hans_CN.txt zh_Hant_TW.txt zh_MO.txt zh_SG.txt zh_TW.txt


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


# Ordinary resources
CURR_SOURCE = af.txt af_NA.txt agq.txt ak.txt\
 am.txt ar.txt ar_AE.txt ar_DJ.txt ar_ER.txt\
 ar_LB.txt ar_SO.txt ar_SS.txt as.txt asa.txt\
 az.txt az_Cyrl.txt az_Latn.txt bas.txt be.txt\
 bem.txt bez.txt bg.txt bm.txt bn.txt\
 bo.txt bo_IN.txt br.txt brx.txt bs.txt\
 bs_Cyrl.txt bs_Latn.txt ca.txt ca_FR.txt ce.txt\
 cgg.txt chr.txt cs.txt cy.txt da.txt\
 dav.txt de.txt de_CH.txt de_LI.txt de_LU.txt\
 dje.txt dsb.txt dua.txt dyo.txt dz.txt\
 ebu.txt ee.txt el.txt en.txt en_001.txt\
 en_150.txt en_AG.txt en_AI.txt en_AT.txt en_AU.txt\
 en_BB.txt en_BE.txt en_BI.txt en_BM.txt en_BS.txt\
 en_BW.txt en_BZ.txt en_CA.txt en_CC.txt en_CH.txt\
 en_CK.txt en_CM.txt en_CX.txt en_CY.txt en_DE.txt\
 en_DG.txt en_DK.txt en_DM.txt en_ER.txt en_FI.txt\
 en_FJ.txt en_FK.txt en_FM.txt en_GB.txt en_GD.txt\
 en_GG.txt en_GH.txt en_GI.txt en_GM.txt en_GY.txt\
 en_HK.txt en_IE.txt en_IL.txt en_IM.txt en_IN.txt\
 en_IO.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_MO.txt en_MS.txt en_MT.txt en_MU.txt\
 en_MW.txt en_MY.txt en_NA.txt en_NF.txt en_NG.txt\
 en_NL.txt en_NR.txt en_NU.txt en_NZ.txt en_PG.txt\
 en_PH.txt en_PK.txt en_PN.txt en_PW.txt en_RW.txt\
 en_SB.txt en_SC.txt en_SD.txt en_SE.txt en_SG.txt\
 en_SH.txt en_SI.txt en_SL.txt en_SS.txt en_SX.txt\
 en_SZ.txt en_TC.txt en_TK.txt en_TO.txt en_TT.txt\
 en_TV.txt en_TZ.txt en_UG.txt en_VC.txt en_VG.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_EC.txt es_GQ.txt es_GT.txt es_HN.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 eu.txt ewo.txt fa.txt fa_AF.txt\
 ff.txt ff_GN.txt ff_MR.txt fi.txt fil.txt\
 fo.txt fo_DK.txt fr.txt fr_BI.txt fr_CA.txt\
 fr_CD.txt fr_DJ.txt fr_DZ.txt fr_GN.txt fr_HT.txt\
 fr_KM.txt fr_LU.txt fr_MG.txt fr_MR.txt fr_MU.txt\
 fr_RW.txt fr_SC.txt fr_SY.txt fr_TN.txt fr_VU.txt\
 fur.txt fy.txt ga.txt gd.txt gl.txt\
 gsw.txt gu.txt guz.txt gv.txt ha.txt\
 ha_GH.txt haw.txt he.txt hi.txt hr.txt\
 hr_BA.txt hsb.txt hu.txt hy.txt id.txt\
 ig.txt ii.txt is.txt it.txt ja.txt\
 jgo.txt jmc.txt ka.txt kab.txt kam.txt\
 kde.txt kea.txt khq.txt ki.txt kk.txt\
 kkj.txt kl.txt kln.txt km.txt kn.txt\
 ko.txt kok.txt ks.txt ksb.txt ksf.txt\
 ksh.txt kw.txt ky.txt lag.txt lb.txt\
 lg.txt lkt.txt ln.txt ln_AO.txt lo.txt\
 lrc.txt lt.txt lu.txt luo.txt luy.txt\
 lv.txt mas.txt mas_TZ.txt mer.txt mfe.txt\
 mg.txt mgh.txt mgo.txt mk.txt ml.txt\
 mn.txt mr.txt ms.txt ms_BN.txt ms_SG.txt\
 mt.txt mua.txt my.txt mzn.txt naq.txt\
 nb.txt nd.txt ne.txt nl.txt nl_AW.txt\
 nl_BQ.txt nl_CW.txt nl_SR.txt nl_SX.txt nmg.txt\
 nn.txt nnh.txt nus.txt nyn.txt om.txt\
 om_KE.txt or.txt os.txt os_RU.txt pa.txt\
 pa_Arab.txt pa_Guru.txt pl.txt ps.txt pt.txt\
 pt_AO.txt pt_CV.txt pt_GW.txt pt_MO.txt pt_MZ.txt\
 pt_PT.txt pt_ST.txt pt_TL.txt qu.txt qu_BO.txt\
 qu_EC.txt rm.txt rn.txt ro.txt ro_MD.txt\
 rof.txt ru.txt ru_BY.txt ru_KG.txt ru_KZ.txt\
 ru_MD.txt rw.txt rwk.txt sah.txt saq.txt\
 sbp.txt se.txt se_SE.txt seh.txt ses.txt\
 sg.txt shi.txt shi_Latn.txt shi_Tfng.txt si.txt\
 sk.txt sl.txt smn.txt sn.txt so.txt\
 so_DJ.txt so_ET.txt so_KE.txt sq.txt sq_MK.txt\
 sr.txt sr_Cyrl.txt sr_Latn.txt sv.txt sw.txt\
 sw_CD.txt sw_UG.txt ta.txt ta_LK.txt ta_MY.txt\
 ta_SG.txt te.txt teo.txt teo_KE.txt th.txt\
 ti.txt ti_ER.txt to.txt tr.txt twq.txt\
 tzm.txt ug.txt uk.txt ur.txt ur_IN.txt\
 uz.txt uz_Arab.txt uz_Cyrl.txt uz_Latn.txt vai.txt\
 vai_Latn.txt vai_Vaii.txt vi.txt vun.txt wae.txt\
 xog.txt yav.txt yi.txt yo.txt yo_BJ.txt\
 zgh.txt zh.txt zh_Hans.txt zh_Hans_HK.txt zh_Hans_MO.txt\
 zh_Hans_SG.txt zh_Hant.txt zh_Hant_HK.txt zh_Hant_MO.txt zu.txt

