holidays 0.25__py3-none-any.whl → 0.27__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. holidays/__init__.py +1 -1
  2. holidays/calendars/__init__.py +9 -7
  3. holidays/calendars/buddhist.py +445 -0
  4. holidays/calendars/chinese.py +1238 -431
  5. holidays/calendars/custom.py +1 -3
  6. holidays/calendars/hebrew.py +2 -2
  7. holidays/calendars/hindu.py +445 -0
  8. holidays/calendars/islamic.py +1347 -1347
  9. holidays/calendars/thai.py +229 -38
  10. holidays/countries/__init__.py +8 -0
  11. holidays/countries/albania.py +6 -17
  12. holidays/countries/andorra.py +2 -6
  13. holidays/countries/angola.py +53 -39
  14. holidays/countries/argentina.py +25 -35
  15. holidays/countries/armenia.py +1 -0
  16. holidays/countries/aruba.py +109 -48
  17. holidays/countries/australia.py +31 -69
  18. holidays/countries/austria.py +1 -0
  19. holidays/countries/azerbaijan.py +44 -71
  20. holidays/countries/bahrain.py +7 -7
  21. holidays/countries/bangladesh.py +1 -3
  22. holidays/countries/belarus.py +2 -3
  23. holidays/countries/belize.py +128 -0
  24. holidays/countries/bolivia.py +2 -6
  25. holidays/countries/bosnia_and_herzegovina.py +5 -17
  26. holidays/countries/botswana.py +37 -44
  27. holidays/countries/brazil.py +4 -7
  28. holidays/countries/brunei.py +427 -0
  29. holidays/countries/bulgaria.py +3 -6
  30. holidays/countries/burkina_faso.py +141 -0
  31. holidays/countries/burundi.py +2 -5
  32. holidays/countries/cambodia.py +323 -0
  33. holidays/countries/cameroon.py +183 -0
  34. holidays/countries/canada.py +20 -28
  35. holidays/countries/chad.py +133 -0
  36. holidays/countries/chile.py +6 -13
  37. holidays/countries/china.py +21 -25
  38. holidays/countries/colombia.py +18 -15
  39. holidays/countries/costa_rica.py +25 -27
  40. holidays/countries/cuba.py +28 -15
  41. holidays/countries/curacao.py +100 -46
  42. holidays/countries/cyprus.py +3 -6
  43. holidays/countries/czechia.py +4 -12
  44. holidays/countries/denmark.py +2 -3
  45. holidays/countries/dominican_republic.py +2 -3
  46. holidays/countries/ecuador.py +55 -54
  47. holidays/countries/egypt.py +2 -5
  48. holidays/countries/el_salvador.py +101 -0
  49. holidays/countries/eswatini.py +34 -44
  50. holidays/countries/ethiopia.py +7 -14
  51. holidays/countries/finland.py +2 -3
  52. holidays/countries/france.py +1 -0
  53. holidays/countries/gabon.py +139 -0
  54. holidays/countries/georgia.py +1 -0
  55. holidays/countries/germany.py +1 -0
  56. holidays/countries/greece.py +7 -6
  57. holidays/countries/honduras.py +17 -13
  58. holidays/countries/hongkong.py +117 -126
  59. holidays/countries/hungary.py +93 -92
  60. holidays/countries/iceland.py +1 -0
  61. holidays/countries/india.py +4 -11
  62. holidays/countries/indonesia.py +178 -142
  63. holidays/countries/ireland.py +5 -15
  64. holidays/countries/isle_of_man.py +23 -5
  65. holidays/countries/israel.py +12 -24
  66. holidays/countries/italy.py +6 -7
  67. holidays/countries/jamaica.py +10 -18
  68. holidays/countries/japan.py +11 -16
  69. holidays/countries/kazakhstan.py +7 -22
  70. holidays/countries/kenya.py +44 -26
  71. holidays/countries/kyrgyzstan.py +2 -5
  72. holidays/countries/latvia.py +2 -6
  73. holidays/countries/lesotho.py +52 -32
  74. holidays/countries/liechtenstein.py +1 -0
  75. holidays/countries/lithuania.py +4 -12
  76. holidays/countries/madagascar.py +3 -9
  77. holidays/countries/malawi.py +34 -26
  78. holidays/countries/malaysia.py +335 -343
  79. holidays/countries/marshall_islands.py +4 -9
  80. holidays/countries/mexico.py +2 -3
  81. holidays/countries/moldova.py +4 -6
  82. holidays/countries/monaco.py +17 -26
  83. holidays/countries/montenegro.py +34 -24
  84. holidays/countries/morocco.py +8 -5
  85. holidays/countries/mozambique.py +35 -31
  86. holidays/countries/namibia.py +54 -35
  87. holidays/countries/netherlands.py +1 -0
  88. holidays/countries/new_zealand.py +166 -134
  89. holidays/countries/nicaragua.py +27 -22
  90. holidays/countries/nigeria.py +6 -17
  91. holidays/countries/north_macedonia.py +3 -8
  92. holidays/countries/norway.py +2 -3
  93. holidays/countries/pakistan.py +73 -75
  94. holidays/countries/panama.py +25 -24
  95. holidays/countries/paraguay.py +55 -47
  96. holidays/countries/peru.py +1 -0
  97. holidays/countries/philippines.py +6 -2
  98. holidays/countries/poland.py +4 -9
  99. holidays/countries/portugal.py +4 -11
  100. holidays/countries/romania.py +4 -5
  101. holidays/countries/russia.py +1 -0
  102. holidays/countries/san_marino.py +26 -27
  103. holidays/countries/saudi_arabia.py +8 -22
  104. holidays/countries/serbia.py +22 -31
  105. holidays/countries/singapore.py +181 -189
  106. holidays/countries/slovakia.py +2 -4
  107. holidays/countries/south_africa.py +60 -62
  108. holidays/countries/south_korea.py +59 -26
  109. holidays/countries/spain.py +7 -10
  110. holidays/countries/sweden.py +2 -3
  111. holidays/countries/switzerland.py +1 -0
  112. holidays/countries/taiwan.py +20 -20
  113. holidays/countries/thailand.py +36 -82
  114. holidays/countries/turkey.py +1 -3
  115. holidays/countries/ukraine.py +7 -18
  116. holidays/countries/united_arab_emirates.py +23 -31
  117. holidays/countries/united_kingdom.py +124 -116
  118. holidays/countries/united_states.py +42 -72
  119. holidays/countries/uruguay.py +1 -0
  120. holidays/countries/vatican_city.py +64 -32
  121. holidays/countries/venezuela.py +9 -6
  122. holidays/countries/vietnam.py +6 -20
  123. holidays/countries/zambia.py +63 -33
  124. holidays/countries/zimbabwe.py +56 -37
  125. holidays/financial/european_central_bank.py +15 -16
  126. holidays/financial/ny_stock_exchange.py +80 -86
  127. holidays/groups/__init__.py +18 -0
  128. holidays/groups/buddhist.py +71 -0
  129. holidays/groups/chinese.py +235 -0
  130. holidays/groups/christian.py +483 -0
  131. holidays/groups/hindu.py +71 -0
  132. holidays/groups/international.py +157 -0
  133. holidays/groups/islamic.py +288 -0
  134. holidays/groups/thai.py +157 -0
  135. holidays/helpers.py +20 -0
  136. holidays/holiday_base.py +54 -76
  137. holidays/holiday_groups.py +11 -1053
  138. holidays/locale/am/LC_MESSAGES/ET.mo +0 -0
  139. holidays/locale/am/LC_MESSAGES/ET.po +20 -15
  140. holidays/locale/ar/LC_MESSAGES/CA.mo +0 -0
  141. holidays/locale/ar/LC_MESSAGES/CA.po +184 -0
  142. holidays/locale/ar/LC_MESSAGES/ET.mo +0 -0
  143. holidays/locale/ar/LC_MESSAGES/ET.po +92 -0
  144. holidays/locale/ar/LC_MESSAGES/UA.mo +0 -0
  145. holidays/locale/ar/LC_MESSAGES/UA.po +97 -0
  146. holidays/locale/be/LC_MESSAGES/BY.po +11 -13
  147. holidays/locale/bg/LC_MESSAGES/BG.po +13 -15
  148. holidays/locale/da/LC_MESSAGES/DK.po +13 -12
  149. holidays/locale/de/LC_MESSAGES/AT.po +14 -14
  150. holidays/locale/de/LC_MESSAGES/CH.po +91 -56
  151. holidays/locale/de/LC_MESSAGES/DE.po +32 -32
  152. holidays/locale/de/LC_MESSAGES/LI.po +23 -23
  153. holidays/locale/el/LC_MESSAGES/CY.po +16 -16
  154. holidays/locale/el/LC_MESSAGES/GR.mo +0 -0
  155. holidays/locale/el/LC_MESSAGES/GR.po +21 -17
  156. holidays/locale/en/LC_MESSAGES/CA.po +43 -43
  157. holidays/locale/en_US/LC_MESSAGES/AM.mo +0 -0
  158. holidays/locale/en_US/LC_MESSAGES/AM.po +20 -20
  159. holidays/locale/en_US/LC_MESSAGES/AR.mo +0 -0
  160. holidays/locale/en_US/LC_MESSAGES/AR.po +34 -33
  161. holidays/locale/en_US/LC_MESSAGES/AT.po +13 -13
  162. holidays/locale/en_US/LC_MESSAGES/AW.mo +0 -0
  163. holidays/locale/en_US/LC_MESSAGES/AW.po +87 -0
  164. holidays/locale/en_US/LC_MESSAGES/BG.po +13 -15
  165. holidays/locale/en_US/LC_MESSAGES/BN.mo +0 -0
  166. holidays/locale/en_US/LC_MESSAGES/BN.po +96 -0
  167. holidays/locale/en_US/LC_MESSAGES/BY.po +11 -13
  168. holidays/locale/en_US/LC_MESSAGES/CA.mo +0 -0
  169. holidays/locale/en_US/LC_MESSAGES/CA.po +70 -37
  170. holidays/locale/en_US/LC_MESSAGES/CH.po +91 -56
  171. holidays/locale/en_US/LC_MESSAGES/CL.po +39 -38
  172. holidays/locale/en_US/LC_MESSAGES/CO.mo +0 -0
  173. holidays/locale/en_US/LC_MESSAGES/CO.po +27 -27
  174. holidays/locale/en_US/LC_MESSAGES/CR.mo +0 -0
  175. holidays/locale/en_US/LC_MESSAGES/CR.po +19 -19
  176. holidays/locale/en_US/LC_MESSAGES/CU.po +10 -10
  177. holidays/locale/en_US/LC_MESSAGES/CW.mo +0 -0
  178. holidays/locale/en_US/LC_MESSAGES/CW.po +82 -0
  179. holidays/locale/en_US/LC_MESSAGES/CY.po +16 -16
  180. holidays/locale/en_US/LC_MESSAGES/DE.po +30 -30
  181. holidays/locale/en_US/LC_MESSAGES/DK.po +12 -11
  182. holidays/locale/en_US/LC_MESSAGES/DO.po +12 -12
  183. holidays/locale/en_US/LC_MESSAGES/EC.po +11 -12
  184. holidays/locale/en_US/LC_MESSAGES/ET.mo +0 -0
  185. holidays/locale/en_US/LC_MESSAGES/ET.po +20 -15
  186. holidays/locale/en_US/LC_MESSAGES/FI.po +15 -15
  187. holidays/locale/en_US/LC_MESSAGES/FR.po +27 -24
  188. holidays/locale/en_US/LC_MESSAGES/GE.po +23 -27
  189. holidays/locale/en_US/LC_MESSAGES/GR.mo +0 -0
  190. holidays/locale/en_US/LC_MESSAGES/GR.po +21 -17
  191. holidays/locale/en_US/LC_MESSAGES/HN.mo +0 -0
  192. holidays/locale/en_US/LC_MESSAGES/HN.po +17 -12
  193. holidays/locale/en_US/LC_MESSAGES/HU.mo +0 -0
  194. holidays/locale/en_US/LC_MESSAGES/HU.po +109 -0
  195. holidays/locale/en_US/LC_MESSAGES/IS.po +17 -17
  196. holidays/locale/en_US/LC_MESSAGES/JP.po +25 -25
  197. holidays/locale/en_US/LC_MESSAGES/KH.mo +0 -0
  198. holidays/locale/en_US/LC_MESSAGES/KH.po +139 -0
  199. holidays/locale/en_US/LC_MESSAGES/LI.po +22 -22
  200. holidays/locale/en_US/LC_MESSAGES/MC.mo +0 -0
  201. holidays/locale/en_US/LC_MESSAGES/MC.po +27 -27
  202. holidays/locale/en_US/LC_MESSAGES/MD.po +13 -13
  203. holidays/locale/en_US/LC_MESSAGES/MX.po +9 -12
  204. holidays/locale/en_US/LC_MESSAGES/NI.mo +0 -0
  205. holidays/locale/en_US/LC_MESSAGES/NI.po +15 -15
  206. holidays/locale/en_US/LC_MESSAGES/NL.po +12 -12
  207. holidays/locale/en_US/LC_MESSAGES/NO.po +13 -13
  208. holidays/locale/en_US/LC_MESSAGES/PE.po +30 -30
  209. holidays/locale/en_US/LC_MESSAGES/PL.po +38 -21
  210. holidays/locale/en_US/LC_MESSAGES/PT.po +39 -36
  211. holidays/locale/en_US/LC_MESSAGES/PY.po +16 -16
  212. holidays/locale/en_US/LC_MESSAGES/RO.po +12 -12
  213. holidays/locale/en_US/LC_MESSAGES/RS.mo +0 -0
  214. holidays/locale/en_US/LC_MESSAGES/RS.po +17 -19
  215. holidays/locale/en_US/LC_MESSAGES/RU.po +11 -10
  216. holidays/locale/en_US/LC_MESSAGES/SE.po +19 -19
  217. holidays/locale/en_US/LC_MESSAGES/SK.po +17 -18
  218. holidays/locale/en_US/LC_MESSAGES/TH.po +41 -41
  219. holidays/locale/en_US/LC_MESSAGES/UA.po +18 -19
  220. holidays/locale/en_US/LC_MESSAGES/UY.po +15 -15
  221. holidays/locale/en_US/LC_MESSAGES/VE.po +16 -16
  222. holidays/locale/es/LC_MESSAGES/AR.mo +0 -0
  223. holidays/locale/es/LC_MESSAGES/AR.po +34 -33
  224. holidays/locale/es/LC_MESSAGES/CL.po +39 -38
  225. holidays/locale/es/LC_MESSAGES/CO.mo +0 -0
  226. holidays/locale/es/LC_MESSAGES/CO.po +24 -24
  227. holidays/locale/es/LC_MESSAGES/CR.mo +0 -0
  228. holidays/locale/es/LC_MESSAGES/CR.po +19 -19
  229. holidays/locale/es/LC_MESSAGES/CU.po +10 -10
  230. holidays/locale/es/LC_MESSAGES/DO.po +12 -12
  231. holidays/locale/es/LC_MESSAGES/EC.po +11 -12
  232. holidays/locale/es/LC_MESSAGES/HN.mo +0 -0
  233. holidays/locale/es/LC_MESSAGES/HN.po +17 -12
  234. holidays/locale/es/LC_MESSAGES/MX.po +9 -12
  235. holidays/locale/es/LC_MESSAGES/NI.po +12 -12
  236. holidays/locale/es/LC_MESSAGES/PE.po +30 -30
  237. holidays/locale/es/LC_MESSAGES/PY.po +16 -16
  238. holidays/locale/es/LC_MESSAGES/UY.po +15 -15
  239. holidays/locale/es/LC_MESSAGES/VE.po +16 -16
  240. holidays/locale/fi/LC_MESSAGES/FI.po +16 -16
  241. holidays/locale/fr/LC_MESSAGES/CA.po +43 -43
  242. holidays/locale/fr/LC_MESSAGES/CH.po +91 -56
  243. holidays/locale/fr/LC_MESSAGES/FR.po +27 -24
  244. holidays/locale/fr/LC_MESSAGES/MC.po +23 -23
  245. holidays/locale/hu/LC_MESSAGES/HU.mo +0 -0
  246. holidays/locale/hu/LC_MESSAGES/HU.po +109 -0
  247. holidays/locale/hy/LC_MESSAGES/AM.po +16 -16
  248. holidays/locale/is/LC_MESSAGES/IS.po +18 -18
  249. holidays/locale/it/LC_MESSAGES/CH.po +91 -56
  250. holidays/locale/ja/LC_MESSAGES/JP.po +25 -25
  251. holidays/locale/ka/LC_MESSAGES/GE.po +23 -27
  252. holidays/locale/km/LC_MESSAGES/KH.mo +0 -0
  253. holidays/locale/km/LC_MESSAGES/KH.po +139 -0
  254. holidays/locale/ms/LC_MESSAGES/BN.mo +0 -0
  255. holidays/locale/ms/LC_MESSAGES/BN.po +96 -0
  256. holidays/locale/nl/LC_MESSAGES/AW.mo +0 -0
  257. holidays/locale/nl/LC_MESSAGES/AW.po +87 -0
  258. holidays/locale/nl/LC_MESSAGES/CW.mo +0 -0
  259. holidays/locale/nl/LC_MESSAGES/CW.po +82 -0
  260. holidays/locale/nl/LC_MESSAGES/NL.po +13 -13
  261. holidays/locale/no/LC_MESSAGES/NO.po +14 -14
  262. holidays/locale/pap/LC_MESSAGES/AW.mo +0 -0
  263. holidays/locale/pap/LC_MESSAGES/AW.po +87 -0
  264. holidays/locale/pap/LC_MESSAGES/CW.mo +0 -0
  265. holidays/locale/pap/LC_MESSAGES/CW.po +82 -0
  266. holidays/locale/pl/LC_MESSAGES/PL.po +38 -21
  267. holidays/locale/pt_PT/LC_MESSAGES/PT.po +39 -36
  268. holidays/locale/ro/LC_MESSAGES/MD.po +14 -15
  269. holidays/locale/ro/LC_MESSAGES/RO.po +13 -14
  270. holidays/locale/ru/LC_MESSAGES/RU.po +11 -9
  271. holidays/locale/sk/LC_MESSAGES/SK.po +17 -18
  272. holidays/locale/sr/LC_MESSAGES/RS.mo +0 -0
  273. holidays/locale/sr/LC_MESSAGES/RS.po +15 -17
  274. holidays/locale/sv/LC_MESSAGES/FI.po +16 -16
  275. holidays/locale/sv/LC_MESSAGES/SE.po +20 -20
  276. holidays/locale/th/LC_MESSAGES/BN.mo +0 -0
  277. holidays/locale/th/LC_MESSAGES/BN.po +96 -0
  278. holidays/locale/th/LC_MESSAGES/CA.po +42 -42
  279. holidays/locale/th/LC_MESSAGES/KH.mo +0 -0
  280. holidays/locale/th/LC_MESSAGES/KH.po +145 -0
  281. holidays/locale/th/LC_MESSAGES/TH.po +41 -41
  282. holidays/locale/uk/LC_MESSAGES/AR.mo +0 -0
  283. holidays/locale/uk/LC_MESSAGES/AR.po +35 -35
  284. holidays/locale/uk/LC_MESSAGES/AT.po +15 -16
  285. holidays/locale/uk/LC_MESSAGES/AW.mo +0 -0
  286. holidays/locale/uk/LC_MESSAGES/AW.po +87 -0
  287. holidays/locale/uk/LC_MESSAGES/CH.po +92 -58
  288. holidays/locale/uk/LC_MESSAGES/CL.po +40 -40
  289. holidays/locale/uk/LC_MESSAGES/CO.mo +0 -0
  290. holidays/locale/uk/LC_MESSAGES/CO.po +28 -29
  291. holidays/locale/uk/LC_MESSAGES/CR.mo +0 -0
  292. holidays/locale/uk/LC_MESSAGES/CR.po +20 -21
  293. holidays/locale/uk/LC_MESSAGES/CU.po +11 -12
  294. holidays/locale/uk/LC_MESSAGES/CW.mo +0 -0
  295. holidays/locale/uk/LC_MESSAGES/CW.po +82 -0
  296. holidays/locale/uk/LC_MESSAGES/DE.po +33 -34
  297. holidays/locale/uk/LC_MESSAGES/DK.po +14 -14
  298. holidays/locale/uk/LC_MESSAGES/DO.po +13 -14
  299. holidays/locale/uk/LC_MESSAGES/EC.po +12 -14
  300. holidays/locale/uk/LC_MESSAGES/FI.po +17 -18
  301. holidays/locale/uk/LC_MESSAGES/FR.po +28 -26
  302. holidays/locale/uk/LC_MESSAGES/HN.mo +0 -0
  303. holidays/locale/uk/LC_MESSAGES/HN.po +18 -14
  304. holidays/locale/uk/LC_MESSAGES/HU.mo +0 -0
  305. holidays/locale/uk/LC_MESSAGES/HU.po +109 -0
  306. holidays/locale/uk/LC_MESSAGES/IS.po +19 -20
  307. holidays/locale/uk/LC_MESSAGES/LI.po +24 -25
  308. holidays/locale/uk/LC_MESSAGES/MC.po +27 -28
  309. holidays/locale/uk/LC_MESSAGES/MD.po +14 -15
  310. holidays/locale/uk/LC_MESSAGES/MX.po +10 -14
  311. holidays/locale/uk/LC_MESSAGES/NI.mo +0 -0
  312. holidays/locale/uk/LC_MESSAGES/NI.po +16 -17
  313. holidays/locale/uk/LC_MESSAGES/NL.po +14 -15
  314. holidays/locale/uk/LC_MESSAGES/NO.po +15 -16
  315. holidays/locale/uk/LC_MESSAGES/PE.po +31 -32
  316. holidays/locale/uk/LC_MESSAGES/PL.po +38 -21
  317. holidays/locale/uk/LC_MESSAGES/PY.po +17 -18
  318. holidays/locale/uk/LC_MESSAGES/RO.po +13 -14
  319. holidays/locale/uk/LC_MESSAGES/SE.po +21 -22
  320. holidays/locale/uk/LC_MESSAGES/SK.po +18 -20
  321. holidays/locale/uk/LC_MESSAGES/UA.po +17 -17
  322. holidays/locale/uk/LC_MESSAGES/UY.po +16 -17
  323. holidays/locale/uk/LC_MESSAGES/VE.po +17 -18
  324. holidays/registry.py +21 -12
  325. holidays/utils.py +87 -17
  326. {holidays-0.25.dist-info → holidays-0.27.dist-info}/METADATA +282 -265
  327. holidays-0.27.dist-info/RECORD +449 -0
  328. holidays-0.25.dist-info/RECORD +0 -390
  329. {holidays-0.25.dist-info → holidays-0.27.dist-info}/LICENSE +0 -0
  330. {holidays-0.25.dist-info → holidays-0.27.dist-info}/WHEEL +0 -0
  331. {holidays-0.25.dist-info → holidays-0.27.dist-info}/top_level.txt +0 -0
@@ -9,16 +9,14 @@
9
9
  # Website: https://github.com/dr-prodigy/python-holidays
10
10
  # License: MIT (see LICENSE file)
11
11
 
12
- from holidays.calendars import _CustomCalendar, _IslamicLunar
13
- from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP
14
- from holidays.constants import OCT, NOV, DEC
12
+ from holidays.calendars import _CustomIslamicCalendar
13
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
15
14
  from holidays.holiday_base import HolidayBase
16
15
  from holidays.holiday_groups import InternationalHolidays, IslamicHolidays
17
16
 
18
17
 
19
18
  class Pakistan(HolidayBase, InternationalHolidays, IslamicHolidays):
20
19
  country = "PK"
21
- estimated_label = "estimated"
22
20
 
23
21
  def __init__(self, *args, **kwargs):
24
22
  InternationalHolidays.__init__(self)
@@ -78,92 +76,92 @@ class PAK(Pakistan):
78
76
  pass
79
77
 
80
78
 
81
- class PakistanIslamicCalendar(_CustomCalendar, _IslamicLunar):
79
+ class PakistanIslamicCalendar(_CustomIslamicCalendar):
82
80
  # https://www.timeanddate.com/holidays/pakistan/first-day-ashura
83
81
 
84
82
  ASHURA_DATES = {
85
- 2005: ((FEB, 18),),
86
- 2006: ((FEB, 8),),
87
- 2007: ((JAN, 28),),
88
- 2008: ((JAN, 18),),
83
+ 2005: (FEB, 18),
84
+ 2006: (FEB, 8),
85
+ 2007: (JAN, 28),
86
+ 2008: (JAN, 18),
89
87
  2009: ((JAN, 6), (DEC, 26)),
90
- 2010: ((DEC, 16),),
91
- 2011: ((DEC, 5),),
92
- 2012: ((NOV, 23),),
93
- 2013: ((NOV, 13),),
94
- 2014: ((NOV, 3),),
95
- 2015: ((OCT, 23),),
96
- 2016: ((OCT, 11),),
97
- 2017: ((SEP, 30),),
98
- 2018: ((SEP, 21),),
99
- 2019: ((SEP, 9),),
100
- 2020: ((AUG, 29),),
101
- 2021: ((AUG, 18),),
102
- 2022: ((AUG, 9),),
88
+ 2010: (DEC, 16),
89
+ 2011: (DEC, 5),
90
+ 2012: (NOV, 23),
91
+ 2013: (NOV, 13),
92
+ 2014: (NOV, 3),
93
+ 2015: (OCT, 23),
94
+ 2016: (OCT, 11),
95
+ 2017: (SEP, 30),
96
+ 2018: (SEP, 21),
97
+ 2019: (SEP, 9),
98
+ 2020: (AUG, 29),
99
+ 2021: (AUG, 18),
100
+ 2022: (AUG, 9),
103
101
  }
104
102
 
105
103
  # https://www.timeanddate.com/holidays/pakistan/eid-ul-azha
106
104
  EID_AL_ADHA_DATES = {
107
- 2005: ((JAN, 21),),
105
+ 2005: (JAN, 21),
108
106
  2006: ((JAN, 10), (DEC, 31)),
109
- 2007: ((DEC, 20),),
110
- 2008: ((DEC, 9),),
111
- 2009: ((NOV, 28),),
112
- 2010: ((NOV, 17),),
113
- 2011: ((NOV, 7),),
114
- 2012: ((OCT, 26),),
115
- 2013: ((OCT, 15),),
116
- 2014: ((OCT, 6),),
117
- 2015: ((SEP, 24),),
118
- 2016: ((SEP, 12),),
119
- 2017: ((SEP, 2),),
120
- 2018: ((AUG, 22),),
121
- 2019: ((AUG, 12),),
122
- 2020: ((JUL, 31),),
123
- 2021: ((JUL, 21),),
124
- 2022: ((JUL, 10),),
107
+ 2007: (DEC, 20),
108
+ 2008: (DEC, 9),
109
+ 2009: (NOV, 28),
110
+ 2010: (NOV, 17),
111
+ 2011: (NOV, 7),
112
+ 2012: (OCT, 26),
113
+ 2013: (OCT, 15),
114
+ 2014: (OCT, 6),
115
+ 2015: (SEP, 24),
116
+ 2016: (SEP, 12),
117
+ 2017: (SEP, 2),
118
+ 2018: (AUG, 22),
119
+ 2019: (AUG, 12),
120
+ 2020: (JUL, 31),
121
+ 2021: (JUL, 21),
122
+ 2022: (JUL, 10),
125
123
  }
126
124
 
127
125
  # https://www.timeanddate.com/holidays/pakistan/eid-ul-fitr-1
128
126
  EID_AL_FITR_DATES = {
129
- 2005: ((NOV, 4),),
130
- 2006: ((OCT, 24),),
131
- 2007: ((OCT, 13),),
132
- 2008: ((OCT, 2),),
133
- 2009: ((SEP, 21),),
134
- 2010: ((SEP, 10),),
135
- 2011: ((AUG, 31),),
136
- 2012: ((AUG, 19),),
137
- 2013: ((AUG, 8),),
138
- 2014: ((JUL, 29),),
139
- 2015: ((JUL, 17),),
140
- 2016: ((JUL, 6),),
141
- 2017: ((JUN, 26),),
142
- 2018: ((JUN, 16),),
143
- 2019: ((JUN, 5),),
144
- 2020: ((MAY, 24),),
145
- 2021: ((MAY, 13),),
146
- 2022: ((MAY, 3),),
127
+ 2005: (NOV, 4),
128
+ 2006: (OCT, 24),
129
+ 2007: (OCT, 13),
130
+ 2008: (OCT, 2),
131
+ 2009: (SEP, 21),
132
+ 2010: (SEP, 10),
133
+ 2011: (AUG, 31),
134
+ 2012: (AUG, 19),
135
+ 2013: (AUG, 8),
136
+ 2014: (JUL, 29),
137
+ 2015: (JUL, 17),
138
+ 2016: (JUL, 6),
139
+ 2017: (JUN, 26),
140
+ 2018: (JUN, 16),
141
+ 2019: (JUN, 5),
142
+ 2020: (MAY, 24),
143
+ 2021: (MAY, 13),
144
+ 2022: (MAY, 3),
147
145
  }
148
146
 
149
147
  # https://www.timeanddate.com/holidays/pakistan/eid-milad-un-nabi
150
148
  MAWLID_DATES = {
151
- 2005: ((APR, 22),),
152
- 2006: ((APR, 11),),
153
- 2007: ((MAR, 31),),
154
- 2008: ((MAR, 21),),
155
- 2009: ((MAR, 9),),
156
- 2010: ((MAR, 1),),
157
- 2011: ((FEB, 17),),
158
- 2012: ((FEB, 5),),
159
- 2013: ((JAN, 24),),
160
- 2014: ((JAN, 14),),
161
- 2015: ((JAN, 4),),
162
- 2016: ((DEC, 12),),
163
- 2017: ((DEC, 1),),
164
- 2018: ((NOV, 21),),
165
- 2019: ((NOV, 10),),
166
- 2020: ((OCT, 30),),
167
- 2021: ((OCT, 19),),
168
- 2022: ((OCT, 9),),
149
+ 2005: (APR, 22),
150
+ 2006: (APR, 11),
151
+ 2007: (MAR, 31),
152
+ 2008: (MAR, 21),
153
+ 2009: (MAR, 9),
154
+ 2010: (MAR, 1),
155
+ 2011: (FEB, 17),
156
+ 2012: (FEB, 5),
157
+ 2013: (JAN, 24),
158
+ 2014: (JAN, 14),
159
+ 2015: (JAN, 4),
160
+ 2016: (DEC, 12),
161
+ 2017: (DEC, 1),
162
+ 2018: (NOV, 21),
163
+ 2019: (NOV, 10),
164
+ 2020: (OCT, 30),
165
+ 2021: (OCT, 19),
166
+ 2022: (OCT, 9),
169
167
  }
@@ -12,13 +12,12 @@
12
12
  from datetime import date
13
13
  from datetime import timedelta as td
14
14
 
15
- from dateutil.easter import easter
16
-
17
- from holidays.constants import JAN, MAY, NOV, DEC
15
+ from holidays.constants import JAN, NOV, DEC
18
16
  from holidays.holiday_base import HolidayBase
17
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
19
18
 
20
19
 
21
- class Panama(HolidayBase):
20
+ class Panama(HolidayBase, ChristianHolidays, InternationalHolidays):
22
21
  """
23
22
  References:
24
23
  - https://en.wikipedia.org/wiki/Public_holidays_in_Panama
@@ -27,55 +26,57 @@ class Panama(HolidayBase):
27
26
 
28
27
  country = "PA"
29
28
 
30
- def _populate(self, year: int) -> None:
31
- def _add_with_observed(hol_date: date, hol_name: str) -> None:
32
- self[hol_date] = hol_name
33
- if self.observed and self._is_sunday(hol_date):
34
- self[hol_date + td(days=+1)] = f"{hol_name} (Observed)"
29
+ def __init__(self, *args, **kwargs):
30
+ ChristianHolidays.__init__(self)
31
+ InternationalHolidays.__init__(self)
32
+ super().__init__(*args, **kwargs)
33
+
34
+ def _add_observed(self, dt: date) -> None:
35
+ if self.observed and self._is_sunday(dt):
36
+ self._add_holiday("%s (Observed)" % self[dt], dt + td(days=+1))
35
37
 
38
+ def _populate(self, year):
36
39
  super()._populate(year)
37
40
 
38
41
  # New Year's Day
39
- _add_with_observed(date(year, JAN, 1), "New Year's Day")
42
+ self._add_observed(self._add_new_years_day("New Year's Day"))
40
43
 
41
44
  # Martyrs' Day
42
- _add_with_observed(date(year, JAN, 9), "Martyrs' Day")
43
-
44
- easter_date = easter(year)
45
+ self._add_observed(self._add_holiday("Martyrs' Day", JAN, 9))
45
46
 
46
47
  # Carnival
47
- self[easter_date + td(days=-47)] = "Carnival"
48
+ self._add_carnival_tuesday("Carnival")
48
49
 
49
50
  # Good Friday
50
- self[easter_date + td(days=-2)] = "Good Friday"
51
+ self._add_good_friday("Good Friday")
51
52
 
52
53
  # Labour Day
53
- _add_with_observed(date(year, MAY, 1), "Labour Day")
54
+ self._add_observed(self._add_labor_day("Labour Day"))
54
55
 
55
56
  # Separation Day
56
- self[date(year, NOV, 3)] = "Separation Day"
57
+ self._add_holiday("Separation Day", NOV, 3)
57
58
 
58
59
  # National Symbols Day
59
- self[date(year, NOV, 4)] = "National Symbols Day"
60
+ self._add_holiday("National Symbols Day", NOV, 4)
60
61
 
61
62
  # Colon Day
62
- self[date(year, NOV, 5)] = "Colon Day"
63
+ self._add_holiday("Colon Day", NOV, 5)
63
64
 
64
65
  # Los Santos Uprising Day
65
- self[date(year, NOV, 10)] = "Los Santos Uprising Day"
66
+ self._add_holiday("Los Santos Uprising Day", NOV, 10)
66
67
 
67
68
  # Independence Day
68
- _add_with_observed(date(year, NOV, 28), "Independence Day")
69
+ self._add_observed(self._add_holiday("Independence Day", NOV, 28))
69
70
 
70
71
  # Mother's Day
71
- _add_with_observed(date(year, DEC, 8), "Mother's Day")
72
+ self._add_observed(self._add_holiday("Mother's Day", DEC, 8))
72
73
 
73
74
  # National Mourning Day
74
75
  if year >= 2022:
75
- _add_with_observed(date(year, DEC, 20), "National Mourning Day")
76
+ self._add_observed(self._add_holiday("National Mourning Day", DEC, 20))
76
77
 
77
78
  # Christmas Day
78
- _add_with_observed(date(year, DEC, 25), "Christmas Day")
79
+ self._add_observed(self._add_christmas_day("Christmas Day"))
79
80
 
80
81
 
81
82
  class PA(Panama):
@@ -10,17 +10,14 @@
10
10
  # License: MIT (see LICENSE file)
11
11
 
12
12
  from datetime import date
13
- from datetime import timedelta as td
14
13
  from gettext import gettext as tr
15
14
 
16
- from dateutil.easter import easter
17
-
18
- from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP
19
- from holidays.constants import OCT, DEC
15
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, DEC
20
16
  from holidays.holiday_base import HolidayBase
17
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
21
18
 
22
19
 
23
- class Paraguay(HolidayBase):
20
+ class Paraguay(HolidayBase, ChristianHolidays, InternationalHolidays):
24
21
  """
25
22
  https://www.ghp.com.py/news/feriados-nacionales-del-ano-2019-en-paraguay
26
23
  https://es.wikipedia.org/wiki/Anexo:D%C3%ADas_feriados_en_Paraguay
@@ -37,10 +34,10 @@ class Paraguay(HolidayBase):
37
34
  special_holidays = {
38
35
  # public holiday for business purposes, in view of
39
36
  # the recently increased risk of Dengue fever
40
- 2007: ((JAN, 29, public_holiday),),
37
+ 2007: (JAN, 29, public_holiday),
41
38
  # public sector holiday to celebrate Paraguay's
42
39
  # football team's qualification for the 2010 World Cup
43
- 2009: ((SEP, 10, public_holiday),),
40
+ 2009: (SEP, 10, public_holiday),
44
41
  2010: (
45
42
  # public holiday to coincide with the Paraguay-Italy
46
43
  # game of the current World Cup
@@ -141,16 +138,22 @@ class Paraguay(HolidayBase):
141
138
  (MAY, 2, public_sector_holiday),
142
139
  ),
143
140
  }
141
+ supported_languages = ("en_US", "es", "uk")
142
+
143
+ def __init__(self, *args, **kwargs):
144
+ ChristianHolidays.__init__(self)
145
+ InternationalHolidays.__init__(self)
146
+ super().__init__(*args, **kwargs)
144
147
 
145
- def _add_observed_holiday(self, name: str, dt: date) -> None:
146
- if self.observed or not self._is_weekend(dt):
147
- super()._add_holiday(name, dt)
148
+ def _move_holiday(self, dt: date) -> None:
149
+ if not self.observed and self._is_weekend(dt):
150
+ self.pop(dt)
148
151
 
149
152
  def _populate(self, year):
150
153
  super()._populate(year)
151
154
 
152
155
  # New Year's Day.
153
- self._add_observed_holiday(tr("Año Nuevo"), date(year, JAN, 1))
156
+ self._move_holiday(self._add_new_years_day(tr("Año Nuevo")))
154
157
 
155
158
  dates_obs = {
156
159
  2013: (MAR, 4),
@@ -158,51 +161,51 @@ class Paraguay(HolidayBase):
158
161
  2018: (FEB, 26),
159
162
  2022: (FEB, 28),
160
163
  }
161
- # Patriots Day.
162
164
  self._add_holiday(
165
+ # Patriots Day.
163
166
  tr("Día de los Héroes de la Patria"),
164
- date(year, *dates_obs.get(year, (MAR, 1))),
167
+ *dates_obs.get(year, (MAR, 1)),
165
168
  )
166
169
 
167
- # Holy Week
168
- easter_date = easter(year)
169
170
  # Maundy Thursday.
170
- self._add_holiday(tr("Jueves Santo"), easter_date + td(days=-3))
171
+ self._add_holy_thursday(tr("Jueves Santo"))
172
+
171
173
  # Good Friday.
172
- self._add_holiday(tr("Viernes Santo"), easter_date + td(days=-2))
174
+ self._add_good_friday(tr("Viernes Santo"))
175
+
173
176
  # Easter Day.
174
- self._add_observed_holiday(tr("Día de Pascuas"), easter_date)
177
+ self._move_holiday(self._add_easter_sunday(tr("Día de Pascuas")))
175
178
 
176
179
  # Labour Day.
177
- self._add_observed_holiday(
178
- tr("Día del Trabajador"), date(year, MAY, 1)
179
- )
180
+ self._move_holiday(self._add_labor_day(tr("Día del Trabajador")))
180
181
 
181
182
  # Independence Day.
182
183
  name = tr("Día de la Independencia Nacional")
183
- if year == 2021:
184
- self._add_holiday(name, date(year, MAY, 14))
185
- self._add_holiday(name, date(year, MAY, 15))
186
- elif year >= 2012:
187
- self._add_observed_holiday(name, date(year, MAY, 14))
188
- self._add_observed_holiday(name, date(year, MAY, 15))
189
- else:
190
- self._add_observed_holiday(name, date(year, MAY, 15))
184
+ if year >= 2012:
185
+ self._move_holiday(self._add_holiday(name, MAY, 14))
186
+ may_15 = self._add_holiday(name, MAY, 15)
187
+ if year != 2021:
188
+ self._move_holiday(may_15)
191
189
 
192
190
  dates_obs = {
193
191
  2014: (JUN, 16),
194
192
  2018: (JUN, 11),
195
193
  }
196
- self._add_observed_holiday(
197
- # Chaco Armistice Day.
198
- tr("Día de la Paz del Chaco"),
199
- date(year, *dates_obs.get(year, (JUN, 12))),
194
+ self._move_holiday(
195
+ self._add_holiday(
196
+ # Chaco Armistice Day.
197
+ tr("Día de la Paz del Chaco"),
198
+ *dates_obs.get(year, (JUN, 12)),
199
+ ),
200
200
  )
201
201
 
202
- self._add_observed_holiday(
203
- # Asuncion Foundation's Day.
204
- tr("Día de la Fundación de Asunción"),
205
- date(year, AUG, 15),
202
+ self._move_holiday(
203
+ self._add_holiday(
204
+ # Asuncion Foundation's Day.
205
+ tr("Día de la Fundación de Asunción"),
206
+ AUG,
207
+ 15,
208
+ ),
206
209
  )
207
210
 
208
211
  if year >= 2000:
@@ -213,20 +216,25 @@ class Paraguay(HolidayBase):
213
216
  2021: (SEP, 27),
214
217
  2022: (OCT, 3),
215
218
  }
216
- self._add_observed_holiday(
217
- # Boqueron Battle Day.
218
- tr("Día de la Batalla de Boquerón"),
219
- date(year, *dates_obs.get(year, (SEP, 29))),
219
+ self._move_holiday(
220
+ self._add_holiday(
221
+ # Boqueron Battle Day.
222
+ tr("Día de la Batalla de Boquerón"),
223
+ *dates_obs.get(year, (SEP, 29)),
224
+ ),
220
225
  )
221
226
 
222
- self._add_observed_holiday(
223
- # Caacupe Virgin Day.
224
- tr("Día de la Virgen de Caacupé"),
225
- date(year, DEC, 8),
227
+ self._move_holiday(
228
+ self._add_holiday(
229
+ # Caacupe Virgin Day.
230
+ tr("Día de la Virgen de Caacupé"),
231
+ DEC,
232
+ 8,
233
+ )
226
234
  )
227
235
 
228
236
  # Christmas.
229
- self._add_holiday(tr("Navidad"), date(year, DEC, 25))
237
+ self._add_christmas_day(tr("Navidad"))
230
238
 
231
239
 
232
240
  class PY(Paraguay):
@@ -28,6 +28,7 @@ class Peru(HolidayBase, ChristianHolidays, InternationalHolidays):
28
28
 
29
29
  country = "PE"
30
30
  default_language = "es"
31
+ supported_languages = ("en_US", "es", "uk")
31
32
 
32
33
  def __init__(self, *args, **kwargs) -> None:
33
34
  ChristianHolidays.__init__(self)
@@ -12,8 +12,12 @@
12
12
  from holidays.calendars import _get_nth_weekday_of_month
13
13
  from holidays.constants import FEB, APR, JUN, AUG, NOV, DEC, MON
14
14
  from holidays.holiday_base import HolidayBase
15
- from holidays.holiday_groups import ChineseCalendarHolidays, ChristianHolidays
16
- from holidays.holiday_groups import InternationalHolidays, IslamicHolidays
15
+ from holidays.holiday_groups import (
16
+ ChineseCalendarHolidays,
17
+ ChristianHolidays,
18
+ InternationalHolidays,
19
+ IslamicHolidays,
20
+ )
17
21
 
18
22
 
19
23
  class Philippines(
@@ -24,9 +24,8 @@ class Poland(HolidayBase, ChristianHolidays, InternationalHolidays):
24
24
 
25
25
  country = "PL"
26
26
  default_language = "pl"
27
- special_holidays = {
28
- 2018: ((NOV, 12, tr("Narodowe Święto Niepodległości - 100-lecie")),)
29
- }
27
+ special_holidays = {2018: (NOV, 12, tr("Narodowe Święto Niepodległości - 100-lecie"))}
28
+ supported_languages = ("en_US", "pl", "uk")
30
29
 
31
30
  def __init__(self, *args, **kwargs):
32
31
  ChristianHolidays.__init__(self)
@@ -66,9 +65,7 @@ class Poland(HolidayBase, ChristianHolidays, InternationalHolidays):
66
65
 
67
66
  if 1946 <= year <= 1950:
68
67
  # National Victory and Freedom Day.
69
- self._add_holiday(
70
- tr("Narodowe Święto Zwycięstwa i Wolności"), MAY, 9
71
- )
68
+ self._add_holiday(tr("Narodowe Święto Zwycięstwa i Wolności"), MAY, 9)
72
69
 
73
70
  if year <= 1950:
74
71
  # Ascension Day.
@@ -99,9 +96,7 @@ class Poland(HolidayBase, ChristianHolidays, InternationalHolidays):
99
96
 
100
97
  if year <= 1960 or year >= 1989:
101
98
  # Assumption of the Virgin Mary.
102
- self._add_assumption_of_mary_day(
103
- tr("Wniebowzięcie Najświętszej Marii Panny")
104
- )
99
+ self._add_assumption_of_mary_day(tr("Wniebowzięcie Najświętszej Marii Panny"))
105
100
 
106
101
  # All Saints' Day.
107
102
  self._add_all_saints_day(tr("Uroczystość Wszystkich Świętych"))
@@ -73,6 +73,7 @@ class Portugal(HolidayBase, ChristianHolidays, InternationalHolidays):
73
73
  "30",
74
74
  "Ext",
75
75
  )
76
+ supported_languages = ("en_US", "pt_PT")
76
77
 
77
78
  def __init__(self, *args, **kwargs) -> None:
78
79
  ChristianHolidays.__init__(self)
@@ -108,15 +109,10 @@ class Portugal(HolidayBase, ChristianHolidays, InternationalHolidays):
108
109
  self._add_labor_day(tr("Dia do Trabalhador"))
109
110
  if year >= 1911:
110
111
  if 1933 <= year <= 1973:
111
- self._add_holiday(
112
- tr("Dia de Camões, de Portugal e da Raça"), JUN, 10
113
- )
112
+ self._add_holiday(tr("Dia de Camões, de Portugal e da Raça"), JUN, 10)
114
113
  elif year >= 1978:
115
114
  self._add_holiday(
116
- tr(
117
- "Dia de Portugal, de Camões e das Comunidades "
118
- "Portuguesas"
119
- ),
115
+ tr("Dia de Portugal, de Camões e das Comunidades Portuguesas"),
120
116
  JUN,
121
117
  10,
122
118
  )
@@ -221,10 +217,7 @@ class Portugal(HolidayBase, ChristianHolidays, InternationalHolidays):
221
217
  self._add_holiday(tr("Dia da Região Autónoma da Madeira"), JUL, 1)
222
218
  elif self._year >= 1989:
223
219
  self._add_holiday(
224
- tr(
225
- "Dia da Região Autónoma da Madeira e "
226
- "das Comunidades Madeirenses"
227
- ),
220
+ tr("Dia da Região Autónoma da Madeira e das Comunidades Madeirenses"),
228
221
  JUL,
229
222
  1,
230
223
  )
@@ -12,7 +12,7 @@
12
12
  from gettext import gettext as tr
13
13
 
14
14
  from holidays.calendars import GREGORIAN_CALENDAR, JULIAN_CALENDAR
15
- from holidays.constants import JAN, JUN, NOV, DEC
15
+ from holidays.constants import JAN, NOV, DEC
16
16
  from holidays.holiday_base import HolidayBase
17
17
  from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
18
18
 
@@ -25,6 +25,7 @@ class Romania(HolidayBase, ChristianHolidays, InternationalHolidays):
25
25
 
26
26
  country = "RO"
27
27
  default_language = "ro"
28
+ supported_languages = ("en_US", "ro", "uk")
28
29
 
29
30
  def __init__(self, *args, **kwargs):
30
31
  ChristianHolidays.__init__(self, JULIAN_CALENDAR)
@@ -63,7 +64,7 @@ class Romania(HolidayBase, ChristianHolidays, InternationalHolidays):
63
64
 
64
65
  if year >= 2017:
65
66
  # Children's Day.
66
- self._add_holiday(tr("Ziua Copilului"), JUN, 1)
67
+ self._add_childrens_day(tr("Ziua Copilului"))
67
68
 
68
69
  # Pentecost.
69
70
  name = tr("Rusaliile")
@@ -78,9 +79,7 @@ class Romania(HolidayBase, ChristianHolidays, InternationalHolidays):
78
79
  # Law #147/2012
79
80
  if year >= 2012:
80
81
  # Saint Andrew's Day.
81
- self._add_holiday(
82
- tr("Sfantul Apostol Andrei cel Intai chemat"), NOV, 30
83
- )
82
+ self._add_holiday(tr("Sfantul Apostol Andrei cel Intai chemat"), NOV, 30)
84
83
 
85
84
  # National Day.
86
85
  self._add_holiday(tr("Ziua Națională a României"), DEC, 1)
@@ -22,6 +22,7 @@ class Russia(HolidayBase):
22
22
 
23
23
  country = "RU"
24
24
  default_language = "ru"
25
+ supported_languages = ("en_US", "ru")
25
26
 
26
27
  special_holidays = {
27
28
  2023: (