@based/db 0.0.2 → 0.0.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 (315) hide show
  1. package/basedDbNative.cjs +26 -0
  2. package/dist/lib/darwin_aarch64/libdeflate.dylib +0 -0
  3. package/dist/lib/darwin_aarch64/libjemalloc_selva.2.dylib +0 -0
  4. package/dist/lib/darwin_aarch64/libnode-v20.11.1.node +0 -0
  5. package/dist/lib/darwin_aarch64/{libnode-v22.13.1.node → libnode-v20.18.1.node} +0 -0
  6. package/dist/lib/darwin_aarch64/libnode-v22.13.0.node +0 -0
  7. package/dist/lib/darwin_aarch64/libnode-v22.8.0.node +0 -0
  8. package/dist/lib/darwin_aarch64/libselva.dylib +0 -0
  9. package/dist/lib/linux_aarch64/include/cdefs.h +317 -0
  10. package/dist/lib/linux_aarch64/include/jemalloc.h +468 -0
  11. package/dist/lib/linux_aarch64/include/libdeflate.h +322 -0
  12. package/dist/lib/linux_aarch64/include/libdeflate_strings.h +35 -0
  13. package/dist/lib/linux_aarch64/include/linker_set.h +109 -0
  14. package/dist/lib/linux_aarch64/include/queue.h +627 -0
  15. package/dist/lib/linux_aarch64/include/selva/_export.h +7 -0
  16. package/dist/lib/linux_aarch64/include/selva/align.h +9 -0
  17. package/dist/lib/linux_aarch64/include/selva/backoff_timeout.h +29 -0
  18. package/dist/lib/linux_aarch64/include/selva/base64.h +59 -0
  19. package/dist/lib/linux_aarch64/include/selva/base64url.h +59 -0
  20. package/dist/lib/linux_aarch64/include/selva/bitmap.h +95 -0
  21. package/dist/lib/linux_aarch64/include/selva/crc32c.h +17 -0
  22. package/dist/lib/linux_aarch64/include/selva/ctime.h +135 -0
  23. package/dist/lib/linux_aarch64/include/selva/db.h +284 -0
  24. package/dist/lib/linux_aarch64/include/selva/endian.h +301 -0
  25. package/dist/lib/linux_aarch64/include/selva/fast_linear_search.h +23 -0
  26. package/dist/lib/linux_aarch64/include/selva/fast_memmem.h +11 -0
  27. package/dist/lib/linux_aarch64/include/selva/fast_parsei.h +36 -0
  28. package/dist/lib/linux_aarch64/include/selva/fields.h +338 -0
  29. package/dist/lib/linux_aarch64/include/selva/find.h +47 -0
  30. package/dist/lib/linux_aarch64/include/selva/lpf.h +28 -0
  31. package/dist/lib/linux_aarch64/include/selva/node_id_set.h +43 -0
  32. package/dist/lib/linux_aarch64/include/selva/poptop.h +114 -0
  33. package/dist/lib/linux_aarch64/include/selva/queue_r.h +190 -0
  34. package/dist/lib/linux_aarch64/include/selva/selva_hash128.h +39 -0
  35. package/dist/lib/linux_aarch64/include/selva/selva_lang.h +105 -0
  36. package/dist/lib/linux_aarch64/include/selva/selva_math.h +37 -0
  37. package/dist/lib/linux_aarch64/include/selva/selva_string.h +674 -0
  38. package/dist/lib/linux_aarch64/include/selva/sort.h +119 -0
  39. package/dist/lib/linux_aarch64/include/selva/strsearch.h +43 -0
  40. package/dist/lib/linux_aarch64/include/selva/timestamp.h +25 -0
  41. package/dist/lib/linux_aarch64/include/selva/traverse.h +65 -0
  42. package/dist/lib/linux_aarch64/include/selva/types.h +110 -0
  43. package/dist/lib/linux_aarch64/include/selva/vector.h +14 -0
  44. package/dist/lib/linux_aarch64/include/selva/worker_ctx.h +13 -0
  45. package/dist/lib/linux_aarch64/include/selva_error.h +137 -0
  46. package/dist/lib/linux_aarch64/include/selva_lang_code.h +157 -0
  47. package/dist/lib/linux_aarch64/include/tree.h +852 -0
  48. package/dist/lib/linux_aarch64/libdeflate.so +0 -0
  49. package/dist/lib/linux_aarch64/libjemalloc_selva.so.2 +0 -0
  50. package/dist/lib/linux_aarch64/libnode-v20.11.1.node +0 -0
  51. package/dist/lib/linux_aarch64/libnode-v20.18.1.node +0 -0
  52. package/dist/lib/linux_aarch64/libnode-v22.13.0.node +0 -0
  53. package/dist/lib/linux_aarch64/libselva.so +0 -0
  54. package/dist/lib/linux_aarch64/libxxhash.so +0 -0
  55. package/dist/lib/linux_aarch64/libxxhash.so.0 +0 -0
  56. package/dist/lib/linux_aarch64/libxxhash.so.0.8.2 +0 -0
  57. package/dist/lib/linux_x86_64/include/cdefs.h +317 -0
  58. package/dist/lib/linux_x86_64/include/jemalloc.h +468 -0
  59. package/dist/lib/linux_x86_64/include/libdeflate.h +322 -0
  60. package/dist/lib/linux_x86_64/include/libdeflate_strings.h +35 -0
  61. package/dist/lib/linux_x86_64/include/linker_set.h +109 -0
  62. package/dist/lib/linux_x86_64/include/queue.h +627 -0
  63. package/dist/lib/linux_x86_64/include/selva/_export.h +7 -0
  64. package/dist/lib/linux_x86_64/include/selva/align.h +9 -0
  65. package/dist/lib/linux_x86_64/include/selva/backoff_timeout.h +29 -0
  66. package/dist/lib/linux_x86_64/include/selva/base64.h +59 -0
  67. package/dist/lib/linux_x86_64/include/selva/base64url.h +59 -0
  68. package/dist/lib/linux_x86_64/include/selva/bitmap.h +95 -0
  69. package/dist/lib/linux_x86_64/include/selva/crc32c.h +17 -0
  70. package/dist/lib/linux_x86_64/include/selva/ctime.h +135 -0
  71. package/dist/lib/linux_x86_64/include/selva/db.h +284 -0
  72. package/dist/lib/linux_x86_64/include/selva/endian.h +301 -0
  73. package/dist/lib/linux_x86_64/include/selva/fast_linear_search.h +23 -0
  74. package/dist/lib/linux_x86_64/include/selva/fast_memmem.h +11 -0
  75. package/dist/lib/linux_x86_64/include/selva/fast_parsei.h +36 -0
  76. package/dist/lib/linux_x86_64/include/selva/fields.h +338 -0
  77. package/dist/lib/linux_x86_64/include/selva/find.h +47 -0
  78. package/dist/lib/linux_x86_64/include/selva/lpf.h +28 -0
  79. package/dist/lib/linux_x86_64/include/selva/node_id_set.h +43 -0
  80. package/dist/lib/linux_x86_64/include/selva/poptop.h +114 -0
  81. package/dist/lib/linux_x86_64/include/selva/queue_r.h +190 -0
  82. package/dist/lib/linux_x86_64/include/selva/selva_hash128.h +39 -0
  83. package/dist/lib/linux_x86_64/include/selva/selva_lang.h +105 -0
  84. package/dist/lib/linux_x86_64/include/selva/selva_math.h +37 -0
  85. package/dist/lib/linux_x86_64/include/selva/selva_string.h +674 -0
  86. package/dist/lib/linux_x86_64/include/selva/sort.h +119 -0
  87. package/dist/lib/linux_x86_64/include/selva/strsearch.h +43 -0
  88. package/dist/lib/linux_x86_64/include/selva/timestamp.h +25 -0
  89. package/dist/lib/linux_x86_64/include/selva/traverse.h +65 -0
  90. package/dist/lib/linux_x86_64/include/selva/types.h +110 -0
  91. package/dist/lib/linux_x86_64/include/selva/vector.h +14 -0
  92. package/dist/lib/linux_x86_64/include/selva/worker_ctx.h +13 -0
  93. package/dist/lib/linux_x86_64/include/selva_error.h +137 -0
  94. package/dist/lib/linux_x86_64/include/selva_lang_code.h +157 -0
  95. package/dist/lib/linux_x86_64/include/tree.h +852 -0
  96. package/dist/lib/linux_x86_64/libdeflate.so +0 -0
  97. package/dist/lib/linux_x86_64/libjemalloc_selva.so.2 +0 -0
  98. package/dist/lib/linux_x86_64/libnode-v20.11.1.node +0 -0
  99. package/dist/lib/linux_x86_64/libnode-v20.18.1.node +0 -0
  100. package/dist/lib/linux_x86_64/libnode-v22.13.0.node +0 -0
  101. package/dist/lib/linux_x86_64/libselva.so +0 -0
  102. package/dist/lib/linux_x86_64/libxxhash.so +0 -0
  103. package/dist/lib/linux_x86_64/libxxhash.so.0 +0 -0
  104. package/dist/lib/linux_x86_64/libxxhash.so.0.8.2 +0 -0
  105. package/package.json +6 -5
  106. package/dist/src/client/bitWise.js.map +0 -1
  107. package/dist/src/client/crc32.js.map +0 -1
  108. package/dist/src/client/index.js.map +0 -1
  109. package/dist/src/client/modify/ModifyRes.js.map +0 -1
  110. package/dist/src/client/modify/alias.js.map +0 -1
  111. package/dist/src/client/modify/binary.js.map +0 -1
  112. package/dist/src/client/modify/create.js.map +0 -1
  113. package/dist/src/client/modify/fixed.js.map +0 -1
  114. package/dist/src/client/modify/hll.js.map +0 -1
  115. package/dist/src/client/modify/index.js.map +0 -1
  116. package/dist/src/client/modify/modify.js.map +0 -1
  117. package/dist/src/client/modify/references/edge.js.map +0 -1
  118. package/dist/src/client/modify/references/reference.js.map +0 -1
  119. package/dist/src/client/modify/references/references.js.map +0 -1
  120. package/dist/src/client/modify/remove.js.map +0 -1
  121. package/dist/src/client/modify/setCursor.js.map +0 -1
  122. package/dist/src/client/modify/string.js.map +0 -1
  123. package/dist/src/client/modify/text.js.map +0 -1
  124. package/dist/src/client/modify/types.js.map +0 -1
  125. package/dist/src/client/modify/update.js.map +0 -1
  126. package/dist/src/client/modify/upsert.js.map +0 -1
  127. package/dist/src/client/modify/vector.js.map +0 -1
  128. package/dist/src/client/operations.js.map +0 -1
  129. package/dist/src/client/query/BasedDbQuery.js.map +0 -1
  130. package/dist/src/client/query/BasedIterable.js.map +0 -1
  131. package/dist/src/client/query/debug.js.map +0 -1
  132. package/dist/src/client/query/display.js.map +0 -1
  133. package/dist/src/client/query/filter/FilterBranch.js.map +0 -1
  134. package/dist/src/client/query/filter/createFixedFilterBuffer.js.map +0 -1
  135. package/dist/src/client/query/filter/createReferenceFilter.js.map +0 -1
  136. package/dist/src/client/query/filter/createVariableFilterBuffer.js.map +0 -1
  137. package/dist/src/client/query/filter/filter.js.map +0 -1
  138. package/dist/src/client/query/filter/operators.js.map +0 -1
  139. package/dist/src/client/query/filter/parseFilterValue.js.map +0 -1
  140. package/dist/src/client/query/filter/primitiveFilter.js.map +0 -1
  141. package/dist/src/client/query/filter/toBuffer.js.map +0 -1
  142. package/dist/src/client/query/filter/types.js.map +0 -1
  143. package/dist/src/client/query/include/props.js.map +0 -1
  144. package/dist/src/client/query/include/toBuffer.js.map +0 -1
  145. package/dist/src/client/query/include/utils.js.map +0 -1
  146. package/dist/src/client/query/include/walk.js.map +0 -1
  147. package/dist/src/client/query/query.js.map +0 -1
  148. package/dist/src/client/query/queryDef.js.map +0 -1
  149. package/dist/src/client/query/read/read.js.map +0 -1
  150. package/dist/src/client/query/registerQuery.js.map +0 -1
  151. package/dist/src/client/query/search/index.js.map +0 -1
  152. package/dist/src/client/query/sort.js.map +0 -1
  153. package/dist/src/client/query/subscription/index.js.map +0 -1
  154. package/dist/src/client/query/subscription/markers.js.map +0 -1
  155. package/dist/src/client/query/subscription/run.js.map +0 -1
  156. package/dist/src/client/query/subscription/types.js.map +0 -1
  157. package/dist/src/client/query/thresholds.js.map +0 -1
  158. package/dist/src/client/query/toBuffer.js.map +0 -1
  159. package/dist/src/client/query/types.js.map +0 -1
  160. package/dist/src/client/query/validation.js.map +0 -1
  161. package/dist/src/client/string.js.map +0 -1
  162. package/dist/src/client/tree.js.map +0 -1
  163. package/dist/src/index.js.map +0 -1
  164. package/dist/src/native.js.map +0 -1
  165. package/dist/src/server/csmt/draw-dot.js.map +0 -1
  166. package/dist/src/server/csmt/index.js.map +0 -1
  167. package/dist/src/server/csmt/match.js.map +0 -1
  168. package/dist/src/server/csmt/memebership-proof.js.map +0 -1
  169. package/dist/src/server/csmt/tree-utils.js.map +0 -1
  170. package/dist/src/server/csmt/tree.js.map +0 -1
  171. package/dist/src/server/csmt/types.js.map +0 -1
  172. package/dist/src/server/index.js.map +0 -1
  173. package/dist/src/server/migrate/index.js.map +0 -1
  174. package/dist/src/server/migrate/worker.js.map +0 -1
  175. package/dist/src/server/save.js.map +0 -1
  176. package/dist/src/server/schema/schema.js.map +0 -1
  177. package/dist/src/server/schema/selvaBuffer.js.map +0 -1
  178. package/dist/src/server/schema/typeDef.js.map +0 -1
  179. package/dist/src/server/schema/types.js.map +0 -1
  180. package/dist/src/server/schema/utils.js.map +0 -1
  181. package/dist/src/server/start.js.map +0 -1
  182. package/dist/src/server/tree.js.map +0 -1
  183. package/dist/src/server/worker.js.map +0 -1
  184. package/dist/test/alias.d.ts +0 -1
  185. package/dist/test/alias.js +0 -232
  186. package/dist/test/alias.js.map +0 -1
  187. package/dist/test/binary.d.ts +0 -1
  188. package/dist/test/binary.js +0 -45
  189. package/dist/test/binary.js.map +0 -1
  190. package/dist/test/boolean.d.ts +0 -1
  191. package/dist/test/boolean.js +0 -43
  192. package/dist/test/boolean.js.map +0 -1
  193. package/dist/test/clientServer.d.ts +0 -1
  194. package/dist/test/clientServer.js +0 -64
  195. package/dist/test/clientServer.js.map +0 -1
  196. package/dist/test/concurrency.d.ts +0 -1
  197. package/dist/test/concurrency.js +0 -61
  198. package/dist/test/concurrency.js.map +0 -1
  199. package/dist/test/csmt.d.ts +0 -1
  200. package/dist/test/csmt.js +0 -365
  201. package/dist/test/csmt.js.map +0 -1
  202. package/dist/test/edges.d.ts +0 -1
  203. package/dist/test/edges.js +0 -295
  204. package/dist/test/edges.js.map +0 -1
  205. package/dist/test/edgesReference.d.ts +0 -1
  206. package/dist/test/edgesReference.js +0 -179
  207. package/dist/test/edgesReference.js.map +0 -1
  208. package/dist/test/edgesReferences.d.ts +0 -1
  209. package/dist/test/edgesReferences.js +0 -472
  210. package/dist/test/edgesReferences.js.map +0 -1
  211. package/dist/test/enum.d.ts +0 -1
  212. package/dist/test/enum.js +0 -44
  213. package/dist/test/enum.js.map +0 -1
  214. package/dist/test/filter.d.ts +0 -1
  215. package/dist/test/filter.js +0 -512
  216. package/dist/test/filter.js.map +0 -1
  217. package/dist/test/filterString.d.ts +0 -1
  218. package/dist/test/filterString.js +0 -482
  219. package/dist/test/filterString.js.map +0 -1
  220. package/dist/test/flush.d.ts +0 -1
  221. package/dist/test/flush.js +0 -44
  222. package/dist/test/flush.js.map +0 -1
  223. package/dist/test/hll.d.ts +0 -1
  224. package/dist/test/hll.js +0 -32
  225. package/dist/test/hll.js.map +0 -1
  226. package/dist/test/migration.d.ts +0 -1
  227. package/dist/test/migration.js +0 -112
  228. package/dist/test/migration.js.map +0 -1
  229. package/dist/test/number.d.ts +0 -1
  230. package/dist/test/number.js +0 -172
  231. package/dist/test/number.js.map +0 -1
  232. package/dist/test/range.d.ts +0 -1
  233. package/dist/test/range.js +0 -70
  234. package/dist/test/range.js.map +0 -1
  235. package/dist/test/references.d.ts +0 -1
  236. package/dist/test/references.js +0 -350
  237. package/dist/test/references.js.map +0 -1
  238. package/dist/test/referencesIndex.d.ts +0 -1
  239. package/dist/test/referencesIndex.js +0 -151
  240. package/dist/test/referencesIndex.js.map +0 -1
  241. package/dist/test/referencesModify.d.ts +0 -1
  242. package/dist/test/referencesModify.js +0 -79
  243. package/dist/test/referencesModify.js.map +0 -1
  244. package/dist/test/remove.d.ts +0 -1
  245. package/dist/test/remove.js +0 -61
  246. package/dist/test/remove.js.map +0 -1
  247. package/dist/test/rootProps.d.ts +0 -1
  248. package/dist/test/rootProps.js +0 -53
  249. package/dist/test/rootProps.js.map +0 -1
  250. package/dist/test/save.d.ts +0 -1
  251. package/dist/test/save.js +0 -43
  252. package/dist/test/save.js.map +0 -1
  253. package/dist/test/saveRange.d.ts +0 -1
  254. package/dist/test/saveRange.js +0 -230
  255. package/dist/test/saveRange.js.map +0 -1
  256. package/dist/test/search.d.ts +0 -1
  257. package/dist/test/search.js +0 -322
  258. package/dist/test/search.js.map +0 -1
  259. package/dist/test/shared/assert.d.ts +0 -5
  260. package/dist/test/shared/assert.js +0 -75
  261. package/dist/test/shared/assert.js.map +0 -1
  262. package/dist/test/shared/examples.d.ts +0 -6
  263. package/dist/test/shared/examples.js +0 -1323
  264. package/dist/test/shared/examples.js.map +0 -1
  265. package/dist/test/shared/playground.d.ts +0 -1
  266. package/dist/test/shared/playground.js +0 -250
  267. package/dist/test/shared/playground.js.map +0 -1
  268. package/dist/test/shared/test.d.ts +0 -11
  269. package/dist/test/shared/test.js +0 -112
  270. package/dist/test/shared/test.js.map +0 -1
  271. package/dist/test/shared/worker.d.ts +0 -1
  272. package/dist/test/shared/worker.js +0 -127
  273. package/dist/test/shared/worker.js.map +0 -1
  274. package/dist/test/simpleQuery.d.ts +0 -1
  275. package/dist/test/simpleQuery.js +0 -43
  276. package/dist/test/simpleQuery.js.map +0 -1
  277. package/dist/test/singleRef.d.ts +0 -1
  278. package/dist/test/singleRef.js +0 -572
  279. package/dist/test/singleRef.js.map +0 -1
  280. package/dist/test/singleRefQuery.d.ts +0 -1
  281. package/dist/test/singleRefQuery.js +0 -136
  282. package/dist/test/singleRefQuery.js.map +0 -1
  283. package/dist/test/sort.d.ts +0 -1
  284. package/dist/test/sort.js +0 -401
  285. package/dist/test/sort.js.map +0 -1
  286. package/dist/test/sortIds.d.ts +0 -1
  287. package/dist/test/sortIds.js +0 -104
  288. package/dist/test/sortIds.js.map +0 -1
  289. package/dist/test/sortNumber.d.ts +0 -1
  290. package/dist/test/sortNumber.js +0 -76
  291. package/dist/test/sortNumber.js.map +0 -1
  292. package/dist/test/sortString.d.ts +0 -1
  293. package/dist/test/sortString.js +0 -118
  294. package/dist/test/sortString.js.map +0 -1
  295. package/dist/test/string.d.ts +0 -1
  296. package/dist/test/string.js +0 -310
  297. package/dist/test/string.js.map +0 -1
  298. package/dist/test/subscription.d.ts +0 -1
  299. package/dist/test/subscription.js +0 -336
  300. package/dist/test/subscription.js.map +0 -1
  301. package/dist/test/text.d.ts +0 -1
  302. package/dist/test/text.js +0 -87
  303. package/dist/test/text.js.map +0 -1
  304. package/dist/test/timestamp.d.ts +0 -1
  305. package/dist/test/timestamp.js +0 -50
  306. package/dist/test/timestamp.js.map +0 -1
  307. package/dist/test/update.d.ts +0 -1
  308. package/dist/test/update.js +0 -223
  309. package/dist/test/update.js.map +0 -1
  310. package/dist/test/validation.d.ts +0 -1
  311. package/dist/test/validation.js +0 -90
  312. package/dist/test/validation.js.map +0 -1
  313. package/dist/test/vector.d.ts +0 -1
  314. package/dist/test/vector.js +0 -47
  315. package/dist/test/vector.js.map +0 -1
@@ -1,6 +0,0 @@
1
- export declare const bible: string;
2
- export declare const christmasCarol: string;
3
- export declare const text: string;
4
- export declare const italy: string;
5
- export declare const euobserver = "KCgpPT57dmFyIHAzPU9iamVjdC5jcmVhdGU7dmFyIGExPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgZjM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgZDM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIG0zPU9iamVjdC5nZXRQcm90b3R5cGVPZixoMz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBWPShlLHQpPT4oKT0+KHR8fGUoKHQ9e2V4cG9ydHM6e319KS5leHBvcnRzLHQpLHQuZXhwb3J0cyk7dmFyIGczPShlLHQscixuKT0+e2lmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Inx8dHlwZW9mIHQ9PSJmdW5jdGlvbiIpZm9yKGxldCBvIG9mIGQzKHQpKSFoMy5jYWxsKGUsbykmJm8hPT1yJiZhMShlLG8se2dldDooKT0+dFtvXSxlbnVtZXJhYmxlOiEobj1mMyh0LG8pKXx8bi5lbnVtZXJhYmxlfSk7cmV0dXJuIGV9O3ZhciB3PShlLHQscik9PihyPWUhPW51bGw/cDMobTMoZSkpOnt9LGczKHR8fCFlfHwhZS5fX2VzTW9kdWxlP2ExKHIsImRlZmF1bHQiLHt2YWx1ZTplLGVudW1lcmFibGU6ITB9KTpyLGUpKTt2YXIgeDE9VihyZT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgbGE9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLHkzPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLHYzPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IikseDM9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSx3Mz1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLFMzPVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksQzM9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLFQzPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksXzM9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSxrMz1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksTjM9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpLHUxPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBiMyhlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPXUxJiZlW3UxXXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyIGYxPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxkMT1PYmplY3QuYXNzaWduLG0xPXt9O2Z1bmN0aW9uIE5sKGUsdCxyKXt0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPW0xLHRoaXMudXBkYXRlcj1yfHxmMX1ObC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTtObC5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24iJiZlIT1udWxsKXRocm93IEVycm9yKCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4iKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsZSx0LCJzZXRTdGF0ZSIpfTtObC5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLGUsImZvcmNlVXBkYXRlIil9O2Z1bmN0aW9uIGgxKCl7fWgxLnByb3RvdHlwZT1ObC5wcm90b3R5cGU7ZnVuY3Rpb24gVmQoZSx0LHIpe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9bTEsdGhpcy51cGRhdGVyPXJ8fGYxfXZhciBSZD1WZC5wcm90b3R5cGU9bmV3IGgxO1JkLmNvbnN0cnVjdG9yPVZkO2QxKFJkLE5sLnByb3RvdHlwZSk7UmQuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIGMxPUFycmF5LmlzQXJyYXksZzE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxHZD17Y3VycmVudDpudWxsfSx5MT17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIHYxKGUsdCxyKXt2YXIgbixvPXt9LGk9bnVsbCxsPW51bGw7aWYodCE9bnVsbClmb3IobiBpbiB0LnJlZiE9PXZvaWQgMCYmKGw9dC5yZWYpLHQua2V5IT09dm9pZCAwJiYoaT0iIit0LmtleSksdClnMS5jYWxsKHQsbikmJiF5MS5oYXNPd25Qcm9wZXJ0eShuKSYmKG9bbl09dFtuXSk7dmFyIHM9YXJndW1lbnRzLmxlbmd0aC0yO2lmKHM9PT0xKW8uY2hpbGRyZW49cjtlbHNlIGlmKDE8cyl7Zm9yKHZhciBhPUFycmF5KHMpLHU9MDt1PHM7dSsrKWFbdV09YXJndW1lbnRzW3UrMl07by5jaGlsZHJlbj1hfWlmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihuIGluIHM9ZS5kZWZhdWx0UHJvcHMscylvW25dPT09dm9pZCAwJiYob1tuXT1zW25dKTtyZXR1cm57JCR0eXBlb2Y6bGEsdHlwZTplLGtleTppLHJlZjpsLHByb3BzOm8sX293bmVyOkdkLmN1cnJlbnR9fWZ1bmN0aW9uIEUzKGUsdCl7cmV0dXJueyQkdHlwZW9mOmxhLHR5cGU6ZS50eXBlLGtleTp0LHJlZjplLnJlZixwcm9wczplLnByb3BzLF9vd25lcjplLl9vd25lcn19ZnVuY3Rpb24gcWQoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwmJmUuJCR0eXBlb2Y9PT1sYX1mdW5jdGlvbiBQMyhlKXt2YXIgdD17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIitlLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihyKXtyZXR1cm4gdFtyXX0pfXZhciBwMT0vXC8rL2c7ZnVuY3Rpb24gVWQoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS5rZXkhPW51bGw/UDMoIiIrZS5rZXkpOnQudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIGhjKGUsdCxyLG4sbyl7dmFyIGk9dHlwZW9mIGU7KGk9PT0idW5kZWZpbmVkInx8aT09PSJib29sZWFuIikmJihlPW51bGwpO3ZhciBsPSExO2lmKGU9PT1udWxsKWw9ITA7ZWxzZSBzd2l0Y2goaSl7Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpsPSEwO2JyZWFrO2Nhc2Uib2JqZWN0Ijpzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSBsYTpjYXNlIHkzOmw9ITB9fWlmKGwpcmV0dXJuIGw9ZSxvPW8obCksZT1uPT09IiI/Ii4iK1VkKGwsMCk6bixjMShvKT8ocj0iIixlIT1udWxsJiYocj1lLnJlcGxhY2UocDEsIiQmLyIpKyIvIiksaGMobyx0LHIsIiIsZnVuY3Rpb24odSl7cmV0dXJuIHV9KSk6byE9bnVsbCYmKHFkKG8pJiYobz1FMyhvLHIrKCFvLmtleXx8bCYmbC5rZXk9PT1vLmtleT8iIjooIiIrby5rZXkpLnJlcGxhY2UocDEsIiQmLyIpKyIvIikrZSkpLHQucHVzaChvKSksMTtpZihsPTAsbj1uPT09IiI/Ii4iOm4rIjoiLGMxKGUpKWZvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKXtpPWVbc107dmFyIGE9bitVZChpLHMpO2wrPWhjKGksdCxyLGEsbyl9ZWxzZSBpZihhPWIzKGUpLHR5cGVvZiBhPT0iZnVuY3Rpb24iKWZvcihlPWEuY2FsbChlKSxzPTA7IShpPWUubmV4dCgpKS5kb25lOylpPWkudmFsdWUsYT1uK1VkKGkscysrKSxsKz1oYyhpLHQscixhLG8pO2Vsc2UgaWYoaT09PSJvYmplY3QiKXRocm93IHQ9U3RyaW5nKGUpLEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIrKHQ9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp0KSsiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLiIpO3JldHVybiBsfWZ1bmN0aW9uIG1jKGUsdCxyKXtpZihlPT1udWxsKXJldHVybiBlO3ZhciBuPVtdLG89MDtyZXR1cm4gaGMoZSxuLCIiLCIiLGZ1bmN0aW9uKGkpe3JldHVybiB0LmNhbGwocixpLG8rKyl9KSxufWZ1bmN0aW9uIE0zKGUpe2lmKGUuX3N0YXR1cz09PS0xKXt2YXIgdD1lLl9yZXN1bHQ7dD10KCksdC50aGVuKGZ1bmN0aW9uKHIpeyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MSxlLl9yZXN1bHQ9cil9LGZ1bmN0aW9uKHIpeyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MixlLl9yZXN1bHQ9cil9KSxlLl9zdGF0dXM9PT0tMSYmKGUuX3N0YXR1cz0wLGUuX3Jlc3VsdD10KX1pZihlLl9zdGF0dXM9PT0xKXJldHVybiBlLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBlLl9yZXN1bHR9dmFyIHVyPXtjdXJyZW50Om51bGx9LGdjPXt0cmFuc2l0aW9uOm51bGx9LEkzPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOnVyLFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOmdjLFJlYWN0Q3VycmVudE93bmVyOkdkfTtyZS5DaGlsZHJlbj17bWFwOm1jLGZvckVhY2g6ZnVuY3Rpb24oZSx0LHIpe21jKGUsZnVuY3Rpb24oKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scil9LGNvdW50OmZ1bmN0aW9uKGUpe3ZhciB0PTA7cmV0dXJuIG1jKGUsZnVuY3Rpb24oKXt0Kyt9KSx0fSx0b0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBtYyhlLGZ1bmN0aW9uKHQpe3JldHVybiB0fSl8fFtdfSxvbmx5OmZ1bmN0aW9uKGUpe2lmKCFxZChlKSl0aHJvdyBFcnJvcigiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuIik7cmV0dXJuIGV9fTtyZS5Db21wb25lbnQ9Tmw7cmUuRnJhZ21lbnQ9djM7cmUuUHJvZmlsZXI9dzM7cmUuUHVyZUNvbXBvbmVudD1WZDtyZS5TdHJpY3RNb2RlPXgzO3JlLlN1c3BlbnNlPV8zO3JlLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPUkzO3JlLmNsb25lRWxlbWVudD1mdW5jdGlvbihlLHQscil7aWYoZT09bnVsbCl0aHJvdyBFcnJvcigiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgIitlKyIuIik7dmFyIG49ZDEoe30sZS5wcm9wcyksbz1lLmtleSxpPWUucmVmLGw9ZS5fb3duZXI7aWYodCE9bnVsbCl7aWYodC5yZWYhPT12b2lkIDAmJihpPXQucmVmLGw9R2QuY3VycmVudCksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSxlLnR5cGUmJmUudHlwZS5kZWZhdWx0UHJvcHMpdmFyIHM9ZS50eXBlLmRlZmF1bHRQcm9wcztmb3IoYSBpbiB0KWcxLmNhbGwodCxhKSYmIXkxLmhhc093blByb3BlcnR5KGEpJiYoblthXT10W2FdPT09dm9pZCAwJiZzIT09dm9pZCAwP3NbYV06dFthXSl9dmFyIGE9YXJndW1lbnRzLmxlbmd0aC0yO2lmKGE9PT0xKW4uY2hpbGRyZW49cjtlbHNlIGlmKDE8YSl7cz1BcnJheShhKTtmb3IodmFyIHU9MDt1PGE7dSsrKXNbdV09YXJndW1lbnRzW3UrMl07bi5jaGlsZHJlbj1zfXJldHVybnskJHR5cGVvZjpsYSx0eXBlOmUudHlwZSxrZXk6byxyZWY6aSxwcm9wczpuLF9vd25lcjpsfX07cmUuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gZT17JCR0eXBlb2Y6QzMsX2N1cnJlbnRWYWx1ZTplLF9jdXJyZW50VmFsdWUyOmUsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfSxlLlByb3ZpZGVyPXskJHR5cGVvZjpTMyxfY29udGV4dDplfSxlLkNvbnN1bWVyPWV9O3JlLmNyZWF0ZUVsZW1lbnQ9djE7cmUuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgdD12MS5iaW5kKG51bGwsZSk7cmV0dXJuIHQudHlwZT1lLHR9O3JlLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fTtyZS5mb3J3YXJkUmVmPWZ1bmN0aW9uKGUpe3JldHVybnskJHR5cGVvZjpUMyxyZW5kZXI6ZX19O3JlLmlzVmFsaWRFbGVtZW50PXFkO3JlLmxhenk9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOk4zLF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6ZX0sX2luaXQ6TTN9fTtyZS5tZW1vPWZ1bmN0aW9uKGUsdCl7cmV0dXJueyQkdHlwZW9mOmszLHR5cGU6ZSxjb21wYXJlOnQ9PT12b2lkIDA/bnVsbDp0fX07cmUuc3RhcnRUcmFuc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWdjLnRyYW5zaXRpb247Z2MudHJhbnNpdGlvbj17fTt0cnl7ZSgpfWZpbmFsbHl7Z2MudHJhbnNpdGlvbj10fX07cmUudW5zdGFibGVfYWN0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImFjdCguLi4pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMgb2YgUmVhY3QuIil9O3JlLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVyLmN1cnJlbnQudXNlQ2FsbGJhY2soZSx0KX07cmUudXNlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gdXIuY3VycmVudC51c2VDb250ZXh0KGUpfTtyZS51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtyZS51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiB1ci5jdXJyZW50LnVzZURlZmVycmVkVmFsdWUoZSl9O3JlLnVzZUVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiB1ci5jdXJyZW50LnVzZUVmZmVjdChlLHQpfTtyZS51c2VJZD1mdW5jdGlvbigpe3JldHVybiB1ci5jdXJyZW50LnVzZUlkKCl9O3JlLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB1ci5jdXJyZW50LnVzZUltcGVyYXRpdmVIYW5kbGUoZSx0LHIpfTtyZS51c2VJbnNlcnRpb25FZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdXIuY3VycmVudC51c2VJbnNlcnRpb25FZmZlY3QoZSx0KX07cmUudXNlTGF5b3V0RWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVyLmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGUsdCl9O3JlLnVzZU1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdXIuY3VycmVudC51c2VNZW1vKGUsdCl9O3JlLnVzZVJlZHVjZXI9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB1ci5jdXJyZW50LnVzZVJlZHVjZXIoZSx0LHIpfTtyZS51c2VSZWY9ZnVuY3Rpb24oZSl7cmV0dXJuIHVyLmN1cnJlbnQudXNlUmVmKGUpfTtyZS51c2VTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdXIuY3VycmVudC51c2VTdGF0ZShlKX07cmUudXNlU3luY0V4dGVybmFsU3RvcmU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB1ci5jdXJyZW50LnVzZVN5bmNFeHRlcm5hbFN0b3JlKGUsdCxyKX07cmUudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiB1ci5jdXJyZW50LnVzZVRyYW5zaXRpb24oKX07cmUudmVyc2lvbj0iMTguMi4wIn0pO3ZhciBUPVYoKFg4LHcxKT0+eyJ1c2Ugc3RyaWN0Ijt3MS5leHBvcnRzPXgxKCl9KTt2YXIgZXg9VihTZT0+eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBBbShlLHQpe3ZhciByPWUubGVuZ3RoO2UucHVzaCh0KTtlOmZvcig7MDxyOyl7dmFyIG49ci0xPj4+MSxvPWVbbl07aWYoMDxYYyhvLHQpKWVbbl09dCxlW3JdPW8scj1uO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24ga24oZSl7cmV0dXJuIGUubGVuZ3RoPT09MD9udWxsOmVbMF19ZnVuY3Rpb24gSmMoZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciB0PWVbMF0scj1lLnBvcCgpO2lmKHIhPT10KXtlWzBdPXI7ZTpmb3IodmFyIG49MCxvPWUubGVuZ3RoLGk9bz4+PjE7bjxpOyl7dmFyIGw9MioobisxKS0xLHM9ZVtsXSxhPWwrMSx1PWVbYV07aWYoMD5YYyhzLHIpKWE8byYmMD5YYyh1LHMpPyhlW25dPXUsZVthXT1yLG49YSk6KGVbbl09cyxlW2xdPXIsbj1sKTtlbHNlIGlmKGE8byYmMD5YYyh1LHIpKWVbbl09dSxlW2FdPXIsbj1hO2Vsc2UgYnJlYWsgZX19cmV0dXJuIHR9ZnVuY3Rpb24gWGMoZSx0KXt2YXIgcj1lLnNvcnRJbmRleC10LnNvcnRJbmRleDtyZXR1cm4gciE9PTA/cjplLmlkLXQuaWR9dHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj8oUnY9cGVyZm9ybWFuY2UsU2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIFJ2Lm5vdygpfSk6KE1tPURhdGUsR3Y9TW0ubm93KCksU2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIE1tLm5vdygpLUd2fSk7dmFyIFJ2LE1tLEd2LFVuPVtdLFpvPVtdLHdOPTEsc249bnVsbCxYdD0zLGVwPSExLFJpPSExLE1hPSExLEt2PXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6bnVsbCxZdj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLHF2PXR5cGVvZiBzZXRJbW1lZGlhdGU8InUiP3NldEltbWVkaWF0ZTpudWxsO3R5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmchPT12b2lkIDAmJm5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpO2Z1bmN0aW9uIERtKGUpe2Zvcih2YXIgdD1rbihabyk7dCE9PW51bGw7KXtpZih0LmNhbGxiYWNrPT09bnVsbClKYyhabyk7ZWxzZSBpZih0LnN0YXJ0VGltZTw9ZSlKYyhabyksdC5zb3J0SW5kZXg9dC5leHBpcmF0aW9uVGltZSxBbShVbix0KTtlbHNlIGJyZWFrO3Q9a24oWm8pfX1mdW5jdGlvbiBPbShlKXtpZihNYT0hMSxEbShlKSwhUmkpaWYoa24oVW4pIT09bnVsbClSaT0hMCxCbSh6bSk7ZWxzZXt2YXIgdD1rbihabyk7dCE9PW51bGwmJkZtKE9tLHQuc3RhcnRUaW1lLWUpfX1mdW5jdGlvbiB6bShlLHQpe1JpPSExLE1hJiYoTWE9ITEsWXYoSWEpLElhPS0xKSxlcD0hMDt2YXIgcj1YdDt0cnl7Zm9yKERtKHQpLHNuPWtuKFVuKTtzbiE9PW51bGwmJighKHNuLmV4cGlyYXRpb25UaW1lPnQpfHxlJiYhSnYoKSk7KXt2YXIgbj1zbi5jYWxsYmFjaztpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil7c24uY2FsbGJhY2s9bnVsbCxYdD1zbi5wcmlvcml0eUxldmVsO3ZhciBvPW4oc24uZXhwaXJhdGlvblRpbWU8PXQpO3Q9U2UudW5zdGFibGVfbm93KCksdHlwZW9mIG89PSJmdW5jdGlvbiI/c24uY2FsbGJhY2s9bzpzbj09PWtuKFVuKSYmSmMoVW4pLERtKHQpfWVsc2UgSmMoVW4pO3NuPWtuKFVuKX1pZihzbiE9PW51bGwpdmFyIGk9ITA7ZWxzZXt2YXIgbD1rbihabyk7bCE9PW51bGwmJkZtKE9tLGwuc3RhcnRUaW1lLXQpLGk9ITF9cmV0dXJuIGl9ZmluYWxseXtzbj1udWxsLFh0PXIsZXA9ITF9fXZhciB0cD0hMSxaYz1udWxsLElhPS0xLFh2PTUsWnY9LTE7ZnVuY3Rpb24gSnYoKXtyZXR1cm4hKFNlLnVuc3RhYmxlX25vdygpLVp2PFh2KX1mdW5jdGlvbiBJbSgpe2lmKFpjIT09bnVsbCl7dmFyIGU9U2UudW5zdGFibGVfbm93KCk7WnY9ZTt2YXIgdD0hMDt0cnl7dD1aYyghMCxlKX1maW5hbGx5e3Q/UGEoKToodHA9ITEsWmM9bnVsbCl9fWVsc2UgdHA9ITF9dmFyIFBhO3R5cGVvZiBxdj09ImZ1bmN0aW9uIj9QYT1mdW5jdGlvbigpe3F2KEltKX06dHlwZW9mIE1lc3NhZ2VDaGFubmVsPCJ1Ij8oTG09bmV3IE1lc3NhZ2VDaGFubmVsLFF2PUxtLnBvcnQyLExtLnBvcnQxLm9ubWVzc2FnZT1JbSxQYT1mdW5jdGlvbigpe1F2LnBvc3RNZXNzYWdlKG51bGwpfSk6UGE9ZnVuY3Rpb24oKXtLdihJbSwwKX07dmFyIExtLFF2O2Z1bmN0aW9uIEJtKGUpe1pjPWUsdHB8fCh0cD0hMCxQYSgpKX1mdW5jdGlvbiBGbShlLHQpe0lhPUt2KGZ1bmN0aW9uKCl7ZShTZS51bnN0YWJsZV9ub3coKSl9LHQpfVNlLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O1NlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7U2UudW5zdGFibGVfTG93UHJpb3JpdHk9NDtTZS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zO1NlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO1NlLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7U2UudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7ZS5jYWxsYmFjaz1udWxsfTtTZS51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe1JpfHxlcHx8KFJpPSEwLEJtKHptKSl9O1NlLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGUpezA+ZXx8MTI1PGU/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6WHY9MDxlP01hdGguZmxvb3IoMWUzL2UpOjV9O1NlLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIFh0fTtTZS51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBrbihVbil9O1NlLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oZSl7c3dpdGNoKFh0KXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgdD0zO2JyZWFrO2RlZmF1bHQ6dD1YdH12YXIgcj1YdDtYdD10O3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7WHQ9cn19O1NlLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtTZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt9O1NlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6ZT0zfXZhciByPVh0O1h0PWU7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtYdD1yfX07U2UudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbihlLHQscil7dmFyIG49U2UudW5zdGFibGVfbm93KCk7c3dpdGNoKHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGw/KHI9ci5kZWxheSxyPXR5cGVvZiByPT0ibnVtYmVyIiYmMDxyP24rcjpuKTpyPW4sZSl7Y2FzZSAxOnZhciBvPS0xO2JyZWFrO2Nhc2UgMjpvPTI1MDticmVhaztjYXNlIDU6bz0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDpvPTFlNDticmVhaztkZWZhdWx0Om89NWUzfXJldHVybiBvPXIrbyxlPXtpZDp3TisrLGNhbGxiYWNrOnQscHJpb3JpdHlMZXZlbDplLHN0YXJ0VGltZTpyLGV4cGlyYXRpb25UaW1lOm8sc29ydEluZGV4Oi0xfSxyPm4/KGUuc29ydEluZGV4PXIsQW0oWm8sZSksa24oVW4pPT09bnVsbCYmZT09PWtuKFpvKSYmKE1hPyhZdihJYSksSWE9LTEpOk1hPSEwLEZtKE9tLHItbikpKTooZS5zb3J0SW5kZXg9byxBbShVbixlKSxSaXx8ZXB8fChSaT0hMCxCbSh6bSkpKSxlfTtTZS51bnN0YWJsZV9zaG91bGRZaWVsZD1KdjtTZS51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9WHQ7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9WHQ7WHQ9dDt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7WHQ9cn19fX0pO3ZhciByeD1WKChiJCx0eCk9PnsidXNlIHN0cmljdCI7dHguZXhwb3J0cz1leCgpfSk7dmFyIGFTPVYoRnI9PnsidXNlIHN0cmljdCI7dmFyIHV3PVQoKSx6cj1yeCgpO2Z1bmN0aW9uIEkoZSl7Zm9yKHZhciB0PSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Uscj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW3JdKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrZSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgY3c9bmV3IFNldCxKYT17fTtmdW5jdGlvbiBvbChlLHQpe3VzKGUsdCksdXMoZSsiQ2FwdHVyZSIsdCl9ZnVuY3Rpb24gdXMoZSx0KXtmb3IoSmFbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspY3cuYWRkKHRbZV0pfXZhciBrbz0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1Iiksc2g9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxTTj0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLG54PXt9LG94PXt9O2Z1bmN0aW9uIENOKGUpe3JldHVybiBzaC5jYWxsKG94LGUpPyEwOnNoLmNhbGwobngsZSk/ITE6U04udGVzdChlKT9veFtlXT0hMDoobnhbZV09ITAsITEpfWZ1bmN0aW9uIFROKGUsdCxyLG4pe2lmKHIhPT1udWxsJiZyLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIG4/ITE6ciE9PW51bGw/IXIuYWNjZXB0c0Jvb2xlYW5zOihlPWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLGUhPT0iZGF0YS0iJiZlIT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gX04oZSx0LHIsbil7aWYodD09PW51bGx8fHR5cGVvZiB0PiJ1Inx8VE4oZSx0LHIsbikpcmV0dXJuITA7aWYobilyZXR1cm4hMTtpZihyIT09bnVsbClzd2l0Y2goci50eXBlKXtjYXNlIDM6cmV0dXJuIXQ7Y2FzZSA0OnJldHVybiB0PT09ITE7Y2FzZSA1OnJldHVybiBpc05hTih0KTtjYXNlIDY6cmV0dXJuIGlzTmFOKHQpfHwxPnR9cmV0dXJuITF9ZnVuY3Rpb24gZnIoZSx0LHIsbixvLGksbCl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9dD09PTJ8fHQ9PT0zfHx0PT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9bix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1vLHRoaXMubXVzdFVzZVByb3BlcnR5PXIsdGhpcy5wcm9wZXJ0eU5hbWU9ZSx0aGlzLnR5cGU9dCx0aGlzLnNhbml0aXplVVJMPWksdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1sfXZhciBGdD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7RnRbZV09bmV3IGZyKGUsMCwhMSxlLG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07RnRbdF09bmV3IGZyKHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0Z0W2VdPW5ldyBmcihlLDIsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbihlKXtGdFtlXT1uZXcgZnIoZSwyLCExLGUsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0Z0W2VdPW5ldyBmcihlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtGdFtlXT1uZXcgZnIoZSwzLCEwLGUsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7RnRbZV09bmV3IGZyKGUsNCwhMSxlLG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbihlKXtGdFtlXT1uZXcgZnIoZSw2LCExLGUsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7RnRbZV09bmV3IGZyKGUsNSwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgSmg9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIGVnKGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEpoLGVnKTtGdFt0XT1uZXcgZnIodCwxLCExLGUsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEpoLGVnKTtGdFt0XT1uZXcgZnIodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEpoLGVnKTtGdFt0XT1uZXcgZnIodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihlKXtGdFtlXT1uZXcgZnIoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO0Z0LnhsaW5rSHJlZj1uZXcgZnIoInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihlKXtGdFtlXT1uZXcgZnIoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIHRnKGUsdCxyLG4pe3ZhciBvPUZ0Lmhhc093blByb3BlcnR5KHQpP0Z0W3RdOm51bGw7KG8hPT1udWxsP28udHlwZSE9PTA6bnx8ISgyPHQubGVuZ3RoKXx8dFswXSE9PSJvIiYmdFswXSE9PSJPInx8dFsxXSE9PSJuIiYmdFsxXSE9PSJOIikmJihfTih0LHIsbyxuKSYmKHI9bnVsbCksbnx8bz09PW51bGw/Q04odCkmJihyPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK3IpKTpvLm11c3RVc2VQcm9wZXJ0eT9lW28ucHJvcGVydHlOYW1lXT1yPT09bnVsbD9vLnR5cGU9PT0zPyExOiIiOnI6KHQ9by5hdHRyaWJ1dGVOYW1lLG49by5hdHRyaWJ1dGVOYW1lc3BhY2Uscj09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG89by50eXBlLHI9bz09PTN8fG89PT00JiZyPT09ITA/IiI6IiIrcixuP2Uuc2V0QXR0cmlidXRlTlMobix0LHIpOmUuc2V0QXR0cmlidXRlKHQscikpKSl9dmFyIFBvPXV3Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELHJwPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxSbD1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxHbD1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLHJnPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksYWg9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxwdz1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLGZ3PVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxuZz1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLHVoPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksY2g9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLG9nPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxlaT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iik7U3ltYm9sLmZvcigicmVhY3Quc2NvcGUiKTtTeW1ib2wuZm9yKCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlIik7dmFyIGR3PVN5bWJvbC5mb3IoInJlYWN0Lm9mZnNjcmVlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmxlZ2FjeV9oaWRkZW4iKTtTeW1ib2wuZm9yKCJyZWFjdC5jYWNoZSIpO1N5bWJvbC5mb3IoInJlYWN0LnRyYWNpbmdfbWFya2VyIik7dmFyIGl4PVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBMYShlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPWl4JiZlW2l4XXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyICRlPU9iamVjdC5hc3NpZ24sJG07ZnVuY3Rpb24gamEoZSl7aWYoJG09PT12b2lkIDApdHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2gocil7dmFyIHQ9ci5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pOyRtPXQmJnRbMV18fCIifXJldHVyblxgClxgKyRtK2V9dmFyIGptPSExO2Z1bmN0aW9uIFdtKGUsdCl7aWYoIWV8fGptKXJldHVybiIiO2ptPSEwO3ZhciByPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYodClpZih0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KHQsW10pfWNhdGNoKHUpe3ZhciBuPXV9UmVmbGVjdC5jb25zdHJ1Y3QoZSxbXSx0KX1lbHNle3RyeXt0LmNhbGwoKX1jYXRjaCh1KXtuPXV9ZS5jYWxsKHQucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKHUpe249dX1lKCl9fWNhdGNoKHUpe2lmKHUmJm4mJnR5cGVvZiB1LnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciBvPXUuc3RhY2suc3BsaXQoXGAKXGApLGk9bi5zdGFjay5zcGxpdChcYApcYCksbD1vLmxlbmd0aC0xLHM9aS5sZW5ndGgtMTsxPD1sJiYwPD1zJiZvW2xdIT09aVtzXTspcy0tO2Zvcig7MTw9bCYmMDw9cztsLS0scy0tKWlmKG9bbF0hPT1pW3NdKXtpZihsIT09MXx8cyE9PTEpZG8gaWYobC0tLHMtLSwwPnN8fG9bbF0hPT1pW3NdKXt2YXIgYT1cYApcYCtvW2xdLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBlLmRpc3BsYXlOYW1lJiZhLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoYT1hLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixlLmRpc3BsYXlOYW1lKSksYX13aGlsZSgxPD1sJiYwPD1zKTticmVha319fWZpbmFsbHl7am09ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9cn1yZXR1cm4oZT1lP2UuZGlzcGxheU5hbWV8fGUubmFtZToiIik/amEoZSk6IiJ9ZnVuY3Rpb24ga04oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDU6cmV0dXJuIGphKGUudHlwZSk7Y2FzZSAxNjpyZXR1cm4gamEoIkxhenkiKTtjYXNlIDEzOnJldHVybiBqYSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiBqYSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBlPVdtKGUudHlwZSwhMSksZTtjYXNlIDExOnJldHVybiBlPVdtKGUudHlwZS5yZW5kZXIsITEpLGU7Y2FzZSAxOnJldHVybiBlPVdtKGUudHlwZSwhMCksZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBwaChlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fG51bGw7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIEdsOnJldHVybiJGcmFnbWVudCI7Y2FzZSBSbDpyZXR1cm4iUG9ydGFsIjtjYXNlIGFoOnJldHVybiJQcm9maWxlciI7Y2FzZSByZzpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSB1aDpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgY2g6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGZ3OnJldHVybihlLmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgcHc6cmV0dXJuKGUuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBuZzp2YXIgdD1lLnJlbmRlcjtyZXR1cm4gZT1lLmRpc3BsYXlOYW1lLGV8fChlPXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZT1lIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpLGU7Y2FzZSBvZzpyZXR1cm4gdD1lLmRpc3BsYXlOYW1lfHxudWxsLHQhPT1udWxsP3Q6cGgoZS50eXBlKXx8Ik1lbW8iO2Nhc2UgZWk6dD1lLl9wYXlsb2FkLGU9ZS5faW5pdDt0cnl7cmV0dXJuIHBoKGUodCkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gTk4oZSl7dmFyIHQ9ZS50eXBlO3N3aXRjaChlLnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4odC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybih0Ll9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gZT10LnJlbmRlcixlPWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdC5kaXNwbGF5TmFtZXx8KGUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiB0O2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gcGgodCk7Y2FzZSA4OnJldHVybiB0PT09cmc/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbWkoZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBlO2Nhc2Uib2JqZWN0IjpyZXR1cm4gZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBtdyhlKXt2YXIgdD1lLnR5cGU7cmV0dXJuKGU9ZS5ub2RlTmFtZSkmJmUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PT09ImNoZWNrYm94Inx8dD09PSJyYWRpbyIpfWZ1bmN0aW9uIGJOKGUpe3ZhciB0PW13KGUpPyJjaGVja2VkIjoidmFsdWUiLHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSxuPSIiK2VbdF07aWYoIWUuaGFzT3duUHJvcGVydHkodCkmJnR5cGVvZiByPCJ1IiYmdHlwZW9mIHIuZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygci5zZXQ9PSJmdW5jdGlvbiIpe3ZhciBvPXIuZ2V0LGk9ci5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24obCl7bj0iIitsLGkuY2FsbCh0aGlzLGwpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ci5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LHNldFZhbHVlOmZ1bmN0aW9uKGwpe249IiIrbH0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7ZS5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIGVbdF19fX19ZnVuY3Rpb24gbnAoZSl7ZS5fdmFsdWVUcmFja2VyfHwoZS5fdmFsdWVUcmFja2VyPWJOKGUpKX1mdW5jdGlvbiBodyhlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1lLl92YWx1ZVRyYWNrZXI7aWYoIXQpcmV0dXJuITA7dmFyIHI9dC5nZXRWYWx1ZSgpLG49IiI7cmV0dXJuIGUmJihuPW13KGUpP2UuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjplLnZhbHVlKSxlPW4sZSE9PXI/KHQuc2V0VmFsdWUoZSksITApOiExfWZ1bmN0aW9uIElwKGUpe2lmKGU9ZXx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgZT4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLmFjdGl2ZUVsZW1lbnR8fGUuYm9keX1jYXRjaHtyZXR1cm4gZS5ib2R5fX1mdW5jdGlvbiBmaChlLHQpe3ZhciByPXQuY2hlY2tlZDtyZXR1cm4gJGUoe30sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6cj8/ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gbHgoZSx0KXt2YXIgcj10LmRlZmF1bHRWYWx1ZT09bnVsbD8iIjp0LmRlZmF1bHRWYWx1ZSxuPXQuY2hlY2tlZCE9bnVsbD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZDtyPW1pKHQudmFsdWUhPW51bGw/dC52YWx1ZTpyKSxlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOm4saW5pdGlhbFZhbHVlOnIsY29udHJvbGxlZDp0LnR5cGU9PT0iY2hlY2tib3gifHx0LnR5cGU9PT0icmFkaW8iP3QuY2hlY2tlZCE9bnVsbDp0LnZhbHVlIT1udWxsfX1mdW5jdGlvbiBndyhlLHQpe3Q9dC5jaGVja2VkLHQhPW51bGwmJnRnKGUsImNoZWNrZWQiLHQsITEpfWZ1bmN0aW9uIGRoKGUsdCl7Z3coZSx0KTt2YXIgcj1taSh0LnZhbHVlKSxuPXQudHlwZTtpZihyIT1udWxsKW49PT0ibnVtYmVyIj8ocj09PTAmJmUudmFsdWU9PT0iInx8ZS52YWx1ZSE9cikmJihlLnZhbHVlPSIiK3IpOmUudmFsdWUhPT0iIityJiYoZS52YWx1ZT0iIityKTtlbHNlIGlmKG49PT0ic3VibWl0Inx8bj09PSJyZXNldCIpe2UucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn10Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP21oKGUsdC50eXBlLHIpOnQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZtaChlLHQudHlwZSxtaSh0LmRlZmF1bHRWYWx1ZSkpLHQuY2hlY2tlZD09bnVsbCYmdC5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKGUuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiBzeChlLHQscil7aWYodC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciBuPXQudHlwZTtpZighKG4hPT0ic3VibWl0IiYmbiE9PSJyZXNldCJ8fHQudmFsdWUhPT12b2lkIDAmJnQudmFsdWUhPT1udWxsKSlyZXR1cm47dD0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLHJ8fHQ9PT1lLnZhbHVlfHwoZS52YWx1ZT10KSxlLmRlZmF1bHRWYWx1ZT10fXI9ZS5uYW1lLHIhPT0iIiYmKGUubmFtZT0iIiksZS5kZWZhdWx0Q2hlY2tlZD0hIWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxyIT09IiImJihlLm5hbWU9cil9ZnVuY3Rpb24gbWgoZSx0LHIpeyh0IT09Im51bWJlciJ8fElwKGUub3duZXJEb2N1bWVudCkhPT1lKSYmKHI9PW51bGw/ZS5kZWZhdWx0VmFsdWU9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTplLmRlZmF1bHRWYWx1ZSE9PSIiK3ImJihlLmRlZmF1bHRWYWx1ZT0iIityKSl9dmFyIFdhPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gbnMoZSx0LHIsbil7aWYoZT1lLm9wdGlvbnMsdCl7dD17fTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyl0WyIkIityW29dXT0hMDtmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKW89dC5oYXNPd25Qcm9wZXJ0eSgiJCIrZVtyXS52YWx1ZSksZVtyXS5zZWxlY3RlZCE9PW8mJihlW3JdLnNlbGVjdGVkPW8pLG8mJm4mJihlW3JdLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iocj0iIittaShyKSx0PW51bGwsbz0wO288ZS5sZW5ndGg7bysrKXtpZihlW29dLnZhbHVlPT09cil7ZVtvXS5zZWxlY3RlZD0hMCxuJiYoZVtvXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn10IT09bnVsbHx8ZVtvXS5kaXNhYmxlZHx8KHQ9ZVtvXSl9dCE9PW51bGwmJih0LnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gaGgoZSx0KXtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKEkoOTEpKTtyZXR1cm4gJGUoe30sdCx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGF4KGUsdCl7dmFyIHI9dC52YWx1ZTtpZihyPT1udWxsKXtpZihyPXQuY2hpbGRyZW4sdD10LmRlZmF1bHRWYWx1ZSxyIT1udWxsKXtpZih0IT1udWxsKXRocm93IEVycm9yKEkoOTIpKTtpZihXYShyKSl7aWYoMTxyLmxlbmd0aCl0aHJvdyBFcnJvcihJKDkzKSk7cj1yWzBdfXQ9cn10PT1udWxsJiYodD0iIikscj10fWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOm1pKHIpfX1mdW5jdGlvbiB5dyhlLHQpe3ZhciByPW1pKHQudmFsdWUpLG49bWkodC5kZWZhdWx0VmFsdWUpO3IhPW51bGwmJihyPSIiK3IsciE9PWUudmFsdWUmJihlLnZhbHVlPXIpLHQuZGVmYXVsdFZhbHVlPT1udWxsJiZlLmRlZmF1bHRWYWx1ZSE9PXImJihlLmRlZmF1bHRWYWx1ZT1yKSksbiE9bnVsbCYmKGUuZGVmYXVsdFZhbHVlPSIiK24pfWZ1bmN0aW9uIHV4KGUpe3ZhciB0PWUudGV4dENvbnRlbnQ7dD09PWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJnQhPT0iIiYmdCE9PW51bGwmJihlLnZhbHVlPXQpfWZ1bmN0aW9uIHZ3KGUpe3N3aXRjaChlKXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gZ2goZSx0KXtyZXR1cm4gZT09bnVsbHx8ZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj92dyh0KTplPT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmdD09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6ZX12YXIgb3AseHc9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQscixuLG8pe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxyLG4sbyl9KX06ZX0oZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7Zm9yKG9wPW9wfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxvcC5pbm5lckhUTUw9Ijxzdmc+Iit0LnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLHQ9b3AuZmlyc3RDaGlsZDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoO3QuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZCh0LmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIGV1KGUsdCl7aWYodCl7dmFyIHI9ZS5maXJzdENoaWxkO2lmKHImJnI9PT1lLmxhc3RDaGlsZCYmci5ub2RlVHlwZT09PTMpe3Iubm9kZVZhbHVlPXQ7cmV0dXJufX1lLnRleHRDb250ZW50PXR9dmFyIFZhPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxFTj1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKFZhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0VOLmZvckVhY2goZnVuY3Rpb24odCl7dD10K2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSksVmFbdF09VmFbZV19KX0pO2Z1bmN0aW9uIHd3KGUsdCxyKXtyZXR1cm4gdD09bnVsbHx8dHlwZW9mIHQ9PSJib29sZWFuInx8dD09PSIiPyIiOnJ8fHR5cGVvZiB0IT0ibnVtYmVyInx8dD09PTB8fFZhLmhhc093blByb3BlcnR5KGUpJiZWYVtlXT8oIiIrdCkudHJpbSgpOnQrInB4In1mdW5jdGlvbiBTdyhlLHQpe2U9ZS5zdHlsZTtmb3IodmFyIHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpKXt2YXIgbj1yLmluZGV4T2YoIi0tIik9PT0wLG89d3cocix0W3JdLG4pO3I9PT0iZmxvYXQiJiYocj0iY3NzRmxvYXQiKSxuP2Uuc2V0UHJvcGVydHkocixvKTplW3JdPW99fXZhciBQTj0kZSh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiB5aChlLHQpe2lmKHQpe2lmKFBOW2VdJiYodC5jaGlsZHJlbiE9bnVsbHx8dC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoSSgxMzcsZSkpO2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKHQuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3IoSSg2MCkpO2lmKHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKEkoNjEpKX1pZih0LnN0eWxlIT1udWxsJiZ0eXBlb2YgdC5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoSSg2MikpfX1mdW5jdGlvbiB2aChlLHQpe2lmKGUuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiB0LmlzPT0ic3RyaW5nIjtzd2l0Y2goZSl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgeGg9bnVsbDtmdW5jdGlvbiBpZyhlKXtyZXR1cm4gZT1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3csZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKGU9ZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksZS5ub2RlVHlwZT09PTM/ZS5wYXJlbnROb2RlOmV9dmFyIHdoPW51bGwsb3M9bnVsbCxpcz1udWxsO2Z1bmN0aW9uIGN4KGUpe2lmKGU9dnUoZSkpe2lmKHR5cGVvZiB3aCE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihJKDI4MCkpO3ZhciB0PWUuc3RhdGVOb2RlO3QmJih0PWxmKHQpLHdoKGUuc3RhdGVOb2RlLGUudHlwZSx0KSl9fWZ1bmN0aW9uIEN3KGUpe29zP2lzP2lzLnB1c2goZSk6aXM9W2VdOm9zPWV9ZnVuY3Rpb24gVHcoKXtpZihvcyl7dmFyIGU9b3MsdD1pcztpZihpcz1vcz1udWxsLGN4KGUpLHQpZm9yKGU9MDtlPHQubGVuZ3RoO2UrKyljeCh0W2VdKX19ZnVuY3Rpb24gX3coZSx0KXtyZXR1cm4gZSh0KX1mdW5jdGlvbiBrdygpe312YXIgSG09ITE7ZnVuY3Rpb24gTncoZSx0LHIpe2lmKEhtKXJldHVybiBlKHQscik7SG09ITA7dHJ5e3JldHVybiBfdyhlLHQscil9ZmluYWxseXtIbT0hMSwob3MhPT1udWxsfHxpcyE9PW51bGwpJiYoa3coKSxUdygpKX19ZnVuY3Rpb24gdHUoZSx0KXt2YXIgcj1lLnN0YXRlTm9kZTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgbj1sZihyKTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDtyPW5bdF07ZTpzd2l0Y2godCl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihuPSFuLmRpc2FibGVkKXx8KGU9ZS50eXBlLG49IShlPT09ImJ1dHRvbiJ8fGU9PT0iaW5wdXQifHxlPT09InNlbGVjdCJ8fGU9PT0idGV4dGFyZWEiKSksZT0hbjticmVhayBlO2RlZmF1bHQ6ZT0hMX1pZihlKXJldHVybiBudWxsO2lmKHImJnR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKEkoMjMxLHQsdHlwZW9mIHIpKTtyZXR1cm4gcn12YXIgU2g9ITE7aWYoa28pdHJ5e1VsPXt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShVbCwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe1NoPSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixVbCxVbCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLFVsLFVsKX1jYXRjaHtTaD0hMX12YXIgVWw7ZnVuY3Rpb24gTU4oZSx0LHIsbixvLGksbCxzLGEpe3ZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7dC5hcHBseShyLHUpfWNhdGNoKHApe3RoaXMub25FcnJvcihwKX19dmFyIFJhPSExLExwPW51bGwsQXA9ITEsQ2g9bnVsbCxJTj17b25FcnJvcjpmdW5jdGlvbihlKXtSYT0hMCxMcD1lfX07ZnVuY3Rpb24gTE4oZSx0LHIsbixvLGksbCxzLGEpe1JhPSExLExwPW51bGwsTU4uYXBwbHkoSU4sYXJndW1lbnRzKX1mdW5jdGlvbiBBTihlLHQscixuLG8saSxsLHMsYSl7aWYoTE4uYXBwbHkodGhpcyxhcmd1bWVudHMpLFJhKXtpZihSYSl7dmFyIHU9THA7UmE9ITEsTHA9bnVsbH1lbHNlIHRocm93IEVycm9yKEkoMTk4KSk7QXB8fChBcD0hMCxDaD11KX19ZnVuY3Rpb24gaWwoZSl7dmFyIHQ9ZSxyPWU7aWYoZS5hbHRlcm5hdGUpZm9yKDt0LnJldHVybjspdD10LnJldHVybjtlbHNle2U9dDtkbyB0PWUsdC5mbGFncyY0MDk4JiYocj10LnJldHVybiksZT10LnJldHVybjt3aGlsZShlKX1yZXR1cm4gdC50YWc9PT0zP3I6bnVsbH1mdW5jdGlvbiBidyhlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1lLm1lbW9pemVkU3RhdGU7aWYodD09PW51bGwmJihlPWUuYWx0ZXJuYXRlLGUhPT1udWxsJiYodD1lLm1lbW9pemVkU3RhdGUpKSx0IT09bnVsbClyZXR1cm4gdC5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIHB4KGUpe2lmKGlsKGUpIT09ZSl0aHJvdyBFcnJvcihJKDE4OCkpfWZ1bmN0aW9uIEROKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO2lmKCF0KXtpZih0PWlsKGUpLHQ9PT1udWxsKXRocm93IEVycm9yKEkoMTg4KSk7cmV0dXJuIHQhPT1lP251bGw6ZX1mb3IodmFyIHI9ZSxuPXQ7Oyl7dmFyIG89ci5yZXR1cm47aWYobz09PW51bGwpYnJlYWs7dmFyIGk9by5hbHRlcm5hdGU7aWYoaT09PW51bGwpe2lmKG49by5yZXR1cm4sbiE9PW51bGwpe3I9bjtjb250aW51ZX1icmVha31pZihvLmNoaWxkPT09aS5jaGlsZCl7Zm9yKGk9by5jaGlsZDtpOyl7aWYoaT09PXIpcmV0dXJuIHB4KG8pLGU7aWYoaT09PW4pcmV0dXJuIHB4KG8pLHQ7aT1pLnNpYmxpbmd9dGhyb3cgRXJyb3IoSSgxODgpKX1pZihyLnJldHVybiE9PW4ucmV0dXJuKXI9byxuPWk7ZWxzZXtmb3IodmFyIGw9ITEscz1vLmNoaWxkO3M7KXtpZihzPT09cil7bD0hMCxyPW8sbj1pO2JyZWFrfWlmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWwpe2ZvcihzPWkuY2hpbGQ7czspe2lmKHM9PT1yKXtsPSEwLHI9aSxuPW87YnJlYWt9aWYocz09PW4pe2w9ITAsbj1pLHI9bzticmVha31zPXMuc2libGluZ31pZighbCl0aHJvdyBFcnJvcihJKDE4OSkpfX1pZihyLmFsdGVybmF0ZSE9PW4pdGhyb3cgRXJyb3IoSSgxOTApKX1pZihyLnRhZyE9PTMpdGhyb3cgRXJyb3IoSSgxODgpKTtyZXR1cm4gci5zdGF0ZU5vZGUuY3VycmVudD09PXI/ZTp0fWZ1bmN0aW9uIEV3KGUpe3JldHVybiBlPUROKGUpLGUhPT1udWxsP1B3KGUpOm51bGx9ZnVuY3Rpb24gUHcoZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGU7Zm9yKGU9ZS5jaGlsZDtlIT09bnVsbDspe3ZhciB0PVB3KGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2U9ZS5zaWJsaW5nfXJldHVybiBudWxsfXZhciBNdz16ci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLGZ4PXpyLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLE9OPXpyLnVuc3RhYmxlX3Nob3VsZFlpZWxkLHpOPXpyLnVuc3RhYmxlX3JlcXVlc3RQYWludCxaZT16ci51bnN0YWJsZV9ub3csQk49enIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsbGc9enIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksSXc9enIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksRHA9enIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksRk49enIudW5zdGFibGVfTG93UHJpb3JpdHksTHc9enIudW5zdGFibGVfSWRsZVByaW9yaXR5LHRmPW51bGwscW49bnVsbDtmdW5jdGlvbiAkTihlKXtpZihxbiYmdHlwZW9mIHFuLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXtxbi5vbkNvbW1pdEZpYmVyUm9vdCh0ZixlLHZvaWQgMCwoZS5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIE1uPU1hdGguY2x6MzI/TWF0aC5jbHozMjpITixqTj1NYXRoLmxvZyxXTj1NYXRoLkxOMjtmdW5jdGlvbiBITihlKXtyZXR1cm4gZT4+Pj0wLGU9PT0wPzMyOjMxLShqTihlKS9XTnwwKXwwfXZhciBpcD02NCxscD00MTk0MzA0O2Z1bmN0aW9uIEhhKGUpe3N3aXRjaChlJi1lKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gZSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGUmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBPcChlLHQpe3ZhciByPWUucGVuZGluZ0xhbmVzO2lmKHI9PT0wKXJldHVybiAwO3ZhciBuPTAsbz1lLnN1c3BlbmRlZExhbmVzLGk9ZS5waW5nZWRMYW5lcyxsPXImMjY4NDM1NDU1O2lmKGwhPT0wKXt2YXIgcz1sJn5vO3MhPT0wP249SGEocyk6KGkmPWwsaSE9PTAmJihuPUhhKGkpKSl9ZWxzZSBsPXImfm8sbCE9PTA/bj1IYShsKTppIT09MCYmKG49SGEoaSkpO2lmKG49PT0wKXJldHVybiAwO2lmKHQhPT0wJiZ0IT09biYmISh0Jm8pJiYobz1uJi1uLGk9dCYtdCxvPj1pfHxvPT09MTYmJihpJjQxOTQyNDApIT09MCkpcmV0dXJuIHQ7aWYobiY0JiYobnw9ciYxNiksdD1lLmVudGFuZ2xlZExhbmVzLHQhPT0wKWZvcihlPWUuZW50YW5nbGVtZW50cyx0Jj1uOzA8dDspcj0zMS1Nbih0KSxvPTE8PHIsbnw9ZVtyXSx0Jj1+bztyZXR1cm4gbn1mdW5jdGlvbiBVTihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gdCsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiB0KzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiBWTihlLHQpe2Zvcih2YXIgcj1lLnN1c3BlbmRlZExhbmVzLG49ZS5waW5nZWRMYW5lcyxvPWUuZXhwaXJhdGlvblRpbWVzLGk9ZS5wZW5kaW5nTGFuZXM7MDxpOyl7dmFyIGw9MzEtTW4oaSkscz0xPDxsLGE9b1tsXTthPT09LTE/KCEocyZyKXx8cyZuKSYmKG9bbF09VU4ocyx0KSk6YTw9dCYmKGUuZXhwaXJlZExhbmVzfD1zKSxpJj1+c319ZnVuY3Rpb24gVGgoZSl7cmV0dXJuIGU9ZS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsZSE9PTA/ZTplJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIEF3KCl7dmFyIGU9aXA7cmV0dXJuIGlwPDw9MSwhKGlwJjQxOTQyNDApJiYoaXA9NjQpLGV9ZnVuY3Rpb24gVW0oZSl7Zm9yKHZhciB0PVtdLHI9MDszMT5yO3IrKyl0LnB1c2goZSk7cmV0dXJuIHR9ZnVuY3Rpb24gZ3UoZSx0LHIpe2UucGVuZGluZ0xhbmVzfD10LHQhPT01MzY4NzA5MTImJihlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wKSxlPWUuZXZlbnRUaW1lcyx0PTMxLU1uKHQpLGVbdF09cn1mdW5jdGlvbiBSTihlLHQpe3ZhciByPWUucGVuZGluZ0xhbmVzJn50O2UucGVuZGluZ0xhbmVzPXQsZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCxlLmV4cGlyZWRMYW5lcyY9dCxlLm11dGFibGVSZWFkTGFuZXMmPXQsZS5lbnRhbmdsZWRMYW5lcyY9dCx0PWUuZW50YW5nbGVtZW50czt2YXIgbj1lLmV2ZW50VGltZXM7Zm9yKGU9ZS5leHBpcmF0aW9uVGltZXM7MDxyOyl7dmFyIG89MzEtTW4ociksaT0xPDxvO3Rbb109MCxuW29dPS0xLGVbb109LTEsciY9fml9fWZ1bmN0aW9uIHNnKGUsdCl7dmFyIHI9ZS5lbnRhbmdsZWRMYW5lc3w9dDtmb3IoZT1lLmVudGFuZ2xlbWVudHM7cjspe3ZhciBuPTMxLU1uKHIpLG89MTw8bjtvJnR8ZVtuXSZ0JiYoZVtuXXw9dCksciY9fm99fXZhciBnZT0wO2Z1bmN0aW9uIER3KGUpe3JldHVybiBlJj0tZSwxPGU/NDxlP2UmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIE93LGFnLHp3LEJ3LEZ3LF9oPSExLHNwPVtdLGxpPW51bGwsc2k9bnVsbCxhaT1udWxsLHJ1PW5ldyBNYXAsbnU9bmV3IE1hcCxyaT1bXSxHTj0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBkeChlLHQpe3N3aXRjaChlKXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmxpPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjpzaT1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0IjphaT1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6cnUuZGVsZXRlKHQucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6bnUuZGVsZXRlKHQucG9pbnRlcklkKX19ZnVuY3Rpb24gQWEoZSx0LHIsbixvLGkpe3JldHVybiBlPT09bnVsbHx8ZS5uYXRpdmVFdmVudCE9PWk/KGU9e2Jsb2NrZWRPbjp0LGRvbUV2ZW50TmFtZTpyLGV2ZW50U3lzdGVtRmxhZ3M6bixuYXRpdmVFdmVudDppLHRhcmdldENvbnRhaW5lcnM6W29dfSx0IT09bnVsbCYmKHQ9dnUodCksdCE9PW51bGwmJmFnKHQpKSxlKTooZS5ldmVudFN5c3RlbUZsYWdzfD1uLHQ9ZS50YXJnZXRDb250YWluZXJzLG8hPT1udWxsJiZ0LmluZGV4T2Yobyk9PT0tMSYmdC5wdXNoKG8pLGUpfWZ1bmN0aW9uIHFOKGUsdCxyLG4sbyl7c3dpdGNoKHQpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIGxpPUFhKGxpLGUsdCxyLG4sbyksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiBzaT1BYShzaSxlLHQscixuLG8pLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gYWk9QWEoYWksZSx0LHIsbixvKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgaT1vLnBvaW50ZXJJZDtyZXR1cm4gcnUuc2V0KGksQWEocnUuZ2V0KGkpfHxudWxsLGUsdCxyLG4sbykpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBpPW8ucG9pbnRlcklkLG51LnNldChpLEFhKG51LmdldChpKXx8bnVsbCxlLHQscixuLG8pKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiAkdyhlKXt2YXIgdD1RaShlLnRhcmdldCk7aWYodCE9PW51bGwpe3ZhciByPWlsKHQpO2lmKHIhPT1udWxsKXtpZih0PXIudGFnLHQ9PT0xMyl7aWYodD1idyhyKSx0IT09bnVsbCl7ZS5ibG9ja2VkT249dCxGdyhlLnByaW9yaXR5LGZ1bmN0aW9uKCl7encocil9KTtyZXR1cm59fWVsc2UgaWYodD09PTMmJnIuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe2UuYmxvY2tlZE9uPXIudGFnPT09Mz9yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19ZS5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBTcChlKXtpZihlLmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciB0PWUudGFyZ2V0Q29udGFpbmVyczswPHQubGVuZ3RoOyl7dmFyIHI9a2goZS5kb21FdmVudE5hbWUsZS5ldmVudFN5c3RlbUZsYWdzLHRbMF0sZS5uYXRpdmVFdmVudCk7aWYocj09PW51bGwpe3I9ZS5uYXRpdmVFdmVudDt2YXIgbj1uZXcgci5jb25zdHJ1Y3RvcihyLnR5cGUscik7eGg9bixyLnRhcmdldC5kaXNwYXRjaEV2ZW50KG4pLHhoPW51bGx9ZWxzZSByZXR1cm4gdD12dShyKSx0IT09bnVsbCYmYWcodCksZS5ibG9ja2VkT249ciwhMTt0LnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gbXgoZSx0LHIpe1NwKGUpJiZyLmRlbGV0ZSh0KX1mdW5jdGlvbiBRTigpe19oPSExLGxpIT09bnVsbCYmU3AobGkpJiYobGk9bnVsbCksc2khPT1udWxsJiZTcChzaSkmJihzaT1udWxsKSxhaSE9PW51bGwmJlNwKGFpKSYmKGFpPW51bGwpLHJ1LmZvckVhY2gobXgpLG51LmZvckVhY2gobXgpfWZ1bmN0aW9uIERhKGUsdCl7ZS5ibG9ja2VkT249PT10JiYoZS5ibG9ja2VkT249bnVsbCxfaHx8KF9oPSEwLHpyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soenIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksUU4pKSl9ZnVuY3Rpb24gb3UoZSl7ZnVuY3Rpb24gdChvKXtyZXR1cm4gRGEobyxlKX1pZigwPHNwLmxlbmd0aCl7RGEoc3BbMF0sZSk7Zm9yKHZhciByPTE7cjxzcC5sZW5ndGg7cisrKXt2YXIgbj1zcFtyXTtuLmJsb2NrZWRPbj09PWUmJihuLmJsb2NrZWRPbj1udWxsKX19Zm9yKGxpIT09bnVsbCYmRGEobGksZSksc2khPT1udWxsJiZEYShzaSxlKSxhaSE9PW51bGwmJkRhKGFpLGUpLHJ1LmZvckVhY2godCksbnUuZm9yRWFjaCh0KSxyPTA7cjxyaS5sZW5ndGg7cisrKW49cmlbcl0sbi5ibG9ja2VkT249PT1lJiYobi5ibG9ja2VkT249bnVsbCk7Zm9yKDswPHJpLmxlbmd0aCYmKHI9cmlbMF0sci5ibG9ja2VkT249PT1udWxsKTspJHcociksci5ibG9ja2VkT249PT1udWxsJiZyaS5zaGlmdCgpfXZhciBscz1Qby5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyx6cD0hMDtmdW5jdGlvbiBLTihlLHQscixuKXt2YXIgbz1nZSxpPWxzLnRyYW5zaXRpb247bHMudHJhbnNpdGlvbj1udWxsO3RyeXtnZT0xLHVnKGUsdCxyLG4pfWZpbmFsbHl7Z2U9byxscy50cmFuc2l0aW9uPWl9fWZ1bmN0aW9uIFlOKGUsdCxyLG4pe3ZhciBvPWdlLGk9bHMudHJhbnNpdGlvbjtscy50cmFuc2l0aW9uPW51bGw7dHJ5e2dlPTQsdWcoZSx0LHIsbil9ZmluYWxseXtnZT1vLGxzLnRyYW5zaXRpb249aX19ZnVuY3Rpb24gdWcoZSx0LHIsbil7aWYoenApe3ZhciBvPWtoKGUsdCxyLG4pO2lmKG89PT1udWxsKVltKGUsdCxuLEJwLHIpLGR4KGUsbik7ZWxzZSBpZihxTihvLGUsdCxyLG4pKW4uc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihkeChlLG4pLHQmNCYmLTE8R04uaW5kZXhPZihlKSl7Zm9yKDtvIT09bnVsbDspe3ZhciBpPXZ1KG8pO2lmKGkhPT1udWxsJiZPdyhpKSxpPWtoKGUsdCxyLG4pLGk9PT1udWxsJiZZbShlLHQsbixCcCxyKSxpPT09bylicmVhaztvPWl9byE9PW51bGwmJm4uc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSBZbShlLHQsbixudWxsLHIpfX12YXIgQnA9bnVsbDtmdW5jdGlvbiBraChlLHQscixuKXtpZihCcD1udWxsLGU9aWcobiksZT1RaShlKSxlIT09bnVsbClpZih0PWlsKGUpLHQ9PT1udWxsKWU9bnVsbDtlbHNlIGlmKHI9dC50YWcscj09PTEzKXtpZihlPWJ3KHQpLGUhPT1udWxsKXJldHVybiBlO2U9bnVsbH1lbHNlIGlmKHI9PT0zKXtpZih0LnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiB0LnRhZz09PTM/dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2U9bnVsbH1lbHNlIHQhPT1lJiYoZT1udWxsKTtyZXR1cm4gQnA9ZSxudWxsfWZ1bmN0aW9uIGp3KGUpe3N3aXRjaChlKXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaChCTigpKXtjYXNlIGxnOnJldHVybiAxO2Nhc2UgSXc6cmV0dXJuIDQ7Y2FzZSBEcDpjYXNlIEZOOnJldHVybiAxNjtjYXNlIEx3OnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBvaT1udWxsLGNnPW51bGwsQ3A9bnVsbDtmdW5jdGlvbiBXdygpe2lmKENwKXJldHVybiBDcDt2YXIgZSx0PWNnLHI9dC5sZW5ndGgsbixvPSJ2YWx1ZSJpbiBvaT9vaS52YWx1ZTpvaS50ZXh0Q29udGVudCxpPW8ubGVuZ3RoO2ZvcihlPTA7ZTxyJiZ0W2VdPT09b1tlXTtlKyspO3ZhciBsPXItZTtmb3Iobj0xO248PWwmJnRbci1uXT09PW9baS1uXTtuKyspO3JldHVybiBDcD1vLnNsaWNlKGUsMTxuPzEtbjp2b2lkIDApfWZ1bmN0aW9uIFRwKGUpe3ZhciB0PWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8oZT1lLmNoYXJDb2RlLGU9PT0wJiZ0PT09MTMmJihlPTEzKSk6ZT10LGU9PT0xMCYmKGU9MTMpLDMyPD1lfHxlPT09MTM/ZTowfWZ1bmN0aW9uIGFwKCl7cmV0dXJuITB9ZnVuY3Rpb24gaHgoKXtyZXR1cm4hMX1mdW5jdGlvbiBCcihlKXtmdW5jdGlvbiB0KHIsbixvLGksbCl7dGhpcy5fcmVhY3ROYW1lPXIsdGhpcy5fdGFyZ2V0SW5zdD1vLHRoaXMudHlwZT1uLHRoaXMubmF0aXZlRXZlbnQ9aSx0aGlzLnRhcmdldD1sLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihyPWVbc10sdGhpc1tzXT1yP3IoaSk6aVtzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShpLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/aS5kZWZhdWx0UHJldmVudGVkOmkucmV0dXJuVmFsdWU9PT0hMSk/YXA6aHgsdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1oeCx0aGlzfXJldHVybiAkZSh0LnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIHI9dGhpcy5uYXRpdmVFdmVudDtyJiYoci5wcmV2ZW50RGVmYXVsdD9yLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIHIucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKHIucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFwKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5uYXRpdmVFdmVudDtyJiYoci5zdG9wUHJvcGFnYXRpb24/ci5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygci5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKHIuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWFwKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50OmFwfSksdH12YXIgZ3M9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gZS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0scGc9QnIoZ3MpLHl1PSRlKHt9LGdzLHt2aWV3OjAsZGV0YWlsOjB9KSxYTj1Ccih5dSksVm0sUm0sT2EscmY9JGUoe30seXUse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6ZmcsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldD09PXZvaWQgMD9lLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQ6ZS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WCJpbiBlP2UubW92ZW1lbnRYOihlIT09T2EmJihPYSYmZS50eXBlPT09Im1vdXNlbW92ZSI/KFZtPWUuc2NyZWVuWC1PYS5zY3JlZW5YLFJtPWUuc2NyZWVuWS1PYS5zY3JlZW5ZKTpSbT1WbT0wLE9hPWUpLFZtKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFkiaW4gZT9lLm1vdmVtZW50WTpSbX19KSxneD1CcihyZiksWk49JGUoe30scmYse2RhdGFUcmFuc2ZlcjowfSksSk49QnIoWk4pLGViPSRlKHt9LHl1LHtyZWxhdGVkVGFyZ2V0OjB9KSxHbT1CcihlYiksdGI9JGUoe30sZ3Mse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLHJiPUJyKHRiKSxuYj0kZSh7fSxncyx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiBlP2UuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSxvYj1CcihuYiksaWI9JGUoe30sZ3Mse2RhdGE6MH0pLHl4PUJyKGliKSxsYj17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sc2I9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSxhYj17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIHViKGUpe3ZhciB0PXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIHQuZ2V0TW9kaWZpZXJTdGF0ZT90LmdldE1vZGlmaWVyU3RhdGUoZSk6KGU9YWJbZV0pPyEhdFtlXTohMX1mdW5jdGlvbiBmZygpe3JldHVybiB1Yn12YXIgY2I9JGUoe30seXUse2tleTpmdW5jdGlvbihlKXtpZihlLmtleSl7dmFyIHQ9bGJbZS5rZXldfHxlLmtleTtpZih0IT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIHR9cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/KGU9VHAoZSksZT09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShlKSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP3NiW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTpmZyxjaGFyQ29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9UcChlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP1RwKGUpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH19KSxwYj1CcihjYiksZmI9JGUoe30scmYse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksdng9QnIoZmIpLGRiPSRlKHt9LHl1LHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6Zmd9KSxtYj1CcihkYiksaGI9JGUoe30sZ3Mse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksZ2I9QnIoaGIpLHliPSRlKHt9LHJmLHtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksdmI9QnIoeWIpLHhiPVs5LDEzLDI3LDMyXSxkZz1rbyYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LEdhPW51bGw7a28mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihHYT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciB3Yj1rbyYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFHYSxIdz1rbyYmKCFkZ3x8R2EmJjg8R2EmJjExPj1HYSkseHg9U3RyaW5nLmZyb21DaGFyQ29kZSgzMiksd3g9ITE7ZnVuY3Rpb24gVXcoZSx0KXtzd2l0Y2goZSl7Y2FzZSJrZXl1cCI6cmV0dXJuIHhiLmluZGV4T2YodC5rZXlDb2RlKSE9PS0xO2Nhc2Uia2V5ZG93biI6cmV0dXJuIHQua2V5Q29kZSE9PTIyOTtjYXNlImtleXByZXNzIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJmb2N1c291dCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gVncoZSl7cmV0dXJuIGU9ZS5kZXRhaWwsdHlwZW9mIGU9PSJvYmplY3QiJiYiZGF0YSJpbiBlP2UuZGF0YTpudWxsfXZhciBxbD0hMTtmdW5jdGlvbiBTYihlLHQpe3N3aXRjaChlKXtjYXNlImNvbXBvc2l0aW9uZW5kIjpyZXR1cm4gVncodCk7Y2FzZSJrZXlwcmVzcyI6cmV0dXJuIHQud2hpY2ghPT0zMj9udWxsOih3eD0hMCx4eCk7Y2FzZSJ0ZXh0SW5wdXQiOnJldHVybiBlPXQuZGF0YSxlPT09eHgmJnd4P251bGw6ZTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBDYihlLHQpe2lmKHFsKXJldHVybiBlPT09ImNvbXBvc2l0aW9uZW5kInx8IWRnJiZVdyhlLHQpPyhlPVd3KCksQ3A9Y2c9b2k9bnVsbCxxbD0hMSxlKTpudWxsO3N3aXRjaChlKXtjYXNlInBhc3RlIjpyZXR1cm4gbnVsbDtjYXNlImtleXByZXNzIjppZighKHQuY3RybEtleXx8dC5hbHRLZXl8fHQubWV0YUtleSl8fHQuY3RybEtleSYmdC5hbHRLZXkpe2lmKHQuY2hhciYmMTx0LmNoYXIubGVuZ3RoKXJldHVybiB0LmNoYXI7aWYodC53aGljaClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKX1yZXR1cm4gbnVsbDtjYXNlImNvbXBvc2l0aW9uZW5kIjpyZXR1cm4gSHcmJnQubG9jYWxlIT09ImtvIj9udWxsOnQuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX12YXIgVGI9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsImRhdGV0aW1lLWxvY2FsIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIFN4KGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdD09PSJpbnB1dCI/ISFUYltlLnR5cGVdOnQ9PT0idGV4dGFyZWEifWZ1bmN0aW9uIFJ3KGUsdCxyLG4pe0N3KG4pLHQ9RnAodCwib25DaGFuZ2UiKSwwPHQubGVuZ3RoJiYocj1uZXcgcGcoIm9uQ2hhbmdlIiwiY2hhbmdlIixudWxsLHIsbiksZS5wdXNoKHtldmVudDpyLGxpc3RlbmVyczp0fSkpfXZhciBxYT1udWxsLGl1PW51bGw7ZnVuY3Rpb24gX2IoZSl7cjIoZSwwKX1mdW5jdGlvbiBuZihlKXt2YXIgdD1ZbChlKTtpZihodyh0KSlyZXR1cm4gZX1mdW5jdGlvbiBrYihlLHQpe2lmKGU9PT0iY2hhbmdlIilyZXR1cm4gdH12YXIgR3c9ITE7a28mJihrbz8oY3A9Im9uaW5wdXQiaW4gZG9jdW1lbnQsY3B8fChxbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxxbS5zZXRBdHRyaWJ1dGUoIm9uaW5wdXQiLCJyZXR1cm47IiksY3A9dHlwZW9mIHFtLm9uaW5wdXQ9PSJmdW5jdGlvbiIpLHVwPWNwKTp1cD0hMSxHdz11cCYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSk7dmFyIHVwLGNwLHFtO2Z1bmN0aW9uIEN4KCl7cWEmJihxYS5kZXRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIscXcpLGl1PXFhPW51bGwpfWZ1bmN0aW9uIHF3KGUpe2lmKGUucHJvcGVydHlOYW1lPT09InZhbHVlIiYmbmYoaXUpKXt2YXIgdD1bXTtSdyh0LGl1LGUsaWcoZSkpLE53KF9iLHQpfX1mdW5jdGlvbiBOYihlLHQscil7ZT09PSJmb2N1c2luIj8oQ3goKSxxYT10LGl1PXIscWEuYXR0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLHF3KSk6ZT09PSJmb2N1c291dCImJkN4KCl9ZnVuY3Rpb24gYmIoZSl7aWYoZT09PSJzZWxlY3Rpb25jaGFuZ2UifHxlPT09ImtleXVwInx8ZT09PSJrZXlkb3duIilyZXR1cm4gbmYoaXUpfWZ1bmN0aW9uIEViKGUsdCl7aWYoZT09PSJjbGljayIpcmV0dXJuIG5mKHQpfWZ1bmN0aW9uIFBiKGUsdCl7aWYoZT09PSJpbnB1dCJ8fGU9PT0iY2hhbmdlIilyZXR1cm4gbmYodCl9ZnVuY3Rpb24gTWIoZSx0KXtyZXR1cm4gZT09PXQmJihlIT09MHx8MS9lPT09MS90KXx8ZSE9PWUmJnQhPT10fXZhciBMbj10eXBlb2YgT2JqZWN0LmlzPT0iZnVuY3Rpb24iP09iamVjdC5pczpNYjtmdW5jdGlvbiBsdShlLHQpe2lmKExuKGUsdCkpcmV0dXJuITA7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4hMTt2YXIgcj1PYmplY3Qua2V5cyhlKSxuPU9iamVjdC5rZXlzKHQpO2lmKHIubGVuZ3RoIT09bi5sZW5ndGgpcmV0dXJuITE7Zm9yKG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIG89cltuXTtpZighc2guY2FsbCh0LG8pfHwhTG4oZVtvXSx0W29dKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBUeChlKXtmb3IoO2UmJmUuZmlyc3RDaGlsZDspZT1lLmZpcnN0Q2hpbGQ7cmV0dXJuIGV9ZnVuY3Rpb24gX3goZSx0KXt2YXIgcj1UeChlKTtlPTA7Zm9yKHZhciBuO3I7KXtpZihyLm5vZGVUeXBlPT09Myl7aWYobj1lK3IudGV4dENvbnRlbnQubGVuZ3RoLGU8PXQmJm4+PXQpcmV0dXJue25vZGU6cixvZmZzZXQ6dC1lfTtlPW59ZTp7Zm9yKDtyOyl7aWYoci5uZXh0U2libGluZyl7cj1yLm5leHRTaWJsaW5nO2JyZWFrIGV9cj1yLnBhcmVudE5vZGV9cj12b2lkIDB9cj1UeChyKX19ZnVuY3Rpb24gUXcoZSx0KXtyZXR1cm4gZSYmdD9lPT09dD8hMDplJiZlLm5vZGVUeXBlPT09Mz8hMTp0JiZ0Lm5vZGVUeXBlPT09Mz9RdyhlLHQucGFyZW50Tm9kZSk6ImNvbnRhaW5zImluIGU/ZS5jb250YWlucyh0KTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPyEhKGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkmMTYpOiExOiExfWZ1bmN0aW9uIEt3KCl7Zm9yKHZhciBlPXdpbmRvdyx0PUlwKCk7dCBpbnN0YW5jZW9mIGUuSFRNTElGcmFtZUVsZW1lbnQ7KXt0cnl7dmFyIHI9dHlwZW9mIHQuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmPT0ic3RyaW5nIn1jYXRjaHtyPSExfWlmKHIpZT10LmNvbnRlbnRXaW5kb3c7ZWxzZSBicmVhazt0PUlwKGUuZG9jdW1lbnQpfXJldHVybiB0fWZ1bmN0aW9uIG1nKGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdCYmKHQ9PT0iaW5wdXQiJiYoZS50eXBlPT09InRleHQifHxlLnR5cGU9PT0ic2VhcmNoInx8ZS50eXBlPT09InRlbCJ8fGUudHlwZT09PSJ1cmwifHxlLnR5cGU9PT0icGFzc3dvcmQiKXx8dD09PSJ0ZXh0YXJlYSJ8fGUuY29udGVudEVkaXRhYmxlPT09InRydWUiKX1mdW5jdGlvbiBJYihlKXt2YXIgdD1LdygpLHI9ZS5mb2N1c2VkRWxlbSxuPWUuc2VsZWN0aW9uUmFuZ2U7aWYodCE9PXImJnImJnIub3duZXJEb2N1bWVudCYmUXcoci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyKSl7aWYobiE9PW51bGwmJm1nKHIpKXtpZih0PW4uc3RhcnQsZT1uLmVuZCxlPT09dm9pZCAwJiYoZT10KSwic2VsZWN0aW9uU3RhcnQiaW4gcilyLnNlbGVjdGlvblN0YXJ0PXQsci5zZWxlY3Rpb25FbmQ9TWF0aC5taW4oZSxyLnZhbHVlLmxlbmd0aCk7ZWxzZSBpZihlPSh0PXIub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpJiZ0LmRlZmF1bHRWaWV3fHx3aW5kb3csZS5nZXRTZWxlY3Rpb24pe2U9ZS5nZXRTZWxlY3Rpb24oKTt2YXIgbz1yLnRleHRDb250ZW50Lmxlbmd0aCxpPU1hdGgubWluKG4uc3RhcnQsbyk7bj1uLmVuZD09PXZvaWQgMD9pOk1hdGgubWluKG4uZW5kLG8pLCFlLmV4dGVuZCYmaT5uJiYobz1uLG49aSxpPW8pLG89X3gocixpKTt2YXIgbD1feChyLG4pO28mJmwmJihlLnJhbmdlQ291bnQhPT0xfHxlLmFuY2hvck5vZGUhPT1vLm5vZGV8fGUuYW5jaG9yT2Zmc2V0IT09by5vZmZzZXR8fGUuZm9jdXNOb2RlIT09bC5ub2RlfHxlLmZvY3VzT2Zmc2V0IT09bC5vZmZzZXQpJiYodD10LmNyZWF0ZVJhbmdlKCksdC5zZXRTdGFydChvLm5vZGUsby5vZmZzZXQpLGUucmVtb3ZlQWxsUmFuZ2VzKCksaT5uPyhlLmFkZFJhbmdlKHQpLGUuZXh0ZW5kKGwubm9kZSxsLm9mZnNldCkpOih0LnNldEVuZChsLm5vZGUsbC5vZmZzZXQpLGUuYWRkUmFuZ2UodCkpKX19Zm9yKHQ9W10sZT1yO2U9ZS5wYXJlbnROb2RlOyllLm5vZGVUeXBlPT09MSYmdC5wdXNoKHtlbGVtZW50OmUsbGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSk7Zm9yKHR5cGVvZiByLmZvY3VzPT0iZnVuY3Rpb24iJiZyLmZvY3VzKCkscj0wO3I8dC5sZW5ndGg7cisrKWU9dFtyXSxlLmVsZW1lbnQuc2Nyb2xsTGVmdD1lLmxlZnQsZS5lbGVtZW50LnNjcm9sbFRvcD1lLnRvcH19dmFyIExiPWtvJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYxMT49ZG9jdW1lbnQuZG9jdW1lbnRNb2RlLFFsPW51bGwsTmg9bnVsbCxRYT1udWxsLGJoPSExO2Z1bmN0aW9uIGt4KGUsdCxyKXt2YXIgbj1yLndpbmRvdz09PXI/ci5kb2N1bWVudDpyLm5vZGVUeXBlPT09OT9yOnIub3duZXJEb2N1bWVudDtiaHx8UWw9PW51bGx8fFFsIT09SXAobil8fChuPVFsLCJzZWxlY3Rpb25TdGFydCJpbiBuJiZtZyhuKT9uPXtzdGFydDpuLnNlbGVjdGlvblN0YXJ0LGVuZDpuLnNlbGVjdGlvbkVuZH06KG49KG4ub3duZXJEb2N1bWVudCYmbi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpLG49e2FuY2hvck5vZGU6bi5hbmNob3JOb2RlLGFuY2hvck9mZnNldDpuLmFuY2hvck9mZnNldCxmb2N1c05vZGU6bi5mb2N1c05vZGUsZm9jdXNPZmZzZXQ6bi5mb2N1c09mZnNldH0pLFFhJiZsdShRYSxuKXx8KFFhPW4sbj1GcChOaCwib25TZWxlY3QiKSwwPG4ubGVuZ3RoJiYodD1uZXcgcGcoIm9uU2VsZWN0Iiwic2VsZWN0IixudWxsLHQsciksZS5wdXNoKHtldmVudDp0LGxpc3RlbmVyczpufSksdC50YXJnZXQ9UWwpKSl9ZnVuY3Rpb24gcHAoZSx0KXt2YXIgcj17fTtyZXR1cm4gcltlLnRvTG93ZXJDYXNlKCldPXQudG9Mb3dlckNhc2UoKSxyWyJXZWJraXQiK2VdPSJ3ZWJraXQiK3QsclsiTW96IitlXT0ibW96Iit0LHJ9dmFyIEtsPXthbmltYXRpb25lbmQ6cHAoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkVuZCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpwcCgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uSXRlcmF0aW9uIiksYW5pbWF0aW9uc3RhcnQ6cHAoIkFuaW1hdGlvbiIsIkFuaW1hdGlvblN0YXJ0IiksdHJhbnNpdGlvbmVuZDpwcCgiVHJhbnNpdGlvbiIsIlRyYW5zaXRpb25FbmQiKX0sUW09e30sWXc9e307a28mJihZdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSwiQW5pbWF0aW9uRXZlbnQiaW4gd2luZG93fHwoZGVsZXRlIEtsLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIEtsLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIEtsLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksIlRyYW5zaXRpb25FdmVudCJpbiB3aW5kb3d8fGRlbGV0ZSBLbC50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pO2Z1bmN0aW9uIG9mKGUpe2lmKFFtW2VdKXJldHVybiBRbVtlXTtpZighS2xbZV0pcmV0dXJuIGU7dmFyIHQ9S2xbZV0scjtmb3IociBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikmJnIgaW4gWXcpcmV0dXJuIFFtW2VdPXRbcl07cmV0dXJuIGV9dmFyIFh3PW9mKCJhbmltYXRpb25lbmQiKSxadz1vZigiYW5pbWF0aW9uaXRlcmF0aW9uIiksSnc9b2YoImFuaW1hdGlvbnN0YXJ0IiksZTI9b2YoInRyYW5zaXRpb25lbmQiKSx0Mj1uZXcgTWFwLE54PSJhYm9ydCBhdXhDbGljayBjYW5jZWwgY2FuUGxheSBjYW5QbGF5VGhyb3VnaCBjbGljayBjbG9zZSBjb250ZXh0TWVudSBjb3B5IGN1dCBkcmFnIGRyYWdFbmQgZHJhZ0VudGVyIGRyYWdFeGl0IGRyYWdMZWF2ZSBkcmFnT3ZlciBkcmFnU3RhcnQgZHJvcCBkdXJhdGlvbkNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBnb3RQb2ludGVyQ2FwdHVyZSBpbnB1dCBpbnZhbGlkIGtleURvd24ga2V5UHJlc3Mga2V5VXAgbG9hZCBsb2FkZWREYXRhIGxvYWRlZE1ldGFkYXRhIGxvYWRTdGFydCBsb3N0UG9pbnRlckNhcHR1cmUgbW91c2VEb3duIG1vdXNlTW92ZSBtb3VzZU91dCBtb3VzZU92ZXIgbW91c2VVcCBwYXN0ZSBwYXVzZSBwbGF5IHBsYXlpbmcgcG9pbnRlckNhbmNlbCBwb2ludGVyRG93biBwb2ludGVyTW92ZSBwb2ludGVyT3V0IHBvaW50ZXJPdmVyIHBvaW50ZXJVcCBwcm9ncmVzcyByYXRlQ2hhbmdlIHJlc2V0IHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1Ym1pdCBzdXNwZW5kIHRpbWVVcGRhdGUgdG91Y2hDYW5jZWwgdG91Y2hFbmQgdG91Y2hTdGFydCB2b2x1bWVDaGFuZ2Ugc2Nyb2xsIHRvZ2dsZSB0b3VjaE1vdmUgd2FpdGluZyB3aGVlbCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBnaShlLHQpe3QyLnNldChlLHQpLG9sKHQsW2VdKX1mb3IoZnA9MDtmcDxOeC5sZW5ndGg7ZnArKylkcD1OeFtmcF0sYng9ZHAudG9Mb3dlckNhc2UoKSxFeD1kcFswXS50b1VwcGVyQ2FzZSgpK2RwLnNsaWNlKDEpLGdpKGJ4LCJvbiIrRXgpO3ZhciBkcCxieCxFeCxmcDtnaShYdywib25BbmltYXRpb25FbmQiKTtnaShadywib25BbmltYXRpb25JdGVyYXRpb24iKTtnaShKdywib25BbmltYXRpb25TdGFydCIpO2dpKCJkYmxjbGljayIsIm9uRG91YmxlQ2xpY2siKTtnaSgiZm9jdXNpbiIsIm9uRm9jdXMiKTtnaSgiZm9jdXNvdXQiLCJvbkJsdXIiKTtnaShlMiwib25UcmFuc2l0aW9uRW5kIik7dXMoIm9uTW91c2VFbnRlciIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTt1cygib25Nb3VzZUxlYXZlIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO3VzKCJvblBvaW50ZXJFbnRlciIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7dXMoIm9uUG9pbnRlckxlYXZlIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtvbCgib25DaGFuZ2UiLCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7b2woIm9uU2VsZWN0IiwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtvbCgib25CZWZvcmVJbnB1dCIsWyJjb21wb3NpdGlvbmVuZCIsImtleXByZXNzIiwidGV4dElucHV0IiwicGFzdGUiXSk7b2woIm9uQ29tcG9zaXRpb25FbmQiLCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7b2woIm9uQ29tcG9zaXRpb25TdGFydCIsImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO29sKCJvbkNvbXBvc2l0aW9uVXBkYXRlIiwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3ZhciBVYT0iYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmciLnNwbGl0KCIgIiksQWI9bmV3IFNldCgiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlIi5zcGxpdCgiICIpLmNvbmNhdChVYSkpO2Z1bmN0aW9uIFB4KGUsdCxyKXt2YXIgbj1lLnR5cGV8fCJ1bmtub3duLWV2ZW50IjtlLmN1cnJlbnRUYXJnZXQ9cixBTihuLHQsdm9pZCAwLGUpLGUuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIHIyKGUsdCl7dD0odCY0KSE9PTA7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl0sbz1uLmV2ZW50O249bi5saXN0ZW5lcnM7ZTp7dmFyIGk9dm9pZCAwO2lmKHQpZm9yKHZhciBsPW4ubGVuZ3RoLTE7MDw9bDtsLS0pe3ZhciBzPW5bbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0O2lmKHM9cy5saXN0ZW5lcixhIT09aSYmby5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7UHgobyxzLHUpLGk9YX1lbHNlIGZvcihsPTA7bDxuLmxlbmd0aDtsKyspe2lmKHM9bltsXSxhPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQscz1zLmxpc3RlbmVyLGEhPT1pJiZvLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtQeChvLHMsdSksaT1hfX19aWYoQXApdGhyb3cgZT1DaCxBcD0hMSxDaD1udWxsLGV9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgcj10W0xoXTtyPT09dm9pZCAwJiYocj10W0xoXT1uZXcgU2V0KTt2YXIgbj1lKyJfX2J1YmJsZSI7ci5oYXMobil8fChuMih0LGUsMiwhMSksci5hZGQobikpfWZ1bmN0aW9uIEttKGUsdCxyKXt2YXIgbj0wO3QmJihufD00KSxuMihyLGUsbix0KX12YXIgbXA9Il9yZWFjdExpc3RlbmluZyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gc3UoZSl7aWYoIWVbbXBdKXtlW21wXT0hMCxjdy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IhPT0ic2VsZWN0aW9uY2hhbmdlIiYmKEFiLmhhcyhyKXx8S20ociwhMSxlKSxLbShyLCEwLGUpKX0pO3ZhciB0PWUubm9kZVR5cGU9PT05P2U6ZS5vd25lckRvY3VtZW50O3Q9PT1udWxsfHx0W21wXXx8KHRbbXBdPSEwLEttKCJzZWxlY3Rpb25jaGFuZ2UiLCExLHQpKX19ZnVuY3Rpb24gbjIoZSx0LHIsbil7c3dpdGNoKGp3KHQpKXtjYXNlIDE6dmFyIG89S047YnJlYWs7Y2FzZSA0Om89WU47YnJlYWs7ZGVmYXVsdDpvPXVnfXI9by5iaW5kKG51bGwsdCxyLGUpLG89dm9pZCAwLCFTaHx8dCE9PSJ0b3VjaHN0YXJ0IiYmdCE9PSJ0b3VjaG1vdmUiJiZ0IT09IndoZWVsInx8KG89ITApLG4/byE9PXZvaWQgMD9lLmFkZEV2ZW50TGlzdGVuZXIodCxyLHtjYXB0dXJlOiEwLHBhc3NpdmU6b30pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LHIsITApOm8hPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQscix7cGFzc2l2ZTpvfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsciwhMSl9ZnVuY3Rpb24gWW0oZSx0LHIsbixvKXt2YXIgaT1uO2lmKCEodCYxKSYmISh0JjIpJiZuIT09bnVsbCllOmZvcig7Oyl7aWYobj09PW51bGwpcmV0dXJuO3ZhciBsPW4udGFnO2lmKGw9PT0zfHxsPT09NCl7dmFyIHM9bi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZihzPT09b3x8cy5ub2RlVHlwZT09PTgmJnMucGFyZW50Tm9kZT09PW8pYnJlYWs7aWYobD09PTQpZm9yKGw9bi5yZXR1cm47bCE9PW51bGw7KXt2YXIgYT1sLnRhZztpZigoYT09PTN8fGE9PT00KSYmKGE9bC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxhPT09b3x8YS5ub2RlVHlwZT09PTgmJmEucGFyZW50Tm9kZT09PW8pKXJldHVybjtsPWwucmV0dXJufWZvcig7cyE9PW51bGw7KXtpZihsPVFpKHMpLGw9PT1udWxsKXJldHVybjtpZihhPWwudGFnLGE9PT01fHxhPT09Nil7bj1pPWw7Y29udGludWUgZX1zPXMucGFyZW50Tm9kZX19bj1uLnJldHVybn1OdyhmdW5jdGlvbigpe3ZhciB1PWkscD1pZyhyKSxjPVtdO2U6e3ZhciBmPXQyLmdldChlKTtpZihmIT09dm9pZCAwKXt2YXIgZD1wZyxtPWU7c3dpdGNoKGUpe2Nhc2Uia2V5cHJlc3MiOmlmKFRwKHIpPT09MClicmVhayBlO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6ZD1wYjticmVhaztjYXNlImZvY3VzaW4iOm09ImZvY3VzIixkPUdtO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOm09ImJsdXIiLGQ9R207YnJlYWs7Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6ZD1HbTticmVhaztjYXNlImNsaWNrIjppZihyLmJ1dHRvbj09PTIpYnJlYWsgZTtjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2V1cCI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UiY29udGV4dG1lbnUiOmQ9Z3g7YnJlYWs7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6ZD1KTjticmVhaztjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ0b3VjaHN0YXJ0IjpkPW1iO2JyZWFrO2Nhc2UgWHc6Y2FzZSBadzpjYXNlIEp3OmQ9cmI7YnJlYWs7Y2FzZSBlMjpkPWdiO2JyZWFrO2Nhc2Uic2Nyb2xsIjpkPVhOO2JyZWFrO2Nhc2Uid2hlZWwiOmQ9dmI7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6ZD1vYjticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpkPXZ4fXZhciBoPSh0JjQpIT09MCxTPSFoJiZlPT09InNjcm9sbCIseT1oP2YhPT1udWxsP2YrIkNhcHR1cmUiOm51bGw6ZjtoPVtdO2Zvcih2YXIgdj11LGc7diE9PW51bGw7KXtnPXY7dmFyIEM9Zy5zdGF0ZU5vZGU7aWYoZy50YWc9PT01JiZDIT09bnVsbCYmKGc9Qyx5IT09bnVsbCYmKEM9dHUodix5KSxDIT1udWxsJiZoLnB1c2goYXUodixDLGcpKSkpLFMpYnJlYWs7dj12LnJldHVybn0wPGgubGVuZ3RoJiYoZj1uZXcgZChmLG0sbnVsbCxyLHApLGMucHVzaCh7ZXZlbnQ6ZixsaXN0ZW5lcnM6aH0pKX19aWYoISh0JjcpKXtlOntpZihmPWU9PT0ibW91c2VvdmVyInx8ZT09PSJwb2ludGVyb3ZlciIsZD1lPT09Im1vdXNlb3V0Inx8ZT09PSJwb2ludGVyb3V0IixmJiZyIT09eGgmJihtPXIucmVsYXRlZFRhcmdldHx8ci5mcm9tRWxlbWVudCkmJihRaShtKXx8bVtOb10pKWJyZWFrIGU7aWYoKGR8fGYpJiYoZj1wLndpbmRvdz09PXA/cDooZj1wLm93bmVyRG9jdW1lbnQpP2YuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93OndpbmRvdyxkPyhtPXIucmVsYXRlZFRhcmdldHx8ci50b0VsZW1lbnQsZD11LG09bT9RaShtKTpudWxsLG0hPT1udWxsJiYoUz1pbChtKSxtIT09U3x8bS50YWchPT01JiZtLnRhZyE9PTYpJiYobT1udWxsKSk6KGQ9bnVsbCxtPXUpLGQhPT1tKSl7aWYoaD1neCxDPSJvbk1vdXNlTGVhdmUiLHk9Im9uTW91c2VFbnRlciIsdj0ibW91c2UiLChlPT09InBvaW50ZXJvdXQifHxlPT09InBvaW50ZXJvdmVyIikmJihoPXZ4LEM9Im9uUG9pbnRlckxlYXZlIix5PSJvblBvaW50ZXJFbnRlciIsdj0icG9pbnRlciIpLFM9ZD09bnVsbD9mOllsKGQpLGc9bT09bnVsbD9mOllsKG0pLGY9bmV3IGgoQyx2KyJsZWF2ZSIsZCxyLHApLGYudGFyZ2V0PVMsZi5yZWxhdGVkVGFyZ2V0PWcsQz1udWxsLFFpKHApPT09dSYmKGg9bmV3IGgoeSx2KyJlbnRlciIsbSxyLHApLGgudGFyZ2V0PWcsaC5yZWxhdGVkVGFyZ2V0PVMsQz1oKSxTPUMsZCYmbSl0Ontmb3IoaD1kLHk9bSx2PTAsZz1oO2c7Zz1WbChnKSl2Kys7Zm9yKGc9MCxDPXk7QztDPVZsKEMpKWcrKztmb3IoOzA8di1nOyloPVZsKGgpLHYtLTtmb3IoOzA8Zy12Oyl5PVZsKHkpLGctLTtmb3IoO3YtLTspe2lmKGg9PT15fHx5IT09bnVsbCYmaD09PXkuYWx0ZXJuYXRlKWJyZWFrIHQ7aD1WbChoKSx5PVZsKHkpfWg9bnVsbH1lbHNlIGg9bnVsbDtkIT09bnVsbCYmTXgoYyxmLGQsaCwhMSksbSE9PW51bGwmJlMhPT1udWxsJiZNeChjLFMsbSxoLCEwKX19ZTp7aWYoZj11P1lsKHUpOndpbmRvdyxkPWYubm9kZU5hbWUmJmYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxkPT09InNlbGVjdCJ8fGQ9PT0iaW5wdXQiJiZmLnR5cGU9PT0iZmlsZSIpdmFyIGs9a2I7ZWxzZSBpZihTeChmKSlpZihHdylrPVBiO2Vsc2V7az1iYjt2YXIgRD1OYn1lbHNlKGQ9Zi5ub2RlTmFtZSkmJmQudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihmLnR5cGU9PT0iY2hlY2tib3gifHxmLnR5cGU9PT0icmFkaW8iKSYmKGs9RWIpO2lmKGsmJihrPWsoZSx1KSkpe1J3KGMsayxyLHApO2JyZWFrIGV9RCYmRChlLGYsdSksZT09PSJmb2N1c291dCImJihEPWYuX3dyYXBwZXJTdGF0ZSkmJkQuY29udHJvbGxlZCYmZi50eXBlPT09Im51bWJlciImJm1oKGYsIm51bWJlciIsZi52YWx1ZSl9c3dpdGNoKEQ9dT9ZbCh1KTp3aW5kb3csZSl7Y2FzZSJmb2N1c2luIjooU3goRCl8fEQuY29udGVudEVkaXRhYmxlPT09InRydWUiKSYmKFFsPUQsTmg9dSxRYT1udWxsKTticmVhaztjYXNlImZvY3Vzb3V0IjpRYT1OaD1RbD1udWxsO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpiaD0hMDticmVhaztjYXNlImNvbnRleHRtZW51IjpjYXNlIm1vdXNldXAiOmNhc2UiZHJhZ2VuZCI6Ymg9ITEsa3goYyxyLHApO2JyZWFrO2Nhc2Uic2VsZWN0aW9uY2hhbmdlIjppZihMYilicmVhaztjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOmt4KGMscixwKX12YXIgTztpZihkZyllOntzd2l0Y2goZSl7Y2FzZSJjb21wb3NpdGlvbnN0YXJ0Ijp2YXIgTj0ib25Db21wb3NpdGlvblN0YXJ0IjticmVhayBlO2Nhc2UiY29tcG9zaXRpb25lbmQiOk49Im9uQ29tcG9zaXRpb25FbmQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6Tj0ib25Db21wb3NpdGlvblVwZGF0ZSI7YnJlYWsgZX1OPXZvaWQgMH1lbHNlIHFsP1V3KGUscikmJihOPSJvbkNvbXBvc2l0aW9uRW5kIik6ZT09PSJrZXlkb3duIiYmci5rZXlDb2RlPT09MjI5JiYoTj0ib25Db21wb3NpdGlvblN0YXJ0Iik7TiYmKEh3JiZyLmxvY2FsZSE9PSJrbyImJihxbHx8TiE9PSJvbkNvbXBvc2l0aW9uU3RhcnQiP049PT0ib25Db21wb3NpdGlvbkVuZCImJnFsJiYoTz1XdygpKToob2k9cCxjZz0idmFsdWUiaW4gb2k/b2kudmFsdWU6b2kudGV4dENvbnRlbnQscWw9ITApKSxEPUZwKHUsTiksMDxELmxlbmd0aCYmKE49bmV3IHl4KE4sZSxudWxsLHIscCksYy5wdXNoKHtldmVudDpOLGxpc3RlbmVyczpEfSksTz9OLmRhdGE9TzooTz1WdyhyKSxPIT09bnVsbCYmKE4uZGF0YT1PKSkpKSwoTz13Yj9TYihlLHIpOkNiKGUscikpJiYodT1GcCh1LCJvbkJlZm9yZUlucHV0IiksMDx1Lmxlbmd0aCYmKHA9bmV3IHl4KCJvbkJlZm9yZUlucHV0IiwiYmVmb3JlaW5wdXQiLG51bGwscixwKSxjLnB1c2goe2V2ZW50OnAsbGlzdGVuZXJzOnV9KSxwLmRhdGE9TykpfXIyKGMsdCl9KX1mdW5jdGlvbiBhdShlLHQscil7cmV0dXJue2luc3RhbmNlOmUsbGlzdGVuZXI6dCxjdXJyZW50VGFyZ2V0OnJ9fWZ1bmN0aW9uIEZwKGUsdCl7Zm9yKHZhciByPXQrIkNhcHR1cmUiLG49W107ZSE9PW51bGw7KXt2YXIgbz1lLGk9by5zdGF0ZU5vZGU7by50YWc9PT01JiZpIT09bnVsbCYmKG89aSxpPXR1KGUsciksaSE9bnVsbCYmbi51bnNoaWZ0KGF1KGUsaSxvKSksaT10dShlLHQpLGkhPW51bGwmJm4ucHVzaChhdShlLGksbykpKSxlPWUucmV0dXJufXJldHVybiBufWZ1bmN0aW9uIFZsKGUpe2lmKGU9PT1udWxsKXJldHVybiBudWxsO2RvIGU9ZS5yZXR1cm47d2hpbGUoZSYmZS50YWchPT01KTtyZXR1cm4gZXx8bnVsbH1mdW5jdGlvbiBNeChlLHQscixuLG8pe2Zvcih2YXIgaT10Ll9yZWFjdE5hbWUsbD1bXTtyIT09bnVsbCYmciE9PW47KXt2YXIgcz1yLGE9cy5hbHRlcm5hdGUsdT1zLnN0YXRlTm9kZTtpZihhIT09bnVsbCYmYT09PW4pYnJlYWs7cy50YWc9PT01JiZ1IT09bnVsbCYmKHM9dSxvPyhhPXR1KHIsaSksYSE9bnVsbCYmbC51bnNoaWZ0KGF1KHIsYSxzKSkpOm98fChhPXR1KHIsaSksYSE9bnVsbCYmbC5wdXNoKGF1KHIsYSxzKSkpKSxyPXIucmV0dXJufWwubGVuZ3RoIT09MCYmZS5wdXNoKHtldmVudDp0LGxpc3RlbmVyczpsfSl9dmFyIERiPS9cclxuPy9nLE9iPS9cdTAwMDB8XHVGRkZEL2c7ZnVuY3Rpb24gSXgoZSl7cmV0dXJuKHR5cGVvZiBlPT0ic3RyaW5nIj9lOiIiK2UpLnJlcGxhY2UoRGIsXGAKXGApLnJlcGxhY2UoT2IsIiIpfWZ1bmN0aW9uIGhwKGUsdCxyKXtpZih0PUl4KHQpLEl4KGUpIT09dCYmcil0aHJvdyBFcnJvcihJKDQyNSkpfWZ1bmN0aW9uICRwKCl7fXZhciBFaD1udWxsLFBoPW51bGw7ZnVuY3Rpb24gTWgoZSx0KXtyZXR1cm4gZT09PSJ0ZXh0YXJlYSJ8fGU9PT0ibm9zY3JpcHQifHx0eXBlb2YgdC5jaGlsZHJlbj09InN0cmluZyJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ibnVtYmVyInx8dHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9PSJvYmplY3QiJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT09bnVsbCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwhPW51bGx9dmFyIEloPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6dm9pZCAwLHpiPXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0OnZvaWQgMCxMeD10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlOnZvaWQgMCxCYj10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6dHlwZW9mIEx4PCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gTHgucmVzb2x2ZShudWxsKS50aGVuKGUpLmNhdGNoKEZiKX06SWg7ZnVuY3Rpb24gRmIoZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX1mdW5jdGlvbiBYbShlLHQpe3ZhciByPXQsbj0wO2Rve3ZhciBvPXIubmV4dFNpYmxpbmc7aWYoZS5yZW1vdmVDaGlsZChyKSxvJiZvLm5vZGVUeXBlPT09OClpZihyPW8uZGF0YSxyPT09Ii8kIil7aWYobj09PTApe2UucmVtb3ZlQ2hpbGQobyksb3UodCk7cmV0dXJufW4tLX1lbHNlIHIhPT0iJCImJnIhPT0iJD8iJiZyIT09IiQhInx8bisrO3I9b313aGlsZShyKTtvdSh0KX1mdW5jdGlvbiB1aShlKXtmb3IoO2UhPW51bGw7ZT1lLm5leHRTaWJsaW5nKXt2YXIgdD1lLm5vZGVUeXBlO2lmKHQ9PT0xfHx0PT09MylicmVhaztpZih0PT09OCl7aWYodD1lLmRhdGEsdD09PSIkInx8dD09PSIkISJ8fHQ9PT0iJD8iKWJyZWFrO2lmKHQ9PT0iLyQiKXJldHVybiBudWxsfX1yZXR1cm4gZX1mdW5jdGlvbiBBeChlKXtlPWUucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIHI9ZS5kYXRhO2lmKHI9PT0iJCJ8fHI9PT0iJCEifHxyPT09IiQ/Iil7aWYodD09PTApcmV0dXJuIGU7dC0tfWVsc2Ugcj09PSIvJCImJnQrK31lPWUucHJldmlvdXNTaWJsaW5nfXJldHVybiBudWxsfXZhciB5cz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxHbj0iX19yZWFjdEZpYmVyJCIreXMsdXU9Il9fcmVhY3RQcm9wcyQiK3lzLE5vPSJfX3JlYWN0Q29udGFpbmVyJCIreXMsTGg9Il9fcmVhY3RFdmVudHMkIit5cywkYj0iX19yZWFjdExpc3RlbmVycyQiK3lzLGpiPSJfX3JlYWN0SGFuZGxlcyQiK3lzO2Z1bmN0aW9uIFFpKGUpe3ZhciB0PWVbR25dO2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciByPWUucGFyZW50Tm9kZTtyOyl7aWYodD1yW05vXXx8cltHbl0pe2lmKHI9dC5hbHRlcm5hdGUsdC5jaGlsZCE9PW51bGx8fHIhPT1udWxsJiZyLmNoaWxkIT09bnVsbClmb3IoZT1BeChlKTtlIT09bnVsbDspe2lmKHI9ZVtHbl0pcmV0dXJuIHI7ZT1BeChlKX1yZXR1cm4gdH1lPXIscj1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdnUoZSl7cmV0dXJuIGU9ZVtHbl18fGVbTm9dLCFlfHxlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xMyYmZS50YWchPT0zP251bGw6ZX1mdW5jdGlvbiBZbChlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IoSSgzMykpfWZ1bmN0aW9uIGxmKGUpe3JldHVybiBlW3V1XXx8bnVsbH12YXIgQWg9W10sWGw9LTE7ZnVuY3Rpb24geWkoZSl7cmV0dXJue2N1cnJlbnQ6ZX19ZnVuY3Rpb24gUGUoZSl7MD5YbHx8KGUuY3VycmVudD1BaFtYbF0sQWhbWGxdPW51bGwsWGwtLSl9ZnVuY3Rpb24gQ2UoZSx0KXtYbCsrLEFoW1hsXT1lLmN1cnJlbnQsZS5jdXJyZW50PXR9dmFyIGhpPXt9LHRyPXlpKGhpKSxrcj15aSghMSksSmk9aGk7ZnVuY3Rpb24gY3MoZSx0KXt2YXIgcj1lLnR5cGUuY29udGV4dFR5cGVzO2lmKCFyKXJldHVybiBoaTt2YXIgbj1lLnN0YXRlTm9kZTtpZihuJiZuLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT10KXJldHVybiBuLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBvPXt9LGk7Zm9yKGkgaW4gcilvW2ldPXRbaV07cmV0dXJuIG4mJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD10LGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9byksb31mdW5jdGlvbiBOcihlKXtyZXR1cm4gZT1lLmNoaWxkQ29udGV4dFR5cGVzLGUhPW51bGx9ZnVuY3Rpb24ganAoKXtQZShrciksUGUodHIpfWZ1bmN0aW9uIER4KGUsdCxyKXtpZih0ci5jdXJyZW50IT09aGkpdGhyb3cgRXJyb3IoSSgxNjgpKTtDZSh0cix0KSxDZShrcixyKX1mdW5jdGlvbiBvMihlLHQscil7dmFyIG49ZS5zdGF0ZU5vZGU7aWYodD10LmNoaWxkQ29udGV4dFR5cGVzLHR5cGVvZiBuLmdldENoaWxkQ29udGV4dCE9ImZ1bmN0aW9uIilyZXR1cm4gcjtuPW4uZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBvIGluIG4paWYoIShvIGluIHQpKXRocm93IEVycm9yKEkoMTA4LE5OKGUpfHwiVW5rbm93biIsbykpO3JldHVybiAkZSh7fSxyLG4pfWZ1bmN0aW9uIFdwKGUpe3JldHVybiBlPShlPWUuc3RhdGVOb2RlKSYmZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8aGksSmk9dHIuY3VycmVudCxDZSh0cixlKSxDZShrcixrci5jdXJyZW50KSwhMH1mdW5jdGlvbiBPeChlLHQscil7dmFyIG49ZS5zdGF0ZU5vZGU7aWYoIW4pdGhyb3cgRXJyb3IoSSgxNjkpKTtyPyhlPW8yKGUsdCxKaSksbi5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1lLFBlKGtyKSxQZSh0ciksQ2UodHIsZSkpOlBlKGtyKSxDZShrcixyKX12YXIgU289bnVsbCxzZj0hMSxabT0hMTtmdW5jdGlvbiBpMihlKXtTbz09PW51bGw/U289W2VdOlNvLnB1c2goZSl9ZnVuY3Rpb24gV2IoZSl7c2Y9ITAsaTIoZSl9ZnVuY3Rpb24gdmkoKXtpZighWm0mJlNvIT09bnVsbCl7Wm09ITA7dmFyIGU9MCx0PWdlO3RyeXt2YXIgcj1Tbztmb3IoZ2U9MTtlPHIubGVuZ3RoO2UrKyl7dmFyIG49cltlXTtkbyBuPW4oITApO3doaWxlKG4hPT1udWxsKX1Tbz1udWxsLHNmPSExfWNhdGNoKG8pe3Rocm93IFNvIT09bnVsbCYmKFNvPVNvLnNsaWNlKGUrMSkpLE13KGxnLHZpKSxvfWZpbmFsbHl7Z2U9dCxabT0hMX19cmV0dXJuIG51bGx9dmFyIFpsPVtdLEpsPTAsSHA9bnVsbCxVcD0wLGFuPVtdLHVuPTAsZWw9bnVsbCxDbz0xLFRvPSIiO2Z1bmN0aW9uIEdpKGUsdCl7WmxbSmwrK109VXAsWmxbSmwrK109SHAsSHA9ZSxVcD10fWZ1bmN0aW9uIGwyKGUsdCxyKXthblt1bisrXT1Dbyxhblt1bisrXT1Ubyxhblt1bisrXT1lbCxlbD1lO3ZhciBuPUNvO2U9VG87dmFyIG89MzItTW4obiktMTtuJj1+KDE8PG8pLHIrPTE7dmFyIGk9MzItTW4odCkrbztpZigzMDxpKXt2YXIgbD1vLW8lNTtpPShuJigxPDxsKS0xKS50b1N0cmluZygzMiksbj4+PWwsby09bCxDbz0xPDwzMi1Nbih0KStvfHI8PG98bixUbz1pK2V9ZWxzZSBDbz0xPDxpfHI8PG98bixUbz1lfWZ1bmN0aW9uIGhnKGUpe2UucmV0dXJuIT09bnVsbCYmKEdpKGUsMSksbDIoZSwxLDApKX1mdW5jdGlvbiBnZyhlKXtmb3IoO2U9PT1IcDspSHA9WmxbLS1KbF0sWmxbSmxdPW51bGwsVXA9WmxbLS1KbF0sWmxbSmxdPW51bGw7Zm9yKDtlPT09ZWw7KWVsPWFuWy0tdW5dLGFuW3VuXT1udWxsLFRvPWFuWy0tdW5dLGFuW3VuXT1udWxsLENvPWFuWy0tdW5dLGFuW3VuXT1udWxsfXZhciBPcj1udWxsLERyPW51bGwsRGU9ITEsUG49bnVsbDtmdW5jdGlvbiBzMihlLHQpe3ZhciByPWNuKDUsbnVsbCxudWxsLDApO3IuZWxlbWVudFR5cGU9IkRFTEVURUQiLHIuc3RhdGVOb2RlPXQsci5yZXR1cm49ZSx0PWUuZGVsZXRpb25zLHQ9PT1udWxsPyhlLmRlbGV0aW9ucz1bcl0sZS5mbGFnc3w9MTYpOnQucHVzaChyKX1mdW5jdGlvbiB6eChlLHQpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnZhciByPWUudHlwZTtyZXR1cm4gdD10Lm5vZGVUeXBlIT09MXx8ci50b0xvd2VyQ2FzZSgpIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxPcj1lLERyPXVpKHQuZmlyc3RDaGlsZCksITApOiExO2Nhc2UgNjpyZXR1cm4gdD1lLnBlbmRpbmdQcm9wcz09PSIifHx0Lm5vZGVUeXBlIT09Mz9udWxsOnQsdCE9PW51bGw/KGUuc3RhdGVOb2RlPXQsT3I9ZSxEcj1udWxsLCEwKTohMTtjYXNlIDEzOnJldHVybiB0PXQubm9kZVR5cGUhPT04P251bGw6dCx0IT09bnVsbD8ocj1lbCE9PW51bGw/e2lkOkNvLG92ZXJmbG93OlRvfTpudWxsLGUubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDp0LHRyZWVDb250ZXh0OnIscmV0cnlMYW5lOjEwNzM3NDE4MjR9LHI9Y24oMTgsbnVsbCxudWxsLDApLHIuc3RhdGVOb2RlPXQsci5yZXR1cm49ZSxlLmNoaWxkPXIsT3I9ZSxEcj1udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBEaChlKXtyZXR1cm4oZS5tb2RlJjEpIT09MCYmKGUuZmxhZ3MmMTI4KT09PTB9ZnVuY3Rpb24gT2goZSl7aWYoRGUpe3ZhciB0PURyO2lmKHQpe3ZhciByPXQ7aWYoIXp4KGUsdCkpe2lmKERoKGUpKXRocm93IEVycm9yKEkoNDE4KSk7dD11aShyLm5leHRTaWJsaW5nKTt2YXIgbj1Pcjt0JiZ6eChlLHQpP3MyKG4scik6KGUuZmxhZ3M9ZS5mbGFncyYtNDA5N3wyLERlPSExLE9yPWUpfX1lbHNle2lmKERoKGUpKXRocm93IEVycm9yKEkoNDE4KSk7ZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsRGU9ITEsT3I9ZX19fWZ1bmN0aW9uIEJ4KGUpe2ZvcihlPWUucmV0dXJuO2UhPT1udWxsJiZlLnRhZyE9PTUmJmUudGFnIT09MyYmZS50YWchPT0xMzspZT1lLnJldHVybjtPcj1lfWZ1bmN0aW9uIGdwKGUpe2lmKGUhPT1PcilyZXR1cm4hMTtpZighRGUpcmV0dXJuIEJ4KGUpLERlPSEwLCExO3ZhciB0O2lmKCh0PWUudGFnIT09MykmJiEodD1lLnRhZyE9PTUpJiYodD1lLnR5cGUsdD10IT09ImhlYWQiJiZ0IT09ImJvZHkiJiYhTWgoZS50eXBlLGUubWVtb2l6ZWRQcm9wcykpLHQmJih0PURyKSl7aWYoRGgoZSkpdGhyb3cgYTIoKSxFcnJvcihJKDQxOCkpO2Zvcig7dDspczIoZSx0KSx0PXVpKHQubmV4dFNpYmxpbmcpfWlmKEJ4KGUpLGUudGFnPT09MTMpe2lmKGU9ZS5tZW1vaXplZFN0YXRlLGU9ZSE9PW51bGw/ZS5kZWh5ZHJhdGVkOm51bGwsIWUpdGhyb3cgRXJyb3IoSSgzMTcpKTtlOntmb3IoZT1lLm5leHRTaWJsaW5nLHQ9MDtlOyl7aWYoZS5ub2RlVHlwZT09PTgpe3ZhciByPWUuZGF0YTtpZihyPT09Ii8kIil7aWYodD09PTApe0RyPXVpKGUubmV4dFNpYmxpbmcpO2JyZWFrIGV9dC0tfWVsc2UgciE9PSIkIiYmciE9PSIkISImJnIhPT0iJD8ifHx0Kyt9ZT1lLm5leHRTaWJsaW5nfURyPW51bGx9fWVsc2UgRHI9T3I/dWkoZS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gYTIoKXtmb3IodmFyIGU9RHI7ZTspZT11aShlLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBwcygpe0RyPU9yPW51bGwsRGU9ITF9ZnVuY3Rpb24geWcoZSl7UG49PT1udWxsP1BuPVtlXTpQbi5wdXNoKGUpfXZhciBIYj1Qby5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztmdW5jdGlvbiBibihlLHQpe2lmKGUmJmUuZGVmYXVsdFByb3BzKXt0PSRlKHt9LHQpLGU9ZS5kZWZhdWx0UHJvcHM7Zm9yKHZhciByIGluIGUpdFtyXT09PXZvaWQgMCYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9cmV0dXJuIHR9dmFyIFZwPXlpKG51bGwpLFJwPW51bGwsZXM9bnVsbCx2Zz1udWxsO2Z1bmN0aW9uIHhnKCl7dmc9ZXM9UnA9bnVsbH1mdW5jdGlvbiB3ZyhlKXt2YXIgdD1WcC5jdXJyZW50O1BlKFZwKSxlLl9jdXJyZW50VmFsdWU9dH1mdW5jdGlvbiB6aChlLHQscil7Zm9yKDtlIT09bnVsbDspe3ZhciBuPWUuYWx0ZXJuYXRlO2lmKChlLmNoaWxkTGFuZXMmdCkhPT10PyhlLmNoaWxkTGFuZXN8PXQsbiE9PW51bGwmJihuLmNoaWxkTGFuZXN8PXQpKTpuIT09bnVsbCYmKG4uY2hpbGRMYW5lcyZ0KSE9PXQmJihuLmNoaWxkTGFuZXN8PXQpLGU9PT1yKWJyZWFrO2U9ZS5yZXR1cm59fWZ1bmN0aW9uIHNzKGUsdCl7UnA9ZSx2Zz1lcz1udWxsLGU9ZS5kZXBlbmRlbmNpZXMsZSE9PW51bGwmJmUuZmlyc3RDb250ZXh0IT09bnVsbCYmKGUubGFuZXMmdCYmKF9yPSEwKSxlLmZpcnN0Q29udGV4dD1udWxsKX1mdW5jdGlvbiBmbihlKXt2YXIgdD1lLl9jdXJyZW50VmFsdWU7aWYodmchPT1lKWlmKGU9e2NvbnRleHQ6ZSxtZW1vaXplZFZhbHVlOnQsbmV4dDpudWxsfSxlcz09PW51bGwpe2lmKFJwPT09bnVsbCl0aHJvdyBFcnJvcihJKDMwOCkpO2VzPWUsUnAuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDplfX1lbHNlIGVzPWVzLm5leHQ9ZTtyZXR1cm4gdH12YXIgS2k9bnVsbDtmdW5jdGlvbiBTZyhlKXtLaT09PW51bGw/S2k9W2VdOktpLnB1c2goZSl9ZnVuY3Rpb24gdTIoZSx0LHIsbil7dmFyIG89dC5pbnRlcmxlYXZlZDtyZXR1cm4gbz09PW51bGw/KHIubmV4dD1yLFNnKHQpKTooci5uZXh0PW8ubmV4dCxvLm5leHQ9ciksdC5pbnRlcmxlYXZlZD1yLGJvKGUsbil9ZnVuY3Rpb24gYm8oZSx0KXtlLmxhbmVzfD10O3ZhciByPWUuYWx0ZXJuYXRlO2ZvcihyIT09bnVsbCYmKHIubGFuZXN8PXQpLHI9ZSxlPWUucmV0dXJuO2UhPT1udWxsOyllLmNoaWxkTGFuZXN8PXQscj1lLmFsdGVybmF0ZSxyIT09bnVsbCYmKHIuY2hpbGRMYW5lc3w9dCkscj1lLGU9ZS5yZXR1cm47cmV0dXJuIHIudGFnPT09Mz9yLnN0YXRlTm9kZTpudWxsfXZhciB0aT0hMTtmdW5jdGlvbiBDZyhlKXtlLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fWZ1bmN0aW9uIGMyKGUsdCl7ZT1lLnVwZGF0ZVF1ZXVlLHQudXBkYXRlUXVldWU9PT1lJiYodC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTplLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDplLnNoYXJlZCxlZmZlY3RzOmUuZWZmZWN0c30pfWZ1bmN0aW9uIF9vKGUsdCl7cmV0dXJue2V2ZW50VGltZTplLGxhbmU6dCx0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fWZ1bmN0aW9uIGNpKGUsdCxyKXt2YXIgbj1lLnVwZGF0ZVF1ZXVlO2lmKG49PT1udWxsKXJldHVybiBudWxsO2lmKG49bi5zaGFyZWQsbGUmMil7dmFyIG89bi5wZW5kaW5nO3JldHVybiBvPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksbi5wZW5kaW5nPXQsYm8oZSxyKX1yZXR1cm4gbz1uLmludGVybGVhdmVkLG89PT1udWxsPyh0Lm5leHQ9dCxTZyhuKSk6KHQubmV4dD1vLm5leHQsby5uZXh0PXQpLG4uaW50ZXJsZWF2ZWQ9dCxibyhlLHIpfWZ1bmN0aW9uIF9wKGUsdCxyKXtpZih0PXQudXBkYXRlUXVldWUsdCE9PW51bGwmJih0PXQuc2hhcmVkLChyJjQxOTQyNDApIT09MCkpe3ZhciBuPXQubGFuZXM7biY9ZS5wZW5kaW5nTGFuZXMscnw9bix0LmxhbmVzPXIsc2coZSxyKX19ZnVuY3Rpb24gRngoZSx0KXt2YXIgcj1lLnVwZGF0ZVF1ZXVlLG49ZS5hbHRlcm5hdGU7aWYobiE9PW51bGwmJihuPW4udXBkYXRlUXVldWUscj09PW4pKXt2YXIgbz1udWxsLGk9bnVsbDtpZihyPXIuZmlyc3RCYXNlVXBkYXRlLHIhPT1udWxsKXtkb3t2YXIgbD17ZXZlbnRUaW1lOnIuZXZlbnRUaW1lLGxhbmU6ci5sYW5lLHRhZzpyLnRhZyxwYXlsb2FkOnIucGF5bG9hZCxjYWxsYmFjazpyLmNhbGxiYWNrLG5leHQ6bnVsbH07aT09PW51bGw/bz1pPWw6aT1pLm5leHQ9bCxyPXIubmV4dH13aGlsZShyIT09bnVsbCk7aT09PW51bGw/bz1pPXQ6aT1pLm5leHQ9dH1lbHNlIG89aT10O3I9e2Jhc2VTdGF0ZTpuLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6byxsYXN0QmFzZVVwZGF0ZTppLHNoYXJlZDpuLnNoYXJlZCxlZmZlY3RzOm4uZWZmZWN0c30sZS51cGRhdGVRdWV1ZT1yO3JldHVybn1lPXIubGFzdEJhc2VVcGRhdGUsZT09PW51bGw/ci5maXJzdEJhc2VVcGRhdGU9dDplLm5leHQ9dCxyLmxhc3RCYXNlVXBkYXRlPXR9ZnVuY3Rpb24gR3AoZSx0LHIsbil7dmFyIG89ZS51cGRhdGVRdWV1ZTt0aT0hMTt2YXIgaT1vLmZpcnN0QmFzZVVwZGF0ZSxsPW8ubGFzdEJhc2VVcGRhdGUscz1vLnNoYXJlZC5wZW5kaW5nO2lmKHMhPT1udWxsKXtvLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGE9cyx1PWEubmV4dDthLm5leHQ9bnVsbCxsPT09bnVsbD9pPXU6bC5uZXh0PXUsbD1hO3ZhciBwPWUuYWx0ZXJuYXRlO3AhPT1udWxsJiYocD1wLnVwZGF0ZVF1ZXVlLHM9cC5sYXN0QmFzZVVwZGF0ZSxzIT09bCYmKHM9PT1udWxsP3AuZmlyc3RCYXNlVXBkYXRlPXU6cy5uZXh0PXUscC5sYXN0QmFzZVVwZGF0ZT1hKSl9aWYoaSE9PW51bGwpe3ZhciBjPW8uYmFzZVN0YXRlO2w9MCxwPXU9YT1udWxsLHM9aTtkb3t2YXIgZj1zLmxhbmUsZD1zLmV2ZW50VGltZTtpZigobiZmKT09PWYpe3AhPT1udWxsJiYocD1wLm5leHQ9e2V2ZW50VGltZTpkLGxhbmU6MCx0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9KTtlOnt2YXIgbT1lLGg9cztzd2l0Y2goZj10LGQ9cixoLnRhZyl7Y2FzZSAxOmlmKG09aC5wYXlsb2FkLHR5cGVvZiBtPT0iZnVuY3Rpb24iKXtjPW0uY2FsbChkLGMsZik7YnJlYWsgZX1jPW07YnJlYWsgZTtjYXNlIDM6bS5mbGFncz1tLmZsYWdzJi02NTUzN3wxMjg7Y2FzZSAwOmlmKG09aC5wYXlsb2FkLGY9dHlwZW9mIG09PSJmdW5jdGlvbiI/bS5jYWxsKGQsYyxmKTptLGY9PW51bGwpYnJlYWsgZTtjPSRlKHt9LGMsZik7YnJlYWsgZTtjYXNlIDI6dGk9ITB9fXMuY2FsbGJhY2shPT1udWxsJiZzLmxhbmUhPT0wJiYoZS5mbGFnc3w9NjQsZj1vLmVmZmVjdHMsZj09PW51bGw/by5lZmZlY3RzPVtzXTpmLnB1c2gocykpfWVsc2UgZD17ZXZlbnRUaW1lOmQsbGFuZTpmLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0scD09PW51bGw/KHU9cD1kLGE9Yyk6cD1wLm5leHQ9ZCxsfD1mO2lmKHM9cy5uZXh0LHM9PT1udWxsKXtpZihzPW8uc2hhcmVkLnBlbmRpbmcscz09PW51bGwpYnJlYWs7Zj1zLHM9Zi5uZXh0LGYubmV4dD1udWxsLG8ubGFzdEJhc2VVcGRhdGU9ZixvLnNoYXJlZC5wZW5kaW5nPW51bGx9fXdoaWxlKDEpO2lmKHA9PT1udWxsJiYoYT1jKSxvLmJhc2VTdGF0ZT1hLG8uZmlyc3RCYXNlVXBkYXRlPXUsby5sYXN0QmFzZVVwZGF0ZT1wLHQ9by5zaGFyZWQuaW50ZXJsZWF2ZWQsdCE9PW51bGwpe289dDtkbyBsfD1vLmxhbmUsbz1vLm5leHQ7d2hpbGUobyE9PXQpfWVsc2UgaT09PW51bGwmJihvLnNoYXJlZC5sYW5lcz0wKTtybHw9bCxlLmxhbmVzPWwsZS5tZW1vaXplZFN0YXRlPWN9fWZ1bmN0aW9uICR4KGUsdCxyKXtpZihlPXQuZWZmZWN0cyx0LmVmZmVjdHM9bnVsbCxlIT09bnVsbClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdLG89bi5jYWxsYmFjaztpZihvIT09bnVsbCl7aWYobi5jYWxsYmFjaz1udWxsLG49cix0eXBlb2YgbyE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihJKDE5MSxvKSk7by5jYWxsKG4pfX19dmFyIHAyPW5ldyB1dy5Db21wb25lbnQoKS5yZWZzO2Z1bmN0aW9uIEJoKGUsdCxyLG4pe3Q9ZS5tZW1vaXplZFN0YXRlLHI9cihuLHQpLHI9cj09bnVsbD90OiRlKHt9LHQsciksZS5tZW1vaXplZFN0YXRlPXIsZS5sYW5lcz09PTAmJihlLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1yKX12YXIgYWY9e2lzTW91bnRlZDpmdW5jdGlvbihlKXtyZXR1cm4oZT1lLl9yZWFjdEludGVybmFscyk/aWwoZSk9PT1lOiExfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oZSx0LHIpe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG49cHIoKSxvPWZpKGUpLGk9X28obixvKTtpLnBheWxvYWQ9dCxyIT1udWxsJiYoaS5jYWxsYmFjaz1yKSx0PWNpKGUsaSxvKSx0IT09bnVsbCYmKEluKHQsZSxvLG4pLF9wKHQsZSxvKSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oZSx0LHIpe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG49cHIoKSxvPWZpKGUpLGk9X28obixvKTtpLnRhZz0xLGkucGF5bG9hZD10LHIhPW51bGwmJihpLmNhbGxiYWNrPXIpLHQ9Y2koZSxpLG8pLHQhPT1udWxsJiYoSW4odCxlLG8sbiksX3AodCxlLG8pKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj1wcigpLG49ZmkoZSksbz1fbyhyLG4pO28udGFnPTIsdCE9bnVsbCYmKG8uY2FsbGJhY2s9dCksdD1jaShlLG8sbiksdCE9PW51bGwmJihJbih0LGUsbixyKSxfcCh0LGUsbikpfX07ZnVuY3Rpb24gangoZSx0LHIsbixvLGksbCl7cmV0dXJuIGU9ZS5zdGF0ZU5vZGUsdHlwZW9mIGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPT0iZnVuY3Rpb24iP2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG4saSxsKTp0LnByb3RvdHlwZSYmdC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IWx1KHIsbil8fCFsdShvLGkpOiEwfWZ1bmN0aW9uIGYyKGUsdCxyKXt2YXIgbj0hMSxvPWhpLGk9dC5jb250ZXh0VHlwZTtyZXR1cm4gdHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbD9pPWZuKGkpOihvPU5yKHQpP0ppOnRyLmN1cnJlbnQsbj10LmNvbnRleHRUeXBlcyxpPShuPW4hPW51bGwpP2NzKGUsbyk6aGkpLHQ9bmV3IHQocixpKSxlLm1lbW9pemVkU3RhdGU9dC5zdGF0ZSE9PW51bGwmJnQuc3RhdGUhPT12b2lkIDA/dC5zdGF0ZTpudWxsLHQudXBkYXRlcj1hZixlLnN0YXRlTm9kZT10LHQuX3JlYWN0SW50ZXJuYWxzPWUsbiYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PW8sZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1pKSx0fWZ1bmN0aW9uIFd4KGUsdCxyLG4pe2U9dC5zdGF0ZSx0eXBlb2YgdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMocixuKSx0eXBlb2YgdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz09ImZ1bmN0aW9uIiYmdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhyLG4pLHQuc3RhdGUhPT1lJiZhZi5lbnF1ZXVlUmVwbGFjZVN0YXRlKHQsdC5zdGF0ZSxudWxsKX1mdW5jdGlvbiBGaChlLHQscixuKXt2YXIgbz1lLnN0YXRlTm9kZTtvLnByb3BzPXIsby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsby5yZWZzPXAyLENnKGUpO3ZhciBpPXQuY29udGV4dFR5cGU7dHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbD9vLmNvbnRleHQ9Zm4oaSk6KGk9TnIodCk/Smk6dHIuY3VycmVudCxvLmNvbnRleHQ9Y3MoZSxpKSksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsaT10LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyx0eXBlb2YgaT09ImZ1bmN0aW9uIiYmKEJoKGUsdCxpLHIpLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2YgdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBvLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24ifHx0eXBlb2Ygby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2Ygby5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0PW8uc3RhdGUsdHlwZW9mIG8uY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZvLmNvbXBvbmVudFdpbGxNb3VudCgpLHR5cGVvZiBvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJm8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLHQhPT1vLnN0YXRlJiZhZi5lbnF1ZXVlUmVwbGFjZVN0YXRlKG8sby5zdGF0ZSxudWxsKSxHcChlLHIsbyxuKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksdHlwZW9mIG8uY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJihlLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiB6YShlLHQscil7aWYoZT1yLnJlZixlIT09bnVsbCYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJnR5cGVvZiBlIT0ib2JqZWN0Iil7aWYoci5fb3duZXIpe2lmKHI9ci5fb3duZXIscil7aWYoci50YWchPT0xKXRocm93IEVycm9yKEkoMzA5KSk7dmFyIG49ci5zdGF0ZU5vZGV9aWYoIW4pdGhyb3cgRXJyb3IoSSgxNDcsZSkpO3ZhciBvPW4saT0iIitlO3JldHVybiB0IT09bnVsbCYmdC5yZWYhPT1udWxsJiZ0eXBlb2YgdC5yZWY9PSJmdW5jdGlvbiImJnQucmVmLl9zdHJpbmdSZWY9PT1pP3QucmVmOih0PWZ1bmN0aW9uKGwpe3ZhciBzPW8ucmVmcztzPT09cDImJihzPW8ucmVmcz17fSksbD09PW51bGw/ZGVsZXRlIHNbaV06c1tpXT1sfSx0Ll9zdHJpbmdSZWY9aSx0KX1pZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgRXJyb3IoSSgyODQpKTtpZighci5fb3duZXIpdGhyb3cgRXJyb3IoSSgyOTAsZSkpfXJldHVybiBlfWZ1bmN0aW9uIHlwKGUsdCl7dGhyb3cgZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksRXJyb3IoSSgzMSxlPT09IltvYmplY3QgT2JqZWN0XSI/Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXModCkuam9pbigiLCAiKSsifSI6ZSkpfWZ1bmN0aW9uIEh4KGUpe3ZhciB0PWUuX2luaXQ7cmV0dXJuIHQoZS5fcGF5bG9hZCl9ZnVuY3Rpb24gZDIoZSl7ZnVuY3Rpb24gdCh5LHYpe2lmKGUpe3ZhciBnPXkuZGVsZXRpb25zO2c9PT1udWxsPyh5LmRlbGV0aW9ucz1bdl0seS5mbGFnc3w9MTYpOmcucHVzaCh2KX19ZnVuY3Rpb24gcih5LHYpe2lmKCFlKXJldHVybiBudWxsO2Zvcig7diE9PW51bGw7KXQoeSx2KSx2PXYuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBuKHksdil7Zm9yKHk9bmV3IE1hcDt2IT09bnVsbDspdi5rZXkhPT1udWxsP3kuc2V0KHYua2V5LHYpOnkuc2V0KHYuaW5kZXgsdiksdj12LnNpYmxpbmc7cmV0dXJuIHl9ZnVuY3Rpb24gbyh5LHYpe3JldHVybiB5PWRpKHksdikseS5pbmRleD0wLHkuc2libGluZz1udWxsLHl9ZnVuY3Rpb24gaSh5LHYsZyl7cmV0dXJuIHkuaW5kZXg9ZyxlPyhnPXkuYWx0ZXJuYXRlLGchPT1udWxsPyhnPWcuaW5kZXgsZzx2Pyh5LmZsYWdzfD0yLHYpOmcpOih5LmZsYWdzfD0yLHYpKTooeS5mbGFnc3w9MTA0ODU3Nix2KX1mdW5jdGlvbiBsKHkpe3JldHVybiBlJiZ5LmFsdGVybmF0ZT09PW51bGwmJih5LmZsYWdzfD0yKSx5fWZ1bmN0aW9uIHMoeSx2LGcsQyl7cmV0dXJuIHY9PT1udWxsfHx2LnRhZyE9PTY/KHY9aWgoZyx5Lm1vZGUsQyksdi5yZXR1cm49eSx2KToodj1vKHYsZyksdi5yZXR1cm49eSx2KX1mdW5jdGlvbiBhKHksdixnLEMpe3ZhciBrPWcudHlwZTtyZXR1cm4gaz09PUdsP3AoeSx2LGcucHJvcHMuY2hpbGRyZW4sQyxnLmtleSk6diE9PW51bGwmJih2LmVsZW1lbnRUeXBlPT09a3x8dHlwZW9mIGs9PSJvYmplY3QiJiZrIT09bnVsbCYmay4kJHR5cGVvZj09PWVpJiZIeChrKT09PXYudHlwZSk/KEM9byh2LGcucHJvcHMpLEMucmVmPXphKHksdixnKSxDLnJldHVybj15LEMpOihDPU1wKGcudHlwZSxnLmtleSxnLnByb3BzLG51bGwseS5tb2RlLEMpLEMucmVmPXphKHksdixnKSxDLnJldHVybj15LEMpfWZ1bmN0aW9uIHUoeSx2LGcsQyl7cmV0dXJuIHY9PT1udWxsfHx2LnRhZyE9PTR8fHYuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT1nLmNvbnRhaW5lckluZm98fHYuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09Zy5pbXBsZW1lbnRhdGlvbj8odj1saChnLHkubW9kZSxDKSx2LnJldHVybj15LHYpOih2PW8odixnLmNoaWxkcmVufHxbXSksdi5yZXR1cm49eSx2KX1mdW5jdGlvbiBwKHksdixnLEMsayl7cmV0dXJuIHY9PT1udWxsfHx2LnRhZyE9PTc/KHY9WmkoZyx5Lm1vZGUsQyxrKSx2LnJldHVybj15LHYpOih2PW8odixnKSx2LnJldHVybj15LHYpfWZ1bmN0aW9uIGMoeSx2LGcpe2lmKHR5cGVvZiB2PT0ic3RyaW5nIiYmdiE9PSIifHx0eXBlb2Ygdj09Im51bWJlciIpcmV0dXJuIHY9aWgoIiIrdix5Lm1vZGUsZyksdi5yZXR1cm49eSx2O2lmKHR5cGVvZiB2PT0ib2JqZWN0IiYmdiE9PW51bGwpe3N3aXRjaCh2LiQkdHlwZW9mKXtjYXNlIHJwOnJldHVybiBnPU1wKHYudHlwZSx2LmtleSx2LnByb3BzLG51bGwseS5tb2RlLGcpLGcucmVmPXphKHksbnVsbCx2KSxnLnJldHVybj15LGc7Y2FzZSBSbDpyZXR1cm4gdj1saCh2LHkubW9kZSxnKSx2LnJldHVybj15LHY7Y2FzZSBlaTp2YXIgQz12Ll9pbml0O3JldHVybiBjKHksQyh2Ll9wYXlsb2FkKSxnKX1pZihXYSh2KXx8TGEodikpcmV0dXJuIHY9Wmkodix5Lm1vZGUsZyxudWxsKSx2LnJldHVybj15LHY7eXAoeSx2KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBmKHksdixnLEMpe3ZhciBrPXYhPT1udWxsP3Yua2V5Om51bGw7aWYodHlwZW9mIGc9PSJzdHJpbmciJiZnIT09IiJ8fHR5cGVvZiBnPT0ibnVtYmVyIilyZXR1cm4gayE9PW51bGw/bnVsbDpzKHksdiwiIitnLEMpO2lmKHR5cGVvZiBnPT0ib2JqZWN0IiYmZyE9PW51bGwpe3N3aXRjaChnLiQkdHlwZW9mKXtjYXNlIHJwOnJldHVybiBnLmtleT09PWs/YSh5LHYsZyxDKTpudWxsO2Nhc2UgUmw6cmV0dXJuIGcua2V5PT09az91KHksdixnLEMpOm51bGw7Y2FzZSBlaTpyZXR1cm4gaz1nLl9pbml0LGYoeSx2LGsoZy5fcGF5bG9hZCksQyl9aWYoV2EoZyl8fExhKGcpKXJldHVybiBrIT09bnVsbD9udWxsOnAoeSx2LGcsQyxudWxsKTt5cCh5LGcpfXJldHVybiBudWxsfWZ1bmN0aW9uIGQoeSx2LGcsQyxrKXtpZih0eXBlb2YgQz09InN0cmluZyImJkMhPT0iInx8dHlwZW9mIEM9PSJudW1iZXIiKXJldHVybiB5PXkuZ2V0KGcpfHxudWxsLHModix5LCIiK0Msayk7aWYodHlwZW9mIEM9PSJvYmplY3QiJiZDIT09bnVsbCl7c3dpdGNoKEMuJCR0eXBlb2Ype2Nhc2UgcnA6cmV0dXJuIHk9eS5nZXQoQy5rZXk9PT1udWxsP2c6Qy5rZXkpfHxudWxsLGEodix5LEMsayk7Y2FzZSBSbDpyZXR1cm4geT15LmdldChDLmtleT09PW51bGw/ZzpDLmtleSl8fG51bGwsdSh2LHksQyxrKTtjYXNlIGVpOnZhciBEPUMuX2luaXQ7cmV0dXJuIGQoeSx2LGcsRChDLl9wYXlsb2FkKSxrKX1pZihXYShDKXx8TGEoQykpcmV0dXJuIHk9eS5nZXQoZyl8fG51bGwscCh2LHksQyxrLG51bGwpO3lwKHYsQyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbSh5LHYsZyxDKXtmb3IodmFyIGs9bnVsbCxEPW51bGwsTz12LE49dj0wLEw9bnVsbDtPIT09bnVsbCYmTjxnLmxlbmd0aDtOKyspe08uaW5kZXg+Tj8oTD1PLE89bnVsbCk6TD1PLnNpYmxpbmc7dmFyIFc9Zih5LE8sZ1tOXSxDKTtpZihXPT09bnVsbCl7Tz09PW51bGwmJihPPUwpO2JyZWFrfWUmJk8mJlcuYWx0ZXJuYXRlPT09bnVsbCYmdCh5LE8pLHY9aShXLHYsTiksRD09PW51bGw/az1XOkQuc2libGluZz1XLEQ9VyxPPUx9aWYoTj09PWcubGVuZ3RoKXJldHVybiByKHksTyksRGUmJkdpKHksTiksaztpZihPPT09bnVsbCl7Zm9yKDtOPGcubGVuZ3RoO04rKylPPWMoeSxnW05dLEMpLE8hPT1udWxsJiYodj1pKE8sdixOKSxEPT09bnVsbD9rPU86RC5zaWJsaW5nPU8sRD1PKTtyZXR1cm4gRGUmJkdpKHksTiksa31mb3IoTz1uKHksTyk7TjxnLmxlbmd0aDtOKyspTD1kKE8seSxOLGdbTl0sQyksTCE9PW51bGwmJihlJiZMLmFsdGVybmF0ZSE9PW51bGwmJk8uZGVsZXRlKEwua2V5PT09bnVsbD9OOkwua2V5KSx2PWkoTCx2LE4pLEQ9PT1udWxsP2s9TDpELnNpYmxpbmc9TCxEPUwpO3JldHVybiBlJiZPLmZvckVhY2goZnVuY3Rpb24oWSl7cmV0dXJuIHQoeSxZKX0pLERlJiZHaSh5LE4pLGt9ZnVuY3Rpb24gaCh5LHYsZyxDKXt2YXIgaz1MYShnKTtpZih0eXBlb2YgayE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihJKDE1MCkpO2lmKGc9ay5jYWxsKGcpLGc9PW51bGwpdGhyb3cgRXJyb3IoSSgxNTEpKTtmb3IodmFyIEQ9az1udWxsLE89dixOPXY9MCxMPW51bGwsVz1nLm5leHQoKTtPIT09bnVsbCYmIVcuZG9uZTtOKyssVz1nLm5leHQoKSl7Ty5pbmRleD5OPyhMPU8sTz1udWxsKTpMPU8uc2libGluZzt2YXIgWT1mKHksTyxXLnZhbHVlLEMpO2lmKFk9PT1udWxsKXtPPT09bnVsbCYmKE89TCk7YnJlYWt9ZSYmTyYmWS5hbHRlcm5hdGU9PT1udWxsJiZ0KHksTyksdj1pKFksdixOKSxEPT09bnVsbD9rPVk6RC5zaWJsaW5nPVksRD1ZLE89TH1pZihXLmRvbmUpcmV0dXJuIHIoeSxPKSxEZSYmR2koeSxOKSxrO2lmKE89PT1udWxsKXtmb3IoOyFXLmRvbmU7TisrLFc9Zy5uZXh0KCkpVz1jKHksVy52YWx1ZSxDKSxXIT09bnVsbCYmKHY9aShXLHYsTiksRD09PW51bGw/az1XOkQuc2libGluZz1XLEQ9Vyk7cmV0dXJuIERlJiZHaSh5LE4pLGt9Zm9yKE89bih5LE8pOyFXLmRvbmU7TisrLFc9Zy5uZXh0KCkpVz1kKE8seSxOLFcudmFsdWUsQyksVyE9PW51bGwmJihlJiZXLmFsdGVybmF0ZSE9PW51bGwmJk8uZGVsZXRlKFcua2V5PT09bnVsbD9OOlcua2V5KSx2PWkoVyx2LE4pLEQ9PT1udWxsP2s9VzpELnNpYmxpbmc9VyxEPVcpO3JldHVybiBlJiZPLmZvckVhY2goZnVuY3Rpb24oeWUpe3JldHVybiB0KHkseWUpfSksRGUmJkdpKHksTiksa31mdW5jdGlvbiBTKHksdixnLEMpe2lmKHR5cGVvZiBnPT0ib2JqZWN0IiYmZyE9PW51bGwmJmcudHlwZT09PUdsJiZnLmtleT09PW51bGwmJihnPWcucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiBnPT0ib2JqZWN0IiYmZyE9PW51bGwpe3N3aXRjaChnLiQkdHlwZW9mKXtjYXNlIHJwOmU6e2Zvcih2YXIgaz1nLmtleSxEPXY7RCE9PW51bGw7KXtpZihELmtleT09PWspe2lmKGs9Zy50eXBlLGs9PT1HbCl7aWYoRC50YWc9PT03KXtyKHksRC5zaWJsaW5nKSx2PW8oRCxnLnByb3BzLmNoaWxkcmVuKSx2LnJldHVybj15LHk9djticmVhayBlfX1lbHNlIGlmKEQuZWxlbWVudFR5cGU9PT1rfHx0eXBlb2Ygaz09Im9iamVjdCImJmshPT1udWxsJiZrLiQkdHlwZW9mPT09ZWkmJkh4KGspPT09RC50eXBlKXtyKHksRC5zaWJsaW5nKSx2PW8oRCxnLnByb3BzKSx2LnJlZj16YSh5LEQsZyksdi5yZXR1cm49eSx5PXY7YnJlYWsgZX1yKHksRCk7YnJlYWt9ZWxzZSB0KHksRCk7RD1ELnNpYmxpbmd9Zy50eXBlPT09R2w/KHY9WmkoZy5wcm9wcy5jaGlsZHJlbix5Lm1vZGUsQyxnLmtleSksdi5yZXR1cm49eSx5PXYpOihDPU1wKGcudHlwZSxnLmtleSxnLnByb3BzLG51bGwseS5tb2RlLEMpLEMucmVmPXphKHksdixnKSxDLnJldHVybj15LHk9Qyl9cmV0dXJuIGwoeSk7Y2FzZSBSbDplOntmb3IoRD1nLmtleTt2IT09bnVsbDspe2lmKHYua2V5PT09RClpZih2LnRhZz09PTQmJnYuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1nLmNvbnRhaW5lckluZm8mJnYuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Zy5pbXBsZW1lbnRhdGlvbil7cih5LHYuc2libGluZyksdj1vKHYsZy5jaGlsZHJlbnx8W10pLHYucmV0dXJuPXkseT12O2JyZWFrIGV9ZWxzZXtyKHksdik7YnJlYWt9ZWxzZSB0KHksdik7dj12LnNpYmxpbmd9dj1saChnLHkubW9kZSxDKSx2LnJldHVybj15LHk9dn1yZXR1cm4gbCh5KTtjYXNlIGVpOnJldHVybiBEPWcuX2luaXQsUyh5LHYsRChnLl9wYXlsb2FkKSxDKX1pZihXYShnKSlyZXR1cm4gbSh5LHYsZyxDKTtpZihMYShnKSlyZXR1cm4gaCh5LHYsZyxDKTt5cCh5LGcpfXJldHVybiB0eXBlb2YgZz09InN0cmluZyImJmchPT0iInx8dHlwZW9mIGc9PSJudW1iZXIiPyhnPSIiK2csdiE9PW51bGwmJnYudGFnPT09Nj8ocih5LHYuc2libGluZyksdj1vKHYsZyksdi5yZXR1cm49eSx5PXYpOihyKHksdiksdj1paChnLHkubW9kZSxDKSx2LnJldHVybj15LHk9diksbCh5KSk6cih5LHYpfXJldHVybiBTfXZhciBmcz1kMighMCksbTI9ZDIoITEpLHh1PXt9LFFuPXlpKHh1KSxjdT15aSh4dSkscHU9eWkoeHUpO2Z1bmN0aW9uIFlpKGUpe2lmKGU9PT14dSl0aHJvdyBFcnJvcihJKDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIFRnKGUsdCl7c3dpdGNoKENlKHB1LHQpLENlKGN1LGUpLENlKFFuLHh1KSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6Z2gobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1naCh0LGUpfVBlKFFuKSxDZShRbix0KX1mdW5jdGlvbiBkcygpe1BlKFFuKSxQZShjdSksUGUocHUpfWZ1bmN0aW9uIGgyKGUpe1lpKHB1LmN1cnJlbnQpO3ZhciB0PVlpKFFuLmN1cnJlbnQpLHI9Z2godCxlLnR5cGUpO3QhPT1yJiYoQ2UoY3UsZSksQ2UoUW4scikpfWZ1bmN0aW9uIF9nKGUpe2N1LmN1cnJlbnQ9PT1lJiYoUGUoUW4pLFBlKGN1KSl9dmFyIEJlPXlpKDApO2Z1bmN0aW9uIHFwKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIHI9dC5tZW1vaXplZFN0YXRlO2lmKHIhPT1udWxsJiYocj1yLmRlaHlkcmF0ZWQscj09PW51bGx8fHIuZGF0YT09PSIkPyJ8fHIuZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIEptPVtdO2Z1bmN0aW9uIGtnKCl7Zm9yKHZhciBlPTA7ZTxKbS5sZW5ndGg7ZSsrKUptW2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7Sm0ubGVuZ3RoPTB9dmFyIGtwPVBvLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZWg9UG8uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsdGw9MCxGZT1udWxsLHl0PW51bGwsYnQ9bnVsbCxRcD0hMSxLYT0hMSxmdT0wLFViPTA7ZnVuY3Rpb24gWnQoKXt0aHJvdyBFcnJvcihJKDMyMSkpfWZ1bmN0aW9uIE5nKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aCYmcjxlLmxlbmd0aDtyKyspaWYoIUxuKGVbcl0sdFtyXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gYmcoZSx0LHIsbixvLGkpe2lmKHRsPWksRmU9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLGtwLmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/cWI6UWIsZT1yKG4sbyksS2Epe2k9MDtkb3tpZihLYT0hMSxmdT0wLDI1PD1pKXRocm93IEVycm9yKEkoMzAxKSk7aSs9MSxidD15dD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxrcC5jdXJyZW50PUtiLGU9cihuLG8pfXdoaWxlKEthKX1pZihrcC5jdXJyZW50PUtwLHQ9eXQhPT1udWxsJiZ5dC5uZXh0IT09bnVsbCx0bD0wLGJ0PXl0PUZlPW51bGwsUXA9ITEsdCl0aHJvdyBFcnJvcihJKDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIEVnKCl7dmFyIGU9ZnUhPT0wO3JldHVybiBmdT0wLGV9ZnVuY3Rpb24gUm4oKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gYnQ9PT1udWxsP0ZlLm1lbW9pemVkU3RhdGU9YnQ9ZTpidD1idC5uZXh0PWUsYnR9ZnVuY3Rpb24gZG4oKXtpZih5dD09PW51bGwpe3ZhciBlPUZlLmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT15dC5uZXh0O3ZhciB0PWJ0PT09bnVsbD9GZS5tZW1vaXplZFN0YXRlOmJ0Lm5leHQ7aWYodCE9PW51bGwpYnQ9dCx5dD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoSSgzMTApKTt5dD1lLGU9e21lbW9pemVkU3RhdGU6eXQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6eXQuYmFzZVN0YXRlLGJhc2VRdWV1ZTp5dC5iYXNlUXVldWUscXVldWU6eXQucXVldWUsbmV4dDpudWxsfSxidD09PW51bGw/RmUubWVtb2l6ZWRTdGF0ZT1idD1lOmJ0PWJ0Lm5leHQ9ZX1yZXR1cm4gYnR9ZnVuY3Rpb24gZHUoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIHRoKGUpe3ZhciB0PWRuKCkscj10LnF1ZXVlO2lmKHI9PT1udWxsKXRocm93IEVycm9yKEkoMzExKSk7ci5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIG49eXQsbz1uLmJhc2VRdWV1ZSxpPXIucGVuZGluZztpZihpIT09bnVsbCl7aWYobyE9PW51bGwpe3ZhciBsPW8ubmV4dDtvLm5leHQ9aS5uZXh0LGkubmV4dD1sfW4uYmFzZVF1ZXVlPW89aSxyLnBlbmRpbmc9bnVsbH1pZihvIT09bnVsbCl7aT1vLm5leHQsbj1uLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9aTtkb3t2YXIgcD11LmxhbmU7aWYoKHRsJnApPT09cClhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLG49dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTplKG4sdS5hY3Rpb24pO2Vsc2V7dmFyIGM9e2xhbmU6cCxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWMsbD1uKTphPWEubmV4dD1jLEZlLmxhbmVzfD1wLHJsfD1wfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09aSk7YT09PW51bGw/bD1uOmEubmV4dD1zLExuKG4sdC5tZW1vaXplZFN0YXRlKXx8KF9yPSEwKSx0Lm1lbW9pemVkU3RhdGU9bix0LmJhc2VTdGF0ZT1sLHQuYmFzZVF1ZXVlPWEsci5sYXN0UmVuZGVyZWRTdGF0ZT1ufWlmKGU9ci5pbnRlcmxlYXZlZCxlIT09bnVsbCl7bz1lO2RvIGk9by5sYW5lLEZlLmxhbmVzfD1pLHJsfD1pLG89by5uZXh0O3doaWxlKG8hPT1lKX1lbHNlIG89PT1udWxsJiYoci5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLHIuZGlzcGF0Y2hdfWZ1bmN0aW9uIHJoKGUpe3ZhciB0PWRuKCkscj10LnF1ZXVlO2lmKHI9PT1udWxsKXRocm93IEVycm9yKEkoMzExKSk7ci5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIG49ci5kaXNwYXRjaCxvPXIucGVuZGluZyxpPXQubWVtb2l6ZWRTdGF0ZTtpZihvIT09bnVsbCl7ci5wZW5kaW5nPW51bGw7dmFyIGw9bz1vLm5leHQ7ZG8gaT1lKGksbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1vKTtMbihpLHQubWVtb2l6ZWRTdGF0ZSl8fChfcj0hMCksdC5tZW1vaXplZFN0YXRlPWksdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9aSksci5sYXN0UmVuZGVyZWRTdGF0ZT1pfXJldHVybltpLG5dfWZ1bmN0aW9uIGcyKCl7fWZ1bmN0aW9uIHkyKGUsdCl7dmFyIHI9RmUsbj1kbigpLG89dCgpLGk9IUxuKG4ubWVtb2l6ZWRTdGF0ZSxvKTtpZihpJiYobi5tZW1vaXplZFN0YXRlPW8sX3I9ITApLG49bi5xdWV1ZSxQZyh3Mi5iaW5kKG51bGwscixuLGUpLFtlXSksbi5nZXRTbmFwc2hvdCE9PXR8fGl8fGJ0IT09bnVsbCYmYnQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYoci5mbGFnc3w9MjA0OCxtdSg5LHgyLmJpbmQobnVsbCxyLG4sbyx0KSx2b2lkIDAsbnVsbCksRXQ9PT1udWxsKXRocm93IEVycm9yKEkoMzQ5KSk7dGwmMzB8fHYyKHIsdCxvKX1yZXR1cm4gb31mdW5jdGlvbiB2MihlLHQscil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpyfSx0PUZlLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LEZlLnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToocj10LnN0b3JlcyxyPT09bnVsbD90LnN0b3Jlcz1bZV06ci5wdXNoKGUpKX1mdW5jdGlvbiB4MihlLHQscixuKXt0LnZhbHVlPXIsdC5nZXRTbmFwc2hvdD1uLFMyKHQpJiZDMihlKX1mdW5jdGlvbiB3MihlLHQscil7cmV0dXJuIHIoZnVuY3Rpb24oKXtTMih0KSYmQzIoZSl9KX1mdW5jdGlvbiBTMihlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIHI9dCgpO3JldHVybiFMbihlLHIpfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBDMihlKXt2YXIgdD1ibyhlLDEpO3QhPT1udWxsJiZJbih0LGUsMSwtMSl9ZnVuY3Rpb24gVXgoZSl7dmFyIHQ9Um4oKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6ZHUsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD1HYi5iaW5kKG51bGwsRmUsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBtdShlLHQscixuKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpyLGRlcHM6bixuZXh0Om51bGx9LHQ9RmUudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0sRmUudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihyPXQubGFzdEVmZmVjdCxyPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KG49ci5uZXh0LHIubmV4dD1lLGUubmV4dD1uLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiBUMigpe3JldHVybiBkbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gTnAoZSx0LHIsbil7dmFyIG89Um4oKTtGZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9bXUoMXx0LHIsdm9pZCAwLG49PT12b2lkIDA/bnVsbDpuKX1mdW5jdGlvbiB1ZihlLHQscixuKXt2YXIgbz1kbigpO249bj09PXZvaWQgMD9udWxsOm47dmFyIGk9dm9pZCAwO2lmKHl0IT09bnVsbCl7dmFyIGw9eXQubWVtb2l6ZWRTdGF0ZTtpZihpPWwuZGVzdHJveSxuIT09bnVsbCYmTmcobixsLmRlcHMpKXtvLm1lbW9pemVkU3RhdGU9bXUodCxyLGksbik7cmV0dXJufX1GZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9bXUoMXx0LHIsaSxuKX1mdW5jdGlvbiBWeChlLHQpe3JldHVybiBOcCg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiBQZyhlLHQpe3JldHVybiB1ZigyMDQ4LDgsZSx0KX1mdW5jdGlvbiBfMihlLHQpe3JldHVybiB1Zig0LDIsZSx0KX1mdW5jdGlvbiBrMihlLHQpe3JldHVybiB1Zig0LDQsZSx0KX1mdW5jdGlvbiBOMihlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gYjIoZSx0LHIpe3JldHVybiByPXIhPW51bGw/ci5jb25jYXQoW2VdKTpudWxsLHVmKDQsNCxOMi5iaW5kKG51bGwsdCxlKSxyKX1mdW5jdGlvbiBNZygpe31mdW5jdGlvbiBFMihlLHQpe3ZhciByPWRuKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgbj1yLm1lbW9pemVkU3RhdGU7cmV0dXJuIG4hPT1udWxsJiZ0IT09bnVsbCYmTmcodCxuWzFdKT9uWzBdOihyLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gUDIoZSx0KXt2YXIgcj1kbigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIG49ci5tZW1vaXplZFN0YXRlO3JldHVybiBuIT09bnVsbCYmdCE9PW51bGwmJk5nKHQsblsxXSk/blswXTooZT1lKCksci5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIE0yKGUsdCxyKXtyZXR1cm4gdGwmMjE/KExuKHIsdCl8fChyPUF3KCksRmUubGFuZXN8PXIscmx8PXIsZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLF9yPSEwKSxlLm1lbW9pemVkU3RhdGU9cil9ZnVuY3Rpb24gVmIoZSx0KXt2YXIgcj1nZTtnZT1yIT09MCYmND5yP3I6NCxlKCEwKTt2YXIgbj1laC50cmFuc2l0aW9uO2VoLnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e2dlPXIsZWgudHJhbnNpdGlvbj1ufX1mdW5jdGlvbiBJMigpe3JldHVybiBkbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gUmIoZSx0LHIpe3ZhciBuPWZpKGUpO2lmKHI9e2xhbmU6bixhY3Rpb246cixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LEwyKGUpKUEyKHQscik7ZWxzZSBpZihyPXUyKGUsdCxyLG4pLHIhPT1udWxsKXt2YXIgbz1wcigpO0luKHIsZSxuLG8pLEQyKHIsdCxuKX19ZnVuY3Rpb24gR2IoZSx0LHIpe3ZhciBuPWZpKGUpLG89e2xhbmU6bixhY3Rpb246cixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKEwyKGUpKUEyKHQsbyk7ZWxzZXt2YXIgaT1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKGk9PT1udWxsfHxpLmxhbmVzPT09MCkmJihpPXQubGFzdFJlbmRlcmVkUmVkdWNlcixpIT09bnVsbCkpdHJ5e3ZhciBsPXQubGFzdFJlbmRlcmVkU3RhdGUscz1pKGwscik7aWYoby5oYXNFYWdlclN0YXRlPSEwLG8uZWFnZXJTdGF0ZT1zLExuKHMsbCkpe3ZhciBhPXQuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KG8ubmV4dD1vLFNnKHQpKTooby5uZXh0PWEubmV4dCxhLm5leHQ9byksdC5pbnRlcmxlYXZlZD1vO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fXI9dTIoZSx0LG8sbiksciE9PW51bGwmJihvPXByKCksSW4ocixlLG4sbyksRDIocix0LG4pKX19ZnVuY3Rpb24gTDIoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1GZXx8dCE9PW51bGwmJnQ9PT1GZX1mdW5jdGlvbiBBMihlLHQpe0thPVFwPSEwO3ZhciByPWUucGVuZGluZztyPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PXIubmV4dCxyLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gRDIoZSx0LHIpe2lmKHImNDE5NDI0MCl7dmFyIG49dC5sYW5lcztuJj1lLnBlbmRpbmdMYW5lcyxyfD1uLHQubGFuZXM9cixzZyhlLHIpfX12YXIgS3A9e3JlYWRDb250ZXh0OmZuLHVzZUNhbGxiYWNrOlp0LHVzZUNvbnRleHQ6WnQsdXNlRWZmZWN0Olp0LHVzZUltcGVyYXRpdmVIYW5kbGU6WnQsdXNlSW5zZXJ0aW9uRWZmZWN0Olp0LHVzZUxheW91dEVmZmVjdDpadCx1c2VNZW1vOlp0LHVzZVJlZHVjZXI6WnQsdXNlUmVmOlp0LHVzZVN0YXRlOlp0LHVzZURlYnVnVmFsdWU6WnQsdXNlRGVmZXJyZWRWYWx1ZTpadCx1c2VUcmFuc2l0aW9uOlp0LHVzZU11dGFibGVTb3VyY2U6WnQsdXNlU3luY0V4dGVybmFsU3RvcmU6WnQsdXNlSWQ6WnQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxxYj17cmVhZENvbnRleHQ6Zm4sdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUm4oKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OmZuLHVzZUVmZmVjdDpWeCx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gcj1yIT1udWxsP3IuY29uY2F0KFtlXSk6bnVsbCxOcCg0MTk0MzA4LDQsTjIuYmluZChudWxsLHQsZSkscil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBOcCg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIE5wKDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIHI9Um4oKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxyLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQscil7dmFyIG49Um4oKTtyZXR1cm4gdD1yIT09dm9pZCAwP3IodCk6dCxuLm1lbW9pemVkU3RhdGU9bi5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LG4ucXVldWU9ZSxlPWUuZGlzcGF0Y2g9UmIuYmluZChudWxsLEZlLGUpLFtuLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD1SbigpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTpVeCx1c2VEZWJ1Z1ZhbHVlOk1nLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFJuKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9VXgoITEpLHQ9ZVswXTtyZXR1cm4gZT1WYi5iaW5kKG51bGwsZVsxXSksUm4oKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1GZSxvPVJuKCk7aWYoRGUpe2lmKHI9PT12b2lkIDApdGhyb3cgRXJyb3IoSSg0MDcpKTtyPXIoKX1lbHNle2lmKHI9dCgpLEV0PT09bnVsbCl0aHJvdyBFcnJvcihJKDM0OSkpO3RsJjMwfHx2MihuLHQscil9by5tZW1vaXplZFN0YXRlPXI7dmFyIGk9e3ZhbHVlOnIsZ2V0U25hcHNob3Q6dH07cmV0dXJuIG8ucXVldWU9aSxWeCh3Mi5iaW5kKG51bGwsbixpLGUpLFtlXSksbi5mbGFnc3w9MjA0OCxtdSg5LHgyLmJpbmQobnVsbCxuLGkscix0KSx2b2lkIDAsbnVsbCkscn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT1SbigpLHQ9RXQuaWRlbnRpZmllclByZWZpeDtpZihEZSl7dmFyIHI9VG8sbj1DbztyPShuJn4oMTw8MzItTW4obiktMSkpLnRvU3RyaW5nKDMyKStyLHQ9IjoiK3QrIlIiK3Iscj1mdSsrLDA8ciYmKHQrPSJIIityLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugcj1VYisrLHQ9IjoiK3QrInIiK3IudG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sUWI9e3JlYWRDb250ZXh0OmZuLHVzZUNhbGxiYWNrOkUyLHVzZUNvbnRleHQ6Zm4sdXNlRWZmZWN0OlBnLHVzZUltcGVyYXRpdmVIYW5kbGU6YjIsdXNlSW5zZXJ0aW9uRWZmZWN0Ol8yLHVzZUxheW91dEVmZmVjdDprMix1c2VNZW1vOlAyLHVzZVJlZHVjZXI6dGgsdXNlUmVmOlQyLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoKGR1KX0sdXNlRGVidWdWYWx1ZTpNZyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWRuKCk7cmV0dXJuIE0yKHQseXQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoKGR1KVswXSx0PWRuKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpnMix1c2VTeW5jRXh0ZXJuYWxTdG9yZTp5Mix1c2VJZDpJMix1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LEtiPXtyZWFkQ29udGV4dDpmbix1c2VDYWxsYmFjazpFMix1c2VDb250ZXh0OmZuLHVzZUVmZmVjdDpQZyx1c2VJbXBlcmF0aXZlSGFuZGxlOmIyLHVzZUluc2VydGlvbkVmZmVjdDpfMix1c2VMYXlvdXRFZmZlY3Q6azIsdXNlTWVtbzpQMix1c2VSZWR1Y2VyOnJoLHVzZVJlZjpUMix1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiByaChkdSl9LHVzZURlYnVnVmFsdWU6TWcsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1kbigpO3JldHVybiB5dD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6TTIodCx5dC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9cmgoZHUpWzBdLHQ9ZG4oKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOmcyLHVzZVN5bmNFeHRlcm5hbFN0b3JlOnkyLHVzZUlkOkkyLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gbXMoZSx0KXt0cnl7dmFyIHI9IiIsbj10O2RvIHIrPWtOKG4pLG49bi5yZXR1cm47d2hpbGUobik7dmFyIG89cn1jYXRjaChpKXtvPVxgCkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IFxgK2kubWVzc2FnZStcYApcYCtpLnN0YWNrfXJldHVybnt2YWx1ZTplLHNvdXJjZTp0LHN0YWNrOm8sZGlnZXN0Om51bGx9fWZ1bmN0aW9uIG5oKGUsdCxyKXtyZXR1cm57dmFsdWU6ZSxzb3VyY2U6bnVsbCxzdGFjazpyPz9udWxsLGRpZ2VzdDp0Pz9udWxsfX1mdW5jdGlvbiAkaChlLHQpe3RyeXtjb25zb2xlLmVycm9yKHQudmFsdWUpfWNhdGNoKHIpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyByfSl9fXZhciBZYj10eXBlb2YgV2Vha01hcD09ImZ1bmN0aW9uIj9XZWFrTWFwOk1hcDtmdW5jdGlvbiBPMihlLHQscil7cj1fbygtMSxyKSxyLnRhZz0zLHIucGF5bG9hZD17ZWxlbWVudDpudWxsfTt2YXIgbj10LnZhbHVlO3JldHVybiByLmNhbGxiYWNrPWZ1bmN0aW9uKCl7WHB8fChYcD0hMCxLaD1uKSwkaChlLHQpfSxyfWZ1bmN0aW9uIHoyKGUsdCxyKXtyPV9vKC0xLHIpLHIudGFnPTM7dmFyIG49ZS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil7dmFyIG89dC52YWx1ZTtyLnBheWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbihvKX0sci5jYWxsYmFjaz1mdW5jdGlvbigpeyRoKGUsdCl9fXZhciBpPWUuc3RhdGVOb2RlO3JldHVybiBpIT09bnVsbCYmdHlwZW9mIGkuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihyLmNhbGxiYWNrPWZ1bmN0aW9uKCl7JGgoZSx0KSx0eXBlb2YgbiE9ImZ1bmN0aW9uIiYmKHBpPT09bnVsbD9waT1uZXcgU2V0KFt0aGlzXSk6cGkuYWRkKHRoaXMpKTt2YXIgbD10LnN0YWNrO3RoaXMuY29tcG9uZW50RGlkQ2F0Y2godC52YWx1ZSx7Y29tcG9uZW50U3RhY2s6bCE9PW51bGw/bDoiIn0pfSkscn1mdW5jdGlvbiBSeChlLHQscil7dmFyIG49ZS5waW5nQ2FjaGU7aWYobj09PW51bGwpe249ZS5waW5nQ2FjaGU9bmV3IFliO3ZhciBvPW5ldyBTZXQ7bi5zZXQodCxvKX1lbHNlIG89bi5nZXQodCksbz09PXZvaWQgMCYmKG89bmV3IFNldCxuLnNldCh0LG8pKTtvLmhhcyhyKXx8KG8uYWRkKHIpLGU9YzYuYmluZChudWxsLGUsdCxyKSx0LnRoZW4oZSxlKSl9ZnVuY3Rpb24gR3goZSl7ZG97dmFyIHQ7aWYoKHQ9ZS50YWc9PT0xMykmJih0PWUubWVtb2l6ZWRTdGF0ZSx0PXQhPT1udWxsP3QuZGVoeWRyYXRlZCE9PW51bGw6ITApLHQpcmV0dXJuIGU7ZT1lLnJldHVybn13aGlsZShlIT09bnVsbCk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gcXgoZSx0LHIsbixvKXtyZXR1cm4gZS5tb2RlJjE/KGUuZmxhZ3N8PTY1NTM2LGUubGFuZXM9byxlKTooZT09PXQ/ZS5mbGFnc3w9NjU1MzY6KGUuZmxhZ3N8PTEyOCxyLmZsYWdzfD0xMzEwNzIsci5mbGFncyY9LTUyODA1LHIudGFnPT09MSYmKHIuYWx0ZXJuYXRlPT09bnVsbD9yLnRhZz0xNzoodD1fbygtMSwxKSx0LnRhZz0yLGNpKHIsdCwxKSkpLHIubGFuZXN8PTEpLGUpfXZhciBYYj1Qby5SZWFjdEN1cnJlbnRPd25lcixfcj0hMTtmdW5jdGlvbiBjcihlLHQscixuKXt0LmNoaWxkPWU9PT1udWxsP20yKHQsbnVsbCxyLG4pOmZzKHQsZS5jaGlsZCxyLG4pfWZ1bmN0aW9uIFF4KGUsdCxyLG4sbyl7cj1yLnJlbmRlcjt2YXIgaT10LnJlZjtyZXR1cm4gc3ModCxvKSxuPWJnKGUsdCxyLG4saSxvKSxyPUVnKCksZSE9PW51bGwmJiFfcj8odC51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQuZmxhZ3MmPS0yMDUzLGUubGFuZXMmPX5vLEVvKGUsdCxvKSk6KERlJiZyJiZoZyh0KSx0LmZsYWdzfD0xLGNyKGUsdCxuLG8pLHQuY2hpbGQpfWZ1bmN0aW9uIEt4KGUsdCxyLG4sbyl7aWYoZT09PW51bGwpe3ZhciBpPXIudHlwZTtyZXR1cm4gdHlwZW9mIGk9PSJmdW5jdGlvbiImJiFGZyhpKSYmaS5kZWZhdWx0UHJvcHM9PT12b2lkIDAmJnIuY29tcGFyZT09PW51bGwmJnIuZGVmYXVsdFByb3BzPT09dm9pZCAwPyh0LnRhZz0xNSx0LnR5cGU9aSxCMihlLHQsaSxuLG8pKTooZT1NcChyLnR5cGUsbnVsbCxuLHQsdC5tb2RlLG8pLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lKX1pZihpPWUuY2hpbGQsIShlLmxhbmVzJm8pKXt2YXIgbD1pLm1lbW9pemVkUHJvcHM7aWYocj1yLmNvbXBhcmUscj1yIT09bnVsbD9yOmx1LHIobCxuKSYmZS5yZWY9PT10LnJlZilyZXR1cm4gRW8oZSx0LG8pfXJldHVybiB0LmZsYWdzfD0xLGU9ZGkoaSxuKSxlLnJlZj10LnJlZixlLnJldHVybj10LHQuY2hpbGQ9ZX1mdW5jdGlvbiBCMihlLHQscixuLG8pe2lmKGUhPT1udWxsKXt2YXIgaT1lLm1lbW9pemVkUHJvcHM7aWYobHUoaSxuKSYmZS5yZWY9PT10LnJlZilpZihfcj0hMSx0LnBlbmRpbmdQcm9wcz1uPWksKGUubGFuZXMmbykhPT0wKWUuZmxhZ3MmMTMxMDcyJiYoX3I9ITApO2Vsc2UgcmV0dXJuIHQubGFuZXM9ZS5sYW5lcyxFbyhlLHQsbyl9cmV0dXJuIGpoKGUsdCxyLG4sbyl9ZnVuY3Rpb24gRjIoZSx0LHIpe3ZhciBuPXQucGVuZGluZ1Byb3BzLG89bi5jaGlsZHJlbixpPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsO2lmKG4ubW9kZT09PSJoaWRkZW4iKWlmKCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sQ2UocnMsQXIpLEFyfD1yO2Vsc2V7aWYoIShyJjEwNzM3NDE4MjQpKXJldHVybiBlPWkhPT1udWxsP2kuYmFzZUxhbmVzfHI6cix0LmxhbmVzPXQuY2hpbGRMYW5lcz0xMDczNzQxODI0LHQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmUsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sdC51cGRhdGVRdWV1ZT1udWxsLENlKHJzLEFyKSxBcnw9ZSxudWxsO3QubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sbj1pIT09bnVsbD9pLmJhc2VMYW5lczpyLENlKHJzLEFyKSxBcnw9bn1lbHNlIGkhPT1udWxsPyhuPWkuYmFzZUxhbmVzfHIsdC5tZW1vaXplZFN0YXRlPW51bGwpOm49cixDZShycyxBciksQXJ8PW47cmV0dXJuIGNyKGUsdCxvLHIpLHQuY2hpbGR9ZnVuY3Rpb24gJDIoZSx0KXt2YXIgcj10LnJlZjsoZT09PW51bGwmJnIhPT1udWxsfHxlIT09bnVsbCYmZS5yZWYhPT1yKSYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKX1mdW5jdGlvbiBqaChlLHQscixuLG8pe3ZhciBpPU5yKHIpP0ppOnRyLmN1cnJlbnQ7cmV0dXJuIGk9Y3ModCxpKSxzcyh0LG8pLHI9YmcoZSx0LHIsbixpLG8pLG49RWcoKSxlIT09bnVsbCYmIV9yPyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sRW8oZSx0LG8pKTooRGUmJm4mJmhnKHQpLHQuZmxhZ3N8PTEsY3IoZSx0LHIsbyksdC5jaGlsZCl9ZnVuY3Rpb24gWXgoZSx0LHIsbixvKXtpZihOcihyKSl7dmFyIGk9ITA7V3AodCl9ZWxzZSBpPSExO2lmKHNzKHQsbyksdC5zdGF0ZU5vZGU9PT1udWxsKWJwKGUsdCksZjIodCxyLG4pLEZoKHQscixuLG8pLG49ITA7ZWxzZSBpZihlPT09bnVsbCl7dmFyIGw9dC5zdGF0ZU5vZGUscz10Lm1lbW9pemVkUHJvcHM7bC5wcm9wcz1zO3ZhciBhPWwuY29udGV4dCx1PXIuY29udGV4dFR5cGU7dHlwZW9mIHU9PSJvYmplY3QiJiZ1IT09bnVsbD91PWZuKHUpOih1PU5yKHIpP0ppOnRyLmN1cnJlbnQsdT1jcyh0LHUpKTt2YXIgcD1yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxjPXR5cGVvZiBwPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIjtjfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uIiYmdHlwZW9mIGwuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uInx8KHMhPT1ufHxhIT09dSkmJld4KHQsbCxuLHUpLHRpPSExO3ZhciBmPXQubWVtb2l6ZWRTdGF0ZTtsLnN0YXRlPWYsR3AodCxuLGwsbyksYT10Lm1lbW9pemVkU3RhdGUscyE9PW58fGYhPT1hfHxrci5jdXJyZW50fHx0aT8odHlwZW9mIHA9PSJmdW5jdGlvbiImJihCaCh0LHIscCxuKSxhPXQubWVtb2l6ZWRTdGF0ZSksKHM9dGl8fGp4KHQscixzLG4sZixhLHUpKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uIiYmdHlwZW9mIGwuY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24ifHwodHlwZW9mIGwuY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxNb3VudCgpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpKSx0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpKToodHlwZW9mIGwuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSx0Lm1lbW9pemVkUHJvcHM9bix0Lm1lbW9pemVkU3RhdGU9YSksbC5wcm9wcz1uLGwuc3RhdGU9YSxsLmNvbnRleHQ9dSxuPXMpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLG49ITEpfWVsc2V7bD10LnN0YXRlTm9kZSxjMihlLHQpLHM9dC5tZW1vaXplZFByb3BzLHU9dC50eXBlPT09dC5lbGVtZW50VHlwZT9zOmJuKHQudHlwZSxzKSxsLnByb3BzPXUsYz10LnBlbmRpbmdQcm9wcyxmPWwuY29udGV4dCxhPXIuY29udGV4dFR5cGUsdHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbD9hPWZuKGEpOihhPU5yKHIpP0ppOnRyLmN1cnJlbnQsYT1jcyh0LGEpKTt2YXIgZD1yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczsocD10eXBlb2YgZD09ImZ1bmN0aW9uInx8dHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiIpfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uIiYmdHlwZW9mIGwuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uInx8KHMhPT1jfHxmIT09YSkmJld4KHQsbCxuLGEpLHRpPSExLGY9dC5tZW1vaXplZFN0YXRlLGwuc3RhdGU9ZixHcCh0LG4sbCxvKTt2YXIgbT10Lm1lbW9pemVkU3RhdGU7cyE9PWN8fGYhPT1tfHxrci5jdXJyZW50fHx0aT8odHlwZW9mIGQ9PSJmdW5jdGlvbiImJihCaCh0LHIsZCxuKSxtPXQubWVtb2l6ZWRTdGF0ZSksKHU9dGl8fGp4KHQscix1LG4sZixtLGEpfHwhMSk/KHB8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlIT0iZnVuY3Rpb24ifHwodHlwZW9mIGwuY29tcG9uZW50V2lsbFVwZGF0ZT09ImZ1bmN0aW9uIiYmbC5jb21wb25lbnRXaWxsVXBkYXRlKG4sbSxhKSx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZT09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuLG0sYSkpLHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZT09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9MTAyNCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJmY9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD00KSx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTEwMjQpLHQubWVtb2l6ZWRQcm9wcz1uLHQubWVtb2l6ZWRTdGF0ZT1tKSxsLnByb3BzPW4sbC5zdGF0ZT1tLGwuY29udGV4dD1hLG49dSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksbj0hMSl9cmV0dXJuIFdoKGUsdCxyLG4saSxvKX1mdW5jdGlvbiBXaChlLHQscixuLG8saSl7JDIoZSx0KTt2YXIgbD0odC5mbGFncyYxMjgpIT09MDtpZighbiYmIWwpcmV0dXJuIG8mJk94KHQsciwhMSksRW8oZSx0LGkpO249dC5zdGF0ZU5vZGUsWGIuY3VycmVudD10O3ZhciBzPWwmJnR5cGVvZiByLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciE9ImZ1bmN0aW9uIj9udWxsOm4ucmVuZGVyKCk7cmV0dXJuIHQuZmxhZ3N8PTEsZSE9PW51bGwmJmw/KHQuY2hpbGQ9ZnModCxlLmNoaWxkLG51bGwsaSksdC5jaGlsZD1mcyh0LG51bGwscyxpKSk6Y3IoZSx0LHMsaSksdC5tZW1vaXplZFN0YXRlPW4uc3RhdGUsbyYmT3godCxyLCEwKSx0LmNoaWxkfWZ1bmN0aW9uIGoyKGUpe3ZhciB0PWUuc3RhdGVOb2RlO3QucGVuZGluZ0NvbnRleHQ/RHgoZSx0LnBlbmRpbmdDb250ZXh0LHQucGVuZGluZ0NvbnRleHQhPT10LmNvbnRleHQpOnQuY29udGV4dCYmRHgoZSx0LmNvbnRleHQsITEpLFRnKGUsdC5jb250YWluZXJJbmZvKX1mdW5jdGlvbiBYeChlLHQscixuLG8pe3JldHVybiBwcygpLHlnKG8pLHQuZmxhZ3N8PTI1NixjcihlLHQscixuKSx0LmNoaWxkfXZhciBIaD17ZGVoeWRyYXRlZDpudWxsLHRyZWVDb250ZXh0Om51bGwscmV0cnlMYW5lOjB9O2Z1bmN0aW9uIFVoKGUpe3JldHVybntiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfX1mdW5jdGlvbiBXMihlLHQscil7dmFyIG49dC5wZW5kaW5nUHJvcHMsbz1CZS5jdXJyZW50LGk9ITEsbD0odC5mbGFncyYxMjgpIT09MCxzO2lmKChzPWwpfHwocz1lIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlPT09bnVsbD8hMToobyYyKSE9PTApLHM/KGk9ITAsdC5mbGFncyY9LTEyOSk6KGU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUhPT1udWxsKSYmKG98PTEpLENlKEJlLG8mMSksZT09PW51bGwpcmV0dXJuIE9oKHQpLGU9dC5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiYoZT1lLmRlaHlkcmF0ZWQsZSE9PW51bGwpPyh0Lm1vZGUmMT9lLmRhdGE9PT0iJCEiP3QubGFuZXM9ODp0LmxhbmVzPTEwNzM3NDE4MjQ6dC5sYW5lcz0xLG51bGwpOihsPW4uY2hpbGRyZW4sZT1uLmZhbGxiYWNrLGk/KG49dC5tb2RlLGk9dC5jaGlsZCxsPXttb2RlOiJoaWRkZW4iLGNoaWxkcmVuOmx9LCEobiYxKSYmaSE9PW51bGw/KGkuY2hpbGRMYW5lcz0wLGkucGVuZGluZ1Byb3BzPWwpOmk9ZmYobCxuLDAsbnVsbCksZT1aaShlLG4scixudWxsKSxpLnJldHVybj10LGUucmV0dXJuPXQsaS5zaWJsaW5nPWUsdC5jaGlsZD1pLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT1VaChyKSx0Lm1lbW9pemVkU3RhdGU9SGgsZSk6SWcodCxsKSk7aWYobz1lLm1lbW9pemVkU3RhdGUsbyE9PW51bGwmJihzPW8uZGVoeWRyYXRlZCxzIT09bnVsbCkpcmV0dXJuIFpiKGUsdCxsLG4scyxvLHIpO2lmKGkpe2k9bi5mYWxsYmFjayxsPXQubW9kZSxvPWUuY2hpbGQscz1vLnNpYmxpbmc7dmFyIGE9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bi5jaGlsZHJlbn07cmV0dXJuIShsJjEpJiZ0LmNoaWxkIT09bz8obj10LmNoaWxkLG4uY2hpbGRMYW5lcz0wLG4ucGVuZGluZ1Byb3BzPWEsdC5kZWxldGlvbnM9bnVsbCk6KG49ZGkobyxhKSxuLnN1YnRyZWVGbGFncz1vLnN1YnRyZWVGbGFncyYxNDY4MDA2NCkscyE9PW51bGw/aT1kaShzLGkpOihpPVppKGksbCxyLG51bGwpLGkuZmxhZ3N8PTIpLGkucmV0dXJuPXQsbi5yZXR1cm49dCxuLnNpYmxpbmc9aSx0LmNoaWxkPW4sbj1pLGk9dC5jaGlsZCxsPWUuY2hpbGQubWVtb2l6ZWRTdGF0ZSxsPWw9PT1udWxsP1VoKHIpOntiYXNlTGFuZXM6bC5iYXNlTGFuZXN8cixjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSxpLm1lbW9pemVkU3RhdGU9bCxpLmNoaWxkTGFuZXM9ZS5jaGlsZExhbmVzJn5yLHQubWVtb2l6ZWRTdGF0ZT1IaCxufXJldHVybiBpPWUuY2hpbGQsZT1pLnNpYmxpbmcsbj1kaShpLHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpuLmNoaWxkcmVufSksISh0Lm1vZGUmMSkmJihuLmxhbmVzPXIpLG4ucmV0dXJuPXQsbi5zaWJsaW5nPW51bGwsZSE9PW51bGwmJihyPXQuZGVsZXRpb25zLHI9PT1udWxsPyh0LmRlbGV0aW9ucz1bZV0sdC5mbGFnc3w9MTYpOnIucHVzaChlKSksdC5jaGlsZD1uLHQubWVtb2l6ZWRTdGF0ZT1udWxsLG59ZnVuY3Rpb24gSWcoZSx0KXtyZXR1cm4gdD1mZih7bW9kZToidmlzaWJsZSIsY2hpbGRyZW46dH0sZS5tb2RlLDAsbnVsbCksdC5yZXR1cm49ZSxlLmNoaWxkPXR9ZnVuY3Rpb24gdnAoZSx0LHIsbil7cmV0dXJuIG4hPT1udWxsJiZ5ZyhuKSxmcyh0LGUuY2hpbGQsbnVsbCxyKSxlPUlnKHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4pLGUuZmxhZ3N8PTIsdC5tZW1vaXplZFN0YXRlPW51bGwsZX1mdW5jdGlvbiBaYihlLHQscixuLG8saSxsKXtpZihyKXJldHVybiB0LmZsYWdzJjI1Nj8odC5mbGFncyY9LTI1NyxuPW5oKEVycm9yKEkoNDIyKSkpLHZwKGUsdCxsLG4pKTp0Lm1lbW9pemVkU3RhdGUhPT1udWxsPyh0LmNoaWxkPWUuY2hpbGQsdC5mbGFnc3w9MTI4LG51bGwpOihpPW4uZmFsbGJhY2ssbz10Lm1vZGUsbj1mZih7bW9kZToidmlzaWJsZSIsY2hpbGRyZW46bi5jaGlsZHJlbn0sbywwLG51bGwpLGk9WmkoaSxvLGwsbnVsbCksaS5mbGFnc3w9MixuLnJldHVybj10LGkucmV0dXJuPXQsbi5zaWJsaW5nPWksdC5jaGlsZD1uLHQubW9kZSYxJiZmcyh0LGUuY2hpbGQsbnVsbCxsKSx0LmNoaWxkLm1lbW9pemVkU3RhdGU9VWgobCksdC5tZW1vaXplZFN0YXRlPUhoLGkpO2lmKCEodC5tb2RlJjEpKXJldHVybiB2cChlLHQsbCxudWxsKTtpZihvLmRhdGE9PT0iJCEiKXtpZihuPW8ubmV4dFNpYmxpbmcmJm8ubmV4dFNpYmxpbmcuZGF0YXNldCxuKXZhciBzPW4uZGdzdDtyZXR1cm4gbj1zLGk9RXJyb3IoSSg0MTkpKSxuPW5oKGksbix2b2lkIDApLHZwKGUsdCxsLG4pfWlmKHM9KGwmZS5jaGlsZExhbmVzKSE9PTAsX3J8fHMpe2lmKG49RXQsbiE9PW51bGwpe3N3aXRjaChsJi1sKXtjYXNlIDQ6bz0yO2JyZWFrO2Nhc2UgMTY6bz04O2JyZWFrO2Nhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpvPTMyO2JyZWFrO2Nhc2UgNTM2ODcwOTEyOm89MjY4NDM1NDU2O2JyZWFrO2RlZmF1bHQ6bz0wfW89byYobi5zdXNwZW5kZWRMYW5lc3xsKT8wOm8sbyE9PTAmJm8hPT1pLnJldHJ5TGFuZSYmKGkucmV0cnlMYW5lPW8sYm8oZSxvKSxJbihuLGUsbywtMSkpfXJldHVybiBCZygpLG49bmgoRXJyb3IoSSg0MjEpKSksdnAoZSx0LGwsbil9cmV0dXJuIG8uZGF0YT09PSIkPyI/KHQuZmxhZ3N8PTEyOCx0LmNoaWxkPWUuY2hpbGQsdD1wNi5iaW5kKG51bGwsZSksby5fcmVhY3RSZXRyeT10LG51bGwpOihlPWkudHJlZUNvbnRleHQsRHI9dWkoby5uZXh0U2libGluZyksT3I9dCxEZT0hMCxQbj1udWxsLGUhPT1udWxsJiYoYW5bdW4rK109Q28sYW5bdW4rK109VG8sYW5bdW4rK109ZWwsQ289ZS5pZCxUbz1lLm92ZXJmbG93LGVsPXQpLHQ9SWcodCxuLmNoaWxkcmVuKSx0LmZsYWdzfD00MDk2LHQpfWZ1bmN0aW9uIFp4KGUsdCxyKXtlLmxhbmVzfD10O3ZhciBuPWUuYWx0ZXJuYXRlO24hPT1udWxsJiYobi5sYW5lc3w9dCksemgoZS5yZXR1cm4sdCxyKX1mdW5jdGlvbiBvaChlLHQscixuLG8pe3ZhciBpPWUubWVtb2l6ZWRTdGF0ZTtpPT09bnVsbD9lLm1lbW9pemVkU3RhdGU9e2lzQmFja3dhcmRzOnQscmVuZGVyaW5nOm51bGwscmVuZGVyaW5nU3RhcnRUaW1lOjAsbGFzdDpuLHRhaWw6cix0YWlsTW9kZTpvfTooaS5pc0JhY2t3YXJkcz10LGkucmVuZGVyaW5nPW51bGwsaS5yZW5kZXJpbmdTdGFydFRpbWU9MCxpLmxhc3Q9bixpLnRhaWw9cixpLnRhaWxNb2RlPW8pfWZ1bmN0aW9uIEgyKGUsdCxyKXt2YXIgbj10LnBlbmRpbmdQcm9wcyxvPW4ucmV2ZWFsT3JkZXIsaT1uLnRhaWw7aWYoY3IoZSx0LG4uY2hpbGRyZW4sciksbj1CZS5jdXJyZW50LG4mMiluPW4mMXwyLHQuZmxhZ3N8PTEyODtlbHNle2lmKGUhPT1udWxsJiZlLmZsYWdzJjEyOCllOmZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihlLnRhZz09PTEzKWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJlp4KGUscix0KTtlbHNlIGlmKGUudGFnPT09MTkpWngoZSxyLHQpO2Vsc2UgaWYoZS5jaGlsZCE9PW51bGwpe2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkO2NvbnRpbnVlfWlmKGU9PT10KWJyZWFrIGU7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHxlLnJldHVybj09PXQpYnJlYWsgZTtlPWUucmV0dXJufWUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmd9biY9MX1pZihDZShCZSxuKSwhKHQubW9kZSYxKSl0Lm1lbW9pemVkU3RhdGU9bnVsbDtlbHNlIHN3aXRjaChvKXtjYXNlImZvcndhcmRzIjpmb3Iocj10LmNoaWxkLG89bnVsbDtyIT09bnVsbDspZT1yLmFsdGVybmF0ZSxlIT09bnVsbCYmcXAoZSk9PT1udWxsJiYobz1yKSxyPXIuc2libGluZztyPW8scj09PW51bGw/KG89dC5jaGlsZCx0LmNoaWxkPW51bGwpOihvPXIuc2libGluZyxyLnNpYmxpbmc9bnVsbCksb2godCwhMSxvLHIsaSk7YnJlYWs7Y2FzZSJiYWNrd2FyZHMiOmZvcihyPW51bGwsbz10LmNoaWxkLHQuY2hpbGQ9bnVsbDtvIT09bnVsbDspe2lmKGU9by5hbHRlcm5hdGUsZSE9PW51bGwmJnFwKGUpPT09bnVsbCl7dC5jaGlsZD1vO2JyZWFrfWU9by5zaWJsaW5nLG8uc2libGluZz1yLHI9byxvPWV9b2godCwhMCxyLG51bGwsaSk7YnJlYWs7Y2FzZSJ0b2dldGhlciI6b2godCwhMSxudWxsLG51bGwsdm9pZCAwKTticmVhaztkZWZhdWx0OnQubWVtb2l6ZWRTdGF0ZT1udWxsfXJldHVybiB0LmNoaWxkfWZ1bmN0aW9uIGJwKGUsdCl7ISh0Lm1vZGUmMSkmJmUhPT1udWxsJiYoZS5hbHRlcm5hdGU9bnVsbCx0LmFsdGVybmF0ZT1udWxsLHQuZmxhZ3N8PTIpfWZ1bmN0aW9uIEVvKGUsdCxyKXtpZihlIT09bnVsbCYmKHQuZGVwZW5kZW5jaWVzPWUuZGVwZW5kZW5jaWVzKSxybHw9dC5sYW5lcywhKHImdC5jaGlsZExhbmVzKSlyZXR1cm4gbnVsbDtpZihlIT09bnVsbCYmdC5jaGlsZCE9PWUuY2hpbGQpdGhyb3cgRXJyb3IoSSgxNTMpKTtpZih0LmNoaWxkIT09bnVsbCl7Zm9yKGU9dC5jaGlsZCxyPWRpKGUsZS5wZW5kaW5nUHJvcHMpLHQuY2hpbGQ9cixyLnJldHVybj10O2Uuc2libGluZyE9PW51bGw7KWU9ZS5zaWJsaW5nLHI9ci5zaWJsaW5nPWRpKGUsZS5wZW5kaW5nUHJvcHMpLHIucmV0dXJuPXQ7ci5zaWJsaW5nPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gSmIoZSx0LHIpe3N3aXRjaCh0LnRhZyl7Y2FzZSAzOmoyKHQpLHBzKCk7YnJlYWs7Y2FzZSA1OmgyKHQpO2JyZWFrO2Nhc2UgMTpOcih0LnR5cGUpJiZXcCh0KTticmVhaztjYXNlIDQ6VGcodCx0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOnZhciBuPXQudHlwZS5fY29udGV4dCxvPXQubWVtb2l6ZWRQcm9wcy52YWx1ZTtDZShWcCxuLl9jdXJyZW50VmFsdWUpLG4uX2N1cnJlbnRWYWx1ZT1vO2JyZWFrO2Nhc2UgMTM6aWYobj10Lm1lbW9pemVkU3RhdGUsbiE9PW51bGwpcmV0dXJuIG4uZGVoeWRyYXRlZCE9PW51bGw/KENlKEJlLEJlLmN1cnJlbnQmMSksdC5mbGFnc3w9MTI4LG51bGwpOnImdC5jaGlsZC5jaGlsZExhbmVzP1cyKGUsdCxyKTooQ2UoQmUsQmUuY3VycmVudCYxKSxlPUVvKGUsdCxyKSxlIT09bnVsbD9lLnNpYmxpbmc6bnVsbCk7Q2UoQmUsQmUuY3VycmVudCYxKTticmVhaztjYXNlIDE5OmlmKG49KHImdC5jaGlsZExhbmVzKSE9PTAsZS5mbGFncyYxMjgpe2lmKG4pcmV0dXJuIEgyKGUsdCxyKTt0LmZsYWdzfD0xMjh9aWYobz10Lm1lbW9pemVkU3RhdGUsbyE9PW51bGwmJihvLnJlbmRlcmluZz1udWxsLG8udGFpbD1udWxsLG8ubGFzdEVmZmVjdD1udWxsKSxDZShCZSxCZS5jdXJyZW50KSxuKWJyZWFrO3JldHVybiBudWxsO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gdC5sYW5lcz0wLEYyKGUsdCxyKX1yZXR1cm4gRW8oZSx0LHIpfXZhciBVMixWaCxWMixSMjtVMj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj10LmNoaWxkO3IhPT1udWxsOyl7aWYoci50YWc9PT01fHxyLnRhZz09PTYpZS5hcHBlbmRDaGlsZChyLnN0YXRlTm9kZSk7ZWxzZSBpZihyLnRhZyE9PTQmJnIuY2hpbGQhPT1udWxsKXtyLmNoaWxkLnJldHVybj1yLHI9ci5jaGlsZDtjb250aW51ZX1pZihyPT09dClicmVhaztmb3IoO3Iuc2libGluZz09PW51bGw7KXtpZihyLnJldHVybj09PW51bGx8fHIucmV0dXJuPT09dClyZXR1cm47cj1yLnJldHVybn1yLnNpYmxpbmcucmV0dXJuPXIucmV0dXJuLHI9ci5zaWJsaW5nfX07Vmg9ZnVuY3Rpb24oKXt9O1YyPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBvPWUubWVtb2l6ZWRQcm9wcztpZihvIT09bil7ZT10LnN0YXRlTm9kZSxZaShRbi5jdXJyZW50KTt2YXIgaT1udWxsO3N3aXRjaChyKXtjYXNlImlucHV0IjpvPWZoKGUsbyksbj1maChlLG4pLGk9W107YnJlYWs7Y2FzZSJzZWxlY3QiOm89JGUoe30sbyx7dmFsdWU6dm9pZCAwfSksbj0kZSh7fSxuLHt2YWx1ZTp2b2lkIDB9KSxpPVtdO2JyZWFrO2Nhc2UidGV4dGFyZWEiOm89aGgoZSxvKSxuPWhoKGUsbiksaT1bXTticmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2shPSJmdW5jdGlvbiImJnR5cGVvZiBuLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihlLm9uY2xpY2s9JHApfXloKHIsbik7dmFyIGw7cj1udWxsO2Zvcih1IGluIG8paWYoIW4uaGFzT3duUHJvcGVydHkodSkmJm8uaGFzT3duUHJvcGVydHkodSkmJm9bdV0hPW51bGwpaWYodT09PSJzdHlsZSIpe3ZhciBzPW9bdV07Zm9yKGwgaW4gcylzLmhhc093blByb3BlcnR5KGwpJiYocnx8KHI9e30pLHJbbF09IiIpfWVsc2UgdSE9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCImJnUhPT0iY2hpbGRyZW4iJiZ1IT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJnUhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmdSE9PSJhdXRvRm9jdXMiJiYoSmEuaGFzT3duUHJvcGVydHkodSk/aXx8KGk9W10pOihpPWl8fFtdKS5wdXNoKHUsbnVsbCkpO2Zvcih1IGluIG4pe3ZhciBhPW5bdV07aWYocz1vPy5bdV0sbi5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwocnx8KHI9e30pLHJbbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihyfHwocj17fSkscltsXT1hW2xdKX1lbHNlIHJ8fChpfHwoaT1bXSksaS5wdXNoKHUscikpLHI9YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihpPWl8fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwoaT1pfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoSmEuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZFZSgic2Nyb2xsIixlKSxpfHxzPT09YXx8KGk9W10pKTooaT1pfHxbXSkucHVzaCh1LGEpKX1yJiYoaT1pfHxbXSkucHVzaCgic3R5bGUiLHIpO3ZhciB1PWk7KHQudXBkYXRlUXVldWU9dSkmJih0LmZsYWdzfD00KX19O1IyPWZ1bmN0aW9uKGUsdCxyLG4pe3IhPT1uJiYodC5mbGFnc3w9NCl9O2Z1bmN0aW9uIEJhKGUsdCl7aWYoIURlKXN3aXRjaChlLnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6dD1lLnRhaWw7Zm9yKHZhciByPW51bGw7dCE9PW51bGw7KXQuYWx0ZXJuYXRlIT09bnVsbCYmKHI9dCksdD10LnNpYmxpbmc7cj09PW51bGw/ZS50YWlsPW51bGw6ci5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOnI9ZS50YWlsO2Zvcih2YXIgbj1udWxsO3IhPT1udWxsOylyLmFsdGVybmF0ZSE9PW51bGwmJihuPXIpLHI9ci5zaWJsaW5nO249PT1udWxsP3R8fGUudGFpbD09PW51bGw/ZS50YWlsPW51bGw6ZS50YWlsLnNpYmxpbmc9bnVsbDpuLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gSnQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGUhPT1udWxsJiZlLmFsdGVybmF0ZS5jaGlsZD09PWUuY2hpbGQscj0wLG49MDtpZih0KWZvcih2YXIgbz1lLmNoaWxkO28hPT1udWxsOylyfD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxufD1vLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxufD1vLmZsYWdzJjE0NjgwMDY0LG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7ZWxzZSBmb3Iobz1lLmNoaWxkO28hPT1udWxsOylyfD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxufD1vLnN1YnRyZWVGbGFncyxufD1vLmZsYWdzLG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7cmV0dXJuIGUuc3VidHJlZUZsYWdzfD1uLGUuY2hpbGRMYW5lcz1yLHR9ZnVuY3Rpb24gZTYoZSx0LHIpe3ZhciBuPXQucGVuZGluZ1Byb3BzO3N3aXRjaChnZyh0KSx0LnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIEp0KHQpLG51bGw7Y2FzZSAxOnJldHVybiBOcih0LnR5cGUpJiZqcCgpLEp0KHQpLG51bGw7Y2FzZSAzOnJldHVybiBuPXQuc3RhdGVOb2RlLGRzKCksUGUoa3IpLFBlKHRyKSxrZygpLG4ucGVuZGluZ0NvbnRleHQmJihuLmNvbnRleHQ9bi5wZW5kaW5nQ29udGV4dCxuLnBlbmRpbmdDb250ZXh0PW51bGwpLChlPT09bnVsbHx8ZS5jaGlsZD09PW51bGwpJiYoZ3AodCk/dC5mbGFnc3w9NDplPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmISh0LmZsYWdzJjI1Nil8fCh0LmZsYWdzfD0xMDI0LFBuIT09bnVsbCYmKFpoKFBuKSxQbj1udWxsKSkpLFZoKGUsdCksSnQodCksbnVsbDtjYXNlIDU6X2codCk7dmFyIG89WWkocHUuY3VycmVudCk7aWYocj10LnR5cGUsZSE9PW51bGwmJnQuc3RhdGVOb2RlIT1udWxsKVYyKGUsdCxyLG4sbyksZS5yZWYhPT10LnJlZiYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFuKXtpZih0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoSSgxNjYpKTtyZXR1cm4gSnQodCksbnVsbH1pZihlPVlpKFFuLmN1cnJlbnQpLGdwKHQpKXtuPXQuc3RhdGVOb2RlLHI9dC50eXBlO3ZhciBpPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2gobltHbl09dCxuW3V1XT1pLGU9KHQubW9kZSYxKSE9PTAscil7Y2FzZSJkaWFsb2ciOkVlKCJjYW5jZWwiLG4pLEVlKCJjbG9zZSIsbik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpFZSgibG9hZCIsbik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPFVhLmxlbmd0aDtvKyspRWUoVWFbb10sbik7YnJlYWs7Y2FzZSJzb3VyY2UiOkVlKCJlcnJvciIsbik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6RWUoImVycm9yIixuKSxFZSgibG9hZCIsbik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpFZSgidG9nZ2xlIixuKTticmVhaztjYXNlImlucHV0IjpseChuLGkpLEVlKCJpbnZhbGlkIixuKTticmVhaztjYXNlInNlbGVjdCI6bi5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWkubXVsdGlwbGV9LEVlKCJpbnZhbGlkIixuKTticmVhaztjYXNlInRleHRhcmVhIjpheChuLGkpLEVlKCJpbnZhbGlkIixuKX15aChyLGkpLG89bnVsbDtmb3IodmFyIGwgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1pW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9uLnRleHRDb250ZW50IT09cyYmKGkuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJmhwKG4udGV4dENvbnRlbnQscyxlKSxvPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJm4udGV4dENvbnRlbnQhPT0iIitzJiYoaS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmaHAobi50ZXh0Q29udGVudCxzLGUpLG89WyJjaGlsZHJlbiIsIiIrc10pOkphLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmRWUoInNjcm9sbCIsbil9c3dpdGNoKHIpe2Nhc2UiaW5wdXQiOm5wKG4pLHN4KG4saSwhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bnAobiksdXgobik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBpLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihuLm9uY2xpY2s9JHApfW49byx0LnVwZGF0ZVF1ZXVlPW4sbiE9PW51bGwmJih0LmZsYWdzfD00KX1lbHNle2w9by5ub2RlVHlwZT09PTk/bzpvLm93bmVyRG9jdW1lbnQsZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKGU9dncocikpLGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/cj09PSJzY3JpcHQiPyhlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsZT1lLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCkpOnR5cGVvZiBuLmlzPT0ic3RyaW5nIj9lPWwuY3JlYXRlRWxlbWVudChyLHtpczpuLmlzfSk6KGU9bC5jcmVhdGVFbGVtZW50KHIpLHI9PT0ic2VsZWN0IiYmKGw9ZSxuLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6bi5zaXplJiYobC5zaXplPW4uc2l6ZSkpKTplPWwuY3JlYXRlRWxlbWVudE5TKGUsciksZVtHbl09dCxlW3V1XT1uLFUyKGUsdCwhMSwhMSksdC5zdGF0ZU5vZGU9ZTtlOntzd2l0Y2gobD12aChyLG4pLHIpe2Nhc2UiZGlhbG9nIjpFZSgiY2FuY2VsIixlKSxFZSgiY2xvc2UiLGUpLG89bjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOkVlKCJsb2FkIixlKSxvPW47YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPFVhLmxlbmd0aDtvKyspRWUoVWFbb10sZSk7bz1uO2JyZWFrO2Nhc2Uic291cmNlIjpFZSgiZXJyb3IiLGUpLG89bjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpFZSgiZXJyb3IiLGUpLEVlKCJsb2FkIixlKSxvPW47YnJlYWs7Y2FzZSJkZXRhaWxzIjpFZSgidG9nZ2xlIixlKSxvPW47YnJlYWs7Y2FzZSJpbnB1dCI6bHgoZSxuKSxvPWZoKGUsbiksRWUoImludmFsaWQiLGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpvPW47YnJlYWs7Y2FzZSJzZWxlY3QiOmUuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFuLm11bHRpcGxlfSxvPSRlKHt9LG4se3ZhbHVlOnZvaWQgMH0pLEVlKCJpbnZhbGlkIixlKTticmVhaztjYXNlInRleHRhcmVhIjpheChlLG4pLG89aGgoZSxuKSxFZSgiaW52YWxpZCIsZSk7YnJlYWs7ZGVmYXVsdDpvPW59eWgocixvKSxzPW87Zm9yKGkgaW4gcylpZihzLmhhc093blByb3BlcnR5KGkpKXt2YXIgYT1zW2ldO2k9PT0ic3R5bGUiP1N3KGUsYSk6aT09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmeHcoZSxhKSk6aT09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhyIT09InRleHRhcmVhInx8YSE9PSIiKSYmZXUoZSxhKTp0eXBlb2YgYT09Im51bWJlciImJmV1KGUsIiIrYSk6aSE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZpIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJmkhPT0iYXV0b0ZvY3VzIiYmKEphLmhhc093blByb3BlcnR5KGkpP2EhPW51bGwmJmk9PT0ib25TY3JvbGwiJiZFZSgic2Nyb2xsIixlKTphIT1udWxsJiZ0ZyhlLGksYSxsKSl9c3dpdGNoKHIpe2Nhc2UiaW5wdXQiOm5wKGUpLHN4KGUsbiwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bnAoZSksdXgoZSk7YnJlYWs7Y2FzZSJvcHRpb24iOm4udmFsdWUhPW51bGwmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrbWkobi52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLm11bHRpcGxlPSEhbi5tdWx0aXBsZSxpPW4udmFsdWUsaSE9bnVsbD9ucyhlLCEhbi5tdWx0aXBsZSxpLCExKTpuLmRlZmF1bHRWYWx1ZSE9bnVsbCYmbnMoZSwhIW4ubXVsdGlwbGUsbi5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz0kcCl9c3dpdGNoKHIpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6bj0hIW4uYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOm49ITA7YnJlYWsgZTtkZWZhdWx0Om49ITF9fW4mJih0LmZsYWdzfD00KX10LnJlZiE9PW51bGwmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIEp0KHQpLG51bGw7Y2FzZSA2OmlmKGUmJnQuc3RhdGVOb2RlIT1udWxsKVIyKGUsdCxlLm1lbW9pemVkUHJvcHMsbik7ZWxzZXtpZih0eXBlb2YgbiE9InN0cmluZyImJnQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihJKDE2NikpO2lmKHI9WWkocHUuY3VycmVudCksWWkoUW4uY3VycmVudCksZ3AodCkpe2lmKG49dC5zdGF0ZU5vZGUscj10Lm1lbW9pemVkUHJvcHMsbltHbl09dCwoaT1uLm5vZGVWYWx1ZSE9PXIpJiYoZT1PcixlIT09bnVsbCkpc3dpdGNoKGUudGFnKXtjYXNlIDM6aHAobi5ub2RlVmFsdWUsciwoZS5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OmUubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmaHAobi5ub2RlVmFsdWUsciwoZS5tb2RlJjEpIT09MCl9aSYmKHQuZmxhZ3N8PTQpfWVsc2Ugbj0oci5ub2RlVHlwZT09PTk/cjpyLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKG4pLG5bR25dPXQsdC5zdGF0ZU5vZGU9bn1yZXR1cm4gSnQodCksbnVsbDtjYXNlIDEzOmlmKFBlKEJlKSxuPXQubWVtb2l6ZWRTdGF0ZSxlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihEZSYmRHIhPT1udWxsJiZ0Lm1vZGUmMSYmISh0LmZsYWdzJjEyOCkpYTIoKSxwcygpLHQuZmxhZ3N8PTk4NTYwLGk9ITE7ZWxzZSBpZihpPWdwKHQpLG4hPT1udWxsJiZuLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihlPT09bnVsbCl7aWYoIWkpdGhyb3cgRXJyb3IoSSgzMTgpKTtpZihpPXQubWVtb2l6ZWRTdGF0ZSxpPWkhPT1udWxsP2kuZGVoeWRyYXRlZDpudWxsLCFpKXRocm93IEVycm9yKEkoMzE3KSk7aVtHbl09dH1lbHNlIHBzKCksISh0LmZsYWdzJjEyOCkmJih0Lm1lbW9pemVkU3RhdGU9bnVsbCksdC5mbGFnc3w9NDtKdCh0KSxpPSExfWVsc2UgUG4hPT1udWxsJiYoWmgoUG4pLFBuPW51bGwpLGk9ITA7aWYoIWkpcmV0dXJuIHQuZmxhZ3MmNjU1MzY/dDpudWxsfXJldHVybiB0LmZsYWdzJjEyOD8odC5sYW5lcz1yLHQpOihuPW4hPT1udWxsLG4hPT0oZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZuJiYodC5jaGlsZC5mbGFnc3w9ODE5Mix0Lm1vZGUmMSYmKGU9PT1udWxsfHxCZS5jdXJyZW50JjE/dnQ9PT0wJiYodnQ9Myk6QmcoKSkpLHQudXBkYXRlUXVldWUhPT1udWxsJiYodC5mbGFnc3w9NCksSnQodCksbnVsbCk7Y2FzZSA0OnJldHVybiBkcygpLFZoKGUsdCksZT09PW51bGwmJnN1KHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLEp0KHQpLG51bGw7Y2FzZSAxMDpyZXR1cm4gd2codC50eXBlLl9jb250ZXh0KSxKdCh0KSxudWxsO2Nhc2UgMTc6cmV0dXJuIE5yKHQudHlwZSkmJmpwKCksSnQodCksbnVsbDtjYXNlIDE5OmlmKFBlKEJlKSxpPXQubWVtb2l6ZWRTdGF0ZSxpPT09bnVsbClyZXR1cm4gSnQodCksbnVsbDtpZihuPSh0LmZsYWdzJjEyOCkhPT0wLGw9aS5yZW5kZXJpbmcsbD09PW51bGwpaWYobilCYShpLCExKTtlbHNle2lmKHZ0IT09MHx8ZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihsPXFwKGUpLGwhPT1udWxsKXtmb3IodC5mbGFnc3w9MTI4LEJhKGksITEpLG49bC51cGRhdGVRdWV1ZSxuIT09bnVsbCYmKHQudXBkYXRlUXVldWU9bix0LmZsYWdzfD00KSx0LnN1YnRyZWVGbGFncz0wLG49cixyPXQuY2hpbGQ7ciE9PW51bGw7KWk9cixlPW4saS5mbGFncyY9MTQ2ODAwNjYsbD1pLmFsdGVybmF0ZSxsPT09bnVsbD8oaS5jaGlsZExhbmVzPTAsaS5sYW5lcz1lLGkuY2hpbGQ9bnVsbCxpLnN1YnRyZWVGbGFncz0wLGkubWVtb2l6ZWRQcm9wcz1udWxsLGkubWVtb2l6ZWRTdGF0ZT1udWxsLGkudXBkYXRlUXVldWU9bnVsbCxpLmRlcGVuZGVuY2llcz1udWxsLGkuc3RhdGVOb2RlPW51bGwpOihpLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLGkubGFuZXM9bC5sYW5lcyxpLmNoaWxkPWwuY2hpbGQsaS5zdWJ0cmVlRmxhZ3M9MCxpLmRlbGV0aW9ucz1udWxsLGkubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsaS5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxpLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsaS50eXBlPWwudHlwZSxlPWwuZGVwZW5kZW5jaWVzLGkuZGVwZW5kZW5jaWVzPWU9PT1udWxsP251bGw6e2xhbmVzOmUubGFuZXMsZmlyc3RDb250ZXh0OmUuZmlyc3RDb250ZXh0fSkscj1yLnNpYmxpbmc7cmV0dXJuIENlKEJlLEJlLmN1cnJlbnQmMXwyKSx0LmNoaWxkfWU9ZS5zaWJsaW5nfWkudGFpbCE9PW51bGwmJlplKCk+aHMmJih0LmZsYWdzfD0xMjgsbj0hMCxCYShpLCExKSx0LmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIW4paWYoZT1xcChsKSxlIT09bnVsbCl7aWYodC5mbGFnc3w9MTI4LG49ITAscj1lLnVwZGF0ZVF1ZXVlLHIhPT1udWxsJiYodC51cGRhdGVRdWV1ZT1yLHQuZmxhZ3N8PTQpLEJhKGksITApLGkudGFpbD09PW51bGwmJmkudGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhRGUpcmV0dXJuIEp0KHQpLG51bGx9ZWxzZSAyKlplKCktaS5yZW5kZXJpbmdTdGFydFRpbWU+aHMmJnIhPT0xMDczNzQxODI0JiYodC5mbGFnc3w9MTI4LG49ITAsQmEoaSwhMSksdC5sYW5lcz00MTk0MzA0KTtpLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9dC5jaGlsZCx0LmNoaWxkPWwpOihyPWkubGFzdCxyIT09bnVsbD9yLnNpYmxpbmc9bDp0LmNoaWxkPWwsaS5sYXN0PWwpfXJldHVybiBpLnRhaWwhPT1udWxsPyh0PWkudGFpbCxpLnJlbmRlcmluZz10LGkudGFpbD10LnNpYmxpbmcsaS5yZW5kZXJpbmdTdGFydFRpbWU9WmUoKSx0LnNpYmxpbmc9bnVsbCxyPUJlLmN1cnJlbnQsQ2UoQmUsbj9yJjF8MjpyJjEpLHQpOihKdCh0KSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHpnKCksbj10Lm1lbW9pemVkU3RhdGUhPT1udWxsLGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsIT09biYmKHQuZmxhZ3N8PTgxOTIpLG4mJnQubW9kZSYxP0FyJjEwNzM3NDE4MjQmJihKdCh0KSx0LnN1YnRyZWVGbGFncyY2JiYodC5mbGFnc3w9ODE5MikpOkp0KHQpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKEkoMTU2LHQudGFnKSl9ZnVuY3Rpb24gdDYoZSx0KXtzd2l0Y2goZ2codCksdC50YWcpe2Nhc2UgMTpyZXR1cm4gTnIodC50eXBlKSYmanAoKSxlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDM6cmV0dXJuIGRzKCksUGUoa3IpLFBlKHRyKSxrZygpLGU9dC5mbGFncyxlJjY1NTM2JiYhKGUmMTI4KT8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDU6cmV0dXJuIF9nKHQpLG51bGw7Y2FzZSAxMzppZihQZShCZSksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKHQuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihJKDM0MCkpO3BzKCl9cmV0dXJuIGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMTk6cmV0dXJuIFBlKEJlKSxudWxsO2Nhc2UgNDpyZXR1cm4gZHMoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIHdnKHQudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHpnKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciB4cD0hMSxlcj0hMSxyNj10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCwkPW51bGw7ZnVuY3Rpb24gdHMoZSx0KXt2YXIgcj1lLnJlZjtpZihyIT09bnVsbClpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil0cnl7cihudWxsKX1jYXRjaChuKXtVZShlLHQsbil9ZWxzZSByLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBSaChlLHQscil7dHJ5e3IoKX1jYXRjaChuKXtVZShlLHQsbil9fXZhciBKeD0hMTtmdW5jdGlvbiBuNihlLHQpe2lmKEVoPXpwLGU9S3coKSxtZyhlKSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUpdmFyIHI9e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGU6e3I9KHI9ZS5vd25lckRvY3VtZW50KSYmci5kZWZhdWx0Vmlld3x8d2luZG93O3ZhciBuPXIuZ2V0U2VsZWN0aW9uJiZyLmdldFNlbGVjdGlvbigpO2lmKG4mJm4ucmFuZ2VDb3VudCE9PTApe3I9bi5hbmNob3JOb2RlO3ZhciBvPW4uYW5jaG9yT2Zmc2V0LGk9bi5mb2N1c05vZGU7bj1uLmZvY3VzT2Zmc2V0O3RyeXtyLm5vZGVUeXBlLGkubm9kZVR5cGV9Y2F0Y2h7cj1udWxsO2JyZWFrIGV9dmFyIGw9MCxzPS0xLGE9LTEsdT0wLHA9MCxjPWUsZj1udWxsO3Q6Zm9yKDs7KXtmb3IodmFyIGQ7YyE9PXJ8fG8hPT0wJiZjLm5vZGVUeXBlIT09M3x8KHM9bCtvKSxjIT09aXx8biE9PTAmJmMubm9kZVR5cGUhPT0zfHwoYT1sK24pLGMubm9kZVR5cGU9PT0zJiYobCs9Yy5ub2RlVmFsdWUubGVuZ3RoKSwoZD1jLmZpcnN0Q2hpbGQpIT09bnVsbDspZj1jLGM9ZDtmb3IoOzspe2lmKGM9PT1lKWJyZWFrIHQ7aWYoZj09PXImJisrdT09PW8mJihzPWwpLGY9PT1pJiYrK3A9PT1uJiYoYT1sKSwoZD1jLm5leHRTaWJsaW5nKSE9PW51bGwpYnJlYWs7Yz1mLGY9Yy5wYXJlbnROb2RlfWM9ZH1yPXM9PT0tMXx8YT09PS0xP251bGw6e3N0YXJ0OnMsZW5kOmF9fWVsc2Ugcj1udWxsfXI9cnx8e3N0YXJ0OjAsZW5kOjB9fWVsc2Ugcj1udWxsO2ZvcihQaD17Zm9jdXNlZEVsZW06ZSxzZWxlY3Rpb25SYW5nZTpyfSx6cD0hMSwkPXQ7JCE9PW51bGw7KWlmKHQ9JCxlPXQuY2hpbGQsKHQuc3VidHJlZUZsYWdzJjEwMjgpIT09MCYmZSE9PW51bGwpZS5yZXR1cm49dCwkPWU7ZWxzZSBmb3IoOyQhPT1udWxsOyl7dD0kO3RyeXt2YXIgbT10LmFsdGVybmF0ZTtpZih0LmZsYWdzJjEwMjQpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmJyZWFrO2Nhc2UgMTppZihtIT09bnVsbCl7dmFyIGg9bS5tZW1vaXplZFByb3BzLFM9bS5tZW1vaXplZFN0YXRlLHk9dC5zdGF0ZU5vZGUsdj15LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKHQuZWxlbWVudFR5cGU9PT10LnR5cGU/aDpibih0LnR5cGUsaCksUyk7eS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT12fWJyZWFrO2Nhc2UgMzp2YXIgZz10LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2cubm9kZVR5cGU9PT0xP2cudGV4dENvbnRlbnQ9IiI6Zy5ub2RlVHlwZT09PTkmJmcuZG9jdW1lbnRFbGVtZW50JiZnLnJlbW92ZUNoaWxkKGcuZG9jdW1lbnRFbGVtZW50KTticmVhaztjYXNlIDU6Y2FzZSA2OmNhc2UgNDpjYXNlIDE3OmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoSSgxNjMpKX19Y2F0Y2goQyl7VWUodCx0LnJldHVybixDKX1pZihlPXQuc2libGluZyxlIT09bnVsbCl7ZS5yZXR1cm49dC5yZXR1cm4sJD1lO2JyZWFrfSQ9dC5yZXR1cm59cmV0dXJuIG09SngsSng9ITEsbX1mdW5jdGlvbiBZYShlLHQscil7dmFyIG49dC51cGRhdGVRdWV1ZTtpZihuPW4hPT1udWxsP24ubGFzdEVmZmVjdDpudWxsLG4hPT1udWxsKXt2YXIgbz1uPW4ubmV4dDtkb3tpZigoby50YWcmZSk9PT1lKXt2YXIgaT1vLmRlc3Ryb3k7by5kZXN0cm95PXZvaWQgMCxpIT09dm9pZCAwJiZSaCh0LHIsaSl9bz1vLm5leHR9d2hpbGUobyE9PW4pfX1mdW5jdGlvbiBjZihlLHQpe2lmKHQ9dC51cGRhdGVRdWV1ZSx0PXQhPT1udWxsP3QubGFzdEVmZmVjdDpudWxsLHQhPT1udWxsKXt2YXIgcj10PXQubmV4dDtkb3tpZigoci50YWcmZSk9PT1lKXt2YXIgbj1yLmNyZWF0ZTtyLmRlc3Ryb3k9bigpfXI9ci5uZXh0fXdoaWxlKHIhPT10KX19ZnVuY3Rpb24gR2goZSl7dmFyIHQ9ZS5yZWY7aWYodCE9PW51bGwpe3ZhciByPWUuc3RhdGVOb2RlO3N3aXRjaChlLnRhZyl7Y2FzZSA1OmU9cjticmVhaztkZWZhdWx0OmU9cn10eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQuY3VycmVudD1lfX1mdW5jdGlvbiBHMihlKXt2YXIgdD1lLmFsdGVybmF0ZTt0IT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwsRzIodCkpLGUuY2hpbGQ9bnVsbCxlLmRlbGV0aW9ucz1udWxsLGUuc2libGluZz1udWxsLGUudGFnPT09NSYmKHQ9ZS5zdGF0ZU5vZGUsdCE9PW51bGwmJihkZWxldGUgdFtHbl0sZGVsZXRlIHRbdXVdLGRlbGV0ZSB0W0xoXSxkZWxldGUgdFskYl0sZGVsZXRlIHRbamJdKSksZS5zdGF0ZU5vZGU9bnVsbCxlLnJldHVybj1udWxsLGUuZGVwZW5kZW5jaWVzPW51bGwsZS5tZW1vaXplZFByb3BzPW51bGwsZS5tZW1vaXplZFN0YXRlPW51bGwsZS5wZW5kaW5nUHJvcHM9bnVsbCxlLnN0YXRlTm9kZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBxMihlKXtyZXR1cm4gZS50YWc9PT01fHxlLnRhZz09PTN8fGUudGFnPT09NH1mdW5jdGlvbiBldyhlKXtlOmZvcig7Oyl7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHxxMihlLnJldHVybikpcmV0dXJuIG51bGw7ZT1lLnJldHVybn1mb3IoZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZztlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xODspe2lmKGUuZmxhZ3MmMnx8ZS5jaGlsZD09PW51bGx8fGUudGFnPT09NCljb250aW51ZSBlO2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkfWlmKCEoZS5mbGFncyYyKSlyZXR1cm4gZS5zdGF0ZU5vZGV9fWZ1bmN0aW9uIHFoKGUsdCxyKXt2YXIgbj1lLnRhZztpZihuPT09NXx8bj09PTYpZT1lLnN0YXRlTm9kZSx0P3Iubm9kZVR5cGU9PT04P3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0KTpyLmluc2VydEJlZm9yZShlLHQpOihyLm5vZGVUeXBlPT09OD8odD1yLnBhcmVudE5vZGUsdC5pbnNlcnRCZWZvcmUoZSxyKSk6KHQ9cix0LmFwcGVuZENoaWxkKGUpKSxyPXIuX3JlYWN0Um9vdENvbnRhaW5lcixyIT1udWxsfHx0Lm9uY2xpY2shPT1udWxsfHwodC5vbmNsaWNrPSRwKSk7ZWxzZSBpZihuIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKHFoKGUsdCxyKSxlPWUuc2libGluZztlIT09bnVsbDspcWgoZSx0LHIpLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIFFoKGUsdCxyKXt2YXIgbj1lLnRhZztpZihuPT09NXx8bj09PTYpZT1lLnN0YXRlTm9kZSx0P3IuaW5zZXJ0QmVmb3JlKGUsdCk6ci5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKG4hPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoUWgoZSx0LHIpLGU9ZS5zaWJsaW5nO2UhPT1udWxsOylRaChlLHQsciksZT1lLnNpYmxpbmd9dmFyIHp0PW51bGwsRW49ITE7ZnVuY3Rpb24gSm8oZSx0LHIpe2ZvcihyPXIuY2hpbGQ7ciE9PW51bGw7KVEyKGUsdCxyKSxyPXIuc2libGluZ31mdW5jdGlvbiBRMihlLHQscil7aWYocW4mJnR5cGVvZiBxbi5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7cW4ub25Db21taXRGaWJlclVubW91bnQodGYscil9Y2F0Y2h7fXN3aXRjaChyLnRhZyl7Y2FzZSA1OmVyfHx0cyhyLHQpO2Nhc2UgNjp2YXIgbj16dCxvPUVuO3p0PW51bGwsSm8oZSx0LHIpLHp0PW4sRW49byx6dCE9PW51bGwmJihFbj8oZT16dCxyPXIuc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKTplLnJlbW92ZUNoaWxkKHIpKTp6dC5yZW1vdmVDaGlsZChyLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6enQhPT1udWxsJiYoRW4/KGU9enQscj1yLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD9YbShlLnBhcmVudE5vZGUscik6ZS5ub2RlVHlwZT09PTEmJlhtKGUsciksb3UoZSkpOlhtKHp0LHIuc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0Om49enQsbz1Fbix6dD1yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLEVuPSEwLEpvKGUsdCxyKSx6dD1uLEVuPW87YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFlciYmKG49ci51cGRhdGVRdWV1ZSxuIT09bnVsbCYmKG49bi5sYXN0RWZmZWN0LG4hPT1udWxsKSkpe289bj1uLm5leHQ7ZG97dmFyIGk9byxsPWkuZGVzdHJveTtpPWkudGFnLGwhPT12b2lkIDAmJihpJjJ8fGkmNCkmJlJoKHIsdCxsKSxvPW8ubmV4dH13aGlsZShvIT09bil9Sm8oZSx0LHIpO2JyZWFrO2Nhc2UgMTppZighZXImJih0cyhyLHQpLG49ci5zdGF0ZU5vZGUsdHlwZW9mIG4uY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtuLnByb3BzPXIubWVtb2l6ZWRQcm9wcyxuLnN0YXRlPXIubWVtb2l6ZWRTdGF0ZSxuLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7VWUocix0LHMpfUpvKGUsdCxyKTticmVhaztjYXNlIDIxOkpvKGUsdCxyKTticmVhaztjYXNlIDIyOnIubW9kZSYxPyhlcj0obj1lcil8fHIubWVtb2l6ZWRTdGF0ZSE9PW51bGwsSm8oZSx0LHIpLGVyPW4pOkpvKGUsdCxyKTticmVhaztkZWZhdWx0OkpvKGUsdCxyKX19ZnVuY3Rpb24gdHcoZSl7dmFyIHQ9ZS51cGRhdGVRdWV1ZTtpZih0IT09bnVsbCl7ZS51cGRhdGVRdWV1ZT1udWxsO3ZhciByPWUuc3RhdGVOb2RlO3I9PT1udWxsJiYocj1lLnN0YXRlTm9kZT1uZXcgcjYpLHQuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgbz1mNi5iaW5kKG51bGwsZSxuKTtyLmhhcyhuKXx8KHIuYWRkKG4pLG4udGhlbihvLG8pKX0pfX1mdW5jdGlvbiBObihlLHQpe3ZhciByPXQuZGVsZXRpb25zO2lmKHIhPT1udWxsKWZvcih2YXIgbj0wO248ci5sZW5ndGg7bisrKXt2YXIgbz1yW25dO3RyeXt2YXIgaT1lLGw9dCxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6enQ9cy5zdGF0ZU5vZGUsRW49ITE7YnJlYWsgZTtjYXNlIDM6enQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxFbj0hMDticmVhayBlO2Nhc2UgNDp6dD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLEVuPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZih6dD09PW51bGwpdGhyb3cgRXJyb3IoSSgxNjApKTtRMihpLGwsbyksenQ9bnVsbCxFbj0hMTt2YXIgYT1vLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLG8ucmV0dXJuPW51bGx9Y2F0Y2godSl7VWUobyx0LHUpfX1pZih0LnN1YnRyZWVGbGFncyYxMjg1NClmb3IodD10LmNoaWxkO3QhPT1udWxsOylLMih0LGUpLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIEsyKGUsdCl7dmFyIHI9ZS5hbHRlcm5hdGUsbj1lLmZsYWdzO3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKE5uKHQsZSksVm4oZSksbiY0KXt0cnl7WWEoMyxlLGUucmV0dXJuKSxjZigzLGUpfWNhdGNoKGgpe1VlKGUsZS5yZXR1cm4saCl9dHJ5e1lhKDUsZSxlLnJldHVybil9Y2F0Y2goaCl7VWUoZSxlLnJldHVybixoKX19YnJlYWs7Y2FzZSAxOk5uKHQsZSksVm4oZSksbiY1MTImJnIhPT1udWxsJiZ0cyhyLHIucmV0dXJuKTticmVhaztjYXNlIDU6aWYoTm4odCxlKSxWbihlKSxuJjUxMiYmciE9PW51bGwmJnRzKHIsci5yZXR1cm4pLGUuZmxhZ3MmMzIpe3ZhciBvPWUuc3RhdGVOb2RlO3RyeXtldShvLCIiKX1jYXRjaChoKXtVZShlLGUucmV0dXJuLGgpfX1pZihuJjQmJihvPWUuc3RhdGVOb2RlLG8hPW51bGwpKXt2YXIgaT1lLm1lbW9pemVkUHJvcHMsbD1yIT09bnVsbD9yLm1lbW9pemVkUHJvcHM6aSxzPWUudHlwZSxhPWUudXBkYXRlUXVldWU7aWYoZS51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmaS50eXBlPT09InJhZGlvIiYmaS5uYW1lIT1udWxsJiZndyhvLGkpLHZoKHMsbCk7dmFyIHU9dmgocyxpKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIHA9YVtsXSxjPWFbbCsxXTtwPT09InN0eWxlIj9TdyhvLGMpOnA9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP3h3KG8sYyk6cD09PSJjaGlsZHJlbiI/ZXUobyxjKTp0ZyhvLHAsYyx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6ZGgobyxpKTticmVhaztjYXNlInRleHRhcmVhIjp5dyhvLGkpO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1vLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7by5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhaS5tdWx0aXBsZTt2YXIgZD1pLnZhbHVlO2QhPW51bGw/bnMobywhIWkubXVsdGlwbGUsZCwhMSk6ZiE9PSEhaS5tdWx0aXBsZSYmKGkuZGVmYXVsdFZhbHVlIT1udWxsP25zKG8sISFpLm11bHRpcGxlLGkuZGVmYXVsdFZhbHVlLCEwKTpucyhvLCEhaS5tdWx0aXBsZSxpLm11bHRpcGxlP1tdOiIiLCExKSl9b1t1dV09aX1jYXRjaChoKXtVZShlLGUucmV0dXJuLGgpfX1icmVhaztjYXNlIDY6aWYoTm4odCxlKSxWbihlKSxuJjQpe2lmKGUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihJKDE2MikpO289ZS5zdGF0ZU5vZGUsaT1lLm1lbW9pemVkUHJvcHM7dHJ5e28ubm9kZVZhbHVlPWl9Y2F0Y2goaCl7VWUoZSxlLnJldHVybixoKX19YnJlYWs7Y2FzZSAzOmlmKE5uKHQsZSksVm4oZSksbiY0JiZyIT09bnVsbCYmci5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7b3UodC5jb250YWluZXJJbmZvKX1jYXRjaChoKXtVZShlLGUucmV0dXJuLGgpfWJyZWFrO2Nhc2UgNDpObih0LGUpLFZuKGUpO2JyZWFrO2Nhc2UgMTM6Tm4odCxlKSxWbihlKSxvPWUuY2hpbGQsby5mbGFncyY4MTkyJiYoaT1vLm1lbW9pemVkU3RhdGUhPT1udWxsLG8uc3RhdGVOb2RlLmlzSGlkZGVuPWksIWl8fG8uYWx0ZXJuYXRlIT09bnVsbCYmby5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChEZz1aZSgpKSksbiY0JiZ0dyhlKTticmVhaztjYXNlIDIyOmlmKHA9ciE9PW51bGwmJnIubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZS5tb2RlJjE/KGVyPSh1PWVyKXx8cCxObih0LGUpLGVyPXUpOk5uKHQsZSksVm4oZSksbiY4MTkyKXtpZih1PWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKGUuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhcCYmZS5tb2RlJjEpZm9yKCQ9ZSxwPWUuY2hpbGQ7cCE9PW51bGw7KXtmb3IoYz0kPXA7JCE9PW51bGw7KXtzd2l0Y2goZj0kLGQ9Zi5jaGlsZCxmLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OllhKDQsZixmLnJldHVybik7YnJlYWs7Y2FzZSAxOnRzKGYsZi5yZXR1cm4pO3ZhciBtPWYuc3RhdGVOb2RlO2lmKHR5cGVvZiBtLmNvbXBvbmVudFdpbGxVbm1vdW50PT0iZnVuY3Rpb24iKXtuPWYscj1mLnJldHVybjt0cnl7dD1uLG0ucHJvcHM9dC5tZW1vaXplZFByb3BzLG0uc3RhdGU9dC5tZW1vaXplZFN0YXRlLG0uY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChoKXtVZShuLHIsaCl9fWJyZWFrO2Nhc2UgNTp0cyhmLGYucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKGYubWVtb2l6ZWRTdGF0ZSE9PW51bGwpe253KGMpO2NvbnRpbnVlfX1kIT09bnVsbD8oZC5yZXR1cm49ZiwkPWQpOm53KGMpfXA9cC5zaWJsaW5nfWU6Zm9yKHA9bnVsbCxjPWU7Oyl7aWYoYy50YWc9PT01KXtpZihwPT09bnVsbCl7cD1jO3RyeXtvPWMuc3RhdGVOb2RlLHU/KGk9by5zdHlsZSx0eXBlb2YgaS5zZXRQcm9wZXJ0eT09ImZ1bmN0aW9uIj9pLnNldFByb3BlcnR5KCJkaXNwbGF5Iiwibm9uZSIsImltcG9ydGFudCIpOmkuZGlzcGxheT0ibm9uZSIpOihzPWMuc3RhdGVOb2RlLGE9Yy5tZW1vaXplZFByb3BzLnN0eWxlLGw9YSE9bnVsbCYmYS5oYXNPd25Qcm9wZXJ0eSgiZGlzcGxheSIpP2EuZGlzcGxheTpudWxsLHMuc3R5bGUuZGlzcGxheT13dygiZGlzcGxheSIsbCkpfWNhdGNoKGgpe1VlKGUsZS5yZXR1cm4saCl9fX1lbHNlIGlmKGMudGFnPT09Nil7aWYocD09PW51bGwpdHJ5e2Muc3RhdGVOb2RlLm5vZGVWYWx1ZT11PyIiOmMubWVtb2l6ZWRQcm9wc31jYXRjaChoKXtVZShlLGUucmV0dXJuLGgpfX1lbHNlIGlmKChjLnRhZyE9PTIyJiZjLnRhZyE9PTIzfHxjLm1lbW9pemVkU3RhdGU9PT1udWxsfHxjPT09ZSkmJmMuY2hpbGQhPT1udWxsKXtjLmNoaWxkLnJldHVybj1jLGM9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09ZSlicmVhayBlO2Zvcig7Yy5zaWJsaW5nPT09bnVsbDspe2lmKGMucmV0dXJuPT09bnVsbHx8Yy5yZXR1cm49PT1lKWJyZWFrIGU7cD09PWMmJihwPW51bGwpLGM9Yy5yZXR1cm59cD09PWMmJihwPW51bGwpLGMuc2libGluZy5yZXR1cm49Yy5yZXR1cm4sYz1jLnNpYmxpbmd9fWJyZWFrO2Nhc2UgMTk6Tm4odCxlKSxWbihlKSxuJjQmJnR3KGUpO2JyZWFrO2Nhc2UgMjE6YnJlYWs7ZGVmYXVsdDpObih0LGUpLFZuKGUpfX1mdW5jdGlvbiBWbihlKXt2YXIgdD1lLmZsYWdzO2lmKHQmMil7dHJ5e2U6e2Zvcih2YXIgcj1lLnJldHVybjtyIT09bnVsbDspe2lmKHEyKHIpKXt2YXIgbj1yO2JyZWFrIGV9cj1yLnJldHVybn10aHJvdyBFcnJvcihJKDE2MCkpfXN3aXRjaChuLnRhZyl7Y2FzZSA1OnZhciBvPW4uc3RhdGVOb2RlO24uZmxhZ3MmMzImJihldShvLCIiKSxuLmZsYWdzJj0tMzMpO3ZhciBpPWV3KGUpO1FoKGUsaSxvKTticmVhaztjYXNlIDM6Y2FzZSA0OnZhciBsPW4uc3RhdGVOb2RlLmNvbnRhaW5lckluZm8scz1ldyhlKTtxaChlLHMsbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDE2MSkpfX1jYXRjaChhKXtVZShlLGUucmV0dXJuLGEpfWUuZmxhZ3MmPS0zfXQmNDA5NiYmKGUuZmxhZ3MmPS00MDk3KX1mdW5jdGlvbiBvNihlLHQscil7JD1lLFkyKGUsdCxyKX1mdW5jdGlvbiBZMihlLHQscil7Zm9yKHZhciBuPShlLm1vZGUmMSkhPT0wOyQhPT1udWxsOyl7dmFyIG89JCxpPW8uY2hpbGQ7aWYoby50YWc9PT0yMiYmbil7dmFyIGw9by5tZW1vaXplZFN0YXRlIT09bnVsbHx8eHA7aWYoIWwpe3ZhciBzPW8uYWx0ZXJuYXRlLGE9cyE9PW51bGwmJnMubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fGVyO3M9eHA7dmFyIHU9ZXI7aWYoeHA9bCwoZXI9YSkmJiF1KWZvcigkPW87JCE9PW51bGw7KWw9JCxhPWwuY2hpbGQsbC50YWc9PT0yMiYmbC5tZW1vaXplZFN0YXRlIT09bnVsbD9vdyhvKTphIT09bnVsbD8oYS5yZXR1cm49bCwkPWEpOm93KG8pO2Zvcig7aSE9PW51bGw7KSQ9aSxZMihpLHQsciksaT1pLnNpYmxpbmc7JD1vLHhwPXMsZXI9dX1ydyhlLHQscil9ZWxzZSBvLnN1YnRyZWVGbGFncyY4NzcyJiZpIT09bnVsbD8oaS5yZXR1cm49bywkPWkpOnJ3KGUsdCxyKX19ZnVuY3Rpb24gcncoZSl7Zm9yKDskIT09bnVsbDspe3ZhciB0PSQ7aWYodC5mbGFncyY4NzcyKXt2YXIgcj10LmFsdGVybmF0ZTt0cnl7aWYodC5mbGFncyY4NzcyKXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTplcnx8Y2YoNSx0KTticmVhaztjYXNlIDE6dmFyIG49dC5zdGF0ZU5vZGU7aWYodC5mbGFncyY0JiYhZXIpaWYocj09PW51bGwpbi5jb21wb25lbnREaWRNb3VudCgpO2Vsc2V7dmFyIG89dC5lbGVtZW50VHlwZT09PXQudHlwZT9yLm1lbW9pemVkUHJvcHM6Ym4odC50eXBlLHIubWVtb2l6ZWRQcm9wcyk7bi5jb21wb25lbnREaWRVcGRhdGUobyxyLm1lbW9pemVkU3RhdGUsbi5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSl9dmFyIGk9dC51cGRhdGVRdWV1ZTtpIT09bnVsbCYmJHgodCxpLG4pO2JyZWFrO2Nhc2UgMzp2YXIgbD10LnVwZGF0ZVF1ZXVlO2lmKGwhPT1udWxsKXtpZihyPW51bGwsdC5jaGlsZCE9PW51bGwpc3dpdGNoKHQuY2hpbGQudGFnKXtjYXNlIDU6cj10LmNoaWxkLnN0YXRlTm9kZTticmVhaztjYXNlIDE6cj10LmNoaWxkLnN0YXRlTm9kZX0keCh0LGwscil9YnJlYWs7Y2FzZSA1OnZhciBzPXQuc3RhdGVOb2RlO2lmKHI9PT1udWxsJiZ0LmZsYWdzJjQpe3I9czt2YXIgYT10Lm1lbW9pemVkUHJvcHM7c3dpdGNoKHQudHlwZSl7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjphLmF1dG9Gb2N1cyYmci5mb2N1cygpO2JyZWFrO2Nhc2UiaW1nIjphLnNyYyYmKHIuc3JjPWEuc3JjKX19YnJlYWs7Y2FzZSA2OmJyZWFrO2Nhc2UgNDpicmVhaztjYXNlIDEyOmJyZWFrO2Nhc2UgMTM6aWYodC5tZW1vaXplZFN0YXRlPT09bnVsbCl7dmFyIHU9dC5hbHRlcm5hdGU7aWYodSE9PW51bGwpe3ZhciBwPXUubWVtb2l6ZWRTdGF0ZTtpZihwIT09bnVsbCl7dmFyIGM9cC5kZWh5ZHJhdGVkO2MhPT1udWxsJiZvdShjKX19fWJyZWFrO2Nhc2UgMTk6Y2FzZSAxNzpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAyMzpjYXNlIDI1OmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoSSgxNjMpKX1lcnx8dC5mbGFncyY1MTImJkdoKHQpfWNhdGNoKGYpe1VlKHQsdC5yZXR1cm4sZil9fWlmKHQ9PT1lKXskPW51bGw7YnJlYWt9aWYocj10LnNpYmxpbmcsciE9PW51bGwpe3IucmV0dXJuPXQucmV0dXJuLCQ9cjticmVha30kPXQucmV0dXJufX1mdW5jdGlvbiBudyhlKXtmb3IoOyQhPT1udWxsOyl7dmFyIHQ9JDtpZih0PT09ZSl7JD1udWxsO2JyZWFrfXZhciByPXQuc2libGluZztpZihyIT09bnVsbCl7ci5yZXR1cm49dC5yZXR1cm4sJD1yO2JyZWFrfSQ9dC5yZXR1cm59fWZ1bmN0aW9uIG93KGUpe2Zvcig7JCE9PW51bGw7KXt2YXIgdD0kO3RyeXtzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6dmFyIHI9dC5yZXR1cm47dHJ5e2NmKDQsdCl9Y2F0Y2goYSl7VWUodCxyLGEpfWJyZWFrO2Nhc2UgMTp2YXIgbj10LnN0YXRlTm9kZTtpZih0eXBlb2Ygbi5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIil7dmFyIG89dC5yZXR1cm47dHJ5e24uY29tcG9uZW50RGlkTW91bnQoKX1jYXRjaChhKXtVZSh0LG8sYSl9fXZhciBpPXQucmV0dXJuO3RyeXtHaCh0KX1jYXRjaChhKXtVZSh0LGksYSl9YnJlYWs7Y2FzZSA1OnZhciBsPXQucmV0dXJuO3RyeXtHaCh0KX1jYXRjaChhKXtVZSh0LGwsYSl9fX1jYXRjaChhKXtVZSh0LHQucmV0dXJuLGEpfWlmKHQ9PT1lKXskPW51bGw7YnJlYWt9dmFyIHM9dC5zaWJsaW5nO2lmKHMhPT1udWxsKXtzLnJldHVybj10LnJldHVybiwkPXM7YnJlYWt9JD10LnJldHVybn19dmFyIGk2PU1hdGguY2VpbCxZcD1Qby5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLExnPVBvLlJlYWN0Q3VycmVudE93bmVyLHBuPVBvLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLGxlPTAsRXQ9bnVsbCxsdD1udWxsLEJ0PTAsQXI9MCxycz15aSgwKSx2dD0wLGh1PW51bGwscmw9MCxwZj0wLEFnPTAsWGE9bnVsbCxUcj1udWxsLERnPTAsaHM9MS8wLHdvPW51bGwsWHA9ITEsS2g9bnVsbCxwaT1udWxsLHdwPSExLGlpPW51bGwsWnA9MCxaYT0wLFloPW51bGwsRXA9LTEsUHA9MDtmdW5jdGlvbiBwcigpe3JldHVybiBsZSY2P1plKCk6RXAhPT0tMT9FcDpFcD1aZSgpfWZ1bmN0aW9uIGZpKGUpe3JldHVybiBlLm1vZGUmMT9sZSYyJiZCdCE9PTA/QnQmLUJ0OkhiLnRyYW5zaXRpb24hPT1udWxsPyhQcD09PTAmJihQcD1BdygpKSxQcCk6KGU9Z2UsZSE9PTB8fChlPXdpbmRvdy5ldmVudCxlPWU9PT12b2lkIDA/MTY6ancoZS50eXBlKSksZSk6MX1mdW5jdGlvbiBJbihlLHQscixuKXtpZig1MDxaYSl0aHJvdyBaYT0wLFloPW51bGwsRXJyb3IoSSgxODUpKTtndShlLHIsbiksKCEobGUmMil8fGUhPT1FdCkmJihlPT09RXQmJighKGxlJjIpJiYocGZ8PXIpLHZ0PT09NCYmbmkoZSxCdCkpLGJyKGUsbikscj09PTEmJmxlPT09MCYmISh0Lm1vZGUmMSkmJihocz1aZSgpKzUwMCxzZiYmdmkoKSkpfWZ1bmN0aW9uIGJyKGUsdCl7dmFyIHI9ZS5jYWxsYmFja05vZGU7Vk4oZSx0KTt2YXIgbj1PcChlLGU9PT1FdD9CdDowKTtpZihuPT09MClyIT09bnVsbCYmZngociksZS5jYWxsYmFja05vZGU9bnVsbCxlLmNhbGxiYWNrUHJpb3JpdHk9MDtlbHNlIGlmKHQ9biYtbixlLmNhbGxiYWNrUHJpb3JpdHkhPT10KXtpZihyIT1udWxsJiZmeChyKSx0PT09MSllLnRhZz09PTA/V2IoaXcuYmluZChudWxsLGUpKTppMihpdy5iaW5kKG51bGwsZSkpLEJiKGZ1bmN0aW9uKCl7IShsZSY2KSYmdmkoKX0pLHI9bnVsbDtlbHNle3N3aXRjaChEdyhuKSl7Y2FzZSAxOnI9bGc7YnJlYWs7Y2FzZSA0OnI9SXc7YnJlYWs7Y2FzZSAxNjpyPURwO2JyZWFrO2Nhc2UgNTM2ODcwOTEyOnI9THc7YnJlYWs7ZGVmYXVsdDpyPURwfXI9b1MocixYMi5iaW5kKG51bGwsZSkpfWUuY2FsbGJhY2tQcmlvcml0eT10LGUuY2FsbGJhY2tOb2RlPXJ9fWZ1bmN0aW9uIFgyKGUsdCl7aWYoRXA9LTEsUHA9MCxsZSY2KXRocm93IEVycm9yKEkoMzI3KSk7dmFyIHI9ZS5jYWxsYmFja05vZGU7aWYoYXMoKSYmZS5jYWxsYmFja05vZGUhPT1yKXJldHVybiBudWxsO3ZhciBuPU9wKGUsZT09PUV0P0J0OjApO2lmKG49PT0wKXJldHVybiBudWxsO2lmKG4mMzB8fG4mZS5leHBpcmVkTGFuZXN8fHQpdD1KcChlLG4pO2Vsc2V7dD1uO3ZhciBvPWxlO2xlfD0yO3ZhciBpPUoyKCk7KEV0IT09ZXx8QnQhPT10KSYmKHdvPW51bGwsaHM9WmUoKSs1MDAsWGkoZSx0KSk7ZG8gdHJ5e2E2KCk7YnJlYWt9Y2F0Y2gocyl7WjIoZSxzKX13aGlsZSgxKTt4ZygpLFlwLmN1cnJlbnQ9aSxsZT1vLGx0IT09bnVsbD90PTA6KEV0PW51bGwsQnQ9MCx0PXZ0KX1pZih0IT09MCl7aWYodD09PTImJihvPVRoKGUpLG8hPT0wJiYobj1vLHQ9WGgoZSxvKSkpLHQ9PT0xKXRocm93IHI9aHUsWGkoZSwwKSxuaShlLG4pLGJyKGUsWmUoKSkscjtpZih0PT09NiluaShlLG4pO2Vsc2V7aWYobz1lLmN1cnJlbnQuYWx0ZXJuYXRlLCEobiYzMCkmJiFsNihvKSYmKHQ9SnAoZSxuKSx0PT09MiYmKGk9VGgoZSksaSE9PTAmJihuPWksdD1YaChlLGkpKSksdD09PTEpKXRocm93IHI9aHUsWGkoZSwwKSxuaShlLG4pLGJyKGUsWmUoKSkscjtzd2l0Y2goZS5maW5pc2hlZFdvcms9byxlLmZpbmlzaGVkTGFuZXM9bix0KXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKEkoMzQ1KSk7Y2FzZSAyOnFpKGUsVHIsd28pO2JyZWFrO2Nhc2UgMzppZihuaShlLG4pLChuJjEzMDAyMzQyNCk9PT1uJiYodD1EZys1MDAtWmUoKSwxMDx0KSl7aWYoT3AoZSwwKSE9PTApYnJlYWs7aWYobz1lLnN1c3BlbmRlZExhbmVzLChvJm4pIT09bil7cHIoKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm87YnJlYWt9ZS50aW1lb3V0SGFuZGxlPUloKHFpLmJpbmQobnVsbCxlLFRyLHdvKSx0KTticmVha31xaShlLFRyLHdvKTticmVhaztjYXNlIDQ6aWYobmkoZSxuKSwobiY0MTk0MjQwKT09PW4pYnJlYWs7Zm9yKHQ9ZS5ldmVudFRpbWVzLG89LTE7MDxuOyl7dmFyIGw9MzEtTW4obik7aT0xPDxsLGw9dFtsXSxsPm8mJihvPWwpLG4mPX5pfWlmKG49byxuPVplKCktbixuPSgxMjA+bj8xMjA6NDgwPm4/NDgwOjEwODA+bj8xMDgwOjE5MjA+bj8xOTIwOjNlMz5uPzNlMzo0MzIwPm4/NDMyMDoxOTYwKmk2KG4vMTk2MCkpLW4sMTA8bil7ZS50aW1lb3V0SGFuZGxlPUloKHFpLmJpbmQobnVsbCxlLFRyLHdvKSxuKTticmVha31xaShlLFRyLHdvKTticmVhaztjYXNlIDU6cWkoZSxUcix3byk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDMyOSkpfX19cmV0dXJuIGJyKGUsWmUoKSksZS5jYWxsYmFja05vZGU9PT1yP1gyLmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIFhoKGUsdCl7dmFyIHI9WGE7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKFhpKGUsdCkuZmxhZ3N8PTI1NiksZT1KcChlLHQpLGUhPT0yJiYodD1UcixUcj1yLHQhPT1udWxsJiZaaCh0KSksZX1mdW5jdGlvbiBaaChlKXtUcj09PW51bGw/VHI9ZTpUci5wdXNoLmFwcGx5KFRyLGUpfWZ1bmN0aW9uIGw2KGUpe2Zvcih2YXIgdD1lOzspe2lmKHQuZmxhZ3MmMTYzODQpe3ZhciByPXQudXBkYXRlUXVldWU7aWYociE9PW51bGwmJihyPXIuc3RvcmVzLHIhPT1udWxsKSlmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIG89cltuXSxpPW8uZ2V0U25hcHNob3Q7bz1vLnZhbHVlO3RyeXtpZighTG4oaSgpLG8pKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYocj10LmNoaWxkLHQuc3VidHJlZUZsYWdzJjE2Mzg0JiZyIT09bnVsbClyLnJldHVybj10LHQ9cjtlbHNle2lmKHQ9PT1lKWJyZWFrO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1lKXJldHVybiEwO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gbmkoZSx0KXtmb3IodCY9fkFnLHQmPX5wZixlLnN1c3BlbmRlZExhbmVzfD10LGUucGluZ2VkTGFuZXMmPX50LGU9ZS5leHBpcmF0aW9uVGltZXM7MDx0Oyl7dmFyIHI9MzEtTW4odCksbj0xPDxyO2Vbcl09LTEsdCY9fm59fWZ1bmN0aW9uIGl3KGUpe2lmKGxlJjYpdGhyb3cgRXJyb3IoSSgzMjcpKTthcygpO3ZhciB0PU9wKGUsMCk7aWYoISh0JjEpKXJldHVybiBicihlLFplKCkpLG51bGw7dmFyIHI9SnAoZSx0KTtpZihlLnRhZyE9PTAmJnI9PT0yKXt2YXIgbj1UaChlKTtuIT09MCYmKHQ9bixyPVhoKGUsbikpfWlmKHI9PT0xKXRocm93IHI9aHUsWGkoZSwwKSxuaShlLHQpLGJyKGUsWmUoKSkscjtpZihyPT09Nil0aHJvdyBFcnJvcihJKDM0NSkpO3JldHVybiBlLmZpbmlzaGVkV29yaz1lLmN1cnJlbnQuYWx0ZXJuYXRlLGUuZmluaXNoZWRMYW5lcz10LHFpKGUsVHIsd28pLGJyKGUsWmUoKSksbnVsbH1mdW5jdGlvbiBPZyhlLHQpe3ZhciByPWxlO2xlfD0xO3RyeXtyZXR1cm4gZSh0KX1maW5hbGx5e2xlPXIsbGU9PT0wJiYoaHM9WmUoKSs1MDAsc2YmJnZpKCkpfX1mdW5jdGlvbiBubChlKXtpaSE9PW51bGwmJmlpLnRhZz09PTAmJiEobGUmNikmJmFzKCk7dmFyIHQ9bGU7bGV8PTE7dmFyIHI9cG4udHJhbnNpdGlvbixuPWdlO3RyeXtpZihwbi50cmFuc2l0aW9uPW51bGwsZ2U9MSxlKXJldHVybiBlKCl9ZmluYWxseXtnZT1uLHBuLnRyYW5zaXRpb249cixsZT10LCEobGUmNikmJnZpKCl9fWZ1bmN0aW9uIHpnKCl7QXI9cnMuY3VycmVudCxQZShycyl9ZnVuY3Rpb24gWGkoZSx0KXtlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wO3ZhciByPWUudGltZW91dEhhbmRsZTtpZihyIT09LTEmJihlLnRpbWVvdXRIYW5kbGU9LTEsemIocikpLGx0IT09bnVsbClmb3Iocj1sdC5yZXR1cm47ciE9PW51bGw7KXt2YXIgbj1yO3N3aXRjaChnZyhuKSxuLnRhZyl7Y2FzZSAxOm49bi50eXBlLmNoaWxkQ29udGV4dFR5cGVzLG4hPW51bGwmJmpwKCk7YnJlYWs7Y2FzZSAzOmRzKCksUGUoa3IpLFBlKHRyKSxrZygpO2JyZWFrO2Nhc2UgNTpfZyhuKTticmVhaztjYXNlIDQ6ZHMoKTticmVhaztjYXNlIDEzOlBlKEJlKTticmVhaztjYXNlIDE5OlBlKEJlKTticmVhaztjYXNlIDEwOndnKG4udHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOnpnKCl9cj1yLnJldHVybn1pZihFdD1lLGx0PWU9ZGkoZS5jdXJyZW50LG51bGwpLEJ0PUFyPXQsdnQ9MCxodT1udWxsLEFnPXBmPXJsPTAsVHI9WGE9bnVsbCxLaSE9PW51bGwpe2Zvcih0PTA7dDxLaS5sZW5ndGg7dCsrKWlmKHI9S2lbdF0sbj1yLmludGVybGVhdmVkLG4hPT1udWxsKXtyLmludGVybGVhdmVkPW51bGw7dmFyIG89bi5uZXh0LGk9ci5wZW5kaW5nO2lmKGkhPT1udWxsKXt2YXIgbD1pLm5leHQ7aS5uZXh0PW8sbi5uZXh0PWx9ci5wZW5kaW5nPW59S2k9bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBaMihlLHQpe2Rve3ZhciByPWx0O3RyeXtpZih4ZygpLGtwLmN1cnJlbnQ9S3AsUXApe2Zvcih2YXIgbj1GZS5tZW1vaXplZFN0YXRlO24hPT1udWxsOyl7dmFyIG89bi5xdWV1ZTtvIT09bnVsbCYmKG8ucGVuZGluZz1udWxsKSxuPW4ubmV4dH1RcD0hMX1pZih0bD0wLGJ0PXl0PUZlPW51bGwsS2E9ITEsZnU9MCxMZy5jdXJyZW50PW51bGwscj09PW51bGx8fHIucmV0dXJuPT09bnVsbCl7dnQ9MSxodT10LGx0PW51bGw7YnJlYWt9ZTp7dmFyIGk9ZSxsPXIucmV0dXJuLHM9cixhPXQ7aWYodD1CdCxzLmZsYWdzfD0zMjc2OCxhIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1hLHA9cyxjPXAudGFnO2lmKCEocC5tb2RlJjEpJiYoYz09PTB8fGM9PT0xMXx8Yz09PTE1KSl7dmFyIGY9cC5hbHRlcm5hdGU7Zj8ocC51cGRhdGVRdWV1ZT1mLnVwZGF0ZVF1ZXVlLHAubWVtb2l6ZWRTdGF0ZT1mLm1lbW9pemVkU3RhdGUscC5sYW5lcz1mLmxhbmVzKToocC51cGRhdGVRdWV1ZT1udWxsLHAubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgZD1HeChsKTtpZihkIT09bnVsbCl7ZC5mbGFncyY9LTI1NyxxeChkLGwscyxpLHQpLGQubW9kZSYxJiZSeChpLHUsdCksdD1kLGE9dTt2YXIgbT10LnVwZGF0ZVF1ZXVlO2lmKG09PT1udWxsKXt2YXIgaD1uZXcgU2V0O2guYWRkKGEpLHQudXBkYXRlUXVldWU9aH1lbHNlIG0uYWRkKGEpO2JyZWFrIGV9ZWxzZXtpZighKHQmMSkpe1J4KGksdSx0KSxCZygpO2JyZWFrIGV9YT1FcnJvcihJKDQyNikpfX1lbHNlIGlmKERlJiZzLm1vZGUmMSl7dmFyIFM9R3gobCk7aWYoUyE9PW51bGwpeyEoUy5mbGFncyY2NTUzNikmJihTLmZsYWdzfD0yNTYpLHF4KFMsbCxzLGksdCkseWcobXMoYSxzKSk7YnJlYWsgZX19aT1hPW1zKGEscyksdnQhPT00JiYodnQ9MiksWGE9PT1udWxsP1hhPVtpXTpYYS5wdXNoKGkpLGk9bDtkb3tzd2l0Y2goaS50YWcpe2Nhc2UgMzppLmZsYWdzfD02NTUzNix0Jj0tdCxpLmxhbmVzfD10O3ZhciB5PU8yKGksYSx0KTtGeChpLHkpO2JyZWFrIGU7Y2FzZSAxOnM9YTt2YXIgdj1pLnR5cGUsZz1pLnN0YXRlTm9kZTtpZighKGkuZmxhZ3MmMTI4KSYmKHR5cGVvZiB2LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8ZyE9PW51bGwmJnR5cGVvZiBnLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYocGk9PT1udWxsfHwhcGkuaGFzKGcpKSkpe2kuZmxhZ3N8PTY1NTM2LHQmPS10LGkubGFuZXN8PXQ7dmFyIEM9ejIoaSxzLHQpO0Z4KGksQyk7YnJlYWsgZX19aT1pLnJldHVybn13aGlsZShpIT09bnVsbCl9dFMocil9Y2F0Y2goayl7dD1rLGx0PT09ciYmciE9PW51bGwmJihsdD1yPXIucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSgxKX1mdW5jdGlvbiBKMigpe3ZhciBlPVlwLmN1cnJlbnQ7cmV0dXJuIFlwLmN1cnJlbnQ9S3AsZT09PW51bGw/S3A6ZX1mdW5jdGlvbiBCZygpeyh2dD09PTB8fHZ0PT09M3x8dnQ9PT0yKSYmKHZ0PTQpLEV0PT09bnVsbHx8IShybCYyNjg0MzU0NTUpJiYhKHBmJjI2ODQzNTQ1NSl8fG5pKEV0LEJ0KX1mdW5jdGlvbiBKcChlLHQpe3ZhciByPWxlO2xlfD0yO3ZhciBuPUoyKCk7KEV0IT09ZXx8QnQhPT10KSYmKHdvPW51bGwsWGkoZSx0KSk7ZG8gdHJ5e3M2KCk7YnJlYWt9Y2F0Y2gobyl7WjIoZSxvKX13aGlsZSgxKTtpZih4ZygpLGxlPXIsWXAuY3VycmVudD1uLGx0IT09bnVsbCl0aHJvdyBFcnJvcihJKDI2MSkpO3JldHVybiBFdD1udWxsLEJ0PTAsdnR9ZnVuY3Rpb24gczYoKXtmb3IoO2x0IT09bnVsbDspZVMobHQpfWZ1bmN0aW9uIGE2KCl7Zm9yKDtsdCE9PW51bGwmJiFPTigpOyllUyhsdCl9ZnVuY3Rpb24gZVMoZSl7dmFyIHQ9blMoZS5hbHRlcm5hdGUsZSxBcik7ZS5tZW1vaXplZFByb3BzPWUucGVuZGluZ1Byb3BzLHQ9PT1udWxsP3RTKGUpOmx0PXQsTGcuY3VycmVudD1udWxsfWZ1bmN0aW9uIHRTKGUpe3ZhciB0PWU7ZG97dmFyIHI9dC5hbHRlcm5hdGU7aWYoZT10LnJldHVybix0LmZsYWdzJjMyNzY4KXtpZihyPXQ2KHIsdCksciE9PW51bGwpe3IuZmxhZ3MmPTMyNzY3LGx0PXI7cmV0dXJufWlmKGUhPT1udWxsKWUuZmxhZ3N8PTMyNzY4LGUuc3VidHJlZUZsYWdzPTAsZS5kZWxldGlvbnM9bnVsbDtlbHNle3Z0PTYsbHQ9bnVsbDtyZXR1cm59fWVsc2UgaWYocj1lNihyLHQsQXIpLHIhPT1udWxsKXtsdD1yO3JldHVybn1pZih0PXQuc2libGluZyx0IT09bnVsbCl7bHQ9dDtyZXR1cm59bHQ9dD1lfXdoaWxlKHQhPT1udWxsKTt2dD09PTAmJih2dD01KX1mdW5jdGlvbiBxaShlLHQscil7dmFyIG49Z2Usbz1wbi50cmFuc2l0aW9uO3RyeXtwbi50cmFuc2l0aW9uPW51bGwsZ2U9MSx1NihlLHQscixuKX1maW5hbGx5e3BuLnRyYW5zaXRpb249byxnZT1ufXJldHVybiBudWxsfWZ1bmN0aW9uIHU2KGUsdCxyLG4pe2RvIGFzKCk7d2hpbGUoaWkhPT1udWxsKTtpZihsZSY2KXRocm93IEVycm9yKEkoMzI3KSk7cj1lLmZpbmlzaGVkV29yazt2YXIgbz1lLmZpbmlzaGVkTGFuZXM7aWYocj09PW51bGwpcmV0dXJuIG51bGw7aWYoZS5maW5pc2hlZFdvcms9bnVsbCxlLmZpbmlzaGVkTGFuZXM9MCxyPT09ZS5jdXJyZW50KXRocm93IEVycm9yKEkoMTc3KSk7ZS5jYWxsYmFja05vZGU9bnVsbCxlLmNhbGxiYWNrUHJpb3JpdHk9MDt2YXIgaT1yLmxhbmVzfHIuY2hpbGRMYW5lcztpZihSTihlLGkpLGU9PT1FdCYmKGx0PUV0PW51bGwsQnQ9MCksIShyLnN1YnRyZWVGbGFncyYyMDY0KSYmIShyLmZsYWdzJjIwNjQpfHx3cHx8KHdwPSEwLG9TKERwLGZ1bmN0aW9uKCl7cmV0dXJuIGFzKCksbnVsbH0pKSxpPShyLmZsYWdzJjE1OTkwKSE9PTAsci5zdWJ0cmVlRmxhZ3MmMTU5OTB8fGkpe2k9cG4udHJhbnNpdGlvbixwbi50cmFuc2l0aW9uPW51bGw7dmFyIGw9Z2U7Z2U9MTt2YXIgcz1sZTtsZXw9NCxMZy5jdXJyZW50PW51bGwsbjYoZSxyKSxLMihyLGUpLEliKFBoKSx6cD0hIUVoLFBoPUVoPW51bGwsZS5jdXJyZW50PXIsbzYocixlLG8pLHpOKCksbGU9cyxnZT1sLHBuLnRyYW5zaXRpb249aX1lbHNlIGUuY3VycmVudD1yO2lmKHdwJiYod3A9ITEsaWk9ZSxacD1vKSxpPWUucGVuZGluZ0xhbmVzLGk9PT0wJiYocGk9bnVsbCksJE4oci5zdGF0ZU5vZGUsbiksYnIoZSxaZSgpKSx0IT09bnVsbClmb3Iobj1lLm9uUmVjb3ZlcmFibGVFcnJvcixyPTA7cjx0Lmxlbmd0aDtyKyspbz10W3JdLG4oby52YWx1ZSx7Y29tcG9uZW50U3RhY2s6by5zdGFjayxkaWdlc3Q6by5kaWdlc3R9KTtpZihYcCl0aHJvdyBYcD0hMSxlPUtoLEtoPW51bGwsZTtyZXR1cm4gWnAmMSYmZS50YWchPT0wJiZhcygpLGk9ZS5wZW5kaW5nTGFuZXMsaSYxP2U9PT1ZaD9aYSsrOihaYT0wLFloPWUpOlphPTAsdmkoKSxudWxsfWZ1bmN0aW9uIGFzKCl7aWYoaWkhPT1udWxsKXt2YXIgZT1EdyhacCksdD1wbi50cmFuc2l0aW9uLHI9Z2U7dHJ5e2lmKHBuLnRyYW5zaXRpb249bnVsbCxnZT0xNj5lPzE2OmUsaWk9PT1udWxsKXZhciBuPSExO2Vsc2V7aWYoZT1paSxpaT1udWxsLFpwPTAsbGUmNil0aHJvdyBFcnJvcihJKDMzMSkpO3ZhciBvPWxlO2ZvcihsZXw9NCwkPWUuY3VycmVudDskIT09bnVsbDspe3ZhciBpPSQsbD1pLmNoaWxkO2lmKCQuZmxhZ3MmMTYpe3ZhciBzPWkuZGVsZXRpb25zO2lmKHMhPT1udWxsKXtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIHU9c1thXTtmb3IoJD11OyQhPT1udWxsOyl7dmFyIHA9JDtzd2l0Y2gocC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6WWEoOCxwLGkpfXZhciBjPXAuY2hpbGQ7aWYoYyE9PW51bGwpYy5yZXR1cm49cCwkPWM7ZWxzZSBmb3IoOyQhPT1udWxsOyl7cD0kO3ZhciBmPXAuc2libGluZyxkPXAucmV0dXJuO2lmKEcyKHApLHA9PT11KXskPW51bGw7YnJlYWt9aWYoZiE9PW51bGwpe2YucmV0dXJuPWQsJD1mO2JyZWFrfSQ9ZH19fXZhciBtPWkuYWx0ZXJuYXRlO2lmKG0hPT1udWxsKXt2YXIgaD1tLmNoaWxkO2lmKGghPT1udWxsKXttLmNoaWxkPW51bGw7ZG97dmFyIFM9aC5zaWJsaW5nO2guc2libGluZz1udWxsLGg9U313aGlsZShoIT09bnVsbCl9fSQ9aX19aWYoaS5zdWJ0cmVlRmxhZ3MmMjA2NCYmbCE9PW51bGwpbC5yZXR1cm49aSwkPWw7ZWxzZSBlOmZvcig7JCE9PW51bGw7KXtpZihpPSQsaS5mbGFncyYyMDQ4KXN3aXRjaChpLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpZYSg5LGksaS5yZXR1cm4pfXZhciB5PWkuc2libGluZztpZih5IT09bnVsbCl7eS5yZXR1cm49aS5yZXR1cm4sJD15O2JyZWFrIGV9JD1pLnJldHVybn19dmFyIHY9ZS5jdXJyZW50O2ZvcigkPXY7JCE9PW51bGw7KXtsPSQ7dmFyIGc9bC5jaGlsZDtpZihsLnN1YnRyZWVGbGFncyYyMDY0JiZnIT09bnVsbClnLnJldHVybj1sLCQ9ZztlbHNlIGU6Zm9yKGw9djskIT09bnVsbDspe2lmKHM9JCxzLmZsYWdzJjIwNDgpdHJ5e3N3aXRjaChzLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjZig5LHMpfX1jYXRjaChrKXtVZShzLHMucmV0dXJuLGspfWlmKHM9PT1sKXskPW51bGw7YnJlYWsgZX12YXIgQz1zLnNpYmxpbmc7aWYoQyE9PW51bGwpe0MucmV0dXJuPXMucmV0dXJuLCQ9QzticmVhayBlfSQ9cy5yZXR1cm59fWlmKGxlPW8sdmkoKSxxbiYmdHlwZW9mIHFuLm9uUG9zdENvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7cW4ub25Qb3N0Q29tbWl0RmliZXJSb290KHRmLGUpfWNhdGNoe31uPSEwfXJldHVybiBufWZpbmFsbHl7Z2U9cixwbi50cmFuc2l0aW9uPXR9fXJldHVybiExfWZ1bmN0aW9uIGx3KGUsdCxyKXt0PW1zKHIsdCksdD1PMihlLHQsMSksZT1jaShlLHQsMSksdD1wcigpLGUhPT1udWxsJiYoZ3UoZSwxLHQpLGJyKGUsdCkpfWZ1bmN0aW9uIFVlKGUsdCxyKXtpZihlLnRhZz09PTMpbHcoZSxlLHIpO2Vsc2UgZm9yKDt0IT09bnVsbDspe2lmKHQudGFnPT09Myl7bHcodCxlLHIpO2JyZWFrfWVsc2UgaWYodC50YWc9PT0xKXt2YXIgbj10LnN0YXRlTm9kZTtpZih0eXBlb2YgdC50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8dHlwZW9mIG4uY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihwaT09PW51bGx8fCFwaS5oYXMobikpKXtlPW1zKHIsZSksZT16Mih0LGUsMSksdD1jaSh0LGUsMSksZT1wcigpLHQhPT1udWxsJiYoZ3UodCwxLGUpLGJyKHQsZSkpO2JyZWFrfX10PXQucmV0dXJufX1mdW5jdGlvbiBjNihlLHQscil7dmFyIG49ZS5waW5nQ2FjaGU7biE9PW51bGwmJm4uZGVsZXRlKHQpLHQ9cHIoKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJnIsRXQ9PT1lJiYoQnQmcik9PT1yJiYodnQ9PT00fHx2dD09PTMmJihCdCYxMzAwMjM0MjQpPT09QnQmJjUwMD5aZSgpLURnP1hpKGUsMCk6QWd8PXIpLGJyKGUsdCl9ZnVuY3Rpb24gclMoZSx0KXt0PT09MCYmKGUubW9kZSYxPyh0PWxwLGxwPDw9MSwhKGxwJjEzMDAyMzQyNCkmJihscD00MTk0MzA0KSk6dD0xKTt2YXIgcj1wcigpO2U9Ym8oZSx0KSxlIT09bnVsbCYmKGd1KGUsdCxyKSxicihlLHIpKX1mdW5jdGlvbiBwNihlKXt2YXIgdD1lLm1lbW9pemVkU3RhdGUscj0wO3QhPT1udWxsJiYocj10LnJldHJ5TGFuZSksclMoZSxyKX1mdW5jdGlvbiBmNihlLHQpe3ZhciByPTA7c3dpdGNoKGUudGFnKXtjYXNlIDEzOnZhciBuPWUuc3RhdGVOb2RlLG89ZS5tZW1vaXplZFN0YXRlO28hPT1udWxsJiYocj1vLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTpuPWUuc3RhdGVOb2RlO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoSSgzMTQpKX1uIT09bnVsbCYmbi5kZWxldGUodCksclMoZSxyKX12YXIgblM7blM9ZnVuY3Rpb24oZSx0LHIpe2lmKGUhPT1udWxsKWlmKGUubWVtb2l6ZWRQcm9wcyE9PXQucGVuZGluZ1Byb3BzfHxrci5jdXJyZW50KV9yPSEwO2Vsc2V7aWYoIShlLmxhbmVzJnIpJiYhKHQuZmxhZ3MmMTI4KSlyZXR1cm4gX3I9ITEsSmIoZSx0LHIpO19yPSEhKGUuZmxhZ3MmMTMxMDcyKX1lbHNlIF9yPSExLERlJiZ0LmZsYWdzJjEwNDg1NzYmJmwyKHQsVXAsdC5pbmRleCk7c3dpdGNoKHQubGFuZXM9MCx0LnRhZyl7Y2FzZSAyOnZhciBuPXQudHlwZTticChlLHQpLGU9dC5wZW5kaW5nUHJvcHM7dmFyIG89Y3ModCx0ci5jdXJyZW50KTtzcyh0LHIpLG89YmcobnVsbCx0LG4sZSxvLHIpO3ZhciBpPUVnKCk7cmV0dXJuIHQuZmxhZ3N8PTEsdHlwZW9mIG89PSJvYmplY3QiJiZvIT09bnVsbCYmdHlwZW9mIG8ucmVuZGVyPT0iZnVuY3Rpb24iJiZvLiQkdHlwZW9mPT09dm9pZCAwPyh0LnRhZz0xLHQubWVtb2l6ZWRTdGF0ZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxOcihuKT8oaT0hMCxXcCh0KSk6aT0hMSx0Lm1lbW9pemVkU3RhdGU9by5zdGF0ZSE9PW51bGwmJm8uc3RhdGUhPT12b2lkIDA/by5zdGF0ZTpudWxsLENnKHQpLG8udXBkYXRlcj1hZix0LnN0YXRlTm9kZT1vLG8uX3JlYWN0SW50ZXJuYWxzPXQsRmgodCxuLGUsciksdD1XaChudWxsLHQsbiwhMCxpLHIpKToodC50YWc9MCxEZSYmaSYmaGcodCksY3IobnVsbCx0LG8sciksdD10LmNoaWxkKSx0O2Nhc2UgMTY6bj10LmVsZW1lbnRUeXBlO2U6e3N3aXRjaChicChlLHQpLGU9dC5wZW5kaW5nUHJvcHMsbz1uLl9pbml0LG49byhuLl9wYXlsb2FkKSx0LnR5cGU9bixvPXQudGFnPW02KG4pLGU9Ym4obixlKSxvKXtjYXNlIDA6dD1qaChudWxsLHQsbixlLHIpO2JyZWFrIGU7Y2FzZSAxOnQ9WXgobnVsbCx0LG4sZSxyKTticmVhayBlO2Nhc2UgMTE6dD1ReChudWxsLHQsbixlLHIpO2JyZWFrIGU7Y2FzZSAxNDp0PUt4KG51bGwsdCxuLGJuKG4udHlwZSxlKSxyKTticmVhayBlfXRocm93IEVycm9yKEkoMzA2LG4sIiIpKX1yZXR1cm4gdDtjYXNlIDA6cmV0dXJuIG49dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09bj9vOmJuKG4sbyksamgoZSx0LG4sbyxyKTtjYXNlIDE6cmV0dXJuIG49dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09bj9vOmJuKG4sbyksWXgoZSx0LG4sbyxyKTtjYXNlIDM6ZTp7aWYoajIodCksZT09PW51bGwpdGhyb3cgRXJyb3IoSSgzODcpKTtuPXQucGVuZGluZ1Byb3BzLGk9dC5tZW1vaXplZFN0YXRlLG89aS5lbGVtZW50LGMyKGUsdCksR3AodCxuLG51bGwscik7dmFyIGw9dC5tZW1vaXplZFN0YXRlO2lmKG49bC5lbGVtZW50LGkuaXNEZWh5ZHJhdGVkKWlmKGk9e2VsZW1lbnQ6bixpc0RlaHlkcmF0ZWQ6ITEsY2FjaGU6bC5jYWNoZSxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOmwucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSx0LnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1pLHQubWVtb2l6ZWRTdGF0ZT1pLHQuZmxhZ3MmMjU2KXtvPW1zKEVycm9yKEkoNDIzKSksdCksdD1YeChlLHQsbixyLG8pO2JyZWFrIGV9ZWxzZSBpZihuIT09byl7bz1tcyhFcnJvcihJKDQyNCkpLHQpLHQ9WHgoZSx0LG4scixvKTticmVhayBlfWVsc2UgZm9yKERyPXVpKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCksT3I9dCxEZT0hMCxQbj1udWxsLHI9bTIodCxudWxsLG4sciksdC5jaGlsZD1yO3I7KXIuZmxhZ3M9ci5mbGFncyYtM3w0MDk2LHI9ci5zaWJsaW5nO2Vsc2V7aWYocHMoKSxuPT09byl7dD1FbyhlLHQscik7YnJlYWsgZX1jcihlLHQsbixyKX10PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA1OnJldHVybiBoMih0KSxlPT09bnVsbCYmT2godCksbj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxpPWUhPT1udWxsP2UubWVtb2l6ZWRQcm9wczpudWxsLGw9by5jaGlsZHJlbixNaChuLG8pP2w9bnVsbDppIT09bnVsbCYmTWgobixpKSYmKHQuZmxhZ3N8PTMyKSwkMihlLHQpLGNyKGUsdCxsLHIpLHQuY2hpbGQ7Y2FzZSA2OnJldHVybiBlPT09bnVsbCYmT2godCksbnVsbDtjYXNlIDEzOnJldHVybiBXMihlLHQscik7Y2FzZSA0OnJldHVybiBUZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLG49dC5wZW5kaW5nUHJvcHMsZT09PW51bGw/dC5jaGlsZD1mcyh0LG51bGwsbixyKTpjcihlLHQsbixyKSx0LmNoaWxkO2Nhc2UgMTE6cmV0dXJuIG49dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09bj9vOmJuKG4sbyksUXgoZSx0LG4sbyxyKTtjYXNlIDc6cmV0dXJuIGNyKGUsdCx0LnBlbmRpbmdQcm9wcyxyKSx0LmNoaWxkO2Nhc2UgODpyZXR1cm4gY3IoZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLHIpLHQuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gY3IoZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLHIpLHQuY2hpbGQ7Y2FzZSAxMDplOntpZihuPXQudHlwZS5fY29udGV4dCxvPXQucGVuZGluZ1Byb3BzLGk9dC5tZW1vaXplZFByb3BzLGw9by52YWx1ZSxDZShWcCxuLl9jdXJyZW50VmFsdWUpLG4uX2N1cnJlbnRWYWx1ZT1sLGkhPT1udWxsKWlmKExuKGkudmFsdWUsbCkpe2lmKGkuY2hpbGRyZW49PT1vLmNoaWxkcmVuJiYha3IuY3VycmVudCl7dD1FbyhlLHQscik7YnJlYWsgZX19ZWxzZSBmb3IoaT10LmNoaWxkLGkhPT1udWxsJiYoaS5yZXR1cm49dCk7aSE9PW51bGw7KXt2YXIgcz1pLmRlcGVuZGVuY2llcztpZihzIT09bnVsbCl7bD1pLmNoaWxkO2Zvcih2YXIgYT1zLmZpcnN0Q29udGV4dDthIT09bnVsbDspe2lmKGEuY29udGV4dD09PW4pe2lmKGkudGFnPT09MSl7YT1fbygtMSxyJi1yKSxhLnRhZz0yO3ZhciB1PWkudXBkYXRlUXVldWU7aWYodSE9PW51bGwpe3U9dS5zaGFyZWQ7dmFyIHA9dS5wZW5kaW5nO3A9PT1udWxsP2EubmV4dD1hOihhLm5leHQ9cC5uZXh0LHAubmV4dD1hKSx1LnBlbmRpbmc9YX19aS5sYW5lc3w9cixhPWkuYWx0ZXJuYXRlLGEhPT1udWxsJiYoYS5sYW5lc3w9ciksemgoaS5yZXR1cm4scix0KSxzLmxhbmVzfD1yO2JyZWFrfWE9YS5uZXh0fX1lbHNlIGlmKGkudGFnPT09MTApbD1pLnR5cGU9PT10LnR5cGU/bnVsbDppLmNoaWxkO2Vsc2UgaWYoaS50YWc9PT0xOCl7aWYobD1pLnJldHVybixsPT09bnVsbCl0aHJvdyBFcnJvcihJKDM0MSkpO2wubGFuZXN8PXIscz1sLmFsdGVybmF0ZSxzIT09bnVsbCYmKHMubGFuZXN8PXIpLHpoKGwscix0KSxsPWkuc2libGluZ31lbHNlIGw9aS5jaGlsZDtpZihsIT09bnVsbClsLnJldHVybj1pO2Vsc2UgZm9yKGw9aTtsIT09bnVsbDspe2lmKGw9PT10KXtsPW51bGw7YnJlYWt9aWYoaT1sLnNpYmxpbmcsaSE9PW51bGwpe2kucmV0dXJuPWwucmV0dXJuLGw9aTticmVha31sPWwucmV0dXJufWk9bH1jcihlLHQsby5jaGlsZHJlbixyKSx0PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA5OnJldHVybiBvPXQudHlwZSxuPXQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLHNzKHQsciksbz1mbihvKSxuPW4obyksdC5mbGFnc3w9MSxjcihlLHQsbixyKSx0LmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIG49dC50eXBlLG89Ym4obix0LnBlbmRpbmdQcm9wcyksbz1ibihuLnR5cGUsbyksS3goZSx0LG4sbyxyKTtjYXNlIDE1OnJldHVybiBCMihlLHQsdC50eXBlLHQucGVuZGluZ1Byb3BzLHIpO2Nhc2UgMTc6cmV0dXJuIG49dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09bj9vOmJuKG4sbyksYnAoZSx0KSx0LnRhZz0xLE5yKG4pPyhlPSEwLFdwKHQpKTplPSExLHNzKHQsciksZjIodCxuLG8pLEZoKHQsbixvLHIpLFdoKG51bGwsdCxuLCEwLGUscik7Y2FzZSAxOTpyZXR1cm4gSDIoZSx0LHIpO2Nhc2UgMjI6cmV0dXJuIEYyKGUsdCxyKX10aHJvdyBFcnJvcihJKDE1Nix0LnRhZykpfTtmdW5jdGlvbiBvUyhlLHQpe3JldHVybiBNdyhlLHQpfWZ1bmN0aW9uIGQ2KGUsdCxyLG4pe3RoaXMudGFnPWUsdGhpcy5rZXk9cix0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsLHRoaXMuaW5kZXg9MCx0aGlzLnJlZj1udWxsLHRoaXMucGVuZGluZ1Byb3BzPXQsdGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGwsdGhpcy5tb2RlPW4sdGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wLHRoaXMuZGVsZXRpb25zPW51bGwsdGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MCx0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIGNuKGUsdCxyLG4pe3JldHVybiBuZXcgZDYoZSx0LHIsbil9ZnVuY3Rpb24gRmcoZSl7cmV0dXJuIGU9ZS5wcm90b3R5cGUsISghZXx8IWUuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gbTYoZSl7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIEZnKGUpPzE6MDtpZihlIT1udWxsKXtpZihlPWUuJCR0eXBlb2YsZT09PW5nKXJldHVybiAxMTtpZihlPT09b2cpcmV0dXJuIDE0fXJldHVybiAyfWZ1bmN0aW9uIGRpKGUsdCl7dmFyIHI9ZS5hbHRlcm5hdGU7cmV0dXJuIHI9PT1udWxsPyhyPWNuKGUudGFnLHQsZS5rZXksZS5tb2RlKSxyLmVsZW1lbnRUeXBlPWUuZWxlbWVudFR5cGUsci50eXBlPWUudHlwZSxyLnN0YXRlTm9kZT1lLnN0YXRlTm9kZSxyLmFsdGVybmF0ZT1lLGUuYWx0ZXJuYXRlPXIpOihyLnBlbmRpbmdQcm9wcz10LHIudHlwZT1lLnR5cGUsci5mbGFncz0wLHIuc3VidHJlZUZsYWdzPTAsci5kZWxldGlvbnM9bnVsbCksci5mbGFncz1lLmZsYWdzJjE0NjgwMDY0LHIuY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMsci5sYW5lcz1lLmxhbmVzLHIuY2hpbGQ9ZS5jaGlsZCxyLm1lbW9pemVkUHJvcHM9ZS5tZW1vaXplZFByb3BzLHIubWVtb2l6ZWRTdGF0ZT1lLm1lbW9pemVkU3RhdGUsci51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQ9ZS5kZXBlbmRlbmNpZXMsci5kZXBlbmRlbmNpZXM9dD09PW51bGw/bnVsbDp7bGFuZXM6dC5sYW5lcyxmaXJzdENvbnRleHQ6dC5maXJzdENvbnRleHR9LHIuc2libGluZz1lLnNpYmxpbmcsci5pbmRleD1lLmluZGV4LHIucmVmPWUucmVmLHJ9ZnVuY3Rpb24gTXAoZSx0LHIsbixvLGkpe3ZhciBsPTI7aWYobj1lLHR5cGVvZiBlPT0iZnVuY3Rpb24iKUZnKGUpJiYobD0xKTtlbHNlIGlmKHR5cGVvZiBlPT0ic3RyaW5nIilsPTU7ZWxzZSBlOnN3aXRjaChlKXtjYXNlIEdsOnJldHVybiBaaShyLmNoaWxkcmVuLG8saSx0KTtjYXNlIHJnOmw9OCxvfD04O2JyZWFrO2Nhc2UgYWg6cmV0dXJuIGU9Y24oMTIscix0LG98MiksZS5lbGVtZW50VHlwZT1haCxlLmxhbmVzPWksZTtjYXNlIHVoOnJldHVybiBlPWNuKDEzLHIsdCxvKSxlLmVsZW1lbnRUeXBlPXVoLGUubGFuZXM9aSxlO2Nhc2UgY2g6cmV0dXJuIGU9Y24oMTkscix0LG8pLGUuZWxlbWVudFR5cGU9Y2gsZS5sYW5lcz1pLGU7Y2FzZSBkdzpyZXR1cm4gZmYocixvLGksdCk7ZGVmYXVsdDppZih0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIHB3Omw9MTA7YnJlYWsgZTtjYXNlIGZ3Omw9OTticmVhayBlO2Nhc2Ugbmc6bD0xMTticmVhayBlO2Nhc2Ugb2c6bD0xNDticmVhayBlO2Nhc2UgZWk6bD0xNixuPW51bGw7YnJlYWsgZX10aHJvdyBFcnJvcihJKDEzMCxlPT1udWxsP2U6dHlwZW9mIGUsIiIpKX1yZXR1cm4gdD1jbihsLHIsdCxvKSx0LmVsZW1lbnRUeXBlPWUsdC50eXBlPW4sdC5sYW5lcz1pLHR9ZnVuY3Rpb24gWmkoZSx0LHIsbil7cmV0dXJuIGU9Y24oNyxlLG4sdCksZS5sYW5lcz1yLGV9ZnVuY3Rpb24gZmYoZSx0LHIsbil7cmV0dXJuIGU9Y24oMjIsZSxuLHQpLGUuZWxlbWVudFR5cGU9ZHcsZS5sYW5lcz1yLGUuc3RhdGVOb2RlPXtpc0hpZGRlbjohMX0sZX1mdW5jdGlvbiBpaChlLHQscil7cmV0dXJuIGU9Y24oNixlLG51bGwsdCksZS5sYW5lcz1yLGV9ZnVuY3Rpb24gbGgoZSx0LHIpe3JldHVybiB0PWNuKDQsZS5jaGlsZHJlbiE9PW51bGw/ZS5jaGlsZHJlbjpbXSxlLmtleSx0KSx0LmxhbmVzPXIsdC5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86ZS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmUuaW1wbGVtZW50YXRpb259LHR9ZnVuY3Rpb24gaDYoZSx0LHIsbixvKXt0aGlzLnRhZz10LHRoaXMuY29udGFpbmVySW5mbz1lLHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz1VbSgwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz1VbSgtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz1VbSgwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9bix0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1vLHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uICRnKGUsdCxyLG4sbyxpLGwscyxhKXtyZXR1cm4gZT1uZXcgaDYoZSx0LHIscyxhKSx0PT09MT8odD0xLGk9PT0hMCYmKHR8PTgpKTp0PTAsaT1jbigzLG51bGwsbnVsbCx0KSxlLmN1cnJlbnQ9aSxpLnN0YXRlTm9kZT1lLGkubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpuLGlzRGVoeWRyYXRlZDpyLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LENnKGkpLGV9ZnVuY3Rpb24gZzYoZSx0LHIpe3ZhciBuPTM8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjpSbCxrZXk6bj09bnVsbD9udWxsOiIiK24sY2hpbGRyZW46ZSxjb250YWluZXJJbmZvOnQsaW1wbGVtZW50YXRpb246cn19ZnVuY3Rpb24gaVMoZSl7aWYoIWUpcmV0dXJuIGhpO2U9ZS5fcmVhY3RJbnRlcm5hbHM7ZTp7aWYoaWwoZSkhPT1lfHxlLnRhZyE9PTEpdGhyb3cgRXJyb3IoSSgxNzApKTt2YXIgdD1lO2Rve3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnQ9dC5zdGF0ZU5vZGUuY29udGV4dDticmVhayBlO2Nhc2UgMTppZihOcih0LnR5cGUpKXt0PXQuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGV9fXQ9dC5yZXR1cm59d2hpbGUodCE9PW51bGwpO3Rocm93IEVycm9yKEkoMTcxKSl9aWYoZS50YWc9PT0xKXt2YXIgcj1lLnR5cGU7aWYoTnIocikpcmV0dXJuIG8yKGUscix0KX1yZXR1cm4gdH1mdW5jdGlvbiBsUyhlLHQscixuLG8saSxsLHMsYSl7cmV0dXJuIGU9JGcocixuLCEwLGUsbyxpLGwscyxhKSxlLmNvbnRleHQ9aVMobnVsbCkscj1lLmN1cnJlbnQsbj1wcigpLG89ZmkociksaT1fbyhuLG8pLGkuY2FsbGJhY2s9dD8/bnVsbCxjaShyLGksbyksZS5jdXJyZW50LmxhbmVzPW8sZ3UoZSxvLG4pLGJyKGUsbiksZX1mdW5jdGlvbiBkZihlLHQscixuKXt2YXIgbz10LmN1cnJlbnQsaT1wcigpLGw9Zmkobyk7cmV0dXJuIHI9aVMociksdC5jb250ZXh0PT09bnVsbD90LmNvbnRleHQ9cjp0LnBlbmRpbmdDb250ZXh0PXIsdD1fbyhpLGwpLHQucGF5bG9hZD17ZWxlbWVudDplfSxuPW49PT12b2lkIDA/bnVsbDpuLG4hPT1udWxsJiYodC5jYWxsYmFjaz1uKSxlPWNpKG8sdCxsKSxlIT09bnVsbCYmKEluKGUsbyxsLGkpLF9wKGUsbyxsKSksbH1mdW5jdGlvbiBlZihlKXtpZihlPWUuY3VycmVudCwhZS5jaGlsZClyZXR1cm4gbnVsbDtzd2l0Y2goZS5jaGlsZC50YWcpe2Nhc2UgNTpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGU7ZGVmYXVsdDpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIHN3KGUsdCl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe3ZhciByPWUucmV0cnlMYW5lO2UucmV0cnlMYW5lPXIhPT0wJiZyPHQ/cjp0fX1mdW5jdGlvbiBqZyhlLHQpe3N3KGUsdCksKGU9ZS5hbHRlcm5hdGUpJiZzdyhlLHQpfWZ1bmN0aW9uIHk2KCl7cmV0dXJuIG51bGx9dmFyIHNTPXR5cGVvZiByZXBvcnRFcnJvcj09ImZ1bmN0aW9uIj9yZXBvcnRFcnJvcjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfTtmdW5jdGlvbiBXZyhlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1tZi5wcm90b3R5cGUucmVuZGVyPVdnLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW50ZXJuYWxSb290O2lmKHQ9PT1udWxsKXRocm93IEVycm9yKEkoNDA5KSk7ZGYoZSx0LG51bGwsbnVsbCl9O21mLnByb3RvdHlwZS51bm1vdW50PVdnLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW50ZXJuYWxSb290O2lmKGUhPT1udWxsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgdD1lLmNvbnRhaW5lckluZm87bmwoZnVuY3Rpb24oKXtkZihudWxsLGUsbnVsbCxudWxsKX0pLHRbTm9dPW51bGx9fTtmdW5jdGlvbiBtZihlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1tZi5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9QncoKTtlPXtibG9ja2VkT246bnVsbCx0YXJnZXQ6ZSxwcmlvcml0eTp0fTtmb3IodmFyIHI9MDtyPHJpLmxlbmd0aCYmdCE9PTAmJnQ8cmlbcl0ucHJpb3JpdHk7cisrKTtyaS5zcGxpY2UociwwLGUpLHI9PT0wJiYkdyhlKX19O2Z1bmN0aW9uIEhnKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExKX1mdW5jdGlvbiBoZihlKXtyZXR1cm4hKCFlfHxlLm5vZGVUeXBlIT09MSYmZS5ub2RlVHlwZSE9PTkmJmUubm9kZVR5cGUhPT0xMSYmKGUubm9kZVR5cGUhPT04fHxlLm5vZGVWYWx1ZSE9PSIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgIikpfWZ1bmN0aW9uIGF3KCl7fWZ1bmN0aW9uIHY2KGUsdCxyLG4sbyl7aWYobyl7aWYodHlwZW9mIG49PSJmdW5jdGlvbiIpe3ZhciBpPW47bj1mdW5jdGlvbigpe3ZhciB1PWVmKGwpO2kuY2FsbCh1KX19dmFyIGw9bFModCxuLGUsMCxudWxsLCExLCExLCIiLGF3KTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPWwsZVtOb109bC5jdXJyZW50LHN1KGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxubCgpLGx9Zm9yKDtvPWUubGFzdENoaWxkOyllLnJlbW92ZUNoaWxkKG8pO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXt2YXIgcz1uO249ZnVuY3Rpb24oKXt2YXIgdT1lZihhKTtzLmNhbGwodSl9fXZhciBhPSRnKGUsMCwhMSxudWxsLG51bGwsITEsITEsIiIsYXcpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9YSxlW05vXT1hLmN1cnJlbnQsc3UoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLG5sKGZ1bmN0aW9uKCl7ZGYodCxhLHIsbil9KSxhfWZ1bmN0aW9uIGdmKGUsdCxyLG4sbyl7dmFyIGk9ci5fcmVhY3RSb290Q29udGFpbmVyO2lmKGkpe3ZhciBsPWk7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpe3ZhciBzPW87bz1mdW5jdGlvbigpe3ZhciBhPWVmKGwpO3MuY2FsbChhKX19ZGYodCxsLGUsbyl9ZWxzZSBsPXY2KHIsdCxlLG8sbik7cmV0dXJuIGVmKGwpfU93PWZ1bmN0aW9uKGUpe3N3aXRjaChlLnRhZyl7Y2FzZSAzOnZhciB0PWUuc3RhdGVOb2RlO2lmKHQuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIHI9SGEodC5wZW5kaW5nTGFuZXMpO3IhPT0wJiYoc2codCxyfDEpLGJyKHQsWmUoKSksIShsZSY2KSYmKGhzPVplKCkrNTAwLHZpKCkpKX1icmVhaztjYXNlIDEzOm5sKGZ1bmN0aW9uKCl7dmFyIG49Ym8oZSwxKTtpZihuIT09bnVsbCl7dmFyIG89cHIoKTtJbihuLGUsMSxvKX19KSxqZyhlLDEpfX07YWc9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9Ym8oZSwxMzQyMTc3MjgpO2lmKHQhPT1udWxsKXt2YXIgcj1wcigpO0luKHQsZSwxMzQyMTc3Mjgscil9amcoZSwxMzQyMTc3MjgpfX07enc9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9ZmkoZSkscj1ibyhlLHQpO2lmKHIhPT1udWxsKXt2YXIgbj1wcigpO0luKHIsZSx0LG4pfWpnKGUsdCl9fTtCdz1mdW5jdGlvbigpe3JldHVybiBnZX07Rnc9ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZTt0cnl7cmV0dXJuIGdlPWUsdCgpfWZpbmFsbHl7Z2U9cn19O3doPWZ1bmN0aW9uKGUsdCxyKXtzd2l0Y2godCl7Y2FzZSJpbnB1dCI6aWYoZGgoZSxyKSx0PXIubmFtZSxyLnR5cGU9PT0icmFkaW8iJiZ0IT1udWxsKXtmb3Iocj1lO3IucGFyZW50Tm9kZTspcj1yLnBhcmVudE5vZGU7Zm9yKHI9ci5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrdCkrJ11bdHlwZT0icmFkaW8iXScpLHQ9MDt0PHIubGVuZ3RoO3QrKyl7dmFyIG49clt0XTtpZihuIT09ZSYmbi5mb3JtPT09ZS5mb3JtKXt2YXIgbz1sZihuKTtpZighbyl0aHJvdyBFcnJvcihJKDkwKSk7aHcobiksZGgobixvKX19fWJyZWFrO2Nhc2UidGV4dGFyZWEiOnl3KGUscik7YnJlYWs7Y2FzZSJzZWxlY3QiOnQ9ci52YWx1ZSx0IT1udWxsJiZucyhlLCEhci5tdWx0aXBsZSx0LCExKX19O193PU9nO2t3PW5sO3ZhciB4Nj17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbdnUsWWwsbGYsQ3csVHcsT2ddfSxGYT17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6UWksYnVuZGxlVHlwZTowLHZlcnNpb246IjE4LjIuMCIscmVuZGVyZXJQYWNrYWdlTmFtZToicmVhY3QtZG9tIn0sdzY9e2J1bmRsZVR5cGU6RmEuYnVuZGxlVHlwZSx2ZXJzaW9uOkZhLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTpGYS5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOkZhLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRFcnJvckhhbmRsZXI6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOlBvLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9RXcoZSksZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6RmEuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fHk2LGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiJiYoJGE9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLCEkYS5pc0Rpc2FibGVkJiYkYS5zdXBwb3J0c0ZpYmVyKSl0cnl7dGY9JGEuaW5qZWN0KHc2KSxxbj0kYX1jYXRjaHt9dmFyICRhO0ZyLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPXg2O0ZyLmNyZWF0ZVBvcnRhbD1mdW5jdGlvbihlLHQpe3ZhciByPTI8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsO2lmKCFIZyh0KSl0aHJvdyBFcnJvcihJKDIwMCkpO3JldHVybiBnNihlLHQsbnVsbCxyKX07RnIuY3JlYXRlUm9vdD1mdW5jdGlvbihlLHQpe2lmKCFIZyhlKSl0aHJvdyBFcnJvcihJKDI5OSkpO3ZhciByPSExLG49IiIsbz1zUztyZXR1cm4gdCE9bnVsbCYmKHQudW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYocj0hMCksdC5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYobj10LmlkZW50aWZpZXJQcmVmaXgpLHQub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYobz10Lm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9JGcoZSwxLCExLG51bGwsbnVsbCxyLCExLG4sbyksZVtOb109dC5jdXJyZW50LHN1KGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxuZXcgV2codCl9O0ZyLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoZS5ub2RlVHlwZT09PTEpcmV0dXJuIGU7dmFyIHQ9ZS5fcmVhY3RJbnRlcm5hbHM7aWYodD09PXZvaWQgMCl0aHJvdyB0eXBlb2YgZS5yZW5kZXI9PSJmdW5jdGlvbiI/RXJyb3IoSSgxODgpKTooZT1PYmplY3Qua2V5cyhlKS5qb2luKCIsIiksRXJyb3IoSSgyNjgsZSkpKTtyZXR1cm4gZT1Fdyh0KSxlPWU9PT1udWxsP251bGw6ZS5zdGF0ZU5vZGUsZX07RnIuZmx1c2hTeW5jPWZ1bmN0aW9uKGUpe3JldHVybiBubChlKX07RnIuaHlkcmF0ZT1mdW5jdGlvbihlLHQscil7aWYoIWhmKHQpKXRocm93IEVycm9yKEkoMjAwKSk7cmV0dXJuIGdmKG51bGwsZSx0LCEwLHIpfTtGci5oeWRyYXRlUm9vdD1mdW5jdGlvbihlLHQscil7aWYoIUhnKGUpKXRocm93IEVycm9yKEkoNDA1KSk7dmFyIG49ciE9bnVsbCYmci5oeWRyYXRlZFNvdXJjZXN8fG51bGwsbz0hMSxpPSIiLGw9c1M7aWYociE9bnVsbCYmKHIudW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYobz0hMCksci5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYoaT1yLmlkZW50aWZpZXJQcmVmaXgpLHIub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYobD1yLm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9bFModCxudWxsLGUsMSxyPz9udWxsLG8sITEsaSxsKSxlW05vXT10LmN1cnJlbnQsc3UoZSksbilmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKXI9bltlXSxvPXIuX2dldFZlcnNpb24sbz1vKHIuX3NvdXJjZSksdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPT1udWxsP3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bcixvXTp0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChyLG8pO3JldHVybiBuZXcgbWYodCl9O0ZyLnJlbmRlcj1mdW5jdGlvbihlLHQscil7aWYoIWhmKHQpKXRocm93IEVycm9yKEkoMjAwKSk7cmV0dXJuIGdmKG51bGwsZSx0LCExLHIpfTtGci51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGUpe2lmKCFoZihlKSl0aHJvdyBFcnJvcihJKDQwKSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj8obmwoZnVuY3Rpb24oKXtnZihudWxsLG51bGwsZSwhMSxmdW5jdGlvbigpe2UuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsLGVbTm9dPW51bGx9KX0pLCEwKTohMX07RnIudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9T2c7RnIudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oZSx0LHIsbil7aWYoIWhmKHIpKXRocm93IEVycm9yKEkoMjAwKSk7aWYoZT09bnVsbHx8ZS5fcmVhY3RJbnRlcm5hbHM9PT12b2lkIDApdGhyb3cgRXJyb3IoSSgzOCkpO3JldHVybiBnZihlLHQsciwhMSxuKX07RnIudmVyc2lvbj0iMTguMi4wLW5leHQtOWUzYjc3MmI4LTIwMjIwNjA4In0pO3ZhciBsbD1WKChQJCxjUyk9PnsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdVMoKXtpZighKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18+InUifHx0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFIT0iZnVuY3Rpb24iKSl0cnl7X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKHVTKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX11UygpLGNTLmV4cG9ydHM9YVMoKX0pO3ZhciB2Uz1WKFFnPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShRZywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIF9mPWU9PntsZXQgdD1lKyIiO3JldHVybiB0Lmxlbmd0aD09PTE/IjAiK3Q6dH07UWcuZGVmYXVsdD0oZSx0PSJkYXRlIik9PntpZih0eXBlb2YgZT09Im51bWJlciIpe2xldCBvPW5ldyBEYXRlKGUpO2lmKHQ9PT0iZGF0ZSIpcmV0dXJuIG8uZ2V0RGF0ZSgpKyIvIisoby5nZXRNb250aCgpKzEpKyIvIitvLmdldEZ1bGxZZWFyKCk7aWYodD09PSJ0aW1lIilyZXR1cm4gby5nZXRIb3VycygpKyI6IitfZihvLmdldE1pbnV0ZXMoKSk7aWYodD09PSJ0aW1lLXByZWNpc2UiKXJldHVybiBvLmdldEhvdXJzKCkrIjoiK19mKG8uZ2V0TWludXRlcygpKSsiOiIrX2Yoby5nZXRTZWNvbmRzKCkpO2lmKHQ9PT0iZGF0ZS10aW1lLXRleHQiKXJldHVyblxgJHtvLnRvTG9jYWxlRGF0ZVN0cmluZygiZGVmYXVsdCIse2RheToibnVtZXJpYyIsbW9udGg6ImxvbmciLHllYXI6Im51bWVyaWMifSl9LCAke28udG9Mb2NhbGVUaW1lU3RyaW5nKCl9XGA7aWYodD09PSJkYXRlLXRpbWUiKXJldHVybiBvLmdldEhvdXJzKCkrIjoiK19mKG8uZ2V0TWludXRlcygpKSsiICIrby5nZXREYXRlKCkrIi8iKyhvLmdldE1vbnRoKCkrMSkrIi8iK28uZ2V0RnVsbFllYXIoKTtpZih0PT09ImRhdGUtdGltZS1odW1hbiIpe2xldCBpPW5ldyBEYXRlO2lmKGkuZ2V0VGltZSgpPm8uZ2V0VGltZSgpKXt2YXIgcj1NYXRoLmZsb29yKChpLmdldFRpbWUoKS1vLmdldFRpbWUoKSkvMWUzKSxuPXIvMzE1MzZlMztpZihuPjEpe2xldCBsPU1hdGguZmxvb3Iobik7cmV0dXJuXGAke2x9ICR7bD4xPyJ5ZWFycyI6InllYXIifSBhZ29cYH1pZihuPXIvMjU5MmUzLG4+MSl7bGV0IGw9TWF0aC5mbG9vcihuKTtyZXR1cm5cYCR7bH0gJHtsPjE/Im1vbnRocyI6Im1vbnRoIn0gYWdvXGB9aWYobj1yLzg2NDAwLG4+MSl7bGV0IGw9TWF0aC5mbG9vcihuKTtyZXR1cm5cYCR7bH0gJHtsPjE/ImRheXMiOiJkYXkifSBhZ29cYH1pZihuPXIvMzYwMCxuPjEpe2xldCBsPU1hdGguZmxvb3Iobik7cmV0dXJuXGAke2x9ICR7bD4xPyJob3VycyI6ImhvdXIifSBhZ29cYH1pZihuPXIvNjAsbj4xKXtsZXQgbD1NYXRoLmZsb29yKG4pO3JldHVyblxgJHtsfSAke2w+MT8ibWludXRlcyI6Im1pbnV0ZSJ9IGFnb1xgfWlmKHI+MTApe2xldCBsPU1hdGguZmxvb3Iocik7cmV0dXJuXGAke2x9ICR7bD4xPyJzZWNvbmRzIjoic2Vjb25kIn0gYWdvXGB9cmV0dXJuIk5vdyJ9ZWxzZXt2YXIgcj1NYXRoLmZsb29yKChvLmdldFRpbWUoKS1pLmdldFRpbWUoKSkvMWUzKSxuPXIvMzE1MzZlMztpZihuPjEpe2xldCBhPU1hdGguZmxvb3Iobik7cmV0dXJuXGAke2F9ICR7YT4xPyJ5ZWFycyI6InllYXIifSBmcm9tIG5vd1xgfWlmKG49ci8yNTkyZTMsbj4xKXtsZXQgYT1NYXRoLmZsb29yKG4pO3JldHVyblxgJHthfSAke2E+MT8ibW9udGhzIjoibW9udGgifSBmcm9tIG5vd1xgfWlmKG49ci84NjQwMCxuPjEpe2xldCBhPU1hdGguZmxvb3Iobik7cmV0dXJuXGAke2F9ICR7YT4xPyJkYXlzIjoiZGF5In0gZnJvbSBub3dcYH1pZihuPXIvMzYwMCxuPjEpe2xldCBhPU1hdGguZmxvb3Iobik7cmV0dXJuXGAke2F9ICR7YT4xPyJob3VycyI6ImhvdXIifSBmcm9tIG5vd1xgfWlmKG49ci82MCxuPjEpe2xldCBhPU1hdGguZmxvb3Iobik7cmV0dXJuXGAke2F9ICR7YT4xPyJtaW51dGVzIjoibWludXRlIn0gZnJvbSBub3dcYH1pZihyPjEwKXtsZXQgYT1NYXRoLmZsb29yKHIpO3JldHVyblxgJHthfSAke2E+MT8ic2Vjb25kcyI6InNlY29uZCJ9IGZyb20gbm93XGB9cmV0dXJuIk5vdyJ9fXJldHVybiBTdHJpbmcoZSl9ZWxzZSByZXR1cm4gZX19KTt2YXIgU2k9VihUcz0+eyJ1c2Ugc3RyaWN0Ijt2YXIgUDY9VHMmJlRzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO1RzLnByZXR0eURhdGU9dm9pZCAwO3ZhciBNNj1QNih2UygpKTtUcy5wcmV0dHlEYXRlPU02LmRlZmF1bHR9KTt2YXIgRVM9VihFZj0+e3ZhciBUdT1UKCksc2w9W10sejY9KGUsdCxyKT0+e2xldCBuPXIsbz10LGk9bnVsbCxsPTAscz0hMSxhPSExLHU9ITEscD1kPT57bD1kfSxjPSgpPT57dT0hMH0sZj0oKT0+e3UmJmw+NTAmJihzPSEwLGEmJihvLnB1YmFkcygpLnJlZnJlc2goW2VdKSxhPSExLHU9ITEpLHNldFRpbWVvdXQoKCk9Pnt1JiZsPjUwP28ucHViYWRzKCkucmVmcmVzaChbZV0pOmE9ITAscz0hMX0sbikpfTtyZXR1cm57cnVuTG9vcDooKT0+KChpPT09bnVsbHx8IXMpJiYoaT1uZXcgZiksaSksc2V0Vmlld1BlcmNlbnRhZ2U6cCxpbXByZXNzaW9uVmlld2FibGU6YyxhZFNsb3Q6ZX19LEI2PShlLHQscik9PntsZXQgbj16NihlLHQscik7c2wucHVzaChuKX0sRjY9ZT0+e2xldHtzbG90OnQsaW5WaWV3UGVyY2VudGFnZTpyfT1lLG49c2wuZmluZEluZGV4KG89Pm8uYWRTbG90LmdldFNsb3RFbGVtZW50SWQoKT09PXQuZ2V0U2xvdEVsZW1lbnRJZCgpKTtuIT09LTEmJihzbFtuXS5zZXRWaWV3UGVyY2VudGFnZShyKSxzbFtuXS5ydW5Mb29wKCkpfSxiZj1lPT57bGV0e3Nsb3Q6dH09ZSxyPXNsLmZpbmRJbmRleChuPT5uLmFkU2xvdC5nZXRTbG90RWxlbWVudElkKCk9PT10LmdldFNsb3RFbGVtZW50SWQoKSk7ciE9PS0xJiYoc2xbcl0uaW1wcmVzc2lvblZpZXdhYmxlKCksc2xbcl0ucnVuTG9vcCgpKX0sYlM9IiIsWmc9e2dldDooKT0+YlMsc2V0OmU9PmJTPWV9LCQ2PSh7YWRVbml0OmUsbmFtZTp0LHRhcmdldDpyPVtdLHR5cGU6bixzaXplOm8scmVmcmVzaFRpbWVyOmk9MCxldmVudEltcHJlc3Npb25WaWV3YWJsZTpsLGV2ZW50U2xvdE9ubG9hZDpzLGV2ZW50U2xvdFJlbmRlckVuZGVkOmEsZXZlbnRTbG90UmVxdWVzdGVkOnUsZXZlbnRTbG90UmVzcG9uc2VSZWNlaXZlZDpwLGV2ZW50U2xvdFZpc2liaWxpdHlDaGFuZ2VkOmN9KT0+e2xldCBmLGQ9bnVsbCxtPSgpPT57Zi5jbWQucHVzaCgoKT0+e2Q9Zi5kZWZpbmVTbG90KFxgJHtaZy5nZXQoKX0ke2V9XGAsdigpLHQpLmFkZFNlcnZpY2UoZi5wdWJhZHMoKSksZygpLFMoZCkseSgpLGYuZW5hYmxlU2VydmljZXMoKSxmLmRpc3BsYXkodCl9KX0saD0oKT0+e2YuY21kLnB1c2goKCk9PntkPWYuZGVmaW5lT3V0T2ZQYWdlU2xvdChcYCR7WmcuZ2V0KCl9JHtlfVxgLGYuZW51bXMuT3V0T2ZQYWdlRm9ybWF0W25dKSxkJiYoZC5zZXRUYXJnZXRpbmcoInR5cGUiLG4pLGQuYWRkU2VydmljZShmLnB1YmFkcygpKSxmLnB1YmFkcygpLmVuYWJsZVNpbmdsZVJlcXVlc3QoKSxmLmVuYWJsZVNlcnZpY2VzKCkpfSl9LFM9Qz0+e2YucHViYWRzKCkuYWRkRXZlbnRMaXN0ZW5lcigic2xvdE9ubG9hZCIsaz0+e2suc2xvdD09PUMmJihzJiZzKGspLGkmJkI2KGsuc2xvdCxmLE51bWJlcihpKSkpfSksZi5wdWJhZHMoKS5hZGRFdmVudExpc3RlbmVyKCJzbG90VmlzaWJpbGl0eUNoYW5nZWQiLGs9PntrLnNsb3Q9PT1DJiYoYyYmYyhrKSxpJiZGNihrKSl9KSxmLnB1YmFkcygpLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb25WaWV3YWJsZSIsaz0+e2suc2xvdD09PUMmJihsJiZsKGspLGkmJmJmKGspKX0pLGEmJmYucHViYWRzKCkuYWRkRXZlbnRMaXN0ZW5lcigic2xvdFJlbmRlckVuZGVkIixrPT57ay5zbG90PT09QyYmKGEmJmEoayksaSYmYmYoaykpfSksdSYmZi5wdWJhZHMoKS5hZGRFdmVudExpc3RlbmVyKCJldmVudFNsb3RSZXF1ZXN0ZWQiLGs9PntrLnNsb3Q9PT1DJiYodSYmdShrKSxpJiZiZihrKSl9KSxwJiZmLnB1YmFkcygpLmFkZEV2ZW50TGlzdGVuZXIoImV2ZW50U2xvdFJlc3BvbnNlUmVjZWl2ZWQiLGs9PntrLnNsb3Q9PT1DJiYocCYmcChrKSxpJiZiZihrKSl9KX0seT0oKT0+e3IuZm9yRWFjaChDPT5kLnNldFRhcmdldGluZyhDWzBdLENbMV0pKX0sdj0oKT0+e2xldCBDPW87cmV0dXJuIHR5cGVvZiBDPT0ib2JqZWN0IiYmdHlwZW9mIENbMF1bMV09PSJvYmplY3QiP0MubWFwKGs9PltrWzBdLGtbMV1dKTpvfSxnPSgpPT57bGV0IEM9bztpZighKHR5cGVvZiBDPT0ib2JqZWN0IiYmdHlwZW9mIENbMF1bMV09PSJvYmplY3QiKSlyZXR1cm47bGV0IGs9Zi5zaXplTWFwcGluZygpO0MuZm9yRWFjaChEPT5rPWsuYWRkU2l6ZShEWzBdLERbMV0pKSxrPWsuYnVpbGQoKSxkLmRlZmluZVNpemVNYXBwaW5nKGspfTtyZXR1cm4gVHUudXNlRWZmZWN0KCgpPT57d2luZG93Lmdvb2dsZXRhZz13aW5kb3cuZ29vZ2xldGFnfHx7Y21kOltdfSxmPXdpbmRvdy5nb29nbGV0YWcsZi5jbWQucHVzaCgoKT0+e24/aCgpOm0oKX0pfSxbXSksVHUudXNlRWZmZWN0KCgpPT4oKT0+e2QmJmYuZGVzdHJveVNsb3RzKFtkXSl9LFtdKSxuP251bGw6VHUuY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6dH0pfSxqNj0oe25ldHdvcmtDb2RlOmUsdGFyZ2V0OnQ9W10sZW5hYmxlTGF6eUxvYWQ6cixlbmFibGVTaW5nbGVSZXF1ZXN0Om4sY29sbGFwc2VFbXB0eURpdnM6byxldmVudEltcHJlc3Npb25WaWV3YWJsZTppLGV2ZW50U2xvdE9ubG9hZDpsLGV2ZW50U2xvdFJlbmRlckVuZGVkOnMsZXZlbnRTbG90UmVxdWVzdGVkOmEsZXZlbnRTbG90UmVzcG9uc2VSZWNlaXZlZDp1LGV2ZW50U2xvdFZpc2liaWxpdHlDaGFuZ2VkOnB9KT0+e2xldCBjLGY9KCk9PntlJiZaZy5zZXQoZSksciYmYy5wdWJhZHMoKS5lbmFibGVMYXp5TG9hZChyKSxvJiZjLnB1YmFkcygpLmNvbGxhcHNlRW1wdHlEaXZzKCEwKSxuJiZjLnB1YmFkcygpLmVuYWJsZVNpbmdsZVJlcXVlc3QoKX0sZD0oKT0+e3QuZm9yRWFjaChoPT5jLnB1YmFkcygpLnNldFRhcmdldGluZyhoWzBdLGhbMV0pKX0sbT0oKT0+e2MucHViYWRzKCkuYWRkRXZlbnRMaXN0ZW5lcigic2xvdE9ubG9hZCIsaD0+e2wmJmwoaCl9KSxjLnB1YmFkcygpLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RWaXNpYmlsaXR5Q2hhbmdlZCIsaD0+e3AmJnAoaCl9KSxjLnB1YmFkcygpLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb25WaWV3YWJsZSIsaD0+e2kmJmkoaCl9KSxzJiZjLnB1YmFkcygpLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RSZW5kZXJFbmRlZCIscyksYSYmYy5wdWJhZHMoKS5hZGRFdmVudExpc3RlbmVyKCJzbG90UmVxdWVzdGVkIixhKSx1JiZjLnB1YmFkcygpLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RSZXNwb25zZVJlY2VpdmVkIix1KX07cmV0dXJuIFR1LnVzZUVmZmVjdCgoKT0+e3dpbmRvdy5nb29nbGV0YWc9d2luZG93Lmdvb2dsZXRhZ3x8e2NtZDpbXX0sYz13aW5kb3cuZ29vZ2xldGFnLGMuY21kLnB1c2goKCk9PntmKCksbSgpLGQoKSxjLmVuYWJsZVNlcnZpY2VzKCl9KX0sW10pLG51bGx9LFc2PSgpPT5UdS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiLHthc3luYzohMCxzcmM6Imh0dHBzOi8vc2VjdXJlcHViYWRzLmcuZG91YmxlY2xpY2submV0L3RhZy9qcy9ncHQuanMifSk7RWYuQWQ9JDY7RWYuQWRDb25maWc9ajY7RWYuQWRTY3JpcHQ9VzZ9KTt2YXIgTFM9VihMZj0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoTGYsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO0xmLmRlZmF1bHQ9dm9pZCAwO3ZhciBVNj1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKXJbbl09YXJndW1lbnRzW25dO2lmKHR5cGVvZiB3aW5kb3c8InUiKXt2YXIgbzt0eXBlb2Ygd2luZG93Lmd0YWc+InUiJiYod2luZG93LmRhdGFMYXllcj13aW5kb3cuZGF0YUxheWVyfHxbXSx3aW5kb3cuZ3RhZz1mdW5jdGlvbigpe3dpbmRvdy5kYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSksKG89d2luZG93KS5ndGFnLmFwcGx5KG8scil9fSxWNj1VNjtMZi5kZWZhdWx0PVY2fSk7dmFyIEFTPVYoZTA9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUwLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlMC5kZWZhdWx0PVk2O3ZhciBSNj0vXihhfGFufGFuZHxhc3xhdHxidXR8Ynl8ZW58Zm9yfGlmfGlufG5vcnxvZnxvbnxvcnxwZXJ8dGhlfHRvfHZzP1wuP3x2aWEpJC9pO2Z1bmN0aW9uIEc2KGUpe3JldHVybiBlLnRvU3RyaW5nKCkudHJpbSgpLnJlcGxhY2UoL1tBLVphLXowLTlcdTAwQzAtXHUwMEZGXStbXlxzLV0qL2csZnVuY3Rpb24odCxyLG4pe3JldHVybiByPjAmJnIrdC5sZW5ndGghPT1uLmxlbmd0aCYmdC5zZWFyY2goUjYpPi0xJiZuLmNoYXJBdChyLTIpIT09IjoiJiYobi5jaGFyQXQocit0Lmxlbmd0aCkhPT0iLSJ8fG4uY2hhckF0KHItMSk9PT0iLSIpJiZuLmNoYXJBdChyLTEpLnNlYXJjaCgvW15ccy1dLyk8MD90LnRvTG93ZXJDYXNlKCk6dC5zdWJzdHIoMSkuc2VhcmNoKC9bQS1aXXxcLi4vKT4tMT90OnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSl9KX1mdW5jdGlvbiBxNihlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciJiZlLmluZGV4T2YoIkAiKSE9PS0xfXZhciBRNj0iUkVEQUNURUQgKFBvdGVudGlhbCBFbWFpbCBBZGRyZXNzKSI7ZnVuY3Rpb24gSzYoZSl7cmV0dXJuIHE2KGUpPyhjb25zb2xlLndhcm4oIlRoaXMgYXJnIGxvb2tzIGxpa2UgYW4gZW1haWwgYWRkcmVzcywgcmVkYWN0aW5nLiIpLFE2KTplfWZ1bmN0aW9uIFk2KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIiLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiEwLG49ZXx8IiI7cmV0dXJuIHQmJihuPUc2KGUpKSxyJiYobj1LNihuKSksbn19KTt2YXIgalM9VihNcz0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoTXMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO01zLmRlZmF1bHQ9TXMuR0E0PXZvaWQgMDt2YXIgWDY9elMoTFMoKSksdDA9elMoQVMoKSksWjY9WyJldmVudENhdGVnb3J5IiwiZXZlbnRBY3Rpb24iLCJldmVudExhYmVsIiwiZXZlbnRWYWx1ZSIsImhpdFR5cGUiXSxKNj1bInRpdGxlIiwibG9jYXRpb24iXSxlNT1bInBhZ2UiLCJoaXRUeXBlIl07ZnVuY3Rpb24gelMoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fWZ1bmN0aW9uIHIwKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgcj10NShlLHQpLG4sbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspbj1pW29dLCEodC5pbmRleE9mKG4pPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsbikmJihyW25dPWVbbl0pfXJldHVybiByfWZ1bmN0aW9uIHQ1KGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgcj17fSxuPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKW89bltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihyW29dPWVbb10pO3JldHVybiByfWZ1bmN0aW9uIFBzKGUpeyJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7cmV0dXJuIFBzPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxQcyhlKX1mdW5jdGlvbiBFcyhlKXtyZXR1cm4gbzUoZSl8fG41KGUpfHxCUyhlKXx8cjUoKX1mdW5jdGlvbiByNSgpe3Rocm93IG5ldyBUeXBlRXJyb3IoXGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlxgKX1mdW5jdGlvbiBuNShlKXtpZih0eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdIT1udWxsfHxlWyJAQGl0ZXJhdG9yIl0hPW51bGwpcmV0dXJuIEFycmF5LmZyb20oZSl9ZnVuY3Rpb24gbzUoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gbjAoZSl9ZnVuY3Rpb24gRFMoZSx0KXt2YXIgcj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKG8pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbykuZW51bWVyYWJsZX0pKSxyLnB1c2guYXBwbHkocixuKX1yZXR1cm4gcn1mdW5jdGlvbiBEbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgcj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9EUyhPYmplY3QociksITApLmZvckVhY2goZnVuY3Rpb24obil7d3QoZSxuLHJbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSk6RFMoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLG4pKX0pfXJldHVybiBlfWZ1bmN0aW9uIGk1KGUsdCl7cmV0dXJuIGE1KGUpfHxzNShlLHQpfHxCUyhlLHQpfHxsNSgpfWZ1bmN0aW9uIGw1KCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cYCl9ZnVuY3Rpb24gQlMoZSx0KXtpZihlKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIG4wKGUsdCk7dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpO2lmKHI9PT0iT2JqZWN0IiYmZS5jb25zdHJ1Y3RvciYmKHI9ZS5jb25zdHJ1Y3Rvci5uYW1lKSxyPT09Ik1hcCJ8fHI9PT0iU2V0IilyZXR1cm4gQXJyYXkuZnJvbShlKTtpZihyPT09IkFyZ3VtZW50cyJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBuMChlLHQpfX1mdW5jdGlvbiBuMChlLHQpeyh0PT1udWxsfHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgcj0wLG49bmV3IEFycmF5KHQpO3I8dDtyKyspbltyXT1lW3JdO3JldHVybiBufWZ1bmN0aW9uIHM1KGUsdCl7dmFyIHI9ZT09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZihyIT1udWxsKXt2YXIgbixvLGksbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYoaT0ocj1yLmNhbGwoZSkpLm5leHQsdD09PTApe2lmKE9iamVjdChyKSE9PXIpcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0obj1pLmNhbGwocikpLmRvbmUpJiYocy5wdXNoKG4udmFsdWUpLHMubGVuZ3RoIT09dCk7YT0hMCk7fWNhdGNoKHApe3U9ITAsbz1wfWZpbmFsbHl7dHJ5e2lmKCFhJiZyLnJldHVybiE9bnVsbCYmKGw9ci5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IG99fXJldHVybiBzfX1mdW5jdGlvbiBhNShlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIHU1KGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gT1MoZSx0KXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLEZTKG4ua2V5KSxuKX19ZnVuY3Rpb24gYzUoZSx0LHIpe3JldHVybiB0JiZPUyhlLnByb3RvdHlwZSx0KSxyJiZPUyhlLHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGV9ZnVuY3Rpb24gd3QoZSx0LHIpe3JldHVybiB0PUZTKHQpLHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1yLGV9ZnVuY3Rpb24gRlMoZSl7dmFyIHQ9cDUoZSwic3RyaW5nIik7cmV0dXJuIFBzKHQpPT09InN5bWJvbCI/dDpTdHJpbmcodCl9ZnVuY3Rpb24gcDUoZSx0KXtpZihQcyhlKSE9PSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYociE9PXZvaWQgMCl7dmFyIG49ci5jYWxsKGUsdHx8ImRlZmF1bHQiKTtpZihQcyhuKSE9PSJvYmplY3QiKXJldHVybiBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKHQ9PT0ic3RyaW5nIj9TdHJpbmc6TnVtYmVyKShlKX12YXIgJFM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIHQ9dGhpczt1NSh0aGlzLGUpLHd0KHRoaXMsInJlc2V0IixmdW5jdGlvbigpe3QuaXNJbml0aWFsaXplZD0hMSx0Ll90ZXN0TW9kZT0hMSx0Ll9jdXJyZW50TWVhc3VyZW1lbnRJZCx0Ll9oYXNMb2FkZWRHQT0hMSx0Ll9pc1F1ZXVpbmc9ITEsdC5fcXVldWVHdGFnPVtdfSksd3QodGhpcywiX2d0YWciLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkociksbz0wO288cjtvKyspbltvXT1hcmd1bWVudHNbb107dC5fdGVzdE1vZGV8fHQuX2lzUXVldWluZz90Ll9xdWV1ZUd0YWcucHVzaChuKTpYNi5kZWZhdWx0LmFwcGx5KHZvaWQgMCxuKX0pLHd0KHRoaXMsIl9sb2FkR0EiLGZ1bmN0aW9uKHIsbil7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzIjtpZighKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2YgZG9jdW1lbnQ+InUiKSYmIXQuX2hhc0xvYWRlZEdBKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpLmFzeW5jPSEwLGkuc3JjPSIiLmNvbmNhdChvLCI/aWQ9IikuY29uY2F0KHIpLG4mJmkuc2V0QXR0cmlidXRlKCJub25jZSIsbiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpKSx3aW5kb3cuZGF0YUxheWVyPXdpbmRvdy5kYXRhTGF5ZXJ8fFtdLHdpbmRvdy5ndGFnPWZ1bmN0aW9uKCl7d2luZG93LmRhdGFMYXllci5wdXNoKGFyZ3VtZW50cyl9LHQuX2hhc0xvYWRlZEdBPSEwfX0pLHd0KHRoaXMsIl90b0d0YWdPcHRpb25zIixmdW5jdGlvbihyKXtpZihyKXt2YXIgbj17Y29va2llVXBkYXRlOiJjb29raWVfdXBkYXRlIixjb29raWVFeHBpcmVzOiJjb29raWVfZXhwaXJlcyIsY29va2llRG9tYWluOiJjb29raWVfZG9tYWluIixjb29raWVGbGFnczoiY29va2llX2ZsYWdzIix1c2VySWQ6InVzZXJfaWQiLGNsaWVudElkOiJjbGllbnRfaWQiLGFub255bWl6ZUlwOiJhbm9ueW1pemVfaXAiLGNvbnRlbnRHcm91cDE6ImNvbnRlbnRfZ3JvdXAxIixjb250ZW50R3JvdXAyOiJjb250ZW50X2dyb3VwMiIsY29udGVudEdyb3VwMzoiY29udGVudF9ncm91cDMiLGNvbnRlbnRHcm91cDQ6ImNvbnRlbnRfZ3JvdXA0Iixjb250ZW50R3JvdXA1OiJjb250ZW50X2dyb3VwNSIsYWxsb3dBZEZlYXR1cmVzOiJhbGxvd19nb29nbGVfc2lnbmFscyIsYWxsb3dBZFBlcnNvbmFsaXphdGlvblNpZ25hbHM6ImFsbG93X2FkX3BlcnNvbmFsaXphdGlvbl9zaWduYWxzIixub25JbnRlcmFjdGlvbjoibm9uX2ludGVyYWN0aW9uIixwYWdlOiJwYWdlX3BhdGgiLGhpdENhbGxiYWNrOiJldmVudF9jYWxsYmFjayJ9LG89T2JqZWN0LmVudHJpZXMocikucmVkdWNlKGZ1bmN0aW9uKGksbCl7dmFyIHM9aTUobCwyKSxhPXNbMF0sdT1zWzFdO3JldHVybiBuW2FdP2lbblthXV09dTppW2FdPXUsaX0se30pO3JldHVybiBvfX0pLHd0KHRoaXMsImluaXRpYWxpemUiLGZ1bmN0aW9uKHIpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTtpZighcil0aHJvdyBuZXcgRXJyb3IoIlJlcXVpcmUgR0FfTUVBU1VSRU1FTlRfSUQiKTt2YXIgbz10eXBlb2Ygcj09InN0cmluZyI/W3t0cmFja2luZ0lkOnJ9XTpyO3QuX2N1cnJlbnRNZWFzdXJlbWVudElkPW9bMF0udHJhY2tpbmdJZDt2YXIgaT1uLmdhT3B0aW9ucyxsPW4uZ3RhZ09wdGlvbnMscz1uLm5vbmNlLGE9bi50ZXN0TW9kZSx1PWE9PT12b2lkIDA/ITE6YSxwPW4uZ3RhZ1VybDtpZih0Ll90ZXN0TW9kZT11LHV8fHQuX2xvYWRHQSh0Ll9jdXJyZW50TWVhc3VyZW1lbnRJZCxzLHApLHQuaXNJbml0aWFsaXplZHx8KHQuX2d0YWcoImpzIixuZXcgRGF0ZSksby5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBtPURuKERuKERuKHt9LHQuX3RvR3RhZ09wdGlvbnMoRG4oRG4oe30saSksZC5nYU9wdGlvbnMpKSksbCksZC5ndGFnT3B0aW9ucyk7T2JqZWN0LmtleXMobSkubGVuZ3RoP3QuX2d0YWcoImNvbmZpZyIsZC50cmFja2luZ0lkLG0pOnQuX2d0YWcoImNvbmZpZyIsZC50cmFja2luZ0lkKX0pKSx0LmlzSW5pdGlhbGl6ZWQ9ITAsIXUpe3ZhciBjPUVzKHQuX3F1ZXVlR3RhZyk7Zm9yKHQuX3F1ZXVlR3RhZz1bXSx0Ll9pc1F1ZXVpbmc9ITE7Yy5sZW5ndGg7KXt2YXIgZj1jLnNoaWZ0KCk7dC5fZ3RhZy5hcHBseSh0LEVzKGYpKSxmWzBdPT09ImdldCImJih0Ll9pc1F1ZXVpbmc9ITApfX19KSx3dCh0aGlzLCJzZXQiLGZ1bmN0aW9uKHIpe2lmKCFyKXtjb25zb2xlLndhcm4oIlxgZmllbGRzT2JqZWN0XGAgaXMgcmVxdWlyZWQgaW4gLnNldCgpIik7cmV0dXJufWlmKFBzKHIpIT09Im9iamVjdCIpe2NvbnNvbGUud2FybigiRXhwZWN0ZWQgXGBmaWVsZHNPYmplY3RcYCBhcmcgdG8gYmUgYW4gT2JqZWN0Iik7cmV0dXJufU9iamVjdC5rZXlzKHIpLmxlbmd0aD09PTAmJmNvbnNvbGUud2FybigiZW1wdHkgXGBmaWVsZHNPYmplY3RcYCBnaXZlbiB0byAuc2V0KCkiKSx0Ll9nYUNvbW1hbmQoInNldCIscil9KSx3dCh0aGlzLCJfZ2FDb21tYW5kU2VuZEV2ZW50IixmdW5jdGlvbihyLG4sbyxpLGwpe3QuX2d0YWcoImV2ZW50IixuLERuKERuKHtldmVudF9jYXRlZ29yeTpyLGV2ZW50X2xhYmVsOm8sdmFsdWU6aX0sbCYme25vbl9pbnRlcmFjdGlvbjpsLm5vbkludGVyYWN0aW9ufSksdC5fdG9HdGFnT3B0aW9ucyhsKSkpfSksd3QodGhpcywiX2dhQ29tbWFuZFNlbmRFdmVudFBhcmFtZXRlcnMiLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkociksbz0wO288cjtvKyspbltvXT1hcmd1bWVudHNbb107aWYodHlwZW9mIG5bMF09PSJzdHJpbmciKXQuX2dhQ29tbWFuZFNlbmRFdmVudC5hcHBseSh0LEVzKG4uc2xpY2UoMSkpKTtlbHNle3ZhciBpPW5bMF0sbD1pLmV2ZW50Q2F0ZWdvcnkscz1pLmV2ZW50QWN0aW9uLGE9aS5ldmVudExhYmVsLHU9aS5ldmVudFZhbHVlLHA9aS5oaXRUeXBlLGM9cjAoaSxaNik7dC5fZ2FDb21tYW5kU2VuZEV2ZW50KGwscyxhLHUsYyl9fSksd3QodGhpcywiX2dhQ29tbWFuZFNlbmRUaW1pbmciLGZ1bmN0aW9uKHIsbixvLGkpe3QuX2d0YWcoImV2ZW50IiwidGltaW5nX2NvbXBsZXRlIix7bmFtZTpuLHZhbHVlOm8sZXZlbnRfY2F0ZWdvcnk6cixldmVudF9sYWJlbDppfSl9KSx3dCh0aGlzLCJfZ2FDb21tYW5kU2VuZFBhZ2V2aWV3IixmdW5jdGlvbihyLG4pe2lmKG4mJk9iamVjdC5rZXlzKG4pLmxlbmd0aCl7dmFyIG89dC5fdG9HdGFnT3B0aW9ucyhuKSxpPW8udGl0bGUsbD1vLmxvY2F0aW9uLHM9cjAobyxKNik7dC5fZ3RhZygiZXZlbnQiLCJwYWdlX3ZpZXciLERuKERuKERuKERuKHt9LHImJntwYWdlX3BhdGg6cn0pLGkmJntwYWdlX3RpdGxlOml9KSxsJiZ7cGFnZV9sb2NhdGlvbjpsfSkscykpfWVsc2Ugcj90Ll9ndGFnKCJldmVudCIsInBhZ2VfdmlldyIse3BhZ2VfcGF0aDpyfSk6dC5fZ3RhZygiZXZlbnQiLCJwYWdlX3ZpZXciKX0pLHd0KHRoaXMsIl9nYUNvbW1hbmRTZW5kUGFnZXZpZXdQYXJhbWV0ZXJzIixmdW5jdGlvbigpe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHIpLG89MDtvPHI7bysrKW5bb109YXJndW1lbnRzW29dO2lmKHR5cGVvZiBuWzBdPT0ic3RyaW5nIil0Ll9nYUNvbW1hbmRTZW5kUGFnZXZpZXcuYXBwbHkodCxFcyhuLnNsaWNlKDEpKSk7ZWxzZXt2YXIgaT1uWzBdLGw9aS5wYWdlLHM9aS5oaXRUeXBlLGE9cjAoaSxlNSk7dC5fZ2FDb21tYW5kU2VuZFBhZ2V2aWV3KGwsYSl9fSksd3QodGhpcywiX2dhQ29tbWFuZFNlbmQiLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkociksbz0wO288cjtvKyspbltvXT1hcmd1bWVudHNbb107dmFyIGk9dHlwZW9mIG5bMF09PSJzdHJpbmciP25bMF06blswXS5oaXRUeXBlO3N3aXRjaChpKXtjYXNlImV2ZW50Ijp0Ll9nYUNvbW1hbmRTZW5kRXZlbnRQYXJhbWV0ZXJzLmFwcGx5KHQsbik7YnJlYWs7Y2FzZSJwYWdldmlldyI6dC5fZ2FDb21tYW5kU2VuZFBhZ2V2aWV3UGFyYW1ldGVycy5hcHBseSh0LG4pO2JyZWFrO2Nhc2UidGltaW5nIjp0Ll9nYUNvbW1hbmRTZW5kVGltaW5nLmFwcGx5KHQsRXMobi5zbGljZSgxKSkpO2JyZWFrO2Nhc2Uic2NyZWVudmlldyI6Y2FzZSJ0cmFuc2FjdGlvbiI6Y2FzZSJpdGVtIjpjYXNlInNvY2lhbCI6Y2FzZSJleGNlcHRpb24iOmNvbnNvbGUud2FybigiVW5zdXBwb3J0ZWQgc2VuZCBjb21tYW5kOiAiLmNvbmNhdChpKSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlNlbmQgY29tbWFuZCBkb2Vzbid0IGV4aXN0OiAiLmNvbmNhdChpKSl9fSksd3QodGhpcywiX2dhQ29tbWFuZFNldCIsZnVuY3Rpb24oKXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShyKSxvPTA7bzxyO28rKyluW29dPWFyZ3VtZW50c1tvXTt0eXBlb2YgblswXT09InN0cmluZyImJihuWzBdPXd0KHt9LG5bMF0sblsxXSkpLHQuX2d0YWcoInNldCIsdC5fdG9HdGFnT3B0aW9ucyhuWzBdKSl9KSx3dCh0aGlzLCJfZ2FDb21tYW5kIixmdW5jdGlvbihyKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKW9baS0xXT1hcmd1bWVudHNbaV07c3dpdGNoKHIpe2Nhc2Uic2VuZCI6dC5fZ2FDb21tYW5kU2VuZC5hcHBseSh0LG8pO2JyZWFrO2Nhc2Uic2V0Ijp0Ll9nYUNvbW1hbmRTZXQuYXBwbHkodCxvKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiQ29tbWFuZCBkb2Vzbid0IGV4aXN0OiAiLmNvbmNhdChyKSl9fSksd3QodGhpcywiZ2EiLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkociksbz0wO288cjtvKyspbltvXT1hcmd1bWVudHNbb107aWYodHlwZW9mIG5bMF09PSJzdHJpbmciKXQuX2dhQ29tbWFuZC5hcHBseSh0LG4pO2Vsc2V7dmFyIGk9blswXTt0Ll9ndGFnKCJnZXQiLHQuX2N1cnJlbnRNZWFzdXJlbWVudElkLCJjbGllbnRfaWQiLGZ1bmN0aW9uKGwpe3QuX2lzUXVldWluZz0hMTt2YXIgcz10Ll9xdWV1ZUd0YWc7Zm9yKGkoe2dldDpmdW5jdGlvbihwKXtyZXR1cm4gcD09PSJjbGllbnRJZCI/bDpwPT09InRyYWNraW5nSWQiP3QuX2N1cnJlbnRNZWFzdXJlbWVudElkOnA9PT0iYXBpVmVyc2lvbiI/IjEiOnZvaWQgMH19KTtzLmxlbmd0aDspe3ZhciBhPXMuc2hpZnQoKTt0Ll9ndGFnLmFwcGx5KHQsRXMoYSkpfX0pLHQuX2lzUXVldWluZz0hMH1yZXR1cm4gdC5nYX0pLHd0KHRoaXMsImV2ZW50IixmdW5jdGlvbihyLG4pe2lmKHR5cGVvZiByPT0ic3RyaW5nIil0Ll9ndGFnKCJldmVudCIscix0Ll90b0d0YWdPcHRpb25zKG4pKTtlbHNle3ZhciBvPXIuYWN0aW9uLGk9ci5jYXRlZ29yeSxsPXIubGFiZWwscz1yLnZhbHVlLGE9ci5ub25JbnRlcmFjdGlvbix1PXIudHJhbnNwb3J0O2lmKCFpfHwhbyl7Y29uc29sZS53YXJuKCJhcmdzLmNhdGVnb3J5IEFORCBhcmdzLmFjdGlvbiBhcmUgcmVxdWlyZWQgaW4gZXZlbnQoKSIpO3JldHVybn12YXIgcD17aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6KDAsdDAuZGVmYXVsdCkoaSksZXZlbnRBY3Rpb246KDAsdDAuZGVmYXVsdCkobyl9O2wmJihwLmV2ZW50TGFiZWw9KDAsdDAuZGVmYXVsdCkobCkpLHR5cGVvZiBzPCJ1IiYmKHR5cGVvZiBzIT0ibnVtYmVyIj9jb25zb2xlLndhcm4oIkV4cGVjdGVkIFxgYXJncy52YWx1ZVxgIGFyZyB0byBiZSBhIE51bWJlci4iKTpwLmV2ZW50VmFsdWU9cyksdHlwZW9mIGE8InUiJiYodHlwZW9mIGEhPSJib29sZWFuIj9jb25zb2xlLndhcm4oIlxgYXJncy5ub25JbnRlcmFjdGlvblxgIG11c3QgYmUgYSBib29sZWFuLiIpOnAubm9uSW50ZXJhY3Rpb249YSksdHlwZW9mIHU8InUiJiYodHlwZW9mIHUhPSJzdHJpbmciP2NvbnNvbGUud2FybigiXGBhcmdzLnRyYW5zcG9ydFxgIG11c3QgYmUgYSBzdHJpbmcuIik6KFsiYmVhY29uIiwieGhyIiwiaW1hZ2UiXS5pbmRleE9mKHUpPT09LTEmJmNvbnNvbGUud2FybigiXGBhcmdzLnRyYW5zcG9ydFxgIG11c3QgYmUgZWl0aGVyIG9uZSBvZiB0aGVzZSB2YWx1ZXM6IFxgYmVhY29uXGAsIFxgeGhyXGAgb3IgXGBpbWFnZVxgIikscC50cmFuc3BvcnQ9dSkpLHQuX2dhQ29tbWFuZCgic2VuZCIscCl9fSksd3QodGhpcywic2VuZCIsZnVuY3Rpb24ocil7dC5fZ2FDb21tYW5kKCJzZW5kIixyKX0pLHRoaXMucmVzZXQoKX1yZXR1cm4gYzUoZSxbe2tleToiZ3RhZyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9ndGFnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19XSksZX0oKTtNcy5HQTQ9JFM7dmFyIGY1PW5ldyAkUztNcy5kZWZhdWx0PWY1fSk7dmFyIGkwPVYoSXM9PnsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbzAoZSl7IkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjtyZXR1cm4gbzA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LG8wKGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShJcywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7SXMuZGVmYXVsdD1Jcy5SZWFjdEdBSW1wbGVtZW50YXRpb249dm9pZCAwO3ZhciBXUz1kNShqUygpKTtmdW5jdGlvbiBIUyhlKXtpZih0eXBlb2YgV2Vha01hcCE9ImZ1bmN0aW9uIilyZXR1cm4gbnVsbDt2YXIgdD1uZXcgV2Vha01hcCxyPW5ldyBXZWFrTWFwO3JldHVybihIUz1mdW5jdGlvbihvKXtyZXR1cm4gbz9yOnR9KShlKX1mdW5jdGlvbiBkNShlLHQpe2lmKCF0JiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7aWYoZT09PW51bGx8fG8wKGUpIT09Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXJldHVybntkZWZhdWx0OmV9O3ZhciByPUhTKHQpO2lmKHImJnIuaGFzKGUpKXJldHVybiByLmdldChlKTt2YXIgbj17fSxvPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtmb3IodmFyIGkgaW4gZSlpZihpIT09ImRlZmF1bHQiJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSl7dmFyIGw9bz9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsaSk6bnVsbDtsJiYobC5nZXR8fGwuc2V0KT9PYmplY3QuZGVmaW5lUHJvcGVydHkobixpLGwpOm5baV09ZVtpXX1yZXR1cm4gbi5kZWZhdWx0PWUsciYmci5zZXQoZSxuKSxufXZhciBtNT1XUy5HQTQ7SXMuUmVhY3RHQUltcGxlbWVudGF0aW9uPW01O3ZhciBoNT1XUy5kZWZhdWx0O0lzLmRlZmF1bHQ9aDV9KTt2YXIgZkM9VihWZj0+eyJ1c2Ugc3RyaWN0Ijt2YXIgY0M9VCgpO2Z1bmN0aW9uIEM1KGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tyXSk7dGhyb3cgRXJyb3IoXGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXGApfXZhciBwQz1jQy5jcmVhdGVDb250ZXh0KG51bGwpO1ZmLkxleGljYWxDb21wb3NlckNvbnRleHQ9cEM7VmYuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbihlLHQpe2xldCByPW51bGw7cmV0dXJuIGUhPW51bGwmJihyPWVbMV0pLHtnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiB0Pz8ociE9bnVsbD9yLmdldFRoZW1lKCk6bnVsbCl9fX07VmYudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbigpe2xldCBlPWNDLnVzZUNvbnRleHQocEMpO3JldHVybiBlPT1udWxsJiZDNSg4KSxlfX0pO3ZhciBBbz1WKCh6cmUsZEMpPT57InVzZSBzdHJpY3QiO3ZhciBUNT1mQygpO2RDLmV4cG9ydHM9VDV9KTt2YXIgaEM9VihtQz0+eyJ1c2Ugc3RyaWN0Ijt2YXIgXzU9QW8oKSxrNT1UKCk7bUMuQXV0b0ZvY3VzUGx1Z2luPWZ1bmN0aW9uKHtkZWZhdWx0U2VsZWN0aW9uOmV9KXtsZXRbdF09XzUudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBrNS51c2VFZmZlY3QoKCk9Pnt0LmZvY3VzKCgpPT57bGV0IHI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxuPXQuZ2V0Um9vdEVsZW1lbnQoKTtuPT09bnVsbHx8ciE9PW51bGwmJm4uY29udGFpbnMocil8fG4uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0se2RlZmF1bHRTZWxlY3Rpb246ZX0pfSxbZSx0XSksbnVsbH19KTt2YXIgeUM9VigoRnJlLGdDKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgTjU9aEMoKTtnQy5leHBvcnRzPU41fSk7dmFyIFJUPVYoRT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgZGQ9e30sSEM9e30sRnU9e30sQXU9e30sQTA9e30sQnM9e30sdHk9e30sRDA9e30sJHU9e30sanU9e30sTmk9e30scnk9e30sbnk9e30sVUM9e30sVkM9e30sUkM9e30sR0M9e30scUM9e30sUUM9e30sS0M9e30sWWY9e30sWUM9e30sWEM9e30sWkM9e30sSkM9e30sZVQ9e30sdFQ9e30sclQ9e30sblQ9e30sb1Q9e30sb3k9e30saXk9e30sTzA9e30saVQ9e30sbFQ9e30sc1Q9e307ZnVuY3Rpb24geihlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbcl0pO3Rocm93IEVycm9yKFxgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlxgKX12YXIgQm89dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLGI1PUJvJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50TW9kZTpudWxsLHJyPUJvJiYvTWFjfGlQb2R8aVBob25lfGlQYWQvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKSxFaT1CbyYmL14oPyEuKlNlYW1vbmtleSkoPz0uKkZpcmVmb3gpLiovaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLFhmPUJvJiYiSW5wdXRFdmVudCJpbiB3aW5kb3cmJiFiNT8iZ2V0VGFyZ2V0UmFuZ2VzImluIG5ldyB3aW5kb3cuSW5wdXRFdmVudCgiaW5wdXQiKTohMSxseT1CbyYmL1ZlcnNpb25cL1tcZC5dKy4qU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLG1kPUJvJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbSxFNT1CbyYmL14oPz0uKkNocm9tZSkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksc3k9Qm8mJi9BcHBsZVdlYktpdFwvW1xkLl0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhRTUsaGQ9bHl8fG1kfHxzeT8iXHhBMCI6Ilx1MjAwQiIsUDU9RWk/Ilx4QTAiOmhkLE01PS9eW15BLVphLXpcdTAwYzAtXHUwMGQ2XHUwMGQ4LVx1MDBmNlx1MDBmOC1cdTAyYjhcdTAzMDAtXHUwNTkwXHUwODAwLVx1MWZmZlx1MjAwZVx1MmMwMC1cdWZiMWNcdWZlMDAtXHVmZTZmXHVmZWZkLVx1ZmZmZl0qW1x1MDU5MS1cdTA3ZmZcdWZiMWQtXHVmZGZkXHVmZTcwLVx1ZmVmY10vLEk1PS9eW15cdTA1OTEtXHUwN2ZmXHVmYjFkLVx1ZmRmZFx1ZmU3MC1cdWZlZmNdKltBLVphLXpcdTAwYzAtXHUwMGQ2XHUwMGQ4LVx1MDBmNlx1MDBmOC1cdTAyYjhcdTAzMDAtXHUwNTkwXHUwODAwLVx1MWZmZlx1MjAwZVx1MmMwMC1cdWZiMWNcdWZlMDAtXHVmZTZmXHVmZWZkLVx1ZmZmZl0vLGNsPXtib2xkOjEsY29kZToxNixoaWdobGlnaHQ6MTI4LGl0YWxpYzoyLHN0cmlrZXRocm91Z2g6NCxzdWJzY3JpcHQ6MzIsc3VwZXJzY3JpcHQ6NjQsdW5kZXJsaW5lOjh9LEw1PXtkaXJlY3Rpb25sZXNzOjEsdW5tZXJnZWFibGU6Mn0sdkM9e2NlbnRlcjoyLGVuZDo2LGp1c3RpZnk6NCxsZWZ0OjEscmlnaHQ6MyxzdGFydDo1fSxBNT17MjoiY2VudGVyIiw2OiJlbmQiLDQ6Imp1c3RpZnkiLDE6ImxlZnQiLDM6InJpZ2h0Iiw1OiJzdGFydCJ9LEQ1PXtub3JtYWw6MCxzZWdtZW50ZWQ6Mix0b2tlbjoxfSxPNT17MDoibm9ybWFsIiwyOiJzZWdtZW50ZWQiLDE6InRva2VuIn0sejA9ITEsYXk9MDtmdW5jdGlvbiB6NShlKXtheT1lLnRpbWVTdGFtcH1mdW5jdGlvbiBUMChlLHQscil7cmV0dXJuIHQuX19sZXhpY2FsTGluZUJyZWFrPT09ZXx8ZVtcYF9fbGV4aWNhbEtleV8ke3IuX2tleX1cYF0hPT12b2lkIDB9ZnVuY3Rpb24gQjUoZSl7cmV0dXJuIGUuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57bGV0IHQ9QWUoKTtyZXR1cm4gdCE9PW51bGw/dC5jbG9uZSgpOm51bGx9KX1mdW5jdGlvbiBhVChlLHQscil7ejA9ITA7bGV0IG49MTAwPHBlcmZvcm1hbmNlLm5vdygpLWF5O3RyeXtVcihlLCgpPT57bGV0IG89QWUoKXx8QjUoZSk7dmFyIGk9bmV3IE1hcCxsPWUuZ2V0Um9vdEVsZW1lbnQoKSxzPWUuX2VkaXRvclN0YXRlLGE9ZS5fYmxvY2tDdXJzb3JFbGVtZW50O2xldCB1PSExLHA9IiI7Zm9yKHZhciBjPTA7Yzx0Lmxlbmd0aDtjKyspe3ZhciBmPXRbY10sZD1mLnR5cGUsbT1mLnRhcmdldCxoPUt1KG0scyk7aWYoIShoPT09bnVsbCYmbSE9PWx8fExlKGgpKSl7aWYoZD09PSJjaGFyYWN0ZXJEYXRhIil7aWYoZj1uJiZGKGgpKWU6e2Y9byxkPW07dmFyIFM9aDtpZihRKGYpKXt2YXIgeT1mLmFuY2hvci5nZXROb2RlKCk7aWYoeS5pcyhTKSYmZi5mb3JtYXQhPT15LmdldEZvcm1hdCgpKXtmPSExO2JyZWFrIGV9fWY9ZC5ub2RlVHlwZT09PTMmJlMuaXNBdHRhY2hlZCgpfWYmJihTPXJvKGUuX3dpbmRvdyksZD1mPW51bGwsUyE9PW51bGwmJlMuYW5jaG9yTm9kZT09PW0mJihmPVMuYW5jaG9yT2Zmc2V0LGQ9Uy5mb2N1c09mZnNldCksbT1tLm5vZGVWYWx1ZSxtIT09bnVsbCYmbXkoaCxtLGYsZCwhMSkpfWVsc2UgaWYoZD09PSJjaGlsZExpc3QiKXtmb3IodT0hMCxkPWYuYWRkZWROb2RlcyxTPTA7UzxkLmxlbmd0aDtTKyspe3k9ZFtTXTt2YXIgdj1oVCh5KSxnPXkucGFyZW50Tm9kZTtnPT1udWxsfHx5PT09YXx8diE9PW51bGx8fHkubm9kZU5hbWU9PT0iQlIiJiZUMCh5LGcsZSl8fChFaSYmKHY9eS5pbm5lclRleHR8fHkubm9kZVZhbHVlKSYmKHArPXYpLGcucmVtb3ZlQ2hpbGQoeSkpfWlmKGY9Zi5yZW1vdmVkTm9kZXMsZD1mLmxlbmd0aCwwPGQpe2ZvcihTPTAseT0wO3k8ZDt5KyspZz1mW3ldLChnLm5vZGVOYW1lPT09IkJSIiYmVDAoZyxtLGUpfHxhPT09ZykmJihtLmFwcGVuZENoaWxkKGcpLFMrKyk7ZCE9PVMmJihtPT09bCYmKGg9cy5fbm9kZU1hcC5nZXQoInJvb3QiKSksaS5zZXQobSxoKSl9fX19aWYoMDxpLnNpemUpZm9yKGxldFtDLGtdb2YgaSlpZihNKGspKWZvcihpPWsuZ2V0Q2hpbGRyZW5LZXlzKCksbD1DLmZpcnN0Q2hpbGQscz0wO3M8aS5sZW5ndGg7cysrKWE9ZS5nZXRFbGVtZW50QnlLZXkoaVtzXSksYSE9PW51bGwmJihsPT1udWxsPyhDLmFwcGVuZENoaWxkKGEpLGw9YSk6bCE9PWEmJkMucmVwbGFjZUNoaWxkKGEsbCksbD1sLm5leHRTaWJsaW5nKTtlbHNlIEYoaykmJmsubWFya0RpcnR5KCk7aWYoaT1yLnRha2VSZWNvcmRzKCksMDxpLmxlbmd0aCl7Zm9yKGw9MDtsPGkubGVuZ3RoO2wrKylmb3IoYT1pW2xdLHM9YS5hZGRlZE5vZGVzLGE9YS50YXJnZXQsYz0wO2M8cy5sZW5ndGg7YysrKWg9c1tjXSxtPWgucGFyZW50Tm9kZSxtPT1udWxsfHxoLm5vZGVOYW1lIT09IkJSInx8VDAoaCxhLGUpfHxtLnJlbW92ZUNoaWxkKGgpO3IudGFrZVJlY29yZHMoKX1vIT09bnVsbCYmKHUmJihvLmRpcnR5PSEwLGVvKG8pKSxFaSYmeFQoZSkmJm8uaW5zZXJ0UmF3VGV4dChwKSl9KX1maW5hbGx5e3owPSExfX1mdW5jdGlvbiB1VChlKXtsZXQgdD1lLl9vYnNlcnZlcjtpZih0IT09bnVsbCl7bGV0IHI9dC50YWtlUmVjb3JkcygpO2FUKGUscix0KX19ZnVuY3Rpb24gY1QoZSl7YXk9PT0wJiZ5ZChlKS5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLHo1LCEwKSxlLl9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodCxyKT0+e2FUKGUsdCxyKX0pfWZ1bmN0aW9uIHhDKGUsdCl7bGV0IHI9ZS5fX21vZGUsbj1lLl9fZm9ybWF0O2U9ZS5fX3N0eWxlO2xldCBvPXQuX19tb2RlLGk9dC5fX2Zvcm1hdDtyZXR1cm4gdD10Ll9fc3R5bGUsKHI9PT1udWxsfHxyPT09bykmJihuPT09bnVsbHx8bj09PWkpJiYoZT09PW51bGx8fGU9PT10KX1mdW5jdGlvbiB3QyhlLHQpe2xldCByPWUubWVyZ2VXaXRoU2libGluZyh0KSxuPWplKCkuX25vcm1hbGl6ZWROb2RlcztyZXR1cm4gbi5hZGQoZS5fX2tleSksbi5hZGQodC5fX2tleSkscn1mdW5jdGlvbiBwVChlKXtpZihlLl9fdGV4dD09PSIiJiZlLmlzU2ltcGxlVGV4dCgpJiYhZS5pc1VubWVyZ2VhYmxlKCkpZS5yZW1vdmUoKTtlbHNle2Zvcih2YXIgdDsodD1lLmdldFByZXZpb3VzU2libGluZygpKSE9PW51bGwmJkYodCkmJnQuaXNTaW1wbGVUZXh0KCkmJiF0LmlzVW5tZXJnZWFibGUoKTspaWYodC5fX3RleHQ9PT0iIil0LnJlbW92ZSgpO2Vsc2V7eEModCxlKSYmKGU9d0ModCxlKSk7YnJlYWt9Zm9yKHZhciByOyhyPWUuZ2V0TmV4dFNpYmxpbmcoKSkhPT1udWxsJiZGKHIpJiZyLmlzU2ltcGxlVGV4dCgpJiYhci5pc1VubWVyZ2VhYmxlKCk7KWlmKHIuX190ZXh0PT09IiIpci5yZW1vdmUoKTtlbHNle3hDKGUscikmJndDKGUscik7YnJlYWt9fX1mdW5jdGlvbiB1eShlKXtyZXR1cm4gU0MoZS5hbmNob3IpLFNDKGUuZm9jdXMpLGV9ZnVuY3Rpb24gU0MoZSl7Zm9yKDtlLnR5cGU9PT0iZWxlbWVudCI7KXt2YXIgdD1lLmdldE5vZGUoKSxyPWUub2Zmc2V0O2lmKHI9PT10LmdldENoaWxkcmVuU2l6ZSgpPyh0PXQuZ2V0Q2hpbGRBdEluZGV4KHItMSkscj0hMCk6KHQ9dC5nZXRDaGlsZEF0SW5kZXgocikscj0hMSksRih0KSl7ZS5zZXQodC5fX2tleSxyP3QuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCwidGV4dCIpO2JyZWFrfWVsc2UgaWYoIU0odCkpYnJlYWs7ZS5zZXQodC5fX2tleSxyP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCwiZWxlbWVudCIpfX12YXIgRjU9MSwkNT10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6ZT0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZSl9O2Z1bmN0aW9uIGN5KGUpe2xldCB0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYodD09PW51bGwpcmV0dXJuITE7bGV0IHI9dC5ub2RlTmFtZTtyZXR1cm4gTGUoS3UoZSkpJiYocj09PSJJTlBVVCJ8fHI9PT0iVEVYVEFSRUEifHx0LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYmdC5fX2xleGljYWxFZGl0b3I9PW51bGwpfWZ1bmN0aW9uIFF1KGUsdCxyKXtsZXQgbj1lLmdldFJvb3RFbGVtZW50KCk7dHJ5e3JldHVybiBuIT09bnVsbCYmbi5jb250YWlucyh0KSYmbi5jb250YWlucyhyKSYmdCE9PW51bGwmJiFjeSh0KSYmcHkodCk9PT1lfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBweShlKXtmb3IoO2UhPW51bGw7KXtsZXQgdD1lLl9fbGV4aWNhbEVkaXRvcjtpZih0IT1udWxsKXJldHVybiB0O2U9Z2QoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQjAoZSl7cmV0dXJuIGUuaXNUb2tlbigpfHxlLmlzU2VnbWVudGVkKCl9ZnVuY3Rpb24gWmYoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PTMpcmV0dXJuIGU7ZT1lLmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZlQoZSx0LHIpe3JldHVybiB0PWNsW3RdLGUmdCYmKHI9PT1udWxsfHwhKHImdCkpP2VedDpyPT09bnVsbHx8ciZ0P2V8dDplfWZ1bmN0aW9uIGRUKGUpe3JldHVybiBGKGUpfHxWdShlKXx8TGUoZSl9ZnVuY3Rpb24gbVQoZSx0KXtpZih0IT1udWxsKWUuX19rZXk9dDtlbHNle2hyKCksOTk8UnUmJnooMTQpLHQ9amUoKTt2YXIgcj1ubygpLG49IiIrRjUrKztyLl9ub2RlTWFwLnNldChuLGUpLE0oZSk/dC5fZGlydHlFbGVtZW50cy5zZXQobiwhMCk6dC5fZGlydHlMZWF2ZXMuYWRkKG4pLHQuX2Nsb25lTm90TmVlZGVkLmFkZChuKSx0Ll9kaXJ0eVR5cGU9MSxlLl9fa2V5PW59fWZ1bmN0aW9uIHBsKGUpe3ZhciB0PWUuZ2V0UGFyZW50KCk7aWYodCE9PW51bGwpe2xldCBvPWUuZ2V0V3JpdGFibGUoKTt0PXQuZ2V0V3JpdGFibGUoKTt2YXIgcj1lLmdldFByZXZpb3VzU2libGluZygpO2lmKGU9ZS5nZXROZXh0U2libGluZygpLHI9PT1udWxsKWlmKGUhPT1udWxsKXt2YXIgbj1lLmdldFdyaXRhYmxlKCk7dC5fX2ZpcnN0PWUuX19rZXksbi5fX3ByZXY9bnVsbH1lbHNlIHQuX19maXJzdD1udWxsO2Vsc2V7aWYobj1yLmdldFdyaXRhYmxlKCksZSE9PW51bGwpe2xldCBpPWUuZ2V0V3JpdGFibGUoKTtpLl9fcHJldj1uLl9fa2V5LG4uX19uZXh0PWkuX19rZXl9ZWxzZSBuLl9fbmV4dD1udWxsO28uX19wcmV2PW51bGx9ZT09PW51bGw/ciE9PW51bGw/KGU9ci5nZXRXcml0YWJsZSgpLHQuX19sYXN0PXIuX19rZXksZS5fX25leHQ9bnVsbCk6dC5fX2xhc3Q9bnVsbDooZT1lLmdldFdyaXRhYmxlKCksciE9PW51bGw/KHI9ci5nZXRXcml0YWJsZSgpLHIuX19uZXh0PWUuX19rZXksZS5fX3ByZXY9ci5fX2tleSk6ZS5fX3ByZXY9bnVsbCxvLl9fbmV4dD1udWxsKSx0Ll9fc2l6ZS0tLG8uX19wYXJlbnQ9bnVsbH19ZnVuY3Rpb24gSmYoZSl7OTk8UnUmJnooMTQpO3ZhciB0PWUuZ2V0TGF0ZXN0KCkscj10Ll9fcGFyZW50LG49bm8oKTtsZXQgbz1qZSgpLGk9bi5fbm9kZU1hcDtpZihuPW8uX2RpcnR5RWxlbWVudHMsciE9PW51bGwpZTpmb3IoO3IhPT1udWxsOyl7aWYobi5oYXMocikpYnJlYWsgZTtsZXQgbD1pLmdldChyKTtpZihsPT09dm9pZCAwKWJyZWFrO24uc2V0KHIsITEpLHI9bC5fX3BhcmVudH10PXQuX19rZXksby5fZGlydHlUeXBlPTEsTShlKT9uLnNldCh0LCEwKTpvLl9kaXJ0eUxlYXZlcy5hZGQodCl9ZnVuY3Rpb24gV3QoZSl7aHIoKTt2YXIgdD1qZSgpO2xldCByPXQuX2NvbXBvc2l0aW9uS2V5O2UhPT1yJiYodC5fY29tcG9zaXRpb25LZXk9ZSxyIT09bnVsbCYmKHQ9SXQociksdCE9PW51bGwmJnQuZ2V0V3JpdGFibGUoKSksZSE9PW51bGwmJihlPUl0KGUpLGUhPT1udWxsJiZlLmdldFdyaXRhYmxlKCkpKX1mdW5jdGlvbiBiaSgpe3JldHVybiBHcygpP251bGw6amUoKS5fY29tcG9zaXRpb25LZXl9ZnVuY3Rpb24gSXQoZSx0KXtyZXR1cm4gZT0odHx8bm8oKSkuX25vZGVNYXAuZ2V0KGUpLGU9PT12b2lkIDA/bnVsbDplfWZ1bmN0aW9uIGhUKGUsdCl7bGV0IHI9amUoKTtyZXR1cm4gZT1lW1xgX19sZXhpY2FsS2V5XyR7ci5fa2V5fVxgXSxlIT09dm9pZCAwP0l0KGUsdCk6bnVsbH1mdW5jdGlvbiBLdShlLHQpe2Zvcig7ZSE9bnVsbDspe2xldCByPWhUKGUsdCk7aWYociE9PW51bGwpcmV0dXJuIHI7ZT1nZChlKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBnVChlKXtsZXQgdD1PYmplY3QuYXNzaWduKHt9LGUuX2RlY29yYXRvcnMpO3JldHVybiBlLl9wZW5kaW5nRGVjb3JhdG9ycz10fWZ1bmN0aW9uIENDKGUpe3JldHVybiBlLnJlYWQoKCk9PnRvKCkuZ2V0VGV4dENvbnRlbnQoKSl9ZnVuY3Rpb24gajUoZSx0KXtVcihlLCgpPT57dmFyIHI9bm8oKTtpZighci5pc0VtcHR5KCkpaWYodD09PSJyb290Iil0bygpLm1hcmtEaXJ0eSgpO2Vsc2V7cj1yLl9ub2RlTWFwO2ZvcihsZXRbLG5db2YgciluLm1hcmtEaXJ0eSgpfX0sZS5fcGVuZGluZ0VkaXRvclN0YXRlPT09bnVsbD97dGFnOiJoaXN0b3J5LW1lcmdlIn06dm9pZCAwKX1mdW5jdGlvbiB0bygpe3JldHVybiBubygpLl9ub2RlTWFwLmdldCgicm9vdCIpfWZ1bmN0aW9uIGVvKGUpe2hyKCk7bGV0IHQ9bm8oKTtlIT09bnVsbCYmKGUuZGlydHk9ITAsZS5fY2FjaGVkTm9kZXM9bnVsbCksdC5fc2VsZWN0aW9uPWV9ZnVuY3Rpb24genMoZSl7dmFyIHQ9amUoKSxyO2U6e2ZvcihyPWU7ciE9bnVsbDspe2xldCBuPXJbXGBfX2xleGljYWxLZXlfJHt0Ll9rZXl9XGBdO2lmKG4hPT12b2lkIDApe3I9bjticmVhayBlfXI9Z2Qocil9cj1udWxsfXJldHVybiByPT09bnVsbD8odD10LmdldFJvb3RFbGVtZW50KCksZT09PXQ/SXQoInJvb3QiKTpudWxsKTpJdChyKX1mdW5jdGlvbiB5VChlKXtyZXR1cm4vW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2cudGVzdChlKX1mdW5jdGlvbiBmeShlKXtsZXQgdD1bXTtmb3IoO2UhPT1udWxsOyl0LnB1c2goZSksZT1lLl9wYXJlbnRFZGl0b3I7cmV0dXJuIHR9ZnVuY3Rpb24gdlQoKXtyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvW15hLXpdKy9nLCIiKS5zdWJzdHIoMCw1KX1mdW5jdGlvbiBkeShlLHQscil7aWYodD1ybyh0Ll93aW5kb3cpLHQhPT1udWxsKXt2YXIgbj10LmFuY2hvck5vZGUse2FuY2hvck9mZnNldDpvLGZvY3VzT2Zmc2V0Oml9PXQ7aWYobiE9PW51bGwmJih0PW4ubm9kZVR5cGU9PT0zP24ubm9kZVZhbHVlOm51bGwsbj1LdShuKSx0IT09bnVsbCYmRihuKSkpe2lmKHQ9PT1oZCYmcil7bGV0IGw9ci5sZW5ndGg7dD1yLGk9bz1sfXQhPT1udWxsJiZteShuLHQsbyxpLGUpfX19ZnVuY3Rpb24gbXkoZSx0LHIsbixvKXtsZXQgaT1lO2lmKGkuaXNBdHRhY2hlZCgpJiYob3x8IWkuaXNEaXJ0eSgpKSl7bGV0IHU9aS5pc0NvbXBvc2luZygpLHA9dDtpZigodXx8bykmJnRbdC5sZW5ndGgtMV09PT1oZCYmKHA9dC5zbGljZSgwLC0xKSksdD1pLmdldFRleHRDb250ZW50KCksb3x8cCE9PXQpaWYocD09PSIiKWlmKFd0KG51bGwpLGx5fHxtZHx8c3kpaS5yZW1vdmUoKTtlbHNle2xldCBjPWplKCk7c2V0VGltZW91dCgoKT0+e2MudXBkYXRlKCgpPT57aS5pc0F0dGFjaGVkKCkmJmkucmVtb3ZlKCl9KX0sMjApfWVsc2V7bz1pLmdldFBhcmVudCgpLHQ9UnMoKTt2YXIgbD1pLmdldFRleHRDb250ZW50U2l6ZSgpLHM9YmkoKSxhPWkuZ2V0S2V5KCk7aS5pc1Rva2VuKCl8fHMhPT1udWxsJiZhPT09cyYmIXV8fFEodCkmJihvIT09bnVsbCYmIW8uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZ0LmFuY2hvci5vZmZzZXQ9PT0wfHx0LmFuY2hvci5rZXk9PT1lLl9fa2V5JiZ0LmFuY2hvci5vZmZzZXQ9PT0wJiYhaS5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fHQuZm9jdXMua2V5PT09ZS5fX2tleSYmdC5mb2N1cy5vZmZzZXQ9PT1sJiYhaS5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSk/aS5tYXJrRGlydHkoKTooZT1BZSgpLFEoZSkmJnIhPT1udWxsJiZuIT09bnVsbCYmKGUuc2V0VGV4dE5vZGVSYW5nZShpLHIsaSxuKSxpLmlzU2VnbWVudGVkKCkmJihyPWkuZ2V0VGV4dENvbnRlbnQoKSxyPU10KHIpLGkucmVwbGFjZShyKSxpPXIpKSxpLnNldFRleHRDb250ZW50KHApKX19fWZ1bmN0aW9uIFc1KGUsdCl7aWYodC5pc1NlZ21lbnRlZCgpKXJldHVybiEwO2lmKCFlLmlzQ29sbGFwc2VkKCkpcmV0dXJuITE7ZT1lLmFuY2hvci5vZmZzZXQ7bGV0IHI9dC5nZXRQYXJlbnRPclRocm93KCksbj10LmlzVG9rZW4oKTtyZXR1cm4gZT09PTA/KChlPSF0LmNhbkluc2VydFRleHRCZWZvcmUoKXx8IXIuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHxuKXx8KHQ9dC5nZXRQcmV2aW91c1NpYmxpbmcoKSxlPShGKHQpfHxNKHQpJiZ0LmlzSW5saW5lKCkpJiYhdC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSksZSk6ZT09PXQuZ2V0VGV4dENvbnRlbnRTaXplKCk/IXQuY2FuSW5zZXJ0VGV4dEFmdGVyKCl8fCFyLmNhbkluc2VydFRleHRBZnRlcigpfHxuOiExfWZ1bmN0aW9uIER1KGUsdCl7ZS5fX2xleGljYWxDbGFzc05hbWVDYWNoZT09PXZvaWQgMCYmKGUuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9e30pO2xldCByPWUuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGUsbj1yW3RdO3JldHVybiBuIT09dm9pZCAwP246KGU9ZVt0XSx0eXBlb2YgZT09InN0cmluZyI/KGU9ZS5zcGxpdCgiICIpLHJbdF09ZSk6ZSl9ZnVuY3Rpb24gaHkoZSx0LHIsbixvKXtyLnNpemUhPT0wJiYocj1uLl9fdHlwZSxuPW4uX19rZXksdD10LmdldChyKSx0PT09dm9pZCAwJiZ6KDMzLHIpLHI9dC5rbGFzcyx0PWUuZ2V0KHIpLHQ9PT12b2lkIDAmJih0PW5ldyBNYXAsZS5zZXQocix0KSksZT10LmdldChuKSxyPWU9PT0iZGVzdHJveWVkIiYmbz09PSJjcmVhdGVkIiwoZT09PXZvaWQgMHx8cikmJnQuc2V0KG4scj8idXBkYXRlZCI6bykpfWZ1bmN0aW9uIFRDKGUsdCxyKXtsZXQgbj1lLmdldFBhcmVudCgpLG89cjtyZXR1cm4gbiE9PW51bGwmJih0JiZyPT09MD8obz1lLmdldEluZGV4V2l0aGluUGFyZW50KCksZT1uKTp0fHxyIT09ZS5nZXRDaGlsZHJlblNpemUoKXx8KG89ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsZT1uKSksZS5nZXRDaGlsZEF0SW5kZXgodD9vLTE6byl9ZnVuY3Rpb24gRjAoZSx0KXt2YXIgcj1lLm9mZnNldDtyZXR1cm4gZS50eXBlPT09ImVsZW1lbnQiPyhlPWUuZ2V0Tm9kZSgpLFRDKGUsdCxyKSk6KGU9ZS5nZXROb2RlKCksdCYmcj09PTB8fCF0JiZyPT09ZS5nZXRUZXh0Q29udGVudFNpemUoKT8ocj10P2UuZ2V0UHJldmlvdXNTaWJsaW5nKCk6ZS5nZXROZXh0U2libGluZygpLHI9PT1udWxsP1RDKGUuZ2V0UGFyZW50T3JUaHJvdygpLHQsZS5nZXRJbmRleFdpdGhpblBhcmVudCgpKyh0PzA6MSkpOnIpOm51bGwpfWZ1bmN0aW9uIHhUKGUpe3JldHVybiBlPShlPXlkKGUpLmV2ZW50KSYmZS5pbnB1dFR5cGUsZT09PSJpbnNlcnRGcm9tUGFzdGUifHxlPT09Imluc2VydEZyb21QYXN0ZUFzUXVvdGF0aW9uIn1mdW5jdGlvbiBlZChlKXtyZXR1cm4hZ3IoZSkmJiFlLmlzTGFzdENoaWxkKCkmJiFlLmlzSW5saW5lKCl9ZnVuY3Rpb24gdGQoZSx0KXtyZXR1cm4gZT1lLl9rZXlUb0RPTU1hcC5nZXQodCksZT09PXZvaWQgMCYmeig3NSx0KSxlfWZ1bmN0aW9uIGdkKGUpe3JldHVybiBlPWUuYXNzaWduZWRTbG90fHxlLnBhcmVudEVsZW1lbnQsZSE9PW51bGwmJmUubm9kZVR5cGU9PT0xMT9lLmhvc3Q6ZX1mdW5jdGlvbiByZChlLHQpe2ZvcihlPWUuZ2V0UGFyZW50KCk7ZSE9PW51bGw7KXtpZihlLmlzKHQpKXJldHVybiEwO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4hMX1mdW5jdGlvbiB5ZChlKXtyZXR1cm4gZT1lLl93aW5kb3csZT09PW51bGwmJnooNzgpLGV9ZnVuY3Rpb24gd1QoZSl7Zm9yKGU9ZS5nZXRQYXJlbnRPclRocm93KCk7ZSE9PW51bGwmJiFPbihlKTspZT1lLmdldFBhcmVudE9yVGhyb3coKTtyZXR1cm4gZX1mdW5jdGlvbiBPbihlKXtyZXR1cm4gZ3IoZSl8fE0oZSkmJmUuaXNTaGFkb3dSb290KCl9ZnVuY3Rpb24gU1QoZSl7cmV0dXJuIGU9ZS5jb25zdHJ1Y3Rvci5jbG9uZShlKSxtVChlLG51bGwpLGV9ZnVuY3Rpb24gWXUoZSl7dmFyIHQ9amUoKTtsZXQgcj1lLmNvbnN0cnVjdG9yLmdldFR5cGUoKTtyZXR1cm4gdD10Ll9ub2Rlcy5nZXQociksdD09PXZvaWQgMCYmeig5NyksdD10LnJlcGxhY2UsdCE9PW51bGw/KHQ9dChlKSx0IGluc3RhbmNlb2YgZS5jb25zdHJ1Y3Rvcnx8eig5OCksdCk6ZX1mdW5jdGlvbiBfMChlLHQpe2U9ZS5nZXRQYXJlbnQoKSwhZ3IoZSl8fE0odCl8fExlKHQpfHx6KDk5KX1mdW5jdGlvbiBrMChlKXtyZXR1cm4oTGUoZSl8fE0oZSkmJiFlLmNhbkJlRW1wdHkoKSkmJiFlLmlzSW5saW5lKCl9ZnVuY3Rpb24gJDAoZSx0LHIpe3Iuc3R5bGUucmVtb3ZlUHJvcGVydHkoImNhcmV0LWNvbG9yIiksdC5fYmxvY2tDdXJzb3JFbGVtZW50PW51bGwsdD1lLnBhcmVudEVsZW1lbnQsdCE9PW51bGwmJnQucmVtb3ZlQ2hpbGQoZSl9ZnVuY3Rpb24gcm8oZSl7cmV0dXJuIEJvPyhlfHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGx9ZnVuY3Rpb24gQ1QoZSx0KXtsZXQgcj1lLmdldENoaWxkQXRJbmRleCh0KTtyPT1udWxsJiYocj1lKSxPbihlKSYmeigxMDIpO2xldCBuPWw9PntsZXQgcz1sLmdldFBhcmVudE9yVGhyb3coKSxhPU9uKHMpLHU9bCE9PXJ8fGE/U1QobCk6bDtpZihhKXJldHVybiBsLmluc2VydEFmdGVyKHUpLFtsLHUsdV07bGV0W3AsYyxmXT1uKHMpO3JldHVybiBsPWwuZ2V0TmV4dFNpYmxpbmdzKCksZi5hcHBlbmQodSwuLi5sKSxbcCxjLHVdfSxbbyxpXT1uKHIpO3JldHVybltvLGldfWZ1bmN0aW9uIG5kKGUsdCl7Zm9yKDtlIT09dG8oKSYmZSE9bnVsbDspe2lmKHQoZSkpcmV0dXJuIGU7ZT1lLmdldFBhcmVudCgpfXJldHVybiBudWxsfWZ1bmN0aW9uIEg1KGUpe2xldCB0PVtdLHI9W2VdO2Zvcig7MDxyLmxlbmd0aDspe2xldCBuPXIucG9wKCk7bj09PXZvaWQgMCYmeigxMTIpLE0obikmJnIudW5zaGlmdCguLi5uLmdldENoaWxkcmVuKCkpLG4hPT1lJiZ0LnB1c2gobil9cmV0dXJuIHR9ZnVuY3Rpb24gdmQoZSl7cmV0dXJuIGUubm9kZVR5cGU9PT0xfWZ1bmN0aW9uIFRUKGUsdCxyLG4sbyxpKXtmb3IoZT1lLmdldEZpcnN0Q2hpbGQoKTtlIT09bnVsbDspe2xldCBsPWUuX19rZXk7ZS5fX3BhcmVudD09PXQmJihNKGUpJiZUVChlLGwscixuLG8saSksci5oYXMobCl8fGkuZGVsZXRlKGwpLG8ucHVzaChsKSksZT1lLmdldE5leHRTaWJsaW5nKCl9fWZ1bmN0aW9uIFU1KGUsdCxyLG4pe2U9ZS5fbm9kZU1hcCx0PXQuX25vZGVNYXA7bGV0IG89W107Zm9yKGxldFtpXW9mIG4pe2xldCBsPXQuZ2V0KGkpO2w9PT12b2lkIDB8fGwuaXNBdHRhY2hlZCgpfHwoTShsKSYmVFQobCxpLGUsdCxvLG4pLGUuaGFzKGkpfHxuLmRlbGV0ZShpKSxvLnB1c2goaSkpfWZvcihsZXQgaSBvZiBvKXQuZGVsZXRlKGkpO2ZvcihsZXQgaSBvZiByKW49dC5nZXQoaSksbj09PXZvaWQgMHx8bi5pc0F0dGFjaGVkKCl8fChlLmhhcyhpKXx8ci5kZWxldGUoaSksdC5kZWxldGUoaSkpfXZhciBDdD0iIixtcj0iIixPbz0iIixQaSxucixXdSxfVD0hMSxneT0hMSx4ZCxHZj1udWxsLGowLFcwLGRsLE1pLEgwLEh1O2Z1bmN0aW9uIHFmKGUsdCl7bGV0IHI9ZGwuZ2V0KGUpO2lmKHQhPT1udWxsKXtsZXQgbj1SMChlKTtuLnBhcmVudE5vZGU9PT10JiZ0LnJlbW92ZUNoaWxkKG4pfU1pLmhhcyhlKXx8bnIuX2tleVRvRE9NTWFwLmRlbGV0ZShlKSxNKHIpJiYoZT1vZChyLGRsKSxVMChlLDAsZS5sZW5ndGgtMSxudWxsKSksciE9PXZvaWQgMCYmaHkoSHUsV3UseGQsciwiZGVzdHJveWVkIil9ZnVuY3Rpb24gVTAoZSx0LHIsbil7Zm9yKDt0PD1yOysrdCl7bGV0IG89ZVt0XTtvIT09dm9pZCAwJiZxZihvLG4pfX1mdW5jdGlvbiB1bChlLHQpe2Uuc2V0UHJvcGVydHkoInRleHQtYWxpZ24iLHQpfWZ1bmN0aW9uIGtUKGUsdCl7dmFyIHI9UGkudGhlbWUuaW5kZW50O2lmKHR5cGVvZiByPT0ic3RyaW5nIil7bGV0IG49ZS5jbGFzc0xpc3QuY29udGFpbnMocik7MDx0JiYhbj9lLmNsYXNzTGlzdC5hZGQocik6MT50JiZuJiZlLmNsYXNzTGlzdC5yZW1vdmUocil9cj1nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoIi0tbGV4aWNhbC1pbmRlbnQtYmFzZS12YWx1ZSIpfHwiNDBweCIsZS5zdHlsZS5zZXRQcm9wZXJ0eSgicGFkZGluZy1pbmxpbmUtc3RhcnQiLHQ9PT0wPyIiOlxgY2FsYygke3R9ICogJHtyfSlcYCl9ZnVuY3Rpb24gTlQoZSx0KXtlPWUuc3R5bGUsdD09PTA/dWwoZSwiIik6dD09PTE/dWwoZSwibGVmdCIpOnQ9PT0yP3VsKGUsImNlbnRlciIpOnQ9PT0zP3VsKGUsInJpZ2h0Iik6dD09PTQ/dWwoZSwianVzdGlmeSIpOnQ9PT01P3VsKGUsInN0YXJ0Iik6dD09PTYmJnVsKGUsImVuZCIpfWZ1bmN0aW9uIFFmKGUsdCxyKXtsZXQgbj1NaS5nZXQoZSk7bj09PXZvaWQgMCYmeig2MCk7bGV0IG89bi5jcmVhdGVET00oUGksbnIpO3ZhciBpPW5yLl9rZXlUb0RPTU1hcDtpZihvWyJfX2xleGljYWxLZXlfIituci5fa2V5XT1lLGkuc2V0KGUsbyksRihuKT9vLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLXRleHQiLCJ0cnVlIik6TGUobikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtZGVjb3JhdG9yIiwidHJ1ZSIpLE0obikpe2lmKGU9bi5fX2luZGVudCxpPW4uX19zaXplLGUhPT0wJiZrVChvLGUpLGkhPT0wKXstLWksZT1vZChuLE1pKTt2YXIgbD1tcjttcj0iIixWMChlLG4sMCxpLG8sbnVsbCksRVQobixvKSxtcj1sfWU9bi5fX2Zvcm1hdCxlIT09MCYmTlQobyxlKSxuLmlzSW5saW5lKCl8fGJUKG51bGwsbixvKSxlZChuKSYmKEN0Kz1cYAoKXGAsT28rPVxgCgpcYCl9ZWxzZSBpPW4uZ2V0VGV4dENvbnRlbnQoKSxMZShuKT8obD1uLmRlY29yYXRlKG5yLFBpKSxsIT09bnVsbCYmUFQoZSxsKSxvLmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiKTpGKG4pJiYobi5pc0RpcmVjdGlvbmxlc3MoKXx8KG1yKz1pKSksQ3QrPWksT28rPWk7cmV0dXJuIHQhPT1udWxsJiYociE9bnVsbD90Lmluc2VydEJlZm9yZShvLHIpOihyPXQuX19sZXhpY2FsTGluZUJyZWFrLHIhPW51bGw/dC5pbnNlcnRCZWZvcmUobyxyKTp0LmFwcGVuZENoaWxkKG8pKSksaHkoSHUsV3UseGQsbiwiY3JlYXRlZCIpLG99ZnVuY3Rpb24gVjAoZSx0LHIsbixvLGkpe2xldCBsPUN0O2ZvcihDdD0iIjtyPD1uOysrcilRZihlW3JdLG8saSk7ZWQodCkmJihDdCs9XGAKClxgKSxvLl9fbGV4aWNhbFRleHRDb250ZW50PUN0LEN0PWwrQ3R9ZnVuY3Rpb24gX0MoZSx0KXtyZXR1cm4gZT10LmdldChlKSxWdShlKXx8TGUoZSkmJmUuaXNJbmxpbmUoKX1mdW5jdGlvbiBiVChlLHQscil7ZT1lIT09bnVsbCYmKGUuX19zaXplPT09MHx8X0MoZS5fX2xhc3QsZGwpKSx0PXQuX19zaXplPT09MHx8X0ModC5fX2xhc3QsTWkpLGU/dHx8KHQ9ci5fX2xleGljYWxMaW5lQnJlYWssdCE9bnVsbCYmci5yZW1vdmVDaGlsZCh0KSxyLl9fbGV4aWNhbExpbmVCcmVhaz1udWxsKTp0JiYodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpLHIuX19sZXhpY2FsTGluZUJyZWFrPXQsci5hcHBlbmRDaGlsZCh0KSl9ZnVuY3Rpb24gRVQoZSx0KXt2YXIgcj10Ll9fbGV4aWNhbERpcjtpZih0Ll9fbGV4aWNhbERpclRleHRDb250ZW50IT09bXJ8fHIhPT1HZil7bGV0IGk9bXI9PT0iIjtpZihpKXZhciBuPUdmO2Vsc2Ugbj1tcixuPU01LnRlc3Qobik/InJ0bCI6STUudGVzdChuKT8ibHRyIjpudWxsO2lmKG4hPT1yKXtsZXQgbD10LmNsYXNzTGlzdCxzPVBpLnRoZW1lO3ZhciBvPXIhPT1udWxsP3Nbcl06dm9pZCAwO2xldCBhPW4hPT1udWxsP3Nbbl06dm9pZCAwO28hPT12b2lkIDAmJih0eXBlb2Ygbz09InN0cmluZyImJihvPW8uc3BsaXQoIiAiKSxvPXNbcl09byksbC5yZW1vdmUoLi4ubykpLG49PT1udWxsfHxpJiZuPT09Imx0ciI/dC5yZW1vdmVBdHRyaWJ1dGUoImRpciIpOihhIT09dm9pZCAwJiYodHlwZW9mIGE9PSJzdHJpbmciJiYocj1hLnNwbGl0KCIgIiksYT1zW25dPXIpLGEhPT12b2lkIDAmJmwuYWRkKC4uLmEpKSx0LmRpcj1uKSxneXx8KGUuZ2V0V3JpdGFibGUoKS5fX2Rpcj1uKX1HZj1uLHQuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQ9bXIsdC5fX2xleGljYWxEaXI9bn19ZnVuY3Rpb24gb2QoZSx0KXtsZXQgcj1bXTtmb3IoZT1lLl9fZmlyc3Q7ZSE9PW51bGw7KXtsZXQgbj10LmdldChlKTtuPT09dm9pZCAwJiZ6KDEwMSksci5wdXNoKGUpLGU9bi5fX25leHR9cmV0dXJuIHJ9ZnVuY3Rpb24gSXUoZSx0KXt2YXIgcj1kbC5nZXQoZSksbj1NaS5nZXQoZSk7ciE9PXZvaWQgMCYmbiE9PXZvaWQgMHx8eig2MSk7dmFyIG89X1R8fFcwLmhhcyhlKXx8ajAuaGFzKGUpO2xldCBpPXRkKG5yLGUpO2lmKHI9PT1uJiYhbylyZXR1cm4gTShyKT8obj1pLl9fbGV4aWNhbFRleHRDb250ZW50LG4hPT12b2lkIDAmJihDdCs9bixPbys9biksbj1pLl9fbGV4aWNhbERpclRleHRDb250ZW50LG4hPT12b2lkIDAmJihtcis9bikpOihuPXIuZ2V0VGV4dENvbnRlbnQoKSxGKHIpJiYhci5pc0RpcmVjdGlvbmxlc3MoKSYmKG1yKz1uKSxPbys9bixDdCs9biksaTtpZihyIT09biYmbyYmaHkoSHUsV3UseGQsbiwidXBkYXRlZCIpLG4udXBkYXRlRE9NKHIsaSxQaSkpcmV0dXJuIG49UWYoZSxudWxsLG51bGwpLHQ9PT1udWxsJiZ6KDYyKSx0LnJlcGxhY2VDaGlsZChuLGkpLHFmKGUsbnVsbCksbjtpZihNKHIpJiZNKG4pKXtpZihlPW4uX19pbmRlbnQsZSE9PXIuX19pbmRlbnQmJmtUKGksZSksZT1uLl9fZm9ybWF0LGUhPT1yLl9fZm9ybWF0JiZOVChpLGUpLG8pe2U9bixvPW1yLG1yPSIiLHQ9Q3Q7dmFyIGw9ci5fX3NpemUscz1lLl9fc2l6ZTtpZihDdD0iIixsPT09MSYmcz09PTEpe3ZhciBhPXIuX19maXJzdCx1PWUuX19maXJzdDtpZihhPT09dSlJdShhLGkpO2Vsc2V7dmFyIHA9UjAoYSk7dT1RZih1LG51bGwsbnVsbCksaS5yZXBsYWNlQ2hpbGQodSxwKSxxZihhLG51bGwpfX1lbHNle3U9b2QocixkbCk7dmFyIGM9b2QoZSxNaSk7aWYobD09PTApcyE9PTAmJlYwKGMsZSwwLHMtMSxpLG51bGwpO2Vsc2UgaWYocz09PTApbCE9PTAmJihhPWkuX19sZXhpY2FsTGluZUJyZWFrPT1udWxsLFUwKHUsMCxsLTEsYT9udWxsOmkpLGEmJihpLnRleHRDb250ZW50PSIiKSk7ZWxzZXt2YXIgZj11O3U9YyxjPWwtMSxsPXMtMTtsZXQgbT1pLmZpcnN0Q2hpbGQsaD0wO2ZvcihzPTA7aDw9YyYmczw9bDspe3ZhciBkPWZbaF07bGV0IFM9dVtzXTtpZihkPT09UyltPU4wKEl1KFMsaSkpLGgrKyxzKys7ZWxzZXthPT09dm9pZCAwJiYoYT1uZXcgU2V0KGYpKSxwPT09dm9pZCAwJiYocD1uZXcgU2V0KHUpKTtsZXQgeT1wLmhhcyhkKSx2PWEuaGFzKFMpO3k/KHY/KGQ9dGQobnIsUyksZD09PW0/bT1OMChJdShTLGkpKToobSE9bnVsbD9pLmluc2VydEJlZm9yZShkLG0pOmkuYXBwZW5kQ2hpbGQoZCksSXUoUyxpKSksaCsrKTpRZihTLGksbSkscysrKToobT1OMChSMChkKSkscWYoZCxpKSxoKyspfX1hPWg+YyxwPXM+bCxhJiYhcD8oYT11W2wrMV0sYT1hPT09dm9pZCAwP251bGw6bnIuZ2V0RWxlbWVudEJ5S2V5KGEpLFYwKHUsZSxzLGwsaSxhKSk6cCYmIWEmJlUwKGYsaCxjLGkpfX1lZChlKSYmKEN0Kz1cYAoKXGApLGkuX19sZXhpY2FsVGV4dENvbnRlbnQ9Q3QsQ3Q9dCtDdCxFVChlLGkpLG1yPW8sZ3Iobil8fG4uaXNJbmxpbmUoKXx8YlQocixuLGkpfWVkKG4pJiYoQ3QrPVxgCgpcYCxPbys9XGAKClxgKX1lbHNlIHI9bi5nZXRUZXh0Q29udGVudCgpLExlKG4pPyhvPW4uZGVjb3JhdGUobnIsUGkpLG8hPT1udWxsJiZQVChlLG8pKTpGKG4pJiYhbi5pc0RpcmVjdGlvbmxlc3MoKSYmKG1yKz1yKSxDdCs9cixPbys9cjtyZXR1cm4hZ3kmJmdyKG4pJiZuLl9fY2FjaGVkVGV4dCE9PU9vJiYobj1uLmdldFdyaXRhYmxlKCksbi5fX2NhY2hlZFRleHQ9T28pLGl9ZnVuY3Rpb24gUFQoZSx0KXtsZXQgcj1uci5fcGVuZGluZ0RlY29yYXRvcnMsbj1uci5fZGVjb3JhdG9ycztpZihyPT09bnVsbCl7aWYobltlXT09PXQpcmV0dXJuO3I9Z1QobnIpfXJbZV09dH1mdW5jdGlvbiBOMChlKXtyZXR1cm4gZT1lLm5leHRTaWJsaW5nLGUhPT1udWxsJiZlPT09bnIuX2Jsb2NrQ3Vyc29yRWxlbWVudCYmKGU9ZS5uZXh0U2libGluZyksZX1mdW5jdGlvbiBSMChlKXtsZXQgdD1IMC5nZXQoZSk7cmV0dXJuIHQ9PT12b2lkIDAmJnooNzUsZSksdH12YXIgRG89T2JqZWN0LmZyZWV6ZSh7fSksRzA9W1sia2V5ZG93biIsWDVdLFsicG9pbnRlcmRvd24iLFI1XSxbImNvbXBvc2l0aW9uc3RhcnQiLEs1XSxbImNvbXBvc2l0aW9uZW5kIixZNV0sWyJpbnB1dCIsUTVdLFsiY2xpY2siLFY1XSxbImN1dCIsRG9dLFsiY29weSIsRG9dLFsiZHJhZ3N0YXJ0IixEb10sWyJkcmFnb3ZlciIsRG9dLFsiZHJhZ2VuZCIsRG9dLFsicGFzdGUiLERvXSxbImZvY3VzIixEb10sWyJibHVyIixEb10sWyJkcm9wIixEb11dO1hmJiZHMC5wdXNoKFsiYmVmb3JlaW5wdXQiLChlLHQpPT5xNShlLHQpXSk7dmFyIFV1PTAsTVQ9MCxJVD0wLE9zPW51bGwsT3U9MCxxMD0hMSxRMD0hMSx6dT0hMSxMdT0hMSxMVD1bMCwiIiwwLCJyb290IiwwXTtmdW5jdGlvbiBBVChlLHQscixuLG8pe2xldCBpPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWkuZ2V0Tm9kZSgpO3ZhciBhPWplKCk7bGV0IHU9cm8oYS5fd2luZG93KSxwPXUhPT1udWxsP3UuYW5jaG9yTm9kZTpudWxsLGM9aS5rZXk7YT1hLmdldEVsZW1lbnRCeUtleShjKTtsZXQgZj1yLmxlbmd0aDtyZXR1cm4gYyE9PWwua2V5fHwhRihzKXx8KCFvJiYoIVhmfHxJVDxuKzUwKXx8cy5pc0RpcnR5KCkmJjI+Znx8eVQocikpJiZpLm9mZnNldCE9PWwub2Zmc2V0JiYhcy5pc0NvbXBvc2luZygpfHxCMChzKXx8cy5pc0RpcnR5KCkmJjE8Znx8KG98fCFYZikmJmEhPT1udWxsJiYhcy5pc0NvbXBvc2luZygpJiZwIT09WmYoYSl8fHUhPT1udWxsJiZ0IT09bnVsbCYmKCF0LmNvbGxhcHNlZHx8dC5zdGFydENvbnRhaW5lciE9PXUuYW5jaG9yTm9kZXx8dC5zdGFydE9mZnNldCE9PXUuYW5jaG9yT2Zmc2V0KXx8cy5nZXRGb3JtYXQoKSE9PWUuZm9ybWF0fHxzLmdldFN0eWxlKCkhPT1lLnN0eWxlfHxXNShlLHMpfWZ1bmN0aW9uIGtDKGUsdCl7cmV0dXJuIGUhPT1udWxsJiZlLm5vZGVWYWx1ZSE9PW51bGwmJmUubm9kZVR5cGU9PT0zJiZ0IT09MCYmdCE9PWUubm9kZVZhbHVlLmxlbmd0aH1mdW5jdGlvbiBOQyhlLHQscil7bGV0e2FuY2hvck5vZGU6bixhbmNob3JPZmZzZXQ6byxmb2N1c05vZGU6aSxmb2N1c09mZnNldDpsfT1lO3EwJiYocTA9ITEsa0MobixvKSYma0MoaSxsKSl8fFVyKHQsKCk9PntpZighcillbyhudWxsKTtlbHNlIGlmKFF1KHQsbixpKSl7dmFyIHM9QWUoKTtpZihRKHMpKXt2YXIgYT1zLmFuY2hvcix1PWEuZ2V0Tm9kZSgpO2lmKHMuaXNDb2xsYXBzZWQoKSl7ZS50eXBlPT09IlJhbmdlIiYmZS5hbmNob3JOb2RlPT09ZS5mb2N1c05vZGUmJihzLmRpcnR5PSEwKTt2YXIgcD15ZCh0KS5ldmVudDtwPXA/cC50aW1lU3RhbXA6cGVyZm9ybWFuY2Uubm93KCk7bGV0W2MsZixkLG0saF09TFQ7cDxoKzIwMCYmYS5vZmZzZXQ9PT1kJiZhLmtleT09PW0/KHMuZm9ybWF0PWMscy5zdHlsZT1mKTphLnR5cGU9PT0idGV4dCI/KHMuZm9ybWF0PXUuZ2V0Rm9ybWF0KCkscy5zdHlsZT11LmdldFN0eWxlKCkpOmEudHlwZT09PSJlbGVtZW50IiYmKHMuZm9ybWF0PTAscy5zdHlsZT0iIil9ZWxzZXthPTI1NSx1PSExLHA9cy5nZXROb2RlcygpO2xldCBjPXAubGVuZ3RoO2ZvcihsZXQgZj0wO2Y8YztmKyspe2xldCBkPXBbZl07aWYoRihkKSYmKHU9ITAsYSY9ZC5nZXRGb3JtYXQoKSxhPT09MCkpYnJlYWt9cy5mb3JtYXQ9dT9hOjB9fUIodCxkZCx2b2lkIDApfX0pfWZ1bmN0aW9uIFY1KGUsdCl7VXIodCwoKT0+e2xldCByPUFlKCk7dmFyIG49cm8odC5fd2luZG93KTtsZXQgbz1ScygpO2lmKG4paWYoUShyKSl7bGV0IGw9ci5hbmNob3I7dmFyIGk9bC5nZXROb2RlKCk7bC50eXBlPT09ImVsZW1lbnQiJiZsLm9mZnNldD09PTAmJnIuaXNDb2xsYXBzZWQoKSYmIWdyKGkpJiZ0bygpLmdldENoaWxkcmVuU2l6ZSgpPT09MSYmaS5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkuaXNFbXB0eSgpJiZvIT09bnVsbCYmci5pcyhvKT8obi5yZW1vdmVBbGxSYW5nZXMoKSxyLmRpcnR5PSEwKTplLmRldGFpbCE9PTN8fHIuaXNDb2xsYXBzZWQoKXx8KG49ci5mb2N1cy5nZXROb2RlKCksaSE9PW4mJihNKGkpP2kuc2VsZWN0KDApOmkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdCgwKSkpfWVsc2UgZS5wb2ludGVyVHlwZT09PSJ0b3VjaCImJihpPW4uYW5jaG9yTm9kZSxpIT09bnVsbCYmKGk9aS5ub2RlVHlwZSxpPT09MXx8aT09PTMpKSYmKG49dnkobyxuLHQpLGVvKG4pKTtCKHQsSEMsZSl9KX1mdW5jdGlvbiBSNShlLHQpe2xldCByPWUudGFyZ2V0O2U9ZS5wb2ludGVyVHlwZSxyIGluc3RhbmNlb2YgTm9kZSYmZSE9PSJ0b3VjaCImJlVyKHQsKCk9PntMZShLdShyKSl8fChRMD0hMCl9KX1mdW5jdGlvbiBEVChlKXtyZXR1cm4gZS5nZXRUYXJnZXRSYW5nZXM/KGU9ZS5nZXRUYXJnZXRSYW5nZXMoKSxlLmxlbmd0aD09PTA/bnVsbDplWzBdKTpudWxsfWZ1bmN0aW9uIEc1KGUsdCl7cmV0dXJuIGUhPT10fHxNKGUpfHxNKHQpfHwhZS5pc1Rva2VuKCl8fCF0LmlzVG9rZW4oKX1mdW5jdGlvbiBxNShlLHQpe2xldCByPWUuaW5wdXRUeXBlLG49RFQoZSk7cj09PSJkZWxldGVDb21wb3NpdGlvblRleHQifHxFaSYmeFQodCl8fHIhPT0iaW5zZXJ0Q29tcG9zaXRpb25UZXh0IiYmVXIodCwoKT0+e2xldCBvPUFlKCk7aWYocj09PSJkZWxldGVDb250ZW50QmFja3dhcmQiKXtpZihvPT09bnVsbCl7dmFyIGk9UnMoKTtpZighUShpKSlyZXR1cm47ZW8oaS5jbG9uZSgpKX1pZihRKG8pKXtNVD09PTIyOSYmZS50aW1lU3RhbXA8VXUrMzAmJnQuaXNDb21wb3NpbmcoKSYmby5hbmNob3Iua2V5PT09by5mb2N1cy5rZXk/KFd0KG51bGwpLFV1PTAsc2V0VGltZW91dCgoKT0+e1VyKHQsKCk9PntXdChudWxsKX0pfSwzMCksUShvKSYmKGk9by5hbmNob3IuZ2V0Tm9kZSgpLGkubWFya0RpcnR5KCksby5mb3JtYXQ9aS5nZXRGb3JtYXQoKSxvLnN0eWxlPWkuZ2V0U3R5bGUoKSkpOihlLnByZXZlbnREZWZhdWx0KCksQih0LEZ1LCEwKSk7cmV0dXJufX1pZihRKG8pKXtpPWUuZGF0YSxPcyE9PW51bGwmJmR5KCExLHQsT3MpLG8uZGlydHkmJk9zPT09bnVsbHx8IW8uaXNDb2xsYXBzZWQoKXx8Z3Ioby5hbmNob3IuZ2V0Tm9kZSgpKXx8bj09PW51bGx8fG8uYXBwbHlET01SYW5nZShuKSxPcz1udWxsO3ZhciBsPW8uZm9jdXMscz1vLmFuY2hvci5nZXROb2RlKCk7aWYobD1sLmdldE5vZGUoKSxyPT09Imluc2VydFRleHQifHxyPT09Imluc2VydFRyYW5zcG9zZSIpaT09PVxgClxgPyhlLnByZXZlbnREZWZhdWx0KCksQih0LEF1LCExKSk6aT09PVxgCgpcYD8oZS5wcmV2ZW50RGVmYXVsdCgpLEIodCxBMCx2b2lkIDApKTppPT1udWxsJiZlLmRhdGFUcmFuc2Zlcj8oaT1lLmRhdGFUcmFuc2Zlci5nZXREYXRhKCJ0ZXh0L3BsYWluIiksZS5wcmV2ZW50RGVmYXVsdCgpLG8uaW5zZXJ0UmF3VGV4dChpKSk6aSE9bnVsbCYmQVQobyxuLGksZS50aW1lU3RhbXAsITApPyhlLnByZXZlbnREZWZhdWx0KCksQih0LEJzLGkpKTpPcz1pLElUPWUudGltZVN0YW1wO2Vsc2Ugc3dpdGNoKGUucHJldmVudERlZmF1bHQoKSxyKXtjYXNlImluc2VydEZyb21ZYW5rIjpjYXNlImluc2VydEZyb21Ecm9wIjpjYXNlImluc2VydFJlcGxhY2VtZW50VGV4dCI6Qih0LEJzLGUpO2JyZWFrO2Nhc2UiaW5zZXJ0RnJvbUNvbXBvc2l0aW9uIjpXdChudWxsKSxCKHQsQnMsZSk7YnJlYWs7Y2FzZSJpbnNlcnRMaW5lQnJlYWsiOld0KG51bGwpLEIodCxBdSwhMSk7YnJlYWs7Y2FzZSJpbnNlcnRQYXJhZ3JhcGgiOld0KG51bGwpLHp1JiYhbWQ/KHp1PSExLEIodCxBdSwhMSkpOkIodCxBMCx2b2lkIDApO2JyZWFrO2Nhc2UiaW5zZXJ0RnJvbVBhc3RlIjpjYXNlImluc2VydEZyb21QYXN0ZUFzUXVvdGF0aW9uIjpCKHQsdHksZSk7YnJlYWs7Y2FzZSJkZWxldGVCeUNvbXBvc2l0aW9uIjpHNShzLGwpJiZCKHQsRDAsZSk7YnJlYWs7Y2FzZSJkZWxldGVCeURyYWciOmNhc2UiZGVsZXRlQnlDdXQiOkIodCxEMCxlKTticmVhaztjYXNlImRlbGV0ZUNvbnRlbnQiOkIodCxGdSwhMSk7YnJlYWs7Y2FzZSJkZWxldGVXb3JkQmFja3dhcmQiOkIodCwkdSwhMCk7YnJlYWs7Y2FzZSJkZWxldGVXb3JkRm9yd2FyZCI6Qih0LCR1LCExKTticmVhaztjYXNlImRlbGV0ZUhhcmRMaW5lQmFja3dhcmQiOmNhc2UiZGVsZXRlU29mdExpbmVCYWNrd2FyZCI6Qih0LGp1LCEwKTticmVhaztjYXNlImRlbGV0ZUNvbnRlbnRGb3J3YXJkIjpjYXNlImRlbGV0ZUhhcmRMaW5lRm9yd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUZvcndhcmQiOkIodCxqdSwhMSk7YnJlYWs7Y2FzZSJmb3JtYXRTdHJpa2VUaHJvdWdoIjpCKHQsTmksInN0cmlrZXRocm91Z2giKTticmVhaztjYXNlImZvcm1hdEJvbGQiOkIodCxOaSwiYm9sZCIpO2JyZWFrO2Nhc2UiZm9ybWF0SXRhbGljIjpCKHQsTmksIml0YWxpYyIpO2JyZWFrO2Nhc2UiZm9ybWF0VW5kZXJsaW5lIjpCKHQsTmksInVuZGVybGluZSIpO2JyZWFrO2Nhc2UiaGlzdG9yeVVuZG8iOkIodCxyeSx2b2lkIDApO2JyZWFrO2Nhc2UiaGlzdG9yeVJlZG8iOkIodCxueSx2b2lkIDApfX19KX1mdW5jdGlvbiBRNShlLHQpe2Uuc3RvcFByb3BhZ2F0aW9uKCksVXIodCwoKT0+e3ZhciByPUFlKCksbj1lLmRhdGEsbz1EVChlKTtpZihuIT1udWxsJiZRKHIpJiZBVChyLG8sbixlLnRpbWVTdGFtcCwhMSkpe0x1JiYoSzAodCxuKSxMdT0hMSk7dmFyIGk9ci5hbmNob3IsbD1pLmdldE5vZGUoKTtpZihvPXJvKHQuX3dpbmRvdyksbz09PW51bGwpcmV0dXJuO2xldCBzPWkub2Zmc2V0OyhpPVhmJiYhci5pc0NvbGxhcHNlZCgpJiZGKGwpJiZvLmFuY2hvck5vZGUhPT1udWxsKSYmKGw9bC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKDAscykrbitsLmdldFRleHRDb250ZW50KCkuc2xpY2UocytyLmZvY3VzLm9mZnNldCksbz1vLmFuY2hvck5vZGUsaT1sPT09KG8ubm9kZVR5cGU9PT0zP28ubm9kZVZhbHVlOm51bGwpKSxpfHxCKHQsQnMsbiksbj1uLmxlbmd0aCxFaSYmMTxuJiZlLmlucHV0VHlwZT09PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiYhdC5pc0NvbXBvc2luZygpJiYoci5hbmNob3Iub2Zmc2V0LT1uKSxseXx8bWR8fHN5fHwhdC5pc0NvbXBvc2luZygpfHwoVXU9MCxXdChudWxsKSl9ZWxzZSBkeSghMSx0LG4hPT1udWxsP246dm9pZCAwKSxMdSYmKEswKHQsbnx8dm9pZCAwKSxMdT0hMSk7aHIoKSxyPWplKCksdVQocil9KSxPcz1udWxsfWZ1bmN0aW9uIEs1KGUsdCl7VXIodCwoKT0+e2xldCByPUFlKCk7aWYoUShyKSYmIXQuaXNDb21wb3NpbmcoKSl7bGV0IG49ci5hbmNob3Isbz1yLmFuY2hvci5nZXROb2RlKCk7V3Qobi5rZXkpLChlLnRpbWVTdGFtcDxVdSszMHx8bi50eXBlPT09ImVsZW1lbnQifHwhci5pc0NvbGxhcHNlZCgpfHxvLmdldEZvcm1hdCgpIT09ci5mb3JtYXR8fG8uZ2V0U3R5bGUoKSE9PXIuc3R5bGUpJiZCKHQsQnMsUDUpfX0pfWZ1bmN0aW9uIEswKGUsdCl7dmFyIHI9ZS5fY29tcG9zaXRpb25LZXk7aWYoV3QobnVsbCksciE9PW51bGwmJnQhPW51bGwpe2lmKHQ9PT0iIil7dD1JdChyKSxlPVpmKGUuZ2V0RWxlbWVudEJ5S2V5KHIpKSxlIT09bnVsbCYmZS5ub2RlVmFsdWUhPT1udWxsJiZGKHQpJiZteSh0LGUubm9kZVZhbHVlLG51bGwsbnVsbCwhMCk7cmV0dXJufWlmKHRbdC5sZW5ndGgtMV09PT1cYApcYCYmKHI9QWUoKSxRKHIpKSl7dD1yLmZvY3VzLHIuYW5jaG9yLnNldCh0LmtleSx0Lm9mZnNldCx0LnR5cGUpLEIoZSxZZixudWxsKTtyZXR1cm59fWR5KCEwLGUsdCl9ZnVuY3Rpb24gWTUoZSx0KXtFaT9MdT0hMDpVcih0LCgpPT57SzAodCxlLmRhdGEpfSl9ZnVuY3Rpb24gWDUoZSx0KXtpZihVdT1lLnRpbWVTdGFtcCxNVD1lLmtleUNvZGUsIXQuaXNDb21wb3NpbmcoKSl7dmFye2tleUNvZGU6cixzaGlmdEtleTpuLGN0cmxLZXk6byxtZXRhS2V5OmksYWx0S2V5Omx9PWU7aWYoIUIodCxVQyxlKSl7aWYociE9PTM5fHxvfHxpfHxsKWlmKHIhPT0zOXx8bHx8bnx8IW8mJiFpKWlmKHIhPT0zN3x8b3x8aXx8bClpZihyIT09Mzd8fGx8fG58fCFvJiYhaSlpZihyIT09Mzh8fG98fGkpaWYociE9PTQwfHxvfHxpKWlmKHI9PT0xMyYmbil6dT0hMCxCKHQsWWYsZSk7ZWxzZSBpZihyPT09MzIpQih0LFlDLGUpO2Vsc2UgaWYocnImJm8mJnI9PT03OSllLnByZXZlbnREZWZhdWx0KCksenU9ITAsQih0LEF1LCEwKTtlbHNlIGlmKHIhPT0xM3x8bil7dmFyIHM9cnI/bHx8aT8hMTpyPT09OHx8cj09PTcyJiZvOm98fGx8fGk/ITE6cj09PTg7cz9yPT09OD9CKHQsWEMsZSk6KGUucHJldmVudERlZmF1bHQoKSxCKHQsRnUsITApKTpyPT09Mjc/Qih0LFpDLGUpOihzPXJyP258fGx8fGk/ITE6cj09PTQ2fHxyPT09NjgmJm86b3x8bHx8aT8hMTpyPT09NDYscz9yPT09NDY/Qih0LEpDLGUpOihlLnByZXZlbnREZWZhdWx0KCksQih0LEZ1LCExKSk6cj09PTgmJihycj9sOm8pPyhlLnByZXZlbnREZWZhdWx0KCksQih0LCR1LCEwKSk6cj09PTQ2JiYocnI/bDpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLEIodCwkdSwhMSkpOnJyJiZpJiZyPT09OD8oZS5wcmV2ZW50RGVmYXVsdCgpLEIodCxqdSwhMCkpOnJyJiZpJiZyPT09NDY/KGUucHJldmVudERlZmF1bHQoKSxCKHQsanUsITEpKTpyPT09NjYmJiFsJiYocnI/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLEIodCxOaSwiYm9sZCIpKTpyPT09ODUmJiFsJiYocnI/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLEIodCxOaSwidW5kZXJsaW5lIikpOnI9PT03MyYmIWwmJihycj9pOm8pPyhlLnByZXZlbnREZWZhdWx0KCksQih0LE5pLCJpdGFsaWMiKSk6ciE9PTl8fGx8fG98fGk/cj09PTkwJiYhbiYmKHJyP2k6byk/KGUucHJldmVudERlZmF1bHQoKSxCKHQscnksdm9pZCAwKSk6KHM9cnI/cj09PTkwJiZpJiZuOnI9PT04OSYmb3x8cj09PTkwJiZvJiZuLHM/KGUucHJldmVudERlZmF1bHQoKSxCKHQsbnksdm9pZCAwKSk6VnModC5fZWRpdG9yU3RhdGUuX3NlbGVjdGlvbik/KHM9bj8hMTpyPT09Njc/cnI/aTpvOiExLHM/KGUucHJldmVudERlZmF1bHQoKSxCKHQsb3ksZSkpOihzPW4/ITE6cj09PTg4P3JyP2k6bzohMSxzPyhlLnByZXZlbnREZWZhdWx0KCksQih0LGl5LGUpKTpyPT09NjUmJihycj9pOm8pJiYoZS5wcmV2ZW50RGVmYXVsdCgpLEIodCxPMCxlKSkpKTohRWkmJnI9PT02NSYmKHJyP2k6bykmJihlLnByZXZlbnREZWZhdWx0KCksQih0LE8wLGUpKSk6Qih0LGVULGUpKX1lbHNlIHp1PSExLEIodCxZZixlKTtlbHNlIEIodCxLQyxlKTtlbHNlIEIodCxRQyxlKTtlbHNlIEIodCxxQyxlKTtlbHNlIEIodCxHQyxlKTtlbHNlIEIodCxSQyxlKTtlbHNlIEIodCxWQyxlKTsob3x8bnx8bHx8aSkmJkIodCxzVCxlKX19fWZ1bmN0aW9uIE9UKGUpe2xldCB0PWUuX19sZXhpY2FsRXZlbnRIYW5kbGVzO3JldHVybiB0PT09dm9pZCAwJiYodD1bXSxlLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz10KSx0fXZhciBGcz1uZXcgTWFwO2Z1bmN0aW9uIHpUKGUpe2U9ZS50YXJnZXQ7bGV0IHQ9cm8oZT09bnVsbD9udWxsOmUubm9kZVR5cGU9PT05P2UuZGVmYXVsdFZpZXc6ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTtpZih0IT09bnVsbCl7dmFyIHI9cHkodC5hbmNob3JOb2RlKTtpZihyIT09bnVsbCl7UTAmJihRMD0hMSxVcihyLCgpPT57dmFyIGw9UnMoKSxzPXQuYW5jaG9yTm9kZTtzIT09bnVsbCYmKHM9cy5ub2RlVHlwZSxzPT09MXx8cz09PTMpJiYobD12eShsLHQsciksZW8obCkpfSkpLGU9ZnkociksZT1lW2UubGVuZ3RoLTFdO3ZhciBuPWUuX2tleSxvPUZzLmdldChuKSxpPW98fGU7aSE9PXImJk5DKHQsaSwhMSksTkModCxyLCEwKSxyIT09ZT9Gcy5zZXQobixyKTpvJiZGcy5kZWxldGUobil9fX1mdW5jdGlvbiBaNShlLHQpe091PT09MCYmZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIselQpLE91KyssZS5fX2xleGljYWxFZGl0b3I9dDtsZXQgcj1PVChlKTtmb3IobGV0IG49MDtuPEcwLmxlbmd0aDtuKyspe2xldFtvLGldPUcwW25dLGw9dHlwZW9mIGk9PSJmdW5jdGlvbiI/cz0+e3MuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSYmaShzLHQpKX06cz0+e2lmKHMuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSkpc3dpdGNoKG8pe2Nhc2UiY3V0IjpyZXR1cm4gQih0LGl5LHMpO2Nhc2UiY29weSI6cmV0dXJuIEIodCxveSxzKTtjYXNlInBhc3RlIjpyZXR1cm4gQih0LHR5LHMpO2Nhc2UiZHJhZ3N0YXJ0IjpyZXR1cm4gQih0LHJULHMpO2Nhc2UiZHJhZ292ZXIiOnJldHVybiBCKHQsblQscyk7Y2FzZSJkcmFnZW5kIjpyZXR1cm4gQih0LG9ULHMpO2Nhc2UiZm9jdXMiOnJldHVybiBCKHQsaVQscyk7Y2FzZSJibHVyIjpyZXR1cm4gQih0LGxULHMpO2Nhc2UiZHJvcCI6cmV0dXJuIEIodCx0VCxzKX19O2UuYWRkRXZlbnRMaXN0ZW5lcihvLGwpLHIucHVzaCgoKT0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLGwpfSl9fWZ1bmN0aW9uIFkwKGUsdCxyKXtocigpO3ZhciBuPWUuX19rZXk7bGV0IG89ZS5nZXRQYXJlbnQoKTtpZihvIT09bnVsbCl7dmFyIGk9QWUoKTtpZihRKGkpJiZNKGUpKXt2YXJ7YW5jaG9yOmwsZm9jdXM6c309aSxhPWwuZ2V0Tm9kZSgpLHU9cy5nZXROb2RlKCk7cmQoYSxlKSYmbC5zZXQoZS5fX2tleSwwLCJlbGVtZW50IikscmQodSxlKSYmcy5zZXQoZS5fX2tleSwwLCJlbGVtZW50Iil9aWYoYT1pLHU9ITEsUShhKSYmdCl7aT1hLmFuY2hvcjtsZXQgcD1hLmZvY3VzO2kua2V5PT09biYmKGFkKGksZSxvLGUuZ2V0UHJldmlvdXNTaWJsaW5nKCksZS5nZXROZXh0U2libGluZygpKSx1PSEwKSxwLmtleT09PW4mJihhZChwLGUsbyxlLmdldFByZXZpb3VzU2libGluZygpLGUuZ2V0TmV4dFNpYmxpbmcoKSksdT0hMCl9ZWxzZSBWcyhhKSYmdCYmZS5pc1NlbGVjdGVkKCkmJmUuc2VsZWN0UHJldmlvdXMoKTtRKGEpJiZ0JiYhdT8obj1lLmdldEluZGV4V2l0aGluUGFyZW50KCkscGwoZSksc2QoYSxvLG4sLTEpKTpwbChlKSxyfHxPbihvKXx8by5jYW5CZUVtcHR5KCl8fCFvLmlzRW1wdHkoKXx8WTAobyx0KSx0JiZncihvKSYmby5pc0VtcHR5KCkmJm8uc2VsZWN0RW5kKCl9fXZhciBtbD1jbGFzc3tzdGF0aWMgZ2V0VHlwZSgpe3ooNjQsdGhpcy5uYW1lKX1zdGF0aWMgY2xvbmUoKXt6KDY1LHRoaXMubmFtZSl9Y29uc3RydWN0b3IodCl7dGhpcy5fX3R5cGU9dGhpcy5jb25zdHJ1Y3Rvci5nZXRUeXBlKCksdGhpcy5fX25leHQ9dGhpcy5fX3ByZXY9dGhpcy5fX3BhcmVudD1udWxsLG1UKHRoaXMsdCl9Z2V0VHlwZSgpe3JldHVybiB0aGlzLl9fdHlwZX1pc0F0dGFjaGVkKCl7Zm9yKHZhciB0PXRoaXMuX19rZXk7dCE9PW51bGw7KXtpZih0PT09InJvb3QiKXJldHVybiEwO2lmKHQ9SXQodCksdD09PW51bGwpYnJlYWs7dD10Ll9fcGFyZW50fXJldHVybiExfWlzU2VsZWN0ZWQodCl7aWYodD10fHxBZSgpLHQ9PW51bGwpcmV0dXJuITE7bGV0IHI9dC5nZXROb2RlcygpLnNvbWUobj0+bi5fX2tleT09PXRoaXMuX19rZXkpO3JldHVybiBGKHRoaXMpP3I6USh0KSYmdC5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdC5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZ0LmFuY2hvci5rZXk9PT10LmZvY3VzLmtleSYmdC5hbmNob3Iub2Zmc2V0PT09dC5mb2N1cy5vZmZzZXQ/ITE6cn1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fX2tleX1nZXRJbmRleFdpdGhpblBhcmVudCgpe3ZhciB0PXRoaXMuZ2V0UGFyZW50KCk7aWYodD09PW51bGwpcmV0dXJuLTE7dD10LmdldEZpcnN0Q2hpbGQoKTtsZXQgcj0wO2Zvcig7dCE9PW51bGw7KXtpZih0aGlzLmlzKHQpKXJldHVybiByO3IrKyx0PXQuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4tMX1nZXRQYXJlbnQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fcGFyZW50O3JldHVybiB0PT09bnVsbD9udWxsOkl0KHQpfWdldFBhcmVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFBhcmVudCgpO3JldHVybiB0PT09bnVsbCYmeig2Nix0aGlzLl9fa2V5KSx0fWdldFRvcExldmVsRWxlbWVudCgpe2xldCB0PXRoaXM7Zm9yKDt0IT09bnVsbDspe2xldCByPXQuZ2V0UGFyZW50KCk7aWYoT24ocikpcmV0dXJuIHQ7dD1yfXJldHVybiBudWxsfWdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFRvcExldmVsRWxlbWVudCgpO3JldHVybiB0PT09bnVsbCYmeig2Nyx0aGlzLl9fa2V5KSx0fWdldFBhcmVudHMoKXtsZXQgdD1bXSxyPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtyIT09bnVsbDspdC5wdXNoKHIpLHI9ci5nZXRQYXJlbnQoKTtyZXR1cm4gdH1nZXRQYXJlbnRLZXlzKCl7bGV0IHQ9W10scj10aGlzLmdldFBhcmVudCgpO2Zvcig7ciE9PW51bGw7KXQucHVzaChyLl9fa2V5KSxyPXIuZ2V0UGFyZW50KCk7cmV0dXJuIHR9Z2V0UHJldmlvdXNTaWJsaW5nKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX3ByZXY7cmV0dXJuIHQ9PT1udWxsP251bGw6SXQodCl9Z2V0UHJldmlvdXNTaWJsaW5ncygpe2xldCB0PVtdO3ZhciByPXRoaXMuZ2V0UGFyZW50KCk7aWYocj09PW51bGwpcmV0dXJuIHQ7Zm9yKHI9ci5nZXRGaXJzdENoaWxkKCk7ciE9PW51bGwmJiFyLmlzKHRoaXMpOyl0LnB1c2gocikscj1yLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0TmV4dFNpYmxpbmcoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fbmV4dDtyZXR1cm4gdD09PW51bGw/bnVsbDpJdCh0KX1nZXROZXh0U2libGluZ3MoKXtsZXQgdD1bXSxyPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO3IhPT1udWxsOyl0LnB1c2gocikscj1yLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q29tbW9uQW5jZXN0b3IodCl7bGV0IHI9dGhpcy5nZXRQYXJlbnRzKCk7dmFyIG49dC5nZXRQYXJlbnRzKCk7TSh0aGlzKSYmci51bnNoaWZ0KHRoaXMpLE0odCkmJm4udW5zaGlmdCh0KSx0PXIubGVuZ3RoO3ZhciBvPW4ubGVuZ3RoO2lmKHQ9PT0wfHxvPT09MHx8clt0LTFdIT09bltvLTFdKXJldHVybiBudWxsO2ZvcihuPW5ldyBTZXQobiksbz0wO288dDtvKyspe2xldCBpPXJbb107aWYobi5oYXMoaSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9aXModCl7cmV0dXJuIHQ9PW51bGw/ITE6dGhpcy5fX2tleT09PXQuX19rZXl9aXNCZWZvcmUodCl7aWYodGhpcz09PXQpcmV0dXJuITE7aWYodC5pc1BhcmVudE9mKHRoaXMpKXJldHVybiEwO2lmKHRoaXMuaXNQYXJlbnRPZih0KSlyZXR1cm4hMTt2YXIgcj10aGlzLmdldENvbW1vbkFuY2VzdG9yKHQpO2xldCBuPXRoaXM7Zm9yKDs7KXt2YXIgbz1uLmdldFBhcmVudE9yVGhyb3coKTtpZihvPT09cil7bz1uLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9bj1vfWZvcihuPXQ7Oyl7aWYodD1uLmdldFBhcmVudE9yVGhyb3coKSx0PT09cil7cj1uLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9bj10fXJldHVybiBvPHJ9aXNQYXJlbnRPZih0KXtsZXQgcj10aGlzLl9fa2V5O2lmKHI9PT10Ll9fa2V5KXJldHVybiExO2Zvcig7dCE9PW51bGw7KXtpZih0Ll9fa2V5PT09cilyZXR1cm4hMDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuITF9Z2V0Tm9kZXNCZXR3ZWVuKHQpe2xldCByPXRoaXMuaXNCZWZvcmUodCksbj1bXSxvPW5ldyBTZXQ7Zm9yKHZhciBpPXRoaXM7Oyl7dmFyIGw9aS5fX2tleTtpZihvLmhhcyhsKXx8KG8uYWRkKGwpLG4ucHVzaChpKSksaT09PXQpYnJlYWs7aWYobD1NKGkpP3I/aS5nZXRGaXJzdENoaWxkKCk6aS5nZXRMYXN0Q2hpbGQoKTpudWxsLGwhPT1udWxsKWk9bDtlbHNlIGlmKGw9cj9pLmdldE5leHRTaWJsaW5nKCk6aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxsIT09bnVsbClpPWw7ZWxzZXtpZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLG8uaGFzKGkuX19rZXkpfHxuLnB1c2goaSksaT09PXQpYnJlYWs7bD1pO2RvIGw9PT1udWxsJiZ6KDY4KSxpPXI/bC5nZXROZXh0U2libGluZygpOmwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD1sLmdldFBhcmVudCgpLGwhPT1udWxsJiYoaSE9PW51bGx8fG8uaGFzKGwuX19rZXkpfHxuLnB1c2gobCkpO3doaWxlKGk9PT1udWxsKX19cmV0dXJuIHJ8fG4ucmV2ZXJzZSgpLG59aXNEaXJ0eSgpe2xldCB0PWplKCkuX2RpcnR5TGVhdmVzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9Z2V0TGF0ZXN0KCl7bGV0IHQ9SXQodGhpcy5fX2tleSk7cmV0dXJuIHQ9PT1udWxsJiZ6KDExMyksdH1nZXRXcml0YWJsZSgpe2hyKCk7dmFyIHQ9bm8oKSxyPWplKCk7dD10Ll9ub2RlTWFwO2xldCBuPXRoaXMuX19rZXksbz10aGlzLmdldExhdGVzdCgpLGk9by5fX3BhcmVudDtyPXIuX2Nsb25lTm90TmVlZGVkO3ZhciBsPUFlKCk7cmV0dXJuIGwhPT1udWxsJiYobC5fY2FjaGVkTm9kZXM9bnVsbCksci5oYXMobik/KEpmKG8pLG8pOihsPW8uY29uc3RydWN0b3IuY2xvbmUobyksbC5fX3BhcmVudD1pLGwuX19uZXh0PW8uX19uZXh0LGwuX19wcmV2PW8uX19wcmV2LE0obykmJk0obCk/KGwuX19maXJzdD1vLl9fZmlyc3QsbC5fX2xhc3Q9by5fX2xhc3QsbC5fX3NpemU9by5fX3NpemUsbC5fX2luZGVudD1vLl9faW5kZW50LGwuX19mb3JtYXQ9by5fX2Zvcm1hdCxsLl9fZGlyPW8uX19kaXIpOkYobykmJkYobCkmJihsLl9fZm9ybWF0PW8uX19mb3JtYXQsbC5fX3N0eWxlPW8uX19zdHlsZSxsLl9fbW9kZT1vLl9fbW9kZSxsLl9fZGV0YWlsPW8uX19kZXRhaWwpLHIuYWRkKG4pLGwuX19rZXk9bixKZihsKSx0LnNldChuLGwpLGwpfWdldFRleHRDb250ZW50KCl7cmV0dXJuIiJ9Z2V0VGV4dENvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9Y3JlYXRlRE9NKCl7eig3MCl9dXBkYXRlRE9NKCl7eig3MSl9ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnRoaXMuY3JlYXRlRE9NKHQuX2NvbmZpZyx0KX19ZXhwb3J0SlNPTigpe3ooNzIpfXN0YXRpYyBpbXBvcnRKU09OKCl7eigxOCx0aGlzLm5hbWUpfXN0YXRpYyB0cmFuc2Zvcm0oKXtyZXR1cm4gbnVsbH1yZW1vdmUodCl7WTAodGhpcywhMCx0KX1yZXBsYWNlKHQscil7aHIoKTt2YXIgbj1BZSgpO24hPT1udWxsJiYobj1uLmNsb25lKCkpLF8wKHRoaXMsdCk7bGV0IG89dGhpcy5nZXRMYXRlc3QoKSxpPXRoaXMuX19rZXksbD10Ll9fa2V5LHM9dC5nZXRXcml0YWJsZSgpO3Q9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYT10Ll9fc2l6ZTtwbChzKTtsZXQgdT1vLmdldFByZXZpb3VzU2libGluZygpLHA9by5nZXROZXh0U2libGluZygpLGM9by5fX3ByZXYsZj1vLl9fbmV4dCxkPW8uX19wYXJlbnQ7cmV0dXJuIFkwKG8sITEsITApLHU9PT1udWxsP3QuX19maXJzdD1sOnUuZ2V0V3JpdGFibGUoKS5fX25leHQ9bCxzLl9fcHJldj1jLHA9PT1udWxsP3QuX19sYXN0PWw6cC5nZXRXcml0YWJsZSgpLl9fcHJldj1sLHMuX19uZXh0PWYscy5fX3BhcmVudD1kLHQuX19zaXplPWEsciYmdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobT0+e3MuYXBwZW5kKG0pfSksUShuKSYmKGVvKG4pLHI9bi5hbmNob3Isbj1uLmZvY3VzLHIua2V5PT09aSYmUEMocixzKSxuLmtleT09PWkmJlBDKG4scykpLGJpKCk9PT1pJiZXdChsKSxzfWluc2VydEFmdGVyKHQscj0hMCl7aHIoKSxfMCh0aGlzLHQpO3ZhciBuPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgbz10LmdldFdyaXRhYmxlKCk7dmFyIGk9by5nZXRQYXJlbnQoKTtsZXQgbD1BZSgpO3ZhciBzPSExLGE9ITE7aWYoaSE9PW51bGwpe3ZhciB1PXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTtwbChvKSxRKGwpJiYoYT1pLl9fa2V5LHM9bC5hbmNob3IsaT1sLmZvY3VzLHM9cy50eXBlPT09ImVsZW1lbnQiJiZzLmtleT09PWEmJnMub2Zmc2V0PT09dSsxLGE9aS50eXBlPT09ImVsZW1lbnQiJiZpLmtleT09PWEmJmkub2Zmc2V0PT09dSsxKX1pPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSx1PXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldFdyaXRhYmxlKCk7bGV0IHA9by5fX2tleSxjPW4uX19uZXh0O3JldHVybiBpPT09bnVsbD91Ll9fbGFzdD1wOmkuZ2V0V3JpdGFibGUoKS5fX3ByZXY9cCx1Ll9fc2l6ZSsrLG4uX19uZXh0PXAsby5fX25leHQ9YyxvLl9fcHJldj1uLl9fa2V5LG8uX19wYXJlbnQ9bi5fX3BhcmVudCxyJiZRKGwpJiYocj10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCksc2QobCx1LHIrMSksbj11Ll9fa2V5LHMmJmwuYW5jaG9yLnNldChuLHIrMiwiZWxlbWVudCIpLGEmJmwuZm9jdXMuc2V0KG4scisyLCJlbGVtZW50IikpLHR9aW5zZXJ0QmVmb3JlKHQscj0hMCl7aHIoKSxfMCh0aGlzLHQpO3ZhciBuPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgbz10LmdldFdyaXRhYmxlKCksaT1vLl9fa2V5O3BsKG8pO2xldCBsPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscz10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpLGE9bi5fX3ByZXYsdT10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCk7cmV0dXJuIGw9PT1udWxsP3MuX19maXJzdD1pOmwuZ2V0V3JpdGFibGUoKS5fX25leHQ9aSxzLl9fc2l6ZSsrLG4uX19wcmV2PWksby5fX3ByZXY9YSxvLl9fbmV4dD1uLl9fa2V5LG8uX19wYXJlbnQ9bi5fX3BhcmVudCxuPUFlKCksciYmUShuKSYmKHI9dGhpcy5nZXRQYXJlbnRPclRocm93KCksc2QobixyLHUpKSx0fWlzUGFyZW50UmVxdWlyZWQoKXtyZXR1cm4hMX1jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpe3JldHVybiB5bCgpfXNlbGVjdFByZXZpb3VzKHQscil7aHIoKTtsZXQgbj10aGlzLmdldFByZXZpb3VzU2libGluZygpLG89dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIG49PT1udWxsP28uc2VsZWN0KDAsMCk6TShuKT9uLnNlbGVjdCgpOkYobik/bi5zZWxlY3QodCxyKToodD1uLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSxvLnNlbGVjdCh0LHQpKX1zZWxlY3ROZXh0KHQscil7aHIoKTtsZXQgbj10aGlzLmdldE5leHRTaWJsaW5nKCksbz10aGlzLmdldFBhcmVudE9yVGhyb3coKTtyZXR1cm4gbj09PW51bGw/by5zZWxlY3QoKTpNKG4pP24uc2VsZWN0KDAsMCk6RihuKT9uLnNlbGVjdCh0LHIpOih0PW4uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxvLnNlbGVjdCh0LHQpKX1tYXJrRGlydHkoKXt0aGlzLmdldFdyaXRhYmxlKCl9fSwkcz1jbGFzcyBlIGV4dGVuZHMgbWx7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluZWJyZWFrIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBlKHQuX19rZXkpfWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWdldFRleHRDb250ZW50KCl7cmV0dXJuXGAKXGB9Y3JlYXRlRE9NKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIil9dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnticjp0PT57bGV0IHI9dC5wYXJlbnRFbGVtZW50LG4sbztyZXR1cm4gciE9PW51bGwmJigobj1yLmZpcnN0Q2hpbGQpPT09dHx8bi5uZXh0U2libGluZz09PXQmJm4ubm9kZVR5cGU9PT0zJiYobi50ZXh0Q29udGVudHx8IiIpLm1hdGNoKC9eKCB8XHR8XHI/XG4pKyQvKSE9PW51bGwpJiYoKG89ci5sYXN0Q2hpbGQpPT09dHx8by5wcmV2aW91c1NpYmxpbmc9PT10JiZvLm5vZGVUeXBlPT09MyYmKG8udGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKT9udWxsOntjb252ZXJzaW9uOko1LHByaW9yaXR5OjB9fX19c3RhdGljIGltcG9ydEpTT04oKXtyZXR1cm4ganMoKX1leHBvcnRKU09OKCl7cmV0dXJue3R5cGU6ImxpbmVicmVhayIsdmVyc2lvbjoxfX19O2Z1bmN0aW9uIEo1KCl7cmV0dXJue25vZGU6anMoKX19ZnVuY3Rpb24ganMoKXtyZXR1cm4gWXUobmV3ICRzKX1mdW5jdGlvbiBWdShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mICRzfWZ1bmN0aW9uIGIwKGUsdCl7cmV0dXJuIHQmMTY/ImNvZGUiOnQmMTI4PyJtYXJrIjp0JjMyPyJzdWIiOnQmNjQ/InN1cCI6bnVsbH1mdW5jdGlvbiBFMChlLHQpe3JldHVybiB0JjE/InN0cm9uZyI6dCYyPyJlbSI6InNwYW4ifWZ1bmN0aW9uIFAwKGUsdCxyLG4sbyl7ZT1uLmNsYXNzTGlzdCxuPUR1KG8sImJhc2UiKSxuIT09dm9pZCAwJiZlLmFkZCguLi5uKSxuPUR1KG8sInVuZGVybGluZVN0cmlrZXRocm91Z2giKTtsZXQgaT0hMSxsPXQmOCYmdCY0O3ZhciBzPXImOCYmciY0O24hPT12b2lkIDAmJihzPyhpPSEwLGx8fGUuYWRkKC4uLm4pKTpsJiZlLnJlbW92ZSguLi5uKSk7Zm9yKGxldCBhIGluIGNsKXM9Y2xbYV0sbj1EdShvLGEpLG4hPT12b2lkIDAmJihyJnM/IWl8fGEhPT0idW5kZXJsaW5lIiYmYSE9PSJzdHJpa2V0aHJvdWdoIj8oISh0JnMpfHxsJiZhPT09InVuZGVybGluZSJ8fGE9PT0ic3RyaWtldGhyb3VnaCIpJiZlLmFkZCguLi5uKTp0JnMmJmUucmVtb3ZlKC4uLm4pOnQmcyYmZS5yZW1vdmUoLi4ubikpfWZ1bmN0aW9uIE0wKGUsdCxyKXtsZXQgbj10LmZpcnN0Q2hpbGQ7aWYocj1yLmlzQ29tcG9zaW5nKCksZSs9cj9oZDoiIixuPT1udWxsKXQudGV4dENvbnRlbnQ9ZTtlbHNlIGlmKHQ9bi5ub2RlVmFsdWUsdCE9PWUpaWYocnx8RWkpe3I9dC5sZW5ndGg7bGV0IG89ZS5sZW5ndGgsaT0wLGw9MDtmb3IoO2k8ciYmaTxvJiZ0W2ldPT09ZVtpXTspaSsrO2Zvcig7bCtpPHImJmwraTxvJiZ0W3ItbC0xXT09PWVbby1sLTFdOylsKys7ZT1baSxyLWktbCxlLnNsaWNlKGksby1sKV07bGV0W3MsYSx1XT1lO2EhPT0wJiZuLmRlbGV0ZURhdGEocyxhKSxuLmluc2VydERhdGEocyx1KX1lbHNlIG4ubm9kZVZhbHVlPWV9ZnVuY3Rpb24gUmYoZSx0KXtyZXR1cm4gdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpLHQuYXBwZW5kQ2hpbGQoZSksdH12YXIgaGw9Y2xhc3MgZSBleHRlbmRzIG1se3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInRleHQifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IGUodC5fX3RleHQsdC5fX2tleSl9Y29uc3RydWN0b3IodCxyKXtzdXBlcihyKSx0aGlzLl9fdGV4dD10LHRoaXMuX19mb3JtYXQ9MCx0aGlzLl9fc3R5bGU9IiIsdGhpcy5fX2RldGFpbD10aGlzLl9fbW9kZT0wfWdldEZvcm1hdCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0fWdldERldGFpbCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsfWdldE1vZGUoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpO3JldHVybiBPNVt0Ll9fbW9kZV19Z2V0U3R5bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3N0eWxlfWlzVG9rZW4oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX21vZGU9PT0xfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX19rZXk9PT1iaSgpfWlzU2VnbWVudGVkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09Mn1pc0RpcmVjdGlvbmxlc3MoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYxKSE9PTB9aXNVbm1lcmdlYWJsZSgpe3JldHVybih0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsJjIpIT09MH1oYXNGb3JtYXQodCl7cmV0dXJuIHQ9Y2xbdF0sKHRoaXMuZ2V0Rm9ybWF0KCkmdCkhPT0wfWlzU2ltcGxlVGV4dCgpe3JldHVybiB0aGlzLl9fdHlwZT09PSJ0ZXh0IiYmdGhpcy5fX21vZGU9PT0wfWdldFRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190ZXh0fWdldEZvcm1hdEZsYWdzKHQscil7bGV0IG49dGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdDtyZXR1cm4gZlQobix0LHIpfWNyZWF0ZURPTSh0KXt2YXIgcj10aGlzLl9fZm9ybWF0LG49YjAodGhpcyxyKTtsZXQgbz1FMCh0aGlzLHIpLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuPT09bnVsbD9vOm4pLGw9aTtyZXR1cm4gdGhpcy5oYXNGb3JtYXQoImNvZGUiKSYmaS5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCJmYWxzZSIpLG4hPT1udWxsJiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KG8pLGkuYXBwZW5kQ2hpbGQobCkpLG49bCxNMCh0aGlzLl9fdGV4dCxuLHRoaXMpLHQ9dC50aGVtZS50ZXh0LHQhPT12b2lkIDAmJlAwKG8sMCxyLG4sdCkscj10aGlzLl9fc3R5bGUsciE9PSIiJiYoaS5zdHlsZS5jc3NUZXh0PXIpLGl9dXBkYXRlRE9NKHQscixuKXtsZXQgbz10aGlzLl9fdGV4dDt2YXIgaT10Ll9fZm9ybWF0LGw9dGhpcy5fX2Zvcm1hdCxzPWIwKHRoaXMsaSk7bGV0IGE9YjAodGhpcyxsKTt2YXIgdT1FMCh0aGlzLGkpO2xldCBwPUUwKHRoaXMsbCk7cmV0dXJuKHM9PT1udWxsP3U6cykhPT0oYT09PW51bGw/cDphKT8hMDpzPT09YSYmdSE9PXA/KGk9ci5maXJzdENoaWxkLGk9PW51bGwmJnooNDgpLHQ9cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHApLE0wKG8sdCx0aGlzKSxuPW4udGhlbWUudGV4dCxuIT09dm9pZCAwJiZQMChwLDAsbCx0LG4pLHIucmVwbGFjZUNoaWxkKHMsaSksITEpOih1PXIsYSE9PW51bGwmJnMhPT1udWxsJiYodT1yLmZpcnN0Q2hpbGQsdT09bnVsbCYmeig0OSkpLE0wKG8sdSx0aGlzKSxuPW4udGhlbWUudGV4dCxuIT09dm9pZCAwJiZpIT09bCYmUDAocCxpLGwsdSxuKSxsPXRoaXMuX19zdHlsZSx0Ll9fc3R5bGUhPT1sJiYoci5zdHlsZS5jc3NUZXh0PWwpLCExKX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJueyIjdGV4dCI6KCk9Pih7Y29udmVyc2lvbjpyRSxwcmlvcml0eTowfSksYjooKT0+KHtjb252ZXJzaW9uOnRFLHByaW9yaXR5OjB9KSxjb2RlOigpPT4oe2NvbnZlcnNpb246X2kscHJpb3JpdHk6MH0pLGVtOigpPT4oe2NvbnZlcnNpb246X2kscHJpb3JpdHk6MH0pLGk6KCk9Pih7Y29udmVyc2lvbjpfaSxwcmlvcml0eTowfSksczooKT0+KHtjb252ZXJzaW9uOl9pLHByaW9yaXR5OjB9KSxzcGFuOigpPT4oe2NvbnZlcnNpb246ZUUscHJpb3JpdHk6MH0pLHN0cm9uZzooKT0+KHtjb252ZXJzaW9uOl9pLHByaW9yaXR5OjB9KSxzdWI6KCk9Pih7Y29udmVyc2lvbjpfaSxwcmlvcml0eTowfSksc3VwOigpPT4oe2NvbnZlcnNpb246X2kscHJpb3JpdHk6MH0pLHU6KCk9Pih7Y29udmVyc2lvbjpfaSxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCByPU10KHQudGV4dCk7cmV0dXJuIHIuc2V0Rm9ybWF0KHQuZm9ybWF0KSxyLnNldERldGFpbCh0LmRldGFpbCksci5zZXRNb2RlKHQubW9kZSksci5zZXRTdHlsZSh0LnN0eWxlKSxyfWV4cG9ydERPTSh0KXtyZXR1cm57ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCE9PW51bGwmJnZkKHQpfHx6KDEzMiksdC5zdHlsZS53aGl0ZVNwYWNlPSJwcmUtd3JhcCIsdGhpcy5oYXNGb3JtYXQoImJvbGQiKSYmKHQ9UmYodCwiYiIpKSx0aGlzLmhhc0Zvcm1hdCgiaXRhbGljIikmJih0PVJmKHQsImkiKSksdGhpcy5oYXNGb3JtYXQoInN0cmlrZXRocm91Z2giKSYmKHQ9UmYodCwicyIpKSx0aGlzLmhhc0Zvcm1hdCgidW5kZXJsaW5lIikmJih0PVJmKHQsInUiKSkse2VsZW1lbnQ6dH19ZXhwb3J0SlNPTigpe3JldHVybntkZXRhaWw6dGhpcy5nZXREZXRhaWwoKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXQoKSxtb2RlOnRoaXMuZ2V0TW9kZSgpLHN0eWxlOnRoaXMuZ2V0U3R5bGUoKSx0ZXh0OnRoaXMuZ2V0VGV4dENvbnRlbnQoKSx0eXBlOiJ0ZXh0Iix2ZXJzaW9uOjF9fXNlbGVjdGlvblRyYW5zZm9ybSgpe31zZXRGb3JtYXQodCl7bGV0IHI9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiByLl9fZm9ybWF0PXR5cGVvZiB0PT0ic3RyaW5nIj9jbFt0XTp0LHJ9c2V0RGV0YWlsKHQpe2xldCByPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gci5fX2RldGFpbD10eXBlb2YgdD09InN0cmluZyI/TDVbdF06dCxyfXNldFN0eWxlKHQpe2xldCByPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gci5fX3N0eWxlPXQscn10b2dnbGVGb3JtYXQodCl7cmV0dXJuIHQ9Y2xbdF0sdGhpcy5zZXRGb3JtYXQodGhpcy5nZXRGb3JtYXQoKV50KX10b2dnbGVEaXJlY3Rpb25sZXNzKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0Ll9fZGV0YWlsXj0xLHR9dG9nZ2xlVW5tZXJnZWFibGUoKXtsZXQgdD10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHQuX19kZXRhaWxePTIsdH1zZXRNb2RlKHQpe2lmKHQ9RDVbdF0sdGhpcy5fX21vZGU9PT10KXJldHVybiB0aGlzO2xldCByPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gci5fX21vZGU9dCxyfXNldFRleHRDb250ZW50KHQpe2lmKHRoaXMuX190ZXh0PT09dClyZXR1cm4gdGhpcztsZXQgcj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHIuX190ZXh0PXQscn1zZWxlY3QodCxyKXtocigpO2xldCBuPUFlKCk7dmFyIG89dGhpcy5nZXRUZXh0Q29udGVudCgpO2xldCBpPXRoaXMuX19rZXk7aWYodHlwZW9mIG89PSJzdHJpbmciPyhvPW8ubGVuZ3RoLHQ9PT12b2lkIDAmJih0PW8pLHI9PT12b2lkIDAmJihyPW8pKTpyPXQ9MCxRKG4pKW89YmkoKSxvIT09bi5hbmNob3Iua2V5JiZvIT09bi5mb2N1cy5rZXl8fFd0KGkpLG4uc2V0VGV4dE5vZGVSYW5nZSh0aGlzLHQsdGhpcyxyKTtlbHNlIHJldHVybiAkVChpLHQsaSxyLCJ0ZXh0IiwidGV4dCIpO3JldHVybiBufXNwbGljZVRleHQodCxyLG4sbyl7bGV0IGk9dGhpcy5nZXRXcml0YWJsZSgpLGw9aS5fX3RleHQscz1uLmxlbmd0aCxhPXQ7MD5hJiYoYT1zK2EsMD5hJiYoYT0wKSk7bGV0IHU9QWUoKTtyZXR1cm4gbyYmUSh1KSYmKHQrPXMsdS5zZXRUZXh0Tm9kZVJhbmdlKGksdCxpLHQpKSxyPWwuc2xpY2UoMCxhKStuK2wuc2xpY2UoYStyKSxpLl9fdGV4dD1yLGl9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfXNwbGl0VGV4dCguLi50KXtocigpO3ZhciByPXRoaXMuZ2V0TGF0ZXN0KCksbj1yLmdldFRleHRDb250ZW50KCksbz1yLl9fa2V5LGk9YmkoKSxsPW5ldyBTZXQodCk7dD1bXTtmb3IodmFyIHM9bi5sZW5ndGgsYT0iIix1PTA7dTxzO3UrKylhIT09IiImJmwuaGFzKHUpJiYodC5wdXNoKGEpLGE9IiIpLGErPW5bdV07aWYoYSE9PSIiJiZ0LnB1c2goYSksbD10Lmxlbmd0aCxsPT09MClyZXR1cm5bXTtpZih0WzBdPT09bilyZXR1cm5bcl07dmFyIHA9dFswXTtuPXIuZ2V0UGFyZW50T3JUaHJvdygpLHU9ci5nZXRGb3JtYXQoKTtsZXQgYz1yLmdldFN0eWxlKCksZj1yLl9fZGV0YWlsO3M9ITEsci5pc1NlZ21lbnRlZCgpPyhhPU10KHApLGEuX19mb3JtYXQ9dSxhLl9fc3R5bGU9YyxhLl9fZGV0YWlsPWYscz0hMCk6KGE9ci5nZXRXcml0YWJsZSgpLGEuX190ZXh0PXApLHI9QWUoKSxhPVthXSxwPXAubGVuZ3RoO2ZvcihsZXQgaD0xO2g8bDtoKyspe3ZhciBkPXRbaF0sbT1kLmxlbmd0aDtkPU10KGQpLmdldFdyaXRhYmxlKCksZC5fX2Zvcm1hdD11LGQuX19zdHlsZT1jLGQuX19kZXRhaWw9ZjtsZXQgUz1kLl9fa2V5O2lmKG09cCttLFEocikpe2xldCB5PXIuYW5jaG9yLHY9ci5mb2N1czt5LmtleT09PW8mJnkudHlwZT09PSJ0ZXh0IiYmeS5vZmZzZXQ+cCYmeS5vZmZzZXQ8PW0mJih5LmtleT1TLHkub2Zmc2V0LT1wLHIuZGlydHk9ITApLHYua2V5PT09byYmdi50eXBlPT09InRleHQiJiZ2Lm9mZnNldD5wJiZ2Lm9mZnNldDw9bSYmKHYua2V5PVMsdi5vZmZzZXQtPXAsci5kaXJ0eT0hMCl9aT09PW8mJld0KFMpLHA9bSxhLnB1c2goZCl9cmV0dXJuIG89dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvIT09bnVsbCYmSmYobyksaSE9PW51bGwmJkpmKGkpLG89bi5nZXRXcml0YWJsZSgpLGk9dGhpcy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHM/KG8uc3BsaWNlKGksMCxhKSx0aGlzLnJlbW92ZSgpKTpvLnNwbGljZShpLDEsYSksUShyKSYmc2QocixuLGksbC0xKSxhfW1lcmdlV2l0aFNpYmxpbmcodCl7dmFyIHI9dD09PXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7cnx8dD09PXRoaXMuZ2V0TmV4dFNpYmxpbmcoKXx8eig1MCk7dmFyIG49dGhpcy5fX2tleTtsZXQgbz10Ll9fa2V5LGk9dGhpcy5fX3RleHQsbD1pLmxlbmd0aDtiaSgpPT09byYmV3Qobik7bGV0IHM9QWUoKTtpZihRKHMpKXtsZXQgYT1zLmFuY2hvcix1PXMuZm9jdXM7YSE9PW51bGwmJmEua2V5PT09byYmKHpDKGEscixuLHQsbCkscy5kaXJ0eT0hMCksdSE9PW51bGwmJnUua2V5PT09byYmKHpDKHUscixuLHQsbCkscy5kaXJ0eT0hMCl9cmV0dXJuIG49dC5fX3RleHQsdGhpcy5zZXRUZXh0Q29udGVudChyP24raTppK24pLHI9dGhpcy5nZXRXcml0YWJsZSgpLHQucmVtb3ZlKCkscn1pc1RleHRFbnRpdHkoKXtyZXR1cm4hMX19O2Z1bmN0aW9uIGVFKGUpe2xldCB0PWUuc3R5bGUuZm9udFdlaWdodD09PSI3MDAiLHI9ZS5zdHlsZS50ZXh0RGVjb3JhdGlvbj09PSJsaW5lLXRocm91Z2giLG49ZS5zdHlsZS5mb250U3R5bGU9PT0iaXRhbGljIixvPWUuc3R5bGUudGV4dERlY29yYXRpb249PT0idW5kZXJsaW5lIixpPWUuc3R5bGUudmVydGljYWxBbGlnbjtyZXR1cm57Zm9yQ2hpbGQ6bD0+KEYobCkmJih0JiZsLnRvZ2dsZUZvcm1hdCgiYm9sZCIpLHImJmwudG9nZ2xlRm9ybWF0KCJzdHJpa2V0aHJvdWdoIiksbiYmbC50b2dnbGVGb3JtYXQoIml0YWxpYyIpLG8mJmwudG9nZ2xlRm9ybWF0KCJ1bmRlcmxpbmUiKSxpPT09InN1YiImJmwudG9nZ2xlRm9ybWF0KCJzdWJzY3JpcHQiKSxpPT09InN1cGVyIiYmbC50b2dnbGVGb3JtYXQoInN1cGVyc2NyaXB0IikpLGwpLG5vZGU6bnVsbH19ZnVuY3Rpb24gdEUoZSl7bGV0IHQ9ZS5zdHlsZS5mb250V2VpZ2h0PT09Im5vcm1hbCI7cmV0dXJue2ZvckNoaWxkOnI9PihGKHIpJiYhdCYmci50b2dnbGVGb3JtYXQoImJvbGQiKSxyKSxub2RlOm51bGx9fXZhciBiQz1uZXcgV2Vha01hcDtmdW5jdGlvbiByRShlKXtlLnBhcmVudEVsZW1lbnQ9PT1udWxsJiZ6KDEyOSk7Zm9yKHZhciB0PWUudGV4dENvbnRlbnR8fCIiLHIsbj1lLnBhcmVudE5vZGUsbz1bZV07biE9PW51bGwmJihyPWJDLmdldChuKSk9PT12b2lkIDAmJiEobi5ub2RlTmFtZT09PSJQUkUifHxuLm5vZGVUeXBlPT09MSYmbi5zdHlsZS53aGl0ZVNwYWNlLnN0YXJ0c1dpdGgoInByZSIpKTspby5wdXNoKG4pLG49bi5wYXJlbnROb2RlO2ZvcihyPXI9PT12b2lkIDA/bjpyLG49MDtuPG8ubGVuZ3RoO24rKyliQy5zZXQob1tuXSxyKTtpZihyIT09bnVsbCl7Zm9yKHQ9dC5zcGxpdCgvKFxyP1xufFx0KS8pLGU9W10sbz10Lmxlbmd0aCxyPTA7cjxvO3IrKyluPXRbcl0sbj09PVxgClxgfHxuPT09XGBccgpcYD9lLnB1c2goanMoKSk6bj09PSIJIj9lLnB1c2god2QoKSk6biE9PSIiJiZlLnB1c2goTXQobikpO3JldHVybntub2RlOmV9fWlmKHQ9dC5yZXBsYWNlKC9cci9nLCIiKS5yZXBsYWNlKC9bIFx0XG5dKy9nLCIgIiksdD09PSIiKXJldHVybntub2RlOm51bGx9O2lmKHRbMF09PT0iICIpe2ZvcihvPWUscj0hMDtvIT09bnVsbCYmKG89RUMobywhMSkpIT09bnVsbDspaWYobj1vLnRleHRDb250ZW50fHwiIiwwPG4ubGVuZ3RoKXsvWyBcdFxuXSQvLnRlc3QobikmJih0PXQuc2xpY2UoMSkpLHI9ITE7YnJlYWt9ciYmKHQ9dC5zbGljZSgxKSl9aWYodFt0Lmxlbmd0aC0xXT09PSIgIil7Zm9yKG89ITA7ZSE9PW51bGwmJihlPUVDKGUsITApKSE9PW51bGw7KWlmKDA8KGUudGV4dENvbnRlbnR8fCIiKS5yZXBsYWNlKC9eKCB8XHR8XHI/XG4pKy8sIiIpLmxlbmd0aCl7bz0hMTticmVha31vJiYodD10LnNsaWNlKDAsdC5sZW5ndGgtMSkpfXJldHVybiB0PT09IiI/e25vZGU6bnVsbH06e25vZGU6TXQodCl9fXZhciBuRT1uZXcgUmVnRXhwKC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvLCJpIik7ZnVuY3Rpb24gRUMoZSx0KXtmb3IoOzspe2Zvcih2YXIgcj12b2lkIDA7KHI9dD9lLm5leHRTaWJsaW5nOmUucHJldmlvdXNTaWJsaW5nKT09PW51bGw7KWlmKGU9ZS5wYXJlbnRFbGVtZW50LGU9PT1udWxsKXJldHVybiBudWxsO2lmKGU9cixlLm5vZGVUeXBlPT09MSYmKHI9ZS5zdHlsZS5kaXNwbGF5LHI9PT0iIiYmZS5ub2RlTmFtZS5tYXRjaChuRSk9PT1udWxsfHxyIT09IiImJiFyLnN0YXJ0c1dpdGgoImlubGluZSIpKSlyZXR1cm4gbnVsbDtmb3IoOyhyPXQ/ZS5maXJzdENoaWxkOmUubGFzdENoaWxkKSE9PW51bGw7KWU9cjtpZihlLm5vZGVUeXBlPT09MylyZXR1cm4gZTtpZihlLm5vZGVOYW1lPT09IkJSIilyZXR1cm4gbnVsbH19dmFyIG9FPXtjb2RlOiJjb2RlIixlbToiaXRhbGljIixpOiJpdGFsaWMiLHM6InN0cmlrZXRocm91Z2giLHN0cm9uZzoiYm9sZCIsc3ViOiJzdWJzY3JpcHQiLHN1cDoic3VwZXJzY3JpcHQiLHU6InVuZGVybGluZSJ9O2Z1bmN0aW9uIF9pKGUpe2xldCB0PW9FW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIHQ9PT12b2lkIDA/e25vZGU6bnVsbH06e2ZvckNoaWxkOnI9PihGKHIpJiYhci5oYXNGb3JtYXQodCkmJnIudG9nZ2xlRm9ybWF0KHQpLHIpLG5vZGU6bnVsbH19ZnVuY3Rpb24gTXQoZT0iIil7cmV0dXJuIFl1KG5ldyBobChlKSl9ZnVuY3Rpb24gRihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGhsfXZhciBXcz1jbGFzcyBlIGV4dGVuZHMgaGx7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGFiIn1zdGF0aWMgY2xvbmUodCl7bGV0IHI9bmV3IGUodC5fX2tleSk7cmV0dXJuIHIuX190ZXh0PXQuX190ZXh0LHIuX19mb3JtYXQ9dC5fX2Zvcm1hdCxyLl9fc3R5bGU9dC5fX3N0eWxlLHJ9Y29uc3RydWN0b3IodCl7c3VwZXIoIgkiLHQpLHRoaXMuX19kZXRhaWw9Mn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9c3RhdGljIGltcG9ydEpTT04odCl7bGV0IHI9d2QoKTtyZXR1cm4gci5zZXRGb3JtYXQodC5mb3JtYXQpLHIuc2V0U3R5bGUodC5zdHlsZSkscn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJ0YWIiLHZlcnNpb246MX19c2V0VGV4dENvbnRlbnQoKXt6KDEyNil9c2V0RGV0YWlsKCl7eigxMjcpfXNldE1vZGUoKXt6KDEyOCl9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfX07ZnVuY3Rpb24gd2QoKXtyZXR1cm4gWXUobmV3IFdzKX12YXIgd249Y2xhc3N7Y29uc3RydWN0b3IodCxyLG4pe3RoaXMuX3NlbGVjdGlvbj1udWxsLHRoaXMua2V5PXQsdGhpcy5vZmZzZXQ9cix0aGlzLnR5cGU9bn1pcyh0KXtyZXR1cm4gdGhpcy5rZXk9PT10LmtleSYmdGhpcy5vZmZzZXQ9PT10Lm9mZnNldCYmdGhpcy50eXBlPT09dC50eXBlfWlzQmVmb3JlKHQpe2xldCByPXRoaXMuZ2V0Tm9kZSgpLG49dC5nZXROb2RlKCksbz10aGlzLm9mZnNldDtpZih0PXQub2Zmc2V0LE0ocikpe3ZhciBpPXIuZ2V0RGVzY2VuZGFudEJ5SW5kZXgobyk7cj1pPz9yfXJldHVybiBNKG4pJiYoaT1uLmdldERlc2NlbmRhbnRCeUluZGV4KHQpLG49aT8/bikscj09PW4/bzx0OnIuaXNCZWZvcmUobil9Z2V0Tm9kZSgpe2xldCB0PUl0KHRoaXMua2V5KTtyZXR1cm4gdD09PW51bGwmJnooMjApLHR9c2V0KHQscixuKXtsZXQgbz10aGlzLl9zZWxlY3Rpb24saT10aGlzLmtleTt0aGlzLmtleT10LHRoaXMub2Zmc2V0PXIsdGhpcy50eXBlPW4sR3MoKXx8KGJpKCk9PT1pJiZXdCh0KSxvIT09bnVsbCYmKG8uX2NhY2hlZE5vZGVzPW51bGwsby5kaXJ0eT0hMCkpfX07ZnVuY3Rpb24gSTAoZSx0KXtsZXQgcj10Ll9fa2V5LG49ZS5vZmZzZXQsbz0iZWxlbWVudCI7aWYoRih0KSlvPSJ0ZXh0Iix0PXQuZ2V0VGV4dENvbnRlbnRTaXplKCksbj50JiYobj10KTtlbHNlIGlmKCFNKHQpKXt2YXIgaT10LmdldE5leHRTaWJsaW5nKCk7RihpKT8ocj1pLl9fa2V5LG49MCxvPSJ0ZXh0Iik6KGk9dC5nZXRQYXJlbnQoKSkmJihyPWkuX19rZXksbj10LmdldEluZGV4V2l0aGluUGFyZW50KCkrMSl9ZS5zZXQocixuLG8pfWZ1bmN0aW9uIFBDKGUsdCl7aWYoTSh0KSl7bGV0IHI9dC5nZXRMYXN0RGVzY2VuZGFudCgpO00ocil8fEYocik/STAoZSxyKTpJMChlLHQpfWVsc2UgSTAoZSx0KX1mdW5jdGlvbiBNQyhlLHQscixuKXtsZXQgbz1lLmdldE5vZGUoKSxpPW8uZ2V0Q2hpbGRBdEluZGV4KGUub2Zmc2V0KSxsPU10KCkscz1ncihvKT95bCgpLmFwcGVuZChsKTpsO2wuc2V0Rm9ybWF0KHIpLGwuc2V0U3R5bGUobiksaT09PW51bGw/by5hcHBlbmQocyk6KGkuaW5zZXJ0QmVmb3JlKHMpLHQudHlwZT09PSJlbGVtZW50IiYmdC5rZXk9PT1lLmtleSYmdC5vZmZzZXQhPT1lLm9mZnNldCYmdC5zZXQodC5rZXksdC5vZmZzZXQrMSwiZWxlbWVudCIpKSxlLmlzKHQpJiZ0LnNldChsLl9fa2V5LDAsInRleHQiKSxlLnNldChsLl9fa2V5LDAsInRleHQiKX1mdW5jdGlvbiBraShlLHQscixuKXtlLmtleT10LGUub2Zmc2V0PXIsZS50eXBlPW59dmFyIGlkPWNsYXNzIGV7Y29uc3RydWN0b3IodCl7dGhpcy5kaXJ0eT0hMSx0aGlzLl9ub2Rlcz10LHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aXModCl7aWYoIVZzKHQpKXJldHVybiExO2xldCByPXRoaXMuX25vZGVzLG49dC5fbm9kZXM7cmV0dXJuIHIuc2l6ZT09PW4uc2l6ZSYmQXJyYXkuZnJvbShyKS5ldmVyeShvPT5uLmhhcyhvKSl9YWRkKHQpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuYWRkKHQpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9ZGVsZXRlKHQpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuZGVsZXRlKHQpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xlYXIoKXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmNsZWFyKCksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1oYXModCl7cmV0dXJuIHRoaXMuX25vZGVzLmhhcyh0KX1jbG9uZSgpe3JldHVybiBuZXcgZShuZXcgU2V0KHRoaXMuX25vZGVzKSl9ZXh0cmFjdCgpe3JldHVybiB0aGlzLmdldE5vZGVzKCl9aW5zZXJ0UmF3VGV4dCgpe31pbnNlcnRUZXh0KCl7fWluc2VydE5vZGVzKHQscil7bGV0IG49dGhpcy5nZXROb2RlcygpLG89bi5sZW5ndGg7dmFyIGk9bltvLTFdO2lmKEYoaSkpaT1pLnNlbGVjdCgpO2Vsc2V7bGV0IGw9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzE7aT1pLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3QobCxsKX1mb3IoaS5pbnNlcnROb2Rlcyh0LHIpLHQ9MDt0PG87dCsrKW5bdF0ucmVtb3ZlKCk7cmV0dXJuITB9Z2V0Tm9kZXMoKXt2YXIgdD10aGlzLl9jYWNoZWROb2RlcztpZih0IT09bnVsbClyZXR1cm4gdDt2YXIgcj10aGlzLl9ub2Rlczt0PVtdO2ZvcihsZXQgbiBvZiByKXI9SXQobiksciE9PW51bGwmJnQucHVzaChyKTtyZXR1cm4gR3MoKXx8KHRoaXMuX2NhY2hlZE5vZGVzPXQpLHR9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCkscj0iIjtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylyKz10W25dLmdldFRleHRDb250ZW50KCk7cmV0dXJuIHJ9fTtmdW5jdGlvbiBRKGUpe3JldHVybiBlIGluc3RhbmNlb2YgZ2x9ZnVuY3Rpb24gWDAoZSl7bGV0W3QsLHJdPVdUKGUpO2U9ci5nZXRDaGlsZHJlbigpO2xldCBuPWUubGVuZ3RoO3ZhciBvPWVbMF0uZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7bGV0IGk9QXJyYXkobik7Zm9yKHZhciBsPTA7bDxuO2wrKylpW2xdPUFycmF5KG8pO2ZvcihvPTA7bzxuO28rKyl7bD1lW29dLmdldENoaWxkcmVuKCk7bGV0IHM9MDtmb3IobGV0IGE9MDthPGwubGVuZ3RoO2ErKyl7Zm9yKDtpW29dW3NdOylzKys7bGV0IHU9bFthXSxwPXUuX19yb3dTcGFufHwxLGM9dS5fX2NvbFNwYW58fDE7Zm9yKGxldCBmPTA7ZjxwO2YrKylmb3IobGV0IGQ9MDtkPGM7ZCsrKWlbbytmXVtzK2RdPXU7aWYodD09PXUpcmV0dXJue2NvbFNwYW46Yyxjb2x1bW5JbmRleDpzLHJvd0luZGV4Om8scm93U3BhbjpwfTtzKz1jfX1yZXR1cm4gbnVsbH12YXIgbGQ9Y2xhc3MgZXtjb25zdHJ1Y3Rvcih0LHIsbil7dGhpcy5ncmlkS2V5PXQsdGhpcy5hbmNob3I9cix0aGlzLmZvY3VzPW4sdGhpcy5kaXJ0eT0hMSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHIuX3NlbGVjdGlvbj10aGlzLG4uX3NlbGVjdGlvbj10aGlzfWlzKHQpe3JldHVybiB5eSh0KT90aGlzLmdyaWRLZXk9PT10LmdyaWRLZXkmJnRoaXMuYW5jaG9yLmlzKHQuYW5jaG9yKSYmdGhpcy5mb2N1cy5pcyh0LmZvY3VzKTohMX1zZXQodCxyLG4pe3RoaXMuZGlydHk9ITAsdGhpcy5ncmlkS2V5PXQsdGhpcy5hbmNob3Iua2V5PXIsdGhpcy5mb2N1cy5rZXk9bix0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWNsb25lKCl7cmV0dXJuIG5ldyBlKHRoaXMuZ3JpZEtleSx0aGlzLmFuY2hvcix0aGlzLmZvY3VzKX1pc0NvbGxhcHNlZCgpe3JldHVybiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBLZih0aGlzKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxyKXtsZXQgbj10aGlzLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gdXkobi5zZWxlY3QoMCxuLmdldENoaWxkcmVuU2l6ZSgpKSkuaW5zZXJ0Tm9kZXModCxyKX1nZXRTaGFwZSgpe3ZhciB0PUl0KHRoaXMuYW5jaG9yLmtleSk7aWYoeG4odCl8fHooMTAzKSx0PVgwKHQpLHQ9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBBbmNob3JOb2RlIik7dmFyIHI9SXQodGhpcy5mb2N1cy5rZXkpO3huKHIpfHx6KDEwNCk7bGV0IG49WDAocik7aWYobj09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIGZvY3VzQ2VsbE5vZGUiKTtyPU1hdGgubWluKHQuY29sdW1uSW5kZXgsbi5jb2x1bW5JbmRleCk7bGV0IG89TWF0aC5tYXgodC5jb2x1bW5JbmRleCxuLmNvbHVtbkluZGV4KSxpPU1hdGgubWluKHQucm93SW5kZXgsbi5yb3dJbmRleCk7cmV0dXJuIHQ9TWF0aC5tYXgodC5yb3dJbmRleCxuLnJvd0luZGV4KSx7ZnJvbVg6TWF0aC5taW4ocixvKSxmcm9tWTpNYXRoLm1pbihpLHQpLHRvWDpNYXRoLm1heChyLG8pLHRvWTpNYXRoLm1heChpLHQpfX1nZXROb2Rlcygpe2Z1bmN0aW9uIHQoUyl7bGV0e2NlbGw6eSxzdGFydENvbHVtbjp2LHN0YXJ0Um93Omd9PVM7YT1NYXRoLm1pbihhLHYpLHU9TWF0aC5taW4odSxnKSxwPU1hdGgubWF4KHAsdit5Ll9fY29sU3Bhbi0xKSxjPU1hdGgubWF4KGMsZyt5Ll9fcm93U3Bhbi0xKX12YXIgcj10aGlzLl9jYWNoZWROb2RlcztpZihyIT09bnVsbClyZXR1cm4gcjt2YXIgbj10aGlzLmFuY2hvci5nZXROb2RlKCk7cj10aGlzLmZvY3VzLmdldE5vZGUoKSxuPW5kKG4seG4pO3ZhciBvPW5kKHIseG4pO3huKG4pfHx6KDEwMykseG4obyl8fHooMTA0KSxyPW4uZ2V0UGFyZW50KCkscXUocil8fHooMTA1KSxyPXIuZ2V0UGFyZW50KCksU3kocil8fHooMTA2KTtsZXRbaSxsLHNdPWpUKHIsbixvKSxhPU1hdGgubWluKGwuc3RhcnRDb2x1bW4scy5zdGFydENvbHVtbiksdT1NYXRoLm1pbihsLnN0YXJ0Um93LHMuc3RhcnRSb3cpLHA9TWF0aC5tYXgobC5zdGFydENvbHVtbitsLmNlbGwuX19jb2xTcGFuLTEscy5zdGFydENvbHVtbitzLmNlbGwuX19jb2xTcGFuLTEpLGM9TWF0aC5tYXgobC5zdGFydFJvdytsLmNlbGwuX19yb3dTcGFuLTEscy5zdGFydFJvdytzLmNlbGwuX19yb3dTcGFuLTEpO249YSxvPXU7Zm9yKHZhciBmPWEsZD11O2E8bnx8dTxvfHxwPmZ8fGM+ZDspe2lmKGE8bil7dmFyIG09ZC1vOy0tbjtmb3IodmFyIGg9MDtoPD1tO2grKyl0KGlbbytoXVtuXSl9aWYodTxvKWZvcihtPWYtbiwtLW8saD0wO2g8PW07aCsrKXQoaVtvXVtuK2hdKTtpZihwPmYpZm9yKG09ZC1vLGYrPTEsaD0wO2g8PW07aCsrKXQoaVtvK2hdW2ZdKTtpZihjPmQpZm9yKG09Zi1uLGQrPTEsaD0wO2g8PW07aCsrKXQoaVtkXVtuK2hdKX1mb3Iocj1bcl0sbj1udWxsLG89dTtvPD1jO28rKylmb3IoZj1hO2Y8PXA7ZisrKSh7Y2VsbDpkfT1pW29dW2ZdKSxtPWQuZ2V0UGFyZW50KCkscXUobSl8fHooMTA3KSxtIT09biYmci5wdXNoKG0pLHIucHVzaChkLC4uLkg1KGQpKSxuPW07cmV0dXJuIEdzKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1yKSxyfWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXROb2RlcygpLHI9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspcis9dFtuXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiByfX07ZnVuY3Rpb24geXkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBsZH12YXIgZ2w9Y2xhc3MgZXtjb25zdHJ1Y3Rvcih0LHIsbixvKXt0aGlzLmFuY2hvcj10LHRoaXMuZm9jdXM9cix0aGlzLmRpcnR5PSExLHRoaXMuZm9ybWF0PW4sdGhpcy5zdHlsZT1vLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsdC5fc2VsZWN0aW9uPXRoaXMsci5fc2VsZWN0aW9uPXRoaXN9aXModCl7cmV0dXJuIFEodCk/dGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpJiZ0aGlzLmZvcm1hdD09PXQuZm9ybWF0JiZ0aGlzLnN0eWxlPT09dC5zdHlsZTohMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuYW5jaG9yLmlzKHRoaXMuZm9jdXMpfWdldE5vZGVzKCl7dmFyIHQ9dGhpcy5fY2FjaGVkTm9kZXM7aWYodCE9PW51bGwpcmV0dXJuIHQ7dD10aGlzLmFuY2hvcjt2YXIgcj10aGlzLmZvY3VzLG49dC5pc0JlZm9yZShyKSxvPW4/dDpyO249bj9yOnQsdD1vLmdldE5vZGUoKSxyPW4uZ2V0Tm9kZSgpO2xldCBpPW8ub2Zmc2V0O3JldHVybiBvPW4ub2Zmc2V0LE0odCkmJihuPXQuZ2V0RGVzY2VuZGFudEJ5SW5kZXgoaSksdD1uPz90KSxNKHIpJiYobj1yLmdldERlc2NlbmRhbnRCeUluZGV4KG8pLG4hPT1udWxsJiZuIT09dCYmci5nZXRDaGlsZEF0SW5kZXgobyk9PT1uJiYobj1uLmdldFByZXZpb3VzU2libGluZygpKSxyPW4/P3IpLHQ9dC5pcyhyKT9NKHQpJiYwPHQuZ2V0Q2hpbGRyZW5TaXplKCk/W106W3RdOnQuZ2V0Tm9kZXNCZXR3ZWVuKHIpLEdzKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz10KSx0fXNldFRleHROb2RlUmFuZ2UodCxyLG4sbyl7a2kodGhpcy5hbmNob3IsdC5fX2tleSxyLCJ0ZXh0Iiksa2kodGhpcy5mb2N1cyxuLl9fa2V5LG8sInRleHQiKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHRoaXMuZGlydHk9ITB9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCk7aWYodC5sZW5ndGg9PT0wKXJldHVybiIiO2xldCByPXRbMF0sbj10W3QubGVuZ3RoLTFdLG89dGhpcy5hbmNob3IsaT10aGlzLmZvY3VzLGw9by5pc0JlZm9yZShpKSxbcyxhXT1LZih0aGlzKSx1PSIiLHA9ITA7Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKyspe2xldCBmPXRbY107aWYoTShmKSYmIWYuaXNJbmxpbmUoKSlwfHwodSs9XGAKXGApLHA9IWYuaXNFbXB0eSgpO2Vsc2UgaWYocD0hMSxGKGYpKXtsZXQgZD1mLmdldFRleHRDb250ZW50KCk7Zj09PXI/Zj09PW4/KG8udHlwZSE9PSJlbGVtZW50Inx8aS50eXBlIT09ImVsZW1lbnQifHxpLm9mZnNldD09PW8ub2Zmc2V0KSYmKGQ9czxhP2Quc2xpY2UocyxhKTpkLnNsaWNlKGEscykpOmQ9bD9kLnNsaWNlKHMpOmQuc2xpY2UoYSk6Zj09PW4mJihkPWw/ZC5zbGljZSgwLGEpOmQuc2xpY2UoMCxzKSksdSs9ZH1lbHNlIUxlKGYpJiYhVnUoZil8fGY9PT1uJiZ0aGlzLmlzQ29sbGFwc2VkKCl8fCh1Kz1mLmdldFRleHRDb250ZW50KCkpfXJldHVybiB1fWFwcGx5RE9NUmFuZ2UodCl7bGV0IHI9amUoKSxuPXIuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uO2lmKHQ9RlQodC5zdGFydENvbnRhaW5lcix0LnN0YXJ0T2Zmc2V0LHQuZW5kQ29udGFpbmVyLHQuZW5kT2Zmc2V0LHIsbiksdCE9PW51bGwpe3ZhcltvLGldPXQ7a2kodGhpcy5hbmNob3Isby5rZXksby5vZmZzZXQsby50eXBlKSxraSh0aGlzLmZvY3VzLGkua2V5LGkub2Zmc2V0LGkudHlwZSksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH19Y2xvbmUoKXtsZXQgdD10aGlzLmFuY2hvcixyPXRoaXMuZm9jdXM7cmV0dXJuIG5ldyBlKG5ldyB3bih0LmtleSx0Lm9mZnNldCx0LnR5cGUpLG5ldyB3bihyLmtleSxyLm9mZnNldCxyLnR5cGUpLHRoaXMuZm9ybWF0LHRoaXMuc3R5bGUpfXRvZ2dsZUZvcm1hdCh0KXt0aGlzLmZvcm1hdD1mVCh0aGlzLmZvcm1hdCx0LG51bGwpLHRoaXMuZGlydHk9ITB9c2V0U3R5bGUodCl7dGhpcy5zdHlsZT10LHRoaXMuZGlydHk9ITB9aGFzRm9ybWF0KHQpe3JldHVybih0aGlzLmZvcm1hdCZjbFt0XSkhPT0wfWluc2VydFJhd1RleHQodCl7dD10LnNwbGl0KC8oXHI/XG58XHQpLyk7bGV0IHI9W10sbj10Lmxlbmd0aDtmb3IobGV0IG89MDtvPG47bysrKXtsZXQgaT10W29dO2k9PT1cYApcYHx8aT09PVxgXHIKXGA/ci5wdXNoKGpzKCkpOmk9PT0iCSI/ci5wdXNoKHdkKCkpOnIucHVzaChNdChpKSl9dGhpcy5pbnNlcnROb2RlcyhyKX1pbnNlcnRUZXh0KHQpe3ZhciByPXRoaXMuYW5jaG9yLG49dGhpcy5mb2N1cyxvPXRoaXMuaXNDb2xsYXBzZWQoKXx8ci5pc0JlZm9yZShuKSxpPXRoaXMuZm9ybWF0LGw9dGhpcy5zdHlsZTtvJiZyLnR5cGU9PT0iZWxlbWVudCI/TUMocixuLGksbCk6b3x8bi50eXBlIT09ImVsZW1lbnQifHxNQyhuLHIsaSxsKTt2YXIgcz10aGlzLmdldE5vZGVzKCksYT1zLmxlbmd0aCx1PW8/bjpyO249KG8/cjpuKS5vZmZzZXQ7dmFyIHA9dS5vZmZzZXQ7cj1zWzBdLEYocil8fHooMjYpLG89ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDt2YXIgYz1yLmdldFBhcmVudE9yVGhyb3coKSxmPXNbYS0xXTtpZih0aGlzLmlzQ29sbGFwc2VkKCkmJm49PT1vJiYoci5pc1NlZ21lbnRlZCgpfHxyLmlzVG9rZW4oKXx8IXIuY2FuSW5zZXJ0VGV4dEFmdGVyKCl8fCFjLmNhbkluc2VydFRleHRBZnRlcigpJiZyLmdldE5leHRTaWJsaW5nKCk9PT1udWxsKSl7dmFyIGQ9ci5nZXROZXh0U2libGluZygpO2lmKEYoZCkmJmQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiYhQjAoZCl8fChkPU10KCksZC5zZXRGb3JtYXQoaSksYy5jYW5JbnNlcnRUZXh0QWZ0ZXIoKT9yLmluc2VydEFmdGVyKGQpOmMuaW5zZXJ0QWZ0ZXIoZCkpLGQuc2VsZWN0KDAsMCkscj1kLHQhPT0iIil7dGhpcy5pbnNlcnRUZXh0KHQpO3JldHVybn19ZWxzZSBpZih0aGlzLmlzQ29sbGFwc2VkKCkmJm49PT0wJiYoci5pc1NlZ21lbnRlZCgpfHxyLmlzVG9rZW4oKXx8IXIuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHwhYy5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJnIuZ2V0UHJldmlvdXNTaWJsaW5nKCk9PT1udWxsKSl7aWYoZD1yLmdldFByZXZpb3VzU2libGluZygpLCghRihkKXx8QjAoZCkpJiYoZD1NdCgpLGQuc2V0Rm9ybWF0KGkpLGMuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpP3IuaW5zZXJ0QmVmb3JlKGQpOmMuaW5zZXJ0QmVmb3JlKGQpKSxkLnNlbGVjdCgpLHI9ZCx0IT09IiIpe3RoaXMuaW5zZXJ0VGV4dCh0KTtyZXR1cm59fWVsc2UgaWYoci5pc1NlZ21lbnRlZCgpJiZuIT09byljPU10KHIuZ2V0VGV4dENvbnRlbnQoKSksYy5zZXRGb3JtYXQoaSksci5yZXBsYWNlKGMpLHI9YztlbHNlIGlmKCEodGhpcy5pc0NvbGxhcHNlZCgpfHx0PT09IiJ8fChkPWYuZ2V0UGFyZW50KCksYy5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJmMuY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJighTShkKXx8ZC5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJmQuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpKSkpe3RoaXMuaW5zZXJ0VGV4dCgiIiksQlQodGhpcy5hbmNob3IsdGhpcy5mb2N1cyxudWxsKSx0aGlzLmluc2VydFRleHQodCk7cmV0dXJufWlmKGE9PT0xKWlmKHIuaXNUb2tlbigpKXQ9TXQodCksdC5zZWxlY3QoKSxyLnJlcGxhY2UodCk7ZWxzZXtpZihzPXIuZ2V0Rm9ybWF0KCksYT1yLmdldFN0eWxlKCksbj09PXAmJihzIT09aXx8YSE9PWwpKWlmKHIuZ2V0VGV4dENvbnRlbnQoKT09PSIiKXIuc2V0Rm9ybWF0KGkpLHIuc2V0U3R5bGUobCk7ZWxzZXtzPU10KHQpLHMuc2V0Rm9ybWF0KGkpLHMuc2V0U3R5bGUobCkscy5zZWxlY3QoKSxuPT09MD9yLmluc2VydEJlZm9yZShzLCExKTooW2FdPXIuc3BsaXRUZXh0KG4pLGEuaW5zZXJ0QWZ0ZXIocywhMSkpLHMuaXNDb21wb3NpbmcoKSYmdGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKHRoaXMuYW5jaG9yLm9mZnNldC09dC5sZW5ndGgpO3JldHVybn1yPXIuc3BsaWNlVGV4dChuLHAtbix0LCEwKSxyLmdldFRleHRDb250ZW50KCk9PT0iIj9yLnJlbW92ZSgpOnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJihyLmlzQ29tcG9zaW5nKCk/dGhpcy5hbmNob3Iub2Zmc2V0LT10Lmxlbmd0aDoodGhpcy5mb3JtYXQ9cyx0aGlzLnN0eWxlPWEpKX1lbHNle2lmKGk9bmV3IFNldChbLi4uci5nZXRQYXJlbnRLZXlzKCksLi4uZi5nZXRQYXJlbnRLZXlzKCldKSxkPU0ocik/cjpyLmdldFBhcmVudE9yVGhyb3coKSxsPU0oZik/ZjpmLmdldFBhcmVudE9yVGhyb3coKSxjPWYsIWQuaXMobCkmJmwuaXNJbmxpbmUoKSlkbyBjPWwsbD1sLmdldFBhcmVudE9yVGhyb3coKTt3aGlsZShsLmlzSW5saW5lKCkpO2lmKHUudHlwZT09PSJ0ZXh0IiYmKHAhPT0wfHxmLmdldFRleHRDb250ZW50KCk9PT0iIil8fHUudHlwZT09PSJlbGVtZW50IiYmZi5nZXRJbmRleFdpdGhpblBhcmVudCgpPHApaWYoRihmKSYmIWYuaXNUb2tlbigpJiZwIT09Zi5nZXRUZXh0Q29udGVudFNpemUoKSl7aWYoZi5pc1NlZ21lbnRlZCgpKXt2YXIgbT1NdChmLmdldFRleHRDb250ZW50KCkpO2YucmVwbGFjZShtKSxmPW19Z3IodS5nZXROb2RlKCkpfHwoZj1mLnNwbGljZVRleHQoMCxwLCIiKSksaS5hZGQoZi5fX2tleSl9ZWxzZSB1PWYuZ2V0UGFyZW50T3JUaHJvdygpLHUuY2FuQmVFbXB0eSgpfHx1LmdldENoaWxkcmVuU2l6ZSgpIT09MT9mLnJlbW92ZSgpOnUucmVtb3ZlKCk7ZWxzZSBpLmFkZChmLl9fa2V5KTtmb3IodT1sLmdldENoaWxkcmVuKCkscD1uZXcgU2V0KHMpLGY9ZC5pcyhsKSxkPWQuaXNJbmxpbmUoKSYmci5nZXROZXh0U2libGluZygpPT09bnVsbD9kOnIsbT11Lmxlbmd0aC0xOzA8PW07bS0tKXtsZXQgaD11W21dO2lmKGguaXMocil8fE0oaCkmJmguaXNQYXJlbnRPZihyKSlicmVhaztoLmlzQXR0YWNoZWQoKSYmKCFwLmhhcyhoKXx8aC5pcyhjKT9mfHxkLmluc2VydEFmdGVyKGgsITEpOmgucmVtb3ZlKCkpfWlmKCFmKWZvcih1PWwscD1udWxsO3UhPT1udWxsOylsPXUuZ2V0Q2hpbGRyZW4oKSxmPWwubGVuZ3RoLChmPT09MHx8bFtmLTFdLmlzKHApKSYmKGkuZGVsZXRlKHUuX19rZXkpLHA9dSksdT11LmdldFBhcmVudCgpO2ZvcihyLmlzVG9rZW4oKT9uPT09bz9yLnNlbGVjdCgpOih0PU10KHQpLHQuc2VsZWN0KCksci5yZXBsYWNlKHQpKToocj1yLnNwbGljZVRleHQobixvLW4sdCwhMCksci5nZXRUZXh0Q29udGVudCgpPT09IiI/ci5yZW1vdmUoKTpyLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPXQubGVuZ3RoKSksdD0xO3Q8YTt0Kyspcj1zW3RdLGkuaGFzKHIuX19rZXkpfHxyLnJlbW92ZSgpfX1yZW1vdmVUZXh0KCl7dGhpcy5pbnNlcnRUZXh0KCIiKX1mb3JtYXRUZXh0KHQpe2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl0aGlzLnRvZ2dsZUZvcm1hdCh0KSxXdChudWxsKTtlbHNle3ZhciByPXRoaXMuZ2V0Tm9kZXMoKSxuPVtdO2Zvcih2YXIgbyBvZiByKUYobykmJm4ucHVzaChvKTt2YXIgaT1uLmxlbmd0aDtpZihpPT09MCl0aGlzLnRvZ2dsZUZvcm1hdCh0KSxXdChudWxsKTtlbHNle289dGhpcy5hbmNob3I7dmFyIGw9dGhpcy5mb2N1cyxzPXRoaXMuaXNCYWNrd2FyZCgpO3I9cz9sOm8sbz1zP286bDt2YXIgYT0wLHU9blswXTtpZihsPXIudHlwZT09PSJlbGVtZW50Ij8wOnIub2Zmc2V0LHIudHlwZT09PSJ0ZXh0IiYmbD09PXUuZ2V0VGV4dENvbnRlbnRTaXplKCkmJihhPTEsdT1uWzFdLGw9MCksdSE9bnVsbCl7cz11LmdldEZvcm1hdEZsYWdzKHQsbnVsbCk7dmFyIHA9aS0xLGM9bltwXTtpZihpPW8udHlwZT09PSJ0ZXh0Ij9vLm9mZnNldDpjLmdldFRleHRDb250ZW50U2l6ZSgpLHUuaXMoYykpbCE9PWkmJihsPT09MCYmaT09PXUuZ2V0VGV4dENvbnRlbnRTaXplKCk/dS5zZXRGb3JtYXQocyk6KHQ9dS5zcGxpdFRleHQobCxpKSx0PWw9PT0wP3RbMF06dFsxXSx0LnNldEZvcm1hdChzKSxyLnR5cGU9PT0idGV4dCImJnIuc2V0KHQuX19rZXksMCwidGV4dCIpLG8udHlwZT09PSJ0ZXh0IiYmby5zZXQodC5fX2tleSxpLWwsInRleHQiKSksdGhpcy5mb3JtYXQ9cyk7ZWxzZXtsIT09MCYmKFssdV09dS5zcGxpdFRleHQobCksbD0wKSx1LnNldEZvcm1hdChzKTt2YXIgZj1jLmdldEZvcm1hdEZsYWdzKHQscyk7Zm9yKDA8aSYmKGkhPT1jLmdldFRleHRDb250ZW50U2l6ZSgpJiYoW2NdPWMuc3BsaXRUZXh0KGkpKSxjLnNldEZvcm1hdChmKSksYSs9MTthPHA7YSsrKXtsZXQgZD1uW2FdO2lmKCFkLmlzVG9rZW4oKSl7bGV0IG09ZC5nZXRGb3JtYXRGbGFncyh0LGYpO2Quc2V0Rm9ybWF0KG0pfX1yLnR5cGU9PT0idGV4dCImJnIuc2V0KHUuX19rZXksbCwidGV4dCIpLG8udHlwZT09PSJ0ZXh0IiYmby5zZXQoYy5fX2tleSxpLCJ0ZXh0IiksdGhpcy5mb3JtYXQ9c3xmfX19fX1pbnNlcnROb2Rlcyh0LHIpe2lmKCF0aGlzLmlzQ29sbGFwc2VkKCkpe3ZhciBuPXRoaXMuaXNCYWNrd2FyZCgpP3RoaXMuYW5jaG9yOnRoaXMuZm9jdXMsbz1uLmdldE5vZGUoKS5nZXROZXh0U2libGluZygpO2lmKG89bz9vLmdldEtleSgpOm51bGwsbj0obj1uLmdldE5vZGUoKS5nZXRQcmV2aW91c1NpYmxpbmcoKSk/bi5nZXRLZXkoKTpudWxsLHRoaXMucmVtb3ZlVGV4dCgpLHRoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5mb2N1cy50eXBlPT09ImVsZW1lbnQiKXtpZih0aGlzLmZvY3VzLmtleT09PW8mJnRoaXMuZm9jdXMub2Zmc2V0PT09MCl7dmFyIGk9TXQoKTt0aGlzLmZvY3VzLmdldE5vZGUoKS5pbnNlcnRCZWZvcmUoaSl9ZWxzZSB0aGlzLmZvY3VzLmtleT09PW4mJnRoaXMuZm9jdXMub2Zmc2V0PT09dGhpcy5mb2N1cy5nZXROb2RlKCkuZ2V0Q2hpbGRyZW5TaXplKCkmJihpPU10KCksdGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QWZ0ZXIoaSkpO2kmJih0aGlzLmZvY3VzLnNldChpLl9fa2V5LDAsInRleHQiKSx0aGlzLmFuY2hvci5zZXQoaS5fX2tleSwwLCJ0ZXh0IikpfX1pPXRoaXMuYW5jaG9yLG49aS5vZmZzZXQ7dmFyIGw9aS5nZXROb2RlKCk7bz1sLGkudHlwZT09PSJlbGVtZW50IiYmKGk9aS5nZXROb2RlKCksbz1pLmdldENoaWxkQXRJbmRleChuLTEpLG89bz09PW51bGw/aTpvKSxpPVtdO3ZhciBzPWwuZ2V0TmV4dFNpYmxpbmdzKCksYT1PbihsKT9udWxsOmwuZ2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpO2lmKEYobCkpaWYobz1sLmdldFRleHRDb250ZW50KCkubGVuZ3RoLG49PT0wJiZvIT09MClvPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbz1vIT09bnVsbD9vOmwuZ2V0UGFyZW50T3JUaHJvdygpLGkucHVzaChsKTtlbHNlIGlmKG49PT1vKW89bDtlbHNle2lmKGwuaXNUb2tlbigpKXJldHVybiExO1tvLGxdPWwuc3BsaXRUZXh0KG4pLGkucHVzaChsKX1sPW8saS5wdXNoKC4uLnMpLHM9dFswXTt2YXIgdT0hMSxwPW51bGw7Zm9yKGxldCBtPTA7bTx0Lmxlbmd0aDttKyspe3ZhciBjPXRbbV07aWYoT24obyl8fExlKG8pfHwhTShjKXx8Yy5pc0lubGluZSgpKXUmJiFNKGMpJiYhTGUoYykmJk9uKG8uZ2V0UGFyZW50KCkpJiZ6KDI4KTtlbHNle2lmKGMuaXMocykpe2lmKE0obykmJm8uaXNFbXB0eSgpJiZvLmNhblJlcGxhY2VXaXRoKGMpKXtvLnJlcGxhY2UoYyksbz1jLHU9ITA7Y29udGludWV9aWYodT1jLmdldEZpcnN0RGVzY2VuZGFudCgpLGRUKHUpKXtmb3IodmFyIGY9dS5nZXRQYXJlbnRPclRocm93KCk7Zi5pc0lubGluZSgpOylmPWYuZ2V0UGFyZW50T3JUaHJvdygpO2lmKHA9Zi5nZXRDaGlsZHJlbigpLHU9cC5sZW5ndGgsTShvKSl7dmFyIGQ9by5nZXRGaXJzdENoaWxkKCk7Zm9yKGxldCBoPTA7aDx1O2grKyl7bGV0IFM9cFtoXTtkPT09bnVsbD9vLmFwcGVuZChTKTpkLmluc2VydEFmdGVyKFMpLGQ9U319ZWxzZXtmb3IoZD11LTE7MDw9ZDtkLS0pby5pbnNlcnRBZnRlcihwW2RdKTtvPW8uZ2V0UGFyZW50T3JUaHJvdygpfWlmKHA9cFt1LTFdLGYucmVtb3ZlKCksdT0hMCxmLmlzKGMpKWNvbnRpbnVlfX1GKG8pJiYoYT09PW51bGwmJnooMjcpLG89YSl9dT0hMSxNKG8pJiYhby5pc0lubGluZSgpPyhwPWMsTGUoYykmJiFjLmlzSW5saW5lKCk/bz10Lmxlbmd0aD09PTEmJm8uY2FuQmVFbXB0eSgpJiZvLmlzRW1wdHkoKT9vLmluc2VydEJlZm9yZShjLCExKTpvLmluc2VydEFmdGVyKGMsITEpOk0oYyk/KGMuY2FuQmVFbXB0eSgpfHwhYy5pc0VtcHR5KCkpJiYoZ3Iobyk/KGY9by5nZXRDaGlsZEF0SW5kZXgobiksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoYyk6by5hcHBlbmQoYyksbz1jKTpjLmlzSW5saW5lKCk/KG8uYXBwZW5kKGMpLG89Yyk6bz1vLmluc2VydEFmdGVyKGMsITEpKTooZj1vLmdldEZpcnN0Q2hpbGQoKSxmIT09bnVsbD9mLmluc2VydEJlZm9yZShjKTpvLmFwcGVuZChjKSxvPWMpKTohTShjKXx8TShjKSYmYy5pc0lubGluZSgpfHxMZShvKSYmIW8uaXNJbmxpbmUoKT8ocD1jLFEodGhpcykmJkxlKGMpJiYoTShvKXx8RihvKSkmJiFjLmlzSW5saW5lKCk/KEYobyk/KGY9by5nZXRQYXJlbnRPclRocm93KCksW29dPW8uc3BsaXRUZXh0KG4pLG89by5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpOihmPW8sbz1uKSxbLG9dPUNUKGYsbyksbz1vLmluc2VydEJlZm9yZShjKSk6bz1vLmluc2VydEFmdGVyKGMsITEpKTooYz1vLmdldFBhcmVudE9yVGhyb3coKSxWdShvKSYmby5yZW1vdmUoKSxvPWMsbS0tKX1pZihyJiYoRihsKT9sLnNlbGVjdCgpOih0PW8uZ2V0UHJldmlvdXNTaWJsaW5nKCksRih0KT90LnNlbGVjdCgpOih0PW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxvLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3QodCx0KSkpKSxNKG8pKXtpZih0PUYocCk/cDpNKHApJiZwLmlzSW5saW5lKCk/cC5nZXRMYXN0RGVzY2VuZGFudCgpOm8uZ2V0TGFzdERlc2NlbmRhbnQoKSxyfHwodD09PW51bGw/by5zZWxlY3QoKTpGKHQpP3QuZ2V0VGV4dENvbnRlbnQoKT09PSIiP3Quc2VsZWN0UHJldmlvdXMoKTp0LnNlbGVjdCgpOnQuc2VsZWN0TmV4dCgpKSxpLmxlbmd0aCE9PTApZm9yKHI9byx0PWkubGVuZ3RoLTE7MDw9dDt0LS0pbj1pW3RdLGE9bi5nZXRQYXJlbnRPclRocm93KCksIU0obyl8fFowKG4pfHxMZShuKSYmKCFuLmlzSW5saW5lKCl8fG4uaXNJc29sYXRlZCgpKT9NKG8pfHxaMChuKT9NKG4pJiYhbi5jYW5JbnNlcnRBZnRlcihvKT8obD1hLmNvbnN0cnVjdG9yLmNsb25lKGEpLE0obCl8fHooMjkpLGwuYXBwZW5kKG4pLG8uaW5zZXJ0QWZ0ZXIobCkpOm8uaW5zZXJ0QWZ0ZXIobik6KG8uaW5zZXJ0QmVmb3JlKG4pLG89bik6KHI9PT1vP28uYXBwZW5kKG4pOm8uaW5zZXJ0QmVmb3JlKG4pLG89biksYS5pc0VtcHR5KCkmJiFhLmNhbkJlRW1wdHkoKSYmYS5yZW1vdmUoKX1lbHNlIHJ8fChGKG8pP28uc2VsZWN0KCk6KHI9by5nZXRQYXJlbnRPclRocm93KCksdD1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSxyLnNlbGVjdCh0LHQpKSk7cmV0dXJuITB9aW5zZXJ0UGFyYWdyYXBoKCl7dGhpcy5pc0NvbGxhcHNlZCgpfHx0aGlzLnJlbW92ZVRleHQoKTt2YXIgdD10aGlzLmFuY2hvcixyPXQub2Zmc2V0LG49W107aWYodC50eXBlPT09InRleHQiKXt2YXIgbz10LmdldE5vZGUoKSxpPW8uZ2V0TmV4dFNpYmxpbmdzKCkucmV2ZXJzZSgpLGw9by5nZXRQYXJlbnRPclRocm93KCkscz1sLmlzSW5saW5lKCksYT1zP2wuZ2V0VGV4dENvbnRlbnRTaXplKCk6by5nZXRUZXh0Q29udGVudFNpemUoKTtyPT09MD9pLnB1c2gobyk6KHMmJihuPWwuZ2V0TmV4dFNpYmxpbmdzKCkpLHI9PT1hfHxzJiZyPT09by5nZXRUZXh0Q29udGVudFNpemUoKXx8KFssb109by5zcGxpdFRleHQociksaS5wdXNoKG8pKSl9ZWxzZXtpZihsPXQuZ2V0Tm9kZSgpLE9uKGwpKXtpPXlsKCksbj1sLmdldENoaWxkQXRJbmRleChyKSxpLnNlbGVjdCgpLG4hPT1udWxsP24uaW5zZXJ0QmVmb3JlKGksITEpOmwuYXBwZW5kKGkpO3JldHVybn1pPWwuZ2V0Q2hpbGRyZW4oKS5zbGljZShyKS5yZXZlcnNlKCl9aWYobz1pLmxlbmd0aCxyPT09MCYmMDxvJiZsLmlzSW5saW5lKCkpe2lmKG49bC5nZXRQYXJlbnRPclRocm93KCksaT1uLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLE0oaSkpZm9yKG49bi5nZXRDaGlsZHJlbigpLGw9MDtsPG4ubGVuZ3RoO2wrKylpLmFwcGVuZChuW2xdKX1lbHNlIGlmKHM9bC5pbnNlcnROZXdBZnRlcih0aGlzLCExKSxzPT09bnVsbCl0aGlzLmluc2VydExpbmVCcmVhaygpO2Vsc2UgaWYoTShzKSlpZihhPWwuZ2V0Rmlyc3RDaGlsZCgpLHI9PT0wJiYobC5pcyh0LmdldE5vZGUoKSl8fGEmJmEuaXModC5nZXROb2RlKCkpKSYmMDxvKWwuaW5zZXJ0QmVmb3JlKHMpO2Vsc2V7aWYobD1udWxsLHI9bi5sZW5ndGgsdD1zLmdldFBhcmVudE9yVGhyb3coKSwwPHIpZm9yKGE9MDthPHI7YSsrKXQuYXBwZW5kKG5bYV0pO2lmKG8hPT0wKWZvcihuPTA7bjxvO24rKylyPWlbbl0sbD09PW51bGw/cy5hcHBlbmQocik6bC5pbnNlcnRCZWZvcmUociksbD1yO3MuY2FuQmVFbXB0eSgpfHxzLmdldENoaWxkcmVuU2l6ZSgpIT09MD9zLnNlbGVjdFN0YXJ0KCk6KHMuc2VsZWN0UHJldmlvdXMoKSxzLnJlbW92ZSgpKX19aW5zZXJ0TGluZUJyZWFrKHQpe2xldCByPWpzKCk7dmFyIG49dGhpcy5hbmNob3I7bi50eXBlPT09ImVsZW1lbnQiJiYobj1uLmdldE5vZGUoKSxncihuKSYmdGhpcy5pbnNlcnRQYXJhZ3JhcGgoKSksdD90aGlzLmluc2VydE5vZGVzKFtyXSwhMCk6dGhpcy5pbnNlcnROb2Rlcyhbcl0pJiZyLnNlbGVjdE5leHQoMCwwKX1nZXRDaGFyYWN0ZXJPZmZzZXRzKCl7cmV0dXJuIEtmKHRoaXMpfWV4dHJhY3QoKXt2YXIgdD10aGlzLmdldE5vZGVzKCkscj10Lmxlbmd0aCxuPXItMSxvPXRoaXMuYW5jaG9yO2xldCBpPXRoaXMuZm9jdXM7dmFyIGw9dFswXTtsZXQgcz10W25dLFthLHVdPUtmKHRoaXMpO3JldHVybiByPT09MD9bXTpyPT09MT9GKGwpJiYhdGhpcy5pc0NvbGxhcHNlZCgpPyh0PWE+dT91OmEsbj1sLnNwbGl0VGV4dCh0LGE+dT9hOnUpLHQ9dD09PTA/blswXTpuWzFdLHQhPW51bGw/W3RdOltdKTpbbF06KHI9by5pc0JlZm9yZShpKSxGKGwpJiYobz1yP2E6dSxvPT09bC5nZXRUZXh0Q29udGVudFNpemUoKT90LnNoaWZ0KCk6byE9PTAmJihbLGxdPWwuc3BsaXRUZXh0KG8pLHRbMF09bCkpLEYocykmJihsPXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgscj1yP3U6YSxyPT09MD90LnBvcCgpOnIhPT1sJiYoW3NdPXMuc3BsaXRUZXh0KHIpLHRbbl09cykpLHQpfW1vZGlmeSh0LHIsbil7dmFyIG89dGhpcy5mb2N1cyxpPXRoaXMuYW5jaG9yLGw9dD09PSJtb3ZlIixzPUYwKG8scik7aWYoTGUocykmJiFzLmlzSXNvbGF0ZWQoKSlsJiZzLmlzS2V5Ym9hcmRTZWxlY3RhYmxlKCk/KHI9SjAoKSxyLmFkZChzLl9fa2V5KSxlbyhyKSk6KHQ9cj9zLmdldFByZXZpb3VzU2libGluZygpOnMuZ2V0TmV4dFNpYmxpbmcoKSxGKHQpPyhzPXQuX19rZXkscj1yP3QuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCxvLnNldChzLHIsInRleHQiKSxsJiZpLnNldChzLHIsInRleHQiKSk6KG49cy5nZXRQYXJlbnRPclRocm93KCksTSh0KT8obj10Ll9fa2V5LHM9cj90LmdldENoaWxkcmVuU2l6ZSgpOjApOihzPXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxuPW4uX19rZXkscnx8cysrKSxvLnNldChuLHMsImVsZW1lbnQiKSxsJiZpLnNldChuLHMsImVsZW1lbnQiKSkpO2Vsc2UgaWYoaT1qZSgpLG89cm8oaS5fd2luZG93KSl7dmFyIGE9aS5fYmxvY2tDdXJzb3JFbGVtZW50LHU9aS5fcm9vdEVsZW1lbnQ7aWYodT09PW51bGx8fGE9PT1udWxsfHwhTShzKXx8cy5pc0lubGluZSgpfHxzLmNhbkJlRW1wdHkoKXx8JDAoYSxpLHUpLG8ubW9kaWZ5KHQscj8iYmFja3dhcmQiOiJmb3J3YXJkIixuKSwwPG8ucmFuZ2VDb3VudCYmKHM9by5nZXRSYW5nZUF0KDApLGk9dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLGk9Z3IoaSk/aTp3VChpKSx0aGlzLmFwcGx5RE9NUmFuZ2UocyksdGhpcy5kaXJ0eT0hMCwhbCkpe2ZvcihsPXRoaXMuZ2V0Tm9kZXMoKSx0PVtdLG49ITEsYT0wO2E8bC5sZW5ndGg7YSsrKXU9bFthXSxyZCh1LGkpP3QucHVzaCh1KTpuPSEwO24mJjA8dC5sZW5ndGgmJihyPyhyPXRbMF0sTShyKT9yLnNlbGVjdFN0YXJ0KCk6ci5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0U3RhcnQoKSk6KHI9dFt0Lmxlbmd0aC0xXSxNKHIpP3Iuc2VsZWN0RW5kKCk6ci5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0RW5kKCkpKSwoby5hbmNob3JOb2RlIT09cy5zdGFydENvbnRhaW5lcnx8by5hbmNob3JPZmZzZXQhPT1zLnN0YXJ0T2Zmc2V0KSYmKHI9dGhpcy5mb2N1cyxsPXRoaXMuYW5jaG9yLG89bC5rZXkscz1sLm9mZnNldCxpPWwudHlwZSxraShsLHIua2V5LHIub2Zmc2V0LHIudHlwZSksa2kocixvLHMsaSksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCl9fX1kZWxldGVDaGFyYWN0ZXIodCl7bGV0IHI9dGhpcy5pc0NvbGxhcHNlZCgpO2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl7dmFyIG49dGhpcy5hbmNob3Isbz10aGlzLmZvY3VzLGk9bi5nZXROb2RlKCk7aWYoIXQmJihuLnR5cGU9PT0iZWxlbWVudCImJk0oaSkmJm4ub2Zmc2V0PT09aS5nZXRDaGlsZHJlblNpemUoKXx8bi50eXBlPT09InRleHQiJiZuLm9mZnNldD09PWkuZ2V0VGV4dENvbnRlbnRTaXplKCkpKXt2YXIgbD1pLmdldFBhcmVudCgpO2lmKGw9aS5nZXROZXh0U2libGluZygpfHwobD09PW51bGw/bnVsbDpsLmdldE5leHRTaWJsaW5nKCkpLE0obCkmJmwuaXNTaGFkb3dSb290KCkpcmV0dXJufWlmKGw9RjAobyx0KSxMZShsKSYmIWwuaXNJc29sYXRlZCgpKXtsLmlzS2V5Ym9hcmRTZWxlY3RhYmxlKCkmJk0oaSkmJmkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wPyhpLnJlbW92ZSgpLHQ9SjAoKSx0LmFkZChsLl9fa2V5KSxlbyh0KSk6KGwucmVtb3ZlKCksamUoKS5kaXNwYXRjaENvbW1hbmQoZGQsdm9pZCAwKSk7cmV0dXJufWlmKCF0JiZNKGwpJiZNKGkpJiZpLmlzRW1wdHkoKSl7aS5yZW1vdmUoKSxsLnNlbGVjdFN0YXJ0KCk7cmV0dXJufWlmKHRoaXMubW9kaWZ5KCJleHRlbmQiLHQsImNoYXJhY3RlciIpLHRoaXMuaXNDb2xsYXBzZWQoKSl7aWYodCYmbi5vZmZzZXQ9PT0wJiYobi50eXBlPT09ImVsZW1lbnQiP24uZ2V0Tm9kZSgpOm4uZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKSkuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKXJldHVybn1lbHNle2lmKGw9by50eXBlPT09InRleHQiP28uZ2V0Tm9kZSgpOm51bGwsaT1uLnR5cGU9PT0idGV4dCI/bi5nZXROb2RlKCk6bnVsbCxsIT09bnVsbCYmbC5pc1NlZ21lbnRlZCgpKXtpZihuPW8ub2Zmc2V0LG89bC5nZXRUZXh0Q29udGVudFNpemUoKSxsLmlzKGkpfHx0JiZuIT09b3x8IXQmJm4hPT0wKXtMQyhsLHQsbik7cmV0dXJufX1lbHNlIGlmKGkhPT1udWxsJiZpLmlzU2VnbWVudGVkKCkmJihuPW4ub2Zmc2V0LG89aS5nZXRUZXh0Q29udGVudFNpemUoKSxpLmlzKGwpfHx0JiZuIT09MHx8IXQmJm4hPT1vKSl7TEMoaSx0LG4pO3JldHVybn1pZihpPXRoaXMuYW5jaG9yLGw9dGhpcy5mb2N1cyxuPWkuZ2V0Tm9kZSgpLG89bC5nZXROb2RlKCksbj09PW8mJmkudHlwZT09PSJ0ZXh0IiYmbC50eXBlPT09InRleHQiKXt2YXIgcz1pLm9mZnNldCxhPWwub2Zmc2V0O2xldCB1PXM8YTtvPXU/czphLGE9dT9hOnMscz1hLTEsbyE9PXMmJihuPW4uZ2V0VGV4dENvbnRlbnQoKS5zbGljZShvLGEpLHlUKG4pfHwodD9sLm9mZnNldD1zOmkub2Zmc2V0PXMpKX19fXRoaXMucmVtb3ZlVGV4dCgpLHQmJiFyJiZ0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnRoaXMuYW5jaG9yLm9mZnNldD09PTAmJih0PXRoaXMuYW5jaG9yLmdldE5vZGUoKSx0LmlzRW1wdHkoKSYmZ3IodC5nZXRQYXJlbnQoKSkmJnQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKT09PTAmJnQuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKX1kZWxldGVMaW5lKHQpe3RoaXMuaXNDb2xsYXBzZWQoKSYmKHRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJnRoaXMubW9kaWZ5KCJleHRlbmQiLHQsImxpbmVib3VuZGFyeSIpLCh0P3RoaXMuZm9jdXM6dGhpcy5hbmNob3IpLm9mZnNldD09PTAmJnRoaXMubW9kaWZ5KCJleHRlbmQiLHQsImNoYXJhY3RlciIpKSx0aGlzLnJlbW92ZVRleHQoKX1kZWxldGVXb3JkKHQpe3RoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwid29yZCIpLHRoaXMucmVtb3ZlVGV4dCgpfX07ZnVuY3Rpb24gVnMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBpZH1mdW5jdGlvbiBJQyhlKXtsZXQgdD1lLm9mZnNldDtyZXR1cm4gZS50eXBlPT09InRleHQiP3Q6KGU9ZS5nZXROb2RlKCksdD09PWUuZ2V0Q2hpbGRyZW5TaXplKCk/ZS5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDowKX1mdW5jdGlvbiBLZihlKXtsZXQgdD1lLmFuY2hvcjtyZXR1cm4gZT1lLmZvY3VzLHQudHlwZT09PSJlbGVtZW50IiYmZS50eXBlPT09ImVsZW1lbnQiJiZ0LmtleT09PWUua2V5JiZ0Lm9mZnNldD09PWUub2Zmc2V0P1swLDBdOltJQyh0KSxJQyhlKV19ZnVuY3Rpb24gTEMoZSx0LHIpe2xldCBuPWUuZ2V0VGV4dENvbnRlbnQoKS5zcGxpdCgvKD89XHMpL2cpLG89bi5sZW5ndGgsaT0wLGw9MDtmb3IobGV0IHM9MDtzPG87cysrKXtsZXQgYT1uW3NdLHU9cz09PW8tMTtpZihsPWksaSs9YS5sZW5ndGgsdCYmaT09PXJ8fGk+cnx8dSl7bi5zcGxpY2UocywxKSx1JiYobD12b2lkIDApO2JyZWFrfX10PW4uam9pbigiIikudHJpbSgpLHQ9PT0iIj9lLnJlbW92ZSgpOihlLnNldFRleHRDb250ZW50KHQpLGUuc2VsZWN0KGwsbCkpfWZ1bmN0aW9uIEFDKGUsdCxyLG4pe3ZhciBvPXQ7aWYoZS5ub2RlVHlwZT09PTEpe2xldCBzPSExO3ZhciBpPWUuY2hpbGROb2RlcyxsPWkubGVuZ3RoO289PT1sJiYocz0hMCxvPWwtMSk7bGV0IGE9aVtvXTtpZihsPSExLGE9PT1uLl9ibG9ja0N1cnNvckVsZW1lbnQ/KGE9aVtvKzFdLGw9ITApOm4uX2Jsb2NrQ3Vyc29yRWxlbWVudCE9PW51bGwmJm8tLSxuPXpzKGEpLEYobikpbz1zP24uZ2V0VGV4dENvbnRlbnRTaXplKCk6MDtlbHNle2lmKGk9enMoZSksaT09PW51bGwpcmV0dXJuIG51bGw7aWYoTShpKT8oZT1pLmdldENoaWxkQXRJbmRleChvKSwodD1NKGUpKSYmKHQ9ZS5nZXRQYXJlbnQoKSx0PXI9PT1udWxsfHx0PT09bnVsbHx8IXQuY2FuQmVFbXB0eSgpfHx0IT09ci5nZXROb2RlKCkpLHQmJihyPXM/ZS5nZXRMYXN0RGVzY2VuZGFudCgpOmUuZ2V0Rmlyc3REZXNjZW5kYW50KCkscj09PW51bGw/KGk9ZSxvPTApOihlPXIsaT1NKGUpP2U6ZS5nZXRQYXJlbnRPclRocm93KCkpKSxGKGUpPyhuPWUsaT1udWxsLG89cz9lLmdldFRleHRDb250ZW50U2l6ZSgpOjApOmUhPT1pJiZzJiYhbCYmbysrKToobz1pLmdldEluZGV4V2l0aGluUGFyZW50KCksbz10PT09MCYmTGUoaSkmJnpzKGUpPT09aT9vOm8rMSxpPWkuZ2V0UGFyZW50T3JUaHJvdygpKSxNKGkpKXJldHVybiBuZXcgd24oaS5fX2tleSxvLCJlbGVtZW50Iil9fWVsc2Ugbj16cyhlKTtyZXR1cm4gRihuKT9uZXcgd24obi5fX2tleSxvLCJ0ZXh0Iik6bnVsbH1mdW5jdGlvbiBEQyhlLHQscil7dmFyIG49ZS5vZmZzZXQsbz1lLmdldE5vZGUoKTtuPT09MD8obj1vLmdldFByZXZpb3VzU2libGluZygpLG89by5nZXRQYXJlbnQoKSx0PyhyfHwhdCkmJm49PT1udWxsJiZNKG8pJiZvLmlzSW5saW5lKCkmJih0PW8uZ2V0UHJldmlvdXNTaWJsaW5nKCksRih0KSYmKGUua2V5PXQuX19rZXksZS5vZmZzZXQ9dC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOk0obikmJiFyJiZuLmlzSW5saW5lKCk/KGUua2V5PW4uX19rZXksZS5vZmZzZXQ9bi5nZXRDaGlsZHJlblNpemUoKSxlLnR5cGU9ImVsZW1lbnQiKTpGKG4pJiYoZS5rZXk9bi5fX2tleSxlLm9mZnNldD1uLmdldFRleHRDb250ZW50KCkubGVuZ3RoKSk6bj09PW8uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgmJihuPW8uZ2V0TmV4dFNpYmxpbmcoKSxvPW8uZ2V0UGFyZW50KCksdCYmTShuKSYmbi5pc0lubGluZSgpPyhlLmtleT1uLl9fa2V5LGUub2Zmc2V0PTAsZS50eXBlPSJlbGVtZW50Iik6KHJ8fHQpJiZuPT09bnVsbCYmTShvKSYmby5pc0lubGluZSgpJiYhby5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmKHQ9by5nZXROZXh0U2libGluZygpLEYodCkmJihlLmtleT10Ll9fa2V5LGUub2Zmc2V0PTApKSl9ZnVuY3Rpb24gQlQoZSx0LHIpe2lmKGUudHlwZT09PSJ0ZXh0IiYmdC50eXBlPT09InRleHQiKXt2YXIgbj1lLmlzQmVmb3JlKHQpO2xldCBvPWUuaXModCk7REMoZSxuLG8pLERDKHQsIW4sbyksbyYmKHQua2V5PWUua2V5LHQub2Zmc2V0PWUub2Zmc2V0LHQudHlwZT1lLnR5cGUpLG49amUoKSxuLmlzQ29tcG9zaW5nKCkmJm4uX2NvbXBvc2l0aW9uS2V5IT09ZS5rZXkmJlEocikmJihuPXIuYW5jaG9yLHI9ci5mb2N1cyxraShlLG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksa2kodCxyLmtleSxyLm9mZnNldCxyLnR5cGUpKX19ZnVuY3Rpb24gRlQoZSx0LHIsbixvLGkpe3JldHVybiBlPT09bnVsbHx8cj09PW51bGx8fCFRdShvLGUscil8fCh0PUFDKGUsdCxRKGkpP2kuYW5jaG9yOm51bGwsbyksdD09PW51bGwpfHwobj1BQyhyLG4sUShpKT9pLmZvY3VzOm51bGwsbyksbj09PW51bGx8fHQudHlwZT09PSJlbGVtZW50IiYmbi50eXBlPT09ImVsZW1lbnQiJiYoZT16cyhlKSxyPXpzKHIpLExlKGUpJiZMZShyKSkpP251bGw6KEJUKHQsbixpKSxbdCxuXSl9ZnVuY3Rpb24gWjAoZSl7cmV0dXJuIE0oZSkmJiFlLmlzSW5saW5lKCl9ZnVuY3Rpb24gJFQoZSx0LHIsbixvLGkpe2xldCBsPW5vKCk7cmV0dXJuIGU9bmV3IGdsKG5ldyB3bihlLHQsbyksbmV3IHduKHIsbixpKSwwLCIiKSxlLmRpcnR5PSEwLGwuX3NlbGVjdGlvbj1lfWZ1bmN0aW9uIEowKCl7cmV0dXJuIG5ldyBpZChuZXcgU2V0KX1mdW5jdGlvbiBpRShlKXtsZXQgdD1lLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbixyPXJvKGUuX3dpbmRvdyk7cmV0dXJuIFZzKHQpfHx5eSh0KT90LmNsb25lKCk6dnkodCxyLGUpfWZ1bmN0aW9uIHZ5KGUsdCxyKXt2YXIgbj1yLl93aW5kb3c7aWYobj09PW51bGwpcmV0dXJuIG51bGw7dmFyIG89bi5ldmVudCxpPW8/by50eXBlOnZvaWQgMDtuPWk9PT0ic2VsZWN0aW9uY2hhbmdlIixvPSF6MCYmKG58fGk9PT0iYmVmb3JlaW5wdXQifHxpPT09ImNvbXBvc2l0aW9uc3RhcnQifHxpPT09ImNvbXBvc2l0aW9uZW5kInx8aT09PSJjbGljayImJm8mJm8uZGV0YWlsPT09M3x8aT09PSJkcm9wInx8aT09PXZvaWQgMCk7bGV0IGw7aWYoIVEoZSl8fG8pe2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2lmKG89dC5hbmNob3JOb2RlLGk9dC5mb2N1c05vZGUsbD10LmFuY2hvck9mZnNldCx0PXQuZm9jdXNPZmZzZXQsbiYmUShlKSYmIVF1KHIsbyxpKSlyZXR1cm4gZS5jbG9uZSgpfWVsc2UgcmV0dXJuIGUuY2xvbmUoKTtpZihyPUZUKG8sbCxpLHQscixlKSxyPT09bnVsbClyZXR1cm4gbnVsbDtsZXRbcyxhXT1yO3JldHVybiBuZXcgZ2wocyxhLFEoZSk/ZS5mb3JtYXQ6MCxRKGUpP2Uuc3R5bGU6IiIpfWZ1bmN0aW9uIEFlKCl7cmV0dXJuIG5vKCkuX3NlbGVjdGlvbn1mdW5jdGlvbiBScygpe3JldHVybiBqZSgpLl9lZGl0b3JTdGF0ZS5fc2VsZWN0aW9ufWZ1bmN0aW9uIHNkKGUsdCxyLG49MSl7dmFyIG89ZS5hbmNob3IsaT1lLmZvY3VzLGw9by5nZXROb2RlKCkscz1pLmdldE5vZGUoKTtpZih0LmlzKGwpfHx0LmlzKHMpKXtpZihsPXQuX19rZXksZS5pc0NvbGxhcHNlZCgpKXQ9by5vZmZzZXQsKHI8PXQmJjA8bnx8cjx0JiYwPm4pJiYocj1NYXRoLm1heCgwLHQrbiksby5zZXQobCxyLCJlbGVtZW50IiksaS5zZXQobCxyLCJlbGVtZW50IiksT0MoZSkpO2Vsc2V7bGV0IHU9ZS5pc0JhY2t3YXJkKCk7cz11P2k6bzt2YXIgYT1zLmdldE5vZGUoKTtvPXU/bzppLGk9by5nZXROb2RlKCksdC5pcyhhKSYmKGE9cy5vZmZzZXQsKHI8PWEmJjA8bnx8cjxhJiYwPm4pJiZzLnNldChsLE1hdGgubWF4KDAsYStuKSwiZWxlbWVudCIpKSx0LmlzKGkpJiYodD1vLm9mZnNldCwocjw9dCYmMDxufHxyPHQmJjA+bikmJm8uc2V0KGwsTWF0aC5tYXgoMCx0K24pLCJlbGVtZW50IikpfU9DKGUpfX1mdW5jdGlvbiBPQyhlKXt2YXIgdD1lLmFuY2hvcixyPXQub2Zmc2V0O2xldCBuPWUuZm9jdXM7dmFyIG89bi5vZmZzZXQsaT10LmdldE5vZGUoKSxsPW4uZ2V0Tm9kZSgpO2lmKGUuaXNDb2xsYXBzZWQoKSlNKGkpJiYobD1pLmdldENoaWxkcmVuU2l6ZSgpLGw9KG89cj49bCk/aS5nZXRDaGlsZEF0SW5kZXgobC0xKTppLmdldENoaWxkQXRJbmRleChyKSxGKGwpJiYocj0wLG8mJihyPWwuZ2V0VGV4dENvbnRlbnRTaXplKCkpLHQuc2V0KGwuX19rZXksciwidGV4dCIpLG4uc2V0KGwuX19rZXksciwidGV4dCIpKSk7ZWxzZXtpZihNKGkpKXtsZXQgcz1pLmdldENoaWxkcmVuU2l6ZSgpO3I9KGU9cj49cyk/aS5nZXRDaGlsZEF0SW5kZXgocy0xKTppLmdldENoaWxkQXRJbmRleChyKSxGKHIpJiYoaT0wLGUmJihpPXIuZ2V0VGV4dENvbnRlbnRTaXplKCkpLHQuc2V0KHIuX19rZXksaSwidGV4dCIpKX1NKGwpJiYocj1sLmdldENoaWxkcmVuU2l6ZSgpLG89KHQ9bz49cik/bC5nZXRDaGlsZEF0SW5kZXgoci0xKTpsLmdldENoaWxkQXRJbmRleChvKSxGKG8pJiYobD0wLHQmJihsPW8uZ2V0VGV4dENvbnRlbnRTaXplKCkpLG4uc2V0KG8uX19rZXksbCwidGV4dCIpKSl9fWZ1bmN0aW9uIGxFKGUsdCl7aWYodD10LmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbixlPWUuX3NlbGVjdGlvbixRKGUpKXt2YXIgcj1lLmFuY2hvcjtsZXQgbj1lLmZvY3VzLG87ci50eXBlPT09InRleHQiJiYobz1yLmdldE5vZGUoKSxvLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKSxuLnR5cGU9PT0idGV4dCImJihyPW4uZ2V0Tm9kZSgpLG8hPT1yJiZyLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKX19ZnVuY3Rpb24gYWQoZSx0LHIsbixvKXtsZXQgaT1udWxsLGw9MCxzPW51bGw7biE9PW51bGw/KGk9bi5fX2tleSxGKG4pPyhsPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkscz0idGV4dCIpOk0obikmJihsPW4uZ2V0Q2hpbGRyZW5TaXplKCkscz0iZWxlbWVudCIpKTpvIT09bnVsbCYmKGk9by5fX2tleSxGKG8pP3M9InRleHQiOk0obykmJihzPSJlbGVtZW50IikpLGkhPT1udWxsJiZzIT09bnVsbD9lLnNldChpLGwscyk6KGw9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLGw9PT0tMSYmKGw9ci5nZXRDaGlsZHJlblNpemUoKSksZS5zZXQoci5fX2tleSxsLCJlbGVtZW50IikpfWZ1bmN0aW9uIHpDKGUsdCxyLG4sbyl7ZS50eXBlPT09InRleHQiPyhlLmtleT1yLHR8fChlLm9mZnNldCs9bykpOmUub2Zmc2V0Pm4uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSYmLS1lLm9mZnNldH1mdW5jdGlvbiBqVChlLHQscil7bGV0IG49W10sbz1udWxsLGk9bnVsbDtlPWUuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IHA9MDtwPGUubGVuZ3RoO3ArKyl7dmFyIGw9ZVtwXTtxdShsKXx8eigxMDgpO3ZhciBzPWwuZ2V0Q2hpbGRyZW4oKTtsPTA7Zm9yKGxldCBjIG9mIHMpe2Zvcih4bihjKXx8eigxMDkpO25bcF0hPT12b2lkIDAmJm5bcF1bbF0hPT12b2lkIDA7KWwrKztzPXA7dmFyIGE9bCx1PWM7bGV0IGY9e2NlbGw6dSxzdGFydENvbHVtbjphLHN0YXJ0Um93OnN9LGQ9dS5fX3Jvd1NwYW4sbT11Ll9fY29sU3Bhbjtmb3IobGV0IGg9MDtoPGQ7aCsrKXtuW3MraF09PT12b2lkIDAmJihuW3MraF09W10pO2ZvcihsZXQgUz0wO1M8bTtTKyspbltzK2hdW2ErU109Zn10LmlzKHUpJiYobz1mKSxyLmlzKHUpJiYoaT1mKSxsKz1jLl9fY29sU3Bhbn19cmV0dXJuIG89PT1udWxsJiZ6KDExMCksaT09PW51bGwmJnooMTExKSxbbixvLGldfWZ1bmN0aW9uIFdUKGUpe2UgaW5zdGFuY2VvZiBHdXx8KGUgaW5zdGFuY2VvZiBtbD8oZT1uZChlLHhuKSx4bihlKXx8eigxMTQpKTooZT1uZChlLmdldE5vZGUoKSx4bikseG4oZSl8fHooMTE0KSkpO2xldCB0PWUuZ2V0UGFyZW50KCk7cXUodCl8fHooMTE1KTtsZXQgcj10LmdldFBhcmVudCgpO3JldHVybiBTeShyKXx8eigxMTYpLFtlLHQscl19dmFyIEx0PW51bGwsQXQ9bnVsbCxQcj0hMSxMMD0hMSxSdT0wLEJDPXtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfTtmdW5jdGlvbiBHcygpe3JldHVybiBQcnx8THQhPT1udWxsJiZMdC5fcmVhZE9ubHl9ZnVuY3Rpb24gaHIoKXtQciYmeigxMyl9ZnVuY3Rpb24gbm8oKXtyZXR1cm4gTHQ9PT1udWxsJiZ6KDE1KSxMdH1mdW5jdGlvbiBqZSgpe3JldHVybiBBdD09PW51bGwmJnooMTYpLEF0fWZ1bmN0aW9uIEZDKGUsdCxyKXt2YXIgbj10Ll9fdHlwZTtsZXQgbz1lLl9ub2Rlcy5nZXQobik7Zm9yKG89PT12b2lkIDAmJnooMzAsbiksZT1yLmdldChuKSxlPT09dm9pZCAwJiYoZT1BcnJheS5mcm9tKG8udHJhbnNmb3Jtcyksci5zZXQobixlKSkscj1lLmxlbmd0aCxuPTA7bjxyJiYoZVtuXSh0KSx0LmlzQXR0YWNoZWQoKSk7bisrKTt9ZnVuY3Rpb24gc0UoZSx0KXt0PXQuX2RpcnR5TGVhdmVzLGU9ZS5fbm9kZU1hcDtmb3IobGV0IHIgb2YgdCl0PWUuZ2V0KHIpLEYodCkmJnQuaXNBdHRhY2hlZCgpJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCkmJnBUKHQpfWZ1bmN0aW9uIGFFKGUsdCl7bGV0IHI9dC5fZGlydHlMZWF2ZXMsbj10Ll9kaXJ0eUVsZW1lbnRzO2U9ZS5fbm9kZU1hcDtsZXQgbz1iaSgpLGk9bmV3IE1hcDt2YXIgbD1yO2xldCBzPWwuc2l6ZTtmb3IodmFyIGE9bix1PWEuc2l6ZTswPHN8fDA8dTspe2lmKDA8cyl7dC5fZGlydHlMZWF2ZXM9bmV3IFNldDtmb3IobGV0IHAgb2YgbClsPWUuZ2V0KHApLEYobCkmJmwuaXNBdHRhY2hlZCgpJiZsLmlzU2ltcGxlVGV4dCgpJiYhbC5pc1VubWVyZ2VhYmxlKCkmJnBUKGwpLGwhPT12b2lkIDAmJmwhPT12b2lkIDAmJmwuX19rZXkhPT1vJiZsLmlzQXR0YWNoZWQoKSYmRkModCxsLGkpLHIuYWRkKHApO2lmKGw9dC5fZGlydHlMZWF2ZXMscz1sLnNpemUsMDxzKXtSdSsrO2NvbnRpbnVlfX10Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0LHQuX2RpcnR5RWxlbWVudHM9bmV3IE1hcDtmb3IobGV0IHAgb2YgYSlhPXBbMF0sdT1wWzFdLChhPT09InJvb3QifHx1KSYmKGw9ZS5nZXQoYSksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PW8mJmwuaXNBdHRhY2hlZCgpJiZGQyh0LGwsaSksbi5zZXQoYSx1KSk7bD10Ll9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSxhPXQuX2RpcnR5RWxlbWVudHMsdT1hLnNpemUsUnUrK310Ll9kaXJ0eUxlYXZlcz1yLHQuX2RpcnR5RWxlbWVudHM9bn1mdW5jdGlvbiB4eShlLHQpe3ZhciByPWUudHlwZSxuPXQuZ2V0KHIpO2lmKG49PT12b2lkIDAmJnooMTcscikscj1uLmtsYXNzLGUudHlwZSE9PXIuZ2V0VHlwZSgpJiZ6KDE4LHIubmFtZSkscj1yLmltcG9ydEpTT04oZSksZT1lLmNoaWxkcmVuLE0ocikmJkFycmF5LmlzQXJyYXkoZSkpZm9yKG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IG89eHkoZVtuXSx0KTtyLmFwcGVuZChvKX1yZXR1cm4gcn1mdW5jdGlvbiAkQyhlLHQpe2xldCByPUx0LG49UHIsbz1BdDtMdD1lLFByPSEwLEF0PW51bGw7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtMdD1yLFByPW4sQXQ9b319ZnVuY3Rpb24gZmwoZSx0KXtsZXQgcj1lLl9wZW5kaW5nRWRpdG9yU3RhdGUsbj1lLl9yb290RWxlbWVudCxvPWUuX2hlYWRsZXNzfHxuPT09bnVsbDtpZihyIT09bnVsbCl7dmFyIGk9ZS5fZWRpdG9yU3RhdGUsbD1pLl9zZWxlY3Rpb24scz1yLl9zZWxlY3Rpb24sYT1lLl9kaXJ0eVR5cGUhPT0wLHU9THQscD1QcixjPUF0LGY9ZS5fdXBkYXRpbmcsZD1lLl9vYnNlcnZlcixtPW51bGw7aWYoZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwsZS5fZWRpdG9yU3RhdGU9ciwhbyYmYSYmZCE9PW51bGwpe0F0PWUsTHQ9cixQcj0hMSxlLl91cGRhdGluZz0hMDt0cnl7bGV0IHplPWUuX2RpcnR5VHlwZSxzcj1lLl9kaXJ0eUVsZW1lbnRzLGFyPWUuX2RpcnR5TGVhdmVzO2QuZGlzY29ubmVjdCgpO3ZhciBoPXplLFM9c3IseT1hcjttcj1Pbz1DdD0iIixfVD1oPT09MixHZj1udWxsLG5yPWUsUGk9ZS5fY29uZmlnLFd1PWUuX25vZGVzLHhkPW5yLl9saXN0ZW5lcnMubXV0YXRpb24sajA9UyxXMD15LGRsPWkuX25vZGVNYXAsTWk9ci5fbm9kZU1hcCxneT1yLl9yZWFkT25seSxIMD1uZXcgTWFwKGUuX2tleVRvRE9NTWFwKTtsZXQgJG49bmV3IE1hcDtIdT0kbixJdSgicm9vdCIsbnVsbCksSHU9SDA9UGk9TWk9ZGw9VzA9ajA9V3U9bnI9dm9pZCAwLG09JG59Y2F0Y2goemUpe2lmKHplIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoemUpLEwwKXRocm93IHplO1ZUKGUsbnVsbCxuLHIpLGNUKGUpLGUuX2RpcnR5VHlwZT0yLEwwPSEwLGZsKGUsaSksTDA9ITE7cmV0dXJufWZpbmFsbHl7ZC5vYnNlcnZlKG4sQkMpLGUuX3VwZGF0aW5nPWYsTHQ9dSxQcj1wLEF0PWN9fXIuX3JlYWRPbmx5fHwoci5fcmVhZE9ubHk9ITApO3ZhciB2PWUuX2RpcnR5TGVhdmVzLGc9ZS5fZGlydHlFbGVtZW50cyxDPWUuX25vcm1hbGl6ZWROb2RlcyxrPWUuX3VwZGF0ZVRhZ3MsRD1lLl9kZWZlcnJlZDthJiYoZS5fZGlydHlUeXBlPTAsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCxlLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCxlLl91cGRhdGVUYWdzPW5ldyBTZXQpO3ZhciBPPWUuX2RlY29yYXRvcnMsTj1lLl9wZW5kaW5nRGVjb3JhdG9yc3x8TyxMPXIuX25vZGVNYXAsVztmb3IoVyBpbiBOKUwuaGFzKFcpfHwoTj09PU8mJihOPWdUKGUpKSxkZWxldGUgTltXXSk7dmFyIFk9bz9udWxsOnJvKGUuX3dpbmRvdyk7aWYoZS5fZWRpdGFibGUmJlkhPT1udWxsJiYoYXx8cz09PW51bGx8fHMuZGlydHkpKXtBdD1lLEx0PXI7dHJ5e2lmKGQhPT1udWxsJiZkLmRpc2Nvbm5lY3QoKSxhfHxzPT09bnVsbHx8cy5kaXJ0eSl7bGV0IHplPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDt6ZSE9PW51bGwmJiQwKHplLGUsbik7ZTp7bGV0IHNyPVkuYW5jaG9yTm9kZSxhcj1ZLmZvY3VzTm9kZSwkbj1ZLmFuY2hvck9mZnNldCxpYT1ZLmZvY3VzT2Zmc2V0LFhyPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIShrLmhhcygiY29sbGFib3JhdGlvbiIpJiZYciE9PW58fFhyIT09bnVsbCYmY3koWHIpKSlpZihRKHMpKXt2YXIgeWU9cy5hbmNob3IsU3I9cy5mb2N1cyxfdD15ZS5rZXksY3Q9U3Iua2V5LG90PXRkKGUsX3QpLE5lPXRkKGUsY3QpLHB0PXllLm9mZnNldCxpdD1Tci5vZmZzZXQsY289cy5mb3JtYXQsUXQ9cy5zdHlsZSxLcj1zLmlzQ29sbGFwc2VkKCksZnQ9b3Qsa3Q9TmUsd2U9ITE7aWYoeWUudHlwZT09PSJ0ZXh0Iil7ZnQ9WmYob3QpO2xldCBacj15ZS5nZXROb2RlKCk7d2U9WnIuZ2V0Rm9ybWF0KCkhPT1jb3x8WnIuZ2V0U3R5bGUoKSE9PVF0fWVsc2UgUShsKSYmbC5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKHdlPSEwKTtpZihTci50eXBlPT09InRleHQiJiYoa3Q9WmYoTmUpKSxmdCE9PW51bGwmJmt0IT09bnVsbCl7aWYoS3ImJihsPT09bnVsbHx8d2V8fFEobCkmJihsLmZvcm1hdCE9PWNvfHxsLnN0eWxlIT09UXQpKSl7dmFyIFlyPXBlcmZvcm1hbmNlLm5vdygpO0xUPVtjbyxRdCxwdCxfdCxZcl19aWYoJG49PT1wdCYmaWE9PT1pdCYmc3I9PT1mdCYmYXI9PT1rdCYmKFkudHlwZSE9PSJSYW5nZSJ8fCFLcikmJihYciE9PW51bGwmJm4uY29udGFpbnMoWHIpfHxuLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSkseWUudHlwZSE9PSJlbGVtZW50IikpYnJlYWsgZTt0cnl7WS5zZXRCYXNlQW5kRXh0ZW50KGZ0LHB0LGt0LGl0KX1jYXRjaHt9aWYoIWsuaGFzKCJza2lwLXNjcm9sbC1pbnRvLXZpZXciKSYmcy5pc0NvbGxhcHNlZCgpJiZuIT09bnVsbCYmbj09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe2xldCBacj1zIGluc3RhbmNlb2YgZ2wmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCI/ZnQuY2hpbGROb2Rlc1twdF18fG51bGw6MDxZLnJhbmdlQ291bnQ/WS5nZXRSYW5nZUF0KDApOm51bGw7aWYoWnIhPT1udWxsKXtsZXQgSnI7aWYoWnIgaW5zdGFuY2VvZiBUZXh0KXtsZXQgSXI9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtJci5zZWxlY3ROb2RlKFpyKSxKcj1Jci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1lbHNlIEpyPVpyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBSbz1uLm93bmVyRG9jdW1lbnQsJGk9Um8uZGVmYXVsdFZpZXc7aWYoJGkhPT1udWxsKWZvcih2YXJ7dG9wOnpuLGJvdHRvbTpCbn09SnIscG8sZm8sQ3I9bjtDciE9PW51bGw7KXtsZXQgSXI9Q3I9PT1Sby5ib2R5O2lmKElyKXBvPTAsZm89eWQoZSkuaW5uZXJIZWlnaHQ7ZWxzZXtsZXQgZGM9Q3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cG89ZGMudG9wLGZvPWRjLmJvdHRvbX1sZXQgamk9MDtpZih6bjxwbz9qaT0tKHBvLXpuKTpCbj5mbyYmKGppPUJuLWZvKSxqaSE9PTApaWYoSXIpJGkuc2Nyb2xsQnkoMCxqaSk7ZWxzZXtsZXQgZGM9Q3Iuc2Nyb2xsVG9wO0NyLnNjcm9sbFRvcCs9amk7bGV0IHMxPUNyLnNjcm9sbFRvcC1kYzt6bi09czEsQm4tPXMxfWlmKElyKWJyZWFrO0NyPWdkKENyKX19fXEwPSEwfX1lbHNlIGwhPT1udWxsJiZRdShlLHNyLGFyKSYmWS5yZW1vdmVBbGxSYW5nZXMoKX19ZTp7bGV0IHplPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtpZihRKHMpJiZzLmlzQ29sbGFwc2VkKCkmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJm4uY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpe2xldCBzcj1zLmFuY2hvcixhcj1zci5nZXROb2RlKCksJG49c3Iub2Zmc2V0LGlhPWFyLmdldENoaWxkcmVuU2l6ZSgpLFhyPSExLFpyPW51bGw7aWYoJG49PT1pYSl7bGV0IEpyPWFyLmdldENoaWxkQXRJbmRleCgkbi0xKTtrMChKcikmJihYcj0hMCl9ZWxzZXtsZXQgSnI9YXIuZ2V0Q2hpbGRBdEluZGV4KCRuKTtpZihrMChKcikpe2xldCBSbz1Kci5nZXRQcmV2aW91c1NpYmxpbmcoKTsoUm89PT1udWxsfHxrMChSbykpJiYoWHI9ITAsWnI9ZS5nZXRFbGVtZW50QnlLZXkoSnIuX19rZXkpKX19aWYoWHIpe2xldCBKcj1lLmdldEVsZW1lbnRCeUtleShhci5fX2tleSk7aWYoemU9PT1udWxsKXtsZXQgUm89ZS5fY29uZmlnLnRoZW1lLCRpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOyRpLmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiLCRpLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWN1cnNvciIsInRydWUiKTtsZXQgSXI9Um8uYmxvY2tDdXJzb3I7aWYoSXIhPT12b2lkIDApe2lmKHR5cGVvZiBJcj09InN0cmluZyIpe2xldCBqaT1Jci5zcGxpdCgiICIpO0lyPVJvLmJsb2NrQ3Vyc29yPWppfUlyIT09dm9pZCAwJiYkaS5jbGFzc0xpc3QuYWRkKC4uLklyKX1lLl9ibG9ja0N1cnNvckVsZW1lbnQ9emU9JGl9bi5zdHlsZS5jYXJldENvbG9yPSJ0cmFuc3BhcmVudCIsWnI9PT1udWxsP0pyLmFwcGVuZENoaWxkKHplKTpKci5pbnNlcnRCZWZvcmUoemUsWnIpO2JyZWFrIGV9fXplIT09bnVsbCYmJDAoemUsZSxuKX1kIT09bnVsbCYmZC5vYnNlcnZlKG4sQkMpfWZpbmFsbHl7QXQ9YyxMdD11fX1pZihtIT09bnVsbCl7dmFyIEZpPW07bGV0IHplPUFycmF5LmZyb20oZS5fbGlzdGVuZXJzLm11dGF0aW9uKSxzcj16ZS5sZW5ndGg7Zm9yKGxldCBhcj0wO2FyPHNyO2FyKyspe2xldFskbixpYV09emVbYXJdLFhyPUZpLmdldChpYSk7WHIhPT12b2lkIDAmJiRuKFhyLHtkaXJ0eUxlYXZlczp2LHByZXZFZGl0b3JTdGF0ZTppLHVwZGF0ZVRhZ3M6a30pfX1RKHMpfHxzPT09bnVsbHx8bCE9PW51bGwmJmwuaXMocyl8fGUuZGlzcGF0Y2hDb21tYW5kKGRkLHZvaWQgMCk7dmFyIEZuPWUuX3BlbmRpbmdEZWNvcmF0b3JzO0ZuIT09bnVsbCYmKGUuX2RlY29yYXRvcnM9Rm4sZS5fcGVuZGluZ0RlY29yYXRvcnM9bnVsbCxCdSgiZGVjb3JhdG9yIixlLCEwLEZuKSk7dmFyIG9hPUNDKHR8fGkpLGkxPUNDKHIpO2lmKG9hIT09aTEmJkJ1KCJ0ZXh0Y29udGVudCIsZSwhMCxpMSksQnUoInVwZGF0ZSIsZSwhMCx7ZGlydHlFbGVtZW50czpnLGRpcnR5TGVhdmVzOnYsZWRpdG9yU3RhdGU6cixub3JtYWxpemVkTm9kZXM6QyxwcmV2RWRpdG9yU3RhdGU6dHx8aSx0YWdzOmt9KSxlLl9kZWZlcnJlZD1bXSxELmxlbmd0aCE9PTApe2xldCB6ZT1lLl91cGRhdGluZztlLl91cGRhdGluZz0hMDt0cnl7Zm9yKGxldCBzcj0wO3NyPEQubGVuZ3RoO3NyKyspRFtzcl0oKX1maW5hbGx5e2UuX3VwZGF0aW5nPXplfX12YXIgbDE9ZS5fdXBkYXRlcztpZihsMS5sZW5ndGghPT0wKXtsZXQgemU9bDEuc2hpZnQoKTtpZih6ZSl7bGV0W3NyLGFyXT16ZTtIVChlLHNyLGFyKX19fX1mdW5jdGlvbiBCdShlLHQsciwuLi5uKXtsZXQgbz10Ll91cGRhdGluZzt0Ll91cGRhdGluZz1yO3RyeXtsZXQgaT1BcnJheS5mcm9tKHQuX2xpc3RlbmVyc1tlXSk7Zm9yKGU9MDtlPGkubGVuZ3RoO2UrKylpW2VdLmFwcGx5KG51bGwsbil9ZmluYWxseXt0Ll91cGRhdGluZz1vfX1mdW5jdGlvbiBCKGUsdCxyKXtpZihlLl91cGRhdGluZz09PSExfHxBdCE9PWUpe2xldCBpPSExO3JldHVybiBlLnVwZGF0ZSgoKT0+e2k9QihlLHQscil9KSxpfWxldCBuPWZ5KGUpO2ZvcihsZXQgaT00OzA8PWk7aS0tKWZvcihsZXQgbD0wO2w8bi5sZW5ndGg7bCsrKXt2YXIgbz1uW2xdLl9jb21tYW5kcy5nZXQodCk7aWYobyE9PXZvaWQgMCYmKG89b1tpXSxvIT09dm9pZCAwKSl7bz1BcnJheS5mcm9tKG8pO2xldCBzPW8ubGVuZ3RoO2ZvcihsZXQgYT0wO2E8czthKyspaWYob1thXShyLGUpPT09ITApcmV0dXJuITB9fXJldHVybiExfWZ1bmN0aW9uIGpDKGUsdCl7bGV0IHI9ZS5fdXBkYXRlcztmb3IodD10fHwhMTtyLmxlbmd0aCE9PTA7KXt2YXIgbj1yLnNoaWZ0KCk7aWYobil7bGV0W28saV09bixsO2khPT12b2lkIDAmJihuPWkub25VcGRhdGUsbD1pLnRhZyxpLnNraXBUcmFuc2Zvcm1zJiYodD0hMCksbiYmZS5fZGVmZXJyZWQucHVzaChuKSxsJiZlLl91cGRhdGVUYWdzLmFkZChsKSksbygpfX1yZXR1cm4gdH1mdW5jdGlvbiBIVChlLHQscil7bGV0IG49ZS5fdXBkYXRlVGFnczt2YXIgbyxpPW89ITE7aWYociE9PXZvaWQgMCl7dmFyIGw9ci5vblVwZGF0ZTtvPXIudGFnLG8hPW51bGwmJm4uYWRkKG8pLG89ci5za2lwVHJhbnNmb3Jtc3x8ITEsaT1yLmRpc2NyZXRlfHwhMX1sJiZlLl9kZWZlcnJlZC5wdXNoKGwpLHI9ZS5fZWRpdG9yU3RhdGUsbD1lLl9wZW5kaW5nRWRpdG9yU3RhdGU7bGV0IHM9ITE7KGw9PT1udWxsfHxsLl9yZWFkT25seSkmJihsPWUuX3BlbmRpbmdFZGl0b3JTdGF0ZT1uZXcgY2QobmV3IE1hcCgobHx8cikuX25vZGVNYXApKSxzPSEwKSxsLl9mbHVzaFN5bmM9aSxpPUx0O2xldCBhPVByLHU9QXQscD1lLl91cGRhdGluZztMdD1sLFByPSExLGUuX3VwZGF0aW5nPSEwLEF0PWU7dHJ5e3MmJihlLl9oZWFkbGVzcz9yLl9zZWxlY3Rpb24hPW51bGwmJihsLl9zZWxlY3Rpb249ci5fc2VsZWN0aW9uLmNsb25lKCkpOmwuX3NlbGVjdGlvbj1pRShlKSk7bGV0IGM9ZS5fY29tcG9zaXRpb25LZXk7dCgpLG89akMoZSxvKSxsRShsLGUpLGUuX2RpcnR5VHlwZSE9PTAmJihvP3NFKGwsZSk6YUUobCxlKSxqQyhlKSxVNShyLGwsZS5fZGlydHlMZWF2ZXMsZS5fZGlydHlFbGVtZW50cykpLGMhPT1lLl9jb21wb3NpdGlvbktleSYmKGwuX2ZsdXNoU3luYz0hMCk7bGV0IGY9bC5fc2VsZWN0aW9uO2lmKFEoZikpe2xldCBkPWwuX25vZGVNYXAsbT1mLmZvY3VzLmtleTtkLmdldChmLmFuY2hvci5rZXkpIT09dm9pZCAwJiZkLmdldChtKSE9PXZvaWQgMHx8eigxOSl9ZWxzZSBWcyhmKSYmZi5fbm9kZXMuc2l6ZT09PTAmJihsLl9zZWxlY3Rpb249bnVsbCl9Y2F0Y2goYyl7YyBpbnN0YW5jZW9mIEVycm9yJiZlLl9vbkVycm9yKGMpLGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT1yLGUuX2RpcnR5VHlwZT0yLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksZmwoZSk7cmV0dXJufWZpbmFsbHl7THQ9aSxQcj1hLEF0PXUsZS5fdXBkYXRpbmc9cCxSdT0wfWUuX2RpcnR5VHlwZSE9PTB8fHVFKGwsZSk/bC5fZmx1c2hTeW5jPyhsLl9mbHVzaFN5bmM9ITEsZmwoZSkpOnMmJiQ1KCgpPT57ZmwoZSl9KToobC5fZmx1c2hTeW5jPSExLHMmJihuLmNsZWFyKCksZS5fZGVmZXJyZWQ9W10sZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwpKX1mdW5jdGlvbiBVcihlLHQscil7ZS5fdXBkYXRpbmc/ZS5fdXBkYXRlcy5wdXNoKFt0LHJdKTpIVChlLHQscil9dmFyIHVkPWNsYXNzIGV4dGVuZHMgbWx7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9ZGVjb3JhdGUoKXt6KDQ3KX1pc0lzb2xhdGVkKCl7cmV0dXJuITF9aXNJbmxpbmUoKXtyZXR1cm4hMH1pc0tleWJvYXJkU2VsZWN0YWJsZSgpe3JldHVybiEwfX07ZnVuY3Rpb24gTGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB1ZH12YXIgem89Y2xhc3MgZXh0ZW5kcyBtbHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLl9fbGFzdD10aGlzLl9fZmlyc3Q9bnVsbCx0aGlzLl9faW5kZW50PXRoaXMuX19mb3JtYXQ9dGhpcy5fX3NpemU9MCx0aGlzLl9fZGlyPW51bGx9Z2V0Rm9ybWF0KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19mb3JtYXR9Z2V0Rm9ybWF0VHlwZSgpe2xldCB0PXRoaXMuZ2V0Rm9ybWF0KCk7cmV0dXJuIEE1W3RdfHwiIn1nZXRJbmRlbnQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2luZGVudH1nZXRDaGlsZHJlbigpe2xldCB0PVtdLHI9dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtyIT09bnVsbDspdC5wdXNoKHIpLHI9ci5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldENoaWxkcmVuS2V5cygpe2xldCB0PVtdLHI9dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtyIT09bnVsbDspdC5wdXNoKHIuX19rZXkpLHI9ci5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldENoaWxkcmVuU2l6ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fc2l6ZX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wfWlzRGlydHkoKXtsZXQgdD1qZSgpLl9kaXJ0eUVsZW1lbnRzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9aXNMYXN0Q2hpbGQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLHI9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIHIhPT1udWxsJiZyLmlzKHQpfWdldEFsbFRleHROb2Rlcygpe2xldCB0PVtdLHI9dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtyIT09bnVsbDspe2lmKEYocikmJnQucHVzaChyKSxNKHIpKXtsZXQgbj1yLmdldEFsbFRleHROb2RlcygpO3QucHVzaCguLi5uKX1yPXIuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4gdH1nZXRGaXJzdERlc2NlbmRhbnQoKXtsZXQgdD10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO3QhPT1udWxsOyl7aWYoTSh0KSl7bGV0IHI9dC5nZXRGaXJzdENoaWxkKCk7aWYociE9PW51bGwpe3Q9cjtjb250aW51ZX19YnJlYWt9cmV0dXJuIHR9Z2V0TGFzdERlc2NlbmRhbnQoKXtsZXQgdD10aGlzLmdldExhc3RDaGlsZCgpO2Zvcig7dCE9PW51bGw7KXtpZihNKHQpKXtsZXQgcj10LmdldExhc3RDaGlsZCgpO2lmKHIhPT1udWxsKXt0PXI7Y29udGludWV9fWJyZWFrfXJldHVybiB0fWdldERlc2NlbmRhbnRCeUluZGV4KHQpe2xldCByPXRoaXMuZ2V0Q2hpbGRyZW4oKSxuPXIubGVuZ3RoO3JldHVybiB0Pj1uPyh0PXJbbi0xXSxNKHQpJiZ0LmdldExhc3REZXNjZW5kYW50KCl8fHR8fG51bGwpOih0PXJbdF0sTSh0KSYmdC5nZXRGaXJzdERlc2NlbmRhbnQoKXx8dHx8bnVsbCl9Z2V0Rmlyc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19maXJzdDtyZXR1cm4gdD09PW51bGw/bnVsbDpJdCh0KX1nZXRGaXJzdENoaWxkT3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO3JldHVybiB0PT09bnVsbCYmeig0NSx0aGlzLl9fa2V5KSx0fWdldExhc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19sYXN0O3JldHVybiB0PT09bnVsbD9udWxsOkl0KHQpfWdldExhc3RDaGlsZE9yVGhyb3coKXtsZXQgdD10aGlzLmdldExhc3RDaGlsZCgpO3JldHVybiB0PT09bnVsbCYmeig5Nix0aGlzLl9fa2V5KSx0fWdldENoaWxkQXRJbmRleCh0KXt2YXIgcj10aGlzLmdldENoaWxkcmVuU2l6ZSgpO2xldCBuO2lmKHQ8ci8yKXtmb3Iobj10aGlzLmdldEZpcnN0Q2hpbGQoKSxyPTA7biE9PW51bGwmJnI8PXQ7KXtpZihyPT09dClyZXR1cm4gbjtuPW4uZ2V0TmV4dFNpYmxpbmcoKSxyKyt9cmV0dXJuIG51bGx9Zm9yKG49dGhpcy5nZXRMYXN0Q2hpbGQoKSwtLXI7biE9PW51bGwmJnI+PXQ7KXtpZihyPT09dClyZXR1cm4gbjtuPW4uZ2V0UHJldmlvdXNTaWJsaW5nKCksci0tfXJldHVybiBudWxsfWdldFRleHRDb250ZW50KCl7bGV0IHQ9IiIscj10aGlzLmdldENoaWxkcmVuKCksbj1yLmxlbmd0aDtmb3IobGV0IG89MDtvPG47bysrKXtsZXQgaT1yW29dO3QrPWkuZ2V0VGV4dENvbnRlbnQoKSxNKGkpJiZvIT09bi0xJiYhaS5pc0lubGluZSgpJiYodCs9XGAKClxgKX1yZXR1cm4gdH1nZXRUZXh0Q29udGVudFNpemUoKXtsZXQgdD0wLHI9dGhpcy5nZXRDaGlsZHJlbigpLG49ci5sZW5ndGg7Zm9yKGxldCBvPTA7bzxuO28rKyl7bGV0IGk9cltvXTt0Kz1pLmdldFRleHRDb250ZW50U2l6ZSgpLE0oaSkmJm8hPT1uLTEmJiFpLmlzSW5saW5lKCkmJih0Kz0yKX1yZXR1cm4gdH1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Rpcn1oYXNGb3JtYXQodCl7cmV0dXJuIHQhPT0iIj8odD12Q1t0XSwodGhpcy5nZXRGb3JtYXQoKSZ0KSE9PTApOiExfXNlbGVjdCh0LHIpe2hyKCk7bGV0IG49QWUoKSxvPXQsaT1yO3ZhciBsPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7aWYoIXRoaXMuY2FuQmVFbXB0eSgpKXtpZih0PT09MCYmcj09PTApe2lmKHQ9dGhpcy5nZXRGaXJzdENoaWxkKCksRih0KXx8TSh0KSlyZXR1cm4gdC5zZWxlY3QoMCwwKX1lbHNlIGlmKCEodCE9PXZvaWQgMCYmdCE9PWx8fHIhPT12b2lkIDAmJnIhPT1sKSYmKHQ9dGhpcy5nZXRMYXN0Q2hpbGQoKSxGKHQpfHxNKHQpKSlyZXR1cm4gdC5zZWxlY3QoKX1pZihvPT09dm9pZCAwJiYobz1sKSxpPT09dm9pZCAwJiYoaT1sKSxsPXRoaXMuX19rZXksUShuKSluLmFuY2hvci5zZXQobCxvLCJlbGVtZW50Iiksbi5mb2N1cy5zZXQobCxpLCJlbGVtZW50Iiksbi5kaXJ0eT0hMDtlbHNlIHJldHVybiAkVChsLG8sbCxpLCJlbGVtZW50IiwiZWxlbWVudCIpO3JldHVybiBufXNlbGVjdFN0YXJ0KCl7bGV0IHQ9dGhpcy5nZXRGaXJzdERlc2NlbmRhbnQoKTtyZXR1cm4gTSh0KXx8Rih0KT90LnNlbGVjdCgwLDApOnQhPT1udWxsP3Quc2VsZWN0UHJldmlvdXMoKTp0aGlzLnNlbGVjdCgwLDApfXNlbGVjdEVuZCgpe2xldCB0PXRoaXMuZ2V0TGFzdERlc2NlbmRhbnQoKTtyZXR1cm4gTSh0KXx8Rih0KT90LnNlbGVjdCgpOnQhPT1udWxsP3Quc2VsZWN0TmV4dCgpOnRoaXMuc2VsZWN0KCl9Y2xlYXIoKXtsZXQgdD10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpLHR9YXBwZW5kKC4uLnQpe3JldHVybiB0aGlzLnNwbGljZSh0aGlzLmdldENoaWxkcmVuU2l6ZSgpLDAsdCl9c2V0RGlyZWN0aW9uKHQpe2xldCByPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gci5fX2Rpcj10LHJ9c2V0Rm9ybWF0KHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19mb3JtYXQ9dCE9PSIiP3ZDW3RdOjAsdGhpc31zZXRJbmRlbnQodCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2luZGVudD10LHRoaXN9c3BsaWNlKHQscixuKXtsZXQgbz1uLmxlbmd0aCxpPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCksbD10aGlzLmdldFdyaXRhYmxlKCkscz1sLl9fa2V5O3ZhciBhPVtdLHU9W107bGV0IHA9dGhpcy5nZXRDaGlsZEF0SW5kZXgodCtyKSxjPW51bGwsZj1pLXIrbztpZih0IT09MClpZih0PT09aSljPXRoaXMuZ2V0TGFzdENoaWxkKCk7ZWxzZXt2YXIgZD10aGlzLmdldENoaWxkQXRJbmRleCh0KTtkIT09bnVsbCYmKGM9ZC5nZXRQcmV2aW91c1NpYmxpbmcoKSl9aWYoMDxyKXt2YXIgbT1jPT09bnVsbD90aGlzLmdldEZpcnN0Q2hpbGQoKTpjLmdldE5leHRTaWJsaW5nKCk7Zm9yKGQ9MDtkPHI7ZCsrKXttPT09bnVsbCYmeigxMDApO3ZhciBoPW0uZ2V0TmV4dFNpYmxpbmcoKSxTPW0uX19rZXk7bT1tLmdldFdyaXRhYmxlKCkscGwobSksdS5wdXNoKFMpLG09aH19Zm9yKGQ9YyxoPTA7aDxvO2grKyl7Uz1uW2hdLGQhPT1udWxsJiZTLmlzKGQpJiYoYz1kPWQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLG09Uy5nZXRXcml0YWJsZSgpLG0uX19wYXJlbnQ9PT1zJiZmLS0scGwobSk7bGV0IHk9Uy5fX2tleTtkPT09bnVsbD8obC5fX2ZpcnN0PXksbS5fX3ByZXY9bnVsbCk6KGQ9ZC5nZXRXcml0YWJsZSgpLGQuX19uZXh0PXksbS5fX3ByZXY9ZC5fX2tleSksUy5fX2tleT09PXMmJnooNzYpLG0uX19wYXJlbnQ9cyxhLnB1c2goeSksZD1TfWlmKHQrcj09PWk/ZCE9PW51bGwmJihkLmdldFdyaXRhYmxlKCkuX19uZXh0PW51bGwsbC5fX2xhc3Q9ZC5fX2tleSk6cCE9PW51bGwmJih0PXAuZ2V0V3JpdGFibGUoKSxkIT09bnVsbD8ocj1kLmdldFdyaXRhYmxlKCksdC5fX3ByZXY9ZC5fX2tleSxyLl9fbmV4dD1wLl9fa2V5KTp0Ll9fcHJldj1udWxsKSxsLl9fc2l6ZT1mLHUubGVuZ3RoJiYodD1BZSgpLFEodCkpKXt1PW5ldyBTZXQodSksYT1uZXcgU2V0KGEpO2xldHthbmNob3I6eSxmb2N1czp2fT10O1dDKHksdSxhKSYmYWQoeSx5LmdldE5vZGUoKSx0aGlzLGMscCksV0Modix1LGEpJiZhZCh2LHYuZ2V0Tm9kZSgpLHRoaXMsYyxwKSxmIT09MHx8dGhpcy5jYW5CZUVtcHR5KCl8fE9uKHRoaXMpfHx0aGlzLnJlbW92ZSgpfXJldHVybiBsfWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6ImVsZW1lbnQiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIoKXtyZXR1cm4gbnVsbH1jYW5JbmRlbnQoKXtyZXR1cm4hMH1jb2xsYXBzZUF0U3RhcnQoKXtyZXR1cm4hMX1leGNsdWRlRnJvbUNvcHkoKXtyZXR1cm4hMX1jYW5FeHRyYWN0Q29udGVudHMoKXtyZXR1cm4hMH1jYW5SZXBsYWNlV2l0aCgpe3JldHVybiEwfWNhbkluc2VydEFmdGVyKCl7cmV0dXJuITB9Y2FuQmVFbXB0eSgpe3JldHVybiEwfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMH1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMH1pc0lubGluZSgpe3JldHVybiExfWlzU2hhZG93Um9vdCgpe3JldHVybiExfWNhbk1lcmdlV2l0aCgpe3JldHVybiExfWV4dHJhY3RXaXRoQ2hpbGQoKXtyZXR1cm4hMX19O2Z1bmN0aW9uIE0oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB6b31mdW5jdGlvbiBXQyhlLHQscil7Zm9yKGU9ZS5nZXROb2RlKCk7ZTspe2xldCBuPWUuX19rZXk7aWYodC5oYXMobikmJiFyLmhhcyhuKSlyZXR1cm4hMDtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuITF9dmFyIEhzPWNsYXNzIGUgZXh0ZW5kcyB6b3tzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJyb290In1zdGF0aWMgY2xvbmUoKXtyZXR1cm4gbmV3IGV9Y29uc3RydWN0b3IoKXtzdXBlcigicm9vdCIpLHRoaXMuX19jYWNoZWRUZXh0PW51bGx9Z2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpe3ooNTEpfWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5fX2NhY2hlZFRleHQ7cmV0dXJuIUdzKCkmJmplKCkuX2RpcnR5VHlwZSE9PTB8fHQ9PT1udWxsP3N1cGVyLmdldFRleHRDb250ZW50KCk6dH1yZW1vdmUoKXt6KDUyKX1yZXBsYWNlKCl7eig1Myl9aW5zZXJ0QmVmb3JlKCl7eig1NCl9aW5zZXJ0QWZ0ZXIoKXt6KDU1KX11cGRhdGVET00oKXtyZXR1cm4hMX1hcHBlbmQoLi4udCl7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2xldCBuPXRbcl07TShuKXx8TGUobil8fHooNTYpfXJldHVybiBzdXBlci5hcHBlbmQoLi4udCl9c3RhdGljIGltcG9ydEpTT04odCl7bGV0IHI9dG8oKTtyZXR1cm4gci5zZXRGb3JtYXQodC5mb3JtYXQpLHIuc2V0SW5kZW50KHQuaW5kZW50KSxyLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbikscn1leHBvcnRKU09OKCl7cmV0dXJue2NoaWxkcmVuOltdLGRpcmVjdGlvbjp0aGlzLmdldERpcmVjdGlvbigpLGZvcm1hdDp0aGlzLmdldEZvcm1hdFR5cGUoKSxpbmRlbnQ6dGhpcy5nZXRJbmRlbnQoKSx0eXBlOiJyb290Iix2ZXJzaW9uOjF9fWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiEwfX07ZnVuY3Rpb24gZ3IoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIc31mdW5jdGlvbiB1RShlLHQpe2lmKHQ9dC5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb24sZT1lLl9zZWxlY3Rpb24sZSE9PW51bGwpe2lmKGUuZGlydHl8fCFlLmlzKHQpKXJldHVybiEwfWVsc2UgaWYodCE9PW51bGwpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gd3koKXtyZXR1cm4gbmV3IGNkKG5ldyBNYXAoW1sicm9vdCIsbmV3IEhzXV0pKX1mdW5jdGlvbiBVVChlKXtsZXQgdD1lLmV4cG9ydEpTT04oKTt2YXIgcj1lLmNvbnN0cnVjdG9yO3QudHlwZSE9PXIuZ2V0VHlwZSgpJiZ6KDEzMCxyLm5hbWUpO2xldCBuPXQuY2hpbGRyZW47aWYoTShlKSlmb3IoQXJyYXkuaXNBcnJheShuKXx8eig1OSxyLm5hbWUpLGU9ZS5nZXRDaGlsZHJlbigpLHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IG89VVQoZVtyXSk7bi5wdXNoKG8pfXJldHVybiB0fXZhciBjZD1jbGFzcyBle2NvbnN0cnVjdG9yKHQscil7dGhpcy5fbm9kZU1hcD10LHRoaXMuX3NlbGVjdGlvbj1yfHxudWxsLHRoaXMuX3JlYWRPbmx5PXRoaXMuX2ZsdXNoU3luYz0hMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuX25vZGVNYXAuc2l6ZT09PTEmJnRoaXMuX3NlbGVjdGlvbj09PW51bGx9cmVhZCh0KXtyZXR1cm4gJEModGhpcyx0KX1jbG9uZSh0KXtyZXR1cm4gdD1uZXcgZSh0aGlzLl9ub2RlTWFwLHQ9PT12b2lkIDA/dGhpcy5fc2VsZWN0aW9uOnQpLHQuX3JlYWRPbmx5PSEwLHR9dG9KU09OKCl7cmV0dXJuICRDKHRoaXMsKCk9Pih7cm9vdDpVVCh0bygpKX0pKX19LFVzPWNsYXNzIGUgZXh0ZW5kcyB6b3tzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJwYXJhZ3JhcGgifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IGUodC5fX2tleSl9Y3JlYXRlRE9NKHQpe2xldCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtyZXR1cm4gdD1EdSh0LnRoZW1lLCJwYXJhZ3JhcGgiKSx0IT09dm9pZCAwJiZyLmNsYXNzTGlzdC5hZGQoLi4udCkscn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue3A6KCk9Pih7Y29udmVyc2lvbjpjRSxwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmdmQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgcj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1yLChyPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9cikscj10aGlzLmdldEluZGVudCgpLDA8ciYmKHQuc3R5bGUudGV4dEluZGVudD1cYCR7MjAqcn1weFxgKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgcj15bCgpO3JldHVybiByLnNldEZvcm1hdCh0LmZvcm1hdCksci5zZXRJbmRlbnQodC5pbmRlbnQpLHIuc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxyfWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InBhcmFncmFwaCIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcih0LHIpe3Q9eWwoKTtsZXQgbj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihuKSx0aGlzLmluc2VydEFmdGVyKHQsciksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD10aGlzLmdldENoaWxkcmVuKCk7aWYodC5sZW5ndGg9PT0wfHxGKHRbMF0pJiZ0WzBdLmdldFRleHRDb250ZW50KCkudHJpbSgpPT09IiIpe2lmKHRoaXMuZ2V0TmV4dFNpYmxpbmcoKSE9PW51bGwpcmV0dXJuIHRoaXMuc2VsZWN0TmV4dCgpLHRoaXMucmVtb3ZlKCksITA7aWYodGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSE9PW51bGwpcmV0dXJuIHRoaXMuc2VsZWN0UHJldmlvdXMoKSx0aGlzLnJlbW92ZSgpLCEwfXJldHVybiExfX07ZnVuY3Rpb24gY0UoZSl7bGV0IHQ9eWwoKTtyZXR1cm4gZS5zdHlsZSYmKHQuc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSxlPXBhcnNlSW50KGUuc3R5bGUudGV4dEluZGVudCwxMCkvMjAsMDxlJiZ0LnNldEluZGVudChlKSkse25vZGU6dH19ZnVuY3Rpb24geWwoKXtyZXR1cm4gWXUobmV3IFVzKX1mdW5jdGlvbiBWVChlLHQscixuKXtsZXQgbz1lLl9rZXlUb0RPTU1hcDtvLmNsZWFyKCksZS5fZWRpdG9yU3RhdGU9d3koKSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9bixlLl9jb21wb3NpdGlvbktleT1udWxsLGUuX2RpcnR5VHlwZT0wLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksZS5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsZS5fdXBkYXRlVGFncz1uZXcgU2V0LGUuX3VwZGF0ZXM9W10sZS5fYmxvY2tDdXJzb3JFbGVtZW50PW51bGwsbj1lLl9vYnNlcnZlcixuIT09bnVsbCYmKG4uZGlzY29ubmVjdCgpLGUuX29ic2VydmVyPW51bGwpLHQhPT1udWxsJiYodC50ZXh0Q29udGVudD0iIiksciE9PW51bGwmJihyLnRleHRDb250ZW50PSIiLG8uc2V0KCJyb290IixyKSl9ZnVuY3Rpb24gcEUoZSl7bGV0IHQ9bmV3IE1hcCxyPW5ldyBTZXQ7cmV0dXJuIGUuZm9yRWFjaChuPT57aWYobj1uLmtsYXNzLmltcG9ydERPTSE9bnVsbD9uLmtsYXNzLmltcG9ydERPTS5iaW5kKG4ua2xhc3MpOm51bGwsbiE9bnVsbCYmIXIuaGFzKG4pKXtyLmFkZChuKTt2YXIgbz1uKCk7byE9PW51bGwmJk9iamVjdC5rZXlzKG8pLmZvckVhY2goaT0+e2xldCBsPXQuZ2V0KGkpO2w9PT12b2lkIDAmJihsPVtdLHQuc2V0KGksbCkpLGwucHVzaChvW2ldKX0pfX0pLHR9dmFyIGV5PWNsYXNze2NvbnN0cnVjdG9yKHQscixuLG8saSxsLHMpe3RoaXMuX3BhcmVudEVkaXRvcj1yLHRoaXMuX3Jvb3RFbGVtZW50PW51bGwsdGhpcy5fZWRpdG9yU3RhdGU9dCx0aGlzLl9jb21wb3NpdGlvbktleT10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCx0aGlzLl9kZWZlcnJlZD1bXSx0aGlzLl9rZXlUb0RPTU1hcD1uZXcgTWFwLHRoaXMuX3VwZGF0ZXM9W10sdGhpcy5fdXBkYXRpbmc9ITEsdGhpcy5fbGlzdGVuZXJzPXtkZWNvcmF0b3I6bmV3IFNldCxlZGl0YWJsZTpuZXcgU2V0LG11dGF0aW9uOm5ldyBNYXAscm9vdDpuZXcgU2V0LHRleHRjb250ZW50Om5ldyBTZXQsdXBkYXRlOm5ldyBTZXR9LHRoaXMuX2NvbW1hbmRzPW5ldyBNYXAsdGhpcy5fY29uZmlnPW8sdGhpcy5fbm9kZXM9bix0aGlzLl9kZWNvcmF0b3JzPXt9LHRoaXMuX3BlbmRpbmdEZWNvcmF0b3JzPW51bGwsdGhpcy5fZGlydHlUeXBlPTAsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9bmV3IFNldCx0aGlzLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LHRoaXMuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCx0aGlzLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCx0aGlzLl91cGRhdGVUYWdzPW5ldyBTZXQsdGhpcy5fb2JzZXJ2ZXI9bnVsbCx0aGlzLl9rZXk9dlQoKSx0aGlzLl9vbkVycm9yPWksdGhpcy5faHRtbENvbnZlcnNpb25zPWwsdGhpcy5fZWRpdGFibGU9cyx0aGlzLl9oZWFkbGVzcz1yIT09bnVsbCYmci5faGVhZGxlc3MsdGhpcy5fYmxvY2tDdXJzb3JFbGVtZW50PXRoaXMuX3dpbmRvdz1udWxsfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2l0aW9uS2V5IT1udWxsfXJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIodCl7bGV0IHI9dGhpcy5fbGlzdGVuZXJzLnVwZGF0ZTtyZXR1cm4gci5hZGQodCksKCk9PntyLmRlbGV0ZSh0KX19cmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKHQpe2xldCByPXRoaXMuX2xpc3RlbmVycy5lZGl0YWJsZTtyZXR1cm4gci5hZGQodCksKCk9PntyLmRlbGV0ZSh0KX19cmVnaXN0ZXJEZWNvcmF0b3JMaXN0ZW5lcih0KXtsZXQgcj10aGlzLl9saXN0ZW5lcnMuZGVjb3JhdG9yO3JldHVybiByLmFkZCh0KSwoKT0+e3IuZGVsZXRlKHQpfX1yZWdpc3RlclRleHRDb250ZW50TGlzdGVuZXIodCl7bGV0IHI9dGhpcy5fbGlzdGVuZXJzLnRleHRjb250ZW50O3JldHVybiByLmFkZCh0KSwoKT0+e3IuZGVsZXRlKHQpfX1yZWdpc3RlclJvb3RMaXN0ZW5lcih0KXtsZXQgcj10aGlzLl9saXN0ZW5lcnMucm9vdDtyZXR1cm4gdCh0aGlzLl9yb290RWxlbWVudCxudWxsKSxyLmFkZCh0KSwoKT0+e3QobnVsbCx0aGlzLl9yb290RWxlbWVudCksci5kZWxldGUodCl9fXJlZ2lzdGVyQ29tbWFuZCh0LHIsbil7bj09PXZvaWQgMCYmeigzNSk7bGV0IG89dGhpcy5fY29tbWFuZHM7by5oYXModCl8fG8uc2V0KHQsW25ldyBTZXQsbmV3IFNldCxuZXcgU2V0LG5ldyBTZXQsbmV3IFNldF0pO2xldCBpPW8uZ2V0KHQpO2k9PT12b2lkIDAmJnooMzYsU3RyaW5nKHQpKTtsZXQgbD1pW25dO3JldHVybiBsLmFkZChyKSwoKT0+e2wuZGVsZXRlKHIpLGkuZXZlcnkocz0+cy5zaXplPT09MCkmJm8uZGVsZXRlKHQpfX1yZWdpc3Rlck11dGF0aW9uTGlzdGVuZXIodCxyKXt0aGlzLl9ub2Rlcy5nZXQodC5nZXRUeXBlKCkpPT09dm9pZCAwJiZ6KDM3LHQubmFtZSk7bGV0IG49dGhpcy5fbGlzdGVuZXJzLm11dGF0aW9uO3JldHVybiBuLnNldChyLHQpLCgpPT57bi5kZWxldGUocil9fXJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3ModCxyKXt2YXIgbj10LmdldFR5cGUoKTtyZXR1cm4gbj10aGlzLl9ub2Rlcy5nZXQobiksbj09PXZvaWQgMCYmeigzNyx0Lm5hbWUpLG4udHJhbnNmb3Jtcy5hZGQociksbn1yZWdpc3Rlck5vZGVUcmFuc2Zvcm0odCxyKXt2YXIgbj10aGlzLnJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3ModCxyKTtsZXQgbz1bbl07cmV0dXJuIG49bi5yZXBsYWNlV2l0aEtsYXNzLG4hPW51bGwmJihuPXRoaXMucmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyhuLHIpLG8ucHVzaChuKSksajUodGhpcyx0LmdldFR5cGUoKSksKCk9PntvLmZvckVhY2goaT0+aS50cmFuc2Zvcm1zLmRlbGV0ZShyKSl9fWhhc05vZGUodCl7cmV0dXJuIHRoaXMuX25vZGVzLmhhcyh0LmdldFR5cGUoKSl9aGFzTm9kZXModCl7cmV0dXJuIHQuZXZlcnkodGhpcy5oYXNOb2RlLmJpbmQodGhpcykpfWRpc3BhdGNoQ29tbWFuZCh0LHIpe3JldHVybiBCKHRoaXMsdCxyKX1nZXREZWNvcmF0b3JzKCl7cmV0dXJuIHRoaXMuX2RlY29yYXRvcnN9Z2V0Um9vdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnR9Z2V0S2V5KCl7cmV0dXJuIHRoaXMuX2tleX1zZXRSb290RWxlbWVudCh0KXtsZXQgcj10aGlzLl9yb290RWxlbWVudDtpZih0IT09cil7bGV0IGw9RHUodGhpcy5fY29uZmlnLnRoZW1lLCJyb290Iik7dmFyIG49dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlfHx0aGlzLl9lZGl0b3JTdGF0ZTtpZih0aGlzLl9yb290RWxlbWVudD10LFZUKHRoaXMscix0LG4pLHIhPT1udWxsKXtpZighdGhpcy5fY29uZmlnLmRpc2FibGVFdmVudHMpe091IT09MCYmKE91LS0sT3U9PT0wJiZyLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIix6VCkpO3ZhciBvPXIuX19sZXhpY2FsRWRpdG9yO2lmKG8hPW51bGwpe2lmKG8uX3BhcmVudEVkaXRvciE9PW51bGwpe3ZhciBpPWZ5KG8pO2k9aVtpLmxlbmd0aC0xXS5fa2V5LEZzLmdldChpKT09PW8mJkZzLmRlbGV0ZShpKX1lbHNlIEZzLmRlbGV0ZShvLl9rZXkpO3IuX19sZXhpY2FsRWRpdG9yPW51bGx9Zm9yKG89T1QociksaT0wO2k8by5sZW5ndGg7aSsrKW9baV0oKTtyLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz1bXX1sIT1udWxsJiZyLmNsYXNzTGlzdC5yZW1vdmUoLi4ubCl9dCE9PW51bGw/KG49KG49dC5vd25lckRvY3VtZW50KSYmbi5kZWZhdWx0Vmlld3x8bnVsbCxvPXQuc3R5bGUsby51c2VyU2VsZWN0PSJ0ZXh0IixvLndoaXRlU3BhY2U9InByZS13cmFwIixvLndvcmRCcmVhaz0iYnJlYWstd29yZCIsdC5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC1lZGl0b3IiLCJ0cnVlIiksdGhpcy5fd2luZG93PW4sdGhpcy5fZGlydHlUeXBlPTIsY1QodGhpcyksdGhpcy5fdXBkYXRlVGFncy5hZGQoImhpc3RvcnktbWVyZ2UiKSxmbCh0aGlzKSx0aGlzLl9jb25maWcuZGlzYWJsZUV2ZW50c3x8WjUodCx0aGlzKSxsIT1udWxsJiZ0LmNsYXNzTGlzdC5hZGQoLi4ubCkpOih0aGlzLl9lZGl0b3JTdGF0ZT1uLHRoaXMuX3dpbmRvdz10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCksQnUoInJvb3QiLHRoaXMsITEsdCxyKX19Z2V0RWxlbWVudEJ5S2V5KHQpe3JldHVybiB0aGlzLl9rZXlUb0RPTU1hcC5nZXQodCl8fG51bGx9Z2V0RWRpdG9yU3RhdGUoKXtyZXR1cm4gdGhpcy5fZWRpdG9yU3RhdGV9c2V0RWRpdG9yU3RhdGUodCxyKXt0LmlzRW1wdHkoKSYmeigzOCksdVQodGhpcyk7bGV0IG49dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlLG89dGhpcy5fdXBkYXRlVGFncztyPXIhPT12b2lkIDA/ci50YWc6bnVsbCxuPT09bnVsbHx8bi5pc0VtcHR5KCl8fChyIT1udWxsJiZvLmFkZChyKSxmbCh0aGlzKSksdGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPXQsdGhpcy5fZGlydHlUeXBlPTIsdGhpcy5fZGlydHlFbGVtZW50cy5zZXQoInJvb3QiLCExKSx0aGlzLl9jb21wb3NpdGlvbktleT1udWxsLHIhPW51bGwmJm8uYWRkKHIpLGZsKHRoaXMpfXBhcnNlRWRpdG9yU3RhdGUodCxyKXt0PXR5cGVvZiB0PT0ic3RyaW5nIj9KU09OLnBhcnNlKHQpOnQ7bGV0IG49d3koKSxvPUx0LGk9UHIsbD1BdCxzPXRoaXMuX2RpcnR5RWxlbWVudHMsYT10aGlzLl9kaXJ0eUxlYXZlcyx1PXRoaXMuX2Nsb25lTm90TmVlZGVkLHA9dGhpcy5fZGlydHlUeXBlO3RoaXMuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCx0aGlzLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LHRoaXMuX2Nsb25lTm90TmVlZGVkPW5ldyBTZXQsdGhpcy5fZGlydHlUeXBlPTAsTHQ9bixQcj0hMSxBdD10aGlzO3RyeXt4eSh0LnJvb3QsdGhpcy5fbm9kZXMpLHImJnIoKSxuLl9yZWFkT25seT0hMH1jYXRjaChjKXtjIGluc3RhbmNlb2YgRXJyb3ImJnRoaXMuX29uRXJyb3IoYyl9ZmluYWxseXt0aGlzLl9kaXJ0eUVsZW1lbnRzPXMsdGhpcy5fZGlydHlMZWF2ZXM9YSx0aGlzLl9jbG9uZU5vdE5lZWRlZD11LHRoaXMuX2RpcnR5VHlwZT1wLEx0PW8sUHI9aSxBdD1sfXJldHVybiBufXVwZGF0ZSh0LHIpe1VyKHRoaXMsdCxyKX1mb2N1cyh0LHI9e30pe2xldCBuPXRoaXMuX3Jvb3RFbGVtZW50O24hPT1udWxsJiYobi5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwib2ZmIiksVXIodGhpcywoKT0+e2xldCBvPUFlKCksaT10bygpO28hPT1udWxsP28uZGlydHk9ITA6aS5nZXRDaGlsZHJlblNpemUoKSE9PTAmJihyLmRlZmF1bHRTZWxlY3Rpb249PT0icm9vdFN0YXJ0Ij9pLnNlbGVjdFN0YXJ0KCk6aS5zZWxlY3RFbmQoKSl9LHtvblVwZGF0ZTooKT0+e24ucmVtb3ZlQXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIpLHQmJnQoKX0sdGFnOiJmb2N1cyJ9KSx0aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9PT1udWxsJiZuLnJlbW92ZUF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiKSl9Ymx1cigpe3ZhciB0PXRoaXMuX3Jvb3RFbGVtZW50O3QhPT1udWxsJiZ0LmJsdXIoKSx0PXJvKHRoaXMuX3dpbmRvdyksdCE9PW51bGwmJnQucmVtb3ZlQWxsUmFuZ2VzKCl9aXNFZGl0YWJsZSgpe3JldHVybiB0aGlzLl9lZGl0YWJsZX1zZXRFZGl0YWJsZSh0KXt0aGlzLl9lZGl0YWJsZSE9PXQmJih0aGlzLl9lZGl0YWJsZT10LEJ1KCJlZGl0YWJsZSIsdGhpcywhMCx0KSl9dG9KU09OKCl7cmV0dXJue2VkaXRvclN0YXRlOnRoaXMuX2VkaXRvclN0YXRlLnRvSlNPTigpfX19LEd1PWNsYXNzIGV4dGVuZHMgem97Y29uc3RydWN0b3IodCxyKXtzdXBlcihyKSx0aGlzLl9fY29sU3Bhbj10LHRoaXMuX19yb3dTcGFuPTF9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY29sU3Bhbjp0aGlzLl9fY29sU3Bhbixyb3dTcGFuOnRoaXMuX19yb3dTcGFufX1nZXRDb2xTcGFuKCl7cmV0dXJuIHRoaXMuX19jb2xTcGFufXNldENvbFNwYW4odCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2NvbFNwYW49dCx0aGlzfWdldFJvd1NwYW4oKXtyZXR1cm4gdGhpcy5fX3Jvd1NwYW59c2V0Um93U3Bhbih0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fcm93U3Bhbj10LHRoaXN9fTtmdW5jdGlvbiB4bihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEd1fXZhciBwZD1jbGFzcyBleHRlbmRzIHpve307ZnVuY3Rpb24gU3koZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBwZH12YXIgZmQ9Y2xhc3MgZXh0ZW5kcyB6b3t9O2Z1bmN0aW9uIHF1KGUpe3JldHVybiBlIGluc3RhbmNlb2YgZmR9RS4kYWRkVXBkYXRlVGFnPWZ1bmN0aW9uKGUpe2hyKCksamUoKS5fdXBkYXRlVGFncy5hZGQoZSl9O0UuJGFwcGx5Tm9kZVJlcGxhY2VtZW50PVl1O0UuJGNvcHlOb2RlPVNUO0UuJGNyZWF0ZUxpbmVCcmVha05vZGU9anM7RS4kY3JlYXRlTm9kZVNlbGVjdGlvbj1KMDtFLiRjcmVhdGVQYXJhZ3JhcGhOb2RlPXlsO0UuJGNyZWF0ZVJhbmdlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7bGV0IGU9bmV3IHduKCJyb290IiwwLCJlbGVtZW50IiksdD1uZXcgd24oInJvb3QiLDAsImVsZW1lbnQiKTtyZXR1cm4gbmV3IGdsKGUsdCwwLCIiKX07RS4kY3JlYXRlVGFiTm9kZT13ZDtFLiRjcmVhdGVUZXh0Tm9kZT1NdDtFLiRnZXRBZGphY2VudE5vZGU9RjA7RS4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZT1LdTtFLiRnZXROZWFyZXN0Um9vdE9yU2hhZG93Um9vdD13VDtFLiRnZXROb2RlQnlLZXk9SXQ7RS4kZ2V0UHJldmlvdXNTZWxlY3Rpb249UnM7RS4kZ2V0Um9vdD10bztFLiRnZXRTZWxlY3Rpb249QWU7RS4kZ2V0VGV4dENvbnRlbnQ9ZnVuY3Rpb24oKXtsZXQgZT1BZSgpO3JldHVybiBlPT09bnVsbD8iIjplLmdldFRleHRDb250ZW50KCl9O0UuJGhhc0FuY2VzdG9yPXJkO0UuJGhhc1VwZGF0ZVRhZz1mdW5jdGlvbihlKXtyZXR1cm4gamUoKS5fdXBkYXRlVGFncy5oYXMoZSl9O0UuJGluc2VydE5vZGVzPWZ1bmN0aW9uKGUsdCl7bGV0IHI9QWUoKXx8UnMoKTtyZXR1cm4gcj09PW51bGwmJihyPXRvKCkuc2VsZWN0RW5kKCkpLHIuaW5zZXJ0Tm9kZXMoZSx0KX07RS4kaXNCbG9ja0VsZW1lbnROb2RlPVowO0UuJGlzRGVjb3JhdG9yTm9kZT1MZTtFLiRpc0VsZW1lbnROb2RlPU07RS4kaXNJbmxpbmVFbGVtZW50T3JEZWNvcmF0b3JOb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBNKGUpJiZlLmlzSW5saW5lKCl8fExlKGUpJiZlLmlzSW5saW5lKCl9O0UuJGlzTGVhZk5vZGU9ZFQ7RS4kaXNMaW5lQnJlYWtOb2RlPVZ1O0UuJGlzTm9kZVNlbGVjdGlvbj1WcztFLiRpc1BhcmFncmFwaE5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVc307RS4kaXNSYW5nZVNlbGVjdGlvbj1RO0UuJGlzUm9vdE5vZGU9Z3I7RS4kaXNSb290T3JTaGFkb3dSb290PU9uO0UuJGlzVGFiTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFdzfTtFLiRpc1RleHROb2RlPUY7RS4kbm9kZXNPZlR5cGU9ZnVuY3Rpb24oZSl7dmFyIHQ9bm8oKTtsZXQgcj10Ll9yZWFkT25seSxuPWUuZ2V0VHlwZSgpO3Q9dC5fbm9kZU1hcDtsZXQgbz1bXTtmb3IobGV0WyxpXW9mIHQpaSBpbnN0YW5jZW9mIGUmJmkuX190eXBlPT09biYmKHJ8fGkuaXNBdHRhY2hlZCgpKSYmby5wdXNoKGkpO3JldHVybiBvfTtFLiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTD11eTtFLiRwYXJzZVNlcmlhbGl6ZWROb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB4eShlLGplKCkuX25vZGVzKX07RS4kc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIGU9dG8oKTtlPWUuc2VsZWN0KDAsZS5nZXRDaGlsZHJlblNpemUoKSksZW8odXkoZSkpfTtFLiRzZXRDb21wb3NpdGlvbktleT1XdDtFLiRzZXRTZWxlY3Rpb249ZW87RS4kc3BsaXROb2RlPUNUO0UuQkxVUl9DT01NQU5EPWxUO0UuQ0FOX1JFRE9fQ09NTUFORD17fTtFLkNBTl9VTkRPX0NPTU1BTkQ9e307RS5DTEVBUl9FRElUT1JfQ09NTUFORD17fTtFLkNMRUFSX0hJU1RPUllfQ09NTUFORD17fTtFLkNMSUNLX0NPTU1BTkQ9SEM7RS5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMPTQ7RS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUj0wO0UuQ09NTUFORF9QUklPUklUWV9ISUdIPTM7RS5DT01NQU5EX1BSSU9SSVRZX0xPVz0xO0UuQ09NTUFORF9QUklPUklUWV9OT1JNQUw9MjtFLkNPTlRST0xMRURfVEVYVF9JTlNFUlRJT05fQ09NTUFORD1CcztFLkNPUFlfQ09NTUFORD1veTtFLkNVVF9DT01NQU5EPWl5O0UuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5EPUZ1O0UuREVMRVRFX0xJTkVfQ09NTUFORD1qdTtFLkRFTEVURV9XT1JEX0NPTU1BTkQ9JHU7RS5ERVBSRUNBVEVEXyRjb21wdXRlR3JpZE1hcD1qVDtFLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgd24oInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyB3bigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgbGQoInJvb3QiLGUsdCl9O0UuREVQUkVDQVRFRF8kZ2V0R3JpZENlbGxOb2RlUmVjdD1YMDtFLkRFUFJFQ0FURURfJGdldE5vZGVUcmlwbGV0PVdUO0UuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGU9eG47RS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlPVN5O0UuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZT1xdTtFLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbj15eTtFLkRFUFJFQ0FURURfR3JpZENlbGxOb2RlPUd1O0UuREVQUkVDQVRFRF9HcmlkTm9kZT1wZDtFLkRFUFJFQ0FURURfR3JpZFJvd05vZGU9ZmQ7RS5EUkFHRU5EX0NPTU1BTkQ9b1Q7RS5EUkFHT1ZFUl9DT01NQU5EPW5UO0UuRFJBR1NUQVJUX0NPTU1BTkQ9clQ7RS5EUk9QX0NPTU1BTkQ9dFQ7RS5EZWNvcmF0b3JOb2RlPXVkO0UuRWxlbWVudE5vZGU9em87RS5GT0NVU19DT01NQU5EPWlUO0UuRk9STUFUX0VMRU1FTlRfQ09NTUFORD17fTtFLkZPUk1BVF9URVhUX0NPTU1BTkQ9Tmk7RS5JTkRFTlRfQ09OVEVOVF9DT01NQU5EPXt9O0UuSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORD1BdTtFLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORD1BMDtFLklOU0VSVF9UQUJfQ09NTUFORD17fTtFLktFWV9BUlJPV19ET1dOX0NPTU1BTkQ9S0M7RS5LRVlfQVJST1dfTEVGVF9DT01NQU5EPUdDO0UuS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQ9VkM7RS5LRVlfQVJST1dfVVBfQ09NTUFORD1RQztFLktFWV9CQUNLU1BBQ0VfQ09NTUFORD1YQztFLktFWV9ERUxFVEVfQ09NTUFORD1KQztFLktFWV9ET1dOX0NPTU1BTkQ9VUM7RS5LRVlfRU5URVJfQ09NTUFORD1ZZjtFLktFWV9FU0NBUEVfQ09NTUFORD1aQztFLktFWV9NT0RJRklFUl9DT01NQU5EPXNUO0UuS0VZX1NQQUNFX0NPTU1BTkQ9WUM7RS5LRVlfVEFCX0NPTU1BTkQ9ZVQ7RS5MaW5lQnJlYWtOb2RlPSRzO0UuTU9WRV9UT19FTkQ9UkM7RS5NT1ZFX1RPX1NUQVJUPXFDO0UuT1VUREVOVF9DT05URU5UX0NPTU1BTkQ9e307RS5QQVNURV9DT01NQU5EPXR5O0UuUGFyYWdyYXBoTm9kZT1VcztFLlJFRE9fQ09NTUFORD1ueTtFLlJFTU9WRV9URVhUX0NPTU1BTkQ9RDA7RS5Sb290Tm9kZT1IcztFLlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORD1kZDtFLlNFTEVDVF9BTExfQ09NTUFORD1PMDtFLlRhYk5vZGU9V3M7RS5UZXh0Tm9kZT1obDtFLlVORE9fQ09NTUFORD1yeTtFLmNyZWF0ZUNvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm57fX07RS5jcmVhdGVFZGl0b3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e30scj1BdCxuPXQudGhlbWV8fHt9O2xldCBvPWU9PT12b2lkIDA/cjp0LnBhcmVudEVkaXRvcnx8bnVsbCxpPXQuZGlzYWJsZUV2ZW50c3x8ITEsbD13eSgpLHM9dC5uYW1lc3BhY2V8fChvIT09bnVsbD9vLl9jb25maWcubmFtZXNwYWNlOnZUKCkpLGE9dC5lZGl0b3JTdGF0ZSx1PVtIcyxobCwkcyxXcyxVcywuLi50Lm5vZGVzfHxbXV0scD10Lm9uRXJyb3I7aWYodD10LmVkaXRhYmxlIT09dm9pZCAwP3QuZWRpdGFibGU6ITAsZT09PXZvaWQgMCYmciE9PW51bGwpZT1yLl9ub2RlcztlbHNlIGZvcihlPW5ldyBNYXAscj0wO3I8dS5sZW5ndGg7cisrKXtsZXQgZj11W3JdLGQ9bnVsbDt2YXIgYz1udWxsO3R5cGVvZiBmIT0iZnVuY3Rpb24iJiYoYz1mLGY9Yy5yZXBsYWNlLGQ9Yy53aXRoLGM9Yy53aXRoS2xhc3M/Yy53aXRoS2xhc3M6bnVsbCk7bGV0IG09Zi5nZXRUeXBlKCksaD1mLnRyYW5zZm9ybSgpLFM9bmV3IFNldDtoIT09bnVsbCYmUy5hZGQoaCksZS5zZXQobSx7a2xhc3M6ZixyZXBsYWNlOmQscmVwbGFjZVdpdGhLbGFzczpjLHRyYW5zZm9ybXM6U30pfXJldHVybiBuPW5ldyBleShsLG8sZSx7ZGlzYWJsZUV2ZW50czppLG5hbWVzcGFjZTpzLHRoZW1lOm59LHB8fGNvbnNvbGUuZXJyb3IscEUoZSksdCksYSE9PXZvaWQgMCYmKG4uX3BlbmRpbmdFZGl0b3JTdGF0ZT1hLG4uX2RpcnR5VHlwZT0yKSxufTtFLmdldE5lYXJlc3RFZGl0b3JGcm9tRE9NTm9kZT1weTtFLmlzSFRNTEFuY2hvckVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHZkKGUpJiZlLnRhZ05hbWU9PT0iQSJ9O0UuaXNIVE1MRWxlbWVudD12ZDtFLmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0PWN5O0UuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3I9UXV9KTt2YXIgVnI9VigoanJlLEdUKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgZkU9UlQoKTtHVC5leHBvcnRzPWZFfSk7dmFyIFlUPVYoS1Q9PnsidXNlIHN0cmljdCI7dmFyIHFUPUFvKCksWHU9VnIoKSxDZD1UKCksUVQ9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLGRFPVFUP0NkLnVzZUxheW91dEVmZmVjdDpDZC51c2VFZmZlY3QsU2Q9e3RhZzoiaGlzdG9yeS1tZXJnZSJ9O2Z1bmN0aW9uIG1FKGUsdCl7aWYodCE9PW51bGwpe2lmKHQ9PT12b2lkIDApZS51cGRhdGUoKCk9Pnt2YXIgcj1YdS4kZ2V0Um9vdCgpO2lmKHIuaXNFbXB0eSgpKXtsZXQgbj1YdS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO3IuYXBwZW5kKG4pLHI9UVQ/ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDpudWxsLChYdS4kZ2V0U2VsZWN0aW9uKCkhPT1udWxsfHxyIT09bnVsbCYmcj09PWUuZ2V0Um9vdEVsZW1lbnQoKSkmJm4uc2VsZWN0KCl9fSxTZCk7ZWxzZSBpZih0IT09bnVsbClzd2l0Y2godHlwZW9mIHQpe2Nhc2Uic3RyaW5nIjpsZXQgcj1lLnBhcnNlRWRpdG9yU3RhdGUodCk7ZS5zZXRFZGl0b3JTdGF0ZShyLFNkKTticmVhaztjYXNlIm9iamVjdCI6ZS5zZXRFZGl0b3JTdGF0ZSh0LFNkKTticmVhaztjYXNlImZ1bmN0aW9uIjplLnVwZGF0ZSgoKT0+e1h1LiRnZXRSb290KCkuaXNFbXB0eSgpJiZ0KGUpfSxTZCl9fX1LVC5MZXhpY2FsQ29tcG9zZXI9ZnVuY3Rpb24oe2luaXRpYWxDb25maWc6ZSxjaGlsZHJlbjp0fSl7bGV0IHI9Q2QudXNlTWVtbygoKT0+e2xldHt0aGVtZTpuLG5hbWVzcGFjZTpvLGVkaXRvcl9fREVQUkVDQVRFRDppLG5vZGVzOmwsb25FcnJvcjpzLGVkaXRvclN0YXRlOmF9PWUsdT1xVC5jcmVhdGVMZXhpY2FsQ29tcG9zZXJDb250ZXh0KG51bGwsbikscD1pfHxudWxsO2lmKHA9PT1udWxsKXtsZXQgYz1YdS5jcmVhdGVFZGl0b3Ioe2VkaXRhYmxlOmUuZWRpdGFibGUsbmFtZXNwYWNlOm8sbm9kZXM6bCxvbkVycm9yOmY9PnMoZixjKSx0aGVtZTpufSk7bUUoYyxhKSxwPWN9cmV0dXJuW3AsdV19LFtdKTtyZXR1cm4gZEUoKCk9PntsZXQgbj1lLmVkaXRhYmxlLFtvXT1yO28uc2V0RWRpdGFibGUobiE9PXZvaWQgMD9uOiEwKX0sW10pLENkLmNyZWF0ZUVsZW1lbnQocVQuTGV4aWNhbENvbXBvc2VyQ29udGV4dC5Qcm92aWRlcix7dmFsdWU6cn0sdCl9fSk7dmFyIFpUPVYoKEhyZSxYVCk9PnsidXNlIHN0cmljdCI7dmFyIGhFPVlUKCk7WFQuZXhwb3J0cz1oRX0pO3ZhciBlXz1WKChVcmUsSlQpPT57InVzZSBzdHJpY3QiO3ZhciBnRT1BbygpLFp1PVQoKSx5RT10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSI/WnUudXNlTGF5b3V0RWZmZWN0Olp1LnVzZUVmZmVjdDtmdW5jdGlvbiB2RShlKXtsZXRbdF09Z0UudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpLHI9WnUudXNlTWVtbygoKT0+ZSh0KSxbdCxlXSksbj1adS51c2VSZWYoci5pbml0aWFsVmFsdWVGbigpKSxbbyxpXT1adS51c2VTdGF0ZShuLmN1cnJlbnQpO3JldHVybiB5RSgoKT0+e2xldHtpbml0aWFsVmFsdWVGbjpsLHN1YnNjcmliZTpzfT1yLGE9bCgpO3JldHVybiBuLmN1cnJlbnQhPT1hJiYobi5jdXJyZW50PWEsaShhKSkscyh1PT57bi5jdXJyZW50PXUsaSh1KX0pfSxbcixlXSksb31mdW5jdGlvbiB4RShlKXtyZXR1cm57aW5pdGlhbFZhbHVlRm46KCk9PmUuaXNFZGl0YWJsZSgpLHN1YnNjcmliZTp0PT5lLnJlZ2lzdGVyRWRpdGFibGVMaXN0ZW5lcih0KX19SlQuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiB2RSh4RSl9fSk7dmFyIHJfPVYoKFZyZSx0Xyk9PnsidXNlIHN0cmljdCI7dmFyIHdFPWVfKCk7dF8uZXhwb3J0cz13RX0pO3ZhciBpXz1WKElpPT57InVzZSBzdHJpY3QiO3ZhciB5cj1WcigpO2Z1bmN0aW9uIEN5KGUsdD0hMCl7cmV0dXJuIGU/ITE6KGU9bl8oKSx0JiYoZT1lLnRyaW0oKSksZT09PSIiKX1mdW5jdGlvbiBuXygpe3JldHVybiB5ci4kZ2V0Um9vdCgpLmdldFRleHRDb250ZW50KCl9ZnVuY3Rpb24gb18oZSl7aWYoIUN5KGUsITEpKXJldHVybiExO2U9eXIuJGdldFJvb3QoKS5nZXRDaGlsZHJlbigpO2xldCB0PWUubGVuZ3RoO2lmKDE8dClyZXR1cm4hMTtmb3IobGV0IG49MDtuPHQ7bisrKXt2YXIgcj1lW25dO2lmKHlyLiRpc0RlY29yYXRvck5vZGUocikpcmV0dXJuITE7aWYoeXIuJGlzRWxlbWVudE5vZGUocikpe2lmKCF5ci4kaXNQYXJhZ3JhcGhOb2RlKHIpfHxyLl9faW5kZW50IT09MClyZXR1cm4hMTtyPXIuZ2V0Q2hpbGRyZW4oKTtsZXQgbz1yLmxlbmd0aDtmb3IobGV0IGk9MDtpPG87aSsrKWlmKCF5ci4kaXNUZXh0Tm9kZShyW25dKSlyZXR1cm4hMX19cmV0dXJuITB9SWkuJGNhblNob3dQbGFjZWhvbGRlcj1vXztJaS4kY2FuU2hvd1BsYWNlaG9sZGVyQ3Vycnk9ZnVuY3Rpb24oZSl7cmV0dXJuKCk9Pm9fKGUpfTtJaS4kZmluZFRleHRJbnRlcnNlY3Rpb25Gcm9tQ2hhcmFjdGVycz1mdW5jdGlvbihlLHQpe3ZhciByPWUuZ2V0Rmlyc3RDaGlsZCgpO2U9MDtlOmZvcig7ciE9PW51bGw7KXtpZih5ci4kaXNFbGVtZW50Tm9kZShyKSl7dmFyIG49ci5nZXRGaXJzdENoaWxkKCk7aWYobiE9PW51bGwpe3I9bjtjb250aW51ZX19ZWxzZSBpZih5ci4kaXNUZXh0Tm9kZShyKSl7aWYobj1yLmdldFRleHRDb250ZW50U2l6ZSgpLGUrbj50KXJldHVybntub2RlOnIsb2Zmc2V0OnQtZX07ZSs9bn1pZihuPXIuZ2V0TmV4dFNpYmxpbmcoKSxuIT09bnVsbClyPW47ZWxzZXtmb3Iocj1yLmdldFBhcmVudCgpO3IhPT1udWxsOyl7aWYobj1yLmdldE5leHRTaWJsaW5nKCksbiE9PW51bGwpe3I9bjtjb250aW51ZSBlfXI9ci5nZXRQYXJlbnQoKX1icmVha319cmV0dXJuIG51bGx9O0lpLiRpc1Jvb3RUZXh0Q29udGVudEVtcHR5PUN5O0lpLiRpc1Jvb3RUZXh0Q29udGVudEVtcHR5Q3Vycnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oKT0+Q3koZSx0KX07SWkuJHJvb3RUZXh0Q29udGVudD1uXztJaS5yZWdpc3RlckxleGljYWxUZXh0RW50aXR5PWZ1bmN0aW9uKGUsdCxyLG4pe2xldCBvPWw9PntsZXQgcz15ci4kY3JlYXRlVGV4dE5vZGUobC5nZXRUZXh0Q29udGVudCgpKTtzLnNldEZvcm1hdChsLmdldEZvcm1hdCgpKSxsLnJlcGxhY2Uocyl9LGk9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oeXIuVGV4dE5vZGUsbD0+e2lmKGwuaXNTaW1wbGVUZXh0KCkpe3ZhciBzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksYT1sLmdldFRleHRDb250ZW50KCksdT1sO2lmKHlyLiRpc1RleHROb2RlKHMpKXt2YXIgcD1zLmdldFRleHRDb250ZW50KCksYz10KHArYSk7aWYocyBpbnN0YW5jZW9mIHIpe2lmKGM9PT1udWxsfHxzLmdldExhdGVzdCgpLl9fbW9kZSE9PTApe28ocyk7cmV0dXJufWlmKGM9Yy5lbmQtcC5sZW5ndGgsMDxjKXt1PWEuc2xpY2UoMCxjKSx1PXArdSxzLnNlbGVjdCgpLHMuc2V0VGV4dENvbnRlbnQodSksYz09PWEubGVuZ3RoP2wucmVtb3ZlKCk6KHM9YS5zbGljZShjKSxsLnNldFRleHRDb250ZW50KHMpKTtyZXR1cm59fWVsc2UgaWYoYz09PW51bGx8fGMuc3RhcnQ8cC5sZW5ndGgpcmV0dXJufWZvcig7Oyl7aWYobD10KGEpLGE9Yz1sPT09bnVsbD8iIjphLnNsaWNlKGwuZW5kKSxjPT09IiIpe2lmKHA9dS5nZXROZXh0U2libGluZygpLHlyLiRpc1RleHROb2RlKHApKXtpZihjPXUuZ2V0VGV4dENvbnRlbnQoKStwLmdldFRleHRDb250ZW50KCksYz10KGMpLGM9PT1udWxsKXtwIGluc3RhbmNlb2Ygcj9vKHApOnAubWFya0RpcnR5KCk7YnJlYWt9ZWxzZSBpZihjLnN0YXJ0IT09MClicmVha319ZWxzZSBpZihwPXQoYykscCE9PW51bGwmJnAuc3RhcnQ9PT0wKWJyZWFrO2lmKGw9PT1udWxsKWJyZWFrO2lmKGwuc3RhcnQ9PT0wJiZ5ci4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSljb250aW51ZTtsZXQgZjtpZihsLnN0YXJ0PT09MD9bZix1XT11LnNwbGl0VGV4dChsLmVuZCk6WyxmLHVdPXUuc3BsaXRUZXh0KGwuc3RhcnQsbC5lbmQpLGw9bihmKSxsLnNldEZvcm1hdChmLmdldEZvcm1hdCgpKSxmLnJlcGxhY2UobCksdT09bnVsbClicmVha319fSk7cmV0dXJuIGU9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0ocixsPT57dmFyIHM9bC5nZXRUZXh0Q29udGVudCgpO2xldCBhPXQocyk7YT09PW51bGx8fGEuc3RhcnQhPT0wP28obCk6cy5sZW5ndGg+YS5lbmQ/bC5zcGxpdFRleHQoYS5lbmQpOihzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCkseXIuJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihvKHMpLG8obCkpLHM9bC5nZXROZXh0U2libGluZygpLHlyLiRpc1RleHROb2RlKHMpJiZzLmlzVGV4dEVudGl0eSgpJiYobyhzKSxsIGluc3RhbmNlb2YgciYmbyhsKSkpfSksW2ksZV19fSk7dmFyIHNfPVYoKEdyZSxsXyk9PnsidXNlIHN0cmljdCI7dmFyIFNFPWlfKCk7bF8uZXhwb3J0cz1TRX0pO3ZhciBtXz1WKER0PT57InVzZSBzdHJpY3QiO3ZhciBIPVZyKCksVGQ9bmV3IE1hcDtmdW5jdGlvbiBhXyhlKXtmb3IoO2UhPW51bGw7KXtpZihlLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUpcmV0dXJuIGU7ZT1lLmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdV8oZSl7bGV0IHQ9ZS5wYXJlbnROb2RlO2lmKHQ9PW51bGwpdGhyb3cgRXJyb3IoIlNob3VsZCBuZXZlciBoYXBwZW4iKTtyZXR1cm5bdCxBcnJheS5mcm9tKHQuY2hpbGROb2RlcykuaW5kZXhPZihlKV19ZnVuY3Rpb24gY18oZSl7bGV0IHQ9e307ZT1lLnNwbGl0KCI7Iik7Zm9yKGxldCByIG9mIGUpaWYociE9PSIiKXtsZXRbbixvXT1yLnNwbGl0KC86KFteXSspLyk7dFtuLnRyaW0oKV09by50cmltKCl9cmV0dXJuIHR9ZnVuY3Rpb24gX2QoZSl7bGV0IHQ9VGQuZ2V0KGUpO3JldHVybiB0PT09dm9pZCAwJiYodD1jXyhlKSxUZC5zZXQoZSx0KSksdH1mdW5jdGlvbiBDRShlKXtsZXQgdD0iIjtmb3IobGV0IHIgaW4gZSlyJiYodCs9XGAke3J9OiAke2Vbcl19O1xgKTtyZXR1cm4gdH1mdW5jdGlvbiBxcyhlLHQpe3ZhciByPV9kKCJnZXRTdHlsZSJpbiBlP2UuZ2V0U3R5bGUoKTplLnN0eWxlKTt0PU9iamVjdC5lbnRyaWVzKHQpLnJlZHVjZSgobixbbyxpXSk9PihpPT09bnVsbD9kZWxldGUgbltvXTpuW29dPWksbiksey4uLnJ9KSxyPUNFKHQpLGUuc2V0U3R5bGUociksVGQuc2V0KHIsdCl9ZnVuY3Rpb24gcF8oZSx0KXt2YXIgcj1lLmdldE5vZGVzKCksbj1yLmxlbmd0aDtpZihILkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihlKSl7Zm9yKHZhciBvPUguJGNyZWF0ZVJhbmdlU2VsZWN0aW9uKCksaT1vLmFuY2hvcixsPW8uZm9jdXMscz0wO3M8bjtzKyspe3ZhciBhPXJbc107SC5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShhKSYmKGkuc2V0KGEuZ2V0S2V5KCksMCwiZWxlbWVudCIpLGwuc2V0KGEuZ2V0S2V5KCksYS5nZXRDaGlsZHJlblNpemUoKSwiZWxlbWVudCIpLHBfKEguJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKG8pLHQpKX1ILiRzZXRTZWxlY3Rpb24oZSl9ZWxzZSBpZigtLW4sbz1yWzBdLGk9cltuXSxlLmlzQ29sbGFwc2VkKCkpcXMoZSx0KTtlbHNle3ZhciB1PWUuYW5jaG9yLHA9ZS5mb2N1cztzPW8uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsYT1wLm9mZnNldDt2YXIgYz11Lm9mZnNldCxmPXUuaXNCZWZvcmUocCk7bD1mP2M6YSxlPWY/YTpjO3ZhciBkPWY/dS50eXBlOnAudHlwZSxtPWY/cC50eXBlOnUudHlwZTtpZih1PWY/cC5rZXk6dS5rZXksSC4kaXNUZXh0Tm9kZShvKSYmbD09PXMmJihwPW8uZ2V0TmV4dFNpYmxpbmcoKSxILiRpc1RleHROb2RlKHApJiYobD1jPTAsbz1wKSksci5sZW5ndGg9PT0xKUguJGlzVGV4dE5vZGUobykmJihsPWQ9PT0iZWxlbWVudCI/MDpjPmE/YTpjLGU9bT09PSJlbGVtZW50Ij9zOmM+YT9jOmEsbCE9PWUmJihsPT09MCYmZT09PXM/KHFzKG8sdCksby5zZWxlY3QobCxlKSk6KHI9by5zcGxpdFRleHQobCxlKSxyPWw9PT0wP3JbMF06clsxXSxxcyhyLHQpLHIuc2VsZWN0KDAsZS1sKSkpKTtlbHNlIGZvcihILiRpc1RleHROb2RlKG8pJiZsPG8uZ2V0VGV4dENvbnRlbnRTaXplKCkmJihsIT09MCYmKG89by5zcGxpdFRleHQobClbMV0pLHFzKG8sdCkpLEguJGlzVGV4dE5vZGUoaSkmJihsPWkuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsaS5fX2tleSE9PXUmJmUhPT0wJiYoZT1sKSxlIT09bCYmKFtpXT1pLnNwbGl0VGV4dChlKSksZSE9PTAmJnFzKGksdCkpLGU9MTtlPG47ZSsrKWw9cltlXSxzPWwuZ2V0S2V5KCksSC4kaXNUZXh0Tm9kZShsKSYmcyE9PW8uZ2V0S2V5KCkmJnMhPT1pLmdldEtleSgpJiYhbC5pc1Rva2VuKCkmJnFzKGwsdCl9fWZ1bmN0aW9uIFRFKGUpe2Zvcig7ZSE9PW51bGwmJiFILiRpc1Jvb3RPclNoYWRvd1Jvb3QoZSk7KXtsZXQgdD1lLmdldExhdGVzdCgpLHI9ZS5nZXRQYXJlbnQoKTt0LmdldENoaWxkcmVuU2l6ZSgpPT09MCYmZS5yZW1vdmUoITApLGU9cn19ZnVuY3Rpb24gVHkoZSx0LHIsbixvPW51bGwpe2lmKHQubGVuZ3RoIT09MCl7dmFyIGk9dFswXSxsPW5ldyBNYXAscz1bXTtpPUguJGlzRWxlbWVudE5vZGUoaSk/aTppLmdldFBhcmVudE9yVGhyb3coKSxpLmlzSW5saW5lKCkmJihpPWkuZ2V0UGFyZW50T3JUaHJvdygpKTtmb3IodmFyIGE9ITE7aSE9PW51bGw7KXt2YXIgdT1pLmdldFByZXZpb3VzU2libGluZygpO2lmKHUhPT1udWxsKXtpPXUsYT0hMDticmVha31pZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLEguJGlzUm9vdE9yU2hhZG93Um9vdChpKSlicmVha311PW5ldyBTZXQ7Zm9yKHZhciBwPTA7cDxyO3ArKyl7dmFyIGM9dFtwXTtILiRpc0VsZW1lbnROb2RlKGMpJiZjLmdldENoaWxkcmVuU2l6ZSgpPT09MCYmdS5hZGQoYy5nZXRLZXkoKSl9dmFyIGY9bmV3IFNldDtmb3IocD0wO3A8cjtwKyspe2M9dFtwXTt2YXIgZD1jLmdldFBhcmVudCgpO2lmKGQhPT1udWxsJiZkLmlzSW5saW5lKCkmJihkPWQuZ2V0UGFyZW50KCkpLGQhPT1udWxsJiZILiRpc0xlYWZOb2RlKGMpJiYhZi5oYXMoYy5nZXRLZXkoKSkpe2lmKGM9ZC5nZXRLZXkoKSxsLmdldChjKT09PXZvaWQgMCl7bGV0IG09bigpO20uc2V0Rm9ybWF0KGQuZ2V0Rm9ybWF0VHlwZSgpKSxtLnNldEluZGVudChkLmdldEluZGVudCgpKSxzLnB1c2gobSksbC5zZXQoYyxtKSxkLmdldENoaWxkcmVuKCkuZm9yRWFjaChoPT57bS5hcHBlbmQoaCksZi5hZGQoaC5nZXRLZXkoKSksSC4kaXNFbGVtZW50Tm9kZShoKSYmaC5nZXRDaGlsZHJlbktleXMoKS5mb3JFYWNoKFM9PmYuYWRkKFMpKX0pLFRFKGQpfX1lbHNlIHUuaGFzKGMuZ2V0S2V5KCkpJiYoZD1uKCksZC5zZXRGb3JtYXQoYy5nZXRGb3JtYXRUeXBlKCkpLGQuc2V0SW5kZW50KGMuZ2V0SW5kZW50KCkpLHMucHVzaChkKSxjLnJlbW92ZSghMCkpfWlmKG8hPT1udWxsKWZvcih0PTA7dDxzLmxlbmd0aDt0Kyspby5hcHBlbmQoc1t0XSk7aWYodD1udWxsLEguJGlzUm9vdE9yU2hhZG93Um9vdChpKSlpZihhKWlmKG8hPT1udWxsKWkuaW5zZXJ0QWZ0ZXIobyk7ZWxzZSBmb3Iobz1zLmxlbmd0aC0xOzA8PW87by0tKWkuaW5zZXJ0QWZ0ZXIoc1tvXSk7ZWxzZSBpZihhPWkuZ2V0Rmlyc3RDaGlsZCgpLEguJGlzRWxlbWVudE5vZGUoYSkmJihpPWEpLGE9PT1udWxsKWlmKG8paS5hcHBlbmQobyk7ZWxzZSBmb3Iobz0wO288cy5sZW5ndGg7bysrKWE9c1tvXSxpLmFwcGVuZChhKSx0PWE7ZWxzZSBpZihvIT09bnVsbClhLmluc2VydEJlZm9yZShvKTtlbHNlIGZvcihpPTA7aTxzLmxlbmd0aDtpKyspbz1zW2ldLGEuaW5zZXJ0QmVmb3JlKG8pLHQ9bztlbHNlIGlmKG8paS5pbnNlcnRBZnRlcihvKTtlbHNlIGZvcihvPXMubGVuZ3RoLTE7MDw9bztvLS0pYT1zW29dLGkuaW5zZXJ0QWZ0ZXIoYSksdD1hO3M9SC4kZ2V0UHJldmlvdXNTZWxlY3Rpb24oKSxILiRpc1JhbmdlU2VsZWN0aW9uKHMpJiZzLmFuY2hvci5nZXROb2RlKCkuaXNBdHRhY2hlZCgpJiZzLmZvY3VzLmdldE5vZGUoKS5pc0F0dGFjaGVkKCk/SC4kc2V0U2VsZWN0aW9uKHMuY2xvbmUoKSk6dCE9PW51bGw/dC5zZWxlY3RFbmQoKTplLmRpcnR5PSEwfX1mdW5jdGlvbiBmXyhlLHQscixuKXtlLm1vZGlmeSh0PyJleHRlbmQiOiJtb3ZlIixyLG4pfWZ1bmN0aW9uIGRfKGUpe3JldHVybiBlPWUuYW5jaG9yLmdldE5vZGUoKSwoSC4kaXNSb290Tm9kZShlKT9lOmUuZ2V0UGFyZW50T3JUaHJvdygpKS5nZXREaXJlY3Rpb24oKT09PSJydGwifUR0LiRhZGROb2RlU3R5bGU9ZnVuY3Rpb24oZSl7ZT1lLmdldFN0eWxlKCk7bGV0IHQ9Y18oZSk7VGQuc2V0KGUsdCl9O0R0LiRjbG9uZVdpdGhQcm9wZXJ0aWVzPWZ1bmN0aW9uKGUpe2xldCB0PWUuY29uc3RydWN0b3IuY2xvbmUoZSk7cmV0dXJuIHQuX19wYXJlbnQ9ZS5fX3BhcmVudCx0Ll9fbmV4dD1lLl9fbmV4dCx0Ll9fcHJldj1lLl9fcHJldixILiRpc0VsZW1lbnROb2RlKGUpJiZILiRpc0VsZW1lbnROb2RlKHQpPyh0Ll9fZmlyc3Q9ZS5fX2ZpcnN0LHQuX19sYXN0PWUuX19sYXN0LHQuX19zaXplPWUuX19zaXplLHQuX19mb3JtYXQ9ZS5fX2Zvcm1hdCx0Ll9faW5kZW50PWUuX19pbmRlbnQsdC5fX2Rpcj1lLl9fZGlyLHQpOihILiRpc1RleHROb2RlKGUpJiZILiRpc1RleHROb2RlKHQpJiYodC5fX2Zvcm1hdD1lLl9fZm9ybWF0LHQuX19zdHlsZT1lLl9fc3R5bGUsdC5fX21vZGU9ZS5fX21vZGUsdC5fX2RldGFpbD1lLl9fZGV0YWlsKSx0KX07RHQuJGdldFNlbGVjdGlvblN0eWxlVmFsdWVGb3JQcm9wZXJ0eT1mdW5jdGlvbihlLHQscj0iIil7bGV0IG49bnVsbCxvPWUuZ2V0Tm9kZXMoKTt2YXIgaT1lLmFuY2hvcixsPWUuZm9jdXMscz1lLmlzQmFja3dhcmQoKTtsZXQgYT1zP2wub2Zmc2V0Omkub2Zmc2V0O2lmKGk9cz9sLmdldE5vZGUoKTppLmdldE5vZGUoKSxlLnN0eWxlIT09IiImJihlPV9kKGUuc3R5bGUpLGUhPT1udWxsJiZ0IGluIGUpKXJldHVybiBlW3RdO2ZvcihlPTA7ZTxvLmxlbmd0aDtlKyspe3ZhciB1PW9bZV07aWYoKGU9PT0wfHxhIT09MHx8IXUuaXMoaSkpJiZILiRpc1RleHROb2RlKHUpKXtpZihsPXQscz1yLHU9dS5nZXRTdHlsZSgpLHU9X2QodSksbD11IT09bnVsbCYmdVtsXXx8cyxuPT09bnVsbCluPWw7ZWxzZSBpZihuIT09bCl7bj0iIjticmVha319fXJldHVybiBuPT09bnVsbD9yOm59O0R0LiRpc0F0Tm9kZUVuZD1mdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09InRleHQiP2Uub2Zmc2V0PT09ZS5nZXROb2RlKCkuZ2V0VGV4dENvbnRlbnRTaXplKCk6ZS5vZmZzZXQ9PT1lLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKX07RHQuJGlzUGFyZW50RWxlbWVudFJUTD1kXztEdC4kbW92ZUNhcmV0U2VsZWN0aW9uPWZfO0R0LiRtb3ZlQ2hhcmFjdGVyPWZ1bmN0aW9uKGUsdCxyKXtsZXQgbj1kXyhlKTtmXyhlLHQscj8hbjpuLCJjaGFyYWN0ZXIiKX07RHQuJHBhdGNoU3R5bGVUZXh0PXBfO0R0LiRzZWxlY3RBbGw9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS5hbmNob3I7ZT1lLmZvY3VzO3ZhciByPXQuZ2V0Tm9kZSgpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCk7bGV0IG49ci5nZXRGaXJzdERlc2NlbmRhbnQoKTtyPXIuZ2V0TGFzdERlc2NlbmRhbnQoKTtsZXQgbz0iZWxlbWVudCIsaT0iZWxlbWVudCIsbD0wO0guJGlzVGV4dE5vZGUobik/bz0idGV4dCI6SC4kaXNFbGVtZW50Tm9kZShuKXx8bj09PW51bGx8fChuPW4uZ2V0UGFyZW50T3JUaHJvdygpKSxILiRpc1RleHROb2RlKHIpPyhpPSJ0ZXh0IixsPXIuZ2V0VGV4dENvbnRlbnRTaXplKCkpOkguJGlzRWxlbWVudE5vZGUocil8fHI9PT1udWxsfHwocj1yLmdldFBhcmVudE9yVGhyb3coKSksbiYmciYmKHQuc2V0KG4uZ2V0S2V5KCksMCxvKSxlLnNldChyLmdldEtleSgpLGwsaSkpfTtEdC4kc2V0QmxvY2tzVHlwZT1mdW5jdGlvbihlLHQpe2lmKGUuYW5jaG9yLmtleT09PSJyb290Iil7dD10KCk7dmFyIHI9SC4kZ2V0Um9vdCgpOyhlPXIuZ2V0Rmlyc3RDaGlsZCgpKT9lLnJlcGxhY2UodCwhMCk6ci5hcHBlbmQodCl9ZWxzZSBmb3Iocj1lLmdldE5vZGVzKCksZT1lLmFuY2hvci5nZXROb2RlKCkuZ2V0UGFyZW50T3JUaHJvdygpLHIuaW5kZXhPZihlKT09PS0xJiZyLnB1c2goZSksZS5pc0lubGluZSgpJiYoZT1lLmdldFBhcmVudE9yVGhyb3coKSxyLmluZGV4T2YoZSk9PT0tMSYmci5wdXNoKGUpKSxlPTA7ZTxyLmxlbmd0aDtlKyspe2xldCBpPXJbZV07dmFyIG49aTtpZighSC4kaXNFbGVtZW50Tm9kZShuKXx8SC4kaXNSb290T3JTaGFkb3dSb290KG4pKW49ITE7ZWxzZXt2YXIgbz1uLmdldEZpcnN0Q2hpbGQoKTtvPW89PT1udWxsfHxILiRpc0xpbmVCcmVha05vZGUobyl8fEguJGlzVGV4dE5vZGUobyl8fG8uaXNJbmxpbmUoKSxuPSFuLmlzSW5saW5lKCkmJm4uY2FuQmVFbXB0eSgpIT09ITEmJm99biYmKG49dCgpLG4uc2V0Rm9ybWF0KGkuZ2V0Rm9ybWF0VHlwZSgpKSxuLnNldEluZGVudChpLmdldEluZGVudCgpKSxpLnJlcGxhY2UobiwhMCkpfX07RHQuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiBlPUguJGdldEFkamFjZW50Tm9kZShlLmZvY3VzLHQpLEguJGlzRGVjb3JhdG9yTm9kZShlKSYmIWUuaXNJc29sYXRlZCgpfHxILiRpc0VsZW1lbnROb2RlKGUpJiYhZS5pc0lubGluZSgpJiYhZS5jYW5CZUVtcHR5KCl9O0R0LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50PWZ1bmN0aW9uKGUsdCl7aWYodC5pc1NlbGVjdGVkKCkmJiF0LmlzU2VnbWVudGVkKCkmJiF0LmlzVG9rZW4oKSYmKEguJGlzUmFuZ2VTZWxlY3Rpb24oZSl8fEguREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGUpKSl7dmFyIHI9ZS5hbmNob3IuZ2V0Tm9kZSgpLG49ZS5mb2N1cy5nZXROb2RlKCksbz10LmlzKHIpLGk9dC5pcyhuKTtpZihvfHxpKXtvPWUuaXNCYWNrd2FyZCgpO2xldFtsLHNdPWUuZ2V0Q2hhcmFjdGVyT2Zmc2V0cygpO2U9ci5pcyhuKSxpPXQuaXMobz9uOnIpLG49dC5pcyhvP3I6bikscj0wO2xldCBhO2U/KHI9bD5zP3M6bCxhPWw+cz9sOnMpOmk/KHI9bz9zOmwsYT12b2lkIDApOm4mJihvPW8/bDpzLHI9MCxhPW8pLHQuX190ZXh0PXQuX190ZXh0LnNsaWNlKHIsYSl9fXJldHVybiB0fTtEdC4kd3JhcE5vZGVzPWZ1bmN0aW9uKGUsdCxyPW51bGwpe3ZhciBuPWUuZ2V0Tm9kZXMoKTtsZXQgbz1uLmxlbmd0aDt2YXIgaT1lLmFuY2hvcjtpZihvPT09MHx8bz09PTEmJmkudHlwZT09PSJlbGVtZW50IiYmaS5nZXROb2RlKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKXtlPWkudHlwZT09PSJ0ZXh0Ij9pLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCk6aS5nZXROb2RlKCksbj1lLmdldENoaWxkcmVuKCk7bGV0IHM9dCgpO3Muc2V0Rm9ybWF0KGUuZ2V0Rm9ybWF0VHlwZSgpKSxzLnNldEluZGVudChlLmdldEluZGVudCgpKSxuLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLHImJihzPXIuYXBwZW5kKHMpKSxlLnJlcGxhY2Uocyl9ZWxzZXtpPW51bGw7dmFyIGw9W107Zm9yKGxldCBzPTA7czxvO3MrKyl7bGV0IGE9bltzXTtILiRpc1Jvb3RPclNoYWRvd1Jvb3QoYSk/KFR5KGUsbCxsLmxlbmd0aCx0LHIpLGw9W10saT1hKTppPT09bnVsbHx8aSE9PW51bGwmJkguJGhhc0FuY2VzdG9yKGEsaSk/bC5wdXNoKGEpOihUeShlLGwsbC5sZW5ndGgsdCxyKSxsPVthXSl9VHkoZSxsLGwubGVuZ3RoLHQscil9fTtEdC5jcmVhdGVET01SYW5nZT1mdW5jdGlvbihlLHQscixuLG8pe2xldCBpPXQuZ2V0S2V5KCksbD1uLmdldEtleSgpLHM9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxhPWUuZ2V0RWxlbWVudEJ5S2V5KGkpO2lmKGU9ZS5nZXRFbGVtZW50QnlLZXkobCksSC4kaXNUZXh0Tm9kZSh0KSYmKGE9YV8oYSkpLEguJGlzVGV4dE5vZGUobikmJihlPWFfKGUpKSx0PT09dm9pZCAwfHxuPT09dm9pZCAwfHxhPT09bnVsbHx8ZT09PW51bGwpcmV0dXJuIG51bGw7YS5ub2RlTmFtZT09PSJCUiImJihbYSxyXT11XyhhKSksZS5ub2RlTmFtZT09PSJCUiImJihbZSxvXT11XyhlKSksdD1hLmZpcnN0Q2hpbGQsYT09PWUmJnQhPW51bGwmJnQubm9kZU5hbWU9PT0iQlIiJiZyPT09MCYmbz09PTAmJihvPTEpO3RyeXtzLnNldFN0YXJ0KGEscikscy5zZXRFbmQoZSxvKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4hcy5jb2xsYXBzZWR8fHI9PT1vJiZpPT09bHx8KHMuc2V0U3RhcnQoZSxvKSxzLnNldEVuZChhLHIpKSxzfTtEdC5jcmVhdGVSZWN0c0Zyb21ET01SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciByPWUuZ2V0Um9vdEVsZW1lbnQoKTtpZihyPT09bnVsbClyZXR1cm5bXTtlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1nZXRDb21wdXRlZFN0eWxlKHIpLHI9cGFyc2VGbG9hdChyLnBhZGRpbmdMZWZ0KStwYXJzZUZsb2F0KHIucGFkZGluZ1JpZ2h0KSx0PUFycmF5LmZyb20odC5nZXRDbGllbnRSZWN0cygpKTtsZXQgbj10Lmxlbmd0aDt0LnNvcnQoKGksbCk9PntsZXQgcz1pLnRvcC1sLnRvcDtyZXR1cm4gMz49TWF0aC5hYnMocyk/aS5sZWZ0LWwubGVmdDpzfSk7bGV0IG87Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IGw9dFtpXSxzPWwud2lkdGgrcj09PWUud2lkdGg7byYmby50b3A8PWwudG9wJiZvLnRvcCtvLmhlaWdodD5sLnRvcCYmby5sZWZ0K28ud2lkdGg+bC5sZWZ0fHxzPyh0LnNwbGljZShpLS0sMSksbi0tKTpvPWx9cmV0dXJuIHR9O0R0LmdldFN0eWxlT2JqZWN0RnJvbUNTUz1fZDtEdC50cmltVGV4dENvbnRlbnRGcm9tQW5jaG9yPWZ1bmN0aW9uKGUsdCxyKXtsZXQgbj10LmdldE5vZGUoKTtpZihILiRpc0VsZW1lbnROb2RlKG4pKXt2YXIgbz1uLmdldERlc2NlbmRhbnRCeUluZGV4KHQub2Zmc2V0KTtvIT09bnVsbCYmKG49byl9Zm9yKDswPHImJm4hPT1udWxsOyl7dmFyIGk9bi5nZXRQcmV2aW91c1NpYmxpbmcoKSxsPTA7aWYoaT09PW51bGwpe289bi5nZXRQYXJlbnRPclRocm93KCk7Zm9yKHZhciBzPW8uZ2V0UHJldmlvdXNTaWJsaW5nKCk7cz09PW51bGw7KXtpZihvPW8uZ2V0UGFyZW50KCksbz09PW51bGwpe2k9bnVsbDticmVha31zPW8uZ2V0UHJldmlvdXNTaWJsaW5nKCl9byE9PW51bGwmJihsPW8uaXNJbmxpbmUoKT8wOjIsaT1ILiRpc0VsZW1lbnROb2RlKHMpP3MuZ2V0TGFzdERlc2NlbmRhbnQoKTpzKX1pZihzPW4uZ2V0VGV4dENvbnRlbnQoKSxzPT09IiImJkguJGlzRWxlbWVudE5vZGUobikmJiFuLmlzSW5saW5lKCkmJihzPVxgCgpcYCksbz1zLmxlbmd0aCwhSC4kaXNUZXh0Tm9kZShuKXx8cj49bylzPW4uZ2V0UGFyZW50KCksbi5yZW1vdmUoKSxzPT1udWxsfHxzLmdldENoaWxkcmVuU2l6ZSgpIT09MHx8SC4kaXNSb290Tm9kZShzKXx8cy5yZW1vdmUoKSxyLT1vK2wsbj1pO2Vsc2V7bGV0IGE9bi5nZXRLZXkoKTtsPWUuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57bGV0IHA9SC4kZ2V0Tm9kZUJ5S2V5KGEpO3JldHVybiBILiRpc1RleHROb2RlKHApJiZwLmlzU2ltcGxlVGV4dCgpP3AuZ2V0VGV4dENvbnRlbnQoKTpudWxsfSksaT1vLXI7bGV0IHU9cy5zbGljZSgwLGkpO2whPT1udWxsJiZsIT09cz8ocj1ILiRnZXRQcmV2aW91c1NlbGVjdGlvbigpLG89bixuLmlzU2ltcGxlVGV4dCgpP24uc2V0VGV4dENvbnRlbnQobCk6KG89SC4kY3JlYXRlVGV4dE5vZGUobCksbi5yZXBsYWNlKG8pKSxILiRpc1JhbmdlU2VsZWN0aW9uKHIpJiZyLmlzQ29sbGFwc2VkKCkmJihyPXIuYW5jaG9yLm9mZnNldCxvLnNlbGVjdChyLHIpKSk6bi5pc1NpbXBsZVRleHQoKT8obD10LmtleT09PWEscz10Lm9mZnNldCxzPHImJihzPW8pLHI9bD9zLXI6MCxvPWw/czppLGwmJnI9PT0wPyhbcl09bi5zcGxpdFRleHQocixvKSxyLnJlbW92ZSgpKTooWyxyXT1uLnNwbGl0VGV4dChyLG8pLHIucmVtb3ZlKCkpKToocj1ILiRjcmVhdGVUZXh0Tm9kZSh1KSxuLnJlcGxhY2UocikpLHI9MH19fX0pO3ZhciB2bD1WKChRcmUsaF8pPT57InVzZSBzdHJpY3QiO3ZhciBfRT1tXygpO2hfLmV4cG9ydHM9X0V9KTt2YXIgdl89VihhdD0+eyJ1c2Ugc3RyaWN0Ijt2YXIga0U9dmwoKSxKZT1WcigpO2Z1bmN0aW9uIE5FKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tyXSk7dGhyb3cgRXJyb3IoXGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXGApfWZ1bmN0aW9uIGdfKGUsdCl7Zm9yKGxldCByIG9mIHQpaWYoZS50eXBlLnN0YXJ0c1dpdGgocikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24geV8oZSx0KXtmb3IoO2UhPT1KZS4kZ2V0Um9vdCgpJiZlIT1udWxsOyl7aWYodChlKSlyZXR1cm4gZTtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9YXQuJHNwbGl0Tm9kZT1KZS4kc3BsaXROb2RlO2F0LmlzSFRNTEFuY2hvckVsZW1lbnQ9SmUuaXNIVE1MQW5jaG9yRWxlbWVudDthdC5pc0hUTUxFbGVtZW50PUplLmlzSFRNTEVsZW1lbnQ7YXQuJGRmcz1mdW5jdGlvbihlLHQpe2xldCByPVtdO2U9KGV8fEplLiRnZXRSb290KCkpLmdldExhdGVzdCgpLHQ9dHx8KEplLiRpc0VsZW1lbnROb2RlKGUpP2UuZ2V0TGFzdERlc2NlbmRhbnQoKTplKTtmb3IodmFyIG49ZSxvPTA7KG49bi5nZXRQYXJlbnQoKSkhPT1udWxsOylvKys7Zm9yKG49bztlIT09bnVsbCYmIWUuaXModCk7KWlmKHIucHVzaCh7ZGVwdGg6bixub2RlOmV9KSxKZS4kaXNFbGVtZW50Tm9kZShlKSYmMDxlLmdldENoaWxkcmVuU2l6ZSgpKWU9ZS5nZXRGaXJzdENoaWxkKCksbisrO2Vsc2UgZm9yKG89bnVsbDtvPT09bnVsbCYmZSE9PW51bGw7KW89ZS5nZXROZXh0U2libGluZygpLG89PT1udWxsPyhlPWUuZ2V0UGFyZW50KCksbi0tKTplPW87cmV0dXJuIGUhPT1udWxsJiZlLmlzKHQpJiZyLnB1c2goe2RlcHRoOm4sbm9kZTplfSkscn07YXQuJGZpbHRlcj1mdW5jdGlvbihlLHQpe2xldCByPVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgbz10KGVbbl0pO28hPT1udWxsJiZyLnB1c2gobyl9cmV0dXJuIHJ9O2F0LiRmaW5kTWF0Y2hpbmdQYXJlbnQ9eV87YXQuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3c9ZnVuY3Rpb24oZSl7bGV0IHQ9eV8oZSxyPT5KZS4kaXNFbGVtZW50Tm9kZShyKSYmIXIuaXNJbmxpbmUoKSk7cmV0dXJuIEplLiRpc0VsZW1lbnROb2RlKHQpfHxORSg0LGUuX19rZXkpLHR9O2F0LiRnZXROZWFyZXN0Tm9kZU9mVHlwZT1mdW5jdGlvbihlLHQpe2Zvcig7ZSE9bnVsbDspe2lmKGUgaW5zdGFuY2VvZiB0KXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH07YXQuJGluc2VydEZpcnN0PWZ1bmN0aW9uKGUsdCl7bGV0IHI9ZS5nZXRGaXJzdENoaWxkKCk7ciE9PW51bGw/ci5pbnNlcnRCZWZvcmUodCk6ZS5hcHBlbmQodCl9O2F0LiRpbnNlcnROb2RlVG9OZWFyZXN0Um9vdD1mdW5jdGlvbihlKXt2YXIgdD1KZS4kZ2V0U2VsZWN0aW9uKCl8fEplLiRnZXRQcmV2aW91c1NlbGVjdGlvbigpO2lmKEplLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXt2YXJ7Zm9jdXM6cn09dDtpZih0PXIuZ2V0Tm9kZSgpLHI9ci5vZmZzZXQsSmUuJGlzUm9vdE9yU2hhZG93Um9vdCh0KSlyPXQuZ2V0Q2hpbGRBdEluZGV4KHIpLHI9PW51bGw/dC5hcHBlbmQoZSk6ci5pbnNlcnRCZWZvcmUoZSksZS5zZWxlY3ROZXh0KCk7ZWxzZXtsZXQgbixvO0plLiRpc1RleHROb2RlKHQpPyhuPXQuZ2V0UGFyZW50T3JUaHJvdygpLG89dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLDA8ciYmKG8rPTEsdC5zcGxpdFRleHQocikpKToobj10LG89ciksWyx0XT1KZS4kc3BsaXROb2RlKG4sbyksdC5pbnNlcnRCZWZvcmUoZSksdC5zZWxlY3RTdGFydCgpfX1lbHNlIEplLiRpc05vZGVTZWxlY3Rpb24odCl8fEplLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbih0KT8odD10LmdldE5vZGVzKCksdFt0Lmxlbmd0aC0xXS5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkuaW5zZXJ0QWZ0ZXIoZSkpOkplLiRnZXRSb290KCkuYXBwZW5kKGUpLHQ9SmUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxlLmluc2VydEFmdGVyKHQpLHQuc2VsZWN0KCk7cmV0dXJuIGUuZ2V0TGF0ZXN0KCl9O2F0LiRyZXN0b3JlRWRpdG9yU3RhdGU9ZnVuY3Rpb24oZSx0KXtsZXQgcj1uZXcgTWFwLG49ZS5fcGVuZGluZ0VkaXRvclN0YXRlO2ZvcihsZXRbbyxpXW9mIHQuX25vZGVNYXApe2xldCBsPWtFLiRjbG9uZVdpdGhQcm9wZXJ0aWVzKGkpO0plLiRpc1RleHROb2RlKGwpJiYobC5fX3RleHQ9aS5fX3RleHQpLHIuc2V0KG8sbCl9biYmKG4uX25vZGVNYXA9ciksZS5fZGlydHlUeXBlPTIsZT10Ll9zZWxlY3Rpb24sSmUuJHNldFNlbGVjdGlvbihlPT09bnVsbD9udWxsOmUuY2xvbmUoKSl9O2F0LiR3cmFwTm9kZUluRWxlbWVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0PXQoKSxlLnJlcGxhY2UodCksdC5hcHBlbmQoZSksdH07YXQuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudD1mdW5jdGlvbihlLC4uLnQpe3QuZm9yRWFjaChyPT57dHlwZW9mIHI9PSJzdHJpbmciJiYocj1yLnNwbGl0KCIgIikuZmlsdGVyKG49Pm4hPT0iIiksZS5jbGFzc0xpc3QuYWRkKC4uLnIpKX0pfTthdC5pc01pbWVUeXBlPWdfO2F0Lm1lZGlhRmlsZVJlYWRlcj1mdW5jdGlvbihlLHQpe2xldCByPWVbU3ltYm9sLml0ZXJhdG9yXSgpO3JldHVybiBuZXcgUHJvbWlzZSgobixvKT0+e2xldCBpPVtdLGw9KCk9PntsZXR7ZG9uZTpzLHZhbHVlOmF9PXIubmV4dCgpO2lmKHMpcmV0dXJuIG4oaSk7bGV0IHU9bmV3IEZpbGVSZWFkZXI7dS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbyksdS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2xldCBwPXUucmVzdWx0O3R5cGVvZiBwPT0ic3RyaW5nIiYmaS5wdXNoKHtmaWxlOmEscmVzdWx0OnB9KSxsKCl9KSxnXyhhLHQpP3UucmVhZEFzRGF0YVVSTChhKTpsKCl9O2woKX0pfTthdC5tZXJnZVJlZ2lzdGVyPWZ1bmN0aW9uKC4uLmUpe3JldHVybigpPT57ZS5mb3JFYWNoKHQ9PnQoKSl9fTthdC5vYmplY3RLbGFzc0VxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlIT09bnVsbD9PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkuY29uc3RydWN0b3IubmFtZT09PXQubmFtZTohMX07YXQucmVnaXN0ZXJOZXN0ZWRFbGVtZW50UmVzb2x2ZXI9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIGUucmVnaXN0ZXJOb2RlVHJhbnNmb3JtKHQsbz0+e2U6e2Zvcih2YXIgaT1vLmdldENoaWxkcmVuKCksbD0wO2w8aS5sZW5ndGg7bCsrKWlmKGlbbF1pbnN0YW5jZW9mIHQpe2k9bnVsbDticmVhayBlfWZvcihpPW87aSE9PW51bGw7KWlmKGw9aSxpPWkuZ2V0UGFyZW50KCksaSBpbnN0YW5jZW9mIHQpe2k9e2NoaWxkOmwscGFyZW50Oml9O2JyZWFrIGV9aT1udWxsfWlmKGkhPT1udWxsKXtsZXR7Y2hpbGQ6cyxwYXJlbnQ6YX09aTtpZihzLmlzKG8pKXtpZihuKGEsbyksbz1zLmdldE5leHRTaWJsaW5ncygpLGk9by5sZW5ndGgsYS5pbnNlcnRBZnRlcihzKSxpIT09MCl7bD1yKGEpLHMuaW5zZXJ0QWZ0ZXIobCk7Zm9yKGxldCB1PTA7dTxpO3UrKylsLmFwcGVuZChvW3VdKX1hLmNhbkJlRW1wdHkoKXx8YS5nZXRDaGlsZHJlblNpemUoKSE9PTB8fGEucmVtb3ZlKCl9fX0pfTthdC5yZW1vdmVDbGFzc05hbWVzRnJvbUVsZW1lbnQ9ZnVuY3Rpb24oZSwuLi50KXt0LmZvckVhY2gocj0+e3R5cGVvZiByPT0ic3RyaW5nIiYmZS5jbGFzc0xpc3QucmVtb3ZlKC4uLnIuc3BsaXQoIiAiKSl9KX19KTt2YXIgRm89VigoWXJlLHhfKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgYkU9dl8oKTt4Xy5leHBvcnRzPWJFfSk7dmFyIFNfPVYod189PnsidXNlIHN0cmljdCI7dmFyIGtkPVZyKCk7d18ucmVnaXN0ZXJEcmFnb25TdXBwb3J0PWZ1bmN0aW9uKGUpe2xldCB0PXdpbmRvdy5sb2NhdGlvbi5vcmlnaW4scj1uPT57aWYobi5vcmlnaW49PT10KXt2YXIgbz1lLmdldFJvb3RFbGVtZW50KCk7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PW8mJihvPW4uZGF0YSx0eXBlb2Ygbz09InN0cmluZyIpKXt0cnl7dmFyIGk9SlNPTi5wYXJzZShvKX1jYXRjaHtyZXR1cm59aWYoaSYmaS5wcm90b2NvbD09PSJudWFucmlhX21lc3NhZ2luZyImJmkudHlwZT09PSJyZXF1ZXN0IiYmKGk9aS5wYXlsb2FkKSYmaS5mdW5jdGlvbklkPT09Im1ha2VDaGFuZ2VzIiYmKGk9aS5hcmdzKSl7bGV0W2wscyxhLHUscF09aTtlLnVwZGF0ZSgoKT0+e2xldCBjPWtkLiRnZXRTZWxlY3Rpb24oKTtpZihrZC4kaXNSYW5nZVNlbGVjdGlvbihjKSl7dmFyIGY9Yy5hbmNob3I7bGV0IGQ9Zi5nZXROb2RlKCksbT0wLGg9MDtrZC4kaXNUZXh0Tm9kZShkKSYmMDw9bCYmMDw9cyYmKG09bCxoPWwrcyxjLnNldFRleHROb2RlUmFuZ2UoZCxtLGQsaCkpLChtIT09aHx8YSE9PSIiKSYmKGMuaW5zZXJ0UmF3VGV4dChhKSxkPWYuZ2V0Tm9kZSgpKSxrZC4kaXNUZXh0Tm9kZShkKSYmKG09dSxoPXUrcCxmPWQuZ2V0VGV4dENvbnRlbnRTaXplKCksbT1tPmY/ZjptLGg9aD5mP2Y6aCxjLnNldFRleHROb2RlUmFuZ2UoZCxtLGQsaCkpLG4uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9fSl9fX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsciwhMCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsciwhMCl9fX0pO3ZhciBUXz1WKChacmUsQ18pPT57InVzZSBzdHJpY3QiO3ZhciBFRT1TXygpO0NfLmV4cG9ydHM9RUV9KTt2YXIgRV89VihfeT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgX189dmwoKSxQRT1GbygpLFFzPVZyKCk7ZnVuY3Rpb24ga18oZSx0LHIsbj1udWxsKXtsZXQgbz1uIT1udWxsP3QuaXNTZWxlY3RlZChuKTohMCxpPVFzLiRpc0VsZW1lbnROb2RlKHQpJiZ0LmV4Y2x1ZGVGcm9tQ29weSgiaHRtbCIpO3ZhciBsPXQ7biE9PW51bGwmJihsPV9fLiRjbG9uZVdpdGhQcm9wZXJ0aWVzKHQpLGw9UXMuJGlzVGV4dE5vZGUobCkmJm4hPW51bGw/X18uJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQobixsKTpsKTtsZXQgcz1Rcy4kaXNFbGVtZW50Tm9kZShsKT9sLmdldENoaWxkcmVuKCk6W10se2VsZW1lbnQ6YSxhZnRlcjp1fT1sLmV4cG9ydERPTShlKTtpZighYSlyZXR1cm4hMTtsZXQgcD1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKGxldCBjPTA7YzxzLmxlbmd0aDtjKyspe2xldCBmPXNbY10sZD1rXyhlLGYscCxuKTshbyYmUXMuJGlzRWxlbWVudE5vZGUodCkmJmQmJnQuZXh0cmFjdFdpdGhDaGlsZChmLG4sImh0bWwiKSYmKG89ITApfXJldHVybiBvJiYhaT8oUEUuaXNIVE1MRWxlbWVudChhKSYmYS5hcHBlbmQocCksci5hcHBlbmQoYSksdSYmKGU9dS5jYWxsKGwsYSkpJiZhLnJlcGxhY2VXaXRoKGUpKTpyLmFwcGVuZChwKSxvfXZhciBOXz1uZXcgU2V0KFsiU1RZTEUiLCJTQ1JJUFQiXSk7ZnVuY3Rpb24gYl8oZSx0LHI9bmV3IE1hcCxuKXtsZXQgbz1bXTtpZihOXy5oYXMoZS5ub2RlTmFtZSkpcmV0dXJuIG87bGV0IGk9bnVsbDt2YXIgbCx7bm9kZU5hbWU6c309ZSxhPXQuX2h0bWxDb252ZXJzaW9ucy5nZXQocy50b0xvd2VyQ2FzZSgpKTtpZihzPW51bGwsYSE9PXZvaWQgMClmb3IobCBvZiBhKWE9bChlKSxhIT09bnVsbCYmKHM9PT1udWxsfHxzLnByaW9yaXR5PGEucHJpb3JpdHkpJiYocz1hKTtpZihzPShsPXMhPT1udWxsP3MuY29udmVyc2lvbjpudWxsKT9sKGUpOm51bGwsbD1udWxsLHMhPT1udWxsKXtpZihsPXMuYWZ0ZXIsYT1zLm5vZGUsaT1BcnJheS5pc0FycmF5KGEpP2FbYS5sZW5ndGgtMV06YSxpIT09bnVsbCl7Zm9yKHZhclssdV1vZiByKWlmKGk9dShpLG4pLCFpKWJyZWFrO2kmJm8ucHVzaCguLi5BcnJheS5pc0FycmF5KGEpP2E6W2ldKX1zLmZvckNoaWxkIT1udWxsJiZyLnNldChlLm5vZGVOYW1lLHMuZm9yQ2hpbGQpfWZvcihlPWUuY2hpbGROb2RlcyxuPVtdLHU9MDt1PGUubGVuZ3RoO3UrKyluLnB1c2goLi4uYl8oZVt1XSx0LG5ldyBNYXAociksaSkpO3JldHVybiBsIT1udWxsJiYobj1sKG4pKSxpPT1udWxsP289by5jb25jYXQobik6UXMuJGlzRWxlbWVudE5vZGUoaSkmJmkuYXBwZW5kKC4uLm4pLG99X3kuJGdlbmVyYXRlSHRtbEZyb21Ob2Rlcz1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBkb2N1bWVudD4idSJ8fHR5cGVvZiB3aW5kb3c+InUiKXRocm93IEVycm9yKCJUbyB1c2UgJGdlbmVyYXRlSHRtbEZyb21Ob2RlcyBpbiBoZWFkbGVzcyBtb2RlIHBsZWFzZSBpbml0aWFsaXplIGEgaGVhZGxlc3MgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBzdWNoIGFzIEpTRG9tIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIik7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksbj1Rcy4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspa18oZSxuW29dLHIsdCk7cmV0dXJuIHIuaW5uZXJIVE1MfTtfeS4kZ2VuZXJhdGVOb2Rlc0Zyb21ET009ZnVuY3Rpb24oZSx0KXt0PXQuYm9keT90LmJvZHkuY2hpbGROb2RlczpbXTtsZXQgcj1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIG49dFtvXTtOXy5oYXMobi5ub2RlTmFtZSl8fChuPWJfKG4sZSksbiE9PW51bGwmJihyPXIuY29uY2F0KG4pKSl9cmV0dXJuIHJ9fSk7dmFyIGt5PVYoKGVuZSxQXyk9PnsidXNlIHN0cmljdCI7dmFyIE1FPUVfKCk7UF8uZXhwb3J0cz1NRX0pO3ZhciBGXz1WKGpvPT57InVzZSBzdHJpY3QiO3ZhciBJXz1reSgpLE55PXZsKCksWXM9Rm8oKSxxPVZyKCk7ZnVuY3Rpb24gJG8oZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW3JdKTt0aHJvdyBFcnJvcihcYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5cYCl9dmFyIExfPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IjtmdW5jdGlvbiBBXyhlKXtsZXQgdD1xLiRnZXRTZWxlY3Rpb24oKTtpZih0PT1udWxsKXRocm93IEVycm9yKCJFeHBlY3RlZCB2YWxpZCBMZXhpY2FsU2VsZWN0aW9uIik7cmV0dXJuIHEuJGlzUmFuZ2VTZWxlY3Rpb24odCkmJnQuaXNDb2xsYXBzZWQoKXx8dC5nZXROb2RlcygpLmxlbmd0aD09PTA/IiI6SV8uJGdlbmVyYXRlSHRtbEZyb21Ob2RlcyhlLHQpfWZ1bmN0aW9uIERfKGUpe2xldCB0PXEuJGdldFNlbGVjdGlvbigpO2lmKHQ9PW51bGwpdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHZhbGlkIExleGljYWxTZWxlY3Rpb24iKTtyZXR1cm4gcS4kaXNSYW5nZVNlbGVjdGlvbih0KSYmdC5pc0NvbGxhcHNlZCgpfHx0LmdldE5vZGVzKCkubGVuZ3RoPT09MD9udWxsOkpTT04uc3RyaW5naWZ5KHpfKGUsdCkpfWZ1bmN0aW9uIGJ5KGUsdCxyKXsocS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24ocil8fFlzLiRmaW5kTWF0Y2hpbmdQYXJlbnQoci5hbmNob3IuZ2V0Tm9kZSgpLG49PnEuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUobikpIT09bnVsbCYmWXMuJGZpbmRNYXRjaGluZ1BhcmVudChyLmZvY3VzLmdldE5vZGUoKSxuPT5xLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKG4pKSE9PW51bGwpJiZ0Lmxlbmd0aD09PTEmJnEuREVQUkVDQVRFRF8kaXNHcmlkTm9kZSh0WzBdKT9MRSh0LHIsITEsZSk6SUUodCxyKX1mdW5jdGlvbiBJRShlLHQpe2xldCByPVtdLG49bnVsbDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7bGV0IGk9ZVtvXSxsPXEuJGlzTGluZUJyZWFrTm9kZShpKTtpZihsfHxxLiRpc0RlY29yYXRvck5vZGUoaSkmJmkuaXNJbmxpbmUoKXx8cS4kaXNFbGVtZW50Tm9kZShpKSYmaS5pc0lubGluZSgpfHxxLiRpc1RleHROb2RlKGkpfHxpLmlzUGFyZW50UmVxdWlyZWQoKSl7aWYobj09PW51bGwmJihuPWkuY3JlYXRlUGFyZW50RWxlbWVudE5vZGUoKSxyLnB1c2gobiksbCkpY29udGludWU7biE9PW51bGwmJm4uYXBwZW5kKGkpfWVsc2Ugci5wdXNoKGkpLG49bnVsbH1xLiRpc1JhbmdlU2VsZWN0aW9uKHQpP3QuaW5zZXJ0Tm9kZXMocik6cS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24odCkmJihlPXQuYW5jaG9yLmdldE5vZGUoKSxxLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGUpfHwkbyg0MSksZS5hcHBlbmQoLi4ucikpfWZ1bmN0aW9uIExFKGUsdCxyLG4pe2UubGVuZ3RoPT09MSYmcS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGVbMF0pfHwkbyg0Mik7dmFyIG89ZVswXTtlPW8uZ2V0Q2hpbGRyZW4oKSxyPW8uZ2V0Rmlyc3RDaGlsZE9yVGhyb3coKS5nZXRDaGlsZHJlblNpemUoKTt2YXIgaT1vLmdldENoaWxkcmVuU2l6ZSgpLGw9WXMuJGZpbmRNYXRjaGluZ1BhcmVudCh0LmFuY2hvci5nZXROb2RlKCksZD0+cS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShkKSk7dD0obz1sJiZZcy4kZmluZE1hdGNoaW5nUGFyZW50KGwsZD0+cS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGQpKSkmJllzLiRmaW5kTWF0Y2hpbmdQYXJlbnQobyxkPT5xLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoZCkpLHEuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUobCkmJnEuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZShvKSYmcS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHQpfHwkbyg0Myk7dmFyIHM9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLGE9TWF0aC5taW4odC5nZXRDaGlsZHJlblNpemUoKS0xLHMraS0xKTtpPWwuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPU1hdGgubWluKG8uZ2V0Q2hpbGRyZW5TaXplKCktMSxpK3ItMSkscj1NYXRoLm1pbihpLGwpLG89TWF0aC5taW4ocyxhKSxpPU1hdGgubWF4KGksbCkscz1NYXRoLm1heChzLGEpLGE9dC5nZXRDaGlsZHJlbigpLGw9MDtsZXQgdSxwO2ZvcihsZXQgZD1vO2Q8PXM7ZCsrKXt2YXIgYz1hW2RdO3EuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZShjKXx8JG8oMjQpO3ZhciBmPWVbbF07cS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGYpfHwkbygyNCksYz1jLmdldENoaWxkcmVuKCksZj1mLmdldENoaWxkcmVuKCk7bGV0IG09MDtmb3IobGV0IGg9cjtoPD1pO2grKyl7bGV0IFM9Y1toXTtxLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKFMpfHwkbygyNSk7bGV0IHk9ZlttXTtxLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHkpfHwkbygyNSksZD09PW8mJmg9PT1yP3U9Uy5nZXRLZXkoKTpkPT09cyYmaD09PWkmJihwPVMuZ2V0S2V5KCkpO2xldCB2PVMuZ2V0Q2hpbGRyZW4oKTt5LmdldENoaWxkcmVuKCkuZm9yRWFjaChnPT57cS4kaXNUZXh0Tm9kZShnKSYmcS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZChnKSxTLmFwcGVuZChnKX0pLHYuZm9yRWFjaChnPT5nLnJlbW92ZSgpKSxtKyt9bCsrfXUmJnAmJihlPXEuREVQUkVDQVRFRF8kY3JlYXRlR3JpZFNlbGVjdGlvbigpLGUuc2V0KHQuZ2V0S2V5KCksdSxwKSxxLiRzZXRTZWxlY3Rpb24oZSksbi5kaXNwYXRjaENvbW1hbmQocS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsdm9pZCAwKSl9ZnVuY3Rpb24gT18oZSx0LHIsbj1bXSl7bGV0IG89dCE9bnVsbD9yLmlzU2VsZWN0ZWQodCk6ITAsaT1xLiRpc0VsZW1lbnROb2RlKHIpJiZyLmV4Y2x1ZGVGcm9tQ29weSgiaHRtbCIpO3ZhciBsPXI7aWYodCE9PW51bGwpe3ZhciBzPU55LiRjbG9uZVdpdGhQcm9wZXJ0aWVzKHIpO2w9cz1xLiRpc1RleHROb2RlKHMpJiZ0IT1udWxsP055LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50KHQscyk6c31sZXQgYT1xLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXTt2YXIgdT1sO3M9dS5leHBvcnRKU09OKCk7dmFyIHA9dS5jb25zdHJ1Y3RvcjtzLnR5cGUhPT1wLmdldFR5cGUoKSYmJG8oNTgscC5uYW1lKTtsZXQgYz1zLmNoaWxkcmVuO2ZvcihxLiRpc0VsZW1lbnROb2RlKHUpJiYoQXJyYXkuaXNBcnJheShjKXx8JG8oNTkscC5uYW1lKSkscS4kaXNUZXh0Tm9kZShsKSYmKGw9bC5fX3RleHQsMDxsLmxlbmd0aD9zLnRleHQ9bDpvPSExKSxsPTA7bDxhLmxlbmd0aDtsKyspdT1hW2xdLHA9T18oZSx0LHUscy5jaGlsZHJlbiksIW8mJnEuJGlzRWxlbWVudE5vZGUocikmJnAmJnIuZXh0cmFjdFdpdGhDaGlsZCh1LHQsImNsb25lIikmJihvPSEwKTtpZihvJiYhaSluLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY2hpbGRyZW4pKWZvcihlPTA7ZTxzLmNoaWxkcmVuLmxlbmd0aDtlKyspbi5wdXNoKHMuY2hpbGRyZW5bZV0pO3JldHVybiBvfWZ1bmN0aW9uIHpfKGUsdCl7bGV0IHI9W10sbj1xLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKylPXyhlLHQsbltvXSxyKTtyZXR1cm57bmFtZXNwYWNlOmUuX2NvbmZpZy5uYW1lc3BhY2Usbm9kZXM6cn19ZnVuY3Rpb24gQl8oZSl7bGV0IHQ9W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBuPXEuJHBhcnNlU2VyaWFsaXplZE5vZGUoZVtyXSk7cS4kaXNUZXh0Tm9kZShuKSYmTnkuJGFkZE5vZGVTdHlsZShuKSx0LnB1c2gobil9cmV0dXJuIHR9dmFyIEtzPW51bGw7ZnVuY3Rpb24gTV8oZSx0KXt2YXIgcj1MXz8oZS5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYoIXIpcmV0dXJuITE7dmFyIG49ci5hbmNob3JOb2RlO2lmKHI9ci5mb2N1c05vZGUsbiE9PW51bGwmJnIhPT1udWxsJiYhcS5pc1NlbGVjdGlvbldpdGhpbkVkaXRvcihlLG4scil8fCh0LnByZXZlbnREZWZhdWx0KCksdD10LmNsaXBib2FyZERhdGEsbj1xLiRnZXRTZWxlY3Rpb24oKSx0PT09bnVsbHx8bj09PW51bGwpKXJldHVybiExO3I9QV8oZSksZT1EXyhlKTtsZXQgbz0iIjtyZXR1cm4gbiE9PW51bGwmJihvPW4uZ2V0VGV4dENvbnRlbnQoKSksciE9PW51bGwmJnQuc2V0RGF0YSgidGV4dC9odG1sIixyKSxlIT09bnVsbCYmdC5zZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIixlKSx0LnNldERhdGEoInRleHQvcGxhaW4iLG8pLCEwfWpvLiRnZW5lcmF0ZUpTT05Gcm9tU2VsZWN0ZWROb2Rlcz16Xztqby4kZ2VuZXJhdGVOb2Rlc0Zyb21TZXJpYWxpemVkTm9kZXM9Ql87am8uJGdldEh0bWxDb250ZW50PUFfO2pvLiRnZXRMZXhpY2FsQ29udGVudD1EXztqby4kaW5zZXJ0RGF0YVRyYW5zZmVyRm9yUGxhaW5UZXh0PWZ1bmN0aW9uKGUsdCl7ZT1lLmdldERhdGEoInRleHQvcGxhaW4iKXx8ZS5nZXREYXRhKCJ0ZXh0L3VyaS1saXN0IiksZSE9bnVsbCYmdC5pbnNlcnRSYXdUZXh0KGUpfTtqby4kaW5zZXJ0RGF0YVRyYW5zZmVyRm9yUmljaFRleHQ9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPWUuZ2V0RGF0YSgiYXBwbGljYXRpb24veC1sZXhpY2FsLWVkaXRvciIpO2lmKG4pdHJ5e2xldCBsPUpTT04ucGFyc2Uobik7aWYobC5uYW1lc3BhY2U9PT1yLl9jb25maWcubmFtZXNwYWNlJiZBcnJheS5pc0FycmF5KGwubm9kZXMpKXtsZXQgcz1CXyhsLm5vZGVzKTtyZXR1cm4gYnkocixzLHQpfX1jYXRjaHt9aWYobj1lLmdldERhdGEoInRleHQvaHRtbCIpKXRyeXt2YXIgbz1uZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKG4sInRleHQvaHRtbCIpLGk9SV8uJGdlbmVyYXRlTm9kZXNGcm9tRE9NKHIsbyk7cmV0dXJuIGJ5KHIsaSx0KX1jYXRjaHt9aWYoZT1lLmdldERhdGEoInRleHQvcGxhaW4iKXx8ZS5nZXREYXRhKCJ0ZXh0L3VyaS1saXN0IiksZSE9bnVsbClpZihxLiRpc1JhbmdlU2VsZWN0aW9uKHQpKWZvcihlPWUuc3BsaXQoLyhccj9cbnxcdCkvKSxyPWUubGVuZ3RoLG89MDtvPHI7bysrKWk9ZVtvXSxpPT09XGAKXGB8fGk9PT1cYFxyClxgP3QuaW5zZXJ0UGFyYWdyYXBoKCk6aT09PSIJIj90Lmluc2VydE5vZGVzKFtxLiRjcmVhdGVUYWJOb2RlKCldKTp0Lmluc2VydFRleHQoaSk7ZWxzZSB0Lmluc2VydFJhd1RleHQoZSl9O2pvLiRpbnNlcnRHZW5lcmF0ZWROb2Rlcz1ieTtqby5jb3B5VG9DbGlwYm9hcmQ9YXN5bmMgZnVuY3Rpb24oZSx0KXtpZihLcyE9PW51bGwpcmV0dXJuITE7aWYodCE9PW51bGwpcmV0dXJuIG5ldyBQcm9taXNlKGw9PntlLnVwZGF0ZSgoKT0+e2woTV8oZSx0KSl9KX0pO3ZhciByPWUuZ2V0Um9vdEVsZW1lbnQoKTtsZXQgbj1lLl93aW5kb3c9PW51bGw/d2luZG93LmRvY3VtZW50OmUuX3dpbmRvdy5kb2N1bWVudCxvPUxfPyhlLl93aW5kb3d8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbDtpZihyPT09bnVsbHx8bz09PW51bGwpcmV0dXJuITE7bGV0IGk9bi5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGkuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGZpeGVkOyB0b3A6IC0xMDAwcHg7IixpLmFwcGVuZChuLmNyZWF0ZVRleHROb2RlKCIjIikpLHIuYXBwZW5kKGkpLHI9bmV3IFJhbmdlLHIuc2V0U3RhcnQoaSwwKSxyLnNldEVuZChpLDEpLG8ucmVtb3ZlQWxsUmFuZ2VzKCksby5hZGRSYW5nZShyKSxuZXcgUHJvbWlzZShsPT57bGV0IHM9ZS5yZWdpc3RlckNvbW1hbmQocS5DT1BZX0NPTU1BTkQsYT0+KFlzLm9iamVjdEtsYXNzRXF1YWxzKGEsQ2xpcGJvYXJkRXZlbnQpJiYocygpLEtzIT09bnVsbCYmKHdpbmRvdy5jbGVhclRpbWVvdXQoS3MpLEtzPW51bGwpLGwoTV8oZSxhKSkpLCEwKSxxLkNPTU1BTkRfUFJJT1JJVFlfQ1JJVElDQUwpO0tzPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57cygpLEtzPW51bGwsbCghMSl9LDUwKSxuLmV4ZWNDb21tYW5kKCJjb3B5IiksaS5yZW1vdmUoKX0pfX0pO3ZhciBqXz1WKChybmUsJF8pPT57InVzZSBzdHJpY3QiO3ZhciBBRT1GXygpOyRfLmV4cG9ydHM9QUV9KTt2YXIgVl89Vihpbz0+eyJ1c2Ugc3RyaWN0Ijt2YXIgRWQ9al8oKSxOZD12bCgpLG9vPUZvKCksXz1WcigpO2Z1bmN0aW9uIFdfKGUsdCl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50PCJ1Ij8oZT1kb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KGUsdCksZT09PW51bGw/bnVsbDp7bm9kZTplLnN0YXJ0Q29udGFpbmVyLG9mZnNldDplLnN0YXJ0T2Zmc2V0fSk6ZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCE9PSJ1bmRlZmluZWQiPyhlPWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoZSx0KSxlPT09bnVsbD9udWxsOntub2RlOmUub2Zmc2V0Tm9kZSxvZmZzZXQ6ZS5vZmZzZXR9KTpudWxsfXZhciBMaT10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsREU9TGkmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGw7TGkmJi9NYWN8aVBvZHxpUGhvbmV8aVBhZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pO0xpJiYvXig/IS4qU2VhbW9ua2V5KSg/PS4qRmlyZWZveCkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIE9FPUxpJiYiSW5wdXRFdmVudCJpbiB3aW5kb3cmJiFERT8iZ2V0VGFyZ2V0UmFuZ2VzImluIG5ldyB3aW5kb3cuSW5wdXRFdmVudCgiaW5wdXQiKTohMSx6RT1MaSYmL1ZlcnNpb25cL1tcZC5dKy4qU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLEJFPUxpJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbSxGRT1MaSYmL14oPz0uKkNocm9tZSkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksJEU9TGkmJi9BcHBsZVdlYktpdFwvW1xkLl0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhRkUsRXk9Xy5jcmVhdGVDb21tYW5kKCJEUkFHX0RST1BfUEFTVEVfRklMRSIpLGVjPWNsYXNzIGUgZXh0ZW5kcyBfLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInF1b3RlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBlKHQuX19rZXkpfWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWNyZWF0ZURPTSh0KXtsZXQgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJibG9ja3F1b3RlIik7cmV0dXJuIG9vLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQocix0LnRoZW1lLnF1b3RlKSxyfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YmxvY2txdW90ZTooKT0+KHtjb252ZXJzaW9uOmpFLHByaW9yaXR5OjB9KX19ZXhwb3J0RE9NKHQpe2lmKHtlbGVtZW50OnR9PXN1cGVyLmV4cG9ydERPTSh0KSx0JiZvby5pc0hUTUxFbGVtZW50KHQpKXt0aGlzLmlzRW1wdHkoKSYmdC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7dmFyIHI9dGhpcy5nZXRGb3JtYXRUeXBlKCk7dC5zdHlsZS50ZXh0QWxpZ249ciwocj10aGlzLmdldERpcmVjdGlvbigpKSYmKHQuZGlyPXIpfXJldHVybntlbGVtZW50OnR9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCByPVB5KCk7cmV0dXJuIHIuc2V0Rm9ybWF0KHQuZm9ybWF0KSxyLnNldEluZGVudCh0LmluZGVudCksci5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLHJ9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToicXVvdGUifX1pbnNlcnROZXdBZnRlcih0LHIpe3Q9Xy4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO2xldCBuPXRoaXMuZ2V0RGlyZWN0aW9uKCk7cmV0dXJuIHQuc2V0RGlyZWN0aW9uKG4pLHRoaXMuaW5zZXJ0QWZ0ZXIodCxyKSx0fWNvbGxhcHNlQXRTdGFydCgpe2xldCB0PV8uJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gocj0+dC5hcHBlbmQocikpLHRoaXMucmVwbGFjZSh0KSwhMH19O2Z1bmN0aW9uIFB5KCl7cmV0dXJuIF8uJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBlYyl9dmFyIHRjPWNsYXNzIGUgZXh0ZW5kcyBfLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImhlYWRpbmcifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IGUodC5fX3RhZyx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKHIpLHRoaXMuX190YWc9dH1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31jcmVhdGVET00odCl7bGV0IHI9dGhpcy5fX3RhZyxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocik7cmV0dXJuIHQ9dC50aGVtZS5oZWFkaW5nLHQhPT12b2lkIDAmJm9vLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQobix0W3JdKSxufXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57aDE6KCk9Pih7Y29udmVyc2lvbjpYcyxwcmlvcml0eTowfSksaDI6KCk9Pih7Y29udmVyc2lvbjpYcyxwcmlvcml0eTowfSksaDM6KCk9Pih7Y29udmVyc2lvbjpYcyxwcmlvcml0eTowfSksaDQ6KCk9Pih7Y29udmVyc2lvbjpYcyxwcmlvcml0eTowfSksaDU6KCk9Pih7Y29udmVyc2lvbjpYcyxwcmlvcml0eTowfSksaDY6KCk9Pih7Y29udmVyc2lvbjpYcyxwcmlvcml0eTowfSkscDp0PT4odD10LmZpcnN0Q2hpbGQsdCE9PW51bGwmJkhfKHQpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6bnVsbH0pLHByaW9yaXR5OjN9Om51bGwpLHNwYW46dD0+SF8odCk/e2NvbnZlcnNpb246KCk9Pih7bm9kZTpacygiaDEiKX0pLHByaW9yaXR5OjN9Om51bGx9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmb28uaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciByPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPXIsKHI9dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1yKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgcj1acyh0LnRhZyk7cmV0dXJuIHIuc2V0Rm9ybWF0KHQuZm9ybWF0KSxyLnNldEluZGVudCh0LmluZGVudCksci5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLHJ9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdGFnOnRoaXMuZ2V0VGFnKCksdHlwZToiaGVhZGluZyIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcih0LHI9ITApe3Q9dD90LmFuY2hvci5vZmZzZXQ6MCx0PTA8dCYmdDx0aGlzLmdldFRleHRDb250ZW50U2l6ZSgpP1pzKHRoaXMuZ2V0VGFnKCkpOl8uJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgbj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihuKSx0aGlzLmluc2VydEFmdGVyKHQsciksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD10aGlzLmlzRW1wdHkoKT9fLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk6WnModGhpcy5nZXRUYWcoKSk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKHI9PnQuYXBwZW5kKHIpKSx0aGlzLnJlcGxhY2UodCksITB9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiEwfX07ZnVuY3Rpb24gSF8oZSl7cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzcGFuIj9lLnN0eWxlLmZvbnRTaXplPT09IjI2cHQiOiExfWZ1bmN0aW9uIFhzKGUpe2xldCB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxyPW51bGw7cmV0dXJuKHQ9PT0iaDEifHx0PT09ImgyInx8dD09PSJoMyJ8fHQ9PT0iaDQifHx0PT09Img1Inx8dD09PSJoNiIpJiYocj1acyh0KSxlLnN0eWxlIT09bnVsbCYmci5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pKSx7bm9kZTpyfX1mdW5jdGlvbiBqRShlKXtsZXQgdD1QeSgpO3JldHVybiBlLnN0eWxlIT09bnVsbCYmdC5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pLHtub2RlOnR9fWZ1bmN0aW9uIFpzKGUpe3JldHVybiBfLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgdGMoZSkpfWZ1bmN0aW9uIFdFKGUsdCl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQudXBkYXRlKCgpPT57bGV0IHI9Xy4kZ2V0U2VsZWN0aW9uKCksbj1lIGluc3RhbmNlb2YgSW5wdXRFdmVudHx8ZSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQ/bnVsbDplLmNsaXBib2FyZERhdGE7biE9bnVsbCYmKF8uJGlzUmFuZ2VTZWxlY3Rpb24ocil8fF8uREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHIpKSYmRWQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KG4scix0KX0se3RhZzoicGFzdGUifSl9YXN5bmMgZnVuY3Rpb24gSEUoZSx0KXthd2FpdCBFZC5jb3B5VG9DbGlwYm9hcmQodCxvby5vYmplY3RLbGFzc0VxdWFscyhlLENsaXBib2FyZEV2ZW50KT9lOm51bGwpLHQudXBkYXRlKCgpPT57bGV0IHI9Xy4kZ2V0U2VsZWN0aW9uKCk7Xy4kaXNSYW5nZVNlbGVjdGlvbihyKT9yLnJlbW92ZVRleHQoKTpfLiRpc05vZGVTZWxlY3Rpb24ocikmJnIuZ2V0Tm9kZXMoKS5mb3JFYWNoKG49Pm4ucmVtb3ZlKCkpfSl9ZnVuY3Rpb24gSnUoZSl7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgRHJhZ0V2ZW50P3Q9ZS5kYXRhVHJhbnNmZXI6ZSBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50JiYodD1lLmNsaXBib2FyZERhdGEpLHQ9PT1udWxsKXJldHVyblshMSxbXSwhMV07dmFyIHI9dC50eXBlcztyZXR1cm4gZT1yLmluY2x1ZGVzKCJGaWxlcyIpLHI9ci5pbmNsdWRlcygidGV4dC9odG1sIil8fHIuaW5jbHVkZXMoInRleHQvcGxhaW4iKSxbZSxBcnJheS5mcm9tKHQuZmlsZXMpLHJdfWZ1bmN0aW9uIFVfKGUpe3ZhciB0PV8uJGdldFNlbGVjdGlvbigpO2lmKCFfLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXJldHVybiExO2xldCByPW5ldyBTZXQ7dD10LmdldE5vZGVzKCk7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBuPXRbaV0sbz1uLmdldEtleSgpO3IuaGFzKG8pfHwobj1vby4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhuKSxvPW4uZ2V0S2V5KCksbi5jYW5JbmRlbnQoKSYmIXIuaGFzKG8pJiYoci5hZGQobyksZShuKSkpfXJldHVybiAwPHIuc2l6ZX1mdW5jdGlvbiBiZChlKXtyZXR1cm4gZT1fLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGUpLF8uJGlzRGVjb3JhdG9yTm9kZShlKX1pby4kY3JlYXRlSGVhZGluZ05vZGU9WnM7aW8uJGNyZWF0ZVF1b3RlTm9kZT1QeTtpby4kaXNIZWFkaW5nTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHRjfTtpby4kaXNRdW90ZU5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBlY307aW8uRFJBR19EUk9QX1BBU1RFPUV5O2lvLkhlYWRpbmdOb2RlPXRjO2lvLlF1b3RlTm9kZT1lYztpby5ldmVudEZpbGVzPUp1O2lvLnJlZ2lzdGVyUmljaFRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG9vLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoXy5DTElDS19DT01NQU5ELCgpPT57bGV0IHQ9Xy4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIF8uJGlzTm9kZVNlbGVjdGlvbih0KT8odC5jbGVhcigpLCEwKTohMX0sMCksZS5yZWdpc3RlckNvbW1hbmQoXy5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsdD0+e2xldCByPV8uJGdldFNlbGVjdGlvbigpO3JldHVybiBfLiRpc1JhbmdlU2VsZWN0aW9uKHIpPyhyLmRlbGV0ZUNoYXJhY3Rlcih0KSwhMCk6ITF9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uREVMRVRFX1dPUkRfQ09NTUFORCx0PT57bGV0IHI9Xy4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIF8uJGlzUmFuZ2VTZWxlY3Rpb24ocik/KHIuZGVsZXRlV29yZCh0KSwhMCk6ITF9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uREVMRVRFX0xJTkVfQ09NTUFORCx0PT57bGV0IHI9Xy4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIF8uJGlzUmFuZ2VTZWxlY3Rpb24ocik/KHIuZGVsZXRlTGluZSh0KSwhMCk6ITF9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uQ09OVFJPTExFRF9URVhUX0lOU0VSVElPTl9DT01NQU5ELHQ9PntsZXQgcj1fLiRnZXRTZWxlY3Rpb24oKTtpZih0eXBlb2YgdD09InN0cmluZyIpXy4kaXNSYW5nZVNlbGVjdGlvbihyKT9yLmluc2VydFRleHQodCk6Xy5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24ocik7ZWxzZXtpZighXy4kaXNSYW5nZVNlbGVjdGlvbihyKSYmIV8uREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHIpKXJldHVybiExO2xldCBuPXQuZGF0YVRyYW5zZmVyO24hPW51bGw/RWQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KG4scixlKTpfLiRpc1JhbmdlU2VsZWN0aW9uKHIpJiYodD10LmRhdGEpJiZyLmluc2VydFRleHQodCl9cmV0dXJuITB9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uUkVNT1ZFX1RFWFRfQ09NTUFORCwoKT0+e2xldCB0PV8uJGdldFNlbGVjdGlvbigpO3JldHVybiBfLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyh0LnJlbW92ZVRleHQoKSwhMCk6ITF9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uRk9STUFUX1RFWFRfQ09NTUFORCx0PT57bGV0IHI9Xy4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIF8uJGlzUmFuZ2VTZWxlY3Rpb24ocik/KHIuZm9ybWF0VGV4dCh0KSwhMCk6ITF9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uRk9STUFUX0VMRU1FTlRfQ09NTUFORCx0PT57dmFyIHI9Xy4kZ2V0U2VsZWN0aW9uKCk7aWYoIV8uJGlzUmFuZ2VTZWxlY3Rpb24ocikmJiFfLiRpc05vZGVTZWxlY3Rpb24ocikpcmV0dXJuITE7cj1yLmdldE5vZGVzKCk7Zm9yKGxldCBuIG9mIHIpcj1vby4kZmluZE1hdGNoaW5nUGFyZW50KG4sbz0+Xy4kaXNFbGVtZW50Tm9kZShvKSYmIW8uaXNJbmxpbmUoKSksciE9PW51bGwmJnIuc2V0Rm9ybWF0KHQpO3JldHVybiEwfSxfLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChfLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQsdD0+e2xldCByPV8uJGdldFNlbGVjdGlvbigpO3JldHVybiBfLiRpc1JhbmdlU2VsZWN0aW9uKHIpPyhyLmluc2VydExpbmVCcmVhayh0KSwhMCk6ITF9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uSU5TRVJUX1BBUkFHUkFQSF9DT01NQU5ELCgpPT57bGV0IHQ9Xy4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIF8uJGlzUmFuZ2VTZWxlY3Rpb24odCk/KHQuaW5zZXJ0UGFyYWdyYXBoKCksITApOiExfSxfLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChfLklOU0VSVF9UQUJfQ09NTUFORCwoKT0+KF8uJGluc2VydE5vZGVzKFtfLiRjcmVhdGVUYWJOb2RlKCldKSwhMCksXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5JTkRFTlRfQ09OVEVOVF9DT01NQU5ELCgpPT5VXyh0PT57bGV0IHI9dC5nZXRJbmRlbnQoKTt0LnNldEluZGVudChyKzEpfSksXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+VV8odD0+e2xldCByPXQuZ2V0SW5kZW50KCk7MDxyJiZ0LnNldEluZGVudChyLTEpfSksXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5LRVlfQVJST1dfVVBfQ09NTUFORCx0PT57dmFyIHI9Xy4kZ2V0U2VsZWN0aW9uKCk7aWYoXy4kaXNOb2RlU2VsZWN0aW9uKHIpJiYhYmQodC50YXJnZXQpKXtpZih0PXIuZ2V0Tm9kZXMoKSwwPHQubGVuZ3RoKXJldHVybiB0WzBdLnNlbGVjdFByZXZpb3VzKCksITB9ZWxzZSBpZihfLiRpc1JhbmdlU2VsZWN0aW9uKHIpJiYocj1fLiRnZXRBZGphY2VudE5vZGUoci5mb2N1cywhMCksIXQuc2hpZnRLZXkmJl8uJGlzRGVjb3JhdG9yTm9kZShyKSYmIXIuaXNJc29sYXRlZCgpJiYhci5pc0lubGluZSgpKSlyZXR1cm4gci5zZWxlY3RQcmV2aW91cygpLHQucHJldmVudERlZmF1bHQoKSwhMDtyZXR1cm4hMX0sXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5LRVlfQVJST1dfRE9XTl9DT01NQU5ELHQ9Pnt2YXIgcj1fLiRnZXRTZWxlY3Rpb24oKTtpZihfLiRpc05vZGVTZWxlY3Rpb24ocikpe2lmKHQ9ci5nZXROb2RlcygpLDA8dC5sZW5ndGgpcmV0dXJuIHRbMF0uc2VsZWN0TmV4dCgwLDApLCEwfWVsc2UgaWYoXy4kaXNSYW5nZVNlbGVjdGlvbihyKSl7bGV0IG49ci5mb2N1cztpZihuLmtleT09PSJyb290IiYmbi5vZmZzZXQ9PT1fLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW5TaXplKCkpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMDtpZihyPV8uJGdldEFkamFjZW50Tm9kZShyLmZvY3VzLCExKSwhdC5zaGlmdEtleSYmXy4kaXNEZWNvcmF0b3JOb2RlKHIpJiYhci5pc0lzb2xhdGVkKCkmJiFyLmlzSW5saW5lKCkpcmV0dXJuIHIuc2VsZWN0TmV4dCgpLHQucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMX0sXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5LRVlfQVJST1dfTEVGVF9DT01NQU5ELHQ9PntsZXQgcj1fLiRnZXRTZWxlY3Rpb24oKTtpZihfLiRpc05vZGVTZWxlY3Rpb24ocikpe3ZhciBuPXIuZ2V0Tm9kZXMoKTtpZigwPG4ubGVuZ3RoKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksblswXS5zZWxlY3RQcmV2aW91cygpLCEwfXJldHVybiBfLiRpc1JhbmdlU2VsZWN0aW9uKHIpJiZOZC4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKHIsITApPyhuPXQuc2hpZnRLZXksdC5wcmV2ZW50RGVmYXVsdCgpLE5kLiRtb3ZlQ2hhcmFjdGVyKHIsbiwhMCksITApOiExfSxfLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChfLktFWV9BUlJPV19SSUdIVF9DT01NQU5ELHQ9PntsZXQgcj1fLiRnZXRTZWxlY3Rpb24oKTtpZihfLiRpc05vZGVTZWxlY3Rpb24ocikmJiFiZCh0LnRhcmdldCkpe3ZhciBuPXIuZ2V0Tm9kZXMoKTtpZigwPG4ubGVuZ3RoKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksblswXS5zZWxlY3ROZXh0KDAsMCksITB9cmV0dXJuIF8uJGlzUmFuZ2VTZWxlY3Rpb24ocik/KG49dC5zaGlmdEtleSxOZC4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKHIsITEpPyh0LnByZXZlbnREZWZhdWx0KCksTmQuJG1vdmVDaGFyYWN0ZXIocixuLCExKSwhMCk6ITEpOiExfSxfLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChfLktFWV9CQUNLU1BBQ0VfQ09NTUFORCx0PT57aWYoYmQodC50YXJnZXQpKXJldHVybiExO2xldCByPV8uJGdldFNlbGVjdGlvbigpO2lmKCFfLiRpc1JhbmdlU2VsZWN0aW9uKHIpKXJldHVybiExO3QucHJldmVudERlZmF1bHQoKSx7YW5jaG9yOnR9PXI7bGV0IG49dC5nZXROb2RlKCk7cmV0dXJuIHIuaXNDb2xsYXBzZWQoKSYmdC5vZmZzZXQ9PT0wJiYhXy4kaXNSb290Tm9kZShuKSYmMDxvby4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhuKS5nZXRJbmRlbnQoKT9lLmRpc3BhdGNoQ29tbWFuZChfLk9VVERFTlRfQ09OVEVOVF9DT01NQU5ELHZvaWQgMCk6ZS5kaXNwYXRjaENvbW1hbmQoXy5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITApfSxfLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChfLktFWV9ERUxFVEVfQ09NTUFORCx0PT57aWYoYmQodC50YXJnZXQpKXJldHVybiExO2xldCByPV8uJGdldFNlbGVjdGlvbigpO3JldHVybiBfLiRpc1JhbmdlU2VsZWN0aW9uKHIpPyh0LnByZXZlbnREZWZhdWx0KCksZS5kaXNwYXRjaENvbW1hbmQoXy5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITEpKTohMX0sXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5LRVlfRU5URVJfQ09NTUFORCx0PT57bGV0IHI9Xy4kZ2V0U2VsZWN0aW9uKCk7aWYoIV8uJGlzUmFuZ2VTZWxlY3Rpb24ocikpcmV0dXJuITE7aWYodCE9PW51bGwpe2lmKChCRXx8ekV8fCRFKSYmT0UpcmV0dXJuITE7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc2hpZnRLZXkpcmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKF8uSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORCwhMSl9cmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKF8uSU5TRVJUX1BBUkFHUkFQSF9DT01NQU5ELHZvaWQgMCl9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uS0VZX0VTQ0FQRV9DT01NQU5ELCgpPT57bGV0IHQ9Xy4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIF8uJGlzUmFuZ2VTZWxlY3Rpb24odCk/KGUuYmx1cigpLCEwKTohMX0sXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5EUk9QX0NPTU1BTkQsdD0+e2xldFsscl09SnUodCk7aWYoMDxyLmxlbmd0aCl7dmFyIG49V18odC5jbGllbnRYLHQuY2xpZW50WSk7aWYobiE9PW51bGwpe2xldHtvZmZzZXQ6aSxub2RlOmx9PW47dmFyIG89Xy4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZShsKTtpZihvIT09bnVsbCl7aWYobj1fLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLF8uJGlzVGV4dE5vZGUobykpbi5hbmNob3Iuc2V0KG8uZ2V0S2V5KCksaSwidGV4dCIpLG4uZm9jdXMuc2V0KG8uZ2V0S2V5KCksaSwidGV4dCIpO2Vsc2V7bGV0IHM9by5nZXRQYXJlbnRPclRocm93KCkuZ2V0S2V5KCk7bz1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSxuLmFuY2hvci5zZXQocyxvLCJlbGVtZW50Iiksbi5mb2N1cy5zZXQocyxvLCJlbGVtZW50Iil9bj1fLiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTChuKSxfLiRzZXRTZWxlY3Rpb24obil9ZS5kaXNwYXRjaENvbW1hbmQoRXkscil9cmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4gdD1fLiRnZXRTZWxlY3Rpb24oKSwhIV8uJGlzUmFuZ2VTZWxlY3Rpb24odCl9LF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uRFJBR1NUQVJUX0NPTU1BTkQsdD0+e1t0XT1KdSh0KTtsZXQgcj1fLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4hKHQmJiFfLiRpc1JhbmdlU2VsZWN0aW9uKHIpKX0sXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5EUkFHT1ZFUl9DT01NQU5ELHQ9Pnt2YXJbcl09SnUodCk7bGV0IG49Xy4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIHImJiFfLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyExOihyPVdfKHQuY2xpZW50WCx0LmNsaWVudFkpLHIhPT1udWxsJiYocj1fLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKHIubm9kZSksXy4kaXNEZWNvcmF0b3JOb2RlKHIpJiZ0LnByZXZlbnREZWZhdWx0KCkpLCEwKX0sXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5TRUxFQ1RfQUxMX0NPTU1BTkQsKCk9PihfLiRzZWxlY3RBbGwoKSwhMCksXy5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoXy5DT1BZX0NPTU1BTkQsdD0+KEVkLmNvcHlUb0NsaXBib2FyZChlLG9vLm9iamVjdEtsYXNzRXF1YWxzKHQsQ2xpcGJvYXJkRXZlbnQpP3Q6bnVsbCksITApLF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uQ1VUX0NPTU1BTkQsdD0+KEhFKHQsZSksITApLF8uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF8uUEFTVEVfQ09NTUFORCx0PT57bGV0WyxyLG5dPUp1KHQpO2lmKDA8ci5sZW5ndGgmJiFuKXJldHVybiBlLmRpc3BhdGNoQ29tbWFuZChFeSxyKSwhMDtpZihfLmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0KHQudGFyZ2V0KSlyZXR1cm4hMTtsZXQgbz1fLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gXy4kaXNSYW5nZVNlbGVjdGlvbihvKXx8Xy5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obyk/KFdFKHQsZSksITApOiExfSxfLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9fSk7dmFyIEdfPVYoKG9uZSxSXyk9PnsidXNlIHN0cmljdCI7dmFyIFVFPVZfKCk7Ul8uZXhwb3J0cz1VRX0pO3ZhciBaXz1WKFhfPT57InVzZSBzdHJpY3QiO3ZhciBLXz1BbygpLFZFPXJfKCksU249VCgpLFJFPXNfKCksWV89Rm8oKSxxXz1sbCgpLEdFPVRfKCkscUU9R18oKSxNeT10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSI/U24udXNlTGF5b3V0RWZmZWN0OlNuLnVzZUVmZmVjdDtmdW5jdGlvbiBRXyhlKXtyZXR1cm4gZS5nZXRFZGl0b3JTdGF0ZSgpLnJlYWQoUkUuJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5KGUuaXNDb21wb3NpbmcoKSkpfWZ1bmN0aW9uIFFFKGUpe2xldFt0LHJdPVNuLnVzZVN0YXRlKCgpPT5RXyhlKSk7cmV0dXJuIE15KCgpPT57ZnVuY3Rpb24gbigpe2xldCBvPVFfKGUpO3Iobyl9cmV0dXJuIG4oKSxZXy5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoKT0+e24oKX0pLGUucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKCgpPT57bigpfSkpfSxbZV0pLHR9ZnVuY3Rpb24gS0UoZSx0KXtsZXRbcixuXT1Tbi51c2VTdGF0ZSgoKT0+ZS5nZXREZWNvcmF0b3JzKCkpO3JldHVybiBNeSgoKT0+ZS5yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKG89PntxXy5mbHVzaFN5bmMoKCk9PntuKG8pfSl9KSxbZV0pLFNuLnVzZUVmZmVjdCgoKT0+e24oZS5nZXREZWNvcmF0b3JzKCkpfSxbZV0pLFNuLnVzZU1lbW8oKCk9PntsZXQgbz1bXSxpPU9iamVjdC5rZXlzKHIpO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7bCsrKXtsZXQgcz1pW2xdLGE9U24uY3JlYXRlRWxlbWVudCh0LHtvbkVycm9yOnA9PmUuX29uRXJyb3IocCl9LFNuLmNyZWF0ZUVsZW1lbnQoU24uU3VzcGVuc2Use2ZhbGxiYWNrOm51bGx9LHJbc10pKSx1PWUuZ2V0RWxlbWVudEJ5S2V5KHMpO3UhPT1udWxsJiZvLnB1c2gocV8uY3JlYXRlUG9ydGFsKGEsdSxzKSl9cmV0dXJuIG99LFt0LHIsZV0pfWZ1bmN0aW9uIFlFKGUpe015KCgpPT5ZXy5tZXJnZVJlZ2lzdGVyKHFFLnJlZ2lzdGVyUmljaFRleHQoZSksR0UucmVnaXN0ZXJEcmFnb25TdXBwb3J0KGUpKSxbZV0pfWZ1bmN0aW9uIFhFKHtjb250ZW50OmV9KXt2YXJbdF09S18udXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3Q9UUUodCk7bGV0IHI9VkUoKTtyZXR1cm4gdD90eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHIpOmU6bnVsbH1YXy5SaWNoVGV4dFBsdWdpbj1mdW5jdGlvbih7Y29udGVudEVkaXRhYmxlOmUscGxhY2Vob2xkZXI6dCxFcnJvckJvdW5kYXJ5OnJ9KXtsZXRbbl09S18udXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiByPUtFKG4sciksWUUobiksU24uY3JlYXRlRWxlbWVudChTbi5GcmFnbWVudCxudWxsLGUsU24uY3JlYXRlRWxlbWVudChYRSx7Y29udGVudDp0fSkscil9fSk7dmFyIGVrPVYoKGxuZSxKXyk9PnsidXNlIHN0cmljdCI7dmFyIFpFPVpfKCk7Sl8uZXhwb3J0cz1aRX0pO3ZhciByaz1WKHRrPT57InVzZSBzdHJpY3QiO3ZhciBKRT1BbygpLHJjPVQoKTtmdW5jdGlvbiBJeSgpe3JldHVybiBJeT1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciByPWFyZ3VtZW50c1t0XSxuO2ZvcihuIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsbikmJihlW25dPXJbbl0pfXJldHVybiBlfSxJeS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIGU4PXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9yYy51c2VMYXlvdXRFZmZlY3Q6cmMudXNlRWZmZWN0O3RrLkNvbnRlbnRFZGl0YWJsZT1mdW5jdGlvbih7YXJpYUFjdGl2ZURlc2NlbmRhbnQ6ZSxhcmlhQXV0b0NvbXBsZXRlOnQsYXJpYUNvbnRyb2xzOnIsYXJpYURlc2NyaWJlZEJ5Om4sYXJpYUV4cGFuZGVkOm8sYXJpYUxhYmVsOmksYXJpYUxhYmVsbGVkQnk6bCxhcmlhTXVsdGlsaW5lOnMsYXJpYU93bnM6YSxhcmlhUmVxdWlyZWQ6dSxhdXRvQ2FwaXRhbGl6ZTpwLGNsYXNzTmFtZTpjLGlkOmYscm9sZTpkPSJ0ZXh0Ym94IixzcGVsbENoZWNrOm09ITAsc3R5bGU6aCx0YWJJbmRleDpTLCJkYXRhLXRlc3RpZCI6eSwuLi52fSl7bGV0W2ddPUpFLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxbQyxrXT1yYy51c2VTdGF0ZSghMSksRD1yYy51c2VDYWxsYmFjayhPPT57Zy5zZXRSb290RWxlbWVudChPKX0sW2ddKTtyZXR1cm4gZTgoKCk9PihrKGcuaXNFZGl0YWJsZSgpKSxnLnJlZ2lzdGVyRWRpdGFibGVMaXN0ZW5lcihPPT57ayhPKX0pKSxbZ10pLHJjLmNyZWF0ZUVsZW1lbnQoImRpdiIsSXkoe30sdix7ImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6Qz9lOnZvaWQgMCwiYXJpYS1hdXRvY29tcGxldGUiOkM/dDoibm9uZSIsImFyaWEtY29udHJvbHMiOkM/cjp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOm4sImFyaWEtZXhwYW5kZWQiOkMmJmQ9PT0iY29tYm9ib3giPyEhbzp2b2lkIDAsImFyaWEtbGFiZWwiOmksImFyaWEtbGFiZWxsZWRieSI6bCwiYXJpYS1tdWx0aWxpbmUiOnMsImFyaWEtb3ducyI6Qz9hOnZvaWQgMCwiYXJpYS1yZWFkb25seSI6Qz92b2lkIDA6ITAsImFyaWEtcmVxdWlyZWQiOnUsYXV0b0NhcGl0YWxpemU6cCxjbGFzc05hbWU6Yyxjb250ZW50RWRpdGFibGU6QywiZGF0YS10ZXN0aWQiOnksaWQ6ZixyZWY6RCxyb2xlOmQsc3BlbGxDaGVjazptLHN0eWxlOmgsdGFiSW5kZXg6U30pKX19KTt2YXIgb2s9VigoYW5lLG5rKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgdDg9cmsoKTtuay5leHBvcnRzPXQ4fSk7dmFyIGlrPVYoTHk9PnsidXNlIHN0cmljdCI7dmFyIHI4PUZvKCksX2U9VnIoKTtmdW5jdGlvbiBuOChlLHQscixuLG8pe2lmKGU9PT1udWxsfHxyLnNpemU9PT0wJiZuLnNpemU9PT0wJiYhbylyZXR1cm4gMDt2YXIgaT10Ll9zZWxlY3Rpb24sbD1lLl9zZWxlY3Rpb247aWYobylyZXR1cm4gMTtpZighKF9lLiRpc1JhbmdlU2VsZWN0aW9uKGkpJiZfZS4kaXNSYW5nZVNlbGVjdGlvbihsKSYmbC5pc0NvbGxhcHNlZCgpJiZpLmlzQ29sbGFwc2VkKCkpKXJldHVybiAwO289dC5fbm9kZU1hcDtsZXQgcz1bXTtmb3IobGV0IGEgb2YgcilyPW8uZ2V0KGEpLHIhPT12b2lkIDAmJnMucHVzaChyKTtmb3IobGV0W2EsdV1vZiBuKXUmJihuPW8uZ2V0KGEpLG49PT12b2lkIDB8fF9lLiRpc1Jvb3ROb2RlKG4pfHxzLnB1c2gobikpO3JldHVybiBzLmxlbmd0aD09PTA/MDoxPHMubGVuZ3RoPyhuPXQuX25vZGVNYXAsdD1uLmdldChpLmFuY2hvci5rZXkpLGw9bi5nZXQobC5hbmNob3Iua2V5KSx0JiZsJiYhZS5fbm9kZU1hcC5oYXModC5fX2tleSkmJl9lLiRpc1RleHROb2RlKHQpJiZ0Ll9fdGV4dC5sZW5ndGg9PT0xJiZpLmFuY2hvci5vZmZzZXQ9PT0xPzI6MCk6KHQ9c1swXSxlPWUuX25vZGVNYXAuZ2V0KHQuX19rZXkpLCFfZS4kaXNUZXh0Tm9kZShlKXx8IV9lLiRpc1RleHROb2RlKHQpfHxlLl9fbW9kZSE9PXQuX19tb2RlfHwoZT1lLl9fdGV4dCx0PXQuX190ZXh0LGU9PT10KXx8KGk9aS5hbmNob3IsbD1sLmFuY2hvcixpLmtleSE9PWwua2V5fHxpLnR5cGUhPT0idGV4dCIpPzA6KGk9aS5vZmZzZXQsbD1sLm9mZnNldCxlPXQubGVuZ3RoLWUubGVuZ3RoLGU9PT0xJiZsPT09aS0xPzI6ZT09PS0xJiZsPT09aSsxPzM6ZT09PS0xJiZsPT09aT80OjApKX1mdW5jdGlvbiBvOChlLHQpe2xldCByPURhdGUubm93KCksbj0wO3JldHVybihvLGksbCxzLGEsdSk9PntsZXQgcD1EYXRlLm5vdygpO2lmKHUuaGFzKCJoaXN0b3JpYyIpKXJldHVybiBuPTAscj1wLDI7bGV0IGM9bjgobyxpLHMsYSxlLmlzQ29tcG9zaW5nKCkpLGY9KCgpPT57dmFyIGQ9bD09PW51bGx8fGwuZWRpdG9yPT09ZSxtPXUuaGFzKCJoaXN0b3J5LXB1c2giKTtpZighbSYmZCYmdS5oYXMoImhpc3RvcnktbWVyZ2UiKSlyZXR1cm4gMDtpZihvPT09bnVsbClyZXR1cm4gMTt2YXIgaD1pLl9zZWxlY3Rpb247aWYoISgwPHMuc2l6ZXx8MDxhLnNpemUpKXJldHVybiBoIT09bnVsbD8wOjI7aWYobT09PSExJiZjIT09MCYmYz09PW4mJnA8cit0JiZkKXJldHVybiAwO2lmKHMuc2l6ZT09PTEpe3ttPUFycmF5LmZyb20ocylbMF0sZD1vLl9ub2RlTWFwLmdldChtKSxtPWkuX25vZGVNYXAuZ2V0KG0pLGg9by5fc2VsZWN0aW9uO2xldCBTPWkuX3NlbGVjdGlvbix5PSExO19lLiRpc1JhbmdlU2VsZWN0aW9uKGgpJiZfZS4kaXNSYW5nZVNlbGVjdGlvbihTKSYmKHk9aC5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmaC5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZTLmFuY2hvci50eXBlPT09InRleHQiJiZTLmZvY3VzLnR5cGU9PT0idGV4dCIpLGQ9IXkmJl9lLiRpc1RleHROb2RlKGQpJiZfZS4kaXNUZXh0Tm9kZShtKT9kLl9fdHlwZT09PW0uX190eXBlJiZkLl9fdGV4dD09PW0uX190ZXh0JiZkLl9fbW9kZT09PW0uX19tb2RlJiZkLl9fZGV0YWlsPT09bS5fX2RldGFpbCYmZC5fX3N0eWxlPT09bS5fX3N0eWxlJiZkLl9fZm9ybWF0PT09bS5fX2Zvcm1hdCYmZC5fX3BhcmVudD09PW0uX19wYXJlbnQ6ITF9aWYoZClyZXR1cm4gMH1yZXR1cm4gMX0pKCk7cmV0dXJuIHI9cCxuPWMsZn19THkuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpudWxsLHJlZG9TdGFjazpbXSx1bmRvU3RhY2s6W119fTtMeS5yZWdpc3Rlckhpc3Rvcnk9ZnVuY3Rpb24oZSx0LHIpe2xldCBuPW84KGUscik7cj0oe2VkaXRvclN0YXRlOmwscHJldkVkaXRvclN0YXRlOnMsZGlydHlMZWF2ZXM6YSxkaXJ0eUVsZW1lbnRzOnUsdGFnczpwfSk9PntsZXQgYz10LmN1cnJlbnQsZj10LnJlZG9TdGFjayxkPXQudW5kb1N0YWNrLG09Yz09PW51bGw/bnVsbDpjLmVkaXRvclN0YXRlO2lmKGM9PT1udWxsfHxsIT09bSl7aWYocz1uKHMsbCxjLGEsdSxwKSxzPT09MSlmLmxlbmd0aCE9PTAmJih0LnJlZG9TdGFjaz1bXSxlLmRpc3BhdGNoQ29tbWFuZChfZS5DQU5fUkVET19DT01NQU5ELCExKSksYyE9PW51bGwmJihkLnB1c2goey4uLmN9KSxlLmRpc3BhdGNoQ29tbWFuZChfZS5DQU5fVU5ET19DT01NQU5ELCEwKSk7ZWxzZSBpZihzPT09MilyZXR1cm47dC5jdXJyZW50PXtlZGl0b3I6ZSxlZGl0b3JTdGF0ZTpsfX19O2xldCBvPXI4Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoX2UuVU5ET19DT01NQU5ELCgpPT57bGV0IGw9dC5yZWRvU3RhY2sscz10LnVuZG9TdGFjaztpZihzLmxlbmd0aCE9PTApe2xldCBhPXQuY3VycmVudCx1PXMucG9wKCk7YSE9PW51bGwmJihsLnB1c2goYSksZS5kaXNwYXRjaENvbW1hbmQoX2UuQ0FOX1JFRE9fQ09NTUFORCwhMCkpLHMubGVuZ3RoPT09MCYmZS5kaXNwYXRjaENvbW1hbmQoX2UuQ0FOX1VORE9fQ09NTUFORCwhMSksdC5jdXJyZW50PXV8fG51bGwsdSYmdS5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUodS5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0sX2UuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF9lLlJFRE9fQ09NTUFORCwoKT0+e2xldCBsPXQucmVkb1N0YWNrO3ZhciBzPXQudW5kb1N0YWNrO2lmKGwubGVuZ3RoIT09MCl7bGV0IGE9dC5jdXJyZW50O2EhPT1udWxsJiYocy5wdXNoKGEpLGUuZGlzcGF0Y2hDb21tYW5kKF9lLkNBTl9VTkRPX0NPTU1BTkQsITApKSxzPWwucG9wKCksbC5sZW5ndGg9PT0wJiZlLmRpc3BhdGNoQ29tbWFuZChfZS5DQU5fUkVET19DT01NQU5ELCExKSx0LmN1cnJlbnQ9c3x8bnVsbCxzJiZzLmVkaXRvci5zZXRFZGl0b3JTdGF0ZShzLmVkaXRvclN0YXRlLHt0YWc6Imhpc3RvcmljIn0pfXJldHVybiEwfSxfZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoX2UuQ0xFQVJfRURJVE9SX0NPTU1BTkQsKCk9Pih0LnVuZG9TdGFjaz1bXSx0LnJlZG9TdGFjaz1bXSx0LmN1cnJlbnQ9bnVsbCwhMSksX2UuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKF9lLkNMRUFSX0hJU1RPUllfQ09NTUFORCwoKT0+KHQudW5kb1N0YWNrPVtdLHQucmVkb1N0YWNrPVtdLHQuY3VycmVudD1udWxsLGUuZGlzcGF0Y2hDb21tYW5kKF9lLkNBTl9SRURPX0NPTU1BTkQsITEpLGUuZGlzcGF0Y2hDb21tYW5kKF9lLkNBTl9VTkRPX0NPTU1BTkQsITEpLCEwKSxfZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKHIpKSxpPWUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihyKTtyZXR1cm4oKT0+e28oKSxpKCl9fX0pO3ZhciBzaz1WKChjbmUsbGspPT57InVzZSBzdHJpY3QiO3ZhciBpOD1paygpO2xrLmV4cG9ydHM9aTh9KTt2YXIgdWs9VihEeT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgbDg9QW8oKSxBeT1zaygpLGFrPVQoKTtmdW5jdGlvbiBzOChlLHQscj0xZTMpe2xldCBuPWFrLnVzZU1lbW8oKCk9PnR8fEF5LmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlKCksW3RdKTthay51c2VFZmZlY3QoKCk9PkF5LnJlZ2lzdGVySGlzdG9yeShlLG4sciksW3IsZSxuXSl9RHkuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9QXkuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU7RHkuSGlzdG9yeVBsdWdpbj1mdW5jdGlvbih7ZXh0ZXJuYWxIaXN0b3J5U3RhdGU6ZX0pe2xldFt0XT1sOC51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIHM4KHQsZSksbnVsbH19KTt2YXIgcGs9VigoZm5lLGNrKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgYTg9dWsoKTtjay5leHBvcnRzPWE4fSk7dmFyIG1rPVYoKGRuZSxkayk9PnsidXNlIHN0cmljdCI7dmFyIG5jPVQoKTtmdW5jdGlvbiBPeShlLHQpe3JldHVybiBPeT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLG4pe3JldHVybiByLl9fcHJvdG9fXz1uLHJ9LE95KGUsdCl9ZnVuY3Rpb24gdTgoZSx0KXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLE95KGUsdCl9ZnVuY3Rpb24gYzgoZSx0KXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9W10pLHQ9PT12b2lkIDAmJih0PVtdKSxlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoZnVuY3Rpb24ocixuKXtyZXR1cm4hT2JqZWN0LmlzKHIsdFtuXSl9KX12YXIgZms9e2Vycm9yOm51bGx9LHA4PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtmb3IodmFyIG4sbz1hcmd1bWVudHMubGVuZ3RoLGk9QXJyYXkobyksbD0wO2w8bztsKyspaVtsXT1hcmd1bWVudHNbbF07cmV0dXJuIG49ZS5jYWxsLmFwcGx5KGUsW3RoaXNdLmNvbmNhdChpKSl8fHRoaXMsbi5zdGF0ZT1mayxuLnJlc2V0RXJyb3JCb3VuZGFyeT1mdW5jdGlvbigpe2Zvcih2YXIgcyxhPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShhKSxwPTA7cDxhO3ArKyl1W3BdPWFyZ3VtZW50c1twXTtuLnByb3BzLm9uUmVzZXQ9PW51bGx8fChzPW4ucHJvcHMpLm9uUmVzZXQuYXBwbHkocyx1KSxuLnJlc2V0KCl9LG59dTgodCxlKSx0LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj1mdW5jdGlvbihuKXtyZXR1cm57ZXJyb3I6bn19O3ZhciByPXQucHJvdG90eXBlO3JldHVybiByLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zZXRTdGF0ZShmayl9LHIuY29tcG9uZW50RGlkQ2F0Y2g9ZnVuY3Rpb24obixvKXt2YXIgaSxsOyhpPShsPXRoaXMucHJvcHMpLm9uRXJyb3IpPT1udWxsfHxpLmNhbGwobCxuLG8pfSxyLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihuLG8pe3ZhciBpPXRoaXMucHJvcHMucmVzZXRLZXlzO2lmKHRoaXMuc3RhdGUuZXJyb3IhPT1udWxsJiZvLmVycm9yIT09bnVsbCYmYzgobi5yZXNldEtleXMsaSkpe3ZhciBsLHM7KGw9KHM9dGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpPT1udWxsfHxsLmNhbGwocyxuLnJlc2V0S2V5cyxpKSx0aGlzLnJlc2V0KCl9fSxyLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBuPXRoaXMuc3RhdGUuZXJyb3Isbz10aGlzLnByb3BzLGk9by5mYWxsYmFja1JlbmRlcixsPW8uRmFsbGJhY2tDb21wb25lbnQ7aWYobz1vLmZhbGxiYWNrLG4hPT1udWxsKXtpZihuPXtlcnJvcjpuLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX0sbmMuaXNWYWxpZEVsZW1lbnQobykpcmV0dXJuIG87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpcmV0dXJuIGkobik7aWYobClyZXR1cm4gbmMuY3JlYXRlRWxlbWVudChsLG4pO3Rocm93IEVycm9yKCJyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AiKX1yZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn0sdH0obmMuQ29tcG9uZW50KTtkay5leHBvcnRzPWZ1bmN0aW9uKHtjaGlsZHJlbjplLG9uRXJyb3I6dH0pe3JldHVybiBuYy5jcmVhdGVFbGVtZW50KHA4LHtmYWxsYmFjazpuYy5jcmVhdGVFbGVtZW50KCJkaXYiLHtzdHlsZTp7Ym9yZGVyOiIxcHggc29saWQgI2YwMCIsY29sb3I6IiNmMDAiLHBhZGRpbmc6IjhweCJ9fSwiQW4gZXJyb3Igd2FzIHRocm93bi4iKSxvbkVycm9yOnR9LGUpfX0pO3ZhciBnaz1WKChtbmUsaGspPT57InVzZSBzdHJpY3QiO3ZhciBmOD1taygpO2hrLmV4cG9ydHM9Zjh9KTt2YXIgdms9VihXbz0+eyJ1c2Ugc3RyaWN0Ijt2YXIgeWs9Rm8oKSxsbz1WcigpLGQ4PW5ldyBTZXQoWyJodHRwOiIsImh0dHBzOiIsIm1haWx0bzoiLCJzbXM6IiwidGVsOiJdKSxKcz1jbGFzcyBlIGV4dGVuZHMgbG8uRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgZSh0Ll9fdXJsLHtyZWw6dC5fX3JlbCx0YXJnZXQ6dC5fX3RhcmdldCx0aXRsZTp0Ll9fdGl0bGV9LHQuX19rZXkpfWNvbnN0cnVjdG9yKHQscj17fSxuKXtzdXBlcihuKTtsZXR7dGFyZ2V0Om89bnVsbCxyZWw6aT1udWxsLHRpdGxlOmw9bnVsbH09cjt0aGlzLl9fdXJsPXQsdGhpcy5fX3RhcmdldD1vLHRoaXMuX19yZWw9aSx0aGlzLl9fdGl0bGU9bH1jcmVhdGVET00odCl7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO3JldHVybiByLmhyZWY9dGhpcy5zYW5pdGl6ZVVybCh0aGlzLl9fdXJsKSx0aGlzLl9fdGFyZ2V0IT09bnVsbCYmKHIudGFyZ2V0PXRoaXMuX190YXJnZXQpLHRoaXMuX19yZWwhPT1udWxsJiYoci5yZWw9dGhpcy5fX3JlbCksdGhpcy5fX3RpdGxlIT09bnVsbCYmKHIudGl0bGU9dGhpcy5fX3RpdGxlKSx5ay5hZGRDbGFzc05hbWVzVG9FbGVtZW50KHIsdC50aGVtZS5saW5rKSxyfXVwZGF0ZURPTSh0LHIpe2xldCBuPXRoaXMuX191cmwsbz10aGlzLl9fdGFyZ2V0LGk9dGhpcy5fX3JlbCxsPXRoaXMuX190aXRsZTtyZXR1cm4gbiE9PXQuX191cmwmJihyLmhyZWY9biksbyE9PXQuX190YXJnZXQmJihvP3IudGFyZ2V0PW86ci5yZW1vdmVBdHRyaWJ1dGUoInRhcmdldCIpKSxpIT09dC5fX3JlbCYmKGk/ci5yZWw9aTpyLnJlbW92ZUF0dHJpYnV0ZSgicmVsIikpLGwhPT10Ll9fdGl0bGUmJihsP3IudGl0bGU9bDpyLnJlbW92ZUF0dHJpYnV0ZSgidGl0bGUiKSksITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnthOigpPT4oe2NvbnZlcnNpb246bTgscHJpb3JpdHk6MX0pfX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgcj1vYyh0LnVybCx7cmVsOnQucmVsLHRhcmdldDp0LnRhcmdldCx0aXRsZTp0LnRpdGxlfSk7cmV0dXJuIHIuc2V0Rm9ybWF0KHQuZm9ybWF0KSxyLnNldEluZGVudCh0LmluZGVudCksci5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLHJ9c2FuaXRpemVVcmwodCl7dHJ5e2xldCByPW5ldyBVUkwodCk7aWYoIWQ4LmhhcyhyLnByb3RvY29sKSlyZXR1cm4iYWJvdXQ6YmxhbmsifWNhdGNoe31yZXR1cm4gdH1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxyZWw6dGhpcy5nZXRSZWwoKSx0YXJnZXQ6dGhpcy5nZXRUYXJnZXQoKSx0aXRsZTp0aGlzLmdldFRpdGxlKCksdHlwZToibGluayIsdXJsOnRoaXMuZ2V0VVJMKCksdmVyc2lvbjoxfX1nZXRVUkwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3VybH1zZXRVUkwodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdXJsPXR9Z2V0VGFyZ2V0KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190YXJnZXR9c2V0VGFyZ2V0KHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3RhcmdldD10fWdldFJlbCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fcmVsfXNldFJlbCh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX19yZWw9dH1nZXRUaXRsZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGl0bGV9c2V0VGl0bGUodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdGl0bGU9dH1pbnNlcnROZXdBZnRlcih0LHI9ITApe3JldHVybiB0PXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmluc2VydE5ld0FmdGVyKHQsciksbG8uJGlzRWxlbWVudE5vZGUodCk/KHI9b2ModGhpcy5fX3VybCx7cmVsOnRoaXMuX19yZWwsdGFyZ2V0OnRoaXMuX190YXJnZXQsdGl0bGU6dGhpcy5fX3RpdGxlfSksdC5hcHBlbmQocikscik6bnVsbH1jYW5JbnNlcnRUZXh0QmVmb3JlKCl7cmV0dXJuITF9Y2FuSW5zZXJ0VGV4dEFmdGVyKCl7cmV0dXJuITF9Y2FuQmVFbXB0eSgpe3JldHVybiExfWlzSW5saW5lKCl7cmV0dXJuITB9ZXh0cmFjdFdpdGhDaGlsZCh0LHIpe2lmKCFsby4kaXNSYW5nZVNlbGVjdGlvbihyKSlyZXR1cm4hMTt0PXIuYW5jaG9yLmdldE5vZGUoKTtsZXQgbj1yLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gdGhpcy5pc1BhcmVudE9mKHQpJiZ0aGlzLmlzUGFyZW50T2YobikmJjA8ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aH19O2Z1bmN0aW9uIG04KGUpe2xldCB0PW51bGw7aWYoeWsuaXNIVE1MQW5jaG9yRWxlbWVudChlKSl7bGV0IHI9ZS50ZXh0Q29udGVudDtyIT09bnVsbCYmciE9PSIiJiYodD1vYyhlLmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIix7cmVsOmUuZ2V0QXR0cmlidXRlKCJyZWwiKSx0YXJnZXQ6ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHRpdGxlOmUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfSkpfXJldHVybntub2RlOnR9fWZ1bmN0aW9uIG9jKGUsdCl7cmV0dXJuIGxvLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgSnMoZSx0KSl9ZnVuY3Rpb24geGwoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBKc312YXIgaWM9Y2xhc3MgZSBleHRlbmRzIEpze3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImF1dG9saW5rIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBlKHQuX191cmwse3JlbDp0Ll9fcmVsLHRhcmdldDp0Ll9fdGFyZ2V0LHRpdGxlOnQuX190aXRsZX0sdC5fX2tleSl9c3RhdGljIGltcG9ydEpTT04odCl7bGV0IHI9enkodC51cmwse3JlbDp0LnJlbCx0YXJnZXQ6dC50YXJnZXQsdGl0bGU6dC50aXRsZX0pO3JldHVybiByLnNldEZvcm1hdCh0LmZvcm1hdCksci5zZXRJbmRlbnQodC5pbmRlbnQpLHIuc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxyfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm4gbnVsbH1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJhdXRvbGluayIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcih0LHI9ITApe3JldHVybiB0PXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmluc2VydE5ld0FmdGVyKHQsciksbG8uJGlzRWxlbWVudE5vZGUodCk/KHI9enkodGhpcy5fX3VybCx7cmVsOnRoaXMuX3JlbCx0YXJnZXQ6dGhpcy5fX3RhcmdldCx0aXRsZTp0aGlzLl9fdGl0bGV9KSx0LmFwcGVuZChyKSxyKTpudWxsfX07ZnVuY3Rpb24genkoZSx0KXtyZXR1cm4gbG8uJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBpYyhlLHQpKX12YXIgaDg9bG8uY3JlYXRlQ29tbWFuZCgiVE9HR0xFX0xJTktfQ09NTUFORCIpO2Z1bmN0aW9uIGc4KGUsdCl7Zm9yKDtlIT09bnVsbCYmKGU9ZS5nZXRQYXJlbnQoKSkhPT1udWxsJiYhdChlKTspO3JldHVybiBlfVdvLiRjcmVhdGVBdXRvTGlua05vZGU9enk7V28uJGNyZWF0ZUxpbmtOb2RlPW9jO1dvLiRpc0F1dG9MaW5rTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGljfTtXby4kaXNMaW5rTm9kZT14bDtXby5BdXRvTGlua05vZGU9aWM7V28uTGlua05vZGU9SnM7V28uVE9HR0xFX0xJTktfQ09NTUFORD1oODtXby50b2dnbGVMaW5rPWZ1bmN0aW9uKGUsdD17fSl7bGV0e3RhcmdldDpyLHRpdGxlOm59PXQsbz10LnJlbD09PXZvaWQgMD8ibm9yZWZlcnJlciI6dC5yZWw7aWYodD1sby4kZ2V0U2VsZWN0aW9uKCksbG8uJGlzUmFuZ2VTZWxlY3Rpb24odCkpaWYodD10LmV4dHJhY3QoKSxlPT09bnVsbCl0LmZvckVhY2gobD0+e2lmKGw9bC5nZXRQYXJlbnQoKSx4bChsKSl7bGV0IHM9bC5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKWwuaW5zZXJ0QmVmb3JlKHNbYV0pO2wucmVtb3ZlKCl9fSk7ZWxzZXtpZih0Lmxlbmd0aD09PTEpe3ZhciBpPXRbMF07aWYoaT14bChpKT9pOmc4KGkseGwpLGkhPT1udWxsKXtpLnNldFVSTChlKSxyIT09dm9pZCAwJiZpLnNldFRhcmdldChyKSxvIT09bnVsbCYmaS5zZXRSZWwobyksbiE9PXZvaWQgMCYmaS5zZXRUaXRsZShuKTtyZXR1cm59fWxldCBsPW51bGwscz1udWxsO3QuZm9yRWFjaChhPT57dmFyIHU9YS5nZXRQYXJlbnQoKTtpZih1IT09cyYmdSE9PW51bGwmJighbG8uJGlzRWxlbWVudE5vZGUoYSl8fGEuaXNJbmxpbmUoKSkpaWYoeGwodSkpcz11LHUuc2V0VVJMKGUpLHIhPT12b2lkIDAmJnUuc2V0VGFyZ2V0KHIpLG8hPT1udWxsJiZzLnNldFJlbChvKSxuIT09dm9pZCAwJiZzLnNldFRpdGxlKG4pO2Vsc2UgaWYodS5pcyhsKXx8KGw9dSxzPW9jKGUse3JlbDpvLHRhcmdldDpyfSkseGwodSk/YS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGw/dS5pbnNlcnRCZWZvcmUocyk6dS5pbnNlcnRBZnRlcihzKTphLmluc2VydEJlZm9yZShzKSkseGwoYSkpe2lmKCFhLmlzKHMpKXtpZihzIT09bnVsbCl7dT1hLmdldENoaWxkcmVuKCk7Zm9yKGxldCBwPTA7cDx1Lmxlbmd0aDtwKyspcy5hcHBlbmQodVtwXSl9YS5yZW1vdmUoKX19ZWxzZSBzIT09bnVsbCYmcy5hcHBlbmQoYSl9KX19fSk7dmFyIHdrPVYoKEVuZSx4ayk9PnsidXNlIHN0cmljdCI7dmFyIHk4PXZrKCk7eGsuZXhwb3J0cz15OH0pO3ZhciAkaz1WKChYaWUsRmspPT57RmsuZXhwb3J0cz1mdW5jdGlvbih0LHIsbil7dmFyIG89ZG9jdW1lbnQsaT0ic2NyaXB0IixsLHM7cz1vLmNyZWF0ZUVsZW1lbnQoaSksbD1vLmdldEVsZW1lbnRzQnlUYWdOYW1lKGkpWzBdLG4mJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oYSl7c1thXT1uW2FdfSkscy5hc3luYz0xLHMuc3JjPXQscy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCl9LHMub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IEVycm9yKCJmYWlsZWQgdG8gbG9hZDogIit0KSl9LGwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocyxsKX19KTt2YXIgV2s9VigoWmllLGprKT0+e2prLmV4cG9ydHM9ZnVuY3Rpb24odCxyKXt2YXIgbj1kb2N1bWVudCxvPSJzY3JpcHQiLGksbDtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocyxhKXtsPW4uY3JlYXRlRWxlbWVudChvKSxpPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF0sciYmT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih1KXtsW3VdPXJbdV19KSxsLmFzeW5jPTEsbC5zcmM9dCxsLm9ubG9hZD1mdW5jdGlvbigpe3MoKX0sbC5vbmVycm9yPWZ1bmN0aW9uKCl7YShuZXcgRXJyb3IoImZhaWxlZCB0byBsb2FkOiAiK3QpKX0saS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsLGkpfSl9fSk7dmFyIEhrPVYoV3k9PntXeS5sb2FkU2NyaXB0PSRrKCk7V3kubG9hZFNjcmlwdFByb21pc2VkPVdrKCl9KTt2YXIgYTM9VihvMT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgczM9bGwoKTtvMS5jcmVhdGVSb290PXMzLmNyZWF0ZVJvb3QsbzEuaHlkcmF0ZVJvb3Q9czMuaHlkcmF0ZVJvb3Q7dmFyIGYzZX0pO3ZhciB1Mz13KFQoKSwxKTt2YXIgdGU9dyhUKCksMSk7dmFyIFMxPShlLHQpPT57dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSgpLnRoZW4ocj0+e3Qocil9KTp0KGUpfTt2YXIgQzE9ZT0+e2xldCB0PUFycmF5LmlzQXJyYXkoZSk/W106e307Zm9yKGxldCByIGluIGUpZVtyXSE9PW51bGwmJnR5cGVvZiBlW3JdPT0ib2JqZWN0Ij90W3JdPUMxKGVbcl0pOnRbcl09ZVtyXTtyZXR1cm4gdH0sc2E9QzE7dmFyIFFkPShlLHQpPT57bGV0IHI9dHlwZW9mIGUsbj10eXBlb2YgdDtpZihlPT09dClyZXR1cm4hMDtpZihyIT09bnx8ZT09PW51bGx8fHQ9PT1udWxsKXJldHVybiExO2lmKHIhPT0ib2JqZWN0Iil7aWYocj09PSJmdW5jdGlvbiIpe2lmKGUudG9TdHJpbmcoKSE9PXQudG9TdHJpbmcoKSlyZXR1cm4hMX1lbHNlIGlmKGUhPT10KXJldHVybiExfWVsc2V7aWYoQXJyYXkuaXNBcnJheShlKSlpZihBcnJheS5pc0FycmF5KHQpKXtsZXQgaT1lLmxlbmd0aDtpZihpIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBsPTA7bDxpO2wrKyl7bGV0IHM9dHlwZW9mIGVbbF07aWYodHlwZW9mIHRbbF0hPT1zKXJldHVybiExO2lmKHM9PT0ib2JqZWN0IiYmIVFkKGVbbF0sdFtsXSkpcmV0dXJuITF9fWVsc2UgcmV0dXJuITE7aWYoZS5jaGVja3N1bXx8dC5jaGVja3N1bSlyZXR1cm4gZS5jaGVja3N1bT09PXQuY2hlY2tzdW07bGV0IG89MDtmb3IobGV0IGkgaW4gZSl7aWYoaVswXT09PSJfInx8IWUuaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7aWYoIXQuaGFzT3duUHJvcGVydHkoaSkpcmV0dXJuITE7bGV0IGw9dFtpXSxzPWVbaV07aWYobD09PXZvaWQgMCYmcyE9PXZvaWQgMClyZXR1cm4hMTtsZXQgYT10eXBlb2YgbDtpZihhIT09dHlwZW9mIHMpcmV0dXJuITE7aWYobCYmYT09PSJvYmplY3QiKXtpZighUWQocyxsKSlyZXR1cm4hMX1lbHNlIGlmKGwhPT1zKXJldHVybiExO28rK31mb3IobGV0IGkgaW4gdClpZihvLS0sbzwwKXJldHVybiExfXJldHVybiEwfSxlbj1RZDt2YXIgTDM9KGUsdD01MzgxKT0+e2xldCByPWUubGVuZ3RoO2Zvcig7cjspe2xldCBuPWUuY2hhckNvZGVBdCgtLXIpO3Q9dCozM15ufXJldHVybiB0fSxkdD1MMzt2YXIgYmw9KGUsdCxyLG4sbyk9PntsZXQgaT10eXBlb2YgbixsPSIiO2lmKGk9PT0ic3RyaW5nIilsPXIrIjoiK247ZWxzZSBpZihpPT09Im51bWJlciIpbD1yKyJuOiIrbjtlbHNlIGlmKGk9PT0ib2JqZWN0IilpZihuPT09bnVsbClsPXIrInY6bnVsbCI7ZWxzZXtsZXQgcz1vKG4sZSx0KTtyZXR1cm5bZHQocisibzoiLHNbMF0pLGR0KHIrIm86IixzWzFdKV19ZWxzZSBpPT09ImJvb2xlYW4iJiYobD1yKyJiOiIrKG4/InRydWUiOiJmYWxzZSIpKTtyZXR1cm5bZHQobCxlKSxkdChsLHQpXX07dmFyIEtkPShlLHQ9NTM4MSxyPTUyNzExKT0+e2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBvPWJsKHQscixuLGVbbl0sS2QpO3Q9b1swXSxyPW9bMV19ZWxzZSBmb3IobGV0IG4gaW4gZSl7aWYobj09PXZvaWQgMCljb250aW51ZTtsZXQgbz1ibCh0LHIsbixlW25dLEtkKTt0PW9bMF0scj1vWzFdfXJldHVyblt0LHJdfSxZZD1LZDt2YXIgQTM9ZT0+e2xldCB0PVlkKGUpO3JldHVybih0WzBdPj4+MCkqNDA5Nit0WzFdfSxhYT1BMzt2YXIgRDM9KGUsdCk9PntsZXQgcjtpZih0eXBlb2YgZT09Im9iamVjdCI/ZT09PW51bGw/cj0wOnI9YWEoZSk6dHlwZW9mIGU9PSJib29sZWFuIj9yPWU/NzkyMjIyMjY1MzQ0OjQ4MjE1NTIzNDA5OTI6dHlwZW9mIGU9PSJudW1iZXIiP3I9KGR0KCJuOiIrZSk+Pj4wKSo0MDk2KyhkdCgibjoiK2UsNTI3MTEpPj4+MCk6cj0oZHQoZSk+Pj4wKSo0MDk2KyhkdChlLDUyNzExKT4+PjApLHQpe2xldCBuPU1hdGguY2VpbChNYXRoLmxvZzEwKHIrMSkpO2lmKG48dClyZXR1cm4gcipNYXRoLnBvdygxMCx0LW4pfXJldHVybiByfSxFbD1EMzt2YXIgWGQ9KGUsdD01MzgxLHI9NTI3MTEpPT57aWYoQXJyYXkuaXNBcnJheShlKSl7bGV0IG49Il9fbGVuOiIrZS5sZW5ndGgrMTt0PWR0KG4sdCkscj1kdChuLHIpO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtsZXQgaT1lW29dLGw9YmwodCxyLG8saSxYZCk7dD1sWzBdLHI9bFsxXX19ZWxzZXtsZXQgbj1PYmplY3Qua2V5cyhlKS5zb3J0KCksbz0iX19sZW46IituLmxlbmd0aCsxO3Q9ZHQobyx0KSxyPWR0KG8scik7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2xldCBsPW5baV07aWYobD09PXZvaWQgMCljb250aW51ZTtsZXQgcz1lW2xdLGE9YmwodCxyLGwscyxYZCk7dD1hWzBdLHI9YVsxXX19cmV0dXJuW3Qscl19LFpkPVhkO3ZhciBPMz1lPT57bGV0IHQ9WmQoZSk7cmV0dXJuKHRbMF0+Pj4wKSo0MDk2Kyh0WzFdPj4+MCl9LHRuPU8zO3ZhciBUMT0oZSx0LHIpPT57bGV0IG49ZS5sZW5ndGg7Zm9yKGxldCBvPTA7bzx0LW47bysrKWU9citlO3JldHVybiBlfTt2YXIgXzE9KGUsdCxyPVsiJCJdLG4pPT57aWYoci5sZW5ndGg+MSYmZSlyZXR1cm4gaT0+e2xldCBsPSIiO2ZvcihsZXQgcz0wO3M8aS5sZW5ndGg7cysrKXtsZXQgYT1pW3NdO2lmKHIuaW5jbHVkZXMoYSkpe2xldCB1PSIiO2ZvcihsZXQgYz0wO2M8dDtjKyspdSs9aVtzK2MrMV07bGV0IHA9blt1XTtsKz1wLHMrPXR9ZWxzZSBsKz1hfXJldHVybiBsfTtpZihyLmxlbmd0aD4xKXJldHVybiBpPT57bGV0IGw9IiI7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspe2xldCBhPWlbc107aWYoci5pbmNsdWRlcyhhKSl7bGV0IHU9bltpW3MrMV1dO2wrPXUscysrfWVsc2UgbCs9YX1yZXR1cm4gbH07bGV0IG89clswXTtyZXR1cm4gZT9pPT57bGV0IGw9IiI7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspe2xldCBhPWlbc107aWYoYT09PW8pe2xldCB1PSIiO2ZvcihsZXQgYz0wO2M8dDtjKyspdSs9aVtzK2MrMV07bGV0IHA9blt1XTtsKz1wLHMrPXR9ZWxzZSBsKz1hfXJldHVybiBsfTppPT57bGV0IGw9IiI7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspe2xldCBhPWlbc107aWYoYT09PW8pe2xldCB1PW5baVtzKzFdXTtsKz11LHMrK31lbHNlIGwrPWF9cmV0dXJuIGx9fTt2YXIgazE9KGUsdCk9PnQlMj9lW2UubGVuZ3RoLXRdOmVbdF0sTjE9KGUsdCxyKT0+e2lmKHIubGVuZ3RoPjEmJmU9PT0xKXtsZXQgbj1yLmxlbmd0aDtyZXR1cm4gbz0+e2xldCBpPTAsbD0iIjtmb3IobGV0IHM9MDtzPG8ubGVuZ3RoO3MrKyl7bGV0IGE9by5jaGFyQXQocyk7dFthXT8oaSs9MSxpPj1uJiYoaT0wKSxsKz1rMShyLGkpK3RbYV0pOmwrPWF9cmV0dXJuIGx9fWlmKHIubGVuZ3RoPjEpe2xldCBuPXIubGVuZ3RoO3JldHVybiBvPT57bGV0IGk9MCxsPSIiO2ZvcihsZXQgcz0wO3M8by5sZW5ndGg7cysrKXtsZXQgYT0hMTtmb3IobGV0IHU9ZS0xO3U+LTE7dS0tKXtpZihzK3U+by5sZW5ndGgtMSljb250aW51ZTtsZXQgcD0iIjtmb3IobGV0IGM9MDtjPHUrMTtjKyspcCs9by5jaGFyQXQocytjKTt0W3BdJiYoaSs9MSxpPj1uJiYoaT0wKSxsKz1rMShyLGkpK3RbcF0scys9cC5sZW5ndGgtMSx1PS0xLGE9ITApfWF8fChsKz1vLmNoYXJBdChzKSl9cmV0dXJuIGx9fXJldHVybiBlPT09MT9uPT57bGV0IG89IiI7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2xldCBsPW4uY2hhckF0KGkpO3RbbF0/bys9dFtsXTpvKz1sfXJldHVybiBvfTpuPT57bGV0IG89IiI7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2xldCBsPSExO2ZvcihsZXQgcz1lLTE7cz4tMTtzLS0pe2lmKGkrcz5uLmxlbmd0aC0xKWNvbnRpbnVlO2xldCBhPSIiO2ZvcihsZXQgdT0wO3U8cysxO3UrKylhKz1uLmNoYXJBdChpK3UpO3RbYV0mJihvKz10W2FdLGkrPWEubGVuZ3RoLTEscz0tMSxsPSEwKX1sfHwobys9bi5jaGFyQXQoaSkpfXJldHVybiBvfX07dmFyIGIxPShlLHQ9WyIkIl0pPT57bGV0IHI9MSxuPWUubGVuZ3RoPjM2LG89Wy4uLmUsLi4udF0saT1vLm1hcCgodSxwKT0+KHUubGVuZ3RoPnImJihyPXUubGVuZ3RoKSxwPjI1P1N0cmluZyhwLTI2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKDk3K3ApKSksbD17fSxzPXt9O2ZvcihsZXQgdT0wO3U8by5sZW5ndGg7dSsrKWxbb1t1XV09dC5sZW5ndGg9PT0xP3RbMF0raVt1XTppW3VdLHNbaVt1XV09b1t1XTtsZXQgYT0xO2lmKG4pe2ZvcihsZXQgdSBpbiBzKXUubGVuZ3RoPmEmJihhPXUubGVuZ3RoKTtmb3IobGV0IHUgaW4gcylpZih1Lmxlbmd0aDxhKXtsZXQgcD1UMSh1LGEsIjAiKSxjPXNbdV07dC5sZW5ndGg+MT9sW2NdPXA6bFtjXT10WzBdK3AsZGVsZXRlIHNbdV0sc1twXT1jfX1yZXR1cm57Y2hhck1hcDpsLHJldmVyc2VDaGFyTWFwOnMsZW5jb2RlOk4xKHIsbCx0KSxkZWNvZGU6XzEobixhLHQscyl9fTt2YXIgSmQ9KGUsdCk9PntpZih0LmNvbnN0cnVjdG9yPT09QXJyYXl8fGUuY29uc3RydWN0b3I9PT1BcnJheSlyZXR1cm4gdDtmb3IobGV0IHIgaW4gdClpZihyIGluIGUpaWYoZVtyXSYmdFtyXSYmdHlwZW9mIGVbcl09PSJvYmplY3QiJiZlW3JdLmNvbnN0cnVjdG9yIT09QXJyYXkmJnR5cGVvZiB0W3JdPT0ib2JqZWN0IiYmdFtyXS5jb25zdHJ1Y3RvciE9PUFycmF5KXtsZXQgbj1KZChlW3JdLHRbcl0pO24hPT1lW3JdJiYoZVtyXT1uKX1lbHNlIGVbcl09dFtyXTtlbHNlIGVbcl09dFtyXTtyZXR1cm4gZX07ZnVuY3Rpb24gZW0oZSwuLi50KXtpZighdC5sZW5ndGgpcmV0dXJuIGU7aWYodC5sZW5ndGg9PT0xKXtsZXQgcj10WzBdO2lmKGUmJnR5cGVvZiBlPT0ib2JqZWN0IiYmciYmdHlwZW9mIHI9PSJvYmplY3QiKXJldHVybiBKZChlLHIpfWZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtsZXQgbj10W3JdO2lmKGUmJnR5cGVvZiBlPT0ib2JqZWN0IiYmbiYmdHlwZW9mIG49PSJvYmplY3QiKXtsZXQgbz1KZChlLG4pO28hPT1lJiYoZT1vKX19cmV0dXJuIGV9dmFyIHRtPWU9PntpZihlLmluY2x1ZGVzKCIsIikpe2U9ZS5zcGxpdCgiLCIpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF09dG0oZVt0XSk7cmV0dXJuIGV9cmV0dXJuIGU9PT0ibnVsbCI/bnVsbDplPT09InRydWUifHxlPT09IiI/ITA6ZT09PSJmYWxzZSI/ITE6aXNOYU4oZSk/ZTpOdW1iZXIoZSl9LHVhPWU9PntpZihlKXRyeXtsZXQgdD17fSxyPSIiLG49IiIsbz0hMSxpPTAsbD1lLmxlbmd0aDtmb3IobGV0IHM9MDtzPGw7cysrKXtsZXQgYT1lW3NdO2lmKGE9PT0iJiImJighaXx8aT09PTEmJmVbcy0xXT09PSJ9Inx8aT09PTImJmVbcy0xXT09PSJdIikpe2lmKCFvKXRbcl09ITA7ZWxzZSBpZihpKXRyeXt0W3JdPUpTT04ucGFyc2Uobil9Y2F0Y2h7dFtyXT1ufWVsc2UgdFtyXT10bShuKTtpPTAsbz0hMSxyPSIiLG49IiJ9ZWxzZSBhPT09Ij0iJiYhaT9vPSEwOm8/KG49PT0iIiYmKGE9PT0ieyI/aT0xOmE9PT0iWyImJihpPTIpKSxuKz1hKTpyKz1hfWlmKHIpaWYoaSl0cnl7dFtyXT1KU09OLnBhcnNlKG4pfWNhdGNoe3Rbcl09bn1lbHNlIHRbcl09dG0obik7cmV0dXJuIHR9Y2F0Y2h7fX0sejM9ZT0+e2xldCB0PVtdO2ZvcihsZXQgciBpbiBlKXtsZXQgbj1lW3JdO249PT0hMD90LnB1c2goXGAke3J9XGApOnQucHVzaChcYCR7cn09JHtQbChuLCEwKX1cYCl9cmV0dXJuIHQuam9pbigiJiIpfSxQbD0oZSx0PSExKT0+dHlwZW9mIGU9PSJzdHJpbmciP2U6dHlwZW9mIGU9PSJib29sZWFuIj9lPyJ0cnVlIjoiZmFsc2UiOnR5cGVvZiBlPT0ibnVtYmVyInx8dHlwZW9mIGU9PSJudW1iZXIiP1N0cmluZyhlKTplPT09bnVsbD8ibnVsbCI6QXJyYXkuaXNBcnJheShlKT9lLm1hcChyPT50eXBlb2Ygcj09Im9iamVjdCImJnIhPT1udWxsP0pTT04uc3RyaW5naWZ5KHIpOlBsKHIsITApKS5qb2luKCIsIik6dHlwZW9mIGU9PSJvYmplY3QiP3Q/SlNPTi5zdHJpbmdpZnkoZSk6ejMoZSk6IiI7dmFyIEIzPWU9PmU+NjQmJmU8OTE/ZS02NTplPjk2JiZlPDEyMz9lLTcxOmU+NDcmJmU8NTg/ZSs0OmU9PT00Mz82MjplPT09NDc/NjM6MCx5Yz1lPT5lPDI2P2UrNjU6ZTw1Mj9lKzcxOmU8NjI/ZS00OmU9PT02Mj80MzplPT09NjM/NDc6NjUscm09KGUsdCk9PntsZXQgcj1lLnJlcGxhY2UoL1teQS1aYS16MC05Ky9dL2csIiIpLG49ci5sZW5ndGgsbz10P01hdGguY2VpbCgobiozKzE+PjIpL3QpKnQ6biozKzE+PjIsaT1uZXcgVWludDhBcnJheShvKSxsLHMsYT0wLHU9MDtmb3IobGV0IHA9MDtwPG47cCsrKWlmKHM9cCYzLGF8PUIzKHIuY2hhckNvZGVBdChwKSk8PDYqKDMtcykscz09PTN8fG4tcD09PTEpe2ZvcihsPTA7bDwzJiZ1PG87KWlbdV09YT4+PigxNj4+PmwmMjQpJjI1NSxsKyssdSsrO2E9MH1yZXR1cm4gaX0sdmM9ZT0+e2xldCB0PTIscj0iIixuPWUubGVuZ3RoLG89MDtmb3IobGV0IGk9MDtpPG47aSsrKXQ9aSUzLG98PWVbaV08PCgxNj4+PnQmMjQpLCh0PT09Mnx8ZS5sZW5ndGgtaT09PTEpJiYocis9U3RyaW5nLmZyb21Db2RlUG9pbnQoeWMobz4+PjE4JjYzKSx5YyhvPj4+MTImNjMpLHljKG8+Pj42JjYzKSx5YyhvJjYzKSksbz0wKTtyZXR1cm4gci5zdWJzdHJpbmcoMCxyLmxlbmd0aC0yK3QpKyh0PT09Mj8iIjp0PT09MT8iPSI6Ij09Iil9O3ZhcntlbmNvZGU6RjMsZGVjb2RlOklNfT1iMShbIigiLCIpIiwiPCIsIj4iLCJAIiwiLCIsIjsiLCI6IiwiXFwiLCciJywiLyIsIlsiLCJdIiwiPyIsIj0iLCJ7IiwifSIsIiAiXSxbIjAiXSkseGM9ZT0+RjModmMobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGUpKSkpO3ZhciBFMT1lPT5lLmNvbnRlbnRzIGluc3RhbmNlb2YgRmlsZTt2YXIgS3Q9VWludDhBcnJheSxMcj1VaW50MTZBcnJheSxjbT1JbnQzMkFycmF5LHdjPW5ldyBLdChbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDAsMCwwXSksU2M9bmV3IEt0KFswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDAsMF0pLGxtPW5ldyBLdChbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLEwxPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPW5ldyBMcigzMSksbj0wO248MzE7KytuKXJbbl09dCs9MTw8ZVtuLTFdO2Zvcih2YXIgbz1uZXcgY20oclszMF0pLG49MTtuPDMwOysrbilmb3IodmFyIGk9cltuXTtpPHJbbisxXTsrK2kpb1tpXT1pLXJbbl08PDV8bjtyZXR1cm57YjpyLHI6b319LEExPUwxKHdjLDIpLEQxPUExLmIsc209QTEucjtEMVsyOF09MjU4LHNtWzI1OF09Mjg7dmFyIE8xPUwxKFNjLDApLCQzPU8xLmIsUDE9TzEucixhbT1uZXcgTHIoMzI3NjgpO2ZvcihjZT0wO2NlPDMyNzY4OysrY2UpbW89KGNlJjQzNjkwKT4+MXwoY2UmMjE4NDUpPDwxLG1vPShtbyY1MjQyOCk+PjJ8KG1vJjEzMTA3KTw8Mixtbz0obW8mNjE2ODApPj40fChtbyYzODU1KTw8NCxhbVtjZV09KChtbyY2NTI4MCk+Pjh8KG1vJjI1NSk8PDgpPj4xO3ZhciBtbyxjZSxqbj1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBuPWUubGVuZ3RoLG89MCxpPW5ldyBMcih0KTtvPG47KytvKWVbb10mJisraVtlW29dLTFdO3ZhciBsPW5ldyBMcih0KTtmb3Iobz0xO288dDsrK28pbFtvXT1sW28tMV0raVtvLTFdPDwxO3ZhciBzO2lmKHIpe3M9bmV3IExyKDE8PHQpO3ZhciBhPTE1LXQ7Zm9yKG89MDtvPG47KytvKWlmKGVbb10pZm9yKHZhciB1PW88PDR8ZVtvXSxwPXQtZVtvXSxjPWxbZVtvXS0xXSsrPDxwLGY9Y3woMTw8cCktMTtjPD1mOysrYylzW2FtW2NdPj5hXT11fWVsc2UgZm9yKHM9bmV3IExyKG4pLG89MDtvPG47KytvKWVbb10mJihzW29dPWFtW2xbZVtvXS0xXSsrXT4+MTUtZVtvXSk7cmV0dXJuIHN9LEdvPW5ldyBLdCgyODgpO2ZvcihjZT0wO2NlPDE0NDsrK2NlKUdvW2NlXT04O3ZhciBjZTtmb3IoY2U9MTQ0O2NlPDI1NjsrK2NlKUdvW2NlXT05O3ZhciBjZTtmb3IoY2U9MjU2O2NlPDI4MDsrK2NlKUdvW2NlXT03O3ZhciBjZTtmb3IoY2U9MjgwO2NlPDI4ODsrK2NlKUdvW2NlXT04O3ZhciBjZSxmYT1uZXcgS3QoMzIpO2ZvcihjZT0wO2NlPDMyOysrY2UpZmFbY2VdPTU7dmFyIGNlLGozPWpuKEdvLDksMCksVzM9am4oR28sOSwxKSxIMz1qbihmYSw1LDApLFUzPWpuKGZhLDUsMSksbm09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0scj0xO3I8ZS5sZW5ndGg7KytyKWVbcl0+dCYmKHQ9ZVtyXSk7cmV0dXJuIHR9LFRuPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10Lzh8MDtyZXR1cm4oZVtuXXxlW24rMV08PDgpPj4odCY3KSZyfSxvbT1mdW5jdGlvbihlLHQpe3ZhciByPXQvOHwwO3JldHVybihlW3JdfGVbcisxXTw8OHxlW3IrMl08PDE2KT4+KHQmNyl9LHBtPWZ1bmN0aW9uKGUpe3JldHVybihlKzcpLzh8MH0sejE9ZnVuY3Rpb24oZSx0LHIpe3JldHVybih0PT1udWxsfHx0PDApJiYodD0wKSwocj09bnVsbHx8cj5lLmxlbmd0aCkmJihyPWUubGVuZ3RoKSxuZXcgS3QoZS5zdWJhcnJheSh0LHIpKX07dmFyIFYzPVsidW5leHBlY3RlZCBFT0YiLCJpbnZhbGlkIGJsb2NrIHR5cGUiLCJpbnZhbGlkIGxlbmd0aC9saXRlcmFsIiwiaW52YWxpZCBkaXN0YW5jZSIsInN0cmVhbSBmaW5pc2hlZCIsIm5vIHN0cmVhbSBoYW5kbGVyIiwsIm5vIGNhbGxiYWNrIiwiaW52YWxpZCBVVEYtOCBkYXRhIiwiZXh0cmEgZmllbGQgdG9vIGxvbmciLCJkYXRlIG5vdCBpbiByYW5nZSAxOTgwLTIwOTkiLCJmaWxlbmFtZSB0b28gbG9uZyIsInN0cmVhbSBmaW5pc2hpbmciLCJpbnZhbGlkIHppcCBkYXRhIl0sZ289ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPW5ldyBFcnJvcih0fHxWM1tlXSk7aWYobi5jb2RlPWUsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKG4sZ28pLCFyKXRocm93IG47cmV0dXJuIG59LFIzPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBvPWUubGVuZ3RoLGk9bj9uLmxlbmd0aDowO2lmKCFvfHx0LmYmJiF0LmwpcmV0dXJuIHJ8fG5ldyBLdCgwKTt2YXIgbD0hcixzPWx8fHQuaSE9MixhPXQuaTtsJiYocj1uZXcgS3QobyozKSk7dmFyIHU9ZnVuY3Rpb24oQ3Ipe3ZhciBGaT1yLmxlbmd0aDtpZihDcj5GaSl7dmFyIEZuPW5ldyBLdChNYXRoLm1heChGaSoyLENyKSk7Rm4uc2V0KHIpLHI9Rm59fSxwPXQuZnx8MCxjPXQucHx8MCxmPXQuYnx8MCxkPXQubCxtPXQuZCxoPXQubSxTPXQubix5PW8qODtkb3tpZighZCl7cD1UbihlLGMsMSk7dmFyIHY9VG4oZSxjKzEsMyk7aWYoYys9Myx2KWlmKHY9PTEpZD1XMyxtPVUzLGg9OSxTPTU7ZWxzZSBpZih2PT0yKXt2YXIgRD1UbihlLGMsMzEpKzI1NyxPPVRuKGUsYysxMCwxNSkrNCxOPUQrVG4oZSxjKzUsMzEpKzE7Yys9MTQ7Zm9yKHZhciBMPW5ldyBLdChOKSxXPW5ldyBLdCgxOSksWT0wO1k8TzsrK1kpV1tsbVtZXV09VG4oZSxjK1kqMyw3KTtjKz1PKjM7Zm9yKHZhciB5ZT1ubShXKSxTcj0oMTw8eWUpLTEsX3Q9am4oVyx5ZSwxKSxZPTA7WTxOOyl7dmFyIGN0PV90W1RuKGUsYyxTcildO2MrPWN0JjE1O3ZhciBnPWN0Pj40O2lmKGc8MTYpTFtZKytdPWc7ZWxzZXt2YXIgb3Q9MCxOZT0wO2ZvcihnPT0xNj8oTmU9MytUbihlLGMsMyksYys9MixvdD1MW1ktMV0pOmc9PTE3PyhOZT0zK1RuKGUsYyw3KSxjKz0zKTpnPT0xOCYmKE5lPTExK1RuKGUsYywxMjcpLGMrPTcpO05lLS07KUxbWSsrXT1vdH19dmFyIHB0PUwuc3ViYXJyYXkoMCxEKSxpdD1MLnN1YmFycmF5KEQpO2g9bm0ocHQpLFM9bm0oaXQpLGQ9am4ocHQsaCwxKSxtPWpuKGl0LFMsMSl9ZWxzZSBnbygxKTtlbHNle3ZhciBnPXBtKGMpKzQsQz1lW2ctNF18ZVtnLTNdPDw4LGs9ZytDO2lmKGs+byl7YSYmZ28oMCk7YnJlYWt9cyYmdShmK0MpLHIuc2V0KGUuc3ViYXJyYXkoZyxrKSxmKSx0LmI9Zis9Qyx0LnA9Yz1rKjgsdC5mPXA7Y29udGludWV9aWYoYz55KXthJiZnbygwKTticmVha319cyYmdShmKzEzMTA3Mik7Zm9yKHZhciBjbz0oMTw8aCktMSxRdD0oMTw8UyktMSxLcj1jOztLcj1jKXt2YXIgb3Q9ZFtvbShlLGMpJmNvXSxmdD1vdD4+NDtpZihjKz1vdCYxNSxjPnkpe2EmJmdvKDApO2JyZWFrfWlmKG90fHxnbygyKSxmdDwyNTYpcltmKytdPWZ0O2Vsc2UgaWYoZnQ9PTI1Nil7S3I9YyxkPW51bGw7YnJlYWt9ZWxzZXt2YXIga3Q9ZnQtMjU0O2lmKGZ0PjI2NCl7dmFyIFk9ZnQtMjU3LHdlPXdjW1ldO2t0PVRuKGUsYywoMTw8d2UpLTEpK0QxW1ldLGMrPXdlfXZhciBZcj1tW29tKGUsYykmUXRdLHpuPVlyPj40O1lyfHxnbygzKSxjKz1ZciYxNTt2YXIgaXQ9JDNbem5dO2lmKHpuPjMpe3ZhciB3ZT1TY1t6bl07aXQrPW9tKGUsYykmKDE8PHdlKS0xLGMrPXdlfWlmKGM+eSl7YSYmZ28oMCk7YnJlYWt9cyYmdShmKzEzMTA3Mik7dmFyIEJuPWYra3Q7aWYoZjxpdCl7dmFyIHBvPWktaXQsZm89TWF0aC5taW4oaXQsQm4pO2ZvcihwbytmPDAmJmdvKDMpO2Y8Zm87KytmKXJbZl09bltwbytmXX1mb3IoO2Y8Qm47KytmKXJbZl09cltmLWl0XX19dC5sPWQsdC5wPUtyLHQuYj1mLHQuZj1wLGQmJihwPTEsdC5tPWgsdC5kPW0sdC5uPVMpfXdoaWxlKCFwKTtyZXR1cm4gZiE9ci5sZW5ndGgmJmw/ejEociwwLGYpOnIuc3ViYXJyYXkoMCxmKX0saG89ZnVuY3Rpb24oZSx0LHIpe3I8PD10Jjc7dmFyIG49dC84fDA7ZVtuXXw9cixlW24rMV18PXI+Pjh9LGNhPWZ1bmN0aW9uKGUsdCxyKXtyPDw9dCY3O3ZhciBuPXQvOHwwO2Vbbl18PXIsZVtuKzFdfD1yPj44LGVbbisyXXw9cj4+MTZ9LGltPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPVtdLG49MDtuPGUubGVuZ3RoOysrbillW25dJiZyLnB1c2goe3M6bixmOmVbbl19KTt2YXIgbz1yLmxlbmd0aCxpPXIuc2xpY2UoKTtpZighbylyZXR1cm57dDpGMSxsOjB9O2lmKG89PTEpe3ZhciBsPW5ldyBLdChyWzBdLnMrMSk7cmV0dXJuIGxbclswXS5zXT0xLHt0OmwsbDoxfX1yLnNvcnQoZnVuY3Rpb24oayxEKXtyZXR1cm4gay5mLUQuZn0pLHIucHVzaCh7czotMSxmOjI1MDAxfSk7dmFyIHM9clswXSxhPXJbMV0sdT0wLHA9MSxjPTI7Zm9yKHJbMF09e3M6LTEsZjpzLmYrYS5mLGw6cyxyOmF9O3AhPW8tMTspcz1yW3JbdV0uZjxyW2NdLmY/dSsrOmMrK10sYT1yW3UhPXAmJnJbdV0uZjxyW2NdLmY/dSsrOmMrK10scltwKytdPXtzOi0xLGY6cy5mK2EuZixsOnMscjphfTtmb3IodmFyIGY9aVswXS5zLG49MTtuPG87KytuKWlbbl0ucz5mJiYoZj1pW25dLnMpO3ZhciBkPW5ldyBMcihmKzEpLG09dW0ocltwLTFdLGQsMCk7aWYobT50KXt2YXIgbj0wLGg9MCxTPW0tdCx5PTE8PFM7Zm9yKGkuc29ydChmdW5jdGlvbihELE8pe3JldHVybiBkW08uc10tZFtELnNdfHxELmYtTy5mfSk7bjxvOysrbil7dmFyIHY9aVtuXS5zO2lmKGRbdl0+dCloKz15LSgxPDxtLWRbdl0pLGRbdl09dDtlbHNlIGJyZWFrfWZvcihoPj49UztoPjA7KXt2YXIgZz1pW25dLnM7ZFtnXTx0P2gtPTE8PHQtZFtnXSsrLTE6KytufWZvcig7bj49MCYmaDstLW4pe3ZhciBDPWlbbl0ucztkW0NdPT10JiYoLS1kW0NdLCsraCl9bT10fXJldHVybnt0Om5ldyBLdChkKSxsOm19fSx1bT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGUucz09LTE/TWF0aC5tYXgodW0oZS5sLHQscisxKSx1bShlLnIsdCxyKzEpKTp0W2Uuc109cn0sTTE9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubGVuZ3RoO3QmJiFlWy0tdF07KTtmb3IodmFyIHI9bmV3IExyKCsrdCksbj0wLG89ZVswXSxpPTEsbD1mdW5jdGlvbihhKXtyW24rK109YX0scz0xO3M8PXQ7KytzKWlmKGVbc109PW8mJnMhPXQpKytpO2Vsc2V7aWYoIW8mJmk+Mil7Zm9yKDtpPjEzODtpLT0xMzgpbCgzMjc1NCk7aT4yJiYobChpPjEwP2ktMTE8PDV8Mjg2OTA6aS0zPDw1fDEyMzA1KSxpPTApfWVsc2UgaWYoaT4zKXtmb3IobChvKSwtLWk7aT42O2ktPTYpbCg4MzA0KTtpPjImJihsKGktMzw8NXw4MjA4KSxpPTApfWZvcig7aS0tOylsKG8pO2k9MSxvPWVbc119cmV0dXJue2M6ci5zdWJhcnJheSgwLG4pLG46dH19LHBhPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTAsbj0wO248dC5sZW5ndGg7KytuKXIrPWVbbl0qdFtuXTtyZXR1cm4gcn0sQjE9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIubGVuZ3RoLG89cG0odCsyKTtlW29dPW4mMjU1LGVbbysxXT1uPj44LGVbbysyXT1lW29dXjI1NSxlW28rM109ZVtvKzFdXjI1NTtmb3IodmFyIGk9MDtpPG47KytpKWVbbytpKzRdPXJbaV07cmV0dXJuKG8rNCtuKSo4fSxJMT1mdW5jdGlvbihlLHQscixuLG8saSxsLHMsYSx1LHApe2hvKHQscCsrLHIpLCsrb1syNTZdO2Zvcih2YXIgYz1pbShvLDE1KSxmPWMudCxkPWMubCxtPWltKGksMTUpLGg9bS50LFM9bS5sLHk9TTEoZiksdj15LmMsZz15Lm4sQz1NMShoKSxrPUMuYyxEPUMubixPPW5ldyBMcigxOSksTj0wO048di5sZW5ndGg7KytOKSsrT1t2W05dJjMxXTtmb3IodmFyIE49MDtOPGsubGVuZ3RoOysrTikrK09ba1tOXSYzMV07Zm9yKHZhciBMPWltKE8sNyksVz1MLnQsWT1MLmwseWU9MTk7eWU+NCYmIVdbbG1beWUtMV1dOy0teWUpO3ZhciBTcj11KzU8PDMsX3Q9cGEobyxHbykrcGEoaSxmYSkrbCxjdD1wYShvLGYpK3BhKGksaCkrbCsxNCszKnllK3BhKE8sVykrMipPWzE2XSszKk9bMTddKzcqT1sxOF07aWYoYT49MCYmU3I8PV90JiZTcjw9Y3QpcmV0dXJuIEIxKHQscCxlLnN1YmFycmF5KGEsYSt1KSk7dmFyIG90LE5lLHB0LGl0O2lmKGhvKHQscCwxKyhjdDxfdCkpLHArPTIsY3Q8X3Qpe290PWpuKGYsZCwwKSxOZT1mLHB0PWpuKGgsUywwKSxpdD1oO3ZhciBjbz1qbihXLFksMCk7aG8odCxwLGctMjU3KSxobyh0LHArNSxELTEpLGhvKHQscCsxMCx5ZS00KSxwKz0xNDtmb3IodmFyIE49MDtOPHllOysrTilobyh0LHArMypOLFdbbG1bTl1dKTtwKz0zKnllO2Zvcih2YXIgUXQ9W3Ysa10sS3I9MDtLcjwyOysrS3IpZm9yKHZhciBmdD1RdFtLcl0sTj0wO048ZnQubGVuZ3RoOysrTil7dmFyIGt0PWZ0W05dJjMxO2hvKHQscCxjb1trdF0pLHArPVdba3RdLGt0PjE1JiYoaG8odCxwLGZ0W05dPj41JjEyNykscCs9ZnRbTl0+PjEyKX19ZWxzZSBvdD1qMyxOZT1HbyxwdD1IMyxpdD1mYTtmb3IodmFyIE49MDtOPHM7KytOKXt2YXIgd2U9bltOXTtpZih3ZT4yNTUpe3ZhciBrdD13ZT4+MTgmMzE7Y2EodCxwLG90W2t0KzI1N10pLHArPU5lW2t0KzI1N10sa3Q+NyYmKGhvKHQscCx3ZT4+MjMmMzEpLHArPXdjW2t0XSk7dmFyIFlyPXdlJjMxO2NhKHQscCxwdFtZcl0pLHArPWl0W1lyXSxZcj4zJiYoY2EodCxwLHdlPj41JjgxOTEpLHArPVNjW1lyXSl9ZWxzZSBjYSh0LHAsb3Rbd2VdKSxwKz1OZVt3ZV19cmV0dXJuIGNhKHQscCxvdFsyNTZdKSxwK05lWzI1Nl19LEczPW5ldyBjbShbNjU1NDAsMTMxMDgwLDEzMTA4OCwxMzExMDQsMjYyMTc2LDEwNDg3MDQsMTA0ODgzMiwyMTE0NTYwLDIxMTc2MzJdKSxGMT1uZXcgS3QoMCkscTM9ZnVuY3Rpb24oZSx0LHIsbixvLGkpe3ZhciBsPWkuenx8ZS5sZW5ndGgscz1uZXcgS3QobitsKzUqKDErTWF0aC5jZWlsKGwvN2UzKSkrbyksYT1zLnN1YmFycmF5KG4scy5sZW5ndGgtbyksdT1pLmwscD0oaS5yfHwwKSY3O2lmKHQpe3AmJihhWzBdPWkucj4+Myk7Zm9yKHZhciBjPUczW3QtMV0sZj1jPj4xMyxkPWMmODE5MSxtPSgxPDxyKS0xLGg9aS5wfHxuZXcgTHIoMzI3NjgpLFM9aS5ofHxuZXcgTHIobSsxKSx5PU1hdGguY2VpbChyLzMpLHY9Mip5LGc9ZnVuY3Rpb24ob2Epe3JldHVybihlW29hXV5lW29hKzFdPDx5XmVbb2ErMl08PHYpJm19LEM9bmV3IGNtKDI1ZTMpLGs9bmV3IExyKDI4OCksRD1uZXcgTHIoMzIpLE89MCxOPTAsTD1pLml8fDAsVz0wLFk9aS53fHwwLHllPTA7TCsyPGw7KytMKXt2YXIgU3I9ZyhMKSxfdD1MJjMyNzY3LGN0PVNbU3JdO2lmKGhbX3RdPWN0LFNbU3JdPV90LFk8PUwpe3ZhciBvdD1sLUw7aWYoKE8+N2UzfHxXPjI0NTc2KSYmKG90PjQyM3x8IXUpKXtwPUkxKGUsYSwwLEMsayxELE4sVyx5ZSxMLXllLHApLFc9Tz1OPTAseWU9TDtmb3IodmFyIE5lPTA7TmU8Mjg2OysrTmUpa1tOZV09MDtmb3IodmFyIE5lPTA7TmU8MzA7KytOZSlEW05lXT0wfXZhciBwdD0yLGl0PTAsY289ZCxRdD1fdC1jdCYzMjc2NztpZihvdD4yJiZTcj09ZyhMLVF0KSlmb3IodmFyIEtyPU1hdGgubWluKGYsb3QpLTEsZnQ9TWF0aC5taW4oMzI3NjcsTCksa3Q9TWF0aC5taW4oMjU4LG90KTtRdDw9ZnQmJi0tY28mJl90IT1jdDspe2lmKGVbTCtwdF09PWVbTCtwdC1RdF0pe2Zvcih2YXIgd2U9MDt3ZTxrdCYmZVtMK3dlXT09ZVtMK3dlLVF0XTsrK3dlKTtpZih3ZT5wdCl7aWYocHQ9d2UsaXQ9UXQsd2U+S3IpYnJlYWs7Zm9yKHZhciBZcj1NYXRoLm1pbihRdCx3ZS0yKSx6bj0wLE5lPTA7TmU8WXI7KytOZSl7dmFyIEJuPUwtUXQrTmUmMzI3NjcscG89aFtCbl0sZm89Qm4tcG8mMzI3Njc7Zm8+em4mJih6bj1mbyxjdD1Cbil9fX1fdD1jdCxjdD1oW190XSxRdCs9X3QtY3QmMzI3Njd9aWYoaXQpe0NbVysrXT0yNjg0MzU0NTZ8c21bcHRdPDwxOHxQMVtpdF07dmFyIENyPXNtW3B0XSYzMSxGaT1QMVtpdF0mMzE7Tis9d2NbQ3JdK1NjW0ZpXSwrK2tbMjU3K0NyXSwrK0RbRmldLFk9TCtwdCwrK099ZWxzZSBDW1crK109ZVtMXSwrK2tbZVtMXV19fWZvcihMPU1hdGgubWF4KEwsWSk7TDxsOysrTClDW1crK109ZVtMXSwrK2tbZVtMXV07cD1JMShlLGEsdSxDLGssRCxOLFcseWUsTC15ZSxwKSx1fHwoaS5yPXAmN3xhW3AvOHwwXTw8MyxwLT03LGkuaD1TLGkucD1oLGkuaT1MLGkudz1ZKX1lbHNle2Zvcih2YXIgTD1pLnd8fDA7TDxsK3U7TCs9NjU1MzUpe3ZhciBGbj1MKzY1NTM1O0ZuPj1sJiYoYVtwLzh8MF09dSxGbj1sKSxwPUIxKGEscCsxLGUuc3ViYXJyYXkoTCxGbikpfWkuaT1sfXJldHVybiB6MShzLDAsbitwbShwKStvKX07dmFyIFEzPWZ1bmN0aW9uKGUsdCxyLG4sbyl7aWYoIW8mJihvPXtsOjF9LHQuZGljdGlvbmFyeSkpe3ZhciBpPXQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpLGw9bmV3IEt0KGkubGVuZ3RoK2UubGVuZ3RoKTtsLnNldChpKSxsLnNldChlLGkubGVuZ3RoKSxlPWwsby53PWkubGVuZ3RofXJldHVybiBxMyhlLHQubGV2ZWw9PW51bGw/Njp0LmxldmVsLHQubWVtPT1udWxsP01hdGguY2VpbChNYXRoLm1heCg4LE1hdGgubWluKDEzLE1hdGgubG9nKGUubGVuZ3RoKSkpKjEuNSk6MTIrdC5tZW0scixuLG8pfTtmdW5jdGlvbiBkYShlLHQpe3JldHVybiBRMyhlLHR8fHt9LDAsMCl9ZnVuY3Rpb24gTWwoZSx0KXtyZXR1cm4gUjMoZSx7aToyfSx0JiZ0Lm91dCx0JiZ0LmRpY3Rpb25hcnkpfXZhciBLMz10eXBlb2YgVGV4dERlY29kZXI8InUiJiZuZXcgVGV4dERlY29kZXIsWTM9MDt0cnl7SzMuZGVjb2RlKEYxLHtzdHJlYW06ITB9KSxZMz0xfWNhdGNoe312YXIgSWw9IkBiYXNlZCIsbWE9SWwrIi1jYWNoZSIsaGE9SWwrIi1zaXplIixxbz1JbCsiLWF1dGhTdGF0ZSI7dmFyIFgzPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKSxaMz1uZXcgVGV4dEVuY29kZXIsSjM9ZT0+e2xldCB0PVgzLmRlY29kZShNbChybShlKSkpO3JldHVybiBKU09OLnBhcnNlKHQpfSxmbT0oZSx0KT0+e2xldCByPWxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpO3ImJihlLnN0b3JhZ2VTaXplLT1uZXcgQmxvYihbcl0pLnNpemUsbG9jYWxTdG9yYWdlLnNldEl0ZW0oaGEsU3RyaW5nKGUuc3RvcmFnZVNpemUpKSxsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0KSl9LENjPSgpPT57bGV0IGU9T2JqZWN0LmtleXMobG9jYWxTdG9yYWdlKTt0cnl7Zm9yKGxldCB0IG9mIGUpdC5zdGFydHNXaXRoKElsKSYmbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odCl9Y2F0Y2h7dHJ5e2xvY2FsU3RvcmFnZS5jbGVhcigpfWNhdGNoe319fSxqMT0oZSx0LHIpPT57dHJ5e2xldCBuPWUuc3RvcmFnZUVudktleTtpZighbilyZXR1cm47bGV0IG89bG9jYWxTdG9yYWdlLmdldEl0ZW0odCksaT1KU09OLnN0cmluZ2lmeShyKSxsPWkubGVuZ3RoPjcwfHx0PT09cW8rIi0iK24/dmMoZGEoWjMuZW5jb2RlKGkpKSk6aSxhPW5ldyBCbG9iKFtsXSkuc2l6ZTtvJiYoZS5zdG9yYWdlU2l6ZS09bmV3IEJsb2IoW29dKS5zaXplKSxlLnN0b3JhZ2VTaXplKz1hLGUuc3RvcmFnZVNpemU+ZS5tYXhTdG9yYWdlU2l6ZSYmKENjKCksZS5zdG9yYWdlU2l6ZT0wLGUuYXV0aFN0YXRlLnBlcnNpc3RlbnQ9PT0hMCYmajEoZSxxbysiLSIrbixlLmF1dGhTdGF0ZSksZS5zdG9yYWdlU2l6ZSs9YSksbG9jYWxTdG9yYWdlLnNldEl0ZW0oaGEsU3RyaW5nKGUuc3RvcmFnZVNpemUpKSxsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0LGwpfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoXGBCYXNlZCAtIEVycm9yIHdyaXRpbmcgJHt0fSB0byBsb2NhbFN0b3JhZ2VcYCxuKX19LCQxPShlLHQpPT57bGV0IHI9ZS5zdG9yYWdlRW52S2V5O2lmKHIpdHJ5e2xldCBuPWxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpO2lmKG4hPT12b2lkIDApe2lmKG4ubGVuZ3RoPDcwJiZ0IT09cW8rIi0iK3IpdHJ5e3JldHVybiBKU09OLnBhcnNlKG4pfWNhdGNoe31yZXR1cm4gSjMobil9cmV0dXJufWNhdGNoe319LGVOPWFzeW5jIGU9PntsZXQgdD1lLnN0b3JhZ2VFbnZLZXk7aWYoIXQpcmV0dXJuO2xldCByPXdpbmRvdy5fX2Jhc2VkY2FjaGVfXz8/e307Zm9yKGxldCBuIGluIHIpZS5jYWNoZS5zZXQoTnVtYmVyKG4pLHJbbl0pO3RyeXtsZXQgbj1OdW1iZXIobG9jYWxTdG9yYWdlLmdldEl0ZW0oaGEpfHwwKTtuPDAmJihDYygpLG49MCksZS5zdG9yYWdlU2l6ZT1uO2xldCBvPU9iamVjdC5rZXlzKGxvY2FsU3RvcmFnZSk7aWYoby5sZW5ndGg9PT0xJiZuPjAmJihDYygpLG49MCksbj4wKWZvcihsZXQgaSBvZiBvKXtpZihpPT09aGF8fCFpLnN0YXJ0c1dpdGgoSWwpKWNvbnRpbnVlO2lmKGk9PT1xbysiLSIrdCl7bGV0IHA9JDEoZSxpKTtwJiZlLnNldEF1dGhTdGF0ZShwKS5jYXRjaChjPT57Y29uc29sZS5lcnJvcihjLm1lc3NhZ2UpLGZtKGUsaSl9KTtjb250aW51ZX1sZXRbLGxdPWkuc3BsaXQobWEpO2lmKCFsKWNvbnRpbnVlO2xldFtzLGFdPWwuc3BsaXQoIi0iKTtpZihhIT09U3RyaW5nKHQpKWNvbnRpbnVlO2lmKCFzKXtmbShlLGkpO2NvbnRpbnVlfWxldCB1PSQxKGUsaSk7ZS5jYWNoZS5zZXQoTnVtYmVyKHMpLHUpfX1jYXRjaHt9fSxMbD0oZSx0KT0+e2xldCByPWUuc3RvcmFnZUVudktleTtyJiYodCs9Ii0iK3IsZm0oZSx0KSl9LFdpPShlLHQscik9PntsZXQgbj1lLnN0b3JhZ2VFbnZLZXk7biYmKHQrPSItIituLGoxKGUsdCxyKSl9LGRtPWFzeW5jKGUsdCk9Pnt9LFcxPWFzeW5jIGU9PmVOKGUpLEgxPWFzeW5jIGU9PkNjKCk7dmFyIEFsPShlLHQpPT57dC5wZXJzaXN0ZW50P1dpKGUscW8sdCk6TGwoZSxxbyksZS5hdXRoU3RhdGU9dH07dmFyIHlvPW5ldyBUZXh0RW5jb2RlcixYZT0oZSx0LHIsbik9Pntmb3IobGV0IG89cjtvPHIrbjtvKyspe2xldCBpPXQmMjU1O2Vbb109aSx0PSh0LWkpLzI1Nn19LHROPShlLHQscik9PntsZXQgbj0oZTw8MSkrKHR8MCk7cmV0dXJuKHI8PDQpK259LFduPShlLHQscixuPXIpPT57bGV0IG89dE4oZSx0LHIpLGk9bmV3IFVpbnQ4QXJyYXkobik7cmV0dXJuIFhlKGksbywwLDQpLGl9LEhpPShlLHQ9ITEpPT57bGV0IHIsbj0hMTtyZXR1cm4gZSE9PXZvaWQgMD8ocj15by5lbmNvZGUodHlwZW9mIGU9PSJzdHJpbmciP2U6SlNPTi5zdHJpbmdpZnkoZSkpLCF0JiZyLmxlbmd0aD4xNTAmJihyPWRhKHIpLG49ITApLFtuLHJdKTpbITFdfSxVMT0oZSx0KT0+e2xldCByPTQsW24sbyxpLGxdPXQ7aWYobj09PTMpe2xldCBzPXlvLmVuY29kZShvKTtyKz0xK3MubGVuZ3RoO2xldFthLHVdPUhpKGwpO3UmJihyKz11Lmxlbmd0aCk7bGV0IHA9MTY7cis9cDtsZXQgYz1XbihuLGEsciw1K3ApO3JldHVybiBYZShjLGUsNCw4KSxYZShjLGksMTIsOCksY1syMF09cy5sZW5ndGgsdT97YnVmZmVyczpbYyxzLHVdLGxlbjpyfTp7YnVmZmVyczpbYyxzXSxsZW46cn19cmV0dXJue2J1ZmZlcnM6W10sbGVuOjB9fSxUYz0oZSx0KT0+e2xldCByPTQsW24sbyxpXT10O2lmKG49PT03KXtsZXQgYz1XbihuLCExLDEzKTtyZXR1cm4gWGUoYywwLDQsMSksWGUoYyxlLDUsOCkse2J1ZmZlcnM6W2NdLGxlbjoxM319bGV0IGw9eW8uZW5jb2RlKG8pO3IrPTErbC5sZW5ndGg7bGV0IHM9bj09PTYsWyxhXT1IaShpLCEwKTthJiYocis9YS5sZW5ndGgpO2xldCB1PTg7cis9dTtsZXQgcD1Xbig1LHMsciw1K3UpO3JldHVybiBYZShwLGUsNCw4KSxwWzEyXT1sLmxlbmd0aCxhP3tidWZmZXJzOltwLGwsYV0sbGVuOnJ9OntidWZmZXJzOltwLGxdLGxlbjpyfX0sVjE9KGUsdCk9PntsZXQgcj00LFtuLG8saSxsXT10O2lmKG49PT0yKXtsZXQgZj1XbihuLCExLDEyKTtyZXR1cm4gWGUoZixlLDQsOCkse2J1ZmZlcnM6W2ZdLGxlbjoxMn19bGV0IHM9eW8uZW5jb2RlKG8pO3IrPTErcy5sZW5ndGg7bGV0W2EsdV09SGkobCk7dSYmKHIrPXUubGVuZ3RoKTtsZXQgcD0xNjtyKz1wO2xldCBjPVduKG4sYSxyLDUrcCk7cmV0dXJuIFhlKGMsZSw0LDgpLFhlKGMsaSwxMiw4KSxjWzIwXT1zLmxlbmd0aCx1P3tidWZmZXJzOltjLHMsdV0sbGVuOnJ9OntidWZmZXJzOltjLHNdLGxlbjpyfX0sUjE9ZT0+e2xldCB0PTcsW3IsbixvXT1lLGk9eW8uZW5jb2RlKG4pO3QrPTEraS5sZW5ndGg7bGV0W2wsc109SGkobyk7cyYmKHQrPXMubGVuZ3RoKTtsZXQgYT1XbigwLGwsdCw4KTtyZXR1cm4gWGUoYSxyLDQsMyksYVs3XT1pLmxlbmd0aCxzP3tidWZmZXJzOlthLGksc10sbGVuOnR9OntidWZmZXJzOlthLGldLGxlbjp0fX0sRzE9ZT0+e2xldCB0PTEyLFtyLG5dPWUsW28saV09SGkobik7aSYmKHQrPWkubGVuZ3RoKTtsZXQgbD1Xbig2LG8sdCwxMik7cmV0dXJuIFhlKGwsciw0LDgpLGk/e2J1ZmZlcnM6W2wsaV0sbGVuOnR9OntidWZmZXJzOltsXSxsZW46dH19LHExPWU9PntsZXQgdD00LFtyLG5dPUhpKGUpO24mJih0Kz1uLmxlbmd0aCk7bGV0IG89V24oNCxyLHQpO3JldHVybiBuJiZvLnNldChuLDQpLG99LG1tPWU9PntsZXRbdCxyXT1lO2lmKHQ9PT0xKXtsZXRbLCxuLG8saSxsLHMsYV09ZSx1PTE2LHA9dSxjPXlvLmVuY29kZShvKTtwKz1jLmxlbmd0aDtsZXRbZixkXT1IaShhKTtkJiYocCs9ZC5sZW5ndGgpO2xldCBtPXlvLmVuY29kZShpKTtwKz1tLmxlbmd0aDtsZXQgaD15by5lbmNvZGUocyk7cCs9aC5sZW5ndGg7bGV0IFM9eW8uZW5jb2RlKGwpO3ArPVMubGVuZ3RoO2xldCB5PVduKDcsZixwLHUpO3JldHVybiBYZSh5LDEsNCwxKSxYZSh5LHIsNSwzKSxYZSh5LG4sOCw0KSxYZSh5LGMubGVuZ3RoLDEyLDEpLFhlKHksbS5sZW5ndGgsMTMsMSksWGUoeSxoLmxlbmd0aCwxNCwxKSxYZSh5LFMubGVuZ3RoLDE1LDEpLGQ/e2J1ZmZlcnM6W3ksYyxtLGgsUyxkXSxsZW46cH06e2J1ZmZlcnM6W3ksYyxtLGgsU10sbGVuOnB9fWVsc2UgaWYodD09PTIpe2xldCBuPTksbz1uLFssLGksbF09ZSxzPSExLGE9bDtsLmxlbmd0aD4xNTA/KGE9ZGEobCksbys9YS5sZW5ndGgscz0hMCk6bys9bC5sZW5ndGg7bGV0IHU9V24oNyxzLG8sbik7cmV0dXJuIFhlKHUsMiw0LDEpLFhlKHUsciw1LDMpLFhlKHUsaSw4LDEpLHtidWZmZXJzOlt1LGFdLGxlbjpvfX1yZXR1cm57YnVmZmVyczpbXSxsZW46MH19O3ZhciByTj1uZXcgVWludDhBcnJheSgwKSxLMT1lPT57Y2xlYXJUaW1lb3V0KGUuaWRsZVBpbmcpLGUuaWRsZVBpbmc9c2V0VGltZW91dCgoKT0+e2UuY29ubmVjdGlvbiYmZS5jb25uZWN0ZWQmJiFlLmNvbm5lY3Rpb24uZGlzY29ubmVjdGVkJiZlLmNvbm5lY3Rpb24ud3Muc2VuZChyTil9LDZlNCl9LFExPWU9PiEhKGUuZlEubGVuZ3RofHxlLm9RLnNpemV8fGUuZ1Euc2l6ZXx8ZS5jUS5zaXplfHxlLnBRLmxlbmd0aHx8ZS5zUS5sZW5ndGgpLF9uPWU9PntpZihlLmNvbm5lY3RlZCYmIWUuZHJhaW5JblByb2dyZXNzJiZRMShlKSl7ZS5kcmFpbkluUHJvZ3Jlc3M9ITA7bGV0IHQ9KCk9PntpZihlLmRyYWluSW5Qcm9ncmVzcz0hMSwhIWUuY29ubmVjdGVkJiZRMShlKSl7bGV0IHI9ZS5jUSxuPWUucFEsbz1lLmZRLGk9ZS5vUSxsPWUuZ1Escz1lLnNRLGE9W10sdT0wO2ZvcihsZXRbZixkXW9mIHIpe2xldHtidWZmZXJzOm0sbGVuOmh9PVRjKGYsZCk7YS5wdXNoKC4uLm0pLHUrPWh9Zm9yKGxldFtmLGRdb2YgbCl7bGV0e2J1ZmZlcnM6bSxsZW46aH09VTEoZixkKTthLnB1c2goLi4ubSksdSs9aH1mb3IobGV0W2YsZF1vZiBpKXtsZXR7YnVmZmVyczptLGxlbjpofT1WMShmLGQpO2EucHVzaCguLi5tKSx1Kz1ofWZvcihsZXQgZiBvZiBvKXtsZXR7YnVmZmVyczpkLGxlbjptfT1SMShmKTthLnB1c2goLi4uZCksdSs9bX1mb3IobGV0IGYgb2Ygbil7bGV0e2J1ZmZlcnM6ZCxsZW46bX09RzEoZik7YS5wdXNoKC4uLmQpLHUrPW19Zm9yKGxldCBmIG9mIHMpe2xldHtidWZmZXJzOmQsbGVuOm19PW1tKGYpO2EucHVzaCguLi5kKSx1Kz1tfWxldCBwPW5ldyBVaW50OEFycmF5KHUpLGM9MDtmb3IobGV0IGYgb2YgYSlwLnNldChmLGMpLGMrPWYubGVuZ3RoO2UuZlE9W10sZS5wUT1bXSxlLnNRPVtdLGUub1EuY2xlYXIoKSxlLmdRLmNsZWFyKCksZS5jUS5jbGVhcigpLGUuY29ubmVjdGlvbi53cy5zZW5kKHApLEsxKGUpfX07ZS5kcmFpblRpbWVvdXQ9c2V0VGltZW91dCh0LDApfX07dmFyIGdhPShlLHQscixuLG8pPT57ZS5yZXF1ZXN0SWQrKyxlLnJlcXVlc3RJZD4xNjc3NzIxNSYmKGUucmVxdWVzdElkPTApO2xldCBpPWUucmVxdWVzdElkLGw9RXJyb3IoKS5zdGFjay5zcGxpdCgvQmFzZWRDbGllbnRcLmZ1bmN0aW9uLis6XGRcZFwpLylbMV07ZS5mdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLnNldChpLFtuLG8sbF0pLGUuZlEucHVzaChbaSxyLHRdKSxfbihlKX0sWTE9KGUsdCk9PntlLmNRLmdldCh0KT8uWzBdIT09NyYmKGUuY1Euc2V0KHQsWzddKSxfbihlKSl9LF9jPShlLHQscixuKT0+e2UuY1EuZ2V0KHIpPy5bMF0hPT01JiYoZS5jUS5zZXQocixbNSx0LG5dKSxfbihlKSl9LGtjPShlLHQscixuKT0+e2xldCBvPWUuY1EuZ2V0KHIpPy5bMF07bz09PTV8fG89PT02fHwoZS5jUS5zZXQocixbNix0LG5dKSxfbihlKSl9LFgxPShlLHQscik9PntlLnBRLmxlbmd0aD5lLm1heFB1Ymxpc2hRdWV1ZSYmZS5wUS5zaGlmdCgpLGUucFEucHVzaChbdCxyXSksX24oZSl9LFoxPShlLHQpPT57ZS5vUS5nZXQodCk/LlswXSE9PTImJihlLm9RLnNldCh0LFsyXSksX24oZSkpfSxEbD0oZSx0LHIsbixvPTApPT57ZS5vUS5nZXQocik/LlswXSE9PTEmJihlLm9RLnNldChyLFsxLHQsbyxuXSksX24oZSkpfSxOYz0oZSx0LHIsbixvPTApPT57ZS5nUS5oYXMocil8fChlLmdRLnNldChyLFszLHQsbyxuXSksX24oZSkpfSxobT1hc3luYyhlLHQpPT5lbih0LGUuYXV0aFN0YXRlKT8oY29uc29sZS53YXJuKCJbQmFzZWRdIFRyeWluZyB0byBzZW5kIHRoZSBzYW1lIGF1dGhTdGF0ZSB0d2ljZSIsZS5hdXRoU3RhdGUpLGUuYXV0aFJlcXVlc3QuaW5Qcm9ncmVzcz9lLmF1dGhSZXF1ZXN0LnByb21pc2U6bmV3IFByb21pc2Uocj0+cih7fSkpKTooZS5hdXRoUmVxdWVzdC5pblByb2dyZXNzJiYoY29uc29sZS53YXJuKCJbQmFzZWRdIEF1dGhlbnRpY2F0aW9uIHN0aWxsIGluIHByb2dyZXNzIC0gd2FpdGluZyB1bnRpbCBkb25lIiksYXdhaXQgZS5hdXRoUmVxdWVzdC5wcm9taXNlKSxBbChlLHQpLGUuZW1pdCgiYXV0aHN0YXRlLWNoYW5nZSIsZS5hdXRoU3RhdGUpLGUuY29ubmVjdGVkJiZlLmNvbm5lY3Rpb24ud3Muc2VuZChxMSh0KSksZS5hdXRoUmVxdWVzdC5wcm9taXNlPW5ldyBQcm9taXNlKChyLG4pPT57ZS5hdXRoUmVxdWVzdC5pblByb2dyZXNzPSEwLGUuYXV0aFJlcXVlc3QucmVzb2x2ZT1yLGUuYXV0aFJlcXVlc3QucmVqZWN0PW59KS5maW5hbGx5KCgpPT57ZS5hdXRoUmVxdWVzdC5yZXNvbHZlPW51bGwsZS5hdXRoUmVxdWVzdC5yZWplY3Q9bnVsbCxlLmF1dGhSZXF1ZXN0LmluUHJvZ3Jlc3M9ITF9KSxlLmF1dGhSZXF1ZXN0LnByb21pc2UpLEoxPShlLHQscixuLG8saSxsLHMpPT57ZS5zUS5wdXNoKFsxLHQscixuLG8saSxsLHNdKSxfbihlKX0sZXY9KGUsdCxyLG4sbyk9PntpZihlLmNvbm5lY3RlZCl7bGV0e2xlbjppLGJ1ZmZlcnM6bH09bW0oWzIsdCxyLG4sb10pLHM9bmV3IFVpbnQ4QXJyYXkoaSksYT0wO2ZvcihsZXQgdSBvZiBsKXMuc2V0KHUsYSksYSs9dS5sZW5ndGg7ZS5jb25uZWN0aW9uLndzLnNlbmQocyksSzEoZSl9ZWxzZSBlLnNRLnB1c2goWzIsdCxyLG4sb10pfTt2YXIgbk49ZT0+bmV3IFByb21pc2UodD0+e2UuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVuZCIscj0+e2NvbnNvbGUubG9nKCJsb2FkZWQ/IiksdChuZXcgVWludDhBcnJheShlLnJlc3VsdCkpfSl9KSx0dj1hc3luYyhlLHQscixuKT0+e2lmKCEoci5jb250ZW50cyBpbnN0YW5jZW9mIEZpbGUpKXRocm93IG5ldyBFcnJvcignRmlsZSBDb250ZW50cyBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgIkZpbGUiJyk7ZS5jb25uZWN0ZWR8fGF3YWl0IGUub25jZSgiY29ubmVjdCIpO2xldCBvPSsrZS5zdHJlYW1SZXF1ZXN0SWQ7bz4xNjc3NzIxNSYmKG89ZS5zdHJlYW1SZXF1ZXN0SWQ9MCk7bGV0IGk9MDtKMShlLG8sci5zaXplLHIuZmlsZU5hbWUsci5taW1lVHlwZSxyLmV4dGVuc2lvbix0LHIucGF5bG9hZCk7bGV0IGw9IShyLm1pbWVUeXBlPy9pbWFnZXx2aWRlb3x4LXppcC9pLnRlc3Qoci5taW1lVHlwZSk6ci5leHRlbnNpb24mJi8obXA0fGF2aXxtb3Z8emlwfGpwZ3xqcGVnfHBuZ3xnaWZ8bWt2KS9pLnRlc3Qoci5leHRlbnNpb24pKSxzPTFlNSxhPTFlNioxMCx1PTFlNioxLHA9TWF0aC5taW4odSxyLnNpemUpO3Iuc2l6ZTx1KjU/cD1NYXRoLm1pbihzLHIuc2l6ZSk6ci5zaXplPnUqMTAwJiYocD1hKTtsZXQgYyxmPSgpPT5uZXcgUHJvbWlzZShTPT57Y1syXT0oeSx2LGcpPT57ZyYmKHA9ZyksUyh7c2VxSWQ6eSxtYXhDaHVua1NpemU6Zyxjb2RlOnZ9KX19KTthc3luYyBmdW5jdGlvbipkKFMpe2xldCB5PTA7Zm9yKDt5PFMuc2l6ZTspe2xldCB2PU1hdGgubWluKHkrUy5zaXplLHkrcCksZz1TLnNsaWNlKHksdiksQz1uZXcgRmlsZVJlYWRlcjtDLnJlYWRBc0FycmF5QnVmZmVyKGcpO2xldCBrPWF3YWl0IG5OKEMpO2k9PT0yNTUmJihpPTApLGV2KGUsbywrK2ksayxsKSxhd2FpdCBmKCkseSs9Zy5zaXplLHlpZWxkIHl9eWllbGQgeX1sZXQgbT1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KSxoPSgpPT57fTtyZXR1cm4gZS5vbmNlKCJkaXNjb25uZWN0IixoKSxuZXcgUHJvbWlzZShhc3luYyhTLHkpPT57Yz1bUyx5LCgpPT57fV0sZS5zdHJlYW1GdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLnNldChvLGMpO2ZvciBhd2FpdChsZXQgdiBvZiBkKHIuY29udGVudHMpKW4mJm4odi9yLnNpemUsdik7ZS5vZmYoImRpc2Nvbm5lY3QiLGgpfSl9O3ZhciBydj17c3RyZWFtaW5nOiExfSxudj1hc3luYyhlLHQscixuKT0+e2lmKChyLmNvbnRlbnRzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fHR5cGVvZiByLmNvbnRlbnRzPT0ic3RyaW5nIikmJihyLmNvbnRlbnRzPW5ldyB3aW5kb3cuQmxvYihbci5jb250ZW50c10se3R5cGU6ci5taW1lVHlwZXx8InRleHQvcGxhaW4ifSkpLHIuY29udGVudHMgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYiYmKHIubWltZVR5cGV8fChyLm1pbWVUeXBlPXIuY29udGVudHMudHlwZSksci5jb250ZW50cz1uZXcgRmlsZShbci5jb250ZW50c10sci5maWxlTmFtZXx8ImJsb2IiLHt0eXBlOnIuY29udGVudHMudHlwZX0pKSxFMShyKSlyZXR1cm4gci5zaXplfHwoci5zaXplPXIuY29udGVudHMuc2l6ZSksdHYoZSx0LHIsbik7dGhyb3cgbmV3IEVycm9yKFxgSW52YWxpZCBvcHRzIGZvciBmaWxlIGFwaSAke3R9ICR7SlNPTi5zdHJpbmdpZnkocixudWxsLDIpfVxgKX07dmFyIE9sPWZldGNoO3ZhciB6bD1udWxsO3R5cGVvZiBXZWJTb2NrZXQ8InUiP3psPVdlYlNvY2tldDp0eXBlb2YgTW96V2ViU29ja2V0PCJ1Ij96bD1Nb3pXZWJTb2NrZXQ6dHlwZW9mIHdpbmRvdzwidSJ8fHR5cGVvZiB3aW5kb3c8InUiP3psPXdpbmRvdy5XZWJTb2NrZXR8fHdpbmRvdy5Nb3pXZWJTb2NrZXQ6dHlwZW9mIHNlbGY8InUiJiYoemw9c2VsZi5XZWJTb2NrZXR8fHNlbGYuTW96V2ViU29ja2V0KTt2YXIgb3Y9emw7dmFyIGl2PWU9PntsZXQgdD1lPj40LHI9ZSYxNSxuPXI+PjEsbz1yJjE7cmV0dXJue3R5cGU6bixpc0RlZmxhdGU6bz09PTEsbGVuOnR9fSxtdD0oZSx0LHIpPT57bGV0IG49MCxvPXItMSt0O2ZvcihsZXQgaT1vO2k+PXQ7aS0tKW49bioyNTYrZVtpXTtyZXR1cm4gbn0sbHY9YXN5bmMgZT0+e2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlO2lmKGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7aWYodHlwZW9mIHdpbmRvdz4idSIpe2lmKGUgaW5zdGFuY2VvZiBCdWZmZXIpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIEJsb2Ipe2xldCB0PWF3YWl0IGUuYXJyYXlCdWZmZXIoKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodCl9dGhyb3cgbmV3IEVycm9yKCI0MzIiKX0sYmM9KGUsdCk9PntsZXQgcj1lLm9ic2VydmVTdGF0ZS5nZXQodCk7TmMoZSxyLm5hbWUsdCxyLnBheWxvYWQpfTt2YXIgc3Y9KGUsdCxyKT0+e2lmKHIuY29uc3RydWN0b3I9PT1BcnJheSl7bGV0IG49clswXTtpZihuPT09MCllW3RdPXJbMV07ZWxzZSBpZihuPT09MSlkZWxldGUgZVt0XTtlbHNlIGlmKG49PT0yKXtsZXQgbz1hdihlW3RdLHJbMV0pO2lmKG89PT1udWxsKXJldHVybiBudWxsO2VbdF09b319ZWxzZXtpZihyLl9fXyR0b09iamVjdCYmZVt0XSYmZVt0XS5jb25zdHJ1Y3Rvcj09PUFycmF5KXtsZXQgbj17fTtmb3IobGV0IG89MDtvPGVbdF0ubGVuZ3RoO28rKyluW29dPWVbdF1bb107ZVt0XT1ufWlmKGVbdF09PT12b2lkIDApcmV0dXJuIGNvbnNvbGUud2FybigiRGlmZiBhcHBseSBwYXRjaDogQ2Fubm90IGZpbmQga2V5IGluIG9yaWdpbmFsIG9iamVjdCIsdCxKU09OLnN0cmluZ2lmeShyLG51bGwsMikpLG51bGw7Zm9yKGxldCBuIGluIHIpaWYobiE9PSJfX18kdG9PYmplY3QiJiZzdihlW3RdLG4scltuXSk9PT1udWxsKXJldHVybiBudWxsfX0sYXY9KGUsdCk9PntsZXQgcj10Lmxlbmd0aCxuPW5ldyBBcnJheSh0WzBdKSxvPS0xLGk9W10sbD17fTtmb3IobGV0IGE9MTthPHI7YSsrKXtsZXQgdT10W2FdLHA9dVswXTtpZihwPT09MClmb3IobGV0IGM9MTtjPHUubGVuZ3RoO2MrKyluWysrb109dVtjXTtlbHNlIGlmKHA9PT0xKXtsZXQgYz11WzJdLGY9dVsxXStjO2ZvcihsZXQgZD1jO2Q8ZjtkKyspe2xldCBtPXR5cGVvZiBlW2RdO2lmKG09PT0ib2JqZWN0IiYmZCBpbiBsKXtsZXQgaD1zYShlW2RdKTtuWysrb109aH1lbHNlIG09PT0ib2JqZWN0IiYmKGxbZF09ITApLG5bKytvXT1lW2RdfX1lbHNlIGlmKHA9PT0yKXtsZXQgYz11WzFdLGY9dS5sZW5ndGgtMitjO2ZvcihsZXQgZD1jO2Q8ZjtkKyspe2xldCBtPVsrK28sZCx1W2QtYysyXV07aS5wdXNoKG0pfX19bGV0IHM9aS5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzO2ErKyl7bGV0W3UscCxjXT1pW2FdLGY9cCBpbiBsP3NhKGVbcF0pOmVbcF0sZD11dihmLGMpO2lmKGQ9PT1udWxsKXJldHVybiBudWxsO25bdV09ZH1yZXR1cm4gbn0sdXY9KGUsdCk9PntpZih0KWlmKHQuY29uc3RydWN0b3I9PT1BcnJheSl7bGV0IHI9dFswXTtpZihyPT09MClyZXR1cm4gdFsxXTtpZihyPT09MSlyZXR1cm47aWYocj09PTIpcmV0dXJuIGF2KGUsdFsxXSl9ZWxzZXtpZih0Ll9fXyR0b09iamVjdCYmZSYmZS5jb25zdHJ1Y3Rvcj09PUFycmF5KXtsZXQgcj17fTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylyW25dPWVbbl07ZT1yfWZvcihsZXQgciBpbiB0KWlmKHIhPT0iX19fJHRvT2JqZWN0IiYmc3YoZSxyLHRbcl0pPT09bnVsbClyZXR1cm4gbnVsbDtyZXR1cm4gZX1lbHNlIHJldHVybiBlfSxnbT11djt2YXIgeW09KGUsdCxyKT0+e2xldCBuPXI9PT0ic3ViIj9lLm9ic2VydmVTdGF0ZS5nZXQodCk6ZS5jaGFubmVsU3RhdGUuZ2V0KHQpO3JldHVybiBuP24ucGF5bG9hZD97bmFtZTpuLm5hbWUscGF5bG9hZDpuLnBheWxvYWQsaWQ6dH06e25hbWU6bi5uYW1lLGlkOnR9OntuYW1lOlxgW0Nhbm5vdCBmaW5kICR7dH1dXGAsaWQ6dH19O3ZhciBCbD1lPT57ZS5jYWNoZS5mb3JFYWNoKCh0LHIpPT57ZS5vYnNlcnZlU3RhdGUuaGFzKHIpfHwoZS5jYWNoZVNpemUtPXQucyxlLmNhY2hlLmRlbGV0ZShyKSxMbChlLFN0cmluZyhyKSkpfSl9O3ZhciB5YT1jbGFzcyBleHRlbmRzIEVycm9ye3N0YXR1c01lc3NhZ2U7Y29kZX07dmFyIEZsOyhmdW5jdGlvbihlKXtlW2UuaW5jb3JyZWN0RmllbGRUeXBlPTFlM109ImluY29ycmVjdEZpZWxkVHlwZSIsZVtlLmluY29ycmVjdE5vZGVUeXBlPTEwMDFdPSJpbmNvcnJlY3ROb2RlVHlwZSIsZVtlLmV4Y2VlZHNNYXhpbXVtPTEwMDJdPSJleGNlZWRzTWF4aW11bSIsZVtlLnN1YmNlZWRzTWluaW11bT0xMDAzXT0ic3ViY2VlZHNNaW5pbXVtIixlW2UuZmllbGREb2VzTm90RXhpc3Q9MTAwNF09ImZpZWxkRG9lc05vdEV4aXN0IixlW2UuaW5jb3JyZWN0Rm9ybWF0PTEwMDVdPSJpbmNvcnJlY3RGb3JtYXQiLGVbZS5yZWZlcmVuY2VJc0luY29ycmVjdFR5cGU9MTAwNl09InJlZmVyZW5jZUlzSW5jb3JyZWN0VHlwZSIsZVtlLnZhbHVlQW5kRGVmYXVsdD0xMDA3XT0idmFsdWVBbmREZWZhdWx0IixlW2UuZGVmYXVsdE5vdFN1cHBvcnRlZD0xMDA4XT0iZGVmYXVsdE5vdFN1cHBvcnRlZCIsZVtlLm11bHRpcGxlT3BlcmF0aW9uc05vdEFsbG93ZWQ9MTAwOV09Im11bHRpcGxlT3BlcmF0aW9uc05vdEFsbG93ZWQiLGVbZS5yZXF1aXJlZEZpZWxkTm90RGVmaW5lZD0xMDEwXT0icmVxdWlyZWRGaWVsZE5vdERlZmluZWQiLGVbZS5sYW5ndWFnZU5vdFN1cHBvcnRlZD0xMDExXT0ibGFuZ3VhZ2VOb3RTdXBwb3J0ZWQiLGVbZS5pbnZhbGlkSlNPTj0xMDEyXT0iaW52YWxpZEpTT04iLGVbZS5ub0xhbmd1YWdlRm91bmQ9MTAxM109Im5vTGFuZ3VhZ2VGb3VuZCIsZVtlLmNhbm5vdERlbGV0ZU5vZGVGcm9tTW9kaWZ5PTEwMTRdPSJjYW5ub3REZWxldGVOb2RlRnJvbU1vZGlmeSIsZVtlLm5lc3RlZE1vZGlmeU9iamVjdE5vdEFsbG93ZWQ9MTAxNV09Im5lc3RlZE1vZGlmeU9iamVjdE5vdEFsbG93ZWQiLGVbZS5pbmZpbml0eU5vdFN1cHBvcnRlZD0xMDE2XT0iaW5maW5pdHlOb3RTdXBwb3J0ZWQiLGVbZS5pbnZhbGlkU2NoZW1hRm9ybWF0PTEwMTddPSJpbnZhbGlkU2NoZW1hRm9ybWF0IixlW2UuaW52YWxpZFByb3BlcnR5PTEwMThdPSJpbnZhbGlkUHJvcGVydHkiLGVbZS5GdW5jdGlvbkVycm9yPTUwMDAxXT0iRnVuY3Rpb25FcnJvciIsZVtlLkF1dGhvcml6ZUZ1bmN0aW9uRXJyb3I9NTAwMDJdPSJBdXRob3JpemVGdW5jdGlvbkVycm9yIixlW2UuTm9Pc2VydmFibGVDYWNoZUF2YWlsYWJsZT01MDAwM109Ik5vT3NlcnZhYmxlQ2FjaGVBdmFpbGFibGUiLGVbZS5PYnNlcnZhYmxlRnVuY3Rpb25FcnJvcj01MDAwNF09Ik9ic2VydmFibGVGdW5jdGlvbkVycm9yIixlW2UuT2JzZXJ2ZUNhbGxiYWNrRXJyb3I9NTAwMDVdPSJPYnNlcnZlQ2FsbGJhY2tFcnJvciIsZVtlLkZ1bmN0aW9uTm90Rm91bmQ9NDA0MDFdPSJGdW5jdGlvbk5vdEZvdW5kIixlW2UuRnVuY3Rpb25Jc05vdE9ic2VydmFibGU9NDA0MDJdPSJGdW5jdGlvbklzTm90T2JzZXJ2YWJsZSIsZVtlLkZ1bmN0aW9uSXNPYnNlcnZhYmxlPTQwNDAzXT0iRnVuY3Rpb25Jc09ic2VydmFibGUiLGVbZS5GdW5jdGlvbklzU3RyZWFtPTQwNDA0XT0iRnVuY3Rpb25Jc1N0cmVhbSIsZVtlLkNhbm5vdFN0cmVhbVRvT2JzZXJ2YWJsZUZ1bmN0aW9uPTQwNDA1XT0iQ2Fubm90U3RyZWFtVG9PYnNlcnZhYmxlRnVuY3Rpb24iLGVbZS5GdW5jdGlvbklzV3JvbmdUeXBlPTQwNDA2XT0iRnVuY3Rpb25Jc1dyb25nVHlwZSIsZVtlLkF1dGhvcml6ZVJlamVjdGVkRXJyb3I9NDAzMDFdPSJBdXRob3JpemVSZWplY3RlZEVycm9yIixlW2UuSW52YWxpZFBheWxvYWQ9NDAwMDFdPSJJbnZhbGlkUGF5bG9hZCIsZVtlLlBheWxvYWRUb29MYXJnZT00MDAwMl09IlBheWxvYWRUb29MYXJnZSIsZVtlLkNodW5rVG9vTGFyZ2U9NDAwMDNdPSJDaHVua1Rvb0xhcmdlIixlW2UuVW5zdXBwb3J0ZWRDb250ZW50RW5jb2Rpbmc9NDAwMDRdPSJVbnN1cHBvcnRlZENvbnRlbnRFbmNvZGluZyIsZVtlLk5vQmluYXJ5UHJvdG9jb2w9NDAwMDVdPSJOb0JpbmFyeVByb3RvY29sIixlW2UuTGVuZ3RoUmVxdWlyZWQ9NDExMDFdPSJMZW5ndGhSZXF1aXJlZCIsZVtlLk1ldGhvZE5vdEFsbG93ZWQ9NDA1MDFdPSJNZXRob2ROb3RBbGxvd2VkIixlW2UuUmF0ZUxpbWl0PTQwMDI5XT0iUmF0ZUxpbWl0IixlW2UuTWlzc2luZ0F1dGhTdGF0ZVByb3RvY29sSGVhZGVyPTQwMDMwXT0iTWlzc2luZ0F1dGhTdGF0ZVByb3RvY29sSGVhZGVyIixlW2UuSW5jb3JyZWN0QWNjZXNzS2V5PTQwMDMxXT0iSW5jb3JyZWN0QWNjZXNzS2V5IixlW2UuQmxvY2s9OTAwMDFdPSJCbG9jayIsZVtlLlByZWZpeEFscmVhZHlJblVzZT0yZTNdPSJQcmVmaXhBbHJlYWR5SW5Vc2UiLGVbZS5DYW5ub3RDaGFuZ2VGaWVsZEluU3RyaWN0TW9kZT0yMDAxXT0iQ2Fubm90Q2hhbmdlRmllbGRJblN0cmljdE1vZGUiLGVbZS5DYW5ub3RSZW1vdmVGaWVsZEluU3RyaWN0TW9kZT0yMDAyXT0iQ2Fubm90UmVtb3ZlRmllbGRJblN0cmljdE1vZGUiLGVbZS5DYW5ub3RNdXRhdGVXaXRoRXhpc3RpbmdEYXRhPTIwMDNdPSJDYW5ub3RNdXRhdGVXaXRoRXhpc3RpbmdEYXRhIixlW2UuQ2Fubm90RGVsZXRlUm9vdD0yMDA0XT0iQ2Fubm90RGVsZXRlUm9vdCIsZVtlLkNhbm5vdENoYW5nZURlZmF1bHRGaWVsZD0yMDA1XT0iQ2Fubm90Q2hhbmdlRGVmYXVsdEZpZWxkIixlW2UuQ2Fubm90UmVtb3ZlTGFzdFByb3BlcnR5PTIwMDZdPSJDYW5ub3RSZW1vdmVMYXN0UHJvcGVydHkifSkoRmw9Rmx8fChGbD17fSkpO3ZhciAkbD0oZSx0KT0+e2lmKCFlfHx0eXBlb2YgZSE9Im9iamVjdCIpe2xldCBsPW5ldyB5YShcYFBheWxvYWQ6ICR7ZX1cYCk7cmV0dXJuIGwubmFtZT0iSW52YWxpZCByZXR1cm5lZCBwYXlsb2FkIixsfWxldHttZXNzYWdlOnIsY29kZTpufT1lLG89cj9yWzBdPT09IlsiP3I6XGBbJHtGbFtuXX1dIFxgK3I6bj8iQ2Fubm90IHJlYWQgZXJyb3IgbXNnIjpKU09OLnN0cmluZ2lmeShlLG51bGwsMiksaT1uZXcgeWEobyk7cmV0dXJuIGkuc3RhY2s9dD9vKyIgIit0Om8saS5uYW1lPUZsW25dLGkuY29kZT1uLGl9O3ZhciB2YT0oZSx0LHIsbik9Pm5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShyP01sKG4uc2xpY2UoZSx0KSk6bi5zbGljZShlLHQpKSxFYz1hc3luYyhlLHQpPT57aWYoIWUuaXNEZXN0cm95ZWQpdHJ5e2xldCByPXQuZGF0YSxuPWF3YWl0IGx2KHIpLHt0eXBlOm8sbGVuOmksaXNEZWZsYXRlOmx9PWl2KG10KG4sMCw0KSk7aWYobz09PTApe2xldCBzPW10KG4sNCwzKSxhPTcsdT1pKzQscDtpIT09MyYmKHA9SlNPTi5wYXJzZSh2YShhLHUsbCxuKSkpLGUuZnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5oYXMocykmJihlLmZ1bmN0aW9uUmVzcG9uc2VMaXN0ZW5lcnMuZ2V0KHMpWzBdKHApLGUuZnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5kZWxldGUocykpfWVsc2UgaWYobz09PTMpe2xldCBzPW10KG4sNCw4KTtpZihlLmdldFN0YXRlLmhhcyhzKSYmZS5jYWNoZS5oYXMocykpe2xldCBhPWUuZ2V0U3RhdGUuZ2V0KHMpO2ZvcihsZXRbdV1vZiBhKXUoZS5jYWNoZS5nZXQocykudik7ZS5nZXRTdGF0ZS5kZWxldGUocyl9fWVsc2UgaWYobz09PTIpe2xldCBzPW10KG4sNCw4KSxhPWUuY2FjaGUuZ2V0KHMpO2lmKCFhKXtiYyhlLHMpO3JldHVybn1sZXQgdT1tdChuLDEyLDgpLHA9bXQobiwyMCw4KTtpZihhLmMhPT1wKXtiYyhlLHMpO3JldHVybn1sZXQgYz0yOCxmPWkrNCxkLG09MDtpZihpIT09MjQpe2xldCBoPWw/TWwobi5zbGljZShjLGYpKTpuLnNsaWNlKGMsZik7bT1oLmJ5dGVMZW5ndGgsZD1KU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShoKSl9dHJ5e20+YS5zJiYoZS5jYWNoZVNpemUtPWEucyxlLmNhY2hlU2l6ZSs9bSxhLnM9bSksYS52PWdtKGEudixkKSxhLmM9dX1jYXRjaHtiYyhlLHMpO3JldHVybn1pZihlLm9ic2VydmVTdGF0ZS5oYXMocykpe2xldCBoPWUub2JzZXJ2ZVN0YXRlLmdldChzKTtoLnBlcnNpc3RlbnQmJihhLnA9ITAsV2koZSxtYStzLGEpKTtmb3IobGV0WyxTXW9mIGguc3Vic2NyaWJlcnMpUy5vbkRhdGEoYS52LHUpfWlmKGUuZ2V0U3RhdGUuaGFzKHMpKXtsZXQgaD1lLmdldFN0YXRlLmdldChzKTtmb3IobGV0W1Ndb2YgaClTKGEudik7ZS5nZXRTdGF0ZS5kZWxldGUocyl9fWVsc2UgaWYobz09PTEpe2xldCBzPW10KG4sNCw4KSxhPW10KG4sMTIsOCksdT0yMCxwPWkrNCxjLGY9MDtpZihpIT09MTYpe2xldCBoPWw/TWwobi5zbGljZSh1LHApKTpuLnNsaWNlKHUscCk7Zj1oLmJ5dGVMZW5ndGgsYz1KU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShoKSl9bGV0IGQ9ZS5jYWNoZS5nZXQocyk7aWYoIShkPy5jPT09YSkpe2UuY2FjaGVTaXplKz1mLGQmJmQucyYmKGUuY2FjaGVTaXplLT1kLnMpLGUuY2FjaGVTaXplPmUubWF4Q2FjaGVTaXplJiZCbChlKTtsZXQgaD17djpjLGM6YSxzOmZ9O2lmKGUuY2FjaGUuc2V0KHMsaCksZS5vYnNlcnZlU3RhdGUuaGFzKHMpKXtsZXQgUz1lLm9ic2VydmVTdGF0ZS5nZXQocyk7Uy5wZXJzaXN0ZW50JiYoaC5wPSEwLFdpKGUsbWErcyxoKSk7Zm9yKGxldFsseV1vZiBTLnN1YnNjcmliZXJzKXkub25EYXRhKGMsYSl9fWlmKGUuZ2V0U3RhdGUuaGFzKHMpKXtsZXQgaD1lLmdldFN0YXRlLmdldChzKTtmb3IobGV0W1Ndb2YgaClTKGMpO2UuZ2V0U3RhdGUuZGVsZXRlKHMpfX1lbHNlIGlmKG89PT00KXtsZXQgYT1pKzQsdTtpIT09MyYmKHU9SlNPTi5wYXJzZSh2YSg0LGEsbCxuKSkpLHU9PT0hMD9lLmF1dGhSZXF1ZXN0LnJlc29sdmU/LihlLmF1dGhTdGF0ZSk6ImVycm9yImluIHU/KEFsKGUsdSksZS5lbWl0KCJhdXRoc3RhdGUtY2hhbmdlIixlLmF1dGhTdGF0ZSksZS5hdXRoUmVxdWVzdC5yZWplY3Q/LihuZXcgRXJyb3IodS5lcnJvcikpKTooZW4oZS5hdXRoU3RhdGUsdSk/QWwoZSx1KTooQWwoZSx1KSxlLmVtaXQoImF1dGhzdGF0ZS1jaGFuZ2UiLGUuYXV0aFN0YXRlKSksZS5hdXRoUmVxdWVzdD8ucmVzb2x2ZT8uKGUuYXV0aFN0YXRlKSl9ZWxzZSBpZihvPT09NSl7bGV0IGE9aSs0LHU7aWYoaSE9PTMmJih1PUpTT04ucGFyc2UodmEoNCxhLGwsbikpKSx1LnN0cmVhbVJlcXVlc3RJZCYmZS5zdHJlYW1GdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLmhhcyh1LnN0cmVhbVJlcXVlc3RJZCkpe2xldFsscF09ZS5zdHJlYW1GdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLmdldCh1LnN0cmVhbVJlcXVlc3RJZCk7cCgkbCh1KSksZS5zdHJlYW1GdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLmRlbGV0ZSh1LnN0cmVhbVJlcXVlc3RJZCl9aWYodS5yZXF1ZXN0SWQmJmUuZnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5oYXModS5yZXF1ZXN0SWQpKXtsZXRbLHAsY109ZS5mdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLmdldCh1LnJlcXVlc3RJZCk7cCgkbCh1LGMpKSxlLmZ1bmN0aW9uUmVzcG9uc2VMaXN0ZW5lcnMuZGVsZXRlKHUucmVxdWVzdElkKX1pZih1LmNoYW5uZWxJZCYmZS5jaGFubmVsU3RhdGUuaGFzKHUuY2hhbm5lbElkKSl7bGV0IHA9JGwodSksYz1lLmNoYW5uZWxTdGF0ZS5nZXQodS5jaGFubmVsSWQpO2ZvcihsZXRbLGZdb2YgYy5zdWJzY3JpYmVycylmLm9uRXJyb3I/Zi5vbkVycm9yKHApOmNvbnNvbGUuZXJyb3IoeW0oZSx1LmNoYW5uZWxJZCwiY2hhbm5lbCIpLHApfWlmKHUub2JzZXJ2YWJsZUlkKXtpZihlLmNhY2hlLmRlbGV0ZSh1Lm9ic2VydmFibGVJZCksZS5vYnNlcnZlU3RhdGUuaGFzKHUub2JzZXJ2YWJsZUlkKSl7bGV0IHA9JGwodSksYz1lLm9ic2VydmVTdGF0ZS5nZXQodS5vYnNlcnZhYmxlSWQpO2ZvcihsZXRbLGZdb2YgYy5zdWJzY3JpYmVycylmLm9uRXJyb3I/Zi5vbkVycm9yKHApOmNvbnNvbGUuZXJyb3IoeW0oZSx1Lm9ic2VydmFibGVJZCwic3ViIikscCl9aWYoZS5nZXRTdGF0ZS5oYXModS5vYnNlcnZhYmxlSWQpKXtsZXQgcD0kbCh1KSxjPWUuZ2V0U3RhdGUuZ2V0KHUub2JzZXJ2YWJsZUlkKTtmb3IobGV0WyxmXW9mIGMpZihwKTtlLmdldFN0YXRlLmRlbGV0ZSh1Lm9ic2VydmFibGVJZCl9fX1lbHNlIGlmKG89PT02KXtsZXQgcz1tdChuLDQsOCksYT1lLmNoYW5uZWxTdGF0ZS5nZXQocyk7aWYocyl7aWYoIWEuaW5UcmFuc2l0KXthLmluVHJhbnNpdD0hMDtsZXR7YnVmZmVyczp1LGxlbjpwfT1UYyhzLFs2LGEubmFtZSxhLnBheWxvYWRdKSxjPW5ldyBVaW50OEFycmF5KHApLGY9MDtmb3IobGV0IGQgb2YgdSljLnNldChkLGYpLGYrPWQubGVuZ3RoO2UuY29ubmVjdGlvbi53cy5zZW5kKGMpLGEucmVtb3ZlVGltZXIhPT0tMSYmYS5yZW1vdmVUaW1lcjwyJiYoYS5yZW1vdmVUaW1lcis9MSksc2V0VGltZW91dCgoKT0+e2xldCBkPWUuY2hhbm5lbFN0YXRlLmdldChzKTtkJiYoZC5pblRyYW5zaXQ9ITEpfSw1ZTMpfWUuY29ubmVjdGlvbi53cy5zZW5kKG4pfX1lbHNlIGlmKG89PT03KXtsZXQgcz1tdChuLDQsMSk7aWYocz09PTApe2xldCBhPW10KG4sNSw4KSx1PTEzLHA9aSs1LGM7aWYoaSE9PTkpe2xldCBmPXZhKHUscCxsLG4pO3RyeXtjPUpTT04ucGFyc2UoZil9Y2F0Y2h7Yz1mfX1pZihlLmNoYW5uZWxTdGF0ZS5oYXMoYSkpe2xldCBmPWUuY2hhbm5lbFN0YXRlLmdldChhKTtmb3IobGV0WyxkXW9mIGYuc3Vic2NyaWJlcnMpZC5vbk1lc3NhZ2UoYyl9fWVsc2UgaWYocz09PTEpe2xldCBhPW10KG4sNSwzKSx1PTgscD1pKzQsYztpIT09NCYmKGM9SlNPTi5wYXJzZSh2YSh1LHAsbCxuKSkpLGUuc3RyZWFtRnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5oYXMoYSkmJihlLnN0cmVhbUZ1bmN0aW9uUmVzcG9uc2VMaXN0ZW5lcnMuZ2V0KGEpWzBdKGMpLGUuc3RyZWFtRnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5kZWxldGUoYSkpfWVsc2UgaWYocz09PTIpe2xldCBhPW10KG4sNSwzKSx1PW10KG4sOCwxKSxwPW10KG4sOSwxKSxjPTA7aT4xMC00JiYoYz1tdChuLDEwLGktNiksY29uc29sZS5sb2coIm1vcmUgZGF0YSIsYykpLGUuc3RyZWFtRnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5oYXMoYSkmJmUuc3RyZWFtRnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5nZXQoYSlbMl0odSxwLGMpfX19Y2F0Y2gocil7Y29uc29sZS5lcnJvcig5ODEscil9fTt2YXIgY3Y9ZT0+e2UuX2N8fHNldFRpbWVvdXQoKCk9PntlLl9jfHwoZS5jbGllbnQub2JzZXJ2ZVN0YXRlLmZvckVhY2goKHQscik9PntsZXQgbj1lLmNsaWVudC5jYWNoZS5nZXQocik7RGwoZS5jbGllbnQsdC5uYW1lLHIsdC5wYXlsb2FkLG4/LmM/PzApfSksY3YoZSkpfSxlLmNsaWVudC5yZXN0RmFsbEJhY2sucG9sbEludmVydmFsPz8xZTMpfSxQYz1jbGFzc3t1cmw7YXV0aFN0YXRlO2NvbnN0cnVjdG9yKHQscixuKXt0aGlzLnVybD10LnJlcGxhY2UoL153cy8sImh0dHAiKSx0aGlzLmNsaWVudD1uLHRoaXMuX3I9cixjdih0aGlzKX10aW1lcjtjbGllbnQ7X2M7X3I7X29tO19vZTtfb2M7Y2xvc2UoKXt0aGlzLl9jPSEwLHRoaXMuX29jJiZ0aGlzLl9vYygpfWFkZEV2ZW50TGlzdGVuZXIodCxyKXt0PT09Im9wZW4iP3IoKTp0PT09Im1lc3NhZ2UiP3RoaXMuX29tPXI6dD09PSJlcnJvciI/dGhpcy5fb2U9cjp0PT09ImNsb3NlIiYmKHRoaXMuX29jPXIpfXJlbW92ZUV2ZW50TGlzdGVuZXIoKXt9c2VuZCh0KXt0LmJ5dGVMZW5ndGghPT0wJiZPbCh0aGlzLnVybCsiLyIrdGhpcy5fcisiLyIreGModGhpcy5jbGllbnQuYXV0aFN0YXRlKSx7bWV0aG9kOiJwb3N0Iixib2R5OnQsaGVhZGVyczp7ImNvbnRlbnQtbGVuZ3RoIjpTdHJpbmcodC5ieXRlTGVuZ3RoKX19KS50aGVuKGFzeW5jIHI9PntsZXQgbj1uZXcgVWludDhBcnJheShhd2FpdCByLmFycmF5QnVmZmVyKCkpLG89MDtmb3IoO288bi5ieXRlTGVuZ3RoOyl7bGV0IGk9bXQobixvLDQpLGw9bi5zbGljZShvKzQsaStvKzQpO2k/RWModGhpcy5jbGllbnQse2RhdGE6bH0pOmNvbnNvbGUuZXJyb3IoImVycm9yIHN0YXRlIGZpeCBsYXRlciIpLG8rPWkrNH19KS5jYXRjaChyPT57Y29uc29sZS5lcnJvcihyKX0pfX07dmFyIFFvPW5ldyBNYXAsTWM7aWYodHlwZW9mIGRvY3VtZW50PCJ1Iil7bGV0IGU9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9mZmxpbmUiLCgpPT57UW8uZm9yRWFjaCh0PT57ZT0hMCx0KCExLCEwKX0pfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9ubGluZSIsKCk9PntlJiYoZT0hMSxkb2N1bWVudC5oaWRkZW58fFFvLmZvckVhY2godD0+e3QoITAsITEpfSkpfSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoTWMpLGRvY3VtZW50LmhpZGRlbj9NYz1zZXRUaW1lb3V0KCgpPT57UW8uZm9yRWFjaCh0PT57dCghMSwhMSl9KX0sM2U0KTpRby5mb3JFYWNoKHQ9Pnt0KCEwLCExKX0pfSl9dmFyIHB2PShlPTUwMCx0LHIsbik9PntyLmZhbGxCYWNrVGltZXI9c2V0VGltZW91dCgoKT0+e2lmKCFyLmRpc2Nvbm5lY3RlZCl7Y29uc29sZS53YXJuKFxgQ2Fubm90IGNvbm5lY3QgdG8gd3MgaW4gJHtlfW1zXGApO2xldCBvPURhdGUubm93KCk7ci5mYWxsQmFja0luUHJvZ3Jlc3M9ITA7bGV0IGk9dC5yZXBsYWNlKC9ed3NzPzpcL1wvLywiIikuc3BsaXQoIi8iKSxsPVxgaHR0cCR7dC5zdGFydHNXaXRoKCJ3c3MiKT8icyI6IiJ9Oi8vJHtpWzBdfS9iYXNlZDpycHN0YXR1c1xgO09sKGwpLnRoZW4oYXN5bmMgcz0+e2lmKHIuZmFsbEJhY2tJblByb2dyZXNzKXtyLmZhbGxCYWNrSW5Qcm9ncmVzcz0hMTtsZXQgYT1hd2FpdCBzLnRleHQoKTtpZihhJiZhWzBdPT09IjEiKXtsZXQgdT1EYXRlLm5vdygpLW87Y29uc29sZS53YXJuKFxgVG9vayAke3V9bXMgZm9yIHJlc3RcYCksdTxlPyhjb25zb2xlLndhcm4oXGB3YXMgYWJsZSB0byBjb25uZWN0IHRvIHJwc3RhdHVzIHdpdGhpbiAke2V9bXMgbmVlZCB0byBmYWxsYmFjayB0byByZXN0XGApLG4oYSkpOnB2KHUrMTAwLHQscixuKX19ZWxzZSBjb25zb2xlLndhcm4oIkNvbm5lY3RlZCB3aGlsZSB0cnlpbmcgUlAgLSBza2lwIil9KX19LGUpfSx2bT0oZSx0LHI9e2Rlc3Ryb3k6KCk9PntRby5kZWxldGUocil9fSxuPTAsbz0hMSk9PihTMSh0LGk9PntzZXRUaW1lb3V0KCgpPT57aWYoci5kaXNjb25uZWN0ZWQpcmV0dXJuO2xldCBsPSEwO1FvLnNldChyLCh1LHApPT57ci5kaXNjb25uZWN0ZWR8fCghdSYmcD8obD0hMSxlLm9uQ2xvc2UoKSxzLmNsb3NlKCkpOiF1JiZsP2UuZnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5zaXplfHxydi5zdHJlYW1pbmc/KGNvbnNvbGUud2FybigiU2VuZCB0byBiYWNrZ3JvdW5kIC0gc3RyZWFtcyBvciBmdW5jdGlvbnMgaW4gcHJvZ3Jlc3MgdHJ5IGFnYWluIGluIDEwIHNlY29uZHMuLi4iKSxjbGVhclRpbWVvdXQoTWMpLE1jPXNldFRpbWVvdXQoKCk9PntRby5mb3JFYWNoKGM9PntjKCExLCExKX0pfSwxZTQpKTooY29uc29sZS53YXJuKCJTZW5kIHRvIGJhY2tncm91bmQgLSBjbG9zZSBjb25uZWN0aW9uIiksbD0hMSxlLm9uQ2xvc2UoKSxzLmNsb3NlKCkpOiFsJiZ1JiYoUW8uZGVsZXRlKHIpLHZtKGUsdCxyLDAsITApKSl9KTtsZXQgcz1yLndzPXIudXNlRmFsbGJhY2s/bmV3IFBjKGksci51c2VGYWxsYmFjayxlKTpuZXcgb3YoaSxbeGMoZS5hdXRoU3RhdGUpXSk7cy5iaW5hcnlUeXBlPSJibG9iIjtsZXQgYT0hMTshci51c2VGYWxsYmFjayYmZS5yZXN0RmFsbEJhY2smJnB2KDMwMCxpLHIsdT0+e3IudXNlRmFsbGJhY2s9dSxzLmNsb3NlKCl9KSxzLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix1PT57Y2xlYXJUaW1lb3V0KHIuZmFsbEJhY2tUaW1lciksci5mYWxsQmFja0luUHJvZ3Jlc3M9ITEsdS5tZXNzYWdlJiZ1Lm1lc3NhZ2UuaW5jbHVkZXMoIjQwMSIpJiYoYT0hMCl9KSxzLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHU9PntlLm9uRGF0YSh1KX0pLHMuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntpZihjbGVhclRpbWVvdXQoci5mYWxsQmFja1RpbWVyKSxyLmZhbGxCYWNrSW5Qcm9ncmVzcz0hMSxsKXtpZihyLmRpc2Nvbm5lY3RlZClyZXR1cm47bj0xMDAsbyYmZS5vblJlY29ubmVjdCgpLGUub25PcGVuKCl9fSkscy5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntpZihjbGVhclRpbWVvdXQoci5mYWxsQmFja1RpbWVyKSxyLmZhbGxCYWNrSW5Qcm9ncmVzcz0hMSxsKXtpZihyLmRpc2Nvbm5lY3RlZClyZXR1cm47ZS5vbkNsb3NlKCksdm0oZSx0LHIsYT81ZTM6TWF0aC5taW4oMjUwMCxuK35+KE1hdGgucmFuZG9tKCkqNTAwKSsxMDApLCEwKX19KX0sbil9KSxyKSxmdj12bTt2YXIgeG09Y2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH0pfWxpc3RlbmVycz17fTtlbWl0KHQscil7aWYodGhpcy5saXN0ZW5lcnNbdF0pe2xldCBuPXRoaXMubGlzdGVuZXJzW3RdO2ZvcihsZXQgbz0wLGk9bi5sZW5ndGg7bzxuLmxlbmd0aDtvKyspe2xldCBsPW5bb107bChyKSxpPm4ubGVuZ3RoJiZuW29dIT09bCYmKG8tLSxpPW4ubGVuZ3RoKX19fW9uKHQscil7dGhpcy5saXN0ZW5lcnNbdF18fCh0aGlzLmxpc3RlbmVyc1t0XT1bXSksdGhpcy5saXN0ZW5lcnNbdF0ucHVzaChyKX1yZW1vdmVBbGxMaXN0ZW5lcnMoKXt0aGlzLmxpc3RlbmVycz17fX1vbmNlKHQscil7aWYoIXIpcmV0dXJuIG5ldyBQcm9taXNlKG89PntsZXQgaT1sPT57byhsKSx0aGlzLm9mZih0LGkpfTt0aGlzLm9uKHQsaSl9KTtsZXQgbj0oKT0+e3RoaXMub2ZmKHQsbiksdGhpcy5vZmYodCxyKX07dGhpcy5vbih0LHIpLHRoaXMub24odCxuKX1vZmYodCxyKXtsZXQgbj10aGlzLmxpc3RlbmVyc1t0XTtpZihuKWlmKCFyKWRlbGV0ZSB0aGlzLmxpc3RlbmVyc1t0XTtlbHNle2ZvcihsZXQgbz0wO288bi5sZW5ndGg7bysrKWlmKG5bb109PT1yKXtuLnNwbGljZShvLDEpO2JyZWFrfW4ubGVuZ3RoPT09MCYmZGVsZXRlIHRoaXMubGlzdGVuZXJzW3RdfX19LGR2PXhtO3ZhciBJYz0oZSx0KT0+dD09PXZvaWQgMD9FbChlKTp0bihbZSx0XSk7dmFyIExjPWNsYXNze2lkO3F1ZXJ5O25hbWU7Y2xpZW50O3BlcnNpc3RlbnQ7Y29uc3RydWN0b3IodCxyLG4sbyl7dGhpcy5xdWVyeT1uLHRoaXMuaWQ9SWMocixuKSx0aGlzLmNsaWVudD10LHRoaXMubmFtZT1yLHRoaXMucGVyc2lzdGVudD1vPy5wZXJzaXN0ZW50fHwhMX1nZXQgY2FjaGUoKXtyZXR1cm4gdGhpcy5jbGllbnQuY2FjaGUuZ2V0KHRoaXMuaWQpfHxudWxsfWNsZWFyQ2FjaGUoKXt0aGlzLnBlcnNpc3RlbnQmJkxsKHRoaXMuY2xpZW50LCJAYmFzZWQtY2FjaGUtIit0aGlzLmlkKSx0aGlzLmNsaWVudC5jYWNoZS5kZWxldGUodGhpcy5pZCl9c3Vic2NyaWJlKHQscil7bGV0IG4sbz10aGlzLmNsaWVudC5jYWNoZS5nZXQodGhpcy5pZCk7aWYodGhpcy5jbGllbnQub2JzZXJ2ZVN0YXRlLmhhcyh0aGlzLmlkKSl7bGV0IGk9dGhpcy5jbGllbnQub2JzZXJ2ZVN0YXRlLmdldCh0aGlzLmlkKTt0aGlzLnBlcnNpc3RlbnQmJiFpLnBlcnNpc3RlbnQmJihpLnBlcnNpc3RlbnQ9ITAsbyYmV2kodGhpcy5jbGllbnQsIkBiYXNlZC1jYWNoZS0iK3RoaXMuaWQsbykpLG49KytpLmlkQ250LGkuc3Vic2NyaWJlcnMuc2V0KG4se29uRXJyb3I6cixvbkRhdGE6dH0pfWVsc2V7bj0xO2xldCBpPW5ldyBNYXA7aS5zZXQobix7b25FcnJvcjpyLG9uRGF0YTp0fSksdGhpcy5jbGllbnQub2JzZXJ2ZVN0YXRlLnNldCh0aGlzLmlkLHtwYXlsb2FkOnRoaXMucXVlcnksbmFtZTp0aGlzLm5hbWUsc3Vic2NyaWJlcnM6aSxwZXJzaXN0ZW50OnRoaXMucGVyc2lzdGVudHx8ITEsaWRDbnQ6MX0pLERsKHRoaXMuY2xpZW50LHRoaXMubmFtZSx0aGlzLmlkLHRoaXMucXVlcnksbz8uY3x8MCl9cmV0dXJuIG8mJnQoby52LG8uYyksKCk9PntsZXQgaT10aGlzLmNsaWVudC5vYnNlcnZlU3RhdGUuZ2V0KHRoaXMuaWQpO2k/KGkuc3Vic2NyaWJlcnMuZGVsZXRlKG4pLGkuc3Vic2NyaWJlcnMuc2l6ZT09PTAmJih0aGlzLmNsaWVudC5vYnNlcnZlU3RhdGUuZGVsZXRlKHRoaXMuaWQpLHRoaXMuY2xpZW50LmNhY2hlU2l6ZT50aGlzLmNsaWVudC5tYXhDYWNoZVNpemUmJkJsKHRoaXMuY2xpZW50KSxaMSh0aGlzLmNsaWVudCx0aGlzLmlkKSkpOmNvbnNvbGUud2FybigiU3Vic2NyaXB0aW9uIGFsbHJlYWR5IHJlbW92ZWQiLHRoaXMucXVlcnksdGhpcy5uYW1lKX19YXN5bmMgZ2V0V2hlbih0KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBuPXRoaXMuc3Vic2NyaWJlKChvLGkpPT57dChvLGkpJiYocihvKSxuKCkpfSl9KX1hc3luYyBnZXQoKXtyZXR1cm4gbmV3IFByb21pc2UoKHQscik9PntpZih0aGlzLmNsaWVudC5nZXRTdGF0ZS5oYXModGhpcy5pZCkpe3RoaXMuY2xpZW50LmdldFN0YXRlLmdldCh0aGlzLmlkKS5wdXNoKFt0LHJdKTtyZXR1cm59bGV0IG49dGhpcy5jbGllbnQuY2FjaGUuZ2V0KHRoaXMuaWQpO2lmKHRoaXMuY2xpZW50Lm9ic2VydmVTdGF0ZS5oYXModGhpcy5pZCkpe2lmKHRoaXMuY2xpZW50Lm9RLmhhcyh0aGlzLmlkKSl7bGV0W29dPXRoaXMuY2xpZW50Lm9RLmdldCh0aGlzLmlkKTtpZihvPT09MSl7dGhpcy5jbGllbnQuZ2V0U3RhdGUuc2V0KHRoaXMuaWQsW1t0LHJdXSk7cmV0dXJufX1pZihuKXt0KG4udik7cmV0dXJufX10aGlzLmNsaWVudC5nZXRTdGF0ZS5zZXQodGhpcy5pZCxbW3Qscl1dKSxOYyh0aGlzLmNsaWVudCx0aGlzLm5hbWUsdGhpcy5pZCx0aGlzLnF1ZXJ5LG4/LmN8fDApfSl9fTt2YXIgeGE9ZT0+e2UuY2hhbm5lbENsZWFuVGltZW91dHx8KGUuY2hhbm5lbENsZWFuVGltZW91dD1zZXRUaW1lb3V0KCgpPT57aWYoZS5jaGFubmVsQ2xlYW5UaW1lb3V0PW51bGwsZS5jb25uZWN0ZWQpe2xldCB0PSExO2UuY2hhbm5lbFN0YXRlLmZvckVhY2goKHIsbik9PntyLnJlbW92ZVRpbWVyIT09LTEmJihyLnJlbW92ZVRpbWVyLS0sci5yZW1vdmVUaW1lcj09PTA/ZS5jaGFubmVsU3RhdGUuZGVsZXRlKG4pOnQ9ITApfSksdCYmeGEoZSl9ZWxzZSB4YShlKX0sZS5jaGFubmVsQ2xlYW51cEN5Y2xlKSl9O3ZhciBBYz1jbGFzc3tpZDtwYXlsb2FkO25hbWU7Y2xpZW50O2NvbnN0cnVjdG9yKHQscixuKXt0aGlzLnBheWxvYWQ9bix0aGlzLmlkPUljKHIsbiksdGhpcy5jbGllbnQ9dCx0aGlzLm5hbWU9cn1zdWJzY3JpYmUodCxyKXtsZXQgbjtpZighdGhpcy5jbGllbnQuY2hhbm5lbFN0YXRlLmhhcyh0aGlzLmlkKXx8dGhpcy5jbGllbnQuY2hhbm5lbFN0YXRlLmdldCh0aGlzLmlkKS5zdWJzY3JpYmVycy5zaXplPT09MCl7bj0xO2xldCBvPW5ldyBNYXA7by5zZXQobix7b25NZXNzYWdlOnQsb25FcnJvcjpyfSksdGhpcy5jbGllbnQuY2hhbm5lbFN0YXRlLnNldCh0aGlzLmlkLHtwYXlsb2FkOnRoaXMucGF5bG9hZCxuYW1lOnRoaXMubmFtZSxzdWJzY3JpYmVyczpvLHJlbW92ZVRpbWVyOi0xLGlkQ250OjF9KSxfYyh0aGlzLmNsaWVudCx0aGlzLm5hbWUsdGhpcy5pZCx0aGlzLnBheWxvYWQpfWVsc2V7bGV0IG89dGhpcy5jbGllbnQuY2hhbm5lbFN0YXRlLmdldCh0aGlzLmlkKTtvLnJlbW92ZVRpbWVyPS0xLG49KytvLmlkQ250LG8uc3Vic2NyaWJlcnMuc2V0KG4se29uTWVzc2FnZTp0LG9uRXJyb3I6cn0pfXJldHVybigpPT57bGV0IG89dGhpcy5jbGllbnQuY2hhbm5lbFN0YXRlLmdldCh0aGlzLmlkKTtvLnN1YnNjcmliZXJzLmRlbGV0ZShuKSxvLnN1YnNjcmliZXJzLnNpemU9PT0wJiYoby5yZW1vdmVUaW1lcj0yLFkxKHRoaXMuY2xpZW50LHRoaXMuaWQpKX19cHVibGlzaCh0KXtpZighdGhpcy5jbGllbnQuY2hhbm5lbFN0YXRlLmhhcyh0aGlzLmlkKSl0aGlzLmNsaWVudC5jaGFubmVsU3RhdGUuc2V0KHRoaXMuaWQse3BheWxvYWQ6dGhpcy5wYXlsb2FkLG5hbWU6dGhpcy5uYW1lLHN1YnNjcmliZXJzOm5ldyBNYXAscmVtb3ZlVGltZXI6MixpZENudDowfSkseGEodGhpcy5jbGllbnQpLGtjKHRoaXMuY2xpZW50LHRoaXMubmFtZSx0aGlzLmlkLHRoaXMucGF5bG9hZCk7ZWxzZXtsZXQgcj10aGlzLmNsaWVudC5jaGFubmVsU3RhdGUuZ2V0KHRoaXMuaWQpO3IucmVtb3ZlVGltZXIhPT0tMSYmci5yZW1vdmVUaW1lcjwyJiYoci5yZW1vdmVUaW1lcj0yLHhhKHRoaXMuY2xpZW50KSl9WDEodGhpcy5jbGllbnQsdGhpcy5pZCx0KX19O3ZhciBEYz0oZT0xMDApPT5uZXcgUHJvbWlzZSh0PT57c2V0VGltZW91dCgoKT0+dCgpLGUpfSk7dmFyIG12PShlLHQscik9PntsZXQgbj1lLmxlbmd0aDtmb3IobGV0IG89MDtvPHQtbjtvKyspZT1yK2U7cmV0dXJuIGV9O3ZhciBodj0oZSx0LHI9WyIkIl0sbik9PntpZihyLmxlbmd0aD4xJiZlKXJldHVybiBpPT57bGV0IGw9IiI7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspe2xldCBhPWlbc107aWYoci5pbmNsdWRlcyhhKSl7bGV0IHU9IiI7Zm9yKGxldCBjPTA7Yzx0O2MrKyl1Kz1pW3MrYysxXTtsZXQgcD1uW3VdO2wrPXAscys9dH1lbHNlIGwrPWF9cmV0dXJuIGx9O2lmKHIubGVuZ3RoPjEpcmV0dXJuIGk9PntsZXQgbD0iIjtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrKyl7bGV0IGE9aVtzXTtpZihyLmluY2x1ZGVzKGEpKXtsZXQgdT1uW2lbcysxXV07bCs9dSxzKyt9ZWxzZSBsKz1hfXJldHVybiBsfTtsZXQgbz1yWzBdO3JldHVybiBlP2k9PntsZXQgbD0iIjtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrKyl7bGV0IGE9aVtzXTtpZihhPT09byl7bGV0IHU9IiI7Zm9yKGxldCBjPTA7Yzx0O2MrKyl1Kz1pW3MrYysxXTtsZXQgcD1uW3VdO2wrPXAscys9dH1lbHNlIGwrPWF9cmV0dXJuIGx9Omk9PntsZXQgbD0iIjtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrKyl7bGV0IGE9aVtzXTtpZihhPT09byl7bGV0IHU9bltpW3MrMV1dO2wrPXUscysrfWVsc2UgbCs9YX1yZXR1cm4gbH19O3ZhciBndj0oZSx0KT0+dCUyP2VbZS5sZW5ndGgtdF06ZVt0XSx5dj0oZSx0LHIpPT57aWYoci5sZW5ndGg+MSYmZT09PTEpe2xldCBuPXIubGVuZ3RoO3JldHVybiBvPT57bGV0IGk9MCxsPSIiO2ZvcihsZXQgcz0wO3M8by5sZW5ndGg7cysrKXtsZXQgYT1vLmNoYXJBdChzKTt0W2FdPyhpKz0xLGk+PW4mJihpPTApLGwrPWd2KHIsaSkrdFthXSk6bCs9YX1yZXR1cm4gbH19aWYoci5sZW5ndGg+MSl7bGV0IG49ci5sZW5ndGg7cmV0dXJuIG89PntsZXQgaT0wLGw9IiI7Zm9yKGxldCBzPTA7czxvLmxlbmd0aDtzKyspe2xldCBhPSExO2ZvcihsZXQgdT1lLTE7dT4tMTt1LS0pe2lmKHMrdT5vLmxlbmd0aC0xKWNvbnRpbnVlO2xldCBwPSIiO2ZvcihsZXQgYz0wO2M8dSsxO2MrKylwKz1vLmNoYXJBdChzK2MpO3RbcF0mJihpKz0xLGk+PW4mJihpPTApLGwrPWd2KHIsaSkrdFtwXSxzKz1wLmxlbmd0aC0xLHU9LTEsYT0hMCl9YXx8KGwrPW8uY2hhckF0KHMpKX1yZXR1cm4gbH19cmV0dXJuIGU9PT0xP249PntsZXQgbz0iIjtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7bGV0IGw9bi5jaGFyQXQoaSk7dFtsXT9vKz10W2xdOm8rPWx9cmV0dXJuIG99Om49PntsZXQgbz0iIjtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7bGV0IGw9ITE7Zm9yKGxldCBzPWUtMTtzPi0xO3MtLSl7aWYoaStzPm4ubGVuZ3RoLTEpY29udGludWU7bGV0IGE9IiI7Zm9yKGxldCB1PTA7dTxzKzE7dSsrKWErPW4uY2hhckF0KGkrdSk7dFthXSYmKG8rPXRbYV0saSs9YS5sZW5ndGgtMSxzPS0xLGw9ITApfWx8fChvKz1uLmNoYXJBdChpKSl9cmV0dXJuIG99fTt2YXIgdnY9KGUsdD1bIiQiXSk9PntsZXQgcj0xLG49ZS5sZW5ndGg+MzYsbz1bLi4uZSwuLi50XSxpPW8ubWFwKCh1LHApPT4odS5sZW5ndGg+ciYmKHI9dS5sZW5ndGgpLHA+MjU/U3RyaW5nKHAtMjYpOlN0cmluZy5mcm9tQ2hhckNvZGUoOTcrcCkpKSxsPXt9LHM9e307Zm9yKGxldCB1PTA7dTxvLmxlbmd0aDt1KyspbFtvW3VdXT10Lmxlbmd0aD09PTE/dFswXStpW3VdOmlbdV0sc1tpW3VdXT1vW3VdO2xldCBhPTE7aWYobil7Zm9yKGxldCB1IGluIHMpdS5sZW5ndGg+YSYmKGE9dS5sZW5ndGgpO2ZvcihsZXQgdSBpbiBzKWlmKHUubGVuZ3RoPGEpe2xldCBwPW12KHUsYSwiMCIpLGM9c1t1XTt0Lmxlbmd0aD4xP2xbY109cDpsW2NdPXRbMF0rcCxkZWxldGUgc1t1XSxzW3BdPWN9fXJldHVybntjaGFyTWFwOmwscmV2ZXJzZUNoYXJNYXA6cyxlbmNvZGU6eXYocixsLHQpLGRlY29kZTpodihuLGEsdCxzKX19O3ZhciBvTj0oZSx0LHIsbixvPSJhbGxTZXJ2aWNlcyIsaT0wKT0+KGw9PntsZXQgcz01MzgxLGE9bC5sZW5ndGg7Zm9yKDthOylzPTMzKnNebC5jaGFyQ29kZUF0KC0tYSk7bGV0IHU9cz4+PjA7Zm9yKDt1PjY1NTM1Oyl1Lz0xMDtyZXR1cm4gTWF0aC5yb3VuZCh1KX0pKFxgJHtvfS0ke2V9LSR7dH0tJHtyfS0ke259LSR7aX1cYCksd3Y9ZT0+ZXx8IkBiYXNlZC9lbnYtaHViIix4dj0vXndzLyxpTj17IkBiYXNlZC9lbnYtaHViIjowLCJAYmFzZWQvZW52LWFkbWluLWh1YiI6MSwiQGJhc2VkL2FkbWluLWh1YiI6MiwiQGJhc2VkL21hY2hpbmUtaHViIjozfSxsTj1lPT57bGV0IHQ9aU5bd3YoZS5uYW1lKV0rIiIrTWF0aC5mbG9vcigxZTQqTWF0aC5yYW5kb20oKSk7cmV0dXJuIGUua2V5P3QrIi8iKyhlLm9wdGlvbmFsS2V5P2Uua2V5KyIkIjplLmtleSk6dH0sc049YXN5bmMoZSx0LHIpPT57dHJ5e2xldCBuPWF3YWl0IE9sKFxgJHtlfS9zdGF0dXMvJHtsTih0KX1cYCx7aGVhZGVyczp0LmhlYWRlcnN9KTtpZihuLm9rKXtsZXQgbz1uLmhlYWRlcnMuZ2V0KCJ4LXJlcXVlc3QtaWQiKTtpZighbylyZXR1cm4gMTtsZXR7ZGVjb2RlOml9PXZ2KGFOLG8uc2xpY2UoMCw2KS5zcGxpdCgiIikpLGw9aShvLnNsaWNlKDYpKS5zcGxpdCgiLCIpLHM9W107Zm9yKGxldCBjPTA7YzxNYXRoLmZsb29yKGwubGVuZ3RoLzIpO2MrKylzLnB1c2goW2xbY10sZW5jb2RlVVJJQ29tcG9uZW50KGxbbC5sZW5ndGgtMS1jXSldKTtsZXRbYSx1XT1zW35+KE1hdGgucmFuZG9tKCkqcy5sZW5ndGgpXSxwPS9eaHR0cHMvLnRlc3QoZSk/InMiOiIiO3JldHVybiByP1xgaHR0cCR7cH06Ly8ke2F9XGA6XGB3cyR7cH06Ly8ke2F9LyR7dX1cYH1yZXR1cm4hMX1jYXRjaHtyZXR1cm4hMX19LFN2PWFzeW5jKGUsdD0hMSxyPTApPT57aWYoZS51cmwpe2xldCBvO3JldHVybiBvPXR5cGVvZiBlLnVybD09ImZ1bmN0aW9uIj9hd2FpdCBlLnVybCgpOmUudXJsLHQmJm8mJnh2LnRlc3Qobyk/by5yZXBsYWNlKHh2LCJodHRwIik6b31sZXQgbj1lLmRpc2NvdmVyeVVybHN8fCgoe2NsdXN0ZXI6bz0icHJvZHVjdGlvbiIsb3JnOmkscHJvamVjdDpsLGVudjpzLG5hbWU6YX0pPT5vPT09ImxvY2FsIj9bXGBodHRwOi8vbG9jYWxob3N0OiR7b04oaSxsLHMsd3YoYSkuaW5jbHVkZXMoImVudi0iKT8iQGJhc2VkL2Vudi1odWItZGlzY292ZXJ5IjoiQGJhc2VkL2h1Yi1kaXNjb3ZlcnkiLCJhbGxTZXJ2aWNlcyIpfVxgXTpbXGBodHRwczovLyR7dG4oe29yZzppLHByb2plY3Q6bCxlbnY6cyxjbHVzdGVyOm99KS50b1N0cmluZygzNil9LXN0YXR1cy5iYXNlZC5kZXZcYF0pKGUpO2ZvcihsZXQgbz0wO288bi5sZW5ndGg7bysrKXtsZXQgaT1uW29dLGw9YXdhaXQgUHJvbWlzZS5yYWNlKFtzTihpLGUsdCksRGMoM2UzKV0pO2lmKGw9PT0xfHwhbCYmbz09PW4ubGVuZ3RoLTEpcmV0dXJuIGF3YWl0IERjKE1hdGgubWluKHIqcio1MCs1MDAsNWUzKSksU3YoZSx0LCsrcik7aWYobClyZXR1cm4gbH19LGFOPVsiLCIsIi5iYXNlZC5kZXYiLCJsb2NhbGhvc3Q6IiwibG9jYWxob3N0IiwiYmFzZWQuaW8iLCJiYXNlZC5kZXYiLCJAYmFzZWQiLCIvZW52LWh1YiIsImFkbWluIiwiaHViIiwiOTAwIiwiOTAiLCI0NDMiLCI4MCIsIjoiLCIlIiwiLyIsIj0iLCI8IiwiPyIsIi4iXSx1Tj1TdixDdj1hc3luYyhlLHQpPT51TihlLHQpO3R5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93PiJ1IiYmKHdpbmRvdy5nbG9iYWw9d2luZG93KTt2YXIgd209Y2xhc3MgZXh0ZW5kcyBkdntjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKCkscj8ucGVyc2lzdGVudFN0b3JhZ2UmJih0aGlzLnN0b3JhZ2VQYXRoPXIucGVyc2lzdGVudFN0b3JhZ2UpLHI/Lm1heENhY2hlU2l6ZSYmKHRoaXMubWF4Q2FjaGVTaXplPXIubWF4Q2FjaGVTaXplKSxyPy5yZXN0RmFsbEJhY2smJih0aGlzLnJlc3RGYWxsQmFjaz1yLnJlc3RGYWxsQmFjayksdCYmdGhpcy5jb25uZWN0KHQpfXJlc3RGYWxsQmFjaztzdG9yYWdlU2l6ZT0wO21heFN0b3JhZ2VTaXplPTVlNi01MDA7c3RvcmFnZUVudktleT0wO3N0b3JhZ2VQYXRoO3N0b3JhZ2VCZWluZ1dyaXR0ZW47b3B0cztjb25uZWN0ZWQ9ITE7Y29ubmVjdGlvbjt1cmw7b3V0Z29pbmdTdHJlYW1zPW5ldyBNYXA7aXNEcmFpbmluZ1N0cmVhbXM9ITE7bWF4UHVibGlzaFF1ZXVlPTFlMztwUT1bXTtmUT1bXTtzUT1bXTtvUT1uZXcgTWFwO2NRPW5ldyBNYXA7Z1E9bmV3IE1hcDtkcmFpbkluUHJvZ3Jlc3M9ITE7ZHJhaW5UaW1lb3V0O2lkbGVQaW5nO2NhY2hlU2l6ZT0wO2xvY2FsU3RvcmFnZT0hMTttYXhDYWNoZVNpemU9NWU3O2NhY2hlPW5ldyBNYXA7ZnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycz1uZXcgTWFwO3JlcXVlc3RJZD0wO2NoYW5uZWxTdGF0ZT1uZXcgTWFwO2NoYW5uZWxDbGVhblRpbWVvdXQ7Y2hhbm5lbENsZWFudXBDeWNsZT0zZTQ7b2JzZXJ2ZVN0YXRlPW5ldyBNYXA7Z2V0U3RhdGU9bmV3IE1hcDthdXRoU3RhdGU9e307YXV0aFJlcXVlc3Q9e2F1dGhTdGF0ZTpudWxsLHByb21pc2U6bnVsbCxyZXNvbHZlOm51bGwscmVqZWN0Om51bGwsaW5Qcm9ncmVzczohMX07c3RyZWFtRnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycz1uZXcgTWFwO3N0cmVhbVJlcXVlc3RJZD0wO2NsZWFyVW51c2VkQ2FjaGUoKXtCbCh0aGlzKX1vbkNsb3NlKCl7dGhpcy5jb25uZWN0ZWQ9ITEsdGhpcy5mdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLnNpemU+dGhpcy5mUS5sZW5ndGgmJnRoaXMuZnVuY3Rpb25SZXNwb25zZUxpc3RlbmVycy5mb3JFYWNoKCh0LHIpPT57dGhpcy5mUS5maW5kKChbbl0pPT5uPT09cil8fCh0WzFdKG5ldyBFcnJvcigiU2VydmVyIGRpc2Nvbm5lY3RlZCBiZWZvcmUgZnVuY3Rpb24gcmVzdWx0IHdhcyBwcm9jZXNzZWQiKSksdGhpcy5mdW5jdGlvblJlc3BvbnNlTGlzdGVuZXJzLmRlbGV0ZShyKSl9KSx0aGlzLmVtaXQoImRpc2Nvbm5lY3QiLCEwKX1vblJlY29ubmVjdCgpe3RoaXMuY29ubmVjdGVkPSEwLHRoaXMuZW1pdCgicmVjb25uZWN0IiwhMCl9b25PcGVuKCl7dGhpcy5jb25uZWN0ZWQ9ITAsdGhpcy5lbWl0KCJjb25uZWN0IiwhMCk7Zm9yKGxldFt0LHJdb2YgdGhpcy5vYnNlcnZlU3RhdGUpaWYoIXRoaXMub1EuaGFzKHQpKXtsZXQgbj10aGlzLmNhY2hlLmdldCh0KTtEbCh0aGlzLHIubmFtZSx0LHIucGF5bG9hZCxuPy5jfHwwKX1mb3IobGV0W3Qscl1vZiB0aGlzLmNoYW5uZWxTdGF0ZSl0aGlzLmNRLmhhcyh0KXx8KHIuc3Vic2NyaWJlcnMuc2l6ZT9fYyh0aGlzLHIubmFtZSx0LHIucGF5bG9hZCk6a2ModGhpcyxyLm5hbWUsdCxyLnBheWxvYWQpKTtfbih0aGlzKX1vbkRhdGEodCl7RWModGhpcyx0KX1hc3luYyBjb25uZWN0KHQpe2lmKHQmJk9iamVjdC5rZXlzKHQpLmxlbmd0aD4wKXtpZih0aGlzLm9wdHMpe2lmKGVuKHRoaXMub3B0cyx0KSlyZXR1cm47dGhpcy5kaXNjb25uZWN0KCl9dGhpcy5vcHRzPXQsdGhpcy51cmw9KCk9PkN2KHQpLHRoaXMuc3RvcmFnZUVudktleT10bih0KSxXMSh0aGlzKX1pZighdGhpcy5vcHRzKXtjb25zb2xlLmVycm9yKCJDb25maWd1cmUgb3B0cyB0byBjb25uZWN0Iik7cmV0dXJufXRoaXMudXJsJiYhdGhpcy5jb25uZWN0aW9uJiYodGhpcy5jb25uZWN0aW9uPWZ2KHRoaXMsdGhpcy51cmwpKX1kaXNjb25uZWN0KCl7dGhpcy5jb25uZWN0aW9uJiYodGhpcy5jb25uZWN0aW9uLmRpc2Nvbm5lY3RlZD0hMCx0aGlzLmNvbm5lY3Rpb24uZGVzdHJveSgpLHRoaXMuY29ubmVjdGlvbi53cyYmdGhpcy5jb25uZWN0aW9uLndzLmNsb3NlKCksdGhpcy5jb25uZWN0ZWQmJnRoaXMub25DbG9zZSgpLGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb24pLGNsZWFyVGltZW91dCh0aGlzLmRyYWluVGltZW91dCksY2xlYXJUaW1lb3V0KHRoaXMuaWRsZVBpbmcpLHRoaXMuY29ubmVjdGVkPSExfWlzRGVzdHJveWVkO2FzeW5jIGRlc3Ryb3kodCl7dHx8YXdhaXQgZG0odGhpcywhMCksY2xlYXJUaW1lb3V0KHRoaXMuc3RvcmFnZUJlaW5nV3JpdHRlbiksY2xlYXJUaW1lb3V0KHRoaXMuY2hhbm5lbENsZWFuVGltZW91dCksdGhpcy5kaXNjb25uZWN0KCk7Zm9yKGxldCByIGluIHRoaXMpZGVsZXRlIHRoaXNbcl07dGhpcy5pc0Rlc3Ryb3llZD0hMH1jaGFubmVsKHQscil7cmV0dXJuIG5ldyBBYyh0aGlzLHQscil9cXVlcnkodCxyLG4pe3JldHVybiBuZXcgTGModGhpcyx0LHIsbil9Y2FsbCh0LHIsbil7bGV0IG89bj8ucmV0cnlTdHJhdGVneTtyZXR1cm4gbz9uZXcgUHJvbWlzZShpPT57bGV0IGw9MCxzPTAsYT11PT57bGV0IHA9byh1LGwscyk7cysrLHR5cGVvZiBwPT0ibnVtYmVyIiYmIWlzTmFOKHApJiYobD1wLHA9PT0wP2dhKHRoaXMscix0LGksYSk6c2V0VGltZW91dCgoKT0+e2dhKHRoaXMscix0LGksYSl9LHApKX07cmV0dXJuIGdhKHRoaXMscix0LGksYSl9KTpuZXcgUHJvbWlzZSgoaSxsKT0+Z2EodGhpcyxyLHQsaSxsKSl9c3RyZWFtKHQscixuKXtyZXR1cm4gbnYodGhpcyx0LHIsbil9c2V0QXV0aFN0YXRlKHQpe2lmKHR5cGVvZiB0PT0ib2JqZWN0IilyZXR1cm4gaG0odGhpcyx0KTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXV0aCgpIGFyZ3VtZW50cyIpfWNsZWFyQXV0aFN0YXRlKCl7cmV0dXJuIGhtKHRoaXMse30pfWNsZWFyU3RvcmFnZSgpe3JldHVybiBIMSh0aGlzKX1zYXZlU3RvcmFnZSgpe3JldHVybiBkbSh0aGlzKX19O2Z1bmN0aW9uIFNtKGUsdCl7cmV0dXJuIG5ldyB3bShlLHQpfXZhciBUdj13KFQoKSwxKSxLbz0oMCxUdi5jcmVhdGVDb250ZXh0KShudWxsKTt2YXIgX3Y9dyhUKCksMSk7dmFyIGt2PSh7Y2xpZW50OmUsY2hpbGRyZW46dH0pPT4oMCxfdi5jcmVhdGVFbGVtZW50KShLby5Qcm92aWRlcix7dmFsdWU6ZX0sdCk7dmFyIGpsPXcoVCgpLDEpO3ZhciBOdD0oKT0+e2xldCBlPSgwLGpsLnVzZUNvbnRleHQpKEtvKSxbdCxyXT0oMCxqbC51c2VTdGF0ZSkoZT8uYXV0aFN0YXRlfHx7fSk7cmV0dXJuKDAsamwudXNlRWZmZWN0KSgoKT0+e2lmKGUpe3IoZS5hdXRoU3RhdGUpO2xldCBuPW89PntyKG8pfTtyZXR1cm4gZS5vbigiYXV0aHN0YXRlLWNoYW5nZSIsbiksKCk9PmUub2ZmKCJhdXRoc3RhdGUtY2hhbmdlIixuKX19LFtlXSksdH07dmFyIE52PXcoVCgpLDEpO3ZhciBVPSgpPT4oMCxOdi51c2VDb250ZXh0KShLbyk7dmFyIGJ2PXcoVCgpLDEpLE9jPW5ldyBTZXQsdm89bmV3IFNldDt2YXIgWW89dyhUKCksMSk7dmFyIHBlPShlLHQscik9PntsZXQgbj0oMCxZby51c2VDb250ZXh0KShLbyk7aWYobiYmZSl7bGV0IG89bi5xdWVyeShlLHQscikse2lkOmksY2FjaGU6bH09byxbcyxhXT0oMCxZby51c2VTdGF0ZSkobD8uYyk7aWYoKDAsWW8udXNlRWZmZWN0KSgoKT0+e2xldCBwPW8uc3Vic2NyaWJlKChjLGYpPT57YShmKX0sYz0+e2EoYyl9KTtyZXR1cm4oKT0+e2xldCBjPXZvLnNpemU+MDt2by5kZWxldGUoaSkmJiEodm8uc2l6ZT4wKSYmYyYmT2MuZm9yRWFjaChmPT57ZighMSl9KSxwKCksYSgwKX19LFtpXSkscyl7bGV0IHA9dm8uc2l6ZT4wO3JldHVybiB2by5kZWxldGUoaSkmJiEodm8uc2l6ZT4wKSYmcCYmT2MuZm9yRWFjaChjPT57YyghMSl9KSx0eXBlb2Ygcz09Im51bWJlciI/bD97bG9hZGluZzohMSxkYXRhOmwudixjaGVja3N1bTpzfTp7bG9hZGluZzohMH06e2xvYWRpbmc6ITEsZXJyb3I6c319bGV0IHU9dm8uc2l6ZT4wO3JldHVybiB2by5hZGQoaSkmJih1fHxPYy5mb3JFYWNoKHA9PntwKCEwKX0pKSx7bG9hZGluZzohMH19cmV0dXJuKDAsWW8udXNlU3RhdGUpKCksKDAsWW8udXNlRWZmZWN0KSgoKT0+e30sW251bGxdKSx7bG9hZGluZzohMH19O3ZhciB3YTt0eXBlb2Ygd2luZG93PT0ib2JqZWN0Ij93YT13aW5kb3cuRU5WOnR5cGVvZiBwcm9jZXNzPT0ib2JqZWN0IiYmKHdhPXByb2Nlc3MuZW52LkVOVik7d2F8fD0icHJvZHVjdGlvbiI7Y29uc29sZS5sb2coe2Vudjp3YX0pO3ZhciBFdj17b3JnOiJzYXVseCIscHJvamVjdDoiZXUtb2JzZXJ2ZXIiLGVudjp3YX07dmFyIER2PXcoVCgpLDEpO3ZhciBXbD13KFQoKSwxKTt2YXIgemM9e30sQ209MTAsUHY9MzYsTXY9KGUsdCk9PntsZXQgcj1kdChlKTtpZighKHIgaW4gemMpKWlmKHQpQ209PT1QdiYmKENtKj0xMCxQdio9MzYpLHpjW3JdPU51bWJlcihDbSsrKS50b1N0cmluZygzNik7ZWxzZXtsZXQgbj1OdW1iZXIocj4+PjApLnRvU3RyaW5nKDM2KTt6Y1tyXT1pc05hTihOdW1iZXIoblswXSkpP246XGBfJHtufVxgfXJldHVybiB6Y1tyXX07dmFyIEl2PSJfaW5saW5lcyIsY049e2RhdGE6IiJ9LFRtPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiPygpPT4od2luZG93W0l2XXx8T2JqZWN0LmFzc2lnbihkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLHtpbm5lckhUTUw6IiAiLGlkOkl2fSkpLmZpcnN0Q2hpbGQ6KCk9PmNOO3ZhciBMdj0oZSx0KT0+dC5kYXRhLmluZGV4T2YoZSk9PT0tMSYmKHQuZGF0YT10LmRhdGErZSk7dmFyIHBOPS9eKC18Zltsb10uKltec2VdJHxnLns1LH1bXnBzXSR8enxvW3ByXXwoVy57NX0pP1tsTF1pLioodHxtcCkkfGFufChib3xzKS57NH1JbXxzY2F8bS57Nn1bZHNdfHRhfGMuKltzdF0kfHdpZG98aW5pKS8sU2E9KGUsdCk9PntsZXQgcj0iIixuPSIiLG89IiI7Zm9yKGxldCBpIGluIGUpe2xldCBsPWVbaV07aVswXT09IkAiP2lbMV09PSJpIj9yPWkrIiAiK2wrIjsiOmlbMV09PSJmIj9uKz1TYShsLGkpOm4rPWkrInsiK1NhKGwsaVsxXT09ImsiPyIiOnQpKyJ9Ijp0eXBlb2YgbD09Im9iamVjdCI/bis9U2EobCx0P3QucmVwbGFjZSgvKFteLF0pKy9nLHM9PmkucmVwbGFjZSgvKF46LiopfChbXixdKSsvZyxhPT4vJi8udGVzdChhKT9hLnJlcGxhY2UoLyYvZyxzKTpzP3MrIiAiK2E6YSkpOmkpOmwhPW51bGwmJihpPS9eLS0vLnRlc3QoaSk/aTppLnJlcGxhY2UoL1tBLVpdL2csIi0kJiIpLnRvTG93ZXJDYXNlKCksdHlwZW9mIGw9PSJudW1iZXIiJiYhcE4udGVzdChpKSYmKGw9bCsicHgiKSxvKz1pKyI6IitsKyI7Iil9cmV0dXJuIHIrKHQmJm8/dCsieyIrbysifSI6bykrbn07dmFyIENhPXt9LEF2PWU9PntpZih0eXBlb2YgZT09Im9iamVjdCIpe2xldCB0PSIiO2ZvcihsZXQgciBpbiBlKXQrPXIrQXYoZVtyXSk7cmV0dXJuIHR9cmV0dXJuIGV9LF9tPShlLHQscj0hMSxuKT0+e2xldCBvPUF2KGUpLGk9Q2Fbb118fChDYVtvXT1NdihvLG4pKTtyZXR1cm4gQ2FbaV18fChDYVtpXT1TYShyP3tbIkBrZXlmcmFtZXMgIitpXTplfTplLCIuIitpKSksTHYoQ2FbaV0sdCksaX07dmFyIGttPShlLHQpPT5fbShlLFRtKCksITEsdCksWXQ9KGUsdCk9Pl9tKGUsVG0oKSwhMCx0KTt2YXIgTm09KGUsdCk9Pntmb3IobGV0IHIgaW4gZSl0eXBlb2YgZVtyXT09Im9iamVjdCI/clswXT09PSImIiYmTm0oZVtyXSx0KTpyIGluIHQmJiEvIWltcG9ydGFudC8udGVzdChlW3JdKSYmKGVbcl0rPSIgIWltcG9ydGFudCIpfSxibT0oZSx0PXt9LHIpPT57bGV0IG49ey4uLmUscmVmOnJ9LG89e307Zm9yKGxldCBpIGluIHQpe2xldCBsPXRbaV07aWYodHlwZW9mIGw9PSJvYmplY3QiKXtpZihsIT09bnVsbCl7aWYoaVswXT09PSJAIil7aWYoaVsxXT09PSJtIilObShsLHQpO2Vsc2UgaWYoaVsxXT09PSJrIil7by5hbmltYXRpb249XGAke1l0KGwpfSAxc1xgO2NvbnRpbnVlfX1lbHNlIGlbMF09PT0iJiImJihpLmluY2x1ZGVzKCI6aG92ZXIiKSYmKGw9e1tpXTpsfSxpPSJAbWVkaWEgKGhvdmVyOiBob3ZlcikiKSxObShsLHQpKTtsZXQgcz1rbSh7W2ldOmx9KTtuLmNsYXNzTmFtZT1uLmNsYXNzTmFtZT9cYCR7bi5jbGFzc05hbWV9ICR7c31cYDpzfX1lbHNlIG9baV09bH1yZXR1cm4gZS5vbkNsaWNrJiYhby5jdXJzb3ImJihvLmN1cnNvcj0icG9pbnRlciIpLG4uc3R5bGU9byxufTt2YXIgeD1uZXcgUHJveHkoKGUsdCk9PigwLFdsLmZvcndhcmRSZWYpKChuLG8pPT4oMCxXbC5jcmVhdGVFbGVtZW50KShlLGJtKG4sbi5zdHlsZT97Li4udCwuLi5uLnN0eWxlfTp0LG8pLG4uY2hpbGRyZW4pKSx7Z2V0KGUsdCl7aWYoISh0IGluIGUpKWlmKHQ9PT0icHJvdG90eXBlIillW3RdPXZvaWQgMDtlbHNle2xldCByPXQudG9Mb3dlckNhc2UoKSxuPSgwLFdsLmZvcndhcmRSZWYpKChvLGkpPT4oMCxXbC5jcmVhdGVFbGVtZW50KShyLGJtKG8sby5zdHlsZSxpKSxvLmNoaWxkcmVuKSk7ZVt0XT1ufXJldHVybiBlW3RdfX0pO3ZhciBiZT0oe2NoaWxkcmVuOmUsc3R5bGU6dH0pPT5Edi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYTggYyBhOSBhYSIsc3R5bGU6ey4uLnR9fSxlKTt2YXIgTWU9dyhUKCksMSk7dmFyIGthPXcoVCgpLDEpO3ZhciBiPWU9PmU9PT0iaW5oZXJpdCI/ImluaGVyaXQiOlxgdmFyKC0tJHtlfSlcYDt2YXIgVWk9dyhUKCksMSk7dmFyICRjPXcoVCgpLDEpO3ZhciBCYz0vXFsuKj9cXS9nLGZOPS9eLnswfSQvLEZjPWU9PmUuc3BsaXQoIi8iKS5tYXAodD0+e2xldCByPXQubWF0Y2goQmMpLG49cj09PW51bGw/Zk46bmV3IFJlZ0V4cCgiXiIrdC5yZXBsYWNlKEJjLCIoLispPyIpKyIkIiksbz1yP3IubWFwKGk9Pmkuc2xpY2UoMSwtMSkpOltdO2ZvcihsZXQgaT0wO2k8by5sZW5ndGg7aSsrKXtsZXQgbD1vW2ldO2lmKGwuc3RhcnRzV2l0aCgiLi4uIikpe2xldCBzPWwuc2xpY2UoMyk7cmV0dXJuIG9baV09cyx7c3ByZWFkOnMsdmFyczpvLG1hdGNoZXI6bixzZWc6dCxub1Zhcjp0LnJlcGxhY2UoQmMsIiIpfX19cmV0dXJue3ZhcnM6byxtYXRjaGVyOm4sc2VnOnQsbm9WYXI6dC5yZXBsYWNlKEJjLCIiKX19KSxUYT0oZSx0KT0+ZT09PXZvaWQgMHx8ZT09PSIiP3Q+MD8iKiI6IiI6dHlwZW9mIGU9PSJvYmplY3QiP2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShlKSk6ZTt2YXIgX2E9dHlwZW9mIHdpbmRvdzwidSIsT3Y9KGUsdCxyKT0+ZSYmdD9yKyI/IitlKyIjIit0OmU/cisiPyIrZTp0P3IrIiMiK3Q6cixqYz0oZT0iIix0PXtwYXRoOl9hP3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZToiIixxdWVyeTpfYT93aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKTp2b2lkIDAsaGFzaDpfYSYmd2luZG93LmxvY2F0aW9uLmhhc2g/d2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpOnZvaWQgMH0scj0iIik9PntsZXQgbj0oMCwkYy51c2VNZW1vKSgoKT0+e2xldHtwYXRoOm8scXVlcnk6aSxoYXNoOmx9PXQscz1uZXcgUmVnRXhwKFxgXiR7cn1cYCksYT1uZXcgTWFwLHU9T3YoaSxsLG8pLHA9e2lzUm9vdDohMCxjb21wb25lbnRNYXA6YSxwcmVmaXg6cixwcmVmaXhSZTpzLGhhc2hDaGFuZ2VkOiExLHF1ZXJ5Q2hhbmdlZDohMSxwYXRoQ2hhbmdlZDohMSxoYXNoOmwscGF0aE5hbWU6by5yZXBsYWNlKHMsIiIpLHF1ZXJ5Omk/dWEoZGVjb2RlVVJJQ29tcG9uZW50KGkpKXx8e306e30sbG9jYXRpb246dSx1cGRhdGVSb3V0ZTpjPT57Wy4uLmEudmFsdWVzKCldLnNvcnQoKGQsbSk9PmQucm91dGUuc3RhcnQ8bS5yb3V0ZS5zdGFydD8tMTpkLnJvdXRlLnN0YXJ0PT09bS5yb3V0ZS5zdGFydD8wOjEpLmZvckVhY2goZD0+e2QudXBkYXRlKCl9KSxuLnBhdGhDaGFuZ2VkPSExLG4uaGFzaENoYW5nZWQ9ITEsbi5xdWVyeUNoYW5nZWQ9ITEsIWMmJl9hJiZ3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUodm9pZCAwLHZvaWQgMCxwLmxvY2F0aW9ufHwiLyIpfSxjaGlsZHJlbjpbXSxwYXRoOkZjKGUpfTtyZXR1cm4gcH0sW2VdKTtyZXR1cm4oMCwkYy51c2VFZmZlY3QpKCgpPT57aWYoX2Epe2xldCBvPSgpPT57bGV0IGk9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLGw9d2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkscz13aW5kb3cubG9jYXRpb24uaGFzaDtuLmhhc2ghPT1zJiYobi5oYXNoQ2hhbmdlZD0hMCksbi5oYXNoPXMsaSE9PW4ucGF0aE5hbWUmJihuLnBhdGhDaGFuZ2VkPSEwKSxuLnBhdGhOYW1lPWksbCE9PW4ucXVlcnlTdHJpbmcmJihuLnF1ZXJ5Q2hhbmdlZD0hMCksbi5xdWVyeVN0cmluZz1sLG4ucXVlcnk9bD91YShkZWNvZGVVUklDb21wb25lbnQobCkpfHx7fTp7fTtsZXQgYT1PdihsLHMsaSk7YSE9PW4ubG9jYXRpb24mJihuLmxvY2F0aW9uPWEsbi51cGRhdGVSb3V0ZSghMCkpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLG8pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsbyksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsbyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIixvKX19cmV0dXJuKCk9Pnt9fSxbZV0pLG59O3ZhciBybj13KFQoKSwxKTt2YXIgenY9dyhUKCksMSksQnY9KCk9PntsZXRbLGVdPSgwLHp2LnVzZVN0YXRlKSgwKTtyZXR1cm4oKT0+e2UodD0+dCsxKX19O3ZhciAkdj13KFQoKSwxKTt2YXIgRW09KGUsdCxyLG4pPT57bGV0IG89e30saT1lLnBhdGhOYW1lLnNwbGl0KCIvIik7Zm9yKGxldCBsPTA7bDxyLmxlbmd0aCtuKzE7bCsrKXtsZXQgcz1pW2xdO2lmKGw+bil7bGV0e3ZhcnM6YSxtYXRjaGVyOnUsc3ByZWFkOnB9PXJbbC1uLTFdO2lmKHApe2xldCBjPWkuc2xpY2UobCk7b1twXT1jLm1hcChmPT5kZWNvZGVVUklDb21wb25lbnQoZikpO2JyZWFrfWlmKHMpe2xldCBjPWlbbF0ubWF0Y2godSk7aWYoYylmb3IobGV0IGY9MTtmPGMubGVuZ3RoO2YrKyljW2ZdPT09IioifHxjW2ZdPT09dm9pZCAwP29bYVtmLTFdXT12b2lkIDA6Y1tmXT9vW2FbZi0xXV09ZGVjb2RlVVJJQ29tcG9uZW50KGNbZl0pOm9bYVtmLTFdXT1jW2ZdO2Vsc2UgcmV0dXJue319fWVsc2UgaWYoIXRbbF0ubWF0Y2hlci50ZXN0KHMpKXJldHVybnt9fXJldHVybiBvfSxXYz0oZSx0LHIpPT5lJiZ0P3IrIj8iK2UrIiMiK3Q6ZT9yKyI/IitlOnQ/cisiIyIrdDpyO2Z1bmN0aW9uIEZ2KGUsdCl7aWYoZT09PXQubG9jYXRpb24pcmV0dXJuITE7bGV0W3Isbj0iIl09ZS5zcGxpdCgiIyIpLFtvLGldPXIuc3BsaXQoIj8iKTt0Lmhhc2g9bjtsZXQgbD1pP3VhKGRlY29kZVVSSUNvbXBvbmVudChpKSl8fHt9Ont9O3JldHVybiBvIT09dC5wYXRoTmFtZSYmKHQucGF0aENoYW5nZWQ9ITApLGVuKGwsdC5xdWVyeSl8fCh0LnF1ZXJ5Q2hhbmdlZD0hMCksbiE9PXQuaGFzaCYmKHQuaGFzaENoYW5nZWQ9ITApLHQucGF0aE5hbWU9byx0LnF1ZXJ5PWwsdC5oYXNoPW4sdC5sb2NhdGlvbj10LnByZWZpeCtlLHQudXBkYXRlUm91dGUoITEpLCEwfXZhciBIYz1jbGFzc3tzdGFydDtjdHg7cm9vdEN0eDtfdXNlc1F1ZXJ5O191c2VzTG9jYXRpb247X3VzZXNIYXNoO19wYXRoUGFyYW1zO19mcm9tUGF0aDtwcmVwYXJlZFBhdGg7Y29uc3RydWN0b3IodCxyLG4sbyxpKXtpZih0aGlzLmN0eD10LHRoaXMucm9vdEN0eD1yLHRoaXMuc3RhcnQ9bix0aGlzLl9mcm9tUGF0aD1vLCFpKXJldHVybiB0aGlzLnByZXBhcmVkUGF0aD1bXSx0aGlzO3RoaXMucHJlcGFyZWRQYXRoPUZjKGkpfW5lc3QodCl7cmV0dXJuICR2LmRlZmF1bHQuY3JlYXRlRWxlbWVudChYby5Qcm92aWRlcix7dmFsdWU6e3JvdXRlOnRoaXMscGF0aDp0aGlzLnByZXBhcmVkUGF0aCxwYXJlbnQ6dGhpcy5jdHgsY2hpbGRyZW46W10saXNSb290OiExfX0sdCl9dXBkYXRlKCl7aWYodGhpcy5wcmVwYXJlZFBhdGgubGVuZ3RoJiZ0aGlzLnJvb3RDdHgucGF0aENoYW5nZWQpe2xldCB0PUVtKHRoaXMucm9vdEN0eCx0aGlzLl9mcm9tUGF0aCx0aGlzLnByZXBhcmVkUGF0aCx0aGlzLnN0YXJ0KTtyZXR1cm4gZW4odGhpcy5fcGF0aFBhcmFtc3x8e30sdCk/ITE6KHRoaXMuX3BhdGhQYXJhbXM9dCwhMCl9cmV0dXJuISEodGhpcy5fdXNlc1F1ZXJ5JiZ0aGlzLnJvb3RDdHgucXVlcnlDaGFuZ2VkfHx0aGlzLl91c2VzSGFzaCYmdGhpcy5yb290Q3R4Lmhhc2hDaGFuZ2VkfHx0aGlzLl91c2VzTG9jYXRpb24pfWdldCBsb2NhdGlvbigpe3JldHVybiB0aGlzLl91c2VzTG9jYXRpb249ITAsdGhpcy5yb290Q3R4LmxvY2F0aW9ufWdldCBwYXRoKCl7aWYoIXRoaXMucHJlcGFyZWRQYXRoLmxlbmd0aCl7bGV0IHQ9dGhpcy5jdHg7Zm9yKDt0Oyl7aWYodC5yb3V0ZT8ucHJlcGFyZWRQYXRoKXJldHVybiB0LnJvdXRlLnBhdGg7dD10LnBhcmVudH19cmV0dXJuIHRoaXMucHJlcGFyZWRQYXRoLmxlbmd0aD90aGlzLl9wYXRoUGFyYW1zfHwodGhpcy5fcGF0aFBhcmFtcz1FbSh0aGlzLnJvb3RDdHgsdGhpcy5fZnJvbVBhdGgsdGhpcy5wcmVwYXJlZFBhdGgsdGhpcy5zdGFydCkpOnt9fWdldCBxdWVyeSgpe3JldHVybiB0aGlzLl91c2VzUXVlcnk9ITAsdGhpcy5yb290Q3R4LnF1ZXJ5fHx7fX1nZXQgaGFzaCgpe3JldHVybiB0aGlzLl91c2VzSGFzaD0hMCx0aGlzLnJvb3RDdHguaGFzaH1zZXRQYXRoKHQscil7bGV0IG49ey4uLnR9O2lmKCFyKWZvcihsZXQgaSBpbiB0aGlzLl9wYXRoUGFyYW1zKXtsZXQgbD10aGlzLl9wYXRoUGFyYW1zW2ldOyhsIT09dm9pZCAwJiZuW2ldPT09IiJ8fG5baV09PT12b2lkIDApJiYobltpXT1sKX1pZihlbih0aGlzLl9wYXRoUGFyYW1zLG4pKXJldHVybiExO2xldCBvPXRoaXMucGFyc2VMb2NhdGlvbihuKTtyZXR1cm4gdGhpcy5zZXRMb2NhdGlvbihvKX1zZXRRdWVyeSh0LHIpe3Q9PT1udWxsP3RoaXMucm9vdEN0eC5xdWVyeT17fTpyPy5vdmVyd3JpdGU/dGhpcy5yb290Q3R4LnF1ZXJ5PXQ6ZW0odGhpcy5yb290Q3R4LnF1ZXJ5fHx7fSx0KTtmb3IobGV0IGwgaW4gdGhpcy5yb290Q3R4LnF1ZXJ5KXRoaXMucm9vdEN0eC5xdWVyeVtsXT09PW51bGwmJmRlbGV0ZSB0aGlzLnJvb3RDdHgucXVlcnlbbF07bGV0IG49UGwodGhpcy5yb290Q3R4LnF1ZXJ5KTtpZih0aGlzLnJvb3RDdHgucXVlcnlTdHJpbmc9PT1uKXJldHVybiEwO3RoaXMucm9vdEN0eC5xdWVyeVN0cmluZz1uO2xldFtvXT10aGlzLnJvb3RDdHgubG9jYXRpb24uc3BsaXQoIiMiKSxbaV09by5zcGxpdCgiPyIpO3JldHVybiB0aGlzLnJvb3RDdHgubG9jYXRpb249V2Mobix0aGlzLnJvb3RDdHguaGFzaCxpKSx0aGlzLnJvb3RDdHgucXVlcnlDaGFuZ2VkPSEwLHRoaXMucm9vdEN0eC51cGRhdGVSb3V0ZSghMSksITB9c2V0SGFzaCh0KXtpZih0PT09dGhpcy5yb290Q3R4Lmhhc2gpcmV0dXJuITE7dHx8KHRoaXMucm9vdEN0eC5oYXNoPSIiKSx0aGlzLnJvb3RDdHguaGFzaD10O2xldFtyXT10aGlzLnJvb3RDdHgubG9jYXRpb24uc3BsaXQoIiMiKSxbbixvXT1yLnNwbGl0KCI/Iik7cmV0dXJuIHRoaXMucm9vdEN0eC5sb2NhdGlvbj1XYyhvLHQsbiksdGhpcy5yb290Q3R4Lmhhc2hDaGFuZ2VkPSEwLHRoaXMucm9vdEN0eC51cGRhdGVSb3V0ZSghMSksITB9c2V0TG9jYXRpb24odCl7cmV0dXJuIEZ2KHQsdGhpcy5yb290Q3R4KX1wYXJzZUxvY2F0aW9uKHQpe2xldCByPW5ldyBNYXAsbj1PYmplY3Qua2V5cyh0KS5sZW5ndGg7Zm9yKGxldCBjPXRoaXMucHJlcGFyZWRQYXRoLmxlbmd0aC0xO2M+LTE7Yy0tKXtsZXQgZj10aGlzLnByZXBhcmVkUGF0aFtjXTtmb3IobGV0IGQgaW4gdClpZihmLnZhcnMuaW5jbHVkZXMoZCkpe2xldCBtPWYuc3ByZWFkPyIuLi4iK2Q6ZDtyLmhhcyhjKXx8ci5zZXQoYyxbZi5zZWcsbmV3IFNldF0pO2xldCBoPXIuZ2V0KGMpO2lmKHRbZF09PT1udWxsP2hbMF09aFswXS5yZXBsYWNlQWxsKFxgWyR7bX1dXGAsIiIpOkFycmF5LmlzQXJyYXkodFtkXSk/aFswXT1oWzBdLnJlcGxhY2VBbGwoXGBbJHttfV1cYCx0W2RdLmpvaW4oIi8iKSk6aFswXT1oWzBdLnJlcGxhY2VBbGwoXGBbJHttfV1cYCx0W2RdPT09dm9pZCAwPyIqIjpTdHJpbmcodFtkXSkpLGhbMV0uYWRkKGQpLG4tLSxuPT09MClicmVha31pZihyLmhhcyhjKSl7bGV0IGQ9ci5nZXQoYyk7Zm9yKGxldCBtIG9mIGYudmFycylkWzFdLmhhcyhtKXx8KGRbMF09ZFswXS5yZXBsYWNlQWxsKFxgWyR7bX1dXGAsU3RyaW5nKHRoaXMuX3BhdGhQYXJhbXNbbV0/PyIiKSkpfWlmKG49PT0wKWJyZWFrfWxldFtvLGk9IiJdPXRoaXMucm9vdEN0eC5sb2NhdGlvbi5zcGxpdCgiIyIpLFtsLHNdPW8uc3BsaXQoIj8iKSxhPWwuc3BsaXQoIi8iKSx1PVtdO2lmKG4pe2xldCBjPXRoaXMuY3R4O2Zvcig7Yzspe2lmKGMucGF0aClmb3IobGV0IGY9MDtmPGMucGF0aC5sZW5ndGg7ZisrKXtsZXQgZD1jLnBhdGhbZl07Zm9yKGxldCBtIGluIHQpaWYoZC52YXJzLmluY2x1ZGVzKG0pJiYodFttXT09PW51bGw/YVtjLnJvdXRlLnN0YXJ0K2YrMV09IiI6YVtjLnJvdXRlLnN0YXJ0K2YrMV09U3RyaW5nKHRbbV18fCIiKSxuLS0sbj09PTApKWJyZWFrO2lmKG49PT0wKWJyZWFrfWlmKG49PT0wKWJyZWFrO2M9Yy5wYXJlbnR9fWZvcihsZXQgYz0wO2M8dGhpcy5fZnJvbVBhdGgubGVuZ3RoO2MrKyl7bGV0IGY9dGhpcy5fZnJvbVBhdGhbY107Zi5tYXRjaGVyLnRlc3QoYVtjXSk/dS5wdXNoKFRhKGFbY10sdS5sZW5ndGgpKTp1LnB1c2goVGEoZi5ub1Zhcix1Lmxlbmd0aCkpfWZvcihsZXQgYz0wO2M8dGhpcy5wcmVwYXJlZFBhdGgubGVuZ3RoO2MrKyl1LnB1c2goVGEodGhpcy5wcmVwYXJlZFBhdGhbY10ubm9WYXIsdS5sZW5ndGgpKTtyLmZvckVhY2goKGMsZik9PntsZXQgZD1mK3RoaXMuc3RhcnQrMTt1W2RdPVRhKGNbMF0sZCl9KTtmb3IobGV0IGM9dS5sZW5ndGgtMTtjPi0xJiYodVtjXT09PSIqInx8dVtjXT09PSIiKTtjLS0pdS5wb3AoKTtyZXR1cm4gV2MocyxpLHUuam9pbigiLyIpKX19O3ZhciBkTj0xLGo9KGUsdCk9PntsZXQgcj0oMCxybi51c2VDb250ZXh0KShYbyksbj1yLG8saT1bXSxsPSgwLHJuLnVzZU1lbW8pKCgpPT4rK2ROLFtdKTtmb3IoO24mJiFvOyl7aWYoaS51bnNoaWZ0KC4uLm4ucGF0aCksbi5pc1Jvb3Qpe289bjticmVha31uPW4ucGFyZW50fW8/by5jcmVhdGVkQnk9PT1sJiYoKDAscm4udXNlTWVtbykoKCk9Pnt9LFsiIl0pLCgwLHJuLnVzZUVmZmVjdCkoKCk9Pnt9LFsiIl0pKToobz1qYygpLHIucGFyZW50PW8sby5jcmVhdGVkQnk9bCxpLnVuc2hpZnQoLi4uby5wYXRoKSk7bGV0IHM9aS5sZW5ndGgtMSxhPSgwLHJuLnVzZU1lbW8pKCgpPT5uZXcgSGMocixvLHMsaSxlKSxbZSxzXSk7KDAscm4udXNlTWVtbykoKCk9PntpZih0KXtsZXQgcD17fSxjPSExO2ZvcihsZXQgZiBpbiB0KWEucGF0aFtmXT09PXZvaWQgMCYmKHBbZl09YS5fcGF0aFBhcmFtc1tmXT10W2ZdLGM9ITApO2MmJihvLmxvY2F0aW9uPWEucGFyc2VMb2NhdGlvbihwKSxvLnVwZGF0ZVJvdXRlKCExKSl9fSxbZV0pO2xldCB1PUJ2KCk7cmV0dXJuKDAscm4udXNlRWZmZWN0KSgoKT0+KCk9PntvLmNvbXBvbmVudE1hcC5kZWxldGUobCl9LFtdKSxvLmNvbXBvbmVudE1hcC5zZXQobCx7cm91dGU6YSx1cGRhdGU6KDAscm4udXNlQ2FsbGJhY2spKCgpPT57YS51cGRhdGUoKSYmdSgpfSxbZV0pfSksYX07dmFyIG1OPXtwYXRoOltdLGNoaWxkcmVuOltdLGlzUm9vdDohMX0sWG89KDAsVWkuY3JlYXRlQ29udGV4dCkobU4pLGhOPSh7Y2hpbGRyZW46ZX0pPT5qKCkubmVzdChlKSxnTj0oe2NoaWxkcmVuOmUscGF0aDp0LGxvY2F0aW9uOnIscHJlZml4Om59KT0+VWkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFhvLlByb3ZpZGVyLHt2YWx1ZTpqYyh0LHIsbil9LFVpLmRlZmF1bHQuY3JlYXRlRWxlbWVudChoTixudWxsLGUpKSxqdj0oe2NoaWxkcmVuOmUscm91dGVzOnQscGF0aDpyLGxvY2F0aW9uOm4scHJlZml4Om99KT0+dD9VaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWG8uUHJvdmlkZXIse3ZhbHVlOnR9LGUpOlVpLmRlZmF1bHQuY3JlYXRlRWxlbWVudChnTix7cHJlZml4Om8scGF0aDpyfHwiIixsb2NhdGlvbjpufSxlKTt2YXIgeG89dyhUKCksMSk7dmFyIFVjPSh7b25DbGljazplLHBhdGg6dCxxdWVyeTpyLGhhc2g6bixocmVmOm8sLi4uaX0pPT57bGV0IGw9KDAseG8udXNlQ29udGV4dCkoWG8pO2lmKGwuaXNSb290KXtsZXQgdT0iTGluayBuZWVkcyB0byBiZSB1c2VkIGluIGEgbmVzdGVkIHJvdXRlIjtyZXR1cm4gY29uc29sZS5lcnJvcih1KSx4by5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOntjb2xvcjoicmVkIn19LHUpfWxldCBzPSgwLHhvLnVzZU1lbW8pKCgpPT57aWYobylyZXR1cm4gbztsZXQgdT0iLyI7dD91PWwucm91dGUucGFyc2VMb2NhdGlvbih0KS5zcGxpdCgiPyIpWzBdOnU9bC5yb3V0ZS5yb290Q3R4LmxvY2F0aW9uLnJlcGxhY2UobC5yb3V0ZS5yb290Q3R4LnByZWZpeFJlLCIiKTtsZXQgcD1yPyI/IitQbChyKToiIixjPW4/IiMiK246IiI7cmV0dXJuIGwucm91dGUucm9vdEN0eC5wcmVmaXgrdStjK3B8fCIvIn0sW3Q/dG4odCk6bnVsbCxyLG4sb10pLGE9KDAseG8udXNlQ2FsbGJhY2spKHU9PntpZihlJiZlKHUpKXJldHVybiB1LnByZXZlbnREZWZhdWx0KCksdS5zdG9wUHJvcGFnYXRpb24oKSwhMTtpZighcy5zdGFydHNXaXRoKCJodHRwIikpcmV0dXJuIHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpLG8mJmwucm91dGUuc2V0TG9jYXRpb24obyksciE9PXZvaWQgMCYmbC5yb3V0ZS5zZXRRdWVyeShyKSx0JiZsLnJvdXRlLnNldFBhdGgodCksITF9LFtzLGVdKTtyZXR1cm4geG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7aHJlZjpzLG9uQ2xpY2s6YSwuLi5pfSl9O3ZhciB5Tj0oe3NpemU6ZT0icmVndWxhciIsY29sb3I6dD0ib3JhbmdlIixzdHlsZTpyfSk9PmthLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJjaiBjeSBjbSIsc3R5bGU6e2NvbG9yOmIodCksbGluZUhlaWdodDplPT09InJlZ3VsYXIiPyI0OHB4IjoiMjZweCIsZm9udFNpemU6ZT09PSJyZWd1bGFyIj8iNDVweCI6IjI0cHgiLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2ZvbnRTaXplOmU9PT0icmVndWxhciI/IjMwcHgiOiIyNHB4IixsaW5lSGVpZ2h0OmU9PT0icmVndWxhciI/IjMwcHgiOiIyNHB4In0sLi4ucn19LCJldSIsa2EuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJiIix7Y2xhc3NOYW1lOiJjaiBpbSJ9LCJvYnNlcnZlciIpKSxWaT1lPT5rYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVWMse3N0eWxlOntjdXJzb3I6InBvaW50ZXIifSxwYXRoOntzZWN0aW9uOm51bGwsaWQ6bnVsbH0scXVlcnk6bnVsbH0sa2EuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHlOLHsuLi5lfSkpO3ZhciB2ZT13KFQoKSwxKTt2YXIgSz12ZS5mb3J3YXJkUmVmKCh7Y2hpbGRyZW46ZSxzdHlsZTp0LGNvbG9yOnI9ImJsYWNrIn0sbik9PnZlLmNyZWF0ZUVsZW1lbnQoeC5zcGFuLHtjbGFzc05hbWU6ImNqIGNrIGNsIGNtIixyZWY6bixzdHlsZTp7Y29sb3I6YihyKSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7Zm9udFNpemU6IjE3cHgifSwuLi50fX0sZSkpLGRlPSh7Y2hpbGRyZW46ZSxzdHlsZTp0LHNpbmdsZUxpbmU6cixjb2xvcjpuPSJibGFjayJ9KT0+cj92ZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgYyJ9LHZlLmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiY24gYTYgY28gY3AgY3EgY2ogY3IgY3MgY3QiLHN0eWxlOntjb2xvcjpiKG4pLC4uLnQsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2ZvbnRTaXplOiIyOHB4IixsaW5lSGVpZ2h0OiIzMHB4IiwuLi50WyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiXX19fSxlKSx2ZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImN1In0pKTp2ZS5jcmVhdGVFbGVtZW50KHguaDIse2NsYXNzTmFtZToiY2ogY3IgY3MgY3QiLHN0eWxlOntjb2xvcjpiKG4pLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOntmb250U2l6ZToiMjhweCIsbGluZUhlaWdodDoiMzBweCJ9LC4uLnR9fSxlKSxubj0oe2NoaWxkcmVuOmUsc3R5bGU6dCxzaW5nbGVMaW5lOnIsY29sb3I6bj0iYmxhY2sifSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5oMyx7Y2xhc3NOYW1lOiJjaiBjdiBjdyBjbSIsc3R5bGU6e2NvbG9yOmIobiksLi4udH19LGUpLGh0PSh7Y2hpbGRyZW46ZSxzdHlsZTp0LGJvbGQ6cixjb2xvcjpuPSJibGFjayJ9KT0+dmUuY3JlYXRlRWxlbWVudCh4LnAse2NsYXNzTmFtZToiY2ogY3ggY3kgY3ciLHN0eWxlOntmb250V2VpZ2h0OnI/IjcwMCI6IjQwMCIsY29sb3I6YihuKSwuLi50fX0sZSksZ3Q9KHtjaGlsZHJlbjplLHN0eWxlOnQsb25DbGljazpyLHNpbmdsZUxpbmU6bixjb2xvcjpvPSJpbmhlcml0In0pPT52ZS5jcmVhdGVFbGVtZW50KHguc3Bhbix7Y2xhc3NOYW1lOiJjeiBkMCBkMSBkMiIsb25DbGljazpyLHN0eWxlOnt3aGl0ZVNwYWNlOm4/Im5vd3JhcCI6dm9pZCAwLGNvbG9yOmIobyksLi4udH19LGUpLFZjPSh7Y2hpbGRyZW46ZSxzdHlsZTp0LGNvbG9yOnI9ImJsYWNrIn0pPT52ZS5jcmVhdGVFbGVtZW50KHguaDEse2NsYXNzTmFtZToiY2ogZDMgY20gZDQgYTciLHN0eWxlOntjb2xvcjpiKHIpLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2ZvbnRTaXplOiIyOHB4IixsaW5lSGVpZ2h0OiIzMHB4In0sLi4udH19LGUpLEhsPSh7Y2hpbGRyZW46ZSxzdHlsZTp0fSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5oMix7Y2xhc3NOYW1lOiJjaiBkNSBkNiBkNyBhNyIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2ZvbnRTaXplOiIyNHB4IixsaW5lSGVpZ2h0OiIzMHB4In0sLi4udH19LGUpLFg9KHtjaGlsZHJlbjplLHN0eWxlOnQsdW5kZXJsaW5lOnIsYm9sZDpuLHNpbmdsZUxpbmU6byxjb2xvcjppPSJncmV5In0pPT5vP3ZlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiJ9LHZlLmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiZDAgZDEgZDggZDkgY24gYTYgY28gY3AgY3EiLHN0eWxlOntmb250RmFtaWx5Om4/IkdlaXN0Qm9sZCI6IkdlaXN0UmVndWxhciIsY29sb3I6YihpKSx0ZXh0RGVjb3JhdGlvbjpyPyJ1bmRlcmxpbmUiOiJub25lIiwuLi50fX0sZSksdmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjdSJ9KSk6dmUuY3JlYXRlRWxlbWVudCh4LnNwYW4se2NsYXNzTmFtZToiZDAgZDEgZDgiLHN0eWxlOntmb250RmFtaWx5Om4/IkdlaXN0Qm9sZCI6IkdlaXN0UmVndWxhciIsY29sb3I6YihpKSx0ZXh0RGVjb3JhdGlvbjpyPyJ1bmRlcmxpbmUiOiJub25lIiwuLi50fX0sZSksUmM9KHtjaGlsZHJlbjplLHN0eWxlOnQsY29sb3I6cj0iYmxhY2sifSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5oMSx7Y2xhc3NOYW1lOiJjaiBkYSBjdCBkYiBhNyIsc3R5bGU6e2NvbG9yOmIociksIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2ZvbnRTaXplOiI1NHB4IixsaW5lSGVpZ2h0OiI1OHB4In0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7Zm9udFNpemU6IjMwcHgiLGxpbmVIZWlnaHQ6IjM2cHgiLHRleHRBbGlnbjoibGVmdCJ9LC4uLnR9fSxlKSxhZT0oe2NoaWxkcmVuOmUsc3R5bGU6dCxjb2xvcjpyPSJibGFjayJ9KT0+dmUuY3JlYXRlRWxlbWVudCh4Lmg0LHtjbGFzc05hbWU6ImRjIGRkIGN0IGRlIixzdHlsZTp7Y29sb3I6YihyKSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntmb250U2l6ZToiMThweCJ9LC4uLnR9fSxlKTt2YXIgSj0oe2NoaWxkcmVuOmUsc3R5bGU6dCxib2xkOnIsY29sb3I6bj0iZ3JleSIsc2luZ2xlbGluZTpvfSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5wLHtjbGFzc05hbWU6ImRoIGRpIGRlIixzdHlsZTp7d2hpdGVTcGFjZTpvPyJub3dyYXAiOiJub25lIixmb250RmFtaWx5OnI/IkdlaXN0Qm9sZCI6IkdlaXN0UmVndWxhciIsZm9udFdlaWdodDpyPyI3MDAiOiI0MDAiLGNvbG9yOmIobiksLi4udH19LGUpLE5hPSh7Y2hpbGRyZW46ZSxzdHlsZTp0fSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5zcGFuLHtjbGFzc05hbWU6ImN6IGQ4IGRqIGRrIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7Zm9udFNpemU6IjE2cHgifSwuLi50fX0sZSksb249KHt0ZXh0OmUsc3R5bGU6dCxzbWFsbDpyPSExfSk9PntsZXQgbj1yPyIyNHB4IjoiMzBweCIsbz1yPyIxNnB4IjoiMThweCI7cmV0dXJuIHZlLmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiY2ogZDggZGwiLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6ZX0sc3R5bGU6e2ZvbnRTaXplOm8sbGluZUhlaWdodDpuLCImIHAiOnttYXJnaW5Cb3R0b206IjI0cHgifSwiJiBoMSI6e2ZvbnRTaXplOiI2NHB4Iixmb250U3R5bGU6IjcycHgiLGxpbmVIZWlnaHQ6IjcwcHgiLGxldHRlclNwYWNpbmc6IjBweCJ9LCImIGgyIjp7Zm9udFNpemU6IjE5cHgiLGZvbnRXZWlnaHQ6IjcwMCIsZm9udEZhbWlseToiR2Vpc3RSZWd1bGFyIixsaW5lSGVpZ2h0OiIzMnB4IixtYXJnaW5Cb3R0b206IjE2cHgifSwiJiBoMyI6e2ZvbnRTaXplOiIyMnB4Iixmb250U3R5bGU6IjI0cHgiLGZvbnRXZWlnaHQ6IjUwMCIsbGluZUhlaWdodDoiMzBweCIsbWFyZ2luQm90dG9tOiIxNnB4In0sIiYgaDQiOntmb250RmFtaWx5OiJHZWlzdEJvbGQiLGZvbnRTaXplOiIxOHB4Iixmb250V2VpZ2h0OiI3MDAiLGxpbmVIZWlnaHQ6IjIwcHgifSwiJiB1IHNwYW4iOnt0ZXh0RGVjb3JhdGlvbjoidW5kZXJsaW5lIn0sIiYgcyBzcGFuIjp7dGV4dERlY29yYXRpb246ImxpbmUtdGhyb3VnaCJ9LCImIGkgc3BhbiI6e2ZvbnRTdHlsZToiaXRhbGljIn0sIiYgZW0iOntmb250U3R5bGU6Iml0YWxpYyJ9LCImIHJ0ZS11bCI6e2xpc3RTdHlsZVR5cGU6ImRpc2MiLGxpbmVIZWlnaHQ6IjI0cHgifSwiJiBvbCI6e2xpc3RTdHlsZVR5cGU6ImRlY2ltYWwiLGxpbmVIZWlnaHQ6IjI0cHgifSwiJiBibG9ja3F1b3RlIjp7Zm9udFdlaWdodDoiNzAwIixjb2xvcjoidmFyKC0tb3JhbmdlKSIsZm9udFNpemU6IjI1cHgiLGxpbmVIZWlnaHQ6IjQwcHgiLHRleHRBbGlnbjoiY2VudGVyIixtYXJnaW5Ub3A6IjI0cHgiLG1hcmdpbkJvdHRvbToiMjRweCIsdGV4dEluZGVudDoiNjRweCJ9LCImIHJ0ZS1wIGEiOntjb2xvcjoidmFyKC0tb3JhbmdlKSIsdGV4dERlY29yYXRpb246InVuZGVybGluZSIsdGV4dFVuZGVybGluZU9mZnNldDoiMC4xMnJlbSIsY3Vyc29yOiJwb2ludGVyIn0sIiYgYSI6e2ZvbnRXZWlnaHQ6IjUwMCIsY29sb3I6InZhcigtLW9yYW5nZSkgIWltcG9ydGFudCIsIiY6aG92ZXIiOnt0ZXh0RGVjb3JhdGlvbjoidW5kZXJsaW5lICFpbXBvcnRhbnQifX0sLi4udH19KX0sV3Y9KHtjaGlsZHJlbjplLHN0eWxlOnQsc2luZ2xlbGluZTpyfSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5zcGFuLHtjbGFzc05hbWU6ImRtIGRjIGRmIGRuIGRvIGRwIGN5IGN0IGRxIGRyIGRzIixzdHlsZTp7d2hpdGVTcGFjZTpyPyJub3dyYXAiOiJub25lIiwiJjpob3ZlciI6e2ZpbHRlcjoiYnJpZ2h0bmVzcyg5NSUpIn0sLi4udH19LGUpLFBtPSh7Y2hpbGRyZW46ZSxzdHlsZTp0LGJvbGQ6cn0pPT52ZS5jcmVhdGVFbGVtZW50KHguc3Bhbix7Y2xhc3NOYW1lOiJkaCBkdCBjeSBjbCBkdSBkdiBkcyIsc3R5bGU6e2ZvbnRGYW1pbHk6cj8iR2Vpc3RCb2xkIjoiR2Vpc3RSZWd1bGFyIixmb250V2VpZ2h0OnI/IjYwMCI6IjQwMCIsIiY6aG92ZXIiOntjb2xvcjoiYmxhY2sifSwuLi50fX0sZSk7dmFyIEh2PSh7Y2hpbGRyZW46ZSxzdHlsZTp0fSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiY2ogYyBvIGRzIGR5IGRoIGN5IGQ2IGR6IGUwIGUxIixzdHlsZTp7IiY6aG92ZXIiOntjb2xvcjoidmFyKC0tb3JhbmdlKSJ9LC4uLnR9fSxlKSxHYz0oe2NoaWxkcmVuOmUsc3R5bGU6dH0pPT52ZS5jcmVhdGVFbGVtZW50KHguc3Bhbix7Y2xhc3NOYW1lOiJjeiBkMCBkZSBkOCBkcyIsc3R5bGU6eyImOmhvdmVyIjp7Y29sb3I6InZhcigtLW9yYW5nZSkifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntmb250U2l6ZToiMTZweCIsbGluZUhlaWdodDoiMzBweCJ9LC4uLnR9fSxlKSxxYz0oe2NoaWxkcmVuOmUsc3R5bGU6dCxjb2xvcjpyPSJ3aGl0ZSIsb25DbGljazpufSk9PnZlLmNyZWF0ZUVsZW1lbnQoeC5saSx7Y2xhc3NOYW1lOiJjeiBjdyBkOCBkaCBkcyBlMiBjIGIgdiBheiIsb25DbGljazpuLHN0eWxlOntjb2xvcjpiKHIpLCImOmhvdmVyIjp7Y29sb3I6Yigib3JhbmdlIil9LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2ZvbnRGYW1pbHk6IkdlaXN0UmVndWxhciIsbGluZUhlaWdodDoiMzhweCIsZm9udFdlaWdodDoiNDAwIixmb250U2l6ZToiMjBweCIsY3Vyc29yOiJwb2ludGVyIn0sLi4udH19LGUpO3ZhciBmZT13KFQoKSwxKTt2YXIgSG49dyhUKCksMSk7dmFyIFV2PXt1c2VyU2VsZWN0OiJub25lIixtc1VzZXJTZWxlY3Q6Im5vbmUiLE1velVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUifTt2YXIgYmE9dyhUKCksMSk7dmFyIHZOPWJhLmZvcndhcmRSZWYoKHtncmlkOmUsc2hhcGU6dCxhczpyPSJkaXYiLHN0eWxlOm4sY2hpbGRyZW46byx3cmFwOmkscGFkZGluZzpsLGRpcmVjdGlvbjpzPSJyb3ciLGdhcDphPWU/MTI6MCxhbGlnbjp1PWV8fHM9PT0iY29sdW1uIj8ic3RhcnQiOiJjZW50ZXIiLGp1c3RpZnk6cD1lPyJzdGFydCI6ImJldHdlZW4iLGRpc3BsYXk6Yz0hMCxmaXRDb250ZW50OmYsLi4uZH0sbSk9PntpZighYylyZXR1cm4gbnVsbDsoYz09PSEwfHxjIT09ImJsb2NrIiYmYyE9PSJmbGV4IiYmYyE9PSJncmlkIiYmYyE9PSJpbmxpbmUtZmxleCIpJiYoYz0iZmxleCIpLGw9PT0hMCYmKGw9MzIpO2xldCBoPXR5cGVvZiBlPT0ibnVtYmVyIjtyZXR1cm4gZSYmaD9iYS5jcmVhdGVFbGVtZW50KHhbcl0se3N0eWxlOntwYWRkaW5nOmwsZGlzcGxheToiZ3JpZCIsZ2FwOmEscG9zaXRpb246InJlbGF0aXZlIix3aWR0aDoiMTAwJSIsZ3JpZEF1dG9Sb3dzOiIxZnIiLGdyaWRUZW1wbGF0ZUNvbHVtbnM6XGByZXBlYXQoIGF1dG8tZml0LG1pbm1heCgke2g/ZTo0OH1weCwgMWZyKSlcYCwiJjo6YmVmb3JlIjp7Y29udGVudDonIiInLHdpZHRoOjAscGFkZGluZ1RvcDp0PT09InNxdWFyZSI/IjEwMCUiOm51bGwsZ3JpZFJvdzoiMSAvIDEiLGdyaWRDb2x1bW46IjEgLyAxIn0sIiYgPiAqOmZpcnN0LWNoaWxkIjp7Z3JpZFJvdzoiMSAvIDEiLGdyaWRDb2x1bW46IjEgLyAxIn0sLi4ubn0sLi4uZCxjaGlsZHJlbjpvLHJlZjptfSk6YmEuY3JlYXRlRWxlbWVudCh4W3JdLHtzdHlsZTp7cGFkZGluZzpsLGRpc3BsYXk6YyxmbGV4RGlyZWN0aW9uOnMsZ2FwOmEsZmxleFdyYXA6ZT8id3JhcCI6aXx8dm9pZCAwLHdpZHRoOmY/ImF1dG8iOiIxMDAlIixhbGlnbkl0ZW1zOnUsanVzdGlmeUNvbnRlbnQ6cD09PSJiZXR3ZWVuIj8ic3BhY2UtYmV0d2VlbiI6cCwuLi5ufSwuLi5kLGNoaWxkcmVuOm8scmVmOm19KX0pLFA9dk47dmFyIEtjPXcoVCgpLDEpO3ZhciBRYz13KFQoKSwxKTtmdW5jdGlvbiBWdigpe2xldFtlLHRdPVFjLnVzZVN0YXRlKG51bGwpO3JldHVybiBRYy51c2VMYXlvdXRFZmZlY3QoKCk9Pnt0KC8obWFjaW50b3NofG1hY2ludGVsfG1hY3BwY3xtYWM2OGt8bWFjb3MpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl9LFtdKSxlfWZ1bmN0aW9uIEVhKGUsdCl7bGV0IHI9VnYoKSxuPUtjLnVzZUNhbGxiYWNrKG89PntpZighZXx8IXQpcmV0dXJuO2xldCBpPW8ua2V5LnRvTG9jYWxlTG93ZXJDYXNlKCksbD1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuc3BsaXQoIisiKS5tYXAoYT0+YT09PSJlc2MiPyJlc2NhcGUiOmEpLHM9e2NtZDpyP28ubWV0YUtleTpvLmN0cmxLZXksYWx0Om8uYWx0S2V5LHNoaWZ0Om8uc2hpZnRLZXl9OyhsLmxlbmd0aD09PTEmJmk9PT1sWzBdfHxsLmxlbmd0aD09PTImJnNbbFswXV0mJmk9PT1sWzFdfHxsLmxlbmd0aD09PTMmJnNbbFswXV0mJnNbbFsxXV0mJmk9PT1sWzJdKSYmKG8ucHJldmVudERlZmF1bHQoKSxvLnN0b3BQcm9wYWdhdGlvbigpLHQoKSl9LFtlLHQscl0pO0tjLnVzZUVmZmVjdCgoKT0+e2lmKCEoIWV8fCF0KSlyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLG4pLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLG4pfX0sW2UsdCxyXSl9dmFyIHhOPVl0KHsiMCUiOnt0cmFuc2Zvcm06InJvdGF0ZSgwZGVnKSJ9LCIxMDAlIjp7dHJhbnNmb3JtOiJyb3RhdGUoMzYwZGVnKSJ9fSksQT0oe2NoaWxkcmVuOmUsb25DbGljazp0LG9uTW91c2VEb3duOnIsdmFyaWFudDpuPSJmdWxsIixzdWZmaXg6byxjb2xvcjppPSJibGFjayIsc2l6ZTpsPSJzbWFsbCIsZW50ZXI6cyxzdHlsZTphfSk9PntsZXRbdSxwXT1Ibi5kZWZhdWx0LnVzZVN0YXRlKCExKSxbYyxmXT1Ibi5kZWZhdWx0LnVzZVN0YXRlKCExKTtzJiZFYSgiRW50ZXIiLHQpO2xldCBkPUhuLmRlZmF1bHQudXNlQ2FsbGJhY2soYXN5bmMgaz0+e2lmKCF0KXJldHVybjtrLnN0b3BQcm9wYWdhdGlvbigpO2xldCBEPXNldFRpbWVvdXQoKCk9PntwKCEwKX0sMTAwKTt0cnl7YXdhaXQgdChrKX1jYXRjaChPKXtjb25zb2xlLmVycm9yKE8pLGYoITApfXAoITEpLGNsZWFyVGltZW91dChEKX0sW3RdKSxtPW49PT0iZ2hvc3QiLGg9bj09PSJ0cmFuc3BhcmVudCIsUz1tfHxoLHk9Uz9iKGkpOmIoIndoaXRlIiksdj1TP3ZvaWQgMDpiKGkpLGc9Uz9iKGkhPT0ib3JhbmdlIj8ib3JhbmdlIjoiYmxhY2siKTp2b2lkIDAsQz1TP3ZvaWQgMDpiKGk9PT0ib3JhbmdlIj8ib3JhbmdlSG92ZXIiOiJuYXZ5SG92ZXIiKSsiICFpbXBvcnRhbnQiO3JldHVybiBIbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5idXR0b24se2NsYXNzTmFtZToiY3UgYWIgdiBhNSBoZyBiIGhoIGRzIixvbk1vdXNlRG93bjpyLG9uQ2xpY2s6ZCxvbkFuaW1hdGlvbkVuZDooKT0+e2YoITEpfSxzdHlsZTp7Ym9yZGVyOmg/InZhcigtLWJvcmRlcikiOnZvaWQgMCxjb2xvcjp5LGJhY2tncm91bmRDb2xvcjp2LC4uLmMmJnthbmltYXRpb246IjMwMG1zIHNoYWtlIGVhc2UtaW4tb3V0In0sLi4ubD09PSJkb3QiJiZ7aGVpZ2h0OjIxLHdpZHRoOjIxLGJvcmRlclJhZGl1czoiNTAlIn0sLi4ubD09PSJkb3QtbGFyZ2UiJiZ7aGVpZ2h0OjMwLHdpZHRoOjMwLGJvcmRlclJhZGl1czoiNTAlIn0sLi4ubD09PSJzbWFsbCImJntwYWRkaW5nOiIwcHggMThweCIsaGVpZ2h0OjMwLGJvcmRlclJhZGl1czoyMH0sLi4ubD09PSJsYXJnZSImJntwYWRkaW5nOiIwcHggMjJweCIsaGVpZ2h0OjM4LGJvcmRlclJhZGl1czoyMH0sIiY6aG92ZXIiOntjb2xvcjpnLGJhY2tncm91bmQ6Q30sIiY6YWN0aXZlIjp7Y29sb3I6ZyxiYWNrZ3JvdW5kOkMsdHJhbnNmb3JtOiJzY2FsZSg5NSUpIn0sLi4uVXYsLi4uYX19LHUmJkhuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtqdXN0aWZ5OiJjZW50ZXIiLGZpdENvbnRlbnQ6ITAsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiI1MCUiLGxlZnQ6IjUwJSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkifX0sSG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJzdmciLHt3aWR0aDoiMjAiLGhlaWdodDoiMjAiLHZpZXdCb3g6IjAgMCAyMCAyMCIsc3R5bGU6e2FuaW1hdGlvbjpcYCR7eE59IDc1MG1zIGxpbmVhciBpbmZpbml0ZVxgfSxmaWxsOiJub25lIn0sSG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTE3IDEwQzE3IDEzLjg2NiAxMy44NjYgMTcgMTAgMTdDNi4xMzQwMSAxNyAzIDEzLjg2NiAzIDEwQzMgNi4xMzQwMSA2LjEzNDAxIDMgMTAgMyIsc3Ryb2tlOiJ3aGl0ZSIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIn0pKSksSG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dhcDo4LGp1c3RpZnk6ImNlbnRlciJ9LGw9PT0iZG90Ij9lOkhuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChOYSxudWxsLHU/bnVsbDplKSxvKSl9O3ZhciBZYz13KFQoKSwxKTt2YXIgbG49KHtzdHlsZTplLGNvbG9yOnQ9IndoaXRlIn0pPT5ZYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6IjE3IixoZWlnaHQ6IjE3Iix2aWV3Qm94OiIwIDAgMTcgMTciLGZpbGw6Im5vbmUiLHN0eWxlOnsuLi5lfX0sWWMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjEuNzA3MTEiLHkxOiIxLjQzNDk4Iix4MjoiMTUuODQ5MiIseTI6IjE1LjU3NzEiLHN0cm9rZTp0PT09ImluaGVyaXQiPyJjdXJyZW50Q29sb3IiOmIodCksc3Ryb2tlV2lkdGg6IjIifSksWWMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjEuMjkyODkiLHkxOiIxNS40MzUiLHgyOiIxNS40MzUiLHkyOiIxLjI5Mjg1IixzdHJva2U6dD09PSJpbmhlcml0Ij8iY3VycmVudENvbG9yIjpiKHQpLHN0cm9rZVdpZHRoOiIyIn0pKTt2YXIgc3Q9dyhUKCksMSkscFM9dyhsbCgpLDEpO3ZhciB2cz13KFQoKSwxKSxWZT0oe2NoaWxkcmVuOmV9KT0+e2xldFt0LHJdPSgwLHZzLnVzZVN0YXRlKSghMSk7cmV0dXJuKDAsdnMudXNlRWZmZWN0KSgoKT0+e3IoITApfSxbXSksdD90eXBlb2YgZT09ImZ1bmN0aW9uIj92cy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZSk6ZTpudWxsfSxtbj10eXBlb2Ygd2luZG93PCJ1Ijt2YXIgZlM9c3QuY3JlYXRlQ29udGV4dCgoKT0+e30pLFM2PTA7ZnVuY3Rpb24gQzYoe2NoaWxkcmVuOmV9KXtsZXQgdD1zdC51c2VTdGF0ZSh7fSlbMV0scj1qKCksbj1zdC51c2VSZWYoW10pLG89ci5sb2NhdGlvbjtzdC51c2VFZmZlY3QoKCk9PntuLmN1cnJlbnQuZm9yRWFjaCgocyxhKT0+e3Mua2VlcEFsaXZlJiZzLmtlZXBBbGl2ZSE9PW8mJmwocy5pZCl9KX0sW29dKTtmdW5jdGlvbiBpKHMsYSx1KXtsZXQgcD0rK1M2O3V8fHdpbmRvdy5zZXRUaW1lb3V0KCgpPT57bChwKX0sNWUzKSxuLmN1cnJlbnQuZmluZChjPT5jLmtleT09PXMpfHwobi5jdXJyZW50PVt7aWQ6cCx0b2FzdDphLGVudGVyaW5nOiEwLGtleTpzLGtlZXBBbGl2ZTp1fSwuLi5uLmN1cnJlbnRdLHQoe30pKSx3aW5kb3cuc2V0VGltZW91dCgoKT0+e24uY3VycmVudD1uLmN1cnJlbnQubWFwKGM9PmMuaWQ9PT1wP3suLi5jLGVudGVyaW5nOiExfTpjKSx0KHt9KX0sMCl9ZnVuY3Rpb24gbChzKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHMpO2xldCBhPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57bi5jdXJyZW50PW4uY3VycmVudC5maWx0ZXIodT0+dS5pZCE9PXMpLHQoe30pfSwxNTApO24uY3VycmVudD1uLmN1cnJlbnQubWFwKHU9PnUuaWQ9PT1zP3suLi51LGxlYXZpbmc6ITAsbGVhdmVUaW1lb3V0SWQ6YX06dSksdCh7fSl9cmV0dXJuIHN0LnVzZUVmZmVjdCgoKT0+KCk9Pntmb3IobGV0IHMgb2Ygbi5jdXJyZW50KXdpbmRvdy5jbGVhclRpbWVvdXQocy5pZCkscy5sZWF2ZVRpbWVvdXRJZCYmd2luZG93LmNsZWFyVGltZW91dChzLmxlYXZlVGltZW91dElkKX0sW10pLHN0LmNyZWF0ZUVsZW1lbnQoZlMuUHJvdmlkZXIse3ZhbHVlOml9LGUsc3QuY3JlYXRlRWxlbWVudChWZSxudWxsLG1uJiYoMCxwUy5jcmVhdGVQb3J0YWwpKHN0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYXYgYXcgYXggYyBheSBiIHAgYWIgdiBheiBiMCIsc3R5bGU6eyImIGEiOntjdXJzb3I6InBvaW50ZXIiLGNvbG9yOmIoIm9yYW5nZSIpLCImOmhvdmVyIjp7dGV4dERlY29yYXRpb246InVuZGVybGluZSJ9fX19LG4uY3VycmVudC5tYXAoKHtpZDpzLHRvYXN0OmEsbGVhdmluZzp1LGVudGVyaW5nOnB9LGMpPT57bGV0IGY9KGM9PT0wP1tdOm4uY3VycmVudC5zbGljZSgwLGMpKS5yZWR1Y2UoKGQsbSk9PmQrKG0/LmhlaWdodD8/MCksMCk7aWYoYSlyZXR1cm4gc3QuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjIGIxIGIyIGIzIGI0IGIgYjUgaSBiNiBiNyBiOCBiOSBiYSBiYiIsc3R5bGU6e3RyYW5zaXRpb25EdXJhdGlvbjp1PyIxNTBtcyI6IjI1MG1zIixvcGFjaXR5OnB8fHU/MDoxLHRyYW5zZm9ybTpwPyJ0cmFuc2xhdGUzZCgtNTAlLGNhbGMoMTAwJSArIDI0cHgpLDApIjpcYHRyYW5zbGF0ZTNkKC01MCUsLSR7ZitjKjEyfXB4LDApXGB9LGtleTpzLHJlZjpkPT57ZCYmIW4uY3VycmVudC5maW5kKG09Pm0uaWQ9PT1zKT8uaGVpZ2h0JiYobi5jdXJyZW50PW4uY3VycmVudC5tYXAobT0+bS5pZD09PXM/ey4uLm0saGVpZ2h0OmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fTptKSx0KHt9KSl9fSxzdC5jcmVhdGVFbGVtZW50KEssbnVsbCxhKSxzdC5jcmVhdGVFbGVtZW50KEEse3NpemU6ImRvdCIsc3R5bGU6e2hlaWdodDoyMCx3aWR0aDoyMCxwYWRkaW5nOjV9LGNvbG9yOiJibGFjayIsb25DbGljazooKT0+bChzKX0sc3QuY3JlYXRlRWxlbWVudChsbixudWxsKSkpfSkpLGRvY3VtZW50LmJvZHkpKSl9ZnVuY3Rpb24gT2UoKXtyZXR1cm4gc3QudXNlQ29udGV4dChmUyl9dmFyIGRTPSh7Y2hpbGRyZW46ZX0pPT5zdC5jcmVhdGVFbGVtZW50KEM2LG51bGwsZSk7dmFyIFVnPXcoVCgpLDEpO3ZhciB4aT0oe2NvbG9yOmU9ImluaGVyaXQiLHN0eWxlOnR9KT0+VWcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOiIxMyIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDEzIDEwIixmaWxsOmU9PT0iaW5oZXJpdCI/ImN1cnJlbnRDb2xvciI6YihlKSxzdHlsZTp0fSxVZy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTIuMDY4IDUuNDU5NjJDMTIuMzIxOSA1LjIwNTc4IDEyLjMyMTkgNC43OTQyMiAxMi4wNjggNC41NDAzOEw3LjkzMTQ0IDAuNDAzODA2QzcuNjc3NiAwLjE0OTk2NSA3LjI2NjA1IDAuMTQ5OTY1IDcuMDEyMiAwLjQwMzgwNkM2Ljc1ODM2IDAuNjU3NjQ3IDYuNzU4MzYgMS4wNjkyIDcuMDEyMiAxLjMyMzA0TDEwLjY4OTIgNUw3LjAxMjIgOC42NzY5NkM2Ljc1ODM2IDguOTMwOCA2Ljc1ODM2IDkuMzQyMzUgNy4wMTIyIDkuNTk2MTlDNy4yNjYwNSA5Ljg1MDAzIDcuNjc3NiA5Ljg1MDAzIDcuOTMxNDQgOS41OTYxOUwxMi4wNjggNS40NTk2MlpNMC42MDgzOTggNS42NUwxMS42MDg0IDUuNjVWNC4zNUwwLjYwODM5OCA0LjM1TDAuNjA4Mzk4IDUuNjVaIn0pKTt2YXIgVDY9L15cWyguKj8pXF0vZyxtZT1lPT57aWYoISghZXx8dHlwZW9mIGUhPSJzdHJpbmciKSlyZXR1cm4gZS5yZXBsYWNlKFQ2LCIiKX07dmFyIF82PVl0KHsiMCUiOntvcGFjaXR5OiIwLjMifSwiMTAwJSI6e3RyYW5zZm9ybToiMSJ9fSksazY9KGUsdCk9Pntzd2l0Y2godC50eXBlKXtjYXNlIlRFWFQiOnJldHVybnsuLi5lLFt0LmZpZWxkXTp0LnBheWxvYWR9O2Nhc2UiRVJST1IiOnJldHVybnsuLi5lLFt0LmZpZWxkXTp0LnBheWxvYWQ/PyEwfX19LEtuPSh7c2V0T3BlbjplLHN0eWxlOnR9KT0+e2xldFt7ZW1haWw6cixwYXNzd29yZDpuLC4uLm99LGldPSgwLGZlLnVzZVJlZHVjZXIpKGs2LHtlbWFpbDoiIixwYXNzd29yZDoiIixtc2c6IiIsZW1haWxFcnI6ITEscGFzc3dvcmRFcnI6ITF9KSxbbCxzXT0oMCxmZS51c2VTdGF0ZSkoITEpLGE9VSgpLHU9aigpLHA9T2UoKSxbYyxmXT0oMCxmZS51c2VTdGF0ZSkoITEpLGQ9Uz0+e2koe3R5cGU6IkVSUk9SIixmaWVsZDoicGFzc3dvcmRFcnIiLHBheWxvYWQ6ITF9KSxpKHt0eXBlOiJFUlJPUiIsZmllbGQ6ImVtYWlsRXJyIixwYXlsb2FkOiExfSksaSh7dHlwZToiVEVYVCIsZmllbGQ6Uy50YXJnZXQuaWQscGF5bG9hZDpTLnRhcmdldC52YWx1ZX0pfSxtPVM9PntpKHt0eXBlOiJFUlJPUiIsZmllbGQ6U30pfSxoPWFzeW5jKCk9PntpZighcil7bSgiZW1haWxFcnIiKSxpKHt0eXBlOiJURVhUIixmaWVsZDoibXNnIixwYXlsb2FkOiJQbGVhc2UgZmlsbCBpbiBhbiBlbWFpbCBhZGRyZXNzIn0pO3JldHVybn1pZighbil7bSgicGFzc3dvcmRFcnIiKSxpKHt0eXBlOiJURVhUIixmaWVsZDoibXNnIixwYXlsb2FkOiJQbGVhc2UgZmlsbCBpbiBhIHBhc3N3b3JkIn0pO3JldHVybn1hd2FpdCBhLmNhbGwoIndlYnNpdGU6bG9naW4iLHtlbWFpbDpyLHBhc3N3b3JkOm59KS5jYXRjaChTPT5pKHt0eXBlOiJURVhUIixmaWVsZDoibXNnIixwYXlsb2FkOlMubWVzc2FnZX0pKS50aGVuKCh7cmVzOlMsZXJyOnl9KT0+e3k/aSh7dHlwZToiVEVYVCIsZmllbGQ6Im1zZyIscGF5bG9hZDp5Lm1lc3NhZ2V9KTooZSghMSkscCgibG9naW4iLCJTdWNjZXNmdWxseSBsb2dnZWQgaW4uIFdlbGNvbWUgdG8gRVVvYnNlcnZlciIpKX0pfTtyZXR1cm4gZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImF2IGdrIGJzIGJ0IGI5IGdsIGIgZ20gZ24gZ28iLHN0eWxlOnthbmltYXRpb246XzYsLi4udH19LGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiMyBncCBkcyIsb25DbGljazooKT0+e2UoITEpfX0pLGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiMyBiNyBncSBhbiBnciBncyBndCBiIHYgYWIgYnkgYjIgcCIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3dpZHRoOiI5MHZ3IixoZWlnaHQ6IjUwMHB4IixwYWRkaW5nOiIxNnB4In19fSxmZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c2l6ZToiZG90IixzdHlsZTp7aGVpZ2h0OjM2LHdpZHRoOjM2LG1hcmdpblRvcDoyNCxtYXJnaW5MZWZ0OiJhdXRvIixtYXJnaW5SaWdodDoyNCwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHJpZ2h0OiIxNnB4Iix0b3A6IjE2cHgiLG1hcmdpblRvcDoiMHB4IixtYXJnaW5SaWdodDoiMHB4Iix3aWR0aDoiMjRweCIsaGVpZ2h0OiIyNHB4In19LHZhcmlhbnQ6Imdob3N0IixvbkNsaWNrOigpPT57ZSghMSl9fSxmZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobG4se2NvbG9yOiJibGFjayIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3dpZHRoOiIxMnB4IixoZWlnaHQ6IjEycHgifX19KSksZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGRlLHtzdHlsZTp7bWFyZ2luVG9wOjQwfX0sbD8iQ2hhbmdlIHBhc3N3b3JkIjoiTG9nIGluIC8gU2lnbiB1cCIpLGw/ZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgcCBneCBneSJ9LGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLHtzdHlsZTp7d2lkdGg6IjEwMCUiLG1heFdpZHRoOjM3NyxtYXJnaW5Cb3R0b206MTJ9fSwiWW91IHdpbGwgcmVjaWV2ZSBhbiBlbWFpbCB0byByZXNldCB5b3VyIHBhc3N3b3JkIiksZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InYgYWIgYiBneiBheiBjIn0sZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguaW5wdXQse2NsYXNzTmFtZToiYyBmcSBjeiBmcyBmdCBkZCBidSIsdmFsdWU6cixpZDoiZW1haWwiLG9uQ2hhbmdlOmQscmVxdWlyZWQ6ITAsc3R5bGU6e29wYWNpdHk6Yz8uNToxLCImOjpwbGFjZWhvbGRlciI6e2NvbG9yOiIgcmdiYSgwLCAwLCAzMiwgMC4zKSAifSwiJjpmb2N1cyI6e2JvcmRlcjoiMXB4IHNvbGlkIGJsYWNrIn19LHBsYWNlaG9sZGVyOiJFbnRlciB5b3VyIGVtYWlsYWRyZXNzIn0pLGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjbGVhciBmdiBmdCBhNSJ9LGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJmdCBmdiBmeCBmeSBiIGcwIGRzIixvbkNsaWNrOmM/bnVsbDphc3luYygpPT5hd2FpdCBhLmNhbGwoIndlYnNpdGU6cmVzZXRQYXNzd29yZCIse2VtYWlsOnJ9KS50aGVuKFM9PntmKCEwKSxpKHt0eXBlOiJURVhUIixmaWVsZDoibXNnIixwYXlsb2FkOlN9KSxzZXRUaW1lb3V0KCgpPT57ZSghMSl9LDJlMyl9KS5jYXRjaChTPT5pKHt0eXBlOiJURVhUIixmaWVsZDoibXNnIixwYXlsb2FkOlMubWVzc2FnZX0pKSx0eXBlOiJzdWJtaXQiLG5hbWU6InN1YnNjcmliZSIsc3R5bGU6e29wYWNpdHk6Yz8uNToxLGJhY2tncm91bmQ6Yz8idmFyKC0tb3JhbmdlKSI6InZhcigtLWJsYWNrKSJ9fSksYz9udWxsOmZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4aSx7c3R5bGU6e2NvbG9yOiJ2YXIoLS13aGl0ZSkiLGN1cnNvcjoicG9pbnRlciIscG9pbnRlckV2ZW50czoibm9uZSIsd2lkdGg6IjIwcHgiLGhlaWdodDoiMjBweCIscG9zaXRpb246ImFic29sdXRlIix0b3A6IjlweCIsbGVmdDoiOXB4In19KSkpLG8ubXNnP2ZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLHtjb2xvcjoiYmxhY2siLHN0eWxlOnttYXJnaW5Ub3A6MTh9fSxtZShvLm1zZykpOm51bGwpOmZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChmZS5kZWZhdWx0LkZyYWdtZW50LG51bGwsZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguaW5wdXQse2NsYXNzTmFtZToiYnUgZ3UgY3ogZnMgZGQgZ3YgZnQgZHkiLHZhbHVlOnIsaWQ6ImVtYWlsIixvbkNoYW5nZTpkLHN0eWxlOntib3JkZXI6by5lbWFpbEVycj9cYDFweCBzb2xpZCAke2IoIm9yYW5nZSIpfVxgOnZvaWQgMCwiJjo6cGxhY2Vob2xkZXIiOntjb2xvcjoicmdiYSgwLCAwLCAzMiwgMC4zKSJ9LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3dpZHRoOiIxMDAlIixtYXJnaW5Ub3A6IjE4cHgifX0scGxhY2Vob2xkZXI6IkVudGVyIHlvdXIgZW1haWxhZHJlc3MifSksZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguaW5wdXQse2NsYXNzTmFtZToiYnUgZnMgZ3UgZHkgZGQgZ3cgZnQgY3oiLGlkOiJwYXNzd29yZCIsdmFsdWU6bixvbkNoYW5nZTpkLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnt3aWR0aDoiMTAwJSIsbWFyZ2luQm90dG9tOiIxMnB4In0sYm9yZGVyOm8ucGFzc3dvcmRFcnI/XGAxcHggc29saWQgJHtiKCJvcmFuZ2UiKX1cYDp2b2lkIDAsIiY6OnBsYWNlaG9sZGVyIjp7Y29sb3I6InJnYmEoMCwgMCwgMzIsIDAuMykifX0sdHlwZToicGFzc3dvcmQiLHBsYWNlaG9sZGVyOiJFbnRlciB5b3VyIHBhc3N3b3JkIn0pLGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLHtjb2xvcjoib3JhbmdlIixzdHlsZTp7bWFyZ2luVG9wOjE4fX0sbWUoby5tc2c/by5tc2c6bnVsbCkpLGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChHYyx7c3R5bGU6e3dpZHRoOiIxMDAlIixtYXhXaWR0aDozNzcsbWFyZ2luVG9wOjYwLG1hcmdpbkxlZnQ6IjRweCIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7bWFyZ2luVG9wOiI4cHgifX19LGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7b25DbGljazooKT0+e2koe3R5cGU6IkVSUk9SIixmaWVsZDoicGFzc3dvcmRFcnIiLHBheWxvYWQ6ITF9KSxpKHt0eXBlOiJFUlJPUiIsZmllbGQ6ImVtYWlsRXJyIixwYXlsb2FkOiExfSkscyghMCl9fSwiRm9yZ290IHBhc3N3b3JkPyBDbGljayBoZXJlIikpLGZlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7d2lkdGg6Mzc3LG1hcmdpblRvcDoxMixoZWlnaHQ6MzkscGFkZGluZzoiMHB4IiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnt3aWR0aDoiMTAwJSJ9fSxlbnRlcjohMCxvbkNsaWNrOigpPT57aCgpfX0sIkxvZ2luIiksZmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOiJvcmFuZ2UiLG9uQ2xpY2s6KCk9Pnt1LnNldFBhdGgoe3NlY3Rpb246InJlZ2lzdGVyIixpZDpudWxsfSksdS5zZXRRdWVyeSh7Y29tbWVudHM6bnVsbH0pLGUoITEpfSxzdHlsZTp7d2lkdGg6Mzc3LG1hcmdpblRvcDoxMSxoZWlnaHQ6MzksIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7d2lkdGg6IjEwMCUifX19LCJSZWdpc3RlciIpKSxmZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYTkgaDAgYWUgaDEgYTciLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttYXJnaW5SaWdodDoiYXV0byIsbWFyZ2luVG9wOiIyNHB4In19fSxmZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVmkse3NpemU6InNtYWxsIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7Zm9udFNpemU6IjI2cHgifX19KSkpKX07dmFyIFpuPXcoVCgpLDEpO3ZhciB3dT13KFQoKSwxKTt2YXIgWW49d3UuZm9yd2FyZFJlZigoe2NoaWxkcmVuOmUsc3R5bGU6dCxvblNjcm9sbDpyLGNsYXNzTmFtZTpufSxvKT0+d3UuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOlxgJHtufSBjIGMxXGAsc3R5bGU6ey4uLnR9LHJlZjpvfSx3dS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImMgYzEga2Uga2YiLG9uU2Nyb2xsOnJ9LGUpKSk7dmFyIG1TPXcoVCgpLDEpLHlmPTAse3N0eWxlOlZnPXtvdmVyZmxvd1k6bnVsbCxvdmVyZmxvd1g6bnVsbH19PXR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8e30sQW49KCk9Pnt5Zi0tLHlmPTAseWZ8fChWZy5vdmVyZmxvd1k9ImF1dG8iLFZnLm92ZXJmbG93WD0iaGlkZGVuIil9LE42PSgpPT57eWYrKyxWZy5vdmVyZmxvd1k9ImhpZGRlbiJ9LHZmPWU9PnsoMCxtUy51c2VFZmZlY3QpKCgpPT57aWYoZSlyZXR1cm4gTjYoKSxBbn0sW2VdKX07dmFyIGhTPXcoVCgpLDEpLGI2PWU9Pih7c2VjdGlvbnM6ZS5maWx0ZXIodD0+dC50eXBlPT0ic2VjdGlvbiIpLGFydGljbGVUeXBlczplLmZpbHRlcih0PT50LnR5cGU9PSJhcnRpY2xlVHlwZSIpLHN0YXRpYzplLmZpbHRlcih0PT50LnR5cGU9PSJzdGF0aWNQYWdlIil9KSxYbj0oKT0+e2xldHtkYXRhOmV9PXBlKCJnZXQtbWV0YS10eXBlcyIpLHQ9ZT8uZGF0YTtyZXR1cm4gdD9iNih0KTp7c2VjdGlvbnM6W10sYXJ0aWNsZVR5cGVzOltdLHN0YXRpYzpbXX19LFJnPWU9PigwLGhTLnVzZVN0YXRlKShlP1tlXTpbXSk7dmFyIGRyPXcoVCgpLDEpO3ZhciB4cz1lPT50eXBlb2YgZT09InN0cmluZyI/ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywiLSIpLnJlcGxhY2UoLycvZywiIikucmVwbGFjZSgvJi9nLCJhbmQiKToiIjt2YXIgU3U9ZT0+e2xldCB0PSgwLGRyLnVzZU1lbW8pKCgpPT57aWYodHlwZW9mIGUucGF0aC5zZWN0aW9uPT0ic3RyaW5nIilyZXR1cm4geHMoZS5wYXRoLnNlY3Rpb24pO0FycmF5LmlzQXJyYXkoZS5wYXRoLnNlY3Rpb24pfSxbZS5wYXRoLnNlY3Rpb25dKTtyZXR1cm4gdCYmKGUucGF0aC5zZWN0aW9uPXQpLGRyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChVYyx7Li4uZX0pfSxHZz1lPT4oe3NlY3Rpb246eHMoZS5zZWN0aW9uPy5bMF0/LnRpdGxlPz8ibmV3cyIpLGlkOmUuaWR9KSxobj1lPT5kci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoU3Use3N0eWxlOmUuc3R5bGUsb25DbGljazplLm9uQ2xpY2sscGF0aDpHZyhlLmFydGljbGUpfSxlLmNoaWxkcmVuPz8oZS52YXJpYW50PT09InJlbGF0ZWQifHxlLnZhcmlhbnQ9PT0icmVsYXRlZC1zbWFsbCI/ZHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEh2LG51bGwsZS5sYWJlbD8/ZS5hcnRpY2xlLmhlYWRsaW5lKTpkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUG0sbnVsbCxlLmxhYmVsPz9lLmFydGljbGUuaGVhZGxpbmUpKSksd3M9ZT0+e2xldCB0PWUuYXJ0aWNsZTtpZighdC5jb250cmlidXRvcnNUZXh0JiYhdC5hdXRob3I/LmZpcnN0TmFtZSlyZXR1cm4gbnVsbDtsZXQgcj10LmNvbnRyaWJ1dG9yc1RleHQ/XGBieSAke3QuY29udHJpYnV0b3JzVGV4dH1cYDpcYGJ5ICR7dC5hdXRob3I/LmZpcnN0TmFtZX0gCiAgICAgICAgJHt0LmF1dGhvcj8ubGFzdE5hbWU/PyIifVxgO3JldHVybiBkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoU3Use3N0eWxlOnsuLi5lLnN0eWxlfSxwYXRoOmUuYXJ0aWNsZS5jb250cmlidXRvcnNUZXh0P3tzZWN0aW9uOiJzZWFyY2giLGlkOmVuY29kZVVSSUNvbXBvbmVudChlLmFydGljbGUuY29udHJpYnV0b3JzVGV4dCl9OntzZWN0aW9uOiJiaW8iLGlkOnQuYXV0aG9yPy5pZH19LGRyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LnNwYW4se3N0eWxlOnsiJjpob3ZlciI6e2NvbG9yOiJ2YXIoLS1vcmFuZ2UpICFpbXBvcnRhbnQifX19LHIpKX0sUHQ9ZT0+e2xldCB0PWUuZmllbGQ/LlswXTtyZXR1cm4hdHx8IXQudGl0bGU/bnVsbDpkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoU3Use3BhdGg6e3NlY3Rpb246ZS5zZWN0aW9uLGlkOnQuaWR9fSxlLnZhcmlhbnQ9PT0ibWVudSI/ZHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHFjLHtvbkNsaWNrOmUub25DbGlja30sdC50aXRsZSk6ZS52YXJpYW50PT09ImZvb3RlciI/ZHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEdjLG51bGwsdC50aXRsZSk6ZS52YXJpYW50PT09InRhZyI/ZHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFd2LHtzaW5nbGVsaW5lOiEwfSx0LnRpdGxlKTplLnZhcmlhbnQ9PT0iZmF0Ij9kci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7c2luZ2xlTGluZTohMCxjb2xvcjoib3JhbmdlIixzdHlsZTp7dGV4dERlY29yYXRpb246InVuZGVybGluZSIsIiY6aG92ZXIiOntjb2xvcjpiKCJuYXZ5Iil9fX0sdC50aXRsZSk6ZHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFBtLG51bGwsdC50aXRsZSkpfTt2YXIgRTY9WXQoeyIwJSI6e3RyYW5zZm9ybToidHJhbnNsYXRlWCgtNzAwcHgpIn0sIjEwMCUiOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVgoMHB4KSJ9fSksZ1M9KHtvbkNsb3NlOmUsc2V0T3Blbjp0fSk9PntsZXR7c2VjdGlvbnM6cn09WG4oKSxuPU50KCksbz1qKCk7cmV0dXJuIHZmKCEwKSxabi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYXYgZ2sgYjkgYnMgYnQgaDIgaXMgZ2EiLG9uQ2xpY2s6ZX0sWm4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Iml0IGZrIHcgYyBiMyBicyBnayBoNSBnYSBpdSBoNiIsc3R5bGU6e2FuaW1hdGlvbjpFNn0sb25DbGljazppPT57aS5wcmV2ZW50RGVmYXVsdCgpLGkuc3RvcFByb3BhZ2F0aW9uKCl9fSxabi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWW4se3N0eWxlOntoZWlnaHQ6IjEwMHZoIn19LFpuLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpdiBhbiBpdyBpeCJ9LFpuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7bWFyZ2luTGVmdDoyMCxtYXJnaW5Cb3R0b206MzJ9LGNvbG9yOiJvcmFuZ2UiLG9uQ2xpY2s6bi51c2VySWQ/KCk9PntvLnNldFBhdGgoe3NlY3Rpb246ImFjY291bnQiLGlkOm51bGx9KSxlKCksQW4oKX06KCk9Pnt0KCEwKSxlKCksQW4oKX19LG4udXNlcklkPyJBY2NvdW50IjoiTG9naW4iKSxabi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC51bCx7c3R5bGU6eyImICoiOntkaXNwbGF5OiJibG9jayJ9fX0sci5tYXAoKGksbCk9PlpuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7b25DbGljazooKT0+e28uc2V0UXVlcnkoe2dpZnRUb2tlbjpudWxsfSksZSgpLEFuKCl9LGZpZWxkOltpXSxzZWN0aW9uOiJzZWN0aW9uIixrZXk6bCx2YXJpYW50OiJtZW51In0pKSkpKSxabi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c2l6ZToiZG90LWxhcmdlIix2YXJpYW50OiJnaG9zdCIsb25DbGljazooKT0+e2UoKSxBbigpfSxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixyaWdodDozMix0b3A6Mzd9fSxabi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobG4sbnVsbCkpKSl9O3ZhciB2bj13KFQoKSwxKTt2YXIgeGY9dyhUKCksMSkscWc9dHlwZW9mIHdpbmRvdzwidSIsZ249KCk9PntsZXRbZSx0XT0oMCx4Zi51c2VTdGF0ZSkoe3dpZHRoOnFnP3dpbmRvdy5pbm5lcldpZHRoOjFlMyxoZWlnaHQ6cWc/d2luZG93LmlubmVySGVpZ2h0OjFlM30pO3JldHVybigwLHhmLnVzZUVmZmVjdCkoKCk9PntpZihxZyl7bGV0IHI9KCk9Pnt0KHt3aWR0aDp3aW5kb3cuaW5uZXJXaWR0aCxoZWlnaHQ6d2luZG93LmlubmVySGVpZ2h0fSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixyKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHIpfX19LFtdKSxlfTt2YXIgeHQ9dyhUKCksMSk7dmFyIHdmPXcoVCgpLDEpO3ZhciBTcz0oe2NvbG9yOmU9InJnYmEoMCwgMCwgMCkiLHN0eWxlOnR9KT0+d2YuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt3aWR0aDoiMTgiLGhlaWdodDoiMTkiLHZpZXdCb3g6IjAgMCAxOCAxOSIsZmlsbDoibm9uZSIsc3R5bGU6dH0sd2YuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJjaXJjbGUiLHtjeDoiNy41IixjeToiNy41IixyOiI2LjUiLHN0cm9rZTplPT09ImluaGVyaXQiPyJjdXJyZW50Q29sb3IiOmIoZSksc3Ryb2tlT3BhY2l0eToiMSIsc3Ryb2tlV2lkdGg6IjIifSksd2YuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTExLjcwNjggMTIuMjkzMkwxNyAxNy41ODU4IixzdHJva2U6ZT09PSJpbmhlcml0Ij8iY3VycmVudENvbG9yIjpiKGUpLHN0cm9rZU9wYWNpdHk6IjEiLHN0cm9rZVdpZHRoOiIyIn0pKTt2YXIgeW49dyhUKCksMSk7dmFyIFNmPXcoVCgpLDEpO3ZhciBDcz0oe3N0eWxlOmUsY29sb3I6dD0iYmxhY2sifSk9PlNmLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LnN2Zyx7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDoiMTIiLGhlaWdodDoiMTciLHZpZXdCb3g6IjAgMCAxMiAxNyIsZmlsbDoibm9uZSIsc3R5bGU6ZX0sU2YuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJlbGxpcHNlIix7Y3g6IjUuODgxODQiLGN5OiI0LjU3NzE1IixyeDoiNC41NzcxNSIscnk6IjQuNTc3MTUiLGZpbGw6dCxmaWxsT3BhY2l0eToiMSJ9KSxTZi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNNS44ODQ5MSA5LjE1NDNDMi42MzQ3NiA5LjE1NDMgMCAxMi42NjczIDAgMTcuMDAwOEgxMS43Njk4QzExLjc2OTggMTIuNjY3MyA5LjEzNTA2IDkuMTU0MyA1Ljg4NDkxIDkuMTU0M1oiLGZpbGw6dCxmaWxsT3BhY2l0eToiMSJ9KSk7dmFyIENmPXcoVCgpLDEpO3ZhciB5Uz0oe3N0eWxlOmV9KT0+Q2YuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOiIxNyIsaGVpZ2h0OiIxNyIsdmlld0JveDoiMCAwIDE3IDE3IixmaWxsOiJub25lIixzdHlsZTp7c3R5bGU6ZX19LENmLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicmVjdCIse3g6IjAuNSIseToiMC41Iix3aWR0aDoiMTYiLGhlaWdodDoiMTYiLHJ4OiI4IixzdHJva2U6ImJsYWNrIiwic3Ryb2tlLW9wYWNpdHkiOiIwLjQifSksQ2YuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTEyLjE0MzIgOC41MzM0Mkw2LjQ3NjU2IDEyLjE0NDVMNi40NzY1NiA0LjgxMTJMMTIuMTQzMiA4LjUzMzQyWiIsZmlsbDoiYmxhY2siLCJmaWxsLW9wYWNpdHkiOiIwLjQifSkpO3ZhciB3aT13KFQoKSwxKTt2YXIgVGY9KHtzdHlsZTplLGNvbG9yOnQ9ImluaGVyaXQifSk9PntsZXQgcj10PT09ImluaGVyaXQiPyJjdXJyZW50Q29sb3IiOmIodCk7cmV0dXJuIHdpLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LnN2Zyx7Y2xhc3NOYW1lOiJjdSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDoiMTIiLGhlaWdodDoiMTciLHZpZXdCb3g6IjAgMCAxMiAxNyIsZmlsbDoibm9uZSIsc3R5bGU6ey4uLmV9fSx3aS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInJlY3QiLHt4OiIwLjUiLHk6IjAuNSIsd2lkdGg6IjEwLjc2OTIiLGhlaWdodDoiMTYiLHN0cm9rZToiYmxhY2siLHN0cm9rZU9wYWNpdHk6IjAuNCJ9KSx3aS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImxpbmUiLHt4MToiMi42MTcxOSIseTE6IjMuNDIxODgiLHgyOiI5LjE1NTY1Iix5MjoiMy40MjE4OCIsc3Ryb2tlOnIsc3Ryb2tlT3BhY2l0eToiMC41In0pLHdpLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiIyLjYxNzE5Iix5MToiNi4wMzkwNiIseDI6IjkuMTU1NjUiLHkyOiI2LjAzOTA2IixzdHJva2U6cixzdHJva2VPcGFjaXR5OiIwLjUifSksd2kuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjIuNjE3MTkiLHkxOiI4LjY1MjM0Iix4MjoiOS4xNTU2NSIseTI6IjguNjUyMzQiLHN0cm9rZTpyLHN0cm9rZU9wYWNpdHk6IjAuNSJ9KSx3aS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImxpbmUiLHt4MToiMi42MTcxOSIseTE6IjExLjI2OTUiLHgyOiI5LjE1NTY1Iix5MjoiMTEuMjY5NSIsc3Ryb2tlOnIsc3Ryb2tlT3BhY2l0eToiMC41In0pLHdpLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiIyLjYxNzE5Iix5MToiMTMuODgyOCIseDI6IjkuMTU1NjUiLHkyOiIxMy44ODI4IixzdHJva2U6cixzdHJva2VPcGFjaXR5OiIwLjUifSkpfTt2YXIgd1M9dyhTaSgpLDEpO3ZhciBfcz13KFQoKSwxKTt2YXIgeFM9KCk9Pl9zLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LnN2Zyx7d2lkdGg6IjEyIixoZWlnaHQ6IjE3Iix2aWV3Qm94OiIwIDAgMTIgMTciLGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ9LF9zLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicmVjdCIse3g6IjAuNSIseToiMC41Iix3aWR0aDoiNC4yMzA3NyIsaGVpZ2h0OiIxNiIsc3Ryb2tlOiJibGFjayIsc3Ryb2tlT3BhY2l0eToiMC40In0pLF9zLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicmVjdCIse3g6IjcuMDM5MDYiLHk6IjAuNSIsd2lkdGg6IjQuMjMwNzciLGhlaWdodDoiMi45MjMwOCIsc3Ryb2tlOiJibGFjayIsc3Ryb2tlT3BhY2l0eToiMC40In0pLF9zLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicmVjdCIse3g6IjcuMDM5MDYiLHk6IjUuNzMwNDciLHdpZHRoOiI0LjIzMDc3IixoZWlnaHQ6IjIuOTIzMDgiLHN0cm9rZToiYmxhY2siLHN0cm9rZU9wYWNpdHk6IjAuNCJ9KSxfcy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInJlY3QiLHt4OiI3LjAzOTA2Iix5OiIxMC45NjA5Iix3aWR0aDoiNC4yMzA3NyIsaGVpZ2h0OiI1LjUzODQ2IixzdHJva2U6ImJsYWNrIixzdHJva2VPcGFjaXR5OiIwLjQifSkpO3ZhciBTUz0oe3ZhbHVlOmUsb25DbGljazp0LHN0eWxlOnJ9KT0+e2xldCBuPWooKTtyZXR1cm4geW4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHgubGkse2NsYXNzTmFtZToiZHMgbDUgYiB2IGw2IGF6IixzdHlsZTp7IiY6aG92ZXIiOntiYWNrZ3JvdW5kQ29sb3I6InZhcigtLWJnMSkifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntwYWRkaW5nOiIyNHB4IDEycHgifSwuLi5yfSxvbk1vdXNlRG93bjooKT0+e24uc2V0UGF0aCh7c2VjdGlvbjoic2VhcmNoIixpZDplbmNvZGVVUkkoZSl9KSx0KCl9fSx5bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibDcgYiB2In0seW4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHhTLG51bGwpKSx5bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7Y29sb3I6Im9yYW5nZSJ9LCJUbyBzZWFyY2ggcGFnZSIpKX0sQ1M9KHtkYXRhOmUsb25DbGljazp0LHN0eWxlOnJ9KT0+ZT95bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5saSx7Y2xhc3NOYW1lOiJkcyBiIHYgYXogbDYiLG9uTW91c2VEb3duOnQsc3R5bGU6eyImOmhvdmVyIjp7YmFja2dyb3VuZENvbG9yOiJ2YXIoLS1iZzEpIn0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2dhcDoiMTRweCJ9LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3BhZGRpbmc6IjEycHggMTJweCJ9LC4uLnJ9fSx5bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibDcgYiB2In0sZS50eXBlPT09ImNvbnRyaWJ1dG9yIj95bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQ3MsbnVsbCk6ZS5hcnRpY2xlVHlwZT8uWzBdPy50aXRsZT09PSJwb2RjYXN0Ij95bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeVMsbnVsbCk6eW4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFRmLG51bGwpKSx5bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7Y29sb3I6ImJsYWNrIn0sZS50aXRsZXx8ZS5oZWFkbGluZXx8ZS5oZWFkbGluZSkseW4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGd0LHtzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byJ9fSwoMCx3Uy5wcmV0dHlEYXRlKShlLnB1Ymxpc2hEYXRlLCJkYXRlIikpKTpudWxsO3ZhciBNbz13KFQoKSwxKTt2YXIga2Y9dyhUKCkpLEpuPXt9LEtnPTAsVFM9KGUsdCk9Pntmb3IoO3R5cGVvZiB0PT0iZnVuY3Rpb24iOyl0PXQoKTtKbltlXT17c2V0U3RhdGU6cj0+STYoZSxyKSxsaXN0ZW5lcnM6bmV3IFNldCxzdGF0ZTp0fX0sSTY9KGUsdCxyPSExKT0+e2UgaW4gSm4/Sm5bZV0uc3RhdGUhPT10JiYoSm5bZV0uc3RhdGU9dCxyfHwoS2crKyxKbltlXS5saXN0ZW5lcnMuZm9yRWFjaChuPT5uKEtnKSkpKTpUUyhlLHQpfTt2YXIgTDY9KGUsdCk9PntlIGluIEpufHxUUyhlLHQpLCgwLGtmLnVzZUVmZmVjdCkoKCk9PigpPT57Sm5bZV0ubGlzdGVuZXJzLmRlbGV0ZShyKX0sW2VdKTtsZXRbLHJdPSgwLGtmLnVzZVN0YXRlKShLZyk7cmV0dXJuIEpuW2VdLmxpc3RlbmVycy5hZGQociksW0puW2VdLnN0YXRlLEpuW2VdLnNldFN0YXRlXX0sQ2k9TDY7dmFyIE5mPShbZSx0XT1bXSk9PntsZXQgcj1bXTtyZXR1cm4gZT8uaGl0cz8uZm9yRWFjaChuPT57bi50eXBlPSJhcnRpY2xlIixuLnRpdGxlPW4uaGVhZGxpbmUsci5wdXNoKG4pfSksdD8uaGl0cz8uZm9yRWFjaChuPT57bi50eXBlPSJjb250cmlidXRvciIsbi50aXRsZT1cYCR7bi5maXJzdE5hbWV8fCIifSAke24ubGFzdE5hbWV8fCIifVxgLG4ucm9sZT1BNihuLnJvbGUpLHIucHVzaChuKX0pLHJ9LEE2PWU9PnR5cGVvZiBlIT0ibnVtYmVyIj9lOmU9PT0xfHxlPT09Mj8iRWRpdG9yIjplPT09Mz8iSm91cm5hbGlzdCI6Ik1lZGlhIFVzZXIiO3ZhciBfUz1lPT57bGV0IHQ9aigpLHI9dC5wYXRoLnNlY3Rpb24sbj10LnBhdGguaWQsbz0hZSYmcj09PSJzZWFyY2giLFtpLGxdPUNpKCJzZWFyY2gtb3Blbi1tb2JpbGUiLCExKSxbcyxhXT1DaSgic2VhcmNoLW9wZW4iLCExKSxbdSxwXT0oMCxNby51c2VTdGF0ZSkoW10pLGM9VSgpLFtmLGRdPSgwLE1vLnVzZVN0YXRlKShvP246IiIpOygwLE1vLnVzZUVmZmVjdCkoKCk9Pnt2YXIgaD0ib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtoJiYocz9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wPT09MCYmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9NSk6IW8mJnM9PT0hMSYmZCgiIikpfSxbcyxvXSk7bGV0IG09KDAsTW8udXNlUmVmKShvKTtyZXR1cm4oMCxNby51c2VFZmZlY3QpKCgpPT57aWYobyl7aWYobS5jdXJyZW50IT09ITApe2Qobik7cmV0dXJufWYhPT1uJiZ0LnNldFBhdGgoe2lkOmZ9KX1lbHNlIHMmJihhc3luYygpPT57cChmP05mKGF3YWl0IGMuY2FsbCgiZ2V0LXNlYXJjaC1yZXN1bHRzIix7cXVlcnk6Zn0pKTpbXSl9KSgpfSxbZixvXSksKDAsTW8udXNlRWZmZWN0KSgoKT0+e20uY3VycmVudD09PSEwJiYhbyYmKG0uY3VycmVudD1vLGQoIiIpKSxtLmN1cnJlbnQ9b30sW29dKSx7c2V0TW9iaWxlRm9jdXM6bCxmb2N1c2VkOnMsbW9iaWxlRm9jdXM6aSxpc1NlYXJjaFBhZ2U6byx2YWx1ZTpmLHJlc3VsdHM6dSxzZXRGb2N1c2VkOmEsc2V0VmFsdWU6ZH19O3ZhciBENj0iU2VhcmNoLi4uIixDdT01OSxZZz0oe21vYmlsZTplfSk9PntsZXR7Zm9jdXNlZDp0LG1vYmlsZUZvY3VzOnIsaXNTZWFyY2hQYWdlOm4sc2V0TW9iaWxlRm9jdXM6byx2YWx1ZTppLHNldEZvY3VzZWQ6bCxzZXRWYWx1ZTpzLHJlc3VsdHM6YX09X1MoZSksdT1qKCkscD0oMCx4dC51c2VSZWYpKCksYz0oMCx4dC51c2VSZWYpKCk7ZSYmcC5jdXJyZW50JiYocj9wLmN1cnJlbnQuZm9jdXMoKTpwLmN1cnJlbnQuYmx1cigpKTtsZXRbZixkXT0oMCx4dC51c2VTdGF0ZSkoLTEpO3JldHVybiBFYSgiQXJyb3dEb3duIiwoKT0+e3QmJihmPGEubGVuZ3RoLTE/KGQoZisxKSxjPy5jdXJyZW50Py5jaGlsZHJlblswXT8uc2Nyb2xsVG8oMCxmKjQ4KSk6ZjwwP2QoMCk6KGQoLTEpLGM/LmN1cnJlbnQ/LmNoaWxkcmVuWzBdPy5zY3JvbGxUbygwLDApKSl9KSxFYSgiQXJyb3dVcCIsKCk9Pnt0JiYoZjwwPyhkKGEubGVuZ3RoLTEpLGM/LmN1cnJlbnQ/LmNoaWxkcmVuWzBdPy5zY3JvbGxUbygwLChhLmxlbmd0aC0xKSo0OC01MCkpOmY9PT0wP2QoLTEpOihkKGYtMSksYz8uY3VycmVudD8uY2hpbGRyZW5bMF0/LnNjcm9sbFRvKDAsZio0OC01MCkpKX0pLHh0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIGZyIGs4IHYgazkifSx4dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYTUgZnIgYyIsc3R5bGU6e2hlaWdodDplP0N1KyJweCI6IjM4cHgiLG1heFdpZHRoOnR8fGU/IjEwMCUiOiIyNTZweCJ9LHJlZjpjfSx0P3h0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiMyBicyBidCBrYSBrYiBiIixzdHlsZTp7Ym9yZGVyUmFkaXVzOmU/dm9pZCAwOiIxOXB4IixwYWRkaW5nVG9wOmU/Q3UrInB4IjoiMzhweCIsYm9yZGVyOmU/dm9pZCAwOm58fGkubGVuZ3RoPDE/IjFweCBzb2xpZCB0cmFuc3BhcmVudCI6IjFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpIn19LHh0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChZbix7c3R5bGU6e3pJbmRleDoxMCxoZWlnaHQ6IjEwMCUiLGJhY2tncm91bmQ6IndoaXRlIixvcGFjaXR5Om4/MDphLmxlbmd0aD8xOi43LG1heEhlaWdodDoiY2FsYygxMDB2aCAtIDQwMHB4KSIsZGlzcGxheToiZmxleCIsYm9yZGVyVG9wOmU/InZhcigtLWJvcmRlcikiOnZvaWQgMCxmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHdpZHRoOiIxMDAlIixzY3JvbGxCZWhhdmlvcjoic21vb3RoIn0scmVmOmN9LChuP1tdOmEpPy5tYXAoKG0saCk9PihjPy5jdXJyZW50Py5zY3JvbGxUbygwLDQwKmYpLHh0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4dC5kZWZhdWx0LkZyYWdtZW50LHtrZXk6aH0saD09PTAmJnh0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChTUyx7b25DbGljazooKT0+e2UmJmwoITEpfSx2YWx1ZTppLHN0eWxlOntiYWNrZ3JvdW5kOmY8MD8idmFyKC0tYmcxKSI6ImluaGVyaXQifX0pLHh0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChDUyx7ZGF0YTptLGtleTptLmlkLG9uQ2xpY2s6KCk9PnttLnR5cGU9PT0iY29udHJpYnV0b3IiP3Uuc2V0UGF0aCh7c2VjdGlvbjoiYmlvIixpZDptLmlkfSk6dS5zZXRQYXRoKHtzZWN0aW9uOnhzKG0/LnNlY3Rpb24/LlswXS50aXRsZSksaWQ6bT8uaWR9KSxzKCIiKX0sc3R5bGU6e2JhY2tncm91bmQ6Zj09PWg/InZhcigtLWJnMSkiOiJpbmhlcml0In19KSkpKSx4dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToia2MifSkpKTpudWxsLHh0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmlucHV0LHtjbGFzc05hbWU6ImcwIGtkIGpwIGN6IGRoIGptIGN5IGVsIGMxIGMiLHJlZjpwLG9uS2V5RG93bjptPT57bGV0IGg9bS5jdXJyZW50VGFyZ2V0LnZhbHVlPz8iIjttLmtleT09PSJFbnRlciImJihmPDA/dS5zZXRQYXRoKHtzZWN0aW9uOiJzZWFyY2giLGlkOmVuY29kZVVSSShoKX0pOmFbZl0/LnR5cGU9PT0iY29udHJpYnV0b3IiP3Uuc2V0UGF0aCh7c2VjdGlvbjoiYmlvIixpZDphW2ZdPy5pZH0pOnUuc2V0UGF0aCh7c2VjdGlvbjp4cyhhW2ZdPy5zZWN0aW9uPy5bMF0udGl0bGUpLGlkOmFbZl0/LmlkfSksbCghMSkscD8uY3VycmVudD8uYmx1cigpLHMoW10pLGQoLTEpKX0sb25DbGljazptPT57bS5zdG9wUHJvcGFnYXRpb24oKSxtLnByZXZlbnREZWZhdWx0KCl9LG9uQ2hhbmdlOm09PnMobS5jdXJyZW50VGFyZ2V0LnZhbHVlKSx2YWx1ZTppPz8iIixwbGFjZWhvbGRlcjpENixvbkZvY3VzOigpPT57bCghMCl9LG9uQmx1cjooKT0+e2woITEpLG8oITEpfSxzdHlsZTp7YmFja2dyb3VuZDplPyJ2YXIoLS13aGl0ZSkiOnZvaWQgMCxib3JkZXJCb3R0b206ZT8idmFyKC0tYm9yZGVyKSI6dm9pZCAwLGJvcmRlcjplP3ZvaWQgMDoiMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4xMikiLGJvcmRlclJhZGl1czplP3ZvaWQgMDoiMTlweCIsIiY6OnBsYWNlaG9sZGVyIjp7Y29sb3I6InJnYmEoMCwgMCwgMzIsIDAuMykifX19KSx4dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoU3Mse2NvbG9yOiJibGFjayIsc3R5bGU6e3pJbmRleDoxLGxlZnQ6MTIscG9zaXRpb246ImFic29sdXRlIix0b3A6ZT8yMDoxMCxvcGFjaXR5OnQ/MTouNzYscG9pbnRlckV2ZW50czoibm9uZSIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2xlZnQ6IjEwcHgifX19KSx0JiZpP3h0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzaXplOiJkb3QiLHZhcmlhbnQ6Imdob3N0IixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixyaWdodDoxMCx0b3A6ZT8xNzo3LGhlaWdodDoyNCx3aWR0aDoyNCxwYWRkaW5nOjUsZGlzcGxheToibm9uZSIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDoxMDI0cHgpIjp7ZGlzcGxheToiYmxvY2sifX0sb25Nb3VzZURvd246bT0+e20ucHJldmVudERlZmF1bHQoKSxtLnN0b3BQcm9wYWdhdGlvbigpLHMoIiIpfX0seHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGxuLHtjb2xvcjoiYmxhY2sifSkpOm51bGwpKX07dmFyIGtTPXcobGwoKSwxKSxPNj0oKT0+e2xldFtlLHRdPUNpKCJzZWFyY2gtb3Blbi1tb2JpbGUiLCExKSxbLHJdPUNpKCJzZWFyY2gtb3BlbiIsITEpO3JldHVybiB2bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodm4uZGVmYXVsdC5GcmFnbWVudCxudWxsLHZuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtvbkNsaWNrOigpPT57cighMCksdCghMCl9LGp1c3RpZnk6ImNlbnRlciIsYWxpZ246ImNlbnRlciIsc3R5bGU6e2ZsZXhHcm93OjAsbWluV2lkdGg6MzgsaGVpZ2h0OjM4LG1hcmdpblJpZ2h0OjQsbWF4V2lkdGg6MzgsdHJhbnNpdGlvbkRlbGF5OiJvcGFjdGl0eSAwLjJzIix0cmFuc2l0aW9uOiJvcGFjaXR5IDAuMnMiLG9wYWNpdHk6ZT8wOjF9fSx2bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoU3Mse2NvbG9yOiJibGFjayJ9KSksKDAsa1MuY3JlYXRlUG9ydGFsKSh2bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodm4uZGVmYXVsdC5GcmFnbWVudCxudWxsLGU/dm4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Iml5IGF2IGdwIixvbkNsaWNrOigpPT57dCghMSl9LHN0eWxlOnt0b3A6Q3V9fSk6bnVsbCx2bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaXogaXkgYnMgYnQgZ2sgYXYiLHN0eWxlOnt0cmFuc2Zvcm06ZT8idHJhbnNsYXRlWSgwcHgpIjpcYHRyYW5zbGF0ZVkoLSR7Q3V9cHgpXGB9fSx2bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWWcse21vYmlsZTohMH0pLCIgIikpLGRvY3VtZW50LmJvZHkpKX0sTlM9KCk9PmduKCkud2lkdGg8PTY0MD92bi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTzYsbnVsbCk6dm4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFlnLHttb2JpbGU6ITF9KTt2YXIga3M9dyhUKCksMSk7ZnVuY3Rpb24gWGcoKXtsZXRbZSx0XT0oMCxrcy51c2VTdGF0ZSkoe3g6MCx5OjAsbGFzdFg6MCxsYXN0WTowfSk7cmV0dXJuKDAsa3MudXNlRWZmZWN0KSgoKT0+e2xldCByPSgpPT57dChuPT4oe3g6d2luZG93LnNjcm9sbFgseTp3aW5kb3cuc2Nyb2xsWSxsYXN0WDpuLngsbGFzdFk6bi55fSkpfTtyZXR1cm4gcigpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHIpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIscil9fSxbXSksZX12YXIgdVI9KDAsa3MuY3JlYXRlQ29udGV4dCkobnVsbCk7dmFyICRyPXcoVCgpLDEpLF91PXcoRVMoKSwxKTt2YXIgYWw9MjUwLE5zPTE0MixQUz0oKT0+e2xldCB0PWduKCkud2lkdGg8NjQwO3JldHVybiAkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYTUgYTYgYTcgYyBhOCBhOSBhYSBhYiBhYyBiIixqdXN0aWZ5OiJjZW50ZXIiLHN0eWxlOntoZWlnaHQ6YWwsIiYgI2RmcC1iaWxsYm9hcmQiOntwb3NpdGlvbjoicmVsYXRpdmUifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjEwMjRweCkiOntqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7aGVpZ2h0Ok5zKyJweCIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiY2VudGVyIn19fSwkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoxNix0b3A6MTYsekluZGV4OjB9fSwiQWQiKSwkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX3UuQWQse2FkVW5pdDp0PyIvMTA1Mzc1MDgvTGFyZ2UtTW9iaWxlLUJhbm5lciI6Ii8xMDUzNzUwOC9CaWxsYm9hcmQiLG5hbWU6ImRmcC1iaWxsYm9hcmQiLHNpemU6dD9bMzIwLDEwMF06Wzk3MCxhbF19KSl9LE1TPSgpPT4kci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYWQgYWUgYWYgYWcgYWMgYTUgYWggYWkiLHN0eWxlOnsiJiAjZGZwLW1lZGl1bS1yZWN0YW5nbGUtMSI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21hcmdpblRvcDowLG1hcmdpbkJvdHRvbTowfX19LCRyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjE2LGJvdHRvbToxNix6SW5kZXg6MH19LCJBZCIpLCRyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfdS5BZCx7YWRVbml0OiIvMTA1Mzc1MDgvTWVkaXVtLVJlY3RhbmdsZS0xIixuYW1lOiJkZnAtbWVkaXVtLXJlY3RhbmdsZS0xIixzaXplOlszMDAsMjUwXX0pKSxQZj0oKT0+JHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImFqIGFrIGFjIGMgYWwgYW0gYW4gYTUiLHN0eWxlOnsiJiAjZGZwLWhvbWVwYWdlX3ByZW1pdW0iOntwb3NpdGlvbjoicmVsYXRpdmUifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntkaXNwbGF5OiJub25lIn19fSwkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIscmlnaHQ6MTYsYm90dG9tOjE2LHpJbmRleDowfX0sIkFkIiksJHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF91LkFkLHthZFVuaXQ6Ii8xMDUzNzUwOC9Ib21lcGFnZV9wcmVtaXVtIixuYW1lOiJkZnAtaG9tZXBhZ2VfcHJlbWl1bSIsc2l6ZTpbWzk3MCwyNTBdLFs5MzAsNjAwXV19KSksTWY9KCk9PiRyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJhbyBhYyBhcCBhNSIsc3R5bGU6eyImICNkZnAtaGFsZi1wYWdlIjp7cG9zaXRpb246InJlbGF0aXZlIn19fSwkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoxNix0b3A6MTYsekluZGV4OjB9fSwiQWQiKSwkci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX3UuQWQse2FkVW5pdDoiLzEwNTM3NTA4L0hhbGYtcGFnZSIsbmFtZToiZGZwLWhhbGYtcGFnZSIsc2l6ZTpbMzAwLDYwMF19KSk7dmFyIGt1PXcoVCgpLDEpO3ZhciBJUz0oe3NldE9wZW5Nb2JpbGVNZW51OmV9KT0+a3UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguYnV0dG9uLHtjbGFzc05hbWU6ImJqIHAgYWIgdiBqMyBmdCBkcyBqNCBqNSIsc3R5bGU6eyImIGRpdiI6e3dpZHRoOiIxOHB4IixiYWNrZ3JvdW5kOmIoIm9yYW5nZSIpLGhlaWdodDoiMnB4In0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7ZGlzcGxheToiZmxleCJ9fSxvbkNsaWNrOigpPT5lKCEwKX0sa3UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LG51bGwpLGt1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdixudWxsKSxrdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYsbnVsbCkpO3ZhciBqcj13KFQoKSwxKTt2YXIgJHQ9dyhUKCksMSk7dmFyIE51PSgpPT50eXBlb2Ygd2luZG93PCJ1IiYmKG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wfHxuYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cz4wKTt2YXIgSmc9dyhsbCgpLDEpLEg2PSh7Y2hpbGRyZW46ZSx2YXJpYW50OnQsb25DbGljazpyLHZhbHVlOm4saXRlbVZhbHVlOm99KT0+e2xldCBpPW4mJm4uZmluZChzPT5zLmlkPT09by5pZCk7cmV0dXJuICR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChxYyx7b25DbGljazpyLGNvbG9yOmk/Im9yYW5nZSI6IndoaXRlIn0sdD09PSJzaW5nbGUiP251bGw6JHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImpxIGpyIGVoIGpzIGIgdiBhYiIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjppP2IoIm9yYW5nZSIpOiJyZ2JhKDI1NSwyNTUsMjU1LDAuMSkifX0pLGUpfSxicz0oe29wdGlvbnM6ZSxjaGlsZHJlbjp0LG9uU2luZ2xlU2VsZWN0OnIsdmFsdWU6bixvbkNoYW5nZTpvfSk9PntsZXQgaT0oMCwkdC51c2VSZWYpKHtwb3M6e3g6MCx5OjB9fSksW2wsc109KDAsJHQudXNlU3RhdGUpKCExKSxhPWooKTsoMCwkdC51c2VFZmZlY3QpKCgpPT57cyghMSl9LFthLmxvY2F0aW9uXSk7bGV0IHU9Z24oKTsoMCwkdC51c2VFZmZlY3QpKCgpPT57aWYobCYmdS53aWR0aDw2NDApe2xldCBmPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdztyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLCgpPT57ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93PWZ9fX0sW2wsdS53aWR0aF0pO2xldCBwPWkuY3VycmVudC5wb3MueCxjPWkuY3VycmVudC5wb3MueSs1MDtyZXR1cm4gcD51LndpZHRoLTI3MCYmKHA9dS53aWR0aC0yNzApLGM+dS5oZWlnaHQtNTIwJiYoYz11LmhlaWdodC01MjApLCR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhNSBpYSBiIGMifSwkdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYyIsb25DbGljazpmPT57aS5jdXJyZW50LnBvcz1mLmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscyghMCl9fSx0KSxsPygwLEpnLmNyZWF0ZVBvcnRhbCkoJHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJvIGF2IGdrIGJzIGI5IGJ0IGRzIixvbkNsaWNrQ2FwdHVyZTpmPT57Zi5wcmV2ZW50RGVmYXVsdCgpLGYuc3RvcFByb3BhZ2F0aW9uKCkscyghMSl9fSksZG9jdW1lbnQuYm9keSk6bnVsbCxsPygwLEpnLmNyZWF0ZVBvcnRhbCkoJHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFluLHtjbGFzc05hbWU6ImRyb3Bkb3duLXNjcm9sbGJhciIsc3R5bGU6e3pJbmRleDoyLHRvcDpjLGxlZnQ6cCxyaWdodDowLHBvc2l0aW9uOiJmaXhlZCIsd2lkdGg6IjI1MHB4IixkaXNwbGF5OiJmbGV4IixmaWx0ZXI6ImRyb3Atc2hhZG93KDBweCA0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSkpIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGJvcmRlclJhZGl1czoiMTJweCIscGFkZGluZ1RvcDoxMixwYWRkaW5nQm90dG9tOjEyLGdhcDoxMixjdXJzb3I6InBvaW50ZXIiLGJhY2tncm91bmRDb2xvcjpiKCJuYXZ5IiksaGVpZ2h0OiJhdXRvIixtYXhIZWlnaHQ6IjUwMHB4IiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntwYWRkaW5nQm90dG9tOiI0MHB4IixwYWRkaW5nVG9wOiI0MHB4Iix0b3A6IjEwcHgiLGxlZnQ6IjEwcHgiLHJpZ2h0OiIxMHB4Iix3aWR0aDoiY2FsYygxMDB2dyAtIDIwcHgpIixtYXhIZWlnaHQ6ImNhbGMoODB2aCkiLHBvc2l0aW9uOiJmaXhlZCJ9fX0sTnUoKT8kdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYjMganQganUgZnQgZnYgYiBqdiBhYiB2IGdiIixvbkNsaWNrOigpPT57cyghMSl9fSwkdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobG4sbnVsbCkpOm51bGwsZS5tYXAoKGYsZCk9PiR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChINix7dmFyaWFudDpyPyJzaW5nbGUiOiJtdWx0aXBsZSIsdmFsdWU6bixpdGVtVmFsdWU6ZixrZXk6ZCxvbkNsaWNrOigpPT57cj8ocihmKSxzKCExKSk6byYmKG4uZmluZChtPT5tLmlkPT09Zi5pZCk/byhtPT5tLmZpbHRlcihoPT5oLmlkIT09Zi5pZCkpOm8obT0+Wy4uLm0sZl0pKX19LGYudGl0bGUpKSksZG9jdW1lbnQuYm9keSk6bnVsbCl9O3ZhciBJZj13KFQoKSwxKSxUZT0oKT0+e2lmKCFtbilyZXR1cm57fTtsZXR7dXNlcklkOmV9PU50KCkse2RhdGE6dCxsb2FkaW5nOnIsY2hlY2tzdW06bn09cGUoZSYmIndlYnNpdGU6dXNlciIse2lkOmV9KSxbbyxpXT0oMCxJZi51c2VTdGF0ZSkoKSxsPXQ/Lm1lbWJlcnNoaXAscz1VKCk7cmV0dXJuKDAsSWYudXNlRWZmZWN0KSgoKT0+e298fCghZXx8IXImJmw8MikmJnMuY2FsbCgiY2hlY2staXAiKS50aGVuKGkpLmNhdGNoKGNvbnNvbGUuZXJyb3IpfSxbcixsLG8sZV0pLHsuLi50LGlwQWNjZXNzOm8sdXNlcklkOmUsbG9hZGluZzpyLGNoZWNrc3VtOm59fTt2YXIgQWY9dyhpMCgpLDEpLFVTPSh7b3BlbkxvZ2luOmV9KT0+e2xldHtzZWN0aW9uczp0fT1YbigpLHI9aigpLG49TnQoKSxvPVRlKCksW2ksbF09KDAsanIudXNlU3RhdGUpKCExKTtyZXR1cm4oMCxqci51c2VFZmZlY3QpKCgpPT57bi51c2VySWQ/KGwoITApLEFmLmRlZmF1bHQuZGVmYXVsdC5ndGFnKCJzZXQiLCJ1c2VyX3Byb3BlcnRpZXMiLHt1c2VySWQ6bi51c2VySWR9KSk6QWYuZGVmYXVsdC5kZWZhdWx0Lmd0YWcoInNldCIsInVzZXJfcHJvcGVydGllcyIse3VzZXJJZDp2b2lkIDB9KX0sW24udXNlcklkXSksKDAsanIudXNlRWZmZWN0KSgoKT0+e2lmKG4udXNlcklkJiYhby5sb2FkaW5nKXtsZXQgcz1bImZyZWUiLCJuZXdzbGV0dGVyIiwibW9udGhseSIsInllYXJseSIsIm9yZyBsZWFkZXIiLCJvcmciXTtvJiZBZi5kZWZhdWx0LmRlZmF1bHQuZ3RhZygic2V0IiwidXNlcl9wcm9wZXJ0aWVzIix7dXNlclJvbGU6c1tvLm1lbWJlcnNoaXBdfHx2b2lkIDB9KX19LFtvLmxvYWRpbmddKSxqci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7c3R5bGU6e3dpZHRoOiJhdXRvIixnYXA6OCwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntkaXNwbGF5OiJub25lIn19fSxqci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYnMse29wdGlvbnM6dCxvblNpbmdsZVNlbGVjdDpzPT57ci5zZXRQYXRoKHtzZWN0aW9uOiJzZWN0aW9uIixpZDpzLmlkfSksci5zZXRRdWVyeSh7Z2lmdFRva2VuOm51bGx9KX0sc3R5bGU6e21pbkhlaWdodDoiMzAwcHgifX0sanIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse3NpemU6ImxhcmdlIix2YXJpYW50OiJnaG9zdCJ9LCJTZWN0aW9ucyIpKSxqci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ImowIGV1IGoxIGoyIn0pLGk/anIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOiJuYXZ5IixzdHlsZTp7Zm9udFNpemU6IjE2cHgiLGdhcDoxMiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7Zm9udFNpemU6IjE0cHgifX0sb25DbGljazooKT0+e3Iuc2V0UGF0aCh7c2VjdGlvbjoiYWNjb3VudCIsaWQ6bnVsbH0pfX0sanIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KENzLHtjb2xvcjoid2hpdGUiLHN0eWxlOnt3aWR0aDo4LG1hcmdpblJpZ2h0OiI2cHgiLG1hcmdpbkJvdHRvbToiLTNweCIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2Rpc3BsYXk6Im5vbmUifX19KSwiQWNjb3VudCIpOmpyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtjb2xvcjoibmF2eSIsc3R5bGU6e2ZvbnRTaXplOiIxNnB4IixnYXA6MTIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2ZvbnRTaXplOiIxNHB4In19LG9uQ2xpY2s6KCk9PntlKCEwKX19LCJMb2dpbiIpKX07dmFyIERmPTg4LE9mPTYwLFZTPSh7c2VjdGlvbjplLGlkOnR9KT0+e2xldFtyXT1DaSgic2VhcmNoLW9wZW4iLCExKSxuPWooKSxbbyxpXT0oMCxNZS51c2VTdGF0ZSkoITEpLFtsLHNdPSgwLE1lLnVzZVN0YXRlKSghMSksYT1uZXcgRGF0ZShEYXRlLm5vdygpKSx1PVhnKCksW3AsY109KDAsTWUudXNlU3RhdGUpKCExKSxbZixkXT0oMCxNZS51c2VTdGF0ZSkoITEpO3JldHVybigwLE1lLnVzZUVmZmVjdCkoKCk9PntjKCEwKTtsZXQgbT1zZXRUaW1lb3V0KCgpPT57YyghMSl9LDMwMCk7cmV0dXJuKCk9PntjbGVhclRpbWVvdXQobSl9fSxbbi5sb2NhdGlvbl0pLCgwLE1lLnVzZUVmZmVjdCkoKCk9PntpZihyKWQoITEpO2Vsc2V7bGV0IGg9d2luZG93LmlubmVyV2lkdGg+NjQwP05zK09mOmFsK0RmO3UueT5oJiZ1LnktdS5sYXN0WT4wP2QoITApOnUueS11Lmxhc3RZPC0xNSYmZCghMSl9fSxbdS55LHUubGFzdFkscixwXSksTWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE1lLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxNZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYm8gYnAgYTkgYWEgYnEgYnIgYnMgYnQgYiB2IGJ1IixzdHlsZTp7aGVpZ2h0OkRmLTEscG9zaXRpb246dS55PmFsKzE/ImZpeGVkIjoiYWJzb2x1dGUiLHRvcDp1Lnk+YWwrMT8wOmFsKzEsdHJhbnNpdGlvbjpwP3ZvaWQgMDoidHJhbnNmb3JtIDAuMTRzIGVhc2UtaW4iLHRyYW5zZm9ybTpmPyJ0cmFuc2xhdGVZKC0xMDAlKSI6InRyYW5zbGF0ZVkoMHB4KSIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7aGVpZ2h0Ok9mKyJweCIscG9zaXRpb246dS55Pk5zKzE/ImZpeGVkIjoiYWJzb2x1dGUiLHRvcDp1Lnk+TnMrMT8iMHB4IjpOcysicHgifX19LE1lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChiZSx7c3R5bGU6e3BhZGRpbmdMZWZ0OjE2LHBhZGRpbmdSaWdodDoxNn19LE1lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtqdXN0aWZ5OiJzdGFydCJ9LE1lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjIGE4IGJ2IGFhIGIgaSJ9LE1lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJidyBiIHAgYWIifSxNZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7Y29sb3I6ImdyZXkiLHN0eWxlOntoZWlnaHQ6MTIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZ0xlZnQ6IjE2cHggIWltcG9ydGFudCIsZm9udFNpemU6IjEycHgiLGRpc3BsYXk6Im5vbmUifX19LE1lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChWZSxudWxsLG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse21vbnRoOiJzaG9ydCIsZGF5OiIyLWRpZ2l0Iix5ZWFyOiJudW1lcmljIn0pLmZvcm1hdChhKSkpLE1lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChWaSxudWxsKSksTWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFZlLG51bGwsTWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE5TLG51bGwpKSxNZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVVMse29wZW5Mb2dpbjppfSkpLE1lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChJUyx7c2V0T3Blbk1vYmlsZU1lbnU6c30pKSkpLG8/TWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEtuLHtzdHlsZTp7fSxzZXRPcGVuOigpPT5pKCExKX0pOm51bGwsbD9NZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZ1Mse29uQ2xvc2U6KCk9PnMoITEpLHNldE9wZW46aX0pOm51bGwpfTt2YXIganQ9dyhUKCksMSk7dmFyIEllPXcoVCgpLDEpO3ZhciBXcj13KFQoKSwxKTt2YXIgZzU9WXQoeyIwJSI6e29wYWNpdHk6IjAuMyJ9LCIxMDAlIjp7b3BhY2l0eToiMSJ9fSksSHI9KHt0aXRsZTplLGRlc2NyaXB0aW9uOnQsY2hpbGRyZW46cixzdHlsZTpuLHNldE9wZW46byxvbkNhbmNlbDppLG9uU3VibWl0Omx9KT0+V3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImF2IGdrIGJzIGJ0IGI5IGdsIGIgZ20gZ24gazMiLHN0eWxlOnthbmltYXRpb246ZzUsLi4ubn19LFdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7b25DbGljazooKT0+e28oITEpfSxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjoicG9pbnRlciJ9fSksV3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImIzIGI3IGs0IGs1IGFuIGdzIGs2IGIgdiBieSBrNyBiMiBwIixzdHlsZTp7IiYgaW5wdXQiOntiYWNrZ3JvdW5kQ29sb3I6IndoaXRlIixkaXNwbGF5OiJibG9jayIsbWluV2lkdGg6IjM3N3B4IixwYWRkaW5nOiI4cHggMThweCIsZm9udFNpemU6IjE2cHgiLG1hcmdpblRvcDoiMTZweCIsaGVpZ2h0OiIzOHB4Iixjb2xvcjoiYmxhY2siLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21pbldpZHRoOiIyNTZweCAhaW1wb3J0YW50In0sIiY6OnBsYWNlaG9sZGVyIjp7Y29sb3I6InJnYmEoMCwgMCwgMzIsIDAuNSkifSwiJjpmb2N1cyI6e2JvcmRlcjoiMXB4IHNvbGlkIGJsYWNrIn19LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3dpZHRoOiIxMDAlIixtYXhXaWR0aDoiMzI0cHgiLHRvcDoiNTAlIn19fSxXci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c2l6ZToiZG90IixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixyaWdodDoiMjBweCIsdG9wOiIxNnB4IixoZWlnaHQ6MzYsd2lkdGg6MzZ9LG9uQ2xpY2s6KCk9PntvKCExKX19LFdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsbixudWxsKSksV3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIixnYXA6MzJ9LFdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiIsYWxpZ246ImNlbnRlciJ9LGUmJldyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChubix7c3R5bGU6e21hcmdpbkJvdHRvbToiMTZweCIsbWFyZ2luVG9wOiIxNnB4In19LGUpLHQmJldyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLHtzdHlsZTp7bWFyZ2luQm90dG9tOiIxNnB4In19LHQpLHIpLFdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiIsYWxpZ246ImNlbnRlciJ9LGkmJldyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7d2lkdGg6Mzc3LG1hcmdpblRvcDoxOCxoZWlnaHQ6Mzl9LG9uQ2xpY2s6aX0sIkNhbmNlbCIpLGwmJldyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7d2lkdGg6Mzc3LG1hcmdpblRvcDoxOCxoZWlnaHQ6Mzl9LG9uQ2xpY2s6bCxjb2xvcjoiYmxhY2sifSwiQ29uZmlybSIpKSkpKTt2YXIgemY9KCk9PntsZXRbZSx0XT0oMCxJZS51c2VTdGF0ZSkoIiIpLFtyLG5dPSgwLEllLnVzZVN0YXRlKSgiIiksW28saV09KDAsSWUudXNlU3RhdGUpKCIiKSxbbCxzXT0oMCxJZS51c2VTdGF0ZSkoIiIpLFthLHVdPSgwLEllLnVzZVN0YXRlKSgiIiksW3AsY109KDAsSWUudXNlU3RhdGUpKCExKSxmPVUoKSxkPU9lKCk7cmV0dXJuKDAsSWUudXNlRWZmZWN0KSgoKT0+e3UoIiIpLHMoIiIpfSxbZSxyLG8scF0pLCgwLEllLnVzZUVmZmVjdCkoKCk9PnthPT09IlJlZ2lzdHJhdGlvbiBDb21wbGV0ZSImJihjKCExKSxkKCJyZWdpc3RlcmVkIiwiWW91IGhhdmUgc3VjY2VzZnVsbHkgcmVnaXN0ZXJlZCIpKX0sW2FdKSxJZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYsbnVsbCxJZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCxudWxsLCJTdWJzY3JpYmUgdG8gb3VyIG5ld3NsZXR0ZXIgYW5kIGdldCAzIGZyZWUgYXJ0aWNsZXMiKSxJZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7c3R5bGU6e21hcmdpblRvcDo0LG1heFdpZHRoOjQwMH19LEllLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmlucHV0LHtjbGFzc05hbWU6InJlcXVpcmVkIGVtYWlsIGMgZnEgZnIgZnMgZnQgYnUgY3ogZGggZnUiLHR5cGU6ImVtYWlsIixuYW1lOiJFTUFJTCIscmVxdWlyZWQ6ITAsdmFsdWU6ZSxvbkNoYW5nZTptPT50KG0uY3VycmVudFRhcmdldC52YWx1ZSksc3R5bGU6eyImOjpwbGFjZWhvbGRlciI6e2NvbG9yOiIgcmdiYSgwLCAwLCAzMiwgMC4zKSAifSwiJjpmb2N1cyI6e2JvcmRlcjoiMXB4IHNvbGlkIGJsYWNrIn19LHBsYWNlaG9sZGVyOiJFbnRlciB5b3VyIGVtYWlsYWRyZXNzIn0pLEllLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJjbGVhciBmdiBmdCBhNSBmdyIsc3R5bGU6eyImOmhvdmVyID4gYnV0dG9uIjp7YmFja2dyb3VuZDoidmFyKC0tb3JhbmdlKSJ9fX0sSWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtjbGFzc05hbWU6ImZ0IGZ2IGZ4IGZ5IGIgZnogZzAgZHMiLG9uQ2xpY2s6KCk9PmMoITApLHR5cGU6InN1Ym1pdCIsbmFtZToic3Vic2NyaWJlIn0pLEllLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4aSx7c3R5bGU6e2N1cnNvcjoicG9pbnRlciIscG9pbnRlckV2ZW50czoibm9uZSIsd2lkdGg6IjIwcHgiLGhlaWdodDoiMjBweCIscG9zaXRpb246ImFic29sdXRlIix0b3A6IjlweCIsbGVmdDoiOXB4In19KSkscD9JZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSHIse3NldE9wZW46Yyx0aXRsZToiQ3JlYXRlIGEgbmV3IGFjY291bnQifSxJZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToidiBwIGIgZzEgYyIsc3R5bGU6eyImIGlucHV0Ijp7YmFja2dyb3VuZENvbG9yOiJ3aGl0ZSIsZGlzcGxheToiYmxvY2siLG1pbldpZHRoOiIzMzdweCIscGFkZGluZzoiOHB4IDE4cHgiLHdpZHRoOiIxMDAlIiwiJjo6cGxhY2Vob2xkZXIiOntjb2xvcjoicmdiYSgwLCAwLCAzMiwgMC4zKSJ9LCImOmZvY3VzIjp7Ym9yZGVyOiIxcHggc29saWQgYmxhY2sifX19fSxJZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImlucHV0Iix7Y2xhc3NOYW1lOiJkZCBmdCBkeSIsdmFsdWU6ZSxpZDoiZW1haWwiLG9uQ2hhbmdlOm09PnQobS5jdXJyZW50VGFyZ2V0LnZhbHVlKSxzdHlsZTp7Ym9yZGVyOmw/XGAxcHggc29saWQgJHtiKCJvcmFuZ2UiKX1cYDp2b2lkIDB9LHBsYWNlaG9sZGVyOiJFbnRlciB5b3VyIGVtYWlsYWRyZXNzKiJ9KSxJZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5pbnB1dCx7Y2xhc3NOYW1lOiJjIGZzIGRkIGZ0IGR5Iix2YWx1ZTpyLHR5cGU6InBhc3N3b3JkIixpZDoicGFzc3dvcmQiLG9uQ2hhbmdlOm09Pm4obS5jdXJyZW50VGFyZ2V0LnZhbHVlKSxzdHlsZTp7Ym9yZGVyOmw/XGAxcHggc29saWQgJHtiKCJvcmFuZ2UiKX1cYDp2b2lkIDAsIiY6OnBsYWNlaG9sZGVyIjp7Y29sb3I6InJnYmEoMCwgMCwgMzIsIDAuMykifX0scGxhY2Vob2xkZXI6IkVudGVyIHlvdXIgUGFzc3dvcmQqIn0pLEllLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmlucHV0LHtjbGFzc05hbWU6ImMgZnMgZGQgZnQgZHkiLHZhbHVlOm8saWQ6IkNvbmZpcm0gUGFzc3dvcmQiLHR5cGU6InBhc3N3b3JkIixvbkNoYW5nZTptPT5pKG0uY3VycmVudFRhcmdldC52YWx1ZSksc3R5bGU6e2JvcmRlcjpsP1xgMXB4IHNvbGlkICR7Yigib3JhbmdlIil9XGA6dm9pZCAwLCImOjpwbGFjZWhvbGRlciI6e2NvbG9yOiJyZ2JhKDAsIDAsIDMyLCAwLjMpIn19LHBsYWNlaG9sZGVyOiJDb25maXJtIFBhc3N3b3JkIn0pLEllLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLHtzdHlsZTp7bWFyZ2luVG9wOjEyfSxjb2xvcjphPyJuYXZ5Ijoib3JhbmdlIn0sbWUoYT8/bCkpLEllLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtjb2xvcjoibmF2eSIsc3R5bGU6e3dpZHRoOiIxMDAlIixtYXJnaW5Ub3A6MjAsaGVpZ2h0OiIzOXB4In0sZW50ZXI6ITAsb25DbGljazphc3luYygpPT57dSgiUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwgdG8gdmVyaWZ5IHlvdXIgYWNjb3VudCIpLGF3YWl0IGYuY2FsbCgid2Vic2l0ZTpyZWdpc3RlciIse2VtYWlsOmUscGFzc3dvcmQ6cixwYXNzd29yZDI6byxuZXdzbGV0dGVyOiEwfSkuY2F0Y2gobT0+cyhtZShtLm1lc3NhZ2UpKSkudGhlbihtPT51KG0pKX19LCJSZWdpc3RlciIpKSk6bnVsbCkpfTt2YXIgU3Q9dyhUKCksMSk7dmFyIGwwPXcoVCgpLDEpO3ZhciBCZj0oe3N0eWxlOmUsY29sb3I6dD0iaW5oZXJpdCJ9KT0+bDAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt3aWR0aDoiMjEiLGhlaWdodDoiMjEiLHZpZXdCb3g6IjAgMCAyMSAyMSIsZmlsbDoibm9uZSIsc3R5bGU6ZX0sbDAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTEwLjA0NSAwQzQuNTA2MjcgMCAwIDQuNTA1ODQgMCAxMC4wNDVDMCAxNS41ODQyIDQuNTA2MjcgMjAuMDkgMTAuMDQ1IDIwLjA5QzE1LjU4MzcgMjAuMDkgMjAuMDkgMTUuNTg0MiAyMC4wOSAxMC4wNDVDMjAuMDkgNC41MDU4NCAxNS41ODM3IDAgMTAuMDQ1IDBaTTYuOTg3ODMgMTQuNDEyNEg1LjI0MDg3VjcuODYxM0g2Ljk4NzgzVjE0LjQxMjRaTTYuMTE0MzUgNi41NTEwOUM1LjYzMTc1IDYuNTUxMDkgNS4yNDA4NyA2LjE2MDIxIDUuMjQwODcgNS42Nzc2MUM1LjI0MDg3IDUuMTk1MDEgNS42MzE3NSA0LjgwNDEzIDYuMTE0MzUgNC44MDQxM0M2LjU5Njk0IDQuODA0MTMgNi45ODc4MyA1LjE5NTAxIDYuOTg3ODMgNS42Nzc2MUM2Ljk4NzgzIDYuMTYwMjEgNi41OTY5NCA2LjU1MTA5IDYuMTE0MzUgNi41NTEwOVpNMTUuMjg1OSAxNC40MTI0SDEzLjUzODlWMTIuMjI4N1YxMS4xMzY4QzEzLjUzODkgMTAuMjk2MSAxMi44NTEgOS42MDgyNiAxMi4wMTAzIDkuNjA4MjZDMTEuMTY5NiA5LjYwODI2IDEwLjQ4MTcgMTAuMjk2MSAxMC40ODE3IDExLjEzNjhWMTQuNDEyNEg4LjczNDc4VjcuODYxM0gxMC40ODE3VjguNjU0NDJDMTAuOTkxOSA4LjE2NDQgMTEuNjgzNiA3Ljg2MTMgMTIuNDQ3MSA3Ljg2MTNDMTQuMDE1IDcuODYxMyAxNS4yODU5IDkuMTMyMjIgMTUuMjg1OSAxMC43MDAxVjE0LjQxMjRaIixmaWxsOnQ9PT0iaW5oZXJpdCI/ImN1cnJlbnRDb2xvciI6Yih0KX0pKTt2YXIgczA9dyhUKCksMSk7dmFyIFJTPSh7c3R5bGU6ZSxjb2xvcjp0PSJpbmhlcml0In0pPT5zMC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3dpZHRoOiIyMyIsaGVpZ2h0OiIyMyIsdmlld0JveDoiMCAwIDIzIDIzIixmaWxsOiJub25lIixzdHlsZTplfSxzMC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTEuNTAwOSAxLjM3OTg4QzUuOTExODYgMS4zNzk4OCAxLjM4MDg2IDUuOTEwODggMS4zODA4NiAxMS40OTk5QzEuMzgwODYgMTYuNTczNyA1LjExODM2IDIwLjc2MjkgOS45ODgzOCAyMS40OTQ4VjE0LjE4MjFINy40ODQ2VjExLjUyMkg5Ljk4ODM4VjkuNzUxODhDOS45ODgzOCA2LjgyMTIyIDExLjQxNjIgNS41MzQ2IDEzLjg1MTkgNS41MzQ2QzE1LjAxODUgNS41MzQ2IDE1LjYzNTMgNS42MjEwOCAxNS45Mjc0IDUuNjYwNjRWNy45ODI3MkgxNC4yNjU5QzEzLjIzMTggNy45ODI3MiAxMi44NzA3IDguOTYyOTggMTIuODcwNyAxMC4wNjc5VjExLjUyMkgxNS45MDEyTDE1LjQ5IDE0LjE4MjFIMTIuODcwN1YyMS41MTY0QzE3LjgxMDIgMjAuODQ2MiAyMS42MjA5IDE2LjYyMjkgMjEuNjIwOSAxMS40OTk5QzIxLjYyMDkgNS45MTA4OCAxNy4wODk5IDEuMzc5ODggMTEuNTAwOSAxLjM3OTg4WiIsZmlsbDp0PT09ImluaGVyaXQiPyJjdXJyZW50Q29sb3IiOmIodCl9KSk7dmFyIGEwPXcoVCgpLDEpO3ZhciBGZj0oe3N0eWxlOmUsY29sb3I6dD0iaW5oZXJpdCJ9KT0+YTAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHtjbGFzc05hbWU6ImhwIGlqIGlrIGJlIGlsIix3aWR0aDoiMTYiLGhlaWdodDoiMTYiLHZpZXdCb3g6IjAgMCAxNiAxNiIsZmlsbDoibm9uZSIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjp0PT09ImluaGVyaXQiPyJjdXJyZW50Q29sb3IiOmIodCksLi4uZX19LGEwLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0yLjUxMzY3IDIuNDU0MUw2Ljg4OTI0IDguODMyOThMMi42MDYzNSAxMy43OTQzSDMuNTU1MjVMNy4zMDgzMiA5LjQ0MzgyTDEwLjI5MjYgMTMuNzk0M0gxMy44Nzc4TDkuMzA2MzggNy4xMzA0M0wxMy4zNDA0IDIuNDU0MUgxMi4zOTQ0TDguODg2NzIgNi41MTc4NEw2LjA5ODg4IDIuNDU0MUgyLjUxMzY3Wk0zLjY0Njc2IDMuMDUwOTZINS43ODQ3MUwxMi43NDQ3IDEzLjE5NzVIMTAuNjA2OEwzLjY0Njc2IDMuMDUwOTZaIixmaWxsOiJ2YXIoLS13aGl0ZSkifSkpO3ZhciB1MD13KFQoKSwxKSxHUz0oKT0+dTAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJzdmciLHt3aWR0aDoiMjJweCIsaGVpZ2h0OiIyMnB4Iix2aWV3Qm94OiItMTAgLTUgMTAzNCAxMDM0Iix2ZXJzaW9uOiIxLjEifSx1MC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6XGBNNDk5IDExNHEtOTMgMCAtMTY2IDEwcS04MSAxMiAtMTI4IDMzbC0xNCA4cS0xNiAxMCAtMzIgMjVxLTIyIDIxIC0zOCA0N3EtMjEgMzMgLTMyIDczcS0xNCA0NyAtMTQgMTAzdjM3cTAgNzcgMSAxMjBxMyAxMTIgMTggMTg3cTE5IDk1IDYyIDE1NHE1MCA2NyAxMzQgOTBxMTA5IDI4IDIxMCAyM3E0NiAtMyA4OCAtMTJxMzAgLTcgNTUgLTE3bDE5IC04bC00IC03NWwtMjIgNnEtMjggNyAtNTcgMTBxLTQxIDYgLTc4IDVxLTUzIC0yIC04MCAtOAogcS00MyAtOCAtNjcgLTMwcS0yOSAtMjUgLTM1IC03MnEtMiAtMTQgLTIgLTI5bDI1IDZxMzEgNiA2NSAxMHE0OCA3IDkzIDlxNDIgMiA5MiAtMnEzMiAtMiA4OCAtOXQxMDcgLTMwcTQ5IC0yMiA4MS41IC01NHQzOC41IC02NHE5IC00NSAxMyAtMTA5cTQgLTQ2IDUgLTk3di00MXEwIC01NiAtMTQgLTEwM3EtMTEgLTQwIC0zMiAtNzNxLTE2IC0yNiAtMzggLTQ3cS0xNiAtMTUgLTMyIC0yNWwtMTQgLThxLTQ2IC0yMSAtMTI3IC0zMwogcS03NCAtMTAgLTE2NiAtMTBoLTN6TTI2OSA0MjhxMjYgMCA0NSAxOXQxOSA0NS41dC0xOSA0NS41dC00NS41IDE5dC00NSAtMTl0LTE4LjUgLTQ1LjV0MTguNSAtNDUuNXQ0NS41IC0xOXpNNTAwIDQyOHEyNyAwIDQ1LjUgMTl0MTguNSA0NS41dC0xOC41IDQ1LjV0LTQ1LjUgMTl0LTQ1LjUgLTE5dC0xOC41IC00NS41dDE4LjUgLTQ1LjV0NDUuNSAtMTl6TTczMSA0MjhxMjcgMCA0NS41IDE5dDE4LjUgNDUuNXQtMTguNSA0NS41dC00NSAxOQogdC00NS41IC0xOXQtMTkgLTQ1LjV0MTkgLTQ1LjV0NDUgLTE5elxgfSkpO3ZhciAkZj1lPT5TdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zcGFuLHtjbGFzc05hbWU6ImZuIixzdHlsZTp7IiY6aG92ZXIiOntjb2xvcjoidmFyKC0tb3JhbmdlKSJ9fX0sU3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7Li4uZSx0YXJnZXQ6Il9ibGFuayJ9KSkscVM9KCk9PlN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtmaXRDb250ZW50OiEwLGp1c3RpZnk6InN0YXJ0IixnYXA6OH0sU3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCRmLHtocmVmOiJodHRwczovL2JlLmxpbmtlZGluLmNvbS9jb21wYW55L2V1b2JzZXJ2ZXIiLHRhcmdldDoiX2JsYW5rIn0sU3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEJmLG51bGwpKSxTdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoJGYse2hyZWY6Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9FVW9ic2VydmVyIix0YXJnZXQ6Il9ibGFuayIsc3R5bGU6e21hcmdpblRvcDoiLTJweCJ9fSxTdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUlMsbnVsbCkpLFN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgkZix7aHJlZjoiaHR0cHM6Ly90d2l0dGVyLmNvbS9ldW9icyIsdGFyZ2V0OiJfYmxhbmsifSxTdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoRmYsbnVsbCkpLFN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgkZix7cmVsOiJtZSIsaHJlZjoiaHR0cHM6Ly9tYXN0b2Rvbi5zb2NpYWwvQGV1b2JzZXJ2ZXIifSxTdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoR1MsbnVsbCkpKSxqZj0oe2xhcmdlOmV9KT0+ZT9TdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7Zml0Q29udGVudDohMCxkaXJlY3Rpb246ImNvbHVtbiIsanVzdGlmeToic3RhcnQiLGdhcDoxMn0sU3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFZpLG51bGwpLFN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChxUyxudWxsKSk6U3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2ZpdENvbnRlbnQ6ITAsanVzdGlmeToic3RhcnQiLGdhcDo4fSxTdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQocVMsbnVsbCksU3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImZvIGZwIn0sU3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFZpLHtzaXplOiJzbWFsbCJ9KSkpO3ZhciBjMD0oe2RhdGE6ZSxmaWVsZDp0fSk9Pmp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChqdC5kZWZhdWx0LkZyYWdtZW50LG51bGwsZS5tYXAoKHIsbik9Pmp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7c2VjdGlvbjp0PT09ImFydGljbGVUeXBlIj8iYXJ0aWNsZS10eXBlIjp0LGZpZWxkOltyXSx2YXJpYW50OiJmb290ZXIiLGtleTpufSkpKSxwMD0oe3RpdGxlOmUsY2hpbGRyZW46dH0pPT5qdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse3N0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttaW5XaWR0aDoiNDAlIixtYXJnaW5Cb3R0b206MTZ9LCImICoiOntkaXNwbGF5OiJibG9jayJ9fX0sanQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtzdHlsZTp7bWFyZ2luQm90dG9tOjR9fSxlKSx0KSxRUz0oKT0+e2xldCBlPVhuKCk7cmV0dXJuIGp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJhIGIgYyBkIGUgZiIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBhZGRpbmc6IjMycHggMTZweCIsbWFyZ2luVG9wOiIwcHgifX19LGp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiIsanVzdGlmeToic3RhcnQiLGdhcDoyNCxzdHlsZTp7bWFyZ2luQm90dG9tOiI0OHB4Iix3aWR0aDoiNTAlIiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnt3aWR0aDoiMTAwJSIscGFkZGluZ0xlZnQ6IjE2cHgifX19LGp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChqZix7bGFyZ2U6ITB9KSxqdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoemYsbnVsbCkpLGp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJnIGIgaCBpIixzdHlsZTp7IiYgYSI6e3RleHREZWNvcmF0aW9uOiJub25lIixjb2xvcjpiKCJibGFjayIpLGN1cnNvcjoicG9pbnRlciIsIiY6aG92ZXIiOntjb2xvcjpiKCJvcmFuZ2UiKX19LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOnttYXJnaW5Ub3A6IjMycHgiLHdpZHRoOiIxMDAlIixqdXN0aWZ5Q29udGVudDoic3BhY2UtZXZlbmx5In0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7d2lkdGg6IjEwMCUiLGZsZXhXcmFwOiJ3cmFwIixqdXN0aWZ5Q29udGVudDoic3RhcnQifX19LGp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChwMCx7dGl0bGU6IlNlY3Rpb24ifSxqdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYzAse2RhdGE6ZS5zZWN0aW9ucyxmaWVsZDoic2VjdGlvbiJ9KSksanQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHAwLHt0aXRsZToiVHlwZSJ9LGp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChjMCx7ZGF0YTplLmFydGljbGVUeXBlcyxmaWVsZDoiYXJ0aWNsZVR5cGUifSkpLGp0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChwMCx7dGl0bGU6ImV1b2JzZXJ2ZXIifSxqdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYzAse2RhdGE6ZS5zdGF0aWMsZmllbGQ6InN0YXRpYyJ9KSkpKX07dmFyIEhlPXcoVCgpLDEpO3ZhciBBaT13KFQoKSwxKTt2YXIgdWU9dyhUKCksMSk7dmFyIGYwPXcoVCgpLDEpO3ZhciBLUz0oe3N0eWxlOmUsY29sb3I6dD0iaW5oZXJpdCJ9KT0+ZjAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt3aWR0aDoiMTQiLGhlaWdodDoiMTIiLHZpZXdCb3g6IjAgMCAxNCAxMiIsZmlsbDoibm9uZSIsc3R5bGU6ZX0sZjAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTEgNi41NzE0M1YxQzEgMC43MjM4NTggMS4yMjM4NiAwLjUgMS41IDAuNUgxMi41QzEyLjc3NjEgMC41IDEzIDAuNzIzODU4IDEzIDFWNi41NzE0M0MxMyA2Ljg0NzU3IDEyLjc3NjEgNy4wNzE0MyAxMi41IDcuMDcxNDNIOC4yMDM4MkM4LjA3MzE2IDcuMDcxNDMgNy45NDc2OSA3LjEyMjU3IDcuODU0MjcgNy4yMTM5Mkw0LjMyMDE0IDEwLjY2OTRDNC4wMDM1NyAxMC45Nzg5IDMuNDcwNTkgMTAuNzU0NiAzLjQ3MDU5IDEwLjMxMTlWNy41NzE0M0MzLjQ3MDU5IDcuMjk1MjkgMy4yNDY3MyA3LjA3MTQzIDIuOTcwNTkgNy4wNzE0M0gxLjVDMS4yMjM4NiA3LjA3MTQzIDEgNi44NDc1NyAxIDYuNTcxNDNaIixzdHJva2U6dD09PSJpbmhlcml0Ij8iY3VycmVudENvbG9yIjpiKHQpfSkpO3ZhciBFcj13KFQoKSwxKTt2YXIgZDA9dyhUKCksMSk7dmFyIFlTPSh7c3R5bGU6ZSxjb2xvcjp0PSJpbmhlcml0In0pPT5kMC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3dpZHRoOiIzMCIsaGVpZ2h0OiIzMCIsdmlld0JveDoiMCAwIDMwIDMwIixmaWxsOiJub25lIixzdHlsZTplfSxkMC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTYuMTk3MSA5VjExLjg2OTZDMTAuMDc0OCAxMi43NjIzIDguODU2NTQgMTcuMTMwNCA5LjAxMjczIDE5LjIwMjlDMTIuMjYxMyAxNi45MDcyIDE1LjE1NTkgMTYuODY0NyAxNi4xOTcxIDE3LjEzMDRWMjBMMjIuNDQ0NCAxNC43MzkxTDE2LjE5NzEgOVoiLHN0cm9rZTp0PT09ImluaGVyaXQiPyJjdXJyZW50Q29sb3IiOmIodCl9KSk7dmFyIG0wPXcoVCgpLDEpO3ZhciBYUz0oe3RleHQ6ZSxib2R5OnQsb25DbGljazpyfSk9PntsZXQgbj0iLiI7cmV0dXJuIG0wLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYSIse29uQ2xpY2s6KCk9PntyKCksd2luZG93Lm9wZW4oXGBodHRwOi8vdHdpdHRlci5jb20vc2hhcmU/dGV4dD0ke2V9JnVybD0ke2VuY29kZVVSSUNvbXBvbmVudCh0KX1cYCwicG9wIiwid2lkdGg9NjAwLCBoZWlnaHQ9NDAwLCBzY3JvbGxiYXJzPW5vIil9fSxtMC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoRmYsbnVsbCkpfTt2YXIgZzA9dyhUKCksMSk7dmFyIGgwPXcoVCgpLDEpO3ZhciBaUz0oe3N0eWxlOmUsY29sb3I6dD0iaW5oZXJpdCJ9KT0+aDAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt2aWV3Qm94OiIwIDAgNDQ4IDUxMiIsc3R5bGU6ey4uLmV9LGZpbGw6dD09PSJpbmhlcml0Ij8iY3VycmVudENvbG9yIjpiKHQpfSxoMC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMzgwLjkgOTcuMUMzMzkgNTUuMSAyODMuMiAzMiAyMjMuOSAzMmMtMTIyLjQgMC0yMjIgOTkuNi0yMjIgMjIyIDAgMzkuMSAxMC4yIDc3LjMgMjkuNiAxMTFMMCA0ODBsMTE3LjctMzAuOWMzMi40IDE3LjcgNjguOSAyNyAxMDYuMSAyN2guMWMxMjIuMyAwIDIyNC4xLTk5LjYgMjI0LjEtMjIyIDAtNTkuMy0yNS4yLTExNS02Ny4xLTE1N3ptLTE1NyAzNDEuNmMtMzMuMiAwLTY1LjctOC45LTk0LTI1LjdsLTYuNy00LTY5LjggMTguM0w3MiAzNTkuMmwtNC40LTdjLTE4LjUtMjkuNC0yOC4yLTYzLjMtMjguMi05OC4yIDAtMTAxLjcgODIuOC0xODQuNSAxODQuNi0xODQuNSA0OS4zIDAgOTUuNiAxOS4yIDEzMC40IDU0LjEgMzQuOCAzNC45IDU2LjIgODEuMiA1Ni4xIDEzMC41IDAgMTAxLjgtODQuOSAxODQuNi0xODYuNiAxODQuNnptMTAxLjItMTM4LjJjLTUuNS0yLjgtMzIuOC0xNi4yLTM3LjktMTgtNS4xLTEuOS04LjgtMi44LTEyLjUgMi44LTMuNyA1LjYtMTQuMyAxOC0xNy42IDIxLjgtMy4yIDMuNy02LjUgNC4yLTEyIDEuNC0zMi42LTE2LjMtNTQtMjkuMS03NS41LTY2LTUuNy05LjggNS43LTkuMSAxNi4zLTMwLjMgMS44LTMuNyAuOS02LjktLjUtOS43LTEuNC0yLjgtMTIuNS0zMC4xLTE3LjEtNDEuMi00LjUtMTAuOC05LjEtOS4zLTEyLjUtOS41LTMuMi0uMi02LjktLjItMTAuNi0uMi0zLjcgMC05LjcgMS40LTE0LjggNi45LTUuMSA1LjYtMTkuNCAxOS0xOS40IDQ2LjMgMCAyNy4zIDE5LjkgNTMuNyAyMi42IDU3LjQgMi44IDMuNyAzOS4xIDU5LjcgOTQuOCA4My44IDM1LjIgMTUuMiA0OSAxNi41IDY2LjYgMTMuOSAxMC43LTEuNiAzMi44LTEzLjQgMzcuNC0yNi40IDQuNi0xMyA0LjYtMjQuMSAzLjItMjYuNC0xLjMtMi41LTUtMy45LTEwLjUtNi42eiJ9KSk7dmFyIEpTPSh7Ym9keTplLG9uQ2xpY2s6dCx0ZXh0OnJ9KT0+e2xldCBuPSIuIjtyZXR1cm4gZzAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazooKT0+e3QoKSx3aW5kb3cub3BlbihcYGh0dHBzOi8vd2EubWUvP3RleHQ9JHtlbmNvZGVVUklDb21wb25lbnQoZSl9JTBhJHtyfVxgLCJfYmxhbmsiKX19LGcwLmRlZmF1bHQuY3JlYXRlRWxlbWVudChaUyx7c3R5bGU6e21hcmdpblRvcDoiLTJweCJ9fSkpfTt2YXIgeTA9dyhUKCksMSk7dmFyIGVDPSh7Ym9keTplLG9uQ2xpY2s6dCx0ZXh0OnJ9KT0+e2xldCBuPSIuIjtyZXR1cm4geTAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazooKT0+e3QoKSx3aW5kb3cuaW5uZXJXaWR0aDwxMDI0P3dpbmRvdy5vcGVuKFxgaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3NoYXJlQXJ0aWNsZT9taW5pPXRydWUmdXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfVxgLCJfYmxhbmsiKTp3aW5kb3cub3BlbihcYGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9zaGFyaW5nL3NoYXJlLW9mZnNpdGUvP3RleHQ9JHtlbmNvZGVVUklDb21wb25lbnQoZSl9JTBhJHtyfVxgLCJfYmxhbmsiKX19LHkwLmRlZmF1bHQuY3JlYXRlRWxlbWVudChCZixudWxsKSl9O3ZhciB2MD13KGxsKCksMSk7dmFyIGJ1PXcoVCgpLDEpLHRDPSh7Ym9keTplLG9uQ2xpY2s6dCx0ZXh0OnJ9KT0+e2xldCBuPSIuIjtyZXR1cm4gYnUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazooKT0+e3QoKSx3aW5kb3cub3BlbihcYGh0dHBzOi8vdC5tZS9zaGFyZS91cmw/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfSZ0ZXh0PSR7cn1cYCwicG9wIiwid2lkdGg9NjAwLCBoZWlnaHQ9NDAwLCBzY3JvbGxiYXJzPW5vIil9fSxidS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInN2ZyIse2NsYXNzTmFtZToia3cga3ggaWsga3kgYmUiLHdpZHRoOiIyMHB4IixoZWlnaHQ6IjIwcHgiLHZpZXdCb3g6IjAgMCAzMiAzMiIsZmlsbDoibm9uZSJ9LGJ1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0zMiAwSDBWMzJIMzJWMFoiLGZpbGw6IjBYRjEyMyJ9KSxidS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNOC4wOTk5MiAxNS43MDgzQzEyLjM5NDkgMTMuODM3MSAxNS4yNTg5IDEyLjYwMzQgMTYuNjkxOSAxMi4wMDc0QzIwLjc4MzQgMTAuMzA1NiAyMS42MzM1IDEwLjAxIDIyLjE4NzcgMTAuMDAwMUMyMi4zMDk1IDkuOTk4MDUgMjIuNTgyIDEwLjAyODMgMjIuNzU4NiAxMC4xNzE1QzIyLjkwNzYgMTAuMjkyNCAyMi45NDg2IDEwLjQ1NTggMjIuOTY4MyAxMC41NzA1QzIyLjk4NzkgMTAuNjg1MSAyMy4wMTIzIDEwLjk0NjQgMjIuOTkyOSAxMS4xNTA1QzIyLjc3MTIgMTMuNDgwMSAyMS44MTE4IDE5LjEzMzUgMjEuMzIzNyAyMS43NDI3QzIxLjExNzIgMjIuODQ2OCAyMC43MTA1IDIzLjIxNyAyMC4zMTY4IDIzLjI1MzJDMTkuNDYxMyAyMy4zMzE5IDE4LjgxMTYgMjIuNjg3OCAxNy45ODI5IDIyLjE0NDZDMTYuNjg2MiAyMS4yOTQ2IDE1Ljk1MzcgMjAuNzY1NCAxNC42OTUgMTkuOTM2QzEzLjI0MDQgMTguOTc3NCAxNC4xODM0IDE4LjQ1MDYgMTUuMDEyNCAxNy41ODk2QzE1LjIyOTMgMTcuMzY0MyAxOC45OTkgMTMuOTM1NSAxOS4wNzE5IDEzLjYyNDRDMTkuMDgxMSAxMy41ODU1IDE5LjA4OTUgMTMuNDQwNSAxOS4wMDM0IDEzLjM2MzlDMTguOTE3MiAxMy4yODc0IDE4Ljc5MDEgMTMuMzEzNiAxOC42OTgzIDEzLjMzNDRDMTguNTY4MyAxMy4zNjM5IDE2LjQ5NjggMTQuNzMzMSAxMi40ODM5IDE3LjQ0MTlDMTEuODk1OSAxNy44NDU3IDExLjM2MzMgMTguMDQyNCAxMC44ODYyIDE4LjAzMjFDMTAuMzYwMSAxOC4wMjA3IDkuMzQ4MjIgMTcuNzM0NiA4LjU5NTk4IDE3LjQ5MDFDNy42NzMzMyAxNy4xOTAyIDYuOTQwMDIgMTcuMDMxNiA3LjAwMzg4IDE2LjUyMjNDNy4wMzcxNCAxNi4yNTcgNy40MDI0OCAxNS45ODU2IDguMDk5OTIgMTUuNzA4M1oiLGZpbGw6IndoaXRlIn0pKSl9O3ZhciBFdT13KFQoKSwxKSxyQz0oe2JvZHk6ZSxvbkNsaWNrOnR9KT0+e2xldCByPSIuIjtyZXR1cm4gRXUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazooKT0+e3QoKSx3aW5kb3cub3BlbihcYGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIvc2hhcmVyLnBocD91PSR7ZX1cYCl9fSxFdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInN2ZyIse2NsYXNzTmFtZToia3oga3cga3ggaWsga3kgYmUiLHdpZHRoOiIyNHB4IixoZWlnaHQ6IjI0cHgiLHZpZXdCb3g6IjAgMCAzMiAzMiIsZmlsbDoibm9uZSJ9LEV1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0zMiAwSDBWMzJIMzJWMFoiLGZpbGw6IiMwMDAifSksRXUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTI2IDE2QzI2IDEwLjUgMjEuNSA2IDE2IDZDMTAuNSA2IDYgMTAuNSA2IDE2QzYgMjEgOS42MjUgMjUuMTI1IDE0LjM3NSAyNS44NzVWMTguODc1SDExLjg3NVYxNkgxNC4zNzVWMTMuNzVDMTQuMzc1IDExLjI1IDE1Ljg3NSA5Ljg3NSAxOC4xMjUgOS44NzVDMTkuMjUgOS44NzUgMjAuMzc1IDEwLjEyNSAyMC4zNzUgMTAuMTI1VjEyLjYyNUgxOS4xMjVDMTcuODc1IDEyLjYyNSAxNy41IDEzLjM3NSAxNy41IDE0LjEyNVYxNkgyMC4yNUwxOS43NSAxOC44NzVIMTcuMzc1VjI2QzIyLjM3NSAyNS4yNSAyNiAyMSAyNiAxNloiLGZpbGw6IndoaXRlIn0pLCJTaGFyZSBvbiBGYWNlYm9vayIpKX07dmFyIHk1PVl0KHsiMCUiOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTQwcHgpIix3aWR0aDoiMHB4In0sIjEwMCUiOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMHB4KSIsd2lkdGg6IjEwMHB4In19KSx2NT1ZdCh7IjAlIjp7b3BhY2l0eToiMCUifSwiNTAlIjp7b3BhY2l0eToiMCUifSwiMTAwJSI6e29wYWNpdHk6IjEwMCUifX0pLFB1PSgpPT53aW5kb3cubG9jYXRpb24uaHJlZixXZj0oe3R3aXR0ZXJCb2R5OmU9IiJ9KT0+e2xldFt0LHJdPSgwLEVyLnVzZVN0YXRlKSghMSksW24sb109KDAsRXIudXNlU3RhdGUpKHt4OjAseTowfSk7cmV0dXJuIEVyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtvbkNsaWNrOmk9PntvKHt4OmkuY2xpZW50WCx5OmkuY2xpZW50WX0pLHIoITApfSxzaXplOiJkb3QiLHN0eWxlOntwYWRkaW5nOjAsaGVpZ2h0OiIzMnB4Iix3aWR0aDoiMzJweCIscG9zaXRpb246InJlbGF0aXZlIn0sdmFyaWFudDoidHJhbnNwYXJlbnQifSxFci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWVMsbnVsbCksdD8oMCx2MC5jcmVhdGVQb3J0YWwpKEVyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJibyBhdiBnayBicyBiOSBidCBkcyIsb25DbGlja0NhcHR1cmU6aT0+e2kucHJldmVudERlZmF1bHQoKSxpLnN0b3BQcm9wYWdhdGlvbigpLHIoITEpfX0pLGRvY3VtZW50LmJvZHkpOm51bGwsdD8oMCx2MC5jcmVhdGVQb3J0YWwpKEVyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqdyBhdiBqeCBqeSBidSBqeiBiIHYgYWIgZ20gaDYgYXoiLG9uQ2xpY2s6aT0+e2kucHJldmVudERlZmF1bHQoKSxpLnN0b3BQcm9wYWdhdGlvbigpfSxzdHlsZTp7bGVmdDpuLngsdG9wOm4ueSxhbmltYXRpb246eTV9fSxFci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zcGFuLHtjbGFzc05hbWU6ImIgdiBhYiBheiBnbSBrMCIsc3R5bGU6e2FuaW1hdGlvbjp2NSwiJiBhIjp7d2lkdGg6IjIwcHggIWltcG9ydGFudCIsaGVpZ2h0OiIyMHB4ICFpbXBvcnRhbnQifX19LEVyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh0Qyx7dGV4dDplLGJvZHk6UHUoKSxvbkNsaWNrOigpPT57cighMSl9fSksRXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEpTLHt0ZXh0OmUsYm9keTpQdSgpLG9uQ2xpY2s6KCk9PntyKCExKX19KSxFci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZUMse3RleHQ6ZSxib2R5OlB1KCksb25DbGljazooKT0+e3IoITEpfX0pLEVyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChyQyx7Ym9keTpQdSgpLG9uQ2xpY2s6KCk9PntyKCExKX19KSxFci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWFMse3RleHQ6ZSxib2R5OlB1KCksb25DbGljazooKT0+cighMSl9KSkpLGRvY3VtZW50LmJvZHkpOm51bGwpfTt2YXIgaUM9dyhTaSgpLDEpO3ZhciBJbz13KFQoKSwxKTt2YXIgeDA9dyhUKCksMSk7dmFyIG5DPSh7Y29sb3I6ZT0iaW5oZXJpdCIsc3R5bGU6dH0pPT54MC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3dpZHRoOiI5NDUiLGhlaWdodDoiOTQ0Iix2aWV3Qm94OiIwIDAgOTQ1IDk0NCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixzdHlsZTp7Li4udH19LHgwLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik04NTYuNTY0IDI1NS45OThIODE4LjkxOUM4NDUuMjkyIDIyNi42OSA4NjEuNDIzIDE4Ny43MDggODYxLjQyMyAxNDQuOTZDODYxLjQyMyAxMzIuMjM4IDg1OS45OTMgMTE5Ljg1IDg1Ny4yODggMTA3Ljk0Nkw4NTcuNTAxIDEwOS4wNkM4NDMuNDgxIDU0LjQ4NDcgNzk5LjcwOSAxMi45NDk3IDc0NC45MDcgMi4zOTI2N0w3NDQgMi4yNDc2N0M3MzcuNDA0IDEuMzAyNjcgNzI5Ljc4NiAwLjc2MzY3MiA3MjIuMDQyIDAuNzYzNjcyQzY2Mi4wNTkgMC43NjM2NzIgNjA5LjYzNyAzMy4xMzE3IDU4MS4yOSA4MS4zNTM3TDU4MC44NzQgODIuMTIwN0w0NzIuNTY2IDIzNy45NDFMMzY0LjI4NCA4Mi4xMjI3QzMzNS40NTcgMzMuMTM5NyAyODIuOTk5IDAuNzgyNjczIDIyMi45ODQgMC43ODI2NzNDMjE1LjI4NiAwLjc4MjY3MyAyMDcuNzE0IDEuMzE1NjcgMjAwLjMwMSAyLjM0NTY3TDIwMS4xNTggMi4yNDU2N0MxNDUuNDM1IDEyLjkxNTcgMTAxLjY0OCA1NC40Njc3IDg3Ljg3NjQgMTA4LjA1OUw4Ny42NTg1IDEwOS4wNTlDODUuMTYzNSAxMTkuODU0IDgzLjczMzUgMTMyLjI0OSA4My43MzM1IDE0NC45NzlDODMuNzMzNSAxODcuNzE3IDk5Ljg1MzUgMjI2LjY4OSAxMjYuMzQ2IDI1Ni4xNDlMMTI2LjIxMiAyNTUuOTk3SDg4LjU2NDVDMzkuOTg0NSAyNTYuMDQ5IDAuNjE0NDUzIDI5NS40MTcgMC41NjQ0NTMgMzQzLjk5M1Y0MzkuOTk4QzAuNjk4NDUzIDQ3OS45MDYgMjcuNDI0NCA1MTMuNTM0IDYzLjk0NDUgNTI0LjA5OEw2NC41NjQ1IDUyNC4yNTNWODU1Ljk5OEM2NC42MjY0IDkwNC41NzUgMTAzLjk4OCA5NDMuOTM4IDE1Mi41NTggOTQzLjk5OEg3OTIuNTY0Qzg0MS4xMzYgOTQzLjkyNiA4ODAuNDkxIDkwNC41NzEgODgwLjU2NCA4NTYuMDA2VjUyNC4yNTNDOTE3LjY5NyA1MTMuNTI1IDk0NC40MTkgNDc5LjkwMyA5NDQuNTY0IDQ0MC4wMTZWMzQzLjk5OEM5NDQuNTAyIDI5NS40MjMgOTA1LjE0IDI1Ni4wNjEgODU2LjU3IDI1NS45OThIODU2LjU2NFpNNjIwLjI1MiAxMDkuNDk4QzY0MC41OTkgNzMuMDQ3NyA2NzguOTM0IDQ4LjgwMjcgNzIyLjkzMiA0OC44MDI3QzcyNy4zMTUgNDguODAyNyA3MzEuNjQyIDQ5LjA0MjcgNzM1LjkwMiA0OS41MTI3TDczNS4zNzggNDkuNDY1N0M3NzIuNTAzIDU2LjY0MjcgODAxLjY1NCA4NC4zNzI3IDgxMC43OTYgMTIwLjExMkw4MTAuOTQxIDEyMC43NzhDODExLjg3NCAxMjYuODE4IDgxMi40MDcgMTMzLjc4OCA4MTIuNDA3IDE0MC44OEM4MTIuNDA3IDE4OC42NDggNzg4LjIzNyAyMzAuNzcgNzUxLjQ2IDI1NS42ODZMNzUwLjk3MyAyNTUuOTk2SDUxOC40NzNMNjIwLjI1MiAxMDkuNDk4Wk0xMzQuMTg5IDEyMC43NzhDMTQzLjQ2NiA4NC4zNjc3IDE3Mi42MjIgNTYuNjM1NyAyMDkuMTQ2IDQ5LjU2NzdMMjA5Ljc1MSA0OS40Njc3QzIxMy40MTEgNDkuMDYzNyAyMTcuNjU4IDQ4LjgzMzcgMjIxLjk1OCA0OC44MzM3QzI2Ni4wMDggNDguODMzNyAzMDQuMzk4IDczLjA1NjcgMzI0LjU0IDEwOC45MUwzMjQuODQ1IDEwOS41TDQyNi42NTQgMjU1Ljk5OEgxOTQuMTU4QzE1Ni44OTQgMjMwLjc3MSAxMzIuNzI0IDE4OC42NDggMTMyLjcyNCAxNDAuODhDMTMyLjcyNCAxMzMuNzg3IDEzMy4yNTcgMTI2LjgyIDEzNC4yODQgMTIwLjAxM0wxMzQuMTkgMTIwLjc3OEgxMzQuMTg5Wk00OC41NjQ1IDQzOS45OThWMzQzLjk5OEM0OC41ODQ1IDMyMS45MTUgNjYuNDgxNSAzMDQuMDE4IDg4LjU2MjUgMzAzLjk5OEg0NDguNTY0VjQ3OS45OThIODguNTY0NUM2Ni40ODE1IDQ3OS45NzggNDguNTg0NSA0NjIuMDgxIDQ4LjU2NDUgNDQwVjQzOS45OThaTTExMi41NjQgODU1Ljk5OFY1MjcuOTk4SDQ0OC41NjRWODk1Ljk5OEgxNTIuNTY0QzEzMC40ODEgODk1Ljk3OCAxMTIuNTg0IDg3OC4wODEgMTEyLjU2NCA4NTZWODU1Ljk5OFpNODMyLjU2NCA4NTUuOTk4QzgzMi41NDQgODc4LjA4MSA4MTQuNjQ3IDg5NS45NzggNzkyLjU2NiA4OTUuOTk4SDQ5Ni41NjRWNTI3Ljk5OEg4MzIuNTY0Vjg1NS45OThaTTg5Ni41NjQgNDM5Ljk5OEM4OTYuNTQ0IDQ2Mi4wODEgODc4LjY0NyA0NzkuOTc4IDg1Ni41NjYgNDc5Ljk5OEg0OTYuNTY0VjMwMy45OThIODU2LjU2NEM4NzguNjQ3IDMwNC4wMTggODk2LjU0NCAzMjEuOTE1IDg5Ni41NjQgMzQzLjk5NlYzNDMuOTk4VjQzOS45OThaIixmaWxsOmU9PT0iaW5oZXJpdCI/ImN1cnJlbnRDb2xvciI6YihlKX0pKTt2YXIgVGk9KCk9PntsZXR7dXNlcklkOmV9PU50KCkse2RhdGE6dCxsb2FkaW5nOnJ9PXBlKCJ3ZWJzaXRlOm9yZ1VzZXIiLHtpZDplfSk7cmV0dXJuey4uLnQsdXNlcklkOmUsbG9hZGluZzpyfX07dmFyIG9DPSh7fSk9PntsZXQgZT1PZSgpLHQ9VSgpLHI9aigpLHt1c2VySWQ6bixtZW1iZXJzaGlwOm99PVRlKCkse29yZ2FuaXphdGlvbjppfT1UaSgpLGw9ci5wYXRoLnNlY3Rpb24scz1yLnBhdGguaWQsYT1hc3luYygpPT57aWYobz4xfHxpPy5pZCl7bGV0IHU9YXdhaXQgdC5jYWxsKCJnaWZ0Omdlbi10b2tlbiIse3VzZXJJZDpuLGFydGljbGVJZDpzLGFydGljbGVTZWN0aW9uOmx9KTtuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1LmNsaXBib2FyZCksZSh1LmNsaXBib2FyZCxJby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSW8uZGVmYXVsdC5GcmFnbWVudCxudWxsLHUubWVzc2FnZSkpO3JldHVybn1lKE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKSxJby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSW8uZGVmYXVsdC5GcmFnbWVudCxudWxsLCJHaWZ0aW5nIGFydGljbGVzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdXBwb3J0aW5nIG1lbWJlcnMsIiwiICIsSW8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazp1PT57dS5zdG9wUHJvcGFnYXRpb24oKSxuP3Iuc2V0UGF0aCh7c2VjdGlvbjoiYWNjb3VudCJ9KTpyLnNldFBhdGgoe3NlY3Rpb246InJlZ2lzdGVyIn0pfX0sImNsaWNrIGhlcmUgdG8gYmVjb21lIG9uZSBub3chIikpKX07cmV0dXJuIElvLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhNSJ9LElvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtvbkNsaWNrOigpPT5hKCksc2l6ZToiZG90IixzdHlsZTp7cGFkZGluZzowLGhlaWdodDoiMzJweCIsd2lkdGg6IjMycHgifSx2YXJpYW50OiJ0cmFuc3BhcmVudCJ9LElvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChuQyx7c3R5bGU6e21heFdpZHRoOjE3fX0pKSl9O3ZhciBNdT13KFQoKSwxKTt2YXIgeDU9KHtmb3JjZTplLGlkOnR9KT0+e2xldHtkYXRhOnJ9PXBlKG1uPyJhbmFseXRpY3M6ZGF0YSI6bnVsbCx0P3t0eXBlOiJ2aWV3IixpZDp0fTpudWxsKTtpZighZSYmIXI/LmFjdGl2ZT8udG90YWwpcmV0dXJuIE11LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiaiBrYyIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDgyNHB4KSI6e2hlaWdodDoxNixkaXNwbGF5OiJibG9jayJ9fX0pO2xldCBuPXI/LmFjdGl2ZS50b3RhbD8/KGU/MTowKTtyZXR1cm4gTXUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse3NpbmdsZUxpbmU6ITAsc3R5bGU6e2NvbG9yOmIoIm9yYW5nZSIpLHRleHRUcmFuc2Zvcm06ImluaGVyaXQifX0sbiwiIGNvLW9ic2VydmVyIixuIT09MT8icyI6IiIpfSxMcz0oe2lkOmUsZm9yY2U6dH0pPT5NdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVmUsbnVsbCxNdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeDUse2ZvcmNlOnQsaWQ6ZX0pKTt2YXIgdzA9dyhUKCksMSk7dmFyIEFzPSh7c3R5bGU6ZSxoaWdobGlnaHQ6dD0hMSxjaGlsZHJlbjpyPXQ/IlN0YWtlaG9sZGVyJ3MgaGlnaGxpZ2h0IjoiU3Rha2Vob2xkZXIiLGNvbG9yOm49Im9yYW5nZSJ9KT0+dzAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImliIGIgdiBhYiBpYyBpZCBpZSIsc3R5bGU6e21hcmdpblRvcDp0Pzg6LTQsYmFja2dyb3VuZENvbG9yOmIobiksLi4uZX19LHcwLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYLHtjb2xvcjoid2hpdGUifSxyKSk7dmFyIEhmPSh7YXJ0aWNsZTplLGNvbW1lbnRzQ291bnQ6dH0pPT57bGV0IHI9aigpO3JldHVybiBlP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7c3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOnttYXhXaWR0aDoiNjIwcHgiLG1hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblJpZ2h0OiJhdXRvIixwYWRkaW5nTGVmdDoiMTJweCIscGFkZGluZ1JpZ2h0OiIxMnB4In19fSxlLmhlYWRlckltYWdlQ2FwdGlvbiYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZmlnY2FwdGlvbix7Y2xhc3NOYW1lOiJiaiBpZyBpaCBlMCBpaSIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOntkaXNwbGF5OiJibG9jayJ9fX0sZS5oZWFkZXJJbWFnZUNhcHRpb24sIiAiLGUuaW1nPy5jcmVkaXQ/LnNvdXJjZT91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImEiLHt0YXJnZXQ6Il9ibGFuayIsaHJlZjplLmltZz8uY3JlZGl0Py5zb3VyY2VVcmx9LFxgKFBob3RvOiAke2UuaW1nPy5jcmVkaXQ/LnNvdXJjZX0pXGApOm51bGwpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJhMCIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21hcmdpblRvcDplLmFydGljbGVUeXBlPy5bMF0/LnRpdGxlPyIyNHB4IjoiMHB4IixtYXJnaW5Cb3R0b206OH19fSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZGUse2NvbG9yOiJvcmFuZ2UiLHN0eWxlOnt0ZXh0QWxpZ246ImNlbnRlciIsbWFyZ2luQm90dG9tOjEyLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3RleHRBbGlnbjoic3RhcnQiLG1hcmdpbkJvdHRvbToiMHB4In19fSxlLmFydGljbGVUeXBlPy5bMF0/LnRpdGxlKSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJjLHtzdHlsZTp7bWF4V2lkdGg6NjAwLG1hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblJpZ2h0OiJhdXRvIn19LGUuaGVhZGxpbmUpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChiZSx7c3R5bGU6e21heFdpZHRoOmUuYXJ0aWNsZUZvcm1hdD09PTI/NTQ4OjYyMCwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7bWF4V2lkdGg6IjYyMHB4IixtYXJnaW5Ub3A6IjI0cHgifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttYXJnaW5Ub3A6IjBweCJ9fX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2ZsZXhEaXJlY3Rpb246ImNvbHVtbi1yZXZlcnNlIn19fSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7Z2FwOjEyLHN0eWxlOnttYXJnaW5Ub3A6MzIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2p1c3RpZnlDb250ZW50OiJzdGFydCIsbWFyZ2luVG9wOiI0cHgifX19LGUubWVtYmVyc2hpcD09PTAmJnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbiBiIHYgYWIgaW8gZHIiLHN0eWxlOntib3JkZXI6XGAxcHggc29saWQgJHtiKCJvcmFuZ2UiKX1cYH19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYLHtzdHlsZTp7Y29sb3I6ImJsYWNrIn19LCJGcmVlIEFydGljbGUiKSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse3ZhcmlhbnQ6InRyYW5zcGFyZW50IixvbkNsaWNrOigpPT5yLnNldFF1ZXJ5KHtjb21tZW50czohMH0pfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoS1MsbnVsbCksIiAiLHQsIiBDb21tZW50Iix0PT09MT8iIjoicyIpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChXZix7dHdpdHRlckJvZHk6ZT8udHdlZXR9KSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQob0MsbnVsbCkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiIsc3R5bGU6e21hcmdpbjoiMzJweCBhdXRvIixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpIixib3JkZXJCb3R0b206IjFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpIixwYWRkaW5nOiIxMnB4IDBweCIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7Ym9yZGVyVG9wOiJub25lIixib3JkZXJCb3R0b206Im5vbmUiLG1hcmdpbjoiOHB4IGF1dG8ifX19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtnYXA6MTIsZ3JpZDohMCxqdXN0aWZ5OiJzdGFydCIsc3R5bGU6e21hcmdpbkJvdHRvbToiLTRweCIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7bWFyZ2luQm90dG9tOiI4cHgifX19LGUuc2VjdGlvbj8uZmluZChuPT5uLnRpdGxlPT09IlN0YWtlaG9sZGVycyIpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBcyx7c3R5bGU6e21hcmdpblJpZ2h0OjAsbWFyZ2luVG9wOi0zfX0pOm51bGwsZS5zZWN0aW9uPy5tYXAoKG4sbyk9Pm4udGl0bGU9PT0iU3Rha2Vob2xkZXJzIj9udWxsOnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7dmFyaWFudDoiZmF0IixzZWN0aW9uOiJzZWN0aW9uIixmaWVsZDpbbl0sa2V5Om99KSkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh3NSx7YXJ0aWNsZTplfSkpLGUuaGVhZGVySW1hZ2VDYXB0aW9uJiZlLmFydGljbGVGb3JtYXQ9PT0yJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5maWdjYXB0aW9uLHtjbGFzc05hbWU6ImVkIGlnIGloIGUwIGlwIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2Rpc3BsYXk6Im5vbmUifX19LGUuaGVhZGVySW1hZ2VDYXB0aW9uLCIgIixlLmltZz8uY3JlZGl0Py5zb3VyY2U/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7dGFyZ2V0OiJfYmxhbmsiLGhyZWY6ZS5pbWc/LmNyZWRpdD8uc291cmNlVXJsfSxcYChQaG90bzogJHtlLmltZz8uY3JlZGl0Py5zb3VyY2V9KVxgKTpudWxsKSkpKTpudWxsfSx3NT0oe2FydGljbGU6ZX0pPT51ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7c3R5bGU6e21hcmdpblRvcDoxNn19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1ZS5kZWZhdWx0LkZyYWdtZW50LG51bGwsdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJkeCBmbiJ9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh3cyx7YXJ0aWNsZTplfSkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToiZHggaXEgaXIifSxlLmF1dGhvcnx8ZS5jb250cmlidXRvcnNUZXh0PyIsICI6IiIsZS5sb2NhdGlvbj9lLmxvY2F0aW9uKyIsICI6IiIsdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFZlLG51bGwsKDAsaUMucHJldHR5RGF0ZSkoZS5wdWJsaXNoRGF0ZSwiZGF0ZS10aW1lLXRleHQiKSkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e21hcmdpblRvcDo4fX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExzLHtpZDplLmlkLGZvcmNlOiEwfSkpKSk7dmFyIFdlPXcoVCgpLDEpO3ZhciBuZT13KFQoKSwxKTt2YXIgVWY9dyhUKCksMSk7dmFyIERzPSh7c3R5bGU6ZX0pPT5VZi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3dpZHRoOiIxOSIsaGVpZ2h0OiIxOSIsdmlld0JveDoiMCAwIDE5IDE5IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLC4uLmV9LFVmLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik05LjE5IDYuNThIOS42MVYxNEg5LjE5VjYuNThaTTkuMTYyIDUuMzc2VjQuMzk2SDkuNjM4VjUuMzc2SDkuMTYyWiIsZmlsbDoiIzAwMDAyMCJ9KSxVZi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImNpcmNsZSIse2N4OiI5LjUiLGN5OiI5LjUiLHI6IjkiLHN0cm9rZToiYmxhY2siLHN0cm9rZU9wYWNpdHk6IjAuMyJ9KSk7dmFyIFJlPXcoVCgpLDEpO3ZhciB1Qz13KFNpKCksMSk7dmFyIFMwPXcoVCgpLDEpO3ZhciBsQz0oe3N0eWxlOmV9KT0+UzAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt3aWR0aDoiMTEiLGhlaWdodDoiMTEiLHZpZXdCb3g6IjAgMCAxMSAxMSIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwuLi5lfSxTMC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNNS41Nzk5OSAyVjMuODI2MDlDMS42ODM5NCA0LjM5NDIgMC45MDg3MDkgNy4xNzM5MSAxLjAwODEgOC40OTI3NUMzLjA3NTM5IDcuMDMxODggNC45MTc0IDcuMDA0ODMgNS41Nzk5OSA3LjE3MzkxVjlMOS41NTU1NiA1LjY1MjE3TDUuNTc5OTkgMloiLHN0cm9rZToiYmxhY2siLHN0cm9rZU9wYWNpdHk6IjAuMyJ9KSk7dmFyIEMwPXcoVCgpLDEpO3ZhciBzQz0oe3N0eWxlOmV9KT0+QzAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt3aWR0aDoiMTAiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA1MzQgODAwIixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHN0eWxlOnsuLi5lfX0sQzAuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTUxMy43ODkgNjMuMzUzNkM1MTIuMTM5IDY0LjA3NDIgMzQ2LjA4NCAxMzUuNjg1IDI0MS41NDggNDUuOTk0MkMxMjEuMzcyIC01Ny4xMjc4IDYuMzEwNzUgNDUuMjE5NCA1LjE4NzI5IDQ2LjI3MzFMMC42OTM0NDkgNTAuMzYwMkwwIDc5OS45NTZMMjcuNTM2NCA3OTkuOTk4TDI3Ljk4MTkgMzI1LjA2OUM0Ny45NjAxIDMwOS4yMjEgMTMzLjAwNiAyNTEuMTMgMjIzLjYxMSAzMjguODk3QzM0MS4yMSA0MjkuODAzIDUxNy40MTEgMzUzLjgzOCA1MjQuODcyIDM1MC41NTJMNTMzLjEzNiAzNDYuOTE5VjU0LjgyNjlMNTEzLjc4OSA2My4zNTM2Wk01MDUuNTUzIDMyOC42MDZDNDcwLjY5OCAzNDEuNzM1IDMzMi43NjEgMzg2LjIyOCAyNDEuNTQ4IDMwNy45ODlDMjAxLjM1NSAyNzMuNDk1IDE2MS43NDMgMjYyLjAwMSAxMjYuNzY1IDI2Mi4wMDFDODQuODY3NyAyNjIuMDAxIDQ5LjU4MzMgMjc4LjUyNyAyOC4wMjA2IDI5MS44MzhMMjguMjAyNyA2Mi44ODFDNDguNTk1NCA0Ni43MzAzIDEzMy4zNTEgLTEwLjU3MzkgMjIzLjYwNyA2Ni44ODY3QzMxOS44OTUgMTQ5LjQ5MiA0NTUuNTE2IDExMy41NDEgNTA1LjU1NyA5Ni4wMDM2VjMyOC42MDZINTA1LjU1M1oiLGZpbGw6ImJsYWNrIn0pKTt2YXIgYUM9Imh0dHBzOi8vZmlsZXMtcHJvZHVjdGlvbi1zYXVseC1ldS1vYnNlcnZlci1wcm9kdWN0aW9uLWVuLWNpLWh5cC14eDAuYmFzZWQuZGV2L3VwQXJyb3ctTTY3VFgzVFIucG5nIjt2YXIgTG89KHtwdWJsaXNoZWRBdDplLGF1dGhvcjp0LGNvbW1lbnQ6cixyZXBvcnRlZDpuLHJlY29tbWVuZGVkOm8scmVwbGllczppLHN0eWxlOmwscGFyZW50OnMsc2V0UmVwbHlUbzphLGlkOnUsdGFyZ2V0OnAsdXNlcjpjfSk9PntsZXRbZixkXT0oMCxSZS51c2VTdGF0ZSkoMSksbT1VKCk7cmV0dXJuIFJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJrZyBraCBraSBvIixzdHlsZTp7Li4ubH19LFJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtqdXN0aWZ5OiJzdGFydCIsYWxpZ246ImVuZCIsZ2FwOjE2LHN0eWxlOnttYXJnaW5Cb3R0b206MTYscG9zaXRpb246InJlbGF0aXZlIn19LFJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYLHtzdHlsZTp7dGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixmb250U2l6ZToiMTJweCJ9fSwoMCx1Qy5wcmV0dHlEYXRlKShlLCJkYXRlLXRpbWUtaHVtYW4iKSksUmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse3N0eWxlOntmb250V2VpZ2h0OjUwMCxmb250U2l6ZToiMTNweCIsY29sb3I6ImJsYWNrIn19LCJieSAiLHQpLHMmJlJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYLG51bGwsImluIHJlcGx5IHRvICIscyksUmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImV2IGtqIGtrIGIzIGtsIixzdHlsZTp7bGVmdDotMjZ9fSkpLFJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpyfSxzdHlsZTp7IiYgPiAqIjp7Zm9udEZhbWlseToiZnJlaWdodC10ZXh0LXBybyIsZm9udFNpemU6IjE2cHgiLGZvbnRTdHlsZToibm9ybWFsIixmb250V2VpZ2h0OiI0MDAiLGxpbmVIZWlnaHQ6IjI0cHgiLHRleHRVbmRlcmxpbmVPZmZzZXQ6IjAuMTJyZW0iLG1hcmdpbkJvdHRvbToiMTZweCIsIiYgaSI6e2ZvbnRTdHlsZToiaXRhbGljIn0sIiYgYiI6e2xldHRlclNwYWNpbmc6IjAuMDI1cmVtIn19fX0pLFJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtnYXA6MjR9LFJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCx7b25DbGljazooKT0+e2Eoe2lkOnUsbmFtZTp0fSl9LHN0eWxlOntwb2ludGVyRXZlbnRzOmM/LnVzZXJJZD8iYXV0byI6Im5vbmUiLGRpc3BsYXk6ImZsZXgiLGdhcDo2LGFsaWduSXRlbXM6ImNlbnRlciIsdXNlclNlbGVjdDoibm9uZSIsY3Vyc29yOiJwb2ludGVyIiwiJjpob3ZlciI6e2NvbG9yOmIoIm9yYW5nZSIpLCImIHN2ZyBwYXRoIjp7c3Ryb2tlOmIoIm9yYW5nZSIpfX19fSxSZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobEMsbnVsbCksIiByZXBseSIsIiAiLGkubGVuZ3RoPjA/IigiK2kubGVuZ3RoKyIpIjoiIiksUmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGd0LHtzdHlsZTp7cG9pbnRlckV2ZW50czpjPy51c2VySWQ/ImF1dG8iOiJub25lIixkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGN1cnNvcjoicG9pbnRlciIsdXNlclNlbGVjdDoibm9uZSIsZ2FwOjQsIiY6aG92ZXIiOntjb2xvcjpiKCJvcmFuZ2UiKX19LG9uQ2xpY2s6YXN5bmMoKT0+e0pTT04uc3RyaW5naWZ5KG8pLmluY2x1ZGVzKGMudXNlcklkKT9hd2FpdCBtLmNhbGwoImNvbW1lbnRzOnVubGlrZSIse3RhcmdldDpwLGNvbW1lbnQ6dSx1c2VyOntpZDpjLnVzZXJJZCxuYW1lOmMuZmlyc3ROYW1lfX0pOmF3YWl0IG0uY2FsbCgiY29tbWVudHM6bGlrZSIse3RhcmdldDpwLGNvbW1lbnQ6dSx1c2VyOntpZDpjLnVzZXJJZCxuYW1lOmMuZmlyc3ROYW1lfX0pfX0sUmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJpbWciLHtzcmM6YUN9KSwicmVjb21tZW5kIiwiICIsbyYmbz8ubGVuZ3RoPjAmJlxgKCR7by5sZW5ndGh9KVxgKSxSZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZ3Qse3N0eWxlOntwb2ludGVyRXZlbnRzOmM/LnVzZXJJZD8iYXV0byI6Im5vbmUiLG1hcmdpbkxlZnQ6ImF1dG8iLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsdXNlclNlbGVjdDoibm9uZSIsZ2FwOjMsY3Vyc29yOiJwb2ludGVyIixjb2xvcjpKU09OLnN0cmluZ2lmeShuKS5pbmNsdWRlcyhjPy51c2VySWQpP2IoIm9yYW5nZSIpOiJyZ2JhKDAsIDAsIDAsIDAuNSkiLCImOmhvdmVyIjp7Y29sb3I6Yigib3JhbmdlIil9fSxvbkNsaWNrOmFzeW5jKCk9PntKU09OLnN0cmluZ2lmeShuKS5pbmNsdWRlcyhjLnVzZXJJZCk/YXdhaXQgbS5jYWxsKCJjb21tZW50czp1bnJlcG9ydCIse3RhcmdldDpwLGNvbW1lbnQ6dSx1c2VyOntpZDpjLnVzZXJJZCxuYW1lOmMuZmlyc3ROYW1lfX0pOmF3YWl0IG0uY2FsbCgiY29tbWVudHM6cmVwb3J0Iix7dGFyZ2V0OnAsY29tbWVudDp1LHVzZXI6e2lkOmMudXNlcklkLG5hbWU6Yy5maXJzdE5hbWV9fSl9fSxSZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoc0Mse3N0eWxlOnt9fSksIiByZXBvcnQiLEpTT04uc3RyaW5naWZ5KG4pLmluY2x1ZGVzKGM/LnVzZXJJZCk/ImVkIjoiICIpKSxpPy5tYXAoKGgsUyk9PlM8PWYmJlJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChSZS5kZWZhdWx0LkZyYWdtZW50LHtrZXk6U30sUmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExvLHtrZXk6UyxwdWJsaXNoZWRBdDpoLnRzLGF1dGhvcjpoLnVzZXIubmFtZSxpZDpoLmlkLGNvbW1lbnQ6aC5tc2cscmVwbGllczpoLnJlcGxpZXMscmVwb3J0ZWQ6aC5yZXBvcnRzLHJlY29tbWVuZGVkOmgubGlrZXMsc2V0UmVwbHlUbzphLHBhcmVudDp0LHRhcmdldDpwLHVzZXI6YyxzdHlsZTp7bWFyZ2luTGVmdDoxOCxwYWRkaW5nQm90dG9tOjAsbWFyZ2luQm90dG9tOjI2LGJvcmRlckJvdHRvbToiMHB4IHNvbGlkIHRyYW5zcGFyZW50Iixib3JkZXJMZWZ0OiIxcHggc29saWQgcmdiYSgwLDAsMCwwLjEyKSJ9fSksaS5sZW5ndGg+ZiYmUz09PWYmJlJlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtqdXN0aWZ5OiJlbmQiLHN0eWxlOnttYXJnaW5Ub3A6MzJ9LG9uQ2xpY2s6KCk9PmQoZis4KX0sUmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGd0LG51bGwsIlNlZSBhbGwgcmVwbGllcyIpKSkpKX07dmFyIHNvPXcoVCgpLDEpO3ZhciBNaz13KHlDKCksMSksSWs9dyhaVCgpLDEpLExrPXcoZWsoKSwxKSxBaz13KG9rKCksMSksRGs9dyhwaygpLDEpLE9rPXcoZ2soKSwxKTt2YXIgR2U9dyhUKCksMSksX2s9dyhBbygpLDEpLEh0PXcoVnIoKSwxKSxqeT13KHdrKCksMSk7dmFyIEJ5PXcodmwoKSwxKTtmdW5jdGlvbiBTayhlKXtsZXQgdD1lLmFuY2hvcixyPWUuZm9jdXMsbj1lLmFuY2hvci5nZXROb2RlKCksbz1lLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gbj09PW8/bjplLmlzQmFja3dhcmQoKT8oMCxCeS4kaXNBdE5vZGVFbmQpKHIpP246bzooMCxCeS4kaXNBdE5vZGVFbmQpKHQpP246b312YXIga2s9dyhGbygpLDEpLFBkPXcodmwoKSwxKTt2YXIgRnk9dyhUKCksMSk7dmFyIENrPSgpPT5GeS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3dpZHRoOiIyMCIsaGVpZ2h0OiIyMCIsdmlld0JveDoiMCAwIDIwIDIwIixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifSxGeS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTEuNDA2MiAxNS42MjVINS42MjVWNC4zNzVIMTAuOTM3NUMxMS41NjM5IDQuMzc1MDQgMTIuMTc3MSA0LjU1NDM1IDEyLjcwNDggNC44OTE3NEMxMy4yMzI1IDUuMjI5MTQgMTMuNjUyNiA1LjcxMDUyIDEzLjkxNTUgNi4yNzkwM0MxNC4xNzg0IDYuODQ3NTQgMTQuMjczMSA3LjQ3OTQyIDE0LjE4ODQgOC4xMDAwMUMxNC4xMDM3IDguNzIwNjEgMTMuODQzMSA5LjMwMzk5IDEzLjQzNzUgOS43ODEyNUMxMy45NjczIDEwLjIwNSAxNC4zNTI4IDEwLjc4MjUgMTQuNTQwOCAxMS40MzQ0QzE0LjcyODkgMTIuMDg2MiAxNC43MTAyIDEyLjc4MDMgMTQuNDg3NSAxMy40MjExQzE0LjI2NDcgMTQuMDYxOSAxMy44NDg4IDE0LjYxNzkgMTMuMjk3IDE1LjAxMjZDMTIuNzQ1MiAxNS40MDczIDEyLjA4NDcgMTUuNjIxMyAxMS40MDYyIDE1LjYyNVpNNy41IDEzLjc1SDExLjM5MzdDMTEuNTc4NCAxMy43NSAxMS43NjEzIDEzLjcxMzYgMTEuOTMxOSAxMy42NDNDMTIuMTAyNSAxMy41NzIzIDEyLjI1NzUgMTMuNDY4NyAxMi4zODgxIDEzLjMzODFDMTIuNTE4NyAxMy4yMDc1IDEyLjYyMjMgMTMuMDUyNSAxMi42OTMgMTIuODgxOUMxMi43NjM2IDEyLjcxMTMgMTIuOCAxMi41Mjg0IDEyLjggMTIuMzQzOEMxMi44IDEyLjE1OTEgMTIuNzYzNiAxMS45NzYyIDEyLjY5MyAxMS44MDU2QzEyLjYyMjMgMTEuNjM1IDEyLjUxODcgMTEuNDggMTIuMzg4MSAxMS4zNDk0QzEyLjI1NzUgMTEuMjE4OCAxMi4xMDI1IDExLjExNTIgMTEuOTMxOSAxMS4wNDQ1QzExLjc2MTMgMTAuOTczOSAxMS41Nzg0IDEwLjkzNzUgMTEuMzkzNyAxMC45Mzc1SDcuNVYxMy43NVpNNy41IDkuMDYyNUgxMC45Mzc1QzExLjEyMjIgOS4wNjI1IDExLjMwNSA5LjAyNjEzIDExLjQ3NTYgOC45NTU0NkMxMS42NDYzIDguODg0NzggMTEuODAxMyA4Ljc4MTIgMTEuOTMxOSA4LjY1MDYyQzEyLjA2MjUgOC41MjAwNCAxMi4xNjYgOC4zNjUwMSAxMi4yMzY3IDguMTk0NEMxMi4zMDc0IDguMDIzNzggMTIuMzQzOCA3Ljg0MDkyIDEyLjM0MzggNy42NTYyNUMxMi4zNDM4IDcuNDcxNTggMTIuMzA3NCA3LjI4ODcyIDEyLjIzNjcgNy4xMTgxQzEyLjE2NiA2Ljk0NzQ5IDEyLjA2MjUgNi43OTI0NiAxMS45MzE5IDYuNjYxODhDMTEuODAxMyA2LjUzMTMgMTEuNjQ2MyA2LjQyNzcyIDExLjQ3NTYgNi4zNTcwNEMxMS4zMDUgNi4yODYzNyAxMS4xMjIyIDYuMjUgMTAuOTM3NSA2LjI1SDcuNVY5LjA2MjVaIixmaWxsOiIjMUIyNDJDIn0pKTt2YXIgJHk9dyhUKCksMSk7dmFyIFRrPSgpPT4keS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3dpZHRoOiIyMCIsaGVpZ2h0OiIyMCIsdmlld0JveDoiMCAwIDIwIDIwIixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifSwkeS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTUuNjI1IDUuNjI1VjQuMzc1SDcuNVY1LjYyNUgxMC43MTI1TDcuOTgxMjUgMTQuMzc1SDQuMzc1VjE1LjYyNUgxMi41VjE0LjM3NUg5LjI4NzVMMTIuMDE4NyA1LjYyNUgxNS42MjVaIixmaWxsOiIjMUIyNDJDIn0pKTtmdW5jdGlvbiBOaygpe2xldFtlXT0oMCxfay51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KSgpLFt0LHJdPSgwLEdlLnVzZVN0YXRlKSgiYm9keSIpLFtuLG9dPSgwLEdlLnVzZVN0YXRlKSghMSksW2ksbF09KDAsR2UudXNlU3RhdGUpKCExKSxbcyxhXT0oMCxHZS51c2VTdGF0ZSkoITEpLFt1LHBdPSgwLEdlLnVzZVN0YXRlKSghMSksW2MsZl09KDAsR2UudXNlU3RhdGUpKCExKSxbZCxtXT0oMCxHZS51c2VTdGF0ZSkoImxlZnQiKSxbaCxTXT0oMCxHZS51c2VTdGF0ZSkoKSxbeSx2XT0oMCxHZS51c2VTdGF0ZSkoITEpLFtnLENdPSgwLEdlLnVzZVN0YXRlKSghMSksW2ssRF09KDAsR2UudXNlU3RhdGUpKCk7KDAsR2UudXNlRWZmZWN0KSgoKT0+e2UucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoe2VkaXRvclN0YXRlOk59KT0+e2UucmVnaXN0ZXJDb21tYW5kKEh0LkNBTl9VTkRPX0NPTU1BTkQsTD0+KHYoTCksITEpLDEpLGUucmVnaXN0ZXJDb21tYW5kKEh0LkNBTl9SRURPX0NPTU1BTkQsTD0+KEMoTCksITEpLDEpLE4ucmVhZCgoKT0+e2xldCBMPSgwLEh0LiRnZXRTZWxlY3Rpb24pKCk7aWYoISgwLEh0LiRpc1JhbmdlU2VsZWN0aW9uKShMKSlyZXR1cm47byhMLmhhc0Zvcm1hdCgiYm9sZCIpKSxsKEwuaGFzRm9ybWF0KCJpdGFsaWMiKSkscChMLmhhc0Zvcm1hdCgic3RyaWtldGhyb3VnaCIpKSxhKEwuaGFzRm9ybWF0KCJ1bmRlcmxpbmUiKSksKDAsUGQuJGdldFNlbGVjdGlvblN0eWxlVmFsdWVGb3JQcm9wZXJ0eSkoTCwiY29sb3IiLCJibGFjayIpO2xldCBXPVNrKEwpLFk9Vy5nZXRQYXJlbnQoKTtmKCgwLGp5LiRpc0xpbmtOb2RlKShZKXx8KDAsankuJGlzTGlua05vZGUpKFcpKTtsZXQgeWU9TC5hbmNob3IuZ2V0Tm9kZSgpLFNyPXllLmdldEtleSgpPT09InJvb3QiP3llOigwLGtrLiRmaW5kTWF0Y2hpbmdQYXJlbnQpKHllLF90PT57bGV0IGN0PV90LmdldFBhcmVudCgpO3JldHVybiBjdCE9PW51bGwmJigwLEh0LiRpc1Jvb3RPclNoYWRvd1Jvb3QpKGN0KX0pO20oU3IuZ2V0Rm9ybWF0VHlwZSgpKSxyKCJib2R5Iil9KX0pfSxbZV0pO2xldCBPPSgwLEdlLnVzZUNhbGxiYWNrKSgoTixMLFcpPT57ZS51cGRhdGUoKCk9PntMIT09bnVsbCYmKDAsUGQuJHBhdGNoU3R5bGVUZXh0KShMLE4pfSxXP3t0YWc6Imhpc3RvcmljIn06e30pfSxbZV0pO3JldHVybiBHZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYjkgYnMgYiBsMCBhMCBlNCJ9LEdlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJsMSBsMiBhYiBiIHYgbyBsMyBsNCIsb25DbGljazooKT0+e2UudXBkYXRlKCgpPT57bGV0IE49KDAsSHQuJGdldFNlbGVjdGlvbikoKTsoMCxIdC4kaXNSYW5nZVNlbGVjdGlvbikoTikmJmUuZGlzcGF0Y2hDb21tYW5kKEh0LkZPUk1BVF9URVhUX0NPTU1BTkQsImJvbGQiKX0pfX0sR2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KENrLG51bGwpKSxHZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToibDEgbDIgYWIgYiB2IG8gbDQiLG9uQ2xpY2s6KCk9PntlLnVwZGF0ZSgoKT0+e2xldCBOPSgwLEh0LiRnZXRTZWxlY3Rpb24pKCk7KDAsSHQuJGlzUmFuZ2VTZWxlY3Rpb24pKE4pJiZlLmRpc3BhdGNoQ29tbWFuZChIdC5GT1JNQVRfVEVYVF9DT01NQU5ELCJpdGFsaWMiKX0pfX0sR2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFRrLG51bGwpKSl9dmFyIGxjPXcoVCgpLDEpLGJrPXcoQW8oKSwxKSxNZD13KGt5KCksMSksUnI9dyhWcigpLDEpLEVrPXcoRm8oKSwxKTtmdW5jdGlvbiBQayh7dmFsdWU6ZSxvbkNoYW5nZTp0fSl7bGV0W3JdPSgwLGJrLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQpKCksbj1sYy51c2VSZWYoITEpO3JldHVybiBsYy51c2VFZmZlY3QoKCk9PntuLmN1cnJlbnR8fHIudXBkYXRlKCgpPT57bGV0IGk9bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L2h0bWwiKSxsPSgwLE1kLiRnZW5lcmF0ZU5vZGVzRnJvbURPTSkocixpKSxzPSgwLFJyLiRnZXRSb290KSgpO3MuY2xlYXIoKSxlP3MuYXBwZW5kKC4uLmwpOnMuYXBwZW5kKCgwLFJyLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKSgpKSwoMCxSci4kc2V0U2VsZWN0aW9uKShudWxsKX0pfSxbZSxyXSksbGMudXNlRWZmZWN0KCgpPT4oMCxFay5tZXJnZVJlZ2lzdGVyKShyLnJlZ2lzdGVyQ29tbWFuZChSci5CTFVSX0NPTU1BTkQsKCk9PihuLmN1cnJlbnQ9ITEsITEpLFJyLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxyLnJlZ2lzdGVyQ29tbWFuZChSci5GT0NVU19DT01NQU5ELCgpPT4obi5jdXJyZW50PSEwLCExKSxSci5DT01NQU5EX1BSSU9SSVRZX0xPVyksci5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCh7ZWRpdG9yU3RhdGU6byxkaXJ0eUVsZW1lbnRzOmksZGlydHlMZWF2ZXM6bCxwcmV2RWRpdG9yU3RhdGU6cyx0YWdzOmF9KT0+e2kuc2l6ZT09PTAmJmwuc2l6ZT09PTB8fGEuaGFzKCJoaXN0b3J5LW1lcmdlIil8fHMuaXNFbXB0eSgpfHwhbi5jdXJyZW50fHxvLnJlYWQoKCk9Pnt0Py4oKDAsTWQuJGdlbmVyYXRlSHRtbEZyb21Ob2RlcykocixudWxsKSl9KX0pKSxbXSksbnVsbH1mdW5jdGlvbiB2OChlKXtjb25zb2xlLmVycm9yKGUpfXZhciBJZD0oe3ZhbHVlOmUsb25DaGFuZ2U6dCxhdXRvRm9jdXM6cn0pPT5zby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSWsuTGV4aWNhbENvbXBvc2VyLHtpbml0aWFsQ29uZmlnOntuYW1lc3BhY2U6Ik15RWRpdG9yIixvbkVycm9yOnY4LHRoZW1lOntwYXJhZ3JhcGg6InJ0ZS1wIix0ZXh0Ontib2xkOiJydGUtYm9sZCIsaXRhbGljOiJydGUtaXRhbGljIixzdHJpa2V0aHJvdWdoOiJydGUtc3RyaWtldGhyb3VnaCIsdW5kZXJsaW5lOiJydGUtdW5kZXJsaW5lIn19fX0sc28uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImttIGMga24gaTAgYWQgZGQgYTUga28ga3Aga3EiLHN0eWxlOnsiJiA+ICosIHAiOntmb250RmFtaWx5OiJHZWlzdFJlZ3VsYXIgIWltcG9ydGFudCIsZm9udFNpemU6IjE2cHggIWltcG9ydGFudCIsbGluZUhlaWdodDoiMThweCJ9LCImIC5ydGUiOntoZWlnaHQ6IjE1NnB4IixwYWRkaW5nOiIxNnB4Iix3aWR0aDoiMTAwJSJ9LCImIC5ydGUtYm9sZCI6e2ZvbnRXZWlnaHQ6ImJvbGQifSwiJiAucnRlLWl0YWxpYyI6e2ZvbnRTdHlsZToiaXRhbGljIn19fSxzby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTGsuUmljaFRleHRQbHVnaW4se2NvbnRlbnRFZGl0YWJsZTpzby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQWsuQ29udGVudEVkaXRhYmxlLHtjbGFzc05hbWU6InJ0ZSJ9KSxwbGFjZWhvbGRlcjpzby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToia3IgYjMga3MgaDgifSwiUG9zdCBhIGNvbW1lbnQuLi4iKSxFcnJvckJvdW5kYXJ5Ok9rLmRlZmF1bHR9KSxzby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoRGsuSGlzdG9yeVBsdWdpbixudWxsKSxyP3NvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChNay5BdXRvRm9jdXNQbHVnaW4sbnVsbCk6bnVsbCxzby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUGsse3ZhbHVlOmUsb25DaGFuZ2U6dH0pKSxzby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTmssbnVsbCkpO3ZhciBvcj13KFQoKSwxKTt2YXIgc2M9dyhUKCksMSk7dmFyIExkPSh7c3R5bGU6ZSxjb2xvcjp0PSJpbmhlcml0In0pPT5zYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5zdmcse3dpZHRoOiIxMSIsaGVpZ2h0OiIxMSIsdmlld0JveDoiMCAwIDExIDExIixmaWxsOiJub25lIixzdHlsZTplfSxzYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImxpbmUiLHt5MToiMS41Iix4MjoiMTEiLHkyOiIxLjUiLHN0cm9rZTp0PT09ImluaGVyaXQiPyJjdXJyZW50Q29sb3IiOmIodCksc3Ryb2tlV2lkdGg6IjIifSksc2MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjIiLHkxOiI1LjUiLHgyOiI5Iix5MjoiNS41IixzdHJva2U6dD09PSJpbmhlcml0Ij8iY3VycmVudENvbG9yIjpiKHQpLHN0cm9rZVdpZHRoOiIyIn0pLHNjLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiI0Iix5MToiOS41Iix4MjoiNyIseTI6IjkuNSIsc3Ryb2tlOnQ9PT0iaW5oZXJpdCI/ImN1cnJlbnRDb2xvciI6Yih0KSxzdHJva2VXaWR0aDoiMiJ9KSk7dmFyIHg4PSh7Y2hpbGRyZW46ZSxvbkNsaWNrOnQsdmFsdWU6cixpdGVtVmFsdWU6bn0pPT5vci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiZTIgYyBrdCBjeiBkaCBjeSBkOCBrdSBiIHYga3YiLG9uQ2xpY2s6dCxzdHlsZTp7IiY6aG92ZXIiOntiYWNrZ3JvdW5kQ29sb3I6IiNGMkYyRjIifX19LG9yLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2hlaWdodDoxNix3aWR0aDoxNixib3JkZXI6IjFweCBzb2xpZCBibGFjayIsYm9yZGVyUmFkaXVzOiIycHgiLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9fSxvci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOntiYWNrZ3JvdW5kQ29sb3I6ci5pbmNsdWRlcyhuKT9iKCJvcmFuZ2UiKTp2b2lkIDAsaGVpZ2h0OjEwLHdpZHRoOjEwfX0pKSxlKSxBZD0oe29wdGlvbnM6ZSx2YWx1ZTp0LG9uQ2hhbmdlOnIsbGFiZWw6bixzdHlsZTpvfSk9PntsZXQgaT0oMCxvci51c2VSZWYpKCksW2wsc109KDAsb3IudXNlU3RhdGUpKCExKTtyZXR1cm4gb3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImE1IixzdHlsZTp7Li4ub319LG9yLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iix7cmVmOmksbXVsdGlwbGU6ITAsc3R5bGU6e2Rpc3BsYXk6Im5vbmUifX0pLG9yLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtvbkNsaWNrOigpPT5zKCEwKSxjb2xvcjoiYmxhY2siLHZhcmlhbnQ6InRyYW5zcGFyZW50IixzdWZmaXg6b3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExkLG51bGwpfSxuKSxsP29yLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7b25DbGlja0NhcHR1cmU6YT0+e2EucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpLHMoITEpfSxzdHlsZTp7ekluZGV4OjIscG9zaXRpb246ImZpeGVkIixpbnNldDowLGN1cnNvcjoicG9pbnRlciJ9fSk6bnVsbCxsP29yLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e3pJbmRleDoxMDAsdG9wOjUwLGxlZnQ6MCxyaWdodDowLHBvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6IjQwMHB4IixkaXNwbGF5OiJmbGV4IixmaWx0ZXI6ImRyb3Atc2hhZG93KDBweCA0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSkpIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLG1heEhlaWdodDoiNDAwcHgiLHBhZGRpbmc6IjI0cHggMHB4Iixib3JkZXJSYWRpdXM6IjRweCIsZ2FwOjEyLGN1cnNvcjoicG9pbnRlciIsYmFja2dyb3VuZENvbG9yOiJ3aGl0ZSIsb3ZlcmZsb3c6ImF1dG8ifX0sb3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFluLG51bGwsZS5tYXAoKGEsdSk9Pm9yLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4OCx7dmFsdWU6dCxpdGVtVmFsdWU6YS52YWx1ZSxrZXk6dSxvbkNsaWNrOigpPT57cihhLnZhbHVlKX19LGEubGFiZWwpKSkpOm51bGwpfTt2YXIgems9KHthcnRpY2xlSWQ6ZSxjb21tZW50c0NvdW50OnR9KT0+e2xldCByPVUoKSx7ZGF0YTpufT1wZSgiY29tbWVudHM6ZGF0YSIse3RhcmdldDplfSksbz1qKCksaT1UZSgpLGw9KDAsbmUudXNlUmVmKSgpLFtzLGFdPSgwLG5lLnVzZVN0YXRlKSgibmV3ZXN0IiksW3UscF09KDAsbmUudXNlU3RhdGUpKCIiKSxbYyxmXT0oMCxuZS51c2VTdGF0ZSkoe2lkOnZvaWQgMCxuYW1lOnZvaWQgMH0pLFtkLG1dPSgwLG5lLnVzZVN0YXRlKSgiIiksW2gsU109KDAsbmUudXNlU3RhdGUpKCIiKSxbeSx2XT0oMCxuZS51c2VTdGF0ZSkoITEpO3JldHVybigwLG5lLnVzZUVmZmVjdCkoKCk9PntpZihjKXtsZXQgZz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucnRlIik7ZyYmKGcuZm9jdXMoKSxsLmN1cnJlbnQuc2Nyb2xsSW50b1ZpZXcoKSl9fSxbY10pLCgwLG5lLnVzZUVmZmVjdCkoKCk9PnsoZHx8aCkmJnNldFRpbWVvdXQoKCk9PnttKCIiKSxTKCIiKX0sM2UzKX0sW2QsaF0pLG4/bmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5lLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCx5P25lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLbix7c2V0T3BlbjooKT0+dighMSksc3R5bGU6e3pJbmRleDoyfX0pOm51bGwsbmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImsxIGsyIGdhIn0sbmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtzdHlsZTp7bWFyZ2luVG9wOjQ1LG1hcmdpbkJvdHRvbToxMn19LCJDb21tZW50cyIpLG5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCxudWxsLCJMZXQncyBkaXNjdXNzLiBXZSdkIGxvdmUgdG8gaGVhciB5b3VyIHRob3VnaHRzLCBxdWVzdGlvbnMgb3IgZmVlZGJhY2sgYmVsb3cuIiksbmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse3JlZjpsLHN0eWxlOntiYWNrZ3JvdW5kOiIjZjlmOWY5IixwYWRkaW5nOiIxMHB4IDE2cHgiLG1hcmdpblRvcDoxMn19LG5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCx7c3R5bGU6eyImOmhvdmVyIjp7Y29sb3I6InZhcigtLWJsYWNrKSJ9fSxvbkNsaWNrOigpPT53aW5kb3cub3BlbigiL3N0YXRpYy80MDRhNmM4YTZhIiwiX2JsYW5rIil9LCJSZWFkIG1vcmUgYWJvdXQgdGhlIENvbW1lbnRzIGd1aWRlbGluZXMgaGVyZSIpLG5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChEcyx7c3R5bGU6e319KSksYy5pZCYmbmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtjb2xvcjoib3JhbmdlIixzdHlsZTp7bWFyZ2luVG9wOiIxMnB4IixtYXJnaW5Cb3R0b206Ii0xMnB4In19LCJyZXBseWluZyB0bzogIixjLm5hbWUsIiEiKSxuZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSWQse3ZhbHVlOnUsb25DaGFuZ2U6Zz0+e3AoZyl9LGF1dG9Gb2N1czohMX0pLCFpLnVzZXJJZCYmbmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguYnV0dG9uLHtjbGFzc05hbWU6ImdkIGRzIHYgZ2IgZ2UgZ2YgYiBkYyBnZyBjdCBhYiBnaCBkeCBjIixzdHlsZTp7IiY6aG92ZXIiOntjb2xvcjoiI2U5ZTllOSJ9fSxvbkNsaWNrOigpPT52KCEwKX0sIkxvZyBpbiB0byBqb2luIHRoZSBjb252ZXJzYXRpb24iKSxpLnVzZXJJZCYmKCFpLm1lbWJlcnNoaXB8fGkubWVtYmVyc2hpcDwyKSYmbmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguYnV0dG9uLHtjbGFzc05hbWU6ImdkIGRzIHYgZ2IgZ2UgZ2YgYiBkYyBnZyBjdCBhYiBnaCBkeCBjIixzdHlsZTp7IiY6aG92ZXIiOntjb2xvcjoiI2U5ZTllOSJ9fSxvbkNsaWNrOigpPT5vLnNldFBhdGgoe3NlY3Rpb246InJlZ2lzdGVyIixpZDpudWxsfSl9LCJVcGdyYWRlIHlvdXIgYWNjb3VudCB0byBqb2luIHRoZSBjb252ZXJzYXRpb24iKSxpLnVzZXJJZCYmaS5tZW1iZXJzaGlwPjEmJm5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmJ1dHRvbix7Y2xhc3NOYW1lOiJ2IGdiIGdlIGdmIGIgZGMgZ2cgY3QgYWIgZ2ggZHggYyIsc3R5bGU6e29wYWNpdHk6dS5sZW5ndGg8Mz8uODoxLGN1cnNvcjp1Lmxlbmd0aDwzPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLCImOmhvdmVyIjp7Y29sb3I6IiNlOWU5ZTkifX0sb25DbGljazphc3luYygpPT57aWYodS5sZW5ndGg+MiYmYy5pZCl0cnl7YXdhaXQgci5jYWxsKCJjb21tZW50czpwb3N0Iix7dGFyZ2V0OmUsY29tbWVudDpjLmlkLG1zZzp1LHVzZXI6e2lkOmkudXNlcklkLG5hbWU6aS5maXJzdE5hbWV9fSksUygiQ29tbWVudCBwb3N0ZWQiKSxwKCIiKSxmKHtpZDp2b2lkIDAsbmFtZTp2b2lkIDB9KX1jYXRjaHttKCJPb3BzLi4gc29tZXRoaW5nIHdlbnQgd3JvbmciKX1lbHNlIGlmKHUubGVuZ3RoPjIpdHJ5e2F3YWl0IHIuY2FsbCgiY29tbWVudHM6cG9zdCIse3RhcmdldDplLG1zZzp1LHVzZXI6e2lkOmkudXNlcklkLG5hbWU6aS5maXJzdE5hbWV9fSksUygiQ29tbWVudCBwb3N0ZWQiKSxmKHtpZDp2b2lkIDAsbmFtZTp2b2lkIDB9KSxwKCIiKX1jYXRjaHttKCJPb3BzLi4gc29tZXRoaW5nIHdlbnQgd3JvbmciKX19fSwiU2VuZCIpLG5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJnaSBnaiJ9LGgmJm5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCxudWxsLGgpLGQmJm5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCx7Y29sb3I6Im9yYW5nZSJ9LGQpKSxuZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7YWxpZ246ImVuZCIsc3R5bGU6e2JvcmRlckJvdHRvbToiMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4xMikifX0sbmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtjb2xvcjoib3JhbmdlIixzdHlsZTp7Ym9yZGVyQm90dG9tOlxgM3B4IHNvbGlkICR7Yigib3JhbmdlIil9XGAscGFkZGluZ0JvdHRvbToiNnB4IixtYXJnaW5Cb3R0b206LTJ9fSwiQWxsIENvbW1lbnRzICgiLHQsIikiKSxuZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQWQse3ZhbHVlOnMsb25DaGFuZ2U6YSxvcHRpb25zOlt7bGFiZWw6Ik5ld2VzdCIsdmFsdWU6Im5ld2VzdCJ9LHtsYWJlbDoiTW9zdCBsaWtlZCIsdmFsdWU6Imxpa2VzIn0se2xhYmVsOiJNb3N0IHJlcGxpZXMiLHZhbHVlOiJyZXBsaWVkIn1dLGxhYmVsOiJTb3J0IGJ5IixzdHlsZTp7bWFyZ2luQm90dG9tOjEyfX0pKSxzPT09InJlcGxpZWQiP24uc29ydCgoZyxDKT0+K0MucmVwbGllcy5sZW5ndGgtK2cucmVwbGllcy5sZW5ndGgpLm1hcCgoZyxDKT0+bmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExvLHtrZXk6Zy5tc2crQyxpZDpnLmlkLHB1Ymxpc2hlZEF0OmcudHMsYXV0aG9yOmcudXNlci5uYW1lLGNvbW1lbnQ6Zy5tc2cscmVjb21tZW5kZWQ6Zy5saWtlcyxyZXBvcnRlZDpnLnJlcG9ydHMscmVwbGllczpnLnJlcGxpZXMsc2V0UmVwbHlUbzpmLHRhcmdldDplLHVzZXI6aX0pKTpzPT09Imxpa2VzIj9uLnNvcnQoKGcsQyk9PitDLmxpa2VzLmxlbmd0aC0rZy5saWtlcy5sZW5ndGgpLm1hcCgoZyxDKT0+bmUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExvLHtrZXk6Zy5tc2crQyxpZDpnLmlkLHB1Ymxpc2hlZEF0OmcudHMsYXV0aG9yOmcudXNlci5uYW1lLGNvbW1lbnQ6Zy5tc2cscmVjb21tZW5kZWQ6Zy5saWtlcyxyZXBvcnRlZDpnLnJlcG9ydHMscmVwbGllczpnLnJlcGxpZXMsc2V0UmVwbHlUbzpmLHRhcmdldDplLHVzZXI6aX0pKTpuLnNvcnQoKGcsQyk9PitDLnRzLStnLnRzKS5tYXAoKGcsQyk9Pm5lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChMbyx7a2V5OmcubXNnK0MsaWQ6Zy5pZCxwdWJsaXNoZWRBdDpnLnRzLGF1dGhvcjpnLnVzZXIubmFtZSxjb21tZW50OmcubXNnLHJlY29tbWVuZGVkOmcubGlrZXMscmVwb3J0ZWQ6Zy5yZXBvcnRzLHJlcGxpZXM6Zy5yZXBsaWVzLHNldFJlcGx5VG86Zix0YXJnZXQ6ZSx1c2VyOml9KSkpKTpudWxsfTt2YXIgRGQ9KHthcnRpY2xlOmUsY29tbWVudHNDb3VudDp0fSk9PntsZXQgcj1qKCksbj1lJiZlLmJpbyYmZS5iaW8hPT0nPHAgY2xhc3M9InJ0ZS1wIj48YnI+PC9wPic/ZS5iaW86ZS5hdXRob3I/LmJpbztuPT09JzxwIGNsYXNzPSJydGUtcCI+PGJyPjwvcD4nJiYobj1udWxsKTtsZXQgbz0hMSxpPSExO3JldHVybiBXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYmUse3N0eWxlOnttYXhXaWR0aDplPy5hcnRpY2xlRm9ybWF0PT09Mj81NDg6NjIwLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3BhZGRpbmdMZWZ0OiIxNnB4IixwYWRkaW5nUmlnaHQ6IjE2cHgifX19LFdlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtzdHlsZTp7Ym9yZGVyQm90dG9tOiIxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyKSIscGFkZGluZ0JvdHRvbToyNCxtYXJnaW5Cb3R0b206MjR9LGdhcDoxMixqdXN0aWZ5OiJzdGFydCJ9LFdlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChXZix7dHdpdHRlckJvZHk6ZT8udHdlZXR9KSksV2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dhcDo2LGp1c3RpZnk6InN0YXJ0IixzdHlsZTp7ZmxleFdyYXA6IndyYXAiLCImICoiOnttYXJnaW5Cb3R0b206IjZweCJ9fX0sZT8uc2VjdGlvbi5tYXAoKGwscyk9PihsLnRpdGxlPT09Ik9waW5pb24iJiYobz0hMCksbC50aXRsZT09PSJTdGFrZWhvbGRlcnMiJiYoaT0hMCksV2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFB0LHt2YXJpYW50OiJ0YWciLGtleTpzLHNlY3Rpb246InNlY3Rpb24iLGZpZWxkOltsXX0pKSksZT8uYXJ0aWNsZVR5cGUubWFwKChsLHMpPT5XZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUHQse3ZhcmlhbnQ6InRhZyIsa2V5OnMsc2VjdGlvbjoiYXJ0aWNsZS10eXBlIixmaWVsZDpbbF19KSkpLGk/V2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFdlLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYWUse3N0eWxlOnttYXJnaW5Ub3A6NDV9fSwiRGlzY2xhaW1lciIpLFdlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChOYSx7c3R5bGU6e2NvbG9yOiJ2YXIoLS1ncmV5KSJ9fSwiVGhpcyBhcnRpY2xlIGlzIHNwb25zb3JlZCBieSBhIHRoaXJkIHBhcnR5LiBBbGwgb3BpbmlvbnMgaW4gdGhpcyBhcnRpY2xlIHJlZmxlY3QgdGhlIHZpZXdzIG9mIHRoZSBhdXRob3IgYW5kIG5vdCBvZiBFVW9ic2VydmVyLiIpKTpudWxsLG8mJiFpP1dlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChXZS5kZWZhdWx0LkZyYWdtZW50LG51bGwsV2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtzdHlsZTp7bWFyZ2luVG9wOjQ1fX0sIkRpc2NsYWltZXIiKSxXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTmEse3N0eWxlOntjb2xvcjoidmFyKC0tZ3JleSkifX0sIlRoZSB2aWV3cyBleHByZXNzZWQgaW4gdGhpcyBvcGluaW9uIHBpZWNlIGFyZSB0aGUgYXV0aG9yXHUyMDE5cywgbm90IHRob3NlIG9mIEVVb2JzZXJ2ZXIiKSk6bnVsbCxuJiZXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYsbnVsbCxXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYWUse3N0eWxlOnttYXJnaW5Ub3A6MjQsbWFyZ2luQm90dG9tOjEyfX0sIkF1dGhvciBCaW8iKSxXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQob24se3NtYWxsOiEwLHRleHQ6bn0pKSxXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoemsse2FydGljbGVJZDplLmlkLGNvbW1lbnRzQ291bnQ6dH0pLGU/LnJlbGF0ZWQubGVuZ3RoP1dlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJkbyJ9LFdlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhZSx7c3R5bGU6e21hcmdpbkJvdHRvbToiMTZweCIsbWFyZ2luVG9wOjQ1fX0sIlJlbGF0ZWQgYXJ0aWNsZXMiKSxXZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7Z3JpZDohMCxzdHlsZTp7Z3JpZFRlbXBsYXRlQ29sdW1uczoiMWZyIiwiJiAqIjp7ZGlzcGxheToiYmxvY2sifX0sZGlyZWN0aW9uOiJjb2x1bW4ifSxlLnJlbGF0ZWQubWFwKGw9PldlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChobix7YXJ0aWNsZTpsLGtleTpsLmlkLHN0eWxlOnt3aWR0aDoiMTAwJSJ9LHZhcmlhbnQ6InJlbGF0ZWQifSkpKSk6bnVsbCl9O3ZhciBhYz13KFQoKSwxKTt2YXIgR3I9dyhUKCksMSk7dmFyIEJrPSgpPT57bGV0IGU9aigpLFt0LHJdPSgwLEdyLnVzZVN0YXRlKSghMSkse3VzZXJJZDpufT1OdCgpO3JldHVybiBHci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7ZGlyZWN0aW9uOiJjb2x1bW4iLGp1c3RpZnk6ImNlbnRlciIsYWxpZ246ImNlbnRlciIsZ2FwOjE2LHN0eWxlOntwYWRkaW5nOiI0MnB4IDE2cHgiLGJvcmRlclRvcDoiMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMikiLGJvcmRlckJvdHRvbToiMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMikiLG1hcmdpblRvcDoiMjRweCIsbWFyZ2luQm90dG9tOiIyNHB4In19LEdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhZSxudWxsLCJHZXQgRVUgbmV3cyB0aGF0IG1hdHRlcnMiKSxHci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaHQse3N0eWxlOnt0ZXh0QWxpZ246ImNlbnRlciJ9fSwiQmFjayBvdXIgaW5kZXBlbmRlbnQgam91cm5hbGlzbSBieSBiZWNvbWluZyBhIHN1cHBvcnRpbmcgbWVtYmVyIiksbj9Hci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7Y29sb3I6Im9yYW5nZSIsb25DbGljazooKT0+e2Uuc2V0UGF0aCh7c2VjdGlvbjoiYWNjb3VudCIsaWQ6bnVsbH0pLGUuc2V0UXVlcnkoe2dpZnRUb2tlbjpudWxsfSl9fSwiQmVjb21lIGEgc3VwcG9ydGluZyBtZW1iZXIiKTpHci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoR3IuZGVmYXVsdC5GcmFnbWVudCxudWxsLEdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7bWFyZ2luQm90dG9tOjh9LGNvbG9yOiJvcmFuZ2UiLG9uQ2xpY2s6KCk9PntlLnNldFBhdGgoe3NlY3Rpb246InJlZ2lzdGVyIixpZDpudWxsfSksZS5zZXRRdWVyeSh7Z2lmdFRva2VuOm51bGx9KX19LCJSZWdpc3RlciIpLEdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYLHtzdHlsZTp7IiYgYSI6e2N1cnNvcjoicG9pbnRlciIsY29sb3I6Yigib3JhbmdlIiksIiY6aG92ZXIiOnt0ZXh0RGVjb3JhdGlvbjoidW5kZXJsaW5lIn19fX0sIkFscmVhZHkgYSBtZW1iZXI/ICIsR3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazooKT0+cighMCl9LCJMb2dpbiBoZXJlIikpLHQ/R3IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEtuLHtzdHlsZTp7fSxzZXRPcGVuOigpPT5yKCExKX0pOm51bGwpKX07dmFyIFZrPXcoSGsoKSwxKTt2YXIgdnI9KGUsdCxyPTEzMTMpPT57aWYoZSYmdHlwZW9mIGU9PSJzdHJpbmciJiZlLmluY2x1ZGVzKCIuYmFzZWQuZGV2IikmJiFlLmluY2x1ZGVzKCIvY2RuLWNnaS9pbWFnZS8iKSl7bGV0W24sb109ZS5zcGxpdCgiLmJhc2VkLmRldiIpO2U9XGAke259LmJhc2VkLmRldi9jZG4tY2dpL2ltYWdlL2Zvcm1hdD1hdXRvLHc9JHtyKjJ9JHtvfVxgfXJldHVybiB0P2U/XGB1cmwoJHtlfSlcYDp2b2lkIDA6ZXx8IiJ9O3ZhciBVayx3OD0oKT0+e21uJiYoVWt8fChVaz0xLCgwLFZrLmxvYWRTY3JpcHQpKCJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiLCgpPT57fSkpKX0sSHk9KGUsdCxyLG4pPT57bGV0IG89ZSxpPWUubWF0Y2godCk7aWYoaSlmb3IobGV0IGwgb2YgaSl7bGV0IHM9bC5tYXRjaChyKTtpZihzKXtsZXRbYSx1XT1zO289ZS5yZXBsYWNlKGEsbih1LnRyaW0oKS5zbGljZSgxLC0xKSkpfX1yZXR1cm4gb30sUzg9ZT0+KGU9SHkoZSwvXDx5b3V0dWJlIGlkPSguKj8pXD4vZywvXDx5b3V0dWJlIGlkPSguKj8pXD4vLHQ9PlxgPGRpdiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1ib3R0b206NTYuMjUlO2hlaWdodDowO292ZXJmbG93OmhpZGRlbjsiPjxpZnJhbWUgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAwO3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTsiIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20vZW1iZWQvJHt0fT9tb2Rlc3RicmFuZGluZz0xIiBhbGxvdz0iZnVsbHNjcmVlbiI+PC9pZnJhbWU+PC9kaXY+PHA+PC9wPlxgKSxlPUh5KGUsL1w8dHdlZXQgaWQ9KC4qPylcPi9nLC9cPHR3ZWV0IGlkPSguKj8pXD4vLHQ9Pih3OCgpLFxgPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiPgogICAgICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL3VzZXJuYW1lL3N0YXR1cy8ke3R9Ij48L2E+IAogICAgPC9ibG9ja3F1b3RlPlxgKSksZT1IeShlLC9cPGltZyBzcmM9KC4qPylcPi9nLC9cPGltZyBzcmM9KC4qPylcPi8sdD0+XGA8aW1nIHNyYz0ke3ZyKHQsITEsNjQwKX0gLz5cYCksZSksT2Q9ZT0+e2xldCB0PWUuYm9keT9lLnZpZXdhYmxlP2UuYm9keTpcYCR7ZT8uYm9keT8uc2xpY2UoMCw1MDApfS4uLlxgOiIiO3JldHVybiBhYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYWMuZGVmYXVsdC5GcmFnbWVudCxudWxsLGFjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvbix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsIiY6OmJlZm9yZSI6ZS52aWV3YWJsZT9udWxsOntjb250ZW50OiciICInLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLGJvdHRvbTowLGJhY2tncm91bmQ6ImxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCA4MHB4LCB3aGl0ZSkifSwiJiBwIjp7bWFyZ2luQm90dG9tOiIyNHB4In0sIiYgYiI6e2ZvbnRXZWlnaHQ6IjgwMCJ9fSx0ZXh0OlM4KHQpfSksIWUudmlld2FibGUmJmFjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChCayxudWxsKSl9O3ZhciBSaz0oe2FydGljbGU6ZSx2aWV3YWJsZTp0LGNvbW1lbnRzQ291bnQ6cn0pPT5BaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYmUsbnVsbCxlPy5pbWcmJkFpLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJjIGcyIGJmIGczIGc0IixzdHlsZTp7YmFja2dyb3VuZEltYWdlOnZyKGU/LmltZz8uc3JjLCEwLDEzMTMpLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21pbkhlaWdodDoiMjAwcHgiLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjQ2dmgifX19KSxBaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYmUse3N0eWxlOnttYXhXaWR0aDoiMTAwNnB4IixiYWNrZ3JvdW5kQ29sb3I6IndoaXRlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNDApIixwYWRkaW5nVG9wOjc2LHBhZGRpbmdCb3R0b206NTQsbWFyZ2luVG9wOmU/LmltZz8iLTgwcHgiOjk2LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOnttYXhXaWR0aDoiNzk4cHgiLG1hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblJpZ2h0OiJhdXRvIixwYWRkaW5nVG9wOiIzMnB4In0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7Ym9yZGVyOiJub25lIixwYWRkaW5nVG9wOiIwcHgiLG1hcmdpblRvcDooZT8uaW1nLCIwcHgiKSxwYWRkaW5nQm90dG9tOiIyNHB4In19fSxBaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSGYse2FydGljbGU6ZSxjb21tZW50c0NvdW50OnJ9KSxBaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYmUse3N0eWxlOnttYXhXaWR0aDo1NDgsbWFyZ2luVG9wOjMyLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOnttYXhXaWR0aDoiNjIwcHgifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntwYWRkaW5nTGVmdDoiMTZweCIscGFkZGluZ1JpZ2h0OiIxNnB4In19fSxBaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoT2Qse3ZpZXdhYmxlOnQsYm9keTplLmJvZHl9KSksQWkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KERkLHthcnRpY2xlOmUsY29tbWVudHNDb3VudDpyfSkpKTt2YXIga2U9dyhUKCksMSk7dmFyIEdrPSh7YXJ0aWNsZTplLHZpZXdhYmxlOnQsY29tbWVudHNDb3VudDpyfSk9PntsZXQgbj1lJiZlLmJpbyYmZS5iaW8hPT0nPHAgY2xhc3M9InJ0ZS1wIj48YnI+PC9wPic/ZS5iaW86ZS5hdXRob3I/LmJpbztyZXR1cm4gbj09PSc8cCBjbGFzcz0icnRlLXAiPjxicj48L3A+JyYmKG49bnVsbCksa2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGJlLHtzdHlsZTp7bWF4V2lkdGg6MTEwMH19LGU/LmltZyYma2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImNiIGc1IGc2IGJmIGczIGE5IixzdHlsZTp7YmFja2dyb3VuZEltYWdlOnZyKGU/LmltZz8uc3JjLCEwLH5+KDExMDAqLjc1KSksIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e3dpZHRoOiIxMDAlIixoZWlnaHQ6IjQ2dmgifX19KSxrZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7YWxpZ246InN0YXJ0IixzdHlsZTp7bWFyZ2luVG9wOmU/LmltZz8zMjo5NiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttYXJnaW5Ub3A6IjE2cHgifX19LGtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChiZSx7c3R5bGU6e21heFdpZHRoOiI3OThweCIsbWFyZ2luTGVmdDowLGJhY2tncm91bmRDb2xvcjoid2hpdGUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC40MCkiLHBhZGRpbmdUb3A6NzYscGFkZGluZ0JvdHRvbTo1NCxtYXJnaW5Ub3A6ZT8uaW1nPyItMTI0cHgiOjAsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e21hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblJpZ2h0OiJhdXRvIixwYWRkaW5nVG9wOiIzMnB4In0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7Ym9yZGVyOiJub25lIixwYWRkaW5nVG9wOiIwcHgifX19LGtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChiZSx7c3R5bGU6e21heFdpZHRoOjYyMH19LGtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChIZix7YXJ0aWNsZTplLGNvbW1lbnRzQ291bnQ6cn0pKSxrZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYmUse3N0eWxlOnttYXhXaWR0aDo2MjAsbWFyZ2luVG9wOjMyLG1hcmdpbkJvdHRvbTo3NiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7cGFkZGluZ0xlZnQ6IjE2cHgiLHBhZGRpbmdSaWdodDoiMTZweCJ9fX0sa2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE9kLHtib2R5OmUuYm9keSx2aWV3YWJsZTp0fSkpLGtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChEZCx7YXJ0aWNsZTplLGNvbW1lbnRzQ291bnQ6cn0pKSxrZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7ZGlyZWN0aW9uOiJjb2x1bW4iLGdhcDoxNixzdHlsZTp7bWF4V2lkdGg6MzAwLG1hcmdpbkxlZnQ6IjMycHgiLHBhZGRpbmdUb3A6OCwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7ZGlzcGxheToibm9uZSJ9fX0sZSYmZS5oZWFkZXJJbWFnZUNhcHRpb24mJmtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmZpZ2NhcHRpb24se2NsYXNzTmFtZToiZzcgZzgiLHN0eWxlOnsiJjo6YmVmb3JlIjp7dG9wOiItMjRweCJ9fX0sZSYmZS5oZWFkZXJJbWFnZUNhcHRpb24sIiAiLGU/LmltZz8uY3JlZGl0Py5zb3VyY2U/a2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7dGFyZ2V0OiJfYmxhbmsiLGhyZWY6ZT8uaW1nPy5jcmVkaXQ/LnNvdXJjZVVybH0sXGAoUGhvdG86ICR7ZT8uaW1nPy5jcmVkaXQ/LnNvdXJjZX0pXGApOm51bGwpLGtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhZSxudWxsLCJUYWdzIiksa2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dhcDo4LGp1c3RpZnk6InN0YXJ0IixzdHlsZTp7bWFyZ2luQm90dG9tOjI0LGZsZXhXcmFwOiJ3cmFwIiwiJiAqIjp7bWFyZ2luQm90dG9tOiI2cHgifX19LGU/LnNlY3Rpb24ubWFwKG89PmtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7a2V5Om8uaWQsc2VjdGlvbjoic2VjdGlvbiIsZmllbGQ6W29dLHZhcmlhbnQ6InRhZyJ9KSksZT8uYXJ0aWNsZVR5cGUubWFwKG89PmtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7a2V5Om8uaWQsc2VjdGlvbjoiYXJ0aWNsZS10eXBlIixmaWVsZDpbb10sdmFyaWFudDoidGFnIn0pKSksbiYma2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dyaWQ6ITAsc3R5bGU6e319LGtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhZSxudWxsLCJBdXRob3IgQmlvIiksa2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG9uLHtzbWFsbDohMCx0ZXh0Om59KSksa2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE1mLG51bGwpLGU/LnJlbGF0ZWQubGVuZ3RoP2tlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChrZS5kZWZhdWx0LkZyYWdtZW50LG51bGwsa2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtzdHlsZTp7bWFyZ2luQm90dG9tOiIxNnB4IixtYXJnaW5Ub3A6NDV9fSwiUmVsYXRlZCBhcnRpY2xlcyIpLGtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiIsZ2FwOjEyLHN0eWxlOnttYXhXaWR0aDozMDB9fSxlLnJlbGF0ZWQubWFwKG89PmtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChobix7dmFyaWFudDoicmVsYXRlZCIsYXJ0aWNsZTpvLGtleTpvLmlkfSkpKSk6bnVsbCkpKX07dmFyIHFrPXcoVCgpLDEpLFFrPWU9PntsZXQgdD1VKCk7KDAscWsudXNlRWZmZWN0KSgoKT0+e2lmKHR5cGVvZiB3aW5kb3c8InUiJiZlKXtsZXQgcj10LmNoYW5uZWwoImFuYWx5dGljczp0cmFjayIse3R5cGU6InZpZXciLGlkOmV9KSxuPXIuc3Vic2NyaWJlKCgpPT57Y29uc29sZS5sb2coIm5ldmVyIGhhcHBlbiIpfSk7cmV0dXJuIHIucHVibGlzaCgiIiksKCk9Pntjb25zb2xlLmxvZygidW5zdWIhIixlKSxuKCl9fX0sW3QsZV0pfTt2YXIgemQ9dyhUKCksMSk7dmFyIFV5PVt7dGl0bGU6IkZyZWUgbWVtYmVyc2hpcCIsdmFsdWU6ImZyZWUifSx7dGl0bGU6Ik5ld3NsZXR0ZXIgbWVtYmVyc2hpcCIsdmFsdWU6Im5ld3NsZXR0ZXIifSx7dGl0bGU6Ik1vbnRobHkgbWVtYmVyc2hpcCIsdmFsdWU6Im1vbnRobHkifSx7dGl0bGU6IlllYXJseSBtZW1iZXJzaGlwIix2YWx1ZToieWVhcmx5In0se3RpdGxlOiJHcm91cCBtYW5hZ2VyIix2YWx1ZToiZ3JvdXBNYW5hZ2VyIn0se3RpdGxlOiJJbnN0aXR1dGUgbWVtYmVyIix2YWx1ZToiZ3JvdXBNZW1iZXIifV0sRGk9KCk9PntsZXQgZT1UaSgpO2lmKCFlLnVzZXJJZClyZXR1cm57dGl0bGU6Ik5vdCBsb2dnZWQgaW4iLHZhbHVlOiIifTtpZihlLm9yZ2FuaXphdGlvbil7aWYoZS5tZW1iZXJzaGlwIT09NClyZXR1cm4gVXlbNV07aWYoZS5tZW1iZXJzaGlwPT09NClyZXR1cm4gVXlbNF19cmV0dXJuIGUubWVtYmVyc2hpcD09PTA/e3RpdGxlOiJGcmVlIG1lbWJlcnNoaXAiLHZhbHVlOiJmcmVlIn06ZS5tZW1iZXJzaGlwPyhlLm1lbWJlcnNoaXA9PT00fHxlLm1lbWJlcnNoaXA9PT01KSYmZS5vcmdhbml6YXRpb249PT12b2lkIDA/ZS5tZW1iZXJzaGlwPT09NT97dGl0bGU6IllvdSBhcmUgbm90IGN1cnJlbnRseSBpbiBhbiBvcmdhbml6YXRpb24sIHBsZWFzZSBjb250YWN0IHVzIGF0IHRoZSBFVW9ic2VydmVyIix2YWx1ZToiZ3JvdXBNZW1iZXIifTp7dGl0bGU6IllvdSBhcmUgbm90IGN1cnJlbnRseSBpbiBhbiBvcmdhbml6YXRpb24sIHBsZWFzZSBjb250YWN0IHVzIGF0IHRoZSBFVW9ic2VydmVyIix2YWx1ZToiZ3JvdXBNZW1iZXIifTpVeVtlLm1lbWJlcnNoaXBdOnt0aXRsZToibG9hZGluZy4uLiIsdmFsdWU6IiJ9fTt2YXIgZWE9dyhUKCksMSksS2s9ZWEuY3JlYXRlQ29udGV4dCghMSk7ZnVuY3Rpb24gdGEoKXtyZXR1cm4gZWEudXNlQ29udGV4dChLayl9ZnVuY3Rpb24gWWsoe3ZhbHVlOmUsY2hpbGRyZW46dH0pe3JldHVybiBlYS5jcmVhdGVFbGVtZW50KEtrLlByb3ZpZGVyLHt2YWx1ZTplfSx0KX12YXIgQmQ9dyhUKCksMSk7dmFyIFhrPShlLHQpPT57bGV0W3Isbl09KDAsQmQudXNlU3RhdGUpKCExKSxvPWooKSxpPVRlKCksbD1EaSgpLHM9dGEoKSxhPVUoKSx1PU9lKCkscD1vLnF1ZXJ5LmdpZnRUb2tlbixjPW8ucGF0aC5pZCxmPWFzeW5jKCk9PntsZXQgZD1hd2FpdCBhLmNhbGwoImdpZnQ6dmFsaWRhdGUtZ2lmdCIse3Rva2VuOnAsYXJ0aWNsZUlkOmN9KTtuKGQudmFsaWQpLHUoZC52YWxpZD8ic3Vic2NyaWJlLXRvLW5ld3NsZXR0ZXIiOiJnaWZ0LWludmFsaWQiLHpkLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh6ZC5kZWZhdWx0LkZyYWdtZW50LG51bGwsZC5tZXNzYWdlLHpkLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYSIse29uQ2xpY2s6bT0+e20uc3RvcFByb3BhZ2F0aW9uKCksaS51c2VySWQ/by5zZXRQYXRoKHtzZWN0aW9uOiJhY2NvdW50In0pOm8uc2V0UGF0aCh7c2VjdGlvbjoicmVnaXN0ZXIifSksby5zZXRRdWVyeSh7Z2lmdFRva2VuOm51bGx9KX19LCJzaWduIHVwIHRvIG91ciBuZXdzbGV0dGVyIGZvciAzIG1vcmUgZnJlZSBhcnRpY2xlcy4iKSkpfTtyZXR1cm4oMCxCZC51c2VFZmZlY3QpKCgpPT57cCYmZigpfSxbXSksc3x8aS50eXBlPT09ImNtc3VzZXIifHxlPT09MHx8aS5pcEFjY2Vzc3x8cCYmcj8hMDohZXx8IWwudmFsdWV8fGwudmFsdWU9PT0iZnJlZSI/ITE6bC52YWx1ZT09PSJuZXdzbGV0dGVyIj8hIWk/LmZyZWVBcnRpY2xlcz8uaW5jbHVkZXModCk6ITB9O3ZhciBaaz13KFQoKSwxKTt2YXIgRmQ9KCk9PlprLmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSx7c3R5bGU6e3dpZHRoOiIxMDAlIixtYXJnaW5Ub3A6NTAscGFkZGluZ0xlZnQ6IjE2cHgiLHBhZGRpbmdSaWdodDoiMTZweCJ9fSwiUGFnZSBub3QgZm91bmQgOyIsIigiKTt2YXIgbjQ9dyhUKCksMSk7dmFyIFV0PXcoVCgpLDEpLFZ5PShlLHQscixuKT0+e2UoImZyZWUtIityLFxgWW91IGhhdmUgZnJlZSBhY2Nlc3MgdG8gdGhpcyBhcnRpY2xlLCB3aXRoICR7bn0gZnJlZSBhcnRpY2xlJHtuPjE/InMiOiIifSByZW1haW5pbmdcYCx0KX0sUnk9KGUsdCxyLG4pPT57ZSgiZnJlZS1uby1sZWZ0IityLFV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChVdC5kZWZhdWx0LkZyYWdtZW50LG51bGwsIllvdSBoYXZlIGZyZWUgYWNjZXNzIHRvIHRoaXMgYXJ0aWNsZSBidXQgbm8gbW9yZSBmcmVlIGFydGljbGVzIHJlbWFpbmluZyB0aGlzIG1vbnRoLCIsIiAiLFV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYSIse29uQ2xpY2s6bz0+e28uc3RvcFByb3BhZ2F0aW9uKCksbi5zZXRQYXRoKHtzZWN0aW9uOiJhY2NvdW50In0pfX0sIkJlY29tZSBhIHN1cHBvcnRpbmcgbWVtYmVyIikpLHQpfSxKaz0oZSx0LHIpPT57ZSgiYmVjb21lLXN1cHBvcnRpbmciLFV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChVdC5kZWZhdWx0LkZyYWdtZW50LG51bGwsIllvdSBoYXZlIG5vIHJlbWFuaW5nIGZyZWUgYXJ0aWNsZXMgdGhpcyBtb250aCwiLCIgIixVdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImEiLHtvbkNsaWNrOm49PntuLnN0b3BQcm9wYWdhdGlvbigpLHIuc2V0UGF0aCh7c2VjdGlvbjoiYWNjb3VudCJ9KX19LCJCZWNvbWUgYSBzdXBwb3J0aW5nIG1lbWJlciIpKSx0KX0sZTQ9KGUsdCxyKT0+e2UoInN1YnNjcmliZS10by1uZXdzbGV0dGVyIixVdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVXQuZGVmYXVsdC5GcmFnbWVudCxudWxsLCJHZXQgMyBmcmVlIGFydGljbGVzIHBlciBtb250aCBieSBzdWJzY3JpYmluZyB0byB0aGUgbmV3c2xldHRlciwiLCIgIixVdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImEiLHtvbkNsaWNrOm49PntuLnN0b3BQcm9wYWdhdGlvbigpLHIuc2V0UGF0aCh7c2VjdGlvbjoiYWNjb3VudCJ9KX19LCJzdWJzY3JpYmUgaGVyZSIpLCIgIiksdCl9LHQ0PShlLHQscixuKT0+e2UoInJlZ2lzdGVyLWN0YSIsVXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFV0LmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxVdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImEiLHtvbkNsaWNrOm89PntvLnN0b3BQcm9wYWdhdGlvbigpLHQoITApfX0sIiAiLCJTaWduIGluIiwiICIpLCIgIiwib3IiLCIgIixVdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImEiLHtvbkNsaWNrOm89PntvLnN0b3BQcm9wYWdhdGlvbigpLHIuc2V0UGF0aCh7c2VjdGlvbjoicmVnaXN0ZXIiLGlkOm51bGx9KX19LCJSZWdpc3RlciIpLCIgIiwiZm9yIDMgZnJlZSBhcnRpY2xlcy4iKSxuKX0scjQ9KGUsdCxyKT0+e2UoImZyZWUtYmVjb21lLXN1cHBvcnRpbmciLFV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChVdC5kZWZhdWx0LkZyYWdtZW50LG51bGwsIlRoaXMgaXMgYSBmcmVlIHRvIHJlYWQgYXJ0aWNsZSwgYnV0IGNoZWNrIG91ciBtZW1iZXJzaGlwIG9wdGlvbnMiLCIgIixVdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImEiLHtvbkNsaWNrOm49PntuLnN0b3BQcm9wYWdhdGlvbigpLHQuc2V0UGF0aCh7c2VjdGlvbjoiYWNjb3VudCJ9KX19LCJoZXJlIikpLHIpfTt2YXIgbzQ9KGUsdCxyKT0+e2xldHt1c2VySWQ6bn09TnQoKSxvPVRlKCksaT1VKCksbD1PZSgpLHM9aigpLGE9dGEoKSx7Z2lmdFRva2VuOnV9PXMucXVlcnkscD1zLmxvY2F0aW9uOygwLG40LnVzZUVmZmVjdCkoKCk9PnsoYXN5bmMoKT0+e2lmKCEoby5pcEFjY2Vzc3x8YXx8dSkpaWYobil7aWYoby5sb2FkaW5nKXJldHVybjtpZihyKXtvLm1lbWJlcnNoaXA9PT0xJiZyNChsLHMscCk7cmV0dXJufWlmKG8ubWVtYmVyc2hpcD09PTEmJm8udHlwZSE9PSJjbXN1c2VyIil7aWYoIW8uZnJlZUFydGljbGVzfHxvLmZyZWVBcnRpY2xlcy5sZW5ndGg8Myl7bGV0IGY9MztpZihvLmZyZWVBcnRpY2xlcylpZihmPU1hdGgubWF4KDAsZi09by5mcmVlQXJ0aWNsZXMubGVuZ3RoKSxvLmZyZWVBcnRpY2xlcy5pbmNsdWRlcyhlKSl7VnkobCxwLGUsZik7cmV0dXJufWVsc2UgZi0tLGF3YWl0IGkuY2FsbCgiaW5jcmVtZW50LWZyZWUtYXJ0aWNsZSIse3VzZXJJZDpuLGFydGljbGVJZDplfSk7ZWxzZSBmLS0sYXdhaXQgaS5jYWxsKCJpbmNyZW1lbnQtZnJlZS1hcnRpY2xlIix7dXNlcklkOm4sYXJ0aWNsZUlkOmV9KTtpZihmPjApe1Z5KGwscCxlLGYpO3JldHVybn1lbHNle1J5KGwscCxlLHMpO3JldHVybn19aWYoby5mcmVlQXJ0aWNsZXM/LmluY2x1ZGVzKGUpKXtSeShsLHAsZSxzKTtyZXR1cm59SmsobCxwLHMpO3JldHVybn1lbHNlIGlmKG8ubWVtYmVyc2hpcD09PTAmJm8udHlwZSE9PSJjbXN1c2VyIil7ZTQobCxwLHMpO3JldHVybn19ZWxzZSFuJiZvLmlwQWNjZXNzIT09dm9pZCAwJiZ0NChsLHQscyxwKX0pKCl9LFtvLmNoZWNrc3VtLHAsby5pcEFjY2VzcyxhXSl9O3ZhciBIbz13KFQoKSwxKTt2YXIgR3k9dyhUKCksMSk7dmFyIGk0PSh7c3R5bGU6ZSx3aWR0aDp0LGhlaWdodDpyLGNvbG9yOm59KT0+R3kuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt3aWR0aDp0LGhlaWdodDpyLHZpZXdCb3g6IjAgMCAxMCAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwuLi5lfSxHeS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtmaWxsUnVsZToiZXZlbm9kZCIsY2xpcFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0wLjIxOTY3IDAuMjE5NjdDMC41MTI1NjMgLTAuMDczMjIzMyAwLjk4NzQzNyAtMC4wNzMyMjMzIDEuMjgwMzMgMC4yMTk2N0w1IDMuOTM5MzRMOC43MTk2NyAwLjIxOTY3QzkuMDEyNTYgLTAuMDczMjIzMyA5LjQ4NzQ0IC0wLjA3MzIyMzMgOS43ODAzMyAwLjIxOTY3QzEwLjA3MzIgMC41MTI1NjMgMTAuMDczMiAwLjk4NzQzNyA5Ljc4MDMzIDEuMjgwMzNMNi4wNjA2NiA1TDkuNzgwMzMgOC43MTk2N0MxMC4wNzMyIDkuMDEyNTYgMTAuMDczMiA5LjQ4NzQ0IDkuNzgwMzMgOS43ODAzM0M5LjQ4NzQ0IDEwLjA3MzIgOS4wMTI1NiAxMC4wNzMyIDguNzE5NjcgOS43ODAzM0w1IDYuMDYwNjZMMS4yODAzMyA5Ljc4MDMzQzAuOTg3NDM3IDEwLjA3MzIgMC41MTI1NjMgMTAuMDczMiAwLjIxOTY3IDkuNzgwMzNDLTAuMDczMjIzMyA5LjQ4NzQ0IC0wLjA3MzIyMzMgOS4wMTI1NiAwLjIxOTY3IDguNzE5NjdMMy45MzkzNCA1TDAuMjE5NjcgMS4yODAzM0MtMC4wNzMyMjMzIDAuOTg3NDM3IC0wLjA3MzIyMzMgMC41MTI1NjMgMC4yMTk2NyAwLjIxOTY3WiIsZmlsbDpufSkpO3ZhciBDOD1ZdCh7IjAlIjp7dHJhbnNmb3JtOiJ0cmFuc2xhdGVYKDcwMHB4KSJ9LCIxMDAlIjp7dHJhbnNmb3JtOiJ0cmFuc2xhdGVYKDBweCkifX0pLGw0PSh7Y2hpbGRyZW46ZSxzaG93OnQsb25DbG9zZTpyLHN0eWxlOm59KT0+KHZmKHQpLEhvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChIby5TdXNwZW5zZSxudWxsLHQ/SG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImF2IGdrIGI5IGJzIGJ0IGgyIGgzIGdhIixvbkNsaWNrOigpPT57cigpLEFuKCl9fSxIby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYjIgaDQgYyBiMyBidCBnayBoNSBnYSBnbSBoNiIsc3R5bGU6e2FuaW1hdGlvbjpDOCwuLi5ufSxvbkNsaWNrOm89PntvLnByZXZlbnREZWZhdWx0KCksby5zdG9wUHJvcGFnYXRpb24oKX19LEhvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChZbixudWxsLCIgIixlKSxIby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiYjMgYiB2IGFiIGg3IGg4IGJlIGg5IGhhIGdiIGRzIixvbkNsaWNrOigpPT57cigpLEFuKCl9fSxIby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaTQse3dpZHRoOjEyLGhlaWdodDoxMixjb2xvcjoid2hpdGUiLHN0eWxlOnt9fSkpKSk6bnVsbCkpO3ZhciBlZT13KFQoKSwxKTt2YXIgczQ9KHthcnRpY2xlSWQ6ZSxjb21tZW50c0NvdW50OnR9KT0+e2xldCByPVUoKSx7ZGF0YTpufT1wZSgiY29tbWVudHM6ZGF0YSIse3RhcmdldDplfSksbz1UZSgpLGk9aigpO2NvbnNvbGUubG9nKGkucXVlcnkuY29tbWVudHMpO2xldCBsPSgwLGVlLnVzZVJlZikoKSxbcyxhXT0oMCxlZS51c2VTdGF0ZSkoIm5ld2VzdCIpLFt1LHBdPSgwLGVlLnVzZVN0YXRlKSgiIiksW2MsZl09KDAsZWUudXNlU3RhdGUpKHtpZDp2b2lkIDAsbmFtZTp2b2lkIDB9KSxbZCxtXT0oMCxlZS51c2VTdGF0ZSkoIiIpLFtoLFNdPSgwLGVlLnVzZVN0YXRlKSgiIiksW3ksdl09KDAsZWUudXNlU3RhdGUpKCExKTtyZXR1cm4oMCxlZS51c2VFZmZlY3QpKCgpPT57aWYoYy5uYW1lKXtsZXQgZz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucnRlIik7Y29uc29sZS5sb2coZyksZyYmKGkucXVlcnkuY29tbWVudHM/Z1sxXS5mb2N1cygpOmdbMF0uZm9jdXMoKSxsLmN1cnJlbnQuc2Nyb2xsSW50b1ZpZXcoKSl9fSxbY10pLCgwLGVlLnVzZUVmZmVjdCkoKCk9PnsoZHx8aCkmJnNldFRpbWVvdXQoKCk9PnttKCIiKSxTKCIiKX0sM2UzKX0sW2QsaF0pLG4/ZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGVlLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCx5P2VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLbix7c2V0T3BlbjooKT0+dighMSksc3R5bGU6e3pJbmRleDoyfX0pOm51bGwsZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImIyIGc5IGdhIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZzoiMzJweCAxNnB4IDMycHgifX19LGVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLHtyZWY6bH0sIkNvbW1lbnRzIiksZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImMgZmYgZ2IgZTMgZ2MifSksZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGd0LG51bGwsIkxldCdzIGRpc2N1c3MuIFdlJ2QgbG92ZSB0byBoZWFyIHlvdXIgdGhvdWdodHMsIHF1ZXN0aW9ucyBvciBmZWVkYmFjayBiZWxvdy4iKSxlZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7c3R5bGU6e2JhY2tncm91bmQ6IiNmZmYiLHBhZGRpbmc6IjEwcHggMTZweCIsbWFyZ2luVG9wOjEyfX0sZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGd0LHtjb2xvcjoiZ3JleSIsc3R5bGU6eyImOmhvdmVyIjp7Y29sb3I6InZhcigtLWJsYWNrKSJ9fSxvbkNsaWNrOigpPT53aW5kb3cub3BlbigiL3N0YXRpYy80MDRhNmM4YTZhIiwiX2JsYW5rIil9LCJSZWFkIG1vcmUgYWJvdXQgdGhlIENvbW1lbnRzIGd1aWRlbGluZXMgaGVyZSIpLGVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChEcyx7c3R5bGU6e319KSksYy5pZCYmZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtjb2xvcjoib3JhbmdlIixzdHlsZTp7bWFyZ2luVG9wOiIxMnB4IixtYXJnaW5Cb3R0b206Ii0xMnB4In19LCJyZXBseWluZyB0bzogIixjLm5hbWUsIiEiKSxlZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSWQse3ZhbHVlOnUsb25DaGFuZ2U6Zz0+e3AoZyl9LGF1dG9Gb2N1czohMH0pLCFvLnVzZXJJZCYmZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguYnV0dG9uLHtjbGFzc05hbWU6ImdkIGRzIHYgZ2IgZ2UgZ2YgYiBkYyBnZyBjdCBhYiBnaCBkeCBjIixzdHlsZTp7IiY6aG92ZXIiOntjb2xvcjoiI2U5ZTllOSJ9fSxvbkNsaWNrOigpPT52KCEwKX0sIkxvZyBpbiB0byBqb2luIHRoZSBjb252ZXJzYXRpb24iKSxvLnVzZXJJZCYmKCFvLm1lbWJlcnNoaXB8fG8ubWVtYmVyc2hpcDwyKSYmZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguYnV0dG9uLHtjbGFzc05hbWU6ImdkIGRzIHYgZ2IgZ2UgZ2YgYiBkYyBnZyBjdCBhYiBnaCBkeCBjIixzdHlsZTp7IiY6aG92ZXIiOntjb2xvcjoiI2U5ZTllOSJ9fSxvbkNsaWNrOigpPT5pLnNldFBhdGgoe3NlY3Rpb246InJlZ2lzdGVyIixpZDpudWxsfSl9LCJVcGdyYWRlIHlvdXIgYWNjb3VudCB0byBqb2luIHRoZSBjb252ZXJzYXRpb24iKSxvLnVzZXJJZCYmby5tZW1iZXJzaGlwPjEmJmVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmJ1dHRvbix7Y2xhc3NOYW1lOiJ2IGdiIGdlIGdmIGIgZGMgZ2cgY3QgYWIgZ2ggZHggYyIsc3R5bGU6e29wYWNpdHk6dS5sZW5ndGg8Mz8uODoxLGN1cnNvcjp1Lmxlbmd0aDwzPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLCImOmhvdmVyIjp7Y29sb3I6IiNlOWU5ZTkifX0sb25DbGljazphc3luYygpPT57aWYodS5sZW5ndGg+MiYmYy5pZCl0cnl7YXdhaXQgci5jYWxsKCJjb21tZW50czpwb3N0Iix7dGFyZ2V0OmUsY29tbWVudDpjLmlkLG1zZzp1LHVzZXI6e2lkOm8udXNlcklkLG5hbWU6by5maXJzdE5hbWV9fSksUygiQ29tbWVudCBwb3N0ZWQiKSxwKCIiKSxmKHtpZDp2b2lkIDAsbmFtZTp2b2lkIDB9KX1jYXRjaHttKCJPb3BzLi4gc29tZXRoaW5nIHdlbnQgd3JvbmciKX1lbHNlIGlmKHUubGVuZ3RoPjIpdHJ5e2F3YWl0IHIuY2FsbCgiY29tbWVudHM6cG9zdCIse3RhcmdldDplLG1zZzp1LHVzZXI6e2lkOm8udXNlcklkLG5hbWU6by5maXJzdE5hbWV9fSksUygiQ29tbWVudCBwb3N0ZWQiKSxmKHtpZDp2b2lkIDAsbmFtZTp2b2lkIDB9KSxwKCIiKX1jYXRjaHttKCJPb3BzLi4gc29tZXRoaW5nIHdlbnQgd3JvbmciKX19fSwiU2VuZCIpLGVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJnaSBnaiJ9LGgmJmVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCxudWxsLGgpLGQmJmVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCx7Y29sb3I6Im9yYW5nZSJ9LGQpKSxlZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7YWxpZ246ImVuZCIsc3R5bGU6e2JvcmRlckJvdHRvbToiMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4xMikifX0sZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtjb2xvcjoib3JhbmdlIixzdHlsZTp7Ym9yZGVyQm90dG9tOlxgM3B4IHNvbGlkICR7Yigib3JhbmdlIil9XGAscGFkZGluZ0JvdHRvbToiNnB4IixtYXJnaW5Cb3R0b206LTJ9fSwiQWxsIENvbW1lbnRzICgiLHQsIikiKSxlZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQWQse3ZhbHVlOnMsb25DaGFuZ2U6YSxvcHRpb25zOlt7bGFiZWw6Ik5ld2VzdCIsdmFsdWU6Im5ld2VzdCJ9LHtsYWJlbDoiTW9zdCBsaWtlZCIsdmFsdWU6Imxpa2VzIn0se2xhYmVsOiJNb3N0IHJlcGxpZXMiLHZhbHVlOiJyZXBsaWVkIn1dLGxhYmVsOiJTb3J0IGJ5IixzdHlsZTp7bWFyZ2luQm90dG9tOjEyfX0pKSxzPT09InJlcGxpZWQiP24uc29ydCgoZyxDKT0+K0MucmVwbGllcy5sZW5ndGgtK2cucmVwbGllcy5sZW5ndGgpLm1hcCgoZyxDKT0+ZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExvLHtrZXk6Zy5tc2crQyxpZDpnLmlkLHB1Ymxpc2hlZEF0OmcudHMsYXV0aG9yOmcudXNlci5uYW1lLGNvbW1lbnQ6Zy5tc2cscmVjb21tZW5kZWQ6Zy5saWtlcyxyZXBvcnRlZDpnLnJlcG9ydHMscmVwbGllczpnLnJlcGxpZXMsc2V0UmVwbHlUbzpmLHRhcmdldDplLHVzZXI6b30pKTpzPT09Imxpa2VzIj9uLnNvcnQoKGcsQyk9PitDLmxpa2VzLmxlbmd0aC0rZy5saWtlcy5sZW5ndGgpLm1hcCgoZyxDKT0+ZWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExvLHtrZXk6Zy5tc2crQyxpZDpnLmlkLHB1Ymxpc2hlZEF0OmcudHMsYXV0aG9yOmcudXNlci5uYW1lLGNvbW1lbnQ6Zy5tc2cscmVjb21tZW5kZWQ6Zy5saWtlcyxyZXBvcnRlZDpnLnJlcG9ydHMscmVwbGllczpnLnJlcGxpZXMsc2V0UmVwbHlUbzpmLHRhcmdldDplLHVzZXI6b30pKTpuLnNvcnQoKGcsQyk9PitDLnRzLStnLnRzKS5tYXAoKGcsQyk9PmVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChMbyx7a2V5OmcubXNnK0MsaWQ6Zy5pZCxwdWJsaXNoZWRBdDpnLnRzLGF1dGhvcjpnLnVzZXIubmFtZSxjb21tZW50OmcubXNnLHJlY29tbWVuZGVkOmcubGlrZXMscmVwb3J0ZWQ6Zy5yZXBvcnRzLHJlcGxpZXM6Zy5yZXBsaWVzLHNldFJlcGx5VG86Zix0YXJnZXQ6ZSx1c2VyOm99KSkpKTpudWxsfTt2YXIgZXQ9dyhUKCksMSk7dmFyIE9pPXcoVCgpLDEpO3ZhciBUOD0oe3NpemU6ZX0pPT5PaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7anVzdGlmeToiY2VudGVyIixhbGlnbjoiY2VudGVyIixzdHlsZTp7bWFyZ2luUmlnaHQ6LTcsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6Yigib3JhbmdlIiksd2lkdGg6MTgsaGVpZ2h0OjE4fX0sT2kuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse2NvbG9yOiJ3aGl0ZSJ9LGUpKSxxeT0oe29wdGlvbnM6ZSx2YWx1ZTp0LG9uQ2hhbmdlOnIsbGFiZWw6bixzdHlsZTpvfSk9PntsZXQgaT10Lmxlbmd0aDtyZXR1cm4gT2kuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImE1IixzdHlsZTp7Li4ub319LE9pLmRlZmF1bHQuY3JlYXRlRWxlbWVudChicyx7b25DaGFuZ2U6cix2YWx1ZTp0LG9wdGlvbnM6ZX0sT2kuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOmk+MD8ib3JhbmdlIjoiYmxhY2siLHZhcmlhbnQ6InRyYW5zcGFyZW50IixzdWZmaXg6aT4wP09pLmRlZmF1bHQuY3JlYXRlRWxlbWVudChUOCx7c2l6ZTppfSk6T2kuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExkLG51bGwpfSxuKSkpfTt2YXIgaWU9dyhUKCksMSk7dmFyIFF5PXcoVCgpLDEpO3ZhciBVbz0oe2NvbG9yOmU9ImluaGVyaXQiLHN0eWxlOnR9KT0+UXkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3ZnLHt3aWR0aDoiOCIsaGVpZ2h0OiIxMSIsdmlld0JveDoiMCAwIDggMTEiLGZpbGw6Im5vbmUiLHN0eWxlOnR9LFF5LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xLjUgMTBMNiA1LjMwNDM1TDEuNSAxIixzdHJva2U6ZT09PSJpbmhlcml0Ij8iY3VycmVudENvbG9yIjpiKGUpLHN0cm9rZVdpZHRoOiIyIn0pKTt2YXIgYTQ9dyhTaSgpLDEpO3ZhciBLeT0oe2FydGljbGU6ZSxsZW5ndGg6dCxpbmRleDpyfSk9PntsZXRbbixvXT0oMCxpZS51c2VTdGF0ZSkoITEpLHthcnRpY2xlRm9ybWF0OmksYXJ0aWNsZVR5cGU6bCxpbWc6cyxoZWFkZXJJbWFnZUNhcHRpb246YSxwdWJsaXNoRGF0ZTp1PTAsaGVhZGxpbmU6cCxhYnN0cmFjdDpjLHNlY3Rpb246Zn09ZSxkPSExO2YmJihkPSEhZi5maW5kKGg9PmgudGl0bGU9PT0iU3Rha2Vob2xkZXJzIikpO2xldCBtPSgwLGllLnVzZVJlZikoKTtyZXR1cm4gaWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHgubGkse2NsYXNzTmFtZToiayBsIG0gbiBjIGIiLG9uTW91c2VFbnRlcjpOdSgpP3ZvaWQgMDooKT0+e2NsZWFyVGltZW91dChtLmN1cnJlbnQpLG0uY3VycmVudD1zZXRUaW1lb3V0KCgpPT57byghMCl9LDUwMCl9LG9uTW91c2VMZWF2ZTpOdSgpP3ZvaWQgMDooKT0+e2NsZWFyVGltZW91dChtLmN1cnJlbnQpLG8oITEpfSxzdHlsZTp7Ym9yZGVyVG9wOnI9PT0wPyIycHggc29saWQgYmxhY2siOiIxcHggc29saWQgcmdiYSgwLDAsMCwwLjEyKSIsYm9yZGVyQm90dG9tOnI9PT10PyIxcHggc29saWQgcmdiYSgwLDAsMCwwLjEyKSI6dm9pZCAwLGJhY2tncm91bmQ6bj8icmdiYSgyNDAsIDgyLCA2MCwgMC4wNikiOmQ/InZhcigtLWJnMSkiOnZvaWQgMCwiJjpob3ZlciI6e2JhY2tncm91bmQ6InJnYmEoMjQwLCA4MiwgNjAsIDAuMDYpIn0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZ1RvcDoiMTZweCIscGFkZGluZ0JvdHRvbToiMTZweCIscGFkZGluZ0xlZnQ6IjE2cHgiLHBhZGRpbmdSaWdodDoiMTZweCJ9fX0saWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse3NpemU6ImRvdCIsY29sb3I6aT09PTI/Im9yYW5nZSI6ImJsYWNrIixzdHlsZTp7bWFyZ2luVG9wOjUwLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2Rpc3BsYXk6Im5vbmUifX0sb25DbGljazooKT0+e28oIW4pfX0saWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFVvLHtzdHlsZTp7dHJhbnNmb3JtOm4/InJvdGF0ZSgtOTBkZWcpIjoicm90YXRlKDkwZGVnKSIsdHJhbnNpdGlvbjoiMC4ycyJ9fSkpLGllLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiIGFxIHAgcSByIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7bWFyZ2luTGVmdDoiMHB4IixtYXJnaW5Ub3A6IjBweCJ9fX0saWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse3N0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttYXhXaWR0aDoiY2FsYygxMDB2dyAtIDMycHgpIn19fSxpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBhcSBwIGlhIn0saWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse3NpbmdsZUxpbmU6ITAsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21heFdpZHRoOiJjYWxjKDEwMHZ3IC0gNjBweCkifX19LGllLmRlZmF1bHQuY3JlYXRlRWxlbWVudChWZSxudWxsLCgwLGE0LnByZXR0eURhdGUpKHUsImRhdGUtdGltZS1odW1hbiIpKSxpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQod3Mse3N0eWxlOnttYXJnaW5MZWZ0OjQsbWFyZ2luUmlnaHQ6MTF9LGFydGljbGU6ZX0pKSxpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTHMse2lkOmUuaWR9KSksaWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse3NpemU6ImRvdC1sYXJnZSIsdmFyaWFudDoiZ2hvc3QiLHN0eWxlOntkaXNwbGF5OiJub25lIiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntkaXNwbGF5OiJibG9jayJ9fSxvbkNsaWNrOigpPT57byghbil9fSxpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVW8se2NvbG9yOiJncmV5IixzdHlsZTp7dHJhbnNmb3JtOm4/InJvdGF0ZSgtOTBkZWcpIjoicm90YXRlKDkwZGVnKSIsdHJhbnNpdGlvbjoiMC4ycyJ9fSkpKSxpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaG4se2FydGljbGU6ZX0saWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5uLG51bGwscCkpLGllLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIHQgdSB2In0sZT8ubWVtYmVyc2hpcD09PTAmJiFkJiZpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiB2IGFiIGRyIGliIGFpIGljIGlkIGllIixzdHlsZTp7Ym9yZGVyOlxgMXB4IHNvbGlkICR7Yigib3JhbmdlIil9XGAsbWFyZ2luVG9wOi00fX0saWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse3N0eWxlOntjb2xvcjoiYmxhY2sifX0sIkZyZWUgQXJ0aWNsZSIpKSxkP2llLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBcyxudWxsKTpudWxsLGllLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7c2VjdGlvbjoic2VjdGlvbiIsZmllbGQ6Zn0pLGllLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7c2VjdGlvbjoiYXJ0aWNsZS10eXBlIixmaWVsZDpsfSkpLG4/aWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGllLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaHQse3N0eWxlOnttYXJnaW5Ub3A6MTgsb3BhY2l0eTpuPzE6MCx0cmFuc2l0aW9uOiIwLjVzIn19LGMsaWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGhuLHtzdHlsZTp7bWFyZ2luVG9wOjE2LG1hcmdpbkJvdHRvbToxNixkaXNwbGF5OiJibG9jayJ9LGFydGljbGU6ZSxsYWJlbDoiUmVhZCBpdCJ9KSkscz8uc3JjJiZpPT09Mj9pZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaWUuZGVmYXVsdC5GcmFnbWVudCxudWxsLGllLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiaW1nIix7Y2xhc3NOYW1lOiJpZiIsc3JjOnZyKHMuc3JjLCExLDcwMCl9KSxhJiZpZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5maWdjYXB0aW9uLHtjbGFzc05hbWU6ImlnIGloIGUwIGlpIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSI6e2Rpc3BsYXk6ImJsb2NrIn19fSxhJiZhLCIgIixzPy5jcmVkaXQ/LnNvdXJjZT9pZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImEiLHt0YXJnZXQ6Il9ibGFuayIsaHJlZjpzPy5jcmVkaXQ/LnNvdXJjZVVybH0sXGAoUGhvdG86ICR7cz8uY3JlZGl0Py5zb3VyY2V9KVxgKTpudWxsKSk6bnVsbCk6bnVsbCkpfTt2YXIgdTQ9KGUsdCxyKT0+e2xldCBuPXtzZWN0aW9uOmUubWFwKGk9Pih7aWQ6aS5pZH0pKSxhcnRpY2xlVHlwZTp0Lm1hcChpPT4oe2lkOmkuaWR9KSl9O3ImJihuLnVzZXI9cik7bGV0e2RhdGE6b309cGUoImdldC1sYXRlc3QtYXJ0aWNsZXMiLG4pO3JldHVybiBvPy5kYXRhPz9bXX07dmFyIF84PWU9PmUuZW5kc1dpdGgoImlzIik/ZS5zbGljZSgwLC0yKSsiZXMiOmU9PT0iRVVvYnNlcnZlZCI/ZTplKyJzIixrOD0oe3R5cGU6ZSxzZWN0aW9uOnR9KT0+e2xldCByO3JldHVybiB0JiYocj10LnRpdGxlKSxldC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZGUsbnVsbCxlPT09InVzZXIiPyJBcnRpY2xlcyBieSBhdXRob3IiOmU9PT0iYXJ0aWNsZVR5cGUiP1xgTGF0ZXN0ICR7Xzgocil9XGA6ZT09PSJzZWN0aW9uIj8iUmVjZW50IGFydGljbGVzIjoiTGF0ZXN0IE5ld3MiKX0sTjg9KHt0eXBlOmUsbW9zdFJlYWQ6dCxzZXRNb3N0UmVhZDpyLHNlY3Rpb246bixzZWN0aW9uVmFsdWU6byxzZXRTZWN0aW9uVmFsdWU6aSxhcnRpY2xlVHlwZVZhbHVlOmwsc2V0QXJ0aWNsZVR5cGVWYWx1ZTpzfSk9PntsZXR7c2VjdGlvbnM6YSxhcnRpY2xlVHlwZXM6dX09WG4oKTtyZXR1cm4gZXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGV0LmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxldC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYyBiIGkgZjggYXoiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMzQycHgpIjp7cGFkZGluZ0xlZnQ6IjE2cHgiLHBhZGRpbmdSaWdodDoiMTZweCJ9LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2ZsZXhEaXJlY3Rpb246ImNvbHVtbiJ9fX0sZXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGs4LHtzZWN0aW9uOm4sdHlwZTplfSksZXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImkgdiBiIGF6IixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7d2lkdGg6IjEwMCUiLG1hcmdpblRvcDoyfX19LGV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7b3BhY2l0eTowfSxjb2xvcjp0PyJvcmFuZ2UiOiJibGFjayIsb25DbGljazooKT0+cighdCl9LCJNb3N0IHJlYWQiKSxlIT09InNlY3Rpb24iP2V0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChldC5kZWZhdWx0LkZyYWdtZW50LG51bGwsZXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHF5LHt2YWx1ZTpvLG9uQ2hhbmdlOmksb3B0aW9uczphLGxhYmVsOiJTZWN0aW9uIn0pKTpudWxsLGUhPT0iYXJ0aWNsZVR5cGUiP2V0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChxeSx7dmFsdWU6bCxvbkNoYW5nZTpzLG9wdGlvbnM6dSxsYWJlbDoiVHlwZSJ9KTpudWxsKSkpfSx6aT0oe3R5cGU6ZSxzZWN0aW9uOnQsc3R5bGU6cix1c2VyOm4sc3RhcnRMaW1pdDpvPTR9KT0+e2xldFtpLGxdPSgwLGV0LnVzZVN0YXRlKSghMSksW3MsYV09KDAsZXQudXNlU3RhdGUpKG8pLFt1LHBdPVJnKGU9PT0ic2VjdGlvbiImJnQpLFtjLGZdPVJnKGU9PT0iYXJ0aWNsZVR5cGUiJiZ0KSxkPXU0KHUsYyxuKTtyZXR1cm4gZXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImMgdyBhOSBhYSIsc3R5bGU6ey4uLnJ9fSxldC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTjgse3R5cGU6ZSxzZWN0aW9uOnQsc2VjdGlvblZhbHVlOnUsc2V0U2VjdGlvblZhbHVlOnAsYXJ0aWNsZVR5cGVWYWx1ZTpjLHNldEFydGljbGVUeXBlVmFsdWU6Zixtb3N0UmVhZDppLHNldE1vc3RSZWFkOmx9KSxldC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInVsIix7Y2xhc3NOYW1lOiJiIHAifSxpP1suLi5kXS5zb3J0KChtLGgpPT5oLmhpdHMtbS5oaXRzKS5maWx0ZXIoKG0saCk9Pmg8PXMpLm1hcCgobSxoKT0+ZXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEt5LHtpbmRleDpoLGxlbmd0aDpkLmxlbmd0aC0xLGFydGljbGU6bSxrZXk6aH0pKTpkLmZpbHRlcigobSxoKT0+aDw9cykubWFwKChtLGgpPT5ldC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoS3kse2luZGV4OmgsbGVuZ3RoOmQubGVuZ3RoLTEsYXJ0aWNsZTptLGtleTpofSkpKSxldC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblRvcDo0MiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7bWFyZ2luUmlnaHQ6IjE2cHgifX0sb25DbGljazooKT0+e3M8NTAmJmEocys1KX19LCJNb3JlIikpfTt2YXIgYzQ9dyhUKCksMSk7dmFyIGFvPSh7aGVpZ2h0OmU9MTAwLG1vYmlsZUhlaWdodDp0PWUsYm9yZGVyOnJ9KT0+YzQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImMiLHN0eWxlOntoZWlnaHQ6ZSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntoZWlnaHQ6dCxib3JkZXJUb3A6cj8iMnB4IHNvbGlkIHZhcigtLWJsYWNrKSI6dm9pZCAwfX19KTtmdW5jdGlvbiBwNChlKXtsZXQgdD0wO2lmKHR5cGVvZiBlPT0ib2JqZWN0Iil7ZS5yZXBsaWVzJiYodCs9ZS5yZXBsaWVzLmxlbmd0aCk7Zm9yKHZhciByIGluIGUpdCs9cDQoZVtyXSl9cmV0dXJuIHR9dmFyIGI4PSh7ZGF0YTplLHZpZXdhYmxlOnR9KT0+e2xldCByPWooKSx7ZGF0YTpuLGNoZWNrc3VtOm99PXBlKG1uJiZlPy5pZD8iY29tbWVudHM6ZGF0YSI6bnVsbCx7dGFyZ2V0OmU/LmlkfSksaT0oMCxIZS51c2VNZW1vKSgoKT0+e2xldCBsPW4/Lmxlbmd0aDtpZihsKXtsZXQgcz1wNChuKTtyZXR1cm4gbCtzfXJldHVybiAwfSxbb10pO3JldHVybiBlPy5pZD9IZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSGUuZGVmYXVsdC5GcmFnbWVudCxudWxsLGU/LmFydGljbGVGb3JtYXQ9PT0yP0hlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChSayx7Y29tbWVudHNDb3VudDppLGFydGljbGU6ZSx2aWV3YWJsZTp0fSk6SGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEdrLHtjb21tZW50c0NvdW50OmksYXJ0aWNsZTplLHZpZXdhYmxlOnR9KSxIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVmUsbnVsbCxIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobDQse3Nob3c6ISFyLnF1ZXJ5LmNvbW1lbnRzLG9uQ2xvc2U6KCk9PnIuc2V0UXVlcnkoe2NvbW1lbnRzOm51bGx9KSxjaGlsZHJlbjpIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoczQse2NvbW1lbnRzQ291bnQ6aSxhcnRpY2xlSWQ6ZS5pZH0pfSkpKTpudWxsfSxmND0oe2lkOmV9KT0+e2xldFt0LHJdPSgwLEhlLnVzZVN0YXRlKSghMSkse2RhdGE6bixsb2FkaW5nOm99PXBlKCJnZXQtYXJ0aWNsZS1ieS1pZCIse2lkOmV9KSxpPVhrKG4/Lm1lbWJlcnNoaXAsbj8uaWQpfHxuPy5zZWN0aW9uPy5maW5kKGw9PmwudGl0bGU9PT0iU3Rha2Vob2xkZXJzIik7cmV0dXJuIG80KGUscixuPy5tZW1iZXJzaGlwPT09MCksUWsoZSksbz9udWxsOm4/LiRpc051bGw/SGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEZkLG51bGwpOm4/LnN0YXR1cz09PTQ/bnVsbDpIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSGUuZGVmYXVsdC5GcmFnbWVudCxudWxsLHQmJkhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLbix7c2V0T3BlbjooKT0+cighMSksc3R5bGU6e3pJbmRleDoyfX0pLEhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChiOCx7ZGF0YTpuLHZpZXdhYmxlOml9KSxIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUGYsbnVsbCksSGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImJqIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7ZGlzcGxheToiZmxleCIsbWFyZ2luVG9wOiIwcHgiLG1hcmdpbkJvdHRvbToiNTRweCIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9fX0sSGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE1TLG51bGwpKSxIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7anVzdGlmeToic3RhcnQifSxIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoemkse3N0YXJ0TGltaXQ6NH0pKSxIZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYW8sbnVsbCkpfTt2YXIgcWU9dyhUKCksMSk7dmFyIHR0PXcoVCgpLDEpO3ZhciB3bD13KFQoKSwxKTtmdW5jdGlvbiBkNChlKXtpZih0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm4gbnVsbDtsZXQgdD13bC51c2VSZWYobnVsbCkscj13bC51c2VSZWYoe29uU2l6ZUNoYW5nZTplfSk7ci5jdXJyZW50Lm9uU2l6ZUNoYW5nZT1lO2xldCBuPXdsLnVzZU1lbW8oKCk9Pm5ldyBSZXNpemVPYnNlcnZlcihpPT57bGV0IGw9aVswXS50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ci5jdXJyZW50Lm9uU2l6ZUNoYW5nZShsLHQuY3VycmVudCl9KSxbXSk7cmV0dXJuIHdsLnVzZUNhbGxiYWNrKGk9Pnt0LmN1cnJlbnQ9PT1udWxsPyh0LmN1cnJlbnQ9aSxuLm9ic2VydmUoaSkpOihuLnVub2JzZXJ2ZSh0LmN1cnJlbnQpLHQuY3VycmVudD1udWxsKX0sW25dKX12YXIgaXI9dyhUKCksMSk7dmFyIHk0PXcoU2koKSwxKTt2YXIgU2w9dyhUKCksMSk7ZnVuY3Rpb24gbTQoZSx0KXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3JldHVybiBuLmZvbnQ9dHx8Z2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250LG4ubWVhc3VyZVRleHQoZSkud2lkdGh9dmFyIFl5PTEzMDAsaDQ9MzUsWHk9MjQsZzQ9KHt0ZXh0OmUsd2lkdGg6dD02MDB9KT0+e2xldFtyLG5dPSgwLFNsLnVzZVN0YXRlKShbXSksbz1nbigpLndpZHRoLGk9dC0zMDtyZXR1cm4oMCxTbC51c2VFZmZlY3QpKCgpPT57bGV0IGw9ZS5zcGxpdCgiICIpLHM9TWF0aC5jZWlsKGwubGVuZ3RoLzIpLGE9bC5zbGljZSgwLHMpO2lmKG8+WXkpaWYobTQoYS5qb2luKCIgIiksXGBib2xkICR7aDR9cHggZnJlaWdodC10ZXh0LXByb1xgKT5pKXtsZXQgdT1NYXRoLmNlaWwobC5sZW5ndGgvMyk7bihbbC5zbGljZSgwLHUpLmpvaW4oIiAiKSxsLnNsaWNlKHUsdSoyKS5qb2luKCIgIiksbC5zbGljZSh1KjIsdSozKS5qb2luKCIgIildKX1lbHNlIG4oW2Euam9pbigiICIpLGwuc2xpY2UocyxsLmxlbmd0aCkuam9pbigiICIpXSk7ZWxzZSBpZihtNChhLmpvaW4oIiAiKSxcYGJvbGQgJHtYeX1weCBmcmVpZ2h0LXRleHQtcHJvXGApPmkpe2xldCB1PU1hdGguY2VpbChsLmxlbmd0aC8zKTtuKFtsLnNsaWNlKDAsdSkuam9pbigiICIpLGwuc2xpY2UodSx1KjIpLmpvaW4oIiAiKSxsLnNsaWNlKHUqMix1KjMpLmpvaW4oIiAiKV0pfWVsc2UgbihbYS5qb2luKCIgIiksbC5zbGljZShzLGwubGVuZ3RoKS5qb2luKCIgIildKX0sW28sZSxpXSksU2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGRlLHtjb2xvcjoid2hpdGUiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6ImlubGluZS1mbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXhHcm93OjAsIiY6aG92ZXIgPiBkaXYiOntiYWNrZ3JvdW5kOiJ2YXIoLS1vcmFuZ2UpIn0sYm90dG9tOihyLmxlbmd0aD4yLDIwKSxbXGBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICR7WXl9cHggKVxgXTp7Zm9udFNpemU6aDQrInB4In0sW1xgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAke1l5LTF9cHggKVxgXTp7Zm9udFNpemU6WHkrInB4IixsaW5lSGVpZ2h0Olh5KzIwKyJweCJ9LG1hcmdpbkxlZnQ6Ii0yNHB4IiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA4MDBweCkiOntkaXNwbGF5OiJub25lIixtYXJnaW5MZWZ0OiIwcHgiLG1hcmdpblRvcDoiOHB4In19fSxyLm1hcCgobCxzKT0+U2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InN0cmluZyBoYyBqYiBkbyBlYyIsc3R5bGU6e21hcmdpbkxlZnQ6cz09PTA/IjE1cHgiOnZvaWQgMCxwYWRkaW5nUmlnaHQ6cyE9PXIubGVuZ3RoPzIwOjB9LGtleTpzfSxsKSkpfTt2YXIgJGQ9KHthcnRpY2xlOmUsbW92aW5nOnQsd2lkdGg6cix2YXJpYW50Om59KT0+e2xldCBvPWooKTtyZXR1cm4gaXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2p1c3RpZnk6InN0YXJ0IixhbGlnbjoic3RhcnQiLHN0eWxlOnttaW5XaWR0aDoiMTAwJSIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7bWluV2lkdGg6IjEwMHZ3IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGdhcDoiMzJweCIscGFkZGluZ1RvcDoiMTJweCJ9fSxnYXA6NjR9LGlyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJociBocyBiZiBodCBodSBkcyBhNSIsc3R5bGU6e2JhY2tncm91bmRQb3NpdGlvbjoiY2VudGVyIixiYWNrZ3JvdW5kSW1hZ2U6dnIoZS5pbWc/LnNyYywhMCw3OTEpLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyMDBweCkiOntiYWNrZ3JvdW5kUG9zaXRpb246ImNlbnRlciBjZW50ZXIifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA4MDBweCkiOnt3aWR0aDoiMTAwJSIsbWFyZ2luTGVmdDoiMHB4IixtaW5IZWlnaHQ6IjI5NnB4IixiYWNrZ3JvdW5kUG9zaXRpb246ImNlbnRlciAwcHgifX0sb25Nb3VzZVVwOigpPT57dHx8by5zZXRQYXRoKEdnKGUpKX19LG49PT0ibXVzdC1yZWFkIj9udWxsOmlyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChnNCx7d2lkdGg6cix0ZXh0OmUuaGVhZGxpbmV9KSksaXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIixzdHlsZTp7bWF4V2lkdGg6bj09PSJtdXN0LXJlYWQiPyI0MCUiOiIzMyUiLGZsZXhXcmFwOiJ3cmFwIixwYWRkaW5nUmlnaHQ6IjI2cHgiLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21pbldpZHRoOiIxMDAlIixwYWRkaW5nTGVmdDoiMTZweCIscGFkZGluZ1JpZ2h0OiIxNnB4IixnYXA6IjZweCJ9fX0saXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KExzLHtpZDplLmlkfSksaXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Imh2In0pLGlyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSx7c3R5bGU6e2Rpc3BsYXk6bj09PSJtdXN0LXJlYWQiPyJibG9jayI6Im5vbmUiLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2Rpc3BsYXk6ImJsb2NrIn0sbWFyZ2luQm90dG9tOm49PT0ibXVzdC1yZWFkIj8iMjRweCI6bnVsbH19LGlyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChobix7YXJ0aWNsZTplfSxlLmhlYWRsaW5lKSksaXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgsbnVsbCwoMCx5NC5wcmV0dHlEYXRlKShlLnB1Ymxpc2hEYXRlLCJkYXRlLXRpbWUtaHVtYW4iKSxpci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQod3Mse3N0eWxlOnttYXJnaW5MZWZ0OjR9LGFydGljbGU6ZX0pKSxpci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7Z2FwOjEyLHN0eWxlOnttYXJnaW5Ub3A6OCxtYXJnaW5Cb3R0b206MjB9LGFsaWduOiJzdGFydCIsanVzdGlmeToic3RhcnQifSxpci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUHQse2ZpZWxkOmUuc2VjdGlvbixzZWN0aW9uOiJzZWN0aW9uIn0pLGlyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQdCx7ZmllbGQ6ZS5hcnRpY2xlVHlwZSxzZWN0aW9uOiJhcnRpY2xlLXR5cGUifSkpLGlyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvbix7dGV4dDplLmFic3RyYWN0fSksaXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGhuLHthcnRpY2xlOmUsbGFiZWw6IlJlYWQgaXQifSkpKX07dmFyIFp5PXcoVCgpLDEpO3ZhciB2ND0oe3ZhcmlhbnQ6ZSxzZXRTaG93SW5kZXg6dCxkYXRhOnIsc2hvd0luZGV4Om59KT0+ZT09PSJtdXN0LXJlYWQiP251bGw6WnkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2p1c3RpZnk6ImJldHdlZW4iLHN0eWxlOnttYXJnaW5Ub3A6IjI0cHgiLG1hcmdpbkJvdHRvbToiMjRweCIscGFkZGluZ0xlZnQ6IjI2cHgiLHBhZGRpbmdSaWdodDoiMjZweCIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZ0xlZnQ6IjE2cHgiLG1hcmdpbkJvdHRvbToiMTJweCJ9fX0sWnkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGRlLHtzdHlsZTp7ZmxleEdyb3c6MX0sc2luZ2xlTGluZTohMH0sZT09PSJ0b3Atc3RvcmllcyI/IlRvcCBzdG9yaWVzIjoiTXVzdCByZWFkIikpO3ZhciB1Yz0oe3NlY3Rpb246ZSx2YXJpYW50OnR9KT0+e2xldFtyLG5dPSgwLHR0LnVzZVN0YXRlKSgwKSxbbyxpXT0oMCx0dC51c2VTdGF0ZSkoITEpLFtsLHNdPSgwLHR0LnVzZVN0YXRlKSghMSksW2EsdV09KDAsdHQudXNlU3RhdGUpKG51bGwpLFtwLGNdPSgwLHR0LnVzZVN0YXRlKSgwKSxmPWduKCkud2lkdGgsZD1kNCgoe3dpZHRoOk59KT0+e2MoTil9KSxtPSgwLHR0LnVzZVJlZikoKSx7ZGF0YTpoLGxvYWRpbmc6U309cGUoImdldC1jYXJvdXNlbCIsZT97c2VjdGlvbjplLHZhcmlhbnQ6dH06e3ZhcmlhbnQ6dH0pLHk9ZT9oPy5tdXN0UmVhZD8uc29ydCgoTixMKT0+TC5oaXRzLU4uaGl0cykuZmlsdGVyKChOLEwpPT5MPD00KS5maWx0ZXIoTj0+Ti5pbWcpOmg/Llt0PT09InRvcC1zdG9yaWVzIj8iY2Fyb3VzZWwiOiJtdXN0UmVhZCJdLHY9Tj0+e04uYnV0dG9uPT09MCYmKHUoTi5wYWdlWCksaSghMCkpfSxnPU49Pnt1KE4udGFyZ2V0VG91Y2hlc1swXS5wYWdlWCksaSghMCl9LEM9Tj0+e2lmKG8pe2xldCBMPU4uY2xpZW50WC1hO20uY3VycmVudC5zdHlsZS50cmFuc2Zvcm09XGB0cmFuc2xhdGUzZCgke0x9cHgsIDBweCwgMHB4KVxgLE1hdGguYWJzKGEtTi5wYWdlWCk+MjAmJnMoITApfX0saz1OPT57aWYobyl7bGV0IEw9Ti50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYLWE7bS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1cYHRyYW5zbGF0ZTNkKCR7TH1weCwgMHB4LCAwcHgpXGAsTWF0aC5hYnMoYS1OLnBhZ2VYKT4yMCYmcyghMCl9fSxEPU49PntNYXRoLmFicyhhLU4ucGFnZVgpPjEwMD8obS5jdXJyZW50LnN0eWxlLnRyYW5zaXRpb249IjAuMnMiLGEtTi5wYWdlWD4wPyhtLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPVxgdHJhbnNsYXRlM2QoJHstcH1weCwgMHB4LCAwcHgpXGAsc2V0VGltZW91dCgoKT0+e20uY3VycmVudC5zdHlsZS50cmFuc2l0aW9uPSIwcyIsbS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoMHB4LCAwcHgsIDBweCkiLHI9PT15Lmxlbmd0aC0xP24oMCk6bihyKzEpfSwyMDApKTphLU4ucGFnZVg8MCYmKG0uY3VycmVudC5zdHlsZS50cmFuc2Zvcm09XGB0cmFuc2xhdGUzZCgke3B9cHgsIDBweCwgMHB4KVxgLHNldFRpbWVvdXQoKCk9PnttLmN1cnJlbnQuc3R5bGUudHJhbnNpdGlvbj0iMHMiLG0uY3VycmVudC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpIixuKHI9PT0wP3kubGVuZ3RoLTE6ci0xKX0sMjAwKSkpOm0uY3VycmVudC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKDAsMCwwKSIsaSghMSkscyghMSl9LE89Tj0+e01hdGguYWJzKGEtTi5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCk+NzU/KG0uY3VycmVudC5zdHlsZS50cmFuc2l0aW9uPSIwLjJzIixhLU4uY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg+MD8obS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1cYHRyYW5zbGF0ZTNkKCR7LWZ9cHgsIDBweCwgMHB4KVxgLHNldFRpbWVvdXQoKCk9PnttLmN1cnJlbnQuc3R5bGUudHJhbnNpdGlvbj0iMHMiLG0uY3VycmVudC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpIixyPT09eS5sZW5ndGgtMT9uKDApOm4ocisxKX0sMjAwKSk6YS1OLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYPDAmJihtLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPVxgdHJhbnNsYXRlM2QoJHtmfXB4LCAwcHgsIDBweClcYCxzZXRUaW1lb3V0KCgpPT57bS5jdXJyZW50LnN0eWxlLnRyYW5zaXRpb249IjBzIixtLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KSIsbihyPT09MD95Lmxlbmd0aC0xOnItMSl9LDIwMCkpKTptLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwLDAsMCkiLGkoITEpLHMoITEpfTtpZighKFN8fCF5KSlyZXR1cm4gdHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImMgZmogZmsgZmwgZm0iLHN0eWxlOntwYWRkaW5nVG9wOnQ9PT0ibXVzdC1yZWFkIj80ODowfX0sdHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHY0LHtkYXRhOnksdmFyaWFudDp0LHNldFNob3dJbmRleDpuLHNob3dJbmRleDpyfSksdHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2p1c3RpZnk6ImNlbnRlciIscmVmOm0sYWxpZ246InN0YXJ0IixvblRvdWNoU3RhcnQ6Tj0+ZyhOKSxvblRvdWNoTW92ZTpOPT5rKE4pLG9uVG91Y2hFbmQ6Tyxvbk1vdXNlRG93bjpOPT52KE4pLG9uTW91c2VNb3ZlOk49PkMoTiksb25Nb3VzZVVwOkQsc3R5bGU6e3dpZHRoOiIxMDAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZTNkKDBweCwwcHgsMHB4KSJ9fSx5Lm1hcCgoTixMKT0+TD09PXImJnR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIGFiIixyZWY6ZCxrZXk6TH0sdHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCRkLHt2YXJpYW50OnQsd2lkdGg6cCxtb3Zpbmc6bCxhcnRpY2xlOnlbTD09PTA/eS5sZW5ndGgtMTpMLTFdfSksdHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCRkLHt2YXJpYW50OnQsbW92aW5nOmwsYXJ0aWNsZTpOLHdpZHRoOnB9KSx0dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoJGQse3ZhcmlhbnQ6dCx3aWR0aDpwLG1vdmluZzpsLGFydGljbGU6eVtMPT09eS5sZW5ndGgtMT8wOkwrMV19KSkpKSx0dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7Zml0Q29udGVudDohMCxqdXN0aWZ5OiJlbmQiLGdhcDoxNixzdHlsZTp7bWFyZ2luVG9wOiIyNHB4IixwYWRkaW5nTGVmdDoiMjZweCIscGFkZGluZ1JpZ2h0OiIyNnB4IiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntwYWRkaW5nTGVmdDoiMTZweCIsbWFyZ2luQm90dG9tOiIxMnB4In19fSx0dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7Y29sb3I6Im9yYW5nZSIsb25DbGljazooKT0+e24ocj09PTA/eS5sZW5ndGgtMTpyLTEpfSxzaXplOiJkb3QtbGFyZ2UifSx0dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVW8se3N0eWxlOnt0cmFuc2Zvcm06InJvdGF0ZSgxODBkZWcpIn19KSksdHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOiJvcmFuZ2UiLG9uQ2xpY2s6KCk9PntyPT09eS5sZW5ndGgtMT9uKDApOm4ocisxKX0sc2l6ZToiZG90LWxhcmdlIn0sdHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFVvLG51bGwpKSkpfTt2YXIgRTg9KHtkYXRhOmV9KT0+cWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImMgYiBieCBieSIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2ZsZXhEaXJlY3Rpb246ImNvbHVtbiIsbWFyZ2luQm90dG9tOiIwcHgiLGhlaWdodDplPy5zcG9uc29ycz8ubGVuZ3RoPyI0MDBweCI6IjMwMHB4In19fSxxZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYnogYzAgYzEgYiBwIHYgYWIgYzIgYzMiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttYXhXaWR0aDoiMTAwJSJ9fX0scWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFZjLHtjb2xvcjoibmF2eSJ9LGU/LnRpdGxlKSxlPy5kZXNjcmlwdGlvbj9xZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyx7Y29sb3I6Im5hdnkiLHN0eWxlOnt0ZXh0QWxpZ246ImNlbnRlciIsbWFyZ2luVG9wOjEyfX0sZT8uZGVzY3JpcHRpb24pOm51bGwpLHFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJheiBjNCBjMSBjNSBiIHYgcCBhYiBjNiIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2hlaWdodDplPy5zcG9uc29ycz8ubGVuZ3RoPyIxMDAlIjoiMCUiLG1heFdpZHRoOiIxMDAlIixwYWRkaW5nOiIzMHB4IDBweCJ9fX0sZT8uc3BvbnNvcnM/Lmxlbmd0aD9xZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyxudWxsLCJUaGlzIHNlY3Rpb24gaXMgc3VwcG9ydGVkIGJ5OiIpOm51bGwscWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImE3IGIgYzcgdiBhYiBhcSJ9LGU/LnNwb25zb3JzPy5tYXAoKHQscik9PnFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYSIse2tleTpyLGhyZWY6dD8udXJsLHRhcmdldDoiX2JsYW5rIn0scWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJpbWciLHt3aWR0aDoyMDAsdGl0bGU6dD8udGl0bGUsc3JjOnZyKHQ/LmxvZ28/LnNyYywhMSwyMDApfSkpKSkpKSxKeT0oe2lkOmV9KT0+e2xldHtkYXRhOnQsbG9hZGluZzpyfT1wZSgiZ2V0LXNlY3Rpb24tYnktaWQiLHtpZDplfSk7aWYodD8uJGlzTnVsbClyZXR1cm4gcWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEZkLG51bGwpO2lmKHIpcmV0dXJuIG51bGw7bGV0IG49dD8udHlwZT09PSJhcnRpY2xlVHlwZSI7cmV0dXJuIHFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiJ9LG4/bnVsbDpxZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoRTgse2RhdGE6dH0pLHQudGl0bGU9PT0iRVUgRWxlY3Rpb25zIj9xZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYyBiIHAgdiBjOCBjOSJ9LHFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmlmcmFtZSx7Y2xhc3NOYW1lOiJmbG91cmlzaC1lbWJlZC1pZnJhbWUgY2EgY2IiLHNyYzoiaHR0cHM6Ly9mbG8udXJpLnNoL3Zpc3VhbGlzYXRpb24vMTczMjI1OTEvZW1iZWQiLHRpdGxlOiJJbnRlcmFjdGl2ZSBvciB2aXN1YWwgY29udGVudCIsZnJhbWVCb3JkZXI6IjAiLHNjcm9sbGluZzoibm8iLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxNTAwcHgifX0sc2FuZGJveDoiYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctZm9ybXMgYWxsb3ctc2NyaXB0cyBhbGxvdy1kb3dubG9hZHMgYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy10b3AtbmF2aWdhdGlvbi1ieS11c2VyLWFjdGl2YXRpb24ifSkscWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImNjIGNkIGNlIn0scWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJhIix7Y2xhc3NOYW1lOiJmbG91cmlzaC1jcmVkaXQgY2YiLGhyZWY6Imh0dHBzOi8vcHVibGljLmZsb3VyaXNoLnN0dWRpby92aXN1YWxpc2F0aW9uLzE3MzIyNTkxLz91dG1fc291cmNlPWVtYmVkJnV0bV9jYW1wYWlnbj12aXN1YWxpc2F0aW9uLzE3MzIyNTkxIix0YXJnZXQ6Il90b3AifSxxZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImltZyIse2FsdDoiTWFkZSB3aXRoIEZsb3VyaXNoIixzcmM6Imh0dHBzOi8vcHVibGljLmZsb3VyaXNoLnN0dWRpby9yZXNvdXJjZXMvbWFkZV93aXRoX2Zsb3VyaXNoLnN2ZyJ9KSkpKTpudWxsLHFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh6aSx7c3RhcnRMaW1pdDpuPzEwOjcsdHlwZTp0Py50eXBlLHNlY3Rpb246dCxzdHlsZTp7bWFyZ2luOiI5NnB4IGF1dG8ifX0pLHFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjIGNnIGNoIHcgY2kgYTAifSkscWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGJlLG51bGwsbj9udWxsOnFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1Yyx7dmFyaWFudDoibW9zdC1yZWFkIixzZWN0aW9uOlt7dGl0bGU6dD8udGl0bGUsaWQ6ZX1dfSkpKX07dmFyIGpkPXcoVCgpLDEpO3ZhciB4ND0oe2lkOmV9KT0+e2xldHtkYXRhOnQsbG9hZGluZzpyfT1wZSgiZ2V0LXN0YXRpYyIse2lkOmV9KTtpZighcilyZXR1cm4gamQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGJlLHtzdHlsZTp7bWF4V2lkdGg6MTAwNixwYWRkaW5nVG9wOjkwLHBhZGRpbmdCb3R0b206OTAsbWFyZ2luOiI5NnB4IGF1dG8iLGJvcmRlcjoiMXB4IHNvbGlkIGJsYWNrIiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7cGFkZGluZzoiMzJweCAxNnB4ICFpbXBvcnRhbnQiLG1hcmdpbjoiMHB4Iixib3JkZXI6Im5vbmUifX19LGpkLmRlZmF1bHQuY3JlYXRlRWxlbWVudChWYyx7Y29sb3I6Im5hdnkiLHN0eWxlOnt3aWR0aDoiMTAwJSIsbWF4V2lkdGg6NjIwLG1hcmdpbjoiMCBhdXRvIixtYXJnaW5Cb3R0b206IjMycHgifX0sdD8udGl0bGUpLGpkLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvbix7dGV4dDp0Py5ib2R5LHN0eWxlOnttYXJnaW46IjAgYXV0byIsbWF4V2lkdGg6NjIwfX0pKX07dmFyIHJ0PXcoVCgpLDEpO3ZhciBXZD13KFQoKSwxKTt2YXIgQmk9dyhUKCksMSk7dmFyIHc0PSgpPT5CaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiaGUgYzIgaGYiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixwYWRkaW5nTGVmdDoiMjZweCIscGFkZGluZ1JpZ2h0OiIyNnB4IixwYWRkaW5nVG9wOiI2MHB4IixwYWRkaW5nQm90dG9tOiI2MHB4In19fSxCaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7ZGlyZWN0aW9uOiJjb2x1bW4iLHN0eWxlOnttYXhXaWR0aDo4MDB9LGdhcDoyNH0sQmkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGRlLHtjb2xvcjoibmF2eSJ9LCJHZXQgRVUgbmV3cyB0aGF0IG1hdHRlcnMuIixCaS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImJyIixudWxsKSwiQmVjb21lIGEgbWVtYmVyIHRvZGF5LiIpLEJpLmRlZmF1bHQuY3JlYXRlRWxlbWVudChodCxudWxsLCJTaW5jZSAyMDAwLCBFVW9ic2VydmVyIGlzIHRoZSBwcmVtaWVyLCBtZW1iZXItc3VwcG9ydGVkLCBub24tcHJvZml0IG5ld3Mgc2l0ZSBvbiBFVSBhZmZhaXJzLiBPdXIgY2l2aWMgam91cm5hbGlzbSBrZWVwcyBwb3dlciBpbiBjaGVjayBhbmQgcHJvdmlkZXMgYSB2b2ljZSBmb3IgdGhvc2Ugbm90IGhlYXJkLiIpLEJpLmRlZmF1bHQuY3JlYXRlRWxlbWVudChodCxudWxsLCJXZSBhcmUgbm90IG93bmVkIGJ5IGNvcnBvcmF0aW9ucyBvciBiaWxsaW9uYWlyZXMuIEJ5IGJlY29taW5nIGEgc3VwcG9ydGluZyBtZW1iZXIgeW91J3JlIGJhY2tpbmcgb3VyIGluZGVwZW5kZW50IGpvdXJuYWxpc20uIiksQmkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGpmLG51bGwpKSk7dmFyIFFlPXcoVCgpLDEpO3ZhciBjYz13KFQoKSwxKTt2YXIgZTE9KHtwcmljZTplLHBlcmlvZDp0LHdoaXRlOnIsb25DbGljazpufSk9PmNjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtvbkNsaWNrOm4sYWxpZ246ImNlbnRlciIsanVzdGlmeToiY2VudGVyIixkaXJlY3Rpb246ImNvbHVtbiIsZ2FwOjEyLHN0eWxlOntib3JkZXJSYWRpdXM6IjhweCIsYm9yZGVyOnI/IjFweCBzb2xpZCB2YXIoLS1uYXZ5KSI6dm9pZCAwLGJhY2tncm91bmQ6cj8idmFyKC0td2hpdGUpIjoidmFyKC0tbmF2eSkiLGhlaWdodDoxOTMsd2lkdGg6MTkzLGN1cnNvcjoicG9pbnRlciIsIiY6aG92ZXIiOntiYWNrZ3JvdW5kOiJ2YXIoLS1vcmFuZ2UpIixib3JkZXI6IjFweCBzb2xpZCB2YXIoLS1vcmFuZ2UpIn0sIiY6aG92ZXIgPiAqICAiOntjb2xvcjoidmFyKC0td2hpdGUpICFpbXBvcnRhbnQifSwiJjpob3ZlciA+ICAuZGl2aWRlciI6e2JhY2tncm91bmQ6InZhcigtLXdoaXRlKSJ9fX0sY2MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJjLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiZmxleC1lbmQiLG1hcmdpbkJvdHRvbToiMTBweCIsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7Zm9udFNpemU6IjQwcHgiLGxpbmVIZWlnaHQ6IjQ2cHgiLHRleHRBbGlnbjoibGVmdCJ9fSxjb2xvcjpyPyJuYXZ5Ijoid2hpdGUifSwiXHUyMEFDIixlKSxjYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZGl2aWRlciBqOCBqOSIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjpyPyJ2YXIoLS1uYXZ5KSI6InZhcigtLXdoaXRlKSJ9fSksY2MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5uLHtjb2xvcjpyPyJuYXZ5Ijoid2hpdGUifSx0KSk7dmFyIHQxPXcoVCgpLDEpO3ZhciByMT0oe2NoaWxkcmVuOmUsb25DbGljazp0fSk9PnQxLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJjIGViIGIgdiBhYiBoYyBqNiBqNyBmdyBkcyIsb25DbGljazp0LHN0eWxlOnsiJjpob3ZlciI6e2JhY2tncm91bmRDb2xvcjoidmFyKC0tb3JhbmdlKSJ9fX0sdDEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEose2NvbG9yOiJpbmhlcml0In0sZSkpO3ZhciBTND0oKT0+e2xldCBlPWooKTtyZXR1cm4gUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIixqdXN0aWZ5OiJjZW50ZXIiLGdhcDozMixhbGlnbjoiY2VudGVyIixzdHlsZTp7YmFja2dyb3VuZENvbG9yOiJ2YXIoLS1iZzIpIixwYWRkaW5nOiI2MHB4IiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA4MjRweCkiOntwYWRkaW5nTGVmdDoiMjZweCAhaW1wb3J0YW50IixwYWRkaW5nUmlnaHQ6IjI2cHggIWltcG9ydGFudCIscGFkZGluZ1RvcDoiNjBweCIscGFkZGluZ0JvdHRvbToiNjBweCJ9fX0sUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIixnYXA6MjR9LFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246InJvdyIsYWxpZ246ImNlbnRlciIsanVzdGlmeToiY2VudGVyIixnYXA6MTJ9LFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChlMSx7b25DbGljazooKT0+e2Uuc2V0UGF0aCh7c2VjdGlvbjoicmVnaXN0ZXIiLGlkOiJtb250aGx5In0pfSx3aGl0ZTohMSxwcmljZToxMSxwZXJpb2Q6Im1vbnRobHkifSksUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGUxLHtvbkNsaWNrOigpPT57ZS5zZXRQYXRoKHtzZWN0aW9uOiJyZWdpc3RlciJ9KX0sd2hpdGU6ITAscHJpY2U6OTAscGVyaW9kOiJ5ZWFybHkifSkpLFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtqdXN0aWZ5OiJjZW50ZXIiLGdhcDoxMn0sUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImhiIGV2IGhjIn0pLFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSxudWxsLCJPUiIpLFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJoYiBldiBoYyJ9KSkpLFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiIsZ2FwOjgsanVzdGlmeToiY2VudGVyIixhbGlnbjoiY2VudGVyIn0sUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHIxLHtvbkNsaWNrOigpPT5lLnNldFBhdGgoe3NlY3Rpb246InJlZ2lzdGVyIixpZDoic3R1ZGVudCJ9KX0sUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFFlLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCwiWW91bmdlciB0aGFuIDI1PyIsIiAiLFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYiIse2NsYXNzTmFtZToiZHUgaGQifSwiXHUyMEFDMS8gbW9udGgiKSkpLFFlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChyMSx7b25DbGljazooKT0+ZS5zZXRQYXRoKHtzZWN0aW9uOiJyZWdpc3RlciIsaWQ6Imdyb3VwIn0pfSxRZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUWUuZGVmYXVsdC5GcmFnbWVudCxudWxsLCJJbnN0aXR1dGlvbmFsIG1lbWJlcnNoaXA/IixRZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImIiLHtzdHlsZTp7bWFyZ2luTGVmdDoiNnB4Iix0ZXh0RGVjb3JhdGlvbjoidW5kZXJsaW5lIn19LCJDbGljayBoZXJlIikpKSksUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIixhbGlnbjoiY2VudGVyIixnYXA6OH0sUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5uLHtjb2xvcjoiYmxhY2sifSwiTm90IGNvbnZpbmNlZCB5ZXQ/IiksUWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHpmLG51bGwpKSl9O3ZhciBDND0oKT0+V2QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImY3IGIgYzYiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA4MjRweCkiOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX19LFdkLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh3NCxudWxsKSxXZC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUzQsbnVsbCkpO3ZhciBLZT13KFQoKSwxKTt2YXIgUDg9KGUsdCxyKT0+Wy4uLmVdLnNvcnQoKG4sbyk9PnQucmVkdWNlKChpLGwscyk9PntpZihpPT09MCl7bGV0W2EsdV09ciYmcltzXT09PSJkZXNjIj9bb1tsXSxuW2xdXTpbbltsXSxvW2xdXTtpPWE+dT8xOmE8dT8tMTowfXJldHVybiBpfSwwKSksVDQ9KHtzdHlsZTplfSk9PntsZXR7ZGF0YTp0LGxvYWRpbmc6cn09cGUoImdldC1hZ2VuZGEiKSxuPXI/W106UDgodD8uZGF0YSxbImRhdGUiXSxbImFzYyIsImRlc2MiXSksW28saV09KDAsS2UudXNlU3RhdGUpKDApLHt3aWR0aDpsfT1nbigpO3JldHVybigwLEtlLnVzZUVmZmVjdCkoKCk9PnsobDw0ODB8fGw8ODAwKSYmaSgwKX0sW2xdKSxLZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToidyBjIGFuIGE1IGY5IGZhIixzdHlsZTp7Li4uZX19LEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiIGZiIGZjIGZkIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDoxMDI0cHgpIjp7bWFyZ2luQm90dG9tOiIyNHB4IixnYXA6IjI0cHgifX19LEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJmZSBmZiBjIGZnIn0pLEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSx7Y29sb3I6Im9yYW5nZSJ9LCJBZ2VuZGEiKSksS2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse3N0eWxlOnt3aWR0aDoiMTAwJSIscG9zaXRpb246InJlbGF0aXZlIixvdmVyZmxvd1g6ImhpZGRlbiJ9fSxLZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7YWxpZ246InN0YXJ0IixzdHlsZTp7dHJhbnNmb3JtOlxgdHJhbnNsYXRlWCgtJHtvfSUpXGAsdHJhbnNpdGlvbjoidHJhbnNmb3JtIDAuM3MgZWFzZS1pbiIsd2lkdGg6IjEwMCUifX0sbj8ubWFwKChzLGEpPT57bGV0IHU9cy5zcmM/eC5hOnguZGl2O3JldHVybiBLZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodSx7dGFyZ2V0OiJfYmxhbmsiLGhyZWY6cy5zcmMsa2V5OmEsc3R5bGU6e21pbldpZHRoOiIyNSUiLHRleHREZWNvcmF0aW9uOiJub25lIixwYWRkaW5nTGVmdDoxNixwYWRkaW5nUmlnaHQ6MTYsYm9yZGVyTGVmdDoiMnB4IHNvbGlkIHZhcigtLW9yYW5nZSkiLGhlaWdodDoiZml0LWNvbnRlbnQiLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6MTAyNHB4KSI6e21pbldpZHRoOiIzNCUifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttaW5XaWR0aDoiNTAlIn19fSxLZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBhcSJ9LEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYLHtib2xkOiEwLGNvbG9yOiJvcmFuZ2UifSxLZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVmUsbnVsbCxLZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImIiLG51bGwsbmV3IERhdGUocy5kYXRlKS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksIi4iLChuZXcgRGF0ZShzLmRhdGUpLmdldE1vbnRoKCkrMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIikpKSkpLEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChodCx7c3R5bGU6e21hcmdpblRvcDo2fX0scy5oZWFkbGluZSkpfSkpKSxLZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7anVzdGlmeToiZW5kIixnYXA6MTYsc3R5bGU6e21hcmdpblRvcDo0OCwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjEwMjRweCkiOnttYXJnaW5Ub3A6IjI0cHgifX19LEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtjb2xvcjoib3JhbmdlIixzaXplOiJkb3QtbGFyZ2UiLG9uQ2xpY2s6KCk9PntvPj0xMDAmJmkoby0xMDApfX0sS2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFVvLHtzdHlsZTp7dHJhbnNmb3JtOiJyb3RhdGUoMTgwZGVnKSJ9fSkpLEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtjb2xvcjoib3JhbmdlIixzaXplOiJkb3QtbGFyZ2UiLG9uQ2xpY2s6KCk9PntsZXQgcz1sPDQ4MD81MDpsPDgwMD8zMzoyNTtuLmxlbmd0aCpzPm8rMTAwJiZpKG8rMTAwKX19LEtlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChVbyxudWxsKSkpKX07dmFyIFZ0PXcoVCgpLDEpO3ZhciBNOD0oe3N0YWtlaG9sZGVySGlnaGxpZ2h0OmUsaGVhZGxpbmU6dD0iVGhpcyBpcyBhIGhlYWRsaW5lIixzcmM6cj0iIixsZW5ndGg6bixpbmRleDpvfSk9PlZ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYSIse2NsYXNzTmFtZToiZTEgYyBiIixocmVmOnIsdGFyZ2V0OiJfYmxhbmsifSxWdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5saSx7Y2xhc3NOYW1lOiJ2IGZoIG4gYyBiIixzdHlsZTp7YmFja2dyb3VuZDplPyJ2YXIoLS1iZzEpIjpudWxsLGJvcmRlclRvcDpvPT09MD8iMnB4IHNvbGlkIGJsYWNrIjoiMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4xMikiLGJvcmRlckJvdHRvbTpvPT09bj8iMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4xMikiOnZvaWQgMCwiJjpob3ZlciI6e2JhY2tncm91bmQ6InJnYmEoMjQwLCA4MiwgNjAsIDAuMDYpIn0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7ZmxleERpcmVjdGlvbjoicm93LXJldmVyc2UiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiIyNHB4IDBweCJ9fX0sVnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse3NpemU6ImRvdCIsY29sb3I6Im9yYW5nZSIsc3R5bGU6e21hcmdpbkxlZnQ6MTksbWluV2lkdGg6IjIxcHgiLG1pbkhlaWdodDoiMjFweCJ9LG9uQ2xpY2s6KCk9Pnt9fSxWdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeGksbnVsbCkpLFZ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJmaSBjcCBiIHAgcSIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjhweCJ9fX0sVnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5uLHtzdHlsZTp7bWFyZ2luQm90dG9tOiI0cHgifX0sdCksVnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse3NpbmdsZUxpbmU6ITB9LHI/LnN1YnN0cmluZygwLDUyKSxyLmxlbmd0aD41Mj8iLi4uIjoiIiksVnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgdCB1IHYifSxlP1Z0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBcyx7aGlnaGxpZ2h0OiEwfSk6bnVsbCkpKSksXzQ9KHt9KT0+e2xldFtlLHRdPSgwLFZ0LnVzZVN0YXRlKSg1KSx7ZGF0YTpyfT1wZSgiZ2V0LXRpY2tlcnMiKTtyZXR1cm4gVnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImMgdyJ9LFZ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSx7c3R5bGU6e21hcmdpbkJvdHRvbToxNn19LCJUaWNrZXIiKSxWdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInVsIix7Y2xhc3NOYW1lOiJjIGIgcCJ9LHI/LmRhdGE/LmZpbHRlcigobixvKT0+bzw9ZSkubWFwKChuLG8pPT5WdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTTgse2tleTpvLHNyYzpuPy5zcmMsaW5kZXg6byxoZWFkbGluZTpuPy5oZWFkbGluZT8uZW4sbGVuZ3RoOnIubGVuZ3RoLHN0YWtlaG9sZGVySGlnaGxpZ2h0Om4uaGlnaGxpZ2h0fSkpKSxWdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblRvcDo0Mn0sb25DbGljazooKT0+e2U8NTAmJnQoZSs1KX19LCJNb3JlIikpfTt2YXIgSTg9KCk9PntsZXQgZT1UZSgpO3JldHVybiB0YSgpP3J0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7aWQ6Il9fQ1RBIn0pOnJ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7aWQ6Il9fQ1RBIn0sIWUudXNlcklkJiYhZS5pcEFjY2Vzcz9ydC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQzQsbnVsbCk6bnVsbCwhZS51c2VySWQmJiFlLmlwQWNjZXNzP3J0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChhbyx7aGVpZ2h0OjEwMCxtb2JpbGVIZWlnaHQ6IjBweCJ9KTpudWxsKX0sazQ9KCk9PnJ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChydC5kZWZhdWx0LkZyYWdtZW50LG51bGwscnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEk4LG51bGwpLHJ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1Yyx7dmFyaWFudDoidG9wLXN0b3JpZXMifSkscnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFvLHtoZWlnaHQ6MTAwLG1vYmlsZUhlaWdodDoiMzBweCJ9KSxydC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoemkse3N0YXJ0TGltaXQ6N30pLHJ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChhbyx7aGVpZ2h0OjEwMH0pLHJ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChUNCxudWxsKSxydC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUGYsbnVsbCkscnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse3N0eWxlOntwYWRkaW5nOjIwLGdhcDo0MiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntnYXA6MH19LGFsaWduOiJjZW50ZXIifSxydC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiaiIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2Rpc3BsYXk6Im5vbmUifX19LHJ0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChNZixudWxsKSkscnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF80LG51bGwpKSxydC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYW8se2hlaWdodDo3Nixtb2JpbGVIZWlnaHQ6IjMwcHgifSkscnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHVjLHt2YXJpYW50OiJtdXN0LXJlYWQifSkscnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFvLHtoZWlnaHQ6MTAwLG1vYmlsZUhlaWdodDoiMHB4In0pKTt2YXIgb2U9dyhUKCksMSk7dmFyIE40PXcoU2koKSwxKTt2YXIgTDg9KHtkYXRhOmV9KT0+b2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGhuLHthcnRpY2xlOmUsc3R5bGU6e3dpZHRoOiIxMDAlIn19LG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmxpLHtjbGFzc05hbWU6ImsgbCBtIG4gYyBiIG8iLHN0eWxlOnsiJjpob3ZlciI6e2JhY2tncm91bmQ6InJnYmEoMjQwLCA4MiwgNjAsIDAuMDYpIn19fSxvZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVGYse3N0eWxlOnttYXJnaW5Ub3A6IjUycHgifX0pLG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIHAgcSByIn0sb2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgcyJ9LG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChndCxudWxsLCgwLE40LnByZXR0eURhdGUpKGU/LnB1Ymxpc2hEYXRlLCJkYXRlLXRpbWUtaHVtYW4iKSkpLG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLG51bGwsZT8udGl0bGUpLG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIHQgdSB2In0sb2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse3N0eWxlOnt0ZXh0VHJhbnNmb3JtOiJjYXBpdGFsaXplIix0ZXh0RGVjb3JhdGlvbjoidW5kZXJsaW5lIn0sY29sb3I6Im9yYW5nZSJ9LGU/LmFydGljbGVUeXBlPy5bMF0/LnRpdGxlKSxvZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7c3R5bGU6e3RleHRUcmFuc2Zvcm06ImNhcGl0YWxpemUiLHRleHREZWNvcmF0aW9uOiJ1bmRlcmxpbmUifSxjb2xvcjoib3JhbmdlIn0sZT8uc2VjdGlvbj8uWzBdPy50aXRsZSkpLG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChodCx7c3R5bGU6e21hcmdpblRvcDoxOCxvcGFjaXR5Om9wZW4/MTowLHRyYW5zaXRpb246IjAuNXMifX0sZT8uYWJzdHJhY3QpKSkpLEE4PSh7ZGF0YTplfSk9Pm9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChTdSx7c3R5bGU6e3dpZHRoOiIxMDAlIn0scGF0aDp7c2VjdGlvbjoiYmlvIixpZDplPy5pZH19LG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmxpLHtjbGFzc05hbWU6InYgayBsIG0gbiBjIGIgbyIsc3R5bGU6eyImOmhvdmVyIjp7YmFja2dyb3VuZDoicmdiYSgyNDAsIDgyLCA2MCwgMC4wNikifX19LG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChDcyx7c3R5bGU6e21hcmdpblRvcDoiMjhweCJ9fSksb2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgcCBxIHIifSxvZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyxudWxsLGU/LnRpdGxlKSxvZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWCx7c3R5bGU6e21hcmdpblRvcDo0LHRleHRUcmFuc2Zvcm06ImNhcGl0YWxpemUifSxjb2xvcjoib3JhbmdlIn0sZT8ucm9sZSkpKSksYjQ9KHtpZDplfSk9PntsZXRbdCxyXT0oMCxvZS51c2VTdGF0ZSkoW10pLG49KDAsb2UudXNlTWVtbykoKCk9PmRlY29kZVVSSUNvbXBvbmVudChlPz8iIiksW2VdKSxvPVUoKTtyZXR1cm4oMCxvZS51c2VFZmZlY3QpKCgpPT57bGV0IGk9ITE7cmV0dXJuKGFzeW5jKCk9PntpZihuKXtsZXQgcz1hd2FpdCBvLmNhbGwoImdldC1zZWFyY2gtcmVzdWx0cyIse3F1ZXJ5Om59KTtpfHxyKE5mKHMpKX1lbHNlIHIoW10pfSkoKSwoKT0+e2k9ITB9fSxbbl0pLG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJjIHcgeCB5IGIgcCIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3BhZGRpbmdUb3A6IjI0cHgifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7cGFkZGluZ0xlZnQ6IjE2cHgiLHBhZGRpbmdSaWdodDoiMTZweCJ9fX0sb2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InogYTAgYiBpIHYgYTEiLHN0eWxlOntib3JkZXJCb3R0b206XGAycHggc29saWQgJHtiKCJuYXZ5Iil9XGB9fSxvZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZGUse3N0eWxlOnttYXJnaW5SaWdodDo2fSxzaW5nbGVMaW5lOiEwfSxuPT09IiI/b2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG9lLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCwiU2VhcmNoIik6b2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG9lLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCwiU2VhcmNoIHJlc3VsdHMgZm9yIiwiICIsb2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguc3Bhbix7Y2xhc3NOYW1lOiJhMiIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e21hcmdpbkxlZnQ6Mn0sY29sb3I6Yigib3JhbmdlIil9fSxuKSkpKSxvZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBwIGEzIHYgYTQifSx0Py5tYXAoKGksbCk9PmkudHlwZT09PSJhcnRpY2xlIj9vZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTDgse2RhdGE6aSxrZXk6bH0pOm9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBOCx7ZGF0YTppLGtleTpsfSkpLG9lLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLHtzdHlsZTp7bWFyZ2luVG9wOjQwfX0sdC5sZW5ndGg9PT0wPyJObyByZXN1bHRzIGZvdW5kIjoiIikpKX07dmFyIFR0PXcoVCgpLDEpO3ZhciBoZT13KFQoKSwxKTt2YXIgcGM9dyhUKCksMSk7dmFyIFo9KHttYXhMZW5ndGg6ZSx2YWx1ZTp0LHNldFZhbHVlOnIsbmFtZTpuLHR5cGU6byxsYWJlbDppLHJlcXVpcmVkOmwsc3R5bGU6cyxkaXNhYmxlZDphfSk9PnBjLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJhNSBjIixzdHlsZTp7Y3Vyc29yOmE/Im5vdC1hbGxvd2VkIjpudWxsLC4uLnN9fSxwYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjpuLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoxMixsZWZ0OjIyLGNvbG9yOiJyZ2JhKDAsIDAsIDAsIDAuMzApIixmb250RmFtaWx5OiJHZWlzdFJlZ3VsYXIiLGZvbnRTaXplOiIxNHB4Iixmb250U3R5bGU6Im5vcm1hbCIsZm9udFdlaWdodDoiNTAwIixsaW5lSGVpZ2h0OiJub3JtYWwifX0saSxsPyIqIjpudWxsKSxhP3BjLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJlaCBlYiBjIGVpIGVqIGVrIGN6IGRrIGN5IGQ4IGVsIGVtIn0sdCk6cGMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJpbnB1dCIse2NsYXNzTmFtZToiZW4gZWIgYyBlaSBlaiBlayBjeiBkayBjeSBkOCBlbCIsbWF4TGVuZ3RoOmUsdHlwZTpvLGlkOm4sb25DaGFuZ2U6cix2YWx1ZTp0fSkpO3ZhciBmYz13KFQoKSwxKTt2YXIgWWU9KHt0aXRsZTplLGNoaWxkcmVuOnR9KT0+ZmMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImMgZTkgZWEgZWIiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7bWFyZ2luQm90dG9tOiI3NnB4In0sIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZzoiMzBweCAyMHB4IixtYXJnaW5Cb3R0b206IjU0cHgifX19LGZjLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjIGVjIGVkIGIgdiBlZSJ9LGZjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSx7Y29sb3I6Im5hdnkiLHN0eWxlOnt0ZXh0VHJhbnNmb3JtOiJjYXBpdGFsaXplIn19LGUpKSxmYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBlZiBwIGVnIn0sdCkpO3ZhciBDbD13KFQoKSwxKTt2YXIgUnQ9KHt0aXRsZTplLGNoaWxkcmVuOnQsb25VcGRhdGU6cixtc2c6bixlcnJvcjpvfSk9PkNsLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdixudWxsLENsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChIbCx7c3R5bGU6e3RleHRBbGlnbjoibGVmdCJ9fSxlKSxDbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiZTMgZTQgZTUgZTYgZTcgYyBlOCIsc3R5bGU6eyJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkiOntncmlkVGVtcGxhdGVDb2x1bW5zOiIxZnIifX19LHQpLG4mJkNsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLHtzdHlsZTp7bWFyZ2luVG9wOjh9fSxuKSxvJiZDbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyx7Y29sb3I6Im9yYW5nZSIsc3R5bGU6e21hcmdpblRvcDo4fX0sbykscj9DbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c3R5bGU6e21hcmdpblRvcDoyNCxtYXJnaW5MZWZ0OiJhdXRvIn0sb25DbGljazpyfSwiVXBkYXRlIik6bnVsbCk7dmFyIEU0PShlLHQpPT57c3dpdGNoKHQudHlwZSl7Y2FzZSJURVhUIjpyZXR1cm57Li4uZSxbdC5maWVsZF06dC5wYXlsb2FkfTtjYXNlIkxPQUQiOnJldHVybntmaXJzdE5hbWU6dC5wYXlsb2FkLmZpcnN0TmFtZSxsYXN0TmFtZTp0LnBheWxvYWQubGFzdE5hbWUsZW1haWw6dC5wYXlsb2FkLmVtYWlsfX19LFA0PSh7ZGF0YTplfSk9PntsZXQgdD1VKCkscj1OdCgpLFtuLG9dPSgwLGhlLnVzZVJlZHVjZXIpKEU0LHtmaXJzdE5hbWU6IiIsbGFzdE5hbWU6IiIsZW1haWw6IiJ9KSxbaSxsXT0oMCxoZS51c2VSZWR1Y2VyKShFNCx7bmV3UGFzc3dvcmQ6IiIsY29uZmlybVBhc3N3b3JkOiIifSksW3MsYV09KDAsaGUudXNlU3RhdGUpKCIiKSxbdSxwXT0oMCxoZS51c2VTdGF0ZSkoIiIpLFtjLGZdPSgwLGhlLnVzZVN0YXRlKSghMSksW2QsbV09KDAsaGUudXNlU3RhdGUpKCIiKSxoPWooKTsoMCxoZS51c2VFZmZlY3QpKCgpPT57byh7dHlwZToiTE9BRCIscGF5bG9hZDplfSl9LFtlXSk7bGV0IFM9dj0+e28oe3R5cGU6IlRFWFQiLGZpZWxkOnYudGFyZ2V0LmlkLHBheWxvYWQ6di50YXJnZXQudmFsdWV9KX0seT12PT57bCh7dHlwZToiVEVYVCIsZmllbGQ6di50YXJnZXQuaWQscGF5bG9hZDp2LnRhcmdldC52YWx1ZX0pfTtyZXR1cm4oMCxoZS51c2VFZmZlY3QpKCgpPT57ci51c2VySWR8fGguc2V0UGF0aCh7c2VjdGlvbjpudWxsfSl9LFtyXSksaGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dhcDo2NCxkaXJlY3Rpb246ImNvbHVtbiJ9LGhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChZZSx7dGl0bGU6IlByb2ZpbGUifSxoZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUnQse3RpdGxlOiJQZXJzb25hbCBpbmZvIixvblVwZGF0ZTphc3luYygpPT57YXdhaXQgdC5jYWxsKCJ3ZWJzaXRlOnNldFBlcnNvbmFsSW5mbyIse2lkOmUudXNlcklkLC4uLm59KX19LGhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHtyZXF1aXJlZDohMCxsYWJlbDoiRmlyc3QgTmFtZSIsdHlwZToidGV4dCIsdmFsdWU6bi5maXJzdE5hbWUsc2V0VmFsdWU6UyxuYW1lOiJmaXJzdE5hbWUifSksaGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3JlcXVpcmVkOiEwLGxhYmVsOiJMYXN0IE5hbWUiLHR5cGU6InRleHQiLHZhbHVlOm4ubGFzdE5hbWUsc2V0VmFsdWU6UyxuYW1lOiJsYXN0TmFtZSJ9KSxoZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6IkVtYWlsIEFkZHJlc3MiLHR5cGU6InRleHQiLHZhbHVlOm4uZW1haWwsc2V0VmFsdWU6UyxuYW1lOiJlbWFpbCIsZGlzYWJsZWQ6ITB9KSksaGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJ0LHt0aXRsZToiU2VjdXJpdHkiLGVycm9yOnUsbXNnOnMsb25VcGRhdGU6YXN5bmMoKT0+e2kubmV3UGFzc3dvcmQhPT1pLmNvbmZpcm1QYXNzd29yZD9wKCJZb3VyIG5ldyBwYXNzd29yZCBpcyBub3QgbWF0Y2hpbmcgeW91IGNvbmZpcm1lZCBwYXNzd29yZC4iKTphd2FpdCB0LmNhbGwoIndlYnNpdGU6c2V0UGFzc3dvcmQiLHtpZDplLnVzZXJJZCwuLi5pfSkuY2F0Y2godj0+e3Aodj8udG9TdHJpbmcoKSl9KS50aGVuKHY9PmEoIllvdXIgcGFzc3dvcmQgaXMgdXBkYXRlZC4iKSl9fSxoZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6Ik5ldyBwYXNzd29yZCIsdHlwZToicGFzc3dvcmQiLHZhbHVlOmkubmV3UGFzc3dvcmQsc2V0VmFsdWU6eSxuYW1lOiJuZXdQYXNzd29yZCJ9KSxoZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6IkNvbmZpcm0gbmV3IHBhc3N3b3JkIix0eXBlOiJwYXNzd29yZCIsdmFsdWU6aS5jb25maXJtUGFzc3dvcmQsc2V0VmFsdWU6eSxuYW1lOiJjb25maXJtUGFzc3dvcmQifSkpLGhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhcSBiIHAifSxoZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyxudWxsLCJEZWxldGUgYWNjb3VudCIpLGhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLHtzdHlsZTp7bWF4V2lkdGg6IjY1NXB4In19LCJEZWxldGluZyB5b3VyIGFjY291bnQgcmVtb3ZlcyBhbGwgb2YgeW91ciBpbmZvcm1hdGlvbiBmcm9tIG91ciBzZXJ2ZXJzLiBVc2Ugd2l0aCBjYXJlLiIpLGhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtjb2xvcjoib3JhbmdlIixzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byIsbWFyZ2luVG9wOjI0fSxvbkNsaWNrOigpPT5mKCEwKX0sIkRlbGV0ZSIpKSksYyYmaGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEhyLHtzZXRPcGVuOmYsdGl0bGU6IkRlbGV0ZSB5b3VyIGFjY291bnQ/IixkZXNjcmlwdGlvbjoiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB5b3VyIGFjY291bnQifSxoZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSixudWxsLCJUeXBlIiwiICIsaGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJzcGFuIix7c3R5bGU6e2NvbG9yOiJibGFjayIsZm9udFdlaWdodDoiYm9sZCJ9fSxlPy5lbWFpbCksIiAiLCJpbiB0aGUgdGV4dGZpZWxkIHRvIGNvbmZpcm0uIiksaGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguaW5wdXQse29uQ2hhbmdlOnY9Pm0odi5jdXJyZW50VGFyZ2V0LnZhbHVlKSx2YWx1ZTpkfSksaGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOiJvcmFuZ2UiLHN0eWxlOnt3aWR0aDoiMzc3cHgiLG1hcmdpblRvcDoyNCxoZWlnaHQ6IjQycHgifSxvbkNsaWNrOmFzeW5jKCk9PntkPT09ZS5lbWFpbCYmKGguc2V0UXVlcnkoe3NpdGVTZWN0aW9uOm51bGx9KSxhd2FpdCB0LmNhbGwoIndlYnNpdGU6ZGVsZXRlLXVzZXIiLHtpZDpyLnVzZXJJZH0pLGguc2V0UGF0aCh7c2VjdGlvbjpudWxsLGlkOm51bGx9KSxmKCExKSl9fSwiRGVsZXRlIikpKX07dmFyIFRsPXcoVCgpLDEpO3ZhciBzZT13KFQoKSwxKTt2YXIgRDg9KHt2YWx1ZTplLG9uQ2hhbmdlOnQsY2hlY2tlZDpyLGl0ZW06bn0pPT57bGV0IG89KDAsc2UudXNlUmVmKSgpLHtib2R5OmksdGl0bGU6bCxwcmljZTpzfT1uO3JldHVybiBzZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5sYWJlbCx7Y2xhc3NOYW1lOiJlYiBlbiBiIGVzIGlhIGRzIGphIixzdHlsZTp7IiY6aG92ZXIiOntiYWNrZ3JvdW5kOiJyZ2JhKDI0MCwgODIsIDYwLCAwLjA2KSJ9LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2p1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiIyNnB4IDEycHgiLGdhcDoiMjRweCJ9fX0sc2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJpbnB1dCIse2NsYXNzTmFtZToiYjMgZXUgZXYgZXcgZXggYTYgZXkgY3EgZXoiLHJlZjpvLHR5cGU6InJhZGlvIixzdHlsZTp7bWFyZ2luOi0xfSx2YWx1ZTplLGNoZWNrZWQ6cixvbkNoYW5nZTphPT57dChhLmN1cnJlbnRUYXJnZXQudmFsdWUpfX0pLHNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqYiBlaCBmMiBmMyBiIGJlIHYgYWIgY3UifSxyP3NlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiZSBmNCBmNSIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjpiKCJvcmFuZ2UiKX19KTpudWxsKSxzZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBwIn0sc2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEssbnVsbCxsKSxzZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7c3R5bGU6e21heFdpZHRoOiI0NThweCJ9fSxpKSksc2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEose2NvbG9yOiJibGFjayIsc3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8ifSxzaW5nbGVsaW5lOiEwfSxzKSl9LE84PVt7dGl0bGU6Ik1vbnRobHkgTWVtYmVyc2hpcCIscHJpY2U6Ilx1MjBBQzExLyBtb250aCIsYm9keToiU2hvcnQtdGVybSBjb21taXRtZW50LCBwYXkgcGVyIG1vbnRoLiBDYW5jZWwgYW55dGltZS4iLHZhbHVlOiJtb250aGx5In0se3RpdGxlOiJZZWFybHkgTWVtYmVyc2hpcCIscHJpY2U6Ilx1MjBBQzkwLyB5ZWFyIixib2R5OiJDb21taXQgdG8gb25lIHllYXIgb2YgYWNjZXNzIHRvIGFsbCBvZiBFVW9ic2VydmVyLiIsdmFsdWU6InllYXJseSJ9LHt0aXRsZToiVW5kZXIgMjUgTWVtYmVyc2hpcCIscHJpY2U6Ilx1MjBBQzEvIG1vbnRoIixib2R5OiJCZWNhdXNlIHdlIGtub3cgdGhlcmUncyBvdGhlciB0aGluZ3MgeW91IG5lZWQgdG8gc3BlbmQgeW91ciBtb25leSBvbi4iLHZhbHVlOiJzdHVkZW50In1dLE00PShlLHQpPT5POC5tYXAocj0+c2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEQ4LHtjaGVja2VkOmU9PT1yLnZhbHVlLG9uQ2hhbmdlOm49PnQobiksdmFsdWU6ci52YWx1ZSxrZXk6ci50aXRsZSxpdGVtOnJ9KSksSTQ9KHtkYXRhOmV9KT0+e2xldCB0PURpKCksW3Isbl09KDAsc2UudXNlU3RhdGUpKHQudmFsdWUpLFtvLGldPSgwLHNlLnVzZVN0YXRlKSghMSksW2wsc109KDAsc2UudXNlU3RhdGUpKCIiKSxhPVUoKTsoMCxzZS51c2VFZmZlY3QpKCgpPT57bih0LnZhbHVlKX0sW2VdKTtsZXRbdSxwXT0oMCxzZS51c2VTdGF0ZSkoKCk9Pk00KHIsbikpLGM9XGAke3dpbmRvdy5FTlY9PT0icHJvZHVjdGlvbiI/cj09PSJzdHVkZW50Ij8iaHR0cHM6Ly9wYXltZW50cy5ldW9ic2VydmVyLmNvbS9iLzRndzNkcjBONmZuZGQyTWZaMyI6cj09PSJtb250aGx5Ij8iaHR0cHM6Ly9wYXltZW50cy5ldW9ic2VydmVyLmNvbS9iLzNjczZwRDNaaTZRSDBnMGRRVSI6cj09PSJ5ZWFybHkiPyJodHRwczovL3BheW1lbnRzLmV1b2JzZXJ2ZXIuY29tL2IvY04yMDFmMlZlM0V2YllJZVVYIjoiIjpyPT09InN0dWRlbnQiPyJodHRwczovL3BheW1lbnRzLmV1b2JzZXJ2ZXIuY29tL2IvdGVzdF9hRVU2cTBjVlA2Wmcxa1FkUVgiOnI9PT0ibW9udGhseSI/Imh0dHBzOi8vcGF5bWVudHMuZXVvYnNlcnZlci5jb20vYi90ZXN0X2FFVTI5S2RaVDZaZzZGYTI4ZyI6cj09PSJ5ZWFybHkiPyJodHRwczovL3BheW1lbnRzLmV1b2JzZXJ2ZXIuY29tL2IvdGVzdF9kUjY5Q2NnODE4M2thVnE5QUoiOiIifT9wcmVmaWxsZWRfZW1haWw9JHtlLmVtYWlsfVxgLGY9KCk9PnshZS5zdWJzY3JpcHRpb25JZCYmIWUuY3VzdG9tZXJJZD93aW5kb3cub3BlbihjKTppKCEwKX07cmV0dXJuKDAsc2UudXNlRWZmZWN0KSgoKT0+e3AoTTQocixuKSl9LFtyXSksc2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFllLHt0aXRsZToiTWVtYmVyc2hpcCJ9LHNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhcSBiIHAifSxzZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyxudWxsLHQudGl0bGUpLHNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLHtzdHlsZTp7bWF4V2lkdGg6IjY1NXB4In19LHQudmFsdWU9PT0iZnJlZSI/c2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHNlLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCwiWW91IGFyZSBjdXJyZW50bHkgbm90IHN1YnNjcmliZWQgdG8gb3VyIG5ld3NsZXR0ZXIgb3IgYSBtZW1iZXIgb2Ygb3VyIHdlYnNpdGUuIFBsZWFzZSBjb25zaWRlciBzdWJzY3JpYmluZyB0byBvdXIgbmV3c2xldHRlciBpbiB0aGUgbm90aWZpY2F0aW9ucyB0YWIsIG9yIGJlY29taW5nIGEgc3VwcG9ydGluZyBtZW1iZXIsIHRvIGdhaW4gYWNjZXNzIHRvIGFydGljbGVzLiIpOnNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChzZS5kZWZhdWx0LkZyYWdtZW50LG51bGwsIllvdSBhcmUgY3VycmVudGx5IGEgbmV3c2xldHRlciBzdWJzY3JpYmVyLiBBcyBhIG5ld3NsZXR0ZXIgc3Vic2NyaWJlciB5b3UgZ2V0IDMgZnJlZSBhcnRpY2xlcyBwZXIgbW9udGguIEJ5IHVwZ3JhZGluZyB5b3VyIG1lbWJlcnNoaXAgeW91IGdldCBmdWxsIGFjY2VzcyB0byBhbGwgb3VyIGFydGljbGVzLCBjb21tZW50cywgZGlnaXRhbCBtYWdhemluZSBhbmQgbW9yZS4iLHNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYnIiLG51bGwpLHNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYnIiLG51bGwpLCIgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGEgZ3JvdXAgbWVtYmVyc2hpcCwgcHJlc3MgaGVyZSB0byBjb250YWN0IHVzIGRpcmVjdGx5IGFuZCBnZXQgaW5mb3JtYXRpb24gYWJvdXQgZ3JvdXAgbWVtYmVyc2hpcHMuIikpLHNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJqYyBqZCBiIHAgYjgiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7cGFkZGluZ0xlZnQ6MH19fSx1KSksc2UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse3N0eWxlOnttYXJnaW5MZWZ0OiJhdXRvIn0sb25DbGljazpmfSwiVXBncmFkZSIpLG8mJnNlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChIcix7c2V0T3BlbjppLHRpdGxlOiJDb25maXJtIHN1YnNjcmlwdGlvbiBjaGFuZ2UiLGRlc2NyaXB0aW9uOmx8fCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2hhbmdlIHlvdXIgc3Vic2NyaXB0aW9uPyIsb25TdWJtaXQ6YXN5bmMoKT0+YXdhaXQgYS5jYWxsKCJzdHJpcGU6Y2hhbmdlLXN1YnNjcmlwdGlvbiIse2lkOmUudXNlcklkLHN1YnNjcmlwdGlvbklkOmUuc3Vic2NyaXB0aW9uSWQsY2hvc2VuUGxhbjpyfSkuY2F0Y2goZD0+e3Rocm93IHMobWUoZC5tZXNzYWdlKSksbmV3IEVycm9yKCJibGEiKX0pLnRoZW4oZD0+e2koITEpfSl9KSl9O3ZhciBSPXcoVCgpLDEpO3ZhciBMND13KFQoKSwxKTt2YXIgejg9KGUsdCk9Pntzd2l0Y2godC50eXBlKXtjYXNlIlRFWFQiOnJldHVybnsuLi5lLFt0LmZpZWxkXTp0LnBheWxvYWR9O2Nhc2UiTE9BRCI6cmV0dXJue2ZpcnN0TmFtZTp0LnBheWxvYWQuZmlyc3ROYW1lLGxhc3ROYW1lOnQucGF5bG9hZC5sYXN0TmFtZSxlbWFpbDp0LnBheWxvYWQuZW1haWx9fX0sQTQ9KHt9KT0+e2xldCBlPVRpKCksW3Qscl09KDAsTDQudXNlUmVkdWNlcikoejgse2ZpcnN0TmFtZToiIixsYXN0TmFtZToiIixlbWFpbDoiIn0pLG49bT0+e3Ioe3R5cGU6IlRFWFQiLGZpZWxkOm0udGFyZ2V0LmlkLHBheWxvYWQ6bS50YXJnZXQudmFsdWV9KX0sW28saV09KDAsUi51c2VTdGF0ZSkoIiIpLFtsLHNdPSgwLFIudXNlU3RhdGUpKCExKSxbYSx1XT0oMCxSLnVzZVN0YXRlKSgiIikscD1PZSgpLGM9VSgpLHtkYXRhOmYsbG9hZGluZzpkfT1wZSgiZ2V0LW9yZy1tZW1iZXJzIix7aWQ6ZT8ub3JnYW5pemF0aW9uPy5pZH0pO3JldHVybiBSLmRlZmF1bHQuY3JlYXRlRWxlbWVudChZZSx7dGl0bGU6Ik1hbmFnZSBNZW1iZXJzaGlwcyJ9LFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIixnYXA6MTJ9LFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEosbnVsbCwiWW91ciBtZW1iZXJzaGlwIiksUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7c3R5bGU6e21heFdpZHRoOiI2NTVweCJ9fSwiWW91IGFyZSBhZG1pbiBvZiBhIGdyb3VwIG1lbWJlcnNoaXAuIEhlcmUgeW91IGNhbiBtYW5hZ2UgeW91ciBzZWF0cy4iKSksUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7ZGlyZWN0aW9uOiJjb2x1bW4iLGdhcDoxMn0sUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyxudWxsLCJTZW5kIEludml0ZSIpLFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dhcDoxMixncmlkOiEwLHN0eWxlOntkaXNwbGF5OiJncmlkIixncmlkVGVtcGxhdGVDb2x1bW5zOiIxZnIgMWZyIiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntncmlkVGVtcGxhdGVDb2x1bW5zOiIxZnIifX19LFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3JlcXVpcmVkOiEwLGxhYmVsOiJGaXJzdCBOYW1lIix0eXBlOiJ0ZXh0Iix2YWx1ZTp0LmZpcnN0TmFtZSxzZXRWYWx1ZTpuLG5hbWU6ImZpcnN0TmFtZSJ9KSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHtyZXF1aXJlZDohMCxsYWJlbDoiTGFzdCBOYW1lIix0eXBlOiJ0ZXh0Iix2YWx1ZTp0Lmxhc3ROYW1lLHNldFZhbHVlOm4sbmFtZToibGFzdE5hbWUifSksUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6IkVtYWlsIEFkZHJlc3MiLHR5cGU6InRleHQiLHZhbHVlOnQuZW1haWwsc2V0VmFsdWU6bixuYW1lOiJlbWFpbCJ9KSksUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8ifSxvbkNsaWNrOigpPT57cyghMCl9LGNvbG9yOiJibGFjayJ9LCJTZW5kIGludml0ZSIpKSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiJ9LFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse3N0eWxlOnttYXJnaW5Cb3R0b206IjI0cHgifX0sUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyxudWxsLCJNYW5hZ2Ugc2VhdHMiKSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLG51bGwsZj8udXNlcnM/Lmxlbmd0aCwiLyIsZT8ub3JnYW5pemF0aW9uPy5tYXhTZWF0cywiIGF2YWlsYWJsZSIpKSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudChGOCx7b25DaGFuZ2U6bT0+aShtLnRhcmdldC52YWx1ZSksdmFsdWU6b30pLFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImUzIGFlIGIgcCBqZSBjIn0sZj8udXNlcnM/LmZpbHRlcihtPT5KU09OLnN0cmluZ2lmeShtLmZpcnN0TmFtZSk/LmluY2x1ZGVzKG8pKS5tYXAoKG0saCk9PlIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEI4LHtjbGllbnQ6YyxrZXk6aCxtZW1iZXI6bX0pKSkpLGwmJlIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEhyLHtvblN1Ym1pdDphc3luYygpPT5hd2FpdCBjLmNhbGwoIndlYnNpdGU6Z3JvdXAtaW52aXRlIix7Zmlyc3ROYW1lOnQuZmlyc3ROYW1lLGxhc3ROYW1lOnQubGFzdE5hbWUsZW1haWw6dC5lbWFpbCxvcmdhbml6YXRpb246ZS5vcmdhbml6YXRpb259KS5jYXRjaChtPT51KG0ubWVzc2FnZSkpLnRoZW4obT0+e20mJih1KCIiKSxwKG0sbSkscyghMSkpfSksc2V0T3BlbjpzLHRpdGxlOiJTZW5kaW5nIGFuIGludml0ZSJ9LFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEosbnVsbCwiWW91IGFyZSBhYm91dCB0byBpbnZpdGUiLCIgIixSLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToiZHkifSx0LmZpcnN0TmFtZSksIiAiLFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJkeSJ9LHQubGFzdE5hbWUpLCIgIiwiYXQiLCIgIixSLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToiZHkifSx0LmVtYWlsKSksYT9SLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLHtzdHlsZTp7bWFyZ2luVG9wOjEyfSxjb2xvcjoib3JhbmdlIn0sYSk6bnVsbCkpfSxCOD0oe21lbWJlcjplLGNsaWVudDp0fSk9PntsZXRbcixuXT0oMCxSLnVzZVN0YXRlKSghMSk7cmV0dXJuIFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImpmIGViIGU5IGMifSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtzdHlsZTp7Ym9yZGVyQm90dG9tOiIxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpIixwYWRkaW5nQm90dG9tOjgsbWFyZ2luQm90dG9tOjh9fSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGdhcDoxNixhbGlnbkl0ZW1zOiJjZW50ZXIifX0sZS5jdXJyZW50VG9rZW4/Ui5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOntoZWlnaHQ6MTksd2lkdGg6MTksYmFja2dyb3VuZENvbG9yOiIjRDlEOUQ5Iixib3JkZXJSYWRpdXM6IjUwJSJ9fSk6bnVsbCxlLmN1cnJlbnRUb2tlbj09PSIiP1IuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtzdHlsZTp7aGVpZ2h0OjE5LHdpZHRoOjE5LGJhY2tncm91bmRDb2xvcjoiI2Q5ZmZjYyIsYm9yZGVyUmFkaXVzOiI1MCUifX0pOm51bGwsUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYWUsbnVsbCxcYCR7ZT8uZmlyc3ROYW1lfSAke2U/Lmxhc3ROYW1lfVxgKSksUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYTUifSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmJ1dHRvbix7Y2xhc3NOYW1lOiJqZyBqaCBqaSBqaiBiIHYgYWIiLHN0eWxlOnsiJjpob3ZlciI6e2JhY2tncm91bmQ6InJnYmEoMCwwLDAsMC4wNSkifX0sb25DbGljazooKT0+bighMCl9LFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJzdmciLHt3aWR0aDoiMTYiLGhlaWdodDoiMTYiLHZpZXdCb3g6IjAgMCAxOSAyMSIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIn0sUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTEuNSA4LjI5MDc3VjE1LjI5MDhNNy41IDguMjkwNzdMNy41IDE1LjI5MDhNMS41IDQuMjkwNzdIMTcuNU0xNS41IDQuMjkwNzdWMTYuMDkwOEMxNS41IDE3LjIxMDkgMTUuNTAwMiAxNy43NzEgMTUuMjgyMiAxOC4xOTg4QzE1LjA5MDUgMTguNTc1MSAxNC43ODQxIDE4Ljg4MSAxNC40MDc4IDE5LjA3MjhDMTMuOTggMTkuMjkwNyAxMy40MjAzIDE5LjI5MDggMTIuMzAwMiAxOS4yOTA4SDYuNzAwMkM1LjU4MDA5IDE5LjI5MDggNS4wMTk2MiAxOS4yOTA3IDQuNTkxOCAxOS4wNzI4QzQuMjE1NDcgMTguODgxIDMuOTA5NzMgMTguNTc1MSAzLjcxNzk5IDE4LjE5ODhDMy41IDE3Ljc3MSAzLjUgMTcuMjEwOSAzLjUgMTYuMDkwOFY0LjI5MDc3SDE1LjVaTTEzLjUgNC4yOTA3N0g1LjVDNS41IDMuMzU4ODkgNS41IDIuODkyOTMgNS42NTIyNCAyLjUyNTM5QzUuODU1MjMgMi4wMzUzMyA2LjI0NDMyIDEuNjQ2IDYuNzM0MzggMS40NDMwMUM3LjEwMTkyIDEuMjkwNzcgNy41NjgxMiAxLjI5MDc3IDguNSAxLjI5MDc3SDEwLjVDMTEuNDMxOSAxLjI5MDc3IDExLjg5NzggMS4yOTA3NyAxMi4yNjU0IDEuNDQzMDFDMTIuNzU1NCAxLjY0NiAxMy4xNDQ3IDIuMDM1MzMgMTMuMzQ3NyAyLjUyNTM5QzEzLjQ5OTkgMi44OTI5MyAxMy41IDMuMzU4ODkgMTMuNSA0LjI5MDc3WiIsc3Ryb2tlOiJibGFjayIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQifSkpKSkpLFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2RpcmVjdGlvbjoiY29sdW1uIn0sUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7Y29sb3I6ImJsYWNrIn0sZT8uZW1haWwpLFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEose2NvbG9yOiJvcmFuZ2UifSxlPy5tZW1iZXJzaGlwPT09ND8iR3JvdXAgbWFuYWdlciI6IiIpLFIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEosbnVsbCxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHttb250aDoic2hvcnQiLGRheToiMi1kaWdpdCIseWVhcjoibnVtZXJpYyJ9KS5mb3JtYXQoZS5jcmVhdGVkQXQpKSksciYmUi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSHIse3RpdGxlOiJSZW1vdmUgU2VhdCIsZGVzY3JpcHRpb246XGBZb3UgYXJlIGFib3V0IHRvIHJlbW92ZSB0aGUgbWVtYmVyOiAke2U/LmZpcnN0TmFtZSsiICIrZT8ubGFzdE5hbWV9XGAsc2V0T3BlbjpuLG9uU3VibWl0OmFzeW5jKCk9Pnt0cnl7YXdhaXQgdC5jYWxsKCJvcmc6cmVtb3ZlLXVzZXIiLHtpZDplLmlkfSl9Y2F0Y2h7fW4oITEpfX0pKX0sRjg9KHtvbkNoYW5nZTplLHZhbHVlOnQscGxhY2Vob2xkZXI6cj0iU2VhcmNoLi4uIn0pPT57bGV0W24sb109KDAsUi51c2VTdGF0ZSkoITEpO3JldHVybiBSLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhNSBqayBjIGM2IHUifSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmlucHV0LHtjbGFzc05hbWU6ImpsIGN6IGRoIGptIGN5IGVsIGpuIGMxIGMgam8ganAiLG9uQ2hhbmdlOmUsdmFsdWU6dCxwbGFjZWhvbGRlcjpyLG9uRm9jdXM6KCk9Pm8oITApLG9uQmx1cjooKT0+byghMSksc3R5bGU6e2JvcmRlcjpuPyIxcHggc29saWQgYmxhY2siOiIxcHggc29saWQgcmdiYSgwLDAsMCwwLjEyKSIsIiY6OnBsYWNlaG9sZGVyIjp7Y29sb3I6InJnYmEoMCwgMCwgMzIsIDAuMykifX19KSxSLmRlZmF1bHQuY3JlYXRlRWxlbWVudChTcyx7Y29sb3I6bj8icmdiYSgwLDAsMCkiOiJyZ2JhKDAsIDAsIDAsIDAuNCkiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MTgsdG9wOjEwLGJvdHRvbToxMH19KSl9O3ZhciBHdD13KFQoKSwxKTt2YXIgRDQ9dyhTaSgpLDEpO3ZhciBPND0oe2RhdGE6ZX0pPT57bGV0IHQ9VSgpLFtyLG5dPSgwLEd0LnVzZVN0YXRlKSgibG9hZGluZyIpLFtvLGldPSgwLEd0LnVzZVN0YXRlKSghMSksW2wsc109KDAsR3QudXNlU3RhdGUpKCIiKSxbYSx1XT0oMCxHdC51c2VTdGF0ZSkoIiIpO3JldHVybigwLEd0LnVzZUVmZmVjdCkoKCk9PnsoYXN5bmMoKT0+e2xldCBjPWF3YWl0IHQuY2FsbCgic3RyaXBlOnJldHJpZXZlLXN1YnNjcmlwdGlvbiIse3N1YnNjcmlwdGlvbklkOmUuc3Vic2NyaXB0aW9uSWR9KTtuKGMqMWUzKX0pKCl9LFtlXSksR3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFllLHt0aXRsZToiTWVtYmVyc2hpcCJ9LEd0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhcSBiIHAifSxHdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyx7c3R5bGU6e2ZvbnRTdHlsZToibm9ybWFsIn19LCJZb3VyIG1lbWJlcnNoaXAiKSxHdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSixudWxsLCJZb3UndmUgYmVlbiBhIG1lbWJlciBzaW5jZSIsIiAiLHI9PT0ibG9hZGluZyI/ImxvYWRpbmcuLi4iOigwLEQ0LnByZXR0eURhdGUpKHIsImRhdGUiKSwiLCBpZiB5b3Ugd291bGQgbGlrZSB0byBjYW5jZWwgeW91ciBtZW1iZXJzaGlwIGNsaWNrIHRoZSBidXR0b24gYmVsb3cuIiksR3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOiJibGFjayIsc3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblRvcDoyNH0sb25DbGljazooKT0+aSghMCl9LCJDYW5jZWwgTWVtYmVyc2hpcCIpLG8/R3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEhyLHtzZXRPcGVuOmksdGl0bGU6IkNhbmNlbCBNZW1iZXJzaGlwIixkZXNjcmlwdGlvbjoiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNhbmNlbCB5b3VyIG1lbWJlcnNoaXA/In0sR3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEsse3N0eWxlOnttYXJnaW5Ub3A6MTJ9LGNvbG9yOmE/Im5hdnkiOiJvcmFuZ2UifSxtZShhPz9sKSksYT9HdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7Y29sb3I6Im5hdnkiLHN0eWxlOntoZWlnaHQ6IjM5cHgiLG1hcmdpblRvcDoiMjRweCJ9LG9uQ2xpY2s6KCk9PmkoITEpfSwiQ2xvc2UiKTpHdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7Y29sb3I6ImJsYWNrIixvbkNsaWNrOmFzeW5jKCk9Pnthd2FpdCB0LmNhbGwoInN0cmlwZTpjYW5jZWwtc3Vic2NyaXB0aW9uIix7c3Vic2NyaXB0aW9uSWQ6ZS5zdWJzY3JpcHRpb25JZH0pLmNhdGNoKHA9PnMobWUocC5tZXNzYWdlKSkpLnRoZW4ocD0+dShwKSl9fSwiQ29uZmlybSIpKTpudWxsKSl9O3ZhciBNcj13KFQoKSwxKTt2YXIgejQ9KHt9KT0+e2xldCBlPVRpKCksdD1VKCksW3Isbl09KDAsTXIudXNlU3RhdGUpKCExKSxbbyxpXT0oMCxNci51c2VTdGF0ZSkoIiIpLFtsLHNdPSgwLE1yLnVzZVN0YXRlKSgiIikse3VzZXJJZDphfT1OdCgpLHU9aigpO3JldHVybiBNci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWWUse3RpdGxlOiJNZW1iZXJzaGlwIn0sTXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImFxIGIgcCJ9LE1yLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLG51bGwsIllvdXIgbWVtYmVyc2hpcCIpLE1yLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLG51bGwsIllvdXIgbWVtYmVyc2hpcCBpcyBjdXJyZW50bHkgYmVpbmcgbWFuYWdlZCBieSIsIiAiLGU/Lm9yZ2FuaXphdGlvbj8udGl0bGUsIi4gSWYgeW91IGRlbGV0ZSB5b3VyIGFjY291bnQgeW91ciBhZG1pbiB3aWxsIGhhdmUgdG8gYWRkIHlvdSBhZ2FpbiB0byByZW5ldyB5b3VyIG1lbWJlcnNoaXAuIiksTXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOiJibGFjayIsc3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblRvcDoyNH0sb25DbGljazooKT0+bighMCl9LCJEZWxldGUgQWNjb3VudCIpLHI/TXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEhyLHtzZXRPcGVuOm4sdGl0bGU6IkNhbmNlbCBNZW1iZXJzaGlwIixkZXNjcmlwdGlvbjoiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB5b3VyIGFjY291bnQ/In0sTXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEsse3N0eWxlOnttYXJnaW5Ub3A6MTJ9LGNvbG9yOmw/Im5hdnkiOiJvcmFuZ2UifSxsPz9vKSxsP01yLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtjb2xvcjoibmF2eSIsc3R5bGU6e2hlaWdodDoiMzlweCJ9LG9uQ2xpY2s6KCk9Pm4oITEpfSwiQ2xvc2UiKTpNci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7Y29sb3I6ImJsYWNrIixvbkNsaWNrOmFzeW5jKCk9Pnthd2FpdCB0LmNhbGwoIndlYnNpdGU6ZGVsZXRlLXVzZXIiLHtpZDphfSkuY2F0Y2gocD0+aShtZShwLm1lc3NhZ2UpKSkudGhlbihwPT57cyhtZShwKSksdS5zZXRQYXRoKHtzZWN0aW9uOm51bGwsaWQ6bnVsbH0pfSl9fSwiQ29uZmlybSIpKTpudWxsKSl9O3ZhciBCND0oe2RhdGE6ZSxtZW1iZXJzaGlwOnR9KT0+e2xldHt2YWx1ZTpyfT1EaSgpO3JldHVybiByPT09Im5ld3NsZXR0ZXIifHxyPT09ImZyZWUiP1RsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChJNCx7ZGF0YTplfSk6cj09PSJncm91cE1hbmFnZXIiP1RsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBNCxudWxsKTpyPT09Im1vbnRobHkifHxyPT09InllYXJseSI/VGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE80LHtkYXRhOmV9KTpyPT09Imdyb3VwTWVtYmVyIj9UbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoejQsbnVsbCk6VGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFRsLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCl9O3ZhciB4cj13KFQoKSwxKTt2YXIgcmE9dyhUKCksMSk7dmFyIG5hPSh7dmFsdWU6ZSxvbkNoYW5nZTp0LHN0eWxlOnIsbmFtZTpuLGxhYmVsOm8sZGVzY3JpcHRpb246aX0pPT5yYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBobiJ9LHJhLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmlucHV0LHtjbGFzc05hbWU6ImN1IGIgaG8gaHAgaHEgZTMgdiBhNSBkcyBlaCBuIixpZDpuLG9uQ2hhbmdlOnQsdHlwZToiY2hlY2tib3giLHZhbHVlOmUsY2hlY2tlZDplLHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6ZT8iYmxhY2siOiJ3aGl0ZSIsIiY6aG92ZXIiOntmaWx0ZXI6ImJyaWdodG5lc3MoOTAlKSJ9LCImOmJlZm9yZSI6e2NvbnRlbnQ6JyIgIicsd2lkdGg6IjE2cHgiLGhlaWdodDoiMTZweCIsYmFja2dyb3VuZENvbG9yOmU/IndoaXRlIjoiYmxhY2siLGJvcmRlclJhZGl1czoiOHB4IixkaXNwbGF5OiJibG9jayIscG9zaXRpb246ImFic29sdXRlIix0cmFuc2Zvcm06ZT8idHJhbnNsYXRlWCgyMHB4KSI6InRyYW5zbGF0ZVgoMnB4KSIsdHJhbnNpdGlvbjoidHJhbnNmb3JtIDAuMnMgbGluZWFyIn0sLi4ucn19KSxvP3JhLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOm59LHJhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChIbCx7c3R5bGU6e3RleHRBbGlnbjoibGVmdCIsbWFyZ2luQm90dG9tOjh9fSxvKSxyYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7c3R5bGU6e3RleHRBbGlnbjoibGVmdCJ9fSxpKSk6bnVsbCk7dmFyICQ4PShlLHQpPT57c3dpdGNoKHQudHlwZSl7Y2FzZSJUT0dHTEUiOnJldHVybnsuLi5lLFt0LmZpZWxkXTp0LnBheWxvYWR9O2Nhc2UiVEVYVCI6cmV0dXJuey4uLmUsW3QuZmllbGRdOnQucGF5bG9hZH07Y2FzZSJMT0FEIjpyZXR1cm57bm90aWZpY2F0aW9uczp0LnBheWxvYWQubm90aWZpY2F0aW9ucyxwaG9uZU51bWJlcjp0LnBheWxvYWQucGhvbmVOdW1iZXIsbWV0aG9kOnQucGF5bG9hZC5tZXRob2QsdG9waWNzOnQucGF5bG9hZC50b3BpY3MsbmV3c2xldHRlcjp0LnBheWxvYWQubmV3c2xldHRlcixtYWdhemluZTp0LnBheWxvYWQubWFnYXppbmV9fX0sRjQ9KHtkYXRhOmV9KT0+e2xldFt0LHJdPSgwLHhyLnVzZVJlZHVjZXIpKCQ4LHtub3RpZmljYXRpb25zOiExLHBob25lTnVtYmVyOiIiLG1ldGhvZDoiIix0b3BpY3M6W10sbmV3c2xldHRlcjohMSxtYWdhemluZTohMX0pLG49bT0+e3Ioe3R5cGU6IlRPR0dMRSIsZmllbGQ6bS50YXJnZXQuaWQscGF5bG9hZDohdFttLnRhcmdldC5pZF19KX0sbz1tPT57cih7dHlwZToiVEVYVCIsZmllbGQ6bS50YXJnZXQuaWQscGF5bG9hZDptLnRhcmdldC52YWx1ZX0pfTsoMCx4ci51c2VFZmZlY3QpKCgpPT57cih7dHlwZToiTE9BRCIscGF5bG9hZDplfSl9LFtlXSk7bGV0W2ksbF09KDAseHIudXNlU3RhdGUpKCIiKSxbcyxhXT0oMCx4ci51c2VTdGF0ZSkobnVsbCksW3UscF09KDAseHIudXNlU3RhdGUpKG51bGwpLGM9VSgpLGY9VGUoKSx7c2VjdGlvbnM6ZH09WG4oKTtyZXR1cm4geHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dhcDo2NCxkaXJlY3Rpb246ImNvbHVtbiJ9LHhyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChZZSx7dGl0bGU6IlVwZGF0ZXMifSx4ci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBwIGh6In0seHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5hLHtkZXNjcmlwdGlvbjoiUmVjZWl2ZSBldW9ic2VydmVyXHUyMDE5cyBkYWlseSBlbWFpbCB3aXRoIGFsbCB0aGUgRVUgbmV3cyB5b3Ugc2hvdWxkIG5vdCBtaXNzLiIsdmFsdWU6dC5uZXdzbGV0dGVyLGxhYmVsOiJOZXdzbGV0dGVyIixuYW1lOiJuZXdzbGV0dGVyIixvbkNoYW5nZTpufSkseHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5hLHtkZXNjcmlwdGlvbjoiU3Vic2NyaWJlIHRvIG91ciBzZW1pLWFudWFsIHRvcGljYWwgbWFnYXppbmUuIFlvdSByZWNlaXZlIHRoZSBtYWdhemluZSBpbiB5b3VyIGVtYWlsIix2YWx1ZTp0Lm1hZ2F6aW5lLGxhYmVsOiJNYWdhemluZSIsbmFtZToibWFnYXppbmUiLG9uQ2hhbmdlOm59KSkseHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse2NvbG9yOiJibGFjayIsc3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8ifSxvbkNsaWNrOmFzeW5jKCk9Pnthd2FpdCBjLmNhbGwoImhhbmRsZS1ub3RpZmljYXRpb24tdXBkYXRlIix7ZW1haWw6Zi5lbWFpbCxuZXdzbGV0dGVyOnQubmV3c2xldHRlcixtYWdhemluZTp0Lm1hZ2F6aW5lfSkuY2F0Y2gobT0+Y29uc29sZS5sb2cobSkpfX0sIlVwZGF0ZSIpKSl9O3ZhciBIZD13KFQoKSwxKTt2YXIgJDQ9KHtvbkNoYW5nZTplLHZhbHVlOnQsZGF0YTpyLG1lbWJlcnNoaXA6bn0pPT5IZC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToicCBhcSBodyBjIGIiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntkaXNwbGF5OiJub25lIn19fSxyPy5maWx0ZXIobz0+bjwyfHxuPjM/by52YWx1ZSE9PSJCaWxsaW5nIjpvKT8uZmlsdGVyKG89Pm8udGl0bGUpLm1hcCgobyxpKT0+SGQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHgubGkse2NsYXNzTmFtZToiYyBlYiBiIHYgaHggaHkiLGtleTppLG9uQ2xpY2s6KCk9PntlKG8udmFsdWUpfSxzdHlsZTp7YmFja2dyb3VuZENvbG9yOnQ9PT1vLnZhbHVlPyIjRkVGNUYzIjoid2hpdGUiLCImOmhvdmVyIjp7YmFja2dyb3VuZENvbG9yOiIjRkVGNUYzIn19fSxvPy5pY29uLEhkLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhZSx7Y29sb3I6dD09PW8udmFsdWU/Im9yYW5nZSI6Im5hdnkiLHN0eWxlOnttYXJnaW5MZWZ0Om8uaWNvbj8iMTVweCI6IjM1cHgiLHRleHRUcmFuc2Zvcm06ImNhcGl0YWxpemUifX0sby50aXRsZSkpKSk7dmFyIGo0PSJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEzNDJweCkiO3ZhciBHPXcoVCgpLDEpO3ZhciBqOD0oe2RhdGE6ZX0pPT5HLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgibGkiLHtjbGFzc05hbWU6ImMgYiBpNyB2IGkgZWIgaTggZW4ifSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKLHtjb2xvcjoiYmxhY2sifSxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHttb250aDoic2hvcnQiLGRheToiMi1kaWdpdCIseWVhcjoibnVtZXJpYyJ9KS5mb3JtYXQoZT8ucGVyaW9kX3N0YXJ0KjFlMyksIi0iLCIgIixuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHttb250aDoic2hvcnQiLGRheToiMi1kaWdpdCIseWVhcjoibnVtZXJpYyJ9KS5mb3JtYXQoZT8ucGVyaW9kX2VuZCoxZTMpKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIGk5In0sRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7Ym9sZDohMH0sIlx1MjBBQyIsZT8uYW1vdW50X3BhaWQvMTAwKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiYSIse2hyZWY6ZT8uaW52b2ljZV9wZGYsdGFyZ2V0OiJfYmxhbmsiLHN0eWxlOnttYXJnaW5Ub3A6IjRweCJ9fSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixmaWxsOiIjMDAwMDAwIixoZWlnaHQ6IjE2cHgiLHdpZHRoOiIxNnB4Iix2ZXJzaW9uOiIxLjEiLGlkOiJDYXBhXzEiLHZpZXdCb3g6IjAgMCAyOS45NzggMjkuOTc4In0sRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLG51bGwsRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMjUuNDYyLDE5LjEwNXY2Ljg0OEg0LjUxNXYtNi44NDhIMC40ODl2OC44NjFjMCwxLjExMSwwLjksMi4wMTIsMi4wMTYsMi4wMTJoMjQuOTY3YzEuMTE1LDAsMi4wMTYtMC45LDIuMDE2LTIuMDEyICAgdi04Ljg2MUgyNS40NjJ6In0pLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTE0LjYyLDE4LjQyNmwtNS43NjQtNi45NjVjMCwwLTAuODc3LTAuODI4LDAuMDc0LTAuODI4czMuMjQ4LDAsMy4yNDgsMHMwLTAuNTU3LDAtMS40MTZjMC0yLjQ0OSwwLTYuOTA2LDAtOC43MjMgICBjMCwwLTAuMTI5LTAuNDk0LDAuNjE1LTAuNDk0YzAuNzUsMCw0LjAzNSwwLDQuNTcyLDBjMC41MzYsMCwwLjUyNCwwLjQxNiwwLjUyNCwwLjQxNmMwLDEuNzYyLDAsNi4zNzMsMCw4Ljc0MiAgIGMwLDAuNzY4LDAsMS4yNjYsMCwxLjI2NnMxLjg0MiwwLDIuOTk4LDBjMS4xNTQsMCwwLjI4NSwwLjg2NywwLjI4NSwwLjg2N3MtNC45MDQsNi41MS01LjU4OCw3LjE5MyAgIEMxNS4wOTIsMTguOTc5LDE0LjYyLDE4LjQyNiwxNC42MiwxOC40MjZ6In0pLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIixudWxsKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIsbnVsbCksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLG51bGwpLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIixudWxsKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIsbnVsbCksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLG51bGwpLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIixudWxsKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIsbnVsbCksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLG51bGwpLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIixudWxsKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIsbnVsbCksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLG51bGwpLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIixudWxsKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIsbnVsbCksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLG51bGwpKSkpKSksVzQ9KGUsdCk9Pntzd2l0Y2godC50eXBlKXtjYXNlIlRFWFQiOnJldHVybnsuLi5lLFt0LmZpZWxkXTp0LnBheWxvYWR9O2Nhc2UiTE9BRCI6cmV0dXJue2NvdW50cnk6dC5wYXlsb2FkPy5iaWxsaW5nPy5jb3VudHJ5LGFkZHJlc3M6dC5wYXlsb2FkPy5iaWxsaW5nPy5hZGRyZXNzLGFkZHJlczI6dC5wYXlsb2FkPy5iaWxsaW5nPy5hZGRyZXMyLGNpdHk6dC5wYXlsb2FkPy5iaWxsaW5nPy5jaXR5LHppcDp0LnBheWxvYWQ/LmJpbGxpbmc/LnppcH19fSxIND0oe2RhdGE6ZX0pPT57bGV0IHQ9VSgpLFtyLG5dPSgwLEcudXNlUmVkdWNlcikoVzQse2NhcmROdW1iZXI6dm9pZCAwLGN2Yzp2b2lkIDAsZXhwTW9udGg6dm9pZCAwLGV4cFllYXI6dm9pZCAwfSksW28saV09KDAsRy51c2VSZWR1Y2VyKShXNCx7Y291bnRyeToiIixhZGRyZXNzOiIiLGFkZHJlczI6IiIsY2l0eToiIix6aXA6IiJ9KSxsPU9lKCksW3MsYV09KDAsRy51c2VTdGF0ZSkoIiIpLFt1LHBdPSgwLEcudXNlU3RhdGUpKDQpLFtjLGZdPSgwLEcudXNlU3RhdGUpKFtdKTsoMCxHLnVzZUVmZmVjdCkoKCk9PnthKCIiKX0sW3JdKSwoMCxHLnVzZUVmZmVjdCkoKCk9PnsoYXN5bmMoKT0+e2F3YWl0IHQuY2FsbCgic3RyaXBlOnJldHJpZXZlLWN1c3RvbWVyLWludm9pY2UiLHtjdXN0b21lcklkOmUuY3VzdG9tZXJJZCxsaW1pdDp1fSkudGhlbihTPT5mKFMuZGF0YSkpfSkoKX0sW3UsZV0pLCgwLEcudXNlRWZmZWN0KSgoKT0+e2koe3R5cGU6IkxPQUQiLHBheWxvYWQ6ZX0pfSxbZV0pO2xldCBkPWg9PntuKHt0eXBlOiJURVhUIixmaWVsZDpoLnRhcmdldC5pZCxwYXlsb2FkOmgudGFyZ2V0LnZhbHVlfSl9LG09aD0+e2koe3R5cGU6IlRFWFQiLGZpZWxkOmgudGFyZ2V0LmlkLHBheWxvYWQ6aC50YXJnZXQudmFsdWV9KX07cmV0dXJuIEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFllLHt0aXRsZToiQmlsbGluZyJ9LEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJ0LHt0aXRsZToiQmlsbGluZyBBZHJlc3MiLG9uVXBkYXRlOmFzeW5jKCk9PntsZXQgaD1vO2guYWRkcmVzMj09PSIiJiZkZWxldGUgaC5hZGRyZXMyLGF3YWl0IHQuY2FsbCgic3RyaXBlOnVwZGF0ZS1iaWxsaW5nIix7dXNlcjplLGJpbGxpbmc6aH0pfX0sRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6IkFkZHJlc3MgbGluZSAxIix0eXBlOiJ0ZXh0Iix2YWx1ZTpvLmFkZHJlc3Msc2V0VmFsdWU6bSxuYW1lOiJhZGRyZXNzIn0pLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose2xhYmVsOiJBZGRyZXNzIGxpbmUgMiIsdHlwZToidGV4dCIsdmFsdWU6by5hZGRyZXMyLHNldFZhbHVlOm0sbmFtZToiYWRkcmVzczIifSksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6IkNvdW50cnkiLHR5cGU6InRleHQiLHZhbHVlOm8uY291bnRyeSxzZXRWYWx1ZTptLG5hbWU6ImNvdW50cnkifSksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6IkNpdHkiLHR5cGU6InRleHQiLHZhbHVlOm8uY2l0eSxzZXRWYWx1ZTptLG5hbWU6ImNpdHkifSksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7cmVxdWlyZWQ6ITAsbGFiZWw6IlpJUCIsdHlwZToidGV4dCIsdmFsdWU6by56aXAsc2V0VmFsdWU6bSxuYW1lOiJ6aXAifSkpLEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImFxIGIgcCJ9LEcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEssbnVsbCwiSW52b2ljZXMiKSxHLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIGggcCJ9LGM/Lm1hcCgoaCxTKT0+Ry5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoajgse2tleTpTLGRhdGE6aH0pKSksRy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7Y29sb3I6ImJsYWNrIixzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byIsbWFyZ2luVG9wOjI0fSxvbkNsaWNrOigpPT57cCh1KzQpfX0sIlNob3cgTW9yZSIpKSl9O3ZhciBPdD13KFQoKSwxKTt2YXIgVzg9W3t0aXRsZToiR2VuZXJhbCBpbmZvIn0se3RpdGxlOiJBZHZlcnRpc2VtZW50In0se3RpdGxlOiJTdWJzY3JpcHRpb25zIn0se3RpdGxlOiJPcGluaW9uICYgY29tbWVudHMifSx7dGl0bGU6Ik90aGVyIn1dLFU0PSh7ZGF0YTplfSk9PntsZXRbdCxyXT0oMCxPdC51c2VTdGF0ZSkoIiIpLFtuLG9dPSgwLE90LnVzZVN0YXRlKSgiIiksW2ksbF09KDAsT3QudXNlU3RhdGUpKCIiKSxbcyxhXT0oMCxPdC51c2VTdGF0ZSkoIiIpLHU9VSgpLHA9VGUoKTtyZXR1cm4gT3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFllLHt0aXRsZToiU3VwcG9ydCJ9LE90LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiIsZ2FwOjI0fSxPdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSixudWxsLCJISSB0aGVyZSEgSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvciByZW1hcmtzLCBwbGVhc2UgZmVlbCBmcmVlIHRvIGNvbnRhY3QgdXMgdmlhIHRoZSBmb3JtIGJlbG93IG9yIHZpYSB0aGUgZW1haWxhZHJlc3MgY29udGFjdEBldW9ic2VydmVyLmNvbS4gRm9yIG9waW5pb24gc3VibWlzc2lvbnMsIHdlIHJlY29tbWVuZCBwaWVjZXMgb2YgNjAwXHUyMDEzODAwIHdvcmRzLiBEdWUgdG8gdGhlIHZvbHVtZSBvZiBzdWJtaXNzaW9ucywgRVVvYnNlcnZlciBvbmx5IHJlc3BvbmRzIHRvIHN1Ym1pc3Npb25zIHdlIGFyZSBpbnRlcmVzdGVkIGluIHB1Ymxpc2hpbmcuIiksT3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGJzLHtvcHRpb25zOlc4LG9uU2luZ2xlU2VsZWN0OmM9PnIoYy50aXRsZSksc3R5bGU6e21pbkhlaWdodDoiMzAwcHgifX0sT3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVoIGkwIGkxIGkyIGVpIGN6IGRrIGQ4IGMgYTUgaTMifSxPdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInN2ZyIse2NsYXNzTmFtZToiYjMgaTQgaTUiLHdpZHRoOiIxMyIsaGVpZ2h0OiI5Iix2aWV3Qm94OiIwIDAgMTMgOSIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIn0sT3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTEgMUw2LjUgN0wxMS41IDEiLHN0cm9rZToiYmxhY2siLHN0cm9rZU9wYWNpdHk6IjAuMyIsc3Ryb2tlV2lkdGg6IjIifSkpLE90LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgic3BhbiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoxMixsZWZ0OjIyLGNvbG9yOiJyZ2JhKDAsIDAsIDAsIDAuMzApIixmb250RmFtaWx5OiJHZWlzdFJlZ3VsYXIiLGZvbnRTaXplOiIxNHB4Iixmb250U3R5bGU6Im5vcm1hbCIsZm9udFdlaWdodDoiNTAwIixsaW5lSGVpZ2h0OiJub3JtYWwifX0sIlRvcGljIiksdCkpLE90LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiLHtjbGFzc05hbWU6ImVoIGkwIGkxIGkyIGk2IGN6IGRrIGQ4IGMgYTUiLHZhbHVlOm4sb25DaGFuZ2U6Yz0+byhjLmN1cnJlbnRUYXJnZXQudmFsdWUpfSksaSYmT3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGh0LHtjb2xvcjoib3JhbmdlIixzdHlsZTp7bWFyZ2luVG9wOiIxNnB4IixtYXJnaW5Cb3R0b206IjE2cHgifX0saSkscyYmT3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGh0LHtzdHlsZTp7bWFyZ2luVG9wOiIxNnB4IixtYXJnaW5Cb3R0b206IjE2cHgifX0sbWUocykpLE90LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byJ9LG9uQ2xpY2s6YXN5bmMoKT0+e2woIiIpLGEoIiIpLGF3YWl0IHUuY2FsbCgic2VuZDpzdXBwb3J0bWFpbCIse3RvcGljOnQsdGV4dDpuLGVtYWlsOnAuZW1haWx9KS50aGVuKGM9PnthKCJZb3VyIG1lc3NhZ2Ugd2FzIHNlbnQuIiksbygiIikscigiIil9KS5jYXRjaChjPT57bChtZShjLm1lc3NhZ2UpKX0pfX0sIlNlbmQiKSkpfTt2YXIgX2w9dyhUKCksMSk7dmFyIFY0PSh7b25DaGFuZ2U6ZSx2YWx1ZTp0LGRhdGE6cixtZW1iZXJzaGlwOm59KT0+e2xldFtvLGldPSgwLF9sLnVzZVN0YXRlKSghMSk7cmV0dXJuIF9sLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiaiBwIGFxIGh3IGFuIGMiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntkaXNwbGF5OiJmbGV4In19fSwhbyYmX2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse29uQ2xpY2s6KCk9PmkoITApLHZhcmlhbnQ6InRyYW5zcGFyZW50In0sIk9wZW4gTWVudSIpLG8mJnI/LmZpbHRlcihsPT5uPDJ8fG4+Mz9sLnZhbHVlIT09IkJpbGxpbmciOmwpLm1hcChsPT5fbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5saSx7Y2xhc3NOYW1lOiJjIGViIGIgdiBoeCBoeSIsb25DbGljazooKT0+e2UobC52YWx1ZSksaSghMSl9LHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6dD09PWwudmFsdWU/IiNGRUY1RjMiOiJ3aGl0ZSIsIiY6aG92ZXIiOntiYWNrZ3JvdW5kQ29sb3I6IiNGRUY1RjMifX19LGw/Lmljb24sX2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtjb2xvcjp0PT09bC52YWx1ZT8ib3JhbmdlIjoibmF2eSIsc3R5bGU6e21hcmdpbkxlZnQ6bC5pY29uPyIxNXB4IjoiMzVweCIsdGV4dFRyYW5zZm9ybToiY2FwaXRhbGl6ZSJ9fSxsLnRpdGxlKSkpKX07dmFyIFI0PSh7fSk9PntsZXQgZT1VKCksdD1UZSgpLHI9aigpLFtuLG9dPSgwLFR0LnVzZVN0YXRlKSgiTWVtYmVyc2hpcCIpLGk9RGkoKSxsPU9lKCkscz1be3RpdGxlOiJQcm9maWxlIix2YWx1ZToiUHJvZmlsZSJ9LHt0aXRsZToiTWVtYmVyc2hpcCIsdmFsdWU6Ik1lbWJlcnNoaXAiLGljb246VHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KERzLHtzdHlsZTp7fX0pfSx7dGl0bGU6Ik5vdGlmaWNhdGlvbnMiLHZhbHVlOiJOb3RpZmljYXRpb25zIn0se3RpdGxlOiJTdXBwb3J0Iix2YWx1ZToiU3VwcG9ydCJ9LHsuLi50Lm1lbWJlcnNoaXA9PT0yfHx0Lm1lbWJlcnNoaXA9PT0zP3t0aXRsZToiQmlsbGluZyIsdmFsdWU6IkJpbGxpbmcifTpudWxsfV07cmV0dXJuIFR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtkaXJlY3Rpb246ImNvbHVtbiJ9LFR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiIHAgYXEgYyBhciBhcyBhYiBhdCIsc3R5bGU6e2JvcmRlckNvbG9yOmIoIm5hdnkiKSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOntwYWRkaW5nOiI1NHB4IDI0cHgifX19LFR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSx7Y29sb3I6Im9yYW5nZSIsc3R5bGU6e3RleHRBbGlnbjoibGVmdCJ9fSx0Py5maXJzdE5hbWUsIiAiLHQ/Lmxhc3ROYW1lKSxUdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSGwse3N0eWxlOnt0ZXh0QWxpZ246ImxlZnQifX0sdC50eXBlIT09ImNtc3VzZXIiP2kudGl0bGU6bnVsbCksVHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgYXUgcyJ9LFR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtvbkNsaWNrOmFzeW5jKCk9Pnthd2FpdCBlLnNldEF1dGhTdGF0ZSh7dG9rZW46bnVsbCxwZXJzaXN0ZW50OiEwfSksYXdhaXQgci5zZXRMb2NhdGlvbigiLyIpLGF3YWl0IGwoImxvZ291dCIsIllvdSBhcmUgbG9nZ2VkIG91dCIpfSxjb2xvcjoiYmxhY2sifSwiTG9nIG91dCIpLGkudmFsdWU9PT0iZnJlZSJ8fGkudmFsdWU9PT0ibmV3c2xldHRlciI/VHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse29uQ2xpY2s6KCk9PnIuc2V0UGF0aCh7c2VjdGlvbjoicmVnaXN0ZXIiLGlkOm51bGx9KX0sIlVwZ3JhZGUiKTpudWxsKSksdC50eXBlIT09ImNtc3VzZXIiP1R0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtnYXA6NjQsc3R5bGU6e3BhZGRpbmdUb3A6NzAsW2o0XTp7cGFkZGluZ0xlZnQ6IjE2cHgiLHBhZGRpbmdSaWdodDoiMTZweCJ9LCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3BhZGRpbmdUb3A6IjIwcHgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsZ2FwOiIyMHB4In19LGFsaWduOiJzdGFydCJ9LFR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgkNCx7bWVtYmVyc2hpcDppLGRhdGE6cyx2YWx1ZTpuLG9uQ2hhbmdlOm99KSxUdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVjQse21lbWJlcnNoaXA6aSxkYXRhOnMsdmFsdWU6bixvbkNoYW5nZTpvfSksbj09PSJQcm9maWxlIj9UdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUDQse2RhdGE6dH0pOm49PT0iTWVtYmVyc2hpcCI/VHQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEI0LHtkYXRhOnQsbWVtYmVyc2hpcDp0Lm1lbWJlcnNoaXB9KTpuPT09IkJpbGxpbmciP1R0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChINCx7ZGF0YTp0fSk6bj09PSJTdXBwb3J0Ij9UdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVTQse2RhdGE6dH0pOlR0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChGNCx7ZGF0YTp0fSkpOm51bGwpfTt2YXIgQ249dyhUKCksMSk7dmFyIEc0PSh7aWQ6ZX0pPT57bGV0e2RhdGE6dCxsb2FkaW5nOnJ9PXBlKCJnZXQtYmlvLWJ5LWlkIix7aWQ6ZX0pO3JldHVybiByP251bGw6Q24uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGJlLHtzdHlsZTp7Ym9yZGVyVG9wOiIycHggc29saWQgYmxhY2sifX0sQ24uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse3N0eWxlOntiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMjU0LCAyNDUsIDI0MywgMSkiLHBhZGRpbmc6NjQsIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZzoiMjRweCJ9fX0sQ24uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAse2dhcDo2NCxqdXN0aWZ5OiJzdGFydCIsc3R5bGU6e21heFdpZHRoOjFlMyxtYXJnaW46IjBweCBhdXRvIn19LENuLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiYyBiZCBiZSBiZiBiZyIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjpiKCJuYXZ5IiksYmFja2dyb3VuZEltYWdlOnZyKHQ/LnByb2ZpbGVJbWc/LnNyYywhMCwxNTYpLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e2Rpc3BsYXk6Im5vbmUifX19KSxDbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYiBwIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7YWxpZ25JdGVtczoiY2VudGVyIix3aWR0aDoiMTAwJSIsZ2FwOiI0cHgifX19LENuLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7Y2xhc3NOYW1lOiJiaCBhZSBnIGJpIGJlIGJmIGJnIGJqIixzdHlsZTp7YmFja2dyb3VuZENvbG9yOmIoIm5hdnkiKSxiYWNrZ3JvdW5kSW1hZ2U6dnIodD8ucHJvZmlsZUltZz8uc3JjLCEwLDE1NiksIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7ZGlzcGxheToiYmxvY2sifX19KSxDbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyx7c3R5bGU6e21hcmdpbkJvdHRvbToxMH19LHQ/LmZpcnN0TmFtZXx8IiIsIiAiLHQ/Lmxhc3ROYW1lfHwiIiksQ24uZGVmYXVsdC5jcmVhdGVFbGVtZW50KEose3N0eWxlOnttYXJnaW5Cb3R0b206OH19LHQ/LnJvbGU9PT0xPyJBZG1pbmlzdHJhdG9yIjp0Py5yb2xlPT09Mj8iRWRpdG9yIjp0Py5yb2xlPT09Mz8iSm91cm5hbGlzdCI6dD8ucm9sZT09PTQ/Ik1lZGlhIFVzZXIiOiIiKSxDbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQob24se3N0eWxlOnttYXJnaW5Ub3A6IjI0cHgifSx0ZXh0OnQ/LmJpb3x8IiJ9KSkpKSxDbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYmsgYmwifSxDbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoemkse3R5cGU6InVzZXIiLHVzZXI6ZX0pKSl9O3ZhciB3cj13KFQoKSwxKTt2YXIgeGU9dyhUKCksMSk7dmFyIGtsPXcoVCgpLDEpO3ZhciB1bz0oe2luZGV4OmUsdGl0bGU6dCxzZXRTdGVwOnIsc2V0VmFsdWU6bn0pPT5rbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYiBjIGhpIHYgaGogaSBhMyJ9LGtsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChkZSxudWxsLHQpLGtsLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIGI4In0sa2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImhrIGhsIGJlIGhtIixzdHlsZTp7Ym9yZGVyQ29sb3I6ZT09PTA/Yigib3JhbmdlIik6ImJsYWNrIixiYWNrZ3JvdW5kQ29sb3I6ZT09PTA/Yigib3JhbmdlIik6IndoaXRlIn0sb25DbGljazooKT0+e24oIiIpLHIoMCl9fSksa2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImhrIGhsIGJlIGhtIixzdHlsZTp7Ym9yZGVyQ29sb3I6ZT09PTE/Yigib3JhbmdlIik6ImJsYWNrIixiYWNrZ3JvdW5kQ29sb3I6ZT09PTE/Yigib3JhbmdlIik6IndoaXRlIn19KSxrbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaGsgaGwgYmUgZWgiLHN0eWxlOntib3JkZXJDb2xvcjplPT09Mj9iKCJvcmFuZ2UiKToiYmxhY2siLGJhY2tncm91bmRDb2xvcjplPT09Mj9iKCJvcmFuZ2UiKToid2hpdGUifX0pKSk7dmFyIEg4PSh7dmFsdWU6ZSxvbkNoYW5nZTp0LGNoZWNrZWQ6cixpdGVtOm4sYmVzdFZhbHVlOm99KT0+e2xldCBpPSgwLHhlLnVzZVJlZikoKSx7Ym9keTpsLHRpdGxlOnMscHJpY2U6YX09bjtyZXR1cm4geGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHgubGFiZWwse2NsYXNzTmFtZToiZXIgZWIgZWQgYiBlcyBpIGRzIGV0IixzdHlsZTp7IiY6aG92ZXIiOntiYWNrZ3JvdW5kOiJyZ2JhKDI0MCwgODIsIDYwLCAwLjA2KSJ9fX0seGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJpbnB1dCIse2NsYXNzTmFtZToiYjMgZXUgZXYgZXcgZXggYTYgZXkgY3EgZXoiLHJlZjppLHR5cGU6InJhZGlvIixzdHlsZTp7bWFyZ2luOi0xfSx2YWx1ZTplLGNoZWNrZWQ6cixvbkNoYW5nZTp1PT57dCh1LnRhcmdldC52YWx1ZSl9fSkseGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgZjAifSx4ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZjEgZWggZjIgZjMgYiBiZSB2IGFiIGN1In0scj94ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYmUgZjQgZjUiLHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6Yigib3JhbmdlIil9fSk6bnVsbCkseGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImIgcCJ9LG8/eGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFgse2NvbG9yOiJvcmFuZ2UifSwiQmVzdCBWYWx1ZSIpOm51bGwseGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGh0LHtib2xkOiEwfSxzKSx4ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSix7c3R5bGU6e21heFdpZHRoOiI0NThweCJ9fSxsKSkpLHhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChodCx7c3R5bGU6e21hcmdpblRvcDoiYXV0byJ9LGJvbGQ6ITB9LGEpKX0sVTg9W3t0aXRsZToiTmV3c2xldHRlciBNZW1iZXJzaGlwIixwcmljZToiZnJlZSIsYm9keToiU3Vic2NyaWJlIHRvIG91ciBuZXdzbGV0dGVyIGFuZCByZWFkIDMgYXJ0aWNsZXMgZm9yIGZyZWUiLHZhbHVlOiJvbmNlIn0se3RpdGxlOiJNb250aGx5IE1lbWJlcnNoaXAiLHByaWNlOiJcdTIwQUMxMS8gbW9udGgiLGJvZHk6IlNob3J0LXRlcm0gY29tbWl0bWVudCwgcGF5IHBlciBtb250aC4gQ2FuY2VsIGFueXRpbWUuIix2YWx1ZToibW9udGhseSJ9LHtiZXN0VmFsdWU6ITAsdGl0bGU6IlllYXJseSBNZW1iZXJzaGlwIixwcmljZToiXHUyMEFDOTAvIHllYXIiLGJvZHk6IkNvbW1pdCB0byBvbmUgeWVhciBvZiBhY2Nlc3MgdG8gYWxsIG9mIEVVb2JzZXJ2ZXIuIix2YWx1ZToieWVhcmx5In0se3RpdGxlOiJVbmRlciAyNSBNZW1iZXJzaGlwIixwcmljZToiXHUyMEFDMS8gbW9udGgiLGJvZHk6IkJlY2F1c2Ugd2Uga25vdyB0aGVyZSdzIG90aGVyIHRoaW5ncyB5b3UgbmVlZCB0byBzcGVuZCB5b3VyIG1vbmV5IG9uLiIsdmFsdWU6InN0dWRlbnQifSx7dGl0bGU6Ikdyb3VwIG1lbWJlcnNoaXAiLHByaWNlOiJvbiByZXF1ZXN0Iixib2R5OiJHZXQgeW91ciBjb2xsZWFndWVzIGFjY2VzcyB0byBhbGwgdGhlIEVVIG5ld3MgdGhhdCByZWFsbHkgbWF0dGVycywgcGx1cyAyNSB5ZWFycyBvZiBhcmNoaXZlcy4iLHZhbHVlOiJncm91cCJ9XSxxND0oZSx0LHIpPT5VOC5tYXAoKG4sbyk9PnI/LnVzZXJJZCYmbz09PTA/bnVsbDp4ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSDgse2Jlc3RWYWx1ZTpuLmJlc3RWYWx1ZSxjaGVja2VkOmU9PT1uLnZhbHVlLG9uQ2hhbmdlOmk9PnQoaSksdmFsdWU6bi52YWx1ZSxrZXk6bi50aXRsZSxpdGVtOm59KSksUTQ9KHtsaW5rOmUsdmFsdWU6dCxzZXRWYWx1ZTpyLHNldFN0ZXA6bn0pPT57bGV0IG89VGUoKSxbaSxsXT0oMCx4ZS51c2VTdGF0ZSkoKCk9PnE0KHQscixvKSk7cmV0dXJuKDAseGUudXNlRWZmZWN0KSgoKT0+e3IoInllYXJseSIpfSxbXSksKDAseGUudXNlRWZmZWN0KSgoKT0+e2wocTQodCxyLG8pKX0sW3RdKSx4ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYse2NsYXNzTmFtZToiYiBwIGMiLHN0eWxlOnsiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7cGFkZGluZ0xlZnQ6IjE2cHgiLHBhZGRpbmdSaWdodDoiMTZweCJ9fX0seGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHVvLHtpbmRleDowLHRpdGxlOiJTZWxlY3QgeW91ciBwbGFuIixzZXRWYWx1ZTpyLHNldFN0ZXA6bn0pLCFvPy51c2VySWQmJnhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4ZS5kZWZhdWx0LkZyYWdtZW50LG51bGwseGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGh0LHtjb2xvcjoibmF2eSIsc3R5bGU6e21hcmdpblRvcDoyNCwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7bWFyZ2luTGVmdDoiMHB4IixtYXJnaW5SaWdodDoiMHB4IixtYXJnaW5Ub3A6IjI0cHgifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttYXJnaW5Ub3A6IjE2cHgifX19LCJTaW5jZSAyMDAwLCBFVW9ic2VydmVyIGlzIHRoZSBwcmVtaWVyLCBtZW1iZXItc3VwcG9ydGVkLCBub24tcHJvZml0IG5ld3Mgc2l0ZSBvbiBFVSBhZmZhaXJzLiBPdXIgY2l2aWMgam91cm5hbGlzbSBrZWVwcyBwb3dlciBpbiBjaGVjayBhbmQgcHJvdmlkZXMgYSB2b2ljZSBmb3IgdGhvc2Ugbm90IGhlYXJkLiIpLHhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChodCx7c3R5bGU6e2NvbG9yOmIoIm5hdnkiKSxtYXJnaW5Ub3A6MjQsbWFyZ2luQm90dG9tOiIxNnB4IiwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIjp7bWFyZ2luTGVmdDoiMHB4IixtYXJnaW5SaWdodDoiMHB4IixtYXJnaW5Ub3A6IjI0cHgifSwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NDBweCkiOnttYXJnaW5Ub3A6IjE2cHgiLGxpbmVIZWlnaHQ6IjI0cHgifX19LCJXZSBhcmUgbm90IG93bmVkIGJ5IGNvcnBvcmF0aW9ucyBvciBiaWxsaW9uYWlyZXMuIEJ5IGJlY29taW5nIGEgc3VwcG9ydGluZyBtZW1iZXIgeW91J3JlIGJhY2tpbmcgb3VyIGluZGVwZW5kZW50IGpvdXJuYWxpc20uIikpLHhlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIHAifSxpKSx4ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7ZW50ZXI6ITAsc3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8iLG1hcmdpblRvcDo0MH0sb25DbGljazp0PT09Im9uY2UiPygpPT5uKDMpOnQ9PT0iZ3JvdXAiPygpPT5uKCJncm91cCIpOm8udXNlcklkPygpPT57d2luZG93Lm9wZW4oZSksc2V0VGltZW91dCgoKT0+e24oMil9LDEwMCkscigidXBncmFkZSIpfTooKT0+bigxKX0sby51c2VySWQ/IlVwZ3JhZGUiOiJDb250aW51ZSIpKX07dmFyIHV0PXcoVCgpLDEpO3ZhciBLND0oe2xpbms6ZSxmb3JtOnQsaGFuZGxlVGV4dENoYW5nZTpyLHNldFN0ZXA6bix2YWx1ZTpvfSk9PntsZXRbaSxsXT0oMCx1dC51c2VTdGF0ZSkoIiIpLHM9VSgpLGE9aigpLHt1c2VySWQ6dX09TnQoKTtyZXR1cm4oMCx1dC51c2VFZmZlY3QpKCgpPT57d2luZG93LnNjcm9sbFRvKDAsMCl9LFtdKSwoMCx1dC51c2VFZmZlY3QpKCgpPT57bCgiIil9LFt0XSksdXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImIgYyBwIGVvIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZzoiMHB4IDEycHgifX19LHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1byx7dGl0bGU6IkNyZWF0ZSB5b3VyIGFjY291bnQiLGluZGV4OjEsc2V0VmFsdWU6KCk9Pnt9LHNldFN0ZXA6bn0pLHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJlcCBlZCBlcSJ9LHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChSdCx7dGl0bGU6IlBlcnNvbmFsIERldGFpbHMifSx1dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7c2V0VmFsdWU6cixyZXF1aXJlZDohMCxsYWJlbDoiRmlyc3QgTmFtZSIsbmFtZToiZmlyc3ROYW1lIn0pLHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHtzZXRWYWx1ZTpyLHJlcXVpcmVkOiEwLGxhYmVsOiJMYXN0IE5hbWUiLG5hbWU6Imxhc3ROYW1lIn0pLHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHt0eXBlOiJwYXNzd29yZCIsc2V0VmFsdWU6cixyZXF1aXJlZDohMCxsYWJlbDoiUGFzc3dvcmQiLG5hbWU6InBhc3N3b3JkIn0pLHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHt0eXBlOiJwYXNzd29yZCIsc2V0VmFsdWU6cixyZXF1aXJlZDohMCxsYWJlbDoiQ29uZmlybSBQYXNzd29yZCIsbmFtZToiY29uZmlybVBhc3N3b3JkIn0pLHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHtzZXRWYWx1ZTpyLHJlcXVpcmVkOiEwLGxhYmVsOiJFbWFpbCIsbmFtZToiZW1haWwifSksbz09PSJzdHVkZW50Ij91dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7c2V0VmFsdWU6cix0eXBlOiJkYXRlIixyZXF1aXJlZDohMCxsYWJlbDoiRGF0ZSBvZiBCaXJ0aCIsbmFtZToiZGF0ZU9mQmlydGgifSk6bnVsbCkpLHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLHtzdHlsZTp7bWFyZ2luVG9wOjEyfSxjb2xvcjoib3JhbmdlIn0sbWUoaSkpLHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byIsbWFyZ2luVG9wOjMwfSxnYXA6MTZ9LHV0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byJ9LGNvbG9yOiJibGFjayIsb25DbGljazooKT0+bigwKX0sIkdvIEJhY2siKSx1dC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7ZW50ZXI6ITAsb25DbGljazpPYmplY3QudmFsdWVzKHQpLmV2ZXJ5KEJvb2xlYW4pP2FzeW5jKCk9PntpZihvPT09InN0dWRlbnQiJiZuZXcgRGF0ZShEYXRlLm5vdygpKS5nZXRGdWxsWWVhcigpLW5ldyBEYXRlKHQuZGF0ZU9mQmlydGgpLmdldEZ1bGxZZWFyKCk+MjUpbCgiWW91IGFyZSB0b28gb2xkIHRvIHF1YWxpZnkgZm9yIHRoZSBzdHVkZW50IG1lbWJlcnNoaXAiKTtlbHNle2xldCBwPXNldFRpbWVvdXQoKCk9PntsKCJwYXltZW50IGluIHByb2dyZXNzIiksd2luZG93Lm9wZW4oZSwiX2JsYW5rIiksbigyKX0sMWUzKTtzLmNhbGwoIndlYnNpdGU6Zmxvdy1yZWdpc3RlciIse2VtYWlsOnQuZW1haWwscGFzc3dvcmQ6dC5wYXNzd29yZCxwYXNzd29yZDI6dC5jb25maXJtUGFzc3dvcmQsZmlyc3ROYW1lOnQuZmlyc3ROYW1lLGxhc3ROYW1lOnQubGFzdE5hbWUsZGF0ZU9mQmlydGg6bmV3IERhdGUodC5kYXRlT2ZCaXJ0aCkudmFsdWVPZigpfSkudGhlbigoKT0+e2Euc2V0UGF0aCh7c2VjdGlvbjoiYWNjb3VudCJ9KX0pLmNhdGNoKGM9PntjbGVhclRpbWVvdXQocCksY29uc29sZS5lcnJvcigiRVJST1IiLGMpLGwoYy5tZXNzYWdlKX0pfX06KCk9PntsKCJQbGVhc2UgZmlsbCBpbiBhbGwgZmllbGRzIil9fSwiQ29udGludWUiKSkpfTt2YXIgbHI9dyhUKCksMSk7dmFyIFk0PSh7Zm9ybTplLGhhbmRsZVRleHRDaGFuZ2U6dCxzZXRTdGVwOnJ9KT0+e2xldFtuLG9dPSgwLGxyLnVzZVN0YXRlKSgiIiksaT1VKCk7cmV0dXJuIGxyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiIGMgcCBlbyJ9LGxyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1byx7dGl0bGU6IlJlcXVlc3QgZ3JvdXAgbWVtYmVyc2hpcCIsaW5kZXg6MSxzZXRWYWx1ZTooKT0+e30sc2V0U3RlcDpyfSksbHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVwIGVkIGVxIn0sbHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJ0LHt0aXRsZToiUGVyc29uYWwgRGV0YWlscyJ9LGxyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHtzZXRWYWx1ZTp0LHJlcXVpcmVkOiEwLGxhYmVsOiJGaXJzdCBOYW1lIixuYW1lOiJmaXJzdE5hbWUifSksbHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3NldFZhbHVlOnQscmVxdWlyZWQ6ITAsbGFiZWw6Ikxhc3QgTmFtZSIsbmFtZToibGFzdE5hbWUifSksbHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3NldFZhbHVlOnQscmVxdWlyZWQ6ITAsbGFiZWw6IkVtYWlsIixuYW1lOiJlbWFpbCJ9KSxsci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7c2V0VmFsdWU6dCxyZXF1aXJlZDohMCxsYWJlbDoiUGhvbmUgTnVtYmVyIixuYW1lOiJwaG9uZU51bWJlciJ9KSxsci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWix7c2V0VmFsdWU6dCx0eXBlOiJ0ZXh0IixyZXF1aXJlZDohMCxsYWJlbDoiT3JnYW5pemF0aW9uIC8gSW5zdGl0dXRlIixuYW1lOiJvcmdhbml6YXRpb24ifSkpKSxsci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSyx7c3R5bGU6e21hcmdpblRvcDoxMn0sY29sb3I6Im9yYW5nZSJ9LG1lKG4pKSxsci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUCx7c3R5bGU6e21hcmdpblRvcDoiMzBweCIsbWFyZ2luTGVmdDoiYXV0byJ9LGdhcDoxNn0sbHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEEse3N0eWxlOnttYXJnaW5MZWZ0OiJhdXRvIn0sY29sb3I6ImJsYWNrIixvbkNsaWNrOigpPT5yKDApfSwiR28gQmFjayIpLGxyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtlbnRlcjohMCxvbkNsaWNrOk9iamVjdC52YWx1ZXMoZSkuZXZlcnkoQm9vbGVhbik/YXN5bmMoKT0+e2F3YWl0IGkuY2FsbCgid2Vic2l0ZTpncm91cC1hcHBsaWNhdGlvbiIse2ZpcnN0TmFtZTplLmZpcnN0TmFtZSxsYXN0TmFtZTplLmxhc3ROYW1lLGVtYWlsOmUuZW1haWwscGhvbmVOdW1iZXI6ZS5waG9uZU51bWJlcixvcmdhbml6YXRpb246ZS5vcmdhbml6YXRpb259KSxyKDIpfTooKT0+bygiUGxlYXNlIGZpbGwgaW4gYWxsIGZpZWxkcyIpfSwiQ29udGludWUiKSkpfTt2YXIgbnQ9dyhUKCksMSk7dmFyIFg0PSh7Zm9ybTplLGhhbmRsZVRleHRDaGFuZ2U6dCxzZXRTdGVwOnIsc2V0VmFsdWU6bn0pPT57bGV0W28saV09KDAsbnQudXNlU3RhdGUpKCIiKSxbbCxzXT0oMCxudC51c2VTdGF0ZSkoIiIpLGE9aigpLHU9VSgpLHA9T2UoKTtyZXR1cm4oMCxudC51c2VFZmZlY3QpKCgpPT57aSgiIikscygiIil9LFtlXSksKDAsbnQudXNlRWZmZWN0KSgoKT0+e289PT0iUmVnaXN0cmF0aW9uIENvbXBsZXRlIiYmKHIoMikscCgicmVnaXN0ZXJlZCIsIllvdSBoYXZlIHN1Y2Nlc2Z1bGx5IHJlZ2lzdGVyZWQiKSl9LFtvXSksKDAsbnQudXNlRWZmZWN0KSgoKT0+e3dpbmRvdy5zY3JvbGxUbygwLDApfSxbXSksbnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGl2LHtjbGFzc05hbWU6ImIgYyBwIGVvIixzdHlsZTp7IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIjp7cGFkZGluZzoiMHB4IDEycHgifX19LG50LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1byx7dGl0bGU6IkZyZWUgTmV3c2xldHRlciBtZW1iZXJzaGlwIixpbmRleDoxLHNldFZhbHVlOm4sc2V0U3RlcDpyfSksbnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVwIGVkIGVxIn0sbnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJ0LHt0aXRsZToiUGVyc29uYWwgRGV0YWlscyJ9LG50LmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHtzZXRWYWx1ZTp0LHJlcXVpcmVkOiEwLGxhYmVsOiJGaXJzdCBOYW1lIixuYW1lOiJmaXJzdE5hbWUifSksbnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3NldFZhbHVlOnQscmVxdWlyZWQ6ITAsbGFiZWw6Ikxhc3QgTmFtZSIsbmFtZToibGFzdE5hbWUifSksbnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3R5cGU6InBhc3N3b3JkIixzZXRWYWx1ZTp0LHJlcXVpcmVkOiEwLGxhYmVsOiJQYXNzd29yZCIsbmFtZToicGFzc3dvcmQifSksbnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3R5cGU6InBhc3N3b3JkIixzZXRWYWx1ZTp0LHJlcXVpcmVkOiEwLGxhYmVsOiJDb25maXJtIFBhc3N3b3JkIixuYW1lOiJjb25maXJtUGFzc3dvcmQifSksbnQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3NldFZhbHVlOnQscmVxdWlyZWQ6ITAsbGFiZWw6IkVtYWlsIixuYW1lOiJlbWFpbCJ9KSkpLG50LmRlZmF1bHQuY3JlYXRlRWxlbWVudChLLHtzdHlsZTp7bWFyZ2luVG9wOjEyfSxjb2xvcjoib3JhbmdlIn0sbWUobykpLG50LmRlZmF1bHQuY3JlYXRlRWxlbWVudChQLHtzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byIsbWFyZ2luVG9wOjMwfSxnYXA6MTZ9LG50LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtzdHlsZTp7bWFyZ2luTGVmdDoiYXV0byJ9LGNvbG9yOiJibGFjayIsb25DbGljazooKT0+e24oIiIpLHIoMCl9fSwiR28gQmFjayIpLG50LmRlZmF1bHQuY3JlYXRlRWxlbWVudChBLHtvbkNsaWNrOk9iamVjdC52YWx1ZXMoZSkuZXZlcnkoQm9vbGVhbik/YXN5bmMoKT0+e2koIlt3ZWJzaXRlLXVzZXJdIFBsZWFzZSBjaGVjayB5b3VyIGVtYWlsIHRvIHZlcmlmeSB5b3VyIGFjY291bnQiKTt0cnl7YXdhaXQgdS5jYWxsKCJ3ZWJzaXRlOnJlZ2lzdGVyIix7ZW1haWw6ZS5lbWFpbCxwYXNzd29yZDplLnBhc3N3b3JkLHBhc3N3b3JkMjplLmNvbmZpcm1QYXNzd29yZCxmaXJzdE5hbWU6ZS5maXJzdE5hbWUsbGFzdE5hbWU6ZS5sYXN0TmFtZSxuZXdzbGV0dGVyOiEwfSkudGhlbihjPT57YS5zZXRQYXRoKHtzZWN0aW9uOiJhY2NvdW50In0pfSl9Y2F0Y2goYyl7aShjLm1lc3NhZ2UpfX06KCk9PntpKCJQbGVhc2UgZmlsbCBpbiBhbGwgZmllbGRzIil9fSwiQ29udGludWUiKSkpfTt2YXIgcXQ9dyhUKCksMSk7dmFyIFo0PSh7dmFsdWU6ZSxzZXRWYWx1ZTp0LHNldFN0ZXA6cn0pPT57bGV0IG49aigpLG89VGUoKSxpPVUoKSxbbCxzXT0oMCxxdC51c2VTdGF0ZSkoITEpLFthLHVdPSgwLHF0LnVzZVN0YXRlKSghMSk7cmV0dXJuKDAscXQudXNlRWZmZWN0KSgoKT0+e3Moby5tYWdhemluZT09PTEpLHUoby5uZXdzbGV0dGVyPT09MSl9LFtvLmNoZWNrc3VtXSkscXQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHF0LmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxxdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodW8se3NldFZhbHVlOnQsc2V0U3RlcDpyLHRpdGxlOmU9PT0idXBncmFkZSI/IkFjY291bnQgc3VjY2Vzc2Z1bGx5IHVwZ3JhZGVkIjplPT09Imdyb3VwIj8iUmVxdWVzdCBzZW50IjoiQWNjb3VudCBDcmVhdGlvbiBDb21wbGV0ZSIsaW5kZXg6Mn0pLHF0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJmNiBiIHAgZXQifSxxdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobm4sbnVsbCwiRWRpdCBQcm9maWxlIERldGFpbHMiKSxxdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobmEse2Rlc2NyaXB0aW9uOiJSZWNlaXZlIGV1b2JzZXJ2ZXJcdTIwMTlzIGRhaWx5IGVtYWlsIHdpdGggYWxsIHRoZSBFVSBuZXdzIHlvdSBzaG91bGQgbm90IG1pc3MuIix2YWx1ZTphLGxhYmVsOiJOZXdzbGV0dGVyIixuYW1lOiJuZXdzbGV0dGVyIixvbkNoYW5nZTooKT0+dSghYSl9KSxxdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobmEse2Rlc2NyaXB0aW9uOiJTdWJzY3JpYmUgdG8gb3VyIHNlbWktYW51YWwgdG9waWNhbCBtYWdhemluZS4gWW91IHJlY2VpdmUgdGhlIG1hZ2F6aW5lIGluIHlvdXIgZW1haWwiLHZhbHVlOmwsbGFiZWw6Ik1hZ2F6aW5lIixuYW1lOiJtYWdhemluZSIsb25DaGFuZ2U6KCk9PnMoIWwpfSkpLHF0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjIGIgYXogZXAifSxxdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7c3R5bGU6e30sb25DbGljazooKT0+bi5zZXRQYXRoKHtzZWN0aW9uOm51bGwsaWQ6bnVsbH0pfSxxdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeGkse2NvbG9yOiJ3aGl0ZSIsc3R5bGU6e21hcmdpblJpZ2h0OjEyLHRyYW5zZm9ybToicm90YXRlKDE4MGRlZykifX0pLCJSZXR1cm4gdG8gSG9tZXBhZ2UiKSxxdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQSx7Y29sb3I6Im9yYW5nZSIsc3R5bGU6e21hcmdpbkxlZnQ6ImF1dG8ifSxvbkNsaWNrOmFzeW5jKCk9Pnthd2FpdCBpLmNhbGwoImhhbmRsZS1ub3RpZmljYXRpb24tdXBkYXRlIix7ZW1haWw6by5lbWFpbCxuZXdzbGV0dGVyOmEsbWFnYXppbmU6bH0pLmNhdGNoKHA9PmNvbnNvbGUubG9nKHApKX19LCJVcGRhdGUiKSkpfTt2YXIgbjE9KGUsdCk9Pntzd2l0Y2godC50eXBlKXtjYXNlIlRFWFQiOnJldHVybnsuLi5lLFt0LmZpZWxkXTp0LnBheWxvYWR9fX0sSjQ9KHt9KT0+e2xldFtlLHRdPSgwLHdyLnVzZVN0YXRlKSgwKSxyPWooKSxuPVRlKCksW28saV09KDAsd3IudXNlU3RhdGUpKHIucGF0aC5pZD8/InllYXJseSIpLFtsLHNdPSgwLHdyLnVzZVJlZHVjZXIpKG4xLHtlbWFpbDoiIixmaXJzdE5hbWU6IiIsbGFzdE5hbWU6IiIscGFzc3dvcmQ6IiIsY29uZmlybVBhc3N3b3JkOiIifSksW2EsdV09KDAsd3IudXNlUmVkdWNlcikobjEse2VtYWlsOiIiLGZpcnN0TmFtZToiIixsYXN0TmFtZToiIixwYXNzd29yZDoiIixjb25maXJtUGFzc3dvcmQ6IiIsZGF0ZU9mQmlydGg6IiJ9KSxbcCxjXT0oMCx3ci51c2VSZWR1Y2VyKShuMSx7ZW1haWw6IiIsZmlyc3ROYW1lOiIiLGxhc3ROYW1lOiIiLHBob25lTnVtYmVyOiIiLG9yZ2FuaXphdGlvbjoiIn0pLGY9XGAke3dpbmRvdy5FTlY9PT0icHJvZHVjdGlvbiI/bz09PSJzdHVkZW50Ij8iaHR0cHM6Ly9wYXltZW50cy5ldW9ic2VydmVyLmNvbS9iLzRndzNkcjBONmZuZGQyTWZaMyI6bz09PSJtb250aGx5Ij8iaHR0cHM6Ly9wYXltZW50cy5ldW9ic2VydmVyLmNvbS9iLzNjczZwRDNaaTZRSDBnMGRRVSI6bz09PSJ5ZWFybHkiPyJodHRwczovL3BheW1lbnRzLmV1b2JzZXJ2ZXIuY29tL2IvY04yMDFmMlZlM0V2YllJZVVYIjoiIjpvPT09InN0dWRlbnQiPyJodHRwczovL3BheW1lbnRzLmV1b2JzZXJ2ZXIuY29tL2IvdGVzdF9hRVU2cTBjVlA2Wmcxa1FkUVgiOm89PT0ibW9udGhseSI/Imh0dHBzOi8vcGF5bWVudHMuZXVvYnNlcnZlci5jb20vYi90ZXN0X2FFVTI5S2RaVDZaZzZGYTI4ZyI6bz09PSJ5ZWFybHkiPyJodHRwczovL3BheW1lbnRzLmV1b2JzZXJ2ZXIuY29tL2IvdGVzdF9kUjY5Q2NnODE4M2thVnE5QUoiOiIifT9wcmVmaWxsZWRfZW1haWw9JHtuLmVtYWlsP24uZW1haWw6bz09PSJzdHVkZW50Ij9hLmVtYWlsOmwuZW1haWx9XGAsZD1TPT57dSh7dHlwZToiVEVYVCIsZmllbGQ6Uy50YXJnZXQuaWQscGF5bG9hZDpTLnRhcmdldC52YWx1ZX0pfSxtPVM9PntzKHt0eXBlOiJURVhUIixmaWVsZDpTLnRhcmdldC5pZCxwYXlsb2FkOlMudGFyZ2V0LnZhbHVlfSl9O3JldHVybiB3ci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYmUse3N0eWxlOnttYXhXaWR0aDo4NDAscGFkZGluZ0xlZnQ6MjAscGFkZGluZ1JpZ2h0OjIwLHBhZGRpbmdUb3A6MTAwLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3BhZGRpbmdUb3A6IjM1cHgifX19LGU9PT0wP3dyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChRNCx7bGluazpmLHNldFN0ZXA6dCx2YWx1ZTpvLHNldFZhbHVlOml9KTplPT09MT93ci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSzQse3NldFN0ZXA6dCx2YWx1ZTpvLGxpbms6Zixmb3JtOm89PT0ic3R1ZGVudCI/YTpsLGhhbmRsZVRleHRDaGFuZ2U6bz09PSJzdHVkZW50Ij9kOm19KTplPT09Mj93ci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWjQse3NldFN0ZXA6dCxzZXRWYWx1ZTppLHZhbHVlOm99KTplPT09Mz93ci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWDQse3NldFZhbHVlOmksZm9ybTpsLHNldFN0ZXA6dCxoYW5kbGVUZXh0Q2hhbmdlOm19KTp3ci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWTQse3NldFN0ZXA6dCxmb3JtOnAsaGFuZGxlVGV4dENoYW5nZTpTPT57Yyh7dHlwZToiVEVYVCIsZmllbGQ6Uy50YXJnZXQuaWQscGF5bG9hZDpTLnRhcmdldC52YWx1ZX0pfX0pLHdyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhbyxudWxsKSl9O3ZhciBxcj13KFQoKSwxKTt2YXIgVjg9KGUsdCk9Pntzd2l0Y2godC50eXBlKXtjYXNlIlRFWFQiOnJldHVybnsuLi5lLFt0LmZpZWxkXTp0LnBheWxvYWR9O2Nhc2UiTE9BRCI6cmV0dXJue2ZpcnN0TmFtZTp0LnBheWxvYWQuZmlyc3ROYW1lLGxhc3ROYW1lOnQucGF5bG9hZC5sYXN0TmFtZSxlbWFpbDp0LnBheWxvYWQuZW1haWx9fX0sZTM9KHt9KT0+e2xldCBlPWooKSx0PWUucXVlcnkuaW52aXRlVG9rZW4scj1VKCksW24sb109KDAscXIudXNlU3RhdGUpKCIiKSxpPU9lKCksW2wsc109KDAscXIudXNlUmVkdWNlcikoVjgse3Bhc3N3b3JkOiIiLHBhc3N3b3JkMjoiIn0pLGE9dT0+e3Moe3R5cGU6IlRFWFQiLGZpZWxkOnUudGFyZ2V0LmlkLHBheWxvYWQ6dS50YXJnZXQudmFsdWV9KX07cmV0dXJuKDAscXIudXNlRWZmZWN0KSgoKT0+e28oIiIpfSxbbF0pLHFyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7c3R5bGU6e319LHFyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChZZSx7dGl0bGU6IkNvbXBsZXRlIGFjY291bnQgY3JlYXRpb24ifSxxci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUnQse3RpdGxlOiJQbGVhc2UgY3JlYXRlIGEgcGFzc3dvcmQiLG9uVXBkYXRlOmFzeW5jKCk9PmF3YWl0IHIuY2FsbCgid2Vic2l0ZTp2YWxpZGF0ZS1ncm91cC1pbnZpdGUiLHsuLi5sLHRva2VuOnR9KS50aGVuKHU9PntvKHUpLGkoInJlZ2lzdGVyZWQiLCJTaWdudXAgU3VjY2VzZnVsIiksc2V0VGltZW91dCgoKT0+e2Uuc2V0UXVlcnkoe2ludml0ZVRva2VuOm51bGwsc2l0ZVNlY3Rpb246bnVsbH0pfSwxZTMpfSkuY2F0Y2godT0+byhtZSh1Lm1lc3NhZ2UpKSl9LHFyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHt0eXBlOiJwYXNzd29yZCIsc2V0VmFsdWU6YSxyZXF1aXJlZDohMCxsYWJlbDoiUGFzc3dvcmQiLG5hbWU6InBhc3N3b3JkIn0pLHFyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChaLHt0eXBlOiJwYXNzd29yZCIsc2V0VmFsdWU6YSxyZXF1aXJlZDohMCxsYWJlbDoiQ29uZmlybSBQYXNzd29yZCIsbmFtZToicGFzc3dvcmQyIn0pLG4/cXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGFlLHtjb2xvcjoib3JhbmdlIixzdHlsZTp7bWFyZ2luVG9wOjE4fX0sbik6bnVsbCkpKX07dmFyIFFyPXcoVCgpLDEpO3ZhciBSOD0oZSx0KT0+e3N3aXRjaCh0LnR5cGUpe2Nhc2UiVEVYVCI6cmV0dXJuey4uLmUsW3QuZmllbGRdOnQucGF5bG9hZH07Y2FzZSJMT0FEIjpyZXR1cm57Zmlyc3ROYW1lOnQucGF5bG9hZC5maXJzdE5hbWUsbGFzdE5hbWU6dC5wYXlsb2FkLmxhc3ROYW1lLGVtYWlsOnQucGF5bG9hZC5lbWFpbH19fSx0Mz0oe30pPT57bGV0IGU9aigpLHQ9ZS5xdWVyeS5pbnZpdGVUb2tlbixyPVUoKSxbbixvXT0oMCxRci51c2VTdGF0ZSkoIiIpLGk9T2UoKSxbbCxzXT0oMCxRci51c2VSZWR1Y2VyKShSOCx7cGFzc3dvcmQ6IiIscGFzc3dvcmQyOiIifSksYT11PT57cyh7dHlwZToiVEVYVCIsZmllbGQ6dS50YXJnZXQuaWQscGF5bG9hZDp1LnRhcmdldC52YWx1ZX0pfTtyZXR1cm4oMCxRci51c2VFZmZlY3QpKCgpPT57bygiIil9LFtsXSksUXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJtIGJuIn0sUXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFllLHt0aXRsZToiQ2hhbmdlIHBhc3N3b3JkIn0sUXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJ0LHt0aXRsZToiRmlsbCB0aGlzIGZvcm0gdG8gY29tcGxldGUgcGFzc3dvcmQgY2hhbmdlIixvblVwZGF0ZTphc3luYygpPT5hd2FpdCByLmNhbGwoIndlYnNpdGU6dmFsaWRhdGUtcGFzc3dvcmQiLHsuLi5sLHRva2VuOnR9KS50aGVuKHU9PntvKG1lKHUpKSxpKCJwYXNzd29yZCIsIlBhc3N3b3JkIGNoYW5nZWQgc3VjY2VzZnVsbHkiKSxzZXRUaW1lb3V0KCgpPT57ZS5zZXRRdWVyeSh7aW52aXRlVG9rZW46bnVsbCxzaXRlU2VjdGlvbjpudWxsfSl9LDFlMyl9KS5jYXRjaCh1PT5vKG1lKHUubWVzc2FnZSkpKX0sUXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3R5cGU6InBhc3N3b3JkIixzZXRWYWx1ZTphLHJlcXVpcmVkOiEwLGxhYmVsOiJQYXNzd29yZCIsbmFtZToicGFzc3dvcmQifSksUXIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFose3R5cGU6InBhc3N3b3JkIixzZXRWYWx1ZTphLHJlcXVpcmVkOiEwLGxhYmVsOiJDb25maXJtIFBhc3N3b3JkIixuYW1lOiJwYXNzd29yZDIifSksbj9Rci5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYWUse2NvbG9yOiJvcmFuZ2UiLHN0eWxlOnttYXJnaW5Ub3A6MTh9fSxuKTpudWxsKSkpfTt2YXIgVm89dyhUKCksMSk7dmFyIHIzPSh7fSk9PntsZXQgZT1qKCksdD1lLnF1ZXJ5LnJlZ2lzdGVyVG9rZW4scj1VKCksW24sb109KDAsVm8udXNlU3RhdGUpKCIiKSxpPU9lKCk7cmV0dXJuKDAsVm8udXNlRWZmZWN0KSgoKT0+eyhhc3luYygpPT57YXdhaXQgci5jYWxsKCJ3ZWJ1c2VyOnZhbGlkYXRlLXJlZ2lzdGVyIix7dG9rZW46dH0pLmNhdGNoKHM9Pm8obWUocy5tZXNzYWdlKSkpLnRoZW4ocz0+e28ocyksaSgicmVnaXN0ZXJlZCIsIlNpZ251cCBTdWNjZXNmdWwiKSxzZXRUaW1lb3V0KCgpPT57ZS5zZXRRdWVyeSh7cmVnaXN0ZXJUb2tlbjpudWxsLHNpdGVTZWN0aW9uOm51bGx9KX0sMWUzKX0pfSkoKX0sW10pLFZvLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4LmRpdix7c3R5bGU6e319LFZvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChZZSx7dGl0bGU6IlZhbGlkYXRpbmcgUmVnaXN0cmF0aW9uIn0sVm8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJ0LHt0aXRsZToiIn0sbj9Wby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYWUse2NvbG9yOiJvcmFuZ2UiLHN0eWxlOnttYXJnaW5Ub3A6MTh9fSxuKTpudWxsKSkpfTt2YXIgaTM9dyhpMCgpLDEpO3ZhciBHOD1TbShFdix7cmVzdEZhbGxCYWNrOm1uP3twb2xsSW52ZXJ2YWw6MmUzfTp2b2lkIDB9KTtpMy5kZWZhdWx0LmRlZmF1bHQuaW5pdGlhbGl6ZShbe3RyYWNraW5nSWQ6IkctUDRMUTU5UFE0NyJ9XSk7dmFyIHE4PSh7c2VjdGlvbjplLGlkOnQsc2l0ZVNlY3Rpb246cn0pPT5yPT09InZhbGlkYXRlUGFzc3dvcmQiP3RlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChWZSxudWxsLHRlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh0MyxudWxsKSk6cj09PSJ2YWxpZGF0ZUludml0ZSI/dGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFZlLG51bGwsdGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGUzLG51bGwpKTpyPT09InZhbGlkYXRlUmVnaXN0ZXIiP3RlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChWZSxudWxsLHRlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChyMyxudWxsKSk6ZT09PSJhY2NvdW50Ij90ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVmUsbnVsbCx0ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUjQsbnVsbCkpOmU9PT0icmVnaXN0ZXIiP3RlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChWZSxudWxsLHRlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKNCxudWxsKSk6ZT09PSJiaW8iP3Q/dGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEc0LHtpZDp0fSk6bnVsbDplPT09InNlYXJjaCI/dGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFZlLG51bGwsdGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGI0LHtpZDp0fSkpOmU9PT0ic2VjdGlvbiI/dD90ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSnkse2lkOnR9KTpudWxsOmU9PT0ic3RhdGljIj90P3RlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4NCx7aWQ6dH0pOm51bGw6ZT09PSJhcnRpY2xlLXR5cGUiP3Q/dGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEp5LHtpZDp0fSk6bnVsbDp0P3RlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChmNCx7aWQ6dH0pOnRlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChrNCxudWxsKSxuMz0hMSxvMz13aW5kb3cuX3NpZCxROD0oKT0+e2xldCBlPWooIltzZWN0aW9uXS9baWRdIiksdD1lLnBhdGguc2VjdGlvbixyPWUucGF0aC5pZCxuPWUucXVlcnkuc2l0ZVNlY3Rpb24sW28saV09dGUuZGVmYXVsdC51c2VTdGF0ZSgpO3JldHVybiBvMyYmKDAsdGUudXNlTGF5b3V0RWZmZWN0KSgoKT0+e2Uuc2V0UGF0aCh7aWQ6bzMsc2VjdGlvbjoic2VjdGlvbiJ9KX0sW10pLCgwLHRlLnVzZUVmZmVjdCkoKCk9PntuMyYmKHdpbmRvdy5zY3JvbGxUbygwLDApLEFuKCkpLG4zPSEwfSxbdCxyXSksKDAsdGUudXNlRWZmZWN0KSgoKT0+e2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3JldHVybiBsLnNyYz0iaHR0cHM6Ly9zZWN1cmVwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvdGFnL2pzL2dwdC5qcyIsbC5hc3luYz0hMCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpLCgpPT57ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsKX19LFtdKSx0ZS5kZWZhdWx0LnVzZUVmZmVjdCgoKT0+e2koZG9jdW1lbnQuY29va2llLmluY2x1ZGVzKCJldW9icy1vcmctYWNjZXNzPXRydWUiKSl9LFtdKSxlLm5lc3QodGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFlrLHt2YWx1ZTpvfSx0ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeC5kaXYsbnVsbCx0ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUFMsbnVsbCksdGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGJlLHtzdHlsZTp7cGFkZGluZ1RvcDpEZisicHgiLCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSI6e3BhZGRpbmdUb3A6T2YrInB4In19fSx0ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVlMse3NlY3Rpb246dCxpZDpyfSksdGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHE4LHtzaXRlU2VjdGlvbjpuLHNlY3Rpb246dCxpZDpyfSksdGUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFFTLG51bGwpKSkpKX0sbDM9KHtsb2NhdGlvbjplfSk9PnRlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChrdix7Y2xpZW50Okc4fSx0ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoanYse2xvY2F0aW9uOmV9LHRlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChkUyxudWxsLHRlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChROCxudWxsKSkpKTt2YXIgYzM9dyhhMygpLDEpOygwLGMzLmh5ZHJhdGVSb290KShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpLHUzLmNyZWF0ZUVsZW1lbnQobDMsbnVsbCkpO30pKCk7Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246CgpyZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgUmVhY3QKICAgKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpzY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpyZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCiov";
6
- export declare const sentence: string;