ngx-bootstrap 3.0.1 → 3.1.4

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 (1869) hide show
  1. package/CHANGELOG.md +298 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +24 -8
  4. package/accordion/accordion-group.component.d.ts +3 -3
  5. package/accordion/bundles/ngx-bootstrap-accordion.umd.js +264 -0
  6. package/accordion/bundles/ngx-bootstrap-accordion.umd.js.map +1 -0
  7. package/accordion/bundles/ngx-bootstrap-accordion.umd.min.js +2 -0
  8. package/accordion/bundles/ngx-bootstrap-accordion.umd.min.js.map +1 -0
  9. package/accordion/esm2015/accordion-group.component.js +140 -0
  10. package/accordion/esm2015/accordion.component.js +88 -0
  11. package/accordion/esm2015/accordion.config.js +35 -0
  12. package/accordion/esm2015/accordion.module.js +36 -0
  13. package/accordion/esm2015/ngx-bootstrap-accordion.js +10 -0
  14. package/accordion/esm2015/public_api.js +10 -0
  15. package/accordion/esm5/accordion-group.component.js +157 -0
  16. package/accordion/esm5/accordion.component.js +99 -0
  17. package/accordion/esm5/accordion.config.js +37 -0
  18. package/accordion/esm5/accordion.module.js +43 -0
  19. package/accordion/esm5/ngx-bootstrap-accordion.js +10 -0
  20. package/accordion/esm5/public_api.js +10 -0
  21. package/accordion/fesm2015/ngx-bootstrap-accordion.js +222 -0
  22. package/accordion/fesm2015/ngx-bootstrap-accordion.js.map +1 -0
  23. package/accordion/fesm5/ngx-bootstrap-accordion.js +255 -0
  24. package/accordion/fesm5/ngx-bootstrap-accordion.js.map +1 -0
  25. package/accordion/ngx-bootstrap-accordion.d.ts +4 -0
  26. package/accordion/ngx-bootstrap-accordion.metadata.json +1 -0
  27. package/accordion/package.json +19 -0
  28. package/accordion/{index.d.ts → public_api.d.ts} +0 -0
  29. package/alert/bundles/ngx-bootstrap-alert.umd.js +209 -0
  30. package/alert/bundles/ngx-bootstrap-alert.umd.js.map +1 -0
  31. package/alert/bundles/ngx-bootstrap-alert.umd.min.js +2 -0
  32. package/alert/bundles/ngx-bootstrap-alert.umd.min.js.map +1 -0
  33. package/alert/esm2015/alert.component.js +145 -0
  34. package/alert/esm2015/alert.config.js +50 -0
  35. package/alert/esm2015/alert.module.js +35 -0
  36. package/alert/esm2015/ngx-bootstrap-alert.js +10 -0
  37. package/alert/esm2015/public_api.js +9 -0
  38. package/alert/esm5/alert.component.js +157 -0
  39. package/alert/esm5/alert.config.js +52 -0
  40. package/alert/esm5/alert.module.js +42 -0
  41. package/alert/esm5/ngx-bootstrap-alert.js +10 -0
  42. package/alert/esm5/public_api.js +9 -0
  43. package/alert/fesm2015/ngx-bootstrap-alert.js +153 -0
  44. package/alert/fesm2015/ngx-bootstrap-alert.js.map +1 -0
  45. package/alert/fesm5/ngx-bootstrap-alert.js +171 -0
  46. package/alert/fesm5/ngx-bootstrap-alert.js.map +1 -0
  47. package/alert/ngx-bootstrap-alert.d.ts +4 -0
  48. package/alert/ngx-bootstrap-alert.metadata.json +1 -0
  49. package/alert/package.json +19 -0
  50. package/alert/{index.d.ts → public_api.d.ts} +0 -0
  51. package/bundles/ngx-bootstrap.es2015.js +20178 -12836
  52. package/bundles/ngx-bootstrap.es2015.js.map +1 -1
  53. package/bundles/ngx-bootstrap.umd.js +179 -21213
  54. package/bundles/ngx-bootstrap.umd.js.map +1 -1
  55. package/bundles/ngx-bootstrap.umd.min.js +1 -64
  56. package/bundles/ngx-bootstrap.umd.min.js.map +1 -1
  57. package/buttons/bundles/ngx-bootstrap-buttons.umd.js +479 -0
  58. package/buttons/bundles/ngx-bootstrap-buttons.umd.js.map +1 -0
  59. package/buttons/bundles/ngx-bootstrap-buttons.umd.min.js +2 -0
  60. package/buttons/bundles/ngx-bootstrap-buttons.umd.min.js.map +1 -0
  61. package/buttons/button-checkbox.directive.d.ts +10 -10
  62. package/buttons/button-radio-group.directive.d.ts +9 -10
  63. package/buttons/button-radio.directive.d.ts +12 -12
  64. package/buttons/esm2015/button-checkbox.directive.js +146 -0
  65. package/buttons/esm2015/button-radio-group.directive.js +90 -0
  66. package/buttons/esm2015/button-radio.directive.js +200 -0
  67. package/buttons/esm2015/buttons.module.js +33 -0
  68. package/buttons/esm2015/ngx-bootstrap-buttons.js +13 -0
  69. package/buttons/esm2015/public_api.js +10 -0
  70. package/buttons/esm5/button-checkbox.directive.js +184 -0
  71. package/buttons/esm5/button-radio-group.directive.js +105 -0
  72. package/buttons/esm5/button-radio.directive.js +239 -0
  73. package/buttons/esm5/buttons.module.js +40 -0
  74. package/buttons/esm5/ngx-bootstrap-buttons.js +13 -0
  75. package/buttons/esm5/public_api.js +10 -0
  76. package/buttons/fesm2015/ngx-bootstrap-buttons.js +376 -0
  77. package/buttons/fesm2015/ngx-bootstrap-buttons.js.map +1 -0
  78. package/buttons/fesm5/ngx-bootstrap-buttons.js +471 -0
  79. package/buttons/fesm5/ngx-bootstrap-buttons.js.map +1 -0
  80. package/buttons/ngx-bootstrap-buttons.d.ts +7 -0
  81. package/buttons/ngx-bootstrap-buttons.metadata.json +1 -0
  82. package/buttons/package.json +19 -0
  83. package/buttons/{index.d.ts → public_api.d.ts} +0 -0
  84. package/carousel/bundles/ngx-bootstrap-carousel.umd.js +567 -0
  85. package/carousel/bundles/ngx-bootstrap-carousel.umd.js.map +1 -0
  86. package/carousel/bundles/ngx-bootstrap-carousel.umd.min.js +2 -0
  87. package/carousel/bundles/ngx-bootstrap-carousel.umd.min.js.map +1 -0
  88. package/carousel/carousel.component.d.ts +3 -7
  89. package/carousel/esm2015/carousel.component.js +372 -0
  90. package/carousel/esm2015/carousel.config.js +59 -0
  91. package/carousel/esm2015/carousel.module.js +36 -0
  92. package/carousel/esm2015/ngx-bootstrap-carousel.js +10 -0
  93. package/carousel/esm2015/public_api.js +10 -0
  94. package/carousel/esm2015/slide.component.js +81 -0
  95. package/carousel/esm5/carousel.component.js +495 -0
  96. package/carousel/esm5/carousel.config.js +61 -0
  97. package/carousel/esm5/carousel.module.js +43 -0
  98. package/carousel/esm5/ngx-bootstrap-carousel.js +10 -0
  99. package/carousel/esm5/public_api.js +10 -0
  100. package/carousel/esm5/slide.component.js +86 -0
  101. package/carousel/fesm2015/ngx-bootstrap-carousel.js +423 -0
  102. package/carousel/fesm2015/ngx-bootstrap-carousel.js.map +1 -0
  103. package/carousel/fesm5/ngx-bootstrap-carousel.js +556 -0
  104. package/carousel/fesm5/ngx-bootstrap-carousel.js.map +1 -0
  105. package/carousel/ngx-bootstrap-carousel.d.ts +4 -0
  106. package/carousel/ngx-bootstrap-carousel.metadata.json +1 -0
  107. package/carousel/package.json +19 -0
  108. package/carousel/{index.d.ts → public_api.d.ts} +0 -0
  109. package/chronos/bundles/ngx-bootstrap-chronos.umd.js +8428 -0
  110. package/chronos/bundles/ngx-bootstrap-chronos.umd.js.map +1 -0
  111. package/chronos/bundles/ngx-bootstrap-chronos.umd.min.js +2 -0
  112. package/chronos/bundles/ngx-bootstrap-chronos.umd.min.js.map +1 -0
  113. package/chronos/esm2015/create/check-overflow.js +39 -0
  114. package/chronos/esm2015/create/clone.js +13 -0
  115. package/chronos/esm2015/create/date-from-array.js +38 -0
  116. package/chronos/esm2015/create/from-anything.js +131 -0
  117. package/chronos/esm2015/create/from-array.js +149 -0
  118. package/chronos/esm2015/create/from-object.js +25 -0
  119. package/chronos/esm2015/create/from-string-and-array.js +46 -0
  120. package/chronos/esm2015/create/from-string-and-format.js +120 -0
  121. package/chronos/esm2015/create/from-string.js +268 -0
  122. package/chronos/esm2015/create/local.js +23 -0
  123. package/chronos/esm2015/create/parsing-flags.js +38 -0
  124. package/chronos/esm2015/create/parsing.types.js +146 -0
  125. package/chronos/esm2015/create/valid.js +60 -0
  126. package/chronos/esm2015/duration/bubble.js +64 -0
  127. package/chronos/esm2015/duration/constructor.js +182 -0
  128. package/chronos/esm2015/duration/create.js +141 -0
  129. package/chronos/esm2015/duration/humanize.js +109 -0
  130. package/chronos/esm2015/duration/valid.js +54 -0
  131. package/chronos/esm2015/format/format.js +67 -0
  132. package/chronos/esm2015/format.js +71 -0
  133. package/chronos/esm2015/i18n/ar.js +155 -0
  134. package/chronos/esm2015/i18n/bg.js +101 -0
  135. package/chronos/esm2015/i18n/cs.js +215 -0
  136. package/chronos/esm2015/i18n/da.js +56 -0
  137. package/chronos/esm2015/i18n/de.js +80 -0
  138. package/chronos/esm2015/i18n/en-gb.js +72 -0
  139. package/chronos/esm2015/i18n/es-do.js +118 -0
  140. package/chronos/esm2015/i18n/es-us.js +111 -0
  141. package/chronos/esm2015/i18n/es.js +117 -0
  142. package/chronos/esm2015/i18n/fi.js +119 -0
  143. package/chronos/esm2015/i18n/fr.js +87 -0
  144. package/chronos/esm2015/i18n/gl.js +117 -0
  145. package/chronos/esm2015/i18n/he.js +129 -0
  146. package/chronos/esm2015/i18n/hi.js +150 -0
  147. package/chronos/esm2015/i18n/hu.js +140 -0
  148. package/chronos/esm2015/i18n/id.js +100 -0
  149. package/chronos/esm2015/i18n/it.js +79 -0
  150. package/chronos/esm2015/i18n/ja.js +95 -0
  151. package/chronos/esm2015/i18n/ko.js +82 -0
  152. package/chronos/esm2015/i18n/lt.js +155 -0
  153. package/chronos/esm2015/i18n/mn.js +108 -0
  154. package/chronos/esm2015/i18n/nb.js +59 -0
  155. package/chronos/esm2015/i18n/nl-be.js +97 -0
  156. package/chronos/esm2015/i18n/nl.js +97 -0
  157. package/chronos/esm2015/i18n/pl.js +156 -0
  158. package/chronos/esm2015/i18n/pt-br.js +65 -0
  159. package/chronos/esm2015/i18n/ro.js +73 -0
  160. package/chronos/esm2015/i18n/ru.js +218 -0
  161. package/chronos/esm2015/i18n/sk.js +193 -0
  162. package/chronos/esm2015/i18n/sl.js +202 -0
  163. package/chronos/esm2015/i18n/sv.js +74 -0
  164. package/chronos/esm2015/i18n/th.js +75 -0
  165. package/chronos/esm2015/i18n/tr.js +95 -0
  166. package/chronos/esm2015/i18n/zh-cn.js +136 -0
  167. package/chronos/esm2015/index.js +7 -0
  168. package/chronos/esm2015/locale/calendar.js +14 -0
  169. package/chronos/esm2015/locale/locale.class.js +841 -0
  170. package/chronos/esm2015/locale/locale.defaults.js +46 -0
  171. package/chronos/esm2015/locale/locales.js +272 -0
  172. package/chronos/esm2015/moment/add-subtract.js +61 -0
  173. package/chronos/esm2015/moment/calendar.js +81 -0
  174. package/chronos/esm2015/moment/diff.js +88 -0
  175. package/chronos/esm2015/moment/min-max.js +50 -0
  176. package/chronos/esm2015/ngx-bootstrap-chronos.js +11 -0
  177. package/chronos/esm2015/parse/regex.js +72 -0
  178. package/chronos/esm2015/parse/token.js +52 -0
  179. package/chronos/esm2015/public_api.js +50 -0
  180. package/chronos/esm2015/test/chain.js +1212 -0
  181. package/chronos/esm2015/types.js +76 -0
  182. package/chronos/esm2015/units/aliases.js +53 -0
  183. package/chronos/esm2015/units/constants.js +16 -0
  184. package/chronos/esm2015/units/day-of-month.js +39 -0
  185. package/chronos/esm2015/units/day-of-week.js +183 -0
  186. package/chronos/esm2015/units/day-of-year.js +55 -0
  187. package/chronos/esm2015/units/hour.js +153 -0
  188. package/chronos/esm2015/units/index.js +24 -0
  189. package/chronos/esm2015/units/millisecond.js +74 -0
  190. package/chronos/esm2015/units/minute.js +31 -0
  191. package/chronos/esm2015/units/month.js +75 -0
  192. package/chronos/esm2015/units/offset.js +227 -0
  193. package/chronos/esm2015/units/priorities.js +31 -0
  194. package/chronos/esm2015/units/quarter.js +57 -0
  195. package/chronos/esm2015/units/second.js +31 -0
  196. package/chronos/esm2015/units/timestamp.js +36 -0
  197. package/chronos/esm2015/units/timezone.js +33 -0
  198. package/chronos/esm2015/units/week-calendar-utils.js +94 -0
  199. package/chronos/esm2015/units/week-year.js +175 -0
  200. package/chronos/esm2015/units/week.js +83 -0
  201. package/chronos/esm2015/units/year.js +81 -0
  202. package/chronos/esm2015/utils/abs-ceil.js +13 -0
  203. package/chronos/esm2015/utils/abs-round.js +13 -0
  204. package/chronos/esm2015/utils/compare-arrays.js +27 -0
  205. package/chronos/esm2015/utils/date-compare.js +108 -0
  206. package/chronos/esm2015/utils/date-getters.js +157 -0
  207. package/chronos/esm2015/utils/date-setters.js +147 -0
  208. package/chronos/esm2015/utils/defaults.js +22 -0
  209. package/chronos/esm2015/utils/start-end-of.js +74 -0
  210. package/chronos/esm2015/utils/type-checks.js +114 -0
  211. package/chronos/esm2015/utils/zero-fill.js +21 -0
  212. package/chronos/esm2015/utils.js +21 -0
  213. package/chronos/esm5/create/check-overflow.js +39 -0
  214. package/chronos/esm5/create/clone.js +13 -0
  215. package/chronos/esm5/create/date-from-array.js +44 -0
  216. package/chronos/esm5/create/from-anything.js +131 -0
  217. package/chronos/esm5/create/from-array.js +149 -0
  218. package/chronos/esm5/create/from-object.js +25 -0
  219. package/chronos/esm5/create/from-string-and-array.js +46 -0
  220. package/chronos/esm5/create/from-string-and-format.js +120 -0
  221. package/chronos/esm5/create/from-string.js +268 -0
  222. package/chronos/esm5/create/local.js +23 -0
  223. package/chronos/esm5/create/parsing-flags.js +38 -0
  224. package/chronos/esm5/create/parsing.types.js +146 -0
  225. package/chronos/esm5/create/valid.js +60 -0
  226. package/chronos/esm5/duration/bubble.js +64 -0
  227. package/chronos/esm5/duration/constructor.js +205 -0
  228. package/chronos/esm5/duration/create.js +143 -0
  229. package/chronos/esm5/duration/humanize.js +109 -0
  230. package/chronos/esm5/duration/valid.js +54 -0
  231. package/chronos/esm5/format/format.js +68 -0
  232. package/chronos/esm5/format.js +73 -0
  233. package/chronos/esm5/i18n/ar.js +155 -0
  234. package/chronos/esm5/i18n/bg.js +101 -0
  235. package/chronos/esm5/i18n/cs.js +215 -0
  236. package/chronos/esm5/i18n/da.js +56 -0
  237. package/chronos/esm5/i18n/de.js +80 -0
  238. package/chronos/esm5/i18n/en-gb.js +72 -0
  239. package/chronos/esm5/i18n/es-do.js +118 -0
  240. package/chronos/esm5/i18n/es-us.js +111 -0
  241. package/chronos/esm5/i18n/es.js +117 -0
  242. package/chronos/esm5/i18n/fi.js +119 -0
  243. package/chronos/esm5/i18n/fr.js +87 -0
  244. package/chronos/esm5/i18n/gl.js +117 -0
  245. package/chronos/esm5/i18n/he.js +129 -0
  246. package/chronos/esm5/i18n/hi.js +150 -0
  247. package/chronos/esm5/i18n/hu.js +140 -0
  248. package/chronos/esm5/i18n/id.js +100 -0
  249. package/chronos/esm5/i18n/it.js +79 -0
  250. package/chronos/esm5/i18n/ja.js +95 -0
  251. package/chronos/esm5/i18n/ko.js +82 -0
  252. package/chronos/esm5/i18n/lt.js +155 -0
  253. package/chronos/esm5/i18n/mn.js +108 -0
  254. package/chronos/esm5/i18n/nb.js +59 -0
  255. package/chronos/esm5/i18n/nl-be.js +97 -0
  256. package/chronos/esm5/i18n/nl.js +97 -0
  257. package/chronos/esm5/i18n/pl.js +156 -0
  258. package/chronos/esm5/i18n/pt-br.js +65 -0
  259. package/chronos/esm5/i18n/ro.js +73 -0
  260. package/chronos/esm5/i18n/ru.js +218 -0
  261. package/chronos/esm5/i18n/sk.js +193 -0
  262. package/chronos/esm5/i18n/sl.js +202 -0
  263. package/chronos/esm5/i18n/sv.js +74 -0
  264. package/chronos/esm5/i18n/th.js +75 -0
  265. package/chronos/esm5/i18n/tr.js +95 -0
  266. package/chronos/esm5/i18n/zh-cn.js +136 -0
  267. package/chronos/esm5/index.js +7 -0
  268. package/chronos/esm5/locale/calendar.js +14 -0
  269. package/chronos/esm5/locale/locale.class.js +996 -0
  270. package/chronos/esm5/locale/locale.defaults.js +46 -0
  271. package/chronos/esm5/locale/locales.js +272 -0
  272. package/chronos/esm5/moment/add-subtract.js +61 -0
  273. package/chronos/esm5/moment/calendar.js +83 -0
  274. package/chronos/esm5/moment/diff.js +89 -0
  275. package/chronos/esm5/moment/min-max.js +58 -0
  276. package/chronos/esm5/ngx-bootstrap-chronos.js +11 -0
  277. package/chronos/esm5/parse/regex.js +72 -0
  278. package/chronos/esm5/parse/token.js +52 -0
  279. package/chronos/esm5/public_api.js +50 -0
  280. package/chronos/esm5/test/chain.js +1506 -0
  281. package/chronos/esm5/types.js +76 -0
  282. package/chronos/esm5/units/aliases.js +53 -0
  283. package/chronos/esm5/units/constants.js +16 -0
  284. package/chronos/esm5/units/day-of-month.js +39 -0
  285. package/chronos/esm5/units/day-of-week.js +188 -0
  286. package/chronos/esm5/units/day-of-year.js +55 -0
  287. package/chronos/esm5/units/hour.js +153 -0
  288. package/chronos/esm5/units/index.js +24 -0
  289. package/chronos/esm5/units/millisecond.js +74 -0
  290. package/chronos/esm5/units/minute.js +31 -0
  291. package/chronos/esm5/units/month.js +75 -0
  292. package/chronos/esm5/units/offset.js +231 -0
  293. package/chronos/esm5/units/priorities.js +31 -0
  294. package/chronos/esm5/units/quarter.js +58 -0
  295. package/chronos/esm5/units/second.js +31 -0
  296. package/chronos/esm5/units/timestamp.js +36 -0
  297. package/chronos/esm5/units/timezone.js +33 -0
  298. package/chronos/esm5/units/week-calendar-utils.js +94 -0
  299. package/chronos/esm5/units/week-year.js +178 -0
  300. package/chronos/esm5/units/week.js +85 -0
  301. package/chronos/esm5/units/year.js +81 -0
  302. package/chronos/esm5/utils/abs-ceil.js +13 -0
  303. package/chronos/esm5/utils/abs-round.js +13 -0
  304. package/chronos/esm5/utils/compare-arrays.js +27 -0
  305. package/chronos/esm5/utils/date-compare.js +112 -0
  306. package/chronos/esm5/utils/date-getters.js +165 -0
  307. package/chronos/esm5/utils/date-setters.js +147 -0
  308. package/chronos/esm5/utils/defaults.js +22 -0
  309. package/chronos/esm5/utils/start-end-of.js +74 -0
  310. package/chronos/esm5/utils/type-checks.js +114 -0
  311. package/chronos/esm5/utils/zero-fill.js +21 -0
  312. package/chronos/esm5/utils.js +21 -0
  313. package/chronos/fesm2015/ngx-bootstrap-chronos.js +8176 -0
  314. package/chronos/fesm2015/ngx-bootstrap-chronos.js.map +1 -0
  315. package/chronos/fesm5/ngx-bootstrap-chronos.js +8383 -0
  316. package/chronos/fesm5/ngx-bootstrap-chronos.js.map +1 -0
  317. package/chronos/i18n/bg.d.ts +2 -0
  318. package/chronos/i18n/lt.d.ts +2 -0
  319. package/chronos/i18n/nb.d.ts +2 -0
  320. package/chronos/i18n/sk.d.ts +2 -0
  321. package/chronos/index.d.ts +1 -7
  322. package/chronos/ngx-bootstrap-chronos.d.ts +5 -0
  323. package/chronos/ngx-bootstrap-chronos.metadata.json +1 -0
  324. package/chronos/package.json +19 -0
  325. package/chronos/public_api.d.ts +46 -0
  326. package/chronos/units/day-of-month.d.ts +1 -1
  327. package/chronos/units/day-of-week.d.ts +1 -0
  328. package/chronos/units/day-of-year.d.ts +1 -0
  329. package/chronos/units/hour.d.ts +1 -1
  330. package/chronos/units/millisecond.d.ts +1 -1
  331. package/chronos/units/minute.d.ts +1 -1
  332. package/chronos/units/month.d.ts +1 -0
  333. package/chronos/units/offset.d.ts +1 -0
  334. package/chronos/units/quarter.d.ts +1 -0
  335. package/chronos/units/second.d.ts +1 -1
  336. package/chronos/units/timestamp.d.ts +1 -1
  337. package/chronos/units/timezone.d.ts +1 -0
  338. package/chronos/units/week-year.d.ts +1 -0
  339. package/chronos/units/week.d.ts +1 -0
  340. package/chronos/units/year.d.ts +1 -0
  341. package/chronos/utils/date-compare.d.ts +2 -0
  342. package/chronos/utils/type-checks.d.ts +1 -1
  343. package/collapse/bundles/ngx-bootstrap-collapse.umd.js +178 -0
  344. package/collapse/bundles/ngx-bootstrap-collapse.umd.js.map +1 -0
  345. package/collapse/bundles/ngx-bootstrap-collapse.umd.min.js +2 -0
  346. package/collapse/bundles/ngx-bootstrap-collapse.umd.min.js.map +1 -0
  347. package/collapse/esm2015/collapse.directive.js +150 -0
  348. package/collapse/esm2015/collapse.module.js +31 -0
  349. package/collapse/esm2015/ngx-bootstrap-collapse.js +10 -0
  350. package/collapse/esm2015/public_api.js +8 -0
  351. package/collapse/esm5/collapse.directive.js +167 -0
  352. package/collapse/esm5/collapse.module.js +38 -0
  353. package/collapse/esm5/ngx-bootstrap-collapse.js +10 -0
  354. package/collapse/esm5/public_api.js +8 -0
  355. package/collapse/fesm2015/ngx-bootstrap-collapse.js +147 -0
  356. package/collapse/fesm2015/ngx-bootstrap-collapse.js.map +1 -0
  357. package/collapse/fesm5/ngx-bootstrap-collapse.js +169 -0
  358. package/collapse/fesm5/ngx-bootstrap-collapse.js.map +1 -0
  359. package/collapse/ngx-bootstrap-collapse.d.ts +4 -0
  360. package/collapse/ngx-bootstrap-collapse.metadata.json +1 -0
  361. package/collapse/package.json +19 -0
  362. package/collapse/{index.d.ts → public_api.d.ts} +0 -0
  363. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.js +508 -0
  364. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.js.map +1 -0
  365. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.min.js +2 -0
  366. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.min.js.map +1 -0
  367. package/component-loader/component-loader.class.d.ts +11 -5
  368. package/component-loader/component-loader.factory.d.ts +1 -2
  369. package/component-loader/esm2015/bs-component-ref.class.js +17 -0
  370. package/component-loader/esm2015/component-loader.class.js +402 -0
  371. package/component-loader/esm2015/component-loader.factory.js +66 -0
  372. package/component-loader/esm2015/content-ref.class.js +34 -0
  373. package/component-loader/esm2015/listen-options.model.js +28 -0
  374. package/component-loader/esm2015/ngx-bootstrap-component-loader.js +10 -0
  375. package/component-loader/esm2015/public_api.js +10 -0
  376. package/component-loader/esm5/bs-component-ref.class.js +27 -0
  377. package/component-loader/esm5/component-loader.class.js +468 -0
  378. package/component-loader/esm5/component-loader.factory.js +75 -0
  379. package/component-loader/esm5/content-ref.class.js +31 -0
  380. package/component-loader/esm5/listen-options.model.js +28 -0
  381. package/component-loader/esm5/ngx-bootstrap-component-loader.js +10 -0
  382. package/component-loader/esm5/public_api.js +10 -0
  383. package/component-loader/fesm2015/ngx-bootstrap-component-loader.js +426 -0
  384. package/component-loader/fesm2015/ngx-bootstrap-component-loader.js.map +1 -0
  385. package/component-loader/fesm5/ngx-bootstrap-component-loader.js +498 -0
  386. package/component-loader/fesm5/ngx-bootstrap-component-loader.js.map +1 -0
  387. package/component-loader/listen-options.model.d.ts +1 -0
  388. package/component-loader/ngx-bootstrap-component-loader.d.ts +4 -0
  389. package/component-loader/ngx-bootstrap-component-loader.metadata.json +1 -0
  390. package/component-loader/package.json +19 -0
  391. package/component-loader/public_api.d.ts +4 -0
  392. package/datepicker/base/bs-datepicker-container.d.ts +3 -1
  393. package/datepicker/bs-datepicker-input.directive.d.ts +3 -3
  394. package/datepicker/bs-datepicker.component.d.ts +13 -3
  395. package/datepicker/bs-datepicker.config.d.ts +14 -1
  396. package/datepicker/bs-datepicker.css +14 -5
  397. package/datepicker/bs-datepicker.css.map +2 -2
  398. package/datepicker/bs-datepicker.module.d.ts +0 -1
  399. package/datepicker/bs-datepicker.scss +23 -10
  400. package/datepicker/bs-daterangepicker-input.directive.d.ts +3 -3
  401. package/datepicker/bs-daterangepicker.component.d.ts +4 -3
  402. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.js +4334 -0
  403. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.js.map +1 -0
  404. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.min.js +2 -0
  405. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.min.js.map +1 -0
  406. package/datepicker/datepicker.component.d.ts +5 -5
  407. package/datepicker/engine/calc-days-calendar.d.ts +1 -1
  408. package/datepicker/engine/flag-days-calendar.d.ts +2 -1
  409. package/datepicker/engine/flag-months-calendar.d.ts +1 -1
  410. package/datepicker/engine/flag-years-calendar.d.ts +1 -1
  411. package/datepicker/engine/format-days-calendar.d.ts +1 -1
  412. package/datepicker/engine/format-months-calendar.d.ts +1 -1
  413. package/datepicker/engine/format-years-calendar.d.ts +1 -1
  414. package/datepicker/engine/view-mode.d.ts +2 -2
  415. package/datepicker/esm2015/base/bs-datepicker-container.js +109 -0
  416. package/datepicker/esm2015/bs-datepicker-input.directive.js +208 -0
  417. package/datepicker/esm2015/bs-datepicker.component.js +307 -0
  418. package/datepicker/esm2015/bs-datepicker.config.js +117 -0
  419. package/datepicker/esm2015/bs-datepicker.module.js +90 -0
  420. package/datepicker/esm2015/bs-daterangepicker-input.directive.js +224 -0
  421. package/datepicker/esm2015/bs-daterangepicker.component.js +293 -0
  422. package/datepicker/esm2015/bs-daterangepicker.config.js +29 -0
  423. package/datepicker/esm2015/bs-locale.service.js +61 -0
  424. package/datepicker/esm2015/date-formatter.js +18 -0
  425. package/datepicker/esm2015/datepicker-inner.component.js +451 -0
  426. package/datepicker/esm2015/datepicker.component.js +326 -0
  427. package/datepicker/esm2015/datepicker.config.js +74 -0
  428. package/datepicker/esm2015/datepicker.module.js +52 -0
  429. package/datepicker/esm2015/daypicker.component.js +212 -0
  430. package/datepicker/esm2015/engine/calc-days-calendar.js +29 -0
  431. package/datepicker/esm2015/engine/flag-days-calendar.js +115 -0
  432. package/datepicker/esm2015/engine/flag-months-calendar.js +57 -0
  433. package/datepicker/esm2015/engine/flag-years-calendar.js +56 -0
  434. package/datepicker/esm2015/engine/format-days-calendar.js +50 -0
  435. package/datepicker/esm2015/engine/format-months-calendar.js +29 -0
  436. package/datepicker/esm2015/engine/format-years-calendar.js +42 -0
  437. package/datepicker/esm2015/engine/view-mode.js +14 -0
  438. package/datepicker/esm2015/models/index.js +199 -0
  439. package/datepicker/esm2015/monthpicker.component.js +118 -0
  440. package/datepicker/esm2015/ngx-bootstrap-datepicker.js +29 -0
  441. package/datepicker/esm2015/public_api.js +19 -0
  442. package/datepicker/esm2015/reducer/_defaults.js +10 -0
  443. package/datepicker/esm2015/reducer/bs-datepicker.actions.js +204 -0
  444. package/datepicker/esm2015/reducer/bs-datepicker.effects.js +249 -0
  445. package/datepicker/esm2015/reducer/bs-datepicker.reducer.js +289 -0
  446. package/datepicker/esm2015/reducer/bs-datepicker.state.js +87 -0
  447. package/datepicker/esm2015/reducer/bs-datepicker.store.js +34 -0
  448. package/datepicker/esm2015/themes/bs/bs-calendar-layout.component.js +39 -0
  449. package/datepicker/esm2015/themes/bs/bs-current-date-view.component.js +32 -0
  450. package/datepicker/esm2015/themes/bs/bs-custom-dates-view.component.js +51 -0
  451. package/datepicker/esm2015/themes/bs/bs-datepicker-container.component.js +113 -0
  452. package/datepicker/esm2015/themes/bs/bs-datepicker-day-decorator.directive.js +73 -0
  453. package/datepicker/esm2015/themes/bs/bs-datepicker-navigation-view.component.js +88 -0
  454. package/datepicker/esm2015/themes/bs/bs-daterangepicker-container.component.js +133 -0
  455. package/datepicker/esm2015/themes/bs/bs-days-calendar-view.component.js +134 -0
  456. package/datepicker/esm2015/themes/bs/bs-months-calendar-view.component.js +104 -0
  457. package/datepicker/esm2015/themes/bs/bs-timepicker-view.component.js +53 -0
  458. package/datepicker/esm2015/themes/bs/bs-years-calendar-view.component.js +105 -0
  459. package/datepicker/esm2015/utils/bs-calendar-utils.js +54 -0
  460. package/datepicker/esm2015/utils/matrix-utils.js +39 -0
  461. package/datepicker/esm2015/yearpicker.component.js +122 -0
  462. package/datepicker/esm5/base/bs-datepicker-container.js +170 -0
  463. package/datepicker/esm5/bs-datepicker-input.directive.js +242 -0
  464. package/datepicker/esm5/bs-datepicker.component.js +368 -0
  465. package/datepicker/esm5/bs-datepicker.config.js +119 -0
  466. package/datepicker/esm5/bs-datepicker.module.js +97 -0
  467. package/datepicker/esm5/bs-daterangepicker-input.directive.js +263 -0
  468. package/datepicker/esm5/bs-daterangepicker.component.js +354 -0
  469. package/datepicker/esm5/bs-daterangepicker.config.js +34 -0
  470. package/datepicker/esm5/bs-locale.service.js +79 -0
  471. package/datepicker/esm5/date-formatter.js +28 -0
  472. package/datepicker/esm5/datepicker-inner.component.js +547 -0
  473. package/datepicker/esm5/datepicker.component.js +325 -0
  474. package/datepicker/esm5/datepicker.config.js +76 -0
  475. package/datepicker/esm5/datepicker.module.js +59 -0
  476. package/datepicker/esm5/daypicker.component.js +157 -0
  477. package/datepicker/esm5/engine/calc-days-calendar.js +29 -0
  478. package/datepicker/esm5/engine/flag-days-calendar.js +115 -0
  479. package/datepicker/esm5/engine/flag-months-calendar.js +57 -0
  480. package/datepicker/esm5/engine/flag-years-calendar.js +56 -0
  481. package/datepicker/esm5/engine/format-days-calendar.js +55 -0
  482. package/datepicker/esm5/engine/format-months-calendar.js +31 -0
  483. package/datepicker/esm5/engine/format-years-calendar.js +44 -0
  484. package/datepicker/esm5/engine/view-mode.js +14 -0
  485. package/datepicker/esm5/models/index.js +199 -0
  486. package/datepicker/esm5/monthpicker.component.js +85 -0
  487. package/datepicker/esm5/ngx-bootstrap-datepicker.js +29 -0
  488. package/datepicker/esm5/public_api.js +19 -0
  489. package/datepicker/esm5/reducer/_defaults.js +10 -0
  490. package/datepicker/esm5/reducer/bs-datepicker.actions.js +266 -0
  491. package/datepicker/esm5/reducer/bs-datepicker.effects.js +314 -0
  492. package/datepicker/esm5/reducer/bs-datepicker.reducer.js +298 -0
  493. package/datepicker/esm5/reducer/bs-datepicker.state.js +91 -0
  494. package/datepicker/esm5/reducer/bs-datepicker.store.js +40 -0
  495. package/datepicker/esm5/themes/bs/bs-calendar-layout.component.js +28 -0
  496. package/datepicker/esm5/themes/bs/bs-current-date-view.component.js +36 -0
  497. package/datepicker/esm5/themes/bs/bs-custom-dates-view.component.js +50 -0
  498. package/datepicker/esm5/themes/bs/bs-datepicker-container.component.js +138 -0
  499. package/datepicker/esm5/themes/bs/bs-datepicker-day-decorator.directive.js +73 -0
  500. package/datepicker/esm5/themes/bs/bs-datepicker-navigation-view.component.js +68 -0
  501. package/datepicker/esm5/themes/bs/bs-daterangepicker-container.component.js +158 -0
  502. package/datepicker/esm5/themes/bs/bs-days-calendar-view.component.js +114 -0
  503. package/datepicker/esm5/themes/bs/bs-months-calendar-view.component.js +100 -0
  504. package/datepicker/esm5/themes/bs/bs-timepicker-view.component.js +37 -0
  505. package/datepicker/esm5/themes/bs/bs-years-calendar-view.component.js +101 -0
  506. package/datepicker/esm5/utils/bs-calendar-utils.js +54 -0
  507. package/datepicker/esm5/utils/matrix-utils.js +39 -0
  508. package/datepicker/esm5/yearpicker.component.js +92 -0
  509. package/datepicker/fesm2015/ngx-bootstrap-datepicker.js +3827 -0
  510. package/datepicker/fesm2015/ngx-bootstrap-datepicker.js.map +1 -0
  511. package/datepicker/fesm5/ngx-bootstrap-datepicker.js +4198 -0
  512. package/datepicker/fesm5/ngx-bootstrap-datepicker.js.map +1 -0
  513. package/datepicker/models/index.d.ts +3 -1
  514. package/datepicker/ngx-bootstrap-datepicker.d.ts +23 -0
  515. package/datepicker/ngx-bootstrap-datepicker.metadata.json +1 -0
  516. package/datepicker/package.json +19 -0
  517. package/datepicker/public_api.d.ts +14 -0
  518. package/datepicker/reducer/_defaults.d.ts +1 -1
  519. package/datepicker/reducer/bs-datepicker.actions.d.ts +5 -3
  520. package/datepicker/reducer/bs-datepicker.effects.d.ts +3 -2
  521. package/datepicker/reducer/bs-datepicker.reducer.d.ts +1 -1
  522. package/datepicker/reducer/bs-datepicker.state.d.ts +4 -1
  523. package/datepicker/reducer/bs-datepicker.store.d.ts +1 -1
  524. package/datepicker/themes/bs/bs-datepicker-container.component.d.ts +1 -1
  525. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.d.ts +9 -2
  526. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.d.ts +1 -1
  527. package/datepicker/themes/bs/bs-daterangepicker-container.component.d.ts +1 -1
  528. package/datepicker/themes/bs/bs-days-calendar-view.component.d.ts +4 -1
  529. package/datepicker/themes/bs/bs-months-calendar-view.component.d.ts +1 -1
  530. package/datepicker/themes/bs/bs-years-calendar-view.component.d.ts +1 -1
  531. package/datepicker/utils/matrix-utils.d.ts +1 -1
  532. package/dropdown/bs-dropdown-container.component.d.ts +3 -0
  533. package/dropdown/bs-dropdown-toggle.directive.d.ts +4 -2
  534. package/dropdown/bs-dropdown.config.d.ts +2 -0
  535. package/dropdown/bs-dropdown.directive.d.ts +12 -6
  536. package/dropdown/bs-dropdown.state.d.ts +2 -1
  537. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.js +793 -0
  538. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.js.map +1 -0
  539. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.min.js +2 -0
  540. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.min.js.map +1 -0
  541. package/dropdown/esm2015/bs-dropdown-container.component.js +104 -0
  542. package/dropdown/esm2015/bs-dropdown-menu.directive.js +42 -0
  543. package/dropdown/esm2015/bs-dropdown-toggle.directive.js +109 -0
  544. package/dropdown/esm2015/bs-dropdown.config.js +44 -0
  545. package/dropdown/esm2015/bs-dropdown.directive.js +408 -0
  546. package/dropdown/esm2015/bs-dropdown.module.js +60 -0
  547. package/dropdown/esm2015/bs-dropdown.state.js +51 -0
  548. package/dropdown/esm2015/index.js +7 -0
  549. package/dropdown/esm2015/ngx-bootstrap-dropdown.js +10 -0
  550. package/dropdown/esm2015/public_api.js +13 -0
  551. package/dropdown/esm5/bs-dropdown-container.component.js +109 -0
  552. package/dropdown/esm5/bs-dropdown-menu.directive.js +40 -0
  553. package/dropdown/esm5/bs-dropdown-toggle.directive.js +132 -0
  554. package/dropdown/esm5/bs-dropdown.config.js +46 -0
  555. package/dropdown/esm5/bs-dropdown.directive.js +501 -0
  556. package/dropdown/esm5/bs-dropdown.module.js +69 -0
  557. package/dropdown/esm5/bs-dropdown.state.js +54 -0
  558. package/dropdown/esm5/index.js +7 -0
  559. package/dropdown/esm5/ngx-bootstrap-dropdown.js +10 -0
  560. package/dropdown/esm5/public_api.js +13 -0
  561. package/dropdown/fesm2015/ngx-bootstrap-dropdown.js +623 -0
  562. package/dropdown/fesm2015/ngx-bootstrap-dropdown.js.map +1 -0
  563. package/dropdown/fesm5/ngx-bootstrap-dropdown.js +748 -0
  564. package/dropdown/fesm5/ngx-bootstrap-dropdown.js.map +1 -0
  565. package/dropdown/index.d.ts +1 -7
  566. package/dropdown/ngx-bootstrap-dropdown.d.ts +4 -0
  567. package/dropdown/ngx-bootstrap-dropdown.metadata.json +1 -0
  568. package/dropdown/package.json +19 -0
  569. package/dropdown/public_api.d.ts +7 -0
  570. package/esm2015/ngx-bootstrap.js +10 -0
  571. package/esm2015/public_api.js +31 -0
  572. package/esm5/ngx-bootstrap.js +10 -0
  573. package/esm5/public_api.js +31 -0
  574. package/fesm2015/ngx-bootstrap.js +35 -0
  575. package/fesm2015/ngx-bootstrap.js.map +1 -0
  576. package/fesm5/ngx-bootstrap.js +35 -0
  577. package/fesm5/ngx-bootstrap.js.map +1 -0
  578. package/locale/bundles/ngx-bootstrap-locale.umd.js +56 -0
  579. package/locale/bundles/ngx-bootstrap-locale.umd.js.map +1 -0
  580. package/locale/bundles/ngx-bootstrap-locale.umd.min.js +2 -0
  581. package/locale/bundles/ngx-bootstrap-locale.umd.min.js.map +1 -0
  582. package/locale/esm2015/ngx-bootstrap-locale.js +10 -0
  583. package/locale/esm2015/public_api.js +40 -0
  584. package/locale/esm5/ngx-bootstrap-locale.js +10 -0
  585. package/locale/esm5/public_api.js +40 -0
  586. package/locale/fesm2015/ngx-bootstrap-locale.js +13 -0
  587. package/locale/fesm2015/ngx-bootstrap-locale.js.map +1 -0
  588. package/locale/fesm5/ngx-bootstrap-locale.js +13 -0
  589. package/locale/fesm5/ngx-bootstrap-locale.js.map +1 -0
  590. package/locale/ngx-bootstrap-locale.d.ts +4 -0
  591. package/locale/ngx-bootstrap-locale.metadata.json +1 -0
  592. package/locale/package.json +19 -0
  593. package/locale/public_api.d.ts +34 -0
  594. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.js +178 -0
  595. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.js.map +1 -0
  596. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.min.js +2 -0
  597. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.min.js.map +1 -0
  598. package/mini-ngrx/esm2015/index.js +7 -0
  599. package/mini-ngrx/esm2015/ngx-bootstrap-mini-ngrx.js +10 -0
  600. package/mini-ngrx/esm2015/public_api.js +18 -0
  601. package/mini-ngrx/esm2015/state.class.js +29 -0
  602. package/mini-ngrx/esm2015/store.class.js +81 -0
  603. package/mini-ngrx/esm5/index.js +7 -0
  604. package/mini-ngrx/esm5/ngx-bootstrap-mini-ngrx.js +10 -0
  605. package/mini-ngrx/esm5/public_api.js +18 -0
  606. package/mini-ngrx/esm5/state.class.js +35 -0
  607. package/mini-ngrx/esm5/store.class.js +114 -0
  608. package/mini-ngrx/fesm2015/ngx-bootstrap-mini-ngrx.js +114 -0
  609. package/mini-ngrx/fesm2015/ngx-bootstrap-mini-ngrx.js.map +1 -0
  610. package/mini-ngrx/fesm5/ngx-bootstrap-mini-ngrx.js +144 -0
  611. package/mini-ngrx/fesm5/ngx-bootstrap-mini-ngrx.js.map +1 -0
  612. package/mini-ngrx/index.d.ts +1 -7
  613. package/mini-ngrx/ngx-bootstrap-mini-ngrx.d.ts +4 -0
  614. package/mini-ngrx/ngx-bootstrap-mini-ngrx.metadata.json +1 -0
  615. package/mini-ngrx/package.json +19 -0
  616. package/mini-ngrx/public_api.d.ts +7 -0
  617. package/modal/bs-modal-ref.service.d.ts +4 -0
  618. package/modal/bs-modal.service.d.ts +5 -1
  619. package/modal/bundles/ngx-bootstrap-modal.umd.js +1156 -0
  620. package/modal/bundles/ngx-bootstrap-modal.umd.js.map +1 -0
  621. package/modal/bundles/ngx-bootstrap-modal.umd.min.js +2 -0
  622. package/modal/bundles/ngx-bootstrap-modal.umd.min.js.map +1 -0
  623. package/modal/esm2015/bs-modal-ref.service.js +46 -0
  624. package/modal/esm2015/bs-modal.service.js +267 -0
  625. package/modal/esm2015/modal-backdrop.component.js +103 -0
  626. package/modal/esm2015/modal-backdrop.options.js +19 -0
  627. package/modal/esm2015/modal-container.component.js +160 -0
  628. package/modal/esm2015/modal-options.class.js +92 -0
  629. package/modal/esm2015/modal.directive.js +459 -0
  630. package/modal/esm2015/modal.module.js +44 -0
  631. package/modal/esm2015/models/index.js +58 -0
  632. package/modal/esm2015/ngx-bootstrap-modal.js +11 -0
  633. package/modal/esm2015/public_api.js +14 -0
  634. package/modal/esm5/bs-modal-ref.service.js +48 -0
  635. package/modal/esm5/bs-modal.service.js +333 -0
  636. package/modal/esm5/modal-backdrop.component.js +112 -0
  637. package/modal/esm5/modal-backdrop.options.js +18 -0
  638. package/modal/esm5/modal-container.component.js +170 -0
  639. package/modal/esm5/modal-options.class.js +96 -0
  640. package/modal/esm5/modal.directive.js +580 -0
  641. package/modal/esm5/modal.module.js +51 -0
  642. package/modal/esm5/models/index.js +58 -0
  643. package/modal/esm5/ngx-bootstrap-modal.js +11 -0
  644. package/modal/esm5/public_api.js +14 -0
  645. package/modal/fesm2015/ngx-bootstrap-modal.js +932 -0
  646. package/modal/fesm2015/ngx-bootstrap-modal.js.map +1 -0
  647. package/modal/fesm5/ngx-bootstrap-modal.js +1142 -0
  648. package/modal/fesm5/ngx-bootstrap-modal.js.map +1 -0
  649. package/modal/modal-container.component.d.ts +2 -2
  650. package/modal/modal-options.class.d.ts +5 -7
  651. package/modal/modal.directive.d.ts +25 -7
  652. package/modal/models/index.d.ts +22 -0
  653. package/modal/ngx-bootstrap-modal.d.ts +5 -0
  654. package/modal/ngx-bootstrap-modal.metadata.json +1 -0
  655. package/modal/package.json +19 -0
  656. package/modal/{index.d.ts → public_api.d.ts} +0 -0
  657. package/ngx-bootstrap.d.ts +4 -0
  658. package/ngx-bootstrap.metadata.json +1 -0
  659. package/package.json +30 -29
  660. package/pagination/bundles/ngx-bootstrap-pagination.umd.js +815 -0
  661. package/pagination/bundles/ngx-bootstrap-pagination.umd.js.map +1 -0
  662. package/pagination/bundles/ngx-bootstrap-pagination.umd.min.js +2 -0
  663. package/pagination/bundles/ngx-bootstrap-pagination.umd.min.js.map +1 -0
  664. package/pagination/esm2015/models/index.js +62 -0
  665. package/pagination/esm2015/ngx-bootstrap-pagination.js +12 -0
  666. package/pagination/esm2015/pager.component.js +412 -0
  667. package/pagination/esm2015/pagination.component.js +422 -0
  668. package/pagination/esm2015/pagination.config.js +49 -0
  669. package/pagination/esm2015/pagination.module.js +35 -0
  670. package/pagination/esm2015/public_api.js +10 -0
  671. package/pagination/esm5/models/index.js +62 -0
  672. package/pagination/esm5/ngx-bootstrap-pagination.js +12 -0
  673. package/pagination/esm5/pager.component.js +475 -0
  674. package/pagination/esm5/pagination.component.js +485 -0
  675. package/pagination/esm5/pagination.config.js +51 -0
  676. package/pagination/esm5/pagination.module.js +42 -0
  677. package/pagination/esm5/public_api.js +10 -0
  678. package/pagination/fesm2015/ngx-bootstrap-pagination.js +685 -0
  679. package/pagination/fesm2015/ngx-bootstrap-pagination.js.map +1 -0
  680. package/pagination/fesm5/ngx-bootstrap-pagination.js +816 -0
  681. package/pagination/fesm5/ngx-bootstrap-pagination.js.map +1 -0
  682. package/pagination/models/index.d.ts +25 -0
  683. package/pagination/ngx-bootstrap-pagination.d.ts +6 -0
  684. package/pagination/ngx-bootstrap-pagination.metadata.json +1 -0
  685. package/pagination/package.json +19 -0
  686. package/pagination/pager.component.d.ts +11 -11
  687. package/pagination/pagination.component.d.ts +12 -12
  688. package/pagination/pagination.config.d.ts +3 -2
  689. package/pagination/{index.d.ts → public_api.d.ts} +0 -0
  690. package/popover/bundles/ngx-bootstrap-popover.umd.js +317 -0
  691. package/popover/bundles/ngx-bootstrap-popover.umd.js.map +1 -0
  692. package/popover/bundles/ngx-bootstrap-popover.umd.min.js +2 -0
  693. package/popover/bundles/ngx-bootstrap-popover.umd.min.js.map +1 -0
  694. package/popover/esm2015/ngx-bootstrap-popover.js +10 -0
  695. package/popover/esm2015/popover-container.component.js +72 -0
  696. package/popover/esm2015/popover.config.js +58 -0
  697. package/popover/esm2015/popover.directive.js +227 -0
  698. package/popover/esm2015/popover.module.js +41 -0
  699. package/popover/esm2015/public_api.js +10 -0
  700. package/popover/esm5/ngx-bootstrap-popover.js +10 -0
  701. package/popover/esm5/popover-container.component.js +66 -0
  702. package/popover/esm5/popover.config.js +60 -0
  703. package/popover/esm5/popover.directive.js +260 -0
  704. package/popover/esm5/popover.module.js +48 -0
  705. package/popover/esm5/public_api.js +10 -0
  706. package/popover/fesm2015/ngx-bootstrap-popover.js +277 -0
  707. package/popover/fesm2015/ngx-bootstrap-popover.js.map +1 -0
  708. package/popover/fesm5/ngx-bootstrap-popover.js +309 -0
  709. package/popover/fesm5/ngx-bootstrap-popover.js.map +1 -0
  710. package/popover/ngx-bootstrap-popover.d.ts +4 -0
  711. package/popover/ngx-bootstrap-popover.metadata.json +1 -0
  712. package/popover/package.json +19 -0
  713. package/popover/popover.directive.d.ts +3 -3
  714. package/popover/{index.d.ts → public_api.d.ts} +0 -0
  715. package/positioning/bundles/ngx-bootstrap-positioning.umd.js +366 -0
  716. package/positioning/bundles/ngx-bootstrap-positioning.umd.js.map +1 -0
  717. package/positioning/bundles/ngx-bootstrap-positioning.umd.min.js +2 -0
  718. package/positioning/bundles/ngx-bootstrap-positioning.umd.min.js.map +1 -0
  719. package/positioning/esm2015/ng-positioning.js +253 -0
  720. package/positioning/esm2015/ngx-bootstrap-positioning.js +10 -0
  721. package/positioning/esm2015/positioning.service.js +91 -0
  722. package/positioning/esm2015/public_api.js +8 -0
  723. package/positioning/esm5/ng-positioning.js +300 -0
  724. package/positioning/esm5/ngx-bootstrap-positioning.js +10 -0
  725. package/positioning/esm5/positioning.service.js +99 -0
  726. package/positioning/esm5/public_api.js +8 -0
  727. package/positioning/fesm2015/ngx-bootstrap-positioning.js +299 -0
  728. package/positioning/fesm2015/ngx-bootstrap-positioning.js.map +1 -0
  729. package/positioning/fesm5/ngx-bootstrap-positioning.js +352 -0
  730. package/positioning/fesm5/ngx-bootstrap-positioning.js.map +1 -0
  731. package/positioning/ngx-bootstrap-positioning.d.ts +4 -0
  732. package/positioning/ngx-bootstrap-positioning.metadata.json +1 -0
  733. package/positioning/package.json +19 -0
  734. package/positioning/{index.d.ts → public_api.d.ts} +0 -0
  735. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.js +319 -0
  736. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.js.map +1 -0
  737. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.min.js +2 -0
  738. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.min.js.map +1 -0
  739. package/progressbar/esm2015/bar.component.js +129 -0
  740. package/progressbar/esm2015/ngx-bootstrap-progressbar.js +10 -0
  741. package/progressbar/esm2015/progressbar.component.js +148 -0
  742. package/progressbar/esm2015/progressbar.config.js +41 -0
  743. package/progressbar/esm2015/progressbar.module.js +35 -0
  744. package/progressbar/esm2015/public_api.js +10 -0
  745. package/progressbar/esm5/bar.component.js +149 -0
  746. package/progressbar/esm5/ngx-bootstrap-progressbar.js +10 -0
  747. package/progressbar/esm5/progressbar.component.js +170 -0
  748. package/progressbar/esm5/progressbar.config.js +43 -0
  749. package/progressbar/esm5/progressbar.module.js +42 -0
  750. package/progressbar/esm5/public_api.js +10 -0
  751. package/progressbar/fesm2015/ngx-bootstrap-progressbar.js +268 -0
  752. package/progressbar/fesm2015/ngx-bootstrap-progressbar.js.map +1 -0
  753. package/progressbar/fesm5/ngx-bootstrap-progressbar.js +315 -0
  754. package/progressbar/fesm5/ngx-bootstrap-progressbar.js.map +1 -0
  755. package/progressbar/ngx-bootstrap-progressbar.d.ts +4 -0
  756. package/progressbar/ngx-bootstrap-progressbar.metadata.json +1 -0
  757. package/progressbar/package.json +19 -0
  758. package/progressbar/progressbar.component.d.ts +4 -2
  759. package/progressbar/{index.d.ts → public_api.d.ts} +0 -0
  760. package/public_api.d.ts +25 -0
  761. package/rating/bundles/ngx-bootstrap-rating.umd.js +243 -0
  762. package/rating/bundles/ngx-bootstrap-rating.umd.js.map +1 -0
  763. package/rating/bundles/ngx-bootstrap-rating.umd.min.js +2 -0
  764. package/rating/bundles/ngx-bootstrap-rating.umd.min.js.map +1 -0
  765. package/rating/esm2015/models/index.js +28 -0
  766. package/rating/esm2015/ngx-bootstrap-rating.js +11 -0
  767. package/rating/esm2015/public_api.js +8 -0
  768. package/rating/esm2015/rating.component.js +210 -0
  769. package/rating/esm2015/rating.module.js +36 -0
  770. package/rating/esm5/models/index.js +28 -0
  771. package/rating/esm5/ngx-bootstrap-rating.js +11 -0
  772. package/rating/esm5/public_api.js +8 -0
  773. package/rating/esm5/rating.component.js +244 -0
  774. package/rating/esm5/rating.module.js +43 -0
  775. package/rating/fesm2015/ngx-bootstrap-rating.js +194 -0
  776. package/rating/fesm2015/ngx-bootstrap-rating.js.map +1 -0
  777. package/rating/fesm5/ngx-bootstrap-rating.js +233 -0
  778. package/rating/fesm5/ngx-bootstrap-rating.js.map +1 -0
  779. package/rating/models/index.d.ts +9 -0
  780. package/rating/ngx-bootstrap-rating.d.ts +5 -0
  781. package/rating/ngx-bootstrap-rating.metadata.json +1 -0
  782. package/rating/package.json +19 -0
  783. package/rating/{index.d.ts → public_api.d.ts} +0 -0
  784. package/rating/rating.component.d.ts +6 -5
  785. package/schematics/collection.json +10 -0
  786. package/schematics/ng-add/index.js +98 -0
  787. package/schematics/ng-add/index.js.map +1 -0
  788. package/schematics/ng-add/index.spec.js +37 -0
  789. package/schematics/ng-add/index.spec.js.map +1 -0
  790. package/schematics/ng-add/schema.js +10 -0
  791. package/schematics/ng-add/schema.js.map +1 -0
  792. package/schematics/ng-add/schema.json +16 -0
  793. package/schematics/utils/index.js +135 -0
  794. package/schematics/utils/index.js.map +1 -0
  795. package/schematics/utils/ng-module-imports.js +69 -0
  796. package/schematics/utils/ng-module-imports.js.map +1 -0
  797. package/schematics/utils/project-main-file.js +22 -0
  798. package/schematics/utils/project-main-file.js.map +1 -0
  799. package/schematics/utils/project-targets.js +25 -0
  800. package/schematics/utils/project-targets.js.map +1 -0
  801. package/sortable/bundles/ngx-bootstrap-sortable.umd.js +464 -0
  802. package/sortable/bundles/ngx-bootstrap-sortable.umd.js.map +1 -0
  803. package/sortable/bundles/ngx-bootstrap-sortable.umd.min.js +2 -0
  804. package/sortable/bundles/ngx-bootstrap-sortable.umd.min.js.map +1 -0
  805. package/sortable/esm2015/draggable-item.js +24 -0
  806. package/sortable/esm2015/draggable-item.service.js +65 -0
  807. package/sortable/esm2015/ngx-bootstrap-sortable.js +10 -0
  808. package/sortable/esm2015/public_api.js +9 -0
  809. package/sortable/esm2015/sortable.component.js +382 -0
  810. package/sortable/esm2015/sortable.module.js +34 -0
  811. package/sortable/esm5/draggable-item.js +24 -0
  812. package/sortable/esm5/draggable-item.service.js +82 -0
  813. package/sortable/esm5/ngx-bootstrap-sortable.js +10 -0
  814. package/sortable/esm5/public_api.js +9 -0
  815. package/sortable/esm5/sortable.component.js +398 -0
  816. package/sortable/esm5/sortable.module.js +41 -0
  817. package/sortable/fesm2015/ngx-bootstrap-sortable.js +377 -0
  818. package/sortable/fesm2015/ngx-bootstrap-sortable.js.map +1 -0
  819. package/sortable/fesm5/ngx-bootstrap-sortable.js +414 -0
  820. package/sortable/fesm5/ngx-bootstrap-sortable.js.map +1 -0
  821. package/sortable/ngx-bootstrap-sortable.d.ts +4 -0
  822. package/sortable/ngx-bootstrap-sortable.metadata.json +1 -0
  823. package/sortable/package.json +19 -0
  824. package/sortable/{index.d.ts → public_api.d.ts} +0 -0
  825. package/sortable/sortable.component.d.ts +1 -1
  826. package/tabs/bundles/ngx-bootstrap-tabs.umd.js +481 -0
  827. package/tabs/bundles/ngx-bootstrap-tabs.umd.js.map +1 -0
  828. package/tabs/bundles/ngx-bootstrap-tabs.umd.min.js +2 -0
  829. package/tabs/bundles/ngx-bootstrap-tabs.umd.min.js.map +1 -0
  830. package/tabs/esm2015/ng-transclude.directive.js +61 -0
  831. package/tabs/esm2015/ngx-bootstrap-tabs.js +10 -0
  832. package/tabs/esm2015/public_api.js +12 -0
  833. package/tabs/esm2015/tab-heading.directive.js +39 -0
  834. package/tabs/esm2015/tab.directive.js +181 -0
  835. package/tabs/esm2015/tabs.module.js +50 -0
  836. package/tabs/esm2015/tabset.component.js +195 -0
  837. package/tabs/esm2015/tabset.config.js +32 -0
  838. package/tabs/esm5/ng-transclude.directive.js +65 -0
  839. package/tabs/esm5/ngx-bootstrap-tabs.js +10 -0
  840. package/tabs/esm5/public_api.js +12 -0
  841. package/tabs/esm5/tab-heading.directive.js +38 -0
  842. package/tabs/esm5/tab.directive.js +194 -0
  843. package/tabs/esm5/tabs.module.js +57 -0
  844. package/tabs/esm5/tabset.component.js +231 -0
  845. package/tabs/esm5/tabset.config.js +34 -0
  846. package/tabs/fesm2015/ngx-bootstrap-tabs.js +415 -0
  847. package/tabs/fesm2015/ngx-bootstrap-tabs.js.map +1 -0
  848. package/tabs/fesm5/ngx-bootstrap-tabs.js +470 -0
  849. package/tabs/fesm5/ngx-bootstrap-tabs.js.map +1 -0
  850. package/tabs/ngx-bootstrap-tabs.d.ts +4 -0
  851. package/tabs/ngx-bootstrap-tabs.metadata.json +1 -0
  852. package/tabs/package.json +19 -0
  853. package/tabs/{index.d.ts → public_api.d.ts} +0 -0
  854. package/tabs/tabset.component.d.ts +3 -1
  855. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.js +1183 -0
  856. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.js.map +1 -0
  857. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.min.js +2 -0
  858. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.min.js.map +1 -0
  859. package/timepicker/esm2015/models/index.js +18 -0
  860. package/timepicker/esm2015/ngx-bootstrap-timepicker.js +11 -0
  861. package/timepicker/esm2015/public_api.js +11 -0
  862. package/timepicker/esm2015/reducer/timepicker.actions.js +99 -0
  863. package/timepicker/esm2015/reducer/timepicker.reducer.js +103 -0
  864. package/timepicker/esm2015/reducer/timepicker.store.js +33 -0
  865. package/timepicker/esm2015/timepicker-controls.util.js +156 -0
  866. package/timepicker/esm2015/timepicker.component.js +480 -0
  867. package/timepicker/esm2015/timepicker.config.js +144 -0
  868. package/timepicker/esm2015/timepicker.models.js +82 -0
  869. package/timepicker/esm2015/timepicker.module.js +39 -0
  870. package/timepicker/esm2015/timepicker.utils.js +224 -0
  871. package/timepicker/esm5/models/index.js +18 -0
  872. package/timepicker/esm5/ngx-bootstrap-timepicker.js +11 -0
  873. package/timepicker/esm5/public_api.js +11 -0
  874. package/timepicker/esm5/reducer/timepicker.actions.js +127 -0
  875. package/timepicker/esm5/reducer/timepicker.reducer.js +108 -0
  876. package/timepicker/esm5/reducer/timepicker.store.js +39 -0
  877. package/timepicker/esm5/timepicker-controls.util.js +156 -0
  878. package/timepicker/esm5/timepicker.component.js +564 -0
  879. package/timepicker/esm5/timepicker.config.js +146 -0
  880. package/timepicker/esm5/timepicker.models.js +82 -0
  881. package/timepicker/esm5/timepicker.module.js +46 -0
  882. package/timepicker/esm5/timepicker.utils.js +227 -0
  883. package/timepicker/fesm2015/ngx-bootstrap-timepicker.js +1006 -0
  884. package/timepicker/fesm2015/ngx-bootstrap-timepicker.js.map +1 -0
  885. package/timepicker/fesm5/ngx-bootstrap-timepicker.js +1132 -0
  886. package/timepicker/fesm5/ngx-bootstrap-timepicker.js.map +1 -0
  887. package/timepicker/models/index.d.ts +8 -0
  888. package/timepicker/ngx-bootstrap-timepicker.d.ts +5 -0
  889. package/timepicker/ngx-bootstrap-timepicker.metadata.json +1 -0
  890. package/timepicker/package.json +19 -0
  891. package/timepicker/{index.d.ts → public_api.d.ts} +0 -0
  892. package/timepicker/reducer/timepicker.actions.d.ts +1 -1
  893. package/timepicker/reducer/timepicker.reducer.d.ts +1 -1
  894. package/timepicker/reducer/timepicker.store.d.ts +1 -1
  895. package/timepicker/timepicker.component.d.ts +8 -7
  896. package/timepicker/timepicker.config.d.ts +1 -1
  897. package/timepicker/timepicker.utils.d.ts +1 -1
  898. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.js +546 -0
  899. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.js.map +1 -0
  900. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.min.js +2 -0
  901. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.min.js.map +1 -0
  902. package/tooltip/esm2015/ngx-bootstrap-tooltip.js +10 -0
  903. package/tooltip/esm2015/public_api.js +10 -0
  904. package/tooltip/esm2015/tooltip-container.component.js +92 -0
  905. package/tooltip/esm2015/tooltip.config.js +49 -0
  906. package/tooltip/esm2015/tooltip.directive.js +419 -0
  907. package/tooltip/esm2015/tooltip.module.js +41 -0
  908. package/tooltip/esm5/ngx-bootstrap-tooltip.js +10 -0
  909. package/tooltip/esm5/public_api.js +10 -0
  910. package/tooltip/esm5/tooltip-container.component.js +82 -0
  911. package/tooltip/esm5/tooltip.config.js +51 -0
  912. package/tooltip/esm5/tooltip.directive.js +490 -0
  913. package/tooltip/esm5/tooltip.module.js +48 -0
  914. package/tooltip/fesm2015/ngx-bootstrap-tooltip.js +456 -0
  915. package/tooltip/fesm2015/ngx-bootstrap-tooltip.js.map +1 -0
  916. package/tooltip/fesm5/ngx-bootstrap-tooltip.js +522 -0
  917. package/tooltip/fesm5/ngx-bootstrap-tooltip.js.map +1 -0
  918. package/tooltip/ngx-bootstrap-tooltip.d.ts +4 -0
  919. package/tooltip/ngx-bootstrap-tooltip.metadata.json +1 -0
  920. package/tooltip/package.json +19 -0
  921. package/tooltip/{index.d.ts → public_api.d.ts} +0 -0
  922. package/tooltip/tooltip-container.component.d.ts +4 -1
  923. package/tooltip/tooltip.directive.d.ts +10 -8
  924. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.js +2029 -0
  925. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.js.map +1 -0
  926. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.min.js +2 -0
  927. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.min.js.map +1 -0
  928. package/typeahead/esm2015/latin-map.js +833 -0
  929. package/typeahead/esm2015/ngx-bootstrap-typeahead.js +10 -0
  930. package/typeahead/esm2015/public_api.js +14 -0
  931. package/typeahead/esm2015/typeahead-container.component.js +336 -0
  932. package/typeahead/esm2015/typeahead-match.class.js +38 -0
  933. package/typeahead/esm2015/typeahead-options.class.js +22 -0
  934. package/typeahead/esm2015/typeahead-utils.js +80 -0
  935. package/typeahead/esm2015/typeahead.config.js +35 -0
  936. package/typeahead/esm2015/typeahead.directive.js +652 -0
  937. package/typeahead/esm2015/typeahead.module.js +41 -0
  938. package/typeahead/esm5/latin-map.js +833 -0
  939. package/typeahead/esm5/ngx-bootstrap-typeahead.js +10 -0
  940. package/typeahead/esm5/public_api.js +14 -0
  941. package/typeahead/esm5/typeahead-container.component.js +414 -0
  942. package/typeahead/esm5/typeahead-match.class.js +44 -0
  943. package/typeahead/esm5/typeahead-options.class.js +21 -0
  944. package/typeahead/esm5/typeahead-utils.js +94 -0
  945. package/typeahead/esm5/typeahead.config.js +37 -0
  946. package/typeahead/esm5/typeahead.directive.js +748 -0
  947. package/typeahead/esm5/typeahead.module.js +48 -0
  948. package/typeahead/fesm2015/ngx-bootstrap-typeahead.js +1780 -0
  949. package/typeahead/fesm2015/ngx-bootstrap-typeahead.js.map +1 -0
  950. package/typeahead/fesm5/ngx-bootstrap-typeahead.js +1975 -0
  951. package/typeahead/fesm5/ngx-bootstrap-typeahead.js.map +1 -0
  952. package/typeahead/ngx-bootstrap-typeahead.d.ts +4 -0
  953. package/typeahead/ngx-bootstrap-typeahead.metadata.json +1 -0
  954. package/typeahead/package.json +19 -0
  955. package/typeahead/public_api.d.ts +8 -0
  956. package/typeahead/typeahead-container.component.d.ts +2 -2
  957. package/typeahead/typeahead.config.d.ts +5 -0
  958. package/typeahead/typeahead.directive.d.ts +13 -10
  959. package/utils/bundles/ngx-bootstrap-utils.umd.js +792 -0
  960. package/utils/bundles/ngx-bootstrap-utils.umd.js.map +1 -0
  961. package/utils/bundles/ngx-bootstrap-utils.umd.min.js +10 -0
  962. package/utils/bundles/ngx-bootstrap-utils.umd.min.js.map +1 -0
  963. package/utils/esm2015/decorators.js +37 -0
  964. package/utils/esm2015/facade/browser.js +29 -0
  965. package/utils/esm2015/linked-list.class.js +324 -0
  966. package/utils/esm2015/ngx-bootstrap-utils.js +10 -0
  967. package/utils/esm2015/public_api.js +16 -0
  968. package/utils/esm2015/theme-provider.js +49 -0
  969. package/utils/esm2015/trigger.class.js +32 -0
  970. package/utils/esm2015/triggers.js +165 -0
  971. package/utils/esm2015/utils.class.js +31 -0
  972. package/utils/esm2015/warn-once.js +21 -0
  973. package/utils/esm5/decorators.js +39 -0
  974. package/utils/esm5/facade/browser.js +29 -0
  975. package/utils/esm5/linked-list.class.js +425 -0
  976. package/utils/esm5/ngx-bootstrap-utils.js +10 -0
  977. package/utils/esm5/public_api.js +16 -0
  978. package/utils/esm5/theme-provider.js +49 -0
  979. package/utils/esm5/trigger.class.js +33 -0
  980. package/utils/esm5/triggers.js +170 -0
  981. package/utils/esm5/utils.class.js +46 -0
  982. package/utils/esm5/warn-once.js +21 -0
  983. package/utils/facade/browser.d.ts +5 -5
  984. package/utils/fesm2015/ngx-bootstrap-utils.js +650 -0
  985. package/utils/fesm2015/ngx-bootstrap-utils.js.map +1 -0
  986. package/utils/fesm5/ngx-bootstrap-utils.js +768 -0
  987. package/utils/fesm5/ngx-bootstrap-utils.js.map +1 -0
  988. package/utils/ngx-bootstrap-utils.d.ts +4 -0
  989. package/utils/ngx-bootstrap-utils.metadata.json +1 -0
  990. package/utils/package.json +19 -0
  991. package/utils/public_api.d.ts +10 -0
  992. package/utils/triggers.d.ts +12 -1
  993. package/accordion/accordion-group.component.html +0 -19
  994. package/accordion/accordion-group.component.js +0 -82
  995. package/accordion/accordion-group.component.js.map +0 -1
  996. package/accordion/accordion-group.component.metadata.json +0 -1
  997. package/accordion/accordion-group.component.ngfactory.js.map +0 -1
  998. package/accordion/accordion.component.js +0 -50
  999. package/accordion/accordion.component.js.map +0 -1
  1000. package/accordion/accordion.component.metadata.json +0 -1
  1001. package/accordion/accordion.component.ngfactory.js.map +0 -1
  1002. package/accordion/accordion.config.js +0 -16
  1003. package/accordion/accordion.config.js.map +0 -1
  1004. package/accordion/accordion.config.metadata.json +0 -1
  1005. package/accordion/accordion.config.ngfactory.js.map +0 -1
  1006. package/accordion/accordion.module.js +0 -23
  1007. package/accordion/accordion.module.js.map +0 -1
  1008. package/accordion/accordion.module.metadata.json +0 -1
  1009. package/accordion/accordion.module.ngfactory.js.map +0 -1
  1010. package/accordion/index.js +0 -5
  1011. package/accordion/index.js.map +0 -1
  1012. package/accordion/index.metadata.json +0 -1
  1013. package/alert/alert.component.html +0 -11
  1014. package/alert/alert.component.js +0 -99
  1015. package/alert/alert.component.js.map +0 -1
  1016. package/alert/alert.component.metadata.json +0 -1
  1017. package/alert/alert.component.ngfactory.js.map +0 -1
  1018. package/alert/alert.config.js +0 -17
  1019. package/alert/alert.config.js.map +0 -1
  1020. package/alert/alert.config.metadata.json +0 -1
  1021. package/alert/alert.config.ngfactory.js.map +0 -1
  1022. package/alert/alert.module.js +0 -22
  1023. package/alert/alert.module.js.map +0 -1
  1024. package/alert/alert.module.metadata.json +0 -1
  1025. package/alert/alert.module.ngfactory.js.map +0 -1
  1026. package/alert/index.js +0 -4
  1027. package/alert/index.js.map +0 -1
  1028. package/alert/index.metadata.json +0 -1
  1029. package/buttons/button-checkbox.directive.js +0 -93
  1030. package/buttons/button-checkbox.directive.js.map +0 -1
  1031. package/buttons/button-checkbox.directive.metadata.json +0 -1
  1032. package/buttons/button-checkbox.directive.ngfactory.js.map +0 -1
  1033. package/buttons/button-radio-group.directive.js +0 -53
  1034. package/buttons/button-radio-group.directive.js.map +0 -1
  1035. package/buttons/button-radio-group.directive.metadata.json +0 -1
  1036. package/buttons/button-radio-group.directive.ngfactory.js.map +0 -1
  1037. package/buttons/button-radio.directive.js +0 -126
  1038. package/buttons/button-radio.directive.js.map +0 -1
  1039. package/buttons/button-radio.directive.metadata.json +0 -1
  1040. package/buttons/button-radio.directive.ngfactory.js.map +0 -1
  1041. package/buttons/buttons.module.js +0 -20
  1042. package/buttons/buttons.module.js.map +0 -1
  1043. package/buttons/buttons.module.metadata.json +0 -1
  1044. package/buttons/buttons.module.ngfactory.js.map +0 -1
  1045. package/buttons/index.js +0 -5
  1046. package/buttons/index.js.map +0 -1
  1047. package/buttons/index.metadata.json +0 -1
  1048. package/carousel/carousel.component.html +0 -14
  1049. package/carousel/carousel.component.js +0 -419
  1050. package/carousel/carousel.component.js.map +0 -1
  1051. package/carousel/carousel.component.metadata.json +0 -1
  1052. package/carousel/carousel.component.ngfactory.js.map +0 -1
  1053. package/carousel/carousel.config.js +0 -19
  1054. package/carousel/carousel.config.js.map +0 -1
  1055. package/carousel/carousel.config.metadata.json +0 -1
  1056. package/carousel/carousel.config.ngfactory.js.map +0 -1
  1057. package/carousel/carousel.module.js +0 -23
  1058. package/carousel/carousel.module.js.map +0 -1
  1059. package/carousel/carousel.module.metadata.json +0 -1
  1060. package/carousel/carousel.module.ngfactory.js.map +0 -1
  1061. package/carousel/index.js +0 -5
  1062. package/carousel/index.js.map +0 -1
  1063. package/carousel/index.metadata.json +0 -1
  1064. package/carousel/slide.component.js +0 -41
  1065. package/carousel/slide.component.js.map +0 -1
  1066. package/carousel/slide.component.metadata.json +0 -1
  1067. package/carousel/slide.component.ngfactory.js.map +0 -1
  1068. package/chronos/create/check-overflow.js +0 -30
  1069. package/chronos/create/check-overflow.js.map +0 -1
  1070. package/chronos/create/check-overflow.metadata.json +0 -1
  1071. package/chronos/create/clone.js +0 -6
  1072. package/chronos/create/clone.js.map +0 -1
  1073. package/chronos/create/clone.metadata.json +0 -1
  1074. package/chronos/create/date-from-array.js +0 -23
  1075. package/chronos/create/date-from-array.js.map +0 -1
  1076. package/chronos/create/date-from-array.metadata.json +0 -1
  1077. package/chronos/create/from-anything.js +0 -106
  1078. package/chronos/create/from-anything.js.map +0 -1
  1079. package/chronos/create/from-anything.metadata.json +0 -1
  1080. package/chronos/create/from-array.js +0 -136
  1081. package/chronos/create/from-array.js.map +0 -1
  1082. package/chronos/create/from-array.metadata.json +0 -1
  1083. package/chronos/create/from-object.js +0 -16
  1084. package/chronos/create/from-object.js.map +0 -1
  1085. package/chronos/create/from-object.metadata.json +0 -1
  1086. package/chronos/create/from-string-and-array.js +0 -38
  1087. package/chronos/create/from-string-and-array.js.map +0 -1
  1088. package/chronos/create/from-string-and-array.metadata.json +0 -1
  1089. package/chronos/create/from-string-and-format.js +0 -106
  1090. package/chronos/create/from-string-and-format.js.map +0 -1
  1091. package/chronos/create/from-string-and-format.metadata.json +0 -1
  1092. package/chronos/create/from-string.js +0 -226
  1093. package/chronos/create/from-string.js.map +0 -1
  1094. package/chronos/create/from-string.metadata.json +0 -1
  1095. package/chronos/create/local.js +0 -10
  1096. package/chronos/create/local.js.map +0 -1
  1097. package/chronos/create/local.metadata.json +0 -1
  1098. package/chronos/create/parsing-flags.js +0 -26
  1099. package/chronos/create/parsing-flags.js.map +0 -1
  1100. package/chronos/create/parsing-flags.metadata.json +0 -1
  1101. package/chronos/create/parsing.types.js +0 -1
  1102. package/chronos/create/parsing.types.js.map +0 -1
  1103. package/chronos/create/parsing.types.metadata.json +0 -1
  1104. package/chronos/create/valid.js +0 -42
  1105. package/chronos/create/valid.js.map +0 -1
  1106. package/chronos/create/valid.metadata.json +0 -1
  1107. package/chronos/duration/bubble.js +0 -47
  1108. package/chronos/duration/bubble.js.map +0 -1
  1109. package/chronos/duration/bubble.metadata.json +0 -1
  1110. package/chronos/duration/constructor.js +0 -134
  1111. package/chronos/duration/constructor.js.map +0 -1
  1112. package/chronos/duration/constructor.metadata.json +0 -1
  1113. package/chronos/duration/create.js +0 -114
  1114. package/chronos/duration/create.js.map +0 -1
  1115. package/chronos/duration/create.metadata.json +0 -1
  1116. package/chronos/duration/humanize.js +0 -84
  1117. package/chronos/duration/humanize.js.map +0 -1
  1118. package/chronos/duration/humanize.metadata.json +0 -1
  1119. package/chronos/duration/valid.js +0 -45
  1120. package/chronos/duration/valid.js.map +0 -1
  1121. package/chronos/duration/valid.metadata.json +0 -1
  1122. package/chronos/format/format.js +0 -52
  1123. package/chronos/format/format.js.map +0 -1
  1124. package/chronos/format/format.metadata.json +0 -1
  1125. package/chronos/format.js +0 -48
  1126. package/chronos/format.js.map +0 -1
  1127. package/chronos/format.metadata.json +0 -1
  1128. package/chronos/i18n/ar.js +0 -132
  1129. package/chronos/i18n/ar.js.map +0 -1
  1130. package/chronos/i18n/ar.metadata.json +0 -1
  1131. package/chronos/i18n/cs.js +0 -191
  1132. package/chronos/i18n/cs.js.map +0 -1
  1133. package/chronos/i18n/cs.metadata.json +0 -1
  1134. package/chronos/i18n/da.js +0 -51
  1135. package/chronos/i18n/da.js.map +0 -1
  1136. package/chronos/i18n/da.metadata.json +0 -1
  1137. package/chronos/i18n/de.js +0 -73
  1138. package/chronos/i18n/de.js.map +0 -1
  1139. package/chronos/i18n/de.metadata.json +0 -1
  1140. package/chronos/i18n/en-gb.js +0 -62
  1141. package/chronos/i18n/en-gb.js.map +0 -1
  1142. package/chronos/i18n/en-gb.metadata.json +0 -1
  1143. package/chronos/i18n/es-do.js +0 -86
  1144. package/chronos/i18n/es-do.js.map +0 -1
  1145. package/chronos/i18n/es-do.metadata.json +0 -1
  1146. package/chronos/i18n/es-us.js +0 -80
  1147. package/chronos/i18n/es-us.js.map +0 -1
  1148. package/chronos/i18n/es-us.metadata.json +0 -1
  1149. package/chronos/i18n/es.js +0 -85
  1150. package/chronos/i18n/es.js.map +0 -1
  1151. package/chronos/i18n/es.metadata.json +0 -1
  1152. package/chronos/i18n/fi.js +0 -101
  1153. package/chronos/i18n/fi.js.map +0 -1
  1154. package/chronos/i18n/fi.metadata.json +0 -1
  1155. package/chronos/i18n/fr.js +0 -77
  1156. package/chronos/i18n/fr.js.map +0 -1
  1157. package/chronos/i18n/fr.metadata.json +0 -1
  1158. package/chronos/i18n/gl.js +0 -85
  1159. package/chronos/i18n/gl.js.map +0 -1
  1160. package/chronos/i18n/gl.metadata.json +0 -1
  1161. package/chronos/i18n/he.js +0 -98
  1162. package/chronos/i18n/he.js.map +0 -1
  1163. package/chronos/i18n/he.metadata.json +0 -1
  1164. package/chronos/i18n/hi.js +0 -125
  1165. package/chronos/i18n/hi.js.map +0 -1
  1166. package/chronos/i18n/hi.metadata.json +0 -1
  1167. package/chronos/i18n/hu.js +0 -105
  1168. package/chronos/i18n/hu.js.map +0 -1
  1169. package/chronos/i18n/hu.metadata.json +0 -1
  1170. package/chronos/i18n/id.js +0 -84
  1171. package/chronos/i18n/id.js.map +0 -1
  1172. package/chronos/i18n/id.metadata.json +0 -1
  1173. package/chronos/i18n/it.js +0 -66
  1174. package/chronos/i18n/it.js.map +0 -1
  1175. package/chronos/i18n/it.metadata.json +0 -1
  1176. package/chronos/i18n/ja.js +0 -75
  1177. package/chronos/i18n/ja.js.map +0 -1
  1178. package/chronos/i18n/ja.metadata.json +0 -1
  1179. package/chronos/i18n/ko.js +0 -77
  1180. package/chronos/i18n/ko.js.map +0 -1
  1181. package/chronos/i18n/ko.metadata.json +0 -1
  1182. package/chronos/i18n/mn.js +0 -99
  1183. package/chronos/i18n/mn.js.map +0 -1
  1184. package/chronos/i18n/mn.metadata.json +0 -1
  1185. package/chronos/i18n/nl-be.js +0 -82
  1186. package/chronos/i18n/nl-be.js.map +0 -1
  1187. package/chronos/i18n/nl-be.metadata.json +0 -1
  1188. package/chronos/i18n/nl.js +0 -81
  1189. package/chronos/i18n/nl.js.map +0 -1
  1190. package/chronos/i18n/nl.metadata.json +0 -1
  1191. package/chronos/i18n/pl.js +0 -121
  1192. package/chronos/i18n/pl.js.map +0 -1
  1193. package/chronos/i18n/pl.metadata.json +0 -1
  1194. package/chronos/i18n/pt-br.js +0 -56
  1195. package/chronos/i18n/pt-br.js.map +0 -1
  1196. package/chronos/i18n/pt-br.metadata.json +0 -1
  1197. package/chronos/i18n/ro.js +0 -67
  1198. package/chronos/i18n/ro.js.map +0 -1
  1199. package/chronos/i18n/ro.metadata.json +0 -1
  1200. package/chronos/i18n/ru.js +0 -182
  1201. package/chronos/i18n/ru.js.map +0 -1
  1202. package/chronos/i18n/ru.metadata.json +0 -1
  1203. package/chronos/i18n/sl.js +0 -185
  1204. package/chronos/i18n/sl.js.map +0 -1
  1205. package/chronos/i18n/sl.metadata.json +0 -1
  1206. package/chronos/i18n/sv.js +0 -64
  1207. package/chronos/i18n/sv.js.map +0 -1
  1208. package/chronos/i18n/sv.metadata.json +0 -1
  1209. package/chronos/i18n/th.js +0 -60
  1210. package/chronos/i18n/th.js.map +0 -1
  1211. package/chronos/i18n/th.metadata.json +0 -1
  1212. package/chronos/i18n/tr.js +0 -84
  1213. package/chronos/i18n/tr.js.map +0 -1
  1214. package/chronos/i18n/tr.metadata.json +0 -1
  1215. package/chronos/i18n/zh-cn.js +0 -115
  1216. package/chronos/i18n/zh-cn.js.map +0 -1
  1217. package/chronos/i18n/zh-cn.metadata.json +0 -1
  1218. package/chronos/index.js +0 -7
  1219. package/chronos/index.js.map +0 -1
  1220. package/chronos/index.metadata.json +0 -1
  1221. package/chronos/locale/calendar.js +0 -9
  1222. package/chronos/locale/calendar.js.map +0 -1
  1223. package/chronos/locale/calendar.metadata.json +0 -1
  1224. package/chronos/locale/locale.class.js +0 -550
  1225. package/chronos/locale/locale.class.js.map +0 -1
  1226. package/chronos/locale/locale.class.metadata.json +0 -1
  1227. package/chronos/locale/locale.defaults.js +0 -41
  1228. package/chronos/locale/locale.defaults.js.map +0 -1
  1229. package/chronos/locale/locale.defaults.metadata.json +0 -1
  1230. package/chronos/locale/locales.js +0 -194
  1231. package/chronos/locale/locales.js.map +0 -1
  1232. package/chronos/locale/locales.metadata.json +0 -1
  1233. package/chronos/moment/add-subtract.js +0 -35
  1234. package/chronos/moment/add-subtract.js.map +0 -1
  1235. package/chronos/moment/add-subtract.metadata.json +0 -1
  1236. package/chronos/moment/calendar.js +0 -43
  1237. package/chronos/moment/calendar.js.map +0 -1
  1238. package/chronos/moment/calendar.metadata.json +0 -1
  1239. package/chronos/moment/diff.js +0 -71
  1240. package/chronos/moment/diff.js.map +0 -1
  1241. package/chronos/moment/diff.metadata.json +0 -1
  1242. package/chronos/moment/min-max.js +0 -41
  1243. package/chronos/moment/min-max.js.map +0 -1
  1244. package/chronos/moment/min-max.metadata.json +0 -1
  1245. package/chronos/parse/regex.js +0 -49
  1246. package/chronos/parse/regex.js.map +0 -1
  1247. package/chronos/parse/regex.metadata.json +0 -1
  1248. package/chronos/parse/token.js +0 -31
  1249. package/chronos/parse/token.js.map +0 -1
  1250. package/chronos/parse/token.metadata.json +0 -1
  1251. package/chronos/test/chain.js +0 -738
  1252. package/chronos/test/chain.js.map +0 -1
  1253. package/chronos/test/chain.metadata.json +0 -1
  1254. package/chronos/types.js +0 -1
  1255. package/chronos/types.js.map +0 -1
  1256. package/chronos/types.metadata.json +0 -1
  1257. package/chronos/units/aliases.js +0 -35
  1258. package/chronos/units/aliases.js.map +0 -1
  1259. package/chronos/units/aliases.metadata.json +0 -1
  1260. package/chronos/units/constants.js +0 -11
  1261. package/chronos/units/constants.js.map +0 -1
  1262. package/chronos/units/constants.metadata.json +0 -1
  1263. package/chronos/units/day-of-month.js +0 -28
  1264. package/chronos/units/day-of-month.js.map +0 -1
  1265. package/chronos/units/day-of-week.js +0 -129
  1266. package/chronos/units/day-of-week.js.map +0 -1
  1267. package/chronos/units/day-of-week.metadata.json +0 -1
  1268. package/chronos/units/day-of-year.js +0 -34
  1269. package/chronos/units/day-of-year.js.map +0 -1
  1270. package/chronos/units/day-of-year.metadata.json +0 -1
  1271. package/chronos/units/hour.js +0 -122
  1272. package/chronos/units/hour.js.map +0 -1
  1273. package/chronos/units/index.js +0 -19
  1274. package/chronos/units/index.js.map +0 -1
  1275. package/chronos/units/millisecond.js +0 -58
  1276. package/chronos/units/millisecond.js.map +0 -1
  1277. package/chronos/units/minute.js +0 -20
  1278. package/chronos/units/minute.js.map +0 -1
  1279. package/chronos/units/month.js +0 -61
  1280. package/chronos/units/month.js.map +0 -1
  1281. package/chronos/units/month.metadata.json +0 -1
  1282. package/chronos/units/offset.js +0 -212
  1283. package/chronos/units/offset.js.map +0 -1
  1284. package/chronos/units/offset.metadata.json +0 -1
  1285. package/chronos/units/priorities.js +0 -21
  1286. package/chronos/units/priorities.js.map +0 -1
  1287. package/chronos/units/priorities.metadata.json +0 -1
  1288. package/chronos/units/quarter.js +0 -37
  1289. package/chronos/units/quarter.js.map +0 -1
  1290. package/chronos/units/quarter.metadata.json +0 -1
  1291. package/chronos/units/second.js +0 -20
  1292. package/chronos/units/second.js.map +0 -1
  1293. package/chronos/units/timestamp.js +0 -24
  1294. package/chronos/units/timestamp.js.map +0 -1
  1295. package/chronos/units/timezone.js +0 -17
  1296. package/chronos/units/timezone.js.map +0 -1
  1297. package/chronos/units/timezone.metadata.json +0 -1
  1298. package/chronos/units/week-calendar-utils.js +0 -63
  1299. package/chronos/units/week-calendar-utils.js.map +0 -1
  1300. package/chronos/units/week-calendar-utils.metadata.json +0 -1
  1301. package/chronos/units/week-year.js +0 -102
  1302. package/chronos/units/week-year.js.map +0 -1
  1303. package/chronos/units/week-year.metadata.json +0 -1
  1304. package/chronos/units/week.js +0 -56
  1305. package/chronos/units/week.js.map +0 -1
  1306. package/chronos/units/week.metadata.json +0 -1
  1307. package/chronos/units/year.js +0 -55
  1308. package/chronos/units/year.js.map +0 -1
  1309. package/chronos/units/year.metadata.json +0 -1
  1310. package/chronos/utils/abs-ceil.js +0 -4
  1311. package/chronos/utils/abs-ceil.js.map +0 -1
  1312. package/chronos/utils/abs-ceil.metadata.json +0 -1
  1313. package/chronos/utils/abs-round.js +0 -4
  1314. package/chronos/utils/abs-round.js.map +0 -1
  1315. package/chronos/utils/abs-round.metadata.json +0 -1
  1316. package/chronos/utils/compare-arrays.js +0 -15
  1317. package/chronos/utils/compare-arrays.js.map +0 -1
  1318. package/chronos/utils/compare-arrays.metadata.json +0 -1
  1319. package/chronos/utils/date-compare.js +0 -50
  1320. package/chronos/utils/date-compare.js.map +0 -1
  1321. package/chronos/utils/date-compare.metadata.json +0 -1
  1322. package/chronos/utils/date-getters.js +0 -75
  1323. package/chronos/utils/date-getters.js.map +0 -1
  1324. package/chronos/utils/date-getters.metadata.json +0 -1
  1325. package/chronos/utils/date-setters.js +0 -74
  1326. package/chronos/utils/date-setters.js.map +0 -1
  1327. package/chronos/utils/date-setters.metadata.json +0 -1
  1328. package/chronos/utils/defaults.js +0 -11
  1329. package/chronos/utils/defaults.js.map +0 -1
  1330. package/chronos/utils/defaults.metadata.json +0 -1
  1331. package/chronos/utils/start-end-of.js +0 -57
  1332. package/chronos/utils/start-end-of.js.map +0 -1
  1333. package/chronos/utils/start-end-of.metadata.json +0 -1
  1334. package/chronos/utils/type-checks.js +0 -56
  1335. package/chronos/utils/type-checks.js.map +0 -1
  1336. package/chronos/utils/type-checks.metadata.json +0 -1
  1337. package/chronos/utils/zero-fill.js +0 -10
  1338. package/chronos/utils/zero-fill.js.map +0 -1
  1339. package/chronos/utils/zero-fill.metadata.json +0 -1
  1340. package/chronos/utils.js +0 -7
  1341. package/chronos/utils.js.map +0 -1
  1342. package/chronos/utils.metadata.json +0 -1
  1343. package/collapse/collapse.directive.js +0 -98
  1344. package/collapse/collapse.directive.js.map +0 -1
  1345. package/collapse/collapse.directive.metadata.json +0 -1
  1346. package/collapse/collapse.directive.ngfactory.js.map +0 -1
  1347. package/collapse/collapse.module.js +0 -18
  1348. package/collapse/collapse.module.js.map +0 -1
  1349. package/collapse/collapse.module.metadata.json +0 -1
  1350. package/collapse/collapse.module.ngfactory.js.map +0 -1
  1351. package/collapse/index.js +0 -3
  1352. package/collapse/index.js.map +0 -1
  1353. package/collapse/index.metadata.json +0 -1
  1354. package/component-loader/bs-component-ref.class.js +0 -7
  1355. package/component-loader/bs-component-ref.class.js.map +0 -1
  1356. package/component-loader/bs-component-ref.class.metadata.json +0 -1
  1357. package/component-loader/component-loader.class.js +0 -258
  1358. package/component-loader/component-loader.class.js.map +0 -1
  1359. package/component-loader/component-loader.class.metadata.json +0 -1
  1360. package/component-loader/component-loader.factory.js +0 -50
  1361. package/component-loader/component-loader.factory.js.map +0 -1
  1362. package/component-loader/component-loader.factory.metadata.json +0 -1
  1363. package/component-loader/component-loader.factory.ngfactory.js.map +0 -1
  1364. package/component-loader/content-ref.class.js +0 -14
  1365. package/component-loader/content-ref.class.js.map +0 -1
  1366. package/component-loader/content-ref.class.metadata.json +0 -1
  1367. package/component-loader/index.d.ts +0 -3
  1368. package/component-loader/index.js +0 -4
  1369. package/component-loader/index.js.map +0 -1
  1370. package/component-loader/index.metadata.json +0 -1
  1371. package/component-loader/listen-options.model.js +0 -1
  1372. package/component-loader/listen-options.model.js.map +0 -1
  1373. package/component-loader/listen-options.model.metadata.json +0 -1
  1374. package/datepicker/base/bs-datepicker-container.js +0 -40
  1375. package/datepicker/base/bs-datepicker-container.js.map +0 -1
  1376. package/datepicker/base/bs-datepicker-container.metadata.json +0 -1
  1377. package/datepicker/bs-datepicker-input.directive.js +0 -134
  1378. package/datepicker/bs-datepicker-input.directive.js.map +0 -1
  1379. package/datepicker/bs-datepicker-input.directive.metadata.json +0 -1
  1380. package/datepicker/bs-datepicker-input.directive.ngfactory.js.map +0 -1
  1381. package/datepicker/bs-datepicker.component.js +0 -217
  1382. package/datepicker/bs-datepicker.component.js.map +0 -1
  1383. package/datepicker/bs-datepicker.component.metadata.json +0 -1
  1384. package/datepicker/bs-datepicker.component.ngfactory.js.map +0 -1
  1385. package/datepicker/bs-datepicker.config.js +0 -39
  1386. package/datepicker/bs-datepicker.config.js.map +0 -1
  1387. package/datepicker/bs-datepicker.config.metadata.json +0 -1
  1388. package/datepicker/bs-datepicker.config.ngfactory.js.map +0 -1
  1389. package/datepicker/bs-datepicker.module.js +0 -80
  1390. package/datepicker/bs-datepicker.module.js.map +0 -1
  1391. package/datepicker/bs-datepicker.module.metadata.json +0 -1
  1392. package/datepicker/bs-datepicker.module.ngfactory.js.map +0 -1
  1393. package/datepicker/bs-daterangepicker-input.directive.js +0 -150
  1394. package/datepicker/bs-daterangepicker-input.directive.js.map +0 -1
  1395. package/datepicker/bs-daterangepicker-input.directive.metadata.json +0 -1
  1396. package/datepicker/bs-daterangepicker-input.directive.ngfactory.js.map +0 -1
  1397. package/datepicker/bs-daterangepicker.component.js +0 -220
  1398. package/datepicker/bs-daterangepicker.component.js.map +0 -1
  1399. package/datepicker/bs-daterangepicker.component.metadata.json +0 -1
  1400. package/datepicker/bs-daterangepicker.component.ngfactory.js.map +0 -1
  1401. package/datepicker/bs-daterangepicker.config.js +0 -27
  1402. package/datepicker/bs-daterangepicker.config.js.map +0 -1
  1403. package/datepicker/bs-daterangepicker.config.metadata.json +0 -1
  1404. package/datepicker/bs-daterangepicker.config.ngfactory.js.map +0 -1
  1405. package/datepicker/bs-locale.service.js +0 -42
  1406. package/datepicker/bs-locale.service.js.map +0 -1
  1407. package/datepicker/bs-locale.service.metadata.json +0 -1
  1408. package/datepicker/bs-locale.service.ngfactory.js.map +0 -1
  1409. package/datepicker/date-formatter.js +0 -11
  1410. package/datepicker/date-formatter.js.map +0 -1
  1411. package/datepicker/date-formatter.metadata.json +0 -1
  1412. package/datepicker/datepicker-inner.component.js +0 -317
  1413. package/datepicker/datepicker-inner.component.js.map +0 -1
  1414. package/datepicker/datepicker-inner.component.metadata.json +0 -1
  1415. package/datepicker/datepicker-inner.component.ngfactory.js.map +0 -1
  1416. package/datepicker/datepicker.component.js +0 -114
  1417. package/datepicker/datepicker.component.js.map +0 -1
  1418. package/datepicker/datepicker.component.metadata.json +0 -1
  1419. package/datepicker/datepicker.component.ngfactory.js.map +0 -1
  1420. package/datepicker/datepicker.config.js +0 -28
  1421. package/datepicker/datepicker.config.js.map +0 -1
  1422. package/datepicker/datepicker.config.metadata.json +0 -1
  1423. package/datepicker/datepicker.config.ngfactory.js.map +0 -1
  1424. package/datepicker/datepicker.module.js +0 -39
  1425. package/datepicker/datepicker.module.js.map +0 -1
  1426. package/datepicker/datepicker.module.metadata.json +0 -1
  1427. package/datepicker/datepicker.module.ngfactory.js.map +0 -1
  1428. package/datepicker/daypicker.component.js +0 -116
  1429. package/datepicker/daypicker.component.js.map +0 -1
  1430. package/datepicker/daypicker.component.metadata.json +0 -1
  1431. package/datepicker/daypicker.component.ngfactory.js.map +0 -1
  1432. package/datepicker/engine/calc-days-calendar.js +0 -19
  1433. package/datepicker/engine/calc-days-calendar.js.map +0 -1
  1434. package/datepicker/engine/calc-days-calendar.metadata.json +0 -1
  1435. package/datepicker/engine/flag-days-calendar.js +0 -72
  1436. package/datepicker/engine/flag-days-calendar.js.map +0 -1
  1437. package/datepicker/engine/flag-days-calendar.metadata.json +0 -1
  1438. package/datepicker/engine/flag-months-calendar.js +0 -30
  1439. package/datepicker/engine/flag-months-calendar.js.map +0 -1
  1440. package/datepicker/engine/flag-months-calendar.metadata.json +0 -1
  1441. package/datepicker/engine/flag-years-calendar.js +0 -29
  1442. package/datepicker/engine/flag-years-calendar.js.map +0 -1
  1443. package/datepicker/engine/flag-years-calendar.metadata.json +0 -1
  1444. package/datepicker/engine/format-days-calendar.js +0 -34
  1445. package/datepicker/engine/format-days-calendar.js.map +0 -1
  1446. package/datepicker/engine/format-days-calendar.metadata.json +0 -1
  1447. package/datepicker/engine/format-months-calendar.js +0 -22
  1448. package/datepicker/engine/format-months-calendar.js.map +0 -1
  1449. package/datepicker/engine/format-months-calendar.metadata.json +0 -1
  1450. package/datepicker/engine/format-years-calendar.js +0 -30
  1451. package/datepicker/engine/format-years-calendar.js.map +0 -1
  1452. package/datepicker/engine/format-years-calendar.metadata.json +0 -1
  1453. package/datepicker/engine/view-mode.js +0 -4
  1454. package/datepicker/engine/view-mode.js.map +0 -1
  1455. package/datepicker/engine/view-mode.metadata.json +0 -1
  1456. package/datepicker/index.d.ts +0 -13
  1457. package/datepicker/index.js +0 -14
  1458. package/datepicker/index.js.map +0 -1
  1459. package/datepicker/index.metadata.json +0 -1
  1460. package/datepicker/models/index.js +0 -15
  1461. package/datepicker/models/index.js.map +0 -1
  1462. package/datepicker/models/index.metadata.json +0 -1
  1463. package/datepicker/monthpicker.component.js +0 -56
  1464. package/datepicker/monthpicker.component.js.map +0 -1
  1465. package/datepicker/monthpicker.component.metadata.json +0 -1
  1466. package/datepicker/monthpicker.component.ngfactory.js.map +0 -1
  1467. package/datepicker/reducer/_defaults.js +0 -5
  1468. package/datepicker/reducer/_defaults.js.map +0 -1
  1469. package/datepicker/reducer/_defaults.metadata.json +0 -1
  1470. package/datepicker/reducer/bs-datepicker.actions.js +0 -104
  1471. package/datepicker/reducer/bs-datepicker.actions.js.map +0 -1
  1472. package/datepicker/reducer/bs-datepicker.actions.metadata.json +0 -1
  1473. package/datepicker/reducer/bs-datepicker.actions.ngfactory.js.map +0 -1
  1474. package/datepicker/reducer/bs-datepicker.effects.js +0 -179
  1475. package/datepicker/reducer/bs-datepicker.effects.js.map +0 -1
  1476. package/datepicker/reducer/bs-datepicker.effects.metadata.json +0 -1
  1477. package/datepicker/reducer/bs-datepicker.effects.ngfactory.js.map +0 -1
  1478. package/datepicker/reducer/bs-datepicker.reducer.js +0 -261
  1479. package/datepicker/reducer/bs-datepicker.reducer.js.map +0 -1
  1480. package/datepicker/reducer/bs-datepicker.reducer.metadata.json +0 -1
  1481. package/datepicker/reducer/bs-datepicker.state.js +0 -16
  1482. package/datepicker/reducer/bs-datepicker.state.js.map +0 -1
  1483. package/datepicker/reducer/bs-datepicker.state.metadata.json +0 -1
  1484. package/datepicker/reducer/bs-datepicker.store.js +0 -36
  1485. package/datepicker/reducer/bs-datepicker.store.js.map +0 -1
  1486. package/datepicker/reducer/bs-datepicker.store.metadata.json +0 -1
  1487. package/datepicker/reducer/bs-datepicker.store.ngfactory.js.map +0 -1
  1488. package/datepicker/themes/bs/bs-calendar-layout.component.js +0 -14
  1489. package/datepicker/themes/bs/bs-calendar-layout.component.js.map +0 -1
  1490. package/datepicker/themes/bs/bs-calendar-layout.component.metadata.json +0 -1
  1491. package/datepicker/themes/bs/bs-calendar-layout.component.ngfactory.js.map +0 -1
  1492. package/datepicker/themes/bs/bs-current-date-view.component.js +0 -18
  1493. package/datepicker/themes/bs/bs-current-date-view.component.js.map +0 -1
  1494. package/datepicker/themes/bs/bs-current-date-view.component.metadata.json +0 -1
  1495. package/datepicker/themes/bs/bs-current-date-view.component.ngfactory.js.map +0 -1
  1496. package/datepicker/themes/bs/bs-custom-dates-view.component.js +0 -20
  1497. package/datepicker/themes/bs/bs-custom-dates-view.component.js.map +0 -1
  1498. package/datepicker/themes/bs/bs-custom-dates-view.component.metadata.json +0 -1
  1499. package/datepicker/themes/bs/bs-custom-dates-view.component.ngfactory.js.map +0 -1
  1500. package/datepicker/themes/bs/bs-datepicker-container.component.js +0 -87
  1501. package/datepicker/themes/bs/bs-datepicker-container.component.js.map +0 -1
  1502. package/datepicker/themes/bs/bs-datepicker-container.component.metadata.json +0 -1
  1503. package/datepicker/themes/bs/bs-datepicker-container.component.ngfactory.js.map +0 -1
  1504. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.js +0 -28
  1505. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.js.map +0 -1
  1506. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.metadata.json +0 -1
  1507. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.ngfactory.js.map +0 -1
  1508. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.js +0 -30
  1509. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.js.map +0 -1
  1510. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.metadata.json +0 -1
  1511. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.ngfactory.js.map +0 -1
  1512. package/datepicker/themes/bs/bs-datepicker-view.html +0 -61
  1513. package/datepicker/themes/bs/bs-daterangepicker-container.component.js +0 -105
  1514. package/datepicker/themes/bs/bs-daterangepicker-container.component.js.map +0 -1
  1515. package/datepicker/themes/bs/bs-daterangepicker-container.component.metadata.json +0 -1
  1516. package/datepicker/themes/bs/bs-daterangepicker-container.component.ngfactory.js.map +0 -1
  1517. package/datepicker/themes/bs/bs-days-calendar-view.component.js +0 -42
  1518. package/datepicker/themes/bs/bs-days-calendar-view.component.js.map +0 -1
  1519. package/datepicker/themes/bs/bs-days-calendar-view.component.metadata.json +0 -1
  1520. package/datepicker/themes/bs/bs-days-calendar-view.component.ngfactory.js.map +0 -1
  1521. package/datepicker/themes/bs/bs-months-calendar-view.component.js +0 -40
  1522. package/datepicker/themes/bs/bs-months-calendar-view.component.js.map +0 -1
  1523. package/datepicker/themes/bs/bs-months-calendar-view.component.metadata.json +0 -1
  1524. package/datepicker/themes/bs/bs-months-calendar-view.component.ngfactory.js.map +0 -1
  1525. package/datepicker/themes/bs/bs-timepicker-view.component.js +0 -17
  1526. package/datepicker/themes/bs/bs-timepicker-view.component.js.map +0 -1
  1527. package/datepicker/themes/bs/bs-timepicker-view.component.metadata.json +0 -1
  1528. package/datepicker/themes/bs/bs-timepicker-view.component.ngfactory.js.map +0 -1
  1529. package/datepicker/themes/bs/bs-years-calendar-view.component.js +0 -41
  1530. package/datepicker/themes/bs/bs-years-calendar-view.component.js.map +0 -1
  1531. package/datepicker/themes/bs/bs-years-calendar-view.component.metadata.json +0 -1
  1532. package/datepicker/themes/bs/bs-years-calendar-view.component.ngfactory.js.map +0 -1
  1533. package/datepicker/utils/bs-calendar-utils.js +0 -30
  1534. package/datepicker/utils/bs-calendar-utils.js.map +0 -1
  1535. package/datepicker/utils/bs-calendar-utils.metadata.json +0 -1
  1536. package/datepicker/utils/matrix-utils.js +0 -14
  1537. package/datepicker/utils/matrix-utils.js.map +0 -1
  1538. package/datepicker/utils/matrix-utils.metadata.json +0 -1
  1539. package/datepicker/yearpicker.component.js +0 -57
  1540. package/datepicker/yearpicker.component.js.map +0 -1
  1541. package/datepicker/yearpicker.component.metadata.json +0 -1
  1542. package/datepicker/yearpicker.component.ngfactory.js.map +0 -1
  1543. package/dropdown/bs-dropdown-container.component.js +0 -59
  1544. package/dropdown/bs-dropdown-container.component.js.map +0 -1
  1545. package/dropdown/bs-dropdown-container.component.metadata.json +0 -1
  1546. package/dropdown/bs-dropdown-container.component.ngfactory.js.map +0 -1
  1547. package/dropdown/bs-dropdown-menu.directive.js +0 -25
  1548. package/dropdown/bs-dropdown-menu.directive.js.map +0 -1
  1549. package/dropdown/bs-dropdown-menu.directive.metadata.json +0 -1
  1550. package/dropdown/bs-dropdown-menu.directive.ngfactory.js.map +0 -1
  1551. package/dropdown/bs-dropdown-toggle.directive.js +0 -63
  1552. package/dropdown/bs-dropdown-toggle.directive.js.map +0 -1
  1553. package/dropdown/bs-dropdown-toggle.directive.metadata.json +0 -1
  1554. package/dropdown/bs-dropdown-toggle.directive.ngfactory.js.map +0 -1
  1555. package/dropdown/bs-dropdown.config.js +0 -14
  1556. package/dropdown/bs-dropdown.config.js.map +0 -1
  1557. package/dropdown/bs-dropdown.config.metadata.json +0 -1
  1558. package/dropdown/bs-dropdown.config.ngfactory.js.map +0 -1
  1559. package/dropdown/bs-dropdown.directive.js +0 -300
  1560. package/dropdown/bs-dropdown.directive.js.map +0 -1
  1561. package/dropdown/bs-dropdown.directive.metadata.json +0 -1
  1562. package/dropdown/bs-dropdown.directive.ngfactory.js.map +0 -1
  1563. package/dropdown/bs-dropdown.module.js +0 -46
  1564. package/dropdown/bs-dropdown.module.js.map +0 -1
  1565. package/dropdown/bs-dropdown.module.metadata.json +0 -1
  1566. package/dropdown/bs-dropdown.module.ngfactory.js.map +0 -1
  1567. package/dropdown/bs-dropdown.state.js +0 -21
  1568. package/dropdown/bs-dropdown.state.js.map +0 -1
  1569. package/dropdown/bs-dropdown.state.metadata.json +0 -1
  1570. package/dropdown/bs-dropdown.state.ngfactory.js.map +0 -1
  1571. package/dropdown/index.js +0 -8
  1572. package/dropdown/index.js.map +0 -1
  1573. package/dropdown/index.metadata.json +0 -1
  1574. package/index.d.ts +0 -24
  1575. package/index.js +0 -25
  1576. package/index.js.map +0 -1
  1577. package/index.metadata.json +0 -1
  1578. package/locale.d.ts +0 -30
  1579. package/locale.js +0 -31
  1580. package/locale.js.map +0 -1
  1581. package/locale.metadata.json +0 -1
  1582. package/mini-ngrx/LICENCE +0 -21
  1583. package/mini-ngrx/index.js +0 -3
  1584. package/mini-ngrx/index.js.map +0 -1
  1585. package/mini-ngrx/index.metadata.json +0 -1
  1586. package/mini-ngrx/state.class.js +0 -30
  1587. package/mini-ngrx/state.class.js.map +0 -1
  1588. package/mini-ngrx/state.class.metadata.json +0 -1
  1589. package/mini-ngrx/store.class.js +0 -46
  1590. package/mini-ngrx/store.class.js.map +0 -1
  1591. package/mini-ngrx/store.class.metadata.json +0 -1
  1592. package/modal/bs-modal-ref.service.js +0 -15
  1593. package/modal/bs-modal-ref.service.js.map +0 -1
  1594. package/modal/bs-modal-ref.service.metadata.json +0 -1
  1595. package/modal/bs-modal-ref.service.ngfactory.js.map +0 -1
  1596. package/modal/bs-modal.service.js +0 -174
  1597. package/modal/bs-modal.service.js.map +0 -1
  1598. package/modal/bs-modal.service.metadata.json +0 -1
  1599. package/modal/bs-modal.service.ngfactory.js.map +0 -1
  1600. package/modal/index.js +0 -9
  1601. package/modal/index.js.map +0 -1
  1602. package/modal/index.metadata.json +0 -1
  1603. package/modal/modal-backdrop.component.js +0 -69
  1604. package/modal/modal-backdrop.component.js.map +0 -1
  1605. package/modal/modal-backdrop.component.metadata.json +0 -1
  1606. package/modal/modal-backdrop.component.ngfactory.js.map +0 -1
  1607. package/modal/modal-backdrop.options.js +0 -9
  1608. package/modal/modal-backdrop.options.js.map +0 -1
  1609. package/modal/modal-backdrop.options.metadata.json +0 -1
  1610. package/modal/modal-container.component.js +0 -103
  1611. package/modal/modal-container.component.js.map +0 -1
  1612. package/modal/modal-container.component.metadata.json +0 -1
  1613. package/modal/modal-container.component.ngfactory.js.map +0 -1
  1614. package/modal/modal-options.class.js +0 -44
  1615. package/modal/modal-options.class.js.map +0 -1
  1616. package/modal/modal-options.class.metadata.json +0 -1
  1617. package/modal/modal-options.class.ngfactory.js.map +0 -1
  1618. package/modal/modal.directive.js +0 -436
  1619. package/modal/modal.directive.js.map +0 -1
  1620. package/modal/modal.directive.metadata.json +0 -1
  1621. package/modal/modal.directive.ngfactory.js.map +0 -1
  1622. package/modal/modal.module.js +0 -31
  1623. package/modal/modal.module.js.map +0 -1
  1624. package/modal/modal.module.metadata.json +0 -1
  1625. package/modal/modal.module.ngfactory.js.map +0 -1
  1626. package/pagination/index.js +0 -5
  1627. package/pagination/index.js.map +0 -1
  1628. package/pagination/index.metadata.json +0 -1
  1629. package/pagination/pager.component.html +0 -12
  1630. package/pagination/pager.component.js +0 -249
  1631. package/pagination/pager.component.js.map +0 -1
  1632. package/pagination/pager.component.metadata.json +0 -1
  1633. package/pagination/pager.component.ngfactory.js.map +0 -1
  1634. package/pagination/pagination.component.html +0 -35
  1635. package/pagination/pagination.component.js +0 -249
  1636. package/pagination/pagination.component.js.map +0 -1
  1637. package/pagination/pagination.component.metadata.json +0 -1
  1638. package/pagination/pagination.component.ngfactory.js.map +0 -1
  1639. package/pagination/pagination.config.js +0 -31
  1640. package/pagination/pagination.config.js.map +0 -1
  1641. package/pagination/pagination.config.metadata.json +0 -1
  1642. package/pagination/pagination.config.ngfactory.js.map +0 -1
  1643. package/pagination/pagination.module.js +0 -22
  1644. package/pagination/pagination.module.js.map +0 -1
  1645. package/pagination/pagination.module.metadata.json +0 -1
  1646. package/pagination/pagination.module.ngfactory.js.map +0 -1
  1647. package/popover/index.js +0 -5
  1648. package/popover/index.js.map +0 -1
  1649. package/popover/index.metadata.json +0 -1
  1650. package/popover/popover-container.component.html +0 -5
  1651. package/popover/popover-container.component.js +0 -43
  1652. package/popover/popover-container.component.js.map +0 -1
  1653. package/popover/popover-container.component.metadata.json +0 -1
  1654. package/popover/popover-container.component.ngfactory.js.map +0 -1
  1655. package/popover/popover.config.js +0 -27
  1656. package/popover/popover.config.js.map +0 -1
  1657. package/popover/popover.config.metadata.json +0 -1
  1658. package/popover/popover.config.ngfactory.js.map +0 -1
  1659. package/popover/popover.directive.js +0 -165
  1660. package/popover/popover.directive.js.map +0 -1
  1661. package/popover/popover.directive.metadata.json +0 -1
  1662. package/popover/popover.directive.ngfactory.js.map +0 -1
  1663. package/popover/popover.module.js +0 -28
  1664. package/popover/popover.module.js.map +0 -1
  1665. package/popover/popover.module.metadata.json +0 -1
  1666. package/popover/popover.module.ngfactory.js.map +0 -1
  1667. package/positioning/index.js +0 -3
  1668. package/positioning/index.js.map +0 -1
  1669. package/positioning/index.metadata.json +0 -1
  1670. package/positioning/ng-positioning.js +0 -216
  1671. package/positioning/ng-positioning.js.map +0 -1
  1672. package/positioning/ng-positioning.metadata.json +0 -1
  1673. package/positioning/positioning.service.js +0 -26
  1674. package/positioning/positioning.service.js.map +0 -1
  1675. package/positioning/positioning.service.metadata.json +0 -1
  1676. package/positioning/positioning.service.ngfactory.js.map +0 -1
  1677. package/progressbar/bar.component.html +0 -1
  1678. package/progressbar/bar.component.js +0 -87
  1679. package/progressbar/bar.component.js.map +0 -1
  1680. package/progressbar/bar.component.metadata.json +0 -1
  1681. package/progressbar/bar.component.ngfactory.js.map +0 -1
  1682. package/progressbar/index.js +0 -5
  1683. package/progressbar/index.js.map +0 -1
  1684. package/progressbar/index.metadata.json +0 -1
  1685. package/progressbar/progressbar.component.html +0 -6
  1686. package/progressbar/progressbar.component.js +0 -76
  1687. package/progressbar/progressbar.component.js.map +0 -1
  1688. package/progressbar/progressbar.component.metadata.json +0 -1
  1689. package/progressbar/progressbar.component.ngfactory.js.map +0 -1
  1690. package/progressbar/progressbar.config.js +0 -15
  1691. package/progressbar/progressbar.config.js.map +0 -1
  1692. package/progressbar/progressbar.config.metadata.json +0 -1
  1693. package/progressbar/progressbar.config.ngfactory.js.map +0 -1
  1694. package/progressbar/progressbar.module.js +0 -22
  1695. package/progressbar/progressbar.module.js.map +0 -1
  1696. package/progressbar/progressbar.module.metadata.json +0 -1
  1697. package/progressbar/progressbar.module.ngfactory.js.map +0 -1
  1698. package/rating/index.js +0 -3
  1699. package/rating/index.js.map +0 -1
  1700. package/rating/index.metadata.json +0 -1
  1701. package/rating/rating.component.html +0 -18
  1702. package/rating/rating.component.js +0 -111
  1703. package/rating/rating.component.js.map +0 -1
  1704. package/rating/rating.component.metadata.json +0 -1
  1705. package/rating/rating.component.ngfactory.js.map +0 -1
  1706. package/rating/rating.module.js +0 -23
  1707. package/rating/rating.module.js.map +0 -1
  1708. package/rating/rating.module.metadata.json +0 -1
  1709. package/rating/rating.module.ngfactory.js.map +0 -1
  1710. package/sortable/draggable-item.js +0 -1
  1711. package/sortable/draggable-item.js.map +0 -1
  1712. package/sortable/draggable-item.metadata.json +0 -1
  1713. package/sortable/draggable-item.service.js +0 -34
  1714. package/sortable/draggable-item.service.js.map +0 -1
  1715. package/sortable/draggable-item.service.metadata.json +0 -1
  1716. package/sortable/draggable-item.service.ngfactory.js.map +0 -1
  1717. package/sortable/index.js +0 -4
  1718. package/sortable/index.js.map +0 -1
  1719. package/sortable/index.metadata.json +0 -1
  1720. package/sortable/sortable.component.js +0 -186
  1721. package/sortable/sortable.component.js.map +0 -1
  1722. package/sortable/sortable.component.metadata.json +0 -1
  1723. package/sortable/sortable.component.ngfactory.js.map +0 -1
  1724. package/sortable/sortable.module.js +0 -21
  1725. package/sortable/sortable.module.js.map +0 -1
  1726. package/sortable/sortable.module.metadata.json +0 -1
  1727. package/sortable/sortable.module.ngfactory.js.map +0 -1
  1728. package/spec/ng-bootstrap/license +0 -23
  1729. package/tabs/index.js +0 -7
  1730. package/tabs/index.js.map +0 -1
  1731. package/tabs/index.metadata.json +0 -1
  1732. package/tabs/ng-transclude.directive.js +0 -34
  1733. package/tabs/ng-transclude.directive.js.map +0 -1
  1734. package/tabs/ng-transclude.directive.metadata.json +0 -1
  1735. package/tabs/ng-transclude.directive.ngfactory.js.map +0 -1
  1736. package/tabs/tab-heading.directive.js +0 -19
  1737. package/tabs/tab-heading.directive.js.map +0 -1
  1738. package/tabs/tab-heading.directive.metadata.json +0 -1
  1739. package/tabs/tab-heading.directive.ngfactory.js.map +0 -1
  1740. package/tabs/tab.directive.js +0 -97
  1741. package/tabs/tab.directive.js.map +0 -1
  1742. package/tabs/tab.directive.metadata.json +0 -1
  1743. package/tabs/tab.directive.ngfactory.js.map +0 -1
  1744. package/tabs/tabs.module.js +0 -37
  1745. package/tabs/tabs.module.js.map +0 -1
  1746. package/tabs/tabs.module.metadata.json +0 -1
  1747. package/tabs/tabs.module.ngfactory.js.map +0 -1
  1748. package/tabs/tabset.component.html +0 -15
  1749. package/tabs/tabset.component.js +0 -134
  1750. package/tabs/tabset.component.js.map +0 -1
  1751. package/tabs/tabset.component.metadata.json +0 -1
  1752. package/tabs/tabset.component.ngfactory.js.map +0 -1
  1753. package/tabs/tabset.config.js +0 -13
  1754. package/tabs/tabset.config.js.map +0 -1
  1755. package/tabs/tabset.config.metadata.json +0 -1
  1756. package/tabs/tabset.config.ngfactory.js.map +0 -1
  1757. package/timepicker/index.js +0 -6
  1758. package/timepicker/index.js.map +0 -1
  1759. package/timepicker/index.metadata.json +0 -1
  1760. package/timepicker/reducer/timepicker.actions.js +0 -53
  1761. package/timepicker/reducer/timepicker.actions.js.map +0 -1
  1762. package/timepicker/reducer/timepicker.actions.metadata.json +0 -1
  1763. package/timepicker/reducer/timepicker.actions.ngfactory.js.map +0 -1
  1764. package/timepicker/reducer/timepicker.reducer.js +0 -90
  1765. package/timepicker/reducer/timepicker.reducer.js.map +0 -1
  1766. package/timepicker/reducer/timepicker.reducer.metadata.json +0 -1
  1767. package/timepicker/reducer/timepicker.store.js +0 -34
  1768. package/timepicker/reducer/timepicker.store.js.map +0 -1
  1769. package/timepicker/reducer/timepicker.store.metadata.json +0 -1
  1770. package/timepicker/reducer/timepicker.store.ngfactory.js.map +0 -1
  1771. package/timepicker/timepicker-controls.util.js +0 -122
  1772. package/timepicker/timepicker-controls.util.js.map +0 -1
  1773. package/timepicker/timepicker-controls.util.metadata.json +0 -1
  1774. package/timepicker/timepicker.component.html +0 -122
  1775. package/timepicker/timepicker.component.js +0 -288
  1776. package/timepicker/timepicker.component.js.map +0 -1
  1777. package/timepicker/timepicker.component.metadata.json +0 -1
  1778. package/timepicker/timepicker.component.ngfactory.js.map +0 -1
  1779. package/timepicker/timepicker.config.js +0 -36
  1780. package/timepicker/timepicker.config.js.map +0 -1
  1781. package/timepicker/timepicker.config.metadata.json +0 -1
  1782. package/timepicker/timepicker.config.ngfactory.js.map +0 -1
  1783. package/timepicker/timepicker.models.js +0 -1
  1784. package/timepicker/timepicker.models.js.map +0 -1
  1785. package/timepicker/timepicker.models.metadata.json +0 -1
  1786. package/timepicker/timepicker.module.js +0 -26
  1787. package/timepicker/timepicker.module.js.map +0 -1
  1788. package/timepicker/timepicker.module.metadata.json +0 -1
  1789. package/timepicker/timepicker.module.ngfactory.js.map +0 -1
  1790. package/timepicker/timepicker.utils.js +0 -141
  1791. package/timepicker/timepicker.utils.js.map +0 -1
  1792. package/timepicker/timepicker.utils.metadata.json +0 -1
  1793. package/tooltip/index.js +0 -5
  1794. package/tooltip/index.js.map +0 -1
  1795. package/tooltip/index.metadata.json +0 -1
  1796. package/tooltip/tooltip-container.component.js +0 -50
  1797. package/tooltip/tooltip-container.component.js.map +0 -1
  1798. package/tooltip/tooltip-container.component.metadata.json +0 -1
  1799. package/tooltip/tooltip-container.component.ngfactory.js.map +0 -1
  1800. package/tooltip/tooltip.config.js +0 -16
  1801. package/tooltip/tooltip.config.js.map +0 -1
  1802. package/tooltip/tooltip.config.metadata.json +0 -1
  1803. package/tooltip/tooltip.config.ngfactory.js.map +0 -1
  1804. package/tooltip/tooltip.directive.js +0 -315
  1805. package/tooltip/tooltip.directive.js.map +0 -1
  1806. package/tooltip/tooltip.directive.metadata.json +0 -1
  1807. package/tooltip/tooltip.directive.ngfactory.js.map +0 -1
  1808. package/tooltip/tooltip.module.js +0 -28
  1809. package/tooltip/tooltip.module.js.map +0 -1
  1810. package/tooltip/tooltip.module.metadata.json +0 -1
  1811. package/tooltip/tooltip.module.ngfactory.js.map +0 -1
  1812. package/tsconfig.spec.json +0 -41
  1813. package/typeahead/index.d.ts +0 -7
  1814. package/typeahead/index.js +0 -8
  1815. package/typeahead/index.js.map +0 -1
  1816. package/typeahead/index.metadata.json +0 -1
  1817. package/typeahead/latin-map.js +0 -828
  1818. package/typeahead/latin-map.js.map +0 -1
  1819. package/typeahead/latin-map.metadata.json +0 -1
  1820. package/typeahead/typeahead-container.component.html +0 -42
  1821. package/typeahead/typeahead-container.component.js +0 -240
  1822. package/typeahead/typeahead-container.component.js.map +0 -1
  1823. package/typeahead/typeahead-container.component.metadata.json +0 -1
  1824. package/typeahead/typeahead-container.component.ngfactory.js.map +0 -1
  1825. package/typeahead/typeahead-match.class.js +0 -18
  1826. package/typeahead/typeahead-match.class.js.map +0 -1
  1827. package/typeahead/typeahead-match.class.metadata.json +0 -1
  1828. package/typeahead/typeahead-options.class.js +0 -8
  1829. package/typeahead/typeahead-options.class.js.map +0 -1
  1830. package/typeahead/typeahead-options.class.metadata.json +0 -1
  1831. package/typeahead/typeahead-utils.js +0 -60
  1832. package/typeahead/typeahead-utils.js.map +0 -1
  1833. package/typeahead/typeahead-utils.metadata.json +0 -1
  1834. package/typeahead/typeahead.directive.js +0 -383
  1835. package/typeahead/typeahead.directive.js.map +0 -1
  1836. package/typeahead/typeahead.directive.metadata.json +0 -1
  1837. package/typeahead/typeahead.directive.ngfactory.js.map +0 -1
  1838. package/typeahead/typeahead.module.js +0 -27
  1839. package/typeahead/typeahead.module.js.map +0 -1
  1840. package/typeahead/typeahead.module.metadata.json +0 -1
  1841. package/typeahead/typeahead.module.ngfactory.js.map +0 -1
  1842. package/utils/decorators.js +0 -21
  1843. package/utils/decorators.js.map +0 -1
  1844. package/utils/decorators.metadata.json +0 -1
  1845. package/utils/facade/browser.js +0 -25
  1846. package/utils/facade/browser.js.map +0 -1
  1847. package/utils/facade/browser.metadata.json +0 -1
  1848. package/utils/index.d.ts +0 -6
  1849. package/utils/index.js +0 -7
  1850. package/utils/index.js.map +0 -1
  1851. package/utils/index.metadata.json +0 -1
  1852. package/utils/linked-list.class.js +0 -244
  1853. package/utils/linked-list.class.js.map +0 -1
  1854. package/utils/linked-list.class.metadata.json +0 -1
  1855. package/utils/theme-provider.js +0 -35
  1856. package/utils/theme-provider.js.map +0 -1
  1857. package/utils/theme-provider.metadata.json +0 -1
  1858. package/utils/trigger.class.js +0 -16
  1859. package/utils/trigger.class.js.map +0 -1
  1860. package/utils/trigger.class.metadata.json +0 -1
  1861. package/utils/triggers.js +0 -94
  1862. package/utils/triggers.js.map +0 -1
  1863. package/utils/triggers.metadata.json +0 -1
  1864. package/utils/utils.class.js +0 -25
  1865. package/utils/utils.class.js.map +0 -1
  1866. package/utils/utils.class.metadata.json +0 -1
  1867. package/utils/warn-once.js +0 -12
  1868. package/utils/warn-once.js.map +0 -1
  1869. package/utils/warn-once.metadata.json +0 -1
@@ -0,0 +1,3827 @@
1
+ import { Injectable, Component, EventEmitter, Directive, ElementRef, Input, Output, Renderer2, ViewContainerRef, ChangeDetectorRef, forwardRef, Host, ChangeDetectionStrategy, NgModule, ViewChild } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { filter, map } from 'rxjs/operators';
4
+ import { getFullYear, getMonth, getDay, isFirstDayOfWeek, isAfter, isBefore, shiftDate, endOf, startOf, getFirstDayOfMonth, formatDate, getLocale, isDisabledDay, isSameDay, isSameMonth, isSameYear, setFullDate, isArray, isDateValid, parseDate, isDate } from 'ngx-bootstrap/chronos';
5
+ import { MiniStore, MiniState } from 'ngx-bootstrap/mini-ngrx';
6
+ import { ComponentLoaderFactory } from 'ngx-bootstrap/component-loader';
7
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
8
+ import { CommonModule } from '@angular/common';
9
+ import { PositioningService } from 'ngx-bootstrap/positioning';
10
+ import { isBs3 } from 'ngx-bootstrap/utils';
11
+
12
+ /**
13
+ * @fileoverview added by tsickle
14
+ * @suppress {checkTypes} checked by tsc
15
+ */
16
+ /**
17
+ * For date range picker there are `BsDaterangepickerConfig` which inherits all properties,
18
+ * except `displayMonths`, for range picker it default to `2`
19
+ */
20
+ class BsDatepickerConfig {
21
+ constructor() {
22
+ /**
23
+ * CSS class which will be applied to datepicker container,
24
+ * usually used to set color theme
25
+ */
26
+ this.containerClass = 'theme-green';
27
+ // DatepickerRenderOptions
28
+ this.displayMonths = 1;
29
+ /**
30
+ * Allows to hide week numbers in datepicker
31
+ */
32
+ this.showWeekNumbers = true;
33
+ this.dateInputFormat = 'L';
34
+ // range picker
35
+ this.rangeSeparator = ' - ';
36
+ /**
37
+ * Date format for date range input field
38
+ */
39
+ this.rangeInputFormat = 'L';
40
+ // DatepickerFormatOptions
41
+ this.monthTitle = 'MMMM';
42
+ this.yearTitle = 'YYYY';
43
+ this.dayLabel = 'D';
44
+ this.monthLabel = 'MMMM';
45
+ this.yearLabel = 'YYYY';
46
+ this.weekNumbers = 'w';
47
+ }
48
+ }
49
+ BsDatepickerConfig.decorators = [
50
+ { type: Injectable }
51
+ ];
52
+
53
+ /**
54
+ * @fileoverview added by tsickle
55
+ * @suppress {checkTypes} checked by tsc
56
+ */
57
+ /**
58
+ * @abstract
59
+ */
60
+ class BsDatepickerAbstractComponent {
61
+ constructor() {
62
+ this._customRangesFish = [];
63
+ }
64
+ /**
65
+ * @param {?} value
66
+ * @return {?}
67
+ */
68
+ set minDate(value) {
69
+ this._effects.setMinDate(value);
70
+ }
71
+ /**
72
+ * @param {?} value
73
+ * @return {?}
74
+ */
75
+ set maxDate(value) {
76
+ this._effects.setMaxDate(value);
77
+ }
78
+ /**
79
+ * @param {?} value
80
+ * @return {?}
81
+ */
82
+ set daysDisabled(value) {
83
+ this._effects.setDaysDisabled(value);
84
+ }
85
+ /**
86
+ * @param {?} value
87
+ * @return {?}
88
+ */
89
+ set isDisabled(value) {
90
+ this._effects.setDisabled(value);
91
+ }
92
+ /**
93
+ * @param {?} event
94
+ * @return {?}
95
+ */
96
+ setViewMode(event) { }
97
+ /**
98
+ * @param {?} event
99
+ * @return {?}
100
+ */
101
+ navigateTo(event) { }
102
+ /**
103
+ * @param {?} event
104
+ * @return {?}
105
+ */
106
+ dayHoverHandler(event) { }
107
+ /**
108
+ * @param {?} event
109
+ * @return {?}
110
+ */
111
+ monthHoverHandler(event) { }
112
+ /**
113
+ * @param {?} event
114
+ * @return {?}
115
+ */
116
+ yearHoverHandler(event) { }
117
+ /**
118
+ * @param {?} day
119
+ * @return {?}
120
+ */
121
+ daySelectHandler(day) { }
122
+ /**
123
+ * @param {?} event
124
+ * @return {?}
125
+ */
126
+ monthSelectHandler(event) { }
127
+ /**
128
+ * @param {?} event
129
+ * @return {?}
130
+ */
131
+ yearSelectHandler(event) { }
132
+ /**
133
+ * @param {?} event
134
+ * @return {?}
135
+ */
136
+ _stopPropagation(event) {
137
+ event.stopPropagation();
138
+ }
139
+ }
140
+
141
+ /**
142
+ * @fileoverview added by tsickle
143
+ * @suppress {checkTypes} checked by tsc
144
+ */
145
+ class BsDatepickerActions {
146
+ /**
147
+ * @return {?}
148
+ */
149
+ calculate() {
150
+ return { type: BsDatepickerActions.CALCULATE };
151
+ }
152
+ /**
153
+ * @return {?}
154
+ */
155
+ format() {
156
+ return { type: BsDatepickerActions.FORMAT };
157
+ }
158
+ /**
159
+ * @return {?}
160
+ */
161
+ flag() {
162
+ return { type: BsDatepickerActions.FLAG };
163
+ }
164
+ /**
165
+ * @param {?} date
166
+ * @return {?}
167
+ */
168
+ select(date) {
169
+ return {
170
+ type: BsDatepickerActions.SELECT,
171
+ payload: date
172
+ };
173
+ }
174
+ /**
175
+ * @param {?} event
176
+ * @return {?}
177
+ */
178
+ changeViewMode(event) {
179
+ return {
180
+ type: BsDatepickerActions.CHANGE_VIEWMODE,
181
+ payload: event
182
+ };
183
+ }
184
+ /**
185
+ * @param {?} event
186
+ * @return {?}
187
+ */
188
+ navigateTo(event) {
189
+ return {
190
+ type: BsDatepickerActions.NAVIGATE_TO,
191
+ payload: event
192
+ };
193
+ }
194
+ /**
195
+ * @param {?} step
196
+ * @return {?}
197
+ */
198
+ navigateStep(step) {
199
+ return {
200
+ type: BsDatepickerActions.NAVIGATE_OFFSET,
201
+ payload: step
202
+ };
203
+ }
204
+ /**
205
+ * @param {?} options
206
+ * @return {?}
207
+ */
208
+ setOptions(options) {
209
+ return {
210
+ type: BsDatepickerActions.SET_OPTIONS,
211
+ payload: options
212
+ };
213
+ }
214
+ /**
215
+ * @param {?} value
216
+ * @return {?}
217
+ */
218
+ selectRange(value) {
219
+ return {
220
+ type: BsDatepickerActions.SELECT_RANGE,
221
+ payload: value
222
+ };
223
+ }
224
+ /**
225
+ * @param {?} event
226
+ * @return {?}
227
+ */
228
+ hoverDay(event) {
229
+ return {
230
+ type: BsDatepickerActions.HOVER,
231
+ payload: event.isHovered ? event.cell.date : null
232
+ };
233
+ }
234
+ /**
235
+ * @param {?} date
236
+ * @return {?}
237
+ */
238
+ minDate(date) {
239
+ return {
240
+ type: BsDatepickerActions.SET_MIN_DATE,
241
+ payload: date
242
+ };
243
+ }
244
+ /**
245
+ * @param {?} date
246
+ * @return {?}
247
+ */
248
+ maxDate(date) {
249
+ return {
250
+ type: BsDatepickerActions.SET_MAX_DATE,
251
+ payload: date
252
+ };
253
+ }
254
+ /**
255
+ * @param {?} days
256
+ * @return {?}
257
+ */
258
+ daysDisabled(days) {
259
+ return {
260
+ type: BsDatepickerActions.SET_DAYSDISABLED,
261
+ payload: days
262
+ };
263
+ }
264
+ /**
265
+ * @param {?} value
266
+ * @return {?}
267
+ */
268
+ isDisabled(value) {
269
+ return {
270
+ type: BsDatepickerActions.SET_IS_DISABLED,
271
+ payload: value
272
+ };
273
+ }
274
+ /**
275
+ * @param {?} locale
276
+ * @return {?}
277
+ */
278
+ setLocale(locale) {
279
+ return {
280
+ type: BsDatepickerActions.SET_LOCALE,
281
+ payload: locale
282
+ };
283
+ }
284
+ }
285
+ BsDatepickerActions.CALCULATE = '[datepicker] calculate dates matrix';
286
+ BsDatepickerActions.FORMAT = '[datepicker] format datepicker values';
287
+ BsDatepickerActions.FLAG = '[datepicker] set flags';
288
+ BsDatepickerActions.SELECT = '[datepicker] select date';
289
+ BsDatepickerActions.NAVIGATE_OFFSET = '[datepicker] shift view date';
290
+ BsDatepickerActions.NAVIGATE_TO = '[datepicker] change view date';
291
+ BsDatepickerActions.SET_OPTIONS = '[datepicker] update render options';
292
+ BsDatepickerActions.HOVER = '[datepicker] hover date';
293
+ BsDatepickerActions.CHANGE_VIEWMODE = '[datepicker] switch view mode';
294
+ BsDatepickerActions.SET_MIN_DATE = '[datepicker] set min date';
295
+ BsDatepickerActions.SET_MAX_DATE = '[datepicker] set max date';
296
+ BsDatepickerActions.SET_DAYSDISABLED = '[datepicker] set days disabled';
297
+ BsDatepickerActions.SET_IS_DISABLED = '[datepicker] set is disabled';
298
+ BsDatepickerActions.SET_LOCALE = '[datepicker] set datepicker locale';
299
+ BsDatepickerActions.SELECT_RANGE = '[daterangepicker] select dates range';
300
+ BsDatepickerActions.decorators = [
301
+ { type: Injectable }
302
+ ];
303
+
304
+ /**
305
+ * @fileoverview added by tsickle
306
+ * @suppress {checkTypes} checked by tsc
307
+ */
308
+ class BsLocaleService {
309
+ constructor() {
310
+ this._defaultLocale = 'en';
311
+ this._locale = new BehaviorSubject(this._defaultLocale);
312
+ this._localeChange = this._locale.asObservable();
313
+ }
314
+ /**
315
+ * @return {?}
316
+ */
317
+ get locale() {
318
+ return this._locale;
319
+ }
320
+ /**
321
+ * @return {?}
322
+ */
323
+ get localeChange() {
324
+ return this._localeChange;
325
+ }
326
+ /**
327
+ * @return {?}
328
+ */
329
+ get currentLocale() {
330
+ return this._locale.getValue();
331
+ }
332
+ /**
333
+ * @param {?} locale
334
+ * @return {?}
335
+ */
336
+ use(locale) {
337
+ if (locale === this.currentLocale) {
338
+ return;
339
+ }
340
+ this._locale.next(locale);
341
+ }
342
+ }
343
+ BsLocaleService.decorators = [
344
+ { type: Injectable }
345
+ ];
346
+
347
+ /**
348
+ * @fileoverview added by tsickle
349
+ * @suppress {checkTypes} checked by tsc
350
+ */
351
+ class BsDatepickerEffects {
352
+ /**
353
+ * @param {?} _actions
354
+ * @param {?} _localeService
355
+ */
356
+ constructor(_actions, _localeService) {
357
+ this._actions = _actions;
358
+ this._localeService = _localeService;
359
+ this._subs = [];
360
+ }
361
+ /**
362
+ * @param {?} _bsDatepickerStore
363
+ * @return {?}
364
+ */
365
+ init(_bsDatepickerStore) {
366
+ this._store = _bsDatepickerStore;
367
+ return this;
368
+ }
369
+ /**
370
+ * setters
371
+ * @param {?} value
372
+ * @return {?}
373
+ */
374
+ setValue(value) {
375
+ this._store.dispatch(this._actions.select(value));
376
+ }
377
+ /**
378
+ * @param {?} value
379
+ * @return {?}
380
+ */
381
+ setRangeValue(value) {
382
+ this._store.dispatch(this._actions.selectRange(value));
383
+ }
384
+ /**
385
+ * @param {?} value
386
+ * @return {?}
387
+ */
388
+ setMinDate(value) {
389
+ this._store.dispatch(this._actions.minDate(value));
390
+ return this;
391
+ }
392
+ /**
393
+ * @param {?} value
394
+ * @return {?}
395
+ */
396
+ setMaxDate(value) {
397
+ this._store.dispatch(this._actions.maxDate(value));
398
+ return this;
399
+ }
400
+ /**
401
+ * @param {?} value
402
+ * @return {?}
403
+ */
404
+ setDaysDisabled(value) {
405
+ this._store.dispatch(this._actions.daysDisabled(value));
406
+ return this;
407
+ }
408
+ /**
409
+ * @param {?} value
410
+ * @return {?}
411
+ */
412
+ setDisabled(value) {
413
+ this._store.dispatch(this._actions.isDisabled(value));
414
+ return this;
415
+ }
416
+ /**
417
+ * @param {?} _config
418
+ * @return {?}
419
+ */
420
+ setOptions(_config) {
421
+ const /** @type {?} */ _options = Object.assign({ locale: this._localeService.currentLocale }, _config);
422
+ this._store.dispatch(this._actions.setOptions(_options));
423
+ return this;
424
+ }
425
+ /**
426
+ * view to mode bindings
427
+ * @param {?} container
428
+ * @return {?}
429
+ */
430
+ setBindings(container) {
431
+ container.daysCalendar = this._store
432
+ .select(state => state.flaggedMonths)
433
+ .pipe(filter(months => !!months));
434
+ // month calendar
435
+ container.monthsCalendar = this._store
436
+ .select(state => state.flaggedMonthsCalendar)
437
+ .pipe(filter(months => !!months));
438
+ // year calendar
439
+ container.yearsCalendar = this._store
440
+ .select(state => state.yearsCalendarFlagged)
441
+ .pipe(filter(years => !!years));
442
+ container.viewMode = this._store.select(state => state.view.mode);
443
+ container.options = this._store
444
+ .select(state => state.showWeekNumbers)
445
+ .pipe(map(showWeekNumbers => ({ showWeekNumbers })));
446
+ return this;
447
+ }
448
+ /**
449
+ * event handlers
450
+ * @param {?} container
451
+ * @return {?}
452
+ */
453
+ setEventHandlers(container) {
454
+ container.setViewMode = (event) => {
455
+ this._store.dispatch(this._actions.changeViewMode(event));
456
+ };
457
+ container.navigateTo = (event) => {
458
+ this._store.dispatch(this._actions.navigateStep(event.step));
459
+ };
460
+ container.dayHoverHandler = (event) => {
461
+ const /** @type {?} */ _cell = /** @type {?} */ (event.cell);
462
+ if (_cell.isOtherMonth || _cell.isDisabled) {
463
+ return;
464
+ }
465
+ this._store.dispatch(this._actions.hoverDay(event));
466
+ _cell.isHovered = event.isHovered;
467
+ };
468
+ container.monthHoverHandler = (event) => {
469
+ event.cell.isHovered = event.isHovered;
470
+ };
471
+ container.yearHoverHandler = (event) => {
472
+ event.cell.isHovered = event.isHovered;
473
+ };
474
+ container.monthSelectHandler = (event) => {
475
+ if (event.isDisabled) {
476
+ return;
477
+ }
478
+ this._store.dispatch(this._actions.navigateTo({
479
+ unit: {
480
+ month: getMonth(event.date),
481
+ year: getFullYear(event.date)
482
+ },
483
+ viewMode: 'day'
484
+ }));
485
+ };
486
+ container.yearSelectHandler = (event) => {
487
+ if (event.isDisabled) {
488
+ return;
489
+ }
490
+ this._store.dispatch(this._actions.navigateTo({
491
+ unit: {
492
+ year: getFullYear(event.date)
493
+ },
494
+ viewMode: 'month'
495
+ }));
496
+ };
497
+ return this;
498
+ }
499
+ /**
500
+ * @return {?}
501
+ */
502
+ registerDatepickerSideEffects() {
503
+ this._subs.push(this._store.select(state => state.view).subscribe(view => {
504
+ this._store.dispatch(this._actions.calculate());
505
+ }));
506
+ // format calendar values on month model change
507
+ this._subs.push(this._store
508
+ .select(state => state.monthsModel)
509
+ .pipe(filter(monthModel => !!monthModel))
510
+ .subscribe(month => this._store.dispatch(this._actions.format())));
511
+ // flag day values
512
+ this._subs.push(this._store
513
+ .select(state => state.formattedMonths)
514
+ .pipe(filter(month => !!month))
515
+ .subscribe(month => this._store.dispatch(this._actions.flag())));
516
+ // flag day values
517
+ this._subs.push(this._store
518
+ .select(state => state.selectedDate)
519
+ .pipe(filter(selectedDate => !!selectedDate))
520
+ .subscribe(selectedDate => this._store.dispatch(this._actions.flag())));
521
+ // flag for date range picker
522
+ this._subs.push(this._store
523
+ .select(state => state.selectedRange)
524
+ .pipe(filter(selectedRange => !!selectedRange))
525
+ .subscribe(selectedRange => this._store.dispatch(this._actions.flag())));
526
+ // monthsCalendar
527
+ this._subs.push(this._store
528
+ .select(state => state.monthsCalendar)
529
+ .subscribe(() => this._store.dispatch(this._actions.flag())));
530
+ // years calendar
531
+ this._subs.push(this._store
532
+ .select(state => state.yearsCalendarModel)
533
+ .pipe(filter(state => !!state))
534
+ .subscribe(() => this._store.dispatch(this._actions.flag())));
535
+ // on hover
536
+ this._subs.push(this._store
537
+ .select(state => state.hoveredDate)
538
+ .pipe(filter(hoveredDate => !!hoveredDate))
539
+ .subscribe(hoveredDate => this._store.dispatch(this._actions.flag())));
540
+ // on locale change
541
+ this._subs.push(this._localeService.localeChange
542
+ .subscribe(locale => this._store.dispatch(this._actions.setLocale(locale))));
543
+ return this;
544
+ }
545
+ /**
546
+ * @return {?}
547
+ */
548
+ destroy() {
549
+ for (const /** @type {?} */ sub of this._subs) {
550
+ sub.unsubscribe();
551
+ }
552
+ }
553
+ }
554
+ BsDatepickerEffects.decorators = [
555
+ { type: Injectable }
556
+ ];
557
+ /** @nocollapse */
558
+ BsDatepickerEffects.ctorParameters = () => [
559
+ { type: BsDatepickerActions, },
560
+ { type: BsLocaleService, },
561
+ ];
562
+
563
+ /**
564
+ * @fileoverview added by tsickle
565
+ * @suppress {checkTypes} checked by tsc
566
+ */
567
+ const /** @type {?} */ defaultMonthOptions = {
568
+ width: 7,
569
+ height: 6
570
+ };
571
+
572
+ /**
573
+ * @fileoverview added by tsickle
574
+ * @suppress {checkTypes} checked by tsc
575
+ */
576
+ const /** @type {?} */ _initialView = { date: new Date(), mode: 'day' };
577
+ const /** @type {?} */ initialDatepickerState = Object.assign(new BsDatepickerConfig(), {
578
+ locale: 'en',
579
+ view: _initialView,
580
+ selectedRange: [],
581
+ monthViewOptions: defaultMonthOptions
582
+ });
583
+
584
+ /**
585
+ * @fileoverview added by tsickle
586
+ * @suppress {checkTypes} checked by tsc
587
+ */
588
+ /**
589
+ * @param {?} date
590
+ * @param {?} options
591
+ * @return {?}
592
+ */
593
+ function getStartingDayOfCalendar(date, options) {
594
+ if (isFirstDayOfWeek(date, options.firstDayOfWeek)) {
595
+ return date;
596
+ }
597
+ const /** @type {?} */ weekDay = getDay(date);
598
+ const /** @type {?} */ offset = calculateDateOffset(weekDay, options.firstDayOfWeek);
599
+ return shiftDate(date, { day: -offset });
600
+ }
601
+ /**
602
+ * @param {?} weekday
603
+ * @param {?} startingDayOffset
604
+ * @return {?}
605
+ */
606
+ function calculateDateOffset(weekday, startingDayOffset) {
607
+ if (startingDayOffset === 0) {
608
+ return weekday;
609
+ }
610
+ const /** @type {?} */ offset = weekday - startingDayOffset % 7;
611
+ return offset < 0 ? offset + 7 : offset;
612
+ }
613
+ /**
614
+ * @param {?} date
615
+ * @param {?} min
616
+ * @param {?} max
617
+ * @return {?}
618
+ */
619
+ function isMonthDisabled(date, min, max) {
620
+ const /** @type {?} */ minBound = min && isBefore(endOf(date, 'month'), min, 'day');
621
+ const /** @type {?} */ maxBound = max && isAfter(startOf(date, 'month'), max, 'day');
622
+ return minBound || maxBound;
623
+ }
624
+ /**
625
+ * @param {?} date
626
+ * @param {?} min
627
+ * @param {?} max
628
+ * @return {?}
629
+ */
630
+ function isYearDisabled(date, min, max) {
631
+ const /** @type {?} */ minBound = min && isBefore(endOf(date, 'year'), min, 'day');
632
+ const /** @type {?} */ maxBound = max && isAfter(startOf(date, 'year'), max, 'day');
633
+ return minBound || maxBound;
634
+ }
635
+
636
+ /**
637
+ * @fileoverview added by tsickle
638
+ * @suppress {checkTypes} checked by tsc
639
+ */
640
+ /**
641
+ * @template T
642
+ * @param {?} options
643
+ * @param {?} fn
644
+ * @return {?}
645
+ */
646
+ function createMatrix(options, fn) {
647
+ let /** @type {?} */ prevValue = options.initialDate;
648
+ const /** @type {?} */ matrix = new Array(options.height);
649
+ for (let /** @type {?} */ i = 0; i < options.height; i++) {
650
+ matrix[i] = new Array(options.width);
651
+ for (let /** @type {?} */ j = 0; j < options.width; j++) {
652
+ matrix[i][j] = fn(prevValue);
653
+ prevValue = shiftDate(prevValue, options.shift);
654
+ }
655
+ }
656
+ return matrix;
657
+ }
658
+
659
+ /**
660
+ * @fileoverview added by tsickle
661
+ * @suppress {checkTypes} checked by tsc
662
+ */
663
+ /**
664
+ * @param {?} startingDate
665
+ * @param {?} options
666
+ * @return {?}
667
+ */
668
+ function calcDaysCalendar(startingDate, options) {
669
+ const /** @type {?} */ firstDay = getFirstDayOfMonth(startingDate);
670
+ const /** @type {?} */ initialDate = getStartingDayOfCalendar(firstDay, options);
671
+ const /** @type {?} */ matrixOptions = {
672
+ width: options.width,
673
+ height: options.height,
674
+ initialDate,
675
+ shift: { day: 1 }
676
+ };
677
+ const /** @type {?} */ daysMatrix = createMatrix(matrixOptions, date => date);
678
+ return {
679
+ daysMatrix,
680
+ month: firstDay
681
+ };
682
+ }
683
+
684
+ /**
685
+ * @fileoverview added by tsickle
686
+ * @suppress {checkTypes} checked by tsc
687
+ */
688
+ /**
689
+ * @param {?} daysCalendar
690
+ * @param {?} formatOptions
691
+ * @param {?} monthIndex
692
+ * @return {?}
693
+ */
694
+ function formatDaysCalendar(daysCalendar, formatOptions, monthIndex) {
695
+ return {
696
+ month: daysCalendar.month,
697
+ monthTitle: formatDate(daysCalendar.month, formatOptions.monthTitle, formatOptions.locale),
698
+ yearTitle: formatDate(daysCalendar.month, formatOptions.yearTitle, formatOptions.locale),
699
+ weekNumbers: getWeekNumbers(daysCalendar.daysMatrix, formatOptions.weekNumbers, formatOptions.locale),
700
+ weekdays: getShiftedWeekdays(formatOptions.locale),
701
+ weeks: daysCalendar.daysMatrix.map((week, weekIndex) => ({
702
+ days: week.map((date, dayIndex) => ({
703
+ date,
704
+ label: formatDate(date, formatOptions.dayLabel, formatOptions.locale),
705
+ monthIndex,
706
+ weekIndex,
707
+ dayIndex
708
+ }))
709
+ }))
710
+ };
711
+ }
712
+ /**
713
+ * @param {?} daysMatrix
714
+ * @param {?} format
715
+ * @param {?} locale
716
+ * @return {?}
717
+ */
718
+ function getWeekNumbers(daysMatrix, format, locale) {
719
+ return daysMatrix.map((days) => (days[0] ? formatDate(days[0], format, locale) : ''));
720
+ }
721
+ /**
722
+ * @param {?} locale
723
+ * @return {?}
724
+ */
725
+ function getShiftedWeekdays(locale) {
726
+ const /** @type {?} */ _locale = getLocale(locale);
727
+ const /** @type {?} */ weekdays = /** @type {?} */ (_locale.weekdaysShort());
728
+ const /** @type {?} */ firstDayOfWeek = _locale.firstDayOfWeek();
729
+ return [...weekdays.slice(firstDayOfWeek), ...weekdays.slice(0, firstDayOfWeek)];
730
+ }
731
+
732
+ /**
733
+ * @fileoverview added by tsickle
734
+ * @suppress {checkTypes} checked by tsc
735
+ */
736
+ /**
737
+ * @param {?} formattedMonth
738
+ * @param {?} options
739
+ * @return {?}
740
+ */
741
+ function flagDaysCalendar(formattedMonth, options) {
742
+ formattedMonth.weeks.forEach((week) => {
743
+ /* tslint:disable-next-line: cyclomatic-complexity */
744
+ week.days.forEach((day, dayIndex) => {
745
+ // datepicker
746
+ const /** @type {?} */ isOtherMonth = !isSameMonth(day.date, formattedMonth.month);
747
+ const /** @type {?} */ isHovered = !isOtherMonth && isSameDay(day.date, options.hoveredDate);
748
+ // date range picker
749
+ const /** @type {?} */ isSelectionStart = !isOtherMonth &&
750
+ options.selectedRange &&
751
+ isSameDay(day.date, options.selectedRange[0]);
752
+ const /** @type {?} */ isSelectionEnd = !isOtherMonth &&
753
+ options.selectedRange &&
754
+ isSameDay(day.date, options.selectedRange[1]);
755
+ const /** @type {?} */ isSelected = (!isOtherMonth && isSameDay(day.date, options.selectedDate)) ||
756
+ isSelectionStart ||
757
+ isSelectionEnd;
758
+ const /** @type {?} */ isInRange = !isOtherMonth &&
759
+ options.selectedRange &&
760
+ isDateInRange(day.date, options.selectedRange, options.hoveredDate);
761
+ const /** @type {?} */ isDisabled = options.isDisabled ||
762
+ isBefore(day.date, options.minDate, 'day') ||
763
+ isAfter(day.date, options.maxDate, 'day') ||
764
+ isDisabledDay(day.date, options.daysDisabled);
765
+ const /** @type {?} */ currentDate = new Date();
766
+ const /** @type {?} */ isToday = !isOtherMonth && isSameDay(day.date, currentDate);
767
+ // decide update or not
768
+ const /** @type {?} */ newDay = Object.assign({}, day, {
769
+ isOtherMonth,
770
+ isHovered,
771
+ isSelected,
772
+ isSelectionStart,
773
+ isSelectionEnd,
774
+ isInRange,
775
+ isDisabled,
776
+ isToday
777
+ });
778
+ if (day.isOtherMonth !== newDay.isOtherMonth ||
779
+ day.isHovered !== newDay.isHovered ||
780
+ day.isSelected !== newDay.isSelected ||
781
+ day.isSelectionStart !== newDay.isSelectionStart ||
782
+ day.isSelectionEnd !== newDay.isSelectionEnd ||
783
+ day.isDisabled !== newDay.isDisabled ||
784
+ day.isInRange !== newDay.isInRange) {
785
+ week.days[dayIndex] = newDay;
786
+ }
787
+ });
788
+ });
789
+ // todo: add check for linked calendars
790
+ formattedMonth.hideLeftArrow =
791
+ options.isDisabled ||
792
+ (options.monthIndex > 0 && options.monthIndex !== options.displayMonths);
793
+ formattedMonth.hideRightArrow =
794
+ options.isDisabled ||
795
+ (options.monthIndex < options.displayMonths &&
796
+ options.monthIndex + 1 !== options.displayMonths);
797
+ formattedMonth.disableLeftArrow = isMonthDisabled(shiftDate(formattedMonth.month, { month: -1 }), options.minDate, options.maxDate);
798
+ formattedMonth.disableRightArrow = isMonthDisabled(shiftDate(formattedMonth.month, { month: 1 }), options.minDate, options.maxDate);
799
+ return formattedMonth;
800
+ }
801
+ /**
802
+ * @param {?} date
803
+ * @param {?} selectedRange
804
+ * @param {?} hoveredDate
805
+ * @return {?}
806
+ */
807
+ function isDateInRange(date, selectedRange, hoveredDate) {
808
+ if (!date || !selectedRange[0]) {
809
+ return false;
810
+ }
811
+ if (selectedRange[1]) {
812
+ return date > selectedRange[0] && date <= selectedRange[1];
813
+ }
814
+ if (hoveredDate) {
815
+ return date > selectedRange[0] && date <= hoveredDate;
816
+ }
817
+ return false;
818
+ }
819
+
820
+ /**
821
+ * @fileoverview added by tsickle
822
+ * @suppress {checkTypes} checked by tsc
823
+ */
824
+ /**
825
+ * @param {?} mode
826
+ * @param {?=} minMode
827
+ * @return {?}
828
+ */
829
+ function canSwitchMode(mode, minMode) {
830
+ return minMode ? mode >= minMode : true;
831
+ }
832
+
833
+ /**
834
+ * @fileoverview added by tsickle
835
+ * @suppress {checkTypes} checked by tsc
836
+ */
837
+ const /** @type {?} */ height = 4;
838
+ const /** @type {?} */ width = 3;
839
+ const /** @type {?} */ shift = { month: 1 };
840
+ /**
841
+ * @param {?} viewDate
842
+ * @param {?} formatOptions
843
+ * @return {?}
844
+ */
845
+ function formatMonthsCalendar(viewDate, formatOptions) {
846
+ const /** @type {?} */ initialDate = startOf(viewDate, 'year');
847
+ const /** @type {?} */ matrixOptions = { width, height, initialDate, shift };
848
+ const /** @type {?} */ monthMatrix = createMatrix(matrixOptions, date => ({
849
+ date,
850
+ label: formatDate(date, formatOptions.monthLabel, formatOptions.locale)
851
+ }));
852
+ return {
853
+ months: monthMatrix,
854
+ monthTitle: '',
855
+ yearTitle: formatDate(viewDate, formatOptions.yearTitle, formatOptions.locale)
856
+ };
857
+ }
858
+
859
+ /**
860
+ * @fileoverview added by tsickle
861
+ * @suppress {checkTypes} checked by tsc
862
+ */
863
+ /**
864
+ * @param {?} monthCalendar
865
+ * @param {?} options
866
+ * @return {?}
867
+ */
868
+ function flagMonthsCalendar(monthCalendar, options) {
869
+ monthCalendar.months.forEach((months, rowIndex) => {
870
+ months.forEach((month, monthIndex) => {
871
+ const /** @type {?} */ isHovered = isSameMonth(month.date, options.hoveredMonth);
872
+ const /** @type {?} */ isDisabled = options.isDisabled ||
873
+ isMonthDisabled(month.date, options.minDate, options.maxDate);
874
+ const /** @type {?} */ newMonth = Object.assign(/*{},*/ month, {
875
+ isHovered,
876
+ isDisabled
877
+ });
878
+ if (month.isHovered !== newMonth.isHovered ||
879
+ month.isDisabled !== newMonth.isDisabled) {
880
+ monthCalendar.months[rowIndex][monthIndex] = newMonth;
881
+ }
882
+ });
883
+ });
884
+ // todo: add check for linked calendars
885
+ monthCalendar.hideLeftArrow =
886
+ options.monthIndex > 0 && options.monthIndex !== options.displayMonths;
887
+ monthCalendar.hideRightArrow =
888
+ options.monthIndex < options.displayMonths &&
889
+ options.monthIndex + 1 !== options.displayMonths;
890
+ monthCalendar.disableLeftArrow = isYearDisabled(shiftDate(monthCalendar.months[0][0].date, { year: -1 }), options.minDate, options.maxDate);
891
+ monthCalendar.disableRightArrow = isYearDisabled(shiftDate(monthCalendar.months[0][0].date, { year: 1 }), options.minDate, options.maxDate);
892
+ return monthCalendar;
893
+ }
894
+
895
+ /**
896
+ * @fileoverview added by tsickle
897
+ * @suppress {checkTypes} checked by tsc
898
+ */
899
+ const /** @type {?} */ height$1 = 4;
900
+ const /** @type {?} */ width$1 = 4;
901
+ const /** @type {?} */ yearsPerCalendar = height$1 * width$1;
902
+ const /** @type {?} */ initialShift = (Math.floor(yearsPerCalendar / 2) - 1) * -1;
903
+ const /** @type {?} */ shift$1 = { year: 1 };
904
+ /**
905
+ * @param {?} viewDate
906
+ * @param {?} formatOptions
907
+ * @return {?}
908
+ */
909
+ function formatYearsCalendar(viewDate, formatOptions) {
910
+ const /** @type {?} */ initialDate = shiftDate(viewDate, { year: initialShift });
911
+ const /** @type {?} */ matrixOptions = { width: width$1, height: height$1, initialDate, shift: shift$1 };
912
+ const /** @type {?} */ yearsMatrix = createMatrix(matrixOptions, date => ({
913
+ date,
914
+ label: formatDate(date, formatOptions.yearLabel, formatOptions.locale)
915
+ }));
916
+ const /** @type {?} */ yearTitle = formatYearRangeTitle(yearsMatrix, formatOptions);
917
+ return {
918
+ years: yearsMatrix,
919
+ monthTitle: '',
920
+ yearTitle
921
+ };
922
+ }
923
+ /**
924
+ * @param {?} yearsMatrix
925
+ * @param {?} formatOptions
926
+ * @return {?}
927
+ */
928
+ function formatYearRangeTitle(yearsMatrix, formatOptions) {
929
+ const /** @type {?} */ from = formatDate(yearsMatrix[0][0].date, formatOptions.yearTitle, formatOptions.locale);
930
+ const /** @type {?} */ to = formatDate(yearsMatrix[height$1 - 1][width$1 - 1].date, formatOptions.yearTitle, formatOptions.locale);
931
+ return `${from} - ${to}`;
932
+ }
933
+
934
+ /**
935
+ * @fileoverview added by tsickle
936
+ * @suppress {checkTypes} checked by tsc
937
+ */
938
+ /**
939
+ * @param {?} yearsCalendar
940
+ * @param {?} options
941
+ * @return {?}
942
+ */
943
+ function flagYearsCalendar(yearsCalendar, options) {
944
+ yearsCalendar.years.forEach((years, rowIndex) => {
945
+ years.forEach((year, yearIndex) => {
946
+ const /** @type {?} */ isHovered = isSameYear(year.date, options.hoveredYear);
947
+ const /** @type {?} */ isDisabled = options.isDisabled ||
948
+ isYearDisabled(year.date, options.minDate, options.maxDate);
949
+ const /** @type {?} */ newMonth = Object.assign(/*{},*/ year, { isHovered, isDisabled });
950
+ if (year.isHovered !== newMonth.isHovered ||
951
+ year.isDisabled !== newMonth.isDisabled) {
952
+ yearsCalendar.years[rowIndex][yearIndex] = newMonth;
953
+ }
954
+ });
955
+ });
956
+ // todo: add check for linked calendars
957
+ yearsCalendar.hideLeftArrow =
958
+ options.yearIndex > 0 && options.yearIndex !== options.displayMonths;
959
+ yearsCalendar.hideRightArrow =
960
+ options.yearIndex < options.displayMonths &&
961
+ options.yearIndex + 1 !== options.displayMonths;
962
+ yearsCalendar.disableLeftArrow = isYearDisabled(shiftDate(yearsCalendar.years[0][0].date, { year: -1 }), options.minDate, options.maxDate);
963
+ const /** @type {?} */ i = yearsCalendar.years.length - 1;
964
+ const /** @type {?} */ j = yearsCalendar.years[i].length - 1;
965
+ yearsCalendar.disableRightArrow = isYearDisabled(shiftDate(yearsCalendar.years[i][j].date, { year: 1 }), options.minDate, options.maxDate);
966
+ return yearsCalendar;
967
+ }
968
+
969
+ /**
970
+ * @fileoverview added by tsickle
971
+ * @suppress {checkTypes} checked by tsc
972
+ */
973
+ /**
974
+ * @param {?=} state
975
+ * @param {?=} action
976
+ * @return {?}
977
+ */
978
+ function bsDatepickerReducer(state = initialDatepickerState, action) {
979
+ switch (action.type) {
980
+ case BsDatepickerActions.CALCULATE: {
981
+ return calculateReducer(state);
982
+ }
983
+ case BsDatepickerActions.FORMAT: {
984
+ return formatReducer(state, action);
985
+ }
986
+ case BsDatepickerActions.FLAG: {
987
+ return flagReducer(state, action);
988
+ }
989
+ case BsDatepickerActions.NAVIGATE_OFFSET: {
990
+ const /** @type {?} */ date = shiftDate(startOf(state.view.date, 'month'), action.payload);
991
+ const /** @type {?} */ newState = {
992
+ view: {
993
+ mode: state.view.mode,
994
+ date
995
+ }
996
+ };
997
+ return Object.assign({}, state, newState);
998
+ }
999
+ case BsDatepickerActions.NAVIGATE_TO: {
1000
+ const /** @type {?} */ payload = action.payload;
1001
+ const /** @type {?} */ date = setFullDate(state.view.date, payload.unit);
1002
+ let /** @type {?} */ newState;
1003
+ let /** @type {?} */ mode;
1004
+ if (canSwitchMode(payload.viewMode, state.minMode)) {
1005
+ mode = payload.viewMode;
1006
+ newState = { view: { date, mode } };
1007
+ }
1008
+ else {
1009
+ mode = state.view.mode;
1010
+ newState = { selectedDate: date, view: { date, mode } };
1011
+ }
1012
+ return Object.assign({}, state, newState);
1013
+ }
1014
+ case BsDatepickerActions.CHANGE_VIEWMODE: {
1015
+ if (!canSwitchMode(action.payload, state.minMode)) {
1016
+ return state;
1017
+ }
1018
+ const /** @type {?} */ date = state.view.date;
1019
+ const /** @type {?} */ mode = action.payload;
1020
+ const /** @type {?} */ newState = { view: { date, mode } };
1021
+ return Object.assign({}, state, newState);
1022
+ }
1023
+ case BsDatepickerActions.HOVER: {
1024
+ return Object.assign({}, state, { hoveredDate: action.payload });
1025
+ }
1026
+ case BsDatepickerActions.SELECT: {
1027
+ const /** @type {?} */ newState = {
1028
+ selectedDate: action.payload,
1029
+ view: state.view
1030
+ };
1031
+ const /** @type {?} */ mode = state.view.mode;
1032
+ const /** @type {?} */ _date = action.payload || state.view.date;
1033
+ const /** @type {?} */ date = getViewDate(_date, state.minDate, state.maxDate);
1034
+ newState.view = { mode, date };
1035
+ return Object.assign({}, state, newState);
1036
+ }
1037
+ case BsDatepickerActions.SET_OPTIONS: {
1038
+ const /** @type {?} */ newState = action.payload;
1039
+ // preserve view mode
1040
+ const /** @type {?} */ mode = newState.minMode ? newState.minMode : state.view.mode;
1041
+ const /** @type {?} */ _viewDate = isDateValid(newState.value) && newState.value
1042
+ || isArray(newState.value) && isDateValid(newState.value[0]) && newState.value[0]
1043
+ || state.view.date;
1044
+ const /** @type {?} */ date = getViewDate(_viewDate, newState.minDate, newState.maxDate);
1045
+ newState.view = { mode, date };
1046
+ // update selected value
1047
+ if (newState.value) {
1048
+ // if new value is array we work with date range
1049
+ if (isArray(newState.value)) {
1050
+ newState.selectedRange = newState.value;
1051
+ }
1052
+ // if new value is a date -> datepicker
1053
+ if (newState.value instanceof Date) {
1054
+ newState.selectedDate = newState.value;
1055
+ }
1056
+ // provided value is not supported :)
1057
+ // need to report it somehow
1058
+ }
1059
+ return Object.assign({}, state, newState);
1060
+ }
1061
+ // date range picker
1062
+ case BsDatepickerActions.SELECT_RANGE: {
1063
+ const /** @type {?} */ newState = {
1064
+ selectedRange: action.payload,
1065
+ view: state.view
1066
+ };
1067
+ const /** @type {?} */ mode = state.view.mode;
1068
+ const /** @type {?} */ _date = action.payload && action.payload[0] || state.view.date;
1069
+ const /** @type {?} */ date = getViewDate(_date, state.minDate, state.maxDate);
1070
+ newState.view = { mode, date };
1071
+ return Object.assign({}, state, newState);
1072
+ }
1073
+ case BsDatepickerActions.SET_MIN_DATE: {
1074
+ return Object.assign({}, state, {
1075
+ minDate: action.payload
1076
+ });
1077
+ }
1078
+ case BsDatepickerActions.SET_MAX_DATE: {
1079
+ return Object.assign({}, state, {
1080
+ maxDate: action.payload
1081
+ });
1082
+ }
1083
+ case BsDatepickerActions.SET_IS_DISABLED: {
1084
+ return Object.assign({}, state, {
1085
+ isDisabled: action.payload
1086
+ });
1087
+ }
1088
+ default:
1089
+ return state;
1090
+ }
1091
+ }
1092
+ /**
1093
+ * @param {?} state
1094
+ * @return {?}
1095
+ */
1096
+ function calculateReducer(state) {
1097
+ // how many calendars
1098
+ const /** @type {?} */ displayMonths = state.displayMonths;
1099
+ // use selected date on initial rendering if set
1100
+ let /** @type {?} */ viewDate = state.view.date;
1101
+ if (state.view.mode === 'day') {
1102
+ state.monthViewOptions.firstDayOfWeek = getLocale(state.locale).firstDayOfWeek();
1103
+ const /** @type {?} */ monthsModel = new Array(displayMonths);
1104
+ for (let /** @type {?} */ monthIndex = 0; monthIndex < displayMonths; monthIndex++) {
1105
+ // todo: for unlinked calendars it will be harder
1106
+ monthsModel[monthIndex] = calcDaysCalendar(viewDate, state.monthViewOptions);
1107
+ viewDate = shiftDate(viewDate, { month: 1 });
1108
+ }
1109
+ return Object.assign({}, state, { monthsModel });
1110
+ }
1111
+ if (state.view.mode === 'month') {
1112
+ const /** @type {?} */ monthsCalendar = new Array(displayMonths);
1113
+ for (let /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1114
+ // todo: for unlinked calendars it will be harder
1115
+ monthsCalendar[calendarIndex] = formatMonthsCalendar(viewDate, getFormatOptions(state));
1116
+ viewDate = shiftDate(viewDate, { year: 1 });
1117
+ }
1118
+ return Object.assign({}, state, { monthsCalendar });
1119
+ }
1120
+ if (state.view.mode === 'year') {
1121
+ const /** @type {?} */ yearsCalendarModel = new Array(displayMonths);
1122
+ for (let /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1123
+ // todo: for unlinked calendars it will be harder
1124
+ yearsCalendarModel[calendarIndex] = formatYearsCalendar(viewDate, getFormatOptions(state));
1125
+ viewDate = shiftDate(viewDate, { year: yearsPerCalendar });
1126
+ }
1127
+ return Object.assign({}, state, { yearsCalendarModel });
1128
+ }
1129
+ return state;
1130
+ }
1131
+ /**
1132
+ * @param {?} state
1133
+ * @param {?} action
1134
+ * @return {?}
1135
+ */
1136
+ function formatReducer(state, action) {
1137
+ if (state.view.mode === 'day') {
1138
+ const /** @type {?} */ formattedMonths = state.monthsModel.map((month, monthIndex) => formatDaysCalendar(month, getFormatOptions(state), monthIndex));
1139
+ return Object.assign({}, state, { formattedMonths });
1140
+ }
1141
+ // how many calendars
1142
+ const /** @type {?} */ displayMonths = state.displayMonths;
1143
+ // check initial rendering
1144
+ // use selected date on initial rendering if set
1145
+ let /** @type {?} */ viewDate = state.view.date;
1146
+ if (state.view.mode === 'month') {
1147
+ const /** @type {?} */ monthsCalendar = new Array(displayMonths);
1148
+ for (let /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1149
+ // todo: for unlinked calendars it will be harder
1150
+ monthsCalendar[calendarIndex] = formatMonthsCalendar(viewDate, getFormatOptions(state));
1151
+ viewDate = shiftDate(viewDate, { year: 1 });
1152
+ }
1153
+ return Object.assign({}, state, { monthsCalendar });
1154
+ }
1155
+ if (state.view.mode === 'year') {
1156
+ const /** @type {?} */ yearsCalendarModel = new Array(displayMonths);
1157
+ for (let /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1158
+ // todo: for unlinked calendars it will be harder
1159
+ yearsCalendarModel[calendarIndex] = formatYearsCalendar(viewDate, getFormatOptions(state));
1160
+ viewDate = shiftDate(viewDate, { year: 16 });
1161
+ }
1162
+ return Object.assign({}, state, { yearsCalendarModel });
1163
+ }
1164
+ return state;
1165
+ }
1166
+ /**
1167
+ * @param {?} state
1168
+ * @param {?} action
1169
+ * @return {?}
1170
+ */
1171
+ function flagReducer(state, action) {
1172
+ if (state.view.mode === 'day') {
1173
+ const /** @type {?} */ flaggedMonths = state.formattedMonths.map((formattedMonth, monthIndex) => flagDaysCalendar(formattedMonth, {
1174
+ isDisabled: state.isDisabled,
1175
+ minDate: state.minDate,
1176
+ maxDate: state.maxDate,
1177
+ daysDisabled: state.daysDisabled,
1178
+ hoveredDate: state.hoveredDate,
1179
+ selectedDate: state.selectedDate,
1180
+ selectedRange: state.selectedRange,
1181
+ displayMonths: state.displayMonths,
1182
+ monthIndex
1183
+ }));
1184
+ return Object.assign({}, state, { flaggedMonths });
1185
+ }
1186
+ if (state.view.mode === 'month') {
1187
+ const /** @type {?} */ flaggedMonthsCalendar = state.monthsCalendar.map((formattedMonth, monthIndex) => flagMonthsCalendar(formattedMonth, {
1188
+ isDisabled: state.isDisabled,
1189
+ minDate: state.minDate,
1190
+ maxDate: state.maxDate,
1191
+ hoveredMonth: state.hoveredMonth,
1192
+ displayMonths: state.displayMonths,
1193
+ monthIndex
1194
+ }));
1195
+ return Object.assign({}, state, { flaggedMonthsCalendar });
1196
+ }
1197
+ if (state.view.mode === 'year') {
1198
+ const /** @type {?} */ yearsCalendarFlagged = state.yearsCalendarModel.map((formattedMonth, yearIndex) => flagYearsCalendar(formattedMonth, {
1199
+ isDisabled: state.isDisabled,
1200
+ minDate: state.minDate,
1201
+ maxDate: state.maxDate,
1202
+ hoveredYear: state.hoveredYear,
1203
+ displayMonths: state.displayMonths,
1204
+ yearIndex
1205
+ }));
1206
+ return Object.assign({}, state, { yearsCalendarFlagged });
1207
+ }
1208
+ return state;
1209
+ }
1210
+ /**
1211
+ * @param {?} state
1212
+ * @return {?}
1213
+ */
1214
+ function getFormatOptions(state) {
1215
+ return {
1216
+ locale: state.locale,
1217
+ monthTitle: state.monthTitle,
1218
+ yearTitle: state.yearTitle,
1219
+ dayLabel: state.dayLabel,
1220
+ monthLabel: state.monthLabel,
1221
+ yearLabel: state.yearLabel,
1222
+ weekNumbers: state.weekNumbers
1223
+ };
1224
+ }
1225
+ /**
1226
+ * if view date is provided (bsValue|ngModel) it should be shown
1227
+ * if view date is not provider:
1228
+ * if minDate>currentDate (default view value), show minDate
1229
+ * if maxDate<currentDate(default view value) show maxDate
1230
+ * @param {?} viewDate
1231
+ * @param {?} minDate
1232
+ * @param {?} maxDate
1233
+ * @return {?}
1234
+ */
1235
+ function getViewDate(viewDate, minDate, maxDate) {
1236
+ const /** @type {?} */ _date = Array.isArray(viewDate) ? viewDate[0] : viewDate;
1237
+ if (minDate && isAfter(minDate, _date, 'day')) {
1238
+ return minDate;
1239
+ }
1240
+ if (maxDate && isBefore(maxDate, _date, 'day')) {
1241
+ return maxDate;
1242
+ }
1243
+ return _date;
1244
+ }
1245
+
1246
+ /**
1247
+ * @fileoverview added by tsickle
1248
+ * @suppress {checkTypes} checked by tsc
1249
+ */
1250
+ class BsDatepickerStore extends MiniStore {
1251
+ constructor() {
1252
+ const /** @type {?} */ _dispatcher = new BehaviorSubject({
1253
+ type: '[datepicker] dispatcher init'
1254
+ });
1255
+ const /** @type {?} */ state = new MiniState(initialDatepickerState, _dispatcher, bsDatepickerReducer);
1256
+ super(_dispatcher, bsDatepickerReducer, state);
1257
+ }
1258
+ }
1259
+ BsDatepickerStore.decorators = [
1260
+ { type: Injectable }
1261
+ ];
1262
+ /** @nocollapse */
1263
+ BsDatepickerStore.ctorParameters = () => [];
1264
+
1265
+ /**
1266
+ * @fileoverview added by tsickle
1267
+ * @suppress {checkTypes} checked by tsc
1268
+ */
1269
+ class BsDatepickerContainerComponent extends BsDatepickerAbstractComponent {
1270
+ /**
1271
+ * @param {?} _config
1272
+ * @param {?} _store
1273
+ * @param {?} _actions
1274
+ * @param {?} _effects
1275
+ */
1276
+ constructor(_config, _store, _actions, _effects) {
1277
+ super();
1278
+ this._config = _config;
1279
+ this._store = _store;
1280
+ this._actions = _actions;
1281
+ this.valueChange = new EventEmitter();
1282
+ this._subs = [];
1283
+ this._effects = _effects;
1284
+ }
1285
+ /**
1286
+ * @param {?} value
1287
+ * @return {?}
1288
+ */
1289
+ set value(value) {
1290
+ this._effects.setValue(value);
1291
+ }
1292
+ /**
1293
+ * @return {?}
1294
+ */
1295
+ ngOnInit() {
1296
+ this.isOtherMonthsActive = this._config.selectFromOtherMonth;
1297
+ this.containerClass = this._config.containerClass;
1298
+ this._effects
1299
+ .init(this._store)
1300
+ .setOptions(this._config)
1301
+ .setBindings(this)
1302
+ .setEventHandlers(this)
1303
+ .registerDatepickerSideEffects();
1304
+ // todo: move it somewhere else
1305
+ // on selected date change
1306
+ this._subs.push(this._store
1307
+ .select((state) => state.selectedDate)
1308
+ .subscribe((date) => this.valueChange.emit(date)));
1309
+ }
1310
+ /**
1311
+ * @param {?} day
1312
+ * @return {?}
1313
+ */
1314
+ daySelectHandler(day) {
1315
+ const /** @type {?} */ isDisabled = this.isOtherMonthsActive ? day.isDisabled : (day.isOtherMonth || day.isDisabled);
1316
+ if (isDisabled) {
1317
+ return;
1318
+ }
1319
+ this._store.dispatch(this._actions.select(day.date));
1320
+ }
1321
+ /**
1322
+ * @return {?}
1323
+ */
1324
+ ngOnDestroy() {
1325
+ for (const /** @type {?} */ sub of this._subs) {
1326
+ sub.unsubscribe();
1327
+ }
1328
+ this._effects.destroy();
1329
+ }
1330
+ }
1331
+ BsDatepickerContainerComponent.decorators = [
1332
+ { type: Component, args: [{
1333
+ selector: 'bs-datepicker-container',
1334
+ providers: [BsDatepickerStore, BsDatepickerEffects],
1335
+ template: "<!-- days calendar view mode -->\n<div class=\"bs-datepicker\" [ngClass]=\"containerClass\" *ngIf=\"viewMode | async\">\n <div class=\"bs-datepicker-container\">\n\n <!--calendars-->\n <div class=\"bs-calendar-container\" [ngSwitch]=\"viewMode | async\" role=\"application\">\n <!--days calendar-->\n <div *ngSwitchCase=\"'day'\" class=\"bs-media-container\">\n <bs-days-calendar-view\n *ngFor=\"let calendar of (daysCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n [options]=\"options | async\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"dayHoverHandler($event)\"\n (onSelect)=\"daySelectHandler($event)\"\n ></bs-days-calendar-view>\n </div>\n\n <!--months calendar-->\n <div *ngSwitchCase=\"'month'\" class=\"bs-media-container\">\n <bs-month-calendar-view\n *ngFor=\"let calendar of (monthsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"monthHoverHandler($event)\"\n (onSelect)=\"monthSelectHandler($event)\"\n ></bs-month-calendar-view>\n </div>\n\n <!--years calendar-->\n <div *ngSwitchCase=\"'year'\" class=\"bs-media-container\">\n <bs-years-calendar-view\n *ngFor=\"let calendar of (yearsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async )?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"yearHoverHandler($event)\"\n (onSelect)=\"yearSelectHandler($event)\"\n ></bs-years-calendar-view>\n </div>\n\n </div>\n\n <!--applycancel buttons-->\n <div class=\"bs-datepicker-buttons\" *ngIf=\"false\">\n <button class=\"btn btn-success\">Apply</button>\n <button class=\"btn btn-default\">Cancel</button>\n </div>\n\n </div>\n\n <!--custom dates or date ranges picker-->\n <div class=\"bs-datepicker-custom-range\" *ngIf=\"false\">\n <bs-custom-date-view [ranges]=\"_customRangesFish\"></bs-custom-date-view>\n </div>\n</div>\n",
1336
+ host: {
1337
+ '(click)': '_stopPropagation($event)',
1338
+ style: 'position: absolute; display: block;',
1339
+ role: 'dialog',
1340
+ 'aria-label': 'calendar'
1341
+ }
1342
+ }] }
1343
+ ];
1344
+ /** @nocollapse */
1345
+ BsDatepickerContainerComponent.ctorParameters = () => [
1346
+ { type: BsDatepickerConfig, },
1347
+ { type: BsDatepickerStore, },
1348
+ { type: BsDatepickerActions, },
1349
+ { type: BsDatepickerEffects, },
1350
+ ];
1351
+
1352
+ /**
1353
+ * @fileoverview added by tsickle
1354
+ * @suppress {checkTypes} checked by tsc
1355
+ */
1356
+ class BsDatepickerDirective {
1357
+ /**
1358
+ * @param {?} _config
1359
+ * @param {?} _elementRef
1360
+ * @param {?} _renderer
1361
+ * @param {?} _viewContainerRef
1362
+ * @param {?} cis
1363
+ */
1364
+ constructor(_config, _elementRef, _renderer, _viewContainerRef, cis) {
1365
+ this._config = _config;
1366
+ /**
1367
+ * Placement of a datepicker. Accepts: "top", "bottom", "left", "right"
1368
+ */
1369
+ this.placement = 'bottom';
1370
+ /**
1371
+ * Specifies events that should trigger. Supports a space separated list of
1372
+ * event names.
1373
+ */
1374
+ this.triggers = 'click';
1375
+ /**
1376
+ * Close datepicker on outside click
1377
+ */
1378
+ this.outsideClick = true;
1379
+ /**
1380
+ * A selector specifying the element the datepicker should be appended to.
1381
+ * Currently only supports "body".
1382
+ */
1383
+ this.container = 'body';
1384
+ this.outsideEsc = true;
1385
+ /**
1386
+ * Emits when datepicker value has been changed
1387
+ */
1388
+ this.bsValueChange = new EventEmitter();
1389
+ this._subs = [];
1390
+ // todo: assign only subset of fields
1391
+ Object.assign(this, this._config);
1392
+ this._datepicker = cis.createLoader(_elementRef, _viewContainerRef, _renderer);
1393
+ this.onShown = this._datepicker.onShown;
1394
+ this.onHidden = this._datepicker.onHidden;
1395
+ }
1396
+ /**
1397
+ * Returns whether or not the datepicker is currently being shown
1398
+ * @return {?}
1399
+ */
1400
+ get isOpen() {
1401
+ return this._datepicker.isShown;
1402
+ }
1403
+ /**
1404
+ * @param {?} value
1405
+ * @return {?}
1406
+ */
1407
+ set isOpen(value) {
1408
+ if (value) {
1409
+ this.show();
1410
+ }
1411
+ else {
1412
+ this.hide();
1413
+ }
1414
+ }
1415
+ /**
1416
+ * Initial value of datepicker
1417
+ * @param {?} value
1418
+ * @return {?}
1419
+ */
1420
+ set bsValue(value) {
1421
+ if (this._bsValue === value) {
1422
+ return;
1423
+ }
1424
+ this._bsValue = value;
1425
+ this.bsValueChange.emit(value);
1426
+ }
1427
+ /**
1428
+ * @return {?}
1429
+ */
1430
+ ngOnInit() {
1431
+ this._datepicker.listen({
1432
+ outsideClick: this.outsideClick,
1433
+ outsideEsc: this.outsideEsc,
1434
+ triggers: this.triggers,
1435
+ show: () => this.show()
1436
+ });
1437
+ this.setConfig();
1438
+ }
1439
+ /**
1440
+ * @param {?} changes
1441
+ * @return {?}
1442
+ */
1443
+ ngOnChanges(changes) {
1444
+ if (!this._datepickerRef || !this._datepickerRef.instance) {
1445
+ return;
1446
+ }
1447
+ if (changes["minDate"]) {
1448
+ this._datepickerRef.instance.minDate = this.minDate;
1449
+ }
1450
+ if (changes["maxDate"]) {
1451
+ this._datepickerRef.instance.maxDate = this.maxDate;
1452
+ }
1453
+ if (changes["daysDisabled"]) {
1454
+ this._datepickerRef.instance.daysDisabled = this.daysDisabled;
1455
+ }
1456
+ if (changes["isDisabled"]) {
1457
+ this._datepickerRef.instance.isDisabled = this.isDisabled;
1458
+ }
1459
+ }
1460
+ /**
1461
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
1462
+ * the datepicker.
1463
+ * @return {?}
1464
+ */
1465
+ show() {
1466
+ if (this._datepicker.isShown) {
1467
+ return;
1468
+ }
1469
+ this.setConfig();
1470
+ this._datepickerRef = this._datepicker
1471
+ .provide({ provide: BsDatepickerConfig, useValue: this._config })
1472
+ .attach(BsDatepickerContainerComponent)
1473
+ .to(this.container)
1474
+ .position({ attachment: this.placement })
1475
+ .show({ placement: this.placement });
1476
+ // if date changes from external source (model -> view)
1477
+ this._subs.push(this.bsValueChange.subscribe((value) => {
1478
+ this._datepickerRef.instance.value = value;
1479
+ }));
1480
+ // if date changes from picker (view -> model)
1481
+ this._subs.push(this._datepickerRef.instance.valueChange.subscribe((value) => {
1482
+ this.bsValue = value;
1483
+ this.hide();
1484
+ }));
1485
+ }
1486
+ /**
1487
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
1488
+ * the datepicker.
1489
+ * @return {?}
1490
+ */
1491
+ hide() {
1492
+ if (this.isOpen) {
1493
+ this._datepicker.hide();
1494
+ }
1495
+ for (const /** @type {?} */ sub of this._subs) {
1496
+ sub.unsubscribe();
1497
+ }
1498
+ }
1499
+ /**
1500
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
1501
+ * of the datepicker.
1502
+ * @return {?}
1503
+ */
1504
+ toggle() {
1505
+ if (this.isOpen) {
1506
+ return this.hide();
1507
+ }
1508
+ this.show();
1509
+ }
1510
+ /**
1511
+ * Set config for datepicker
1512
+ * @return {?}
1513
+ */
1514
+ setConfig() {
1515
+ this._config = Object.assign({}, this._config, this.bsConfig, {
1516
+ value: this._bsValue,
1517
+ isDisabled: this.isDisabled,
1518
+ minDate: this.minDate || this.bsConfig && this.bsConfig.minDate,
1519
+ maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate,
1520
+ daysDisabled: this.daysDisabled || this.bsConfig && this.bsConfig.daysDisabled,
1521
+ minMode: this.minMode || this.bsConfig && this.bsConfig.minMode
1522
+ });
1523
+ }
1524
+ /**
1525
+ * @return {?}
1526
+ */
1527
+ ngOnDestroy() {
1528
+ this._datepicker.dispose();
1529
+ }
1530
+ }
1531
+ BsDatepickerDirective.decorators = [
1532
+ { type: Directive, args: [{
1533
+ selector: '[bsDatepicker]',
1534
+ exportAs: 'bsDatepicker'
1535
+ },] }
1536
+ ];
1537
+ /** @nocollapse */
1538
+ BsDatepickerDirective.ctorParameters = () => [
1539
+ { type: BsDatepickerConfig, },
1540
+ { type: ElementRef, },
1541
+ { type: Renderer2, },
1542
+ { type: ViewContainerRef, },
1543
+ { type: ComponentLoaderFactory, },
1544
+ ];
1545
+ BsDatepickerDirective.propDecorators = {
1546
+ "placement": [{ type: Input },],
1547
+ "triggers": [{ type: Input },],
1548
+ "outsideClick": [{ type: Input },],
1549
+ "container": [{ type: Input },],
1550
+ "outsideEsc": [{ type: Input },],
1551
+ "isOpen": [{ type: Input },],
1552
+ "onShown": [{ type: Output },],
1553
+ "onHidden": [{ type: Output },],
1554
+ "bsValue": [{ type: Input },],
1555
+ "bsConfig": [{ type: Input },],
1556
+ "isDisabled": [{ type: Input },],
1557
+ "minDate": [{ type: Input },],
1558
+ "maxDate": [{ type: Input },],
1559
+ "minMode": [{ type: Input },],
1560
+ "daysDisabled": [{ type: Input },],
1561
+ "bsValueChange": [{ type: Output },],
1562
+ };
1563
+
1564
+ /**
1565
+ * @fileoverview added by tsickle
1566
+ * @suppress {checkTypes} checked by tsc
1567
+ */
1568
+ const /** @type {?} */ BS_DATEPICKER_VALUE_ACCESSOR = {
1569
+ provide: NG_VALUE_ACCESSOR,
1570
+ /* tslint:disable-next-line: no-use-before-declare */
1571
+ useExisting: forwardRef(() => BsDatepickerInputDirective),
1572
+ multi: true
1573
+ };
1574
+ const /** @type {?} */ BS_DATEPICKER_VALIDATOR = {
1575
+ provide: NG_VALIDATORS,
1576
+ /* tslint:disable-next-line: no-use-before-declare */
1577
+ useExisting: forwardRef(() => BsDatepickerInputDirective),
1578
+ multi: true
1579
+ };
1580
+ class BsDatepickerInputDirective {
1581
+ /**
1582
+ * @param {?} _picker
1583
+ * @param {?} _localeService
1584
+ * @param {?} _renderer
1585
+ * @param {?} _elRef
1586
+ * @param {?} changeDetection
1587
+ */
1588
+ constructor(_picker, _localeService, _renderer, _elRef, changeDetection) {
1589
+ this._picker = _picker;
1590
+ this._localeService = _localeService;
1591
+ this._renderer = _renderer;
1592
+ this._elRef = _elRef;
1593
+ this.changeDetection = changeDetection;
1594
+ this._onChange = Function.prototype;
1595
+ this._onTouched = Function.prototype;
1596
+ this._validatorChange = Function.prototype;
1597
+ // update input value on datepicker value update
1598
+ this._picker.bsValueChange.subscribe((value) => {
1599
+ this._setInputValue(value);
1600
+ if (this._value !== value) {
1601
+ this._value = value;
1602
+ this._onChange(value);
1603
+ this._onTouched();
1604
+ }
1605
+ this.changeDetection.markForCheck();
1606
+ });
1607
+ // update input value on locale change
1608
+ this._localeService.localeChange.subscribe(() => {
1609
+ this._setInputValue(this._value);
1610
+ });
1611
+ }
1612
+ /**
1613
+ * @param {?} value
1614
+ * @return {?}
1615
+ */
1616
+ _setInputValue(value) {
1617
+ const /** @type {?} */ initialDate = !value ? ''
1618
+ : formatDate(value, this._picker._config.dateInputFormat, this._localeService.currentLocale);
1619
+ this._renderer.setProperty(this._elRef.nativeElement, 'value', initialDate);
1620
+ }
1621
+ /**
1622
+ * @param {?} event
1623
+ * @return {?}
1624
+ */
1625
+ onChange(event) {
1626
+ /* tslint:disable-next-line: no-any*/
1627
+ this.writeValue((/** @type {?} */ (event.target)).value);
1628
+ this._onChange(this._value);
1629
+ this._onTouched();
1630
+ }
1631
+ /**
1632
+ * @param {?} c
1633
+ * @return {?}
1634
+ */
1635
+ validate(c) {
1636
+ const /** @type {?} */ _value = c.value;
1637
+ /* tslint:disable-next-line: prefer-switch */
1638
+ if (_value === null || _value === undefined || _value === '') {
1639
+ return null;
1640
+ }
1641
+ if (isDate(_value)) {
1642
+ const /** @type {?} */ _isDateValid = isDateValid(_value);
1643
+ if (!_isDateValid) {
1644
+ return { bsDate: { invalid: _value } };
1645
+ }
1646
+ if (this._picker && this._picker.minDate && isBefore(_value, this._picker.minDate, 'date')) {
1647
+ return { bsDate: { minDate: this._picker.minDate } };
1648
+ }
1649
+ if (this._picker && this._picker.maxDate && isAfter(_value, this._picker.maxDate, 'date')) {
1650
+ return { bsDate: { maxDate: this._picker.maxDate } };
1651
+ }
1652
+ }
1653
+ }
1654
+ /**
1655
+ * @param {?} fn
1656
+ * @return {?}
1657
+ */
1658
+ registerOnValidatorChange(fn) {
1659
+ this._validatorChange = fn;
1660
+ }
1661
+ /**
1662
+ * @param {?} value
1663
+ * @return {?}
1664
+ */
1665
+ writeValue(value) {
1666
+ if (!value) {
1667
+ this._value = null;
1668
+ }
1669
+ else {
1670
+ const /** @type {?} */ _localeKey = this._localeService.currentLocale;
1671
+ const /** @type {?} */ _locale = getLocale(_localeKey);
1672
+ if (!_locale) {
1673
+ throw new Error(`Locale "${_localeKey}" is not defined, please add it with "defineLocale(...)"`);
1674
+ }
1675
+ this._value = parseDate(value, this._picker._config.dateInputFormat, this._localeService.currentLocale);
1676
+ }
1677
+ this._picker.bsValue = this._value;
1678
+ }
1679
+ /**
1680
+ * @param {?} isDisabled
1681
+ * @return {?}
1682
+ */
1683
+ setDisabledState(isDisabled) {
1684
+ this._picker.isDisabled = isDisabled;
1685
+ if (isDisabled) {
1686
+ this._renderer.setAttribute(this._elRef.nativeElement, 'disabled', 'disabled');
1687
+ return;
1688
+ }
1689
+ this._renderer.removeAttribute(this._elRef.nativeElement, 'disabled');
1690
+ }
1691
+ /**
1692
+ * @param {?} fn
1693
+ * @return {?}
1694
+ */
1695
+ registerOnChange(fn) {
1696
+ this._onChange = fn;
1697
+ }
1698
+ /**
1699
+ * @param {?} fn
1700
+ * @return {?}
1701
+ */
1702
+ registerOnTouched(fn) {
1703
+ this._onTouched = fn;
1704
+ }
1705
+ /**
1706
+ * @return {?}
1707
+ */
1708
+ onBlur() {
1709
+ this._onTouched();
1710
+ }
1711
+ /**
1712
+ * @return {?}
1713
+ */
1714
+ hide() {
1715
+ this._picker.hide();
1716
+ this._renderer.selectRootElement(this._elRef.nativeElement).blur();
1717
+ }
1718
+ }
1719
+ BsDatepickerInputDirective.decorators = [
1720
+ { type: Directive, args: [{
1721
+ selector: `input[bsDatepicker]`,
1722
+ host: {
1723
+ '(change)': 'onChange($event)',
1724
+ '(keyup.esc)': 'hide()',
1725
+ '(blur)': 'onBlur()'
1726
+ },
1727
+ providers: [BS_DATEPICKER_VALUE_ACCESSOR, BS_DATEPICKER_VALIDATOR]
1728
+ },] }
1729
+ ];
1730
+ /** @nocollapse */
1731
+ BsDatepickerInputDirective.ctorParameters = () => [
1732
+ { type: BsDatepickerDirective, decorators: [{ type: Host },] },
1733
+ { type: BsLocaleService, },
1734
+ { type: Renderer2, },
1735
+ { type: ElementRef, },
1736
+ { type: ChangeDetectorRef, },
1737
+ ];
1738
+
1739
+ /**
1740
+ * @fileoverview added by tsickle
1741
+ * @suppress {checkTypes} checked by tsc
1742
+ */
1743
+ class BsDaterangepickerConfig extends BsDatepickerConfig {
1744
+ constructor() {
1745
+ super(...arguments);
1746
+ // DatepickerRenderOptions
1747
+ this.displayMonths = 2;
1748
+ }
1749
+ }
1750
+ BsDaterangepickerConfig.decorators = [
1751
+ { type: Injectable }
1752
+ ];
1753
+
1754
+ /**
1755
+ * @fileoverview added by tsickle
1756
+ * @suppress {checkTypes} checked by tsc
1757
+ */
1758
+ class BsDaterangepickerContainerComponent extends BsDatepickerAbstractComponent {
1759
+ /**
1760
+ * @param {?} _config
1761
+ * @param {?} _store
1762
+ * @param {?} _actions
1763
+ * @param {?} _effects
1764
+ */
1765
+ constructor(_config, _store, _actions, _effects) {
1766
+ super();
1767
+ this._config = _config;
1768
+ this._store = _store;
1769
+ this._actions = _actions;
1770
+ this.valueChange = new EventEmitter();
1771
+ this._rangeStack = [];
1772
+ this._subs = [];
1773
+ this._effects = _effects;
1774
+ }
1775
+ /**
1776
+ * @param {?} value
1777
+ * @return {?}
1778
+ */
1779
+ set value(value) {
1780
+ this._effects.setRangeValue(value);
1781
+ }
1782
+ /**
1783
+ * @return {?}
1784
+ */
1785
+ ngOnInit() {
1786
+ this.containerClass = this._config.containerClass;
1787
+ this.isOtherMonthsActive = this._config.selectFromOtherMonth;
1788
+ this._effects
1789
+ .init(this._store)
1790
+ .setOptions(this._config)
1791
+ .setBindings(this)
1792
+ .setEventHandlers(this)
1793
+ .registerDatepickerSideEffects();
1794
+ // todo: move it somewhere else
1795
+ // on selected date change
1796
+ this._subs.push(this._store
1797
+ .select(state => state.selectedRange)
1798
+ .subscribe(date => this.valueChange.emit(date)));
1799
+ }
1800
+ /**
1801
+ * @param {?} day
1802
+ * @return {?}
1803
+ */
1804
+ daySelectHandler(day) {
1805
+ const /** @type {?} */ isDisabled = this.isOtherMonthsActive ? day.isDisabled : (day.isOtherMonth || day.isDisabled);
1806
+ if (isDisabled) {
1807
+ return;
1808
+ }
1809
+ // if only one date is already selected
1810
+ // and user clicks on previous date
1811
+ // start selection from new date
1812
+ // but if new date is after initial one
1813
+ // than finish selection
1814
+ if (this._rangeStack.length === 1) {
1815
+ this._rangeStack =
1816
+ day.date >= this._rangeStack[0]
1817
+ ? [this._rangeStack[0], day.date]
1818
+ : [day.date];
1819
+ }
1820
+ if (this._rangeStack.length === 0) {
1821
+ this._rangeStack = [day.date];
1822
+ }
1823
+ this._store.dispatch(this._actions.selectRange(this._rangeStack));
1824
+ if (this._rangeStack.length === 2) {
1825
+ this._rangeStack = [];
1826
+ }
1827
+ }
1828
+ /**
1829
+ * @return {?}
1830
+ */
1831
+ ngOnDestroy() {
1832
+ for (const /** @type {?} */ sub of this._subs) {
1833
+ sub.unsubscribe();
1834
+ }
1835
+ this._effects.destroy();
1836
+ }
1837
+ }
1838
+ BsDaterangepickerContainerComponent.decorators = [
1839
+ { type: Component, args: [{
1840
+ selector: 'bs-daterangepicker-container',
1841
+ providers: [BsDatepickerStore, BsDatepickerEffects],
1842
+ template: "<!-- days calendar view mode -->\n<div class=\"bs-datepicker\" [ngClass]=\"containerClass\" *ngIf=\"viewMode | async\">\n <div class=\"bs-datepicker-container\">\n\n <!--calendars-->\n <div class=\"bs-calendar-container\" [ngSwitch]=\"viewMode | async\" role=\"application\">\n <!--days calendar-->\n <div *ngSwitchCase=\"'day'\" class=\"bs-media-container\">\n <bs-days-calendar-view\n *ngFor=\"let calendar of (daysCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n [options]=\"options | async\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"dayHoverHandler($event)\"\n (onSelect)=\"daySelectHandler($event)\"\n ></bs-days-calendar-view>\n </div>\n\n <!--months calendar-->\n <div *ngSwitchCase=\"'month'\" class=\"bs-media-container\">\n <bs-month-calendar-view\n *ngFor=\"let calendar of (monthsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"monthHoverHandler($event)\"\n (onSelect)=\"monthSelectHandler($event)\"\n ></bs-month-calendar-view>\n </div>\n\n <!--years calendar-->\n <div *ngSwitchCase=\"'year'\" class=\"bs-media-container\">\n <bs-years-calendar-view\n *ngFor=\"let calendar of (yearsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async )?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"yearHoverHandler($event)\"\n (onSelect)=\"yearSelectHandler($event)\"\n ></bs-years-calendar-view>\n </div>\n\n </div>\n\n <!--applycancel buttons-->\n <div class=\"bs-datepicker-buttons\" *ngIf=\"false\">\n <button class=\"btn btn-success\">Apply</button>\n <button class=\"btn btn-default\">Cancel</button>\n </div>\n\n </div>\n\n <!--custom dates or date ranges picker-->\n <div class=\"bs-datepicker-custom-range\" *ngIf=\"false\">\n <bs-custom-date-view [ranges]=\"_customRangesFish\"></bs-custom-date-view>\n </div>\n</div>\n",
1843
+ host: {
1844
+ '(click)': '_stopPropagation($event)',
1845
+ style: 'position: absolute; display: block;',
1846
+ role: 'dialog',
1847
+ 'aria-label': 'calendar'
1848
+ }
1849
+ }] }
1850
+ ];
1851
+ /** @nocollapse */
1852
+ BsDaterangepickerContainerComponent.ctorParameters = () => [
1853
+ { type: BsDatepickerConfig, },
1854
+ { type: BsDatepickerStore, },
1855
+ { type: BsDatepickerActions, },
1856
+ { type: BsDatepickerEffects, },
1857
+ ];
1858
+
1859
+ /**
1860
+ * @fileoverview added by tsickle
1861
+ * @suppress {checkTypes} checked by tsc
1862
+ */
1863
+ class BsDaterangepickerDirective {
1864
+ /**
1865
+ * @param {?} _config
1866
+ * @param {?} _elementRef
1867
+ * @param {?} _renderer
1868
+ * @param {?} _viewContainerRef
1869
+ * @param {?} cis
1870
+ */
1871
+ constructor(_config, _elementRef, _renderer, _viewContainerRef, cis) {
1872
+ this._config = _config;
1873
+ /**
1874
+ * Placement of a daterangepicker. Accepts: "top", "bottom", "left", "right"
1875
+ */
1876
+ this.placement = 'bottom';
1877
+ /**
1878
+ * Specifies events that should trigger. Supports a space separated list of
1879
+ * event names.
1880
+ */
1881
+ this.triggers = 'click';
1882
+ /**
1883
+ * Close daterangepicker on outside click
1884
+ */
1885
+ this.outsideClick = true;
1886
+ /**
1887
+ * A selector specifying the element the daterangepicker should be appended
1888
+ * to. Currently only supports "body".
1889
+ */
1890
+ this.container = 'body';
1891
+ this.outsideEsc = true;
1892
+ /**
1893
+ * Emits when daterangepicker value has been changed
1894
+ */
1895
+ this.bsValueChange = new EventEmitter();
1896
+ this._subs = [];
1897
+ this._datepicker = cis.createLoader(_elementRef, _viewContainerRef, _renderer);
1898
+ Object.assign(this, _config);
1899
+ this.onShown = this._datepicker.onShown;
1900
+ this.onHidden = this._datepicker.onHidden;
1901
+ }
1902
+ /**
1903
+ * Returns whether or not the daterangepicker is currently being shown
1904
+ * @return {?}
1905
+ */
1906
+ get isOpen() {
1907
+ return this._datepicker.isShown;
1908
+ }
1909
+ /**
1910
+ * @param {?} value
1911
+ * @return {?}
1912
+ */
1913
+ set isOpen(value) {
1914
+ if (value) {
1915
+ this.show();
1916
+ }
1917
+ else {
1918
+ this.hide();
1919
+ }
1920
+ }
1921
+ /**
1922
+ * Initial value of daterangepicker
1923
+ * @param {?} value
1924
+ * @return {?}
1925
+ */
1926
+ set bsValue(value) {
1927
+ if (this._bsValue === value) {
1928
+ return;
1929
+ }
1930
+ this._bsValue = value;
1931
+ this.bsValueChange.emit(value);
1932
+ }
1933
+ /**
1934
+ * @return {?}
1935
+ */
1936
+ ngOnInit() {
1937
+ this._datepicker.listen({
1938
+ outsideClick: this.outsideClick,
1939
+ outsideEsc: this.outsideEsc,
1940
+ triggers: this.triggers,
1941
+ show: () => this.show()
1942
+ });
1943
+ this.setConfig();
1944
+ }
1945
+ /**
1946
+ * @param {?} changes
1947
+ * @return {?}
1948
+ */
1949
+ ngOnChanges(changes) {
1950
+ if (!this._datepickerRef || !this._datepickerRef.instance) {
1951
+ return;
1952
+ }
1953
+ if (changes["minDate"]) {
1954
+ this._datepickerRef.instance.minDate = this.minDate;
1955
+ }
1956
+ if (changes["maxDate"]) {
1957
+ this._datepickerRef.instance.maxDate = this.maxDate;
1958
+ }
1959
+ if (changes["isDisabled"]) {
1960
+ this._datepickerRef.instance.isDisabled = this.isDisabled;
1961
+ }
1962
+ }
1963
+ /**
1964
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
1965
+ * the datepicker.
1966
+ * @return {?}
1967
+ */
1968
+ show() {
1969
+ if (this._datepicker.isShown) {
1970
+ return;
1971
+ }
1972
+ this.setConfig();
1973
+ this._datepickerRef = this._datepicker
1974
+ .provide({ provide: BsDatepickerConfig, useValue: this._config })
1975
+ .attach(BsDaterangepickerContainerComponent)
1976
+ .to(this.container)
1977
+ .position({ attachment: this.placement })
1978
+ .show({ placement: this.placement });
1979
+ // if date changes from external source (model -> view)
1980
+ this._subs.push(this.bsValueChange.subscribe((value) => {
1981
+ this._datepickerRef.instance.value = value;
1982
+ }));
1983
+ // if date changes from picker (view -> model)
1984
+ this._subs.push(this._datepickerRef.instance.valueChange
1985
+ .pipe(filter((range) => range && range[0] && !!range[1]))
1986
+ .subscribe((value) => {
1987
+ this.bsValue = value;
1988
+ this.hide();
1989
+ }));
1990
+ }
1991
+ /**
1992
+ * Set config for daterangepicker
1993
+ * @return {?}
1994
+ */
1995
+ setConfig() {
1996
+ this._config = Object.assign({}, this._config, this.bsConfig, {
1997
+ value: this._bsValue,
1998
+ isDisabled: this.isDisabled,
1999
+ minDate: this.minDate || this.bsConfig && this.bsConfig.minDate,
2000
+ maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate
2001
+ });
2002
+ }
2003
+ /**
2004
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
2005
+ * the datepicker.
2006
+ * @return {?}
2007
+ */
2008
+ hide() {
2009
+ if (this.isOpen) {
2010
+ this._datepicker.hide();
2011
+ }
2012
+ for (const /** @type {?} */ sub of this._subs) {
2013
+ sub.unsubscribe();
2014
+ }
2015
+ }
2016
+ /**
2017
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
2018
+ * of the datepicker.
2019
+ * @return {?}
2020
+ */
2021
+ toggle() {
2022
+ if (this.isOpen) {
2023
+ return this.hide();
2024
+ }
2025
+ this.show();
2026
+ }
2027
+ /**
2028
+ * @return {?}
2029
+ */
2030
+ ngOnDestroy() {
2031
+ this._datepicker.dispose();
2032
+ }
2033
+ }
2034
+ BsDaterangepickerDirective.decorators = [
2035
+ { type: Directive, args: [{
2036
+ selector: '[bsDaterangepicker]',
2037
+ exportAs: 'bsDaterangepicker'
2038
+ },] }
2039
+ ];
2040
+ /** @nocollapse */
2041
+ BsDaterangepickerDirective.ctorParameters = () => [
2042
+ { type: BsDaterangepickerConfig, },
2043
+ { type: ElementRef, },
2044
+ { type: Renderer2, },
2045
+ { type: ViewContainerRef, },
2046
+ { type: ComponentLoaderFactory, },
2047
+ ];
2048
+ BsDaterangepickerDirective.propDecorators = {
2049
+ "placement": [{ type: Input },],
2050
+ "triggers": [{ type: Input },],
2051
+ "outsideClick": [{ type: Input },],
2052
+ "container": [{ type: Input },],
2053
+ "outsideEsc": [{ type: Input },],
2054
+ "isOpen": [{ type: Input },],
2055
+ "onShown": [{ type: Output },],
2056
+ "onHidden": [{ type: Output },],
2057
+ "bsValue": [{ type: Input },],
2058
+ "bsConfig": [{ type: Input },],
2059
+ "isDisabled": [{ type: Input },],
2060
+ "minDate": [{ type: Input },],
2061
+ "maxDate": [{ type: Input },],
2062
+ "bsValueChange": [{ type: Output },],
2063
+ };
2064
+
2065
+ /**
2066
+ * @fileoverview added by tsickle
2067
+ * @suppress {checkTypes} checked by tsc
2068
+ */
2069
+ const /** @type {?} */ BS_DATERANGEPICKER_VALUE_ACCESSOR = {
2070
+ provide: NG_VALUE_ACCESSOR,
2071
+ /* tslint:disable-next-line: no-use-before-declare */
2072
+ useExisting: forwardRef(() => BsDaterangepickerInputDirective),
2073
+ multi: true
2074
+ };
2075
+ const /** @type {?} */ BS_DATERANGEPICKER_VALIDATOR = {
2076
+ provide: NG_VALIDATORS,
2077
+ /* tslint:disable-next-line: no-use-before-declare */
2078
+ useExisting: forwardRef(() => BsDaterangepickerInputDirective),
2079
+ multi: true
2080
+ };
2081
+ class BsDaterangepickerInputDirective {
2082
+ /**
2083
+ * @param {?} _picker
2084
+ * @param {?} _localeService
2085
+ * @param {?} _renderer
2086
+ * @param {?} _elRef
2087
+ * @param {?} changeDetection
2088
+ */
2089
+ constructor(_picker, _localeService, _renderer, _elRef, changeDetection) {
2090
+ this._picker = _picker;
2091
+ this._localeService = _localeService;
2092
+ this._renderer = _renderer;
2093
+ this._elRef = _elRef;
2094
+ this.changeDetection = changeDetection;
2095
+ this._onChange = Function.prototype;
2096
+ this._onTouched = Function.prototype;
2097
+ this._validatorChange = Function.prototype;
2098
+ // update input value on datepicker value update
2099
+ this._picker.bsValueChange.subscribe((value) => {
2100
+ this._setInputValue(value);
2101
+ if (this._value !== value) {
2102
+ this._value = value;
2103
+ this._onChange(value);
2104
+ this._onTouched();
2105
+ }
2106
+ this.changeDetection.markForCheck();
2107
+ });
2108
+ // update input value on locale change
2109
+ this._localeService.localeChange.subscribe(() => {
2110
+ this._setInputValue(this._value);
2111
+ });
2112
+ }
2113
+ /**
2114
+ * @param {?} date
2115
+ * @return {?}
2116
+ */
2117
+ _setInputValue(date) {
2118
+ let /** @type {?} */ range = '';
2119
+ if (date) {
2120
+ const /** @type {?} */ start = !date[0] ? ''
2121
+ : formatDate(date[0], this._picker._config.rangeInputFormat, this._localeService.currentLocale);
2122
+ const /** @type {?} */ end = !date[1] ? ''
2123
+ : formatDate(date[1], this._picker._config.rangeInputFormat, this._localeService.currentLocale);
2124
+ range = (start && end) ? start + this._picker._config.rangeSeparator + end : '';
2125
+ }
2126
+ this._renderer.setProperty(this._elRef.nativeElement, 'value', range);
2127
+ }
2128
+ /**
2129
+ * @param {?} event
2130
+ * @return {?}
2131
+ */
2132
+ onChange(event) {
2133
+ /* tslint:disable-next-line: no-any*/
2134
+ this.writeValue((/** @type {?} */ (event.target)).value);
2135
+ this._onChange(this._value);
2136
+ this._onTouched();
2137
+ }
2138
+ /**
2139
+ * @param {?} c
2140
+ * @return {?}
2141
+ */
2142
+ validate(c) {
2143
+ const /** @type {?} */ _value = c.value;
2144
+ if (_value === null || _value === undefined || !isArray(_value)) {
2145
+ return null;
2146
+ }
2147
+ const /** @type {?} */ _isFirstDateValid = isDateValid(_value[0]);
2148
+ const /** @type {?} */ _isSecondDateValid = isDateValid(_value[1]);
2149
+ if (!_isFirstDateValid) {
2150
+ return { bsDate: { invalid: _value[0] } };
2151
+ }
2152
+ if (!_isSecondDateValid) {
2153
+ return { bsDate: { invalid: _value[1] } };
2154
+ }
2155
+ if (this._picker && this._picker.minDate && isBefore(_value[0], this._picker.minDate, 'date')) {
2156
+ return { bsDate: { minDate: this._picker.minDate } };
2157
+ }
2158
+ if (this._picker && this._picker.maxDate && isAfter(_value[1], this._picker.maxDate, 'date')) {
2159
+ return { bsDate: { maxDate: this._picker.maxDate } };
2160
+ }
2161
+ }
2162
+ /**
2163
+ * @param {?} fn
2164
+ * @return {?}
2165
+ */
2166
+ registerOnValidatorChange(fn) {
2167
+ this._validatorChange = fn;
2168
+ }
2169
+ /**
2170
+ * @param {?} value
2171
+ * @return {?}
2172
+ */
2173
+ writeValue(value) {
2174
+ if (!value) {
2175
+ this._value = null;
2176
+ }
2177
+ else {
2178
+ const /** @type {?} */ _localeKey = this._localeService.currentLocale;
2179
+ const /** @type {?} */ _locale = getLocale(_localeKey);
2180
+ if (!_locale) {
2181
+ throw new Error(`Locale "${_localeKey}" is not defined, please add it with "defineLocale(...)"`);
2182
+ }
2183
+ let /** @type {?} */ _input = [];
2184
+ if (typeof value === 'string') {
2185
+ _input = value.split(this._picker._config.rangeSeparator);
2186
+ }
2187
+ if (Array.isArray(value)) {
2188
+ _input = value;
2189
+ }
2190
+ this._value = (/** @type {?} */ (_input))
2191
+ .map((_val) => parseDate(_val, this._picker._config.dateInputFormat, this._localeService.currentLocale))
2192
+ .map((date) => (isNaN(date.valueOf()) ? null : date));
2193
+ }
2194
+ this._picker.bsValue = this._value;
2195
+ }
2196
+ /**
2197
+ * @param {?} isDisabled
2198
+ * @return {?}
2199
+ */
2200
+ setDisabledState(isDisabled) {
2201
+ this._picker.isDisabled = isDisabled;
2202
+ if (isDisabled) {
2203
+ this._renderer.setAttribute(this._elRef.nativeElement, 'disabled', 'disabled');
2204
+ return;
2205
+ }
2206
+ this._renderer.removeAttribute(this._elRef.nativeElement, 'disabled');
2207
+ }
2208
+ /**
2209
+ * @param {?} fn
2210
+ * @return {?}
2211
+ */
2212
+ registerOnChange(fn) {
2213
+ this._onChange = fn;
2214
+ }
2215
+ /**
2216
+ * @param {?} fn
2217
+ * @return {?}
2218
+ */
2219
+ registerOnTouched(fn) {
2220
+ this._onTouched = fn;
2221
+ }
2222
+ /**
2223
+ * @return {?}
2224
+ */
2225
+ onBlur() {
2226
+ this._onTouched();
2227
+ }
2228
+ /**
2229
+ * @return {?}
2230
+ */
2231
+ hide() {
2232
+ this._picker.hide();
2233
+ this._renderer.selectRootElement(this._elRef.nativeElement).blur();
2234
+ }
2235
+ }
2236
+ BsDaterangepickerInputDirective.decorators = [
2237
+ { type: Directive, args: [{
2238
+ selector: `input[bsDaterangepicker]`,
2239
+ host: {
2240
+ '(change)': 'onChange($event)',
2241
+ '(keyup.esc)': 'hide()',
2242
+ '(blur)': 'onBlur()'
2243
+ },
2244
+ providers: [BS_DATERANGEPICKER_VALUE_ACCESSOR, BS_DATERANGEPICKER_VALIDATOR]
2245
+ },] }
2246
+ ];
2247
+ /** @nocollapse */
2248
+ BsDaterangepickerInputDirective.ctorParameters = () => [
2249
+ { type: BsDaterangepickerDirective, decorators: [{ type: Host },] },
2250
+ { type: BsLocaleService, },
2251
+ { type: Renderer2, },
2252
+ { type: ElementRef, },
2253
+ { type: ChangeDetectorRef, },
2254
+ ];
2255
+
2256
+ /**
2257
+ * @fileoverview added by tsickle
2258
+ * @suppress {checkTypes} checked by tsc
2259
+ */
2260
+ class BsCalendarLayoutComponent {
2261
+ }
2262
+ BsCalendarLayoutComponent.decorators = [
2263
+ { type: Component, args: [{
2264
+ selector: 'bs-calendar-layout',
2265
+ template: `
2266
+ <!-- current date, will be added in nearest releases -->
2267
+ <bs-current-date title="hey there" *ngIf="false"></bs-current-date>
2268
+
2269
+ <!--navigation-->
2270
+ <div class="bs-datepicker-head">
2271
+ <ng-content select="bs-datepicker-navigation-view"></ng-content>
2272
+ </div>
2273
+
2274
+ <div class="bs-datepicker-body">
2275
+ <ng-content></ng-content>
2276
+ </div>
2277
+
2278
+ <!--timepicker-->
2279
+ <bs-timepicker *ngIf="false"></bs-timepicker>
2280
+ `
2281
+ }] }
2282
+ ];
2283
+
2284
+ /**
2285
+ * @fileoverview added by tsickle
2286
+ * @suppress {checkTypes} checked by tsc
2287
+ */
2288
+ class BsCurrentDateViewComponent {
2289
+ }
2290
+ BsCurrentDateViewComponent.decorators = [
2291
+ { type: Component, args: [{
2292
+ selector: 'bs-current-date',
2293
+ template: `<div class="current-timedate"><span>{{ title }}</span></div>`
2294
+ }] }
2295
+ ];
2296
+ /** @nocollapse */
2297
+ BsCurrentDateViewComponent.propDecorators = {
2298
+ "title": [{ type: Input },],
2299
+ };
2300
+
2301
+ /**
2302
+ * @fileoverview added by tsickle
2303
+ * @suppress {checkTypes} checked by tsc
2304
+ */
2305
+ class BsCustomDatesViewComponent {
2306
+ }
2307
+ BsCustomDatesViewComponent.decorators = [
2308
+ { type: Component, args: [{
2309
+ selector: 'bs-custom-date-view',
2310
+ template: `
2311
+ <div class="bs-datepicker-predefined-btns">
2312
+ <button *ngFor="let range of ranges">{{ range.label }}</button>
2313
+ <button *ngIf="isCustomRangeShown">Custom Range</button>
2314
+ </div>
2315
+ `,
2316
+ changeDetection: ChangeDetectionStrategy.OnPush
2317
+ }] }
2318
+ ];
2319
+ /** @nocollapse */
2320
+ BsCustomDatesViewComponent.propDecorators = {
2321
+ "isCustomRangeShown": [{ type: Input },],
2322
+ "ranges": [{ type: Input },],
2323
+ };
2324
+
2325
+ /**
2326
+ * @fileoverview added by tsickle
2327
+ * @suppress {checkTypes} checked by tsc
2328
+ */
2329
+ class BsDatepickerDayDecoratorComponent {
2330
+ /**
2331
+ * @param {?} _config
2332
+ * @param {?} _elRef
2333
+ * @param {?} _renderer
2334
+ */
2335
+ constructor(_config, _elRef, _renderer) {
2336
+ this._config = _config;
2337
+ this._elRef = _elRef;
2338
+ this._renderer = _renderer;
2339
+ }
2340
+ /**
2341
+ * @return {?}
2342
+ */
2343
+ ngOnInit() {
2344
+ if (this.day.isToday && this._config && this._config.customTodayClass) {
2345
+ this._renderer.addClass(this._elRef.nativeElement, this._config.customTodayClass);
2346
+ }
2347
+ }
2348
+ }
2349
+ BsDatepickerDayDecoratorComponent.decorators = [
2350
+ { type: Component, args: [{
2351
+ selector: '[bsDatepickerDayDecorator]',
2352
+ changeDetection: ChangeDetectionStrategy.OnPush,
2353
+ host: {
2354
+ '[class.disabled]': 'day.isDisabled',
2355
+ '[class.is-highlighted]': 'day.isHovered',
2356
+ '[class.is-other-month]': 'day.isOtherMonth',
2357
+ '[class.is-active-other-month]': 'day.isOtherMonthHovered',
2358
+ '[class.in-range]': 'day.isInRange',
2359
+ '[class.select-start]': 'day.isSelectionStart',
2360
+ '[class.select-end]': 'day.isSelectionEnd',
2361
+ '[class.selected]': 'day.isSelected'
2362
+ },
2363
+ template: `{{ day.label }}`
2364
+ }] }
2365
+ ];
2366
+ /** @nocollapse */
2367
+ BsDatepickerDayDecoratorComponent.ctorParameters = () => [
2368
+ { type: BsDatepickerConfig, },
2369
+ { type: ElementRef, },
2370
+ { type: Renderer2, },
2371
+ ];
2372
+ BsDatepickerDayDecoratorComponent.propDecorators = {
2373
+ "day": [{ type: Input },],
2374
+ };
2375
+
2376
+ /**
2377
+ * @fileoverview added by tsickle
2378
+ * @suppress {checkTypes} checked by tsc
2379
+ */
2380
+ /** @enum {number} */
2381
+ const BsNavigationDirection = {
2382
+ UP: 0,
2383
+ DOWN: 1,
2384
+ };
2385
+ BsNavigationDirection[BsNavigationDirection.UP] = "UP";
2386
+ BsNavigationDirection[BsNavigationDirection.DOWN] = "DOWN";
2387
+
2388
+ /**
2389
+ * @fileoverview added by tsickle
2390
+ * @suppress {checkTypes} checked by tsc
2391
+ */
2392
+ class BsDatepickerNavigationViewComponent {
2393
+ constructor() {
2394
+ this.onNavigate = new EventEmitter();
2395
+ this.onViewMode = new EventEmitter();
2396
+ }
2397
+ /**
2398
+ * @param {?} down
2399
+ * @return {?}
2400
+ */
2401
+ navTo(down) {
2402
+ this.onNavigate.emit(down ? BsNavigationDirection.DOWN : BsNavigationDirection.UP);
2403
+ }
2404
+ /**
2405
+ * @param {?} viewMode
2406
+ * @return {?}
2407
+ */
2408
+ view(viewMode) {
2409
+ this.onViewMode.emit(viewMode);
2410
+ }
2411
+ }
2412
+ BsDatepickerNavigationViewComponent.decorators = [
2413
+ { type: Component, args: [{
2414
+ selector: 'bs-datepicker-navigation-view',
2415
+ changeDetection: ChangeDetectionStrategy.OnPush,
2416
+ template: `
2417
+ <button class="previous"
2418
+ [disabled]="calendar.disableLeftArrow"
2419
+ [style.visibility]="calendar.hideLeftArrow ? 'hidden' : 'visible'"
2420
+ (click)="navTo(true)"><span>&lsaquo;</span>
2421
+ </button>
2422
+
2423
+ &#8203; <!-- zero-width space needed for correct alignement
2424
+ with preserveWhitespaces: false in Angular -->
2425
+
2426
+ <button class="current"
2427
+ *ngIf="calendar.monthTitle"
2428
+ (click)="view('month')"
2429
+ ><span>{{ calendar.monthTitle }}</span>
2430
+ </button>
2431
+
2432
+ &#8203; <!-- zero-width space needed for correct alignement
2433
+ with preserveWhitespaces: false in Angular -->
2434
+
2435
+ <button class="current" (click)="view('year')"
2436
+ ><span>{{ calendar.yearTitle }}</span></button>
2437
+
2438
+ &#8203; <!-- zero-width space needed for correct alignement
2439
+ with preserveWhitespaces: false in Angular -->
2440
+
2441
+ <button class="next"
2442
+ [disabled]="calendar.disableRightArrow"
2443
+ [style.visibility]="calendar.hideRightArrow ? 'hidden' : 'visible'"
2444
+ (click)="navTo(false)"><span>&rsaquo;</span>
2445
+ </button>
2446
+ `
2447
+ }] }
2448
+ ];
2449
+ /** @nocollapse */
2450
+ BsDatepickerNavigationViewComponent.propDecorators = {
2451
+ "calendar": [{ type: Input },],
2452
+ "onNavigate": [{ type: Output },],
2453
+ "onViewMode": [{ type: Output },],
2454
+ };
2455
+
2456
+ /**
2457
+ * @fileoverview added by tsickle
2458
+ * @suppress {checkTypes} checked by tsc
2459
+ */
2460
+ class BsDaysCalendarViewComponent {
2461
+ /**
2462
+ * @param {?} _config
2463
+ */
2464
+ constructor(_config) {
2465
+ this._config = _config;
2466
+ this.onNavigate = new EventEmitter();
2467
+ this.onViewMode = new EventEmitter();
2468
+ this.onSelect = new EventEmitter();
2469
+ this.onHover = new EventEmitter();
2470
+ }
2471
+ /**
2472
+ * @param {?} event
2473
+ * @return {?}
2474
+ */
2475
+ navigateTo(event) {
2476
+ const /** @type {?} */ step = BsNavigationDirection.DOWN === event ? -1 : 1;
2477
+ this.onNavigate.emit({ step: { month: step } });
2478
+ }
2479
+ /**
2480
+ * @param {?} event
2481
+ * @return {?}
2482
+ */
2483
+ changeViewMode(event) {
2484
+ this.onViewMode.emit(event);
2485
+ }
2486
+ /**
2487
+ * @param {?} event
2488
+ * @return {?}
2489
+ */
2490
+ selectDay(event) {
2491
+ this.onSelect.emit(event);
2492
+ }
2493
+ /**
2494
+ * @param {?} cell
2495
+ * @param {?} isHovered
2496
+ * @return {?}
2497
+ */
2498
+ hoverDay(cell, isHovered) {
2499
+ if (this._config.selectFromOtherMonth && cell.isOtherMonth) {
2500
+ cell.isOtherMonthHovered = isHovered;
2501
+ }
2502
+ this.onHover.emit({ cell, isHovered });
2503
+ }
2504
+ }
2505
+ BsDaysCalendarViewComponent.decorators = [
2506
+ { type: Component, args: [{
2507
+ selector: 'bs-days-calendar-view',
2508
+ // changeDetection: ChangeDetectionStrategy.OnPush,
2509
+ template: `
2510
+ <bs-calendar-layout>
2511
+ <bs-datepicker-navigation-view
2512
+ [calendar]="calendar"
2513
+ (onNavigate)="navigateTo($event)"
2514
+ (onViewMode)="changeViewMode($event)"
2515
+ ></bs-datepicker-navigation-view>
2516
+
2517
+ <!--days matrix-->
2518
+ <table role="grid" class="days weeks">
2519
+ <thead>
2520
+ <tr>
2521
+ <!--if show weeks-->
2522
+ <th *ngIf="options.showWeekNumbers"></th>
2523
+ <th *ngFor="let weekday of calendar.weekdays; let i = index"
2524
+ aria-label="weekday">{{ calendar.weekdays[i] }}
2525
+ </th>
2526
+ </tr>
2527
+ </thead>
2528
+ <tbody>
2529
+ <tr *ngFor="let week of calendar.weeks; let i = index">
2530
+ <td class="week" *ngIf="options.showWeekNumbers">
2531
+ <span>{{ calendar.weekNumbers[i] }}</span>
2532
+ </td>
2533
+ <td *ngFor="let day of week.days" role="gridcell">
2534
+ <span bsDatepickerDayDecorator
2535
+ [day]="day"
2536
+ (click)="selectDay(day)"
2537
+ (mouseenter)="hoverDay(day, true)"
2538
+ (mouseleave)="hoverDay(day, false)">{{ day.label }}</span>
2539
+ </td>
2540
+ </tr>
2541
+ </tbody>
2542
+ </table>
2543
+
2544
+ </bs-calendar-layout>
2545
+ `
2546
+ }] }
2547
+ ];
2548
+ /** @nocollapse */
2549
+ BsDaysCalendarViewComponent.ctorParameters = () => [
2550
+ { type: BsDatepickerConfig, },
2551
+ ];
2552
+ BsDaysCalendarViewComponent.propDecorators = {
2553
+ "calendar": [{ type: Input },],
2554
+ "options": [{ type: Input },],
2555
+ "onNavigate": [{ type: Output },],
2556
+ "onViewMode": [{ type: Output },],
2557
+ "onSelect": [{ type: Output },],
2558
+ "onHover": [{ type: Output },],
2559
+ };
2560
+
2561
+ /**
2562
+ * @fileoverview added by tsickle
2563
+ * @suppress {checkTypes} checked by tsc
2564
+ */
2565
+ class BsMonthCalendarViewComponent {
2566
+ constructor() {
2567
+ this.onNavigate = new EventEmitter();
2568
+ this.onViewMode = new EventEmitter();
2569
+ this.onSelect = new EventEmitter();
2570
+ this.onHover = new EventEmitter();
2571
+ }
2572
+ /**
2573
+ * @param {?} event
2574
+ * @return {?}
2575
+ */
2576
+ navigateTo(event) {
2577
+ const /** @type {?} */ step = BsNavigationDirection.DOWN === event ? -1 : 1;
2578
+ this.onNavigate.emit({ step: { year: step } });
2579
+ }
2580
+ /**
2581
+ * @param {?} month
2582
+ * @return {?}
2583
+ */
2584
+ viewMonth(month) {
2585
+ this.onSelect.emit(month);
2586
+ }
2587
+ /**
2588
+ * @param {?} cell
2589
+ * @param {?} isHovered
2590
+ * @return {?}
2591
+ */
2592
+ hoverMonth(cell, isHovered) {
2593
+ this.onHover.emit({ cell, isHovered });
2594
+ }
2595
+ /**
2596
+ * @param {?} event
2597
+ * @return {?}
2598
+ */
2599
+ changeViewMode(event) {
2600
+ this.onViewMode.emit(event);
2601
+ }
2602
+ }
2603
+ BsMonthCalendarViewComponent.decorators = [
2604
+ { type: Component, args: [{
2605
+ selector: 'bs-month-calendar-view',
2606
+ template: `
2607
+ <bs-calendar-layout>
2608
+ <bs-datepicker-navigation-view
2609
+ [calendar]="calendar"
2610
+ (onNavigate)="navigateTo($event)"
2611
+ (onViewMode)="changeViewMode($event)"
2612
+ ></bs-datepicker-navigation-view>
2613
+
2614
+ <table role="grid" class="months">
2615
+ <tbody>
2616
+ <tr *ngFor="let row of calendar.months">
2617
+ <td *ngFor="let month of row" role="gridcell"
2618
+ (click)="viewMonth(month)"
2619
+ (mouseenter)="hoverMonth(month, true)"
2620
+ (mouseleave)="hoverMonth(month, false)"
2621
+ [class.disabled]="month.isDisabled"
2622
+ [class.is-highlighted]="month.isHovered">
2623
+ <span>{{ month.label }}</span>
2624
+ </td>
2625
+ </tr>
2626
+ </tbody>
2627
+ </table>
2628
+ </bs-calendar-layout>
2629
+ `
2630
+ }] }
2631
+ ];
2632
+ /** @nocollapse */
2633
+ BsMonthCalendarViewComponent.propDecorators = {
2634
+ "calendar": [{ type: Input },],
2635
+ "onNavigate": [{ type: Output },],
2636
+ "onViewMode": [{ type: Output },],
2637
+ "onSelect": [{ type: Output },],
2638
+ "onHover": [{ type: Output },],
2639
+ };
2640
+
2641
+ /**
2642
+ * @fileoverview added by tsickle
2643
+ * @suppress {checkTypes} checked by tsc
2644
+ */
2645
+ class BsTimepickerViewComponent {
2646
+ constructor() {
2647
+ this.ampm = 'ok';
2648
+ this.hours = 0;
2649
+ this.minutes = 0;
2650
+ }
2651
+ }
2652
+ BsTimepickerViewComponent.decorators = [
2653
+ { type: Component, args: [{
2654
+ selector: 'bs-timepicker',
2655
+ template: `
2656
+ <div class="bs-timepicker-container">
2657
+ <div class="bs-timepicker-controls">
2658
+ <button class="bs-decrease">-</button>
2659
+ <input type="text" [value]="hours" placeholder="00">
2660
+ <button class="bs-increase">+</button>
2661
+ </div>
2662
+ <div class="bs-timepicker-controls">
2663
+ <button class="bs-decrease">-</button>
2664
+ <input type="text" [value]="minutes" placeholder="00">
2665
+ <button class="bs-increase">+</button>
2666
+ </div>
2667
+ <button class="switch-time-format">{{ ampm }}
2668
+ <img
2669
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAABSElEQVQYV3XQPUvDUBQG4HNuagtVqc6KgouCv6GIuIntYBLB9hcIQpLStCAIV7DYmpTcRWcXqZio3Vwc/UCc/QEqfgyKGbr0I7nS1EiHeqYzPO/h5SD0jaxUZjmSLCB+OFb+UFINFwASAEAdpu9gaGXVyAHHFQBkHpKHc6a9dzECvADyY9sqlAMsK9W0jzxDXqeytr3mhQckxSji27TJJ5/rPmIpwJJq3HrtduriYOurv1a4i1p5HnhkG9OFymi0ReoO05cGwb+ayv4dysVygjeFmsP05f8wpZQ8fsdvfmuY9zjWSNqUtgYFVnOVReILYoBFzdQI5/GGFzNHhGbeZnopDGU29sZbscgldmC99w35VOATTycIMMcBXIfpSVGzZhA6C8hh00conln6VQ9TGgV32OEAKQC4DrBq7CJwd0ggR7Vq/rPrfgB+C3sGypY5DAAAAABJRU5ErkJggg=="
2670
+ alt="">
2671
+ </button>
2672
+ </div>
2673
+ `
2674
+ }] }
2675
+ ];
2676
+
2677
+ /**
2678
+ * @fileoverview added by tsickle
2679
+ * @suppress {checkTypes} checked by tsc
2680
+ */
2681
+ class BsYearsCalendarViewComponent {
2682
+ constructor() {
2683
+ this.onNavigate = new EventEmitter();
2684
+ this.onViewMode = new EventEmitter();
2685
+ this.onSelect = new EventEmitter();
2686
+ this.onHover = new EventEmitter();
2687
+ }
2688
+ /**
2689
+ * @param {?} event
2690
+ * @return {?}
2691
+ */
2692
+ navigateTo(event) {
2693
+ const /** @type {?} */ step = BsNavigationDirection.DOWN === event ? -1 : 1;
2694
+ this.onNavigate.emit({ step: { year: step * yearsPerCalendar } });
2695
+ }
2696
+ /**
2697
+ * @param {?} year
2698
+ * @return {?}
2699
+ */
2700
+ viewYear(year) {
2701
+ this.onSelect.emit(year);
2702
+ }
2703
+ /**
2704
+ * @param {?} cell
2705
+ * @param {?} isHovered
2706
+ * @return {?}
2707
+ */
2708
+ hoverYear(cell, isHovered) {
2709
+ this.onHover.emit({ cell, isHovered });
2710
+ }
2711
+ /**
2712
+ * @param {?} event
2713
+ * @return {?}
2714
+ */
2715
+ changeViewMode(event) {
2716
+ this.onViewMode.emit(event);
2717
+ }
2718
+ }
2719
+ BsYearsCalendarViewComponent.decorators = [
2720
+ { type: Component, args: [{
2721
+ selector: 'bs-years-calendar-view',
2722
+ template: `
2723
+ <bs-calendar-layout>
2724
+ <bs-datepicker-navigation-view
2725
+ [calendar]="calendar"
2726
+ (onNavigate)="navigateTo($event)"
2727
+ (onViewMode)="changeViewMode($event)"
2728
+ ></bs-datepicker-navigation-view>
2729
+
2730
+ <table role="grid" class="years">
2731
+ <tbody>
2732
+ <tr *ngFor="let row of calendar.years">
2733
+ <td *ngFor="let year of row" role="gridcell"
2734
+ (click)="viewYear(year)"
2735
+ (mouseenter)="hoverYear(year, true)"
2736
+ (mouseleave)="hoverYear(year, false)"
2737
+ [class.disabled]="year.isDisabled"
2738
+ [class.is-highlighted]="year.isHovered">
2739
+ <span>{{ year.label }}</span>
2740
+ </td>
2741
+ </tr>
2742
+ </tbody>
2743
+ </table>
2744
+ </bs-calendar-layout>
2745
+ `
2746
+ }] }
2747
+ ];
2748
+ /** @nocollapse */
2749
+ BsYearsCalendarViewComponent.propDecorators = {
2750
+ "calendar": [{ type: Input },],
2751
+ "onNavigate": [{ type: Output },],
2752
+ "onViewMode": [{ type: Output },],
2753
+ "onSelect": [{ type: Output },],
2754
+ "onHover": [{ type: Output },],
2755
+ };
2756
+
2757
+ /**
2758
+ * @fileoverview added by tsickle
2759
+ * @suppress {checkTypes} checked by tsc
2760
+ */
2761
+ const /** @type {?} */ _exports = [
2762
+ BsDatepickerContainerComponent,
2763
+ BsDaterangepickerContainerComponent,
2764
+ BsDatepickerDirective,
2765
+ BsDatepickerInputDirective,
2766
+ BsDaterangepickerInputDirective,
2767
+ BsDaterangepickerDirective
2768
+ ];
2769
+ class BsDatepickerModule {
2770
+ /**
2771
+ * @return {?}
2772
+ */
2773
+ static forRoot() {
2774
+ return {
2775
+ ngModule: BsDatepickerModule,
2776
+ providers: [
2777
+ ComponentLoaderFactory,
2778
+ PositioningService,
2779
+ BsDatepickerStore,
2780
+ BsDatepickerActions,
2781
+ BsDatepickerConfig,
2782
+ BsDaterangepickerConfig,
2783
+ BsDatepickerEffects,
2784
+ BsLocaleService
2785
+ ]
2786
+ };
2787
+ }
2788
+ }
2789
+ BsDatepickerModule.decorators = [
2790
+ { type: NgModule, args: [{
2791
+ imports: [CommonModule],
2792
+ declarations: [
2793
+ BsDatepickerDayDecoratorComponent,
2794
+ BsCurrentDateViewComponent,
2795
+ BsDatepickerNavigationViewComponent,
2796
+ BsTimepickerViewComponent,
2797
+ BsCalendarLayoutComponent,
2798
+ BsDaysCalendarViewComponent,
2799
+ BsMonthCalendarViewComponent,
2800
+ BsYearsCalendarViewComponent,
2801
+ BsCustomDatesViewComponent,
2802
+ ..._exports
2803
+ ],
2804
+ entryComponents: [
2805
+ BsDatepickerContainerComponent,
2806
+ BsDaterangepickerContainerComponent
2807
+ ],
2808
+ exports: _exports
2809
+ },] }
2810
+ ];
2811
+
2812
+ /**
2813
+ * @fileoverview added by tsickle
2814
+ * @suppress {checkTypes} checked by tsc
2815
+ */
2816
+ class DateFormatter {
2817
+ /**
2818
+ * @param {?} date
2819
+ * @param {?} format
2820
+ * @param {?} locale
2821
+ * @return {?}
2822
+ */
2823
+ format(date, format, locale) {
2824
+ return formatDate(date, format, locale);
2825
+ }
2826
+ }
2827
+
2828
+ /**
2829
+ * @fileoverview added by tsickle
2830
+ * @suppress {checkTypes} checked by tsc
2831
+ */
2832
+ class DatePickerInnerComponent {
2833
+ constructor() {
2834
+ this.selectionDone = new EventEmitter(undefined);
2835
+ this.update = new EventEmitter(false);
2836
+ this.activeDateChange = new EventEmitter(undefined);
2837
+ /* tslint:disable-next-line: no-any*/
2838
+ this.stepDay = {};
2839
+ /* tslint:disable-next-line: no-any*/
2840
+ this.stepMonth = {};
2841
+ /* tslint:disable-next-line: no-any*/
2842
+ this.stepYear = {};
2843
+ this.modes = ['day', 'month', 'year'];
2844
+ this.dateFormatter = new DateFormatter();
2845
+ }
2846
+ /**
2847
+ * @return {?}
2848
+ */
2849
+ get activeDate() {
2850
+ return this._activeDate;
2851
+ }
2852
+ /**
2853
+ * @param {?} value
2854
+ * @return {?}
2855
+ */
2856
+ set activeDate(value) {
2857
+ this._activeDate = value;
2858
+ }
2859
+ /**
2860
+ * @return {?}
2861
+ */
2862
+ ngOnInit() {
2863
+ // todo: use date for unique value
2864
+ this.uniqueId = `datepicker--${Math.floor(Math.random() * 10000)}`;
2865
+ if (this.initDate) {
2866
+ this.activeDate = this.initDate;
2867
+ this.selectedDate = new Date(this.activeDate.valueOf());
2868
+ this.update.emit(this.activeDate);
2869
+ }
2870
+ else if (this.activeDate === undefined) {
2871
+ this.activeDate = new Date();
2872
+ }
2873
+ }
2874
+ /**
2875
+ * @param {?} changes
2876
+ * @return {?}
2877
+ */
2878
+ ngOnChanges(changes) {
2879
+ this.refreshView();
2880
+ this.checkIfActiveDateGotUpdated(changes["activeDate"]);
2881
+ }
2882
+ /**
2883
+ * @param {?} activeDate
2884
+ * @return {?}
2885
+ */
2886
+ checkIfActiveDateGotUpdated(activeDate) {
2887
+ if (activeDate && !activeDate.firstChange) {
2888
+ const /** @type {?} */ previousValue = activeDate.previousValue;
2889
+ if (previousValue &&
2890
+ previousValue instanceof Date &&
2891
+ previousValue.getTime() !== activeDate.currentValue.getTime()) {
2892
+ this.activeDateChange.emit(this.activeDate);
2893
+ }
2894
+ }
2895
+ }
2896
+ /**
2897
+ * @param {?} handler
2898
+ * @param {?} type
2899
+ * @return {?}
2900
+ */
2901
+ setCompareHandler(handler, type) {
2902
+ if (type === 'day') {
2903
+ this.compareHandlerDay = handler;
2904
+ }
2905
+ if (type === 'month') {
2906
+ this.compareHandlerMonth = handler;
2907
+ }
2908
+ if (type === 'year') {
2909
+ this.compareHandlerYear = handler;
2910
+ }
2911
+ }
2912
+ /**
2913
+ * @param {?} date1
2914
+ * @param {?} date2
2915
+ * @return {?}
2916
+ */
2917
+ compare(date1, date2) {
2918
+ if (date1 === undefined || date2 === undefined) {
2919
+ return undefined;
2920
+ }
2921
+ if (this.datepickerMode === 'day' && this.compareHandlerDay) {
2922
+ return this.compareHandlerDay(date1, date2);
2923
+ }
2924
+ if (this.datepickerMode === 'month' && this.compareHandlerMonth) {
2925
+ return this.compareHandlerMonth(date1, date2);
2926
+ }
2927
+ if (this.datepickerMode === 'year' && this.compareHandlerYear) {
2928
+ return this.compareHandlerYear(date1, date2);
2929
+ }
2930
+ return void 0;
2931
+ }
2932
+ /**
2933
+ * @param {?} handler
2934
+ * @param {?} type
2935
+ * @return {?}
2936
+ */
2937
+ setRefreshViewHandler(handler, type) {
2938
+ if (type === 'day') {
2939
+ this.refreshViewHandlerDay = handler;
2940
+ }
2941
+ if (type === 'month') {
2942
+ this.refreshViewHandlerMonth = handler;
2943
+ }
2944
+ if (type === 'year') {
2945
+ this.refreshViewHandlerYear = handler;
2946
+ }
2947
+ }
2948
+ /**
2949
+ * @return {?}
2950
+ */
2951
+ refreshView() {
2952
+ if (this.datepickerMode === 'day' && this.refreshViewHandlerDay) {
2953
+ this.refreshViewHandlerDay();
2954
+ }
2955
+ if (this.datepickerMode === 'month' && this.refreshViewHandlerMonth) {
2956
+ this.refreshViewHandlerMonth();
2957
+ }
2958
+ if (this.datepickerMode === 'year' && this.refreshViewHandlerYear) {
2959
+ this.refreshViewHandlerYear();
2960
+ }
2961
+ }
2962
+ /**
2963
+ * @param {?} date
2964
+ * @param {?} format
2965
+ * @return {?}
2966
+ */
2967
+ dateFilter(date, format) {
2968
+ return this.dateFormatter.format(date, format, this.locale);
2969
+ }
2970
+ /**
2971
+ * @param {?} dateObject
2972
+ * @return {?}
2973
+ */
2974
+ isActive(dateObject) {
2975
+ if (this.compare(dateObject.date, this.activeDate) === 0) {
2976
+ this.activeDateId = dateObject.uid;
2977
+ return true;
2978
+ }
2979
+ return false;
2980
+ }
2981
+ /**
2982
+ * @param {?} date
2983
+ * @param {?} format
2984
+ * @return {?}
2985
+ */
2986
+ createDateObject(date, format) {
2987
+ /* tslint:disable-next-line: no-any*/
2988
+ const /** @type {?} */ dateObject = {};
2989
+ dateObject.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
2990
+ dateObject.date = this.fixTimeZone(dateObject.date);
2991
+ dateObject.label = this.dateFilter(date, format);
2992
+ dateObject.selected = this.compare(date, this.selectedDate) === 0;
2993
+ dateObject.disabled = this.isDisabled(date);
2994
+ dateObject.current = this.compare(date, new Date()) === 0;
2995
+ dateObject.customClass = this.getCustomClassForDate(dateObject.date);
2996
+ return dateObject;
2997
+ }
2998
+ /**
2999
+ * @param {?} arr
3000
+ * @param {?} size
3001
+ * @return {?}
3002
+ */
3003
+ split(arr, size) {
3004
+ /* tslint:disable-next-line: no-any*/
3005
+ const /** @type {?} */ arrays = [];
3006
+ while (arr.length > 0) {
3007
+ arrays.push(arr.splice(0, size));
3008
+ }
3009
+ return arrays;
3010
+ }
3011
+ /**
3012
+ * @param {?} date
3013
+ * @return {?}
3014
+ */
3015
+ fixTimeZone(date) {
3016
+ const /** @type {?} */ hours = date.getHours();
3017
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate(), hours === 23 ? hours + 2 : 0);
3018
+ }
3019
+ /**
3020
+ * @param {?} date
3021
+ * @param {?=} isManual
3022
+ * @return {?}
3023
+ */
3024
+ select(date, isManual = true) {
3025
+ if (this.datepickerMode === this.minMode) {
3026
+ if (!this.activeDate) {
3027
+ this.activeDate = new Date(0, 0, 0, 0, 0, 0, 0);
3028
+ }
3029
+ this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
3030
+ this.activeDate = this.fixTimeZone(this.activeDate);
3031
+ if (isManual) {
3032
+ this.selectionDone.emit(this.activeDate);
3033
+ }
3034
+ }
3035
+ else {
3036
+ this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
3037
+ this.activeDate = this.fixTimeZone(this.activeDate);
3038
+ if (isManual) {
3039
+ this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) - 1];
3040
+ }
3041
+ }
3042
+ this.selectedDate = new Date(this.activeDate.valueOf());
3043
+ this.update.emit(this.activeDate);
3044
+ this.refreshView();
3045
+ }
3046
+ /**
3047
+ * @param {?} direction
3048
+ * @return {?}
3049
+ */
3050
+ move(direction) {
3051
+ /* tslint:disable-next-line: no-any*/
3052
+ let /** @type {?} */ expectedStep;
3053
+ if (this.datepickerMode === 'day') {
3054
+ expectedStep = this.stepDay;
3055
+ }
3056
+ if (this.datepickerMode === 'month') {
3057
+ expectedStep = this.stepMonth;
3058
+ }
3059
+ if (this.datepickerMode === 'year') {
3060
+ expectedStep = this.stepYear;
3061
+ }
3062
+ if (expectedStep) {
3063
+ const /** @type {?} */ year = this.activeDate.getFullYear() + direction * (expectedStep.years || 0);
3064
+ const /** @type {?} */ month = this.activeDate.getMonth() + direction * (expectedStep.months || 0);
3065
+ this.activeDate = new Date(year, month, 1);
3066
+ this.refreshView();
3067
+ this.activeDateChange.emit(this.activeDate);
3068
+ }
3069
+ }
3070
+ /**
3071
+ * @param {?} _direction
3072
+ * @return {?}
3073
+ */
3074
+ toggleMode(_direction) {
3075
+ const /** @type {?} */ direction = _direction || 1;
3076
+ if ((this.datepickerMode === this.maxMode && direction === 1) ||
3077
+ (this.datepickerMode === this.minMode && direction === -1)) {
3078
+ return;
3079
+ }
3080
+ this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) + direction];
3081
+ this.refreshView();
3082
+ }
3083
+ /**
3084
+ * @param {?} date
3085
+ * @return {?}
3086
+ */
3087
+ getCustomClassForDate(date) {
3088
+ if (!this.customClass) {
3089
+ return '';
3090
+ }
3091
+ // todo: build a hash of custom classes, it will work faster
3092
+ const /** @type {?} */ customClassObject = this.customClass.find((customClass) => {
3093
+ return (customClass.date.valueOf() === date.valueOf() &&
3094
+ customClass.mode === this.datepickerMode);
3095
+ }, this);
3096
+ return customClassObject === undefined ? '' : customClassObject.clazz;
3097
+ }
3098
+ /**
3099
+ * @param {?} date1Disabled
3100
+ * @param {?} date2
3101
+ * @return {?}
3102
+ */
3103
+ compareDateDisabled(date1Disabled, date2) {
3104
+ if (date1Disabled === undefined || date2 === undefined) {
3105
+ return undefined;
3106
+ }
3107
+ if (date1Disabled.mode === 'day' && this.compareHandlerDay) {
3108
+ return this.compareHandlerDay(date1Disabled.date, date2);
3109
+ }
3110
+ if (date1Disabled.mode === 'month' && this.compareHandlerMonth) {
3111
+ return this.compareHandlerMonth(date1Disabled.date, date2);
3112
+ }
3113
+ if (date1Disabled.mode === 'year' && this.compareHandlerYear) {
3114
+ return this.compareHandlerYear(date1Disabled.date, date2);
3115
+ }
3116
+ return undefined;
3117
+ }
3118
+ /**
3119
+ * @param {?} date
3120
+ * @return {?}
3121
+ */
3122
+ isDisabled(date) {
3123
+ let /** @type {?} */ isDateDisabled = false;
3124
+ if (this.dateDisabled) {
3125
+ this.dateDisabled.forEach((disabledDate) => {
3126
+ if (this.compareDateDisabled(disabledDate, date) === 0) {
3127
+ isDateDisabled = true;
3128
+ }
3129
+ });
3130
+ }
3131
+ if (this.dayDisabled) {
3132
+ isDateDisabled =
3133
+ isDateDisabled ||
3134
+ this.dayDisabled.indexOf(date.getDay()) > -1;
3135
+ }
3136
+ return (isDateDisabled ||
3137
+ (this.minDate && this.compare(date, this.minDate) < 0) ||
3138
+ (this.maxDate && this.compare(date, this.maxDate) > 0));
3139
+ }
3140
+ }
3141
+ DatePickerInnerComponent.decorators = [
3142
+ { type: Component, args: [{
3143
+ selector: 'datepicker-inner',
3144
+ template: `
3145
+ <!--&lt;!&ndash;ng-keydown="keydown($event)"&ndash;&gt;-->
3146
+ <div *ngIf="datepickerMode" class="well well-sm bg-faded p-a card" role="application" >
3147
+ <ng-content></ng-content>
3148
+ </div>
3149
+ `
3150
+ }] }
3151
+ ];
3152
+ /** @nocollapse */
3153
+ DatePickerInnerComponent.propDecorators = {
3154
+ "locale": [{ type: Input },],
3155
+ "datepickerMode": [{ type: Input },],
3156
+ "startingDay": [{ type: Input },],
3157
+ "yearRange": [{ type: Input },],
3158
+ "minDate": [{ type: Input },],
3159
+ "maxDate": [{ type: Input },],
3160
+ "minMode": [{ type: Input },],
3161
+ "maxMode": [{ type: Input },],
3162
+ "showWeeks": [{ type: Input },],
3163
+ "formatDay": [{ type: Input },],
3164
+ "formatMonth": [{ type: Input },],
3165
+ "formatYear": [{ type: Input },],
3166
+ "formatDayHeader": [{ type: Input },],
3167
+ "formatDayTitle": [{ type: Input },],
3168
+ "formatMonthTitle": [{ type: Input },],
3169
+ "onlyCurrentMonth": [{ type: Input },],
3170
+ "shortcutPropagation": [{ type: Input },],
3171
+ "customClass": [{ type: Input },],
3172
+ "monthColLimit": [{ type: Input },],
3173
+ "yearColLimit": [{ type: Input },],
3174
+ "dateDisabled": [{ type: Input },],
3175
+ "dayDisabled": [{ type: Input },],
3176
+ "initDate": [{ type: Input },],
3177
+ "selectionDone": [{ type: Output },],
3178
+ "update": [{ type: Output },],
3179
+ "activeDateChange": [{ type: Output },],
3180
+ "activeDate": [{ type: Input },],
3181
+ };
3182
+
3183
+ /**
3184
+ * @fileoverview added by tsickle
3185
+ * @suppress {checkTypes} checked by tsc
3186
+ */
3187
+ class DatepickerConfig {
3188
+ constructor() {
3189
+ this.locale = 'en';
3190
+ this.datepickerMode = 'day';
3191
+ this.startingDay = 0;
3192
+ this.yearRange = 20;
3193
+ this.minMode = 'day';
3194
+ this.maxMode = 'year';
3195
+ this.showWeeks = true;
3196
+ this.formatDay = 'DD';
3197
+ this.formatMonth = 'MMMM';
3198
+ this.formatYear = 'YYYY';
3199
+ this.formatDayHeader = 'dd';
3200
+ this.formatDayTitle = 'MMMM YYYY';
3201
+ this.formatMonthTitle = 'YYYY';
3202
+ this.onlyCurrentMonth = false;
3203
+ this.monthColLimit = 3;
3204
+ this.yearColLimit = 5;
3205
+ this.shortcutPropagation = false;
3206
+ }
3207
+ }
3208
+ DatepickerConfig.decorators = [
3209
+ { type: Injectable }
3210
+ ];
3211
+
3212
+ /**
3213
+ * @fileoverview added by tsickle
3214
+ * @suppress {checkTypes} checked by tsc
3215
+ */
3216
+ const /** @type {?} */ DATEPICKER_CONTROL_VALUE_ACCESSOR = {
3217
+ provide: NG_VALUE_ACCESSOR,
3218
+ /* tslint:disable-next-line: no-use-before-declare */
3219
+ useExisting: forwardRef(() => DatePickerComponent),
3220
+ multi: true
3221
+ };
3222
+ /* tslint:enable:component-selector-name component-selector-type */
3223
+ class DatePickerComponent {
3224
+ /**
3225
+ * @param {?} config
3226
+ */
3227
+ constructor(config) {
3228
+ /**
3229
+ * sets datepicker mode, supports: `day`, `month`, `year`
3230
+ */
3231
+ this.datepickerMode = 'day';
3232
+ /**
3233
+ * if false week numbers will be hidden
3234
+ */
3235
+ this.showWeeks = true;
3236
+ this.selectionDone = new EventEmitter(undefined);
3237
+ /**
3238
+ * callback to invoke when the activeDate is changed.
3239
+ */
3240
+ this.activeDateChange = new EventEmitter(undefined);
3241
+ /* tslint:disable-next-line: no-any*/
3242
+ this.onChange = Function.prototype;
3243
+ /* tslint:disable-next-line: no-any*/
3244
+ this.onTouched = Function.prototype;
3245
+ this._now = new Date();
3246
+ this.config = config;
3247
+ this.configureOptions();
3248
+ }
3249
+ /**
3250
+ * currently active date
3251
+ * @return {?}
3252
+ */
3253
+ get activeDate() {
3254
+ return this._activeDate || this._now;
3255
+ }
3256
+ /**
3257
+ * @param {?} value
3258
+ * @return {?}
3259
+ */
3260
+ set activeDate(value) {
3261
+ this._activeDate = value;
3262
+ }
3263
+ /**
3264
+ * @return {?}
3265
+ */
3266
+ configureOptions() {
3267
+ Object.assign(this, this.config);
3268
+ }
3269
+ /**
3270
+ * @param {?} event
3271
+ * @return {?}
3272
+ */
3273
+ onUpdate(event) {
3274
+ this.activeDate = event;
3275
+ this.onChange(event);
3276
+ }
3277
+ /**
3278
+ * @param {?} event
3279
+ * @return {?}
3280
+ */
3281
+ onSelectionDone(event) {
3282
+ this.selectionDone.emit(event);
3283
+ }
3284
+ /**
3285
+ * @param {?} event
3286
+ * @return {?}
3287
+ */
3288
+ onActiveDateChange(event) {
3289
+ this.activeDateChange.emit(event);
3290
+ }
3291
+ /**
3292
+ * @param {?} value
3293
+ * @return {?}
3294
+ */
3295
+ writeValue(value) {
3296
+ if (this._datePicker.compare(value, this._activeDate) === 0) {
3297
+ return;
3298
+ }
3299
+ if (value && value instanceof Date) {
3300
+ this.activeDate = value;
3301
+ this._datePicker.select(value, false);
3302
+ return;
3303
+ }
3304
+ this.activeDate = value ? new Date(value) : void 0;
3305
+ }
3306
+ /**
3307
+ * @param {?} fn
3308
+ * @return {?}
3309
+ */
3310
+ registerOnChange(fn) {
3311
+ this.onChange = fn;
3312
+ }
3313
+ /**
3314
+ * @param {?} fn
3315
+ * @return {?}
3316
+ */
3317
+ registerOnTouched(fn) {
3318
+ this.onTouched = fn;
3319
+ }
3320
+ }
3321
+ DatePickerComponent.decorators = [
3322
+ { type: Component, args: [{
3323
+ selector: 'datepicker',
3324
+ template: `
3325
+ <datepicker-inner [activeDate]="activeDate"
3326
+ (update)="onUpdate($event)"
3327
+ [locale]="config.locale"
3328
+ [datepickerMode]="datepickerMode"
3329
+ [initDate]="initDate"
3330
+ [minDate]="minDate"
3331
+ [maxDate]="maxDate"
3332
+ [minMode]="minMode"
3333
+ [maxMode]="maxMode"
3334
+ [showWeeks]="showWeeks"
3335
+ [formatDay]="formatDay"
3336
+ [formatMonth]="formatMonth"
3337
+ [formatYear]="formatYear"
3338
+ [formatDayHeader]="formatDayHeader"
3339
+ [formatDayTitle]="formatDayTitle"
3340
+ [formatMonthTitle]="formatMonthTitle"
3341
+ [startingDay]="startingDay"
3342
+ [yearRange]="yearRange"
3343
+ [customClass]="customClass"
3344
+ [dateDisabled]="dateDisabled"
3345
+ [dayDisabled]="dayDisabled"
3346
+ [onlyCurrentMonth]="onlyCurrentMonth"
3347
+ [shortcutPropagation]="shortcutPropagation"
3348
+ [monthColLimit]="monthColLimit"
3349
+ [yearColLimit]="yearColLimit"
3350
+ (selectionDone)="onSelectionDone($event)"
3351
+ (activeDateChange)="onActiveDateChange($event)">
3352
+ <daypicker tabindex="0"></daypicker>
3353
+ <monthpicker tabindex="0"></monthpicker>
3354
+ <yearpicker tabindex="0"></yearpicker>
3355
+ </datepicker-inner>
3356
+ `,
3357
+ providers: [DATEPICKER_CONTROL_VALUE_ACCESSOR]
3358
+ }] }
3359
+ ];
3360
+ /** @nocollapse */
3361
+ DatePickerComponent.ctorParameters = () => [
3362
+ { type: DatepickerConfig, },
3363
+ ];
3364
+ DatePickerComponent.propDecorators = {
3365
+ "datepickerMode": [{ type: Input },],
3366
+ "initDate": [{ type: Input },],
3367
+ "minDate": [{ type: Input },],
3368
+ "maxDate": [{ type: Input },],
3369
+ "minMode": [{ type: Input },],
3370
+ "maxMode": [{ type: Input },],
3371
+ "showWeeks": [{ type: Input },],
3372
+ "formatDay": [{ type: Input },],
3373
+ "formatMonth": [{ type: Input },],
3374
+ "formatYear": [{ type: Input },],
3375
+ "formatDayHeader": [{ type: Input },],
3376
+ "formatDayTitle": [{ type: Input },],
3377
+ "formatMonthTitle": [{ type: Input },],
3378
+ "startingDay": [{ type: Input },],
3379
+ "yearRange": [{ type: Input },],
3380
+ "onlyCurrentMonth": [{ type: Input },],
3381
+ "shortcutPropagation": [{ type: Input },],
3382
+ "monthColLimit": [{ type: Input },],
3383
+ "yearColLimit": [{ type: Input },],
3384
+ "customClass": [{ type: Input },],
3385
+ "dateDisabled": [{ type: Input },],
3386
+ "dayDisabled": [{ type: Input },],
3387
+ "activeDate": [{ type: Input },],
3388
+ "selectionDone": [{ type: Output },],
3389
+ "activeDateChange": [{ type: Output },],
3390
+ "_datePicker": [{ type: ViewChild, args: [DatePickerInnerComponent,] },],
3391
+ };
3392
+
3393
+ /**
3394
+ * @fileoverview added by tsickle
3395
+ * @suppress {checkTypes} checked by tsc
3396
+ */
3397
+ class DayPickerComponent {
3398
+ /**
3399
+ * @param {?} datePicker
3400
+ */
3401
+ constructor(datePicker) {
3402
+ this.labels = [];
3403
+ this.rows = [];
3404
+ this.weekNumbers = [];
3405
+ this.datePicker = datePicker;
3406
+ }
3407
+ /**
3408
+ * @return {?}
3409
+ */
3410
+ get isBs4() {
3411
+ return !isBs3();
3412
+ }
3413
+ /**
3414
+ * @return {?}
3415
+ */
3416
+ ngOnInit() {
3417
+ const /** @type {?} */ self = this;
3418
+ this.datePicker.stepDay = { months: 1 };
3419
+ this.datePicker.setRefreshViewHandler(function () {
3420
+ const /** @type {?} */ year = this.activeDate.getFullYear();
3421
+ const /** @type {?} */ month = this.activeDate.getMonth();
3422
+ const /** @type {?} */ firstDayOfMonth = new Date(year, month, 1);
3423
+ const /** @type {?} */ difference = this.startingDay - firstDayOfMonth.getDay();
3424
+ const /** @type {?} */ numDisplayedFromPreviousMonth = difference > 0 ? 7 - difference : -difference;
3425
+ const /** @type {?} */ firstDate = new Date(firstDayOfMonth.getTime());
3426
+ if (numDisplayedFromPreviousMonth > 0) {
3427
+ firstDate.setDate(-numDisplayedFromPreviousMonth + 1);
3428
+ }
3429
+ // 42 is the number of days on a six-week calendar
3430
+ const /** @type {?} */ _days = self.getDates(firstDate, 42);
3431
+ const /** @type {?} */ days = [];
3432
+ for (let /** @type {?} */ i = 0; i < 42; i++) {
3433
+ const /** @type {?} */ _dateObject = this.createDateObject(_days[i], this.formatDay);
3434
+ _dateObject.secondary = _days[i].getMonth() !== month;
3435
+ _dateObject.uid = this.uniqueId + '-' + i;
3436
+ days[i] = _dateObject;
3437
+ }
3438
+ self.labels = [];
3439
+ for (let /** @type {?} */ j = 0; j < 7; j++) {
3440
+ self.labels[j] = {};
3441
+ self.labels[j].abbr = this.dateFilter(days[j].date, this.formatDayHeader);
3442
+ self.labels[j].full = this.dateFilter(days[j].date, 'EEEE');
3443
+ }
3444
+ self.title = this.dateFilter(this.activeDate, this.formatDayTitle);
3445
+ self.rows = this.split(days, 7);
3446
+ if (this.showWeeks) {
3447
+ self.weekNumbers = [];
3448
+ const /** @type {?} */ thursdayIndex = (4 + 7 - this.startingDay) % 7;
3449
+ const /** @type {?} */ numWeeks = self.rows.length;
3450
+ for (let /** @type {?} */ curWeek = 0; curWeek < numWeeks; curWeek++) {
3451
+ self.weekNumbers.push(self.getISO8601WeekNumber(self.rows[curWeek][thursdayIndex].date));
3452
+ }
3453
+ }
3454
+ }, 'day');
3455
+ this.datePicker.setCompareHandler(function (date1, date2) {
3456
+ const /** @type {?} */ d1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());
3457
+ const /** @type {?} */ d2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());
3458
+ return d1.getTime() - d2.getTime();
3459
+ }, 'day');
3460
+ this.datePicker.refreshView();
3461
+ }
3462
+ /**
3463
+ * @param {?} startDate
3464
+ * @param {?} n
3465
+ * @return {?}
3466
+ */
3467
+ getDates(startDate, n) {
3468
+ const /** @type {?} */ dates = new Array(n);
3469
+ let /** @type {?} */ current = new Date(startDate.getTime());
3470
+ let /** @type {?} */ i = 0;
3471
+ let /** @type {?} */ date;
3472
+ while (i < n) {
3473
+ date = new Date(current.getTime());
3474
+ date = this.datePicker.fixTimeZone(date);
3475
+ dates[i++] = date;
3476
+ current = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1);
3477
+ }
3478
+ return dates;
3479
+ }
3480
+ /**
3481
+ * @param {?} date
3482
+ * @return {?}
3483
+ */
3484
+ getISO8601WeekNumber(date) {
3485
+ const /** @type {?} */ checkDate = new Date(date.getTime());
3486
+ // Thursday
3487
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
3488
+ const /** @type {?} */ time = checkDate.getTime();
3489
+ // Compare with Jan 1
3490
+ checkDate.setMonth(0);
3491
+ checkDate.setDate(1);
3492
+ return (Math.floor(Math.round((time - checkDate.getTime()) / 86400000) / 7) + 1);
3493
+ }
3494
+ }
3495
+ DayPickerComponent.decorators = [
3496
+ { type: Component, args: [{
3497
+ selector: 'daypicker',
3498
+ template: `
3499
+ <table *ngIf="datePicker.datepickerMode === 'day'" role="grid" [attr.aria-labelledby]="datePicker.uniqueId + '-title'" aria-activedescendant="activeDateId">
3500
+ <thead>
3501
+ <tr>
3502
+ <th>
3503
+ <button *ngIf="!isBs4"
3504
+ type="button"
3505
+ class="btn btn-default btn-secondary btn-sm pull-left float-left"
3506
+ (click)="datePicker.move(-1)"
3507
+ tabindex="-1">‹</button>
3508
+ <button *ngIf="isBs4"
3509
+ type="button"
3510
+ class="btn btn-default btn-secondary btn-sm pull-left float-left"
3511
+ (click)="datePicker.move(-1)"
3512
+ tabindex="-1">&lt;</button>
3513
+ </th>
3514
+ <th [attr.colspan]="5 + (datePicker.showWeeks ? 1 : 0)">
3515
+ <button [id]="datePicker.uniqueId + '-title'"
3516
+ type="button" class="btn btn-default btn-secondary btn-sm"
3517
+ (click)="datePicker.toggleMode(0)"
3518
+ [disabled]="datePicker.datepickerMode === datePicker.maxMode"
3519
+ [ngClass]="{disabled: datePicker.datepickerMode === datePicker.maxMode}" tabindex="-1" style="width:100%;">
3520
+ <strong>{{ title }}</strong>
3521
+ </button>
3522
+ </th>
3523
+ <th>
3524
+ <button *ngIf="!isBs4"
3525
+ type="button"
3526
+ class="btn btn-default btn-secondary btn-sm pull-right float-right"
3527
+ (click)="datePicker.move(1)"
3528
+ tabindex="-1">›</button>
3529
+ <button *ngIf="isBs4"
3530
+ type="button"
3531
+ class="btn btn-default btn-secondary btn-sm pull-right float-right"
3532
+ (click)="datePicker.move(1)"
3533
+ tabindex="-1">&gt;
3534
+ </button>
3535
+ </th>
3536
+ </tr>
3537
+ <tr>
3538
+ <th *ngIf="datePicker.showWeeks"></th>
3539
+ <th *ngFor="let labelz of labels" class="text-center">
3540
+ <small aria-label="labelz.full"><b>{{ labelz.abbr }}</b></small>
3541
+ </th>
3542
+ </tr>
3543
+ </thead>
3544
+ <tbody>
3545
+ <ng-template ngFor [ngForOf]="rows" let-rowz="$implicit" let-index="index">
3546
+ <tr *ngIf="!(datePicker.onlyCurrentMonth && rowz[0].secondary && rowz[6].secondary)">
3547
+ <td *ngIf="datePicker.showWeeks" class="h6" class="text-center">
3548
+ <em>{{ weekNumbers[index] }}</em>
3549
+ </td>
3550
+ <td *ngFor="let dtz of rowz" class="text-center" role="gridcell" [id]="dtz.uid">
3551
+ <button type="button" style="min-width:100%;" class="btn btn-sm {{dtz.customClass}}"
3552
+ *ngIf="!(datePicker.onlyCurrentMonth && dtz.secondary)"
3553
+ [ngClass]="{'btn-secondary': isBs4 && !dtz.selected && !datePicker.isActive(dtz), 'btn-info': dtz.selected, disabled: dtz.disabled, active: !isBs4 && datePicker.isActive(dtz), 'btn-default': !isBs4}"
3554
+ [disabled]="dtz.disabled"
3555
+ (click)="datePicker.select(dtz.date)" tabindex="-1">
3556
+ <span [ngClass]="{'text-muted': dtz.secondary || dtz.current, 'text-info': !isBs4 && dtz.current}">{{ dtz.label }}</span>
3557
+ </button>
3558
+ </td>
3559
+ </tr>
3560
+ </ng-template>
3561
+ </tbody>
3562
+ </table>
3563
+ `,
3564
+ styles: [`
3565
+ :host .btn-secondary {
3566
+ color: #292b2c;
3567
+ background-color: #fff;
3568
+ border-color: #ccc;
3569
+ }
3570
+ :host .btn-info .text-muted {
3571
+ color: #292b2c !important;
3572
+ }
3573
+ `]
3574
+ }] }
3575
+ ];
3576
+ // todo: key events implementation
3577
+ /** @nocollapse */
3578
+ DayPickerComponent.ctorParameters = () => [
3579
+ { type: DatePickerInnerComponent, },
3580
+ ];
3581
+
3582
+ /**
3583
+ * @fileoverview added by tsickle
3584
+ * @suppress {checkTypes} checked by tsc
3585
+ */
3586
+ class MonthPickerComponent {
3587
+ /**
3588
+ * @param {?} datePicker
3589
+ */
3590
+ constructor(datePicker) {
3591
+ this.rows = [];
3592
+ this.datePicker = datePicker;
3593
+ }
3594
+ /**
3595
+ * @return {?}
3596
+ */
3597
+ get isBs4() {
3598
+ return !isBs3();
3599
+ }
3600
+ /**
3601
+ * @return {?}
3602
+ */
3603
+ ngOnInit() {
3604
+ const /** @type {?} */ self = this;
3605
+ this.datePicker.stepMonth = { years: 1 };
3606
+ this.datePicker.setRefreshViewHandler(function () {
3607
+ const /** @type {?} */ months = new Array(12);
3608
+ const /** @type {?} */ year = this.activeDate.getFullYear();
3609
+ let /** @type {?} */ date;
3610
+ for (let /** @type {?} */ i = 0; i < 12; i++) {
3611
+ date = new Date(year, i, 1);
3612
+ date = this.fixTimeZone(date);
3613
+ months[i] = this.createDateObject(date, this.formatMonth);
3614
+ months[i].uid = this.uniqueId + '-' + i;
3615
+ }
3616
+ self.title = this.dateFilter(this.activeDate, this.formatMonthTitle);
3617
+ self.rows = this.split(months, self.datePicker.monthColLimit);
3618
+ }, 'month');
3619
+ this.datePicker.setCompareHandler(function (date1, date2) {
3620
+ const /** @type {?} */ d1 = new Date(date1.getFullYear(), date1.getMonth());
3621
+ const /** @type {?} */ d2 = new Date(date2.getFullYear(), date2.getMonth());
3622
+ return d1.getTime() - d2.getTime();
3623
+ }, 'month');
3624
+ this.datePicker.refreshView();
3625
+ }
3626
+ }
3627
+ MonthPickerComponent.decorators = [
3628
+ { type: Component, args: [{
3629
+ selector: 'monthpicker',
3630
+ template: `
3631
+ <table *ngIf="datePicker.datepickerMode==='month'" role="grid">
3632
+ <thead>
3633
+ <tr>
3634
+ <th>
3635
+ <button type="button" class="btn btn-default btn-sm pull-left float-left"
3636
+ (click)="datePicker.move(-1)" tabindex="-1">‹</button></th>
3637
+ <th [attr.colspan]="((datePicker.monthColLimit - 2) <= 0) ? 1 : datePicker.monthColLimit - 2">
3638
+ <button [id]="datePicker.uniqueId + '-title'"
3639
+ type="button" class="btn btn-default btn-sm"
3640
+ (click)="datePicker.toggleMode(0)"
3641
+ [disabled]="datePicker.datepickerMode === maxMode"
3642
+ [ngClass]="{disabled: datePicker.datepickerMode === maxMode}" tabindex="-1" style="width:100%;">
3643
+ <strong>{{ title }}</strong>
3644
+ </button>
3645
+ </th>
3646
+ <th>
3647
+ <button type="button" class="btn btn-default btn-sm pull-right float-right"
3648
+ (click)="datePicker.move(1)" tabindex="-1">›</button>
3649
+ </th>
3650
+ </tr>
3651
+ </thead>
3652
+ <tbody>
3653
+ <tr *ngFor="let rowz of rows">
3654
+ <td *ngFor="let dtz of rowz" class="text-center" role="gridcell" [attr.id]="dtz.uid" [ngClass]="dtz.customClass">
3655
+ <button type="button" style="min-width:100%;" class="btn btn-default"
3656
+ [ngClass]="{'btn-link': isBs4 && !dtz.selected && !datePicker.isActive(dtz), 'btn-info': dtz.selected || (isBs4 && !dtz.selected && datePicker.isActive(dtz)), disabled: dtz.disabled, active: !isBs4 && datePicker.isActive(dtz)}"
3657
+ [disabled]="dtz.disabled"
3658
+ (click)="datePicker.select(dtz.date)" tabindex="-1">
3659
+ <span [ngClass]="{'text-success': isBs4 && dtz.current, 'text-info': !isBs4 && dtz.current}">{{ dtz.label }}</span>
3660
+ </button>
3661
+ </td>
3662
+ </tr>
3663
+ </tbody>
3664
+ </table>
3665
+ `,
3666
+ styles: [`
3667
+ :host .btn-info .text-success {
3668
+ color: #fff !important;
3669
+ }
3670
+ `]
3671
+ }] }
3672
+ ];
3673
+ // todo: key events implementation
3674
+ /** @nocollapse */
3675
+ MonthPickerComponent.ctorParameters = () => [
3676
+ { type: DatePickerInnerComponent, },
3677
+ ];
3678
+
3679
+ /**
3680
+ * @fileoverview added by tsickle
3681
+ * @suppress {checkTypes} checked by tsc
3682
+ */
3683
+ class YearPickerComponent {
3684
+ /**
3685
+ * @param {?} datePicker
3686
+ */
3687
+ constructor(datePicker) {
3688
+ this.rows = [];
3689
+ this.datePicker = datePicker;
3690
+ }
3691
+ /**
3692
+ * @return {?}
3693
+ */
3694
+ get isBs4() {
3695
+ return !isBs3();
3696
+ }
3697
+ /**
3698
+ * @return {?}
3699
+ */
3700
+ ngOnInit() {
3701
+ const /** @type {?} */ self = this;
3702
+ this.datePicker.stepYear = { years: this.datePicker.yearRange };
3703
+ this.datePicker.setRefreshViewHandler(function () {
3704
+ const /** @type {?} */ years = new Array(this.yearRange);
3705
+ let /** @type {?} */ date;
3706
+ const /** @type {?} */ start = self.getStartingYear(this.activeDate.getFullYear());
3707
+ for (let /** @type {?} */ i = 0; i < this.yearRange; i++) {
3708
+ date = new Date(start + i, 0, 1);
3709
+ date = this.fixTimeZone(date);
3710
+ years[i] = this.createDateObject(date, this.formatYear);
3711
+ years[i].uid = this.uniqueId + '-' + i;
3712
+ }
3713
+ self.title = [years[0].label, years[this.yearRange - 1].label].join(' - ');
3714
+ self.rows = this.split(years, self.datePicker.yearColLimit);
3715
+ }, 'year');
3716
+ this.datePicker.setCompareHandler(function (date1, date2) {
3717
+ return date1.getFullYear() - date2.getFullYear();
3718
+ }, 'year');
3719
+ this.datePicker.refreshView();
3720
+ }
3721
+ /**
3722
+ * @param {?} year
3723
+ * @return {?}
3724
+ */
3725
+ getStartingYear(year) {
3726
+ // todo: parseInt
3727
+ return ((year - 1) / this.datePicker.yearRange * this.datePicker.yearRange + 1);
3728
+ }
3729
+ }
3730
+ YearPickerComponent.decorators = [
3731
+ { type: Component, args: [{
3732
+ selector: 'yearpicker',
3733
+ template: `
3734
+ <table *ngIf="datePicker.datepickerMode==='year'" role="grid">
3735
+ <thead>
3736
+ <tr>
3737
+ <th>
3738
+ <button type="button" class="btn btn-default btn-sm pull-left float-left"
3739
+ (click)="datePicker.move(-1)" tabindex="-1">‹</button>
3740
+ </th>
3741
+ <th [attr.colspan]="((datePicker.yearColLimit - 2) <= 0) ? 1 : datePicker.yearColLimit - 2">
3742
+ <button [id]="datePicker.uniqueId + '-title'" role="heading"
3743
+ type="button" class="btn btn-default btn-sm"
3744
+ (click)="datePicker.toggleMode(0)"
3745
+ [disabled]="datePicker.datepickerMode === datePicker.maxMode"
3746
+ [ngClass]="{disabled: datePicker.datepickerMode === datePicker.maxMode}" tabindex="-1" style="width:100%;">
3747
+ <strong>{{ title }}</strong>
3748
+ </button>
3749
+ </th>
3750
+ <th>
3751
+ <button type="button" class="btn btn-default btn-sm pull-right float-right"
3752
+ (click)="datePicker.move(1)" tabindex="-1">›</button>
3753
+ </th>
3754
+ </tr>
3755
+ </thead>
3756
+ <tbody>
3757
+ <tr *ngFor="let rowz of rows">
3758
+ <td *ngFor="let dtz of rowz" class="text-center" role="gridcell" [attr.id]="dtz.uid">
3759
+ <button type="button" style="min-width:100%;" class="btn btn-default"
3760
+ [ngClass]="{'btn-link': isBs4 && !dtz.selected && !datePicker.isActive(dtz), 'btn-info': dtz.selected || (isBs4 && !dtz.selected && datePicker.isActive(dtz)), disabled: dtz.disabled, active: !isBs4 && datePicker.isActive(dtz)}"
3761
+ [disabled]="dtz.disabled"
3762
+ (click)="datePicker.select(dtz.date)" tabindex="-1">
3763
+ <span [ngClass]="{'text-success': isBs4 && dtz.current, 'text-info': !isBs4 && dtz.current}">{{ dtz.label }}</span>
3764
+ </button>
3765
+ </td>
3766
+ </tr>
3767
+ </tbody>
3768
+ </table>
3769
+ `,
3770
+ styles: [`
3771
+ :host .btn-info .text-success {
3772
+ color: #fff !important;
3773
+ }
3774
+ `]
3775
+ }] }
3776
+ ];
3777
+ /** @nocollapse */
3778
+ YearPickerComponent.ctorParameters = () => [
3779
+ { type: DatePickerInnerComponent, },
3780
+ ];
3781
+
3782
+ /**
3783
+ * @fileoverview added by tsickle
3784
+ * @suppress {checkTypes} checked by tsc
3785
+ */
3786
+ class DatepickerModule {
3787
+ /**
3788
+ * @return {?}
3789
+ */
3790
+ static forRoot() {
3791
+ return { ngModule: DatepickerModule, providers: [DatepickerConfig] };
3792
+ }
3793
+ }
3794
+ DatepickerModule.decorators = [
3795
+ { type: NgModule, args: [{
3796
+ imports: [CommonModule, FormsModule],
3797
+ declarations: [
3798
+ DatePickerComponent,
3799
+ DatePickerInnerComponent,
3800
+ DayPickerComponent,
3801
+ MonthPickerComponent,
3802
+ YearPickerComponent
3803
+ ],
3804
+ exports: [
3805
+ DatePickerComponent,
3806
+ DatePickerInnerComponent,
3807
+ DayPickerComponent,
3808
+ MonthPickerComponent,
3809
+ YearPickerComponent
3810
+ ],
3811
+ entryComponents: [DatePickerComponent]
3812
+ },] }
3813
+ ];
3814
+
3815
+ /**
3816
+ * @fileoverview added by tsickle
3817
+ * @suppress {checkTypes} checked by tsc
3818
+ */
3819
+
3820
+ /**
3821
+ * @fileoverview added by tsickle
3822
+ * @suppress {checkTypes} checked by tsc
3823
+ */
3824
+
3825
+ export { BsDatepickerConfig, BsDatepickerDirective, BsDatepickerModule, BsDaterangepickerConfig, BsDaterangepickerDirective, BsLocaleService, DateFormatter, DatePickerComponent, DatepickerConfig, DatepickerModule, DayPickerComponent, MonthPickerComponent, YearPickerComponent, BsDatepickerAbstractComponent as ɵl, BsDatepickerInputDirective as ɵq, BsDaterangepickerInputDirective as ɵr, DatePickerInnerComponent as ɵs, DATEPICKER_CONTROL_VALUE_ACCESSOR as ɵa, BsDatepickerActions as ɵo, BsDatepickerEffects as ɵn, BsDatepickerStore as ɵm, BsCalendarLayoutComponent as ɵf, BsCurrentDateViewComponent as ɵc, BsCustomDatesViewComponent as ɵj, BsDatepickerContainerComponent as ɵk, BsDatepickerDayDecoratorComponent as ɵb, BsDatepickerNavigationViewComponent as ɵd, BsDaterangepickerContainerComponent as ɵp, BsDaysCalendarViewComponent as ɵg, BsMonthCalendarViewComponent as ɵh, BsTimepickerViewComponent as ɵe, BsYearsCalendarViewComponent as ɵi };
3826
+
3827
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC1kYXRlcGlja2VyLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvYnMtZGF0ZXBpY2tlci5jb25maWcudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9iYXNlL2JzLWRhdGVwaWNrZXItY29udGFpbmVyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvcmVkdWNlci9icy1kYXRlcGlja2VyLmFjdGlvbnMudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9icy1sb2NhbGUuc2VydmljZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvcmVkdWNlci9fZGVmYXVsdHMudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RhdGUudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci91dGlscy9icy1jYWxlbmRhci11dGlscy50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3V0aWxzL21hdHJpeC11dGlscy50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2VuZ2luZS9jYWxjLWRheXMtY2FsZW5kYXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9lbmdpbmUvZm9ybWF0LWRheXMtY2FsZW5kYXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9lbmdpbmUvZmxhZy1kYXlzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZW5naW5lL3ZpZXctbW9kZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2VuZ2luZS9mb3JtYXQtbW9udGhzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZW5naW5lL2ZsYWctbW9udGhzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZW5naW5lL2Zvcm1hdC15ZWFycy1jYWxlbmRhci50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2VuZ2luZS9mbGFnLXllYXJzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvcmVkdWNlci9icy1kYXRlcGlja2VyLnJlZHVjZXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RvcmUudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF0ZXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvYnMtZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9icy1kYXRlcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2JzLWRhdGVyYW5nZXBpY2tlci5jb25maWcudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9icy1kYXRlcmFuZ2VwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvYnMtZGF0ZXJhbmdlcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1jYWxlbmRhci1sYXlvdXQuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvdGhlbWVzL2JzL2JzLWN1cnJlbnQtZGF0ZS12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1jdXN0b20tZGF0ZXMtdmlldy5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF0ZXBpY2tlci1kYXktZGVjb3JhdG9yLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlldy5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF5cy1jYWxlbmRhci12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1tb250aHMtY2FsZW5kYXItdmlldy5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtdGltZXBpY2tlci12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy15ZWFycy1jYWxlbmRhci12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2JzLWRhdGVwaWNrZXIubW9kdWxlLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZGF0ZS1mb3JtYXR0ZXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29uZmlnLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9kYXlwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvbW9udGhwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIveWVhcnBpY2tlci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9kYXRlcGlja2VyLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyxcbiAgQnNEYXRlcGlja2VyVmlld01vZGVcbn0gZnJvbSAnLi9tb2RlbHMnO1xuXG5cbi8qKlxuICogRm9yIGRhdGUgcmFuZ2UgcGlja2VyIHRoZXJlIGFyZSBgQnNEYXRlcmFuZ2VwaWNrZXJDb25maWdgIHdoaWNoIGluaGVyaXRzIGFsbCBwcm9wZXJ0aWVzLFxuICogZXhjZXB0IGBkaXNwbGF5TW9udGhzYCwgZm9yIHJhbmdlIHBpY2tlciBpdCBkZWZhdWx0IHRvIGAyYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyQ29uZmlnIGltcGxlbWVudHMgRGF0ZXBpY2tlclJlbmRlck9wdGlvbnMge1xuICB2YWx1ZT86IERhdGUgfCBEYXRlW107XG4gIGlzRGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmYXVsdCBtaW4gZGF0ZSBmb3IgYWxsIGRhdGUvcmFuZ2UgcGlja2Vyc1xuICAgKi9cbiAgbWluRGF0ZT86IERhdGU7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heCBkYXRlIGZvciBhbGwgZGF0ZS9yYW5nZSBwaWNrZXJzXG4gICAqL1xuICBtYXhEYXRlPzogRGF0ZTtcblxuICBkYXlzRGlzYWJsZWQ/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIE1ha2VzIGRhdGVzIGZyb20gb3RoZXIgbW9udGhzIGFjdGl2ZVxuICAgKi9cbiAgc2VsZWN0RnJvbU90aGVyTW9udGg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGQgY2xhc3MgdG8gY3VycmVudCBkYXlcbiAgICovXG4gIGN1c3RvbVRvZGF5Q2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1dCBtb2RlIGZvciBhbGwgZGF0ZSBwaWNrZXJzXG4gICAqL1xuICBtaW5Nb2RlPzogQnNEYXRlcGlja2VyVmlld01vZGU7XG5cbiAgLyoqIENTUyBjbGFzcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gZGF0ZXBpY2tlciBjb250YWluZXIsXG4gICAqIHVzdWFsbHkgdXNlZCB0byBzZXQgY29sb3IgdGhlbWVcbiAgICovXG4gIGNvbnRhaW5lckNsYXNzID0gJ3RoZW1lLWdyZWVuJztcblxuICAvLyBEYXRlcGlja2VyUmVuZGVyT3B0aW9uc1xuICBkaXNwbGF5TW9udGhzID0gMTtcbiAgLyoqXG4gICAqIEFsbG93cyB0byBoaWRlIHdlZWsgbnVtYmVycyBpbiBkYXRlcGlja2VyXG4gICAqL1xuICBzaG93V2Vla051bWJlcnMgPSB0cnVlO1xuXG4gIGRhdGVJbnB1dEZvcm1hdCA9ICdMJztcbiAgLy8gcmFuZ2UgcGlja2VyXG4gIHJhbmdlU2VwYXJhdG9yID0gJyAtICc7XG4gIC8qKlxuICAgKiBEYXRlIGZvcm1hdCBmb3IgZGF0ZSByYW5nZSBpbnB1dCBmaWVsZFxuICAgKi9cbiAgcmFuZ2VJbnB1dEZvcm1hdCA9ICdMJztcblxuICAvLyBEYXRlcGlja2VyRm9ybWF0T3B0aW9uc1xuICBtb250aFRpdGxlID0gJ01NTU0nO1xuICB5ZWFyVGl0bGUgPSAnWVlZWSc7XG4gIGRheUxhYmVsID0gJ0QnO1xuICBtb250aExhYmVsID0gJ01NTU0nO1xuICB5ZWFyTGFiZWwgPSAnWVlZWSc7XG4gIHdlZWtOdW1iZXJzID0gJ3cnO1xufVxuIiwiLy8gZGF0ZXBpY2tlciBjb250YWluZXIgY29tcG9uZW50XG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby1lbXB0eSAqL1xuaW1wb3J0IHsgQnNDdXN0b21EYXRlcyB9IGZyb20gJy4uL3RoZW1lcy9icy9icy1jdXN0b20tZGF0ZXMtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyRWZmZWN0cyB9IGZyb20gJy4uL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEJzRGF0ZXBpY2tlclZpZXdNb2RlLFxuICBCc05hdmlnYXRpb25FdmVudCxcbiAgQ2FsZW5kYXJDZWxsVmlld01vZGVsLFxuICBDZWxsSG92ZXJFdmVudCxcbiAgRGF0ZXBpY2tlclJlbmRlck9wdGlvbnMsXG4gIERheXNDYWxlbmRhclZpZXdNb2RlbCxcbiAgRGF5Vmlld01vZGVsLFxuICBNb250aHNDYWxlbmRhclZpZXdNb2RlbCxcbiAgWWVhcnNDYWxlbmRhclZpZXdNb2RlbFxufSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnQge1xuICBjb250YWluZXJDbGFzczogc3RyaW5nO1xuICBpc090aGVyTW9udGhzQWN0aXZlOiBib29sZWFuO1xuXG4gIF9lZmZlY3RzOiBCc0RhdGVwaWNrZXJFZmZlY3RzO1xuICBfY3VzdG9tUmFuZ2VzRmlzaDogQnNDdXN0b21EYXRlc1tdID0gW107XG5cbiAgc2V0IG1pbkRhdGUodmFsdWU6IERhdGUpIHtcbiAgICB0aGlzLl9lZmZlY3RzLnNldE1pbkRhdGUodmFsdWUpO1xuICB9XG5cbiAgc2V0IG1heERhdGUodmFsdWU6IERhdGUpIHtcbiAgICB0aGlzLl9lZmZlY3RzLnNldE1heERhdGUodmFsdWUpO1xuICB9XG4gIHNldCBkYXlzRGlzYWJsZWQodmFsdWU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5fZWZmZWN0cy5zZXREYXlzRGlzYWJsZWQodmFsdWUpO1xuICB9XG5cbiAgc2V0IGlzRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lZmZlY3RzLnNldERpc2FibGVkKHZhbHVlKTtcbiAgfVxuXG4gIHZpZXdNb2RlOiBPYnNlcnZhYmxlPEJzRGF0ZXBpY2tlclZpZXdNb2RlPjtcbiAgZGF5c0NhbGVuZGFyOiBPYnNlcnZhYmxlPERheXNDYWxlbmRhclZpZXdNb2RlbFtdPjtcbiAgbW9udGhzQ2FsZW5kYXI6IE9ic2VydmFibGU8TW9udGhzQ2FsZW5kYXJWaWV3TW9kZWxbXT47XG4gIHllYXJzQ2FsZW5kYXI6IE9ic2VydmFibGU8WWVhcnNDYWxlbmRhclZpZXdNb2RlbFtdPjtcbiAgb3B0aW9uczogT2JzZXJ2YWJsZTxEYXRlcGlja2VyUmVuZGVyT3B0aW9ucz47XG5cbiAgc2V0Vmlld01vZGUoZXZlbnQ6IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogdm9pZCB7fVxuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzTmF2aWdhdGlvbkV2ZW50KTogdm9pZCB7fVxuXG4gIGRheUhvdmVySGFuZGxlcihldmVudDogQ2VsbEhvdmVyRXZlbnQpOiB2b2lkIHt9XG5cbiAgbW9udGhIb3ZlckhhbmRsZXIoZXZlbnQ6IENlbGxIb3ZlckV2ZW50KTogdm9pZCB7fVxuXG4gIHllYXJIb3ZlckhhbmRsZXIoZXZlbnQ6IENlbGxIb3ZlckV2ZW50KTogdm9pZCB7fVxuXG4gIGRheVNlbGVjdEhhbmRsZXIoZGF5OiBEYXlWaWV3TW9kZWwpOiB2b2lkIHt9XG5cbiAgbW9udGhTZWxlY3RIYW5kbGVyKGV2ZW50OiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpOiB2b2lkIHt9XG5cbiAgeWVhclNlbGVjdEhhbmRsZXIoZXZlbnQ6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbCk6IHZvaWQge31cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSAqL1xuICBfc3RvcFByb3BhZ2F0aW9uKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGltZVVuaXQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9taW5pLW5ncngnO1xuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzVmlld05hdmlnYXRpb25FdmVudCxcbiAgQ2VsbEhvdmVyRXZlbnQsXG4gIERhdGVwaWNrZXJSZW5kZXJPcHRpb25zXG59IGZyb20gJy4uL21vZGVscyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCc0RhdGVwaWNrZXJBY3Rpb25zIHtcbiAgc3RhdGljIHJlYWRvbmx5IENBTENVTEFURSA9ICdbZGF0ZXBpY2tlcl0gY2FsY3VsYXRlIGRhdGVzIG1hdHJpeCc7XG4gIHN0YXRpYyByZWFkb25seSBGT1JNQVQgPSAnW2RhdGVwaWNrZXJdIGZvcm1hdCBkYXRlcGlja2VyIHZhbHVlcyc7XG4gIHN0YXRpYyByZWFkb25seSBGTEFHID0gJ1tkYXRlcGlja2VyXSBzZXQgZmxhZ3MnO1xuICBzdGF0aWMgcmVhZG9ubHkgU0VMRUNUID0gJ1tkYXRlcGlja2VyXSBzZWxlY3QgZGF0ZSc7XG4gIHN0YXRpYyByZWFkb25seSBOQVZJR0FURV9PRkZTRVQgPSAnW2RhdGVwaWNrZXJdIHNoaWZ0IHZpZXcgZGF0ZSc7XG4gIHN0YXRpYyByZWFkb25seSBOQVZJR0FURV9UTyA9ICdbZGF0ZXBpY2tlcl0gY2hhbmdlIHZpZXcgZGF0ZSc7XG4gIHN0YXRpYyByZWFkb25seSBTRVRfT1BUSU9OUyA9ICdbZGF0ZXBpY2tlcl0gdXBkYXRlIHJlbmRlciBvcHRpb25zJztcbiAgc3RhdGljIHJlYWRvbmx5IEhPVkVSID0gJ1tkYXRlcGlja2VyXSBob3ZlciBkYXRlJztcbiAgc3RhdGljIHJlYWRvbmx5IENIQU5HRV9WSUVXTU9ERSA9ICdbZGF0ZXBpY2tlcl0gc3dpdGNoIHZpZXcgbW9kZSc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9NSU5fREFURSA9ICdbZGF0ZXBpY2tlcl0gc2V0IG1pbiBkYXRlJztcbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9NQVhfREFURSA9ICdbZGF0ZXBpY2tlcl0gc2V0IG1heCBkYXRlJztcbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9EQVlTRElTQUJMRUQgPSAnW2RhdGVwaWNrZXJdIHNldCBkYXlzIGRpc2FibGVkJztcbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9JU19ESVNBQkxFRCA9ICdbZGF0ZXBpY2tlcl0gc2V0IGlzIGRpc2FibGVkJztcblxuICBzdGF0aWMgcmVhZG9ubHkgU0VUX0xPQ0FMRSA9ICdbZGF0ZXBpY2tlcl0gc2V0IGRhdGVwaWNrZXIgbG9jYWxlJztcblxuICBzdGF0aWMgcmVhZG9ubHkgU0VMRUNUX1JBTkdFID0gJ1tkYXRlcmFuZ2VwaWNrZXJdIHNlbGVjdCBkYXRlcyByYW5nZSc7XG5cbiAgY2FsY3VsYXRlKCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5DQUxDVUxBVEUgfTtcbiAgfVxuXG4gIGZvcm1hdCgpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7IHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuRk9STUFUIH07XG4gIH1cblxuICBmbGFnKCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5GTEFHIH07XG4gIH1cblxuICBzZWxlY3QoZGF0ZTogRGF0ZSk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VMRUNULFxuICAgICAgcGF5bG9hZDogZGF0ZVxuICAgIH07XG4gIH1cblxuICBjaGFuZ2VWaWV3TW9kZShldmVudDogQnNEYXRlcGlja2VyVmlld01vZGUpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLkNIQU5HRV9WSUVXTU9ERSxcbiAgICAgIHBheWxvYWQ6IGV2ZW50XG4gICAgfTtcbiAgfVxuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzVmlld05hdmlnYXRpb25FdmVudCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuTkFWSUdBVEVfVE8sXG4gICAgICBwYXlsb2FkOiBldmVudFxuICAgIH07XG4gIH1cblxuICBuYXZpZ2F0ZVN0ZXAoc3RlcDogVGltZVVuaXQpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLk5BVklHQVRFX09GRlNFVCxcbiAgICAgIHBheWxvYWQ6IHN0ZXBcbiAgICB9O1xuICB9XG5cbiAgc2V0T3B0aW9ucyhvcHRpb25zOiBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VUX09QVElPTlMsXG4gICAgICBwYXlsb2FkOiBvcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIC8vIGRhdGUgcmFuZ2UgcGlja2VyXG4gIHNlbGVjdFJhbmdlKHZhbHVlOiBEYXRlW10pOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFTEVDVF9SQU5HRSxcbiAgICAgIHBheWxvYWQ6IHZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIGhvdmVyRGF5KGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuSE9WRVIsXG4gICAgICBwYXlsb2FkOiBldmVudC5pc0hvdmVyZWQgPyBldmVudC5jZWxsLmRhdGUgOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIG1pbkRhdGUoZGF0ZTogRGF0ZSk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VUX01JTl9EQVRFLFxuICAgICAgcGF5bG9hZDogZGF0ZVxuICAgIH07XG4gIH1cblxuICBtYXhEYXRlKGRhdGU6IERhdGUpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFVF9NQVhfREFURSxcbiAgICAgIHBheWxvYWQ6IGRhdGVcbiAgICB9O1xuICB9XG5cbiAgZGF5c0Rpc2FibGVkKGRheXM6IG51bWJlcltdKTogQWN0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfREFZU0RJU0FCTEVELFxuICAgICAgcGF5bG9hZDogZGF5c1xuICAgIH07XG4gIH1cblxuICBpc0Rpc2FibGVkKHZhbHVlOiBib29sZWFuKTogQWN0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfSVNfRElTQUJMRUQsXG4gICAgICBwYXlsb2FkOiB2YWx1ZVxuICAgIH07XG4gIH1cblxuICBzZXRMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFVF9MT0NBTEUsXG4gICAgICBwYXlsb2FkOiBsb2NhbGVcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJzTG9jYWxlU2VydmljZSB7XG4gIHByaXZhdGUgX2RlZmF1bHRMb2NhbGUgPSAnZW4nO1xuICBwcml2YXRlIF9sb2NhbGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5fZGVmYXVsdExvY2FsZSk7XG4gIHByaXZhdGUgX2xvY2FsZUNoYW5nZTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5fbG9jYWxlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGdldCBsb2NhbGUoKTogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gIH1cblxuICBnZXQgbG9jYWxlQ2hhbmdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZUNoYW5nZTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgdXNlKGxvY2FsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGxvY2FsZSA9PT0gdGhpcy5jdXJyZW50TG9jYWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9jYWxlLm5leHQobG9jYWxlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBnZXRGdWxsWWVhciwgZ2V0TW9udGggfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBYnN0cmFjdENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UvYnMtZGF0ZXBpY2tlci1jb250YWluZXInO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQWN0aW9ucyB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5hY3Rpb25zJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0b3JlIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLnN0b3JlJztcbmltcG9ydCB7IEJzTG9jYWxlU2VydmljZSB9IGZyb20gJy4uL2JzLWxvY2FsZS5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzTmF2aWdhdGlvbkV2ZW50LFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWwsXG4gIENlbGxIb3ZlckV2ZW50LFxuICBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyxcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBEYXlWaWV3TW9kZWwsXG4gIE1vbnRoc0NhbGVuZGFyVmlld01vZGVsLFxuICBZZWFyc0NhbGVuZGFyVmlld01vZGVsXG59IGZyb20gJy4uL21vZGVscyc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICB2aWV3TW9kZTogT2JzZXJ2YWJsZTxCc0RhdGVwaWNrZXJWaWV3TW9kZT47XG4gIGRheXNDYWxlbmRhcjogT2JzZXJ2YWJsZTxEYXlzQ2FsZW5kYXJWaWV3TW9kZWxbXT47XG4gIG1vbnRoc0NhbGVuZGFyOiBPYnNlcnZhYmxlPE1vbnRoc0NhbGVuZGFyVmlld01vZGVsW10+O1xuICB5ZWFyc0NhbGVuZGFyOiBPYnNlcnZhYmxlPFllYXJzQ2FsZW5kYXJWaWV3TW9kZWxbXT47XG4gIG9wdGlvbnM6IE9ic2VydmFibGU8RGF0ZXBpY2tlclJlbmRlck9wdGlvbnM+O1xuXG4gIHByaXZhdGUgX3N0b3JlOiBCc0RhdGVwaWNrZXJTdG9yZTtcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hY3Rpb25zOiBCc0RhdGVwaWNrZXJBY3Rpb25zLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2NhbGVTZXJ2aWNlOiBCc0xvY2FsZVNlcnZpY2UpIHt9XG5cbiAgaW5pdChfYnNEYXRlcGlja2VyU3RvcmU6IEJzRGF0ZXBpY2tlclN0b3JlKTogQnNEYXRlcGlja2VyRWZmZWN0cyB7XG4gICAgdGhpcy5fc3RvcmUgPSBfYnNEYXRlcGlja2VyU3RvcmU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBzZXR0ZXJzICovXG5cbiAgc2V0VmFsdWUodmFsdWU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLnNlbGVjdCh2YWx1ZSkpO1xuICB9XG5cbiAgc2V0UmFuZ2VWYWx1ZSh2YWx1ZTogRGF0ZVtdKTogdm9pZCB7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZWxlY3RSYW5nZSh2YWx1ZSkpO1xuICB9XG5cbiAgc2V0TWluRGF0ZSh2YWx1ZTogRGF0ZSk6IEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMubWluRGF0ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRNYXhEYXRlKHZhbHVlOiBEYXRlKTogQnNEYXRlcGlja2VyRWZmZWN0cyB7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5tYXhEYXRlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERheXNEaXNhYmxlZCh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmRheXNEaXNhYmxlZCh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREaXNhYmxlZCh2YWx1ZTogYm9vbGVhbik6IEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuaXNEaXNhYmxlZCh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiBTZXQgcmVuZGVyaW5nIG9wdGlvbnMgKi9cbiAgc2V0T3B0aW9ucyhfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcpOiBCc0RhdGVwaWNrZXJFZmZlY3RzIHtcbiAgICBjb25zdCBfb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe2xvY2FsZTogdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlfSwgX2NvbmZpZyk7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZXRPcHRpb25zKF9vcHRpb25zKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiB2aWV3IHRvIG1vZGUgYmluZGluZ3MgKi9cbiAgc2V0QmluZGluZ3MoY29udGFpbmVyOiBCc0RhdGVwaWNrZXJBYnN0cmFjdENvbXBvbmVudCk6IEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICAgIGNvbnRhaW5lci5kYXlzQ2FsZW5kYXIgPSB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5mbGFnZ2VkTW9udGhzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihtb250aHMgPT4gISFtb250aHMpXG4gICAgICApO1xuXG4gICAgLy8gbW9udGggY2FsZW5kYXJcbiAgICBjb250YWluZXIubW9udGhzQ2FsZW5kYXIgPSB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5mbGFnZ2VkTW9udGhzQ2FsZW5kYXIpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKG1vbnRocyA9PiAhIW1vbnRocylcbiAgICAgICk7XG5cbiAgICAvLyB5ZWFyIGNhbGVuZGFyXG4gICAgY29udGFpbmVyLnllYXJzQ2FsZW5kYXIgPSB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS55ZWFyc0NhbGVuZGFyRmxhZ2dlZClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoeWVhcnMgPT4gISF5ZWFycylcbiAgICAgICk7XG5cbiAgICBjb250YWluZXIudmlld01vZGUgPSB0aGlzLl9zdG9yZS5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUudmlldy5tb2RlKTtcblxuICAgIGNvbnRhaW5lci5vcHRpb25zID0gdGhpcy5fc3RvcmVcbiAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuc2hvd1dlZWtOdW1iZXJzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChzaG93V2Vla051bWJlcnMgPT4gKHtzaG93V2Vla051bWJlcnN9KSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBldmVudCBoYW5kbGVycyAqL1xuICBzZXRFdmVudEhhbmRsZXJzKGNvbnRhaW5lcjogQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnQpOiBCc0RhdGVwaWNrZXJFZmZlY3RzIHtcbiAgICBjb250YWluZXIuc2V0Vmlld01vZGUgPSAoZXZlbnQ6IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmNoYW5nZVZpZXdNb2RlKGV2ZW50KSk7XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci5uYXZpZ2F0ZVRvID0gKGV2ZW50OiBCc05hdmlnYXRpb25FdmVudCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5uYXZpZ2F0ZVN0ZXAoZXZlbnQuc3RlcCkpO1xuICAgIH07XG5cbiAgICBjb250YWluZXIuZGF5SG92ZXJIYW5kbGVyID0gKGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgX2NlbGwgPSBldmVudC5jZWxsIGFzIERheVZpZXdNb2RlbDtcbiAgICAgIGlmIChfY2VsbC5pc090aGVyTW9udGggfHwgX2NlbGwuaXNEaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuaG92ZXJEYXkoZXZlbnQpKTtcbiAgICAgIF9jZWxsLmlzSG92ZXJlZCA9IGV2ZW50LmlzSG92ZXJlZDtcbiAgICB9O1xuXG4gICAgY29udGFpbmVyLm1vbnRoSG92ZXJIYW5kbGVyID0gKGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgZXZlbnQuY2VsbC5pc0hvdmVyZWQgPSBldmVudC5pc0hvdmVyZWQ7XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci55ZWFySG92ZXJIYW5kbGVyID0gKGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgZXZlbnQuY2VsbC5pc0hvdmVyZWQgPSBldmVudC5pc0hvdmVyZWQ7XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci5tb250aFNlbGVjdEhhbmRsZXIgPSAoZXZlbnQ6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmlzRGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgIHRoaXMuX2FjdGlvbnMubmF2aWdhdGVUbyh7XG4gICAgICAgICAgdW5pdDoge1xuICAgICAgICAgICAgbW9udGg6IGdldE1vbnRoKGV2ZW50LmRhdGUpLFxuICAgICAgICAgICAgeWVhcjogZ2V0RnVsbFllYXIoZXZlbnQuZGF0ZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpZXdNb2RlOiAnZGF5J1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29udGFpbmVyLnllYXJTZWxlY3RIYW5kbGVyID0gKGV2ZW50OiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpOiB2b2lkID0+IHtcbiAgICAgIGlmIChldmVudC5pc0Rpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKFxuICAgICAgICB0aGlzLl9hY3Rpb25zLm5hdmlnYXRlVG8oe1xuICAgICAgICAgIHVuaXQ6IHtcbiAgICAgICAgICAgIHllYXI6IGdldEZ1bGxZZWFyKGV2ZW50LmRhdGUpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aWV3TW9kZTogJ21vbnRoJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZWdpc3RlckRhdGVwaWNrZXJTaWRlRWZmZWN0cygpOiBCc0RhdGVwaWNrZXJFZmZlY3RzIHtcbiAgICB0aGlzLl9zdWJzLnB1c2goXG4gICAgICB0aGlzLl9zdG9yZS5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUudmlldykuc3Vic2NyaWJlKHZpZXcgPT4ge1xuICAgICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmNhbGN1bGF0ZSgpKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIGZvcm1hdCBjYWxlbmRhciB2YWx1ZXMgb24gbW9udGggbW9kZWwgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5tb250aHNNb2RlbClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKG1vbnRoTW9kZWwgPT4gISFtb250aE1vZGVsKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUobW9udGggPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mb3JtYXQoKSkpXG4gICAgKTtcblxuICAgIC8vIGZsYWcgZGF5IHZhbHVlc1xuICAgIHRoaXMuX3N1YnMucHVzaChcbiAgICAgIHRoaXMuX3N0b3JlXG4gICAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZm9ybWF0dGVkTW9udGhzKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIobW9udGggPT4gISFtb250aClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKG1vbnRoID0+IHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuZmxhZygpKSlcbiAgICApO1xuXG4gICAgLy8gZmxhZyBkYXkgdmFsdWVzXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZERhdGUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihzZWxlY3RlZERhdGUgPT4gISFzZWxlY3RlZERhdGUpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShzZWxlY3RlZERhdGUgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mbGFnKCkpKVxuICAgICk7XG5cbiAgICAvLyBmbGFnIGZvciBkYXRlIHJhbmdlIHBpY2tlclxuICAgIHRoaXMuX3N1YnMucHVzaChcbiAgICAgIHRoaXMuX3N0b3JlXG4gICAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuc2VsZWN0ZWRSYW5nZSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKHNlbGVjdGVkUmFuZ2UgPT4gISFzZWxlY3RlZFJhbmdlKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoc2VsZWN0ZWRSYW5nZSA9PiB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmZsYWcoKSkpXG4gICAgKTtcblxuICAgIC8vIG1vbnRoc0NhbGVuZGFyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5tb250aHNDYWxlbmRhcilcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmZsYWcoKSkpXG4gICAgKTtcblxuICAgIC8vIHllYXJzIGNhbGVuZGFyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS55ZWFyc0NhbGVuZGFyTW9kZWwpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihzdGF0ZSA9PiAhIXN0YXRlKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mbGFnKCkpKVxuICAgICk7XG5cbiAgICAvLyBvbiBob3ZlclxuICAgIHRoaXMuX3N1YnMucHVzaChcbiAgICAgIHRoaXMuX3N0b3JlXG4gICAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuaG92ZXJlZERhdGUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihob3ZlcmVkRGF0ZSA9PiAhIWhvdmVyZWREYXRlKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoaG92ZXJlZERhdGUgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mbGFnKCkpKVxuICAgICk7XG5cbiAgICAvLyBvbiBsb2NhbGUgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fbG9jYWxlU2VydmljZS5sb2NhbGVDaGFuZ2VcbiAgICAgICAgLnN1YnNjcmliZShsb2NhbGUgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZXRMb2NhbGUobG9jYWxlKSkpXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLl9zdWJzKSB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIE1vbnRoVmlld09wdGlvbnNcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRNb250aE9wdGlvbnM6IE1vbnRoVmlld09wdGlvbnMgPSB7XG4gIHdpZHRoOiA3LFxuICBoZWlnaHQ6IDZcbn07XG4iLCJpbXBvcnQge1xuICBCc0RhdGVwaWNrZXJWaWV3TW9kZSxcbiAgRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnMsXG4gIERhdGVwaWNrZXJSZW5kZXJPcHRpb25zLFxuICBEYXlzQ2FsZW5kYXJNb2RlbCxcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBNb250aHNDYWxlbmRhclZpZXdNb2RlbCxcbiAgTW9udGhWaWV3T3B0aW9ucyxcbiAgWWVhcnNDYWxlbmRhclZpZXdNb2RlbFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgZGVmYXVsdE1vbnRoT3B0aW9ucyB9IGZyb20gJy4vX2RlZmF1bHRzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBCc0RhdGVwaWNrZXJWaWV3U3RhdGUge1xuICBkYXRlOiBEYXRlO1xuICBtb2RlOiBCc0RhdGVwaWNrZXJWaWV3TW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlclN0YXRlXG4gIGltcGxlbWVudHMgRGF0ZXBpY2tlclJlbmRlck9wdGlvbnMsIERhdGVwaWNrZXJGb3JtYXRPcHRpb25zIHtcbiAgLy8gZGF0ZSBwaWNrZXJcbiAgc2VsZWN0ZWREYXRlPzogRGF0ZTtcbiAgLy8gZGF0ZXJhbmdlIHBpY2tlclxuICBzZWxlY3RlZFJhbmdlPzogRGF0ZVtdO1xuXG4gIC8vIGluaXRpYWwgZGF0ZSBvZiBjYWxlbmRhciwgdG9kYXkgYnkgZGVmYXVsdFxuICB2aWV3OiBCc0RhdGVwaWNrZXJWaWV3U3RhdGU7XG5cbiAgaXNEaXNhYmxlZD86IGJvb2xlYW47XG4gIC8vIGJvdW5kc1xuICBtaW5EYXRlPzogRGF0ZTtcbiAgbWF4RGF0ZT86IERhdGU7XG4gIGRheXNEaXNhYmxlZD86IG51bWJlcltdO1xuICBtaW5Nb2RlPzogQnNEYXRlcGlja2VyVmlld01vZGU7XG5cbiAgaG92ZXJlZERhdGU/OiBEYXRlO1xuICBob3ZlcmVkTW9udGg/OiBEYXRlO1xuICBob3ZlcmVkWWVhcj86IERhdGU7XG5cbiAgLy8gZGF5cyBjYWxlbmRhclxuICBtb250aHNNb2RlbD86IERheXNDYWxlbmRhck1vZGVsW107XG4gIGZvcm1hdHRlZE1vbnRocz86IERheXNDYWxlbmRhclZpZXdNb2RlbFtdO1xuICBmbGFnZ2VkTW9udGhzPzogRGF5c0NhbGVuZGFyVmlld01vZGVsW107XG5cbiAgLy8gbW9udGhzIGNhbGVuZGFyXG4gIG1vbnRoc0NhbGVuZGFyPzogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWxbXTtcbiAgZmxhZ2dlZE1vbnRoc0NhbGVuZGFyPzogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWxbXTtcblxuICAvLyB5ZWFycyBjYWxlbmRhclxuICB5ZWFyc0NhbGVuZGFyTW9kZWw/OiBZZWFyc0NhbGVuZGFyVmlld01vZGVsW107XG4gIHllYXJzQ2FsZW5kYXJGbGFnZ2VkPzogWWVhcnNDYWxlbmRhclZpZXdNb2RlbFtdO1xuXG4gIC8vIG9wdGlvbnNcbiAgbW9udGhWaWV3T3B0aW9uczogTW9udGhWaWV3T3B0aW9ucztcblxuICAvLyBEYXRlcGlja2VyUmVuZGVyT3B0aW9uc1xuICBzaG93V2Vla051bWJlcnM/OiBib29sZWFuO1xuICBkaXNwbGF5TW9udGhzPzogbnVtYmVyO1xuICBzZWxlY3RGcm9tT3RoZXJNb250aD86IGJvb2xlYW47XG5cbiAgLy8gRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnNcbiAgbG9jYWxlOiBzdHJpbmc7XG5cbiAgbW9udGhUaXRsZTogc3RyaW5nO1xuICB5ZWFyVGl0bGU6IHN0cmluZztcblxuICBkYXlMYWJlbDogc3RyaW5nO1xuICBtb250aExhYmVsOiBzdHJpbmc7XG4gIHllYXJMYWJlbDogc3RyaW5nO1xuXG4gIHdlZWtOdW1iZXJzOiBzdHJpbmc7XG59XG5cbmNvbnN0IF9pbml0aWFsVmlldzogQnNEYXRlcGlja2VyVmlld1N0YXRlID0geyBkYXRlOiBuZXcgRGF0ZSgpLCBtb2RlOiAnZGF5JyB9O1xuXG5leHBvcnQgY29uc3QgaW5pdGlhbERhdGVwaWNrZXJTdGF0ZTogQnNEYXRlcGlja2VyU3RhdGUgPSBPYmplY3QuYXNzaWduKFxuICBuZXcgQnNEYXRlcGlja2VyQ29uZmlnKCksXG4gIHtcbiAgICBsb2NhbGU6ICdlbicsXG4gICAgdmlldzogX2luaXRpYWxWaWV3LFxuICAgIHNlbGVjdGVkUmFuZ2U6IFtdLFxuICAgIG1vbnRoVmlld09wdGlvbnM6IGRlZmF1bHRNb250aE9wdGlvbnNcbiAgfVxuKTtcbiIsImltcG9ydCB7XG4gIGdldERheSxcbiAgaXNGaXJzdERheU9mV2VlayxcbiAgaXNBZnRlcixcbiAgaXNCZWZvcmUsXG4gIHNoaWZ0RGF0ZSxcbiAgZW5kT2YsXG4gIHN0YXJ0T2Zcbn0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0aW5nRGF5T2ZDYWxlbmRhcihkYXRlOiBEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7IGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyIH0pOiBEYXRlIHtcbiAgaWYgKGlzRmlyc3REYXlPZldlZWsoZGF0ZSwgb3B0aW9ucy5maXJzdERheU9mV2VlaykpIHtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHdlZWtEYXkgPSBnZXREYXkoZGF0ZSk7XG4gIGNvbnN0IG9mZnNldCA9IGNhbGN1bGF0ZURhdGVPZmZzZXQod2Vla0RheSwgb3B0aW9ucy5maXJzdERheU9mV2Vlayk7XG5cbiAgcmV0dXJuIHNoaWZ0RGF0ZShkYXRlLCB7ZGF5OiAtb2Zmc2V0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVEYXRlT2Zmc2V0KHdlZWtkYXk6IG51bWJlciwgc3RhcnRpbmdEYXlPZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChzdGFydGluZ0RheU9mZnNldCA9PT0gMCkge1xuICAgIHJldHVybiB3ZWVrZGF5O1xuICB9XG5cbiAgY29uc3Qgb2Zmc2V0ID0gd2Vla2RheSAtIHN0YXJ0aW5nRGF5T2Zmc2V0ICUgNztcblxuICByZXR1cm4gb2Zmc2V0IDwgMCA/IG9mZnNldCArIDcgOiBvZmZzZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vbnRoRGlzYWJsZWQoZGF0ZTogRGF0ZSwgbWluOiBEYXRlLCBtYXg6IERhdGUpOiBib29sZWFuIHtcbiAgY29uc3QgbWluQm91bmQgPSBtaW4gJiYgaXNCZWZvcmUoZW5kT2YoZGF0ZSwgJ21vbnRoJyksIG1pbiwgJ2RheScpO1xuICBjb25zdCBtYXhCb3VuZCA9IG1heCAmJiBpc0FmdGVyKHN0YXJ0T2YoZGF0ZSwgJ21vbnRoJyksIG1heCwgJ2RheScpO1xuXG4gIHJldHVybiBtaW5Cb3VuZCB8fCBtYXhCb3VuZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWWVhckRpc2FibGVkKGRhdGU6IERhdGUsIG1pbjogRGF0ZSwgbWF4OiBEYXRlKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1pbkJvdW5kID0gbWluICYmIGlzQmVmb3JlKGVuZE9mKGRhdGUsICd5ZWFyJyksIG1pbiwgJ2RheScpO1xuICBjb25zdCBtYXhCb3VuZCA9IG1heCAmJiBpc0FmdGVyKHN0YXJ0T2YoZGF0ZSwgJ3llYXInKSwgbWF4LCAnZGF5Jyk7XG5cbiAgcmV0dXJuIG1pbkJvdW5kIHx8IG1heEJvdW5kO1xufVxuIiwiaW1wb3J0IHsgVGltZVVuaXQsIHNoaWZ0RGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5cbmV4cG9ydCB0eXBlIENyZWF0ZU1hdHJpeENiPFQ+ID0gKGRhdGU6IERhdGUpID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0cml4T3B0aW9ucyB7XG4gIGhlaWdodDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBpbml0aWFsRGF0ZTogRGF0ZTtcbiAgc2hpZnQ6IFRpbWVVbml0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWF0cml4PFQ+KFxuICBvcHRpb25zOiBNYXRyaXhPcHRpb25zLFxuICBmbjogQ3JlYXRlTWF0cml4Q2I8VD5cbik6IFRbXVtdIHtcbiAgbGV0IHByZXZWYWx1ZSA9IG9wdGlvbnMuaW5pdGlhbERhdGU7XG4gIGNvbnN0IG1hdHJpeDogVFtdW10gPSBuZXcgQXJyYXkob3B0aW9ucy5oZWlnaHQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuaGVpZ2h0OyBpKyspIHtcbiAgICBtYXRyaXhbaV0gPSBuZXcgQXJyYXkob3B0aW9ucy53aWR0aCk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBvcHRpb25zLndpZHRoOyBqKyspIHtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IGZuKHByZXZWYWx1ZSk7XG4gICAgICBwcmV2VmFsdWUgPSBzaGlmdERhdGUocHJldlZhbHVlLCBvcHRpb25zLnNoaWZ0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0cml4O1xufVxuIiwiLy8gdXNlciBhbmQgbW9kZWwgaW5wdXQgc2hvdWxkIGhhbmRsZSBwYXJzaW5nIGFuZCB2YWxpZGF0aW5nIGlucHV0IHZhbHVlc1xuLy8gc2hvdWxkIGFjY2VwdCBzb21lIG9wdGlvbnNcbi8vIHRvZG86IHNwbGl0IG91dCBmb3JtYXR0aW5nXG5pbXBvcnQgeyBEYXlzQ2FsZW5kYXJNb2RlbCwgTW9udGhWaWV3T3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBnZXRGaXJzdERheU9mTW9udGggfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuaW1wb3J0IHsgZ2V0U3RhcnRpbmdEYXlPZkNhbGVuZGFyIH0gZnJvbSAnLi4vdXRpbHMvYnMtY2FsZW5kYXItdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlTWF0cml4IH0gZnJvbSAnLi4vdXRpbHMvbWF0cml4LXV0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEYXlzQ2FsZW5kYXIoXG4gIHN0YXJ0aW5nRGF0ZTogRGF0ZSxcbiAgb3B0aW9uczogTW9udGhWaWV3T3B0aW9uc1xuKTogRGF5c0NhbGVuZGFyTW9kZWwge1xuICBjb25zdCBmaXJzdERheSA9IGdldEZpcnN0RGF5T2ZNb250aChzdGFydGluZ0RhdGUpO1xuICBjb25zdCBpbml0aWFsRGF0ZSA9IGdldFN0YXJ0aW5nRGF5T2ZDYWxlbmRhcihmaXJzdERheSwgb3B0aW9ucyk7XG5cbiAgY29uc3QgbWF0cml4T3B0aW9ucyA9IHtcbiAgICB3aWR0aDogb3B0aW9ucy53aWR0aCxcbiAgICBoZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0LFxuICAgIGluaXRpYWxEYXRlLFxuICAgIHNoaWZ0OiB7IGRheTogMSB9XG4gIH07XG4gIGNvbnN0IGRheXNNYXRyaXggPSBjcmVhdGVNYXRyaXg8RGF0ZT4obWF0cml4T3B0aW9ucywgZGF0ZSA9PiBkYXRlKTtcblxuICByZXR1cm4ge1xuICAgIGRheXNNYXRyaXgsXG4gICAgbW9udGg6IGZpcnN0RGF5XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBEYXRlcGlja2VyRm9ybWF0T3B0aW9ucyxcbiAgRGF5c0NhbGVuZGFyTW9kZWwsXG4gIERheXNDYWxlbmRhclZpZXdNb2RlbFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSwgZ2V0TG9jYWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERheXNDYWxlbmRhcihkYXlzQ2FsZW5kYXI6IERheXNDYWxlbmRhck1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRPcHRpb25zOiBEYXRlcGlja2VyRm9ybWF0T3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhJbmRleDogbnVtYmVyKTogRGF5c0NhbGVuZGFyVmlld01vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBtb250aDogZGF5c0NhbGVuZGFyLm1vbnRoLFxuICAgIG1vbnRoVGl0bGU6IGZvcm1hdERhdGUoXG4gICAgICBkYXlzQ2FsZW5kYXIubW9udGgsXG4gICAgICBmb3JtYXRPcHRpb25zLm1vbnRoVGl0bGUsXG4gICAgICBmb3JtYXRPcHRpb25zLmxvY2FsZVxuICAgICksXG4gICAgeWVhclRpdGxlOiBmb3JtYXREYXRlKFxuICAgICAgZGF5c0NhbGVuZGFyLm1vbnRoLFxuICAgICAgZm9ybWF0T3B0aW9ucy55ZWFyVGl0bGUsXG4gICAgICBmb3JtYXRPcHRpb25zLmxvY2FsZVxuICAgICksXG4gICAgd2Vla051bWJlcnM6IGdldFdlZWtOdW1iZXJzKFxuICAgICAgZGF5c0NhbGVuZGFyLmRheXNNYXRyaXgsXG4gICAgICBmb3JtYXRPcHRpb25zLndlZWtOdW1iZXJzLFxuICAgICAgZm9ybWF0T3B0aW9ucy5sb2NhbGVcbiAgICApLFxuICAgIHdlZWtkYXlzOiBnZXRTaGlmdGVkV2Vla2RheXMoZm9ybWF0T3B0aW9ucy5sb2NhbGUpLFxuICAgIHdlZWtzOiBkYXlzQ2FsZW5kYXIuZGF5c01hdHJpeC5tYXAoKHdlZWs6IERhdGVbXSwgd2Vla0luZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICBkYXlzOiB3ZWVrLm1hcCgoZGF0ZTogRGF0ZSwgZGF5SW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgZGF0ZSxcbiAgICAgICAgbGFiZWw6IGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3B0aW9ucy5kYXlMYWJlbCwgZm9ybWF0T3B0aW9ucy5sb2NhbGUpLFxuICAgICAgICBtb250aEluZGV4LFxuICAgICAgICB3ZWVrSW5kZXgsXG4gICAgICAgIGRheUluZGV4XG4gICAgICB9KSlcbiAgICB9KSlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtOdW1iZXJzKGRheXNNYXRyaXg6IERhdGVbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gZGF5c01hdHJpeC5tYXAoXG4gICAgKGRheXM6IERhdGVbXSkgPT4gKGRheXNbMF0gPyBmb3JtYXREYXRlKGRheXNbMF0sIGZvcm1hdCwgbG9jYWxlKSA6ICcnKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hpZnRlZFdlZWtkYXlzKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBfbG9jYWxlID0gZ2V0TG9jYWxlKGxvY2FsZSk7XG4gIGNvbnN0IHdlZWtkYXlzID0gX2xvY2FsZS53ZWVrZGF5c1Nob3J0KCkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZpcnN0RGF5T2ZXZWVrID0gX2xvY2FsZS5maXJzdERheU9mV2VlaygpO1xuXG4gIHJldHVybiBbLi4ud2Vla2RheXMuc2xpY2UoZmlyc3REYXlPZldlZWspLCAuLi53ZWVrZGF5cy5zbGljZSgwLCBmaXJzdERheU9mV2VlayldO1xufVxuIiwiaW1wb3J0IHtcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBEYXlWaWV3TW9kZWwsXG4gIFdlZWtWaWV3TW9kZWxcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuaW1wb3J0IHtcbiAgaXNBZnRlcixcbiAgaXNCZWZvcmUsXG4gIGlzRGlzYWJsZWREYXksXG4gIGlzU2FtZURheSxcbiAgaXNTYW1lTW9udGgsXG4gIHNoaWZ0RGF0ZVxufSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5pbXBvcnQgeyBpc01vbnRoRGlzYWJsZWQgfSBmcm9tICcuLi91dGlscy9icy1jYWxlbmRhci11dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxhZ0RheXNDYWxlbmRhck9wdGlvbnMge1xuICBpc0Rpc2FibGVkOiBib29sZWFuO1xuICBtaW5EYXRlOiBEYXRlO1xuICBtYXhEYXRlOiBEYXRlO1xuICBkYXlzRGlzYWJsZWQ6IG51bWJlcltdO1xuICBob3ZlcmVkRGF0ZTogRGF0ZTtcbiAgc2VsZWN0ZWREYXRlOiBEYXRlO1xuICBzZWxlY3RlZFJhbmdlOiBEYXRlW107XG4gIGRpc3BsYXlNb250aHM6IG51bWJlcjtcbiAgbW9udGhJbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmxhZ0RheXNDYWxlbmRhcihcbiAgZm9ybWF0dGVkTW9udGg6IERheXNDYWxlbmRhclZpZXdNb2RlbCxcbiAgb3B0aW9uczogRmxhZ0RheXNDYWxlbmRhck9wdGlvbnNcbik6IERheXNDYWxlbmRhclZpZXdNb2RlbCB7XG4gIGZvcm1hdHRlZE1vbnRoLndlZWtzLmZvckVhY2goKHdlZWs6IFdlZWtWaWV3TW9kZWwpID0+IHtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGN5Y2xvbWF0aWMtY29tcGxleGl0eSAqL1xuICAgIHdlZWsuZGF5cy5mb3JFYWNoKChkYXk6IERheVZpZXdNb2RlbCwgZGF5SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gZGF0ZXBpY2tlclxuICAgICAgY29uc3QgaXNPdGhlck1vbnRoID0gIWlzU2FtZU1vbnRoKGRheS5kYXRlLCBmb3JtYXR0ZWRNb250aC5tb250aCk7XG5cbiAgICAgIGNvbnN0IGlzSG92ZXJlZCA9XG4gICAgICAgICFpc090aGVyTW9udGggJiYgaXNTYW1lRGF5KGRheS5kYXRlLCBvcHRpb25zLmhvdmVyZWREYXRlKTtcbiAgICAgIC8vIGRhdGUgcmFuZ2UgcGlja2VyXG4gICAgICBjb25zdCBpc1NlbGVjdGlvblN0YXJ0ID1cbiAgICAgICAgIWlzT3RoZXJNb250aCAmJlxuICAgICAgICBvcHRpb25zLnNlbGVjdGVkUmFuZ2UgJiZcbiAgICAgICAgaXNTYW1lRGF5KGRheS5kYXRlLCBvcHRpb25zLnNlbGVjdGVkUmFuZ2VbMF0pO1xuICAgICAgY29uc3QgaXNTZWxlY3Rpb25FbmQgPVxuICAgICAgICAhaXNPdGhlck1vbnRoICYmXG4gICAgICAgIG9wdGlvbnMuc2VsZWN0ZWRSYW5nZSAmJlxuICAgICAgICBpc1NhbWVEYXkoZGF5LmRhdGUsIG9wdGlvbnMuc2VsZWN0ZWRSYW5nZVsxXSk7XG5cbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPVxuICAgICAgICAoIWlzT3RoZXJNb250aCAmJiBpc1NhbWVEYXkoZGF5LmRhdGUsIG9wdGlvbnMuc2VsZWN0ZWREYXRlKSkgfHxcbiAgICAgICAgaXNTZWxlY3Rpb25TdGFydCB8fFxuICAgICAgICBpc1NlbGVjdGlvbkVuZDtcblxuICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgIWlzT3RoZXJNb250aCAmJlxuICAgICAgICBvcHRpb25zLnNlbGVjdGVkUmFuZ2UgJiZcbiAgICAgICAgaXNEYXRlSW5SYW5nZShkYXkuZGF0ZSwgb3B0aW9ucy5zZWxlY3RlZFJhbmdlLCBvcHRpb25zLmhvdmVyZWREYXRlKTtcblxuICAgICAgY29uc3QgaXNEaXNhYmxlZCA9XG4gICAgICAgIG9wdGlvbnMuaXNEaXNhYmxlZCB8fFxuICAgICAgICBpc0JlZm9yZShkYXkuZGF0ZSwgb3B0aW9ucy5taW5EYXRlLCAnZGF5JykgfHxcbiAgICAgICAgaXNBZnRlcihkYXkuZGF0ZSwgb3B0aW9ucy5tYXhEYXRlLCAnZGF5JykgfHxcbiAgICAgICAgaXNEaXNhYmxlZERheShkYXkuZGF0ZSwgb3B0aW9ucy5kYXlzRGlzYWJsZWQpO1xuXG4gICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBpc1RvZGF5ID0gIWlzT3RoZXJNb250aCAmJiBpc1NhbWVEYXkoZGF5LmRhdGUsIGN1cnJlbnREYXRlKTtcblxuICAgICAgLy8gZGVjaWRlIHVwZGF0ZSBvciBub3RcbiAgICAgIGNvbnN0IG5ld0RheSA9IE9iamVjdC5hc3NpZ24oe30sIGRheSwge1xuICAgICAgICBpc090aGVyTW9udGgsXG4gICAgICAgIGlzSG92ZXJlZCxcbiAgICAgICAgaXNTZWxlY3RlZCxcbiAgICAgICAgaXNTZWxlY3Rpb25TdGFydCxcbiAgICAgICAgaXNTZWxlY3Rpb25FbmQsXG4gICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgaXNEaXNhYmxlZCxcbiAgICAgICAgaXNUb2RheVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZGF5LmlzT3RoZXJNb250aCAhPT0gbmV3RGF5LmlzT3RoZXJNb250aCB8fFxuICAgICAgICBkYXkuaXNIb3ZlcmVkICE9PSBuZXdEYXkuaXNIb3ZlcmVkIHx8XG4gICAgICAgIGRheS5pc1NlbGVjdGVkICE9PSBuZXdEYXkuaXNTZWxlY3RlZCB8fFxuICAgICAgICBkYXkuaXNTZWxlY3Rpb25TdGFydCAhPT0gbmV3RGF5LmlzU2VsZWN0aW9uU3RhcnQgfHxcbiAgICAgICAgZGF5LmlzU2VsZWN0aW9uRW5kICE9PSBuZXdEYXkuaXNTZWxlY3Rpb25FbmQgfHxcbiAgICAgICAgZGF5LmlzRGlzYWJsZWQgIT09IG5ld0RheS5pc0Rpc2FibGVkIHx8XG4gICAgICAgIGRheS5pc0luUmFuZ2UgIT09IG5ld0RheS5pc0luUmFuZ2VcbiAgICAgICkge1xuICAgICAgICB3ZWVrLmRheXNbZGF5SW5kZXhdID0gbmV3RGF5O1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvLyB0b2RvOiBhZGQgY2hlY2sgZm9yIGxpbmtlZCBjYWxlbmRhcnNcbiAgZm9ybWF0dGVkTW9udGguaGlkZUxlZnRBcnJvdyA9XG4gICAgb3B0aW9ucy5pc0Rpc2FibGVkIHx8XG4gICAgKG9wdGlvbnMubW9udGhJbmRleCA+IDAgJiYgb3B0aW9ucy5tb250aEluZGV4ICE9PSBvcHRpb25zLmRpc3BsYXlNb250aHMpO1xuICBmb3JtYXR0ZWRNb250aC5oaWRlUmlnaHRBcnJvdyA9XG4gICAgb3B0aW9ucy5pc0Rpc2FibGVkIHx8XG4gICAgKG9wdGlvbnMubW9udGhJbmRleCA8IG9wdGlvbnMuZGlzcGxheU1vbnRocyAmJlxuICAgICAgb3B0aW9ucy5tb250aEluZGV4ICsgMSAhPT0gb3B0aW9ucy5kaXNwbGF5TW9udGhzKTtcblxuICBmb3JtYXR0ZWRNb250aC5kaXNhYmxlTGVmdEFycm93ID0gaXNNb250aERpc2FibGVkKFxuICAgIHNoaWZ0RGF0ZShmb3JtYXR0ZWRNb250aC5tb250aCwgeyBtb250aDogLTEgfSksXG4gICAgb3B0aW9ucy5taW5EYXRlLFxuICAgIG9wdGlvbnMubWF4RGF0ZVxuICApO1xuICBmb3JtYXR0ZWRNb250aC5kaXNhYmxlUmlnaHRBcnJvdyA9IGlzTW9udGhEaXNhYmxlZChcbiAgICBzaGlmdERhdGUoZm9ybWF0dGVkTW9udGgubW9udGgsIHsgbW9udGg6IDEgfSksXG4gICAgb3B0aW9ucy5taW5EYXRlLFxuICAgIG9wdGlvbnMubWF4RGF0ZVxuICApO1xuXG4gIHJldHVybiBmb3JtYXR0ZWRNb250aDtcbn1cblxuZnVuY3Rpb24gaXNEYXRlSW5SYW5nZShcbiAgZGF0ZTogRGF0ZSxcbiAgc2VsZWN0ZWRSYW5nZTogRGF0ZVtdLFxuICBob3ZlcmVkRGF0ZTogRGF0ZVxuKTogYm9vbGVhbiB7XG4gIGlmICghZGF0ZSB8fCAhc2VsZWN0ZWRSYW5nZVswXSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzZWxlY3RlZFJhbmdlWzFdKSB7XG4gICAgcmV0dXJuIGRhdGUgPiBzZWxlY3RlZFJhbmdlWzBdICYmIGRhdGUgPD0gc2VsZWN0ZWRSYW5nZVsxXTtcbiAgfVxuXG4gIGlmIChob3ZlcmVkRGF0ZSkge1xuICAgIHJldHVybiBkYXRlID4gc2VsZWN0ZWRSYW5nZVswXSAmJiBkYXRlIDw9IGhvdmVyZWREYXRlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiaW1wb3J0IHsgQnNEYXRlcGlja2VyVmlld01vZGUgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FuU3dpdGNoTW9kZShtb2RlOiBCc0RhdGVwaWNrZXJWaWV3TW9kZSwgbWluTW9kZT86IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBtaW5Nb2RlID8gbW9kZSA+PSBtaW5Nb2RlIDogdHJ1ZTtcbn1cbiIsImltcG9ydCB7XG4gIERhdGVwaWNrZXJGb3JtYXRPcHRpb25zLFxuICBNb250aHNDYWxlbmRhclZpZXdNb2RlbCxcbiAgQ2FsZW5kYXJDZWxsVmlld01vZGVsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBzdGFydE9mLCBmb3JtYXREYXRlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IGNyZWF0ZU1hdHJpeCB9IGZyb20gJy4uL3V0aWxzL21hdHJpeC11dGlscyc7XG5cbmNvbnN0IGhlaWdodCA9IDQ7XG5jb25zdCB3aWR0aCA9IDM7XG5jb25zdCBzaGlmdCA9IHsgbW9udGg6IDEgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE1vbnRoc0NhbGVuZGFyKFxuICB2aWV3RGF0ZTogRGF0ZSxcbiAgZm9ybWF0T3B0aW9uczogRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnNcbik6IE1vbnRoc0NhbGVuZGFyVmlld01vZGVsIHtcbiAgY29uc3QgaW5pdGlhbERhdGUgPSBzdGFydE9mKHZpZXdEYXRlLCAneWVhcicpO1xuICBjb25zdCBtYXRyaXhPcHRpb25zID0geyB3aWR0aCwgaGVpZ2h0LCBpbml0aWFsRGF0ZSwgc2hpZnQgfTtcbiAgY29uc3QgbW9udGhNYXRyaXggPSBjcmVhdGVNYXRyaXg8XG4gICAgQ2FsZW5kYXJDZWxsVmlld01vZGVsXG4gID4obWF0cml4T3B0aW9ucywgZGF0ZSA9PiAoe1xuICAgIGRhdGUsXG4gICAgbGFiZWw6IGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3B0aW9ucy5tb250aExhYmVsLCBmb3JtYXRPcHRpb25zLmxvY2FsZSlcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgbW9udGhzOiBtb250aE1hdHJpeCxcbiAgICBtb250aFRpdGxlOiAnJyxcbiAgICB5ZWFyVGl0bGU6IGZvcm1hdERhdGUoXG4gICAgICB2aWV3RGF0ZSxcbiAgICAgIGZvcm1hdE9wdGlvbnMueWVhclRpdGxlLFxuICAgICAgZm9ybWF0T3B0aW9ucy5sb2NhbGVcbiAgICApXG4gIH07XG59XG4iLCJpbXBvcnQgeyBpc1NhbWVNb250aCwgc2hpZnREYXRlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7XG4gIE1vbnRoc0NhbGVuZGFyVmlld01vZGVsLFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IGlzTW9udGhEaXNhYmxlZCwgaXNZZWFyRGlzYWJsZWQgfSBmcm9tICcuLi91dGlscy9icy1jYWxlbmRhci11dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxhZ01vbnRoQ2FsZW5kYXJPcHRpb25zIHtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgbWluRGF0ZTogRGF0ZTtcbiAgbWF4RGF0ZTogRGF0ZTtcbiAgaG92ZXJlZE1vbnRoOiBEYXRlO1xuICBkaXNwbGF5TW9udGhzOiBudW1iZXI7XG4gIG1vbnRoSW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYWdNb250aHNDYWxlbmRhcihcbiAgbW9udGhDYWxlbmRhcjogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWwsXG4gIG9wdGlvbnM6IEZsYWdNb250aENhbGVuZGFyT3B0aW9uc1xuKTogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWwge1xuICBtb250aENhbGVuZGFyLm1vbnRocy5mb3JFYWNoKFxuICAgIChtb250aHM6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbFtdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBtb250aHMuZm9yRWFjaCgobW9udGg6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbCwgbW9udGhJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzSG92ZXJlZCA9IGlzU2FtZU1vbnRoKG1vbnRoLmRhdGUsIG9wdGlvbnMuaG92ZXJlZE1vbnRoKTtcbiAgICAgICAgY29uc3QgaXNEaXNhYmxlZCA9XG4gICAgICAgICAgb3B0aW9ucy5pc0Rpc2FibGVkIHx8XG4gICAgICAgICAgaXNNb250aERpc2FibGVkKG1vbnRoLmRhdGUsIG9wdGlvbnMubWluRGF0ZSwgb3B0aW9ucy5tYXhEYXRlKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGggPSBPYmplY3QuYXNzaWduKC8qe30sKi8gbW9udGgsIHtcbiAgICAgICAgICBpc0hvdmVyZWQsXG4gICAgICAgICAgaXNEaXNhYmxlZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1vbnRoLmlzSG92ZXJlZCAhPT0gbmV3TW9udGguaXNIb3ZlcmVkIHx8XG4gICAgICAgICAgbW9udGguaXNEaXNhYmxlZCAhPT0gbmV3TW9udGguaXNEaXNhYmxlZFxuICAgICAgICApIHtcbiAgICAgICAgICBtb250aENhbGVuZGFyLm1vbnRoc1tyb3dJbmRleF1bbW9udGhJbmRleF0gPSBuZXdNb250aDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIC8vIHRvZG86IGFkZCBjaGVjayBmb3IgbGlua2VkIGNhbGVuZGFyc1xuICBtb250aENhbGVuZGFyLmhpZGVMZWZ0QXJyb3cgPVxuICAgIG9wdGlvbnMubW9udGhJbmRleCA+IDAgJiYgb3B0aW9ucy5tb250aEluZGV4ICE9PSBvcHRpb25zLmRpc3BsYXlNb250aHM7XG4gIG1vbnRoQ2FsZW5kYXIuaGlkZVJpZ2h0QXJyb3cgPVxuICAgIG9wdGlvbnMubW9udGhJbmRleCA8IG9wdGlvbnMuZGlzcGxheU1vbnRocyAmJlxuICAgIG9wdGlvbnMubW9udGhJbmRleCArIDEgIT09IG9wdGlvbnMuZGlzcGxheU1vbnRocztcblxuICBtb250aENhbGVuZGFyLmRpc2FibGVMZWZ0QXJyb3cgPSBpc1llYXJEaXNhYmxlZChcbiAgICBzaGlmdERhdGUobW9udGhDYWxlbmRhci5tb250aHNbMF1bMF0uZGF0ZSwgeyB5ZWFyOiAtMSB9KSxcbiAgICBvcHRpb25zLm1pbkRhdGUsXG4gICAgb3B0aW9ucy5tYXhEYXRlXG4gICk7XG4gIG1vbnRoQ2FsZW5kYXIuZGlzYWJsZVJpZ2h0QXJyb3cgPSBpc1llYXJEaXNhYmxlZChcbiAgICBzaGlmdERhdGUobW9udGhDYWxlbmRhci5tb250aHNbMF1bMF0uZGF0ZSwgeyB5ZWFyOiAxIH0pLFxuICAgIG9wdGlvbnMubWluRGF0ZSxcbiAgICBvcHRpb25zLm1heERhdGVcbiAgKTtcblxuICByZXR1cm4gbW9udGhDYWxlbmRhcjtcbn1cbiIsImltcG9ydCB7XG4gIERhdGVwaWNrZXJGb3JtYXRPcHRpb25zLFxuICBZZWFyc0NhbGVuZGFyVmlld01vZGVsLFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IHNoaWZ0RGF0ZSwgZm9ybWF0RGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBjcmVhdGVNYXRyaXggfSBmcm9tICcuLi91dGlscy9tYXRyaXgtdXRpbHMnO1xuXG5jb25zdCBoZWlnaHQgPSA0O1xuY29uc3Qgd2lkdGggPSA0O1xuZXhwb3J0IGNvbnN0IHllYXJzUGVyQ2FsZW5kYXIgPSBoZWlnaHQgKiB3aWR0aDtcbmNvbnN0IGluaXRpYWxTaGlmdCA9IChNYXRoLmZsb29yKHllYXJzUGVyQ2FsZW5kYXIgLyAyKSAtIDEpICogLTE7XG5jb25zdCBzaGlmdCA9IHsgeWVhcjogMSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0WWVhcnNDYWxlbmRhcihcbiAgdmlld0RhdGU6IERhdGUsXG4gIGZvcm1hdE9wdGlvbnM6IERhdGVwaWNrZXJGb3JtYXRPcHRpb25zXG4pOiBZZWFyc0NhbGVuZGFyVmlld01vZGVsIHtcbiAgY29uc3QgaW5pdGlhbERhdGUgPSBzaGlmdERhdGUodmlld0RhdGUsIHsgeWVhcjogaW5pdGlhbFNoaWZ0IH0pO1xuICBjb25zdCBtYXRyaXhPcHRpb25zID0geyB3aWR0aCwgaGVpZ2h0LCBpbml0aWFsRGF0ZSwgc2hpZnQgfTtcbiAgY29uc3QgeWVhcnNNYXRyaXggPSBjcmVhdGVNYXRyaXg8XG4gICAgQ2FsZW5kYXJDZWxsVmlld01vZGVsXG4gID4obWF0cml4T3B0aW9ucywgZGF0ZSA9PiAoe1xuICAgIGRhdGUsXG4gICAgbGFiZWw6IGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3B0aW9ucy55ZWFyTGFiZWwsIGZvcm1hdE9wdGlvbnMubG9jYWxlKVxuICB9KSk7XG4gIGNvbnN0IHllYXJUaXRsZSA9IGZvcm1hdFllYXJSYW5nZVRpdGxlKHllYXJzTWF0cml4LCBmb3JtYXRPcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIHllYXJzOiB5ZWFyc01hdHJpeCxcbiAgICBtb250aFRpdGxlOiAnJyxcbiAgICB5ZWFyVGl0bGVcbiAgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhclJhbmdlVGl0bGUoXG4gIHllYXJzTWF0cml4OiBDYWxlbmRhckNlbGxWaWV3TW9kZWxbXVtdLFxuICBmb3JtYXRPcHRpb25zOiBEYXRlcGlja2VyRm9ybWF0T3B0aW9uc1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbSA9IGZvcm1hdERhdGUoXG4gICAgeWVhcnNNYXRyaXhbMF1bMF0uZGF0ZSxcbiAgICBmb3JtYXRPcHRpb25zLnllYXJUaXRsZSxcbiAgICBmb3JtYXRPcHRpb25zLmxvY2FsZVxuICApO1xuICBjb25zdCB0byA9IGZvcm1hdERhdGUoXG4gICAgeWVhcnNNYXRyaXhbaGVpZ2h0IC0gMV1bd2lkdGggLSAxXS5kYXRlLFxuICAgIGZvcm1hdE9wdGlvbnMueWVhclRpdGxlLFxuICAgIGZvcm1hdE9wdGlvbnMubG9jYWxlXG4gICk7XG5cbiAgcmV0dXJuIGAke2Zyb219IC0gJHt0b31gO1xufVxuIiwiaW1wb3J0IHsgaXNTYW1lWWVhciwgc2hpZnREYXRlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFllYXJzQ2FsZW5kYXJWaWV3TW9kZWwsIENhbGVuZGFyQ2VsbFZpZXdNb2RlbCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBpc1llYXJEaXNhYmxlZCB9IGZyb20gJy4uL3V0aWxzL2JzLWNhbGVuZGFyLXV0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBGbGFnWWVhcnNDYWxlbmRhck9wdGlvbnMge1xuICBpc0Rpc2FibGVkOiBib29sZWFuO1xuICBtaW5EYXRlOiBEYXRlO1xuICBtYXhEYXRlOiBEYXRlO1xuICBob3ZlcmVkWWVhcjogRGF0ZTtcbiAgZGlzcGxheU1vbnRoczogbnVtYmVyO1xuICB5ZWFySW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYWdZZWFyc0NhbGVuZGFyKFxuICB5ZWFyc0NhbGVuZGFyOiBZZWFyc0NhbGVuZGFyVmlld01vZGVsLFxuICBvcHRpb25zOiBGbGFnWWVhcnNDYWxlbmRhck9wdGlvbnNcbik6IFllYXJzQ2FsZW5kYXJWaWV3TW9kZWwge1xuICB5ZWFyc0NhbGVuZGFyLnllYXJzLmZvckVhY2goXG4gICAgKHllYXJzOiBDYWxlbmRhckNlbGxWaWV3TW9kZWxbXSwgcm93SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgeWVhcnMuZm9yRWFjaCgoeWVhcjogQ2FsZW5kYXJDZWxsVmlld01vZGVsLCB5ZWFySW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBpc0hvdmVyZWQgPSBpc1NhbWVZZWFyKHllYXIuZGF0ZSwgb3B0aW9ucy5ob3ZlcmVkWWVhcik7XG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPVxuICAgICAgICAgIG9wdGlvbnMuaXNEaXNhYmxlZCB8fFxuICAgICAgICAgIGlzWWVhckRpc2FibGVkKHllYXIuZGF0ZSwgb3B0aW9ucy5taW5EYXRlLCBvcHRpb25zLm1heERhdGUpO1xuXG4gICAgICAgIGNvbnN0IG5ld01vbnRoID0gT2JqZWN0LmFzc2lnbigvKnt9LCovIHllYXIsIHsgaXNIb3ZlcmVkLCBpc0Rpc2FibGVkIH0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeWVhci5pc0hvdmVyZWQgIT09IG5ld01vbnRoLmlzSG92ZXJlZCB8fFxuICAgICAgICAgIHllYXIuaXNEaXNhYmxlZCAhPT0gbmV3TW9udGguaXNEaXNhYmxlZFxuICAgICAgICApIHtcbiAgICAgICAgICB5ZWFyc0NhbGVuZGFyLnllYXJzW3Jvd0luZGV4XVt5ZWFySW5kZXhdID0gbmV3TW9udGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgKTtcblxuICAvLyB0b2RvOiBhZGQgY2hlY2sgZm9yIGxpbmtlZCBjYWxlbmRhcnNcbiAgeWVhcnNDYWxlbmRhci5oaWRlTGVmdEFycm93ID1cbiAgICBvcHRpb25zLnllYXJJbmRleCA+IDAgJiYgb3B0aW9ucy55ZWFySW5kZXggIT09IG9wdGlvbnMuZGlzcGxheU1vbnRocztcbiAgeWVhcnNDYWxlbmRhci5oaWRlUmlnaHRBcnJvdyA9XG4gICAgb3B0aW9ucy55ZWFySW5kZXggPCBvcHRpb25zLmRpc3BsYXlNb250aHMgJiZcbiAgICBvcHRpb25zLnllYXJJbmRleCArIDEgIT09IG9wdGlvbnMuZGlzcGxheU1vbnRocztcblxuICB5ZWFyc0NhbGVuZGFyLmRpc2FibGVMZWZ0QXJyb3cgPSBpc1llYXJEaXNhYmxlZChcbiAgICBzaGlmdERhdGUoeWVhcnNDYWxlbmRhci55ZWFyc1swXVswXS5kYXRlLCB7IHllYXI6IC0xIH0pLFxuICAgIG9wdGlvbnMubWluRGF0ZSxcbiAgICBvcHRpb25zLm1heERhdGVcbiAgKTtcbiAgY29uc3QgaSA9IHllYXJzQ2FsZW5kYXIueWVhcnMubGVuZ3RoIC0gMTtcbiAgY29uc3QgaiA9IHllYXJzQ2FsZW5kYXIueWVhcnNbaV0ubGVuZ3RoIC0gMTtcbiAgeWVhcnNDYWxlbmRhci5kaXNhYmxlUmlnaHRBcnJvdyA9IGlzWWVhckRpc2FibGVkKFxuICAgIHNoaWZ0RGF0ZSh5ZWFyc0NhbGVuZGFyLnllYXJzW2ldW2pdLmRhdGUsIHsgeWVhcjogMSB9KSxcbiAgICBvcHRpb25zLm1pbkRhdGUsXG4gICAgb3B0aW9ucy5tYXhEYXRlXG4gICk7XG5cbiAgcmV0dXJuIHllYXJzQ2FsZW5kYXI7XG59XG4iLCIvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtZmlsZS1saW5lLWNvdW50XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJTdGF0ZSwgaW5pdGlhbERhdGVwaWNrZXJTdGF0ZSB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5zdGF0ZSc7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICduZ3gtYm9vdHN0cmFwL21pbmktbmdyeCc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBY3Rpb25zIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLmFjdGlvbnMnO1xuaW1wb3J0IHsgY2FsY0RheXNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9jYWxjLWRheXMtY2FsZW5kYXInO1xuaW1wb3J0IHsgZm9ybWF0RGF5c0NhbGVuZGFyIH0gZnJvbSAnLi4vZW5naW5lL2Zvcm1hdC1kYXlzLWNhbGVuZGFyJztcbmltcG9ydCB7IGZsYWdEYXlzQ2FsZW5kYXIgfSBmcm9tICcuLi9lbmdpbmUvZmxhZy1kYXlzLWNhbGVuZGFyJztcbmltcG9ydCB7XG4gIHNldEZ1bGxEYXRlLFxuICBzaGlmdERhdGUsXG4gIGlzQXJyYXksXG4gIGlzRGF0ZVZhbGlkLFxuICBzdGFydE9mLFxuICBnZXRMb2NhbGUsXG4gIGlzQWZ0ZXIsXG4gIGlzQmVmb3JlXG59IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBjYW5Td2l0Y2hNb2RlIH0gZnJvbSAnLi4vZW5naW5lL3ZpZXctbW9kZSc7XG5pbXBvcnQgeyBmb3JtYXRNb250aHNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9mb3JtYXQtbW9udGhzLWNhbGVuZGFyJztcbmltcG9ydCB7IGZsYWdNb250aHNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9mbGFnLW1vbnRocy1jYWxlbmRhcic7XG5pbXBvcnQgeyBmb3JtYXRZZWFyc0NhbGVuZGFyLCB5ZWFyc1BlckNhbGVuZGFyIH0gZnJvbSAnLi4vZW5naW5lL2Zvcm1hdC15ZWFycy1jYWxlbmRhcic7XG5pbXBvcnQgeyBmbGFnWWVhcnNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9mbGFnLXllYXJzLWNhbGVuZGFyJztcbmltcG9ydCB7IEJzVmlld05hdmlnYXRpb25FdmVudCwgRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnMsIEJzRGF0ZXBpY2tlclZpZXdNb2RlIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuXG4vKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGN5Y2xvbWF0aWMtY29tcGxleGl0eSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJzRGF0ZXBpY2tlclJlZHVjZXIoc3RhdGUgPSBpbml0aWFsRGF0ZXBpY2tlclN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24pOiBCc0RhdGVwaWNrZXJTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuQ0FMQ1VMQVRFOiB7XG4gICAgICByZXR1cm4gY2FsY3VsYXRlUmVkdWNlcihzdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLkZPUk1BVDoge1xuICAgICAgcmV0dXJuIGZvcm1hdFJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLkZMQUc6IHtcbiAgICAgIHJldHVybiBmbGFnUmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgICB9XG5cbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuTkFWSUdBVEVfT0ZGU0VUOiB7XG4gICAgICBjb25zdCBkYXRlID0gc2hpZnREYXRlKHN0YXJ0T2Yoc3RhdGUudmlldy5kYXRlLCAnbW9udGgnKSwgYWN0aW9uLnBheWxvYWQpO1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIHZpZXc6IHtcbiAgICAgICAgICBtb2RlOiBzdGF0ZS52aWV3Lm1vZGUsXG4gICAgICAgICAgZGF0ZVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuTkFWSUdBVEVfVE86IHtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IEJzVmlld05hdmlnYXRpb25FdmVudCA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gICAgICBjb25zdCBkYXRlID0gc2V0RnVsbERhdGUoc3RhdGUudmlldy5kYXRlLCBwYXlsb2FkLnVuaXQpO1xuICAgICAgbGV0IG5ld1N0YXRlO1xuICAgICAgbGV0IG1vZGU6IEJzRGF0ZXBpY2tlclZpZXdNb2RlO1xuICAgICAgaWYgKGNhblN3aXRjaE1vZGUocGF5bG9hZC52aWV3TW9kZSwgc3RhdGUubWluTW9kZSkpIHtcbiAgICAgICAgbW9kZSA9IHBheWxvYWQudmlld01vZGU7XG4gICAgICAgIG5ld1N0YXRlID0geyB2aWV3OiB7IGRhdGUsIG1vZGUgfSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kZSA9IHN0YXRlLnZpZXcubW9kZTtcbiAgICAgICAgbmV3U3RhdGUgPSB7IHNlbGVjdGVkRGF0ZTogZGF0ZSwgdmlldzogeyBkYXRlLCBtb2RlIH0gfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLkNIQU5HRV9WSUVXTU9ERToge1xuICAgICAgaWYgKCFjYW5Td2l0Y2hNb2RlKGFjdGlvbi5wYXlsb2FkLCBzdGF0ZS5taW5Nb2RlKSkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRlID0gc3RhdGUudmlldy5kYXRlO1xuICAgICAgY29uc3QgbW9kZSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSB7IHZpZXc6IHsgZGF0ZSwgbW9kZSB9IH07XG5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5IT1ZFUjoge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7IGhvdmVyZWREYXRlOiBhY3Rpb24ucGF5bG9hZCB9KTtcbiAgICB9XG5cbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VMRUNUOiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgc2VsZWN0ZWREYXRlOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgdmlldzogc3RhdGUudmlld1xuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9kZSA9IHN0YXRlLnZpZXcubW9kZTtcbiAgICAgIGNvbnN0IF9kYXRlID0gYWN0aW9uLnBheWxvYWQgfHwgc3RhdGUudmlldy5kYXRlO1xuICAgICAgY29uc3QgZGF0ZSA9IGdldFZpZXdEYXRlKF9kYXRlLCBzdGF0ZS5taW5EYXRlLCBzdGF0ZS5tYXhEYXRlKTtcbiAgICAgIG5ld1N0YXRlLnZpZXcgPSB7IG1vZGUsIGRhdGUgfTtcblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFVF9PUFRJT05TOiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgLy8gcHJlc2VydmUgdmlldyBtb2RlXG4gICAgICBjb25zdCBtb2RlID0gbmV3U3RhdGUubWluTW9kZSA/IG5ld1N0YXRlLm1pbk1vZGUgOiBzdGF0ZS52aWV3Lm1vZGU7XG4gICAgICBjb25zdCBfdmlld0RhdGUgPSBpc0RhdGVWYWxpZChuZXdTdGF0ZS52YWx1ZSkgJiYgbmV3U3RhdGUudmFsdWVcbiAgICAgICAgfHwgaXNBcnJheShuZXdTdGF0ZS52YWx1ZSkgJiYgaXNEYXRlVmFsaWQobmV3U3RhdGUudmFsdWVbMF0pICYmIG5ld1N0YXRlLnZhbHVlWzBdXG4gICAgICAgIHx8IHN0YXRlLnZpZXcuZGF0ZTtcbiAgICAgIGNvbnN0IGRhdGUgPSBnZXRWaWV3RGF0ZShfdmlld0RhdGUsIG5ld1N0YXRlLm1pbkRhdGUsIG5ld1N0YXRlLm1heERhdGUpO1xuICAgICAgbmV3U3RhdGUudmlldyA9IHsgbW9kZSwgZGF0ZSB9O1xuICAgICAgLy8gdXBkYXRlIHNlbGVjdGVkIHZhbHVlXG4gICAgICBpZiAobmV3U3RhdGUudmFsdWUpIHtcbiAgICAgICAgLy8gaWYgbmV3IHZhbHVlIGlzIGFycmF5IHdlIHdvcmsgd2l0aCBkYXRlIHJhbmdlXG4gICAgICAgIGlmIChpc0FycmF5KG5ld1N0YXRlLnZhbHVlKSkge1xuICAgICAgICAgIG5ld1N0YXRlLnNlbGVjdGVkUmFuZ2UgPSBuZXdTdGF0ZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5ldyB2YWx1ZSBpcyBhIGRhdGUgLT4gZGF0ZXBpY2tlclxuICAgICAgICBpZiAobmV3U3RhdGUudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgbmV3U3RhdGUuc2VsZWN0ZWREYXRlID0gbmV3U3RhdGUudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcm92aWRlZCB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkIDopXG4gICAgICAgIC8vIG5lZWQgdG8gcmVwb3J0IGl0IHNvbWVob3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gZGF0ZSByYW5nZSBwaWNrZXJcbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VMRUNUX1JBTkdFOiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgc2VsZWN0ZWRSYW5nZTogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIHZpZXc6IHN0YXRlLnZpZXdcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1vZGUgPSBzdGF0ZS52aWV3Lm1vZGU7XG4gICAgICBjb25zdCBfZGF0ZSA9IGFjdGlvbi5wYXlsb2FkICYmIGFjdGlvbi5wYXlsb2FkWzBdIHx8IHN0YXRlLnZpZXcuZGF0ZTtcbiAgICAgIGNvbnN0IGRhdGUgPSBnZXRWaWV3RGF0ZShfZGF0ZSwgc3RhdGUubWluRGF0ZSwgc3RhdGUubWF4RGF0ZSk7XG4gICAgICBuZXdTdGF0ZS52aWV3ID0geyBtb2RlLCBkYXRlIH07XG5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfTUlOX0RBVEU6IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBtaW5EYXRlOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfTUFYX0RBVEU6IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBtYXhEYXRlOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfSVNfRElTQUJMRUQ6IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Rpc2FibGVkOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVSZWR1Y2VyKHN0YXRlOiBCc0RhdGVwaWNrZXJTdGF0ZSk6IEJzRGF0ZXBpY2tlclN0YXRlIHtcbiAgLy8gaG93IG1hbnkgY2FsZW5kYXJzXG4gIGNvbnN0IGRpc3BsYXlNb250aHMgPSBzdGF0ZS5kaXNwbGF5TW9udGhzO1xuICAvLyB1c2Ugc2VsZWN0ZWQgZGF0ZSBvbiBpbml0aWFsIHJlbmRlcmluZyBpZiBzZXRcbiAgbGV0IHZpZXdEYXRlID0gc3RhdGUudmlldy5kYXRlO1xuXG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICdkYXknKSB7XG4gICAgc3RhdGUubW9udGhWaWV3T3B0aW9ucy5maXJzdERheU9mV2VlayA9IGdldExvY2FsZShzdGF0ZS5sb2NhbGUpLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgY29uc3QgbW9udGhzTW9kZWwgPSBuZXcgQXJyYXkoZGlzcGxheU1vbnRocyk7XG4gICAgZm9yIChsZXQgbW9udGhJbmRleCA9IDA7IG1vbnRoSW5kZXggPCBkaXNwbGF5TW9udGhzOyBtb250aEluZGV4KyspIHtcbiAgICAgIC8vIHRvZG86IGZvciB1bmxpbmtlZCBjYWxlbmRhcnMgaXQgd2lsbCBiZSBoYXJkZXJcbiAgICAgIG1vbnRoc01vZGVsW21vbnRoSW5kZXhdID0gY2FsY0RheXNDYWxlbmRhcihcbiAgICAgICAgdmlld0RhdGUsXG4gICAgICAgIHN0YXRlLm1vbnRoVmlld09wdGlvbnNcbiAgICAgICk7XG4gICAgICB2aWV3RGF0ZSA9IHNoaWZ0RGF0ZSh2aWV3RGF0ZSwgeyBtb250aDogMSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgbW9udGhzTW9kZWwgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUudmlldy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgY29uc3QgbW9udGhzQ2FsZW5kYXIgPSBuZXcgQXJyYXkoZGlzcGxheU1vbnRocyk7XG4gICAgZm9yIChcbiAgICAgIGxldCBjYWxlbmRhckluZGV4ID0gMDtcbiAgICAgIGNhbGVuZGFySW5kZXggPCBkaXNwbGF5TW9udGhzO1xuICAgICAgY2FsZW5kYXJJbmRleCsrXG4gICAgKSB7XG4gICAgICAvLyB0b2RvOiBmb3IgdW5saW5rZWQgY2FsZW5kYXJzIGl0IHdpbGwgYmUgaGFyZGVyXG4gICAgICBtb250aHNDYWxlbmRhcltjYWxlbmRhckluZGV4XSA9IGZvcm1hdE1vbnRoc0NhbGVuZGFyKFxuICAgICAgICB2aWV3RGF0ZSxcbiAgICAgICAgZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZSlcbiAgICAgICk7XG4gICAgICB2aWV3RGF0ZSA9IHNoaWZ0RGF0ZSh2aWV3RGF0ZSwgeyB5ZWFyOiAxIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyBtb250aHNDYWxlbmRhciB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICd5ZWFyJykge1xuICAgIGNvbnN0IHllYXJzQ2FsZW5kYXJNb2RlbCA9IG5ldyBBcnJheShkaXNwbGF5TW9udGhzKTtcblxuICAgIGZvciAoXG4gICAgICBsZXQgY2FsZW5kYXJJbmRleCA9IDA7XG4gICAgICBjYWxlbmRhckluZGV4IDwgZGlzcGxheU1vbnRocztcbiAgICAgIGNhbGVuZGFySW5kZXgrK1xuICAgICkge1xuICAgICAgLy8gdG9kbzogZm9yIHVubGlua2VkIGNhbGVuZGFycyBpdCB3aWxsIGJlIGhhcmRlclxuICAgICAgeWVhcnNDYWxlbmRhck1vZGVsW2NhbGVuZGFySW5kZXhdID0gZm9ybWF0WWVhcnNDYWxlbmRhcihcbiAgICAgICAgdmlld0RhdGUsXG4gICAgICAgIGdldEZvcm1hdE9wdGlvbnMoc3RhdGUpXG4gICAgICApO1xuICAgICAgdmlld0RhdGUgPSBzaGlmdERhdGUodmlld0RhdGUsIHsgeWVhcjogeWVhcnNQZXJDYWxlbmRhciB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgeWVhcnNDYWxlbmRhck1vZGVsIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZWR1Y2VyKHN0YXRlOiBCc0RhdGVwaWNrZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24pOiBCc0RhdGVwaWNrZXJTdGF0ZSB7XG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICdkYXknKSB7XG4gICAgY29uc3QgZm9ybWF0dGVkTW9udGhzID0gc3RhdGUubW9udGhzTW9kZWwubWFwKChtb250aCwgbW9udGhJbmRleCkgPT5cbiAgICAgIGZvcm1hdERheXNDYWxlbmRhcihtb250aCwgZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZSksIG1vbnRoSW5kZXgpXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyBmb3JtYXR0ZWRNb250aHMgfSk7XG4gIH1cblxuICAvLyBob3cgbWFueSBjYWxlbmRhcnNcbiAgY29uc3QgZGlzcGxheU1vbnRocyA9IHN0YXRlLmRpc3BsYXlNb250aHM7XG4gIC8vIGNoZWNrIGluaXRpYWwgcmVuZGVyaW5nXG4gIC8vIHVzZSBzZWxlY3RlZCBkYXRlIG9uIGluaXRpYWwgcmVuZGVyaW5nIGlmIHNldFxuICBsZXQgdmlld0RhdGUgPSBzdGF0ZS52aWV3LmRhdGU7XG5cbiAgaWYgKHN0YXRlLnZpZXcubW9kZSA9PT0gJ21vbnRoJykge1xuICAgIGNvbnN0IG1vbnRoc0NhbGVuZGFyID0gbmV3IEFycmF5KGRpc3BsYXlNb250aHMpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY2FsZW5kYXJJbmRleCA9IDA7XG4gICAgICBjYWxlbmRhckluZGV4IDwgZGlzcGxheU1vbnRocztcbiAgICAgIGNhbGVuZGFySW5kZXgrK1xuICAgICkge1xuICAgICAgLy8gdG9kbzogZm9yIHVubGlua2VkIGNhbGVuZGFycyBpdCB3aWxsIGJlIGhhcmRlclxuICAgICAgbW9udGhzQ2FsZW5kYXJbY2FsZW5kYXJJbmRleF0gPSBmb3JtYXRNb250aHNDYWxlbmRhcihcbiAgICAgICAgdmlld0RhdGUsXG4gICAgICAgIGdldEZvcm1hdE9wdGlvbnMoc3RhdGUpXG4gICAgICApO1xuICAgICAgdmlld0RhdGUgPSBzaGlmdERhdGUodmlld0RhdGUsIHsgeWVhcjogMSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgbW9udGhzQ2FsZW5kYXIgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUudmlldy5tb2RlID09PSAneWVhcicpIHtcbiAgICBjb25zdCB5ZWFyc0NhbGVuZGFyTW9kZWwgPSBuZXcgQXJyYXkoZGlzcGxheU1vbnRocyk7XG4gICAgZm9yIChcbiAgICAgIGxldCBjYWxlbmRhckluZGV4ID0gMDtcbiAgICAgIGNhbGVuZGFySW5kZXggPCBkaXNwbGF5TW9udGhzO1xuICAgICAgY2FsZW5kYXJJbmRleCsrXG4gICAgKSB7XG4gICAgICAvLyB0b2RvOiBmb3IgdW5saW5rZWQgY2FsZW5kYXJzIGl0IHdpbGwgYmUgaGFyZGVyXG4gICAgICB5ZWFyc0NhbGVuZGFyTW9kZWxbY2FsZW5kYXJJbmRleF0gPSBmb3JtYXRZZWFyc0NhbGVuZGFyKFxuICAgICAgICB2aWV3RGF0ZSxcbiAgICAgICAgZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZSlcbiAgICAgICk7XG4gICAgICB2aWV3RGF0ZSA9IHNoaWZ0RGF0ZSh2aWV3RGF0ZSwgeyB5ZWFyOiAxNiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgeWVhcnNDYWxlbmRhck1vZGVsIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBmbGFnUmVkdWNlcihzdGF0ZTogQnNEYXRlcGlja2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbik6IEJzRGF0ZXBpY2tlclN0YXRlIHtcbiAgaWYgKHN0YXRlLnZpZXcubW9kZSA9PT0gJ2RheScpIHtcbiAgICBjb25zdCBmbGFnZ2VkTW9udGhzID0gc3RhdGUuZm9ybWF0dGVkTW9udGhzLm1hcChcbiAgICAgIChmb3JtYXR0ZWRNb250aCwgbW9udGhJbmRleCkgPT5cbiAgICAgICAgZmxhZ0RheXNDYWxlbmRhcihmb3JtYXR0ZWRNb250aCwge1xuICAgICAgICAgIGlzRGlzYWJsZWQ6IHN0YXRlLmlzRGlzYWJsZWQsXG4gICAgICAgICAgbWluRGF0ZTogc3RhdGUubWluRGF0ZSxcbiAgICAgICAgICBtYXhEYXRlOiBzdGF0ZS5tYXhEYXRlLFxuICAgICAgICAgIGRheXNEaXNhYmxlZDogc3RhdGUuZGF5c0Rpc2FibGVkLFxuICAgICAgICAgIGhvdmVyZWREYXRlOiBzdGF0ZS5ob3ZlcmVkRGF0ZSxcbiAgICAgICAgICBzZWxlY3RlZERhdGU6IHN0YXRlLnNlbGVjdGVkRGF0ZSxcbiAgICAgICAgICBzZWxlY3RlZFJhbmdlOiBzdGF0ZS5zZWxlY3RlZFJhbmdlLFxuICAgICAgICAgIGRpc3BsYXlNb250aHM6IHN0YXRlLmRpc3BsYXlNb250aHMsXG4gICAgICAgICAgbW9udGhJbmRleFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgZmxhZ2dlZE1vbnRocyB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICdtb250aCcpIHtcbiAgICBjb25zdCBmbGFnZ2VkTW9udGhzQ2FsZW5kYXIgPSBzdGF0ZS5tb250aHNDYWxlbmRhci5tYXAoXG4gICAgICAoZm9ybWF0dGVkTW9udGgsIG1vbnRoSW5kZXgpID0+XG4gICAgICAgIGZsYWdNb250aHNDYWxlbmRhcihmb3JtYXR0ZWRNb250aCwge1xuICAgICAgICAgIGlzRGlzYWJsZWQ6IHN0YXRlLmlzRGlzYWJsZWQsXG4gICAgICAgICAgbWluRGF0ZTogc3RhdGUubWluRGF0ZSxcbiAgICAgICAgICBtYXhEYXRlOiBzdGF0ZS5tYXhEYXRlLFxuICAgICAgICAgIGhvdmVyZWRNb250aDogc3RhdGUuaG92ZXJlZE1vbnRoLFxuICAgICAgICAgIGRpc3BsYXlNb250aHM6IHN0YXRlLmRpc3BsYXlNb250aHMsXG4gICAgICAgICAgbW9udGhJbmRleFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgZmxhZ2dlZE1vbnRoc0NhbGVuZGFyIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnZpZXcubW9kZSA9PT0gJ3llYXInKSB7XG4gICAgY29uc3QgeWVhcnNDYWxlbmRhckZsYWdnZWQgPSBzdGF0ZS55ZWFyc0NhbGVuZGFyTW9kZWwubWFwKFxuICAgICAgKGZvcm1hdHRlZE1vbnRoLCB5ZWFySW5kZXgpID0+XG4gICAgICAgIGZsYWdZZWFyc0NhbGVuZGFyKGZvcm1hdHRlZE1vbnRoLCB7XG4gICAgICAgICAgaXNEaXNhYmxlZDogc3RhdGUuaXNEaXNhYmxlZCxcbiAgICAgICAgICBtaW5EYXRlOiBzdGF0ZS5taW5EYXRlLFxuICAgICAgICAgIG1heERhdGU6IHN0YXRlLm1heERhdGUsXG4gICAgICAgICAgaG92ZXJlZFllYXI6IHN0YXRlLmhvdmVyZWRZZWFyLFxuICAgICAgICAgIGRpc3BsYXlNb250aHM6IHN0YXRlLmRpc3BsYXlNb250aHMsXG4gICAgICAgICAgeWVhckluZGV4XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyB5ZWFyc0NhbGVuZGFyRmxhZ2dlZCB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZTogQnNEYXRlcGlja2VyU3RhdGUpOiBEYXRlcGlja2VyRm9ybWF0T3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxlOiBzdGF0ZS5sb2NhbGUsXG5cbiAgICBtb250aFRpdGxlOiBzdGF0ZS5tb250aFRpdGxlLFxuICAgIHllYXJUaXRsZTogc3RhdGUueWVhclRpdGxlLFxuXG4gICAgZGF5TGFiZWw6IHN0YXRlLmRheUxhYmVsLFxuICAgIG1vbnRoTGFiZWw6IHN0YXRlLm1vbnRoTGFiZWwsXG4gICAgeWVhckxhYmVsOiBzdGF0ZS55ZWFyTGFiZWwsXG5cbiAgICB3ZWVrTnVtYmVyczogc3RhdGUud2Vla051bWJlcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBpZiB2aWV3IGRhdGUgaXMgcHJvdmlkZWQgKGJzVmFsdWV8bmdNb2RlbCkgaXQgc2hvdWxkIGJlIHNob3duXG4gKiBpZiB2aWV3IGRhdGUgaXMgbm90IHByb3ZpZGVyOlxuICogaWYgbWluRGF0ZT5jdXJyZW50RGF0ZSAoZGVmYXVsdCB2aWV3IHZhbHVlKSwgc2hvdyBtaW5EYXRlXG4gKiBpZiBtYXhEYXRlPGN1cnJlbnREYXRlKGRlZmF1bHQgdmlldyB2YWx1ZSkgc2hvdyBtYXhEYXRlXG4gKi9cbmZ1bmN0aW9uIGdldFZpZXdEYXRlKHZpZXdEYXRlOiBEYXRlIHwgRGF0ZVtdLCBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gQXJyYXkuaXNBcnJheSh2aWV3RGF0ZSkgPyB2aWV3RGF0ZVswXSA6IHZpZXdEYXRlO1xuXG4gIGlmIChtaW5EYXRlICYmIGlzQWZ0ZXIobWluRGF0ZSwgX2RhdGUsICdkYXknKSkge1xuICAgIHJldHVybiBtaW5EYXRlO1xuICB9XG5cbiAgaWYgKG1heERhdGUgJiYgaXNCZWZvcmUobWF4RGF0ZSwgX2RhdGUsICdkYXknKSkge1xuICAgIHJldHVybiBtYXhEYXRlO1xuICB9XG5cbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWluaVN0b3JlLCBBY3Rpb24sIE1pbmlTdGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvbWluaS1uZ3J4JztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0YXRlLCBpbml0aWFsRGF0ZXBpY2tlclN0YXRlIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLnN0YXRlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYnNEYXRlcGlja2VyUmVkdWNlciB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5yZWR1Y2VyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlclN0b3JlIGV4dGVuZHMgTWluaVN0b3JlPEJzRGF0ZXBpY2tlclN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IF9kaXNwYXRjaGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBY3Rpb24+KHtcbiAgICAgIHR5cGU6ICdbZGF0ZXBpY2tlcl0gZGlzcGF0Y2hlciBpbml0J1xuICAgIH0pO1xuICAgIGNvbnN0IHN0YXRlID0gbmV3IE1pbmlTdGF0ZTxCc0RhdGVwaWNrZXJTdGF0ZT4oXG4gICAgICBpbml0aWFsRGF0ZXBpY2tlclN0YXRlLFxuICAgICAgX2Rpc3BhdGNoZXIsXG4gICAgICBic0RhdGVwaWNrZXJSZWR1Y2VyXG4gICAgKTtcbiAgICBzdXBlcihfZGlzcGF0Y2hlciwgYnNEYXRlcGlja2VyUmVkdWNlciwgc3RhdGUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckFic3RyYWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS9icy1kYXRlcGlja2VyLWNvbnRhaW5lcic7XG5cbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uLy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IERheVZpZXdNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBY3Rpb25zIH0gZnJvbSAnLi4vLi4vcmVkdWNlci9icy1kYXRlcGlja2VyLmFjdGlvbnMnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyRWZmZWN0cyB9IGZyb20gJy4uLy4uL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0b3JlIH0gZnJvbSAnLi4vLi4vcmVkdWNlci9icy1kYXRlcGlja2VyLnN0b3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1kYXRlcGlja2VyLWNvbnRhaW5lcicsXG4gIHByb3ZpZGVyczogW0JzRGF0ZXBpY2tlclN0b3JlLCBCc0RhdGVwaWNrZXJFZmZlY3RzXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2JzLWRhdGVwaWNrZXItdmlldy5odG1sJyxcbiAgaG9zdDoge1xuICAgICcoY2xpY2spJzogJ19zdG9wUHJvcGFnYXRpb24oJGV2ZW50KScsXG4gICAgc3R5bGU6ICdwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IGJsb2NrOycsXG4gICAgcm9sZTogJ2RpYWxvZycsXG4gICAgJ2FyaWEtbGFiZWwnOiAnY2FsZW5kYXInXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50IGV4dGVuZHMgQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSkge1xuICAgIHRoaXMuX2VmZmVjdHMuc2V0VmFsdWUodmFsdWUpO1xuICB9XG4gIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvbmZpZzogQnNEYXRlcGlja2VyQ29uZmlnLFxuICAgIHByaXZhdGUgX3N0b3JlOiBCc0RhdGVwaWNrZXJTdG9yZSxcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBCc0RhdGVwaWNrZXJBY3Rpb25zLFxuICAgIF9lZmZlY3RzOiBCc0RhdGVwaWNrZXJFZmZlY3RzXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZWZmZWN0cyA9IF9lZmZlY3RzO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc090aGVyTW9udGhzQWN0aXZlID0gdGhpcy5fY29uZmlnLnNlbGVjdEZyb21PdGhlck1vbnRoO1xuICAgIHRoaXMuY29udGFpbmVyQ2xhc3MgPSB0aGlzLl9jb25maWcuY29udGFpbmVyQ2xhc3M7XG4gICAgdGhpcy5fZWZmZWN0c1xuICAgICAgLmluaXQodGhpcy5fc3RvcmUpXG4gICAgICAvLyBpbnRpYWwgc3RhdGUgb3B0aW9uc1xuICAgICAgLnNldE9wdGlvbnModGhpcy5fY29uZmlnKVxuICAgICAgLy8gZGF0YSBiaW5kaW5nIHZpZXcgLS0+IG1vZGVsXG4gICAgICAuc2V0QmluZGluZ3ModGhpcylcbiAgICAgIC8vIHNldCBldmVudCBoYW5kbGVyc1xuICAgICAgLnNldEV2ZW50SGFuZGxlcnModGhpcylcbiAgICAgIC5yZWdpc3RlckRhdGVwaWNrZXJTaWRlRWZmZWN0cygpO1xuXG4gICAgLy8gdG9kbzogbW92ZSBpdCBzb21ld2hlcmUgZWxzZVxuICAgIC8vIG9uIHNlbGVjdGVkIGRhdGUgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkgKi9cbiAgICAgICAgLnNlbGVjdCgoc3RhdGU6IGFueSkgPT4gc3RhdGUuc2VsZWN0ZWREYXRlKVxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSAqL1xuICAgICAgICAuc3Vic2NyaWJlKChkYXRlOiBhbnkpID0+IHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkYXRlKSlcbiAgICApO1xuICB9XG5cbiAgZGF5U2VsZWN0SGFuZGxlcihkYXk6IERheVZpZXdNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzT3RoZXJNb250aHNBY3RpdmUgPyBkYXkuaXNEaXNhYmxlZCA6IChkYXkuaXNPdGhlck1vbnRoIHx8IGRheS5pc0Rpc2FibGVkKTtcblxuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZWxlY3QoZGF5LmRhdGUpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuX3N1YnMpIHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLl9lZmZlY3RzLmRlc3Ryb3koKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGVyLCBDb21wb25lbnRMb2FkZXJGYWN0b3J5IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jb21wb25lbnQtbG9hZGVyJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWRhdGVwaWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyVmlld01vZGUgfSBmcm9tICcuL21vZGVscyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tic0RhdGVwaWNrZXJdJyxcbiAgZXhwb3J0QXM6ICdic0RhdGVwaWNrZXInXG59KVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICAvKipcbiAgICogUGxhY2VtZW50IG9mIGEgZGF0ZXBpY2tlci4gQWNjZXB0czogXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdib3R0b20nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyLiBTdXBwb3J0cyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mXG4gICAqIGV2ZW50IG5hbWVzLlxuICAgKi9cbiAgQElucHV0KCkgdHJpZ2dlcnMgPSAnY2xpY2snO1xuICAvKipcbiAgICogQ2xvc2UgZGF0ZXBpY2tlciBvbiBvdXRzaWRlIGNsaWNrXG4gICAqL1xuICBASW5wdXQoKSBvdXRzaWRlQ2xpY2sgPSB0cnVlO1xuICAvKipcbiAgICogQSBzZWxlY3RvciBzcGVjaWZ5aW5nIHRoZSBlbGVtZW50IHRoZSBkYXRlcGlja2VyIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cbiAgICogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgXCJib2R5XCIuXG4gICAqL1xuICBASW5wdXQoKSBjb250YWluZXIgPSAnYm9keSc7XG5cbiAgQElucHV0KCkgb3V0c2lkZUVzYyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGRhdGVwaWNrZXIgaXMgY3VycmVudGx5IGJlaW5nIHNob3duXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRlcGlja2VyLmlzU2hvd247XG4gIH1cblxuICBzZXQgaXNPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGRhdGVwaWNrZXIgaXMgc2hvd25cbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgQE91dHB1dCgpIG9uU2hvd246IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgZGF0ZXBpY2tlciBpcyBoaWRkZW5cbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgQE91dHB1dCgpIG9uSGlkZGVuOiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBfYnNWYWx1ZTogRGF0ZTtcbiAgLyoqXG4gICAqIEluaXRpYWwgdmFsdWUgb2YgZGF0ZXBpY2tlclxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGJzVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5fYnNWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYnNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYnNWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWcgb2JqZWN0IGZvciBkYXRlcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBic0NvbmZpZzogUGFydGlhbDxCc0RhdGVwaWNrZXJDb25maWc+O1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGF0ZXBpY2tlcidzIGNvbnRlbnQgaXMgZW5hYmxlZCBvciBub3RcbiAgICovXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBNaW5pbXVtIGRhdGUgd2hpY2ggaXMgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb25cbiAgICovXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGRhdGUgd2hpY2ggaXMgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb25cbiAgICovXG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gdmlldyBtb2RlIDogZGF5LCBtb250aCwgb3IgeWVhclxuICAgKi9cbiAgQElucHV0KCkgbWluTW9kZTogQnNEYXRlcGlja2VyVmlld01vZGU7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgQ2VydGFpbiBkYXlzIGluIHRoZSB3ZWVrXG4gICAqL1xuICBASW5wdXQoKSBkYXlzRGlzYWJsZWQ6IG51bWJlcltdO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBkYXRlcGlja2VyIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWRcbiAgICovXG4gIEBPdXRwdXQoKSBic1ZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJvdGVjdGVkIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2RhdGVwaWNrZXI6IENvbXBvbmVudExvYWRlcjxCc0RhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xuICBwcml2YXRlIF9kYXRlcGlja2VyUmVmOiBDb21wb25lbnRSZWY8QnNEYXRlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50PjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgX2NvbmZpZzogQnNEYXRlcGlja2VyQ29uZmlnLFxuICAgICAgICAgICAgICBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICBjaXM6IENvbXBvbmVudExvYWRlckZhY3RvcnkpIHtcbiAgICAvLyB0b2RvOiBhc3NpZ24gb25seSBzdWJzZXQgb2YgZmllbGRzXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB0aGlzLl9jb25maWcpO1xuICAgIHRoaXMuX2RhdGVwaWNrZXIgPSBjaXMuY3JlYXRlTG9hZGVyPEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudD4oXG4gICAgICBfZWxlbWVudFJlZixcbiAgICAgIF92aWV3Q29udGFpbmVyUmVmLFxuICAgICAgX3JlbmRlcmVyXG4gICAgKTtcbiAgICB0aGlzLm9uU2hvd24gPSB0aGlzLl9kYXRlcGlja2VyLm9uU2hvd247XG4gICAgdGhpcy5vbkhpZGRlbiA9IHRoaXMuX2RhdGVwaWNrZXIub25IaWRkZW47XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmxpc3Rlbih7XG4gICAgICBvdXRzaWRlQ2xpY2s6IHRoaXMub3V0c2lkZUNsaWNrLFxuICAgICAgb3V0c2lkZUVzYzogdGhpcy5vdXRzaWRlRXNjLFxuICAgICAgdHJpZ2dlcnM6IHRoaXMudHJpZ2dlcnMsXG4gICAgICBzaG93OiAoKSA9PiB0aGlzLnNob3coKVxuICAgIH0pO1xuICAgIHRoaXMuc2V0Q29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRlcGlja2VyUmVmIHx8ICF0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubWluRGF0ZSkge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS5taW5EYXRlID0gdGhpcy5taW5EYXRlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1heERhdGUpIHtcbiAgICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYuaW5zdGFuY2UubWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5kYXlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYuaW5zdGFuY2UuZGF5c0Rpc2FibGVkID0gdGhpcy5kYXlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS5pc0Rpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiBlbGVtZW50w6LCgMKZcyBkYXRlcGlja2VyLiBUaGlzIGlzIGNvbnNpZGVyZWQgYSDDosKAwpxtYW51YWzDosKAwp0gdHJpZ2dlcmluZyBvZlxuICAgKiB0aGUgZGF0ZXBpY2tlci5cbiAgICovXG4gIHNob3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RhdGVwaWNrZXIuaXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0Q29uZmlnKCk7XG5cbiAgICB0aGlzLl9kYXRlcGlja2VyUmVmID0gdGhpcy5fZGF0ZXBpY2tlclxuICAgICAgLnByb3ZpZGUoe3Byb3ZpZGU6IEJzRGF0ZXBpY2tlckNvbmZpZywgdXNlVmFsdWU6IHRoaXMuX2NvbmZpZ30pXG4gICAgICAuYXR0YWNoKEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudClcbiAgICAgIC50byh0aGlzLmNvbnRhaW5lcilcbiAgICAgIC5wb3NpdGlvbih7YXR0YWNobWVudDogdGhpcy5wbGFjZW1lbnR9KVxuICAgICAgLnNob3coe3BsYWNlbWVudDogdGhpcy5wbGFjZW1lbnR9KTtcblxuICAgIC8vIGlmIGRhdGUgY2hhbmdlcyBmcm9tIGV4dGVybmFsIHNvdXJjZSAobW9kZWwgLT4gdmlldylcbiAgICB0aGlzLl9zdWJzLnB1c2goXG4gICAgICB0aGlzLmJzVmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogRGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlLnZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBpZiBkYXRlIGNoYW5nZXMgZnJvbSBwaWNrZXIgKHZpZXcgLT4gbW9kZWwpXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS52YWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBEYXRlKSA9PiB7XG4gICAgICAgIHRoaXMuYnNWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYW4gZWxlbWVudMOiwoDCmXMgZGF0ZXBpY2tlci4gVGhpcyBpcyBjb25zaWRlcmVkIGEgw6LCgMKcbWFudWFsw6LCgMKdIHRyaWdnZXJpbmcgb2ZcbiAgICogdGhlIGRhdGVwaWNrZXIuXG4gICAqL1xuICBoaWRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlci5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuX3N1YnMpIHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIGFuIGVsZW1lbnTDosKAwplzIGRhdGVwaWNrZXIuIFRoaXMgaXMgY29uc2lkZXJlZCBhIMOiwoDCnG1hbnVhbMOiwoDCnSB0cmlnZ2VyaW5nXG4gICAqIG9mIHRoZSBkYXRlcGlja2VyLlxuICAgKi9cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgcmV0dXJuIHRoaXMuaGlkZSgpO1xuICAgIH1cblxuICAgIHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjb25maWcgZm9yIGRhdGVwaWNrZXJcbiAgICovXG4gIHNldENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jb25maWcsIHRoaXMuYnNDb25maWcsIHtcbiAgICAgIHZhbHVlOiB0aGlzLl9ic1ZhbHVlLFxuICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0Rpc2FibGVkLFxuICAgICAgbWluRGF0ZTogdGhpcy5taW5EYXRlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5taW5EYXRlLFxuICAgICAgbWF4RGF0ZTogdGhpcy5tYXhEYXRlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5tYXhEYXRlLFxuICAgICAgZGF5c0Rpc2FibGVkOiB0aGlzLmRheXNEaXNhYmxlZCB8fCB0aGlzLmJzQ29uZmlnICYmIHRoaXMuYnNDb25maWcuZGF5c0Rpc2FibGVkLFxuICAgICAgbWluTW9kZTogdGhpcy5taW5Nb2RlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5taW5Nb2RlXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmRpc3Bvc2UoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgUHJvdmlkZXIsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gIHBhcnNlRGF0ZSxcbiAgZm9ybWF0RGF0ZSxcbiAgZ2V0TG9jYWxlLFxuICBpc0FmdGVyLFxuICBpc0JlZm9yZSxcbiAgaXNEYXRlLFxuICBpc0RhdGVWYWxpZFxufSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJEaXJlY3RpdmUgfSBmcm9tICcuL2JzLWRhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTG9jYWxlU2VydmljZSB9IGZyb20gJy4vYnMtbG9jYWxlLnNlcnZpY2UnO1xuXG5jb25zdCBCU19EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlICovXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJzRGF0ZXBpY2tlcklucHV0RGlyZWN0aXZlKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbmNvbnN0IEJTX0RBVEVQSUNLRVJfVkFMSURBVE9SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmUgKi9cbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQnNEYXRlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBgaW5wdXRbYnNEYXRlcGlja2VyXWAsXG4gIGhvc3Q6IHtcbiAgICAnKGNoYW5nZSknOiAnb25DaGFuZ2UoJGV2ZW50KScsXG4gICAgJyhrZXl1cC5lc2MpJzogJ2hpZGUoKScsXG4gICAgJyhibHVyKSc6ICdvbkJsdXIoKSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbQlNfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUiwgQlNfREFURVBJQ0tFUl9WQUxJREFUT1JdXG59KVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlcklucHV0RGlyZWN0aXZlXG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG4gIHByaXZhdGUgX29uQ2hhbmdlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICBwcml2YXRlIF9vblRvdWNoZWQgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLXZhcmlhYmxlICovXG4gIHByaXZhdGUgX3ZhbGlkYXRvckNoYW5nZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgcHJpdmF0ZSBfdmFsdWU6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBwcml2YXRlIF9waWNrZXI6IEJzRGF0ZXBpY2tlckRpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9jYWxlU2VydmljZTogQnNMb2NhbGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgLy8gdXBkYXRlIGlucHV0IHZhbHVlIG9uIGRhdGVwaWNrZXIgdmFsdWUgdXBkYXRlXG4gICAgdGhpcy5fcGlja2VyLmJzVmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogRGF0ZSkgPT4ge1xuICAgICAgdGhpcy5fc2V0SW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fdmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZSBpbnB1dCB2YWx1ZSBvbiBsb2NhbGUgY2hhbmdlXG4gICAgdGhpcy5fbG9jYWxlU2VydmljZS5sb2NhbGVDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX3NldElucHV0VmFsdWUodGhpcy5fdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgX3NldElucHV0VmFsdWUodmFsdWU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsRGF0ZSA9ICF2YWx1ZSA/ICcnXG4gICAgICA6IGZvcm1hdERhdGUodmFsdWUsIHRoaXMuX3BpY2tlci5fY29uZmlnLmRhdGVJbnB1dEZvcm1hdCwgdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlKTtcblxuICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIGluaXRpYWxEYXRlKTtcbiAgfVxuXG4gIG9uQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgICB0aGlzLndyaXRlVmFsdWUoKGV2ZW50LnRhcmdldCBhcyBhbnkpLnZhbHVlKTtcbiAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gIH1cblxuICB2YWxpZGF0ZShjOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgX3ZhbHVlOiBEYXRlIHwgc3RyaW5nID0gYy52YWx1ZTtcblxuICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXN3aXRjaCAqL1xuICAgIGlmIChfdmFsdWUgPT09IG51bGwgfHwgX3ZhbHVlID09PSB1bmRlZmluZWQgfHwgX3ZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGlzRGF0ZShfdmFsdWUpKSB7XG4gICAgICBjb25zdCBfaXNEYXRlVmFsaWQgPSBpc0RhdGVWYWxpZChfdmFsdWUpO1xuICAgICAgaWYgKCFfaXNEYXRlVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHsgYnNEYXRlOiB7IGludmFsaWQ6IF92YWx1ZSB9IH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9waWNrZXIgJiYgdGhpcy5fcGlja2VyLm1pbkRhdGUgJiYgaXNCZWZvcmUoX3ZhbHVlLCB0aGlzLl9waWNrZXIubWluRGF0ZSwgJ2RhdGUnKSkge1xuICAgICAgICByZXR1cm4geyBic0RhdGU6IHsgbWluRGF0ZTogdGhpcy5fcGlja2VyLm1pbkRhdGUgfSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcGlja2VyICYmIHRoaXMuX3BpY2tlci5tYXhEYXRlICYmIGlzQWZ0ZXIoX3ZhbHVlLCB0aGlzLl9waWNrZXIubWF4RGF0ZSwgJ2RhdGUnKSkge1xuICAgICAgICByZXR1cm4geyBic0RhdGU6IHsgbWF4RGF0ZTogdGhpcy5fcGlja2VyLm1heERhdGUgfSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IERhdGUgfCBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IF9sb2NhbGVLZXkgPSB0aGlzLl9sb2NhbGVTZXJ2aWNlLmN1cnJlbnRMb2NhbGU7XG4gICAgICBjb25zdCBfbG9jYWxlID0gZ2V0TG9jYWxlKF9sb2NhbGVLZXkpO1xuICAgICAgaWYgKCFfbG9jYWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTG9jYWxlIFwiJHtfbG9jYWxlS2V5fVwiIGlzIG5vdCBkZWZpbmVkLCBwbGVhc2UgYWRkIGl0IHdpdGggXCJkZWZpbmVMb2NhbGUoLi4uKVwiYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuX3BpY2tlci5fY29uZmlnLmRhdGVJbnB1dEZvcm1hdCwgdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9waWNrZXIuYnNWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fcGlja2VyLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLl9waWNrZXIuaGlkZSgpO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQpLmJsdXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLmNvbmZpZyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyBleHRlbmRzIEJzRGF0ZXBpY2tlckNvbmZpZyB7XG4gIC8vIERhdGVwaWNrZXJSZW5kZXJPcHRpb25zXG4gIGRpc3BsYXlNb250aHMgPSAyO1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBYnN0cmFjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Jhc2UvYnMtZGF0ZXBpY2tlci1jb250YWluZXInO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi4vLi4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgRGF5Vmlld01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckFjdGlvbnMgfSBmcm9tICcuLi8uLi9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuYWN0aW9ucyc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJFZmZlY3RzIH0gZnJvbSAnLi4vLi4vcmVkdWNlci9icy1kYXRlcGlja2VyLmVmZmVjdHMnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyU3RvcmUgfSBmcm9tICcuLi8uLi9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRhdGVyYW5nZXBpY2tlci1jb250YWluZXInLFxuICBwcm92aWRlcnM6IFtCc0RhdGVwaWNrZXJTdG9yZSwgQnNEYXRlcGlja2VyRWZmZWN0c10sXG4gIHRlbXBsYXRlVXJsOiAnLi9icy1kYXRlcGlja2VyLXZpZXcuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICAnKGNsaWNrKSc6ICdfc3RvcFByb3BhZ2F0aW9uKCRldmVudCknLFxuICAgIHN0eWxlOiAncG9zaXRpb246IGFic29sdXRlOyBkaXNwbGF5OiBibG9jazsnLFxuICAgIHJvbGU6ICdkaWFsb2cnLFxuICAgICdhcmlhLWxhYmVsJzogJ2NhbGVuZGFyJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXJhbmdlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50IGV4dGVuZHMgQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZVtdKSB7XG4gICAgdGhpcy5fZWZmZWN0cy5zZXRSYW5nZVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlW10+KCk7XG5cbiAgX3JhbmdlU3RhY2s6IERhdGVbXSA9IFtdO1xuICBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcsXG4gICAgcHJpdmF0ZSBfc3RvcmU6IEJzRGF0ZXBpY2tlclN0b3JlLFxuICAgIHByaXZhdGUgX2FjdGlvbnM6IEJzRGF0ZXBpY2tlckFjdGlvbnMsXG4gICAgX2VmZmVjdHM6IEJzRGF0ZXBpY2tlckVmZmVjdHNcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9lZmZlY3RzID0gX2VmZmVjdHM7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzID0gdGhpcy5fY29uZmlnLmNvbnRhaW5lckNsYXNzO1xuICAgIHRoaXMuaXNPdGhlck1vbnRoc0FjdGl2ZSA9IHRoaXMuX2NvbmZpZy5zZWxlY3RGcm9tT3RoZXJNb250aDtcbiAgICB0aGlzLl9lZmZlY3RzXG4gICAgICAuaW5pdCh0aGlzLl9zdG9yZSlcbiAgICAgIC8vIGludGlhbCBzdGF0ZSBvcHRpb25zXG4gICAgICAvLyB0b2RvOiBmaXggdGhpcywgc3BsaXQgY29uZmlnc1xuICAgICAgLnNldE9wdGlvbnModGhpcy5fY29uZmlnKVxuICAgICAgLy8gZGF0YSBiaW5kaW5nIHZpZXcgLS0+IG1vZGVsXG4gICAgICAuc2V0QmluZGluZ3ModGhpcylcbiAgICAgIC8vIHNldCBldmVudCBoYW5kbGVyc1xuICAgICAgLnNldEV2ZW50SGFuZGxlcnModGhpcylcbiAgICAgIC5yZWdpc3RlckRhdGVwaWNrZXJTaWRlRWZmZWN0cygpO1xuXG4gICAgLy8gdG9kbzogbW92ZSBpdCBzb21ld2hlcmUgZWxzZVxuICAgIC8vIG9uIHNlbGVjdGVkIGRhdGUgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZFJhbmdlKVxuICAgICAgICAuc3Vic2NyaWJlKGRhdGUgPT4gdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGUpKVxuICAgICk7XG4gIH1cblxuICBkYXlTZWxlY3RIYW5kbGVyKGRheTogRGF5Vmlld01vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaXNPdGhlck1vbnRoc0FjdGl2ZSA/IGRheS5pc0Rpc2FibGVkIDogKGRheS5pc090aGVyTW9udGggfHwgZGF5LmlzRGlzYWJsZWQpO1xuXG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiBvbmx5IG9uZSBkYXRlIGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAvLyBhbmQgdXNlciBjbGlja3Mgb24gcHJldmlvdXMgZGF0ZVxuICAgIC8vIHN0YXJ0IHNlbGVjdGlvbiBmcm9tIG5ldyBkYXRlXG4gICAgLy8gYnV0IGlmIG5ldyBkYXRlIGlzIGFmdGVyIGluaXRpYWwgb25lXG4gICAgLy8gdGhhbiBmaW5pc2ggc2VsZWN0aW9uXG4gICAgaWYgKHRoaXMuX3JhbmdlU3RhY2subGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLl9yYW5nZVN0YWNrID1cbiAgICAgICAgZGF5LmRhdGUgPj0gdGhpcy5fcmFuZ2VTdGFja1swXVxuICAgICAgICAgID8gW3RoaXMuX3JhbmdlU3RhY2tbMF0sIGRheS5kYXRlXVxuICAgICAgICAgIDogW2RheS5kYXRlXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmFuZ2VTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlU3RhY2sgPSBbZGF5LmRhdGVdO1xuICAgIH1cblxuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuc2VsZWN0UmFuZ2UodGhpcy5fcmFuZ2VTdGFjaykpO1xuXG4gICAgaWYgKHRoaXMuX3JhbmdlU3RhY2subGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLl9yYW5nZVN0YWNrID0gW107XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5fc3Vicykge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuX2VmZmVjdHMuZGVzdHJveSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyB9IGZyb20gJy4vYnMtZGF0ZXJhbmdlcGlja2VyLmNvbmZpZyc7XG5pbXBvcnQgeyBCc0RhdGVyYW5nZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWRhdGVyYW5nZXBpY2tlci1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGVyRmFjdG9yeSwgQ29tcG9uZW50TG9hZGVyIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jb21wb25lbnQtbG9hZGVyJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYnNEYXRlcmFuZ2VwaWNrZXJdJyxcbiAgZXhwb3J0QXM6ICdic0RhdGVyYW5nZXBpY2tlcidcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcmFuZ2VwaWNrZXJEaXJlY3RpdmVcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIFBsYWNlbWVudCBvZiBhIGRhdGVyYW5nZXBpY2tlci4gQWNjZXB0czogXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdib3R0b20nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyLiBTdXBwb3J0cyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mXG4gICAqIGV2ZW50IG5hbWVzLlxuICAgKi9cbiAgQElucHV0KCkgdHJpZ2dlcnMgPSAnY2xpY2snO1xuICAvKipcbiAgICogQ2xvc2UgZGF0ZXJhbmdlcGlja2VyIG9uIG91dHNpZGUgY2xpY2tcbiAgICovXG4gIEBJbnB1dCgpIG91dHNpZGVDbGljayA9IHRydWU7XG4gIC8qKlxuICAgKiBBIHNlbGVjdG9yIHNwZWNpZnlpbmcgdGhlIGVsZW1lbnQgdGhlIGRhdGVyYW5nZXBpY2tlciBzaG91bGQgYmUgYXBwZW5kZWRcbiAgICogdG8uIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIFwiYm9keVwiLlxuICAgKi9cbiAgQElucHV0KCkgY29udGFpbmVyID0gJ2JvZHknO1xuXG4gIEBJbnB1dCgpIG91dHNpZGVFc2MgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRlcmFuZ2VwaWNrZXIgaXMgY3VycmVudGx5IGJlaW5nIHNob3duXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRlcGlja2VyLmlzU2hvd247XG4gIH1cblxuICBzZXQgaXNPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGRhdGVyYW5nZXBpY2tlciBpcyBzaG93blxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBAT3V0cHV0KCkgb25TaG93bjogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBkYXRlcmFuZ2VwaWNrZXIgaXMgaGlkZGVuXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIEBPdXRwdXQoKSBvbkhpZGRlbjogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgX2JzVmFsdWU6IERhdGVbXTtcbiAgLyoqXG4gICAqIEluaXRpYWwgdmFsdWUgb2YgZGF0ZXJhbmdlcGlja2VyXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgYnNWYWx1ZSh2YWx1ZTogRGF0ZVtdKSB7XG4gICAgaWYgKHRoaXMuX2JzVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2JzVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmJzVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlnIG9iamVjdCBmb3IgZGF0ZXJhbmdlcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBic0NvbmZpZzogUGFydGlhbDxCc0RhdGVyYW5nZXBpY2tlckNvbmZpZz47XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBkYXRlcmFuZ2VwaWNrZXIncyBjb250ZW50IGlzIGVuYWJsZWQgb3Igbm90XG4gICAqL1xuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogTWluaW11bSBkYXRlIHdoaWNoIGlzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uXG4gICAqL1xuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlO1xuICAvKipcbiAgICogTWF4aW11bSBkYXRlIHdoaWNoIGlzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uXG4gICAqL1xuICBASW5wdXQoKSBtYXhEYXRlOiBEYXRlO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBkYXRlcmFuZ2VwaWNrZXIgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZFxuICAgKi9cbiAgQE91dHB1dCgpIGJzVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByb3RlY3RlZCBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIF9kYXRlcGlja2VyOiBDb21wb25lbnRMb2FkZXI8QnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xuICBwcml2YXRlIF9kYXRlcGlja2VyUmVmOiBDb21wb25lbnRSZWY8QnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBfY29uZmlnOiBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyxcbiAgICAgICAgICAgICAgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgICAgICAgY2lzOiBDb21wb25lbnRMb2FkZXJGYWN0b3J5KSB7XG4gICAgdGhpcy5fZGF0ZXBpY2tlciA9IGNpcy5jcmVhdGVMb2FkZXI8QnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQ+KFxuICAgICAgX2VsZW1lbnRSZWYsXG4gICAgICBfdmlld0NvbnRhaW5lclJlZixcbiAgICAgIF9yZW5kZXJlclxuICAgICk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBfY29uZmlnKTtcbiAgICB0aGlzLm9uU2hvd24gPSB0aGlzLl9kYXRlcGlja2VyLm9uU2hvd247XG4gICAgdGhpcy5vbkhpZGRlbiA9IHRoaXMuX2RhdGVwaWNrZXIub25IaWRkZW47XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmxpc3Rlbih7XG4gICAgICBvdXRzaWRlQ2xpY2s6IHRoaXMub3V0c2lkZUNsaWNrLFxuICAgICAgb3V0c2lkZUVzYzogdGhpcy5vdXRzaWRlRXNjLFxuICAgICAgdHJpZ2dlcnM6IHRoaXMudHJpZ2dlcnMsXG4gICAgICBzaG93OiAoKSA9PiB0aGlzLnNob3coKVxuICAgIH0pO1xuICAgIHRoaXMuc2V0Q29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRlcGlja2VyUmVmIHx8ICF0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubWluRGF0ZSkge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS5taW5EYXRlID0gdGhpcy5taW5EYXRlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1heERhdGUpIHtcbiAgICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYuaW5zdGFuY2UubWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5pc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlLmlzRGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuIGVsZW1lbnTDosKAwplzIGRhdGVwaWNrZXIuIFRoaXMgaXMgY29uc2lkZXJlZCBhIMOiwoDCnG1hbnVhbMOiwoDCnSB0cmlnZ2VyaW5nIG9mXG4gICAqIHRoZSBkYXRlcGlja2VyLlxuICAgKi9cbiAgc2hvdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGF0ZXBpY2tlci5pc1Nob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZXRDb25maWcoKTtcblxuICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYgPSB0aGlzLl9kYXRlcGlja2VyXG4gICAgICAucHJvdmlkZSh7cHJvdmlkZTogQnNEYXRlcGlja2VyQ29uZmlnLCB1c2VWYWx1ZTogdGhpcy5fY29uZmlnfSlcbiAgICAgIC5hdHRhY2goQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQpXG4gICAgICAudG8odGhpcy5jb250YWluZXIpXG4gICAgICAucG9zaXRpb24oe2F0dGFjaG1lbnQ6IHRoaXMucGxhY2VtZW50fSlcbiAgICAgIC5zaG93KHtwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50fSk7XG5cbiAgICAvLyBpZiBkYXRlIGNoYW5nZXMgZnJvbSBleHRlcm5hbCBzb3VyY2UgKG1vZGVsIC0+IHZpZXcpXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5ic1ZhbHVlQ2hhbmdlLnN1YnNjcmliZSgodmFsdWU6IERhdGVbXSkgPT4ge1xuICAgICAgICB0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlLnZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBpZiBkYXRlIGNoYW5nZXMgZnJvbSBwaWNrZXIgKHZpZXcgLT4gbW9kZWwpXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS52YWx1ZUNoYW5nZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKHJhbmdlOiBEYXRlW10pID0+IHJhbmdlICYmIHJhbmdlWzBdICYmICEhcmFuZ2VbMV0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IERhdGVbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuYnNWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNvbmZpZyBmb3IgZGF0ZXJhbmdlcGlja2VyXG4gICAqL1xuICBzZXRDb25maWcoKSB7XG4gICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgdGhpcy5fY29uZmlnLFxuICAgICAgdGhpcy5ic0NvbmZpZyxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuX2JzVmFsdWUsXG4gICAgICAgIGlzRGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgbWluRGF0ZTogdGhpcy5taW5EYXRlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5taW5EYXRlLFxuICAgICAgICBtYXhEYXRlOiB0aGlzLm1heERhdGUgfHwgdGhpcy5ic0NvbmZpZyAmJiB0aGlzLmJzQ29uZmlnLm1heERhdGVcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBhbiBlbGVtZW50w6LCgMKZcyBkYXRlcGlja2VyLiBUaGlzIGlzIGNvbnNpZGVyZWQgYSDDosKAwpxtYW51YWzDosKAwp0gdHJpZ2dlcmluZyBvZlxuICAgKiB0aGUgZGF0ZXBpY2tlci5cbiAgICovXG4gIGhpZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLl9kYXRlcGlja2VyLmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5fc3Vicykge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gZWxlbWVudMOiwoDCmXMgZGF0ZXBpY2tlci4gVGhpcyBpcyBjb25zaWRlcmVkIGEgw6LCgMKcbWFudWFsw6LCgMKdIHRyaWdnZXJpbmdcbiAgICogb2YgdGhlIGRhdGVwaWNrZXIuXG4gICAqL1xuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmRpc3Bvc2UoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgUHJvdmlkZXIsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgcGFyc2VEYXRlLCBmb3JtYXREYXRlLCBnZXRMb2NhbGUsIGlzQWZ0ZXIsIGlzQmVmb3JlLCBpc0FycmF5LCBpc0RhdGVWYWxpZCB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBCc0RhdGVyYW5nZXBpY2tlckRpcmVjdGl2ZSB9IGZyb20gJy4vYnMtZGF0ZXJhbmdlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCc0xvY2FsZVNlcnZpY2UgfSBmcm9tICcuL2JzLWxvY2FsZS5zZXJ2aWNlJztcblxuY29uc3QgQlNfREFURVJBTkdFUElDS0VSX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlICovXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJzRGF0ZXJhbmdlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuY29uc3QgQlNfREFURVJBTkdFUElDS0VSX1ZBTElEQVRPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlICovXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJzRGF0ZXJhbmdlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBpbnB1dFtic0RhdGVyYW5nZXBpY2tlcl1gLFxuICBob3N0OiB7XG4gICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCRldmVudCknLFxuICAgICcoa2V5dXAuZXNjKSc6ICdoaWRlKCknLFxuICAgICcoYmx1ciknOiAnb25CbHVyKCknXG4gIH0sXG4gIHByb3ZpZGVyczogW0JTX0RBVEVSQU5HRVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUiwgQlNfREFURVJBTkdFUElDS0VSX1ZBTElEQVRPUl1cbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcmFuZ2VwaWNrZXJJbnB1dERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICBwcml2YXRlIF9vbkNoYW5nZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC12YXJpYWJsZSAqL1xuICBwcml2YXRlIF92YWxpZGF0b3JDaGFuZ2UgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4gIHByaXZhdGUgX3ZhbHVlOiBEYXRlW107XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBwcml2YXRlIF9waWNrZXI6IEJzRGF0ZXJhbmdlcGlja2VyRGlyZWN0aXZlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2NhbGVTZXJ2aWNlOiBCc0xvY2FsZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2VsUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAvLyB1cGRhdGUgaW5wdXQgdmFsdWUgb24gZGF0ZXBpY2tlciB2YWx1ZSB1cGRhdGVcbiAgICB0aGlzLl9waWNrZXIuYnNWYWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBEYXRlW10pID0+IHtcbiAgICAgIHRoaXMuX3NldElucHV0VmFsdWUodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24ubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGUgaW5wdXQgdmFsdWUgb24gbG9jYWxlIGNoYW5nZVxuICAgIHRoaXMuX2xvY2FsZVNlcnZpY2UubG9jYWxlQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9zZXRJbnB1dFZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zZXRJbnB1dFZhbHVlKGRhdGU6IERhdGVbXSk6IHZvaWQge1xuICAgIGxldCByYW5nZSA9ICcnO1xuICAgIGlmIChkYXRlKSB7XG4gICAgICBjb25zdCBzdGFydDogc3RyaW5nID0gIWRhdGVbMF0gPyAnJ1xuICAgICAgICA6IGZvcm1hdERhdGUoZGF0ZVswXSxcbiAgICAgICAgICB0aGlzLl9waWNrZXIuX2NvbmZpZy5yYW5nZUlucHV0Rm9ybWF0LFxuICAgICAgICAgIHRoaXMuX2xvY2FsZVNlcnZpY2UuY3VycmVudExvY2FsZVxuICAgICAgICApO1xuICAgICAgY29uc3QgZW5kOiBzdHJpbmcgPSAhZGF0ZVsxXSA/ICcnXG4gICAgICAgIDogZm9ybWF0RGF0ZShcbiAgICAgICAgICBkYXRlWzFdLFxuICAgICAgICAgIHRoaXMuX3BpY2tlci5fY29uZmlnLnJhbmdlSW5wdXRGb3JtYXQsXG4gICAgICAgICAgdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlXG4gICAgICAgICk7XG4gICAgICByYW5nZSA9IChzdGFydCAmJiBlbmQpID8gc3RhcnQgKyB0aGlzLl9waWNrZXIuX2NvbmZpZy5yYW5nZVNlcGFyYXRvciArIGVuZCA6ICcnO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCByYW5nZSk7XG4gIH1cblxuICBvbkNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gICAgdGhpcy53cml0ZVZhbHVlKChldmVudC50YXJnZXQgYXMgYW55KS52YWx1ZSk7XG4gICAgdGhpcy5fb25DaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICB9XG5cbiAgdmFsaWRhdGUoYzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IF92YWx1ZTogW0RhdGUsIERhdGVdID0gYy52YWx1ZTtcblxuICAgIGlmIChfdmFsdWUgPT09IG51bGwgfHwgX3ZhbHVlID09PSB1bmRlZmluZWQgfHwgIWlzQXJyYXkoX3ZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgX2lzRmlyc3REYXRlVmFsaWQgPSBpc0RhdGVWYWxpZChfdmFsdWVbMF0pO1xuICAgIGNvbnN0IF9pc1NlY29uZERhdGVWYWxpZCA9IGlzRGF0ZVZhbGlkKF92YWx1ZVsxXSk7XG5cbiAgICBpZiAoIV9pc0ZpcnN0RGF0ZVZhbGlkKSB7XG4gICAgICByZXR1cm4geyBic0RhdGU6IHsgaW52YWxpZDogX3ZhbHVlWzBdIH0gfTtcbiAgICB9XG5cbiAgICBpZiAoIV9pc1NlY29uZERhdGVWYWxpZCkge1xuICAgICAgcmV0dXJuIHsgYnNEYXRlOiB7IGludmFsaWQ6IF92YWx1ZVsxXSB9IH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BpY2tlciAmJiB0aGlzLl9waWNrZXIubWluRGF0ZSAmJiBpc0JlZm9yZShfdmFsdWVbMF0sIHRoaXMuX3BpY2tlci5taW5EYXRlLCAnZGF0ZScpKSB7XG4gICAgICByZXR1cm4geyBic0RhdGU6IHsgbWluRGF0ZTogdGhpcy5fcGlja2VyLm1pbkRhdGUgfSB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9waWNrZXIgJiYgdGhpcy5fcGlja2VyLm1heERhdGUgJiYgaXNBZnRlcihfdmFsdWVbMV0sIHRoaXMuX3BpY2tlci5tYXhEYXRlLCAnZGF0ZScpKSB7XG4gICAgICByZXR1cm4geyBic0RhdGU6IHsgbWF4RGF0ZTogdGhpcy5fcGlja2VyLm1heERhdGUgfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IERhdGVbXSB8IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgX2xvY2FsZUtleSA9IHRoaXMuX2xvY2FsZVNlcnZpY2UuY3VycmVudExvY2FsZTtcbiAgICAgIGNvbnN0IF9sb2NhbGUgPSBnZXRMb2NhbGUoX2xvY2FsZUtleSk7XG4gICAgICBpZiAoIV9sb2NhbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBMb2NhbGUgXCIke19sb2NhbGVLZXl9XCIgaXMgbm90IGRlZmluZWQsIHBsZWFzZSBhZGQgaXQgd2l0aCBcImRlZmluZUxvY2FsZSguLi4pXCJgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBfaW5wdXQ6IChzdHJpbmdbXSB8IERhdGVbXSkgPSBbXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIF9pbnB1dCA9IHZhbHVlLnNwbGl0KHRoaXMuX3BpY2tlci5fY29uZmlnLnJhbmdlU2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIF9pbnB1dCA9IHZhbHVlO1xuICAgICAgfVxuXG5cbiAgICAgIHRoaXMuX3ZhbHVlID0gKF9pbnB1dCBhcyBzdHJpbmdbXSlcbiAgICAgICAgLm1hcCgoX3ZhbDogc3RyaW5nKTogRGF0ZSA9PlxuICAgICAgICAgIHBhcnNlRGF0ZShfdmFsLCB0aGlzLl9waWNrZXIuX2NvbmZpZy5kYXRlSW5wdXRGb3JtYXQsIHRoaXMuX2xvY2FsZVNlcnZpY2UuY3VycmVudExvY2FsZSkpXG4gICAgICAgIC5tYXAoKGRhdGU6IERhdGUpID0+IChpc05hTihkYXRlLnZhbHVlT2YoKSkgPyBudWxsIDogZGF0ZSkpO1xuICAgIH1cblxuICAgIHRoaXMuX3BpY2tlci5ic1ZhbHVlID0gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9waWNrZXIuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJyk7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLl9waWNrZXIuaGlkZSgpO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQpLmJsdXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWNhbGVuZGFyLWxheW91dCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSBjdXJyZW50IGRhdGUsIHdpbGwgYmUgYWRkZWQgaW4gbmVhcmVzdCByZWxlYXNlcyAtLT5cbiAgICA8YnMtY3VycmVudC1kYXRlIHRpdGxlPVwiaGV5IHRoZXJlXCIgKm5nSWY9XCJmYWxzZVwiPjwvYnMtY3VycmVudC1kYXRlPlxuXG4gICAgPCEtLW5hdmlnYXRpb24tLT5cbiAgICA8ZGl2IGNsYXNzPVwiYnMtZGF0ZXBpY2tlci1oZWFkXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJicy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlld1wiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJicy1kYXRlcGlja2VyLWJvZHlcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS10aW1lcGlja2VyLS0+XG4gICAgPGJzLXRpbWVwaWNrZXIgKm5nSWY9XCJmYWxzZVwiPjwvYnMtdGltZXBpY2tlcj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBCc0NhbGVuZGFyTGF5b3V0Q29tcG9uZW50IHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWN1cnJlbnQtZGF0ZScsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImN1cnJlbnQtdGltZWRhdGVcIj48c3Bhbj57eyB0aXRsZSB9fTwvc3Bhbj48L2Rpdj5gXG59KVxuZXhwb3J0IGNsYXNzIEJzQ3VycmVudERhdGVWaWV3Q29tcG9uZW50IHtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnNDdXN0b21EYXRlcyB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBEYXRlIHwgRGF0ZVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1jdXN0b20tZGF0ZS12aWV3JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYnMtZGF0ZXBpY2tlci1wcmVkZWZpbmVkLWJ0bnNcIj5cbiAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHJhbmdlIG9mIHJhbmdlc1wiPnt7IHJhbmdlLmxhYmVsIH19PC9idXR0b24+XG4gICAgICA8YnV0dG9uICpuZ0lmPVwiaXNDdXN0b21SYW5nZVNob3duXCI+Q3VzdG9tIFJhbmdlPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEJzQ3VzdG9tRGF0ZXNWaWV3Q29tcG9uZW50IHtcbiAgQElucHV0KCkgaXNDdXN0b21SYW5nZVNob3duOiB0cnVlO1xuICBASW5wdXQoKSByYW5nZXM6IEJzQ3VzdG9tRGF0ZXNbXTtcbn1cbiIsImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi4vLi4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgRGF5Vmlld01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW2JzRGF0ZXBpY2tlckRheURlY29yYXRvcl0nLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuZGlzYWJsZWRdJzogJ2RheS5pc0Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLmlzLWhpZ2hsaWdodGVkXSc6ICdkYXkuaXNIb3ZlcmVkJyxcbiAgICAnW2NsYXNzLmlzLW90aGVyLW1vbnRoXSc6ICdkYXkuaXNPdGhlck1vbnRoJyxcbiAgICAnW2NsYXNzLmlzLWFjdGl2ZS1vdGhlci1tb250aF0nOiAnZGF5LmlzT3RoZXJNb250aEhvdmVyZWQnLFxuICAgICdbY2xhc3MuaW4tcmFuZ2VdJzogJ2RheS5pc0luUmFuZ2UnLFxuICAgICdbY2xhc3Muc2VsZWN0LXN0YXJ0XSc6ICdkYXkuaXNTZWxlY3Rpb25TdGFydCcsXG4gICAgJ1tjbGFzcy5zZWxlY3QtZW5kXSc6ICdkYXkuaXNTZWxlY3Rpb25FbmQnLFxuICAgICdbY2xhc3Muc2VsZWN0ZWRdJzogJ2RheS5pc1NlbGVjdGVkJ1xuICB9LFxuICB0ZW1wbGF0ZTogYHt7IGRheS5sYWJlbCB9fWBcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyRGF5RGVjb3JhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZGF5OiBEYXlWaWV3TW9kZWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcsXG4gICAgcHJpdmF0ZSBfZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRheS5pc1RvZGF5ICYmIHRoaXMuX2NvbmZpZyAmJiB0aGlzLl9jb25maWcuY3VzdG9tVG9kYXlDbGFzcykge1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5fY29uZmlnLmN1c3RvbVRvZGF5Q2xhc3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzTmF2aWdhdGlvbkRpcmVjdGlvbixcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRhdGVwaWNrZXItbmF2aWdhdGlvbi12aWV3JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvbiBjbGFzcz1cInByZXZpb3VzXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjYWxlbmRhci5kaXNhYmxlTGVmdEFycm93XCJcbiAgICAgICAgICAgIFtzdHlsZS52aXNpYmlsaXR5XT1cImNhbGVuZGFyLmhpZGVMZWZ0QXJyb3cgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwibmF2VG8odHJ1ZSlcIj48c3Bhbj4mbHNhcXVvOzwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cblxuICAgICYjODIwMzsgIDwhLS0gemVyby13aWR0aCBzcGFjZSBuZWVkZWQgZm9yIGNvcnJlY3QgYWxpZ25lbWVudFxuICAgICAgICAgICAgICAgICAgd2l0aCBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSBpbiBBbmd1bGFyIC0tPlxuXG4gICAgPGJ1dHRvbiBjbGFzcz1cImN1cnJlbnRcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYWxlbmRhci5tb250aFRpdGxlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ2aWV3KCdtb250aCcpXCJcbiAgICA+PHNwYW4+e3sgY2FsZW5kYXIubW9udGhUaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cblxuICAgICYjODIwMzsgIDwhLS0gemVyby13aWR0aCBzcGFjZSBuZWVkZWQgZm9yIGNvcnJlY3QgYWxpZ25lbWVudFxuICAgICAgICAgICAgICAgICAgd2l0aCBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSBpbiBBbmd1bGFyIC0tPlxuXG4gICAgPGJ1dHRvbiBjbGFzcz1cImN1cnJlbnRcIiAoY2xpY2spPVwidmlldygneWVhcicpXCJcbiAgICA+PHNwYW4+e3sgY2FsZW5kYXIueWVhclRpdGxlIH19PC9zcGFuPjwvYnV0dG9uPlxuXG4gICAgJiM4MjAzOyAgPCEtLSB6ZXJvLXdpZHRoIHNwYWNlIG5lZWRlZCBmb3IgY29ycmVjdCBhbGlnbmVtZW50XG4gICAgICAgICAgICAgICAgICB3aXRoIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlIGluIEFuZ3VsYXIgLS0+XG5cbiAgICA8YnV0dG9uIGNsYXNzPVwibmV4dFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FsZW5kYXIuZGlzYWJsZVJpZ2h0QXJyb3dcIlxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwiY2FsZW5kYXIuaGlkZVJpZ2h0QXJyb3cgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwibmF2VG8oZmFsc2UpXCI+PHNwYW4+JnJzYXF1bzs8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyTmF2aWdhdGlvblZpZXdDb21wb25lbnQge1xuICBASW5wdXQoKSBjYWxlbmRhcjogRGF5c0NhbGVuZGFyVmlld01vZGVsO1xuXG4gIEBPdXRwdXQoKSBvbk5hdmlnYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxCc05hdmlnYXRpb25EaXJlY3Rpb24+KCk7XG4gIEBPdXRwdXQoKSBvblZpZXdNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxCc0RhdGVwaWNrZXJWaWV3TW9kZT4oKTtcblxuICBuYXZUbyhkb3duOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vbk5hdmlnYXRlLmVtaXQoXG4gICAgICBkb3duID8gQnNOYXZpZ2F0aW9uRGlyZWN0aW9uLkRPV04gOiBCc05hdmlnYXRpb25EaXJlY3Rpb24uVVBcbiAgICApO1xuICB9XG5cbiAgdmlldyh2aWV3TW9kZTogQnNEYXRlcGlja2VyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmlld01vZGUuZW1pdCh2aWV3TW9kZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzTmF2aWdhdGlvbkRpcmVjdGlvbixcbiAgQnNOYXZpZ2F0aW9uRXZlbnQsXG4gIENlbGxIb3ZlckV2ZW50LFxuICBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyxcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBEYXlWaWV3TW9kZWxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uLy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnMtZGF5cy1jYWxlbmRhci12aWV3JyxcbiAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJzLWNhbGVuZGFyLWxheW91dD5cbiAgICAgIDxicy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlld1xuICAgICAgICBbY2FsZW5kYXJdPVwiY2FsZW5kYXJcIlxuICAgICAgICAob25OYXZpZ2F0ZSk9XCJuYXZpZ2F0ZVRvKCRldmVudClcIlxuICAgICAgICAob25WaWV3TW9kZSk9XCJjaGFuZ2VWaWV3TW9kZSgkZXZlbnQpXCJcbiAgICAgID48L2JzLWRhdGVwaWNrZXItbmF2aWdhdGlvbi12aWV3PlxuXG4gICAgICA8IS0tZGF5cyBtYXRyaXgtLT5cbiAgICAgIDx0YWJsZSByb2xlPVwiZ3JpZFwiIGNsYXNzPVwiZGF5cyB3ZWVrc1wiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8IS0taWYgc2hvdyB3ZWVrcy0tPlxuICAgICAgICAgIDx0aCAqbmdJZj1cIm9wdGlvbnMuc2hvd1dlZWtOdW1iZXJzXCI+PC90aD5cbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHdlZWtkYXkgb2YgY2FsZW5kYXIud2Vla2RheXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwid2Vla2RheVwiPnt7IGNhbGVuZGFyLndlZWtkYXlzW2ldIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHdlZWsgb2YgY2FsZW5kYXIud2Vla3M7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJ3ZWVrXCIgKm5nSWY9XCJvcHRpb25zLnNob3dXZWVrTnVtYmVyc1wiPlxuICAgICAgICAgICAgPHNwYW4+e3sgY2FsZW5kYXIud2Vla051bWJlcnNbaV0gfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrLmRheXNcIiByb2xlPVwiZ3JpZGNlbGxcIj5cbiAgICAgICAgICA8c3BhbiBic0RhdGVwaWNrZXJEYXlEZWNvcmF0b3JcbiAgICAgICAgICAgICAgICBbZGF5XT1cImRheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheShkYXkpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJob3ZlckRheShkYXksIHRydWUpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlckRheShkYXksIGZhbHNlKVwiPnt7IGRheS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cblxuICAgIDwvYnMtY2FsZW5kYXItbGF5b3V0PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEJzRGF5c0NhbGVuZGFyVmlld0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNhbGVuZGFyOiBEYXlzQ2FsZW5kYXJWaWV3TW9kZWw7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IERhdGVwaWNrZXJSZW5kZXJPcHRpb25zO1xuXG4gIEBPdXRwdXQoKSBvbk5hdmlnYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxCc05hdmlnYXRpb25FdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uVmlld01vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEJzRGF0ZXBpY2tlclZpZXdNb2RlPigpO1xuXG4gIEBPdXRwdXQoKSBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5Vmlld01vZGVsPigpO1xuICBAT3V0cHV0KCkgb25Ib3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEhvdmVyRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcpIHsgfVxuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzTmF2aWdhdGlvbkRpcmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSBCc05hdmlnYXRpb25EaXJlY3Rpb24uRE9XTiA9PT0gZXZlbnQgPyAtMSA6IDE7XG4gICAgdGhpcy5vbk5hdmlnYXRlLmVtaXQoeyBzdGVwOiB7IG1vbnRoOiBzdGVwIH0gfSk7XG4gIH1cblxuICBjaGFuZ2VWaWV3TW9kZShldmVudDogQnNEYXRlcGlja2VyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmlld01vZGUuZW1pdChldmVudCk7XG4gIH1cblxuICBzZWxlY3REYXkoZXZlbnQ6IERheVZpZXdNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMub25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICBob3ZlckRheShjZWxsOiBEYXlWaWV3TW9kZWwsIGlzSG92ZXJlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb25maWcuc2VsZWN0RnJvbU90aGVyTW9udGggJiYgY2VsbC5pc090aGVyTW9udGgpIHtcbiAgICAgIGNlbGwuaXNPdGhlck1vbnRoSG92ZXJlZCA9IGlzSG92ZXJlZDtcbiAgICB9XG5cbiAgICB0aGlzLm9uSG92ZXIuZW1pdCh7IGNlbGwsIGlzSG92ZXJlZCB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJzRGF0ZXBpY2tlclZpZXdNb2RlLFxuICBCc05hdmlnYXRpb25EaXJlY3Rpb24sXG4gIEJzTmF2aWdhdGlvbkV2ZW50LFxuICBDZWxsSG92ZXJFdmVudCxcbiAgTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWwsXG4gIENhbGVuZGFyQ2VsbFZpZXdNb2RlbFxufSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1tb250aC1jYWxlbmRhci12aWV3JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnMtY2FsZW5kYXItbGF5b3V0PlxuICAgICAgPGJzLWRhdGVwaWNrZXItbmF2aWdhdGlvbi12aWV3XG4gICAgICAgIFtjYWxlbmRhcl09XCJjYWxlbmRhclwiXG4gICAgICAgIChvbk5hdmlnYXRlKT1cIm5hdmlnYXRlVG8oJGV2ZW50KVwiXG4gICAgICAgIChvblZpZXdNb2RlKT1cImNoYW5nZVZpZXdNb2RlKCRldmVudClcIlxuICAgICAgPjwvYnMtZGF0ZXBpY2tlci1uYXZpZ2F0aW9uLXZpZXc+XG5cbiAgICAgIDx0YWJsZSByb2xlPVwiZ3JpZFwiIGNsYXNzPVwibW9udGhzXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgY2FsZW5kYXIubW9udGhzXCI+XG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBtb250aCBvZiByb3dcIiByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidmlld01vbnRoKG1vbnRoKVwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyTW9udGgobW9udGgsIHRydWUpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJNb250aChtb250aCwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIm1vbnRoLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXMtaGlnaGxpZ2h0ZWRdPVwibW9udGguaXNIb3ZlcmVkXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBtb250aC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2JzLWNhbGVuZGFyLWxheW91dD5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBCc01vbnRoQ2FsZW5kYXJWaWV3Q29tcG9uZW50IHtcbiAgQElucHV0KCkgY2FsZW5kYXI6IE1vbnRoc0NhbGVuZGFyVmlld01vZGVsO1xuXG4gIEBPdXRwdXQoKSBvbk5hdmlnYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxCc05hdmlnYXRpb25FdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uVmlld01vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEJzRGF0ZXBpY2tlclZpZXdNb2RlPigpO1xuXG4gIEBPdXRwdXQoKSBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJDZWxsVmlld01vZGVsPigpO1xuICBAT3V0cHV0KCkgb25Ib3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEhvdmVyRXZlbnQ+KCk7XG5cbiAgbmF2aWdhdGVUbyhldmVudDogQnNOYXZpZ2F0aW9uRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcCA9IEJzTmF2aWdhdGlvbkRpcmVjdGlvbi5ET1dOID09PSBldmVudCA/IC0xIDogMTtcbiAgICB0aGlzLm9uTmF2aWdhdGUuZW1pdCh7IHN0ZXA6IHsgeWVhcjogc3RlcCB9IH0pO1xuICB9XG5cbiAgdmlld01vbnRoKG1vbnRoOiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpIHtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQobW9udGgpO1xuICB9XG5cbiAgaG92ZXJNb250aChjZWxsOiBDYWxlbmRhckNlbGxWaWV3TW9kZWwsIGlzSG92ZXJlZDogYm9vbGVhbikge1xuICAgIHRoaXMub25Ib3Zlci5lbWl0KHsgY2VsbCwgaXNIb3ZlcmVkIH0pO1xuICB9XG5cbiAgY2hhbmdlVmlld01vZGUoZXZlbnQ6IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5vblZpZXdNb2RlLmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCIvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy10aW1lcGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYnMtdGltZXBpY2tlci1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJicy10aW1lcGlja2VyLWNvbnRyb2xzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJicy1kZWNyZWFzZVwiPi08L2J1dHRvbj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImhvdXJzXCIgcGxhY2Vob2xkZXI9XCIwMFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnMtaW5jcmVhc2VcIj4rPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJicy10aW1lcGlja2VyLWNvbnRyb2xzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJicy1kZWNyZWFzZVwiPi08L2J1dHRvbj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cIm1pbnV0ZXNcIiBwbGFjZWhvbGRlcj1cIjAwXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJicy1pbmNyZWFzZVwiPis8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN3aXRjaC10aW1lLWZvcm1hdFwiPnt7IGFtcG0gfX1cbiAgICAgICAgPGltZ1xuICAgICAgICAgIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBS0NBWUFBQUJpOEtTREFBQUJTRWxFUVZRWVYzWFFQVXZEVUJRRzRITnVhZ3RWcWM2S2dvdUN2NkdJdUludFlCTEI5aGNJUXBMU3RDQUlWN0RZbXBUY1JXY1hxWmlvM1Z3Yy9VQ2MvUUVxZmd5S0dicjBJN25TMUVpSGVxWXpQTy9oNVNEMGpheFVaam1TTENCK09GYitVRklORndBU0FFQWRwdTlnYUdYVnlBSEhGUUJrSHBLSGM2YTlkekVDdkFEeVk5c3FsQU1zSzlXMGp6eERYcWV5dHIzbWhRY2t4U2ppMjdUSko1L3JQbUlwd0pKcTNIcnRkdXJpWU91cnYxYTRpMXA1SG5oa0c5T0Z5bWkwUmVvTzA1Y0d3YitheXY0ZHlzVnlnamVGbXNQMDVmOHdwWlE4ZnNkdmZtdVk5empXU05xVXRnWUZWbk9WUmVJTFlvQkZ6ZFFJNS9HR0Z6TkhoR2JlWm5vcERHVTI5c1pic2NnbGRtQzk5dzM1Vk9BVFR5Y0lNTWNCWElmcFNWR3paaEE2QzhoaDAwY29ubG42VlE5VEdnVjMyT0VBS1FDNERyQnE3Q0p3ZDBnZ1I3VnEvclByZmdCK0Mzc0d5cFk1REFBQUFBQkpSVTVFcmtKZ2dnPT1cIlxuICAgICAgICAgIGFsdD1cIlwiPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQnNUaW1lcGlja2VyVmlld0NvbXBvbmVudCB7XG4gIGFtcG0gPSAnb2snO1xuICBob3VycyA9IDA7XG4gIG1pbnV0ZXMgPSAwO1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHllYXJzUGVyQ2FsZW5kYXIgfSBmcm9tICcuLi8uLi9lbmdpbmUvZm9ybWF0LXllYXJzLWNhbGVuZGFyJztcbmltcG9ydCB7XG4gIEJzRGF0ZXBpY2tlclZpZXdNb2RlLFxuICBCc05hdmlnYXRpb25EaXJlY3Rpb24sXG4gIEJzTmF2aWdhdGlvbkV2ZW50LFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWwsXG4gIENlbGxIb3ZlckV2ZW50LFxuICBZZWFyc0NhbGVuZGFyVmlld01vZGVsXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLXllYXJzLWNhbGVuZGFyLXZpZXcnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxicy1jYWxlbmRhci1sYXlvdXQ+XG4gICAgICA8YnMtZGF0ZXBpY2tlci1uYXZpZ2F0aW9uLXZpZXdcbiAgICAgICAgW2NhbGVuZGFyXT1cImNhbGVuZGFyXCJcbiAgICAgICAgKG9uTmF2aWdhdGUpPVwibmF2aWdhdGVUbygkZXZlbnQpXCJcbiAgICAgICAgKG9uVmlld01vZGUpPVwiY2hhbmdlVmlld01vZGUoJGV2ZW50KVwiXG4gICAgICA+PC9icy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlldz5cblxuICAgICAgPHRhYmxlIHJvbGU9XCJncmlkXCIgY2xhc3M9XCJ5ZWFyc1wiPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIGNhbGVuZGFyLnllYXJzXCI+XG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHJvd1wiIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyWWVhcih5ZWFyLCB0cnVlKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyWWVhcih5ZWFyLCBmYWxzZSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwieWVhci5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWhpZ2hsaWdodGVkXT1cInllYXIuaXNIb3ZlcmVkXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyB5ZWFyLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvYnMtY2FsZW5kYXItbGF5b3V0PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEJzWWVhcnNDYWxlbmRhclZpZXdDb21wb25lbnQge1xuICBASW5wdXQoKSBjYWxlbmRhcjogWWVhcnNDYWxlbmRhclZpZXdNb2RlbDtcblxuICBAT3V0cHV0KCkgb25OYXZpZ2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8QnNOYXZpZ2F0aW9uRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBvblZpZXdNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxCc0RhdGVwaWNrZXJWaWV3TW9kZT4oKTtcblxuICBAT3V0cHV0KCkgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyQ2VsbFZpZXdNb2RlbD4oKTtcbiAgQE91dHB1dCgpIG9uSG92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxIb3ZlckV2ZW50PigpO1xuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzTmF2aWdhdGlvbkRpcmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSBCc05hdmlnYXRpb25EaXJlY3Rpb24uRE9XTiA9PT0gZXZlbnQgPyAtMSA6IDE7XG4gICAgdGhpcy5vbk5hdmlnYXRlLmVtaXQoeyBzdGVwOiB7IHllYXI6IHN0ZXAgKiB5ZWFyc1BlckNhbGVuZGFyIH0gfSk7XG4gIH1cblxuICB2aWV3WWVhcih5ZWFyOiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpIHtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQoeWVhcik7XG4gIH1cblxuICBob3ZlclllYXIoY2VsbDogQ2FsZW5kYXJDZWxsVmlld01vZGVsLCBpc0hvdmVyZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9uSG92ZXIuZW1pdCh7IGNlbGwsIGlzSG92ZXJlZCB9KTtcbiAgfVxuXG4gIGNoYW5nZVZpZXdNb2RlKGV2ZW50OiBCc0RhdGVwaWNrZXJWaWV3TW9kZSk6IHZvaWQge1xuICAgIHRoaXMub25WaWV3TW9kZS5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRMb2FkZXJGYWN0b3J5IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jb21wb25lbnQtbG9hZGVyJztcbmltcG9ydCB7IFBvc2l0aW9uaW5nU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvcG9zaXRpb25pbmcnO1xuXG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyRGlyZWN0aXZlIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJDb25maWcgfSBmcm9tICcuL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IEJzRGF0ZXJhbmdlcGlja2VySW5wdXREaXJlY3RpdmUgfSBmcm9tICcuL2JzLWRhdGVyYW5nZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnNEYXRlcmFuZ2VwaWNrZXJEaXJlY3RpdmUgfSBmcm9tICcuL2JzLWRhdGVyYW5nZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcmFuZ2VwaWNrZXJDb25maWcgfSBmcm9tICcuL2JzLWRhdGVyYW5nZXBpY2tlci5jb25maWcnO1xuXG5pbXBvcnQgeyBCc0xvY2FsZVNlcnZpY2UgfSBmcm9tICcuL2JzLWxvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckFjdGlvbnMgfSBmcm9tICcuL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5hY3Rpb25zJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckVmZmVjdHMgfSBmcm9tICcuL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0b3JlIH0gZnJvbSAnLi9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RvcmUnO1xuaW1wb3J0IHsgQnNDYWxlbmRhckxheW91dENvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWNhbGVuZGFyLWxheW91dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNDdXJyZW50RGF0ZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1jdXJyZW50LWRhdGUtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNDdXN0b21EYXRlc1ZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1jdXN0b20tZGF0ZXMtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi90aGVtZXMvYnMvYnMtZGF0ZXBpY2tlci1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckRheURlY29yYXRvckNvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWRhdGVwaWNrZXItZGF5LWRlY29yYXRvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyTmF2aWdhdGlvblZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1kYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCc0RheXNDYWxlbmRhclZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1kYXlzLWNhbGVuZGFyLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9udGhDYWxlbmRhclZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1tb250aHMtY2FsZW5kYXItdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNUaW1lcGlja2VyVmlld0NvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLXRpbWVwaWNrZXItdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNZZWFyc0NhbGVuZGFyVmlld0NvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLXllYXJzLWNhbGVuZGFyLXZpZXcuY29tcG9uZW50JztcblxuY29uc3QgX2V4cG9ydHMgPSBbXG4gIEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCxcbiAgQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQsXG5cbiAgQnNEYXRlcGlja2VyRGlyZWN0aXZlLFxuICBCc0RhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSxcblxuICBCc0RhdGVyYW5nZXBpY2tlcklucHV0RGlyZWN0aXZlLFxuICBCc0RhdGVyYW5nZXBpY2tlckRpcmVjdGl2ZVxuXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIEJzRGF0ZXBpY2tlckRheURlY29yYXRvckNvbXBvbmVudCxcbiAgICBCc0N1cnJlbnREYXRlVmlld0NvbXBvbmVudCxcbiAgICBCc0RhdGVwaWNrZXJOYXZpZ2F0aW9uVmlld0NvbXBvbmVudCxcbiAgICBCc1RpbWVwaWNrZXJWaWV3Q29tcG9uZW50LFxuXG4gICAgQnNDYWxlbmRhckxheW91dENvbXBvbmVudCxcbiAgICBCc0RheXNDYWxlbmRhclZpZXdDb21wb25lbnQsXG4gICAgQnNNb250aENhbGVuZGFyVmlld0NvbXBvbmVudCxcbiAgICBCc1llYXJzQ2FsZW5kYXJWaWV3Q29tcG9uZW50LFxuXG4gICAgQnNDdXN0b21EYXRlc1ZpZXdDb21wb25lbnQsXG5cbiAgICAuLi5fZXhwb3J0c1xuICBdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtcbiAgICBCc0RhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQsXG4gICAgQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnRcbiAgXSxcbiAgZXhwb3J0czogX2V4cG9ydHNcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCc0RhdGVwaWNrZXJNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ29tcG9uZW50TG9hZGVyRmFjdG9yeSxcbiAgICAgICAgUG9zaXRpb25pbmdTZXJ2aWNlLFxuICAgICAgICBCc0RhdGVwaWNrZXJTdG9yZSxcbiAgICAgICAgQnNEYXRlcGlja2VyQWN0aW9ucyxcbiAgICAgICAgQnNEYXRlcGlja2VyQ29uZmlnLFxuICAgICAgICBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyxcbiAgICAgICAgQnNEYXRlcGlja2VyRWZmZWN0cyxcbiAgICAgICAgQnNMb2NhbGVTZXJ2aWNlXG4gICAgICBdXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRlRm9ybWF0dGVyIHtcbiAgZm9ybWF0KGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0LCBsb2NhbGUpO1xuICB9XG59XG4iLCIvKiB0c2xpbnQ6ZGlzYWJsZTogbWF4LWZpbGUtbGluZS1jb3VudCAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEYXRlRm9ybWF0dGVyIH0gZnJvbSAnLi9kYXRlLWZvcm1hdHRlcic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0ZXBpY2tlci1pbm5lcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSZsdDshJm5kYXNoO25nLWtleWRvd249XCJrZXlkb3duKCRldmVudClcIiZuZGFzaDsmZ3Q7LS0+XG4gICAgPGRpdiAqbmdJZj1cImRhdGVwaWNrZXJNb2RlXCIgY2xhc3M9XCJ3ZWxsIHdlbGwtc20gYmctZmFkZWQgcC1hIGNhcmRcIiByb2xlPVwiYXBwbGljYXRpb25cIiA+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZztcbiAgQElucHV0KCkgZGF0ZXBpY2tlck1vZGU6IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRpbmdEYXk6IG51bWJlcjtcbiAgQElucHV0KCkgeWVhclJhbmdlOiBudW1iZXI7XG5cbiAgQElucHV0KCkgbWluRGF0ZTogRGF0ZTtcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcbiAgQElucHV0KCkgbWluTW9kZTogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhNb2RlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dXZWVrczogYm9vbGVhbjtcbiAgQElucHV0KCkgZm9ybWF0RGF5OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdFllYXI6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybWF0RGF5SGVhZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdERheVRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgb25seUN1cnJlbnRNb250aDogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvcnRjdXRQcm9wYWdhdGlvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M6IHsgZGF0ZTogRGF0ZTsgbW9kZTogc3RyaW5nOyBjbGF6ejogc3RyaW5nIH1bXTtcbiAgQElucHV0KCkgbW9udGhDb2xMaW1pdDogbnVtYmVyO1xuICBASW5wdXQoKSB5ZWFyQ29sTGltaXQ6IG51bWJlcjtcbiAgQElucHV0KCkgZGF0ZURpc2FibGVkOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZyB9W107XG4gIEBJbnB1dCgpIGRheURpc2FibGVkOiBudW1iZXJbXTtcbiAgQElucHV0KCkgaW5pdERhdGU6IERhdGU7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkRvbmU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4odW5kZWZpbmVkKTtcbiAgQE91dHB1dCgpIHVwZGF0ZTogRXZlbnRFbWl0dGVyPERhdGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPihmYWxzZSk7XG4gIEBPdXRwdXQoKSBhY3RpdmVEYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KHVuZGVmaW5lZCk7XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBzdGVwRGF5OiBhbnkgPSB7fTtcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBzdGVwTW9udGg6IGFueSA9IHt9O1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIHN0ZXBZZWFyOiBhbnkgPSB7fTtcblxuICB1bmlxdWVJZDogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBtb2Rlczogc3RyaW5nW10gPSBbJ2RheScsICdtb250aCcsICd5ZWFyJ107XG4gIHByb3RlY3RlZCBkYXRlRm9ybWF0dGVyOiBEYXRlRm9ybWF0dGVyID0gbmV3IERhdGVGb3JtYXR0ZXIoKTtcbiAgcHJvdGVjdGVkIF9hY3RpdmVEYXRlOiBEYXRlO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWREYXRlOiBEYXRlO1xuICBwcm90ZWN0ZWQgYWN0aXZlRGF0ZUlkOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hWaWV3SGFuZGxlckRheTogRnVuY3Rpb247XG4gIHByb3RlY3RlZCBjb21wYXJlSGFuZGxlckRheTogRnVuY3Rpb247XG4gIHByb3RlY3RlZCByZWZyZXNoVmlld0hhbmRsZXJNb250aDogRnVuY3Rpb247XG4gIHByb3RlY3RlZCBjb21wYXJlSGFuZGxlck1vbnRoOiBGdW5jdGlvbjtcbiAgcHJvdGVjdGVkIHJlZnJlc2hWaWV3SGFuZGxlclllYXI6IEZ1bmN0aW9uO1xuICBwcm90ZWN0ZWQgY29tcGFyZUhhbmRsZXJZZWFyOiBGdW5jdGlvbjtcblxuICBASW5wdXQoKVxuICBnZXQgYWN0aXZlRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZTtcbiAgfVxuXG4gIHNldCBhY3RpdmVEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdG9kbzogYWRkIGZvcm1hdHRlciB2YWx1ZSB0byBEYXRlIG9iamVjdFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0b2RvOiB1c2UgZGF0ZSBmb3IgdW5pcXVlIHZhbHVlXG4gICAgdGhpcy51bmlxdWVJZCA9ICBgZGF0ZXBpY2tlci0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMCl9YDtcblxuICAgIGlmICh0aGlzLmluaXREYXRlKSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmluaXREYXRlO1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZURhdGUudmFsdWVPZigpKTtcbiAgICAgIHRoaXMudXBkYXRlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMucmVmcmVzaFZpZXcgc2hvdWxkIGJlIGNhbGxlZCBoZXJlIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMgb24gdGhlIGZseVxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLXZhcmlhYmxlXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgdGhpcy5jaGVja0lmQWN0aXZlRGF0ZUdvdFVwZGF0ZWQoY2hhbmdlcy5hY3RpdmVEYXRlKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGFjdGl2ZURhdGUgaGFzIGJlZW4gdXBkYXRlIGFuZCB0aGVuIGVtaXQgdGhlIGFjdGl2ZURhdGVDaGFuZ2Ugd2l0aCB0aGUgbmV3IGRhdGVcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkgKi9cbiAgY2hlY2tJZkFjdGl2ZURhdGVHb3RVcGRhdGVkKGFjdGl2ZURhdGU6IGFueSk6IHZvaWQge1xuICAgIGlmIChhY3RpdmVEYXRlICYmICFhY3RpdmVEYXRlLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gYWN0aXZlRGF0ZS5wcmV2aW91c1ZhbHVlO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1ZhbHVlICYmXG4gICAgICAgIHByZXZpb3VzVmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmXG4gICAgICAgIHByZXZpb3VzVmFsdWUuZ2V0VGltZSgpICE9PSBhY3RpdmVEYXRlLmN1cnJlbnRWYWx1ZS5nZXRUaW1lKClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldENvbXBhcmVIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLmNvbXBhcmVIYW5kbGVyTW9udGggPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyID0gaGFuZGxlcjtcbiAgICB9XG4gIH1cblxuICBjb21wYXJlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGRhdGUxID09PSB1bmRlZmluZWQgfHwgZGF0ZTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScgJiYgdGhpcy5jb21wYXJlSGFuZGxlckRheSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkoZGF0ZTEsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ21vbnRoJyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyTW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyTW9udGgoZGF0ZTEsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ3llYXInICYmIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlclllYXIoZGF0ZTEsIGRhdGUyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgc2V0UmVmcmVzaFZpZXdIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5ID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyID0gaGFuZGxlcjtcbiAgICB9XG4gIH1cblxuICByZWZyZXNoVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJEYXkpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSAneWVhcicgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyKSB7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3SGFuZGxlclllYXIoKTtcbiAgICB9XG4gIH1cblxuICBkYXRlRmlsdGVyKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRm9ybWF0dGVyLmZvcm1hdChkYXRlLCBmb3JtYXQsIHRoaXMubG9jYWxlKTtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgaXNBY3RpdmUoZGF0ZU9iamVjdDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29tcGFyZShkYXRlT2JqZWN0LmRhdGUsIHRoaXMuYWN0aXZlRGF0ZSkgPT09IDApIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZUlkID0gZGF0ZU9iamVjdC51aWQ7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgY3JlYXRlRGF0ZU9iamVjdChkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IGFueSB7XG4gICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICAgIGNvbnN0IGRhdGVPYmplY3Q6IGFueSA9IHt9O1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgZGF0ZS5nZXREYXRlKClcbiAgICApO1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IHRoaXMuZml4VGltZVpvbmUoZGF0ZU9iamVjdC5kYXRlKTtcbiAgICBkYXRlT2JqZWN0LmxhYmVsID0gdGhpcy5kYXRlRmlsdGVyKGRhdGUsIGZvcm1hdCk7XG4gICAgZGF0ZU9iamVjdC5zZWxlY3RlZCA9IHRoaXMuY29tcGFyZShkYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5kaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZChkYXRlKTtcbiAgICBkYXRlT2JqZWN0LmN1cnJlbnQgPSB0aGlzLmNvbXBhcmUoZGF0ZSwgbmV3IERhdGUoKSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5jdXN0b21DbGFzcyA9IHRoaXMuZ2V0Q3VzdG9tQ2xhc3NGb3JEYXRlKGRhdGVPYmplY3QuZGF0ZSk7XG5cbiAgICByZXR1cm4gZGF0ZU9iamVjdDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgc3BsaXQoYXJyOiBhbnlbXSwgc2l6ZTogbnVtYmVyKTogYW55W10ge1xuICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgICBjb25zdCBhcnJheXM6IGFueVtdID0gW107XG4gICAgd2hpbGUgKGFyci5sZW5ndGggPiAwKSB7XG4gICAgICBhcnJheXMucHVzaChhcnIuc3BsaWNlKDAsIHNpemUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXlzO1xuICB9XG5cbiAgLy8gRml4IGEgaGFyZC1yZXByb2R1Y2libGUgYnVnIHdpdGggdGltZXpvbmVzXG4gIC8vIFRoZSBidWcgZGVwZW5kcyBvbiBPUywgYnJvd3NlciwgY3VycmVudCB0aW1lem9uZSBhbmQgY3VycmVudCBkYXRlXG4gIC8vIGkuZS5cbiAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgyMDE0LCAwLCAxKTtcbiAgLy8gY29uc29sZS5sb2coZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpLFxuICAvLyBkYXRlLmdldEhvdXJzKCkpOyBjYW4gcmVzdWx0IGluIFwiMjAxMyAxMSAzMSAyM1wiIGJlY2F1c2Ugb2YgdGhlIGJ1Zy5cbiAgZml4VGltZVpvbmUoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuXG4gICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICBob3VycyA9PT0gMjMgPyBob3VycyArIDIgOiAwXG4gICAgKTtcbiAgfVxuXG4gIHNlbGVjdChkYXRlOiBEYXRlLCBpc01hbnVhbCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gdGhpcy5taW5Nb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuYWN0aXZlRGF0ZSkge1xuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSgwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUoXG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXRlLmdldERhdGUoKVxuICAgICAgKTtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuZml4VGltZVpvbmUodGhpcy5hY3RpdmVEYXRlKTtcbiAgICAgIGlmIChpc01hbnVhbCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkRvbmUuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgIGRhdGUuZ2V0RGF0ZSgpXG4gICAgICApO1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5maXhUaW1lWm9uZSh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgaWYgKGlzTWFudWFsKSB7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlck1vZGUgPSB0aGlzLm1vZGVzW1xuICAgICAgICAgIHRoaXMubW9kZXMuaW5kZXhPZih0aGlzLmRhdGVwaWNrZXJNb2RlKSAtIDFcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS52YWx1ZU9mKCkpO1xuICAgIHRoaXMudXBkYXRlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBtb3ZlKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICAgIGxldCBleHBlY3RlZFN0ZXA6IGFueTtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgIGV4cGVjdGVkU3RlcCA9IHRoaXMuc3RlcERheTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgZXhwZWN0ZWRTdGVwID0gdGhpcy5zdGVwTW9udGg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICd5ZWFyJykge1xuICAgICAgZXhwZWN0ZWRTdGVwID0gdGhpcy5zdGVwWWVhcjtcbiAgICB9XG5cbiAgICBpZiAoZXhwZWN0ZWRTdGVwKSB7XG4gICAgICBjb25zdCB5ZWFyID1cbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkgKyBkaXJlY3Rpb24gKiAoZXhwZWN0ZWRTdGVwLnllYXJzIHx8IDApO1xuICAgICAgY29uc3QgbW9udGggPVxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSArIGRpcmVjdGlvbiAqIChleHBlY3RlZFN0ZXAubW9udGhzIHx8IDApO1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuXG4gICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICB0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZU1vZGUoX2RpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gX2RpcmVjdGlvbiB8fCAxO1xuXG4gICAgaWYgKFxuICAgICAgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09IHRoaXMubWF4TW9kZSAmJiBkaXJlY3Rpb24gPT09IDEpIHx8XG4gICAgICAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gdGhpcy5taW5Nb2RlICYmIGRpcmVjdGlvbiA9PT0gLTEpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRlcGlja2VyTW9kZSA9IHRoaXMubW9kZXNbXG4gICAgICB0aGlzLm1vZGVzLmluZGV4T2YodGhpcy5kYXRlcGlja2VyTW9kZSkgKyBkaXJlY3Rpb25cbiAgICBdO1xuICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDdXN0b21DbGFzc0ZvckRhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmN1c3RvbUNsYXNzKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIC8vIHRvZG86IGJ1aWxkIGEgaGFzaCBvZiBjdXN0b20gY2xhc3NlcywgaXQgd2lsbCB3b3JrIGZhc3RlclxuICAgIGNvbnN0IGN1c3RvbUNsYXNzT2JqZWN0OiB7XG4gICAgICBkYXRlOiBEYXRlO1xuICAgICAgbW9kZTogc3RyaW5nO1xuICAgICAgY2xheno6IHN0cmluZztcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSAqL1xuICAgIH0gPSB0aGlzLmN1c3RvbUNsYXNzLmZpbmQoKGN1c3RvbUNsYXNzOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGN1c3RvbUNsYXNzLmRhdGUudmFsdWVPZigpID09PSBkYXRlLnZhbHVlT2YoKSAmJlxuICAgICAgICBjdXN0b21DbGFzcy5tb2RlID09PSB0aGlzLmRhdGVwaWNrZXJNb2RlXG4gICAgICApO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIGN1c3RvbUNsYXNzT2JqZWN0ID09PSB1bmRlZmluZWQgPyAnJyA6IGN1c3RvbUNsYXNzT2JqZWN0LmNsYXp6O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbXBhcmVEYXRlRGlzYWJsZWQoXG4gICAgZGF0ZTFEaXNhYmxlZDogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmcgfSxcbiAgICBkYXRlMjogRGF0ZVxuICApOiBudW1iZXIge1xuICAgIGlmIChkYXRlMURpc2FibGVkID09PSB1bmRlZmluZWQgfHwgZGF0ZTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZTFEaXNhYmxlZC5tb2RlID09PSAnZGF5JyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyRGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlckRheShkYXRlMURpc2FibGVkLmRhdGUsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZTFEaXNhYmxlZC5tb2RlID09PSAnbW9udGgnICYmIHRoaXMuY29tcGFyZUhhbmRsZXJNb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJNb250aChkYXRlMURpc2FibGVkLmRhdGUsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZTFEaXNhYmxlZC5tb2RlID09PSAneWVhcicgJiYgdGhpcy5jb21wYXJlSGFuZGxlclllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyWWVhcihkYXRlMURpc2FibGVkLmRhdGUsIGRhdGUyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc0RhdGVEaXNhYmxlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmRhdGVEaXNhYmxlZCkge1xuICAgICAgdGhpcy5kYXRlRGlzYWJsZWQuZm9yRWFjaChcbiAgICAgICAgKGRpc2FibGVkRGF0ZTogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmVEYXRlRGlzYWJsZWQoZGlzYWJsZWREYXRlLCBkYXRlKSA9PT0gMCkge1xuICAgICAgICAgICAgaXNEYXRlRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXlEaXNhYmxlZCkge1xuICAgICAgaXNEYXRlRGlzYWJsZWQgPVxuICAgICAgICBpc0RhdGVEaXNhYmxlZCB8fFxuICAgICAgICB0aGlzLmRheURpc2FibGVkLmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgaXNEYXRlRGlzYWJsZWQgfHxcbiAgICAgICh0aGlzLm1pbkRhdGUgJiYgdGhpcy5jb21wYXJlKGRhdGUsIHRoaXMubWluRGF0ZSkgPCAwKSB8fFxuICAgICAgKHRoaXMubWF4RGF0ZSAmJiB0aGlzLmNvbXBhcmUoZGF0ZSwgdGhpcy5tYXhEYXRlKSA+IDApXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbmZpZyB7XG4gIGxvY2FsZSA9ICdlbic7XG4gIGRhdGVwaWNrZXJNb2RlID0gJ2RheSc7XG4gIHN0YXJ0aW5nRGF5ID0gMDtcbiAgeWVhclJhbmdlID0gMjA7XG4gIG1pbk1vZGUgPSAnZGF5JztcbiAgbWF4TW9kZSA9ICd5ZWFyJztcbiAgc2hvd1dlZWtzID0gdHJ1ZTtcbiAgZm9ybWF0RGF5ID0gJ0REJztcbiAgZm9ybWF0TW9udGggPSAnTU1NTSc7XG4gIGZvcm1hdFllYXIgPSAnWVlZWSc7XG4gIGZvcm1hdERheUhlYWRlciA9ICdkZCc7XG4gIGZvcm1hdERheVRpdGxlID0gJ01NTU0gWVlZWSc7XG4gIGZvcm1hdE1vbnRoVGl0bGUgPSAnWVlZWSc7XG4gIG9ubHlDdXJyZW50TW9udGggPSBmYWxzZTtcbiAgbW9udGhDb2xMaW1pdCA9IDM7XG4gIHllYXJDb2xMaW1pdCA9IDU7XG4gIHNob3J0Y3V0UHJvcGFnYXRpb24gPSBmYWxzZTtcbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBQcm92aWRlcixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbmZpZyc7XG5cbmV4cG9ydCBjb25zdCBEQVRFUElDS0VSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmUgKi9cbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpjb21wb25lbnQtc2VsZWN0b3ItbmFtZSBjb21wb25lbnQtc2VsZWN0b3ItdHlwZSAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0ZXBpY2tlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRhdGVwaWNrZXItaW5uZXIgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSk9XCJvblVwZGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbmZpZy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkYXRlcGlja2VyTW9kZV09XCJkYXRlcGlja2VyTW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2luaXREYXRlXT1cImluaXREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWluTW9kZV09XCJtaW5Nb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4TW9kZV09XCJtYXhNb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1dlZWtzXT1cInNob3dXZWVrc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdERheV09XCJmb3JtYXREYXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRNb250aF09XCJmb3JtYXRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdFllYXJdPVwiZm9ybWF0WWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdERheUhlYWRlcl09XCJmb3JtYXREYXlIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXREYXlUaXRsZV09XCJmb3JtYXREYXlUaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdE1vbnRoVGl0bGVdPVwiZm9ybWF0TW9udGhUaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0aW5nRGF5XT1cInN0YXJ0aW5nRGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbeWVhclJhbmdlXT1cInllYXJSYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cImN1c3RvbUNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGF0ZURpc2FibGVkXT1cImRhdGVEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RheURpc2FibGVkXT1cImRheURpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb25seUN1cnJlbnRNb250aF09XCJvbmx5Q3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvcnRjdXRQcm9wYWdhdGlvbl09XCJzaG9ydGN1dFByb3BhZ2F0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbW9udGhDb2xMaW1pdF09XCJtb250aENvbExpbWl0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbeWVhckNvbExpbWl0XT1cInllYXJDb2xMaW1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkRvbmUpPVwib25TZWxlY3Rpb25Eb25lKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmVEYXRlQ2hhbmdlKT1cIm9uQWN0aXZlRGF0ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8ZGF5cGlja2VyIHRhYmluZGV4PVwiMFwiPjwvZGF5cGlja2VyPlxuICAgICAgPG1vbnRocGlja2VyIHRhYmluZGV4PVwiMFwiPjwvbW9udGhwaWNrZXI+XG4gICAgICA8eWVhcnBpY2tlciB0YWJpbmRleD1cIjBcIj48L3llYXJwaWNrZXI+XG4gICAgPC9kYXRlcGlja2VyLWlubmVyPlxuICAgIGAsXG4gIHByb3ZpZGVyczogW0RBVEVQSUNLRVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG4vKiB0c2xpbnQ6ZW5hYmxlOmNvbXBvbmVudC1zZWxlY3Rvci1uYW1lIGNvbXBvbmVudC1zZWxlY3Rvci10eXBlICovXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgLyoqIHNldHMgZGF0ZXBpY2tlciBtb2RlLCBzdXBwb3J0czogYGRheWAsIGBtb250aGAsIGB5ZWFyYCAqL1xuICBASW5wdXQoKSBkYXRlcGlja2VyTW9kZSA9ICdkYXknO1xuICAvKiogZGVmYXVsdCBkYXRlIHRvIHNob3cgaWYgYG5nLW1vZGVsYCB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkICovXG4gIEBJbnB1dCgpIGluaXREYXRlOiBEYXRlO1xuICAvKiogIG9sZGVzdCBzZWxlY3RhYmxlIGRhdGUgKi9cbiAgQElucHV0KCkgbWluRGF0ZTogRGF0ZTtcbiAgLyoqIGxhdGVzdCBzZWxlY3RhYmxlIGRhdGUgKi9cbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcbiAgLyoqIHNldCBsb3dlciBkYXRlcGlja2VyIG1vZGUsIHN1cHBvcnRzOiBgZGF5YCwgYG1vbnRoYCwgYHllYXJgICovXG4gIEBJbnB1dCgpIG1pbk1vZGU6IHN0cmluZztcbiAgLyoqIHNldHMgdXBwZXIgZGF0ZXBpY2tlciBtb2RlLCBzdXBwb3J0czogYGRheWAsIGBtb250aGAsIGB5ZWFyYCAqL1xuICBASW5wdXQoKSBtYXhNb2RlOiBzdHJpbmc7XG4gIC8qKiBpZiBmYWxzZSB3ZWVrIG51bWJlcnMgd2lsbCBiZSBoaWRkZW4gKi9cbiAgQElucHV0KCkgc2hvd1dlZWtzID0gdHJ1ZTtcbiAgLyoqIGZvcm1hdCBvZiBkYXkgaW4gbW9udGggKi9cbiAgQElucHV0KCkgZm9ybWF0RGF5OiBzdHJpbmc7XG4gIC8qKiBmb3JtYXQgb2YgbW9udGggaW4geWVhciAqL1xuICBASW5wdXQoKSBmb3JtYXRNb250aDogc3RyaW5nO1xuICAvKiogZm9ybWF0IG9mIHllYXIgaW4geWVhciByYW5nZSAqL1xuICBASW5wdXQoKSBmb3JtYXRZZWFyOiBzdHJpbmc7XG4gIC8qKiBmb3JtYXQgb2YgZGF5IGluIHdlZWsgaGVhZGVyICovXG4gIEBJbnB1dCgpIGZvcm1hdERheUhlYWRlcjogc3RyaW5nO1xuICAvKiogZm9ybWF0IG9mIHRpdGxlIHdoZW4gc2VsZWN0aW5nIGRheSAqL1xuICBASW5wdXQoKSBmb3JtYXREYXlUaXRsZTogc3RyaW5nO1xuICAvKiogZm9ybWF0IG9mIHRpdGxlIHdoZW4gc2VsZWN0aW5nIG1vbnRoICovXG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoVGl0bGU6IHN0cmluZztcbiAgLyoqIHN0YXJ0aW5nIGRheSBvZiB0aGUgd2VlayBmcm9tIDAtNiAoMD1TdW5kYXksIC4uLiwgNj1TYXR1cmRheSkgKi9cbiAgQElucHV0KCkgc3RhcnRpbmdEYXk6IG51bWJlcjtcbiAgLyoqIG51bWJlciBvZiB5ZWFycyBkaXNwbGF5ZWQgaW4geWVhciBzZWxlY3Rpb24gKi9cbiAgQElucHV0KCkgeWVhclJhbmdlOiBudW1iZXI7XG4gIC8qKiBpZiB0cnVlIG9ubHkgZGF0ZXMgZnJvbSB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBtb250aCB3aWxsIGJlIHNob3duICovXG4gIEBJbnB1dCgpIG9ubHlDdXJyZW50TW9udGg6IGJvb2xlYW47XG4gIC8qKiBpZiB0cnVlIHNob3J0Y3V0YHMgZXZlbnQgcHJvcGFnYXRpb24gd2lsbCBiZSBkaXNhYmxlZCAqL1xuICBASW5wdXQoKSBzaG9ydGN1dFByb3BhZ2F0aW9uOiBib29sZWFuO1xuICAvKiogbnVtYmVyIG9mIG1vbnRocyBkaXNwbGF5ZWQgaW4gYSBzaW5nbGUgcm93IG9mIG1vbnRoIHBpY2tlciAqL1xuICBASW5wdXQoKSBtb250aENvbExpbWl0OiBudW1iZXI7XG4gIC8qKiBudW1iZXIgb2YgeWVhcnMgZGlzcGxheWVkIGluIGEgc2luZ2xlIHJvdyBvZiB5ZWFyIHBpY2tlciAqL1xuICBASW5wdXQoKSB5ZWFyQ29sTGltaXQ6IG51bWJlcjtcbiAgLyoqIGFycmF5IG9mIGN1c3RvbSBjc3MgY2xhc3NlcyB0byBiZSBhcHBsaWVkIHRvIHRhcmdldGVkIGRhdGVzICovXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZzsgY2xheno6IHN0cmluZyB9W107XG4gIC8qKiBhcnJheSBvZiBkaXNhYmxlZCBkYXRlcyAqL1xuICBASW5wdXQoKSBkYXRlRGlzYWJsZWQ6IHsgZGF0ZTogRGF0ZTsgbW9kZTogc3RyaW5nIH1bXTtcbiAgLyoqIGRpc2FibGVkIGRheXMgb2YgdGhlIHdlZWsgZnJvbSAwLTYgKDA9U3VuZGF5LCAuLi4sIDY9U2F0dXJkYXkpICovXG4gIEBJbnB1dCgpIGRheURpc2FibGVkOiBudW1iZXJbXTtcblxuICAvKiogY3VycmVudGx5IGFjdGl2ZSBkYXRlICovXG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVEYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlIHx8IHRoaXMuX25vdztcbiAgfVxuXG4gIHNldCBhY3RpdmVEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIHNlbGVjdGlvbkRvbmU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4odW5kZWZpbmVkKTtcblxuICAvKiogY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIGFjdGl2ZURhdGUgaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpXG4gIGFjdGl2ZURhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG5cbiAgQFZpZXdDaGlsZChEYXRlUGlja2VySW5uZXJDb21wb25lbnQpXG4gIF9kYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQ7XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBvbkNoYW5nZTogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIG9uVG91Y2hlZDogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4gIGNvbmZpZzogRGF0ZXBpY2tlckNvbmZpZztcblxuICBwcm90ZWN0ZWQgX25vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHByb3RlY3RlZCBfYWN0aXZlRGF0ZTogRGF0ZTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IERhdGVwaWNrZXJDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmNvbmZpZ3VyZU9wdGlvbnMoKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZU9wdGlvbnMoKTogdm9pZCB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBvblVwZGF0ZShldmVudDogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlRGF0ZSA9IGV2ZW50O1xuICAgIHRoaXMub25DaGFuZ2UoZXZlbnQpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25Eb25lKGV2ZW50OiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Eb25lLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25BY3RpdmVEYXRlQ2hhbmdlKGV2ZW50OiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVEYXRlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG4gIC8vIHRvZG86IHN1cHBvcnQgbnVsbCB2YWx1ZVxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kYXRlUGlja2VyLmNvbXBhcmUodmFsdWUsIHRoaXMuX2FjdGl2ZURhdGUpID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5fZGF0ZVBpY2tlci5zZWxlY3QodmFsdWUsIGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHZhbHVlID8gbmV3IERhdGUodmFsdWUpIDogdm9pZCAwO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxufVxuIiwiLy8gQGRlcHJlY2F0ZWRcbi8vIHRzbGludDpkaXNhYmxlXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNCczMgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3V0aWxzJztcbmltcG9ydCB7IERhdGVQaWNrZXJJbm5lckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci1pbm5lci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXlwaWNrZXInLFxuICB0ZW1wbGF0ZTogYFxuPHRhYmxlICpuZ0lmPVwiZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheSdcIiByb2xlPVwiZ3JpZFwiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJkYXRlUGlja2VyLnVuaXF1ZUlkICsgJy10aXRsZSdcIiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9XCJhY3RpdmVEYXRlSWRcIj5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc0JzNFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeSBidG4tc20gcHVsbC1sZWZ0IGZsb2F0LWxlZnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoLTEpXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+w6LCgMK5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJpc0JzNFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeSBidG4tc20gcHVsbC1sZWZ0IGZsb2F0LWxlZnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoLTEpXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+Jmx0OzwvYnV0dG9uPlxuICAgICAgPC90aD5cbiAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cIjUgKyAoZGF0ZVBpY2tlci5zaG93V2Vla3MgPyAxIDogMClcIj5cbiAgICAgICAgPGJ1dHRvbiBbaWRdPVwiZGF0ZVBpY2tlci51bmlxdWVJZCArICctdGl0bGUnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnRvZ2dsZU1vZGUoMClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlID09PSBkYXRlUGlja2VyLm1heE1vZGVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gZGF0ZVBpY2tlci5tYXhNb2RlfVwiIHRhYmluZGV4PVwiLTFcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICAgICAgPHN0cm9uZz57eyB0aXRsZSB9fTwvc3Ryb25nPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgICA8dGg+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNCczRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnkgYnRuLXNtIHB1bGwtcmlnaHQgZmxvYXQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoMSlcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj7DosKAwro8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzQnM0XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5IGJ0bi1zbSBwdWxsLXJpZ2h0IGZsb2F0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKDEpXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+Jmd0O1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgPC90cj5cbiAgICA8dHI+XG4gICAgICA8dGggKm5nSWY9XCJkYXRlUGlja2VyLnNob3dXZWVrc1wiPjwvdGg+XG4gICAgICA8dGggKm5nRm9yPVwibGV0IGxhYmVseiBvZiBsYWJlbHNcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIDxzbWFsbCBhcmlhLWxhYmVsPVwibGFiZWx6LmZ1bGxcIj48Yj57eyBsYWJlbHouYWJiciB9fTwvYj48L3NtYWxsPlxuICAgICAgPC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHk+XG4gICAgPG5nLXRlbXBsYXRlIG5nRm9yIFtuZ0Zvck9mXT1cInJvd3NcIiBsZXQtcm93ej1cIiRpbXBsaWNpdFwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gICAgICA8dHIgKm5nSWY9XCIhKGRhdGVQaWNrZXIub25seUN1cnJlbnRNb250aCAmJiByb3d6WzBdLnNlY29uZGFyeSAmJiByb3d6WzZdLnNlY29uZGFyeSlcIj5cbiAgICAgICAgPHRkICpuZ0lmPVwiZGF0ZVBpY2tlci5zaG93V2Vla3NcIiBjbGFzcz1cImg2XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxlbT57eyB3ZWVrTnVtYmVyc1tpbmRleF0gfX08L2VtPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGR0eiBvZiByb3d6XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiIHJvbGU9XCJncmlkY2VsbFwiIFtpZF09XCJkdHoudWlkXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6MTAwJTtcIiBjbGFzcz1cImJ0biBidG4tc20ge3tkdHouY3VzdG9tQ2xhc3N9fVwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoZGF0ZVBpY2tlci5vbmx5Q3VycmVudE1vbnRoICYmIGR0ei5zZWNvbmRhcnkpXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYnRuLXNlY29uZGFyeSc6IGlzQnM0ICYmICFkdHouc2VsZWN0ZWQgJiYgIWRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KSwgJ2J0bi1pbmZvJzogZHR6LnNlbGVjdGVkLCBkaXNhYmxlZDogZHR6LmRpc2FibGVkLCBhY3RpdmU6ICFpc0JzNCAmJiBkYXRlUGlja2VyLmlzQWN0aXZlKGR0eiksICdidG4tZGVmYXVsdCc6ICFpc0JzNH1cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImR0ei5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5zZWxlY3QoZHR6LmRhdGUpXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyd0ZXh0LW11dGVkJzogZHR6LnNlY29uZGFyeSB8fCBkdHouY3VycmVudCwgJ3RleHQtaW5mbyc6ICFpc0JzNCAmJiBkdHouY3VycmVudH1cIj57eyBkdHoubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgOmhvc3QgLmJ0bi1zZWNvbmRhcnkge1xuICAgICAgY29sb3I6ICMyOTJiMmM7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjY2NjO1xuICAgIH1cbiAgICA6aG9zdCAuYnRuLWluZm8gLnRleHQtbXV0ZWQge1xuICAgICAgY29sb3I6ICMyOTJiMmMgIWltcG9ydGFudDtcbiAgICB9XG4gIGBcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXlQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBsYWJlbHM6IGFueVtdID0gW107XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHJvd3M6IGFueVtdID0gW107XG4gIHdlZWtOdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xuICBkYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoZGF0ZVBpY2tlcjogRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXRlUGlja2VyID0gZGF0ZVBpY2tlcjtcbiAgfVxuXG4gIGdldCBpc0JzNCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzQnMzKCk7XG4gIH1cblxuICAvKnByb3RlY3RlZCBnZXREYXlzSW5Nb250aCh5ZWFyOm51bWJlciwgbW9udGg6bnVtYmVyKSB7XG4gICByZXR1cm4gKChtb250aCA9PT0gMSkgJiYgKHllYXIgJSA0ID09PSAwKSAmJlxuICAgKCh5ZWFyICUgMTAwICE9PSAwKSB8fCAoeWVhciAlIDQwMCA9PT0gMCkpKSA/IDI5IDogREFZU19JTl9NT05USFttb250aF07XG4gICB9Ki9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIuc3RlcERheSA9IHsgbW9udGhzOiAxIH07XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIuc2V0UmVmcmVzaFZpZXdIYW5kbGVyKGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgbW9udGggPSB0aGlzLmFjdGl2ZURhdGUuZ2V0TW9udGgoKTtcbiAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB0aGlzLnN0YXJ0aW5nRGF5IC0gZmlyc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgICAgY29uc3QgbnVtRGlzcGxheWVkRnJvbVByZXZpb3VzTW9udGggPVxuICAgICAgICBkaWZmZXJlbmNlID4gMCA/IDcgLSBkaWZmZXJlbmNlIDogLWRpZmZlcmVuY2U7XG4gICAgICBjb25zdCBmaXJzdERhdGUgPSBuZXcgRGF0ZShmaXJzdERheU9mTW9udGguZ2V0VGltZSgpKTtcblxuICAgICAgaWYgKG51bURpc3BsYXllZEZyb21QcmV2aW91c01vbnRoID4gMCkge1xuICAgICAgICBmaXJzdERhdGUuc2V0RGF0ZSgtbnVtRGlzcGxheWVkRnJvbVByZXZpb3VzTW9udGggKyAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gNDIgaXMgdGhlIG51bWJlciBvZiBkYXlzIG9uIGEgc2l4LXdlZWsgY2FsZW5kYXJcbiAgICAgIGNvbnN0IF9kYXlzOiBEYXRlW10gPSBzZWxmLmdldERhdGVzKGZpcnN0RGF0ZSwgNDIpO1xuICAgICAgY29uc3QgZGF5czogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDI7IGkrKykge1xuICAgICAgICBjb25zdCBfZGF0ZU9iamVjdCA9IHRoaXMuY3JlYXRlRGF0ZU9iamVjdChfZGF5c1tpXSwgdGhpcy5mb3JtYXREYXkpO1xuICAgICAgICBfZGF0ZU9iamVjdC5zZWNvbmRhcnkgPSBfZGF5c1tpXS5nZXRNb250aCgpICE9PSBtb250aDtcbiAgICAgICAgX2RhdGVPYmplY3QudWlkID0gdGhpcy51bmlxdWVJZCArICctJyArIGk7XG4gICAgICAgIGRheXNbaV0gPSBfZGF0ZU9iamVjdDtcbiAgICAgIH1cblxuICAgICAgc2VsZi5sYWJlbHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgIHNlbGYubGFiZWxzW2pdID0ge307XG4gICAgICAgIHNlbGYubGFiZWxzW2pdLmFiYnIgPSB0aGlzLmRhdGVGaWx0ZXIoXG4gICAgICAgICAgZGF5c1tqXS5kYXRlLFxuICAgICAgICAgIHRoaXMuZm9ybWF0RGF5SGVhZGVyXG4gICAgICAgICk7XG4gICAgICAgIHNlbGYubGFiZWxzW2pdLmZ1bGwgPSB0aGlzLmRhdGVGaWx0ZXIoZGF5c1tqXS5kYXRlLCAnRUVFRScpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnRpdGxlID0gdGhpcy5kYXRlRmlsdGVyKHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5mb3JtYXREYXlUaXRsZSk7XG4gICAgICBzZWxmLnJvd3MgPSB0aGlzLnNwbGl0KGRheXMsIDcpO1xuXG4gICAgICBpZiAodGhpcy5zaG93V2Vla3MpIHtcbiAgICAgICAgc2VsZi53ZWVrTnVtYmVycyA9IFtdO1xuICAgICAgICBjb25zdCB0aHVyc2RheUluZGV4ID0gKDQgKyA3IC0gdGhpcy5zdGFydGluZ0RheSkgJSA3O1xuICAgICAgICBjb25zdCBudW1XZWVrcyA9IHNlbGYucm93cy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGN1cldlZWsgPSAwOyBjdXJXZWVrIDwgbnVtV2Vla3M7IGN1cldlZWsrKykge1xuICAgICAgICAgIHNlbGYud2Vla051bWJlcnMucHVzaChcbiAgICAgICAgICAgIHNlbGYuZ2V0SVNPODYwMVdlZWtOdW1iZXIoc2VsZi5yb3dzW2N1cldlZWtdW3RodXJzZGF5SW5kZXhdLmRhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sICdkYXknKTtcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5zZXRDb21wYXJlSGFuZGxlcihmdW5jdGlvbihcbiAgICAgIGRhdGUxOiBEYXRlLFxuICAgICAgZGF0ZTI6IERhdGVcbiAgICApOiBudW1iZXIge1xuICAgICAgY29uc3QgZDEgPSBuZXcgRGF0ZShkYXRlMS5nZXRGdWxsWWVhcigpLCBkYXRlMS5nZXRNb250aCgpLCBkYXRlMS5nZXREYXRlKCkpO1xuICAgICAgY29uc3QgZDIgPSBuZXcgRGF0ZShkYXRlMi5nZXRGdWxsWWVhcigpLCBkYXRlMi5nZXRNb250aCgpLCBkYXRlMi5nZXREYXRlKCkpO1xuICAgICAgcmV0dXJuIGQxLmdldFRpbWUoKSAtIGQyLmdldFRpbWUoKTtcbiAgICB9LCAnZGF5Jyk7XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIucmVmcmVzaFZpZXcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREYXRlcyhzdGFydERhdGU6IERhdGUsIG46IG51bWJlcik6IERhdGVbXSB7XG4gICAgY29uc3QgZGF0ZXM6IERhdGVbXSA9IG5ldyBBcnJheShuKTtcbiAgICBsZXQgY3VycmVudCA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRUaW1lKCkpO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgZGF0ZTogRGF0ZTtcbiAgICB3aGlsZSAoaSA8IG4pIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShjdXJyZW50LmdldFRpbWUoKSk7XG4gICAgICBkYXRlID0gdGhpcy5kYXRlUGlja2VyLmZpeFRpbWVab25lKGRhdGUpO1xuICAgICAgZGF0ZXNbaSsrXSA9IGRhdGU7XG4gICAgICBjdXJyZW50ID0gbmV3IERhdGUoXG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXRlLmdldERhdGUoKSArIDFcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJU084NjAxV2Vla051bWJlcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICBjb25zdCBjaGVja0RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7XG4gICAgLy8gVGh1cnNkYXlcbiAgICBjaGVja0RhdGUuc2V0RGF0ZShjaGVja0RhdGUuZ2V0RGF0ZSgpICsgNCAtIChjaGVja0RhdGUuZ2V0RGF5KCkgfHwgNykpO1xuICAgIGNvbnN0IHRpbWUgPSBjaGVja0RhdGUuZ2V0VGltZSgpO1xuICAgIC8vIENvbXBhcmUgd2l0aCBKYW4gMVxuICAgIGNoZWNrRGF0ZS5zZXRNb250aCgwKTtcbiAgICBjaGVja0RhdGUuc2V0RGF0ZSgxKTtcbiAgICByZXR1cm4gKFxuICAgICAgTWF0aC5mbG9vcihNYXRoLnJvdW5kKCh0aW1lIC0gY2hlY2tEYXRlLmdldFRpbWUoKSkgLyA4NjQwMDAwMCkgLyA3KSArIDFcbiAgICApO1xuICB9XG5cbiAgLy8gdG9kbzoga2V5IGV2ZW50cyBpbXBsZW1lbnRhdGlvblxufVxuIiwiLy8gQGRlcHJlY2F0ZWRcbi8vIHRzbGludDpkaXNhYmxlXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBpc0JzMyB9IGZyb20gJ25neC1ib290c3RyYXAvdXRpbHMnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21vbnRocGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbjx0YWJsZSAqbmdJZj1cImRhdGVQaWNrZXIuZGF0ZXBpY2tlck1vZGU9PT0nbW9udGgnXCIgcm9sZT1cImdyaWRcIj5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtbGVmdCBmbG9hdC1sZWZ0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKC0xKVwiIHRhYmluZGV4PVwiLTFcIj7DosKAwrk8L2J1dHRvbj48L3RoPlxuICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwiKChkYXRlUGlja2VyLm1vbnRoQ29sTGltaXQgLSAyKSA8PSAwKSA/IDEgOiBkYXRlUGlja2VyLm1vbnRoQ29sTGltaXQgLSAyXCI+XG4gICAgICAgIDxidXR0b24gW2lkXT1cImRhdGVQaWNrZXIudW5pcXVlSWQgKyAnLXRpdGxlJ1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVQaWNrZXIudG9nZ2xlTW9kZSgwKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRhdGVQaWNrZXIuZGF0ZXBpY2tlck1vZGUgPT09IG1heE1vZGVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gbWF4TW9kZX1cIiB0YWJpbmRleD1cIi0xXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGl0bGUgfX08L3N0cm9uZz4gXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC90aD5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtcmlnaHQgZmxvYXQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoMSlcIiB0YWJpbmRleD1cIi0xXCI+w6LCgMK6PC9idXR0b24+XG4gICAgICA8L3RoPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keT5cbiAgICA8dHIgKm5nRm9yPVwibGV0IHJvd3ogb2Ygcm93c1wiPlxuICAgICAgPHRkICpuZ0Zvcj1cImxldCBkdHogb2Ygcm93elwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIiByb2xlPVwiZ3JpZGNlbGxcIiBbYXR0ci5pZF09XCJkdHoudWlkXCIgW25nQ2xhc3NdPVwiZHR6LmN1c3RvbUNsYXNzXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwibWluLXdpZHRoOjEwMCU7XCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYnRuLWxpbmsnOiBpc0JzNCAmJiAhZHR6LnNlbGVjdGVkICYmICFkYXRlUGlja2VyLmlzQWN0aXZlKGR0eiksICdidG4taW5mbyc6IGR0ei5zZWxlY3RlZCB8fCAoaXNCczQgJiYgIWR0ei5zZWxlY3RlZCAmJiBkYXRlUGlja2VyLmlzQWN0aXZlKGR0eikpLCBkaXNhYmxlZDogZHR6LmRpc2FibGVkLCBhY3RpdmU6ICFpc0JzNCAmJiBkYXRlUGlja2VyLmlzQWN0aXZlKGR0eil9XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZHR6LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5zZWxlY3QoZHR6LmRhdGUpXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsndGV4dC1zdWNjZXNzJzogaXNCczQgJiYgZHR6LmN1cnJlbnQsICd0ZXh0LWluZm8nOiAhaXNCczQgJiYgZHR6LmN1cnJlbnR9XCI+e3sgZHR6LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICA6aG9zdCAuYnRuLWluZm8gLnRleHQtc3VjY2VzcyB7XG4gICAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICAgIH1cbiAgYFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1vbnRoUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdGl0bGU6IHN0cmluZztcbiAgcm93czogYW55W10gPSBbXTtcbiAgZGF0ZVBpY2tlcjogRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50O1xuICBtYXhNb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0ZVBpY2tlcjogRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXRlUGlja2VyID0gZGF0ZVBpY2tlcjtcbiAgfVxuXG4gIGdldCBpc0JzNCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzQnMzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5zdGVwTW9udGggPSB7IHllYXJzOiAxIH07XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIuc2V0UmVmcmVzaFZpZXdIYW5kbGVyKGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgbW9udGhzOiBhbnlbXSA9IG5ldyBBcnJheSgxMik7XG4gICAgICBjb25zdCB5ZWFyOiBudW1iZXIgPSB0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGxldCBkYXRlOiBEYXRlO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIGksIDEpO1xuICAgICAgICBkYXRlID0gdGhpcy5maXhUaW1lWm9uZShkYXRlKTtcbiAgICAgICAgbW9udGhzW2ldID0gdGhpcy5jcmVhdGVEYXRlT2JqZWN0KGRhdGUsIHRoaXMuZm9ybWF0TW9udGgpO1xuICAgICAgICBtb250aHNbaV0udWlkID0gdGhpcy51bmlxdWVJZCArICctJyArIGk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYudGl0bGUgPSB0aGlzLmRhdGVGaWx0ZXIodGhpcy5hY3RpdmVEYXRlLCB0aGlzLmZvcm1hdE1vbnRoVGl0bGUpO1xuICAgICAgc2VsZi5yb3dzID0gdGhpcy5zcGxpdChtb250aHMsIHNlbGYuZGF0ZVBpY2tlci5tb250aENvbExpbWl0KTtcbiAgICB9LCAnbW9udGgnKTtcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5zZXRDb21wYXJlSGFuZGxlcihmdW5jdGlvbihcbiAgICAgIGRhdGUxOiBEYXRlLFxuICAgICAgZGF0ZTI6IERhdGVcbiAgICApOiBudW1iZXIge1xuICAgICAgY29uc3QgZDEgPSBuZXcgRGF0ZShkYXRlMS5nZXRGdWxsWWVhcigpLCBkYXRlMS5nZXRNb250aCgpKTtcbiAgICAgIGNvbnN0IGQyID0gbmV3IERhdGUoZGF0ZTIuZ2V0RnVsbFllYXIoKSwgZGF0ZTIuZ2V0TW9udGgoKSk7XG4gICAgICByZXR1cm4gZDEuZ2V0VGltZSgpIC0gZDIuZ2V0VGltZSgpO1xuICAgIH0sICdtb250aCcpO1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICAvLyB0b2RvOiBrZXkgZXZlbnRzIGltcGxlbWVudGF0aW9uXG59XG4iLCIvLyBAZGVwcmVjYXRlZFxuLy8gdHNsaW50OmRpc2FibGVcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGlzQnMzIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC91dGlscyc7XG5pbXBvcnQgeyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXItaW5uZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneWVhcnBpY2tlcicsXG4gIHRlbXBsYXRlOiBgXG48dGFibGUgKm5nSWY9XCJkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlPT09J3llYXInXCIgcm9sZT1cImdyaWRcIj5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtbGVmdCBmbG9hdC1sZWZ0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKC0xKVwiIHRhYmluZGV4PVwiLTFcIj7DosKAwrk8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgICA8dGggW2F0dHIuY29sc3Bhbl09XCIoKGRhdGVQaWNrZXIueWVhckNvbExpbWl0IC0gMikgPD0gMCkgPyAxIDogZGF0ZVBpY2tlci55ZWFyQ29sTGltaXQgLSAyXCI+XG4gICAgICAgIDxidXR0b24gW2lkXT1cImRhdGVQaWNrZXIudW5pcXVlSWQgKyAnLXRpdGxlJ1wiIHJvbGU9XCJoZWFkaW5nXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci50b2dnbGVNb2RlKDApXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gZGF0ZVBpY2tlci5tYXhNb2RlXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6IGRhdGVQaWNrZXIuZGF0ZXBpY2tlck1vZGUgPT09IGRhdGVQaWNrZXIubWF4TW9kZX1cIiB0YWJpbmRleD1cIi0xXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGl0bGUgfX08L3N0cm9uZz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L3RoPlxuICAgICAgPHRoPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1yaWdodCBmbG9hdC1yaWdodFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVQaWNrZXIubW92ZSgxKVwiIHRhYmluZGV4PVwiLTFcIj7DosKAwro8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93eiBvZiByb3dzXCI+XG4gICAgICA8dGQgKm5nRm9yPVwibGV0IGR0eiBvZiByb3d6XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiIHJvbGU9XCJncmlkY2VsbFwiIFthdHRyLmlkXT1cImR0ei51aWRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6MTAwJTtcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydidG4tbGluayc6IGlzQnM0ICYmICFkdHouc2VsZWN0ZWQgJiYgIWRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KSwgJ2J0bi1pbmZvJzogZHR6LnNlbGVjdGVkIHx8IChpc0JzNCAmJiAhZHR6LnNlbGVjdGVkICYmIGRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KSksIGRpc2FibGVkOiBkdHouZGlzYWJsZWQsIGFjdGl2ZTogIWlzQnM0ICYmIGRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KX1cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkdHouZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnNlbGVjdChkdHouZGF0ZSlcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyd0ZXh0LXN1Y2Nlc3MnOiBpc0JzNCAmJiBkdHouY3VycmVudCwgJ3RleHQtaW5mbyc6ICFpc0JzNCAmJiBkdHouY3VycmVudH1cIj57eyBkdHoubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3Rib2R5PlxuPC90YWJsZT5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgIDpob3N0IC5idG4taW5mbyAudGV4dC1zdWNjZXNzIHtcbiAgICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7XG4gICAgfVxuICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgWWVhclBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRhdGVQaWNrZXI6IERhdGVQaWNrZXJJbm5lckNvbXBvbmVudDtcbiAgdGl0bGU6IHN0cmluZztcbiAgcm93czogYW55W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihkYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLmRhdGVQaWNrZXIgPSBkYXRlUGlja2VyO1xuICB9XG5cbiAgZ2V0IGlzQnM0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXNCczMoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnN0ZXBZZWFyID0geyB5ZWFyczogdGhpcy5kYXRlUGlja2VyLnllYXJSYW5nZSB9O1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnNldFJlZnJlc2hWaWV3SGFuZGxlcihmdW5jdGlvbigpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHllYXJzOiBhbnlbXSA9IG5ldyBBcnJheSh0aGlzLnllYXJSYW5nZSk7XG4gICAgICBsZXQgZGF0ZTogRGF0ZTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gc2VsZi5nZXRTdGFydGluZ1llYXIodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueWVhclJhbmdlOyBpKyspIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0YXJ0ICsgaSwgMCwgMSk7XG4gICAgICAgIGRhdGUgPSB0aGlzLmZpeFRpbWVab25lKGRhdGUpO1xuICAgICAgICB5ZWFyc1tpXSA9IHRoaXMuY3JlYXRlRGF0ZU9iamVjdChkYXRlLCB0aGlzLmZvcm1hdFllYXIpO1xuICAgICAgICB5ZWFyc1tpXS51aWQgPSB0aGlzLnVuaXF1ZUlkICsgJy0nICsgaTtcbiAgICAgIH1cblxuICAgICAgc2VsZi50aXRsZSA9IFt5ZWFyc1swXS5sYWJlbCwgeWVhcnNbdGhpcy55ZWFyUmFuZ2UgLSAxXS5sYWJlbF0uam9pbihcbiAgICAgICAgJyAtICdcbiAgICAgICk7XG4gICAgICBzZWxmLnJvd3MgPSB0aGlzLnNwbGl0KHllYXJzLCBzZWxmLmRhdGVQaWNrZXIueWVhckNvbExpbWl0KTtcbiAgICB9LCAneWVhcicpO1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnNldENvbXBhcmVIYW5kbGVyKGZ1bmN0aW9uKFxuICAgICAgZGF0ZTE6IERhdGUsXG4gICAgICBkYXRlMjogRGF0ZVxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gZGF0ZTEuZ2V0RnVsbFllYXIoKSAtIGRhdGUyLmdldEZ1bGxZZWFyKCk7XG4gICAgfSwgJ3llYXInKTtcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFN0YXJ0aW5nWWVhcih5ZWFyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIHRvZG86IHBhcnNlSW50XG4gICAgcmV0dXJuIChcbiAgICAgICh5ZWFyIC0gMSkgLyB0aGlzLmRhdGVQaWNrZXIueWVhclJhbmdlICogdGhpcy5kYXRlUGlja2VyLnllYXJSYW5nZSArIDFcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXItaW5uZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVwaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IERheVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF5cGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb250aFBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vbW9udGhwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFllYXJQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL3llYXJwaWNrZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBEYXRlUGlja2VyQ29tcG9uZW50LFxuICAgIERhdGVQaWNrZXJJbm5lckNvbXBvbmVudCxcbiAgICBEYXlQaWNrZXJDb21wb25lbnQsXG4gICAgTW9udGhQaWNrZXJDb21wb25lbnQsXG4gICAgWWVhclBpY2tlckNvbXBvbmVudFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgICBEYXRlUGlja2VySW5uZXJDb21wb25lbnQsXG4gICAgRGF5UGlja2VyQ29tcG9uZW50LFxuICAgIE1vbnRoUGlja2VyQ29tcG9uZW50LFxuICAgIFllYXJQaWNrZXJDb21wb25lbnRcbiAgXSxcbiAgZW50cnlDb21wb25lbnRzOiBbRGF0ZVBpY2tlckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlck1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xuICAgIHJldHVybiB7IG5nTW9kdWxlOiBEYXRlcGlja2VyTW9kdWxlLCBwcm92aWRlcnM6IFtEYXRlcGlja2VyQ29uZmlnXSB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiaGVpZ2h0Iiwid2lkdGgiLCJzaGlmdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFZQTs7Ozs7OzhCQStCbUIsYUFBYTs7NkJBR2QsQ0FBQzs7OzsrQkFJQyxJQUFJOytCQUVKLEdBQUc7OzhCQUVKLEtBQUs7Ozs7Z0NBSUgsR0FBRzs7MEJBR1QsTUFBTTt5QkFDUCxNQUFNO3dCQUNQLEdBQUc7MEJBQ0QsTUFBTTt5QkFDUCxNQUFNOzJCQUNKLEdBQUc7Ozs7WUF2RGxCLFVBQVU7Ozs7Ozs7Ozs7QUNNWDs7aUNBS3VDLEVBQUU7Ozs7OztJQUV2QyxJQUFJLE9BQU8sQ0FBQyxLQUFXO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2pDOzs7OztJQUVELElBQUksT0FBTyxDQUFDLEtBQVc7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDakM7Ozs7O0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBZTtRQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN0Qzs7Ozs7SUFFRCxJQUFJLFVBQVUsQ0FBQyxLQUFjO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2xDOzs7OztJQVFELFdBQVcsQ0FBQyxLQUEyQixLQUFVOzs7OztJQUVqRCxVQUFVLENBQUMsS0FBd0IsS0FBVTs7Ozs7SUFFN0MsZUFBZSxDQUFDLEtBQXFCLEtBQVU7Ozs7O0lBRS9DLGlCQUFpQixDQUFDLEtBQXFCLEtBQVU7Ozs7O0lBRWpELGdCQUFnQixDQUFDLEtBQXFCLEtBQVU7Ozs7O0lBRWhELGdCQUFnQixDQUFDLEdBQWlCLEtBQVU7Ozs7O0lBRTVDLGtCQUFrQixDQUFDLEtBQTRCLEtBQVU7Ozs7O0lBRXpELGlCQUFpQixDQUFDLEtBQTRCLEtBQVU7Ozs7O0lBR3hELGdCQUFnQixDQUFDLEtBQVU7UUFDekIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0tBQ3pCO0NBQ0Y7Ozs7OztBQ2pFRDs7OztJQStCRSxTQUFTO1FBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztLQUNoRDs7OztJQUVELE1BQU07UUFDSixPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQzdDOzs7O0lBRUQsSUFBSTtRQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDM0M7Ozs7O0lBRUQsTUFBTSxDQUFDLElBQVU7UUFDZixPQUFPO1lBQ0wsSUFBSSxFQUFFLG1CQUFtQixDQUFDLE1BQU07WUFDaEMsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0tBQ0g7Ozs7O0lBRUQsY0FBYyxDQUFDLEtBQTJCO1FBQ3hDLE9BQU87WUFDTCxJQUFJLEVBQUUsbUJBQW1CLENBQUMsZUFBZTtZQUN6QyxPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7S0FDSDs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBNEI7UUFDckMsT0FBTztZQUNMLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxXQUFXO1lBQ3JDLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNIOzs7OztJQUVELFlBQVksQ0FBQyxJQUFjO1FBQ3pCLE9BQU87WUFDTCxJQUFJLEVBQUUsbUJBQW1CLENBQUMsZUFBZTtZQUN6QyxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7S0FDSDs7Ozs7SUFFRCxVQUFVLENBQUMsT0FBZ0M7UUFDekMsT0FBTztZQUNMLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxXQUFXO1lBQ3JDLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUM7S0FDSDs7Ozs7SUFHRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPO1lBQ0wsSUFBSSxFQUFFLG1CQUFtQixDQUFDLFlBQVk7WUFDdEMsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO0tBQ0g7Ozs7O0lBRUQsUUFBUSxDQUFDLEtBQXFCO1FBQzVCLE9BQU87WUFDTCxJQUFJLEVBQUUsbUJBQW1CLENBQUMsS0FBSztZQUMvQixPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJO1NBQ2xELENBQUM7S0FDSDs7Ozs7SUFFRCxPQUFPLENBQUMsSUFBVTtRQUNoQixPQUFPO1lBQ0wsSUFBSSxFQUFFLG1CQUFtQixDQUFDLFlBQVk7WUFDdEMsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0tBQ0g7Ozs7O0lBRUQsT0FBTyxDQUFDLElBQVU7UUFDaEIsT0FBTztZQUNMLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxZQUFZO1lBQ3RDLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztLQUNIOzs7OztJQUVELFlBQVksQ0FBQyxJQUFjO1FBQ3pCLE9BQU87WUFDTCxJQUFJLEVBQUUsbUJBQW1CLENBQUMsZ0JBQWdCO1lBQzFDLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztLQUNIOzs7OztJQUVELFVBQVUsQ0FBQyxLQUFjO1FBQ3ZCLE9BQU87WUFDTCxJQUFJLEVBQUUsbUJBQW1CLENBQUMsZUFBZTtZQUN6QyxPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7S0FDSDs7Ozs7SUFFRCxTQUFTLENBQUMsTUFBYztRQUN0QixPQUFPO1lBQ0wsSUFBSSxFQUFFLG1CQUFtQixDQUFDLFVBQVU7WUFDcEMsT0FBTyxFQUFFLE1BQU07U0FDaEIsQ0FBQztLQUNIOztnQ0FsSDJCLHFDQUFxQzs2QkFDeEMsdUNBQXVDOzJCQUN6Qyx3QkFBd0I7NkJBQ3RCLDBCQUEwQjtzQ0FDakIsOEJBQThCO2tDQUNsQywrQkFBK0I7a0NBQy9CLG9DQUFvQzs0QkFDMUMseUJBQXlCO3NDQUNmLCtCQUErQjttQ0FFbEMsMkJBQTJCO21DQUMzQiwyQkFBMkI7dUNBQ3ZCLGdDQUFnQztzQ0FDakMsOEJBQThCO2lDQUVuQyxvQ0FBb0M7bUNBRWxDLHNDQUFzQzs7WUFuQnRFLFVBQVU7Ozs7Ozs7QUNWWDs7OEJBSzJCLElBQUk7dUJBQ1gsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLGNBQWMsQ0FBQzs2QkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7Ozs7O0lBRXZFLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUNyQjs7OztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUMzQjs7OztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNoQzs7Ozs7SUFFRCxHQUFHLENBQUMsTUFBYztRQUNoQixJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2pDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzNCOzs7WUF4QkYsVUFBVTs7Ozs7OztBQ0hYOzs7OztJQXFDRSxZQUFvQixRQUE2QixFQUM3QjtRQURBLGFBQVEsR0FBUixRQUFRLENBQXFCO1FBQzdCLG1CQUFjLEdBQWQsY0FBYztxQkFIRixFQUFFO0tBR3FCOzs7OztJQUV2RCxJQUFJLENBQUMsa0JBQXFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUM7S0FDYjs7Ozs7O0lBSUQsUUFBUSxDQUFDLEtBQVc7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNuRDs7Ozs7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ3hEOzs7OztJQUVELFVBQVUsQ0FBQyxLQUFXO1FBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFbkQsT0FBTyxJQUFJLENBQUM7S0FDYjs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBVztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sSUFBSSxDQUFDO0tBQ2I7Ozs7O0lBRUQsZUFBZSxDQUFDLEtBQWU7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV4RCxPQUFPLElBQUksQ0FBQztLQUNiOzs7OztJQUVELFdBQVcsQ0FBQyxLQUFjO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFdEQsT0FBTyxJQUFJLENBQUM7S0FDYjs7Ozs7SUFHRCxVQUFVLENBQUMsT0FBMkI7UUFDcEMsdUJBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXpELE9BQU8sSUFBSSxDQUFDO0tBQ2I7Ozs7OztJQUdELFdBQVcsQ0FBQyxTQUF3QztRQUNsRCxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNO2FBQ2pDLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQzthQUNwQyxJQUFJLENBQ0gsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQzNCLENBQUM7O1FBR0osU0FBUyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTTthQUNuQyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQzthQUM1QyxJQUFJLENBQ0gsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQzNCLENBQUM7O1FBR0osU0FBUyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTTthQUNsQyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQzthQUMzQyxJQUFJLENBQ0gsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ3pCLENBQUM7UUFFSixTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxFLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU07YUFDNUIsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDO2FBQ3RDLElBQUksQ0FDSCxHQUFHLENBQUMsZUFBZSxLQUFLLEVBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQyxDQUM1QyxDQUFDO1FBRUosT0FBTyxJQUFJLENBQUM7S0FDYjs7Ozs7O0lBR0QsZ0JBQWdCLENBQUMsU0FBd0M7UUFDdkQsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQTJCO1lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDM0QsQ0FBQztRQUVGLFNBQVMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxLQUF3QjtZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUM5RCxDQUFDO1FBRUYsU0FBUyxDQUFDLGVBQWUsR0FBRyxDQUFDLEtBQXFCO1lBQ2hELHVCQUFNLEtBQUsscUJBQUcsS0FBSyxDQUFDLElBQW9CLENBQUEsQ0FBQztZQUN6QyxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDMUMsT0FBTzthQUNSO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNwRCxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDbkMsQ0FBQztRQUVGLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEtBQXFCO1lBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDeEMsQ0FBQztRQUVGLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEtBQXFCO1lBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDeEMsQ0FBQztRQUVGLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEtBQTRCO1lBQzFELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUN2QixJQUFJLEVBQUU7b0JBQ0osS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUMzQixJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7aUJBQzlCO2dCQUNELFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FDSCxDQUFDO1NBQ0gsQ0FBQztRQUVGLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEtBQTRCO1lBQ3pELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUN2QixJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2lCQUM5QjtnQkFDRCxRQUFRLEVBQUUsT0FBTzthQUNsQixDQUFDLENBQ0gsQ0FBQztTQUNILENBQUM7UUFFRixPQUFPLElBQUksQ0FBQztLQUNiOzs7O0lBRUQsNkJBQTZCO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUk7WUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1NBQ2pELENBQUMsQ0FDSCxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNO2FBQ1IsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDO2FBQ2xDLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FDbkM7YUFDQSxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUNwRSxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNO2FBQ1IsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDO2FBQ3RDLElBQUksQ0FDSCxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDekI7YUFDQSxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUNsRSxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNO2FBQ1IsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDO2FBQ25DLElBQUksQ0FDSCxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FDdkM7YUFDQSxTQUFTLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUN6RSxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNO2FBQ1IsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDO2FBQ3BDLElBQUksQ0FDSCxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FDekM7YUFDQSxTQUFTLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUMxRSxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNO2FBQ1IsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDO2FBQ3JDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUMvRCxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNO2FBQ1IsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUM7YUFDekMsSUFBSSxDQUNILE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUN6QjthQUNBLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUMvRCxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxNQUFNO2FBQ1IsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDO2FBQ2xDLElBQUksQ0FDSCxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FDckM7YUFDQSxTQUFTLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUN4RSxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWTthQUM3QixTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDOUUsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0tBQ2I7Ozs7SUFFRCxPQUFPO1FBQ0wsS0FBSyx1QkFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM1QixHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbkI7S0FDRjs7O1lBbFBGLFVBQVU7Ozs7WUFsQkYsbUJBQW1CO1lBR25CLGVBQWU7Ozs7Ozs7QUNQeEIsQUFBTyx1QkFBTSxtQkFBbUIsR0FBcUI7SUFDbkQsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUM7Ozs7OztBQ0dGLEFBK0RBLHVCQUFNLFlBQVksR0FBMEIsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFFOUUsQUFBTyx1QkFBTSxzQkFBc0IsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FDcEUsSUFBSSxrQkFBa0IsRUFBRSxFQUN4QjtJQUNFLE1BQU0sRUFBRSxJQUFJO0lBQ1osSUFBSSxFQUFFLFlBQVk7SUFDbEIsYUFBYSxFQUFFLEVBQUU7SUFDakIsZ0JBQWdCLEVBQUUsbUJBQW1CO0NBQ3RDLENBQ0YsQ0FBQzs7Ozs7O0FDbkZGOzs7OztBQVVBLGtDQUF5QyxJQUFVLEVBQ1YsT0FBb0M7SUFDM0UsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ2xELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCx1QkFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLHVCQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXBFLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7Q0FDeEM7Ozs7OztBQUVELDZCQUFvQyxPQUFlLEVBQUUsaUJBQXlCO0lBQzVFLElBQUksaUJBQWlCLEtBQUssQ0FBQyxFQUFFO1FBQzNCLE9BQU8sT0FBTyxDQUFDO0tBQ2hCO0lBRUQsdUJBQU0sTUFBTSxHQUFHLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFFL0MsT0FBTyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0NBQ3pDOzs7Ozs7O0FBRUQseUJBQWdDLElBQVUsRUFBRSxHQUFTLEVBQUUsR0FBUztJQUM5RCx1QkFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSx1QkFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVwRSxPQUFPLFFBQVEsSUFBSSxRQUFRLENBQUM7Q0FDN0I7Ozs7Ozs7QUFFRCx3QkFBK0IsSUFBVSxFQUFFLEdBQVMsRUFBRSxHQUFTO0lBQzdELHVCQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLHVCQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRW5FLE9BQU8sUUFBUSxJQUFJLFFBQVEsQ0FBQztDQUM3Qjs7Ozs7O0FDNUNEOzs7Ozs7QUFXQSxzQkFDRSxPQUFzQixFQUN0QixFQUFxQjtJQUVyQixxQkFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNwQyx1QkFBTSxNQUFNLEdBQVUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELEtBQUsscUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLEtBQUsscUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNqRDtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUM7Q0FDZjs7Ozs7O0FDdEJEOzs7OztBQUlBLDBCQUNFLFlBQWtCLEVBQ2xCLE9BQXlCO0lBRXpCLHVCQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRCx1QkFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWhFLHVCQUFNLGFBQWEsR0FBRztRQUNwQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFdBQVc7UUFDWCxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0tBQ2xCLENBQUM7SUFDRix1QkFBTSxVQUFVLEdBQUcsWUFBWSxDQUFPLGFBQWEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7SUFFbkUsT0FBTztRQUNMLFVBQVU7UUFDVixLQUFLLEVBQUUsUUFBUTtLQUNoQixDQUFDO0NBQ0g7Ozs7OztBQ3RCRDs7Ozs7O0FBRUEsNEJBQW1DLFlBQStCLEVBQy9CLGFBQXNDLEVBQ3RDLFVBQWtCO0lBQ25ELE9BQU87UUFDTCxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7UUFDekIsVUFBVSxFQUFFLFVBQVUsQ0FDcEIsWUFBWSxDQUFDLEtBQUssRUFDbEIsYUFBYSxDQUFDLFVBQVUsRUFDeEIsYUFBYSxDQUFDLE1BQU0sQ0FDckI7UUFDRCxTQUFTLEVBQUUsVUFBVSxDQUNuQixZQUFZLENBQUMsS0FBSyxFQUNsQixhQUFhLENBQUMsU0FBUyxFQUN2QixhQUFhLENBQUMsTUFBTSxDQUNyQjtRQUNELFdBQVcsRUFBRSxjQUFjLENBQ3pCLFlBQVksQ0FBQyxVQUFVLEVBQ3ZCLGFBQWEsQ0FBQyxXQUFXLEVBQ3pCLGFBQWEsQ0FBQyxNQUFNLENBQ3JCO1FBQ0QsUUFBUSxFQUFFLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDbEQsS0FBSyxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBWSxFQUFFLFNBQWlCLE1BQU07WUFDdkUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFVLEVBQUUsUUFBZ0IsTUFBTTtnQkFDaEQsSUFBSTtnQkFDSixLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3JFLFVBQVU7Z0JBQ1YsU0FBUztnQkFDVCxRQUFRO2FBQ1QsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0tBQ0osQ0FBQztDQUNIOzs7Ozs7O0FBRUQsd0JBQStCLFVBQW9CLEVBQ3BCLE1BQWMsRUFDZCxNQUFjO0lBQzNDLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FDbkIsQ0FBQyxJQUFZLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUN2RSxDQUFDO0NBQ0g7Ozs7O0FBRUQsNEJBQW1DLE1BQWM7SUFDL0MsdUJBQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyx1QkFBTSxRQUFRLHFCQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQWMsQ0FBQSxDQUFDO0lBQ3JELHVCQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7SUFFaEQsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7Q0FDbEY7Ozs7OztBQ2hERDs7Ozs7QUF1QkEsMEJBQ0UsY0FBcUMsRUFDckMsT0FBZ0M7SUFFaEMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFtQjs7UUFFL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFpQixFQUFFLFFBQWdCOztZQUVwRCx1QkFBTSxZQUFZLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbEUsdUJBQU0sU0FBUyxHQUNiLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzs7WUFFNUQsdUJBQU0sZ0JBQWdCLEdBQ3BCLENBQUMsWUFBWTtnQkFDYixPQUFPLENBQUMsYUFBYTtnQkFDckIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELHVCQUFNLGNBQWMsR0FDbEIsQ0FBQyxZQUFZO2dCQUNiLE9BQU8sQ0FBQyxhQUFhO2dCQUNyQixTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEQsdUJBQU0sVUFBVSxHQUNkLENBQUMsQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDM0QsZ0JBQWdCO2dCQUNoQixjQUFjLENBQUM7WUFFakIsdUJBQU0sU0FBUyxHQUNiLENBQUMsWUFBWTtnQkFDYixPQUFPLENBQUMsYUFBYTtnQkFDckIsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFdEUsdUJBQU0sVUFBVSxHQUNkLE9BQU8sQ0FBQyxVQUFVO2dCQUNsQixRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztnQkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Z0JBQ3pDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVoRCx1QkFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQix1QkFBTSxPQUFPLEdBQUcsQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7O1lBR2xFLHVCQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQ3BDLFlBQVk7Z0JBQ1osU0FBUztnQkFDVCxVQUFVO2dCQUNWLGdCQUFnQjtnQkFDaEIsY0FBYztnQkFDZCxTQUFTO2dCQUNULFVBQVU7Z0JBQ1YsT0FBTzthQUNSLENBQUMsQ0FBQztZQUVILElBQ0UsR0FBRyxDQUFDLFlBQVksS0FBSyxNQUFNLENBQUMsWUFBWTtnQkFDeEMsR0FBRyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUztnQkFDbEMsR0FBRyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVTtnQkFDcEMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLE1BQU0sQ0FBQyxnQkFBZ0I7Z0JBQ2hELEdBQUcsQ0FBQyxjQUFjLEtBQUssTUFBTSxDQUFDLGNBQWM7Z0JBQzVDLEdBQUcsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFVBQVU7Z0JBQ3BDLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQzNCLEVBQUU7Z0JBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7YUFDOUI7U0FDRixDQUFDLENBQUM7S0FDSixDQUFDLENBQUM7O0lBR0gsY0FBYyxDQUFDLGFBQWE7UUFDMUIsT0FBTyxDQUFDLFVBQVU7YUFDakIsT0FBTyxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0UsY0FBYyxDQUFDLGNBQWM7UUFDM0IsT0FBTyxDQUFDLFVBQVU7YUFDakIsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYTtnQkFDekMsT0FBTyxDQUFDLFVBQVUsR0FBRyxDQUFDLEtBQUssT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRXRELGNBQWMsQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQy9DLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDOUMsT0FBTyxDQUFDLE9BQU8sRUFDZixPQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBQ0YsY0FBYyxDQUFDLGlCQUFpQixHQUFHLGVBQWUsQ0FDaEQsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDN0MsT0FBTyxDQUFDLE9BQU8sRUFDZixPQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBRUYsT0FBTyxjQUFjLENBQUM7Q0FDdkI7Ozs7Ozs7QUFFRCx1QkFDRSxJQUFVLEVBQ1YsYUFBcUIsRUFDckIsV0FBaUI7SUFFakIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM5QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDNUQ7SUFFRCxJQUFJLFdBQVcsRUFBRTtRQUNmLE9BQU8sSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDO0tBQ3ZEO0lBRUQsT0FBTyxLQUFLLENBQUM7Q0FDZDs7Ozs7Ozs7Ozs7QUN2SUQsdUJBQThCLElBQTBCLEVBQUUsT0FBOEI7SUFDdEYsT0FBTyxPQUFPLEdBQUcsSUFBSSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7Q0FDekM7Ozs7OztBQ0NELEFBR0EsdUJBQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNqQix1QkFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLHVCQUFNLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Ozs7O0FBRTNCLDhCQUNFLFFBQWMsRUFDZCxhQUFzQztJQUV0Qyx1QkFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5Qyx1QkFBTSxhQUFhLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM1RCx1QkFBTSxXQUFXLEdBQUcsWUFBWSxDQUU5QixhQUFhLEVBQUUsSUFBSSxLQUFLO1FBQ3hCLElBQUk7UUFDSixLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7S0FDeEUsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPO1FBQ0wsTUFBTSxFQUFFLFdBQVc7UUFDbkIsVUFBVSxFQUFFLEVBQUU7UUFDZCxTQUFTLEVBQUUsVUFBVSxDQUNuQixRQUFRLEVBQ1IsYUFBYSxDQUFDLFNBQVMsRUFDdkIsYUFBYSxDQUFDLE1BQU0sQ0FDckI7S0FDRixDQUFDO0NBQ0g7Ozs7OztBQ2xDRDs7Ozs7QUFnQkEsNEJBQ0UsYUFBc0MsRUFDdEMsT0FBaUM7SUFFakMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQzFCLENBQUMsTUFBK0IsRUFBRSxRQUFnQjtRQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBNEIsRUFBRSxVQUFrQjtZQUM5RCx1QkFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLHVCQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsVUFBVTtnQkFDbEIsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEUsdUJBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLFNBQVMsS0FBSyxFQUFFO2dCQUM1QyxTQUFTO2dCQUNULFVBQVU7YUFDWCxDQUFDLENBQUM7WUFDSCxJQUNFLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVM7Z0JBQ3RDLEtBQUssQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLFVBQ2hDLEVBQUU7Z0JBQ0EsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7YUFDdkQ7U0FDRixDQUFDLENBQUM7S0FDSixDQUNGLENBQUM7O0lBR0YsYUFBYSxDQUFDLGFBQWE7UUFDekIsT0FBTyxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3pFLGFBQWEsQ0FBQyxjQUFjO1FBQzFCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWE7WUFDMUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxDQUFDLEtBQUssT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUVuRCxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsY0FBYyxDQUM3QyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUN4RCxPQUFPLENBQUMsT0FBTyxFQUNmLE9BQU8sQ0FBQyxPQUFPLENBQ2hCLENBQUM7SUFDRixhQUFhLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUM5QyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDdkQsT0FBTyxDQUFDLE9BQU8sRUFDZixPQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBRUYsT0FBTyxhQUFhLENBQUM7Q0FDdEI7Ozs7OztBQ3ZERCxBQUdBLHVCQUFNQSxRQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLHVCQUFNQyxPQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLEFBQU8sdUJBQU0sZ0JBQWdCLEdBQUdELFFBQU0sR0FBR0MsT0FBSyxDQUFDO0FBQy9DLHVCQUFNLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLHVCQUFNQyxPQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Ozs7OztBQUUxQiw2QkFDRSxRQUFjLEVBQ2QsYUFBc0M7SUFFdEMsdUJBQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNoRSx1QkFBTSxhQUFhLEdBQUcsU0FBRUQsT0FBSyxVQUFFRCxRQUFNLEVBQUUsV0FBVyxTQUFFRSxPQUFLLEVBQUUsQ0FBQztJQUM1RCx1QkFBTSxXQUFXLEdBQUcsWUFBWSxDQUU5QixhQUFhLEVBQUUsSUFBSSxLQUFLO1FBQ3hCLElBQUk7UUFDSixLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7S0FDdkUsQ0FBQyxDQUFDLENBQUM7SUFDSix1QkFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRW5FLE9BQU87UUFDTCxLQUFLLEVBQUUsV0FBVztRQUNsQixVQUFVLEVBQUUsRUFBRTtRQUNkLFNBQVM7S0FDVixDQUFDO0NBQ0g7Ozs7OztBQUVELDhCQUNFLFdBQXNDLEVBQ3RDLGFBQXNDO0lBRXRDLHVCQUFNLElBQUksR0FBRyxVQUFVLENBQ3JCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ3RCLGFBQWEsQ0FBQyxTQUFTLEVBQ3ZCLGFBQWEsQ0FBQyxNQUFNLENBQ3JCLENBQUM7SUFDRix1QkFBTSxFQUFFLEdBQUcsVUFBVSxDQUNuQixXQUFXLENBQUNGLFFBQU0sR0FBRyxDQUFDLENBQUMsQ0FBQ0MsT0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDdkMsYUFBYSxDQUFDLFNBQVMsRUFDdkIsYUFBYSxDQUFDLE1BQU0sQ0FDckIsQ0FBQztJQUVGLE9BQU8sR0FBRyxJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUM7Q0FDMUI7Ozs7OztBQ25ERDs7Ozs7QUFhQSwyQkFDRSxhQUFxQyxFQUNyQyxPQUFpQztJQUVqQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDekIsQ0FBQyxLQUE4QixFQUFFLFFBQWdCO1FBQy9DLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUEyQixFQUFFLFNBQWlCO1lBQzNELHVCQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0QsdUJBQU0sVUFBVSxHQUNkLE9BQU8sQ0FBQyxVQUFVO2dCQUNsQixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5RCx1QkFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sU0FBUyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN4RSxJQUNFLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVM7Z0JBQ3JDLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLFVBQy9CLEVBQUU7Z0JBQ0EsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUM7YUFDckQ7U0FDRixDQUFDLENBQUM7S0FDSixDQUNGLENBQUM7O0lBR0YsYUFBYSxDQUFDLGFBQWE7UUFDekIsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3ZFLGFBQWEsQ0FBQyxjQUFjO1FBQzFCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWE7WUFDekMsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUVsRCxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsY0FBYyxDQUM3QyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUN2RCxPQUFPLENBQUMsT0FBTyxFQUNmLE9BQU8sQ0FBQyxPQUFPLENBQ2hCLENBQUM7SUFDRix1QkFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLHVCQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDNUMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FDOUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ3RELE9BQU8sQ0FBQyxPQUFPLEVBQ2YsT0FBTyxDQUFDLE9BQU8sQ0FDaEIsQ0FBQztJQUVGLE9BQU8sYUFBYSxDQUFDO0NBQ3RCOzs7Ozs7QUN4REQ7Ozs7O0FBeUJBLDZCQUFvQyxLQUFLLEdBQUcsc0JBQXNCLEVBQzlCLE1BQWM7SUFDaEQsUUFBUSxNQUFNLENBQUMsSUFBSTtRQUNqQixLQUFLLG1CQUFtQixDQUFDLFNBQVMsRUFBRTtZQUNsQyxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsS0FBSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7WUFDL0IsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsS0FBSyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUU7WUFDN0IsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ25DO1FBRUQsS0FBSyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUU7WUFDeEMsdUJBQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFFLHVCQUFNLFFBQVEsR0FBRztnQkFDZixJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDckIsSUFBSTtpQkFDTDthQUNGLENBQUM7WUFFRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMzQztRQUVELEtBQUssbUJBQW1CLENBQUMsV0FBVyxFQUFFO1lBQ3BDLHVCQUFNLE9BQU8sR0FBMEIsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUV0RCx1QkFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxxQkFBSSxRQUFRLENBQUM7WUFDYixxQkFBSSxJQUEwQixDQUFDO1lBQy9CLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7YUFDckM7aUJBQU07Z0JBQ0wsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN2QixRQUFRLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO2FBQ3pEO1lBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDM0M7UUFFRCxLQUFLLG1CQUFtQixDQUFDLGVBQWUsRUFBRTtZQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNqRCxPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsdUJBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdCLHVCQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzVCLHVCQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBRTFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7WUFDOUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDbEU7UUFFRCxLQUFLLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtZQUMvQix1QkFBTSxRQUFRLEdBQUc7Z0JBQ2YsWUFBWSxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUM1QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7YUFDakIsQ0FBQztZQUVGLHVCQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM3Qix1QkFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoRCx1QkFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RCxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1lBRS9CLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsS0FBSyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUU7WUFDcEMsdUJBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7O1lBRWhDLHVCQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkUsdUJBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUs7bUJBQzFELE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzttQkFDOUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDckIsdUJBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEUsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7WUFFL0IsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFOztnQkFFbEIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMzQixRQUFRLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQ3pDOztnQkFHRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLFlBQVksSUFBSSxFQUFFO29CQUNsQyxRQUFRLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQ3hDOzs7YUFJRjtZQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNDOztRQUdELEtBQUssbUJBQW1CLENBQUMsWUFBWSxFQUFFO1lBQ3JDLHVCQUFNLFFBQVEsR0FBRztnQkFDZixhQUFhLEVBQUUsTUFBTSxDQUFDLE9BQU87Z0JBQzdCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTthQUNqQixDQUFDO1lBRUYsdUJBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdCLHVCQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDckUsdUJBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUQsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUUvQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMzQztRQUVELEtBQUssbUJBQW1CLENBQUMsWUFBWSxFQUFFO1lBQ3JDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFO2dCQUM5QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87YUFDeEIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxLQUFLLG1CQUFtQixDQUFDLFlBQVksRUFBRTtZQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRTtnQkFDOUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2FBQ3hCLENBQUMsQ0FBQztTQUNKO1FBQ0QsS0FBSyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUU7WUFDeEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7Z0JBQzlCLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTzthQUMzQixDQUFDLENBQUM7U0FDSjtRQUVEO1lBQ0UsT0FBTyxLQUFLLENBQUM7S0FDaEI7Q0FDRjs7Ozs7QUFFRCwwQkFBMEIsS0FBd0I7O0lBRWhELHVCQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDOztJQUUxQyxxQkFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFFL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUU7UUFDN0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2pGLHVCQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxLQUFLLHFCQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsVUFBVSxHQUFHLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRTs7WUFFakUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixDQUN4QyxRQUFRLEVBQ1IsS0FBSyxDQUFDLGdCQUFnQixDQUN2QixDQUFDO1lBQ0YsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5QztRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztLQUNsRDtJQUVELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO1FBQy9CLHVCQUFNLGNBQWMsR0FBRyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxLQUNFLHFCQUFJLGFBQWEsR0FBRyxDQUFDLEVBQ3JCLGFBQWEsR0FBRyxhQUFhLEVBQzdCLGFBQWEsRUFBRSxFQUNmOztZQUVBLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FBRyxvQkFBb0IsQ0FDbEQsUUFBUSxFQUNSLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUFDO1lBQ0YsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM3QztRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztLQUNyRDtJQUVELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1FBQzlCLHVCQUFNLGtCQUFrQixHQUFHLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXBELEtBQ0UscUJBQUksYUFBYSxHQUFHLENBQUMsRUFDckIsYUFBYSxHQUFHLGFBQWEsRUFDN0IsYUFBYSxFQUFFLEVBQ2Y7O1lBRUEsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEdBQUcsbUJBQW1CLENBQ3JELFFBQVEsRUFDUixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FDeEIsQ0FBQztZQUNGLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztTQUM1RDtRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsT0FBTyxLQUFLLENBQUM7Q0FDZDs7Ozs7O0FBRUQsdUJBQXVCLEtBQXdCLEVBQ3hCLE1BQWM7SUFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUU7UUFDN0IsdUJBQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsS0FDOUQsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUMvRCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0tBQ3REOztJQUdELHVCQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDOzs7SUFHMUMscUJBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBRS9CLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO1FBQy9CLHVCQUFNLGNBQWMsR0FBRyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxLQUNFLHFCQUFJLGFBQWEsR0FBRyxDQUFDLEVBQ3JCLGFBQWEsR0FBRyxhQUFhLEVBQzdCLGFBQWEsRUFBRSxFQUNmOztZQUVBLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FBRyxvQkFBb0IsQ0FDbEQsUUFBUSxFQUNSLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUFDO1lBQ0YsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM3QztRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztLQUNyRDtJQUVELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1FBQzlCLHVCQUFNLGtCQUFrQixHQUFHLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELEtBQ0UscUJBQUksYUFBYSxHQUFHLENBQUMsRUFDckIsYUFBYSxHQUFHLGFBQWEsRUFDN0IsYUFBYSxFQUFFLEVBQ2Y7O1lBRUEsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEdBQUcsbUJBQW1CLENBQ3JELFFBQVEsRUFDUixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FDeEIsQ0FBQztZQUNGLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDOUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztLQUN6RDtJQUVELE9BQU8sS0FBSyxDQUFDO0NBQ2Q7Ozs7OztBQUVELHFCQUFxQixLQUF3QixFQUN4QixNQUFjO0lBQ2pDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQzdCLHVCQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FDN0MsQ0FBQyxjQUFjLEVBQUUsVUFBVSxLQUN6QixnQkFBZ0IsQ0FBQyxjQUFjLEVBQUU7WUFDL0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNsQyxVQUFVO1NBQ1gsQ0FBQyxDQUNMLENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7S0FDcEQ7SUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtRQUMvQix1QkFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FDcEQsQ0FBQyxjQUFjLEVBQUUsVUFBVSxLQUN6QixrQkFBa0IsQ0FBQyxjQUFjLEVBQUU7WUFDakMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNsQyxVQUFVO1NBQ1gsQ0FBQyxDQUNMLENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztLQUM1RDtJQUVELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1FBQzlCLHVCQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3ZELENBQUMsY0FBYyxFQUFFLFNBQVMsS0FDeEIsaUJBQWlCLENBQUMsY0FBYyxFQUFFO1lBQ2hDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsU0FBUztTQUNWLENBQUMsQ0FDTCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7S0FDM0Q7SUFFRCxPQUFPLEtBQUssQ0FBQztDQUNkOzs7OztBQUVELDBCQUEwQixLQUF3QjtJQUNoRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBRXBCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtRQUM1QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFFMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1FBQ3hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtRQUM1QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFFMUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO0tBQy9CLENBQUM7Q0FDSDs7Ozs7Ozs7Ozs7QUFRRCxxQkFBcUIsUUFBdUIsRUFBRSxPQUFhLEVBQUUsT0FBYTtJQUN4RSx1QkFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBRS9ELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQzdDLE9BQU8sT0FBTyxDQUFDO0tBQ2hCO0lBRUQsSUFBSSxPQUFPLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDOUMsT0FBTyxPQUFPLENBQUM7S0FDaEI7SUFFRCxPQUFPLEtBQUssQ0FBQztDQUNkOzs7Ozs7QUNoWEQsdUJBTytCLFNBQVEsU0FBNEI7SUFDakU7UUFDRSx1QkFBTSxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQVM7WUFDOUMsSUFBSSxFQUFFLDhCQUE4QjtTQUNyQyxDQUFDLENBQUM7UUFDSCx1QkFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQ3pCLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsbUJBQW1CLENBQ3BCLENBQUM7UUFDRixLQUFLLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEOzs7WUFaRixVQUFVOzs7Ozs7Ozs7QUNOWCxvQ0FxQjRDLFNBQVEsNkJBQTZCOzs7Ozs7O0lBUS9FLFlBQ1UsU0FDQSxRQUNBLFVBQ1IsUUFBNkI7UUFFN0IsS0FBSyxFQUFFLENBQUM7UUFMQSxZQUFPLEdBQVAsT0FBTztRQUNQLFdBQU0sR0FBTixNQUFNO1FBQ04sYUFBUSxHQUFSLFFBQVE7MkJBTmdCLElBQUksWUFBWSxFQUFRO3FCQUVsQyxFQUFFO1FBUXhCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0tBQzFCOzs7OztJQWRELElBQUksS0FBSyxDQUFDLEtBQVc7UUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDL0I7Ozs7SUFjRCxRQUFRO1FBQ04sSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUTthQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBRWpCLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBRXhCLFdBQVcsQ0FBQyxJQUFJLENBQUM7YUFFakIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2FBQ3RCLDZCQUE2QixFQUFFLENBQUM7OztRQUluQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsTUFBTTthQUVSLE1BQU0sQ0FBQyxDQUFDLEtBQVUsS0FBSyxLQUFLLENBQUMsWUFBWSxDQUFDO2FBRTFDLFNBQVMsQ0FBQyxDQUFDLElBQVMsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RCxDQUFDO0tBQ0g7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsR0FBaUI7UUFDaEMsdUJBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBHLElBQUksVUFBVSxFQUFFO1lBQ2QsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDdEQ7Ozs7SUFFRCxXQUFXO1FBQ1QsS0FBSyx1QkFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM1QixHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbkI7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3pCOzs7WUFwRUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO2dCQUNuRCwrM0VBQXdDO2dCQUN4QyxJQUFJLEVBQUU7b0JBQ0osU0FBUyxFQUFFLDBCQUEwQjtvQkFDckMsS0FBSyxFQUFFLHFDQUFxQztvQkFDNUMsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsWUFBWSxFQUFFLFVBQVU7aUJBQ3pCO2FBQ0Y7Ozs7WUFqQlEsa0JBQWtCO1lBSWxCLGlCQUFpQjtZQUZqQixtQkFBbUI7WUFDbkIsbUJBQW1COzs7Ozs7O0FDTjVCOzs7Ozs7OztJQWdIRSxZQUFtQixPQUEyQixFQUNsQyxXQUF1QixFQUN2QixTQUFvQixFQUNwQixpQkFBbUMsRUFDbkMsR0FBMkI7UUFKcEIsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7Ozs7eUJBOUZZLFFBQVE7Ozs7O3dCQUs5QyxPQUFPOzs7OzRCQUlILElBQUk7Ozs7O3lCQUtQLE1BQU07MEJBRUwsSUFBSTs7Ozs2QkF1RW9CLElBQUksWUFBWSxFQUFFO3FCQUU5QixFQUFFOztRQVdsQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUNqQyxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLFNBQVMsQ0FDVixDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO0tBQzNDOzs7OztRQXRGRyxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQzs7Ozs7O0lBR2xDLElBQUksTUFBTSxDQUFDLEtBQWM7UUFDdkIsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2I7S0FDRjs7Ozs7O1FBa0JHLE9BQU8sQ0FBQyxLQUFXO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDM0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O0lBdURqQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDdEIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRTtTQUN4QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDbEI7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7WUFDekQsT0FBTztTQUNSO1FBRUQsSUFBSSxPQUFPLGFBQVU7WUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDckQ7UUFFRCxJQUFJLE9BQU8sYUFBVTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNyRDtRQUVELElBQUksT0FBTyxrQkFBZTtZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUMvRDtRQUVELElBQUksT0FBTyxnQkFBYTtZQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUMzRDtLQUNGOzs7Ozs7SUFNRCxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVzthQUNuQyxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUMsQ0FBQzthQUM5RCxNQUFNLENBQUMsOEJBQThCLENBQUM7YUFDdEMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDbEIsUUFBUSxDQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQzthQUN0QyxJQUFJLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDLENBQUM7O1FBR3JDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBVztZQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQzVDLENBQUMsQ0FDSCxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFXO1lBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiLENBQUMsQ0FDSCxDQUFDO0tBQ0g7Ozs7OztJQU1ELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsS0FBSyx1QkFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM1QixHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbkI7S0FDRjs7Ozs7O0lBTUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ2I7Ozs7O0lBS0QsU0FBUztRQUNQLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzVELEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDL0QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDL0QsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDOUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87U0FDaEUsQ0FBQyxDQUFDO0tBQ0o7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUM1Qjs7O1lBak9GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixRQUFRLEVBQUUsY0FBYzthQUN6Qjs7OztZQU5RLGtCQUFrQjtZQU5BLFVBQVU7WUFDUixTQUFTO1lBQWlCLGdCQUFnQjtZQUU3QyxzQkFBc0I7OzswQkFjN0MsS0FBSzt5QkFLTCxLQUFLOzZCQUlMLEtBQUs7MEJBS0wsS0FBSzsyQkFFTCxLQUFLO3VCQUtMLEtBQUs7d0JBaUJMLE1BQU07eUJBS04sTUFBTTt3QkFNTixLQUFLO3lCQVlMLEtBQUs7MkJBSUwsS0FBSzt3QkFJTCxLQUFLO3dCQUlMLEtBQUs7d0JBS0wsS0FBSzs2QkFLTCxLQUFLOzhCQUlMLE1BQU07Ozs7Ozs7QUN6R1QsQUFnQ0EsdUJBQU0sNEJBQTRCLEdBQWE7SUFDN0MsT0FBTyxFQUFFLGlCQUFpQjs7SUFFMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLDBCQUEwQixDQUFDO0lBQ3pELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLHVCQUFNLHVCQUF1QixHQUFhO0lBQ3hDLE9BQU8sRUFBRSxhQUFhOztJQUV0QixXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sMEJBQTBCLENBQUM7SUFDekQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBV0Y7Ozs7Ozs7O0lBUUUsWUFBNEIsU0FDUixnQkFDQSxXQUNBLFFBQ0E7UUFKUSxZQUFPLEdBQVAsT0FBTztRQUNmLG1CQUFjLEdBQWQsY0FBYztRQUNkLGNBQVMsR0FBVCxTQUFTO1FBQ1QsV0FBTSxHQUFOLE1BQU07UUFDTixvQkFBZSxHQUFmLGVBQWU7eUJBVmYsUUFBUSxDQUFDLFNBQVM7MEJBQ2pCLFFBQVEsQ0FBQyxTQUFTO2dDQUVaLFFBQVEsQ0FBQyxTQUFTOztRQVMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFXO1lBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNuQjtZQUNELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckMsQ0FBQyxDQUFDOztRQUdILElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsQyxDQUFDLENBQUM7S0FDSjs7Ozs7SUFFRCxjQUFjLENBQUMsS0FBVztRQUN4Qix1QkFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRTtjQUMzQixVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRS9GLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUM3RTs7Ozs7SUFFRCxRQUFRLENBQUMsS0FBWTs7UUFFbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBQyxLQUFLLENBQUMsTUFBYSxHQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztLQUNuQjs7Ozs7SUFFRCxRQUFRLENBQUMsQ0FBa0I7UUFDekIsdUJBQU0sTUFBTSxHQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDOztRQUd0QyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssRUFBRSxFQUFFO1lBQzVELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQix1QkFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQzthQUN4QztZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzthQUN0RDtZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUN6RixPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzthQUN0RDtTQUNGO0tBQ0Y7Ozs7O0lBRUQseUJBQXlCLENBQUMsRUFBYztRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0tBQzVCOzs7OztJQUVELFVBQVUsQ0FBQyxLQUFvQjtRQUM3QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDcEI7YUFBTTtZQUNMLHVCQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztZQUNyRCx1QkFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLFVBQVUsMERBQTBELENBQ2hGLENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN6RztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDcEM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ3JDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRS9FLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQ3ZFOzs7OztJQUVELGdCQUFnQixDQUFDLEVBQWM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7S0FDckI7Ozs7O0lBRUQsaUJBQWlCLENBQUMsRUFBYztRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztLQUN0Qjs7OztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDbkI7Ozs7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDcEU7OztZQTNIRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsSUFBSSxFQUFFO29CQUNKLFVBQVUsRUFBRSxrQkFBa0I7b0JBQzlCLGFBQWEsRUFBRSxRQUFRO29CQUN2QixRQUFRLEVBQUUsVUFBVTtpQkFDckI7Z0JBQ0QsU0FBUyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLENBQUM7YUFDbkU7Ozs7WUF6QlEscUJBQXFCLHVCQWtDZixJQUFJO1lBakNWLGVBQWU7WUF2QnRCLFNBQVM7WUFKVCxVQUFVO1lBRlYsaUJBQWlCOzs7Ozs7O0FDRG5CLDZCQUlxQyxTQUFRLGtCQUFrQjs7Ozs2QkFFN0MsQ0FBQzs7OztZQUhsQixVQUFVOzs7Ozs7O0FDSFgseUNBb0JpRCxTQUFRLDZCQUE2Qjs7Ozs7OztJQVVwRixZQUNVLFNBQ0EsUUFDQSxVQUNSLFFBQTZCO1FBRTdCLEtBQUssRUFBRSxDQUFDO1FBTEEsWUFBTyxHQUFQLE9BQU87UUFDUCxXQUFNLEdBQU4sTUFBTTtRQUNOLGFBQVEsR0FBUixRQUFROzJCQVBKLElBQUksWUFBWSxFQUFVOzJCQUVsQixFQUFFO3FCQUNBLEVBQUU7UUFReEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7S0FDMUI7Ozs7O0lBaEJELElBQUksS0FBSyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEM7Ozs7SUFnQkQsUUFBUTtRQUNOLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDbEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVE7YUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUdqQixVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUV4QixXQUFXLENBQUMsSUFBSSxDQUFDO2FBRWpCLGdCQUFnQixDQUFDLElBQUksQ0FBQzthQUN0Qiw2QkFBNkIsRUFBRSxDQUFDOzs7UUFJbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ2IsSUFBSSxDQUFDLE1BQU07YUFDUixNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUM7YUFDcEMsU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNsRCxDQUFDO0tBQ0g7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsR0FBaUI7UUFDaEMsdUJBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBHLElBQUksVUFBVSxFQUFFO1lBQ2QsT0FBTztTQUNSOzs7Ozs7UUFPRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsV0FBVztnQkFDZCxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO3NCQUMzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQztzQkFDL0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEI7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFbEUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7U0FDdkI7S0FDRjs7OztJQUVELFdBQVc7UUFDVCxLQUFLLHVCQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzVCLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNuQjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDekI7OztZQXpGRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDhCQUE4QjtnQkFDeEMsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7Z0JBQ25ELCszRUFBd0M7Z0JBQ3hDLElBQUksRUFBRTtvQkFDSixTQUFTLEVBQUUsMEJBQTBCO29CQUNyQyxLQUFLLEVBQUUscUNBQXFDO29CQUM1QyxJQUFJLEVBQUUsUUFBUTtvQkFDZCxZQUFZLEVBQUUsVUFBVTtpQkFDekI7YUFDRjs7OztZQWpCUSxrQkFBa0I7WUFJbEIsaUJBQWlCO1lBRmpCLG1CQUFtQjtZQUNuQixtQkFBbUI7Ozs7Ozs7QUNMNUI7Ozs7Ozs7O0lBa0hFLFlBQW1CLE9BQWdDLEVBQ3ZDLFdBQXVCLEVBQ3ZCLFNBQW9CLEVBQ3BCLGlCQUFtQyxFQUNuQyxHQUEyQjtRQUpwQixZQUFPLEdBQVAsT0FBTyxDQUF5Qjs7Ozt5QkFwRk8sUUFBUTs7Ozs7d0JBSzlDLE9BQU87Ozs7NEJBSUgsSUFBSTs7Ozs7eUJBS1AsTUFBTTswQkFFTCxJQUFJOzs7OzZCQTZEc0IsSUFBSSxZQUFZLEVBQUU7cUJBRWhDLEVBQUU7UUFVbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUNqQyxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLFNBQVMsQ0FDVixDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO0tBQzNDOzs7OztRQTNFRyxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQzs7Ozs7O0lBR2xDLElBQUksTUFBTSxDQUFDLEtBQWM7UUFDdkIsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2I7S0FDRjs7Ozs7O1FBa0JHLE9BQU8sQ0FBQyxLQUFhO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDM0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O0lBNENqQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDdEIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRTtTQUN4QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDbEI7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7WUFDekQsT0FBTztTQUNSO1FBRUQsSUFBSSxPQUFPLGFBQVU7WUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDckQ7UUFFRCxJQUFJLE9BQU8sYUFBVTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNyRDtRQUVELElBQUksT0FBTyxnQkFBYTtZQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUMzRDtLQUNGOzs7Ozs7SUFNRCxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVzthQUNuQyxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUMsQ0FBQzthQUM5RCxNQUFNLENBQUMsbUNBQW1DLENBQUM7YUFDM0MsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDbEIsUUFBUSxDQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQzthQUN0QyxJQUFJLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDLENBQUM7O1FBR3JDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBYTtZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQzVDLENBQUMsQ0FDSCxDQUFDOztRQUdGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVc7YUFDckMsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLEtBQWEsS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDM0Q7YUFDQSxTQUFTLENBQUMsQ0FBQyxLQUFhO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiLENBQUMsQ0FDTCxDQUFDO0tBQ0g7Ozs7O0lBS0QsU0FBUztRQUNQLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDMUIsRUFBRSxFQUNGLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFFBQVEsRUFDYjtZQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDL0QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87U0FDaEUsQ0FDRixDQUFDO0tBQ0g7Ozs7OztJQU1ELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsS0FBSyx1QkFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM1QixHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbkI7S0FDRjs7Ozs7O0lBTUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ2I7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUM1Qjs7O1lBMU5GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUUsbUJBQW1CO2FBQzlCOzs7O1lBVlEsdUJBQXVCO1lBWDlCLFVBQVU7WUFPVixTQUFTO1lBRVQsZ0JBQWdCO1lBS1Qsc0JBQXNCOzs7MEJBYTVCLEtBQUs7eUJBS0wsS0FBSzs2QkFJTCxLQUFLOzBCQUtMLEtBQUs7MkJBRUwsS0FBSzt1QkFLTCxLQUFLO3dCQWlCTCxNQUFNO3lCQUtOLE1BQU07d0JBTU4sS0FBSzt5QkFZTCxLQUFLOzJCQUlMLEtBQUs7d0JBSUwsS0FBSzt3QkFJTCxLQUFLOzhCQUlMLE1BQU07Ozs7Ozs7QUMzR1QsQUFxQkEsdUJBQU0saUNBQWlDLEdBQWE7SUFDbEQsT0FBTyxFQUFFLGlCQUFpQjs7SUFFMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLCtCQUErQixDQUFDO0lBQzlELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLHVCQUFNLDRCQUE0QixHQUFhO0lBQzdDLE9BQU8sRUFBRSxhQUFhOztJQUV0QixXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sK0JBQStCLENBQUM7SUFDOUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBWUY7Ozs7Ozs7O0lBUUUsWUFBNEIsU0FDUixnQkFDQSxXQUNBLFFBQ0E7UUFKUSxZQUFPLEdBQVAsT0FBTztRQUNmLG1CQUFjLEdBQWQsY0FBYztRQUNkLGNBQVMsR0FBVCxTQUFTO1FBQ1QsV0FBTSxHQUFOLE1BQU07UUFDTixvQkFBZSxHQUFmLGVBQWU7eUJBVmYsUUFBUSxDQUFDLFNBQVM7MEJBQ2pCLFFBQVEsQ0FBQyxTQUFTO2dDQUVaLFFBQVEsQ0FBQyxTQUFTOztRQVMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFhO1lBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNuQjtZQUNELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckMsQ0FBQyxDQUFDOztRQUdILElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsQyxDQUFDLENBQUM7S0FDSjs7Ozs7SUFFRCxjQUFjLENBQUMsSUFBWTtRQUN6QixxQkFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLEVBQUU7WUFDUix1QkFBTSxLQUFLLEdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtrQkFDL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUNsQyxDQUFDO1lBQ0osdUJBQU0sR0FBRyxHQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7a0JBQzdCLFVBQVUsQ0FDVixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUNsQyxDQUFDO1lBQ0osS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7U0FDakY7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDdkU7Ozs7O0lBRUQsUUFBUSxDQUFDLEtBQVk7O1FBRW5CLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQUMsS0FBSyxDQUFDLE1BQWEsR0FBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDbkI7Ozs7O0lBRUQsUUFBUSxDQUFDLENBQWtCO1FBQ3pCLHVCQUFNLE1BQU0sR0FBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUVyQyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsdUJBQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELHVCQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDdEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQzNDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztTQUMzQztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQzdGLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ3REO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDNUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7U0FDdEQ7S0FDRjs7Ozs7SUFFRCx5QkFBeUIsQ0FBQyxFQUFjO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7S0FDNUI7Ozs7O0lBRUQsVUFBVSxDQUFDLEtBQXNCO1FBQy9CLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQjthQUFNO1lBQ0wsdUJBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDO1lBQ3JELHVCQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDWixNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsVUFBVSwwREFBMEQsQ0FDaEYsQ0FBQzthQUNIO1lBRUQscUJBQUksTUFBTSxHQUF3QixFQUFFLENBQUM7WUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQzdCLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN4QixNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ2hCO1lBR0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxtQkFBQyxNQUFrQjtpQkFDOUIsR0FBRyxDQUFDLENBQUMsSUFBWSxLQUNoQixTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUMxRixHQUFHLENBQUMsQ0FBQyxJQUFVLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUNwQzs7Ozs7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDckMsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFL0UsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FDdkU7Ozs7O0lBR0QsZ0JBQWdCLENBQUMsRUFBYztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztLQUNyQjs7Ozs7SUFHRCxpQkFBaUIsQ0FBQyxFQUFjO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0tBQ3RCOzs7O0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztLQUNuQjs7OztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNwRTs7O1lBMUpGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMEJBQTBCO2dCQUNwQyxJQUFJLEVBQUU7b0JBQ0osVUFBVSxFQUFFLGtCQUFrQjtvQkFDOUIsYUFBYSxFQUFFLFFBQVE7b0JBQ3ZCLFFBQVEsRUFBRSxVQUFVO2lCQUNyQjtnQkFDRCxTQUFTLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSw0QkFBNEIsQ0FBQzthQUM3RTs7OztZQTFCUSwwQkFBMEIsdUJBbUNwQixJQUFJO1lBbENWLGVBQWU7WUFadEIsU0FBUztZQUpULFVBQVU7WUFGVixpQkFBaUI7Ozs7Ozs7QUNEbkI7OztZQUVDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7OztHQWVUO2FBQ0Y7Ozs7Ozs7QUNwQkQ7OztZQUVDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixRQUFRLEVBQUUsOERBQThEO2FBQ3pFOzs7O3NCQUVFLEtBQUs7Ozs7Ozs7QUNQUjs7O1lBT0MsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLFFBQVEsRUFBRTs7Ozs7R0FLVDtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNoRDs7OzttQ0FFRSxLQUFLO3VCQUNMLEtBQUs7Ozs7Ozs7QUNuQlI7Ozs7OztJQThCRSxZQUNVLFNBQ0EsUUFDQTtRQUZBLFlBQU8sR0FBUCxPQUFPO1FBQ1AsV0FBTSxHQUFOLE1BQU07UUFDTixjQUFTLEdBQVQsU0FBUztLQUNkOzs7O0lBRUwsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFO1lBQ3JFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNuRjtLQUNGOzs7WUE1QkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSw0QkFBNEI7Z0JBQ3RDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxJQUFJLEVBQUU7b0JBQ0osa0JBQWtCLEVBQUUsZ0JBQWdCO29CQUNwQyx3QkFBd0IsRUFBRSxlQUFlO29CQUN6Qyx3QkFBd0IsRUFBRSxrQkFBa0I7b0JBQzVDLCtCQUErQixFQUFFLHlCQUF5QjtvQkFDMUQsa0JBQWtCLEVBQUUsZUFBZTtvQkFDbkMsc0JBQXNCLEVBQUUsc0JBQXNCO29CQUM5QyxvQkFBb0IsRUFBRSxvQkFBb0I7b0JBQzFDLGtCQUFrQixFQUFFLGdCQUFnQjtpQkFDckM7Z0JBQ0QsUUFBUSxFQUFFLGlCQUFpQjthQUM1Qjs7OztZQWpCUSxrQkFBa0I7WUFOekIsVUFBVTtZQUdWLFNBQVM7OztvQkFzQlIsS0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVCUjs7MEJBbUR5QixJQUFJLFlBQVksRUFBeUI7MEJBQ3pDLElBQUksWUFBWSxFQUF3Qjs7Ozs7O0lBRS9ELEtBQUssQ0FBQyxJQUFhO1FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUNsQixJQUFJLEdBQUcscUJBQXFCLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDLEVBQUUsQ0FDN0QsQ0FBQztLQUNIOzs7OztJQUVELElBQUksQ0FBQyxRQUE4QjtRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNoQzs7O1lBakRGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsK0JBQStCO2dCQUN6QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4QlQ7YUFDRjs7Ozt5QkFFRSxLQUFLOzJCQUVMLE1BQU07MkJBQ04sTUFBTTs7Ozs7OztBQ3BEVDs7OztJQW9FRSxZQUFvQixPQUEyQjtRQUEzQixZQUFPLEdBQVAsT0FBTyxDQUFvQjswQkFOeEIsSUFBSSxZQUFZLEVBQXFCOzBCQUNyQyxJQUFJLFlBQVksRUFBd0I7d0JBRTFDLElBQUksWUFBWSxFQUFnQjt1QkFDakMsSUFBSSxZQUFZLEVBQWtCO0tBRUY7Ozs7O0lBRXBELFVBQVUsQ0FBQyxLQUE0QjtRQUNyQyx1QkFBTSxJQUFJLEdBQUcscUJBQXFCLENBQUMsSUFBSSxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2pEOzs7OztJQUVELGNBQWMsQ0FBQyxLQUEyQjtRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3Qjs7Ozs7SUFFRCxTQUFTLENBQUMsS0FBbUI7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDM0I7Ozs7OztJQUVELFFBQVEsQ0FBQyxJQUFrQixFQUFFLFNBQWtCO1FBQzdDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzFELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7U0FDdEM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0tBQ3hDOzs7WUF4RUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7O2dCQUVqQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVDthQUNGOzs7O1lBMUNRLGtCQUFrQjs7O3lCQTRDeEIsS0FBSzt3QkFDTCxLQUFLOzJCQUVMLE1BQU07MkJBQ04sTUFBTTt5QkFFTixNQUFNO3dCQUNOLE1BQU07Ozs7Ozs7QUNsRVQ7OzBCQXdDeUIsSUFBSSxZQUFZLEVBQXFCOzBCQUNyQyxJQUFJLFlBQVksRUFBd0I7d0JBRTFDLElBQUksWUFBWSxFQUF5Qjt1QkFDMUMsSUFBSSxZQUFZLEVBQWtCOzs7Ozs7SUFFdEQsVUFBVSxDQUFDLEtBQTRCO1FBQ3JDLHVCQUFNLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDaEQ7Ozs7O0lBRUQsU0FBUyxDQUFDLEtBQTRCO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzNCOzs7Ozs7SUFFRCxVQUFVLENBQUMsSUFBMkIsRUFBRSxTQUFrQjtRQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0tBQ3hDOzs7OztJQUVELGNBQWMsQ0FBQyxLQUEyQjtRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3Qjs7O1lBbkRGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJUO2FBQ0Y7Ozs7eUJBRUUsS0FBSzsyQkFFTCxNQUFNOzJCQUNOLE1BQU07eUJBRU4sTUFBTTt3QkFDTixNQUFNOzs7Ozs7O0FDM0NUOztvQkF5QlMsSUFBSTtxQkFDSCxDQUFDO3VCQUNDLENBQUM7Ozs7WUF6QlosU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxlQUFlO2dCQUN6QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCVDthQUNGOzs7Ozs7O0FDeEJEOzswQkF5Q3lCLElBQUksWUFBWSxFQUFxQjswQkFDckMsSUFBSSxZQUFZLEVBQXdCO3dCQUUxQyxJQUFJLFlBQVksRUFBeUI7dUJBQzFDLElBQUksWUFBWSxFQUFrQjs7Ozs7O0lBRXRELFVBQVUsQ0FBQyxLQUE0QjtRQUNyQyx1QkFBTSxJQUFJLEdBQUcscUJBQXFCLENBQUMsSUFBSSxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ25FOzs7OztJQUVELFFBQVEsQ0FBQyxJQUEyQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMxQjs7Ozs7O0lBRUQsU0FBUyxDQUFDLElBQTJCLEVBQUUsU0FBa0I7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztLQUN4Qzs7Ozs7SUFFRCxjQUFjLENBQUMsS0FBMkI7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7OztZQW5ERixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtnQkFDbEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVDthQUNGOzs7O3lCQUVFLEtBQUs7MkJBRUwsTUFBTTsyQkFDTixNQUFNO3lCQUVOLE1BQU07d0JBQ04sTUFBTTs7Ozs7OztBQzdDVCxBQTRCQSx1QkFBTSxRQUFRLEdBQUc7SUFDZiw4QkFBOEI7SUFDOUIsbUNBQW1DO0lBRW5DLHFCQUFxQjtJQUNyQiwwQkFBMEI7SUFFMUIsK0JBQStCO0lBQy9CLDBCQUEwQjtDQUMzQixDQUFDO0FBeUJGOzs7O0lBQ0UsT0FBTyxPQUFPO1FBQ1osT0FBTztZQUNMLFFBQVEsRUFBRSxrQkFBa0I7WUFDNUIsU0FBUyxFQUFFO2dCQUNULHNCQUFzQjtnQkFDdEIsa0JBQWtCO2dCQUNsQixpQkFBaUI7Z0JBQ2pCLG1CQUFtQjtnQkFDbkIsa0JBQWtCO2dCQUNsQix1QkFBdUI7Z0JBQ3ZCLG1CQUFtQjtnQkFDbkIsZUFBZTthQUNoQjtTQUNGLENBQUM7S0FDSDs7O1lBdENGLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZCLFlBQVksRUFBRTtvQkFDWixpQ0FBaUM7b0JBQ2pDLDBCQUEwQjtvQkFDMUIsbUNBQW1DO29CQUNuQyx5QkFBeUI7b0JBRXpCLHlCQUF5QjtvQkFDekIsMkJBQTJCO29CQUMzQiw0QkFBNEI7b0JBQzVCLDRCQUE0QjtvQkFFNUIsMEJBQTBCO29CQUUxQixHQUFHLFFBQVE7aUJBQ1o7Z0JBQ0QsZUFBZSxFQUFFO29CQUNmLDhCQUE4QjtvQkFDOUIsbUNBQW1DO2lCQUNwQztnQkFDRCxPQUFPLEVBQUUsUUFBUTthQUNsQjs7Ozs7OztBQzdERDs7Ozs7OztJQUdFLE1BQU0sQ0FBQyxJQUFVLEVBQUUsTUFBYyxFQUFFLE1BQWM7UUFDL0MsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztLQUN6QztDQUNGOzs7Ozs7QUNMRDs7NkJBZ0RnRCxJQUFJLFlBQVksQ0FBTyxTQUFTLENBQUM7c0JBQ3hDLElBQUksWUFBWSxDQUFPLEtBQUssQ0FBQztnQ0FDbkIsSUFBSSxZQUFZLENBQU8sU0FBUyxDQUFDOzt1QkFHbkUsRUFBRTs7eUJBRUEsRUFBRTs7d0JBRUgsRUFBRTtxQkFJVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDOzZCQUNYLElBQUksYUFBYSxFQUFFOzs7OztRQWF4RCxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDOzs7Ozs7SUFHMUIsSUFBSSxVQUFVLENBQUMsS0FBVztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztLQUMxQjs7OztJQUdELFFBQVE7O1FBRU4sSUFBSSxDQUFDLFFBQVEsR0FBSSxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFFcEUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbkM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztTQUM5QjtLQUNGOzs7OztJQUlELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sZUFBWSxDQUFDO0tBQ3REOzs7OztJQUlELDJCQUEyQixDQUFDLFVBQWU7UUFDekMsSUFBSSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQ3pDLHVCQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQy9DLElBQ0UsYUFBYTtnQkFDYixhQUFhLFlBQVksSUFBSTtnQkFDN0IsYUFBYSxDQUFDLE9BQU8sRUFBRSxLQUFLLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUM3RCxFQUFFO2dCQUNBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzdDO1NBQ0Y7S0FDRjs7Ozs7O0lBRUQsaUJBQWlCLENBQUMsT0FBaUIsRUFBRSxJQUFZO1FBQy9DLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUM7U0FDcEM7UUFFRCxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztTQUNuQztLQUNGOzs7Ozs7SUFFRCxPQUFPLENBQUMsS0FBVyxFQUFFLEtBQVc7UUFDOUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDOUMsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDN0M7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUMvRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDL0M7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDOUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDO0tBQ2Y7Ozs7OztJQUVELHFCQUFxQixDQUFDLE9BQWlCLEVBQUUsSUFBWTtRQUNuRCxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7WUFDbEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztTQUN0QztRQUVELElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRTtZQUNwQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsT0FBTyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLENBQUM7U0FDdkM7S0FDRjs7OztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUM5QjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ25FLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDakUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDL0I7S0FDRjs7Ozs7O0lBRUQsVUFBVSxDQUFDLElBQVUsRUFBRSxNQUFjO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDN0Q7Ozs7O0lBR0QsUUFBUSxDQUFDLFVBQWU7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFFbkMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7Ozs7OztJQUdELGdCQUFnQixDQUFDLElBQVUsRUFBRSxNQUFjOztRQUV6Qyx1QkFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQ3hCLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FDZixDQUFDO1FBQ0YsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRSxPQUFPLFVBQVUsQ0FBQztLQUNuQjs7Ozs7O0lBR0QsS0FBSyxDQUFDLEdBQVUsRUFBRSxJQUFZOztRQUU1Qix1QkFBTSxNQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsT0FBTyxNQUFNLENBQUM7S0FDZjs7Ozs7SUFRRCxXQUFXLENBQUMsSUFBVTtRQUNwQix1QkFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTlCLE9BQU8sSUFBSSxJQUFJLENBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNsQixJQUFJLENBQUMsUUFBUSxFQUFFLEVBQ2YsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNkLEtBQUssS0FBSyxFQUFFLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQzdCLENBQUM7S0FDSDs7Ozs7O0lBRUQsTUFBTSxDQUFDLElBQVUsRUFBRSxRQUFRLEdBQUcsSUFBSTtRQUNoQyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNqRDtZQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQ3hCLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FDZixDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDMUM7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNsQixJQUFJLENBQUMsUUFBUSxFQUFFLEVBQ2YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUNmLENBQUM7WUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELElBQUksUUFBUSxFQUFFO2dCQUNaLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FDNUMsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQ3BCOzs7OztJQUVELElBQUksQ0FBQyxTQUFpQjs7UUFFcEIscUJBQUksWUFBaUIsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFO1lBQ2pDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLE9BQU8sRUFBRTtZQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUMvQjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxNQUFNLEVBQUU7WUFDbEMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDOUI7UUFFRCxJQUFJLFlBQVksRUFBRTtZQUNoQix1QkFBTSxJQUFJLEdBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxTQUFTLElBQUksWUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RSx1QkFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxTQUFTLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFM0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdDO0tBQ0Y7Ozs7O0lBRUQsVUFBVSxDQUFDLFVBQWtCO1FBQzNCLHVCQUFNLFNBQVMsR0FBRyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBRWxDLElBQ0UsQ0FBQyxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxLQUFLLENBQUM7YUFDdkQsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FDM0QsRUFBRTtZQUNBLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFNBQVMsQ0FDcEQsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNwQjs7Ozs7SUFFUyxxQkFBcUIsQ0FBQyxJQUFVO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7O1FBRUQsdUJBQU0saUJBQWlCLEdBS25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBZ0I7WUFDekMsUUFDRSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQzdDLFdBQVcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFDeEM7U0FDSCxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRVQsT0FBTyxpQkFBaUIsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQztLQUN2RTs7Ozs7O0lBRVMsbUJBQW1CLENBQzNCLGFBQTJDLEVBQzNDLEtBQVc7UUFFWCxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN0RCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELElBQUksYUFBYSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDMUQ7UUFFRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM5RCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDNUQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzRDtRQUVELE9BQU8sU0FBUyxDQUFDO0tBQ2xCOzs7OztJQUVTLFVBQVUsQ0FBQyxJQUFVO1FBQzdCLHFCQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUN2QixDQUFDLFlBQTBDO2dCQUN6QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN0RCxjQUFjLEdBQUcsSUFBSSxDQUFDO2lCQUN2QjthQUNGLENBQ0YsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLGNBQWM7Z0JBQ1osY0FBYztvQkFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNoRDtRQUVELFFBQ0UsY0FBYzthQUNiLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNyRCxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDdEQ7S0FDSDs7O1lBclhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7Ozs7O0dBS1Q7YUFDRjs7Ozt1QkFFRSxLQUFLOytCQUNMLEtBQUs7NEJBQ0wsS0FBSzswQkFDTCxLQUFLO3dCQUVMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7MEJBQ0wsS0FBSzswQkFDTCxLQUFLOzRCQUNMLEtBQUs7MkJBQ0wsS0FBSztnQ0FDTCxLQUFLOytCQUNMLEtBQUs7aUNBQ0wsS0FBSztpQ0FDTCxLQUFLO29DQUNMLEtBQUs7NEJBQ0wsS0FBSzs4QkFDTCxLQUFLOzZCQUNMLEtBQUs7NkJBQ0wsS0FBSzs0QkFDTCxLQUFLO3lCQUNMLEtBQUs7OEJBRUwsTUFBTTt1QkFDTixNQUFNO2lDQUNOLE1BQU07MkJBd0JOLEtBQUs7Ozs7Ozs7QUMzRVI7O3NCQUlXLElBQUk7OEJBQ0ksS0FBSzsyQkFDUixDQUFDO3lCQUNILEVBQUU7dUJBQ0osS0FBSzt1QkFDTCxNQUFNO3lCQUNKLElBQUk7eUJBQ0osSUFBSTsyQkFDRixNQUFNOzBCQUNQLE1BQU07K0JBQ0QsSUFBSTs4QkFDTCxXQUFXO2dDQUNULE1BQU07Z0NBQ04sS0FBSzs2QkFDUixDQUFDOzRCQUNGLENBQUM7bUNBQ00sS0FBSzs7OztZQWxCNUIsVUFBVTs7Ozs7OztBQ0ZYLHVCQWFhLGlDQUFpQyxHQUFhO0lBQ3pELE9BQU8sRUFBRSxpQkFBaUI7O0lBRTFCLFdBQVcsRUFBRSxVQUFVLENBQUMsTUFBTSxtQkFBbUIsQ0FBQztJQUNsRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7O0FBeUNGOzs7O0lBOEVFLFlBQVksTUFBd0I7Ozs7OEJBNUVWLEtBQUs7Ozs7eUJBWVYsSUFBSTs2QkEyQ1csSUFBSSxZQUFZLENBQU8sU0FBUyxDQUFDOzs7O2dDQUk5QixJQUFJLFlBQVksQ0FDckQsU0FBUyxDQUNWOzt3QkFNZSxRQUFRLENBQUMsU0FBUzs7eUJBRWpCLFFBQVEsQ0FBQyxTQUFTO29CQUlaLElBQUksSUFBSSxFQUFFO1FBSS9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0tBQ3pCOzs7OztRQWpDRyxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Ozs7OztJQUd2QyxJQUFJLFVBQVUsQ0FBQyxLQUFXO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0tBQzFCOzs7O0lBNkJELGdCQUFnQjtRQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNsQzs7Ozs7SUFFRCxRQUFRLENBQUMsS0FBVztRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3RCOzs7OztJQUVELGVBQWUsQ0FBQyxLQUFXO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2hDOzs7OztJQUVELGtCQUFrQixDQUFDLEtBQVc7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNuQzs7Ozs7SUFHRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNELE9BQU87U0FDUjtRQUNELElBQUksS0FBSyxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXRDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0tBQ3BEOzs7OztJQUVELGdCQUFnQixDQUFDLEVBQWM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7S0FDcEI7Ozs7O0lBRUQsaUJBQWlCLENBQUMsRUFBYztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztLQUNyQjs7O1lBL0pGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQWdDUDtnQkFDSCxTQUFTLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQzthQUMvQzs7OztZQTlDUSxnQkFBZ0I7OzsrQkFrRHRCLEtBQUs7eUJBRUwsS0FBSzt3QkFFTCxLQUFLO3dCQUVMLEtBQUs7d0JBRUwsS0FBSzt3QkFFTCxLQUFLOzBCQUVMLEtBQUs7MEJBRUwsS0FBSzs0QkFFTCxLQUFLOzJCQUVMLEtBQUs7Z0NBRUwsS0FBSzsrQkFFTCxLQUFLO2lDQUVMLEtBQUs7NEJBRUwsS0FBSzswQkFFTCxLQUFLO2lDQUVMLEtBQUs7b0NBRUwsS0FBSzs4QkFFTCxLQUFLOzZCQUVMLEtBQUs7NEJBRUwsS0FBSzs2QkFFTCxLQUFLOzRCQUVMLEtBQUs7MkJBR0wsS0FBSzs4QkFTTCxNQUFNO2lDQUlOLE1BQU07NEJBS04sU0FBUyxTQUFDLHdCQUF3Qjs7Ozs7OztBQzFIckM7Ozs7SUE0RkUsWUFBWSxVQUFvQztzQkFOaEMsRUFBRTtvQkFFSixFQUFFOzJCQUNRLEVBQUU7UUFJeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7S0FDOUI7Ozs7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDakI7Ozs7SUFNRCxRQUFRO1FBQ04sdUJBQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUVsQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDO1lBQ3BDLHVCQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNDLHVCQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLHVCQUFNLGVBQWUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pELHVCQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvRCx1QkFBTSw2QkFBNkIsR0FDakMsVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQ2hELHVCQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUV0RCxJQUFJLDZCQUE2QixHQUFHLENBQUMsRUFBRTtnQkFDckMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLDZCQUE2QixHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3ZEOztZQUdELHVCQUFNLEtBQUssR0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCx1QkFBTSxJQUFJLEdBQVUsRUFBRSxDQUFDO1lBQ3ZCLEtBQUsscUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQix1QkFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BFLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssQ0FBQztnQkFDdEQsV0FBVyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7YUFDdkI7WUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNqQixLQUFLLHFCQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQ25DLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ1osSUFBSSxDQUFDLGVBQWUsQ0FDckIsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDN0Q7WUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVoQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUN0Qix1QkFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO2dCQUNyRCx1QkFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLEtBQUsscUJBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQ2xFLENBQUM7aUJBQ0g7YUFDRjtTQUNGLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFVixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFVBQ2hDLEtBQVcsRUFDWCxLQUFXO1lBRVgsdUJBQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUUsdUJBQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3BDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFVixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQy9COzs7Ozs7SUFFUyxRQUFRLENBQUMsU0FBZSxFQUFFLENBQVM7UUFDM0MsdUJBQU0sS0FBSyxHQUFXLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLHFCQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1QyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YscUJBQUksSUFBVSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1osSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDbEIsT0FBTyxHQUFHLElBQUksSUFBSSxDQUNoQixJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ2xCLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZixJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUNuQixDQUFDO1NBQ0g7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNkOzs7OztJQUVTLG9CQUFvQixDQUFDLElBQVU7UUFDdkMsdUJBQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDOztRQUUzQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsdUJBQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7UUFFakMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLFFBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQ3ZFO0tBQ0g7OztZQWxNRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpRVQ7eUJBRUM7Ozs7Ozs7OztHQVNEO2FBRUY7Ozs7O1lBbEZRLHdCQUF3Qjs7Ozs7OztBQ0ZqQzs7OztJQXlERSxZQUFZLFVBQW9DO29CQUpsQyxFQUFFO1FBS2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7S0FDOUI7Ozs7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDakI7Ozs7SUFFRCxRQUFRO1FBQ04sdUJBQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUVsQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUV6QyxJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDO1lBQ3BDLHVCQUFNLE1BQU0sR0FBVSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQyx1QkFBTSxJQUFJLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuRCxxQkFBSSxJQUFVLENBQUM7WUFFZixLQUFLLHFCQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQ3pDO1lBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9ELEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFWixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFVBQ2hDLEtBQVcsRUFDWCxLQUFXO1lBRVgsdUJBQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMzRCx1QkFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzNELE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNwQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRVosSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUMvQjs7O1lBM0ZGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DVDt5QkFFQzs7OztHQUlEO2FBRUY7Ozs7O1lBL0NRLHdCQUF3Qjs7Ozs7OztBQ0hqQzs7OztJQXlERSxZQUFZLFVBQW9DO29CQUZsQyxFQUFFO1FBR2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7S0FDOUI7Ozs7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDakI7Ozs7SUFFRCxRQUFRO1FBQ04sdUJBQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUVsQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWhFLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUM7WUFDcEMsdUJBQU0sS0FBSyxHQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQyxxQkFBSSxJQUFVLENBQUM7WUFDZix1QkFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFFbEUsS0FBSyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hELEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQ3hDO1lBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUNqRSxLQUFLLENBQ04sQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM3RCxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRVgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxVQUNoQyxLQUFXLEVBQ1gsS0FBVztZQUVYLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNsRCxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRVgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUMvQjs7Ozs7SUFFUyxlQUFlLENBQUMsSUFBWTs7UUFFcEMsUUFDRSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUN0RTtLQUNIOzs7WUFsR0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxZQUFZO2dCQUN0QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVDt5QkFFQzs7OztHQUlEO2FBRUY7Ozs7WUFoRFEsd0JBQXdCOzs7Ozs7O0FDTGpDOzs7O0lBOEJFLE9BQU8sT0FBTztRQUNaLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0tBQ3RFOzs7WUFyQkYsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7Z0JBQ3BDLFlBQVksRUFBRTtvQkFDWixtQkFBbUI7b0JBQ25CLHdCQUF3QjtvQkFDeEIsa0JBQWtCO29CQUNsQixvQkFBb0I7b0JBQ3BCLG1CQUFtQjtpQkFDcEI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLG1CQUFtQjtvQkFDbkIsd0JBQXdCO29CQUN4QixrQkFBa0I7b0JBQ2xCLG9CQUFvQjtvQkFDcEIsbUJBQW1CO2lCQUNwQjtnQkFDRCxlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQzthQUN2Qzs7Ozs7Ozs7Ozs7Ozs7OyJ9