@firestitch/common 8.0.10

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 (304) hide show
  1. package/app/directives/autofocus.directive.d.ts +6 -0
  2. package/app/directives/prevent-default.directive.d.ts +3 -0
  3. package/app/directives/stop-propagation.directive.d.ts +3 -0
  4. package/app/fs-common.module.d.ts +4 -0
  5. package/app/pipes/bytes.pipe.d.ts +4 -0
  6. package/app/pipes/currency.pipe.d.ts +6 -0
  7. package/app/pipes/number.pipe.d.ts +4 -0
  8. package/app/pipes/ordinal-number.pipe.d.ts +4 -0
  9. package/app/pipes/truncate.pipe.d.ts +5 -0
  10. package/app/pipes/util.pipe.d.ts +15 -0
  11. package/app/services/array.service.d.ts +58 -0
  12. package/app/services/math.service.d.ts +6 -0
  13. package/app/services/util.service.d.ts +86 -0
  14. package/app/services/vaildate.service.d.ts +13 -0
  15. package/bundles/firestitch-common.umd.js +3548 -0
  16. package/bundles/firestitch-common.umd.js.map +1 -0
  17. package/bundles/firestitch-common.umd.min.js +16 -0
  18. package/bundles/firestitch-common.umd.min.js.map +1 -0
  19. package/esm2015/app/directives/autofocus.directive.js +42 -0
  20. package/esm2015/app/directives/prevent-default.directive.js +24 -0
  21. package/esm2015/app/directives/stop-propagation.directive.js +24 -0
  22. package/esm2015/app/fs-common.module.js +72 -0
  23. package/esm2015/app/pipes/bytes.pipe.js +22 -0
  24. package/esm2015/app/pipes/currency.pipe.js +38 -0
  25. package/esm2015/app/pipes/number.pipe.js +23 -0
  26. package/esm2015/app/pipes/ordinal-number.pipe.js +22 -0
  27. package/esm2015/app/pipes/truncate.pipe.js +28 -0
  28. package/esm2015/app/pipes/util.pipe.js +71 -0
  29. package/esm2015/app/services/array.service.js +352 -0
  30. package/esm2015/app/services/math.service.js +29 -0
  31. package/esm2015/app/services/util.service.js +430 -0
  32. package/esm2015/app/services/vaildate.service.js +48 -0
  33. package/esm2015/firestitch-common.js +19 -0
  34. package/esm2015/libs/array/compare/compare.js +19 -0
  35. package/esm2015/libs/array/compare/index.js +7 -0
  36. package/esm2015/libs/array/filter/filter.js +53 -0
  37. package/esm2015/libs/array/filter/index.js +7 -0
  38. package/esm2015/libs/array/find/find.js +17 -0
  39. package/esm2015/libs/array/find/index.js +7 -0
  40. package/esm2015/libs/array/inArray/inArray.js +22 -0
  41. package/esm2015/libs/array/inArray/index.js +7 -0
  42. package/esm2015/libs/array/index/index.js +24 -0
  43. package/esm2015/libs/array/index.js +19 -0
  44. package/esm2015/libs/array/indexOf/index.js +7 -0
  45. package/esm2015/libs/array/indexOf/indexOf.js +31 -0
  46. package/esm2015/libs/array/keyExists/index.js +7 -0
  47. package/esm2015/libs/array/keyExists/keyExists.js +14 -0
  48. package/esm2015/libs/array/ksort/index.js +7 -0
  49. package/esm2015/libs/array/ksort/ksort.js +22 -0
  50. package/esm2015/libs/array/list/index.js +7 -0
  51. package/esm2015/libs/array/list/list.js +30 -0
  52. package/esm2015/libs/array/nameValue/index.js +7 -0
  53. package/esm2015/libs/array/nameValue/nameValue.js +52 -0
  54. package/esm2015/libs/array/remove/index.js +7 -0
  55. package/esm2015/libs/array/remove/remove.js +20 -0
  56. package/esm2015/libs/array/rsort/index.js +7 -0
  57. package/esm2015/libs/array/rsort/rsort.js +15 -0
  58. package/esm2015/libs/array/sort/index.js +7 -0
  59. package/esm2015/libs/array/sort/sort.js +44 -0
  60. package/esm2015/libs/format/acronym/acronym.js +34 -0
  61. package/esm2015/libs/format/acronym/index.js +7 -0
  62. package/esm2015/libs/format/bytes/bytes.js +23 -0
  63. package/esm2015/libs/format/bytes/index.js +7 -0
  64. package/esm2015/libs/format/currency/currency.js +20 -0
  65. package/esm2015/libs/format/currency/index.js +7 -0
  66. package/esm2015/libs/format/index.js +11 -0
  67. package/esm2015/libs/format/number/index.js +7 -0
  68. package/esm2015/libs/format/number/number.js +14 -0
  69. package/esm2015/libs/format/truncate/index.js +7 -0
  70. package/esm2015/libs/format/truncate/truncate.js +25 -0
  71. package/esm2015/libs/index.js +11 -0
  72. package/esm2015/libs/rxjs/delayedRetry.js +58 -0
  73. package/esm2015/libs/util/boolean/boolean.js +14 -0
  74. package/esm2015/libs/util/boolean/index.js +7 -0
  75. package/esm2015/libs/util/debounce/debounce.js +40 -0
  76. package/esm2015/libs/util/debounce/index.js +7 -0
  77. package/esm2015/libs/util/get-normalized-path/get-normalized-path.js +16 -0
  78. package/esm2015/libs/util/get-normalized-path/index.js +7 -0
  79. package/esm2015/libs/util/guid/guid.js +36 -0
  80. package/esm2015/libs/util/guid/index.js +7 -0
  81. package/esm2015/libs/util/index.js +23 -0
  82. package/esm2015/libs/util/isClass/index.js +7 -0
  83. package/esm2015/libs/util/isClass/isClass.js +28 -0
  84. package/esm2015/libs/util/isEmpty/index.js +7 -0
  85. package/esm2015/libs/util/isEmpty/isEmpty.js +23 -0
  86. package/esm2015/libs/util/isNumeric/index.js +7 -0
  87. package/esm2015/libs/util/isNumeric/isNumeric.js +16 -0
  88. package/esm2015/libs/util/keys/index.js +7 -0
  89. package/esm2015/libs/util/keys/keys.js +80 -0
  90. package/esm2015/libs/util/length/index.js +7 -0
  91. package/esm2015/libs/util/length/length.js +20 -0
  92. package/esm2015/libs/util/ordinal-number/ordinal-number.js +20 -0
  93. package/esm2015/libs/util/queue/index.js +8 -0
  94. package/esm2015/libs/util/queue/operation.js +32 -0
  95. package/esm2015/libs/util/queue/queue.enum.js +12 -0
  96. package/esm2015/libs/util/queue/queue.js +291 -0
  97. package/esm2015/libs/util/remove-query-params/index.js +7 -0
  98. package/esm2015/libs/util/remove-query-params/remove-query-params.js +13 -0
  99. package/esm2015/libs/util/resolve/index.js +7 -0
  100. package/esm2015/libs/util/resolve/resolve.js +33 -0
  101. package/esm2015/libs/util/stringify/index.js +7 -0
  102. package/esm2015/libs/util/stringify/stringify.js +13 -0
  103. package/esm2015/libs/util/throttle/index.js +7 -0
  104. package/esm2015/libs/util/throttle/throttle.js +30 -0
  105. package/esm2015/libs/util/uuid/index.js +7 -0
  106. package/esm2015/libs/util/uuid/uuid.js +13 -0
  107. package/esm2015/libs/util/value/index.js +7 -0
  108. package/esm2015/libs/util/value/value.js +20 -0
  109. package/esm2015/libs/validate/email/email.js +13 -0
  110. package/esm2015/libs/validate/email/index.js +7 -0
  111. package/esm2015/libs/validate/index.js +9 -0
  112. package/esm2015/libs/validate/phone/index.js +7 -0
  113. package/esm2015/libs/validate/phone/phone.js +15 -0
  114. package/esm2015/libs/validate/url/index.js +7 -0
  115. package/esm2015/libs/validate/url/url.js +23 -0
  116. package/esm2015/public_api.js +17 -0
  117. package/esm5/app/directives/autofocus.directive.js +45 -0
  118. package/esm5/app/directives/prevent-default.directive.js +32 -0
  119. package/esm5/app/directives/stop-propagation.directive.js +32 -0
  120. package/esm5/app/fs-common.module.js +79 -0
  121. package/esm5/app/pipes/bytes.pipe.js +30 -0
  122. package/esm5/app/pipes/currency.pipe.js +43 -0
  123. package/esm5/app/pipes/number.pipe.js +32 -0
  124. package/esm5/app/pipes/ordinal-number.pipe.js +30 -0
  125. package/esm5/app/pipes/truncate.pipe.js +38 -0
  126. package/esm5/app/pipes/util.pipe.js +100 -0
  127. package/esm5/app/services/array.service.js +491 -0
  128. package/esm5/app/services/math.service.js +42 -0
  129. package/esm5/app/services/util.service.js +608 -0
  130. package/esm5/app/services/vaildate.service.js +63 -0
  131. package/esm5/firestitch-common.js +19 -0
  132. package/esm5/libs/array/compare/compare.js +19 -0
  133. package/esm5/libs/array/compare/index.js +7 -0
  134. package/esm5/libs/array/filter/filter.js +53 -0
  135. package/esm5/libs/array/filter/index.js +7 -0
  136. package/esm5/libs/array/find/find.js +17 -0
  137. package/esm5/libs/array/find/index.js +7 -0
  138. package/esm5/libs/array/inArray/inArray.js +22 -0
  139. package/esm5/libs/array/inArray/index.js +7 -0
  140. package/esm5/libs/array/index/index.js +24 -0
  141. package/esm5/libs/array/index.js +19 -0
  142. package/esm5/libs/array/indexOf/index.js +7 -0
  143. package/esm5/libs/array/indexOf/indexOf.js +31 -0
  144. package/esm5/libs/array/keyExists/index.js +7 -0
  145. package/esm5/libs/array/keyExists/keyExists.js +14 -0
  146. package/esm5/libs/array/ksort/index.js +7 -0
  147. package/esm5/libs/array/ksort/ksort.js +22 -0
  148. package/esm5/libs/array/list/index.js +7 -0
  149. package/esm5/libs/array/list/list.js +31 -0
  150. package/esm5/libs/array/nameValue/index.js +7 -0
  151. package/esm5/libs/array/nameValue/nameValue.js +52 -0
  152. package/esm5/libs/array/remove/index.js +7 -0
  153. package/esm5/libs/array/remove/remove.js +20 -0
  154. package/esm5/libs/array/rsort/index.js +7 -0
  155. package/esm5/libs/array/rsort/rsort.js +15 -0
  156. package/esm5/libs/array/sort/index.js +7 -0
  157. package/esm5/libs/array/sort/sort.js +45 -0
  158. package/esm5/libs/format/acronym/acronym.js +35 -0
  159. package/esm5/libs/format/acronym/index.js +7 -0
  160. package/esm5/libs/format/bytes/bytes.js +23 -0
  161. package/esm5/libs/format/bytes/index.js +7 -0
  162. package/esm5/libs/format/currency/currency.js +23 -0
  163. package/esm5/libs/format/currency/index.js +7 -0
  164. package/esm5/libs/format/index.js +11 -0
  165. package/esm5/libs/format/number/index.js +7 -0
  166. package/esm5/libs/format/number/number.js +14 -0
  167. package/esm5/libs/format/truncate/index.js +7 -0
  168. package/esm5/libs/format/truncate/truncate.js +28 -0
  169. package/esm5/libs/index.js +11 -0
  170. package/esm5/libs/rxjs/delayedRetry.js +65 -0
  171. package/esm5/libs/util/boolean/boolean.js +14 -0
  172. package/esm5/libs/util/boolean/index.js +7 -0
  173. package/esm5/libs/util/debounce/debounce.js +40 -0
  174. package/esm5/libs/util/debounce/index.js +7 -0
  175. package/esm5/libs/util/get-normalized-path/get-normalized-path.js +16 -0
  176. package/esm5/libs/util/get-normalized-path/index.js +7 -0
  177. package/esm5/libs/util/guid/guid.js +37 -0
  178. package/esm5/libs/util/guid/index.js +7 -0
  179. package/esm5/libs/util/index.js +23 -0
  180. package/esm5/libs/util/isClass/index.js +7 -0
  181. package/esm5/libs/util/isClass/isClass.js +28 -0
  182. package/esm5/libs/util/isEmpty/index.js +7 -0
  183. package/esm5/libs/util/isEmpty/isEmpty.js +23 -0
  184. package/esm5/libs/util/isNumeric/index.js +7 -0
  185. package/esm5/libs/util/isNumeric/isNumeric.js +16 -0
  186. package/esm5/libs/util/keys/index.js +7 -0
  187. package/esm5/libs/util/keys/keys.js +80 -0
  188. package/esm5/libs/util/length/index.js +7 -0
  189. package/esm5/libs/util/length/length.js +20 -0
  190. package/esm5/libs/util/ordinal-number/ordinal-number.js +22 -0
  191. package/esm5/libs/util/queue/index.js +8 -0
  192. package/esm5/libs/util/queue/operation.js +30 -0
  193. package/esm5/libs/util/queue/queue.enum.js +12 -0
  194. package/esm5/libs/util/queue/queue.js +367 -0
  195. package/esm5/libs/util/remove-query-params/index.js +7 -0
  196. package/esm5/libs/util/remove-query-params/remove-query-params.js +13 -0
  197. package/esm5/libs/util/resolve/index.js +7 -0
  198. package/esm5/libs/util/resolve/resolve.js +34 -0
  199. package/esm5/libs/util/stringify/index.js +7 -0
  200. package/esm5/libs/util/stringify/stringify.js +13 -0
  201. package/esm5/libs/util/throttle/index.js +7 -0
  202. package/esm5/libs/util/throttle/throttle.js +30 -0
  203. package/esm5/libs/util/uuid/index.js +7 -0
  204. package/esm5/libs/util/uuid/uuid.js +13 -0
  205. package/esm5/libs/util/value/index.js +7 -0
  206. package/esm5/libs/util/value/value.js +20 -0
  207. package/esm5/libs/validate/email/email.js +13 -0
  208. package/esm5/libs/validate/email/index.js +7 -0
  209. package/esm5/libs/validate/index.js +9 -0
  210. package/esm5/libs/validate/phone/index.js +7 -0
  211. package/esm5/libs/validate/phone/phone.js +15 -0
  212. package/esm5/libs/validate/url/index.js +7 -0
  213. package/esm5/libs/validate/url/url.js +23 -0
  214. package/esm5/public_api.js +17 -0
  215. package/fesm2015/firestitch-common.js +2769 -0
  216. package/fesm2015/firestitch-common.js.map +1 -0
  217. package/fesm5/firestitch-common.js +3284 -0
  218. package/fesm5/firestitch-common.js.map +1 -0
  219. package/firestitch-common.d.ts +13 -0
  220. package/firestitch-common.metadata.json +1 -0
  221. package/libs/array/compare/compare.d.ts +1 -0
  222. package/libs/array/compare/index.d.ts +1 -0
  223. package/libs/array/filter/filter.d.ts +1 -0
  224. package/libs/array/filter/index.d.ts +1 -0
  225. package/libs/array/find/find.d.ts +1 -0
  226. package/libs/array/find/index.d.ts +1 -0
  227. package/libs/array/inArray/inArray.d.ts +1 -0
  228. package/libs/array/inArray/index.d.ts +1 -0
  229. package/libs/array/index/index.d.ts +1 -0
  230. package/libs/array/index.d.ts +13 -0
  231. package/libs/array/indexOf/index.d.ts +1 -0
  232. package/libs/array/indexOf/indexOf.d.ts +1 -0
  233. package/libs/array/keyExists/index.d.ts +1 -0
  234. package/libs/array/keyExists/keyExists.d.ts +1 -0
  235. package/libs/array/ksort/index.d.ts +1 -0
  236. package/libs/array/ksort/ksort.d.ts +1 -0
  237. package/libs/array/list/index.d.ts +1 -0
  238. package/libs/array/list/list.d.ts +1 -0
  239. package/libs/array/nameValue/index.d.ts +1 -0
  240. package/libs/array/nameValue/nameValue.d.ts +1 -0
  241. package/libs/array/remove/index.d.ts +1 -0
  242. package/libs/array/remove/remove.d.ts +1 -0
  243. package/libs/array/rsort/index.d.ts +1 -0
  244. package/libs/array/rsort/rsort.d.ts +1 -0
  245. package/libs/array/sort/index.d.ts +1 -0
  246. package/libs/array/sort/sort.d.ts +1 -0
  247. package/libs/format/acronym/acronym.d.ts +1 -0
  248. package/libs/format/acronym/index.d.ts +1 -0
  249. package/libs/format/bytes/bytes.d.ts +1 -0
  250. package/libs/format/bytes/index.d.ts +1 -0
  251. package/libs/format/currency/currency.d.ts +1 -0
  252. package/libs/format/currency/index.d.ts +1 -0
  253. package/libs/format/index.d.ts +5 -0
  254. package/libs/format/number/index.d.ts +1 -0
  255. package/libs/format/number/number.d.ts +1 -0
  256. package/libs/format/truncate/index.d.ts +1 -0
  257. package/libs/format/truncate/truncate.d.ts +1 -0
  258. package/libs/index.d.ts +5 -0
  259. package/libs/rxjs/delayedRetry.d.ts +2 -0
  260. package/libs/util/boolean/boolean.d.ts +1 -0
  261. package/libs/util/boolean/index.d.ts +1 -0
  262. package/libs/util/debounce/debounce.d.ts +1 -0
  263. package/libs/util/debounce/index.d.ts +1 -0
  264. package/libs/util/get-normalized-path/get-normalized-path.d.ts +2 -0
  265. package/libs/util/get-normalized-path/index.d.ts +1 -0
  266. package/libs/util/guid/guid.d.ts +1 -0
  267. package/libs/util/guid/index.d.ts +1 -0
  268. package/libs/util/index.d.ts +17 -0
  269. package/libs/util/isClass/index.d.ts +1 -0
  270. package/libs/util/isClass/isClass.d.ts +1 -0
  271. package/libs/util/isEmpty/index.d.ts +1 -0
  272. package/libs/util/isEmpty/isEmpty.d.ts +1 -0
  273. package/libs/util/isNumeric/index.d.ts +1 -0
  274. package/libs/util/isNumeric/isNumeric.d.ts +1 -0
  275. package/libs/util/keys/index.d.ts +1 -0
  276. package/libs/util/keys/keys.d.ts +37 -0
  277. package/libs/util/length/index.d.ts +1 -0
  278. package/libs/util/length/length.d.ts +1 -0
  279. package/libs/util/ordinal-number/ordinal-number.d.ts +1 -0
  280. package/libs/util/queue/index.d.ts +2 -0
  281. package/libs/util/queue/operation.d.ts +7 -0
  282. package/libs/util/queue/queue.d.ts +32 -0
  283. package/libs/util/queue/queue.enum.d.ts +4 -0
  284. package/libs/util/remove-query-params/index.d.ts +1 -0
  285. package/libs/util/remove-query-params/remove-query-params.d.ts +1 -0
  286. package/libs/util/resolve/index.d.ts +1 -0
  287. package/libs/util/resolve/resolve.d.ts +1 -0
  288. package/libs/util/stringify/index.d.ts +1 -0
  289. package/libs/util/stringify/stringify.d.ts +1 -0
  290. package/libs/util/throttle/index.d.ts +1 -0
  291. package/libs/util/throttle/throttle.d.ts +1 -0
  292. package/libs/util/uuid/index.d.ts +1 -0
  293. package/libs/util/uuid/uuid.d.ts +1 -0
  294. package/libs/util/value/index.d.ts +1 -0
  295. package/libs/util/value/value.d.ts +1 -0
  296. package/libs/validate/email/email.d.ts +1 -0
  297. package/libs/validate/email/index.d.ts +1 -0
  298. package/libs/validate/index.d.ts +3 -0
  299. package/libs/validate/phone/index.d.ts +1 -0
  300. package/libs/validate/phone/phone.d.ts +1 -0
  301. package/libs/validate/url/index.d.ts +1 -0
  302. package/libs/validate/url/url.d.ts +7 -0
  303. package/package.json +33 -0
  304. package/public_api.d.ts +6 -0
@@ -0,0 +1,608 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: app/services/util.service.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import { Injectable } from '@angular/core';
7
+ /** @type {?} */
8
+ export var KEY_CANCEL = 3;
9
+ /** @type {?} */
10
+ export var KEY_HELP = 6;
11
+ /** @type {?} */
12
+ export var KEY_BACKSPACE = 8;
13
+ /** @type {?} */
14
+ export var KEY_TAB = 9;
15
+ /** @type {?} */
16
+ export var KEY_CLEAR = 12;
17
+ /** @type {?} */
18
+ export var KEY_RETURN = 13;
19
+ /** @type {?} */
20
+ export var KEY_ENTER = 14;
21
+ /** @type {?} */
22
+ export var KEY_SHIFT = 16;
23
+ /** @type {?} */
24
+ export var KEY_CONTROL = 17;
25
+ /** @type {?} */
26
+ export var KEY_ALT = 18;
27
+ /** @type {?} */
28
+ export var KEY_PAUSE = 19;
29
+ /** @type {?} */
30
+ export var KEY_CAPS_LOCK = 20;
31
+ /** @type {?} */
32
+ export var KEY_ESCAPE = 27;
33
+ /** @type {?} */
34
+ export var KEY_SPACE = 32;
35
+ /** @type {?} */
36
+ export var KEY_PAGE_UP = 33;
37
+ /** @type {?} */
38
+ export var KEY_PAGE_DOWN = 34;
39
+ /** @type {?} */
40
+ export var KEY_END = 35;
41
+ /** @type {?} */
42
+ export var KEY_HOME = 36;
43
+ /** @type {?} */
44
+ export var KEY_LEFT = 37;
45
+ /** @type {?} */
46
+ export var KEY_UP = 38;
47
+ /** @type {?} */
48
+ export var KEY_RIGHT = 39;
49
+ /** @type {?} */
50
+ export var KEY_DOWN = 40;
51
+ /** @type {?} */
52
+ export var KEY_PRINTSCREEN = 44;
53
+ /** @type {?} */
54
+ export var KEY_INSERT = 45;
55
+ /** @type {?} */
56
+ export var KEY_DELETE = 46;
57
+ /** @type {?} */
58
+ export var KEY_0 = 48;
59
+ /** @type {?} */
60
+ export var KEY_1 = 49;
61
+ /** @type {?} */
62
+ export var KEY_2 = 50;
63
+ /** @type {?} */
64
+ export var KEY_3 = 51;
65
+ /** @type {?} */
66
+ export var KEY_4 = 52;
67
+ /** @type {?} */
68
+ export var KEY_5 = 53;
69
+ /** @type {?} */
70
+ export var KEY_6 = 54;
71
+ /** @type {?} */
72
+ export var KEY_7 = 55;
73
+ /** @type {?} */
74
+ export var KEY_8 = 56;
75
+ /** @type {?} */
76
+ export var KEY_9 = 57;
77
+ /** @type {?} */
78
+ export var KEY_SEMICOLON = 59;
79
+ /** @type {?} */
80
+ export var KEY_EQUALS = 61;
81
+ /*
82
+ Basically, just copy-pasted functionality from fs-boilerplate v1.x, with some small changes (like we dont have angular.bind anymore, had to go with a workaround)
83
+ There might be a better way to organise constatns but I need to know use-cases
84
+ */
85
+ var FsUtil = /** @class */ (function () {
86
+ function FsUtil() {
87
+ this.intervals = {};
88
+ }
89
+ /**
90
+ * @deprecated use @firestitch/common/util/guid instead
91
+ */
92
+ /**
93
+ * @deprecated use \@firestitch/common/util/guid instead
94
+ * @param {?=} pattern
95
+ * @return {?}
96
+ */
97
+ FsUtil.prototype.guid = /**
98
+ * @deprecated use \@firestitch/common/util/guid instead
99
+ * @param {?=} pattern
100
+ * @return {?}
101
+ */
102
+ function (pattern) {
103
+ console.warn('@deprecated use @firestitch/common/util/guid instead');
104
+ pattern = pattern || 'xxxxxx';
105
+ return pattern.replace(/[xy]/g, (/**
106
+ * @param {?} c
107
+ * @return {?}
108
+ */
109
+ function (c) {
110
+ /** @type {?} */
111
+ var r = Math.random() * 16 | 0;
112
+ /** @type {?} */
113
+ var v = c == 'x' ? r : (r & 0x3 | 0x8);
114
+ return v.toString(16);
115
+ }));
116
+ };
117
+ /**
118
+ * @deprecated use import { uuid } from @firestitch/common/util; instead
119
+ */
120
+ /**
121
+ * @deprecated use import { uuid } from \@firestitch/common/util; instead
122
+ * @return {?}
123
+ */
124
+ FsUtil.prototype.uuid = /**
125
+ * @deprecated use import { uuid } from \@firestitch/common/util; instead
126
+ * @return {?}
127
+ */
128
+ function () {
129
+ console.warn('@deprecated use @firestitch/common/util/uuid instead');
130
+ return this.guid('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
131
+ };
132
+ /**
133
+ * @deprecated use import { resolve } from @firestitch/common/util; instead
134
+ */
135
+ /**
136
+ * @deprecated use import { resolve } from \@firestitch/common/util; instead
137
+ * @param {?} promise
138
+ * @param {?=} defaults
139
+ * @return {?}
140
+ */
141
+ FsUtil.prototype.resolve = /**
142
+ * @deprecated use import { resolve } from \@firestitch/common/util; instead
143
+ * @param {?} promise
144
+ * @param {?=} defaults
145
+ * @return {?}
146
+ */
147
+ function (promise, defaults) {
148
+ if (defaults === void 0) { defaults = []; }
149
+ console.warn('@deprecated use @firestitch/common/util/resolve instead');
150
+ /** @type {?} */
151
+ var result = defaults;
152
+ return new Promise((/**
153
+ * @param {?} resolve
154
+ * @return {?}
155
+ */
156
+ function (resolve) {
157
+ promise.then((/**
158
+ * @param {?} data
159
+ * @return {?}
160
+ */
161
+ function (data) {
162
+ Object.keys(data).forEach((/**
163
+ * @param {?} key
164
+ * @return {?}
165
+ */
166
+ function (key) { return result[key] = data[key]; }));
167
+ resolve(result);
168
+ }));
169
+ }));
170
+ };
171
+ /**
172
+ * @deprecated use _.toInteger() instead
173
+ */
174
+ /**
175
+ * @deprecated use _.toInteger() instead
176
+ * @param {?} value
177
+ * @return {?}
178
+ */
179
+ FsUtil.prototype.int = /**
180
+ * @deprecated use _.toInteger() instead
181
+ * @param {?} value
182
+ * @return {?}
183
+ */
184
+ function (value) {
185
+ console.warn('@deprecated use _.toInteger() instead');
186
+ value = parseInt(value);
187
+ if (isNaN(value)) {
188
+ value = 0;
189
+ }
190
+ return value;
191
+ };
192
+ /**
193
+ * @deprecated use _.toFinite() instead
194
+ */
195
+ /**
196
+ * @deprecated use _.toFinite() instead
197
+ * @param {?} value
198
+ * @return {?}
199
+ */
200
+ FsUtil.prototype.float = /**
201
+ * @deprecated use _.toFinite() instead
202
+ * @param {?} value
203
+ * @return {?}
204
+ */
205
+ function (value) {
206
+ console.warn('@deprecated use _.toFinite() instead');
207
+ value = parseFloat(value);
208
+ if (isNaN(value)) {
209
+ value = 0;
210
+ }
211
+ return value;
212
+ };
213
+ /**
214
+ * @deprecated use _.toString() instead
215
+ */
216
+ /**
217
+ * @deprecated use _.toString() instead
218
+ * @param {?} string
219
+ * @return {?}
220
+ */
221
+ FsUtil.prototype.string = /**
222
+ * @deprecated use _.toString() instead
223
+ * @param {?} string
224
+ * @return {?}
225
+ */
226
+ function (string) {
227
+ console.warn('@deprecated use _.toString() instead');
228
+ if (string === null || string === undefined) {
229
+ string = '';
230
+ }
231
+ return (string).toString();
232
+ };
233
+ /**
234
+ * @deprecated use import { isEmpty } from @firestitch/common/util; instead
235
+ */
236
+ /**
237
+ * @deprecated use import { isEmpty } from \@firestitch/common/util; instead
238
+ * @param {?} value
239
+ * @param {?=} options
240
+ * @return {?}
241
+ */
242
+ FsUtil.prototype.isEmpty = /**
243
+ * @deprecated use import { isEmpty } from \@firestitch/common/util; instead
244
+ * @param {?} value
245
+ * @param {?=} options
246
+ * @return {?}
247
+ */
248
+ function (value, options) {
249
+ console.warn('@deprecated use import { isEmpty } from @firestitch/common/util; instead');
250
+ options = options || {};
251
+ return value === undefined ||
252
+ value === null ||
253
+ value === false ||
254
+ value === '' ||
255
+ !this.string(value).length ||
256
+ (this.isObject(value) &&
257
+ (value.constructor.name === 'Object' && !Object.keys(value).length)) ||
258
+ (!options.zero && (value === 0 || value === '0'));
259
+ };
260
+ /**
261
+ * @deprecated use _.isInteger() instead
262
+ */
263
+ /**
264
+ * @deprecated use _.isInteger() instead
265
+ * @param {?} value
266
+ * @param {?=} type
267
+ * @return {?}
268
+ */
269
+ FsUtil.prototype.isInt = /**
270
+ * @deprecated use _.isInteger() instead
271
+ * @param {?} value
272
+ * @param {?=} type
273
+ * @return {?}
274
+ */
275
+ function (value, type) {
276
+ console.warn('@deprecated use _.isInteger() instead');
277
+ /** @type {?} */
278
+ var int = !!this.string(value).match(/^\d+$/);
279
+ if (!int) {
280
+ return false;
281
+ }
282
+ if (type) {
283
+ return Number.isInteger(value);
284
+ }
285
+ return true;
286
+ };
287
+ /**
288
+ * @deprecated use _.each() instead {@link https://lodash.com/docs/4.17.5#forEach}
289
+ */
290
+ /**
291
+ * @deprecated use _.each() instead {\@link https://lodash.com/docs/4.17.5#forEach}
292
+ * @param {?} object
293
+ * @param {?} func
294
+ * @return {?}
295
+ */
296
+ FsUtil.prototype.each = /**
297
+ * @deprecated use _.each() instead {\@link https://lodash.com/docs/4.17.5#forEach}
298
+ * @param {?} object
299
+ * @param {?} func
300
+ * @return {?}
301
+ */
302
+ function (object, func) {
303
+ console.warn('@deprecated use _.each() instead {@link https://lodash.com/docs/4.17.5#forEach}');
304
+ if (!this.isArray(object) && !this.isObject(object)) {
305
+ return;
306
+ }
307
+ Object.keys(object).forEach((/**
308
+ * @param {?} key
309
+ * @return {?}
310
+ */
311
+ function (key) {
312
+ func(object[key], key);
313
+ }));
314
+ };
315
+ /**
316
+ * @deprecated use _.isArrayLikeObject() {@link https://lodash.com/docs/4.17.5#isArrayLikeObject}
317
+ * or _.isObject() {@link https://lodash.com/docs/4.17.5#isObject} instead
318
+ */
319
+ /**
320
+ * @deprecated use _.isArrayLikeObject() {\@link https://lodash.com/docs/4.17.5#isArrayLikeObject}
321
+ * or _.isObject() {\@link https://lodash.com/docs/4.17.5#isObject} instead
322
+ * @param {?} value
323
+ * @return {?}
324
+ */
325
+ FsUtil.prototype.isObject = /**
326
+ * @deprecated use _.isArrayLikeObject() {\@link https://lodash.com/docs/4.17.5#isArrayLikeObject}
327
+ * or _.isObject() {\@link https://lodash.com/docs/4.17.5#isObject} instead
328
+ * @param {?} value
329
+ * @return {?}
330
+ */
331
+ function (value) {
332
+ console.warn('@deprecated use _.isArrayLikeObject() {@link https://lodash.com/docs/4.17.5#isArrayLikeObject} or _.isObject() {@link https://lodash.com/docs/4.17.5#isObject} instead');
333
+ return value !== null && typeof value === 'object' && !this.isArray(value);
334
+ };
335
+ /**
336
+ * @deprecated use _.isString() instead {@link https://lodash.com/docs/4.17.5#isString}
337
+ */
338
+ /**
339
+ * @deprecated use _.isString() instead {\@link https://lodash.com/docs/4.17.5#isString}
340
+ * @param {?} value
341
+ * @return {?}
342
+ */
343
+ FsUtil.prototype.isString = /**
344
+ * @deprecated use _.isString() instead {\@link https://lodash.com/docs/4.17.5#isString}
345
+ * @param {?} value
346
+ * @return {?}
347
+ */
348
+ function (value) {
349
+ console.warn('@deprecated use _.isString() instead {@link https://lodash.com/docs/4.17.5#isString}');
350
+ return typeof value === 'string' || value instanceof String;
351
+ };
352
+ /**
353
+ * @deprecated use _.isArray() instead {@link https://lodash.com/docs/4.17.5#isArray}
354
+ */
355
+ /**
356
+ * @deprecated use _.isArray() instead {\@link https://lodash.com/docs/4.17.5#isArray}
357
+ * @param {?} value
358
+ * @return {?}
359
+ */
360
+ FsUtil.prototype.isArray = /**
361
+ * @deprecated use _.isArray() instead {\@link https://lodash.com/docs/4.17.5#isArray}
362
+ * @param {?} value
363
+ * @return {?}
364
+ */
365
+ function (value) {
366
+ console.warn('@deprecated use _.isArray() instead {@link https://lodash.com/docs/4.17.5#isArray}');
367
+ return value instanceof Array;
368
+ };
369
+ /**
370
+ * @deprecated use import { isNumeric } from @firestitch/common/util; instead
371
+ */
372
+ /**
373
+ * @deprecated use import { isNumeric } from \@firestitch/common/util; instead
374
+ * @param {?} value
375
+ * @return {?}
376
+ */
377
+ FsUtil.prototype.isNumeric = /**
378
+ * @deprecated use import { isNumeric } from \@firestitch/common/util; instead
379
+ * @param {?} value
380
+ * @return {?}
381
+ */
382
+ function (value) {
383
+ console.warn('@deprecated use import { isNumeric } from @firestitch/common/util; instead');
384
+ return this.string(value).length && !!this.string(value).match(/^-?\d*\.?\d*$/);
385
+ };
386
+ /**
387
+ * @deprecated use import { isClass } from @firestitch/common/util; instead
388
+ */
389
+ /**
390
+ * @deprecated use import { isClass } from \@firestitch/common/util; instead
391
+ * @param {?} value
392
+ * @param {?} cls
393
+ * @return {?}
394
+ */
395
+ FsUtil.prototype.isClass = /**
396
+ * @deprecated use import { isClass } from \@firestitch/common/util; instead
397
+ * @param {?} value
398
+ * @param {?} cls
399
+ * @return {?}
400
+ */
401
+ function (value, cls) {
402
+ console.warn('@deprecated use import { isClass } from @firestitch/common/util; instead');
403
+ if (this.isObject(value)) {
404
+ if (this.isString(cls)) {
405
+ if (value.constructor) {
406
+ if (value.constructor.name === cls) {
407
+ return true;
408
+ }
409
+ }
410
+ }
411
+ else {
412
+ if (value instanceof cls) {
413
+ return true;
414
+ }
415
+ }
416
+ }
417
+ return false;
418
+ };
419
+ /**
420
+ * @deprecated use _.isBoolean() instead {@link https://lodash.com/docs/4.17.5#isBoolean}
421
+ */
422
+ /**
423
+ * @deprecated use _.isBoolean() instead {\@link https://lodash.com/docs/4.17.5#isBoolean}
424
+ * @param {?} value
425
+ * @return {?}
426
+ */
427
+ FsUtil.prototype.isBoolean = /**
428
+ * @deprecated use _.isBoolean() instead {\@link https://lodash.com/docs/4.17.5#isBoolean}
429
+ * @param {?} value
430
+ * @return {?}
431
+ */
432
+ function (value) {
433
+ console.warn('@deprecated use _.isBoolean() instead {@link https://lodash.com/docs/4.17.5#isBoolean}');
434
+ return value === true || value === false;
435
+ };
436
+ /**
437
+ * @deprecated use import { value } from @firestitch/common/util; instead
438
+ */
439
+ /**
440
+ * @deprecated use import { value } from \@firestitch/common/util; instead
441
+ * @param {?} object
442
+ * @param {?} key
443
+ * @param {?} def
444
+ * @return {?}
445
+ */
446
+ FsUtil.prototype.value = /**
447
+ * @deprecated use import { value } from \@firestitch/common/util; instead
448
+ * @param {?} object
449
+ * @param {?} key
450
+ * @param {?} def
451
+ * @return {?}
452
+ */
453
+ function (object, key, def) {
454
+ console.warn('@deprecated use import { value } from @firestitch/common/util; instead');
455
+ if (this.isObject(object) || this.isArray(object)) {
456
+ if (object.hasOwnProperty(key)) {
457
+ return object[key];
458
+ }
459
+ }
460
+ return def;
461
+ };
462
+ /**
463
+ * @param {?} func
464
+ * @param {?} wait
465
+ * @return {?}
466
+ */
467
+ FsUtil.prototype.throttle = /**
468
+ * @param {?} func
469
+ * @param {?} wait
470
+ * @return {?}
471
+ */
472
+ function (func, wait) {
473
+ console.warn('@deprecated use import { throttle } from @firestitch/common/util; instead');
474
+ /** @type {?} */
475
+ var waiting = false;
476
+ return (/**
477
+ * @return {?}
478
+ */
479
+ function () {
480
+ if (!waiting) { // If we're not waiting
481
+ func.apply(null, arguments); // Execute users function
482
+ waiting = true; // Prevent future invocations
483
+ setTimeout((/**
484
+ * @return {?}
485
+ */
486
+ function () {
487
+ waiting = false; // And allow future invocations
488
+ }), wait);
489
+ }
490
+ });
491
+ };
492
+ /**
493
+ * @deprecated use import { debounce } from @firestitch/common/util; instead
494
+ */
495
+ /**
496
+ * @deprecated use import { debounce } from \@firestitch/common/util; instead
497
+ * @param {?} func
498
+ * @param {?} wait
499
+ * @param {?} immediate
500
+ * @return {?}
501
+ */
502
+ FsUtil.prototype.debounce = /**
503
+ * @deprecated use import { debounce } from \@firestitch/common/util; instead
504
+ * @param {?} func
505
+ * @param {?} wait
506
+ * @param {?} immediate
507
+ * @return {?}
508
+ */
509
+ function (func, wait, immediate) {
510
+ console.warn('@deprecated use import { debounce } from @firestitch/common/util; instead');
511
+ /** @type {?} */
512
+ var timeout;
513
+ return (/**
514
+ * @return {?}
515
+ */
516
+ function () {
517
+ /** @type {?} */
518
+ var context = this;
519
+ /** @type {?} */
520
+ var args = arguments;
521
+ /** @type {?} */
522
+ var later = (/**
523
+ * @return {?}
524
+ */
525
+ function () {
526
+ timeout = null;
527
+ if (!immediate)
528
+ func.apply(context, args);
529
+ });
530
+ /** @type {?} */
531
+ var callNow = immediate && !timeout;
532
+ clearTimeout(timeout);
533
+ timeout = setTimeout(later, wait);
534
+ if (callNow)
535
+ func.apply(context, args);
536
+ });
537
+ };
538
+ /**
539
+ * @deprecated use import { length } from @firestitch/common/util; instead
540
+ */
541
+ /**
542
+ * @deprecated use import { length } from \@firestitch/common/util; instead
543
+ * @param {?} object
544
+ * @return {?}
545
+ */
546
+ FsUtil.prototype.length = /**
547
+ * @deprecated use import { length } from \@firestitch/common/util; instead
548
+ * @param {?} object
549
+ * @return {?}
550
+ */
551
+ function (object) {
552
+ console.warn('@deprecated use import { length } from @firestitch/common/util; instead');
553
+ if (this.isObject(object)) {
554
+ return Object.keys(object).length;
555
+ }
556
+ if (this.isArray(object)) {
557
+ return object.length;
558
+ }
559
+ return 0;
560
+ };
561
+ /**
562
+ * @deprecated use import { boolean } from @firestitch/common/util; instead
563
+ */
564
+ /**
565
+ * @deprecated use import { boolean } from \@firestitch/common/util; instead
566
+ * @param {?} value
567
+ * @return {?}
568
+ */
569
+ FsUtil.prototype.boolean = /**
570
+ * @deprecated use import { boolean } from \@firestitch/common/util; instead
571
+ * @param {?} value
572
+ * @return {?}
573
+ */
574
+ function (value) {
575
+ console.warn('@deprecated use import { boolean } from @firestitch/common/util; instead');
576
+ return this.string(value).toLowerCase() !== 'false' && !!value;
577
+ };
578
+ /**
579
+ * @deprecated use import { stringify } from @firestitch/common/util; instead
580
+ */
581
+ /**
582
+ * @deprecated use import { stringify } from \@firestitch/common/util; instead
583
+ * @param {?} value
584
+ * @return {?}
585
+ */
586
+ FsUtil.prototype.stringify = /**
587
+ * @deprecated use import { stringify } from \@firestitch/common/util; instead
588
+ * @param {?} value
589
+ * @return {?}
590
+ */
591
+ function (value) {
592
+ console.warn('@deprecated use import { stringify } from @firestitch/common/util; instead');
593
+ return JSON.stringify(value);
594
+ };
595
+ FsUtil.decorators = [
596
+ { type: Injectable }
597
+ ];
598
+ return FsUtil;
599
+ }());
600
+ export { FsUtil };
601
+ if (false) {
602
+ /**
603
+ * @type {?}
604
+ * @private
605
+ */
606
+ FsUtil.prototype.intervals;
607
+ }
608
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvY29tbW9uLyIsInNvdXJjZXMiOlsiYXBwL3NlcnZpY2VzL3V0aWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNDLE1BQU0sS0FBTyxVQUFVLEdBQUcsQ0FBQzs7QUFBM0IsTUFBTSxLQUNGLFFBQVEsR0FBRyxDQUFDOztBQURoQixNQUFNLEtBRUYsYUFBYSxHQUFHLENBQUM7O0FBRnJCLE1BQU0sS0FHRixPQUFPLEdBQUcsQ0FBQzs7QUFIZixNQUFNLEtBSUYsU0FBUyxHQUFHLEVBQUU7O0FBSmxCLE1BQU0sS0FLRixVQUFVLEdBQUcsRUFBRTs7QUFMbkIsTUFBTSxLQU1GLFNBQVMsR0FBRyxFQUFFOztBQU5sQixNQUFNLEtBT0YsU0FBUyxHQUFHLEVBQUU7O0FBUGxCLE1BQU0sS0FRRixXQUFXLEdBQUcsRUFBRTs7QUFScEIsTUFBTSxLQVNGLE9BQU8sR0FBRyxFQUFFOztBQVRoQixNQUFNLEtBVUYsU0FBUyxHQUFHLEVBQUU7O0FBVmxCLE1BQU0sS0FXRixhQUFhLEdBQUcsRUFBRTs7QUFYdEIsTUFBTSxLQVlGLFVBQVUsR0FBRyxFQUFFOztBQVpuQixNQUFNLEtBYUYsU0FBUyxHQUFHLEVBQUU7O0FBYmxCLE1BQU0sS0FjRixXQUFXLEdBQUcsRUFBRTs7QUFkcEIsTUFBTSxLQWVGLGFBQWEsR0FBRyxFQUFFOztBQWZ0QixNQUFNLEtBZ0JGLE9BQU8sR0FBRyxFQUFFOztBQWhCaEIsTUFBTSxLQWlCRixRQUFRLEdBQUcsRUFBRTs7QUFqQmpCLE1BQU0sS0FrQkYsUUFBUSxHQUFHLEVBQUU7O0FBbEJqQixNQUFNLEtBbUJGLE1BQU0sR0FBRyxFQUFFOztBQW5CZixNQUFNLEtBb0JGLFNBQVMsR0FBRyxFQUFFOztBQXBCbEIsTUFBTSxLQXFCRixRQUFRLEdBQUcsRUFBRTs7QUFyQmpCLE1BQU0sS0FzQkYsZUFBZSxHQUFHLEVBQUU7O0FBdEJ4QixNQUFNLEtBdUJGLFVBQVUsR0FBRyxFQUFFOztBQXZCbkIsTUFBTSxLQXdCRixVQUFVLEdBQUcsRUFBRTs7QUF4Qm5CLE1BQU0sS0F5QkYsS0FBSyxHQUFHLEVBQUU7O0FBekJkLE1BQU0sS0EwQkYsS0FBSyxHQUFHLEVBQUU7O0FBMUJkLE1BQU0sS0EyQkYsS0FBSyxHQUFHLEVBQUU7O0FBM0JkLE1BQU0sS0E0QkYsS0FBSyxHQUFHLEVBQUU7O0FBNUJkLE1BQU0sS0E2QkYsS0FBSyxHQUFHLEVBQUU7O0FBN0JkLE1BQU0sS0E4QkYsS0FBSyxHQUFHLEVBQUU7O0FBOUJkLE1BQU0sS0ErQkYsS0FBSyxHQUFHLEVBQUU7O0FBL0JkLE1BQU0sS0FnQ0YsS0FBSyxHQUFHLEVBQUU7O0FBaENkLE1BQU0sS0FpQ0YsS0FBSyxHQUFHLEVBQUU7O0FBakNkLE1BQU0sS0FrQ0YsS0FBSyxHQUFHLEVBQUU7O0FBbENkLE1BQU0sS0FtQ0YsYUFBYSxHQUFHLEVBQUU7O0FBbkN0QixNQUFNLEtBb0NGLFVBQVUsR0FBRyxFQUFFOzs7OztBQVFuQjtJQUFBO1FBR1ksY0FBUyxHQUFHLEVBQUUsQ0FBQztJQTRRM0IsQ0FBQztJQTFRRzs7TUFFRTs7Ozs7O0lBQ0sscUJBQUk7Ozs7O0lBQVgsVUFBWSxPQUFnQjtRQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDckUsT0FBTyxHQUFHLE9BQU8sSUFBSSxRQUFRLENBQUM7UUFDOUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU87Ozs7UUFBRSxVQUFTLENBQUM7O2dCQUNwQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDOztnQkFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7TUFFRTs7Ozs7SUFDSyxxQkFBSTs7OztJQUFYO1FBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7TUFFRTs7Ozs7OztJQUNLLHdCQUFPOzs7Ozs7SUFBZCxVQUFlLE9BQXdCLEVBQUUsUUFBYTtRQUFiLHlCQUFBLEVBQUEsYUFBYTtRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7O1lBQ2xFLE1BQU0sR0FBRyxRQUFRO1FBQ3ZCLE9BQU8sSUFBSSxPQUFPOzs7O1FBQUMsVUFBQSxPQUFPO1lBQ3BCLE9BQU8sQ0FBQyxJQUFJOzs7O1lBQUMsVUFBVSxJQUFJO2dCQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU87Ozs7Z0JBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUF2QixDQUF1QixFQUFDLENBQUE7Z0JBQ3pELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNuQixDQUFDLEVBQUMsQ0FBQztRQUNSLENBQUMsRUFBQyxDQUFBO0lBQ0wsQ0FBQztJQUVEOztNQUVFOzs7Ozs7SUFDSyxvQkFBRzs7Ozs7SUFBVixVQUFXLEtBQVU7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3RELEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDZCxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O01BRUU7Ozs7OztJQUNLLHNCQUFLOzs7OztJQUFaLFVBQWEsS0FBSztRQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDckQsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNkLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztNQUVFOzs7Ozs7SUFDSyx1QkFBTTs7Ozs7SUFBYixVQUFjLE1BQU07UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ25ELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDZjtRQUVELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O01BRUU7Ozs7Ozs7SUFDSyx3QkFBTzs7Ozs7O0lBQWQsVUFBZSxLQUFLLEVBQUUsT0FBUTtRQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7UUFDekYsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDeEIsT0FBTyxLQUFLLEtBQUssU0FBUztZQUN0QixLQUFLLEtBQUssSUFBSTtZQUNkLEtBQUssS0FBSyxLQUFLO1lBQ2YsS0FBSyxLQUFLLEVBQUU7WUFDWixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTTtZQUMxQixDQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNwQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FDbkQsQ0FBQztJQUNWLENBQUM7SUFFRDs7TUFFRTs7Ozs7OztJQUNLLHNCQUFLOzs7Ozs7SUFBWixVQUFhLEtBQUssRUFBRSxJQUFLO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQzs7WUFDaEQsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFFL0MsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNOLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxJQUFJLEVBQUU7WUFDTixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O01BRUU7Ozs7Ozs7SUFDSyxxQkFBSTs7Ozs7O0lBQVgsVUFBWSxNQUFNLEVBQUUsSUFBSTtRQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLGlGQUFpRixDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELE9BQU87U0FDUjtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTzs7OztRQUFDLFVBQVMsR0FBRztZQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7TUFHRTs7Ozs7OztJQUNLLHlCQUFROzs7Ozs7SUFBZixVQUFnQixLQUFLO1FBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0tBQXdLLENBQUMsQ0FBQztRQUN2TCxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7O01BRUU7Ozs7OztJQUNLLHlCQUFROzs7OztJQUFmLFVBQWdCLEtBQUs7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxzRkFBc0YsQ0FBQyxDQUFDO1FBQ3JHLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxNQUFNLENBQUM7SUFDOUQsQ0FBQztJQUVEOztNQUVFOzs7Ozs7SUFDSyx3QkFBTzs7Ozs7SUFBZCxVQUFlLEtBQUs7UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxvRkFBb0YsQ0FBQyxDQUFDO1FBQ25HLE9BQU8sS0FBSyxZQUFZLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O01BRUU7Ozs7OztJQUNLLDBCQUFTOzs7OztJQUFoQixVQUFpQixLQUFLO1FBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNEVBQTRFLENBQUMsQ0FBQztRQUMzRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQ7O01BRUU7Ozs7Ozs7SUFDSyx3QkFBTzs7Ozs7O0lBQWQsVUFBZSxLQUFLLEVBQUUsR0FBRztRQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7UUFDekYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBRXRCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFFcEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO29CQUNuQixJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRTt3QkFDaEMsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7aUJBQ0o7YUFFSjtpQkFBTTtnQkFFSCxJQUFJLEtBQUssWUFBWSxHQUFHLEVBQUU7b0JBQ3RCLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7TUFFRTs7Ozs7O0lBQ0ssMEJBQVM7Ozs7O0lBQWhCLFVBQWlCLEtBQUs7UUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO1FBQ3ZHLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7TUFFRTs7Ozs7Ozs7SUFDSyxzQkFBSzs7Ozs7OztJQUFaLFVBQWEsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLENBQUMsQ0FBQztRQUNyRixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUUvQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3RCO1NBQ0o7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Ozs7OztJQUVNLHlCQUFROzs7OztJQUFmLFVBQWdCLElBQUksRUFBRSxJQUFJO1FBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkVBQTJFLENBQUMsQ0FBQzs7WUFDdEYsT0FBTyxHQUFHLEtBQUs7UUFDakI7OztRQUFPO1lBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFxQix1QkFBdUI7Z0JBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUsseUJBQXlCO2dCQUMxRCxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQWdCLDZCQUE2QjtnQkFDNUQsVUFBVTs7O2dCQUFDO29CQUNQLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBVywrQkFBK0I7Z0JBQzlELENBQUMsR0FBRSxJQUFJLENBQUMsQ0FBQzthQUNaO1FBQ0wsQ0FBQyxFQUFBO0lBQ0wsQ0FBQztJQUVEOztNQUVFOzs7Ozs7OztJQUNLLHlCQUFROzs7Ozs7O0lBQWYsVUFBZ0IsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTO1FBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkVBQTJFLENBQUMsQ0FBQzs7WUFDdEYsT0FBTztRQUNUOzs7UUFBTzs7Z0JBQ0MsT0FBTyxHQUFHLElBQUk7O2dCQUFFLElBQUksR0FBRyxTQUFTOztnQkFDaEMsS0FBSzs7O1lBQUc7Z0JBQ1IsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDZixJQUFJLENBQUMsU0FBUztvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUE7O2dCQUNHLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQyxPQUFPO1lBQ25DLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLE9BQU87Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxFQUFDO0lBQ04sQ0FBQztJQUVEOztNQUVFOzs7Ozs7SUFDSyx1QkFBTTs7Ozs7SUFBYixVQUFjLE1BQU07UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO1FBQ3hGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUN4QjtRQUVELE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVEOztNQUVFOzs7Ozs7SUFDSyx3QkFBTzs7Ozs7SUFBZCxVQUFlLEtBQUs7UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1FBQ3pGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O01BRUU7Ozs7OztJQUNLLDBCQUFTOzs7OztJQUFoQixVQUFpQixLQUFLO1FBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNEVBQTRFLENBQUMsQ0FBQztRQUMzRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7Z0JBOVFKLFVBQVU7O0lBK1FYLGFBQUM7Q0FBQSxBQS9RRCxJQStRQztTQTlRWSxNQUFNOzs7Ozs7SUFFZiwyQkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBLRVlfQ0FOQ0VMID0gMyxcbiAgICBLRVlfSEVMUCA9IDYsXG4gICAgS0VZX0JBQ0tTUEFDRSA9IDgsXG4gICAgS0VZX1RBQiA9IDksXG4gICAgS0VZX0NMRUFSID0gMTIsXG4gICAgS0VZX1JFVFVSTiA9IDEzLFxuICAgIEtFWV9FTlRFUiA9IDE0LFxuICAgIEtFWV9TSElGVCA9IDE2LFxuICAgIEtFWV9DT05UUk9MID0gMTcsXG4gICAgS0VZX0FMVCA9IDE4LFxuICAgIEtFWV9QQVVTRSA9IDE5LFxuICAgIEtFWV9DQVBTX0xPQ0sgPSAyMCxcbiAgICBLRVlfRVNDQVBFID0gMjcsXG4gICAgS0VZX1NQQUNFID0gMzIsXG4gICAgS0VZX1BBR0VfVVAgPSAzMyxcbiAgICBLRVlfUEFHRV9ET1dOID0gMzQsXG4gICAgS0VZX0VORCA9IDM1LFxuICAgIEtFWV9IT01FID0gMzYsXG4gICAgS0VZX0xFRlQgPSAzNyxcbiAgICBLRVlfVVAgPSAzOCxcbiAgICBLRVlfUklHSFQgPSAzOSxcbiAgICBLRVlfRE9XTiA9IDQwLFxuICAgIEtFWV9QUklOVFNDUkVFTiA9IDQ0LFxuICAgIEtFWV9JTlNFUlQgPSA0NSxcbiAgICBLRVlfREVMRVRFID0gNDYsXG4gICAgS0VZXzAgPSA0OCxcbiAgICBLRVlfMSA9IDQ5LFxuICAgIEtFWV8yID0gNTAsXG4gICAgS0VZXzMgPSA1MSxcbiAgICBLRVlfNCA9IDUyLFxuICAgIEtFWV81ID0gNTMsXG4gICAgS0VZXzYgPSA1NCxcbiAgICBLRVlfNyA9IDU1LFxuICAgIEtFWV84ID0gNTYsXG4gICAgS0VZXzkgPSA1NyxcbiAgICBLRVlfU0VNSUNPTE9OID0gNTksXG4gICAgS0VZX0VRVUFMUyA9IDYxO1xuXG4vKlxuICAgIEJhc2ljYWxseSwganVzdCBjb3B5LXBhc3RlZCBmdW5jdGlvbmFsaXR5IGZyb20gZnMtYm9pbGVycGxhdGUgdjEueCwgd2l0aCBzb21lIHNtYWxsIGNoYW5nZXMgKGxpa2Ugd2UgZG9udCBoYXZlIGFuZ3VsYXIuYmluZCBhbnltb3JlLCBoYWQgdG8gZ28gd2l0aCBhIHdvcmthcm91bmQpXG4gICAgVGhlcmUgbWlnaHQgYmUgYSBiZXR0ZXIgd2F5IHRvIG9yZ2FuaXNlIGNvbnN0YXRucyBidXQgSSBuZWVkIHRvIGtub3cgdXNlLWNhc2VzXG4qL1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGc1V0aWwge1xuXG4gICAgcHJpdmF0ZSBpbnRlcnZhbHMgPSB7fTtcblxuICAgIC8qKlxuICAgICogQGRlcHJlY2F0ZWQgdXNlIEBmaXJlc3RpdGNoL2NvbW1vbi91dGlsL2d1aWQgaW5zdGVhZFxuICAgICovXG4gICAgcHVibGljIGd1aWQocGF0dGVybj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBAZmlyZXN0aXRjaC9jb21tb24vdXRpbC9ndWlkIGluc3RlYWQnKTtcbiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuIHx8ICd4eHh4eHgnO1xuICAgICAgcmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IHV1aWQgfSBmcm9tIEBmaXJlc3RpdGNoL2NvbW1vbi91dGlsOyBpbnN0ZWFkXG4gICAgKi9cbiAgICBwdWJsaWMgdXVpZCgpOiBzdHJpbmcge1xuICAgICAgY29uc29sZS53YXJuKCdAZGVwcmVjYXRlZCB1c2UgQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWwvdXVpZCBpbnN0ZWFkJyk7XG4gICAgICByZXR1cm4gdGhpcy5ndWlkKCd4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWRcbiAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlKHByb21pc2U6IFByb21pc2U8b2JqZWN0PiwgZGVmYXVsdHMgPSBbXSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBAZmlyZXN0aXRjaC9jb21tb24vdXRpbC9yZXNvbHZlIGluc3RlYWQnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZmF1bHRzO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChrZXkgPT4gcmVzdWx0W2tleV0gPSBkYXRhW2tleV0pXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBfLnRvSW50ZWdlcigpIGluc3RlYWRcbiAgICAqL1xuICAgIHB1YmxpYyBpbnQodmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIF8udG9JbnRlZ2VyKCkgaW5zdGVhZCcpO1xuICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgXy50b0Zpbml0ZSgpIGluc3RlYWRcbiAgICAqL1xuICAgIHB1YmxpYyBmbG9hdCh2YWx1ZSk6IG51bWJlciB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBfLnRvRmluaXRlKCkgaW5zdGVhZCcpO1xuICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIF8udG9TdHJpbmcoKSBpbnN0ZWFkXG4gICAgKi9cbiAgICBwdWJsaWMgc3RyaW5nKHN0cmluZyk6IHN0cmluZyB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBfLnRvU3RyaW5nKCkgaW5zdGVhZCcpO1xuICAgICAgICBpZiAoc3RyaW5nID09PSBudWxsIHx8IHN0cmluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdHJpbmcgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoc3RyaW5nKS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBAZmlyZXN0aXRjaC9jb21tb24vdXRpbDsgaW5zdGVhZFxuICAgICovXG4gICAgcHVibGljIGlzRW1wdHkodmFsdWUsIG9wdGlvbnM/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIEBmaXJlc3RpdGNoL2NvbW1vbi91dGlsOyBpbnN0ZWFkJyk7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAgICAgICAgIHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdmFsdWUgPT09ICcnIHx8XG4gICAgICAgICAgICAhdGhpcy5zdHJpbmcodmFsdWUpLmxlbmd0aCB8fFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIHRoaXMuaXNPYmplY3QodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QnICYmICFPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSkgfHxcbiAgICAgICAgICAgICAgICAoIW9wdGlvbnMuemVybyAmJiAodmFsdWUgPT09IDAgfHwgdmFsdWUgPT09ICcwJylcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIF8uaXNJbnRlZ2VyKCkgaW5zdGVhZFxuICAgICovXG4gICAgcHVibGljIGlzSW50KHZhbHVlLCB0eXBlPykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBfLmlzSW50ZWdlcigpIGluc3RlYWQnKTtcbiAgICAgICAgY29uc3QgaW50ID0gISF0aGlzLnN0cmluZyh2YWx1ZSkubWF0Y2goL15cXGQrJC8pO1xuXG4gICAgICAgIGlmICghaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIF8uZWFjaCgpIGluc3RlYWQge0BsaW5rIGh0dHBzOi8vbG9kYXNoLmNvbS9kb2NzLzQuMTcuNSNmb3JFYWNofVxuICAgICovXG4gICAgcHVibGljIGVhY2gob2JqZWN0LCBmdW5jKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBfLmVhY2goKSBpbnN0ZWFkIHtAbGluayBodHRwczovL2xvZGFzaC5jb20vZG9jcy80LjE3LjUjZm9yRWFjaH0nKTtcbiAgICAgIGlmICghdGhpcy5pc0FycmF5KG9iamVjdCkgJiYgIXRoaXMuaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgZnVuYyhvYmplY3Rba2V5XSxrZXkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIF8uaXNBcnJheUxpa2VPYmplY3QoKSB7QGxpbmsgaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvNC4xNy41I2lzQXJyYXlMaWtlT2JqZWN0fVxuICAgICAqIG9yIF8uaXNPYmplY3QoKSB7QGxpbmsgaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvNC4xNy41I2lzT2JqZWN0fSBpbnN0ZWFkXG4gICAgKi9cbiAgICBwdWJsaWMgaXNPYmplY3QodmFsdWUpOiBib29sZWFuIHtcbiAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIF8uaXNBcnJheUxpa2VPYmplY3QoKSB7QGxpbmsgaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvNC4xNy41I2lzQXJyYXlMaWtlT2JqZWN0fSBvciBfLmlzT2JqZWN0KCkge0BsaW5rIGh0dHBzOi8vbG9kYXNoLmNvbS9kb2NzLzQuMTcuNSNpc09iamVjdH0gaW5zdGVhZCcpO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXRoaXMuaXNBcnJheSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAqIEBkZXByZWNhdGVkIHVzZSBfLmlzU3RyaW5nKCkgaW5zdGVhZCB7QGxpbmsgaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvNC4xNy41I2lzU3RyaW5nfVxuICAgICovXG4gICAgcHVibGljIGlzU3RyaW5nKHZhbHVlKTogYm9vbGVhbiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBfLmlzU3RyaW5nKCkgaW5zdGVhZCB7QGxpbmsgaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvNC4xNy41I2lzU3RyaW5nfScpO1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIF8uaXNBcnJheSgpIGluc3RlYWQge0BsaW5rIGh0dHBzOi8vbG9kYXNoLmNvbS9kb2NzLzQuMTcuNSNpc0FycmF5fVxuICAgICovXG4gICAgcHVibGljIGlzQXJyYXkodmFsdWUpOiBib29sZWFuIHtcbiAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIF8uaXNBcnJheSgpIGluc3RlYWQge0BsaW5rIGh0dHBzOi8vbG9kYXNoLmNvbS9kb2NzLzQuMTcuNSNpc0FycmF5fScpO1xuICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IGlzTnVtZXJpYyB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWRcbiAgICAqL1xuICAgIHB1YmxpYyBpc051bWVyaWModmFsdWUpOiBib29sZWFuIHtcbiAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IGlzTnVtZXJpYyB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWQnKTtcbiAgICAgIHJldHVybiB0aGlzLnN0cmluZyh2YWx1ZSkubGVuZ3RoICYmICEhdGhpcy5zdHJpbmcodmFsdWUpLm1hdGNoKC9eLT9cXGQqXFwuP1xcZCokLyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IGlzQ2xhc3MgfSBmcm9tIEBmaXJlc3RpdGNoL2NvbW1vbi91dGlsOyBpbnN0ZWFkXG4gICAgKi9cbiAgICBwdWJsaWMgaXNDbGFzcyh2YWx1ZSwgY2xzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IGlzQ2xhc3MgfSBmcm9tIEBmaXJlc3RpdGNoL2NvbW1vbi91dGlsOyBpbnN0ZWFkJyk7XG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0KHZhbHVlKSkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0cmluZyhjbHMpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgPT09IGNscykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBjbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgXy5pc0Jvb2xlYW4oKSBpbnN0ZWFkIHtAbGluayBodHRwczovL2xvZGFzaC5jb20vZG9jcy80LjE3LjUjaXNCb29sZWFufVxuICAgICovXG4gICAgcHVibGljIGlzQm9vbGVhbih2YWx1ZSk6IGJvb2xlYW4ge1xuICAgICAgY29uc29sZS53YXJuKCdAZGVwcmVjYXRlZCB1c2UgXy5pc0Jvb2xlYW4oKSBpbnN0ZWFkIHtAbGluayBodHRwczovL2xvZGFzaC5jb20vZG9jcy80LjE3LjUjaXNCb29sZWFufScpO1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaW1wb3J0IHsgdmFsdWUgfSBmcm9tIEBmaXJlc3RpdGNoL2NvbW1vbi91dGlsOyBpbnN0ZWFkXG4gICAgKi9cbiAgICBwdWJsaWMgdmFsdWUob2JqZWN0LCBrZXksIGRlZik6IGFueSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBpbXBvcnQgeyB2YWx1ZSB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWQnKTtcbiAgICAgICAgaWYgKHRoaXMuaXNPYmplY3Qob2JqZWN0KSB8fCB0aGlzLmlzQXJyYXkob2JqZWN0KSkge1xuXG4gICAgICAgICAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmO1xuICAgIH1cblxuICAgIHB1YmxpYyB0aHJvdHRsZShmdW5jLCB3YWl0KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBpbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWQnKTtcbiAgICAgIGxldCB3YWl0aW5nID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgXHQvLyBJbml0aWFsbHksIHdlJ3JlIG5vdCB3YWl0aW5nXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7ICAgICAgICAgICAgICAgXHRcdC8vIFdlIHJldHVybiBhIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCF3YWl0aW5nKSB7ICAgICAgICAgICAgICAgICAgIFx0Ly8gSWYgd2UncmUgbm90IHdhaXRpbmdcbiAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7ICAgICAvLyBFeGVjdXRlIHVzZXJzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgd2FpdGluZyA9IHRydWU7ICAgICAgICAgICAgICAgXHQvLyBQcmV2ZW50IGZ1dHVyZSBpbnZvY2F0aW9uc1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyAgIFx0XHQvLyBBZnRlciBhIHBlcmlvZCBvZiB0aW1lXG4gICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgPSBmYWxzZTsgICAgICAgICAgXHQvLyBBbmQgYWxsb3cgZnV0dXJlIGludm9jYXRpb25zXG4gICAgICAgICAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIEBmaXJlc3RpdGNoL2NvbW1vbi91dGlsOyBpbnN0ZWFkXG4gICAgKi9cbiAgICBwdWJsaWMgZGVib3VuY2UoZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBpbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWQnKTtcbiAgICAgIHZhciB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgdmFyIGxhdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICAgICAgaWYgKGNhbGxOb3cpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IGxlbmd0aCB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWRcbiAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgob2JqZWN0KTogbnVtYmVyIHtcbiAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IGxlbmd0aCB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWQnKTtcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaW1wb3J0IHsgYm9vbGVhbiB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWRcbiAgICAqL1xuICAgIHB1YmxpYyBib29sZWFuKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0BkZXByZWNhdGVkIHVzZSBpbXBvcnQgeyBib29sZWFuIH0gZnJvbSBAZmlyZXN0aXRjaC9jb21tb24vdXRpbDsgaW5zdGVhZCcpO1xuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnICYmICEhdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWRcbiAgICAqL1xuICAgIHB1YmxpYyBzdHJpbmdpZnkodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignQGRlcHJlY2F0ZWQgdXNlIGltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gQGZpcmVzdGl0Y2gvY29tbW9uL3V0aWw7IGluc3RlYWQnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxufVxuIl19