@aivorynet/slaide 1.0.0

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 (145) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +201 -0
  3. package/README.md +87 -0
  4. package/bin/slaide.js +25 -0
  5. package/dist/assets.d.ts +10 -0
  6. package/dist/assets.js +54 -0
  7. package/dist/assets.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +433 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/compare/index.d.ts +24 -0
  12. package/dist/compare/index.js +246 -0
  13. package/dist/compare/index.js.map +1 -0
  14. package/dist/compare/ssim.d.ts +2 -0
  15. package/dist/compare/ssim.js +46 -0
  16. package/dist/compare/ssim.js.map +1 -0
  17. package/dist/compiler/chrome.d.ts +7 -0
  18. package/dist/compiler/chrome.js +94 -0
  19. package/dist/compiler/chrome.js.map +1 -0
  20. package/dist/compiler/compile.d.ts +2 -0
  21. package/dist/compiler/compile.js +432 -0
  22. package/dist/compiler/compile.js.map +1 -0
  23. package/dist/compiler/markdown.d.ts +26 -0
  24. package/dist/compiler/markdown.js +439 -0
  25. package/dist/compiler/markdown.js.map +1 -0
  26. package/dist/compiler/tokens.d.ts +13 -0
  27. package/dist/compiler/tokens.js +127 -0
  28. package/dist/compiler/tokens.js.map +1 -0
  29. package/dist/container.d.ts +47 -0
  30. package/dist/container.js +309 -0
  31. package/dist/container.js.map +1 -0
  32. package/dist/engine-entry.d.ts +1 -0
  33. package/dist/engine-entry.js +71 -0
  34. package/dist/engine-entry.js.map +1 -0
  35. package/dist/export-keynote/keynote.d.ts +10 -0
  36. package/dist/export-keynote/keynote.js +58 -0
  37. package/dist/export-keynote/keynote.js.map +1 -0
  38. package/dist/export-pptx/embed-fonts.d.ts +5 -0
  39. package/dist/export-pptx/embed-fonts.js +159 -0
  40. package/dist/export-pptx/embed-fonts.js.map +1 -0
  41. package/dist/export-pptx/inject-anim.d.ts +28 -0
  42. package/dist/export-pptx/inject-anim.js +150 -0
  43. package/dist/export-pptx/inject-anim.js.map +1 -0
  44. package/dist/export-pptx/pptx.d.ts +10 -0
  45. package/dist/export-pptx/pptx.js +425 -0
  46. package/dist/export-pptx/pptx.js.map +1 -0
  47. package/dist/export-pptx/transitions.d.ts +16 -0
  48. package/dist/export-pptx/transitions.js +82 -0
  49. package/dist/export-pptx/transitions.js.map +1 -0
  50. package/dist/import/emit.d.ts +5 -0
  51. package/dist/import/emit.js +274 -0
  52. package/dist/import/emit.js.map +1 -0
  53. package/dist/import/index.d.ts +21 -0
  54. package/dist/import/index.js +192 -0
  55. package/dist/import/index.js.map +1 -0
  56. package/dist/import/pptx.d.ts +117 -0
  57. package/dist/import/pptx.js +1043 -0
  58. package/dist/import/pptx.js.map +1 -0
  59. package/dist/import/raster-com.d.ts +27 -0
  60. package/dist/import/raster-com.js +113 -0
  61. package/dist/import/raster-com.js.map +1 -0
  62. package/dist/import/raster-extension.d.ts +35 -0
  63. package/dist/import/raster-extension.js +27 -0
  64. package/dist/import/raster-extension.js.map +1 -0
  65. package/dist/index.d.ts +63 -0
  66. package/dist/index.js +174 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/install/detect.d.ts +17 -0
  69. package/dist/install/detect.js +82 -0
  70. package/dist/install/detect.js.map +1 -0
  71. package/dist/install/index.d.ts +20 -0
  72. package/dist/install/index.js +126 -0
  73. package/dist/install/index.js.map +1 -0
  74. package/dist/install/registry.d.ts +33 -0
  75. package/dist/install/registry.js +169 -0
  76. package/dist/install/registry.js.map +1 -0
  77. package/dist/install/skills.d.ts +17 -0
  78. package/dist/install/skills.js +72 -0
  79. package/dist/install/skills.js.map +1 -0
  80. package/dist/master-io.d.ts +7 -0
  81. package/dist/master-io.js +55 -0
  82. package/dist/master-io.js.map +1 -0
  83. package/dist/mcp/server.d.ts +3 -0
  84. package/dist/mcp/server.js +114 -0
  85. package/dist/mcp/server.js.map +1 -0
  86. package/dist/optimize/export-optimize.d.ts +21 -0
  87. package/dist/optimize/export-optimize.js +167 -0
  88. package/dist/optimize/export-optimize.js.map +1 -0
  89. package/dist/parser/frontmatter.d.ts +8 -0
  90. package/dist/parser/frontmatter.js +45 -0
  91. package/dist/parser/frontmatter.js.map +1 -0
  92. package/dist/parser/parse.d.ts +2 -0
  93. package/dist/parser/parse.js +184 -0
  94. package/dist/parser/parse.js.map +1 -0
  95. package/dist/render/anim.d.ts +50 -0
  96. package/dist/render/anim.js +213 -0
  97. package/dist/render/anim.js.map +1 -0
  98. package/dist/render/charts.d.ts +3 -0
  99. package/dist/render/charts.js +171 -0
  100. package/dist/render/charts.js.map +1 -0
  101. package/dist/render/css.d.ts +3 -0
  102. package/dist/render/css.js +183 -0
  103. package/dist/render/css.js.map +1 -0
  104. package/dist/render/echarts-lib.generated.d.ts +1 -0
  105. package/dist/render/echarts-lib.generated.js +7 -0
  106. package/dist/render/echarts-lib.generated.js.map +1 -0
  107. package/dist/render/html.d.ts +5 -0
  108. package/dist/render/html.js +186 -0
  109. package/dist/render/html.js.map +1 -0
  110. package/dist/render/inject.d.ts +12 -0
  111. package/dist/render/inject.js +19 -0
  112. package/dist/render/inject.js.map +1 -0
  113. package/dist/render/mermaid-lib.generated.d.ts +1 -0
  114. package/dist/render/mermaid-lib.generated.js +7 -0
  115. package/dist/render/mermaid-lib.generated.js.map +1 -0
  116. package/dist/render/runtime.d.ts +1 -0
  117. package/dist/render/runtime.js +393 -0
  118. package/dist/render/runtime.js.map +1 -0
  119. package/dist/render-pdf/pdf.d.ts +9 -0
  120. package/dist/render-pdf/pdf.js +53 -0
  121. package/dist/render-pdf/pdf.js.map +1 -0
  122. package/dist/render-png/montage.d.ts +14 -0
  123. package/dist/render-png/montage.js +75 -0
  124. package/dist/render-png/montage.js.map +1 -0
  125. package/dist/render-png/shoot.d.ts +25 -0
  126. package/dist/render-png/shoot.js +79 -0
  127. package/dist/render-png/shoot.js.map +1 -0
  128. package/dist/scaffold.d.ts +9 -0
  129. package/dist/scaffold.js +36 -0
  130. package/dist/scaffold.js.map +1 -0
  131. package/dist/types.d.ts +212 -0
  132. package/dist/types.js +7 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/util.d.ts +6 -0
  135. package/dist/util.js +28 -0
  136. package/dist/util.js.map +1 -0
  137. package/package.json +66 -0
  138. package/skills/slaide/SKILL.md +64 -0
  139. package/skills/slaide/agents/openai.yaml +12 -0
  140. package/skills/slaide/examples/branded-deck.slaide +198 -0
  141. package/skills/slaide/examples/branded-theme.slaide.yaml +187 -0
  142. package/skills/slaide/examples/sample.slaide +98 -0
  143. package/skills/slaide/reference.md +177 -0
  144. package/skills/slaide/themes.md +171 -0
  145. package/themes/aurora.slaide.yaml +136 -0
@@ -0,0 +1 @@
1
+ export declare const ECHART_LIB_B64 = "Ci8qCiogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQoqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQoqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQoqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoqCiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKgoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgoqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQoqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQoqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKiB1bmRlciB0aGUgTGljZW5zZS4KKi8KCiFmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/ZShleHBvcnRzKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxlKTplKCh0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOnR8fHNlbGYpLmVjaGFydHM9e30pfSh0aGlzLChmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSl9LGUodCxuKX07ZnVuY3Rpb24gbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuJiZudWxsIT09bil0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIrU3RyaW5nKG4pKyIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpO2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KGkucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBpKX12YXIgaT1mdW5jdGlvbigpe3RoaXMuZmlyZWZveD0hMSx0aGlzLmllPSExLHRoaXMuZWRnZT0hMSx0aGlzLm5ld0VkZ2U9ITEsdGhpcy53ZUNoYXQ9ITF9LHI9bmV3IGZ1bmN0aW9uKCl7dGhpcy5icm93c2VyPW5ldyBpLHRoaXMubm9kZT0hMSx0aGlzLnd4YT0hMSx0aGlzLndvcmtlcj0hMSx0aGlzLnN2Z1N1cHBvcnRlZD0hMSx0aGlzLnRvdWNoRXZlbnRzU3VwcG9ydGVkPSExLHRoaXMucG9pbnRlckV2ZW50c1N1cHBvcnRlZD0hMSx0aGlzLmRvbVN1cHBvcnRlZD0hMSx0aGlzLnRyYW5zZm9ybVN1cHBvcnRlZD0hMSx0aGlzLnRyYW5zZm9ybTNkU3VwcG9ydGVkPSExLHRoaXMuaGFzR2xvYmFsV2luZG93PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93fTsib2JqZWN0Ij09dHlwZW9mIHd4JiYiZnVuY3Rpb24iPT10eXBlb2Ygd3guZ2V0U3lzdGVtSW5mb1N5bmM/KHIud3hhPSEwLHIudG91Y2hFdmVudHNTdXBwb3J0ZWQ9ITApOiJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQmJiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9yLndvcmtlcj0hMDoidW5kZWZpbmVkIj09dHlwZW9mIG5hdmlnYXRvcnx8MD09PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTm9kZS5qcyIpPyhyLm5vZGU9ITAsci5zdmdTdXBwb3J0ZWQ9ITApOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5icm93c2VyLGk9dC5tYXRjaCgvRmlyZWZveFwvKFtcZC5dKykvKSxyPXQubWF0Y2goL01TSUVccyhbXGQuXSspLyl8fHQubWF0Y2goL1RyaWRlbnRcLy4rP3J2OigoW1xkLl0rKSkvKSxvPXQubWF0Y2goL0VkZ2U/XC8oW1xkLl0rKS8pLGE9L21pY3JvbWVzc2VuZ2VyL2kudGVzdCh0KTtpJiYobi5maXJlZm94PSEwLG4udmVyc2lvbj1pWzFdKTtyJiYobi5pZT0hMCxuLnZlcnNpb249clsxXSk7byYmKG4uZWRnZT0hMCxuLnZlcnNpb249b1sxXSxuLm5ld0VkZ2U9K29bMV0uc3BsaXQoIi4iKVswXT4xOCk7YSYmKG4ud2VDaGF0PSEwKTtlLnN2Z1N1cHBvcnRlZD0idW5kZWZpbmVkIiE9dHlwZW9mIFNWR1JlY3QsZS50b3VjaEV2ZW50c1N1cHBvcnRlZD0ib250b3VjaHN0YXJ0ImluIHdpbmRvdyYmIW4uaWUmJiFuLmVkZ2UsZS5wb2ludGVyRXZlbnRzU3VwcG9ydGVkPSJvbnBvaW50ZXJkb3duImluIHdpbmRvdyYmKG4uZWRnZXx8bi5pZSYmK24udmVyc2lvbj49MTEpLGUuZG9tU3VwcG9ydGVkPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ7dmFyIHM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO2UudHJhbnNmb3JtM2RTdXBwb3J0ZWQ9KG4uaWUmJiJ0cmFuc2l0aW9uImluIHN8fG4uZWRnZXx8IldlYktpdENTU01hdHJpeCJpbiB3aW5kb3cmJiJtMTEiaW4gbmV3IFdlYktpdENTU01hdHJpeHx8Ik1velBlcnNwZWN0aXZlImluIHMpJiYhKCJPVHJhbnNpdGlvbiJpbiBzKSxlLnRyYW5zZm9ybVN1cHBvcnRlZD1lLnRyYW5zZm9ybTNkU3VwcG9ydGVkfHxuLmllJiYrbi52ZXJzaW9uPj05fShuYXZpZ2F0b3IudXNlckFnZW50LHIpO3ZhciBvPSJzYW5zLXNlcmlmIixhPSIxMnB4ICIrbzt2YXIgcyxsLHU9ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBKU09OKXJldHVybiBlO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT1TdHJpbmcuZnJvbUNoYXJDb2RlKG4rMzIpLHI9KHQuY2hhckNvZGVBdChuKS0yMCkvMTAwO2VbaV09cn1yZXR1cm4gZX0oIjAwN0xMbVcnNTU7TjA1MDBMTExMTExMTExMMDBOTk5MeldXXFxcXFdRYlxcMEZXTGdcXGJXYlxcV1FcXFdyV1dRMDAwQ0w1TExGTEwwTEwqKkYqZ0xMTEw1RjBMRlxcRkZGNS41TiIpLGg9e2NyZWF0ZUNhbnZhczpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpfSxtZWFzdXJlVGV4dDpmdW5jdGlvbih0LGUpe2lmKCFzKXt2YXIgbj1oLmNyZWF0ZUNhbnZhcygpO3M9biYmbi5nZXRDb250ZXh0KCIyZCIpfWlmKHMpcmV0dXJuIGwhPT1lJiYobD1zLmZvbnQ9ZXx8YSkscy5tZWFzdXJlVGV4dCh0KTt0PXR8fCIiO3ZhciBpPS8oKD86XGQrKT9cLj9cZCopcHgvLmV4ZWMoZT1lfHxhKSxyPWkmJitpWzFdfHwxMixvPTA7aWYoZS5pbmRleE9mKCJtb25vIik+PTApbz1yKnQubGVuZ3RoO2Vsc2UgZm9yKHZhciBjPTA7Yzx0Lmxlbmd0aDtjKyspe3ZhciBwPXVbdFtjXV07bys9bnVsbD09cD9yOnAqcn1yZXR1cm57d2lkdGg6b319LGxvYWRJbWFnZTpmdW5jdGlvbih0LGUsbil7dmFyIGk9bmV3IEltYWdlO3JldHVybiBpLm9ubG9hZD1lLGkub25lcnJvcj1uLGkuc3JjPXQsaX19O2Z1bmN0aW9uIGModCl7Zm9yKHZhciBlIGluIGgpdFtlXSYmKGhbZV09dFtlXSl9dmFyIHA9VihbIkZ1bmN0aW9uIiwiUmVnRXhwIiwiRGF0ZSIsIkVycm9yIiwiQ2FudmFzR3JhZGllbnQiLCJDYW52YXNQYXR0ZXJuIiwiSW1hZ2UiLCJDYW52YXMiXSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFsiW29iamVjdCAiK2UrIl0iXT0hMCx0fSkse30pLGQ9VihbIkludDgiLCJVaW50OCIsIlVpbnQ4Q2xhbXBlZCIsIkludDE2IiwiVWludDE2IiwiSW50MzIiLCJVaW50MzIiLCJGbG9hdDMyIiwiRmxvYXQ2NCJdLChmdW5jdGlvbih0LGUpe3JldHVybiB0WyJbb2JqZWN0ICIrZSsiQXJyYXldIl09ITAsdH0pLHt9KSxmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZz1BcnJheS5wcm90b3R5cGUseT1nLmZvckVhY2gsdj1nLmZpbHRlcixtPWcuc2xpY2UseD1nLm1hcCxfPWZ1bmN0aW9uKCl7fS5jb25zdHJ1Y3RvcixiPV8/Xy5wcm90b3R5cGU6bnVsbCx3PSJfX3Byb3RvX18iLFM9MjMxMTtmdW5jdGlvbiBNKCl7cmV0dXJuIFMrK31mdW5jdGlvbiBJKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdOyJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSYmY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLHQpfWZ1bmN0aW9uIFQodCl7aWYobnVsbD09dHx8Im9iamVjdCIhPXR5cGVvZiB0KXJldHVybiB0O3ZhciBlPXQsbj1mLmNhbGwodCk7aWYoIltvYmplY3QgQXJyYXldIj09PW4pe2lmKCFwdCh0KSl7ZT1bXTtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspZVtpXT1UKHRbaV0pfX1lbHNlIGlmKGRbbl0pe2lmKCFwdCh0KSl7dmFyIG89dC5jb25zdHJ1Y3RvcjtpZihvLmZyb20pZT1vLmZyb20odCk7ZWxzZXtlPW5ldyBvKHQubGVuZ3RoKTtmb3IoaT0wLHI9dC5sZW5ndGg7aTxyO2krKyllW2ldPXRbaV19fX1lbHNlIGlmKCFwW25dJiYhcHQodCkmJiFKKHQpKWZvcih2YXIgYSBpbiBlPXt9LHQpdC5oYXNPd25Qcm9wZXJ0eShhKSYmYSE9PXcmJihlW2FdPVQodFthXSkpO3JldHVybiBlfWZ1bmN0aW9uIEModCxlLG4pe2lmKCFxKGUpfHwhcSh0KSlyZXR1cm4gbj9UKGUpOnQ7Zm9yKHZhciBpIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShpKSYmaSE9PXcpe3ZhciByPXRbaV0sbz1lW2ldOyFxKG8pfHwhcShyKXx8WShvKXx8WShyKXx8SihvKXx8SihyKXx8SyhvKXx8SyhyKXx8cHQobyl8fHB0KHIpPyFuJiZpIGluIHR8fCh0W2ldPVQoZVtpXSkpOkMocixvLG4pfXJldHVybiB0fWZ1bmN0aW9uIEQodCxlKXtmb3IodmFyIG49dFswXSxpPTEscj10Lmxlbmd0aDtpPHI7aSsrKW49QyhuLHRbaV0sZSk7cmV0dXJuIG59ZnVuY3Rpb24gQSh0LGUpe2lmKE9iamVjdC5hc3NpZ24pT2JqZWN0LmFzc2lnbih0LGUpO2Vsc2UgZm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmbiE9PXcmJih0W25dPWVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIGsodCxlLG4pe2Zvcih2YXIgaT1HKGUpLHI9MDtyPGkubGVuZ3RoO3IrKyl7dmFyIG89aVtyXTsobj9udWxsIT1lW29dOm51bGw9PXRbb10pJiYodFtvXT1lW29dKX1yZXR1cm4gdH12YXIgTD1oLmNyZWF0ZUNhbnZhcztmdW5jdGlvbiBQKHQsZSl7aWYodCl7aWYodC5pbmRleE9mKXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWlmKHRbbl09PT1lKXJldHVybiBufXJldHVybi0xfWZ1bmN0aW9uIE8odCxlKXt2YXIgbj10LnByb3RvdHlwZTtmdW5jdGlvbiBpKCl7fWZvcih2YXIgciBpbiBpLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgaSxuKW4uaGFzT3duUHJvcGVydHkocikmJih0LnByb3RvdHlwZVtyXT1uW3JdKTt0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQuc3VwZXJDbGFzcz1lfWZ1bmN0aW9uIFIodCxlLG4pe2lmKHQ9InByb3RvdHlwZSJpbiB0P3QucHJvdG90eXBlOnQsZT0icHJvdG90eXBlImluIGU/ZS5wcm90b3R5cGU6ZSxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcylmb3IodmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkscj0wO3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdOyJjb25zdHJ1Y3RvciIhPT1vJiYobj9udWxsIT1lW29dOm51bGw9PXRbb10pJiYodFtvXT1lW29dKX1lbHNlIGsodCxlLG4pfWZ1bmN0aW9uIE4odCl7cmV0dXJuISF0JiYoInN0cmluZyIhPXR5cGVvZiB0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKX1mdW5jdGlvbiBFKHQsZSxuKXtpZih0JiZlKWlmKHQuZm9yRWFjaCYmdC5mb3JFYWNoPT09eSl0LmZvckVhY2goZSxuKTtlbHNlIGlmKHQubGVuZ3RoPT09K3QubGVuZ3RoKWZvcih2YXIgaT0wLHI9dC5sZW5ndGg7aTxyO2krKyllLmNhbGwobix0W2ldLGksdCk7ZWxzZSBmb3IodmFyIG8gaW4gdCl0Lmhhc093blByb3BlcnR5KG8pJiZlLmNhbGwobix0W29dLG8sdCl9ZnVuY3Rpb24geih0LGUsbil7aWYoIXQpcmV0dXJuW107aWYoIWUpcmV0dXJuIGF0KHQpO2lmKHQubWFwJiZ0Lm1hcD09PXgpcmV0dXJuIHQubWFwKGUsbik7Zm9yKHZhciBpPVtdLHI9MCxvPXQubGVuZ3RoO3I8bztyKyspaS5wdXNoKGUuY2FsbChuLHRbcl0scix0KSk7cmV0dXJuIGl9ZnVuY3Rpb24gVih0LGUsbixpKXtpZih0JiZlKXtmb3IodmFyIHI9MCxvPXQubGVuZ3RoO3I8bztyKyspbj1lLmNhbGwoaSxuLHRbcl0scix0KTtyZXR1cm4gbn19ZnVuY3Rpb24gQih0LGUsbil7aWYoIXQpcmV0dXJuW107aWYoIWUpcmV0dXJuIGF0KHQpO2lmKHQuZmlsdGVyJiZ0LmZpbHRlcj09PXYpcmV0dXJuIHQuZmlsdGVyKGUsbik7Zm9yKHZhciBpPVtdLHI9MCxvPXQubGVuZ3RoO3I8bztyKyspZS5jYWxsKG4sdFtyXSxyLHQpJiZpLnB1c2godFtyXSk7cmV0dXJuIGl9ZnVuY3Rpb24gRih0LGUsbil7aWYodCYmZSlmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspaWYoZS5jYWxsKG4sdFtpXSxpLHQpKXJldHVybiB0W2ldfWZ1bmN0aW9uIEcodCl7aWYoIXQpcmV0dXJuW107aWYoT2JqZWN0LmtleXMpcmV0dXJuIE9iamVjdC5rZXlzKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmUucHVzaChuKTtyZXR1cm4gZX12YXIgVz1iJiZYKGIuYmluZCk/Yi5jYWxsLmJpbmQoYi5iaW5kKTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXSxpPTI7aTxhcmd1bWVudHMubGVuZ3RoO2krKyluW2ktMl09YXJndW1lbnRzW2ldO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsbi5jb25jYXQobS5jYWxsKGFyZ3VtZW50cykpKX19O2Z1bmN0aW9uIEgodCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxlLmNvbmNhdChtLmNhbGwoYXJndW1lbnRzKSkpfX1mdW5jdGlvbiBZKHQpe3JldHVybiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6IltvYmplY3QgQXJyYXldIj09PWYuY2FsbCh0KX1mdW5jdGlvbiBYKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIFUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIFoodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1mLmNhbGwodCl9ZnVuY3Rpb24gaih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9ZnVuY3Rpb24gcSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4iZnVuY3Rpb24iPT09ZXx8ISF0JiYib2JqZWN0Ij09PWV9ZnVuY3Rpb24gSyh0KXtyZXR1cm4hIXBbZi5jYWxsKHQpXX1mdW5jdGlvbiAkKHQpe3JldHVybiEhZFtmLmNhbGwodCldfWZ1bmN0aW9uIEoodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYibnVtYmVyIj09dHlwZW9mIHQubm9kZVR5cGUmJiJvYmplY3QiPT10eXBlb2YgdC5vd25lckRvY3VtZW50fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGwhPXQuY29sb3JTdG9wc31mdW5jdGlvbiB0dCh0KXtyZXR1cm4gbnVsbCE9dC5pbWFnZX1mdW5jdGlvbiBldCh0KXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PWYuY2FsbCh0KX1mdW5jdGlvbiBudCh0KXtyZXR1cm4gdCE9dH1mdW5jdGlvbiBpdCgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspaWYobnVsbCE9dFtuXSlyZXR1cm4gdFtuXX1mdW5jdGlvbiBydCh0LGUpe3JldHVybiBudWxsIT10P3Q6ZX1mdW5jdGlvbiBvdCh0LGUsbil7cmV0dXJuIG51bGwhPXQ/dDpudWxsIT1lP2U6bn1mdW5jdGlvbiBhdCh0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtyZXR1cm4gbS5hcHBseSh0LGUpfWZ1bmN0aW9uIHN0KHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm5bdCx0LHQsdF07dmFyIGU9dC5sZW5ndGg7cmV0dXJuIDI9PT1lP1t0WzBdLHRbMV0sdFswXSx0WzFdXTozPT09ZT9bdFswXSx0WzFdLHRbMl0sdFsxXV06dH1mdW5jdGlvbiBsdCh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcihlKX1mdW5jdGlvbiB1dCh0KXtyZXR1cm4gbnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZywiIil9dmFyIGh0PSJfX2VjX3ByaW1pdGl2ZV9fIjtmdW5jdGlvbiBjdCh0KXt0W2h0XT0hMH1mdW5jdGlvbiBwdCh0KXtyZXR1cm4gdFtodF19dmFyIGR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZGF0YT17fX1yZXR1cm4gdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpO3JldHVybiBlJiZkZWxldGUgdGhpcy5kYXRhW3RdLGV9LHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhLmhhc093blByb3BlcnR5KHQpfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XT1lLHRoaXN9LHQucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gRyh0aGlzLmRhdGEpfSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiZ0KGVbbl0sbil9LHR9KCksZnQ9ImZ1bmN0aW9uIj09dHlwZW9mIE1hcDt2YXIgZ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPVkoZSk7dGhpcy5kYXRhPWZ0P25ldyBNYXA6bmV3IGR0O3ZhciBpPXRoaXM7ZnVuY3Rpb24gcih0LGUpe24/aS5zZXQodCxlKTppLnNldChlLHQpfWUgaW5zdGFuY2VvZiB0P2UuZWFjaChyKTplJiZFKGUscil9cmV0dXJuIHQucHJvdG90eXBlLmhhc0tleT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhLmhhcyh0KX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGEuZ2V0KHQpfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5kYXRhLnNldCh0LGUpLGV9LHQucHJvdG90eXBlLmVhY2g9ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGEuZm9yRWFjaCgoZnVuY3Rpb24obixpKXt0LmNhbGwoZSxuLGkpfSkpfSx0LnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhLmtleXMoKTtyZXR1cm4gZnQ/QXJyYXkuZnJvbSh0KTp0fSx0LnByb3RvdHlwZS5yZW1vdmVLZXk9ZnVuY3Rpb24odCl7dGhpcy5kYXRhLmRlbGV0ZSh0KX0sdH0oKTtmdW5jdGlvbiB5dCh0KXtyZXR1cm4gbmV3IGd0KHQpfWZ1bmN0aW9uIHZ0KHQsZSl7Zm9yKHZhciBuPW5ldyB0LmNvbnN0cnVjdG9yKHQubGVuZ3RoK2UubGVuZ3RoKSxpPTA7aTx0Lmxlbmd0aDtpKyspbltpXT10W2ldO3ZhciByPXQubGVuZ3RoO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspbltpK3JdPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gbXQodCxlKXt2YXIgbjtpZihPYmplY3QuY3JlYXRlKW49T2JqZWN0LmNyZWF0ZSh0KTtlbHNle3ZhciBpPWZ1bmN0aW9uKCl7fTtpLnByb3RvdHlwZT10LG49bmV3IGl9cmV0dXJuIGUmJkEobixlKSxufWZ1bmN0aW9uIHh0KHQpe3ZhciBlPXQuc3R5bGU7ZS53ZWJraXRVc2VyU2VsZWN0PSJub25lIixlLnVzZXJTZWxlY3Q9Im5vbmUiLGUud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9InJnYmEoMCwwLDAsMCkiLGVbIi13ZWJraXQtdG91Y2gtY2FsbG91dCJdPSJub25lIn1mdW5jdGlvbiBfdCh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpfWZ1bmN0aW9uIGJ0KCl7fXZhciB3dD0xODAvTWF0aC5QSSxTdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxndWlkOk0sbG9nRXJyb3I6SSxjbG9uZTpULG1lcmdlOkMsbWVyZ2VBbGw6RCxleHRlbmQ6QSxkZWZhdWx0czprLGNyZWF0ZUNhbnZhczpMLGluZGV4T2Y6UCxpbmhlcml0czpPLG1peGluOlIsaXNBcnJheUxpa2U6TixlYWNoOkUsbWFwOnoscmVkdWNlOlYsZmlsdGVyOkIsZmluZDpGLGtleXM6RyxiaW5kOlcsY3Vycnk6SCxpc0FycmF5OlksaXNGdW5jdGlvbjpYLGlzU3RyaW5nOlUsaXNTdHJpbmdTYWZlOlosaXNOdW1iZXI6aixpc09iamVjdDpxLGlzQnVpbHRJbk9iamVjdDpLLGlzVHlwZWRBcnJheTokLGlzRG9tOkosaXNHcmFkaWVudE9iamVjdDpRLGlzSW1hZ2VQYXR0ZXJuT2JqZWN0OnR0LGlzUmVnRXhwOmV0LGVxTmFOOm50LHJldHJpZXZlOml0LHJldHJpZXZlMjpydCxyZXRyaWV2ZTM6b3Qsc2xpY2U6YXQsbm9ybWFsaXplQ3NzQXJyYXk6c3QsYXNzZXJ0Omx0LHRyaW06dXQsc2V0QXNQcmltaXRpdmU6Y3QsaXNQcmltaXRpdmU6cHQsSGFzaE1hcDpndCxjcmVhdGVIYXNoTWFwOnl0LGNvbmNhdEFycmF5OnZ0LGNyZWF0ZU9iamVjdDptdCxkaXNhYmxlVXNlclNlbGVjdDp4dCxoYXNPd246X3Qsbm9vcDpidCxSQURJQU5fVE9fREVHUkVFOnd0fSk7ZnVuY3Rpb24gTXQodCxlKXtyZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09ZSYmKGU9MCksW3QsZV19ZnVuY3Rpb24gSXQodCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0fWZ1bmN0aW9uIFR0KHQpe3JldHVyblt0WzBdLHRbMV1dfWZ1bmN0aW9uIEN0KHQsZSxuKXtyZXR1cm4gdFswXT1lLHRbMV09bix0fWZ1bmN0aW9uIER0KHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdK25bMF0sdFsxXT1lWzFdK25bMV0sdH1mdW5jdGlvbiBBdCh0LGUsbixpKXtyZXR1cm4gdFswXT1lWzBdK25bMF0qaSx0WzFdPWVbMV0rblsxXSppLHR9ZnVuY3Rpb24ga3QodCxlLG4pe3JldHVybiB0WzBdPWVbMF0tblswXSx0WzFdPWVbMV0tblsxXSx0fWZ1bmN0aW9uIEx0KHQpe3JldHVybiBNYXRoLnNxcnQoT3QodCkpfXZhciBQdD1MdDtmdW5jdGlvbiBPdCh0KXtyZXR1cm4gdFswXSp0WzBdK3RbMV0qdFsxXX12YXIgUnQ9T3Q7ZnVuY3Rpb24gTnQodCxlLG4pe3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qbix0fWZ1bmN0aW9uIEV0KHQsZSl7dmFyIG49THQoZSk7cmV0dXJuIDA9PT1uPyh0WzBdPTAsdFsxXT0wKToodFswXT1lWzBdL24sdFsxXT1lWzFdL24pLHR9ZnVuY3Rpb24genQodCxlKXtyZXR1cm4gTWF0aC5zcXJ0KCh0WzBdLWVbMF0pKih0WzBdLWVbMF0pKyh0WzFdLWVbMV0pKih0WzFdLWVbMV0pKX12YXIgVnQ9enQ7ZnVuY3Rpb24gQnQodCxlKXtyZXR1cm4odFswXS1lWzBdKSoodFswXS1lWzBdKSsodFsxXS1lWzFdKSoodFsxXS1lWzFdKX12YXIgRnQ9QnQ7ZnVuY3Rpb24gR3QodCxlLG4saSl7cmV0dXJuIHRbMF09ZVswXStpKihuWzBdLWVbMF0pLHRbMV09ZVsxXStpKihuWzFdLWVbMV0pLHR9ZnVuY3Rpb24gV3QodCxlLG4pe3ZhciBpPWVbMF0scj1lWzFdO3JldHVybiB0WzBdPW5bMF0qaStuWzJdKnIrbls0XSx0WzFdPW5bMV0qaStuWzNdKnIrbls1XSx0fWZ1bmN0aW9uIEh0KHQsZSxuKXtyZXR1cm4gdFswXT1NYXRoLm1pbihlWzBdLG5bMF0pLHRbMV09TWF0aC5taW4oZVsxXSxuWzFdKSx0fWZ1bmN0aW9uIFl0KHQsZSxuKXtyZXR1cm4gdFswXT1NYXRoLm1heChlWzBdLG5bMF0pLHRbMV09TWF0aC5tYXgoZVsxXSxuWzFdKSx0fXZhciBYdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGU6TXQsY29weTpJdCxjbG9uZTpUdCxzZXQ6Q3QsYWRkOkR0LHNjYWxlQW5kQWRkOkF0LHN1YjprdCxsZW46THQsbGVuZ3RoOlB0LGxlblNxdWFyZTpPdCxsZW5ndGhTcXVhcmU6UnQsbXVsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdKm5bMF0sdFsxXT1lWzFdKm5bMV0sdH0sZGl2OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFswXT1lWzBdL25bMF0sdFsxXT1lWzFdL25bMV0sdH0sZG90OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV19LHNjYWxlOk50LG5vcm1hbGl6ZTpFdCxkaXN0YW5jZTp6dCxkaXN0OlZ0LGRpc3RhbmNlU3F1YXJlOkJ0LGRpc3RTcXVhcmU6RnQsbmVnYXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09LWVbMF0sdFsxXT0tZVsxXSx0fSxsZXJwOkd0LGFwcGx5VHJhbnNmb3JtOld0LG1pbjpIdCxtYXg6WXR9KSxVdD1mdW5jdGlvbih0LGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50b3BUYXJnZXQ9ZSYmZS50b3BUYXJnZXR9LFp0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmhhbmRsZXI9dCx0Lm9uKCJtb3VzZWRvd24iLHRoaXMuX2RyYWdTdGFydCx0aGlzKSx0Lm9uKCJtb3VzZW1vdmUiLHRoaXMuX2RyYWcsdGhpcyksdC5vbigibW91c2V1cCIsdGhpcy5fZHJhZ0VuZCx0aGlzKX1yZXR1cm4gdC5wcm90b3R5cGUuX2RyYWdTdGFydD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQ7ZSYmIWUuZHJhZ2dhYmxlOyllPWUucGFyZW50fHxlLl9faG9zdFRhcmdldDtlJiYodGhpcy5fZHJhZ2dpbmdUYXJnZXQ9ZSxlLmRyYWdnaW5nPSEwLHRoaXMuX3g9dC5vZmZzZXRYLHRoaXMuX3k9dC5vZmZzZXRZLHRoaXMuaGFuZGxlci5kaXNwYXRjaFRvRWxlbWVudChuZXcgVXQoZSx0KSwiZHJhZ3N0YXJ0Iix0LmV2ZW50KSl9LHQucHJvdG90eXBlLl9kcmFnPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RyYWdnaW5nVGFyZ2V0O2lmKGUpe3ZhciBuPXQub2Zmc2V0WCxpPXQub2Zmc2V0WSxyPW4tdGhpcy5feCxvPWktdGhpcy5feTt0aGlzLl94PW4sdGhpcy5feT1pLGUuZHJpZnQocixvLHQpLHRoaXMuaGFuZGxlci5kaXNwYXRjaFRvRWxlbWVudChuZXcgVXQoZSx0KSwiZHJhZyIsdC5ldmVudCk7dmFyIGE9dGhpcy5oYW5kbGVyLmZpbmRIb3ZlcihuLGksZSkudGFyZ2V0LHM9dGhpcy5fZHJvcFRhcmdldDt0aGlzLl9kcm9wVGFyZ2V0PWEsZSE9PWEmJihzJiZhIT09cyYmdGhpcy5oYW5kbGVyLmRpc3BhdGNoVG9FbGVtZW50KG5ldyBVdChzLHQpLCJkcmFnbGVhdmUiLHQuZXZlbnQpLGEmJmEhPT1zJiZ0aGlzLmhhbmRsZXIuZGlzcGF0Y2hUb0VsZW1lbnQobmV3IFV0KGEsdCksImRyYWdlbnRlciIsdC5ldmVudCkpfX0sdC5wcm90b3R5cGUuX2RyYWdFbmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZHJhZ2dpbmdUYXJnZXQ7ZSYmKGUuZHJhZ2dpbmc9ITEpLHRoaXMuaGFuZGxlci5kaXNwYXRjaFRvRWxlbWVudChuZXcgVXQoZSx0KSwiZHJhZ2VuZCIsdC5ldmVudCksdGhpcy5fZHJvcFRhcmdldCYmdGhpcy5oYW5kbGVyLmRpc3BhdGNoVG9FbGVtZW50KG5ldyBVdCh0aGlzLl9kcm9wVGFyZ2V0LHQpLCJkcm9wIix0LmV2ZW50KSx0aGlzLl9kcmFnZ2luZ1RhcmdldD1udWxsLHRoaXMuX2Ryb3BUYXJnZXQ9bnVsbH0sdH0oKSxqdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dCYmKHRoaXMuXyRldmVudFByb2Nlc3Nvcj10KX1yZXR1cm4gdC5wcm90b3R5cGUub249ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fJGhhbmRsZXJzfHwodGhpcy5fJGhhbmRsZXJzPXt9KTt2YXIgcj10aGlzLl8kaGFuZGxlcnM7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUmJihpPW4sbj1lLGU9bnVsbCksIW58fCF0KXJldHVybiB0aGlzO3ZhciBvPXRoaXMuXyRldmVudFByb2Nlc3NvcjtudWxsIT1lJiZvJiZvLm5vcm1hbGl6ZVF1ZXJ5JiYoZT1vLm5vcm1hbGl6ZVF1ZXJ5KGUpKSxyW3RdfHwoclt0XT1bXSk7Zm9yKHZhciBhPTA7YTxyW3RdLmxlbmd0aDthKyspaWYoclt0XVthXS5oPT09bilyZXR1cm4gdGhpczt2YXIgcz17aDpuLHF1ZXJ5OmUsY3R4Oml8fHRoaXMsY2FsbEF0TGFzdDpuLnpyRXZlbnRmdWxDYWxsQXRMYXN0fSxsPXJbdF0ubGVuZ3RoLTEsdT1yW3RdW2xdO3JldHVybiB1JiZ1LmNhbGxBdExhc3Q/clt0XS5zcGxpY2UobCwwLHMpOnJbdF0ucHVzaChzKSx0aGlzfSx0LnByb3RvdHlwZS5pc1NpbGVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl8kaGFuZGxlcnM7cmV0dXJuIWV8fCFlW3RdfHwhZVt0XS5sZW5ndGh9LHQucHJvdG90eXBlLm9mZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuXyRoYW5kbGVycztpZighbilyZXR1cm4gdGhpcztpZighdClyZXR1cm4gdGhpcy5fJGhhbmRsZXJzPXt9LHRoaXM7aWYoZSl7aWYoblt0XSl7Zm9yKHZhciBpPVtdLHI9MCxvPW5bdF0ubGVuZ3RoO3I8bztyKyspblt0XVtyXS5oIT09ZSYmaS5wdXNoKG5bdF1bcl0pO25bdF09aX1uW3RdJiYwPT09blt0XS5sZW5ndGgmJmRlbGV0ZSBuW3RdfWVsc2UgZGVsZXRlIG5bdF07cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07aWYoIXRoaXMuXyRoYW5kbGVycylyZXR1cm4gdGhpczt2YXIgaT10aGlzLl8kaGFuZGxlcnNbdF0scj10aGlzLl8kZXZlbnRQcm9jZXNzb3I7aWYoaSlmb3IodmFyIG89ZS5sZW5ndGgsYT1pLmxlbmd0aCxzPTA7czxhO3MrKyl7dmFyIGw9aVtzXTtpZighcnx8IXIuZmlsdGVyfHxudWxsPT1sLnF1ZXJ5fHxyLmZpbHRlcih0LGwucXVlcnkpKXN3aXRjaChvKXtjYXNlIDA6bC5oLmNhbGwobC5jdHgpO2JyZWFrO2Nhc2UgMTpsLmguY2FsbChsLmN0eCxlWzBdKTticmVhaztjYXNlIDI6bC5oLmNhbGwobC5jdHgsZVswXSxlWzFdKTticmVhaztkZWZhdWx0OmwuaC5hcHBseShsLmN0eCxlKX19cmV0dXJuIHImJnIuYWZ0ZXJUcmlnZ2VyJiZyLmFmdGVyVHJpZ2dlcih0KSx0aGlzfSx0LnByb3RvdHlwZS50cmlnZ2VyV2l0aENvbnRleHQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07aWYoIXRoaXMuXyRoYW5kbGVycylyZXR1cm4gdGhpczt2YXIgaT10aGlzLl8kaGFuZGxlcnNbdF0scj10aGlzLl8kZXZlbnRQcm9jZXNzb3I7aWYoaSlmb3IodmFyIG89ZS5sZW5ndGgsYT1lW28tMV0scz1pLmxlbmd0aCxsPTA7bDxzO2wrKyl7dmFyIHU9aVtsXTtpZighcnx8IXIuZmlsdGVyfHxudWxsPT11LnF1ZXJ5fHxyLmZpbHRlcih0LHUucXVlcnkpKXN3aXRjaChvKXtjYXNlIDA6dS5oLmNhbGwoYSk7YnJlYWs7Y2FzZSAxOnUuaC5jYWxsKGEsZVswXSk7YnJlYWs7Y2FzZSAyOnUuaC5jYWxsKGEsZVswXSxlWzFdKTticmVhaztkZWZhdWx0OnUuaC5hcHBseShhLGUuc2xpY2UoMSxvLTEpKX19cmV0dXJuIHImJnIuYWZ0ZXJUcmlnZ2VyJiZyLmFmdGVyVHJpZ2dlcih0KSx0aGlzfSx0fSgpLHF0PU1hdGgubG9nKDIpO2Z1bmN0aW9uIEt0KHQsZSxuLGkscixvKXt2YXIgYT1pKyItIityLHM9dC5sZW5ndGg7aWYoby5oYXNPd25Qcm9wZXJ0eShhKSlyZXR1cm4gb1thXTtpZigxPT09ZSl7dmFyIGw9TWF0aC5yb3VuZChNYXRoLmxvZygoMTw8cyktMSZ+cikvcXQpO3JldHVybiB0W25dW2xdfWZvcih2YXIgdT1pfDE8PG4saD1uKzE7aSYxPDxoOyloKys7Zm9yKHZhciBjPTAscD0wLGQ9MDtwPHM7cCsrKXt2YXIgZj0xPDxwO2Ymcnx8KGMrPShkJTI/LTE6MSkqdFtuXVtwXSpLdCh0LGUtMSxoLHUscnxmLG8pLGQrKyl9cmV0dXJuIG9bYV09YyxjfWZ1bmN0aW9uICR0KHQsZSl7dmFyIG49W1t0WzBdLHRbMV0sMSwwLDAsMCwtZVswXSp0WzBdLC1lWzBdKnRbMV1dLFswLDAsMCx0WzBdLHRbMV0sMSwtZVsxXSp0WzBdLC1lWzFdKnRbMV1dLFt0WzJdLHRbM10sMSwwLDAsMCwtZVsyXSp0WzJdLC1lWzJdKnRbM11dLFswLDAsMCx0WzJdLHRbM10sMSwtZVszXSp0WzJdLC1lWzNdKnRbM11dLFt0WzRdLHRbNV0sMSwwLDAsMCwtZVs0XSp0WzRdLC1lWzRdKnRbNV1dLFswLDAsMCx0WzRdLHRbNV0sMSwtZVs1XSp0WzRdLC1lWzVdKnRbNV1dLFt0WzZdLHRbN10sMSwwLDAsMCwtZVs2XSp0WzZdLC1lWzZdKnRbN11dLFswLDAsMCx0WzZdLHRbN10sMSwtZVs3XSp0WzZdLC1lWzddKnRbN11dXSxpPXt9LHI9S3Qobiw4LDAsMCwwLGkpO2lmKDAhPT1yKXtmb3IodmFyIG89W10sYT0wO2E8ODthKyspZm9yKHZhciBzPTA7czw4O3MrKyludWxsPT1vW3NdJiYob1tzXT0wKSxvW3NdKz0oKGErcyklMj8tMToxKSpLdChuLDcsMD09PWE/MTowLDE8PGEsMTw8cyxpKS9yKmVbYV07cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lKm9bNl0rbipvWzddKzE7dFswXT0oZSpvWzBdK24qb1sxXStvWzJdKS9pLHRbMV09KGUqb1szXStuKm9bNF0rb1s1XSkvaX19fXZhciBKdD0iX19fenJFVkVOVFNBVkVEIixRdD1bXTtmdW5jdGlvbiB0ZSh0LGUsbixpLG8pe2lmKGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiZyLmRvbVN1cHBvcnRlZCYmIWVlKGUpKXt2YXIgYT1lW0p0XXx8KGVbSnRdPXt9KSxzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5tYXJrZXJzO2lmKG4pcmV0dXJuIG47bj1lLm1hcmtlcnM9W107Zm9yKHZhciBpPVsibGVmdCIsInJpZ2h0Il0scj1bInRvcCIsImJvdHRvbSJdLG89MDtvPDQ7bysrKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxzPW8lMixsPShvPj4xKSUyO2Euc3R5bGUuY3NzVGV4dD1bInBvc2l0aW9uOiBhYnNvbHV0ZSIsInZpc2liaWxpdHk6IGhpZGRlbiIsInBhZGRpbmc6IDAiLCJtYXJnaW46IDAiLCJib3JkZXItd2lkdGg6IDAiLCJ1c2VyLXNlbGVjdDogbm9uZSIsIndpZHRoOjAiLCJoZWlnaHQ6MCIsaVtzXSsiOjAiLHJbbF0rIjowIixpWzEtc10rIjphdXRvIixyWzEtbF0rIjphdXRvIiwiIl0uam9pbigiIWltcG9ydGFudDsiKSx0LmFwcGVuZENoaWxkKGEpLG4ucHVzaChhKX1yZXR1cm4gbn0oZSxhKSxsPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bj8iaW52VHJhbnMiOiJ0cmFucyIscj1lW2ldLG89ZS5zcmNDb29yZHMsYT1bXSxzPVtdLGw9ITAsdT0wO3U8NDt1Kyspe3ZhciBoPXRbdV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0yKnUscD1oLmxlZnQsZD1oLnRvcDthLnB1c2gocCxkKSxsPWwmJm8mJnA9PT1vW2NdJiZkPT09b1tjKzFdLHMucHVzaCh0W3VdLm9mZnNldExlZnQsdFt1XS5vZmZzZXRUb3ApfXJldHVybiBsJiZyP3I6KGUuc3JjQ29vcmRzPWEsZVtpXT1uPyR0KHMsYSk6JHQoYSxzKSl9KHMsYSxvKTtpZihsKXJldHVybiBsKHQsbixpKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBlZSh0KXtyZXR1cm4iQ0FOVkFTIj09PXQubm9kZU5hbWUudG9VcHBlckNhc2UoKX12YXIgbmU9LyhbJjw+IiddKS9nLGllPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifTtmdW5jdGlvbiByZSh0KXtyZXR1cm4gbnVsbD09dD8iIjoodCsiIikucmVwbGFjZShuZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gaWVbZV19KSl9dmFyIG9lPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxhZT1bXSxzZT1yLmJyb3dzZXIuZmlyZWZveCYmK3IuYnJvd3Nlci52ZXJzaW9uLnNwbGl0KCIuIilbMF08Mzk7ZnVuY3Rpb24gbGUodCxlLG4saSl7cmV0dXJuIG49bnx8e30saT91ZSh0LGUsbik6c2UmJm51bGwhPWUubGF5ZXJYJiZlLmxheWVyWCE9PWUub2Zmc2V0WD8obi56clg9ZS5sYXllclgsbi56clk9ZS5sYXllclkpOm51bGwhPWUub2Zmc2V0WD8obi56clg9ZS5vZmZzZXRYLG4uenJZPWUub2Zmc2V0WSk6dWUodCxlLG4pLG59ZnVuY3Rpb24gdWUodCxlLG4pe2lmKHIuZG9tU3VwcG9ydGVkJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCl7dmFyIGk9ZS5jbGllbnRYLG89ZS5jbGllbnRZO2lmKGVlKHQpKXt2YXIgYT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBuLnpyWD1pLWEubGVmdCx2b2lkKG4uenJZPW8tYS50b3ApfWlmKHRlKGFlLHQsaSxvKSlyZXR1cm4gbi56clg9YWVbMF0sdm9pZChuLnpyWT1hZVsxXSl9bi56clg9bi56clk9MH1mdW5jdGlvbiBoZSh0KXtyZXR1cm4gdHx8d2luZG93LmV2ZW50fWZ1bmN0aW9uIGNlKHQsZSxuKXtpZihudWxsIT0oZT1oZShlKSkuenJYKXJldHVybiBlO3ZhciBpPWUudHlwZTtpZihpJiZpLmluZGV4T2YoInRvdWNoIik+PTApe3ZhciByPSJ0b3VjaGVuZCIhPT1pP2UudGFyZ2V0VG91Y2hlc1swXTplLmNoYW5nZWRUb3VjaGVzWzBdO3ImJmxlKHQscixlLG4pfWVsc2V7bGUodCxlLGUsbik7dmFyIG89ZnVuY3Rpb24odCl7dmFyIGU9dC53aGVlbERlbHRhO2lmKGUpcmV0dXJuIGU7dmFyIG49dC5kZWx0YVgsaT10LmRlbHRhWTtpZihudWxsPT1ufHxudWxsPT1pKXJldHVybiBlO3JldHVybiAzKigwIT09aT9NYXRoLmFicyhpKTpNYXRoLmFicyhuKSkqKGk+MD8tMTppPDA/MTpuPjA/LTE6MSl9KGUpO2UuenJEZWx0YT1vP28vMTIwOi0oZS5kZXRhaWx8fDApLzN9dmFyIGE9ZS5idXR0b247cmV0dXJuIG51bGw9PWUud2hpY2gmJnZvaWQgMCE9PWEmJm9lLnRlc3QoZS50eXBlKSYmKGUud2hpY2g9MSZhPzE6MiZhPzM6NCZhPzI6MCksZX1mdW5jdGlvbiBwZSh0LGUsbixpKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLGkpfXZhciBkZT1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0LmNhbmNlbEJ1YmJsZT0hMH07ZnVuY3Rpb24gZmUodCl7cmV0dXJuIDI9PT10LndoaWNofHwzPT09dC53aGljaH12YXIgZ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fdHJhY2s9W119cmV0dXJuIHQucHJvdG90eXBlLnJlY29nbml6ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2RvVHJhY2sodCxlLG4pLHRoaXMuX3JlY29nbml6ZSh0KX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHJhY2subGVuZ3RoPTAsdGhpc30sdC5wcm90b3R5cGUuX2RvVHJhY2s9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQudG91Y2hlcztpZihpKXtmb3IodmFyIHI9e3BvaW50czpbXSx0b3VjaGVzOltdLHRhcmdldDplLGV2ZW50OnR9LG89MCxhPWkubGVuZ3RoO288YTtvKyspe3ZhciBzPWlbb10sbD1sZShuLHMse30pO3IucG9pbnRzLnB1c2goW2wuenJYLGwuenJZXSksci50b3VjaGVzLnB1c2gocyl9dGhpcy5fdHJhY2sucHVzaChyKX19LHQucHJvdG90eXBlLl9yZWNvZ25pemU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHZlKWlmKHZlLmhhc093blByb3BlcnR5KGUpKXt2YXIgbj12ZVtlXSh0aGlzLl90cmFjayx0KTtpZihuKXJldHVybiBufX0sdH0oKTtmdW5jdGlvbiB5ZSh0KXt2YXIgZT10WzFdWzBdLXRbMF1bMF0sbj10WzFdWzFdLXRbMF1bMV07cmV0dXJuIE1hdGguc3FydChlKmUrbipuKX12YXIgdmU9e3BpbmNoOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYobil7dmFyIGkscj0odFtuLTFdfHx7fSkucG9pbnRzLG89KHRbbi0yXXx8e30pLnBvaW50c3x8cjtpZihvJiZvLmxlbmd0aD4xJiZyJiZyLmxlbmd0aD4xKXt2YXIgYT15ZShyKS95ZShvKTshaXNGaW5pdGUoYSkmJihhPTEpLGUucGluY2hTY2FsZT1hO3ZhciBzPVsoKGk9cilbMF1bMF0raVsxXVswXSkvMiwoaVswXVsxXStpWzFdWzFdKS8yXTtyZXR1cm4gZS5waW5jaFg9c1swXSxlLnBpbmNoWT1zWzFdLHt0eXBlOiJwaW5jaCIsdGFyZ2V0OnRbMF0udGFyZ2V0LGV2ZW50OmV9fX19fTtmdW5jdGlvbiBtZSgpe3JldHVyblsxLDAsMCwxLDAsMF19ZnVuY3Rpb24geGUodCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0WzRdPTAsdFs1XT0wLHR9ZnVuY3Rpb24gX2UodCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdH1mdW5jdGlvbiBiZSh0LGUsbil7dmFyIGk9ZVswXSpuWzBdK2VbMl0qblsxXSxyPWVbMV0qblswXStlWzNdKm5bMV0sbz1lWzBdKm5bMl0rZVsyXSpuWzNdLGE9ZVsxXSpuWzJdK2VbM10qblszXSxzPWVbMF0qbls0XStlWzJdKm5bNV0rZVs0XSxsPWVbMV0qbls0XStlWzNdKm5bNV0rZVs1XTtyZXR1cm4gdFswXT1pLHRbMV09cix0WzJdPW8sdFszXT1hLHRbNF09cyx0WzVdPWwsdH1mdW5jdGlvbiB3ZSh0LGUsbil7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0rblswXSx0WzVdPWVbNV0rblsxXSx0fWZ1bmN0aW9uIFNlKHQsZSxuLGkpe3ZvaWQgMD09PWkmJihpPVswLDBdKTt2YXIgcj1lWzBdLG89ZVsyXSxhPWVbNF0scz1lWzFdLGw9ZVszXSx1PWVbNV0saD1NYXRoLnNpbihuKSxjPU1hdGguY29zKG4pO3JldHVybiB0WzBdPXIqYytzKmgsdFsxXT0tcipoK3MqYyx0WzJdPW8qYytsKmgsdFszXT0tbypoK2MqbCx0WzRdPWMqKGEtaVswXSkraCoodS1pWzFdKStpWzBdLHRbNV09YyoodS1pWzFdKS1oKihhLWlbMF0pK2lbMV0sdH1mdW5jdGlvbiBNZSh0LGUsbil7dmFyIGk9blswXSxyPW5bMV07cmV0dXJuIHRbMF09ZVswXSppLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSppLHRbM109ZVszXSpyLHRbNF09ZVs0XSppLHRbNV09ZVs1XSpyLHR9ZnVuY3Rpb24gSWUodCxlKXt2YXIgbj1lWzBdLGk9ZVsyXSxyPWVbNF0sbz1lWzFdLGE9ZVszXSxzPWVbNV0sbD1uKmEtbyppO3JldHVybiBsPyhsPTEvbCx0WzBdPWEqbCx0WzFdPS1vKmwsdFsyXT0taSpsLHRbM109bipsLHRbNF09KGkqcy1hKnIpKmwsdFs1XT0obypyLW4qcykqbCx0KTpudWxsfWZ1bmN0aW9uIFRlKHQpe3ZhciBlPVsxLDAsMCwxLDAsMF07cmV0dXJuIF9lKGUsdCksZX12YXIgQ2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlOm1lLGlkZW50aXR5OnhlLGNvcHk6X2UsbXVsOmJlLHRyYW5zbGF0ZTp3ZSxyb3RhdGU6U2Usc2NhbGU6TWUsaW52ZXJ0OkllLGNsb25lOlRlfSksRGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy54PXR8fDAsdGhpcy55PWV8fDB9cmV0dXJuIHQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLngsdGhpcy55KX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9LHQucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfSx0LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXt0aGlzLngqPXQsdGhpcy55Kj10fSx0LnByb3RvdHlwZS5zY2FsZUFuZEFkZD1mdW5jdGlvbih0LGUpe3RoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfSx0LnByb3RvdHlwZS5kb3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX0sdC5wcm90b3R5cGUubGVuPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSx0LnByb3RvdHlwZS5sZW5TcXVhcmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fSx0LnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbigpO3JldHVybiB0aGlzLngvPXQsdGhpcy55Lz10LHRoaXN9LHQucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBNYXRoLnNxcnQoZSplK24qbil9LHQucHJvdG90eXBlLmRpc3RhbmNlU3F1YXJlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBlKmUrbipufSx0LnByb3RvdHlwZS5uZWdhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc30sdC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXRoaXMueCxuPXRoaXMueTtyZXR1cm4gdGhpcy54PXRbMF0qZSt0WzJdKm4rdFs0XSx0aGlzLnk9dFsxXSplK3RbM10qbit0WzVdLHRoaXN9fSx0LnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPXRoaXMueCx0WzFdPXRoaXMueSx0fSx0LnByb3RvdHlwZS5mcm9tQXJyYXk9ZnVuY3Rpb24odCl7dGhpcy54PXRbMF0sdGhpcy55PXRbMV19LHQuc2V0PWZ1bmN0aW9uKHQsZSxuKXt0Lng9ZSx0Lnk9bn0sdC5jb3B5PWZ1bmN0aW9uKHQsZSl7dC54PWUueCx0Lnk9ZS55fSx0Lmxlbj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KHQueCp0LngrdC55KnQueSl9LHQubGVuU3F1YXJlPWZ1bmN0aW9uKHQpe3JldHVybiB0LngqdC54K3QueSp0Lnl9LHQuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueCplLngrdC55KmUueX0sdC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3QueD1lLngrbi54LHQueT1lLnkrbi55fSx0LnN1Yj1mdW5jdGlvbih0LGUsbil7dC54PWUueC1uLngsdC55PWUueS1uLnl9LHQuc2NhbGU9ZnVuY3Rpb24odCxlLG4pe3QueD1lLngqbix0Lnk9ZS55Km59LHQuc2NhbGVBbmRBZGQ9ZnVuY3Rpb24odCxlLG4saSl7dC54PWUueCtuLngqaSx0Lnk9ZS55K24ueSppfSx0LmxlcnA9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9MS1pO3QueD1yKmUueCtpKm4ueCx0Lnk9ciplLnkraSpuLnl9LHR9KCksQWU9TWF0aC5taW4sa2U9TWF0aC5tYXgsTGU9bmV3IERlLFBlPW5ldyBEZSxPZT1uZXcgRGUsUmU9bmV3IERlLE5lPW5ldyBEZSxFZT1uZXcgRGUsemU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLGkpe248MCYmKHQrPW4sbj0tbiksaTwwJiYoZSs9aSxpPS1pKSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9aX1yZXR1cm4gdC5wcm90b3R5cGUudW5pb249ZnVuY3Rpb24odCl7dmFyIGU9QWUodC54LHRoaXMueCksbj1BZSh0LnksdGhpcy55KTtpc0Zpbml0ZSh0aGlzLngpJiZpc0Zpbml0ZSh0aGlzLndpZHRoKT90aGlzLndpZHRoPWtlKHQueCt0LndpZHRoLHRoaXMueCt0aGlzLndpZHRoKS1lOnRoaXMud2lkdGg9dC53aWR0aCxpc0Zpbml0ZSh0aGlzLnkpJiZpc0Zpbml0ZSh0aGlzLmhlaWdodCk/dGhpcy5oZWlnaHQ9a2UodC55K3QuaGVpZ2h0LHRoaXMueSt0aGlzLmhlaWdodCktbjp0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLng9ZSx0aGlzLnk9bn0sdC5wcm90b3R5cGUuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24oZSl7dC5hcHBseVRyYW5zZm9ybSh0aGlzLHRoaXMsZSl9LHQucHJvdG90eXBlLmNhbGN1bGF0ZVRyYW5zZm9ybT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dC53aWR0aC9lLndpZHRoLGk9dC5oZWlnaHQvZS5oZWlnaHQscj1bMSwwLDAsMSwwLDBdO3JldHVybiB3ZShyLHIsWy1lLngsLWUueV0pLE1lKHIscixbbixpXSksd2UocixyLFt0LngsdC55XSkscn0sdC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKGUsbil7aWYoIWUpcmV0dXJuITE7ZSBpbnN0YW5jZW9mIHR8fChlPXQuY3JlYXRlKGUpKTt2YXIgaT10aGlzLHI9aS54LG89aS54K2kud2lkdGgsYT1pLnkscz1pLnkraS5oZWlnaHQsbD1lLngsdT1lLngrZS53aWR0aCxoPWUueSxjPWUueStlLmhlaWdodCxwPSEobzxsfHx1PHJ8fHM8aHx8YzxhKTtpZihuKXt2YXIgZD0xLzAsZj0wLGc9TWF0aC5hYnMoby1sKSx5PU1hdGguYWJzKHUtciksdj1NYXRoLmFicyhzLWgpLG09TWF0aC5hYnMoYy1hKSx4PU1hdGgubWluKGcseSksXz1NYXRoLm1pbih2LG0pO288bHx8dTxyP3g+ZiYmKGY9eCxnPHk/RGUuc2V0KEVlLC1nLDApOkRlLnNldChFZSx5LDApKTp4PGQmJihkPXgsZzx5P0RlLnNldChOZSxnLDApOkRlLnNldChOZSwteSwwKSksczxofHxjPGE/Xz5mJiYoZj1fLHY8bT9EZS5zZXQoRWUsMCwtdik6RGUuc2V0KEVlLDAsbSkpOng8ZCYmKGQ9eCx2PG0/RGUuc2V0KE5lLDAsdik6RGUuc2V0KE5lLDAsLW0pKX1yZXR1cm4gbiYmRGUuY29weShuLHA/TmU6RWUpLHB9LHQucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0Pj1uLngmJnQ8PW4ueCtuLndpZHRoJiZlPj1uLnkmJmU8PW4ueStuLmhlaWdodH0sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQodGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0sdC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlKXt0LmNvcHkodGhpcyxlKX0sdC5wcm90b3R5cGUucGxhaW49ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLngseTp0aGlzLnksd2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHR9fSx0LnByb3RvdHlwZS5pc0Zpbml0ZT1mdW5jdGlvbigpe3JldHVybiBpc0Zpbml0ZSh0aGlzLngpJiZpc0Zpbml0ZSh0aGlzLnkpJiZpc0Zpbml0ZSh0aGlzLndpZHRoKSYmaXNGaW5pdGUodGhpcy5oZWlnaHQpfSx0LnByb3RvdHlwZS5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMud2lkdGh8fDA9PT10aGlzLmhlaWdodH0sdC5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KGUueCxlLnksZS53aWR0aCxlLmhlaWdodCl9LHQuY29weT1mdW5jdGlvbih0LGUpe3QueD1lLngsdC55PWUueSx0LndpZHRoPWUud2lkdGgsdC5oZWlnaHQ9ZS5oZWlnaHR9LHQuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24oZSxuLGkpe2lmKGkpe2lmKGlbMV08MWUtNSYmaVsxXT4tMWUtNSYmaVsyXTwxZS01JiZpWzJdPi0xZS01KXt2YXIgcj1pWzBdLG89aVszXSxhPWlbNF0scz1pWzVdO3JldHVybiBlLng9bi54KnIrYSxlLnk9bi55Km8rcyxlLndpZHRoPW4ud2lkdGgqcixlLmhlaWdodD1uLmhlaWdodCpvLGUud2lkdGg8MCYmKGUueCs9ZS53aWR0aCxlLndpZHRoPS1lLndpZHRoKSx2b2lkKGUuaGVpZ2h0PDAmJihlLnkrPWUuaGVpZ2h0LGUuaGVpZ2h0PS1lLmhlaWdodCkpfUxlLng9T2UueD1uLngsTGUueT1SZS55PW4ueSxQZS54PVJlLng9bi54K24ud2lkdGgsUGUueT1PZS55PW4ueStuLmhlaWdodCxMZS50cmFuc2Zvcm0oaSksUmUudHJhbnNmb3JtKGkpLFBlLnRyYW5zZm9ybShpKSxPZS50cmFuc2Zvcm0oaSksZS54PUFlKExlLngsUGUueCxPZS54LFJlLngpLGUueT1BZShMZS55LFBlLnksT2UueSxSZS55KTt2YXIgbD1rZShMZS54LFBlLngsT2UueCxSZS54KSx1PWtlKExlLnksUGUueSxPZS55LFJlLnkpO2Uud2lkdGg9bC1lLngsZS5oZWlnaHQ9dS1lLnl9ZWxzZSBlIT09biYmdC5jb3B5KGUsbil9LHR9KCksVmU9InNpbGVudCI7ZnVuY3Rpb24gQmUoKXtkZSh0aGlzLmV2ZW50KX12YXIgRmU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5oYW5kbGVyPW51bGwsZX1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnNldEN1cnNvcj1mdW5jdGlvbigpe30sZX0oanQpLEdlPWZ1bmN0aW9uKHQsZSl7dGhpcy54PXQsdGhpcy55PWV9LFdlPVsiY2xpY2siLCJkYmxjbGljayIsIm1vdXNld2hlZWwiLCJtb3VzZW91dCIsIm1vdXNldXAiLCJtb3VzZWRvd24iLCJtb3VzZW1vdmUiLCJjb250ZXh0bWVudSJdLEhlPW5ldyB6ZSgwLDAsMCwwKSxZZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixpLHIsbyl7dmFyIGE9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBhLl9ob3ZlcmVkPW5ldyBHZSgwLDApLGEuc3RvcmFnZT1lLGEucGFpbnRlcj1uLGEucGFpbnRlclJvb3Q9cixhLl9wb2ludGVyU2l6ZT1vLGk9aXx8bmV3IEZlLGEucHJveHk9bnVsbCxhLnNldEhhbmRsZXJQcm94eShpKSxhLl9kcmFnZ2luZ01ncj1uZXcgWnQoYSksYX1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnNldEhhbmRsZXJQcm94eT1mdW5jdGlvbih0KXt0aGlzLnByb3h5JiZ0aGlzLnByb3h5LmRpc3Bvc2UoKSx0JiYoRShXZSwoZnVuY3Rpb24oZSl7dC5vbiYmdC5vbihlLHRoaXNbZV0sdGhpcyl9KSx0aGlzKSx0LmhhbmRsZXI9dGhpcyksdGhpcy5wcm94eT10fSxlLnByb3RvdHlwZS5tb3VzZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dC56clgsbj10LnpyWSxpPVplKHRoaXMsZSxuKSxyPXRoaXMuX2hvdmVyZWQsbz1yLnRhcmdldDtvJiYhby5fX3pyJiYobz0ocj10aGlzLmZpbmRIb3ZlcihyLngsci55KSkudGFyZ2V0KTt2YXIgYT10aGlzLl9ob3ZlcmVkPWk/bmV3IEdlKGUsbik6dGhpcy5maW5kSG92ZXIoZSxuKSxzPWEudGFyZ2V0LGw9dGhpcy5wcm94eTtsLnNldEN1cnNvciYmbC5zZXRDdXJzb3Iocz9zLmN1cnNvcjoiZGVmYXVsdCIpLG8mJnMhPT1vJiZ0aGlzLmRpc3BhdGNoVG9FbGVtZW50KHIsIm1vdXNlb3V0Iix0KSx0aGlzLmRpc3BhdGNoVG9FbGVtZW50KGEsIm1vdXNlbW92ZSIsdCkscyYmcyE9PW8mJnRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQoYSwibW91c2VvdmVyIix0KX0sZS5wcm90b3R5cGUubW91c2VvdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dC56ckV2ZW50Q29udHJvbDsib25seV9nbG9iYWxvdXQiIT09ZSYmdGhpcy5kaXNwYXRjaFRvRWxlbWVudCh0aGlzLl9ob3ZlcmVkLCJtb3VzZW91dCIsdCksIm5vX2dsb2JhbG91dCIhPT1lJiZ0aGlzLnRyaWdnZXIoImdsb2JhbG91dCIse3R5cGU6Imdsb2JhbG91dCIsZXZlbnQ6dH0pfSxlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt0aGlzLl9ob3ZlcmVkPW5ldyBHZSgwLDApfSxlLnByb3RvdHlwZS5kaXNwYXRjaD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXNbdF07biYmbi5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnByb3h5LmRpc3Bvc2UoKSx0aGlzLnN0b3JhZ2U9bnVsbCx0aGlzLnByb3h5PW51bGwsdGhpcy5wYWludGVyPW51bGx9LGUucHJvdG90eXBlLnNldEN1cnNvclN0eWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJveHk7ZS5zZXRDdXJzb3ImJmUuc2V0Q3Vyc29yKHQpfSxlLnByb3RvdHlwZS5kaXNwYXRjaFRvRWxlbWVudD1mdW5jdGlvbih0LGUsbil7dmFyIGk9KHQ9dHx8e30pLnRhcmdldDtpZighaXx8IWkuc2lsZW50KXtmb3IodmFyIHI9Im9uIitlLG89ZnVuY3Rpb24odCxlLG4pe3JldHVybnt0eXBlOnQsZXZlbnQ6bix0YXJnZXQ6ZS50YXJnZXQsdG9wVGFyZ2V0OmUudG9wVGFyZ2V0LGNhbmNlbEJ1YmJsZTohMSxvZmZzZXRYOm4uenJYLG9mZnNldFk6bi56clksZ2VzdHVyZUV2ZW50Om4uZ2VzdHVyZUV2ZW50LHBpbmNoWDpuLnBpbmNoWCxwaW5jaFk6bi5waW5jaFkscGluY2hTY2FsZTpuLnBpbmNoU2NhbGUsd2hlZWxEZWx0YTpuLnpyRGVsdGEsenJCeVRvdWNoOm4uenJCeVRvdWNoLHdoaWNoOm4ud2hpY2gsc3RvcDpCZX19KGUsdCxuKTtpJiYoaVtyXSYmKG8uY2FuY2VsQnViYmxlPSEhaVtyXS5jYWxsKGksbykpLGkudHJpZ2dlcihlLG8pLGk9aS5fX2hvc3RUYXJnZXQ/aS5fX2hvc3RUYXJnZXQ6aS5wYXJlbnQsIW8uY2FuY2VsQnViYmxlKTspO28uY2FuY2VsQnViYmxlfHwodGhpcy50cmlnZ2VyKGUsbyksdGhpcy5wYWludGVyJiZ0aGlzLnBhaW50ZXIuZWFjaE90aGVyTGF5ZXImJnRoaXMucGFpbnRlci5lYWNoT3RoZXJMYXllcigoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRbcl0mJnRbcl0uY2FsbCh0LG8pLHQudHJpZ2dlciYmdC50cmlnZ2VyKGUsbyl9KSkpfX0sZS5wcm90b3R5cGUuZmluZEhvdmVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLnN0b3JhZ2UuZ2V0RGlzcGxheUxpc3QoKSxyPW5ldyBHZSh0LGUpO2lmKFVlKGkscix0LGUsbiksdGhpcy5fcG9pbnRlclNpemUmJiFyLnRhcmdldCl7Zm9yKHZhciBvPVtdLGE9dGhpcy5fcG9pbnRlclNpemUscz1hLzIsbD1uZXcgemUodC1zLGUtcyxhLGEpLHU9aS5sZW5ndGgtMTt1Pj0wO3UtLSl7dmFyIGg9aVt1XTtoPT09bnx8aC5pZ25vcmV8fGguaWdub3JlQ29hcnNlUG9pbnRlcnx8aC5wYXJlbnQmJmgucGFyZW50Lmlnbm9yZUNvYXJzZVBvaW50ZXJ8fChIZS5jb3B5KGguZ2V0Qm91bmRpbmdSZWN0KCkpLGgudHJhbnNmb3JtJiZIZS5hcHBseVRyYW5zZm9ybShoLnRyYW5zZm9ybSksSGUuaW50ZXJzZWN0KGwpJiZvLnB1c2goaCkpfWlmKG8ubGVuZ3RoKWZvcih2YXIgYz1NYXRoLlBJLzEyLHA9MipNYXRoLlBJLGQ9MDtkPHM7ZCs9NClmb3IodmFyIGY9MDtmPHA7Zis9Yyl7aWYoVWUobyxyLHQrZCpNYXRoLmNvcyhmKSxlK2QqTWF0aC5zaW4oZiksbiksci50YXJnZXQpcmV0dXJuIHJ9fXJldHVybiByfSxlLnByb3RvdHlwZS5wcm9jZXNzR2VzdHVyZT1mdW5jdGlvbih0LGUpe3RoaXMuX2dlc3R1cmVNZ3J8fCh0aGlzLl9nZXN0dXJlTWdyPW5ldyBnZSk7dmFyIG49dGhpcy5fZ2VzdHVyZU1ncjsic3RhcnQiPT09ZSYmbi5jbGVhcigpO3ZhciBpPW4ucmVjb2duaXplKHQsdGhpcy5maW5kSG92ZXIodC56clgsdC56clksbnVsbCkudGFyZ2V0LHRoaXMucHJveHkuZG9tKTtpZigiZW5kIj09PWUmJm4uY2xlYXIoKSxpKXt2YXIgcj1pLnR5cGU7dC5nZXN0dXJlRXZlbnQ9cjt2YXIgbz1uZXcgR2U7by50YXJnZXQ9aS50YXJnZXQsdGhpcy5kaXNwYXRjaFRvRWxlbWVudChvLHIsaS5ldmVudCl9fSxlfShqdCk7ZnVuY3Rpb24gWGUodCxlLG4pe2lmKHRbdC5yZWN0SG92ZXI/InJlY3RDb250YWluIjoiY29udGFpbiJdKGUsbikpe2Zvcih2YXIgaT10LHI9dm9pZCAwLG89ITE7aTspe2lmKGkuaWdub3JlQ2xpcCYmKG89ITApLCFvKXt2YXIgYT1pLmdldENsaXBQYXRoKCk7aWYoYSYmIWEuY29udGFpbihlLG4pKXJldHVybiExfWkuc2lsZW50JiYocj0hMCk7dmFyIHM9aS5fX2hvc3RUYXJnZXQ7aT1zfHxpLnBhcmVudH1yZXR1cm4hcnx8VmV9cmV0dXJuITF9ZnVuY3Rpb24gVWUodCxlLG4saSxyKXtmb3IodmFyIG89dC5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIGE9dFtvXSxzPXZvaWQgMDtpZihhIT09ciYmIWEuaWdub3JlJiYocz1YZShhLG4saSkpJiYoIWUudG9wVGFyZ2V0JiYoZS50b3BUYXJnZXQ9YSkscyE9PVZlKSl7ZS50YXJnZXQ9YTticmVha319fWZ1bmN0aW9uIFplKHQsZSxuKXt2YXIgaT10LnBhaW50ZXI7cmV0dXJuIGU8MHx8ZT5pLmdldFdpZHRoKCl8fG48MHx8bj5pLmdldEhlaWdodCgpfUUoWyJjbGljayIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJtb3VzZXdoZWVsIiwiZGJsY2xpY2siLCJjb250ZXh0bWVudSJdLChmdW5jdGlvbih0KXtZZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSl7dmFyIG4saSxyPWUuenJYLG89ZS56clksYT1aZSh0aGlzLHIsbyk7aWYoIm1vdXNldXAiPT09dCYmYXx8KGk9KG49dGhpcy5maW5kSG92ZXIocixvKSkudGFyZ2V0KSwibW91c2Vkb3duIj09PXQpdGhpcy5fZG93bkVsPWksdGhpcy5fZG93blBvaW50PVtlLnpyWCxlLnpyWV0sdGhpcy5fdXBFbD1pO2Vsc2UgaWYoIm1vdXNldXAiPT09dCl0aGlzLl91cEVsPWk7ZWxzZSBpZigiY2xpY2siPT09dCl7aWYodGhpcy5fZG93bkVsIT09dGhpcy5fdXBFbHx8IXRoaXMuX2Rvd25Qb2ludHx8VnQodGhpcy5fZG93blBvaW50LFtlLnpyWCxlLnpyWV0pPjQpcmV0dXJuO3RoaXMuX2Rvd25Qb2ludD1udWxsfXRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQobix0LGUpfX0pKTtmdW5jdGlvbiBqZSh0LGUsbixpKXt2YXIgcj1lKzE7aWYocj09PW4pcmV0dXJuIDE7aWYoaSh0W3IrK10sdFtlXSk8MCl7Zm9yKDtyPG4mJmkodFtyXSx0W3ItMV0pPDA7KXIrKzshZnVuY3Rpb24odCxlLG4pe24tLTtmb3IoO2U8bjspe3ZhciBpPXRbZV07dFtlKytdPXRbbl0sdFtuLS1dPWl9fSh0LGUscil9ZWxzZSBmb3IoO3I8biYmaSh0W3JdLHRbci0xXSk+PTA7KXIrKztyZXR1cm4gci1lfWZ1bmN0aW9uIHFlKHQsZSxuLGkscil7Zm9yKGk9PT1lJiZpKys7aTxuO2krKyl7Zm9yKHZhciBvLGE9dFtpXSxzPWUsbD1pO3M8bDspcihhLHRbbz1zK2w+Pj4xXSk8MD9sPW86cz1vKzE7dmFyIHU9aS1zO3N3aXRjaCh1KXtjYXNlIDM6dFtzKzNdPXRbcysyXTtjYXNlIDI6dFtzKzJdPXRbcysxXTtjYXNlIDE6dFtzKzFdPXRbc107YnJlYWs7ZGVmYXVsdDpmb3IoO3U+MDspdFtzK3VdPXRbcyt1LTFdLHUtLX10W3NdPWF9fWZ1bmN0aW9uIEtlKHQsZSxuLGkscixvKXt2YXIgYT0wLHM9MCxsPTE7aWYobyh0LGVbbityXSk+MCl7Zm9yKHM9aS1yO2w8cyYmbyh0LGVbbityK2xdKT4wOylhPWwsKGw9MSsobDw8MSkpPD0wJiYobD1zKTtsPnMmJihsPXMpLGErPXIsbCs9cn1lbHNle2ZvcihzPXIrMTtsPHMmJm8odCxlW24rci1sXSk8PTA7KWE9bCwobD0xKyhsPDwxKSk8PTAmJihsPXMpO2w+cyYmKGw9cyk7dmFyIHU9YTthPXItbCxsPXItdX1mb3IoYSsrO2E8bDspe3ZhciBoPWErKGwtYT4+PjEpO28odCxlW24raF0pPjA/YT1oKzE6bD1ofXJldHVybiBsfWZ1bmN0aW9uICRlKHQsZSxuLGkscixvKXt2YXIgYT0wLHM9MCxsPTE7aWYobyh0LGVbbityXSk8MCl7Zm9yKHM9cisxO2w8cyYmbyh0LGVbbityLWxdKTwwOylhPWwsKGw9MSsobDw8MSkpPD0wJiYobD1zKTtsPnMmJihsPXMpO3ZhciB1PWE7YT1yLWwsbD1yLXV9ZWxzZXtmb3Iocz1pLXI7bDxzJiZvKHQsZVtuK3IrbF0pPj0wOylhPWwsKGw9MSsobDw8MSkpPD0wJiYobD1zKTtsPnMmJihsPXMpLGErPXIsbCs9cn1mb3IoYSsrO2E8bDspe3ZhciBoPWErKGwtYT4+PjEpO28odCxlW24raF0pPDA/bD1oOmE9aCsxfXJldHVybiBsfWZ1bmN0aW9uIEplKHQsZSl7dmFyIG4saSxyPTcsbz0wLGE9W107ZnVuY3Rpb24gcyhzKXt2YXIgbD1uW3NdLHU9aVtzXSxoPW5bcysxXSxjPWlbcysxXTtpW3NdPXUrYyxzPT09by0zJiYobltzKzFdPW5bcysyXSxpW3MrMV09aVtzKzJdKSxvLS07dmFyIHA9JGUodFtoXSx0LGwsdSwwLGUpO2wrPXAsMCE9PSh1LT1wKSYmMCE9PShjPUtlKHRbbCt1LTFdLHQsaCxjLGMtMSxlKSkmJih1PD1jP2Z1bmN0aW9uKG4saSxvLHMpe3ZhciBsPTA7Zm9yKGw9MDtsPGk7bCsrKWFbbF09dFtuK2xdO3ZhciB1PTAsaD1vLGM9bjtpZih0W2MrK109dFtoKytdLDA9PS0tcyl7Zm9yKGw9MDtsPGk7bCsrKXRbYytsXT1hW3UrbF07cmV0dXJufWlmKDE9PT1pKXtmb3IobD0wO2w8cztsKyspdFtjK2xdPXRbaCtsXTtyZXR1cm4gdm9pZCh0W2Mrc109YVt1XSl9dmFyIHAsZCxmLGc9cjtmb3IoOzspe3A9MCxkPTAsZj0hMTtkb3tpZihlKHRbaF0sYVt1XSk8MCl7aWYodFtjKytdPXRbaCsrXSxkKysscD0wLDA9PS0tcyl7Zj0hMDticmVha319ZWxzZSBpZih0W2MrK109YVt1KytdLHArKyxkPTAsMT09LS1pKXtmPSEwO2JyZWFrfX13aGlsZSgocHxkKTxnKTtpZihmKWJyZWFrO2Rve2lmKDAhPT0ocD0kZSh0W2hdLGEsdSxpLDAsZSkpKXtmb3IobD0wO2w8cDtsKyspdFtjK2xdPWFbdStsXTtpZihjKz1wLHUrPXAsKGktPXApPD0xKXtmPSEwO2JyZWFrfX1pZih0W2MrK109dFtoKytdLDA9PS0tcyl7Zj0hMDticmVha31pZigwIT09KGQ9S2UoYVt1XSx0LGgscywwLGUpKSl7Zm9yKGw9MDtsPGQ7bCsrKXRbYytsXT10W2grbF07aWYoYys9ZCxoKz1kLDA9PT0ocy09ZCkpe2Y9ITA7YnJlYWt9fWlmKHRbYysrXT1hW3UrK10sMT09LS1pKXtmPSEwO2JyZWFrfWctLX13aGlsZShwPj03fHxkPj03KTtpZihmKWJyZWFrO2c8MCYmKGc9MCksZys9Mn1pZigocj1nKTwxJiYocj0xKSwxPT09aSl7Zm9yKGw9MDtsPHM7bCsrKXRbYytsXT10W2grbF07dFtjK3NdPWFbdV19ZWxzZXtpZigwPT09aSl0aHJvdyBuZXcgRXJyb3I7Zm9yKGw9MDtsPGk7bCsrKXRbYytsXT1hW3UrbF19fShsLHUsaCxjKTpmdW5jdGlvbihuLGksbyxzKXt2YXIgbD0wO2ZvcihsPTA7bDxzO2wrKylhW2xdPXRbbytsXTt2YXIgdT1uK2ktMSxoPXMtMSxjPW8rcy0xLHA9MCxkPTA7aWYodFtjLS1dPXRbdS0tXSwwPT0tLWkpe2ZvcihwPWMtKHMtMSksbD0wO2w8cztsKyspdFtwK2xdPWFbbF07cmV0dXJufWlmKDE9PT1zKXtmb3IoZD0oYy09aSkrMSxwPSh1LT1pKSsxLGw9aS0xO2w+PTA7bC0tKXRbZCtsXT10W3ArbF07cmV0dXJuIHZvaWQodFtjXT1hW2hdKX12YXIgZj1yO2Zvcig7Oyl7dmFyIGc9MCx5PTAsdj0hMTtkb3tpZihlKGFbaF0sdFt1XSk8MCl7aWYodFtjLS1dPXRbdS0tXSxnKysseT0wLDA9PS0taSl7dj0hMDticmVha319ZWxzZSBpZih0W2MtLV09YVtoLS1dLHkrKyxnPTAsMT09LS1zKXt2PSEwO2JyZWFrfX13aGlsZSgoZ3x5KTxmKTtpZih2KWJyZWFrO2Rve2lmKDAhPT0oZz1pLSRlKGFbaF0sdCxuLGksaS0xLGUpKSl7Zm9yKGktPWcsZD0oYy09ZykrMSxwPSh1LT1nKSsxLGw9Zy0xO2w+PTA7bC0tKXRbZCtsXT10W3ArbF07aWYoMD09PWkpe3Y9ITA7YnJlYWt9fWlmKHRbYy0tXT1hW2gtLV0sMT09LS1zKXt2PSEwO2JyZWFrfWlmKDAhPT0oeT1zLUtlKHRbdV0sYSwwLHMscy0xLGUpKSl7Zm9yKHMtPXksZD0oYy09eSkrMSxwPShoLT15KSsxLGw9MDtsPHk7bCsrKXRbZCtsXT1hW3ArbF07aWYoczw9MSl7dj0hMDticmVha319aWYodFtjLS1dPXRbdS0tXSwwPT0tLWkpe3Y9ITA7YnJlYWt9Zi0tfXdoaWxlKGc+PTd8fHk+PTcpO2lmKHYpYnJlYWs7ZjwwJiYoZj0wKSxmKz0yfShyPWYpPDEmJihyPTEpO2lmKDE9PT1zKXtmb3IoZD0oYy09aSkrMSxwPSh1LT1pKSsxLGw9aS0xO2w+PTA7bC0tKXRbZCtsXT10W3ArbF07dFtjXT1hW2hdfWVsc2V7aWYoMD09PXMpdGhyb3cgbmV3IEVycm9yO2ZvcihwPWMtKHMtMSksbD0wO2w8cztsKyspdFtwK2xdPWFbbF19fShsLHUsaCxjKSl9cmV0dXJuIG49W10saT1bXSx7bWVyZ2VSdW5zOmZ1bmN0aW9uKCl7Zm9yKDtvPjE7KXt2YXIgdD1vLTI7aWYodD49MSYmaVt0LTFdPD1pW3RdK2lbdCsxXXx8dD49MiYmaVt0LTJdPD1pW3RdK2lbdC0xXSlpW3QtMV08aVt0KzFdJiZ0LS07ZWxzZSBpZihpW3RdPmlbdCsxXSlicmVhaztzKHQpfX0sZm9yY2VNZXJnZVJ1bnM6ZnVuY3Rpb24oKXtmb3IoO28+MTspe3ZhciB0PW8tMjt0PjAmJmlbdC0xXTxpW3QrMV0mJnQtLSxzKHQpfX0scHVzaFJ1bjpmdW5jdGlvbih0LGUpe25bb109dCxpW29dPWUsbys9MX19fWZ1bmN0aW9uIFFlKHQsZSxuLGkpe258fChuPTApLGl8fChpPXQubGVuZ3RoKTt2YXIgcj1pLW47aWYoIShyPDIpKXt2YXIgbz0wO2lmKHI8MzIpcWUodCxuLGksbisobz1qZSh0LG4saSxlKSksZSk7ZWxzZXt2YXIgYT1KZSh0LGUpLHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7dD49MzI7KWV8PTEmdCx0Pj49MTtyZXR1cm4gdCtlfShyKTtkb3tpZigobz1qZSh0LG4saSxlKSk8cyl7dmFyIGw9cjtsPnMmJihsPXMpLHFlKHQsbixuK2wsbitvLGUpLG89bH1hLnB1c2hSdW4obixvKSxhLm1lcmdlUnVucygpLHItPW8sbis9b313aGlsZSgwIT09cik7YS5mb3JjZU1lcmdlUnVucygpfX19dmFyIHRuPSExO2Z1bmN0aW9uIGVuKCl7dG58fCh0bj0hMCxjb25zb2xlLndhcm4oInogLyB6MiAvIHpsZXZlbCBvZiBkaXNwbGF5YWJsZSBpcyBpbnZhbGlkLCB3aGljaCBtYXkgY2F1c2UgdW5leHBlY3RlZCBlcnJvcnMiKSl9ZnVuY3Rpb24gbm4odCxlKXtyZXR1cm4gdC56bGV2ZWw9PT1lLnpsZXZlbD90Lno9PT1lLno/dC56Mi1lLnoyOnQuei1lLno6dC56bGV2ZWwtZS56bGV2ZWx9dmFyIHJuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX3Jvb3RzPVtdLHRoaXMuX2Rpc3BsYXlMaXN0PVtdLHRoaXMuX2Rpc3BsYXlMaXN0TGVuPTAsdGhpcy5kaXNwbGF5YWJsZVNvcnRGdW5jPW5ufXJldHVybiB0LnByb3RvdHlwZS50cmF2ZXJzZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dGhpcy5fcm9vdHMubGVuZ3RoO24rKyl0aGlzLl9yb290c1tuXS50cmF2ZXJzZSh0LGUpfSx0LnByb3RvdHlwZS5nZXREaXNwbGF5TGlzdD1mdW5jdGlvbih0LGUpe2U9ZXx8ITE7dmFyIG49dGhpcy5fZGlzcGxheUxpc3Q7cmV0dXJuIXQmJm4ubGVuZ3RofHx0aGlzLnVwZGF0ZURpc3BsYXlMaXN0KGUpLG59LHQucHJvdG90eXBlLnVwZGF0ZURpc3BsYXlMaXN0PWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3BsYXlMaXN0TGVuPTA7Zm9yKHZhciBlPXRoaXMuX3Jvb3RzLG49dGhpcy5fZGlzcGxheUxpc3QsaT0wLHI9ZS5sZW5ndGg7aTxyO2krKyl0aGlzLl91cGRhdGVBbmRBZGREaXNwbGF5YWJsZShlW2ldLG51bGwsdCk7bi5sZW5ndGg9dGhpcy5fZGlzcGxheUxpc3RMZW4sUWUobixubil9LHQucHJvdG90eXBlLl91cGRhdGVBbmRBZGREaXNwbGF5YWJsZT1mdW5jdGlvbih0LGUsbil7aWYoIXQuaWdub3JlfHxuKXt0LmJlZm9yZVVwZGF0ZSgpLHQudXBkYXRlKCksdC5hZnRlclVwZGF0ZSgpO3ZhciBpPXQuZ2V0Q2xpcFBhdGgoKTtpZih0Lmlnbm9yZUNsaXApZT1udWxsO2Vsc2UgaWYoaSl7ZT1lP2Uuc2xpY2UoKTpbXTtmb3IodmFyIHI9aSxvPXQ7cjspci5wYXJlbnQ9byxyLnVwZGF0ZVRyYW5zZm9ybSgpLGUucHVzaChyKSxvPXIscj1yLmdldENsaXBQYXRoKCl9aWYodC5jaGlsZHJlblJlZil7Zm9yKHZhciBhPXQuY2hpbGRyZW5SZWYoKSxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBsPWFbc107dC5fX2RpcnR5JiYobC5fX2RpcnR5fD0xKSx0aGlzLl91cGRhdGVBbmRBZGREaXNwbGF5YWJsZShsLGUsbil9dC5fX2RpcnR5PTB9ZWxzZXt2YXIgdT10O2UmJmUubGVuZ3RoP3UuX19jbGlwUGF0aHM9ZTp1Ll9fY2xpcFBhdGhzJiZ1Ll9fY2xpcFBhdGhzLmxlbmd0aD4wJiYodS5fX2NsaXBQYXRocz1bXSksaXNOYU4odS56KSYmKGVuKCksdS56PTApLGlzTmFOKHUuejIpJiYoZW4oKSx1LnoyPTApLGlzTmFOKHUuemxldmVsKSYmKGVuKCksdS56bGV2ZWw9MCksdGhpcy5fZGlzcGxheUxpc3RbdGhpcy5fZGlzcGxheUxpc3RMZW4rK109dX12YXIgaD10LmdldERlY2FsRWxlbWVudCYmdC5nZXREZWNhbEVsZW1lbnQoKTtoJiZ0aGlzLl91cGRhdGVBbmRBZGREaXNwbGF5YWJsZShoLGUsbik7dmFyIGM9dC5nZXRUZXh0R3VpZGVMaW5lKCk7YyYmdGhpcy5fdXBkYXRlQW5kQWRkRGlzcGxheWFibGUoYyxlLG4pO3ZhciBwPXQuZ2V0VGV4dENvbnRlbnQoKTtwJiZ0aGlzLl91cGRhdGVBbmRBZGREaXNwbGF5YWJsZShwLGUsbil9fSx0LnByb3RvdHlwZS5hZGRSb290PWZ1bmN0aW9uKHQpe3QuX196ciYmdC5fX3pyLnN0b3JhZ2U9PT10aGlzfHx0aGlzLl9yb290cy5wdXNoKHQpfSx0LnByb3RvdHlwZS5kZWxSb290PWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5kZWxSb290KHRbZV0pO2Vsc2V7dmFyIGk9UCh0aGlzLl9yb290cyx0KTtpPj0wJiZ0aGlzLl9yb290cy5zcGxpY2UoaSwxKX19LHQucHJvdG90eXBlLmRlbEFsbFJvb3RzPWZ1bmN0aW9uKCl7dGhpcy5fcm9vdHM9W10sdGhpcy5fZGlzcGxheUxpc3Q9W10sdGhpcy5fZGlzcGxheUxpc3RMZW49MH0sdC5wcm90b3R5cGUuZ2V0Um9vdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdHN9LHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9kaXNwbGF5TGlzdD1udWxsLHRoaXMuX3Jvb3RzPW51bGx9LHR9KCksb249ci5oYXNHbG9iYWxXaW5kb3cmJih3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZ3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKXx8ZnVuY3Rpb24odCl7cmV0dXJuIHNldFRpbWVvdXQodCwxNil9LGFuPXtsaW5lYXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHF1YWRyYXRpY0luOmZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LHF1YWRyYXRpY091dDpmdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0scXVhZHJhdGljSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQqPTIpPDE/LjUqdCp0Oi0uNSooLS10Kih0LTIpLTEpfSxjdWJpY0luOmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sY3ViaWNPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSxjdWJpY0luT3V0OmZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy41KnQqdCp0Oi41KigodC09MikqdCp0KzIpfSxxdWFydGljSW46ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0KnR9LHF1YXJ0aWNPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtIC0tdCp0KnQqdH0scXVhcnRpY0luT3V0OmZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy41KnQqdCp0KnQ6LS41KigodC09MikqdCp0KnQtMil9LHF1aW50aWNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnQqdCp0fSxxdWludGljT3V0OmZ1bmN0aW9uKHQpe3JldHVybi0tdCp0KnQqdCp0KzF9LHF1aW50aWNJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSp0KnQqdCp0KnQ6LjUqKCh0LT0yKSp0KnQqdCp0KzIpfSxzaW51c29pZGFsSW46ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpNYXRoLlBJLzIpfSxzaW51c29pZGFsT3V0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0Kk1hdGguUEkvMil9LHNpbnVzb2lkYWxJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4uNSooMS1NYXRoLmNvcyhNYXRoLlBJKnQpKX0sZXhwb25lbnRpYWxJbjpmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/MDpNYXRoLnBvdygxMDI0LHQtMSl9LGV4cG9uZW50aWFsT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD8xOjEtTWF0aC5wb3coMiwtMTAqdCl9LGV4cG9uZW50aWFsSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10PzA6MT09PXQ/MToodCo9Mik8MT8uNSpNYXRoLnBvdygxMDI0LHQtMSk6LjUqKDItTWF0aC5wb3coMiwtMTAqKHQtMSkpKX0sY2lyY3VsYXJJbjpmdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfSxjaXJjdWxhck91dDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sY2lyY3VsYXJJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8tLjUqKE1hdGguc3FydCgxLXQqdCktMSk6LjUqKE1hdGguc3FydCgxLSh0LT0yKSp0KSsxKX0sZWxhc3RpY0luOmZ1bmN0aW9uKHQpe3ZhciBlLG49LjE7cmV0dXJuIDA9PT10PzA6MT09PXQ/MTooIW58fG48MT8obj0xLGU9LjEpOmU9LjQqTWF0aC5hc2luKDEvbikvKDIqTWF0aC5QSSksLW4qTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpLy40KSl9LGVsYXN0aWNPdXQ6ZnVuY3Rpb24odCl7dmFyIGUsbj0uMTtyZXR1cm4gMD09PXQ/MDoxPT09dD8xOighbnx8bjwxPyhuPTEsZT0uMSk6ZT0uNCpNYXRoLmFzaW4oMS9uKS8oMipNYXRoLlBJKSxuKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpLy40KSsxKX0sZWxhc3RpY0luT3V0OmZ1bmN0aW9uKHQpe3ZhciBlLG49LjEsaT0uNDtyZXR1cm4gMD09PXQ/MDoxPT09dD8xOighbnx8bjwxPyhuPTEsZT0uMSk6ZT1pKk1hdGguYXNpbigxL24pLygyKk1hdGguUEkpLCh0Kj0yKTwxP24qTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpL2kpKi0uNTpuKk1hdGgucG93KDIsLTEwKih0LT0xKSkqTWF0aC5zaW4oKHQtZSkqKDIqTWF0aC5QSSkvaSkqLjUrMSl9LGJhY2tJbjpmdW5jdGlvbih0KXt2YXIgZT0xLjcwMTU4O3JldHVybiB0KnQqKChlKzEpKnQtZSl9LGJhY2tPdXQ6ZnVuY3Rpb24odCl7dmFyIGU9MS43MDE1ODtyZXR1cm4tLXQqdCooKGUrMSkqdCtlKSsxfSxiYWNrSW5PdXQ6ZnVuY3Rpb24odCl7dmFyIGU9Mi41OTQ5MDk1O3JldHVybih0Kj0yKTwxP3QqdCooKGUrMSkqdC1lKSouNTouNSooKHQtPTIpKnQqKChlKzEpKnQrZSkrMil9LGJvdW5jZUluOmZ1bmN0aW9uKHQpe3JldHVybiAxLWFuLmJvdW5jZU91dCgxLXQpfSxib3VuY2VPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MS8yLjc1PzcuNTYyNSp0KnQ6dDwyLzIuNzU/Ny41NjI1Kih0LT0xLjUvMi43NSkqdCsuNzU6dDwyLjUvMi43NT83LjU2MjUqKHQtPTIuMjUvMi43NSkqdCsuOTM3NTo3LjU2MjUqKHQtPTIuNjI1LzIuNzUpKnQrLjk4NDM3NX0sYm91bmNlSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/LjUqYW4uYm91bmNlSW4oMip0KTouNSphbi5ib3VuY2VPdXQoMip0LTEpKy41fX0sc249TWF0aC5wb3csbG49TWF0aC5zcXJ0LHVuPTFlLTgsaG49MWUtNCxjbj1sbigzKSxwbj0xLzMsZG49TXQoKSxmbj1NdCgpLGduPU10KCk7ZnVuY3Rpb24geW4odCl7cmV0dXJuIHQ+LTFlLTgmJnQ8dW59ZnVuY3Rpb24gdm4odCl7cmV0dXJuIHQ+dW58fHQ8LTFlLTh9ZnVuY3Rpb24gbW4odCxlLG4saSxyKXt2YXIgbz0xLXI7cmV0dXJuIG8qbyoobyp0KzMqciplKStyKnIqKHIqaSszKm8qbil9ZnVuY3Rpb24geG4odCxlLG4saSxyKXt2YXIgbz0xLXI7cmV0dXJuIDMqKCgoZS10KSpvKzIqKG4tZSkqcikqbysoaS1uKSpyKnIpfWZ1bmN0aW9uIF9uKHQsZSxuLGkscixvKXt2YXIgYT1pKzMqKGUtbiktdCxzPTMqKG4tMiplK3QpLGw9MyooZS10KSx1PXQtcixoPXMqcy0zKmEqbCxjPXMqbC05KmEqdSxwPWwqbC0zKnMqdSxkPTA7aWYoeW4oaCkmJnluKGMpKXtpZih5bihzKSlvWzBdPTA7ZWxzZShNPS1sL3MpPj0wJiZNPD0xJiYob1tkKytdPU0pfWVsc2V7dmFyIGY9YypjLTQqaCpwO2lmKHluKGYpKXt2YXIgZz1jL2gseT0tZy8yOyhNPS1zL2ErZyk+PTAmJk08PTEmJihvW2QrK109TSkseT49MCYmeTw9MSYmKG9bZCsrXT15KX1lbHNlIGlmKGY+MCl7dmFyIHY9bG4oZiksbT1oKnMrMS41KmEqKC1jK3YpLHg9aCpzKzEuNSphKigtYy12KTsoTT0oLXMtKChtPW08MD8tc24oLW0scG4pOnNuKG0scG4pKSsoeD14PDA/LXNuKC14LHBuKTpzbih4LHBuKSkpKS8oMyphKSk+PTAmJk08PTEmJihvW2QrK109TSl9ZWxzZXt2YXIgXz0oMipoKnMtMyphKmMpLygyKmxuKGgqaCpoKSksYj1NYXRoLmFjb3MoXykvMyx3PWxuKGgpLFM9TWF0aC5jb3MoYiksTT0oLXMtMip3KlMpLygzKmEpLEk9KHk9KC1zK3cqKFMrY24qTWF0aC5zaW4oYikpKS8oMyphKSwoLXMrdyooUy1jbipNYXRoLnNpbihiKSkpLygzKmEpKTtNPj0wJiZNPD0xJiYob1tkKytdPU0pLHk+PTAmJnk8PTEmJihvW2QrK109eSksST49MCYmSTw9MSYmKG9bZCsrXT1JKX19cmV0dXJuIGR9ZnVuY3Rpb24gYm4odCxlLG4saSxyKXt2YXIgbz02Km4tMTIqZSs2KnQsYT05KmUrMyppLTMqdC05Km4scz0zKmUtMyp0LGw9MDtpZih5bihhKSl7aWYodm4obykpKGg9LXMvbyk+PTAmJmg8PTEmJihyW2wrK109aCl9ZWxzZXt2YXIgdT1vKm8tNCphKnM7aWYoeW4odSkpclswXT0tby8oMiphKTtlbHNlIGlmKHU+MCl7dmFyIGgsYz1sbih1KSxwPSgtby1jKS8oMiphKTsoaD0oLW8rYykvKDIqYSkpPj0wJiZoPD0xJiYocltsKytdPWgpLHA+PTAmJnA8PTEmJihyW2wrK109cCl9fXJldHVybiBsfWZ1bmN0aW9uIHduKHQsZSxuLGkscixvKXt2YXIgYT0oZS10KSpyK3Qscz0obi1lKSpyK2UsbD0oaS1uKSpyK24sdT0ocy1hKSpyK2EsaD0obC1zKSpyK3MsYz0oaC11KSpyK3U7b1swXT10LG9bMV09YSxvWzJdPXUsb1szXT1jLG9bNF09YyxvWzVdPWgsb1s2XT1sLG9bN109aX1mdW5jdGlvbiBTbih0LGUsbixpLHIsbyxhLHMsbCx1LGgpe3ZhciBjLHAsZCxmLGcseT0uMDA1LHY9MS8wO2RuWzBdPWwsZG5bMV09dTtmb3IodmFyIG09MDttPDE7bSs9LjA1KWZuWzBdPW1uKHQsbixyLGEsbSksZm5bMV09bW4oZSxpLG8scyxtKSwoZj1GdChkbixmbikpPHYmJihjPW0sdj1mKTt2PTEvMDtmb3IodmFyIHg9MDt4PDMyJiYhKHk8aG4pO3grKylwPWMteSxkPWMreSxmblswXT1tbih0LG4scixhLHApLGZuWzFdPW1uKGUsaSxvLHMscCksZj1GdChmbixkbikscD49MCYmZjx2PyhjPXAsdj1mKTooZ25bMF09bW4odCxuLHIsYSxkKSxnblsxXT1tbihlLGksbyxzLGQpLGc9RnQoZ24sZG4pLGQ8PTEmJmc8dj8oYz1kLHY9Zyk6eSo9LjUpO3JldHVybiBoJiYoaFswXT1tbih0LG4scixhLGMpLGhbMV09bW4oZSxpLG8scyxjKSksbG4odil9ZnVuY3Rpb24gTW4odCxlLG4saSxyLG8sYSxzLGwpe2Zvcih2YXIgdT10LGg9ZSxjPTAscD0xL2wsZD0xO2Q8PWw7ZCsrKXt2YXIgZj1kKnAsZz1tbih0LG4scixhLGYpLHk9bW4oZSxpLG8scyxmKSx2PWctdSxtPXktaDtjKz1NYXRoLnNxcnQodip2K20qbSksdT1nLGg9eX1yZXR1cm4gY31mdW5jdGlvbiBJbih0LGUsbixpKXt2YXIgcj0xLWk7cmV0dXJuIHIqKHIqdCsyKmkqZSkraSppKm59ZnVuY3Rpb24gVG4odCxlLG4saSl7cmV0dXJuIDIqKCgxLWkpKihlLXQpK2kqKG4tZSkpfWZ1bmN0aW9uIENuKHQsZSxuKXt2YXIgaT10K24tMiplO3JldHVybiAwPT09aT8uNToodC1lKS9pfWZ1bmN0aW9uIERuKHQsZSxuLGkscil7dmFyIG89KGUtdCkqaSt0LGE9KG4tZSkqaStlLHM9KGEtbykqaStvO3JbMF09dCxyWzFdPW8sclsyXT1zLHJbM109cyxyWzRdPWEscls1XT1ufWZ1bmN0aW9uIEFuKHQsZSxuLGkscixvLGEscyxsKXt2YXIgdSxoPS4wMDUsYz0xLzA7ZG5bMF09YSxkblsxXT1zO2Zvcih2YXIgcD0wO3A8MTtwKz0uMDUpe2ZuWzBdPUluKHQsbixyLHApLGZuWzFdPUluKGUsaSxvLHApLCh5PUZ0KGRuLGZuKSk8YyYmKHU9cCxjPXkpfWM9MS8wO2Zvcih2YXIgZD0wO2Q8MzImJiEoaDxobik7ZCsrKXt2YXIgZj11LWgsZz11K2g7Zm5bMF09SW4odCxuLHIsZiksZm5bMV09SW4oZSxpLG8sZik7dmFyIHk9RnQoZm4sZG4pO2lmKGY+PTAmJnk8Yyl1PWYsYz15O2Vsc2V7Z25bMF09SW4odCxuLHIsZyksZ25bMV09SW4oZSxpLG8sZyk7dmFyIHY9RnQoZ24sZG4pO2c8PTEmJnY8Yz8odT1nLGM9dik6aCo9LjV9fXJldHVybiBsJiYobFswXT1Jbih0LG4scix1KSxsWzFdPUluKGUsaSxvLHUpKSxsbihjKX1mdW5jdGlvbiBrbih0LGUsbixpLHIsbyxhKXtmb3IodmFyIHM9dCxsPWUsdT0wLGg9MS9hLGM9MTtjPD1hO2MrKyl7dmFyIHA9YypoLGQ9SW4odCxuLHIscCksZj1JbihlLGksbyxwKSxnPWQtcyx5PWYtbDt1Kz1NYXRoLnNxcnQoZypnK3kqeSkscz1kLGw9Zn1yZXR1cm4gdX12YXIgTG49L2N1YmljLWJlemllclwoKFswLTksXC5lIF0rKVwpLztmdW5jdGlvbiBQbih0KXt2YXIgZT10JiZMbi5leGVjKHQpO2lmKGUpe3ZhciBuPWVbMV0uc3BsaXQoIiwiKSxpPSt1dChuWzBdKSxyPSt1dChuWzFdKSxvPSt1dChuWzJdKSxhPSt1dChuWzNdKTtpZihpc05hTihpK3IrbythKSlyZXR1cm47dmFyIHM9W107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wPzA6dD49MT8xOl9uKDAsaSxvLDEsdCxzKSYmbW4oMCxyLGEsMSxzWzBdKX19fXZhciBPbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5faW5pdGVkPSExLHRoaXMuX3N0YXJ0VGltZT0wLHRoaXMuX3BhdXNlZFRpbWU9MCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5fbGlmZT10LmxpZmV8fDFlMyx0aGlzLl9kZWxheT10LmRlbGF5fHwwLHRoaXMubG9vcD10Lmxvb3B8fCExLHRoaXMub25mcmFtZT10Lm9uZnJhbWV8fGJ0LHRoaXMub25kZXN0cm95PXQub25kZXN0cm95fHxidCx0aGlzLm9ucmVzdGFydD10Lm9ucmVzdGFydHx8YnQsdC5lYXNpbmcmJnRoaXMuc2V0RWFzaW5nKHQuZWFzaW5nKX1yZXR1cm4gdC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2luaXRlZHx8KHRoaXMuX3N0YXJ0VGltZT10K3RoaXMuX2RlbGF5LHRoaXMuX2luaXRlZD0hMCksIXRoaXMuX3BhdXNlZCl7dmFyIG49dGhpcy5fbGlmZSxpPXQtdGhpcy5fc3RhcnRUaW1lLXRoaXMuX3BhdXNlZFRpbWUscj1pL247cjwwJiYocj0wKSxyPU1hdGgubWluKHIsMSk7dmFyIG89dGhpcy5lYXNpbmdGdW5jLGE9bz9vKHIpOnI7aWYodGhpcy5vbmZyYW1lKGEpLDE9PT1yKXtpZighdGhpcy5sb29wKXJldHVybiEwO3ZhciBzPWklbjt0aGlzLl9zdGFydFRpbWU9dC1zLHRoaXMuX3BhdXNlZFRpbWU9MCx0aGlzLm9ucmVzdGFydCgpfXJldHVybiExfXRoaXMuX3BhdXNlZFRpbWUrPWV9LHQucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSEwfSx0LnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWQ9ITF9LHQucHJvdG90eXBlLnNldEVhc2luZz1mdW5jdGlvbih0KXt0aGlzLmVhc2luZz10LHRoaXMuZWFzaW5nRnVuYz1YKHQpP3Q6YW5bdF18fFBuKHQpfSx0fSgpLFJuPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dH0sTm49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fbGVuPTB9cmV0dXJuIHQucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUm4odCk7cmV0dXJuIHRoaXMuaW5zZXJ0RW50cnkoZSksZX0sdC5wcm90b3R5cGUuaW5zZXJ0RW50cnk9ZnVuY3Rpb24odCl7dGhpcy5oZWFkPyh0aGlzLnRhaWwubmV4dD10LHQucHJldj10aGlzLnRhaWwsdC5uZXh0PW51bGwsdGhpcy50YWlsPXQpOnRoaXMuaGVhZD10aGlzLnRhaWw9dCx0aGlzLl9sZW4rK30sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXQucHJldixuPXQubmV4dDtlP2UubmV4dD1uOnRoaXMuaGVhZD1uLG4/bi5wcmV2PWU6dGhpcy50YWlsPWUsdC5uZXh0PXQucHJldj1udWxsLHRoaXMuX2xlbi0tfSx0LnByb3RvdHlwZS5sZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVufSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLl9sZW49MH0sdH0oKSxFbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fbGlzdD1uZXcgTm4sdGhpcy5fbWF4U2l6ZT0xMCx0aGlzLl9tYXA9e30sdGhpcy5fbWF4U2l6ZT10fXJldHVybiB0LnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9saXN0LGk9dGhpcy5fbWFwLHI9bnVsbDtpZihudWxsPT1pW3RdKXt2YXIgbz1uLmxlbigpLGE9dGhpcy5fbGFzdFJlbW92ZWRFbnRyeTtpZihvPj10aGlzLl9tYXhTaXplJiZvPjApe3ZhciBzPW4uaGVhZDtuLnJlbW92ZShzKSxkZWxldGUgaVtzLmtleV0scj1zLnZhbHVlLHRoaXMuX2xhc3RSZW1vdmVkRW50cnk9c31hP2EudmFsdWU9ZTphPW5ldyBSbihlKSxhLmtleT10LG4uaW5zZXJ0RW50cnkoYSksaVt0XT1hfXJldHVybiByfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwW3RdLG49dGhpcy5fbGlzdDtpZihudWxsIT1lKXJldHVybiBlIT09bi50YWlsJiYobi5yZW1vdmUoZSksbi5pbnNlcnRFbnRyeShlKSksZS52YWx1ZX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9saXN0LmNsZWFyKCksdGhpcy5fbWFwPXt9fSx0LnByb3RvdHlwZS5sZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGlzdC5sZW4oKX0sdH0oKSx6bj17dHJhbnNwYXJlbnQ6WzAsMCwwLDBdLGFsaWNlYmx1ZTpbMjQwLDI0OCwyNTUsMV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNSwxXSxhcXVhOlswLDI1NSwyNTUsMV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTIsMV0sYXp1cmU6WzI0MCwyNTUsMjU1LDFdLGJlaWdlOlsyNDUsMjQ1LDIyMCwxXSxiaXNxdWU6WzI1NSwyMjgsMTk2LDFdLGJsYWNrOlswLDAsMCwxXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDUsMV0sYmx1ZTpbMCwwLDI1NSwxXSxibHVldmlvbGV0OlsxMzgsNDMsMjI2LDFdLGJyb3duOlsxNjUsNDIsNDIsMV0sYnVybHl3b29kOlsyMjIsMTg0LDEzNSwxXSxjYWRldGJsdWU6Wzk1LDE1OCwxNjAsMV0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwLDFdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMCwxXSxjb3JhbDpbMjU1LDEyNyw4MCwxXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzcsMV0sY29ybnNpbGs6WzI1NSwyNDgsMjIwLDFdLGNyaW1zb246WzIyMCwyMCw2MCwxXSxjeWFuOlswLDI1NSwyNTUsMV0sZGFya2JsdWU6WzAsMCwxMzksMV0sZGFya2N5YW46WzAsMTM5LDEzOSwxXSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExLDFdLGRhcmtncmF5OlsxNjksMTY5LDE2OSwxXSxkYXJrZ3JlZW46WzAsMTAwLDAsMV0sZGFya2dyZXk6WzE2OSwxNjksMTY5LDFdLGRhcmtraGFraTpbMTg5LDE4MywxMDcsMV0sZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX07ZnVuY3Rpb24gVm4odCl7cmV0dXJuKHQ9TWF0aC5yb3VuZCh0KSk8MD8wOnQ+MjU1PzI1NTp0fWZ1bmN0aW9uIEJuKHQpe3JldHVybiB0PDA/MDp0PjE/MTp0fWZ1bmN0aW9uIEZuKHQpe3ZhciBlPXQ7cmV0dXJuIGUubGVuZ3RoJiYiJSI9PT1lLmNoYXJBdChlLmxlbmd0aC0xKT9WbihwYXJzZUZsb2F0KGUpLzEwMCoyNTUpOlZuKHBhcnNlSW50KGUsMTApKX1mdW5jdGlvbiBHbih0KXt2YXIgZT10O3JldHVybiBlLmxlbmd0aCYmIiUiPT09ZS5jaGFyQXQoZS5sZW5ndGgtMSk/Qm4ocGFyc2VGbG9hdChlKS8xMDApOkJuKHBhcnNlRmxvYXQoZSkpfWZ1bmN0aW9uIFduKHQsZSxuKXtyZXR1cm4gbjwwP24rPTE6bj4xJiYobi09MSksNipuPDE/dCsoZS10KSpuKjY6MipuPDE/ZTozKm48Mj90KyhlLXQpKigyLzMtbikqNjp0fWZ1bmN0aW9uIEhuKHQsZSxuKXtyZXR1cm4gdCsoZS10KSpufWZ1bmN0aW9uIFluKHQsZSxuLGkscil7cmV0dXJuIHRbMF09ZSx0WzFdPW4sdFsyXT1pLHRbM109cix0fWZ1bmN0aW9uIFhuKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0fXZhciBVbj1uZXcgRW4oMjApLFpuPW51bGw7ZnVuY3Rpb24gam4odCxlKXtabiYmWG4oWm4sZSksWm49VW4ucHV0KHQsWm58fGUuc2xpY2UoKSl9ZnVuY3Rpb24gcW4odCxlKXtpZih0KXtlPWV8fFtdO3ZhciBuPVVuLmdldCh0KTtpZihuKXJldHVybiBYbihlLG4pO3ZhciBpPSh0Kz0iIikucmVwbGFjZSgvIC9nLCIiKS50b0xvd2VyQ2FzZSgpO2lmKGkgaW4gem4pcmV0dXJuIFhuKGUsem5baV0pLGpuKHQsZSksZTt2YXIgcixvPWkubGVuZ3RoO2lmKCIjIj09PWkuY2hhckF0KDApKXJldHVybiA0PT09b3x8NT09PW8/KHI9cGFyc2VJbnQoaS5zbGljZSgxLDQpLDE2KSk+PTAmJnI8PTQwOTU/KFluKGUsKDM4NDAmcik+PjR8KDM4NDAmcik+PjgsMjQwJnJ8KDI0MCZyKT4+NCwxNSZyfCgxNSZyKTw8NCw1PT09bz9wYXJzZUludChpLnNsaWNlKDQpLDE2KS8xNToxKSxqbih0LGUpLGUpOnZvaWQgWW4oZSwwLDAsMCwxKTo3PT09b3x8OT09PW8/KHI9cGFyc2VJbnQoaS5zbGljZSgxLDcpLDE2KSk+PTAmJnI8PTE2Nzc3MjE1PyhZbihlLCgxNjcxMTY4MCZyKT4+MTYsKDY1MjgwJnIpPj44LDI1NSZyLDk9PT1vP3BhcnNlSW50KGkuc2xpY2UoNyksMTYpLzI1NToxKSxqbih0LGUpLGUpOnZvaWQgWW4oZSwwLDAsMCwxKTp2b2lkIDA7dmFyIGE9aS5pbmRleE9mKCIoIikscz1pLmluZGV4T2YoIikiKTtpZigtMSE9PWEmJnMrMT09PW8pe3ZhciBsPWkuc3Vic3RyKDAsYSksdT1pLnN1YnN0cihhKzEscy0oYSsxKSkuc3BsaXQoIiwiKSxoPTE7c3dpdGNoKGwpe2Nhc2UicmdiYSI6aWYoNCE9PXUubGVuZ3RoKXJldHVybiAzPT09dS5sZW5ndGg/WW4oZSwrdVswXSwrdVsxXSwrdVsyXSwxKTpZbihlLDAsMCwwLDEpO2g9R24odS5wb3AoKSk7Y2FzZSJyZ2IiOnJldHVybiB1Lmxlbmd0aD49Mz8oWW4oZSxGbih1WzBdKSxGbih1WzFdKSxGbih1WzJdKSwzPT09dS5sZW5ndGg/aDpHbih1WzNdKSksam4odCxlKSxlKTp2b2lkIFluKGUsMCwwLDAsMSk7Y2FzZSJoc2xhIjpyZXR1cm4gNCE9PXUubGVuZ3RoP3ZvaWQgWW4oZSwwLDAsMCwxKToodVszXT1Hbih1WzNdKSxLbih1LGUpLGpuKHQsZSksZSk7Y2FzZSJoc2wiOnJldHVybiAzIT09dS5sZW5ndGg/dm9pZCBZbihlLDAsMCwwLDEpOihLbih1LGUpLGpuKHQsZSksZSk7ZGVmYXVsdDpyZXR1cm59fVluKGUsMCwwLDAsMSl9fWZ1bmN0aW9uIEtuKHQsZSl7dmFyIG49KHBhcnNlRmxvYXQodFswXSklMzYwKzM2MCklMzYwLzM2MCxpPUduKHRbMV0pLHI9R24odFsyXSksbz1yPD0uNT9yKihpKzEpOnIraS1yKmksYT0yKnItbztyZXR1cm4gWW4oZT1lfHxbXSxWbigyNTUqV24oYSxvLG4rMS8zKSksVm4oMjU1KlduKGEsbyxuKSksVm4oMjU1KlduKGEsbyxuLTEvMykpLDEpLDQ9PT10Lmxlbmd0aCYmKGVbM109dFszXSksZX1mdW5jdGlvbiAkbih0LGUpe3ZhciBuPXFuKHQpO2lmKG4pe2Zvcih2YXIgaT0wO2k8MztpKyspbltpXT1lPDA/bltpXSooMS1lKXwwOigyNTUtbltpXSkqZStuW2ldfDAsbltpXT4yNTU/bltpXT0yNTU6bltpXTwwJiYobltpXT0wKTtyZXR1cm4gcmkobiw0PT09bi5sZW5ndGg/InJnYmEiOiJyZ2IiKX19ZnVuY3Rpb24gSm4odCxlLG4pe2lmKGUmJmUubGVuZ3RoJiZ0Pj0wJiZ0PD0xKXtuPW58fFtdO3ZhciBpPXQqKGUubGVuZ3RoLTEpLHI9TWF0aC5mbG9vcihpKSxvPU1hdGguY2VpbChpKSxhPWVbcl0scz1lW29dLGw9aS1yO3JldHVybiBuWzBdPVZuKEhuKGFbMF0sc1swXSxsKSksblsxXT1WbihIbihhWzFdLHNbMV0sbCkpLG5bMl09Vm4oSG4oYVsyXSxzWzJdLGwpKSxuWzNdPUJuKEhuKGFbM10sc1szXSxsKSksbn19dmFyIFFuPUpuO2Z1bmN0aW9uIHRpKHQsZSxuKXtpZihlJiZlLmxlbmd0aCYmdD49MCYmdDw9MSl7dmFyIGk9dCooZS5sZW5ndGgtMSkscj1NYXRoLmZsb29yKGkpLG89TWF0aC5jZWlsKGkpLGE9cW4oZVtyXSkscz1xbihlW29dKSxsPWktcix1PXJpKFtWbihIbihhWzBdLHNbMF0sbCkpLFZuKEhuKGFbMV0sc1sxXSxsKSksVm4oSG4oYVsyXSxzWzJdLGwpKSxCbihIbihhWzNdLHNbM10sbCkpXSwicmdiYSIpO3JldHVybiBuP3tjb2xvcjp1LGxlZnRJbmRleDpyLHJpZ2h0SW5kZXg6byx2YWx1ZTppfTp1fX12YXIgZWk9dGk7ZnVuY3Rpb24gbmkodCxlLG4saSl7dmFyIHI9cW4odCk7aWYodClyZXR1cm4gcj1mdW5jdGlvbih0KXtpZih0KXt2YXIgZSxuLGk9dFswXS8yNTUscj10WzFdLzI1NSxvPXRbMl0vMjU1LGE9TWF0aC5taW4oaSxyLG8pLHM9TWF0aC5tYXgoaSxyLG8pLGw9cy1hLHU9KHMrYSkvMjtpZigwPT09bCllPTAsbj0wO2Vsc2V7bj11PC41P2wvKHMrYSk6bC8oMi1zLWEpO3ZhciBoPSgocy1pKS82K2wvMikvbCxjPSgocy1yKS82K2wvMikvbCxwPSgocy1vKS82K2wvMikvbDtpPT09cz9lPXAtYzpyPT09cz9lPTEvMytoLXA6bz09PXMmJihlPTIvMytjLWgpLGU8MCYmKGUrPTEpLGU+MSYmKGUtPTEpfXZhciBkPVszNjAqZSxuLHVdO3JldHVybiBudWxsIT10WzNdJiZkLnB1c2godFszXSksZH19KHIpLG51bGwhPWUmJihyWzBdPWZ1bmN0aW9uKHQpe3JldHVybih0PU1hdGgucm91bmQodCkpPDA/MDp0PjM2MD8zNjA6dH0oZSkpLG51bGwhPW4mJihyWzFdPUduKG4pKSxudWxsIT1pJiYoclsyXT1HbihpKSkscmkoS24ociksInJnYmEiKX1mdW5jdGlvbiBpaSh0LGUpe3ZhciBuPXFuKHQpO2lmKG4mJm51bGwhPWUpcmV0dXJuIG5bM109Qm4oZSkscmkobiwicmdiYSIpfWZ1bmN0aW9uIHJpKHQsZSl7aWYodCYmdC5sZW5ndGgpe3ZhciBuPXRbMF0rIiwiK3RbMV0rIiwiK3RbMl07cmV0dXJuInJnYmEiIT09ZSYmImhzdmEiIT09ZSYmImhzbGEiIT09ZXx8KG4rPSIsIit0WzNdKSxlKyIoIituKyIpIn19ZnVuY3Rpb24gb2kodCxlKXt2YXIgbj1xbih0KTtyZXR1cm4gbj8oLjI5OSpuWzBdKy41ODcqblsxXSsuMTE0Km5bMl0pKm5bM10vMjU1KygxLW5bM10pKmU6MH12YXIgYWk9bmV3IEVuKDEwMCk7ZnVuY3Rpb24gc2kodCl7aWYoVSh0KSl7dmFyIGU9YWkuZ2V0KHQpO3JldHVybiBlfHwoZT0kbih0LC0uMSksYWkucHV0KHQsZSkpLGV9aWYoUSh0KSl7dmFyIG49QSh7fSx0KTtyZXR1cm4gbi5jb2xvclN0b3BzPXoodC5jb2xvclN0b3BzLChmdW5jdGlvbih0KXtyZXR1cm57b2Zmc2V0OnQub2Zmc2V0LGNvbG9yOiRuKHQuY29sb3IsLS4xKX19KSksbn1yZXR1cm4gdH12YXIgbGk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscGFyc2U6cW4sbGlmdDokbix0b0hleDpmdW5jdGlvbih0KXt2YXIgZT1xbih0KTtpZihlKXJldHVybigoMTw8MjQpKyhlWzBdPDwxNikrKGVbMV08PDgpKyArZVsyXSkudG9TdHJpbmcoMTYpLnNsaWNlKDEpfSxmYXN0TGVycDpKbixmYXN0TWFwVG9Db2xvcjpRbixsZXJwOnRpLG1hcFRvQ29sb3I6ZWksbW9kaWZ5SFNMOm5pLG1vZGlmeUFscGhhOmlpLHN0cmluZ2lmeTpyaSxsdW06b2kscmFuZG9tOmZ1bmN0aW9uKCl7cmV0dXJuIHJpKFtNYXRoLnJvdW5kKDI1NSpNYXRoLnJhbmRvbSgpKSxNYXRoLnJvdW5kKDI1NSpNYXRoLnJhbmRvbSgpKSxNYXRoLnJvdW5kKDI1NSpNYXRoLnJhbmRvbSgpKV0sInJnYiIpfSxsaWZ0Q29sb3I6c2l9KSx1aT1NYXRoLnJvdW5kO2Z1bmN0aW9uIGhpKHQpe3ZhciBlO2lmKHQmJiJ0cmFuc3BhcmVudCIhPT10KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigicmdiYSIpPi0xKXt2YXIgbj1xbih0KTtuJiYodD0icmdiKCIrblswXSsiLCIrblsxXSsiLCIrblsyXSsiKSIsZT1uWzNdKX19ZWxzZSB0PSJub25lIjtyZXR1cm57Y29sb3I6dCxvcGFjaXR5Om51bGw9PWU/MTplfX12YXIgY2k9MWUtNDtmdW5jdGlvbiBwaSh0KXtyZXR1cm4gdDxjaSYmdD4tMWUtNH1mdW5jdGlvbiBkaSh0KXtyZXR1cm4gdWkoMWUzKnQpLzFlM31mdW5jdGlvbiBmaSh0KXtyZXR1cm4gdWkoMWU0KnQpLzFlNH12YXIgZ2k9e2xlZnQ6InN0YXJ0IixyaWdodDoiZW5kIixjZW50ZXI6Im1pZGRsZSIsbWlkZGxlOiJtaWRkbGUifTtmdW5jdGlvbiB5aSh0KXtyZXR1cm4gdCYmISF0LmltYWdlfWZ1bmN0aW9uIHZpKHQpe3JldHVybiB5aSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiEhdC5zdmdFbGVtZW50fSh0KX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4ibGluZWFyIj09PXQudHlwZX1mdW5jdGlvbiB4aSh0KXtyZXR1cm4icmFkaWFsIj09PXQudHlwZX1mdW5jdGlvbiBfaSh0KXtyZXR1cm4gdCYmKCJsaW5lYXIiPT09dC50eXBlfHwicmFkaWFsIj09PXQudHlwZSl9ZnVuY3Rpb24gYmkodCl7cmV0dXJuInVybCgjIit0KyIpIn1mdW5jdGlvbiB3aSh0KXt2YXIgZT10LmdldEdsb2JhbFNjYWxlKCksbj1NYXRoLm1heChlWzBdLGVbMV0pO3JldHVybiBNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5sb2cobikvTWF0aC5sb2coMTApKSwxKX1mdW5jdGlvbiBTaSh0KXt2YXIgZT10Lnh8fDAsbj10Lnl8fDAsaT0odC5yb3RhdGlvbnx8MCkqd3Qscj1ydCh0LnNjYWxlWCwxKSxvPXJ0KHQuc2NhbGVZLDEpLGE9dC5za2V3WHx8MCxzPXQuc2tld1l8fDAsbD1bXTtyZXR1cm4oZXx8bikmJmwucHVzaCgidHJhbnNsYXRlKCIrZSsicHgsIituKyJweCkiKSxpJiZsLnB1c2goInJvdGF0ZSgiK2krIikiKSwxPT09ciYmMT09PW98fGwucHVzaCgic2NhbGUoIityKyIsIitvKyIpIiksKGF8fHMpJiZsLnB1c2goInNrZXcoIit1aShhKnd0KSsiZGVnLCAiK3VpKHMqd3QpKyJkZWcpIiksbC5qb2luKCIgIil9dmFyIE1pPXIuaGFzR2xvYmFsV2luZG93JiZYKHdpbmRvdy5idG9hKT9mdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LmJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKSl9OiJ1bmRlZmluZWQiIT10eXBlb2YgQnVmZmVyP2Z1bmN0aW9uKHQpe3JldHVybiBCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSxJaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gVGkodCxlLG4pe3JldHVybihlLXQpKm4rdH1mdW5jdGlvbiBDaSh0LGUsbixpKXtmb3IodmFyIHI9ZS5sZW5ndGgsbz0wO288cjtvKyspdFtvXT1UaShlW29dLG5bb10saSk7cmV0dXJuIHR9ZnVuY3Rpb24gRGkodCxlLG4saSl7Zm9yKHZhciByPWUubGVuZ3RoLG89MDtvPHI7bysrKXRbb109ZVtvXStuW29dKmk7cmV0dXJuIHR9ZnVuY3Rpb24gQWkodCxlLG4saSl7Zm9yKHZhciByPWUubGVuZ3RoLG89ciYmZVswXS5sZW5ndGgsYT0wO2E8cjthKyspe3RbYV18fCh0W2FdPVtdKTtmb3IodmFyIHM9MDtzPG87cysrKXRbYV1bc109ZVthXVtzXStuW2FdW3NdKml9cmV0dXJuIHR9ZnVuY3Rpb24ga2kodCxlKXtmb3IodmFyIG49dC5sZW5ndGgsaT1lLmxlbmd0aCxyPW4+aT9lOnQsbz1NYXRoLm1pbihuLGkpLGE9cltvLTFdfHx7Y29sb3I6WzAsMCwwLDBdLG9mZnNldDowfSxzPW87czxNYXRoLm1heChuLGkpO3MrKylyLnB1c2goe29mZnNldDphLm9mZnNldCxjb2xvcjphLmNvbG9yLnNsaWNlKCl9KX1mdW5jdGlvbiBMaSh0LGUsbil7dmFyIGk9dCxyPWU7aWYoaS5wdXNoJiZyLnB1c2gpe3ZhciBvPWkubGVuZ3RoLGE9ci5sZW5ndGg7aWYobyE9PWEpaWYobz5hKWkubGVuZ3RoPWE7ZWxzZSBmb3IodmFyIHM9bztzPGE7cysrKWkucHVzaCgxPT09bj9yW3NdOklpLmNhbGwocltzXSkpO3ZhciBsPWlbMF0mJmlbMF0ubGVuZ3RoO2ZvcihzPTA7czxpLmxlbmd0aDtzKyspaWYoMT09PW4paXNOYU4oaVtzXSkmJihpW3NdPXJbc10pO2Vsc2UgZm9yKHZhciB1PTA7dTxsO3UrKylpc05hTihpW3NdW3VdKSYmKGlbc11bdV09cltzXVt1XSl9fWZ1bmN0aW9uIFBpKHQpe2lmKE4odCkpe3ZhciBlPXQubGVuZ3RoO2lmKE4odFswXSkpe2Zvcih2YXIgbj1bXSxpPTA7aTxlO2krKyluLnB1c2goSWkuY2FsbCh0W2ldKSk7cmV0dXJuIG59cmV0dXJuIElpLmNhbGwodCl9cmV0dXJuIHR9ZnVuY3Rpb24gT2kodCl7cmV0dXJuIHRbMF09TWF0aC5mbG9vcih0WzBdKXx8MCx0WzFdPU1hdGguZmxvb3IodFsxXSl8fDAsdFsyXT1NYXRoLmZsb29yKHRbMl0pfHwwLHRbM109bnVsbD09dFszXT8xOnRbM10sInJnYmEoIit0LmpvaW4oIiwiKSsiKSJ9ZnVuY3Rpb24gUmkodCl7cmV0dXJuIDQ9PT10fHw1PT09dH1mdW5jdGlvbiBOaSh0KXtyZXR1cm4gMT09PXR8fDI9PT10fXZhciBFaT1bMCwwLDAsMF0semk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMua2V5ZnJhbWVzPVtdLHRoaXMuZGlzY3JldGU9ITEsdGhpcy5faW52YWxpZD0hMSx0aGlzLl9uZWVkc1NvcnQ9ITEsdGhpcy5fbGFzdEZyPTAsdGhpcy5fbGFzdEZyUD0wLHRoaXMucHJvcE5hbWU9dH1yZXR1cm4gdC5wcm90b3R5cGUuaXNGaW5pc2hlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maW5pc2hlZH0sdC5wcm90b3R5cGUuc2V0RmluaXNoZWQ9ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hlZD0hMCx0aGlzLl9hZGRpdGl2ZVRyYWNrJiZ0aGlzLl9hZGRpdGl2ZVRyYWNrLnNldEZpbmlzaGVkKCl9LHQucHJvdG90eXBlLm5lZWRzQW5pbWF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtleWZyYW1lcy5sZW5ndGg+PTF9LHQucHJvdG90eXBlLmdldEFkZGl0aXZlVHJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWRkaXRpdmVUcmFja30sdC5wcm90b3R5cGUuYWRkS2V5ZnJhbWU9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX25lZWRzU29ydD0hMDt2YXIgaT10aGlzLmtleWZyYW1lcyxyPWkubGVuZ3RoLG89ITEsYT02LHM9ZTtpZihOKGUpKXt2YXIgbD1mdW5jdGlvbih0KXtyZXR1cm4gTih0JiZ0WzBdKT8yOjF9KGUpO2E9bCwoMT09PWwmJiFqKGVbMF0pfHwyPT09bCYmIWooZVswXVswXSkpJiYobz0hMCl9ZWxzZSBpZihqKGUpJiYhbnQoZSkpYT0wO2Vsc2UgaWYoVShlKSlpZihpc05hTigrZSkpe3ZhciB1PXFuKGUpO3UmJihzPXUsYT0zKX1lbHNlIGE9MDtlbHNlIGlmKFEoZSkpe3ZhciBoPUEoe30scyk7aC5jb2xvclN0b3BzPXooZS5jb2xvclN0b3BzLChmdW5jdGlvbih0KXtyZXR1cm57b2Zmc2V0OnQub2Zmc2V0LGNvbG9yOnFuKHQuY29sb3IpfX0pKSxtaShlKT9hPTQ6eGkoZSkmJihhPTUpLHM9aH0wPT09cj90aGlzLnZhbFR5cGU9YTphPT09dGhpcy52YWxUeXBlJiY2IT09YXx8KG89ITApLHRoaXMuZGlzY3JldGU9dGhpcy5kaXNjcmV0ZXx8bzt2YXIgYz17dGltZTp0LHZhbHVlOnMscmF3VmFsdWU6ZSxwZXJjZW50OjB9O3JldHVybiBuJiYoYy5lYXNpbmc9bixjLmVhc2luZ0Z1bmM9WChuKT9uOmFuW25dfHxQbihuKSksaS5wdXNoKGMpLGN9LHQucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmtleWZyYW1lczt0aGlzLl9uZWVkc1NvcnQmJm4uc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50aW1lLWUudGltZX0pKTtmb3IodmFyIGk9dGhpcy52YWxUeXBlLHI9bi5sZW5ndGgsbz1uW3ItMV0sYT10aGlzLmRpc2NyZXRlLHM9TmkoaSksbD1SaShpKSx1PTA7dTxyO3UrKyl7dmFyIGg9blt1XSxjPWgudmFsdWUscD1vLnZhbHVlO2gucGVyY2VudD1oLnRpbWUvdCxhfHwocyYmdSE9PXItMT9MaShjLHAsaSk6bCYma2koYy5jb2xvclN0b3BzLHAuY29sb3JTdG9wcykpfWlmKCFhJiY1IT09aSYmZSYmdGhpcy5uZWVkc0FuaW1hdGUoKSYmZS5uZWVkc0FuaW1hdGUoKSYmaT09PWUudmFsVHlwZSYmIWUuX2ZpbmlzaGVkKXt0aGlzLl9hZGRpdGl2ZVRyYWNrPWU7dmFyIGQ9blswXS52YWx1ZTtmb3IodT0wO3U8cjt1KyspMD09PWk/blt1XS5hZGRpdGl2ZVZhbHVlPW5bdV0udmFsdWUtZDozPT09aT9uW3VdLmFkZGl0aXZlVmFsdWU9RGkoW10sblt1XS52YWx1ZSxkLC0xKTpOaShpKSYmKG5bdV0uYWRkaXRpdmVWYWx1ZT0xPT09aT9EaShbXSxuW3VdLnZhbHVlLGQsLTEpOkFpKFtdLG5bdV0udmFsdWUsZCwtMSkpfX0sdC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl9maW5pc2hlZCl7dGhpcy5fYWRkaXRpdmVUcmFjayYmdGhpcy5fYWRkaXRpdmVUcmFjay5fZmluaXNoZWQmJih0aGlzLl9hZGRpdGl2ZVRyYWNrPW51bGwpO3ZhciBuLGkscixvPW51bGwhPXRoaXMuX2FkZGl0aXZlVHJhY2ssYT1vPyJhZGRpdGl2ZVZhbHVlIjoidmFsdWUiLHM9dGhpcy52YWxUeXBlLGw9dGhpcy5rZXlmcmFtZXMsdT1sLmxlbmd0aCxoPXRoaXMucHJvcE5hbWUsYz0zPT09cyxwPXRoaXMuX2xhc3RGcixkPU1hdGgubWluO2lmKDE9PT11KWk9cj1sWzBdO2Vsc2V7aWYoZTwwKW49MDtlbHNlIGlmKGU8dGhpcy5fbGFzdEZyUCl7Zm9yKG49ZChwKzEsdS0xKTtuPj0wJiYhKGxbbl0ucGVyY2VudDw9ZSk7bi0tKTtuPWQobix1LTIpfWVsc2V7Zm9yKG49cDtuPHUmJiEobFtuXS5wZXJjZW50PmUpO24rKyk7bj1kKG4tMSx1LTIpfXI9bFtuKzFdLGk9bFtuXX1pZihpJiZyKXt0aGlzLl9sYXN0RnI9bix0aGlzLl9sYXN0RnJQPWU7dmFyIGY9ci5wZXJjZW50LWkucGVyY2VudCxnPTA9PT1mPzE6ZCgoZS1pLnBlcmNlbnQpL2YsMSk7ci5lYXNpbmdGdW5jJiYoZz1yLmVhc2luZ0Z1bmMoZykpO3ZhciB5PW8/dGhpcy5fYWRkaXRpdmVWYWx1ZTpjP0VpOnRbaF07aWYoIU5pKHMpJiYhY3x8eXx8KHk9dGhpcy5fYWRkaXRpdmVWYWx1ZT1bXSksdGhpcy5kaXNjcmV0ZSl0W2hdPWc8MT9pLnJhd1ZhbHVlOnIucmF3VmFsdWU7ZWxzZSBpZihOaShzKSkxPT09cz9DaSh5LGlbYV0sclthXSxnKTpmdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9ZS5sZW5ndGgsbz1yJiZlWzBdLmxlbmd0aCxhPTA7YTxyO2ErKyl7dFthXXx8KHRbYV09W10pO2Zvcih2YXIgcz0wO3M8bztzKyspdFthXVtzXT1UaShlW2FdW3NdLG5bYV1bc10saSl9fSh5LGlbYV0sclthXSxnKTtlbHNlIGlmKFJpKHMpKXt2YXIgdj1pW2FdLG09clthXSx4PTQ9PT1zO3RbaF09e3R5cGU6eD8ibGluZWFyIjoicmFkaWFsIix4OlRpKHYueCxtLngsZykseTpUaSh2LnksbS55LGcpLGNvbG9yU3RvcHM6eih2LmNvbG9yU3RvcHMsKGZ1bmN0aW9uKHQsZSl7dmFyIG49bS5jb2xvclN0b3BzW2VdO3JldHVybntvZmZzZXQ6VGkodC5vZmZzZXQsbi5vZmZzZXQsZyksY29sb3I6T2koQ2koW10sdC5jb2xvcixuLmNvbG9yLGcpKX19KSksZ2xvYmFsOm0uZ2xvYmFsfSx4Pyh0W2hdLngyPVRpKHYueDIsbS54MixnKSx0W2hdLnkyPVRpKHYueTIsbS55MixnKSk6dFtoXS5yPVRpKHYucixtLnIsZyl9ZWxzZSBpZihjKUNpKHksaVthXSxyW2FdLGcpLG98fCh0W2hdPU9pKHkpKTtlbHNle3ZhciBfPVRpKGlbYV0sclthXSxnKTtvP3RoaXMuX2FkZGl0aXZlVmFsdWU9Xzp0W2hdPV99byYmdGhpcy5fYWRkVG9UYXJnZXQodCl9fX0sdC5wcm90b3R5cGUuX2FkZFRvVGFyZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmFsVHlwZSxuPXRoaXMucHJvcE5hbWUsaT10aGlzLl9hZGRpdGl2ZVZhbHVlOzA9PT1lP3Rbbl09dFtuXStpOjM9PT1lPyhxbih0W25dLEVpKSxEaShFaSxFaSxpLDEpLHRbbl09T2koRWkpKToxPT09ZT9EaSh0W25dLHRbbl0saSwxKToyPT09ZSYmQWkodFtuXSx0W25dLGksMSl9LHR9KCksVmk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLGkpe3RoaXMuX3RyYWNrcz17fSx0aGlzLl90cmFja0tleXM9W10sdGhpcy5fbWF4VGltZT0wLHRoaXMuX3N0YXJ0ZWQ9MCx0aGlzLl9jbGlwPW51bGwsdGhpcy5fdGFyZ2V0PXQsdGhpcy5fbG9vcD1lLGUmJmk/SSgiQ2FuJyB1c2UgYWRkaXRpdmUgYW5pbWF0aW9uIG9uIGxvb3BlZCBhbmltYXRpb24uIik6KHRoaXMuX2FkZGl0aXZlQW5pbWF0b3JzPWksdGhpcy5fYWxsb3dEaXNjcmV0ZT1uKX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0TWF4VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhUaW1lfSx0LnByb3RvdHlwZS5nZXREZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWxheX0sdC5wcm90b3R5cGUuZ2V0TG9vcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wfSx0LnByb3RvdHlwZS5nZXRUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGFyZ2V0fSx0LnByb3RvdHlwZS5jaGFuZ2VUYXJnZXQ9ZnVuY3Rpb24odCl7dGhpcy5fdGFyZ2V0PXR9LHQucHJvdG90eXBlLndoZW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLndoZW5XaXRoS2V5cyh0LGUsRyhlKSxuKX0sdC5wcm90b3R5cGUud2hlbldpdGhLZXlzPWZ1bmN0aW9uKHQsZSxuLGkpe2Zvcih2YXIgcj10aGlzLl90cmFja3Msbz0wO288bi5sZW5ndGg7bysrKXt2YXIgYT1uW29dLHM9clthXTtpZighcyl7cz1yW2FdPW5ldyB6aShhKTt2YXIgbD12b2lkIDAsdT10aGlzLl9nZXRBZGRpdGl2ZVRyYWNrKGEpO2lmKHUpe3ZhciBoPXUua2V5ZnJhbWVzLGM9aFtoLmxlbmd0aC0xXTtsPWMmJmMudmFsdWUsMz09PXUudmFsVHlwZSYmbCYmKGw9T2kobCkpfWVsc2UgbD10aGlzLl90YXJnZXRbYV07aWYobnVsbD09bCljb250aW51ZTt0PjAmJnMuYWRkS2V5ZnJhbWUoMCxQaShsKSxpKSx0aGlzLl90cmFja0tleXMucHVzaChhKX1zLmFkZEtleWZyYW1lKHQsUGkoZVthXSksaSl9cmV0dXJuIHRoaXMuX21heFRpbWU9TWF0aC5tYXgodGhpcy5fbWF4VGltZSx0KSx0aGlzfSx0LnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX2NsaXAucGF1c2UoKSx0aGlzLl9wYXVzZWQ9ITB9LHQucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3RoaXMuX2NsaXAucmVzdW1lKCksdGhpcy5fcGF1c2VkPSExfSx0LnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcGF1c2VkfSx0LnByb3RvdHlwZS5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWF4VGltZT10LHRoaXMuX2ZvcmNlPSEwLHRoaXN9LHQucHJvdG90eXBlLl9kb25lQ2FsbGJhY2s9ZnVuY3Rpb24oKXt0aGlzLl9zZXRUcmFja3NGaW5pc2hlZCgpLHRoaXMuX2NsaXA9bnVsbDt2YXIgdD10aGlzLl9kb25lQ2JzO2lmKHQpZm9yKHZhciBlPXQubGVuZ3RoLG49MDtuPGU7bisrKXRbbl0uY2FsbCh0aGlzKX0sdC5wcm90b3R5cGUuX2Fib3J0ZWRDYWxsYmFjaz1mdW5jdGlvbigpe3RoaXMuX3NldFRyYWNrc0ZpbmlzaGVkKCk7dmFyIHQ9dGhpcy5hbmltYXRpb24sZT10aGlzLl9hYm9ydGVkQ2JzO2lmKHQmJnQucmVtb3ZlQ2xpcCh0aGlzLl9jbGlwKSx0aGlzLl9jbGlwPW51bGwsZSlmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyllW25dLmNhbGwodGhpcyl9LHQucHJvdG90eXBlLl9zZXRUcmFja3NGaW5pc2hlZD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl90cmFja3MsZT10aGlzLl90cmFja0tleXMsbj0wO248ZS5sZW5ndGg7bisrKXRbZVtuXV0uc2V0RmluaXNoZWQoKX0sdC5wcm90b3R5cGUuX2dldEFkZGl0aXZlVHJhY2s9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLl9hZGRpdGl2ZUFuaW1hdG9ycztpZihuKWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldLmdldFRyYWNrKHQpO3ImJihlPXIpfXJldHVybiBlfSx0LnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbih0KXtpZighKHRoaXMuX3N0YXJ0ZWQ+MCkpe3RoaXMuX3N0YXJ0ZWQ9MTtmb3IodmFyIGU9dGhpcyxuPVtdLGk9dGhpcy5fbWF4VGltZXx8MCxyPTA7cjx0aGlzLl90cmFja0tleXMubGVuZ3RoO3IrKyl7dmFyIG89dGhpcy5fdHJhY2tLZXlzW3JdLGE9dGhpcy5fdHJhY2tzW29dLHM9dGhpcy5fZ2V0QWRkaXRpdmVUcmFjayhvKSxsPWEua2V5ZnJhbWVzLHU9bC5sZW5ndGg7aWYoYS5wcmVwYXJlKGkscyksYS5uZWVkc0FuaW1hdGUoKSlpZighdGhpcy5fYWxsb3dEaXNjcmV0ZSYmYS5kaXNjcmV0ZSl7dmFyIGg9bFt1LTFdO2gmJihlLl90YXJnZXRbYS5wcm9wTmFtZV09aC5yYXdWYWx1ZSksYS5zZXRGaW5pc2hlZCgpfWVsc2Ugbi5wdXNoKGEpfWlmKG4ubGVuZ3RofHx0aGlzLl9mb3JjZSl7dmFyIGM9bmV3IE9uKHtsaWZlOmksbG9vcDp0aGlzLl9sb29wLGRlbGF5OnRoaXMuX2RlbGF5fHwwLG9uZnJhbWU6ZnVuY3Rpb24odCl7ZS5fc3RhcnRlZD0yO3ZhciBpPWUuX2FkZGl0aXZlQW5pbWF0b3JzO2lmKGkpe2Zvcih2YXIgcj0hMSxvPTA7bzxpLmxlbmd0aDtvKyspaWYoaVtvXS5fY2xpcCl7cj0hMDticmVha31yfHwoZS5fYWRkaXRpdmVBbmltYXRvcnM9bnVsbCl9Zm9yKG89MDtvPG4ubGVuZ3RoO28rKyluW29dLnN0ZXAoZS5fdGFyZ2V0LHQpO3ZhciBhPWUuX29uZnJhbWVDYnM7aWYoYSlmb3Iobz0wO288YS5sZW5ndGg7bysrKWFbb10oZS5fdGFyZ2V0LHQpfSxvbmRlc3Ryb3k6ZnVuY3Rpb24oKXtlLl9kb25lQ2FsbGJhY2soKX19KTt0aGlzLl9jbGlwPWMsdGhpcy5hbmltYXRpb24mJnRoaXMuYW5pbWF0aW9uLmFkZENsaXAoYyksdCYmYy5zZXRFYXNpbmcodCl9ZWxzZSB0aGlzLl9kb25lQ2FsbGJhY2soKTtyZXR1cm4gdGhpc319LHQucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24odCl7aWYodGhpcy5fY2xpcCl7dmFyIGU9dGhpcy5fY2xpcDt0JiZlLm9uZnJhbWUoMSksdGhpcy5fYWJvcnRlZENhbGxiYWNrKCl9fSx0LnByb3RvdHlwZS5kZWxheT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVsYXk9dCx0aGlzfSx0LnByb3RvdHlwZS5kdXJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0aGlzLl9vbmZyYW1lQ2JzfHwodGhpcy5fb25mcmFtZUNicz1bXSksdGhpcy5fb25mcmFtZUNicy5wdXNoKHQpKSx0aGlzfSx0LnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYodGhpcy5fZG9uZUNic3x8KHRoaXMuX2RvbmVDYnM9W10pLHRoaXMuX2RvbmVDYnMucHVzaCh0KSksdGhpc30sdC5wcm90b3R5cGUuYWJvcnRlZD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmKHRoaXMuX2Fib3J0ZWRDYnN8fCh0aGlzLl9hYm9ydGVkQ2JzPVtdKSx0aGlzLl9hYm9ydGVkQ2JzLnB1c2godCkpLHRoaXN9LHQucHJvdG90eXBlLmdldENsaXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcH0sdC5wcm90b3R5cGUuZ2V0VHJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RyYWNrc1t0XX0sdC5wcm90b3R5cGUuZ2V0VHJhY2tzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4geih0aGlzLl90cmFja0tleXMsKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll90cmFja3NbZV19KSl9LHQucHJvdG90eXBlLnN0b3BUcmFja3M9ZnVuY3Rpb24odCxlKXtpZighdC5sZW5ndGh8fCF0aGlzLl9jbGlwKXJldHVybiEwO2Zvcih2YXIgbj10aGlzLl90cmFja3MsaT10aGlzLl90cmFja0tleXMscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbz1uW3Rbcl1dO28mJiFvLmlzRmluaXNoZWQoKSYmKGU/by5zdGVwKHRoaXMuX3RhcmdldCwxKToxPT09dGhpcy5fc3RhcnRlZCYmby5zdGVwKHRoaXMuX3RhcmdldCwwKSxvLnNldEZpbmlzaGVkKCkpfXZhciBhPSEwO2ZvcihyPTA7cjxpLmxlbmd0aDtyKyspaWYoIW5baVtyXV0uaXNGaW5pc2hlZCgpKXthPSExO2JyZWFrfXJldHVybiBhJiZ0aGlzLl9hYm9ydGVkQ2FsbGJhY2soKSxhfSx0LnByb3RvdHlwZS5zYXZlVG89ZnVuY3Rpb24odCxlLG4pe2lmKHQpe2U9ZXx8dGhpcy5fdHJhY2tLZXlzO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgcj1lW2ldLG89dGhpcy5fdHJhY2tzW3JdO2lmKG8mJiFvLmlzRmluaXNoZWQoKSl7dmFyIGE9by5rZXlmcmFtZXMscz1hW24/MDphLmxlbmd0aC0xXTtzJiYodFtyXT1QaShzLnJhd1ZhbHVlKSl9fX19LHQucHJvdG90eXBlLl9fY2hhbmdlRmluYWxWYWx1ZT1mdW5jdGlvbih0LGUpe2U9ZXx8Ryh0KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9ZVtuXSxyPXRoaXMuX3RyYWNrc1tpXTtpZihyKXt2YXIgbz1yLmtleWZyYW1lcztpZihvLmxlbmd0aD4xKXt2YXIgYT1vLnBvcCgpO3IuYWRkS2V5ZnJhbWUoYS50aW1lLHRbaV0pLHIucHJlcGFyZSh0aGlzLl9tYXhUaW1lLHIuZ2V0QWRkaXRpdmVUcmFjaygpKX19fX0sdH0oKTtmdW5jdGlvbiBCaSgpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfXZhciBGaSxHaSxXaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5fcnVubmluZz0hMSxuLl90aW1lPTAsbi5fcGF1c2VkVGltZT0wLG4uX3BhdXNlU3RhcnQ9MCxuLl9wYXVzZWQ9ITEsZT1lfHx7fSxuLnN0YWdlPWUuc3RhZ2V8fHt9LG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5hZGRDbGlwPWZ1bmN0aW9uKHQpe3QuYW5pbWF0aW9uJiZ0aGlzLnJlbW92ZUNsaXAodCksdGhpcy5faGVhZD8odGhpcy5fdGFpbC5uZXh0PXQsdC5wcmV2PXRoaXMuX3RhaWwsdC5uZXh0PW51bGwsdGhpcy5fdGFpbD10KTp0aGlzLl9oZWFkPXRoaXMuX3RhaWw9dCx0LmFuaW1hdGlvbj10aGlzfSxlLnByb3RvdHlwZS5hZGRBbmltYXRvcj1mdW5jdGlvbih0KXt0LmFuaW1hdGlvbj10aGlzO3ZhciBlPXQuZ2V0Q2xpcCgpO2UmJnRoaXMuYWRkQ2xpcChlKX0sZS5wcm90b3R5cGUucmVtb3ZlQ2xpcD1mdW5jdGlvbih0KXtpZih0LmFuaW1hdGlvbil7dmFyIGU9dC5wcmV2LG49dC5uZXh0O2U/ZS5uZXh0PW46dGhpcy5faGVhZD1uLG4/bi5wcmV2PWU6dGhpcy5fdGFpbD1lLHQubmV4dD10LnByZXY9dC5hbmltYXRpb249bnVsbH19LGUucHJvdG90eXBlLnJlbW92ZUFuaW1hdG9yPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Q2xpcCgpO2UmJnRoaXMucmVtb3ZlQ2xpcChlKSx0LmFuaW1hdGlvbj1udWxsfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPUJpKCktdGhpcy5fcGF1c2VkVGltZSxuPWUtdGhpcy5fdGltZSxpPXRoaXMuX2hlYWQ7aTspe3ZhciByPWkubmV4dDtpLnN0ZXAoZSxuKT8oaS5vbmRlc3Ryb3koKSx0aGlzLnJlbW92ZUNsaXAoaSksaT1yKTppPXJ9dGhpcy5fdGltZT1lLHR8fCh0aGlzLnRyaWdnZXIoImZyYW1lIixuKSx0aGlzLnN0YWdlLnVwZGF0ZSYmdGhpcy5zdGFnZS51cGRhdGUoKSl9LGUucHJvdG90eXBlLl9zdGFydExvb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3J1bm5pbmc9ITAsb24oKGZ1bmN0aW9uIGUoKXt0Ll9ydW5uaW5nJiYob24oZSksIXQuX3BhdXNlZCYmdC51cGRhdGUoKSl9KSl9LGUucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5fcnVubmluZ3x8KHRoaXMuX3RpbWU9QmkoKSx0aGlzLl9wYXVzZWRUaW1lPTAsdGhpcy5fc3RhcnRMb29wKCkpfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fcnVubmluZz0hMX0sZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWR8fCh0aGlzLl9wYXVzZVN0YXJ0PUJpKCksdGhpcy5fcGF1c2VkPSEwKX0sZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkJiYodGhpcy5fcGF1c2VkVGltZSs9QmkoKS10aGlzLl9wYXVzZVN0YXJ0LHRoaXMuX3BhdXNlZD0hMSl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2hlYWQ7dDspe3ZhciBlPXQubmV4dDt0LnByZXY9dC5uZXh0PXQuYW5pbWF0aW9uPW51bGwsdD1lfXRoaXMuX2hlYWQ9dGhpcy5fdGFpbD1udWxsfSxlLnByb3RvdHlwZS5pc0ZpbmlzaGVkPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMuX2hlYWR9LGUucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCxlKXtlPWV8fHt9LHRoaXMuc3RhcnQoKTt2YXIgbj1uZXcgVmkodCxlLmxvb3ApO3JldHVybiB0aGlzLmFkZEFuaW1hdG9yKG4pLG59LGV9KGp0KSxIaT1yLmRvbVN1cHBvcnRlZCxZaT0oR2k9e3BvaW50ZXJkb3duOjEscG9pbnRlcnVwOjEscG9pbnRlcm1vdmU6MSxwb2ludGVyb3V0OjF9LHttb3VzZTpGaT1bImNsaWNrIiwiZGJsY2xpY2siLCJtb3VzZXdoZWVsIiwid2hlZWwiLCJtb3VzZW91dCIsIm1vdXNldXAiLCJtb3VzZWRvd24iLCJtb3VzZW1vdmUiLCJjb250ZXh0bWVudSJdLHRvdWNoOlsidG91Y2hzdGFydCIsInRvdWNoZW5kIiwidG91Y2htb3ZlIl0scG9pbnRlcjp6KEZpLChmdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoIm1vdXNlIiwicG9pbnRlciIpO3JldHVybiBHaS5oYXNPd25Qcm9wZXJ0eShlKT9lOnR9KSl9KSxYaT1bIm1vdXNlbW92ZSIsIm1vdXNldXAiXSxVaT1bInBvaW50ZXJtb3ZlIiwicG9pbnRlcnVwIl0sWmk9ITE7ZnVuY3Rpb24gamkodCl7dmFyIGU9dC5wb2ludGVyVHlwZTtyZXR1cm4icGVuIj09PWV8fCJ0b3VjaCI9PT1lfWZ1bmN0aW9uIHFpKHQpe3QmJih0LnpyQnlUb3VjaD0hMCl9ZnVuY3Rpb24gS2kodCxlKXtmb3IodmFyIG49ZSxpPSExO24mJjkhPT1uLm5vZGVUeXBlJiYhKGk9bi5kb21CZWxvbmdUb1pyfHxuIT09ZSYmbj09PXQucGFpbnRlclJvb3QpOyluPW4ucGFyZW50Tm9kZTtyZXR1cm4gaX12YXIgJGk9ZnVuY3Rpb24odCxlKXt0aGlzLnN0b3BQcm9wYWdhdGlvbj1idCx0aGlzLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbj1idCx0aGlzLnByZXZlbnREZWZhdWx0PWJ0LHRoaXMudHlwZT1lLnR5cGUsdGhpcy50YXJnZXQ9dGhpcy5jdXJyZW50VGFyZ2V0PXQuZG9tLHRoaXMucG9pbnRlclR5cGU9ZS5wb2ludGVyVHlwZSx0aGlzLmNsaWVudFg9ZS5jbGllbnRYLHRoaXMuY2xpZW50WT1lLmNsaWVudFl9LEppPXttb3VzZWRvd246ZnVuY3Rpb24odCl7dD1jZSh0aGlzLmRvbSx0KSx0aGlzLl9fbWF5UG9pbnRlckNhcHR1cmU9W3QuenJYLHQuenJZXSx0aGlzLnRyaWdnZXIoIm1vdXNlZG93biIsdCl9LG1vdXNlbW92ZTpmdW5jdGlvbih0KXt0PWNlKHRoaXMuZG9tLHQpO3ZhciBlPXRoaXMuX19tYXlQb2ludGVyQ2FwdHVyZTshZXx8dC56clg9PT1lWzBdJiZ0LnpyWT09PWVbMV18fHRoaXMuX190b2dnbGVQb2ludGVyQ2FwdHVyZSghMCksdGhpcy50cmlnZ2VyKCJtb3VzZW1vdmUiLHQpfSxtb3VzZXVwOmZ1bmN0aW9uKHQpe3Q9Y2UodGhpcy5kb20sdCksdGhpcy5fX3RvZ2dsZVBvaW50ZXJDYXB0dXJlKCExKSx0aGlzLnRyaWdnZXIoIm1vdXNldXAiLHQpfSxtb3VzZW91dDpmdW5jdGlvbih0KXtLaSh0aGlzLCh0PWNlKHRoaXMuZG9tLHQpKS50b0VsZW1lbnR8fHQucmVsYXRlZFRhcmdldCl8fCh0aGlzLl9fcG9pbnRlckNhcHR1cmluZyYmKHQuenJFdmVudENvbnRyb2w9Im5vX2dsb2JhbG91dCIpLHRoaXMudHJpZ2dlcigibW91c2VvdXQiLHQpKX0sd2hlZWw6ZnVuY3Rpb24odCl7Wmk9ITAsdD1jZSh0aGlzLmRvbSx0KSx0aGlzLnRyaWdnZXIoIm1vdXNld2hlZWwiLHQpfSxtb3VzZXdoZWVsOmZ1bmN0aW9uKHQpe1ppfHwodD1jZSh0aGlzLmRvbSx0KSx0aGlzLnRyaWdnZXIoIm1vdXNld2hlZWwiLHQpKX0sdG91Y2hzdGFydDpmdW5jdGlvbih0KXtxaSh0PWNlKHRoaXMuZG9tLHQpKSx0aGlzLl9fbGFzdFRvdWNoTW9tZW50PW5ldyBEYXRlLHRoaXMuaGFuZGxlci5wcm9jZXNzR2VzdHVyZSh0LCJzdGFydCIpLEppLm1vdXNlbW92ZS5jYWxsKHRoaXMsdCksSmkubW91c2Vkb3duLmNhbGwodGhpcyx0KX0sdG91Y2htb3ZlOmZ1bmN0aW9uKHQpe3FpKHQ9Y2UodGhpcy5kb20sdCkpLHRoaXMuaGFuZGxlci5wcm9jZXNzR2VzdHVyZSh0LCJjaGFuZ2UiKSxKaS5tb3VzZW1vdmUuY2FsbCh0aGlzLHQpfSx0b3VjaGVuZDpmdW5jdGlvbih0KXtxaSh0PWNlKHRoaXMuZG9tLHQpKSx0aGlzLmhhbmRsZXIucHJvY2Vzc0dlc3R1cmUodCwiZW5kIiksSmkubW91c2V1cC5jYWxsKHRoaXMsdCksK25ldyBEYXRlLSt0aGlzLl9fbGFzdFRvdWNoTW9tZW50PDMwMCYmSmkuY2xpY2suY2FsbCh0aGlzLHQpfSxwb2ludGVyZG93bjpmdW5jdGlvbih0KXtKaS5tb3VzZWRvd24uY2FsbCh0aGlzLHQpfSxwb2ludGVybW92ZTpmdW5jdGlvbih0KXtqaSh0KXx8SmkubW91c2Vtb3ZlLmNhbGwodGhpcyx0KX0scG9pbnRlcnVwOmZ1bmN0aW9uKHQpe0ppLm1vdXNldXAuY2FsbCh0aGlzLHQpfSxwb2ludGVyb3V0OmZ1bmN0aW9uKHQpe2ppKHQpfHxKaS5tb3VzZW91dC5jYWxsKHRoaXMsdCl9fTtFKFsiY2xpY2siLCJkYmxjbGljayIsImNvbnRleHRtZW51Il0sKGZ1bmN0aW9uKHQpe0ppW3RdPWZ1bmN0aW9uKGUpe2U9Y2UodGhpcy5kb20sZSksdGhpcy50cmlnZ2VyKHQsZSl9fSkpO3ZhciBRaT17cG9pbnRlcm1vdmU6ZnVuY3Rpb24odCl7amkodCl8fFFpLm1vdXNlbW92ZS5jYWxsKHRoaXMsdCl9LHBvaW50ZXJ1cDpmdW5jdGlvbih0KXtRaS5tb3VzZXVwLmNhbGwodGhpcyx0KX0sbW91c2Vtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMudHJpZ2dlcigibW91c2Vtb3ZlIix0KX0sbW91c2V1cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fcG9pbnRlckNhcHR1cmluZzt0aGlzLl9fdG9nZ2xlUG9pbnRlckNhcHR1cmUoITEpLHRoaXMudHJpZ2dlcigibW91c2V1cCIsdCksZSYmKHQuenJFdmVudENvbnRyb2w9Im9ubHlfZ2xvYmFsb3V0Iix0aGlzLnRyaWdnZXIoIm1vdXNlb3V0Iix0KSl9fTtmdW5jdGlvbiB0cih0LGUpe3ZhciBuPWUuZG9tSGFuZGxlcnM7ci5wb2ludGVyRXZlbnRzU3VwcG9ydGVkP0UoWWkucG9pbnRlciwoZnVuY3Rpb24oaSl7bnIoZSxpLChmdW5jdGlvbihlKXtuW2ldLmNhbGwodCxlKX0pKX0pKTooci50b3VjaEV2ZW50c1N1cHBvcnRlZCYmRShZaS50b3VjaCwoZnVuY3Rpb24oaSl7bnIoZSxpLChmdW5jdGlvbihyKXtuW2ldLmNhbGwodCxyKSxmdW5jdGlvbih0KXt0LnRvdWNoaW5nPSEwLG51bGwhPXQudG91Y2hUaW1lciYmKGNsZWFyVGltZW91dCh0LnRvdWNoVGltZXIpLHQudG91Y2hUaW1lcj1udWxsKSx0LnRvdWNoVGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LnRvdWNoaW5nPSExLHQudG91Y2hUaW1lcj1udWxsfSksNzAwKX0oZSl9KSl9KSksRShZaS5tb3VzZSwoZnVuY3Rpb24oaSl7bnIoZSxpLChmdW5jdGlvbihyKXtyPWhlKHIpLGUudG91Y2hpbmd8fG5baV0uY2FsbCh0LHIpfSkpfSkpKX1mdW5jdGlvbiBlcih0LGUpe2Z1bmN0aW9uIG4obil7bnIoZSxuLChmdW5jdGlvbihpKXtpPWhlKGkpLEtpKHQsaS50YXJnZXQpfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybiBjZSh0LmRvbSxuZXcgJGkodCxlKSwhMCl9KHQsaSksZS5kb21IYW5kbGVyc1tuXS5jYWxsKHQsaSkpfSkse2NhcHR1cmU6ITB9KX1yLnBvaW50ZXJFdmVudHNTdXBwb3J0ZWQ/RShVaSxuKTpyLnRvdWNoRXZlbnRzU3VwcG9ydGVkfHxFKFhpLG4pfWZ1bmN0aW9uIG5yKHQsZSxuLGkpe3QubW91bnRlZFtlXT1uLHQubGlzdGVuZXJPcHRzW2VdPWkscGUodC5kb21UYXJnZXQsZSxuLGkpfWZ1bmN0aW9uIGlyKHQpe3ZhciBlLG4saSxyLG89dC5tb3VudGVkO2Zvcih2YXIgYSBpbiBvKW8uaGFzT3duUHJvcGVydHkoYSkmJihlPXQuZG9tVGFyZ2V0LG49YSxpPW9bYV0scj10Lmxpc3RlbmVyT3B0c1thXSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIobixpLHIpKTt0Lm1vdW50ZWQ9e319dmFyIHJyPWZ1bmN0aW9uKHQsZSl7dGhpcy5tb3VudGVkPXt9LHRoaXMubGlzdGVuZXJPcHRzPXt9LHRoaXMudG91Y2hpbmc9ITEsdGhpcy5kb21UYXJnZXQ9dCx0aGlzLmRvbUhhbmRsZXJzPWV9LG9yPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuX19wb2ludGVyQ2FwdHVyaW5nPSExLGkuZG9tPWUsaS5wYWludGVyUm9vdD1uLGkuX2xvY2FsSGFuZGxlclNjb3BlPW5ldyBycihlLEppKSxIaSYmKGkuX2dsb2JhbEhhbmRsZXJTY29wZT1uZXcgcnIoZG9jdW1lbnQsUWkpKSx0cihpLGkuX2xvY2FsSGFuZGxlclNjb3BlKSxpfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2lyKHRoaXMuX2xvY2FsSGFuZGxlclNjb3BlKSxIaSYmaXIodGhpcy5fZ2xvYmFsSGFuZGxlclNjb3BlKX0sZS5wcm90b3R5cGUuc2V0Q3Vyc29yPWZ1bmN0aW9uKHQpe3RoaXMuZG9tLnN0eWxlJiYodGhpcy5kb20uc3R5bGUuY3Vyc29yPXR8fCJkZWZhdWx0Iil9LGUucHJvdG90eXBlLl9fdG9nZ2xlUG9pbnRlckNhcHR1cmU9ZnVuY3Rpb24odCl7aWYodGhpcy5fX21heVBvaW50ZXJDYXB0dXJlPW51bGwsSGkmJit0aGlzLl9fcG9pbnRlckNhcHR1cmluZ14rdCl7dGhpcy5fX3BvaW50ZXJDYXB0dXJpbmc9dDt2YXIgZT10aGlzLl9nbG9iYWxIYW5kbGVyU2NvcGU7dD9lcih0aGlzLGUpOmlyKGUpfX0sZX0oanQpLGFyPTE7ci5oYXNHbG9iYWxXaW5kb3cmJihhcj1NYXRoLm1heCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8d2luZG93LnNjcmVlbiYmd2luZG93LnNjcmVlbi5kZXZpY2VYRFBJL3dpbmRvdy5zY3JlZW4ubG9naWNhbFhEUEl8fDEsMSkpO3ZhciBzcj1hcixscj0iIzMzMyIsdXI9IiNjY2MiLGhyPXhlLGNyPTVlLTU7ZnVuY3Rpb24gcHIodCl7cmV0dXJuIHQ+Y3J8fHQ8LTVlLTV9dmFyIGRyPVtdLGZyPVtdLGdyPVsxLDAsMCwxLDAsMF0seXI9TWF0aC5hYnMsdnI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5nZXRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbihlKXtyZXR1cm4gdC5nZXRMb2NhbFRyYW5zZm9ybSh0aGlzLGUpfSx0LnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbih0KXt0aGlzLng9dFswXSx0aGlzLnk9dFsxXX0sdC5wcm90b3R5cGUuc2V0U2NhbGU9ZnVuY3Rpb24odCl7dGhpcy5zY2FsZVg9dFswXSx0aGlzLnNjYWxlWT10WzFdfSx0LnByb3RvdHlwZS5zZXRTa2V3PWZ1bmN0aW9uKHQpe3RoaXMuc2tld1g9dFswXSx0aGlzLnNrZXdZPXRbMV19LHQucHJvdG90eXBlLnNldE9yaWdpbj1mdW5jdGlvbih0KXt0aGlzLm9yaWdpblg9dFswXSx0aGlzLm9yaWdpblk9dFsxXX0sdC5wcm90b3R5cGUubmVlZExvY2FsVHJhbnNmb3JtPWZ1bmN0aW9uKCl7cmV0dXJuIHByKHRoaXMucm90YXRpb24pfHxwcih0aGlzLngpfHxwcih0aGlzLnkpfHxwcih0aGlzLnNjYWxlWC0xKXx8cHIodGhpcy5zY2FsZVktMSl8fHByKHRoaXMuc2tld1gpfHxwcih0aGlzLnNrZXdZKX0sdC5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnRyYW5zZm9ybSxlPXRoaXMubmVlZExvY2FsVHJhbnNmb3JtKCksbj10aGlzLnRyYW5zZm9ybTtlfHx0PyhuPW58fFsxLDAsMCwxLDAsMF0sZT90aGlzLmdldExvY2FsVHJhbnNmb3JtKG4pOmhyKG4pLHQmJihlP2JlKG4sdCxuKTpfZShuLHQpKSx0aGlzLnRyYW5zZm9ybT1uLHRoaXMuX3Jlc29sdmVHbG9iYWxTY2FsZVJhdGlvKG4pKTpuJiYoaHIobiksdGhpcy5pbnZUcmFuc2Zvcm09bnVsbCl9LHQucHJvdG90eXBlLl9yZXNvbHZlR2xvYmFsU2NhbGVSYXRpbz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdsb2JhbFNjYWxlUmF0aW87aWYobnVsbCE9ZSYmMSE9PWUpe3RoaXMuZ2V0R2xvYmFsU2NhbGUoZHIpO3ZhciBuPWRyWzBdPDA/LTE6MSxpPWRyWzFdPDA/LTE6MSxyPSgoZHJbMF0tbikqZStuKS9kclswXXx8MCxvPSgoZHJbMV0taSkqZStpKS9kclsxXXx8MDt0WzBdKj1yLHRbMV0qPXIsdFsyXSo9byx0WzNdKj1vfXRoaXMuaW52VHJhbnNmb3JtPXRoaXMuaW52VHJhbnNmb3JtfHxbMSwwLDAsMSwwLDBdLEllKHRoaXMuaW52VHJhbnNmb3JtLHQpfSx0LnByb3RvdHlwZS5nZXRDb21wdXRlZFRyYW5zZm9ybT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9W107dDspZS5wdXNoKHQpLHQ9dC5wYXJlbnQ7Zm9yKDt0PWUucG9wKCk7KXQudXBkYXRlVHJhbnNmb3JtKCk7cmV0dXJuIHRoaXMudHJhbnNmb3JtfSx0LnByb3RvdHlwZS5zZXRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT10WzBdKnRbMF0rdFsxXSp0WzFdLG49dFsyXSp0WzJdK3RbM10qdFszXSxpPU1hdGguYXRhbjIodFsxXSx0WzBdKSxyPU1hdGguUEkvMitpLU1hdGguYXRhbjIodFszXSx0WzJdKTtuPU1hdGguc3FydChuKSpNYXRoLmNvcyhyKSxlPU1hdGguc3FydChlKSx0aGlzLnNrZXdYPXIsdGhpcy5za2V3WT0wLHRoaXMucm90YXRpb249LWksdGhpcy54PSt0WzRdLHRoaXMueT0rdFs1XSx0aGlzLnNjYWxlWD1lLHRoaXMuc2NhbGVZPW4sdGhpcy5vcmlnaW5YPTAsdGhpcy5vcmlnaW5ZPTB9fSx0LnByb3RvdHlwZS5kZWNvbXBvc2VUcmFuc2Zvcm09ZnVuY3Rpb24oKXtpZih0aGlzLnRyYW5zZm9ybSl7dmFyIHQ9dGhpcy5wYXJlbnQsZT10aGlzLnRyYW5zZm9ybTt0JiZ0LnRyYW5zZm9ybSYmKHQuaW52VHJhbnNmb3JtPXQuaW52VHJhbnNmb3JtfHxbMSwwLDAsMSwwLDBdLGJlKGZyLHQuaW52VHJhbnNmb3JtLGUpLGU9ZnIpO3ZhciBuPXRoaXMub3JpZ2luWCxpPXRoaXMub3JpZ2luWTsobnx8aSkmJihncls0XT1uLGdyWzVdPWksYmUoZnIsZSxnciksZnJbNF0tPW4sZnJbNV0tPWksZT1mciksdGhpcy5zZXRMb2NhbFRyYW5zZm9ybShlKX19LHQucHJvdG90eXBlLmdldEdsb2JhbFNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudHJhbnNmb3JtO3JldHVybiB0PXR8fFtdLGU/KHRbMF09TWF0aC5zcXJ0KGVbMF0qZVswXStlWzFdKmVbMV0pLHRbMV09TWF0aC5zcXJ0KGVbMl0qZVsyXStlWzNdKmVbM10pLGVbMF08MCYmKHRbMF09LXRbMF0pLGVbM108MCYmKHRbMV09LXRbMV0pLHQpOih0WzBdPTEsdFsxXT0xLHQpfSx0LnByb3RvdHlwZS50cmFuc2Zvcm1Db29yZFRvTG9jYWw9ZnVuY3Rpb24odCxlKXt2YXIgbj1bdCxlXSxpPXRoaXMuaW52VHJhbnNmb3JtO3JldHVybiBpJiZXdChuLG4saSksbn0sdC5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRUb0dsb2JhbD1mdW5jdGlvbih0LGUpe3ZhciBuPVt0LGVdLGk9dGhpcy50cmFuc2Zvcm07cmV0dXJuIGkmJld0KG4sbixpKSxufSx0LnByb3RvdHlwZS5nZXRMaW5lU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRyYW5zZm9ybTtyZXR1cm4gdCYmeXIodFswXS0xKT4xZS0xMCYmeXIodFszXS0xKT4xZS0xMD9NYXRoLnNxcnQoeXIodFswXSp0WzNdLXRbMl0qdFsxXSkpOjF9LHQucHJvdG90eXBlLmNvcHlUcmFuc2Zvcm09ZnVuY3Rpb24odCl7eHIodGhpcyx0KX0sdC5nZXRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbih0LGUpe2U9ZXx8W107dmFyIG49dC5vcmlnaW5YfHwwLGk9dC5vcmlnaW5ZfHwwLHI9dC5zY2FsZVgsbz10LnNjYWxlWSxhPXQuYW5jaG9yWCxzPXQuYW5jaG9yWSxsPXQucm90YXRpb258fDAsdT10LngsaD10LnksYz10LnNrZXdYP01hdGgudGFuKHQuc2tld1gpOjAscD10LnNrZXdZP01hdGgudGFuKC10LnNrZXdZKTowO2lmKG58fGl8fGF8fHMpe3ZhciBkPW4rYSxmPWkrcztlWzRdPS1kKnItYypmKm8sZVs1XT0tZipvLXAqZCpyfWVsc2UgZVs0XT1lWzVdPTA7cmV0dXJuIGVbMF09cixlWzNdPW8sZVsxXT1wKnIsZVsyXT1jKm8sbCYmU2UoZSxlLGwpLGVbNF0rPW4rdSxlWzVdKz1pK2gsZX0sdC5pbml0RGVmYXVsdFByb3BzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGU7ZS5zY2FsZVg9ZS5zY2FsZVk9ZS5nbG9iYWxTY2FsZVJhdGlvPTEsZS54PWUueT1lLm9yaWdpblg9ZS5vcmlnaW5ZPWUuc2tld1g9ZS5za2V3WT1lLnJvdGF0aW9uPWUuYW5jaG9yWD1lLmFuY2hvclk9MH0oKSx0fSgpLG1yPVsieCIsInkiLCJvcmlnaW5YIiwib3JpZ2luWSIsImFuY2hvclgiLCJhbmNob3JZIiwicm90YXRpb24iLCJzY2FsZVgiLCJzY2FsZVkiLCJza2V3WCIsInNrZXdZIl07ZnVuY3Rpb24geHIodCxlKXtmb3IodmFyIG49MDtuPG1yLmxlbmd0aDtuKyspe3ZhciBpPW1yW25dO3RbaV09ZVtpXX19dmFyIF9yPXt9O2Z1bmN0aW9uIGJyKHQsZSl7dmFyIG49X3JbZT1lfHxhXTtufHwobj1fcltlXT1uZXcgRW4oNTAwKSk7dmFyIGk9bi5nZXQodCk7cmV0dXJuIG51bGw9PWkmJihpPWgubWVhc3VyZVRleHQodCxlKS53aWR0aCxuLnB1dCh0LGkpKSxpfWZ1bmN0aW9uIHdyKHQsZSxuLGkpe3ZhciByPWJyKHQsZSksbz1UcihlKSxhPU1yKDAscixuKSxzPUlyKDAsbyxpKTtyZXR1cm4gbmV3IHplKGEscyxyLG8pfWZ1bmN0aW9uIFNyKHQsZSxuLGkpe3ZhciByPSgodHx8IiIpKyIiKS5zcGxpdCgiXG4iKTtpZigxPT09ci5sZW5ndGgpcmV0dXJuIHdyKHJbMF0sZSxuLGkpO2Zvcih2YXIgbz1uZXcgemUoMCwwLDAsMCksYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgcz13cihyW2FdLGUsbixpKTswPT09YT9vLmNvcHkocyk6by51bmlvbihzKX1yZXR1cm4gb31mdW5jdGlvbiBNcih0LGUsbil7cmV0dXJuInJpZ2h0Ij09PW4/dC09ZToiY2VudGVyIj09PW4mJih0LT1lLzIpLHR9ZnVuY3Rpb24gSXIodCxlLG4pe3JldHVybiJtaWRkbGUiPT09bj90LT1lLzI6ImJvdHRvbSI9PT1uJiYodC09ZSksdH1mdW5jdGlvbiBUcih0KXtyZXR1cm4gYnIoIuWbvSIsdCl9ZnVuY3Rpb24gQ3IodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/dC5sYXN0SW5kZXhPZigiJSIpPj0wP3BhcnNlRmxvYXQodCkvMTAwKmU6cGFyc2VGbG9hdCh0KTp0fWZ1bmN0aW9uIERyKHQsZSxuKXt2YXIgaT1lLnBvc2l0aW9ufHwiaW5zaWRlIixyPW51bGwhPWUuZGlzdGFuY2U/ZS5kaXN0YW5jZTo1LG89bi5oZWlnaHQsYT1uLndpZHRoLHM9by8yLGw9bi54LHU9bi55LGg9ImxlZnQiLGM9InRvcCI7aWYoaSBpbnN0YW5jZW9mIEFycmF5KWwrPUNyKGlbMF0sbi53aWR0aCksdSs9Q3IoaVsxXSxuLmhlaWdodCksaD1udWxsLGM9bnVsbDtlbHNlIHN3aXRjaChpKXtjYXNlImxlZnQiOmwtPXIsdSs9cyxoPSJyaWdodCIsYz0ibWlkZGxlIjticmVhaztjYXNlInJpZ2h0IjpsKz1yK2EsdSs9cyxjPSJtaWRkbGUiO2JyZWFrO2Nhc2UidG9wIjpsKz1hLzIsdS09cixoPSJjZW50ZXIiLGM9ImJvdHRvbSI7YnJlYWs7Y2FzZSJib3R0b20iOmwrPWEvMix1Kz1vK3IsaD0iY2VudGVyIjticmVhaztjYXNlImluc2lkZSI6bCs9YS8yLHUrPXMsaD0iY2VudGVyIixjPSJtaWRkbGUiO2JyZWFrO2Nhc2UiaW5zaWRlTGVmdCI6bCs9cix1Kz1zLGM9Im1pZGRsZSI7YnJlYWs7Y2FzZSJpbnNpZGVSaWdodCI6bCs9YS1yLHUrPXMsaD0icmlnaHQiLGM9Im1pZGRsZSI7YnJlYWs7Y2FzZSJpbnNpZGVUb3AiOmwrPWEvMix1Kz1yLGg9ImNlbnRlciI7YnJlYWs7Y2FzZSJpbnNpZGVCb3R0b20iOmwrPWEvMix1Kz1vLXIsaD0iY2VudGVyIixjPSJib3R0b20iO2JyZWFrO2Nhc2UiaW5zaWRlVG9wTGVmdCI6bCs9cix1Kz1yO2JyZWFrO2Nhc2UiaW5zaWRlVG9wUmlnaHQiOmwrPWEtcix1Kz1yLGg9InJpZ2h0IjticmVhaztjYXNlImluc2lkZUJvdHRvbUxlZnQiOmwrPXIsdSs9by1yLGM9ImJvdHRvbSI7YnJlYWs7Y2FzZSJpbnNpZGVCb3R0b21SaWdodCI6bCs9YS1yLHUrPW8tcixoPSJyaWdodCIsYz0iYm90dG9tIn1yZXR1cm4odD10fHx7fSkueD1sLHQueT11LHQuYWxpZ249aCx0LnZlcnRpY2FsQWxpZ249Yyx0fXZhciBBcj0iX196cl9ub3JtYWxfXyIsa3I9bXIuY29uY2F0KFsiaWdub3JlIl0pLExyPVYobXIsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV09ITAsdH0pLHtpZ25vcmU6ITF9KSxQcj17fSxPcj1uZXcgemUoMCwwLDAsMCksUnI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuaWQ9TSgpLHRoaXMuYW5pbWF0b3JzPVtdLHRoaXMuY3VycmVudFN0YXRlcz1bXSx0aGlzLnN0YXRlcz17fSx0aGlzLl9pbml0KHQpfXJldHVybiB0LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt0aGlzLmF0dHIodCl9LHQucHJvdG90eXBlLmRyaWZ0PWZ1bmN0aW9uKHQsZSxuKXtzd2l0Y2godGhpcy5kcmFnZ2FibGUpe2Nhc2UiaG9yaXpvbnRhbCI6ZT0wO2JyZWFrO2Nhc2UidmVydGljYWwiOnQ9MH12YXIgaT10aGlzLnRyYW5zZm9ybTtpfHwoaT10aGlzLnRyYW5zZm9ybT1bMSwwLDAsMSwwLDBdKSxpWzRdKz10LGlbNV0rPWUsdGhpcy5kZWNvbXBvc2VUcmFuc2Zvcm0oKSx0aGlzLm1hcmtSZWRyYXcoKX0sdC5wcm90b3R5cGUuYmVmb3JlVXBkYXRlPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5hZnRlclVwZGF0ZT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVUcmFuc2Zvcm0oKSx0aGlzLl9fZGlydHkmJnRoaXMudXBkYXRlSW5uZXJUZXh0KCl9LHQucHJvdG90eXBlLnVwZGF0ZUlubmVyVGV4dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90ZXh0Q29udGVudDtpZihlJiYoIWUuaWdub3JlfHx0KSl7dGhpcy50ZXh0Q29uZmlnfHwodGhpcy50ZXh0Q29uZmlnPXt9KTt2YXIgbj10aGlzLnRleHRDb25maWcsaT1uLmxvY2FsLHI9ZS5pbm5lclRyYW5zZm9ybWFibGUsbz12b2lkIDAsYT12b2lkIDAscz0hMTtyLnBhcmVudD1pP3RoaXM6bnVsbDt2YXIgbD0hMTtpZihyLmNvcHlUcmFuc2Zvcm0oZSksbnVsbCE9bi5wb3NpdGlvbil7dmFyIHU9T3I7bi5sYXlvdXRSZWN0P3UuY29weShuLmxheW91dFJlY3QpOnUuY29weSh0aGlzLmdldEJvdW5kaW5nUmVjdCgpKSxpfHx1LmFwcGx5VHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtKSx0aGlzLmNhbGN1bGF0ZVRleHRQb3NpdGlvbj90aGlzLmNhbGN1bGF0ZVRleHRQb3NpdGlvbihQcixuLHUpOkRyKFByLG4sdSksci54PVByLngsci55PVByLnksbz1Qci5hbGlnbixhPVByLnZlcnRpY2FsQWxpZ247dmFyIGg9bi5vcmlnaW47aWYoaCYmbnVsbCE9bi5yb3RhdGlvbil7dmFyIGM9dm9pZCAwLHA9dm9pZCAwOyJjZW50ZXIiPT09aD8oYz0uNSp1LndpZHRoLHA9LjUqdS5oZWlnaHQpOihjPUNyKGhbMF0sdS53aWR0aCkscD1DcihoWzFdLHUuaGVpZ2h0KSksbD0hMCxyLm9yaWdpblg9LXIueCtjKyhpPzA6dS54KSxyLm9yaWdpblk9LXIueStwKyhpPzA6dS55KX19bnVsbCE9bi5yb3RhdGlvbiYmKHIucm90YXRpb249bi5yb3RhdGlvbik7dmFyIGQ9bi5vZmZzZXQ7ZCYmKHIueCs9ZFswXSxyLnkrPWRbMV0sbHx8KHIub3JpZ2luWD0tZFswXSxyLm9yaWdpblk9LWRbMV0pKTt2YXIgZj1udWxsPT1uLmluc2lkZT8ic3RyaW5nIj09dHlwZW9mIG4ucG9zaXRpb24mJm4ucG9zaXRpb24uaW5kZXhPZigiaW5zaWRlIik+PTA6bi5pbnNpZGUsZz10aGlzLl9pbm5lclRleHREZWZhdWx0U3R5bGV8fCh0aGlzLl9pbm5lclRleHREZWZhdWx0U3R5bGU9e30pLHk9dm9pZCAwLHY9dm9pZCAwLG09dm9pZCAwO2YmJnRoaXMuY2FuQmVJbnNpZGVUZXh0KCk/KHk9bi5pbnNpZGVGaWxsLHY9bi5pbnNpZGVTdHJva2UsbnVsbCE9eSYmImF1dG8iIT09eXx8KHk9dGhpcy5nZXRJbnNpZGVUZXh0RmlsbCgpKSxudWxsIT12JiYiYXV0byIhPT12fHwodj10aGlzLmdldEluc2lkZVRleHRTdHJva2UoeSksbT0hMCkpOih5PW4ub3V0c2lkZUZpbGwsdj1uLm91dHNpZGVTdHJva2UsbnVsbCE9eSYmImF1dG8iIT09eXx8KHk9dGhpcy5nZXRPdXRzaWRlRmlsbCgpKSxudWxsIT12JiYiYXV0byIhPT12fHwodj10aGlzLmdldE91dHNpZGVTdHJva2UoeSksbT0hMCkpLCh5PXl8fCIjMDAwIik9PT1nLmZpbGwmJnY9PT1nLnN0cm9rZSYmbT09PWcuYXV0b1N0cm9rZSYmbz09PWcuYWxpZ24mJmE9PT1nLnZlcnRpY2FsQWxpZ258fChzPSEwLGcuZmlsbD15LGcuc3Ryb2tlPXYsZy5hdXRvU3Ryb2tlPW0sZy5hbGlnbj1vLGcudmVydGljYWxBbGlnbj1hLGUuc2V0RGVmYXVsdFRleHRTdHlsZShnKSksZS5fX2RpcnR5fD0xLHMmJmUuZGlydHlTdHlsZSghMCl9fSx0LnByb3RvdHlwZS5jYW5CZUluc2lkZVRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdC5wcm90b3R5cGUuZ2V0SW5zaWRlVGV4dEZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4iI2ZmZiJ9LHQucHJvdG90eXBlLmdldEluc2lkZVRleHRTdHJva2U9ZnVuY3Rpb24odCl7cmV0dXJuIiMwMDAifSx0LnByb3RvdHlwZS5nZXRPdXRzaWRlRmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fenImJnRoaXMuX196ci5pc0RhcmtNb2RlKCk/dXI6bHJ9LHQucHJvdG90eXBlLmdldE91dHNpZGVTdHJva2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX3pyJiZ0aGlzLl9fenIuZ2V0QmFja2dyb3VuZENvbG9yKCksbj0ic3RyaW5nIj09dHlwZW9mIGUmJnFuKGUpO258fChuPVsyNTUsMjU1LDI1NSwxXSk7Zm9yKHZhciBpPW5bM10scj10aGlzLl9fenIuaXNEYXJrTW9kZSgpLG89MDtvPDM7bysrKW5bb109bltvXSppKyhyPzA6MjU1KSooMS1pKTtyZXR1cm4gblszXT0xLHJpKG4sInJnYmEiKX0sdC5wcm90b3R5cGUudHJhdmVyc2U9ZnVuY3Rpb24odCxlKXt9LHQucHJvdG90eXBlLmF0dHJLVj1mdW5jdGlvbih0LGUpeyJ0ZXh0Q29uZmlnIj09PXQ/dGhpcy5zZXRUZXh0Q29uZmlnKGUpOiJ0ZXh0Q29udGVudCI9PT10P3RoaXMuc2V0VGV4dENvbnRlbnQoZSk6ImNsaXBQYXRoIj09PXQ/dGhpcy5zZXRDbGlwUGF0aChlKToiZXh0cmEiPT09dD8odGhpcy5leHRyYT10aGlzLmV4dHJhfHx7fSxBKHRoaXMuZXh0cmEsZSkpOnRoaXNbdF09ZX0sdC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuaWdub3JlPSEwLHRoaXMubWFya1JlZHJhdygpfSx0LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5pZ25vcmU9ITEsdGhpcy5tYXJrUmVkcmF3KCl9LHQucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24odCxlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhpcy5hdHRyS1YodCxlKTtlbHNlIGlmKHEodCkpZm9yKHZhciBuPUcodCksaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldO3RoaXMuYXR0cktWKHIsdFtyXSl9cmV0dXJuIHRoaXMubWFya1JlZHJhdygpLHRoaXN9LHQucHJvdG90eXBlLnNhdmVDdXJyZW50VG9Ob3JtYWxTdGF0ZT1mdW5jdGlvbih0KXt0aGlzLl9pbm5lclNhdmVUb05vcm1hbCh0KTtmb3IodmFyIGU9dGhpcy5fbm9ybWFsU3RhdGUsbj0wO248dGhpcy5hbmltYXRvcnMubGVuZ3RoO24rKyl7dmFyIGk9dGhpcy5hbmltYXRvcnNbbl0scj1pLl9fZnJvbVN0YXRlVHJhbnNpdGlvbjtpZighKGkuZ2V0TG9vcCgpfHxyJiZyIT09QXIpKXt2YXIgbz1pLnRhcmdldE5hbWUsYT1vP2Vbb106ZTtpLnNhdmVUbyhhKX19fSx0LnByb3RvdHlwZS5faW5uZXJTYXZlVG9Ob3JtYWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbm9ybWFsU3RhdGU7ZXx8KGU9dGhpcy5fbm9ybWFsU3RhdGU9e30pLHQudGV4dENvbmZpZyYmIWUudGV4dENvbmZpZyYmKGUudGV4dENvbmZpZz10aGlzLnRleHRDb25maWcpLHRoaXMuX3NhdmVQcmltYXJ5VG9Ob3JtYWwodCxlLGtyKX0sdC5wcm90b3R5cGUuX3NhdmVQcmltYXJ5VG9Ob3JtYWw9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldO251bGw9PXRbcl18fHIgaW4gZXx8KGVbcl09dGhpc1tyXSl9fSx0LnByb3RvdHlwZS5oYXNTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnRTdGF0ZXMubGVuZ3RoPjB9LHQucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0YXRlc1t0XX0sdC5wcm90b3R5cGUuZW5zdXJlU3RhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdGF0ZXM7cmV0dXJuIGVbdF18fChlW3RdPXt9KSxlW3RdfSx0LnByb3RvdHlwZS5jbGVhclN0YXRlcz1mdW5jdGlvbih0KXt0aGlzLnVzZVN0YXRlKEFyLCExLHQpfSx0LnByb3RvdHlwZS51c2VTdGF0ZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10PT09QXI7aWYodGhpcy5oYXNTdGF0ZSgpfHwhcil7dmFyIG89dGhpcy5jdXJyZW50U3RhdGVzLGE9dGhpcy5zdGF0ZVRyYW5zaXRpb247aWYoIShQKG8sdCk+PTApfHwhZSYmMSE9PW8ubGVuZ3RoKXt2YXIgcztpZih0aGlzLnN0YXRlUHJveHkmJiFyJiYocz10aGlzLnN0YXRlUHJveHkodCkpLHN8fChzPXRoaXMuc3RhdGVzJiZ0aGlzLnN0YXRlc1t0XSksc3x8cil7cnx8dGhpcy5zYXZlQ3VycmVudFRvTm9ybWFsU3RhdGUocyk7dmFyIGw9ISEocyYmcy5ob3ZlckxheWVyfHxpKTtsJiZ0aGlzLl90b2dnbGVIb3ZlckxheWVyRmxhZyghMCksdGhpcy5fYXBwbHlTdGF0ZU9iaih0LHMsdGhpcy5fbm9ybWFsU3RhdGUsZSwhbiYmIXRoaXMuX19pbkhvdmVyJiZhJiZhLmR1cmF0aW9uPjAsYSk7dmFyIHU9dGhpcy5fdGV4dENvbnRlbnQsaD10aGlzLl90ZXh0R3VpZGU7cmV0dXJuIHUmJnUudXNlU3RhdGUodCxlLG4sbCksaCYmaC51c2VTdGF0ZSh0LGUsbixsKSxyPyh0aGlzLmN1cnJlbnRTdGF0ZXM9W10sdGhpcy5fbm9ybWFsU3RhdGU9e30pOmU/dGhpcy5jdXJyZW50U3RhdGVzLnB1c2godCk6dGhpcy5jdXJyZW50U3RhdGVzPVt0XSx0aGlzLl91cGRhdGVBbmltYXRpb25UYXJnZXRzKCksdGhpcy5tYXJrUmVkcmF3KCksIWwmJnRoaXMuX19pbkhvdmVyJiYodGhpcy5fdG9nZ2xlSG92ZXJMYXllckZsYWcoITEpLHRoaXMuX19kaXJ0eSY9LTIpLHN9SSgiU3RhdGUgIit0KyIgbm90IGV4aXN0cy4iKX19fSx0LnByb3RvdHlwZS51c2VTdGF0ZXM9ZnVuY3Rpb24odCxlLG4pe2lmKHQubGVuZ3RoKXt2YXIgaT1bXSxyPXRoaXMuY3VycmVudFN0YXRlcyxvPXQubGVuZ3RoLGE9bz09PXIubGVuZ3RoO2lmKGEpZm9yKHZhciBzPTA7czxvO3MrKylpZih0W3NdIT09cltzXSl7YT0hMTticmVha31pZihhKXJldHVybjtmb3Iocz0wO3M8bztzKyspe3ZhciBsPXRbc10sdT12b2lkIDA7dGhpcy5zdGF0ZVByb3h5JiYodT10aGlzLnN0YXRlUHJveHkobCx0KSksdXx8KHU9dGhpcy5zdGF0ZXNbbF0pLHUmJmkucHVzaCh1KX12YXIgaD1pW28tMV0sYz0hIShoJiZoLmhvdmVyTGF5ZXJ8fG4pO2MmJnRoaXMuX3RvZ2dsZUhvdmVyTGF5ZXJGbGFnKCEwKTt2YXIgcD10aGlzLl9tZXJnZVN0YXRlcyhpKSxkPXRoaXMuc3RhdGVUcmFuc2l0aW9uO3RoaXMuc2F2ZUN1cnJlbnRUb05vcm1hbFN0YXRlKHApLHRoaXMuX2FwcGx5U3RhdGVPYmoodC5qb2luKCIsIikscCx0aGlzLl9ub3JtYWxTdGF0ZSwhMSwhZSYmIXRoaXMuX19pbkhvdmVyJiZkJiZkLmR1cmF0aW9uPjAsZCk7dmFyIGY9dGhpcy5fdGV4dENvbnRlbnQsZz10aGlzLl90ZXh0R3VpZGU7ZiYmZi51c2VTdGF0ZXModCxlLGMpLGcmJmcudXNlU3RhdGVzKHQsZSxjKSx0aGlzLl91cGRhdGVBbmltYXRpb25UYXJnZXRzKCksdGhpcy5jdXJyZW50U3RhdGVzPXQuc2xpY2UoKSx0aGlzLm1hcmtSZWRyYXcoKSwhYyYmdGhpcy5fX2luSG92ZXImJih0aGlzLl90b2dnbGVIb3ZlckxheWVyRmxhZyghMSksdGhpcy5fX2RpcnR5Jj0tMil9ZWxzZSB0aGlzLmNsZWFyU3RhdGVzKCl9LHQucHJvdG90eXBlLmlzU2lsZW50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuc2lsZW50LGU9dGhpcy5wYXJlbnQ7IXQmJmU7KXtpZihlLnNpbGVudCl7dD0hMDticmVha31lPWUucGFyZW50fXJldHVybiB0fSx0LnByb3RvdHlwZS5fdXBkYXRlQW5pbWF0aW9uVGFyZ2V0cz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5hbmltYXRvcnMubGVuZ3RoO3QrKyl7dmFyIGU9dGhpcy5hbmltYXRvcnNbdF07ZS50YXJnZXROYW1lJiZlLmNoYW5nZVRhcmdldCh0aGlzW2UudGFyZ2V0TmFtZV0pfX0sdC5wcm90b3R5cGUucmVtb3ZlU3RhdGU9ZnVuY3Rpb24odCl7dmFyIGU9UCh0aGlzLmN1cnJlbnRTdGF0ZXMsdCk7aWYoZT49MCl7dmFyIG49dGhpcy5jdXJyZW50U3RhdGVzLnNsaWNlKCk7bi5zcGxpY2UoZSwxKSx0aGlzLnVzZVN0YXRlcyhuKX19LHQucHJvdG90eXBlLnJlcGxhY2VTdGF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5jdXJyZW50U3RhdGVzLnNsaWNlKCkscj1QKGksdCksbz1QKGksZSk+PTA7cj49MD9vP2kuc3BsaWNlKHIsMSk6aVtyXT1lOm4mJiFvJiZpLnB1c2goZSksdGhpcy51c2VTdGF0ZXMoaSl9LHQucHJvdG90eXBlLnRvZ2dsZVN0YXRlPWZ1bmN0aW9uKHQsZSl7ZT90aGlzLnVzZVN0YXRlKHQsITApOnRoaXMucmVtb3ZlU3RhdGUodCl9LHQucHJvdG90eXBlLl9tZXJnZVN0YXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj17fSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciByPXRbaV07QShuLHIpLHIudGV4dENvbmZpZyYmQShlPWV8fHt9LHIudGV4dENvbmZpZyl9cmV0dXJuIGUmJihuLnRleHRDb25maWc9ZSksbn0sdC5wcm90b3R5cGUuX2FwcGx5U3RhdGVPYmo9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPSEoZSYmaSk7ZSYmZS50ZXh0Q29uZmlnPyh0aGlzLnRleHRDb25maWc9QSh7fSxpP3RoaXMudGV4dENvbmZpZzpuLnRleHRDb25maWcpLEEodGhpcy50ZXh0Q29uZmlnLGUudGV4dENvbmZpZykpOmEmJm4udGV4dENvbmZpZyYmKHRoaXMudGV4dENvbmZpZz1uLnRleHRDb25maWcpO2Zvcih2YXIgcz17fSxsPSExLHU9MDt1PGtyLmxlbmd0aDt1Kyspe3ZhciBoPWtyW3VdLGM9ciYmTHJbaF07ZSYmbnVsbCE9ZVtoXT9jPyhsPSEwLHNbaF09ZVtoXSk6dGhpc1toXT1lW2hdOmEmJm51bGwhPW5baF0mJihjPyhsPSEwLHNbaF09bltoXSk6dGhpc1toXT1uW2hdKX1pZighcilmb3IodT0wO3U8dGhpcy5hbmltYXRvcnMubGVuZ3RoO3UrKyl7dmFyIHA9dGhpcy5hbmltYXRvcnNbdV0sZD1wLnRhcmdldE5hbWU7cC5nZXRMb29wKCl8fHAuX19jaGFuZ2VGaW5hbFZhbHVlKGQ/KGV8fG4pW2RdOmV8fG4pfWwmJnRoaXMuX3RyYW5zaXRpb25TdGF0ZSh0LHMsbyl9LHQucHJvdG90eXBlLl9hdHRhY2hDb21wb25lbnQ9ZnVuY3Rpb24odCl7aWYoKCF0Ll9fenJ8fHQuX19ob3N0VGFyZ2V0KSYmdCE9PXRoaXMpe3ZhciBlPXRoaXMuX196cjtlJiZ0LmFkZFNlbGZUb1pyKGUpLHQuX196cj1lLHQuX19ob3N0VGFyZ2V0PXRoaXN9fSx0LnByb3RvdHlwZS5fZGV0YWNoQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3QuX196ciYmdC5yZW1vdmVTZWxmRnJvbVpyKHQuX196ciksdC5fX3pyPW51bGwsdC5fX2hvc3RUYXJnZXQ9bnVsbH0sdC5wcm90b3R5cGUuZ2V0Q2xpcFBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcFBhdGh9LHQucHJvdG90eXBlLnNldENsaXBQYXRoPWZ1bmN0aW9uKHQpe3RoaXMuX2NsaXBQYXRoJiZ0aGlzLl9jbGlwUGF0aCE9PXQmJnRoaXMucmVtb3ZlQ2xpcFBhdGgoKSx0aGlzLl9hdHRhY2hDb21wb25lbnQodCksdGhpcy5fY2xpcFBhdGg9dCx0aGlzLm1hcmtSZWRyYXcoKX0sdC5wcm90b3R5cGUucmVtb3ZlQ2xpcFBhdGg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jbGlwUGF0aDt0JiYodGhpcy5fZGV0YWNoQ29tcG9uZW50KHQpLHRoaXMuX2NsaXBQYXRoPW51bGwsdGhpcy5tYXJrUmVkcmF3KCkpfSx0LnByb3RvdHlwZS5nZXRUZXh0Q29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZXh0Q29udGVudH0sdC5wcm90b3R5cGUuc2V0VGV4dENvbnRlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGV4dENvbnRlbnQ7ZSE9PXQmJihlJiZlIT09dCYmdGhpcy5yZW1vdmVUZXh0Q29udGVudCgpLHQuaW5uZXJUcmFuc2Zvcm1hYmxlPW5ldyB2cix0aGlzLl9hdHRhY2hDb21wb25lbnQodCksdGhpcy5fdGV4dENvbnRlbnQ9dCx0aGlzLm1hcmtSZWRyYXcoKSl9LHQucHJvdG90eXBlLnNldFRleHRDb25maWc9ZnVuY3Rpb24odCl7dGhpcy50ZXh0Q29uZmlnfHwodGhpcy50ZXh0Q29uZmlnPXt9KSxBKHRoaXMudGV4dENvbmZpZyx0KSx0aGlzLm1hcmtSZWRyYXcoKX0sdC5wcm90b3R5cGUucmVtb3ZlVGV4dENvbmZpZz1mdW5jdGlvbigpe3RoaXMudGV4dENvbmZpZz1udWxsLHRoaXMubWFya1JlZHJhdygpfSx0LnByb3RvdHlwZS5yZW1vdmVUZXh0Q29udGVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RleHRDb250ZW50O3QmJih0LmlubmVyVHJhbnNmb3JtYWJsZT1udWxsLHRoaXMuX2RldGFjaENvbXBvbmVudCh0KSx0aGlzLl90ZXh0Q29udGVudD1udWxsLHRoaXMuX2lubmVyVGV4dERlZmF1bHRTdHlsZT1udWxsLHRoaXMubWFya1JlZHJhdygpKX0sdC5wcm90b3R5cGUuZ2V0VGV4dEd1aWRlTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZXh0R3VpZGV9LHQucHJvdG90eXBlLnNldFRleHRHdWlkZUxpbmU9ZnVuY3Rpb24odCl7dGhpcy5fdGV4dEd1aWRlJiZ0aGlzLl90ZXh0R3VpZGUhPT10JiZ0aGlzLnJlbW92ZVRleHRHdWlkZUxpbmUoKSx0aGlzLl9hdHRhY2hDb21wb25lbnQodCksdGhpcy5fdGV4dEd1aWRlPXQsdGhpcy5tYXJrUmVkcmF3KCl9LHQucHJvdG90eXBlLnJlbW92ZVRleHRHdWlkZUxpbmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90ZXh0R3VpZGU7dCYmKHRoaXMuX2RldGFjaENvbXBvbmVudCh0KSx0aGlzLl90ZXh0R3VpZGU9bnVsbCx0aGlzLm1hcmtSZWRyYXcoKSl9LHQucHJvdG90eXBlLm1hcmtSZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLl9fZGlydHl8PTE7dmFyIHQ9dGhpcy5fX3pyO3QmJih0aGlzLl9faW5Ib3Zlcj90LnJlZnJlc2hIb3ZlcigpOnQucmVmcmVzaCgpKSx0aGlzLl9faG9zdFRhcmdldCYmdGhpcy5fX2hvc3RUYXJnZXQubWFya1JlZHJhdygpfSx0LnByb3RvdHlwZS5kaXJ0eT1mdW5jdGlvbigpe3RoaXMubWFya1JlZHJhdygpfSx0LnByb3RvdHlwZS5fdG9nZ2xlSG92ZXJMYXllckZsYWc9ZnVuY3Rpb24odCl7dGhpcy5fX2luSG92ZXI9dDt2YXIgZT10aGlzLl90ZXh0Q29udGVudCxuPXRoaXMuX3RleHRHdWlkZTtlJiYoZS5fX2luSG92ZXI9dCksbiYmKG4uX19pbkhvdmVyPXQpfSx0LnByb3RvdHlwZS5hZGRTZWxmVG9acj1mdW5jdGlvbih0KXtpZih0aGlzLl9fenIhPT10KXt0aGlzLl9fenI9dDt2YXIgZT10aGlzLmFuaW1hdG9ycztpZihlKWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXQuYW5pbWF0aW9uLmFkZEFuaW1hdG9yKGVbbl0pO3RoaXMuX2NsaXBQYXRoJiZ0aGlzLl9jbGlwUGF0aC5hZGRTZWxmVG9acih0KSx0aGlzLl90ZXh0Q29udGVudCYmdGhpcy5fdGV4dENvbnRlbnQuYWRkU2VsZlRvWnIodCksdGhpcy5fdGV4dEd1aWRlJiZ0aGlzLl90ZXh0R3VpZGUuYWRkU2VsZlRvWnIodCl9fSx0LnByb3RvdHlwZS5yZW1vdmVTZWxmRnJvbVpyPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX196cil7dGhpcy5fX3pyPW51bGw7dmFyIGU9dGhpcy5hbmltYXRvcnM7aWYoZSlmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LmFuaW1hdGlvbi5yZW1vdmVBbmltYXRvcihlW25dKTt0aGlzLl9jbGlwUGF0aCYmdGhpcy5fY2xpcFBhdGgucmVtb3ZlU2VsZkZyb21acih0KSx0aGlzLl90ZXh0Q29udGVudCYmdGhpcy5fdGV4dENvbnRlbnQucmVtb3ZlU2VsZkZyb21acih0KSx0aGlzLl90ZXh0R3VpZGUmJnRoaXMuX3RleHRHdWlkZS5yZW1vdmVTZWxmRnJvbVpyKHQpfX0sdC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dD90aGlzW3RdOnRoaXM7dmFyIHI9bmV3IFZpKGksZSxuKTtyZXR1cm4gdCYmKHIudGFyZ2V0TmFtZT10KSx0aGlzLmFkZEFuaW1hdG9yKHIsdCkscn0sdC5wcm90b3R5cGUuYWRkQW5pbWF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fenIsaT10aGlzO3QuZHVyaW5nKChmdW5jdGlvbigpe2kudXBkYXRlRHVyaW5nQW5pbWF0aW9uKGUpfSkpLmRvbmUoKGZ1bmN0aW9uKCl7dmFyIGU9aS5hbmltYXRvcnMsbj1QKGUsdCk7bj49MCYmZS5zcGxpY2UobiwxKX0pKSx0aGlzLmFuaW1hdG9ycy5wdXNoKHQpLG4mJm4uYW5pbWF0aW9uLmFkZEFuaW1hdG9yKHQpLG4mJm4ud2FrZVVwKCl9LHQucHJvdG90eXBlLnVwZGF0ZUR1cmluZ0FuaW1hdGlvbj1mdW5jdGlvbih0KXt0aGlzLm1hcmtSZWRyYXcoKX0sdC5wcm90b3R5cGUuc3RvcEFuaW1hdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLmFuaW1hdG9ycyxpPW4ubGVuZ3RoLHI9W10sbz0wO288aTtvKyspe3ZhciBhPW5bb107dCYmdCE9PWEuc2NvcGU/ci5wdXNoKGEpOmEuc3RvcChlKX1yZXR1cm4gdGhpcy5hbmltYXRvcnM9cix0aGlzfSx0LnByb3RvdHlwZS5hbmltYXRlVG89ZnVuY3Rpb24odCxlLG4pe05yKHRoaXMsdCxlLG4pfSx0LnByb3RvdHlwZS5hbmltYXRlRnJvbT1mdW5jdGlvbih0LGUsbil7TnIodGhpcyx0LGUsbiwhMCl9LHQucHJvdG90eXBlLl90cmFuc2l0aW9uU3RhdGU9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPU5yKHRoaXMsZSxuLGkpLG89MDtvPHIubGVuZ3RoO28rKylyW29dLl9fZnJvbVN0YXRlVHJhbnNpdGlvbj10fSx0LnByb3RvdHlwZS5nZXRCb3VuZGluZ1JlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUuZ2V0UGFpbnRSZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHQuaW5pdERlZmF1bHRQcm9wcz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlO2UudHlwZT0iZWxlbWVudCIsZS5uYW1lPSIiLGUuaWdub3JlPWUuc2lsZW50PWUuaXNHcm91cD1lLmRyYWdnYWJsZT1lLmRyYWdnaW5nPWUuaWdub3JlQ2xpcD1lLl9faW5Ib3Zlcj0hMSxlLl9fZGlydHk9MTtmdW5jdGlvbiBuKHQsbixpLHIpe2Z1bmN0aW9uIG8odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwwLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtpXX0sc2V0OmZ1bmN0aW9uKGUpe3RbaV09ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX0sc2V0OmZ1bmN0aW9uKGUpe3Rbcl09ZX19KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6ZnVuY3Rpb24oKXt0aGlzW25dfHxvKHRoaXMsdGhpc1tuXT1bXSk7cmV0dXJuIHRoaXNbbl19LHNldDpmdW5jdGlvbih0KXt0aGlzW2ldPXRbMF0sdGhpc1tyXT10WzFdLHRoaXNbbl09dCxvKHRoaXMsdCl9fSl9T2JqZWN0LmRlZmluZVByb3BlcnR5JiYobigicG9zaXRpb24iLCJfbGVnYWN5UG9zIiwieCIsInkiKSxuKCJzY2FsZSIsIl9sZWdhY3lTY2FsZSIsInNjYWxlWCIsInNjYWxlWSIpLG4oIm9yaWdpbiIsIl9sZWdhY3lPcmlnaW4iLCJvcmlnaW5YIiwib3JpZ2luWSIpKX0oKSx0fSgpO2Z1bmN0aW9uIE5yKHQsZSxuLGkscil7dmFyIG89W107VnIodCwiIix0LGUsbj1ufHx7fSxpLG8scik7dmFyIGE9by5sZW5ndGgscz0hMSxsPW4uZG9uZSx1PW4uYWJvcnRlZCxoPWZ1bmN0aW9uKCl7cz0hMCwtLWE8PTAmJihzP2wmJmwoKTp1JiZ1KCkpfSxjPWZ1bmN0aW9uKCl7LS1hPD0wJiYocz9sJiZsKCk6dSYmdSgpKX07YXx8bCYmbCgpLG8ubGVuZ3RoPjAmJm4uZHVyaW5nJiZvWzBdLmR1cmluZygoZnVuY3Rpb24odCxlKXtuLmR1cmluZyhlKX0pKTtmb3IodmFyIHA9MDtwPG8ubGVuZ3RoO3ArKyl7dmFyIGQ9b1twXTtoJiZkLmRvbmUoaCksYyYmZC5hYm9ydGVkKGMpLG4uZm9yY2UmJmQuZHVyYXRpb24obi5kdXJhdGlvbiksZC5zdGFydChuLmVhc2luZyl9cmV0dXJuIG99ZnVuY3Rpb24gRXIodCxlLG4pe2Zvcih2YXIgaT0wO2k8bjtpKyspdFtpXT1lW2ldfWZ1bmN0aW9uIHpyKHQsZSxuKXtpZihOKGVbbl0pKWlmKE4odFtuXSl8fCh0W25dPVtdKSwkKGVbbl0pKXt2YXIgaT1lW25dLmxlbmd0aDt0W25dLmxlbmd0aCE9PWkmJih0W25dPW5ldyBlW25dLmNvbnN0cnVjdG9yKGkpLEVyKHRbbl0sZVtuXSxpKSl9ZWxzZXt2YXIgcj1lW25dLG89dFtuXSxhPXIubGVuZ3RoO2lmKE4oclswXSkpZm9yKHZhciBzPXJbMF0ubGVuZ3RoLGw9MDtsPGE7bCsrKW9bbF0/RXIob1tsXSxyW2xdLHMpOm9bbF09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocltsXSk7ZWxzZSBFcihvLHIsYSk7by5sZW5ndGg9ci5sZW5ndGh9ZWxzZSB0W25dPWVbbl19ZnVuY3Rpb24gVnIodCxlLG4saSxyLG8sYSxzKXtmb3IodmFyIGw9RyhpKSx1PXIuZHVyYXRpb24saD1yLmRlbGF5LGM9ci5hZGRpdGl2ZSxwPXIuc2V0VG9GaW5hbCxkPSFxKG8pLGY9dC5hbmltYXRvcnMsZz1bXSx5PTA7eTxsLmxlbmd0aDt5Kyspe3ZhciB2PWxbeV0sbT1pW3ZdO2lmKG51bGwhPW0mJm51bGwhPW5bdl0mJihkfHxvW3ZdKSlpZighcShtKXx8TihtKXx8UShtKSlnLnB1c2godik7ZWxzZXtpZihlKXtzfHwoblt2XT1tLHQudXBkYXRlRHVyaW5nQW5pbWF0aW9uKGUpKTtjb250aW51ZX1Wcih0LHYsblt2XSxtLHIsbyYmb1t2XSxhLHMpfWVsc2Ugc3x8KG5bdl09bSx0LnVwZGF0ZUR1cmluZ0FuaW1hdGlvbihlKSxnLnB1c2godikpfXZhciB4PWcubGVuZ3RoO2lmKCFjJiZ4KWZvcih2YXIgXz0wO188Zi5sZW5ndGg7XysrKXtpZigodz1mW19dKS50YXJnZXROYW1lPT09ZSlpZih3LnN0b3BUcmFja3MoZykpe3ZhciBiPVAoZix3KTtmLnNwbGljZShiLDEpfX1pZihyLmZvcmNlfHwoZz1CKGcsKGZ1bmN0aW9uKHQpe3JldHVybiBlPWlbdF0scj1uW3RdLCEoZT09PXJ8fE4oZSkmJk4ocikmJmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYobiE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8bjtpKyspaWYodFtpXSE9PWVbaV0pcmV0dXJuITE7cmV0dXJuITB9KGUscikpO3ZhciBlLHJ9KSkseD1nLmxlbmd0aCkseD4wfHxyLmZvcmNlJiYhYS5sZW5ndGgpe3ZhciB3LFM9dm9pZCAwLE09dm9pZCAwLEk9dm9pZCAwO2lmKHMpe009e30scCYmKFM9e30pO2ZvcihfPTA7Xzx4O18rKyl7TVt2PWdbX11dPW5bdl0scD9TW3ZdPWlbdl06blt2XT1pW3ZdfX1lbHNlIGlmKHApe0k9e307Zm9yKF89MDtfPHg7XysrKXtJW3Y9Z1tfXV09UGkoblt2XSksenIobixpLHYpfX0odz1uZXcgVmkobiwhMSwhMSxjP0IoZiwoZnVuY3Rpb24odCl7cmV0dXJuIHQudGFyZ2V0TmFtZT09PWV9KSk6bnVsbCkpLnRhcmdldE5hbWU9ZSxyLnNjb3BlJiYody5zY29wZT1yLnNjb3BlKSxwJiZTJiZ3LndoZW5XaXRoS2V5cygwLFMsZyksSSYmdy53aGVuV2l0aEtleXMoMCxJLGcpLHcud2hlbldpdGhLZXlzKG51bGw9PXU/NTAwOnUscz9NOmksZykuZGVsYXkoaHx8MCksdC5hZGRBbmltYXRvcih3LGUpLGEucHVzaCh3KX19UihScixqdCksUihScix2cik7dmFyIEJyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLmlzR3JvdXA9ITAsbi5fY2hpbGRyZW49W10sbi5hdHRyKGUpLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5jaGlsZHJlblJlZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZHJlbn0sZS5wcm90b3R5cGUuY2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4uc2xpY2UoKX0sZS5wcm90b3R5cGUuY2hpbGRBdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2hpbGRyZW5bdF19LGUucHJvdG90eXBlLmNoaWxkT2ZOYW1lPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jaGlsZHJlbixuPTA7bjxlLmxlbmd0aDtuKyspaWYoZVtuXS5uYW1lPT09dClyZXR1cm4gZVtuXX0sZS5wcm90b3R5cGUuY2hpbGRDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZHJlbi5sZW5ndGh9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdCE9PXRoaXMmJnQucGFyZW50IT09dGhpcyYmKHRoaXMuX2NoaWxkcmVuLnB1c2godCksdGhpcy5fZG9BZGQodCkpLHRoaXN9LGUucHJvdG90eXBlLmFkZEJlZm9yZT1mdW5jdGlvbih0LGUpe2lmKHQmJnQhPT10aGlzJiZ0LnBhcmVudCE9PXRoaXMmJmUmJmUucGFyZW50PT09dGhpcyl7dmFyIG49dGhpcy5fY2hpbGRyZW4saT1uLmluZGV4T2YoZSk7aT49MCYmKG4uc3BsaWNlKGksMCx0KSx0aGlzLl9kb0FkZCh0KSl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnJlcGxhY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1QKHRoaXMuX2NoaWxkcmVuLHQpO3JldHVybiBuPj0wJiZ0aGlzLnJlcGxhY2VBdChlLG4pLHRoaXN9LGUucHJvdG90eXBlLnJlcGxhY2VBdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2NoaWxkcmVuLGk9bltlXTtpZih0JiZ0IT09dGhpcyYmdC5wYXJlbnQhPT10aGlzJiZ0IT09aSl7bltlXT10LGkucGFyZW50PW51bGw7dmFyIHI9dGhpcy5fX3pyO3ImJmkucmVtb3ZlU2VsZkZyb21acihyKSx0aGlzLl9kb0FkZCh0KX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuX2RvQWRkPWZ1bmN0aW9uKHQpe3QucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCksdC5wYXJlbnQ9dGhpczt2YXIgZT10aGlzLl9fenI7ZSYmZSE9PXQuX196ciYmdC5hZGRTZWxmVG9acihlKSxlJiZlLnJlZnJlc2goKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX196cixuPXRoaXMuX2NoaWxkcmVuLGk9UChuLHQpO3JldHVybiBpPDB8fChuLnNwbGljZShpLDEpLHQucGFyZW50PW51bGwsZSYmdC5yZW1vdmVTZWxmRnJvbVpyKGUpLGUmJmUucmVmcmVzaCgpKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fY2hpbGRyZW4sZT10aGlzLl9fenIsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dO2UmJmkucmVtb3ZlU2VsZkZyb21acihlKSxpLnBhcmVudD1udWxsfXJldHVybiB0Lmxlbmd0aD0wLHRoaXN9LGUucHJvdG90eXBlLmVhY2hDaGlsZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9jaGlsZHJlbixpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV07dC5jYWxsKGUscixpKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUudHJhdmVyc2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtuKyspe3ZhciBpPXRoaXMuX2NoaWxkcmVuW25dLHI9dC5jYWxsKGUsaSk7aS5pc0dyb3VwJiYhciYmaS50cmF2ZXJzZSh0LGUpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5hZGRTZWxmVG9acj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5hZGRTZWxmVG9aci5jYWxsKHRoaXMsZSk7Zm9yKHZhciBuPTA7bjx0aGlzLl9jaGlsZHJlbi5sZW5ndGg7bisrKXt0aGlzLl9jaGlsZHJlbltuXS5hZGRTZWxmVG9acihlKX19LGUucHJvdG90eXBlLnJlbW92ZVNlbGZGcm9tWnI9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUucmVtb3ZlU2VsZkZyb21aci5jYWxsKHRoaXMsZSk7Zm9yKHZhciBuPTA7bjx0aGlzLl9jaGlsZHJlbi5sZW5ndGg7bisrKXt0aGlzLl9jaGlsZHJlbltuXS5yZW1vdmVTZWxmRnJvbVpyKGUpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgemUoMCwwLDAsMCksbj10fHx0aGlzLl9jaGlsZHJlbixpPVtdLHI9bnVsbCxvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciBhPW5bb107aWYoIWEuaWdub3JlJiYhYS5pbnZpc2libGUpe3ZhciBzPWEuZ2V0Qm91bmRpbmdSZWN0KCksbD1hLmdldExvY2FsVHJhbnNmb3JtKGkpO2w/KHplLmFwcGx5VHJhbnNmb3JtKGUscyxsKSwocj1yfHxlLmNsb25lKCkpLnVuaW9uKGUpKToocj1yfHxzLmNsb25lKCkpLnVuaW9uKHMpfX1yZXR1cm4gcnx8ZX0sZX0oUnIpO0JyLnByb3RvdHlwZS50eXBlPSJncm91cCI7Ci8qIQogICAgKiBaUmVuZGVyLCBhIGhpZ2ggcGVyZm9ybWFuY2UgMmQgZHJhd2luZyBsaWJyYXJ5LgogICAgKgogICAgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJhaWR1IEluYy4KICAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICoKICAgICogTElDRU5TRQogICAgKiBodHRwczovL2dpdGh1Yi5jb20vZWNvbWZlL3pyZW5kZXIvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQKICAgICovCnZhciBGcj17fSxHcj17fTt2YXIgV3IsSHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2YXIgaT10aGlzO3RoaXMuX3NsZWVwQWZ0ZXJTdGlsbD0xMCx0aGlzLl9zdGlsbEZyYW1lQWNjdW09MCx0aGlzLl9uZWVkc1JlZnJlc2g9ITAsdGhpcy5fbmVlZHNSZWZyZXNoSG92ZXI9ITAsdGhpcy5fZGFya01vZGU9ITEsbj1ufHx7fSx0aGlzLmRvbT1lLHRoaXMuaWQ9dDt2YXIgbz1uZXcgcm4sYT1uLnJlbmRlcmVyfHwiY2FudmFzIjtGclthXXx8KGE9RyhGcilbMF0pLG4udXNlRGlydHlSZWN0PW51bGwhPW4udXNlRGlydHlSZWN0JiZuLnVzZURpcnR5UmVjdDt2YXIgcz1uZXcgRnJbYV0oZSxvLG4sdCksbD1uLnNzcnx8cy5zc3JPbmx5O3RoaXMuc3RvcmFnZT1vLHRoaXMucGFpbnRlcj1zO3ZhciB1LGg9ci5ub2RlfHxyLndvcmtlcnx8bD9udWxsOm5ldyBvcihzLmdldFZpZXdwb3J0Um9vdCgpLHMucm9vdCksYz1uLnVzZUNvYXJzZVBvaW50ZXI7KG51bGw9PWN8fCJhdXRvIj09PWM/ci50b3VjaEV2ZW50c1N1cHBvcnRlZDohIWMpJiYodT1ydChuLnBvaW50ZXJTaXplLDQ0KSksdGhpcy5oYW5kbGVyPW5ldyBZZShvLHMsaCxzLnJvb3QsdSksdGhpcy5hbmltYXRpb249bmV3IFdpKHtzdGFnZTp7dXBkYXRlOmw/bnVsbDpmdW5jdGlvbigpe3JldHVybiBpLl9mbHVzaCghMCl9fX0pLGx8fHRoaXMuYW5pbWF0aW9uLnN0YXJ0KCl9cmV0dXJuIHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXshdGhpcy5fZGlzcG9zZWQmJnQmJih0aGlzLnN0b3JhZ2UuYWRkUm9vdCh0KSx0LmFkZFNlbGZUb1pyKHRoaXMpLHRoaXMucmVmcmVzaCgpKX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpeyF0aGlzLl9kaXNwb3NlZCYmdCYmKHRoaXMuc3RvcmFnZS5kZWxSb290KHQpLHQucmVtb3ZlU2VsZkZyb21acih0aGlzKSx0aGlzLnJlZnJlc2goKSl9LHQucHJvdG90eXBlLmNvbmZpZ0xheWVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZGlzcG9zZWR8fCh0aGlzLnBhaW50ZXIuY29uZmlnTGF5ZXImJnRoaXMucGFpbnRlci5jb25maWdMYXllcih0LGUpLHRoaXMucmVmcmVzaCgpKX0sdC5wcm90b3R5cGUuc2V0QmFja2dyb3VuZENvbG9yPWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3Bvc2VkfHwodGhpcy5wYWludGVyLnNldEJhY2tncm91bmRDb2xvciYmdGhpcy5wYWludGVyLnNldEJhY2tncm91bmRDb2xvcih0KSx0aGlzLnJlZnJlc2goKSx0aGlzLl9iYWNrZ3JvdW5kQ29sb3I9dCx0aGlzLl9kYXJrTW9kZT1mdW5jdGlvbih0KXtpZighdClyZXR1cm4hMTtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIG9pKHQsMSk8LjQ7aWYodC5jb2xvclN0b3BzKXtmb3IodmFyIGU9dC5jb2xvclN0b3BzLG49MCxpPWUubGVuZ3RoLHI9MDtyPGk7cisrKW4rPW9pKGVbcl0uY29sb3IsMSk7cmV0dXJuKG4vPWkpPC40fXJldHVybiExfSh0KSl9LHQucHJvdG90eXBlLmdldEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3J9LHQucHJvdG90eXBlLnNldERhcmtNb2RlPWZ1bmN0aW9uKHQpe3RoaXMuX2RhcmtNb2RlPXR9LHQucHJvdG90eXBlLmlzRGFya01vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGFya01vZGV9LHQucHJvdG90eXBlLnJlZnJlc2hJbW1lZGlhdGVseT1mdW5jdGlvbih0KXt0aGlzLl9kaXNwb3NlZHx8KHR8fHRoaXMuYW5pbWF0aW9uLnVwZGF0ZSghMCksdGhpcy5fbmVlZHNSZWZyZXNoPSExLHRoaXMucGFpbnRlci5yZWZyZXNoKCksdGhpcy5fbmVlZHNSZWZyZXNoPSExKX0sdC5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VkfHwodGhpcy5fbmVlZHNSZWZyZXNoPSEwLHRoaXMuYW5pbWF0aW9uLnN0YXJ0KCkpfSx0LnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VkfHx0aGlzLl9mbHVzaCghMSl9LHQucHJvdG90eXBlLl9mbHVzaD1mdW5jdGlvbih0KXt2YXIgZSxuPUJpKCk7dGhpcy5fbmVlZHNSZWZyZXNoJiYoZT0hMCx0aGlzLnJlZnJlc2hJbW1lZGlhdGVseSh0KSksdGhpcy5fbmVlZHNSZWZyZXNoSG92ZXImJihlPSEwLHRoaXMucmVmcmVzaEhvdmVySW1tZWRpYXRlbHkoKSk7dmFyIGk9QmkoKTtlPyh0aGlzLl9zdGlsbEZyYW1lQWNjdW09MCx0aGlzLnRyaWdnZXIoInJlbmRlcmVkIix7ZWxhcHNlZFRpbWU6aS1ufSkpOnRoaXMuX3NsZWVwQWZ0ZXJTdGlsbD4wJiYodGhpcy5fc3RpbGxGcmFtZUFjY3VtKyssdGhpcy5fc3RpbGxGcmFtZUFjY3VtPnRoaXMuX3NsZWVwQWZ0ZXJTdGlsbCYmdGhpcy5hbmltYXRpb24uc3RvcCgpKX0sdC5wcm90b3R5cGUuc2V0U2xlZXBBZnRlclN0aWxsPWZ1bmN0aW9uKHQpe3RoaXMuX3NsZWVwQWZ0ZXJTdGlsbD10fSx0LnByb3RvdHlwZS53YWtlVXA9ZnVuY3Rpb24oKXt0aGlzLl9kaXNwb3NlZHx8KHRoaXMuYW5pbWF0aW9uLnN0YXJ0KCksdGhpcy5fc3RpbGxGcmFtZUFjY3VtPTApfSx0LnByb3RvdHlwZS5yZWZyZXNoSG92ZXI9ZnVuY3Rpb24oKXt0aGlzLl9uZWVkc1JlZnJlc2hIb3Zlcj0hMH0sdC5wcm90b3R5cGUucmVmcmVzaEhvdmVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt0aGlzLl9kaXNwb3NlZHx8KHRoaXMuX25lZWRzUmVmcmVzaEhvdmVyPSExLHRoaXMucGFpbnRlci5yZWZyZXNoSG92ZXImJiJjYW52YXMiPT09dGhpcy5wYWludGVyLmdldFR5cGUoKSYmdGhpcy5wYWludGVyLnJlZnJlc2hIb3ZlcigpKX0sdC5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3Bvc2VkfHwodD10fHx7fSx0aGlzLnBhaW50ZXIucmVzaXplKHQud2lkdGgsdC5oZWlnaHQpLHRoaXMuaGFuZGxlci5yZXNpemUoKSl9LHQucHJvdG90eXBlLmNsZWFyQW5pbWF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5fZGlzcG9zZWR8fHRoaXMuYW5pbWF0aW9uLmNsZWFyKCl9LHQucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Rpc3Bvc2VkKXJldHVybiB0aGlzLnBhaW50ZXIuZ2V0V2lkdGgoKX0sdC5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Rpc3Bvc2VkKXJldHVybiB0aGlzLnBhaW50ZXIuZ2V0SGVpZ2h0KCl9LHQucHJvdG90eXBlLnNldEN1cnNvclN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3Bvc2VkfHx0aGlzLmhhbmRsZXIuc2V0Q3Vyc29yU3R5bGUodCl9LHQucHJvdG90eXBlLmZpbmRIb3Zlcj1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl9kaXNwb3NlZClyZXR1cm4gdGhpcy5oYW5kbGVyLmZpbmRIb3Zlcih0LGUpfSx0LnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2Rpc3Bvc2VkfHx0aGlzLmhhbmRsZXIub24odCxlLG4pLHRoaXN9LHQucHJvdG90eXBlLm9mZj1mdW5jdGlvbih0LGUpe3RoaXMuX2Rpc3Bvc2VkfHx0aGlzLmhhbmRsZXIub2ZmKHQsZSl9LHQucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24odCxlKXt0aGlzLl9kaXNwb3NlZHx8dGhpcy5oYW5kbGVyLnRyaWdnZXIodCxlKX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtpZighdGhpcy5fZGlzcG9zZWQpe2Zvcih2YXIgdD10aGlzLnN0b3JhZ2UuZ2V0Um9vdHMoKSxlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXWluc3RhbmNlb2YgQnImJnRbZV0ucmVtb3ZlU2VsZkZyb21acih0aGlzKTt0aGlzLnN0b3JhZ2UuZGVsQWxsUm9vdHMoKSx0aGlzLnBhaW50ZXIuY2xlYXIoKX19LHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLl9kaXNwb3NlZHx8KHRoaXMuYW5pbWF0aW9uLnN0b3AoKSx0aGlzLmNsZWFyKCksdGhpcy5zdG9yYWdlLmRpc3Bvc2UoKSx0aGlzLnBhaW50ZXIuZGlzcG9zZSgpLHRoaXMuaGFuZGxlci5kaXNwb3NlKCksdGhpcy5hbmltYXRpb249dGhpcy5zdG9yYWdlPXRoaXMucGFpbnRlcj10aGlzLmhhbmRsZXI9bnVsbCx0aGlzLl9kaXNwb3NlZD0hMCx0PXRoaXMuaWQsZGVsZXRlIEdyW3RdKX0sdH0oKTtmdW5jdGlvbiBZcih0LGUpe3ZhciBuPW5ldyBIcihNKCksdCxlKTtyZXR1cm4gR3Jbbi5pZF09bixufWZ1bmN0aW9uIFhyKHQsZSl7RnJbdF09ZX1mdW5jdGlvbiBVcih0KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgV3IpcmV0dXJuIFdyKHQpfWZ1bmN0aW9uIFpyKHQpe1dyPXR9dmFyIGpyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGluaXQ6WXIsZGlzcG9zZTpmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0sZGlzcG9zZUFsbDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBHcilHci5oYXNPd25Qcm9wZXJ0eSh0KSYmR3JbdF0uZGlzcG9zZSgpO0dyPXt9fSxnZXRJbnN0YW5jZTpmdW5jdGlvbih0KXtyZXR1cm4gR3JbdF19LHJlZ2lzdGVyUGFpbnRlcjpYcixnZXRFbGVtZW50U1NSRGF0YTpVcixyZWdpc3RlclNTUkRhdGFHZXR0ZXI6WnIsdmVyc2lvbjoiNS42LjAifSkscXI9MWUtNDtmdW5jdGlvbiBLcih0LGUsbixpKXt2YXIgcj1lWzBdLG89ZVsxXSxhPW5bMF0scz1uWzFdLGw9by1yLHU9cy1hO2lmKDA9PT1sKXJldHVybiAwPT09dT9hOihhK3MpLzI7aWYoaSlpZihsPjApe2lmKHQ8PXIpcmV0dXJuIGE7aWYodD49bylyZXR1cm4gc31lbHNle2lmKHQ+PXIpcmV0dXJuIGE7aWYodDw9bylyZXR1cm4gc31lbHNle2lmKHQ9PT1yKXJldHVybiBhO2lmKHQ9PT1vKXJldHVybiBzfXJldHVybih0LXIpL2wqdSthfWZ1bmN0aW9uICRyKHQsZSl7c3dpdGNoKHQpe2Nhc2UiY2VudGVyIjpjYXNlIm1pZGRsZSI6dD0iNTAlIjticmVhaztjYXNlImxlZnQiOmNhc2UidG9wIjp0PSIwJSI7YnJlYWs7Y2FzZSJyaWdodCI6Y2FzZSJib3R0b20iOnQ9IjEwMCUifXJldHVybiBVKHQpPyhuPXQsbi5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIikpLm1hdGNoKC8lJC8pP3BhcnNlRmxvYXQodCkvMTAwKmU6cGFyc2VGbG9hdCh0KTpudWxsPT10P05hTjordDt2YXIgbn1mdW5jdGlvbiBKcih0LGUsbil7cmV0dXJuIG51bGw9PWUmJihlPTEwKSxlPU1hdGgubWluKE1hdGgubWF4KDAsZSksMjApLHQ9KCt0KS50b0ZpeGVkKGUpLG4/dDordH1mdW5jdGlvbiBRcih0KXtyZXR1cm4gdC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSksdH1mdW5jdGlvbiB0byh0KXtpZih0PSt0LGlzTmFOKHQpKXJldHVybiAwO2lmKHQ+MWUtMTQpZm9yKHZhciBlPTEsbj0wO248MTU7bisrLGUqPTEwKWlmKE1hdGgucm91bmQodCplKS9lPT09dClyZXR1cm4gbjtyZXR1cm4gZW8odCl9ZnVuY3Rpb24gZW8odCl7dmFyIGU9dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksbj1lLmluZGV4T2YoImUiKSxpPW4+MD8rZS5zbGljZShuKzEpOjAscj1uPjA/bjplLmxlbmd0aCxvPWUuaW5kZXhPZigiLiIpLGE9bzwwPzA6ci0xLW87cmV0dXJuIE1hdGgubWF4KDAsYS1pKX1mdW5jdGlvbiBubyh0LGUpe3ZhciBuPU1hdGgubG9nLGk9TWF0aC5MTjEwLHI9TWF0aC5mbG9vcihuKHRbMV0tdFswXSkvaSksbz1NYXRoLnJvdW5kKG4oTWF0aC5hYnMoZVsxXS1lWzBdKSkvaSksYT1NYXRoLm1pbihNYXRoLm1heCgtcitvLDApLDIwKTtyZXR1cm4gaXNGaW5pdGUoYSk/YToyMH1mdW5jdGlvbiBpbyh0LGUpe3ZhciBuPVYodCwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCsoaXNOYU4oZSk/MDplKX0pLDApO2lmKDA9PT1uKXJldHVybltdO2Zvcih2YXIgaT1NYXRoLnBvdygxMCxlKSxyPXoodCwoZnVuY3Rpb24odCl7cmV0dXJuKGlzTmFOKHQpPzA6dCkvbippKjEwMH0pKSxvPTEwMCppLGE9eihyLChmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0KX0pKSxzPVYoYSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSksMCksbD16KHIsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtYVtlXX0pKTtzPG87KXtmb3IodmFyIHU9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGg9bnVsbCxjPTAscD1sLmxlbmd0aDtjPHA7KytjKWxbY10+dSYmKHU9bFtjXSxoPWMpOysrYVtoXSxsW2hdPTAsKytzfXJldHVybiB6KGEsKGZ1bmN0aW9uKHQpe3JldHVybiB0L2l9KSl9ZnVuY3Rpb24gcm8odCxlKXt2YXIgbj1NYXRoLm1heCh0byh0KSx0byhlKSksaT10K2U7cmV0dXJuIG4+MjA/aTpKcihpLG4pfXZhciBvbz05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIGFvKHQpe3ZhciBlPTIqTWF0aC5QSTtyZXR1cm4odCVlK2UpJWV9ZnVuY3Rpb24gc28odCl7cmV0dXJuIHQ+LTFlLTQmJnQ8cXJ9dmFyIGxvPS9eKD86KFxkezR9KSg/OlstXC9dKFxkezEsMn0pKD86Wy1cL10oXGR7MSwyfSkoPzpbVCBdKFxkezEsMn0pKD86OihcZHsxLDJ9KSg/OjooXGR7MSwyfSkoPzpbLixdKFxkKykpPyk/KT8oWnxbXCtcLV1cZFxkOj9cZFxkKT8pPyk/KT8pPyQvO2Z1bmN0aW9uIHVvKHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0O2lmKFUodCkpe3ZhciBlPWxvLmV4ZWModCk7aWYoIWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7aWYoZVs4XSl7dmFyIG49K2VbNF18fDA7cmV0dXJuIloiIT09ZVs4XS50b1VwcGVyQ2FzZSgpJiYobi09K2VbOF0uc2xpY2UoMCwzKSksbmV3IERhdGUoRGF0ZS5VVEMoK2VbMV0sKyhlWzJdfHwxKS0xLCtlWzNdfHwxLG4sKyhlWzVdfHwwKSwrZVs2XXx8MCxlWzddPytlWzddLnN1YnN0cmluZygwLDMpOjApKX1yZXR1cm4gbmV3IERhdGUoK2VbMV0sKyhlWzJdfHwxKS0xLCtlWzNdfHwxLCtlWzRdfHwwLCsoZVs1XXx8MCksK2VbNl18fDAsZVs3XT8rZVs3XS5zdWJzdHJpbmcoMCwzKTowKX1yZXR1cm4gbnVsbD09dD9uZXcgRGF0ZShOYU4pOm5ldyBEYXRlKE1hdGgucm91bmQodCkpfWZ1bmN0aW9uIGhvKHQpe3JldHVybiBNYXRoLnBvdygxMCxjbyh0KSl9ZnVuY3Rpb24gY28odCl7aWYoMD09PXQpcmV0dXJuIDA7dmFyIGU9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMTApO3JldHVybiB0L01hdGgucG93KDEwLGUpPj0xMCYmZSsrLGV9ZnVuY3Rpb24gcG8odCxlKXt2YXIgbj1jbyh0KSxpPU1hdGgucG93KDEwLG4pLHI9dC9pO3JldHVybiB0PShlP3I8MS41PzE6cjwyLjU/MjpyPDQ/MzpyPDc/NToxMDpyPDE/MTpyPDI/MjpyPDM/MzpyPDU/NToxMCkqaSxuPj0tMjA/K3QudG9GaXhlZChuPDA/LW46MCk6dH1mdW5jdGlvbiBmbyh0LGUpe3ZhciBuPSh0Lmxlbmd0aC0xKSplKzEsaT1NYXRoLmZsb29yKG4pLHI9K3RbaS0xXSxvPW4taTtyZXR1cm4gbz9yK28qKHRbaV0tcik6cn1mdW5jdGlvbiBnbyh0KXt0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHModCxlLDApPy0xOjF9KSk7Zm9yKHZhciBlPS0xLzAsbj0xLGk9MDtpPHQubGVuZ3RoOyl7Zm9yKHZhciByPXRbaV0uaW50ZXJ2YWwsbz10W2ldLmNsb3NlLGE9MDthPDI7YSsrKXJbYV08PWUmJihyW2FdPWUsb1thXT1hPzE6MS1uKSxlPXJbYV0sbj1vW2FdO3JbMF09PT1yWzFdJiZvWzBdKm9bMV0hPTE/dC5zcGxpY2UoaSwxKTppKyt9cmV0dXJuIHQ7ZnVuY3Rpb24gcyh0LGUsbil7cmV0dXJuIHQuaW50ZXJ2YWxbbl08ZS5pbnRlcnZhbFtuXXx8dC5pbnRlcnZhbFtuXT09PWUuaW50ZXJ2YWxbbl0mJih0LmNsb3NlW25dLWUuY2xvc2Vbbl09PShuPy0xOjEpfHwhbiYmcyh0LGUsMSkpfX1mdW5jdGlvbiB5byh0KXt2YXIgZT1wYXJzZUZsb2F0KHQpO3JldHVybiBlPT10JiYoMCE9PWV8fCFVKHQpfHx0LmluZGV4T2YoIngiKTw9MCk/ZTpOYU59ZnVuY3Rpb24gdm8odCl7cmV0dXJuIWlzTmFOKHlvKHQpKX1mdW5jdGlvbiBtbygpe3JldHVybiBNYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSl9ZnVuY3Rpb24geG8odCxlKXtyZXR1cm4gMD09PWU/dDp4byhlLHQlZSl9ZnVuY3Rpb24gX28odCxlKXtyZXR1cm4gbnVsbD09dD9lOm51bGw9PWU/dDp0KmUveG8odCxlKX0idW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS5sb2c7ZnVuY3Rpb24gYm8odCl7MH1mdW5jdGlvbiB3byh0KXt0aHJvdyBuZXcgRXJyb3IodCl9ZnVuY3Rpb24gU28odCxlLG4pe3JldHVybihlLXQpKm4rdH12YXIgTW89InNlcmllc1wwIixJbz0iXDBfZWNfXDAiO2Z1bmN0aW9uIFRvKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXk/dDpudWxsPT10P1tdOlt0XX1mdW5jdGlvbiBDbyh0LGUsbil7aWYodCl7dFtlXT10W2VdfHx7fSx0LmVtcGhhc2lzPXQuZW1waGFzaXN8fHt9LHQuZW1waGFzaXNbZV09dC5lbXBoYXNpc1tlXXx8e307Zm9yKHZhciBpPTAscj1uLmxlbmd0aDtpPHI7aSsrKXt2YXIgbz1uW2ldOyF0LmVtcGhhc2lzW2VdLmhhc093blByb3BlcnR5KG8pJiZ0W2VdLmhhc093blByb3BlcnR5KG8pJiYodC5lbXBoYXNpc1tlXVtvXT10W2VdW29dKX19fXZhciBEbz1bImZvbnRTdHlsZSIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJyaWNoIiwidGFnIiwiY29sb3IiLCJ0ZXh0Qm9yZGVyQ29sb3IiLCJ0ZXh0Qm9yZGVyV2lkdGgiLCJ3aWR0aCIsImhlaWdodCIsImxpbmVIZWlnaHQiLCJhbGlnbiIsInZlcnRpY2FsQWxpZ24iLCJiYXNlbGluZSIsInNoYWRvd0NvbG9yIiwic2hhZG93Qmx1ciIsInNoYWRvd09mZnNldFgiLCJzaGFkb3dPZmZzZXRZIiwidGV4dFNoYWRvd0NvbG9yIiwidGV4dFNoYWRvd0JsdXIiLCJ0ZXh0U2hhZG93T2Zmc2V0WCIsInRleHRTaGFkb3dPZmZzZXRZIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsImJvcmRlclJhZGl1cyIsInBhZGRpbmciXTtmdW5jdGlvbiBBbyh0KXtyZXR1cm4hcSh0KXx8WSh0KXx8dCBpbnN0YW5jZW9mIERhdGU/dDp0LnZhbHVlfWZ1bmN0aW9uIGtvKHQpe3JldHVybiBxKHQpJiYhKHQgaW5zdGFuY2VvZiBBcnJheSl9ZnVuY3Rpb24gTG8odCxlLG4pe3ZhciBpPSJub3JtYWxNZXJnZSI9PT1uLHI9InJlcGxhY2VNZXJnZSI9PT1uLG89InJlcGxhY2VBbGwiPT09bjt0PXR8fFtdLGU9KGV8fFtdKS5zbGljZSgpO3ZhciBhPXl0KCk7RShlLChmdW5jdGlvbih0LG4pe3EodCl8fChlW25dPW51bGwpfSkpO3ZhciBzLGwsdT1mdW5jdGlvbih0LGUsbil7dmFyIGk9W107aWYoInJlcGxhY2VBbGwiPT09bilyZXR1cm4gaTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89dFtyXTtvJiZudWxsIT1vLmlkJiZlLnNldChvLmlkLHIpLGkucHVzaCh7ZXhpc3Rpbmc6InJlcGxhY2VNZXJnZSI9PT1ufHxFbyhvKT9udWxsOm8sbmV3T3B0aW9uOm51bGwsa2V5SW5mbzpudWxsLGJyYW5kTmV3Om51bGx9KX1yZXR1cm4gaX0odCxhLG4pO3JldHVybihpfHxyKSYmZnVuY3Rpb24odCxlLG4saSl7RShpLChmdW5jdGlvbihyLG8pe2lmKHImJm51bGwhPXIuaWQpe3ZhciBhPU9vKHIuaWQpLHM9bi5nZXQoYSk7aWYobnVsbCE9cyl7dmFyIGw9dFtzXTtsdCghbC5uZXdPcHRpb24sJ0R1cGxpY2F0ZWQgb3B0aW9uIG9uIGlkICInK2ErJyIuJyksbC5uZXdPcHRpb249cixsLmV4aXN0aW5nPWVbc10saVtvXT1udWxsfX19KSl9KHUsdCxhLGUpLGkmJmZ1bmN0aW9uKHQsZSl7RShlLChmdW5jdGlvbihuLGkpe2lmKG4mJm51bGwhPW4ubmFtZSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89dFtyXS5leGlzdGluZztpZighdFtyXS5uZXdPcHRpb24mJm8mJihudWxsPT1vLmlkfHxudWxsPT1uLmlkKSYmIUVvKG4pJiYhRW8obykmJlBvKCJuYW1lIixvLG4pKXJldHVybiB0W3JdLm5ld09wdGlvbj1uLHZvaWQoZVtpXT1udWxsKX19KSl9KHUsZSksaXx8cj9mdW5jdGlvbih0LGUsbil7RShlLChmdW5jdGlvbihlKXtpZihlKXtmb3IodmFyIGkscj0wOyhpPXRbcl0pJiYoaS5uZXdPcHRpb258fEVvKGkuZXhpc3RpbmcpfHxpLmV4aXN0aW5nJiZudWxsIT1lLmlkJiYhUG8oImlkIixlLGkuZXhpc3RpbmcpKTspcisrO2k/KGkubmV3T3B0aW9uPWUsaS5icmFuZE5ldz1uKTp0LnB1c2goe25ld09wdGlvbjplLGJyYW5kTmV3Om4sZXhpc3Rpbmc6bnVsbCxrZXlJbmZvOm51bGx9KSxyKyt9fSkpfSh1LGUscik6byYmZnVuY3Rpb24odCxlKXtFKGUsKGZ1bmN0aW9uKGUpe3QucHVzaCh7bmV3T3B0aW9uOmUsYnJhbmROZXc6ITAsZXhpc3Rpbmc6bnVsbCxrZXlJbmZvOm51bGx9KX0pKX0odSxlKSxzPXUsbD15dCgpLEUocywoZnVuY3Rpb24odCl7dmFyIGU9dC5leGlzdGluZztlJiZsLnNldChlLmlkLHQpfSkpLEUocywoZnVuY3Rpb24odCl7dmFyIGU9dC5uZXdPcHRpb247bHQoIWV8fG51bGw9PWUuaWR8fCFsLmdldChlLmlkKXx8bC5nZXQoZS5pZCk9PT10LCJpZCBkdXBsaWNhdGVzOiAiKyhlJiZlLmlkKSksZSYmbnVsbCE9ZS5pZCYmbC5zZXQoZS5pZCx0KSwhdC5rZXlJbmZvJiYodC5rZXlJbmZvPXt9KX0pKSxFKHMsKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5leGlzdGluZyxpPXQubmV3T3B0aW9uLHI9dC5rZXlJbmZvO2lmKHEoaSkpe2lmKHIubmFtZT1udWxsIT1pLm5hbWU/T28oaS5uYW1lKTpuP24ubmFtZTpNbytlLG4pci5pZD1PbyhuLmlkKTtlbHNlIGlmKG51bGwhPWkuaWQpci5pZD1PbyhpLmlkKTtlbHNle3ZhciBvPTA7ZG97ci5pZD0iXDAiK3IubmFtZSsiXDAiK28rK313aGlsZShsLmdldChyLmlkKSl9bC5zZXQoci5pZCx0KX19KSksdX1mdW5jdGlvbiBQbyh0LGUsbil7dmFyIGk9Um8oZVt0XSxudWxsKSxyPVJvKG5bdF0sbnVsbCk7cmV0dXJuIG51bGwhPWkmJm51bGwhPXImJmk9PT1yfWZ1bmN0aW9uIE9vKHQpe3JldHVybiBSbyh0LCIiKX1mdW5jdGlvbiBSbyh0LGUpe3JldHVybiBudWxsPT10P2U6VSh0KT90OmoodCl8fFoodCk/dCsiIjplfWZ1bmN0aW9uIE5vKHQpe3ZhciBlPXQubmFtZTtyZXR1cm4hKCFlfHwhZS5pbmRleE9mKE1vKSl9ZnVuY3Rpb24gRW8odCl7cmV0dXJuIHQmJm51bGwhPXQuaWQmJjA9PT1Pbyh0LmlkKS5pbmRleE9mKElvKX1mdW5jdGlvbiB6byh0LGUpe3JldHVybiBudWxsIT1lLmRhdGFJbmRleEluc2lkZT9lLmRhdGFJbmRleEluc2lkZTpudWxsIT1lLmRhdGFJbmRleD9ZKGUuZGF0YUluZGV4KT96KGUuZGF0YUluZGV4LChmdW5jdGlvbihlKXtyZXR1cm4gdC5pbmRleE9mUmF3SW5kZXgoZSl9KSk6dC5pbmRleE9mUmF3SW5kZXgoZS5kYXRhSW5kZXgpOm51bGwhPWUubmFtZT9ZKGUubmFtZSk/eihlLm5hbWUsKGZ1bmN0aW9uKGUpe3JldHVybiB0LmluZGV4T2ZOYW1lKGUpfSkpOnQuaW5kZXhPZk5hbWUoZS5uYW1lKTp2b2lkIDB9ZnVuY3Rpb24gVm8oKXt2YXIgdD0iX19lY19pbm5lcl8iK0JvKys7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdfHwoZVt0XT17fSl9fXZhciBCbz1tbygpO2Z1bmN0aW9uIEZvKHQsZSxuKXt2YXIgaT1HbyhlLG4pLHI9aS5tYWluVHlwZVNwZWNpZmllZCxvPWkucXVlcnlPcHRpb25NYXAsYT1pLm90aGVycyxzPW4/bi5kZWZhdWx0TWFpblR5cGU6bnVsbDtyZXR1cm4hciYmcyYmby5zZXQocyx7fSksby5lYWNoKChmdW5jdGlvbihlLGkpe3ZhciByPVlvKHQsaSxlLHt1c2VEZWZhdWx0OnM9PT1pLGVuYWJsZUFsbDohbnx8bnVsbD09bi5lbmFibGVBbGx8fG4uZW5hYmxlQWxsLGVuYWJsZU5vbmU6IW58fG51bGw9PW4uZW5hYmxlTm9uZXx8bi5lbmFibGVOb25lfSk7YVtpKyJNb2RlbHMiXT1yLm1vZGVscyxhW2krIk1vZGVsIl09ci5tb2RlbHNbMF19KSksYX1mdW5jdGlvbiBHbyh0LGUpe3ZhciBuO2lmKFUodCkpe3ZhciBpPXt9O2lbdCsiSW5kZXgiXT0wLG49aX1lbHNlIG49dDt2YXIgcj15dCgpLG89e30sYT0hMTtyZXR1cm4gRShuLChmdW5jdGlvbih0LG4pe2lmKCJkYXRhSW5kZXgiIT09biYmImRhdGFJbmRleEluc2lkZSIhPT1uKXt2YXIgaT1uLm1hdGNoKC9eKFx3KykoSW5kZXh8SWR8TmFtZSkkLyl8fFtdLHM9aVsxXSxsPShpWzJdfHwiIikudG9Mb3dlckNhc2UoKTtpZihzJiZsJiYhKGUmJmUuaW5jbHVkZU1haW5UeXBlcyYmUChlLmluY2x1ZGVNYWluVHlwZXMscyk8MCkpYT1hfHwhIXMsKHIuZ2V0KHMpfHxyLnNldChzLHt9KSlbbF09dH1lbHNlIG9bbl09dH0pKSx7bWFpblR5cGVTcGVjaWZpZWQ6YSxxdWVyeU9wdGlvbk1hcDpyLG90aGVyczpvfX12YXIgV289e3VzZURlZmF1bHQ6ITAsZW5hYmxlQWxsOiExLGVuYWJsZU5vbmU6ITF9LEhvPXt1c2VEZWZhdWx0OiExLGVuYWJsZUFsbDohMCxlbmFibGVOb25lOiEwfTtmdW5jdGlvbiBZbyh0LGUsbixpKXtpPWl8fFdvO3ZhciByPW4uaW5kZXgsbz1uLmlkLGE9bi5uYW1lLHM9e21vZGVsczpudWxsLHNwZWNpZmllZDpudWxsIT1yfHxudWxsIT1vfHxudWxsIT1hfTtpZighcy5zcGVjaWZpZWQpe3ZhciBsPXZvaWQgMDtyZXR1cm4gcy5tb2RlbHM9aS51c2VEZWZhdWx0JiYobD10LmdldENvbXBvbmVudChlKSk/W2xdOltdLHN9cmV0dXJuIm5vbmUiPT09cnx8ITE9PT1yPyhsdChpLmVuYWJsZU5vbmUsJ2Aibm9uZSJgIG9yIGBmYWxzZWAgaXMgbm90IGEgdmFsaWQgdmFsdWUgb24gaW5kZXggb3B0aW9uLicpLHMubW9kZWxzPVtdLHMpOigiYWxsIj09PXImJihsdChpLmVuYWJsZUFsbCwnYCJhbGwiYCBpcyBub3QgYSB2YWxpZCB2YWx1ZSBvbiBpbmRleCBvcHRpb24uJykscj1vPWE9bnVsbCkscy5tb2RlbHM9dC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOmUsaW5kZXg6cixpZDpvLG5hbWU6YX0pLHMpfWZ1bmN0aW9uIFhvKHQsZSxuKXt0LnNldEF0dHJpYnV0ZT90LnNldEF0dHJpYnV0ZShlLG4pOnRbZV09bn1mdW5jdGlvbiBVbyh0LGUpe3ZhciBuPXl0KCksaT1bXTtyZXR1cm4gRSh0LChmdW5jdGlvbih0KXt2YXIgcj1lKHQpOyhuLmdldChyKXx8KGkucHVzaChyKSxuLnNldChyLFtdKSkpLnB1c2godCl9KSkse2tleXM6aSxidWNrZXRzOm59fWZ1bmN0aW9uIFpvKHQsZSxuLGkscil7dmFyIG89bnVsbD09ZXx8ImF1dG8iPT09ZTtpZihudWxsPT1pKXJldHVybiBpO2lmKGooaSkpcmV0dXJuIEpyKGY9U28obnx8MCxpLHIpLG8/TWF0aC5tYXgodG8obnx8MCksdG8oaSkpOmUpO2lmKFUoaSkpcmV0dXJuIHI8MT9uOmk7Zm9yKHZhciBhPVtdLHM9bixsPWksdT1NYXRoLm1heChzP3MubGVuZ3RoOjAsbC5sZW5ndGgpLGg9MDtoPHU7KytoKXt2YXIgYz10LmdldERpbWVuc2lvbkluZm8oaCk7aWYoYyYmIm9yZGluYWwiPT09Yy50eXBlKWFbaF09KHI8MSYmcz9zOmwpW2hdO2Vsc2V7dmFyIHA9cyYmc1toXT9zW2hdOjAsZD1sW2hdLGY9U28ocCxkLHIpO2FbaF09SnIoZixvP01hdGgubWF4KHRvKHApLHRvKGQpKTplKX19cmV0dXJuIGF9dmFyIGpvPSJfX19FQ19fQ09NUE9ORU5UX19DT05UQUlORVJfX18iLHFvPSJfX19FQ19fRVhURU5ERURfQ0xBU1NfX18iO2Z1bmN0aW9uIEtvKHQpe3ZhciBlPXttYWluOiIiLHN1YjoiIn07aWYodCl7dmFyIG49dC5zcGxpdCgiLiIpO2UubWFpbj1uWzBdfHwiIixlLnN1Yj1uWzFdfHwiIn1yZXR1cm4gZX1mdW5jdGlvbiAkbyh0LGUpe3QuJGNvbnN0cnVjdG9yPXQsdC5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsaSxyPXRoaXM7cmV0dXJuIFgoaT1yKSYmL15jbGFzc1xzLy50ZXN0KEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGkpKT9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlfShyKTooZT1mdW5jdGlvbigpeyh0LiRjb25zdHJ1Y3Rvcnx8cikuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxPKGUsdGhpcykpLEEoZS5wcm90b3R5cGUsdCksZVtxb109ITAsZS5leHRlbmQ9dGhpcy5leHRlbmQsZS5zdXBlckNhbGw9dGEsZS5zdXBlckFwcGx5PWVhLGUuc3VwZXJDbGFzcz1yLGV9fWZ1bmN0aW9uIEpvKHQsZSl7dC5leHRlbmQ9ZS5leHRlbmR9dmFyIFFvPU1hdGgucm91bmQoMTAqTWF0aC5yYW5kb20oKSk7ZnVuY3Rpb24gdGEodCxlKXtmb3IodmFyIG49W10saT0yO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspbltpLTJdPWFyZ3VtZW50c1tpXTtyZXR1cm4gdGhpcy5zdXBlckNsYXNzLnByb3RvdHlwZVtlXS5hcHBseSh0LG4pfWZ1bmN0aW9uIGVhKHQsZSxuKXtyZXR1cm4gdGhpcy5zdXBlckNsYXNzLnByb3RvdHlwZVtlXS5hcHBseSh0LG4pfWZ1bmN0aW9uIG5hKHQpe3ZhciBlPXt9O3QucmVnaXN0ZXJDbGFzcz1mdW5jdGlvbih0KXt2YXIgbixpPXQudHlwZXx8dC5wcm90b3R5cGUudHlwZTtpZihpKXtsdCgvXlthLXpBLVowLTlfXSsoWy5dW2EtekEtWjAtOV9dKyk/JC8udGVzdChuPWkpLCdjb21wb25lbnRUeXBlICInK24rJyIgaWxsZWdhbCcpLHQucHJvdG90eXBlLnR5cGU9aTt2YXIgcj1LbyhpKTtpZihyLnN1Yil7aWYoci5zdWIhPT1qbyl7dmFyIG89ZnVuY3Rpb24odCl7dmFyIG49ZVt0Lm1haW5dO24mJm5bam9dfHwoKG49ZVt0Lm1haW5dPXt9KVtqb109ITApO3JldHVybiBufShyKTtvW3Iuc3ViXT10fX1lbHNlIGVbci5tYWluXT10fXJldHVybiB0fSx0LmdldENsYXNzPWZ1bmN0aW9uKHQsbixpKXt2YXIgcj1lW3RdO2lmKHImJnJbam9dJiYocj1uP3Jbbl06bnVsbCksaSYmIXIpdGhyb3cgbmV3IEVycm9yKG4/IkNvbXBvbmVudCAiK3QrIi4iKyhufHwiIikrIiBpcyB1c2VkIGJ1dCBub3QgaW1wb3J0ZWQuIjp0KyIudHlwZSBzaG91bGQgYmUgc3BlY2lmaWVkLiIpO3JldHVybiByfSx0LmdldENsYXNzZXNCeU1haW5UeXBlPWZ1bmN0aW9uKHQpe3ZhciBuPUtvKHQpLGk9W10scj1lW24ubWFpbl07cmV0dXJuIHImJnJbam9dP0UociwoZnVuY3Rpb24odCxlKXtlIT09am8mJmkucHVzaCh0KX0pKTppLnB1c2gociksaX0sdC5oYXNDbGFzcz1mdW5jdGlvbih0KXt2YXIgbj1Lbyh0KTtyZXR1cm4hIWVbbi5tYWluXX0sdC5nZXRBbGxDbGFzc01haW5UeXBlcz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBFKGUsKGZ1bmN0aW9uKGUsbil7dC5wdXNoKG4pfSkpLHR9LHQuaGFzU3ViVHlwZXM9ZnVuY3Rpb24odCl7dmFyIG49S28odCksaT1lW24ubWFpbl07cmV0dXJuIGkmJmlbam9dfX1mdW5jdGlvbiBpYSh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl1bMV18fCh0W25dWzFdPXRbbl1bMF0pO3JldHVybiBlPWV8fCExLGZ1bmN0aW9uKG4saSxyKXtmb3IodmFyIG89e30sYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgcz10W2FdWzFdO2lmKCEoaSYmUChpLHMpPj0wfHxyJiZQKHIscyk8MCkpe3ZhciBsPW4uZ2V0U2hhbGxvdyhzLGUpO251bGwhPWwmJihvW3RbYV1bMF1dPWwpfX1yZXR1cm4gb319dmFyIHJhPWlhKFtbImZpbGwiLCJjb2xvciJdLFsic2hhZG93Qmx1ciJdLFsic2hhZG93T2Zmc2V0WCJdLFsic2hhZG93T2Zmc2V0WSJdLFsib3BhY2l0eSJdLFsic2hhZG93Q29sb3IiXV0pLG9hPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuZ2V0QXJlYVN0eWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJhKHRoaXMsdCxlKX0sdH0oKSxhYT1uZXcgRW4oNTApO2Z1bmN0aW9uIHNhKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9YWEuZ2V0KHQpO3JldHVybiBlJiZlLmltYWdlfXJldHVybiB0fWZ1bmN0aW9uIGxhKHQsZSxuLGkscil7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZihlJiZlLl9fenJJbWFnZVNyYz09PXR8fCFuKXJldHVybiBlO3ZhciBvPWFhLmdldCh0KSxhPXtob3N0RWw6bixjYjppLGNiUGF5bG9hZDpyfTtyZXR1cm4gbz8haGEoZT1vLmltYWdlKSYmby5wZW5kaW5nLnB1c2goYSk6KChlPWgubG9hZEltYWdlKHQsdWEsdWEpKS5fX3pySW1hZ2VTcmM9dCxhYS5wdXQodCxlLl9fY2FjaGVkSW1nT2JqPXtpbWFnZTplLHBlbmRpbmc6W2FdfSkpLGV9cmV0dXJuIHR9cmV0dXJuIGV9ZnVuY3Rpb24gdWEoKXt2YXIgdD10aGlzLl9fY2FjaGVkSW1nT2JqO3RoaXMub25sb2FkPXRoaXMub25lcnJvcj10aGlzLl9fY2FjaGVkSW1nT2JqPW51bGw7Zm9yKHZhciBlPTA7ZTx0LnBlbmRpbmcubGVuZ3RoO2UrKyl7dmFyIG49dC5wZW5kaW5nW2VdLGk9bi5jYjtpJiZpKHRoaXMsbi5jYlBheWxvYWQpLG4uaG9zdEVsLmRpcnR5KCl9dC5wZW5kaW5nLmxlbmd0aD0wfWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0JiZ0LndpZHRoJiZ0LmhlaWdodH12YXIgY2E9L1x7KFthLXpBLVowLTlfXSspXHwoW159XSopXH0vZztmdW5jdGlvbiBwYSh0LGUsbixpLHIpe2lmKCFlKXJldHVybiIiO3ZhciBvPSh0KyIiKS5zcGxpdCgiXG4iKTtyPWRhKGUsbixpLHIpO2Zvcih2YXIgYT0wLHM9by5sZW5ndGg7YTxzO2ErKylvW2FdPWZhKG9bYV0scik7cmV0dXJuIG8uam9pbigiXG4iKX1mdW5jdGlvbiBkYSh0LGUsbixpKXt2YXIgcj1BKHt9LGk9aXx8e30pO3IuZm9udD1lLG49cnQobiwiLi4uIiksci5tYXhJdGVyYXRpb25zPXJ0KGkubWF4SXRlcmF0aW9ucywyKTt2YXIgbz1yLm1pbkNoYXI9cnQoaS5taW5DaGFyLDApO3IuY25DaGFyV2lkdGg9YnIoIuWbvSIsZSk7dmFyIGE9ci5hc2NDaGFyV2lkdGg9YnIoImEiLGUpO3IucGxhY2Vob2xkZXI9cnQoaS5wbGFjZWhvbGRlciwiIik7Zm9yKHZhciBzPXQ9TWF0aC5tYXgoMCx0LTEpLGw9MDtsPG8mJnM+PWE7bCsrKXMtPWE7dmFyIHU9YnIobixlKTtyZXR1cm4gdT5zJiYobj0iIix1PTApLHM9dC11LHIuZWxsaXBzaXM9bixyLmVsbGlwc2lzV2lkdGg9dSxyLmNvbnRlbnRXaWR0aD1zLHIuY29udGFpbmVyV2lkdGg9dCxyfWZ1bmN0aW9uIGZhKHQsZSl7dmFyIG49ZS5jb250YWluZXJXaWR0aCxpPWUuZm9udCxyPWUuY29udGVudFdpZHRoO2lmKCFuKXJldHVybiIiO3ZhciBvPWJyKHQsaSk7aWYobzw9bilyZXR1cm4gdDtmb3IodmFyIGE9MDs7YSsrKXtpZihvPD1yfHxhPj1lLm1heEl0ZXJhdGlvbnMpe3QrPWUuZWxsaXBzaXM7YnJlYWt9dmFyIHM9MD09PWE/Z2EodCxyLGUuYXNjQ2hhcldpZHRoLGUuY25DaGFyV2lkdGgpOm8+MD9NYXRoLmZsb29yKHQubGVuZ3RoKnIvbyk6MDtvPWJyKHQ9dC5zdWJzdHIoMCxzKSxpKX1yZXR1cm4iIj09PXQmJih0PWUucGxhY2Vob2xkZXIpLHR9ZnVuY3Rpb24gZ2EodCxlLG4saSl7Zm9yKHZhciByPTAsbz0wLGE9dC5sZW5ndGg7bzxhJiZyPGU7bysrKXt2YXIgcz10LmNoYXJDb2RlQXQobyk7cis9MDw9cyYmczw9MTI3P246aX1yZXR1cm4gb312YXIgeWE9ZnVuY3Rpb24oKXt9LHZhPWZ1bmN0aW9uKHQpe3RoaXMudG9rZW5zPVtdLHQmJih0aGlzLnRva2Vucz10KX0sbWE9ZnVuY3Rpb24oKXt0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLmNvbnRlbnRXaWR0aD0wLHRoaXMuY29udGVudEhlaWdodD0wLHRoaXMub3V0ZXJXaWR0aD0wLHRoaXMub3V0ZXJIZWlnaHQ9MCx0aGlzLmxpbmVzPVtdfTtmdW5jdGlvbiB4YSh0LGUsbixpLHIpe3ZhciBvLGEscz0iIj09PWUsbD1yJiZuLnJpY2hbcl18fHt9LHU9dC5saW5lcyxoPWwuZm9udHx8bi5mb250LGM9ITE7aWYoaSl7dmFyIHA9bC5wYWRkaW5nLGQ9cD9wWzFdK3BbM106MDtpZihudWxsIT1sLndpZHRoJiYiYXV0byIhPT1sLndpZHRoKXt2YXIgZj1DcihsLndpZHRoLGkud2lkdGgpK2Q7dS5sZW5ndGg+MCYmZitpLmFjY3VtV2lkdGg+aS53aWR0aCYmKG89ZS5zcGxpdCgiXG4iKSxjPSEwKSxpLmFjY3VtV2lkdGg9Zn1lbHNle3ZhciBnPXdhKGUsaCxpLndpZHRoLGkuYnJlYWtBbGwsaS5hY2N1bVdpZHRoKTtpLmFjY3VtV2lkdGg9Zy5hY2N1bVdpZHRoK2QsYT1nLmxpbmVzV2lkdGhzLG89Zy5saW5lc319ZWxzZSBvPWUuc3BsaXQoIlxuIik7Zm9yKHZhciB5PTA7eTxvLmxlbmd0aDt5Kyspe3ZhciB2PW9beV0sbT1uZXcgeWE7aWYobS5zdHlsZU5hbWU9cixtLnRleHQ9dixtLmlzTGluZUhvbGRlcj0hdiYmIXMsIm51bWJlciI9PXR5cGVvZiBsLndpZHRoP20ud2lkdGg9bC53aWR0aDptLndpZHRoPWE/YVt5XTpicih2LGgpLHl8fGMpdS5wdXNoKG5ldyB2YShbbV0pKTtlbHNle3ZhciB4PSh1W3UubGVuZ3RoLTFdfHwodVswXT1uZXcgdmEpKS50b2tlbnMsXz14Lmxlbmd0aDsxPT09XyYmeFswXS5pc0xpbmVIb2xkZXI/eFswXT1tOih2fHwhX3x8cykmJngucHVzaChtKX19fXZhciBfYT1WKCIsJj8vO10gIi5zcGxpdCgiIiksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV09ITAsdH0pLHt9KTtmdW5jdGlvbiBiYSh0KXtyZXR1cm4hZnVuY3Rpb24odCl7dmFyIGU9dC5jaGFyQ29kZUF0KDApO3JldHVybiBlPj0zMiYmZTw9NTkxfHxlPj04ODAmJmU8PTQzNTF8fGU+PTQ2MDgmJmU8PTUxMTl8fGU+PTc2ODAmJmU8PTgzMDN9KHQpfHwhIV9hW3RdfWZ1bmN0aW9uIHdhKHQsZSxuLGkscil7Zm9yKHZhciBvPVtdLGE9W10scz0iIixsPSIiLHU9MCxoPTAsYz0wO2M8dC5sZW5ndGg7YysrKXt2YXIgcD10LmNoYXJBdChjKTtpZigiXG4iIT09cCl7dmFyIGQ9YnIocCxlKSxmPSFpJiYhYmEocCk7KG8ubGVuZ3RoP2grZD5uOnIraCtkPm4pP2g/KHN8fGwpJiYoZj8oc3x8KHM9bCxsPSIiLGg9dT0wKSxvLnB1c2gocyksYS5wdXNoKGgtdSksbCs9cCxzPSIiLGg9dSs9ZCk6KGwmJihzKz1sLGw9IiIsdT0wKSxvLnB1c2gocyksYS5wdXNoKGgpLHM9cCxoPWQpKTpmPyhvLnB1c2gobCksYS5wdXNoKHUpLGw9cCx1PWQpOihvLnB1c2gocCksYS5wdXNoKGQpKTooaCs9ZCxmPyhsKz1wLHUrPWQpOihsJiYocys9bCxsPSIiLHU9MCkscys9cCkpfWVsc2UgbCYmKHMrPWwsaCs9dSksby5wdXNoKHMpLGEucHVzaChoKSxzPSIiLGw9IiIsdT0wLGg9MH1yZXR1cm4gby5sZW5ndGh8fHN8fChzPXQsbD0iIix1PTApLGwmJihzKz1sKSxzJiYoby5wdXNoKHMpLGEucHVzaChoKSksMT09PW8ubGVuZ3RoJiYoaCs9cikse2FjY3VtV2lkdGg6aCxsaW5lczpvLGxpbmVzV2lkdGhzOmF9fXZhciBTYT0iX196cl9zdHlsZV8iK01hdGgucm91bmQoMTAqTWF0aC5yYW5kb20oKSksTWE9e3NoYWRvd0JsdXI6MCxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowLHNoYWRvd0NvbG9yOiIjMDAwIixvcGFjaXR5OjEsYmxlbmQ6InNvdXJjZS1vdmVyIn0sSWE9e3N0eWxlOntzaGFkb3dCbHVyOiEwLHNoYWRvd09mZnNldFg6ITAsc2hhZG93T2Zmc2V0WTohMCxzaGFkb3dDb2xvcjohMCxvcGFjaXR5OiEwfX07TWFbU2FdPSEwO3ZhciBUYT1bInoiLCJ6MiIsImludmlzaWJsZSJdLENhPVsiaW52aXNpYmxlIl0sRGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSl8fHRoaXN9dmFyIGk7cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihlKXtmb3IodmFyIG49RyhlKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV07InN0eWxlIj09PXI/dGhpcy51c2VTdHlsZShlW3JdKTp0LnByb3RvdHlwZS5hdHRyS1YuY2FsbCh0aGlzLHIsZVtyXSl9dGhpcy5zdHlsZXx8dGhpcy51c2VTdHlsZSh7fSl9LGUucHJvdG90eXBlLmJlZm9yZUJydXNoPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5hZnRlckJydXNoPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5pbm5lckJlZm9yZUJydXNoPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5pbm5lckFmdGVyQnJ1c2g9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnNob3VsZEJlUGFpbnRlZD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLnRyYW5zZm9ybTtpZih0aGlzLmlnbm9yZXx8dGhpcy5pbnZpc2libGV8fDA9PT10aGlzLnN0eWxlLm9wYWNpdHl8fHRoaXMuY3VsbGluZyYmZnVuY3Rpb24odCxlLG4pe0FhLmNvcHkodC5nZXRCb3VuZGluZ1JlY3QoKSksdC50cmFuc2Zvcm0mJkFhLmFwcGx5VHJhbnNmb3JtKHQudHJhbnNmb3JtKTtyZXR1cm4ga2Eud2lkdGg9ZSxrYS5oZWlnaHQ9biwhQWEuaW50ZXJzZWN0KGthKX0odGhpcyx0LGUpfHxyJiYhclswXSYmIXJbM10pcmV0dXJuITE7aWYobiYmdGhpcy5fX2NsaXBQYXRocylmb3IodmFyIG89MDtvPHRoaXMuX19jbGlwUGF0aHMubGVuZ3RoOysrbylpZih0aGlzLl9fY2xpcFBhdGhzW29dLmlzWmVyb0FyZWEoKSlyZXR1cm4hMTtpZihpJiZ0aGlzLnBhcmVudClmb3IodmFyIGE9dGhpcy5wYXJlbnQ7YTspe2lmKGEuaWdub3JlKXJldHVybiExO2E9YS5wYXJlbnR9cmV0dXJuITB9LGUucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWN0Q29udGFpbih0LGUpfSxlLnByb3RvdHlwZS50cmF2ZXJzZT1mdW5jdGlvbih0LGUpe3QuY2FsbChlLHRoaXMpfSxlLnByb3RvdHlwZS5yZWN0Q29udGFpbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudHJhbnNmb3JtQ29vcmRUb0xvY2FsKHQsZSk7cmV0dXJuIHRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkuY29udGFpbihuWzBdLG5bMV0pfSxlLnByb3RvdHlwZS5nZXRQYWludFJlY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYWludFJlY3Q7aWYoIXRoaXMuX3BhaW50UmVjdHx8dGhpcy5fX2RpcnR5KXt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCksaT10aGlzLnN0eWxlLHI9aS5zaGFkb3dCbHVyfHwwLG89aS5zaGFkb3dPZmZzZXRYfHwwLGE9aS5zaGFkb3dPZmZzZXRZfHwwO3Q9dGhpcy5fcGFpbnRSZWN0fHwodGhpcy5fcGFpbnRSZWN0PW5ldyB6ZSgwLDAsMCwwKSksZT96ZS5hcHBseVRyYW5zZm9ybSh0LG4sZSk6dC5jb3B5KG4pLChyfHxvfHxhKSYmKHQud2lkdGgrPTIqcitNYXRoLmFicyhvKSx0LmhlaWdodCs9MipyK01hdGguYWJzKGEpLHQueD1NYXRoLm1pbih0LngsdC54K28tciksdC55PU1hdGgubWluKHQueSx0LnkrYS1yKSk7dmFyIHM9dGhpcy5kaXJ0eVJlY3RUb2xlcmFuY2U7dC5pc1plcm8oKXx8KHQueD1NYXRoLmZsb29yKHQueC1zKSx0Lnk9TWF0aC5mbG9vcih0LnktcyksdC53aWR0aD1NYXRoLmNlaWwodC53aWR0aCsxKzIqcyksdC5oZWlnaHQ9TWF0aC5jZWlsKHQuaGVpZ2h0KzErMipzKSl9cmV0dXJuIHR9LGUucHJvdG90eXBlLnNldFByZXZQYWludFJlY3Q9ZnVuY3Rpb24odCl7dD8odGhpcy5fcHJldlBhaW50UmVjdD10aGlzLl9wcmV2UGFpbnRSZWN0fHxuZXcgemUoMCwwLDAsMCksdGhpcy5fcHJldlBhaW50UmVjdC5jb3B5KHQpKTp0aGlzLl9wcmV2UGFpbnRSZWN0PW51bGx9LGUucHJvdG90eXBlLmdldFByZXZQYWludFJlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJldlBhaW50UmVjdH0sZS5wcm90b3R5cGUuYW5pbWF0ZVN0eWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFuaW1hdGUoInN0eWxlIix0KX0sZS5wcm90b3R5cGUudXBkYXRlRHVyaW5nQW5pbWF0aW9uPWZ1bmN0aW9uKHQpeyJzdHlsZSI9PT10P3RoaXMuZGlydHlTdHlsZSgpOnRoaXMubWFya1JlZHJhdygpfSxlLnByb3RvdHlwZS5hdHRyS1Y9ZnVuY3Rpb24oZSxuKXsic3R5bGUiIT09ZT90LnByb3RvdHlwZS5hdHRyS1YuY2FsbCh0aGlzLGUsbik6dGhpcy5zdHlsZT90aGlzLnNldFN0eWxlKG4pOnRoaXMudXNlU3R5bGUobil9LGUucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3RoaXMuc3R5bGVbdF09ZTpBKHRoaXMuc3R5bGUsdCksdGhpcy5kaXJ0eVN0eWxlKCksdGhpc30sZS5wcm90b3R5cGUuZGlydHlTdHlsZT1mdW5jdGlvbih0KXt0fHx0aGlzLm1hcmtSZWRyYXcoKSx0aGlzLl9fZGlydHl8PTIsdGhpcy5fcmVjdCYmKHRoaXMuX3JlY3Q9bnVsbCl9LGUucHJvdG90eXBlLmRpcnR5PWZ1bmN0aW9uKCl7dGhpcy5kaXJ0eVN0eWxlKCl9LGUucHJvdG90eXBlLnN0eWxlQ2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiEhKDImdGhpcy5fX2RpcnR5KX0sZS5wcm90b3R5cGUuc3R5bGVVcGRhdGVkPWZ1bmN0aW9uKCl7dGhpcy5fX2RpcnR5Jj0tM30sZS5wcm90b3R5cGUuY3JlYXRlU3R5bGU9ZnVuY3Rpb24odCl7cmV0dXJuIG10KE1hLHQpfSxlLnByb3RvdHlwZS51c2VTdHlsZT1mdW5jdGlvbih0KXt0W1NhXXx8KHQ9dGhpcy5jcmVhdGVTdHlsZSh0KSksdGhpcy5fX2luSG92ZXI/dGhpcy5fX2hvdmVyU3R5bGU9dDp0aGlzLnN0eWxlPXQsdGhpcy5kaXJ0eVN0eWxlKCl9LGUucHJvdG90eXBlLmlzU3R5bGVPYmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRbU2FdfSxlLnByb3RvdHlwZS5faW5uZXJTYXZlVG9Ob3JtYWw9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX2lubmVyU2F2ZVRvTm9ybWFsLmNhbGwodGhpcyxlKTt2YXIgbj10aGlzLl9ub3JtYWxTdGF0ZTtlLnN0eWxlJiYhbi5zdHlsZSYmKG4uc3R5bGU9dGhpcy5fbWVyZ2VTdHlsZSh0aGlzLmNyZWF0ZVN0eWxlKCksdGhpcy5zdHlsZSkpLHRoaXMuX3NhdmVQcmltYXJ5VG9Ob3JtYWwoZSxuLFRhKX0sZS5wcm90b3R5cGUuX2FwcGx5U3RhdGVPYmo9ZnVuY3Rpb24oZSxuLGkscixvLGEpe3QucHJvdG90eXBlLl9hcHBseVN0YXRlT2JqLmNhbGwodGhpcyxlLG4saSxyLG8sYSk7dmFyIHMsbD0hKG4mJnIpO2lmKG4mJm4uc3R5bGU/bz9yP3M9bi5zdHlsZToocz10aGlzLl9tZXJnZVN0eWxlKHRoaXMuY3JlYXRlU3R5bGUoKSxpLnN0eWxlKSx0aGlzLl9tZXJnZVN0eWxlKHMsbi5zdHlsZSkpOihzPXRoaXMuX21lcmdlU3R5bGUodGhpcy5jcmVhdGVTdHlsZSgpLHI/dGhpcy5zdHlsZTppLnN0eWxlKSx0aGlzLl9tZXJnZVN0eWxlKHMsbi5zdHlsZSkpOmwmJihzPWkuc3R5bGUpLHMpaWYobyl7dmFyIHU9dGhpcy5zdHlsZTtpZih0aGlzLnN0eWxlPXRoaXMuY3JlYXRlU3R5bGUobD97fTp1KSxsKWZvcih2YXIgaD1HKHUpLGM9MDtjPGgubGVuZ3RoO2MrKyl7KGQ9aFtjXSlpbiBzJiYoc1tkXT1zW2RdLHRoaXMuc3R5bGVbZF09dVtkXSl9dmFyIHA9RyhzKTtmb3IoYz0wO2M8cC5sZW5ndGg7YysrKXt2YXIgZD1wW2NdO3RoaXMuc3R5bGVbZF09dGhpcy5zdHlsZVtkXX10aGlzLl90cmFuc2l0aW9uU3RhdGUoZSx7c3R5bGU6c30sYSx0aGlzLmdldEFuaW1hdGlvblN0eWxlUHJvcHMoKSl9ZWxzZSB0aGlzLnVzZVN0eWxlKHMpO3ZhciBmPXRoaXMuX19pbkhvdmVyP0NhOlRhO2ZvcihjPTA7YzxmLmxlbmd0aDtjKyspe2Q9ZltjXTtuJiZudWxsIT1uW2RdP3RoaXNbZF09bltkXTpsJiZudWxsIT1pW2RdJiYodGhpc1tkXT1pW2RdKX19LGUucHJvdG90eXBlLl9tZXJnZVN0YXRlcz1mdW5jdGlvbihlKXtmb3IodmFyIG4saT10LnByb3RvdHlwZS5fbWVyZ2VTdGF0ZXMuY2FsbCh0aGlzLGUpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZVtyXTtvLnN0eWxlJiYobj1ufHx7fSx0aGlzLl9tZXJnZVN0eWxlKG4sby5zdHlsZSkpfXJldHVybiBuJiYoaS5zdHlsZT1uKSxpfSxlLnByb3RvdHlwZS5fbWVyZ2VTdHlsZT1mdW5jdGlvbih0LGUpe3JldHVybiBBKHQsZSksdH0sZS5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uU3R5bGVQcm9wcz1mdW5jdGlvbigpe3JldHVybiBJYX0sZS5pbml0RGVmYXVsdFByb3BzPSgoaT1lLnByb3RvdHlwZSkudHlwZT0iZGlzcGxheWFibGUiLGkuaW52aXNpYmxlPSExLGkuej0wLGkuejI9MCxpLnpsZXZlbD0wLGkuY3VsbGluZz0hMSxpLmN1cnNvcj0icG9pbnRlciIsaS5yZWN0SG92ZXI9ITEsaS5pbmNyZW1lbnRhbD0hMSxpLl9yZWN0PW51bGwsaS5kaXJ0eVJlY3RUb2xlcmFuY2U9MCx2b2lkKGkuX19kaXJ0eT0zKSksZX0oUnIpLEFhPW5ldyB6ZSgwLDAsMCwwKSxrYT1uZXcgemUoMCwwLDAsMCk7dmFyIExhPU1hdGgubWluLFBhPU1hdGgubWF4LE9hPU1hdGguc2luLFJhPU1hdGguY29zLE5hPTIqTWF0aC5QSSxFYT1NdCgpLHphPU10KCksVmE9TXQoKTtmdW5jdGlvbiBCYSh0LGUsbil7aWYoMCE9PXQubGVuZ3RoKXtmb3IodmFyIGk9dFswXSxyPWlbMF0sbz1pWzBdLGE9aVsxXSxzPWlbMV0sbD0xO2w8dC5sZW5ndGg7bCsrKWk9dFtsXSxyPUxhKHIsaVswXSksbz1QYShvLGlbMF0pLGE9TGEoYSxpWzFdKSxzPVBhKHMsaVsxXSk7ZVswXT1yLGVbMV09YSxuWzBdPW8sblsxXT1zfX1mdW5jdGlvbiBGYSh0LGUsbixpLHIsbyl7clswXT1MYSh0LG4pLHJbMV09TGEoZSxpKSxvWzBdPVBhKHQsbiksb1sxXT1QYShlLGkpfXZhciBHYT1bXSxXYT1bXTtmdW5jdGlvbiBIYSh0LGUsbixpLHIsbyxhLHMsbCx1KXt2YXIgaD1ibixjPW1uLHA9aCh0LG4scixhLEdhKTtsWzBdPTEvMCxsWzFdPTEvMCx1WzBdPS0xLzAsdVsxXT0tMS8wO2Zvcih2YXIgZD0wO2Q8cDtkKyspe3ZhciBmPWModCxuLHIsYSxHYVtkXSk7bFswXT1MYShmLGxbMF0pLHVbMF09UGEoZix1WzBdKX1wPWgoZSxpLG8scyxXYSk7Zm9yKGQ9MDtkPHA7ZCsrKXt2YXIgZz1jKGUsaSxvLHMsV2FbZF0pO2xbMV09TGEoZyxsWzFdKSx1WzFdPVBhKGcsdVsxXSl9bFswXT1MYSh0LGxbMF0pLHVbMF09UGEodCx1WzBdKSxsWzBdPUxhKGEsbFswXSksdVswXT1QYShhLHVbMF0pLGxbMV09TGEoZSxsWzFdKSx1WzFdPVBhKGUsdVsxXSksbFsxXT1MYShzLGxbMV0pLHVbMV09UGEocyx1WzFdKX1mdW5jdGlvbiBZYSh0LGUsbixpLHIsbyxhLHMpe3ZhciBsPUNuLHU9SW4saD1QYShMYShsKHQsbixyKSwxKSwwKSxjPVBhKExhKGwoZSxpLG8pLDEpLDApLHA9dSh0LG4scixoKSxkPXUoZSxpLG8sYyk7YVswXT1MYSh0LHIscCksYVsxXT1MYShlLG8sZCksc1swXT1QYSh0LHIscCksc1sxXT1QYShlLG8sZCl9ZnVuY3Rpb24gWGEodCxlLG4saSxyLG8sYSxzLGwpe3ZhciB1PUh0LGg9WXQsYz1NYXRoLmFicyhyLW8pO2lmKGMlTmE8MWUtNCYmYz4xZS00KXJldHVybiBzWzBdPXQtbixzWzFdPWUtaSxsWzBdPXQrbix2b2lkKGxbMV09ZStpKTtpZihFYVswXT1SYShyKSpuK3QsRWFbMV09T2EocikqaStlLHphWzBdPVJhKG8pKm4rdCx6YVsxXT1PYShvKSppK2UsdShzLEVhLHphKSxoKGwsRWEsemEpLChyJT1OYSk8MCYmKHIrPU5hKSwobyU9TmEpPDAmJihvKz1OYSkscj5vJiYhYT9vKz1OYTpyPG8mJmEmJihyKz1OYSksYSl7dmFyIHA9bztvPXIscj1wfWZvcih2YXIgZD0wO2Q8bztkKz1NYXRoLlBJLzIpZD5yJiYoVmFbMF09UmEoZCkqbit0LFZhWzFdPU9hKGQpKmkrZSx1KHMsVmEscyksaChsLFZhLGwpKX12YXIgVWE9e006MSxMOjIsQzozLFE6NCxBOjUsWjo2LFI6N30sWmE9W10samE9W10scWE9W10sS2E9W10sJGE9W10sSmE9W10sUWE9TWF0aC5taW4sdHM9TWF0aC5tYXgsZXM9TWF0aC5jb3MsbnM9TWF0aC5zaW4saXM9TWF0aC5hYnMscnM9TWF0aC5QSSxvcz0yKnJzLGFzPSJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5LHNzPVtdO2Z1bmN0aW9uIGxzKHQpe3JldHVybiBNYXRoLnJvdW5kKHQvcnMqMWU4KS8xZTglMipyc31mdW5jdGlvbiB1cyh0LGUpe3ZhciBuPWxzKHRbMF0pO248MCYmKG4rPW9zKTt2YXIgaT1uLXRbMF0scj10WzFdO3IrPWksIWUmJnItbj49b3M/cj1uK29zOmUmJm4tcj49b3M/cj1uLW9zOiFlJiZuPnI/cj1uKyhvcy1scyhuLXIpKTplJiZuPHImJihyPW4tKG9zLWxzKHItbikpKSx0WzBdPW4sdFsxXT1yfXZhciBocz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5kcHI9MSx0aGlzLl94aT0wLHRoaXMuX3lpPTAsdGhpcy5feDA9MCx0aGlzLl95MD0wLHRoaXMuX2xlbj0wLHQmJih0aGlzLl9zYXZlRGF0YT0hMSksdGhpcy5fc2F2ZURhdGEmJih0aGlzLmRhdGE9W10pfXJldHVybiB0LnByb3RvdHlwZS5pbmNyZWFzZVZlcnNpb249ZnVuY3Rpb24oKXt0aGlzLl92ZXJzaW9uKyt9LHQucHJvdG90eXBlLmdldFZlcnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn0sdC5wcm90b3R5cGUuc2V0U2NhbGU9ZnVuY3Rpb24odCxlLG4peyhuPW58fDApPjAmJih0aGlzLl91eD1pcyhuL3NyL3QpfHwwLHRoaXMuX3V5PWlzKG4vc3IvZSl8fDApfSx0LnByb3RvdHlwZS5zZXREUFI9ZnVuY3Rpb24odCl7dGhpcy5kcHI9dH0sdC5wcm90b3R5cGUuc2V0Q29udGV4dD1mdW5jdGlvbih0KXt0aGlzLl9jdHg9dH0sdC5wcm90b3R5cGUuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdHh9LHQucHJvdG90eXBlLmJlZ2luUGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdHgmJnRoaXMuX2N0eC5iZWdpblBhdGgoKSx0aGlzLnJlc2V0KCksdGhpc30sdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9zYXZlRGF0YSYmKHRoaXMuX2xlbj0wKSx0aGlzLl9wYXRoU2VnTGVuJiYodGhpcy5fcGF0aFNlZ0xlbj1udWxsLHRoaXMuX3BhdGhMZW49MCksdGhpcy5fdmVyc2lvbisrfSx0LnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZHJhd1BlbmRpbmdQdCgpLHRoaXMuYWRkRGF0YShVYS5NLHQsZSksdGhpcy5fY3R4JiZ0aGlzLl9jdHgubW92ZVRvKHQsZSksdGhpcy5feDA9dCx0aGlzLl95MD1lLHRoaXMuX3hpPXQsdGhpcy5feWk9ZSx0aGlzfSx0LnByb3RvdHlwZS5saW5lVG89ZnVuY3Rpb24odCxlKXt2YXIgbj1pcyh0LXRoaXMuX3hpKSxpPWlzKGUtdGhpcy5feWkpLHI9bj50aGlzLl91eHx8aT50aGlzLl91eTtpZih0aGlzLmFkZERhdGEoVWEuTCx0LGUpLHRoaXMuX2N0eCYmciYmdGhpcy5fY3R4LmxpbmVUbyh0LGUpLHIpdGhpcy5feGk9dCx0aGlzLl95aT1lLHRoaXMuX3BlbmRpbmdQdERpc3Q9MDtlbHNle3ZhciBvPW4qbitpKmk7bz50aGlzLl9wZW5kaW5nUHREaXN0JiYodGhpcy5fcGVuZGluZ1B0WD10LHRoaXMuX3BlbmRpbmdQdFk9ZSx0aGlzLl9wZW5kaW5nUHREaXN0PW8pfXJldHVybiB0aGlzfSx0LnByb3RvdHlwZS5iZXppZXJDdXJ2ZVRvPWZ1bmN0aW9uKHQsZSxuLGkscixvKXtyZXR1cm4gdGhpcy5fZHJhd1BlbmRpbmdQdCgpLHRoaXMuYWRkRGF0YShVYS5DLHQsZSxuLGkscixvKSx0aGlzLl9jdHgmJnRoaXMuX2N0eC5iZXppZXJDdXJ2ZVRvKHQsZSxuLGkscixvKSx0aGlzLl94aT1yLHRoaXMuX3lpPW8sdGhpc30sdC5wcm90b3R5cGUucXVhZHJhdGljQ3VydmVUbz1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdGhpcy5fZHJhd1BlbmRpbmdQdCgpLHRoaXMuYWRkRGF0YShVYS5RLHQsZSxuLGkpLHRoaXMuX2N0eCYmdGhpcy5fY3R4LnF1YWRyYXRpY0N1cnZlVG8odCxlLG4saSksdGhpcy5feGk9bix0aGlzLl95aT1pLHRoaXN9LHQucHJvdG90eXBlLmFyYz1mdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fZHJhd1BlbmRpbmdQdCgpLHNzWzBdPWksc3NbMV09cix1cyhzcyxvKSxpPXNzWzBdO3ZhciBhPShyPXNzWzFdKS1pO3JldHVybiB0aGlzLmFkZERhdGEoVWEuQSx0LGUsbixuLGksYSwwLG8/MDoxKSx0aGlzLl9jdHgmJnRoaXMuX2N0eC5hcmModCxlLG4saSxyLG8pLHRoaXMuX3hpPWVzKHIpKm4rdCx0aGlzLl95aT1ucyhyKSpuK2UsdGhpc30sdC5wcm90b3R5cGUuYXJjVG89ZnVuY3Rpb24odCxlLG4saSxyKXtyZXR1cm4gdGhpcy5fZHJhd1BlbmRpbmdQdCgpLHRoaXMuX2N0eCYmdGhpcy5fY3R4LmFyY1RvKHQsZSxuLGksciksdGhpc30sdC5wcm90b3R5cGUucmVjdD1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdGhpcy5fZHJhd1BlbmRpbmdQdCgpLHRoaXMuX2N0eCYmdGhpcy5fY3R4LnJlY3QodCxlLG4saSksdGhpcy5hZGREYXRhKFVhLlIsdCxlLG4saSksdGhpc30sdC5wcm90b3R5cGUuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5fZHJhd1BlbmRpbmdQdCgpLHRoaXMuYWRkRGF0YShVYS5aKTt2YXIgdD10aGlzLl9jdHgsZT10aGlzLl94MCxuPXRoaXMuX3kwO3JldHVybiB0JiZ0LmNsb3NlUGF0aCgpLHRoaXMuX3hpPWUsdGhpcy5feWk9bix0aGlzfSx0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQpe3QmJnQuZmlsbCgpLHRoaXMudG9TdGF0aWMoKX0sdC5wcm90b3R5cGUuc3Ryb2tlPWZ1bmN0aW9uKHQpe3QmJnQuc3Ryb2tlKCksdGhpcy50b1N0YXRpYygpfSx0LnByb3RvdHlwZS5sZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVufSx0LnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO3RoaXMuZGF0YSYmdGhpcy5kYXRhLmxlbmd0aD09PWV8fCFhc3x8KHRoaXMuZGF0YT1uZXcgRmxvYXQzMkFycmF5KGUpKTtmb3IodmFyIG49MDtuPGU7bisrKXRoaXMuZGF0YVtuXT10W25dO3RoaXMuX2xlbj1lfSx0LnByb3RvdHlwZS5hcHBlbmRQYXRoPWZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBBcnJheXx8KHQ9W3RdKTtmb3IodmFyIGU9dC5sZW5ndGgsbj0wLGk9dGhpcy5fbGVuLHI9MDtyPGU7cisrKW4rPXRbcl0ubGVuKCk7YXMmJnRoaXMuZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSYmKHRoaXMuZGF0YT1uZXcgRmxvYXQzMkFycmF5KGkrbikpO2ZvcihyPTA7cjxlO3IrKylmb3IodmFyIG89dFtyXS5kYXRhLGE9MDthPG8ubGVuZ3RoO2ErKyl0aGlzLmRhdGFbaSsrXT1vW2FdO3RoaXMuX2xlbj1pfSx0LnByb3RvdHlwZS5hZGREYXRhPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyxsKXtpZih0aGlzLl9zYXZlRGF0YSl7dmFyIHU9dGhpcy5kYXRhO3RoaXMuX2xlbithcmd1bWVudHMubGVuZ3RoPnUubGVuZ3RoJiYodGhpcy5fZXhwYW5kRGF0YSgpLHU9dGhpcy5kYXRhKTtmb3IodmFyIGg9MDtoPGFyZ3VtZW50cy5sZW5ndGg7aCsrKXVbdGhpcy5fbGVuKytdPWFyZ3VtZW50c1toXX19LHQucHJvdG90eXBlLl9kcmF3UGVuZGluZ1B0PWZ1bmN0aW9uKCl7dGhpcy5fcGVuZGluZ1B0RGlzdD4wJiYodGhpcy5fY3R4JiZ0aGlzLl9jdHgubGluZVRvKHRoaXMuX3BlbmRpbmdQdFgsdGhpcy5fcGVuZGluZ1B0WSksdGhpcy5fcGVuZGluZ1B0RGlzdD0wKX0sdC5wcm90b3R5cGUuX2V4cGFuZERhdGE9ZnVuY3Rpb24oKXtpZighKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEFycmF5KSl7Zm9yKHZhciB0PVtdLGU9MDtlPHRoaXMuX2xlbjtlKyspdFtlXT10aGlzLmRhdGFbZV07dGhpcy5kYXRhPXR9fSx0LnByb3RvdHlwZS50b1N0YXRpYz1mdW5jdGlvbigpe2lmKHRoaXMuX3NhdmVEYXRhKXt0aGlzLl9kcmF3UGVuZGluZ1B0KCk7dmFyIHQ9dGhpcy5kYXRhO3QgaW5zdGFuY2VvZiBBcnJheSYmKHQubGVuZ3RoPXRoaXMuX2xlbixhcyYmdGhpcy5fbGVuPjExJiYodGhpcy5kYXRhPW5ldyBGbG9hdDMyQXJyYXkodCkpKX19LHQucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdD1mdW5jdGlvbigpe3FhWzBdPXFhWzFdPSRhWzBdPSRhWzFdPU51bWJlci5NQVhfVkFMVUUsS2FbMF09S2FbMV09SmFbMF09SmFbMV09LU51bWJlci5NQVhfVkFMVUU7dmFyIHQsZT10aGlzLmRhdGEsbj0wLGk9MCxyPTAsbz0wO2Zvcih0PTA7dDx0aGlzLl9sZW47KXt2YXIgYT1lW3QrK10scz0xPT09dDtzd2l0Y2gocyYmKHI9bj1lW3RdLG89aT1lW3QrMV0pLGEpe2Nhc2UgVWEuTTpuPXI9ZVt0KytdLGk9bz1lW3QrK10sJGFbMF09ciwkYVsxXT1vLEphWzBdPXIsSmFbMV09bzticmVhaztjYXNlIFVhLkw6RmEobixpLGVbdF0sZVt0KzFdLCRhLEphKSxuPWVbdCsrXSxpPWVbdCsrXTticmVhaztjYXNlIFVhLkM6SGEobixpLGVbdCsrXSxlW3QrK10sZVt0KytdLGVbdCsrXSxlW3RdLGVbdCsxXSwkYSxKYSksbj1lW3QrK10saT1lW3QrK107YnJlYWs7Y2FzZSBVYS5ROllhKG4saSxlW3QrK10sZVt0KytdLGVbdF0sZVt0KzFdLCRhLEphKSxuPWVbdCsrXSxpPWVbdCsrXTticmVhaztjYXNlIFVhLkE6dmFyIGw9ZVt0KytdLHU9ZVt0KytdLGg9ZVt0KytdLGM9ZVt0KytdLHA9ZVt0KytdLGQ9ZVt0KytdK3A7dCs9MTt2YXIgZj0hZVt0KytdO3MmJihyPWVzKHApKmgrbCxvPW5zKHApKmMrdSksWGEobCx1LGgsYyxwLGQsZiwkYSxKYSksbj1lcyhkKSpoK2wsaT1ucyhkKSpjK3U7YnJlYWs7Y2FzZSBVYS5SOkZhKHI9bj1lW3QrK10sbz1pPWVbdCsrXSxyK2VbdCsrXSxvK2VbdCsrXSwkYSxKYSk7YnJlYWs7Y2FzZSBVYS5aOm49cixpPW99SHQocWEscWEsJGEpLFl0KEthLEthLEphKX1yZXR1cm4gMD09PXQmJihxYVswXT1xYVsxXT1LYVswXT1LYVsxXT0wKSxuZXcgemUocWFbMF0scWFbMV0sS2FbMF0tcWFbMF0sS2FbMV0tcWFbMV0pfSx0LnByb3RvdHlwZS5fY2FsY3VsYXRlTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhLGU9dGhpcy5fbGVuLG49dGhpcy5fdXgsaT10aGlzLl91eSxyPTAsbz0wLGE9MCxzPTA7dGhpcy5fcGF0aFNlZ0xlbnx8KHRoaXMuX3BhdGhTZWdMZW49W10pO2Zvcih2YXIgbD10aGlzLl9wYXRoU2VnTGVuLHU9MCxoPTAsYz0wO2M8ZTspe3ZhciBwPXRbYysrXSxkPTE9PT1jO2QmJihhPXI9dFtjXSxzPW89dFtjKzFdKTt2YXIgZj0tMTtzd2l0Y2gocCl7Y2FzZSBVYS5NOnI9YT10W2MrK10sbz1zPXRbYysrXTticmVhaztjYXNlIFVhLkw6dmFyIGc9dFtjKytdLHk9KHg9dFtjKytdKS1vOyhpcyhBPWctcik+bnx8aXMoeSk+aXx8Yz09PWUtMSkmJihmPU1hdGguc3FydChBKkEreSp5KSxyPWcsbz14KTticmVhaztjYXNlIFVhLkM6dmFyIHY9dFtjKytdLG09dFtjKytdLHg9KGc9dFtjKytdLHRbYysrXSksXz10W2MrK10sYj10W2MrK107Zj1NbihyLG8sdixtLGcseCxfLGIsMTApLHI9XyxvPWI7YnJlYWs7Y2FzZSBVYS5ROmY9a24ocixvLHY9dFtjKytdLG09dFtjKytdLGc9dFtjKytdLHg9dFtjKytdLDEwKSxyPWcsbz14O2JyZWFrO2Nhc2UgVWEuQTp2YXIgdz10W2MrK10sUz10W2MrK10sTT10W2MrK10sST10W2MrK10sVD10W2MrK10sQz10W2MrK10sRD1DK1Q7Yys9MSxkJiYoYT1lcyhUKSpNK3cscz1ucyhUKSpJK1MpLGY9dHMoTSxJKSpRYShvcyxNYXRoLmFicyhDKSkscj1lcyhEKSpNK3csbz1ucyhEKSpJK1M7YnJlYWs7Y2FzZSBVYS5SOmE9cj10W2MrK10scz1vPXRbYysrXSxmPTIqdFtjKytdKzIqdFtjKytdO2JyZWFrO2Nhc2UgVWEuWjp2YXIgQT1hLXI7eT1zLW87Zj1NYXRoLnNxcnQoQSpBK3kqeSkscj1hLG89c31mPj0wJiYobFtoKytdPWYsdSs9Zil9cmV0dXJuIHRoaXMuX3BhdGhMZW49dSx1fSx0LnByb3RvdHlwZS5yZWJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLGEscyxsLHUsaCxjLHA9dGhpcy5kYXRhLGQ9dGhpcy5fdXgsZj10aGlzLl91eSxnPXRoaXMuX2xlbix5PWU8MSx2PTAsbT0wLHg9MDtpZigheXx8KHRoaXMuX3BhdGhTZWdMZW58fHRoaXMuX2NhbGN1bGF0ZUxlbmd0aCgpLGw9dGhpcy5fcGF0aFNlZ0xlbix1PWUqdGhpcy5fcGF0aExlbikpdDpmb3IodmFyIF89MDtfPGc7KXt2YXIgYj1wW18rK10sdz0xPT09Xztzd2l0Y2godyYmKG49cj1wW19dLGk9bz1wW18rMV0pLGIhPT1VYS5MJiZ4PjAmJih0LmxpbmVUbyhoLGMpLHg9MCksYil7Y2FzZSBVYS5NOm49cj1wW18rK10saT1vPXBbXysrXSx0Lm1vdmVUbyhyLG8pO2JyZWFrO2Nhc2UgVWEuTDphPXBbXysrXSxzPXBbXysrXTt2YXIgUz1pcyhhLXIpLE09aXMocy1vKTtpZihTPmR8fE0+Zil7aWYoeSl7aWYodisoaj1sW20rK10pPnUpe3ZhciBJPSh1LXYpL2o7dC5saW5lVG8ociooMS1JKSthKkksbyooMS1JKStzKkkpO2JyZWFrIHR9dis9an10LmxpbmVUbyhhLHMpLHI9YSxvPXMseD0wfWVsc2V7dmFyIFQ9UypTK00qTTtUPngmJihoPWEsYz1zLHg9VCl9YnJlYWs7Y2FzZSBVYS5DOnZhciBDPXBbXysrXSxEPXBbXysrXSxBPXBbXysrXSxrPXBbXysrXSxMPXBbXysrXSxQPXBbXysrXTtpZih5KXtpZih2KyhqPWxbbSsrXSk+dSl7d24ocixDLEEsTCxJPSh1LXYpL2osWmEpLHduKG8sRCxrLFAsSSxqYSksdC5iZXppZXJDdXJ2ZVRvKFphWzFdLGphWzFdLFphWzJdLGphWzJdLFphWzNdLGphWzNdKTticmVhayB0fXYrPWp9dC5iZXppZXJDdXJ2ZVRvKEMsRCxBLGssTCxQKSxyPUwsbz1QO2JyZWFrO2Nhc2UgVWEuUTpDPXBbXysrXSxEPXBbXysrXSxBPXBbXysrXSxrPXBbXysrXTtpZih5KXtpZih2KyhqPWxbbSsrXSk+dSl7RG4ocixDLEEsST0odS12KS9qLFphKSxEbihvLEQsayxJLGphKSx0LnF1YWRyYXRpY0N1cnZlVG8oWmFbMV0samFbMV0sWmFbMl0samFbMl0pO2JyZWFrIHR9dis9an10LnF1YWRyYXRpY0N1cnZlVG8oQyxELEEsaykscj1BLG89azticmVhaztjYXNlIFVhLkE6dmFyIE89cFtfKytdLFI9cFtfKytdLE49cFtfKytdLEU9cFtfKytdLHo9cFtfKytdLFY9cFtfKytdLEI9cFtfKytdLEY9IXBbXysrXSxHPU4+RT9OOkUsVz1pcyhOLUUpPi4wMDEsSD16K1YsWT0hMTtpZih5KXYrKGo9bFttKytdKT51JiYoSD16K1YqKHUtdikvaixZPSEwKSx2Kz1qO2lmKFcmJnQuZWxsaXBzZT90LmVsbGlwc2UoTyxSLE4sRSxCLHosSCxGKTp0LmFyYyhPLFIsRyx6LEgsRiksWSlicmVhayB0O3cmJihuPWVzKHopKk4rTyxpPW5zKHopKkUrUikscj1lcyhIKSpOK08sbz1ucyhIKSpFK1I7YnJlYWs7Y2FzZSBVYS5SOm49cj1wW19dLGk9bz1wW18rMV0sYT1wW18rK10scz1wW18rK107dmFyIFg9cFtfKytdLFU9cFtfKytdO2lmKHkpe2lmKHYrKGo9bFttKytdKT51KXt2YXIgWj11LXY7dC5tb3ZlVG8oYSxzKSx0LmxpbmVUbyhhK1FhKFosWCkscyksKFotPVgpPjAmJnQubGluZVRvKGErWCxzK1FhKFosVSkpLChaLT1VKT4wJiZ0LmxpbmVUbyhhK3RzKFgtWiwwKSxzK1UpLChaLT1YKT4wJiZ0LmxpbmVUbyhhLHMrdHMoVS1aLDApKTticmVhayB0fXYrPWp9dC5yZWN0KGEscyxYLFUpO2JyZWFrO2Nhc2UgVWEuWjppZih5KXt2YXIgajtpZih2KyhqPWxbbSsrXSk+dSl7ST0odS12KS9qO3QubGluZVRvKHIqKDEtSSkrbipJLG8qKDEtSSkraSpJKTticmVhayB0fXYrPWp9dC5jbG9zZVBhdGgoKSxyPW4sbz1pfX19LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQsbj10aGlzLmRhdGE7cmV0dXJuIGUuZGF0YT1uLnNsaWNlP24uc2xpY2UoKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKSxlLl9sZW49dGhpcy5fbGVuLGV9LHQuQ01EPVVhLHQuaW5pdERlZmF1bHRQcm9wcz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlO2UuX3NhdmVEYXRhPSEwLGUuX3V4PTAsZS5fdXk9MCxlLl9wZW5kaW5nUHREaXN0PTAsZS5fdmVyc2lvbj0wfSgpLHR9KCk7ZnVuY3Rpb24gY3ModCxlLG4saSxyLG8sYSl7aWYoMD09PXIpcmV0dXJuITE7dmFyIHM9cixsPTA7aWYoYT5lK3MmJmE+aStzfHxhPGUtcyYmYTxpLXN8fG8+dCtzJiZvPm4rc3x8bzx0LXMmJm88bi1zKXJldHVybiExO2lmKHQ9PT1uKXJldHVybiBNYXRoLmFicyhvLXQpPD1zLzI7dmFyIHU9KGw9KGUtaSkvKHQtbikpKm8tYSsodCppLW4qZSkvKHQtbik7cmV0dXJuIHUqdS8obCpsKzEpPD1zLzIqcy8yfWZ1bmN0aW9uIHBzKHQsZSxuLGkscixvLGEscyxsLHUsaCl7aWYoMD09PWwpcmV0dXJuITE7dmFyIGM9bDtyZXR1cm4hKGg+ZStjJiZoPmkrYyYmaD5vK2MmJmg+cytjfHxoPGUtYyYmaDxpLWMmJmg8by1jJiZoPHMtY3x8dT50K2MmJnU+bitjJiZ1PnIrYyYmdT5hK2N8fHU8dC1jJiZ1PG4tYyYmdTxyLWMmJnU8YS1jKSYmU24odCxlLG4saSxyLG8sYSxzLHUsaCxudWxsKTw9Yy8yfWZ1bmN0aW9uIGRzKHQsZSxuLGkscixvLGEscyxsKXtpZigwPT09YSlyZXR1cm4hMTt2YXIgdT1hO3JldHVybiEobD5lK3UmJmw+aSt1JiZsPm8rdXx8bDxlLXUmJmw8aS11JiZsPG8tdXx8cz50K3UmJnM+bit1JiZzPnIrdXx8czx0LXUmJnM8bi11JiZzPHItdSkmJkFuKHQsZSxuLGkscixvLHMsbCxudWxsKTw9dS8yfXZhciBmcz0yKk1hdGguUEk7ZnVuY3Rpb24gZ3ModCl7cmV0dXJuKHQlPWZzKTwwJiYodCs9ZnMpLHR9dmFyIHlzPTIqTWF0aC5QSTtmdW5jdGlvbiB2cyh0LGUsbixpLHIsbyxhLHMsbCl7aWYoMD09PWEpcmV0dXJuITE7dmFyIHU9YTtzLT10LGwtPWU7dmFyIGg9TWF0aC5zcXJ0KHMqcytsKmwpO2lmKGgtdT5ufHxoK3U8bilyZXR1cm4hMTtpZihNYXRoLmFicyhpLXIpJXlzPDFlLTQpcmV0dXJuITA7aWYobyl7dmFyIGM9aTtpPWdzKHIpLHI9Z3MoYyl9ZWxzZSBpPWdzKGkpLHI9Z3Mocik7aT5yJiYocis9eXMpO3ZhciBwPU1hdGguYXRhbjIobCxzKTtyZXR1cm4gcDwwJiYocCs9eXMpLHA+PWkmJnA8PXJ8fHAreXM+PWkmJnAreXM8PXJ9ZnVuY3Rpb24gbXModCxlLG4saSxyLG8pe2lmKG8+ZSYmbz5pfHxvPGUmJm88aSlyZXR1cm4gMDtpZihpPT09ZSlyZXR1cm4gMDt2YXIgYT0oby1lKS8oaS1lKSxzPWk8ZT8xOi0xOzEhPT1hJiYwIT09YXx8KHM9aTxlPy41Oi0uNSk7dmFyIGw9YSoobi10KSt0O3JldHVybiBsPT09cj8xLzA6bD5yP3M6MH12YXIgeHM9aHMuQ01ELF9zPTIqTWF0aC5QSTt2YXIgYnM9Wy0xLC0xLC0xXSx3cz1bLTEsLTFdO2Z1bmN0aW9uIFNzKHQsZSxuLGkscixvLGEscyxsLHUpe2lmKHU+ZSYmdT5pJiZ1Pm8mJnU+c3x8dTxlJiZ1PGkmJnU8byYmdTxzKXJldHVybiAwO3ZhciBoLGM9X24oZSxpLG8scyx1LGJzKTtpZigwPT09YylyZXR1cm4gMDtmb3IodmFyIHA9MCxkPS0xLGY9dm9pZCAwLGc9dm9pZCAwLHk9MDt5PGM7eSsrKXt2YXIgdj1ic1t5XSxtPTA9PT12fHwxPT09dj8uNToxO21uKHQsbixyLGEsdik8bHx8KGQ8MCYmKGQ9Ym4oZSxpLG8scyx3cyksd3NbMV08d3NbMF0mJmQ+MSYmKGg9dm9pZCAwLGg9d3NbMF0sd3NbMF09d3NbMV0sd3NbMV09aCksZj1tbihlLGksbyxzLHdzWzBdKSxkPjEmJihnPW1uKGUsaSxvLHMsd3NbMV0pKSksMj09PWQ/djx3c1swXT9wKz1mPGU/bTotbTp2PHdzWzFdP3ArPWc8Zj9tOi1tOnArPXM8Zz9tOi1tOnY8d3NbMF0/cCs9ZjxlP206LW06cCs9czxmP206LW0pfXJldHVybiBwfWZ1bmN0aW9uIE1zKHQsZSxuLGkscixvLGEscyl7aWYocz5lJiZzPmkmJnM+b3x8czxlJiZzPGkmJnM8bylyZXR1cm4gMDt2YXIgbD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXQtMiplK24sYT0yKihlLXQpLHM9dC1pLGw9MDtpZih5bihvKSl2bihhKSYmKGg9LXMvYSk+PTAmJmg8PTEmJihyW2wrK109aCk7ZWxzZXt2YXIgdT1hKmEtNCpvKnM7aWYoeW4odSkpKGg9LWEvKDIqbykpPj0wJiZoPD0xJiYocltsKytdPWgpO2Vsc2UgaWYodT4wKXt2YXIgaCxjPWxuKHUpLHA9KC1hLWMpLygyKm8pOyhoPSgtYStjKS8oMipvKSk+PTAmJmg8PTEmJihyW2wrK109aCkscD49MCYmcDw9MSYmKHJbbCsrXT1wKX19cmV0dXJuIGx9KGUsaSxvLHMsYnMpO2lmKDA9PT1sKXJldHVybiAwO3ZhciB1PUNuKGUsaSxvKTtpZih1Pj0wJiZ1PD0xKXtmb3IodmFyIGg9MCxjPUluKGUsaSxvLHUpLHA9MDtwPGw7cCsrKXt2YXIgZD0wPT09YnNbcF18fDE9PT1ic1twXT8uNToxO0luKHQsbixyLGJzW3BdKTxhfHwoYnNbcF08dT9oKz1jPGU/ZDotZDpoKz1vPGM/ZDotZCl9cmV0dXJuIGh9ZD0wPT09YnNbMF18fDE9PT1ic1swXT8uNToxO3JldHVybiBJbih0LG4scixic1swXSk8YT8wOm88ZT9kOi1kfWZ1bmN0aW9uIElzKHQsZSxuLGkscixvLGEscyl7aWYoKHMtPWUpPm58fHM8LW4pcmV0dXJuIDA7dmFyIGw9TWF0aC5zcXJ0KG4qbi1zKnMpO2JzWzBdPS1sLGJzWzFdPWw7dmFyIHU9TWF0aC5hYnMoaS1yKTtpZih1PDFlLTQpcmV0dXJuIDA7aWYodT49X3MtMWUtNCl7aT0wLHI9X3M7dmFyIGg9bz8xOi0xO3JldHVybiBhPj1ic1swXSt0JiZhPD1ic1sxXSt0P2g6MH1pZihpPnIpe3ZhciBjPWk7aT1yLHI9Y31pPDAmJihpKz1fcyxyKz1fcyk7Zm9yKHZhciBwPTAsZD0wO2Q8MjtkKyspe3ZhciBmPWJzW2RdO2lmKGYrdD5hKXt2YXIgZz1NYXRoLmF0YW4yKHMsZik7aD1vPzE6LTE7ZzwwJiYoZz1fcytnKSwoZz49aSYmZzw9cnx8Zytfcz49aSYmZytfczw9cikmJihnPk1hdGguUEkvMiYmZzwxLjUqTWF0aC5QSSYmKGg9LWgpLHArPWgpfX1yZXR1cm4gcH1mdW5jdGlvbiBUcyh0LGUsbixpLHIpe2Zvcih2YXIgbyxhLHMsbCx1PXQuZGF0YSxoPXQubGVuKCksYz0wLHA9MCxkPTAsZj0wLGc9MCx5PTA7eTxoOyl7dmFyIHY9dVt5KytdLG09MT09PXk7c3dpdGNoKHY9PT14cy5NJiZ5PjEmJihufHwoYys9bXMocCxkLGYsZyxpLHIpKSksbSYmKGY9cD11W3ldLGc9ZD11W3krMV0pLHYpe2Nhc2UgeHMuTTpwPWY9dVt5KytdLGQ9Zz11W3krK107YnJlYWs7Y2FzZSB4cy5MOmlmKG4pe2lmKGNzKHAsZCx1W3ldLHVbeSsxXSxlLGkscikpcmV0dXJuITB9ZWxzZSBjKz1tcyhwLGQsdVt5XSx1W3krMV0saSxyKXx8MDtwPXVbeSsrXSxkPXVbeSsrXTticmVhaztjYXNlIHhzLkM6aWYobil7aWYocHMocCxkLHVbeSsrXSx1W3krK10sdVt5KytdLHVbeSsrXSx1W3ldLHVbeSsxXSxlLGkscikpcmV0dXJuITB9ZWxzZSBjKz1TcyhwLGQsdVt5KytdLHVbeSsrXSx1W3krK10sdVt5KytdLHVbeV0sdVt5KzFdLGkscil8fDA7cD11W3krK10sZD11W3krK107YnJlYWs7Y2FzZSB4cy5ROmlmKG4pe2lmKGRzKHAsZCx1W3krK10sdVt5KytdLHVbeV0sdVt5KzFdLGUsaSxyKSlyZXR1cm4hMH1lbHNlIGMrPU1zKHAsZCx1W3krK10sdVt5KytdLHVbeV0sdVt5KzFdLGkscil8fDA7cD11W3krK10sZD11W3krK107YnJlYWs7Y2FzZSB4cy5BOnZhciB4PXVbeSsrXSxfPXVbeSsrXSxiPXVbeSsrXSx3PXVbeSsrXSxTPXVbeSsrXSxNPXVbeSsrXTt5Kz0xO3ZhciBJPSEhKDEtdVt5KytdKTtvPU1hdGguY29zKFMpKmIreCxhPU1hdGguc2luKFMpKncrXyxtPyhmPW8sZz1hKTpjKz1tcyhwLGQsbyxhLGkscik7dmFyIFQ9KGkteCkqdy9iK3g7aWYobil7aWYodnMoeCxfLHcsUyxTK00sSSxlLFQscikpcmV0dXJuITB9ZWxzZSBjKz1Jcyh4LF8sdyxTLFMrTSxJLFQscik7cD1NYXRoLmNvcyhTK00pKmIreCxkPU1hdGguc2luKFMrTSkqdytfO2JyZWFrO2Nhc2UgeHMuUjppZihmPXA9dVt5KytdLGc9ZD11W3krK10sbz1mK3VbeSsrXSxhPWcrdVt5KytdLG4pe2lmKGNzKGYsZyxvLGcsZSxpLHIpfHxjcyhvLGcsbyxhLGUsaSxyKXx8Y3MobyxhLGYsYSxlLGkscil8fGNzKGYsYSxmLGcsZSxpLHIpKXJldHVybiEwfWVsc2UgYys9bXMobyxnLG8sYSxpLHIpLGMrPW1zKGYsYSxmLGcsaSxyKTticmVhaztjYXNlIHhzLlo6aWYobil7aWYoY3MocCxkLGYsZyxlLGkscikpcmV0dXJuITB9ZWxzZSBjKz1tcyhwLGQsZixnLGkscik7cD1mLGQ9Z319cmV0dXJuIG58fChzPWQsbD1nLE1hdGguYWJzKHMtbCk8MWUtNCl8fChjKz1tcyhwLGQsZixnLGkscil8fDApLDAhPT1jfXZhciBDcz1rKHtmaWxsOiIjMDAwIixzdHJva2U6bnVsbCxzdHJva2VQZXJjZW50OjEsZmlsbE9wYWNpdHk6MSxzdHJva2VPcGFjaXR5OjEsbGluZURhc2hPZmZzZXQ6MCxsaW5lV2lkdGg6MSxsaW5lQ2FwOiJidXR0IixtaXRlckxpbWl0OjEwLHN0cm9rZU5vU2NhbGU6ITEsc3Ryb2tlRmlyc3Q6ITF9LE1hKSxEcz17c3R5bGU6ayh7ZmlsbDohMCxzdHJva2U6ITAsc3Ryb2tlUGVyY2VudDohMCxmaWxsT3BhY2l0eTohMCxzdHJva2VPcGFjaXR5OiEwLGxpbmVEYXNoT2Zmc2V0OiEwLGxpbmVXaWR0aDohMCxtaXRlckxpbWl0OiEwfSxJYS5zdHlsZSl9LEFzPW1yLmNvbmNhdChbImludmlzaWJsZSIsImN1bGxpbmciLCJ6IiwiejIiLCJ6bGV2ZWwiLCJwYXJlbnQiXSksa3M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSl8fHRoaXN9dmFyIGk7cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3QucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpO3ZhciBpPXRoaXMuc3R5bGU7aWYoaS5kZWNhbCl7dmFyIHI9dGhpcy5fZGVjYWxFbD10aGlzLl9kZWNhbEVsfHxuZXcgZTtyLmJ1aWxkUGF0aD09PWUucHJvdG90eXBlLmJ1aWxkUGF0aCYmKHIuYnVpbGRQYXRoPWZ1bmN0aW9uKHQpe24uYnVpbGRQYXRoKHQsbi5zaGFwZSl9KSxyLnNpbGVudD0hMDt2YXIgbz1yLnN0eWxlO2Zvcih2YXIgYSBpbiBpKW9bYV0hPT1pW2FdJiYob1thXT1pW2FdKTtvLmZpbGw9aS5maWxsP2kuZGVjYWw6bnVsbCxvLmRlY2FsPW51bGwsby5zaGFkb3dDb2xvcj1udWxsLGkuc3Ryb2tlRmlyc3QmJihvLnN0cm9rZT1udWxsKTtmb3IodmFyIHM9MDtzPEFzLmxlbmd0aDsrK3MpcltBc1tzXV09dGhpc1tBc1tzXV07ci5fX2RpcnR5fD0xfWVsc2UgdGhpcy5fZGVjYWxFbCYmKHRoaXMuX2RlY2FsRWw9bnVsbCl9LGUucHJvdG90eXBlLmdldERlY2FsRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWNhbEVsfSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihlKXt2YXIgbj1HKGUpO3RoaXMuc2hhcGU9dGhpcy5nZXREZWZhdWx0U2hhcGUoKTt2YXIgaT10aGlzLmdldERlZmF1bHRTdHlsZSgpO2kmJnRoaXMudXNlU3R5bGUoaSk7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl0sYT1lW29dOyJzdHlsZSI9PT1vP3RoaXMuc3R5bGU/QSh0aGlzLnN0eWxlLGEpOnRoaXMudXNlU3R5bGUoYSk6InNoYXBlIj09PW8/QSh0aGlzLnNoYXBlLGEpOnQucHJvdG90eXBlLmF0dHJLVi5jYWxsKHRoaXMsbyxhKX10aGlzLnN0eWxlfHx0aGlzLnVzZVN0eWxlKHt9KX0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybnt9fSxlLnByb3RvdHlwZS5jYW5CZUluc2lkZVRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNGaWxsKCl9LGUucHJvdG90eXBlLmdldEluc2lkZVRleHRGaWxsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdHlsZS5maWxsO2lmKCJub25lIiE9PXQpe2lmKFUodCkpe3ZhciBlPW9pKHQsMCk7cmV0dXJuIGU+LjU/bHI6ZT4uMj8iI2VlZSI6dXJ9aWYodClyZXR1cm4gdXJ9cmV0dXJuIGxyfSxlLnByb3RvdHlwZS5nZXRJbnNpZGVUZXh0U3Ryb2tlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3R5bGUuZmlsbDtpZihVKGUpKXt2YXIgbj10aGlzLl9fenI7aWYoISghbnx8IW4uaXNEYXJrTW9kZSgpKT09PW9pKHQsMCk8LjQpcmV0dXJuIGV9fSxlLnByb3RvdHlwZS5idWlsZFBhdGg9ZnVuY3Rpb24odCxlLG4pe30sZS5wcm90b3R5cGUucGF0aFVwZGF0ZWQ9ZnVuY3Rpb24oKXt0aGlzLl9fZGlydHkmPS01fSxlLnByb3RvdHlwZS5nZXRVcGRhdGVkUGF0aFByb3h5PWZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLnBhdGgmJnRoaXMuY3JlYXRlUGF0aFByb3h5KCksdGhpcy5wYXRoLmJlZ2luUGF0aCgpLHRoaXMuYnVpbGRQYXRoKHRoaXMucGF0aCx0aGlzLnNoYXBlLHQpLHRoaXMucGF0aH0sZS5wcm90b3R5cGUuY3JlYXRlUGF0aFByb3h5PWZ1bmN0aW9uKCl7dGhpcy5wYXRoPW5ldyBocyghMSl9LGUucHJvdG90eXBlLmhhc1N0cm9rZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGUsZT10LnN0cm9rZTtyZXR1cm4hKG51bGw9PWV8fCJub25lIj09PWV8fCEodC5saW5lV2lkdGg+MCkpfSxlLnByb3RvdHlwZS5oYXNGaWxsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdHlsZS5maWxsO3JldHVybiBudWxsIT10JiYibm9uZSIhPT10fSxlLnByb3RvdHlwZS5nZXRCb3VuZGluZ1JlY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWN0LGU9dGhpcy5zdHlsZSxuPSF0O2lmKG4pe3ZhciBpPSExO3RoaXMucGF0aHx8KGk9ITAsdGhpcy5jcmVhdGVQYXRoUHJveHkoKSk7dmFyIHI9dGhpcy5wYXRoOyhpfHw0JnRoaXMuX19kaXJ0eSkmJihyLmJlZ2luUGF0aCgpLHRoaXMuYnVpbGRQYXRoKHIsdGhpcy5zaGFwZSwhMSksdGhpcy5wYXRoVXBkYXRlZCgpKSx0PXIuZ2V0Qm91bmRpbmdSZWN0KCl9aWYodGhpcy5fcmVjdD10LHRoaXMuaGFzU3Ryb2tlKCkmJnRoaXMucGF0aCYmdGhpcy5wYXRoLmxlbigpPjApe3ZhciBvPXRoaXMuX3JlY3RTdHJva2V8fCh0aGlzLl9yZWN0U3Ryb2tlPXQuY2xvbmUoKSk7aWYodGhpcy5fX2RpcnR5fHxuKXtvLmNvcHkodCk7dmFyIGE9ZS5zdHJva2VOb1NjYWxlP3RoaXMuZ2V0TGluZVNjYWxlKCk6MSxzPWUubGluZVdpZHRoO2lmKCF0aGlzLmhhc0ZpbGwoKSl7dmFyIGw9dGhpcy5zdHJva2VDb250YWluVGhyZXNob2xkO3M9TWF0aC5tYXgocyxudWxsPT1sPzQ6bCl9YT4xZS0xMCYmKG8ud2lkdGgrPXMvYSxvLmhlaWdodCs9cy9hLG8ueC09cy9hLzIsby55LT1zL2EvMil9cmV0dXJuIG99cmV0dXJuIHR9LGUucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0LGUpLGk9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSxyPXRoaXMuc3R5bGU7aWYodD1uWzBdLGU9blsxXSxpLmNvbnRhaW4odCxlKSl7dmFyIG89dGhpcy5wYXRoO2lmKHRoaXMuaGFzU3Ryb2tlKCkpe3ZhciBhPXIubGluZVdpZHRoLHM9ci5zdHJva2VOb1NjYWxlP3RoaXMuZ2V0TGluZVNjYWxlKCk6MTtpZihzPjFlLTEwJiYodGhpcy5oYXNGaWxsKCl8fChhPU1hdGgubWF4KGEsdGhpcy5zdHJva2VDb250YWluVGhyZXNob2xkKSksZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIFRzKHQsZSwhMCxuLGkpfShvLGEvcyx0LGUpKSlyZXR1cm4hMH1pZih0aGlzLmhhc0ZpbGwoKSlyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3JldHVybiBUcyh0LDAsITEsZSxuKX0obyx0LGUpfXJldHVybiExfSxlLnByb3RvdHlwZS5kaXJ0eVNoYXBlPWZ1bmN0aW9uKCl7dGhpcy5fX2RpcnR5fD00LHRoaXMuX3JlY3QmJih0aGlzLl9yZWN0PW51bGwpLHRoaXMuX2RlY2FsRWwmJnRoaXMuX2RlY2FsRWwuZGlydHlTaGFwZSgpLHRoaXMubWFya1JlZHJhdygpfSxlLnByb3RvdHlwZS5kaXJ0eT1mdW5jdGlvbigpe3RoaXMuZGlydHlTdHlsZSgpLHRoaXMuZGlydHlTaGFwZSgpfSxlLnByb3RvdHlwZS5hbmltYXRlU2hhcGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5pbWF0ZSgic2hhcGUiLHQpfSxlLnByb3RvdHlwZS51cGRhdGVEdXJpbmdBbmltYXRpb249ZnVuY3Rpb24odCl7InN0eWxlIj09PXQ/dGhpcy5kaXJ0eVN0eWxlKCk6InNoYXBlIj09PXQ/dGhpcy5kaXJ0eVNoYXBlKCk6dGhpcy5tYXJrUmVkcmF3KCl9LGUucHJvdG90eXBlLmF0dHJLVj1mdW5jdGlvbihlLG4peyJzaGFwZSI9PT1lP3RoaXMuc2V0U2hhcGUobik6dC5wcm90b3R5cGUuYXR0cktWLmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5zZXRTaGFwZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc2hhcGU7cmV0dXJuIG58fChuPXRoaXMuc2hhcGU9e30pLCJzdHJpbmciPT10eXBlb2YgdD9uW3RdPWU6QShuLHQpLHRoaXMuZGlydHlTaGFwZSgpLHRoaXN9LGUucHJvdG90eXBlLnNoYXBlQ2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiEhKDQmdGhpcy5fX2RpcnR5KX0sZS5wcm90b3R5cGUuY3JlYXRlU3R5bGU9ZnVuY3Rpb24odCl7cmV0dXJuIG10KENzLHQpfSxlLnByb3RvdHlwZS5faW5uZXJTYXZlVG9Ob3JtYWw9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX2lubmVyU2F2ZVRvTm9ybWFsLmNhbGwodGhpcyxlKTt2YXIgbj10aGlzLl9ub3JtYWxTdGF0ZTtlLnNoYXBlJiYhbi5zaGFwZSYmKG4uc2hhcGU9QSh7fSx0aGlzLnNoYXBlKSl9LGUucHJvdG90eXBlLl9hcHBseVN0YXRlT2JqPWZ1bmN0aW9uKGUsbixpLHIsbyxhKXt0LnByb3RvdHlwZS5fYXBwbHlTdGF0ZU9iai5jYWxsKHRoaXMsZSxuLGkscixvLGEpO3ZhciBzLGw9IShuJiZyKTtpZihuJiZuLnNoYXBlP28/cj9zPW4uc2hhcGU6KHM9QSh7fSxpLnNoYXBlKSxBKHMsbi5zaGFwZSkpOihzPUEoe30scj90aGlzLnNoYXBlOmkuc2hhcGUpLEEocyxuLnNoYXBlKSk6bCYmKHM9aS5zaGFwZSkscylpZihvKXt0aGlzLnNoYXBlPUEoe30sdGhpcy5zaGFwZSk7Zm9yKHZhciB1PXt9LGg9RyhzKSxjPTA7YzxoLmxlbmd0aDtjKyspe3ZhciBwPWhbY107Im9iamVjdCI9PXR5cGVvZiBzW3BdP3RoaXMuc2hhcGVbcF09c1twXTp1W3BdPXNbcF19dGhpcy5fdHJhbnNpdGlvblN0YXRlKGUse3NoYXBlOnV9LGEpfWVsc2UgdGhpcy5zaGFwZT1zLHRoaXMuZGlydHlTaGFwZSgpfSxlLnByb3RvdHlwZS5fbWVyZ2VTdGF0ZXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLGk9dC5wcm90b3R5cGUuX21lcmdlU3RhdGVzLmNhbGwodGhpcyxlKSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBvPWVbcl07by5zaGFwZSYmKG49bnx8e30sdGhpcy5fbWVyZ2VTdHlsZShuLG8uc2hhcGUpKX1yZXR1cm4gbiYmKGkuc2hhcGU9biksaX0sZS5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uU3R5bGVQcm9wcz1mdW5jdGlvbigpe3JldHVybiBEc30sZS5wcm90b3R5cGUuaXNaZXJvQXJlYT1mdW5jdGlvbigpe3JldHVybiExfSxlLmV4dGVuZD1mdW5jdGlvbih0KXt2YXIgaT1mdW5jdGlvbihlKXtmdW5jdGlvbiBpKG4pe3ZhciBpPWUuY2FsbCh0aGlzLG4pfHx0aGlzO3JldHVybiB0LmluaXQmJnQuaW5pdC5jYWxsKGksbiksaX1yZXR1cm4gbihpLGUpLGkucHJvdG90eXBlLmdldERlZmF1bHRTdHlsZT1mdW5jdGlvbigpe3JldHVybiBUKHQuc3R5bGUpfSxpLnByb3RvdHlwZS5nZXREZWZhdWx0U2hhcGU9ZnVuY3Rpb24oKXtyZXR1cm4gVCh0LnNoYXBlKX0saX0oZSk7Zm9yKHZhciByIGluIHQpImZ1bmN0aW9uIj09dHlwZW9mIHRbcl0mJihpLnByb3RvdHlwZVtyXT10W3JdKTtyZXR1cm4gaX0sZS5pbml0RGVmYXVsdFByb3BzPSgoaT1lLnByb3RvdHlwZSkudHlwZT0icGF0aCIsaS5zdHJva2VDb250YWluVGhyZXNob2xkPTUsaS5zZWdtZW50SWdub3JlVGhyZXNob2xkPTAsaS5zdWJQaXhlbE9wdGltaXplPSExLGkuYXV0b0JhdGNoPSExLHZvaWQoaS5fX2RpcnR5PTcpKSxlfShEYSksTHM9ayh7c3Ryb2tlRmlyc3Q6ITAsZm9udDphLHg6MCx5OjAsdGV4dEFsaWduOiJsZWZ0Iix0ZXh0QmFzZWxpbmU6InRvcCIsbWl0ZXJMaW1pdDoyfSxDcyksUHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5oYXNTdHJva2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0eWxlLGU9dC5zdHJva2U7cmV0dXJuIG51bGwhPWUmJiJub25lIiE9PWUmJnQubGluZVdpZHRoPjB9LGUucHJvdG90eXBlLmhhc0ZpbGw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0eWxlLmZpbGw7cmV0dXJuIG51bGwhPXQmJiJub25lIiE9PXR9LGUucHJvdG90eXBlLmNyZWF0ZVN0eWxlPWZ1bmN0aW9uKHQpe3JldHVybiBtdChMcyx0KX0sZS5wcm90b3R5cGUuc2V0Qm91bmRpbmdSZWN0PWZ1bmN0aW9uKHQpe3RoaXMuX3JlY3Q9dH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdHlsZTtpZighdGhpcy5fcmVjdCl7dmFyIGU9dC50ZXh0O251bGwhPWU/ZSs9IiI6ZT0iIjt2YXIgbj1TcihlLHQuZm9udCx0LnRleHRBbGlnbix0LnRleHRCYXNlbGluZSk7aWYobi54Kz10Lnh8fDAsbi55Kz10Lnl8fDAsdGhpcy5oYXNTdHJva2UoKSl7dmFyIGk9dC5saW5lV2lkdGg7bi54LT1pLzIsbi55LT1pLzIsbi53aWR0aCs9aSxuLmhlaWdodCs9aX10aGlzLl9yZWN0PW59cmV0dXJuIHRoaXMuX3JlY3R9LGUuaW5pdERlZmF1bHRQcm9wcz12b2lkKGUucHJvdG90eXBlLmRpcnR5UmVjdFRvbGVyYW5jZT0xMCksZX0oRGEpO1BzLnByb3RvdHlwZS50eXBlPSJ0c3BhbiI7dmFyIE9zPWsoe3g6MCx5OjB9LE1hKSxScz17c3R5bGU6ayh7eDohMCx5OiEwLHdpZHRoOiEwLGhlaWdodDohMCxzeDohMCxzeTohMCxzV2lkdGg6ITAsc0hlaWdodDohMH0sSWEuc3R5bGUpfTt2YXIgTnM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5jcmVhdGVTdHlsZT1mdW5jdGlvbih0KXtyZXR1cm4gbXQoT3MsdCl9LGUucHJvdG90eXBlLl9nZXRTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3R5bGUsbj1lW3RdO2lmKG51bGwhPW4pcmV0dXJuIG47dmFyIGkscj0oaT1lLmltYWdlKSYmInN0cmluZyIhPXR5cGVvZiBpJiZpLndpZHRoJiZpLmhlaWdodD9lLmltYWdlOnRoaXMuX19pbWFnZTtpZighcilyZXR1cm4gMDt2YXIgbz0id2lkdGgiPT09dD8iaGVpZ2h0Ijoid2lkdGgiLGE9ZVtvXTtyZXR1cm4gbnVsbD09YT9yW3RdOnJbdF0vcltvXSphfSxlLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRTaXplKCJ3aWR0aCIpfSxlLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0U2l6ZSgiaGVpZ2h0Iil9LGUucHJvdG90eXBlLmdldEFuaW1hdGlvblN0eWxlUHJvcHM9ZnVuY3Rpb24oKXtyZXR1cm4gUnN9LGUucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGU7cmV0dXJuIHRoaXMuX3JlY3R8fCh0aGlzLl9yZWN0PW5ldyB6ZSh0Lnh8fDAsdC55fHwwLHRoaXMuZ2V0V2lkdGgoKSx0aGlzLmdldEhlaWdodCgpKSksdGhpcy5fcmVjdH0sZX0oRGEpO05zLnByb3RvdHlwZS50eXBlPSJpbWFnZSI7dmFyIEVzPU1hdGgucm91bmQ7ZnVuY3Rpb24genModCxlLG4pe2lmKGUpe3ZhciBpPWUueDEscj1lLngyLG89ZS55MSxhPWUueTI7dC54MT1pLHQueDI9cix0LnkxPW8sdC55Mj1hO3ZhciBzPW4mJm4ubGluZVdpZHRoO3JldHVybiBzPyhFcygyKmkpPT09RXMoMipyKSYmKHQueDE9dC54Mj1CcyhpLHMsITApKSxFcygyKm8pPT09RXMoMiphKSYmKHQueTE9dC55Mj1CcyhvLHMsITApKSx0KTp0fX1mdW5jdGlvbiBWcyh0LGUsbil7aWYoZSl7dmFyIGk9ZS54LHI9ZS55LG89ZS53aWR0aCxhPWUuaGVpZ2h0O3QueD1pLHQueT1yLHQud2lkdGg9byx0LmhlaWdodD1hO3ZhciBzPW4mJm4ubGluZVdpZHRoO3JldHVybiBzPyh0Lng9QnMoaSxzLCEwKSx0Lnk9QnMocixzLCEwKSx0LndpZHRoPU1hdGgubWF4KEJzKGkrbyxzLCExKS10LngsMD09PW8/MDoxKSx0LmhlaWdodD1NYXRoLm1heChCcyhyK2EscywhMSktdC55LDA9PT1hPzA6MSksdCk6dH19ZnVuY3Rpb24gQnModCxlLG4pe2lmKCFlKXJldHVybiB0O3ZhciBpPUVzKDIqdCk7cmV0dXJuKGkrRXMoZSkpJTI9PTA/aS8yOihpKyhuPzE6LTEpKS8yfXZhciBGcz1mdW5jdGlvbigpe3RoaXMueD0wLHRoaXMueT0wLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wfSxHcz17fSxXcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRnN9LGUucHJvdG90eXBlLmJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuLGkscixvO2lmKHRoaXMuc3ViUGl4ZWxPcHRpbWl6ZSl7dmFyIGE9VnMoR3MsZSx0aGlzLnN0eWxlKTtuPWEueCxpPWEueSxyPWEud2lkdGgsbz1hLmhlaWdodCxhLnI9ZS5yLGU9YX1lbHNlIG49ZS54LGk9ZS55LHI9ZS53aWR0aCxvPWUuaGVpZ2h0O2Uucj9mdW5jdGlvbih0LGUpe3ZhciBuLGkscixvLGEscz1lLngsbD1lLnksdT1lLndpZHRoLGg9ZS5oZWlnaHQsYz1lLnI7dTwwJiYocys9dSx1PS11KSxoPDAmJihsKz1oLGg9LWgpLCJudW1iZXIiPT10eXBlb2YgYz9uPWk9cj1vPWM6YyBpbnN0YW5jZW9mIEFycmF5PzE9PT1jLmxlbmd0aD9uPWk9cj1vPWNbMF06Mj09PWMubGVuZ3RoPyhuPXI9Y1swXSxpPW89Y1sxXSk6Mz09PWMubGVuZ3RoPyhuPWNbMF0saT1vPWNbMV0scj1jWzJdKToobj1jWzBdLGk9Y1sxXSxyPWNbMl0sbz1jWzNdKTpuPWk9cj1vPTAsbitpPnUmJihuKj11LyhhPW4raSksaSo9dS9hKSxyK28+dSYmKHIqPXUvKGE9citvKSxvKj11L2EpLGkrcj5oJiYoaSo9aC8oYT1pK3IpLHIqPWgvYSksbitvPmgmJihuKj1oLyhhPW4rbyksbyo9aC9hKSx0Lm1vdmVUbyhzK24sbCksdC5saW5lVG8ocyt1LWksbCksMCE9PWkmJnQuYXJjKHMrdS1pLGwraSxpLC1NYXRoLlBJLzIsMCksdC5saW5lVG8ocyt1LGwraC1yKSwwIT09ciYmdC5hcmMocyt1LXIsbCtoLXIsciwwLE1hdGguUEkvMiksdC5saW5lVG8ocytvLGwraCksMCE9PW8mJnQuYXJjKHMrbyxsK2gtbyxvLE1hdGguUEkvMixNYXRoLlBJKSx0LmxpbmVUbyhzLGwrbiksMCE9PW4mJnQuYXJjKHMrbixsK24sbixNYXRoLlBJLDEuNSpNYXRoLlBJKX0odCxlKTp0LnJlY3QobixpLHIsbyl9LGUucHJvdG90eXBlLmlzWmVyb0FyZWE9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zaGFwZS53aWR0aHx8IXRoaXMuc2hhcGUuaGVpZ2h0fSxlfShrcyk7V3MucHJvdG90eXBlLnR5cGU9InJlY3QiO3ZhciBIcz17ZmlsbDoiIzAwMCJ9LFlzPXtzdHlsZTprKHtmaWxsOiEwLHN0cm9rZTohMCxmaWxsT3BhY2l0eTohMCxzdHJva2VPcGFjaXR5OiEwLGxpbmVXaWR0aDohMCxmb250U2l6ZTohMCxsaW5lSGVpZ2h0OiEwLHdpZHRoOiEwLGhlaWdodDohMCx0ZXh0U2hhZG93Q29sb3I6ITAsdGV4dFNoYWRvd0JsdXI6ITAsdGV4dFNoYWRvd09mZnNldFg6ITAsdGV4dFNoYWRvd09mZnNldFk6ITAsYmFja2dyb3VuZENvbG9yOiEwLHBhZGRpbmc6ITAsYm9yZGVyQ29sb3I6ITAsYm9yZGVyV2lkdGg6ITAsYm9yZGVyUmFkaXVzOiEwfSxJYS5zdHlsZSl9LFhzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLnR5cGU9InRleHQiLG4uX2NoaWxkcmVuPVtdLG4uX2RlZmF1bHRTdHlsZT1IcyxuLmF0dHIoZSksbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmNoaWxkcmVuUmVmPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVufSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKSx0aGlzLnN0eWxlQ2hhbmdlZCgpJiZ0aGlzLl91cGRhdGVTdWJUZXh0cygpO2Zvcih2YXIgZT0wO2U8dGhpcy5fY2hpbGRyZW4ubGVuZ3RoO2UrKyl7dmFyIG49dGhpcy5fY2hpbGRyZW5bZV07bi56bGV2ZWw9dGhpcy56bGV2ZWwsbi56PXRoaXMueixuLnoyPXRoaXMuejIsbi5jdWxsaW5nPXRoaXMuY3VsbGluZyxuLmN1cnNvcj10aGlzLmN1cnNvcixuLmludmlzaWJsZT10aGlzLmludmlzaWJsZX19LGUucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5uZXJUcmFuc2Zvcm1hYmxlO2U/KGUudXBkYXRlVHJhbnNmb3JtKCksZS50cmFuc2Zvcm0mJih0aGlzLnRyYW5zZm9ybT1lLnRyYW5zZm9ybSkpOnQucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5nZXRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmlubmVyVHJhbnNmb3JtYWJsZTtyZXR1cm4gbj9uLmdldExvY2FsVHJhbnNmb3JtKGUpOnQucHJvdG90eXBlLmdldExvY2FsVHJhbnNmb3JtLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRUcmFuc2Zvcm09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2hvc3RUYXJnZXQmJih0aGlzLl9faG9zdFRhcmdldC5nZXRDb21wdXRlZFRyYW5zZm9ybSgpLHRoaXMuX19ob3N0VGFyZ2V0LnVwZGF0ZUlubmVyVGV4dCghMCkpLHQucHJvdG90eXBlLmdldENvbXB1dGVkVHJhbnNmb3JtLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLl91cGRhdGVTdWJUZXh0cz1mdW5jdGlvbigpe3ZhciB0O3RoaXMuX2NoaWxkQ3Vyc29yPTAsSnModD10aGlzLnN0eWxlKSxFKHQucmljaCxKcyksdGhpcy5zdHlsZS5yaWNoP3RoaXMuX3VwZGF0ZVJpY2hUZXh0cygpOnRoaXMuX3VwZGF0ZVBsYWluVGV4dHMoKSx0aGlzLl9jaGlsZHJlbi5sZW5ndGg9dGhpcy5fY2hpbGRDdXJzb3IsdGhpcy5zdHlsZVVwZGF0ZWQoKX0sZS5wcm90b3R5cGUuYWRkU2VsZlRvWnI9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuYWRkU2VsZlRvWnIuY2FsbCh0aGlzLGUpO2Zvcih2YXIgbj0wO248dGhpcy5fY2hpbGRyZW4ubGVuZ3RoO24rKyl0aGlzLl9jaGlsZHJlbltuXS5fX3pyPWV9LGUucHJvdG90eXBlLnJlbW92ZVNlbGZGcm9tWnI9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUucmVtb3ZlU2VsZkZyb21aci5jYWxsKHRoaXMsZSk7Zm9yKHZhciBuPTA7bjx0aGlzLl9jaGlsZHJlbi5sZW5ndGg7bisrKXRoaXMuX2NoaWxkcmVuW25dLl9fenI9bnVsbH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy5zdHlsZUNoYW5nZWQoKSYmdGhpcy5fdXBkYXRlU3ViVGV4dHMoKSwhdGhpcy5fcmVjdCl7Zm9yKHZhciB0PW5ldyB6ZSgwLDAsMCwwKSxlPXRoaXMuX2NoaWxkcmVuLG49W10saT1udWxsLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZVtyXSxhPW8uZ2V0Qm91bmRpbmdSZWN0KCkscz1vLmdldExvY2FsVHJhbnNmb3JtKG4pO3M/KHQuY29weShhKSx0LmFwcGx5VHJhbnNmb3JtKHMpLChpPWl8fHQuY2xvbmUoKSkudW5pb24odCkpOihpPWl8fGEuY2xvbmUoKSkudW5pb24oYSl9dGhpcy5fcmVjdD1pfHx0fXJldHVybiB0aGlzLl9yZWN0fSxlLnByb3RvdHlwZS5zZXREZWZhdWx0VGV4dFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2RlZmF1bHRTdHlsZT10fHxIc30sZS5wcm90b3R5cGUuc2V0VGV4dENvbnRlbnQ9ZnVuY3Rpb24odCl7MH0sZS5wcm90b3R5cGUuX21lcmdlU3R5bGU9ZnVuY3Rpb24odCxlKXtpZighZSlyZXR1cm4gdDt2YXIgbj1lLnJpY2gsaT10LnJpY2h8fG4mJnt9O3JldHVybiBBKHQsZSksbiYmaT8odGhpcy5fbWVyZ2VSaWNoKGksbiksdC5yaWNoPWkpOmkmJih0LnJpY2g9aSksdH0sZS5wcm90b3R5cGUuX21lcmdlUmljaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1HKGUpLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHI9bltpXTt0W3JdPXRbcl18fHt9LEEodFtyXSxlW3JdKX19LGUucHJvdG90eXBlLmdldEFuaW1hdGlvblN0eWxlUHJvcHM9ZnVuY3Rpb24oKXtyZXR1cm4gWXN9LGUucHJvdG90eXBlLl9nZXRPckNyZWF0ZUNoaWxkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NoaWxkcmVuW3RoaXMuX2NoaWxkQ3Vyc29yXTtyZXR1cm4gZSYmZSBpbnN0YW5jZW9mIHR8fChlPW5ldyB0KSx0aGlzLl9jaGlsZHJlblt0aGlzLl9jaGlsZEN1cnNvcisrXT1lLGUuX196cj10aGlzLl9fenIsZS5wYXJlbnQ9dGhpcyxlfSxlLnByb3RvdHlwZS5fdXBkYXRlUGxhaW5UZXh0cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGUsZT10LmZvbnR8fGEsbj10LnBhZGRpbmcsaT1mdW5jdGlvbih0LGUpe251bGwhPXQmJih0Kz0iIik7dmFyIG4saT1lLm92ZXJmbG93LHI9ZS5wYWRkaW5nLG89ZS5mb250LGE9InRydW5jYXRlIj09PWkscz1UcihvKSxsPXJ0KGUubGluZUhlaWdodCxzKSx1PSEhZS5iYWNrZ3JvdW5kQ29sb3IsaD0idHJ1bmNhdGUiPT09ZS5saW5lT3ZlcmZsb3csYz1lLndpZHRoLHA9KG49bnVsbD09Y3x8ImJyZWFrIiE9PWkmJiJicmVha0FsbCIhPT1pP3Q/dC5zcGxpdCgiXG4iKTpbXTp0P3dhKHQsZS5mb250LGMsImJyZWFrQWxsIj09PWksMCkubGluZXM6W10pLmxlbmd0aCpsLGQ9cnQoZS5oZWlnaHQscCk7aWYocD5kJiZoKXt2YXIgZj1NYXRoLmZsb29yKGQvbCk7bj1uLnNsaWNlKDAsZil9aWYodCYmYSYmbnVsbCE9Yylmb3IodmFyIGc9ZGEoYyxvLGUuZWxsaXBzaXMse21pbkNoYXI6ZS50cnVuY2F0ZU1pbkNoYXIscGxhY2Vob2xkZXI6ZS5wbGFjZWhvbGRlcn0pLHk9MDt5PG4ubGVuZ3RoO3krKyluW3ldPWZhKG5beV0sZyk7dmFyIHY9ZCxtPTA7Zm9yKHk9MDt5PG4ubGVuZ3RoO3krKyltPU1hdGgubWF4KGJyKG5beV0sbyksbSk7bnVsbD09YyYmKGM9bSk7dmFyIHg9bTtyZXR1cm4gciYmKHYrPXJbMF0rclsyXSx4Kz1yWzFdK3JbM10sYys9clsxXStyWzNdKSx1JiYoeD1jKSx7bGluZXM6bixoZWlnaHQ6ZCxvdXRlcldpZHRoOngsb3V0ZXJIZWlnaHQ6dixsaW5lSGVpZ2h0OmwsY2FsY3VsYXRlZExpbmVIZWlnaHQ6cyxjb250ZW50V2lkdGg6bSxjb250ZW50SGVpZ2h0OnAsd2lkdGg6Y319KG5sKHQpLHQpLHI9aWwodCksbz0hIXQuYmFja2dyb3VuZENvbG9yLHM9aS5vdXRlckhlaWdodCxsPWkub3V0ZXJXaWR0aCx1PWkuY29udGVudFdpZHRoLGg9aS5saW5lcyxjPWkubGluZUhlaWdodCxwPXRoaXMuX2RlZmF1bHRTdHlsZSxkPXQueHx8MCxmPXQueXx8MCxnPXQuYWxpZ258fHAuYWxpZ258fCJsZWZ0Iix5PXQudmVydGljYWxBbGlnbnx8cC52ZXJ0aWNhbEFsaWdufHwidG9wIix2PWQsbT1JcihmLGkuY29udGVudEhlaWdodCx5KTtpZihyfHxuKXt2YXIgeD1NcihkLGwsZyksXz1JcihmLHMseSk7ciYmdGhpcy5fcmVuZGVyQmFja2dyb3VuZCh0LHQseCxfLGwscyl9bSs9Yy8yLG4mJih2PWVsKGQsZyxuKSwidG9wIj09PXk/bSs9blswXToiYm90dG9tIj09PXkmJihtLT1uWzJdKSk7Zm9yKHZhciBiPTAsdz0hMSxTPSh0bCgiZmlsbCJpbiB0P3QuZmlsbDoodz0hMCxwLmZpbGwpKSksTT0oUXMoInN0cm9rZSJpbiB0P3Quc3Ryb2tlOm98fHAuYXV0b1N0cm9rZSYmIXc/bnVsbDooYj0yLHAuc3Ryb2tlKSkpLEk9dC50ZXh0U2hhZG93Qmx1cj4wLFQ9bnVsbCE9dC53aWR0aCYmKCJ0cnVuY2F0ZSI9PT10Lm92ZXJmbG93fHwiYnJlYWsiPT09dC5vdmVyZmxvd3x8ImJyZWFrQWxsIj09PXQub3ZlcmZsb3cpLEM9aS5jYWxjdWxhdGVkTGluZUhlaWdodCxEPTA7RDxoLmxlbmd0aDtEKyspe3ZhciBBPXRoaXMuX2dldE9yQ3JlYXRlQ2hpbGQoUHMpLGs9QS5jcmVhdGVTdHlsZSgpO0EudXNlU3R5bGUoayksay50ZXh0PWhbRF0say54PXYsay55PW0sZyYmKGsudGV4dEFsaWduPWcpLGsudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGsub3BhY2l0eT10Lm9wYWNpdHksay5zdHJva2VGaXJzdD0hMCxJJiYoay5zaGFkb3dCbHVyPXQudGV4dFNoYWRvd0JsdXJ8fDAsay5zaGFkb3dDb2xvcj10LnRleHRTaGFkb3dDb2xvcnx8InRyYW5zcGFyZW50IixrLnNoYWRvd09mZnNldFg9dC50ZXh0U2hhZG93T2Zmc2V0WHx8MCxrLnNoYWRvd09mZnNldFk9dC50ZXh0U2hhZG93T2Zmc2V0WXx8MCksay5zdHJva2U9TSxrLmZpbGw9UyxNJiYoay5saW5lV2lkdGg9dC5saW5lV2lkdGh8fGIsay5saW5lRGFzaD10LmxpbmVEYXNoLGsubGluZURhc2hPZmZzZXQ9dC5saW5lRGFzaE9mZnNldHx8MCksay5mb250PWUsS3Moayx0KSxtKz1jLFQmJkEuc2V0Qm91bmRpbmdSZWN0KG5ldyB6ZShNcihrLngsdC53aWR0aCxrLnRleHRBbGlnbiksSXIoay55LEMsay50ZXh0QmFzZWxpbmUpLHUsQykpfX0sZS5wcm90b3R5cGUuX3VwZGF0ZVJpY2hUZXh0cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGUsZT1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBtYTtpZihudWxsIT10JiYodCs9IiIpLCF0KXJldHVybiBuO2Zvcih2YXIgaSxyPWUud2lkdGgsbz1lLmhlaWdodCxhPWUub3ZlcmZsb3cscz0iYnJlYWsiIT09YSYmImJyZWFrQWxsIiE9PWF8fG51bGw9PXI/bnVsbDp7d2lkdGg6cixhY2N1bVdpZHRoOjAsYnJlYWtBbGw6ImJyZWFrQWxsIj09PWF9LGw9Y2EubGFzdEluZGV4PTA7bnVsbCE9KGk9Y2EuZXhlYyh0KSk7KXt2YXIgdT1pLmluZGV4O3U+bCYmeGEobix0LnN1YnN0cmluZyhsLHUpLGUscykseGEobixpWzJdLGUscyxpWzFdKSxsPWNhLmxhc3RJbmRleH1sPHQubGVuZ3RoJiZ4YShuLHQuc3Vic3RyaW5nKGwsdC5sZW5ndGgpLGUscyk7dmFyIGg9W10sYz0wLHA9MCxkPWUucGFkZGluZyxmPSJ0cnVuY2F0ZSI9PT1hLGc9InRydW5jYXRlIj09PWUubGluZU92ZXJmbG93O2Z1bmN0aW9uIHkodCxlLG4pe3Qud2lkdGg9ZSx0LmxpbmVIZWlnaHQ9bixjKz1uLHA9TWF0aC5tYXgocCxlKX10OmZvcih2YXIgdj0wO3Y8bi5saW5lcy5sZW5ndGg7disrKXtmb3IodmFyIG09bi5saW5lc1t2XSx4PTAsXz0wLGI9MDtiPG0udG9rZW5zLmxlbmd0aDtiKyspe3ZhciB3PShQPW0udG9rZW5zW2JdKS5zdHlsZU5hbWUmJmUucmljaFtQLnN0eWxlTmFtZV18fHt9LFM9UC50ZXh0UGFkZGluZz13LnBhZGRpbmcsTT1TP1NbMV0rU1szXTowLEk9UC5mb250PXcuZm9udHx8ZS5mb250O1AuY29udGVudEhlaWdodD1UcihJKTt2YXIgVD1ydCh3LmhlaWdodCxQLmNvbnRlbnRIZWlnaHQpO2lmKFAuaW5uZXJIZWlnaHQ9VCxTJiYoVCs9U1swXStTWzJdKSxQLmhlaWdodD1ULFAubGluZUhlaWdodD1vdCh3LmxpbmVIZWlnaHQsZS5saW5lSGVpZ2h0LFQpLFAuYWxpZ249dyYmdy5hbGlnbnx8ZS5hbGlnbixQLnZlcnRpY2FsQWxpZ249dyYmdy52ZXJ0aWNhbEFsaWdufHwibWlkZGxlIixnJiZudWxsIT1vJiZjK1AubGluZUhlaWdodD5vKXtiPjA/KG0udG9rZW5zPW0udG9rZW5zLnNsaWNlKDAsYikseShtLF8seCksbi5saW5lcz1uLmxpbmVzLnNsaWNlKDAsdisxKSk6bi5saW5lcz1uLmxpbmVzLnNsaWNlKDAsdik7YnJlYWsgdH12YXIgQz13LndpZHRoLEQ9bnVsbD09Q3x8ImF1dG8iPT09QztpZigic3RyaW5nIj09dHlwZW9mIEMmJiIlIj09PUMuY2hhckF0KEMubGVuZ3RoLTEpKVAucGVyY2VudFdpZHRoPUMsaC5wdXNoKFApLFAuY29udGVudFdpZHRoPWJyKFAudGV4dCxJKTtlbHNle2lmKEQpe3ZhciBBPXcuYmFja2dyb3VuZENvbG9yLGs9QSYmQS5pbWFnZTtrJiZoYShrPXNhKGspKSYmKFAud2lkdGg9TWF0aC5tYXgoUC53aWR0aCxrLndpZHRoKlQvay5oZWlnaHQpKX12YXIgTD1mJiZudWxsIT1yP3ItXzpudWxsO251bGwhPUwmJkw8UC53aWR0aD8hRHx8TDxNPyhQLnRleHQ9IiIsUC53aWR0aD1QLmNvbnRlbnRXaWR0aD0wKTooUC50ZXh0PXBhKFAudGV4dCxMLU0sSSxlLmVsbGlwc2lzLHttaW5DaGFyOmUudHJ1bmNhdGVNaW5DaGFyfSksUC53aWR0aD1QLmNvbnRlbnRXaWR0aD1icihQLnRleHQsSSkpOlAuY29udGVudFdpZHRoPWJyKFAudGV4dCxJKX1QLndpZHRoKz1NLF8rPVAud2lkdGgsdyYmKHg9TWF0aC5tYXgoeCxQLmxpbmVIZWlnaHQpKX15KG0sXyx4KX1mb3Iobi5vdXRlcldpZHRoPW4ud2lkdGg9cnQocixwKSxuLm91dGVySGVpZ2h0PW4uaGVpZ2h0PXJ0KG8sYyksbi5jb250ZW50SGVpZ2h0PWMsbi5jb250ZW50V2lkdGg9cCxkJiYobi5vdXRlcldpZHRoKz1kWzFdK2RbM10sbi5vdXRlckhlaWdodCs9ZFswXStkWzJdKSx2PTA7djxoLmxlbmd0aDt2Kyspe3ZhciBQLE89KFA9aFt2XSkucGVyY2VudFdpZHRoO1Aud2lkdGg9cGFyc2VJbnQoTywxMCkvMTAwKm4ud2lkdGh9cmV0dXJuIG59KG5sKHQpLHQpLG49ZS53aWR0aCxpPWUub3V0ZXJXaWR0aCxyPWUub3V0ZXJIZWlnaHQsbz10LnBhZGRpbmcsYT10Lnh8fDAscz10Lnl8fDAsbD10aGlzLl9kZWZhdWx0U3R5bGUsdT10LmFsaWdufHxsLmFsaWduLGg9dC52ZXJ0aWNhbEFsaWdufHxsLnZlcnRpY2FsQWxpZ24sYz1NcihhLGksdSkscD1JcihzLHIsaCksZD1jLGY9cDtvJiYoZCs9b1szXSxmKz1vWzBdKTt2YXIgZz1kK247aWwodCkmJnRoaXMuX3JlbmRlckJhY2tncm91bmQodCx0LGMscCxpLHIpO2Zvcih2YXIgeT0hIXQuYmFja2dyb3VuZENvbG9yLHY9MDt2PGUubGluZXMubGVuZ3RoO3YrKyl7Zm9yKHZhciBtPWUubGluZXNbdl0seD1tLnRva2VucyxfPXgubGVuZ3RoLGI9bS5saW5lSGVpZ2h0LHc9bS53aWR0aCxTPTAsTT1kLEk9ZyxUPV8tMSxDPXZvaWQgMDtTPF8mJighKEM9eFtTXSkuYWxpZ258fCJsZWZ0Ij09PUMuYWxpZ24pOyl0aGlzLl9wbGFjZVRva2VuKEMsdCxiLGYsTSwibGVmdCIseSksdy09Qy53aWR0aCxNKz1DLndpZHRoLFMrKztmb3IoO1Q+PTAmJiJyaWdodCI9PT0oQz14W1RdKS5hbGlnbjspdGhpcy5fcGxhY2VUb2tlbihDLHQsYixmLEksInJpZ2h0Iix5KSx3LT1DLndpZHRoLEktPUMud2lkdGgsVC0tO2ZvcihNKz0obi0oTS1kKS0oZy1JKS13KS8yO1M8PVQ7KUM9eFtTXSx0aGlzLl9wbGFjZVRva2VuKEMsdCxiLGYsTStDLndpZHRoLzIsImNlbnRlciIseSksTSs9Qy53aWR0aCxTKys7Zis9Yn19LGUucHJvdG90eXBlLl9wbGFjZVRva2VuPWZ1bmN0aW9uKHQsZSxuLGkscixvLHMpe3ZhciBsPWUucmljaFt0LnN0eWxlTmFtZV18fHt9O2wudGV4dD10LnRleHQ7dmFyIHU9dC52ZXJ0aWNhbEFsaWduLGg9aStuLzI7InRvcCI9PT11P2g9aSt0LmhlaWdodC8yOiJib3R0b20iPT09dSYmKGg9aStuLXQuaGVpZ2h0LzIpLCF0LmlzTGluZUhvbGRlciYmaWwobCkmJnRoaXMuX3JlbmRlckJhY2tncm91bmQobCxlLCJyaWdodCI9PT1vP3ItdC53aWR0aDoiY2VudGVyIj09PW8/ci10LndpZHRoLzI6cixoLXQuaGVpZ2h0LzIsdC53aWR0aCx0LmhlaWdodCk7dmFyIGM9ISFsLmJhY2tncm91bmRDb2xvcixwPXQudGV4dFBhZGRpbmc7cCYmKHI9ZWwocixvLHApLGgtPXQuaGVpZ2h0LzItcFswXS10LmlubmVySGVpZ2h0LzIpO3ZhciBkPXRoaXMuX2dldE9yQ3JlYXRlQ2hpbGQoUHMpLGY9ZC5jcmVhdGVTdHlsZSgpO2QudXNlU3R5bGUoZik7dmFyIGc9dGhpcy5fZGVmYXVsdFN0eWxlLHk9ITEsdj0wLG09dGwoImZpbGwiaW4gbD9sLmZpbGw6ImZpbGwiaW4gZT9lLmZpbGw6KHk9ITAsZy5maWxsKSkseD1Rcygic3Ryb2tlImluIGw/bC5zdHJva2U6InN0cm9rZSJpbiBlP2Uuc3Ryb2tlOmN8fHN8fGcuYXV0b1N0cm9rZSYmIXk/bnVsbDoodj0yLGcuc3Ryb2tlKSksXz1sLnRleHRTaGFkb3dCbHVyPjB8fGUudGV4dFNoYWRvd0JsdXI+MDtmLnRleHQ9dC50ZXh0LGYueD1yLGYueT1oLF8mJihmLnNoYWRvd0JsdXI9bC50ZXh0U2hhZG93Qmx1cnx8ZS50ZXh0U2hhZG93Qmx1cnx8MCxmLnNoYWRvd0NvbG9yPWwudGV4dFNoYWRvd0NvbG9yfHxlLnRleHRTaGFkb3dDb2xvcnx8InRyYW5zcGFyZW50IixmLnNoYWRvd09mZnNldFg9bC50ZXh0U2hhZG93T2Zmc2V0WHx8ZS50ZXh0U2hhZG93T2Zmc2V0WHx8MCxmLnNoYWRvd09mZnNldFk9bC50ZXh0U2hhZG93T2Zmc2V0WXx8ZS50ZXh0U2hhZG93T2Zmc2V0WXx8MCksZi50ZXh0QWxpZ249byxmLnRleHRCYXNlbGluZT0ibWlkZGxlIixmLmZvbnQ9dC5mb250fHxhLGYub3BhY2l0eT1vdChsLm9wYWNpdHksZS5vcGFjaXR5LDEpLEtzKGYsbCkseCYmKGYubGluZVdpZHRoPW90KGwubGluZVdpZHRoLGUubGluZVdpZHRoLHYpLGYubGluZURhc2g9cnQobC5saW5lRGFzaCxlLmxpbmVEYXNoKSxmLmxpbmVEYXNoT2Zmc2V0PWUubGluZURhc2hPZmZzZXR8fDAsZi5zdHJva2U9eCksbSYmKGYuZmlsbD1tKTt2YXIgYj10LmNvbnRlbnRXaWR0aCx3PXQuY29udGVudEhlaWdodDtkLnNldEJvdW5kaW5nUmVjdChuZXcgemUoTXIoZi54LGIsZi50ZXh0QWxpZ24pLElyKGYueSx3LGYudGV4dEJhc2VsaW5lKSxiLHcpKX0sZS5wcm90b3R5cGUuX3JlbmRlckJhY2tncm91bmQ9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhLHMsbCx1PXQuYmFja2dyb3VuZENvbG9yLGg9dC5ib3JkZXJXaWR0aCxjPXQuYm9yZGVyQ29sb3IscD11JiZ1LmltYWdlLGQ9dSYmIXAsZj10LmJvcmRlclJhZGl1cyxnPXRoaXM7aWYoZHx8dC5saW5lSGVpZ2h0fHxoJiZjKXsoYT10aGlzLl9nZXRPckNyZWF0ZUNoaWxkKFdzKSkudXNlU3R5bGUoYS5jcmVhdGVTdHlsZSgpKSxhLnN0eWxlLmZpbGw9bnVsbDt2YXIgeT1hLnNoYXBlO3kueD1uLHkueT1pLHkud2lkdGg9cix5LmhlaWdodD1vLHkucj1mLGEuZGlydHlTaGFwZSgpfWlmKGQpKGw9YS5zdHlsZSkuZmlsbD11fHxudWxsLGwuZmlsbE9wYWNpdHk9cnQodC5maWxsT3BhY2l0eSwxKTtlbHNlIGlmKHApeyhzPXRoaXMuX2dldE9yQ3JlYXRlQ2hpbGQoTnMpKS5vbmxvYWQ9ZnVuY3Rpb24oKXtnLmRpcnR5U3R5bGUoKX07dmFyIHY9cy5zdHlsZTt2LmltYWdlPXUuaW1hZ2Usdi54PW4sdi55PWksdi53aWR0aD1yLHYuaGVpZ2h0PW99aCYmYyYmKChsPWEuc3R5bGUpLmxpbmVXaWR0aD1oLGwuc3Ryb2tlPWMsbC5zdHJva2VPcGFjaXR5PXJ0KHQuc3Ryb2tlT3BhY2l0eSwxKSxsLmxpbmVEYXNoPXQuYm9yZGVyRGFzaCxsLmxpbmVEYXNoT2Zmc2V0PXQuYm9yZGVyRGFzaE9mZnNldHx8MCxhLnN0cm9rZUNvbnRhaW5UaHJlc2hvbGQ9MCxhLmhhc0ZpbGwoKSYmYS5oYXNTdHJva2UoKSYmKGwuc3Ryb2tlRmlyc3Q9ITAsbC5saW5lV2lkdGgqPTIpKTt2YXIgbT0oYXx8cykuc3R5bGU7bS5zaGFkb3dCbHVyPXQuc2hhZG93Qmx1cnx8MCxtLnNoYWRvd0NvbG9yPXQuc2hhZG93Q29sb3J8fCJ0cmFuc3BhcmVudCIsbS5zaGFkb3dPZmZzZXRYPXQuc2hhZG93T2Zmc2V0WHx8MCxtLnNoYWRvd09mZnNldFk9dC5zaGFkb3dPZmZzZXRZfHwwLG0ub3BhY2l0eT1vdCh0Lm9wYWNpdHksZS5vcGFjaXR5LDEpfSxlLm1ha2VGb250PWZ1bmN0aW9uKHQpe3ZhciBlPSIiO3JldHVybiAkcyh0KSYmKGU9W3QuZm9udFN0eWxlLHQuZm9udFdlaWdodCxxcyh0LmZvbnRTaXplKSx0LmZvbnRGYW1pbHl8fCJzYW5zLXNlcmlmIl0uam9pbigiICIpKSxlJiZ1dChlKXx8dC50ZXh0Rm9udHx8dC5mb250fSxlfShEYSksVXM9e2xlZnQ6ITAscmlnaHQ6MSxjZW50ZXI6MX0sWnM9e3RvcDoxLGJvdHRvbToxLG1pZGRsZToxfSxqcz1bImZvbnRTdHlsZSIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiXTtmdW5jdGlvbiBxcyh0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHR8fC0xPT09dC5pbmRleE9mKCJweCIpJiYtMT09PXQuaW5kZXhPZigicmVtIikmJi0xPT09dC5pbmRleE9mKCJlbSIpP2lzTmFOKCt0KT8iMTJweCI6dCsicHgiOnR9ZnVuY3Rpb24gS3ModCxlKXtmb3IodmFyIG49MDtuPGpzLmxlbmd0aDtuKyspe3ZhciBpPWpzW25dLHI9ZVtpXTtudWxsIT1yJiYodFtpXT1yKX19ZnVuY3Rpb24gJHModCl7cmV0dXJuIG51bGwhPXQuZm9udFNpemV8fHQuZm9udEZhbWlseXx8dC5mb250V2VpZ2h0fWZ1bmN0aW9uIEpzKHQpe2lmKHQpe3QuZm9udD1Ycy5tYWtlRm9udCh0KTt2YXIgZT10LmFsaWduOyJtaWRkbGUiPT09ZSYmKGU9ImNlbnRlciIpLHQuYWxpZ249bnVsbD09ZXx8VXNbZV0/ZToibGVmdCI7dmFyIG49dC52ZXJ0aWNhbEFsaWduOyJjZW50ZXIiPT09biYmKG49Im1pZGRsZSIpLHQudmVydGljYWxBbGlnbj1udWxsPT1ufHxac1tuXT9uOiJ0b3AiLHQucGFkZGluZyYmKHQucGFkZGluZz1zdCh0LnBhZGRpbmcpKX19ZnVuY3Rpb24gUXModCxlKXtyZXR1cm4gbnVsbD09dHx8ZTw9MHx8InRyYW5zcGFyZW50Ij09PXR8fCJub25lIj09PXQ/bnVsbDp0LmltYWdlfHx0LmNvbG9yU3RvcHM/IiMwMDAiOnR9ZnVuY3Rpb24gdGwodCl7cmV0dXJuIG51bGw9PXR8fCJub25lIj09PXQ/bnVsbDp0LmltYWdlfHx0LmNvbG9yU3RvcHM/IiMwMDAiOnR9ZnVuY3Rpb24gZWwodCxlLG4pe3JldHVybiJyaWdodCI9PT1lP3QtblsxXToiY2VudGVyIj09PWU/dCtuWzNdLzItblsxXS8yOnQrblszXX1mdW5jdGlvbiBubCh0KXt2YXIgZT10LnRleHQ7cmV0dXJuIG51bGwhPWUmJihlKz0iIiksZX1mdW5jdGlvbiBpbCh0KXtyZXR1cm4hISh0LmJhY2tncm91bmRDb2xvcnx8dC5saW5lSGVpZ2h0fHx0LmJvcmRlcldpZHRoJiZ0LmJvcmRlckNvbG9yKX12YXIgcmw9Vm8oKSxvbD1mdW5jdGlvbih0LGUsbixpKXtpZihpKXt2YXIgcj1ybChpKTtyLmRhdGFJbmRleD1uLHIuZGF0YVR5cGU9ZSxyLnNlcmllc0luZGV4PXQsci5zc3JUeXBlPSJjaGFydCIsImdyb3VwIj09PWkudHlwZSYmaS50cmF2ZXJzZSgoZnVuY3Rpb24oaSl7dmFyIHI9cmwoaSk7ci5zZXJpZXNJbmRleD10LHIuZGF0YUluZGV4PW4sci5kYXRhVHlwZT1lLHIuc3NyVHlwZT0iY2hhcnQifSkpfX0sYWw9MSxzbD17fSxsbD1WbygpLHVsPVZvKCksaGw9WyJlbXBoYXNpcyIsImJsdXIiLCJzZWxlY3QiXSxjbD1bIm5vcm1hbCIsImVtcGhhc2lzIiwiYmx1ciIsInNlbGVjdCJdLHBsPTEwLGRsPSJoaWdobGlnaHQiLGZsPSJkb3ducGxheSIsZ2w9InNlbGVjdCIseWw9InVuc2VsZWN0Iix2bD0idG9nZ2xlU2VsZWN0IjtmdW5jdGlvbiBtbCh0KXtyZXR1cm4gbnVsbCE9dCYmIm5vbmUiIT09dH1mdW5jdGlvbiB4bCh0LGUsbil7dC5vbkhvdmVyU3RhdGVDaGFuZ2UmJih0LmhvdmVyU3RhdGV8fDApIT09biYmdC5vbkhvdmVyU3RhdGVDaGFuZ2UoZSksdC5ob3ZlclN0YXRlPW59ZnVuY3Rpb24gX2wodCl7eGwodCwiZW1waGFzaXMiLDIpfWZ1bmN0aW9uIGJsKHQpezI9PT10LmhvdmVyU3RhdGUmJnhsKHQsIm5vcm1hbCIsMCl9ZnVuY3Rpb24gd2wodCl7eGwodCwiYmx1ciIsMSl9ZnVuY3Rpb24gU2wodCl7MT09PXQuaG92ZXJTdGF0ZSYmeGwodCwibm9ybWFsIiwwKX1mdW5jdGlvbiBNbCh0KXt0LnNlbGVjdGVkPSEwfWZ1bmN0aW9uIElsKHQpe3Quc2VsZWN0ZWQ9ITF9ZnVuY3Rpb24gVGwodCxlLG4pe2UodCxuKX1mdW5jdGlvbiBDbCh0LGUsbil7VGwodCxlLG4pLHQuaXNHcm91cCYmdC50cmF2ZXJzZSgoZnVuY3Rpb24odCl7VGwodCxlLG4pfSkpfWZ1bmN0aW9uIERsKHQsZSl7c3dpdGNoKGUpe2Nhc2UiZW1waGFzaXMiOnQuaG92ZXJTdGF0ZT0yO2JyZWFrO2Nhc2Uibm9ybWFsIjp0LmhvdmVyU3RhdGU9MDticmVhaztjYXNlImJsdXIiOnQuaG92ZXJTdGF0ZT0xO2JyZWFrO2Nhc2Uic2VsZWN0Ijp0LnNlbGVjdGVkPSEwfX1mdW5jdGlvbiBBbCh0LGUpe3ZhciBuPXRoaXMuc3RhdGVzW3RdO2lmKHRoaXMuc3R5bGUpe2lmKCJlbXBoYXNpcyI9PT10KXJldHVybiBmdW5jdGlvbih0LGUsbixpKXt2YXIgcj1uJiZQKG4sInNlbGVjdCIpPj0wLG89ITE7aWYodCBpbnN0YW5jZW9mIGtzKXt2YXIgYT1sbCh0KSxzPXImJmEuc2VsZWN0RmlsbHx8YS5ub3JtYWxGaWxsLGw9ciYmYS5zZWxlY3RTdHJva2V8fGEubm9ybWFsU3Ryb2tlO2lmKG1sKHMpfHxtbChsKSl7dmFyIHU9KGk9aXx8e30pLnN0eWxlfHx7fTsiaW5oZXJpdCI9PT11LmZpbGw/KG89ITAsaT1BKHt9LGkpLCh1PUEoe30sdSkpLmZpbGw9cyk6IW1sKHUuZmlsbCkmJm1sKHMpPyhvPSEwLGk9QSh7fSxpKSwodT1BKHt9LHUpKS5maWxsPXNpKHMpKTohbWwodS5zdHJva2UpJiZtbChsKSYmKG98fChpPUEoe30saSksdT1BKHt9LHUpKSx1LnN0cm9rZT1zaShsKSksaS5zdHlsZT11fX1pZihpJiZudWxsPT1pLnoyKXtvfHwoaT1BKHt9LGkpKTt2YXIgaD10LnoyRW1waGFzaXNMaWZ0O2kuejI9dC56MisobnVsbCE9aD9oOnBsKX1yZXR1cm4gaX0odGhpcywwLGUsbik7aWYoImJsdXIiPT09dClyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciBpPVAodC5jdXJyZW50U3RhdGVzLGUpPj0wLHI9dC5zdHlsZS5vcGFjaXR5LG89aT9udWxsOmZ1bmN0aW9uKHQsZSxuLGkpe2Zvcih2YXIgcj10LnN0eWxlLG89e30sYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgcz1lW2FdLGw9cltzXTtvW3NdPW51bGw9PWw/aSYmaVtzXTpsfWZvcihhPTA7YTx0LmFuaW1hdG9ycy5sZW5ndGg7YSsrKXt2YXIgdT10LmFuaW1hdG9yc1thXTt1Ll9fZnJvbVN0YXRlVHJhbnNpdGlvbiYmdS5fX2Zyb21TdGF0ZVRyYW5zaXRpb24uaW5kZXhPZihuKTwwJiYic3R5bGUiPT09dS50YXJnZXROYW1lJiZ1LnNhdmVUbyhvLGUpfXJldHVybiBvfSh0LFsib3BhY2l0eSJdLGUse29wYWNpdHk6MX0pLGE9KG49bnx8e30pLnN0eWxlfHx7fTtyZXR1cm4gbnVsbD09YS5vcGFjaXR5JiYobj1BKHt9LG4pLGE9QSh7b3BhY2l0eTppP3I6LjEqby5vcGFjaXR5fSxhKSxuLnN0eWxlPWEpLG59KHRoaXMsdCxuKTtpZigic2VsZWN0Ij09PXQpcmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtpZihuJiZudWxsPT1uLnoyKXtuPUEoe30sbik7dmFyIGk9dC56MlNlbGVjdExpZnQ7bi56Mj10LnoyKyhudWxsIT1pP2k6OSl9cmV0dXJuIG59KHRoaXMsMCxuKX1yZXR1cm4gbn1mdW5jdGlvbiBrbCh0KXt0LnN0YXRlUHJveHk9QWw7dmFyIGU9dC5nZXRUZXh0Q29udGVudCgpLG49dC5nZXRUZXh0R3VpZGVMaW5lKCk7ZSYmKGUuc3RhdGVQcm94eT1BbCksbiYmKG4uc3RhdGVQcm94eT1BbCl9ZnVuY3Rpb24gTGwodCxlKXshQmwodCxlKSYmIXQuX19oaWdoQnlPdXRlciYmQ2wodCxfbCl9ZnVuY3Rpb24gUGwodCxlKXshQmwodCxlKSYmIXQuX19oaWdoQnlPdXRlciYmQ2wodCxibCl9ZnVuY3Rpb24gT2wodCxlKXt0Ll9faGlnaEJ5T3V0ZXJ8PTE8PChlfHwwKSxDbCh0LF9sKX1mdW5jdGlvbiBSbCh0LGUpeyEodC5fX2hpZ2hCeU91dGVyJj1+KDE8PChlfHwwKSkpJiZDbCh0LGJsKX1mdW5jdGlvbiBObCh0KXtDbCh0LHdsKX1mdW5jdGlvbiBFbCh0KXtDbCh0LFNsKX1mdW5jdGlvbiB6bCh0KXtDbCh0LE1sKX1mdW5jdGlvbiBWbCh0KXtDbCh0LElsKX1mdW5jdGlvbiBCbCh0LGUpe3JldHVybiB0Ll9faGlnaERvd25TaWxlbnRPblRvdWNoJiZlLnpyQnlUb3VjaH1mdW5jdGlvbiBGbCh0KXt2YXIgZT10LmdldE1vZGVsKCksbj1bXSxpPVtdO2UuZWFjaENvbXBvbmVudCgoZnVuY3Rpb24oZSxyKXt2YXIgbz11bChyKSxhPSJzZXJpZXMiPT09ZSxzPWE/dC5nZXRWaWV3T2ZTZXJpZXNNb2RlbChyKTp0LmdldFZpZXdPZkNvbXBvbmVudE1vZGVsKHIpOyFhJiZpLnB1c2gocyksby5pc0JsdXJlZCYmKHMuZ3JvdXAudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe1NsKHQpfSkpLGEmJm4ucHVzaChyKSksby5pc0JsdXJlZD0hMX0pKSxFKGksKGZ1bmN0aW9uKHQpe3QmJnQudG9nZ2xlQmx1clNlcmllcyYmdC50b2dnbGVCbHVyU2VyaWVzKG4sITEsZSl9KSl9ZnVuY3Rpb24gR2wodCxlLG4saSl7dmFyIHI9aS5nZXRNb2RlbCgpO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9dC5nZXRJdGVtR3JhcGhpY0VsKGVbbl0pO2kmJkVsKGkpfX1pZihuPW58fCJjb29yZGluYXRlU3lzdGVtIixudWxsIT10JiZlJiYibm9uZSIhPT1lKXt2YXIgYT1yLmdldFNlcmllc0J5SW5kZXgodCkscz1hLmNvb3JkaW5hdGVTeXN0ZW07cyYmcy5tYXN0ZXImJihzPXMubWFzdGVyKTt2YXIgbD1bXTtyLmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpe3ZhciByPWE9PT10LHU9dC5jb29yZGluYXRlU3lzdGVtO2lmKHUmJnUubWFzdGVyJiYodT11Lm1hc3RlciksISgic2VyaWVzIj09PW4mJiFyfHwiY29vcmRpbmF0ZVN5c3RlbSI9PT1uJiYhKHUmJnM/dT09PXM6cil8fCJzZXJpZXMiPT09ZSYmcikpe2lmKGkuZ2V0Vmlld09mU2VyaWVzTW9kZWwodCkuZ3JvdXAudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe3QuX19oaWdoQnlPdXRlciYmciYmInNlbGYiPT09ZXx8d2wodCl9KSksTihlKSlvKHQuZ2V0RGF0YSgpLGUpO2Vsc2UgaWYocShlKSlmb3IodmFyIGg9RyhlKSxjPTA7YzxoLmxlbmd0aDtjKyspbyh0LmdldERhdGEoaFtjXSksZVtoW2NdXSk7bC5wdXNoKHQpLHVsKHQpLmlzQmx1cmVkPSEwfX0pKSxyLmVhY2hDb21wb25lbnQoKGZ1bmN0aW9uKHQsZSl7aWYoInNlcmllcyIhPT10KXt2YXIgbj1pLmdldFZpZXdPZkNvbXBvbmVudE1vZGVsKGUpO24mJm4udG9nZ2xlQmx1clNlcmllcyYmbi50b2dnbGVCbHVyU2VyaWVzKGwsITAscil9fSkpfX1mdW5jdGlvbiBXbCh0LGUsbil7aWYobnVsbCE9dCYmbnVsbCE9ZSl7dmFyIGk9bi5nZXRNb2RlbCgpLmdldENvbXBvbmVudCh0LGUpO2lmKGkpe3VsKGkpLmlzQmx1cmVkPSEwO3ZhciByPW4uZ2V0Vmlld09mQ29tcG9uZW50TW9kZWwoaSk7ciYmci5mb2N1c0JsdXJFbmFibGVkJiZyLmdyb3VwLnRyYXZlcnNlKChmdW5jdGlvbih0KXt3bCh0KX0pKX19fWZ1bmN0aW9uIEhsKHQsZSxuLGkpe3ZhciByPXtmb2N1c1NlbGY6ITEsZGlzcGF0Y2hlcnM6bnVsbH07aWYobnVsbD09dHx8InNlcmllcyI9PT10fHxudWxsPT1lfHxudWxsPT1uKXJldHVybiByO3ZhciBvPWkuZ2V0TW9kZWwoKS5nZXRDb21wb25lbnQodCxlKTtpZighbylyZXR1cm4gcjt2YXIgYT1pLmdldFZpZXdPZkNvbXBvbmVudE1vZGVsKG8pO2lmKCFhfHwhYS5maW5kSGlnaERvd25EaXNwYXRjaGVycylyZXR1cm4gcjtmb3IodmFyIHMsbD1hLmZpbmRIaWdoRG93bkRpc3BhdGNoZXJzKG4pLHU9MDt1PGwubGVuZ3RoO3UrKylpZigic2VsZiI9PT1ybChsW3VdKS5mb2N1cyl7cz0hMDticmVha31yZXR1cm57Zm9jdXNTZWxmOnMsZGlzcGF0Y2hlcnM6bH19ZnVuY3Rpb24gWWwodCl7RSh0LmdldEFsbERhdGEoKSwoZnVuY3Rpb24oZSl7dmFyIG49ZS5kYXRhLGk9ZS50eXBlO24uZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKGUsbil7dC5pc1NlbGVjdGVkKG4saSk/emwoZSk6VmwoZSl9KSl9KSl9ZnVuY3Rpb24gWGwodCl7dmFyIGU9W107cmV0dXJuIHQuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7RSh0LmdldEFsbERhdGEoKSwoZnVuY3Rpb24obil7bi5kYXRhO3ZhciBpPW4udHlwZSxyPXQuZ2V0U2VsZWN0ZWREYXRhSW5kaWNlcygpO2lmKHIubGVuZ3RoPjApe3ZhciBvPXtkYXRhSW5kZXg6cixzZXJpZXNJbmRleDp0LnNlcmllc0luZGV4fTtudWxsIT1pJiYoby5kYXRhVHlwZT1pKSxlLnB1c2gobyl9fSkpfSkpLGV9ZnVuY3Rpb24gVWwodCxlLG4pe0psKHQsITApLENsKHQsa2wpLGpsKHQsZSxuKX1mdW5jdGlvbiBabCh0LGUsbixpKXtpP2Z1bmN0aW9uKHQpe0psKHQsITEpfSh0KTpVbCh0LGUsbil9ZnVuY3Rpb24gamwodCxlLG4pe3ZhciBpPXJsKHQpO251bGwhPWU/KGkuZm9jdXM9ZSxpLmJsdXJTY29wZT1uKTppLmZvY3VzJiYoaS5mb2N1cz1udWxsKX12YXIgcWw9WyJlbXBoYXNpcyIsImJsdXIiLCJzZWxlY3QiXSxLbD17aXRlbVN0eWxlOiJnZXRJdGVtU3R5bGUiLGxpbmVTdHlsZToiZ2V0TGluZVN0eWxlIixhcmVhU3R5bGU6ImdldEFyZWFTdHlsZSJ9O2Z1bmN0aW9uICRsKHQsZSxuLGkpe249bnx8Iml0ZW1TdHlsZSI7Zm9yKHZhciByPTA7cjxxbC5sZW5ndGg7cisrKXt2YXIgbz1xbFtyXSxhPWUuZ2V0TW9kZWwoW28sbl0pO3QuZW5zdXJlU3RhdGUobykuc3R5bGU9aT9pKGEpOmFbS2xbbl1dKCl9fWZ1bmN0aW9uIEpsKHQsZSl7dmFyIG49ITE9PT1lLGk9dDt0LmhpZ2hEb3duU2lsZW50T25Ub3VjaCYmKGkuX19oaWdoRG93blNpbGVudE9uVG91Y2g9dC5oaWdoRG93blNpbGVudE9uVG91Y2gpLG4mJiFpLl9faGlnaERvd25EaXNwYXRjaGVyfHwoaS5fX2hpZ2hCeU91dGVyPWkuX19oaWdoQnlPdXRlcnx8MCxpLl9faGlnaERvd25EaXNwYXRjaGVyPSFuKX1mdW5jdGlvbiBRbCh0KXtyZXR1cm4hKCF0fHwhdC5fX2hpZ2hEb3duRGlzcGF0Y2hlcil9ZnVuY3Rpb24gdHUodCl7dmFyIGU9dC50eXBlO3JldHVybiBlPT09Z2x8fGU9PT15bHx8ZT09PXZsfWZ1bmN0aW9uIGV1KHQpe3ZhciBlPXQudHlwZTtyZXR1cm4gZT09PWRsfHxlPT09Zmx9dmFyIG51PWhzLkNNRCxpdT1bW10sW10sW11dLHJ1PU1hdGguc3FydCxvdT1NYXRoLmF0YW4yO2Z1bmN0aW9uIGF1KHQsZSl7aWYoZSl7dmFyIG4saSxyLG8sYSxzLGw9dC5kYXRhLHU9dC5sZW4oKSxoPW51Lk0sYz1udS5DLHA9bnUuTCxkPW51LlIsZj1udS5BLGc9bnUuUTtmb3Iocj0wLG89MDtyPHU7KXtzd2l0Y2gobj1sW3IrK10sbz1yLGk9MCxuKXtjYXNlIGg6Y2FzZSBwOmk9MTticmVhaztjYXNlIGM6aT0zO2JyZWFrO2Nhc2UgZzppPTI7YnJlYWs7Y2FzZSBmOnZhciB5PWVbNF0sdj1lWzVdLG09cnUoZVswXSplWzBdK2VbMV0qZVsxXSkseD1ydShlWzJdKmVbMl0rZVszXSplWzNdKSxfPW91KC1lWzFdL3gsZVswXS9tKTtsW3JdKj1tLGxbcisrXSs9eSxsW3JdKj14LGxbcisrXSs9dixsW3IrK10qPW0sbFtyKytdKj14LGxbcisrXSs9XyxsW3IrK10rPV8sbz1yKz0yO2JyZWFrO2Nhc2UgZDpzWzBdPWxbcisrXSxzWzFdPWxbcisrXSxXdChzLHMsZSksbFtvKytdPXNbMF0sbFtvKytdPXNbMV0sc1swXSs9bFtyKytdLHNbMV0rPWxbcisrXSxXdChzLHMsZSksbFtvKytdPXNbMF0sbFtvKytdPXNbMV19Zm9yKGE9MDthPGk7YSsrKXt2YXIgYj1pdVthXTtiWzBdPWxbcisrXSxiWzFdPWxbcisrXSxXdChiLGIsZSksbFtvKytdPWJbMF0sbFtvKytdPWJbMV19fXQuaW5jcmVhc2VWZXJzaW9uKCl9fXZhciBzdT1NYXRoLnNxcnQsbHU9TWF0aC5zaW4sdXU9TWF0aC5jb3MsaHU9TWF0aC5QSTtmdW5jdGlvbiBjdSh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pfWZ1bmN0aW9uIHB1KHQsZSl7cmV0dXJuKHRbMF0qZVswXSt0WzFdKmVbMV0pLyhjdSh0KSpjdShlKSl9ZnVuY3Rpb24gZHUodCxlKXtyZXR1cm4odFswXSplWzFdPHRbMV0qZVswXT8tMToxKSpNYXRoLmFjb3MocHUodCxlKSl9ZnVuY3Rpb24gZnUodCxlLG4saSxyLG8sYSxzLGwsdSxoKXt2YXIgYz1sKihodS8xODApLHA9dXUoYykqKHQtbikvMitsdShjKSooZS1pKS8yLGQ9LTEqbHUoYykqKHQtbikvMit1dShjKSooZS1pKS8yLGY9cCpwLyhhKmEpK2QqZC8ocypzKTtmPjEmJihhKj1zdShmKSxzKj1zdShmKSk7dmFyIGc9KHI9PT1vPy0xOjEpKnN1KChhKmEqKHMqcyktYSphKihkKmQpLXMqcyoocCpwKSkvKGEqYSooZCpkKStzKnMqKHAqcCkpKXx8MCx5PWcqYSpkL3Msdj1nKi1zKnAvYSxtPSh0K24pLzIrdXUoYykqeS1sdShjKSp2LHg9KGUraSkvMitsdShjKSp5K3V1KGMpKnYsXz1kdShbMSwwXSxbKHAteSkvYSwoZC12KS9zXSksYj1bKHAteSkvYSwoZC12KS9zXSx3PVsoLTEqcC15KS9hLCgtMSpkLXYpL3NdLFM9ZHUoYix3KTtpZihwdShiLHcpPD0tMSYmKFM9aHUpLHB1KGIsdyk+PTEmJihTPTApLFM8MCl7dmFyIE09TWF0aC5yb3VuZChTL2h1KjFlNikvMWU2O1M9MipodStNJTIqaHV9aC5hZGREYXRhKHUsbSx4LGEscyxfLFMsYyxvKX12YXIgZ3U9LyhbbWx2aHpjcXRzYV0pKFtebWx2aHpjcXRzYV0qKS9naSx5dT0vLT8oWzAtOV0qXC4pP1swLTldKyhbZUVdLT9bMC05XSspPy9nO3ZhciB2dT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQpe30sZX0oa3MpO2Z1bmN0aW9uIG11KHQpe3JldHVybiBudWxsIT10LnNldERhdGF9ZnVuY3Rpb24geHUodCxlKXt2YXIgbj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaHM7aWYoIXQpcmV0dXJuIGU7dmFyIG4saT0wLHI9MCxvPWksYT1yLHM9aHMuQ01ELGw9dC5tYXRjaChndSk7aWYoIWwpcmV0dXJuIGU7Zm9yKHZhciB1PTA7dTxsLmxlbmd0aDt1Kyspe2Zvcih2YXIgaD1sW3VdLGM9aC5jaGFyQXQoMCkscD12b2lkIDAsZD1oLm1hdGNoKHl1KXx8W10sZj1kLmxlbmd0aCxnPTA7ZzxmO2crKylkW2ddPXBhcnNlRmxvYXQoZFtnXSk7Zm9yKHZhciB5PTA7eTxmOyl7dmFyIHY9dm9pZCAwLG09dm9pZCAwLHg9dm9pZCAwLF89dm9pZCAwLGI9dm9pZCAwLHc9dm9pZCAwLFM9dm9pZCAwLE09aSxJPXIsVD12b2lkIDAsQz12b2lkIDA7c3dpdGNoKGMpe2Nhc2UibCI6aSs9ZFt5KytdLHIrPWRbeSsrXSxwPXMuTCxlLmFkZERhdGEocCxpLHIpO2JyZWFrO2Nhc2UiTCI6aT1kW3krK10scj1kW3krK10scD1zLkwsZS5hZGREYXRhKHAsaSxyKTticmVhaztjYXNlIm0iOmkrPWRbeSsrXSxyKz1kW3krK10scD1zLk0sZS5hZGREYXRhKHAsaSxyKSxvPWksYT1yLGM9ImwiO2JyZWFrO2Nhc2UiTSI6aT1kW3krK10scj1kW3krK10scD1zLk0sZS5hZGREYXRhKHAsaSxyKSxvPWksYT1yLGM9IkwiO2JyZWFrO2Nhc2UiaCI6aSs9ZFt5KytdLHA9cy5MLGUuYWRkRGF0YShwLGkscik7YnJlYWs7Y2FzZSJIIjppPWRbeSsrXSxwPXMuTCxlLmFkZERhdGEocCxpLHIpO2JyZWFrO2Nhc2UidiI6cis9ZFt5KytdLHA9cy5MLGUuYWRkRGF0YShwLGkscik7YnJlYWs7Y2FzZSJWIjpyPWRbeSsrXSxwPXMuTCxlLmFkZERhdGEocCxpLHIpO2JyZWFrO2Nhc2UiQyI6cD1zLkMsZS5hZGREYXRhKHAsZFt5KytdLGRbeSsrXSxkW3krK10sZFt5KytdLGRbeSsrXSxkW3krK10pLGk9ZFt5LTJdLHI9ZFt5LTFdO2JyZWFrO2Nhc2UiYyI6cD1zLkMsZS5hZGREYXRhKHAsZFt5KytdK2ksZFt5KytdK3IsZFt5KytdK2ksZFt5KytdK3IsZFt5KytdK2ksZFt5KytdK3IpLGkrPWRbeS0yXSxyKz1kW3ktMV07YnJlYWs7Y2FzZSJTIjp2PWksbT1yLFQ9ZS5sZW4oKSxDPWUuZGF0YSxuPT09cy5DJiYodis9aS1DW1QtNF0sbSs9ci1DW1QtM10pLHA9cy5DLE09ZFt5KytdLEk9ZFt5KytdLGk9ZFt5KytdLHI9ZFt5KytdLGUuYWRkRGF0YShwLHYsbSxNLEksaSxyKTticmVhaztjYXNlInMiOnY9aSxtPXIsVD1lLmxlbigpLEM9ZS5kYXRhLG49PT1zLkMmJih2Kz1pLUNbVC00XSxtKz1yLUNbVC0zXSkscD1zLkMsTT1pK2RbeSsrXSxJPXIrZFt5KytdLGkrPWRbeSsrXSxyKz1kW3krK10sZS5hZGREYXRhKHAsdixtLE0sSSxpLHIpO2JyZWFrO2Nhc2UiUSI6TT1kW3krK10sST1kW3krK10saT1kW3krK10scj1kW3krK10scD1zLlEsZS5hZGREYXRhKHAsTSxJLGkscik7YnJlYWs7Y2FzZSJxIjpNPWRbeSsrXStpLEk9ZFt5KytdK3IsaSs9ZFt5KytdLHIrPWRbeSsrXSxwPXMuUSxlLmFkZERhdGEocCxNLEksaSxyKTticmVhaztjYXNlIlQiOnY9aSxtPXIsVD1lLmxlbigpLEM9ZS5kYXRhLG49PT1zLlEmJih2Kz1pLUNbVC00XSxtKz1yLUNbVC0zXSksaT1kW3krK10scj1kW3krK10scD1zLlEsZS5hZGREYXRhKHAsdixtLGkscik7YnJlYWs7Y2FzZSJ0Ijp2PWksbT1yLFQ9ZS5sZW4oKSxDPWUuZGF0YSxuPT09cy5RJiYodis9aS1DW1QtNF0sbSs9ci1DW1QtM10pLGkrPWRbeSsrXSxyKz1kW3krK10scD1zLlEsZS5hZGREYXRhKHAsdixtLGkscik7YnJlYWs7Y2FzZSJBIjp4PWRbeSsrXSxfPWRbeSsrXSxiPWRbeSsrXSx3PWRbeSsrXSxTPWRbeSsrXSxmdShNPWksST1yLGk9ZFt5KytdLHI9ZFt5KytdLHcsUyx4LF8sYixwPXMuQSxlKTticmVhaztjYXNlImEiOng9ZFt5KytdLF89ZFt5KytdLGI9ZFt5KytdLHc9ZFt5KytdLFM9ZFt5KytdLGZ1KE09aSxJPXIsaSs9ZFt5KytdLHIrPWRbeSsrXSx3LFMseCxfLGIscD1zLkEsZSl9fSJ6IiE9PWMmJiJaIiE9PWN8fChwPXMuWixlLmFkZERhdGEocCksaT1vLHI9YSksbj1wfXJldHVybiBlLnRvU3RhdGljKCksZX0odCksaT1BKHt9LGUpO3JldHVybiBpLmJ1aWxkUGF0aD1mdW5jdGlvbih0KXtpZihtdSh0KSl7dC5zZXREYXRhKG4uZGF0YSksKGU9dC5nZXRDb250ZXh0KCkpJiZ0LnJlYnVpbGRQYXRoKGUsMSl9ZWxzZXt2YXIgZT10O24ucmVidWlsZFBhdGgoZSwxKX19LGkuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odCl7YXUobix0KSx0aGlzLmRpcnR5U2hhcGUoKX0saX1mdW5jdGlvbiBfdSh0LGUpe3JldHVybiBuZXcgdnUoeHUodCxlKSl9ZnVuY3Rpb24gYnUodCxlKXtlPWV8fHt9O3ZhciBuPW5ldyBrcztyZXR1cm4gdC5zaGFwZSYmbi5zZXRTaGFwZSh0LnNoYXBlKSxuLnNldFN0eWxlKHQuc3R5bGUpLGUuYmFrZVRyYW5zZm9ybT9hdShuLnBhdGgsdC5nZXRDb21wdXRlZFRyYW5zZm9ybSgpKTplLnRvTG9jYWw/bi5zZXRMb2NhbFRyYW5zZm9ybSh0LmdldENvbXB1dGVkVHJhbnNmb3JtKCkpOm4uY29weVRyYW5zZm9ybSh0KSxuLmJ1aWxkUGF0aD10LmJ1aWxkUGF0aCxuLmFwcGx5VHJhbnNmb3JtPW4uYXBwbHlUcmFuc2Zvcm0sbi56PXQueixuLnoyPXQuejIsbi56bGV2ZWw9dC56bGV2ZWwsbn12YXIgd3U9ZnVuY3Rpb24oKXt0aGlzLmN4PTAsdGhpcy5jeT0wLHRoaXMucj0wfSxTdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgd3V9LGUucHJvdG90eXBlLmJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe3QubW92ZVRvKGUuY3grZS5yLGUuY3kpLHQuYXJjKGUuY3gsZS5jeSxlLnIsMCwyKk1hdGguUEkpfSxlfShrcyk7U3UucHJvdG90eXBlLnR5cGU9ImNpcmNsZSI7dmFyIE11PWZ1bmN0aW9uKCl7dGhpcy5jeD0wLHRoaXMuY3k9MCx0aGlzLnJ4PTAsdGhpcy5yeT0wfSxJdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgTXV9LGUucHJvdG90eXBlLmJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuPS41NTIyODQ4LGk9ZS5jeCxyPWUuY3ksbz1lLnJ4LGE9ZS5yeSxzPW8qbixsPWEqbjt0Lm1vdmVUbyhpLW8sciksdC5iZXppZXJDdXJ2ZVRvKGktbyxyLWwsaS1zLHItYSxpLHItYSksdC5iZXppZXJDdXJ2ZVRvKGkrcyxyLWEsaStvLHItbCxpK28sciksdC5iZXppZXJDdXJ2ZVRvKGkrbyxyK2wsaStzLHIrYSxpLHIrYSksdC5iZXppZXJDdXJ2ZVRvKGktcyxyK2EsaS1vLHIrbCxpLW8sciksdC5jbG9zZVBhdGgoKX0sZX0oa3MpO0l1LnByb3RvdHlwZS50eXBlPSJlbGxpcHNlIjt2YXIgVHU9TWF0aC5QSSxDdT0yKlR1LER1PU1hdGguc2luLEF1PU1hdGguY29zLGt1PU1hdGguYWNvcyxMdT1NYXRoLmF0YW4yLFB1PU1hdGguYWJzLE91PU1hdGguc3FydCxSdT1NYXRoLm1heCxOdT1NYXRoLm1pbixFdT0xZS00O2Z1bmN0aW9uIHp1KHQsZSxuLGkscixvLGEpe3ZhciBzPXQtbixsPWUtaSx1PShhP286LW8pL091KHMqcytsKmwpLGg9dSpsLGM9LXUqcyxwPXQraCxkPWUrYyxmPW4raCxnPWkrYyx5PShwK2YpLzIsdj0oZCtnKS8yLG09Zi1wLHg9Zy1kLF89bSptK3gqeCxiPXItbyx3PXAqZy1mKmQsUz0oeDwwPy0xOjEpKk91KFJ1KDAsYipiKl8tdyp3KSksTT0odyp4LW0qUykvXyxJPSgtdyptLXgqUykvXyxUPSh3KngrbSpTKS9fLEM9KC13Km0reCpTKS9fLEQ9TS15LEE9SS12LGs9VC15LEw9Qy12O3JldHVybiBEKkQrQSpBPmsqaytMKkwmJihNPVQsST1DKSx7Y3g6TSxjeTpJLHgwOi1oLHkwOi1jLHgxOk0qKHIvYi0xKSx5MTpJKihyL2ItMSl9fWZ1bmN0aW9uIFZ1KHQsZSl7dmFyIG4saT1SdShlLnIsMCkscj1SdShlLnIwfHwwLDApLG89aT4wO2lmKG98fHI+MCl7aWYob3x8KGk9cixyPTApLHI+aSl7dmFyIGE9aTtpPXIscj1hfXZhciBzPWUuc3RhcnRBbmdsZSxsPWUuZW5kQW5nbGU7aWYoIWlzTmFOKHMpJiYhaXNOYU4obCkpe3ZhciB1PWUuY3gsaD1lLmN5LGM9ISFlLmNsb2Nrd2lzZSxwPVB1KGwtcyksZD1wPkN1JiZwJUN1O2lmKGQ+RXUmJihwPWQpLGk+RXUpaWYocD5DdS1FdSl0Lm1vdmVUbyh1K2kqQXUocyksaCtpKkR1KHMpKSx0LmFyYyh1LGgsaSxzLGwsIWMpLHI+RXUmJih0Lm1vdmVUbyh1K3IqQXUobCksaCtyKkR1KGwpKSx0LmFyYyh1LGgscixsLHMsYykpO2Vsc2V7dmFyIGY9dm9pZCAwLGc9dm9pZCAwLHk9dm9pZCAwLHY9dm9pZCAwLG09dm9pZCAwLHg9dm9pZCAwLF89dm9pZCAwLGI9dm9pZCAwLHc9dm9pZCAwLFM9dm9pZCAwLE09dm9pZCAwLEk9dm9pZCAwLFQ9dm9pZCAwLEM9dm9pZCAwLEQ9dm9pZCAwLEE9dm9pZCAwLGs9aSpBdShzKSxMPWkqRHUocyksUD1yKkF1KGwpLE89cipEdShsKSxSPXA+RXU7aWYoUil7dmFyIE49ZS5jb3JuZXJSYWRpdXM7TiYmKG49ZnVuY3Rpb24odCl7dmFyIGU7aWYoWSh0KSl7dmFyIG49dC5sZW5ndGg7aWYoIW4pcmV0dXJuIHQ7ZT0xPT09bj9bdFswXSx0WzBdLDAsMF06Mj09PW4/W3RbMF0sdFswXSx0WzFdLHRbMV1dOjM9PT1uP3QuY29uY2F0KHRbMl0pOnR9ZWxzZSBlPVt0LHQsdCx0XTtyZXR1cm4gZX0oTiksZj1uWzBdLGc9blsxXSx5PW5bMl0sdj1uWzNdKTt2YXIgRT1QdShpLXIpLzI7aWYobT1OdShFLHkpLHg9TnUoRSx2KSxfPU51KEUsZiksYj1OdShFLGcpLE09dz1SdShtLHgpLEk9Uz1SdShfLGIpLCh3PkV1fHxTPkV1KSYmKFQ9aSpBdShsKSxDPWkqRHUobCksRD1yKkF1KHMpLEE9cipEdShzKSxwPFR1KSl7dmFyIHo9ZnVuY3Rpb24odCxlLG4saSxyLG8sYSxzKXt2YXIgbD1uLXQsdT1pLWUsaD1hLXIsYz1zLW8scD1jKmwtaCp1O2lmKCEocCpwPEV1KSlyZXR1cm5bdCsocD0oaCooZS1vKS1jKih0LXIpKS9wKSpsLGUrcCp1XX0oayxMLEQsQSxULEMsUCxPKTtpZih6KXt2YXIgVj1rLXpbMF0sQj1MLXpbMV0sRj1ULXpbMF0sRz1DLXpbMV0sVz0xL0R1KGt1KChWKkYrQipHKS8oT3UoVipWK0IqQikqT3UoRipGK0cqRykpKS8yKSxIPU91KHpbMF0qelswXSt6WzFdKnpbMV0pO009TnUodywoaS1IKS8oVysxKSksST1OdShTLChyLUgpLyhXLTEpKX19fWlmKFIpaWYoTT5FdSl7dmFyIFg9TnUoeSxNKSxVPU51KHYsTSksWj16dShELEEsayxMLGksWCxjKSxqPXp1KFQsQyxQLE8saSxVLGMpO3QubW92ZVRvKHUrWi5jeCtaLngwLGgrWi5jeStaLnkwKSxNPHcmJlg9PT1VP3QuYXJjKHUrWi5jeCxoK1ouY3ksTSxMdShaLnkwLFoueDApLEx1KGoueTAsai54MCksIWMpOihYPjAmJnQuYXJjKHUrWi5jeCxoK1ouY3ksWCxMdShaLnkwLFoueDApLEx1KFoueTEsWi54MSksIWMpLHQuYXJjKHUsaCxpLEx1KFouY3krWi55MSxaLmN4K1oueDEpLEx1KGouY3krai55MSxqLmN4K2oueDEpLCFjKSxVPjAmJnQuYXJjKHUrai5jeCxoK2ouY3ksVSxMdShqLnkxLGoueDEpLEx1KGoueTAsai54MCksIWMpKX1lbHNlIHQubW92ZVRvKHUrayxoK0wpLHQuYXJjKHUsaCxpLHMsbCwhYyk7ZWxzZSB0Lm1vdmVUbyh1K2ssaCtMKTtpZihyPkV1JiZSKWlmKEk+RXUpe1g9TnUoZixJKSxaPXp1KFAsTyxULEMsciwtKFU9TnUoZyxJKSksYyksaj16dShrLEwsRCxBLHIsLVgsYyk7dC5saW5lVG8odStaLmN4K1oueDAsaCtaLmN5K1oueTApLEk8UyYmWD09PVU/dC5hcmModStaLmN4LGgrWi5jeSxJLEx1KFoueTAsWi54MCksTHUoai55MCxqLngwKSwhYyk6KFU+MCYmdC5hcmModStaLmN4LGgrWi5jeSxVLEx1KFoueTAsWi54MCksTHUoWi55MSxaLngxKSwhYyksdC5hcmModSxoLHIsTHUoWi5jeStaLnkxLFouY3grWi54MSksTHUoai5jeStqLnkxLGouY3grai54MSksYyksWD4wJiZ0LmFyYyh1K2ouY3gsaCtqLmN5LFgsTHUoai55MSxqLngxKSxMdShqLnkwLGoueDApLCFjKSl9ZWxzZSB0LmxpbmVUbyh1K1AsaCtPKSx0LmFyYyh1LGgscixsLHMsYyk7ZWxzZSB0LmxpbmVUbyh1K1AsaCtPKX1lbHNlIHQubW92ZVRvKHUsaCk7dC5jbG9zZVBhdGgoKX19fXZhciBCdT1mdW5jdGlvbigpe3RoaXMuY3g9MCx0aGlzLmN5PTAsdGhpcy5yMD0wLHRoaXMucj0wLHRoaXMuc3RhcnRBbmdsZT0wLHRoaXMuZW5kQW5nbGU9MipNYXRoLlBJLHRoaXMuY2xvY2t3aXNlPSEwLHRoaXMuY29ybmVyUmFkaXVzPTB9LEZ1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBCdX0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7VnUodCxlKX0sZS5wcm90b3R5cGUuaXNaZXJvQXJlYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYXBlLnN0YXJ0QW5nbGU9PT10aGlzLnNoYXBlLmVuZEFuZ2xlfHx0aGlzLnNoYXBlLnI9PT10aGlzLnNoYXBlLnIwfSxlfShrcyk7RnUucHJvdG90eXBlLnR5cGU9InNlY3RvciI7dmFyIEd1PWZ1bmN0aW9uKCl7dGhpcy5jeD0wLHRoaXMuY3k9MCx0aGlzLnI9MCx0aGlzLnIwPTB9LFd1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBHdX0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jeCxpPWUuY3kscj0yKk1hdGguUEk7dC5tb3ZlVG8obitlLnIsaSksdC5hcmMobixpLGUuciwwLHIsITEpLHQubW92ZVRvKG4rZS5yMCxpKSx0LmFyYyhuLGksZS5yMCwwLHIsITApfSxlfShrcyk7ZnVuY3Rpb24gSHUodCxlLG4pe3ZhciBpPWUuc21vb3RoLHI9ZS5wb2ludHM7aWYociYmci5sZW5ndGg+PTIpe2lmKGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByLG8sYSxzLGw9W10sdT1bXSxoPVtdLGM9W107aWYoaSl7YT1bMS8wLDEvMF0scz1bLTEvMCwtMS8wXTtmb3IodmFyIHA9MCxkPXQubGVuZ3RoO3A8ZDtwKyspSHQoYSxhLHRbcF0pLFl0KHMscyx0W3BdKTtIdChhLGEsaVswXSksWXQocyxzLGlbMV0pfWZvcihwPTAsZD10Lmxlbmd0aDtwPGQ7cCsrKXt2YXIgZj10W3BdO2lmKG4pcj10W3A/cC0xOmQtMV0sbz10WyhwKzEpJWRdO2Vsc2V7aWYoMD09PXB8fHA9PT1kLTEpe2wucHVzaChUdCh0W3BdKSk7Y29udGludWV9cj10W3AtMV0sbz10W3ArMV19a3QodSxvLHIpLE50KHUsdSxlKTt2YXIgZz16dChmLHIpLHk9enQoZixvKSx2PWcreTswIT09diYmKGcvPXYseS89diksTnQoaCx1LC1nKSxOdChjLHUseSk7dmFyIG09RHQoW10sZixoKSx4PUR0KFtdLGYsYyk7aSYmKFl0KG0sbSxhKSxIdChtLG0scyksWXQoeCx4LGEpLEh0KHgseCxzKSksbC5wdXNoKG0pLGwucHVzaCh4KX1yZXR1cm4gbiYmbC5wdXNoKGwuc2hpZnQoKSksbH0ocixpLG4sZS5zbW9vdGhDb25zdHJhaW50KTt0Lm1vdmVUbyhyWzBdWzBdLHJbMF1bMV0pO2Zvcih2YXIgYT1yLmxlbmd0aCxzPTA7czwobj9hOmEtMSk7cysrKXt2YXIgbD1vWzIqc10sdT1vWzIqcysxXSxoPXJbKHMrMSklYV07dC5iZXppZXJDdXJ2ZVRvKGxbMF0sbFsxXSx1WzBdLHVbMV0saFswXSxoWzFdKX19ZWxzZXt0Lm1vdmVUbyhyWzBdWzBdLHJbMF1bMV0pO3M9MTtmb3IodmFyIGM9ci5sZW5ndGg7czxjO3MrKyl0LmxpbmVUbyhyW3NdWzBdLHJbc11bMV0pfW4mJnQuY2xvc2VQYXRoKCl9fVd1LnByb3RvdHlwZS50eXBlPSJyaW5nIjt2YXIgWXU9ZnVuY3Rpb24oKXt0aGlzLnBvaW50cz1udWxsLHRoaXMuc21vb3RoPTAsdGhpcy5zbW9vdGhDb25zdHJhaW50PW51bGx9LFh1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZdX0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7SHUodCxlLCEwKX0sZX0oa3MpO1h1LnByb3RvdHlwZS50eXBlPSJwb2x5Z29uIjt2YXIgVXU9ZnVuY3Rpb24oKXt0aGlzLnBvaW50cz1udWxsLHRoaXMucGVyY2VudD0xLHRoaXMuc21vb3RoPTAsdGhpcy5zbW9vdGhDb25zdHJhaW50PW51bGx9LFp1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJue3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfX0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBVdX0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7SHUodCxlLCExKX0sZX0oa3MpO1p1LnByb3RvdHlwZS50eXBlPSJwb2x5bGluZSI7dmFyIGp1PXt9LHF1PWZ1bmN0aW9uKCl7dGhpcy54MT0wLHRoaXMueTE9MCx0aGlzLngyPTAsdGhpcy55Mj0wLHRoaXMucGVyY2VudD0xfSxLdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRTdHlsZT1mdW5jdGlvbigpe3JldHVybntzdHJva2U6IiMwMDAiLGZpbGw6bnVsbH19LGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcXV9LGUucHJvdG90eXBlLmJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuLGkscixvO2lmKHRoaXMuc3ViUGl4ZWxPcHRpbWl6ZSl7dmFyIGE9enMoanUsZSx0aGlzLnN0eWxlKTtuPWEueDEsaT1hLnkxLHI9YS54MixvPWEueTJ9ZWxzZSBuPWUueDEsaT1lLnkxLHI9ZS54MixvPWUueTI7dmFyIHM9ZS5wZXJjZW50OzAhPT1zJiYodC5tb3ZlVG8obixpKSxzPDEmJihyPW4qKDEtcykrcipzLG89aSooMS1zKStvKnMpLHQubGluZVRvKHIsbykpfSxlLnByb3RvdHlwZS5wb2ludEF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2hhcGU7cmV0dXJuW2UueDEqKDEtdCkrZS54Mip0LGUueTEqKDEtdCkrZS55Mip0XX0sZX0oa3MpO0t1LnByb3RvdHlwZS50eXBlPSJsaW5lIjt2YXIgJHU9W10sSnU9ZnVuY3Rpb24oKXt0aGlzLngxPTAsdGhpcy55MT0wLHRoaXMueDI9MCx0aGlzLnkyPTAsdGhpcy5jcHgxPTAsdGhpcy5jcHkxPTAsdGhpcy5wZXJjZW50PTF9O2Z1bmN0aW9uIFF1KHQsZSxuKXt2YXIgaT10LmNweDIscj10LmNweTI7cmV0dXJuIG51bGwhPWl8fG51bGwhPXI/WyhuP3huOm1uKSh0LngxLHQuY3B4MSx0LmNweDIsdC54MixlKSwobj94bjptbikodC55MSx0LmNweTEsdC5jcHkyLHQueTIsZSldOlsobj9UbjpJbikodC54MSx0LmNweDEsdC54MixlKSwobj9UbjpJbikodC55MSx0LmNweTEsdC55MixlKV19dmFyIHRoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJue3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfX0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBKdX0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS54MSxpPWUueTEscj1lLngyLG89ZS55MixhPWUuY3B4MSxzPWUuY3B5MSxsPWUuY3B4Mix1PWUuY3B5MixoPWUucGVyY2VudDswIT09aCYmKHQubW92ZVRvKG4saSksbnVsbD09bHx8bnVsbD09dT8oaDwxJiYoRG4obixhLHIsaCwkdSksYT0kdVsxXSxyPSR1WzJdLERuKGkscyxvLGgsJHUpLHM9JHVbMV0sbz0kdVsyXSksdC5xdWFkcmF0aWNDdXJ2ZVRvKGEscyxyLG8pKTooaDwxJiYod24obixhLGwscixoLCR1KSxhPSR1WzFdLGw9JHVbMl0scj0kdVszXSx3bihpLHMsdSxvLGgsJHUpLHM9JHVbMV0sdT0kdVsyXSxvPSR1WzNdKSx0LmJlemllckN1cnZlVG8oYSxzLGwsdSxyLG8pKSl9LGUucHJvdG90eXBlLnBvaW50QXQ9ZnVuY3Rpb24odCl7cmV0dXJuIFF1KHRoaXMuc2hhcGUsdCwhMSl9LGUucHJvdG90eXBlLnRhbmdlbnRBdD1mdW5jdGlvbih0KXt2YXIgZT1RdSh0aGlzLnNoYXBlLHQsITApO3JldHVybiBFdChlLGUpfSxlfShrcyk7dGgucHJvdG90eXBlLnR5cGU9ImJlemllci1jdXJ2ZSI7dmFyIGVoPWZ1bmN0aW9uKCl7dGhpcy5jeD0wLHRoaXMuY3k9MCx0aGlzLnI9MCx0aGlzLnN0YXJ0QW5nbGU9MCx0aGlzLmVuZEFuZ2xlPTIqTWF0aC5QSSx0aGlzLmNsb2Nrd2lzZT0hMH0sbmg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0U3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm57c3Ryb2tlOiIjMDAwIixmaWxsOm51bGx9fSxlLnByb3RvdHlwZS5nZXREZWZhdWx0U2hhcGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGVofSxlLnByb3RvdHlwZS5idWlsZFBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmN4LGk9ZS5jeSxyPU1hdGgubWF4KGUuciwwKSxvPWUuc3RhcnRBbmdsZSxhPWUuZW5kQW5nbGUscz1lLmNsb2Nrd2lzZSxsPU1hdGguY29zKG8pLHU9TWF0aC5zaW4obyk7dC5tb3ZlVG8obCpyK24sdSpyK2kpLHQuYXJjKG4saSxyLG8sYSwhcyl9LGV9KGtzKTtuaC5wcm90b3R5cGUudHlwZT0iYXJjIjt2YXIgaWg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPSJjb21wb3VuZCIsZX1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLl91cGRhdGVQYXRoRGlydHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5zaGFwZS5wYXRocyxlPXRoaXMuc2hhcGVDaGFuZ2VkKCksbj0wO248dC5sZW5ndGg7bisrKWU9ZXx8dFtuXS5zaGFwZUNoYW5nZWQoKTtlJiZ0aGlzLmRpcnR5U2hhcGUoKX0sZS5wcm90b3R5cGUuYmVmb3JlQnJ1c2g9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQYXRoRGlydHkoKTtmb3IodmFyIHQ9dGhpcy5zaGFwZS5wYXRoc3x8W10sZT10aGlzLmdldEdsb2JhbFNjYWxlKCksbj0wO248dC5sZW5ndGg7bisrKXRbbl0ucGF0aHx8dFtuXS5jcmVhdGVQYXRoUHJveHkoKSx0W25dLnBhdGguc2V0U2NhbGUoZVswXSxlWzFdLHRbbl0uc2VnbWVudElnbm9yZVRocmVzaG9sZCl9LGUucHJvdG90eXBlLmJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLnBhdGhzfHxbXSxpPTA7aTxuLmxlbmd0aDtpKyspbltpXS5idWlsZFBhdGgodCxuW2ldLnNoYXBlLCEwKX0sZS5wcm90b3R5cGUuYWZ0ZXJCcnVzaD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnNoYXBlLnBhdGhzfHxbXSxlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXS5wYXRoVXBkYXRlZCgpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGluZ1JlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlUGF0aERpcnR5LmNhbGwodGhpcyksa3MucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdC5jYWxsKHRoaXMpfSxlfShrcykscmg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuY29sb3JTdG9wcz10fHxbXX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkQ29sb3JTdG9wPWZ1bmN0aW9uKHQsZSl7dGhpcy5jb2xvclN0b3BzLnB1c2goe29mZnNldDp0LGNvbG9yOmV9KX0sdH0oKSxvaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixpLHIsbyxhKXt2YXIgcz10LmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gcy54PW51bGw9PWU/MDplLHMueT1udWxsPT1uPzA6bixzLngyPW51bGw9PWk/MTppLHMueTI9bnVsbD09cj8wOnIscy50eXBlPSJsaW5lYXIiLHMuZ2xvYmFsPWF8fCExLHN9cmV0dXJuIG4oZSx0KSxlfShyaCksYWg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4saSxyLG8pe3ZhciBhPXQuY2FsbCh0aGlzLHIpfHx0aGlzO3JldHVybiBhLng9bnVsbD09ZT8uNTplLGEueT1udWxsPT1uPy41Om4sYS5yPW51bGw9PWk/LjU6aSxhLnR5cGU9InJhZGlhbCIsYS5nbG9iYWw9b3x8ITEsYX1yZXR1cm4gbihlLHQpLGV9KHJoKSxzaD1bMCwwXSxsaD1bMCwwXSx1aD1uZXcgRGUsaGg9bmV3IERlLGNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2Nvcm5lcnM9W10sdGhpcy5fYXhlcz1bXSx0aGlzLl9vcmlnaW49WzAsMF07Zm9yKHZhciBuPTA7bjw0O24rKyl0aGlzLl9jb3JuZXJzW25dPW5ldyBEZTtmb3Iobj0wO248MjtuKyspdGhpcy5fYXhlc1tuXT1uZXcgRGU7dCYmdGhpcy5mcm9tQm91bmRpbmdSZWN0KHQsZSl9cmV0dXJuIHQucHJvdG90eXBlLmZyb21Cb3VuZGluZ1JlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb3JuZXJzLGk9dGhpcy5fYXhlcyxyPXQueCxvPXQueSxhPXIrdC53aWR0aCxzPW8rdC5oZWlnaHQ7aWYoblswXS5zZXQocixvKSxuWzFdLnNldChhLG8pLG5bMl0uc2V0KGEscyksblszXS5zZXQocixzKSxlKWZvcih2YXIgbD0wO2w8NDtsKyspbltsXS50cmFuc2Zvcm0oZSk7RGUuc3ViKGlbMF0sblsxXSxuWzBdKSxEZS5zdWIoaVsxXSxuWzNdLG5bMF0pLGlbMF0ubm9ybWFsaXplKCksaVsxXS5ub3JtYWxpemUoKTtmb3IobD0wO2w8MjtsKyspdGhpcy5fb3JpZ2luW2xdPWlbbF0uZG90KG5bMF0pfSx0LnByb3RvdHlwZS5pbnRlcnNlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj0hMCxpPSFlO3JldHVybiB1aC5zZXQoMS8wLDEvMCksaGguc2V0KDAsMCksIXRoaXMuX2ludGVyc2VjdENoZWNrT25lU2lkZSh0aGlzLHQsdWgsaGgsaSwxKSYmKG49ITEsaSl8fCF0aGlzLl9pbnRlcnNlY3RDaGVja09uZVNpZGUodCx0aGlzLHVoLGhoLGksLTEpJiYobj0hMSxpKXx8aXx8RGUuY29weShlLG4/dWg6aGgpLG59LHQucHJvdG90eXBlLl9pbnRlcnNlY3RDaGVja09uZVNpZGU9ZnVuY3Rpb24odCxlLG4saSxyLG8pe2Zvcih2YXIgYT0hMCxzPTA7czwyO3MrKyl7dmFyIGw9dGhpcy5fYXhlc1tzXTtpZih0aGlzLl9nZXRQcm9qTWluTWF4T25BeGlzKHMsdC5fY29ybmVycyxzaCksdGhpcy5fZ2V0UHJvak1pbk1heE9uQXhpcyhzLGUuX2Nvcm5lcnMsbGgpLHNoWzFdPGxoWzBdfHxzaFswXT5saFsxXSl7aWYoYT0hMSxyKXJldHVybiBhO3ZhciB1PU1hdGguYWJzKGxoWzBdLXNoWzFdKSxoPU1hdGguYWJzKHNoWzBdLWxoWzFdKTtNYXRoLm1pbih1LGgpPmkubGVuKCkmJih1PGg/RGUuc2NhbGUoaSxsLC11Km8pOkRlLnNjYWxlKGksbCxoKm8pKX1lbHNlIGlmKG4pe3U9TWF0aC5hYnMobGhbMF0tc2hbMV0pLGg9TWF0aC5hYnMoc2hbMF0tbGhbMV0pO01hdGgubWluKHUsaCk8bi5sZW4oKSYmKHU8aD9EZS5zY2FsZShuLGwsdSpvKTpEZS5zY2FsZShuLGwsLWgqbykpfX1yZXR1cm4gYX0sdC5wcm90b3R5cGUuX2dldFByb2pNaW5NYXhPbkF4aXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10aGlzLl9heGVzW3RdLHI9dGhpcy5fb3JpZ2luLG89ZVswXS5kb3QoaSkrclt0XSxhPW8scz1vLGw9MTtsPGUubGVuZ3RoO2wrKyl7dmFyIHU9ZVtsXS5kb3QoaSkrclt0XTthPU1hdGgubWluKHUsYSkscz1NYXRoLm1heCh1LHMpfW5bMF09YSxuWzFdPXN9LHR9KCkscGg9W10sZGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5ub3RDbGVhcj0hMCxlLmluY3JlbWVudGFsPSEwLGUuX2Rpc3BsYXlhYmxlcz1bXSxlLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXM9W10sZS5fY3Vyc29yPTAsZX1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnRyYXZlcnNlPWZ1bmN0aW9uKHQsZSl7dC5jYWxsKGUsdGhpcyl9LGUucHJvdG90eXBlLnVzZVN0eWxlPWZ1bmN0aW9uKCl7dGhpcy5zdHlsZT17fX0sZS5wcm90b3R5cGUuZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnNvcn0sZS5wcm90b3R5cGUuaW5uZXJBZnRlckJydXNoPWZ1bmN0aW9uKCl7dGhpcy5fY3Vyc29yPXRoaXMuX2Rpc3BsYXlhYmxlcy5sZW5ndGh9LGUucHJvdG90eXBlLmNsZWFyRGlzcGxheWJsZXM9ZnVuY3Rpb24oKXt0aGlzLl9kaXNwbGF5YWJsZXM9W10sdGhpcy5fdGVtcG9yYXJ5RGlzcGxheWFibGVzPVtdLHRoaXMuX2N1cnNvcj0wLHRoaXMubWFya1JlZHJhdygpLHRoaXMubm90Q2xlYXI9ITF9LGUucHJvdG90eXBlLmNsZWFyVGVtcG9yYWxEaXNwbGF5YWJsZXM9ZnVuY3Rpb24oKXt0aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXM9W119LGUucHJvdG90eXBlLmFkZERpc3BsYXlhYmxlPWZ1bmN0aW9uKHQsZSl7ZT90aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXMucHVzaCh0KTp0aGlzLl9kaXNwbGF5YWJsZXMucHVzaCh0KSx0aGlzLm1hcmtSZWRyYXcoKX0sZS5wcm90b3R5cGUuYWRkRGlzcGxheWFibGVzPWZ1bmN0aW9uKHQsZSl7ZT1lfHwhMTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLmFkZERpc3BsYXlhYmxlKHRbbl0sZSl9LGUucHJvdG90eXBlLmdldERpc3BsYXlhYmxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNwbGF5YWJsZXN9LGUucHJvdG90eXBlLmdldFRlbXBvcmFsRGlzcGxheWFibGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlbXBvcmFyeURpc3BsYXlhYmxlc30sZS5wcm90b3R5cGUuZWFjaFBlbmRpbmdEaXNwbGF5YWJsZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY3Vyc29yO2U8dGhpcy5fZGlzcGxheWFibGVzLmxlbmd0aDtlKyspdCYmdCh0aGlzLl9kaXNwbGF5YWJsZXNbZV0pO2ZvcihlPTA7ZTx0aGlzLl90ZW1wb3JhcnlEaXNwbGF5YWJsZXMubGVuZ3RoO2UrKyl0JiZ0KHRoaXMuX3RlbXBvcmFyeURpc3BsYXlhYmxlc1tlXSl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMudXBkYXRlVHJhbnNmb3JtKCk7Zm9yKHZhciB0PXRoaXMuX2N1cnNvcjt0PHRoaXMuX2Rpc3BsYXlhYmxlcy5sZW5ndGg7dCsrKXsoZT10aGlzLl9kaXNwbGF5YWJsZXNbdF0pLnBhcmVudD10aGlzLGUudXBkYXRlKCksZS5wYXJlbnQ9bnVsbH1mb3IodD0wO3Q8dGhpcy5fdGVtcG9yYXJ5RGlzcGxheWFibGVzLmxlbmd0aDt0Kyspe3ZhciBlOyhlPXRoaXMuX3RlbXBvcmFyeURpc3BsYXlhYmxlc1t0XSkucGFyZW50PXRoaXMsZS51cGRhdGUoKSxlLnBhcmVudD1udWxsfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuX3JlY3Qpe2Zvcih2YXIgdD1uZXcgemUoMS8wLDEvMCwtMS8wLC0xLzApLGU9MDtlPHRoaXMuX2Rpc3BsYXlhYmxlcy5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLl9kaXNwbGF5YWJsZXNbZV0saT1uLmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7bi5uZWVkTG9jYWxUcmFuc2Zvcm0oKSYmaS5hcHBseVRyYW5zZm9ybShuLmdldExvY2FsVHJhbnNmb3JtKHBoKSksdC51bmlvbihpKX10aGlzLl9yZWN0PXR9cmV0dXJuIHRoaXMuX3JlY3R9LGUucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0LGUpO2lmKHRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkuY29udGFpbihuWzBdLG5bMV0pKWZvcih2YXIgaT0wO2k8dGhpcy5fZGlzcGxheWFibGVzLmxlbmd0aDtpKyspe2lmKHRoaXMuX2Rpc3BsYXlhYmxlc1tpXS5jb250YWluKHQsZSkpcmV0dXJuITB9cmV0dXJuITF9LGV9KERhKSxmaD1WbygpO2Z1bmN0aW9uIGdoKHQsZSxuLGkscil7dmFyIG87aWYoZSYmZS5lY01vZGVsKXt2YXIgYT1lLmVjTW9kZWwuZ2V0VXBkYXRlUGF5bG9hZCgpO289YSYmYS5hbmltYXRpb259dmFyIHM9InVwZGF0ZSI9PT10O2lmKGUmJmUuaXNBbmltYXRpb25FbmFibGVkKCkpe3ZhciBsPXZvaWQgMCx1PXZvaWQgMCxoPXZvaWQgMDtyZXR1cm4gaT8obD1ydChpLmR1cmF0aW9uLDIwMCksdT1ydChpLmVhc2luZywiY3ViaWNPdXQiKSxoPTApOihsPWUuZ2V0U2hhbGxvdyhzPyJhbmltYXRpb25EdXJhdGlvblVwZGF0ZSI6ImFuaW1hdGlvbkR1cmF0aW9uIiksdT1lLmdldFNoYWxsb3cocz8iYW5pbWF0aW9uRWFzaW5nVXBkYXRlIjoiYW5pbWF0aW9uRWFzaW5nIiksaD1lLmdldFNoYWxsb3cocz8iYW5pbWF0aW9uRGVsYXlVcGRhdGUiOiJhbmltYXRpb25EZWxheSIpKSxvJiYobnVsbCE9by5kdXJhdGlvbiYmKGw9by5kdXJhdGlvbiksbnVsbCE9by5lYXNpbmcmJih1PW8uZWFzaW5nKSxudWxsIT1vLmRlbGF5JiYoaD1vLmRlbGF5KSksWChoKSYmKGg9aChuLHIpKSxYKGwpJiYobD1sKG4pKSx7ZHVyYXRpb246bHx8MCxkZWxheTpoLGVhc2luZzp1fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5aCh0LGUsbixpLHIsbyxhKXt2YXIgcyxsPSExO1gocik/KGE9byxvPXIscj1udWxsKTpxKHIpJiYobz1yLmNiLGE9ci5kdXJpbmcsbD1yLmlzRnJvbSxzPXIucmVtb3ZlT3B0LHI9ci5kYXRhSW5kZXgpO3ZhciB1PSJsZWF2ZSI9PT10O3V8fGUuc3RvcEFuaW1hdGlvbigibGVhdmUiKTt2YXIgaD1naCh0LGkscix1P3N8fHt9Om51bGwsaSYmaS5nZXRBbmltYXRpb25EZWxheVBhcmFtcz9pLmdldEFuaW1hdGlvbkRlbGF5UGFyYW1zKGUscik6bnVsbCk7aWYoaCYmaC5kdXJhdGlvbj4wKXt2YXIgYz17ZHVyYXRpb246aC5kdXJhdGlvbixkZWxheTpoLmRlbGF5fHwwLGVhc2luZzpoLmVhc2luZyxkb25lOm8sZm9yY2U6ISFvfHwhIWEsc2V0VG9GaW5hbDohdSxzY29wZTp0LGR1cmluZzphfTtsP2UuYW5pbWF0ZUZyb20obixjKTplLmFuaW1hdGVUbyhuLGMpfWVsc2UgZS5zdG9wQW5pbWF0aW9uKCksIWwmJmUuYXR0cihuKSxhJiZhKDEpLG8mJm8oKX1mdW5jdGlvbiB2aCh0LGUsbixpLHIsbyl7eWgoInVwZGF0ZSIsdCxlLG4saSxyLG8pfWZ1bmN0aW9uIG1oKHQsZSxuLGkscixvKXt5aCgiZW50ZXIiLHQsZSxuLGkscixvKX1mdW5jdGlvbiB4aCh0KXtpZighdC5fX3pyKXJldHVybiEwO2Zvcih2YXIgZT0wO2U8dC5hbmltYXRvcnMubGVuZ3RoO2UrKyl7aWYoImxlYXZlIj09PXQuYW5pbWF0b3JzW2VdLnNjb3BlKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIF9oKHQsZSxuLGkscixvKXt4aCh0KXx8eWgoImxlYXZlIix0LGUsbixpLHIsbyl9ZnVuY3Rpb24gYmgodCxlLG4saSl7dC5yZW1vdmVUZXh0Q29udGVudCgpLHQucmVtb3ZlVGV4dEd1aWRlTGluZSgpLF9oKHQse3N0eWxlOntvcGFjaXR5OjB9fSxlLG4saSl9ZnVuY3Rpb24gd2godCxlLG4pe2Z1bmN0aW9uIGkoKXt0LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpfXQuaXNHcm91cD90LnRyYXZlcnNlKChmdW5jdGlvbih0KXt0LmlzR3JvdXB8fGJoKHQsZSxuLGkpfSkpOmJoKHQsZSxuLGkpfWZ1bmN0aW9uIFNoKHQpe2ZoKHQpLm9sZFN0eWxlPXQuc3R5bGV9dmFyIE1oPU1hdGgubWF4LEloPU1hdGgubWluLFRoPXt9O2Z1bmN0aW9uIENoKHQpe3JldHVybiBrcy5leHRlbmQodCl9dmFyIERoPWZ1bmN0aW9uKHQsZSl7dmFyIGk9eHUodCxlKTtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi5hcHBseVRyYW5zZm9ybT1pLmFwcGx5VHJhbnNmb3JtLG4uYnVpbGRQYXRoPWkuYnVpbGRQYXRoLG59cmV0dXJuIG4oZSx0KSxlfSh2dSl9O2Z1bmN0aW9uIEFoKHQsZSl7cmV0dXJuIERoKHQsZSl9ZnVuY3Rpb24ga2godCxlKXtUaFt0XT1lfWZ1bmN0aW9uIExoKHQpe2lmKFRoLmhhc093blByb3BlcnR5KHQpKXJldHVybiBUaFt0XX1mdW5jdGlvbiBQaCh0LGUsbixpKXt2YXIgcj1fdSh0LGUpO3JldHVybiBuJiYoImNlbnRlciI9PT1pJiYobj1SaChuLHIuZ2V0Qm91bmRpbmdSZWN0KCkpKSxFaChyLG4pKSxyfWZ1bmN0aW9uIE9oKHQsZSxuKXt2YXIgaT1uZXcgTnMoe3N0eWxlOntpbWFnZTp0LHg6ZS54LHk6ZS55LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSxvbmxvYWQ6ZnVuY3Rpb24odCl7aWYoImNlbnRlciI9PT1uKXt2YXIgcj17d2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9O2kuc2V0U3R5bGUoUmgoZSxyKSl9fX0pO3JldHVybiBpfWZ1bmN0aW9uIFJoKHQsZSl7dmFyIG4saT1lLndpZHRoL2UuaGVpZ2h0LHI9dC5oZWlnaHQqaTtyZXR1cm4gbj1yPD10LndpZHRoP3QuaGVpZ2h0OihyPXQud2lkdGgpL2kse3g6dC54K3Qud2lkdGgvMi1yLzIseTp0LnkrdC5oZWlnaHQvMi1uLzIsd2lkdGg6cixoZWlnaHQ6bn19dmFyIE5oPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLGk9dC5sZW5ndGgscj0wO3I8aTtyKyspe3ZhciBvPXRbcl07bi5wdXNoKG8uZ2V0VXBkYXRlZFBhdGhQcm94eSghMCkpfXZhciBhPW5ldyBrcyhlKTtyZXR1cm4gYS5jcmVhdGVQYXRoUHJveHkoKSxhLmJ1aWxkUGF0aD1mdW5jdGlvbih0KXtpZihtdSh0KSl7dC5hcHBlbmRQYXRoKG4pO3ZhciBlPXQuZ2V0Q29udGV4dCgpO2UmJnQucmVidWlsZFBhdGgoZSwxKX19LGF9O2Z1bmN0aW9uIEVoKHQsZSl7aWYodC5hcHBseVRyYW5zZm9ybSl7dmFyIG49dC5nZXRCb3VuZGluZ1JlY3QoKS5jYWxjdWxhdGVUcmFuc2Zvcm0oZSk7dC5hcHBseVRyYW5zZm9ybShuKX19ZnVuY3Rpb24gemgodCxlKXtyZXR1cm4genModCx0LHtsaW5lV2lkdGg6ZX0pLHR9dmFyIFZoPUJzO2Z1bmN0aW9uIEJoKHQsZSl7Zm9yKHZhciBuPXhlKFtdKTt0JiZ0IT09ZTspYmUobix0LmdldExvY2FsVHJhbnNmb3JtKCksbiksdD10LnBhcmVudDtyZXR1cm4gbn1mdW5jdGlvbiBGaCh0LGUsbil7cmV0dXJuIGUmJiFOKGUpJiYoZT12ci5nZXRMb2NhbFRyYW5zZm9ybShlKSksbiYmKGU9SWUoW10sZSkpLFd0KFtdLHQsZSl9ZnVuY3Rpb24gR2godCxlLG4pe3ZhciBpPTA9PT1lWzRdfHwwPT09ZVs1XXx8MD09PWVbMF0/MTpNYXRoLmFicygyKmVbNF0vZVswXSkscj0wPT09ZVs0XXx8MD09PWVbNV18fDA9PT1lWzJdPzE6TWF0aC5hYnMoMiplWzRdL2VbMl0pLG89WyJsZWZ0Ij09PXQ/LWk6InJpZ2h0Ij09PXQ/aTowLCJ0b3AiPT09dD8tcjoiYm90dG9tIj09PXQ/cjowXTtyZXR1cm4gbz1GaChvLGUsbiksTWF0aC5hYnMob1swXSk+TWF0aC5hYnMob1sxXSk/b1swXT4wPyJyaWdodCI6ImxlZnQiOm9bMV0+MD8iYm90dG9tIjoidG9wIn1mdW5jdGlvbiBXaCh0KXtyZXR1cm4hdC5pc0dyb3VwfWZ1bmN0aW9uIEhoKHQsZSxuKXtpZih0JiZlKXt2YXIgaSxyPShpPXt9LHQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe1doKHQpJiZ0LmFuaWQmJihpW3QuYW5pZF09dCl9KSksaSk7ZS50cmF2ZXJzZSgoZnVuY3Rpb24odCl7aWYoV2godCkmJnQuYW5pZCl7dmFyIGU9clt0LmFuaWRdO2lmKGUpe3ZhciBpPW8odCk7dC5hdHRyKG8oZSkpLHZoKHQsaSxuLHJsKHQpLmRhdGFJbmRleCl9fX0pKX1mdW5jdGlvbiBvKHQpe3ZhciBlPXt4OnQueCx5OnQueSxyb3RhdGlvbjp0LnJvdGF0aW9ufTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQuc2hhcGV9KHQpJiYoZS5zaGFwZT1BKHt9LHQuc2hhcGUpKSxlfX1mdW5jdGlvbiBZaCh0LGUpe3JldHVybiB6KHQsKGZ1bmN0aW9uKHQpe3ZhciBuPXRbMF07bj1NaChuLGUueCksbj1JaChuLGUueCtlLndpZHRoKTt2YXIgaT10WzFdO3JldHVybiBpPU1oKGksZS55KSxbbixpPUloKGksZS55K2UuaGVpZ2h0KV19KSl9ZnVuY3Rpb24gWGgodCxlKXt2YXIgbj1NaCh0LngsZS54KSxpPUloKHQueCt0LndpZHRoLGUueCtlLndpZHRoKSxyPU1oKHQueSxlLnkpLG89SWgodC55K3QuaGVpZ2h0LGUueStlLmhlaWdodCk7aWYoaT49biYmbz49cilyZXR1cm57eDpuLHk6cix3aWR0aDppLW4saGVpZ2h0Om8tcn19ZnVuY3Rpb24gVWgodCxlLG4pe3ZhciBpPUEoe3JlY3RIb3ZlcjohMH0sZSkscj1pLnN0eWxlPXtzdHJva2VOb1NjYWxlOiEwfTtpZihuPW58fHt4Oi0xLHk6LTEsd2lkdGg6MixoZWlnaHQ6Mn0sdClyZXR1cm4gMD09PXQuaW5kZXhPZigiaW1hZ2U6Ly8iKT8oci5pbWFnZT10LnNsaWNlKDgpLGsocixuKSxuZXcgTnMoaSkpOlBoKHQucmVwbGFjZSgicGF0aDovLyIsIiIpLGksbiwiY2VudGVyIil9ZnVuY3Rpb24gWmgodCxlLG4saSxyKXtmb3IodmFyIG89MCxhPXJbci5sZW5ndGgtMV07bzxyLmxlbmd0aDtvKyspe3ZhciBzPXJbb107aWYoamgodCxlLG4saSxzWzBdLHNbMV0sYVswXSxhWzFdKSlyZXR1cm4hMDthPXN9fWZ1bmN0aW9uIGpoKHQsZSxuLGkscixvLGEscyl7dmFyIGwsdT1uLXQsaD1pLWUsYz1hLXIscD1zLW8sZD1xaChjLHAsdSxoKTtpZigobD1kKTw9MWUtNiYmbD49LTFlLTYpcmV0dXJuITE7dmFyIGY9dC1yLGc9ZS1vLHk9cWgoZixnLHUsaCkvZDtpZih5PDB8fHk+MSlyZXR1cm4hMTt2YXIgdj1xaChmLGcsYyxwKS9kO3JldHVybiEodjwwfHx2PjEpfWZ1bmN0aW9uIHFoKHQsZSxuLGkpe3JldHVybiB0KmktbiplfWZ1bmN0aW9uIEtoKHQpe3ZhciBlPXQuaXRlbVRvb2x0aXBPcHRpb24sbj10LmNvbXBvbmVudE1vZGVsLGk9dC5pdGVtTmFtZSxyPVUoZSk/e2Zvcm1hdHRlcjplfTplLG89bi5tYWluVHlwZSxhPW4uY29tcG9uZW50SW5kZXgscz17Y29tcG9uZW50VHlwZTpvLG5hbWU6aSwkdmFyczpbIm5hbWUiXX07c1tvKyJJbmRleCJdPWE7dmFyIGw9dC5mb3JtYXR0ZXJQYXJhbXNFeHRyYTtsJiZFKEcobCksKGZ1bmN0aW9uKHQpe190KHMsdCl8fChzW3RdPWxbdF0scy4kdmFycy5wdXNoKHQpKX0pKTt2YXIgdT1ybCh0LmVsKTt1LmNvbXBvbmVudE1haW5UeXBlPW8sdS5jb21wb25lbnRJbmRleD1hLHUudG9vbHRpcENvbmZpZz17bmFtZTppLG9wdGlvbjprKHtjb250ZW50OmksZW5jb2RlSFRNTENvbnRlbnQ6ITAsZm9ybWF0dGVyUGFyYW1zOnN9LHIpfX1mdW5jdGlvbiAkaCh0LGUpe3ZhciBuO3QuaXNHcm91cCYmKG49ZSh0KSksbnx8dC50cmF2ZXJzZShlKX1mdW5jdGlvbiBKaCh0LGUpe2lmKHQpaWYoWSh0KSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKykkaCh0W25dLGUpO2Vsc2UgJGgodCxlKX1raCgiY2lyY2xlIixTdSksa2goImVsbGlwc2UiLEl1KSxraCgic2VjdG9yIixGdSksa2goInJpbmciLFd1KSxraCgicG9seWdvbiIsWHUpLGtoKCJwb2x5bGluZSIsWnUpLGtoKCJyZWN0IixXcyksa2goImxpbmUiLEt1KSxraCgiYmV6aWVyQ3VydmUiLHRoKSxraCgiYXJjIixuaCk7dmFyIFFoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwZGF0ZVByb3BzOnZoLGluaXRQcm9wczptaCxyZW1vdmVFbGVtZW50Ol9oLHJlbW92ZUVsZW1lbnRXaXRoRmFkZU91dDp3aCxpc0VsZW1lbnRSZW1vdmVkOnhoLGV4dGVuZFNoYXBlOkNoLGV4dGVuZFBhdGg6QWgscmVnaXN0ZXJTaGFwZTpraCxnZXRTaGFwZUNsYXNzOkxoLG1ha2VQYXRoOlBoLG1ha2VJbWFnZTpPaCxtZXJnZVBhdGg6TmgscmVzaXplUGF0aDpFaCxzdWJQaXhlbE9wdGltaXplTGluZTp6aCxzdWJQaXhlbE9wdGltaXplUmVjdDpmdW5jdGlvbih0KXtyZXR1cm4gVnModC5zaGFwZSx0LnNoYXBlLHQuc3R5bGUpLHR9LHN1YlBpeGVsT3B0aW1pemU6VmgsZ2V0VHJhbnNmb3JtOkJoLGFwcGx5VHJhbnNmb3JtOkZoLHRyYW5zZm9ybURpcmVjdGlvbjpHaCxncm91cFRyYW5zaXRpb246SGgsY2xpcFBvaW50c0J5UmVjdDpZaCxjbGlwUmVjdEJ5UmVjdDpYaCxjcmVhdGVJY29uOlVoLGxpbmVQb2x5Z29uSW50ZXJzZWN0OlpoLGxpbmVMaW5lSW50ZXJzZWN0OmpoLHNldFRvb2x0aXBDb25maWc6S2gsdHJhdmVyc2VFbGVtZW50czpKaCxHcm91cDpCcixJbWFnZTpOcyxUZXh0OlhzLENpcmNsZTpTdSxFbGxpcHNlOkl1LFNlY3RvcjpGdSxSaW5nOld1LFBvbHlnb246WHUsUG9seWxpbmU6WnUsUmVjdDpXcyxMaW5lOkt1LEJlemllckN1cnZlOnRoLEFyYzpuaCxJbmNyZW1lbnRhbERpc3BsYXlhYmxlOmRoLENvbXBvdW5kUGF0aDppaCxMaW5lYXJHcmFkaWVudDpvaCxSYWRpYWxHcmFkaWVudDphaCxCb3VuZGluZ1JlY3Q6emUsT3JpZW50ZWRCb3VuZGluZ1JlY3Q6Y2gsUG9pbnQ6RGUsUGF0aDprc30pLHRjPXt9O2Z1bmN0aW9uIGVjKHQsZSl7Zm9yKHZhciBuPTA7bjxobC5sZW5ndGg7bisrKXt2YXIgaT1obFtuXSxyPWVbaV0sbz10LmVuc3VyZVN0YXRlKGkpO28uc3R5bGU9by5zdHlsZXx8e30sby5zdHlsZS50ZXh0PXJ9dmFyIGE9dC5jdXJyZW50U3RhdGVzLnNsaWNlKCk7dC5jbGVhclN0YXRlcyghMCksdC5zZXRTdHlsZSh7dGV4dDplLm5vcm1hbH0pLHQudXNlU3RhdGVzKGEsITApfWZ1bmN0aW9uIG5jKHQsZSxuKXt2YXIgaSxyPXQubGFiZWxGZXRjaGVyLG89dC5sYWJlbERhdGFJbmRleCxhPXQubGFiZWxEaW1JbmRleCxzPWUubm9ybWFsO3ImJihpPXIuZ2V0Rm9ybWF0dGVkTGFiZWwobywibm9ybWFsIixudWxsLGEscyYmcy5nZXQoImZvcm1hdHRlciIpLG51bGwhPW4/e2ludGVycG9sYXRlZFZhbHVlOm59Om51bGwpKSxudWxsPT1pJiYoaT1YKHQuZGVmYXVsdFRleHQpP3QuZGVmYXVsdFRleHQobyx0LG4pOnQuZGVmYXVsdFRleHQpO2Zvcih2YXIgbD17bm9ybWFsOml9LHU9MDt1PGhsLmxlbmd0aDt1Kyspe3ZhciBoPWhsW3VdLGM9ZVtoXTtsW2hdPXJ0KHI/ci5nZXRGb3JtYXR0ZWRMYWJlbChvLGgsbnVsbCxhLGMmJmMuZ2V0KCJmb3JtYXR0ZXIiKSk6bnVsbCxpKX1yZXR1cm4gbH1mdW5jdGlvbiBpYyh0LGUsbixpKXtuPW58fHRjO2Zvcih2YXIgcj10IGluc3RhbmNlb2YgWHMsbz0hMSxhPTA7YTxjbC5sZW5ndGg7YSsrKXtpZigocD1lW2NsW2FdXSkmJnAuZ2V0U2hhbGxvdygic2hvdyIpKXtvPSEwO2JyZWFrfX12YXIgcz1yP3Q6dC5nZXRUZXh0Q29udGVudCgpO2lmKG8pe3J8fChzfHwocz1uZXcgWHMsdC5zZXRUZXh0Q29udGVudChzKSksdC5zdGF0ZVByb3h5JiYocy5zdGF0ZVByb3h5PXQuc3RhdGVQcm94eSkpO3ZhciBsPW5jKG4sZSksdT1lLm5vcm1hbCxoPSEhdS5nZXRTaGFsbG93KCJzaG93IiksYz1vYyh1LGkmJmkubm9ybWFsLG4sITEsIXIpO2MudGV4dD1sLm5vcm1hbCxyfHx0LnNldFRleHRDb25maWcoYWModSxuLCExKSk7Zm9yKGE9MDthPGhsLmxlbmd0aDthKyspe3ZhciBwLGQ9aGxbYV07aWYocD1lW2RdKXt2YXIgZj1zLmVuc3VyZVN0YXRlKGQpLGc9ISFydChwLmdldFNoYWxsb3coInNob3ciKSxoKTtpZihnIT09aCYmKGYuaWdub3JlPSFnKSxmLnN0eWxlPW9jKHAsaSYmaVtkXSxuLCEwLCFyKSxmLnN0eWxlLnRleHQ9bFtkXSwhcil0LmVuc3VyZVN0YXRlKGQpLnRleHRDb25maWc9YWMocCxuLCEwKX19cy5zaWxlbnQ9ISF1LmdldFNoYWxsb3coInNpbGVudCIpLG51bGwhPXMuc3R5bGUueCYmKGMueD1zLnN0eWxlLngpLG51bGwhPXMuc3R5bGUueSYmKGMueT1zLnN0eWxlLnkpLHMuaWdub3JlPSFoLHMudXNlU3R5bGUoYykscy5kaXJ0eSgpLG4uZW5hYmxlVGV4dFNldHRlciYmKHBjKHMpLnNldExhYmVsVGV4dD1mdW5jdGlvbih0KXt2YXIgaT1uYyhuLGUsdCk7ZWMocyxpKX0pfWVsc2UgcyYmKHMuaWdub3JlPSEwKTt0LmRpcnR5KCl9ZnVuY3Rpb24gcmModCxlKXtlPWV8fCJsYWJlbCI7Zm9yKHZhciBuPXtub3JtYWw6dC5nZXRNb2RlbChlKX0saT0wO2k8aGwubGVuZ3RoO2krKyl7dmFyIHI9aGxbaV07bltyXT10LmdldE1vZGVsKFtyLGVdKX1yZXR1cm4gbn1mdW5jdGlvbiBvYyh0LGUsbixpLHIpe3ZhciBvPXt9O3JldHVybiBmdW5jdGlvbih0LGUsbixpLHIpe249bnx8dGM7dmFyIG8sYT1lLmVjTW9kZWwscz1hJiZhLm9wdGlvbi50ZXh0U3R5bGUsbD1mdW5jdGlvbih0KXt2YXIgZTtmb3IoO3QmJnQhPT10LmVjTW9kZWw7KXt2YXIgbj0odC5vcHRpb258fHRjKS5yaWNoO2lmKG4pe2U9ZXx8e307Zm9yKHZhciBpPUcobikscj0wO3I8aS5sZW5ndGg7cisrKXtlW2lbcl1dPTF9fXQ9dC5wYXJlbnRNb2RlbH1yZXR1cm4gZX0oZSk7aWYobClmb3IodmFyIHUgaW4gbz17fSxsKWlmKGwuaGFzT3duUHJvcGVydHkodSkpe3ZhciBoPWUuZ2V0TW9kZWwoWyJyaWNoIix1XSk7aGMob1t1XT17fSxoLHMsbixpLHIsITEsITApfW8mJih0LnJpY2g9byk7dmFyIGM9ZS5nZXQoIm92ZXJmbG93Iik7YyYmKHQub3ZlcmZsb3c9Yyk7dmFyIHA9ZS5nZXQoIm1pbk1hcmdpbiIpO251bGwhPXAmJih0Lm1hcmdpbj1wKTtoYyh0LGUscyxuLGksciwhMCwhMSl9KG8sdCxuLGksciksZSYmQShvLGUpLG99ZnVuY3Rpb24gYWModCxlLG4pe2U9ZXx8e307dmFyIGkscj17fSxvPXQuZ2V0U2hhbGxvdygicm90YXRlIiksYT1ydCh0LmdldFNoYWxsb3coImRpc3RhbmNlIiksbj9udWxsOjUpLHM9dC5nZXRTaGFsbG93KCJvZmZzZXQiKTtyZXR1cm4ib3V0c2lkZSI9PT0oaT10LmdldFNoYWxsb3coInBvc2l0aW9uIil8fChuP251bGw6Imluc2lkZSIpKSYmKGk9ZS5kZWZhdWx0T3V0c2lkZVBvc2l0aW9ufHwidG9wIiksbnVsbCE9aSYmKHIucG9zaXRpb249aSksbnVsbCE9cyYmKHIub2Zmc2V0PXMpLG51bGwhPW8mJihvKj1NYXRoLlBJLzE4MCxyLnJvdGF0aW9uPW8pLG51bGwhPWEmJihyLmRpc3RhbmNlPWEpLHIub3V0c2lkZUZpbGw9ImluaGVyaXQiPT09dC5nZXQoImNvbG9yIik/ZS5pbmhlcml0Q29sb3J8fG51bGw6ImF1dG8iLHJ9dmFyIHNjPVsiZm9udFN0eWxlIiwiZm9udFdlaWdodCIsImZvbnRTaXplIiwiZm9udEZhbWlseSIsInRleHRTaGFkb3dDb2xvciIsInRleHRTaGFkb3dCbHVyIiwidGV4dFNoYWRvd09mZnNldFgiLCJ0ZXh0U2hhZG93T2Zmc2V0WSJdLGxjPVsiYWxpZ24iLCJsaW5lSGVpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJ0YWciLCJ2ZXJ0aWNhbEFsaWduIiwiZWxsaXBzaXMiXSx1Yz1bInBhZGRpbmciLCJib3JkZXJXaWR0aCIsImJvcmRlclJhZGl1cyIsImJvcmRlckRhc2hPZmZzZXQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJDb2xvciIsInNoYWRvd0NvbG9yIiwic2hhZG93Qmx1ciIsInNoYWRvd09mZnNldFgiLCJzaGFkb3dPZmZzZXRZIl07ZnVuY3Rpb24gaGModCxlLG4saSxyLG8sYSxzKXtuPSFyJiZufHx0Yzt2YXIgbD1pJiZpLmluaGVyaXRDb2xvcix1PWUuZ2V0U2hhbGxvdygiY29sb3IiKSxoPWUuZ2V0U2hhbGxvdygidGV4dEJvcmRlckNvbG9yIiksYz1ydChlLmdldFNoYWxsb3coIm9wYWNpdHkiKSxuLm9wYWNpdHkpOyJpbmhlcml0IiE9PXUmJiJhdXRvIiE9PXV8fCh1PWx8fG51bGwpLCJpbmhlcml0IiE9PWgmJiJhdXRvIiE9PWh8fChoPWx8fG51bGwpLG98fCh1PXV8fG4uY29sb3IsaD1ofHxuLnRleHRCb3JkZXJDb2xvciksbnVsbCE9dSYmKHQuZmlsbD11KSxudWxsIT1oJiYodC5zdHJva2U9aCk7dmFyIHA9cnQoZS5nZXRTaGFsbG93KCJ0ZXh0Qm9yZGVyV2lkdGgiKSxuLnRleHRCb3JkZXJXaWR0aCk7bnVsbCE9cCYmKHQubGluZVdpZHRoPXApO3ZhciBkPXJ0KGUuZ2V0U2hhbGxvdygidGV4dEJvcmRlclR5cGUiKSxuLnRleHRCb3JkZXJUeXBlKTtudWxsIT1kJiYodC5saW5lRGFzaD1kKTt2YXIgZj1ydChlLmdldFNoYWxsb3coInRleHRCb3JkZXJEYXNoT2Zmc2V0Iiksbi50ZXh0Qm9yZGVyRGFzaE9mZnNldCk7bnVsbCE9ZiYmKHQubGluZURhc2hPZmZzZXQ9Zikscnx8bnVsbCE9Y3x8c3x8KGM9aSYmaS5kZWZhdWx0T3BhY2l0eSksbnVsbCE9YyYmKHQub3BhY2l0eT1jKSxyfHxvfHxudWxsPT10LmZpbGwmJmkuaW5oZXJpdENvbG9yJiYodC5maWxsPWkuaW5oZXJpdENvbG9yKTtmb3IodmFyIGc9MDtnPHNjLmxlbmd0aDtnKyspe3ZhciB5PXNjW2ddO251bGwhPShtPXJ0KGUuZ2V0U2hhbGxvdyh5KSxuW3ldKSkmJih0W3ldPW0pfWZvcihnPTA7ZzxsYy5sZW5ndGg7ZysrKXt5PWxjW2ddO251bGwhPShtPWUuZ2V0U2hhbGxvdyh5KSkmJih0W3ldPW0pfWlmKG51bGw9PXQudmVydGljYWxBbGlnbil7dmFyIHY9ZS5nZXRTaGFsbG93KCJiYXNlbGluZSIpO251bGwhPXYmJih0LnZlcnRpY2FsQWxpZ249dil9aWYoIWF8fCFpLmRpc2FibGVCb3gpe2ZvcihnPTA7Zzx1Yy5sZW5ndGg7ZysrKXt2YXIgbTt5PXVjW2ddO251bGwhPShtPWUuZ2V0U2hhbGxvdyh5KSkmJih0W3ldPW0pfXZhciB4PWUuZ2V0U2hhbGxvdygiYm9yZGVyVHlwZSIpO251bGwhPXgmJih0LmJvcmRlckRhc2g9eCksImF1dG8iIT09dC5iYWNrZ3JvdW5kQ29sb3ImJiJpbmhlcml0IiE9PXQuYmFja2dyb3VuZENvbG9yfHwhbHx8KHQuYmFja2dyb3VuZENvbG9yPWwpLCJhdXRvIiE9PXQuYm9yZGVyQ29sb3ImJiJpbmhlcml0IiE9PXQuYm9yZGVyQ29sb3J8fCFsfHwodC5ib3JkZXJDb2xvcj1sKX19ZnVuY3Rpb24gY2ModCxlKXt2YXIgbj1lJiZlLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKTtyZXR1cm4gdXQoW3QuZm9udFN0eWxlfHxuJiZuLmdldFNoYWxsb3coImZvbnRTdHlsZSIpfHwiIix0LmZvbnRXZWlnaHR8fG4mJm4uZ2V0U2hhbGxvdygiZm9udFdlaWdodCIpfHwiIiwodC5mb250U2l6ZXx8biYmbi5nZXRTaGFsbG93KCJmb250U2l6ZSIpfHwxMikrInB4Iix0LmZvbnRGYW1pbHl8fG4mJm4uZ2V0U2hhbGxvdygiZm9udEZhbWlseSIpfHwic2Fucy1zZXJpZiJdLmpvaW4oIiAiKSl9dmFyIHBjPVZvKCk7ZnVuY3Rpb24gZGModCxlLG4saSl7aWYodCl7dmFyIHI9cGModCk7ci5wcmV2VmFsdWU9ci52YWx1ZSxyLnZhbHVlPW47dmFyIG89ZS5ub3JtYWw7ci52YWx1ZUFuaW1hdGlvbj1vLmdldCgidmFsdWVBbmltYXRpb24iKSxyLnZhbHVlQW5pbWF0aW9uJiYoci5wcmVjaXNpb249by5nZXQoInByZWNpc2lvbiIpLHIuZGVmYXVsdEludGVycG9sYXRlZFRleHQ9aSxyLnN0YXRlc01vZGVscz1lKX19ZnVuY3Rpb24gZmModCxlLG4saSxyKXt2YXIgbz1wYyh0KTtpZihvLnZhbHVlQW5pbWF0aW9uJiZvLnByZXZWYWx1ZSE9PW8udmFsdWUpe3ZhciBhPW8uZGVmYXVsdEludGVycG9sYXRlZFRleHQscz1ydChvLmludGVycG9sYXRlZFZhbHVlLG8ucHJldlZhbHVlKSxsPW8udmFsdWU7dC5wZXJjZW50PTAsKG51bGw9PW8ucHJldlZhbHVlP21oOnZoKSh0LHtwZXJjZW50OjF9LGksZSxudWxsLChmdW5jdGlvbihpKXt2YXIgdT1abyhuLG8ucHJlY2lzaW9uLHMsbCxpKTtvLmludGVycG9sYXRlZFZhbHVlPTE9PT1pP251bGw6dTt2YXIgaD1uYyh7bGFiZWxEYXRhSW5kZXg6ZSxsYWJlbEZldGNoZXI6cixkZWZhdWx0VGV4dDphP2EodSk6dSsiIn0sby5zdGF0ZXNNb2RlbHMsdSk7ZWModCxoKX0pKX19dmFyIGdjLHljLHZjPVsidGV4dFN0eWxlIiwiY29sb3IiXSxtYz1bImZvbnRTdHlsZSIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJwYWRkaW5nIiwibGluZUhlaWdodCIsInJpY2giLCJ3aWR0aCIsImhlaWdodCIsIm92ZXJmbG93Il0seGM9bmV3IFhzLF9jPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuZ2V0VGV4dENvbG9yPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWNNb2RlbDtyZXR1cm4gdGhpcy5nZXRTaGFsbG93KCJjb2xvciIpfHwoIXQmJmU/ZS5nZXQodmMpOm51bGwpfSx0LnByb3RvdHlwZS5nZXRGb250PWZ1bmN0aW9uKCl7cmV0dXJuIGNjKHtmb250U3R5bGU6dGhpcy5nZXRTaGFsbG93KCJmb250U3R5bGUiKSxmb250V2VpZ2h0OnRoaXMuZ2V0U2hhbGxvdygiZm9udFdlaWdodCIpLGZvbnRTaXplOnRoaXMuZ2V0U2hhbGxvdygiZm9udFNpemUiKSxmb250RmFtaWx5OnRoaXMuZ2V0U2hhbGxvdygiZm9udEZhbWlseSIpfSx0aGlzLmVjTW9kZWwpfSx0LnByb3RvdHlwZS5nZXRUZXh0UmVjdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9e3RleHQ6dCx2ZXJ0aWNhbEFsaWduOnRoaXMuZ2V0U2hhbGxvdygidmVydGljYWxBbGlnbiIpfHx0aGlzLmdldFNoYWxsb3coImJhc2VsaW5lIil9LG49MDtuPG1jLmxlbmd0aDtuKyspZVttY1tuXV09dGhpcy5nZXRTaGFsbG93KG1jW25dKTtyZXR1cm4geGMudXNlU3R5bGUoZSkseGMudXBkYXRlKCkseGMuZ2V0Qm91bmRpbmdSZWN0KCl9LHR9KCksYmM9W1sibGluZVdpZHRoIiwid2lkdGgiXSxbInN0cm9rZSIsImNvbG9yIl0sWyJvcGFjaXR5Il0sWyJzaGFkb3dCbHVyIl0sWyJzaGFkb3dPZmZzZXRYIl0sWyJzaGFkb3dPZmZzZXRZIl0sWyJzaGFkb3dDb2xvciJdLFsibGluZURhc2giLCJ0eXBlIl0sWyJsaW5lRGFzaE9mZnNldCIsImRhc2hPZmZzZXQiXSxbImxpbmVDYXAiLCJjYXAiXSxbImxpbmVKb2luIiwiam9pbiJdLFsibWl0ZXJMaW1pdCJdXSx3Yz1pYShiYyksU2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5nZXRMaW5lU3R5bGU9ZnVuY3Rpb24odCl7cmV0dXJuIHdjKHRoaXMsdCl9LHR9KCksTWM9W1siZmlsbCIsImNvbG9yIl0sWyJzdHJva2UiLCJib3JkZXJDb2xvciJdLFsibGluZVdpZHRoIiwiYm9yZGVyV2lkdGgiXSxbIm9wYWNpdHkiXSxbInNoYWRvd0JsdXIiXSxbInNoYWRvd09mZnNldFgiXSxbInNoYWRvd09mZnNldFkiXSxbInNoYWRvd0NvbG9yIl0sWyJsaW5lRGFzaCIsImJvcmRlclR5cGUiXSxbImxpbmVEYXNoT2Zmc2V0IiwiYm9yZGVyRGFzaE9mZnNldCJdLFsibGluZUNhcCIsImJvcmRlckNhcCJdLFsibGluZUpvaW4iLCJib3JkZXJKb2luIl0sWyJtaXRlckxpbWl0IiwiYm9yZGVyTWl0ZXJMaW1pdCJdXSxJYz1pYShNYyksVGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5nZXRJdGVtU3R5bGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gSWModGhpcyx0LGUpfSx0fSgpLENjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5wYXJlbnRNb2RlbD1lLHRoaXMuZWNNb2RlbD1uLHRoaXMub3B0aW9uPXR9cmV0dXJuIHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1bXSxyPTM7cjxhcmd1bWVudHMubGVuZ3RoO3IrKylpW3ItM109YXJndW1lbnRzW3JdfSx0LnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbih0LGUpe0ModGhpcy5vcHRpb24sdCwhMCl9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3RoaXMub3B0aW9uOnRoaXMuX2RvR2V0KHRoaXMucGFyc2VQYXRoKHQpLCFlJiZ0aGlzLnBhcmVudE1vZGVsKX0sdC5wcm90b3R5cGUuZ2V0U2hhbGxvdz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9uLGk9bnVsbD09bj9uOm5bdF07aWYobnVsbD09aSYmIWUpe3ZhciByPXRoaXMucGFyZW50TW9kZWw7ciYmKGk9ci5nZXRTaGFsbG93KHQpKX1yZXR1cm4gaX0sdC5wcm90b3R5cGUuZ2V0TW9kZWw9ZnVuY3Rpb24oZSxuKXt2YXIgaT1udWxsIT1lLHI9aT90aGlzLnBhcnNlUGF0aChlKTpudWxsO3JldHVybiBuZXcgdChpP3RoaXMuX2RvR2V0KHIpOnRoaXMub3B0aW9uLG49bnx8dGhpcy5wYXJlbnRNb2RlbCYmdGhpcy5wYXJlbnRNb2RlbC5nZXRNb2RlbCh0aGlzLnJlc29sdmVQYXJlbnRQYXRoKHIpKSx0aGlzLmVjTW9kZWwpfSx0LnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMub3B0aW9ufSx0LnByb3RvdHlwZS5yZXN0b3JlRGF0YT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3KDAsdGhpcy5jb25zdHJ1Y3RvcikoVCh0aGlzLm9wdGlvbikpfSx0LnByb3RvdHlwZS5wYXJzZVBhdGg9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3Quc3BsaXQoIi4iKTp0fSx0LnByb3RvdHlwZS5yZXNvbHZlUGFyZW50UGF0aD1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5wcm90b3R5cGUuaXNBbmltYXRpb25FbmFibGVkPWZ1bmN0aW9uKCl7aWYoIXIubm9kZSYmdGhpcy5vcHRpb24pe2lmKG51bGwhPXRoaXMub3B0aW9uLmFuaW1hdGlvbilyZXR1cm4hIXRoaXMub3B0aW9uLmFuaW1hdGlvbjtpZih0aGlzLnBhcmVudE1vZGVsKXJldHVybiB0aGlzLnBhcmVudE1vZGVsLmlzQW5pbWF0aW9uRW5hYmxlZCgpfX0sdC5wcm90b3R5cGUuX2RvR2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5vcHRpb247aWYoIXQpcmV0dXJuIG47Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aCYmKCF0W2ldfHxudWxsIT0obj1uJiYib2JqZWN0Ij09dHlwZW9mIG4/blt0W2ldXTpudWxsKSk7aSsrKTtyZXR1cm4gbnVsbD09biYmZSYmKG49ZS5fZG9HZXQodGhpcy5yZXNvbHZlUGFyZW50UGF0aCh0KSxlLnBhcmVudE1vZGVsKSksbn0sdH0oKTskbyhDYyksZ2M9Q2MseWM9WyJfX1wwaXNfY2x6IixRbysrXS5qb2luKCJfIiksZ2MucHJvdG90eXBlW3ljXT0hMCxnYy5pc0luc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiEoIXR8fCF0W3ljXSl9LFIoQ2MsU2MpLFIoQ2MsVGMpLFIoQ2Msb2EpLFIoQ2MsX2MpO3ZhciBEYz1NYXRoLnJvdW5kKDEwKk1hdGgucmFuZG9tKCkpO2Z1bmN0aW9uIEFjKHQpe3JldHVyblt0fHwiIixEYysrXS5qb2luKCJfIil9ZnVuY3Rpb24ga2ModCxlKXtyZXR1cm4gQyhDKHt9LHQsITApLGUsITApfXZhciBMYz0iWkgiLFBjPSJFTiIsT2M9UGMsUmM9e30sTmM9e30sRWM9ci5kb21TdXBwb3J0ZWQmJihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZ3x8bmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuYnJvd3Nlckxhbmd1YWdlfHxPYykudG9VcHBlckNhc2UoKS5pbmRleE9mKExjKT4tMT9MYzpPYztmdW5jdGlvbiB6Yyh0LGUpe3Q9dC50b1VwcGVyQ2FzZSgpLE5jW3RdPW5ldyBDYyhlKSxSY1t0XT1lfWZ1bmN0aW9uIFZjKHQpe3JldHVybiBOY1t0XX16YyhQYyx7dGltZTp7bW9udGg6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLG1vbnRoQWJicjpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLGRheU9mV2VlazpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5T2ZXZWVrQWJicjpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdfSxsZWdlbmQ6e3NlbGVjdG9yOnthbGw6IkFsbCIsaW52ZXJzZToiSW52In19LHRvb2xib3g6e2JydXNoOnt0aXRsZTp7cmVjdDoiQm94IFNlbGVjdCIscG9seWdvbjoiTGFzc28gU2VsZWN0IixsaW5lWDoiSG9yaXpvbnRhbGx5IFNlbGVjdCIsbGluZVk6IlZlcnRpY2FsbHkgU2VsZWN0IixrZWVwOiJLZWVwIFNlbGVjdGlvbnMiLGNsZWFyOiJDbGVhciBTZWxlY3Rpb25zIn19LGRhdGFWaWV3Ont0aXRsZToiRGF0YSBWaWV3IixsYW5nOlsiRGF0YSBWaWV3IiwiQ2xvc2UiLCJSZWZyZXNoIl19LGRhdGFab29tOnt0aXRsZTp7em9vbToiWm9vbSIsYmFjazoiWm9vbSBSZXNldCJ9fSxtYWdpY1R5cGU6e3RpdGxlOntsaW5lOiJTd2l0Y2ggdG8gTGluZSBDaGFydCIsYmFyOiJTd2l0Y2ggdG8gQmFyIENoYXJ0IixzdGFjazoiU3RhY2siLHRpbGVkOiJUaWxlIn19LHJlc3RvcmU6e3RpdGxlOiJSZXN0b3JlIn0sc2F2ZUFzSW1hZ2U6e3RpdGxlOiJTYXZlIGFzIEltYWdlIixsYW5nOlsiUmlnaHQgQ2xpY2sgdG8gU2F2ZSBJbWFnZSJdfX0sc2VyaWVzOnt0eXBlTmFtZXM6e3BpZToiUGllIGNoYXJ0IixiYXI6IkJhciBjaGFydCIsbGluZToiTGluZSBjaGFydCIsc2NhdHRlcjoiU2NhdHRlciBwbG90IixlZmZlY3RTY2F0dGVyOiJSaXBwbGUgc2NhdHRlciBwbG90IixyYWRhcjoiUmFkYXIgY2hhcnQiLHRyZWU6IlRyZWUiLHRyZWVtYXA6IlRyZWVtYXAiLGJveHBsb3Q6IkJveHBsb3QiLGNhbmRsZXN0aWNrOiJDYW5kbGVzdGljayIsazoiSyBsaW5lIGNoYXJ0IixoZWF0bWFwOiJIZWF0IG1hcCIsbWFwOiJNYXAiLHBhcmFsbGVsOiJQYXJhbGxlbCBjb29yZGluYXRlIG1hcCIsbGluZXM6IkxpbmUgZ3JhcGgiLGdyYXBoOiJSZWxhdGlvbnNoaXAgZ3JhcGgiLHNhbmtleToiU2Fua2V5IGRpYWdyYW0iLGZ1bm5lbDoiRnVubmVsIGNoYXJ0IixnYXVnZToiR2F1Z2UiLHBpY3RvcmlhbEJhcjoiUGljdG9yaWFsIGJhciIsdGhlbWVSaXZlcjoiVGhlbWUgUml2ZXIgTWFwIixzdW5idXJzdDoiU3VuYnVyc3QiLGN1c3RvbToiQ3VzdG9tIGNoYXJ0IixjaGFydDoiQ2hhcnQifX0sYXJpYTp7Z2VuZXJhbDp7d2l0aFRpdGxlOidUaGlzIGlzIGEgY2hhcnQgYWJvdXQgInt0aXRsZX0iJyx3aXRob3V0VGl0bGU6IlRoaXMgaXMgYSBjaGFydCJ9LHNlcmllczp7c2luZ2xlOntwcmVmaXg6IiIsd2l0aE5hbWU6IiB3aXRoIHR5cGUge3Nlcmllc1R5cGV9IG5hbWVkIHtzZXJpZXNOYW1lfS4iLHdpdGhvdXROYW1lOiIgd2l0aCB0eXBlIHtzZXJpZXNUeXBlfS4ifSxtdWx0aXBsZTp7cHJlZml4OiIuIEl0IGNvbnNpc3RzIG9mIHtzZXJpZXNDb3VudH0gc2VyaWVzIGNvdW50LiIsd2l0aE5hbWU6IiBUaGUge3Nlcmllc0lkfSBzZXJpZXMgaXMgYSB7c2VyaWVzVHlwZX0gcmVwcmVzZW50aW5nIHtzZXJpZXNOYW1lfS4iLHdpdGhvdXROYW1lOiIgVGhlIHtzZXJpZXNJZH0gc2VyaWVzIGlzIGEge3Nlcmllc1R5cGV9LiIsc2VwYXJhdG9yOnttaWRkbGU6IiIsZW5kOiIifX19LGRhdGE6e2FsbERhdGE6IlRoZSBkYXRhIGlzIGFzIGZvbGxvd3M6ICIscGFydGlhbERhdGE6IlRoZSBmaXJzdCB7ZGlzcGxheUNudH0gaXRlbXMgYXJlOiAiLHdpdGhOYW1lOiJ0aGUgZGF0YSBmb3Ige25hbWV9IGlzIHt2YWx1ZX0iLHdpdGhvdXROYW1lOiJ7dmFsdWV9IixzZXBhcmF0b3I6e21pZGRsZToiLCAiLGVuZDoiLiAifX19fSksemMoTGMse3RpbWU6e21vbnRoOlsi5LiA5pyIIiwi5LqM5pyIIiwi5LiJ5pyIIiwi5Zub5pyIIiwi5LqU5pyIIiwi5YWt5pyIIiwi5LiD5pyIIiwi5YWr5pyIIiwi5Lmd5pyIIiwi5Y2B5pyIIiwi5Y2B5LiA5pyIIiwi5Y2B5LqM5pyIIl0sbW9udGhBYmJyOlsiMeaciCIsIjLmnIgiLCIz5pyIIiwiNOaciCIsIjXmnIgiLCI25pyIIiwiN+aciCIsIjjmnIgiLCI55pyIIiwiMTDmnIgiLCIxMeaciCIsIjEy5pyIIl0sZGF5T2ZXZWVrOlsi5pif5pyf5pelIiwi5pif5pyf5LiAIiwi5pif5pyf5LqMIiwi5pif5pyf5LiJIiwi5pif5pyf5ZubIiwi5pif5pyf5LqUIiwi5pif5pyf5YWtIl0sZGF5T2ZXZWVrQWJicjpbIuaXpSIsIuS4gCIsIuS6jCIsIuS4iSIsIuWbmyIsIuS6lCIsIuWFrSJdfSxsZWdlbmQ6e3NlbGVjdG9yOnthbGw6IuWFqOmAiSIsaW52ZXJzZToi5Y+N6YCJIn19LHRvb2xib3g6e2JydXNoOnt0aXRsZTp7cmVjdDoi55+p5b2i6YCJ5oupIixwb2x5Z29uOiLlnIjpgIkiLGxpbmVYOiLmqKrlkJHpgInmi6kiLGxpbmVZOiLnurXlkJHpgInmi6kiLGtlZXA6IuS/neaMgemAieaLqSIsY2xlYXI6Iua4hemZpOmAieaLqSJ9fSxkYXRhVmlldzp7dGl0bGU6IuaVsOaNruinhuWbviIsbGFuZzpbIuaVsOaNruinhuWbviIsIuWFs+mXrSIsIuWIt+aWsCJdfSxkYXRhWm9vbTp7dGl0bGU6e3pvb206IuWMuuWfn+e8qeaUviIsYmFjazoi5Yy65Z+f57yp5pS+6L+Y5Y6fIn19LG1hZ2ljVHlwZTp7dGl0bGU6e2xpbmU6IuWIh+aNouS4uuaKmOe6v+WbviIsYmFyOiLliIfmjaLkuLrmn7Hnirblm74iLHN0YWNrOiLliIfmjaLkuLrloIblj6AiLHRpbGVkOiLliIfmjaLkuLrlubPpk7oifX0scmVzdG9yZTp7dGl0bGU6Iui/mOWOnyJ9LHNhdmVBc0ltYWdlOnt0aXRsZToi5L+d5a2Y5Li65Zu+54mHIixsYW5nOlsi5Y+z6ZSu5Y+m5a2Y5Li65Zu+54mHIl19fSxzZXJpZXM6e3R5cGVOYW1lczp7cGllOiLppbzlm74iLGJhcjoi5p+x54q25Zu+IixsaW5lOiLmipjnur/lm74iLHNjYXR0ZXI6IuaVo+eCueWbviIsZWZmZWN0U2NhdHRlcjoi5raf5ryq5pWj54K55Zu+IixyYWRhcjoi6Zu36L6+5Zu+Iix0cmVlOiLmoJHlm74iLHRyZWVtYXA6IuefqeW9ouagkeWbviIsYm94cGxvdDoi566x5Z6L5Zu+IixjYW5kbGVzdGljazoiS+e6v+WbviIsazoiS+e6v+WbviIsaGVhdG1hcDoi54Ot5Yqb5Zu+IixtYXA6IuWcsOWbviIscGFyYWxsZWw6IuW5s+ihjOWdkOagh+WbviIsbGluZXM6Iue6v+WbviIsZ3JhcGg6IuWFs+ezu+WbviIsc2Fua2V5OiLmoZHln7rlm74iLGZ1bm5lbDoi5ryP5paX5Zu+IixnYXVnZToi5Luq6KGo55uY5Zu+IixwaWN0b3JpYWxCYXI6IuixoeW9ouafseWbviIsdGhlbWVSaXZlcjoi5Li76aKY5rKz5rWB5Zu+IixzdW5idXJzdDoi5pet5pel5Zu+IixjdXN0b206IuiHquWumuS5ieWbvuihqCIsY2hhcnQ6IuWbvuihqCJ9fSxhcmlhOntnZW5lcmFsOnt3aXRoVGl0bGU6Iui/meaYr+S4gOS4quWFs+S6juKAnHt0aXRsZX3igJ3nmoTlm77ooajjgIIiLHdpdGhvdXRUaXRsZToi6L+Z5piv5LiA5Liq5Zu+6KGo77yMIn0sc2VyaWVzOntzaW5nbGU6e3ByZWZpeDoiIix3aXRoTmFtZToi5Zu+6KGo57G75Z6L5pive3Nlcmllc1R5cGV977yM6KGo56S6e3Nlcmllc05hbWV944CCIix3aXRob3V0TmFtZToi5Zu+6KGo57G75Z6L5pive3Nlcmllc1R5cGV944CCIn0sbXVsdGlwbGU6e3ByZWZpeDoi5a6D55Sxe3Nlcmllc0NvdW50feS4quWbvuihqOezu+WIl+e7hOaIkOOAgiIsd2l0aE5hbWU6IuesrHtzZXJpZXNJZH3kuKrns7vliJfmmK/kuIDkuKrooajnpLp7c2VyaWVzTmFtZX3nmoR7c2VyaWVzVHlwZX3vvIwiLHdpdGhvdXROYW1lOiLnrKx7c2VyaWVzSWR95Liq57O75YiX5piv5LiA5Liqe3Nlcmllc1R5cGV977yMIixzZXBhcmF0b3I6e21pZGRsZToi77ybIixlbmQ6IuOAgiJ9fX0sZGF0YTp7YWxsRGF0YToi5YW25pWw5o2u5piv4oCU4oCUIixwYXJ0aWFsRGF0YToi5YW25Lit77yM5YmNe2Rpc3BsYXlDbnR96aG55piv4oCU4oCUIix3aXRoTmFtZToie25hbWV955qE5pWw5o2u5pive3ZhbHVlfSIsd2l0aG91dE5hbWU6Int2YWx1ZX0iLHNlcGFyYXRvcjp7bWlkZGxlOiLvvIwiLGVuZDoiIn19fX0pO3ZhciBCYz0xZTMsRmM9NmU0LEdjPTM2ZTUsV2M9ODY0ZTUsSGM9MzE1MzZlNixZYz17eWVhcjoie3l5eXl9Iixtb250aDoie01NTX0iLGRheToie2R9Iixob3VyOiJ7SEh9OnttbX0iLG1pbnV0ZToie0hIfTp7bW19IixzZWNvbmQ6IntISH06e21tfTp7c3N9IixtaWxsaXNlY29uZDoie0hIfTp7bW19Ontzc30ge1NTU30iLG5vbmU6Int5eXl5fS17TU19LXtkZH0ge0hIfTp7bW19Ontzc30ge1NTU30ifSxYYz0ie3l5eXl9LXtNTX0te2RkfSIsVWM9e3llYXI6Int5eXl5fSIsbW9udGg6Int5eXl5fS17TU19IixkYXk6WGMsaG91cjpYYysiICIrWWMuaG91cixtaW51dGU6WGMrIiAiK1ljLm1pbnV0ZSxzZWNvbmQ6WGMrIiAiK1ljLnNlY29uZCxtaWxsaXNlY29uZDpZYy5ub25lfSxaYz1bInllYXIiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdLGpjPVsieWVhciIsImhhbGYteWVhciIsInF1YXJ0ZXIiLCJtb250aCIsIndlZWsiLCJoYWxmLXdlZWsiLCJkYXkiLCJoYWxmLWRheSIsInF1YXJ0ZXItZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl07ZnVuY3Rpb24gcWModCxlKXtyZXR1cm4iMDAwMCIuc3Vic3RyKDAsZS0odCs9IiIpLmxlbmd0aCkrdH1mdW5jdGlvbiBLYyh0KXtzd2l0Y2godCl7Y2FzZSJoYWxmLXllYXIiOmNhc2UicXVhcnRlciI6cmV0dXJuIm1vbnRoIjtjYXNlIndlZWsiOmNhc2UiaGFsZi13ZWVrIjpyZXR1cm4iZGF5IjtjYXNlImhhbGYtZGF5IjpjYXNlInF1YXJ0ZXItZGF5IjpyZXR1cm4iaG91ciI7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gJGModCl7cmV0dXJuIHQ9PT1LYyh0KX1mdW5jdGlvbiBKYyh0LGUsbixpKXt2YXIgcj11byh0KSxvPXJbZXAobildKCksYT1yW25wKG4pXSgpKzEscz1NYXRoLmZsb29yKChhLTEpLzMpKzEsbD1yW2lwKG4pXSgpLHU9clsiZ2V0Iisobj8iVVRDIjoiIikrIkRheSJdKCksaD1yW3JwKG4pXSgpLGM9KGgtMSklMTIrMSxwPXJbb3AobildKCksZD1yW2FwKG4pXSgpLGY9cltzcChuKV0oKSxnPWg+PTEyPyJwbSI6ImFtIix5PWcudG9VcHBlckNhc2UoKSx2PShpIGluc3RhbmNlb2YgQ2M/aTpWYyhpfHxFYyl8fE5jW09jXSkuZ2V0TW9kZWwoInRpbWUiKSxtPXYuZ2V0KCJtb250aCIpLHg9di5nZXQoIm1vbnRoQWJiciIpLF89di5nZXQoImRheU9mV2VlayIpLGI9di5nZXQoImRheU9mV2Vla0FiYnIiKTtyZXR1cm4oZXx8IiIpLnJlcGxhY2UoL3thfS9nLGcrIiIpLnJlcGxhY2UoL3tBfS9nLHkrIiIpLnJlcGxhY2UoL3t5eXl5fS9nLG8rIiIpLnJlcGxhY2UoL3t5eX0vZyxxYyhvJTEwMCsiIiwyKSkucmVwbGFjZSgve1F9L2cscysiIikucmVwbGFjZSgve01NTU19L2csbVthLTFdKS5yZXBsYWNlKC97TU1NfS9nLHhbYS0xXSkucmVwbGFjZSgve01NfS9nLHFjKGEsMikpLnJlcGxhY2UoL3tNfS9nLGErIiIpLnJlcGxhY2UoL3tkZH0vZyxxYyhsLDIpKS5yZXBsYWNlKC97ZH0vZyxsKyIiKS5yZXBsYWNlKC97ZWVlZX0vZyxfW3VdKS5yZXBsYWNlKC97ZWV9L2csYlt1XSkucmVwbGFjZSgve2V9L2csdSsiIikucmVwbGFjZSgve0hIfS9nLHFjKGgsMikpLnJlcGxhY2UoL3tIfS9nLGgrIiIpLnJlcGxhY2UoL3toaH0vZyxxYyhjKyIiLDIpKS5yZXBsYWNlKC97aH0vZyxjKyIiKS5yZXBsYWNlKC97bW19L2cscWMocCwyKSkucmVwbGFjZSgve219L2cscCsiIikucmVwbGFjZSgve3NzfS9nLHFjKGQsMikpLnJlcGxhY2UoL3tzfS9nLGQrIiIpLnJlcGxhY2UoL3tTU1N9L2cscWMoZiwzKSkucmVwbGFjZSgve1N9L2csZisiIil9ZnVuY3Rpb24gUWModCxlKXt2YXIgbj11byh0KSxpPW5bbnAoZSldKCkrMSxyPW5baXAoZSldKCksbz1uW3JwKGUpXSgpLGE9bltvcChlKV0oKSxzPW5bYXAoZSldKCksbD0wPT09bltzcChlKV0oKSx1PWwmJjA9PT1zLGg9dSYmMD09PWEsYz1oJiYwPT09byxwPWMmJjE9PT1yO3JldHVybiBwJiYxPT09aT8ieWVhciI6cD8ibW9udGgiOmM/ImRheSI6aD8iaG91ciI6dT8ibWludXRlIjpsPyJzZWNvbmQiOiJtaWxsaXNlY29uZCJ9ZnVuY3Rpb24gdHAodCxlLG4pe3ZhciBpPWoodCk/dW8odCk6dDtzd2l0Y2goZT1lfHxRYyh0LG4pKXtjYXNlInllYXIiOnJldHVybiBpW2VwKG4pXSgpO2Nhc2UiaGFsZi15ZWFyIjpyZXR1cm4gaVtucChuKV0oKT49Nj8xOjA7Y2FzZSJxdWFydGVyIjpyZXR1cm4gTWF0aC5mbG9vcigoaVtucChuKV0oKSsxKS80KTtjYXNlIm1vbnRoIjpyZXR1cm4gaVtucChuKV0oKTtjYXNlImRheSI6cmV0dXJuIGlbaXAobildKCk7Y2FzZSJoYWxmLWRheSI6cmV0dXJuIGlbcnAobildKCkvMjQ7Y2FzZSJob3VyIjpyZXR1cm4gaVtycChuKV0oKTtjYXNlIm1pbnV0ZSI6cmV0dXJuIGlbb3AobildKCk7Y2FzZSJzZWNvbmQiOnJldHVybiBpW2FwKG4pXSgpO2Nhc2UibWlsbGlzZWNvbmQiOnJldHVybiBpW3NwKG4pXSgpfX1mdW5jdGlvbiBlcCh0KXtyZXR1cm4gdD8iZ2V0VVRDRnVsbFllYXIiOiJnZXRGdWxsWWVhciJ9ZnVuY3Rpb24gbnAodCl7cmV0dXJuIHQ/ImdldFVUQ01vbnRoIjoiZ2V0TW9udGgifWZ1bmN0aW9uIGlwKHQpe3JldHVybiB0PyJnZXRVVENEYXRlIjoiZ2V0RGF0ZSJ9ZnVuY3Rpb24gcnAodCl7cmV0dXJuIHQ/ImdldFVUQ0hvdXJzIjoiZ2V0SG91cnMifWZ1bmN0aW9uIG9wKHQpe3JldHVybiB0PyJnZXRVVENNaW51dGVzIjoiZ2V0TWludXRlcyJ9ZnVuY3Rpb24gYXAodCl7cmV0dXJuIHQ/ImdldFVUQ1NlY29uZHMiOiJnZXRTZWNvbmRzIn1mdW5jdGlvbiBzcCh0KXtyZXR1cm4gdD8iZ2V0VVRDTWlsbGlzZWNvbmRzIjoiZ2V0TWlsbGlzZWNvbmRzIn1mdW5jdGlvbiBscCh0KXtyZXR1cm4gdD8ic2V0VVRDRnVsbFllYXIiOiJzZXRGdWxsWWVhciJ9ZnVuY3Rpb24gdXAodCl7cmV0dXJuIHQ/InNldFVUQ01vbnRoIjoic2V0TW9udGgifWZ1bmN0aW9uIGhwKHQpe3JldHVybiB0PyJzZXRVVENEYXRlIjoic2V0RGF0ZSJ9ZnVuY3Rpb24gY3AodCl7cmV0dXJuIHQ/InNldFVUQ0hvdXJzIjoic2V0SG91cnMifWZ1bmN0aW9uIHBwKHQpe3JldHVybiB0PyJzZXRVVENNaW51dGVzIjoic2V0TWludXRlcyJ9ZnVuY3Rpb24gZHAodCl7cmV0dXJuIHQ/InNldFVUQ1NlY29uZHMiOiJzZXRTZWNvbmRzIn1mdW5jdGlvbiBmcCh0KXtyZXR1cm4gdD8ic2V0VVRDTWlsbGlzZWNvbmRzIjoic2V0TWlsbGlzZWNvbmRzIn1mdW5jdGlvbiBncCh0KXtpZighdm8odCkpcmV0dXJuIFUodCk/dDoiLSI7dmFyIGU9KHQrIiIpLnNwbGl0KCIuIik7cmV0dXJuIGVbMF0ucmVwbGFjZSgvKFxkezEsM30pKD89KD86XGR7M30pKyg/IVxkKSkvZywiJDEsIikrKGUubGVuZ3RoPjE/Ii4iK2VbMV06IiIpfWZ1bmN0aW9uIHlwKHQsZSl7cmV0dXJuIHQ9KHR8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLy0oLikvZywoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSkpLGUmJnQmJih0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSksdH12YXIgdnA9c3Q7ZnVuY3Rpb24gbXAodCxlLG4pe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQmJnV0KHQpP3Q6Ii0ifWZ1bmN0aW9uIHIodCl7cmV0dXJuIShudWxsPT10fHxpc05hTih0KXx8IWlzRmluaXRlKHQpKX12YXIgbz0idGltZSI9PT1lLGE9dCBpbnN0YW5jZW9mIERhdGU7aWYob3x8YSl7dmFyIHM9bz91byh0KTp0O2lmKCFpc05hTigrcykpcmV0dXJuIEpjKHMsInt5eXl5fS17TU19LXtkZH0ge0hIfTp7bW19Ontzc30iLG4pO2lmKGEpcmV0dXJuIi0ifWlmKCJvcmRpbmFsIj09PWUpcmV0dXJuIFoodCk/aSh0KTpqKHQpJiZyKHQpP3QrIiI6Ii0iO3ZhciBsPXlvKHQpO3JldHVybiByKGwpP2dwKGwpOloodCk/aSh0KToiYm9vbGVhbiI9PXR5cGVvZiB0P3QrIiI6Ii0ifXZhciB4cD1bImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciXSxfcD1mdW5jdGlvbih0LGUpe3JldHVybiJ7Iit0KyhudWxsPT1lPyIiOmUpKyJ9In07ZnVuY3Rpb24gYnAodCxlLG4pe1koZSl8fChlPVtlXSk7dmFyIGk9ZS5sZW5ndGg7aWYoIWkpcmV0dXJuIiI7Zm9yKHZhciByPWVbMF0uJHZhcnN8fFtdLG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIGE9eHBbb107dD10LnJlcGxhY2UoX3AoYSksX3AoYSwwKSl9Zm9yKHZhciBzPTA7czxpO3MrKylmb3IodmFyIGw9MDtsPHIubGVuZ3RoO2wrKyl7dmFyIHU9ZVtzXVtyW2xdXTt0PXQucmVwbGFjZShfcCh4cFtsXSxzKSxuP3JlKHUpOnUpfXJldHVybiB0fWZ1bmN0aW9uIHdwKHQsZSl7dmFyIG49VSh0KT97Y29sb3I6dCxleHRyYUNzc1RleHQ6ZX06dHx8e30saT1uLmNvbG9yLHI9bi50eXBlO2U9bi5leHRyYUNzc1RleHQ7dmFyIG89bi5yZW5kZXJNb2RlfHwiaHRtbCI7cmV0dXJuIGk/Imh0bWwiPT09bz8ic3ViSXRlbSI9PT1yPyc8c3BhbiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6M3B4O2JvcmRlci1yYWRpdXM6NHB4O3dpZHRoOjRweDtoZWlnaHQ6NHB4O2JhY2tncm91bmQtY29sb3I6JytyZShpKSsiOyIrKGV8fCIiKSsnIj48L3NwYW4+JzonPHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo0cHg7Ym9yZGVyLXJhZGl1czoxMHB4O3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjonK3JlKGkpKyI7IisoZXx8IiIpKyciPjwvc3Bhbj4nOntyZW5kZXJNb2RlOm8sY29udGVudDoieyIrKG4ubWFya2VySWR8fCJtYXJrZXJYIikrInx9ICAiLHN0eWxlOiJzdWJJdGVtIj09PXI/e3dpZHRoOjQsaGVpZ2h0OjQsYm9yZGVyUmFkaXVzOjIsYmFja2dyb3VuZENvbG9yOml9Ont3aWR0aDoxMCxoZWlnaHQ6MTAsYm9yZGVyUmFkaXVzOjUsYmFja2dyb3VuZENvbG9yOml9fToiIn1mdW5jdGlvbiBTcCh0LGUpe3JldHVybiBlPWV8fCJ0cmFuc3BhcmVudCIsVSh0KT90OnEodCkmJnQuY29sb3JTdG9wcyYmKHQuY29sb3JTdG9wc1swXXx8e30pLmNvbG9yfHxlfWZ1bmN0aW9uIE1wKHQsZSl7aWYoIl9ibGFuayI9PT1lfHwiYmxhbmsiPT09ZSl7dmFyIG49d2luZG93Lm9wZW4oKTtuLm9wZW5lcj1udWxsLG4ubG9jYXRpb24uaHJlZj10fWVsc2Ugd2luZG93Lm9wZW4odCxlKX12YXIgSXA9RSxUcD1bImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSIsIndpZHRoIiwiaGVpZ2h0Il0sQ3A9W1sid2lkdGgiLCJsZWZ0IiwicmlnaHQiXSxbImhlaWdodCIsInRvcCIsImJvdHRvbSJdXTtmdW5jdGlvbiBEcCh0LGUsbixpLHIpe3ZhciBvPTAsYT0wO251bGw9PWkmJihpPTEvMCksbnVsbD09ciYmKHI9MS8wKTt2YXIgcz0wO2UuZWFjaENoaWxkKChmdW5jdGlvbihsLHUpe3ZhciBoLGMscD1sLmdldEJvdW5kaW5nUmVjdCgpLGQ9ZS5jaGlsZEF0KHUrMSksZj1kJiZkLmdldEJvdW5kaW5nUmVjdCgpO2lmKCJob3Jpem9udGFsIj09PXQpe3ZhciBnPXAud2lkdGgrKGY/LWYueCtwLng6MCk7KGg9bytnKT5pfHxsLm5ld2xpbmU/KG89MCxoPWcsYSs9cytuLHM9cC5oZWlnaHQpOnM9TWF0aC5tYXgocyxwLmhlaWdodCl9ZWxzZXt2YXIgeT1wLmhlaWdodCsoZj8tZi55K3AueTowKTsoYz1hK3kpPnJ8fGwubmV3bGluZT8obys9cytuLGE9MCxjPXkscz1wLndpZHRoKTpzPU1hdGgubWF4KHMscC53aWR0aCl9bC5uZXdsaW5lfHwobC54PW8sbC55PWEsbC5tYXJrUmVkcmF3KCksImhvcml6b250YWwiPT09dD9vPWgrbjphPWMrbil9KSl9dmFyIEFwPURwO0goRHAsInZlcnRpY2FsIiksSChEcCwiaG9yaXpvbnRhbCIpO2Z1bmN0aW9uIGtwKHQsZSxuKXtuPXZwKG58fDApO3ZhciBpPWUud2lkdGgscj1lLmhlaWdodCxvPSRyKHQubGVmdCxpKSxhPSRyKHQudG9wLHIpLHM9JHIodC5yaWdodCxpKSxsPSRyKHQuYm90dG9tLHIpLHU9JHIodC53aWR0aCxpKSxoPSRyKHQuaGVpZ2h0LHIpLGM9blsyXStuWzBdLHA9blsxXStuWzNdLGQ9dC5hc3BlY3Q7c3dpdGNoKGlzTmFOKHUpJiYodT1pLXMtcC1vKSxpc05hTihoKSYmKGg9ci1sLWMtYSksbnVsbCE9ZCYmKGlzTmFOKHUpJiZpc05hTihoKSYmKGQ+aS9yP3U9LjgqaTpoPS44KnIpLGlzTmFOKHUpJiYodT1kKmgpLGlzTmFOKGgpJiYoaD11L2QpKSxpc05hTihvKSYmKG89aS1zLXUtcCksaXNOYU4oYSkmJihhPXItbC1oLWMpLHQubGVmdHx8dC5yaWdodCl7Y2FzZSJjZW50ZXIiOm89aS8yLXUvMi1uWzNdO2JyZWFrO2Nhc2UicmlnaHQiOm89aS11LXB9c3dpdGNoKHQudG9wfHx0LmJvdHRvbSl7Y2FzZSJtaWRkbGUiOmNhc2UiY2VudGVyIjphPXIvMi1oLzItblswXTticmVhaztjYXNlImJvdHRvbSI6YT1yLWgtY31vPW98fDAsYT1hfHwwLGlzTmFOKHUpJiYodT1pLXAtby0oc3x8MCkpLGlzTmFOKGgpJiYoaD1yLWMtYS0obHx8MCkpO3ZhciBmPW5ldyB6ZShvK25bM10sYStuWzBdLHUsaCk7cmV0dXJuIGYubWFyZ2luPW4sZn1mdW5jdGlvbiBMcCh0LGUsbixpLHIsbyl7dmFyIGEscz0hcnx8IXIuaHZ8fHIuaHZbMF0sbD0hcnx8IXIuaHZ8fHIuaHZbMV0sdT1yJiZyLmJvdW5kaW5nTW9kZXx8ImFsbCI7aWYoKG89b3x8dCkueD10Lngsby55PXQueSwhcyYmIWwpcmV0dXJuITE7aWYoInJhdyI9PT11KWE9Imdyb3VwIj09PXQudHlwZT9uZXcgemUoMCwwLCtlLndpZHRofHwwLCtlLmhlaWdodHx8MCk6dC5nZXRCb3VuZGluZ1JlY3QoKTtlbHNlIGlmKGE9dC5nZXRCb3VuZGluZ1JlY3QoKSx0Lm5lZWRMb2NhbFRyYW5zZm9ybSgpKXt2YXIgaD10LmdldExvY2FsVHJhbnNmb3JtKCk7KGE9YS5jbG9uZSgpKS5hcHBseVRyYW5zZm9ybShoKX12YXIgYz1rcChrKHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH0sZSksbixpKSxwPXM/Yy54LWEueDowLGQ9bD9jLnktYS55OjA7cmV0dXJuInJhdyI9PT11PyhvLng9cCxvLnk9ZCk6KG8ueCs9cCxvLnkrPWQpLG89PT10JiZ0Lm1hcmtSZWRyYXcoKSwhMH1mdW5jdGlvbiBQcCh0KXt2YXIgZT10LmxheW91dE1vZGV8fHQuY29uc3RydWN0b3IubGF5b3V0TW9kZTtyZXR1cm4gcShlKT9lOmU/e3R5cGU6ZX06bnVsbH1mdW5jdGlvbiBPcCh0LGUsbil7dmFyIGk9biYmbi5pZ25vcmVTaXplOyFZKGkpJiYoaT1baSxpXSk7dmFyIHI9YShDcFswXSwwKSxvPWEoQ3BbMV0sMSk7ZnVuY3Rpb24gYShuLHIpe3ZhciBvPXt9LGE9MCx1PXt9LGg9MDtpZihJcChuLChmdW5jdGlvbihlKXt1W2VdPXRbZV19KSksSXAobiwoZnVuY3Rpb24odCl7cyhlLHQpJiYob1t0XT11W3RdPWVbdF0pLGwobyx0KSYmYSsrLGwodSx0KSYmaCsrfSkpLGlbcl0pcmV0dXJuIGwoZSxuWzFdKT91W25bMl1dPW51bGw6bChlLG5bMl0pJiYodVtuWzFdXT1udWxsKSx1O2lmKDIhPT1oJiZhKXtpZihhPj0yKXJldHVybiBvO2Zvcih2YXIgYz0wO2M8bi5sZW5ndGg7YysrKXt2YXIgcD1uW2NdO2lmKCFzKG8scCkmJnModCxwKSl7b1twXT10W3BdO2JyZWFrfX1yZXR1cm4gb31yZXR1cm4gdX1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSl9ZnVuY3Rpb24gbCh0LGUpe3JldHVybiBudWxsIT10W2VdJiYiYXV0byIhPT10W2VdfWZ1bmN0aW9uIHUodCxlLG4pe0lwKHQsKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pKX11KENwWzBdLHQsciksdShDcFsxXSx0LG8pfWZ1bmN0aW9uIFJwKHQpe3JldHVybiBOcCh7fSx0KX1mdW5jdGlvbiBOcCh0LGUpe3JldHVybiBlJiZ0JiZJcChUcCwoZnVuY3Rpb24obil7ZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSksdH12YXIgRXA9Vm8oKSx6cD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixpKXt2YXIgcj10LmNhbGwodGhpcyxlLG4saSl8fHRoaXM7cmV0dXJuIHIudWlkPUFjKCJlY19jcHRfbW9kZWwiKSxyfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUsbil7dGhpcy5tZXJnZURlZmF1bHRBbmRUaGVtZSh0LG4pfSxlLnByb3RvdHlwZS5tZXJnZURlZmF1bHRBbmRUaGVtZT1mdW5jdGlvbih0LGUpe3ZhciBuPVBwKHRoaXMpLGk9bj9ScCh0KTp7fTtDKHQsZS5nZXRUaGVtZSgpLmdldCh0aGlzLm1haW5UeXBlKSksQyh0LHRoaXMuZ2V0RGVmYXVsdE9wdGlvbigpKSxuJiZPcCh0LGksbil9LGUucHJvdG90eXBlLm1lcmdlT3B0aW9uPWZ1bmN0aW9uKHQsZSl7Qyh0aGlzLm9wdGlvbix0LCEwKTt2YXIgbj1QcCh0aGlzKTtuJiZPcCh0aGlzLm9wdGlvbix0LG4pfSxlLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKHQsZSl7fSxlLnByb3RvdHlwZS5nZXREZWZhdWx0T3B0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb25zdHJ1Y3RvcjtpZighZnVuY3Rpb24odCl7cmV0dXJuISghdHx8IXRbcW9dKX0odCkpcmV0dXJuIHQuZGVmYXVsdE9wdGlvbjt2YXIgZT1FcCh0aGlzKTtpZighZS5kZWZhdWx0T3B0aW9uKXtmb3IodmFyIG49W10saT10O2k7KXt2YXIgcj1pLnByb3RvdHlwZS5kZWZhdWx0T3B0aW9uO3ImJm4ucHVzaChyKSxpPWkuc3VwZXJDbGFzc31mb3IodmFyIG89e30sYT1uLmxlbmd0aC0xO2E+PTA7YS0tKW89QyhvLG5bYV0sITApO2UuZGVmYXVsdE9wdGlvbj1vfXJldHVybiBlLmRlZmF1bHRPcHRpb259LGUucHJvdG90eXBlLmdldFJlZmVycmluZ0NvbXBvbmVudHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10KyJJbmRleCIsaT10KyJJZCI7cmV0dXJuIFlvKHRoaXMuZWNNb2RlbCx0LHtpbmRleDp0aGlzLmdldChuLCEwKSxpZDp0aGlzLmdldChpLCEwKX0sZSl9LGUucHJvdG90eXBlLmdldEJveExheW91dFBhcmFtcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2xlZnQ6dC5nZXQoImxlZnQiKSx0b3A6dC5nZXQoInRvcCIpLHJpZ2h0OnQuZ2V0KCJyaWdodCIpLGJvdHRvbTp0LmdldCgiYm90dG9tIiksd2lkdGg6dC5nZXQoIndpZHRoIiksaGVpZ2h0OnQuZ2V0KCJoZWlnaHQiKX19LGUucHJvdG90eXBlLmdldFpMZXZlbEtleT1mdW5jdGlvbigpe3JldHVybiIifSxlLnByb3RvdHlwZS5zZXRaTGV2ZWw9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uemxldmVsPXR9LGUucHJvdG9Jbml0aWFsaXplPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5wcm90b3R5cGU7dC50eXBlPSJjb21wb25lbnQiLHQuaWQ9IiIsdC5uYW1lPSIiLHQubWFpblR5cGU9IiIsdC5zdWJUeXBlPSIiLHQuY29tcG9uZW50SW5kZXg9MH0oKSxlfShDYyk7Sm8oenAsQ2MpLG5hKHpwKSxmdW5jdGlvbih0KXt2YXIgZT17fTt0LnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcj1mdW5jdGlvbih0LG4pe3ZhciBpPUtvKHQpO2VbaS5tYWluXT1ufSx0LmRldGVybWluZVN1YlR5cGU9ZnVuY3Rpb24obixpKXt2YXIgcj1pLnR5cGU7aWYoIXIpe3ZhciBvPUtvKG4pLm1haW47dC5oYXNTdWJUeXBlcyhuKSYmZVtvXSYmKHI9ZVtvXShpKSl9cmV0dXJuIHJ9fSh6cCksZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHRbZV18fCh0W2VdPXtwcmVkZWNlc3NvcjpbXSxzdWNjZXNzb3I6W119KSx0W2VdfXQudG9wb2xvZ2ljYWxUcmF2ZWw9ZnVuY3Rpb24odCxpLHIsbyl7aWYodC5sZW5ndGgpe3ZhciBhPWZ1bmN0aW9uKHQpe3ZhciBpPXt9LHI9W107cmV0dXJuIEUodCwoZnVuY3Rpb24obyl7dmFyIGE9bihpLG8pLHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXTtyZXR1cm4gRSh0LChmdW5jdGlvbih0KXtQKGUsdCk+PTAmJm4ucHVzaCh0KX0pKSxufShhLm9yaWdpbmFsRGVwcz1lKG8pLHQpO2EuZW50cnlDb3VudD1zLmxlbmd0aCwwPT09YS5lbnRyeUNvdW50JiZyLnB1c2gobyksRShzLChmdW5jdGlvbih0KXtQKGEucHJlZGVjZXNzb3IsdCk8MCYmYS5wcmVkZWNlc3Nvci5wdXNoKHQpO3ZhciBlPW4oaSx0KTtQKGUuc3VjY2Vzc29yLHQpPDAmJmUuc3VjY2Vzc29yLnB1c2gobyl9KSl9KSkse2dyYXBoOmksbm9FbnRyeUxpc3Q6cn19KGkpLHM9YS5ncmFwaCxsPWEubm9FbnRyeUxpc3QsdT17fTtmb3IoRSh0LChmdW5jdGlvbih0KXt1W3RdPSEwfSkpO2wubGVuZ3RoOyl7dmFyIGg9bC5wb3AoKSxjPXNbaF0scD0hIXVbaF07cCYmKHIuY2FsbChvLGgsYy5vcmlnaW5hbERlcHMuc2xpY2UoKSksZGVsZXRlIHVbaF0pLEUoYy5zdWNjZXNzb3IscD9mOmQpfUUodSwoZnVuY3Rpb24oKXt2YXIgdD0iIjt0aHJvdyBuZXcgRXJyb3IodCl9KSl9ZnVuY3Rpb24gZCh0KXtzW3RdLmVudHJ5Q291bnQtLSwwPT09c1t0XS5lbnRyeUNvdW50JiZsLnB1c2godCl9ZnVuY3Rpb24gZih0KXt1W3RdPSEwLGQodCl9fX0oenAsKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO0UoenAuZ2V0Q2xhc3Nlc0J5TWFpblR5cGUodCksKGZ1bmN0aW9uKHQpe2U9ZS5jb25jYXQodC5kZXBlbmRlbmNpZXN8fHQucHJvdG90eXBlLmRlcGVuZGVuY2llc3x8W10pfSkpLGU9eihlLChmdW5jdGlvbih0KXtyZXR1cm4gS28odCkubWFpbn0pKSwiZGF0YXNldCIhPT10JiZQKGUsImRhdGFzZXQiKTw9MCYmZS51bnNoaWZ0KCJkYXRhc2V0Iik7cmV0dXJuIGV9KSk7dmFyIFZwPSIiOyJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiYoVnA9bmF2aWdhdG9yLnBsYXRmb3JtfHwiIik7dmFyIEJwPSJyZ2JhKDAsIDAsIDAsIDAuMikiLEZwPXtkYXJrTW9kZToiYXV0byIsY29sb3JCeToic2VyaWVzIixjb2xvcjpbIiM1NDcwYzYiLCIjOTFjYzc1IiwiI2ZhYzg1OCIsIiNlZTY2NjYiLCIjNzNjMGRlIiwiIzNiYTI3MiIsIiNmYzg0NTIiLCIjOWE2MGI0IiwiI2VhN2NjYyJdLGdyYWRpZW50Q29sb3I6WyIjZjZlZmE2IiwiI2Q4ODI3MyIsIiNiZjQ0NGMiXSxhcmlhOntkZWNhbDp7ZGVjYWxzOlt7Y29sb3I6QnAsZGFzaEFycmF5WDpbMSwwXSxkYXNoQXJyYXlZOlsyLDVdLHN5bWJvbFNpemU6MSxyb3RhdGlvbjpNYXRoLlBJLzZ9LHtjb2xvcjpCcCxzeW1ib2w6ImNpcmNsZSIsZGFzaEFycmF5WDpbWzgsOF0sWzAsOCw4LDBdXSxkYXNoQXJyYXlZOls2LDBdLHN5bWJvbFNpemU6Ljh9LHtjb2xvcjpCcCxkYXNoQXJyYXlYOlsxLDBdLGRhc2hBcnJheVk6WzQsM10scm90YXRpb246LU1hdGguUEkvNH0se2NvbG9yOkJwLGRhc2hBcnJheVg6W1s2LDZdLFswLDYsNiwwXV0sZGFzaEFycmF5WTpbNiwwXX0se2NvbG9yOkJwLGRhc2hBcnJheVg6W1sxLDBdLFsxLDZdXSxkYXNoQXJyYXlZOlsxLDAsNiwwXSxyb3RhdGlvbjpNYXRoLlBJLzR9LHtjb2xvcjpCcCxzeW1ib2w6InRyaWFuZ2xlIixkYXNoQXJyYXlYOltbOSw5XSxbMCw5LDksMF1dLGRhc2hBcnJheVk6WzcsMl0sc3ltYm9sU2l6ZTouNzV9XX19LHRleHRTdHlsZTp7Zm9udEZhbWlseTpWcC5tYXRjaCgvXldpbi8pPyJNaWNyb3NvZnQgWWFIZWkiOiJzYW5zLXNlcmlmIixmb250U2l6ZToxMixmb250U3R5bGU6Im5vcm1hbCIsZm9udFdlaWdodDoibm9ybWFsIn0sYmxlbmRNb2RlOm51bGwsc3RhdGVBbmltYXRpb246e2R1cmF0aW9uOjMwMCxlYXNpbmc6ImN1YmljT3V0In0sYW5pbWF0aW9uOiJhdXRvIixhbmltYXRpb25EdXJhdGlvbjoxZTMsYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6NTAwLGFuaW1hdGlvbkVhc2luZzoiY3ViaWNJbk91dCIsYW5pbWF0aW9uRWFzaW5nVXBkYXRlOiJjdWJpY0luT3V0IixhbmltYXRpb25UaHJlc2hvbGQ6MmUzLHByb2dyZXNzaXZlVGhyZXNob2xkOjNlMyxwcm9ncmVzc2l2ZTo0MDAsaG92ZXJMYXllclRocmVzaG9sZDozZTMsdXNlVVRDOiExfSxHcD15dChbInRvb2x0aXAiLCJsYWJlbCIsIml0ZW1OYW1lIiwiaXRlbUlkIiwiaXRlbUdyb3VwSWQiLCJpdGVtQ2hpbGRHcm91cElkIiwic2VyaWVzTmFtZSJdKSxXcD0ib3JpZ2luYWwiLEhwPSJhcnJheVJvd3MiLFlwPSJvYmplY3RSb3dzIixYcD0ia2V5ZWRDb2x1bW5zIixVcD0idHlwZWRBcnJheSIsWnA9InVua25vd24iLGpwPSJjb2x1bW4iLHFwPSJyb3ciLEtwPTEsJHA9MixKcD0zLFFwPVZvKCk7ZnVuY3Rpb24gdGQodCxlLG4pe3ZhciBpPXt9LHI9bmQoZSk7aWYoIXJ8fCF0KXJldHVybiBpO3ZhciBvLGEscz1bXSxsPVtdLHU9ZS5lY01vZGVsLGg9UXAodSkuZGF0YXNldE1hcCxjPXIudWlkKyJfIituLnNlcmllc0xheW91dEJ5O0UodD10LnNsaWNlKCksKGZ1bmN0aW9uKGUsbil7dmFyIHI9cShlKT9lOnRbbl09e25hbWU6ZX07Im9yZGluYWwiPT09ci50eXBlJiZudWxsPT1vJiYobz1uLGE9ZihyKSksaVtyLm5hbWVdPVtdfSkpO3ZhciBwPWguZ2V0KGMpfHxoLnNldChjLHtjYXRlZ29yeVdheURpbTphLHZhbHVlV2F5RGltOjB9KTtmdW5jdGlvbiBkKHQsZSxuKXtmb3IodmFyIGk9MDtpPG47aSsrKXQucHVzaChlK2kpfWZ1bmN0aW9uIGYodCl7dmFyIGU9dC5kaW1zRGVmO3JldHVybiBlP2UubGVuZ3RoOjF9cmV0dXJuIEUodCwoZnVuY3Rpb24odCxlKXt2YXIgbj10Lm5hbWUscj1mKHQpO2lmKG51bGw9PW8pe3ZhciBhPXAudmFsdWVXYXlEaW07ZChpW25dLGEsciksZChsLGEscikscC52YWx1ZVdheURpbSs9cn1lbHNlIGlmKG89PT1lKWQoaVtuXSwwLHIpLGQocywwLHIpO2Vsc2V7YT1wLmNhdGVnb3J5V2F5RGltO2QoaVtuXSxhLHIpLGQobCxhLHIpLHAuY2F0ZWdvcnlXYXlEaW0rPXJ9fSkpLHMubGVuZ3RoJiYoaS5pdGVtTmFtZT1zKSxsLmxlbmd0aCYmKGkuc2VyaWVzTmFtZT1sKSxpfWZ1bmN0aW9uIGVkKHQsZSxuKXt2YXIgaT17fTtpZighbmQodCkpcmV0dXJuIGk7dmFyIHIsbz1lLnNvdXJjZUZvcm1hdCxhPWUuZGltZW5zaW9uc0RlZmluZTtvIT09WXAmJm8hPT1YcHx8RShhLChmdW5jdGlvbih0LGUpeyJuYW1lIj09PShxKHQpP3QubmFtZTp0KSYmKHI9ZSl9KSk7dmFyIHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9e30saT17fSxzPVtdLGw9MCx1PU1hdGgubWluKDUsbik7bDx1O2wrKyl7dmFyIGg9cmQoZS5kYXRhLG8sZS5zZXJpZXNMYXlvdXRCeSxhLGUuc3RhcnRJbmRleCxsKTtzLnB1c2goaCk7dmFyIGM9aD09PUpwO2lmKGMmJm51bGw9PXQudiYmbCE9PXImJih0LnY9bCksKG51bGw9PXQubnx8dC5uPT09dC52fHwhYyYmc1t0Lm5dPT09SnApJiYodC5uPWwpLHAodCkmJnNbdC5uXSE9PUpwKXJldHVybiB0O2N8fChoPT09JHAmJm51bGw9PWkudiYmbCE9PXImJihpLnY9bCksbnVsbCE9aS5uJiZpLm4hPT1pLnZ8fChpLm49bCkpfWZ1bmN0aW9uIHAodCl7cmV0dXJuIG51bGwhPXQudiYmbnVsbCE9dC5ufXJldHVybiBwKHQpP3Q6cChpKT9pOm51bGx9KCk7aWYocyl7aS52YWx1ZT1bcy52XTt2YXIgbD1udWxsIT1yP3I6cy5uO2kuaXRlbU5hbWU9W2xdLGkuc2VyaWVzTmFtZT1bbF19cmV0dXJuIGl9ZnVuY3Rpb24gbmQodCl7aWYoIXQuZ2V0KCJkYXRhIiwhMCkpcmV0dXJuIFlvKHQuZWNNb2RlbCwiZGF0YXNldCIse2luZGV4OnQuZ2V0KCJkYXRhc2V0SW5kZXgiLCEwKSxpZDp0LmdldCgiZGF0YXNldElkIiwhMCl9LFdvKS5tb2RlbHNbMF19ZnVuY3Rpb24gaWQodCxlKXtyZXR1cm4gcmQodC5kYXRhLHQuc291cmNlRm9ybWF0LHQuc2VyaWVzTGF5b3V0QnksdC5kaW1lbnNpb25zRGVmaW5lLHQuc3RhcnRJbmRleCxlKX1mdW5jdGlvbiByZCh0LGUsbixpLHIsbyl7dmFyIGEscyxsO2lmKCQodCkpcmV0dXJuIEpwO2lmKGkpe3ZhciB1PWlbb107cSh1KT8ocz11Lm5hbWUsbD11LnR5cGUpOlUodSkmJihzPXUpfWlmKG51bGwhPWwpcmV0dXJuIm9yZGluYWwiPT09bD9LcDpKcDtpZihlPT09SHApe3ZhciBoPXQ7aWYobj09PXFwKXtmb3IodmFyIGM9aFtvXSxwPTA7cDwoY3x8W10pLmxlbmd0aCYmcDw1O3ArKylpZihudWxsIT0oYT1tKGNbcitwXSkpKXJldHVybiBhfWVsc2UgZm9yKHA9MDtwPGgubGVuZ3RoJiZwPDU7cCsrKXt2YXIgZD1oW3IrcF07aWYoZCYmbnVsbCE9KGE9bShkW29dKSkpcmV0dXJuIGF9fWVsc2UgaWYoZT09PVlwKXt2YXIgZj10O2lmKCFzKXJldHVybiBKcDtmb3IocD0wO3A8Zi5sZW5ndGgmJnA8NTtwKyspe2lmKCh5PWZbcF0pJiZudWxsIT0oYT1tKHlbc10pKSlyZXR1cm4gYX19ZWxzZSBpZihlPT09WHApe2lmKCFzKXJldHVybiBKcDtpZighKGM9dFtzXSl8fCQoYykpcmV0dXJuIEpwO2ZvcihwPTA7cDxjLmxlbmd0aCYmcDw1O3ArKylpZihudWxsIT0oYT1tKGNbcF0pKSlyZXR1cm4gYX1lbHNlIGlmKGU9PT1XcCl7dmFyIGc9dDtmb3IocD0wO3A8Zy5sZW5ndGgmJnA8NTtwKyspe3ZhciB5LHY9QW8oeT1nW3BdKTtpZighWSh2KSlyZXR1cm4gSnA7aWYobnVsbCE9KGE9bSh2W29dKSkpcmV0dXJuIGF9fWZ1bmN0aW9uIG0odCl7dmFyIGU9VSh0KTtyZXR1cm4gbnVsbCE9dCYmTnVtYmVyLmlzRmluaXRlKE51bWJlcih0KSkmJiIiIT09dD9lPyRwOkpwOmUmJiItIiE9PXQ/S3A6dm9pZCAwfXJldHVybiBKcH12YXIgb2Q9eXQoKTt2YXIgYWQsc2QsbGQsdWQ9Vm8oKSxoZD1WbygpLGNkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuZ2V0Q29sb3JGcm9tUGFsZXR0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9VG8odGhpcy5nZXQoImNvbG9yIiwhMCkpLHI9dGhpcy5nZXQoImNvbG9yTGF5ZXIiLCEwKTtyZXR1cm4gZGQodGhpcyx1ZCxpLHIsdCxlLG4pfSx0LnByb3RvdHlwZS5jbGVhckNvbG9yUGFsZXR0ZT1mdW5jdGlvbigpeyFmdW5jdGlvbih0LGUpe2UodCkucGFsZXR0ZUlkeD0wLGUodCkucGFsZXR0ZU5hbWVNYXA9e319KHRoaXMsdWQpfSx0fSgpO2Z1bmN0aW9uIHBkKHQsZSxuLGkpe3ZhciByPVRvKHQuZ2V0KFsiYXJpYSIsImRlY2FsIiwiZGVjYWxzIl0pKTtyZXR1cm4gZGQodCxoZCxyLG51bGwsZSxuLGkpfWZ1bmN0aW9uIGRkKHQsZSxuLGkscixvLGEpe3ZhciBzPWUobz1vfHx0KSxsPXMucGFsZXR0ZUlkeHx8MCx1PXMucGFsZXR0ZU5hbWVNYXA9cy5wYWxldHRlTmFtZU1hcHx8e307aWYodS5oYXNPd25Qcm9wZXJ0eShyKSlyZXR1cm4gdVtyXTt2YXIgaD1udWxsIT1hJiZpP2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLGk9MDtpPG47aSsrKWlmKHRbaV0ubGVuZ3RoPmUpcmV0dXJuIHRbaV07cmV0dXJuIHRbbi0xXX0oaSxhKTpuO2lmKChoPWh8fG4pJiZoLmxlbmd0aCl7dmFyIGM9aFtsXTtyZXR1cm4gciYmKHVbcl09Yykscy5wYWxldHRlSWR4PShsKzEpJWgubGVuZ3RoLGN9fXZhciBmZD0iXDBfZWNfaW5uZXIiO3ZhciBnZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlLG4saSxyLG8pe2k9aXx8e30sdGhpcy5vcHRpb249bnVsbCx0aGlzLl90aGVtZT1uZXcgQ2MoaSksdGhpcy5fbG9jYWxlPW5ldyBDYyhyKSx0aGlzLl9vcHRpb25NYW5hZ2VyPW99LGUucHJvdG90eXBlLnNldE9wdGlvbj1mdW5jdGlvbih0LGUsbil7dmFyIGk9bWQoZSk7dGhpcy5fb3B0aW9uTWFuYWdlci5zZXRPcHRpb24odCxuLGkpLHRoaXMuX3Jlc2V0T3B0aW9uKG51bGwsaSl9LGUucHJvdG90eXBlLnJlc2V0T3B0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3Jlc2V0T3B0aW9uKHQsbWQoZSkpfSxlLnByb3RvdHlwZS5fcmVzZXRPcHRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj0hMSxpPXRoaXMuX29wdGlvbk1hbmFnZXI7aWYoIXR8fCJyZWNyZWF0ZSI9PT10KXt2YXIgcj1pLm1vdW50T3B0aW9uKCJyZWNyZWF0ZSI9PT10KTswLHRoaXMub3B0aW9uJiYicmVjcmVhdGUiIT09dD8odGhpcy5yZXN0b3JlRGF0YSgpLHRoaXMuX21lcmdlT3B0aW9uKHIsZSkpOmxkKHRoaXMsciksbj0hMH1pZigidGltZWxpbmUiIT09dCYmIm1lZGlhIiE9PXR8fHRoaXMucmVzdG9yZURhdGEoKSwhdHx8InJlY3JlYXRlIj09PXR8fCJ0aW1lbGluZSI9PT10KXt2YXIgbz1pLmdldFRpbWVsaW5lT3B0aW9uKHRoaXMpO28mJihuPSEwLHRoaXMuX21lcmdlT3B0aW9uKG8sZSkpfWlmKCF0fHwicmVjcmVhdGUiPT09dHx8Im1lZGlhIj09PXQpe3ZhciBhPWkuZ2V0TWVkaWFPcHRpb24odGhpcyk7YS5sZW5ndGgmJkUoYSwoZnVuY3Rpb24odCl7bj0hMCx0aGlzLl9tZXJnZU9wdGlvbih0LGUpfSksdGhpcyl9cmV0dXJuIG59LGUucHJvdG90eXBlLm1lcmdlT3B0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuX21lcmdlT3B0aW9uKHQsbnVsbCl9LGUucHJvdG90eXBlLl9tZXJnZU9wdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9uLGk9dGhpcy5fY29tcG9uZW50c01hcCxyPXRoaXMuX2NvbXBvbmVudHNDb3VudCxvPVtdLGE9eXQoKSxzPWUmJmUucmVwbGFjZU1lcmdlTWFpblR5cGVNYXA7UXAodGhpcykuZGF0YXNldE1hcD15dCgpLEUodCwoZnVuY3Rpb24odCxlKXtudWxsIT10JiYoenAuaGFzQ2xhc3MoZSk/ZSYmKG8ucHVzaChlKSxhLnNldChlLCEwKSk6bltlXT1udWxsPT1uW2VdP1QodCk6QyhuW2VdLHQsITApKX0pKSxzJiZzLmVhY2goKGZ1bmN0aW9uKHQsZSl7enAuaGFzQ2xhc3MoZSkmJiFhLmdldChlKSYmKG8ucHVzaChlKSxhLnNldChlLCEwKSl9KSksenAudG9wb2xvZ2ljYWxUcmF2ZWwobyx6cC5nZXRBbGxDbGFzc01haW5UeXBlcygpLChmdW5jdGlvbihlKXt2YXIgbz1mdW5jdGlvbih0LGUsbil7dmFyIGk9b2QuZ2V0KGUpO2lmKCFpKXJldHVybiBuO3ZhciByPWkodCk7cmV0dXJuIHI/bi5jb25jYXQocik6bn0odGhpcyxlLFRvKHRbZV0pKSxhPWkuZ2V0KGUpLGw9YT9zJiZzLmdldChlKT8icmVwbGFjZU1lcmdlIjoibm9ybWFsTWVyZ2UiOiJyZXBsYWNlQWxsIix1PUxvKGEsbyxsKTsoZnVuY3Rpb24odCxlLG4pe0UodCwoZnVuY3Rpb24odCl7dmFyIGk9dC5uZXdPcHRpb247cShpKSYmKHQua2V5SW5mby5tYWluVHlwZT1lLHQua2V5SW5mby5zdWJUeXBlPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBlLnR5cGU/ZS50eXBlOm4/bi5zdWJUeXBlOmkuZGV0ZXJtaW5lU3ViVHlwZSh0LGUpfShlLGksdC5leGlzdGluZyxuKSl9KSl9KSh1LGUsenApLG5bZV09bnVsbCxpLnNldChlLG51bGwpLHIuc2V0KGUsMCk7dmFyIGgsYz1bXSxwPVtdLGQ9MDtFKHUsKGZ1bmN0aW9uKHQsbil7dmFyIGk9dC5leGlzdGluZyxyPXQubmV3T3B0aW9uO2lmKHIpe3ZhciBvPSJzZXJpZXMiPT09ZSxhPXpwLmdldENsYXNzKGUsdC5rZXlJbmZvLnN1YlR5cGUsIW8pO2lmKCFhKXJldHVybjtpZigidG9vbHRpcCI9PT1lKXtpZihoKXJldHVybiB2b2lkIDA7aD0hMH1pZihpJiZpLmNvbnN0cnVjdG9yPT09YSlpLm5hbWU9dC5rZXlJbmZvLm5hbWUsaS5tZXJnZU9wdGlvbihyLHRoaXMpLGkub3B0aW9uVXBkYXRlZChyLCExKTtlbHNle3ZhciBzPUEoe2NvbXBvbmVudEluZGV4Om59LHQua2V5SW5mbyk7QShpPW5ldyBhKHIsdGhpcyx0aGlzLHMpLHMpLHQuYnJhbmROZXcmJihpLl9fcmVxdWlyZU5ld1ZpZXc9ITApLGkuaW5pdChyLHRoaXMsdGhpcyksaS5vcHRpb25VcGRhdGVkKG51bGwsITApfX1lbHNlIGkmJihpLm1lcmdlT3B0aW9uKHt9LHRoaXMpLGkub3B0aW9uVXBkYXRlZCh7fSwhMSkpO2k/KGMucHVzaChpLm9wdGlvbikscC5wdXNoKGkpLGQrKyk6KGMucHVzaCh2b2lkIDApLHAucHVzaCh2b2lkIDApKX0pLHRoaXMpLG5bZV09YyxpLnNldChlLHApLHIuc2V0KGUsZCksInNlcmllcyI9PT1lJiZhZCh0aGlzKX0pLHRoaXMpLHRoaXMuX3Nlcmllc0luZGljZXN8fGFkKHRoaXMpfSxlLnByb3RvdHlwZS5nZXRPcHRpb249ZnVuY3Rpb24oKXt2YXIgdD1UKHRoaXMub3B0aW9uKTtyZXR1cm4gRSh0LChmdW5jdGlvbihlLG4pe2lmKHpwLmhhc0NsYXNzKG4pKXtmb3IodmFyIGk9VG8oZSkscj1pLmxlbmd0aCxvPSExLGE9ci0xO2E+PTA7YS0tKWlbYV0mJiFFbyhpW2FdKT9vPSEwOihpW2FdPW51bGwsIW8mJnItLSk7aS5sZW5ndGg9cix0W25dPWl9fSkpLGRlbGV0ZSB0W2ZkXSx0fSxlLnByb3RvdHlwZS5nZXRUaGVtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aGVtZX0sZS5wcm90b3R5cGUuZ2V0TG9jYWxlTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9jYWxlfSxlLnByb3RvdHlwZS5zZXRVcGRhdGVQYXlsb2FkPWZ1bmN0aW9uKHQpe3RoaXMuX3BheWxvYWQ9dH0sZS5wcm90b3R5cGUuZ2V0VXBkYXRlUGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXlsb2FkfSxlLnByb3RvdHlwZS5nZXRDb21wb25lbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb21wb25lbnRzTWFwLmdldCh0KTtpZihuKXt2YXIgaT1uW2V8fDBdO2lmKGkpcmV0dXJuIGk7aWYobnVsbD09ZSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylpZihuW3JdKXJldHVybiBuW3JdfX0sZS5wcm90b3R5cGUucXVlcnlDb21wb25lbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQubWFpblR5cGU7aWYoIWUpcmV0dXJuW107dmFyIG4saT10LmluZGV4LHI9dC5pZCxvPXQubmFtZSxhPXRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KGUpO3JldHVybiBhJiZhLmxlbmd0aD8obnVsbCE9aT8obj1bXSxFKFRvKGkpLChmdW5jdGlvbih0KXthW3RdJiZuLnB1c2goYVt0XSl9KSkpOm49bnVsbCE9cj95ZCgiaWQiLHIsYSk6bnVsbCE9bz95ZCgibmFtZSIsbyxhKTpCKGEsKGZ1bmN0aW9uKHQpe3JldHVybiEhdH0pKSx2ZChuLHQpKTpbXX0sZS5wcm90b3R5cGUuZmluZENvbXBvbmVudHM9ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIsbyxhPXQucXVlcnkscz10Lm1haW5UeXBlLGw9KG49cysiSW5kZXgiLGk9cysiSWQiLHI9cysiTmFtZSIsIShlPWEpfHxudWxsPT1lW25dJiZudWxsPT1lW2ldJiZudWxsPT1lW3JdP251bGw6e21haW5UeXBlOnMsaW5kZXg6ZVtuXSxpZDplW2ldLG5hbWU6ZVtyXX0pLHU9bD90aGlzLnF1ZXJ5Q29tcG9uZW50cyhsKTpCKHRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KHMpLChmdW5jdGlvbih0KXtyZXR1cm4hIXR9KSk7cmV0dXJuIG89dmQodSx0KSx0LmZpbHRlcj9CKG8sdC5maWx0ZXIpOm99LGUucHJvdG90eXBlLmVhY2hDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2NvbXBvbmVudHNNYXA7aWYoWCh0KSl7dmFyIHI9ZSxvPXQ7aS5lYWNoKChmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO3QmJm48dC5sZW5ndGg7bisrKXt2YXIgaT10W25dO2kmJm8uY2FsbChyLGUsaSxpLmNvbXBvbmVudEluZGV4KX19KSl9ZWxzZSBmb3IodmFyIGE9VSh0KT9pLmdldCh0KTpxKHQpP3RoaXMuZmluZENvbXBvbmVudHModCk6bnVsbCxzPTA7YSYmczxhLmxlbmd0aDtzKyspe3ZhciBsPWFbc107bCYmZS5jYWxsKG4sbCxsLmNvbXBvbmVudEluZGV4KX19LGUucHJvdG90eXBlLmdldFNlcmllc0J5TmFtZT1mdW5jdGlvbih0KXt2YXIgZT1Sbyh0LG51bGwpO3JldHVybiBCKHRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKSwoZnVuY3Rpb24odCl7cmV0dXJuISF0JiZudWxsIT1lJiZ0Lm5hbWU9PT1lfSkpfSxlLnByb3RvdHlwZS5nZXRTZXJpZXNCeUluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jb21wb25lbnRzTWFwLmdldCgic2VyaWVzIilbdF19LGUucHJvdG90eXBlLmdldFNlcmllc0J5VHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gQih0aGlzLl9jb21wb25lbnRzTWFwLmdldCgic2VyaWVzIiksKGZ1bmN0aW9uKGUpe3JldHVybiEhZSYmZS5zdWJUeXBlPT09dH0pKX0sZS5wcm90b3R5cGUuZ2V0U2VyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIEIodGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpLChmdW5jdGlvbih0KXtyZXR1cm4hIXR9KSl9LGUucHJvdG90eXBlLmdldFNlcmllc0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHNDb3VudC5nZXQoInNlcmllcyIpfSxlLnByb3RvdHlwZS5lYWNoU2VyaWVzPWZ1bmN0aW9uKHQsZSl7c2QodGhpcyksRSh0aGlzLl9zZXJpZXNJbmRpY2VzLChmdW5jdGlvbihuKXt2YXIgaT10aGlzLl9jb21wb25lbnRzTWFwLmdldCgic2VyaWVzIilbbl07dC5jYWxsKGUsaSxuKX0pLHRoaXMpfSxlLnByb3RvdHlwZS5lYWNoUmF3U2VyaWVzPWZ1bmN0aW9uKHQsZSl7RSh0aGlzLl9jb21wb25lbnRzTWFwLmdldCgic2VyaWVzIiksKGZ1bmN0aW9uKG4pe24mJnQuY2FsbChlLG4sbi5jb21wb25lbnRJbmRleCl9KSl9LGUucHJvdG90eXBlLmVhY2hTZXJpZXNCeVR5cGU9ZnVuY3Rpb24odCxlLG4pe3NkKHRoaXMpLEUodGhpcy5fc2VyaWVzSW5kaWNlcywoZnVuY3Rpb24oaSl7dmFyIHI9dGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpW2ldO3Iuc3ViVHlwZT09PXQmJmUuY2FsbChuLHIsaSl9KSx0aGlzKX0sZS5wcm90b3R5cGUuZWFjaFJhd1Nlcmllc0J5VHlwZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIEUodGhpcy5nZXRTZXJpZXNCeVR5cGUodCksZSxuKX0sZS5wcm90b3R5cGUuaXNTZXJpZXNGaWx0ZXJlZD1mdW5jdGlvbih0KXtyZXR1cm4gc2QodGhpcyksbnVsbD09dGhpcy5fc2VyaWVzSW5kaWNlc01hcC5nZXQodC5jb21wb25lbnRJbmRleCl9LGUucHJvdG90eXBlLmdldEN1cnJlbnRTZXJpZXNJbmRpY2VzPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX3Nlcmllc0luZGljZXN8fFtdKS5zbGljZSgpfSxlLnByb3RvdHlwZS5maWx0ZXJTZXJpZXM9ZnVuY3Rpb24odCxlKXtzZCh0aGlzKTt2YXIgbj1bXTtFKHRoaXMuX3Nlcmllc0luZGljZXMsKGZ1bmN0aW9uKGkpe3ZhciByPXRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKVtpXTt0LmNhbGwoZSxyLGkpJiZuLnB1c2goaSl9KSx0aGlzKSx0aGlzLl9zZXJpZXNJbmRpY2VzPW4sdGhpcy5fc2VyaWVzSW5kaWNlc01hcD15dChuKX0sZS5wcm90b3R5cGUucmVzdG9yZURhdGE9ZnVuY3Rpb24odCl7YWQodGhpcyk7dmFyIGU9dGhpcy5fY29tcG9uZW50c01hcCxuPVtdO2UuZWFjaCgoZnVuY3Rpb24odCxlKXt6cC5oYXNDbGFzcyhlKSYmbi5wdXNoKGUpfSkpLHpwLnRvcG9sb2dpY2FsVHJhdmVsKG4senAuZ2V0QWxsQ2xhc3NNYWluVHlwZXMoKSwoZnVuY3Rpb24obil7RShlLmdldChuKSwoZnVuY3Rpb24oZSl7IWV8fCJzZXJpZXMiPT09biYmZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgbj1lLnNlcmllc0luZGV4LGk9ZS5zZXJpZXNJZCxyPWUuc2VyaWVzTmFtZTtyZXR1cm4gbnVsbCE9biYmdC5jb21wb25lbnRJbmRleCE9PW58fG51bGwhPWkmJnQuaWQhPT1pfHxudWxsIT1yJiZ0Lm5hbWUhPT1yfX0oZSx0KXx8ZS5yZXN0b3JlRGF0YSgpfSkpfSkpfSxlLmludGVybmFsRmllbGQ9KGFkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuX3Nlcmllc0luZGljZXM9W107RSh0Ll9jb21wb25lbnRzTWFwLmdldCgic2VyaWVzIiksKGZ1bmN0aW9uKHQpe3QmJmUucHVzaCh0LmNvbXBvbmVudEluZGV4KX0pKSx0Ll9zZXJpZXNJbmRpY2VzTWFwPXl0KGUpfSxzZD1mdW5jdGlvbih0KXt9LHZvaWQobGQ9ZnVuY3Rpb24odCxlKXt0Lm9wdGlvbj17fSx0Lm9wdGlvbltmZF09MSx0Ll9jb21wb25lbnRzTWFwPXl0KHtzZXJpZXM6W119KSx0Ll9jb21wb25lbnRzQ291bnQ9eXQoKTt2YXIgbj1lLmFyaWE7cShuKSYmbnVsbD09bi5lbmFibGVkJiYobi5lbmFibGVkPSEwKSxmdW5jdGlvbih0LGUpe3ZhciBuPXQuY29sb3ImJiF0LmNvbG9yTGF5ZXI7RShlLChmdW5jdGlvbihlLGkpeyJjb2xvckxheWVyIj09PWkmJm58fHpwLmhhc0NsYXNzKGkpfHwoIm9iamVjdCI9PXR5cGVvZiBlP3RbaV09dFtpXT9DKHRbaV0sZSwhMSk6VChlKTpudWxsPT10W2ldJiYodFtpXT1lKSl9KSl9KGUsdC5fdGhlbWUub3B0aW9uKSxDKGUsRnAsITEpLHQuX21lcmdlT3B0aW9uKGUsbnVsbCl9KSksZX0oQ2MpO2Z1bmN0aW9uIHlkKHQsZSxuKXtpZihZKGUpKXt2YXIgaT15dCgpO3JldHVybiBFKGUsKGZ1bmN0aW9uKHQpe251bGwhPXQmJihudWxsIT1Sbyh0LG51bGwpJiZpLnNldCh0LCEwKSl9KSksQihuLChmdW5jdGlvbihlKXtyZXR1cm4gZSYmaS5nZXQoZVt0XSl9KSl9dmFyIHI9Um8oZSxudWxsKTtyZXR1cm4gQihuLChmdW5jdGlvbihlKXtyZXR1cm4gZSYmbnVsbCE9ciYmZVt0XT09PXJ9KSl9ZnVuY3Rpb24gdmQodCxlKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgic3ViVHlwZSIpP0IodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuc3ViVHlwZT09PWUuc3ViVHlwZX0pKTp0fWZ1bmN0aW9uIG1kKHQpe3ZhciBlPXl0KCk7cmV0dXJuIHQmJkUoVG8odC5yZXBsYWNlTWVyZ2UpLChmdW5jdGlvbih0KXtlLnNldCh0LCEwKX0pKSx7cmVwbGFjZU1lcmdlTWFpblR5cGVNYXA6ZX19UihnZCxjZCk7dmFyIHhkPVsiZ2V0RG9tIiwiZ2V0WnIiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsImdldERldmljZVBpeGVsUmF0aW8iLCJkaXNwYXRjaEFjdGlvbiIsImlzU1NSIiwiaXNEaXNwb3NlZCIsIm9uIiwib2ZmIiwiZ2V0RGF0YVVSTCIsImdldENvbm5lY3RlZERhdGFVUkwiLCJnZXRPcHRpb24iLCJnZXRJZCIsInVwZGF0ZUxhYmVsTGF5b3V0Il0sX2Q9ZnVuY3Rpb24odCl7RSh4ZCwoZnVuY3Rpb24oZSl7dGhpc1tlXT1XKHRbZV0sdCl9KSx0aGlzKX0sYmQ9e30sd2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fY29vcmRpbmF0ZVN5c3RlbXM9W119cmV0dXJuIHQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO0UoYmQsKGZ1bmN0aW9uKGkscil7dmFyIG89aS5jcmVhdGUodCxlKTtuPW4uY29uY2F0KG98fFtdKX0pKSx0aGlzLl9jb29yZGluYXRlU3lzdGVtcz1ufSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtFKHRoaXMuX2Nvb3JkaW5hdGVTeXN0ZW1zLChmdW5jdGlvbihuKXtuLnVwZGF0ZSYmbi51cGRhdGUodCxlKX0pKX0sdC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVN5c3RlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZVN5c3RlbXMuc2xpY2UoKX0sdC5yZWdpc3Rlcj1mdW5jdGlvbih0LGUpe2JkW3RdPWV9LHQuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBiZFt0XX0sdH0oKSxTZD0vXihtaW58bWF4KT8oLispJC8sTWQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3RpbWVsaW5lT3B0aW9ucz1bXSx0aGlzLl9tZWRpYUxpc3Q9W10sdGhpcy5fY3VycmVudE1lZGlhSW5kaWNlcz1bXSx0aGlzLl9hcGk9dH1yZXR1cm4gdC5wcm90b3R5cGUuc2V0T3B0aW9uPWZ1bmN0aW9uKHQsZSxuKXt0JiYoRShUbyh0LnNlcmllcyksKGZ1bmN0aW9uKHQpe3QmJnQuZGF0YSYmJCh0LmRhdGEpJiZjdCh0LmRhdGEpfSkpLEUoVG8odC5kYXRhc2V0KSwoZnVuY3Rpb24odCl7dCYmdC5zb3VyY2UmJiQodC5zb3VyY2UpJiZjdCh0LnNvdXJjZSl9KSkpLHQ9VCh0KTt2YXIgaT10aGlzLl9vcHRpb25CYWNrdXAscj1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvPVtdLGE9dC5iYXNlT3B0aW9uLHM9dC50aW1lbGluZSxsPXQub3B0aW9ucyx1PXQubWVkaWEsaD0hIXQubWVkaWEsYz0hIShsfHxzfHxhJiZhLnRpbWVsaW5lKTthPyhyPWEpLnRpbWVsaW5lfHwoci50aW1lbGluZT1zKTooKGN8fGgpJiYodC5vcHRpb25zPXQubWVkaWE9bnVsbCkscj10KTtoJiZZKHUpJiZFKHUsKGZ1bmN0aW9uKHQpe3QmJnQub3B0aW9uJiYodC5xdWVyeT9vLnB1c2godCk6aXx8KGk9dCkpfSkpO2Z1bmN0aW9uIHAodCl7RShlLChmdW5jdGlvbihlKXtlKHQsbil9KSl9cmV0dXJuIHAociksRShsLChmdW5jdGlvbih0KXtyZXR1cm4gcCh0KX0pKSxFKG8sKGZ1bmN0aW9uKHQpe3JldHVybiBwKHQub3B0aW9uKX0pKSx7YmFzZU9wdGlvbjpyLHRpbWVsaW5lT3B0aW9uczpsfHxbXSxtZWRpYURlZmF1bHQ6aSxtZWRpYUxpc3Q6b319KHQsZSwhaSk7dGhpcy5fbmV3QmFzZU9wdGlvbj1yLmJhc2VPcHRpb24saT8oci50aW1lbGluZU9wdGlvbnMubGVuZ3RoJiYoaS50aW1lbGluZU9wdGlvbnM9ci50aW1lbGluZU9wdGlvbnMpLHIubWVkaWFMaXN0Lmxlbmd0aCYmKGkubWVkaWFMaXN0PXIubWVkaWFMaXN0KSxyLm1lZGlhRGVmYXVsdCYmKGkubWVkaWFEZWZhdWx0PXIubWVkaWFEZWZhdWx0KSk6dGhpcy5fb3B0aW9uQmFja3VwPXJ9LHQucHJvdG90eXBlLm1vdW50T3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29wdGlvbkJhY2t1cDtyZXR1cm4gdGhpcy5fdGltZWxpbmVPcHRpb25zPWUudGltZWxpbmVPcHRpb25zLHRoaXMuX21lZGlhTGlzdD1lLm1lZGlhTGlzdCx0aGlzLl9tZWRpYURlZmF1bHQ9ZS5tZWRpYURlZmF1bHQsdGhpcy5fY3VycmVudE1lZGlhSW5kaWNlcz1bXSxUKHQ/ZS5iYXNlT3B0aW9uOnRoaXMuX25ld0Jhc2VPcHRpb24pfSx0LnByb3RvdHlwZS5nZXRUaW1lbGluZU9wdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMuX3RpbWVsaW5lT3B0aW9ucztpZihuLmxlbmd0aCl7dmFyIGk9dC5nZXRDb21wb25lbnQoInRpbWVsaW5lIik7aSYmKGU9VChuW2kuZ2V0Q3VycmVudEluZGV4KCldKSl9cmV0dXJuIGV9LHQucHJvdG90eXBlLmdldE1lZGlhT3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLl9hcGkuZ2V0V2lkdGgoKSxyPXRoaXMuX2FwaS5nZXRIZWlnaHQoKSxvPXRoaXMuX21lZGlhTGlzdCxhPXRoaXMuX21lZGlhRGVmYXVsdCxzPVtdLGw9W107aWYoIW8ubGVuZ3RoJiYhYSlyZXR1cm4gbDtmb3IodmFyIHU9MCxoPW8ubGVuZ3RoO3U8aDt1KyspSWQob1t1XS5xdWVyeSxpLHIpJiZzLnB1c2godSk7cmV0dXJuIXMubGVuZ3RoJiZhJiYocz1bLTFdKSxzLmxlbmd0aCYmKGU9cyxuPXRoaXMuX2N1cnJlbnRNZWRpYUluZGljZXMsZS5qb2luKCIsIikhPT1uLmpvaW4oIiwiKSkmJihsPXoocywoZnVuY3Rpb24odCl7cmV0dXJuIFQoLTE9PT10P2Eub3B0aW9uOm9bdF0ub3B0aW9uKX0pKSksdGhpcy5fY3VycmVudE1lZGlhSW5kaWNlcz1zLGx9LHR9KCk7ZnVuY3Rpb24gSWQodCxlLG4pe3ZhciBpPXt3aWR0aDplLGhlaWdodDpuLGFzcGVjdHJhdGlvOmUvbn0scj0hMDtyZXR1cm4gRSh0LChmdW5jdGlvbih0LGUpe3ZhciBuPWUubWF0Y2goU2QpO2lmKG4mJm5bMV0mJm5bMl0pe3ZhciBvPW5bMV0sYT1uWzJdLnRvTG93ZXJDYXNlKCk7KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4ibWluIj09PW4/dD49ZToibWF4Ij09PW4/dDw9ZTp0PT09ZX0pKGlbYV0sdCxvKXx8KHI9ITEpfX0pKSxyfXZhciBUZD1FLENkPXEsRGQ9WyJhcmVhU3R5bGUiLCJsaW5lU3R5bGUiLCJub2RlU3R5bGUiLCJsaW5rU3R5bGUiLCJjaG9yZFN0eWxlIiwibGFiZWwiLCJsYWJlbExpbmUiXTtmdW5jdGlvbiBBZCh0KXt2YXIgZT10JiZ0Lml0ZW1TdHlsZTtpZihlKWZvcih2YXIgbj0wLGk9RGQubGVuZ3RoO248aTtuKyspe3ZhciByPURkW25dLG89ZS5ub3JtYWwsYT1lLmVtcGhhc2lzO28mJm9bcl0mJih0W3JdPXRbcl18fHt9LHRbcl0ubm9ybWFsP0ModFtyXS5ub3JtYWwsb1tyXSk6dFtyXS5ub3JtYWw9b1tyXSxvW3JdPW51bGwpLGEmJmFbcl0mJih0W3JdPXRbcl18fHt9LHRbcl0uZW1waGFzaXM/Qyh0W3JdLmVtcGhhc2lzLGFbcl0pOnRbcl0uZW1waGFzaXM9YVtyXSxhW3JdPW51bGwpfX1mdW5jdGlvbiBrZCh0LGUsbil7aWYodCYmdFtlXSYmKHRbZV0ubm9ybWFsfHx0W2VdLmVtcGhhc2lzKSl7dmFyIGk9dFtlXS5ub3JtYWwscj10W2VdLmVtcGhhc2lzO2kmJihuPyh0W2VdLm5vcm1hbD10W2VdLmVtcGhhc2lzPW51bGwsayh0W2VdLGkpKTp0W2VdPWkpLHImJih0LmVtcGhhc2lzPXQuZW1waGFzaXN8fHt9LHQuZW1waGFzaXNbZV09cixyLmZvY3VzJiYodC5lbXBoYXNpcy5mb2N1cz1yLmZvY3VzKSxyLmJsdXJTY29wZSYmKHQuZW1waGFzaXMuYmx1clNjb3BlPXIuYmx1clNjb3BlKSl9fWZ1bmN0aW9uIExkKHQpe2tkKHQsIml0ZW1TdHlsZSIpLGtkKHQsImxpbmVTdHlsZSIpLGtkKHQsImFyZWFTdHlsZSIpLGtkKHQsImxhYmVsIiksa2QodCwibGFiZWxMaW5lIiksa2QodCwidXBwZXJMYWJlbCIpLGtkKHQsImVkZ2VMYWJlbCIpfWZ1bmN0aW9uIFBkKHQsZSl7dmFyIG49Q2QodCkmJnRbZV0saT1DZChuKSYmbi50ZXh0U3R5bGU7aWYoaSl7MDtmb3IodmFyIHI9MCxvPURvLmxlbmd0aDtyPG87cisrKXt2YXIgYT1Eb1tyXTtpLmhhc093blByb3BlcnR5KGEpJiYoblthXT1pW2FdKX19fWZ1bmN0aW9uIE9kKHQpe3QmJihMZCh0KSxQZCh0LCJsYWJlbCIpLHQuZW1waGFzaXMmJlBkKHQuZW1waGFzaXMsImxhYmVsIikpfWZ1bmN0aW9uIFJkKHQpe3JldHVybiBZKHQpP3Q6dD9bdF06W119ZnVuY3Rpb24gTmQodCl7cmV0dXJuKFkodCk/dFswXTp0KXx8e319ZnVuY3Rpb24gRWQodCxlKXtUZChSZCh0LnNlcmllcyksKGZ1bmN0aW9uKHQpe0NkKHQpJiZmdW5jdGlvbih0KXtpZihDZCh0KSl7QWQodCksTGQodCksUGQodCwibGFiZWwiKSxQZCh0LCJ1cHBlckxhYmVsIiksUGQodCwiZWRnZUxhYmVsIiksdC5lbXBoYXNpcyYmKFBkKHQuZW1waGFzaXMsImxhYmVsIiksUGQodC5lbXBoYXNpcywidXBwZXJMYWJlbCIpLFBkKHQuZW1waGFzaXMsImVkZ2VMYWJlbCIpKTt2YXIgZT10Lm1hcmtQb2ludDtlJiYoQWQoZSksT2QoZSkpO3ZhciBuPXQubWFya0xpbmU7biYmKEFkKG4pLE9kKG4pKTt2YXIgaT10Lm1hcmtBcmVhO2kmJk9kKGkpO3ZhciByPXQuZGF0YTtpZigiZ3JhcGgiPT09dC50eXBlKXtyPXJ8fHQubm9kZXM7dmFyIG89dC5saW5rc3x8dC5lZGdlcztpZihvJiYhJChvKSlmb3IodmFyIGE9MDthPG8ubGVuZ3RoO2ErKylPZChvW2FdKTtFKHQuY2F0ZWdvcmllcywoZnVuY3Rpb24odCl7TGQodCl9KSl9aWYociYmISQocikpZm9yKGE9MDthPHIubGVuZ3RoO2ErKylPZChyW2FdKTtpZigoZT10Lm1hcmtQb2ludCkmJmUuZGF0YSl7dmFyIHM9ZS5kYXRhO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspT2Qoc1thXSl9aWYoKG49dC5tYXJrTGluZSkmJm4uZGF0YSl7dmFyIGw9bi5kYXRhO2ZvcihhPTA7YTxsLmxlbmd0aDthKyspWShsW2FdKT8oT2QobFthXVswXSksT2QobFthXVsxXSkpOk9kKGxbYV0pfSJnYXVnZSI9PT10LnR5cGU/KFBkKHQsImF4aXNMYWJlbCIpLFBkKHQsInRpdGxlIiksUGQodCwiZGV0YWlsIikpOiJ0cmVlbWFwIj09PXQudHlwZT8oa2QodC5icmVhZGNydW1iLCJpdGVtU3R5bGUiKSxFKHQubGV2ZWxzLChmdW5jdGlvbih0KXtMZCh0KX0pKSk6InRyZWUiPT09dC50eXBlJiZMZCh0LmxlYXZlcyl9fSh0KX0pKTt2YXIgbj1bInhBeGlzIiwieUF4aXMiLCJyYWRpdXNBeGlzIiwiYW5nbGVBeGlzIiwic2luZ2xlQXhpcyIsInBhcmFsbGVsQXhpcyIsInJhZGFyIl07ZSYmbi5wdXNoKCJ2YWx1ZUF4aXMiLCJjYXRlZ29yeUF4aXMiLCJsb2dBeGlzIiwidGltZUF4aXMiKSxUZChuLChmdW5jdGlvbihlKXtUZChSZCh0W2VdKSwoZnVuY3Rpb24odCl7dCYmKFBkKHQsImF4aXNMYWJlbCIpLFBkKHQuYXhpc1BvaW50ZXIsImxhYmVsIikpfSkpfSkpLFRkKFJkKHQucGFyYWxsZWwpLChmdW5jdGlvbih0KXt2YXIgZT10JiZ0LnBhcmFsbGVsQXhpc0RlZmF1bHQ7UGQoZSwiYXhpc0xhYmVsIiksUGQoZSYmZS5heGlzUG9pbnRlciwibGFiZWwiKX0pKSxUZChSZCh0LmNhbGVuZGFyKSwoZnVuY3Rpb24odCl7a2QodCwiaXRlbVN0eWxlIiksUGQodCwiZGF5TGFiZWwiKSxQZCh0LCJtb250aExhYmVsIiksUGQodCwieWVhckxhYmVsIil9KSksVGQoUmQodC5yYWRhciksKGZ1bmN0aW9uKHQpe1BkKHQsIm5hbWUiKSx0Lm5hbWUmJm51bGw9PXQuYXhpc05hbWUmJih0LmF4aXNOYW1lPXQubmFtZSxkZWxldGUgdC5uYW1lKSxudWxsIT10Lm5hbWVHYXAmJm51bGw9PXQuYXhpc05hbWVHYXAmJih0LmF4aXNOYW1lR2FwPXQubmFtZUdhcCxkZWxldGUgdC5uYW1lR2FwKX0pKSxUZChSZCh0LmdlbyksKGZ1bmN0aW9uKHQpe0NkKHQpJiYoT2QodCksVGQoUmQodC5yZWdpb25zKSwoZnVuY3Rpb24odCl7T2QodCl9KSkpfSkpLFRkKFJkKHQudGltZWxpbmUpLChmdW5jdGlvbih0KXtPZCh0KSxrZCh0LCJsYWJlbCIpLGtkKHQsIml0ZW1TdHlsZSIpLGtkKHQsImNvbnRyb2xTdHlsZSIsITApO3ZhciBlPXQuZGF0YTtZKGUpJiZFKGUsKGZ1bmN0aW9uKHQpe3EodCkmJihrZCh0LCJsYWJlbCIpLGtkKHQsIml0ZW1TdHlsZSIpKX0pKX0pKSxUZChSZCh0LnRvb2xib3gpLChmdW5jdGlvbih0KXtrZCh0LCJpY29uU3R5bGUiKSxUZCh0LmZlYXR1cmUsKGZ1bmN0aW9uKHQpe2tkKHQsImljb25TdHlsZSIpfSkpfSkpLFBkKE5kKHQuYXhpc1BvaW50ZXIpLCJsYWJlbCIpLFBkKE5kKHQudG9vbHRpcCkuYXhpc1BvaW50ZXIsImxhYmVsIil9ZnVuY3Rpb24gemQodCl7dCYmRShWZCwoZnVuY3Rpb24oZSl7ZVswXWluIHQmJiEoZVsxXWluIHQpJiYodFtlWzFdXT10W2VbMF1dKX0pKX12YXIgVmQ9W1sieCIsImxlZnQiXSxbInkiLCJ0b3AiXSxbIngyIiwicmlnaHQiXSxbInkyIiwiYm90dG9tIl1dLEJkPVsiZ3JpZCIsImdlbyIsInBhcmFsbGVsIiwibGVnZW5kIiwidG9vbGJveCIsInRpdGxlIiwidmlzdWFsTWFwIiwiZGF0YVpvb20iLCJ0aW1lbGluZSJdLEZkPVtbImJvcmRlclJhZGl1cyIsImJhckJvcmRlclJhZGl1cyJdLFsiYm9yZGVyQ29sb3IiLCJiYXJCb3JkZXJDb2xvciJdLFsiYm9yZGVyV2lkdGgiLCJiYXJCb3JkZXJXaWR0aCJdXTtmdW5jdGlvbiBHZCh0KXt2YXIgZT10JiZ0Lml0ZW1TdHlsZTtpZihlKWZvcih2YXIgbj0wO248RmQubGVuZ3RoO24rKyl7dmFyIGk9RmRbbl1bMV0scj1GZFtuXVswXTtudWxsIT1lW2ldJiYoZVtyXT1lW2ldKX19ZnVuY3Rpb24gV2QodCl7dCYmImVkZ2UiPT09dC5hbGlnblRvJiZudWxsIT10Lm1hcmdpbiYmbnVsbD09dC5lZGdlRGlzdGFuY2UmJih0LmVkZ2VEaXN0YW5jZT10Lm1hcmdpbil9ZnVuY3Rpb24gSGQodCl7dCYmdC5kb3ducGxheSYmIXQuYmx1ciYmKHQuYmx1cj10LmRvd25wbGF5KX1mdW5jdGlvbiBZZCh0LGUpe2lmKHQpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZSh0W25dKSx0W25dJiZZZCh0W25dLmNoaWxkcmVuLGUpfWZ1bmN0aW9uIFhkKHQsZSl7RWQodCxlKSx0LnNlcmllcz1Ubyh0LnNlcmllcyksRSh0LnNlcmllcywoZnVuY3Rpb24odCl7aWYocSh0KSl7dmFyIGU9dC50eXBlO2lmKCJsaW5lIj09PWUpbnVsbCE9dC5jbGlwT3ZlcmZsb3cmJih0LmNsaXA9dC5jbGlwT3ZlcmZsb3cpO2Vsc2UgaWYoInBpZSI9PT1lfHwiZ2F1Z2UiPT09ZSl7aWYobnVsbCE9dC5jbG9ja1dpc2UmJih0LmNsb2Nrd2lzZT10LmNsb2NrV2lzZSksV2QodC5sYWJlbCksKHI9dC5kYXRhKSYmISQocikpZm9yKHZhciBuPTA7bjxyLmxlbmd0aDtuKyspV2QocltuXSk7bnVsbCE9dC5ob3Zlck9mZnNldCYmKHQuZW1waGFzaXM9dC5lbXBoYXNpc3x8e30sKHQuZW1waGFzaXMuc2NhbGVTaXplPW51bGwpJiYodC5lbXBoYXNpcy5zY2FsZVNpemU9dC5ob3Zlck9mZnNldCkpfWVsc2UgaWYoImdhdWdlIj09PWUpe3ZhciBpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuc3BsaXQoIiwiKSxpPXQscj0wO3I8bi5sZW5ndGgmJm51bGwhPShpPWkmJmlbbltyXV0pO3IrKyk7cmV0dXJuIGl9KHQsInBvaW50ZXIuY29sb3IiKTtudWxsIT1pJiZmdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHIsbz1lLnNwbGl0KCIsIiksYT10LHM9MDtzPG8ubGVuZ3RoLTE7cysrKW51bGw9PWFbcj1vW3NdXSYmKGFbcl09e30pLGE9YVtyXTsoaXx8bnVsbD09YVtvW3NdXSkmJihhW29bc11dPW4pfSh0LCJpdGVtU3R5bGUuY29sb3IiLGkpfWVsc2UgaWYoImJhciI9PT1lKXt2YXIgcjtpZihHZCh0KSxHZCh0LmJhY2tncm91bmRTdHlsZSksR2QodC5lbXBoYXNpcyksKHI9dC5kYXRhKSYmISQocikpZm9yKG49MDtuPHIubGVuZ3RoO24rKykib2JqZWN0Ij09dHlwZW9mIHJbbl0mJihHZChyW25dKSxHZChyW25dJiZyW25dLmVtcGhhc2lzKSl9ZWxzZSBpZigic3VuYnVyc3QiPT09ZSl7dmFyIG89dC5oaWdobGlnaHRQb2xpY3k7byYmKHQuZW1waGFzaXM9dC5lbXBoYXNpc3x8e30sdC5lbXBoYXNpcy5mb2N1c3x8KHQuZW1waGFzaXMuZm9jdXM9bykpLEhkKHQpLFlkKHQuZGF0YSxIZCl9ZWxzZSJncmFwaCI9PT1lfHwic2Fua2V5Ij09PWU/ZnVuY3Rpb24odCl7dCYmbnVsbCE9dC5mb2N1c05vZGVBZGphY2VuY3kmJih0LmVtcGhhc2lzPXQuZW1waGFzaXN8fHt9LG51bGw9PXQuZW1waGFzaXMuZm9jdXMmJih0LmVtcGhhc2lzLmZvY3VzPSJhZGphY2VuY3kiKSl9KHQpOiJtYXAiPT09ZSYmKHQubWFwVHlwZSYmIXQubWFwJiYodC5tYXA9dC5tYXBUeXBlKSx0Lm1hcExvY2F0aW9uJiZrKHQsdC5tYXBMb2NhdGlvbikpO251bGwhPXQuaG92ZXJBbmltYXRpb24mJih0LmVtcGhhc2lzPXQuZW1waGFzaXN8fHt9LHQuZW1waGFzaXMmJm51bGw9PXQuZW1waGFzaXMuc2NhbGUmJih0LmVtcGhhc2lzLnNjYWxlPXQuaG92ZXJBbmltYXRpb24pKSx6ZCh0KX19KSksdC5kYXRhUmFuZ2UmJih0LnZpc3VhbE1hcD10LmRhdGFSYW5nZSksRShCZCwoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtuJiYoWShuKXx8KG49W25dKSxFKG4sKGZ1bmN0aW9uKHQpe3pkKHQpfSkpKX0pKX1mdW5jdGlvbiBVZCh0KXtFKHQsKGZ1bmN0aW9uKGUsbil7dmFyIGk9W10scj1bTmFOLE5hTl0sbz1bZS5zdGFja1Jlc3VsdERpbWVuc2lvbixlLnN0YWNrZWRPdmVyRGltZW5zaW9uXSxhPWUuZGF0YSxzPWUuaXNTdGFja2VkQnlJbmRleCxsPWUuc2VyaWVzTW9kZWwuZ2V0KCJzdGFja1N0cmF0ZWd5Iil8fCJzYW1lc2lnbiI7YS5tb2RpZnkobywoZnVuY3Rpb24obyx1LGgpe3ZhciBjLHAsZD1hLmdldChlLnN0YWNrZWREaW1lbnNpb24saCk7aWYoaXNOYU4oZCkpcmV0dXJuIHI7cz9wPWEuZ2V0UmF3SW5kZXgoaCk6Yz1hLmdldChlLnN0YWNrZWRCeURpbWVuc2lvbixoKTtmb3IodmFyIGY9TmFOLGc9bi0xO2c+PTA7Zy0tKXt2YXIgeT10W2ddO2lmKHN8fChwPXkuZGF0YS5yYXdJbmRleE9mKHkuc3RhY2tlZEJ5RGltZW5zaW9uLGMpKSxwPj0wKXt2YXIgdj15LmRhdGEuZ2V0QnlSYXdJbmRleCh5LnN0YWNrUmVzdWx0RGltZW5zaW9uLHApO2lmKCJhbGwiPT09bHx8InBvc2l0aXZlIj09PWwmJnY+MHx8Im5lZ2F0aXZlIj09PWwmJnY8MHx8InNhbWVzaWduIj09PWwmJmQ+PTAmJnY+MHx8InNhbWVzaWduIj09PWwmJmQ8PTAmJnY8MCl7ZD1ybyhkLHYpLGY9djticmVha319fXJldHVybiBpWzBdPWQsaVsxXT1mLGl9KSl9KSl9dmFyIFpkLGpkLHFkLEtkLCRkLEpkPWZ1bmN0aW9uKHQpe3RoaXMuZGF0YT10LmRhdGF8fCh0LnNvdXJjZUZvcm1hdD09PVhwP3t9OltdKSx0aGlzLnNvdXJjZUZvcm1hdD10LnNvdXJjZUZvcm1hdHx8WnAsdGhpcy5zZXJpZXNMYXlvdXRCeT10LnNlcmllc0xheW91dEJ5fHxqcCx0aGlzLnN0YXJ0SW5kZXg9dC5zdGFydEluZGV4fHwwLHRoaXMuZGltZW5zaW9uc0RldGVjdGVkQ291bnQ9dC5kaW1lbnNpb25zRGV0ZWN0ZWRDb3VudCx0aGlzLm1ldGFSYXdPcHRpb249dC5tZXRhUmF3T3B0aW9uO3ZhciBlPXRoaXMuZGltZW5zaW9uc0RlZmluZT10LmRpbWVuc2lvbnNEZWZpbmU7aWYoZSlmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9ZVtuXTtudWxsPT1pLnR5cGUmJmlkKHRoaXMsbik9PT1LcCYmKGkudHlwZT0ib3JkaW5hbCIpfX07ZnVuY3Rpb24gUWQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBKZH1mdW5jdGlvbiB0Zih0LGUsbil7bj1ufHxuZih0KTt2YXIgaT1lLnNlcmllc0xheW91dEJ5LHI9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbyxhO2lmKCF0KXJldHVybntkaW1lbnNpb25zRGVmaW5lOnJmKHIpLHN0YXJ0SW5kZXg6YSxkaW1lbnNpb25zRGV0ZWN0ZWRDb3VudDpvfTtpZihlPT09SHApe3ZhciBzPXQ7ImF1dG8iPT09aXx8bnVsbD09aT9vZigoZnVuY3Rpb24odCl7bnVsbCE9dCYmIi0iIT09dCYmKFUodCk/bnVsbD09YSYmKGE9MSk6YT0wKX0pLG4scywxMCk6YT1qKGkpP2k6aT8xOjAscnx8MSE9PWF8fChyPVtdLG9mKChmdW5jdGlvbih0LGUpe3JbZV09bnVsbCE9dD90KyIiOiIifSksbixzLDEvMCkpLG89cj9yLmxlbmd0aDpuPT09cXA/cy5sZW5ndGg6c1swXT9zWzBdLmxlbmd0aDpudWxsfWVsc2UgaWYoZT09PVlwKXJ8fChyPWZ1bmN0aW9uKHQpe3ZhciBlLG49MDtmb3IoO248dC5sZW5ndGgmJiEoZT10W24rK10pOyk7aWYoZSlyZXR1cm4gRyhlKX0odCkpO2Vsc2UgaWYoZT09PVhwKXJ8fChyPVtdLEUodCwoZnVuY3Rpb24odCxlKXtyLnB1c2goZSl9KSkpO2Vsc2UgaWYoZT09PVdwKXt2YXIgbD1Bbyh0WzBdKTtvPVkobCkmJmwubGVuZ3RofHwxfXJldHVybntzdGFydEluZGV4OmEsZGltZW5zaW9uc0RlZmluZTpyZihyKSxkaW1lbnNpb25zRGV0ZWN0ZWRDb3VudDpvfX0odCxuLGksZS5zb3VyY2VIZWFkZXIsZS5kaW1lbnNpb25zKTtyZXR1cm4gbmV3IEpkKHtkYXRhOnQsc291cmNlRm9ybWF0Om4sc2VyaWVzTGF5b3V0Qnk6aSxkaW1lbnNpb25zRGVmaW5lOnIuZGltZW5zaW9uc0RlZmluZSxzdGFydEluZGV4OnIuc3RhcnRJbmRleCxkaW1lbnNpb25zRGV0ZWN0ZWRDb3VudDpyLmRpbWVuc2lvbnNEZXRlY3RlZENvdW50LG1ldGFSYXdPcHRpb246VChlKX0pfWZ1bmN0aW9uIGVmKHQpe3JldHVybiBuZXcgSmQoe2RhdGE6dCxzb3VyY2VGb3JtYXQ6JCh0KT9VcDpXcH0pfWZ1bmN0aW9uIG5mKHQpe3ZhciBlPVpwO2lmKCQodCkpZT1VcDtlbHNlIGlmKFkodCkpezA9PT10Lmxlbmd0aCYmKGU9SHApO2Zvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7dmFyIHI9dFtuXTtpZihudWxsIT1yKXtpZihZKHIpfHwkKHIpKXtlPUhwO2JyZWFrfWlmKHEocikpe2U9WXA7YnJlYWt9fX19ZWxzZSBpZihxKHQpKWZvcih2YXIgbyBpbiB0KWlmKF90KHQsbykmJk4odFtvXSkpe2U9WHA7YnJlYWt9cmV0dXJuIGV9ZnVuY3Rpb24gcmYodCl7aWYodCl7dmFyIGU9eXQoKTtyZXR1cm4geih0LChmdW5jdGlvbih0LG4pe3ZhciBpPXtuYW1lOih0PXEodCk/dDp7bmFtZTp0fSkubmFtZSxkaXNwbGF5TmFtZTp0LmRpc3BsYXlOYW1lLHR5cGU6dC50eXBlfTtpZihudWxsPT1pLm5hbWUpcmV0dXJuIGk7aS5uYW1lKz0iIixudWxsPT1pLmRpc3BsYXlOYW1lJiYoaS5kaXNwbGF5TmFtZT1pLm5hbWUpO3ZhciByPWUuZ2V0KGkubmFtZSk7cmV0dXJuIHI/aS5uYW1lKz0iLSIrci5jb3VudCsrOmUuc2V0KGkubmFtZSx7Y291bnQ6MX0pLGl9KSl9fWZ1bmN0aW9uIG9mKHQsZSxuLGkpe2lmKGU9PT1xcClmb3IodmFyIHI9MDtyPG4ubGVuZ3RoJiZyPGk7cisrKXQobltyXT9uW3JdWzBdOm51bGwscik7ZWxzZXt2YXIgbz1uWzBdfHxbXTtmb3Iocj0wO3I8by5sZW5ndGgmJnI8aTtyKyspdChvW3JdLHIpfX1mdW5jdGlvbiBhZih0KXt2YXIgZT10LnNvdXJjZUZvcm1hdDtyZXR1cm4gZT09PVlwfHxlPT09WHB9dmFyIHNmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBuPVFkKHQpP3Q6ZWYodCk7dGhpcy5fc291cmNlPW47dmFyIGk9dGhpcy5fZGF0YT1uLmRhdGE7bi5zb3VyY2VGb3JtYXQ9PT1VcCYmKHRoaXMuX29mZnNldD0wLHRoaXMuX2RpbVNpemU9ZSx0aGlzLl9kYXRhPWkpLCRkKHRoaXMsaSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0U291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXJjZX0sdC5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdC5wcm90b3R5cGUuZ2V0SXRlbT1mdW5jdGlvbih0LGUpe30sdC5wcm90b3R5cGUuYXBwZW5kRGF0YT1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7fSx0LnByb3RvSW5pdGlhbGl6ZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlO2UucHVyZT0hMSxlLnBlcnNpc3RlbnQ9ITB9KCksdC5pbnRlcm5hbEZpZWxkPWZ1bmN0aW9uKCl7dmFyIHQ7JGQ9ZnVuY3Rpb24odCxyLG8pe3ZhciBhPW8uc291cmNlRm9ybWF0LHM9by5zZXJpZXNMYXlvdXRCeSxsPW8uc3RhcnRJbmRleCx1PW8uZGltZW5zaW9uc0RlZmluZSxoPUtkW3ZmKGEscyldO2lmKEEodCxoKSxhPT09VXApdC5nZXRJdGVtPWUsdC5jb3VudD1pLHQuZmlsbFN0b3JhZ2U9bjtlbHNle3ZhciBjPWhmKGEscyk7dC5nZXRJdGVtPVcoYyxudWxsLHIsbCx1KTt2YXIgcD1kZihhLHMpO3QuY291bnQ9VyhwLG51bGwscixsLHUpfX07dmFyIGU9ZnVuY3Rpb24odCxlKXt0LT10aGlzLl9vZmZzZXQsZT1lfHxbXTtmb3IodmFyIG49dGhpcy5fZGF0YSxpPXRoaXMuX2RpbVNpemUscj1pKnQsbz0wO288aTtvKyspZVtvXT1uW3Irb107cmV0dXJuIGV9LG49ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPXRoaXMuX2RhdGEsbz10aGlzLl9kaW1TaXplLGE9MDthPG87YSsrKXtmb3IodmFyIHM9aVthXSxsPW51bGw9PXNbMF0/MS8wOnNbMF0sdT1udWxsPT1zWzFdPy0xLzA6c1sxXSxoPWUtdCxjPW5bYV0scD0wO3A8aDtwKyspe3ZhciBkPXJbcCpvK2FdO2NbdCtwXT1kLGQ8bCYmKGw9ZCksZD51JiYodT1kKX1zWzBdPWwsc1sxXT11fX0saT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhP3RoaXMuX2RhdGEubGVuZ3RoL3RoaXMuX2RpbVNpemU6MH07ZnVuY3Rpb24gcih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLl9kYXRhLnB1c2godFtlXSl9KHQ9e30pW0hwKyJfIitqcF09e3B1cmU6ITAsYXBwZW5kRGF0YTpyfSx0W0hwKyJfIitxcF09e3B1cmU6ITAsYXBwZW5kRGF0YTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcignRG8gbm90IHN1cHBvcnQgYXBwZW5kRGF0YSB3aGVuIHNldCBzZXJpZXNMYXlvdXRCeTogInJvdyIuJyl9fSx0W1lwXT17cHVyZTohMCxhcHBlbmREYXRhOnJ9LHRbWHBdPXtwdXJlOiEwLGFwcGVuZERhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZGF0YTtFKHQsKGZ1bmN0aW9uKHQsbil7Zm9yKHZhciBpPWVbbl18fChlW25dPVtdKSxyPTA7cjwodHx8W10pLmxlbmd0aDtyKyspaS5wdXNoKHRbcl0pfSkpfX0sdFtXcF09e2FwcGVuZERhdGE6cn0sdFtVcF09e3BlcnNpc3RlbnQ6ITEscHVyZTohMCxhcHBlbmREYXRhOmZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sY2xlYW46ZnVuY3Rpb24oKXt0aGlzLl9vZmZzZXQrPXRoaXMuY291bnQoKSx0aGlzLl9kYXRhPW51bGx9fSxLZD10fSgpLHR9KCksbGY9ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIHRbaV19LHVmPSgoWmQ9e30pW0hwKyJfIitqcF09ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIHRbaStlXX0sWmRbSHArIl8iK3FwXT1mdW5jdGlvbih0LGUsbixpLHIpe2krPWU7Zm9yKHZhciBvPXJ8fFtdLGE9dCxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBsPWFbc107b1tzXT1sP2xbaV06bnVsbH1yZXR1cm4gb30sWmRbWXBdPWxmLFpkW1hwXT1mdW5jdGlvbih0LGUsbixpLHIpe2Zvcih2YXIgbz1yfHxbXSxhPTA7YTxuLmxlbmd0aDthKyspe3ZhciBzPW5bYV0ubmFtZTswO3ZhciBsPXRbc107b1thXT1sP2xbaV06bnVsbH1yZXR1cm4gb30sWmRbV3BdPWxmLFpkKTtmdW5jdGlvbiBoZih0LGUpe3ZhciBuPXVmW3ZmKHQsZSldO3JldHVybiBufXZhciBjZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQubGVuZ3RofSxwZj0oKGpkPXt9KVtIcCsiXyIranBdPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5tYXgoMCx0Lmxlbmd0aC1lKX0samRbSHArIl8iK3FwXT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dFswXTtyZXR1cm4gaT9NYXRoLm1heCgwLGkubGVuZ3RoLWUpOjB9LGpkW1lwXT1jZixqZFtYcF09ZnVuY3Rpb24odCxlLG4pe3ZhciBpPW5bMF0ubmFtZTt2YXIgcj10W2ldO3JldHVybiByP3IubGVuZ3RoOjB9LGpkW1dwXT1jZixqZCk7ZnVuY3Rpb24gZGYodCxlKXt2YXIgbj1wZlt2Zih0LGUpXTtyZXR1cm4gbn12YXIgZmY9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0W2VdfSxnZj0oKHFkPXt9KVtIcF09ZmYscWRbWXBdPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtuXX0scWRbWHBdPWZmLHFkW1dwXT1mdW5jdGlvbih0LGUsbil7dmFyIGk9QW8odCk7cmV0dXJuIGkgaW5zdGFuY2VvZiBBcnJheT9pW2VdOml9LHFkW1VwXT1mZixxZCk7ZnVuY3Rpb24geWYodCl7dmFyIGU9Z2ZbdF07cmV0dXJuIGV9ZnVuY3Rpb24gdmYodCxlKXtyZXR1cm4gdD09PUhwP3QrIl8iK2U6dH1mdW5jdGlvbiBtZih0LGUsbil7aWYodCl7dmFyIGk9dC5nZXRSYXdEYXRhSXRlbShlKTtpZihudWxsIT1pKXt2YXIgcj10LmdldFN0b3JlKCksbz1yLmdldFNvdXJjZSgpLnNvdXJjZUZvcm1hdDtpZihudWxsIT1uKXt2YXIgYT10LmdldERpbWVuc2lvbkluZGV4KG4pLHM9ci5nZXREaW1lbnNpb25Qcm9wZXJ0eShhKTtyZXR1cm4geWYobykoaSxhLHMpfXZhciBsPWk7cmV0dXJuIG89PT1XcCYmKGw9QW8oaSkpLGx9fX12YXIgeGY9L1x7QCguKz8pXH0vZyxfZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmdldERhdGFQYXJhbXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldERhdGEoZSksaT10aGlzLmdldFJhd1ZhbHVlKHQsZSkscj1uLmdldFJhd0luZGV4KHQpLG89bi5nZXROYW1lKHQpLGE9bi5nZXRSYXdEYXRhSXRlbSh0KSxzPW4uZ2V0SXRlbVZpc3VhbCh0LCJzdHlsZSIpLGw9cyYmc1tuLmdldEl0ZW1WaXN1YWwodCwiZHJhd1R5cGUiKXx8ImZpbGwiXSx1PXMmJnMuc3Ryb2tlLGg9dGhpcy5tYWluVHlwZSxjPSJzZXJpZXMiPT09aCxwPW4udXNlck91dHB1dCYmbi51c2VyT3V0cHV0LmdldCgpO3JldHVybntjb21wb25lbnRUeXBlOmgsY29tcG9uZW50U3ViVHlwZTp0aGlzLnN1YlR5cGUsY29tcG9uZW50SW5kZXg6dGhpcy5jb21wb25lbnRJbmRleCxzZXJpZXNUeXBlOmM/dGhpcy5zdWJUeXBlOm51bGwsc2VyaWVzSW5kZXg6dGhpcy5zZXJpZXNJbmRleCxzZXJpZXNJZDpjP3RoaXMuaWQ6bnVsbCxzZXJpZXNOYW1lOmM/dGhpcy5uYW1lOm51bGwsbmFtZTpvLGRhdGFJbmRleDpyLGRhdGE6YSxkYXRhVHlwZTplLHZhbHVlOmksY29sb3I6bCxib3JkZXJDb2xvcjp1LGRpbWVuc2lvbk5hbWVzOnA/cC5mdWxsRGltZW5zaW9uczpudWxsLGVuY29kZTpwP3AuZW5jb2RlOm51bGwsJHZhcnM6WyJzZXJpZXNOYW1lIiwibmFtZSIsInZhbHVlIl19fSx0LnByb3RvdHlwZS5nZXRGb3JtYXR0ZWRMYWJlbD1mdW5jdGlvbih0LGUsbixpLHIsbyl7ZT1lfHwibm9ybWFsIjt2YXIgYT10aGlzLmdldERhdGEobikscz10aGlzLmdldERhdGFQYXJhbXModCxuKTsobyYmKHMudmFsdWU9by5pbnRlcnBvbGF0ZWRWYWx1ZSksbnVsbCE9aSYmWShzLnZhbHVlKSYmKHMudmFsdWU9cy52YWx1ZVtpXSkscil8fChyPWEuZ2V0SXRlbU1vZGVsKHQpLmdldCgibm9ybWFsIj09PWU/WyJsYWJlbCIsImZvcm1hdHRlciJdOltlLCJsYWJlbCIsImZvcm1hdHRlciJdKSk7cmV0dXJuIFgocik/KHMuc3RhdHVzPWUscy5kaW1lbnNpb25JbmRleD1pLHIocykpOlUocik/YnAocixzKS5yZXBsYWNlKHhmLChmdW5jdGlvbihlLG4pe3ZhciBpPW4ubGVuZ3RoLHI9bjsiWyI9PT1yLmNoYXJBdCgwKSYmIl0iPT09ci5jaGFyQXQoaS0xKSYmKHI9K3Iuc2xpY2UoMSxpLTEpKTt2YXIgcz1tZihhLHQscik7aWYobyYmWShvLmludGVycG9sYXRlZFZhbHVlKSl7dmFyIGw9YS5nZXREaW1lbnNpb25JbmRleChyKTtsPj0wJiYocz1vLmludGVycG9sYXRlZFZhbHVlW2xdKX1yZXR1cm4gbnVsbCE9cz9zKyIiOiIifSkpOnZvaWQgMH0sdC5wcm90b3R5cGUuZ2V0UmF3VmFsdWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbWYodGhpcy5nZXREYXRhKGUpLHQpfSx0LnByb3RvdHlwZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQsZSxuKXt9LHR9KCk7ZnVuY3Rpb24gYmYodCl7dmFyIGUsbjtyZXR1cm4gcSh0KT90LnR5cGUmJihuPXQpOmU9dCx7dGV4dDplLGZyYWc6bn19ZnVuY3Rpb24gd2YodCl7cmV0dXJuIG5ldyBTZih0KX12YXIgU2Y9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3Q9dHx8e30sdGhpcy5fcmVzZXQ9dC5yZXNldCx0aGlzLl9wbGFuPXQucGxhbix0aGlzLl9jb3VudD10LmNvdW50LHRoaXMuX29uRGlydHk9dC5vbkRpcnR5LHRoaXMuX2RpcnR5PSEwfXJldHVybiB0LnByb3RvdHlwZS5wZXJmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5fdXBzdHJlYW0saT10JiZ0LnNraXA7aWYodGhpcy5fZGlydHkmJm4pe3ZhciByPXRoaXMuY29udGV4dDtyLmRhdGE9ci5vdXRwdXREYXRhPW4uY29udGV4dC5vdXRwdXREYXRhfXRoaXMuX19waXBlbGluZSYmKHRoaXMuX19waXBlbGluZS5jdXJyZW50VGFzaz10aGlzKSx0aGlzLl9wbGFuJiYhaSYmKGU9dGhpcy5fcGxhbih0aGlzLmNvbnRleHQpKTt2YXIgbyxhPWgodGhpcy5fbW9kQnkpLHM9dGhpcy5fbW9kRGF0YUNvdW50fHwwLGw9aCh0JiZ0Lm1vZEJ5KSx1PXQmJnQubW9kRGF0YUNvdW50fHwwO2Z1bmN0aW9uIGgodCl7cmV0dXJuISh0Pj0xKSYmKHQ9MSksdH1hPT09bCYmcz09PXV8fChlPSJyZXNldCIpLCh0aGlzLl9kaXJ0eXx8InJlc2V0Ij09PWUpJiYodGhpcy5fZGlydHk9ITEsbz10aGlzLl9kb1Jlc2V0KGkpKSx0aGlzLl9tb2RCeT1sLHRoaXMuX21vZERhdGFDb3VudD11O3ZhciBjPXQmJnQuc3RlcDtpZih0aGlzLl9kdWVFbmQ9bj9uLl9vdXRwdXREdWVFbmQ6dGhpcy5fY291bnQ/dGhpcy5fY291bnQodGhpcy5jb250ZXh0KToxLzAsdGhpcy5fcHJvZ3Jlc3Mpe3ZhciBwPXRoaXMuX2R1ZUluZGV4LGQ9TWF0aC5taW4obnVsbCE9Yz90aGlzLl9kdWVJbmRleCtjOjEvMCx0aGlzLl9kdWVFbmQpO2lmKCFpJiYob3x8cDxkKSl7dmFyIGY9dGhpcy5fcHJvZ3Jlc3M7aWYoWShmKSlmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0aGlzLl9kb1Byb2dyZXNzKGZbZ10scCxkLGwsdSk7ZWxzZSB0aGlzLl9kb1Byb2dyZXNzKGYscCxkLGwsdSl9dGhpcy5fZHVlSW5kZXg9ZDt2YXIgeT1udWxsIT10aGlzLl9zZXR0ZWRPdXRwdXRFbmQ/dGhpcy5fc2V0dGVkT3V0cHV0RW5kOmQ7MCx0aGlzLl9vdXRwdXREdWVFbmQ9eX1lbHNlIHRoaXMuX2R1ZUluZGV4PXRoaXMuX291dHB1dER1ZUVuZD1udWxsIT10aGlzLl9zZXR0ZWRPdXRwdXRFbmQ/dGhpcy5fc2V0dGVkT3V0cHV0RW5kOnRoaXMuX2R1ZUVuZDtyZXR1cm4gdGhpcy51bmZpbmlzaGVkKCl9LHQucHJvdG90eXBlLmRpcnR5PWZ1bmN0aW9uKCl7dGhpcy5fZGlydHk9ITAsdGhpcy5fb25EaXJ0eSYmdGhpcy5fb25EaXJ0eSh0aGlzLmNvbnRleHQpfSx0LnByb3RvdHlwZS5fZG9Qcm9ncmVzcz1mdW5jdGlvbih0LGUsbixpLHIpe01mLnJlc2V0KGUsbixpLHIpLHRoaXMuX2NhbGxpbmdQcm9ncmVzcz10LHRoaXMuX2NhbGxpbmdQcm9ncmVzcyh7c3RhcnQ6ZSxlbmQ6bixjb3VudDpuLWUsbmV4dDpNZi5uZXh0fSx0aGlzLmNvbnRleHQpfSx0LnByb3RvdHlwZS5fZG9SZXNldD1mdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMuX2R1ZUluZGV4PXRoaXMuX291dHB1dER1ZUVuZD10aGlzLl9kdWVFbmQ9MCx0aGlzLl9zZXR0ZWRPdXRwdXRFbmQ9bnVsbCwhdCYmdGhpcy5fcmVzZXQmJigoZT10aGlzLl9yZXNldCh0aGlzLmNvbnRleHQpKSYmZS5wcm9ncmVzcyYmKG49ZS5mb3JjZUZpcnN0UHJvZ3Jlc3MsZT1lLnByb2dyZXNzKSxZKGUpJiYhZS5sZW5ndGgmJihlPW51bGwpKSx0aGlzLl9wcm9ncmVzcz1lLHRoaXMuX21vZEJ5PXRoaXMuX21vZERhdGFDb3VudD1udWxsO3ZhciBpPXRoaXMuX2Rvd25zdHJlYW07cmV0dXJuIGkmJmkuZGlydHkoKSxufSx0LnByb3RvdHlwZS51bmZpbmlzaGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2dyZXNzJiZ0aGlzLl9kdWVJbmRleDx0aGlzLl9kdWVFbmR9LHQucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCl7KHRoaXMuX2Rvd25zdHJlYW0hPT10fHx0aGlzLl9kaXJ0eSkmJih0aGlzLl9kb3duc3RyZWFtPXQsdC5fdXBzdHJlYW09dGhpcyx0LmRpcnR5KCkpfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fZGlzcG9zZWR8fCh0aGlzLl91cHN0cmVhbSYmKHRoaXMuX3Vwc3RyZWFtLl9kb3duc3RyZWFtPW51bGwpLHRoaXMuX2Rvd25zdHJlYW0mJih0aGlzLl9kb3duc3RyZWFtLl91cHN0cmVhbT1udWxsKSx0aGlzLl9kaXJ0eT0hMSx0aGlzLl9kaXNwb3NlZD0hMCl9LHQucHJvdG90eXBlLmdldFVwc3RyZWFtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Vwc3RyZWFtfSx0LnByb3RvdHlwZS5nZXREb3duc3RyZWFtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd25zdHJlYW19LHQucHJvdG90eXBlLnNldE91dHB1dEVuZD1mdW5jdGlvbih0KXt0aGlzLl9vdXRwdXREdWVFbmQ9dGhpcy5fc2V0dGVkT3V0cHV0RW5kPXR9LHR9KCksTWY9ZnVuY3Rpb24oKXt2YXIgdCxlLG4saSxyLG89e3Jlc2V0OmZ1bmN0aW9uKGwsdSxoLGMpe2U9bCx0PXUsbj1oLGk9YyxyPU1hdGguY2VpbChpL24pLG8ubmV4dD1uPjEmJmk+MD9zOmF9fTtyZXR1cm4gbztmdW5jdGlvbiBhKCl7cmV0dXJuIGU8dD9lKys6bnVsbH1mdW5jdGlvbiBzKCl7dmFyIG89ZSVyKm4rTWF0aC5jZWlsKGUvciksYT1lPj10P251bGw6bzxpP286ZTtyZXR1cm4gZSsrLGF9fSgpO2Z1bmN0aW9uIElmKHQsZSl7dmFyIG49ZSYmZS50eXBlO3JldHVybiJvcmRpbmFsIj09PW4/dDooInRpbWUiIT09bnx8aih0KXx8bnVsbD09dHx8Ii0iPT09dHx8KHQ9K3VvKHQpKSxudWxsPT10fHwiIj09PXQ/TmFOOk51bWJlcih0KSl9dmFyIFRmPXl0KHtudW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCl9LHRpbWU6ZnVuY3Rpb24odCl7cmV0dXJuK3VvKHQpfSx0cmltOmZ1bmN0aW9uKHQpe3JldHVybiBVKHQpP3V0KHQpOnR9fSk7ZnVuY3Rpb24gQ2YodCl7cmV0dXJuIFRmLmdldCh0KX12YXIgRGY9e2x0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZX0sbHRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8PWV9LGd0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZX0sZ3RlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV9fSxBZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtpZighaihlKSl7dmFyIG49IiI7MCx3byhuKX10aGlzLl9vcEZuPURmW3RdLHRoaXMuX3J2YWxGbG9hdD15byhlKX1yZXR1cm4gdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGoodCk/dGhpcy5fb3BGbih0LHRoaXMuX3J2YWxGbG9hdCk6dGhpcy5fb3BGbih5byh0KSx0aGlzLl9ydmFsRmxvYXQpfSx0fSgpLGtmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBuPSJkZXNjIj09PXQ7dGhpcy5fcmVzdWx0TFQ9bj8xOi0xLG51bGw9PWUmJihlPW4/Im1pbiI6Im1heCIpLHRoaXMuX2luY29tcGFyYWJsZT0ibWluIj09PWU/LTEvMDoxLzB9cmV0dXJuIHQucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49aih0KT90OnlvKHQpLGk9aihlKT9lOnlvKGUpLHI9aXNOYU4obiksbz1pc05hTihpKTtpZihyJiYobj10aGlzLl9pbmNvbXBhcmFibGUpLG8mJihpPXRoaXMuX2luY29tcGFyYWJsZSksciYmbyl7dmFyIGE9VSh0KSxzPVUoZSk7YSYmKG49cz90OjApLHMmJihpPWE/ZTowKX1yZXR1cm4gbjxpP3RoaXMuX3Jlc3VsdExUOm4+aT8tdGhpcy5fcmVzdWx0TFQ6MH0sdH0oKSxMZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9ydmFsPWUsdGhpcy5faXNFUT10LHRoaXMuX3J2YWxUeXBlb2Y9dHlwZW9mIGUsdGhpcy5fcnZhbEZsb2F0PXlvKGUpfXJldHVybiB0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbih0KXt2YXIgZT10PT09dGhpcy5fcnZhbDtpZighZSl7dmFyIG49dHlwZW9mIHQ7bj09PXRoaXMuX3J2YWxUeXBlb2Z8fCJudW1iZXIiIT09biYmIm51bWJlciIhPT10aGlzLl9ydmFsVHlwZW9mfHwoZT15byh0KT09PXRoaXMuX3J2YWxGbG9hdCl9cmV0dXJuIHRoaXMuX2lzRVE/ZTohZX0sdH0oKTtmdW5jdGlvbiBQZih0LGUpe3JldHVybiJlcSI9PT10fHwibmUiPT09dD9uZXcgTGYoImVxIj09PXQsZSk6X3QoRGYsdCk/bmV3IEFmKHQsZSk6bnVsbH12YXIgT2Y9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5nZXRSYXdEYXRhPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJub3Qgc3VwcG9ydGVkIil9LHQucHJvdG90eXBlLmdldFJhd0RhdGFJdGVtPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigibm90IHN1cHBvcnRlZCIpfSx0LnByb3RvdHlwZS5jbG9uZVJhd0RhdGE9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmdldERpbWVuc2lvbkluZm89ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5jbG9uZUFsbERpbWVuc2lvbkluZm89ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmNvdW50PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5yZXRyaWV2ZVZhbHVlPWZ1bmN0aW9uKHQsZSl7fSx0LnByb3RvdHlwZS5yZXRyaWV2ZVZhbHVlRnJvbUl0ZW09ZnVuY3Rpb24odCxlKXt9LHQucHJvdG90eXBlLmNvbnZlcnRWYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiBJZih0LGUpfSx0fSgpO2Z1bmN0aW9uIFJmKHQpe3ZhciBlPXQuc291cmNlRm9ybWF0O2lmKCFGZihlKSl7dmFyIG49IiI7MCx3byhuKX1yZXR1cm4gdC5kYXRhfWZ1bmN0aW9uIE5mKHQpe3ZhciBlPXQuc291cmNlRm9ybWF0LG49dC5kYXRhO2lmKCFGZihlKSl7dmFyIGk9IiI7MCx3byhpKX1pZihlPT09SHApe2Zvcih2YXIgcj1bXSxvPTAsYT1uLmxlbmd0aDtvPGE7bysrKXIucHVzaChuW29dLnNsaWNlKCkpO3JldHVybiByfWlmKGU9PT1ZcCl7Zm9yKHI9W10sbz0wLGE9bi5sZW5ndGg7bzxhO28rKylyLnB1c2goQSh7fSxuW29dKSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIEVmKHQsZSxuKXtpZihudWxsIT1uKXJldHVybiBqKG4pfHwhaXNOYU4obikmJiFfdChlLG4pP3Rbbl06X3QoZSxuKT9lW25dOnZvaWQgMH1mdW5jdGlvbiB6Zih0KXtyZXR1cm4gVCh0KX12YXIgVmY9eXQoKTtmdW5jdGlvbiBCZih0LGUsbixpKXt2YXIgcj0iIjtlLmxlbmd0aHx8d28ocikscSh0KXx8d28ocik7dmFyIG89dC50eXBlLGE9VmYuZ2V0KG8pO2F8fHdvKHIpO3ZhciBzPXooZSwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IE9mLGk9dC5kYXRhLHI9bi5zb3VyY2VGb3JtYXQ9dC5zb3VyY2VGb3JtYXQsbz10LnN0YXJ0SW5kZXgsYT0iIjt0LnNlcmllc0xheW91dEJ5IT09anAmJndvKGEpO3ZhciBzPVtdLGw9e30sdT10LmRpbWVuc2lvbnNEZWZpbmU7aWYodSlFKHUsKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5uYW1lLGk9e2luZGV4OmUsbmFtZTpuLGRpc3BsYXlOYW1lOnQuZGlzcGxheU5hbWV9O2lmKHMucHVzaChpKSxudWxsIT1uKXt2YXIgcj0iIjtfdChsLG4pJiZ3byhyKSxsW25dPWl9fSkpO2Vsc2UgZm9yKHZhciBoPTA7aDx0LmRpbWVuc2lvbnNEZXRlY3RlZENvdW50O2grKylzLnB1c2goe2luZGV4Omh9KTt2YXIgYz1oZihyLGpwKTtlLl9faXNCdWlsdEluJiYobi5nZXRSYXdEYXRhSXRlbT1mdW5jdGlvbih0KXtyZXR1cm4gYyhpLG8scyx0KX0sbi5nZXRSYXdEYXRhPVcoUmYsbnVsbCx0KSksbi5jbG9uZVJhd0RhdGE9VyhOZixudWxsLHQpO3ZhciBwPWRmKHIsanApO24uY291bnQ9VyhwLG51bGwsaSxvLHMpO3ZhciBkPXlmKHIpO24ucmV0cmlldmVWYWx1ZT1mdW5jdGlvbih0LGUpe3ZhciBuPWMoaSxvLHMsdCk7cmV0dXJuIGYobixlKX07dmFyIGY9bi5yZXRyaWV2ZVZhbHVlRnJvbUl0ZW09ZnVuY3Rpb24odCxlKXtpZihudWxsIT10KXt2YXIgbj1zW2VdO3JldHVybiBuP2QodCxlLG4ubmFtZSk6dm9pZCAwfX07cmV0dXJuIG4uZ2V0RGltZW5zaW9uSW5mbz1XKEVmLG51bGwscyxsKSxuLmNsb25lQWxsRGltZW5zaW9uSW5mbz1XKHpmLG51bGwscyksbn0odCxhKX0pKSxsPVRvKGEudHJhbnNmb3JtKHt1cHN0cmVhbTpzWzBdLHVwc3RyZWFtTGlzdDpzLGNvbmZpZzpUKHQuY29uZmlnKX0pKTtyZXR1cm4geihsLChmdW5jdGlvbih0LG4pe3ZhciBpLHI9IiI7cSh0KXx8d28ociksdC5kYXRhfHx3byhyKSxGZihuZih0LmRhdGEpKXx8d28ocik7dmFyIG89ZVswXTtpZihvJiYwPT09biYmIXQuZGltZW5zaW9ucyl7dmFyIGE9by5zdGFydEluZGV4O2EmJih0LmRhdGE9by5kYXRhLnNsaWNlKDAsYSkuY29uY2F0KHQuZGF0YSkpLGk9e3Nlcmllc0xheW91dEJ5OmpwLHNvdXJjZUhlYWRlcjphLGRpbWVuc2lvbnM6by5tZXRhUmF3T3B0aW9uLmRpbWVuc2lvbnN9fWVsc2UgaT17c2VyaWVzTGF5b3V0Qnk6anAsc291cmNlSGVhZGVyOjAsZGltZW5zaW9uczp0LmRpbWVuc2lvbnN9O3JldHVybiB0Zih0LmRhdGEsaSxudWxsKX0pKX1mdW5jdGlvbiBGZih0KXtyZXR1cm4gdD09PUhwfHx0PT09WXB9dmFyIEdmLFdmPSJ1bmRlZmluZWQiLEhmPXR5cGVvZiBVaW50MzJBcnJheT09PVdmP0FycmF5OlVpbnQzMkFycmF5LFlmPXR5cGVvZiBVaW50MTZBcnJheT09PVdmP0FycmF5OlVpbnQxNkFycmF5LFhmPXR5cGVvZiBJbnQzMkFycmF5PT09V2Y/QXJyYXk6SW50MzJBcnJheSxVZj10eXBlb2YgRmxvYXQ2NEFycmF5PT09V2Y/QXJyYXk6RmxvYXQ2NEFycmF5LFpmPXtmbG9hdDpVZixpbnQ6WGYsb3JkaW5hbDpBcnJheSxudW1iZXI6QXJyYXksdGltZTpVZn07ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQ+NjU1MzU/SGY6WWZ9ZnVuY3Rpb24gcWYodCxlLG4saSxyKXt2YXIgbz1aZltufHwiZmxvYXQiXTtpZihyKXt2YXIgYT10W2VdLHM9YSYmYS5sZW5ndGg7aWYocyE9PWkpe2Zvcih2YXIgbD1uZXcgbyhpKSx1PTA7dTxzO3UrKylsW3VdPWFbdV07dFtlXT1sfX1lbHNlIHRbZV09bmV3IG8oaSl9dmFyIEtmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2NodW5rcz1bXSx0aGlzLl9yYXdFeHRlbnQ9W10sdGhpcy5fZXh0ZW50PVtdLHRoaXMuX2NvdW50PTAsdGhpcy5fcmF3Q291bnQ9MCx0aGlzLl9jYWxjRGltTmFtZVRvSWR4PXl0KCl9cmV0dXJuIHQucHJvdG90eXBlLmluaXREYXRhPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9wcm92aWRlcj10LHRoaXMuX2NodW5rcz1bXSx0aGlzLl9pbmRpY2VzPW51bGwsdGhpcy5nZXRSYXdJbmRleD10aGlzLl9nZXRSYXdJZHhJZGVudGl0eTt2YXIgaT10LmdldFNvdXJjZSgpLHI9dGhpcy5kZWZhdWx0RGltVmFsdWVHZXR0ZXI9R2ZbaS5zb3VyY2VGb3JtYXRdO3RoaXMuX2RpbVZhbHVlR2V0dGVyPW58fHIsdGhpcy5fcmF3RXh0ZW50PVtdO2FmKGkpO3RoaXMuX2RpbWVuc2lvbnM9eihlLChmdW5jdGlvbih0KXtyZXR1cm57dHlwZTp0LnR5cGUscHJvcGVydHk6dC5wcm9wZXJ0eX19KSksdGhpcy5faW5pdERhdGFGcm9tUHJvdmlkZXIoMCx0LmNvdW50KCkpfSx0LnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm92aWRlcn0sdC5wcm90b3R5cGUuZ2V0U291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyLmdldFNvdXJjZSgpfSx0LnByb3RvdHlwZS5lbnN1cmVDYWxjdWxhdGlvbkRpbWVuc2lvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2NhbGNEaW1OYW1lVG9JZHgsaT10aGlzLl9kaW1lbnNpb25zLHI9bi5nZXQodCk7aWYobnVsbCE9cil7aWYoaVtyXS50eXBlPT09ZSlyZXR1cm4gcn1lbHNlIHI9aS5sZW5ndGg7cmV0dXJuIGlbcl09e3R5cGU6ZX0sbi5zZXQodCxyKSx0aGlzLl9jaHVua3Nbcl09bmV3IFpmW2V8fCJmbG9hdCJdKHRoaXMuX3Jhd0NvdW50KSx0aGlzLl9yYXdFeHRlbnRbcl09WzEvMCwtMS8wXSxyfSx0LnByb3RvdHlwZS5jb2xsZWN0T3JkaW5hbE1ldGE9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jaHVua3NbdF0saT10aGlzLl9kaW1lbnNpb25zW3RdLHI9dGhpcy5fcmF3RXh0ZW50LG89aS5vcmRpbmFsT2Zmc2V0fHwwLGE9bi5sZW5ndGg7MD09PW8mJihyW3RdPVsxLzAsLTEvMF0pO2Zvcih2YXIgcz1yW3RdLGw9bztsPGE7bCsrKXt2YXIgdT1uW2xdPWUucGFyc2VBbmRDb2xsZWN0KG5bbF0pO2lzTmFOKHUpfHwoc1swXT1NYXRoLm1pbih1LHNbMF0pLHNbMV09TWF0aC5tYXgodSxzWzFdKSl9aS5vcmRpbmFsTWV0YT1lLGkub3JkaW5hbE9mZnNldD1hLGkudHlwZT0ib3JkaW5hbCJ9LHQucHJvdG90eXBlLmdldE9yZGluYWxNZXRhPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kaW1lbnNpb25zW3RdLm9yZGluYWxNZXRhfSx0LnByb3RvdHlwZS5nZXREaW1lbnNpb25Qcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9kaW1lbnNpb25zW3RdO3JldHVybiBlJiZlLnByb3BlcnR5fSx0LnByb3RvdHlwZS5hcHBlbmREYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Byb3ZpZGVyLG49dGhpcy5jb3VudCgpO2UuYXBwZW5kRGF0YSh0KTt2YXIgaT1lLmNvdW50KCk7cmV0dXJuIGUucGVyc2lzdGVudHx8KGkrPW4pLG48aSYmdGhpcy5faW5pdERhdGFGcm9tUHJvdmlkZXIobixpLCEwKSxbbixpXX0sdC5wcm90b3R5cGUuYXBwZW5kVmFsdWVzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuX2NodW5rcyxpPXRoaXMuX2RpbWVuc2lvbnMscj1pLmxlbmd0aCxvPXRoaXMuX3Jhd0V4dGVudCxhPXRoaXMuY291bnQoKSxzPWErTWF0aC5tYXgodC5sZW5ndGgsZXx8MCksbD0wO2w8cjtsKyspe3FmKG4sbCwoZD1pW2xdKS50eXBlLHMsITApfWZvcih2YXIgdT1bXSxoPWE7aDxzO2grKylmb3IodmFyIGM9aC1hLHA9MDtwPHI7cCsrKXt2YXIgZD1pW3BdLGY9R2YuYXJyYXlSb3dzLmNhbGwodGhpcyx0W2NdfHx1LGQucHJvcGVydHksYyxwKTtuW3BdW2hdPWY7dmFyIGc9b1twXTtmPGdbMF0mJihnWzBdPWYpLGY+Z1sxXSYmKGdbMV09Zil9cmV0dXJuIHRoaXMuX3Jhd0NvdW50PXRoaXMuX2NvdW50PXMse3N0YXJ0OmEsZW5kOnN9fSx0LnByb3RvdHlwZS5faW5pdERhdGFGcm9tUHJvdmlkZXI9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10aGlzLl9wcm92aWRlcixyPXRoaXMuX2NodW5rcyxvPXRoaXMuX2RpbWVuc2lvbnMsYT1vLmxlbmd0aCxzPXRoaXMuX3Jhd0V4dGVudCxsPXoobywoZnVuY3Rpb24odCl7cmV0dXJuIHQucHJvcGVydHl9KSksdT0wO3U8YTt1Kyspe3ZhciBoPW9bdV07c1t1XXx8KHNbdV09WzEvMCwtMS8wXSkscWYocix1LGgudHlwZSxlLG4pfWlmKGkuZmlsbFN0b3JhZ2UpaS5maWxsU3RvcmFnZSh0LGUscixzKTtlbHNlIGZvcih2YXIgYz1bXSxwPXQ7cDxlO3ArKyl7Yz1pLmdldEl0ZW0ocCxjKTtmb3IodmFyIGQ9MDtkPGE7ZCsrKXt2YXIgZj1yW2RdLGc9dGhpcy5fZGltVmFsdWVHZXR0ZXIoYyxsW2RdLHAsZCk7ZltwXT1nO3ZhciB5PXNbZF07Zzx5WzBdJiYoeVswXT1nKSxnPnlbMV0mJih5WzFdPWcpfX0haS5wZXJzaXN0ZW50JiZpLmNsZWFuJiZpLmNsZWFuKCksdGhpcy5fcmF3Q291bnQ9dGhpcy5fY291bnQ9ZSx0aGlzLl9leHRlbnQ9W119LHQucHJvdG90eXBlLmNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvdW50fSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtpZighKGU+PTAmJmU8dGhpcy5fY291bnQpKXJldHVybiBOYU47dmFyIG49dGhpcy5fY2h1bmtzW3RdO3JldHVybiBuP25bdGhpcy5nZXRSYXdJbmRleChlKV06TmFOfSx0LnByb3RvdHlwZS5nZXRWYWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXSxpPVtdO2lmKG51bGw9PWUpe2U9dCx0PVtdO2Zvcih2YXIgcj0wO3I8dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7cisrKWkucHVzaChyKX1lbHNlIGk9dDtyPTA7Zm9yKHZhciBvPWkubGVuZ3RoO3I8bztyKyspbi5wdXNoKHRoaXMuZ2V0KGlbcl0sZSkpO3JldHVybiBufSx0LnByb3RvdHlwZS5nZXRCeVJhd0luZGV4PWZ1bmN0aW9uKHQsZSl7aWYoIShlPj0wJiZlPHRoaXMuX3Jhd0NvdW50KSlyZXR1cm4gTmFOO3ZhciBuPXRoaXMuX2NodW5rc1t0XTtyZXR1cm4gbj9uW2VdOk5hTn0sdC5wcm90b3R5cGUuZ2V0U3VtPWZ1bmN0aW9uKHQpe3ZhciBlPTA7aWYodGhpcy5fY2h1bmtzW3RdKWZvcih2YXIgbj0wLGk9dGhpcy5jb3VudCgpO248aTtuKyspe3ZhciByPXRoaXMuZ2V0KHQsbik7aXNOYU4ocil8fChlKz1yKX1yZXR1cm4gZX0sdC5wcm90b3R5cGUuZ2V0TWVkaWFuPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3RoaXMuZWFjaChbdF0sKGZ1bmN0aW9uKHQpe2lzTmFOKHQpfHxlLnB1c2godCl9KSk7dmFyIG49ZS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSksaT10aGlzLmNvdW50KCk7cmV0dXJuIDA9PT1pPzA6aSUyPT0xP25bKGktMSkvMl06KG5baS8yXStuW2kvMi0xXSkvMn0sdC5wcm90b3R5cGUuaW5kZXhPZlJhd0luZGV4PWZ1bmN0aW9uKHQpe2lmKHQ+PXRoaXMuX3Jhd0NvdW50fHx0PDApcmV0dXJuLTE7aWYoIXRoaXMuX2luZGljZXMpcmV0dXJuIHQ7dmFyIGU9dGhpcy5faW5kaWNlcyxuPWVbdF07aWYobnVsbCE9biYmbjx0aGlzLl9jb3VudCYmbj09PXQpcmV0dXJuIHQ7Zm9yKHZhciBpPTAscj10aGlzLl9jb3VudC0xO2k8PXI7KXt2YXIgbz0oaStyKS8yfDA7aWYoZVtvXTx0KWk9bysxO2Vsc2V7aWYoIShlW29dPnQpKXJldHVybiBvO3I9by0xfX1yZXR1cm4tMX0sdC5wcm90b3R5cGUuaW5kaWNlc09mTmVhcmVzdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fY2h1bmtzW3RdLHI9W107aWYoIWkpcmV0dXJuIHI7bnVsbD09biYmKG49MS8wKTtmb3IodmFyIG89MS8wLGE9LTEscz0wLGw9MCx1PXRoaXMuY291bnQoKTtsPHU7bCsrKXt2YXIgaD1lLWlbdGhpcy5nZXRSYXdJbmRleChsKV0sYz1NYXRoLmFicyhoKTtjPD1uJiYoKGM8b3x8Yz09PW8mJmg+PTAmJmE8MCkmJihvPWMsYT1oLHM9MCksaD09PWEmJihyW3MrK109bCkpfXJldHVybiByLmxlbmd0aD1zLHJ9LHQucHJvdG90eXBlLmdldEluZGljZXM9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX2luZGljZXM7aWYoZSl7dmFyIG49ZS5jb25zdHJ1Y3RvcixpPXRoaXMuX2NvdW50O2lmKG49PT1BcnJheSl7dD1uZXcgbihpKTtmb3IodmFyIHI9MDtyPGk7cisrKXRbcl09ZVtyXX1lbHNlIHQ9bmV3IG4oZS5idWZmZXIsMCxpKX1lbHNle3Q9bmV3KG49amYodGhpcy5fcmF3Q291bnQpKSh0aGlzLmNvdW50KCkpO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXT1yfXJldHVybiB0fSx0LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5fY291bnQpcmV0dXJuIHRoaXM7Zm9yKHZhciBuPXRoaXMuY2xvbmUoKSxpPW4uY291bnQoKSxyPW5ldyhqZihuLl9yYXdDb3VudCkpKGkpLG89W10sYT10Lmxlbmd0aCxzPTAsbD10WzBdLHU9bi5fY2h1bmtzLGg9MDtoPGk7aCsrKXt2YXIgYz12b2lkIDAscD1uLmdldFJhd0luZGV4KGgpO2lmKDA9PT1hKWM9ZShoKTtlbHNlIGlmKDE9PT1hKXtjPWUodVtsXVtwXSxoKX1lbHNle2Zvcih2YXIgZD0wO2Q8YTtkKyspb1tkXT11W3RbZF1dW3BdO29bZF09aCxjPWUuYXBwbHkobnVsbCxvKX1jJiYocltzKytdPXApfXJldHVybiBzPGkmJihuLl9pbmRpY2VzPXIpLG4uX2NvdW50PXMsbi5fZXh0ZW50PVtdLG4uX3VwZGF0ZUdldFJhd0lkeCgpLG59LHQucHJvdG90eXBlLnNlbGVjdFJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2xvbmUoKSxuPWUuX2NvdW50O2lmKCFuKXJldHVybiB0aGlzO3ZhciBpPUcodCkscj1pLmxlbmd0aDtpZighcilyZXR1cm4gdGhpczt2YXIgbz1lLmNvdW50KCksYT1uZXcoamYoZS5fcmF3Q291bnQpKShvKSxzPTAsbD1pWzBdLHU9dFtsXVswXSxoPXRbbF1bMV0sYz1lLl9jaHVua3MscD0hMTtpZighZS5faW5kaWNlcyl7dmFyIGQ9MDtpZigxPT09cil7Zm9yKHZhciBmPWNbaVswXV0sZz0wO2c8bjtnKyspeygoeD1mW2ddKT49dSYmeDw9aHx8aXNOYU4oeCkpJiYoYVtzKytdPWQpLGQrK31wPSEwfWVsc2UgaWYoMj09PXIpe2Y9Y1tpWzBdXTt2YXIgeT1jW2lbMV1dLHY9dFtpWzFdXVswXSxtPXRbaVsxXV1bMV07Zm9yKGc9MDtnPG47ZysrKXt2YXIgeD1mW2ddLF89eVtnXTsoeD49dSYmeDw9aHx8aXNOYU4oeCkpJiYoXz49diYmXzw9bXx8aXNOYU4oXykpJiYoYVtzKytdPWQpLGQrK31wPSEwfX1pZighcClpZigxPT09cilmb3IoZz0wO2c8bztnKyspe3ZhciBiPWUuZ2V0UmF3SW5kZXgoZyk7KCh4PWNbaVswXV1bYl0pPj11JiZ4PD1ofHxpc05hTih4KSkmJihhW3MrK109Yil9ZWxzZSBmb3IoZz0wO2c8bztnKyspe2Zvcih2YXIgdz0hMCxTPShiPWUuZ2V0UmF3SW5kZXgoZyksMCk7UzxyO1MrKyl7dmFyIE09aVtTXTsoKHg9Y1tNXVtiXSk8dFtNXVswXXx8eD50W01dWzFdKSYmKHc9ITEpfXcmJihhW3MrK109ZS5nZXRSYXdJbmRleChnKSl9cmV0dXJuIHM8byYmKGUuX2luZGljZXM9YSksZS5fY291bnQ9cyxlLl9leHRlbnQ9W10sZS5fdXBkYXRlR2V0UmF3SWR4KCksZX0sdC5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jbG9uZSh0KTtyZXR1cm4gdGhpcy5fdXBkYXRlRGltcyhuLHQsZSksbn0sdC5wcm90b3R5cGUubW9kaWZ5PWZ1bmN0aW9uKHQsZSl7dGhpcy5fdXBkYXRlRGltcyh0aGlzLHQsZSl9LHQucHJvdG90eXBlLl91cGRhdGVEaW1zPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dC5fY2h1bmtzLHI9W10sbz1lLmxlbmd0aCxhPXQuY291bnQoKSxzPVtdLGw9dC5fcmF3RXh0ZW50LHU9MDt1PGUubGVuZ3RoO3UrKylsW2VbdV1dPVsxLzAsLTEvMF07Zm9yKHZhciBoPTA7aDxhO2grKyl7Zm9yKHZhciBjPXQuZ2V0UmF3SW5kZXgoaCkscD0wO3A8bztwKyspc1twXT1pW2VbcF1dW2NdO3Nbb109aDt2YXIgZD1uJiZuLmFwcGx5KG51bGwscyk7aWYobnVsbCE9ZCl7Im9iamVjdCIhPXR5cGVvZiBkJiYoclswXT1kLGQ9cik7Zm9yKHU9MDt1PGQubGVuZ3RoO3UrKyl7dmFyIGY9ZVt1XSxnPWRbdV0seT1sW2ZdLHY9aVtmXTt2JiYodltjXT1nKSxnPHlbMF0mJih5WzBdPWcpLGc+eVsxXSYmKHlbMV09Zyl9fX19LHQucHJvdG90eXBlLmx0dGJEb3duU2FtcGxlPWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLG89dGhpcy5jbG9uZShbdF0sITApLGE9by5fY2h1bmtzW3RdLHM9dGhpcy5jb3VudCgpLGw9MCx1PU1hdGguZmxvb3IoMS9lKSxoPXRoaXMuZ2V0UmF3SW5kZXgoMCksYz1uZXcoamYodGhpcy5fcmF3Q291bnQpKShNYXRoLm1pbigyKihNYXRoLmNlaWwocy91KSsyKSxzKSk7Y1tsKytdPWg7Zm9yKHZhciBwPTE7cDxzLTE7cCs9dSl7Zm9yKHZhciBkPU1hdGgubWluKHArdSxzLTEpLGY9TWF0aC5taW4ocCsyKnUscyksZz0oZitkKS8yLHk9MCx2PWQ7djxmO3YrKyl7dmFyIG09YVtJPXRoaXMuZ2V0UmF3SW5kZXgodildO2lzTmFOKG0pfHwoeSs9bSl9eS89Zi1kO3ZhciB4PXAsXz1NYXRoLm1pbihwK3UscyksYj1wLTEsdz1hW2hdO249LTEscj14O3ZhciBTPS0xLE09MDtmb3Iodj14O3Y8Xzt2Kyspe3ZhciBJO209YVtJPXRoaXMuZ2V0UmF3SW5kZXgodildO2lzTmFOKG0pPyhNKyssUzwwJiYoUz1JKSk6KGk9TWF0aC5hYnMoKGItZykqKG0tdyktKGItdikqKHktdykpKT5uJiYobj1pLHI9SSl9TT4wJiZNPF8teCYmKGNbbCsrXT1NYXRoLm1pbihTLHIpLHI9TWF0aC5tYXgoUyxyKSksY1tsKytdPXIsaD1yfXJldHVybiBjW2wrK109dGhpcy5nZXRSYXdJbmRleChzLTEpLG8uX2NvdW50PWwsby5faW5kaWNlcz1jLG8uZ2V0UmF3SW5kZXg9dGhpcy5fZ2V0UmF3SWR4LG99LHQucHJvdG90eXBlLmRvd25TYW1wbGU9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPXRoaXMuY2xvbmUoW3RdLCEwKSxvPXIuX2NodW5rcyxhPVtdLHM9TWF0aC5mbG9vcigxL2UpLGw9b1t0XSx1PXRoaXMuY291bnQoKSxoPXIuX3Jhd0V4dGVudFt0XT1bMS8wLC0xLzBdLGM9bmV3KGpmKHRoaXMuX3Jhd0NvdW50KSkoTWF0aC5jZWlsKHUvcykpLHA9MCxkPTA7ZDx1O2QrPXMpe3M+dS1kJiYocz11LWQsYS5sZW5ndGg9cyk7Zm9yKHZhciBmPTA7ZjxzO2YrKyl7dmFyIGc9dGhpcy5nZXRSYXdJbmRleChkK2YpO2FbZl09bFtnXX12YXIgeT1uKGEpLHY9dGhpcy5nZXRSYXdJbmRleChNYXRoLm1pbihkK2koYSx5KXx8MCx1LTEpKTtsW3ZdPXkseTxoWzBdJiYoaFswXT15KSx5PmhbMV0mJihoWzFdPXkpLGNbcCsrXT12fXJldHVybiByLl9jb3VudD1wLHIuX2luZGljZXM9YyxyLl91cGRhdGVHZXRSYXdJZHgoKSxyfSx0LnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fY291bnQpZm9yKHZhciBuPXQubGVuZ3RoLGk9dGhpcy5fY2h1bmtzLHI9MCxvPXRoaXMuY291bnQoKTtyPG87cisrKXt2YXIgYT10aGlzLmdldFJhd0luZGV4KHIpO3N3aXRjaChuKXtjYXNlIDA6ZShyKTticmVhaztjYXNlIDE6ZShpW3RbMF1dW2FdLHIpO2JyZWFrO2Nhc2UgMjplKGlbdFswXV1bYV0saVt0WzFdXVthXSxyKTticmVhaztkZWZhdWx0OmZvcih2YXIgcz0wLGw9W107czxuO3MrKylsW3NdPWlbdFtzXV1bYV07bFtzXT1yLGUuYXBwbHkobnVsbCxsKX19fSx0LnByb3RvdHlwZS5nZXREYXRhRXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NodW5rc1t0XSxuPVsxLzAsLTEvMF07aWYoIWUpcmV0dXJuIG47dmFyIGkscj10aGlzLmNvdW50KCk7aWYoIXRoaXMuX2luZGljZXMpcmV0dXJuIHRoaXMuX3Jhd0V4dGVudFt0XS5zbGljZSgpO2lmKGk9dGhpcy5fZXh0ZW50W3RdKXJldHVybiBpLnNsaWNlKCk7Zm9yKHZhciBvPShpPW4pWzBdLGE9aVsxXSxzPTA7czxyO3MrKyl7dmFyIGw9ZVt0aGlzLmdldFJhd0luZGV4KHMpXTtsPG8mJihvPWwpLGw+YSYmKGE9bCl9cmV0dXJuIGk9W28sYV0sdGhpcy5fZXh0ZW50W3RdPWksaX0sdC5wcm90b3R5cGUuZ2V0UmF3RGF0YUl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSYXdJbmRleCh0KTtpZih0aGlzLl9wcm92aWRlci5wZXJzaXN0ZW50KXJldHVybiB0aGlzLl9wcm92aWRlci5nZXRJdGVtKGUpO2Zvcih2YXIgbj1bXSxpPXRoaXMuX2NodW5rcyxyPTA7cjxpLmxlbmd0aDtyKyspbi5wdXNoKGlbcl1bZV0pO3JldHVybiBufSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlLG4pe3ZhciBpLHIsbz1uZXcgdCxhPXRoaXMuX2NodW5rcyxzPWUmJlYoZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtlXT0hMCx0fSkse30pO2lmKHMpZm9yKHZhciBsPTA7bDxhLmxlbmd0aDtsKyspby5fY2h1bmtzW2xdPXNbbF0/KGk9YVtsXSxyPXZvaWQgMCwocj1pLmNvbnN0cnVjdG9yKT09PUFycmF5P2kuc2xpY2UoKTpuZXcgcihpKSk6YVtsXTtlbHNlIG8uX2NodW5rcz1hO3JldHVybiB0aGlzLl9jb3B5Q29tbW9uUHJvcHMobyksbnx8KG8uX2luZGljZXM9dGhpcy5fY2xvbmVJbmRpY2VzKCkpLG8uX3VwZGF0ZUdldFJhd0lkeCgpLG99LHQucHJvdG90eXBlLl9jb3B5Q29tbW9uUHJvcHM9ZnVuY3Rpb24odCl7dC5fY291bnQ9dGhpcy5fY291bnQsdC5fcmF3Q291bnQ9dGhpcy5fcmF3Q291bnQsdC5fcHJvdmlkZXI9dGhpcy5fcHJvdmlkZXIsdC5fZGltZW5zaW9ucz10aGlzLl9kaW1lbnNpb25zLHQuX2V4dGVudD1UKHRoaXMuX2V4dGVudCksdC5fcmF3RXh0ZW50PVQodGhpcy5fcmF3RXh0ZW50KX0sdC5wcm90b3R5cGUuX2Nsb25lSW5kaWNlcz1mdW5jdGlvbigpe2lmKHRoaXMuX2luZGljZXMpe3ZhciB0PXRoaXMuX2luZGljZXMuY29uc3RydWN0b3IsZT12b2lkIDA7aWYodD09PUFycmF5KXt2YXIgbj10aGlzLl9pbmRpY2VzLmxlbmd0aDtlPW5ldyB0KG4pO2Zvcih2YXIgaT0wO2k8bjtpKyspZVtpXT10aGlzLl9pbmRpY2VzW2ldfWVsc2UgZT1uZXcgdCh0aGlzLl9pbmRpY2VzKTtyZXR1cm4gZX1yZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUuX2dldFJhd0lkeElkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0LnByb3RvdHlwZS5fZ2V0UmF3SWR4PWZ1bmN0aW9uKHQpe3JldHVybiB0PHRoaXMuX2NvdW50JiZ0Pj0wP3RoaXMuX2luZGljZXNbdF06LTF9LHQucHJvdG90eXBlLl91cGRhdGVHZXRSYXdJZHg9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd0luZGV4PXRoaXMuX2luZGljZXM/dGhpcy5fZ2V0UmF3SWR4OnRoaXMuX2dldFJhd0lkeElkZW50aXR5fSx0LmludGVybmFsRmllbGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLGkpe3JldHVybiBJZih0W2ldLHRoaXMuX2RpbWVuc2lvbnNbaV0pfUdmPXthcnJheVJvd3M6dCxvYmplY3RSb3dzOmZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBJZih0W2VdLHRoaXMuX2RpbWVuc2lvbnNbaV0pfSxrZXllZENvbHVtbnM6dCxvcmlnaW5hbDpmdW5jdGlvbih0LGUsbixpKXt2YXIgcj10JiYobnVsbD09dC52YWx1ZT90OnQudmFsdWUpO3JldHVybiBJZihyIGluc3RhbmNlb2YgQXJyYXk/cltpXTpyLHRoaXMuX2RpbWVuc2lvbnNbaV0pfSx0eXBlZEFycmF5OmZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB0W2ldfX19KCksdH0oKSwkZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fc291cmNlTGlzdD1bXSx0aGlzLl9zdG9yZUxpc3Q9W10sdGhpcy5fdXBzdHJlYW1TaWduTGlzdD1bXSx0aGlzLl92ZXJzaW9uU2lnbkJhc2U9MCx0aGlzLl9kaXJ0eT0hMCx0aGlzLl9zb3VyY2VIb3N0PXR9cmV0dXJuIHQucHJvdG90eXBlLmRpcnR5PWZ1bmN0aW9uKCl7dGhpcy5fc2V0TG9jYWxTb3VyY2UoW10sW10pLHRoaXMuX3N0b3JlTGlzdD1bXSx0aGlzLl9kaXJ0eT0hMH0sdC5wcm90b3R5cGUuX3NldExvY2FsU291cmNlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc291cmNlTGlzdD10LHRoaXMuX3Vwc3RyZWFtU2lnbkxpc3Q9ZSx0aGlzLl92ZXJzaW9uU2lnbkJhc2UrKyx0aGlzLl92ZXJzaW9uU2lnbkJhc2U+OWUxMCYmKHRoaXMuX3ZlcnNpb25TaWduQmFzZT0wKX0sdC5wcm90b3R5cGUuX2dldFZlcnNpb25TaWduPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXJjZUhvc3QudWlkKyJfIit0aGlzLl92ZXJzaW9uU2lnbkJhc2V9LHQucHJvdG90eXBlLnByZXBhcmVTb3VyY2U9ZnVuY3Rpb24oKXt0aGlzLl9pc0RpcnR5KCkmJih0aGlzLl9jcmVhdGVTb3VyY2UoKSx0aGlzLl9kaXJ0eT0hMSl9LHQucHJvdG90eXBlLl9jcmVhdGVTb3VyY2U9ZnVuY3Rpb24oKXt0aGlzLl9zZXRMb2NhbFNvdXJjZShbXSxbXSk7dmFyIHQsZSxuPXRoaXMuX3NvdXJjZUhvc3QsaT10aGlzLl9nZXRVcHN0cmVhbVNvdXJjZU1hbmFnZXJzKCkscj0hIWkubGVuZ3RoO2lmKFFmKG4pKXt2YXIgbz1uLGE9dm9pZCAwLHM9dm9pZCAwLGw9dm9pZCAwO2lmKHIpe3ZhciB1PWlbMF07dS5wcmVwYXJlU291cmNlKCksYT0obD11LmdldFNvdXJjZSgpKS5kYXRhLHM9bC5zb3VyY2VGb3JtYXQsZT1bdS5fZ2V0VmVyc2lvblNpZ24oKV19ZWxzZSBzPSQoYT1vLmdldCgiZGF0YSIsITApKT9VcDpXcCxlPVtdO3ZhciBoPXRoaXMuX2dldFNvdXJjZU1ldGFSYXdPcHRpb24oKXx8e30sYz1sJiZsLm1ldGFSYXdPcHRpb258fHt9LHA9cnQoaC5zZXJpZXNMYXlvdXRCeSxjLnNlcmllc0xheW91dEJ5KXx8bnVsbCxkPXJ0KGguc291cmNlSGVhZGVyLGMuc291cmNlSGVhZGVyKSxmPXJ0KGguZGltZW5zaW9ucyxjLmRpbWVuc2lvbnMpO3Q9cCE9PWMuc2VyaWVzTGF5b3V0Qnl8fCEhZCE9ISFjLnNvdXJjZUhlYWRlcnx8Zj9bdGYoYSx7c2VyaWVzTGF5b3V0Qnk6cCxzb3VyY2VIZWFkZXI6ZCxkaW1lbnNpb25zOmZ9LHMpXTpbXX1lbHNle3ZhciBnPW47aWYocil7dmFyIHk9dGhpcy5fYXBwbHlUcmFuc2Zvcm0oaSk7dD15LnNvdXJjZUxpc3QsZT15LnVwc3RyZWFtU2lnbkxpc3R9ZWxzZXt0PVt0ZihnLmdldCgic291cmNlIiwhMCksdGhpcy5fZ2V0U291cmNlTWV0YVJhd09wdGlvbigpLG51bGwpXSxlPVtdfX10aGlzLl9zZXRMb2NhbFNvdXJjZSh0LGUpfSx0LnByb3RvdHlwZS5fYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLl9zb3VyY2VIb3N0LGk9bi5nZXQoInRyYW5zZm9ybSIsITApLHI9bi5nZXQoImZyb21UcmFuc2Zvcm1SZXN1bHQiLCEwKTtpZihudWxsIT1yKXt2YXIgbz0iIjsxIT09dC5sZW5ndGgmJnRnKG8pfXZhciBhLHM9W10sbD1bXTtyZXR1cm4gRSh0LChmdW5jdGlvbih0KXt0LnByZXBhcmVTb3VyY2UoKTt2YXIgZT10LmdldFNvdXJjZShyfHwwKSxuPSIiO251bGw9PXJ8fGV8fHRnKG4pLHMucHVzaChlKSxsLnB1c2godC5fZ2V0VmVyc2lvblNpZ24oKSl9KSksaT9lPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1Ubyh0KSxyPWkubGVuZ3RoLG89IiI7cnx8d28obyk7Zm9yKHZhciBhPTAscz1yO2E8czthKyspZT1CZihpW2FdLGUpLGEhPT1zLTEmJihlLmxlbmd0aD1NYXRoLm1heChlLmxlbmd0aCwxKSk7cmV0dXJuIGV9KGkscyxuLmNvbXBvbmVudEluZGV4KTpudWxsIT1yJiYoZT1bKGE9c1swXSxuZXcgSmQoe2RhdGE6YS5kYXRhLHNvdXJjZUZvcm1hdDphLnNvdXJjZUZvcm1hdCxzZXJpZXNMYXlvdXRCeTphLnNlcmllc0xheW91dEJ5LGRpbWVuc2lvbnNEZWZpbmU6VChhLmRpbWVuc2lvbnNEZWZpbmUpLHN0YXJ0SW5kZXg6YS5zdGFydEluZGV4LGRpbWVuc2lvbnNEZXRlY3RlZENvdW50OmEuZGltZW5zaW9uc0RldGVjdGVkQ291bnR9KSldKSx7c291cmNlTGlzdDplLHVwc3RyZWFtU2lnbkxpc3Q6bH19LHQucHJvdG90eXBlLl9pc0RpcnR5PWZ1bmN0aW9uKCl7aWYodGhpcy5fZGlydHkpcmV0dXJuITA7Zm9yKHZhciB0PXRoaXMuX2dldFVwc3RyZWFtU291cmNlTWFuYWdlcnMoKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV07aWYobi5faXNEaXJ0eSgpfHx0aGlzLl91cHN0cmVhbVNpZ25MaXN0W2VdIT09bi5fZ2V0VmVyc2lvblNpZ24oKSlyZXR1cm4hMH19LHQucHJvdG90eXBlLmdldFNvdXJjZT1mdW5jdGlvbih0KXt0PXR8fDA7dmFyIGU9dGhpcy5fc291cmNlTGlzdFt0XTtpZighZSl7dmFyIG49dGhpcy5fZ2V0VXBzdHJlYW1Tb3VyY2VNYW5hZ2VycygpO3JldHVybiBuWzBdJiZuWzBdLmdldFNvdXJjZSh0KX1yZXR1cm4gZX0sdC5wcm90b3R5cGUuZ2V0U2hhcmVkRGF0YVN0b3JlPWZ1bmN0aW9uKHQpe3ZhciBlPXQubWFrZVN0b3JlU2NoZW1hKCk7cmV0dXJuIHRoaXMuX2lubmVyR2V0RGF0YVN0b3JlKGUuZGltZW5zaW9ucyx0LnNvdXJjZSxlLmhhc2gpfSx0LnByb3RvdHlwZS5faW5uZXJHZXREYXRhU3RvcmU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX3N0b3JlTGlzdCxyPWlbMF07cnx8KHI9aVswXT17fSk7dmFyIG89cltuXTtpZighbyl7dmFyIGE9dGhpcy5fZ2V0VXBzdHJlYW1Tb3VyY2VNYW5hZ2VycygpWzBdO1FmKHRoaXMuX3NvdXJjZUhvc3QpJiZhP289YS5faW5uZXJHZXREYXRhU3RvcmUodCxlLG4pOihvPW5ldyBLZikuaW5pdERhdGEobmV3IHNmKGUsdC5sZW5ndGgpLHQpLHJbbl09b31yZXR1cm4gb30sdC5wcm90b3R5cGUuX2dldFVwc3RyZWFtU291cmNlTWFuYWdlcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zb3VyY2VIb3N0O2lmKFFmKHQpKXt2YXIgZT1uZCh0KTtyZXR1cm4gZT9bZS5nZXRTb3VyY2VNYW5hZ2VyKCldOltdfXJldHVybiB6KGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldCgidHJhbnNmb3JtIiwhMCl8fHQuZ2V0KCJmcm9tVHJhbnNmb3JtUmVzdWx0IiwhMCk/WW8odC5lY01vZGVsLCJkYXRhc2V0Iix7aW5kZXg6dC5nZXQoImZyb21EYXRhc2V0SW5kZXgiLCEwKSxpZDp0LmdldCgiZnJvbURhdGFzZXRJZCIsITApfSxXbykubW9kZWxzOltdfSh0KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0U291cmNlTWFuYWdlcigpfSkpfSx0LnByb3RvdHlwZS5fZ2V0U291cmNlTWV0YVJhd09wdGlvbj1mdW5jdGlvbigpe3ZhciB0LGUsbixpPXRoaXMuX3NvdXJjZUhvc3Q7aWYoUWYoaSkpdD1pLmdldCgic2VyaWVzTGF5b3V0QnkiLCEwKSxlPWkuZ2V0KCJzb3VyY2VIZWFkZXIiLCEwKSxuPWkuZ2V0KCJkaW1lbnNpb25zIiwhMCk7ZWxzZSBpZighdGhpcy5fZ2V0VXBzdHJlYW1Tb3VyY2VNYW5hZ2VycygpLmxlbmd0aCl7dmFyIHI9aTt0PXIuZ2V0KCJzZXJpZXNMYXlvdXRCeSIsITApLGU9ci5nZXQoInNvdXJjZUhlYWRlciIsITApLG49ci5nZXQoImRpbWVuc2lvbnMiLCEwKX1yZXR1cm57c2VyaWVzTGF5b3V0Qnk6dCxzb3VyY2VIZWFkZXI6ZSxkaW1lbnNpb25zOm59fSx0fSgpO2Z1bmN0aW9uIEpmKHQpe3Qub3B0aW9uLnRyYW5zZm9ybSYmY3QodC5vcHRpb24udHJhbnNmb3JtKX1mdW5jdGlvbiBRZih0KXtyZXR1cm4ic2VyaWVzIj09PXQubWFpblR5cGV9ZnVuY3Rpb24gdGcodCl7dGhyb3cgbmV3IEVycm9yKHQpfXZhciBlZz0ibGluZS1oZWlnaHQ6MSI7ZnVuY3Rpb24gbmcodCxlKXt2YXIgbj10LmNvbG9yfHwiIzZlNzA3OSIsaT10LmZvbnRTaXplfHwxMixyPXQuZm9udFdlaWdodHx8IjQwMCIsbz10LmNvbG9yfHwiIzQ2NDY0NiIsYT10LmZvbnRTaXplfHwxNCxzPXQuZm9udFdlaWdodHx8IjkwMCI7cmV0dXJuImh0bWwiPT09ZT97bmFtZVN0eWxlOiJmb250LXNpemU6IityZShpKyIiKSsicHg7Y29sb3I6IityZShuKSsiO2ZvbnQtd2VpZ2h0OiIrcmUocisiIiksdmFsdWVTdHlsZToiZm9udC1zaXplOiIrcmUoYSsiIikrInB4O2NvbG9yOiIrcmUobykrIjtmb250LXdlaWdodDoiK3JlKHMrIiIpfTp7bmFtZVN0eWxlOntmb250U2l6ZTppLGZpbGw6bixmb250V2VpZ2h0OnJ9LHZhbHVlU3R5bGU6e2ZvbnRTaXplOmEsZmlsbDpvLGZvbnRXZWlnaHQ6c319fXZhciBpZz1bMCwxMCwyMCwzMF0scmc9WyIiLCJcbiIsIlxuXG4iLCJcblxuXG4iXTtmdW5jdGlvbiBvZyh0LGUpe3JldHVybiBlLnR5cGU9dCxlfWZ1bmN0aW9uIGFnKHQpe3JldHVybiJzZWN0aW9uIj09PXQudHlwZX1mdW5jdGlvbiBzZyh0KXtyZXR1cm4gYWcodCk/dWc6aGd9ZnVuY3Rpb24gbGcodCl7aWYoYWcodCkpe3ZhciBlPTAsbj10LmJsb2Nrcy5sZW5ndGgsaT1uPjF8fG4+MCYmIXQubm9IZWFkZXI7cmV0dXJuIEUodC5ibG9ja3MsKGZ1bmN0aW9uKHQpe3ZhciBuPWxnKHQpO24+PWUmJihlPW4rICsoaSYmKCFufHxhZyh0KSYmIXQubm9IZWFkZXIpKSl9KSksZX1yZXR1cm4gMH1mdW5jdGlvbiB1Zyh0LGUsbixpKXt2YXIgcixvPWUubm9IZWFkZXIsYT0ocj1sZyhlKSx7aHRtbDppZ1tyXSxyaWNoVGV4dDpyZ1tyXX0pLHM9W10sbD1lLmJsb2Nrc3x8W107bHQoIWx8fFkobCkpLGw9bHx8W107dmFyIHU9dC5vcmRlck1vZGU7aWYoZS5zb3J0QmxvY2tzJiZ1KXtsPWwuc2xpY2UoKTt2YXIgaD17dmFsdWVBc2M6ImFzYyIsdmFsdWVEZXNjOiJkZXNjIn07aWYoX3QoaCx1KSl7dmFyIGM9bmV3IGtmKGhbdV0sbnVsbCk7bC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBjLmV2YWx1YXRlKHQuc29ydFBhcmFtLGUuc29ydFBhcmFtKX0pKX1lbHNlInNlcmllc0Rlc2MiPT09dSYmbC5yZXZlcnNlKCl9RShsLChmdW5jdGlvbihuLHIpe3ZhciBvPWUudmFsdWVGb3JtYXR0ZXIsbD1zZyhuKShvP0EoQSh7fSx0KSx7dmFsdWVGb3JtYXR0ZXI6b30pOnQsbixyPjA/YS5odG1sOjAsaSk7bnVsbCE9bCYmcy5wdXNoKGwpfSkpO3ZhciBwPSJyaWNoVGV4dCI9PT10LnJlbmRlck1vZGU/cy5qb2luKGEucmljaFRleHQpOnBnKHMuam9pbigiIiksbz9uOmEuaHRtbCk7aWYobylyZXR1cm4gcDt2YXIgZD1tcChlLmhlYWRlciwib3JkaW5hbCIsdC51c2VVVEMpLGY9bmcoaSx0LnJlbmRlck1vZGUpLm5hbWVTdHlsZTtyZXR1cm4icmljaFRleHQiPT09dC5yZW5kZXJNb2RlP2RnKHQsZCxmKSthLnJpY2hUZXh0K3A6cGcoJzxkaXYgc3R5bGU9IicrZisiOyIrZWcrJzsiPicrcmUoZCkrIjwvZGl2PiIrcCxuKX1mdW5jdGlvbiBoZyh0LGUsbixpKXt2YXIgcj10LnJlbmRlck1vZGUsbz1lLm5vTmFtZSxhPWUubm9WYWx1ZSxzPSFlLm1hcmtlclR5cGUsbD1lLm5hbWUsdT10LnVzZVVUQyxoPWUudmFsdWVGb3JtYXR0ZXJ8fHQudmFsdWVGb3JtYXR0ZXJ8fGZ1bmN0aW9uKHQpe3JldHVybiB6KHQ9WSh0KT90Olt0XSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gbXAodCxZKGQpP2RbZV06ZCx1KX0pKX07aWYoIW98fCFhKXt2YXIgYz1zPyIiOnQubWFya3VwU3R5bGVDcmVhdG9yLm1ha2VUb29sdGlwTWFya2VyKGUubWFya2VyVHlwZSxlLm1hcmtlckNvbG9yfHwiIzMzMyIscikscD1vPyIiOm1wKGwsIm9yZGluYWwiLHUpLGQ9ZS52YWx1ZVR5cGUsZj1hP1tdOmgoZS52YWx1ZSxlLmRhdGFJbmRleCksZz0hc3x8IW8seT0hcyYmbyx2PW5nKGksciksbT12Lm5hbWVTdHlsZSx4PXYudmFsdWVTdHlsZTtyZXR1cm4icmljaFRleHQiPT09cj8ocz8iIjpjKSsobz8iIjpkZyh0LHAsbSkpKyhhPyIiOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89W3JdLGE9aT8xMDoyMDtyZXR1cm4gbiYmby5wdXNoKHtwYWRkaW5nOlswLDAsMCxhXSxhbGlnbjoicmlnaHQifSksdC5tYXJrdXBTdHlsZUNyZWF0b3Iud3JhcFJpY2hUZXh0U3R5bGUoWShlKT9lLmpvaW4oIiAgIik6ZSxvKX0odCxmLGcseSx4KSk6cGcoKHM/IiI6YykrKG8/IiI6ZnVuY3Rpb24odCxlLG4pe3JldHVybic8c3BhbiBzdHlsZT0iJytuKyI7IisoZT8ibWFyZ2luLWxlZnQ6MnB4IjoiIikrJyI+JytyZSh0KSsiPC9zcGFuPiJ9KHAsIXMsbSkpKyhhPyIiOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4/IjEwcHgiOiIyMHB4IixvPWU/ImZsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OiIrcjoiIjtyZXR1cm4gdD1ZKHQpP3Q6W3RdLCc8c3BhbiBzdHlsZT0iJytvKyI7IitpKyciPicreih0LChmdW5jdGlvbih0KXtyZXR1cm4gcmUodCl9KSkuam9pbigiJm5ic3A7Jm5ic3A7IikrIjwvc3Bhbj4ifShmLGcseSx4KSksbil9fWZ1bmN0aW9uIGNnKHQsZSxuLGkscixvKXtpZih0KXJldHVybiBzZyh0KSh7dXNlVVRDOnIscmVuZGVyTW9kZTpuLG9yZGVyTW9kZTppLG1hcmt1cFN0eWxlQ3JlYXRvcjplLHZhbHVlRm9ybWF0dGVyOnQudmFsdWVGb3JtYXR0ZXJ9LHQsMCxvKX1mdW5jdGlvbiBwZyh0LGUpe3JldHVybic8ZGl2IHN0eWxlPSInKygibWFyZ2luOiAiK2UrInB4IDAgMCIpKyI7IitlZysnOyI+Jyt0Kyc8ZGl2IHN0eWxlPSJjbGVhcjpib3RoIj48L2Rpdj48L2Rpdj4nfWZ1bmN0aW9uIGRnKHQsZSxuKXtyZXR1cm4gdC5tYXJrdXBTdHlsZUNyZWF0b3Iud3JhcFJpY2hUZXh0U3R5bGUoZSxuKX1mdW5jdGlvbiBmZyh0LGUpe3JldHVybiBTcCh0LmdldERhdGEoKS5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIilbdC52aXN1YWxEcmF3VHlwZV0pfWZ1bmN0aW9uIGdnKHQsZSl7dmFyIG49dC5nZXQoInBhZGRpbmciKTtyZXR1cm4gbnVsbCE9bj9uOiJyaWNoVGV4dCI9PT1lP1s4LDEwXToxMH12YXIgeWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5yaWNoVGV4dFN0eWxlcz17fSx0aGlzLl9uZXh0U3R5bGVOYW1lSWQ9bW8oKX1yZXR1cm4gdC5wcm90b3R5cGUuX2dlbmVyYXRlU3R5bGVOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIl9fRUNfYVVUb18iK3RoaXMuX25leHRTdHlsZU5hbWVJZCsrfSx0LnByb3RvdHlwZS5tYWtlVG9vbHRpcE1hcmtlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9InJpY2hUZXh0Ij09PW4/dGhpcy5fZ2VuZXJhdGVTdHlsZU5hbWUoKTpudWxsLHI9d3Aoe2NvbG9yOmUsdHlwZTp0LHJlbmRlck1vZGU6bixtYXJrZXJJZDppfSk7cmV0dXJuIFUocik/cjoodGhpcy5yaWNoVGV4dFN0eWxlc1tpXT1yLnN0eWxlLHIuY29udGVudCl9LHQucHJvdG90eXBlLndyYXBSaWNoVGV4dFN0eWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307WShlKT9FKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBBKG4sdCl9KSk6QShuLGUpO3ZhciBpPXRoaXMuX2dlbmVyYXRlU3R5bGVOYW1lKCk7cmV0dXJuIHRoaXMucmljaFRleHRTdHlsZXNbaV09biwieyIraSsifCIrdCsifSJ9LHR9KCk7ZnVuY3Rpb24gdmcodCl7dmFyIGUsbixpLHIsbz10LnNlcmllcyxhPXQuZGF0YUluZGV4LHM9dC5tdWx0aXBsZVNlcmllcyxsPW8uZ2V0RGF0YSgpLHU9bC5tYXBEaW1lbnNpb25zQWxsKCJkZWZhdWx0ZWRUb29sdGlwIiksaD11Lmxlbmd0aCxjPW8uZ2V0UmF3VmFsdWUoYSkscD1ZKGMpLGQ9ZmcobyxhKTtpZihoPjF8fHAmJiFoKXt2YXIgZj1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPWUuZ2V0RGF0YSgpLGE9Vih0LChmdW5jdGlvbih0LGUsbil7dmFyIGk9by5nZXREaW1lbnNpb25JbmZvKG4pO3JldHVybiB0fHxpJiYhMSE9PWkudG9vbHRpcCYmbnVsbCE9aS5kaXNwbGF5TmFtZX0pLCExKSxzPVtdLGw9W10sdT1bXTtmdW5jdGlvbiBoKHQsZSl7dmFyIG49by5nZXREaW1lbnNpb25JbmZvKGUpO24mJiExIT09bi5vdGhlckRpbXMudG9vbHRpcCYmKGE/dS5wdXNoKG9nKCJuYW1lVmFsdWUiLHttYXJrZXJUeXBlOiJzdWJJdGVtIixtYXJrZXJDb2xvcjpyLG5hbWU6bi5kaXNwbGF5TmFtZSx2YWx1ZTp0LHZhbHVlVHlwZTpuLnR5cGV9KSk6KHMucHVzaCh0KSxsLnB1c2gobi50eXBlKSkpfXJldHVybiBpLmxlbmd0aD9FKGksKGZ1bmN0aW9uKHQpe2gobWYobyxuLHQpLHQpfSkpOkUodCxoKSx7aW5saW5lVmFsdWVzOnMsaW5saW5lVmFsdWVUeXBlczpsLGJsb2Nrczp1fX0oYyxvLGEsdSxkKTtlPWYuaW5saW5lVmFsdWVzLG49Zi5pbmxpbmVWYWx1ZVR5cGVzLGk9Zi5ibG9ja3Mscj1mLmlubGluZVZhbHVlc1swXX1lbHNlIGlmKGgpe3ZhciBnPWwuZ2V0RGltZW5zaW9uSW5mbyh1WzBdKTtyPWU9bWYobCxhLHVbMF0pLG49Zy50eXBlfWVsc2Ugcj1lPXA/Y1swXTpjO3ZhciB5PU5vKG8pLHY9eSYmby5uYW1lfHwiIixtPWwuZ2V0TmFtZShhKSx4PXM/djptO3JldHVybiBvZygic2VjdGlvbiIse2hlYWRlcjp2LG5vSGVhZGVyOnN8fCF5LHNvcnRQYXJhbTpyLGJsb2Nrczpbb2coIm5hbWVWYWx1ZSIse21hcmtlclR5cGU6Iml0ZW0iLG1hcmtlckNvbG9yOmQsbmFtZTp4LG5vTmFtZTohdXQoeCksdmFsdWU6ZSx2YWx1ZVR5cGU6bixkYXRhSW5kZXg6YX0pXS5jb25jYXQoaXx8W10pfSl9dmFyIG1nPVZvKCk7ZnVuY3Rpb24geGcodCxlKXtyZXR1cm4gdC5nZXROYW1lKGUpfHx0LmdldElkKGUpfXZhciBfZz0iX191bml2ZXJzYWxUcmFuc2l0aW9uRW5hYmxlZCIsYmc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fc2VsZWN0ZWREYXRhSW5kaWNlc01hcD17fSxlfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUsbil7dGhpcy5zZXJpZXNJbmRleD10aGlzLmNvbXBvbmVudEluZGV4LHRoaXMuZGF0YVRhc2s9d2Yoe2NvdW50OlNnLHJlc2V0Ok1nfSksdGhpcy5kYXRhVGFzay5jb250ZXh0PXttb2RlbDp0aGlzfSx0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsbiksKG1nKHRoaXMpLnNvdXJjZU1hbmFnZXI9bmV3ICRmKHRoaXMpKS5wcmVwYXJlU291cmNlKCk7dmFyIGk9dGhpcy5nZXRJbml0aWFsRGF0YSh0LG4pO1RnKGksdGhpcyksdGhpcy5kYXRhVGFzay5jb250ZXh0LmRhdGE9aSxtZyh0aGlzKS5kYXRhQmVmb3JlUHJvY2Vzc2VkPWksd2codGhpcyksdGhpcy5faW5pdFNlbGVjdGVkTWFwRnJvbURhdGEoaSl9LGUucHJvdG90eXBlLm1lcmdlRGVmYXVsdEFuZFRoZW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG49UHAodGhpcyksaT1uP1JwKHQpOnt9LHI9dGhpcy5zdWJUeXBlO3pwLmhhc0NsYXNzKHIpJiYocis9IlNlcmllcyIpLEModCxlLmdldFRoZW1lKCkuZ2V0KHRoaXMuc3ViVHlwZSkpLEModCx0aGlzLmdldERlZmF1bHRPcHRpb24oKSksQ28odCwibGFiZWwiLFsic2hvdyJdKSx0aGlzLmZpbGxEYXRhVGV4dFN0eWxlKHQuZGF0YSksbiYmT3AodCxpLG4pfSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbih0LGUpe3Q9Qyh0aGlzLm9wdGlvbix0LCEwKSx0aGlzLmZpbGxEYXRhVGV4dFN0eWxlKHQuZGF0YSk7dmFyIG49UHAodGhpcyk7biYmT3AodGhpcy5vcHRpb24sdCxuKTt2YXIgaT1tZyh0aGlzKS5zb3VyY2VNYW5hZ2VyO2kuZGlydHkoKSxpLnByZXBhcmVTb3VyY2UoKTt2YXIgcj10aGlzLmdldEluaXRpYWxEYXRhKHQsZSk7VGcocix0aGlzKSx0aGlzLmRhdGFUYXNrLmRpcnR5KCksdGhpcy5kYXRhVGFzay5jb250ZXh0LmRhdGE9cixtZyh0aGlzKS5kYXRhQmVmb3JlUHJvY2Vzc2VkPXIsd2codGhpcyksdGhpcy5faW5pdFNlbGVjdGVkTWFwRnJvbURhdGEocil9LGUucHJvdG90eXBlLmZpbGxEYXRhVGV4dFN0eWxlPWZ1bmN0aW9uKHQpe2lmKHQmJiEkKHQpKWZvcih2YXIgZT1bInNob3ciXSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXSYmdFtuXS5sYWJlbCYmQ28odFtuXSwibGFiZWwiLGUpfSxlLnByb3RvdHlwZS5nZXRJbml0aWFsRGF0YT1mdW5jdGlvbih0LGUpe30sZS5wcm90b3R5cGUuYXBwZW5kRGF0YT1mdW5jdGlvbih0KXt0aGlzLmdldFJhd0RhdGEoKS5hcHBlbmREYXRhKHQuZGF0YSl9LGUucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24odCl7dmFyIGU9RGcodGhpcyk7aWYoZSl7dmFyIG49ZS5jb250ZXh0LmRhdGE7cmV0dXJuIG51bGwhPXQmJm4uZ2V0TGlua2VkRGF0YT9uLmdldExpbmtlZERhdGEodCk6bn1yZXR1cm4gbWcodGhpcykuZGF0YX0sZS5wcm90b3R5cGUuZ2V0QWxsRGF0YT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0RGF0YSgpO3JldHVybiB0JiZ0LmdldExpbmtlZERhdGFBbGw/dC5nZXRMaW5rZWREYXRhQWxsKCk6W3tkYXRhOnR9XX0sZS5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt2YXIgZT1EZyh0aGlzKTtpZihlKXt2YXIgbj1lLmNvbnRleHQ7bi5vdXRwdXREYXRhPXQsZSE9PXRoaXMuZGF0YVRhc2smJihuLmRhdGE9dCl9bWcodGhpcykuZGF0YT10fSxlLnByb3RvdHlwZS5nZXRFbmNvZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldCgiZW5jb2RlIiwhMCk7aWYodClyZXR1cm4geXQodCl9LGUucHJvdG90eXBlLmdldFNvdXJjZU1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbWcodGhpcykuc291cmNlTWFuYWdlcn0sZS5wcm90b3R5cGUuZ2V0U291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U291cmNlTWFuYWdlcigpLmdldFNvdXJjZSgpfSxlLnByb3RvdHlwZS5nZXRSYXdEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIG1nKHRoaXMpLmRhdGFCZWZvcmVQcm9jZXNzZWR9LGUucHJvdG90eXBlLmdldENvbG9yQnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoImNvbG9yQnkiKXx8InNlcmllcyJ9LGUucHJvdG90eXBlLmlzQ29sb3JCeVNlcmllcz1mdW5jdGlvbigpe3JldHVybiJzZXJpZXMiPT09dGhpcy5nZXRDb2xvckJ5KCl9LGUucHJvdG90eXBlLmdldEJhc2VBeGlzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb29yZGluYXRlU3lzdGVtO3JldHVybiB0JiZ0LmdldEJhc2VBeGlzJiZ0LmdldEJhc2VBeGlzKCl9LGUucHJvdG90eXBlLmZvcm1hdFRvb2x0aXA9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2Zyh7c2VyaWVzOnRoaXMsZGF0YUluZGV4OnQsbXVsdGlwbGVTZXJpZXM6ZX0pfSxlLnByb3RvdHlwZS5pc0FuaW1hdGlvbkVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVjTW9kZWw7aWYoci5ub2RlJiYoIXR8fCF0LnNzcikpcmV0dXJuITE7dmFyIGU9dGhpcy5nZXRTaGFsbG93KCJhbmltYXRpb24iKTtyZXR1cm4gZSYmdGhpcy5nZXREYXRhKCkuY291bnQoKT50aGlzLmdldFNoYWxsb3coImFuaW1hdGlvblRocmVzaG9sZCIpJiYoZT0hMSksISFlfSxlLnByb3RvdHlwZS5yZXN0b3JlRGF0YT1mdW5jdGlvbigpe3RoaXMuZGF0YVRhc2suZGlydHkoKX0sZS5wcm90b3R5cGUuZ2V0Q29sb3JGcm9tUGFsZXR0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5lY01vZGVsLHI9Y2QucHJvdG90eXBlLmdldENvbG9yRnJvbVBhbGV0dGUuY2FsbCh0aGlzLHQsZSxuKTtyZXR1cm4gcnx8KHI9aS5nZXRDb2xvckZyb21QYWxldHRlKHQsZSxuKSkscn0sZS5wcm90b3R5cGUuY29vcmREaW1Ub0RhdGFEaW09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0UmF3RGF0YSgpLm1hcERpbWVuc2lvbnNBbGwodCl9LGUucHJvdG90eXBlLmdldFByb2dyZXNzaXZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJwcm9ncmVzc2l2ZSIpfSxlLnByb3RvdHlwZS5nZXRQcm9ncmVzc2l2ZVRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgicHJvZ3Jlc3NpdmVUaHJlc2hvbGQiKX0sZS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKHQsZSl7dGhpcy5faW5uZXJTZWxlY3QodGhpcy5nZXREYXRhKGUpLHQpfSxlLnByb3RvdHlwZS51bnNlbGVjdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9uLnNlbGVjdGVkTWFwO2lmKG4pe3ZhciBpPXRoaXMub3B0aW9uLnNlbGVjdGVkTW9kZSxyPXRoaXMuZ2V0RGF0YShlKTtpZigic2VyaWVzIj09PWl8fCJhbGwiPT09bilyZXR1cm4gdGhpcy5vcHRpb24uc2VsZWN0ZWRNYXA9e30sdm9pZCh0aGlzLl9zZWxlY3RlZERhdGFJbmRpY2VzTWFwPXt9KTtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIGE9eGcocix0W29dKTtuW2FdPSExLHRoaXMuX3NlbGVjdGVkRGF0YUluZGljZXNNYXBbYV09LTF9fX0sZS5wcm90b3R5cGUudG9nZ2xlU2VsZWN0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLGk9MDtpPHQubGVuZ3RoO2krKyluWzBdPXRbaV0sdGhpcy5pc1NlbGVjdGVkKHRbaV0sZSk/dGhpcy51bnNlbGVjdChuLGUpOnRoaXMuc2VsZWN0KG4sZSl9LGUucHJvdG90eXBlLmdldFNlbGVjdGVkRGF0YUluZGljZXM9ZnVuY3Rpb24oKXtpZigiYWxsIj09PXRoaXMub3B0aW9uLnNlbGVjdGVkTWFwKXJldHVybltdLnNsaWNlLmNhbGwodGhpcy5nZXREYXRhKCkuZ2V0SW5kaWNlcygpKTtmb3IodmFyIHQ9dGhpcy5fc2VsZWN0ZWREYXRhSW5kaWNlc01hcCxlPUcodCksbj1bXSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciByPXRbZVtpXV07cj49MCYmbi5wdXNoKHIpfXJldHVybiBufSxlLnByb3RvdHlwZS5pc1NlbGVjdGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5vcHRpb24uc2VsZWN0ZWRNYXA7aWYoIW4pcmV0dXJuITE7dmFyIGk9dGhpcy5nZXREYXRhKGUpO3JldHVybigiYWxsIj09PW58fG5beGcoaSx0KV0pJiYhaS5nZXRJdGVtTW9kZWwodCkuZ2V0KFsic2VsZWN0IiwiZGlzYWJsZWQiXSl9LGUucHJvdG90eXBlLmlzVW5pdmVyc2FsVHJhbnNpdGlvbkVuYWJsZWQ9ZnVuY3Rpb24oKXtpZih0aGlzW19nXSlyZXR1cm4hMDt2YXIgdD10aGlzLm9wdGlvbi51bml2ZXJzYWxUcmFuc2l0aW9uO3JldHVybiEhdCYmKCEwPT09dHx8dCYmdC5lbmFibGVkKX0sZS5wcm90b3R5cGUuX2lubmVyU2VsZWN0PWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyPXRoaXMub3B0aW9uLG89ci5zZWxlY3RlZE1vZGUsYT1lLmxlbmd0aDtpZihvJiZhKWlmKCJzZXJpZXMiPT09bylyLnNlbGVjdGVkTWFwPSJhbGwiO2Vsc2UgaWYoIm11bHRpcGxlIj09PW8pe3Eoci5zZWxlY3RlZE1hcCl8fChyLnNlbGVjdGVkTWFwPXt9KTtmb3IodmFyIHM9ci5zZWxlY3RlZE1hcCxsPTA7bDxhO2wrKyl7dmFyIHU9ZVtsXTtzW2M9eGcodCx1KV09ITAsdGhpcy5fc2VsZWN0ZWREYXRhSW5kaWNlc01hcFtjXT10LmdldFJhd0luZGV4KHUpfX1lbHNlIGlmKCJzaW5nbGUiPT09b3x8ITA9PT1vKXt2YXIgaD1lW2EtMV0sYz14Zyh0LGgpO3Iuc2VsZWN0ZWRNYXA9KChuPXt9KVtjXT0hMCxuKSx0aGlzLl9zZWxlY3RlZERhdGFJbmRpY2VzTWFwPSgoaT17fSlbY109dC5nZXRSYXdJbmRleChoKSxpKX19LGUucHJvdG90eXBlLl9pbml0U2VsZWN0ZWRNYXBGcm9tRGF0YT1mdW5jdGlvbih0KXtpZighdGhpcy5vcHRpb24uc2VsZWN0ZWRNYXApe3ZhciBlPVtdO3QuaGFzSXRlbU9wdGlvbiYmdC5lYWNoKChmdW5jdGlvbihuKXt2YXIgaT10LmdldFJhd0RhdGFJdGVtKG4pO2kmJmkuc2VsZWN0ZWQmJmUucHVzaChuKX0pKSxlLmxlbmd0aD4wJiZ0aGlzLl9pbm5lclNlbGVjdCh0LGUpfX0sZS5yZWdpc3RlckNsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB6cC5yZWdpc3RlckNsYXNzKHQpfSxlLnByb3RvSW5pdGlhbGl6ZT1mdW5jdGlvbigpe3ZhciB0PWUucHJvdG90eXBlO3QudHlwZT0ic2VyaWVzLl9fYmFzZV9fIix0LnNlcmllc0luZGV4PTAsdC5pZ25vcmVTdHlsZU9uRGF0YT0hMSx0Lmhhc1N5bWJvbFZpc3VhbD0hMSx0LmRlZmF1bHRTeW1ib2w9ImNpcmNsZSIsdC52aXN1YWxTdHlsZUFjY2Vzc1BhdGg9Iml0ZW1TdHlsZSIsdC52aXN1YWxEcmF3VHlwZT0iZmlsbCJ9KCksZX0oenApO2Z1bmN0aW9uIHdnKHQpe3ZhciBlPXQubmFtZTtObyh0KXx8KHQubmFtZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldFJhd0RhdGEoKSxuPWUubWFwRGltZW5zaW9uc0FsbCgic2VyaWVzTmFtZSIpLGk9W107cmV0dXJuIEUobiwoZnVuY3Rpb24odCl7dmFyIG49ZS5nZXREaW1lbnNpb25JbmZvKHQpO24uZGlzcGxheU5hbWUmJmkucHVzaChuLmRpc3BsYXlOYW1lKX0pKSxpLmpvaW4oIiAiKX0odCl8fGUpfWZ1bmN0aW9uIFNnKHQpe3JldHVybiB0Lm1vZGVsLmdldFJhd0RhdGEoKS5jb3VudCgpfWZ1bmN0aW9uIE1nKHQpe3ZhciBlPXQubW9kZWw7cmV0dXJuIGUuc2V0RGF0YShlLmdldFJhd0RhdGEoKS5jbG9uZVNoYWxsb3coKSksSWd9ZnVuY3Rpb24gSWcodCxlKXtlLm91dHB1dERhdGEmJnQuZW5kPmUub3V0cHV0RGF0YS5jb3VudCgpJiZlLm1vZGVsLmdldFJhd0RhdGEoKS5jbG9uZVNoYWxsb3coZS5vdXRwdXREYXRhKX1mdW5jdGlvbiBUZyh0LGUpe0UodnQodC5DSEFOR0FCTEVfTUVUSE9EUyx0LkRPV05TQU1QTEVfTUVUSE9EUyksKGZ1bmN0aW9uKG4pe3Qud3JhcE1ldGhvZChuLEgoQ2csZSkpfSkpfWZ1bmN0aW9uIENnKHQsZSl7dmFyIG49RGcodCk7cmV0dXJuIG4mJm4uc2V0T3V0cHV0RW5kKChlfHx0aGlzKS5jb3VudCgpKSxlfWZ1bmN0aW9uIERnKHQpe3ZhciBlPSh0LmVjTW9kZWx8fHt9KS5zY2hlZHVsZXIsbj1lJiZlLmdldFBpcGVsaW5lKHQudWlkKTtpZihuKXt2YXIgaT1uLmN1cnJlbnRUYXNrO2lmKGkpe3ZhciByPWkuYWdlbnRTdHViTWFwO3ImJihpPXIuZ2V0KHQudWlkKSl9cmV0dXJuIGl9fVIoYmcsX2YpLFIoYmcsY2QpLEpvKGJnLHpwKTt2YXIgQWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5ncm91cD1uZXcgQnIsdGhpcy51aWQ9QWMoInZpZXdDb21wb25lbnQiKX1yZXR1cm4gdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe30sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe30sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbih0LGUpe30sdC5wcm90b3R5cGUudXBkYXRlVmlldz1mdW5jdGlvbih0LGUsbixpKXt9LHQucHJvdG90eXBlLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0LGUsbixpKXt9LHQucHJvdG90eXBlLnVwZGF0ZVZpc3VhbD1mdW5jdGlvbih0LGUsbixpKXt9LHQucHJvdG90eXBlLnRvZ2dsZUJsdXJTZXJpZXM9ZnVuY3Rpb24odCxlLG4pe30sdC5wcm90b3R5cGUuZWFjaFJlbmRlcmVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXA7ZSYmZS50cmF2ZXJzZSh0KX0sdH0oKTtmdW5jdGlvbiBrZygpe3ZhciB0PVZvKCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXQoZSksaT1lLnBpcGVsaW5lQ29udGV4dCxyPSEhbi5sYXJnZSxvPSEhbi5wcm9ncmVzc2l2ZVJlbmRlcixhPW4ubGFyZ2U9ISghaXx8IWkubGFyZ2UpLHM9bi5wcm9ncmVzc2l2ZVJlbmRlcj0hKCFpfHwhaS5wcm9ncmVzc2l2ZVJlbmRlcik7cmV0dXJuIShyPT09YSYmbz09PXMpJiYicmVzZXQifX0kbyhBZyksbmEoQWcpO3ZhciBMZz1WbygpLFBnPWtnKCksT2c9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5ncm91cD1uZXcgQnIsdGhpcy51aWQ9QWMoInZpZXdDaGFydCIpLHRoaXMucmVuZGVyVGFzaz13Zih7cGxhbjpFZyxyZXNldDp6Z30pLHRoaXMucmVuZGVyVGFzay5jb250ZXh0PXt2aWV3OnRoaXN9fXJldHVybiB0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSl7fSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4saSl7MH0sdC5wcm90b3R5cGUuaGlnaGxpZ2h0PWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuZ2V0RGF0YShpJiZpLmRhdGFUeXBlKTtyJiZOZyhyLGksImVtcGhhc2lzIil9LHQucHJvdG90eXBlLmRvd25wbGF5PWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuZ2V0RGF0YShpJiZpLmRhdGFUeXBlKTtyJiZOZyhyLGksIm5vcm1hbCIpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKHQsZSl7fSx0LnByb3RvdHlwZS51cGRhdGVWaWV3PWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMucmVuZGVyKHQsZSxuLGkpfSx0LnByb3RvdHlwZS51cGRhdGVMYXlvdXQ9ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5yZW5kZXIodCxlLG4saSl9LHQucHJvdG90eXBlLnVwZGF0ZVZpc3VhbD1mdW5jdGlvbih0LGUsbixpKXt0aGlzLnJlbmRlcih0LGUsbixpKX0sdC5wcm90b3R5cGUuZWFjaFJlbmRlcmVkPWZ1bmN0aW9uKHQpe0poKHRoaXMuZ3JvdXAsdCl9LHQubWFya1VwZGF0ZU1ldGhvZD1mdW5jdGlvbih0LGUpe0xnKHQpLnVwZGF0ZU1ldGhvZD1lfSx0LnByb3RvSW5pdGlhbGl6ZT12b2lkKHQucHJvdG90eXBlLnR5cGU9ImNoYXJ0IiksdH0oKTtmdW5jdGlvbiBSZyh0LGUsbil7dCYmUWwodCkmJigiZW1waGFzaXMiPT09ZT9PbDpSbCkodCxuKX1mdW5jdGlvbiBOZyh0LGUsbil7dmFyIGk9em8odCxlKSxyPWUmJm51bGwhPWUuaGlnaGxpZ2h0S2V5P2Z1bmN0aW9uKHQpe3ZhciBlPXNsW3RdO3JldHVybiBudWxsPT1lJiZhbDw9MzImJihlPXNsW3RdPWFsKyspLGV9KGUuaGlnaGxpZ2h0S2V5KTpudWxsO251bGwhPWk/RShUbyhpKSwoZnVuY3Rpb24oZSl7UmcodC5nZXRJdGVtR3JhcGhpY0VsKGUpLG4scil9KSk6dC5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCl7UmcodCxuLHIpfSkpfWZ1bmN0aW9uIEVnKHQpe3JldHVybiBQZyh0Lm1vZGVsKX1mdW5jdGlvbiB6Zyh0KXt2YXIgZT10Lm1vZGVsLG49dC5lY01vZGVsLGk9dC5hcGkscj10LnBheWxvYWQsbz1lLnBpcGVsaW5lQ29udGV4dC5wcm9ncmVzc2l2ZVJlbmRlcixhPXQudmlldyxzPXImJkxnKHIpLnVwZGF0ZU1ldGhvZCxsPW8/ImluY3JlbWVudGFsUHJlcGFyZVJlbmRlciI6cyYmYVtzXT9zOiJyZW5kZXIiO3JldHVybiJyZW5kZXIiIT09bCYmYVtsXShlLG4saSxyKSxWZ1tsXX0kbyhPZyksbmEoT2cpO3ZhciBWZz17aW5jcmVtZW50YWxQcmVwYXJlUmVuZGVyOntwcm9ncmVzczpmdW5jdGlvbih0LGUpe2Uudmlldy5pbmNyZW1lbnRhbFJlbmRlcih0LGUubW9kZWwsZS5lY01vZGVsLGUuYXBpLGUucGF5bG9hZCl9fSxyZW5kZXI6e2ZvcmNlRmlyc3RQcm9ncmVzczohMCxwcm9ncmVzczpmdW5jdGlvbih0LGUpe2Uudmlldy5yZW5kZXIoZS5tb2RlbCxlLmVjTW9kZWwsZS5hcGksZS5wYXlsb2FkKX19fSxCZz0iXDBfX3Rocm90dGxlT3JpZ2luTWV0aG9kIixGZz0iXDBfX3Rocm90dGxlUmF0ZSIsR2c9IlwwX190aHJvdHRsZVR5cGUiO2Z1bmN0aW9uIFdnKHQsZSxuKXt2YXIgaSxyLG8sYSxzLGw9MCx1PTAsaD1udWxsO2Z1bmN0aW9uIGMoKXt1PShuZXcgRGF0ZSkuZ2V0VGltZSgpLGg9bnVsbCx0LmFwcGx5KG8sYXx8W10pfWU9ZXx8MDt2YXIgcD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxwPTA7cDxhcmd1bWVudHMubGVuZ3RoO3ArKyl0W3BdPWFyZ3VtZW50c1twXTtpPShuZXcgRGF0ZSkuZ2V0VGltZSgpLG89dGhpcyxhPXQ7dmFyIGQ9c3x8ZSxmPXN8fG47cz1udWxsLHI9aS0oZj9sOnUpLWQsY2xlYXJUaW1lb3V0KGgpLGY/aD1zZXRUaW1lb3V0KGMsZCk6cj49MD9jKCk6aD1zZXRUaW1lb3V0KGMsLXIpLGw9aX07cmV0dXJuIHAuY2xlYXI9ZnVuY3Rpb24oKXtoJiYoY2xlYXJUaW1lb3V0KGgpLGg9bnVsbCl9LHAuZGVib3VuY2VOZXh0Q2FsbD1mdW5jdGlvbih0KXtzPXR9LHB9ZnVuY3Rpb24gSGcodCxlLG4saSl7dmFyIHI9dFtlXTtpZihyKXt2YXIgbz1yW0JnXXx8cixhPXJbR2ddO2lmKHJbRmddIT09bnx8YSE9PWkpe2lmKG51bGw9PW58fCFpKXJldHVybiB0W2VdPW87KHI9dFtlXT1XZyhvLG4sImRlYm91bmNlIj09PWkpKVtCZ109byxyW0dnXT1pLHJbRmddPW59cmV0dXJuIHJ9fWZ1bmN0aW9uIFlnKHQsZSl7dmFyIG49dFtlXTtuJiZuW0JnXSYmKG4uY2xlYXImJm4uY2xlYXIoKSx0W2VdPW5bQmddKX12YXIgWGc9Vm8oKSxVZz17aXRlbVN0eWxlOmlhKE1jLCEwKSxsaW5lU3R5bGU6aWEoYmMsITApfSxaZz17bGluZVN0eWxlOiJzdHJva2UiLGl0ZW1TdHlsZToiZmlsbCJ9O2Z1bmN0aW9uIGpnKHQsZSl7dmFyIG49dC52aXN1YWxTdHlsZU1hcHBlcnx8VWdbZV07cmV0dXJuIG58fChjb25zb2xlLndhcm4oIlVua25vd24gc3R5bGUgdHlwZSAnIitlKyInLiIpLFVnLml0ZW1TdHlsZSl9ZnVuY3Rpb24gcWcodCxlKXt2YXIgbj10LnZpc3VhbERyYXdUeXBlfHxaZ1tlXTtyZXR1cm4gbnx8KGNvbnNvbGUud2FybigiVW5rbm93biBzdHlsZSB0eXBlICciK2UrIicuIiksImZpbGwiKX12YXIgS2c9e2NyZWF0ZU9uQWxsU2VyaWVzOiEwLHBlcmZvcm1SYXdTZXJpZXM6ITAscmVzZXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldERhdGEoKSxpPXQudmlzdWFsU3R5bGVBY2Nlc3NQYXRofHwiaXRlbVN0eWxlIixyPXQuZ2V0TW9kZWwoaSksbz1qZyh0LGkpKHIpLGE9ci5nZXRTaGFsbG93KCJkZWNhbCIpO2EmJihuLnNldFZpc3VhbCgiZGVjYWwiLGEpLGEuZGlydHk9ITApO3ZhciBzPXFnKHQsaSksbD1vW3NdLHU9WChsKT9sOm51bGwsaD0iYXV0byI9PT1vLmZpbGx8fCJhdXRvIj09PW8uc3Ryb2tlO2lmKCFvW3NdfHx1fHxoKXt2YXIgYz10LmdldENvbG9yRnJvbVBhbGV0dGUodC5uYW1lLG51bGwsZS5nZXRTZXJpZXNDb3VudCgpKTtvW3NdfHwob1tzXT1jLG4uc2V0VmlzdWFsKCJjb2xvckZyb21QYWxldHRlIiwhMCkpLG8uZmlsbD0iYXV0byI9PT1vLmZpbGx8fFgoby5maWxsKT9jOm8uZmlsbCxvLnN0cm9rZT0iYXV0byI9PT1vLnN0cm9rZXx8WChvLnN0cm9rZSk/YzpvLnN0cm9rZX1pZihuLnNldFZpc3VhbCgic3R5bGUiLG8pLG4uc2V0VmlzdWFsKCJkcmF3VHlwZSIscyksIWUuaXNTZXJpZXNGaWx0ZXJlZCh0KSYmdSlyZXR1cm4gbi5zZXRWaXN1YWwoImNvbG9yRnJvbVBhbGV0dGUiLCExKSx7ZGF0YUVhY2g6ZnVuY3Rpb24oZSxuKXt2YXIgaT10LmdldERhdGFQYXJhbXMobikscj1BKHt9LG8pO3Jbc109dShpKSxlLnNldEl0ZW1WaXN1YWwobiwic3R5bGUiLHIpfX19fSwkZz1uZXcgQ2MsSmc9e2NyZWF0ZU9uQWxsU2VyaWVzOiEwLHBlcmZvcm1SYXdTZXJpZXM6ITAscmVzZXQ6ZnVuY3Rpb24odCxlKXtpZighdC5pZ25vcmVTdHlsZU9uRGF0YSYmIWUuaXNTZXJpZXNGaWx0ZXJlZCh0KSl7dmFyIG49dC5nZXREYXRhKCksaT10LnZpc3VhbFN0eWxlQWNjZXNzUGF0aHx8Iml0ZW1TdHlsZSIscj1qZyh0LGkpLG89bi5nZXRWaXN1YWwoImRyYXdUeXBlIik7cmV0dXJue2RhdGFFYWNoOm4uaGFzSXRlbU9wdGlvbj9mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0UmF3RGF0YUl0ZW0oZSk7aWYobiYmbltpXSl7JGcub3B0aW9uPW5baV07dmFyIGE9cigkZyk7QSh0LmVuc3VyZVVuaXF1ZUl0ZW1WaXN1YWwoZSwic3R5bGUiKSxhKSwkZy5vcHRpb24uZGVjYWwmJih0LnNldEl0ZW1WaXN1YWwoZSwiZGVjYWwiLCRnLm9wdGlvbi5kZWNhbCksJGcub3B0aW9uLmRlY2FsLmRpcnR5PSEwKSxvIGluIGEmJnQuc2V0SXRlbVZpc3VhbChlLCJjb2xvckZyb21QYWxldHRlIiwhMSl9fTpudWxsfX19fSxRZz17cGVyZm9ybVJhd1NlcmllczohMCxvdmVyYWxsUmVzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9eXQoKTt0LmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0Q29sb3JCeSgpO2lmKCF0LmlzQ29sb3JCeVNlcmllcygpKXt2YXIgaT10LnR5cGUrIi0iK24scj1lLmdldChpKTtyfHwocj17fSxlLnNldChpLHIpKSxYZyh0KS5zY29wZT1yfX0pKSx0LmVhY2hTZXJpZXMoKGZ1bmN0aW9uKGUpe2lmKCFlLmlzQ29sb3JCeVNlcmllcygpJiYhdC5pc1Nlcmllc0ZpbHRlcmVkKGUpKXt2YXIgbj1lLmdldFJhd0RhdGEoKSxpPXt9LHI9ZS5nZXREYXRhKCksbz1YZyhlKS5zY29wZSxhPWUudmlzdWFsU3R5bGVBY2Nlc3NQYXRofHwiaXRlbVN0eWxlIixzPXFnKGUsYSk7ci5lYWNoKChmdW5jdGlvbih0KXt2YXIgZT1yLmdldFJhd0luZGV4KHQpO2lbZV09dH0pKSxuLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBhPWlbdF07aWYoci5nZXRJdGVtVmlzdWFsKGEsImNvbG9yRnJvbVBhbGV0dGUiKSl7dmFyIGw9ci5lbnN1cmVVbmlxdWVJdGVtVmlzdWFsKGEsInN0eWxlIiksdT1uLmdldE5hbWUodCl8fHQrIiIsaD1uLmNvdW50KCk7bFtzXT1lLmdldENvbG9yRnJvbVBhbGV0dGUodSxvLGgpfX0pKX19KSl9fSx0eT1NYXRoLlBJO3ZhciBleT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSl7dGhpcy5fc3RhZ2VUYXNrTWFwPXl0KCksdGhpcy5lY0luc3RhbmNlPXQsdGhpcy5hcGk9ZSxuPXRoaXMuX2RhdGFQcm9jZXNzb3JIYW5kbGVycz1uLnNsaWNlKCksaT10aGlzLl92aXN1YWxIYW5kbGVycz1pLnNsaWNlKCksdGhpcy5fYWxsSGFuZGxlcnM9bi5jb25jYXQoaSl9cmV0dXJuIHQucHJvdG90eXBlLnJlc3RvcmVEYXRhPWZ1bmN0aW9uKHQsZSl7dC5yZXN0b3JlRGF0YShlKSx0aGlzLl9zdGFnZVRhc2tNYXAuZWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5vdmVyYWxsVGFzaztlJiZlLmRpcnR5KCl9KSl9LHQucHJvdG90eXBlLmdldFBlcmZvcm1BcmdzPWZ1bmN0aW9uKHQsZSl7aWYodC5fX3BpcGVsaW5lKXt2YXIgbj10aGlzLl9waXBlbGluZU1hcC5nZXQodC5fX3BpcGVsaW5lLmlkKSxpPW4uY29udGV4dCxyPSFlJiZuLnByb2dyZXNzaXZlRW5hYmxlZCYmKCFpfHxpLnByb2dyZXNzaXZlUmVuZGVyKSYmdC5fX2lkeEluUGlwZWxpbmU+bi5ibG9ja0luZGV4P24uc3RlcDpudWxsLG89aSYmaS5tb2REYXRhQ291bnQ7cmV0dXJue3N0ZXA6cixtb2RCeTpudWxsIT1vP01hdGguY2VpbChvL3IpOm51bGwsbW9kRGF0YUNvdW50Om99fX0sdC5wcm90b3R5cGUuZ2V0UGlwZWxpbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BpcGVsaW5lTWFwLmdldCh0KX0sdC5wcm90b3R5cGUudXBkYXRlU3RyZWFtTW9kZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9waXBlbGluZU1hcC5nZXQodC51aWQpLGk9dC5nZXREYXRhKCkuY291bnQoKSxyPW4ucHJvZ3Jlc3NpdmVFbmFibGVkJiZlLmluY3JlbWVudGFsUHJlcGFyZVJlbmRlciYmaT49bi50aHJlc2hvbGQsbz10LmdldCgibGFyZ2UiKSYmaT49dC5nZXQoImxhcmdlVGhyZXNob2xkIiksYT0ibW9kIj09PXQuZ2V0KCJwcm9ncmVzc2l2ZUNodW5rTW9kZSIpP2k6bnVsbDt0LnBpcGVsaW5lQ29udGV4dD1uLmNvbnRleHQ9e3Byb2dyZXNzaXZlUmVuZGVyOnIsbW9kRGF0YUNvdW50OmEsbGFyZ2U6b319LHQucHJvdG90eXBlLnJlc3RvcmVQaXBlbGluZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUuX3BpcGVsaW5lTWFwPXl0KCk7dC5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXt2YXIgaT10LmdldFByb2dyZXNzaXZlKCkscj10LnVpZDtuLnNldChyLHtpZDpyLGhlYWQ6bnVsbCx0YWlsOm51bGwsdGhyZXNob2xkOnQuZ2V0UHJvZ3Jlc3NpdmVUaHJlc2hvbGQoKSxwcm9ncmVzc2l2ZUVuYWJsZWQ6aSYmISh0LnByZXZlbnRJbmNyZW1lbnRhbCYmdC5wcmV2ZW50SW5jcmVtZW50YWwoKSksYmxvY2tJbmRleDotMSxzdGVwOk1hdGgucm91bmQoaXx8NzAwKSxjb3VudDowfSksZS5fcGlwZSh0LHQuZGF0YVRhc2spfSkpfSx0LnByb3RvdHlwZS5wcmVwYXJlU3RhZ2VUYXNrcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YWdlVGFza01hcCxlPXRoaXMuYXBpLmdldE1vZGVsKCksbj10aGlzLmFwaTtFKHRoaXMuX2FsbEhhbmRsZXJzLChmdW5jdGlvbihpKXt2YXIgcj10LmdldChpLnVpZCl8fHQuc2V0KGkudWlkLHt9KSxvPSIiO2x0KCEoaS5yZXNldCYmaS5vdmVyYWxsUmVzZXQpLG8pLGkucmVzZXQmJnRoaXMuX2NyZWF0ZVNlcmllc1N0YWdlVGFzayhpLHIsZSxuKSxpLm92ZXJhbGxSZXNldCYmdGhpcy5fY3JlYXRlT3ZlcmFsbFN0YWdlVGFzayhpLHIsZSxuKX0pLHRoaXMpfSx0LnByb3RvdHlwZS5wcmVwYXJlVmlldz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LnJlbmRlclRhc2ssbz1yLmNvbnRleHQ7by5tb2RlbD1lLG8uZWNNb2RlbD1uLG8uYXBpPWksci5fX2Jsb2NrPSF0LmluY3JlbWVudGFsUHJlcGFyZVJlbmRlcix0aGlzLl9waXBlKGUscil9LHQucHJvdG90eXBlLnBlcmZvcm1EYXRhUHJvY2Vzc29yVGFza3M9ZnVuY3Rpb24odCxlKXt0aGlzLl9wZXJmb3JtU3RhZ2VUYXNrcyh0aGlzLl9kYXRhUHJvY2Vzc29ySGFuZGxlcnMsdCxlLHtibG9jazohMH0pfSx0LnByb3RvdHlwZS5wZXJmb3JtVmlzdWFsVGFza3M9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX3BlcmZvcm1TdGFnZVRhc2tzKHRoaXMuX3Zpc3VhbEhhbmRsZXJzLHQsZSxuKX0sdC5wcm90b3R5cGUuX3BlcmZvcm1TdGFnZVRhc2tzPWZ1bmN0aW9uKHQsZSxuLGkpe2k9aXx8e307dmFyIHI9ITEsbz10aGlzO2Z1bmN0aW9uIGEodCxlKXtyZXR1cm4gdC5zZXREaXJ0eSYmKCF0LmRpcnR5TWFwfHx0LmRpcnR5TWFwLmdldChlLl9fcGlwZWxpbmUuaWQpKX1FKHQsKGZ1bmN0aW9uKHQscyl7aWYoIWkudmlzdWFsVHlwZXx8aS52aXN1YWxUeXBlPT09dC52aXN1YWxUeXBlKXt2YXIgbD1vLl9zdGFnZVRhc2tNYXAuZ2V0KHQudWlkKSx1PWwuc2VyaWVzVGFza01hcCxoPWwub3ZlcmFsbFRhc2s7aWYoaCl7dmFyIGMscD1oLmFnZW50U3R1Yk1hcDtwLmVhY2goKGZ1bmN0aW9uKHQpe2EoaSx0KSYmKHQuZGlydHkoKSxjPSEwKX0pKSxjJiZoLmRpcnR5KCksby51cGRhdGVQYXlsb2FkKGgsbik7dmFyIGQ9by5nZXRQZXJmb3JtQXJncyhoLGkuYmxvY2spO3AuZWFjaCgoZnVuY3Rpb24odCl7dC5wZXJmb3JtKGQpfSkpLGgucGVyZm9ybShkKSYmKHI9ITApfWVsc2UgdSYmdS5lYWNoKChmdW5jdGlvbihzLGwpe2EoaSxzKSYmcy5kaXJ0eSgpO3ZhciB1PW8uZ2V0UGVyZm9ybUFyZ3MocyxpLmJsb2NrKTt1LnNraXA9IXQucGVyZm9ybVJhd1NlcmllcyYmZS5pc1Nlcmllc0ZpbHRlcmVkKHMuY29udGV4dC5tb2RlbCksby51cGRhdGVQYXlsb2FkKHMsbikscy5wZXJmb3JtKHUpJiYocj0hMCl9KSl9fSkpLHRoaXMudW5maW5pc2hlZD1yfHx0aGlzLnVuZmluaXNoZWR9LHQucHJvdG90eXBlLnBlcmZvcm1TZXJpZXNUYXNrcz1mdW5jdGlvbih0KXt2YXIgZTt0LmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpe2U9dC5kYXRhVGFzay5wZXJmb3JtKCl8fGV9KSksdGhpcy51bmZpbmlzaGVkPWV8fHRoaXMudW5maW5pc2hlZH0sdC5wcm90b3R5cGUucGxhbj1mdW5jdGlvbigpe3RoaXMuX3BpcGVsaW5lTWFwLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQudGFpbDtkb3tpZihlLl9fYmxvY2spe3QuYmxvY2tJbmRleD1lLl9faWR4SW5QaXBlbGluZTticmVha31lPWUuZ2V0VXBzdHJlYW0oKX13aGlsZShlKX0pKX0sdC5wcm90b3R5cGUudXBkYXRlUGF5bG9hZD1mdW5jdGlvbih0LGUpeyJyZW1haW4iIT09ZSYmKHQuY29udGV4dC5wYXlsb2FkPWUpfSx0LnByb3RvdHlwZS5fY3JlYXRlU2VyaWVzU3RhZ2VUYXNrPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMsbz1lLnNlcmllc1Rhc2tNYXAsYT1lLnNlcmllc1Rhc2tNYXA9eXQoKSxzPXQuc2VyaWVzVHlwZSxsPXQuZ2V0VGFyZ2V0U2VyaWVzO2Z1bmN0aW9uIHUoZSl7dmFyIHM9ZS51aWQsbD1hLnNldChzLG8mJm8uZ2V0KHMpfHx3Zih7cGxhbjpheSxyZXNldDpzeSxjb3VudDpoeX0pKTtsLmNvbnRleHQ9e21vZGVsOmUsZWNNb2RlbDpuLGFwaTppLHVzZUNsZWFyVmlzdWFsOnQuaXNWaXN1YWwmJiF0LmlzTGF5b3V0LHBsYW46dC5wbGFuLHJlc2V0OnQucmVzZXQsc2NoZWR1bGVyOnJ9LHIuX3BpcGUoZSxsKX10LmNyZWF0ZU9uQWxsU2VyaWVzP24uZWFjaFJhd1Nlcmllcyh1KTpzP24uZWFjaFJhd1Nlcmllc0J5VHlwZShzLHUpOmwmJmwobixpKS5lYWNoKHUpfSx0LnByb3RvdHlwZS5fY3JlYXRlT3ZlcmFsbFN0YWdlVGFzaz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLG89ZS5vdmVyYWxsVGFzaz1lLm92ZXJhbGxUYXNrfHx3Zih7cmVzZXQ6bnl9KTtvLmNvbnRleHQ9e2VjTW9kZWw6bixhcGk6aSxvdmVyYWxsUmVzZXQ6dC5vdmVyYWxsUmVzZXQsc2NoZWR1bGVyOnJ9O3ZhciBhPW8uYWdlbnRTdHViTWFwLHM9by5hZ2VudFN0dWJNYXA9eXQoKSxsPXQuc2VyaWVzVHlwZSx1PXQuZ2V0VGFyZ2V0U2VyaWVzLGg9ITAsYz0hMSxwPSIiO2Z1bmN0aW9uIGQodCl7dmFyIGU9dC51aWQsbj1zLnNldChlLGEmJmEuZ2V0KGUpfHwoYz0hMCx3Zih7cmVzZXQ6aXksb25EaXJ0eTpveX0pKSk7bi5jb250ZXh0PXttb2RlbDp0LG92ZXJhbGxQcm9ncmVzczpofSxuLmFnZW50PW8sbi5fX2Jsb2NrPWgsci5fcGlwZSh0LG4pfWx0KCF0LmNyZWF0ZU9uQWxsU2VyaWVzLHApLGw/bi5lYWNoUmF3U2VyaWVzQnlUeXBlKGwsZCk6dT91KG4saSkuZWFjaChkKTooaD0hMSxFKG4uZ2V0U2VyaWVzKCksZCkpLGMmJm8uZGlydHkoKX0sdC5wcm90b3R5cGUuX3BpcGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnVpZCxpPXRoaXMuX3BpcGVsaW5lTWFwLmdldChuKTshaS5oZWFkJiYoaS5oZWFkPWUpLGkudGFpbCYmaS50YWlsLnBpcGUoZSksaS50YWlsPWUsZS5fX2lkeEluUGlwZWxpbmU9aS5jb3VudCsrLGUuX19waXBlbGluZT1pfSx0LndyYXBTdGFnZUhhbmRsZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWCh0KSYmKHQ9e292ZXJhbGxSZXNldDp0LHNlcmllc1R5cGU6Y3kodCl9KSx0LnVpZD1BYygic3RhZ2VIYW5kbGVyIiksZSYmKHQudmlzdWFsVHlwZT1lKSx0fSx0fSgpO2Z1bmN0aW9uIG55KHQpe3Qub3ZlcmFsbFJlc2V0KHQuZWNNb2RlbCx0LmFwaSx0LnBheWxvYWQpfWZ1bmN0aW9uIGl5KHQpe3JldHVybiB0Lm92ZXJhbGxQcm9ncmVzcyYmcnl9ZnVuY3Rpb24gcnkoKXt0aGlzLmFnZW50LmRpcnR5KCksdGhpcy5nZXREb3duc3RyZWFtKCkuZGlydHkoKX1mdW5jdGlvbiBveSgpe3RoaXMuYWdlbnQmJnRoaXMuYWdlbnQuZGlydHkoKX1mdW5jdGlvbiBheSh0KXtyZXR1cm4gdC5wbGFuP3QucGxhbih0Lm1vZGVsLHQuZWNNb2RlbCx0LmFwaSx0LnBheWxvYWQpOm51bGx9ZnVuY3Rpb24gc3kodCl7dC51c2VDbGVhclZpc3VhbCYmdC5kYXRhLmNsZWFyQWxsVmlzdWFsKCk7dmFyIGU9dC5yZXNldERlZmluZXM9VG8odC5yZXNldCh0Lm1vZGVsLHQuZWNNb2RlbCx0LmFwaSx0LnBheWxvYWQpKTtyZXR1cm4gZS5sZW5ndGg+MT96KGUsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHV5KGUpfSkpOmx5fXZhciBseT11eSgwKTtmdW5jdGlvbiB1eSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT1uLmRhdGEscj1uLnJlc2V0RGVmaW5lc1t0XTtpZihyJiZyLmRhdGFFYWNoKWZvcih2YXIgbz1lLnN0YXJ0O288ZS5lbmQ7bysrKXIuZGF0YUVhY2goaSxvKTtlbHNlIHImJnIucHJvZ3Jlc3MmJnIucHJvZ3Jlc3MoZSxpKX19ZnVuY3Rpb24gaHkodCl7cmV0dXJuIHQuZGF0YS5jb3VudCgpfWZ1bmN0aW9uIGN5KHQpe3B5PW51bGw7dHJ5e3QoZHksZnkpfWNhdGNoKHQpe31yZXR1cm4gcHl9dmFyIHB5LGR5PXt9LGZ5PXt9O2Z1bmN0aW9uIGd5KHQsZSl7Zm9yKHZhciBuIGluIGUucHJvdG90eXBlKXRbbl09YnR9Z3koZHksZ2QpLGd5KGZ5LF9kKSxkeS5lYWNoU2VyaWVzQnlUeXBlPWR5LmVhY2hSYXdTZXJpZXNCeVR5cGU9ZnVuY3Rpb24odCl7cHk9dH0sZHkuZWFjaENvbXBvbmVudD1mdW5jdGlvbih0KXsic2VyaWVzIj09PXQubWFpblR5cGUmJnQuc3ViVHlwZSYmKHB5PXQuc3ViVHlwZSl9O3ZhciB5eT1bIiMzN0EyREEiLCIjMzJDNUU5IiwiIzY3RTBFMyIsIiM5RkU2QjgiLCIjRkZEQjVDIiwiI2ZmOWY3ZiIsIiNmYjcyOTMiLCIjRTA2MkFFIiwiI0U2OTBEMSIsIiNlN2JjZjMiLCIjOWQ5NmY1IiwiIzgzNzhFQSIsIiM5NkJGRkYiXSx2eT17Y29sb3I6eXksY29sb3JMYXllcjpbWyIjMzdBMkRBIiwiI2ZmZDg1YyIsIiNmZDdiNWYiXSxbIiMzN0EyREEiLCIjNjdFMEUzIiwiI0ZGREI1QyIsIiNmZjlmN2YiLCIjRTA2MkFFIiwiIzlkOTZmNSJdLFsiIzM3QTJEQSIsIiMzMkM1RTkiLCIjOUZFNkI4IiwiI0ZGREI1QyIsIiNmZjlmN2YiLCIjZmI3MjkzIiwiI2U3YmNmMyIsIiM4Mzc4RUEiLCIjOTZCRkZGIl0seXldfSxteT0iI0I5QjhDRSIseHk9IiMxMDBDMkEiLF95PWZ1bmN0aW9uKCl7cmV0dXJue2F4aXNMaW5lOntsaW5lU3R5bGU6e2NvbG9yOm15fX0sc3BsaXRMaW5lOntsaW5lU3R5bGU6e2NvbG9yOiIjNDg0NzUzIn19LHNwbGl0QXJlYTp7YXJlYVN0eWxlOntjb2xvcjpbInJnYmEoMjU1LDI1NSwyNTUsMC4wMikiLCJyZ2JhKDI1NSwyNTUsMjU1LDAuMDUpIl19fSxtaW5vclNwbGl0TGluZTp7bGluZVN0eWxlOntjb2xvcjoiIzIwMjAzQiJ9fX19LGJ5PVsiIzQ5OTJmZiIsIiM3Y2ZmYjIiLCIjZmRkZDYwIiwiI2ZmNmU3NiIsIiM1OGQ5ZjkiLCIjMDVjMDkxIiwiI2ZmOGE0NSIsIiM4ZDQ4ZTMiLCIjZGQ3OWZmIl0sd3k9e2RhcmtNb2RlOiEwLGNvbG9yOmJ5LGJhY2tncm91bmRDb2xvcjp4eSxheGlzUG9pbnRlcjp7bGluZVN0eWxlOntjb2xvcjoiIzgxN2Y5MSJ9LGNyb3NzU3R5bGU6e2NvbG9yOiIjODE3ZjkxIn0sbGFiZWw6e2NvbG9yOiIjZmZmIn19LGxlZ2VuZDp7dGV4dFN0eWxlOntjb2xvcjpteX19LHRleHRTdHlsZTp7Y29sb3I6bXl9LHRpdGxlOnt0ZXh0U3R5bGU6e2NvbG9yOiIjRUVGMUZBIn0sc3VidGV4dFN0eWxlOntjb2xvcjoiI0I5QjhDRSJ9fSx0b29sYm94OntpY29uU3R5bGU6e2JvcmRlckNvbG9yOm15fX0sZGF0YVpvb206e2JvcmRlckNvbG9yOiIjNzE3MDhBIix0ZXh0U3R5bGU6e2NvbG9yOm15fSxicnVzaFN0eWxlOntjb2xvcjoicmdiYSgxMzUsMTYzLDIwNiwwLjMpIn0saGFuZGxlU3R5bGU6e2NvbG9yOiIjMzUzNDUwIixib3JkZXJDb2xvcjoiI0M1Q0JFMyJ9LG1vdmVIYW5kbGVTdHlsZTp7Y29sb3I6IiNCMEI2QzMiLG9wYWNpdHk6LjN9LGZpbGxlckNvbG9yOiJyZ2JhKDEzNSwxNjMsMjA2LDAuMikiLGVtcGhhc2lzOntoYW5kbGVTdHlsZTp7Ym9yZGVyQ29sb3I6IiM5MUI3RjIiLGNvbG9yOiIjNEQ1ODdEIn0sbW92ZUhhbmRsZVN0eWxlOntjb2xvcjoiIzYzNkQ5QSIsb3BhY2l0eTouN319LGRhdGFCYWNrZ3JvdW5kOntsaW5lU3R5bGU6e2NvbG9yOiIjNzE3MDhBIix3aWR0aDoxfSxhcmVhU3R5bGU6e2NvbG9yOiIjNzE3MDhBIn19LHNlbGVjdGVkRGF0YUJhY2tncm91bmQ6e2xpbmVTdHlsZTp7Y29sb3I6IiM4N0EzQ0UifSxhcmVhU3R5bGU6e2NvbG9yOiIjODdBM0NFIn19fSx2aXN1YWxNYXA6e3RleHRTdHlsZTp7Y29sb3I6bXl9fSx0aW1lbGluZTp7bGluZVN0eWxlOntjb2xvcjpteX0sbGFiZWw6e2NvbG9yOm15fSxjb250cm9sU3R5bGU6e2NvbG9yOm15LGJvcmRlckNvbG9yOm15fX0sY2FsZW5kYXI6e2l0ZW1TdHlsZTp7Y29sb3I6eHl9LGRheUxhYmVsOntjb2xvcjpteX0sbW9udGhMYWJlbDp7Y29sb3I6bXl9LHllYXJMYWJlbDp7Y29sb3I6bXl9fSx0aW1lQXhpczpfeSgpLGxvZ0F4aXM6X3koKSx2YWx1ZUF4aXM6X3koKSxjYXRlZ29yeUF4aXM6X3koKSxsaW5lOntzeW1ib2w6ImNpcmNsZSJ9LGdyYXBoOntjb2xvcjpieX0sZ2F1Z2U6e3RpdGxlOntjb2xvcjpteX0sYXhpc0xpbmU6e2xpbmVTdHlsZTp7Y29sb3I6W1sxLCJyZ2JhKDIwNywyMTIsMjE5LDAuMikiXV19fSxheGlzTGFiZWw6e2NvbG9yOm15fSxkZXRhaWw6e2NvbG9yOiIjRUVGMUZBIn19LGNhbmRsZXN0aWNrOntpdGVtU3R5bGU6e2NvbG9yOiIjZjY0ZTU2Iixjb2xvcjA6IiM1NGVhOTIiLGJvcmRlckNvbG9yOiIjZjY0ZTU2Iixib3JkZXJDb2xvcjA6IiM1NGVhOTIifX19O3d5LmNhdGVnb3J5QXhpcy5zcGxpdExpbmUuc2hvdz0hMTt2YXIgU3k9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5ub3JtYWxpemVRdWVyeT1mdW5jdGlvbih0KXt2YXIgZT17fSxuPXt9LGk9e307aWYoVSh0KSl7dmFyIHI9S28odCk7ZS5tYWluVHlwZT1yLm1haW58fG51bGwsZS5zdWJUeXBlPXIuc3VifHxudWxsfWVsc2V7dmFyIG89WyJJbmRleCIsIk5hbWUiLCJJZCJdLGE9e25hbWU6MSxkYXRhSW5kZXg6MSxkYXRhVHlwZToxfTtFKHQsKGZ1bmN0aW9uKHQscil7Zm9yKHZhciBzPSExLGw9MDtsPG8ubGVuZ3RoO2wrKyl7dmFyIHU9b1tsXSxoPXIubGFzdEluZGV4T2YodSk7aWYoaD4wJiZoPT09ci5sZW5ndGgtdS5sZW5ndGgpe3ZhciBjPXIuc2xpY2UoMCxoKTsiZGF0YSIhPT1jJiYoZS5tYWluVHlwZT1jLGVbdS50b0xvd2VyQ2FzZSgpXT10LHM9ITApfX1hLmhhc093blByb3BlcnR5KHIpJiYobltyXT10LHM9ITApLHN8fChpW3JdPXQpfSkpfXJldHVybntjcHRRdWVyeTplLGRhdGFRdWVyeTpuLG90aGVyUXVlcnk6aX19LHQucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXZlbnRJbmZvO2lmKCFuKXJldHVybiEwO3ZhciBpPW4udGFyZ2V0RWwscj1uLnBhY2tlZEV2ZW50LG89bi5tb2RlbCxhPW4udmlldztpZighb3x8IWEpcmV0dXJuITA7dmFyIHM9ZS5jcHRRdWVyeSxsPWUuZGF0YVF1ZXJ5O3JldHVybiB1KHMsbywibWFpblR5cGUiKSYmdShzLG8sInN1YlR5cGUiKSYmdShzLG8sImluZGV4IiwiY29tcG9uZW50SW5kZXgiKSYmdShzLG8sIm5hbWUiKSYmdShzLG8sImlkIikmJnUobCxyLCJuYW1lIikmJnUobCxyLCJkYXRhSW5kZXgiKSYmdShsLHIsImRhdGFUeXBlIikmJighYS5maWx0ZXJGb3JFeHBvc2VkRXZlbnR8fGEuZmlsdGVyRm9yRXhwb3NlZEV2ZW50KHQsZS5vdGhlclF1ZXJ5LGkscikpO2Z1bmN0aW9uIHUodCxlLG4saSl7cmV0dXJuIG51bGw9PXRbbl18fGVbaXx8bl09PT10W25dfX0sdC5wcm90b3R5cGUuYWZ0ZXJUcmlnZ2VyPWZ1bmN0aW9uKCl7dGhpcy5ldmVudEluZm89bnVsbH0sdH0oKSxNeT1bInN5bWJvbCIsInN5bWJvbFNpemUiLCJzeW1ib2xSb3RhdGUiLCJzeW1ib2xPZmZzZXQiXSxJeT1NeS5jb25jYXQoWyJzeW1ib2xLZWVwQXNwZWN0Il0pLFR5PXtjcmVhdGVPbkFsbFNlcmllczohMCxwZXJmb3JtUmF3U2VyaWVzOiEwLHJlc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXREYXRhKCk7aWYodC5sZWdlbmRJY29uJiZuLnNldFZpc3VhbCgibGVnZW5kSWNvbiIsdC5sZWdlbmRJY29uKSx0Lmhhc1N5bWJvbFZpc3VhbCl7Zm9yKHZhciBpPXt9LHI9e30sbz0hMSxhPTA7YTxNeS5sZW5ndGg7YSsrKXt2YXIgcz1NeVthXSxsPXQuZ2V0KHMpO1gobCk/KG89ITAscltzXT1sKTppW3NdPWx9aWYoaS5zeW1ib2w9aS5zeW1ib2x8fHQuZGVmYXVsdFN5bWJvbCxuLnNldFZpc3VhbChBKHtsZWdlbmRJY29uOnQubGVnZW5kSWNvbnx8aS5zeW1ib2wsc3ltYm9sS2VlcEFzcGVjdDp0LmdldCgic3ltYm9sS2VlcEFzcGVjdCIpfSxpKSksIWUuaXNTZXJpZXNGaWx0ZXJlZCh0KSl7dmFyIHU9RyhyKTtyZXR1cm57ZGF0YUVhY2g6bz9mdW5jdGlvbihlLG4pe2Zvcih2YXIgaT10LmdldFJhd1ZhbHVlKG4pLG89dC5nZXREYXRhUGFyYW1zKG4pLGE9MDthPHUubGVuZ3RoO2ErKyl7dmFyIHM9dVthXTtlLnNldEl0ZW1WaXN1YWwobixzLHJbc10oaSxvKSl9fTpudWxsfX19fX0sQ3k9e2NyZWF0ZU9uQWxsU2VyaWVzOiEwLHBlcmZvcm1SYXdTZXJpZXM6ITAscmVzZXQ6ZnVuY3Rpb24odCxlKXtpZih0Lmhhc1N5bWJvbFZpc3VhbCYmIWUuaXNTZXJpZXNGaWx0ZXJlZCh0KSlyZXR1cm57ZGF0YUVhY2g6dC5nZXREYXRhKCkuaGFzSXRlbU9wdGlvbj9mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmdldEl0ZW1Nb2RlbChlKSxpPTA7aTxJeS5sZW5ndGg7aSsrKXt2YXIgcj1JeVtpXSxvPW4uZ2V0U2hhbGxvdyhyLCEwKTtudWxsIT1vJiZ0LnNldEl0ZW1WaXN1YWwoZSxyLG8pfX06bnVsbH19fTtmdW5jdGlvbiBEeSh0LGUsbil7c3dpdGNoKG4pe2Nhc2UiY29sb3IiOnJldHVybiB0LmdldEl0ZW1WaXN1YWwoZSwic3R5bGUiKVt0LmdldFZpc3VhbCgiZHJhd1R5cGUiKV07Y2FzZSJvcGFjaXR5IjpyZXR1cm4gdC5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIikub3BhY2l0eTtjYXNlInN5bWJvbCI6Y2FzZSJzeW1ib2xTaXplIjpjYXNlImxpZnRaIjpyZXR1cm4gdC5nZXRJdGVtVmlzdWFsKGUsbil9fWZ1bmN0aW9uIEF5KHQsZSl7c3dpdGNoKGUpe2Nhc2UiY29sb3IiOnJldHVybiB0LmdldFZpc3VhbCgic3R5bGUiKVt0LmdldFZpc3VhbCgiZHJhd1R5cGUiKV07Y2FzZSJvcGFjaXR5IjpyZXR1cm4gdC5nZXRWaXN1YWwoInN0eWxlIikub3BhY2l0eTtjYXNlInN5bWJvbCI6Y2FzZSJzeW1ib2xTaXplIjpjYXNlImxpZnRaIjpyZXR1cm4gdC5nZXRWaXN1YWwoZSl9fWZ1bmN0aW9uIGt5KHQsZSxuLGkpe3N3aXRjaChuKXtjYXNlImNvbG9yIjp0LmVuc3VyZVVuaXF1ZUl0ZW1WaXN1YWwoZSwic3R5bGUiKVt0LmdldFZpc3VhbCgiZHJhd1R5cGUiKV09aSx0LnNldEl0ZW1WaXN1YWwoZSwiY29sb3JGcm9tUGFsZXR0ZSIsITEpO2JyZWFrO2Nhc2Uib3BhY2l0eSI6dC5lbnN1cmVVbmlxdWVJdGVtVmlzdWFsKGUsInN0eWxlIikub3BhY2l0eT1pO2JyZWFrO2Nhc2Uic3ltYm9sIjpjYXNlInN5bWJvbFNpemUiOmNhc2UibGlmdFoiOnQuc2V0SXRlbVZpc3VhbChlLG4saSl9fWZ1bmN0aW9uIEx5KHQsZSl7ZnVuY3Rpb24gbihlLG4pe3ZhciBpPVtdO3JldHVybiBlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6dCxxdWVyeTpufSwoZnVuY3Rpb24odCl7aS5wdXNoKHQuc2VyaWVzSW5kZXgpfSkpLGl9RShbW3QrIlRvZ2dsZVNlbGVjdCIsInRvZ2dsZVNlbGVjdCJdLFt0KyJTZWxlY3QiLCJzZWxlY3QiXSxbdCsiVW5TZWxlY3QiLCJ1bnNlbGVjdCJdXSwoZnVuY3Rpb24odCl7ZSh0WzBdLChmdW5jdGlvbihlLGkscil7ZT1BKHt9LGUpLHIuZGlzcGF0Y2hBY3Rpb24oQShlLHt0eXBlOnRbMV0sc2VyaWVzSW5kZXg6bihpLGUpfSkpfSkpfSkpfWZ1bmN0aW9uIFB5KHQsZSxuLGkscil7dmFyIG89dCtlO24uaXNTaWxlbnQobyl8fGkuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToicGllIn0sKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnNlcmllc0luZGV4LGk9dC5vcHRpb24uc2VsZWN0ZWRNYXAsYT1yLnNlbGVjdGVkLHM9MDtzPGEubGVuZ3RoO3MrKylpZihhW3NdLnNlcmllc0luZGV4PT09ZSl7dmFyIGw9dC5nZXREYXRhKCksdT16byhsLHIuZnJvbUFjdGlvblBheWxvYWQpO24udHJpZ2dlcihvLHt0eXBlOm8sc2VyaWVzSWQ6dC5pZCxuYW1lOlkodSk/bC5nZXROYW1lKHVbMF0pOmwuZ2V0TmFtZSh1KSxzZWxlY3RlZDpVKGkpP2k6QSh7fSxpKX0pfX0pKX1mdW5jdGlvbiBPeSh0LGUsbil7Zm9yKHZhciBpO3QmJighZSh0KXx8KGk9dCwhbikpOyl0PXQuX19ob3N0VGFyZ2V0fHx0LnBhcmVudDtyZXR1cm4gaX12YXIgUnk9TWF0aC5yb3VuZCg5Kk1hdGgucmFuZG9tKCkpLE55PSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHksRXk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5faWQ9Il9fZWNfaW5uZXJfIitSeSsrfXJldHVybiB0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2d1YXJkKHQpW3RoaXMuX2lkXX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ3VhcmQodCk7cmV0dXJuIE55P09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHRoaXMuX2lkLHt2YWx1ZTplLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSk6blt0aGlzLl9pZF09ZSx0aGlzfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmhhcyh0KSYmKGRlbGV0ZSB0aGlzLl9ndWFyZCh0KVt0aGlzLl9pZF0sITApfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLl9ndWFyZCh0KVt0aGlzLl9pZF19LHQucHJvdG90eXBlLl9ndWFyZD1mdW5jdGlvbih0KXtpZih0IT09T2JqZWN0KHQpKXRocm93IFR5cGVFcnJvcigiVmFsdWUgb2YgV2Vha01hcCBpcyBub3QgYSBub24tbnVsbCBvYmplY3QuIik7cmV0dXJuIHR9LHR9KCksenk9a3MuZXh0ZW5kKHt0eXBlOiJ0cmlhbmdsZSIsc2hhcGU6e2N4OjAsY3k6MCx3aWR0aDowLGhlaWdodDowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmN4LGk9ZS5jeSxyPWUud2lkdGgvMixvPWUuaGVpZ2h0LzI7dC5tb3ZlVG8obixpLW8pLHQubGluZVRvKG4rcixpK28pLHQubGluZVRvKG4tcixpK28pLHQuY2xvc2VQYXRoKCl9fSksVnk9a3MuZXh0ZW5kKHt0eXBlOiJkaWFtb25kIixzaGFwZTp7Y3g6MCxjeTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBuPWUuY3gsaT1lLmN5LHI9ZS53aWR0aC8yLG89ZS5oZWlnaHQvMjt0Lm1vdmVUbyhuLGktbyksdC5saW5lVG8obityLGkpLHQubGluZVRvKG4saStvKSx0LmxpbmVUbyhuLXIsaSksdC5jbG9zZVBhdGgoKX19KSxCeT1rcy5leHRlbmQoe3R5cGU6InBpbiIsc2hhcGU6e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS54LGk9ZS55LHI9ZS53aWR0aC81KjMsbz1NYXRoLm1heChyLGUuaGVpZ2h0KSxhPXIvMixzPWEqYS8oby1hKSxsPWktbythK3MsdT1NYXRoLmFzaW4ocy9hKSxoPU1hdGguY29zKHUpKmEsYz1NYXRoLnNpbih1KSxwPU1hdGguY29zKHUpLGQ9LjYqYSxmPS43KmE7dC5tb3ZlVG8obi1oLGwrcyksdC5hcmMobixsLGEsTWF0aC5QSS11LDIqTWF0aC5QSSt1KSx0LmJlemllckN1cnZlVG8obitoLWMqZCxsK3MrcCpkLG4saS1mLG4saSksdC5iZXppZXJDdXJ2ZVRvKG4saS1mLG4taCtjKmQsbCtzK3AqZCxuLWgsbCtzKSx0LmNsb3NlUGF0aCgpfX0pLEZ5PWtzLmV4dGVuZCh7dHlwZToiYXJyb3ciLHNoYXBlOnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBuPWUuaGVpZ2h0LGk9ZS53aWR0aCxyPWUueCxvPWUueSxhPWkvMyoyO3QubW92ZVRvKHIsbyksdC5saW5lVG8ocithLG8rbiksdC5saW5lVG8ocixvK24vNCozKSx0LmxpbmVUbyhyLWEsbytuKSx0LmxpbmVUbyhyLG8pLHQuY2xvc2VQYXRoKCl9fSksR3k9e2xpbmU6ZnVuY3Rpb24odCxlLG4saSxyKXtyLngxPXQsci55MT1lK2kvMixyLngyPXQrbixyLnkyPWUraS8yfSxyZWN0OmZ1bmN0aW9uKHQsZSxuLGkscil7ci54PXQsci55PWUsci53aWR0aD1uLHIuaGVpZ2h0PWl9LHJvdW5kUmVjdDpmdW5jdGlvbih0LGUsbixpLHIpe3IueD10LHIueT1lLHIud2lkdGg9bixyLmhlaWdodD1pLHIucj1NYXRoLm1pbihuLGkpLzR9LHNxdWFyZTpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPU1hdGgubWluKG4saSk7ci54PXQsci55PWUsci53aWR0aD1vLHIuaGVpZ2h0PW99LGNpcmNsZTpmdW5jdGlvbih0LGUsbixpLHIpe3IuY3g9dCtuLzIsci5jeT1lK2kvMixyLnI9TWF0aC5taW4obixpKS8yfSxkaWFtb25kOmZ1bmN0aW9uKHQsZSxuLGkscil7ci5jeD10K24vMixyLmN5PWUraS8yLHIud2lkdGg9bixyLmhlaWdodD1pfSxwaW46ZnVuY3Rpb24odCxlLG4saSxyKXtyLng9dCtuLzIsci55PWUraS8yLHIud2lkdGg9bixyLmhlaWdodD1pfSxhcnJvdzpmdW5jdGlvbih0LGUsbixpLHIpe3IueD10K24vMixyLnk9ZStpLzIsci53aWR0aD1uLHIuaGVpZ2h0PWl9LHRyaWFuZ2xlOmZ1bmN0aW9uKHQsZSxuLGkscil7ci5jeD10K24vMixyLmN5PWUraS8yLHIud2lkdGg9bixyLmhlaWdodD1pfX0sV3k9e307RSh7bGluZTpLdSxyZWN0OldzLHJvdW5kUmVjdDpXcyxzcXVhcmU6V3MsY2lyY2xlOlN1LGRpYW1vbmQ6VnkscGluOkJ5LGFycm93OkZ5LHRyaWFuZ2xlOnp5fSwoZnVuY3Rpb24odCxlKXtXeVtlXT1uZXcgdH0pKTt2YXIgSHk9a3MuZXh0ZW5kKHt0eXBlOiJzeW1ib2wiLHNoYXBlOntzeW1ib2xUeXBlOiIiLHg6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sY2FsY3VsYXRlVGV4dFBvc2l0aW9uOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1Ecih0LGUsbikscj10aGlzLnNoYXBlO3JldHVybiByJiYicGluIj09PXIuc3ltYm9sVHlwZSYmImluc2lkZSI9PT1lLnBvc2l0aW9uJiYoaS55PW4ueSsuNCpuLmhlaWdodCksaX0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lLnN5bWJvbFR5cGU7aWYoIm5vbmUiIT09aSl7dmFyIHI9V3lbaV07cnx8KHI9V3lbaT0icmVjdCJdKSxHeVtpXShlLngsZS55LGUud2lkdGgsZS5oZWlnaHQsci5zaGFwZSksci5idWlsZFBhdGgodCxyLnNoYXBlLG4pfX19KTtmdW5jdGlvbiBZeSh0LGUpe2lmKCJpbWFnZSIhPT10aGlzLnR5cGUpe3ZhciBuPXRoaXMuc3R5bGU7dGhpcy5fX2lzRW1wdHlCcnVzaD8obi5zdHJva2U9dCxuLmZpbGw9ZXx8IiNmZmYiLG4ubGluZVdpZHRoPTIpOiJsaW5lIj09PXRoaXMuc2hhcGUuc3ltYm9sVHlwZT9uLnN0cm9rZT10Om4uZmlsbD10LHRoaXMubWFya1JlZHJhdygpfX1mdW5jdGlvbiBYeSh0LGUsbixpLHIsbyxhKXt2YXIgcyxsPTA9PT10LmluZGV4T2YoImVtcHR5Iik7cmV0dXJuIGwmJih0PXQuc3Vic3RyKDUsMSkudG9Mb3dlckNhc2UoKSt0LnN1YnN0cig2KSksKHM9MD09PXQuaW5kZXhPZigiaW1hZ2U6Ly8iKT9PaCh0LnNsaWNlKDgpLG5ldyB6ZShlLG4saSxyKSxhPyJjZW50ZXIiOiJjb3ZlciIpOjA9PT10LmluZGV4T2YoInBhdGg6Ly8iKT9QaCh0LnNsaWNlKDcpLHt9LG5ldyB6ZShlLG4saSxyKSxhPyJjZW50ZXIiOiJjb3ZlciIpOm5ldyBIeSh7c2hhcGU6e3N5bWJvbFR5cGU6dCx4OmUseTpuLHdpZHRoOmksaGVpZ2h0OnJ9fSkpLl9faXNFbXB0eUJydXNoPWwscy5zZXRDb2xvcj1ZeSxvJiZzLnNldENvbG9yKG8pLHN9ZnVuY3Rpb24gVXkodCl7cmV0dXJuIFkodCl8fCh0PVsrdCwrdF0pLFt0WzBdfHwwLHRbMV18fDBdfWZ1bmN0aW9uIFp5KHQsZSl7aWYobnVsbCE9dClyZXR1cm4gWSh0KXx8KHQ9W3QsdF0pLFskcih0WzBdLGVbMF0pfHwwLCRyKHJ0KHRbMV0sdFswXSksZVsxXSl8fDBdfWZ1bmN0aW9uIGp5KHQpe3JldHVybiBpc0Zpbml0ZSh0KX1mdW5jdGlvbiBxeSh0LGUsbil7Zm9yKHZhciBpPSJyYWRpYWwiPT09ZS50eXBlP2Z1bmN0aW9uKHQsZSxuKXt2YXIgaT1uLndpZHRoLHI9bi5oZWlnaHQsbz1NYXRoLm1pbihpLHIpLGE9bnVsbD09ZS54Py41OmUueCxzPW51bGw9PWUueT8uNTplLnksbD1udWxsPT1lLnI/LjU6ZS5yO3JldHVybiBlLmdsb2JhbHx8KGE9YSppK24ueCxzPXMqcituLnksbCo9byksYT1qeShhKT9hOi41LHM9ankocyk/czouNSxsPWw+PTAmJmp5KGwpP2w6LjUsdC5jcmVhdGVSYWRpYWxHcmFkaWVudChhLHMsMCxhLHMsbCl9KHQsZSxuKTpmdW5jdGlvbih0LGUsbil7dmFyIGk9bnVsbD09ZS54PzA6ZS54LHI9bnVsbD09ZS54Mj8xOmUueDIsbz1udWxsPT1lLnk/MDplLnksYT1udWxsPT1lLnkyPzA6ZS55MjtyZXR1cm4gZS5nbG9iYWx8fChpPWkqbi53aWR0aCtuLngscj1yKm4ud2lkdGgrbi54LG89bypuLmhlaWdodCtuLnksYT1hKm4uaGVpZ2h0K24ueSksaT1qeShpKT9pOjAscj1qeShyKT9yOjEsbz1qeShvKT9vOjAsYT1qeShhKT9hOjAsdC5jcmVhdGVMaW5lYXJHcmFkaWVudChpLG8scixhKX0odCxlLG4pLHI9ZS5jb2xvclN0b3BzLG89MDtvPHIubGVuZ3RoO28rKylpLmFkZENvbG9yU3RvcChyW29dLm9mZnNldCxyW29dLmNvbG9yKTtyZXR1cm4gaX1mdW5jdGlvbiBLeSh0KXtyZXR1cm4gcGFyc2VJbnQodCwxMCl9ZnVuY3Rpb24gJHkodCxlLG4pe3ZhciBpPVsid2lkdGgiLCJoZWlnaHQiXVtlXSxyPVsiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiXVtlXSxvPVsicGFkZGluZ0xlZnQiLCJwYWRkaW5nVG9wIl1bZV0sYT1bInBhZGRpbmdSaWdodCIsInBhZGRpbmdCb3R0b20iXVtlXTtpZihudWxsIT1uW2ldJiYiYXV0byIhPT1uW2ldKXJldHVybiBwYXJzZUZsb2F0KG5baV0pO3ZhciBzPWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCk7cmV0dXJuKHRbcl18fEt5KHNbaV0pfHxLeSh0LnN0eWxlW2ldKSktKEt5KHNbb10pfHwwKS0oS3koc1thXSl8fDApfDB9ZnVuY3Rpb24gSnkodCl7dmFyIGUsbixpPXQuc3R5bGUscj1pLmxpbmVEYXNoJiZpLmxpbmVXaWR0aD4wJiYoZT1pLmxpbmVEYXNoLG49aS5saW5lV2lkdGgsZSYmInNvbGlkIiE9PWUmJm4+MD8iZGFzaGVkIj09PWU/WzQqbiwyKm5dOiJkb3R0ZWQiPT09ZT9bbl06aihlKT9bZV06WShlKT9lOm51bGw6bnVsbCksbz1pLmxpbmVEYXNoT2Zmc2V0O2lmKHIpe3ZhciBhPWkuc3Ryb2tlTm9TY2FsZSYmdC5nZXRMaW5lU2NhbGU/dC5nZXRMaW5lU2NhbGUoKToxO2EmJjEhPT1hJiYocj16KHIsKGZ1bmN0aW9uKHQpe3JldHVybiB0L2F9KSksby89YSl9cmV0dXJuW3Isb119dmFyIFF5PW5ldyBocyghMCk7ZnVuY3Rpb24gdHYodCl7dmFyIGU9dC5zdHJva2U7cmV0dXJuIShudWxsPT1lfHwibm9uZSI9PT1lfHwhKHQubGluZVdpZHRoPjApKX1mdW5jdGlvbiBldih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJiJub25lIiE9PXR9ZnVuY3Rpb24gbnYodCl7dmFyIGU9dC5maWxsO3JldHVybiBudWxsIT1lJiYibm9uZSIhPT1lfWZ1bmN0aW9uIGl2KHQsZSl7aWYobnVsbCE9ZS5maWxsT3BhY2l0eSYmMSE9PWUuZmlsbE9wYWNpdHkpe3ZhciBuPXQuZ2xvYmFsQWxwaGE7dC5nbG9iYWxBbHBoYT1lLmZpbGxPcGFjaXR5KmUub3BhY2l0eSx0LmZpbGwoKSx0Lmdsb2JhbEFscGhhPW59ZWxzZSB0LmZpbGwoKX1mdW5jdGlvbiBydih0LGUpe2lmKG51bGwhPWUuc3Ryb2tlT3BhY2l0eSYmMSE9PWUuc3Ryb2tlT3BhY2l0eSl7dmFyIG49dC5nbG9iYWxBbHBoYTt0Lmdsb2JhbEFscGhhPWUuc3Ryb2tlT3BhY2l0eSplLm9wYWNpdHksdC5zdHJva2UoKSx0Lmdsb2JhbEFscGhhPW59ZWxzZSB0LnN0cm9rZSgpfWZ1bmN0aW9uIG92KHQsZSxuKXt2YXIgaT1sYShlLmltYWdlLGUuX19pbWFnZSxuKTtpZihoYShpKSl7dmFyIHI9dC5jcmVhdGVQYXR0ZXJuKGksZS5yZXBlYXR8fCJyZXBlYXQiKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgRE9NTWF0cml4JiZyJiZyLnNldFRyYW5zZm9ybSl7dmFyIG89bmV3IERPTU1hdHJpeDtvLnRyYW5zbGF0ZVNlbGYoZS54fHwwLGUueXx8MCksby5yb3RhdGVTZWxmKDAsMCwoZS5yb3RhdGlvbnx8MCkqd3QpLG8uc2NhbGVTZWxmKGUuc2NhbGVYfHwxLGUuc2NhbGVZfHwxKSxyLnNldFRyYW5zZm9ybShvKX1yZXR1cm4gcn19dmFyIGF2PVsic2hhZG93Qmx1ciIsInNoYWRvd09mZnNldFgiLCJzaGFkb3dPZmZzZXRZIl0sc3Y9W1sibGluZUNhcCIsImJ1dHQiXSxbImxpbmVKb2luIiwibWl0ZXIiXSxbIm1pdGVyTGltaXQiLDEwXV07ZnVuY3Rpb24gbHYodCxlLG4saSxyKXt2YXIgbz0hMTtpZighaSYmZT09PShuPW58fHt9KSlyZXR1cm4hMTtpZihpfHxlLm9wYWNpdHkhPT1uLm9wYWNpdHkpe2N2KHQsciksbz0hMDt2YXIgYT1NYXRoLm1heChNYXRoLm1pbihlLm9wYWNpdHksMSksMCk7dC5nbG9iYWxBbHBoYT1pc05hTihhKT9NYS5vcGFjaXR5OmF9KGl8fGUuYmxlbmQhPT1uLmJsZW5kKSYmKG98fChjdih0LHIpLG89ITApLHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWUuYmxlbmR8fE1hLmJsZW5kKTtmb3IodmFyIHM9MDtzPGF2Lmxlbmd0aDtzKyspe3ZhciBsPWF2W3NdOyhpfHxlW2xdIT09bltsXSkmJihvfHwoY3YodCxyKSxvPSEwKSx0W2xdPXQuZHByKihlW2xdfHwwKSl9cmV0dXJuKGl8fGUuc2hhZG93Q29sb3IhPT1uLnNoYWRvd0NvbG9yKSYmKG98fChjdih0LHIpLG89ITApLHQuc2hhZG93Q29sb3I9ZS5zaGFkb3dDb2xvcnx8TWEuc2hhZG93Q29sb3IpLG99ZnVuY3Rpb24gdXYodCxlLG4saSxyKXt2YXIgbz1wdihlLHIuaW5Ib3ZlciksYT1pP251bGw6biYmcHYobixyLmluSG92ZXIpfHx7fTtpZihvPT09YSlyZXR1cm4hMTt2YXIgcz1sdih0LG8sYSxpLHIpO2lmKChpfHxvLmZpbGwhPT1hLmZpbGwpJiYoc3x8KGN2KHQscikscz0hMCksZXYoby5maWxsKSYmKHQuZmlsbFN0eWxlPW8uZmlsbCkpLChpfHxvLnN0cm9rZSE9PWEuc3Ryb2tlKSYmKHN8fChjdih0LHIpLHM9ITApLGV2KG8uc3Ryb2tlKSYmKHQuc3Ryb2tlU3R5bGU9by5zdHJva2UpKSwoaXx8by5vcGFjaXR5IT09YS5vcGFjaXR5KSYmKHN8fChjdih0LHIpLHM9ITApLHQuZ2xvYmFsQWxwaGE9bnVsbD09by5vcGFjaXR5PzE6by5vcGFjaXR5KSxlLmhhc1N0cm9rZSgpKXt2YXIgbD1vLmxpbmVXaWR0aC8oby5zdHJva2VOb1NjYWxlJiZlLmdldExpbmVTY2FsZT9lLmdldExpbmVTY2FsZSgpOjEpO3QubGluZVdpZHRoIT09bCYmKHN8fChjdih0LHIpLHM9ITApLHQubGluZVdpZHRoPWwpfWZvcih2YXIgdT0wO3U8c3YubGVuZ3RoO3UrKyl7dmFyIGg9c3ZbdV0sYz1oWzBdOyhpfHxvW2NdIT09YVtjXSkmJihzfHwoY3YodCxyKSxzPSEwKSx0W2NdPW9bY118fGhbMV0pfXJldHVybiBzfWZ1bmN0aW9uIGh2KHQsZSl7dmFyIG49ZS50cmFuc2Zvcm0saT10LmRwcnx8MTtuP3Quc2V0VHJhbnNmb3JtKGkqblswXSxpKm5bMV0saSpuWzJdLGkqblszXSxpKm5bNF0saSpuWzVdKTp0LnNldFRyYW5zZm9ybShpLDAsMCxpLDAsMCl9ZnVuY3Rpb24gY3YodCxlKXtlLmJhdGNoRmlsbCYmdC5maWxsKCksZS5iYXRjaFN0cm9rZSYmdC5zdHJva2UoKSxlLmJhdGNoRmlsbD0iIixlLmJhdGNoU3Ryb2tlPSIifWZ1bmN0aW9uIHB2KHQsZSl7cmV0dXJuIGUmJnQuX19ob3ZlclN0eWxlfHx0LnN0eWxlfWZ1bmN0aW9uIGR2KHQsZSl7ZnYodCxlLHtpbkhvdmVyOiExLHZpZXdXaWR0aDowLHZpZXdIZWlnaHQ6MH0sITApfWZ1bmN0aW9uIGZ2KHQsZSxuLGkpe3ZhciByPWUudHJhbnNmb3JtO2lmKCFlLnNob3VsZEJlUGFpbnRlZChuLnZpZXdXaWR0aCxuLnZpZXdIZWlnaHQsITEsITEpKXJldHVybiBlLl9fZGlydHkmPS0yLHZvaWQoZS5fX2lzUmVuZGVyZWQ9ITEpO3ZhciBvPWUuX19jbGlwUGF0aHMscz1uLnByZXZFbENsaXBQYXRocyxsPSExLHU9ITE7aWYocyYmIWZ1bmN0aW9uKHQsZSl7aWYodD09PWV8fCF0JiYhZSlyZXR1cm4hMTtpZighdHx8IWV8fHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXSE9PWVbbl0pcmV0dXJuITA7cmV0dXJuITF9KG8scyl8fChzJiZzLmxlbmd0aCYmKGN2KHQsbiksdC5yZXN0b3JlKCksdT1sPSEwLG4ucHJldkVsQ2xpcFBhdGhzPW51bGwsbi5hbGxDbGlwcGVkPSExLG4ucHJldkVsPW51bGwpLG8mJm8ubGVuZ3RoJiYoY3YodCxuKSx0LnNhdmUoKSxmdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPSExLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89dFtyXTtpPWl8fG8uaXNaZXJvQXJlYSgpLGh2KGUsbyksZS5iZWdpblBhdGgoKSxvLmJ1aWxkUGF0aChlLG8uc2hhcGUpLGUuY2xpcCgpfW4uYWxsQ2xpcHBlZD1pfShvLHQsbiksbD0hMCksbi5wcmV2RWxDbGlwUGF0aHM9byksbi5hbGxDbGlwcGVkKWUuX19pc1JlbmRlcmVkPSExO2Vsc2V7ZS5iZWZvcmVCcnVzaCYmZS5iZWZvcmVCcnVzaCgpLGUuaW5uZXJCZWZvcmVCcnVzaCgpO3ZhciBoPW4ucHJldkVsO2h8fCh1PWw9ITApO3ZhciBjLHAsZD1lIGluc3RhbmNlb2Yga3MmJmUuYXV0b0JhdGNoJiZmdW5jdGlvbih0KXt2YXIgZT1udih0KSxuPXR2KHQpO3JldHVybiEodC5saW5lRGFzaHx8ISgrZV4rbil8fGUmJiJzdHJpbmciIT10eXBlb2YgdC5maWxsfHxuJiYic3RyaW5nIiE9dHlwZW9mIHQuc3Ryb2tlfHx0LnN0cm9rZVBlcmNlbnQ8MXx8dC5zdHJva2VPcGFjaXR5PDF8fHQuZmlsbE9wYWNpdHk8MSl9KGUuc3R5bGUpO2x8fChjPXIscD1oLnRyYW5zZm9ybSxjJiZwP2NbMF0hPT1wWzBdfHxjWzFdIT09cFsxXXx8Y1syXSE9PXBbMl18fGNbM10hPT1wWzNdfHxjWzRdIT09cFs0XXx8Y1s1XSE9PXBbNV06Y3x8cCk/KGN2KHQsbiksaHYodCxlKSk6ZHx8Y3YodCxuKTt2YXIgZj1wdihlLG4uaW5Ib3Zlcik7ZSBpbnN0YW5jZW9mIGtzPygxIT09bi5sYXN0RHJhd1R5cGUmJih1PSEwLG4ubGFzdERyYXdUeXBlPTEpLHV2KHQsZSxoLHUsbiksZCYmKG4uYmF0Y2hGaWxsfHxuLmJhdGNoU3Ryb2tlKXx8dC5iZWdpblBhdGgoKSxmdW5jdGlvbih0LGUsbixpKXt2YXIgcixvPXR2KG4pLGE9bnYobikscz1uLnN0cm9rZVBlcmNlbnQsbD1zPDEsdT0hZS5wYXRoO2Uuc2lsZW50JiYhbHx8IXV8fGUuY3JlYXRlUGF0aFByb3h5KCk7dmFyIGg9ZS5wYXRofHxReSxjPWUuX19kaXJ0eTtpZighaSl7dmFyIHA9bi5maWxsLGQ9bi5zdHJva2UsZj1hJiYhIXAuY29sb3JTdG9wcyxnPW8mJiEhZC5jb2xvclN0b3BzLHk9YSYmISFwLmltYWdlLHY9byYmISFkLmltYWdlLG09dm9pZCAwLHg9dm9pZCAwLF89dm9pZCAwLGI9dm9pZCAwLHc9dm9pZCAwOyhmfHxnKSYmKHc9ZS5nZXRCb3VuZGluZ1JlY3QoKSksZiYmKG09Yz9xeSh0LHAsdyk6ZS5fX2NhbnZhc0ZpbGxHcmFkaWVudCxlLl9fY2FudmFzRmlsbEdyYWRpZW50PW0pLGcmJih4PWM/cXkodCxkLHcpOmUuX19jYW52YXNTdHJva2VHcmFkaWVudCxlLl9fY2FudmFzU3Ryb2tlR3JhZGllbnQ9eCkseSYmKF89Y3x8IWUuX19jYW52YXNGaWxsUGF0dGVybj9vdih0LHAsZSk6ZS5fX2NhbnZhc0ZpbGxQYXR0ZXJuLGUuX19jYW52YXNGaWxsUGF0dGVybj1fKSx2JiYoYj1jfHwhZS5fX2NhbnZhc1N0cm9rZVBhdHRlcm4/b3YodCxkLGUpOmUuX19jYW52YXNTdHJva2VQYXR0ZXJuLGUuX19jYW52YXNTdHJva2VQYXR0ZXJuPV8pLGY/dC5maWxsU3R5bGU9bTp5JiYoXz90LmZpbGxTdHlsZT1fOmE9ITEpLGc/dC5zdHJva2VTdHlsZT14OnYmJihiP3Quc3Ryb2tlU3R5bGU9YjpvPSExKX12YXIgUyxNLEk9ZS5nZXRHbG9iYWxTY2FsZSgpO2guc2V0U2NhbGUoSVswXSxJWzFdLGUuc2VnbWVudElnbm9yZVRocmVzaG9sZCksdC5zZXRMaW5lRGFzaCYmbi5saW5lRGFzaCYmKFM9KHI9SnkoZSkpWzBdLE09clsxXSk7dmFyIFQ9ITA7KHV8fDQmYykmJihoLnNldERQUih0LmRwciksbD9oLnNldENvbnRleHQobnVsbCk6KGguc2V0Q29udGV4dCh0KSxUPSExKSxoLnJlc2V0KCksZS5idWlsZFBhdGgoaCxlLnNoYXBlLGkpLGgudG9TdGF0aWMoKSxlLnBhdGhVcGRhdGVkKCkpLFQmJmgucmVidWlsZFBhdGgodCxsP3M6MSksUyYmKHQuc2V0TGluZURhc2goUyksdC5saW5lRGFzaE9mZnNldD1NKSxpfHwobi5zdHJva2VGaXJzdD8obyYmcnYodCxuKSxhJiZpdih0LG4pKTooYSYmaXYodCxuKSxvJiZydih0LG4pKSksUyYmdC5zZXRMaW5lRGFzaChbXSl9KHQsZSxmLGQpLGQmJihuLmJhdGNoRmlsbD1mLmZpbGx8fCIiLG4uYmF0Y2hTdHJva2U9Zi5zdHJva2V8fCIiKSk6ZSBpbnN0YW5jZW9mIFBzPygzIT09bi5sYXN0RHJhd1R5cGUmJih1PSEwLG4ubGFzdERyYXdUeXBlPTMpLHV2KHQsZSxoLHUsbiksZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9bi50ZXh0O2lmKG51bGwhPXImJihyKz0iIikscil7dC5mb250PW4uZm9udHx8YSx0LnRleHRBbGlnbj1uLnRleHRBbGlnbix0LnRleHRCYXNlbGluZT1uLnRleHRCYXNlbGluZTt2YXIgbz12b2lkIDAscz12b2lkIDA7dC5zZXRMaW5lRGFzaCYmbi5saW5lRGFzaCYmKG89KGk9SnkoZSkpWzBdLHM9aVsxXSksbyYmKHQuc2V0TGluZURhc2gobyksdC5saW5lRGFzaE9mZnNldD1zKSxuLnN0cm9rZUZpcnN0Pyh0dihuKSYmdC5zdHJva2VUZXh0KHIsbi54LG4ueSksbnYobikmJnQuZmlsbFRleHQocixuLngsbi55KSk6KG52KG4pJiZ0LmZpbGxUZXh0KHIsbi54LG4ueSksdHYobikmJnQuc3Ryb2tlVGV4dChyLG4ueCxuLnkpKSxvJiZ0LnNldExpbmVEYXNoKFtdKX19KHQsZSxmKSk6ZSBpbnN0YW5jZW9mIE5zPygyIT09bi5sYXN0RHJhd1R5cGUmJih1PSEwLG4ubGFzdERyYXdUeXBlPTIpLGZ1bmN0aW9uKHQsZSxuLGkscil7bHYodCxwdihlLHIuaW5Ib3ZlciksbiYmcHYobixyLmluSG92ZXIpLGkscil9KHQsZSxoLHUsbiksZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUuX19pbWFnZT1sYShuLmltYWdlLGUuX19pbWFnZSxlLGUub25sb2FkKTtpZihpJiZoYShpKSl7dmFyIHI9bi54fHwwLG89bi55fHwwLGE9ZS5nZXRXaWR0aCgpLHM9ZS5nZXRIZWlnaHQoKSxsPWkud2lkdGgvaS5oZWlnaHQ7aWYobnVsbD09YSYmbnVsbCE9cz9hPXMqbDpudWxsPT1zJiZudWxsIT1hP3M9YS9sOm51bGw9PWEmJm51bGw9PXMmJihhPWkud2lkdGgscz1pLmhlaWdodCksbi5zV2lkdGgmJm4uc0hlaWdodCl7dmFyIHU9bi5zeHx8MCxoPW4uc3l8fDA7dC5kcmF3SW1hZ2UoaSx1LGgsbi5zV2lkdGgsbi5zSGVpZ2h0LHIsbyxhLHMpfWVsc2UgaWYobi5zeCYmbi5zeSl7dmFyIGM9YS0odT1uLnN4KSxwPXMtKGg9bi5zeSk7dC5kcmF3SW1hZ2UoaSx1LGgsYyxwLHIsbyxhLHMpfWVsc2UgdC5kcmF3SW1hZ2UoaSxyLG8sYSxzKX19KHQsZSxmKSk6ZS5nZXRUZW1wb3JhbERpc3BsYXlhYmxlcyYmKDQhPT1uLmxhc3REcmF3VHlwZSYmKHU9ITAsbi5sYXN0RHJhd1R5cGU9NCksZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUuZ2V0RGlzcGxheWFibGVzKCkscj1lLmdldFRlbXBvcmFsRGlzcGxheWFibGVzKCk7dC5zYXZlKCk7dmFyIG8sYSxzPXtwcmV2RWxDbGlwUGF0aHM6bnVsbCxwcmV2RWw6bnVsbCxhbGxDbGlwcGVkOiExLHZpZXdXaWR0aDpuLnZpZXdXaWR0aCx2aWV3SGVpZ2h0Om4udmlld0hlaWdodCxpbkhvdmVyOm4uaW5Ib3Zlcn07Zm9yKG89ZS5nZXRDdXJzb3IoKSxhPWkubGVuZ3RoO288YTtvKyspeyhoPWlbb10pLmJlZm9yZUJydXNoJiZoLmJlZm9yZUJydXNoKCksaC5pbm5lckJlZm9yZUJydXNoKCksZnYodCxoLHMsbz09PWEtMSksaC5pbm5lckFmdGVyQnJ1c2goKSxoLmFmdGVyQnJ1c2gmJmguYWZ0ZXJCcnVzaCgpLHMucHJldkVsPWh9Zm9yKHZhciBsPTAsdT1yLmxlbmd0aDtsPHU7bCsrKXt2YXIgaDsoaD1yW2xdKS5iZWZvcmVCcnVzaCYmaC5iZWZvcmVCcnVzaCgpLGguaW5uZXJCZWZvcmVCcnVzaCgpLGZ2KHQsaCxzLGw9PT11LTEpLGguaW5uZXJBZnRlckJydXNoKCksaC5hZnRlckJydXNoJiZoLmFmdGVyQnJ1c2goKSxzLnByZXZFbD1ofWUuY2xlYXJUZW1wb3JhbERpc3BsYXlhYmxlcygpLGUubm90Q2xlYXI9ITAsdC5yZXN0b3JlKCl9KHQsZSxuKSksZCYmaSYmY3YodCxuKSxlLmlubmVyQWZ0ZXJCcnVzaCgpLGUuYWZ0ZXJCcnVzaCYmZS5hZnRlckJydXNoKCksbi5wcmV2RWw9ZSxlLl9fZGlydHk9MCxlLl9faXNSZW5kZXJlZD0hMH19dmFyIGd2PW5ldyBFeSx5dj1uZXcgRW4oMTAwKSx2dj1bInN5bWJvbCIsInN5bWJvbFNpemUiLCJzeW1ib2xLZWVwQXNwZWN0IiwiY29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJkYXNoQXJyYXlYIiwiZGFzaEFycmF5WSIsIm1heFRpbGVXaWR0aCIsIm1heFRpbGVIZWlnaHQiXTtmdW5jdGlvbiBtdih0LGUpe2lmKCJub25lIj09PXQpcmV0dXJuIG51bGw7dmFyIG49ZS5nZXREZXZpY2VQaXhlbFJhdGlvKCksaT1lLmdldFpyKCkscj0ic3ZnIj09PWkucGFpbnRlci50eXBlO3QuZGlydHkmJmd2LmRlbGV0ZSh0KTt2YXIgbz1ndi5nZXQodCk7aWYobylyZXR1cm4gbzt2YXIgYT1rKHQse3N5bWJvbDoicmVjdCIsc3ltYm9sU2l6ZToxLHN5bWJvbEtlZXBBc3BlY3Q6ITAsY29sb3I6InJnYmEoMCwgMCwgMCwgMC4yKSIsYmFja2dyb3VuZENvbG9yOm51bGwsZGFzaEFycmF5WDo1LGRhc2hBcnJheVk6NSxyb3RhdGlvbjowLG1heFRpbGVXaWR0aDo1MTIsbWF4VGlsZUhlaWdodDo1MTJ9KTsibm9uZSI9PT1hLmJhY2tncm91bmRDb2xvciYmKGEuYmFja2dyb3VuZENvbG9yPW51bGwpO3ZhciBzPXtyZXBlYXQ6InJlcGVhdCJ9O3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGUsbz1bbl0scz0hMCxsPTA7bDx2di5sZW5ndGg7KytsKXt2YXIgdT1hW3Z2W2xdXTtpZihudWxsIT11JiYhWSh1KSYmIVUodSkmJiFqKHUpJiYiYm9vbGVhbiIhPXR5cGVvZiB1KXtzPSExO2JyZWFrfW8ucHVzaCh1KX1pZihzKXtlPW8uam9pbigiLCIpKyhyPyItc3ZnIjoiIik7dmFyIGM9eXYuZ2V0KGUpO2MmJihyP3Quc3ZnRWxlbWVudD1jOnQuaW1hZ2U9Yyl9dmFyIHAsZD1fdihhLmRhc2hBcnJheVgpLGY9ZnVuY3Rpb24odCl7aWYoIXR8fCJvYmplY3QiPT10eXBlb2YgdCYmMD09PXQubGVuZ3RoKXJldHVyblswLDBdO2lmKGoodCkpe3ZhciBlPU1hdGguY2VpbCh0KTtyZXR1cm5bZSxlXX12YXIgbj16KHQsKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwodCl9KSk7cmV0dXJuIHQubGVuZ3RoJTI/bi5jb25jYXQobik6bn0oYS5kYXNoQXJyYXlZKSxnPXh2KGEuc3ltYm9sKSx5PShiPWQseihiLChmdW5jdGlvbih0KXtyZXR1cm4gYnYodCl9KSkpLHY9YnYoZiksbT0hciYmaC5jcmVhdGVDYW52YXMoKSx4PXImJnt0YWc6ImciLGF0dHJzOnt9LGtleToiZGNsIixjaGlsZHJlbjpbXX0sXz1mdW5jdGlvbigpe2Zvcih2YXIgdD0xLGU9MCxuPXkubGVuZ3RoO2U8bjsrK2UpdD1fbyh0LHlbZV0pO3ZhciBpPTE7Zm9yKGU9MCxuPWcubGVuZ3RoO2U8bjsrK2UpaT1fbyhpLGdbZV0ubGVuZ3RoKTt0Kj1pO3ZhciByPXYqeS5sZW5ndGgqZy5sZW5ndGg7cmV0dXJue3dpZHRoOk1hdGgubWF4KDEsTWF0aC5taW4odCxhLm1heFRpbGVXaWR0aCkpLGhlaWdodDpNYXRoLm1heCgxLE1hdGgubWluKHIsYS5tYXhUaWxlSGVpZ2h0KSl9fSgpO3ZhciBiO20mJihtLndpZHRoPV8ud2lkdGgqbixtLmhlaWdodD1fLmhlaWdodCpuLHA9bS5nZXRDb250ZXh0KCIyZCIpKTsoZnVuY3Rpb24oKXtwJiYocC5jbGVhclJlY3QoMCwwLG0ud2lkdGgsbS5oZWlnaHQpLGEuYmFja2dyb3VuZENvbG9yJiYocC5maWxsU3R5bGU9YS5iYWNrZ3JvdW5kQ29sb3IscC5maWxsUmVjdCgwLDAsbS53aWR0aCxtLmhlaWdodCkpKTtmb3IodmFyIHQ9MCxlPTA7ZTxmLmxlbmd0aDsrK2UpdCs9ZltlXTtpZih0PD0wKXJldHVybjt2YXIgbz0tdixzPTAsbD0wLHU9MDtmb3IoO288Xy5oZWlnaHQ7KXtpZihzJTI9PTApe2Zvcih2YXIgaD1sLzIlZy5sZW5ndGgsYz0wLHk9MCxiPTA7YzwyKl8ud2lkdGg7KXt2YXIgdz0wO2ZvcihlPTA7ZTxkW3VdLmxlbmd0aDsrK2Updys9ZFt1XVtlXTtpZih3PD0wKWJyZWFrO2lmKHklMj09MCl7dmFyIFM9LjUqKDEtYS5zeW1ib2xTaXplKSxNPWMrZFt1XVt5XSpTLEk9bytmW3NdKlMsVD1kW3VdW3ldKmEuc3ltYm9sU2l6ZSxDPWZbc10qYS5zeW1ib2xTaXplLEQ9Yi8yJWdbaF0ubGVuZ3RoO0EoTSxJLFQsQyxnW2hdW0RdKX1jKz1kW3VdW3ldLCsrYiwrK3k9PT1kW3VdLmxlbmd0aCYmKHk9MCl9Kyt1PT09ZC5sZW5ndGgmJih1PTApfW8rPWZbc10sKytsLCsrcz09PWYubGVuZ3RoJiYocz0wKX1mdW5jdGlvbiBBKHQsZSxvLHMsbCl7dmFyIHU9cj8xOm4saD1YeShsLHQqdSxlKnUsbyp1LHMqdSxhLmNvbG9yLGEuc3ltYm9sS2VlcEFzcGVjdCk7aWYocil7dmFyIGM9aS5wYWludGVyLnJlbmRlck9uZVRvVk5vZGUoaCk7YyYmeC5jaGlsZHJlbi5wdXNoKGMpfWVsc2UgZHYocCxoKX19KSgpLHMmJnl2LnB1dChlLG18fHgpO3QuaW1hZ2U9bSx0LnN2Z0VsZW1lbnQ9eCx0LnN2Z1dpZHRoPV8ud2lkdGgsdC5zdmdIZWlnaHQ9Xy5oZWlnaHR9KHMpLHMucm90YXRpb249YS5yb3RhdGlvbixzLnNjYWxlWD1zLnNjYWxlWT1yPzE6MS9uLGd2LnNldCh0LHMpLHQuZGlydHk9ITEsc31mdW5jdGlvbiB4dih0KXtpZighdHx8MD09PXQubGVuZ3RoKXJldHVybltbInJlY3QiXV07aWYoVSh0KSlyZXR1cm5bW3RdXTtmb3IodmFyIGU9ITAsbj0wO248dC5sZW5ndGg7KytuKWlmKCFVKHRbbl0pKXtlPSExO2JyZWFrfWlmKGUpcmV0dXJuIHh2KFt0XSk7dmFyIGk9W107Zm9yKG49MDtuPHQubGVuZ3RoOysrbilVKHRbbl0pP2kucHVzaChbdFtuXV0pOmkucHVzaCh0W25dKTtyZXR1cm4gaX1mdW5jdGlvbiBfdih0KXtpZighdHx8MD09PXQubGVuZ3RoKXJldHVybltbMCwwXV07aWYoaih0KSlyZXR1cm5bW3I9TWF0aC5jZWlsKHQpLHJdXTtmb3IodmFyIGU9ITAsbj0wO248dC5sZW5ndGg7KytuKWlmKCFqKHRbbl0pKXtlPSExO2JyZWFrfWlmKGUpcmV0dXJuIF92KFt0XSk7dmFyIGk9W107Zm9yKG49MDtuPHQubGVuZ3RoOysrbilpZihqKHRbbl0pKXt2YXIgcj1NYXRoLmNlaWwodFtuXSk7aS5wdXNoKFtyLHJdKX1lbHNleyhyPXoodFtuXSwoZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbCh0KX0pKSkubGVuZ3RoJTI9PTE/aS5wdXNoKHIuY29uY2F0KHIpKTppLnB1c2gocil9cmV0dXJuIGl9ZnVuY3Rpb24gYnYodCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7KytuKWUrPXRbbl07cmV0dXJuIHQubGVuZ3RoJTI9PTE/MiplOmV9dmFyIHd2PW5ldyBqdCxTdj17fTtmdW5jdGlvbiBNdih0KXtyZXR1cm4gU3ZbdF19dmFyIEl2PTJlMyxUdj00NTAwLEN2PXtQUk9DRVNTT1I6e0ZJTFRFUjoxZTMsU0VSSUVTX0ZJTFRFUjo4MDAsU1RBVElTVElDOjVlM30sVklTVUFMOntMQVlPVVQ6MWUzLFBST0dSRVNTSVZFX0xBWU9VVDoxMTAwLEdMT0JBTDpJdixDSEFSVDozZTMsUE9TVF9DSEFSVF9MQVlPVVQ6NDYwMCxDT01QT05FTlQ6NGUzLEJSVVNIOjVlMyxDSEFSVF9JVEVNOlR2LEFSSUE6NmUzLERFQ0FMOjdlM319LER2PSJfX2ZsYWdJbk1haW5Qcm9jZXNzIixBdj0iX19wZW5kaW5nVXBkYXRlIixrdj0iX19uZWVkc1VwZGF0ZVN0YXR1cyIsTHY9L15bYS16QS1aMC05X10rJC8sUHY9Il9fY29ubmVjdFVwZGF0ZVN0YXR1cyI7ZnVuY3Rpb24gT3YodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO2lmKCF0aGlzLmlzRGlzcG9zZWQoKSlyZXR1cm4gTnYodGhpcyx0LGUpO29tKHRoaXMuaWQpfX1mdW5jdGlvbiBSdih0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIE52KHRoaXMsdCxlKX19ZnVuY3Rpb24gTnYodCxlLG4pe3JldHVybiBuWzBdPW5bMF0mJm5bMF0udG9Mb3dlckNhc2UoKSxqdC5wcm90b3R5cGVbZV0uYXBwbHkodCxuKX12YXIgRXYsenYsVnYsQnYsRnYsR3YsV3YsSHYsWXYsWHYsVXYsWnYsanYscXYsS3YsJHYsSnYsUXYsdG09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlfShqdCksZW09dG0ucHJvdG90eXBlO2VtLm9uPVJ2KCJvbiIpLGVtLm9mZj1Sdigib2ZmIik7dmFyIG5tPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLGkpe3ZhciByPXQuY2FsbCh0aGlzLG5ldyBTeSl8fHRoaXM7ci5fY2hhcnRzVmlld3M9W10sci5fY2hhcnRzTWFwPXt9LHIuX2NvbXBvbmVudHNWaWV3cz1bXSxyLl9jb21wb25lbnRzTWFwPXt9LHIuX3BlbmRpbmdBY3Rpb25zPVtdLGk9aXx8e30sVShuKSYmKG49Y21bbl0pLHIuX2RvbT1lO3ZhciBvPSJjYW52YXMiLGE9ImF1dG8iLHM9ITE7aS5zc3ImJlpyKChmdW5jdGlvbih0KXt2YXIgZT1ybCh0KSxuPWUuZGF0YUluZGV4O2lmKG51bGwhPW4pe3ZhciBpPXl0KCk7cmV0dXJuIGkuc2V0KCJzZXJpZXNfaW5kZXgiLGUuc2VyaWVzSW5kZXgpLGkuc2V0KCJkYXRhX2luZGV4IixuKSxlLnNzclR5cGUmJmkuc2V0KCJzc3JfdHlwZSIsZS5zc3JUeXBlKSxpfX0pKTt2YXIgbD1yLl96cj1ZcihlLHtyZW5kZXJlcjppLnJlbmRlcmVyfHxvLGRldmljZVBpeGVsUmF0aW86aS5kZXZpY2VQaXhlbFJhdGlvLHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0LHNzcjppLnNzcix1c2VEaXJ0eVJlY3Q6cnQoaS51c2VEaXJ0eVJlY3QscyksdXNlQ29hcnNlUG9pbnRlcjpydChpLnVzZUNvYXJzZVBvaW50ZXIsYSkscG9pbnRlclNpemU6aS5wb2ludGVyU2l6ZX0pO3IuX3Nzcj1pLnNzcixyLl90aHJvdHRsZWRackZsdXNoPVdnKFcobC5mbHVzaCxsKSwxNyksKG49VChuKSkmJlhkKG4sITApLHIuX3RoZW1lPW4sci5fbG9jYWxlPWZ1bmN0aW9uKHQpe2lmKFUodCkpe3ZhciBlPVJjW3QudG9VcHBlckNhc2UoKV18fHt9O3JldHVybiB0PT09TGN8fHQ9PT1QYz9UKGUpOkMoVChlKSxUKFJjW09jXSksITEpfXJldHVybiBDKFQodCksVChSY1tPY10pLCExKX0oaS5sb2NhbGV8fEVjKSxyLl9jb29yZFN5c01ncj1uZXcgd2Q7dmFyIHU9ci5fYXBpPUt2KHIpO2Z1bmN0aW9uIGgodCxlKXtyZXR1cm4gdC5fX3ByaW8tZS5fX3ByaW99cmV0dXJuIFFlKGhtLGgpLFFlKGxtLGgpLHIuX3NjaGVkdWxlcj1uZXcgZXkocix1LGxtLGhtKSxyLl9tZXNzYWdlQ2VudGVyPW5ldyB0bSxyLl9pbml0RXZlbnRzKCksci5yZXNpemU9VyhyLnJlc2l6ZSxyKSxsLmFuaW1hdGlvbi5vbigiZnJhbWUiLHIuX29uZnJhbWUsciksWHYobCxyKSxVdihsLHIpLGN0KHIpLHJ9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5fb25mcmFtZT1mdW5jdGlvbigpe2lmKCF0aGlzLl9kaXNwb3NlZCl7UXYodGhpcyk7dmFyIHQ9dGhpcy5fc2NoZWR1bGVyO2lmKHRoaXNbQXZdKXt2YXIgZT10aGlzW0F2XS5zaWxlbnQ7dGhpc1tEdl09ITA7dHJ5e0V2KHRoaXMpLEJ2LnVwZGF0ZS5jYWxsKHRoaXMsbnVsbCx0aGlzW0F2XS51cGRhdGVQYXJhbXMpfWNhdGNoKHQpe3Rocm93IHRoaXNbRHZdPSExLHRoaXNbQXZdPW51bGwsdH10aGlzLl96ci5mbHVzaCgpLHRoaXNbRHZdPSExLHRoaXNbQXZdPW51bGwsSHYuY2FsbCh0aGlzLGUpLFl2LmNhbGwodGhpcyxlKX1lbHNlIGlmKHQudW5maW5pc2hlZCl7dmFyIG49MSxpPXRoaXMuX21vZGVsLHI9dGhpcy5fYXBpO3QudW5maW5pc2hlZD0hMTtkb3t2YXIgbz0rbmV3IERhdGU7dC5wZXJmb3JtU2VyaWVzVGFza3MoaSksdC5wZXJmb3JtRGF0YVByb2Nlc3NvclRhc2tzKGkpLEd2KHRoaXMsaSksdC5wZXJmb3JtVmlzdWFsVGFza3MoaSkscXYodGhpcyx0aGlzLl9tb2RlbCxyLCJyZW1haW4iLHt9KSxuLT0rbmV3IERhdGUtb313aGlsZShuPjAmJnQudW5maW5pc2hlZCk7dC51bmZpbmlzaGVkfHx0aGlzLl96ci5mbHVzaCgpfX19LGUucHJvdG90eXBlLmdldERvbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb219LGUucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGUucHJvdG90eXBlLmdldFpyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pyfSxlLnByb3RvdHlwZS5pc1NTUj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zc3J9LGUucHJvdG90eXBlLnNldE9wdGlvbj1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXNbRHZdKWlmKHRoaXMuX2Rpc3Bvc2VkKW9tKHRoaXMuaWQpO2Vsc2V7dmFyIGkscixvO2lmKHEoZSkmJihuPWUubGF6eVVwZGF0ZSxpPWUuc2lsZW50LHI9ZS5yZXBsYWNlTWVyZ2Usbz1lLnRyYW5zaXRpb24sZT1lLm5vdE1lcmdlKSx0aGlzW0R2XT0hMCwhdGhpcy5fbW9kZWx8fGUpe3ZhciBhPW5ldyBNZCh0aGlzLl9hcGkpLHM9dGhpcy5fdGhlbWUsbD10aGlzLl9tb2RlbD1uZXcgZ2Q7bC5zY2hlZHVsZXI9dGhpcy5fc2NoZWR1bGVyLGwuc3NyPXRoaXMuX3NzcixsLmluaXQobnVsbCxudWxsLG51bGwscyx0aGlzLl9sb2NhbGUsYSl9dGhpcy5fbW9kZWwuc2V0T3B0aW9uKHQse3JlcGxhY2VNZXJnZTpyfSx1bSk7dmFyIHU9e3Nlcmllc1RyYW5zaXRpb246byxvcHRpb25DaGFuZ2VkOiEwfTtpZihuKXRoaXNbQXZdPXtzaWxlbnQ6aSx1cGRhdGVQYXJhbXM6dX0sdGhpc1tEdl09ITEsdGhpcy5nZXRacigpLndha2VVcCgpO2Vsc2V7dHJ5e0V2KHRoaXMpLEJ2LnVwZGF0ZS5jYWxsKHRoaXMsbnVsbCx1KX1jYXRjaCh0KXt0aHJvdyB0aGlzW0F2XT1udWxsLHRoaXNbRHZdPSExLHR9dGhpcy5fc3NyfHx0aGlzLl96ci5mbHVzaCgpLHRoaXNbQXZdPW51bGwsdGhpc1tEdl09ITEsSHYuY2FsbCh0aGlzLGkpLFl2LmNhbGwodGhpcyxpKX19fSxlLnByb3RvdHlwZS5zZXRUaGVtZT1mdW5jdGlvbigpe2JvKCl9LGUucHJvdG90eXBlLmdldE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGVsfSxlLnByb3RvdHlwZS5nZXRPcHRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWwmJnRoaXMuX21vZGVsLmdldE9wdGlvbigpfSxlLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl96ci5nZXRXaWR0aCgpfSxlLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fenIuZ2V0SGVpZ2h0KCl9LGUucHJvdG90eXBlLmdldERldmljZVBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fenIucGFpbnRlci5kcHJ8fHIuaGFzR2xvYmFsV2luZG93JiZ3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MX0sZS5wcm90b3R5cGUuZ2V0UmVuZGVyZWRDYW52YXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVyVG9DYW52YXModCl9LGUucHJvdG90eXBlLnJlbmRlclRvQ2FudmFzPWZ1bmN0aW9uKHQpe3Q9dHx8e307dmFyIGU9dGhpcy5fenIucGFpbnRlcjtyZXR1cm4gZS5nZXRSZW5kZXJlZENhbnZhcyh7YmFja2dyb3VuZENvbG9yOnQuYmFja2dyb3VuZENvbG9yfHx0aGlzLl9tb2RlbC5nZXQoImJhY2tncm91bmRDb2xvciIpLHBpeGVsUmF0aW86dC5waXhlbFJhdGlvfHx0aGlzLmdldERldmljZVBpeGVsUmF0aW8oKX0pfSxlLnByb3RvdHlwZS5yZW5kZXJUb1NWR1N0cmluZz1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlPXRoaXMuX3pyLnBhaW50ZXI7cmV0dXJuIGUucmVuZGVyVG9TdHJpbmcoe3VzZVZpZXdCb3g6dC51c2VWaWV3Qm94fSl9LGUucHJvdG90eXBlLmdldFN2Z0RhdGFVUkw9ZnVuY3Rpb24oKXtpZihyLnN2Z1N1cHBvcnRlZCl7dmFyIHQ9dGhpcy5fenI7cmV0dXJuIEUodC5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCksKGZ1bmN0aW9uKHQpe3Quc3RvcEFuaW1hdGlvbihudWxsLCEwKX0pKSx0LnBhaW50ZXIudG9EYXRhVVJMKCl9fSxlLnByb3RvdHlwZS5nZXREYXRhVVJMPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9kaXNwb3NlZCl7dmFyIGU9KHQ9dHx8e30pLmV4Y2x1ZGVDb21wb25lbnRzLG49dGhpcy5fbW9kZWwsaT1bXSxyPXRoaXM7RShlLChmdW5jdGlvbih0KXtuLmVhY2hDb21wb25lbnQoe21haW5UeXBlOnR9LChmdW5jdGlvbih0KXt2YXIgZT1yLl9jb21wb25lbnRzTWFwW3QuX192aWV3SWRdO2UuZ3JvdXAuaWdub3JlfHwoaS5wdXNoKGUpLGUuZ3JvdXAuaWdub3JlPSEwKX0pKX0pKTt2YXIgbz0ic3ZnIj09PXRoaXMuX3pyLnBhaW50ZXIuZ2V0VHlwZSgpP3RoaXMuZ2V0U3ZnRGF0YVVSTCgpOnRoaXMucmVuZGVyVG9DYW52YXModCkudG9EYXRhVVJMKCJpbWFnZS8iKyh0JiZ0LnR5cGV8fCJwbmciKSk7cmV0dXJuIEUoaSwoZnVuY3Rpb24odCl7dC5ncm91cC5pZ25vcmU9ITF9KSksb31vbSh0aGlzLmlkKX0sZS5wcm90b3R5cGUuZ2V0Q29ubmVjdGVkRGF0YVVSTD1mdW5jdGlvbih0KXtpZighdGhpcy5fZGlzcG9zZWQpe3ZhciBlPSJzdmciPT09dC50eXBlLG49dGhpcy5ncm91cCxpPU1hdGgubWluLHI9TWF0aC5tYXgsbz0xLzA7aWYoZm1bbl0pe3ZhciBhPW8scz1vLGw9LTEvMCx1PS0xLzAsYz1bXSxwPXQmJnQucGl4ZWxSYXRpb3x8dGhpcy5nZXREZXZpY2VQaXhlbFJhdGlvKCk7RShkbSwoZnVuY3Rpb24obyxoKXtpZihvLmdyb3VwPT09bil7dmFyIHA9ZT9vLmdldFpyKCkucGFpbnRlci5nZXRTdmdEb20oKS5pbm5lckhUTUw6by5yZW5kZXJUb0NhbnZhcyhUKHQpKSxkPW8uZ2V0RG9tKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7YT1pKGQubGVmdCxhKSxzPWkoZC50b3AscyksbD1yKGQucmlnaHQsbCksdT1yKGQuYm90dG9tLHUpLGMucHVzaCh7ZG9tOnAsbGVmdDpkLmxlZnQsdG9wOmQudG9wfSl9fSkpO3ZhciBkPShsKj1wKS0oYSo9cCksZj0odSo9cCktKHMqPXApLGc9aC5jcmVhdGVDYW52YXMoKSx5PVlyKGcse3JlbmRlcmVyOmU/InN2ZyI6ImNhbnZhcyJ9KTtpZih5LnJlc2l6ZSh7d2lkdGg6ZCxoZWlnaHQ6Zn0pLGUpe3ZhciB2PSIiO3JldHVybiBFKGMsKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVmdC1hLG49dC50b3Atczt2Kz0nPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoJytlKyIsIituKycpIj4nK3QuZG9tKyI8L2c+In0pKSx5LnBhaW50ZXIuZ2V0U3ZnUm9vdCgpLmlubmVySFRNTD12LHQuY29ubmVjdGVkQmFja2dyb3VuZENvbG9yJiZ5LnBhaW50ZXIuc2V0QmFja2dyb3VuZENvbG9yKHQuY29ubmVjdGVkQmFja2dyb3VuZENvbG9yKSx5LnJlZnJlc2hJbW1lZGlhdGVseSgpLHkucGFpbnRlci50b0RhdGFVUkwoKX1yZXR1cm4gdC5jb25uZWN0ZWRCYWNrZ3JvdW5kQ29sb3ImJnkuYWRkKG5ldyBXcyh7c2hhcGU6e3g6MCx5OjAsd2lkdGg6ZCxoZWlnaHQ6Zn0sc3R5bGU6e2ZpbGw6dC5jb25uZWN0ZWRCYWNrZ3JvdW5kQ29sb3J9fSkpLEUoYywoZnVuY3Rpb24odCl7dmFyIGU9bmV3IE5zKHtzdHlsZTp7eDp0LmxlZnQqcC1hLHk6dC50b3AqcC1zLGltYWdlOnQuZG9tfX0pO3kuYWRkKGUpfSkpLHkucmVmcmVzaEltbWVkaWF0ZWx5KCksZy50b0RhdGFVUkwoImltYWdlLyIrKHQmJnQudHlwZXx8InBuZyIpKX1yZXR1cm4gdGhpcy5nZXREYXRhVVJMKHQpfW9tKHRoaXMuaWQpfSxlLnByb3RvdHlwZS5jb252ZXJ0VG9QaXhlbD1mdW5jdGlvbih0LGUpe3JldHVybiBGdih0aGlzLCJjb252ZXJ0VG9QaXhlbCIsdCxlKX0sZS5wcm90b3R5cGUuY29udmVydEZyb21QaXhlbD1mdW5jdGlvbih0LGUpe3JldHVybiBGdih0aGlzLCJjb252ZXJ0RnJvbVBpeGVsIix0LGUpfSxlLnByb3RvdHlwZS5jb250YWluUGl4ZWw9ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdGhpcy5fZGlzcG9zZWQpcmV0dXJuIEUoRm8odGhpcy5fbW9kZWwsdCksKGZ1bmN0aW9uKHQsaSl7aS5pbmRleE9mKCJNb2RlbHMiKT49MCYmRSh0LChmdW5jdGlvbih0KXt2YXIgcj10LmNvb3JkaW5hdGVTeXN0ZW07aWYociYmci5jb250YWluUG9pbnQpbj1ufHwhIXIuY29udGFpblBvaW50KGUpO2Vsc2UgaWYoInNlcmllc01vZGVscyI9PT1pKXt2YXIgbz10aGlzLl9jaGFydHNNYXBbdC5fX3ZpZXdJZF07byYmby5jb250YWluUG9pbnQmJihuPW58fG8uY29udGFpblBvaW50KGUsdCkpfWVsc2UgMH0pLHRoaXMpfSksdGhpcyksISFuO29tKHRoaXMuaWQpfSxlLnByb3RvdHlwZS5nZXRWaXN1YWw9ZnVuY3Rpb24odCxlKXt2YXIgbj1Gbyh0aGlzLl9tb2RlbCx0LHtkZWZhdWx0TWFpblR5cGU6InNlcmllcyJ9KSxpPW4uc2VyaWVzTW9kZWw7dmFyIHI9aS5nZXREYXRhKCksbz1uLmhhc093blByb3BlcnR5KCJkYXRhSW5kZXhJbnNpZGUiKT9uLmRhdGFJbmRleEluc2lkZTpuLmhhc093blByb3BlcnR5KCJkYXRhSW5kZXgiKT9yLmluZGV4T2ZSYXdJbmRleChuLmRhdGFJbmRleCk6bnVsbDtyZXR1cm4gbnVsbCE9bz9EeShyLG8sZSk6QXkocixlKX0sZS5wcm90b3R5cGUuZ2V0Vmlld09mQ29tcG9uZW50TW9kZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHNNYXBbdC5fX3ZpZXdJZF19LGUucHJvdG90eXBlLmdldFZpZXdPZlNlcmllc01vZGVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jaGFydHNNYXBbdC5fX3ZpZXdJZF19LGUucHJvdG90eXBlLl9pbml0RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGk9dGhpcztFKHJtLChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlKXt2YXIgbixyPWkuZ2V0TW9kZWwoKSxvPWUudGFyZ2V0LGE9Imdsb2JhbG91dCI9PT10O2lmKGE/bj17fTpvJiZPeShvLChmdW5jdGlvbih0KXt2YXIgZT1ybCh0KTtpZihlJiZudWxsIT1lLmRhdGFJbmRleCl7dmFyIGk9ZS5kYXRhTW9kZWx8fHIuZ2V0U2VyaWVzQnlJbmRleChlLnNlcmllc0luZGV4KTtyZXR1cm4gbj1pJiZpLmdldERhdGFQYXJhbXMoZS5kYXRhSW5kZXgsZS5kYXRhVHlwZSxvKXx8e30sITB9aWYoZS5ldmVudERhdGEpcmV0dXJuIG49QSh7fSxlLmV2ZW50RGF0YSksITB9KSwhMCksbil7dmFyIHM9bi5jb21wb25lbnRUeXBlLGw9bi5jb21wb25lbnRJbmRleDsibWFya0xpbmUiIT09cyYmIm1hcmtQb2ludCIhPT1zJiYibWFya0FyZWEiIT09c3x8KHM9InNlcmllcyIsbD1uLnNlcmllc0luZGV4KTt2YXIgdT1zJiZudWxsIT1sJiZyLmdldENvbXBvbmVudChzLGwpLGg9dSYmaVsic2VyaWVzIj09PXUubWFpblR5cGU/Il9jaGFydHNNYXAiOiJfY29tcG9uZW50c01hcCJdW3UuX192aWV3SWRdOzAsbi5ldmVudD1lLG4udHlwZT10LGkuXyRldmVudFByb2Nlc3Nvci5ldmVudEluZm89e3RhcmdldEVsOm8scGFja2VkRXZlbnQ6bixtb2RlbDp1LHZpZXc6aH0saS50cmlnZ2VyKHQsbil9fTtlLnpyRXZlbnRmdWxDYWxsQXRMYXN0PSEwLGkuX3pyLm9uKHQsZSxpKX0pKSxFKHNtLChmdW5jdGlvbih0LGUpe2kuX21lc3NhZ2VDZW50ZXIub24oZSwoZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKGUsdCl9KSxpKX0pKSxFKFsic2VsZWN0Y2hhbmdlZCJdLChmdW5jdGlvbih0KXtpLl9tZXNzYWdlQ2VudGVyLm9uKHQsKGZ1bmN0aW9uKGUpe3RoaXMudHJpZ2dlcih0LGUpfSksaSl9KSksdD10aGlzLl9tZXNzYWdlQ2VudGVyLGU9dGhpcyxuPXRoaXMuX2FwaSx0Lm9uKCJzZWxlY3RjaGFuZ2VkIiwoZnVuY3Rpb24odCl7dmFyIGk9bi5nZXRNb2RlbCgpO3QuaXNGcm9tQ2xpY2s/KFB5KCJtYXAiLCJzZWxlY3RjaGFuZ2VkIixlLGksdCksUHkoInBpZSIsInNlbGVjdGNoYW5nZWQiLGUsaSx0KSk6InNlbGVjdCI9PT10LmZyb21BY3Rpb24/KFB5KCJtYXAiLCJzZWxlY3RlZCIsZSxpLHQpLFB5KCJwaWUiLCJzZWxlY3RlZCIsZSxpLHQpKToidW5zZWxlY3QiPT09dC5mcm9tQWN0aW9uJiYoUHkoIm1hcCIsInVuc2VsZWN0ZWQiLGUsaSx0KSxQeSgicGllIiwidW5zZWxlY3RlZCIsZSxpLHQpKX0pKX0sZS5wcm90b3R5cGUuaXNEaXNwb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNwb3NlZH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9kaXNwb3NlZD9vbSh0aGlzLmlkKTp0aGlzLnNldE9wdGlvbih7c2VyaWVzOltdfSwhMCl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZih0aGlzLl9kaXNwb3NlZClvbSh0aGlzLmlkKTtlbHNle3RoaXMuX2Rpc3Bvc2VkPSEwLHRoaXMuZ2V0RG9tKCkmJlhvKHRoaXMuZ2V0RG9tKCksdm0sIiIpO3ZhciB0PXRoaXMsZT10Ll9hcGksbj10Ll9tb2RlbDtFKHQuX2NvbXBvbmVudHNWaWV3cywoZnVuY3Rpb24odCl7dC5kaXNwb3NlKG4sZSl9KSksRSh0Ll9jaGFydHNWaWV3cywoZnVuY3Rpb24odCl7dC5kaXNwb3NlKG4sZSl9KSksdC5fenIuZGlzcG9zZSgpLHQuX2RvbT10Ll9tb2RlbD10Ll9jaGFydHNNYXA9dC5fY29tcG9uZW50c01hcD10Ll9jaGFydHNWaWV3cz10Ll9jb21wb25lbnRzVmlld3M9dC5fc2NoZWR1bGVyPXQuX2FwaT10Ll96cj10Ll90aHJvdHRsZWRackZsdXNoPXQuX3RoZW1lPXQuX2Nvb3JkU3lzTWdyPXQuX21lc3NhZ2VDZW50ZXI9bnVsbCxkZWxldGUgZG1bdC5pZF19fSxlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCl7aWYoIXRoaXNbRHZdKWlmKHRoaXMuX2Rpc3Bvc2VkKW9tKHRoaXMuaWQpO2Vsc2V7dGhpcy5fenIucmVzaXplKHQpO3ZhciBlPXRoaXMuX21vZGVsO2lmKHRoaXMuX2xvYWRpbmdGWCYmdGhpcy5fbG9hZGluZ0ZYLnJlc2l6ZSgpLGUpe3ZhciBuPWUucmVzZXRPcHRpb24oIm1lZGlhIiksaT10JiZ0LnNpbGVudDt0aGlzW0F2XSYmKG51bGw9PWkmJihpPXRoaXNbQXZdLnNpbGVudCksbj0hMCx0aGlzW0F2XT1udWxsKSx0aGlzW0R2XT0hMDt0cnl7biYmRXYodGhpcyksQnYudXBkYXRlLmNhbGwodGhpcyx7dHlwZToicmVzaXplIixhbmltYXRpb246QSh7ZHVyYXRpb246MH0sdCYmdC5hbmltYXRpb24pfSl9Y2F0Y2godCl7dGhyb3cgdGhpc1tEdl09ITEsdH10aGlzW0R2XT0hMSxIdi5jYWxsKHRoaXMsaSksWXYuY2FsbCh0aGlzLGkpfX19LGUucHJvdG90eXBlLnNob3dMb2FkaW5nPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fZGlzcG9zZWQpb20odGhpcy5pZCk7ZWxzZSBpZihxKHQpJiYoZT10LHQ9IiIpLHQ9dHx8ImRlZmF1bHQiLHRoaXMuaGlkZUxvYWRpbmcoKSxwbVt0XSl7dmFyIG49cG1bdF0odGhpcy5fYXBpLGUpLGk9dGhpcy5fenI7dGhpcy5fbG9hZGluZ0ZYPW4saS5hZGQobil9fSxlLnByb3RvdHlwZS5oaWRlTG9hZGluZz1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VkP29tKHRoaXMuaWQpOih0aGlzLl9sb2FkaW5nRlgmJnRoaXMuX3pyLnJlbW92ZSh0aGlzLl9sb2FkaW5nRlgpLHRoaXMuX2xvYWRpbmdGWD1udWxsKX0sZS5wcm90b3R5cGUubWFrZUFjdGlvbkZyb21FdmVudD1mdW5jdGlvbih0KXt2YXIgZT1BKHt9LHQpO3JldHVybiBlLnR5cGU9c21bdC50eXBlXSxlfSxlLnByb3RvdHlwZS5kaXNwYXRjaEFjdGlvbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2Rpc3Bvc2VkKW9tKHRoaXMuaWQpO2Vsc2UgaWYocShlKXx8KGU9e3NpbGVudDohIWV9KSxhbVt0LnR5cGVdJiZ0aGlzLl9tb2RlbClpZih0aGlzW0R2XSl0aGlzLl9wZW5kaW5nQWN0aW9ucy5wdXNoKHQpO2Vsc2V7dmFyIG49ZS5zaWxlbnQ7V3YuY2FsbCh0aGlzLHQsbik7dmFyIGk9ZS5mbHVzaDtpP3RoaXMuX3pyLmZsdXNoKCk6ITEhPT1pJiZyLmJyb3dzZXIud2VDaGF0JiZ0aGlzLl90aHJvdHRsZWRackZsdXNoKCksSHYuY2FsbCh0aGlzLG4pLFl2LmNhbGwodGhpcyxuKX19LGUucHJvdG90eXBlLnVwZGF0ZUxhYmVsTGF5b3V0PWZ1bmN0aW9uKCl7d3YudHJpZ2dlcigic2VyaWVzOmxheW91dGxhYmVscyIsdGhpcy5fbW9kZWwsdGhpcy5fYXBpLHt1cGRhdGVkU2VyaWVzOltdfSl9LGUucHJvdG90eXBlLmFwcGVuZERhdGE9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGlzcG9zZWQpb20odGhpcy5pZCk7ZWxzZXt2YXIgZT10LnNlcmllc0luZGV4LG49dGhpcy5nZXRNb2RlbCgpLmdldFNlcmllc0J5SW5kZXgoZSk7MCxuLmFwcGVuZERhdGEodCksdGhpcy5fc2NoZWR1bGVyLnVuZmluaXNoZWQ9ITAsdGhpcy5nZXRacigpLndha2VVcCgpfX0sZS5pbnRlcm5hbEZpZWxkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0LmNsZWFyQ29sb3JQYWxldHRlKCksdC5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXt0LmNsZWFyQ29sb3JQYWxldHRlKCl9KSl9ZnVuY3Rpb24gZSh0KXtmb3IodmFyIGU9W10sbj10LmN1cnJlbnRTdGF0ZXMsaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldOyJlbXBoYXNpcyIhPT1yJiYiYmx1ciIhPT1yJiYic2VsZWN0IiE9PXImJmUucHVzaChyKX10LnNlbGVjdGVkJiZ0LnN0YXRlcy5zZWxlY3QmJmUucHVzaCgic2VsZWN0IiksMj09PXQuaG92ZXJTdGF0ZSYmdC5zdGF0ZXMuZW1waGFzaXM/ZS5wdXNoKCJlbXBoYXNpcyIpOjE9PT10LmhvdmVyU3RhdGUmJnQuc3RhdGVzLmJsdXImJmUucHVzaCgiYmx1ciIpLHQudXNlU3RhdGVzKGUpfWZ1bmN0aW9uIGkodCxlKXtpZighdC5wcmV2ZW50QXV0b1ope3ZhciBuPXQuZ2V0KCJ6Iil8fDAsaT10LmdldCgiemxldmVsIil8fDA7ZS5lYWNoUmVuZGVyZWQoKGZ1bmN0aW9uKHQpe3JldHVybiBvKHQsbixpLC0xLzApLCEwfSkpfX1mdW5jdGlvbiBvKHQsZSxuLGkpe3ZhciByPXQuZ2V0VGV4dENvbnRlbnQoKSxhPXQuZ2V0VGV4dEd1aWRlTGluZSgpO2lmKHQuaXNHcm91cClmb3IodmFyIHM9dC5jaGlsZHJlblJlZigpLGw9MDtsPHMubGVuZ3RoO2wrKylpPU1hdGgubWF4KG8oc1tsXSxlLG4saSksaSk7ZWxzZSB0Lno9ZSx0LnpsZXZlbD1uLGk9TWF0aC5tYXgodC56MixpKTtpZihyJiYoci56PWUsci56bGV2ZWw9bixpc0Zpbml0ZShpKSYmKHIuejI9aSsyKSksYSl7dmFyIHU9dC50ZXh0R3VpZGVMaW5lQ29uZmlnO2Euej1lLGEuemxldmVsPW4saXNGaW5pdGUoaSkmJihhLnoyPWkrKHUmJnUuc2hvd0Fib3ZlPzE6LTEpKX1yZXR1cm4gaX1mdW5jdGlvbiBhKHQsZSl7ZS5lYWNoUmVuZGVyZWQoKGZ1bmN0aW9uKHQpe2lmKCF4aCh0KSl7dmFyIGU9dC5nZXRUZXh0Q29udGVudCgpLG49dC5nZXRUZXh0R3VpZGVMaW5lKCk7dC5zdGF0ZVRyYW5zaXRpb24mJih0LnN0YXRlVHJhbnNpdGlvbj1udWxsKSxlJiZlLnN0YXRlVHJhbnNpdGlvbiYmKGUuc3RhdGVUcmFuc2l0aW9uPW51bGwpLG4mJm4uc3RhdGVUcmFuc2l0aW9uJiYobi5zdGF0ZVRyYW5zaXRpb249bnVsbCksdC5oYXNTdGF0ZSgpPyh0LnByZXZTdGF0ZXM9dC5jdXJyZW50U3RhdGVzLHQuY2xlYXJTdGF0ZXMoKSk6dC5wcmV2U3RhdGVzJiYodC5wcmV2U3RhdGVzPW51bGwpfX0pKX1mdW5jdGlvbiBzKHQsbil7dmFyIGk9dC5nZXRNb2RlbCgic3RhdGVBbmltYXRpb24iKSxyPXQuaXNBbmltYXRpb25FbmFibGVkKCksbz1pLmdldCgiZHVyYXRpb24iKSxhPW8+MD97ZHVyYXRpb246byxkZWxheTppLmdldCgiZGVsYXkiKSxlYXNpbmc6aS5nZXQoImVhc2luZyIpfTpudWxsO24uZWFjaFJlbmRlcmVkKChmdW5jdGlvbih0KXtpZih0LnN0YXRlcyYmdC5zdGF0ZXMuZW1waGFzaXMpe2lmKHhoKHQpKXJldHVybjtpZih0IGluc3RhbmNlb2Yga3MmJmZ1bmN0aW9uKHQpe3ZhciBlPWxsKHQpO2Uubm9ybWFsRmlsbD10LnN0eWxlLmZpbGwsZS5ub3JtYWxTdHJva2U9dC5zdHlsZS5zdHJva2U7dmFyIG49dC5zdGF0ZXMuc2VsZWN0fHx7fTtlLnNlbGVjdEZpbGw9bi5zdHlsZSYmbi5zdHlsZS5maWxsfHxudWxsLGUuc2VsZWN0U3Ryb2tlPW4uc3R5bGUmJm4uc3R5bGUuc3Ryb2tlfHxudWxsfSh0KSx0Ll9fZGlydHkpe3ZhciBuPXQucHJldlN0YXRlcztuJiZ0LnVzZVN0YXRlcyhuKX1pZihyKXt0LnN0YXRlVHJhbnNpdGlvbj1hO3ZhciBpPXQuZ2V0VGV4dENvbnRlbnQoKSxvPXQuZ2V0VGV4dEd1aWRlTGluZSgpO2kmJihpLnN0YXRlVHJhbnNpdGlvbj1hKSxvJiYoby5zdGF0ZVRyYW5zaXRpb249YSl9dC5fX2RpcnR5JiZlKHQpfX0pKX1Fdj1mdW5jdGlvbih0KXt2YXIgZT10Ll9zY2hlZHVsZXI7ZS5yZXN0b3JlUGlwZWxpbmVzKHQuX21vZGVsKSxlLnByZXBhcmVTdGFnZVRhc2tzKCksenYodCwhMCksenYodCwhMSksZS5wbGFuKCl9LHp2PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuX21vZGVsLGk9dC5fc2NoZWR1bGVyLHI9ZT90Ll9jb21wb25lbnRzVmlld3M6dC5fY2hhcnRzVmlld3Msbz1lP3QuX2NvbXBvbmVudHNNYXA6dC5fY2hhcnRzTWFwLGE9dC5fenIscz10Ll9hcGksbD0wO2w8ci5sZW5ndGg7bCsrKXJbbF0uX19hbGl2ZT0hMTtmdW5jdGlvbiB1KHQpe3ZhciBsPXQuX19yZXF1aXJlTmV3Vmlldzt0Ll9fcmVxdWlyZU5ld1ZpZXc9ITE7dmFyIHU9Il9lY18iK3QuaWQrIl8iK3QudHlwZSxoPSFsJiZvW3VdO2lmKCFoKXt2YXIgYz1Lbyh0LnR5cGUpLHA9ZT9BZy5nZXRDbGFzcyhjLm1haW4sYy5zdWIpOk9nLmdldENsYXNzKGMuc3ViKTswLChoPW5ldyBwKS5pbml0KG4scyksb1t1XT1oLHIucHVzaChoKSxhLmFkZChoLmdyb3VwKX10Ll9fdmlld0lkPWguX19pZD11LGguX19hbGl2ZT0hMCxoLl9fbW9kZWw9dCxoLmdyb3VwLl9fZWNDb21wb25lbnRJbmZvPXttYWluVHlwZTp0Lm1haW5UeXBlLGluZGV4OnQuY29tcG9uZW50SW5kZXh9LCFlJiZpLnByZXBhcmVWaWV3KGgsdCxuLHMpfWU/bi5lYWNoQ29tcG9uZW50KChmdW5jdGlvbih0LGUpeyJzZXJpZXMiIT09dCYmdShlKX0pKTpuLmVhY2hTZXJpZXModSk7Zm9yKGw9MDtsPHIubGVuZ3RoOyl7dmFyIGg9cltsXTtoLl9fYWxpdmU/bCsrOighZSYmaC5yZW5kZXJUYXNrLmRpc3Bvc2UoKSxhLnJlbW92ZShoLmdyb3VwKSxoLmRpc3Bvc2UobixzKSxyLnNwbGljZShsLDEpLG9baC5fX2lkXT09PWgmJmRlbGV0ZSBvW2guX19pZF0saC5fX2lkPWguZ3JvdXAuX19lY0NvbXBvbmVudEluZm89bnVsbCl9fSxWdj1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXQuX21vZGVsO2lmKG8uc2V0VXBkYXRlUGF5bG9hZChuKSxpKXt2YXIgYT17fTthW2krIklkIl09bltpKyJJZCJdLGFbaSsiSW5kZXgiXT1uW2krIkluZGV4Il0sYVtpKyJOYW1lIl09bltpKyJOYW1lIl07dmFyIHM9e21haW5UeXBlOmkscXVlcnk6YX07ciYmKHMuc3ViVHlwZT1yKTt2YXIgbCx1PW4uZXhjbHVkZVNlcmllc0lkO251bGwhPXUmJihsPXl0KCksRShUbyh1KSwoZnVuY3Rpb24odCl7dmFyIGU9Um8odCxudWxsKTtudWxsIT1lJiZsLnNldChlLCEwKX0pKSksbyYmby5lYWNoQ29tcG9uZW50KHMsKGZ1bmN0aW9uKGUpe2lmKCEobCYmbnVsbCE9bC5nZXQoZS5pZCkpKWlmKGV1KG4pKWlmKGUgaW5zdGFuY2VvZiBiZyluLnR5cGUhPT1kbHx8bi5ub3RCbHVyfHxlLmdldChbImVtcGhhc2lzIiwiZGlzYWJsZWQiXSl8fGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LnNlcmllc0luZGV4LHI9dC5nZXREYXRhKGUuZGF0YVR5cGUpO2lmKHIpe3ZhciBvPXpvKHIsZSk7bz0oWShvKT9vWzBdOm8pfHwwO3ZhciBhPXIuZ2V0SXRlbUdyYXBoaWNFbChvKTtpZighYSlmb3IodmFyIHM9ci5jb3VudCgpLGw9MDshYSYmbDxzOylhPXIuZ2V0SXRlbUdyYXBoaWNFbChsKyspO2lmKGEpe3ZhciB1PXJsKGEpO0dsKGksdS5mb2N1cyx1LmJsdXJTY29wZSxuKX1lbHNle3ZhciBoPXQuZ2V0KFsiZW1waGFzaXMiLCJmb2N1cyJdKSxjPXQuZ2V0KFsiZW1waGFzaXMiLCJibHVyU2NvcGUiXSk7bnVsbCE9aCYmR2woaSxoLGMsbil9fX0oZSxuLHQuX2FwaSk7ZWxzZXt2YXIgaT1IbChlLm1haW5UeXBlLGUuY29tcG9uZW50SW5kZXgsbi5uYW1lLHQuX2FwaSkscj1pLmZvY3VzU2VsZixvPWkuZGlzcGF0Y2hlcnM7bi50eXBlPT09ZGwmJnImJiFuLm5vdEJsdXImJldsKGUubWFpblR5cGUsZS5jb21wb25lbnRJbmRleCx0Ll9hcGkpLG8mJkUobywoZnVuY3Rpb24odCl7bi50eXBlPT09ZGw/T2wodCk6UmwodCl9KSl9ZWxzZSB0dShuKSYmZSBpbnN0YW5jZW9mIGJnJiYoIWZ1bmN0aW9uKHQsZSxuKXtpZih0dShlKSl7dmFyIGk9ZS5kYXRhVHlwZSxyPXpvKHQuZ2V0RGF0YShpKSxlKTtZKHIpfHwocj1bcl0pLHRbZS50eXBlPT09dmw/InRvZ2dsZVNlbGVjdCI6ZS50eXBlPT09Z2w/InNlbGVjdCI6InVuc2VsZWN0Il0ocixpKX19KGUsbix0Ll9hcGkpLFlsKGUpLEp2KHQpKX0pLHQpLG8mJm8uZWFjaENvbXBvbmVudChzLChmdW5jdGlvbihlKXtsJiZudWxsIT1sLmdldChlLmlkKXx8aCh0WyJzZXJpZXMiPT09aT8iX2NoYXJ0c01hcCI6Il9jb21wb25lbnRzTWFwIl1bZS5fX3ZpZXdJZF0pfSksdCl9ZWxzZSBFKFtdLmNvbmNhdCh0Ll9jb21wb25lbnRzVmlld3MpLmNvbmNhdCh0Ll9jaGFydHNWaWV3cyksaCk7ZnVuY3Rpb24gaChpKXtpJiZpLl9fYWxpdmUmJmlbZV0mJmlbZV0oaS5fX21vZGVsLG8sdC5fYXBpLG4pfX0sQnY9e3ByZXBhcmVBbmRVcGRhdGU6ZnVuY3Rpb24odCl7RXYodGhpcyksQnYudXBkYXRlLmNhbGwodGhpcyx0LHtvcHRpb25DaGFuZ2VkOm51bGwhPXQubmV3T3B0aW9ufSl9LHVwZGF0ZTpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMuX21vZGVsLHI9dGhpcy5fYXBpLG89dGhpcy5fenIsYT10aGlzLl9jb29yZFN5c01ncixzPXRoaXMuX3NjaGVkdWxlcjtpZihpKXtpLnNldFVwZGF0ZVBheWxvYWQoZSkscy5yZXN0b3JlRGF0YShpLGUpLHMucGVyZm9ybVNlcmllc1Rhc2tzKGkpLGEuY3JlYXRlKGkscikscy5wZXJmb3JtRGF0YVByb2Nlc3NvclRhc2tzKGksZSksR3YodGhpcyxpKSxhLnVwZGF0ZShpLHIpLHQoaSkscy5wZXJmb3JtVmlzdWFsVGFza3MoaSxlKSxadih0aGlzLGkscixlLG4pO3ZhciBsPWkuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKXx8InRyYW5zcGFyZW50Iix1PWkuZ2V0KCJkYXJrTW9kZSIpO28uc2V0QmFja2dyb3VuZENvbG9yKGwpLG51bGwhPXUmJiJhdXRvIiE9PXUmJm8uc2V0RGFya01vZGUodSksd3YudHJpZ2dlcigiYWZ0ZXJ1cGRhdGUiLGkscil9fSx1cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxpPXRoaXMuX21vZGVsLHI9dGhpcy5fYXBpO2lmKGkpe2kuc2V0VXBkYXRlUGF5bG9hZChlKTt2YXIgbz1bXTtpLmVhY2hDb21wb25lbnQoKGZ1bmN0aW9uKHQsYSl7aWYoInNlcmllcyIhPT10KXt2YXIgcz1uLmdldFZpZXdPZkNvbXBvbmVudE1vZGVsKGEpO2lmKHMmJnMuX19hbGl2ZSlpZihzLnVwZGF0ZVRyYW5zZm9ybSl7dmFyIGw9cy51cGRhdGVUcmFuc2Zvcm0oYSxpLHIsZSk7bCYmbC51cGRhdGUmJm8ucHVzaChzKX1lbHNlIG8ucHVzaChzKX19KSk7dmFyIGE9eXQoKTtpLmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpe3ZhciBvPW4uX2NoYXJ0c01hcFt0Ll9fdmlld0lkXTtpZihvLnVwZGF0ZVRyYW5zZm9ybSl7dmFyIHM9by51cGRhdGVUcmFuc2Zvcm0odCxpLHIsZSk7cyYmcy51cGRhdGUmJmEuc2V0KHQudWlkLDEpfWVsc2UgYS5zZXQodC51aWQsMSl9KSksdChpKSx0aGlzLl9zY2hlZHVsZXIucGVyZm9ybVZpc3VhbFRhc2tzKGksZSx7c2V0RGlydHk6ITAsZGlydHlNYXA6YX0pLHF2KHRoaXMsaSxyLGUse30sYSksd3YudHJpZ2dlcigiYWZ0ZXJ1cGRhdGUiLGkscil9fSx1cGRhdGVWaWV3OmZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuX21vZGVsO24mJihuLnNldFVwZGF0ZVBheWxvYWQoZSksT2cubWFya1VwZGF0ZU1ldGhvZChlLCJ1cGRhdGVWaWV3IiksdChuKSx0aGlzLl9zY2hlZHVsZXIucGVyZm9ybVZpc3VhbFRhc2tzKG4sZSx7c2V0RGlydHk6ITB9KSxadih0aGlzLG4sdGhpcy5fYXBpLGUse30pLHd2LnRyaWdnZXIoImFmdGVydXBkYXRlIixuLHRoaXMuX2FwaSkpfSx1cGRhdGVWaXN1YWw6ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxpPXRoaXMuX21vZGVsO2kmJihpLnNldFVwZGF0ZVBheWxvYWQoZSksaS5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXt0LmdldERhdGEoKS5jbGVhckFsbFZpc3VhbCgpfSkpLE9nLm1hcmtVcGRhdGVNZXRob2QoZSwidXBkYXRlVmlzdWFsIiksdChpKSx0aGlzLl9zY2hlZHVsZXIucGVyZm9ybVZpc3VhbFRhc2tzKGksZSx7dmlzdWFsVHlwZToidmlzdWFsIixzZXREaXJ0eTohMH0pLGkuZWFjaENvbXBvbmVudCgoZnVuY3Rpb24odCxyKXtpZigic2VyaWVzIiE9PXQpe3ZhciBvPW4uZ2V0Vmlld09mQ29tcG9uZW50TW9kZWwocik7byYmby5fX2FsaXZlJiZvLnVwZGF0ZVZpc3VhbChyLGksbi5fYXBpLGUpfX0pKSxpLmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpe24uX2NoYXJ0c01hcFt0Ll9fdmlld0lkXS51cGRhdGVWaXN1YWwodCxpLG4uX2FwaSxlKX0pKSx3di50cmlnZ2VyKCJhZnRlcnVwZGF0ZSIsaSx0aGlzLl9hcGkpKX0sdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKHQpe0J2LnVwZGF0ZS5jYWxsKHRoaXMsdCl9fSxGdj1mdW5jdGlvbih0LGUsbixpKXtpZih0Ll9kaXNwb3NlZClvbSh0LmlkKTtlbHNle2Zvcih2YXIgcixvPXQuX21vZGVsLGE9dC5fY29vcmRTeXNNZ3IuZ2V0Q29vcmRpbmF0ZVN5c3RlbXMoKSxzPUZvKG8sbiksbD0wO2w8YS5sZW5ndGg7bCsrKXt2YXIgdT1hW2xdO2lmKHVbZV0mJm51bGwhPShyPXVbZV0obyxzLGkpKSlyZXR1cm4gcn0wfX0sR3Y9ZnVuY3Rpb24odCxlKXt2YXIgbj10Ll9jaGFydHNNYXAsaT10Ll9zY2hlZHVsZXI7ZS5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXtpLnVwZGF0ZVN0cmVhbU1vZGVzKHQsblt0Ll9fdmlld0lkXSl9KSl9LFd2PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuZ2V0TW9kZWwoKSxyPXQudHlwZSxvPXQuZXNjYXBlQ29ubmVjdCxhPWFtW3JdLHM9YS5hY3Rpb25JbmZvLGw9KHMudXBkYXRlfHwidXBkYXRlIikuc3BsaXQoIjoiKSx1PWwucG9wKCksaD1udWxsIT1sWzBdJiZLbyhsWzBdKTt0aGlzW0R2XT0hMDt2YXIgYz1bdF0scD0hMTt0LmJhdGNoJiYocD0hMCxjPXoodC5iYXRjaCwoZnVuY3Rpb24oZSl7cmV0dXJuKGU9ayhBKHt9LGUpLHQpKS5iYXRjaD1udWxsLGV9KSkpO3ZhciBkLGY9W10sZz10dSh0KSx5PWV1KHQpO2lmKHkmJkZsKHRoaXMuX2FwaSksRShjLChmdW5jdGlvbihlKXtpZigoZD0oZD1hLmFjdGlvbihlLG4uX21vZGVsLG4uX2FwaSkpfHxBKHt9LGUpKS50eXBlPXMuZXZlbnR8fGQudHlwZSxmLnB1c2goZCkseSl7dmFyIGk9R28odCkscj1pLnF1ZXJ5T3B0aW9uTWFwLG89aS5tYWluVHlwZVNwZWNpZmllZD9yLmtleXMoKVswXToic2VyaWVzIjtWdihuLHUsZSxvKSxKdihuKX1lbHNlIGc/KFZ2KG4sdSxlLCJzZXJpZXMiKSxKdihuKSk6aCYmVnYobix1LGUsaC5tYWluLGguc3ViKX0pKSwibm9uZSIhPT11JiYheSYmIWcmJiFoKXRyeXt0aGlzW0F2XT8oRXYodGhpcyksQnYudXBkYXRlLmNhbGwodGhpcyx0KSx0aGlzW0F2XT1udWxsKTpCdlt1XS5jYWxsKHRoaXMsdCl9Y2F0Y2godCl7dGhyb3cgdGhpc1tEdl09ITEsdH1pZihkPXA/e3R5cGU6cy5ldmVudHx8cixlc2NhcGVDb25uZWN0Om8sYmF0Y2g6Zn06ZlswXSx0aGlzW0R2XT0hMSwhZSl7dmFyIHY9dGhpcy5fbWVzc2FnZUNlbnRlcjtpZih2LnRyaWdnZXIoZC50eXBlLGQpLGcpe3ZhciBtPXt0eXBlOiJzZWxlY3RjaGFuZ2VkIixlc2NhcGVDb25uZWN0Om8sc2VsZWN0ZWQ6WGwoaSksaXNGcm9tQ2xpY2s6dC5pc0Zyb21DbGlja3x8ITEsZnJvbUFjdGlvbjp0LnR5cGUsZnJvbUFjdGlvblBheWxvYWQ6dH07di50cmlnZ2VyKG0udHlwZSxtKX19fSxIdj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fcGVuZGluZ0FjdGlvbnM7ZS5sZW5ndGg7KXt2YXIgbj1lLnNoaWZ0KCk7V3YuY2FsbCh0aGlzLG4sdCl9fSxZdj1mdW5jdGlvbih0KXshdCYmdGhpcy50cmlnZ2VyKCJ1cGRhdGVkIil9LFh2PWZ1bmN0aW9uKHQsZSl7dC5vbigicmVuZGVyZWQiLChmdW5jdGlvbihuKXtlLnRyaWdnZXIoInJlbmRlcmVkIixuKSwhdC5hbmltYXRpb24uaXNGaW5pc2hlZCgpfHxlW0F2XXx8ZS5fc2NoZWR1bGVyLnVuZmluaXNoZWR8fGUuX3BlbmRpbmdBY3Rpb25zLmxlbmd0aHx8ZS50cmlnZ2VyKCJmaW5pc2hlZCIpfSkpfSxVdj1mdW5jdGlvbih0LGUpe3Qub24oIm1vdXNlb3ZlciIsKGZ1bmN0aW9uKHQpe3ZhciBuPU95KHQudGFyZ2V0LFFsKTtuJiYoIWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1ybCh0KSxyPUhsKGkuY29tcG9uZW50TWFpblR5cGUsaS5jb21wb25lbnRJbmRleCxpLmNvbXBvbmVudEhpZ2hEb3duTmFtZSxuKSxvPXIuZGlzcGF0Y2hlcnMsYT1yLmZvY3VzU2VsZjtvPyhhJiZXbChpLmNvbXBvbmVudE1haW5UeXBlLGkuY29tcG9uZW50SW5kZXgsbiksRShvLChmdW5jdGlvbih0KXtyZXR1cm4gTGwodCxlKX0pKSk6KEdsKGkuc2VyaWVzSW5kZXgsaS5mb2N1cyxpLmJsdXJTY29wZSxuKSwic2VsZiI9PT1pLmZvY3VzJiZXbChpLmNvbXBvbmVudE1haW5UeXBlLGkuY29tcG9uZW50SW5kZXgsbiksTGwodCxlKSl9KG4sdCxlLl9hcGkpLEp2KGUpKX0pKS5vbigibW91c2VvdXQiLChmdW5jdGlvbih0KXt2YXIgbj1PeSh0LnRhcmdldCxRbCk7biYmKCFmdW5jdGlvbih0LGUsbil7Rmwobik7dmFyIGk9cmwodCkscj1IbChpLmNvbXBvbmVudE1haW5UeXBlLGkuY29tcG9uZW50SW5kZXgsaS5jb21wb25lbnRIaWdoRG93bk5hbWUsbikuZGlzcGF0Y2hlcnM7cj9FKHIsKGZ1bmN0aW9uKHQpe3JldHVybiBQbCh0LGUpfSkpOlBsKHQsZSl9KG4sdCxlLl9hcGkpLEp2KGUpKX0pKS5vbigiY2xpY2siLChmdW5jdGlvbih0KXt2YXIgbj1PeSh0LnRhcmdldCwoZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXJsKHQpLmRhdGFJbmRleH0pLCEwKTtpZihuKXt2YXIgaT1uLnNlbGVjdGVkPyJ1bnNlbGVjdCI6InNlbGVjdCIscj1ybChuKTtlLl9hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6aSxkYXRhVHlwZTpyLmRhdGFUeXBlLGRhdGFJbmRleEluc2lkZTpyLmRhdGFJbmRleCxzZXJpZXNJbmRleDpyLnNlcmllc0luZGV4LGlzRnJvbUNsaWNrOiEwfSl9fSkpfSxadj1mdW5jdGlvbih0LGUsbixpLHIpeyFmdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdLGk9ITE7aWYodC5lYWNoQ29tcG9uZW50KChmdW5jdGlvbih0LHIpe3ZhciBvPXIuZ2V0KCJ6bGV2ZWwiKXx8MCxhPXIuZ2V0KCJ6Iil8fDAscz1yLmdldFpMZXZlbEtleSgpO2k9aXx8ISFzLCgic2VyaWVzIj09PXQ/bjplKS5wdXNoKHt6bGV2ZWw6byx6OmEsaWR4OnIuY29tcG9uZW50SW5kZXgsdHlwZTp0LGtleTpzfSl9KSksaSl7dmFyIHIsbyxhPWUuY29uY2F0KG4pO1FlKGEsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuemxldmVsPT09ZS56bGV2ZWw/dC56LWUuejp0LnpsZXZlbC1lLnpsZXZlbH0pKSxFKGEsKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZ2V0Q29tcG9uZW50KGUudHlwZSxlLmlkeCksaT1lLnpsZXZlbCxhPWUua2V5O251bGwhPXImJihpPU1hdGgubWF4KHIsaSkpLGE/KGk9PT1yJiZhIT09byYmaSsrLG89YSk6byYmKGk9PT1yJiZpKyssbz0iIikscj1pLG4uc2V0WkxldmVsKGkpfSkpfX0oZSksanYodCxlLG4saSxyKSxFKHQuX2NoYXJ0c1ZpZXdzLChmdW5jdGlvbih0KXt0Ll9fYWxpdmU9ITF9KSkscXYodCxlLG4saSxyKSxFKHQuX2NoYXJ0c1ZpZXdzLChmdW5jdGlvbih0KXt0Ll9fYWxpdmV8fHQucmVtb3ZlKGUsbil9KSl9LGp2PWZ1bmN0aW9uKHQsZSxuLHIsbyxsKXtFKGx8fHQuX2NvbXBvbmVudHNWaWV3cywoZnVuY3Rpb24odCl7dmFyIG89dC5fX21vZGVsO2Eobyx0KSx0LnJlbmRlcihvLGUsbixyKSxpKG8sdCkscyhvLHQpfSkpfSxxdj1mdW5jdGlvbih0LGUsbixvLGwsdSl7dmFyIGg9dC5fc2NoZWR1bGVyO2w9QShsfHx7fSx7dXBkYXRlZFNlcmllczplLmdldFNlcmllcygpfSksd3YudHJpZ2dlcigic2VyaWVzOmJlZm9yZXVwZGF0ZSIsZSxuLGwpO3ZhciBjPSExO2UuZWFjaFNlcmllcygoZnVuY3Rpb24oZSl7dmFyIG49dC5fY2hhcnRzTWFwW2UuX192aWV3SWRdO24uX19hbGl2ZT0hMDt2YXIgaT1uLnJlbmRlclRhc2s7aC51cGRhdGVQYXlsb2FkKGksbyksYShlLG4pLHUmJnUuZ2V0KGUudWlkKSYmaS5kaXJ0eSgpLGkucGVyZm9ybShoLmdldFBlcmZvcm1BcmdzKGkpKSYmKGM9ITApLG4uZ3JvdXAuc2lsZW50PSEhZS5nZXQoInNpbGVudCIpLGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXQoImJsZW5kTW9kZSIpfHxudWxsO2UuZWFjaFJlbmRlcmVkKChmdW5jdGlvbih0KXt0LmlzR3JvdXB8fCh0LnN0eWxlLmJsZW5kPW4pfSkpfShlLG4pLFlsKGUpfSkpLGgudW5maW5pc2hlZD1jfHxoLnVuZmluaXNoZWQsd3YudHJpZ2dlcigic2VyaWVzOmxheW91dGxhYmVscyIsZSxuLGwpLHd2LnRyaWdnZXIoInNlcmllczp0cmFuc2l0aW9uIixlLG4sbCksZS5lYWNoU2VyaWVzKChmdW5jdGlvbihlKXt2YXIgbj10Ll9jaGFydHNNYXBbZS5fX3ZpZXdJZF07aShlLG4pLHMoZSxuKX0pKSxmdW5jdGlvbih0LGUpe3ZhciBuPXQuX3pyLGk9bi5zdG9yYWdlLG89MDtpLnRyYXZlcnNlKChmdW5jdGlvbih0KXt0LmlzR3JvdXB8fG8rK30pKSxvPmUuZ2V0KCJob3ZlckxheWVyVGhyZXNob2xkIikmJiFyLm5vZGUmJiFyLndvcmtlciYmZS5lYWNoU2VyaWVzKChmdW5jdGlvbihlKXtpZighZS5wcmV2ZW50VXNpbmdIb3ZlckxheWVyKXt2YXIgbj10Ll9jaGFydHNNYXBbZS5fX3ZpZXdJZF07bi5fX2FsaXZlJiZuLmVhY2hSZW5kZXJlZCgoZnVuY3Rpb24odCl7dC5zdGF0ZXMuZW1waGFzaXMmJih0LnN0YXRlcy5lbXBoYXNpcy5ob3ZlckxheWVyPSEwKX0pKX19KSl9KHQsZSksd3YudHJpZ2dlcigic2VyaWVzOmFmdGVydXBkYXRlIixlLG4sbCl9LEp2PWZ1bmN0aW9uKHQpe3Rba3ZdPSEwLHQuZ2V0WnIoKS53YWtlVXAoKX0sUXY9ZnVuY3Rpb24odCl7dFtrdl0mJih0LmdldFpyKCkuc3RvcmFnZS50cmF2ZXJzZSgoZnVuY3Rpb24odCl7eGgodCl8fGUodCl9KSksdFtrdl09ITEpfSxLdj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBuKGksZSksaS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVN5c3RlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5fY29vcmRTeXNNZ3IuZ2V0Q29vcmRpbmF0ZVN5c3RlbXMoKX0saS5wcm90b3R5cGUuZ2V0Q29tcG9uZW50QnlFbGVtZW50PWZ1bmN0aW9uKGUpe2Zvcig7ZTspe3ZhciBuPWUuX19lY0NvbXBvbmVudEluZm87aWYobnVsbCE9bilyZXR1cm4gdC5fbW9kZWwuZ2V0Q29tcG9uZW50KG4ubWFpblR5cGUsbi5pbmRleCk7ZT1lLnBhcmVudH19LGkucHJvdG90eXBlLmVudGVyRW1waGFzaXM9ZnVuY3Rpb24oZSxuKXtPbChlLG4pLEp2KHQpfSxpLnByb3RvdHlwZS5sZWF2ZUVtcGhhc2lzPWZ1bmN0aW9uKGUsbil7UmwoZSxuKSxKdih0KX0saS5wcm90b3R5cGUuZW50ZXJCbHVyPWZ1bmN0aW9uKGUpe05sKGUpLEp2KHQpfSxpLnByb3RvdHlwZS5sZWF2ZUJsdXI9ZnVuY3Rpb24oZSl7RWwoZSksSnYodCl9LGkucHJvdG90eXBlLmVudGVyU2VsZWN0PWZ1bmN0aW9uKGUpe3psKGUpLEp2KHQpfSxpLnByb3RvdHlwZS5sZWF2ZVNlbGVjdD1mdW5jdGlvbihlKXtWbChlKSxKdih0KX0saS5wcm90b3R5cGUuZ2V0TW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRNb2RlbCgpfSxpLnByb3RvdHlwZS5nZXRWaWV3T2ZDb21wb25lbnRNb2RlbD1mdW5jdGlvbihlKXtyZXR1cm4gdC5nZXRWaWV3T2ZDb21wb25lbnRNb2RlbChlKX0saS5wcm90b3R5cGUuZ2V0Vmlld09mU2VyaWVzTW9kZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZ2V0Vmlld09mU2VyaWVzTW9kZWwoZSl9LGl9KF9kKSkodCl9LCR2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dFtuXVtQdl09ZX19RShzbSwoZnVuY3Rpb24obixpKXt0Ll9tZXNzYWdlQ2VudGVyLm9uKGksKGZ1bmN0aW9uKG4pe2lmKGZtW3QuZ3JvdXBdJiYwIT09dFtQdl0pe2lmKG4mJm4uZXNjYXBlQ29ubmVjdClyZXR1cm47dmFyIGk9dC5tYWtlQWN0aW9uRnJvbUV2ZW50KG4pLHI9W107RShkbSwoZnVuY3Rpb24oZSl7ZSE9PXQmJmUuZ3JvdXA9PT10Lmdyb3VwJiZyLnB1c2goZSl9KSksZShyLDApLEUociwoZnVuY3Rpb24odCl7MSE9PXRbUHZdJiZ0LmRpc3BhdGNoQWN0aW9uKGkpfSkpLGUociwyKX19KSl9KSl9fSgpLGV9KGp0KSxpbT1ubS5wcm90b3R5cGU7aW0ub249T3YoIm9uIiksaW0ub2ZmPU92KCJvZmYiKSxpbS5vbmU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXM7Ym8oKSx0aGlzLm9uLmNhbGwodGhpcyx0LChmdW5jdGlvbiBuKCl7Zm9yKHZhciByPVtdLG89MDtvPGFyZ3VtZW50cy5sZW5ndGg7bysrKXJbb109YXJndW1lbnRzW29dO2UmJmUuYXBwbHkmJmUuYXBwbHkodGhpcyxyKSxpLm9mZih0LG4pfSksbil9O3ZhciBybT1bImNsaWNrIiwiZGJsY2xpY2siLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsIm1vdXNlbW92ZSIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJnbG9iYWxvdXQiLCJjb250ZXh0bWVudSJdO2Z1bmN0aW9uIG9tKHQpezB9dmFyIGFtPXt9LHNtPXt9LGxtPVtdLHVtPVtdLGhtPVtdLGNtPXt9LHBtPXt9LGRtPXt9LGZtPXt9LGdtPStuZXcgRGF0ZS0wLHltPStuZXcgRGF0ZS0wLHZtPSJfZWNoYXJ0c19pbnN0YW5jZV8iO2Z1bmN0aW9uIG1tKHQpe2ZtW3RdPSExfXZhciB4bT1tbTtmdW5jdGlvbiBfbSh0KXtyZXR1cm4gZG1bZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGU/dC5nZXRBdHRyaWJ1dGUoZSk6dFtlXX0odCx2bSldfWZ1bmN0aW9uIGJtKHQsZSl7Y21bdF09ZX1mdW5jdGlvbiB3bSh0KXtQKHVtLHQpPDAmJnVtLnB1c2godCl9ZnVuY3Rpb24gU20odCxlKXtQbShsbSx0LGUsMmUzKX1mdW5jdGlvbiBNbSh0KXtUbSgiYWZ0ZXJpbml0Iix0KX1mdW5jdGlvbiBJbSh0KXtUbSgiYWZ0ZXJ1cGRhdGUiLHQpfWZ1bmN0aW9uIFRtKHQsZSl7d3Yub24odCxlKX1mdW5jdGlvbiBDbSh0LGUsbil7WChlKSYmKG49ZSxlPSIiKTt2YXIgaT1xKHQpP3QudHlwZTpbdCx0PXtldmVudDplfV1bMF07dC5ldmVudD0odC5ldmVudHx8aSkudG9Mb3dlckNhc2UoKSxlPXQuZXZlbnQsc21bZV18fChsdChMdi50ZXN0KGkpJiZMdi50ZXN0KGUpKSxhbVtpXXx8KGFtW2ldPXthY3Rpb246bixhY3Rpb25JbmZvOnR9KSxzbVtlXT1pKX1mdW5jdGlvbiBEbSh0LGUpe3dkLnJlZ2lzdGVyKHQsZSl9ZnVuY3Rpb24gQW0odCxlKXtQbShobSx0LGUsMWUzLCJsYXlvdXQiKX1mdW5jdGlvbiBrbSh0LGUpe1BtKGhtLHQsZSwzZTMsInZpc3VhbCIpfXZhciBMbT1bXTtmdW5jdGlvbiBQbSh0LGUsbixpLHIpe2lmKChYKGUpfHxxKGUpKSYmKG49ZSxlPWkpLCEoUChMbSxuKT49MCkpe0xtLnB1c2gobik7dmFyIG89ZXkud3JhcFN0YWdlSGFuZGxlcihuLHIpO28uX19wcmlvPWUsby5fX3Jhdz1uLHQucHVzaChvKX19ZnVuY3Rpb24gT20odCxlKXtwbVt0XT1lfWZ1bmN0aW9uIFJtKHQsZSxuKXt2YXIgaT1NdigicmVnaXN0ZXJNYXAiKTtpJiZpKHQsZSxuKX12YXIgTm09ZnVuY3Rpb24odCl7dmFyIGU9KHQ9VCh0KSkudHlwZSxuPSIiO2V8fHdvKG4pO3ZhciBpPWUuc3BsaXQoIjoiKTsyIT09aS5sZW5ndGgmJndvKG4pO3ZhciByPSExOyJlY2hhcnRzIj09PWlbMF0mJihlPWlbMV0scj0hMCksdC5fX2lzQnVpbHRJbj1yLFZmLnNldChlLHQpfTtrbShJdixLZyksa20oVHYsSmcpLGttKFR2LFFnKSxrbShJdixUeSksa20oVHYsQ3kpLGttKDdlMywoZnVuY3Rpb24odCxlKXt0LmVhY2hSYXdTZXJpZXMoKGZ1bmN0aW9uKG4pe2lmKCF0LmlzU2VyaWVzRmlsdGVyZWQobikpe3ZhciBpPW4uZ2V0RGF0YSgpO2kuaGFzSXRlbVZpc3VhbCgpJiZpLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWkuZ2V0SXRlbVZpc3VhbCh0LCJkZWNhbCIpO24mJihpLmVuc3VyZVVuaXF1ZUl0ZW1WaXN1YWwodCwic3R5bGUiKS5kZWNhbD1tdihuLGUpKX0pKTt2YXIgcj1pLmdldFZpc3VhbCgiZGVjYWwiKTtpZihyKWkuZ2V0VmlzdWFsKCJzdHlsZSIpLmRlY2FsPW12KHIsZSl9fSkpfSkpLHdtKFhkKSxTbSg5MDAsKGZ1bmN0aW9uKHQpe3ZhciBlPXl0KCk7dC5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXt2YXIgbj10LmdldCgic3RhY2siKTtpZihuKXt2YXIgaT1lLmdldChuKXx8ZS5zZXQobixbXSkscj10LmdldERhdGEoKSxvPXtzdGFja1Jlc3VsdERpbWVuc2lvbjpyLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tSZXN1bHREaW1lbnNpb24iKSxzdGFja2VkT3ZlckRpbWVuc2lvbjpyLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tlZE92ZXJEaW1lbnNpb24iKSxzdGFja2VkRGltZW5zaW9uOnIuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkRGltZW5zaW9uIiksc3RhY2tlZEJ5RGltZW5zaW9uOnIuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkQnlEaW1lbnNpb24iKSxpc1N0YWNrZWRCeUluZGV4OnIuZ2V0Q2FsY3VsYXRpb25JbmZvKCJpc1N0YWNrZWRCeUluZGV4IiksZGF0YTpyLHNlcmllc01vZGVsOnR9O2lmKCFvLnN0YWNrZWREaW1lbnNpb258fCFvLmlzU3RhY2tlZEJ5SW5kZXgmJiFvLnN0YWNrZWRCeURpbWVuc2lvbilyZXR1cm47aS5sZW5ndGgmJnIuc2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkT25TZXJpZXMiLGlbaS5sZW5ndGgtMV0uc2VyaWVzTW9kZWwpLGkucHVzaChvKX19KSksZS5lYWNoKFVkKX0pKSxPbSgiZGVmYXVsdCIsKGZ1bmN0aW9uKHQsZSl7ayhlPWV8fHt9LHt0ZXh0OiJsb2FkaW5nIix0ZXh0Q29sb3I6IiMwMDAiLGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYiLG1hc2tDb2xvcjoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpIixzaG93U3Bpbm5lcjohMCxjb2xvcjoiIzU0NzBjNiIsc3Bpbm5lclJhZGl1czoxMCxsaW5lV2lkdGg6NSx6bGV2ZWw6MH0pO3ZhciBuPW5ldyBCcixpPW5ldyBXcyh7c3R5bGU6e2ZpbGw6ZS5tYXNrQ29sb3J9LHpsZXZlbDplLnpsZXZlbCx6OjFlNH0pO24uYWRkKGkpO3ZhciByLG89bmV3IFhzKHtzdHlsZTp7dGV4dDplLnRleHQsZmlsbDplLnRleHRDb2xvcixmb250U2l6ZTplLmZvbnRTaXplLGZvbnRXZWlnaHQ6ZS5mb250V2VpZ2h0LGZvbnRTdHlsZTplLmZvbnRTdHlsZSxmb250RmFtaWx5OmUuZm9udEZhbWlseX0semxldmVsOmUuemxldmVsLHo6MTAwMDF9KSxhPW5ldyBXcyh7c3R5bGU6e2ZpbGw6Im5vbmUifSx0ZXh0Q29udGVudDpvLHRleHRDb25maWc6e3Bvc2l0aW9uOiJyaWdodCIsZGlzdGFuY2U6MTB9LHpsZXZlbDplLnpsZXZlbCx6OjEwMDAxfSk7cmV0dXJuIG4uYWRkKGEpLGUuc2hvd1NwaW5uZXImJigocj1uZXcgbmgoe3NoYXBlOntzdGFydEFuZ2xlOi10eS8yLGVuZEFuZ2xlOi10eS8yKy4xLHI6ZS5zcGlubmVyUmFkaXVzfSxzdHlsZTp7c3Ryb2tlOmUuY29sb3IsbGluZUNhcDoicm91bmQiLGxpbmVXaWR0aDplLmxpbmVXaWR0aH0semxldmVsOmUuemxldmVsLHo6MTAwMDF9KSkuYW5pbWF0ZVNoYXBlKCEwKS53aGVuKDFlMyx7ZW5kQW5nbGU6Myp0eS8yfSkuc3RhcnQoImNpcmN1bGFySW5PdXQiKSxyLmFuaW1hdGVTaGFwZSghMCkud2hlbigxZTMse3N0YXJ0QW5nbGU6Myp0eS8yfSkuZGVsYXkoMzAwKS5zdGFydCgiY2lyY3VsYXJJbk91dCIpLG4uYWRkKHIpKSxuLnJlc2l6ZT1mdW5jdGlvbigpe3ZhciBuPW8uZ2V0Qm91bmRpbmdSZWN0KCkud2lkdGgscz1lLnNob3dTcGlubmVyP2Uuc3Bpbm5lclJhZGl1czowLGw9KHQuZ2V0V2lkdGgoKS0yKnMtKGUuc2hvd1NwaW5uZXImJm4/MTA6MCktbikvMi0oZS5zaG93U3Bpbm5lciYmbj8wOjUrbi8yKSsoZS5zaG93U3Bpbm5lcj8wOm4vMikrKG4/MDpzKSx1PXQuZ2V0SGVpZ2h0KCkvMjtlLnNob3dTcGlubmVyJiZyLnNldFNoYXBlKHtjeDpsLGN5OnV9KSxhLnNldFNoYXBlKHt4Omwtcyx5OnUtcyx3aWR0aDoyKnMsaGVpZ2h0OjIqc30pLGkuc2V0U2hhcGUoe3g6MCx5OjAsd2lkdGg6dC5nZXRXaWR0aCgpLGhlaWdodDp0LmdldEhlaWdodCgpfSl9LG4ucmVzaXplKCksbn0pKSxDbSh7dHlwZTpkbCxldmVudDpkbCx1cGRhdGU6ZGx9LGJ0KSxDbSh7dHlwZTpmbCxldmVudDpmbCx1cGRhdGU6Zmx9LGJ0KSxDbSh7dHlwZTpnbCxldmVudDpnbCx1cGRhdGU6Z2x9LGJ0KSxDbSh7dHlwZTp5bCxldmVudDp5bCx1cGRhdGU6eWx9LGJ0KSxDbSh7dHlwZTp2bCxldmVudDp2bCx1cGRhdGU6dmx9LGJ0KSxibSgibGlnaHQiLHZ5KSxibSgiZGFyayIsd3kpO3ZhciBFbT1bXSx6bT17cmVnaXN0ZXJQcmVwcm9jZXNzb3I6d20scmVnaXN0ZXJQcm9jZXNzb3I6U20scmVnaXN0ZXJQb3N0SW5pdDpNbSxyZWdpc3RlclBvc3RVcGRhdGU6SW0scmVnaXN0ZXJVcGRhdGVMaWZlY3ljbGU6VG0scmVnaXN0ZXJBY3Rpb246Q20scmVnaXN0ZXJDb29yZGluYXRlU3lzdGVtOkRtLHJlZ2lzdGVyTGF5b3V0OkFtLHJlZ2lzdGVyVmlzdWFsOmttLHJlZ2lzdGVyVHJhbnNmb3JtOk5tLHJlZ2lzdGVyTG9hZGluZzpPbSxyZWdpc3Rlck1hcDpSbSxyZWdpc3RlckltcGw6ZnVuY3Rpb24odCxlKXtTdlt0XT1lfSxQUklPUklUWTpDdixDb21wb25lbnRNb2RlbDp6cCxDb21wb25lbnRWaWV3OkFnLFNlcmllc01vZGVsOmJnLENoYXJ0VmlldzpPZyxyZWdpc3RlckNvbXBvbmVudE1vZGVsOmZ1bmN0aW9uKHQpe3pwLnJlZ2lzdGVyQ2xhc3ModCl9LHJlZ2lzdGVyQ29tcG9uZW50VmlldzpmdW5jdGlvbih0KXtBZy5yZWdpc3RlckNsYXNzKHQpfSxyZWdpc3RlclNlcmllc01vZGVsOmZ1bmN0aW9uKHQpe2JnLnJlZ2lzdGVyQ2xhc3ModCl9LHJlZ2lzdGVyQ2hhcnRWaWV3OmZ1bmN0aW9uKHQpe09nLnJlZ2lzdGVyQ2xhc3ModCl9LHJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcjpmdW5jdGlvbih0LGUpe3pwLnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcih0LGUpfSxyZWdpc3RlclBhaW50ZXI6ZnVuY3Rpb24odCxlKXtYcih0LGUpfX07ZnVuY3Rpb24gVm0odCl7WSh0KT9FKHQsKGZ1bmN0aW9uKHQpe1ZtKHQpfSkpOlAoRW0sdCk+PTB8fChFbS5wdXNoKHQpLFgodCkmJih0PXtpbnN0YWxsOnR9KSx0Lmluc3RhbGwoem0pKX1mdW5jdGlvbiBCbSh0KXtyZXR1cm4gbnVsbD09dD8wOnQubGVuZ3RofHwxfWZ1bmN0aW9uIEZtKHQpe3JldHVybiB0fXZhciBHbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSxyLG8pe3RoaXMuX29sZD10LHRoaXMuX25ldz1lLHRoaXMuX29sZEtleUdldHRlcj1ufHxGbSx0aGlzLl9uZXdLZXlHZXR0ZXI9aXx8Rm0sdGhpcy5jb250ZXh0PXIsdGhpcy5fZGlmZk1vZGVNdWx0aXBsZT0ibXVsdGlwbGUiPT09b31yZXR1cm4gdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGQ9dCx0aGlzfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3VwZGF0ZT10LHRoaXN9LHQucHJvdG90eXBlLnVwZGF0ZU1hbnlUb09uZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdXBkYXRlTWFueVRvT25lPXQsdGhpc30sdC5wcm90b3R5cGUudXBkYXRlT25lVG9NYW55PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl91cGRhdGVPbmVUb01hbnk9dCx0aGlzfSx0LnByb3RvdHlwZS51cGRhdGVNYW55VG9NYW55PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl91cGRhdGVNYW55VG9NYW55PXQsdGhpc30sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmU9dCx0aGlzfSx0LnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKCl7dGhpc1t0aGlzLl9kaWZmTW9kZU11bHRpcGxlPyJfZXhlY3V0ZU11bHRpcGxlIjoiX2V4ZWN1dGVPbmVUb09uZSJdKCl9LHQucHJvdG90eXBlLl9leGVjdXRlT25lVG9PbmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9vbGQsZT10aGlzLl9uZXcsbj17fSxpPW5ldyBBcnJheSh0Lmxlbmd0aCkscj1uZXcgQXJyYXkoZS5sZW5ndGgpO3RoaXMuX2luaXRJbmRleE1hcCh0LG51bGwsaSwiX29sZEtleUdldHRlciIpLHRoaXMuX2luaXRJbmRleE1hcChlLG4sciwiX25ld0tleUdldHRlciIpO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT1pW29dLHM9blthXSxsPUJtKHMpO2lmKGw+MSl7dmFyIHU9cy5zaGlmdCgpOzE9PT1zLmxlbmd0aCYmKG5bYV09c1swXSksdGhpcy5fdXBkYXRlJiZ0aGlzLl91cGRhdGUodSxvKX1lbHNlIDE9PT1sPyhuW2FdPW51bGwsdGhpcy5fdXBkYXRlJiZ0aGlzLl91cGRhdGUocyxvKSk6dGhpcy5fcmVtb3ZlJiZ0aGlzLl9yZW1vdmUobyl9dGhpcy5fcGVyZm9ybVJlc3RBZGQocixuKX0sdC5wcm90b3R5cGUuX2V4ZWN1dGVNdWx0aXBsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX29sZCxlPXRoaXMuX25ldyxuPXt9LGk9e30scj1bXSxvPVtdO3RoaXMuX2luaXRJbmRleE1hcCh0LG4sciwiX29sZEtleUdldHRlciIpLHRoaXMuX2luaXRJbmRleE1hcChlLGksbywiX25ld0tleUdldHRlciIpO2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgcz1yW2FdLGw9bltzXSx1PWlbc10saD1CbShsKSxjPUJtKHUpO2lmKGg+MSYmMT09PWMpdGhpcy5fdXBkYXRlTWFueVRvT25lJiZ0aGlzLl91cGRhdGVNYW55VG9PbmUodSxsKSxpW3NdPW51bGw7ZWxzZSBpZigxPT09aCYmYz4xKXRoaXMuX3VwZGF0ZU9uZVRvTWFueSYmdGhpcy5fdXBkYXRlT25lVG9NYW55KHUsbCksaVtzXT1udWxsO2Vsc2UgaWYoMT09PWgmJjE9PT1jKXRoaXMuX3VwZGF0ZSYmdGhpcy5fdXBkYXRlKHUsbCksaVtzXT1udWxsO2Vsc2UgaWYoaD4xJiZjPjEpdGhpcy5fdXBkYXRlTWFueVRvTWFueSYmdGhpcy5fdXBkYXRlTWFueVRvTWFueSh1LGwpLGlbc109bnVsbDtlbHNlIGlmKGg+MSlmb3IodmFyIHA9MDtwPGg7cCsrKXRoaXMuX3JlbW92ZSYmdGhpcy5fcmVtb3ZlKGxbcF0pO2Vsc2UgdGhpcy5fcmVtb3ZlJiZ0aGlzLl9yZW1vdmUobCl9dGhpcy5fcGVyZm9ybVJlc3RBZGQobyxpKX0sdC5wcm90b3R5cGUuX3BlcmZvcm1SZXN0QWRkPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl0scj1lW2ldLG89Qm0ocik7aWYobz4xKWZvcih2YXIgYT0wO2E8bzthKyspdGhpcy5fYWRkJiZ0aGlzLl9hZGQoclthXSk7ZWxzZSAxPT09byYmdGhpcy5fYWRkJiZ0aGlzLl9hZGQocik7ZVtpXT1udWxsfX0sdC5wcm90b3R5cGUuX2luaXRJbmRleE1hcD1mdW5jdGlvbih0LGUsbixpKXtmb3IodmFyIHI9dGhpcy5fZGlmZk1vZGVNdWx0aXBsZSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBhPSJfZWNfIit0aGlzW2ldKHRbb10sbyk7aWYocnx8KG5bb109YSksZSl7dmFyIHM9ZVthXSxsPUJtKHMpOzA9PT1sPyhlW2FdPW8sciYmbi5wdXNoKGEpKToxPT09bD9lW2FdPVtzLG9dOnMucHVzaChvKX19fSx0fSgpLFdtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2VuY29kZT10LHRoaXMuX3NjaGVtYT1lfXJldHVybiB0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm57ZnVsbERpbWVuc2lvbnM6dGhpcy5fZ2V0RnVsbERpbWVuc2lvbk5hbWVzKCksZW5jb2RlOnRoaXMuX2VuY29kZX19LHQucHJvdG90eXBlLl9nZXRGdWxsRGltZW5zaW9uTmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FjaGVkRGltTmFtZXN8fCh0aGlzLl9jYWNoZWREaW1OYW1lcz10aGlzLl9zY2hlbWE/dGhpcy5fc2NoZW1hLm1ha2VPdXRwdXREaW1lbnNpb25OYW1lcygpOltdKSx0aGlzLl9jYWNoZWREaW1OYW1lc30sdH0oKTtmdW5jdGlvbiBIbSh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpfHwodFtlXT1bXSksdFtlXX1mdW5jdGlvbiBZbSh0KXtyZXR1cm4iY2F0ZWdvcnkiPT09dD8ib3JkaW5hbCI6InRpbWUiPT09dD8idGltZSI6ImZsb2F0In12YXIgWG09ZnVuY3Rpb24odCl7dGhpcy5vdGhlckRpbXM9e30sbnVsbCE9dCYmQSh0aGlzLHQpfSxVbT1WbygpLFptPXtmbG9hdDoiZiIsaW50OiJpIixvcmRpbmFsOiJvIixudW1iZXI6Im4iLHRpbWU6InQifSxqbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5kaW1lbnNpb25zPXQuZGltZW5zaW9ucyx0aGlzLl9kaW1PbWl0dGVkPXQuZGltZW5zaW9uT21pdHRlZCx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLl9mdWxsRGltQ291bnQ9dC5mdWxsRGltZW5zaW9uQ291bnQsdGhpcy5fdXBkYXRlRGltT21pdHRlZCh0LmRpbWVuc2lvbk9taXR0ZWQpfXJldHVybiB0LnByb3RvdHlwZS5pc0RpbWVuc2lvbk9taXR0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGltT21pdHRlZH0sdC5wcm90b3R5cGUuX3VwZGF0ZURpbU9taXR0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5fZGltT21pdHRlZD10LHQmJih0aGlzLl9kaW1OYW1lTWFwfHwodGhpcy5fZGltTmFtZU1hcD0kbSh0aGlzLnNvdXJjZSkpKX0sdC5wcm90b3R5cGUuZ2V0U291cmNlRGltZW5zaW9uSW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KHRoaXMuX2RpbU5hbWVNYXAuZ2V0KHQpLC0xKX0sdC5wcm90b3R5cGUuZ2V0U291cmNlRGltZW5zaW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc291cmNlLmRpbWVuc2lvbnNEZWZpbmU7aWYoZSlyZXR1cm4gZVt0XX0sdC5wcm90b3R5cGUubWFrZVN0b3JlU2NoZW1hPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2Z1bGxEaW1Db3VudCxlPWFmKHRoaXMuc291cmNlKSxuPSFKbSh0KSxpPSIiLHI9W10sbz0wLGE9MDtvPHQ7bysrKXt2YXIgcz12b2lkIDAsbD12b2lkIDAsdT12b2lkIDAsaD10aGlzLmRpbWVuc2lvbnNbYV07aWYoaCYmaC5zdG9yZURpbUluZGV4PT09bylzPWU/aC5uYW1lOm51bGwsbD1oLnR5cGUsdT1oLm9yZGluYWxNZXRhLGErKztlbHNle3ZhciBjPXRoaXMuZ2V0U291cmNlRGltZW5zaW9uKG8pO2MmJihzPWU/Yy5uYW1lOm51bGwsbD1jLnR5cGUpfXIucHVzaCh7cHJvcGVydHk6cyx0eXBlOmwsb3JkaW5hbE1ldGE6dX0pLCFlfHxudWxsPT1zfHxoJiZoLmlzQ2FsY3VsYXRpb25Db29yZHx8KGkrPW4/cy5yZXBsYWNlKC9cYC9nLCJgMSIpLnJlcGxhY2UoL1wkL2csImAyIik6cyksaSs9IiQiLGkrPVptW2xdfHwiZiIsdSYmKGkrPXUudWlkKSxpKz0iJCJ9dmFyIHA9dGhpcy5zb3VyY2U7cmV0dXJue2RpbWVuc2lvbnM6cixoYXNoOltwLnNlcmllc0xheW91dEJ5LHAuc3RhcnRJbmRleCxpXS5qb2luKCIkJCIpfX0sdC5wcm90b3R5cGUubWFrZU91dHB1dERpbWVuc2lvbk5hbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPTA7ZTx0aGlzLl9mdWxsRGltQ291bnQ7ZSsrKXt2YXIgaT12b2lkIDAscj10aGlzLmRpbWVuc2lvbnNbbl07aWYociYmci5zdG9yZURpbUluZGV4PT09ZSlyLmlzQ2FsY3VsYXRpb25Db29yZHx8KGk9ci5uYW1lKSxuKys7ZWxzZXt2YXIgbz10aGlzLmdldFNvdXJjZURpbWVuc2lvbihlKTtvJiYoaT1vLm5hbWUpfXQucHVzaChpKX1yZXR1cm4gdH0sdC5wcm90b3R5cGUuYXBwZW5kQ2FsY3VsYXRpb25EaW1lbnNpb249ZnVuY3Rpb24odCl7dGhpcy5kaW1lbnNpb25zLnB1c2godCksdC5pc0NhbGN1bGF0aW9uQ29vcmQ9ITAsdGhpcy5fZnVsbERpbUNvdW50KyssdGhpcy5fdXBkYXRlRGltT21pdHRlZCghMCl9LHR9KCk7ZnVuY3Rpb24gcW0odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBqbX1mdW5jdGlvbiBLbSh0KXtmb3IodmFyIGU9eXQoKSxuPTA7bjwodHx8W10pLmxlbmd0aDtuKyspe3ZhciBpPXRbbl0scj1xKGkpP2kubmFtZTppO251bGwhPXImJm51bGw9PWUuZ2V0KHIpJiZlLnNldChyLG4pfXJldHVybiBlfWZ1bmN0aW9uICRtKHQpe3ZhciBlPVVtKHQpO3JldHVybiBlLmRpbU5hbWVNYXB8fChlLmRpbU5hbWVNYXA9S20odC5kaW1lbnNpb25zRGVmaW5lKSl9ZnVuY3Rpb24gSm0odCl7cmV0dXJuIHQ+MzB9dmFyIFFtLHR4LGV4LG54LGl4LHJ4LG94LGF4PXEsc3g9eixseD0idW5kZWZpbmVkIj09dHlwZW9mIEludDMyQXJyYXk/QXJyYXk6SW50MzJBcnJheSx1eD1bImhhc0l0ZW1PcHRpb24iLCJfbmFtZUxpc3QiLCJfaWRMaXN0IiwiX2ludmVydGVkSW5kaWNlc01hcCIsIl9kaW1TdW1tYXJ5IiwidXNlck91dHB1dCIsIl9yYXdEYXRhIiwiX2RpbVZhbHVlR2V0dGVyIiwiX25hbWVEaW1JZHgiLCJfaWREaW1JZHgiLCJfbmFtZVJlcGVhdENvdW50Il0saHg9WyJfYXBwcm94aW1hdGVFeHRlbnQiXSxjeD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2YXIgbjt0aGlzLnR5cGU9Imxpc3QiLHRoaXMuX2RpbU9taXR0ZWQ9ITEsdGhpcy5fbmFtZUxpc3Q9W10sdGhpcy5faWRMaXN0PVtdLHRoaXMuX3Zpc3VhbD17fSx0aGlzLl9sYXlvdXQ9e30sdGhpcy5faXRlbVZpc3VhbHM9W10sdGhpcy5faXRlbUxheW91dHM9W10sdGhpcy5fZ3JhcGhpY0Vscz1bXSx0aGlzLl9hcHByb3hpbWF0ZUV4dGVudD17fSx0aGlzLl9jYWxjdWxhdGlvbkluZm89e30sdGhpcy5oYXNJdGVtT3B0aW9uPSExLHRoaXMuVFJBTlNGRVJBQkxFX01FVEhPRFM9WyJjbG9uZVNoYWxsb3ciLCJkb3duU2FtcGxlIiwibHR0YkRvd25TYW1wbGUiLCJtYXAiXSx0aGlzLkNIQU5HQUJMRV9NRVRIT0RTPVsiZmlsdGVyU2VsZiIsInNlbGVjdFJhbmdlIl0sdGhpcy5ET1dOU0FNUExFX01FVEhPRFM9WyJkb3duU2FtcGxlIiwibHR0YkRvd25TYW1wbGUiXTt2YXIgaT0hMTtxbSh0KT8obj10LmRpbWVuc2lvbnMsdGhpcy5fZGltT21pdHRlZD10LmlzRGltZW5zaW9uT21pdHRlZCgpLHRoaXMuX3NjaGVtYT10KTooaT0hMCxuPXQpLG49bnx8WyJ4IiwieSJdO2Zvcih2YXIgcj17fSxvPVtdLGE9e30scz0hMSxsPXt9LHU9MDt1PG4ubGVuZ3RoO3UrKyl7dmFyIGg9blt1XSxjPVUoaCk/bmV3IFhtKHtuYW1lOmh9KTpoIGluc3RhbmNlb2YgWG0/aDpuZXcgWG0oaCkscD1jLm5hbWU7Yy50eXBlPWMudHlwZXx8ImZsb2F0IixjLmNvb3JkRGltfHwoYy5jb29yZERpbT1wLGMuY29vcmREaW1JbmRleD0wKTt2YXIgZD1jLm90aGVyRGltcz1jLm90aGVyRGltc3x8e307by5wdXNoKHApLHJbcF09YyxudWxsIT1sW3BdJiYocz0hMCksYy5jcmVhdGVJbnZlcnRlZEluZGljZXMmJihhW3BdPVtdKSwwPT09ZC5pdGVtTmFtZSYmKHRoaXMuX25hbWVEaW1JZHg9dSksMD09PWQuaXRlbUlkJiYodGhpcy5faWREaW1JZHg9dSksaSYmKGMuc3RvcmVEaW1JbmRleD11KX1pZih0aGlzLmRpbWVuc2lvbnM9byx0aGlzLl9kaW1JbmZvcz1yLHRoaXMuX2luaXRHZXREaW1lbnNpb25JbmZvKHMpLHRoaXMuaG9zdE1vZGVsPWUsdGhpcy5faW52ZXJ0ZWRJbmRpY2VzTWFwPWEsdGhpcy5fZGltT21pdHRlZCl7dmFyIGY9dGhpcy5fZGltSWR4VG9OYW1lPXl0KCk7RShvLChmdW5jdGlvbih0KXtmLnNldChyW3RdLnN0b3JlRGltSW5kZXgsdCl9KSl9fXJldHVybiB0LnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVjb2duaXplRGltSW5kZXgodCk7aWYobnVsbD09ZSlyZXR1cm4gdDtpZihlPXQsIXRoaXMuX2RpbU9taXR0ZWQpcmV0dXJuIHRoaXMuZGltZW5zaW9uc1tlXTt2YXIgbj10aGlzLl9kaW1JZHhUb05hbWUuZ2V0KGUpO2lmKG51bGwhPW4pcmV0dXJuIG47dmFyIGk9dGhpcy5fc2NoZW1hLmdldFNvdXJjZURpbWVuc2lvbihlKTtyZXR1cm4gaT9pLm5hbWU6dm9pZCAwfSx0LnByb3RvdHlwZS5nZXREaW1lbnNpb25JbmRleD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWNvZ25pemVEaW1JbmRleCh0KTtpZihudWxsIT1lKXJldHVybiBlO2lmKG51bGw9PXQpcmV0dXJuLTE7dmFyIG49dGhpcy5fZ2V0RGltSW5mbyh0KTtyZXR1cm4gbj9uLnN0b3JlRGltSW5kZXg6dGhpcy5fZGltT21pdHRlZD90aGlzLl9zY2hlbWEuZ2V0U291cmNlRGltZW5zaW9uSW5kZXgodCk6LTF9LHQucHJvdG90eXBlLl9yZWNvZ25pemVEaW1JbmRleD1mdW5jdGlvbih0KXtpZihqKHQpfHxudWxsIT10JiYhaXNOYU4odCkmJiF0aGlzLl9nZXREaW1JbmZvKHQpJiYoIXRoaXMuX2RpbU9taXR0ZWR8fHRoaXMuX3NjaGVtYS5nZXRTb3VyY2VEaW1lbnNpb25JbmRleCh0KTwwKSlyZXR1cm4rdH0sdC5wcm90b3R5cGUuX2dldFN0b3JlRGltSW5kZXg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXREaW1lbnNpb25JbmRleCh0KTtyZXR1cm4gZX0sdC5wcm90b3R5cGUuZ2V0RGltZW5zaW9uSW5mbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ2V0RGltSW5mbyh0aGlzLmdldERpbWVuc2lvbih0KSl9LHQucHJvdG90eXBlLl9pbml0R2V0RGltZW5zaW9uSW5mbz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9kaW1JbmZvczt0aGlzLl9nZXREaW1JbmZvPXQ/ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkodCk/ZVt0XTp2b2lkIDB9OmZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfX0sdC5wcm90b3R5cGUuZ2V0RGltZW5zaW9uc09uQ29vcmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGltU3VtbWFyeS5kYXRhRGltc09uQ29vcmQuc2xpY2UoKX0sdC5wcm90b3R5cGUubWFwRGltZW5zaW9uPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZGltU3VtbWFyeTtpZihudWxsPT1lKXJldHVybiBuLmVuY29kZUZpcnN0RGltTm90RXh0cmFbdF07dmFyIGk9bi5lbmNvZGVbdF07cmV0dXJuIGk/aVtlXTpudWxsfSx0LnByb3RvdHlwZS5tYXBEaW1lbnNpb25zQWxsPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9kaW1TdW1tYXJ5LmVuY29kZVt0XXx8W10pLnNsaWNlKCl9LHQucHJvdG90eXBlLmdldFN0b3JlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0b3JlfSx0LnByb3RvdHlwZS5pbml0RGF0YT1mdW5jdGlvbih0LGUsbil7dmFyIGkscj10aGlzO2lmKHQgaW5zdGFuY2VvZiBLZiYmKGk9dCksIWkpe3ZhciBvPXRoaXMuZGltZW5zaW9ucyxhPVFkKHQpfHxOKHQpP25ldyBzZih0LG8ubGVuZ3RoKTp0O2k9bmV3IEtmO3ZhciBzPXN4KG8sKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOnIuX2RpbUluZm9zW3RdLnR5cGUscHJvcGVydHk6dH19KSk7aS5pbml0RGF0YShhLHMsbil9dGhpcy5fc3RvcmU9aSx0aGlzLl9uYW1lTGlzdD0oZXx8W10pLnNsaWNlKCksdGhpcy5faWRMaXN0PVtdLHRoaXMuX25hbWVSZXBlYXRDb3VudD17fSx0aGlzLl9kb0luaXQoMCxpLmNvdW50KCkpLHRoaXMuX2RpbVN1bW1hcnk9ZnVuY3Rpb24odCxlKXt2YXIgbj17fSxpPW4uZW5jb2RlPXt9LHI9eXQoKSxvPVtdLGE9W10scz17fTtFKHQuZGltZW5zaW9ucywoZnVuY3Rpb24oZSl7dmFyIG4sbD10LmdldERpbWVuc2lvbkluZm8oZSksdT1sLmNvb3JkRGltO2lmKHUpe3ZhciBoPWwuY29vcmREaW1JbmRleDtIbShpLHUpW2hdPWUsbC5pc0V4dHJhQ29vcmR8fChyLnNldCh1LDEpLCJvcmRpbmFsIiE9PShuPWwudHlwZSkmJiJ0aW1lIiE9PW4mJihvWzBdPWUpLEhtKHMsdSlbaF09dC5nZXREaW1lbnNpb25JbmRleChsLm5hbWUpKSxsLmRlZmF1bHRUb29sdGlwJiZhLnB1c2goZSl9R3AuZWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgbj1IbShpLGUpLHI9bC5vdGhlckRpbXNbZV07bnVsbCE9ciYmITEhPT1yJiYobltyXT1sLm5hbWUpfSkpfSkpO3ZhciBsPVtdLHU9e307ci5lYWNoKChmdW5jdGlvbih0LGUpe3ZhciBuPWlbZV07dVtlXT1uWzBdLGw9bC5jb25jYXQobil9KSksbi5kYXRhRGltc09uQ29vcmQ9bCxuLmRhdGFEaW1JbmRpY2VzT25Db29yZD16KGwsKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldERpbWVuc2lvbkluZm8oZSkuc3RvcmVEaW1JbmRleH0pKSxuLmVuY29kZUZpcnN0RGltTm90RXh0cmE9dTt2YXIgaD1pLmxhYmVsO2gmJmgubGVuZ3RoJiYobz1oLnNsaWNlKCkpO3ZhciBjPWkudG9vbHRpcDtyZXR1cm4gYyYmYy5sZW5ndGg/YT1jLnNsaWNlKCk6YS5sZW5ndGh8fChhPW8uc2xpY2UoKSksaS5kZWZhdWx0ZWRMYWJlbD1vLGkuZGVmYXVsdGVkVG9vbHRpcD1hLG4udXNlck91dHB1dD1uZXcgV20ocyxlKSxufSh0aGlzLHRoaXMuX3NjaGVtYSksdGhpcy51c2VyT3V0cHV0PXRoaXMuX2RpbVN1bW1hcnkudXNlck91dHB1dH0sdC5wcm90b3R5cGUuYXBwZW5kRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdG9yZS5hcHBlbmREYXRhKHQpO3RoaXMuX2RvSW5pdChlWzBdLGVbMV0pfSx0LnByb3RvdHlwZS5hcHBlbmRWYWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9zdG9yZS5hcHBlbmRWYWx1ZXModCxlLmxlbmd0aCksaT1uLnN0YXJ0LHI9bi5lbmQsbz10aGlzLl9zaG91bGRNYWtlSWRGcm9tTmFtZSgpO2lmKHRoaXMuX3VwZGF0ZU9yZGluYWxNZXRhKCksZSlmb3IodmFyIGE9aTthPHI7YSsrKXt2YXIgcz1hLWk7dGhpcy5fbmFtZUxpc3RbYV09ZVtzXSxvJiZveCh0aGlzLGEpfX0sdC5wcm90b3R5cGUuX3VwZGF0ZU9yZGluYWxNZXRhPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3N0b3JlLGU9dGhpcy5kaW1lbnNpb25zLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9dGhpcy5fZGltSW5mb3NbZVtuXV07aS5vcmRpbmFsTWV0YSYmdC5jb2xsZWN0T3JkaW5hbE1ldGEoaS5zdG9yZURpbUluZGV4LGkub3JkaW5hbE1ldGEpfX0sdC5wcm90b3R5cGUuX3Nob3VsZE1ha2VJZEZyb21OYW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RvcmUuZ2V0UHJvdmlkZXIoKTtyZXR1cm4gbnVsbD09dGhpcy5faWREaW1JZHgmJnQuZ2V0U291cmNlKCkuc291cmNlRm9ybWF0IT09VXAmJiF0LmZpbGxTdG9yYWdlfSx0LnByb3RvdHlwZS5fZG9Jbml0PWZ1bmN0aW9uKHQsZSl7aWYoISh0Pj1lKSl7dmFyIG49dGhpcy5fc3RvcmUuZ2V0UHJvdmlkZXIoKTt0aGlzLl91cGRhdGVPcmRpbmFsTWV0YSgpO3ZhciBpPXRoaXMuX25hbWVMaXN0LHI9dGhpcy5faWRMaXN0O2lmKG4uZ2V0U291cmNlKCkuc291cmNlRm9ybWF0PT09V3AmJiFuLnB1cmUpZm9yKHZhciBvPVtdLGE9dDthPGU7YSsrKXt2YXIgcz1uLmdldEl0ZW0oYSxvKTtpZighdGhpcy5oYXNJdGVtT3B0aW9uJiZrbyhzKSYmKHRoaXMuaGFzSXRlbU9wdGlvbj0hMCkscyl7dmFyIGw9cy5uYW1lO251bGw9PWlbYV0mJm51bGwhPWwmJihpW2FdPVJvKGwsbnVsbCkpO3ZhciB1PXMuaWQ7bnVsbD09clthXSYmbnVsbCE9dSYmKHJbYV09Um8odSxudWxsKSl9fWlmKHRoaXMuX3Nob3VsZE1ha2VJZEZyb21OYW1lKCkpZm9yKGE9dDthPGU7YSsrKW94KHRoaXMsYSk7UW0odGhpcyl9fSx0LnByb3RvdHlwZS5nZXRBcHByb3hpbWF0ZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXBwcm94aW1hdGVFeHRlbnRbdF18fHRoaXMuX3N0b3JlLmdldERhdGFFeHRlbnQodGhpcy5fZ2V0U3RvcmVEaW1JbmRleCh0KSl9LHQucHJvdG90eXBlLnNldEFwcHJveGltYXRlRXh0ZW50PWZ1bmN0aW9uKHQsZSl7ZT10aGlzLmdldERpbWVuc2lvbihlKSx0aGlzLl9hcHByb3hpbWF0ZUV4dGVudFtlXT10LnNsaWNlKCl9LHQucHJvdG90eXBlLmdldENhbGN1bGF0aW9uSW5mbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2FsY3VsYXRpb25JbmZvW3RdfSx0LnByb3RvdHlwZS5zZXRDYWxjdWxhdGlvbkluZm89ZnVuY3Rpb24odCxlKXtheCh0KT9BKHRoaXMuX2NhbGN1bGF0aW9uSW5mbyx0KTp0aGlzLl9jYWxjdWxhdGlvbkluZm9bdF09ZX0sdC5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFJhd0luZGV4KHQpLG49dGhpcy5fbmFtZUxpc3RbZV07cmV0dXJuIG51bGw9PW4mJm51bGwhPXRoaXMuX25hbWVEaW1JZHgmJihuPWV4KHRoaXMsdGhpcy5fbmFtZURpbUlkeCxlKSksbnVsbD09biYmKG49IiIpLG59LHQucHJvdG90eXBlLl9nZXRDYXRlZ29yeT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3N0b3JlLmdldCh0LGUpLGk9dGhpcy5fc3RvcmUuZ2V0T3JkaW5hbE1ldGEodCk7cmV0dXJuIGk/aS5jYXRlZ29yaWVzW25dOm59LHQucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKHQpe3JldHVybiB0eCh0aGlzLHRoaXMuZ2V0UmF3SW5kZXgodCkpfSx0LnByb3RvdHlwZS5jb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdG9yZS5jb3VudCgpfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9zdG9yZSxpPXRoaXMuX2RpbUluZm9zW3RdO2lmKGkpcmV0dXJuIG4uZ2V0KGkuc3RvcmVEaW1JbmRleCxlKX0sdC5wcm90b3R5cGUuZ2V0QnlSYXdJbmRleD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3N0b3JlLGk9dGhpcy5fZGltSW5mb3NbdF07aWYoaSlyZXR1cm4gbi5nZXRCeVJhd0luZGV4KGkuc3RvcmVEaW1JbmRleCxlKX0sdC5wcm90b3R5cGUuZ2V0SW5kaWNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdG9yZS5nZXRJbmRpY2VzKCl9LHQucHJvdG90eXBlLmdldERhdGFFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3N0b3JlLmdldERhdGFFeHRlbnQodGhpcy5fZ2V0U3RvcmVEaW1JbmRleCh0KSl9LHQucHJvdG90eXBlLmdldFN1bT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3VtKHRoaXMuX2dldFN0b3JlRGltSW5kZXgodCkpfSx0LnByb3RvdHlwZS5nZXRNZWRpYW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3N0b3JlLmdldE1lZGlhbih0aGlzLl9nZXRTdG9yZURpbUluZGV4KHQpKX0sdC5wcm90b3R5cGUuZ2V0VmFsdWVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX3N0b3JlO3JldHVybiBZKHQpP2kuZ2V0VmFsdWVzKHN4KHQsKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9nZXRTdG9yZURpbUluZGV4KHQpfSkpLGUpOmkuZ2V0VmFsdWVzKHQpfSx0LnByb3RvdHlwZS5oYXNWYWx1ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fZGltU3VtbWFyeS5kYXRhRGltSW5kaWNlc09uQ29vcmQsbj0wLGk9ZS5sZW5ndGg7bjxpO24rKylpZihpc05hTih0aGlzLl9zdG9yZS5nZXQoZVtuXSx0KSkpcmV0dXJuITE7cmV0dXJuITB9LHQucHJvdG90eXBlLmluZGV4T2ZOYW1lPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5fc3RvcmUuY291bnQoKTtlPG47ZSsrKWlmKHRoaXMuZ2V0TmFtZShlKT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LHQucHJvdG90eXBlLmdldFJhd0luZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdG9yZS5nZXRSYXdJbmRleCh0KX0sdC5wcm90b3R5cGUuaW5kZXhPZlJhd0luZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdG9yZS5pbmRleE9mUmF3SW5kZXgodCl9LHQucHJvdG90eXBlLnJhd0luZGV4T2Y9ZnVuY3Rpb24odCxlKXt2YXIgbj10JiZ0aGlzLl9pbnZlcnRlZEluZGljZXNNYXBbdF07dmFyIGk9bltlXTtyZXR1cm4gbnVsbD09aXx8aXNOYU4oaSk/LTE6aX0sdC5wcm90b3R5cGUuaW5kaWNlc09mTmVhcmVzdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3N0b3JlLmluZGljZXNPZk5lYXJlc3QodGhpcy5fZ2V0U3RvcmVEaW1JbmRleCh0KSxlLG4pfSx0LnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKHQsZSxuKXtYKHQpJiYobj1lLGU9dCx0PVtdKTt2YXIgaT1ufHx0aGlzLHI9c3gobngodCksdGhpcy5fZ2V0U3RvcmVEaW1JbmRleCx0aGlzKTt0aGlzLl9zdG9yZS5lYWNoKHIsaT9XKGUsaSk6ZSl9LHQucHJvdG90eXBlLmZpbHRlclNlbGY9ZnVuY3Rpb24odCxlLG4pe1godCkmJihuPWUsZT10LHQ9W10pO3ZhciBpPW58fHRoaXMscj1zeChueCh0KSx0aGlzLl9nZXRTdG9yZURpbUluZGV4LHRoaXMpO3JldHVybiB0aGlzLl9zdG9yZT10aGlzLl9zdG9yZS5maWx0ZXIocixpP1coZSxpKTplKSx0aGlzfSx0LnByb3RvdHlwZS5zZWxlY3RSYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49e307cmV0dXJuIEUoRyh0KSwoZnVuY3Rpb24oaSl7dmFyIHI9ZS5fZ2V0U3RvcmVEaW1JbmRleChpKTtuW3JdPXRbaV19KSksdGhpcy5fc3RvcmU9dGhpcy5fc3RvcmUuc2VsZWN0UmFuZ2UobiksdGhpc30sdC5wcm90b3R5cGUubWFwQXJyYXk9ZnVuY3Rpb24odCxlLG4pe1godCkmJihuPWUsZT10LHQ9W10pLG49bnx8dGhpczt2YXIgaT1bXTtyZXR1cm4gdGhpcy5lYWNoKHQsKGZ1bmN0aW9uKCl7aS5wdXNoKGUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pLG4pLGl9LHQucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1ufHxpfHx0aGlzLG89c3gobngodCksdGhpcy5fZ2V0U3RvcmVEaW1JbmRleCx0aGlzKSxhPXJ4KHRoaXMpO3JldHVybiBhLl9zdG9yZT10aGlzLl9zdG9yZS5tYXAobyxyP1coZSxyKTplKSxhfSx0LnByb3RvdHlwZS5tb2RpZnk9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9bnx8aXx8dGhpczt2YXIgbz1zeChueCh0KSx0aGlzLl9nZXRTdG9yZURpbUluZGV4LHRoaXMpO3RoaXMuX3N0b3JlLm1vZGlmeShvLHI/VyhlLHIpOmUpfSx0LnByb3RvdHlwZS5kb3duU2FtcGxlPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXJ4KHRoaXMpO3JldHVybiByLl9zdG9yZT10aGlzLl9zdG9yZS5kb3duU2FtcGxlKHRoaXMuX2dldFN0b3JlRGltSW5kZXgodCksZSxuLGkpLHJ9LHQucHJvdG90eXBlLmx0dGJEb3duU2FtcGxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49cngodGhpcyk7cmV0dXJuIG4uX3N0b3JlPXRoaXMuX3N0b3JlLmx0dGJEb3duU2FtcGxlKHRoaXMuX2dldFN0b3JlRGltSW5kZXgodCksZSksbn0sdC5wcm90b3R5cGUuZ2V0UmF3RGF0YUl0ZW09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3N0b3JlLmdldFJhd0RhdGFJdGVtKHQpfSx0LnByb3RvdHlwZS5nZXRJdGVtTW9kZWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ob3N0TW9kZWwsbj10aGlzLmdldFJhd0RhdGFJdGVtKHQpO3JldHVybiBuZXcgQ2MobixlLGUmJmUuZWNNb2RlbCl9LHQucHJvdG90eXBlLmRpZmY9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IEdtKHQ/dC5nZXRTdG9yZSgpLmdldEluZGljZXMoKTpbXSx0aGlzLmdldFN0b3JlKCkuZ2V0SW5kaWNlcygpLChmdW5jdGlvbihlKXtyZXR1cm4gdHgodCxlKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdHgoZSx0KX0pKX0sdC5wcm90b3R5cGUuZ2V0VmlzdWFsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Zpc3VhbDtyZXR1cm4gZSYmZVt0XX0sdC5wcm90b3R5cGUuc2V0VmlzdWFsPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmlzdWFsPXRoaXMuX3Zpc3VhbHx8e30sYXgodCk/QSh0aGlzLl92aXN1YWwsdCk6dGhpcy5fdmlzdWFsW3RdPWV9LHQucHJvdG90eXBlLmdldEl0ZW1WaXN1YWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pdGVtVmlzdWFsc1t0XSxpPW4mJm5bZV07cmV0dXJuIG51bGw9PWk/dGhpcy5nZXRWaXN1YWwoZSk6aX0sdC5wcm90b3R5cGUuaGFzSXRlbVZpc3VhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtVmlzdWFscy5sZW5ndGg+MH0sdC5wcm90b3R5cGUuZW5zdXJlVW5pcXVlSXRlbVZpc3VhbD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2l0ZW1WaXN1YWxzLGk9blt0XTtpfHwoaT1uW3RdPXt9KTt2YXIgcj1pW2VdO3JldHVybiBudWxsPT1yJiYoWShyPXRoaXMuZ2V0VmlzdWFsKGUpKT9yPXIuc2xpY2UoKTpheChyKSYmKHI9QSh7fSxyKSksaVtlXT1yKSxyfSx0LnByb3RvdHlwZS5zZXRJdGVtVmlzdWFsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9pdGVtVmlzdWFsc1t0XXx8e307dGhpcy5faXRlbVZpc3VhbHNbdF09aSxheChlKT9BKGksZSk6aVtlXT1ufSx0LnByb3RvdHlwZS5jbGVhckFsbFZpc3VhbD1mdW5jdGlvbigpe3RoaXMuX3Zpc3VhbD17fSx0aGlzLl9pdGVtVmlzdWFscz1bXX0sdC5wcm90b3R5cGUuc2V0TGF5b3V0PWZ1bmN0aW9uKHQsZSl7YXgodCk/QSh0aGlzLl9sYXlvdXQsdCk6dGhpcy5fbGF5b3V0W3RdPWV9LHQucHJvdG90eXBlLmdldExheW91dD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF5b3V0W3RdfSx0LnByb3RvdHlwZS5nZXRJdGVtTGF5b3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtTGF5b3V0c1t0XX0sdC5wcm90b3R5cGUuc2V0SXRlbUxheW91dD1mdW5jdGlvbih0LGUsbil7dGhpcy5faXRlbUxheW91dHNbdF09bj9BKHRoaXMuX2l0ZW1MYXlvdXRzW3RdfHx7fSxlKTplfSx0LnByb3RvdHlwZS5jbGVhckl0ZW1MYXlvdXRzPWZ1bmN0aW9uKCl7dGhpcy5faXRlbUxheW91dHMubGVuZ3RoPTB9LHQucHJvdG90eXBlLnNldEl0ZW1HcmFwaGljRWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmhvc3RNb2RlbCYmdGhpcy5ob3N0TW9kZWwuc2VyaWVzSW5kZXg7b2wobix0aGlzLmRhdGFUeXBlLHQsZSksdGhpcy5fZ3JhcGhpY0Vsc1t0XT1lfSx0LnByb3RvdHlwZS5nZXRJdGVtR3JhcGhpY0VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ncmFwaGljRWxzW3RdfSx0LnByb3RvdHlwZS5lYWNoSXRlbUdyYXBoaWNFbD1mdW5jdGlvbih0LGUpe0UodGhpcy5fZ3JhcGhpY0VscywoZnVuY3Rpb24obixpKXtuJiZ0JiZ0LmNhbGwoZSxuLGkpfSkpfSx0LnByb3RvdHlwZS5jbG9uZVNoYWxsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fChlPW5ldyB0KHRoaXMuX3NjaGVtYT90aGlzLl9zY2hlbWE6c3godGhpcy5kaW1lbnNpb25zLHRoaXMuX2dldERpbUluZm8sdGhpcyksdGhpcy5ob3N0TW9kZWwpKSxpeChlLHRoaXMpLGUuX3N0b3JlPXRoaXMuX3N0b3JlLGV9LHQucHJvdG90eXBlLndyYXBNZXRob2Q9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzW3RdO1gobikmJih0aGlzLl9fd3JhcHBlZE1ldGhvZHM9dGhpcy5fX3dyYXBwZWRNZXRob2RzfHxbXSx0aGlzLl9fd3JhcHBlZE1ldGhvZHMucHVzaCh0KSx0aGlzW3RdPWZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUuYXBwbHkodGhpcyxbdF0uY29uY2F0KGF0KGFyZ3VtZW50cykpKX0pfSx0LmludGVybmFsRmllbGQ9KFFtPWZ1bmN0aW9uKHQpe3ZhciBlPXQuX2ludmVydGVkSW5kaWNlc01hcDtFKGUsKGZ1bmN0aW9uKG4saSl7dmFyIHI9dC5fZGltSW5mb3NbaV0sbz1yLm9yZGluYWxNZXRhLGE9dC5fc3RvcmU7aWYobyl7bj1lW2ldPW5ldyBseChvLmNhdGVnb3JpZXMubGVuZ3RoKTtmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyluW3NdPS0xO2ZvcihzPTA7czxhLmNvdW50KCk7cysrKW5bYS5nZXQoci5zdG9yZURpbUluZGV4LHMpXT1zfX0pKX0sZXg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBSbyh0Ll9nZXRDYXRlZ29yeShlLG4pLG51bGwpfSx0eD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuX2lkTGlzdFtlXTtyZXR1cm4gbnVsbD09biYmbnVsbCE9dC5faWREaW1JZHgmJihuPWV4KHQsdC5faWREaW1JZHgsZSkpLG51bGw9PW4mJihuPSJlXDBcMCIrZSksbn0sbng9ZnVuY3Rpb24odCl7cmV0dXJuIFkodCl8fCh0PW51bGwhPXQ/W3RdOltdKSx0fSxyeD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdChlLl9zY2hlbWE/ZS5fc2NoZW1hOnN4KGUuZGltZW5zaW9ucyxlLl9nZXREaW1JbmZvLGUpLGUuaG9zdE1vZGVsKTtyZXR1cm4gaXgobixlKSxufSxpeD1mdW5jdGlvbih0LGUpe0UodXguY29uY2F0KGUuX193cmFwcGVkTWV0aG9kc3x8W10pLChmdW5jdGlvbihuKXtlLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKSx0Ll9fd3JhcHBlZE1ldGhvZHM9ZS5fX3dyYXBwZWRNZXRob2RzLEUoaHgsKGZ1bmN0aW9uKG4pe3Rbbl09VChlW25dKX0pKSx0Ll9jYWxjdWxhdGlvbkluZm89QSh7fSxlLl9jYWxjdWxhdGlvbkluZm8pfSx2b2lkKG94PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5fbmFtZUxpc3QsaT10Ll9pZExpc3Qscj10Ll9uYW1lRGltSWR4LG89dC5faWREaW1JZHgsYT1uW2VdLHM9aVtlXTtpZihudWxsPT1hJiZudWxsIT1yJiYobltlXT1hPWV4KHQscixlKSksbnVsbD09cyYmbnVsbCE9byYmKGlbZV09cz1leCh0LG8sZSkpLG51bGw9PXMmJm51bGwhPWEpe3ZhciBsPXQuX25hbWVSZXBlYXRDb3VudCx1PWxbYV09KGxbYV18fDApKzE7cz1hLHU+MSYmKHMrPSJfX2VjX18iK3UpLGlbZV09c319KSksdH0oKTtmdW5jdGlvbiBweCh0LGUpe1FkKHQpfHwodD1lZih0KSk7dmFyIG49KGU9ZXx8e30pLmNvb3JkRGltZW5zaW9uc3x8W10saT1lLmRpbWVuc2lvbnNEZWZpbmV8fHQuZGltZW5zaW9uc0RlZmluZXx8W10scj15dCgpLG89W10sYT1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1NYXRoLm1heCh0LmRpbWVuc2lvbnNEZXRlY3RlZENvdW50fHwxLGUubGVuZ3RoLG4ubGVuZ3RoLGl8fDApO3JldHVybiBFKGUsKGZ1bmN0aW9uKHQpe3ZhciBlO3EodCkmJihlPXQuZGltc0RlZikmJihyPU1hdGgubWF4KHIsZS5sZW5ndGgpKX0pKSxyfSh0LG4saSxlLmRpbWVuc2lvbnNDb3VudCkscz1lLmNhbk9taXRVbnVzZWREaW1lbnNpb25zJiZKbShhKSxsPWk9PT10LmRpbWVuc2lvbnNEZWZpbmUsdT1sPyRtKHQpOkttKGkpLGg9ZS5lbmNvZGVEZWZpbmU7IWgmJmUuZW5jb2RlRGVmYXVsdGVyJiYoaD1lLmVuY29kZURlZmF1bHRlcih0LGEpKTtmb3IodmFyIGM9eXQoaCkscD1uZXcgWGYoYSksZD0wO2Q8cC5sZW5ndGg7ZCsrKXBbZF09LTE7ZnVuY3Rpb24gZih0KXt2YXIgZT1wW3RdO2lmKGU8MCl7dmFyIG49aVt0XSxyPXEobik/bjp7bmFtZTpufSxhPW5ldyBYbSxzPXIubmFtZTtudWxsIT1zJiZudWxsIT11LmdldChzKSYmKGEubmFtZT1hLmRpc3BsYXlOYW1lPXMpLG51bGwhPXIudHlwZSYmKGEudHlwZT1yLnR5cGUpLG51bGwhPXIuZGlzcGxheU5hbWUmJihhLmRpc3BsYXlOYW1lPXIuZGlzcGxheU5hbWUpO3ZhciBsPW8ubGVuZ3RoO3JldHVybiBwW3RdPWwsYS5zdG9yZURpbUluZGV4PXQsby5wdXNoKGEpLGF9cmV0dXJuIG9bZV19aWYoIXMpZm9yKGQ9MDtkPGE7ZCsrKWYoZCk7Yy5lYWNoKChmdW5jdGlvbih0LGUpe3ZhciBuPVRvKHQpLnNsaWNlKCk7aWYoMT09PW4ubGVuZ3RoJiYhVShuWzBdKSYmblswXTwwKWMuc2V0KGUsITEpO2Vsc2V7dmFyIGk9Yy5zZXQoZSxbXSk7RShuLChmdW5jdGlvbih0LG4pe3ZhciByPVUodCk/dS5nZXQodCk6dDtudWxsIT1yJiZyPGEmJihpW25dPXIseShmKHIpLGUsbikpfSkpfX0pKTt2YXIgZz0wO2Z1bmN0aW9uIHkodCxlLG4pe251bGwhPUdwLmdldChlKT90Lm90aGVyRGltc1tlXT1uOih0LmNvb3JkRGltPWUsdC5jb29yZERpbUluZGV4PW4sci5zZXQoZSwhMCkpfUUobiwoZnVuY3Rpb24odCl7dmFyIGUsbixpLHI7aWYoVSh0KSllPXQscj17fTtlbHNle2U9KHI9dCkubmFtZTt2YXIgbz1yLm9yZGluYWxNZXRhO3Iub3JkaW5hbE1ldGE9bnVsbCwocj1BKHt9LHIpKS5vcmRpbmFsTWV0YT1vLG49ci5kaW1zRGVmLGk9ci5vdGhlckRpbXMsci5uYW1lPXIuY29vcmREaW09ci5jb29yZERpbUluZGV4PXIuZGltc0RlZj1yLm90aGVyRGltcz1udWxsfXZhciBzPWMuZ2V0KGUpO2lmKCExIT09cyl7aWYoIShzPVRvKHMpKS5sZW5ndGgpZm9yKHZhciB1PTA7dTwobiYmbi5sZW5ndGh8fDEpO3UrKyl7Zm9yKDtnPGEmJm51bGwhPWYoZykuY29vcmREaW07KWcrKztnPGEmJnMucHVzaChnKyspfUUocywoZnVuY3Rpb24odCxvKXt2YXIgYT1mKHQpO2lmKGwmJm51bGwhPXIudHlwZSYmKGEudHlwZT1yLnR5cGUpLHkoayhhLHIpLGUsbyksbnVsbD09YS5uYW1lJiZuKXt2YXIgcz1uW29dOyFxKHMpJiYocz17bmFtZTpzfSksYS5uYW1lPWEuZGlzcGxheU5hbWU9cy5uYW1lLGEuZGVmYXVsdFRvb2x0aXA9cy5kZWZhdWx0VG9vbHRpcH1pJiZrKGEub3RoZXJEaW1zLGkpfSkpfX0pKTt2YXIgdj1lLmdlbmVyYXRlQ29vcmQsbT1lLmdlbmVyYXRlQ29vcmRDb3VudCx4PW51bGwhPW07bT12P218fDE6MDt2YXIgXz12fHwidmFsdWUiO2Z1bmN0aW9uIGIodCl7bnVsbD09dC5uYW1lJiYodC5uYW1lPXQuY29vcmREaW0pfWlmKHMpRShvLChmdW5jdGlvbih0KXtiKHQpfSkpLG8uc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdG9yZURpbUluZGV4LWUuc3RvcmVEaW1JbmRleH0pKTtlbHNlIGZvcih2YXIgdz0wO3c8YTt3Kyspe3ZhciBTPWYodyk7bnVsbD09Uy5jb29yZERpbSYmKFMuY29vcmREaW09ZHgoXyxyLHgpLFMuY29vcmREaW1JbmRleD0wLCghdnx8bTw9MCkmJihTLmlzRXh0cmFDb29yZD0hMCksbS0tKSxiKFMpLG51bGwhPVMudHlwZXx8aWQodCx3KSE9PUtwJiYoIVMuaXNFeHRyYUNvb3JkfHxudWxsPT1TLm90aGVyRGltcy5pdGVtTmFtZSYmbnVsbD09Uy5vdGhlckRpbXMuc2VyaWVzTmFtZSl8fChTLnR5cGU9Im9yZGluYWwiKX1yZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPXl0KCksbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dLHI9aS5uYW1lLG89ZS5nZXQocil8fDA7bz4wJiYoaS5uYW1lPXIrKG8tMSkpLG8rKyxlLnNldChyLG8pfX0obyksbmV3IGptKHtzb3VyY2U6dCxkaW1lbnNpb25zOm8sZnVsbERpbWVuc2lvbkNvdW50OmEsZGltZW5zaW9uT21pdHRlZDpzfSl9ZnVuY3Rpb24gZHgodCxlLG4pe2lmKG58fGUuaGFzS2V5KHQpKXtmb3IodmFyIGk9MDtlLmhhc0tleSh0K2kpOylpKys7dCs9aX1yZXR1cm4gZS5zZXQodCwhMCksdH12YXIgZng9ZnVuY3Rpb24odCl7dGhpcy5jb29yZFN5c0RpbXM9W10sdGhpcy5heGlzTWFwPXl0KCksdGhpcy5jYXRlZ29yeUF4aXNNYXA9eXQoKSx0aGlzLmNvb3JkU3lzTmFtZT10fTt2YXIgZ3g9e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygieEF4aXMiLFdvKS5tb2RlbHNbMF0sbz10LmdldFJlZmVycmluZ0NvbXBvbmVudHMoInlBeGlzIixXbykubW9kZWxzWzBdO2UuY29vcmRTeXNEaW1zPVsieCIsInkiXSxuLnNldCgieCIsciksbi5zZXQoInkiLG8pLHl4KHIpJiYoaS5zZXQoIngiLHIpLGUuZmlyc3RDYXRlZ29yeURpbUluZGV4PTApLHl4KG8pJiYoaS5zZXQoInkiLG8pLG51bGw9PWUuZmlyc3RDYXRlZ29yeURpbUluZGV4JiYoZS5maXJzdENhdGVnb3J5RGltSW5kZXg9MSkpfSxzaW5nbGVBeGlzOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygic2luZ2xlQXhpcyIsV28pLm1vZGVsc1swXTtlLmNvb3JkU3lzRGltcz1bInNpbmdsZSJdLG4uc2V0KCJzaW5nbGUiLHIpLHl4KHIpJiYoaS5zZXQoInNpbmdsZSIsciksZS5maXJzdENhdGVnb3J5RGltSW5kZXg9MCl9LHBvbGFyOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygicG9sYXIiLFdvKS5tb2RlbHNbMF0sbz1yLmZpbmRBeGlzTW9kZWwoInJhZGl1c0F4aXMiKSxhPXIuZmluZEF4aXNNb2RlbCgiYW5nbGVBeGlzIik7ZS5jb29yZFN5c0RpbXM9WyJyYWRpdXMiLCJhbmdsZSJdLG4uc2V0KCJyYWRpdXMiLG8pLG4uc2V0KCJhbmdsZSIsYSkseXgobykmJihpLnNldCgicmFkaXVzIixvKSxlLmZpcnN0Q2F0ZWdvcnlEaW1JbmRleD0wKSx5eChhKSYmKGkuc2V0KCJhbmdsZSIsYSksbnVsbD09ZS5maXJzdENhdGVnb3J5RGltSW5kZXgmJihlLmZpcnN0Q2F0ZWdvcnlEaW1JbmRleD0xKSl9LGdlbzpmdW5jdGlvbih0LGUsbixpKXtlLmNvb3JkU3lzRGltcz1bImxuZyIsImxhdCJdfSxwYXJhbGxlbDpmdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LmVjTW9kZWwsbz1yLmdldENvbXBvbmVudCgicGFyYWxsZWwiLHQuZ2V0KCJwYXJhbGxlbEluZGV4IikpLGE9ZS5jb29yZFN5c0RpbXM9by5kaW1lbnNpb25zLnNsaWNlKCk7RShvLnBhcmFsbGVsQXhpc0luZGV4LChmdW5jdGlvbih0LG8pe3ZhciBzPXIuZ2V0Q29tcG9uZW50KCJwYXJhbGxlbEF4aXMiLHQpLGw9YVtvXTtuLnNldChsLHMpLHl4KHMpJiYoaS5zZXQobCxzKSxudWxsPT1lLmZpcnN0Q2F0ZWdvcnlEaW1JbmRleCYmKGUuZmlyc3RDYXRlZ29yeURpbUluZGV4PW8pKX0pKX19O2Z1bmN0aW9uIHl4KHQpe3JldHVybiJjYXRlZ29yeSI9PT10LmdldCgidHlwZSIpfWZ1bmN0aW9uIHZ4KHQsZSxuKXt2YXIgaSxyLG8sYT0obj1ufHx7fSkuYnlJbmRleCxzPW4uc3RhY2tlZENvb3JkRGltZW5zaW9uOyFmdW5jdGlvbih0KXtyZXR1cm4hcW0odC5zY2hlbWEpfShlKT8ocj1lLnNjaGVtYSxpPXIuZGltZW5zaW9ucyxvPWUuc3RvcmUpOmk9ZTt2YXIgbCx1LGgsYyxwPSEoIXR8fCF0LmdldCgic3RhY2siKSk7aWYoRShpLChmdW5jdGlvbih0LGUpe1UodCkmJihpW2VdPXQ9e25hbWU6dH0pLHAmJiF0LmlzRXh0cmFDb29yZCYmKGF8fGx8fCF0Lm9yZGluYWxNZXRhfHwobD10KSx1fHwib3JkaW5hbCI9PT10LnR5cGV8fCJ0aW1lIj09PXQudHlwZXx8cyYmcyE9PXQuY29vcmREaW18fCh1PXQpKX0pKSwhdXx8YXx8bHx8KGE9ITApLHUpe2g9Il9fXDBlY3N0YWNrcmVzdWx0XyIrdC5pZCxjPSJfX1wwZWNzdGFja2Vkb3Zlcl8iK3QuaWQsbCYmKGwuY3JlYXRlSW52ZXJ0ZWRJbmRpY2VzPSEwKTt2YXIgZD11LmNvb3JkRGltLGY9dS50eXBlLGc9MDtFKGksKGZ1bmN0aW9uKHQpe3QuY29vcmREaW09PT1kJiZnKyt9KSk7dmFyIHk9e25hbWU6aCxjb29yZERpbTpkLGNvb3JkRGltSW5kZXg6Zyx0eXBlOmYsaXNFeHRyYUNvb3JkOiEwLGlzQ2FsY3VsYXRpb25Db29yZDohMCxzdG9yZURpbUluZGV4OmkubGVuZ3RofSx2PXtuYW1lOmMsY29vcmREaW06Yyxjb29yZERpbUluZGV4OmcrMSx0eXBlOmYsaXNFeHRyYUNvb3JkOiEwLGlzQ2FsY3VsYXRpb25Db29yZDohMCxzdG9yZURpbUluZGV4OmkubGVuZ3RoKzF9O3I/KG8mJih5LnN0b3JlRGltSW5kZXg9by5lbnN1cmVDYWxjdWxhdGlvbkRpbWVuc2lvbihjLGYpLHYuc3RvcmVEaW1JbmRleD1vLmVuc3VyZUNhbGN1bGF0aW9uRGltZW5zaW9uKGgsZikpLHIuYXBwZW5kQ2FsY3VsYXRpb25EaW1lbnNpb24oeSksci5hcHBlbmRDYWxjdWxhdGlvbkRpbWVuc2lvbih2KSk6KGkucHVzaCh5KSxpLnB1c2godikpfXJldHVybntzdGFja2VkRGltZW5zaW9uOnUmJnUubmFtZSxzdGFja2VkQnlEaW1lbnNpb246bCYmbC5uYW1lLGlzU3RhY2tlZEJ5SW5kZXg6YSxzdGFja2VkT3ZlckRpbWVuc2lvbjpjLHN0YWNrUmVzdWx0RGltZW5zaW9uOmh9fWZ1bmN0aW9uIG14KHQsZSl7cmV0dXJuISFlJiZlPT09dC5nZXRDYWxjdWxhdGlvbkluZm8oInN0YWNrZWREaW1lbnNpb24iKX1mdW5jdGlvbiB4eCh0LGUpe3JldHVybiBteCh0LGUpP3QuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja1Jlc3VsdERpbWVuc2lvbiIpOmV9ZnVuY3Rpb24gX3godCxlLG4pe249bnx8e307dmFyIGkscj1lLmdldFNvdXJjZU1hbmFnZXIoKSxvPSExO3Q/KG89ITAsaT1lZih0KSk6bz0oaT1yLmdldFNvdXJjZSgpKS5zb3VyY2VGb3JtYXQ9PT1XcDt2YXIgYT1mdW5jdGlvbih0KXt2YXIgZT10LmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpLG49bmV3IGZ4KGUpLGk9Z3hbZV07aWYoaSlyZXR1cm4gaSh0LG4sbi5heGlzTWFwLG4uY2F0ZWdvcnlBeGlzTWFwKSxufShlKSxzPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT10LmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpLHI9d2QuZ2V0KGkpO3JldHVybiBlJiZlLmNvb3JkU3lzRGltcyYmKG49eihlLmNvb3JkU3lzRGltcywoZnVuY3Rpb24odCl7dmFyIG49e25hbWU6dH0saT1lLmF4aXNNYXAuZ2V0KHQpO2lmKGkpe3ZhciByPWkuZ2V0KCJ0eXBlIik7bi50eXBlPVltKHIpfXJldHVybiBufSkpKSxufHwobj1yJiYoci5nZXREaW1lbnNpb25zSW5mbz9yLmdldERpbWVuc2lvbnNJbmZvKCk6ci5kaW1lbnNpb25zLnNsaWNlKCkpfHxbIngiLCJ5Il0pLG59KGUsYSksbD1uLnVzZUVuY29kZURlZmF1bHRlcix1PVgobCk/bDpsP0godGQscyxlKTpudWxsLGg9cHgoaSx7Y29vcmREaW1lbnNpb25zOnMsZ2VuZXJhdGVDb29yZDpuLmdlbmVyYXRlQ29vcmQsZW5jb2RlRGVmaW5lOmUuZ2V0RW5jb2RlKCksZW5jb2RlRGVmYXVsdGVyOnUsY2FuT21pdFVudXNlZERpbWVuc2lvbnM6IW99KSxjPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyO3JldHVybiBuJiZFKHQsKGZ1bmN0aW9uKHQsbyl7dmFyIGE9dC5jb29yZERpbSxzPW4uY2F0ZWdvcnlBeGlzTWFwLmdldChhKTtzJiYobnVsbD09aSYmKGk9byksdC5vcmRpbmFsTWV0YT1zLmdldE9yZGluYWxNZXRhKCksZSYmKHQuY3JlYXRlSW52ZXJ0ZWRJbmRpY2VzPSEwKSksbnVsbCE9dC5vdGhlckRpbXMuaXRlbU5hbWUmJihyPSEwKX0pKSxyfHxudWxsPT1pfHwodFtpXS5vdGhlckRpbXMuaXRlbU5hbWU9MCksaX0oaC5kaW1lbnNpb25zLG4uY3JlYXRlSW52ZXJ0ZWRJbmRpY2VzLGEpLHA9bz9udWxsOnIuZ2V0U2hhcmVkRGF0YVN0b3JlKGgpLGQ9dngoZSx7c2NoZW1hOmgsc3RvcmU6cH0pLGY9bmV3IGN4KGgsZSk7Zi5zZXRDYWxjdWxhdGlvbkluZm8oZCk7dmFyIGc9bnVsbCE9YyYmZnVuY3Rpb24odCl7aWYodC5zb3VyY2VGb3JtYXQ9PT1XcCl7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9MDtmb3IoO2U8dC5sZW5ndGgmJm51bGw9PXRbZV07KWUrKztyZXR1cm4gdFtlXX0odC5kYXRhfHxbXSk7cmV0dXJuIVkoQW8oZSkpfX0oaSk/ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIGk9PT1jP246dGhpcy5kZWZhdWx0RGltVmFsdWVHZXR0ZXIodCxlLG4saSl9Om51bGw7cmV0dXJuIGYuaGFzSXRlbU9wdGlvbj0hMSxmLmluaXREYXRhKG8/aTpwLG51bGwsZyksZn12YXIgYng9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3NldHRpbmc9dHx8e30sdGhpcy5fZXh0ZW50PVsxLzAsLTEvMF19cmV0dXJuIHQucHJvdG90eXBlLmdldFNldHRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NldHRpbmdbdF19LHQucHJvdG90eXBlLnVuaW9uRXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDt0WzBdPGVbMF0mJihlWzBdPXRbMF0pLHRbMV0+ZVsxXSYmKGVbMV09dFsxXSl9LHQucHJvdG90eXBlLnVuaW9uRXh0ZW50RnJvbURhdGE9ZnVuY3Rpb24odCxlKXt0aGlzLnVuaW9uRXh0ZW50KHQuZ2V0QXBwcm94aW1hdGVFeHRlbnQoZSkpfSx0LnByb3RvdHlwZS5nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXh0ZW50LnNsaWNlKCl9LHQucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2V4dGVudDtpc05hTih0KXx8KG5bMF09dCksaXNOYU4oZSl8fChuWzFdPWUpfSx0LnByb3RvdHlwZS5pc0luRXh0ZW50UmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V4dGVudFswXTw9dCYmdGhpcy5fZXh0ZW50WzFdPj10fSx0LnByb3RvdHlwZS5pc0JsYW5rPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQmxhbmt9LHQucHJvdG90eXBlLnNldEJsYW5rPWZ1bmN0aW9uKHQpe3RoaXMuX2lzQmxhbms9dH0sdH0oKTtuYShieCk7dmFyIFN4PTAsTXg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuY2F0ZWdvcmllcz10LmNhdGVnb3JpZXN8fFtdLHRoaXMuX25lZWRDb2xsZWN0PXQubmVlZENvbGxlY3QsdGhpcy5fZGVkdXBsaWNhdGlvbj10LmRlZHVwbGljYXRpb24sdGhpcy51aWQ9KytTeH1yZXR1cm4gdC5jcmVhdGVCeUF4aXNNb2RlbD1mdW5jdGlvbihlKXt2YXIgbj1lLm9wdGlvbixpPW4uZGF0YSxyPWkmJnooaSxJeCk7cmV0dXJuIG5ldyB0KHtjYXRlZ29yaWVzOnIsbmVlZENvbGxlY3Q6IXIsZGVkdXBsaWNhdGlvbjohMSE9PW4uZGVkcGxpY2F0aW9ufSl9LHQucHJvdG90eXBlLmdldE9yZGluYWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dldE9yQ3JlYXRlTWFwKCkuZ2V0KHQpfSx0LnByb3RvdHlwZS5wYXJzZUFuZENvbGxlY3Q9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLl9uZWVkQ29sbGVjdDtpZighVSh0KSYmIW4pcmV0dXJuIHQ7aWYobiYmIXRoaXMuX2RlZHVwbGljYXRpb24pcmV0dXJuIGU9dGhpcy5jYXRlZ29yaWVzLmxlbmd0aCx0aGlzLmNhdGVnb3JpZXNbZV09dCxlO3ZhciBpPXRoaXMuX2dldE9yQ3JlYXRlTWFwKCk7cmV0dXJuIG51bGw9PShlPWkuZ2V0KHQpKSYmKG4/KGU9dGhpcy5jYXRlZ29yaWVzLmxlbmd0aCx0aGlzLmNhdGVnb3JpZXNbZV09dCxpLnNldCh0LGUpKTplPU5hTiksZX0sdC5wcm90b3R5cGUuX2dldE9yQ3JlYXRlTWFwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcHx8KHRoaXMuX21hcD15dCh0aGlzLmNhdGVnb3JpZXMpKX0sdH0oKTtmdW5jdGlvbiBJeCh0KXtyZXR1cm4gcSh0KSYmbnVsbCE9dC52YWx1ZT90LnZhbHVlOnQrIiJ9ZnVuY3Rpb24gVHgodCl7cmV0dXJuImludGVydmFsIj09PXQudHlwZXx8ImxvZyI9PT10LnR5cGV9ZnVuY3Rpb24gQ3godCxlLG4saSl7dmFyIHI9e30sbz10WzFdLXRbMF0sYT1yLmludGVydmFsPXBvKG8vZSwhMCk7bnVsbCE9biYmYTxuJiYoYT1yLmludGVydmFsPW4pLG51bGwhPWkmJmE+aSYmKGE9ci5pbnRlcnZhbD1pKTt2YXIgcz1yLmludGVydmFsUHJlY2lzaW9uPUF4KGEpO3JldHVybiBmdW5jdGlvbih0LGUpeyFpc0Zpbml0ZSh0WzBdKSYmKHRbMF09ZVswXSksIWlzRmluaXRlKHRbMV0pJiYodFsxXT1lWzFdKSxreCh0LDAsZSksa3godCwxLGUpLHRbMF0+dFsxXSYmKHRbMF09dFsxXSl9KHIubmljZVRpY2tFeHRlbnQ9W0pyKE1hdGguY2VpbCh0WzBdL2EpKmEscyksSnIoTWF0aC5mbG9vcih0WzFdL2EpKmEscyldLHQpLHJ9ZnVuY3Rpb24gRHgodCl7dmFyIGU9TWF0aC5wb3coMTAsY28odCkpLG49dC9lO3JldHVybiBuPzI9PT1uP249MzozPT09bj9uPTU6bio9MjpuPTEsSnIobiplKX1mdW5jdGlvbiBBeCh0KXtyZXR1cm4gdG8odCkrMn1mdW5jdGlvbiBreCh0LGUsbil7dFtlXT1NYXRoLm1heChNYXRoLm1pbih0W2VdLG5bMV0pLG5bMF0pfWZ1bmN0aW9uIEx4KHQsZSl7cmV0dXJuIHQ+PWVbMF0mJnQ8PWVbMV19ZnVuY3Rpb24gUHgodCxlKXtyZXR1cm4gZVsxXT09PWVbMF0/LjU6KHQtZVswXSkvKGVbMV0tZVswXSl9ZnVuY3Rpb24gT3godCxlKXtyZXR1cm4gdCooZVsxXS1lWzBdKStlWzBdfXZhciBSeD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO24udHlwZT0ib3JkaW5hbCI7dmFyIGk9bi5nZXRTZXR0aW5nKCJvcmRpbmFsTWV0YSIpO3JldHVybiBpfHwoaT1uZXcgTXgoe30pKSxZKGkpJiYoaT1uZXcgTXgoe2NhdGVnb3JpZXM6eihpLChmdW5jdGlvbih0KXtyZXR1cm4gcSh0KT90LnZhbHVlOnR9KSl9KSksbi5fb3JkaW5hbE1ldGE9aSxuLl9leHRlbnQ9bi5nZXRTZXR0aW5nKCJleHRlbnQiKXx8WzAsaS5jYXRlZ29yaWVzLmxlbmd0aC0xXSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/TmFOOlUodCk/dGhpcy5fb3JkaW5hbE1ldGEuZ2V0T3JkaW5hbCh0KTpNYXRoLnJvdW5kKHQpfSxlLnByb3RvdHlwZS5jb250YWluPWZ1bmN0aW9uKHQpe3JldHVybiBMeCh0PXRoaXMucGFyc2UodCksdGhpcy5fZXh0ZW50KSYmbnVsbCE9dGhpcy5fb3JkaW5hbE1ldGEuY2F0ZWdvcmllc1t0XX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBQeCh0PXRoaXMuX2dldFRpY2tOdW1iZXIodGhpcy5wYXJzZSh0KSksdGhpcy5fZXh0ZW50KX0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5yb3VuZChPeCh0LHRoaXMuX2V4dGVudCkpLHRoaXMuZ2V0UmF3T3JkaW5hbE51bWJlcih0KX0sZS5wcm90b3R5cGUuZ2V0VGlja3M9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT10aGlzLl9leHRlbnQsbj1lWzBdO248PWVbMV07KXQucHVzaCh7dmFsdWU6bn0pLG4rKztyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TWlub3JUaWNrcz1mdW5jdGlvbih0KXt9LGUucHJvdG90eXBlLnNldFNvcnRJbmZvPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe2Zvcih2YXIgZT10Lm9yZGluYWxOdW1iZXJzLG49dGhpcy5fb3JkaW5hbE51bWJlcnNCeVRpY2s9W10saT10aGlzLl90aWNrc0J5T3JkaW5hbE51bWJlcj1bXSxyPTAsbz10aGlzLl9vcmRpbmFsTWV0YS5jYXRlZ29yaWVzLmxlbmd0aCxhPU1hdGgubWluKG8sZS5sZW5ndGgpO3I8YTsrK3Ipe3ZhciBzPWVbcl07bltyXT1zLGlbc109cn1mb3IodmFyIGw9MDtyPG87KytyKXtmb3IoO251bGwhPWlbbF07KWwrKztuLnB1c2gobCksaVtsXT1yfX1lbHNlIHRoaXMuX29yZGluYWxOdW1iZXJzQnlUaWNrPXRoaXMuX3RpY2tzQnlPcmRpbmFsTnVtYmVyPW51bGx9LGUucHJvdG90eXBlLl9nZXRUaWNrTnVtYmVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpY2tzQnlPcmRpbmFsTnVtYmVyO3JldHVybiBlJiZ0Pj0wJiZ0PGUubGVuZ3RoP2VbdF06dH0sZS5wcm90b3R5cGUuZ2V0UmF3T3JkaW5hbE51bWJlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9vcmRpbmFsTnVtYmVyc0J5VGljaztyZXR1cm4gZSYmdD49MCYmdDxlLmxlbmd0aD9lW3RdOnR9LGUucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmlzQmxhbmsoKSl7dmFyIGU9dGhpcy5nZXRSYXdPcmRpbmFsTnVtYmVyKHQudmFsdWUpLG49dGhpcy5fb3JkaW5hbE1ldGEuY2F0ZWdvcmllc1tlXTtyZXR1cm4gbnVsbD09bj8iIjpuKyIifX0sZS5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXh0ZW50WzFdLXRoaXMuX2V4dGVudFswXSsxfSxlLnByb3RvdHlwZS51bmlvbkV4dGVudEZyb21EYXRhPWZ1bmN0aW9uKHQsZSl7dGhpcy51bmlvbkV4dGVudCh0LmdldEFwcHJveGltYXRlRXh0ZW50KGUpKX0sZS5wcm90b3R5cGUuaXNJbkV4dGVudFJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMuX2dldFRpY2tOdW1iZXIodCksdGhpcy5fZXh0ZW50WzBdPD10JiZ0aGlzLl9leHRlbnRbMV0+PXR9LGUucHJvdG90eXBlLmdldE9yZGluYWxNZXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yZGluYWxNZXRhfSxlLnByb3RvdHlwZS5jYWxjTmljZVRpY2tzPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5jYWxjTmljZUV4dGVudD1mdW5jdGlvbigpe30sZS50eXBlPSJvcmRpbmFsIixlfShieCk7YngucmVnaXN0ZXJDbGFzcyhSeCk7dmFyIE54PUpyLEV4PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT0iaW50ZXJ2YWwiLGUuX2ludGVydmFsPTAsZS5faW50ZXJ2YWxQcmVjaXNpb249MixlfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGUucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCl7cmV0dXJuIEx4KHQsdGhpcy5fZXh0ZW50KX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBQeCh0LHRoaXMuX2V4dGVudCl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBPeCh0LHRoaXMuX2V4dGVudCl9LGUucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2V4dGVudDtpc05hTih0KXx8KG5bMF09cGFyc2VGbG9hdCh0KSksaXNOYU4oZSl8fChuWzFdPXBhcnNlRmxvYXQoZSkpfSxlLnByb3RvdHlwZS51bmlvbkV4dGVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQ7dFswXTxlWzBdJiYoZVswXT10WzBdKSx0WzFdPmVbMV0mJihlWzFdPXRbMV0pLHRoaXMuc2V0RXh0ZW50KGVbMF0sZVsxXSl9LGUucHJvdG90eXBlLmdldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVydmFsfSxlLnByb3RvdHlwZS5zZXRJbnRlcnZhbD1mdW5jdGlvbih0KXt0aGlzLl9pbnRlcnZhbD10LHRoaXMuX25pY2VFeHRlbnQ9dGhpcy5fZXh0ZW50LnNsaWNlKCksdGhpcy5faW50ZXJ2YWxQcmVjaXNpb249QXgodCl9LGUucHJvdG90eXBlLmdldFRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2ludGVydmFsLG49dGhpcy5fZXh0ZW50LGk9dGhpcy5fbmljZUV4dGVudCxyPXRoaXMuX2ludGVydmFsUHJlY2lzaW9uLG89W107aWYoIWUpcmV0dXJuIG87blswXTxpWzBdJiYodD9vLnB1c2goe3ZhbHVlOk54KGlbMF0tZSxyKX0pOm8ucHVzaCh7dmFsdWU6blswXX0pKTtmb3IodmFyIGE9aVswXTthPD1pWzFdJiYoby5wdXNoKHt2YWx1ZTphfSksKGE9TngoYStlLHIpKSE9PW9bby5sZW5ndGgtMV0udmFsdWUpOylpZihvLmxlbmd0aD4xZTQpcmV0dXJuW107dmFyIHM9by5sZW5ndGg/b1tvLmxlbmd0aC0xXS52YWx1ZTppWzFdO3JldHVybiBuWzFdPnMmJih0P28ucHVzaCh7dmFsdWU6TngocytlLHIpfSk6by5wdXNoKHt2YWx1ZTpuWzFdfSkpLG99LGUucHJvdG90eXBlLmdldE1pbm9yVGlja3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZ2V0VGlja3MoITApLG49W10saT10aGlzLmdldEV4dGVudCgpLHI9MTtyPGUubGVuZ3RoO3IrKyl7Zm9yKHZhciBvPWVbcl0sYT1lW3ItMV0scz0wLGw9W10sdT0oby52YWx1ZS1hLnZhbHVlKS90O3M8dC0xOyl7dmFyIGg9TngoYS52YWx1ZSsocysxKSp1KTtoPmlbMF0mJmg8aVsxXSYmbC5wdXNoKGgpLHMrK31uLnB1c2gobCl9cmV0dXJuIG59LGUucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm4iIjt2YXIgbj1lJiZlLnByZWNpc2lvbjtyZXR1cm4gbnVsbD09bj9uPXRvKHQudmFsdWUpfHwwOiJhdXRvIj09PW4mJihuPXRoaXMuX2ludGVydmFsUHJlY2lzaW9uKSxncChOeCh0LnZhbHVlLG4sITApKX0sZS5wcm90b3R5cGUuY2FsY05pY2VUaWNrcz1mdW5jdGlvbih0LGUsbil7dD10fHw1O3ZhciBpPXRoaXMuX2V4dGVudCxyPWlbMV0taVswXTtpZihpc0Zpbml0ZShyKSl7cjwwJiYocj0tcixpLnJldmVyc2UoKSk7dmFyIG89Q3goaSx0LGUsbik7dGhpcy5faW50ZXJ2YWxQcmVjaXNpb249by5pbnRlcnZhbFByZWNpc2lvbix0aGlzLl9pbnRlcnZhbD1vLmludGVydmFsLHRoaXMuX25pY2VFeHRlbnQ9by5uaWNlVGlja0V4dGVudH19LGUucHJvdG90eXBlLmNhbGNOaWNlRXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDtpZihlWzBdPT09ZVsxXSlpZigwIT09ZVswXSl7dmFyIG49TWF0aC5hYnMoZVswXSk7dC5maXhNYXh8fChlWzFdKz1uLzIpLGVbMF0tPW4vMn1lbHNlIGVbMV09MTt2YXIgaT1lWzFdLWVbMF07aXNGaW5pdGUoaSl8fChlWzBdPTAsZVsxXT0xKSx0aGlzLmNhbGNOaWNlVGlja3ModC5zcGxpdE51bWJlcix0Lm1pbkludGVydmFsLHQubWF4SW50ZXJ2YWwpO3ZhciByPXRoaXMuX2ludGVydmFsO3QuZml4TWlufHwoZVswXT1OeChNYXRoLmZsb29yKGVbMF0vcikqcikpLHQuZml4TWF4fHwoZVsxXT1OeChNYXRoLmNlaWwoZVsxXS9yKSpyKSl9LGUucHJvdG90eXBlLnNldE5pY2VFeHRlbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9uaWNlRXh0ZW50PVt0LGVdfSxlLnR5cGU9ImludGVydmFsIixlfShieCk7YngucmVnaXN0ZXJDbGFzcyhFeCk7dmFyIHp4PSJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5LFZ4PXp4P0Zsb2F0MzJBcnJheTpBcnJheTtmdW5jdGlvbiBCeCh0KXtyZXR1cm4gWSh0KT96eD9uZXcgRmxvYXQzMkFycmF5KHQpOnQ6bmV3IFZ4KHQpfXZhciBGeD0iX19lY19zdGFja18iO2Z1bmN0aW9uIEd4KHQpe3JldHVybiB0LmdldCgic3RhY2siKXx8RngrdC5zZXJpZXNJbmRleH1mdW5jdGlvbiBXeCh0KXtyZXR1cm4gdC5kaW0rdC5pbmRleH1mdW5jdGlvbiBIeCh0LGUpe3ZhciBuPVtdO3JldHVybiBlLmVhY2hTZXJpZXNCeVR5cGUodCwoZnVuY3Rpb24odCl7angodCkmJm4ucHVzaCh0KX0pKSxufWZ1bmN0aW9uIFl4KHQpe3ZhciBlPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O0UodCwoZnVuY3Rpb24odCl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtLmdldEJhc2VBeGlzKCk7aWYoInRpbWUiPT09bi50eXBlfHwidmFsdWUiPT09bi50eXBlKWZvcih2YXIgaT10LmdldERhdGEoKSxyPW4uZGltKyJfIituLmluZGV4LG89aS5nZXREaW1lbnNpb25JbmRleChpLm1hcERpbWVuc2lvbihuLmRpbSkpLGE9aS5nZXRTdG9yZSgpLHM9MCxsPWEuY291bnQoKTtzPGw7KytzKXt2YXIgdT1hLmdldChvLHMpO2Vbcl0/ZVtyXS5wdXNoKHUpOmVbcl09W3VdfX0pKTt2YXIgbj17fTtmb3IodmFyIGkgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGkpKXt2YXIgcj1lW2ldO2lmKHIpe3Iuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpO2Zvcih2YXIgbz1udWxsLGE9MTthPHIubGVuZ3RoOysrYSl7dmFyIHM9clthXS1yW2EtMV07cz4wJiYobz1udWxsPT09bz9zOk1hdGgubWluKG8scykpfW5baV09b319cmV0dXJuIG59KHQpLG49W107cmV0dXJuIEUodCwoZnVuY3Rpb24odCl7dmFyIGkscj10LmNvb3JkaW5hdGVTeXN0ZW0uZ2V0QmFzZUF4aXMoKSxvPXIuZ2V0RXh0ZW50KCk7aWYoImNhdGVnb3J5Ij09PXIudHlwZSlpPXIuZ2V0QmFuZFdpZHRoKCk7ZWxzZSBpZigidmFsdWUiPT09ci50eXBlfHwidGltZSI9PT1yLnR5cGUpe3ZhciBhPXIuZGltKyJfIityLmluZGV4LHM9ZVthXSxsPU1hdGguYWJzKG9bMV0tb1swXSksdT1yLnNjYWxlLmdldEV4dGVudCgpLGg9TWF0aC5hYnModVsxXS11WzBdKTtpPXM/bC9oKnM6bH1lbHNle3ZhciBjPXQuZ2V0RGF0YSgpO2k9TWF0aC5hYnMob1sxXS1vWzBdKS9jLmNvdW50KCl9dmFyIHA9JHIodC5nZXQoImJhcldpZHRoIiksaSksZD0kcih0LmdldCgiYmFyTWF4V2lkdGgiKSxpKSxmPSRyKHQuZ2V0KCJiYXJNaW5XaWR0aCIpfHwocXgodCk/LjU6MSksaSksZz10LmdldCgiYmFyR2FwIikseT10LmdldCgiYmFyQ2F0ZWdvcnlHYXAiKTtuLnB1c2goe2JhbmRXaWR0aDppLGJhcldpZHRoOnAsYmFyTWF4V2lkdGg6ZCxiYXJNaW5XaWR0aDpmLGJhckdhcDpnLGJhckNhdGVnb3J5R2FwOnksYXhpc0tleTpXeChyKSxzdGFja0lkOkd4KHQpfSl9KSksWHgobil9ZnVuY3Rpb24gWHgodCl7dmFyIGU9e307RSh0LChmdW5jdGlvbih0LG4pe3ZhciBpPXQuYXhpc0tleSxyPXQuYmFuZFdpZHRoLG89ZVtpXXx8e2JhbmRXaWR0aDpyLHJlbWFpbmVkV2lkdGg6cixhdXRvV2lkdGhDb3VudDowLGNhdGVnb3J5R2FwOm51bGwsZ2FwOiIyMCUiLHN0YWNrczp7fX0sYT1vLnN0YWNrcztlW2ldPW87dmFyIHM9dC5zdGFja0lkO2Fbc118fG8uYXV0b1dpZHRoQ291bnQrKyxhW3NdPWFbc118fHt3aWR0aDowLG1heFdpZHRoOjB9O3ZhciBsPXQuYmFyV2lkdGg7bCYmIWFbc10ud2lkdGgmJihhW3NdLndpZHRoPWwsbD1NYXRoLm1pbihvLnJlbWFpbmVkV2lkdGgsbCksby5yZW1haW5lZFdpZHRoLT1sKTt2YXIgdT10LmJhck1heFdpZHRoO3UmJihhW3NdLm1heFdpZHRoPXUpO3ZhciBoPXQuYmFyTWluV2lkdGg7aCYmKGFbc10ubWluV2lkdGg9aCk7dmFyIGM9dC5iYXJHYXA7bnVsbCE9YyYmKG8uZ2FwPWMpO3ZhciBwPXQuYmFyQ2F0ZWdvcnlHYXA7bnVsbCE9cCYmKG8uY2F0ZWdvcnlHYXA9cCl9KSk7dmFyIG49e307cmV0dXJuIEUoZSwoZnVuY3Rpb24odCxlKXtuW2VdPXt9O3ZhciBpPXQuc3RhY2tzLHI9dC5iYW5kV2lkdGgsbz10LmNhdGVnb3J5R2FwO2lmKG51bGw9PW8pe3ZhciBhPUcoaSkubGVuZ3RoO289TWF0aC5tYXgoMzUtNCphLDE1KSsiJSJ9dmFyIHM9JHIobyxyKSxsPSRyKHQuZ2FwLDEpLHU9dC5yZW1haW5lZFdpZHRoLGg9dC5hdXRvV2lkdGhDb3VudCxjPSh1LXMpLyhoKyhoLTEpKmwpO2M9TWF0aC5tYXgoYywwKSxFKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQubWF4V2lkdGgsbj10Lm1pbldpZHRoO2lmKHQud2lkdGgpe2k9dC53aWR0aDtlJiYoaT1NYXRoLm1pbihpLGUpKSxuJiYoaT1NYXRoLm1heChpLG4pKSx0LndpZHRoPWksdS09aStsKmksaC0tfWVsc2V7dmFyIGk9YztlJiZlPGkmJihpPU1hdGgubWluKGUsdSkpLG4mJm4+aSYmKGk9biksaSE9PWMmJih0LndpZHRoPWksdS09aStsKmksaC0tKX19KSksYz0odS1zKS8oaCsoaC0xKSpsKSxjPU1hdGgubWF4KGMsMCk7dmFyIHAsZD0wO0UoaSwoZnVuY3Rpb24odCxlKXt0LndpZHRofHwodC53aWR0aD1jKSxwPXQsZCs9dC53aWR0aCooMStsKX0pKSxwJiYoZC09cC53aWR0aCpsKTt2YXIgZj0tZC8yO0UoaSwoZnVuY3Rpb24odCxpKXtuW2VdW2ldPW5bZV1baV18fHtiYW5kV2lkdGg6cixvZmZzZXQ6Zix3aWR0aDp0LndpZHRofSxmKz10LndpZHRoKigxK2wpfSkpfSkpLG59ZnVuY3Rpb24gVXgodCxlKXt2YXIgbj1IeCh0LGUpLGk9WXgobik7RShuLChmdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKSxuPXQuY29vcmRpbmF0ZVN5c3RlbS5nZXRCYXNlQXhpcygpLHI9R3godCksbz1pW1d4KG4pXVtyXSxhPW8ub2Zmc2V0LHM9by53aWR0aDtlLnNldExheW91dCh7YmFuZFdpZHRoOm8uYmFuZFdpZHRoLG9mZnNldDphLHNpemU6c30pfSkpfWZ1bmN0aW9uIFp4KHQpe3JldHVybntzZXJpZXNUeXBlOnQscGxhbjprZygpLHJlc2V0OmZ1bmN0aW9uKHQpe2lmKGp4KHQpKXt2YXIgZT10LmdldERhdGEoKSxuPXQuY29vcmRpbmF0ZVN5c3RlbSxpPW4uZ2V0QmFzZUF4aXMoKSxyPW4uZ2V0T3RoZXJBeGlzKGkpLG89ZS5nZXREaW1lbnNpb25JbmRleChlLm1hcERpbWVuc2lvbihyLmRpbSkpLGE9ZS5nZXREaW1lbnNpb25JbmRleChlLm1hcERpbWVuc2lvbihpLmRpbSkpLHM9dC5nZXQoInNob3dCYWNrZ3JvdW5kIiwhMCksbD1lLm1hcERpbWVuc2lvbihyLmRpbSksdT1lLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tSZXN1bHREaW1lbnNpb24iKSxoPW14KGUsbCkmJiEhZS5nZXRDYWxjdWxhdGlvbkluZm8oInN0YWNrZWRPblNlcmllcyIpLGM9ci5pc0hvcml6b250YWwoKSxwPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5tb2RlbC5nZXQoInN0YXJ0VmFsdWUiKTtufHwobj0wKTtyZXR1cm4gZS50b0dsb2JhbENvb3JkKGUuZGF0YVRvQ29vcmQoImxvZyI9PT1lLnR5cGU/bj4wP246MTpuKSl9KDAsciksZD1xeCh0KSxmPXQuZ2V0KCJiYXJNaW5IZWlnaHQiKXx8MCxnPXUmJmUuZ2V0RGltZW5zaW9uSW5kZXgodSkseT1lLmdldExheW91dCgic2l6ZSIpLHY9ZS5nZXRMYXlvdXQoIm9mZnNldCIpO3JldHVybntwcm9ncmVzczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxyPXQuY291bnQsbD1kJiZCeCgzKnIpLHU9ZCYmcyYmQngoMypyKSxtPWQmJkJ4KHIpLHg9bi5tYXN0ZXIuZ2V0UmVjdCgpLF89Yz94LndpZHRoOnguaGVpZ2h0LGI9ZS5nZXRTdG9yZSgpLHc9MDtudWxsIT0oaT10Lm5leHQoKSk7KXt2YXIgUz1iLmdldChoP2c6byxpKSxNPWIuZ2V0KGEsaSksST1wLFQ9dm9pZCAwO2gmJihUPStTLWIuZ2V0KG8saSkpO3ZhciBDPXZvaWQgMCxEPXZvaWQgMCxBPXZvaWQgMCxrPXZvaWQgMDtpZihjKXt2YXIgTD1uLmRhdGFUb1BvaW50KFtTLE1dKTtpZihoKUk9bi5kYXRhVG9Qb2ludChbVCxNXSlbMF07Qz1JLEQ9TFsxXSt2LEE9TFswXS1JLGs9eSxNYXRoLmFicyhBKTxmJiYoQT0oQTwwPy0xOjEpKmYpfWVsc2V7TD1uLmRhdGFUb1BvaW50KFtNLFNdKTtpZihoKUk9bi5kYXRhVG9Qb2ludChbTSxUXSlbMV07Qz1MWzBdK3YsRD1JLEE9eSxrPUxbMV0tSSxNYXRoLmFicyhrKTxmJiYoaz0oazw9MD8tMToxKSpmKX1kPyhsW3ddPUMsbFt3KzFdPUQsbFt3KzJdPWM/QTprLHUmJih1W3ddPWM/eC54OkMsdVt3KzFdPWM/RDp4LnksdVt3KzJdPV8pLG1baV09aSk6ZS5zZXRJdGVtTGF5b3V0KGkse3g6Qyx5OkQsd2lkdGg6QSxoZWlnaHQ6a30pLHcrPTN9ZCYmZS5zZXRMYXlvdXQoe2xhcmdlUG9pbnRzOmwsbGFyZ2VEYXRhSW5kaWNlczptLGxhcmdlQmFja2dyb3VuZFBvaW50czp1LHZhbHVlQXhpc0hvcml6b250YWw6Y30pfX19fX19ZnVuY3Rpb24gangodCl7cmV0dXJuIHQuY29vcmRpbmF0ZVN5c3RlbSYmImNhcnRlc2lhbjJkIj09PXQuY29vcmRpbmF0ZVN5c3RlbS50eXBlfWZ1bmN0aW9uIHF4KHQpe3JldHVybiB0LnBpcGVsaW5lQ29udGV4dCYmdC5waXBlbGluZUNvbnRleHQubGFyZ2V9dmFyIEt4PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4udHlwZT0idGltZSIsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0U2V0dGluZygidXNlVVRDIik7cmV0dXJuIEpjKHQudmFsdWUsVWNbZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UieWVhciI6Y2FzZSJtb250aCI6cmV0dXJuImRheSI7Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuIm1pbGxpc2Vjb25kIjtkZWZhdWx0OnJldHVybiJzZWNvbmQifX0oS2ModGhpcy5fbWluTGV2ZWxVbml0KSldfHxVYy5zZWNvbmQsZSx0aGlzLmdldFNldHRpbmcoImxvY2FsZSIpKX0sZS5wcm90b3R5cGUuZ2V0Rm9ybWF0dGVkTGFiZWw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuZ2V0U2V0dGluZygidXNlVVRDIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89bnVsbDtpZihVKG4pKW89bjtlbHNlIGlmKFgobikpbz1uKHQudmFsdWUsZSx7bGV2ZWw6dC5sZXZlbH0pO2Vsc2V7dmFyIGE9QSh7fSxZYyk7aWYodC5sZXZlbD4wKWZvcih2YXIgcz0wO3M8WmMubGVuZ3RoOysrcylhW1pjW3NdXT0ie3ByaW1hcnl8IithW1pjW3NdXSsifSI7dmFyIGw9bj8hMT09PW4uaW5oZXJpdD9uOmsobixhKTphLHU9UWModC52YWx1ZSxyKTtpZihsW3VdKW89bFt1XTtlbHNlIGlmKGwuaW5oZXJpdCl7Zm9yKHM9amMuaW5kZXhPZih1KS0xO3M+PTA7LS1zKWlmKGxbdV0pe289bFt1XTticmVha31vPW98fGEubm9uZX1pZihZKG8pKXt2YXIgaD1udWxsPT10LmxldmVsPzA6dC5sZXZlbD49MD90LmxldmVsOm8ubGVuZ3RoK3QubGV2ZWw7bz1vW2g9TWF0aC5taW4oaCxvLmxlbmd0aC0xKV19fXJldHVybiBKYyhuZXcgRGF0ZSh0LnZhbHVlKSxvLHIsaSl9KHQsZSxuLHRoaXMuZ2V0U2V0dGluZygibG9jYWxlIiksaSl9LGUucHJvdG90eXBlLmdldFRpY2tzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW50ZXJ2YWwsZT10aGlzLl9leHRlbnQsbj1bXTtpZighdClyZXR1cm4gbjtuLnB1c2goe3ZhbHVlOmVbMF0sbGV2ZWw6MH0pO3ZhciBpPXRoaXMuZ2V0U2V0dGluZygidXNlVVRDIikscj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj0xZTQsbz1qYyxhPTA7ZnVuY3Rpb24gcyh0LGUsbixyLG8sYSxzKXtmb3IodmFyIGw9bmV3IERhdGUoZSksdT1lLGg9bFtyXSgpO3U8biYmdTw9aVsxXTspcy5wdXNoKHt2YWx1ZTp1fSksaCs9dCxsW29dKGgpLHU9bC5nZXRUaW1lKCk7cy5wdXNoKHt2YWx1ZTp1LG5vdEFkZDohMH0pfWZ1bmN0aW9uIGwodCxyLG8pe3ZhciBhPVtdLGw9IXIubGVuZ3RoO2lmKCFmdW5jdGlvbih0LGUsbixpKXt2YXIgcj11byhlKSxvPXVvKG4pLGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRwKHIsdCxpKT09PXRwKG8sdCxpKX0scz1mdW5jdGlvbigpe3JldHVybiBhKCJ5ZWFyIil9LGw9ZnVuY3Rpb24oKXtyZXR1cm4gcygpJiZhKCJtb250aCIpfSx1PWZ1bmN0aW9uKCl7cmV0dXJuIGwoKSYmYSgiZGF5Iil9LGg9ZnVuY3Rpb24oKXtyZXR1cm4gdSgpJiZhKCJob3VyIil9LGM9ZnVuY3Rpb24oKXtyZXR1cm4gaCgpJiZhKCJtaW51dGUiKX0scD1mdW5jdGlvbigpe3JldHVybiBjKCkmJmEoInNlY29uZCIpfSxkPWZ1bmN0aW9uKCl7cmV0dXJuIHAoKSYmYSgibWlsbGlzZWNvbmQiKX07c3dpdGNoKHQpe2Nhc2UieWVhciI6cmV0dXJuIHMoKTtjYXNlIm1vbnRoIjpyZXR1cm4gbCgpO2Nhc2UiZGF5IjpyZXR1cm4gdSgpO2Nhc2UiaG91ciI6cmV0dXJuIGgoKTtjYXNlIm1pbnV0ZSI6cmV0dXJuIGMoKTtjYXNlInNlY29uZCI6cmV0dXJuIHAoKTtjYXNlIm1pbGxpc2Vjb25kIjpyZXR1cm4gZCgpfX0oS2ModCksaVswXSxpWzFdLG4pKXtsJiYocj1be3ZhbHVlOmlfKG5ldyBEYXRlKGlbMF0pLHQsbil9LHt2YWx1ZTppWzFdfV0pO2Zvcih2YXIgdT0wO3U8ci5sZW5ndGgtMTt1Kyspe3ZhciBoPXJbdV0udmFsdWUsYz1yW3UrMV0udmFsdWU7aWYoaCE9PWMpe3ZhciBwPXZvaWQgMCxkPXZvaWQgMCxmPXZvaWQgMCxnPSExO3N3aXRjaCh0KXtjYXNlInllYXIiOnA9TWF0aC5tYXgoMSxNYXRoLnJvdW5kKGUvV2MvMzY1KSksZD1lcChuKSxmPWxwKG4pO2JyZWFrO2Nhc2UiaGFsZi15ZWFyIjpjYXNlInF1YXJ0ZXIiOmNhc2UibW9udGgiOnA9UXgoZSksZD1ucChuKSxmPXVwKG4pO2JyZWFrO2Nhc2Uid2VlayI6Y2FzZSJoYWxmLXdlZWsiOmNhc2UiZGF5IjpwPUp4KGUpLGQ9aXAobiksZj1ocChuKSxnPSEwO2JyZWFrO2Nhc2UiaGFsZi1kYXkiOmNhc2UicXVhcnRlci1kYXkiOmNhc2UiaG91ciI6cD10XyhlKSxkPXJwKG4pLGY9Y3Aobik7YnJlYWs7Y2FzZSJtaW51dGUiOnA9ZV8oZSwhMCksZD1vcChuKSxmPXBwKG4pO2JyZWFrO2Nhc2Uic2Vjb25kIjpwPWVfKGUsITEpLGQ9YXAobiksZj1kcChuKTticmVhaztjYXNlIm1pbGxpc2Vjb25kIjpwPW5fKGUpLGQ9c3AobiksZj1mcChuKX1zKHAsaCxjLGQsZixnLGEpLCJ5ZWFyIj09PXQmJm8ubGVuZ3RoPjEmJjA9PT11JiZvLnVuc2hpZnQoe3ZhbHVlOm9bMF0udmFsdWUtcH0pfX1mb3IodT0wO3U8YS5sZW5ndGg7dSsrKW8ucHVzaChhW3VdKTtyZXR1cm4gYX19Zm9yKHZhciB1PVtdLGg9W10sYz0wLHA9MCxkPTA7ZDxvLmxlbmd0aCYmYSsrPHI7KytkKXt2YXIgZj1LYyhvW2RdKTtpZigkYyhvW2RdKSlpZihsKG9bZF0sdVt1Lmxlbmd0aC0xXXx8W10saCksZiE9PShvW2QrMV0/S2Mob1tkKzFdKTpudWxsKSl7aWYoaC5sZW5ndGgpe3A9YyxoLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudmFsdWUtZS52YWx1ZX0pKTtmb3IodmFyIGc9W10seT0wO3k8aC5sZW5ndGg7Kyt5KXt2YXIgdj1oW3ldLnZhbHVlOzAhPT15JiZoW3ktMV0udmFsdWU9PT12fHwoZy5wdXNoKGhbeV0pLHY+PWlbMF0mJnY8PWlbMV0mJmMrKyl9dmFyIG09KGlbMV0taVswXSkvZTtpZihjPjEuNSptJiZwPm0vMS41KWJyZWFrO2lmKHUucHVzaChnKSxjPm18fHQ9PT1vW2RdKWJyZWFrfWg9W119fTA7dmFyIHg9Qih6KHUsKGZ1bmN0aW9uKHQpe3JldHVybiBCKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlPj1pWzBdJiZ0LnZhbHVlPD1pWzFdJiYhdC5ub3RBZGR9KSl9KSksKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aD4wfSkpLF89W10sYj14Lmxlbmd0aC0xO2ZvcihkPTA7ZDx4Lmxlbmd0aDsrK2QpZm9yKHZhciB3PXhbZF0sUz0wO1M8dy5sZW5ndGg7KytTKV8ucHVzaCh7dmFsdWU6d1tTXS52YWx1ZSxsZXZlbDpiLWR9KTtfLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudmFsdWUtZS52YWx1ZX0pKTt2YXIgTT1bXTtmb3IoZD0wO2Q8Xy5sZW5ndGg7KytkKTAhPT1kJiZfW2RdLnZhbHVlPT09X1tkLTFdLnZhbHVlfHxNLnB1c2goX1tkXSk7cmV0dXJuIE19KHRoaXMuX21pbkxldmVsVW5pdCx0aGlzLl9hcHByb3hJbnRlcnZhbCxpLGUpO3JldHVybihuPW4uY29uY2F0KHIpKS5wdXNoKHt2YWx1ZTplWzFdLGxldmVsOjB9KSxufSxlLnByb3RvdHlwZS5jYWxjTmljZUV4dGVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQ7aWYoZVswXT09PWVbMV0mJihlWzBdLT1XYyxlWzFdKz1XYyksZVsxXT09PS0xLzAmJmVbMF09PT0xLzApe3ZhciBuPW5ldyBEYXRlO2VbMV09K25ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCkpLGVbMF09ZVsxXS1XY310aGlzLmNhbGNOaWNlVGlja3ModC5zcGxpdE51bWJlcix0Lm1pbkludGVydmFsLHQubWF4SW50ZXJ2YWwpfSxlLnByb3RvdHlwZS5jYWxjTmljZVRpY2tzPWZ1bmN0aW9uKHQsZSxuKXt0PXR8fDEwO3ZhciBpPXRoaXMuX2V4dGVudCxyPWlbMV0taVswXTt0aGlzLl9hcHByb3hJbnRlcnZhbD1yL3QsbnVsbCE9ZSYmdGhpcy5fYXBwcm94SW50ZXJ2YWw8ZSYmKHRoaXMuX2FwcHJveEludGVydmFsPWUpLG51bGwhPW4mJnRoaXMuX2FwcHJveEludGVydmFsPm4mJih0aGlzLl9hcHByb3hJbnRlcnZhbD1uKTt2YXIgbz0keC5sZW5ndGgsYT1NYXRoLm1pbihmdW5jdGlvbih0LGUsbixpKXtmb3IoO248aTspe3ZhciByPW4raT4+PjE7dFtyXVsxXTxlP249cisxOmk9cn1yZXR1cm4gbn0oJHgsdGhpcy5fYXBwcm94SW50ZXJ2YWwsMCxvKSxvLTEpO3RoaXMuX2ludGVydmFsPSR4W2FdWzFdLHRoaXMuX21pbkxldmVsVW5pdD0keFtNYXRoLm1heChhLTEsMCldWzBdfSxlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gaih0KT90Oit1byh0KX0sZS5wcm90b3R5cGUuY29udGFpbj1mdW5jdGlvbih0KXtyZXR1cm4gTHgodGhpcy5wYXJzZSh0KSx0aGlzLl9leHRlbnQpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFB4KHRoaXMucGFyc2UodCksdGhpcy5fZXh0ZW50KX0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIE94KHQsdGhpcy5fZXh0ZW50KX0sZS50eXBlPSJ0aW1lIixlfShFeCksJHg9W1sic2Vjb25kIixCY10sWyJtaW51dGUiLEZjXSxbImhvdXIiLEdjXSxbInF1YXJ0ZXItZGF5IiwyMTZlNV0sWyJoYWxmLWRheSIsNDMyZTVdLFsiZGF5IiwxMDM2OGU0XSxbImhhbGYtd2VlayIsMzAyNGU1XSxbIndlZWsiLDYwNDhlNV0sWyJtb250aCIsMjY3ODRlNV0sWyJxdWFydGVyIiw4MjA4ZTZdLFsiaGFsZi15ZWFyIixIYy8yXSxbInllYXIiLEhjXV07ZnVuY3Rpb24gSngodCxlKXtyZXR1cm4odC89V2MpPjE2PzE2OnQ+Ny41Pzc6dD4zLjU/NDp0PjEuNT8yOjF9ZnVuY3Rpb24gUXgodCl7cmV0dXJuKHQvPTI1OTJlNik+Nj82OnQ+Mz8zOnQ+Mj8yOjF9ZnVuY3Rpb24gdF8odCl7cmV0dXJuKHQvPUdjKT4xMj8xMjp0PjY/Njp0PjMuNT80OnQ+Mj8yOjF9ZnVuY3Rpb24gZV8odCxlKXtyZXR1cm4odC89ZT9GYzpCYyk+MzA/MzA6dD4yMD8yMDp0PjE1PzE1OnQ+MTA/MTA6dD41PzU6dD4yPzI6MX1mdW5jdGlvbiBuXyh0KXtyZXR1cm4gcG8odCwhMCl9ZnVuY3Rpb24gaV8odCxlLG4pe3ZhciBpPW5ldyBEYXRlKHQpO3N3aXRjaChLYyhlKSl7Y2FzZSJ5ZWFyIjpjYXNlIm1vbnRoIjppW3VwKG4pXSgwKTtjYXNlImRheSI6aVtocChuKV0oMSk7Y2FzZSJob3VyIjppW2NwKG4pXSgwKTtjYXNlIm1pbnV0ZSI6aVtwcChuKV0oMCk7Y2FzZSJzZWNvbmQiOmlbZHAobildKDApLGlbZnAobildKDApfXJldHVybiBpLmdldFRpbWUoKX1ieC5yZWdpc3RlckNsYXNzKEt4KTt2YXIgcl89YngucHJvdG90eXBlLG9fPUV4LnByb3RvdHlwZSxhXz1KcixzXz1NYXRoLmZsb29yLGxfPU1hdGguY2VpbCx1Xz1NYXRoLnBvdyxoXz1NYXRoLmxvZyxjXz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLnR5cGU9ImxvZyIsZS5iYXNlPTEwLGUuX29yaWdpbmFsU2NhbGU9bmV3IEV4LGUuX2ludGVydmFsPTAsZX1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldFRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29yaWdpbmFsU2NhbGUsbj10aGlzLl9leHRlbnQsaT1lLmdldEV4dGVudCgpO3JldHVybiB6KG9fLmdldFRpY2tzLmNhbGwodGhpcyx0KSwoZnVuY3Rpb24odCl7dmFyIGU9dC52YWx1ZSxyPUpyKHVfKHRoaXMuYmFzZSxlKSk7cmV0dXJuIHI9ZT09PW5bMF0mJnRoaXMuX2ZpeE1pbj9kXyhyLGlbMF0pOnIse3ZhbHVlOnI9ZT09PW5bMV0mJnRoaXMuX2ZpeE1heD9kXyhyLGlbMV0pOnJ9fSksdGhpcyl9LGUucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0LGUpe3ZhciBuPWhfKHRoaXMuYmFzZSk7dD1oXyhNYXRoLm1heCgwLHQpKS9uLGU9aF8oTWF0aC5tYXgoMCxlKSkvbixvXy5zZXRFeHRlbnQuY2FsbCh0aGlzLHQsZSl9LGUucHJvdG90eXBlLmdldEV4dGVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYmFzZSxlPXJfLmdldEV4dGVudC5jYWxsKHRoaXMpO2VbMF09dV8odCxlWzBdKSxlWzFdPXVfKHQsZVsxXSk7dmFyIG49dGhpcy5fb3JpZ2luYWxTY2FsZS5nZXRFeHRlbnQoKTtyZXR1cm4gdGhpcy5fZml4TWluJiYoZVswXT1kXyhlWzBdLG5bMF0pKSx0aGlzLl9maXhNYXgmJihlWzFdPWRfKGVbMV0sblsxXSkpLGV9LGUucHJvdG90eXBlLnVuaW9uRXh0ZW50PWZ1bmN0aW9uKHQpe3RoaXMuX29yaWdpbmFsU2NhbGUudW5pb25FeHRlbnQodCk7dmFyIGU9dGhpcy5iYXNlO3RbMF09aF8odFswXSkvaF8oZSksdFsxXT1oXyh0WzFdKS9oXyhlKSxyXy51bmlvbkV4dGVudC5jYWxsKHRoaXMsdCl9LGUucHJvdG90eXBlLnVuaW9uRXh0ZW50RnJvbURhdGE9ZnVuY3Rpb24odCxlKXt0aGlzLnVuaW9uRXh0ZW50KHQuZ2V0QXBwcm94aW1hdGVFeHRlbnQoZSkpfSxlLnByb3RvdHlwZS5jYWxjTmljZVRpY2tzPWZ1bmN0aW9uKHQpe3Q9dHx8MTA7dmFyIGU9dGhpcy5fZXh0ZW50LG49ZVsxXS1lWzBdO2lmKCEobj09PTEvMHx8bjw9MCkpe3ZhciBpPWhvKG4pO2Zvcih0L24qaTw9LjUmJihpKj0xMCk7IWlzTmFOKGkpJiZNYXRoLmFicyhpKTwxJiZNYXRoLmFicyhpKT4wOylpKj0xMDt2YXIgcj1bSnIobF8oZVswXS9pKSppKSxKcihzXyhlWzFdL2kpKmkpXTt0aGlzLl9pbnRlcnZhbD1pLHRoaXMuX25pY2VFeHRlbnQ9cn19LGUucHJvdG90eXBlLmNhbGNOaWNlRXh0ZW50PWZ1bmN0aW9uKHQpe29fLmNhbGNOaWNlRXh0ZW50LmNhbGwodGhpcyx0KSx0aGlzLl9maXhNaW49dC5maXhNaW4sdGhpcy5fZml4TWF4PXQuZml4TWF4fSxlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZS5wcm90b3R5cGUuY29udGFpbj1mdW5jdGlvbih0KXtyZXR1cm4gTHgodD1oXyh0KS9oXyh0aGlzLmJhc2UpLHRoaXMuX2V4dGVudCl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gUHgodD1oXyh0KS9oXyh0aGlzLmJhc2UpLHRoaXMuX2V4dGVudCl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0PU94KHQsdGhpcy5fZXh0ZW50KSx1Xyh0aGlzLmJhc2UsdCl9LGUudHlwZT0ibG9nIixlfShieCkscF89Y18ucHJvdG90eXBlO2Z1bmN0aW9uIGRfKHQsZSl7cmV0dXJuIGFfKHQsdG8oZSkpfXBfLmdldE1pbm9yVGlja3M9b18uZ2V0TWlub3JUaWNrcyxwXy5nZXRMYWJlbD1vXy5nZXRMYWJlbCxieC5yZWdpc3RlckNsYXNzKGNfKTt2YXIgZl89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLl9wcmVwYXJlUGFyYW1zKHQsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuX3ByZXBhcmVQYXJhbXM9ZnVuY3Rpb24odCxlLG4pe25bMV08blswXSYmKG49W05hTixOYU5dKSx0aGlzLl9kYXRhTWluPW5bMF0sdGhpcy5fZGF0YU1heD1uWzFdO3ZhciBpPXRoaXMuX2lzT3JkaW5hbD0ib3JkaW5hbCI9PT10LnR5cGU7dGhpcy5fbmVlZENyb3NzWmVybz0iaW50ZXJ2YWwiPT09dC50eXBlJiZlLmdldE5lZWRDcm9zc1plcm8mJmUuZ2V0TmVlZENyb3NzWmVybygpO3ZhciByPWUuZ2V0KCJtaW4iLCEwKTtudWxsPT1yJiYocj1lLmdldCgic3RhcnRWYWx1ZSIsITApKTt2YXIgbz10aGlzLl9tb2RlbE1pblJhdz1yO1gobyk/dGhpcy5fbW9kZWxNaW5OdW09bV8odCxvKHttaW46blswXSxtYXg6blsxXX0pKToiZGF0YU1pbiIhPT1vJiYodGhpcy5fbW9kZWxNaW5OdW09bV8odCxvKSk7dmFyIGE9dGhpcy5fbW9kZWxNYXhSYXc9ZS5nZXQoIm1heCIsITApO2lmKFgoYSk/dGhpcy5fbW9kZWxNYXhOdW09bV8odCxhKHttaW46blswXSxtYXg6blsxXX0pKToiZGF0YU1heCIhPT1hJiYodGhpcy5fbW9kZWxNYXhOdW09bV8odCxhKSksaSl0aGlzLl9heGlzRGF0YUxlbj1lLmdldENhdGVnb3JpZXMoKS5sZW5ndGg7ZWxzZXt2YXIgcz1lLmdldCgiYm91bmRhcnlHYXAiKSxsPVkocyk/czpbc3x8MCxzfHwwXTsiYm9vbGVhbiI9PXR5cGVvZiBsWzBdfHwiYm9vbGVhbiI9PXR5cGVvZiBsWzFdP3RoaXMuX2JvdW5kYXJ5R2FwSW5uZXI9WzAsMF06dGhpcy5fYm91bmRhcnlHYXBJbm5lcj1bQ3IobFswXSwxKSxDcihsWzFdLDEpXX19LHQucHJvdG90eXBlLmNhbGN1bGF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2lzT3JkaW5hbCxlPXRoaXMuX2RhdGFNaW4sbj10aGlzLl9kYXRhTWF4LGk9dGhpcy5fYXhpc0RhdGFMZW4scj10aGlzLl9ib3VuZGFyeUdhcElubmVyLG89dD9udWxsOm4tZXx8TWF0aC5hYnMoZSksYT0iZGF0YU1pbiI9PT10aGlzLl9tb2RlbE1pblJhdz9lOnRoaXMuX21vZGVsTWluTnVtLHM9ImRhdGFNYXgiPT09dGhpcy5fbW9kZWxNYXhSYXc/bjp0aGlzLl9tb2RlbE1heE51bSxsPW51bGwhPWEsdT1udWxsIT1zO251bGw9PWEmJihhPXQ/aT8wOk5hTjplLXJbMF0qbyksbnVsbD09cyYmKHM9dD9pP2ktMTpOYU46bityWzFdKm8pLChudWxsPT1hfHwhaXNGaW5pdGUoYSkpJiYoYT1OYU4pLChudWxsPT1zfHwhaXNGaW5pdGUocykpJiYocz1OYU4pO3ZhciBoPW50KGEpfHxudChzKXx8dCYmIWk7dGhpcy5fbmVlZENyb3NzWmVybyYmKGE+MCYmcz4wJiYhbCYmKGE9MCksYTwwJiZzPDAmJiF1JiYocz0wKSk7dmFyIGM9dGhpcy5fZGV0ZXJtaW5lZE1pbixwPXRoaXMuX2RldGVybWluZWRNYXg7cmV0dXJuIG51bGwhPWMmJihhPWMsbD0hMCksbnVsbCE9cCYmKHM9cCx1PSEwKSx7bWluOmEsbWF4OnMsbWluRml4ZWQ6bCxtYXhGaXhlZDp1LGlzQmxhbms6aH19LHQucHJvdG90eXBlLm1vZGlmeURhdGFNaW5NYXg9ZnVuY3Rpb24odCxlKXt0aGlzW3lfW3RdXT1lfSx0LnByb3RvdHlwZS5zZXREZXRlcm1pbmVkTWluTWF4PWZ1bmN0aW9uKHQsZSl7dmFyIG49Z19bdF07dGhpc1tuXT1lfSx0LnByb3RvdHlwZS5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLmZyb3plbj0hMH0sdH0oKSxnXz17bWluOiJfZGV0ZXJtaW5lZE1pbiIsbWF4OiJfZGV0ZXJtaW5lZE1heCJ9LHlfPXttaW46Il9kYXRhTWluIixtYXg6Il9kYXRhTWF4In07ZnVuY3Rpb24gdl8odCxlLG4pe3ZhciBpPXQucmF3RXh0ZW50SW5mbztyZXR1cm4gaXx8KGk9bmV3IGZfKHQsZSxuKSx0LnJhd0V4dGVudEluZm89aSxpKX1mdW5jdGlvbiBtXyh0LGUpe3JldHVybiBudWxsPT1lP251bGw6bnQoZSk/TmFOOnQucGFyc2UoZSl9ZnVuY3Rpb24geF8odCxlKXt2YXIgbj10LnR5cGUsaT12Xyh0LGUsdC5nZXRFeHRlbnQoKSkuY2FsY3VsYXRlKCk7dC5zZXRCbGFuayhpLmlzQmxhbmspO3ZhciByPWkubWluLG89aS5tYXgsYT1lLmVjTW9kZWw7aWYoYSYmInRpbWUiPT09bil7dmFyIHM9SHgoImJhciIsYSksbD0hMTtpZihFKHMsKGZ1bmN0aW9uKHQpe2w9bHx8dC5nZXRCYXNlQXhpcygpPT09ZS5heGlzfSkpLGwpe3ZhciB1PVl4KHMpLGg9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9bi5heGlzLmdldEV4dGVudCgpLG89clsxXS1yWzBdLGE9ZnVuY3Rpb24odCxlLG4pe2lmKHQmJmUpe3ZhciBpPXRbV3goZSldO3JldHVybiBudWxsIT1pJiZudWxsIT1uP2lbR3gobildOml9fShpLG4uYXhpcyk7aWYodm9pZCAwPT09YSlyZXR1cm57bWluOnQsbWF4OmV9O3ZhciBzPTEvMDtFKGEsKGZ1bmN0aW9uKHQpe3M9TWF0aC5taW4odC5vZmZzZXQscyl9KSk7dmFyIGw9LTEvMDtFKGEsKGZ1bmN0aW9uKHQpe2w9TWF0aC5tYXgodC5vZmZzZXQrdC53aWR0aCxsKX0pKSxzPU1hdGguYWJzKHMpLGw9TWF0aC5hYnMobCk7dmFyIHU9cytsLGg9ZS10LGM9aC8oMS0ocytsKS9vKS1oO3JldHVybiBlKz1jKihsL3UpLHQtPWMqKHMvdSkse21pbjp0LG1heDplfX0ocixvLGUsdSk7cj1oLm1pbixvPWgubWF4fX1yZXR1cm57ZXh0ZW50OltyLG9dLGZpeE1pbjppLm1pbkZpeGVkLGZpeE1heDppLm1heEZpeGVkfX1mdW5jdGlvbiBfXyh0LGUpe3ZhciBuPWUsaT14Xyh0LG4pLHI9aS5leHRlbnQsbz1uLmdldCgic3BsaXROdW1iZXIiKTt0IGluc3RhbmNlb2YgY18mJih0LmJhc2U9bi5nZXQoImxvZ0Jhc2UiKSk7dmFyIGE9dC50eXBlLHM9bi5nZXQoImludGVydmFsIiksbD0iaW50ZXJ2YWwiPT09YXx8InRpbWUiPT09YTt0LnNldEV4dGVudChyWzBdLHJbMV0pLHQuY2FsY05pY2VFeHRlbnQoe3NwbGl0TnVtYmVyOm8sZml4TWluOmkuZml4TWluLGZpeE1heDppLmZpeE1heCxtaW5JbnRlcnZhbDpsP24uZ2V0KCJtaW5JbnRlcnZhbCIpOm51bGwsbWF4SW50ZXJ2YWw6bD9uLmdldCgibWF4SW50ZXJ2YWwiKTpudWxsfSksbnVsbCE9cyYmdC5zZXRJbnRlcnZhbCYmdC5zZXRJbnRlcnZhbChzKX1mdW5jdGlvbiBiXyh0LGUpe2lmKGU9ZXx8dC5nZXQoInR5cGUiKSlzd2l0Y2goZSl7Y2FzZSJjYXRlZ29yeSI6cmV0dXJuIG5ldyBSeCh7b3JkaW5hbE1ldGE6dC5nZXRPcmRpbmFsTWV0YT90LmdldE9yZGluYWxNZXRhKCk6dC5nZXRDYXRlZ29yaWVzKCksZXh0ZW50OlsxLzAsLTEvMF19KTtjYXNlInRpbWUiOnJldHVybiBuZXcgS3goe2xvY2FsZTp0LmVjTW9kZWwuZ2V0TG9jYWxlTW9kZWwoKSx1c2VVVEM6dC5lY01vZGVsLmdldCgidXNlVVRDIil9KTtkZWZhdWx0OnJldHVybiBuZXcoYnguZ2V0Q2xhc3MoZSl8fEV4KX19ZnVuY3Rpb24gd18odCl7dmFyIGUsbixpPXQuZ2V0TGFiZWxNb2RlbCgpLmdldCgiZm9ybWF0dGVyIikscj0iY2F0ZWdvcnkiPT09dC50eXBlP3Quc2NhbGUuZ2V0RXh0ZW50KClbMF06bnVsbDtyZXR1cm4idGltZSI9PT10LnNjYWxlLnR5cGU/KG49aSxmdW5jdGlvbihlLGkpe3JldHVybiB0LnNjYWxlLmdldEZvcm1hdHRlZExhYmVsKGUsaSxuKX0pOlUoaSk/ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPXQuc2NhbGUuZ2V0TGFiZWwobik7cmV0dXJuIGUucmVwbGFjZSgie3ZhbHVlfSIsbnVsbCE9aT9pOiIiKX19KGkpOlgoaSk/KGU9aSxmdW5jdGlvbihuLGkpe3JldHVybiBudWxsIT1yJiYoaT1uLnZhbHVlLXIpLGUoU18odCxuKSxpLG51bGwhPW4ubGV2ZWw/e2xldmVsOm4ubGV2ZWx9Om51bGwpfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2NhbGUuZ2V0TGFiZWwoZSl9fWZ1bmN0aW9uIFNfKHQsZSl7cmV0dXJuImNhdGVnb3J5Ij09PXQudHlwZT90LnNjYWxlLmdldExhYmVsKGUpOmUudmFsdWV9ZnVuY3Rpb24gTV8odCxlKXt2YXIgbj1lKk1hdGguUEkvMTgwLGk9dC53aWR0aCxyPXQuaGVpZ2h0LG89aSpNYXRoLmFicyhNYXRoLmNvcyhuKSkrTWF0aC5hYnMocipNYXRoLnNpbihuKSksYT1pKk1hdGguYWJzKE1hdGguc2luKG4pKStNYXRoLmFicyhyKk1hdGguY29zKG4pKTtyZXR1cm4gbmV3IHplKHQueCx0LnksbyxhKX1mdW5jdGlvbiBJXyh0KXt2YXIgZT10LmdldCgiaW50ZXJ2YWwiKTtyZXR1cm4gbnVsbD09ZT8iYXV0byI6ZX1mdW5jdGlvbiBUXyh0KXtyZXR1cm4iY2F0ZWdvcnkiPT09dC50eXBlJiYwPT09SV8odC5nZXRMYWJlbE1vZGVsKCkpfWZ1bmN0aW9uIENfKHQsZSl7dmFyIG49e307cmV0dXJuIEUodC5tYXBEaW1lbnNpb25zQWxsKGUpLChmdW5jdGlvbihlKXtuW3h4KHQsZSldPSEwfSkpLEcobil9dmFyIERfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuZ2V0TmVlZENyb3NzWmVybz1mdW5jdGlvbigpe3JldHVybiF0aGlzLm9wdGlvbi5zY2FsZX0sdC5wcm90b3R5cGUuZ2V0Q29vcmRTeXNNb2RlbD1mdW5jdGlvbigpe30sdH0oKTt2YXIgQV89e2lzRGltZW5zaW9uU3RhY2tlZDpteCxlbmFibGVEYXRhU3RhY2s6dngsZ2V0U3RhY2tlZERpbWVuc2lvbjp4eH07dmFyIGtfPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUxpc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIF94KG51bGwsdCl9LGdldExheW91dFJlY3Q6a3AsZGF0YVN0YWNrOkFfLGNyZWF0ZVNjYWxlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZTtlIGluc3RhbmNlb2YgQ2N8fChuPW5ldyBDYyhlKSk7dmFyIGk9Yl8obik7cmV0dXJuIGkuc2V0RXh0ZW50KHRbMF0sdFsxXSksX18oaSxuKSxpfSxtaXhpbkF4aXNNb2RlbENvbW1vbk1ldGhvZHM6ZnVuY3Rpb24odCl7Uih0LERfKX0sZ2V0RUNEYXRhOnJsLGNyZWF0ZVRleHRTdHlsZTpmdW5jdGlvbih0LGUpe3JldHVybiBvYyh0LG51bGwsbnVsbCwibm9ybWFsIiE9PShlPWV8fHt9KS5zdGF0ZSl9LGNyZWF0ZURpbWVuc2lvbnM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcHgodCxlKS5kaW1lbnNpb25zfSxjcmVhdGVTeW1ib2w6WHksZW5hYmxlSG92ZXJFbXBoYXNpczpVbH0pO2Z1bmN0aW9uIExfKHQsZSl7cmV0dXJuIE1hdGguYWJzKHQtZSk8MWUtOH1mdW5jdGlvbiBQXyh0LGUsbil7dmFyIGk9MCxyPXRbMF07aWYoIXIpcmV0dXJuITE7Zm9yKHZhciBvPTE7bzx0Lmxlbmd0aDtvKyspe3ZhciBhPXRbb107aSs9bXMoclswXSxyWzFdLGFbMF0sYVsxXSxlLG4pLHI9YX12YXIgcz10WzBdO3JldHVybiBMXyhyWzBdLHNbMF0pJiZMXyhyWzFdLHNbMV0pfHwoaSs9bXMoclswXSxyWzFdLHNbMF0sc1sxXSxlLG4pKSwwIT09aX12YXIgT189W107ZnVuY3Rpb24gUl8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylXdCh0W25dLHRbbl0sZSl9ZnVuY3Rpb24gTl8odCxlLG4saSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPXRbcl07aSYmKG89aS5wcm9qZWN0KG8pKSxvJiZpc0Zpbml0ZShvWzBdKSYmaXNGaW5pdGUob1sxXSkmJihIdChlLGUsbyksWXQobixuLG8pKX19dmFyIEVfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLm5hbWU9dH1yZXR1cm4gdC5wcm90b3R5cGUuc2V0Q2VudGVyPWZ1bmN0aW9uKHQpe3RoaXMuX2NlbnRlcj10fSx0LnByb3RvdHlwZS5nZXRDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jZW50ZXI7cmV0dXJuIHR8fCh0PXRoaXMuX2NlbnRlcj10aGlzLmNhbGNDZW50ZXIoKSksdH0sdH0oKSx6Xz1mdW5jdGlvbih0LGUpe3RoaXMudHlwZT0icG9seWdvbiIsdGhpcy5leHRlcmlvcj10LHRoaXMuaW50ZXJpb3JzPWV9LFZfPWZ1bmN0aW9uKHQpe3RoaXMudHlwZT0ibGluZXN0cmluZyIsdGhpcy5wb2ludHM9dH0sQl89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4saSl7dmFyIHI9dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIHIudHlwZT0iZ2VvSlNPTiIsci5nZW9tZXRyaWVzPW4sci5fY2VudGVyPWkmJltpWzBdLGlbMV1dLHJ9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5jYWxjQ2VudGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9dGhpcy5nZW9tZXRyaWVzLG49MCxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciByPWVbaV0sbz1yLmV4dGVyaW9yLGE9byYmby5sZW5ndGg7YT5uJiYodD1yLG49YSl9aWYodClyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj0wLGk9MCxyPXQubGVuZ3RoLG89dFtyLTFdWzBdLGE9dFtyLTFdWzFdLHM9MDtzPHI7cysrKXt2YXIgbD10W3NdWzBdLHU9dFtzXVsxXSxoPW8qdS1sKmE7ZSs9aCxuKz0obytsKSpoLGkrPShhK3UpKmgsbz1sLGE9dX1yZXR1cm4gZT9bbi9lLzMsaS9lLzMsZV06W3RbMF1bMF18fDAsdFswXVsxXXx8MF19KHQuZXh0ZXJpb3IpO3ZhciBzPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuW3MueCtzLndpZHRoLzIscy55K3MuaGVpZ2h0LzJdfSxlLnByb3RvdHlwZS5nZXRCb3VuZGluZ1JlY3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVjdDtpZihlJiYhdClyZXR1cm4gZTt2YXIgbj1bMS8wLDEvMF0saT1bLTEvMCwtMS8wXTtyZXR1cm4gRSh0aGlzLmdlb21ldHJpZXMsKGZ1bmN0aW9uKGUpeyJwb2x5Z29uIj09PWUudHlwZT9OXyhlLmV4dGVyaW9yLG4saSx0KTpFKGUucG9pbnRzLChmdW5jdGlvbihlKXtOXyhlLG4saSx0KX0pKX0pKSxpc0Zpbml0ZShuWzBdKSYmaXNGaW5pdGUoblsxXSkmJmlzRmluaXRlKGlbMF0pJiZpc0Zpbml0ZShpWzFdKXx8KG5bMF09blsxXT1pWzBdPWlbMV09MCksZT1uZXcgemUoblswXSxuWzFdLGlbMF0tblswXSxpWzFdLW5bMV0pLHR8fCh0aGlzLl9yZWN0PWUpLGV9LGUucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSxuPXRoaXMuZ2VvbWV0cmllcztpZighZS5jb250YWluKHRbMF0sdFsxXSkpcmV0dXJuITE7dDpmb3IodmFyIGk9MCxyPW4ubGVuZ3RoO2k8cjtpKyspe3ZhciBvPW5baV07aWYoInBvbHlnb24iPT09by50eXBlKXt2YXIgYT1vLmV4dGVyaW9yLHM9by5pbnRlcmlvcnM7aWYoUF8oYSx0WzBdLHRbMV0pKXtmb3IodmFyIGw9MDtsPChzP3MubGVuZ3RoOjApO2wrKylpZihQXyhzW2xdLHRbMF0sdFsxXSkpY29udGludWUgdDtyZXR1cm4hMH19fXJldHVybiExfSxlLnByb3RvdHlwZS50cmFuc2Zvcm1Ubz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLmdldEJvdW5kaW5nUmVjdCgpLG89ci53aWR0aC9yLmhlaWdodDtuP2l8fChpPW4vbyk6bj1vKmk7Zm9yKHZhciBhPW5ldyB6ZSh0LGUsbixpKSxzPXIuY2FsY3VsYXRlVHJhbnNmb3JtKGEpLGw9dGhpcy5nZW9tZXRyaWVzLHU9MDt1PGwubGVuZ3RoO3UrKyl7dmFyIGg9bFt1XTsicG9seWdvbiI9PT1oLnR5cGU/KFJfKGguZXh0ZXJpb3IscyksRShoLmludGVyaW9ycywoZnVuY3Rpb24odCl7Ul8odCxzKX0pKSk6RShoLnBvaW50cywoZnVuY3Rpb24odCl7Ul8odCxzKX0pKX0ocj10aGlzLl9yZWN0KS5jb3B5KGEpLHRoaXMuX2NlbnRlcj1bci54K3Iud2lkdGgvMixyLnkrci5oZWlnaHQvMl19LGUucHJvdG90eXBlLmNsb25lU2hhbGxvdz1mdW5jdGlvbih0KXtudWxsPT10JiYodD10aGlzLm5hbWUpO3ZhciBuPW5ldyBlKHQsdGhpcy5nZW9tZXRyaWVzLHRoaXMuX2NlbnRlcik7cmV0dXJuIG4uX3JlY3Q9dGhpcy5fcmVjdCxuLnRyYW5zZm9ybVRvPW51bGwsbn0sZX0oRV8pLEZfPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS50eXBlPSJnZW9TVkciLGkuX2VsT25seUZvckNhbGN1bGF0ZT1uLGl9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5jYWxjQ2VudGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2VsT25seUZvckNhbGN1bGF0ZSxlPXQuZ2V0Qm91bmRpbmdSZWN0KCksbj1bZS54K2Uud2lkdGgvMixlLnkrZS5oZWlnaHQvMl0saT14ZShPXykscj10O3ImJiFyLmlzR2VvU1ZHR3JhcGhpY1Jvb3Q7KWJlKGksci5nZXRMb2NhbFRyYW5zZm9ybSgpLGkpLHI9ci5wYXJlbnQ7cmV0dXJuIEllKGksaSksV3QobixuLGkpLG59LGV9KEVfKTtmdW5jdGlvbiBHXyh0LGUsbil7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXT1XXyh0W2ldLGVbaV0sbil9ZnVuY3Rpb24gV18odCxlLG4pe2Zvcih2YXIgaT1bXSxyPWVbMF0sbz1lWzFdLGE9MDthPHQubGVuZ3RoO2ErPTIpe3ZhciBzPXQuY2hhckNvZGVBdChhKS02NCxsPXQuY2hhckNvZGVBdChhKzEpLTY0O3M9cz4+MV4tKDEmcyksbD1sPj4xXi0oMSZsKSxyPXMrPXIsbz1sKz1vLGkucHVzaChbcy9uLGwvbl0pfXJldHVybiBpfWZ1bmN0aW9uIEhfKHQsZSl7cmV0dXJuIHooQigodD1mdW5jdGlvbih0KXtpZighdC5VVEY4RW5jb2RpbmcpcmV0dXJuIHQ7dmFyIGU9dCxuPWUuVVRGOFNjYWxlO3JldHVybiBudWxsPT1uJiYobj0xMDI0KSxFKGUuZmVhdHVyZXMsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2VvbWV0cnksaT1lLmVuY29kZU9mZnNldHMscj1lLmNvb3JkaW5hdGVzO2lmKGkpc3dpdGNoKGUudHlwZSl7Y2FzZSJMaW5lU3RyaW5nIjplLmNvb3JkaW5hdGVzPVdfKHIsaSxuKTticmVhaztjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpHXyhyLGksbik7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOkUociwoZnVuY3Rpb24odCxlKXtyZXR1cm4gR18odCxpW2VdLG4pfSkpfX0pKSxlLlVURjhFbmNvZGluZz0hMSxlfSh0KSkuZmVhdHVyZXMsKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5JiZ0LnByb3BlcnRpZXMmJnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoPjB9KSksKGZ1bmN0aW9uKHQpe3ZhciBuPXQucHJvcGVydGllcyxpPXQuZ2VvbWV0cnkscj1bXTtzd2l0Y2goaS50eXBlKXtjYXNlIlBvbHlnb24iOnZhciBvPWkuY29vcmRpbmF0ZXM7ci5wdXNoKG5ldyB6XyhvWzBdLG8uc2xpY2UoMSkpKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6RShpLmNvb3JkaW5hdGVzLChmdW5jdGlvbih0KXt0WzBdJiZyLnB1c2gobmV3IHpfKHRbMF0sdC5zbGljZSgxKSkpfSkpO2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6ci5wdXNoKG5ldyBWXyhbaS5jb29yZGluYXRlc10pKTticmVhaztjYXNlIk11bHRpTGluZVN0cmluZyI6ci5wdXNoKG5ldyBWXyhpLmNvb3JkaW5hdGVzKSl9dmFyIGE9bmV3IEJfKG5bZXx8Im5hbWUiXSxyLG4uY3ApO3JldHVybiBhLnByb3BlcnRpZXM9bixhfSkpfXZhciBZXz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxsaW5lYXJNYXA6S3Iscm91bmQ6SnIsYXNjOlFyLGdldFByZWNpc2lvbjp0byxnZXRQcmVjaXNpb25TYWZlOmVvLGdldFBpeGVsUHJlY2lzaW9uOm5vLGdldFBlcmNlbnRXaXRoUHJlY2lzaW9uOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXSYmaW8odCxuKVtlXXx8MH0sTUFYX1NBRkVfSU5URUdFUjpvbyxyZW1SYWRpYW46YW8saXNSYWRpYW5Bcm91bmRaZXJvOnNvLHBhcnNlRGF0ZTp1byxxdWFudGl0eTpobyxxdWFudGl0eUV4cG9uZW50OmNvLG5pY2U6cG8scXVhbnRpbGU6Zm8scmVmb3JtSW50ZXJ2YWxzOmdvLGlzTnVtZXJpYzp2byxudW1lcmljVG9OdW1iZXI6eW99KSxYXz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwYXJzZTp1byxmb3JtYXQ6SmN9KSxVXz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxleHRlbmRTaGFwZTpDaCxleHRlbmRQYXRoOkFoLG1ha2VQYXRoOlBoLG1ha2VJbWFnZTpPaCxtZXJnZVBhdGg6TmgscmVzaXplUGF0aDpFaCxjcmVhdGVJY29uOlVoLHVwZGF0ZVByb3BzOnZoLGluaXRQcm9wczptaCxnZXRUcmFuc2Zvcm06QmgsY2xpcFBvaW50c0J5UmVjdDpZaCxjbGlwUmVjdEJ5UmVjdDpYaCxyZWdpc3RlclNoYXBlOmtoLGdldFNoYXBlQ2xhc3M6TGgsR3JvdXA6QnIsSW1hZ2U6TnMsVGV4dDpYcyxDaXJjbGU6U3UsRWxsaXBzZTpJdSxTZWN0b3I6RnUsUmluZzpXdSxQb2x5Z29uOlh1LFBvbHlsaW5lOlp1LFJlY3Q6V3MsTGluZTpLdSxCZXppZXJDdXJ2ZTp0aCxBcmM6bmgsSW5jcmVtZW50YWxEaXNwbGF5YWJsZTpkaCxDb21wb3VuZFBhdGg6aWgsTGluZWFyR3JhZGllbnQ6b2gsUmFkaWFsR3JhZGllbnQ6YWgsQm91bmRpbmdSZWN0OnplfSksWl89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYWRkQ29tbWFzOmdwLHRvQ2FtZWxDYXNlOnlwLG5vcm1hbGl6ZUNzc0FycmF5OnZwLGVuY29kZUhUTUw6cmUsZm9ybWF0VHBsOmJwLGdldFRvb2x0aXBNYXJrZXI6d3AsZm9ybWF0VGltZTpmdW5jdGlvbih0LGUsbil7IndlZWsiIT09dCYmIm1vbnRoIiE9PXQmJiJxdWFydGVyIiE9PXQmJiJoYWxmLXllYXIiIT09dCYmInllYXIiIT09dHx8KHQ9Ik1NLWRkXG55eXl5Iik7dmFyIGk9dW8oZSkscj1uPyJnZXRVVEMiOiJnZXQiLG89aVtyKyJGdWxsWWVhciJdKCksYT1pW3IrIk1vbnRoIl0oKSsxLHM9aVtyKyJEYXRlIl0oKSxsPWlbcisiSG91cnMiXSgpLHU9aVtyKyJNaW51dGVzIl0oKSxoPWlbcisiU2Vjb25kcyJdKCksYz1pW3IrIk1pbGxpc2Vjb25kcyJdKCk7cmV0dXJuIHQ9dC5yZXBsYWNlKCJNTSIscWMoYSwyKSkucmVwbGFjZSgiTSIsYSkucmVwbGFjZSgieXl5eSIsbykucmVwbGFjZSgieXkiLHFjKG8lMTAwKyIiLDIpKS5yZXBsYWNlKCJkZCIscWMocywyKSkucmVwbGFjZSgiZCIscykucmVwbGFjZSgiaGgiLHFjKGwsMikpLnJlcGxhY2UoImgiLGwpLnJlcGxhY2UoIm1tIixxYyh1LDIpKS5yZXBsYWNlKCJtIix1KS5yZXBsYWNlKCJzcyIscWMoaCwyKSkucmVwbGFjZSgicyIsaCkucmVwbGFjZSgiU1NTIixxYyhjLDMpKX0sY2FwaXRhbEZpcnN0OmZ1bmN0aW9uKHQpe3JldHVybiB0P3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk6dH0sdHJ1bmNhdGVUZXh0OnBhLGdldFRleHRSZWN0OmZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyl7cmV0dXJuIG5ldyBYcyh7c3R5bGU6e3RleHQ6dCxmb250OmUsYWxpZ246bix2ZXJ0aWNhbEFsaWduOmkscGFkZGluZzpyLHJpY2g6byxvdmVyZmxvdzphPyJ0cnVuY2F0ZSI6bnVsbCxsaW5lSGVpZ2h0OnN9fSkuZ2V0Qm91bmRpbmdSZWN0KCl9fSksal89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbWFwOnosZWFjaDpFLGluZGV4T2Y6UCxpbmhlcml0czpPLHJlZHVjZTpWLGZpbHRlcjpCLGJpbmQ6VyxjdXJyeTpILGlzQXJyYXk6WSxpc1N0cmluZzpVLGlzT2JqZWN0OnEsaXNGdW5jdGlvbjpYLGV4dGVuZDpBLGRlZmF1bHRzOmssY2xvbmU6VCxtZXJnZTpDfSkscV89Vm8oKTtmdW5jdGlvbiBLXyh0LGUpe3ZhciBuPXooZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2NhbGUucGFyc2UoZSl9KSk7cmV0dXJuInRpbWUiPT09dC50eXBlJiZuLmxlbmd0aD4wJiYobi5zb3J0KCksbi51bnNoaWZ0KG5bMF0pLG4ucHVzaChuW24ubGVuZ3RoLTFdKSksbn1mdW5jdGlvbiAkXyh0KXt2YXIgZT10LmdldExhYmVsTW9kZWwoKS5nZXQoImN1c3RvbVZhbHVlcyIpO2lmKGUpe3ZhciBuPXdfKHQpO3JldHVybntsYWJlbHM6S18odCxlKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBpPXt2YWx1ZTplfTtyZXR1cm57Zm9ybWF0dGVkTGFiZWw6bihpKSxyYXdMYWJlbDp0LnNjYWxlLmdldExhYmVsKGkpLHRpY2tWYWx1ZTplfX0pKX19cmV0dXJuImNhdGVnb3J5Ij09PXQudHlwZT9mdW5jdGlvbih0KXt2YXIgZT10LmdldExhYmVsTW9kZWwoKSxuPVFfKHQsZSk7cmV0dXJuIWUuZ2V0KCJzaG93Iil8fHQuc2NhbGUuaXNCbGFuaygpP3tsYWJlbHM6W10sbGFiZWxDYXRlZ29yeUludGVydmFsOm4ubGFiZWxDYXRlZ29yeUludGVydmFsfTpufSh0KTpmdW5jdGlvbih0KXt2YXIgZT10LnNjYWxlLmdldFRpY2tzKCksbj13Xyh0KTtyZXR1cm57bGFiZWxzOnooZSwoZnVuY3Rpb24oZSxpKXtyZXR1cm57bGV2ZWw6ZS5sZXZlbCxmb3JtYXR0ZWRMYWJlbDpuKGUsaSkscmF3TGFiZWw6dC5zY2FsZS5nZXRMYWJlbChlKSx0aWNrVmFsdWU6ZS52YWx1ZX19KSl9fSh0KX1mdW5jdGlvbiBKXyh0LGUpe3ZhciBuPXQuZ2V0VGlja01vZGVsKCkuZ2V0KCJjdXN0b21WYWx1ZXMiKTtyZXR1cm4gbj97dGlja3M6S18odCxuKX06ImNhdGVnb3J5Ij09PXQudHlwZT9mdW5jdGlvbih0LGUpe3ZhciBuLGkscj10Yih0LCJ0aWNrcyIpLG89SV8oZSksYT1lYihyLG8pO2lmKGEpcmV0dXJuIGE7ZS5nZXQoInNob3ciKSYmIXQuc2NhbGUuaXNCbGFuaygpfHwobj1bXSk7aWYoWChvKSluPXJiKHQsbywhMCk7ZWxzZSBpZigiYXV0byI9PT1vKXt2YXIgcz1RXyh0LHQuZ2V0TGFiZWxNb2RlbCgpKTtpPXMubGFiZWxDYXRlZ29yeUludGVydmFsLG49eihzLmxhYmVscywoZnVuY3Rpb24odCl7cmV0dXJuIHQudGlja1ZhbHVlfSkpfWVsc2Ugbj1pYih0LGk9bywhMCk7cmV0dXJuIG5iKHIsbyx7dGlja3M6bix0aWNrQ2F0ZWdvcnlJbnRlcnZhbDppfSl9KHQsZSk6e3RpY2tzOnoodC5zY2FsZS5nZXRUaWNrcygpLChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pKX19ZnVuY3Rpb24gUV8odCxlKXt2YXIgbixpLHI9dGIodCwibGFiZWxzIiksbz1JXyhlKSxhPWViKHIsbyk7cmV0dXJuIGF8fChYKG8pP249cmIodCxvKTooaT0iYXV0byI9PT1vP2Z1bmN0aW9uKHQpe3ZhciBlPXFfKHQpLmF1dG9JbnRlcnZhbDtyZXR1cm4gbnVsbCE9ZT9lOnFfKHQpLmF1dG9JbnRlcnZhbD10LmNhbGN1bGF0ZUNhdGVnb3J5SW50ZXJ2YWwoKX0odCk6byxuPWliKHQsaSkpLG5iKHIsbyx7bGFiZWxzOm4sbGFiZWxDYXRlZ29yeUludGVydmFsOml9KSl9ZnVuY3Rpb24gdGIodCxlKXtyZXR1cm4gcV8odClbZV18fChxXyh0KVtlXT1bXSl9ZnVuY3Rpb24gZWIodCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLmtleT09PWUpcmV0dXJuIHRbbl0udmFsdWV9ZnVuY3Rpb24gbmIodCxlLG4pe3JldHVybiB0LnB1c2goe2tleTplLHZhbHVlOm59KSxufWZ1bmN0aW9uIGliKHQsZSxuKXt2YXIgaT13Xyh0KSxyPXQuc2NhbGUsbz1yLmdldEV4dGVudCgpLGE9dC5nZXRMYWJlbE1vZGVsKCkscz1bXSxsPU1hdGgubWF4KChlfHwwKSsxLDEpLHU9b1swXSxoPXIuY291bnQoKTswIT09dSYmbD4xJiZoL2w+MiYmKHU9TWF0aC5yb3VuZChNYXRoLmNlaWwodS9sKSpsKSk7dmFyIGM9VF8odCkscD1hLmdldCgic2hvd01pbkxhYmVsIil8fGMsZD1hLmdldCgic2hvd01heExhYmVsIil8fGM7cCYmdSE9PW9bMF0mJmcob1swXSk7Zm9yKHZhciBmPXU7Zjw9b1sxXTtmKz1sKWcoZik7ZnVuY3Rpb24gZyh0KXt2YXIgZT17dmFsdWU6dH07cy5wdXNoKG4/dDp7Zm9ybWF0dGVkTGFiZWw6aShlKSxyYXdMYWJlbDpyLmdldExhYmVsKGUpLHRpY2tWYWx1ZTp0fSl9cmV0dXJuIGQmJmYtbCE9PW9bMV0mJmcob1sxXSksc31mdW5jdGlvbiByYih0LGUsbil7dmFyIGk9dC5zY2FsZSxyPXdfKHQpLG89W107cmV0dXJuIEUoaS5nZXRUaWNrcygpLChmdW5jdGlvbih0KXt2YXIgYT1pLmdldExhYmVsKHQpLHM9dC52YWx1ZTtlKHQudmFsdWUsYSkmJm8ucHVzaChuP3M6e2Zvcm1hdHRlZExhYmVsOnIodCkscmF3TGFiZWw6YSx0aWNrVmFsdWU6c30pfSkpLG99dmFyIG9iPVswLDFdLGFiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5vbkJhbmQ9ITEsdGhpcy5pbnZlcnNlPSExLHRoaXMuZGltPXQsdGhpcy5zY2FsZT1lLHRoaXMuX2V4dGVudD1ufHxbMCwwXX1yZXR1cm4gdC5wcm90b3R5cGUuY29udGFpbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQsbj1NYXRoLm1pbihlWzBdLGVbMV0pLGk9TWF0aC5tYXgoZVswXSxlWzFdKTtyZXR1cm4gdD49biYmdDw9aX0sdC5wcm90b3R5cGUuY29udGFpbkRhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2NhbGUuY29udGFpbih0KX0sdC5wcm90b3R5cGUuZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V4dGVudC5zbGljZSgpfSx0LnByb3RvdHlwZS5nZXRQaXhlbFByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gbm8odHx8dGhpcy5zY2FsZS5nZXRFeHRlbnQoKSx0aGlzLl9leHRlbnQpfSx0LnByb3RvdHlwZS5zZXRFeHRlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9leHRlbnQ7blswXT10LG5bMV09ZX0sdC5wcm90b3R5cGUuZGF0YVRvQ29vcmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9leHRlbnQsaT10aGlzLnNjYWxlO3JldHVybiB0PWkubm9ybWFsaXplKHQpLHRoaXMub25CYW5kJiYib3JkaW5hbCI9PT1pLnR5cGUmJnNiKG49bi5zbGljZSgpLGkuY291bnQoKSksS3IodCxvYixuLGUpfSx0LnByb3RvdHlwZS5jb29yZFRvRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2V4dGVudCxpPXRoaXMuc2NhbGU7dGhpcy5vbkJhbmQmJiJvcmRpbmFsIj09PWkudHlwZSYmc2Iobj1uLnNsaWNlKCksaS5jb3VudCgpKTt2YXIgcj1Lcih0LG4sb2IsZSk7cmV0dXJuIHRoaXMuc2NhbGUuc2NhbGUocil9LHQucHJvdG90eXBlLnBvaW50VG9EYXRhPWZ1bmN0aW9uKHQsZSl7fSx0LnByb3RvdHlwZS5nZXRUaWNrc0Nvb3Jkcz1mdW5jdGlvbih0KXt2YXIgZT0odD10fHx7fSkudGlja01vZGVsfHx0aGlzLmdldFRpY2tNb2RlbCgpLG49eihKXyh0aGlzLGUpLnRpY2tzLChmdW5jdGlvbih0KXtyZXR1cm57Y29vcmQ6dGhpcy5kYXRhVG9Db29yZCgib3JkaW5hbCI9PT10aGlzLnNjYWxlLnR5cGU/dGhpcy5zY2FsZS5nZXRSYXdPcmRpbmFsTnVtYmVyKHQpOnQpLHRpY2tWYWx1ZTp0fX0pLHRoaXMpO3JldHVybiBmdW5jdGlvbih0LGUsbixpKXt2YXIgcj1lLmxlbmd0aDtpZighdC5vbkJhbmR8fG58fCFyKXJldHVybjt2YXIgbyxhLHM9dC5nZXRFeHRlbnQoKTtpZigxPT09cillWzBdLmNvb3JkPXNbMF0sbz1lWzFdPXtjb29yZDpzWzFdfTtlbHNle3ZhciBsPWVbci0xXS50aWNrVmFsdWUtZVswXS50aWNrVmFsdWUsdT0oZVtyLTFdLmNvb3JkLWVbMF0uY29vcmQpL2w7RShlLChmdW5jdGlvbih0KXt0LmNvb3JkLT11LzJ9KSksYT0xK3Quc2NhbGUuZ2V0RXh0ZW50KClbMV0tZVtyLTFdLnRpY2tWYWx1ZSxvPXtjb29yZDplW3ItMV0uY29vcmQrdSphfSxlLnB1c2gobyl9dmFyIGg9c1swXT5zWzFdO2MoZVswXS5jb29yZCxzWzBdKSYmKGk/ZVswXS5jb29yZD1zWzBdOmUuc2hpZnQoKSk7aSYmYyhzWzBdLGVbMF0uY29vcmQpJiZlLnVuc2hpZnQoe2Nvb3JkOnNbMF19KTtjKHNbMV0sby5jb29yZCkmJihpP28uY29vcmQ9c1sxXTplLnBvcCgpKTtpJiZjKG8uY29vcmQsc1sxXSkmJmUucHVzaCh7Y29vcmQ6c1sxXX0pO2Z1bmN0aW9uIGModCxlKXtyZXR1cm4gdD1Kcih0KSxlPUpyKGUpLGg/dD5lOnQ8ZX19KHRoaXMsbixlLmdldCgiYWxpZ25XaXRoTGFiZWwiKSx0LmNsYW1wKSxufSx0LnByb3RvdHlwZS5nZXRNaW5vclRpY2tzQ29vcmRzPWZ1bmN0aW9uKCl7aWYoIm9yZGluYWwiPT09dGhpcy5zY2FsZS50eXBlKXJldHVybltdO3ZhciB0PXRoaXMubW9kZWwuZ2V0TW9kZWwoIm1pbm9yVGljayIpLmdldCgic3BsaXROdW1iZXIiKTtyZXR1cm4gdD4wJiZ0PDEwMHx8KHQ9NSkseih0aGlzLnNjYWxlLmdldE1pbm9yVGlja3ModCksKGZ1bmN0aW9uKHQpe3JldHVybiB6KHQsKGZ1bmN0aW9uKHQpe3JldHVybntjb29yZDp0aGlzLmRhdGFUb0Nvb3JkKHQpLHRpY2tWYWx1ZTp0fX0pLHRoaXMpfSksdGhpcyl9LHQucHJvdG90eXBlLmdldFZpZXdMYWJlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gJF8odGhpcykubGFiZWxzfSx0LnByb3RvdHlwZS5nZXRMYWJlbE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0TW9kZWwoImF4aXNMYWJlbCIpfSx0LnByb3RvdHlwZS5nZXRUaWNrTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb2RlbC5nZXRNb2RlbCgiYXhpc1RpY2siKX0sdC5wcm90b3R5cGUuZ2V0QmFuZFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZXh0ZW50LGU9dGhpcy5zY2FsZS5nZXRFeHRlbnQoKSxuPWVbMV0tZVswXSsodGhpcy5vbkJhbmQ/MTowKTswPT09biYmKG49MSk7dmFyIGk9TWF0aC5hYnModFsxXS10WzBdKTtyZXR1cm4gTWF0aC5hYnMoaSkvbn0sdC5wcm90b3R5cGUuY2FsY3VsYXRlQ2F0ZWdvcnlJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldExhYmVsTW9kZWwoKTtyZXR1cm57YXhpc1JvdGF0ZTp0LmdldFJvdGF0ZT90LmdldFJvdGF0ZSgpOnQuaXNIb3Jpem9udGFsJiYhdC5pc0hvcml6b250YWwoKT85MDowLGxhYmVsUm90YXRlOmUuZ2V0KCJyb3RhdGUiKXx8MCxmb250OmUuZ2V0Rm9udCgpfX0odCksbj13Xyh0KSxpPShlLmF4aXNSb3RhdGUtZS5sYWJlbFJvdGF0ZSkvMTgwKk1hdGguUEkscj10LnNjYWxlLG89ci5nZXRFeHRlbnQoKSxhPXIuY291bnQoKTtpZihvWzFdLW9bMF08MSlyZXR1cm4gMDt2YXIgcz0xO2E+NDAmJihzPU1hdGgubWF4KDEsTWF0aC5mbG9vcihhLzQwKSkpO2Zvcih2YXIgbD1vWzBdLHU9dC5kYXRhVG9Db29yZChsKzEpLXQuZGF0YVRvQ29vcmQobCksaD1NYXRoLmFicyh1Kk1hdGguY29zKGkpKSxjPU1hdGguYWJzKHUqTWF0aC5zaW4oaSkpLHA9MCxkPTA7bDw9b1sxXTtsKz1zKXt2YXIgZixnLHk9U3Iobih7dmFsdWU6bH0pLGUuZm9udCwiY2VudGVyIiwidG9wIik7Zj0xLjMqeS53aWR0aCxnPTEuMyp5LmhlaWdodCxwPU1hdGgubWF4KHAsZiw3KSxkPU1hdGgubWF4KGQsZyw3KX12YXIgdj1wL2gsbT1kL2M7aXNOYU4odikmJih2PTEvMCksaXNOYU4obSkmJihtPTEvMCk7dmFyIHg9TWF0aC5tYXgoMCxNYXRoLmZsb29yKE1hdGgubWluKHYsbSkpKSxfPXFfKHQubW9kZWwpLGI9dC5nZXRFeHRlbnQoKSx3PV8ubGFzdEF1dG9JbnRlcnZhbCxTPV8ubGFzdFRpY2tDb3VudDtyZXR1cm4gbnVsbCE9dyYmbnVsbCE9UyYmTWF0aC5hYnMody14KTw9MSYmTWF0aC5hYnMoUy1hKTw9MSYmdz54JiZfLmF4aXNFeHRlbnQwPT09YlswXSYmXy5heGlzRXh0ZW50MT09PWJbMV0/eD13OihfLmxhc3RUaWNrQ291bnQ9YSxfLmxhc3RBdXRvSW50ZXJ2YWw9eCxfLmF4aXNFeHRlbnQwPWJbMF0sXy5heGlzRXh0ZW50MT1iWzFdKSx4fSh0aGlzKX0sdH0oKTtmdW5jdGlvbiBzYih0LGUpe3ZhciBuPSh0WzFdLXRbMF0pL2UvMjt0WzBdKz1uLHRbMV0tPW59dmFyIGxiPTIqTWF0aC5QSSx1Yj1ocy5DTUQsaGI9WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXTtmdW5jdGlvbiBjYih0LGUsbixpLHIpe3ZhciBvPW4ud2lkdGgsYT1uLmhlaWdodDtzd2l0Y2godCl7Y2FzZSJ0b3AiOmkuc2V0KG4ueCtvLzIsbi55LWUpLHIuc2V0KDAsLTEpO2JyZWFrO2Nhc2UiYm90dG9tIjppLnNldChuLngrby8yLG4ueSthK2UpLHIuc2V0KDAsMSk7YnJlYWs7Y2FzZSJsZWZ0IjppLnNldChuLngtZSxuLnkrYS8yKSxyLnNldCgtMSwwKTticmVhaztjYXNlInJpZ2h0IjppLnNldChuLngrbytlLG4ueSthLzIpLHIuc2V0KDEsMCl9fWZ1bmN0aW9uIHBiKHQsZSxuLGkscixvLGEscyxsKXthLT10LHMtPWU7dmFyIHU9TWF0aC5zcXJ0KGEqYStzKnMpLGg9KGEvPXUpKm4rdCxjPShzLz11KSpuK2U7aWYoTWF0aC5hYnMoaS1yKSVsYjwxZS00KXJldHVybiBsWzBdPWgsbFsxXT1jLHUtbjtpZihvKXt2YXIgcD1pO2k9Z3Mocikscj1ncyhwKX1lbHNlIGk9Z3MoaSkscj1ncyhyKTtpPnImJihyKz1sYik7dmFyIGQ9TWF0aC5hdGFuMihzLGEpO2lmKGQ8MCYmKGQrPWxiKSxkPj1pJiZkPD1yfHxkK2xiPj1pJiZkK2xiPD1yKXJldHVybiBsWzBdPWgsbFsxXT1jLHUtbjt2YXIgZj1uKk1hdGguY29zKGkpK3QsZz1uKk1hdGguc2luKGkpK2UseT1uKk1hdGguY29zKHIpK3Qsdj1uKk1hdGguc2luKHIpK2UsbT0oZi1hKSooZi1hKSsoZy1zKSooZy1zKSx4PSh5LWEpKih5LWEpKyh2LXMpKih2LXMpO3JldHVybiBtPHg/KGxbMF09ZixsWzFdPWcsTWF0aC5zcXJ0KG0pKToobFswXT15LGxbMV09dixNYXRoLnNxcnQoeCkpfWZ1bmN0aW9uIGRiKHQsZSxuLGkscixvLGEscyl7dmFyIGw9ci10LHU9by1lLGg9bi10LGM9aS1lLHA9TWF0aC5zcXJ0KGgqaCtjKmMpLGQ9KGwqKGgvPXApK3UqKGMvPXApKS9wO3MmJihkPU1hdGgubWluKE1hdGgubWF4KGQsMCksMSkpLGQqPXA7dmFyIGY9YVswXT10K2QqaCxnPWFbMV09ZStkKmM7cmV0dXJuIE1hdGguc3FydCgoZi1yKSooZi1yKSsoZy1vKSooZy1vKSl9ZnVuY3Rpb24gZmIodCxlLG4saSxyLG8sYSl7bjwwJiYodCs9bixuPS1uKSxpPDAmJihlKz1pLGk9LWkpO3ZhciBzPXQrbixsPWUraSx1PWFbMF09TWF0aC5taW4oTWF0aC5tYXgocix0KSxzKSxoPWFbMV09TWF0aC5taW4oTWF0aC5tYXgobyxlKSxsKTtyZXR1cm4gTWF0aC5zcXJ0KCh1LXIpKih1LXIpKyhoLW8pKihoLW8pKX12YXIgZ2I9W107ZnVuY3Rpb24geWIodCxlLG4pe3ZhciBpPWZiKGUueCxlLnksZS53aWR0aCxlLmhlaWdodCx0LngsdC55LGdiKTtyZXR1cm4gbi5zZXQoZ2JbMF0sZ2JbMV0pLGl9ZnVuY3Rpb24gdmIodCxlLG4pe2Zvcih2YXIgaSxyLG89MCxhPTAscz0wLGw9MCx1PTEvMCxoPWUuZGF0YSxjPXQueCxwPXQueSxkPTA7ZDxoLmxlbmd0aDspe3ZhciBmPWhbZCsrXTsxPT09ZCYmKHM9bz1oW2RdLGw9YT1oW2QrMV0pO3ZhciBnPXU7c3dpdGNoKGYpe2Nhc2UgdWIuTTpvPXM9aFtkKytdLGE9bD1oW2QrK107YnJlYWs7Y2FzZSB1Yi5MOmc9ZGIobyxhLGhbZF0saFtkKzFdLGMscCxnYiwhMCksbz1oW2QrK10sYT1oW2QrK107YnJlYWs7Y2FzZSB1Yi5DOmc9U24obyxhLGhbZCsrXSxoW2QrK10saFtkKytdLGhbZCsrXSxoW2RdLGhbZCsxXSxjLHAsZ2IpLG89aFtkKytdLGE9aFtkKytdO2JyZWFrO2Nhc2UgdWIuUTpnPUFuKG8sYSxoW2QrK10saFtkKytdLGhbZF0saFtkKzFdLGMscCxnYiksbz1oW2QrK10sYT1oW2QrK107YnJlYWs7Y2FzZSB1Yi5BOnZhciB5PWhbZCsrXSx2PWhbZCsrXSxtPWhbZCsrXSx4PWhbZCsrXSxfPWhbZCsrXSxiPWhbZCsrXTtkKz0xO3ZhciB3PSEhKDEtaFtkKytdKTtpPU1hdGguY29zKF8pKm0reSxyPU1hdGguc2luKF8pKngrdixkPD0xJiYocz1pLGw9ciksZz1wYih5LHYseCxfLF8rYix3LChjLXkpKngvbSt5LHAsZ2IpLG89TWF0aC5jb3MoXytiKSptK3ksYT1NYXRoLnNpbihfK2IpKngrdjticmVhaztjYXNlIHViLlI6Zz1mYihzPW89aFtkKytdLGw9YT1oW2QrK10saFtkKytdLGhbZCsrXSxjLHAsZ2IpO2JyZWFrO2Nhc2UgdWIuWjpnPWRiKG8sYSxzLGwsYyxwLGdiLCEwKSxvPXMsYT1sfWc8dSYmKHU9ZyxuLnNldChnYlswXSxnYlsxXSkpfXJldHVybiB1fXZhciBtYj1uZXcgRGUseGI9bmV3IERlLF9iPW5ldyBEZSxiYj1uZXcgRGUsd2I9bmV3IERlO2Z1bmN0aW9uIFNiKHQsZSl7aWYodCl7dmFyIG49dC5nZXRUZXh0R3VpZGVMaW5lKCksaT10LmdldFRleHRDb250ZW50KCk7aWYoaSYmbil7dmFyIHI9dC50ZXh0R3VpZGVMaW5lQ29uZmlnfHx7fSxvPVtbMCwwXSxbMCwwXSxbMCwwXV0sYT1yLmNhbmRpZGF0ZXN8fGhiLHM9aS5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpO3MuYXBwbHlUcmFuc2Zvcm0oaS5nZXRDb21wdXRlZFRyYW5zZm9ybSgpKTt2YXIgbD0xLzAsdT1yLmFuY2hvcixoPXQuZ2V0Q29tcHV0ZWRUcmFuc2Zvcm0oKSxjPWgmJkllKFtdLGgpLHA9ZS5nZXQoImxlbmd0aDIiKXx8MDt1JiZfYi5jb3B5KHUpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjYihhW2RdLDAscyxtYixiYiksRGUuc2NhbGVBbmRBZGQoeGIsbWIsYmIscCkseGIudHJhbnNmb3JtKGMpO3ZhciBmPXQuZ2V0Qm91bmRpbmdSZWN0KCksZz11P3UuZGlzdGFuY2UoeGIpOnQgaW5zdGFuY2VvZiBrcz92Yih4Yix0LnBhdGgsX2IpOnliKHhiLGYsX2IpO2c8bCYmKGw9Zyx4Yi50cmFuc2Zvcm0oaCksX2IudHJhbnNmb3JtKGgpLF9iLnRvQXJyYXkob1swXSkseGIudG9BcnJheShvWzFdKSxtYi50b0FycmF5KG9bMl0pKX1UYihvLGUuZ2V0KCJtaW5UdXJuQW5nbGUiKSksbi5zZXRTaGFwZSh7cG9pbnRzOm99KX19fXZhciBNYj1bXSxJYj1uZXcgRGU7ZnVuY3Rpb24gVGIodCxlKXtpZihlPD0xODAmJmU+MCl7ZT1lLzE4MCpNYXRoLlBJLG1iLmZyb21BcnJheSh0WzBdKSx4Yi5mcm9tQXJyYXkodFsxXSksX2IuZnJvbUFycmF5KHRbMl0pLERlLnN1YihiYixtYix4YiksRGUuc3ViKHdiLF9iLHhiKTt2YXIgbj1iYi5sZW4oKSxpPXdiLmxlbigpO2lmKCEobjwuMDAxfHxpPC4wMDEpKXtiYi5zY2FsZSgxL24pLHdiLnNjYWxlKDEvaSk7dmFyIHI9YmIuZG90KHdiKTtpZihNYXRoLmNvcyhlKTxyKXt2YXIgbz1kYih4Yi54LHhiLnksX2IueCxfYi55LG1iLngsbWIueSxNYiwhMSk7SWIuZnJvbUFycmF5KE1iKSxJYi5zY2FsZUFuZEFkZCh3YixvL01hdGgudGFuKE1hdGguUEktZSkpO3ZhciBhPV9iLnghPT14Yi54PyhJYi54LXhiLngpLyhfYi54LXhiLngpOihJYi55LXhiLnkpLyhfYi55LXhiLnkpO2lmKGlzTmFOKGEpKXJldHVybjthPDA/RGUuY29weShJYix4Yik6YT4xJiZEZS5jb3B5KEliLF9iKSxJYi50b0FycmF5KHRbMV0pfX19fWZ1bmN0aW9uIENiKHQsZSxuKXtpZihuPD0xODAmJm4+MCl7bj1uLzE4MCpNYXRoLlBJLG1iLmZyb21BcnJheSh0WzBdKSx4Yi5mcm9tQXJyYXkodFsxXSksX2IuZnJvbUFycmF5KHRbMl0pLERlLnN1YihiYix4YixtYiksRGUuc3ViKHdiLF9iLHhiKTt2YXIgaT1iYi5sZW4oKSxyPXdiLmxlbigpO2lmKCEoaTwuMDAxfHxyPC4wMDEpKWlmKGJiLnNjYWxlKDEvaSksd2Iuc2NhbGUoMS9yKSxiYi5kb3QoZSk8TWF0aC5jb3Mobikpe3ZhciBvPWRiKHhiLngseGIueSxfYi54LF9iLnksbWIueCxtYi55LE1iLCExKTtJYi5mcm9tQXJyYXkoTWIpO3ZhciBhPU1hdGguUEkvMixzPWErTWF0aC5hY29zKHdiLmRvdChlKSktbjtpZihzPj1hKURlLmNvcHkoSWIsX2IpO2Vsc2V7SWIuc2NhbGVBbmRBZGQod2Isby9NYXRoLnRhbihNYXRoLlBJLzItcykpO3ZhciBsPV9iLnghPT14Yi54PyhJYi54LXhiLngpLyhfYi54LXhiLngpOihJYi55LXhiLnkpLyhfYi55LXhiLnkpO2lmKGlzTmFOKGwpKXJldHVybjtsPDA/RGUuY29weShJYix4Yik6bD4xJiZEZS5jb3B5KEliLF9iKX1JYi50b0FycmF5KHRbMV0pfX19ZnVuY3Rpb24gRGIodCxlLG4saSl7dmFyIHI9Im5vcm1hbCI9PT1uLG89cj90OnQuZW5zdXJlU3RhdGUobik7by5pZ25vcmU9ZTt2YXIgYT1pLmdldCgic21vb3RoIik7YSYmITA9PT1hJiYoYT0uMyksby5zaGFwZT1vLnNoYXBlfHx7fSxhPjAmJihvLnNoYXBlLnNtb290aD1hKTt2YXIgcz1pLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKTtyP3QudXNlU3R5bGUocyk6by5zdHlsZT1zfWZ1bmN0aW9uIEFiKHQsZSl7dmFyIG49ZS5zbW9vdGgsaT1lLnBvaW50cztpZihpKWlmKHQubW92ZVRvKGlbMF1bMF0saVswXVsxXSksbj4wJiZpLmxlbmd0aD49Myl7dmFyIHI9VnQoaVswXSxpWzFdKSxvPVZ0KGlbMV0saVsyXSk7aWYoIXJ8fCFvKXJldHVybiB0LmxpbmVUbyhpWzFdWzBdLGlbMV1bMV0pLHZvaWQgdC5saW5lVG8oaVsyXVswXSxpWzJdWzFdKTt2YXIgYT1NYXRoLm1pbihyLG8pKm4scz1HdChbXSxpWzFdLGlbMF0sYS9yKSxsPUd0KFtdLGlbMV0saVsyXSxhL28pLHU9R3QoW10scyxsLC41KTt0LmJlemllckN1cnZlVG8oc1swXSxzWzFdLHNbMF0sc1sxXSx1WzBdLHVbMV0pLHQuYmV6aWVyQ3VydmVUbyhsWzBdLGxbMV0sbFswXSxsWzFdLGlbMl1bMF0saVsyXVsxXSl9ZWxzZSBmb3IodmFyIGg9MTtoPGkubGVuZ3RoO2grKyl0LmxpbmVUbyhpW2hdWzBdLGlbaF1bMV0pfWZ1bmN0aW9uIGtiKHQsZSxuKXt2YXIgaT10LmdldFRleHRHdWlkZUxpbmUoKSxyPXQuZ2V0VGV4dENvbnRlbnQoKTtpZihyKXtmb3IodmFyIG89ZS5ub3JtYWwsYT1vLmdldCgic2hvdyIpLHM9ci5pZ25vcmUsbD0wO2w8Y2wubGVuZ3RoO2wrKyl7dmFyIHU9Y2xbbF0saD1lW3VdLGM9Im5vcm1hbCI9PT11O2lmKGgpe3ZhciBwPWguZ2V0KCJzaG93Iik7aWYoKGM/czpydChyLnN0YXRlc1t1XSYmci5zdGF0ZXNbdV0uaWdub3JlLHMpKXx8IXJ0KHAsYSkpe3ZhciBkPWM/aTppJiZpLnN0YXRlc1t1XTtkJiYoZC5pZ25vcmU9ITApLGkmJkRiKGksITAsdSxoKTtjb250aW51ZX1pfHwoaT1uZXcgWnUsdC5zZXRUZXh0R3VpZGVMaW5lKGkpLGN8fCFzJiZhfHxEYihpLCEwLCJub3JtYWwiLGUubm9ybWFsKSx0LnN0YXRlUHJveHkmJihpLnN0YXRlUHJveHk9dC5zdGF0ZVByb3h5KSksRGIoaSwhMSx1LGgpfX1pZihpKXtrKGkuc3R5bGUsbiksaS5zdHlsZS5maWxsPW51bGw7dmFyIGY9by5nZXQoInNob3dBYm92ZSIpOyh0LnRleHRHdWlkZUxpbmVDb25maWc9dC50ZXh0R3VpZGVMaW5lQ29uZmlnfHx7fSkuc2hvd0Fib3ZlPWZ8fCExLGkuYnVpbGRQYXRoPUFifX1lbHNlIGkmJnQucmVtb3ZlVGV4dEd1aWRlTGluZSgpfWZ1bmN0aW9uIExiKHQsZSl7ZT1lfHwibGFiZWxMaW5lIjtmb3IodmFyIG49e25vcm1hbDp0LmdldE1vZGVsKGUpfSxpPTA7aTxobC5sZW5ndGg7aSsrKXt2YXIgcj1obFtpXTtuW3JdPXQuZ2V0TW9kZWwoW3IsZV0pfXJldHVybiBufWZ1bmN0aW9uIFBiKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07aWYoIWkuZGVmYXVsdEF0dHIuaWdub3JlKXt2YXIgcj1pLmxhYmVsLG89ci5nZXRDb21wdXRlZFRyYW5zZm9ybSgpLGE9ci5nZXRCb3VuZGluZ1JlY3QoKSxzPSFvfHxvWzFdPDFlLTUmJm9bMl08MWUtNSxsPXIuc3R5bGUubWFyZ2lufHwwLHU9YS5jbG9uZSgpO3UuYXBwbHlUcmFuc2Zvcm0obyksdS54LT1sLzIsdS55LT1sLzIsdS53aWR0aCs9bCx1LmhlaWdodCs9bDt2YXIgaD1zP25ldyBjaChhLG8pOm51bGw7ZS5wdXNoKHtsYWJlbDpyLGxhYmVsTGluZTppLmxhYmVsTGluZSxyZWN0OnUsbG9jYWxSZWN0OmEsb2JiOmgscHJpb3JpdHk6aS5wcmlvcml0eSxkZWZhdWx0QXR0cjppLmRlZmF1bHRBdHRyLGxheW91dE9wdGlvbjppLmNvbXB1dGVkTGF5b3V0T3B0aW9uLGF4aXNBbGlnbmVkOnMsdHJhbnNmb3JtOm99KX19cmV0dXJuIGV9ZnVuY3Rpb24gT2IodCxlLG4saSxyLG8pe3ZhciBhPXQubGVuZ3RoO2lmKCEoYTwyKSl7dC5zb3J0KChmdW5jdGlvbih0LG4pe3JldHVybiB0LnJlY3RbZV0tbi5yZWN0W2VdfSkpO2Zvcih2YXIgcyxsPTAsdT0hMSxoPTAsYz0wO2M8YTtjKyspe3ZhciBwPXRbY10sZD1wLnJlY3Q7KHM9ZFtlXS1sKTwwJiYoZFtlXS09cyxwLmxhYmVsW2VdLT1zLHU9ITApLGgrPU1hdGgubWF4KC1zLDApLGw9ZFtlXStkW25dfWg+MCYmbyYmXygtaC9hLDAsYSk7dmFyIGYsZyx5PXRbMF0sdj10W2EtMV07cmV0dXJuIG0oKSxmPDAmJmIoLWYsLjgpLGc8MCYmYihnLC44KSxtKCkseChmLGcsMSkseChnLGYsLTEpLG0oKSxmPDAmJncoLWYpLGc8MCYmdyhnKSx1fWZ1bmN0aW9uIG0oKXtmPXkucmVjdFtlXS1pLGc9ci12LnJlY3RbZV0tdi5yZWN0W25dfWZ1bmN0aW9uIHgodCxlLG4pe2lmKHQ8MCl7dmFyIGk9TWF0aC5taW4oZSwtdCk7aWYoaT4wKXtfKGkqbiwwLGEpO3ZhciByPWkrdDtyPDAmJmIoLXIqbiwxKX1lbHNlIGIoLXQqbiwxKX19ZnVuY3Rpb24gXyhuLGkscil7MCE9PW4mJih1PSEwKTtmb3IodmFyIG89aTtvPHI7bysrKXt2YXIgYT10W29dO2EucmVjdFtlXSs9bixhLmxhYmVsW2VdKz1ufX1mdW5jdGlvbiBiKGkscil7Zm9yKHZhciBvPVtdLHM9MCxsPTE7bDxhO2wrKyl7dmFyIHU9dFtsLTFdLnJlY3QsaD1NYXRoLm1heCh0W2xdLnJlY3RbZV0tdVtlXS11W25dLDApO28ucHVzaChoKSxzKz1ofWlmKHMpe3ZhciBjPU1hdGgubWluKE1hdGguYWJzKGkpL3Mscik7aWYoaT4wKWZvcihsPTA7bDxhLTE7bCsrKXtfKG9bbF0qYywwLGwrMSl9ZWxzZSBmb3IobD1hLTE7bD4wO2wtLSl7XygtKG9bbC0xXSpjKSxsLGEpfX19ZnVuY3Rpb24gdyh0KXt2YXIgZT10PDA/LTE6MTt0PU1hdGguYWJzKHQpO2Zvcih2YXIgbj1NYXRoLmNlaWwodC8oYS0xKSksaT0wO2k8YS0xO2krKylpZihlPjA/XyhuLDAsaSsxKTpfKC1uLGEtaS0xLGEpLCh0LT1uKTw9MClyZXR1cm59fWZ1bmN0aW9uIFJiKHQsZSxuLGkpe3JldHVybiBPYih0LCJ5IiwiaGVpZ2h0IixlLG4saSl9ZnVuY3Rpb24gTmIodCl7dmFyIGU9W107dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBlLnByaW9yaXR5LXQucHJpb3JpdHl9KSk7dmFyIG49bmV3IHplKDAsMCwwLDApO2Z1bmN0aW9uIGkodCl7aWYoIXQuaWdub3JlKXt2YXIgZT10LmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpO251bGw9PWUuaWdub3JlJiYoZS5pZ25vcmU9ITEpfXQuaWdub3JlPSEwfWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbz10W3JdLGE9by5heGlzQWxpZ25lZCxzPW8ubG9jYWxSZWN0LGw9by50cmFuc2Zvcm0sdT1vLmxhYmVsLGg9by5sYWJlbExpbmU7bi5jb3B5KG8ucmVjdCksbi53aWR0aC09LjEsbi5oZWlnaHQtPS4xLG4ueCs9LjA1LG4ueSs9LjA1O2Zvcih2YXIgYz1vLm9iYixwPSExLGQ9MDtkPGUubGVuZ3RoO2QrKyl7dmFyIGY9ZVtkXTtpZihuLmludGVyc2VjdChmLnJlY3QpKXtpZihhJiZmLmF4aXNBbGlnbmVkKXtwPSEwO2JyZWFrfWlmKGYub2JifHwoZi5vYmI9bmV3IGNoKGYubG9jYWxSZWN0LGYudHJhbnNmb3JtKSksY3x8KGM9bmV3IGNoKHMsbCkpLGMuaW50ZXJzZWN0KGYub2JiKSl7cD0hMDticmVha319fXA/KGkodSksaCYmaShoKSk6KHUuYXR0cigiaWdub3JlIixvLmRlZmF1bHRBdHRyLmlnbm9yZSksaCYmaC5hdHRyKCJpZ25vcmUiLG8uZGVmYXVsdEF0dHIubGFiZWxHdWlkZUlnbm9yZSksZS5wdXNoKG8pKX19ZnVuY3Rpb24gRWIodCl7aWYodCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoO24rKyllLnB1c2godFtuXS5zbGljZSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gemIodCxlKXt2YXIgbj10LmxhYmVsLGk9ZSYmZS5nZXRUZXh0R3VpZGVMaW5lKCk7cmV0dXJue2RhdGFJbmRleDp0LmRhdGFJbmRleCxkYXRhVHlwZTp0LmRhdGFUeXBlLHNlcmllc0luZGV4OnQuc2VyaWVzTW9kZWwuc2VyaWVzSW5kZXgsdGV4dDp0LmxhYmVsLnN0eWxlLnRleHQscmVjdDp0Lmhvc3RSZWN0LGxhYmVsUmVjdDp0LnJlY3QsYWxpZ246bi5zdHlsZS5hbGlnbix2ZXJ0aWNhbEFsaWduOm4uc3R5bGUudmVydGljYWxBbGlnbixsYWJlbExpbmVQb2ludHM6RWIoaSYmaS5zaGFwZS5wb2ludHMpfX12YXIgVmI9WyJhbGlnbiIsInZlcnRpY2FsQWxpZ24iLCJ3aWR0aCIsImhlaWdodCIsImZvbnRTaXplIl0sQmI9bmV3IHZyLEZiPVZvKCksR2I9Vm8oKTtmdW5jdGlvbiBXYih0LGUsbil7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV07bnVsbCE9ZVtyXSYmKHRbcl09ZVtyXSl9fXZhciBIYj1bIngiLCJ5Iiwicm90YXRpb24iXSxZYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9sYWJlbExpc3Q9W10sdGhpcy5fY2hhcnRWaWV3TGlzdD1bXX1yZXR1cm4gdC5wcm90b3R5cGUuY2xlYXJMYWJlbHM9ZnVuY3Rpb24oKXt0aGlzLl9sYWJlbExpc3Q9W10sdGhpcy5fY2hhcnRWaWV3TGlzdD1bXX0sdC5wcm90b3R5cGUuX2FkZExhYmVsPWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89aS5zdHlsZSxhPWkuX19ob3N0VGFyZ2V0LnRleHRDb25maWd8fHt9LHM9aS5nZXRDb21wdXRlZFRyYW5zZm9ybSgpLGw9aS5nZXRCb3VuZGluZ1JlY3QoKS5wbGFpbigpO3plLmFwcGx5VHJhbnNmb3JtKGwsbCxzKSxzP0JiLnNldExvY2FsVHJhbnNmb3JtKHMpOihCYi54PUJiLnk9QmIucm90YXRpb249QmIub3JpZ2luWD1CYi5vcmlnaW5ZPTAsQmIuc2NhbGVYPUJiLnNjYWxlWT0xKSxCYi5yb3RhdGlvbj1ncyhCYi5yb3RhdGlvbik7dmFyIHUsaD1pLl9faG9zdFRhcmdldDtpZihoKXt1PWguZ2V0Qm91bmRpbmdSZWN0KCkucGxhaW4oKTt2YXIgYz1oLmdldENvbXB1dGVkVHJhbnNmb3JtKCk7emUuYXBwbHlUcmFuc2Zvcm0odSx1LGMpfXZhciBwPXUmJmguZ2V0VGV4dEd1aWRlTGluZSgpO3RoaXMuX2xhYmVsTGlzdC5wdXNoKHtsYWJlbDppLGxhYmVsTGluZTpwLHNlcmllc01vZGVsOm4sZGF0YUluZGV4OnQsZGF0YVR5cGU6ZSxsYXlvdXRPcHRpb246cixjb21wdXRlZExheW91dE9wdGlvbjpudWxsLHJlY3Q6bCxob3N0UmVjdDp1LHByaW9yaXR5OnU/dS53aWR0aCp1LmhlaWdodDowLGRlZmF1bHRBdHRyOntpZ25vcmU6aS5pZ25vcmUsbGFiZWxHdWlkZUlnbm9yZTpwJiZwLmlnbm9yZSx4OkJiLngseTpCYi55LHNjYWxlWDpCYi5zY2FsZVgsc2NhbGVZOkJiLnNjYWxlWSxyb3RhdGlvbjpCYi5yb3RhdGlvbixzdHlsZTp7eDpvLngseTpvLnksYWxpZ246by5hbGlnbix2ZXJ0aWNhbEFsaWduOm8udmVydGljYWxBbGlnbix3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodCxmb250U2l6ZTpvLmZvbnRTaXplfSxjdXJzb3I6aS5jdXJzb3IsYXR0YWNoZWRQb3M6YS5wb3NpdGlvbixhdHRhY2hlZFJvdDphLnJvdGF0aW9ufX0pfSx0LnByb3RvdHlwZS5hZGRMYWJlbHNPZlNlcmllcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX2NoYXJ0Vmlld0xpc3QucHVzaCh0KTt2YXIgbj10Ll9fbW9kZWwsaT1uLmdldCgibGFiZWxMYXlvdXQiKTsoWChpKXx8RyhpKS5sZW5ndGgpJiZ0Lmdyb3VwLnRyYXZlcnNlKChmdW5jdGlvbih0KXtpZih0Lmlnbm9yZSlyZXR1cm4hMDt2YXIgcj10LmdldFRleHRDb250ZW50KCksbz1ybCh0KTtyJiYhci5kaXNhYmxlTGFiZWxMYXlvdXQmJmUuX2FkZExhYmVsKG8uZGF0YUluZGV4LG8uZGF0YVR5cGUsbixyLGkpfSkpfSx0LnByb3RvdHlwZS51cGRhdGVMYXlvdXRDb25maWc9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRXaWR0aCgpLG49dC5nZXRIZWlnaHQoKTtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7U2IodCxlKX19Zm9yKHZhciByPTA7cjx0aGlzLl9sYWJlbExpc3QubGVuZ3RoO3IrKyl7dmFyIG89dGhpcy5fbGFiZWxMaXN0W3JdLGE9by5sYWJlbCxzPWEuX19ob3N0VGFyZ2V0LGw9by5kZWZhdWx0QXR0cix1PXZvaWQgMDt1PSh1PVgoby5sYXlvdXRPcHRpb24pP28ubGF5b3V0T3B0aW9uKHpiKG8scykpOm8ubGF5b3V0T3B0aW9uKXx8e30sby5jb21wdXRlZExheW91dE9wdGlvbj11O3ZhciBoPU1hdGguUEkvMTgwO3MmJnMuc2V0VGV4dENvbmZpZyh7bG9jYWw6ITEscG9zaXRpb246bnVsbCE9dS54fHxudWxsIT11Lnk/bnVsbDpsLmF0dGFjaGVkUG9zLHJvdGF0aW9uOm51bGwhPXUucm90YXRlP3Uucm90YXRlKmg6bC5hdHRhY2hlZFJvdCxvZmZzZXQ6W3UuZHh8fDAsdS5keXx8MF19KTt2YXIgYz0hMTtpZihudWxsIT11Lng/KGEueD0kcih1LngsZSksYS5zZXRTdHlsZSgieCIsMCksYz0hMCk6KGEueD1sLngsYS5zZXRTdHlsZSgieCIsbC5zdHlsZS54KSksbnVsbCE9dS55PyhhLnk9JHIodS55LG4pLGEuc2V0U3R5bGUoInkiLDApLGM9ITApOihhLnk9bC55LGEuc2V0U3R5bGUoInkiLGwuc3R5bGUueSkpLHUubGFiZWxMaW5lUG9pbnRzKXt2YXIgcD1zLmdldFRleHRHdWlkZUxpbmUoKTtwJiYocC5zZXRTaGFwZSh7cG9pbnRzOnUubGFiZWxMaW5lUG9pbnRzfSksYz0hMSl9RmIoYSkubmVlZHNVcGRhdGVMYWJlbExpbmU9YyxhLnJvdGF0aW9uPW51bGwhPXUucm90YXRlP3Uucm90YXRlKmg6bC5yb3RhdGlvbixhLnNjYWxlWD1sLnNjYWxlWCxhLnNjYWxlWT1sLnNjYWxlWTtmb3IodmFyIGQ9MDtkPFZiLmxlbmd0aDtkKyspe3ZhciBmPVZiW2RdO2Euc2V0U3R5bGUoZixudWxsIT11W2ZdP3VbZl06bC5zdHlsZVtmXSl9aWYodS5kcmFnZ2FibGUpe2lmKGEuZHJhZ2dhYmxlPSEwLGEuY3Vyc29yPSJtb3ZlIixzKXt2YXIgZz1vLnNlcmllc01vZGVsO2lmKG51bGwhPW8uZGF0YUluZGV4KWc9by5zZXJpZXNNb2RlbC5nZXREYXRhKG8uZGF0YVR5cGUpLmdldEl0ZW1Nb2RlbChvLmRhdGFJbmRleCk7YS5vbigiZHJhZyIsaShzLGcuZ2V0TW9kZWwoImxhYmVsTGluZSIpKSl9fWVsc2UgYS5vZmYoImRyYWciKSxhLmN1cnNvcj1sLmN1cnNvcn19LHQucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbih0KXt2YXIgZSxuPXQuZ2V0V2lkdGgoKSxpPXQuZ2V0SGVpZ2h0KCkscj1QYih0aGlzLl9sYWJlbExpc3QpLG89QihyLChmdW5jdGlvbih0KXtyZXR1cm4ic2hpZnRYIj09PXQubGF5b3V0T3B0aW9uLm1vdmVPdmVybGFwfSkpLGE9QihyLChmdW5jdGlvbih0KXtyZXR1cm4ic2hpZnRZIj09PXQubGF5b3V0T3B0aW9uLm1vdmVPdmVybGFwfSkpO09iKG8sIngiLCJ3aWR0aCIsMCxuLGUpLFJiKGEsMCxpKSxOYihCKHIsKGZ1bmN0aW9uKHQpe3JldHVybiB0LmxheW91dE9wdGlvbi5oaWRlT3ZlcmxhcH0pKSl9LHQucHJvdG90eXBlLnByb2Nlc3NMYWJlbHNPdmVyYWxsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztFKHRoaXMuX2NoYXJ0Vmlld0xpc3QsKGZ1bmN0aW9uKGUpe3ZhciBuPWUuX19tb2RlbCxpPWUuaWdub3JlTGFiZWxMaW5lVXBkYXRlLHI9bi5pc0FuaW1hdGlvbkVuYWJsZWQoKTtlLmdyb3VwLnRyYXZlcnNlKChmdW5jdGlvbihlKXtpZihlLmlnbm9yZSYmIWUuZm9yY2VMYWJlbEFuaW1hdGlvbilyZXR1cm4hMDt2YXIgbz0haSxhPWUuZ2V0VGV4dENvbnRlbnQoKTshbyYmYSYmKG89RmIoYSkubmVlZHNVcGRhdGVMYWJlbExpbmUpLG8mJnQuX3VwZGF0ZUxhYmVsTGluZShlLG4pLHImJnQuX2FuaW1hdGVMYWJlbHMoZSxuKX0pKX0pKX0sdC5wcm90b3R5cGUuX3VwZGF0ZUxhYmVsTGluZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0VGV4dENvbnRlbnQoKSxpPXJsKHQpLHI9aS5kYXRhSW5kZXg7aWYobiYmbnVsbCE9cil7dmFyIG89ZS5nZXREYXRhKGkuZGF0YVR5cGUpLGE9by5nZXRJdGVtTW9kZWwocikscz17fSxsPW8uZ2V0SXRlbVZpc3VhbChyLCJzdHlsZSIpO2lmKGwpe3ZhciB1PW8uZ2V0VmlzdWFsKCJkcmF3VHlwZSIpO3Muc3Ryb2tlPWxbdV19dmFyIGg9YS5nZXRNb2RlbCgibGFiZWxMaW5lIik7a2IodCxMYihhKSxzKSxTYih0LGgpfX0sdC5wcm90b3R5cGUuX2FuaW1hdGVMYWJlbHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldFRleHRDb250ZW50KCksaT10LmdldFRleHRHdWlkZUxpbmUoKTtpZihuJiYodC5mb3JjZUxhYmVsQW5pbWF0aW9ufHwhbi5pZ25vcmUmJiFuLmludmlzaWJsZSYmIXQuZGlzYWJsZUxhYmVsQW5pbWF0aW9uJiYheGgodCkpKXt2YXIgcj0oZD1GYihuKSkub2xkTGF5b3V0LG89cmwodCksYT1vLmRhdGFJbmRleCxzPXt4Om4ueCx5Om4ueSxyb3RhdGlvbjpuLnJvdGF0aW9ufSxsPWUuZ2V0RGF0YShvLmRhdGFUeXBlKTtpZihyKXtuLmF0dHIocik7dmFyIHU9dC5wcmV2U3RhdGVzO3UmJihQKHUsInNlbGVjdCIpPj0wJiZuLmF0dHIoZC5vbGRMYXlvdXRTZWxlY3QpLFAodSwiZW1waGFzaXMiKT49MCYmbi5hdHRyKGQub2xkTGF5b3V0RW1waGFzaXMpKSx2aChuLHMsZSxhKX1lbHNlIGlmKG4uYXR0cihzKSwhcGMobikudmFsdWVBbmltYXRpb24pe3ZhciBoPXJ0KG4uc3R5bGUub3BhY2l0eSwxKTtuLnN0eWxlLm9wYWNpdHk9MCxtaChuLHtzdHlsZTp7b3BhY2l0eTpofX0sZSxhKX1pZihkLm9sZExheW91dD1zLG4uc3RhdGVzLnNlbGVjdCl7dmFyIGM9ZC5vbGRMYXlvdXRTZWxlY3Q9e307V2IoYyxzLEhiKSxXYihjLG4uc3RhdGVzLnNlbGVjdCxIYil9aWYobi5zdGF0ZXMuZW1waGFzaXMpe3ZhciBwPWQub2xkTGF5b3V0RW1waGFzaXM9e307V2IocCxzLEhiKSxXYihwLG4uc3RhdGVzLmVtcGhhc2lzLEhiKX1mYyhuLGEsbCxlLGUpfWlmKGkmJiFpLmlnbm9yZSYmIWkuaW52aXNpYmxlKXtyPShkPUdiKGkpKS5vbGRMYXlvdXQ7dmFyIGQsZj17cG9pbnRzOmkuc2hhcGUucG9pbnRzfTtyPyhpLmF0dHIoe3NoYXBlOnJ9KSx2aChpLHtzaGFwZTpmfSxlKSk6KGkuc2V0U2hhcGUoZiksaS5zdHlsZS5zdHJva2VQZXJjZW50PTAsbWgoaSx7c3R5bGU6e3N0cm9rZVBlcmNlbnQ6MX19LGUpKSxkLm9sZExheW91dD1mfX0sdH0oKSxYYj1WbygpO3ZhciBVYj1NYXRoLnNpbixaYj1NYXRoLmNvcyxqYj1NYXRoLlBJLHFiPTIqTWF0aC5QSSxLYj0xODAvamIsJGI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbih0KXt0aGlzLl9zdGFydD0hMCx0aGlzLl9kPVtdLHRoaXMuX3N0cj0iIix0aGlzLl9wPU1hdGgucG93KDEwLHR8fDQpfSx0LnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24odCxlKXt0aGlzLl9hZGQoIk0iLHQsZSl9LHQucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbih0LGUpe3RoaXMuX2FkZCgiTCIsdCxlKX0sdC5wcm90b3R5cGUuYmV6aWVyQ3VydmVUbz1mdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fYWRkKCJDIix0LGUsbixpLHIsbyl9LHQucHJvdG90eXBlLnF1YWRyYXRpY0N1cnZlVG89ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fYWRkKCJRIix0LGUsbixpKX0sdC5wcm90b3R5cGUuYXJjPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLmVsbGlwc2UodCxlLG4sbiwwLGkscixvKX0sdC5wcm90b3R5cGUuZWxsaXBzZT1mdW5jdGlvbih0LGUsbixpLHIsbyxhLHMpe3ZhciBsPWEtbyx1PSFzLGg9TWF0aC5hYnMobCksYz1waShoLXFiKXx8KHU/bD49cWI6LWw+PXFiKSxwPWw+MD9sJXFiOmwlcWIrcWIsZD0hMTtkPSEhY3x8IXBpKGgpJiZwPj1qYj09ISF1O3ZhciBmPXQrbipaYihvKSxnPWUraSpVYihvKTt0aGlzLl9zdGFydCYmdGhpcy5fYWRkKCJNIixmLGcpO3ZhciB5PU1hdGgucm91bmQocipLYik7aWYoYyl7dmFyIHY9MS90aGlzLl9wLG09KHU/MTotMSkqKHFiLXYpO3RoaXMuX2FkZCgiQSIsbixpLHksMSwrdSx0K24qWmIobyttKSxlK2kqVWIobyttKSksdj4uMDEmJnRoaXMuX2FkZCgiQSIsbixpLHksMCwrdSxmLGcpfWVsc2V7dmFyIHg9dCtuKlpiKGEpLF89ZStpKlViKGEpO3RoaXMuX2FkZCgiQSIsbixpLHksK2QsK3UseCxfKX19LHQucHJvdG90eXBlLnJlY3Q9ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fYWRkKCJNIix0LGUpLHRoaXMuX2FkZCgibCIsbiwwKSx0aGlzLl9hZGQoImwiLDAsaSksdGhpcy5fYWRkKCJsIiwtbiwwKSx0aGlzLl9hZGQoIloiKX0sdC5wcm90b3R5cGUuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5fZC5sZW5ndGg+MCYmdGhpcy5fYWRkKCJaIil9LHQucHJvdG90eXBlLl9hZGQ9ZnVuY3Rpb24odCxlLG4saSxyLG8sYSxzLGwpe2Zvcih2YXIgdT1bXSxoPXRoaXMuX3AsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBwPWFyZ3VtZW50c1tjXTtpZihpc05hTihwKSlyZXR1cm4gdm9pZCh0aGlzLl9pbnZhbGlkPSEwKTt1LnB1c2goTWF0aC5yb3VuZChwKmgpL2gpfXRoaXMuX2QucHVzaCh0K3Uuam9pbigiICIpKSx0aGlzLl9zdGFydD0iWiI9PT10fSx0LnByb3RvdHlwZS5nZW5lcmF0ZVN0cj1mdW5jdGlvbigpe3RoaXMuX3N0cj10aGlzLl9pbnZhbGlkPyIiOnRoaXMuX2Quam9pbigiIiksdGhpcy5fZD1bXX0sdC5wcm90b3R5cGUuZ2V0U3RyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0cn0sdH0oKSxKYj0ibm9uZSIsUWI9TWF0aC5yb3VuZDt2YXIgdHc9WyJsaW5lQ2FwIiwibWl0ZXJMaW1pdCIsImxpbmVKb2luIl0sZXc9eih0dywoZnVuY3Rpb24odCl7cmV0dXJuInN0cm9rZS0iK3QudG9Mb3dlckNhc2UoKX0pKTtmdW5jdGlvbiBudyh0LGUsbixpKXt2YXIgcj1udWxsPT1lLm9wYWNpdHk/MTplLm9wYWNpdHk7aWYobiBpbnN0YW5jZW9mIE5zKXQoIm9wYWNpdHkiLHIpO2Vsc2V7aWYoZnVuY3Rpb24odCl7dmFyIGU9dC5maWxsO3JldHVybiBudWxsIT1lJiZlIT09SmJ9KGUpKXt2YXIgbz1oaShlLmZpbGwpO3QoImZpbGwiLG8uY29sb3IpO3ZhciBhPW51bGwhPWUuZmlsbE9wYWNpdHk/ZS5maWxsT3BhY2l0eSpvLm9wYWNpdHkqcjpvLm9wYWNpdHkqcjsoaXx8YTwxKSYmdCgiZmlsbC1vcGFjaXR5IixhKX1lbHNlIHQoImZpbGwiLEpiKTtpZihmdW5jdGlvbih0KXt2YXIgZT10LnN0cm9rZTtyZXR1cm4gbnVsbCE9ZSYmZSE9PUpifShlKSl7dmFyIHM9aGkoZS5zdHJva2UpO3QoInN0cm9rZSIscy5jb2xvcik7dmFyIGw9ZS5zdHJva2VOb1NjYWxlP24uZ2V0TGluZVNjYWxlKCk6MSx1PWw/KGUubGluZVdpZHRofHwwKS9sOjAsaD1udWxsIT1lLnN0cm9rZU9wYWNpdHk/ZS5zdHJva2VPcGFjaXR5KnMub3BhY2l0eSpyOnMub3BhY2l0eSpyLGM9ZS5zdHJva2VGaXJzdDtpZigoaXx8MSE9PXUpJiZ0KCJzdHJva2Utd2lkdGgiLHUpLChpfHxjKSYmdCgicGFpbnQtb3JkZXIiLGM/InN0cm9rZSI6ImZpbGwiKSwoaXx8aDwxKSYmdCgic3Ryb2tlLW9wYWNpdHkiLGgpLGUubGluZURhc2gpe3ZhciBwPUp5KG4pLGQ9cFswXSxmPXBbMV07ZCYmKGY9UWIoZnx8MCksdCgic3Ryb2tlLWRhc2hhcnJheSIsZC5qb2luKCIsIikpLChmfHxpKSYmdCgic3Ryb2tlLWRhc2hvZmZzZXQiLGYpKX1lbHNlIGkmJnQoInN0cm9rZS1kYXNoYXJyYXkiLEpiKTtmb3IodmFyIGc9MDtnPHR3Lmxlbmd0aDtnKyspe3ZhciB5PXR3W2ddO2lmKGl8fGVbeV0hPT1Dc1t5XSl7dmFyIHY9ZVt5XXx8Q3NbeV07diYmdChld1tnXSx2KX19fWVsc2UgaSYmdCgic3Ryb2tlIixKYil9fXZhciBpdz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHJ3PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIixvdz0iZWNtZXRhXyI7ZnVuY3Rpb24gYXcodCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhpdyx0KX1mdW5jdGlvbiBzdyh0LGUsbixpLHIpe3JldHVybnt0YWc6dCxhdHRyczpufHx7fSxjaGlsZHJlbjppLHRleHQ6cixrZXk6ZX19ZnVuY3Rpb24gbHcodCxlKXt2YXIgbj0oZT1lfHx7fSkubmV3bGluZT8iXG4iOiIiO3JldHVybiBmdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW4scj1lLnRhZyxvPWUuYXR0cnMsYT1lLnRleHQ7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49W107aWYoZSlmb3IodmFyIGkgaW4gZSl7dmFyIHI9ZVtpXSxvPWk7ITEhPT1yJiYoITAhPT1yJiZudWxsIT1yJiYobys9Jz0iJytyKyciJyksbi5wdXNoKG8pKX1yZXR1cm4iPCIrdCsiICIrbi5qb2luKCIgIikrIj4ifShyLG8pKygic3R5bGUiIT09cj9yZShhKTphfHwiIikrKGk/IiIrbit6KGksKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfSkpLmpvaW4obikrbjoiIikrKCI8LyIrcisiPiIpfSh0KX1mdW5jdGlvbiB1dyh0KXtyZXR1cm57enJJZDp0LHNoYWRvd0NhY2hlOnt9LHBhdHRlcm5DYWNoZTp7fSxncmFkaWVudENhY2hlOnt9LGNsaXBQYXRoQ2FjaGU6e30sZGVmczp7fSxjc3NOb2Rlczp7fSxjc3NBbmltczp7fSxjc3NTdHlsZUNhY2hlOnt9LGNzc0FuaW1JZHg6MCxzaGFkb3dJZHg6MCxncmFkaWVudElkeDowLHBhdHRlcm5JZHg6MCxjbGlwUGF0aElkeDowfX1mdW5jdGlvbiBodyh0LGUsbixpKXtyZXR1cm4gc3coInN2ZyIsInJvb3QiLHt3aWR0aDp0LGhlaWdodDplLHhtbG5zOml3LCJ4bWxuczp4bGluayI6cncsdmVyc2lvbjoiMS4xIixiYXNlUHJvZmlsZToiZnVsbCIsdmlld0JveDohIWkmJiIwIDAgIit0KyIgIitlfSxuKX12YXIgY3c9MDtmdW5jdGlvbiBwdygpe3JldHVybiBjdysrfXZhciBkdz17Y3ViaWNJbjoiMC4zMiwwLDAuNjcsMCIsY3ViaWNPdXQ6IjAuMzMsMSwwLjY4LDEiLGN1YmljSW5PdXQ6IjAuNjUsMCwwLjM1LDEiLHF1YWRyYXRpY0luOiIwLjExLDAsMC41LDAiLHF1YWRyYXRpY091dDoiMC41LDEsMC44OSwxIixxdWFkcmF0aWNJbk91dDoiMC40NSwwLDAuNTUsMSIscXVhcnRpY0luOiIwLjUsMCwwLjc1LDAiLHF1YXJ0aWNPdXQ6IjAuMjUsMSwwLjUsMSIscXVhcnRpY0luT3V0OiIwLjc2LDAsMC4yNCwxIixxdWludGljSW46IjAuNjQsMCwwLjc4LDAiLHF1aW50aWNPdXQ6IjAuMjIsMSwwLjM2LDEiLHF1aW50aWNJbk91dDoiMC44MywwLDAuMTcsMSIsc2ludXNvaWRhbEluOiIwLjEyLDAsMC4zOSwwIixzaW51c29pZGFsT3V0OiIwLjYxLDEsMC44OCwxIixzaW51c29pZGFsSW5PdXQ6IjAuMzcsMCwwLjYzLDEiLGV4cG9uZW50aWFsSW46IjAuNywwLDAuODQsMCIsZXhwb25lbnRpYWxPdXQ6IjAuMTYsMSwwLjMsMSIsZXhwb25lbnRpYWxJbk91dDoiMC44NywwLDAuMTMsMSIsY2lyY3VsYXJJbjoiMC41NSwwLDEsMC40NSIsY2lyY3VsYXJPdXQ6IjAsMC41NSwwLjQ1LDEiLGNpcmN1bGFySW5PdXQ6IjAuODUsMCwwLjE1LDEifSxmdz0idHJhbnNmb3JtLW9yaWdpbiI7ZnVuY3Rpb24gZ3codCxlLG4pe3ZhciBpPUEoe30sdC5zaGFwZSk7QShpLGUpLHQuYnVpbGRQYXRoKG4saSk7dmFyIHI9bmV3ICRiO3JldHVybiByLnJlc2V0KHdpKHQpKSxuLnJlYnVpbGRQYXRoKHIsMSksci5nZW5lcmF0ZVN0cigpLHIuZ2V0U3RyKCl9ZnVuY3Rpb24geXcodCxlKXt2YXIgbj1lLm9yaWdpblgsaT1lLm9yaWdpblk7KG58fGkpJiYodFtmd109bisicHggIitpKyJweCIpfXZhciB2dz17ZmlsbDoiZmlsbCIsb3BhY2l0eToib3BhY2l0eSIsbGluZVdpZHRoOiJzdHJva2Utd2lkdGgiLGxpbmVEYXNoT2Zmc2V0OiJzdHJva2UtZGFzaG9mZnNldCJ9O2Z1bmN0aW9uIG13KHQsZSl7dmFyIG49ZS56cklkKyItYW5pLSIrZS5jc3NBbmltSWR4Kys7cmV0dXJuIGUuY3NzQW5pbXNbbl09dCxufWZ1bmN0aW9uIHh3KHQpe3JldHVybiBVKHQpP2R3W3RdPyJjdWJpYy1iZXppZXIoIitkd1t0XSsiKSI6UG4odCk/dDoiIjoiIn1mdW5jdGlvbiBfdyh0LGUsbixpKXt2YXIgcj10LmFuaW1hdG9ycyxvPXIubGVuZ3RoLGE9W107aWYodCBpbnN0YW5jZW9mIGloKXt2YXIgcz1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvPXQuc2hhcGUucGF0aHMsYT17fTtpZihFKG8sKGZ1bmN0aW9uKHQpe3ZhciBlPXV3KG4uenJJZCk7ZS5hbmltYXRpb249ITAsX3codCx7fSxlLCEwKTt2YXIgbz1lLmNzc0FuaW1zLHM9ZS5jc3NOb2RlcyxsPUcobyksdT1sLmxlbmd0aDtpZih1KXt2YXIgaD1vW3I9bFt1LTFdXTtmb3IodmFyIGMgaW4gaCl7dmFyIHA9aFtjXTthW2NdPWFbY118fHtkOiIifSxhW2NdLmQrPXAuZHx8IiJ9Zm9yKHZhciBkIGluIHMpe3ZhciBmPXNbZF0uYW5pbWF0aW9uO2YuaW5kZXhPZihyKT49MCYmKGk9Zil9fX0pKSxpKXtlLmQ9ITE7dmFyIHM9bXcoYSxuKTtyZXR1cm4gaS5yZXBsYWNlKHIscyl9fSh0LGUsbik7aWYocylhLnB1c2gocyk7ZWxzZSBpZighbylyZXR1cm59ZWxzZSBpZighbylyZXR1cm47Zm9yKHZhciBsPXt9LHU9MDt1PG87dSsrKXt2YXIgaD1yW3VdLGM9W2guZ2V0TWF4VGltZSgpLzFlMysicyJdLHA9eHcoaC5nZXRDbGlwKCkuZWFzaW5nKSxkPWguZ2V0RGVsYXkoKTtwP2MucHVzaChwKTpjLnB1c2goImxpbmVhciIpLGQmJmMucHVzaChkLzFlMysicyIpLGguZ2V0TG9vcCgpJiZjLnB1c2goImluZmluaXRlIik7dmFyIGY9Yy5qb2luKCIgIik7bFtmXT1sW2ZdfHxbZixbXV0sbFtmXVsxXS5wdXNoKGgpfWZ1bmN0aW9uIGcocil7dmFyIG8sYT1yWzFdLHM9YS5sZW5ndGgsbD17fSx1PXt9LGg9e30sYz0iYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiI7ZnVuY3Rpb24gcCh0LGUsbil7Zm9yKHZhciBpPXQuZ2V0VHJhY2tzKCkscj10LmdldE1heFRpbWUoKSxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYS5uZWVkc0FuaW1hdGUoKSl7dmFyIHM9YS5rZXlmcmFtZXMsbD1hLnByb3BOYW1lO2lmKG4mJihsPW4obCkpLGwpZm9yKHZhciB1PTA7dTxzLmxlbmd0aDt1Kyspe3ZhciBoPXNbdV0scD1NYXRoLnJvdW5kKGgudGltZS9yKjEwMCkrIiUiLGQ9eHcoaC5lYXNpbmcpLGY9aC5yYXdWYWx1ZTsoVShmKXx8aihmKSkmJihlW3BdPWVbcF18fHt9LGVbcF1bbF09aC5yYXdWYWx1ZSxkJiYoZVtwXVtjXT1kKSl9fX19Zm9yKHZhciBkPTA7ZDxzO2QrKyl7KFM9KHc9YVtkXSkudGFyZ2V0TmFtZSk/InNoYXBlIj09PVMmJnAodyx1KTohaSYmcCh3LGwpfWZvcih2YXIgZiBpbiBsKXt2YXIgZz17fTt4cihnLHQpLEEoZyxsW2ZdKTt2YXIgeT1TaShnKSx2PWxbZl1bY107aFtmXT15P3t0cmFuc2Zvcm06eX06e30seXcoaFtmXSxnKSx2JiYoaFtmXVtjXT12KX12YXIgbT0hMDtmb3IodmFyIGYgaW4gdSl7aFtmXT1oW2ZdfHx7fTt2YXIgeD0hbzt2PXVbZl1bY107eCYmKG89bmV3IGhzKTt2YXIgXz1vLmxlbigpO28ucmVzZXQoKSxoW2ZdLmQ9Z3codCx1W2ZdLG8pO3ZhciBiPW8ubGVuKCk7aWYoIXgmJl8hPT1iKXttPSExO2JyZWFrfXYmJihoW2ZdW2NdPXYpfWlmKCFtKWZvcih2YXIgZiBpbiBoKWRlbGV0ZSBoW2ZdLmQ7aWYoIWkpZm9yKGQ9MDtkPHM7ZCsrKXt2YXIgdyxTOyJzdHlsZSI9PT0oUz0odz1hW2RdKS50YXJnZXROYW1lKSYmcCh3LGgsKGZ1bmN0aW9uKHQpe3JldHVybiB2d1t0XX0pKX12YXIgTSxJPUcoaCksVD0hMDtmb3IoZD0xO2Q8SS5sZW5ndGg7ZCsrKXt2YXIgQz1JW2QtMV0sRD1JW2RdO2lmKGhbQ11bZnddIT09aFtEXVtmd10pe1Q9ITE7YnJlYWt9TT1oW0NdW2Z3XX1pZihUJiZNKXtmb3IodmFyIGYgaW4gaCloW2ZdW2Z3XSYmZGVsZXRlIGhbZl1bZnddO2VbZnddPU19aWYoQihJLChmdW5jdGlvbih0KXtyZXR1cm4gRyhoW3RdKS5sZW5ndGg+MH0pKS5sZW5ndGgpcmV0dXJuIG13KGgsbikrIiAiK3JbMF0rIiBib3RoIn1mb3IodmFyIHkgaW4gbCl7KHM9ZyhsW3ldKSkmJmEucHVzaChzKX1pZihhLmxlbmd0aCl7dmFyIHY9bi56cklkKyItY2xzLSIrcHcoKTtuLmNzc05vZGVzWyIuIit2XT17YW5pbWF0aW9uOmEuam9pbigiLCIpfSxlLmNsYXNzPXZ9fWZ1bmN0aW9uIGJ3KHQsZSxuLGkpe3ZhciByPUpTT04uc3RyaW5naWZ5KHQpLG89bi5jc3NTdHlsZUNhY2hlW3JdO298fChvPW4uenJJZCsiLWNscy0iK3B3KCksbi5jc3NTdHlsZUNhY2hlW3JdPW8sbi5jc3NOb2Rlc1siLiIrbysoaT8iOmhvdmVyIjoiIildPXQpLGUuY2xhc3M9ZS5jbGFzcz9lLmNsYXNzKyIgIitvOm99dmFyIHd3PU1hdGgucm91bmQ7ZnVuY3Rpb24gU3codCl7cmV0dXJuIHQmJlUodC5zcmMpfWZ1bmN0aW9uIE13KHQpe3JldHVybiB0JiZYKHQudG9EYXRhVVJMKX1mdW5jdGlvbiBJdyh0LGUsbixpKXtudygoZnVuY3Rpb24ocixvKXt2YXIgYT0iZmlsbCI9PT1yfHwic3Ryb2tlIj09PXI7YSYmX2kobyk/RXcoZSx0LHIsaSk6YSYmdmkobyk/encobix0LHIsaSk6dFtyXT1hJiYibm9uZSI9PT1vPyJ0cmFuc3BhcmVudCI6b30pLGUsbiwhMSksZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuc3R5bGU7aWYoZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0LnNoYWRvd0JsdXJ8fHQuc2hhZG93T2Zmc2V0WHx8dC5zaGFkb3dPZmZzZXRZKX0oaSkpe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3R5bGUsbj10LmdldEdsb2JhbFNjYWxlKCk7cmV0dXJuW2Uuc2hhZG93Q29sb3IsKGUuc2hhZG93Qmx1cnx8MCkudG9GaXhlZCgyKSwoZS5zaGFkb3dPZmZzZXRYfHwwKS50b0ZpeGVkKDIpLChlLnNoYWRvd09mZnNldFl8fDApLnRvRml4ZWQoMiksblswXSxuWzFdXS5qb2luKCIsIil9KHQpLG89bi5zaGFkb3dDYWNoZSxhPW9bcl07aWYoIWEpe3ZhciBzPXQuZ2V0R2xvYmFsU2NhbGUoKSxsPXNbMF0sdT1zWzFdO2lmKCFsfHwhdSlyZXR1cm47dmFyIGg9aS5zaGFkb3dPZmZzZXRYfHwwLGM9aS5zaGFkb3dPZmZzZXRZfHwwLHA9aS5zaGFkb3dCbHVyLGQ9aGkoaS5zaGFkb3dDb2xvciksZj1kLm9wYWNpdHksZz1kLmNvbG9yLHk9cC8yL2wrIiAiK3AvMi91O2E9bi56cklkKyItcyIrbi5zaGFkb3dJZHgrKyxuLmRlZnNbYV09c3coImZpbHRlciIsYSx7aWQ6YSx4OiItMTAwJSIseToiLTEwMCUiLHdpZHRoOiIzMDAlIixoZWlnaHQ6IjMwMCUifSxbc3coImZlRHJvcFNoYWRvdyIsIiIse2R4OmgvbCxkeTpjL3Usc3RkRGV2aWF0aW9uOnksImZsb29kLWNvbG9yIjpnLCJmbG9vZC1vcGFjaXR5IjpmfSldKSxvW3JdPWF9ZS5maWx0ZXI9YmkoYSl9fShuLHQsaSl9ZnVuY3Rpb24gVHcodCxlKXt2YXIgbj1VcihlKTtuJiYobi5lYWNoKChmdW5jdGlvbihlLG4pe251bGwhPWUmJih0WyhvdytuKS50b0xvd2VyQ2FzZSgpXT1lKyIiKX0pKSxlLmlzU2lsZW50KCkmJih0W293KyJzaWxlbnQiXT0idHJ1ZSIpKX1mdW5jdGlvbiBDdyh0KXtyZXR1cm4gcGkodFswXS0xKSYmcGkodFsxXSkmJnBpKHRbMl0pJiZwaSh0WzNdLTEpfWZ1bmN0aW9uIER3KHQsZSxuKXtpZihlJiYoIWZ1bmN0aW9uKHQpe3JldHVybiBwaSh0WzRdKSYmcGkodFs1XSl9KGUpfHwhQ3coZSkpKXt2YXIgaT1uPzEwOjFlNDt0LnRyYW5zZm9ybT1DdyhlKT8idHJhbnNsYXRlKCIrd3coZVs0XSppKS9pKyIgIit3dyhlWzVdKmkpL2krIikiOmZ1bmN0aW9uKHQpe3JldHVybiJtYXRyaXgoIitkaSh0WzBdKSsiLCIrZGkodFsxXSkrIiwiK2RpKHRbMl0pKyIsIitkaSh0WzNdKSsiLCIrZmkodFs0XSkrIiwiK2ZpKHRbNV0pKyIpIn0oZSl9fWZ1bmN0aW9uIEF3KHQsZSxuKXtmb3IodmFyIGk9dC5wb2ludHMscj1bXSxvPTA7bzxpLmxlbmd0aDtvKyspci5wdXNoKHd3KGlbb11bMF0qbikvbiksci5wdXNoKHd3KGlbb11bMV0qbikvbik7ZS5wb2ludHM9ci5qb2luKCIgIil9ZnVuY3Rpb24ga3codCl7cmV0dXJuIXQuc21vb3RofXZhciBMdyxQdyxPdz17Y2lyY2xlOlsoTHc9WyJjeCIsImN5IiwiciJdLFB3PXooTHcsKGZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9bdCx0XTp0fSkpLGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9MDtpPFB3Lmxlbmd0aDtpKyspe3ZhciByPVB3W2ldLG89dFtyWzBdXTtudWxsIT1vJiYoZVtyWzFdXT13dyhvKm4pL24pfX0pXSxwb2x5bGluZTpbQXcsa3ddLHBvbHlnb246W0F3LGt3XX07ZnVuY3Rpb24gUncodCxlKXt2YXIgbj10LnN0eWxlLGk9dC5zaGFwZSxyPU93W3QudHlwZV0sbz17fSxhPWUuYW5pbWF0aW9uLHM9InBhdGgiLGw9dC5zdHlsZS5zdHJva2VQZXJjZW50LHU9ZS5jb21wcmVzcyYmd2kodCl8fDQ7aWYoIXJ8fGUud2lsbFVwZGF0ZXx8clsxXSYmIXJbMV0oaSl8fGEmJmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmFuaW1hdG9ycyxuPTA7bjxlLmxlbmd0aDtuKyspaWYoInNoYXBlIj09PWVbbl0udGFyZ2V0TmFtZSlyZXR1cm4hMDtyZXR1cm4hMX0odCl8fGw8MSl7dmFyIGg9IXQucGF0aHx8dC5zaGFwZUNoYW5nZWQoKTt0LnBhdGh8fHQuY3JlYXRlUGF0aFByb3h5KCk7dmFyIGM9dC5wYXRoO2gmJihjLmJlZ2luUGF0aCgpLHQuYnVpbGRQYXRoKGMsdC5zaGFwZSksdC5wYXRoVXBkYXRlZCgpKTt2YXIgcD1jLmdldFZlcnNpb24oKSxkPXQsZj1kLl9fc3ZnUGF0aEJ1aWxkZXI7ZC5fX3N2Z1BhdGhWZXJzaW9uPT09cCYmZiYmbD09PWQuX19zdmdQYXRoU3Ryb2tlUGVyY2VudHx8KGZ8fChmPWQuX19zdmdQYXRoQnVpbGRlcj1uZXcgJGIpLGYucmVzZXQodSksYy5yZWJ1aWxkUGF0aChmLGwpLGYuZ2VuZXJhdGVTdHIoKSxkLl9fc3ZnUGF0aFZlcnNpb249cCxkLl9fc3ZnUGF0aFN0cm9rZVBlcmNlbnQ9bCksby5kPWYuZ2V0U3RyKCl9ZWxzZXtzPXQudHlwZTt2YXIgZz1NYXRoLnBvdygxMCx1KTtyWzBdKGksbyxnKX1yZXR1cm4gRHcobyx0LnRyYW5zZm9ybSksSXcobyxuLHQsZSksVHcobyx0KSxlLmFuaW1hdGlvbiYmX3codCxvLGUpLGUuZW1waGFzaXMmJmZ1bmN0aW9uKHQsZSxuKXtpZighdC5pZ25vcmUpaWYodC5pc1NpbGVudCgpKWJ3KHU9eyJwb2ludGVyLWV2ZW50cyI6Im5vbmUifSxlLG4sITApO2Vsc2V7dmFyIGk9dC5zdGF0ZXMuZW1waGFzaXMmJnQuc3RhdGVzLmVtcGhhc2lzLnN0eWxlP3Quc3RhdGVzLmVtcGhhc2lzLnN0eWxlOnt9LHI9aS5maWxsO2lmKCFyKXt2YXIgbz10LnN0eWxlJiZ0LnN0eWxlLmZpbGwsYT10LnN0YXRlcy5zZWxlY3QmJnQuc3RhdGVzLnNlbGVjdC5zdHlsZSYmdC5zdGF0ZXMuc2VsZWN0LnN0eWxlLmZpbGwscz10LmN1cnJlbnRTdGF0ZXMuaW5kZXhPZigic2VsZWN0Iik+PTAmJmF8fG87cyYmKHI9c2kocykpfXZhciBsPWkubGluZVdpZHRoO2wmJihsLz0haS5zdHJva2VOb1NjYWxlJiZ0LnRyYW5zZm9ybT90LnRyYW5zZm9ybVswXToxKTt2YXIgdT17Y3Vyc29yOiJwb2ludGVyIn07ciYmKHUuZmlsbD1yKSxpLnN0cm9rZSYmKHUuc3Ryb2tlPWkuc3Ryb2tlKSxsJiYodVsic3Ryb2tlLXdpZHRoIl09bCksYncodSxlLG4sITApfX0odCxvLGUpLHN3KHMsdC5pZCsiIixvKX1mdW5jdGlvbiBOdyh0LGUpe3JldHVybiB0IGluc3RhbmNlb2Yga3M/UncodCxlKTp0IGluc3RhbmNlb2YgTnM/ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0eWxlLGk9bi5pbWFnZTtpZihpJiYhVShpKSYmKFN3KGkpP2k9aS5zcmM6TXcoaSkmJihpPWkudG9EYXRhVVJMKCkpKSxpKXt2YXIgcj1uLnh8fDAsbz1uLnl8fDAsYT17aHJlZjppLHdpZHRoOm4ud2lkdGgsaGVpZ2h0Om4uaGVpZ2h0fTtyZXR1cm4gciYmKGEueD1yKSxvJiYoYS55PW8pLER3KGEsdC50cmFuc2Zvcm0pLEl3KGEsbix0LGUpLFR3KGEsdCksZS5hbmltYXRpb24mJl93KHQsYSxlKSxzdygiaW1hZ2UiLHQuaWQrIiIsYSl9fSh0LGUpOnQgaW5zdGFuY2VvZiBQcz9mdW5jdGlvbih0LGUpe3ZhciBuPXQuc3R5bGUsaT1uLnRleHQ7aWYobnVsbCE9aSYmKGkrPSIiKSxpJiYhaXNOYU4obi54KSYmIWlzTmFOKG4ueSkpe3ZhciByPW4uZm9udHx8YSxzPW4ueHx8MCxsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4idG9wIj09PW4/dCs9ZS8yOiJib3R0b20iPT09biYmKHQtPWUvMiksdH0obi55fHwwLFRyKHIpLG4udGV4dEJhc2VsaW5lKSx1PXsiZG9taW5hbnQtYmFzZWxpbmUiOiJjZW50cmFsIiwidGV4dC1hbmNob3IiOmdpW24udGV4dEFsaWduXXx8bi50ZXh0QWxpZ259O2lmKCRzKG4pKXt2YXIgaD0iIixjPW4uZm9udFN0eWxlLHA9cXMobi5mb250U2l6ZSk7aWYoIXBhcnNlRmxvYXQocCkpcmV0dXJuO3ZhciBkPW4uZm9udEZhbWlseXx8byxmPW4uZm9udFdlaWdodDtoKz0iZm9udC1zaXplOiIrcCsiO2ZvbnQtZmFtaWx5OiIrZCsiOyIsYyYmIm5vcm1hbCIhPT1jJiYoaCs9ImZvbnQtc3R5bGU6IitjKyI7IiksZiYmIm5vcm1hbCIhPT1mJiYoaCs9ImZvbnQtd2VpZ2h0OiIrZisiOyIpLHUuc3R5bGU9aH1lbHNlIHUuc3R5bGU9ImZvbnQ6ICIrcjtyZXR1cm4gaS5tYXRjaCgvXHMvKSYmKHVbInhtbDpzcGFjZSJdPSJwcmVzZXJ2ZSIpLHMmJih1Lng9cyksbCYmKHUueT1sKSxEdyh1LHQudHJhbnNmb3JtKSxJdyh1LG4sdCxlKSxUdyh1LHQpLGUuYW5pbWF0aW9uJiZfdyh0LHUsZSksc3coInRleHQiLHQuaWQrIiIsdSx2b2lkIDAsaSl9fSh0LGUpOnZvaWQgMH1mdW5jdGlvbiBFdyh0LGUsbixpKXt2YXIgcixvPXRbbl0sYT17Z3JhZGllbnRVbml0czpvLmdsb2JhbD8idXNlclNwYWNlT25Vc2UiOiJvYmplY3RCb3VuZGluZ0JveCJ9O2lmKG1pKG8pKXI9ImxpbmVhckdyYWRpZW50IixhLngxPW8ueCxhLnkxPW8ueSxhLngyPW8ueDIsYS55Mj1vLnkyO2Vsc2V7aWYoIXhpKG8pKXJldHVybiB2b2lkIDA7cj0icmFkaWFsR3JhZGllbnQiLGEuY3g9cnQoby54LC41KSxhLmN5PXJ0KG8ueSwuNSksYS5yPXJ0KG8uciwuNSl9Zm9yKHZhciBzPW8uY29sb3JTdG9wcyxsPVtdLHU9MCxoPXMubGVuZ3RoO3U8aDsrK3Upe3ZhciBjPTEwMCpmaShzW3VdLm9mZnNldCkrIiUiLHA9aGkoc1t1XS5jb2xvciksZD1wLmNvbG9yLGY9cC5vcGFjaXR5LGc9e29mZnNldDpjfTtnWyJzdG9wLWNvbG9yIl09ZCxmPDEmJihnWyJzdG9wLW9wYWNpdHkiXT1mKSxsLnB1c2goc3coInN0b3AiLHUrIiIsZykpfXZhciB5PWx3KHN3KHIsIiIsYSxsKSksdj1pLmdyYWRpZW50Q2FjaGUsbT12W3ldO218fChtPWkuenJJZCsiLWciK2kuZ3JhZGllbnRJZHgrKyx2W3ldPW0sYS5pZD1tLGkuZGVmc1ttXT1zdyhyLG0sYSxsKSksZVtuXT1iaShtKX1mdW5jdGlvbiB6dyh0LGUsbixpKXt2YXIgcixvPXQuc3R5bGVbbl0sYT10LmdldEJvdW5kaW5nUmVjdCgpLHM9e30sbD1vLnJlcGVhdCx1PSJuby1yZXBlYXQiPT09bCxoPSJyZXBlYXQteCI9PT1sLGM9InJlcGVhdC15Ij09PWw7aWYoeWkobykpe3ZhciBwPW8uaW1hZ2VXaWR0aCxkPW8uaW1hZ2VIZWlnaHQsZj12b2lkIDAsZz1vLmltYWdlO2lmKFUoZyk/Zj1nOlN3KGcpP2Y9Zy5zcmM6TXcoZykmJihmPWcudG9EYXRhVVJMKCkpLCJ1bmRlZmluZWQiPT10eXBlb2YgSW1hZ2Upe3ZhciB5PSJJbWFnZSB3aWR0aC9oZWlnaHQgbXVzdCBiZWVuIGdpdmVuIGV4cGxpY3RseSBpbiBzdmctc3NyIHJlbmRlcmVyLiI7bHQocCx5KSxsdChkLHkpfWVsc2UgaWYobnVsbD09cHx8bnVsbD09ZCl7dmFyIHY9ZnVuY3Rpb24odCxlKXtpZih0KXt2YXIgbj10LmVsbSxpPXB8fGUud2lkdGgscj1kfHxlLmhlaWdodDsicGF0dGVybiI9PT10LnRhZyYmKGg/KHI9MSxpLz1hLndpZHRoKTpjJiYoaT0xLHIvPWEuaGVpZ2h0KSksdC5hdHRycy53aWR0aD1pLHQuYXR0cnMuaGVpZ2h0PXIsbiYmKG4uc2V0QXR0cmlidXRlKCJ3aWR0aCIsaSksbi5zZXRBdHRyaWJ1dGUoImhlaWdodCIscikpfX0sbT1sYShmLG51bGwsdCwoZnVuY3Rpb24odCl7dXx8dih3LHQpLHYocix0KX0pKTttJiZtLndpZHRoJiZtLmhlaWdodCYmKHA9cHx8bS53aWR0aCxkPWR8fG0uaGVpZ2h0KX1yPXN3KCJpbWFnZSIsImltZyIse2hyZWY6Zix3aWR0aDpwLGhlaWdodDpkfSkscy53aWR0aD1wLHMuaGVpZ2h0PWR9ZWxzZSBvLnN2Z0VsZW1lbnQmJihyPVQoby5zdmdFbGVtZW50KSxzLndpZHRoPW8uc3ZnV2lkdGgscy5oZWlnaHQ9by5zdmdIZWlnaHQpO2lmKHIpe3ZhciB4LF87dT94PV89MTpoPyhfPTEseD1zLndpZHRoL2Eud2lkdGgpOmM/KHg9MSxfPXMuaGVpZ2h0L2EuaGVpZ2h0KTpzLnBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiLG51bGw9PXh8fGlzTmFOKHgpfHwocy53aWR0aD14KSxudWxsPT1ffHxpc05hTihfKXx8KHMuaGVpZ2h0PV8pO3ZhciBiPVNpKG8pO2ImJihzLnBhdHRlcm5UcmFuc2Zvcm09Yik7dmFyIHc9c3coInBhdHRlcm4iLCIiLHMsW3JdKSxTPWx3KHcpLE09aS5wYXR0ZXJuQ2FjaGUsST1NW1NdO0l8fChJPWkuenJJZCsiLXAiK2kucGF0dGVybklkeCsrLE1bU109SSxzLmlkPUksdz1pLmRlZnNbSV09c3coInBhdHRlcm4iLEkscyxbcl0pKSxlW25dPWJpKEkpfX1mdW5jdGlvbiBWdyh0LGUsbil7dmFyIGk9bi5jbGlwUGF0aENhY2hlLHI9bi5kZWZzLG89aVt0LmlkXTtpZighbyl7dmFyIGE9e2lkOm89bi56cklkKyItYyIrbi5jbGlwUGF0aElkeCsrfTtpW3QuaWRdPW8scltvXT1zdygiY2xpcFBhdGgiLG8sYSxbUncodCxuKV0pfWVbImNsaXAtcGF0aCJdPWJpKG8pfWZ1bmN0aW9uIEJ3KHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KX1mdW5jdGlvbiBGdyh0LGUsbil7dC5pbnNlcnRCZWZvcmUoZSxuKX1mdW5jdGlvbiBHdyh0LGUpe3QucmVtb3ZlQ2hpbGQoZSl9ZnVuY3Rpb24gV3codCxlKXt0LmFwcGVuZENoaWxkKGUpfWZ1bmN0aW9uIEh3KHQpe3JldHVybiB0LnBhcmVudE5vZGV9ZnVuY3Rpb24gWXcodCl7cmV0dXJuIHQubmV4dFNpYmxpbmd9ZnVuY3Rpb24gWHcodCxlKXt0LnRleHRDb250ZW50PWV9dmFyIFV3PXN3KCIiLCIiKTtmdW5jdGlvbiBadyh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBqdyh0KXtyZXR1cm4gdm9pZCAwIT09dH1mdW5jdGlvbiBxdyh0LGUsbil7Zm9yKHZhciBpPXt9LHI9ZTtyPD1uOysrcil7dmFyIG89dFtyXS5rZXk7dm9pZCAwIT09byYmKGlbb109cil9cmV0dXJuIGl9ZnVuY3Rpb24gS3codCxlKXt2YXIgbj10LmtleT09PWUua2V5O3JldHVybiB0LnRhZz09PWUudGFnJiZufWZ1bmN0aW9uICR3KHQpe3ZhciBlLG49dC5jaGlsZHJlbixpPXQudGFnO2lmKGp3KGkpKXt2YXIgcj10LmVsbT1hdyhpKTtpZih0UyhVdyx0KSxZKG4pKWZvcihlPTA7ZTxuLmxlbmd0aDsrK2Upe3ZhciBvPW5bZV07bnVsbCE9byYmV3cociwkdyhvKSl9ZWxzZSBqdyh0LnRleHQpJiYhcSh0LnRleHQpJiZXdyhyLEJ3KHQudGV4dCkpfWVsc2UgdC5lbG09QncodC50ZXh0KTtyZXR1cm4gdC5lbG19ZnVuY3Rpb24gSncodCxlLG4saSxyKXtmb3IoO2k8PXI7KytpKXt2YXIgbz1uW2ldO251bGwhPW8mJkZ3KHQsJHcobyksZSl9fWZ1bmN0aW9uIFF3KHQsZSxuLGkpe2Zvcig7bjw9aTsrK24pe3ZhciByPWVbbl07aWYobnVsbCE9cilpZihqdyhyLnRhZykpR3coSHcoci5lbG0pLHIuZWxtKTtlbHNlIEd3KHQsci5lbG0pfX1mdW5jdGlvbiB0Uyh0LGUpe3ZhciBuLGk9ZS5lbG0scj10JiZ0LmF0dHJzfHx7fSxvPWUuYXR0cnN8fHt9O2lmKHIhPT1vKXtmb3IobiBpbiBvKXt2YXIgYT1vW25dO3Jbbl0hPT1hJiYoITA9PT1hP2kuc2V0QXR0cmlidXRlKG4sIiIpOiExPT09YT9pLnJlbW92ZUF0dHJpYnV0ZShuKToic3R5bGUiPT09bj9pLnN0eWxlLmNzc1RleHQ9YToxMjAhPT1uLmNoYXJDb2RlQXQoMCk/aS5zZXRBdHRyaWJ1dGUobixhKToieG1sbnM6eGxpbmsiPT09bnx8InhtbG5zIj09PW4/aS5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLG4sYSk6NTg9PT1uLmNoYXJDb2RlQXQoMyk/aS5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIixuLGEpOjU4PT09bi5jaGFyQ29kZUF0KDUpP2kuc2V0QXR0cmlidXRlTlMocncsbixhKTppLnNldEF0dHJpYnV0ZShuLGEpKX1mb3IobiBpbiByKW4gaW4gb3x8aS5yZW1vdmVBdHRyaWJ1dGUobil9fWZ1bmN0aW9uIGVTKHQsZSl7dmFyIG49ZS5lbG09dC5lbG0saT10LmNoaWxkcmVuLHI9ZS5jaGlsZHJlbjt0IT09ZSYmKHRTKHQsZSksWncoZS50ZXh0KT9qdyhpKSYmancocik/aSE9PXImJmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkscixvLGE9MCxzPTAsbD1lLmxlbmd0aC0xLHU9ZVswXSxoPWVbbF0sYz1uLmxlbmd0aC0xLHA9blswXSxkPW5bY107YTw9bCYmczw9YzspbnVsbD09dT91PWVbKythXTpudWxsPT1oP2g9ZVstLWxdOm51bGw9PXA/cD1uWysrc106bnVsbD09ZD9kPW5bLS1jXTpLdyh1LHApPyhlUyh1LHApLHU9ZVsrK2FdLHA9blsrK3NdKTpLdyhoLGQpPyhlUyhoLGQpLGg9ZVstLWxdLGQ9blstLWNdKTpLdyh1LGQpPyhlUyh1LGQpLEZ3KHQsdS5lbG0sWXcoaC5lbG0pKSx1PWVbKythXSxkPW5bLS1jXSk6S3coaCxwKT8oZVMoaCxwKSxGdyh0LGguZWxtLHUuZWxtKSxoPWVbLS1sXSxwPW5bKytzXSk6KFp3KGkpJiYoaT1xdyhlLGEsbCkpLFp3KHI9aVtwLmtleV0pfHwobz1lW3JdKS50YWchPT1wLnRhZz9Gdyh0LCR3KHApLHUuZWxtKTooZVMobyxwKSxlW3JdPXZvaWQgMCxGdyh0LG8uZWxtLHUuZWxtKSkscD1uWysrc10pOyhhPD1sfHxzPD1jKSYmKGE+bD9Kdyh0LG51bGw9PW5bYysxXT9udWxsOm5bYysxXS5lbG0sbixzLGMpOlF3KHQsZSxhLGwpKX0obixpLHIpOmp3KHIpPyhqdyh0LnRleHQpJiZYdyhuLCIiKSxKdyhuLG51bGwsciwwLHIubGVuZ3RoLTEpKTpqdyhpKT9RdyhuLGksMCxpLmxlbmd0aC0xKTpqdyh0LnRleHQpJiZYdyhuLCIiKTp0LnRleHQhPT1lLnRleHQmJihqdyhpKSYmUXcobixpLDAsaS5sZW5ndGgtMSksWHcobixlLnRleHQpKSl9dmFyIG5TPTAsaVM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXtpZih0aGlzLnR5cGU9InN2ZyIsdGhpcy5yZWZyZXNoSG92ZXI9clMoInJlZnJlc2hIb3ZlciIpLHRoaXMuY29uZmlnTGF5ZXI9clMoImNvbmZpZ0xheWVyIiksdGhpcy5zdG9yYWdlPWUsdGhpcy5fb3B0cz1uPUEoe30sbiksdGhpcy5yb290PXQsdGhpcy5faWQ9InpyIituUysrLHRoaXMuX29sZFZOb2RlPWh3KG4ud2lkdGgsbi5oZWlnaHQpLHQmJiFuLnNzcil7dmFyIGk9dGhpcy5fdmlld3BvcnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW4iO3ZhciByPXRoaXMuX3N2Z0RvbT10aGlzLl9vbGRWTm9kZS5lbG09YXcoInN2ZyIpO3RTKG51bGwsdGhpcy5fb2xkVk5vZGUpLGkuYXBwZW5kQ2hpbGQociksdC5hcHBlbmRDaGlsZChpKX10aGlzLnJlc2l6ZShuLndpZHRoLG4uaGVpZ2h0KX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9LHQucHJvdG90eXBlLmdldFZpZXdwb3J0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3cG9ydH0sdC5wcm90b3R5cGUuZ2V0Vmlld3BvcnRSb290T2Zmc2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRWaWV3cG9ydFJvb3QoKTtpZih0KXJldHVybntvZmZzZXRMZWZ0OnQub2Zmc2V0TGVmdHx8MCxvZmZzZXRUb3A6dC5vZmZzZXRUb3B8fDB9fSx0LnByb3RvdHlwZS5nZXRTdmdEb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ZnRG9tfSx0LnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5yb290KXt2YXIgdD10aGlzLnJlbmRlclRvVk5vZGUoe3dpbGxVcGRhdGU6ITB9KTt0LmF0dHJzLnN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7dXNlci1zZWxlY3Q6bm9uZSIsZnVuY3Rpb24odCxlKXtpZihLdyh0LGUpKWVTKHQsZSk7ZWxzZXt2YXIgbj10LmVsbSxpPUh3KG4pOyR3KGUpLG51bGwhPT1pJiYoRncoaSxlLmVsbSxZdyhuKSksUXcoaSxbdF0sMCwwKSl9fSh0aGlzLl9vbGRWTm9kZSx0KSx0aGlzLl9vbGRWTm9kZT10fX0sdC5wcm90b3R5cGUucmVuZGVyT25lVG9WTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gTncodCx1dyh0aGlzLl9pZCkpfSx0LnByb3RvdHlwZS5yZW5kZXJUb1ZOb2RlPWZ1bmN0aW9uKHQpe3Q9dHx8e307dmFyIGU9dGhpcy5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCEwKSxuPXRoaXMuX3dpZHRoLGk9dGhpcy5faGVpZ2h0LHI9dXcodGhpcy5faWQpO3IuYW5pbWF0aW9uPXQuYW5pbWF0aW9uLHIud2lsbFVwZGF0ZT10LndpbGxVcGRhdGUsci5jb21wcmVzcz10LmNvbXByZXNzLHIuZW1waGFzaXM9dC5lbXBoYXNpczt2YXIgbz1bXSxhPXRoaXMuX2JnVk5vZGU9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI7aWYobiYmIm5vbmUiIT09bilpZihyPXN3KCJyZWN0IiwiYmciLHt3aWR0aDp0LGhlaWdodDplLHg6IjAiLHk6IjAifSksX2kobikpRXcoe2ZpbGw6bn0sci5hdHRycywiZmlsbCIsaSk7ZWxzZSBpZih2aShuKSl6dyh7c3R5bGU6e2ZpbGw6bn0sZGlydHk6YnQsZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOnQsaGVpZ2h0OmV9fX0sci5hdHRycywiZmlsbCIsaSk7ZWxzZXt2YXIgbz1oaShuKSxhPW8uY29sb3Iscz1vLm9wYWNpdHk7ci5hdHRycy5maWxsPWEsczwxJiYoci5hdHRyc1siZmlsbC1vcGFjaXR5Il09cyl9cmV0dXJuIHJ9KG4saSx0aGlzLl9iYWNrZ3JvdW5kQ29sb3Iscik7YSYmby5wdXNoKGEpO3ZhciBzPXQuY29tcHJlc3M/bnVsbDp0aGlzLl9tYWluVk5vZGU9c3coImciLCJtYWluIix7fSxbXSk7dGhpcy5fcGFpbnRMaXN0KGUscixzP3MuY2hpbGRyZW46bykscyYmby5wdXNoKHMpO3ZhciBsPXooRyhyLmRlZnMpLChmdW5jdGlvbih0KXtyZXR1cm4gci5kZWZzW3RdfSkpO2lmKGwubGVuZ3RoJiZvLnB1c2goc3coImRlZnMiLCJkZWZzIix7fSxsKSksdC5hbmltYXRpb24pe3ZhciB1PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0obj1ufHx7fSkubmV3bGluZT8iXG4iOiIiLHI9IiB7IitpLG89aSsifSIsYT16KEcodCksKGZ1bmN0aW9uKGUpe3JldHVybiBlK3IreihHKHRbZV0pLChmdW5jdGlvbihuKXtyZXR1cm4gbisiOiIrdFtlXVtuXSsiOyJ9KSkuam9pbihpKStvfSkpLmpvaW4oaSkscz16KEcoZSksKGZ1bmN0aW9uKHQpe3JldHVybiJAa2V5ZnJhbWVzICIrdCtyK3ooRyhlW3RdKSwoZnVuY3Rpb24obil7cmV0dXJuIG4rcit6KEcoZVt0XVtuXSksKGZ1bmN0aW9uKGkpe3ZhciByPWVbdF1bbl1baV07cmV0dXJuImQiPT09aSYmKHI9J3BhdGgoIicrcisnIiknKSxpKyI6IityKyI7In0pKS5qb2luKGkpK299KSkuam9pbihpKStvfSkpLmpvaW4oaSk7cmV0dXJuIGF8fHM/WyI8IVtDREFUQVsiLGEscywiXV0+Il0uam9pbihpKToiIn0oci5jc3NOb2RlcyxyLmNzc0FuaW1zLHtuZXdsaW5lOiEwfSk7aWYodSl7dmFyIGg9c3coInN0eWxlIiwic3RsIix7fSxbXSx1KTtvLnB1c2goaCl9fXJldHVybiBodyhuLGksbyx0LnVzZVZpZXdCb3gpfSx0LnByb3RvdHlwZS5yZW5kZXJUb1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHx7fSxsdyh0aGlzLnJlbmRlclRvVk5vZGUoe2FuaW1hdGlvbjpydCh0LmNzc0FuaW1hdGlvbiwhMCksZW1waGFzaXM6cnQodC5jc3NFbXBoYXNpcywhMCksd2lsbFVwZGF0ZTohMSxjb21wcmVzczohMCx1c2VWaWV3Qm94OnJ0KHQudXNlVmlld0JveCwhMCl9KSx7bmV3bGluZTohMH0pfSx0LnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kQ29sb3I9ZnVuY3Rpb24odCl7dGhpcy5fYmFja2dyb3VuZENvbG9yPXR9LHQucHJvdG90eXBlLmdldFN2Z1Jvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFpblZOb2RlJiZ0aGlzLl9tYWluVk5vZGUuZWxtfSx0LnByb3RvdHlwZS5fcGFpbnRMaXN0PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkscixvPXQubGVuZ3RoLGE9W10scz0wLGw9MCx1PTA7dTxvO3UrKyl7dmFyIGg9dFt1XTtpZighaC5pbnZpc2libGUpe3ZhciBjPWguX19jbGlwUGF0aHMscD1jJiZjLmxlbmd0aHx8MCxkPXImJnIubGVuZ3RofHwwLGY9dm9pZCAwO2ZvcihmPU1hdGgubWF4KHAtMSxkLTEpO2Y+PTAmJighY3x8IXJ8fGNbZl0hPT1yW2ZdKTtmLS0pO2Zvcih2YXIgZz1kLTE7Zz5mO2ctLSlpPWFbLS1zLTFdO2Zvcih2YXIgeT1mKzE7eTxwO3krKyl7dmFyIHY9e307VncoY1t5XSx2LGUpO3ZhciBtPXN3KCJnIiwiY2xpcC1nLSIrbCsrLHYsW10pOyhpP2kuY2hpbGRyZW46bikucHVzaChtKSxhW3MrK109bSxpPW19cj1jO3ZhciB4PU53KGgsZSk7eCYmKGk/aS5jaGlsZHJlbjpuKS5wdXNoKHgpfX19LHQucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX29wdHMsaT10aGlzLnJvb3Qscj10aGlzLl92aWV3cG9ydDtpZihudWxsIT10JiYobi53aWR0aD10KSxudWxsIT1lJiYobi5oZWlnaHQ9ZSksaSYmciYmKHIuc3R5bGUuZGlzcGxheT0ibm9uZSIsdD0keShpLDAsbiksZT0keShpLDEsbiksci5zdHlsZS5kaXNwbGF5PSIiKSx0aGlzLl93aWR0aCE9PXR8fHRoaXMuX2hlaWdodCE9PWUpe2lmKHRoaXMuX3dpZHRoPXQsdGhpcy5faGVpZ2h0PWUscil7dmFyIG89ci5zdHlsZTtvLndpZHRoPXQrInB4IixvLmhlaWdodD1lKyJweCJ9aWYodmkodGhpcy5fYmFja2dyb3VuZENvbG9yKSl0aGlzLnJlZnJlc2goKTtlbHNle3ZhciBhPXRoaXMuX3N2Z0RvbTthJiYoYS5zZXRBdHRyaWJ1dGUoIndpZHRoIix0KSxhLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlKSk7dmFyIHM9dGhpcy5fYmdWTm9kZSYmdGhpcy5fYmdWTm9kZS5lbG07cyYmKHMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdCkscy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsZSkpfX19LHQucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofSx0LnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5yb290JiYodGhpcy5yb290LmlubmVySFRNTD0iIiksdGhpcy5fc3ZnRG9tPXRoaXMuX3ZpZXdwb3J0PXRoaXMuc3RvcmFnZT10aGlzLl9vbGRWTm9kZT10aGlzLl9iZ1ZOb2RlPXRoaXMuX21haW5WTm9kZT1udWxsfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX3N2Z0RvbSYmKHRoaXMuX3N2Z0RvbS5pbm5lckhUTUw9bnVsbCksdGhpcy5fb2xkVk5vZGU9bnVsbH0sdC5wcm90b3R5cGUudG9EYXRhVVJMPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmVuZGVyVG9TdHJpbmcoKSxuPSJkYXRhOmltYWdlL3N2Zyt4bWw7IjtyZXR1cm4gdD8oZT1NaShlKSkmJm4rImJhc2U2NCwiK2U6bisiY2hhcnNldD1VVEYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChlKX0sdH0oKTtmdW5jdGlvbiByUyh0KXtyZXR1cm4gZnVuY3Rpb24oKXswfX1mdW5jdGlvbiBvUyh0LGUsbil7dmFyIGk9aC5jcmVhdGVDYW52YXMoKSxyPWUuZ2V0V2lkdGgoKSxvPWUuZ2V0SGVpZ2h0KCksYT1pLnN0eWxlO3JldHVybiBhJiYoYS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEubGVmdD0iMCIsYS50b3A9IjAiLGEud2lkdGg9cisicHgiLGEuaGVpZ2h0PW8rInB4IixpLnNldEF0dHJpYnV0ZSgiZGF0YS16ci1kb20taWQiLHQpKSxpLndpZHRoPXIqbixpLmhlaWdodD1vKm4saX12YXIgYVM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4saSl7dmFyIHIsbz10LmNhbGwodGhpcyl8fHRoaXM7by5tb3Rpb25CbHVyPSExLG8ubGFzdEZyYW1lQWxwaGE9Ljcsby5kcHI9MSxvLnZpcnR1YWw9ITEsby5jb25maWc9e30sby5pbmNyZW1lbnRhbD0hMSxvLnpsZXZlbD0wLG8ubWF4UmVwYWludFJlY3RDb3VudD01LG8uX19kaXJ0eT0hMCxvLl9fZmlyc3RUaW1lUGFpbnQ9ITAsby5fX3VzZWQ9ITEsby5fX2RyYXdJbmRleD0wLG8uX19zdGFydEluZGV4PTAsby5fX2VuZEluZGV4PTAsby5fX3ByZXZTdGFydEluZGV4PW51bGwsby5fX3ByZXZFbmRJbmRleD1udWxsLGk9aXx8c3IsInN0cmluZyI9PXR5cGVvZiBlP3I9b1MoZSxuLGkpOnEoZSkmJihlPShyPWUpLmlkKSxvLmlkPWUsby5kb209cjt2YXIgYT1yLnN0eWxlO3JldHVybiBhJiYoeHQociksci5vbnNlbGVjdHN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGEucGFkZGluZz0iMCIsYS5tYXJnaW49IjAiLGEuYm9yZGVyV2lkdGg9IjAiKSxvLnBhaW50ZXI9bixvLmRwcj1pLG99cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXRFbGVtZW50Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2VuZEluZGV4LXRoaXMuX19zdGFydEluZGV4fSxlLnByb3RvdHlwZS5hZnRlckJydXNoPWZ1bmN0aW9uKCl7dGhpcy5fX3ByZXZTdGFydEluZGV4PXRoaXMuX19zdGFydEluZGV4LHRoaXMuX19wcmV2RW5kSW5kZXg9dGhpcy5fX2VuZEluZGV4fSxlLnByb3RvdHlwZS5pbml0Q29udGV4dD1mdW5jdGlvbigpe3RoaXMuY3R4PXRoaXMuZG9tLmdldENvbnRleHQoIjJkIiksdGhpcy5jdHguZHByPXRoaXMuZHByfSxlLnByb3RvdHlwZS5zZXRVbnBhaW50ZWQ9ZnVuY3Rpb24oKXt0aGlzLl9fZmlyc3RUaW1lUGFpbnQ9ITB9LGUucHJvdG90eXBlLmNyZWF0ZUJhY2tCdWZmZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRwcjt0aGlzLmRvbUJhY2s9b1MoImJhY2stIit0aGlzLmlkLHRoaXMucGFpbnRlcix0KSx0aGlzLmN0eEJhY2s9dGhpcy5kb21CYWNrLmdldENvbnRleHQoIjJkIiksMSE9PXQmJnRoaXMuY3R4QmFjay5zY2FsZSh0LHQpfSxlLnByb3RvdHlwZS5jcmVhdGVSZXBhaW50UmVjdHM9ZnVuY3Rpb24odCxlLG4saSl7aWYodGhpcy5fX2ZpcnN0VGltZVBhaW50KXJldHVybiB0aGlzLl9fZmlyc3RUaW1lUGFpbnQ9ITEsbnVsbDt2YXIgcixvPVtdLGE9dGhpcy5tYXhSZXBhaW50UmVjdENvdW50LHM9ITEsbD1uZXcgemUoMCwwLDAsMCk7ZnVuY3Rpb24gdSh0KXtpZih0LmlzRmluaXRlKCkmJiF0LmlzWmVybygpKWlmKDA9PT1vLmxlbmd0aCl7KGU9bmV3IHplKDAsMCwwLDApKS5jb3B5KHQpLG8ucHVzaChlKX1lbHNle2Zvcih2YXIgZSxuPSExLGk9MS8wLHI9MCx1PTA7dTxvLmxlbmd0aDsrK3Upe3ZhciBoPW9bdV07aWYoaC5pbnRlcnNlY3QodCkpe3ZhciBjPW5ldyB6ZSgwLDAsMCwwKTtjLmNvcHkoaCksYy51bmlvbih0KSxvW3VdPWMsbj0hMDticmVha31pZihzKXtsLmNvcHkodCksbC51bmlvbihoKTt2YXIgcD10LndpZHRoKnQuaGVpZ2h0LGQ9aC53aWR0aCpoLmhlaWdodCxmPWwud2lkdGgqbC5oZWlnaHQtcC1kO2Y8aSYmKGk9ZixyPXUpfX1pZihzJiYob1tyXS51bmlvbih0KSxuPSEwKSwhbikoZT1uZXcgemUoMCwwLDAsMCkpLmNvcHkodCksby5wdXNoKGUpO3N8fChzPW8ubGVuZ3RoPj1hKX19Zm9yKHZhciBoPXRoaXMuX19zdGFydEluZGV4O2g8dGhpcy5fX2VuZEluZGV4OysraCl7aWYoZD10W2hdKXt2YXIgYz1kLnNob3VsZEJlUGFpbnRlZChuLGksITAsITApOyhmPWQuX19pc1JlbmRlcmVkJiYoMSZkLl9fZGlydHl8fCFjKT9kLmdldFByZXZQYWludFJlY3QoKTpudWxsKSYmdShmKTt2YXIgcD1jJiYoMSZkLl9fZGlydHl8fCFkLl9faXNSZW5kZXJlZCk/ZC5nZXRQYWludFJlY3QoKTpudWxsO3AmJnUocCl9fWZvcihoPXRoaXMuX19wcmV2U3RhcnRJbmRleDtoPHRoaXMuX19wcmV2RW5kSW5kZXg7KytoKXt2YXIgZCxmO2M9KGQ9ZVtoXSkmJmQuc2hvdWxkQmVQYWludGVkKG4saSwhMCwhMCk7aWYoZCYmKCFjfHwhZC5fX3pyKSYmZC5fX2lzUmVuZGVyZWQpKGY9ZC5nZXRQcmV2UGFpbnRSZWN0KCkpJiZ1KGYpfWRve3I9ITE7Zm9yKGg9MDtoPG8ubGVuZ3RoOylpZihvW2hdLmlzWmVybygpKW8uc3BsaWNlKGgsMSk7ZWxzZXtmb3IodmFyIGc9aCsxO2c8by5sZW5ndGg7KW9baF0uaW50ZXJzZWN0KG9bZ10pPyhyPSEwLG9baF0udW5pb24ob1tnXSksby5zcGxpY2UoZywxKSk6ZysrO2grK319d2hpbGUocik7cmV0dXJuIHRoaXMuX3BhaW50UmVjdHM9byxvfSxlLnByb3RvdHlwZS5kZWJ1Z0dldFBhaW50UmVjdHM9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5fcGFpbnRSZWN0c3x8W10pLnNsaWNlKCl9LGUucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZHByLGk9dGhpcy5kb20scj1pLnN0eWxlLG89dGhpcy5kb21CYWNrO3ImJihyLndpZHRoPXQrInB4IixyLmhlaWdodD1lKyJweCIpLGkud2lkdGg9dCpuLGkuaGVpZ2h0PWUqbixvJiYoby53aWR0aD10Km4sby5oZWlnaHQ9ZSpuLDEhPT1uJiZ0aGlzLmN0eEJhY2suc2NhbGUobixuKSl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmRvbSxyPXRoaXMuY3R4LG89aS53aWR0aCxhPWkuaGVpZ2h0O2U9ZXx8dGhpcy5jbGVhckNvbG9yO3ZhciBzPXRoaXMubW90aW9uQmx1ciYmIXQsbD10aGlzLmxhc3RGcmFtZUFscGhhLHU9dGhpcy5kcHIsaD10aGlzO3MmJih0aGlzLmRvbUJhY2t8fHRoaXMuY3JlYXRlQmFja0J1ZmZlcigpLHRoaXMuY3R4QmFjay5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuY3R4QmFjay5kcmF3SW1hZ2UoaSwwLDAsby91LGEvdSkpO3ZhciBjPXRoaXMuZG9tQmFjaztmdW5jdGlvbiBwKHQsbixpLG8pe2lmKHIuY2xlYXJSZWN0KHQsbixpLG8pLGUmJiJ0cmFuc3BhcmVudCIhPT1lKXt2YXIgYT12b2lkIDA7aWYoUShlKSlhPShlLmdsb2JhbHx8ZS5fX3dpZHRoPT09aSYmZS5fX2hlaWdodD09PW8pJiZlLl9fY2FudmFzR3JhZGllbnR8fHF5KHIsZSx7eDowLHk6MCx3aWR0aDppLGhlaWdodDpvfSksZS5fX2NhbnZhc0dyYWRpZW50PWEsZS5fX3dpZHRoPWksZS5fX2hlaWdodD1vO2Vsc2UgdHQoZSkmJihlLnNjYWxlWD1lLnNjYWxlWHx8dSxlLnNjYWxlWT1lLnNjYWxlWXx8dSxhPW92KHIsZSx7ZGlydHk6ZnVuY3Rpb24oKXtoLnNldFVucGFpbnRlZCgpLGgucGFpbnRlci5yZWZyZXNoKCl9fSkpO3Iuc2F2ZSgpLHIuZmlsbFN0eWxlPWF8fGUsci5maWxsUmVjdCh0LG4saSxvKSxyLnJlc3RvcmUoKX1zJiYoci5zYXZlKCksci5nbG9iYWxBbHBoYT1sLHIuZHJhd0ltYWdlKGMsdCxuLGksbyksci5yZXN0b3JlKCkpfSFufHxzP3AoMCwwLG8sYSk6bi5sZW5ndGgmJkUobiwoZnVuY3Rpb24odCl7cCh0LngqdSx0LnkqdSx0LndpZHRoKnUsdC5oZWlnaHQqdSl9KSl9LGV9KGp0KSxzUz0xZTUsbFM9MzE0MTU5LHVTPS4wMTt2YXIgaFM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLGkpe3RoaXMudHlwZT0iY2FudmFzIix0aGlzLl96bGV2ZWxMaXN0PVtdLHRoaXMuX3ByZXZEaXNwbGF5TGlzdD1bXSx0aGlzLl9sYXllcnM9e30sdGhpcy5fbGF5ZXJDb25maWc9e30sdGhpcy5fbmVlZHNNYW51YWxseUNvbXBvc2l0aW5nPSExLHRoaXMudHlwZT0iY2FudmFzIjt2YXIgcj0hdC5ub2RlTmFtZXx8IkNBTlZBUyI9PT10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7dGhpcy5fb3B0cz1uPUEoe30sbnx8e30pLHRoaXMuZHByPW4uZGV2aWNlUGl4ZWxSYXRpb3x8c3IsdGhpcy5fc2luZ2xlQ2FudmFzPXIsdGhpcy5yb290PXQsdC5zdHlsZSYmKHh0KHQpLHQuaW5uZXJIVE1MPSIiKSx0aGlzLnN0b3JhZ2U9ZTt2YXIgbz10aGlzLl96bGV2ZWxMaXN0O3RoaXMuX3ByZXZEaXNwbGF5TGlzdD1bXTt2YXIgYT10aGlzLl9sYXllcnM7aWYocil7dmFyIHM9dCxsPXMud2lkdGgsdT1zLmhlaWdodDtudWxsIT1uLndpZHRoJiYobD1uLndpZHRoKSxudWxsIT1uLmhlaWdodCYmKHU9bi5oZWlnaHQpLHRoaXMuZHByPW4uZGV2aWNlUGl4ZWxSYXRpb3x8MSxzLndpZHRoPWwqdGhpcy5kcHIscy5oZWlnaHQ9dSp0aGlzLmRwcix0aGlzLl93aWR0aD1sLHRoaXMuX2hlaWdodD11O3ZhciBoPW5ldyBhUyhzLHRoaXMsdGhpcy5kcHIpO2guX19idWlsdGluX189ITAsaC5pbml0Q29udGV4dCgpLGFbMzE0MTU5XT1oLGguemxldmVsPWxTLG8ucHVzaChsUyksdGhpcy5fZG9tUm9vdD10fWVsc2V7dGhpcy5fd2lkdGg9JHkodCwwLG4pLHRoaXMuX2hlaWdodD0keSh0LDEsbik7dmFyIGM9dGhpcy5fZG9tUm9vdD1mdW5jdGlvbih0LGUpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBuLnN0eWxlLmNzc1RleHQ9WyJwb3NpdGlvbjpyZWxhdGl2ZSIsIndpZHRoOiIrdCsicHgiLCJoZWlnaHQ6IitlKyJweCIsInBhZGRpbmc6MCIsIm1hcmdpbjowIiwiYm9yZGVyLXdpZHRoOjAiXS5qb2luKCI7IikrIjsiLG59KHRoaXMuX3dpZHRoLHRoaXMuX2hlaWdodCk7dC5hcHBlbmRDaGlsZChjKX19cmV0dXJuIHQucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iY2FudmFzIn0sdC5wcm90b3R5cGUuaXNTaW5nbGVDYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2luZ2xlQ2FudmFzfSx0LnByb3RvdHlwZS5nZXRWaWV3cG9ydFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG9tUm9vdH0sdC5wcm90b3R5cGUuZ2V0Vmlld3BvcnRSb290T2Zmc2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRWaWV3cG9ydFJvb3QoKTtpZih0KXJldHVybntvZmZzZXRMZWZ0OnQub2Zmc2V0TGVmdHx8MCxvZmZzZXRUb3A6dC5vZmZzZXRUb3B8fDB9fSx0LnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCghMCksbj10aGlzLl9wcmV2RGlzcGxheUxpc3QsaT10aGlzLl96bGV2ZWxMaXN0O3RoaXMuX3JlZHJhd0lkPU1hdGgucmFuZG9tKCksdGhpcy5fcGFpbnRMaXN0KGUsbix0LHRoaXMuX3JlZHJhd0lkKTtmb3IodmFyIHI9MDtyPGkubGVuZ3RoO3IrKyl7dmFyIG89aVtyXSxhPXRoaXMuX2xheWVyc1tvXTtpZighYS5fX2J1aWx0aW5fXyYmYS5yZWZyZXNoKXt2YXIgcz0wPT09cj90aGlzLl9iYWNrZ3JvdW5kQ29sb3I6bnVsbDthLnJlZnJlc2gocyl9fXJldHVybiB0aGlzLl9vcHRzLnVzZURpcnR5UmVjdCYmKHRoaXMuX3ByZXZEaXNwbGF5TGlzdD1lLnNsaWNlKCkpLHRoaXN9LHQucHJvdG90eXBlLnJlZnJlc2hIb3Zlcj1mdW5jdGlvbigpe3RoaXMuX3BhaW50SG92ZXJMaXN0KHRoaXMuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCghMSkpfSx0LnByb3RvdHlwZS5fcGFpbnRIb3Zlckxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgsbj10aGlzLl9ob3ZlcmxheWVyO2lmKG4mJm4uY2xlYXIoKSxlKXtmb3IodmFyIGkscj17aW5Ib3ZlcjohMCx2aWV3V2lkdGg6dGhpcy5fd2lkdGgsdmlld0hlaWdodDp0aGlzLl9oZWlnaHR9LG89MDtvPGU7bysrKXt2YXIgYT10W29dO2EuX19pbkhvdmVyJiYobnx8KG49dGhpcy5faG92ZXJsYXllcj10aGlzLmdldExheWVyKHNTKSksaXx8KGk9bi5jdHgpLnNhdmUoKSxmdihpLGEscixvPT09ZS0xKSl9aSYmaS5yZXN0b3JlKCl9fSx0LnByb3RvdHlwZS5nZXRIb3ZlckxheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGF5ZXIoc1MpfSx0LnByb3RvdHlwZS5wYWludE9uZT1mdW5jdGlvbih0LGUpe2R2KHQsZSl9LHQucHJvdG90eXBlLl9wYWludExpc3Q9ZnVuY3Rpb24odCxlLG4saSl7aWYodGhpcy5fcmVkcmF3SWQ9PT1pKXtuPW58fCExLHRoaXMuX3VwZGF0ZUxheWVyU3RhdHVzKHQpO3ZhciByPXRoaXMuX2RvUGFpbnRMaXN0KHQsZSxuKSxvPXIuZmluaXNoZWQsYT1yLm5lZWRzUmVmcmVzaEhvdmVyO2lmKHRoaXMuX25lZWRzTWFudWFsbHlDb21wb3NpdGluZyYmdGhpcy5fY29tcG9zaXRlTWFudWFsbHkoKSxhJiZ0aGlzLl9wYWludEhvdmVyTGlzdCh0KSxvKXRoaXMuZWFjaExheWVyKChmdW5jdGlvbih0KXt0LmFmdGVyQnJ1c2gmJnQuYWZ0ZXJCcnVzaCgpfSkpO2Vsc2V7dmFyIHM9dGhpcztvbigoZnVuY3Rpb24oKXtzLl9wYWludExpc3QodCxlLG4saSl9KSl9fX0sdC5wcm90b3R5cGUuX2NvbXBvc2l0ZU1hbnVhbGx5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRMYXllcihsUykuY3R4LGU9dGhpcy5fZG9tUm9vdC53aWR0aCxuPXRoaXMuX2RvbVJvb3QuaGVpZ2h0O3QuY2xlYXJSZWN0KDAsMCxlLG4pLHRoaXMuZWFjaEJ1aWx0aW5MYXllcigoZnVuY3Rpb24oaSl7aS52aXJ0dWFsJiZ0LmRyYXdJbWFnZShpLmRvbSwwLDAsZSxuKX0pKX0sdC5wcm90b3R5cGUuX2RvUGFpbnRMaXN0PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dGhpcyxvPVtdLGE9dGhpcy5fb3B0cy51c2VEaXJ0eVJlY3Qscz0wO3M8dGhpcy5femxldmVsTGlzdC5sZW5ndGg7cysrKXt2YXIgbD10aGlzLl96bGV2ZWxMaXN0W3NdLHU9dGhpcy5fbGF5ZXJzW2xdO3UuX19idWlsdGluX18mJnUhPT10aGlzLl9ob3ZlcmxheWVyJiYodS5fX2RpcnR5fHxuKSYmby5wdXNoKHUpfWZvcih2YXIgaD0hMCxjPSExLHA9ZnVuY3Rpb24ocil7dmFyIHMsbD1vW3JdLHU9bC5jdHgscD1hJiZsLmNyZWF0ZVJlcGFpbnRSZWN0cyh0LGUsZC5fd2lkdGgsZC5faGVpZ2h0KSxmPW4/bC5fX3N0YXJ0SW5kZXg6bC5fX2RyYXdJbmRleCxnPSFuJiZsLmluY3JlbWVudGFsJiZEYXRlLm5vdyx5PWcmJkRhdGUubm93KCksdj1sLnpsZXZlbD09PWQuX3psZXZlbExpc3RbMF0/ZC5fYmFja2dyb3VuZENvbG9yOm51bGw7aWYobC5fX3N0YXJ0SW5kZXg9PT1sLl9fZW5kSW5kZXgpbC5jbGVhcighMSx2LHApO2Vsc2UgaWYoZj09PWwuX19zdGFydEluZGV4KXt2YXIgbT10W2ZdO20uaW5jcmVtZW50YWwmJm0ubm90Q2xlYXImJiFufHxsLmNsZWFyKCExLHYscCl9LTE9PT1mJiYoY29uc29sZS5lcnJvcigiRm9yIHNvbWUgdW5rbm93biByZWFzb24uIGRyYXdJbmRleCBpcyAtMSIpLGY9bC5fX3N0YXJ0SW5kZXgpO3ZhciB4PWZ1bmN0aW9uKGUpe3ZhciBuPXtpbkhvdmVyOiExLGFsbENsaXBwZWQ6ITEscHJldkVsOm51bGwsdmlld1dpZHRoOmkuX3dpZHRoLHZpZXdIZWlnaHQ6aS5faGVpZ2h0fTtmb3Iocz1mO3M8bC5fX2VuZEluZGV4O3MrKyl7dmFyIHI9dFtzXTtpZihyLl9faW5Ib3ZlciYmKGM9ITApLGkuX2RvUGFpbnRFbChyLGwsYSxlLG4scz09PWwuX19lbmRJbmRleC0xKSxnKWlmKERhdGUubm93KCkteT4xNSlicmVha31uLnByZXZFbENsaXBQYXRocyYmdS5yZXN0b3JlKCl9O2lmKHApaWYoMD09PXAubGVuZ3RoKXM9bC5fX2VuZEluZGV4O2Vsc2UgZm9yKHZhciBfPWQuZHByLGI9MDtiPHAubGVuZ3RoOysrYil7dmFyIHc9cFtiXTt1LnNhdmUoKSx1LmJlZ2luUGF0aCgpLHUucmVjdCh3LngqXyx3LnkqXyx3LndpZHRoKl8sdy5oZWlnaHQqXyksdS5jbGlwKCkseCh3KSx1LnJlc3RvcmUoKX1lbHNlIHUuc2F2ZSgpLHgoKSx1LnJlc3RvcmUoKTtsLl9fZHJhd0luZGV4PXMsbC5fX2RyYXdJbmRleDxsLl9fZW5kSW5kZXgmJihoPSExKX0sZD10aGlzLGY9MDtmPG8ubGVuZ3RoO2YrKylwKGYpO3JldHVybiByLnd4YSYmRSh0aGlzLl9sYXllcnMsKGZ1bmN0aW9uKHQpe3QmJnQuY3R4JiZ0LmN0eC5kcmF3JiZ0LmN0eC5kcmF3KCl9KSkse2ZpbmlzaGVkOmgsbmVlZHNSZWZyZXNoSG92ZXI6Y319LHQucHJvdG90eXBlLl9kb1BhaW50RWw9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPWUuY3R4O2lmKG4pe3ZhciBzPXQuZ2V0UGFpbnRSZWN0KCk7KCFpfHxzJiZzLmludGVyc2VjdChpKSkmJihmdihhLHQscixvKSx0LnNldFByZXZQYWludFJlY3QocykpfWVsc2UgZnYoYSx0LHIsbyl9LHQucHJvdG90eXBlLmdldExheWVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc2luZ2xlQ2FudmFzJiYhdGhpcy5fbmVlZHNNYW51YWxseUNvbXBvc2l0aW5nJiYodD1sUyk7dmFyIG49dGhpcy5fbGF5ZXJzW3RdO3JldHVybiBufHwoKG49bmV3IGFTKCJ6cl8iK3QsdGhpcyx0aGlzLmRwcikpLnpsZXZlbD10LG4uX19idWlsdGluX189ITAsdGhpcy5fbGF5ZXJDb25maWdbdF0/QyhuLHRoaXMuX2xheWVyQ29uZmlnW3RdLCEwKTp0aGlzLl9sYXllckNvbmZpZ1t0LXVTXSYmQyhuLHRoaXMuX2xheWVyQ29uZmlnW3QtdVNdLCEwKSxlJiYobi52aXJ0dWFsPWUpLHRoaXMuaW5zZXJ0TGF5ZXIodCxuKSxuLmluaXRDb250ZXh0KCkpLG59LHQucHJvdG90eXBlLmluc2VydExheWVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbGF5ZXJzLGk9dGhpcy5femxldmVsTGlzdCxyPWkubGVuZ3RoLG89dGhpcy5fZG9tUm9vdCxhPW51bGwscz0tMTtpZighblt0XSYmZnVuY3Rpb24odCl7cmV0dXJuISF0JiYoISF0Ll9fYnVpbHRpbl9ffHwiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXNpemUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlZnJlc2gpfShlKSl7aWYocj4wJiZ0PmlbMF0pe2ZvcihzPTA7czxyLTEmJiEoaVtzXTx0JiZpW3MrMV0+dCk7cysrKTthPW5baVtzXV19aWYoaS5zcGxpY2UocysxLDAsdCksblt0XT1lLCFlLnZpcnR1YWwpaWYoYSl7dmFyIGw9YS5kb207bC5uZXh0U2libGluZz9vLmluc2VydEJlZm9yZShlLmRvbSxsLm5leHRTaWJsaW5nKTpvLmFwcGVuZENoaWxkKGUuZG9tKX1lbHNlIG8uZmlyc3RDaGlsZD9vLmluc2VydEJlZm9yZShlLmRvbSxvLmZpcnN0Q2hpbGQpOm8uYXBwZW5kQ2hpbGQoZS5kb20pO2UucGFpbnRlcnx8KGUucGFpbnRlcj10aGlzKX19LHQucHJvdG90eXBlLmVhY2hMYXllcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl96bGV2ZWxMaXN0LGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHI9bltpXTt0LmNhbGwoZSx0aGlzLl9sYXllcnNbcl0scil9fSx0LnByb3RvdHlwZS5lYWNoQnVpbHRpbkxheWVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuX3psZXZlbExpc3QsaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldLG89dGhpcy5fbGF5ZXJzW3JdO28uX19idWlsdGluX18mJnQuY2FsbChlLG8scil9fSx0LnByb3RvdHlwZS5lYWNoT3RoZXJMYXllcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl96bGV2ZWxMaXN0LGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHI9bltpXSxvPXRoaXMuX2xheWVyc1tyXTtvLl9fYnVpbHRpbl9ffHx0LmNhbGwoZSxvLHIpfX0sdC5wcm90b3R5cGUuZ2V0TGF5ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xheWVyc30sdC5wcm90b3R5cGUuX3VwZGF0ZUxheWVyU3RhdHVzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7byYmKG8uX19lbmRJbmRleCE9PXQmJihvLl9fZGlydHk9ITApLG8uX19lbmRJbmRleD10KX1pZih0aGlzLmVhY2hCdWlsdGluTGF5ZXIoKGZ1bmN0aW9uKHQsZSl7dC5fX2RpcnR5PXQuX191c2VkPSExfSkpLHRoaXMuX3NpbmdsZUNhbnZhcylmb3IodmFyIG49MTtuPHQubGVuZ3RoO24rKyl7aWYoKHM9dFtuXSkuemxldmVsIT09dFtuLTFdLnpsZXZlbHx8cy5pbmNyZW1lbnRhbCl7dGhpcy5fbmVlZHNNYW51YWxseUNvbXBvc2l0aW5nPSEwO2JyZWFrfX12YXIgaSxyLG89bnVsbCxhPTA7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIHMsbD0ocz10W3JdKS56bGV2ZWwsdT12b2lkIDA7aSE9PWwmJihpPWwsYT0wKSxzLmluY3JlbWVudGFsPygodT10aGlzLmdldExheWVyKGwrLjAwMSx0aGlzLl9uZWVkc01hbnVhbGx5Q29tcG9zaXRpbmcpKS5pbmNyZW1lbnRhbD0hMCxhPTEpOnU9dGhpcy5nZXRMYXllcihsKyhhPjA/dVM6MCksdGhpcy5fbmVlZHNNYW51YWxseUNvbXBvc2l0aW5nKSx1Ll9fYnVpbHRpbl9ffHxJKCJaTGV2ZWwgIitsKyIgaGFzIGJlZW4gdXNlZCBieSB1bmtvd24gbGF5ZXIgIit1LmlkKSx1IT09byYmKHUuX191c2VkPSEwLHUuX19zdGFydEluZGV4IT09ciYmKHUuX19kaXJ0eT0hMCksdS5fX3N0YXJ0SW5kZXg9cix1LmluY3JlbWVudGFsP3UuX19kcmF3SW5kZXg9LTE6dS5fX2RyYXdJbmRleD1yLGUociksbz11KSwxJnMuX19kaXJ0eSYmIXMuX19pbkhvdmVyJiYodS5fX2RpcnR5PSEwLHUuaW5jcmVtZW50YWwmJnUuX19kcmF3SW5kZXg8MCYmKHUuX19kcmF3SW5kZXg9cikpfWUociksdGhpcy5lYWNoQnVpbHRpbkxheWVyKChmdW5jdGlvbih0LGUpeyF0Ll9fdXNlZCYmdC5nZXRFbGVtZW50Q291bnQoKT4wJiYodC5fX2RpcnR5PSEwLHQuX19zdGFydEluZGV4PXQuX19lbmRJbmRleD10Ll9fZHJhd0luZGV4PTApLHQuX19kaXJ0eSYmdC5fX2RyYXdJbmRleDwwJiYodC5fX2RyYXdJbmRleD10Ll9fc3RhcnRJbmRleCl9KSl9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEJ1aWx0aW5MYXllcih0aGlzLl9jbGVhckxheWVyKSx0aGlzfSx0LnByb3RvdHlwZS5fY2xlYXJMYXllcj1mdW5jdGlvbih0KXt0LmNsZWFyKCl9LHQucHJvdG90eXBlLnNldEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbih0KXt0aGlzLl9iYWNrZ3JvdW5kQ29sb3I9dCxFKHRoaXMuX2xheWVycywoZnVuY3Rpb24odCl7dC5zZXRVbnBhaW50ZWQoKX0pKX0sdC5wcm90b3R5cGUuY29uZmlnTGF5ZXI9ZnVuY3Rpb24odCxlKXtpZihlKXt2YXIgbj10aGlzLl9sYXllckNvbmZpZztuW3RdP0Moblt0XSxlLCEwKTpuW3RdPWU7Zm9yKHZhciBpPTA7aTx0aGlzLl96bGV2ZWxMaXN0Lmxlbmd0aDtpKyspe3ZhciByPXRoaXMuX3psZXZlbExpc3RbaV07aWYocj09PXR8fHI9PT10K3VTKUModGhpcy5fbGF5ZXJzW3JdLG5bdF0sITApfX19LHQucHJvdG90eXBlLmRlbExheWVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2xheWVycyxuPXRoaXMuX3psZXZlbExpc3QsaT1lW3RdO2kmJihpLmRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkuZG9tKSxkZWxldGUgZVt0XSxuLnNwbGljZShQKG4sdCksMSkpfSx0LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9kb21Sb290LnN0eWxlKXt2YXIgbj10aGlzLl9kb21Sb290O24uc3R5bGUuZGlzcGxheT0ibm9uZSI7dmFyIGk9dGhpcy5fb3B0cyxyPXRoaXMucm9vdDtpZihudWxsIT10JiYoaS53aWR0aD10KSxudWxsIT1lJiYoaS5oZWlnaHQ9ZSksdD0keShyLDAsaSksZT0keShyLDEsaSksbi5zdHlsZS5kaXNwbGF5PSIiLHRoaXMuX3dpZHRoIT09dHx8ZSE9PXRoaXMuX2hlaWdodCl7Zm9yKHZhciBvIGluIG4uc3R5bGUud2lkdGg9dCsicHgiLG4uc3R5bGUuaGVpZ2h0PWUrInB4Iix0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzLmhhc093blByb3BlcnR5KG8pJiZ0aGlzLl9sYXllcnNbb10ucmVzaXplKHQsZSk7dGhpcy5yZWZyZXNoKCEwKX10aGlzLl93aWR0aD10LHRoaXMuX2hlaWdodD1lfWVsc2V7aWYobnVsbD09dHx8bnVsbD09ZSlyZXR1cm47dGhpcy5fd2lkdGg9dCx0aGlzLl9oZWlnaHQ9ZSx0aGlzLmdldExheWVyKGxTKS5yZXNpemUodCxlKX1yZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuY2xlYXJMYXllcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXllcnNbdF07ZSYmZS5jbGVhcigpfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5yb290LmlubmVySFRNTD0iIix0aGlzLnJvb3Q9dGhpcy5zdG9yYWdlPXRoaXMuX2RvbVJvb3Q9dGhpcy5fbGF5ZXJzPW51bGx9LHQucHJvdG90eXBlLmdldFJlbmRlcmVkQ2FudmFzPWZ1bmN0aW9uKHQpe2lmKHQ9dHx8e30sdGhpcy5fc2luZ2xlQ2FudmFzJiYhdGhpcy5fY29tcG9zaXRlTWFudWFsbHkpcmV0dXJuIHRoaXMuX2xheWVyc1szMTQxNTldLmRvbTt2YXIgZT1uZXcgYVMoImltYWdlIix0aGlzLHQucGl4ZWxSYXRpb3x8dGhpcy5kcHIpO2UuaW5pdENvbnRleHQoKSxlLmNsZWFyKCExLHQuYmFja2dyb3VuZENvbG9yfHx0aGlzLl9iYWNrZ3JvdW5kQ29sb3IpO3ZhciBuPWUuY3R4O2lmKHQucGl4ZWxSYXRpbzw9dGhpcy5kcHIpe3RoaXMucmVmcmVzaCgpO3ZhciBpPWUuZG9tLndpZHRoLHI9ZS5kb20uaGVpZ2h0O3RoaXMuZWFjaExheWVyKChmdW5jdGlvbih0KXt0Ll9fYnVpbHRpbl9fP24uZHJhd0ltYWdlKHQuZG9tLDAsMCxpLHIpOnQucmVuZGVyVG9DYW52YXMmJihuLnNhdmUoKSx0LnJlbmRlclRvQ2FudmFzKG4pLG4ucmVzdG9yZSgpKX0pKX1lbHNlIGZvcih2YXIgbz17aW5Ib3ZlcjohMSx2aWV3V2lkdGg6dGhpcy5fd2lkdGgsdmlld0hlaWdodDp0aGlzLl9oZWlnaHR9LGE9dGhpcy5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCEwKSxzPTAsbD1hLmxlbmd0aDtzPGw7cysrKXt2YXIgdT1hW3NdO2Z2KG4sdSxvLHM9PT1sLTEpfXJldHVybiBlLmRvbX0sdC5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9LHQucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oZWlnaHR9LHR9KCk7dmFyIGNTPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5oYXNTeW1ib2xWaXN1YWw9ITAsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBfeChudWxsLHRoaXMse3VzZUVuY29kZURlZmF1bHRlcjohMH0pfSxlLnByb3RvdHlwZS5nZXRMZWdlbmRJY29uPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBCcixuPVh5KCJsaW5lIiwwLHQuaXRlbUhlaWdodC8yLHQuaXRlbVdpZHRoLDAsdC5saW5lU3R5bGUuc3Ryb2tlLCExKTtlLmFkZChuKSxuLnNldFN0eWxlKHQubGluZVN0eWxlKTt2YXIgaT10aGlzLmdldERhdGEoKS5nZXRWaXN1YWwoInN5bWJvbCIpLHI9dGhpcy5nZXREYXRhKCkuZ2V0VmlzdWFsKCJzeW1ib2xSb3RhdGUiKSxvPSJub25lIj09PWk/ImNpcmNsZSI6aSxhPS44KnQuaXRlbUhlaWdodCxzPVh5KG8sKHQuaXRlbVdpZHRoLWEpLzIsKHQuaXRlbUhlaWdodC1hKS8yLGEsYSx0Lml0ZW1TdHlsZS5maWxsKTtlLmFkZChzKSxzLnNldFN0eWxlKHQuaXRlbVN0eWxlKTt2YXIgbD0iaW5oZXJpdCI9PT10Lmljb25Sb3RhdGU/cjp0Lmljb25Sb3RhdGV8fDA7cmV0dXJuIHMucm90YXRpb249bCpNYXRoLlBJLzE4MCxzLnNldE9yaWdpbihbdC5pdGVtV2lkdGgvMix0Lml0ZW1IZWlnaHQvMl0pLG8uaW5kZXhPZigiZW1wdHkiKT4tMSYmKHMuc3R5bGUuc3Ryb2tlPXMuc3R5bGUuZmlsbCxzLnN0eWxlLmZpbGw9IiNmZmYiLHMuc3R5bGUubGluZVdpZHRoPTIpLGV9LGUudHlwZT0ic2VyaWVzLmxpbmUiLGUuZGVwZW5kZW5jaWVzPVsiZ3JpZCIsInBvbGFyIl0sZS5kZWZhdWx0T3B0aW9uPXt6OjMsY29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLGxlZ2VuZEhvdmVyTGluazohMCxjbGlwOiEwLGxhYmVsOntwb3NpdGlvbjoidG9wIn0sZW5kTGFiZWw6e3Nob3c6ITEsdmFsdWVBbmltYXRpb246ITAsZGlzdGFuY2U6OH0sbGluZVN0eWxlOnt3aWR0aDoyLHR5cGU6InNvbGlkIn0sZW1waGFzaXM6e3NjYWxlOiEwfSxzdGVwOiExLHNtb290aDohMSxzbW9vdGhNb25vdG9uZTpudWxsLHN5bWJvbDoiZW1wdHlDaXJjbGUiLHN5bWJvbFNpemU6NCxzeW1ib2xSb3RhdGU6bnVsbCxzaG93U3ltYm9sOiEwLHNob3dBbGxTeW1ib2w6ImF1dG8iLGNvbm5lY3ROdWxsczohMSxzYW1wbGluZzoibm9uZSIsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLHByb2dyZXNzaXZlOjAsaG92ZXJMYXllclRocmVzaG9sZDoxLzAsdW5pdmVyc2FsVHJhbnNpdGlvbjp7ZGl2aWRlU2hhcGU6ImNsb25lIn0sdHJpZ2dlckxpbmVFdmVudDohMX0sZX0oYmcpO2Z1bmN0aW9uIHBTKHQsZSl7dmFyIG49dC5tYXBEaW1lbnNpb25zQWxsKCJkZWZhdWx0ZWRMYWJlbCIpLGk9bi5sZW5ndGg7aWYoMT09PWkpe3ZhciByPW1mKHQsZSxuWzBdKTtyZXR1cm4gbnVsbCE9cj9yKyIiOm51bGx9aWYoaSl7Zm9yKHZhciBvPVtdLGE9MDthPG4ubGVuZ3RoO2ErKylvLnB1c2gobWYodCxlLG5bYV0pKTtyZXR1cm4gby5qb2luKCIgIil9fWZ1bmN0aW9uIGRTKHQsZSl7dmFyIG49dC5tYXBEaW1lbnNpb25zQWxsKCJkZWZhdWx0ZWRMYWJlbCIpO2lmKCFZKGUpKXJldHVybiBlKyIiO2Zvcih2YXIgaT1bXSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPXQuZ2V0RGltZW5zaW9uSW5kZXgobltyXSk7bz49MCYmaS5wdXNoKGVbb10pfXJldHVybiBpLmpvaW4oIiAiKX12YXIgZlM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4saSxyKXt2YXIgbz10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG8udXBkYXRlRGF0YShlLG4saSxyKSxvfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuX2NyZWF0ZVN5bWJvbD1mdW5jdGlvbih0LGUsbixpLHIpe3RoaXMucmVtb3ZlQWxsKCk7dmFyIG89WHkodCwtMSwtMSwyLDIsbnVsbCxyKTtvLmF0dHIoe3oyOjEwMCxjdWxsaW5nOiEwLHNjYWxlWDppWzBdLzIsc2NhbGVZOmlbMV0vMn0pLG8uZHJpZnQ9Z1MsdGhpcy5fc3ltYm9sVHlwZT10LHRoaXMuYWRkKG8pfSxlLnByb3RvdHlwZS5zdG9wU3ltYm9sQW5pbWF0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuY2hpbGRBdCgwKS5zdG9wQW5pbWF0aW9uKG51bGwsdCl9LGUucHJvdG90eXBlLmdldFN5bWJvbFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ltYm9sVHlwZX0sZS5wcm90b3R5cGUuZ2V0U3ltYm9sUGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkQXQoMCl9LGUucHJvdG90eXBlLmhpZ2hsaWdodD1mdW5jdGlvbigpe09sKHRoaXMuY2hpbGRBdCgwKSl9LGUucHJvdG90eXBlLmRvd25wbGF5PWZ1bmN0aW9uKCl7UmwodGhpcy5jaGlsZEF0KDApKX0sZS5wcm90b3R5cGUuc2V0Wj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY2hpbGRBdCgwKTtuLnpsZXZlbD10LG4uej1lfSxlLnByb3RvdHlwZS5zZXREcmFnZ2FibGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNoaWxkQXQoMCk7bi5kcmFnZ2FibGU9dCxuLmN1cnNvcj0hZSYmdD8ibW92ZSI6bi5jdXJzb3J9LGUucHJvdG90eXBlLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxuLGkscil7dGhpcy5zaWxlbnQ9ITE7dmFyIG89dC5nZXRJdGVtVmlzdWFsKG4sInN5bWJvbCIpfHwiY2lyY2xlIixhPXQuaG9zdE1vZGVsLHM9ZS5nZXRTeW1ib2xTaXplKHQsbiksbD1vIT09dGhpcy5fc3ltYm9sVHlwZSx1PXImJnIuZGlzYWJsZUFuaW1hdGlvbjtpZihsKXt2YXIgaD10LmdldEl0ZW1WaXN1YWwobiwic3ltYm9sS2VlcEFzcGVjdCIpO3RoaXMuX2NyZWF0ZVN5bWJvbChvLHQsbixzLGgpfWVsc2V7KHA9dGhpcy5jaGlsZEF0KDApKS5zaWxlbnQ9ITE7dmFyIGM9e3NjYWxlWDpzWzBdLzIsc2NhbGVZOnNbMV0vMn07dT9wLmF0dHIoYyk6dmgocCxjLGEsbiksU2gocCl9aWYodGhpcy5fdXBkYXRlQ29tbW9uKHQsbixzLGksciksbCl7dmFyIHA9dGhpcy5jaGlsZEF0KDApO2lmKCF1KXtjPXtzY2FsZVg6dGhpcy5fc2l6ZVgsc2NhbGVZOnRoaXMuX3NpemVZLHN0eWxlOntvcGFjaXR5OnAuc3R5bGUub3BhY2l0eX19O3Auc2NhbGVYPXAuc2NhbGVZPTAscC5zdHlsZS5vcGFjaXR5PTAsbWgocCxjLGEsbil9fXUmJnRoaXMuY2hpbGRBdCgwKS5zdG9wQW5pbWF0aW9uKCJsZWF2ZSIpfSxlLnByb3RvdHlwZS5fdXBkYXRlQ29tbW9uPWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG8sYSxzLGwsdSxoLGMscCxkLGY9dGhpcy5jaGlsZEF0KDApLGc9dC5ob3N0TW9kZWw7aWYoaSYmKG89aS5lbXBoYXNpc0l0ZW1TdHlsZSxhPWkuYmx1ckl0ZW1TdHlsZSxzPWkuc2VsZWN0SXRlbVN0eWxlLGw9aS5mb2N1cyx1PWkuYmx1clNjb3BlLGM9aS5sYWJlbFN0YXRlc01vZGVscyxwPWkuaG92ZXJTY2FsZSxkPWkuY3Vyc29yU3R5bGUsaD1pLmVtcGhhc2lzRGlzYWJsZWQpLCFpfHx0Lmhhc0l0ZW1PcHRpb24pe3ZhciB5PWkmJmkuaXRlbU1vZGVsP2kuaXRlbU1vZGVsOnQuZ2V0SXRlbU1vZGVsKGUpLHY9eS5nZXRNb2RlbCgiZW1waGFzaXMiKTtvPXYuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpLHM9eS5nZXRNb2RlbChbInNlbGVjdCIsIml0ZW1TdHlsZSJdKS5nZXRJdGVtU3R5bGUoKSxhPXkuZ2V0TW9kZWwoWyJibHVyIiwiaXRlbVN0eWxlIl0pLmdldEl0ZW1TdHlsZSgpLGw9di5nZXQoImZvY3VzIiksdT12LmdldCgiYmx1clNjb3BlIiksaD12LmdldCgiZGlzYWJsZWQiKSxjPXJjKHkpLHA9di5nZXRTaGFsbG93KCJzY2FsZSIpLGQ9eS5nZXRTaGFsbG93KCJjdXJzb3IiKX12YXIgbT10LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sUm90YXRlIik7Zi5hdHRyKCJyb3RhdGlvbiIsKG18fDApKk1hdGguUEkvMTgwfHwwKTt2YXIgeD1aeSh0LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sT2Zmc2V0Iiksbik7eCYmKGYueD14WzBdLGYueT14WzFdKSxkJiZmLmF0dHIoImN1cnNvciIsZCk7dmFyIF89dC5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIiksYj1fLmZpbGw7aWYoZiBpbnN0YW5jZW9mIE5zKXt2YXIgdz1mLnN0eWxlO2YudXNlU3R5bGUoQSh7aW1hZ2U6dy5pbWFnZSx4OncueCx5OncueSx3aWR0aDp3LndpZHRoLGhlaWdodDp3LmhlaWdodH0sXykpfWVsc2UgZi5fX2lzRW1wdHlCcnVzaD9mLnVzZVN0eWxlKEEoe30sXykpOmYudXNlU3R5bGUoXyksZi5zdHlsZS5kZWNhbD1udWxsLGYuc2V0Q29sb3IoYixyJiZyLnN5bWJvbElubmVyQ29sb3IpLGYuc3R5bGUuc3Ryb2tlTm9TY2FsZT0hMDt2YXIgUz10LmdldEl0ZW1WaXN1YWwoZSwibGlmdFoiKSxNPXRoaXMuX3oyO251bGwhPVM/bnVsbD09TSYmKHRoaXMuX3oyPWYuejIsZi56Mis9Uyk6bnVsbCE9TSYmKGYuejI9TSx0aGlzLl96Mj1udWxsKTt2YXIgST1yJiZyLnVzZU5hbWVMYWJlbDtpYyhmLGMse2xhYmVsRmV0Y2hlcjpnLGxhYmVsRGF0YUluZGV4OmUsZGVmYXVsdFRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEk/dC5nZXROYW1lKGUpOnBTKHQsZSl9LGluaGVyaXRDb2xvcjpiLGRlZmF1bHRPcGFjaXR5Ol8ub3BhY2l0eX0pLHRoaXMuX3NpemVYPW5bMF0vMix0aGlzLl9zaXplWT1uWzFdLzI7dmFyIFQ9Zi5lbnN1cmVTdGF0ZSgiZW1waGFzaXMiKTtULnN0eWxlPW8sZi5lbnN1cmVTdGF0ZSgic2VsZWN0Iikuc3R5bGU9cyxmLmVuc3VyZVN0YXRlKCJibHVyIikuc3R5bGU9YTt2YXIgQz1udWxsPT1wfHwhMD09PXA/TWF0aC5tYXgoMS4xLDMvdGhpcy5fc2l6ZVkpOmlzRmluaXRlKHApJiZwPjA/K3A6MTtULnNjYWxlWD10aGlzLl9zaXplWCpDLFQuc2NhbGVZPXRoaXMuX3NpemVZKkMsdGhpcy5zZXRTeW1ib2xTY2FsZSgxKSxabCh0aGlzLGwsdSxoKX0sZS5wcm90b3R5cGUuc2V0U3ltYm9sU2NhbGU9ZnVuY3Rpb24odCl7dGhpcy5zY2FsZVg9dGhpcy5zY2FsZVk9dH0sZS5wcm90b3R5cGUuZmFkZU91dD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5jaGlsZEF0KDApLHI9cmwodGhpcykuZGF0YUluZGV4LG89biYmbi5hbmltYXRpb247aWYodGhpcy5zaWxlbnQ9aS5zaWxlbnQ9ITAsbiYmbi5mYWRlTGFiZWwpe3ZhciBhPWkuZ2V0VGV4dENvbnRlbnQoKTthJiZfaChhLHtzdHlsZTp7b3BhY2l0eTowfX0sZSx7ZGF0YUluZGV4OnIscmVtb3ZlT3B0Om8sY2I6ZnVuY3Rpb24oKXtpLnJlbW92ZVRleHRDb250ZW50KCl9fSl9ZWxzZSBpLnJlbW92ZVRleHRDb250ZW50KCk7X2goaSx7c3R5bGU6e29wYWNpdHk6MH0sc2NhbGVYOjAsc2NhbGVZOjB9LGUse2RhdGFJbmRleDpyLGNiOnQscmVtb3ZlT3B0Om99KX0sZS5nZXRTeW1ib2xTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFV5KHQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIikpfSxlfShCcik7ZnVuY3Rpb24gZ1ModCxlKXt0aGlzLnBhcmVudC5kcmlmdCh0LGUpfWZ1bmN0aW9uIHlTKHQsZSxuLGkpe3JldHVybiBlJiYhaXNOYU4oZVswXSkmJiFpc05hTihlWzFdKSYmIShpLmlzSWdub3JlJiZpLmlzSWdub3JlKG4pKSYmIShpLmNsaXBTaGFwZSYmIWkuY2xpcFNoYXBlLmNvbnRhaW4oZVswXSxlWzFdKSkmJiJub25lIiE9PXQuZ2V0SXRlbVZpc3VhbChuLCJzeW1ib2wiKX1mdW5jdGlvbiB2Uyh0KXtyZXR1cm4gbnVsbD09dHx8cSh0KXx8KHQ9e2lzSWdub3JlOnR9KSx0fHx7fX1mdW5jdGlvbiBtUyh0KXt2YXIgZT10Lmhvc3RNb2RlbCxuPWUuZ2V0TW9kZWwoImVtcGhhc2lzIik7cmV0dXJue2VtcGhhc2lzSXRlbVN0eWxlOm4uZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpLGJsdXJJdGVtU3R5bGU6ZS5nZXRNb2RlbChbImJsdXIiLCJpdGVtU3R5bGUiXSkuZ2V0SXRlbVN0eWxlKCksc2VsZWN0SXRlbVN0eWxlOmUuZ2V0TW9kZWwoWyJzZWxlY3QiLCJpdGVtU3R5bGUiXSkuZ2V0SXRlbVN0eWxlKCksZm9jdXM6bi5nZXQoImZvY3VzIiksYmx1clNjb3BlOm4uZ2V0KCJibHVyU2NvcGUiKSxlbXBoYXNpc0Rpc2FibGVkOm4uZ2V0KCJkaXNhYmxlZCIpLGhvdmVyU2NhbGU6bi5nZXQoInNjYWxlIiksbGFiZWxTdGF0ZXNNb2RlbHM6cmMoZSksY3Vyc29yU3R5bGU6ZS5nZXQoImN1cnNvciIpfX12YXIgeFM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZ3JvdXA9bmV3IEJyLHRoaXMuX1N5bWJvbEN0b3I9dHx8ZlN9cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlKXt0aGlzLl9wcm9ncmVzc2l2ZUVscz1udWxsLGU9dlMoZSk7dmFyIG49dGhpcy5ncm91cCxpPXQuaG9zdE1vZGVsLHI9dGhpcy5fZGF0YSxvPXRoaXMuX1N5bWJvbEN0b3IsYT1lLmRpc2FibGVBbmltYXRpb24scz1tUyh0KSxsPXtkaXNhYmxlQW5pbWF0aW9uOmF9LHU9ZS5nZXRTeW1ib2xQb2ludHx8ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZ2V0SXRlbUxheW91dChlKX07cnx8bi5yZW1vdmVBbGwoKSx0LmRpZmYocikuYWRkKChmdW5jdGlvbihpKXt2YXIgcj11KGkpO2lmKHlTKHQscixpLGUpKXt2YXIgYT1uZXcgbyh0LGkscyxsKTthLnNldFBvc2l0aW9uKHIpLHQuc2V0SXRlbUdyYXBoaWNFbChpLGEpLG4uYWRkKGEpfX0pKS51cGRhdGUoKGZ1bmN0aW9uKGgsYyl7dmFyIHA9ci5nZXRJdGVtR3JhcGhpY0VsKGMpLGQ9dShoKTtpZih5Uyh0LGQsaCxlKSl7dmFyIGY9dC5nZXRJdGVtVmlzdWFsKGgsInN5bWJvbCIpfHwiY2lyY2xlIixnPXAmJnAuZ2V0U3ltYm9sVHlwZSYmcC5nZXRTeW1ib2xUeXBlKCk7aWYoIXB8fGcmJmchPT1mKW4ucmVtb3ZlKHApLChwPW5ldyBvKHQsaCxzLGwpKS5zZXRQb3NpdGlvbihkKTtlbHNle3AudXBkYXRlRGF0YSh0LGgscyxsKTt2YXIgeT17eDpkWzBdLHk6ZFsxXX07YT9wLmF0dHIoeSk6dmgocCx5LGkpfW4uYWRkKHApLHQuc2V0SXRlbUdyYXBoaWNFbChoLHApfWVsc2Ugbi5yZW1vdmUocCl9KSkucmVtb3ZlKChmdW5jdGlvbih0KXt2YXIgZT1yLmdldEl0ZW1HcmFwaGljRWwodCk7ZSYmZS5mYWRlT3V0KChmdW5jdGlvbigpe24ucmVtb3ZlKGUpfSksaSl9KSkuZXhlY3V0ZSgpLHRoaXMuX2dldFN5bWJvbFBvaW50PXUsdGhpcy5fZGF0YT10fSx0LnByb3RvdHlwZS51cGRhdGVMYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fZGF0YTtlJiZlLmVhY2hJdGVtR3JhcGhpY0VsKChmdW5jdGlvbihlLG4pe3ZhciBpPXQuX2dldFN5bWJvbFBvaW50KG4pO2Uuc2V0UG9zaXRpb24oaSksZS5tYXJrUmVkcmF3KCl9KSl9LHQucHJvdG90eXBlLmluY3JlbWVudGFsUHJlcGFyZVVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLl9zZXJpZXNTY29wZT1tUyh0KSx0aGlzLl9kYXRhPW51bGwsdGhpcy5ncm91cC5yZW1vdmVBbGwoKX0sdC5wcm90b3R5cGUuaW5jcmVtZW50YWxVcGRhdGU9ZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIGkodCl7dC5pc0dyb3VwfHwodC5pbmNyZW1lbnRhbD0hMCx0LmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLmhvdmVyTGF5ZXI9ITApfXRoaXMuX3Byb2dyZXNzaXZlRWxzPVtdLG49dlMobik7Zm9yKHZhciByPXQuc3RhcnQ7cjx0LmVuZDtyKyspe3ZhciBvPWUuZ2V0SXRlbUxheW91dChyKTtpZih5UyhlLG8scixuKSl7dmFyIGE9bmV3IHRoaXMuX1N5bWJvbEN0b3IoZSxyLHRoaXMuX3Nlcmllc1Njb3BlKTthLnRyYXZlcnNlKGkpLGEuc2V0UG9zaXRpb24obyksdGhpcy5ncm91cC5hZGQoYSksZS5zZXRJdGVtR3JhcGhpY0VsKHIsYSksdGhpcy5fcHJvZ3Jlc3NpdmVFbHMucHVzaChhKX19fSx0LnByb3RvdHlwZS5lYWNoUmVuZGVyZWQ9ZnVuY3Rpb24odCl7SmgodGhpcy5fcHJvZ3Jlc3NpdmVFbHN8fHRoaXMuZ3JvdXAsdCl9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyb3VwLG49dGhpcy5fZGF0YTtuJiZ0P24uZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKHQpe3QuZmFkZU91dCgoZnVuY3Rpb24oKXtlLnJlbW92ZSh0KX0pLG4uaG9zdE1vZGVsKX0pKTplLnJlbW92ZUFsbCgpfSx0fSgpO2Z1bmN0aW9uIF9TKHQsZSxuKXt2YXIgaT10LmdldEJhc2VBeGlzKCkscj10LmdldE90aGVyQXhpcyhpKSxvPWZ1bmN0aW9uKHQsZSl7dmFyIG49MCxpPXQuc2NhbGUuZ2V0RXh0ZW50KCk7InN0YXJ0Ij09PWU/bj1pWzBdOiJlbmQiPT09ZT9uPWlbMV06aihlKSYmIWlzTmFOKGUpP249ZTppWzBdPjA/bj1pWzBdOmlbMV08MCYmKG49aVsxXSk7cmV0dXJuIG59KHIsbiksYT1pLmRpbSxzPXIuZGltLGw9ZS5tYXBEaW1lbnNpb24ocyksdT1lLm1hcERpbWVuc2lvbihhKSxoPSJ4Ij09PXN8fCJyYWRpdXMiPT09cz8xOjAsYz16KHQuZGltZW5zaW9ucywoZnVuY3Rpb24odCl7cmV0dXJuIGUubWFwRGltZW5zaW9uKHQpfSkpLHA9ITEsZD1lLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tSZXN1bHREaW1lbnNpb24iKTtyZXR1cm4gbXgoZSxjWzBdKSYmKHA9ITAsY1swXT1kKSxteChlLGNbMV0pJiYocD0hMCxjWzFdPWQpLHtkYXRhRGltc0ZvclBvaW50OmMsdmFsdWVTdGFydDpvLHZhbHVlQXhpc0RpbTpzLGJhc2VBeGlzRGltOmEsc3RhY2tlZDohIXAsdmFsdWVEaW06bCxiYXNlRGltOnUsYmFzZURhdGFPZmZzZXQ6aCxzdGFja2VkT3ZlckRpbWVuc2lvbjplLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tlZE92ZXJEaW1lbnNpb24iKX19ZnVuY3Rpb24gYlModCxlLG4saSl7dmFyIHI9TmFOO3Quc3RhY2tlZCYmKHI9bi5nZXQobi5nZXRDYWxjdWxhdGlvbkluZm8oInN0YWNrZWRPdmVyRGltZW5zaW9uIiksaSkpLGlzTmFOKHIpJiYocj10LnZhbHVlU3RhcnQpO3ZhciBvPXQuYmFzZURhdGFPZmZzZXQsYT1bXTtyZXR1cm4gYVtvXT1uLmdldCh0LmJhc2VEaW0saSksYVsxLW9dPXIsZS5kYXRhVG9Qb2ludChhKX12YXIgd1M9TWF0aC5taW4sU1M9TWF0aC5tYXg7ZnVuY3Rpb24gTVModCxlKXtyZXR1cm4gaXNOYU4odCl8fGlzTmFOKGUpfWZ1bmN0aW9uIElTKHQsZSxuLGkscixvLGEscyxsKXtmb3IodmFyIHUsaCxjLHAsZCxmLGc9bix5PTA7eTxpO3krKyl7dmFyIHY9ZVsyKmddLG09ZVsyKmcrMV07aWYoZz49cnx8ZzwwKWJyZWFrO2lmKE1TKHYsbSkpe2lmKGwpe2crPW87Y29udGludWV9YnJlYWt9aWYoZz09PW4pdFtvPjA/Im1vdmVUbyI6ImxpbmVUbyJdKHYsbSksYz12LHA9bTtlbHNle3ZhciB4PXYtdSxfPW0taDtpZih4KngrXypfPC41KXtnKz1vO2NvbnRpbnVlfWlmKGE+MCl7Zm9yKHZhciBiPWcrbyx3PWVbMipiXSxTPWVbMipiKzFdO3c9PT12JiZTPT09bSYmeTxpOyl5KyssZys9byx3PWVbMiooYis9byldLFM9ZVsyKmIrMV0seD0odj1lWzIqZ10pLXUsXz0obT1lWzIqZysxXSktaDt2YXIgTT15KzE7aWYobClmb3IoO01TKHcsUykmJk08aTspTSsrLHc9ZVsyKihiKz1vKV0sUz1lWzIqYisxXTt2YXIgST0uNSxUPTAsQz0wLEQ9dm9pZCAwLEE9dm9pZCAwO2lmKE0+PWl8fE1TKHcsUykpZD12LGY9bTtlbHNle1Q9dy11LEM9Uy1oO3ZhciBrPXYtdSxMPXctdixQPW0taCxPPVMtbSxSPXZvaWQgMCxOPXZvaWQgMDtpZigieCI9PT1zKXt2YXIgRT1UPjA/MTotMTtkPXYtRSooUj1NYXRoLmFicyhrKSkqYSxmPW0sRD12K0UqKE49TWF0aC5hYnMoTCkpKmEsQT1tfWVsc2UgaWYoInkiPT09cyl7dmFyIHo9Qz4wPzE6LTE7ZD12LGY9bS16KihSPU1hdGguYWJzKFApKSphLEQ9dixBPW0reiooTj1NYXRoLmFicyhPKSkqYX1lbHNlIFI9TWF0aC5zcXJ0KGsqaytQKlApLGQ9di1UKmEqKDEtKEk9KE49TWF0aC5zcXJ0KEwqTCtPKk8pKS8oTitSKSkpLGY9bS1DKmEqKDEtSSksQT1tK0MqYSpJLEQ9d1MoRD12K1QqYSpJLFNTKHcsdikpLEE9d1MoQSxTUyhTLG0pKSxEPVNTKEQsd1Modyx2KSksZj1tLShDPShBPVNTKEEsd1MoUyxtKSkpLW0pKlIvTixkPXdTKGQ9di0oVD1ELXYpKlIvTixTUyh1LHYpKSxmPXdTKGYsU1MoaCxtKSksRD12KyhUPXYtKGQ9U1MoZCx3Uyh1LHYpKSkpKk4vUixBPW0rKEM9bS0oZj1TUyhmLHdTKGgsbSkpKSkqTi9SfXQuYmV6aWVyQ3VydmVUbyhjLHAsZCxmLHYsbSksYz1ELHA9QX1lbHNlIHQubGluZVRvKHYsbSl9dT12LGg9bSxnKz1vfXJldHVybiB5fXZhciBUUz1mdW5jdGlvbigpe3RoaXMuc21vb3RoPTAsdGhpcy5zbW9vdGhDb25zdHJhaW50PSEwfSxDUz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLnR5cGU9ImVjLXBvbHlsaW5lIixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJue3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfX0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUU30sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5wb2ludHMsaT0wLHI9bi5sZW5ndGgvMjtpZihlLmNvbm5lY3ROdWxscyl7Zm9yKDtyPjAmJk1TKG5bMipyLTJdLG5bMipyLTFdKTtyLS0pO2Zvcig7aTxyJiZNUyhuWzIqaV0sblsyKmkrMV0pO2krKyk7fWZvcig7aTxyOylpKz1JUyh0LG4saSxyLHIsMSxlLnNtb290aCxlLnNtb290aE1vbm90b25lLGUuY29ubmVjdE51bGxzKSsxfSxlLnByb3RvdHlwZS5nZXRQb2ludE9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5wYXRofHwodGhpcy5jcmVhdGVQYXRoUHJveHkoKSx0aGlzLmJ1aWxkUGF0aCh0aGlzLnBhdGgsdGhpcy5zaGFwZSkpO2Zvcih2YXIgbixpLHI9dGhpcy5wYXRoLmRhdGEsbz1ocy5DTUQsYT0ieCI9PT1lLHM9W10sbD0wO2w8ci5sZW5ndGg7KXt2YXIgdT12b2lkIDAsaD12b2lkIDAsYz12b2lkIDAscD12b2lkIDAsZD12b2lkIDAsZj12b2lkIDAsZz12b2lkIDA7c3dpdGNoKHJbbCsrXSl7Y2FzZSBvLk06bj1yW2wrK10saT1yW2wrK107YnJlYWs7Y2FzZSBvLkw6aWYodT1yW2wrK10saD1yW2wrK10sKGc9YT8odC1uKS8odS1uKToodC1pKS8oaC1pKSk8PTEmJmc+PTApe3ZhciB5PWE/KGgtaSkqZytpOih1LW4pKmcrbjtyZXR1cm4gYT9bdCx5XTpbeSx0XX1uPXUsaT1oO2JyZWFrO2Nhc2Ugby5DOnU9cltsKytdLGg9cltsKytdLGM9cltsKytdLHA9cltsKytdLGQ9cltsKytdLGY9cltsKytdO3ZhciB2PWE/X24obix1LGMsZCx0LHMpOl9uKGksaCxwLGYsdCxzKTtpZih2PjApZm9yKHZhciBtPTA7bTx2O20rKyl7dmFyIHg9c1ttXTtpZih4PD0xJiZ4Pj0wKXt5PWE/bW4oaSxoLHAsZix4KTptbihuLHUsYyxkLHgpO3JldHVybiBhP1t0LHldOlt5LHRdfX1uPWQsaT1mfX19LGV9KGtzKSxEUz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGV9KFRTKSxBUz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLnR5cGU9ImVjLXBvbHlnb24iLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0U2hhcGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERTfSxlLnByb3RvdHlwZS5idWlsZFBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnBvaW50cyxpPWUuc3RhY2tlZE9uUG9pbnRzLHI9MCxvPW4ubGVuZ3RoLzIsYT1lLnNtb290aE1vbm90b25lO2lmKGUuY29ubmVjdE51bGxzKXtmb3IoO28+MCYmTVMoblsyKm8tMl0sblsyKm8tMV0pO28tLSk7Zm9yKDtyPG8mJk1TKG5bMipyXSxuWzIqcisxXSk7cisrKTt9Zm9yKDtyPG87KXt2YXIgcz1JUyh0LG4scixvLG8sMSxlLnNtb290aCxhLGUuY29ubmVjdE51bGxzKTtJUyh0LGkscitzLTEscyxvLC0xLGUuc3RhY2tlZE9uU21vb3RoLGEsZS5jb25uZWN0TnVsbHMpLHIrPXMrMSx0LmNsb3NlUGF0aCgpfX0sZX0oa3MpO2Z1bmN0aW9uIGtTKHQsZSxuLGkscil7dmFyIG89dC5nZXRBcmVhKCksYT1vLngscz1vLnksbD1vLndpZHRoLHU9by5oZWlnaHQsaD1uLmdldChbImxpbmVTdHlsZSIsIndpZHRoIl0pfHwyO2EtPWgvMixzLT1oLzIsbCs9aCx1Kz1oLGw9TWF0aC5jZWlsKGwpLGEhPT1NYXRoLmZsb29yKGEpJiYoYT1NYXRoLmZsb29yKGEpLGwrKyk7dmFyIGM9bmV3IFdzKHtzaGFwZTp7eDphLHk6cyx3aWR0aDpsLGhlaWdodDp1fX0pO2lmKGUpe3ZhciBwPXQuZ2V0QmFzZUF4aXMoKSxkPXAuaXNIb3Jpem9udGFsKCksZj1wLmludmVyc2U7ZD8oZiYmKGMuc2hhcGUueCs9bCksYy5zaGFwZS53aWR0aD0wKTooZnx8KGMuc2hhcGUueSs9dSksYy5zaGFwZS5oZWlnaHQ9MCk7dmFyIGc9WChyKT9mdW5jdGlvbih0KXtyKHQsYyl9Om51bGw7bWgoYyx7c2hhcGU6e3dpZHRoOmwsaGVpZ2h0OnUseDphLHk6c319LG4sbnVsbCxpLGcpfXJldHVybiBjfWZ1bmN0aW9uIExTKHQsZSxuKXt2YXIgaT10LmdldEFyZWEoKSxyPUpyKGkucjAsMSksbz1KcihpLnIsMSksYT1uZXcgRnUoe3NoYXBlOntjeDpKcih0LmN4LDEpLGN5OkpyKHQuY3ksMSkscjA6cixyOm8sc3RhcnRBbmdsZTppLnN0YXJ0QW5nbGUsZW5kQW5nbGU6aS5lbmRBbmdsZSxjbG9ja3dpc2U6aS5jbG9ja3dpc2V9fSk7ZSYmKCJhbmdsZSI9PT10LmdldEJhc2VBeGlzKCkuZGltP2Euc2hhcGUuZW5kQW5nbGU9aS5zdGFydEFuZ2xlOmEuc2hhcGUucj1yLG1oKGEse3NoYXBlOntlbmRBbmdsZTppLmVuZEFuZ2xlLHI6b319LG4pKTtyZXR1cm4gYX1mdW5jdGlvbiBQUyh0LGUsbixpLHIpe3JldHVybiB0PyJwb2xhciI9PT10LnR5cGU/TFModCxlLG4pOiJjYXJ0ZXNpYW4yZCI9PT10LnR5cGU/a1ModCxlLG4saSxyKTpudWxsOm51bGx9ZnVuY3Rpb24gT1ModCxlKXtyZXR1cm4gdC50eXBlPT09ZX1mdW5jdGlvbiBSUyh0LGUpe2lmKHQubGVuZ3RoPT09ZS5sZW5ndGgpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl0hPT1lW25dKXJldHVybjtyZXR1cm4hMH19ZnVuY3Rpb24gTlModCl7Zm9yKHZhciBlPTEvMCxuPTEvMCxpPS0xLzAscj0tMS8wLG89MDtvPHQubGVuZ3RoOyl7dmFyIGE9dFtvKytdLHM9dFtvKytdO2lzTmFOKGEpfHwoZT1NYXRoLm1pbihhLGUpLGk9TWF0aC5tYXgoYSxpKSksaXNOYU4ocyl8fChuPU1hdGgubWluKHMsbikscj1NYXRoLm1heChzLHIpKX1yZXR1cm5bW2Usbl0sW2kscl1dfWZ1bmN0aW9uIEVTKHQsZSl7dmFyIG49TlModCksaT1uWzBdLHI9blsxXSxvPU5TKGUpLGE9b1swXSxzPW9bMV07cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKGlbMF0tYVswXSksTWF0aC5hYnMoaVsxXS1hWzFdKSxNYXRoLmFicyhyWzBdLXNbMF0pLE1hdGguYWJzKHJbMV0tc1sxXSkpfWZ1bmN0aW9uIHpTKHQpe3JldHVybiBqKHQpP3Q6dD8uNTowfWZ1bmN0aW9uIFZTKHQsZSxuLGkpe3ZhciByPWUuZ2V0QmFzZUF4aXMoKSxvPSJ4Ij09PXIuZGltfHwicmFkaXVzIj09PXIuZGltPzA6MSxhPVtdLHM9MCxsPVtdLHU9W10saD1bXSxjPVtdO2lmKGkpe2ZvcihzPTA7czx0Lmxlbmd0aDtzKz0yKWlzTmFOKHRbc10pfHxpc05hTih0W3MrMV0pfHxjLnB1c2godFtzXSx0W3MrMV0pO3Q9Y31mb3Iocz0wO3M8dC5sZW5ndGgtMjtzKz0yKXN3aXRjaChoWzBdPXRbcysyXSxoWzFdPXRbcyszXSx1WzBdPXRbc10sdVsxXT10W3MrMV0sYS5wdXNoKHVbMF0sdVsxXSksbil7Y2FzZSJlbmQiOmxbb109aFtvXSxsWzEtb109dVsxLW9dLGEucHVzaChsWzBdLGxbMV0pO2JyZWFrO2Nhc2UibWlkZGxlIjp2YXIgcD0odVtvXStoW29dKS8yLGQ9W107bFtvXT1kW29dPXAsbFsxLW9dPXVbMS1vXSxkWzEtb109aFsxLW9dLGEucHVzaChsWzBdLGxbMV0pLGEucHVzaChkWzBdLGRbMV0pO2JyZWFrO2RlZmF1bHQ6bFtvXT11W29dLGxbMS1vXT1oWzEtb10sYS5wdXNoKGxbMF0sbFsxXSl9cmV0dXJuIGEucHVzaCh0W3MrK10sdFtzKytdKSxhfWZ1bmN0aW9uIEJTKHQsZSxuKXt2YXIgaT10LmdldFZpc3VhbCgidmlzdWFsTWV0YSIpO2lmKGkmJmkubGVuZ3RoJiZ0LmNvdW50KCkmJiJjYXJ0ZXNpYW4yZCI9PT1lLnR5cGUpe2Zvcih2YXIgcixvLGE9aS5sZW5ndGgtMTthPj0wO2EtLSl7dmFyIHM9dC5nZXREaW1lbnNpb25JbmZvKGlbYV0uZGltZW5zaW9uKTtpZigieCI9PT0ocj1zJiZzLmNvb3JkRGltKXx8InkiPT09cil7bz1pW2FdO2JyZWFrfX1pZihvKXt2YXIgbD1lLmdldEF4aXMociksdT16KG8uc3RvcHMsKGZ1bmN0aW9uKHQpe3JldHVybntjb29yZDpsLnRvR2xvYmFsQ29vcmQobC5kYXRhVG9Db29yZCh0LnZhbHVlKSksY29sb3I6dC5jb2xvcn19KSksaD11Lmxlbmd0aCxjPW8ub3V0ZXJDb2xvcnMuc2xpY2UoKTtoJiZ1WzBdLmNvb3JkPnVbaC0xXS5jb29yZCYmKHUucmV2ZXJzZSgpLGMucmV2ZXJzZSgpKTt2YXIgcD1mdW5jdGlvbih0LGUpe3ZhciBuLGkscj1bXSxvPXQubGVuZ3RoO2Z1bmN0aW9uIGEodCxlLG4pe3ZhciBpPXQuY29vcmQ7cmV0dXJue2Nvb3JkOm4sY29sb3I6dGkoKG4taSkvKGUuY29vcmQtaSksW3QuY29sb3IsZS5jb2xvcl0pfX1mb3IodmFyIHM9MDtzPG87cysrKXt2YXIgbD10W3NdLHU9bC5jb29yZDtpZih1PDApbj1sO2Vsc2V7aWYodT5lKXtpP3IucHVzaChhKGksbCxlKSk6biYmci5wdXNoKGEobixsLDApLGEobixsLGUpKTticmVha31uJiYoci5wdXNoKGEobixsLDApKSxuPW51bGwpLHIucHVzaChsKSxpPWx9fXJldHVybiByfSh1LCJ4Ij09PXI/bi5nZXRXaWR0aCgpOm4uZ2V0SGVpZ2h0KCkpLGQ9cC5sZW5ndGg7aWYoIWQmJmgpcmV0dXJuIHVbMF0uY29vcmQ8MD9jWzFdP2NbMV06dVtoLTFdLmNvbG9yOmNbMF0/Y1swXTp1WzBdLmNvbG9yO3ZhciBmPXBbMF0uY29vcmQtMTAsZz1wW2QtMV0uY29vcmQrMTAseT1nLWY7aWYoeTwuMDAxKXJldHVybiJ0cmFuc3BhcmVudCI7RShwLChmdW5jdGlvbih0KXt0Lm9mZnNldD0odC5jb29yZC1mKS95fSkpLHAucHVzaCh7b2Zmc2V0OmQ/cFtkLTFdLm9mZnNldDouNSxjb2xvcjpjWzFdfHwidHJhbnNwYXJlbnQifSkscC51bnNoaWZ0KHtvZmZzZXQ6ZD9wWzBdLm9mZnNldDouNSxjb2xvcjpjWzBdfHwidHJhbnNwYXJlbnQifSk7dmFyIHY9bmV3IG9oKDAsMCwwLDAscCwhMCk7cmV0dXJuIHZbcl09Zix2W3IrIjIiXT1nLHZ9fX1mdW5jdGlvbiBGUyh0LGUsbil7dmFyIGk9dC5nZXQoInNob3dBbGxTeW1ib2wiKSxyPSJhdXRvIj09PWk7aWYoIWl8fHIpe3ZhciBvPW4uZ2V0QXhlc0J5U2NhbGUoIm9yZGluYWwiKVswXTtpZihvJiYoIXJ8fCFmdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0RXh0ZW50KCksaT1NYXRoLmFicyhuWzFdLW5bMF0pL3Quc2NhbGUuY291bnQoKTtpc05hTihpKSYmKGk9MCk7Zm9yKHZhciByPWUuY291bnQoKSxvPU1hdGgubWF4KDEsTWF0aC5yb3VuZChyLzUpKSxhPTA7YTxyO2ErPW8paWYoMS41KmZTLmdldFN5bWJvbFNpemUoZSxhKVt0LmlzSG9yaXpvbnRhbCgpPzE6MF0+aSlyZXR1cm4hMTtyZXR1cm4hMH0obyxlKSkpe3ZhciBhPWUubWFwRGltZW5zaW9uKG8uZGltKSxzPXt9O3JldHVybiBFKG8uZ2V0Vmlld0xhYmVscygpLChmdW5jdGlvbih0KXt2YXIgZT1vLnNjYWxlLmdldFJhd09yZGluYWxOdW1iZXIodC50aWNrVmFsdWUpO3NbZV09MX0pKSxmdW5jdGlvbih0KXtyZXR1cm4hcy5oYXNPd25Qcm9wZXJ0eShlLmdldChhLHQpKX19fX1mdW5jdGlvbiBHUyh0LGUpe3JldHVyblt0WzIqZV0sdFsyKmUrMV1dfWZ1bmN0aW9uIFdTKHQpe2lmKHQuZ2V0KFsiZW5kTGFiZWwiLCJzaG93Il0pKXJldHVybiEwO2Zvcih2YXIgZT0wO2U8aGwubGVuZ3RoO2UrKylpZih0LmdldChbaGxbZV0sImVuZExhYmVsIiwic2hvdyJdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBIUyh0LGUsbixpKXtpZihPUyhlLCJjYXJ0ZXNpYW4yZCIpKXt2YXIgcj1pLmdldE1vZGVsKCJlbmRMYWJlbCIpLG89ci5nZXQoInZhbHVlQW5pbWF0aW9uIiksYT1pLmdldERhdGEoKSxzPXtsYXN0RnJhbWVJbmRleDowfSxsPVdTKGkpP2Z1bmN0aW9uKG4saSl7dC5fZW5kTGFiZWxPbkR1cmluZyhuLGksYSxzLG8scixlKX06bnVsbCx1PWUuZ2V0QmFzZUF4aXMoKS5pc0hvcml6b250YWwoKSxoPWtTKGUsbixpLChmdW5jdGlvbigpe3ZhciBlPXQuX2VuZExhYmVsO2UmJm4mJm51bGwhPXMub3JpZ2luYWxYJiZlLmF0dHIoe3g6cy5vcmlnaW5hbFgseTpzLm9yaWdpbmFsWX0pfSksbCk7aWYoIWkuZ2V0KCJjbGlwIiwhMCkpe3ZhciBjPWguc2hhcGUscD1NYXRoLm1heChjLndpZHRoLGMuaGVpZ2h0KTt1PyhjLnktPXAsYy5oZWlnaHQrPTIqcCk6KGMueC09cCxjLndpZHRoKz0yKnApfXJldHVybiBsJiZsKDEsaCksaH1yZXR1cm4gTFMoZSxuLGkpfXZhciBZUz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQnIsZT1uZXcgeFM7dGhpcy5ncm91cC5hZGQoZS5ncm91cCksdGhpcy5fc3ltYm9sRHJhdz1lLHRoaXMuX2xpbmVHcm91cD10fSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMscj10LmNvb3JkaW5hdGVTeXN0ZW0sbz10aGlzLmdyb3VwLGE9dC5nZXREYXRhKCkscz10LmdldE1vZGVsKCJsaW5lU3R5bGUiKSxsPXQuZ2V0TW9kZWwoImFyZWFTdHlsZSIpLHU9YS5nZXRMYXlvdXQoInBvaW50cyIpfHxbXSxoPSJwb2xhciI9PT1yLnR5cGUsYz10aGlzLl9jb29yZFN5cyxwPXRoaXMuX3N5bWJvbERyYXcsZD10aGlzLl9wb2x5bGluZSxmPXRoaXMuX3BvbHlnb24sZz10aGlzLl9saW5lR3JvdXAseT0hZS5zc3ImJnQuZ2V0KCJhbmltYXRpb24iKSx2PSFsLmlzRW1wdHkoKSxtPWwuZ2V0KCJvcmlnaW4iKSx4PV9TKHIsYSxtKSxfPXYmJmZ1bmN0aW9uKHQsZSxuKXtpZighbi52YWx1ZURpbSlyZXR1cm5bXTtmb3IodmFyIGk9ZS5jb3VudCgpLHI9QngoMippKSxvPTA7bzxpO28rKyl7dmFyIGE9YlMobix0LGUsbyk7clsyKm9dPWFbMF0sclsyKm8rMV09YVsxXX1yZXR1cm4gcn0ocixhLHgpLGI9dC5nZXQoInNob3dTeW1ib2wiKSx3PXQuZ2V0KCJjb25uZWN0TnVsbHMiKSxTPWImJiFoJiZGUyh0LGEsciksTT10aGlzLl9kYXRhO00mJk0uZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKHQsZSl7dC5fX3RlbXAmJihvLnJlbW92ZSh0KSxNLnNldEl0ZW1HcmFwaGljRWwoZSxudWxsKSl9KSksYnx8cC5yZW1vdmUoKSxvLmFkZChnKTt2YXIgSSxUPSFoJiZ0LmdldCgic3RlcCIpO3ImJnIuZ2V0QXJlYSYmdC5nZXQoImNsaXAiLCEwKSYmKG51bGwhPShJPXIuZ2V0QXJlYSgpKS53aWR0aD8oSS54LT0uMSxJLnktPS4xLEkud2lkdGgrPS4yLEkuaGVpZ2h0Kz0uMik6SS5yMCYmKEkucjAtPS41LEkucis9LjUpKSx0aGlzLl9jbGlwU2hhcGVGb3JTeW1ib2w9STt2YXIgQz1CUyhhLHIsbil8fGEuZ2V0VmlzdWFsKCJzdHlsZSIpW2EuZ2V0VmlzdWFsKCJkcmF3VHlwZSIpXTtpZihkJiZjLnR5cGU9PT1yLnR5cGUmJlQ9PT10aGlzLl9zdGVwKXt2JiYhZj9mPXRoaXMuX25ld1BvbHlnb24odSxfKTpmJiYhdiYmKGcucmVtb3ZlKGYpLGY9dGhpcy5fcG9seWdvbj1udWxsKSxofHx0aGlzLl9pbml0T3JVcGRhdGVFbmRMYWJlbCh0LHIsU3AoQykpO3ZhciBEPWcuZ2V0Q2xpcFBhdGgoKTtpZihEKW1oKEQse3NoYXBlOkhTKHRoaXMsciwhMSx0KS5zaGFwZX0sdCk7ZWxzZSBnLnNldENsaXBQYXRoKEhTKHRoaXMsciwhMCx0KSk7YiYmcC51cGRhdGVEYXRhKGEse2lzSWdub3JlOlMsY2xpcFNoYXBlOkksZGlzYWJsZUFuaW1hdGlvbjohMCxnZXRTeW1ib2xQb2ludDpmdW5jdGlvbih0KXtyZXR1cm5bdVsyKnRdLHVbMip0KzFdXX19KSxSUyh0aGlzLl9zdGFja2VkT25Qb2ludHMsXykmJlJTKHRoaXMuX3BvaW50cyx1KXx8KHk/dGhpcy5fZG9VcGRhdGVBbmltYXRpb24oYSxfLHIsbixULG0sdyk6KFQmJih1PVZTKHUscixULHcpLF8mJihfPVZTKF8scixULHcpKSksZC5zZXRTaGFwZSh7cG9pbnRzOnV9KSxmJiZmLnNldFNoYXBlKHtwb2ludHM6dSxzdGFja2VkT25Qb2ludHM6X30pKSl9ZWxzZSBiJiZwLnVwZGF0ZURhdGEoYSx7aXNJZ25vcmU6UyxjbGlwU2hhcGU6SSxkaXNhYmxlQW5pbWF0aW9uOiEwLGdldFN5bWJvbFBvaW50OmZ1bmN0aW9uKHQpe3JldHVyblt1WzIqdF0sdVsyKnQrMV1dfX0pLHkmJnRoaXMuX2luaXRTeW1ib2xMYWJlbEFuaW1hdGlvbihhLHIsSSksVCYmKHU9VlModSxyLFQsdyksXyYmKF89VlMoXyxyLFQsdykpKSxkPXRoaXMuX25ld1BvbHlsaW5lKHUpLHY/Zj10aGlzLl9uZXdQb2x5Z29uKHUsXyk6ZiYmKGcucmVtb3ZlKGYpLGY9dGhpcy5fcG9seWdvbj1udWxsKSxofHx0aGlzLl9pbml0T3JVcGRhdGVFbmRMYWJlbCh0LHIsU3AoQykpLGcuc2V0Q2xpcFBhdGgoSFModGhpcyxyLCEwLHQpKTt2YXIgQT10LmdldE1vZGVsKCJlbXBoYXNpcyIpLEw9QS5nZXQoImZvY3VzIiksUD1BLmdldCgiYmx1clNjb3BlIiksTz1BLmdldCgiZGlzYWJsZWQiKTsoZC51c2VTdHlsZShrKHMuZ2V0TGluZVN0eWxlKCkse2ZpbGw6Im5vbmUiLHN0cm9rZTpDLGxpbmVKb2luOiJiZXZlbCJ9KSksJGwoZCx0LCJsaW5lU3R5bGUiKSxkLnN0eWxlLmxpbmVXaWR0aD4wJiYiYm9sZGVyIj09PXQuZ2V0KFsiZW1waGFzaXMiLCJsaW5lU3R5bGUiLCJ3aWR0aCJdKSkmJihkLmdldFN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlLmxpbmVXaWR0aD0rZC5zdHlsZS5saW5lV2lkdGgrMSk7cmwoZCkuc2VyaWVzSW5kZXg9dC5zZXJpZXNJbmRleCxabChkLEwsUCxPKTt2YXIgUj16Uyh0LmdldCgic21vb3RoIikpLE49dC5nZXQoInNtb290aE1vbm90b25lIik7aWYoZC5zZXRTaGFwZSh7c21vb3RoOlIsc21vb3RoTW9ub3RvbmU6Tixjb25uZWN0TnVsbHM6d30pLGYpe3ZhciBFPWEuZ2V0Q2FsY3VsYXRpb25JbmZvKCJzdGFja2VkT25TZXJpZXMiKSx6PTA7Zi51c2VTdHlsZShrKGwuZ2V0QXJlYVN0eWxlKCkse2ZpbGw6QyxvcGFjaXR5Oi43LGxpbmVKb2luOiJiZXZlbCIsZGVjYWw6YS5nZXRWaXN1YWwoInN0eWxlIikuZGVjYWx9KSksRSYmKHo9elMoRS5nZXQoInNtb290aCIpKSksZi5zZXRTaGFwZSh7c21vb3RoOlIsc3RhY2tlZE9uU21vb3RoOnosc21vb3RoTW9ub3RvbmU6Tixjb25uZWN0TnVsbHM6d30pLCRsKGYsdCwiYXJlYVN0eWxlIikscmwoZikuc2VyaWVzSW5kZXg9dC5zZXJpZXNJbmRleCxabChmLEwsUCxPKX12YXIgVj1mdW5jdGlvbih0KXtpLl9jaGFuZ2VQb2x5U3RhdGUodCl9O2EuZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKHQpe3QmJih0Lm9uSG92ZXJTdGF0ZUNoYW5nZT1WKX0pKSx0aGlzLl9wb2x5bGluZS5vbkhvdmVyU3RhdGVDaGFuZ2U9Vix0aGlzLl9kYXRhPWEsdGhpcy5fY29vcmRTeXM9cix0aGlzLl9zdGFja2VkT25Qb2ludHM9Xyx0aGlzLl9wb2ludHM9dSx0aGlzLl9zdGVwPVQsdGhpcy5fdmFsdWVPcmlnaW49bSx0LmdldCgidHJpZ2dlckxpbmVFdmVudCIpJiYodGhpcy5wYWNrRXZlbnREYXRhKHQsZCksZiYmdGhpcy5wYWNrRXZlbnREYXRhKHQsZikpfSxlLnByb3RvdHlwZS5wYWNrRXZlbnREYXRhPWZ1bmN0aW9uKHQsZSl7cmwoZSkuZXZlbnREYXRhPXtjb21wb25lbnRUeXBlOiJzZXJpZXMiLGNvbXBvbmVudFN1YlR5cGU6ImxpbmUiLGNvbXBvbmVudEluZGV4OnQuY29tcG9uZW50SW5kZXgsc2VyaWVzSW5kZXg6dC5zZXJpZXNJbmRleCxzZXJpZXNOYW1lOnQubmFtZSxzZXJpZXNUeXBlOiJsaW5lIn19LGUucHJvdG90eXBlLmhpZ2hsaWdodD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LmdldERhdGEoKSxvPXpvKHIsaSk7aWYodGhpcy5fY2hhbmdlUG9seVN0YXRlKCJlbXBoYXNpcyIpLCEobyBpbnN0YW5jZW9mIEFycmF5KSYmbnVsbCE9byYmbz49MCl7dmFyIGE9ci5nZXRMYXlvdXQoInBvaW50cyIpLHM9ci5nZXRJdGVtR3JhcGhpY0VsKG8pO2lmKCFzKXt2YXIgbD1hWzIqb10sdT1hWzIqbysxXTtpZihpc05hTihsKXx8aXNOYU4odSkpcmV0dXJuO2lmKHRoaXMuX2NsaXBTaGFwZUZvclN5bWJvbCYmIXRoaXMuX2NsaXBTaGFwZUZvclN5bWJvbC5jb250YWluKGwsdSkpcmV0dXJuO3ZhciBoPXQuZ2V0KCJ6bGV2ZWwiKXx8MCxjPXQuZ2V0KCJ6Iil8fDA7KHM9bmV3IGZTKHIsbykpLng9bCxzLnk9dSxzLnNldFooaCxjKTt2YXIgcD1zLmdldFN5bWJvbFBhdGgoKS5nZXRUZXh0Q29udGVudCgpO3AmJihwLnpsZXZlbD1oLHAuej1jLHAuejI9dGhpcy5fcG9seWxpbmUuejIrMSkscy5fX3RlbXA9ITAsci5zZXRJdGVtR3JhcGhpY0VsKG8scykscy5zdG9wU3ltYm9sQW5pbWF0aW9uKCEwKSx0aGlzLmdyb3VwLmFkZChzKX1zLmhpZ2hsaWdodCgpfWVsc2UgT2cucHJvdG90eXBlLmhpZ2hsaWdodC5jYWxsKHRoaXMsdCxlLG4saSl9LGUucHJvdG90eXBlLmRvd25wbGF5PWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuZ2V0RGF0YSgpLG89em8ocixpKTtpZih0aGlzLl9jaGFuZ2VQb2x5U3RhdGUoIm5vcm1hbCIpLG51bGwhPW8mJm8+PTApe3ZhciBhPXIuZ2V0SXRlbUdyYXBoaWNFbChvKTthJiYoYS5fX3RlbXA/KHIuc2V0SXRlbUdyYXBoaWNFbChvLG51bGwpLHRoaXMuZ3JvdXAucmVtb3ZlKGEpKTphLmRvd25wbGF5KCkpfWVsc2UgT2cucHJvdG90eXBlLmRvd25wbGF5LmNhbGwodGhpcyx0LGUsbixpKX0sZS5wcm90b3R5cGUuX2NoYW5nZVBvbHlTdGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9wb2x5Z29uO0RsKHRoaXMuX3BvbHlsaW5lLHQpLGUmJkRsKGUsdCl9LGUucHJvdG90eXBlLl9uZXdQb2x5bGluZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9wb2x5bGluZTtyZXR1cm4gZSYmdGhpcy5fbGluZUdyb3VwLnJlbW92ZShlKSxlPW5ldyBDUyh7c2hhcGU6e3BvaW50czp0fSxzZWdtZW50SWdub3JlVGhyZXNob2xkOjIsejI6MTB9KSx0aGlzLl9saW5lR3JvdXAuYWRkKGUpLHRoaXMuX3BvbHlsaW5lPWUsZX0sZS5wcm90b3R5cGUuX25ld1BvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wb2x5Z29uO3JldHVybiBuJiZ0aGlzLl9saW5lR3JvdXAucmVtb3ZlKG4pLG49bmV3IEFTKHtzaGFwZTp7cG9pbnRzOnQsc3RhY2tlZE9uUG9pbnRzOmV9LHNlZ21lbnRJZ25vcmVUaHJlc2hvbGQ6Mn0pLHRoaXMuX2xpbmVHcm91cC5hZGQobiksdGhpcy5fcG9seWdvbj1uLG59LGUucHJvdG90eXBlLl9pbml0U3ltYm9sTGFiZWxBbmltYXRpb249ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbz1lLmdldEJhc2VBeGlzKCksYT1vLmludmVyc2U7ImNhcnRlc2lhbjJkIj09PWUudHlwZT8oaT1vLmlzSG9yaXpvbnRhbCgpLHI9ITEpOiJwb2xhciI9PT1lLnR5cGUmJihpPSJhbmdsZSI9PT1vLmRpbSxyPSEwKTt2YXIgcz10Lmhvc3RNb2RlbCxsPXMuZ2V0KCJhbmltYXRpb25EdXJhdGlvbiIpO1gobCkmJihsPWwobnVsbCkpO3ZhciB1PXMuZ2V0KCJhbmltYXRpb25EZWxheSIpfHwwLGg9WCh1KT91KG51bGwpOnU7dC5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCxvKXt2YXIgcz10O2lmKHMpe3ZhciBjPVt0LngsdC55XSxwPXZvaWQgMCxkPXZvaWQgMCxmPXZvaWQgMDtpZihuKWlmKHIpe3ZhciBnPW4seT1lLnBvaW50VG9Db29yZChjKTtpPyhwPWcuc3RhcnRBbmdsZSxkPWcuZW5kQW5nbGUsZj0teVsxXS8xODAqTWF0aC5QSSk6KHA9Zy5yMCxkPWcucixmPXlbMF0pfWVsc2V7dmFyIHY9bjtpPyhwPXYueCxkPXYueCt2LndpZHRoLGY9dC54KToocD12Lnkrdi5oZWlnaHQsZD12LnksZj10LnkpfXZhciBtPWQ9PT1wPzA6KGYtcCkvKGQtcCk7YSYmKG09MS1tKTt2YXIgeD1YKHUpP3Uobyk6bCptK2gsXz1zLmdldFN5bWJvbFBhdGgoKSxiPV8uZ2V0VGV4dENvbnRlbnQoKTtzLmF0dHIoe3NjYWxlWDowLHNjYWxlWTowfSkscy5hbmltYXRlVG8oe3NjYWxlWDoxLHNjYWxlWToxfSx7ZHVyYXRpb246MjAwLHNldFRvRmluYWw6ITAsZGVsYXk6eH0pLGImJmIuYW5pbWF0ZUZyb20oe3N0eWxlOntvcGFjaXR5OjB9fSx7ZHVyYXRpb246MzAwLGRlbGF5Onh9KSxfLmRpc2FibGVMYWJlbEFuaW1hdGlvbj0hMH19KSl9LGUucHJvdG90eXBlLl9pbml0T3JVcGRhdGVFbmRMYWJlbD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXRNb2RlbCgiZW5kTGFiZWwiKTtpZihXUyh0KSl7dmFyIHI9dC5nZXREYXRhKCksbz10aGlzLl9wb2x5bGluZSxhPXIuZ2V0TGF5b3V0KCJwb2ludHMiKTtpZighYSlyZXR1cm4gby5yZW1vdmVUZXh0Q29udGVudCgpLHZvaWQodGhpcy5fZW5kTGFiZWw9bnVsbCk7dmFyIHM9dGhpcy5fZW5kTGFiZWw7c3x8KChzPXRoaXMuX2VuZExhYmVsPW5ldyBYcyh7ejI6MjAwfSkpLmlnbm9yZUNsaXA9ITAsby5zZXRUZXh0Q29udGVudCh0aGlzLl9lbmRMYWJlbCksby5kaXNhYmxlTGFiZWxBbmltYXRpb249ITApO3ZhciBsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLGk9dC5sZW5ndGgvMjtpPjAmJihlPXRbMippLTJdLG49dFsyKmktMV0saXNOYU4oZSl8fGlzTmFOKG4pKTtpLS0pO3JldHVybiBpLTF9KGEpO2w+PTAmJihpYyhvLHJjKHQsImVuZExhYmVsIikse2luaGVyaXRDb2xvcjpuLGxhYmVsRmV0Y2hlcjp0LGxhYmVsRGF0YUluZGV4OmwsZGVmYXVsdFRleHQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsIT1uP2RTKHIsbik6cFMocix0KX0sZW5hYmxlVGV4dFNldHRlcjohMH0sZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldEJhc2VBeGlzKCksaT1uLmlzSG9yaXpvbnRhbCgpLHI9bi5pbnZlcnNlLG89aT9yPyJyaWdodCI6ImxlZnQiOiJjZW50ZXIiLGE9aT8ibWlkZGxlIjpyPyJ0b3AiOiJib3R0b20iO3JldHVybntub3JtYWw6e2FsaWduOnQuZ2V0KCJhbGlnbiIpfHxvLHZlcnRpY2FsQWxpZ246dC5nZXQoInZlcnRpY2FsQWxpZ24iKXx8YX19fShpLGUpKSxvLnRleHRDb25maWcucG9zaXRpb249bnVsbCl9ZWxzZSB0aGlzLl9lbmRMYWJlbCYmKHRoaXMuX3BvbHlsaW5lLnJlbW92ZVRleHRDb250ZW50KCksdGhpcy5fZW5kTGFiZWw9bnVsbCl9LGUucHJvdG90eXBlLl9lbmRMYWJlbE9uRHVyaW5nPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEpe3ZhciBzPXRoaXMuX2VuZExhYmVsLGw9dGhpcy5fcG9seWxpbmU7aWYocyl7dDwxJiZudWxsPT1pLm9yaWdpbmFsWCYmKGkub3JpZ2luYWxYPXMueCxpLm9yaWdpbmFsWT1zLnkpO3ZhciB1PW4uZ2V0TGF5b3V0KCJwb2ludHMiKSxoPW4uaG9zdE1vZGVsLGM9aC5nZXQoImNvbm5lY3ROdWxscyIpLHA9by5nZXQoInByZWNpc2lvbiIpLGQ9by5nZXQoImRpc3RhbmNlIil8fDAsZj1hLmdldEJhc2VBeGlzKCksZz1mLmlzSG9yaXpvbnRhbCgpLHk9Zi5pbnZlcnNlLHY9ZS5zaGFwZSxtPXk/Zz92Lng6di55K3YuaGVpZ2h0Omc/di54K3Yud2lkdGg6di55LHg9KGc/ZDowKSooeT8tMToxKSxfPShnPzA6LWQpKih5Py0xOjEpLGI9Zz8ieCI6InkiLHc9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyLG89dC5sZW5ndGgvMixhPSJ4Ij09PW4/MDoxLHM9MCxsPS0xLHU9MDt1PG87dSsrKWlmKHI9dFsyKnUrYV0sIWlzTmFOKHIpJiYhaXNOYU4odFsyKnUrMS1hXSkpaWYoMCE9PXUpe2lmKGk8PWUmJnI+PWV8fGk+PWUmJnI8PWUpe2w9dTticmVha31zPXUsaT1yfWVsc2UgaT1yO3JldHVybntyYW5nZTpbcyxsXSx0OihlLWkpLyhyLWkpfX0odSxtLGIpLFM9dy5yYW5nZSxNPVNbMV0tU1swXSxJPXZvaWQgMDtpZihNPj0xKXtpZihNPjEmJiFjKXt2YXIgVD1HUyh1LFNbMF0pO3MuYXR0cih7eDpUWzBdK3gseTpUWzFdK199KSxyJiYoST1oLmdldFJhd1ZhbHVlKFNbMF0pKX1lbHNleyhUPWwuZ2V0UG9pbnRPbihtLGIpKSYmcy5hdHRyKHt4OlRbMF0reCx5OlRbMV0rX30pO3ZhciBDPWguZ2V0UmF3VmFsdWUoU1swXSksRD1oLmdldFJhd1ZhbHVlKFNbMV0pO3ImJihJPVpvKG4scCxDLEQsdy50KSl9aS5sYXN0RnJhbWVJbmRleD1TWzBdfWVsc2V7dmFyIEE9MT09PXR8fGkubGFzdEZyYW1lSW5kZXg+MD9TWzBdOjA7VD1HUyh1LEEpO3ImJihJPWguZ2V0UmF3VmFsdWUoQSkpLHMuYXR0cih7eDpUWzBdK3gseTpUWzFdK199KX1pZihyKXt2YXIgaz1wYyhzKTsiZnVuY3Rpb24iPT10eXBlb2Ygay5zZXRMYWJlbFRleHQmJmsuc2V0TGFiZWxUZXh0KEkpfX19LGUucHJvdG90eXBlLl9kb1VwZGF0ZUFuaW1hdGlvbj1mdW5jdGlvbih0LGUsbixpLHIsbyxhKXt2YXIgcz10aGlzLl9wb2x5bGluZSxsPXRoaXMuX3BvbHlnb24sdT10Lmhvc3RNb2RlbCxoPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyl7Zm9yKHZhciBsPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIGUuZGlmZih0KS5hZGQoKGZ1bmN0aW9uKHQpe24ucHVzaCh7Y21kOiIrIixpZHg6dH0pfSkpLnVwZGF0ZSgoZnVuY3Rpb24odCxlKXtuLnB1c2goe2NtZDoiPSIsaWR4OmUsaWR4MTp0fSl9KSkucmVtb3ZlKChmdW5jdGlvbih0KXtuLnB1c2goe2NtZDoiLSIsaWR4OnR9KX0pKS5leGVjdXRlKCksbn0odCxlKSx1PVtdLGg9W10sYz1bXSxwPVtdLGQ9W10sZj1bXSxnPVtdLHk9X1MocixlLGEpLHY9dC5nZXRMYXlvdXQoInBvaW50cyIpfHxbXSxtPWUuZ2V0TGF5b3V0KCJwb2ludHMiKXx8W10seD0wO3g8bC5sZW5ndGg7eCsrKXt2YXIgXz1sW3hdLGI9ITAsdz12b2lkIDAsUz12b2lkIDA7c3dpdGNoKF8uY21kKXtjYXNlIj0iOnc9MipfLmlkeCxTPTIqXy5pZHgxO3ZhciBNPXZbd10sST12W3crMV0sVD1tW1NdLEM9bVtTKzFdOyhpc05hTihNKXx8aXNOYU4oSSkpJiYoTT1ULEk9QyksdS5wdXNoKE0sSSksaC5wdXNoKFQsQyksYy5wdXNoKG5bd10sblt3KzFdKSxwLnB1c2goaVtTXSxpW1MrMV0pLGcucHVzaChlLmdldFJhd0luZGV4KF8uaWR4MSkpO2JyZWFrO2Nhc2UiKyI6dmFyIEQ9Xy5pZHgsQT15LmRhdGFEaW1zRm9yUG9pbnQsaz1yLmRhdGFUb1BvaW50KFtlLmdldChBWzBdLEQpLGUuZ2V0KEFbMV0sRCldKTtTPTIqRCx1LnB1c2goa1swXSxrWzFdKSxoLnB1c2gobVtTXSxtW1MrMV0pO3ZhciBMPWJTKHkscixlLEQpO2MucHVzaChMWzBdLExbMV0pLHAucHVzaChpW1NdLGlbUysxXSksZy5wdXNoKGUuZ2V0UmF3SW5kZXgoRCkpO2JyZWFrO2Nhc2UiLSI6Yj0hMX1iJiYoZC5wdXNoKF8pLGYucHVzaChmLmxlbmd0aCkpfWYuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ1t0XS1nW2VdfSkpO3ZhciBQPXUubGVuZ3RoLE89QngoUCksUj1CeChQKSxOPUJ4KFApLEU9QngoUCksej1bXTtmb3IoeD0wO3g8Zi5sZW5ndGg7eCsrKXt2YXIgVj1mW3hdLEI9Mip4LEY9MipWO09bQl09dVtGXSxPW0IrMV09dVtGKzFdLFJbQl09aFtGXSxSW0IrMV09aFtGKzFdLE5bQl09Y1tGXSxOW0IrMV09Y1tGKzFdLEVbQl09cFtGXSxFW0IrMV09cFtGKzFdLHpbeF09ZFtWXX1yZXR1cm57Y3VycmVudDpPLG5leHQ6UixzdGFja2VkT25DdXJyZW50Ok4sc3RhY2tlZE9uTmV4dDpFLHN0YXR1czp6fX0odGhpcy5fZGF0YSx0LHRoaXMuX3N0YWNrZWRPblBvaW50cyxlLHRoaXMuX2Nvb3JkU3lzLDAsdGhpcy5fdmFsdWVPcmlnaW4pLGM9aC5jdXJyZW50LHA9aC5zdGFja2VkT25DdXJyZW50LGQ9aC5uZXh0LGY9aC5zdGFja2VkT25OZXh0O2lmKHImJihjPVZTKGguY3VycmVudCxuLHIsYSkscD1WUyhoLnN0YWNrZWRPbkN1cnJlbnQsbixyLGEpLGQ9VlMoaC5uZXh0LG4scixhKSxmPVZTKGguc3RhY2tlZE9uTmV4dCxuLHIsYSkpLEVTKGMsZCk+M2UzfHxsJiZFUyhwLGYpPjNlMylyZXR1cm4gcy5zdG9wQW5pbWF0aW9uKCkscy5zZXRTaGFwZSh7cG9pbnRzOmR9KSx2b2lkKGwmJihsLnN0b3BBbmltYXRpb24oKSxsLnNldFNoYXBlKHtwb2ludHM6ZCxzdGFja2VkT25Qb2ludHM6Zn0pKSk7cy5zaGFwZS5fX3BvaW50cz1oLmN1cnJlbnQscy5zaGFwZS5wb2ludHM9Yzt2YXIgZz17c2hhcGU6e3BvaW50czpkfX07aC5jdXJyZW50IT09YyYmKGcuc2hhcGUuX19wb2ludHM9aC5uZXh0KSxzLnN0b3BBbmltYXRpb24oKSx2aChzLGcsdSksbCYmKGwuc2V0U2hhcGUoe3BvaW50czpjLHN0YWNrZWRPblBvaW50czpwfSksbC5zdG9wQW5pbWF0aW9uKCksdmgobCx7c2hhcGU6e3N0YWNrZWRPblBvaW50czpmfX0sdSkscy5zaGFwZS5wb2ludHMhPT1sLnNoYXBlLnBvaW50cyYmKGwuc2hhcGUucG9pbnRzPXMuc2hhcGUucG9pbnRzKSk7Zm9yKHZhciB5PVtdLHY9aC5zdGF0dXMsbT0wO208di5sZW5ndGg7bSsrKXtpZigiPSI9PT12W21dLmNtZCl7dmFyIHg9dC5nZXRJdGVtR3JhcGhpY0VsKHZbbV0uaWR4MSk7eCYmeS5wdXNoKHtlbDp4LHB0SWR4Om19KX19cy5hbmltYXRvcnMmJnMuYW5pbWF0b3JzLmxlbmd0aCYmcy5hbmltYXRvcnNbMF0uZHVyaW5nKChmdW5jdGlvbigpe2wmJmwuZGlydHlTaGFwZSgpO2Zvcih2YXIgdD1zLnNoYXBlLl9fcG9pbnRzLGU9MDtlPHkubGVuZ3RoO2UrKyl7dmFyIG49eVtlXS5lbCxpPTIqeVtlXS5wdElkeDtuLng9dFtpXSxuLnk9dFtpKzFdLG4ubWFya1JlZHJhdygpfX0pKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXAsbj10aGlzLl9kYXRhO3RoaXMuX2xpbmVHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9zeW1ib2xEcmF3LnJlbW92ZSghMCksbiYmbi5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCxpKXt0Ll9fdGVtcCYmKGUucmVtb3ZlKHQpLG4uc2V0SXRlbUdyYXBoaWNFbChpLG51bGwpKX0pKSx0aGlzLl9wb2x5bGluZT10aGlzLl9wb2x5Z29uPXRoaXMuX2Nvb3JkU3lzPXRoaXMuX3BvaW50cz10aGlzLl9zdGFja2VkT25Qb2ludHM9dGhpcy5fZW5kTGFiZWw9dGhpcy5fZGF0YT1udWxsfSxlLnR5cGU9ImxpbmUiLGV9KE9nKTtmdW5jdGlvbiBYUyh0LGUpe3JldHVybntzZXJpZXNUeXBlOnQscGxhbjprZygpLHJlc2V0OmZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0RGF0YSgpLGk9dC5jb29yZGluYXRlU3lzdGVtLHI9dC5waXBlbGluZUNvbnRleHQsbz1lfHxyLmxhcmdlO2lmKGkpe3ZhciBhPXooaS5kaW1lbnNpb25zLChmdW5jdGlvbih0KXtyZXR1cm4gbi5tYXBEaW1lbnNpb24odCl9KSkuc2xpY2UoMCwyKSxzPWEubGVuZ3RoLGw9bi5nZXRDYWxjdWxhdGlvbkluZm8oInN0YWNrUmVzdWx0RGltZW5zaW9uIik7bXgobixhWzBdKSYmKGFbMF09bCksbXgobixhWzFdKSYmKGFbMV09bCk7dmFyIHU9bi5nZXRTdG9yZSgpLGg9bi5nZXREaW1lbnNpb25JbmRleChhWzBdKSxjPW4uZ2V0RGltZW5zaW9uSW5kZXgoYVsxXSk7cmV0dXJuIHMmJntwcm9ncmVzczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmVuZC10LnN0YXJ0LHI9byYmQngobipzKSxhPVtdLGw9W10scD10LnN0YXJ0LGQ9MDtwPHQuZW5kO3ArKyl7dmFyIGY9dm9pZCAwO2lmKDE9PT1zKXt2YXIgZz11LmdldChoLHApO2Y9aS5kYXRhVG9Qb2ludChnLG51bGwsbCl9ZWxzZSBhWzBdPXUuZ2V0KGgscCksYVsxXT11LmdldChjLHApLGY9aS5kYXRhVG9Qb2ludChhLG51bGwsbCk7bz8ocltkKytdPWZbMF0scltkKytdPWZbMV0pOmUuc2V0SXRlbUxheW91dChwLGYuc2xpY2UoKSl9byYmZS5zZXRMYXlvdXQoInBvaW50cyIscil9fX19fX12YXIgVVM9e2F2ZXJhZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj0wLGk9MDtpPHQubGVuZ3RoO2krKylpc05hTih0W2ldKXx8KGUrPXRbaV0sbisrKTtyZXR1cm4gMD09PW4/TmFOOmUvbn0sc3VtOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoO24rKyllKz10W25dfHwwO3JldHVybiBlfSxtYXg6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLzAsbj0wO248dC5sZW5ndGg7bisrKXRbbl0+ZSYmKGU9dFtuXSk7cmV0dXJuIGlzRmluaXRlKGUpP2U6TmFOfSxtaW46ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTEvMCxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXTxlJiYoZT10W25dKTtyZXR1cm4gaXNGaW5pdGUoZSk/ZTpOYU59LG1pbm1heDpmdW5jdGlvbih0KXtmb3IodmFyIGU9LTEvMCxuPS0xLzAsaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgcj10W2ldLG89TWF0aC5hYnMocik7bz5lJiYoZT1vLG49cil9cmV0dXJuIGlzRmluaXRlKG4pP246TmFOfSxuZWFyZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfX0sWlM9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodC5sZW5ndGgvMil9O2Z1bmN0aW9uIGpTKHQpe3JldHVybntzZXJpZXNUeXBlOnQscmVzZXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuZ2V0RGF0YSgpLHI9dC5nZXQoInNhbXBsaW5nIiksbz10LmNvb3JkaW5hdGVTeXN0ZW0sYT1pLmNvdW50KCk7aWYoYT4xMCYmImNhcnRlc2lhbjJkIj09PW8udHlwZSYmcil7dmFyIHM9by5nZXRCYXNlQXhpcygpLGw9by5nZXRPdGhlckF4aXMocyksdT1zLmdldEV4dGVudCgpLGg9bi5nZXREZXZpY2VQaXhlbFJhdGlvKCksYz1NYXRoLmFicyh1WzFdLXVbMF0pKihofHwxKSxwPU1hdGgucm91bmQoYS9jKTtpZihpc0Zpbml0ZShwKSYmcD4xKXsibHR0YiI9PT1yJiZ0LnNldERhdGEoaS5sdHRiRG93blNhbXBsZShpLm1hcERpbWVuc2lvbihsLmRpbSksMS9wKSk7dmFyIGQ9dm9pZCAwO1Uocik/ZD1VU1tyXTpYKHIpJiYoZD1yKSxkJiZ0LnNldERhdGEoaS5kb3duU2FtcGxlKGkubWFwRGltZW5zaW9uKGwuZGltKSwxL3AsZCxaUykpfX19fX12YXIgcVM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3gobnVsbCx0aGlzLHt1c2VFbmNvZGVEZWZhdWx0ZXI6ITB9KX0sZS5wcm90b3R5cGUuZ2V0TWFya2VyUG9zaXRpb249ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuY29vcmRpbmF0ZVN5c3RlbTtpZihpJiZpLmNsYW1wRGF0YSl7dmFyIHI9aS5jbGFtcERhdGEodCksbz1pLmRhdGFUb1BvaW50KHIpO2lmKG4pRShpLmdldEF4ZXMoKSwoZnVuY3Rpb24odCxuKXtpZigiY2F0ZWdvcnkiPT09dC50eXBlJiZudWxsIT1lKXt2YXIgaT10LmdldFRpY2tzQ29vcmRzKCksYT10LmdldFRpY2tNb2RlbCgpLmdldCgiYWxpZ25XaXRoTGFiZWwiKSxzPXJbbl0sbD0ieDEiPT09ZVtuXXx8InkxIj09PWVbbl07aWYobCYmIWEmJihzKz0xKSxpLmxlbmd0aDwyKXJldHVybjtpZigyPT09aS5sZW5ndGgpcmV0dXJuIHZvaWQob1tuXT10LnRvR2xvYmFsQ29vcmQodC5nZXRFeHRlbnQoKVtsPzE6MF0pKTtmb3IodmFyIHU9dm9pZCAwLGg9dm9pZCAwLGM9MSxwPTA7cDxpLmxlbmd0aDtwKyspe3ZhciBkPWlbcF0uY29vcmQsZj1wPT09aS5sZW5ndGgtMT9pW3AtMV0udGlja1ZhbHVlK2M6aVtwXS50aWNrVmFsdWU7aWYoZj09PXMpe2g9ZDticmVha31pZihmPHMpdT1kO2Vsc2UgaWYobnVsbCE9dSYmZj5zKXtoPShkK3UpLzI7YnJlYWt9MT09PXAmJihjPWYtaVswXS50aWNrVmFsdWUpfW51bGw9PWgmJih1P3UmJihoPWlbaS5sZW5ndGgtMV0uY29vcmQpOmg9aVswXS5jb29yZCksb1tuXT10LnRvR2xvYmFsQ29vcmQoaCl9fSkpO2Vsc2V7dmFyIGE9dGhpcy5nZXREYXRhKCkscz1hLmdldExheW91dCgib2Zmc2V0IiksbD1hLmdldExheW91dCgic2l6ZSIpLHU9aS5nZXRCYXNlQXhpcygpLmlzSG9yaXpvbnRhbCgpPzA6MTtvW3VdKz1zK2wvMn1yZXR1cm4gb31yZXR1cm5bTmFOLE5hTl19LGUudHlwZT0ic2VyaWVzLl9fYmFzZV9iYXJfXyIsZS5kZWZhdWx0T3B0aW9uPXt6OjIsY29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLGxlZ2VuZEhvdmVyTGluazohMCxiYXJNaW5IZWlnaHQ6MCxiYXJNaW5BbmdsZTowLGxhcmdlOiExLGxhcmdlVGhyZXNob2xkOjQwMCxwcm9ncmVzc2l2ZTozZTMscHJvZ3Jlc3NpdmVDaHVua01vZGU6Im1vZCJ9LGV9KGJnKTtiZy5yZWdpc3RlckNsYXNzKHFTKTt2YXIgS1M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gX3gobnVsbCx0aGlzLHt1c2VFbmNvZGVEZWZhdWx0ZXI6ITAsY3JlYXRlSW52ZXJ0ZWRJbmRpY2VzOiEhdGhpcy5nZXQoInJlYWx0aW1lU29ydCIsITApfHxudWxsfSl9LGUucHJvdG90eXBlLmdldFByb2dyZXNzaXZlPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmdldCgibGFyZ2UiKSYmdGhpcy5nZXQoInByb2dyZXNzaXZlIil9LGUucHJvdG90eXBlLmdldFByb2dyZXNzaXZlVGhyZXNob2xkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoInByb2dyZXNzaXZlVGhyZXNob2xkIiksZT10aGlzLmdldCgibGFyZ2VUaHJlc2hvbGQiKTtyZXR1cm4gZT50JiYodD1lKSx0fSxlLnByb3RvdHlwZS5icnVzaFNlbGVjdG9yPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbi5yZWN0KGUuZ2V0SXRlbUxheW91dCh0KSl9LGUudHlwZT0ic2VyaWVzLmJhciIsZS5kZXBlbmRlbmNpZXM9WyJncmlkIiwicG9sYXIiXSxlLmRlZmF1bHRPcHRpb249a2MocVMuZGVmYXVsdE9wdGlvbix7Y2xpcDohMCxyb3VuZENhcDohMSxzaG93QmFja2dyb3VuZDohMSxiYWNrZ3JvdW5kU3R5bGU6e2NvbG9yOiJyZ2JhKDE4MCwgMTgwLCAxODAsIDAuMikiLGJvcmRlckNvbG9yOm51bGwsYm9yZGVyV2lkdGg6MCxib3JkZXJUeXBlOiJzb2xpZCIsYm9yZGVyUmFkaXVzOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOm51bGwsc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxvcGFjaXR5OjF9LHNlbGVjdDp7aXRlbVN0eWxlOntib3JkZXJDb2xvcjoiIzIxMjEyMSJ9fSxyZWFsdGltZVNvcnQ6ITF9KSxlfShxUyksJFM9ZnVuY3Rpb24oKXt0aGlzLmN4PTAsdGhpcy5jeT0wLHRoaXMucjA9MCx0aGlzLnI9MCx0aGlzLnN0YXJ0QW5nbGU9MCx0aGlzLmVuZEFuZ2xlPTIqTWF0aC5QSSx0aGlzLmNsb2Nrd2lzZT0hMH0sSlM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi50eXBlPSJzYXVzYWdlIixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyAkU30sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jeCxpPWUuY3kscj1NYXRoLm1heChlLnIwfHwwLDApLG89TWF0aC5tYXgoZS5yLDApLGE9LjUqKG8tcikscz1yK2EsbD1lLnN0YXJ0QW5nbGUsdT1lLmVuZEFuZ2xlLGg9ZS5jbG9ja3dpc2UsYz0yKk1hdGguUEkscD1oP3UtbDxjOmwtdTxjO3B8fChsPXUtKGg/YzotYykpO3ZhciBkPU1hdGguY29zKGwpLGY9TWF0aC5zaW4obCksZz1NYXRoLmNvcyh1KSx5PU1hdGguc2luKHUpO3A/KHQubW92ZVRvKGQqcituLGYqcitpKSx0LmFyYyhkKnMrbixmKnMraSxhLC1NYXRoLlBJK2wsbCwhaCkpOnQubW92ZVRvKGQqbytuLGYqbytpKSx0LmFyYyhuLGksbyxsLHUsIWgpLHQuYXJjKGcqcytuLHkqcytpLGEsdS0yKk1hdGguUEksdS1NYXRoLlBJLCFoKSwwIT09ciYmdC5hcmMobixpLHIsdSxsLGgpfSxlfShrcyk7ZnVuY3Rpb24gUVModCxlLG4pe3JldHVybiBlKk1hdGguc2luKHQpKihuPy0xOjEpfWZ1bmN0aW9uIHRNKHQsZSxuKXtyZXR1cm4gZSpNYXRoLmNvcyh0KSoobj8xOi0xKX1mdW5jdGlvbiBlTSh0LGUsbil7dmFyIGk9dC5nZXQoImJvcmRlclJhZGl1cyIpO2lmKG51bGw9PWkpcmV0dXJuIG4/e2Nvcm5lclJhZGl1czowfTpudWxsO1koaSl8fChpPVtpLGksaSxpXSk7dmFyIHI9TWF0aC5hYnMoZS5yfHwwLWUucjB8fDApO3JldHVybntjb3JuZXJSYWRpdXM6eihpLChmdW5jdGlvbih0KXtyZXR1cm4gQ3IodCxyKX0pKX19dmFyIG5NPU1hdGgubWF4LGlNPU1hdGgubWluO3ZhciByTT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4uX2lzRmlyc3RGcmFtZT0hMCxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuX21vZGVsPXQsdGhpcy5fcmVtb3ZlT25SZW5kZXJlZExpc3RlbmVyKG4pLHRoaXMuX3VwZGF0ZURyYXdNb2RlKHQpO3ZhciByPXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIik7KCJjYXJ0ZXNpYW4yZCI9PT1yfHwicG9sYXIiPT09cikmJih0aGlzLl9wcm9ncmVzc2l2ZUVscz1udWxsLHRoaXMuX2lzTGFyZ2VEcmF3P3RoaXMuX3JlbmRlckxhcmdlKHQsZSxuKTp0aGlzLl9yZW5kZXJOb3JtYWwodCxlLG4saSkpfSxlLnByb3RvdHlwZS5pbmNyZW1lbnRhbFByZXBhcmVSZW5kZXI9ZnVuY3Rpb24odCl7dGhpcy5fY2xlYXIoKSx0aGlzLl91cGRhdGVEcmF3TW9kZSh0KSx0aGlzLl91cGRhdGVMYXJnZUNsaXAodCl9LGUucHJvdG90eXBlLmluY3JlbWVudGFsUmVuZGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5fcHJvZ3Jlc3NpdmVFbHM9W10sdGhpcy5faW5jcmVtZW50YWxSZW5kZXJMYXJnZSh0LGUpfSxlLnByb3RvdHlwZS5lYWNoUmVuZGVyZWQ9ZnVuY3Rpb24odCl7SmgodGhpcy5fcHJvZ3Jlc3NpdmVFbHN8fHRoaXMuZ3JvdXAsdCl9LGUucHJvdG90eXBlLl91cGRhdGVEcmF3TW9kZT1mdW5jdGlvbih0KXt2YXIgZT10LnBpcGVsaW5lQ29udGV4dC5sYXJnZTtudWxsIT10aGlzLl9pc0xhcmdlRHJhdyYmZT09PXRoaXMuX2lzTGFyZ2VEcmF3fHwodGhpcy5faXNMYXJnZURyYXc9ZSx0aGlzLl9jbGVhcigpKX0sZS5wcm90b3R5cGUuX3JlbmRlck5vcm1hbD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcixvPXRoaXMuZ3JvdXAsYT10LmdldERhdGEoKSxzPXRoaXMuX2RhdGEsbD10LmNvb3JkaW5hdGVTeXN0ZW0sdT1sLmdldEJhc2VBeGlzKCk7ImNhcnRlc2lhbjJkIj09PWwudHlwZT9yPXUuaXNIb3Jpem9udGFsKCk6InBvbGFyIj09PWwudHlwZSYmKHI9ImFuZ2xlIj09PXUuZGltKTt2YXIgaD10LmlzQW5pbWF0aW9uRW5hYmxlZCgpP3Q6bnVsbCxjPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXQoInJlYWx0aW1lU29ydCIsITApLGk9ZS5nZXRCYXNlQXhpcygpOzA7aWYobiYmImNhdGVnb3J5Ij09PWkudHlwZSYmImNhcnRlc2lhbjJkIj09PWUudHlwZSlyZXR1cm57YmFzZUF4aXM6aSxvdGhlckF4aXM6ZS5nZXRPdGhlckF4aXMoaSl9fSh0LGwpO2MmJnRoaXMuX2VuYWJsZVJlYWx0aW1lU29ydChjLGEsbik7dmFyIHA9dC5nZXQoImNsaXAiLCEwKXx8YyxkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRBcmVhJiZ0LmdldEFyZWEoKTtpZihPUyh0LCJjYXJ0ZXNpYW4yZCIpKXt2YXIgaT10LmdldEJhc2VBeGlzKCk7aWYoImNhdGVnb3J5IiE9PWkudHlwZXx8IWkub25CYW5kKXt2YXIgcj1lLmdldExheW91dCgiYmFuZFdpZHRoIik7aS5pc0hvcml6b250YWwoKT8obi54LT1yLG4ud2lkdGgrPTIqcik6KG4ueS09cixuLmhlaWdodCs9MipyKX19cmV0dXJuIG59KGwsYSk7by5yZW1vdmVDbGlwUGF0aCgpO3ZhciBmPXQuZ2V0KCJyb3VuZENhcCIsITApLGc9dC5nZXQoInNob3dCYWNrZ3JvdW5kIiwhMCkseT10LmdldE1vZGVsKCJiYWNrZ3JvdW5kU3R5bGUiKSx2PXkuZ2V0KCJib3JkZXJSYWRpdXMiKXx8MCxtPVtdLHg9dGhpcy5fYmFja2dyb3VuZEVscyxfPWkmJmkuaXNJbml0U29ydCxiPWkmJiJjaGFuZ2VBeGlzT3JkZXIiPT09aS50eXBlO2Z1bmN0aW9uIHcodCl7dmFyIGU9cE1bbC50eXBlXShhLHQpLG49ZnVuY3Rpb24odCxlLG4pe3ZhciBpPSJwb2xhciI9PT10LnR5cGU/RnU6V3M7cmV0dXJuIG5ldyBpKHtzaGFwZTp4TShlLG4sdCksc2lsZW50OiEwLHoyOjB9KX0obCxyLGUpO3JldHVybiBuLnVzZVN0eWxlKHkuZ2V0SXRlbVN0eWxlKCkpLCJjYXJ0ZXNpYW4yZCI9PT1sLnR5cGU/bi5zZXRTaGFwZSgiciIsdik6bi5zZXRTaGFwZSgiY29ybmVyUmFkaXVzIix2KSxtW3RdPW4sbn1hLmRpZmYocykuYWRkKChmdW5jdGlvbihlKXt2YXIgbj1hLmdldEl0ZW1Nb2RlbChlKSxpPXBNW2wudHlwZV0oYSxlLG4pO2lmKGcmJncoZSksYS5oYXNWYWx1ZShlKSYmY01bbC50eXBlXShpKSl7dmFyIHM9ITE7cCYmKHM9b01bbC50eXBlXShkLGkpKTt2YXIgeT1hTVtsLnR5cGVdKHQsYSxlLGkscixoLHUubW9kZWwsITEsZik7YyYmKHkuZm9yY2VMYWJlbEFuaW1hdGlvbj0hMCksZk0oeSxhLGUsbixpLHQsciwicG9sYXIiPT09bC50eXBlKSxfP3kuYXR0cih7c2hhcGU6aX0pOmM/c00oYyxoLHksaSxlLHIsITEsITEpOm1oKHkse3NoYXBlOml9LHQsZSksYS5zZXRJdGVtR3JhcGhpY0VsKGUseSksby5hZGQoeSkseS5pZ25vcmU9c319KSkudXBkYXRlKChmdW5jdGlvbihlLG4pe3ZhciBpPWEuZ2V0SXRlbU1vZGVsKGUpLFM9cE1bbC50eXBlXShhLGUsaSk7aWYoZyl7dmFyIE09dm9pZCAwOzA9PT14Lmxlbmd0aD9NPXcobik6KChNPXhbbl0pLnVzZVN0eWxlKHkuZ2V0SXRlbVN0eWxlKCkpLCJjYXJ0ZXNpYW4yZCI9PT1sLnR5cGU/TS5zZXRTaGFwZSgiciIsdik6TS5zZXRTaGFwZSgiY29ybmVyUmFkaXVzIix2KSxtW2VdPU0pO3ZhciBJPXBNW2wudHlwZV0oYSxlKTt2aChNLHtzaGFwZTp4TShyLEksbCl9LGgsZSl9dmFyIFQ9cy5nZXRJdGVtR3JhcGhpY0VsKG4pO2lmKGEuaGFzVmFsdWUoZSkmJmNNW2wudHlwZV0oUykpe3ZhciBDPSExO2lmKHAmJihDPW9NW2wudHlwZV0oZCxTKSkmJm8ucmVtb3ZlKFQpLFQ/U2goVCk6VD1hTVtsLnR5cGVdKHQsYSxlLFMscixoLHUubW9kZWwsISFULGYpLGMmJihULmZvcmNlTGFiZWxBbmltYXRpb249ITApLGIpe3ZhciBEPVQuZ2V0VGV4dENvbnRlbnQoKTtpZihEKXt2YXIgQT1wYyhEKTtudWxsIT1BLnByZXZWYWx1ZSYmKEEucHJldlZhbHVlPUEudmFsdWUpfX1lbHNlIGZNKFQsYSxlLGksUyx0LHIsInBvbGFyIj09PWwudHlwZSk7Xz9ULmF0dHIoe3NoYXBlOlN9KTpjP3NNKGMsaCxULFMsZSxyLCEwLGIpOnZoKFQse3NoYXBlOlN9LHQsZSxudWxsKSxhLnNldEl0ZW1HcmFwaGljRWwoZSxUKSxULmlnbm9yZT1DLG8uYWRkKFQpfWVsc2Ugby5yZW1vdmUoVCl9KSkucmVtb3ZlKChmdW5jdGlvbihlKXt2YXIgbj1zLmdldEl0ZW1HcmFwaGljRWwoZSk7biYmd2gobix0LGUpfSkpLmV4ZWN1dGUoKTt2YXIgUz10aGlzLl9iYWNrZ3JvdW5kR3JvdXB8fCh0aGlzLl9iYWNrZ3JvdW5kR3JvdXA9bmV3IEJyKTtTLnJlbW92ZUFsbCgpO2Zvcih2YXIgTT0wO008bS5sZW5ndGg7KytNKVMuYWRkKG1bTV0pO28uYWRkKFMpLHRoaXMuX2JhY2tncm91bmRFbHM9bSx0aGlzLl9kYXRhPWF9LGUucHJvdG90eXBlLl9yZW5kZXJMYXJnZT1mdW5jdGlvbih0LGUsbil7dGhpcy5fY2xlYXIoKSx2TSh0LHRoaXMuZ3JvdXApLHRoaXMuX3VwZGF0ZUxhcmdlQ2xpcCh0KX0sZS5wcm90b3R5cGUuX2luY3JlbWVudGFsUmVuZGVyTGFyZ2U9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZW1vdmVCYWNrZ3JvdW5kKCksdk0oZSx0aGlzLmdyb3VwLHRoaXMuX3Byb2dyZXNzaXZlRWxzLCEwKX0sZS5wcm90b3R5cGUuX3VwZGF0ZUxhcmdlQ2xpcD1mdW5jdGlvbih0KXt2YXIgZT10LmdldCgiY2xpcCIsITApJiZQUyh0LmNvb3JkaW5hdGVTeXN0ZW0sITEsdCksbj10aGlzLmdyb3VwO2U/bi5zZXRDbGlwUGF0aChlKTpuLnJlbW92ZUNsaXBQYXRoKCl9LGUucHJvdG90eXBlLl9lbmFibGVSZWFsdGltZVNvcnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXM7aWYoZS5jb3VudCgpKXt2YXIgcj10LmJhc2VBeGlzO2lmKHRoaXMuX2lzRmlyc3RGcmFtZSl0aGlzLl9kaXNwYXRjaEluaXRTb3J0KGUsdCxuKSx0aGlzLl9pc0ZpcnN0RnJhbWU9ITE7ZWxzZXt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbj1lLmdldEl0ZW1HcmFwaGljRWwodCksaT1uJiZuLnNoYXBlO3JldHVybiBpJiZNYXRoLmFicyhyLmlzSG9yaXpvbnRhbCgpP2kuaGVpZ2h0Omkud2lkdGgpfHwwfTt0aGlzLl9vblJlbmRlcmVkPWZ1bmN0aW9uKCl7aS5fdXBkYXRlU29ydFdpdGhpblNhbWVEYXRhKGUsbyxyLG4pfSxuLmdldFpyKCkub24oInJlbmRlcmVkIix0aGlzLl9vblJlbmRlcmVkKX19fSxlLnByb3RvdHlwZS5fZGF0YVNvcnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPVtdO3JldHVybiB0LmVhY2godC5tYXBEaW1lbnNpb24oZS5kaW0pLChmdW5jdGlvbih0LGUpe3ZhciByPW4oZSk7cj1udWxsPT1yP05hTjpyLGkucHVzaCh7ZGF0YUluZGV4OmUsbWFwcGVkVmFsdWU6cixvcmRpbmFsTnVtYmVyOnR9KX0pKSxpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUubWFwcGVkVmFsdWUtdC5tYXBwZWRWYWx1ZX0pKSx7b3JkaW5hbE51bWJlcnM6eihpLChmdW5jdGlvbih0KXtyZXR1cm4gdC5vcmRpbmFsTnVtYmVyfSkpfX0sZS5wcm90b3R5cGUuX2lzT3JkZXJDaGFuZ2VkV2l0aGluU2FtZURhdGE9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1uLnNjYWxlLHI9dC5tYXBEaW1lbnNpb24obi5kaW0pLG89TnVtYmVyLk1BWF9WQUxVRSxhPTAscz1pLmdldE9yZGluYWxNZXRhKCkuY2F0ZWdvcmllcy5sZW5ndGg7YTxzOysrYSl7dmFyIGw9dC5yYXdJbmRleE9mKHIsaS5nZXRSYXdPcmRpbmFsTnVtYmVyKGEpKSx1PWw8MD9OdW1iZXIuTUlOX1ZBTFVFOmUodC5pbmRleE9mUmF3SW5kZXgobCkpO2lmKHU+bylyZXR1cm4hMDtvPXV9cmV0dXJuITF9LGUucHJvdG90eXBlLl9pc09yZGVyRGlmZmVyZW50SW5WaWV3PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuc2NhbGUsaT1uLmdldEV4dGVudCgpLHI9TWF0aC5tYXgoMCxpWzBdKSxvPU1hdGgubWluKGlbMV0sbi5nZXRPcmRpbmFsTWV0YSgpLmNhdGVnb3JpZXMubGVuZ3RoLTEpO3I8PW87KytyKWlmKHQub3JkaW5hbE51bWJlcnNbcl0hPT1uLmdldFJhd09yZGluYWxOdW1iZXIocikpcmV0dXJuITB9LGUucHJvdG90eXBlLl91cGRhdGVTb3J0V2l0aGluU2FtZURhdGE9ZnVuY3Rpb24odCxlLG4saSl7aWYodGhpcy5faXNPcmRlckNoYW5nZWRXaXRoaW5TYW1lRGF0YSh0LGUsbikpe3ZhciByPXRoaXMuX2RhdGFTb3J0KHQsbixlKTt0aGlzLl9pc09yZGVyRGlmZmVyZW50SW5WaWV3KHIsbikmJih0aGlzLl9yZW1vdmVPblJlbmRlcmVkTGlzdGVuZXIoaSksaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiY2hhbmdlQXhpc09yZGVyIixjb21wb25lbnRUeXBlOm4uZGltKyJBeGlzIixheGlzSWQ6bi5pbmRleCxzb3J0SW5mbzpyfSkpfX0sZS5wcm90b3R5cGUuX2Rpc3BhdGNoSW5pdFNvcnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUuYmFzZUF4aXMscj10aGlzLl9kYXRhU29ydCh0LGksKGZ1bmN0aW9uKG4pe3JldHVybiB0LmdldCh0Lm1hcERpbWVuc2lvbihlLm90aGVyQXhpcy5kaW0pLG4pfSkpO24uZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImNoYW5nZUF4aXNPcmRlciIsY29tcG9uZW50VHlwZTppLmRpbSsiQXhpcyIsaXNJbml0U29ydDohMCxheGlzSWQ6aS5pbmRleCxzb3J0SW5mbzpyfSl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2NsZWFyKHRoaXMuX21vZGVsKSx0aGlzLl9yZW1vdmVPblJlbmRlcmVkTGlzdGVuZXIoZSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZW1vdmVPblJlbmRlcmVkTGlzdGVuZXIoZSl9LGUucHJvdG90eXBlLl9yZW1vdmVPblJlbmRlcmVkTGlzdGVuZXI9ZnVuY3Rpb24odCl7dGhpcy5fb25SZW5kZXJlZCYmKHQuZ2V0WnIoKS5vZmYoInJlbmRlcmVkIix0aGlzLl9vblJlbmRlcmVkKSx0aGlzLl9vblJlbmRlcmVkPW51bGwpfSxlLnByb3RvdHlwZS5fY2xlYXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncm91cCxuPXRoaXMuX2RhdGE7dCYmdC5pc0FuaW1hdGlvbkVuYWJsZWQoKSYmbiYmIXRoaXMuX2lzTGFyZ2VEcmF3Pyh0aGlzLl9yZW1vdmVCYWNrZ3JvdW5kKCksdGhpcy5fYmFja2dyb3VuZEVscz1bXSxuLmVhY2hJdGVtR3JhcGhpY0VsKChmdW5jdGlvbihlKXt3aChlLHQscmwoZSkuZGF0YUluZGV4KX0pKSk6ZS5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGwsdGhpcy5faXNGaXJzdEZyYW1lPSEwfSxlLnByb3RvdHlwZS5fcmVtb3ZlQmFja2dyb3VuZD1mdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlKHRoaXMuX2JhY2tncm91bmRHcm91cCksdGhpcy5fYmFja2dyb3VuZEdyb3VwPW51bGx9LGUudHlwZT0iYmFyIixlfShPZyksb009e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS53aWR0aDwwPy0xOjEsaT1lLmhlaWdodDwwPy0xOjE7bjwwJiYoZS54Kz1lLndpZHRoLGUud2lkdGg9LWUud2lkdGgpLGk8MCYmKGUueSs9ZS5oZWlnaHQsZS5oZWlnaHQ9LWUuaGVpZ2h0KTt2YXIgcj10LngrdC53aWR0aCxvPXQueSt0LmhlaWdodCxhPW5NKGUueCx0LngpLHM9aU0oZS54K2Uud2lkdGgsciksbD1uTShlLnksdC55KSx1PWlNKGUueStlLmhlaWdodCxvKSxoPXM8YSxjPXU8bDtyZXR1cm4gZS54PWgmJmE+cj9zOmEsZS55PWMmJmw+bz91OmwsZS53aWR0aD1oPzA6cy1hLGUuaGVpZ2h0PWM/MDp1LWwsbjwwJiYoZS54Kz1lLndpZHRoLGUud2lkdGg9LWUud2lkdGgpLGk8MCYmKGUueSs9ZS5oZWlnaHQsZS5oZWlnaHQ9LWUuaGVpZ2h0KSxofHxjfSxwb2xhcjpmdW5jdGlvbih0LGUpe3ZhciBuPWUucjA8PWUucj8xOi0xO2lmKG48MCl7dmFyIGk9ZS5yO2Uucj1lLnIwLGUucjA9aX12YXIgcj1pTShlLnIsdC5yKSxvPW5NKGUucjAsdC5yMCk7ZS5yPXIsZS5yMD1vO3ZhciBhPXItbzwwO2lmKG48MCl7aT1lLnI7ZS5yPWUucjAsZS5yMD1pfXJldHVybiBhfX0sYU09e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyxsKXt2YXIgdT1uZXcgV3Moe3NoYXBlOkEoe30saSksejI6MX0pOyh1Ll9fZGF0YUluZGV4PW4sdS5uYW1lPSJpdGVtIixvKSYmKHUuc2hhcGVbcj8iaGVpZ2h0Ijoid2lkdGgiXT0wKTtyZXR1cm4gdX0scG9sYXI6ZnVuY3Rpb24odCxlLG4saSxyLG8sYSxzLGwpe3ZhciB1PSFyJiZsP0pTOkZ1LGg9bmV3IHUoe3NoYXBlOmksejI6MX0pO2gubmFtZT0iaXRlbSI7dmFyIGMscCxkPWRNKHIpO2lmKGguY2FsY3VsYXRlVGV4dFBvc2l0aW9uPShjPWQscD0oe2lzUm91bmRDYXA6dT09PUpTfXx8e30pLmlzUm91bmRDYXAsZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUucG9zaXRpb247aWYoIWl8fGkgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gRHIodCxlLG4pO3ZhciByPWMoaSksbz1udWxsIT1lLmRpc3RhbmNlP2UuZGlzdGFuY2U6NSxhPXRoaXMuc2hhcGUscz1hLmN4LGw9YS5jeSx1PWEucixoPWEucjAsZD0odStoKS8yLGY9YS5zdGFydEFuZ2xlLGc9YS5lbmRBbmdsZSx5PShmK2cpLzIsdj1wP01hdGguYWJzKHUtaCkvMjowLG09TWF0aC5jb3MseD1NYXRoLnNpbixfPXMrdSptKGYpLGI9bCt1KngoZiksdz0ibGVmdCIsUz0idG9wIjtzd2l0Y2gocil7Y2FzZSJzdGFydEFyYyI6Xz1zKyhoLW8pKm0oeSksYj1sKyhoLW8pKngoeSksdz0iY2VudGVyIixTPSJ0b3AiO2JyZWFrO2Nhc2UiaW5zaWRlU3RhcnRBcmMiOl89cysoaCtvKSptKHkpLGI9bCsoaCtvKSp4KHkpLHc9ImNlbnRlciIsUz0iYm90dG9tIjticmVhaztjYXNlInN0YXJ0QW5nbGUiOl89cytkKm0oZikrUVMoZixvK3YsITEpLGI9bCtkKngoZikrdE0oZixvK3YsITEpLHc9InJpZ2h0IixTPSJtaWRkbGUiO2JyZWFrO2Nhc2UiaW5zaWRlU3RhcnRBbmdsZSI6Xz1zK2QqbShmKStRUyhmLC1vK3YsITEpLGI9bCtkKngoZikrdE0oZiwtbyt2LCExKSx3PSJsZWZ0IixTPSJtaWRkbGUiO2JyZWFrO2Nhc2UibWlkZGxlIjpfPXMrZCptKHkpLGI9bCtkKngoeSksdz0iY2VudGVyIixTPSJtaWRkbGUiO2JyZWFrO2Nhc2UiZW5kQXJjIjpfPXMrKHUrbykqbSh5KSxiPWwrKHUrbykqeCh5KSx3PSJjZW50ZXIiLFM9ImJvdHRvbSI7YnJlYWs7Y2FzZSJpbnNpZGVFbmRBcmMiOl89cysodS1vKSptKHkpLGI9bCsodS1vKSp4KHkpLHc9ImNlbnRlciIsUz0idG9wIjticmVhaztjYXNlImVuZEFuZ2xlIjpfPXMrZCptKGcpK1FTKGcsbyt2LCEwKSxiPWwrZCp4KGcpK3RNKGcsbyt2LCEwKSx3PSJsZWZ0IixTPSJtaWRkbGUiO2JyZWFrO2Nhc2UiaW5zaWRlRW5kQW5nbGUiOl89cytkKm0oZykrUVMoZywtbyt2LCEwKSxiPWwrZCp4KGcpK3RNKGcsLW8rdiwhMCksdz0icmlnaHQiLFM9Im1pZGRsZSI7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gRHIodCxlLG4pfXJldHVybih0PXR8fHt9KS54PV8sdC55PWIsdC5hbGlnbj13LHQudmVydGljYWxBbGlnbj1TLHR9KSxvKXt2YXIgZj1yPyJyIjoiZW5kQW5nbGUiLGc9e307aC5zaGFwZVtmXT1yP2kucjA6aS5zdGFydEFuZ2xlLGdbZl09aVtmXSwocz92aDptaCkoaCx7c2hhcGU6Z30sbyl9cmV0dXJuIGh9fTtmdW5jdGlvbiBzTSh0LGUsbixpLHIsbyxhLHMpe3ZhciBsLHU7bz8odT17eDppLngsd2lkdGg6aS53aWR0aH0sbD17eTppLnksaGVpZ2h0OmkuaGVpZ2h0fSk6KHU9e3k6aS55LGhlaWdodDppLmhlaWdodH0sbD17eDppLngsd2lkdGg6aS53aWR0aH0pLHN8fChhP3ZoOm1oKShuLHtzaGFwZTpsfSxlLHIsbnVsbCksKGE/dmg6bWgpKG4se3NoYXBlOnV9LGU/dC5iYXNlQXhpcy5tb2RlbDpudWxsLHIpfWZ1bmN0aW9uIGxNKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWlzRmluaXRlKHRbZVtuXV0pKXJldHVybiEwO3JldHVybiExfXZhciB1TT1bIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXSxoTT1bImN4IiwiY3kiLCJyIiwic3RhcnRBbmdsZSIsImVuZEFuZ2xlIl0sY009e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQpe3JldHVybiFsTSh0LHVNKX0scG9sYXI6ZnVuY3Rpb24odCl7cmV0dXJuIWxNKHQsaE0pfX0scE09e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmdldEl0ZW1MYXlvdXQoZSkscj1uP2Z1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXQoWyJpdGVtU3R5bGUiLCJib3JkZXJDb2xvciJdKTtpZighbnx8Im5vbmUiPT09bilyZXR1cm4gMDt2YXIgaT10LmdldChbIml0ZW1TdHlsZSIsImJvcmRlcldpZHRoIl0pfHwwLHI9aXNOYU4oZS53aWR0aCk/TnVtYmVyLk1BWF9WQUxVRTpNYXRoLmFicyhlLndpZHRoKSxvPWlzTmFOKGUuaGVpZ2h0KT9OdW1iZXIuTUFYX1ZBTFVFOk1hdGguYWJzKGUuaGVpZ2h0KTtyZXR1cm4gTWF0aC5taW4oaSxyLG8pfShuLGkpOjAsbz1pLndpZHRoPjA/MTotMSxhPWkuaGVpZ2h0PjA/MTotMTtyZXR1cm57eDppLngrbypyLzIseTppLnkrYSpyLzIsd2lkdGg6aS53aWR0aC1vKnIsaGVpZ2h0OmkuaGVpZ2h0LWEqcn19LHBvbGFyOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmdldEl0ZW1MYXlvdXQoZSk7cmV0dXJue2N4OmkuY3gsY3k6aS5jeSxyMDppLnIwLHI6aS5yLHN0YXJ0QW5nbGU6aS5zdGFydEFuZ2xlLGVuZEFuZ2xlOmkuZW5kQW5nbGUsY2xvY2t3aXNlOmkuY2xvY2t3aXNlfX19O2Z1bmN0aW9uIGRNKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10PyJBcmMiOiJBbmdsZSI7cmV0dXJuIGZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlInN0YXJ0IjpjYXNlImluc2lkZVN0YXJ0IjpjYXNlImVuZCI6Y2FzZSJpbnNpZGVFbmQiOnJldHVybiB0K2U7ZGVmYXVsdDpyZXR1cm4gdH19fSh0KX1mdW5jdGlvbiBmTSh0LGUsbixpLHIsbyxhLHMpe3ZhciBsPWUuZ2V0SXRlbVZpc3VhbChuLCJzdHlsZSIpO2lmKHMpe2lmKCFvLmdldCgicm91bmRDYXAiKSl7dmFyIHU9dC5zaGFwZTtBKHUsZU0oaS5nZXRNb2RlbCgiaXRlbVN0eWxlIiksdSwhMCkpLHQuc2V0U2hhcGUodSl9fWVsc2V7dmFyIGg9aS5nZXQoWyJpdGVtU3R5bGUiLCJib3JkZXJSYWRpdXMiXSl8fDA7dC5zZXRTaGFwZSgiciIsaCl9dC51c2VTdHlsZShsKTt2YXIgYz1pLmdldFNoYWxsb3coImN1cnNvciIpO2MmJnQuYXR0cigiY3Vyc29yIixjKTt2YXIgcD1zP2E/ci5yPj1yLnIwPyJlbmRBcmMiOiJzdGFydEFyYyI6ci5lbmRBbmdsZT49ci5zdGFydEFuZ2xlPyJlbmRBbmdsZSI6InN0YXJ0QW5nbGUiOmE/ci5oZWlnaHQ+PTA/ImJvdHRvbSI6InRvcCI6ci53aWR0aD49MD8icmlnaHQiOiJsZWZ0IixkPXJjKGkpO2ljKHQsZCx7bGFiZWxGZXRjaGVyOm8sbGFiZWxEYXRhSW5kZXg6bixkZWZhdWx0VGV4dDpwUyhvLmdldERhdGEoKSxuKSxpbmhlcml0Q29sb3I6bC5maWxsLGRlZmF1bHRPcGFjaXR5Omwub3BhY2l0eSxkZWZhdWx0T3V0c2lkZVBvc2l0aW9uOnB9KTt2YXIgZj10LmdldFRleHRDb250ZW50KCk7aWYocyYmZil7dmFyIGc9aS5nZXQoWyJsYWJlbCIsInBvc2l0aW9uIl0pO3QudGV4dENvbmZpZy5pbnNpZGU9Im1pZGRsZSI9PT1nfHxudWxsLGZ1bmN0aW9uKHQsZSxuLGkpe2lmKGooaSkpdC5zZXRUZXh0Q29uZmlnKHtyb3RhdGlvbjppfSk7ZWxzZSBpZihZKGUpKXQuc2V0VGV4dENvbmZpZyh7cm90YXRpb246MH0pO2Vsc2V7dmFyIHIsbz10LnNoYXBlLGE9by5jbG9ja3dpc2U/by5zdGFydEFuZ2xlOm8uZW5kQW5nbGUscz1vLmNsb2Nrd2lzZT9vLmVuZEFuZ2xlOm8uc3RhcnRBbmdsZSxsPShhK3MpLzIsdT1uKGUpO3N3aXRjaCh1KXtjYXNlInN0YXJ0QXJjIjpjYXNlImluc2lkZVN0YXJ0QXJjIjpjYXNlIm1pZGRsZSI6Y2FzZSJpbnNpZGVFbmRBcmMiOmNhc2UiZW5kQXJjIjpyPWw7YnJlYWs7Y2FzZSJzdGFydEFuZ2xlIjpjYXNlImluc2lkZVN0YXJ0QW5nbGUiOnI9YTticmVhaztjYXNlImVuZEFuZ2xlIjpjYXNlImluc2lkZUVuZEFuZ2xlIjpyPXM7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCB0LnNldFRleHRDb25maWcoe3JvdGF0aW9uOjB9KX12YXIgaD0xLjUqTWF0aC5QSS1yOyJtaWRkbGUiPT09dSYmaD5NYXRoLlBJLzImJmg8MS41Kk1hdGguUEkmJihoLT1NYXRoLlBJKSx0LnNldFRleHRDb25maWcoe3JvdGF0aW9uOmh9KX19KHQsIm91dHNpZGUiPT09Zz9wOmcsZE0oYSksaS5nZXQoWyJsYWJlbCIsInJvdGF0ZSJdKSl9ZGMoZixkLG8uZ2V0UmF3VmFsdWUobiksKGZ1bmN0aW9uKHQpe3JldHVybiBkUyhlLHQpfSkpO3ZhciB5PWkuZ2V0TW9kZWwoWyJlbXBoYXNpcyJdKTtabCh0LHkuZ2V0KCJmb2N1cyIpLHkuZ2V0KCJibHVyU2NvcGUiKSx5LmdldCgiZGlzYWJsZWQiKSksJGwodCxpKSxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC5zdGFydEFuZ2xlJiZudWxsIT10LmVuZEFuZ2xlJiZ0LnN0YXJ0QW5nbGU9PT10LmVuZEFuZ2xlfShyKSYmKHQuc3R5bGUuZmlsbD0ibm9uZSIsdC5zdHlsZS5zdHJva2U9Im5vbmUiLEUodC5zdGF0ZXMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUmJih0LnN0eWxlLmZpbGw9dC5zdHlsZS5zdHJva2U9Im5vbmUiKX0pKSl9dmFyIGdNPWZ1bmN0aW9uKCl7fSx5TT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLnR5cGU9ImxhcmdlQmFyIixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBnTX0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUucG9pbnRzLGk9dGhpcy5iYXNlRGltSWR4LHI9MS10aGlzLmJhc2VEaW1JZHgsbz1bXSxhPVtdLHM9dGhpcy5iYXJXaWR0aCxsPTA7bDxuLmxlbmd0aDtsKz0zKWFbaV09cyxhW3JdPW5bbCsyXSxvW2ldPW5bbCtpXSxvW3JdPW5bbCtyXSx0LnJlY3Qob1swXSxvWzFdLGFbMF0sYVsxXSl9LGV9KGtzKTtmdW5jdGlvbiB2TSh0LGUsbixpKXt2YXIgcj10LmdldERhdGEoKSxvPXIuZ2V0TGF5b3V0KCJ2YWx1ZUF4aXNIb3Jpem9udGFsIik/MTowLGE9ci5nZXRMYXlvdXQoImxhcmdlRGF0YUluZGljZXMiKSxzPXIuZ2V0TGF5b3V0KCJzaXplIiksbD10LmdldE1vZGVsKCJiYWNrZ3JvdW5kU3R5bGUiKSx1PXIuZ2V0TGF5b3V0KCJsYXJnZUJhY2tncm91bmRQb2ludHMiKTtpZih1KXt2YXIgaD1uZXcgeU0oe3NoYXBlOntwb2ludHM6dX0saW5jcmVtZW50YWw6ISFpLHNpbGVudDohMCx6MjowfSk7aC5iYXNlRGltSWR4PW8saC5sYXJnZURhdGFJbmRpY2VzPWEsaC5iYXJXaWR0aD1zLGgudXNlU3R5bGUobC5nZXRJdGVtU3R5bGUoKSksZS5hZGQoaCksbiYmbi5wdXNoKGgpfXZhciBjPW5ldyB5TSh7c2hhcGU6e3BvaW50czpyLmdldExheW91dCgibGFyZ2VQb2ludHMiKX0saW5jcmVtZW50YWw6ISFpLGlnbm9yZUNvYXJzZVBvaW50ZXI6ITAsejI6MX0pO2MuYmFzZURpbUlkeD1vLGMubGFyZ2VEYXRhSW5kaWNlcz1hLGMuYmFyV2lkdGg9cyxlLmFkZChjKSxjLnVzZVN0eWxlKHIuZ2V0VmlzdWFsKCJzdHlsZSIpKSxybChjKS5zZXJpZXNJbmRleD10LnNlcmllc0luZGV4LHQuZ2V0KCJzaWxlbnQiKXx8KGMub24oIm1vdXNlZG93biIsbU0pLGMub24oIm1vdXNlbW92ZSIsbU0pKSxuJiZuLnB1c2goYyl9dmFyIG1NPVdnKChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPXQuYmFzZURpbUlkeCxyPTEtaSxvPXQuc2hhcGUucG9pbnRzLGE9dC5sYXJnZURhdGFJbmRpY2VzLHM9W10sbD1bXSx1PXQuYmFyV2lkdGgsaD0wLGM9by5sZW5ndGgvMztoPGM7aCsrKXt2YXIgcD0zKmg7aWYobFtpXT11LGxbcl09b1twKzJdLHNbaV09b1twK2ldLHNbcl09b1twK3JdLGxbcl08MCYmKHNbcl0rPWxbcl0sbFtyXT0tbFtyXSksZT49c1swXSYmZTw9c1swXStsWzBdJiZuPj1zWzFdJiZuPD1zWzFdK2xbMV0pcmV0dXJuIGFbaF19cmV0dXJuLTF9KHRoaXMsdC5vZmZzZXRYLHQub2Zmc2V0WSk7cmwodGhpcykuZGF0YUluZGV4PWU+PTA/ZTpudWxsfSksMzAsITEpO2Z1bmN0aW9uIHhNKHQsZSxuKXtpZihPUyhuLCJjYXJ0ZXNpYW4yZCIpKXt2YXIgaT1lLHI9bi5nZXRBcmVhKCk7cmV0dXJue3g6dD9pLng6ci54LHk6dD9yLnk6aS55LHdpZHRoOnQ/aS53aWR0aDpyLndpZHRoLGhlaWdodDp0P3IuaGVpZ2h0OmkuaGVpZ2h0fX12YXIgbz1lO3JldHVybntjeDoocj1uLmdldEFyZWEoKSkuY3gsY3k6ci5jeSxyMDp0P3IucjA6by5yMCxyOnQ/ci5yOm8ucixzdGFydEFuZ2xlOnQ/by5zdGFydEFuZ2xlOjAsZW5kQW5nbGU6dD9vLmVuZEFuZ2xlOjIqTWF0aC5QSX19dmFyIF9NPTIqTWF0aC5QSSxiTT1NYXRoLlBJLzE4MDtmdW5jdGlvbiB3TSh0LGUpe3JldHVybiBrcCh0LmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KX1mdW5jdGlvbiBTTSh0LGUpe3ZhciBuPXdNKHQsZSksaT10LmdldCgiY2VudGVyIikscj10LmdldCgicmFkaXVzIik7WShyKXx8KHI9WzAscl0pO3ZhciBvLGEscz0kcihuLndpZHRoLGUuZ2V0V2lkdGgoKSksbD0kcihuLmhlaWdodCxlLmdldEhlaWdodCgpKSx1PU1hdGgubWluKHMsbCksaD0kcihyWzBdLHUvMiksYz0kcihyWzFdLHUvMikscD10LmNvb3JkaW5hdGVTeXN0ZW07aWYocCl7dmFyIGQ9cC5kYXRhVG9Qb2ludChpKTtvPWRbMF18fDAsYT1kWzFdfHwwfWVsc2UgWShpKXx8KGk9W2ksaV0pLG89JHIoaVswXSxzKStuLngsYT0kcihpWzFdLGwpK24ueTtyZXR1cm57Y3g6byxjeTphLHIwOmgscjpjfX1mdW5jdGlvbiBNTSh0LGUsbil7ZS5lYWNoU2VyaWVzQnlUeXBlKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLGk9ZS5tYXBEaW1lbnNpb24oInZhbHVlIikscj13TSh0LG4pLG89U00odCxuKSxhPW8uY3gscz1vLmN5LGw9by5yLHU9by5yMCxoPS10LmdldCgic3RhcnRBbmdsZSIpKmJNLGM9dC5nZXQoImVuZEFuZ2xlIikscD10LmdldCgicGFkQW5nbGUiKSpiTTtjPSJhdXRvIj09PWM/aC1fTTotYypiTTt2YXIgZD10LmdldCgibWluQW5nbGUiKSpiTStwLGY9MDtlLmVhY2goaSwoZnVuY3Rpb24odCl7IWlzTmFOKHQpJiZmKyt9KSk7dmFyIGc9ZS5nZXRTdW0oaSkseT1NYXRoLlBJLyhnfHxmKSoyLHY9dC5nZXQoImNsb2Nrd2lzZSIpLG09dC5nZXQoInJvc2VUeXBlIikseD10LmdldCgic3RpbGxTaG93WmVyb1N1bSIpLF89ZS5nZXREYXRhRXh0ZW50KGkpO19bMF09MDt2YXIgYj12PzE6LTEsdz1baCxjXSxTPWIqcC8yO3VzKHcsIXYpLGg9d1swXSxjPXdbMV07dmFyIE09SU0odCk7TS5zdGFydEFuZ2xlPWgsTS5lbmRBbmdsZT1jLE0uY2xvY2t3aXNlPXY7dmFyIEk9TWF0aC5hYnMoYy1oKSxUPUksQz0wLEQ9aDtpZihlLnNldExheW91dCh7dmlld1JlY3Q6cixyOmx9KSxlLmVhY2goaSwoZnVuY3Rpb24odCxuKXt2YXIgaTtpZihpc05hTih0KSllLnNldEl0ZW1MYXlvdXQobix7YW5nbGU6TmFOLHN0YXJ0QW5nbGU6TmFOLGVuZEFuZ2xlOk5hTixjbG9ja3dpc2U6dixjeDphLGN5OnMscjA6dSxyOm0/TmFOOmx9KTtlbHNleyhpPSJhcmVhIiE9PW0/MD09PWcmJng/eTp0Knk6SS9mKTxkPyhpPWQsVC09ZCk6Qys9dDt2YXIgcj1EK2IqaSxvPTAsaD0wO3A+aT9oPW89RCtiKmkvMjoobz1EK1MsaD1yLVMpLGUuc2V0SXRlbUxheW91dChuLHthbmdsZTppLHN0YXJ0QW5nbGU6byxlbmRBbmdsZTpoLGNsb2Nrd2lzZTp2LGN4OmEsY3k6cyxyMDp1LHI6bT9Lcih0LF8sW3UsbF0pOmx9KSxEPXJ9fSkpLFQ8X00mJmYpaWYoVDw9LjAwMSl7dmFyIEE9SS9mO2UuZWFjaChpLChmdW5jdGlvbih0LG4pe2lmKCFpc05hTih0KSl7dmFyIGk9ZS5nZXRJdGVtTGF5b3V0KG4pO2kuYW5nbGU9QTt2YXIgcj0wLG89MDtBPHA/bz1yPWgrYioobisuNSkqQToocj1oK2IqbipBK1Msbz1oK2IqKG4rMSkqQS1TKSxpLnN0YXJ0QW5nbGU9cixpLmVuZEFuZ2xlPW99fSkpfWVsc2UgeT1UL0MsRD1oLGUuZWFjaChpLChmdW5jdGlvbih0LG4pe2lmKCFpc05hTih0KSl7dmFyIGk9ZS5nZXRJdGVtTGF5b3V0KG4pLHI9aS5hbmdsZT09PWQ/ZDp0Knksbz0wLGE9MDtyPHA/YT1vPUQrYipyLzI6KG89RCtTLGE9RCtiKnItUyksaS5zdGFydEFuZ2xlPW8saS5lbmRBbmdsZT1hLEQrPWIqcn19KSl9KSl9dmFyIElNPVZvKCk7ZnVuY3Rpb24gVE0odCl7cmV0dXJue3Nlcmllc1R5cGU6dCxyZXNldDpmdW5jdGlvbih0LGUpe3ZhciBuPWUuZmluZENvbXBvbmVudHMoe21haW5UeXBlOiJsZWdlbmQifSk7aWYobiYmbi5sZW5ndGgpe3ZhciBpPXQuZ2V0RGF0YSgpO2kuZmlsdGVyU2VsZigoZnVuY3Rpb24odCl7Zm9yKHZhciBlPWkuZ2V0TmFtZSh0KSxyPTA7cjxuLmxlbmd0aDtyKyspaWYoIW5bcl0uaXNTZWxlY3RlZChlKSlyZXR1cm4hMTtyZXR1cm4hMH0pKX19fX12YXIgQ009TWF0aC5QSS8xODA7ZnVuY3Rpb24gRE0odCxlLG4saSxyLG8sYSxzLGwsdSl7aWYoISh0Lmxlbmd0aDwyKSl7Zm9yKHZhciBoPXQubGVuZ3RoLGM9MDtjPGg7YysrKWlmKCJvdXRlciI9PT10W2NdLnBvc2l0aW9uJiYibGFiZWxMaW5lIj09PXRbY10ubGFiZWxBbGlnblRvKXt2YXIgcD10W2NdLmxhYmVsLngtdTt0W2NdLmxpbmVQb2ludHNbMV1bMF0rPXAsdFtjXS5sYWJlbC54PXV9UmIodCxsLGwrYSkmJmZ1bmN0aW9uKHQpe2Zvcih2YXIgbz17bGlzdDpbXSxtYXhZOjB9LGE9e2xpc3Q6W10sbWF4WTowfSxzPTA7czx0Lmxlbmd0aDtzKyspaWYoIm5vbmUiPT09dFtzXS5sYWJlbEFsaWduVG8pe3ZhciBsPXRbc10sdT1sLmxhYmVsLnk+bj9hOm8saD1NYXRoLmFicyhsLmxhYmVsLnktbik7aWYoaD49dS5tYXhZKXt2YXIgYz1sLmxhYmVsLngtZS1sLmxlbjIqcixwPWkrbC5sZW4sZj1NYXRoLmFicyhjKTxwP01hdGguc3FydChoKmgvKDEtYypjL3AvcCkpOnA7dS5yQj1mLHUubWF4WT1ofXUubGlzdC5wdXNoKGwpfWQobyksZChhKX0odCl9ZnVuY3Rpb24gZCh0KXtmb3IodmFyIG89dC5yQixhPW8qbyxzPTA7czx0Lmxpc3QubGVuZ3RoO3MrKyl7dmFyIGw9dC5saXN0W3NdLHU9TWF0aC5hYnMobC5sYWJlbC55LW4pLGg9aStsLmxlbixjPWgqaCxwPU1hdGguc3FydCgoMS1NYXRoLmFicyh1KnUvYSkpKmMpLGQ9ZSsocCtsLmxlbjIpKnIsZj1kLWwubGFiZWwueDtBTShsLGwudGFyZ2V0VGV4dFdpZHRoLWYqciwhMCksbC5sYWJlbC54PWR9fX1mdW5jdGlvbiBBTSh0LGUsbil7aWYodm9pZCAwPT09biYmKG49ITEpLG51bGw9PXQubGFiZWxTdHlsZVdpZHRoKXt2YXIgaT10LmxhYmVsLHI9aS5zdHlsZSxvPXQucmVjdCxhPXIuYmFja2dyb3VuZENvbG9yLHM9ci5wYWRkaW5nLGw9cz9zWzFdK3NbM106MCx1PXIub3ZlcmZsb3csaD1vLndpZHRoKyhhPzA6bCk7aWYoZTxofHxuKXt2YXIgYz1vLmhlaWdodDtpZih1JiZ1Lm1hdGNoKCJicmVhayIpKXtpLnNldFN0eWxlKCJiYWNrZ3JvdW5kQ29sb3IiLG51bGwpLGkuc2V0U3R5bGUoIndpZHRoIixlLWwpO3ZhciBwPWkuZ2V0Qm91bmRpbmdSZWN0KCk7aS5zZXRTdHlsZSgid2lkdGgiLE1hdGguY2VpbChwLndpZHRoKSksaS5zZXRTdHlsZSgiYmFja2dyb3VuZENvbG9yIixhKX1lbHNle3ZhciBkPWUtbCxmPWU8aD9kOm4/ZD50LnVuY29uc3RyYWluZWRXaWR0aD9udWxsOmQ6bnVsbDtpLnNldFN0eWxlKCJ3aWR0aCIsZil9dmFyIGc9aS5nZXRCb3VuZGluZ1JlY3QoKTtvLndpZHRoPWcud2lkdGg7dmFyIHk9KGkuc3R5bGUubWFyZ2lufHwwKSsyLjE7by5oZWlnaHQ9Zy5oZWlnaHQreSxvLnktPShvLmhlaWdodC1jKS8yfX19ZnVuY3Rpb24ga00odCl7cmV0dXJuImNlbnRlciI9PT10LnBvc2l0aW9ufWZ1bmN0aW9uIExNKHQpe3ZhciBlLG4saT10LmdldERhdGEoKSxyPVtdLG89ITEsYT0odC5nZXQoIm1pblNob3dMYWJlbEFuZ2xlIil8fDApKkNNLHM9aS5nZXRMYXlvdXQoInZpZXdSZWN0IiksbD1pLmdldExheW91dCgiciIpLHU9cy53aWR0aCxoPXMueCxjPXMueSxwPXMuaGVpZ2h0O2Z1bmN0aW9uIGQodCl7dC5pZ25vcmU9ITB9aS5lYWNoKChmdW5jdGlvbih0KXt2YXIgcz1pLmdldEl0ZW1HcmFwaGljRWwodCksYz1zLnNoYXBlLHA9cy5nZXRUZXh0Q29udGVudCgpLGY9cy5nZXRUZXh0R3VpZGVMaW5lKCksZz1pLmdldEl0ZW1Nb2RlbCh0KSx5PWcuZ2V0TW9kZWwoImxhYmVsIiksdj15LmdldCgicG9zaXRpb24iKXx8Zy5nZXQoWyJlbXBoYXNpcyIsImxhYmVsIiwicG9zaXRpb24iXSksbT15LmdldCgiZGlzdGFuY2VUb0xhYmVsTGluZSIpLHg9eS5nZXQoImFsaWduVG8iKSxfPSRyKHkuZ2V0KCJlZGdlRGlzdGFuY2UiKSx1KSxiPXkuZ2V0KCJibGVlZE1hcmdpbiIpLHc9Zy5nZXRNb2RlbCgibGFiZWxMaW5lIiksUz13LmdldCgibGVuZ3RoIik7Uz0kcihTLHUpO3ZhciBNPXcuZ2V0KCJsZW5ndGgyIik7aWYoTT0kcihNLHUpLE1hdGguYWJzKGMuZW5kQW5nbGUtYy5zdGFydEFuZ2xlKTxhKXJldHVybiBFKHAuc3RhdGVzLGQpLHAuaWdub3JlPSEwLHZvaWQoZiYmKEUoZi5zdGF0ZXMsZCksZi5pZ25vcmU9ITApKTtpZihmdW5jdGlvbih0KXtpZighdC5pZ25vcmUpcmV0dXJuITA7Zm9yKHZhciBlIGluIHQuc3RhdGVzKWlmKCExPT09dC5zdGF0ZXNbZV0uaWdub3JlKXJldHVybiEwO3JldHVybiExfShwKSl7dmFyIEksVCxDLEQsQT0oYy5zdGFydEFuZ2xlK2MuZW5kQW5nbGUpLzIsaz1NYXRoLmNvcyhBKSxMPU1hdGguc2luKEEpO2U9Yy5jeCxuPWMuY3k7dmFyIFA9Imluc2lkZSI9PT12fHwiaW5uZXIiPT09djtpZigiY2VudGVyIj09PXYpST1jLmN4LFQ9Yy5jeSxEPSJjZW50ZXIiO2Vsc2V7dmFyIE89KFA/KGMucitjLnIwKS8yKms6Yy5yKmspK2UsUj0oUD8oYy5yK2MucjApLzIqTDpjLnIqTCkrbjtpZihJPU8rMyprLFQ9UiszKkwsIVApe3ZhciBOPU8rayooUytsLWMuciksej1SK0wqKFMrbC1jLnIpLFY9TisoazwwPy0xOjEpKk07ST0iZWRnZSI9PT14P2s8MD9oK186aCt1LV86VisoazwwPy1tOm0pLFQ9eixDPVtbTyxSXSxbTix6XSxbVix6XV19RD1QPyJjZW50ZXIiOiJlZGdlIj09PXg/az4wPyJyaWdodCI6ImxlZnQiOms+MD8ibGVmdCI6InJpZ2h0In12YXIgQj1NYXRoLlBJLEY9MCxHPXkuZ2V0KCJyb3RhdGUiKTtpZihqKEcpKUY9RyooQi8xODApO2Vsc2UgaWYoImNlbnRlciI9PT12KUY9MDtlbHNlIGlmKCJyYWRpYWwiPT09R3x8ITA9PT1HKXtGPWs8MD8tQStCOi1BfWVsc2UgaWYoInRhbmdlbnRpYWwiPT09RyYmIm91dHNpZGUiIT09diYmIm91dGVyIiE9PXYpe3ZhciBXPU1hdGguYXRhbjIoayxMKTtXPDAmJihXPTIqQitXKSxMPjAmJihXPUIrVyksRj1XLUJ9aWYobz0hIUYscC54PUkscC55PVQscC5yb3RhdGlvbj1GLHAuc2V0U3R5bGUoe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9KSxQKXtwLnNldFN0eWxlKHthbGlnbjpEfSk7dmFyIEg9cC5zdGF0ZXMuc2VsZWN0O0gmJihILngrPXAueCxILnkrPXAueSl9ZWxzZXt2YXIgWT1wLmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7WS5hcHBseVRyYW5zZm9ybShwLmdldENvbXB1dGVkVHJhbnNmb3JtKCkpO3ZhciBYPShwLnN0eWxlLm1hcmdpbnx8MCkrMi4xO1kueS09WC8yLFkuaGVpZ2h0Kz1YLHIucHVzaCh7bGFiZWw6cCxsYWJlbExpbmU6Zixwb3NpdGlvbjp2LGxlbjpTLGxlbjI6TSxtaW5UdXJuQW5nbGU6dy5nZXQoIm1pblR1cm5BbmdsZSIpLG1heFN1cmZhY2VBbmdsZTp3LmdldCgibWF4U3VyZmFjZUFuZ2xlIiksc3VyZmFjZU5vcm1hbDpuZXcgRGUoayxMKSxsaW5lUG9pbnRzOkMsdGV4dEFsaWduOkQsbGFiZWxEaXN0YW5jZTptLGxhYmVsQWxpZ25Ubzp4LGVkZ2VEaXN0YW5jZTpfLGJsZWVkTWFyZ2luOmIscmVjdDpZLHVuY29uc3RyYWluZWRXaWR0aDpZLndpZHRoLGxhYmVsU3R5bGVXaWR0aDpwLnN0eWxlLndpZHRofSl9cy5zZXRUZXh0Q29uZmlnKHtpbnNpZGU6UH0pfX0pKSwhbyYmdC5nZXQoImF2b2lkTGFiZWxPdmVybGFwIikmJmZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyl7Zm9yKHZhciBsPVtdLHU9W10saD1OdW1iZXIuTUFYX1ZBTFVFLGM9LU51bWJlci5NQVhfVkFMVUUscD0wO3A8dC5sZW5ndGg7cCsrKXt2YXIgZD10W3BdLmxhYmVsO2tNKHRbcF0pfHwoZC54PGU/KGg9TWF0aC5taW4oaCxkLngpLGwucHVzaCh0W3BdKSk6KGM9TWF0aC5tYXgoYyxkLngpLHUucHVzaCh0W3BdKSkpfWZvcihwPTA7cDx0Lmxlbmd0aDtwKyspaWYoIWtNKHk9dFtwXSkmJnkubGluZVBvaW50cyl7aWYobnVsbCE9eS5sYWJlbFN0eWxlV2lkdGgpY29udGludWU7ZD15LmxhYmVsO3ZhciBmPXkubGluZVBvaW50cyxnPXZvaWQgMDtnPSJlZGdlIj09PXkubGFiZWxBbGlnblRvP2QueDxlP2ZbMl1bMF0teS5sYWJlbERpc3RhbmNlLWEteS5lZGdlRGlzdGFuY2U6YStyLXkuZWRnZURpc3RhbmNlLWZbMl1bMF0teS5sYWJlbERpc3RhbmNlOiJsYWJlbExpbmUiPT09eS5sYWJlbEFsaWduVG8/ZC54PGU/aC1hLXkuYmxlZWRNYXJnaW46YStyLWMteS5ibGVlZE1hcmdpbjpkLng8ZT9kLngtYS15LmJsZWVkTWFyZ2luOmErci1kLngteS5ibGVlZE1hcmdpbix5LnRhcmdldFRleHRXaWR0aD1nLEFNKHksZyl9Zm9yKERNKHUsZSxuLGksMSwwLG8sMCxzLGMpLERNKGwsZSxuLGksLTEsMCxvLDAscyxoKSxwPTA7cDx0Lmxlbmd0aDtwKyspe3ZhciB5O2lmKCFrTSh5PXRbcF0pJiZ5LmxpbmVQb2ludHMpe2Q9eS5sYWJlbCxmPXkubGluZVBvaW50czt2YXIgdj0iZWRnZSI9PT15LmxhYmVsQWxpZ25UbyxtPWQuc3R5bGUucGFkZGluZyx4PW0/bVsxXSttWzNdOjAsXz1kLnN0eWxlLmJhY2tncm91bmRDb2xvcj8wOngsYj15LnJlY3Qud2lkdGgrXyx3PWZbMV1bMF0tZlsyXVswXTt2P2QueDxlP2ZbMl1bMF09YSt5LmVkZ2VEaXN0YW5jZStiK3kubGFiZWxEaXN0YW5jZTpmWzJdWzBdPWErci15LmVkZ2VEaXN0YW5jZS1iLXkubGFiZWxEaXN0YW5jZTooZC54PGU/ZlsyXVswXT1kLngreS5sYWJlbERpc3RhbmNlOmZbMl1bMF09ZC54LXkubGFiZWxEaXN0YW5jZSxmWzFdWzBdPWZbMl1bMF0rdyksZlsxXVsxXT1mWzJdWzFdPWQueX19fShyLGUsbixsLHUscCxoLGMpO2Zvcih2YXIgZj0wO2Y8ci5sZW5ndGg7ZisrKXt2YXIgZz1yW2ZdLHk9Zy5sYWJlbCx2PWcubGFiZWxMaW5lLG09aXNOYU4oeS54KXx8aXNOYU4oeS55KTtpZih5KXt5LnNldFN0eWxlKHthbGlnbjpnLnRleHRBbGlnbn0pLG0mJihFKHkuc3RhdGVzLGQpLHkuaWdub3JlPSEwKTt2YXIgeD15LnN0YXRlcy5zZWxlY3Q7eCYmKHgueCs9eS54LHgueSs9eS55KX1pZih2KXt2YXIgXz1nLmxpbmVQb2ludHM7bXx8IV8/KEUodi5zdGF0ZXMsZCksdi5pZ25vcmU9ITApOihUYihfLGcubWluVHVybkFuZ2xlKSxDYihfLGcuc3VyZmFjZU5vcm1hbCxnLm1heFN1cmZhY2VBbmdsZSksdi5zZXRTaGFwZSh7cG9pbnRzOl99KSx5Ll9faG9zdFRhcmdldC50ZXh0R3VpZGVMaW5lQ29uZmlnPXthbmNob3I6bmV3IERlKF9bMF1bMF0sX1swXVsxXSl9KX19fXZhciBQTT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixpKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7ci56Mj0yO3ZhciBvPW5ldyBYcztyZXR1cm4gci5zZXRUZXh0Q29udGVudChvKSxyLnVwZGF0ZURhdGEoZSxuLGksITApLHJ9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMsbz10Lmhvc3RNb2RlbCxhPXQuZ2V0SXRlbU1vZGVsKGUpLHM9YS5nZXRNb2RlbCgiZW1waGFzaXMiKSxsPXQuZ2V0SXRlbUxheW91dChlKSx1PUEoZU0oYS5nZXRNb2RlbCgiaXRlbVN0eWxlIiksbCwhMCksbCk7aWYoaXNOYU4odS5zdGFydEFuZ2xlKSlyLnNldFNoYXBlKHUpO2Vsc2V7aWYoaSl7ci5zZXRTaGFwZSh1KTt2YXIgaD1vLmdldFNoYWxsb3coImFuaW1hdGlvblR5cGUiKTtvLmVjTW9kZWwuc3NyPyhtaChyLHtzY2FsZVg6MCxzY2FsZVk6MH0sbyx7ZGF0YUluZGV4OmUsaXNGcm9tOiEwfSksci5vcmlnaW5YPXUuY3gsci5vcmlnaW5ZPXUuY3kpOiJzY2FsZSI9PT1oPyhyLnNoYXBlLnI9bC5yMCxtaChyLHtzaGFwZTp7cjpsLnJ9fSxvLGUpKTpudWxsIT1uPyhyLnNldFNoYXBlKHtzdGFydEFuZ2xlOm4sZW5kQW5nbGU6bn0pLG1oKHIse3NoYXBlOntzdGFydEFuZ2xlOmwuc3RhcnRBbmdsZSxlbmRBbmdsZTpsLmVuZEFuZ2xlfX0sbyxlKSk6KHIuc2hhcGUuZW5kQW5nbGU9bC5zdGFydEFuZ2xlLHZoKHIse3NoYXBlOntlbmRBbmdsZTpsLmVuZEFuZ2xlfX0sbyxlKSl9ZWxzZSBTaChyKSx2aChyLHtzaGFwZTp1fSxvLGUpO3IudXNlU3R5bGUodC5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIikpLCRsKHIsYSk7dmFyIGM9KGwuc3RhcnRBbmdsZStsLmVuZEFuZ2xlKS8yLHA9by5nZXQoInNlbGVjdGVkT2Zmc2V0IiksZD1NYXRoLmNvcyhjKSpwLGY9TWF0aC5zaW4oYykqcCxnPWEuZ2V0U2hhbGxvdygiY3Vyc29yIik7ZyYmci5hdHRyKCJjdXJzb3IiLGcpLHRoaXMuX3VwZGF0ZUxhYmVsKG8sdCxlKSxyLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnNoYXBlPUEoe3I6bC5yKyhzLmdldCgic2NhbGUiKSYmcy5nZXQoInNjYWxlU2l6ZSIpfHwwKX0sZU0ocy5nZXRNb2RlbCgiaXRlbVN0eWxlIiksbCkpLEEoci5lbnN1cmVTdGF0ZSgic2VsZWN0Iikse3g6ZCx5OmYsc2hhcGU6ZU0oYS5nZXRNb2RlbChbInNlbGVjdCIsIml0ZW1TdHlsZSJdKSxsKX0pLEEoci5lbnN1cmVTdGF0ZSgiYmx1ciIpLHtzaGFwZTplTShhLmdldE1vZGVsKFsiYmx1ciIsIml0ZW1TdHlsZSJdKSxsKX0pO3ZhciB5PXIuZ2V0VGV4dEd1aWRlTGluZSgpLHY9ci5nZXRUZXh0Q29udGVudCgpO3kmJkEoeS5lbnN1cmVTdGF0ZSgic2VsZWN0Iikse3g6ZCx5OmZ9KSxBKHYuZW5zdXJlU3RhdGUoInNlbGVjdCIpLHt4OmQseTpmfSksWmwodGhpcyxzLmdldCgiZm9jdXMiKSxzLmdldCgiYmx1clNjb3BlIikscy5nZXQoImRpc2FibGVkIikpfX0sZS5wcm90b3R5cGUuX3VwZGF0ZUxhYmVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9ZS5nZXRJdGVtTW9kZWwobiksbz1yLmdldE1vZGVsKCJsYWJlbExpbmUiKSxhPWUuZ2V0SXRlbVZpc3VhbChuLCJzdHlsZSIpLHM9YSYmYS5maWxsLGw9YSYmYS5vcGFjaXR5O2ljKGkscmMocikse2xhYmVsRmV0Y2hlcjplLmhvc3RNb2RlbCxsYWJlbERhdGFJbmRleDpuLGluaGVyaXRDb2xvcjpzLGRlZmF1bHRPcGFjaXR5OmwsZGVmYXVsdFRleHQ6dC5nZXRGb3JtYXR0ZWRMYWJlbChuLCJub3JtYWwiKXx8ZS5nZXROYW1lKG4pfSk7dmFyIHU9aS5nZXRUZXh0Q29udGVudCgpO2kuc2V0VGV4dENvbmZpZyh7cG9zaXRpb246bnVsbCxyb3RhdGlvbjpudWxsfSksdS5hdHRyKHt6MjoxMH0pO3ZhciBoPXQuZ2V0KFsibGFiZWwiLCJwb3NpdGlvbiJdKTtpZigib3V0c2lkZSIhPT1oJiYib3V0ZXIiIT09aClpLnJlbW92ZVRleHRHdWlkZUxpbmUoKTtlbHNle3ZhciBjPXRoaXMuZ2V0VGV4dEd1aWRlTGluZSgpO2N8fChjPW5ldyBadSx0aGlzLnNldFRleHRHdWlkZUxpbmUoYykpLGtiKHRoaXMsTGIocikse3N0cm9rZTpzLG9wYWNpdHk6b3Qoby5nZXQoWyJsaW5lU3R5bGUiLCJvcGFjaXR5Il0pLGwsMSl9KX19LGV9KEZ1KSxPTT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmlnbm9yZUxhYmVsTGluZVVwZGF0ZT0hMCxlfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByLG89dC5nZXREYXRhKCksYT10aGlzLl9kYXRhLHM9dGhpcy5ncm91cDtpZighYSYmby5jb3VudCgpPjApe2Zvcih2YXIgbD1vLmdldEl0ZW1MYXlvdXQoMCksdT0xO2lzTmFOKGwmJmwuc3RhcnRBbmdsZSkmJnU8by5jb3VudCgpOysrdSlsPW8uZ2V0SXRlbUxheW91dCh1KTtsJiYocj1sLnN0YXJ0QW5nbGUpfWlmKHRoaXMuX2VtcHR5Q2lyY2xlU2VjdG9yJiZzLnJlbW92ZSh0aGlzLl9lbXB0eUNpcmNsZVNlY3RvciksMD09PW8uY291bnQoKSYmdC5nZXQoInNob3dFbXB0eUNpcmNsZSIpKXt2YXIgaD1JTSh0KSxjPW5ldyBGdSh7c2hhcGU6QShTTSh0LG4pLGgpfSk7Yy51c2VTdHlsZSh0LmdldE1vZGVsKCJlbXB0eUNpcmNsZVN0eWxlIikuZ2V0SXRlbVN0eWxlKCkpLHRoaXMuX2VtcHR5Q2lyY2xlU2VjdG9yPWMscy5hZGQoYyl9by5kaWZmKGEpLmFkZCgoZnVuY3Rpb24odCl7dmFyIGU9bmV3IFBNKG8sdCxyKTtvLnNldEl0ZW1HcmFwaGljRWwodCxlKSxzLmFkZChlKX0pKS51cGRhdGUoKGZ1bmN0aW9uKHQsZSl7dmFyIG49YS5nZXRJdGVtR3JhcGhpY0VsKGUpO24udXBkYXRlRGF0YShvLHQsciksbi5vZmYoImNsaWNrIikscy5hZGQobiksby5zZXRJdGVtR3JhcGhpY0VsKHQsbil9KSkucmVtb3ZlKChmdW5jdGlvbihlKXt3aChhLmdldEl0ZW1HcmFwaGljRWwoZSksdCxlKX0pKS5leGVjdXRlKCksTE0odCksImV4cGFuc2lvbiIhPT10LmdldCgiYW5pbWF0aW9uVHlwZVVwZGF0ZSIpJiYodGhpcy5fZGF0YT1vKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuY29udGFpblBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5nZXREYXRhKCkuZ2V0SXRlbUxheW91dCgwKTtpZihuKXt2YXIgaT10WzBdLW4uY3gscj10WzFdLW4uY3ksbz1NYXRoLnNxcnQoaSppK3Iqcik7cmV0dXJuIG88PW4uciYmbz49bi5yMH19LGUudHlwZT0icGllIixlfShPZyk7ZnVuY3Rpb24gUk0odCxlLG4pe2U9WShlKSYme2Nvb3JkRGltZW5zaW9uczplfXx8QSh7ZW5jb2RlRGVmaW5lOnQuZ2V0RW5jb2RlKCl9LGUpO3ZhciBpPXQuZ2V0U291cmNlKCkscj1weChpLGUpLmRpbWVuc2lvbnMsbz1uZXcgY3gocix0KTtyZXR1cm4gby5pbml0RGF0YShpLG4pLG99dmFyIE5NPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2dldERhdGFXaXRoRW5jb2RlZFZpc3VhbD10LHRoaXMuX2dldFJhd0RhdGE9ZX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0QWxsTmFtZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRSYXdEYXRhKCk7cmV0dXJuIHQubWFwQXJyYXkodC5nZXROYW1lKX0sdC5wcm90b3R5cGUuY29udGFpbk5hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dldFJhd0RhdGEoKS5pbmRleE9mTmFtZSh0KT49MH0sdC5wcm90b3R5cGUuaW5kZXhPZk5hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dldERhdGFXaXRoRW5jb2RlZFZpc3VhbCgpLmluZGV4T2ZOYW1lKHQpfSx0LnByb3RvdHlwZS5nZXRJdGVtVmlzdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2dldERhdGFXaXRoRW5jb2RlZFZpc3VhbCgpLmdldEl0ZW1WaXN1YWwodCxlKX0sdH0oKSxFTT1WbygpLHpNPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmxlZ2VuZFZpc3VhbFByb3ZpZGVyPW5ldyBOTShXKHRoaXMuZ2V0RGF0YSx0aGlzKSxXKHRoaXMuZ2V0UmF3RGF0YSx0aGlzKSksdGhpcy5fZGVmYXVsdExhYmVsTGluZShlKX0sZS5wcm90b3R5cGUubWVyZ2VPcHRpb249ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5tZXJnZU9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIFJNKHRoaXMse2Nvb3JkRGltZW5zaW9uczpbInZhbHVlIl0sZW5jb2RlRGVmYXVsdGVyOkgoZWQsdGhpcyl9KX0sZS5wcm90b3R5cGUuZ2V0RGF0YVBhcmFtcz1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmdldERhdGEoKSxpPUVNKG4pLHI9aS5zZWF0cztpZighcil7dmFyIG89W107bi5lYWNoKG4ubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLChmdW5jdGlvbih0KXtvLnB1c2godCl9KSkscj1pLnNlYXRzPWlvKG8sbi5ob3N0TW9kZWwuZ2V0KCJwZXJjZW50UHJlY2lzaW9uIikpfXZhciBhPXQucHJvdG90eXBlLmdldERhdGFQYXJhbXMuY2FsbCh0aGlzLGUpO3JldHVybiBhLnBlcmNlbnQ9cltlXXx8MCxhLiR2YXJzLnB1c2goInBlcmNlbnQiKSxhfSxlLnByb3RvdHlwZS5fZGVmYXVsdExhYmVsTGluZT1mdW5jdGlvbih0KXtDbyh0LCJsYWJlbExpbmUiLFsic2hvdyJdKTt2YXIgZT10LmxhYmVsTGluZSxuPXQuZW1waGFzaXMubGFiZWxMaW5lO2Uuc2hvdz1lLnNob3cmJnQubGFiZWwuc2hvdyxuLnNob3c9bi5zaG93JiZ0LmVtcGhhc2lzLmxhYmVsLnNob3d9LGUudHlwZT0ic2VyaWVzLnBpZSIsZS5kZWZhdWx0T3B0aW9uPXt6OjIsbGVnZW5kSG92ZXJMaW5rOiEwLGNvbG9yQnk6ImRhdGEiLGNlbnRlcjpbIjUwJSIsIjUwJSJdLHJhZGl1czpbMCwiNzUlIl0sY2xvY2t3aXNlOiEwLHN0YXJ0QW5nbGU6OTAsZW5kQW5nbGU6ImF1dG8iLHBhZEFuZ2xlOjAsbWluQW5nbGU6MCxtaW5TaG93TGFiZWxBbmdsZTowLHNlbGVjdGVkT2Zmc2V0OjEwLHBlcmNlbnRQcmVjaXNpb246MixzdGlsbFNob3daZXJvU3VtOiEwLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsbGFiZWw6e3JvdGF0ZTowLHNob3c6ITAsb3ZlcmZsb3c6InRydW5jYXRlIixwb3NpdGlvbjoib3V0ZXIiLGFsaWduVG86Im5vbmUiLGVkZ2VEaXN0YW5jZToiMjUlIixibGVlZE1hcmdpbjoxMCxkaXN0YW5jZVRvTGFiZWxMaW5lOjV9LGxhYmVsTGluZTp7c2hvdzohMCxsZW5ndGg6MTUsbGVuZ3RoMjoxNSxzbW9vdGg6ITEsbWluVHVybkFuZ2xlOjkwLG1heFN1cmZhY2VBbmdsZTo5MCxsaW5lU3R5bGU6e3dpZHRoOjEsdHlwZToic29saWQifX0saXRlbVN0eWxlOntib3JkZXJXaWR0aDoxLGJvcmRlckpvaW46InJvdW5kIn0sc2hvd0VtcHR5Q2lyY2xlOiEwLGVtcHR5Q2lyY2xlU3R5bGU6e2NvbG9yOiJsaWdodGdyYXkiLG9wYWNpdHk6MX0sbGFiZWxMYXlvdXQ6e2hpZGVPdmVybGFwOiEwfSxlbXBoYXNpczp7c2NhbGU6ITAsc2NhbGVTaXplOjV9LGF2b2lkTGFiZWxPdmVybGFwOiEwLGFuaW1hdGlvblR5cGU6ImV4cGFuc2lvbiIsYW5pbWF0aW9uRHVyYXRpb246MWUzLGFuaW1hdGlvblR5cGVVcGRhdGU6InRyYW5zaXRpb24iLGFuaW1hdGlvbkVhc2luZ1VwZGF0ZToiY3ViaWNJbk91dCIsYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6NTAwLGFuaW1hdGlvbkVhc2luZzoiY3ViaWNJbk91dCJ9LGV9KGJnKTt2YXIgVk09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmhhc1N5bWJvbFZpc3VhbD0hMCxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3gobnVsbCx0aGlzLHt1c2VFbmNvZGVEZWZhdWx0ZXI6ITB9KX0sZS5wcm90b3R5cGUuZ2V0UHJvZ3Jlc3NpdmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbi5wcm9ncmVzc2l2ZTtyZXR1cm4gbnVsbD09dD90aGlzLm9wdGlvbi5sYXJnZT81ZTM6dGhpcy5nZXQoInByb2dyZXNzaXZlIik6dH0sZS5wcm90b3R5cGUuZ2V0UHJvZ3Jlc3NpdmVUaHJlc2hvbGQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbi5wcm9ncmVzc2l2ZVRocmVzaG9sZDtyZXR1cm4gbnVsbD09dD90aGlzLm9wdGlvbi5sYXJnZT8xZTQ6dGhpcy5nZXQoInByb2dyZXNzaXZlVGhyZXNob2xkIik6dH0sZS5wcm90b3R5cGUuYnJ1c2hTZWxlY3Rvcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG4ucG9pbnQoZS5nZXRJdGVtTGF5b3V0KHQpKX0sZS5wcm90b3R5cGUuZ2V0WkxldmVsS2V5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RGF0YSgpLmNvdW50KCk+dGhpcy5nZXRQcm9ncmVzc2l2ZVRocmVzaG9sZCgpP3RoaXMuaWQ6IiJ9LGUudHlwZT0ic2VyaWVzLnNjYXR0ZXIiLGUuZGVwZW5kZW5jaWVzPVsiZ3JpZCIsInBvbGFyIiwiZ2VvIiwic2luZ2xlQXhpcyIsImNhbGVuZGFyIl0sZS5kZWZhdWx0T3B0aW9uPXtjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsejoyLGxlZ2VuZEhvdmVyTGluazohMCxzeW1ib2xTaXplOjEwLGxhcmdlOiExLGxhcmdlVGhyZXNob2xkOjJlMyxpdGVtU3R5bGU6e29wYWNpdHk6Ljh9LGVtcGhhc2lzOntzY2FsZTohMH0sY2xpcDohMCxzZWxlY3Q6e2l0ZW1TdHlsZTp7Ym9yZGVyQ29sb3I6IiMyMTIxMjEifX0sdW5pdmVyc2FsVHJhbnNpdGlvbjp7ZGl2aWRlU2hhcGU6ImNsb25lIn19LGV9KGJnKSxCTT1mdW5jdGlvbigpe30sRk09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi5fb2ZmPTAsbi5ob3ZlckRhdGFJZHg9LTEsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgQk19LGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5ub3RDbGVhcj0hMSx0aGlzLl9vZmY9MH0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT1lLnBvaW50cyxyPWUuc2l6ZSxvPXRoaXMuc3ltYm9sUHJveHksYT1vLnNoYXBlLHM9dC5nZXRDb250ZXh0P3QuZ2V0Q29udGV4dCgpOnQsbD1zJiZyWzBdPDQsdT10aGlzLnNvZnRDbGlwU2hhcGU7aWYobCl0aGlzLl9jdHg9cztlbHNle2Zvcih0aGlzLl9jdHg9bnVsbCxuPXRoaXMuX29mZjtuPGkubGVuZ3RoOyl7dmFyIGg9aVtuKytdLGM9aVtuKytdO2lzTmFOKGgpfHxpc05hTihjKXx8KHUmJiF1LmNvbnRhaW4oaCxjKXx8KGEueD1oLXJbMF0vMixhLnk9Yy1yWzFdLzIsYS53aWR0aD1yWzBdLGEuaGVpZ2h0PXJbMV0sby5idWlsZFBhdGgodCxhLCEwKSkpfXRoaXMuaW5jcmVtZW50YWwmJih0aGlzLl9vZmY9bix0aGlzLm5vdENsZWFyPSEwKX19LGUucHJvdG90eXBlLmFmdGVyQnJ1c2g9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuc2hhcGUsbj1lLnBvaW50cyxpPWUuc2l6ZSxyPXRoaXMuX2N0eCxvPXRoaXMuc29mdENsaXBTaGFwZTtpZihyKXtmb3IodD10aGlzLl9vZmY7dDxuLmxlbmd0aDspe3ZhciBhPW5bdCsrXSxzPW5bdCsrXTtpc05hTihhKXx8aXNOYU4ocyl8fChvJiYhby5jb250YWluKGEscyl8fHIuZmlsbFJlY3QoYS1pWzBdLzIscy1pWzFdLzIsaVswXSxpWzFdKSl9dGhpcy5pbmNyZW1lbnRhbCYmKHRoaXMuX29mZj10LHRoaXMubm90Q2xlYXI9ITApfX0sZS5wcm90b3R5cGUuZmluZERhdGFJbmRleD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnNoYXBlLGk9bi5wb2ludHMscj1uLnNpemUsbz1NYXRoLm1heChyWzBdLDQpLGE9TWF0aC5tYXgoclsxXSw0KSxzPWkubGVuZ3RoLzItMTtzPj0wO3MtLSl7dmFyIGw9MipzLHU9aVtsXS1vLzIsaD1pW2wrMV0tYS8yO2lmKHQ+PXUmJmU+PWgmJnQ8PXUrbyYmZTw9aCthKXJldHVybiBzfXJldHVybi0xfSxlLnByb3RvdHlwZS5jb250YWluPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50cmFuc2Zvcm1Db29yZFRvTG9jYWwodCxlKSxpPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuIHQ9blswXSxlPW5bMV0saS5jb250YWluKHQsZSk/KHRoaXMuaG92ZXJEYXRhSWR4PXRoaXMuZmluZERhdGFJbmRleCh0LGUpKT49MDoodGhpcy5ob3ZlckRhdGFJZHg9LTEsITEpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGluZ1JlY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWN0O2lmKCF0KXtmb3IodmFyIGU9dGhpcy5zaGFwZSxuPWUucG9pbnRzLGk9ZS5zaXplLHI9aVswXSxvPWlbMV0sYT0xLzAscz0xLzAsbD0tMS8wLHU9LTEvMCxoPTA7aDxuLmxlbmd0aDspe3ZhciBjPW5baCsrXSxwPW5baCsrXTthPU1hdGgubWluKGMsYSksbD1NYXRoLm1heChjLGwpLHM9TWF0aC5taW4ocCxzKSx1PU1hdGgubWF4KHAsdSl9dD10aGlzLl9yZWN0PW5ldyB6ZShhLXIvMixzLW8vMixsLWErcix1LXMrbyl9cmV0dXJuIHR9LGV9KGtzKSxHTT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmdyb3VwPW5ldyBCcn1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlRGF0YT1mdW5jdGlvbih0LGUpe3RoaXMuX2NsZWFyKCk7dmFyIG49dGhpcy5fY3JlYXRlKCk7bi5zZXRTaGFwZSh7cG9pbnRzOnQuZ2V0TGF5b3V0KCJwb2ludHMiKX0pLHRoaXMuX3NldENvbW1vbihuLHQsZSl9LHQucHJvdG90eXBlLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0KXt2YXIgZT10LmdldExheW91dCgicG9pbnRzIik7dGhpcy5ncm91cC5lYWNoQ2hpbGQoKGZ1bmN0aW9uKHQpe2lmKG51bGwhPXQuc3RhcnRJbmRleCl7dmFyIG49MioodC5lbmRJbmRleC10LnN0YXJ0SW5kZXgpLGk9NCp0LnN0YXJ0SW5kZXgqMjtlPW5ldyBGbG9hdDMyQXJyYXkoZS5idWZmZXIsaSxuKX10LnNldFNoYXBlKCJwb2ludHMiLGUpLHQucmVzZXQoKX0pKX0sdC5wcm90b3R5cGUuaW5jcmVtZW50YWxQcmVwYXJlVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuX2NsZWFyKCl9LHQucHJvdG90eXBlLmluY3JlbWVudGFsVXBkYXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9uZXdBZGRlZFswXSxyPWUuZ2V0TGF5b3V0KCJwb2ludHMiKSxvPWkmJmkuc2hhcGUucG9pbnRzO2lmKG8mJm8ubGVuZ3RoPDJlNCl7dmFyIGE9by5sZW5ndGgscz1uZXcgRmxvYXQzMkFycmF5KGErci5sZW5ndGgpO3Muc2V0KG8pLHMuc2V0KHIsYSksaS5lbmRJbmRleD10LmVuZCxpLnNldFNoYXBlKHtwb2ludHM6c30pfWVsc2V7dGhpcy5fbmV3QWRkZWQ9W107dmFyIGw9dGhpcy5fY3JlYXRlKCk7bC5zdGFydEluZGV4PXQuc3RhcnQsbC5lbmRJbmRleD10LmVuZCxsLmluY3JlbWVudGFsPSEwLGwuc2V0U2hhcGUoe3BvaW50czpyfSksdGhpcy5fc2V0Q29tbW9uKGwsZSxuKX19LHQucHJvdG90eXBlLmVhY2hSZW5kZXJlZD1mdW5jdGlvbih0KXt0aGlzLl9uZXdBZGRlZFswXSYmdCh0aGlzLl9uZXdBZGRlZFswXSl9LHQucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRk0oe2N1cnNvcjoiZGVmYXVsdCJ9KTtyZXR1cm4gdC5pZ25vcmVDb2Fyc2VQb2ludGVyPSEwLHRoaXMuZ3JvdXAuYWRkKHQpLHRoaXMuX25ld0FkZGVkLnB1c2godCksdH0sdC5wcm90b3R5cGUuX3NldENvbW1vbj1mdW5jdGlvbih0LGUsbil7dmFyIGk9ZS5ob3N0TW9kZWw7bj1ufHx7fTt2YXIgcj1lLmdldFZpc3VhbCgic3ltYm9sU2l6ZSIpO3Quc2V0U2hhcGUoInNpemUiLHIgaW5zdGFuY2VvZiBBcnJheT9yOltyLHJdKSx0LnNvZnRDbGlwU2hhcGU9bi5jbGlwU2hhcGV8fG51bGwsdC5zeW1ib2xQcm94eT1YeShlLmdldFZpc3VhbCgic3ltYm9sIiksMCwwLDAsMCksdC5zZXRDb2xvcj10LnN5bWJvbFByb3h5LnNldENvbG9yO3ZhciBvPXQuc2hhcGUuc2l6ZVswXTw0O3QudXNlU3R5bGUoaS5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKG8/WyJjb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dDb2xvciJdOlsiY29sb3IiXSkpO3ZhciBhPWUuZ2V0VmlzdWFsKCJzdHlsZSIpLHM9YSYmYS5maWxsO3MmJnQuc2V0Q29sb3Iocyk7dmFyIGw9cmwodCk7bC5zZXJpZXNJbmRleD1pLnNlcmllc0luZGV4LHQub24oIm1vdXNlbW92ZSIsKGZ1bmN0aW9uKGUpe2wuZGF0YUluZGV4PW51bGw7dmFyIG49dC5ob3ZlckRhdGFJZHg7bj49MCYmKGwuZGF0YUluZGV4PW4rKHQuc3RhcnRJbmRleHx8MCkpfSkpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhcigpfSx0LnByb3RvdHlwZS5fY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9uZXdBZGRlZD1bXSx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSx0fSgpLFdNPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCk7dGhpcy5fdXBkYXRlU3ltYm9sRHJhdyhpLHQpLnVwZGF0ZURhdGEoaSx7Y2xpcFNoYXBlOnRoaXMuX2dldENsaXBTaGFwZSh0KX0pLHRoaXMuX2ZpbmlzaGVkPSEwfSxlLnByb3RvdHlwZS5pbmNyZW1lbnRhbFByZXBhcmVSZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuZ2V0RGF0YSgpO3RoaXMuX3VwZGF0ZVN5bWJvbERyYXcoaSx0KS5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGUoaSksdGhpcy5fZmluaXNoZWQ9ITF9LGUucHJvdG90eXBlLmluY3JlbWVudGFsUmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9zeW1ib2xEcmF3LmluY3JlbWVudGFsVXBkYXRlKHQsZS5nZXREYXRhKCkse2NsaXBTaGFwZTp0aGlzLl9nZXRDbGlwU2hhcGUoZSl9KSx0aGlzLl9maW5pc2hlZD10LmVuZD09PWUuZ2V0RGF0YSgpLmNvdW50KCl9LGUucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCk7aWYodGhpcy5ncm91cC5kaXJ0eSgpLCF0aGlzLl9maW5pc2hlZHx8aS5jb3VudCgpPjFlNClyZXR1cm57dXBkYXRlOiEwfTt2YXIgcj1YUygiIikucmVzZXQodCxlLG4pO3IucHJvZ3Jlc3MmJnIucHJvZ3Jlc3Moe3N0YXJ0OjAsZW5kOmkuY291bnQoKSxjb3VudDppLmNvdW50KCl9LGkpLHRoaXMuX3N5bWJvbERyYXcudXBkYXRlTGF5b3V0KGkpfSxlLnByb3RvdHlwZS5lYWNoUmVuZGVyZWQ9ZnVuY3Rpb24odCl7dGhpcy5fc3ltYm9sRHJhdyYmdGhpcy5fc3ltYm9sRHJhdy5lYWNoUmVuZGVyZWQodCl9LGUucHJvdG90eXBlLl9nZXRDbGlwU2hhcGU9ZnVuY3Rpb24odCl7aWYodC5nZXQoImNsaXAiLCEwKSl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO3JldHVybiBlJiZlLmdldEFyZWEmJmUuZ2V0QXJlYSguMSl9fSxlLnByb3RvdHlwZS5fdXBkYXRlU3ltYm9sRHJhdz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3N5bWJvbERyYXcsaT1lLnBpcGVsaW5lQ29udGV4dC5sYXJnZTtyZXR1cm4gbiYmaT09PXRoaXMuX2lzTGFyZ2VEcmF3fHwobiYmbi5yZW1vdmUoKSxuPXRoaXMuX3N5bWJvbERyYXc9aT9uZXcgR006bmV3IHhTLHRoaXMuX2lzTGFyZ2VEcmF3PWksdGhpcy5ncm91cC5yZW1vdmVBbGwoKSksdGhpcy5ncm91cC5hZGQobi5ncm91cCksbn0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc3ltYm9sRHJhdyYmdGhpcy5fc3ltYm9sRHJhdy5yZW1vdmUoITApLHRoaXMuX3N5bWJvbERyYXc9bnVsbH0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe30sZS50eXBlPSJzY2F0dGVyIixlfShPZyksSE09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlLnR5cGU9ImdyaWQiLGUuZGVwZW5kZW5jaWVzPVsieEF4aXMiLCJ5QXhpcyJdLGUubGF5b3V0TW9kZT0iYm94IixlLmRlZmF1bHRPcHRpb249e3Nob3c6ITEsejowLGxlZnQ6IjEwJSIsdG9wOjYwLHJpZ2h0OiIxMCUiLGJvdHRvbTo3MCxjb250YWluTGFiZWw6ITEsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiIjY2NjIn0sZX0oenApLFlNPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0Q29vcmRTeXNNb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJlZmVycmluZ0NvbXBvbmVudHMoImdyaWQiLFdvKS5tb2RlbHNbMF19LGUudHlwZT0iY2FydGVzaWFuMmRBeGlzIixlfSh6cCk7UihZTSxEXyk7dmFyIFhNPXtzaG93OiEwLHo6MCxpbnZlcnNlOiExLG5hbWU6IiIsbmFtZUxvY2F0aW9uOiJlbmQiLG5hbWVSb3RhdGU6bnVsbCxuYW1lVHJ1bmNhdGU6e21heFdpZHRoOm51bGwsZWxsaXBzaXM6Ii4uLiIscGxhY2Vob2xkZXI6Ii4ifSxuYW1lVGV4dFN0eWxlOnt9LG5hbWVHYXA6MTUsc2lsZW50OiExLHRyaWdnZXJFdmVudDohMSx0b29sdGlwOntzaG93OiExfSxheGlzUG9pbnRlcjp7fSxheGlzTGluZTp7c2hvdzohMCxvblplcm86ITAsb25aZXJvQXhpc0luZGV4Om51bGwsbGluZVN0eWxlOntjb2xvcjoiIzZFNzA3OSIsd2lkdGg6MSx0eXBlOiJzb2xpZCJ9LHN5bWJvbDpbIm5vbmUiLCJub25lIl0sc3ltYm9sU2l6ZTpbMTAsMTVdfSxheGlzVGljazp7c2hvdzohMCxpbnNpZGU6ITEsbGVuZ3RoOjUsbGluZVN0eWxlOnt3aWR0aDoxfX0sYXhpc0xhYmVsOntzaG93OiEwLGluc2lkZTohMSxyb3RhdGU6MCxzaG93TWluTGFiZWw6bnVsbCxzaG93TWF4TGFiZWw6bnVsbCxtYXJnaW46OCxmb250U2l6ZToxMn0sc3BsaXRMaW5lOntzaG93OiEwLGxpbmVTdHlsZTp7Y29sb3I6WyIjRTBFNkYxIl0sd2lkdGg6MSx0eXBlOiJzb2xpZCJ9fSxzcGxpdEFyZWE6e3Nob3c6ITEsYXJlYVN0eWxlOntjb2xvcjpbInJnYmEoMjUwLDI1MCwyNTAsMC4yKSIsInJnYmEoMjEwLDIxOSwyMzgsMC4yKSJdfX19LFVNPUMoe2JvdW5kYXJ5R2FwOiEwLGRlZHVwbGljYXRpb246bnVsbCxzcGxpdExpbmU6e3Nob3c6ITF9LGF4aXNUaWNrOnthbGlnbldpdGhMYWJlbDohMSxpbnRlcnZhbDoiYXV0byJ9LGF4aXNMYWJlbDp7aW50ZXJ2YWw6ImF1dG8ifX0sWE0pLFpNPUMoe2JvdW5kYXJ5R2FwOlswLDBdLGF4aXNMaW5lOntzaG93OiJhdXRvIn0sYXhpc1RpY2s6e3Nob3c6ImF1dG8ifSxzcGxpdE51bWJlcjo1LG1pbm9yVGljazp7c2hvdzohMSxzcGxpdE51bWJlcjo1LGxlbmd0aDozLGxpbmVTdHlsZTp7fX0sbWlub3JTcGxpdExpbmU6e3Nob3c6ITEsbGluZVN0eWxlOntjb2xvcjoiI0Y0RjdGRCIsd2lkdGg6MX19fSxYTSksak09e2NhdGVnb3J5OlVNLHZhbHVlOlpNLHRpbWU6Qyh7c3BsaXROdW1iZXI6NixheGlzTGFiZWw6e3Nob3dNaW5MYWJlbDohMSxzaG93TWF4TGFiZWw6ITEscmljaDp7cHJpbWFyeTp7Zm9udFdlaWdodDoiYm9sZCJ9fX0sc3BsaXRMaW5lOntzaG93OiExfX0sWk0pLGxvZzprKHtsb2dCYXNlOjEwfSxaTSl9LHFNPXt2YWx1ZToxLGNhdGVnb3J5OjEsdGltZToxLGxvZzoxfTtmdW5jdGlvbiBLTSh0LGUsaSxyKXtFKHFNLChmdW5jdGlvbihvLGEpe3ZhciBzPUMoQyh7fSxqTVthXSwhMCksciwhMCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZSsiQXhpcy4iK2Esbn1yZXR1cm4gbihpLHQpLGkucHJvdG90eXBlLm1lcmdlRGVmYXVsdEFuZFRoZW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG49UHAodGhpcyksaT1uP1JwKHQpOnt9O0ModCxlLmdldFRoZW1lKCkuZ2V0KGErIkF4aXMiKSksQyh0LHRoaXMuZ2V0RGVmYXVsdE9wdGlvbigpKSx0LnR5cGU9JE0odCksbiYmT3AodCxpLG4pfSxpLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKCl7ImNhdGVnb3J5Ij09PXRoaXMub3B0aW9uLnR5cGUmJih0aGlzLl9fb3JkaW5hbE1ldGE9TXguY3JlYXRlQnlBeGlzTW9kZWwodGhpcykpfSxpLnByb3RvdHlwZS5nZXRDYXRlZ29yaWVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uO2lmKCJjYXRlZ29yeSI9PT1lLnR5cGUpcmV0dXJuIHQ/ZS5kYXRhOnRoaXMuX19vcmRpbmFsTWV0YS5jYXRlZ29yaWVzfSxpLnByb3RvdHlwZS5nZXRPcmRpbmFsTWV0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fb3JkaW5hbE1ldGF9LGkudHlwZT1lKyJBeGlzLiIrYSxpLmRlZmF1bHRPcHRpb249cyxpfShpKTt0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwobCl9KSksdC5yZWdpc3RlclN1YlR5cGVEZWZhdWx0ZXIoZSsiQXhpcyIsJE0pfWZ1bmN0aW9uICRNKHQpe3JldHVybiB0LnR5cGV8fCh0LmRhdGE/ImNhdGVnb3J5IjoidmFsdWUiKX12YXIgSk09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMudHlwZT0iY2FydGVzaWFuIix0aGlzLl9kaW1MaXN0PVtdLHRoaXMuX2F4ZXM9e30sdGhpcy5uYW1lPXR8fCIifXJldHVybiB0LnByb3RvdHlwZS5nZXRBeGlzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9heGVzW3RdfSx0LnByb3RvdHlwZS5nZXRBeGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHoodGhpcy5fZGltTGlzdCwoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2F4ZXNbdF19KSx0aGlzKX0sdC5wcm90b3R5cGUuZ2V0QXhlc0J5U2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC50b0xvd2VyQ2FzZSgpLEIodGhpcy5nZXRBeGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNjYWxlLnR5cGU9PT10fSkpfSx0LnByb3RvdHlwZS5hZGRBeGlzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZGltO3RoaXMuX2F4ZXNbZV09dCx0aGlzLl9kaW1MaXN0LnB1c2goZSl9LHR9KCksUU09WyJ4IiwieSJdO2Z1bmN0aW9uIHRJKHQpe3JldHVybiJpbnRlcnZhbCI9PT10LnR5cGV8fCJ0aW1lIj09PXQudHlwZX12YXIgZUk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPSJjYXJ0ZXNpYW4yZCIsZS5kaW1lbnNpb25zPVFNLGV9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5jYWxjQWZmaW5lVHJhbnNmb3JtPWZ1bmN0aW9uKCl7dGhpcy5fdHJhbnNmb3JtPXRoaXMuX2ludlRyYW5zZm9ybT1udWxsO3ZhciB0PXRoaXMuZ2V0QXhpcygieCIpLnNjYWxlLGU9dGhpcy5nZXRBeGlzKCJ5Iikuc2NhbGU7aWYodEkodCkmJnRJKGUpKXt2YXIgbj10LmdldEV4dGVudCgpLGk9ZS5nZXRFeHRlbnQoKSxyPXRoaXMuZGF0YVRvUG9pbnQoW25bMF0saVswXV0pLG89dGhpcy5kYXRhVG9Qb2ludChbblsxXSxpWzFdXSksYT1uWzFdLW5bMF0scz1pWzFdLWlbMF07aWYoYSYmcyl7dmFyIGw9KG9bMF0tclswXSkvYSx1PShvWzFdLXJbMV0pL3MsaD1yWzBdLW5bMF0qbCxjPXJbMV0taVswXSp1LHA9dGhpcy5fdHJhbnNmb3JtPVtsLDAsMCx1LGgsY107dGhpcy5faW52VHJhbnNmb3JtPUllKFtdLHApfX19LGUucHJvdG90eXBlLmdldEJhc2VBeGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QXhlc0J5U2NhbGUoIm9yZGluYWwiKVswXXx8dGhpcy5nZXRBeGVzQnlTY2FsZSgidGltZSIpWzBdfHx0aGlzLmdldEF4aXMoIngiKX0sZS5wcm90b3R5cGUuY29udGFpblBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0QXhpcygieCIpLG49dGhpcy5nZXRBeGlzKCJ5Iik7cmV0dXJuIGUuY29udGFpbihlLnRvTG9jYWxDb29yZCh0WzBdKSkmJm4uY29udGFpbihuLnRvTG9jYWxDb29yZCh0WzFdKSl9LGUucHJvdG90eXBlLmNvbnRhaW5EYXRhPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldEF4aXMoIngiKS5jb250YWluRGF0YSh0WzBdKSYmdGhpcy5nZXRBeGlzKCJ5IikuY29udGFpbkRhdGEodFsxXSl9LGUucHJvdG90eXBlLmNvbnRhaW5ab25lPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5kYXRhVG9Qb2ludCh0KSxpPXRoaXMuZGF0YVRvUG9pbnQoZSkscj10aGlzLmdldEFyZWEoKSxvPW5ldyB6ZShuWzBdLG5bMV0saVswXS1uWzBdLGlbMV0tblsxXSk7cmV0dXJuIHIuaW50ZXJzZWN0KG8pfSxlLnByb3RvdHlwZS5kYXRhVG9Qb2ludD1mdW5jdGlvbih0LGUsbil7bj1ufHxbXTt2YXIgaT10WzBdLHI9dFsxXTtpZih0aGlzLl90cmFuc2Zvcm0mJm51bGwhPWkmJmlzRmluaXRlKGkpJiZudWxsIT1yJiZpc0Zpbml0ZShyKSlyZXR1cm4gV3Qobix0LHRoaXMuX3RyYW5zZm9ybSk7dmFyIG89dGhpcy5nZXRBeGlzKCJ4IiksYT10aGlzLmdldEF4aXMoInkiKTtyZXR1cm4gblswXT1vLnRvR2xvYmFsQ29vcmQoby5kYXRhVG9Db29yZChpLGUpKSxuWzFdPWEudG9HbG9iYWxDb29yZChhLmRhdGFUb0Nvb3JkKHIsZSkpLG59LGUucHJvdG90eXBlLmNsYW1wRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0QXhpcygieCIpLnNjYWxlLGk9dGhpcy5nZXRBeGlzKCJ5Iikuc2NhbGUscj1uLmdldEV4dGVudCgpLG89aS5nZXRFeHRlbnQoKSxhPW4ucGFyc2UodFswXSkscz1pLnBhcnNlKHRbMV0pO3JldHVybihlPWV8fFtdKVswXT1NYXRoLm1pbihNYXRoLm1heChNYXRoLm1pbihyWzBdLHJbMV0pLGEpLE1hdGgubWF4KHJbMF0sclsxXSkpLGVbMV09TWF0aC5taW4oTWF0aC5tYXgoTWF0aC5taW4ob1swXSxvWzFdKSxzKSxNYXRoLm1heChvWzBdLG9bMV0pKSxlfSxlLnByb3RvdHlwZS5wb2ludFRvRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO2lmKHRoaXMuX2ludlRyYW5zZm9ybSlyZXR1cm4gV3Qobix0LHRoaXMuX2ludlRyYW5zZm9ybSk7dmFyIGk9dGhpcy5nZXRBeGlzKCJ4Iikscj10aGlzLmdldEF4aXMoInkiKTtyZXR1cm4gblswXT1pLmNvb3JkVG9EYXRhKGkudG9Mb2NhbENvb3JkKHRbMF0pLGUpLG5bMV09ci5jb29yZFRvRGF0YShyLnRvTG9jYWxDb29yZCh0WzFdKSxlKSxufSxlLnByb3RvdHlwZS5nZXRPdGhlckF4aXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0QXhpcygieCI9PT10LmRpbT8ieSI6IngiKX0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbih0KXt0PXR8fDA7dmFyIGU9dGhpcy5nZXRBeGlzKCJ4IikuZ2V0R2xvYmFsRXh0ZW50KCksbj10aGlzLmdldEF4aXMoInkiKS5nZXRHbG9iYWxFeHRlbnQoKSxpPU1hdGgubWluKGVbMF0sZVsxXSktdCxyPU1hdGgubWluKG5bMF0sblsxXSktdCxvPU1hdGgubWF4KGVbMF0sZVsxXSktaSt0LGE9TWF0aC5tYXgoblswXSxuWzFdKS1yK3Q7cmV0dXJuIG5ldyB6ZShpLHIsbyxhKX0sZX0oSk0pLG5JPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLGkscixvKXt2YXIgYT10LmNhbGwodGhpcyxlLG4saSl8fHRoaXM7cmV0dXJuIGEuaW5kZXg9MCxhLnR5cGU9cnx8InZhbHVlIixhLnBvc2l0aW9uPW98fCJib3R0b20iLGF9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBvc2l0aW9uO3JldHVybiJ0b3AiPT09dHx8ImJvdHRvbSI9PT10fSxlLnByb3RvdHlwZS5nZXRHbG9iYWxFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRFeHRlbnQoKTtyZXR1cm4gZVswXT10aGlzLnRvR2xvYmFsQ29vcmQoZVswXSksZVsxXT10aGlzLnRvR2xvYmFsQ29vcmQoZVsxXSksdCYmZVswXT5lWzFdJiZlLnJldmVyc2UoKSxlfSxlLnByb3RvdHlwZS5wb2ludFRvRGF0YT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvb3JkVG9EYXRhKHRoaXMudG9Mb2NhbENvb3JkKHRbIngiPT09dGhpcy5kaW0/MDoxXSksZSl9LGUucHJvdG90eXBlLnNldENhdGVnb3J5U29ydEluZm89ZnVuY3Rpb24odCl7aWYoImNhdGVnb3J5IiE9PXRoaXMudHlwZSlyZXR1cm4hMTt0aGlzLm1vZGVsLm9wdGlvbi5jYXRlZ29yeVNvcnRJbmZvPXQsdGhpcy5zY2FsZS5zZXRTb3J0SW5mbyh0KX0sZX0oYWIpO2Z1bmN0aW9uIGlJKHQsZSxuKXtuPW58fHt9O3ZhciBpPXQuY29vcmRpbmF0ZVN5c3RlbSxyPWUuYXhpcyxvPXt9LGE9ci5nZXRBeGVzT25aZXJvT2YoKVswXSxzPXIucG9zaXRpb24sbD1hPyJvblplcm8iOnMsdT1yLmRpbSxoPWkuZ2V0UmVjdCgpLGM9W2gueCxoLngraC53aWR0aCxoLnksaC55K2guaGVpZ2h0XSxwPXtsZWZ0OjAscmlnaHQ6MSx0b3A6MCxib3R0b206MSxvblplcm86Mn0sZD1lLmdldCgib2Zmc2V0Iil8fDAsZj0ieCI9PT11P1tjWzJdLWQsY1szXStkXTpbY1swXS1kLGNbMV0rZF07aWYoYSl7dmFyIGc9YS50b0dsb2JhbENvb3JkKGEuZGF0YVRvQ29vcmQoMCkpO2ZbcC5vblplcm9dPU1hdGgubWF4KE1hdGgubWluKGcsZlsxXSksZlswXSl9by5wb3NpdGlvbj1bInkiPT09dT9mW3BbbF1dOmNbMF0sIngiPT09dT9mW3BbbF1dOmNbM11dLG8ucm90YXRpb249TWF0aC5QSS8yKigieCI9PT11PzA6MSk7by5sYWJlbERpcmVjdGlvbj1vLnRpY2tEaXJlY3Rpb249by5uYW1lRGlyZWN0aW9uPXt0b3A6LTEsYm90dG9tOjEsbGVmdDotMSxyaWdodDoxfVtzXSxvLmxhYmVsT2Zmc2V0PWE/ZltwW3NdXS1mW3Aub25aZXJvXTowLGUuZ2V0KFsiYXhpc1RpY2siLCJpbnNpZGUiXSkmJihvLnRpY2tEaXJlY3Rpb249LW8udGlja0RpcmVjdGlvbiksaXQobi5sYWJlbEluc2lkZSxlLmdldChbImF4aXNMYWJlbCIsImluc2lkZSJdKSkmJihvLmxhYmVsRGlyZWN0aW9uPS1vLmxhYmVsRGlyZWN0aW9uKTt2YXIgeT1lLmdldChbImF4aXNMYWJlbCIsInJvdGF0ZSJdKTtyZXR1cm4gby5sYWJlbFJvdGF0ZT0idG9wIj09PWw/LXk6eSxvLnoyPTEsb31mdW5jdGlvbiBySSh0KXtyZXR1cm4iY2FydGVzaWFuMmQiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKX1mdW5jdGlvbiBvSSh0KXt2YXIgZT17eEF4aXNNb2RlbDpudWxsLHlBeGlzTW9kZWw6bnVsbH07cmV0dXJuIEUoZSwoZnVuY3Rpb24obixpKXt2YXIgcj1pLnJlcGxhY2UoL01vZGVsJC8sIiIpLG89dC5nZXRSZWZlcnJpbmdDb21wb25lbnRzKHIsV28pLm1vZGVsc1swXTtlW2ldPW99KSksZX12YXIgYUk9TWF0aC5sb2c7ZnVuY3Rpb24gc0kodCxlLG4pe3ZhciBpPUV4LnByb3RvdHlwZSxyPWkuZ2V0VGlja3MuY2FsbChuKSxvPWkuZ2V0VGlja3MuY2FsbChuLCEwKSxhPXIubGVuZ3RoLTEscz1pLmdldEludGVydmFsLmNhbGwobiksbD14Xyh0LGUpLHU9bC5leHRlbnQsaD1sLmZpeE1pbixjPWwuZml4TWF4O2lmKCJsb2ciPT09dC50eXBlKXt2YXIgcD1hSSh0LmJhc2UpO3U9W2FJKHVbMF0pL3AsYUkodVsxXSkvcF19dC5zZXRFeHRlbnQodVswXSx1WzFdKSx0LmNhbGNOaWNlRXh0ZW50KHtzcGxpdE51bWJlcjphLGZpeE1pbjpoLGZpeE1heDpjfSk7dmFyIGQ9aS5nZXRFeHRlbnQuY2FsbCh0KTtoJiYodVswXT1kWzBdKSxjJiYodVsxXT1kWzFdKTt2YXIgZj1pLmdldEludGVydmFsLmNhbGwodCksZz11WzBdLHk9dVsxXTtpZihoJiZjKWY9KHktZykvYTtlbHNlIGlmKGgpZm9yKHk9dVswXStmKmE7eTx1WzFdJiZpc0Zpbml0ZSh5KSYmaXNGaW5pdGUodVsxXSk7KWY9RHgoZikseT11WzBdK2YqYTtlbHNlIGlmKGMpZm9yKGc9dVsxXS1mKmE7Zz51WzBdJiZpc0Zpbml0ZShnKSYmaXNGaW5pdGUodVswXSk7KWY9RHgoZiksZz11WzFdLWYqYTtlbHNle3QuZ2V0VGlja3MoKS5sZW5ndGgtMT5hJiYoZj1EeChmKSk7dmFyIHY9ZiphOyhnPUpyKCh5PU1hdGguY2VpbCh1WzFdL2YpKmYpLXYpKTwwJiZ1WzBdPj0wPyhnPTAseT1Kcih2KSk6eT4wJiZ1WzFdPD0wJiYoeT0wLGc9LUpyKHYpKX12YXIgbT0oclswXS52YWx1ZS1vWzBdLnZhbHVlKS9zLHg9KHJbYV0udmFsdWUtb1thXS52YWx1ZSkvcztpLnNldEV4dGVudC5jYWxsKHQsZytmKm0seStmKngpLGkuc2V0SW50ZXJ2YWwuY2FsbCh0LGYpLChtfHx4KSYmaS5zZXROaWNlRXh0ZW50LmNhbGwodCxnK2YseS1mKX12YXIgbEk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLnR5cGU9ImdyaWQiLHRoaXMuX2Nvb3Jkc01hcD17fSx0aGlzLl9jb29yZHNMaXN0PVtdLHRoaXMuX2F4ZXNNYXA9e30sdGhpcy5fYXhlc0xpc3Q9W10sdGhpcy5heGlzUG9pbnRlckVuYWJsZWQ9ITAsdGhpcy5kaW1lbnNpb25zPVFNLHRoaXMuX2luaXRDYXJ0ZXNpYW4odCxlLG4pLHRoaXMubW9kZWw9dH1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0UmVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWN0fSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9heGVzTWFwO2Z1bmN0aW9uIGkodCl7dmFyIGUsbj1HKHQpLGk9bi5sZW5ndGg7aWYoaSl7Zm9yKHZhciByPVtdLG89aS0xO28+PTA7by0tKXt2YXIgYT10WytuW29dXSxzPWEubW9kZWwsbD1hLnNjYWxlO1R4KGwpJiZzLmdldCgiYWxpZ25UaWNrcyIpJiZudWxsPT1zLmdldCgiaW50ZXJ2YWwiKT9yLnB1c2goYSk6KF9fKGwscyksVHgobCkmJihlPWEpKX1yLmxlbmd0aCYmKGV8fF9fKChlPXIucG9wKCkpLnNjYWxlLGUubW9kZWwpLEUociwoZnVuY3Rpb24odCl7c0kodC5zY2FsZSx0Lm1vZGVsLGUuc2NhbGUpfSkpKX19dGhpcy5fdXBkYXRlU2NhbGUodCx0aGlzLm1vZGVsKSxpKG4ueCksaShuLnkpO3ZhciByPXt9O0Uobi54LChmdW5jdGlvbih0KXtoSShuLCJ5Iix0LHIpfSkpLEUobi55LChmdW5jdGlvbih0KXtoSShuLCJ4Iix0LHIpfSkpLHRoaXMucmVzaXplKHRoaXMubW9kZWwsZSl9LHQucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXRCb3hMYXlvdXRQYXJhbXMoKSxyPSFuJiZ0LmdldCgiY29udGFpbkxhYmVsIiksbz1rcChpLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KTt0aGlzLl9yZWN0PW87dmFyIGE9dGhpcy5fYXhlc0xpc3Q7ZnVuY3Rpb24gcygpe0UoYSwoZnVuY3Rpb24odCl7dmFyIGU9dC5pc0hvcml6b250YWwoKSxuPWU/WzAsby53aWR0aF06WzAsby5oZWlnaHRdLGk9dC5pbnZlcnNlPzE6MDt0LnNldEV4dGVudChuW2ldLG5bMS1pXSksZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEV4dGVudCgpLGk9blswXStuWzFdO3QudG9HbG9iYWxDb29yZD0ieCI9PT10LmRpbT9mdW5jdGlvbih0KXtyZXR1cm4gdCtlfTpmdW5jdGlvbih0KXtyZXR1cm4gaS10K2V9LHQudG9Mb2NhbENvb3JkPSJ4Ij09PXQuZGltP2Z1bmN0aW9uKHQpe3JldHVybiB0LWV9OmZ1bmN0aW9uKHQpe3JldHVybiBpLXQrZX19KHQsZT9vLng6by55KX0pKX1zKCksciYmKEUoYSwoZnVuY3Rpb24odCl7aWYoIXQubW9kZWwuZ2V0KFsiYXhpc0xhYmVsIiwiaW5zaWRlIl0pKXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10Lm1vZGVsLG49dC5zY2FsZTtpZihlLmdldChbImF4aXNMYWJlbCIsInNob3ciXSkmJiFuLmlzQmxhbmsoKSl7dmFyIGkscixvPW4uZ2V0RXh0ZW50KCk7cj1uIGluc3RhbmNlb2YgUng/bi5jb3VudCgpOihpPW4uZ2V0VGlja3MoKSkubGVuZ3RoO3ZhciBhLHM9dC5nZXRMYWJlbE1vZGVsKCksbD13Xyh0KSx1PTE7cj40MCYmKHU9TWF0aC5jZWlsKHIvNDApKTtmb3IodmFyIGg9MDtoPHI7aCs9dSl7dmFyIGM9bChpP2lbaF06e3ZhbHVlOm9bMF0raH0saCkscD1NXyhzLmdldFRleHRSZWN0KGMpLHMuZ2V0KCJyb3RhdGUiKXx8MCk7YT9hLnVuaW9uKHApOmE9cH1yZXR1cm4gYX19KHQpO2lmKGUpe3ZhciBuPXQuaXNIb3Jpem9udGFsKCk/ImhlaWdodCI6IndpZHRoIixpPXQubW9kZWwuZ2V0KFsiYXhpc0xhYmVsIiwibWFyZ2luIl0pO29bbl0tPWVbbl0raSwidG9wIj09PXQucG9zaXRpb24/by55Kz1lLmhlaWdodCtpOiJsZWZ0Ij09PXQucG9zaXRpb24mJihvLngrPWUud2lkdGgraSl9fX0pKSxzKCkpLEUodGhpcy5fY29vcmRzTGlzdCwoZnVuY3Rpb24odCl7dC5jYWxjQWZmaW5lVHJhbnNmb3JtKCl9KSl9LHQucHJvdG90eXBlLmdldEF4aXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9heGVzTWFwW3RdO2lmKG51bGwhPW4pcmV0dXJuIG5bZXx8MF19LHQucHJvdG90eXBlLmdldEF4ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXhlc0xpc3Quc2xpY2UoKX0sdC5wcm90b3R5cGUuZ2V0Q2FydGVzaWFuPWZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dCYmbnVsbCE9ZSl7dmFyIG49IngiK3QrInkiK2U7cmV0dXJuIHRoaXMuX2Nvb3Jkc01hcFtuXX1xKHQpJiYoZT10LnlBeGlzSW5kZXgsdD10LnhBeGlzSW5kZXgpO2Zvcih2YXIgaT0wLHI9dGhpcy5fY29vcmRzTGlzdDtpPHIubGVuZ3RoO2krKylpZihyW2ldLmdldEF4aXMoIngiKS5pbmRleD09PXR8fHJbaV0uZ2V0QXhpcygieSIpLmluZGV4PT09ZSlyZXR1cm4gcltpXX0sdC5wcm90b3R5cGUuZ2V0Q2FydGVzaWFucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZHNMaXN0LnNsaWNlKCl9LHQucHJvdG90eXBlLmNvbnZlcnRUb1BpeGVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9maW5kQ29udmVydFRhcmdldChlKTtyZXR1cm4gaS5jYXJ0ZXNpYW4/aS5jYXJ0ZXNpYW4uZGF0YVRvUG9pbnQobik6aS5heGlzP2kuYXhpcy50b0dsb2JhbENvb3JkKGkuYXhpcy5kYXRhVG9Db29yZChuKSk6bnVsbH0sdC5wcm90b3R5cGUuY29udmVydEZyb21QaXhlbD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fZmluZENvbnZlcnRUYXJnZXQoZSk7cmV0dXJuIGkuY2FydGVzaWFuP2kuY2FydGVzaWFuLnBvaW50VG9EYXRhKG4pOmkuYXhpcz9pLmF4aXMuY29vcmRUb0RhdGEoaS5heGlzLnRvTG9jYWxDb29yZChuKSk6bnVsbH0sdC5wcm90b3R5cGUuX2ZpbmRDb252ZXJ0VGFyZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlLG4saT10LnNlcmllc01vZGVsLHI9dC54QXhpc01vZGVsfHxpJiZpLmdldFJlZmVycmluZ0NvbXBvbmVudHMoInhBeGlzIixXbykubW9kZWxzWzBdLG89dC55QXhpc01vZGVsfHxpJiZpLmdldFJlZmVycmluZ0NvbXBvbmVudHMoInlBeGlzIixXbykubW9kZWxzWzBdLGE9dC5ncmlkTW9kZWwscz10aGlzLl9jb29yZHNMaXN0O2lmKGkpUChzLGU9aS5jb29yZGluYXRlU3lzdGVtKTwwJiYoZT1udWxsKTtlbHNlIGlmKHImJm8pZT10aGlzLmdldENhcnRlc2lhbihyLmNvbXBvbmVudEluZGV4LG8uY29tcG9uZW50SW5kZXgpO2Vsc2UgaWYociluPXRoaXMuZ2V0QXhpcygieCIsci5jb21wb25lbnRJbmRleCk7ZWxzZSBpZihvKW49dGhpcy5nZXRBeGlzKCJ5IixvLmNvbXBvbmVudEluZGV4KTtlbHNlIGlmKGEpe2EuY29vcmRpbmF0ZVN5c3RlbT09PXRoaXMmJihlPXRoaXMuX2Nvb3Jkc0xpc3RbMF0pfXJldHVybntjYXJ0ZXNpYW46ZSxheGlzOm59fSx0LnByb3RvdHlwZS5jb250YWluUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29vcmRzTGlzdFswXTtpZihlKXJldHVybiBlLmNvbnRhaW5Qb2ludCh0KX0sdC5wcm90b3R5cGUuX2luaXRDYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMscj10aGlzLG89e2xlZnQ6ITEscmlnaHQ6ITEsdG9wOiExLGJvdHRvbTohMX0sYT17eDp7fSx5Ont9fSxzPXt4OjAseTowfTtpZihlLmVhY2hDb21wb25lbnQoInhBeGlzIixsKCJ4IiksdGhpcyksZS5lYWNoQ29tcG9uZW50KCJ5QXhpcyIsbCgieSIpLHRoaXMpLCFzLnh8fCFzLnkpcmV0dXJuIHRoaXMuX2F4ZXNNYXA9e30sdm9pZCh0aGlzLl9heGVzTGlzdD1bXSk7ZnVuY3Rpb24gbChlKXtyZXR1cm4gZnVuY3Rpb24obixpKXtpZih1SShuLHQpKXt2YXIgbD1uLmdldCgicG9zaXRpb24iKTsieCI9PT1lPyJ0b3AiIT09bCYmImJvdHRvbSIhPT1sJiYobD1vLmJvdHRvbT8idG9wIjoiYm90dG9tIik6ImxlZnQiIT09bCYmInJpZ2h0IiE9PWwmJihsPW8ubGVmdD8icmlnaHQiOiJsZWZ0Iiksb1tsXT0hMDt2YXIgdT1uZXcgbkkoZSxiXyhuKSxbMCwwXSxuLmdldCgidHlwZSIpLGwpLGg9ImNhdGVnb3J5Ij09PXUudHlwZTt1Lm9uQmFuZD1oJiZuLmdldCgiYm91bmRhcnlHYXAiKSx1LmludmVyc2U9bi5nZXQoImludmVyc2UiKSxuLmF4aXM9dSx1Lm1vZGVsPW4sdS5ncmlkPXIsdS5pbmRleD1pLHIuX2F4ZXNMaXN0LnB1c2godSksYVtlXVtpXT11LHNbZV0rK319fXRoaXMuX2F4ZXNNYXA9YSxFKGEueCwoZnVuY3Rpb24oZSxuKXtFKGEueSwoZnVuY3Rpb24ocixvKXt2YXIgYT0ieCIrbisieSIrbyxzPW5ldyBlSShhKTtzLm1hc3Rlcj1pLHMubW9kZWw9dCxpLl9jb29yZHNNYXBbYV09cyxpLl9jb29yZHNMaXN0LnB1c2gocykscy5hZGRBeGlzKGUpLHMuYWRkQXhpcyhyKX0pKX0pKX0sdC5wcm90b3R5cGUuX3VwZGF0ZVNjYWxlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0LGUpe0UoQ18odCxlLmRpbSksKGZ1bmN0aW9uKG4pe2Uuc2NhbGUudW5pb25FeHRlbnRGcm9tRGF0YSh0LG4pfSkpfUUodGhpcy5fYXhlc0xpc3QsKGZ1bmN0aW9uKHQpe2lmKHQuc2NhbGUuc2V0RXh0ZW50KDEvMCwtMS8wKSwiY2F0ZWdvcnkiPT09dC50eXBlKXt2YXIgZT10Lm1vZGVsLmdldCgiY2F0ZWdvcnlTb3J0SW5mbyIpO3Quc2NhbGUuc2V0U29ydEluZm8oZSl9fSkpLHQuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7aWYockkodCkpe3ZhciBpPW9JKHQpLHI9aS54QXhpc01vZGVsLG89aS55QXhpc01vZGVsO2lmKCF1SShyLGUpfHwhdUkobyxlKSlyZXR1cm47dmFyIGE9dGhpcy5nZXRDYXJ0ZXNpYW4oci5jb21wb25lbnRJbmRleCxvLmNvbXBvbmVudEluZGV4KSxzPXQuZ2V0RGF0YSgpLGw9YS5nZXRBeGlzKCJ4IiksdT1hLmdldEF4aXMoInkiKTtuKHMsbCksbihzLHUpfX0pLHRoaXMpfSx0LnByb3RvdHlwZS5nZXRUb29sdGlwQXhlcz1mdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdO3JldHVybiBFKHRoaXMuZ2V0Q2FydGVzaWFucygpLChmdW5jdGlvbihpKXt2YXIgcj1udWxsIT10JiYiYXV0byIhPT10P2kuZ2V0QXhpcyh0KTppLmdldEJhc2VBeGlzKCksbz1pLmdldE90aGVyQXhpcyhyKTtQKGUscik8MCYmZS5wdXNoKHIpLFAobixvKTwwJiZuLnB1c2gobyl9KSkse2Jhc2VBeGVzOmUsb3RoZXJBeGVzOm59fSx0LmNyZWF0ZT1mdW5jdGlvbihlLG4pe3ZhciBpPVtdO3JldHVybiBlLmVhY2hDb21wb25lbnQoImdyaWQiLChmdW5jdGlvbihyLG8pe3ZhciBhPW5ldyB0KHIsZSxuKTthLm5hbWU9ImdyaWRfIitvLGEucmVzaXplKHIsbiwhMCksci5jb29yZGluYXRlU3lzdGVtPWEsaS5wdXNoKGEpfSkpLGUuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7aWYockkodCkpe3ZhciBlPW9JKHQpLG49ZS54QXhpc01vZGVsLGk9ZS55QXhpc01vZGVsLHI9bi5nZXRDb29yZFN5c01vZGVsKCk7MDt2YXIgbz1yLmNvb3JkaW5hdGVTeXN0ZW07dC5jb29yZGluYXRlU3lzdGVtPW8uZ2V0Q2FydGVzaWFuKG4uY29tcG9uZW50SW5kZXgsaS5jb21wb25lbnRJbmRleCl9fSkpLGl9LHQuZGltZW5zaW9ucz1RTSx0fSgpO2Z1bmN0aW9uIHVJKHQsZSl7cmV0dXJuIHQuZ2V0Q29vcmRTeXNNb2RlbCgpPT09ZX1mdW5jdGlvbiBoSSh0LGUsbixpKXtuLmdldEF4ZXNPblplcm9PZj1mdW5jdGlvbigpe3JldHVybiByP1tyXTpbXX07dmFyIHIsbz10W2VdLGE9bi5tb2RlbCxzPWEuZ2V0KFsiYXhpc0xpbmUiLCJvblplcm8iXSksbD1hLmdldChbImF4aXNMaW5lIiwib25aZXJvQXhpc0luZGV4Il0pO2lmKHMpe2lmKG51bGwhPWwpY0kob1tsXSkmJihyPW9bbF0pO2Vsc2UgZm9yKHZhciB1IGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eSh1KSYmY0kob1t1XSkmJiFpW2gob1t1XSldKXtyPW9bdV07YnJlYWt9ciYmKGlbaChyKV09ITApfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQuZGltKyJfIit0LmluZGV4fX1mdW5jdGlvbiBjSSh0KXtyZXR1cm4gdCYmImNhdGVnb3J5IiE9PXQudHlwZSYmInRpbWUiIT09dC50eXBlJiZmdW5jdGlvbih0KXt2YXIgZT10LnNjYWxlLmdldEV4dGVudCgpLG49ZVswXSxpPWVbMV07cmV0dXJuIShuPjAmJmk+MHx8bjwwJiZpPDApfSh0KX12YXIgcEk9TWF0aC5QSSxkST1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLmdyb3VwPW5ldyBCcix0aGlzLm9wdD1lLHRoaXMuYXhpc01vZGVsPXQsayhlLHtsYWJlbE9mZnNldDowLG5hbWVEaXJlY3Rpb246MSx0aWNrRGlyZWN0aW9uOjEsbGFiZWxEaXJlY3Rpb246MSxzaWxlbnQ6ITAsaGFuZGxlQXV0b1Nob3duOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSk7dmFyIG49bmV3IEJyKHt4OmUucG9zaXRpb25bMF0seTplLnBvc2l0aW9uWzFdLHJvdGF0aW9uOmUucm90YXRpb259KTtuLnVwZGF0ZVRyYW5zZm9ybSgpLHRoaXMuX3RyYW5zZm9ybUdyb3VwPW59cmV0dXJuIHQucHJvdG90eXBlLmhhc0J1aWxkZXI9ZnVuY3Rpb24odCl7cmV0dXJuISFmSVt0XX0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2ZJW3RdKHRoaXMub3B0LHRoaXMuYXhpc01vZGVsLHRoaXMuZ3JvdXAsdGhpcy5fdHJhbnNmb3JtR3JvdXApfSx0LnByb3RvdHlwZS5nZXRHcm91cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdyb3VwfSx0LmlubmVyVGV4dExheW91dD1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvPWFvKGUtdCk7cmV0dXJuIHNvKG8pPyhyPW4+MD8idG9wIjoiYm90dG9tIixpPSJjZW50ZXIiKTpzbyhvLXBJKT8ocj1uPjA/ImJvdHRvbSI6InRvcCIsaT0iY2VudGVyIik6KHI9Im1pZGRsZSIsaT1vPjAmJm88cEk/bj4wPyJyaWdodCI6ImxlZnQiOm4+MD8ibGVmdCI6InJpZ2h0Iikse3JvdGF0aW9uOm8sdGV4dEFsaWduOmksdGV4dFZlcnRpY2FsQWxpZ246cn19LHQubWFrZUF4aXNFdmVudERhdGFCYXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXtjb21wb25lbnRUeXBlOnQubWFpblR5cGUsY29tcG9uZW50SW5kZXg6dC5jb21wb25lbnRJbmRleH07cmV0dXJuIGVbdC5tYWluVHlwZSsiSW5kZXgiXT10LmNvbXBvbmVudEluZGV4LGV9LHQuaXNMYWJlbFNpbGVudD1mdW5jdGlvbih0KXt2YXIgZT10LmdldCgidG9vbHRpcCIpO3JldHVybiB0LmdldCgic2lsZW50Iil8fCEodC5nZXQoInRyaWdnZXJFdmVudCIpfHxlJiZlLnNob3cpfSx0fSgpLGZJPXtheGlzTGluZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgcj1lLmdldChbImF4aXNMaW5lIiwic2hvdyJdKTtpZigiYXV0byI9PT1yJiZ0LmhhbmRsZUF1dG9TaG93biYmKHI9dC5oYW5kbGVBdXRvU2hvd24oImF4aXNMaW5lIikpLHIpe3ZhciBvPWUuYXhpcy5nZXRFeHRlbnQoKSxhPWkudHJhbnNmb3JtLHM9W29bMF0sMF0sbD1bb1sxXSwwXSx1PXNbMF0+bFswXTthJiYoV3QocyxzLGEpLFd0KGwsbCxhKSk7dmFyIGg9QSh7bGluZUNhcDoicm91bmQifSxlLmdldE1vZGVsKFsiYXhpc0xpbmUiLCJsaW5lU3R5bGUiXSkuZ2V0TGluZVN0eWxlKCkpLGM9bmV3IEt1KHtzaGFwZTp7eDE6c1swXSx5MTpzWzFdLHgyOmxbMF0seTI6bFsxXX0sc3R5bGU6aCxzdHJva2VDb250YWluVGhyZXNob2xkOnQuc3Ryb2tlQ29udGFpblRocmVzaG9sZHx8NSxzaWxlbnQ6ITAsejI6MX0pO3poKGMuc2hhcGUsYy5zdHlsZS5saW5lV2lkdGgpLGMuYW5pZD0ibGluZSIsbi5hZGQoYyk7dmFyIHA9ZS5nZXQoWyJheGlzTGluZSIsInN5bWJvbCJdKTtpZihudWxsIT1wKXt2YXIgZD1lLmdldChbImF4aXNMaW5lIiwic3ltYm9sU2l6ZSJdKTtVKHApJiYocD1bcCxwXSksKFUoZCl8fGooZCkpJiYoZD1bZCxkXSk7dmFyIGY9WnkoZS5nZXQoWyJheGlzTGluZSIsInN5bWJvbE9mZnNldCJdKXx8MCxkKSxnPWRbMF0seT1kWzFdO0UoW3tyb3RhdGU6dC5yb3RhdGlvbitNYXRoLlBJLzIsb2Zmc2V0OmZbMF0scjowfSx7cm90YXRlOnQucm90YXRpb24tTWF0aC5QSS8yLG9mZnNldDpmWzFdLHI6TWF0aC5zcXJ0KChzWzBdLWxbMF0pKihzWzBdLWxbMF0pKyhzWzFdLWxbMV0pKihzWzFdLWxbMV0pKX1dLChmdW5jdGlvbihlLGkpe2lmKCJub25lIiE9PXBbaV0mJm51bGwhPXBbaV0pe3ZhciByPVh5KHBbaV0sLWcvMiwteS8yLGcseSxoLnN0cm9rZSwhMCksbz1lLnIrZS5vZmZzZXQsYT11P2w6cztyLmF0dHIoe3JvdGF0aW9uOmUucm90YXRlLHg6YVswXStvKk1hdGguY29zKHQucm90YXRpb24pLHk6YVsxXS1vKk1hdGguc2luKHQucm90YXRpb24pLHNpbGVudDohMCx6MjoxMX0pLG4uYWRkKHIpfX0pKX19fSxheGlzVGlja0xhYmVsOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uYXhpcyxvPW4uZ2V0TW9kZWwoImF4aXNUaWNrIiksYT1vLmdldCgic2hvdyIpOyJhdXRvIj09PWEmJmkuaGFuZGxlQXV0b1Nob3duJiYoYT1pLmhhbmRsZUF1dG9TaG93bigiYXhpc1RpY2siKSk7aWYoIWF8fHIuc2NhbGUuaXNCbGFuaygpKXJldHVybjtmb3IodmFyIHM9by5nZXRNb2RlbCgibGluZVN0eWxlIiksbD1pLnRpY2tEaXJlY3Rpb24qby5nZXQoImxlbmd0aCIpLHU9bUkoci5nZXRUaWNrc0Nvb3JkcygpLGUudHJhbnNmb3JtLGwsayhzLmdldExpbmVTdHlsZSgpLHtzdHJva2U6bi5nZXQoWyJheGlzTGluZSIsImxpbmVTdHlsZSIsImNvbG9yIl0pfSksInRpY2tzIiksaD0wO2g8dS5sZW5ndGg7aCsrKXQuYWRkKHVbaF0pO3JldHVybiB1fShuLGksZSx0KSxvPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uYXhpcyxvPWl0KGkuYXhpc0xhYmVsU2hvdyxuLmdldChbImF4aXNMYWJlbCIsInNob3ciXSkpO2lmKCFvfHxyLnNjYWxlLmlzQmxhbmsoKSlyZXR1cm47dmFyIGE9bi5nZXRNb2RlbCgiYXhpc0xhYmVsIikscz1hLmdldCgibWFyZ2luIiksbD1yLmdldFZpZXdMYWJlbHMoKSx1PShpdChpLmxhYmVsUm90YXRlLGEuZ2V0KCJyb3RhdGUiKSl8fDApKnBJLzE4MCxoPWRJLmlubmVyVGV4dExheW91dChpLnJvdGF0aW9uLHUsaS5sYWJlbERpcmVjdGlvbiksYz1uLmdldENhdGVnb3JpZXMmJm4uZ2V0Q2F0ZWdvcmllcyghMCkscD1bXSxkPWRJLmlzTGFiZWxTaWxlbnQobiksZj1uLmdldCgidHJpZ2dlckV2ZW50Iik7cmV0dXJuIEUobCwoZnVuY3Rpb24obyx1KXt2YXIgZz0ib3JkaW5hbCI9PT1yLnNjYWxlLnR5cGU/ci5zY2FsZS5nZXRSYXdPcmRpbmFsTnVtYmVyKG8udGlja1ZhbHVlKTpvLnRpY2tWYWx1ZSx5PW8uZm9ybWF0dGVkTGFiZWwsdj1vLnJhd0xhYmVsLG09YTtpZihjJiZjW2ddKXt2YXIgeD1jW2ddO3EoeCkmJngudGV4dFN0eWxlJiYobT1uZXcgQ2MoeC50ZXh0U3R5bGUsYSxuLmVjTW9kZWwpKX12YXIgXz1tLmdldFRleHRDb2xvcigpfHxuLmdldChbImF4aXNMaW5lIiwibGluZVN0eWxlIiwiY29sb3IiXSksYj1yLmRhdGFUb0Nvb3JkKGcpLHc9bS5nZXRTaGFsbG93KCJhbGlnbiIsITApfHxoLnRleHRBbGlnbixTPXJ0KG0uZ2V0U2hhbGxvdygiYWxpZ25NaW5MYWJlbCIsITApLHcpLE09cnQobS5nZXRTaGFsbG93KCJhbGlnbk1heExhYmVsIiwhMCksdyksST1tLmdldFNoYWxsb3coInZlcnRpY2FsQWxpZ24iLCEwKXx8bS5nZXRTaGFsbG93KCJiYXNlbGluZSIsITApfHxoLnRleHRWZXJ0aWNhbEFsaWduLFQ9cnQobS5nZXRTaGFsbG93KCJ2ZXJ0aWNhbEFsaWduTWluTGFiZWwiLCEwKSxJKSxDPXJ0KG0uZ2V0U2hhbGxvdygidmVydGljYWxBbGlnbk1heExhYmVsIiwhMCksSSksRD1uZXcgWHMoe3g6Yix5OmkubGFiZWxPZmZzZXQraS5sYWJlbERpcmVjdGlvbipzLHJvdGF0aW9uOmgucm90YXRpb24sc2lsZW50OmQsejI6MTArKG8ubGV2ZWx8fDApLHN0eWxlOm9jKG0se3RleHQ6eSxhbGlnbjowPT09dT9TOnU9PT1sLmxlbmd0aC0xP006dyx2ZXJ0aWNhbEFsaWduOjA9PT11P1Q6dT09PWwubGVuZ3RoLTE/QzpJLGZpbGw6WChfKT9fKCJjYXRlZ29yeSI9PT1yLnR5cGU/djoidmFsdWUiPT09ci50eXBlP2crIiI6Zyx1KTpffSl9KTtpZihELmFuaWQ9ImxhYmVsXyIrZyxmKXt2YXIgQT1kSS5tYWtlQXhpc0V2ZW50RGF0YUJhc2Uobik7QS50YXJnZXRUeXBlPSJheGlzTGFiZWwiLEEudmFsdWU9dixBLnRpY2tJbmRleD11LCJjYXRlZ29yeSI9PT1yLnR5cGUmJihBLmRhdGFJbmRleD1nKSxybChEKS5ldmVudERhdGE9QX1lLmFkZChEKSxELnVwZGF0ZVRyYW5zZm9ybSgpLHAucHVzaChEKSx0LmFkZChEKSxELmRlY29tcG9zZVRyYW5zZm9ybSgpfSkpLHB9KG4saSxlLHQpOyhmdW5jdGlvbih0LGUsbil7aWYoVF8odC5heGlzKSlyZXR1cm47dmFyIGk9dC5nZXQoWyJheGlzTGFiZWwiLCJzaG93TWluTGFiZWwiXSkscj10LmdldChbImF4aXNMYWJlbCIsInNob3dNYXhMYWJlbCJdKTtlPWV8fFtdLG49bnx8W107dmFyIG89ZVswXSxhPWVbMV0scz1lW2UubGVuZ3RoLTFdLGw9ZVtlLmxlbmd0aC0yXSx1PW5bMF0saD1uWzFdLGM9bltuLmxlbmd0aC0xXSxwPW5bbi5sZW5ndGgtMl07ITE9PT1pPyhnSShvKSxnSSh1KSk6eUkobyxhKSYmKGk/KGdJKGEpLGdJKGgpKTooZ0kobyksZ0kodSkpKTshMT09PXI/KGdJKHMpLGdJKGMpKTp5SShsLHMpJiYocj8oZ0kobCksZ0kocCkpOihnSShzKSxnSShjKSkpfShlLG8sciksZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9bi5heGlzLG89bi5nZXRNb2RlbCgibWlub3JUaWNrIik7aWYoIW8uZ2V0KCJzaG93Iil8fHIuc2NhbGUuaXNCbGFuaygpKXJldHVybjt2YXIgYT1yLmdldE1pbm9yVGlja3NDb29yZHMoKTtpZighYS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgcz1vLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxsPWkqby5nZXQoImxlbmd0aCIpLHU9ayhzLmdldExpbmVTdHlsZSgpLGsobi5nZXRNb2RlbCgiYXhpc1RpY2siKS5nZXRMaW5lU3R5bGUoKSx7c3Ryb2tlOm4uZ2V0KFsiYXhpc0xpbmUiLCJsaW5lU3R5bGUiLCJjb2xvciJdKX0pKSxoPTA7aDxhLmxlbmd0aDtoKyspZm9yKHZhciBjPW1JKGFbaF0sZS50cmFuc2Zvcm0sbCx1LCJtaW5vcnRpY2tzXyIraCkscD0wO3A8Yy5sZW5ndGg7cCsrKXQuYWRkKGNbcF0pfShuLGksZSx0LnRpY2tEaXJlY3Rpb24pLGUuZ2V0KFsiYXhpc0xhYmVsIiwiaGlkZU92ZXJsYXAiXSkpJiZOYihQYih6KG8sKGZ1bmN0aW9uKHQpe3JldHVybntsYWJlbDp0LHByaW9yaXR5OnQuejIsZGVmYXVsdEF0dHI6e2lnbm9yZTp0Lmlnbm9yZX19fSkpKSl9LGF4aXNOYW1lOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPWl0KHQuYXhpc05hbWUsZS5nZXQoIm5hbWUiKSk7aWYocil7dmFyIG8sYSxzPWUuZ2V0KCJuYW1lTG9jYXRpb24iKSxsPXQubmFtZURpcmVjdGlvbix1PWUuZ2V0TW9kZWwoIm5hbWVUZXh0U3R5bGUiKSxoPWUuZ2V0KCJuYW1lR2FwIil8fDAsYz1lLmF4aXMuZ2V0RXh0ZW50KCkscD1jWzBdPmNbMV0/LTE6MSxkPVsic3RhcnQiPT09cz9jWzBdLXAqaDoiZW5kIj09PXM/Y1sxXStwKmg6KGNbMF0rY1sxXSkvMix2SShzKT90LmxhYmVsT2Zmc2V0K2wqaDowXSxmPWUuZ2V0KCJuYW1lUm90YXRlIik7bnVsbCE9ZiYmKGY9ZipwSS8xODApLHZJKHMpP289ZEkuaW5uZXJUZXh0TGF5b3V0KHQucm90YXRpb24sbnVsbCE9Zj9mOnQucm90YXRpb24sbCk6KG89ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIsbyxhPWFvKG4tdCkscz1pWzBdPmlbMV0sbD0ic3RhcnQiPT09ZSYmIXN8fCJzdGFydCIhPT1lJiZzO3NvKGEtcEkvMik/KG89bD8iYm90dG9tIjoidG9wIixyPSJjZW50ZXIiKTpzbyhhLTEuNSpwSSk/KG89bD8idG9wIjoiYm90dG9tIixyPSJjZW50ZXIiKToobz0ibWlkZGxlIixyPWE8MS41KnBJJiZhPnBJLzI/bD8ibGVmdCI6InJpZ2h0IjpsPyJyaWdodCI6ImxlZnQiKTtyZXR1cm57cm90YXRpb246YSx0ZXh0QWxpZ246cix0ZXh0VmVydGljYWxBbGlnbjpvfX0odC5yb3RhdGlvbixzLGZ8fDAsYyksbnVsbCE9KGE9dC5heGlzTmFtZUF2YWlsYWJsZVdpZHRoKSYmKGE9TWF0aC5hYnMoYS9NYXRoLnNpbihvLnJvdGF0aW9uKSksIWlzRmluaXRlKGEpJiYoYT1udWxsKSkpO3ZhciBnPXUuZ2V0Rm9udCgpLHk9ZS5nZXQoIm5hbWVUcnVuY2F0ZSIsITApfHx7fSx2PXkuZWxsaXBzaXMsbT1pdCh0Lm5hbWVUcnVuY2F0ZU1heFdpZHRoLHkubWF4V2lkdGgsYSkseD1uZXcgWHMoe3g6ZFswXSx5OmRbMV0scm90YXRpb246by5yb3RhdGlvbixzaWxlbnQ6ZEkuaXNMYWJlbFNpbGVudChlKSxzdHlsZTpvYyh1LHt0ZXh0OnIsZm9udDpnLG92ZXJmbG93OiJ0cnVuY2F0ZSIsd2lkdGg6bSxlbGxpcHNpczp2LGZpbGw6dS5nZXRUZXh0Q29sb3IoKXx8ZS5nZXQoWyJheGlzTGluZSIsImxpbmVTdHlsZSIsImNvbG9yIl0pLGFsaWduOnUuZ2V0KCJhbGlnbiIpfHxvLnRleHRBbGlnbix2ZXJ0aWNhbEFsaWduOnUuZ2V0KCJ2ZXJ0aWNhbEFsaWduIil8fG8udGV4dFZlcnRpY2FsQWxpZ259KSx6MjoxfSk7aWYoS2goe2VsOngsY29tcG9uZW50TW9kZWw6ZSxpdGVtTmFtZTpyfSkseC5fX2Z1bGxUZXh0PXIseC5hbmlkPSJuYW1lIixlLmdldCgidHJpZ2dlckV2ZW50Iikpe3ZhciBfPWRJLm1ha2VBeGlzRXZlbnREYXRhQmFzZShlKTtfLnRhcmdldFR5cGU9ImF4aXNOYW1lIixfLm5hbWU9cixybCh4KS5ldmVudERhdGE9X31pLmFkZCh4KSx4LnVwZGF0ZVRyYW5zZm9ybSgpLG4uYWRkKHgpLHguZGVjb21wb3NlVHJhbnNmb3JtKCl9fX07ZnVuY3Rpb24gZ0kodCl7dCYmKHQuaWdub3JlPSEwKX1mdW5jdGlvbiB5SSh0LGUpe3ZhciBuPXQmJnQuZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKSxpPWUmJmUuZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKTtpZihuJiZpKXt2YXIgcj14ZShbXSk7cmV0dXJuIFNlKHIsciwtdC5yb3RhdGlvbiksbi5hcHBseVRyYW5zZm9ybShiZShbXSxyLHQuZ2V0TG9jYWxUcmFuc2Zvcm0oKSkpLGkuYXBwbHlUcmFuc2Zvcm0oYmUoW10scixlLmdldExvY2FsVHJhbnNmb3JtKCkpKSxuLmludGVyc2VjdChpKX19ZnVuY3Rpb24gdkkodCl7cmV0dXJuIm1pZGRsZSI9PT10fHwiY2VudGVyIj09PXR9ZnVuY3Rpb24gbUkodCxlLG4saSxyKXtmb3IodmFyIG89W10sYT1bXSxzPVtdLGw9MDtsPHQubGVuZ3RoO2wrKyl7dmFyIHU9dFtsXS5jb29yZDthWzBdPXUsYVsxXT0wLHNbMF09dSxzWzFdPW4sZSYmKFd0KGEsYSxlKSxXdChzLHMsZSkpO3ZhciBoPW5ldyBLdSh7c2hhcGU6e3gxOmFbMF0seTE6YVsxXSx4MjpzWzBdLHkyOnNbMV19LHN0eWxlOmksejI6MixhdXRvQmF0Y2g6ITAsc2lsZW50OiEwfSk7emgoaC5zaGFwZSxoLnN0eWxlLmxpbmVXaWR0aCksaC5hbmlkPXIrIl8iK3RbbF0udGlja1ZhbHVlLG8ucHVzaChoKX1yZXR1cm4gb31mdW5jdGlvbiB4SSh0LGUpe3ZhciBuPXtheGVzSW5mbzp7fSxzZXJpZXNJbnZvbHZlZDohMSxjb29yZFN5c0F4ZXNJbmZvOnt9LGNvb3JkU3lzTWFwOnt9fTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUuZ2V0Q29tcG9uZW50KCJ0b29sdGlwIikscj1lLmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKSxvPXIuZ2V0KCJsaW5rIiwhMCl8fFtdLGE9W107RShuLmdldENvb3JkaW5hdGVTeXN0ZW1zKCksKGZ1bmN0aW9uKG4pe2lmKG4uYXhpc1BvaW50ZXJFbmFibGVkKXt2YXIgcz1NSShuLm1vZGVsKSxsPXQuY29vcmRTeXNBeGVzSW5mb1tzXT17fTt0LmNvb3JkU3lzTWFwW3NdPW47dmFyIHU9bi5tb2RlbC5nZXRNb2RlbCgidG9vbHRpcCIsaSk7aWYoRShuLmdldEF4ZXMoKSxIKGQsITEsbnVsbCkpLG4uZ2V0VG9vbHRpcEF4ZXMmJmkmJnUuZ2V0KCJzaG93Iikpe3ZhciBoPSJheGlzIj09PXUuZ2V0KCJ0cmlnZ2VyIiksYz0iY3Jvc3MiPT09dS5nZXQoWyJheGlzUG9pbnRlciIsInR5cGUiXSkscD1uLmdldFRvb2x0aXBBeGVzKHUuZ2V0KFsiYXhpc1BvaW50ZXIiLCJheGlzIl0pKTsoaHx8YykmJkUocC5iYXNlQXhlcyxIKGQsIWN8fCJjcm9zcyIsaCkpLGMmJkUocC5vdGhlckF4ZXMsSChkLCJjcm9zcyIsITEpKX19ZnVuY3Rpb24gZChpLHMsaCl7dmFyIGM9aC5tb2RlbC5nZXRNb2RlbCgiYXhpc1BvaW50ZXIiLHIpLHA9Yy5nZXQoInNob3ciKTtpZihwJiYoImF1dG8iIT09cHx8aXx8U0koYykpKXtudWxsPT1zJiYocz1jLmdldCgidHJpZ2dlclRvb2x0aXAiKSksYz1pP2Z1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT1lLmdldE1vZGVsKCJheGlzUG9pbnRlciIpLHM9e307RShbInR5cGUiLCJzbmFwIiwibGluZVN0eWxlIiwic2hhZG93U3R5bGUiLCJsYWJlbCIsImFuaW1hdGlvbiIsImFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlIiwiYW5pbWF0aW9uRWFzaW5nVXBkYXRlIiwieiJdLChmdW5jdGlvbih0KXtzW3RdPVQoYS5nZXQodCkpfSkpLHMuc25hcD0iY2F0ZWdvcnkiIT09dC50eXBlJiYhIW8sImNyb3NzIj09PWEuZ2V0KCJ0eXBlIikmJihzLnR5cGU9ImxpbmUiKTt2YXIgbD1zLmxhYmVsfHwocy5sYWJlbD17fSk7aWYobnVsbD09bC5zaG93JiYobC5zaG93PSExKSwiY3Jvc3MiPT09cil7dmFyIHU9YS5nZXQoWyJsYWJlbCIsInNob3ciXSk7aWYobC5zaG93PW51bGw9PXV8fHUsIW8pe3ZhciBoPXMubGluZVN0eWxlPWEuZ2V0KCJjcm9zc1N0eWxlIik7aCYmayhsLGgudGV4dFN0eWxlKX19cmV0dXJuIHQubW9kZWwuZ2V0TW9kZWwoImF4aXNQb2ludGVyIixuZXcgQ2MocyxuLGkpKX0oaCx1LHIsZSxpLHMpOmM7dmFyIGQ9Yy5nZXQoInNuYXAiKSxmPWMuZ2V0KCJ0cmlnZ2VyRW1waGFzaXMiKSxnPU1JKGgubW9kZWwpLHk9c3x8ZHx8ImNhdGVnb3J5Ij09PWgudHlwZSx2PXQuYXhlc0luZm9bZ109e2tleTpnLGF4aXM6aCxjb29yZFN5czpuLGF4aXNQb2ludGVyTW9kZWw6Yyx0cmlnZ2VyVG9vbHRpcDpzLHRyaWdnZXJFbXBoYXNpczpmLGludm9sdmVTZXJpZXM6eSxzbmFwOmQsdXNlSGFuZGxlOlNJKGMpLHNlcmllc01vZGVsczpbXSxsaW5rR3JvdXA6bnVsbH07bFtnXT12LHQuc2VyaWVzSW52b2x2ZWQ9dC5zZXJpZXNJbnZvbHZlZHx8eTt2YXIgbT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLm1vZGVsLGk9ZS5kaW0scj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbz10W3JdfHx7fTtpZihfSShvW2krIkF4aXNJZCJdLG4uaWQpfHxfSShvW2krIkF4aXNJbmRleCJdLG4uY29tcG9uZW50SW5kZXgpfHxfSShvW2krIkF4aXNOYW1lIl0sbi5uYW1lKSlyZXR1cm4gcn19KG8saCk7aWYobnVsbCE9bSl7dmFyIHg9YVttXXx8KGFbbV09e2F4ZXNJbmZvOnt9fSk7eC5heGVzSW5mb1tnXT12LHgubWFwcGVyPW9bbV0ubWFwcGVyLHYubGlua0dyb3VwPXh9fX19KSl9KG4sdCxlKSxuLnNlcmllc0ludm9sdmVkJiZmdW5jdGlvbih0LGUpe2UuZWFjaFNlcmllcygoZnVuY3Rpb24oZSl7dmFyIG49ZS5jb29yZGluYXRlU3lzdGVtLGk9ZS5nZXQoWyJ0b29sdGlwIiwidHJpZ2dlciJdLCEwKSxyPWUuZ2V0KFsidG9vbHRpcCIsInNob3ciXSwhMCk7biYmIm5vbmUiIT09aSYmITEhPT1pJiYiaXRlbSIhPT1pJiYhMSE9PXImJiExIT09ZS5nZXQoWyJheGlzUG9pbnRlciIsInNob3ciXSwhMCkmJkUodC5jb29yZFN5c0F4ZXNJbmZvW01JKG4ubW9kZWwpXSwoZnVuY3Rpb24odCl7dmFyIGk9dC5heGlzO24uZ2V0QXhpcyhpLmRpbSk9PT1pJiYodC5zZXJpZXNNb2RlbHMucHVzaChlKSxudWxsPT10LnNlcmllc0RhdGFDb3VudCYmKHQuc2VyaWVzRGF0YUNvdW50PTApLHQuc2VyaWVzRGF0YUNvdW50Kz1lLmdldERhdGEoKS5jb3VudCgpKX0pKX0pKX0obix0KSxufWZ1bmN0aW9uIF9JKHQsZSl7cmV0dXJuImFsbCI9PT10fHxZKHQpJiZQKHQsZSk+PTB8fHQ9PT1lfWZ1bmN0aW9uIGJJKHQpe3ZhciBlPXdJKHQpO2lmKGUpe3ZhciBuPWUuYXhpc1BvaW50ZXJNb2RlbCxpPWUuYXhpcy5zY2FsZSxyPW4ub3B0aW9uLG89bi5nZXQoInN0YXR1cyIpLGE9bi5nZXQoInZhbHVlIik7bnVsbCE9YSYmKGE9aS5wYXJzZShhKSk7dmFyIHM9U0kobik7bnVsbD09byYmKHIuc3RhdHVzPXM/InNob3ciOiJoaWRlIik7dmFyIGw9aS5nZXRFeHRlbnQoKS5zbGljZSgpO2xbMF0+bFsxXSYmbC5yZXZlcnNlKCksKG51bGw9PWF8fGE+bFsxXSkmJihhPWxbMV0pLGE8bFswXSYmKGE9bFswXSksci52YWx1ZT1hLHMmJihyLnN0YXR1cz1lLmF4aXMuc2NhbGUuaXNCbGFuaygpPyJoaWRlIjoic2hvdyIpfX1mdW5jdGlvbiB3SSh0KXt2YXIgZT0odC5lY01vZGVsLmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKXx8e30pLmNvb3JkU3lzQXhlc0luZm87cmV0dXJuIGUmJmUuYXhlc0luZm9bTUkodCldfWZ1bmN0aW9uIFNJKHQpe3JldHVybiEhdC5nZXQoWyJoYW5kbGUiLCJzaG93Il0pfWZ1bmN0aW9uIE1JKHQpe3JldHVybiB0LnR5cGUrInx8Iit0LmlkfXZhciBJST17fSxUST1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSxuLGkscil7dGhpcy5heGlzUG9pbnRlckNsYXNzJiZiSShlKSx0LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2RvVXBkYXRlQXhpc1BvaW50ZXJDbGFzcyhlLGksITApfSxlLnByb3RvdHlwZS51cGRhdGVBeGlzUG9pbnRlcj1mdW5jdGlvbih0LGUsbixpKXt0aGlzLl9kb1VwZGF0ZUF4aXNQb2ludGVyQ2xhc3ModCxuLCExKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYXhpc1BvaW50ZXI7biYmbi5yZW1vdmUoZSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oZSxuKXt0aGlzLl9kaXNwb3NlQXhpc1BvaW50ZXIobiksdC5wcm90b3R5cGUuZGlzcG9zZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLl9kb1VwZGF0ZUF4aXNQb2ludGVyQ2xhc3M9ZnVuY3Rpb24odCxuLGkpe3ZhciByPWUuZ2V0QXhpc1BvaW50ZXJDbGFzcyh0aGlzLmF4aXNQb2ludGVyQ2xhc3MpO2lmKHIpe3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBlPXdJKHQpO3JldHVybiBlJiZlLmF4aXNQb2ludGVyTW9kZWx9KHQpO28/KHRoaXMuX2F4aXNQb2ludGVyfHwodGhpcy5fYXhpc1BvaW50ZXI9bmV3IHIpKS5yZW5kZXIodCxvLG4saSk6dGhpcy5fZGlzcG9zZUF4aXNQb2ludGVyKG4pfX0sZS5wcm90b3R5cGUuX2Rpc3Bvc2VBeGlzUG9pbnRlcj1mdW5jdGlvbih0KXt0aGlzLl9heGlzUG9pbnRlciYmdGhpcy5fYXhpc1BvaW50ZXIuZGlzcG9zZSh0KSx0aGlzLl9heGlzUG9pbnRlcj1udWxsfSxlLnJlZ2lzdGVyQXhpc1BvaW50ZXJDbGFzcz1mdW5jdGlvbih0LGUpe0lJW3RdPWV9LGUuZ2V0QXhpc1BvaW50ZXJDbGFzcz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmSUlbdF19LGUudHlwZT0iYXhpcyIsZX0oQWcpLENJPVZvKCk7ZnVuY3Rpb24gREkodCxlLG4saSl7dmFyIHI9bi5heGlzO2lmKCFyLnNjYWxlLmlzQmxhbmsoKSl7dmFyIG89bi5nZXRNb2RlbCgic3BsaXRBcmVhIiksYT1vLmdldE1vZGVsKCJhcmVhU3R5bGUiKSxzPWEuZ2V0KCJjb2xvciIpLGw9aS5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKSx1PXIuZ2V0VGlja3NDb29yZHMoe3RpY2tNb2RlbDpvLGNsYW1wOiEwfSk7aWYodS5sZW5ndGgpe3ZhciBoPXMubGVuZ3RoLGM9Q0kodCkuc3BsaXRBcmVhQ29sb3JzLHA9eXQoKSxkPTA7aWYoYylmb3IodmFyIGY9MDtmPHUubGVuZ3RoO2YrKyl7dmFyIGc9Yy5nZXQodVtmXS50aWNrVmFsdWUpO2lmKG51bGwhPWcpe2Q9KGcrKGgtMSkqZiklaDticmVha319dmFyIHk9ci50b0dsb2JhbENvb3JkKHVbMF0uY29vcmQpLHY9YS5nZXRBcmVhU3R5bGUoKTtzPVkocyk/czpbc107Zm9yKGY9MTtmPHUubGVuZ3RoO2YrKyl7dmFyIG09ci50b0dsb2JhbENvb3JkKHVbZl0uY29vcmQpLHg9dm9pZCAwLF89dm9pZCAwLGI9dm9pZCAwLHc9dm9pZCAwO3IuaXNIb3Jpem9udGFsKCk/KHg9eSxfPWwueSxiPW0teCx3PWwuaGVpZ2h0LHk9eCtiKTooeD1sLngsXz15LGI9bC53aWR0aCx5PV8rKHc9bS1fKSk7dmFyIFM9dVtmLTFdLnRpY2tWYWx1ZTtudWxsIT1TJiZwLnNldChTLGQpLGUuYWRkKG5ldyBXcyh7YW5pZDpudWxsIT1TPyJhcmVhXyIrUzpudWxsLHNoYXBlOnt4OngseTpfLHdpZHRoOmIsaGVpZ2h0Ond9LHN0eWxlOmsoe2ZpbGw6c1tkXX0sdiksYXV0b0JhdGNoOiEwLHNpbGVudDohMH0pKSxkPShkKzEpJWh9Q0kodCkuc3BsaXRBcmVhQ29sb3JzPXB9fX1mdW5jdGlvbiBBSSh0KXtDSSh0KS5zcGxpdEFyZWFDb2xvcnM9bnVsbH12YXIga0k9WyJheGlzTGluZSIsImF4aXNUaWNrTGFiZWwiLCJheGlzTmFtZSJdLExJPVsic3BsaXRBcmVhIiwic3BsaXRMaW5lIiwibWlub3JTcGxpdExpbmUiXSxQST1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4uYXhpc1BvaW50ZXJDbGFzcz0iQ2FydGVzaWFuQXhpc1BvaW50ZXIiLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSxuLGkscil7dGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgbz10aGlzLl9heGlzR3JvdXA7aWYodGhpcy5fYXhpc0dyb3VwPW5ldyBCcix0aGlzLmdyb3VwLmFkZCh0aGlzLl9heGlzR3JvdXApLGUuZ2V0KCJzaG93Iikpe3ZhciBhPWUuZ2V0Q29vcmRTeXNNb2RlbCgpLHM9aUkoYSxlKSxsPW5ldyBkSShlLEEoe2hhbmRsZUF1dG9TaG93bjpmdW5jdGlvbih0KXtmb3IodmFyIG49YS5jb29yZGluYXRlU3lzdGVtLmdldENhcnRlc2lhbnMoKSxpPTA7aTxuLmxlbmd0aDtpKyspaWYoVHgobltpXS5nZXRPdGhlckF4aXMoZS5heGlzKS5zY2FsZSkpcmV0dXJuITA7cmV0dXJuITF9fSxzKSk7RShrSSxsLmFkZCxsKSx0aGlzLl9heGlzR3JvdXAuYWRkKGwuZ2V0R3JvdXAoKSksRShMSSwoZnVuY3Rpb24odCl7ZS5nZXQoW3QsInNob3ciXSkmJk9JW3RdKHRoaXMsdGhpcy5fYXhpc0dyb3VwLGUsYSl9KSx0aGlzKSxyJiYiY2hhbmdlQXhpc09yZGVyIj09PXIudHlwZSYmci5pc0luaXRTb3J0fHxIaChvLHRoaXMuX2F4aXNHcm91cCxlKSx0LnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzLGUsbixpLHIpfX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7QUkodGhpcyl9LGUudHlwZT0iY2FydGVzaWFuQXhpcyIsZX0oVEkpLE9JPXtzcGxpdExpbmU6ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9bi5heGlzO2lmKCFyLnNjYWxlLmlzQmxhbmsoKSl7dmFyIG89bi5nZXRNb2RlbCgic3BsaXRMaW5lIiksYT1vLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxzPWEuZ2V0KCJjb2xvciIpO3M9WShzKT9zOltzXTtmb3IodmFyIGw9aS5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKSx1PXIuaXNIb3Jpem9udGFsKCksaD0wLGM9ci5nZXRUaWNrc0Nvb3Jkcyh7dGlja01vZGVsOm99KSxwPVtdLGQ9W10sZj1hLmdldExpbmVTdHlsZSgpLGc9MDtnPGMubGVuZ3RoO2crKyl7dmFyIHk9ci50b0dsb2JhbENvb3JkKGNbZ10uY29vcmQpO3U/KHBbMF09eSxwWzFdPWwueSxkWzBdPXksZFsxXT1sLnkrbC5oZWlnaHQpOihwWzBdPWwueCxwWzFdPXksZFswXT1sLngrbC53aWR0aCxkWzFdPXkpO3ZhciB2PWgrKyVzLmxlbmd0aCxtPWNbZ10udGlja1ZhbHVlLHg9bmV3IEt1KHthbmlkOm51bGwhPW0/ImxpbmVfIitjW2ddLnRpY2tWYWx1ZTpudWxsLGF1dG9CYXRjaDohMCxzaGFwZTp7eDE6cFswXSx5MTpwWzFdLHgyOmRbMF0seTI6ZFsxXX0sc3R5bGU6ayh7c3Ryb2tlOnNbdl19LGYpLHNpbGVudDohMH0pO3poKHguc2hhcGUsZi5saW5lV2lkdGgpLGUuYWRkKHgpfX19LG1pbm9yU3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uYXhpcyxvPW4uZ2V0TW9kZWwoIm1pbm9yU3BsaXRMaW5lIikuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLGE9aS5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKSxzPXIuaXNIb3Jpem9udGFsKCksbD1yLmdldE1pbm9yVGlja3NDb29yZHMoKTtpZihsLmxlbmd0aClmb3IodmFyIHU9W10saD1bXSxjPW8uZ2V0TGluZVN0eWxlKCkscD0wO3A8bC5sZW5ndGg7cCsrKWZvcih2YXIgZD0wO2Q8bFtwXS5sZW5ndGg7ZCsrKXt2YXIgZj1yLnRvR2xvYmFsQ29vcmQobFtwXVtkXS5jb29yZCk7cz8odVswXT1mLHVbMV09YS55LGhbMF09ZixoWzFdPWEueSthLmhlaWdodCk6KHVbMF09YS54LHVbMV09ZixoWzBdPWEueCthLndpZHRoLGhbMV09Zik7dmFyIGc9bmV3IEt1KHthbmlkOiJtaW5vcl9saW5lXyIrbFtwXVtkXS50aWNrVmFsdWUsYXV0b0JhdGNoOiEwLHNoYXBlOnt4MTp1WzBdLHkxOnVbMV0seDI6aFswXSx5MjpoWzFdfSxzdHlsZTpjLHNpbGVudDohMH0pO3poKGcuc2hhcGUsYy5saW5lV2lkdGgpLGUuYWRkKGcpfX0sc3BsaXRBcmVhOmZ1bmN0aW9uKHQsZSxuLGkpe0RJKHQsZSxuLGkpfX0sUkk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS50eXBlPSJ4QXhpcyIsZX0oUEkpLE5JPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT1SSS50eXBlLGV9cmV0dXJuIG4oZSx0KSxlLnR5cGU9InlBeGlzIixlfShQSSksRUk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPSJncmlkIixlfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0LmdldCgic2hvdyIpJiZ0aGlzLmdyb3VwLmFkZChuZXcgV3Moe3NoYXBlOnQuY29vcmRpbmF0ZVN5c3RlbS5nZXRSZWN0KCksc3R5bGU6ayh7ZmlsbDp0LmdldCgiYmFja2dyb3VuZENvbG9yIil9LHQuZ2V0SXRlbVN0eWxlKCkpLHNpbGVudDohMCx6MjotMX0pKX0sZS50eXBlPSJncmlkIixlfShBZyksekk9e29mZnNldDowfTtmdW5jdGlvbiBWSSh0KXt0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhFSSksdC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKEhNKSx0LnJlZ2lzdGVyQ29vcmRpbmF0ZVN5c3RlbSgiY2FydGVzaWFuMmQiLGxJKSxLTSh0LCJ4IixZTSx6SSksS00odCwieSIsWU0sekkpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KFJJKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhOSSksdC5yZWdpc3RlclByZXByb2Nlc3NvcigoZnVuY3Rpb24odCl7dC54QXhpcyYmdC55QXhpcyYmIXQuZ3JpZCYmKHQuZ3JpZD17fSl9KSl9ZnVuY3Rpb24gQkkodCl7dC5lYWNoU2VyaWVzQnlUeXBlKCJyYWRhciIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLG49W10saT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoaSl7dmFyIHI9aS5nZXRJbmRpY2F0b3JBeGVzKCk7RShyLChmdW5jdGlvbih0LG8pe2UuZWFjaChlLm1hcERpbWVuc2lvbihyW29dLmRpbSksKGZ1bmN0aW9uKHQsZSl7bltlXT1uW2VdfHxbXTt2YXIgcj1pLmRhdGFUb1BvaW50KHQsbyk7bltlXVtvXT1GSShyKT9yOkdJKGkpfSkpfSkpLGUuZWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9RihuW3RdLChmdW5jdGlvbih0KXtyZXR1cm4gRkkodCl9KSl8fEdJKGkpO25bdF0ucHVzaChyLnNsaWNlKCkpLGUuc2V0SXRlbUxheW91dCh0LG5bdF0pfSkpfX0pKX1mdW5jdGlvbiBGSSh0KXtyZXR1cm4haXNOYU4odFswXSkmJiFpc05hTih0WzFdKX1mdW5jdGlvbiBHSSh0KXtyZXR1cm5bdC5jeCx0LmN5XX1mdW5jdGlvbiBXSSh0KXt2YXIgZT10LnBvbGFyO2lmKGUpe1koZSl8fChlPVtlXSk7dmFyIG49W107RShlLChmdW5jdGlvbihlLGkpe2UuaW5kaWNhdG9yPyhlLnR5cGUmJiFlLnNoYXBlJiYoZS5zaGFwZT1lLnR5cGUpLHQucmFkYXI9dC5yYWRhcnx8W10sWSh0LnJhZGFyKXx8KHQucmFkYXI9W3QucmFkYXJdKSx0LnJhZGFyLnB1c2goZSkpOm4ucHVzaChlKX0pKSx0LnBvbGFyPW59RSh0LnNlcmllcywoZnVuY3Rpb24odCl7dCYmInJhZGFyIj09PXQudHlwZSYmdC5wb2xhckluZGV4JiYodC5yYWRhckluZGV4PXQucG9sYXJJbmRleCl9KSl9dmFyIEhJPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5jb29yZGluYXRlU3lzdGVtLHI9dGhpcy5ncm91cCxvPXQuZ2V0RGF0YSgpLGE9dGhpcy5fZGF0YTtmdW5jdGlvbiBzKHQsZSl7dmFyIG49dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbCIpfHwiY2lyY2xlIjtpZigibm9uZSIhPT1uKXt2YXIgaT1VeSh0LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sU2l6ZSIpKSxyPVh5KG4sLTEsLTEsMiwyKSxvPXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xSb3RhdGUiKXx8MDtyZXR1cm4gci5hdHRyKHtzdHlsZTp7c3Ryb2tlTm9TY2FsZTohMH0sejI6MTAwLHNjYWxlWDppWzBdLzIsc2NhbGVZOmlbMV0vMixyb3RhdGlvbjpvKk1hdGguUEkvMTgwfHwwfSkscn19ZnVuY3Rpb24gbChlLG4saSxyLG8sYSl7aS5yZW1vdmVBbGwoKTtmb3IodmFyIGw9MDtsPG4ubGVuZ3RoLTE7bCsrKXt2YXIgdT1zKHIsbyk7dSYmKHUuX19kaW1JZHg9bCxlW2xdPyh1LnNldFBvc2l0aW9uKGVbbF0pLFFoW2E/ImluaXRQcm9wcyI6InVwZGF0ZVByb3BzIl0odSx7eDpuW2xdWzBdLHk6bltsXVsxXX0sdCxvKSk6dS5zZXRQb3NpdGlvbihuW2xdKSxpLmFkZCh1KSl9fWZ1bmN0aW9uIHUodCl7cmV0dXJuIHoodCwoZnVuY3Rpb24odCl7cmV0dXJuW2kuY3gsaS5jeV19KSl9by5kaWZmKGEpLmFkZCgoZnVuY3Rpb24oZSl7dmFyIG49by5nZXRJdGVtTGF5b3V0KGUpO2lmKG4pe3ZhciBpPW5ldyBYdSxyPW5ldyBadSxhPXtzaGFwZTp7cG9pbnRzOm59fTtpLnNoYXBlLnBvaW50cz11KG4pLHIuc2hhcGUucG9pbnRzPXUobiksbWgoaSxhLHQsZSksbWgocixhLHQsZSk7dmFyIHM9bmV3IEJyLGg9bmV3IEJyO3MuYWRkKHIpLHMuYWRkKGkpLHMuYWRkKGgpLGwoci5zaGFwZS5wb2ludHMsbixoLG8sZSwhMCksby5zZXRJdGVtR3JhcGhpY0VsKGUscyl9fSkpLnVwZGF0ZSgoZnVuY3Rpb24oZSxuKXt2YXIgaT1hLmdldEl0ZW1HcmFwaGljRWwobikscj1pLmNoaWxkQXQoMCkscz1pLmNoaWxkQXQoMSksdT1pLmNoaWxkQXQoMiksaD17c2hhcGU6e3BvaW50czpvLmdldEl0ZW1MYXlvdXQoZSl9fTtoLnNoYXBlLnBvaW50cyYmKGwoci5zaGFwZS5wb2ludHMsaC5zaGFwZS5wb2ludHMsdSxvLGUsITEpLFNoKHMpLFNoKHIpLHZoKHIsaCx0KSx2aChzLGgsdCksby5zZXRJdGVtR3JhcGhpY0VsKGUsaSkpfSkpLnJlbW92ZSgoZnVuY3Rpb24odCl7ci5yZW1vdmUoYS5nZXRJdGVtR3JhcGhpY0VsKHQpKX0pKS5leGVjdXRlKCksby5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCxlKXt2YXIgbj1vLmdldEl0ZW1Nb2RlbChlKSxpPXQuY2hpbGRBdCgwKSxhPXQuY2hpbGRBdCgxKSxzPXQuY2hpbGRBdCgyKSxsPW8uZ2V0SXRlbVZpc3VhbChlLCJzdHlsZSIpLHU9bC5maWxsO3IuYWRkKHQpLGkudXNlU3R5bGUoayhuLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSx7ZmlsbDoibm9uZSIsc3Ryb2tlOnV9KSksJGwoaSxuLCJsaW5lU3R5bGUiKSwkbChhLG4sImFyZWFTdHlsZSIpO3ZhciBoPW4uZ2V0TW9kZWwoImFyZWFTdHlsZSIpLGM9aC5pc0VtcHR5KCkmJmgucGFyZW50TW9kZWwuaXNFbXB0eSgpO2EuaWdub3JlPWMsRShbImVtcGhhc2lzIiwic2VsZWN0IiwiYmx1ciJdLChmdW5jdGlvbih0KXt2YXIgZT1uLmdldE1vZGVsKFt0LCJhcmVhU3R5bGUiXSksaT1lLmlzRW1wdHkoKSYmZS5wYXJlbnRNb2RlbC5pc0VtcHR5KCk7YS5lbnN1cmVTdGF0ZSh0KS5pZ25vcmU9aSYmY30pKSxhLnVzZVN0eWxlKGsoaC5nZXRBcmVhU3R5bGUoKSx7ZmlsbDp1LG9wYWNpdHk6LjcsZGVjYWw6bC5kZWNhbH0pKTt2YXIgcD1uLmdldE1vZGVsKCJlbXBoYXNpcyIpLGQ9cC5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCk7cy5lYWNoQ2hpbGQoKGZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBOcyl7dmFyIGk9dC5zdHlsZTt0LnVzZVN0eWxlKEEoe2ltYWdlOmkuaW1hZ2UseDppLngseTppLnksd2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9LGwpKX1lbHNlIHQudXNlU3R5bGUobCksdC5zZXRDb2xvcih1KSx0LnN0eWxlLnN0cm9rZU5vU2NhbGU9ITA7dC5lbnN1cmVTdGF0ZSgiZW1waGFzaXMiKS5zdHlsZT1UKGQpO3ZhciByPW8uZ2V0U3RvcmUoKS5nZXQoby5nZXREaW1lbnNpb25JbmRleCh0Ll9fZGltSWR4KSxlKTsobnVsbD09cnx8aXNOYU4ocikpJiYocj0iIiksaWModCxyYyhuKSx7bGFiZWxGZXRjaGVyOm8uaG9zdE1vZGVsLGxhYmVsRGF0YUluZGV4OmUsbGFiZWxEaW1JbmRleDp0Ll9fZGltSWR4LGRlZmF1bHRUZXh0OnIsaW5oZXJpdENvbG9yOnUsZGVmYXVsdE9wYWNpdHk6bC5vcGFjaXR5fSl9KSksWmwodCxwLmdldCgiZm9jdXMiKSxwLmdldCgiYmx1clNjb3BlIikscC5nZXQoImRpc2FibGVkIikpfSkpLHRoaXMuX2RhdGE9b30sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9LGUudHlwZT0icmFkYXIiLGV9KE9nKSxZST1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4uaGFzU3ltYm9sVmlzdWFsPSEwLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMubGVnZW5kVmlzdWFsUHJvdmlkZXI9bmV3IE5NKFcodGhpcy5nZXREYXRhLHRoaXMpLFcodGhpcy5nZXRSYXdEYXRhLHRoaXMpKX0sZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUk0odGhpcyx7Z2VuZXJhdGVDb29yZDoiaW5kaWNhdG9yXyIsZ2VuZXJhdGVDb29yZENvdW50OjEvMH0pfSxlLnByb3RvdHlwZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmdldERhdGEoKSxyPXRoaXMuY29vcmRpbmF0ZVN5c3RlbS5nZXRJbmRpY2F0b3JBeGVzKCksbz10aGlzLmdldERhdGEoKS5nZXROYW1lKHQpLGE9IiI9PT1vP3RoaXMubmFtZTpvLHM9ZmcodGhpcyx0KTtyZXR1cm4gb2coInNlY3Rpb24iLHtoZWFkZXI6YSxzb3J0QmxvY2tzOiEwLGJsb2Nrczp6KHIsKGZ1bmN0aW9uKGUpe3ZhciBuPWkuZ2V0KGkubWFwRGltZW5zaW9uKGUuZGltKSx0KTtyZXR1cm4gb2coIm5hbWVWYWx1ZSIse21hcmtlclR5cGU6InN1Ykl0ZW0iLG1hcmtlckNvbG9yOnMsbmFtZTplLm5hbWUsdmFsdWU6bixzb3J0UGFyYW06bn0pfSkpfSl9LGUucHJvdG90eXBlLmdldFRvb2x0aXBQb3NpdGlvbj1mdW5jdGlvbih0KXtpZihudWxsIT10KWZvcih2YXIgZT10aGlzLmdldERhdGEoKSxuPXRoaXMuY29vcmRpbmF0ZVN5c3RlbSxpPWUuZ2V0VmFsdWVzKHoobi5kaW1lbnNpb25zLChmdW5jdGlvbih0KXtyZXR1cm4gZS5tYXBEaW1lbnNpb24odCl9KSksdCkscj0wLG89aS5sZW5ndGg7cjxvO3IrKylpZighaXNOYU4oaVtyXSkpe3ZhciBhPW4uZ2V0SW5kaWNhdG9yQXhlcygpO3JldHVybiBuLmNvb3JkVG9Qb2ludChhW3JdLmRhdGFUb0Nvb3JkKGlbcl0pLHIpfX0sZS50eXBlPSJzZXJpZXMucmFkYXIiLGUuZGVwZW5kZW5jaWVzPVsicmFkYXIiXSxlLmRlZmF1bHRPcHRpb249e3o6Mixjb2xvckJ5OiJkYXRhIixjb29yZGluYXRlU3lzdGVtOiJyYWRhciIsbGVnZW5kSG92ZXJMaW5rOiEwLHJhZGFySW5kZXg6MCxsaW5lU3R5bGU6e3dpZHRoOjIsdHlwZToic29saWQiLGpvaW46InJvdW5kIn0sbGFiZWw6e3Bvc2l0aW9uOiJ0b3AifSxzeW1ib2xTaXplOjh9LGV9KGJnKSxYST1qTS52YWx1ZTtmdW5jdGlvbiBVSSh0LGUpe3JldHVybiBrKHtzaG93OmV9LHQpfXZhciBaST1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoImJvdW5kYXJ5R2FwIiksZT10aGlzLmdldCgic3BsaXROdW1iZXIiKSxuPXRoaXMuZ2V0KCJzY2FsZSIpLGk9dGhpcy5nZXQoImF4aXNMaW5lIikscj10aGlzLmdldCgiYXhpc1RpY2siKSxvPXRoaXMuZ2V0KCJheGlzTGFiZWwiKSxhPXRoaXMuZ2V0KCJheGlzTmFtZSIpLHM9dGhpcy5nZXQoWyJheGlzTmFtZSIsInNob3ciXSksbD10aGlzLmdldChbImF4aXNOYW1lIiwiZm9ybWF0dGVyIl0pLHU9dGhpcy5nZXQoImF4aXNOYW1lR2FwIiksaD10aGlzLmdldCgidHJpZ2dlckV2ZW50IiksYz16KHRoaXMuZ2V0KCJpbmRpY2F0b3IiKXx8W10sKGZ1bmN0aW9uKGMpe251bGwhPWMubWF4JiZjLm1heD4wJiYhYy5taW4/Yy5taW49MDpudWxsIT1jLm1pbiYmYy5taW48MCYmIWMubWF4JiYoYy5tYXg9MCk7dmFyIHA9YTtudWxsIT1jLmNvbG9yJiYocD1rKHtjb2xvcjpjLmNvbG9yfSxhKSk7dmFyIGQ9QyhUKGMpLHtib3VuZGFyeUdhcDp0LHNwbGl0TnVtYmVyOmUsc2NhbGU6bixheGlzTGluZTppLGF4aXNUaWNrOnIsYXhpc0xhYmVsOm8sbmFtZTpjLnRleHQsc2hvd05hbWU6cyxuYW1lTG9jYXRpb246ImVuZCIsbmFtZUdhcDp1LG5hbWVUZXh0U3R5bGU6cCx0cmlnZ2VyRXZlbnQ6aH0sITEpO2lmKFUobCkpe3ZhciBmPWQubmFtZTtkLm5hbWU9bC5yZXBsYWNlKCJ7dmFsdWV9IixudWxsIT1mP2Y6IiIpfWVsc2UgWChsKSYmKGQubmFtZT1sKGQubmFtZSxkKSk7dmFyIGc9bmV3IENjKGQsbnVsbCx0aGlzLmVjTW9kZWwpO3JldHVybiBSKGcsRF8ucHJvdG90eXBlKSxnLm1haW5UeXBlPSJyYWRhciIsZy5jb21wb25lbnRJbmRleD10aGlzLmNvbXBvbmVudEluZGV4LGd9KSx0aGlzKTt0aGlzLl9pbmRpY2F0b3JNb2RlbHM9Y30sZS5wcm90b3R5cGUuZ2V0SW5kaWNhdG9yTW9kZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luZGljYXRvck1vZGVsc30sZS50eXBlPSJyYWRhciIsZS5kZWZhdWx0T3B0aW9uPXt6OjAsY2VudGVyOlsiNTAlIiwiNTAlIl0scmFkaXVzOiI3NSUiLHN0YXJ0QW5nbGU6OTAsYXhpc05hbWU6e3Nob3c6ITB9LGJvdW5kYXJ5R2FwOlswLDBdLHNwbGl0TnVtYmVyOjUsYXhpc05hbWVHYXA6MTUsc2NhbGU6ITEsc2hhcGU6InBvbHlnb24iLGF4aXNMaW5lOkMoe2xpbmVTdHlsZTp7Y29sb3I6IiNiYmIifX0sWEkuYXhpc0xpbmUpLGF4aXNMYWJlbDpVSShYSS5heGlzTGFiZWwsITEpLGF4aXNUaWNrOlVJKFhJLmF4aXNUaWNrLCExKSxzcGxpdExpbmU6VUkoWEkuc3BsaXRMaW5lLCEwKSxzcGxpdEFyZWE6VUkoWEkuc3BsaXRBcmVhLCEwKSxpbmRpY2F0b3I6W119LGV9KHpwKSxqST1bImF4aXNMaW5lIiwiYXhpc1RpY2tMYWJlbCIsImF4aXNOYW1lIl0scUk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2J1aWxkQXhlcyh0KSx0aGlzLl9idWlsZFNwbGl0TGluZUFuZEFyZWEodCl9LGUucHJvdG90eXBlLl9idWlsZEF4ZXM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO0UoeihlLmdldEluZGljYXRvckF4ZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49dC5tb2RlbC5nZXQoInNob3dOYW1lIik/dC5uYW1lOiIiO3JldHVybiBuZXcgZEkodC5tb2RlbCx7YXhpc05hbWU6bixwb3NpdGlvbjpbZS5jeCxlLmN5XSxyb3RhdGlvbjp0LmFuZ2xlLGxhYmVsRGlyZWN0aW9uOi0xLHRpY2tEaXJlY3Rpb246LTEsbmFtZURpcmVjdGlvbjoxfSl9KSksKGZ1bmN0aW9uKHQpe0UoakksdC5hZGQsdCksdGhpcy5ncm91cC5hZGQodC5nZXRHcm91cCgpKX0pLHRoaXMpfSxlLnByb3RvdHlwZS5fYnVpbGRTcGxpdExpbmVBbmRBcmVhPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29vcmRpbmF0ZVN5c3RlbSxuPWUuZ2V0SW5kaWNhdG9yQXhlcygpO2lmKG4ubGVuZ3RoKXt2YXIgaT10LmdldCgic2hhcGUiKSxyPXQuZ2V0TW9kZWwoInNwbGl0TGluZSIpLG89dC5nZXRNb2RlbCgic3BsaXRBcmVhIiksYT1yLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxzPW8uZ2V0TW9kZWwoImFyZWFTdHlsZSIpLGw9ci5nZXQoInNob3ciKSx1PW8uZ2V0KCJzaG93IiksaD1hLmdldCgiY29sb3IiKSxjPXMuZ2V0KCJjb2xvciIpLHA9WShoKT9oOltoXSxkPVkoYyk/YzpbY10sZj1bXSxnPVtdO2lmKCJjaXJjbGUiPT09aSlmb3IodmFyIHk9blswXS5nZXRUaWNrc0Nvb3JkcygpLHY9ZS5jeCxtPWUuY3kseD0wO3g8eS5sZW5ndGg7eCsrKXtpZihsKWZbQyhmLHAseCldLnB1c2gobmV3IFN1KHtzaGFwZTp7Y3g6dixjeTptLHI6eVt4XS5jb29yZH19KSk7aWYodSYmeDx5Lmxlbmd0aC0xKWdbQyhnLGQseCldLnB1c2gobmV3IFd1KHtzaGFwZTp7Y3g6dixjeTptLHIwOnlbeF0uY29vcmQscjp5W3grMV0uY29vcmR9fSkpfWVsc2V7dmFyIF8sYj16KG4sKGZ1bmN0aW9uKHQsbil7dmFyIGk9dC5nZXRUaWNrc0Nvb3JkcygpO3JldHVybiBfPW51bGw9PV8/aS5sZW5ndGgtMTpNYXRoLm1pbihpLmxlbmd0aC0xLF8pLHooaSwoZnVuY3Rpb24odCl7cmV0dXJuIGUuY29vcmRUb1BvaW50KHQuY29vcmQsbil9KSl9KSksdz1bXTtmb3IoeD0wO3g8PV87eCsrKXtmb3IodmFyIFM9W10sTT0wO008bi5sZW5ndGg7TSsrKVMucHVzaChiW01dW3hdKTtpZihTWzBdJiZTLnB1c2goU1swXS5zbGljZSgpKSxsKWZbQyhmLHAseCldLnB1c2gobmV3IFp1KHtzaGFwZTp7cG9pbnRzOlN9fSkpO2lmKHUmJncpZ1tDKGcsZCx4LTEpXS5wdXNoKG5ldyBYdSh7c2hhcGU6e3BvaW50czpTLmNvbmNhdCh3KX19KSk7dz1TLnNsaWNlKCkucmV2ZXJzZSgpfX12YXIgST1hLmdldExpbmVTdHlsZSgpLFQ9cy5nZXRBcmVhU3R5bGUoKTtFKGcsKGZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cC5hZGQoTmgodCx7c3R5bGU6ayh7c3Ryb2tlOiJub25lIixmaWxsOmRbZSVkLmxlbmd0aF19LFQpLHNpbGVudDohMH0pKX0pLHRoaXMpLEUoZiwoZnVuY3Rpb24odCxlKXt0aGlzLmdyb3VwLmFkZChOaCh0LHtzdHlsZTprKHtmaWxsOiJub25lIixzdHJva2U6cFtlJXAubGVuZ3RoXX0sSSksc2lsZW50OiEwfSkpfSksdGhpcyl9ZnVuY3Rpb24gQyh0LGUsbil7dmFyIGk9biVlLmxlbmd0aDtyZXR1cm4gdFtpXT10W2ldfHxbXSxpfX0sZS50eXBlPSJyYWRhciIsZX0oQWcpLEtJPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLGkpe3ZhciByPXQuY2FsbCh0aGlzLGUsbixpKXx8dGhpcztyZXR1cm4gci50eXBlPSJ2YWx1ZSIsci5hbmdsZT0wLHIubmFtZT0iIixyfXJldHVybiBuKGUsdCksZX0oYWIpLCRJPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5kaW1lbnNpb25zPVtdLHRoaXMuX21vZGVsPXQsdGhpcy5faW5kaWNhdG9yQXhlcz16KHQuZ2V0SW5kaWNhdG9yTW9kZWxzKCksKGZ1bmN0aW9uKHQsZSl7dmFyIG49ImluZGljYXRvcl8iK2UsaT1uZXcgS0kobixuZXcgRXgpO3JldHVybiBpLm5hbWU9dC5nZXQoIm5hbWUiKSxpLm1vZGVsPXQsdC5heGlzPWksdGhpcy5kaW1lbnNpb25zLnB1c2gobiksaX0pLHRoaXMpLHRoaXMucmVzaXplKHQsbil9cmV0dXJuIHQucHJvdG90eXBlLmdldEluZGljYXRvckF4ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5kaWNhdG9yQXhlc30sdC5wcm90b3R5cGUuZGF0YVRvUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pbmRpY2F0b3JBeGVzW2VdO3JldHVybiB0aGlzLmNvb3JkVG9Qb2ludChuLmRhdGFUb0Nvb3JkKHQpLGUpfSx0LnByb3RvdHlwZS5jb29yZFRvUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pbmRpY2F0b3JBeGVzW2VdLmFuZ2xlO3JldHVyblt0aGlzLmN4K3QqTWF0aC5jb3MobiksdGhpcy5jeS10Kk1hdGguc2luKG4pXX0sdC5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dFswXS10aGlzLmN4LG49dFsxXS10aGlzLmN5LGk9TWF0aC5zcXJ0KGUqZStuKm4pO2UvPWksbi89aTtmb3IodmFyIHIsbz1NYXRoLmF0YW4yKC1uLGUpLGE9MS8wLHM9LTEsbD0wO2w8dGhpcy5faW5kaWNhdG9yQXhlcy5sZW5ndGg7bCsrKXt2YXIgdT10aGlzLl9pbmRpY2F0b3JBeGVzW2xdLGg9TWF0aC5hYnMoby11LmFuZ2xlKTtoPGEmJihyPXUscz1sLGE9aCl9cmV0dXJuW3MsKyhyJiZyLmNvb3JkVG9EYXRhKGkpKV19LHQucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0KCJjZW50ZXIiKSxpPWUuZ2V0V2lkdGgoKSxyPWUuZ2V0SGVpZ2h0KCksbz1NYXRoLm1pbihpLHIpLzI7dGhpcy5jeD0kcihuWzBdLGkpLHRoaXMuY3k9JHIoblsxXSxyKSx0aGlzLnN0YXJ0QW5nbGU9dC5nZXQoInN0YXJ0QW5nbGUiKSpNYXRoLlBJLzE4MDt2YXIgYT10LmdldCgicmFkaXVzIik7KFUoYSl8fGooYSkpJiYoYT1bMCxhXSksdGhpcy5yMD0kcihhWzBdLG8pLHRoaXMucj0kcihhWzFdLG8pLEUodGhpcy5faW5kaWNhdG9yQXhlcywoZnVuY3Rpb24odCxlKXt0LnNldEV4dGVudCh0aGlzLnIwLHRoaXMucik7dmFyIG49dGhpcy5zdGFydEFuZ2xlK2UqTWF0aC5QSSoyL3RoaXMuX2luZGljYXRvckF4ZXMubGVuZ3RoO249TWF0aC5hdGFuMihNYXRoLnNpbihuKSxNYXRoLmNvcyhuKSksdC5hbmdsZT1ufSksdGhpcyl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2luZGljYXRvckF4ZXMsaT10aGlzLl9tb2RlbDtFKG4sKGZ1bmN0aW9uKHQpe3Quc2NhbGUuc2V0RXh0ZW50KDEvMCwtMS8wKX0pKSx0LmVhY2hTZXJpZXNCeVR5cGUoInJhZGFyIiwoZnVuY3Rpb24oZSxyKXtpZigicmFkYXIiPT09ZS5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSYmdC5nZXRDb21wb25lbnQoInJhZGFyIixlLmdldCgicmFkYXJJbmRleCIpKT09PWkpe3ZhciBvPWUuZ2V0RGF0YSgpO0UobiwoZnVuY3Rpb24odCl7dC5zY2FsZS51bmlvbkV4dGVudEZyb21EYXRhKG8sby5tYXBEaW1lbnNpb24odC5kaW0pKX0pKX19KSx0aGlzKTt2YXIgcj1pLmdldCgic3BsaXROdW1iZXIiKSxvPW5ldyBFeDtvLnNldEV4dGVudCgwLHIpLG8uc2V0SW50ZXJ2YWwoMSksRShuLChmdW5jdGlvbih0LGUpe3NJKHQuc2NhbGUsdC5tb2RlbCxvKX0pKX0sdC5wcm90b3R5cGUuY29udmVydFRvUGl4ZWw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjb25zb2xlLndhcm4oIk5vdCBpbXBsZW1lbnRlZC4iKSxudWxsfSx0LnByb3RvdHlwZS5jb252ZXJ0RnJvbVBpeGVsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gY29uc29sZS53YXJuKCJOb3QgaW1wbGVtZW50ZWQuIiksbnVsbH0sdC5wcm90b3R5cGUuY29udGFpblBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIk5vdCBpbXBsZW1lbnRlZC4iKSwhMX0sdC5jcmVhdGU9ZnVuY3Rpb24oZSxuKXt2YXIgaT1bXTtyZXR1cm4gZS5lYWNoQ29tcG9uZW50KCJyYWRhciIsKGZ1bmN0aW9uKHIpe3ZhciBvPW5ldyB0KHIsZSxuKTtpLnB1c2gobyksci5jb29yZGluYXRlU3lzdGVtPW99KSksZS5lYWNoU2VyaWVzQnlUeXBlKCJyYWRhciIsKGZ1bmN0aW9uKHQpeyJyYWRhciI9PT10LmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpJiYodC5jb29yZGluYXRlU3lzdGVtPWlbdC5nZXQoInJhZGFySW5kZXgiKXx8MF0pfSkpLGl9LHQuZGltZW5zaW9ucz1bXSx0fSgpO2Z1bmN0aW9uIEpJKHQpe3QucmVnaXN0ZXJDb29yZGluYXRlU3lzdGVtKCJyYWRhciIsJEkpLHQucmVnaXN0ZXJDb21wb25lbnRNb2RlbChaSSksdC5yZWdpc3RlckNvbXBvbmVudFZpZXcocUkpLHQucmVnaXN0ZXJWaXN1YWwoe3Nlcmllc1R5cGU6InJhZGFyIixyZXNldDpmdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKTtlLmVhY2goKGZ1bmN0aW9uKHQpe2Uuc2V0SXRlbVZpc3VhbCh0LCJsZWdlbmRJY29uIiwicm91bmRSZWN0Iil9KSksZS5zZXRWaXN1YWwoImxlZ2VuZEljb24iLCJyb3VuZFJlY3QiKX19KX12YXIgUUk9IlwwX2VjX2ludGVyYWN0aW9uX211dGV4IjtmdW5jdGlvbiB0VCh0LGUpe3JldHVybiEhZVQodClbZV19ZnVuY3Rpb24gZVQodCl7cmV0dXJuIHRbUUldfHwodFtRSV09e30pfUNtKHt0eXBlOiJ0YWtlR2xvYmFsQ3Vyc29yIixldmVudDoiZ2xvYmFsQ3Vyc29yVGFrZW4iLHVwZGF0ZToidXBkYXRlIn0sYnQpO3ZhciBuVD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztuLl96cj1lO3ZhciBpPVcobi5fbW91c2Vkb3duSGFuZGxlcixuKSxyPVcobi5fbW91c2Vtb3ZlSGFuZGxlcixuKSxvPVcobi5fbW91c2V1cEhhbmRsZXIsbiksYT1XKG4uX21vdXNld2hlZWxIYW5kbGVyLG4pLHM9VyhuLl9waW5jaEhhbmRsZXIsbik7cmV0dXJuIG4uZW5hYmxlPWZ1bmN0aW9uKHQsbil7dGhpcy5kaXNhYmxlKCksdGhpcy5fb3B0PWsoVChuKXx8e30se3pvb21Pbk1vdXNlV2hlZWw6ITAsbW92ZU9uTW91c2VNb3ZlOiEwLG1vdmVPbk1vdXNlV2hlZWw6ITEscHJldmVudERlZmF1bHRNb3VzZU1vdmU6ITB9KSxudWxsPT10JiYodD0hMCksITAhPT10JiYibW92ZSIhPT10JiYicGFuIiE9PXR8fChlLm9uKCJtb3VzZWRvd24iLGkpLGUub24oIm1vdXNlbW92ZSIsciksZS5vbigibW91c2V1cCIsbykpLCEwIT09dCYmInNjYWxlIiE9PXQmJiJ6b29tIiE9PXR8fChlLm9uKCJtb3VzZXdoZWVsIixhKSxlLm9uKCJwaW5jaCIscykpfSxuLmRpc2FibGU9ZnVuY3Rpb24oKXtlLm9mZigibW91c2Vkb3duIixpKSxlLm9mZigibW91c2Vtb3ZlIixyKSxlLm9mZigibW91c2V1cCIsbyksZS5vZmYoIm1vdXNld2hlZWwiLGEpLGUub2ZmKCJwaW5jaCIscyl9LG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pc0RyYWdnaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnaW5nfSxlLnByb3RvdHlwZS5pc1BpbmNoaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BpbmNoaW5nfSxlLnByb3RvdHlwZS5zZXRQb2ludGVyQ2hlY2tlcj1mdW5jdGlvbih0KXt0aGlzLnBvaW50ZXJDaGVja2VyPXR9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGUoKX0sZS5wcm90b3R5cGUuX21vdXNlZG93bkhhbmRsZXI9ZnVuY3Rpb24odCl7aWYoIWZlKHQpKXtmb3IodmFyIGU9dC50YXJnZXQ7ZTspe2lmKGUuZHJhZ2dhYmxlKXJldHVybjtlPWUuX19ob3N0VGFyZ2V0fHxlLnBhcmVudH12YXIgbj10Lm9mZnNldFgsaT10Lm9mZnNldFk7dGhpcy5wb2ludGVyQ2hlY2tlciYmdGhpcy5wb2ludGVyQ2hlY2tlcih0LG4saSkmJih0aGlzLl94PW4sdGhpcy5feT1pLHRoaXMuX2RyYWdnaW5nPSEwKX19LGUucHJvdG90eXBlLl9tb3VzZW1vdmVIYW5kbGVyPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2RyYWdnaW5nJiZvVCgibW92ZU9uTW91c2VNb3ZlIix0LHRoaXMuX29wdCkmJiJwaW5jaCIhPT10Lmdlc3R1cmVFdmVudCYmIXRUKHRoaXMuX3pyLCJnbG9iYWxQYW4iKSl7dmFyIGU9dC5vZmZzZXRYLG49dC5vZmZzZXRZLGk9dGhpcy5feCxyPXRoaXMuX3ksbz1lLWksYT1uLXI7dGhpcy5feD1lLHRoaXMuX3k9bix0aGlzLl9vcHQucHJldmVudERlZmF1bHRNb3VzZU1vdmUmJmRlKHQuZXZlbnQpLHJUKHRoaXMsInBhbiIsIm1vdmVPbk1vdXNlTW92ZSIsdCx7ZHg6byxkeTphLG9sZFg6aSxvbGRZOnIsbmV3WDplLG5ld1k6bixpc0F2YWlsYWJsZUJlaGF2aW9yOm51bGx9KX19LGUucHJvdG90eXBlLl9tb3VzZXVwSGFuZGxlcj1mdW5jdGlvbih0KXtmZSh0KXx8KHRoaXMuX2RyYWdnaW5nPSExKX0sZS5wcm90b3R5cGUuX21vdXNld2hlZWxIYW5kbGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW9UKCJ6b29tT25Nb3VzZVdoZWVsIix0LHRoaXMuX29wdCksbj1vVCgibW92ZU9uTW91c2VXaGVlbCIsdCx0aGlzLl9vcHQpLGk9dC53aGVlbERlbHRhLHI9TWF0aC5hYnMoaSksbz10Lm9mZnNldFgsYT10Lm9mZnNldFk7aWYoMCE9PWkmJihlfHxuKSl7aWYoZSl7dmFyIHM9cj4zPzEuNDpyPjE/MS4yOjEuMTtpVCh0aGlzLCJ6b29tIiwiem9vbU9uTW91c2VXaGVlbCIsdCx7c2NhbGU6aT4wP3M6MS9zLG9yaWdpblg6byxvcmlnaW5ZOmEsaXNBdmFpbGFibGVCZWhhdmlvcjpudWxsfSl9aWYobil7dmFyIGw9TWF0aC5hYnMoaSk7aVQodGhpcywic2Nyb2xsTW92ZSIsIm1vdmVPbk1vdXNlV2hlZWwiLHQse3Njcm9sbERlbHRhOihpPjA/MTotMSkqKGw+Mz8uNDpsPjE/LjE1Oi4wNSksb3JpZ2luWDpvLG9yaWdpblk6YSxpc0F2YWlsYWJsZUJlaGF2aW9yOm51bGx9KX19fSxlLnByb3RvdHlwZS5fcGluY2hIYW5kbGVyPWZ1bmN0aW9uKHQpe3RUKHRoaXMuX3pyLCJnbG9iYWxQYW4iKXx8aVQodGhpcywiem9vbSIsbnVsbCx0LHtzY2FsZTp0LnBpbmNoU2NhbGU+MT8xLjE6MS8xLjEsb3JpZ2luWDp0LnBpbmNoWCxvcmlnaW5ZOnQucGluY2hZLGlzQXZhaWxhYmxlQmVoYXZpb3I6bnVsbH0pfSxlfShqdCk7ZnVuY3Rpb24gaVQodCxlLG4saSxyKXt0LnBvaW50ZXJDaGVja2VyJiZ0LnBvaW50ZXJDaGVja2VyKGksci5vcmlnaW5YLHIub3JpZ2luWSkmJihkZShpLmV2ZW50KSxyVCh0LGUsbixpLHIpKX1mdW5jdGlvbiByVCh0LGUsbixpLHIpe3IuaXNBdmFpbGFibGVCZWhhdmlvcj1XKG9ULG51bGwsbixpKSx0LnRyaWdnZXIoZSxyKX1mdW5jdGlvbiBvVCh0LGUsbil7dmFyIGk9blt0XTtyZXR1cm4hdHx8aSYmKCFVKGkpfHxlLmV2ZW50W2krIktleSJdKX1mdW5jdGlvbiBhVCh0LGUsbil7dmFyIGk9dC50YXJnZXQ7aS54Kz1lLGkueSs9bixpLmRpcnR5KCl9ZnVuY3Rpb24gc1QodCxlLG4saSl7dmFyIHI9dC50YXJnZXQsbz10Lnpvb21MaW1pdCxhPXQuem9vbT10Lnpvb218fDE7aWYoYSo9ZSxvKXt2YXIgcz1vLm1pbnx8MCxsPW8ubWF4fHwxLzA7YT1NYXRoLm1heChNYXRoLm1pbihsLGEpLHMpfXZhciB1PWEvdC56b29tO3Quem9vbT1hLHIueC09KG4tci54KSoodS0xKSxyLnktPShpLXIueSkqKHUtMSksci5zY2FsZVgqPXUsci5zY2FsZVkqPXUsci5kaXJ0eSgpfXZhciBsVCx1VD17YXhpc1BvaW50ZXI6MSx0b29sdGlwOjEsYnJ1c2g6MX07ZnVuY3Rpb24gaFQodCxlLG4pe3ZhciBpPWUuZ2V0Q29tcG9uZW50QnlFbGVtZW50KHQudG9wVGFyZ2V0KSxyPWkmJmkuY29vcmRpbmF0ZVN5c3RlbTtyZXR1cm4gaSYmaSE9PW4mJiF1VC5oYXNPd25Qcm9wZXJ0eShpLm1haW5UeXBlKSYmciYmci5tb2RlbCE9PW59ZnVuY3Rpb24gY1QodCl7VSh0KSYmKHQ9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpKTt2YXIgZT10O2Zvcig5PT09ZS5ub2RlVHlwZSYmKGU9ZS5maXJzdENoaWxkKTsic3ZnIiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKXx8MSE9PWUubm9kZVR5cGU7KWU9ZS5uZXh0U2libGluZztyZXR1cm4gZX12YXIgcFQ9e2ZpbGw6ImZpbGwiLHN0cm9rZToic3Ryb2tlIiwic3Ryb2tlLXdpZHRoIjoibGluZVdpZHRoIixvcGFjaXR5OiJvcGFjaXR5IiwiZmlsbC1vcGFjaXR5IjoiZmlsbE9wYWNpdHkiLCJzdHJva2Utb3BhY2l0eSI6InN0cm9rZU9wYWNpdHkiLCJzdHJva2UtZGFzaGFycmF5IjoibGluZURhc2giLCJzdHJva2UtZGFzaG9mZnNldCI6ImxpbmVEYXNoT2Zmc2V0Iiwic3Ryb2tlLWxpbmVjYXAiOiJsaW5lQ2FwIiwic3Ryb2tlLWxpbmVqb2luIjoibGluZUpvaW4iLCJzdHJva2UtbWl0ZXJsaW1pdCI6Im1pdGVyTGltaXQiLCJmb250LWZhbWlseSI6ImZvbnRGYW1pbHkiLCJmb250LXNpemUiOiJmb250U2l6ZSIsImZvbnQtc3R5bGUiOiJmb250U3R5bGUiLCJmb250LXdlaWdodCI6ImZvbnRXZWlnaHQiLCJ0ZXh0LWFuY2hvciI6InRleHRBbGlnbiIsdmlzaWJpbGl0eToidmlzaWJpbGl0eSIsZGlzcGxheToiZGlzcGxheSJ9LGRUPUcocFQpLGZUPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoidGV4dEJhc2VsaW5lIiwic3RvcC1jb2xvciI6InN0b3BDb2xvciJ9LGdUPUcoZlQpLHlUPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2RlZnM9e30sdGhpcy5fcm9vdD1udWxsfXJldHVybiB0LnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0LGUpe2U9ZXx8e307dmFyIG49Y1QodCk7dGhpcy5fZGVmc1VzZVBlbmRpbmc9W107dmFyIGk9bmV3IEJyO3RoaXMuX3Jvb3Q9aTt2YXIgcj1bXSxvPW4uZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIiLGE9cGFyc2VGbG9hdChuLmdldEF0dHJpYnV0ZSgid2lkdGgiKXx8ZS53aWR0aCkscz1wYXJzZUZsb2F0KG4uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKXx8ZS5oZWlnaHQpO2lzTmFOKGEpJiYoYT1udWxsKSxpc05hTihzKSYmKHM9bnVsbCksd1QobixpLG51bGwsITAsITEpO2Zvcih2YXIgbCx1LGg9bi5maXJzdENoaWxkO2g7KXRoaXMuX3BhcnNlTm9kZShoLGkscixudWxsLCExLCExKSxoPWgubmV4dFNpYmxpbmc7aWYoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9ZVtuXTtpWzBdLnN0eWxlW2lbMV1dPXRbaVsyXV19fSh0aGlzLl9kZWZzLHRoaXMuX2RlZnNVc2VQZW5kaW5nKSx0aGlzLl9kZWZzVXNlUGVuZGluZz1bXSxvKXt2YXIgYz1UVChvKTtjLmxlbmd0aD49NCYmKGw9e3g6cGFyc2VGbG9hdChjWzBdfHwwKSx5OnBhcnNlRmxvYXQoY1sxXXx8MCksd2lkdGg6cGFyc2VGbG9hdChjWzJdKSxoZWlnaHQ6cGFyc2VGbG9hdChjWzNdKX0pfWlmKGwmJm51bGwhPWEmJm51bGwhPXMmJih1PUxUKGwse3g6MCx5OjAsd2lkdGg6YSxoZWlnaHQ6c30pLCFlLmlnbm9yZVZpZXdCb3gpKXt2YXIgcD1pOyhpPW5ldyBCcikuYWRkKHApLHAuc2NhbGVYPXAuc2NhbGVZPXUuc2NhbGUscC54PXUueCxwLnk9dS55fXJldHVybiBlLmlnbm9yZVJvb3RDbGlwfHxudWxsPT1hfHxudWxsPT1zfHxpLnNldENsaXBQYXRoKG5ldyBXcyh7c2hhcGU6e3g6MCx5OjAsd2lkdGg6YSxoZWlnaHQ6c319KSkse3Jvb3Q6aSx3aWR0aDphLGhlaWdodDpzLHZpZXdCb3hSZWN0Omwsdmlld0JveFRyYW5zZm9ybTp1LG5hbWVkOnJ9fSx0LnByb3RvdHlwZS5fcGFyc2VOb2RlPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYSxzPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxsPWk7aWYoImRlZnMiPT09cyYmKHI9ITApLCJ0ZXh0Ij09PXMmJihvPSEwKSwiZGVmcyI9PT1zfHwic3dpdGNoIj09PXMpYT1lO2Vsc2V7aWYoIXIpe3ZhciB1PWxUW3NdO2lmKHUmJl90KGxULHMpKXthPXUuY2FsbCh0aGlzLHQsZSk7dmFyIGg9dC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTtpZihoKXt2YXIgYz17bmFtZTpoLG5hbWVkRnJvbTpudWxsLHN2Z05vZGVUYWdMb3dlcjpzLGVsOmF9O24ucHVzaChjKSwiZyI9PT1zJiYobD1jKX1lbHNlIGkmJm4ucHVzaCh7bmFtZTppLm5hbWUsbmFtZWRGcm9tOmksc3ZnTm9kZVRhZ0xvd2VyOnMsZWw6YX0pO2UuYWRkKGEpfX12YXIgcD12VFtzXTtpZihwJiZfdCh2VCxzKSl7dmFyIGQ9cC5jYWxsKHRoaXMsdCksZj10LmdldEF0dHJpYnV0ZSgiaWQiKTtmJiYodGhpcy5fZGVmc1tmXT1kKX19aWYoYSYmYS5pc0dyb3VwKWZvcih2YXIgZz10LmZpcnN0Q2hpbGQ7ZzspMT09PWcubm9kZVR5cGU/dGhpcy5fcGFyc2VOb2RlKGcsYSxuLGwscixvKTozPT09Zy5ub2RlVHlwZSYmbyYmdGhpcy5fcGFyc2VUZXh0KGcsYSksZz1nLm5leHRTaWJsaW5nfSx0LnByb3RvdHlwZS5fcGFyc2VUZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IFBzKHtzdHlsZTp7dGV4dDp0LnRleHRDb250ZW50fSxzaWxlbnQ6ITAseDp0aGlzLl90ZXh0WHx8MCx5OnRoaXMuX3RleHRZfHwwfSk7X1QoZSxuKSx3VCh0LG4sdGhpcy5fZGVmc1VzZVBlbmRpbmcsITEsITEpLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5fX3NlbGZTdHlsZTtpZihuKXt2YXIgaT1uLnRleHRCYXNlbGluZSxyPWk7aSYmImF1dG8iIT09aT8iYmFzZWxpbmUiPT09aT9yPSJhbHBoYWJldGljIjoiYmVmb3JlLWVkZ2UiPT09aXx8InRleHQtYmVmb3JlLWVkZ2UiPT09aT9yPSJ0b3AiOiJhZnRlci1lZGdlIj09PWl8fCJ0ZXh0LWFmdGVyLWVkZ2UiPT09aT9yPSJib3R0b20iOiJjZW50cmFsIiE9PWkmJiJtYXRoZW1hdGljYWwiIT09aXx8KHI9Im1pZGRsZSIpOnI9ImFscGhhYmV0aWMiLHQuc3R5bGUudGV4dEJhc2VsaW5lPXJ9dmFyIG89ZS5fX2luaGVyaXRlZFN0eWxlO2lmKG8pe3ZhciBhPW8udGV4dEFsaWduLHM9YTthJiYoIm1pZGRsZSI9PT1hJiYocz0iY2VudGVyIiksdC5zdHlsZS50ZXh0QWxpZ249cyl9fShuLGUpO3ZhciBpPW4uc3R5bGUscj1pLmZvbnRTaXplO3ImJnI8OSYmKGkuZm9udFNpemU9OSxuLnNjYWxlWCo9ci85LG4uc2NhbGVZKj1yLzkpO3ZhciBvPShpLmZvbnRTaXplfHxpLmZvbnRGYW1pbHkpJiZbaS5mb250U3R5bGUsaS5mb250V2VpZ2h0LChpLmZvbnRTaXplfHwxMikrInB4IixpLmZvbnRGYW1pbHl8fCJzYW5zLXNlcmlmIl0uam9pbigiICIpO2kuZm9udD1vO3ZhciBhPW4uZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuIHRoaXMuX3RleHRYKz1hLndpZHRoLGUuYWRkKG4pLG59LHQuaW50ZXJuYWxGaWVsZD12b2lkKGxUPXtnOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IEJyO3JldHVybiBfVChlLG4pLHdUKHQsbix0aGlzLl9kZWZzVXNlUGVuZGluZywhMSwhMSksbn0scmVjdDpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBXcztyZXR1cm4gX1QoZSxuKSx3VCh0LG4sdGhpcy5fZGVmc1VzZVBlbmRpbmcsITEsITEpLG4uc2V0U2hhcGUoe3g6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgieCIpfHwiMCIpLHk6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgieSIpfHwiMCIpLHdpZHRoOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoIndpZHRoIil8fCIwIiksaGVpZ2h0OnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoImhlaWdodCIpfHwiMCIpfSksbi5zaWxlbnQ9ITAsbn0sY2lyY2xlOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IFN1O3JldHVybiBfVChlLG4pLHdUKHQsbix0aGlzLl9kZWZzVXNlUGVuZGluZywhMSwhMSksbi5zZXRTaGFwZSh7Y3g6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgiY3giKXx8IjAiKSxjeTpwYXJzZUZsb2F0KHQuZ2V0QXR0cmlidXRlKCJjeSIpfHwiMCIpLHI6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgiciIpfHwiMCIpfSksbi5zaWxlbnQ9ITAsbn0sbGluZTpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBLdTtyZXR1cm4gX1QoZSxuKSx3VCh0LG4sdGhpcy5fZGVmc1VzZVBlbmRpbmcsITEsITEpLG4uc2V0U2hhcGUoe3gxOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoIngxIil8fCIwIikseTE6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgieTEiKXx8IjAiKSx4MjpwYXJzZUZsb2F0KHQuZ2V0QXR0cmlidXRlKCJ4MiIpfHwiMCIpLHkyOnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoInkyIil8fCIwIil9KSxuLnNpbGVudD0hMCxufSxlbGxpcHNlOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IEl1O3JldHVybiBfVChlLG4pLHdUKHQsbix0aGlzLl9kZWZzVXNlUGVuZGluZywhMSwhMSksbi5zZXRTaGFwZSh7Y3g6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgiY3giKXx8IjAiKSxjeTpwYXJzZUZsb2F0KHQuZ2V0QXR0cmlidXRlKCJjeSIpfHwiMCIpLHJ4OnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoInJ4Iil8fCIwIikscnk6cGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgicnkiKXx8IjAiKX0pLG4uc2lsZW50PSEwLG59LHBvbHlnb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXQuZ2V0QXR0cmlidXRlKCJwb2ludHMiKTtpJiYobj1iVChpKSk7dmFyIHI9bmV3IFh1KHtzaGFwZTp7cG9pbnRzOm58fFtdfSxzaWxlbnQ6ITB9KTtyZXR1cm4gX1QoZSxyKSx3VCh0LHIsdGhpcy5fZGVmc1VzZVBlbmRpbmcsITEsITEpLHJ9LHBvbHlsaW5lOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10LmdldEF0dHJpYnV0ZSgicG9pbnRzIik7aSYmKG49YlQoaSkpO3ZhciByPW5ldyBadSh7c2hhcGU6e3BvaW50czpufHxbXX0sc2lsZW50OiEwfSk7cmV0dXJuIF9UKGUsciksd1QodCxyLHRoaXMuX2RlZnNVc2VQZW5kaW5nLCExLCExKSxyfSxpbWFnZTpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBOcztyZXR1cm4gX1QoZSxuKSx3VCh0LG4sdGhpcy5fZGVmc1VzZVBlbmRpbmcsITEsITEpLG4uc2V0U3R5bGUoe2ltYWdlOnQuZ2V0QXR0cmlidXRlKCJ4bGluazpocmVmIil8fHQuZ2V0QXR0cmlidXRlKCJocmVmIikseDordC5nZXRBdHRyaWJ1dGUoIngiKSx5Oit0LmdldEF0dHJpYnV0ZSgieSIpLHdpZHRoOit0LmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6K3QuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKX0pLG4uc2lsZW50PSEwLG59LHRleHQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEF0dHJpYnV0ZSgieCIpfHwiMCIsaT10LmdldEF0dHJpYnV0ZSgieSIpfHwiMCIscj10LmdldEF0dHJpYnV0ZSgiZHgiKXx8IjAiLG89dC5nZXRBdHRyaWJ1dGUoImR5Iil8fCIwIjt0aGlzLl90ZXh0WD1wYXJzZUZsb2F0KG4pK3BhcnNlRmxvYXQociksdGhpcy5fdGV4dFk9cGFyc2VGbG9hdChpKStwYXJzZUZsb2F0KG8pO3ZhciBhPW5ldyBCcjtyZXR1cm4gX1QoZSxhKSx3VCh0LGEsdGhpcy5fZGVmc1VzZVBlbmRpbmcsITEsITApLGF9LHRzcGFuOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoIngiKSxpPXQuZ2V0QXR0cmlidXRlKCJ5Iik7bnVsbCE9biYmKHRoaXMuX3RleHRYPXBhcnNlRmxvYXQobikpLG51bGwhPWkmJih0aGlzLl90ZXh0WT1wYXJzZUZsb2F0KGkpKTt2YXIgcj10LmdldEF0dHJpYnV0ZSgiZHgiKXx8IjAiLG89dC5nZXRBdHRyaWJ1dGUoImR5Iil8fCIwIixhPW5ldyBCcjtyZXR1cm4gX1QoZSxhKSx3VCh0LGEsdGhpcy5fZGVmc1VzZVBlbmRpbmcsITEsITApLHRoaXMuX3RleHRYKz1wYXJzZUZsb2F0KHIpLHRoaXMuX3RleHRZKz1wYXJzZUZsb2F0KG8pLGF9LHBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgbj1fdSh0LmdldEF0dHJpYnV0ZSgiZCIpfHwiIik7cmV0dXJuIF9UKGUsbiksd1QodCxuLHRoaXMuX2RlZnNVc2VQZW5kaW5nLCExLCExKSxuLnNpbGVudD0hMCxufX0pLHR9KCksdlQ9e2xpbmVhcmdyYWRpZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ4MSIpfHwiMCIsMTApLG49cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoInkxIil8fCIwIiwxMCksaT1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgieDIiKXx8IjEwIiwxMCkscj1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgieTIiKXx8IjAiLDEwKSxvPW5ldyBvaChlLG4saSxyKTtyZXR1cm4gbVQodCxvKSx4VCh0LG8pLG99LHJhZGlhbGdyYWRpZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJjeCIpfHwiMCIsMTApLG49cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImN5Iil8fCIwIiwxMCksaT1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiciIpfHwiMCIsMTApLHI9bmV3IGFoKGUsbixpKTtyZXR1cm4gbVQodCxyKSx4VCh0LHIpLHJ9fTtmdW5jdGlvbiBtVCh0LGUpeyJ1c2VyU3BhY2VPblVzZSI9PT10LmdldEF0dHJpYnV0ZSgiZ3JhZGllbnRVbml0cyIpJiYoZS5nbG9iYWw9ITApfWZ1bmN0aW9uIHhUKHQsZSl7Zm9yKHZhciBuPXQuZmlyc3RDaGlsZDtuOyl7aWYoMT09PW4ubm9kZVR5cGUmJiJzdG9wIj09PW4ubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSl7dmFyIGk9bi5nZXRBdHRyaWJ1dGUoIm9mZnNldCIpLHI9dm9pZCAwO3I9aSYmaS5pbmRleE9mKCIlIik+MD9wYXJzZUludChpLDEwKS8xMDA6aT9wYXJzZUZsb2F0KGkpOjA7dmFyIG89e307a1QobixvLG8pO3ZhciBhPW8uc3RvcENvbG9yfHxuLmdldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIpfHwiIzAwMDAwMCI7ZS5jb2xvclN0b3BzLnB1c2goe29mZnNldDpyLGNvbG9yOmF9KX1uPW4ubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIF9UKHQsZSl7dCYmdC5fX2luaGVyaXRlZFN0eWxlJiYoZS5fX2luaGVyaXRlZFN0eWxlfHwoZS5fX2luaGVyaXRlZFN0eWxlPXt9KSxrKGUuX19pbmhlcml0ZWRTdHlsZSx0Ll9faW5oZXJpdGVkU3R5bGUpKX1mdW5jdGlvbiBiVCh0KXtmb3IodmFyIGU9VFQodCksbj1bXSxpPTA7aTxlLmxlbmd0aDtpKz0yKXt2YXIgcj1wYXJzZUZsb2F0KGVbaV0pLG89cGFyc2VGbG9hdChlW2krMV0pO24ucHVzaChbcixvXSl9cmV0dXJuIG59ZnVuY3Rpb24gd1QodCxlLG4saSxyKXt2YXIgbz1lLGE9by5fX2luaGVyaXRlZFN0eWxlPW8uX19pbmhlcml0ZWRTdHlsZXx8e30scz17fTsxPT09dC5ub2RlVHlwZSYmKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpO2lmKG4pe249bi5yZXBsYWNlKC8sL2csIiAiKTt2YXIgaT1bXSxyPW51bGw7bi5yZXBsYWNlKENULChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGkucHVzaChlLG4pLCIifSkpO2Zvcih2YXIgbz1pLmxlbmd0aC0xO28+MDtvLT0yKXt2YXIgYT1pW29dLHM9aVtvLTFdLGw9VFQoYSk7c3dpdGNoKHI9cnx8WzEsMCwwLDEsMCwwXSxzKXtjYXNlInRyYW5zbGF0ZSI6d2UocixyLFtwYXJzZUZsb2F0KGxbMF0pLHBhcnNlRmxvYXQobFsxXXx8IjAiKV0pO2JyZWFrO2Nhc2Uic2NhbGUiOk1lKHIscixbcGFyc2VGbG9hdChsWzBdKSxwYXJzZUZsb2F0KGxbMV18fGxbMF0pXSk7YnJlYWs7Y2FzZSJyb3RhdGUiOlNlKHIsciwtcGFyc2VGbG9hdChsWzBdKSpEVCxbcGFyc2VGbG9hdChsWzFdfHwiMCIpLHBhcnNlRmxvYXQobFsyXXx8IjAiKV0pO2JyZWFrO2Nhc2Uic2tld1giOmJlKHIsWzEsMCxNYXRoLnRhbihwYXJzZUZsb2F0KGxbMF0pKkRUKSwxLDAsMF0scik7YnJlYWs7Y2FzZSJza2V3WSI6YmUocixbMSxNYXRoLnRhbihwYXJzZUZsb2F0KGxbMF0pKkRUKSwwLDEsMCwwXSxyKTticmVhaztjYXNlIm1hdHJpeCI6clswXT1wYXJzZUZsb2F0KGxbMF0pLHJbMV09cGFyc2VGbG9hdChsWzFdKSxyWzJdPXBhcnNlRmxvYXQobFsyXSksclszXT1wYXJzZUZsb2F0KGxbM10pLHJbNF09cGFyc2VGbG9hdChsWzRdKSxyWzVdPXBhcnNlRmxvYXQobFs1XSl9fWUuc2V0TG9jYWxUcmFuc2Zvcm0ocil9fSh0LGUpLGtUKHQsYSxzKSxpfHxmdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPTA7aTxkVC5sZW5ndGg7aSsrKXt2YXIgcj1kVFtpXTtudWxsIT0obz10LmdldEF0dHJpYnV0ZShyKSkmJihlW3BUW3JdXT1vKX1mb3IoaT0wO2k8Z1QubGVuZ3RoO2krKyl7dmFyIG87cj1nVFtpXTtudWxsIT0obz10LmdldEF0dHJpYnV0ZShyKSkmJihuW2ZUW3JdXT1vKX19KHQsYSxzKSksby5zdHlsZT1vLnN0eWxlfHx7fSxudWxsIT1hLmZpbGwmJihvLnN0eWxlLmZpbGw9TVQobywiZmlsbCIsYS5maWxsLG4pKSxudWxsIT1hLnN0cm9rZSYmKG8uc3R5bGUuc3Ryb2tlPU1UKG8sInN0cm9rZSIsYS5zdHJva2UsbikpLEUoWyJsaW5lV2lkdGgiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJzdHJva2VPcGFjaXR5IiwibWl0ZXJMaW1pdCIsImZvbnRTaXplIl0sKGZ1bmN0aW9uKHQpe251bGwhPWFbdF0mJihvLnN0eWxlW3RdPXBhcnNlRmxvYXQoYVt0XSkpfSkpLEUoWyJsaW5lRGFzaE9mZnNldCIsImxpbmVDYXAiLCJsaW5lSm9pbiIsImZvbnRXZWlnaHQiLCJmb250RmFtaWx5IiwiZm9udFN0eWxlIiwidGV4dEFsaWduIl0sKGZ1bmN0aW9uKHQpe251bGwhPWFbdF0mJihvLnN0eWxlW3RdPWFbdF0pfSkpLHImJihvLl9fc2VsZlN0eWxlPXMpLGEubGluZURhc2gmJihvLnN0eWxlLmxpbmVEYXNoPXooVFQoYS5saW5lRGFzaCksKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUZsb2F0KHQpfSkpKSwiaGlkZGVuIiE9PWEudmlzaWJpbGl0eSYmImNvbGxhcHNlIiE9PWEudmlzaWJpbGl0eXx8KG8uaW52aXNpYmxlPSEwKSwibm9uZSI9PT1hLmRpc3BsYXkmJihvLmlnbm9yZT0hMCl9dmFyIFNUPS9edXJsXChccyojKC4qPylcKS87ZnVuY3Rpb24gTVQodCxlLG4saSl7dmFyIHI9biYmbi5tYXRjaChTVCk7aWYoIXIpcmV0dXJuIm5vbmUiPT09biYmKG49bnVsbCksbjt2YXIgbz11dChyWzFdKTtpLnB1c2goW3QsZSxvXSl9dmFyIElUPS8tPyhbMC05XSpcLik/WzAtOV0rKFtlRV0tP1swLTldKyk/L2c7ZnVuY3Rpb24gVFQodCl7cmV0dXJuIHQubWF0Y2goSVQpfHxbXX12YXIgQ1Q9Lyh0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHNrZXdYfHNrZXdZfG1hdHJpeClcKChbXC1cczAtOVwuZUUsXSopXCkvZyxEVD1NYXRoLlBJLzE4MDt2YXIgQVQ9LyhbXlxzOjtdKylccyo6XHMqKFteOjtdKykvZztmdW5jdGlvbiBrVCh0LGUsbil7dmFyIGkscj10LmdldEF0dHJpYnV0ZSgic3R5bGUiKTtpZihyKWZvcihBVC5sYXN0SW5kZXg9MDtudWxsIT0oaT1BVC5leGVjKHIpKTspe3ZhciBvPWlbMV0sYT1fdChwVCxvKT9wVFtvXTpudWxsO2EmJihlW2FdPWlbMl0pO3ZhciBzPV90KGZULG8pP2ZUW29dOm51bGw7cyYmKG5bc109aVsyXSl9fWZ1bmN0aW9uIExUKHQsZSl7dmFyIG49ZS53aWR0aC90LndpZHRoLGk9ZS5oZWlnaHQvdC5oZWlnaHQscj1NYXRoLm1pbihuLGkpO3JldHVybntzY2FsZTpyLHg6LSh0LngrdC53aWR0aC8yKSpyKyhlLngrZS53aWR0aC8yKSx5Oi0odC55K3QuaGVpZ2h0LzIpKnIrKGUueStlLmhlaWdodC8yKX19dmFyIFBUPXl0KFsicmVjdCIsImNpcmNsZSIsImxpbmUiLCJlbGxpcHNlIiwicG9seWdvbiIsInBvbHlsaW5lIiwicGF0aCIsInRleHQiLCJ0c3BhbiIsImciXSksT1Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy50eXBlPSJnZW9TVkciLHRoaXMuX3VzZWRHcmFwaGljTWFwPXl0KCksdGhpcy5fZnJlZWRHcmFwaGljcz1bXSx0aGlzLl9tYXBOYW1lPXQsdGhpcy5fcGFyc2VkWE1MPWNUKGUpfXJldHVybiB0LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZmlyc3RHcmFwaGljO2lmKCF0KXt0PXRoaXMuX2ZpcnN0R3JhcGhpYz10aGlzLl9idWlsZEdyYXBoaWModGhpcy5fcGFyc2VkWE1MKSx0aGlzLl9mcmVlZEdyYXBoaWNzLnB1c2godCksdGhpcy5fYm91bmRpbmdSZWN0PXRoaXMuX2ZpcnN0R3JhcGhpYy5ib3VuZGluZ1JlY3QuY2xvbmUoKTt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT1bXSxuPXl0KCk7cmV0dXJuIEUodCwoZnVuY3Rpb24odCl7aWYobnVsbD09dC5uYW1lZEZyb20pe3ZhciBpPW5ldyBGXyh0Lm5hbWUsdC5lbCk7ZS5wdXNoKGkpLG4uc2V0KHQubmFtZSxpKX19KSkse3JlZ2lvbnM6ZSxyZWdpb25zTWFwOm59fSh0Lm5hbWVkKSxuPWUucmVnaW9ucyxpPWUucmVnaW9uc01hcDt0aGlzLl9yZWdpb25zPW4sdGhpcy5fcmVnaW9uc01hcD1pfXJldHVybntib3VuZGluZ1JlY3Q6dGhpcy5fYm91bmRpbmdSZWN0LHJlZ2lvbnM6dGhpcy5fcmVnaW9ucyxyZWdpb25zTWFwOnRoaXMuX3JlZ2lvbnNNYXB9fSx0LnByb3RvdHlwZS5fYnVpbGRHcmFwaGljPWZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyO3RyeXtsdChudWxsIT0obj0oZT10JiYoaT10LHI9e2lnbm9yZVZpZXdCb3g6ITAsaWdub3JlUm9vdENsaXA6ITB9LChuZXcgeVQpLnBhcnNlKGkscikpfHx7fSkucm9vdCkpfWNhdGNoKHQpe3Rocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdmcgZm9ybWF0XG4iK3QubWVzc2FnZSl9dmFyIG89bmV3IEJyO28uYWRkKG4pLG8uaXNHZW9TVkdHcmFwaGljUm9vdD0hMDt2YXIgYT1lLndpZHRoLHM9ZS5oZWlnaHQsbD1lLnZpZXdCb3hSZWN0LHU9dGhpcy5fYm91bmRpbmdSZWN0O2lmKCF1KXt2YXIgaD12b2lkIDAsYz12b2lkIDAscD12b2lkIDAsZD12b2lkIDA7aWYobnVsbCE9YT8oaD0wLHA9YSk6bCYmKGg9bC54LHA9bC53aWR0aCksbnVsbCE9cz8oYz0wLGQ9cyk6bCYmKGM9bC55LGQ9bC5oZWlnaHQpLG51bGw9PWh8fG51bGw9PWMpe3ZhciBmPW4uZ2V0Qm91bmRpbmdSZWN0KCk7bnVsbD09aCYmKGg9Zi54LHA9Zi53aWR0aCksbnVsbD09YyYmKGM9Zi55LGQ9Zi5oZWlnaHQpfXU9dGhpcy5fYm91bmRpbmdSZWN0PW5ldyB6ZShoLGMscCxkKX1pZihsKXt2YXIgZz1MVChsLHUpO24uc2NhbGVYPW4uc2NhbGVZPWcuc2NhbGUsbi54PWcueCxuLnk9Zy55fW8uc2V0Q2xpcFBhdGgobmV3IFdzKHtzaGFwZTp1LnBsYWluKCl9KSk7dmFyIHk9W107cmV0dXJuIEUoZS5uYW1lZCwoZnVuY3Rpb24odCl7dmFyIGU7bnVsbCE9UFQuZ2V0KHQuc3ZnTm9kZVRhZ0xvd2VyKSYmKHkucHVzaCh0KSwoZT10LmVsKS5zaWxlbnQ9ITEsZS5pc0dyb3VwJiZlLnRyYXZlcnNlKChmdW5jdGlvbih0KXt0LnNpbGVudD0hMX0pKSl9KSkse3Jvb3Q6byxib3VuZGluZ1JlY3Q6dSxuYW1lZDp5fX0sdC5wcm90b3R5cGUudXNlR3JhcGhpYz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl91c2VkR3JhcGhpY01hcCxuPWUuZ2V0KHQpO3JldHVybiBufHwobj10aGlzLl9mcmVlZEdyYXBoaWNzLnBvcCgpfHx0aGlzLl9idWlsZEdyYXBoaWModGhpcy5fcGFyc2VkWE1MKSxlLnNldCh0LG4pLG4pfSx0LnByb3RvdHlwZS5mcmVlR3JhcGhpYz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl91c2VkR3JhcGhpY01hcCxuPWUuZ2V0KHQpO24mJihlLnJlbW92ZUtleSh0KSx0aGlzLl9mcmVlZEdyYXBoaWNzLnB1c2gobikpfSx0fSgpO2Zvcih2YXIgUlQ9WzEyNiwyNV0sTlQ9IuWNl+a1t+ivuOWymyIsRVQ9W1tbMCwzLjVdLFs3LDExLjJdLFsxNSwxMS45XSxbMzAsN10sWzQyLC43XSxbNTIsLjddLFs1Niw3LjddLFs1OSwuN10sWzY0LC43XSxbNjQsMF0sWzUsMF0sWzAsMy41XV0sW1sxMywxNi4xXSxbMTksMTQuN10sWzE2LDIxLjddLFsxMSwyMy4xXSxbMTMsMTYuMV1dLFtbMTIsMzIuMl0sWzE0LDM4LjVdLFsxNSwzOC41XSxbMTMsMzIuMl0sWzEyLDMyLjJdXSxbWzE2LDQ3LjZdLFsxMiw1My4yXSxbMTMsNTMuMl0sWzE4LDQ3LjZdLFsxNiw0Ny42XV0sW1s2LDY0LjRdLFs4LDcwXSxbOSw3MF0sWzgsNjQuNF0sWzYsNjQuNF1dLFtbMjMsODIuNl0sWzI5LDc5LjhdLFszMCw3OS44XSxbMjUsODIuNl0sWzIzLDgyLjZdXSxbWzM3LDcwLjddLFs0Myw2Mi4zXSxbNDQsNjIuM10sWzM5LDcwLjddLFszNyw3MC43XV0sW1s0OCw1MS4xXSxbNTEsNDUuNV0sWzUzLDQ1LjVdLFs1MCw1MS4xXSxbNDgsNTEuMV1dLFtbNTEsMzVdLFs1MSwyOC43XSxbNTMsMjguN10sWzUzLDM1XSxbNTEsMzVdXSxbWzUyLDIyLjRdLFs1NSwxNy41XSxbNTYsMTcuNV0sWzUzLDIyLjRdLFs1MiwyMi40XV0sW1s1OCwxMi42XSxbNjIsN10sWzYzLDddLFs2MCwxMi42XSxbNTgsMTIuNl1dLFtbMCwzLjVdLFswLDkzLjFdLFs2NCw5My4xXSxbNjQsMF0sWzYzLDBdLFs2Myw5Mi40XSxbMSw5Mi40XSxbMSwzLjVdLFswLDMuNV1dXSx6VD0wO3pUPEVULmxlbmd0aDt6VCsrKWZvcih2YXIgVlQ9MDtWVDxFVFt6VF0ubGVuZ3RoO1ZUKyspRVRbelRdW1ZUXVswXS89MTAuNSxFVFt6VF1bVlRdWzFdLz0tMTQsRVRbelRdW1ZUXVswXSs9UlRbMF0sRVRbelRdW1ZUXVsxXSs9UlRbMV07dmFyIEJUPXsi5Y2X5rW36K+45bKbIjpbMzIsODBdLCLlub/kuJwiOlswLC0xMF0sIummmea4ryI6WzEwLDVdLCLmvrPpl6giOlstMTAsMTBdLCLlpKnmtKUiOls1LDVdfTt2YXIgRlQ9W1tbMTIzLjQ1MTY1MjUyNjg1NTQ3LDI1LjczNTI3MTY0NDAyMjYxXSxbMTIzLjQ5NzMxNDQ1MzEyNDk5LDI1LjczNTI3MTY0NDAyMjYxXSxbMTIzLjQ5NzMxNDQ1MzEyNDk5LDI1Ljc1MDczNDA2NDYwMDg4NF0sWzEyMy40NTE2NTI1MjY4NTU0NywyNS43NTA3MzQwNjQ2MDA4ODRdLFsxMjMuNDUxNjUyNTI2ODU1NDcsMjUuNzM1MjcxNjQ0MDIyNjFdXV07dmFyIEdUPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIGk7dGhpcy50eXBlPSJnZW9KU09OIix0aGlzLl9wYXJzZWRNYXA9eXQoKSx0aGlzLl9tYXBOYW1lPXQsdGhpcy5fc3BlY2lhbEFyZWFzPW4sdGhpcy5fZ2VvSlNPTj1VKGk9ZSk/InVuZGVmaW5lZCIhPXR5cGVvZiBKU09OJiZKU09OLnBhcnNlP0pTT04ucGFyc2UoaSk6bmV3IEZ1bmN0aW9uKCJyZXR1cm4gKCIraSsiKTsiKSgpOml9cmV0dXJuIHQucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24odCxlKXtlPWV8fCJuYW1lIjt2YXIgbj10aGlzLl9wYXJzZWRNYXAuZ2V0KGUpO2lmKCFuKXt2YXIgaT10aGlzLl9wYXJzZVRvUmVnaW9ucyhlKTtuPXRoaXMuX3BhcnNlZE1hcC5zZXQoZSx7cmVnaW9uczppLGJvdW5kaW5nUmVjdDpXVChpKX0pfXZhciByPXl0KCksbz1bXTtyZXR1cm4gRShuLnJlZ2lvbnMsKGZ1bmN0aW9uKGUpe3ZhciBuPWUubmFtZTt0JiZfdCh0LG4pJiYoZT1lLmNsb25lU2hhbGxvdyhuPXRbbl0pKSxvLnB1c2goZSksci5zZXQobixlKX0pKSx7cmVnaW9uczpvLGJvdW5kaW5nUmVjdDpuLmJvdW5kaW5nUmVjdHx8bmV3IHplKDAsMCwwLDApLHJlZ2lvbnNNYXA6cn19LHQucHJvdG90eXBlLl9wYXJzZVRvUmVnaW9ucz1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMuX21hcE5hbWUsaT10aGlzLl9nZW9KU09OO3RyeXtlPWk/SF8oaSx0KTpbXX1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZ2VvSnNvbiBmb3JtYXRcbiIrdC5tZXNzYWdlKX1yZXR1cm4gZnVuY3Rpb24odCxlKXtpZigiY2hpbmEiPT09dCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoZVtuXS5uYW1lPT09TlQpcmV0dXJuO2UucHVzaChuZXcgQl8oTlQseihFVCwoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6InBvbHlnb24iLGV4dGVyaW9yOnR9fSkpLFJUKSl9fShuLGUpLEUoZSwoZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lOyFmdW5jdGlvbih0LGUpe2lmKCJjaGluYSI9PT10KXt2YXIgbj1CVFtlLm5hbWVdO2lmKG4pe3ZhciBpPWUuZ2V0Q2VudGVyKCk7aVswXSs9blswXS8xMC41LGlbMV0rPS1uWzFdLzE0LGUuc2V0Q2VudGVyKGkpfX19KG4sdCksZnVuY3Rpb24odCxlKXsiY2hpbmEiPT09dCYmIuWPsOa5viI9PT1lLm5hbWUmJmUuZ2VvbWV0cmllcy5wdXNoKHt0eXBlOiJwb2x5Z29uIixleHRlcmlvcjpGVFswXX0pfShuLHQpO3ZhciBpPXRoaXMuX3NwZWNpYWxBcmVhcyYmdGhpcy5fc3BlY2lhbEFyZWFzW2VdO2kmJnQudHJhbnNmb3JtVG8oaS5sZWZ0LGkudG9wLGkud2lkdGgsaS5oZWlnaHQpfSksdGhpcyksZX0sdC5wcm90b3R5cGUuZ2V0TWFwRm9yVXNlcj1mdW5jdGlvbigpe3JldHVybntnZW9Kc29uOnRoaXMuX2dlb0pTT04sZ2VvSlNPTjp0aGlzLl9nZW9KU09OLHNwZWNpYWxBcmVhczp0aGlzLl9zcGVjaWFsQXJlYXN9fSx0fSgpO2Z1bmN0aW9uIFdUKHQpe2Zvcih2YXIgZSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl0uZ2V0Qm91bmRpbmdSZWN0KCk7KGU9ZXx8aS5jbG9uZSgpKS51bmlvbihpKX1yZXR1cm4gZX12YXIgSFQ9eXQoKSxZVD1mdW5jdGlvbih0LGUsbil7aWYoZS5zdmcpe3ZhciBpPW5ldyBPVCh0LGUuc3ZnKTtIVC5zZXQodCxpKX1lbHNle3ZhciByPWUuZ2VvSnNvbnx8ZS5nZW9KU09OO3ImJiFlLmZlYXR1cmVzP249ZS5zcGVjaWFsQXJlYXM6cj1lO2k9bmV3IEdUKHQscixuKTtIVC5zZXQodCxpKX19LFhUPWZ1bmN0aW9uKHQpe3JldHVybiBIVC5nZXQodCl9LFVUPWZ1bmN0aW9uKHQpe3ZhciBlPUhULmdldCh0KTtyZXR1cm4gZSYmImdlb0pTT04iPT09ZS50eXBlJiZlLmdldE1hcEZvclVzZXIoKX0sWlQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPUhULmdldCh0KTtpZihpKXJldHVybiBpLmxvYWQoZSxuKX0salQ9WyJyZWN0IiwiY2lyY2xlIiwibGluZSIsImVsbGlwc2UiLCJwb2x5Z29uIiwicG9seWxpbmUiLCJwYXRoIl0scVQ9eXQoalQpLEtUPXl0KGpULmNvbmNhdChbImciXSkpLCRUPXl0KGpULmNvbmNhdChbImciXSkpLEpUPVZvKCk7ZnVuY3Rpb24gUVQodCl7dmFyIGU9dC5nZXRJdGVtU3R5bGUoKSxuPXQuZ2V0KCJhcmVhQ29sb3IiKTtyZXR1cm4gbnVsbCE9biYmKGUuZmlsbD1uKSxlfWZ1bmN0aW9uIHRDKHQpe3ZhciBlPXQuc3R5bGU7ZSYmKGUuc3Ryb2tlPWUuc3Ryb2tlfHxlLmZpbGwsZS5maWxsPW51bGwpfXZhciBlQz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9bmV3IEJyO3RoaXMudWlkPUFjKCJlY19tYXBfZHJhdyIpLHRoaXMuX2NvbnRyb2xsZXI9bmV3IG5UKHQuZ2V0WnIoKSksdGhpcy5fY29udHJvbGxlckhvc3Q9e3RhcmdldDplfSx0aGlzLmdyb3VwPWUsZS5hZGQodGhpcy5fcmVnaW9uc0dyb3VwPW5ldyBCciksZS5hZGQodGhpcy5fc3ZnR3JvdXA9bmV3IEJyKX1yZXR1cm4gdC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPSJnZW8iPT09dC5tYWluVHlwZSxhPXQuZ2V0RGF0YSYmdC5nZXREYXRhKCk7byYmZS5lYWNoQ29tcG9uZW50KHttYWluVHlwZToic2VyaWVzIixzdWJUeXBlOiJtYXAifSwoZnVuY3Rpb24oZSl7YXx8ZS5nZXRIb3N0R2VvTW9kZWwoKSE9PXR8fChhPWUuZ2V0RGF0YSgpKX0pKTt2YXIgcz10LmNvb3JkaW5hdGVTeXN0ZW0sbD10aGlzLl9yZWdpb25zR3JvdXAsdT10aGlzLmdyb3VwLGg9cy5nZXRUcmFuc2Zvcm1JbmZvKCksYz1oLnJhdyxwPWgucm9hbTshbC5jaGlsZEF0KDApfHxyPyh1Lng9cC54LHUueT1wLnksdS5zY2FsZVg9cC5zY2FsZVgsdS5zY2FsZVk9cC5zY2FsZVksdS5kaXJ0eSgpKTp2aCh1LHAsdCk7dmFyIGQ9YSYmYS5nZXRWaXN1YWwoInZpc3VhbE1ldGEiKSYmYS5nZXRWaXN1YWwoInZpc3VhbE1ldGEiKS5sZW5ndGg+MCxmPXthcGk6bixnZW86cyxtYXBPckdlb01vZGVsOnQsZGF0YTphLGlzVmlzdWFsRW5jb2RlZEJ5VmlzdWFsTWFwOmQsaXNHZW86byx0cmFuc2Zvcm1JbmZvUmF3OmN9OyJnZW9KU09OIj09PXMucmVzb3VyY2VUeXBlP3RoaXMuX2J1aWxkR2VvSlNPTihmKToiZ2VvU1ZHIj09PXMucmVzb3VyY2VUeXBlJiZ0aGlzLl9idWlsZFNWRyhmKSx0aGlzLl91cGRhdGVDb250cm9sbGVyKHQsZSxuKSx0aGlzLl91cGRhdGVNYXBTZWxlY3RIYW5kbGVyKHQsbCxuLGkpfSx0LnByb3RvdHlwZS5fYnVpbGRHZW9KU09OPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlZ2lvbnNHcm91cEJ5TmFtZT15dCgpLG49eXQoKSxpPXRoaXMuX3JlZ2lvbnNHcm91cCxyPXQudHJhbnNmb3JtSW5mb1JhdyxvPXQubWFwT3JHZW9Nb2RlbCxhPXQuZGF0YSxzPXQuZ2VvLnByb2plY3Rpb24sbD1zJiZzLnN0cmVhbTtmdW5jdGlvbiB1KHQsZSl7cmV0dXJuIGUmJih0PWUodCkpLHQmJlt0WzBdKnIuc2NhbGVYK3IueCx0WzFdKnIuc2NhbGVZK3IueV19ZnVuY3Rpb24gaCh0KXtmb3IodmFyIGU9W10sbj0hbCYmcyYmcy5wcm9qZWN0LGk9MDtpPHQubGVuZ3RoOysraSl7dmFyIHI9dSh0W2ldLG4pO3ImJmUucHVzaChyKX1yZXR1cm4gZX1mdW5jdGlvbiBjKHQpe3JldHVybntzaGFwZTp7cG9pbnRzOmgodCl9fX1pLnJlbW92ZUFsbCgpLEUodC5nZW8ucmVnaW9ucywoZnVuY3Rpb24ocil7dmFyIGg9ci5uYW1lLHA9ZS5nZXQoaCksZD1uLmdldChoKXx8e30sZj1kLmRhdGFJZHgsZz1kLnJlZ2lvbk1vZGVsO3B8fChwPWUuc2V0KGgsbmV3IEJyKSxpLmFkZChwKSxmPWE/YS5pbmRleE9mTmFtZShoKTpudWxsLGc9dC5pc0dlbz9vLmdldFJlZ2lvbk1vZGVsKGgpOmE/YS5nZXRJdGVtTW9kZWwoZik6bnVsbCxuLnNldChoLHtkYXRhSWR4OmYscmVnaW9uTW9kZWw6Z30pKTt2YXIgeT1bXSx2PVtdO0Uoci5nZW9tZXRyaWVzLChmdW5jdGlvbih0KXtpZigicG9seWdvbiI9PT10LnR5cGUpe3ZhciBlPVt0LmV4dGVyaW9yXS5jb25jYXQodC5pbnRlcmlvcnN8fFtdKTtsJiYoZT1zQyhlLGwpKSxFKGUsKGZ1bmN0aW9uKHQpe3kucHVzaChuZXcgWHUoYyh0KSkpfSkpfWVsc2V7dmFyIG49dC5wb2ludHM7bCYmKG49c0MobixsLCEwKSksRShuLChmdW5jdGlvbih0KXt2LnB1c2gobmV3IFp1KGModCkpKX0pKX19KSk7dmFyIG09dShyLmdldENlbnRlcigpLHMmJnMucHJvamVjdCk7ZnVuY3Rpb24geChlLG4pe2lmKGUubGVuZ3RoKXt2YXIgaT1uZXcgaWgoe2N1bGxpbmc6ITAsc2VnbWVudElnbm9yZVRocmVzaG9sZDoxLHNoYXBlOntwYXRoczplfX0pO3AuYWRkKGkpLG5DKHQsaSxmLGcpLGlDKHQsaSxoLGcsbyxmLG0pLG4mJih0QyhpKSxFKGkuc3RhdGVzLHRDKSl9fXgoeSkseCh2LCEwKX0pKSxlLmVhY2goKGZ1bmN0aW9uKGUsaSl7dmFyIHI9bi5nZXQoaSksYT1yLmRhdGFJZHgscz1yLnJlZ2lvbk1vZGVsO3JDKHQsZSxpLHMsbyxhKSxvQyh0LGUsaSxzLG8pLGFDKHQsZSxpLHMsbyl9KSx0aGlzKX0sdC5wcm90b3R5cGUuX2J1aWxkU1ZHPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2VvLm1hcCxuPXQudHJhbnNmb3JtSW5mb1Jhdzt0aGlzLl9zdmdHcm91cC54PW4ueCx0aGlzLl9zdmdHcm91cC55PW4ueSx0aGlzLl9zdmdHcm91cC5zY2FsZVg9bi5zY2FsZVgsdGhpcy5fc3ZnR3JvdXAuc2NhbGVZPW4uc2NhbGVZLHRoaXMuX3N2Z1Jlc291cmNlQ2hhbmdlZChlKSYmKHRoaXMuX2ZyZWVTVkcoKSx0aGlzLl91c2VTVkcoZSkpO3ZhciBpPXRoaXMuX3N2Z0Rpc3BhdGNoZXJNYXA9eXQoKSxyPSExO0UodGhpcy5fc3ZnR3JhcGhpY1JlY29yZC5uYW1lZCwoZnVuY3Rpb24oZSl7dmFyIG49ZS5uYW1lLG89dC5tYXBPckdlb01vZGVsLGE9dC5kYXRhLHM9ZS5zdmdOb2RlVGFnTG93ZXIsbD1lLmVsLHU9YT9hLmluZGV4T2ZOYW1lKG4pOm51bGwsaD1vLmdldFJlZ2lvbk1vZGVsKG4pOyhudWxsIT1xVC5nZXQocykmJmwgaW5zdGFuY2VvZiBEYSYmbkModCxsLHUsaCksbCBpbnN0YW5jZW9mIERhJiYobC5jdWxsaW5nPSEwKSxsLnoyRW1waGFzaXNMaWZ0PTAsZS5uYW1lZEZyb20pfHwobnVsbCE9JFQuZ2V0KHMpJiZpQyh0LGwsbixoLG8sdSxudWxsKSxyQyh0LGwsbixoLG8sdSksb0ModCxsLG4saCxvKSxudWxsIT1LVC5nZXQocykmJigic2VsZiI9PT1hQyh0LGwsbixoLG8pJiYocj0hMCksKGkuZ2V0KG4pfHxpLnNldChuLFtdKSkucHVzaChsKSkpfSksdGhpcyksdGhpcy5fZW5hYmxlQmx1ckVudGlyZVNWRyhyLHQpfSx0LnByb3RvdHlwZS5fZW5hYmxlQmx1ckVudGlyZVNWRz1mdW5jdGlvbih0LGUpe2lmKHQmJmUuaXNHZW8pe3ZhciBuPWUubWFwT3JHZW9Nb2RlbC5nZXRNb2RlbChbImJsdXIiLCJpdGVtU3R5bGUiXSkuZ2V0SXRlbVN0eWxlKCkub3BhY2l0eTt0aGlzLl9zdmdHcmFwaGljUmVjb3JkLnJvb3QudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe2lmKCF0LmlzR3JvdXApe2tsKHQpO3ZhciBlPXQuZW5zdXJlU3RhdGUoImJsdXIiKS5zdHlsZXx8e307bnVsbD09ZS5vcGFjaXR5JiZudWxsIT1uJiYoZS5vcGFjaXR5PW4pLHQuZW5zdXJlU3RhdGUoImVtcGhhc2lzIil9fSkpfX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5fcmVnaW9uc0dyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX3JlZ2lvbnNHcm91cEJ5TmFtZT1udWxsLHRoaXMuX3N2Z0dyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2ZyZWVTVkcoKSx0aGlzLl9jb250cm9sbGVyLmRpc3Bvc2UoKSx0aGlzLl9jb250cm9sbGVySG9zdD1udWxsfSx0LnByb3RvdHlwZS5maW5kSGlnaERvd25EaXNwYXRjaGVycz1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXQpcmV0dXJuW107dmFyIG49ZS5jb29yZGluYXRlU3lzdGVtO2lmKCJnZW9KU09OIj09PW4ucmVzb3VyY2VUeXBlKXt2YXIgaT10aGlzLl9yZWdpb25zR3JvdXBCeU5hbWU7aWYoaSl7dmFyIHI9aS5nZXQodCk7cmV0dXJuIHI/W3JdOltdfX1lbHNlIGlmKCJnZW9TVkciPT09bi5yZXNvdXJjZVR5cGUpcmV0dXJuIHRoaXMuX3N2Z0Rpc3BhdGNoZXJNYXAmJnRoaXMuX3N2Z0Rpc3BhdGNoZXJNYXAuZ2V0KHQpfHxbXX0sdC5wcm90b3R5cGUuX3N2Z1Jlc291cmNlQ2hhbmdlZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc3ZnTWFwTmFtZSE9PXR9LHQucHJvdG90eXBlLl91c2VTVkc9ZnVuY3Rpb24odCl7dmFyIGU9WFQodCk7aWYoZSYmImdlb1NWRyI9PT1lLnR5cGUpe3ZhciBuPWUudXNlR3JhcGhpYyh0aGlzLnVpZCk7dGhpcy5fc3ZnR3JvdXAuYWRkKG4ucm9vdCksdGhpcy5fc3ZnR3JhcGhpY1JlY29yZD1uLHRoaXMuX3N2Z01hcE5hbWU9dH19LHQucHJvdG90eXBlLl9mcmVlU1ZHPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3ZnTWFwTmFtZTtpZihudWxsIT10KXt2YXIgZT1YVCh0KTtlJiYiZ2VvU1ZHIj09PWUudHlwZSYmZS5mcmVlR3JhcGhpYyh0aGlzLnVpZCksdGhpcy5fc3ZnR3JhcGhpY1JlY29yZD1udWxsLHRoaXMuX3N2Z0Rpc3BhdGNoZXJNYXA9bnVsbCx0aGlzLl9zdmdHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9zdmdNYXBOYW1lPW51bGx9fSx0LnByb3RvdHlwZS5fdXBkYXRlQ29udHJvbGxlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5jb29yZGluYXRlU3lzdGVtLHI9dGhpcy5fY29udHJvbGxlcixvPXRoaXMuX2NvbnRyb2xsZXJIb3N0O28uem9vbUxpbWl0PXQuZ2V0KCJzY2FsZUxpbWl0Iiksby56b29tPWkuZ2V0Wm9vbSgpLHIuZW5hYmxlKHQuZ2V0KCJyb2FtIil8fCExKTt2YXIgYT10Lm1haW5UeXBlO2Z1bmN0aW9uIHMoKXt2YXIgZT17dHlwZToiZ2VvUm9hbSIsY29tcG9uZW50VHlwZTphfTtyZXR1cm4gZVthKyJJZCJdPXQuaWQsZX1yLm9mZigicGFuIikub24oInBhbiIsKGZ1bmN0aW9uKHQpe3RoaXMuX21vdXNlRG93bkZsYWc9ITEsYVQobyx0LmR4LHQuZHkpLG4uZGlzcGF0Y2hBY3Rpb24oQShzKCkse2R4OnQuZHgsZHk6dC5keSxhbmltYXRpb246e2R1cmF0aW9uOjB9fSkpfSksdGhpcyksci5vZmYoInpvb20iKS5vbigiem9vbSIsKGZ1bmN0aW9uKHQpe3RoaXMuX21vdXNlRG93bkZsYWc9ITEsc1Qobyx0LnNjYWxlLHQub3JpZ2luWCx0Lm9yaWdpblkpLG4uZGlzcGF0Y2hBY3Rpb24oQShzKCkse3RvdGFsWm9vbTpvLnpvb20sem9vbTp0LnNjYWxlLG9yaWdpblg6dC5vcmlnaW5YLG9yaWdpblk6dC5vcmlnaW5ZLGFuaW1hdGlvbjp7ZHVyYXRpb246MH19KSl9KSx0aGlzKSxyLnNldFBvaW50ZXJDaGVja2VyKChmdW5jdGlvbihlLHIsbyl7cmV0dXJuIGkuY29udGFpblBvaW50KFtyLG9dKSYmIWhUKGUsbix0KX0pKX0sdC5wcm90b3R5cGUucmVzZXRGb3JMYWJlbExheW91dD1mdW5jdGlvbigpe3RoaXMuZ3JvdXAudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0VGV4dENvbnRlbnQoKTtlJiYoZS5pZ25vcmU9SlQoZSkuaWdub3JlKX0pKX0sdC5wcm90b3R5cGUuX3VwZGF0ZU1hcFNlbGVjdEhhbmRsZXI9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcztlLm9mZigibW91c2Vkb3duIiksZS5vZmYoImNsaWNrIiksdC5nZXQoInNlbGVjdGVkTW9kZSIpJiYoZS5vbigibW91c2Vkb3duIiwoZnVuY3Rpb24oKXtyLl9tb3VzZURvd25GbGFnPSEwfSkpLGUub24oImNsaWNrIiwoZnVuY3Rpb24odCl7ci5fbW91c2VEb3duRmxhZyYmKHIuX21vdXNlRG93bkZsYWc9ITEpfSkpKX0sdH0oKTtmdW5jdGlvbiBuQyh0LGUsbixpKXt2YXIgcj1pLmdldE1vZGVsKCJpdGVtU3R5bGUiKSxvPWkuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsIml0ZW1TdHlsZSJdKSxhPWkuZ2V0TW9kZWwoWyJibHVyIiwiaXRlbVN0eWxlIl0pLHM9aS5nZXRNb2RlbChbInNlbGVjdCIsIml0ZW1TdHlsZSJdKSxsPVFUKHIpLHU9UVQobyksaD1RVChzKSxjPVFUKGEpLHA9dC5kYXRhO2lmKHApe3ZhciBkPXAuZ2V0SXRlbVZpc3VhbChuLCJzdHlsZSIpLGY9cC5nZXRJdGVtVmlzdWFsKG4sImRlY2FsIik7dC5pc1Zpc3VhbEVuY29kZWRCeVZpc3VhbE1hcCYmZC5maWxsJiYobC5maWxsPWQuZmlsbCksZiYmKGwuZGVjYWw9bXYoZix0LmFwaSkpfWUuc2V0U3R5bGUobCksZS5zdHlsZS5zdHJva2VOb1NjYWxlPSEwLGUuZW5zdXJlU3RhdGUoImVtcGhhc2lzIikuc3R5bGU9dSxlLmVuc3VyZVN0YXRlKCJzZWxlY3QiKS5zdHlsZT1oLGUuZW5zdXJlU3RhdGUoImJsdXIiKS5zdHlsZT1jLGtsKGUpfWZ1bmN0aW9uIGlDKHQsZSxuLGkscixvLGEpe3ZhciBzPXQuZGF0YSxsPXQuaXNHZW8sdT1zJiZpc05hTihzLmdldChzLm1hcERpbWVuc2lvbigidmFsdWUiKSxvKSksaD1zJiZzLmdldEl0ZW1MYXlvdXQobyk7aWYobHx8dXx8aCYmaC5zaG93TGFiZWwpe3ZhciBjPWw/bjpvLHA9dm9pZCAwOyghc3x8bz49MCkmJihwPXIpO3ZhciBkPWE/e25vcm1hbDp7YWxpZ246ImNlbnRlciIsdmVydGljYWxBbGlnbjoibWlkZGxlIn19Om51bGw7aWMoZSxyYyhpKSx7bGFiZWxGZXRjaGVyOnAsbGFiZWxEYXRhSW5kZXg6YyxkZWZhdWx0VGV4dDpufSxkKTt2YXIgZj1lLmdldFRleHRDb250ZW50KCk7aWYoZiYmKEpUKGYpLmlnbm9yZT1mLmlnbm9yZSxlLnRleHRDb25maWcmJmEpKXt2YXIgZz1lLmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7ZS50ZXh0Q29uZmlnLmxheW91dFJlY3Q9ZyxlLnRleHRDb25maWcucG9zaXRpb249WyhhWzBdLWcueCkvZy53aWR0aCoxMDArIiUiLChhWzFdLWcueSkvZy5oZWlnaHQqMTAwKyIlIl19ZS5kaXNhYmxlTGFiZWxBbmltYXRpb249ITB9ZWxzZSBlLnJlbW92ZVRleHRDb250ZW50KCksZS5yZW1vdmVUZXh0Q29uZmlnKCksZS5kaXNhYmxlTGFiZWxBbmltYXRpb249bnVsbH1mdW5jdGlvbiByQyh0LGUsbixpLHIsbyl7dC5kYXRhP3QuZGF0YS5zZXRJdGVtR3JhcGhpY0VsKG8sZSk6cmwoZSkuZXZlbnREYXRhPXtjb21wb25lbnRUeXBlOiJnZW8iLGNvbXBvbmVudEluZGV4OnIuY29tcG9uZW50SW5kZXgsZ2VvSW5kZXg6ci5jb21wb25lbnRJbmRleCxuYW1lOm4scmVnaW9uOmkmJmkub3B0aW9ufHx7fX19ZnVuY3Rpb24gb0ModCxlLG4saSxyKXt0LmRhdGF8fEtoKHtlbDplLGNvbXBvbmVudE1vZGVsOnIsaXRlbU5hbWU6bixpdGVtVG9vbHRpcE9wdGlvbjppLmdldCgidG9vbHRpcCIpfSl9ZnVuY3Rpb24gYUModCxlLG4saSxyKXtlLmhpZ2hEb3duU2lsZW50T25Ub3VjaD0hIXIuZ2V0KCJzZWxlY3RlZE1vZGUiKTt2YXIgbz1pLmdldE1vZGVsKCJlbXBoYXNpcyIpLGE9by5nZXQoImZvY3VzIik7cmV0dXJuIFpsKGUsYSxvLmdldCgiYmx1clNjb3BlIiksby5nZXQoImRpc2FibGVkIikpLHQuaXNHZW8mJmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1ybCh0KTtpLmNvbXBvbmVudE1haW5UeXBlPWUubWFpblR5cGUsaS5jb21wb25lbnRJbmRleD1lLmNvbXBvbmVudEluZGV4LGkuY29tcG9uZW50SGlnaERvd25OYW1lPW59KGUscixuKSxhfWZ1bmN0aW9uIHNDKHQsZSxuKXt2YXIgaSxyPVtdO2Z1bmN0aW9uIG8oKXtpPVtdfWZ1bmN0aW9uIGEoKXtpLmxlbmd0aCYmKHIucHVzaChpKSxpPVtdKX12YXIgcz1lKHtwb2x5Z29uU3RhcnQ6byxwb2x5Z29uRW5kOmEsbGluZVN0YXJ0Om8sbGluZUVuZDphLHBvaW50OmZ1bmN0aW9uKHQsZSl7aXNGaW5pdGUodCkmJmlzRmluaXRlKGUpJiZpLnB1c2goW3QsZV0pfSxzcGhlcmU6ZnVuY3Rpb24oKXt9fSk7cmV0dXJuIW4mJnMucG9seWdvblN0YXJ0KCksRSh0LChmdW5jdGlvbih0KXtzLmxpbmVTdGFydCgpO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXMucG9pbnQodFtlXVswXSx0W2VdWzFdKTtzLmxpbmVFbmQoKX0pKSwhbiYmcy5wb2x5Z29uRW5kKCkscn12YXIgbEM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKCFpfHwibWFwVG9nZ2xlU2VsZWN0IiE9PWkudHlwZXx8aS5mcm9tIT09dGhpcy51aWQpe3ZhciByPXRoaXMuZ3JvdXA7aWYoci5yZW1vdmVBbGwoKSwhdC5nZXRIb3N0R2VvTW9kZWwoKSl7aWYodGhpcy5fbWFwRHJhdyYmaSYmImdlb1JvYW0iPT09aS50eXBlJiZ0aGlzLl9tYXBEcmF3LnJlc2V0Rm9yTGFiZWxMYXlvdXQoKSxpJiYiZ2VvUm9hbSI9PT1pLnR5cGUmJiJzZXJpZXMiPT09aS5jb21wb25lbnRUeXBlJiZpLnNlcmllc0lkPT09dC5pZCkobz10aGlzLl9tYXBEcmF3KSYmci5hZGQoby5ncm91cCk7ZWxzZSBpZih0Lm5lZWRzRHJhd01hcCl7dmFyIG89dGhpcy5fbWFwRHJhd3x8bmV3IGVDKG4pO3IuYWRkKG8uZ3JvdXApLG8uZHJhdyh0LGUsbix0aGlzLGkpLHRoaXMuX21hcERyYXc9b31lbHNlIHRoaXMuX21hcERyYXcmJnRoaXMuX21hcERyYXcucmVtb3ZlKCksdGhpcy5fbWFwRHJhdz1udWxsO3QuZ2V0KCJzaG93TGVnZW5kU3ltYm9sIikmJmUuZ2V0Q29tcG9uZW50KCJsZWdlbmQiKSYmdGhpcy5fcmVuZGVyU3ltYm9scyh0LGUsbil9fX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKSx0aGlzLl9tYXBEcmF3PW51bGwsdGhpcy5ncm91cC5yZW1vdmVBbGwoKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX21hcERyYXcmJnRoaXMuX21hcERyYXcucmVtb3ZlKCksdGhpcy5fbWFwRHJhdz1udWxsfSxlLnByb3RvdHlwZS5fcmVuZGVyU3ltYm9scz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5vcmlnaW5hbERhdGEscj10aGlzLmdyb3VwO2kuZWFjaChpLm1hcERpbWVuc2lvbigidmFsdWUiKSwoZnVuY3Rpb24oZSxuKXtpZighaXNOYU4oZSkpe3ZhciBvPWkuZ2V0SXRlbUxheW91dChuKTtpZihvJiZvLnBvaW50KXt2YXIgYT1vLnBvaW50LHM9by5vZmZzZXQsbD1uZXcgU3Uoe3N0eWxlOntmaWxsOnQuZ2V0RGF0YSgpLmdldFZpc3VhbCgic3R5bGUiKS5maWxsfSxzaGFwZTp7Y3g6YVswXSs5KnMsY3k6YVsxXSxyOjN9LHNpbGVudDohMCx6Mjo4KyhzPzA6MTEpfSk7aWYoIXMpe3ZhciB1PXQubWFpblNlcmllcy5nZXREYXRhKCksaD1pLmdldE5hbWUobiksYz11LmluZGV4T2ZOYW1lKGgpLHA9aS5nZXRJdGVtTW9kZWwobiksZD1wLmdldE1vZGVsKCJsYWJlbCIpLGY9dS5nZXRJdGVtR3JhcGhpY0VsKGMpO2ljKGwscmMocCkse2xhYmVsRmV0Y2hlcjp7Z2V0Rm9ybWF0dGVkTGFiZWw6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5nZXRGb3JtYXR0ZWRMYWJlbChjLG4pfX0sZGVmYXVsdFRleHQ6aH0pLGwuZGlzYWJsZUxhYmVsQW5pbWF0aW9uPSEwLGQuZ2V0KCJwb3NpdGlvbiIpfHxsLnNldFRleHRDb25maWcoe3Bvc2l0aW9uOiJib3R0b20ifSksZi5vbkhvdmVyU3RhdGVDaGFuZ2U9ZnVuY3Rpb24odCl7RGwobCx0KX19ci5hZGQobCl9fX0pKX0sZS50eXBlPSJtYXAiLGV9KE9nKSx1Qz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4ubmVlZHNEcmF3TWFwPSExLG4uc2VyaWVzR3JvdXA9W10sbi5nZXRUb29sdGlwUG9zaXRpb249ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dGhpcy5nZXREYXRhKCkuZ2V0TmFtZSh0KSxuPXRoaXMuY29vcmRpbmF0ZVN5c3RlbSxpPW4uZ2V0UmVnaW9uKGUpO3JldHVybiBpJiZuLmRhdGFUb1BvaW50KGkuZ2V0Q2VudGVyKCkpfX0sbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1STSh0aGlzLHtjb29yZERpbWVuc2lvbnM6WyJ2YWx1ZSJdLGVuY29kZURlZmF1bHRlcjpIKGVkLHRoaXMpfSksbj15dCgpLGk9W10scj0wLG89ZS5jb3VudCgpO3I8bztyKyspe3ZhciBhPWUuZ2V0TmFtZShyKTtuLnNldChhLCEwKX1yZXR1cm4gRShaVCh0aGlzLmdldE1hcFR5cGUoKSx0aGlzLm9wdGlvbi5uYW1lTWFwLHRoaXMub3B0aW9uLm5hbWVQcm9wZXJ0eSkucmVnaW9ucywoZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lO24uZ2V0KGUpfHxpLnB1c2goZSl9KSksZS5hcHBlbmRWYWx1ZXMoW10saSksZX0sZS5wcm90b3R5cGUuZ2V0SG9zdEdlb01vZGVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb24uZ2VvSW5kZXg7cmV0dXJuIG51bGwhPXQ/dGhpcy5lY01vZGVsLmdldENvbXBvbmVudCgiZ2VvIix0KTpudWxsfSxlLnByb3RvdHlwZS5nZXRNYXBUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZ2V0SG9zdEdlb01vZGVsKCl8fHRoaXMpLm9wdGlvbi5tYXB9LGUucHJvdG90eXBlLmdldFJhd1ZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YSgpO3JldHVybiBlLmdldChlLm1hcERpbWVuc2lvbigidmFsdWUiKSx0KX0sZS5wcm90b3R5cGUuZ2V0UmVnaW9uTW9kZWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXREYXRhKCk7cmV0dXJuIGUuZ2V0SXRlbU1vZGVsKGUuaW5kZXhPZk5hbWUodCkpfSxlLnByb3RvdHlwZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dGhpcy5nZXREYXRhKCkscj10aGlzLmdldFJhd1ZhbHVlKHQpLG89aS5nZXROYW1lKHQpLGE9dGhpcy5zZXJpZXNHcm91cCxzPVtdLGw9MDtsPGEubGVuZ3RoO2wrKyl7dmFyIHU9YVtsXS5vcmlnaW5hbERhdGEuaW5kZXhPZk5hbWUobyksaD1pLm1hcERpbWVuc2lvbigidmFsdWUiKTtpc05hTihhW2xdLm9yaWdpbmFsRGF0YS5nZXQoaCx1KSl8fHMucHVzaChhW2xdLm5hbWUpfXJldHVybiBvZygic2VjdGlvbiIse2hlYWRlcjpzLmpvaW4oIiwgIiksbm9IZWFkZXI6IXMubGVuZ3RoLGJsb2Nrczpbb2coIm5hbWVWYWx1ZSIse25hbWU6byx2YWx1ZTpyfSldfSl9LGUucHJvdG90eXBlLnNldFpvb209ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uem9vbT10fSxlLnByb3RvdHlwZS5zZXRDZW50ZXI9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uY2VudGVyPXR9LGUucHJvdG90eXBlLmdldExlZ2VuZEljb249ZnVuY3Rpb24odCl7dmFyIGU9dC5pY29ufHwicm91bmRSZWN0IixuPVh5KGUsMCwwLHQuaXRlbVdpZHRoLHQuaXRlbUhlaWdodCx0Lml0ZW1TdHlsZS5maWxsKTtyZXR1cm4gbi5zZXRTdHlsZSh0Lml0ZW1TdHlsZSksbi5zdHlsZS5zdHJva2U9Im5vbmUiLGUuaW5kZXhPZigiZW1wdHkiKT4tMSYmKG4uc3R5bGUuc3Ryb2tlPW4uc3R5bGUuZmlsbCxuLnN0eWxlLmZpbGw9IiNmZmYiLG4uc3R5bGUubGluZVdpZHRoPTIpLG59LGUudHlwZT0ic2VyaWVzLm1hcCIsZS5kZXBlbmRlbmNpZXM9WyJnZW8iXSxlLmxheW91dE1vZGU9ImJveCIsZS5kZWZhdWx0T3B0aW9uPXt6OjIsY29vcmRpbmF0ZVN5c3RlbToiZ2VvIixtYXA6IiIsbGVmdDoiY2VudGVyIix0b3A6ImNlbnRlciIsYXNwZWN0U2NhbGU6bnVsbCxzaG93TGVnZW5kU3ltYm9sOiEwLGJvdW5kaW5nQ29vcmRzOm51bGwsY2VudGVyOm51bGwsem9vbToxLHNjYWxlTGltaXQ6bnVsbCxzZWxlY3RlZE1vZGU6ITAsbGFiZWw6e3Nob3c6ITEsY29sb3I6IiMwMDAifSxpdGVtU3R5bGU6e2JvcmRlcldpZHRoOi41LGJvcmRlckNvbG9yOiIjNDQ0IixhcmVhQ29sb3I6IiNlZWUifSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITAsY29sb3I6InJnYigxMDAsMCwwKSJ9LGl0ZW1TdHlsZTp7YXJlYUNvbG9yOiJyZ2JhKDI1NSwyMTUsMCwwLjgpIn19LHNlbGVjdDp7bGFiZWw6e3Nob3c6ITAsY29sb3I6InJnYigxMDAsMCwwKSJ9LGl0ZW1TdHlsZTp7Y29sb3I6InJnYmEoMjU1LDIxNSwwLDAuOCkifX0sbmFtZVByb3BlcnR5OiJuYW1lIn0sZX0oYmcpO2Z1bmN0aW9uIGhDKHQpe3ZhciBlPXt9O3QuZWFjaFNlcmllc0J5VHlwZSgibWFwIiwoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRIb3N0R2VvTW9kZWwoKSxpPW4/Im8iK24uaWQ6ImkiK3QuZ2V0TWFwVHlwZSgpOyhlW2ldPWVbaV18fFtdKS5wdXNoKHQpfSkpLEUoZSwoZnVuY3Rpb24odCxlKXtmb3IodmFyIG4saSxyLG89KG49eih0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRhKCl9KSksaT10WzBdLmdldCgibWFwVmFsdWVDYWxjdWxhdGlvbiIpLHI9e30sRShuLChmdW5jdGlvbih0KXt0LmVhY2godC5tYXBEaW1lbnNpb24oInZhbHVlIiksKGZ1bmN0aW9uKGUsbil7dmFyIGk9ImVjLSIrdC5nZXROYW1lKG4pO3JbaV09cltpXXx8W10saXNOYU4oZSl8fHJbaV0ucHVzaChlKX0pKX0pKSxuWzBdLm1hcChuWzBdLm1hcERpbWVuc2lvbigidmFsdWUiKSwoZnVuY3Rpb24odCxlKXtmb3IodmFyIG89ImVjLSIrblswXS5nZXROYW1lKGUpLGE9MCxzPTEvMCxsPS0xLzAsdT1yW29dLmxlbmd0aCxoPTA7aDx1O2grKylzPU1hdGgubWluKHMscltvXVtoXSksbD1NYXRoLm1heChsLHJbb11baF0pLGErPXJbb11baF07cmV0dXJuIDA9PT11P05hTjoibWluIj09PWk/czoibWF4Ij09PWk/bDoiYXZlcmFnZSI9PT1pP2EvdTphfSkpKSxhPTA7YTx0Lmxlbmd0aDthKyspdFthXS5vcmlnaW5hbERhdGE9dFthXS5nZXREYXRhKCk7Zm9yKGE9MDthPHQubGVuZ3RoO2ErKyl0W2FdLnNlcmllc0dyb3VwPXQsdFthXS5uZWVkc0RyYXdNYXA9MD09PWEmJiF0W2FdLmdldEhvc3RHZW9Nb2RlbCgpLHRbYV0uc2V0RGF0YShvLmNsb25lU2hhbGxvdygpKSx0W2FdLm1haW5TZXJpZXM9dFswXX0pKX1mdW5jdGlvbiBjQyh0KXt2YXIgZT17fTt0LmVhY2hTZXJpZXNCeVR5cGUoIm1hcCIsKGZ1bmN0aW9uKG4pe3ZhciBpPW4uZ2V0TWFwVHlwZSgpO2lmKCFuLmdldEhvc3RHZW9Nb2RlbCgpJiYhZVtpXSl7dmFyIHI9e307RShuLnNlcmllc0dyb3VwLChmdW5jdGlvbihlKXt2YXIgbj1lLmNvb3JkaW5hdGVTeXN0ZW0saT1lLm9yaWdpbmFsRGF0YTtlLmdldCgic2hvd0xlZ2VuZFN5bWJvbCIpJiZ0LmdldENvbXBvbmVudCgibGVnZW5kIikmJmkuZWFjaChpLm1hcERpbWVuc2lvbigidmFsdWUiKSwoZnVuY3Rpb24odCxlKXt2YXIgbz1pLmdldE5hbWUoZSksYT1uLmdldFJlZ2lvbihvKTtpZihhJiYhaXNOYU4odCkpe3ZhciBzPXJbb118fDAsbD1uLmRhdGFUb1BvaW50KGEuZ2V0Q2VudGVyKCkpO3Jbb109cysxLGkuc2V0SXRlbUxheW91dChlLHtwb2ludDpsLG9mZnNldDpzfSl9fSkpfSkpO3ZhciBvPW4uZ2V0RGF0YSgpO28uZWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9by5nZXROYW1lKHQpLG49by5nZXRJdGVtTGF5b3V0KHQpfHx7fTtuLnNob3dMYWJlbD0hcltlXSxvLnNldEl0ZW1MYXlvdXQodCxuKX0pKSxlW2ldPSEwfX0pKX12YXIgcEM9V3QsZEM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4udHlwZT0idmlldyIsbi5kaW1lbnNpb25zPVsieCIsInkiXSxuLl9yb2FtVHJhbnNmb3JtYWJsZT1uZXcgdnIsbi5fcmF3VHJhbnNmb3JtYWJsZT1uZXcgdnIsbi5uYW1lPWUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnNldEJvdW5kaW5nUmVjdD1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdGhpcy5fcmVjdD1uZXcgemUodCxlLG4saSksdGhpcy5fcmVjdH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3R9LGUucHJvdG90eXBlLnNldFZpZXdSZWN0PWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuX3RyYW5zZm9ybVRvKHQsZSxuLGkpLHRoaXMuX3ZpZXdSZWN0PW5ldyB6ZSh0LGUsbixpKX0sZS5wcm90b3R5cGUuX3RyYW5zZm9ybVRvPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCksbz10aGlzLl9yYXdUcmFuc2Zvcm1hYmxlO28udHJhbnNmb3JtPXIuY2FsY3VsYXRlVHJhbnNmb3JtKG5ldyB6ZSh0LGUsbixpKSk7dmFyIGE9by5wYXJlbnQ7by5wYXJlbnQ9bnVsbCxvLmRlY29tcG9zZVRyYW5zZm9ybSgpLG8ucGFyZW50PWEsdGhpcy5fdXBkYXRlVHJhbnNmb3JtKCl9LGUucHJvdG90eXBlLnNldENlbnRlcj1mdW5jdGlvbih0LGUpe3QmJih0aGlzLl9jZW50ZXI9WyRyKHRbMF0sZS5nZXRXaWR0aCgpKSwkcih0WzFdLGUuZ2V0SGVpZ2h0KCkpXSx0aGlzLl91cGRhdGVDZW50ZXJBbmRab29tKCkpfSxlLnByb3RvdHlwZS5zZXRab29tPWZ1bmN0aW9uKHQpe3Q9dHx8MTt2YXIgZT10aGlzLnpvb21MaW1pdDtlJiYobnVsbCE9ZS5tYXgmJih0PU1hdGgubWluKGUubWF4LHQpKSxudWxsIT1lLm1pbiYmKHQ9TWF0aC5tYXgoZS5taW4sdCkpKSx0aGlzLl96b29tPXQsdGhpcy5fdXBkYXRlQ2VudGVyQW5kWm9vbSgpfSxlLnByb3RvdHlwZS5nZXREZWZhdWx0Q2VudGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKTtyZXR1cm5bdC54K3Qud2lkdGgvMix0LnkrdC5oZWlnaHQvMl19LGUucHJvdG90eXBlLmdldENlbnRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jZW50ZXJ8fHRoaXMuZ2V0RGVmYXVsdENlbnRlcigpfSxlLnByb3RvdHlwZS5nZXRab29tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pvb218fDF9LGUucHJvdG90eXBlLmdldFJvYW1UcmFuc2Zvcm09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9hbVRyYW5zZm9ybWFibGUuZ2V0TG9jYWxUcmFuc2Zvcm0oKX0sZS5wcm90b3R5cGUuX3VwZGF0ZUNlbnRlckFuZFpvb209ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yYXdUcmFuc2Zvcm1hYmxlLmdldExvY2FsVHJhbnNmb3JtKCksZT10aGlzLl9yb2FtVHJhbnNmb3JtYWJsZSxuPXRoaXMuZ2V0RGVmYXVsdENlbnRlcigpLGk9dGhpcy5nZXRDZW50ZXIoKSxyPXRoaXMuZ2V0Wm9vbSgpO2k9V3QoW10saSx0KSxuPVd0KFtdLG4sdCksZS5vcmlnaW5YPWlbMF0sZS5vcmlnaW5ZPWlbMV0sZS54PW5bMF0taVswXSxlLnk9blsxXS1pWzFdLGUuc2NhbGVYPWUuc2NhbGVZPXIsdGhpcy5fdXBkYXRlVHJhbnNmb3JtKCl9LGUucHJvdG90eXBlLl91cGRhdGVUcmFuc2Zvcm09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yb2FtVHJhbnNmb3JtYWJsZSxlPXRoaXMuX3Jhd1RyYW5zZm9ybWFibGU7ZS5wYXJlbnQ9dCx0LnVwZGF0ZVRyYW5zZm9ybSgpLGUudXBkYXRlVHJhbnNmb3JtKCksX2UodGhpcy50cmFuc2Zvcm18fCh0aGlzLnRyYW5zZm9ybT1bXSksZS50cmFuc2Zvcm18fFsxLDAsMCwxLDAsMF0pLHRoaXMuX3Jhd1RyYW5zZm9ybT1lLmdldExvY2FsVHJhbnNmb3JtKCksdGhpcy5pbnZUcmFuc2Zvcm09dGhpcy5pbnZUcmFuc2Zvcm18fFtdLEllKHRoaXMuaW52VHJhbnNmb3JtLHRoaXMudHJhbnNmb3JtKSx0aGlzLmRlY29tcG9zZVRyYW5zZm9ybSgpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1JbmZvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmF3VHJhbnNmb3JtYWJsZSxlPXRoaXMuX3JvYW1UcmFuc2Zvcm1hYmxlLG49bmV3IHZyO3JldHVybiBuLnRyYW5zZm9ybT1lLnRyYW5zZm9ybSxuLmRlY29tcG9zZVRyYW5zZm9ybSgpLHtyb2FtOnt4Om4ueCx5Om4ueSxzY2FsZVg6bi5zY2FsZVgsc2NhbGVZOm4uc2NhbGVZfSxyYXc6e3g6dC54LHk6dC55LHNjYWxlWDp0LnNjYWxlWCxzY2FsZVk6dC5zY2FsZVl9fX0sZS5wcm90b3R5cGUuZ2V0Vmlld1JlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmlld1JlY3R9LGUucHJvdG90eXBlLmdldFZpZXdSZWN0QWZ0ZXJSb2FtPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpO3JldHVybiB0LmFwcGx5VHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtKSx0fSxlLnByb3RvdHlwZS5kYXRhVG9Qb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIGk9ZT90aGlzLl9yYXdUcmFuc2Zvcm06dGhpcy50cmFuc2Zvcm07cmV0dXJuIG49bnx8W10saT9wQyhuLHQsaSk6SXQobix0KX0sZS5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbnZUcmFuc2Zvcm07cmV0dXJuIGU/cEMoW10sdCxlKTpbdFswXSx0WzFdXX0sZS5wcm90b3R5cGUuY29udmVydFRvUGl4ZWw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWZDKGUpO3JldHVybiBpPT09dGhpcz9pLmRhdGFUb1BvaW50KG4pOm51bGx9LGUucHJvdG90eXBlLmNvbnZlcnRGcm9tUGl4ZWw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWZDKGUpO3JldHVybiBpPT09dGhpcz9pLnBvaW50VG9EYXRhKG4pOm51bGx9LGUucHJvdG90eXBlLmNvbnRhaW5Qb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRWaWV3UmVjdEFmdGVyUm9hbSgpLmNvbnRhaW4odFswXSx0WzFdKX0sZS5kaW1lbnNpb25zPVsieCIsInkiXSxlfSh2cik7ZnVuY3Rpb24gZkModCl7dmFyIGU9dC5zZXJpZXNNb2RlbDtyZXR1cm4gZT9lLmNvb3JkaW5hdGVTeXN0ZW06bnVsbH12YXIgZ0M9e2dlb0pTT046e2FzcGVjdFNjYWxlOi43NSxpbnZlcnRMb25naXR1dGU6ITB9LGdlb1NWRzp7YXNwZWN0U2NhbGU6MSxpbnZlcnRMb25naXR1dGU6ITF9fSx5Qz1bImxuZyIsImxhdCJdLHZDPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLGkpe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3IuZGltZW5zaW9ucz15QyxyLnR5cGU9ImdlbyIsci5fbmFtZUNvb3JkTWFwPXl0KCksci5tYXA9bjt2YXIgbyxhPWkucHJvamVjdGlvbixzPVpUKG4saS5uYW1lTWFwLGkubmFtZVByb3BlcnR5KSxsPVhUKG4pLHU9KHIucmVzb3VyY2VUeXBlPWw/bC50eXBlOm51bGwsci5yZWdpb25zPXMucmVnaW9ucyksaD1nQ1tsLnR5cGVdO2lmKHIuX3JlZ2lvbnNNYXA9cy5yZWdpb25zTWFwLHIucmVnaW9ucz1zLnJlZ2lvbnMsci5wcm9qZWN0aW9uPWEsYSlmb3IodmFyIGM9MDtjPHUubGVuZ3RoO2MrKyl7dmFyIHA9dVtjXS5nZXRCb3VuZGluZ1JlY3QoYSk7KG89b3x8cC5jbG9uZSgpKS51bmlvbihwKX1lbHNlIG89cy5ib3VuZGluZ1JlY3Q7cmV0dXJuIHIuc2V0Qm91bmRpbmdSZWN0KG8ueCxvLnksby53aWR0aCxvLmhlaWdodCksci5hc3BlY3RTY2FsZT1hPzE6cnQoaS5hc3BlY3RTY2FsZSxoLmFzcGVjdFNjYWxlKSxyLl9pbnZlcnRMb25naXR1dGU9IWEmJmguaW52ZXJ0TG9uZ2l0dXRlLHJ9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5fdHJhbnNmb3JtVG89ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSxvPXRoaXMuX2ludmVydExvbmdpdHV0ZTtyPXIuY2xvbmUoKSxvJiYoci55PS1yLnktci5oZWlnaHQpO3ZhciBhPXRoaXMuX3Jhd1RyYW5zZm9ybWFibGU7YS50cmFuc2Zvcm09ci5jYWxjdWxhdGVUcmFuc2Zvcm0obmV3IHplKHQsZSxuLGkpKTt2YXIgcz1hLnBhcmVudDthLnBhcmVudD1udWxsLGEuZGVjb21wb3NlVHJhbnNmb3JtKCksYS5wYXJlbnQ9cyxvJiYoYS5zY2FsZVk9LWEuc2NhbGVZKSx0aGlzLl91cGRhdGVUcmFuc2Zvcm0oKX0sZS5wcm90b3R5cGUuZ2V0UmVnaW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWdpb25zTWFwLmdldCh0KX0sZS5wcm90b3R5cGUuZ2V0UmVnaW9uQnlDb29yZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5yZWdpb25zLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9ZVtuXTtpZigiZ2VvSlNPTiI9PT1pLnR5cGUmJmkuY29udGFpbih0KSlyZXR1cm4gZVtuXX19LGUucHJvdG90eXBlLmFkZEdlb0Nvb3JkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fbmFtZUNvb3JkTWFwLnNldCh0LGUpfSxlLnByb3RvdHlwZS5nZXRHZW9Db29yZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWdpb25zTWFwLmdldCh0KTtyZXR1cm4gdGhpcy5fbmFtZUNvb3JkTWFwLmdldCh0KXx8ZSYmZS5nZXRDZW50ZXIoKX0sZS5wcm90b3R5cGUuZGF0YVRvUG9pbnQ9ZnVuY3Rpb24odCxlLG4pe2lmKFUodCkmJih0PXRoaXMuZ2V0R2VvQ29vcmQodCkpLHQpe3ZhciBpPXRoaXMucHJvamVjdGlvbjtyZXR1cm4gaSYmKHQ9aS5wcm9qZWN0KHQpKSx0JiZ0aGlzLnByb2plY3RlZFRvUG9pbnQodCxlLG4pfX0sZS5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9qZWN0aW9uO3JldHVybiBlJiYodD1lLnVucHJvamVjdCh0KSksdCYmdGhpcy5wb2ludFRvUHJvamVjdGVkKHQpfSxlLnByb3RvdHlwZS5wb2ludFRvUHJvamVjdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5wb2ludFRvRGF0YS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLnByb2plY3RlZFRvUG9pbnQ9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0LnByb3RvdHlwZS5kYXRhVG9Qb2ludC5jYWxsKHRoaXMsZSxuLGkpfSxlLnByb3RvdHlwZS5jb252ZXJ0VG9QaXhlbD1mdW5jdGlvbih0LGUsbil7dmFyIGk9bUMoZSk7cmV0dXJuIGk9PT10aGlzP2kuZGF0YVRvUG9pbnQobik6bnVsbH0sZS5wcm90b3R5cGUuY29udmVydEZyb21QaXhlbD1mdW5jdGlvbih0LGUsbil7dmFyIGk9bUMoZSk7cmV0dXJuIGk9PT10aGlzP2kucG9pbnRUb0RhdGEobik6bnVsbH0sZX0oZEMpO2Z1bmN0aW9uIG1DKHQpe3ZhciBlPXQuZ2VvTW9kZWwsbj10LnNlcmllc01vZGVsO3JldHVybiBlP2UuY29vcmRpbmF0ZVN5c3RlbTpuP24uY29vcmRpbmF0ZVN5c3RlbXx8KG4uZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygiZ2VvIixXbykubW9kZWxzWzBdfHx7fSkuY29vcmRpbmF0ZVN5c3RlbTpudWxsfWZ1bmN0aW9uIHhDKHQsZSl7dmFyIG49dC5nZXQoImJvdW5kaW5nQ29vcmRzIik7aWYobnVsbCE9bil7dmFyIGk9blswXSxyPW5bMV07aWYoaXNGaW5pdGUoaVswXSkmJmlzRmluaXRlKGlbMV0pJiZpc0Zpbml0ZShyWzBdKSYmaXNGaW5pdGUoclsxXSkpe3ZhciBvPXRoaXMucHJvamVjdGlvbjtpZihvKXt2YXIgYT1pWzBdLHM9aVsxXSxsPXJbMF0sdT1yWzFdO2k9WzEvMCwxLzBdLHI9Wy0xLzAsLTEvMF07dmFyIGg9ZnVuY3Rpb24odCxlLG4sYSl7Zm9yKHZhciBzPW4tdCxsPWEtZSx1PTA7dTw9MTAwO3UrKyl7dmFyIGg9dS8xMDAsYz1vLnByb2plY3QoW3QrcypoLGUrbCpoXSk7SHQoaSxpLGMpLFl0KHIscixjKX19O2goYSxzLGwscyksaChsLHMsbCx1KSxoKGwsdSxhLHUpLGgoYSx1LGwscyl9dGhpcy5zZXRCb3VuZGluZ1JlY3QoaVswXSxpWzFdLHJbMF0taVswXSxyWzFdLWlbMV0pfWVsc2UgMH12YXIgYyxwLGQsZj10aGlzLmdldEJvdW5kaW5nUmVjdCgpLGc9dC5nZXQoImxheW91dENlbnRlciIpLHk9dC5nZXQoImxheW91dFNpemUiKSx2PWUuZ2V0V2lkdGgoKSxtPWUuZ2V0SGVpZ2h0KCkseD1mLndpZHRoL2YuaGVpZ2h0KnRoaXMuYXNwZWN0U2NhbGUsXz0hMTtpZihnJiZ5JiYoYz1bJHIoZ1swXSx2KSwkcihnWzFdLG0pXSxwPSRyKHksTWF0aC5taW4odixtKSksaXNOYU4oY1swXSl8fGlzTmFOKGNbMV0pfHxpc05hTihwKXx8KF89ITApKSxfKWQ9e30seD4xPyhkLndpZHRoPXAsZC5oZWlnaHQ9cC94KTooZC5oZWlnaHQ9cCxkLndpZHRoPXAqeCksZC55PWNbMV0tZC5oZWlnaHQvMixkLng9Y1swXS1kLndpZHRoLzI7ZWxzZXt2YXIgYj10LmdldEJveExheW91dFBhcmFtcygpO2IuYXNwZWN0PXgsZD1rcChiLHt3aWR0aDp2LGhlaWdodDptfSl9dGhpcy5zZXRWaWV3UmVjdChkLngsZC55LGQud2lkdGgsZC5oZWlnaHQpLHRoaXMuc2V0Q2VudGVyKHQuZ2V0KCJjZW50ZXIiKSxlKSx0aGlzLnNldFpvb20odC5nZXQoInpvb20iKSl9Uih2QyxkQyk7dmFyIF9DPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZGltZW5zaW9ucz15Q31yZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107ZnVuY3Rpb24gaSh0KXtyZXR1cm57bmFtZVByb3BlcnR5OnQuZ2V0KCJuYW1lUHJvcGVydHkiKSxhc3BlY3RTY2FsZTp0LmdldCgiYXNwZWN0U2NhbGUiKSxwcm9qZWN0aW9uOnQuZ2V0KCJwcm9qZWN0aW9uIil9fXQuZWFjaENvbXBvbmVudCgiZ2VvIiwoZnVuY3Rpb24odCxyKXt2YXIgbz10LmdldCgibWFwIiksYT1uZXcgdkMobytyLG8sQSh7bmFtZU1hcDp0LmdldCgibmFtZU1hcCIpfSxpKHQpKSk7YS56b29tTGltaXQ9dC5nZXQoInNjYWxlTGltaXQiKSxuLnB1c2goYSksdC5jb29yZGluYXRlU3lzdGVtPWEsYS5tb2RlbD10LGEucmVzaXplPXhDLGEucmVzaXplKHQsZSl9KSksdC5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXtpZigiZ2VvIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikpe3ZhciBlPXQuZ2V0KCJnZW9JbmRleCIpfHwwO3QuY29vcmRpbmF0ZVN5c3RlbT1uW2VdfX0pKTt2YXIgcj17fTtyZXR1cm4gdC5lYWNoU2VyaWVzQnlUeXBlKCJtYXAiLChmdW5jdGlvbih0KXtpZighdC5nZXRIb3N0R2VvTW9kZWwoKSl7dmFyIGU9dC5nZXRNYXBUeXBlKCk7cltlXT1yW2VdfHxbXSxyW2VdLnB1c2godCl9fSkpLEUociwoZnVuY3Rpb24odCxyKXt2YXIgbz16KHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldCgibmFtZU1hcCIpfSkpLGE9bmV3IHZDKHIscixBKHtuYW1lTWFwOkQobyl9LGkodFswXSkpKTthLnpvb21MaW1pdD1pdC5hcHBseShudWxsLHoodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0KCJzY2FsZUxpbWl0Iil9KSkpLG4ucHVzaChhKSxhLnJlc2l6ZT14QyxhLnJlc2l6ZSh0WzBdLGUpLEUodCwoZnVuY3Rpb24odCl7dC5jb29yZGluYXRlU3lzdGVtPWEsZnVuY3Rpb24odCxlKXtFKGUuZ2V0KCJnZW9Db29yZCIpLChmdW5jdGlvbihlLG4pe3QuYWRkR2VvQ29vcmQobixlKX0pKX0oYSx0KX0pKX0pKSxufSx0LnByb3RvdHlwZS5nZXRGaWxsZWRSZWdpb25zPWZ1bmN0aW9uKHQsZSxuLGkpe2Zvcih2YXIgcj0odHx8W10pLnNsaWNlKCksbz15dCgpLGE9MDthPHIubGVuZ3RoO2ErKylvLnNldChyW2FdLm5hbWUsclthXSk7cmV0dXJuIEUoWlQoZSxuLGkpLnJlZ2lvbnMsKGZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZTshby5nZXQoZSkmJnIucHVzaCh7bmFtZTplfSl9KSkscn0sdH0oKSxiQz1uZXcgX0Msd0M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9WFQodC5tYXApO2lmKGkmJiJnZW9KU09OIj09PWkudHlwZSl7dmFyIHI9dC5pdGVtU3R5bGU9dC5pdGVtU3R5bGV8fHt9OyJjb2xvciJpbiByfHwoci5jb2xvcj0iI2VlZSIpfXRoaXMubWVyZ2VEZWZhdWx0QW5kVGhlbWUodCxuKSxDbyh0LCJsYWJlbCIsWyJzaG93Il0pfSxlLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMub3B0aW9uO2UucmVnaW9ucz1iQy5nZXRGaWxsZWRSZWdpb25zKGUucmVnaW9ucyxlLm1hcCxlLm5hbWVNYXAsZS5uYW1lUHJvcGVydHkpO3ZhciBuPXt9O3RoaXMuX29wdGlvbk1vZGVsTWFwPVYoZS5yZWdpb25zfHxbXSwoZnVuY3Rpb24oZSxpKXt2YXIgcj1pLm5hbWU7cmV0dXJuIHImJihlLnNldChyLG5ldyBDYyhpLHQsdC5lY01vZGVsKSksaS5zZWxlY3RlZCYmKG5bcl09ITApKSxlfSkseXQoKSksZS5zZWxlY3RlZE1hcHx8KGUuc2VsZWN0ZWRNYXA9bil9LGUucHJvdG90eXBlLmdldFJlZ2lvbk1vZGVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vcHRpb25Nb2RlbE1hcC5nZXQodCl8fG5ldyBDYyhudWxsLHRoaXMsdGhpcy5lY01vZGVsKX0sZS5wcm90b3R5cGUuZ2V0Rm9ybWF0dGVkTGFiZWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFJlZ2lvbk1vZGVsKHQpLGk9Im5vcm1hbCI9PT1lP24uZ2V0KFsibGFiZWwiLCJmb3JtYXR0ZXIiXSk6bi5nZXQoWyJlbXBoYXNpcyIsImxhYmVsIiwiZm9ybWF0dGVyIl0pLHI9e25hbWU6dH07cmV0dXJuIFgoaSk/KHIuc3RhdHVzPWUsaShyKSk6VShpKT9pLnJlcGxhY2UoInthfSIsbnVsbCE9dD90OiIiKTp2b2lkIDB9LGUucHJvdG90eXBlLnNldFpvb209ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uem9vbT10fSxlLnByb3RvdHlwZS5zZXRDZW50ZXI9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uY2VudGVyPXR9LGUucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbixuPWUuc2VsZWN0ZWRNb2RlO24mJigibXVsdGlwbGUiIT09biYmKGUuc2VsZWN0ZWRNYXA9bnVsbCksKGUuc2VsZWN0ZWRNYXB8fChlLnNlbGVjdGVkTWFwPXt9KSlbdF09ITApfSxlLnByb3RvdHlwZS51blNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbi5zZWxlY3RlZE1hcDtlJiYoZVt0XT0hMSl9LGUucHJvdG90eXBlLnRvZ2dsZVNlbGVjdGVkPWZ1bmN0aW9uKHQpe3RoaXNbdGhpcy5pc1NlbGVjdGVkKHQpPyJ1blNlbGVjdCI6InNlbGVjdCJdKHQpfSxlLnByb3RvdHlwZS5pc1NlbGVjdGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnNlbGVjdGVkTWFwO3JldHVybiEoIWV8fCFlW3RdKX0sZS50eXBlPSJnZW8iLGUubGF5b3V0TW9kZT0iYm94IixlLmRlZmF1bHRPcHRpb249e3o6MCxzaG93OiEwLGxlZnQ6ImNlbnRlciIsdG9wOiJjZW50ZXIiLGFzcGVjdFNjYWxlOm51bGwsc2lsZW50OiExLG1hcDoiIixib3VuZGluZ0Nvb3JkczpudWxsLGNlbnRlcjpudWxsLHpvb206MSxzY2FsZUxpbWl0Om51bGwsbGFiZWw6e3Nob3c6ITEsY29sb3I6IiMwMDAifSxpdGVtU3R5bGU6e2JvcmRlcldpZHRoOi41LGJvcmRlckNvbG9yOiIjNDQ0In0sZW1waGFzaXM6e2xhYmVsOntzaG93OiEwLGNvbG9yOiJyZ2IoMTAwLDAsMCkifSxpdGVtU3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyMTUsMCwwLjgpIn19LHNlbGVjdDp7bGFiZWw6e3Nob3c6ITAsY29sb3I6InJnYigxMDAsMCwwKSJ9LGl0ZW1TdHlsZTp7Y29sb3I6InJnYmEoMjU1LDIxNSwwLDAuOCkifX0scmVnaW9uczpbXX0sZX0oenApO2Z1bmN0aW9uIFNDKHQsZSl7cmV0dXJuIHQucG9pbnRUb1Byb2plY3RlZD90LnBvaW50VG9Qcm9qZWN0ZWQoZSk6dC5wb2ludFRvRGF0YShlKX1mdW5jdGlvbiBNQyh0LGUsbixpKXt2YXIgcj10LmdldFpvb20oKSxvPXQuZ2V0Q2VudGVyKCksYT1lLnpvb20scz10LnByb2plY3RlZFRvUG9pbnQ/dC5wcm9qZWN0ZWRUb1BvaW50KG8pOnQuZGF0YVRvUG9pbnQobyk7aWYobnVsbCE9ZS5keCYmbnVsbCE9ZS5keSYmKHNbMF0tPWUuZHgsc1sxXS09ZS5keSx0LnNldENlbnRlcihTQyh0LHMpLGkpKSxudWxsIT1hKXtpZihuKXt2YXIgbD1uLm1pbnx8MCx1PW4ubWF4fHwxLzA7YT1NYXRoLm1heChNYXRoLm1pbihyKmEsdSksbCkvcn10LnNjYWxlWCo9YSx0LnNjYWxlWSo9YTt2YXIgaD0oZS5vcmlnaW5YLXQueCkqKGEtMSksYz0oZS5vcmlnaW5ZLXQueSkqKGEtMSk7dC54LT1oLHQueS09Yyx0LnVwZGF0ZVRyYW5zZm9ybSgpLHQuc2V0Q2VudGVyKFNDKHQscyksaSksdC5zZXRab29tKGEqcil9cmV0dXJue2NlbnRlcjp0LmdldENlbnRlcigpLHpvb206dC5nZXRab29tKCl9fXZhciBJQz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4uZm9jdXNCbHVyRW5hYmxlZD0hMCxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe3RoaXMuX2FwaT1lfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4saSl7aWYodGhpcy5fbW9kZWw9dCwhdC5nZXQoInNob3ciKSlyZXR1cm4gdGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKSx2b2lkKHRoaXMuX21hcERyYXc9bnVsbCk7dGhpcy5fbWFwRHJhd3x8KHRoaXMuX21hcERyYXc9bmV3IGVDKG4pKTt2YXIgcj10aGlzLl9tYXBEcmF3O3IuZHJhdyh0LGUsbix0aGlzLGkpLHIuZ3JvdXAub24oImNsaWNrIix0aGlzLl9oYW5kbGVSZWdpb25DbGljayx0aGlzKSxyLmdyb3VwLnNpbGVudD10LmdldCgic2lsZW50IiksdGhpcy5ncm91cC5hZGQoci5ncm91cCksdGhpcy51cGRhdGVTZWxlY3RTdGF0dXModCxlLG4pfSxlLnByb3RvdHlwZS5faGFuZGxlUmVnaW9uQ2xpY2s9ZnVuY3Rpb24odCl7dmFyIGU7T3kodC50YXJnZXQsKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT0oZT1ybCh0KS5ldmVudERhdGEpfSksITApLGUmJnRoaXMuX2FwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiZ2VvVG9nZ2xlU2VsZWN0IixnZW9JZDp0aGlzLl9tb2RlbC5pZCxuYW1lOmUubmFtZX0pfSxlLnByb3RvdHlwZS51cGRhdGVTZWxlY3RTdGF0dXM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXM7dGhpcy5fbWFwRHJhdy5ncm91cC50cmF2ZXJzZSgoZnVuY3Rpb24odCl7dmFyIGU9cmwodCkuZXZlbnREYXRhO2lmKGUpcmV0dXJuIGkuX21vZGVsLmlzU2VsZWN0ZWQoZS5uYW1lKT9uLmVudGVyU2VsZWN0KHQpOm4ubGVhdmVTZWxlY3QodCksITB9KSl9LGUucHJvdG90eXBlLmZpbmRIaWdoRG93bkRpc3BhdGNoZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXBEcmF3JiZ0aGlzLl9tYXBEcmF3LmZpbmRIaWdoRG93bkRpc3BhdGNoZXJzKHQsdGhpcy5fbW9kZWwpfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKX0sZS50eXBlPSJnZW8iLGV9KEFnKTtmdW5jdGlvbiBUQyh0LGUsbil7WVQodCxlLG4pfWZ1bmN0aW9uIENDKHQpe2Z1bmN0aW9uIGUoZSxuKXtuLnVwZGF0ZT0iZ2VvOnVwZGF0ZVNlbGVjdFN0YXR1cyIsdC5yZWdpc3RlckFjdGlvbihuLChmdW5jdGlvbih0LG4pe3ZhciBpPXt9LHI9W107cmV0dXJuIG4uZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImdlbyIscXVlcnk6dH0sKGZ1bmN0aW9uKG4pe25bZV0odC5uYW1lKSxFKG4uY29vcmRpbmF0ZVN5c3RlbS5yZWdpb25zLChmdW5jdGlvbih0KXtpW3QubmFtZV09bi5pc1NlbGVjdGVkKHQubmFtZSl8fCExfSkpO3ZhciBvPVtdO0UoaSwoZnVuY3Rpb24odCxlKXtpW2VdJiZvLnB1c2goZSl9KSksci5wdXNoKHtnZW9JbmRleDpuLmNvbXBvbmVudEluZGV4LG5hbWU6b30pfSkpLHtzZWxlY3RlZDppLGFsbFNlbGVjdGVkOnIsbmFtZTp0Lm5hbWV9fSkpfXQucmVnaXN0ZXJDb29yZGluYXRlU3lzdGVtKCJnZW8iLGJDKSx0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwod0MpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KElDKSx0LnJlZ2lzdGVySW1wbCgicmVnaXN0ZXJNYXAiLFRDKSx0LnJlZ2lzdGVySW1wbCgiZ2V0TWFwIiwoZnVuY3Rpb24odCl7cmV0dXJuIFVUKHQpfSkpLGUoInRvZ2dsZVNlbGVjdGVkIix7dHlwZToiZ2VvVG9nZ2xlU2VsZWN0IixldmVudDoiZ2Vvc2VsZWN0Y2hhbmdlZCJ9KSxlKCJzZWxlY3QiLHt0eXBlOiJnZW9TZWxlY3QiLGV2ZW50OiJnZW9zZWxlY3RlZCJ9KSxlKCJ1blNlbGVjdCIse3R5cGU6Imdlb1VuU2VsZWN0IixldmVudDoiZ2VvdW5zZWxlY3RlZCJ9KSx0LnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJnZW9Sb2FtIixldmVudDoiZ2VvUm9hbSIsdXBkYXRlOiJ1cGRhdGVUcmFuc2Zvcm0ifSwoZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuY29tcG9uZW50VHlwZXx8InNlcmllcyI7ZS5lYWNoQ29tcG9uZW50KHttYWluVHlwZTppLHF1ZXJ5OnR9LChmdW5jdGlvbihlKXt2YXIgcj1lLmNvb3JkaW5hdGVTeXN0ZW07aWYoImdlbyI9PT1yLnR5cGUpe3ZhciBvPU1DKHIsdCxlLmdldCgic2NhbGVMaW1pdCIpLG4pO2Uuc2V0Q2VudGVyJiZlLnNldENlbnRlcihvLmNlbnRlciksZS5zZXRab29tJiZlLnNldFpvb20oby56b29tKSwic2VyaWVzIj09PWkmJkUoZS5zZXJpZXNHcm91cCwoZnVuY3Rpb24odCl7dC5zZXRDZW50ZXIoby5jZW50ZXIpLHQuc2V0Wm9vbShvLnpvb20pfSkpfX0pKX0pKX1mdW5jdGlvbiBEQyh0LGUpe3ZhciBuPXQuaXNFeHBhbmQ/dC5jaGlsZHJlbjpbXSxpPXQucGFyZW50Tm9kZS5jaGlsZHJlbixyPXQuaGllck5vZGUuaT9pW3QuaGllck5vZGUuaS0xXTpudWxsO2lmKG4ubGVuZ3RoKXshZnVuY3Rpb24odCl7dmFyIGU9dC5jaGlsZHJlbixuPWUubGVuZ3RoLGk9MCxyPTA7Zm9yKDstLW4+PTA7KXt2YXIgbz1lW25dO28uaGllck5vZGUucHJlbGltKz1pLG8uaGllck5vZGUubW9kaWZpZXIrPWkscis9by5oaWVyTm9kZS5jaGFuZ2UsaSs9by5oaWVyTm9kZS5zaGlmdCtyfX0odCk7dmFyIG89KG5bMF0uaGllck5vZGUucHJlbGltK25bbi5sZW5ndGgtMV0uaGllck5vZGUucHJlbGltKS8yO3I/KHQuaGllck5vZGUucHJlbGltPXIuaGllck5vZGUucHJlbGltK2UodCxyKSx0LmhpZXJOb2RlLm1vZGlmaWVyPXQuaGllck5vZGUucHJlbGltLW8pOnQuaGllck5vZGUucHJlbGltPW99ZWxzZSByJiYodC5oaWVyTm9kZS5wcmVsaW09ci5oaWVyTm9kZS5wcmVsaW0rZSh0LHIpKTt0LnBhcmVudE5vZGUuaGllck5vZGUuZGVmYXVsdEFuY2VzdG9yPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKGUpe2Zvcih2YXIgcj10LG89dCxhPW8ucGFyZW50Tm9kZS5jaGlsZHJlblswXSxzPWUsbD1yLmhpZXJOb2RlLm1vZGlmaWVyLHU9by5oaWVyTm9kZS5tb2RpZmllcixoPWEuaGllck5vZGUubW9kaWZpZXIsYz1zLmhpZXJOb2RlLm1vZGlmaWVyO3M9UEMocyksbz1PQyhvKSxzJiZvOyl7cj1QQyhyKSxhPU9DKGEpLHIuaGllck5vZGUuYW5jZXN0b3I9dDt2YXIgcD1zLmhpZXJOb2RlLnByZWxpbStjLW8uaGllck5vZGUucHJlbGltLXUraShzLG8pO3A+MCYmKE5DKFJDKHMsdCxuKSx0LHApLHUrPXAsbCs9cCksYys9cy5oaWVyTm9kZS5tb2RpZmllcix1Kz1vLmhpZXJOb2RlLm1vZGlmaWVyLGwrPXIuaGllck5vZGUubW9kaWZpZXIsaCs9YS5oaWVyTm9kZS5tb2RpZmllcn1zJiYhUEMocikmJihyLmhpZXJOb2RlLnRocmVhZD1zLHIuaGllck5vZGUubW9kaWZpZXIrPWMtbCksbyYmIU9DKGEpJiYoYS5oaWVyTm9kZS50aHJlYWQ9byxhLmhpZXJOb2RlLm1vZGlmaWVyKz11LWgsbj10KX1yZXR1cm4gbn0odCxyLHQucGFyZW50Tm9kZS5oaWVyTm9kZS5kZWZhdWx0QW5jZXN0b3J8fGlbMF0sZSl9ZnVuY3Rpb24gQUModCl7dmFyIGU9dC5oaWVyTm9kZS5wcmVsaW0rdC5wYXJlbnROb2RlLmhpZXJOb2RlLm1vZGlmaWVyO3Quc2V0TGF5b3V0KHt4OmV9LCEwKSx0LmhpZXJOb2RlLm1vZGlmaWVyKz10LnBhcmVudE5vZGUuaGllck5vZGUubW9kaWZpZXJ9ZnVuY3Rpb24ga0ModCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dDpFQ31mdW5jdGlvbiBMQyh0LGUpe3JldHVybiB0LT1NYXRoLlBJLzIse3g6ZSpNYXRoLmNvcyh0KSx5OmUqTWF0aC5zaW4odCl9fWZ1bmN0aW9uIFBDKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGUubGVuZ3RoJiZ0LmlzRXhwYW5kP2VbZS5sZW5ndGgtMV06dC5oaWVyTm9kZS50aHJlYWR9ZnVuY3Rpb24gT0ModCl7dmFyIGU9dC5jaGlsZHJlbjtyZXR1cm4gZS5sZW5ndGgmJnQuaXNFeHBhbmQ/ZVswXTp0LmhpZXJOb2RlLnRocmVhZH1mdW5jdGlvbiBSQyh0LGUsbil7cmV0dXJuIHQuaGllck5vZGUuYW5jZXN0b3IucGFyZW50Tm9kZT09PWUucGFyZW50Tm9kZT90LmhpZXJOb2RlLmFuY2VzdG9yOm59ZnVuY3Rpb24gTkModCxlLG4pe3ZhciBpPW4vKGUuaGllck5vZGUuaS10LmhpZXJOb2RlLmkpO2UuaGllck5vZGUuY2hhbmdlLT1pLGUuaGllck5vZGUuc2hpZnQrPW4sZS5oaWVyTm9kZS5tb2RpZmllcis9bixlLmhpZXJOb2RlLnByZWxpbSs9bix0LmhpZXJOb2RlLmNoYW5nZSs9aX1mdW5jdGlvbiBFQyh0LGUpe3JldHVybiB0LnBhcmVudE5vZGU9PT1lLnBhcmVudE5vZGU/MToyfXZhciB6Qz1mdW5jdGlvbigpe3RoaXMucGFyZW50UG9pbnQ9W10sdGhpcy5jaGlsZFBvaW50cz1bXX0sVkM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0U3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm57c3Ryb2tlOiIjMDAwIixmaWxsOm51bGx9fSxlLnByb3RvdHlwZS5nZXREZWZhdWx0U2hhcGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHpDfSxlLnByb3RvdHlwZS5idWlsZFBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmNoaWxkUG9pbnRzLGk9bi5sZW5ndGgscj1lLnBhcmVudFBvaW50LG89blswXSxhPW5baS0xXTtpZigxPT09aSlyZXR1cm4gdC5tb3ZlVG8oclswXSxyWzFdKSx2b2lkIHQubGluZVRvKG9bMF0sb1sxXSk7dmFyIHM9ZS5vcmllbnQsbD0iVEIiPT09c3x8IkJUIj09PXM/MDoxLHU9MS1sLGg9JHIoZS5mb3JrUG9zaXRpb24sMSksYz1bXTtjW2xdPXJbbF0sY1t1XT1yW3VdKyhhW3VdLXJbdV0pKmgsdC5tb3ZlVG8oclswXSxyWzFdKSx0LmxpbmVUbyhjWzBdLGNbMV0pLHQubW92ZVRvKG9bMF0sb1sxXSksY1tsXT1vW2xdLHQubGluZVRvKGNbMF0sY1sxXSksY1tsXT1hW2xdLHQubGluZVRvKGNbMF0sY1sxXSksdC5saW5lVG8oYVswXSxhWzFdKTtmb3IodmFyIHA9MTtwPGktMTtwKyspe3ZhciBkPW5bcF07dC5tb3ZlVG8oZFswXSxkWzFdKSxjW2xdPWRbbF0sdC5saW5lVG8oY1swXSxjWzFdKX19LGV9KGtzKSxCQz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4uX21haW5Hcm91cD1uZXcgQnIsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9jb250cm9sbGVyPW5ldyBuVChlLmdldFpyKCkpLHRoaXMuX2NvbnRyb2xsZXJIb3N0PXt0YXJnZXQ6dGhpcy5ncm91cH0sdGhpcy5ncm91cC5hZGQodGhpcy5fbWFpbkdyb3VwKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmdldERhdGEoKSxyPXQubGF5b3V0SW5mbyxvPXRoaXMuX21haW5Hcm91cDsicmFkaWFsIj09PXQuZ2V0KCJsYXlvdXQiKT8oby54PXIueCtyLndpZHRoLzIsby55PXIueStyLmhlaWdodC8yKTooby54PXIueCxvLnk9ci55KSx0aGlzLl91cGRhdGVWaWV3Q29vcmRTeXModCxuKSx0aGlzLl91cGRhdGVDb250cm9sbGVyKHQsZSxuKTt2YXIgYT10aGlzLl9kYXRhO2kuZGlmZihhKS5hZGQoKGZ1bmN0aW9uKGUpe0ZDKGksZSkmJkdDKGksZSxudWxsLG8sdCl9KSkudXBkYXRlKChmdW5jdGlvbihlLG4pe3ZhciByPWEuZ2V0SXRlbUdyYXBoaWNFbChuKTtGQyhpLGUpP0dDKGksZSxyLG8sdCk6ciYmWUMoYSxuLHIsbyx0KX0pKS5yZW1vdmUoKGZ1bmN0aW9uKGUpe3ZhciBuPWEuZ2V0SXRlbUdyYXBoaWNFbChlKTtuJiZZQyhhLGUsbixvLHQpfSkpLmV4ZWN1dGUoKSx0aGlzLl9ub2RlU2NhbGVSYXRpbz10LmdldCgibm9kZVNjYWxlUmF0aW8iKSx0aGlzLl91cGRhdGVOb2RlQW5kTGlua1NjYWxlKHQpLCEwPT09dC5nZXQoImV4cGFuZEFuZENvbGxhcHNlIikmJmkuZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKGUsaSl7ZS5vZmYoImNsaWNrIikub24oImNsaWNrIiwoZnVuY3Rpb24oKXtuLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0cmVlRXhwYW5kQW5kQ29sbGFwc2UiLHNlcmllc0lkOnQuaWQsZGF0YUluZGV4Oml9KX0pKX0pKSx0aGlzLl9kYXRhPWl9LGUucHJvdG90eXBlLl91cGRhdGVWaWV3Q29vcmRTeXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldERhdGEoKSxpPVtdO24uZWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9bi5nZXRJdGVtTGF5b3V0KHQpOyFlfHxpc05hTihlLngpfHxpc05hTihlLnkpfHxpLnB1c2goWytlLngsK2UueV0pfSkpO3ZhciByPVtdLG89W107QmEoaSxyLG8pO3ZhciBhPXRoaXMuX21pbixzPXRoaXMuX21heDtvWzBdLXJbMF09PTAmJihyWzBdPWE/YVswXTpyWzBdLTEsb1swXT1zP3NbMF06b1swXSsxKSxvWzFdLXJbMV09PTAmJihyWzFdPWE/YVsxXTpyWzFdLTEsb1sxXT1zP3NbMV06b1sxXSsxKTt2YXIgbD10LmNvb3JkaW5hdGVTeXN0ZW09bmV3IGRDO2wuem9vbUxpbWl0PXQuZ2V0KCJzY2FsZUxpbWl0IiksbC5zZXRCb3VuZGluZ1JlY3QoclswXSxyWzFdLG9bMF0tclswXSxvWzFdLXJbMV0pLGwuc2V0Q2VudGVyKHQuZ2V0KCJjZW50ZXIiKSxlKSxsLnNldFpvb20odC5nZXQoInpvb20iKSksdGhpcy5ncm91cC5hdHRyKHt4OmwueCx5OmwueSxzY2FsZVg6bC5zY2FsZVgsc2NhbGVZOmwuc2NhbGVZfSksdGhpcy5fbWluPXIsdGhpcy5fbWF4PW99LGUucHJvdG90eXBlLl91cGRhdGVDb250cm9sbGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9dGhpcy5fY29udHJvbGxlcixvPXRoaXMuX2NvbnRyb2xsZXJIb3N0LGE9dGhpcy5ncm91cDtyLnNldFBvaW50ZXJDaGVja2VyKChmdW5jdGlvbihlLGkscil7dmFyIG89YS5nZXRCb3VuZGluZ1JlY3QoKTtyZXR1cm4gby5hcHBseVRyYW5zZm9ybShhLnRyYW5zZm9ybSksby5jb250YWluKGkscikmJiFoVChlLG4sdCl9KSksci5lbmFibGUodC5nZXQoInJvYW0iKSksby56b29tTGltaXQ9dC5nZXQoInNjYWxlTGltaXQiKSxvLnpvb209dC5jb29yZGluYXRlU3lzdGVtLmdldFpvb20oKSxyLm9mZigicGFuIikub2ZmKCJ6b29tIikub24oInBhbiIsKGZ1bmN0aW9uKGUpe2FUKG8sZS5keCxlLmR5KSxuLmRpc3BhdGNoQWN0aW9uKHtzZXJpZXNJZDp0LmlkLHR5cGU6InRyZWVSb2FtIixkeDplLmR4LGR5OmUuZHl9KX0pKS5vbigiem9vbSIsKGZ1bmN0aW9uKGUpe3NUKG8sZS5zY2FsZSxlLm9yaWdpblgsZS5vcmlnaW5ZKSxuLmRpc3BhdGNoQWN0aW9uKHtzZXJpZXNJZDp0LmlkLHR5cGU6InRyZWVSb2FtIix6b29tOmUuc2NhbGUsb3JpZ2luWDplLm9yaWdpblgsb3JpZ2luWTplLm9yaWdpbll9KSxpLl91cGRhdGVOb2RlQW5kTGlua1NjYWxlKHQpLG4udXBkYXRlTGFiZWxMYXlvdXQoKX0pKX0sZS5wcm90b3R5cGUuX3VwZGF0ZU5vZGVBbmRMaW5rU2NhbGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCksbj10aGlzLl9nZXROb2RlR2xvYmFsU2NhbGUodCk7ZS5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCxlKXt0LnNldFN5bWJvbFNjYWxlKG4pfSkpfSxlLnByb3RvdHlwZS5fZ2V0Tm9kZUdsb2JhbFNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29vcmRpbmF0ZVN5c3RlbTtpZigidmlldyIhPT1lLnR5cGUpcmV0dXJuIDE7dmFyIG49dGhpcy5fbm9kZVNjYWxlUmF0aW8saT1lLnNjYWxlWHx8MTtyZXR1cm4oKGUuZ2V0Wm9vbSgpLTEpKm4rMSkvaX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2NvbnRyb2xsZXImJnRoaXMuX2NvbnRyb2xsZXIuZGlzcG9zZSgpLHRoaXMuX2NvbnRyb2xsZXJIb3N0PW51bGx9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX21haW5Hcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9LGUudHlwZT0idHJlZSIsZX0oT2cpO2Z1bmN0aW9uIEZDKHQsZSl7dmFyIG49dC5nZXRJdGVtTGF5b3V0KGUpO3JldHVybiBuJiYhaXNOYU4obi54KSYmIWlzTmFOKG4ueSl9ZnVuY3Rpb24gR0ModCxlLG4saSxyKXt2YXIgbz0hbixhPXQudHJlZS5nZXROb2RlQnlEYXRhSW5kZXgoZSkscz1hLmdldE1vZGVsKCksbD1hLmdldFZpc3VhbCgic3R5bGUiKS5maWxsLHU9ITE9PT1hLmlzRXhwYW5kJiYwIT09YS5jaGlsZHJlbi5sZW5ndGg/bDoiI2ZmZiIsaD10LnRyZWUucm9vdCxjPWEucGFyZW50Tm9kZT09PWg/YTphLnBhcmVudE5vZGV8fGEscD10LmdldEl0ZW1HcmFwaGljRWwoYy5kYXRhSW5kZXgpLGQ9Yy5nZXRMYXlvdXQoKSxmPXA/e3g6cC5fX29sZFgseTpwLl9fb2xkWSxyYXdYOnAuX19yYWRpYWxPbGRSYXdYLHJhd1k6cC5fX3JhZGlhbE9sZFJhd1l9OmQsZz1hLmdldExheW91dCgpO28/KChuPW5ldyBmUyh0LGUsbnVsbCx7c3ltYm9sSW5uZXJDb2xvcjp1LHVzZU5hbWVMYWJlbDohMH0pKS54PWYueCxuLnk9Zi55KTpuLnVwZGF0ZURhdGEodCxlLG51bGwse3N5bWJvbElubmVyQ29sb3I6dSx1c2VOYW1lTGFiZWw6ITB9KSxuLl9fcmFkaWFsT2xkUmF3WD1uLl9fcmFkaWFsUmF3WCxuLl9fcmFkaWFsT2xkUmF3WT1uLl9fcmFkaWFsUmF3WSxuLl9fcmFkaWFsUmF3WD1nLnJhd1gsbi5fX3JhZGlhbFJhd1k9Zy5yYXdZLGkuYWRkKG4pLHQuc2V0SXRlbUdyYXBoaWNFbChlLG4pLG4uX19vbGRYPW4ueCxuLl9fb2xkWT1uLnksdmgobix7eDpnLngseTpnLnl9LHIpO3ZhciB5PW4uZ2V0U3ltYm9sUGF0aCgpO2lmKCJyYWRpYWwiPT09ci5nZXQoImxheW91dCIpKXt2YXIgdj1oLmNoaWxkcmVuWzBdLG09di5nZXRMYXlvdXQoKSx4PXYuY2hpbGRyZW4ubGVuZ3RoLF89dm9pZCAwLGI9dm9pZCAwO2lmKGcueD09PW0ueCYmITA9PT1hLmlzRXhwYW5kJiZ2LmNoaWxkcmVuLmxlbmd0aCl7dmFyIHc9e3g6KHYuY2hpbGRyZW5bMF0uZ2V0TGF5b3V0KCkueCt2LmNoaWxkcmVuW3gtMV0uZ2V0TGF5b3V0KCkueCkvMix5Oih2LmNoaWxkcmVuWzBdLmdldExheW91dCgpLnkrdi5jaGlsZHJlblt4LTFdLmdldExheW91dCgpLnkpLzJ9OyhfPU1hdGguYXRhbjIody55LW0ueSx3LngtbS54KSk8MCYmKF89MipNYXRoLlBJK18pLChiPXcueDxtLngpJiYoXy09TWF0aC5QSSl9ZWxzZShfPU1hdGguYXRhbjIoZy55LW0ueSxnLngtbS54KSk8MCYmKF89MipNYXRoLlBJK18pLDA9PT1hLmNoaWxkcmVuLmxlbmd0aHx8MCE9PWEuY2hpbGRyZW4ubGVuZ3RoJiYhMT09PWEuaXNFeHBhbmQ/KGI9Zy54PG0ueCkmJihfLT1NYXRoLlBJKTooYj1nLng+bS54KXx8KF8tPU1hdGguUEkpO3ZhciBTPWI/ImxlZnQiOiJyaWdodCIsTT1zLmdldE1vZGVsKCJsYWJlbCIpLEk9TS5nZXQoInJvdGF0ZSIpLFQ9SSooTWF0aC5QSS8xODApLEM9eS5nZXRUZXh0Q29udGVudCgpO0MmJih5LnNldFRleHRDb25maWcoe3Bvc2l0aW9uOk0uZ2V0KCJwb3NpdGlvbiIpfHxTLHJvdGF0aW9uOm51bGw9PUk/LV86VCxvcmlnaW46ImNlbnRlciJ9KSxDLnNldFN0eWxlKCJ2ZXJ0aWNhbEFsaWduIiwibWlkZGxlIikpfXZhciBEPXMuZ2V0KFsiZW1waGFzaXMiLCJmb2N1cyJdKSxBPSJyZWxhdGl2ZSI9PT1EP3Z0KGEuZ2V0QW5jZXN0b3JzSW5kaWNlcygpLGEuZ2V0RGVzY2VuZGFudEluZGljZXMoKSk6ImFuY2VzdG9yIj09PUQ/YS5nZXRBbmNlc3RvcnNJbmRpY2VzKCk6ImRlc2NlbmRhbnQiPT09RD9hLmdldERlc2NlbmRhbnRJbmRpY2VzKCk6bnVsbDtBJiYocmwobikuZm9jdXM9QSksZnVuY3Rpb24odCxlLG4saSxyLG8sYSxzKXt2YXIgbD1lLmdldE1vZGVsKCksdT10LmdldCgiZWRnZVNoYXBlIiksaD10LmdldCgibGF5b3V0IiksYz10LmdldE9yaWVudCgpLHA9dC5nZXQoWyJsaW5lU3R5bGUiLCJjdXJ2ZW5lc3MiXSksZD10LmdldCgiZWRnZUZvcmtQb3NpdGlvbiIpLGY9bC5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksZz1pLl9fZWRnZTtpZigiY3VydmUiPT09dSllLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PW4mJihnfHwoZz1pLl9fZWRnZT1uZXcgdGgoe3NoYXBlOlhDKGgsYyxwLHIscil9KSksdmgoZyx7c2hhcGU6WEMoaCxjLHAsbyxhKX0sdCkpO2Vsc2UgaWYoInBvbHlsaW5lIj09PXUpaWYoIm9ydGhvZ29uYWwiPT09aCl7aWYoZSE9PW4mJmUuY2hpbGRyZW4mJjAhPT1lLmNoaWxkcmVuLmxlbmd0aCYmITA9PT1lLmlzRXhwYW5kKXtmb3IodmFyIHk9ZS5jaGlsZHJlbix2PVtdLG09MDttPHkubGVuZ3RoO20rKyl7dmFyIHg9eVttXS5nZXRMYXlvdXQoKTt2LnB1c2goW3gueCx4LnldKX1nfHwoZz1pLl9fZWRnZT1uZXcgVkMoe3NoYXBlOntwYXJlbnRQb2ludDpbYS54LGEueV0sY2hpbGRQb2ludHM6W1thLngsYS55XV0sb3JpZW50OmMsZm9ya1Bvc2l0aW9uOmR9fSkpLHZoKGcse3NoYXBlOntwYXJlbnRQb2ludDpbYS54LGEueV0sY2hpbGRQb2ludHM6dn19LHQpfX1lbHNlIDA7ZyYmKCJwb2x5bGluZSIhPT11fHxlLmlzRXhwYW5kKSYmKGcudXNlU3R5bGUoayh7c3Ryb2tlTm9TY2FsZTohMCxmaWxsOm51bGx9LGYpKSwkbChnLGwsImxpbmVTdHlsZSIpLGtsKGcpLHMuYWRkKGcpKX0ocixhLGgsbixmLGQsZyxpKSxuLl9fZWRnZSYmKG4ub25Ib3ZlclN0YXRlQ2hhbmdlPWZ1bmN0aW9uKGUpe2lmKCJibHVyIiE9PWUpe3ZhciBpPWEucGFyZW50Tm9kZSYmdC5nZXRJdGVtR3JhcGhpY0VsKGEucGFyZW50Tm9kZS5kYXRhSW5kZXgpO2kmJjE9PT1pLmhvdmVyU3RhdGV8fERsKG4uX19lZGdlLGUpfX0pfWZ1bmN0aW9uIFdDKHQsZSxuLGkscil7dmFyIG89SEMoZS50cmVlLnJvb3QsdCksYT1vLnNvdXJjZSxzPW8uc291cmNlTGF5b3V0LGw9ZS5nZXRJdGVtR3JhcGhpY0VsKHQuZGF0YUluZGV4KTtpZihsKXt2YXIgdT1lLmdldEl0ZW1HcmFwaGljRWwoYS5kYXRhSW5kZXgpLl9fZWRnZSxoPWwuX19lZGdlfHwoITE9PT1hLmlzRXhwYW5kfHwxPT09YS5jaGlsZHJlbi5sZW5ndGg/dTp2b2lkIDApLGM9aS5nZXQoImVkZ2VTaGFwZSIpLHA9aS5nZXQoImxheW91dCIpLGQ9aS5nZXQoIm9yaWVudCIpLGY9aS5nZXQoWyJsaW5lU3R5bGUiLCJjdXJ2ZW5lc3MiXSk7aCYmKCJjdXJ2ZSI9PT1jP19oKGgse3NoYXBlOlhDKHAsZCxmLHMscyksc3R5bGU6e29wYWNpdHk6MH19LGkse2NiOmZ1bmN0aW9uKCl7bi5yZW1vdmUoaCl9LHJlbW92ZU9wdDpyfSk6InBvbHlsaW5lIj09PWMmJiJvcnRob2dvbmFsIj09PWkuZ2V0KCJsYXlvdXQiKSYmX2goaCx7c2hhcGU6e3BhcmVudFBvaW50OltzLngscy55XSxjaGlsZFBvaW50czpbW3MueCxzLnldXX0sc3R5bGU6e29wYWNpdHk6MH19LGkse2NiOmZ1bmN0aW9uKCl7bi5yZW1vdmUoaCl9LHJlbW92ZU9wdDpyfSkpfX1mdW5jdGlvbiBIQyh0LGUpe2Zvcih2YXIgbixpPWUucGFyZW50Tm9kZT09PXQ/ZTplLnBhcmVudE5vZGV8fGU7bnVsbD09KG49aS5nZXRMYXlvdXQoKSk7KWk9aS5wYXJlbnROb2RlPT09dD9pOmkucGFyZW50Tm9kZXx8aTtyZXR1cm57c291cmNlOmksc291cmNlTGF5b3V0Om59fWZ1bmN0aW9uIFlDKHQsZSxuLGkscil7dmFyIG89dC50cmVlLmdldE5vZGVCeURhdGFJbmRleChlKSxhPUhDKHQudHJlZS5yb290LG8pLnNvdXJjZUxheW91dCxzPXtkdXJhdGlvbjpyLmdldCgiYW5pbWF0aW9uRHVyYXRpb25VcGRhdGUiKSxlYXNpbmc6ci5nZXQoImFuaW1hdGlvbkVhc2luZ1VwZGF0ZSIpfTtfaChuLHt4OmEueCsxLHk6YS55KzF9LHIse2NiOmZ1bmN0aW9uKCl7aS5yZW1vdmUobiksdC5zZXRJdGVtR3JhcGhpY0VsKGUsbnVsbCl9LHJlbW92ZU9wdDpzfSksbi5mYWRlT3V0KG51bGwsdC5ob3N0TW9kZWwse2ZhZGVMYWJlbDohMCxhbmltYXRpb246c30pLG8uY2hpbGRyZW4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7V0MoZSx0LGkscixzKX0pKSxXQyhvLHQsaSxyLHMpfWZ1bmN0aW9uIFhDKHQsZSxuLGkscil7dmFyIG8sYSxzLGwsdSxoLGMscDtpZigicmFkaWFsIj09PXQpe3U9aS5yYXdYLGM9aS5yYXdZLGg9ci5yYXdYLHA9ci5yYXdZO3ZhciBkPUxDKHUsYyksZj1MQyh1LGMrKHAtYykqbiksZz1MQyhoLHArKGMtcCkqbikseT1MQyhoLHApO3JldHVybnt4MTpkLnh8fDAseTE6ZC55fHwwLHgyOnkueHx8MCx5Mjp5Lnl8fDAsY3B4MTpmLnh8fDAsY3B5MTpmLnl8fDAsY3B4MjpnLnh8fDAsY3B5MjpnLnl8fDB9fXJldHVybiB1PWkueCxjPWkueSxoPXIueCxwPXIueSwiTFIiIT09ZSYmIlJMIiE9PWV8fChvPXUrKGgtdSkqbixhPWMscz1oKyh1LWgpKm4sbD1wKSwiVEIiIT09ZSYmIkJUIiE9PWV8fChvPXUsYT1jKyhwLWMpKm4scz1oLGw9cCsoYy1wKSpuKSx7eDE6dSx5MTpjLHgyOmgseTI6cCxjcHgxOm8sY3B5MTphLGNweDI6cyxjcHkyOmx9fXZhciBVQz1WbygpO2Z1bmN0aW9uIFpDKHQpe3ZhciBlPXQubWFpbkRhdGEsbj10LmRhdGFzO258fChuPXttYWluOmV9LHQuZGF0YXNBdHRyPXttYWluOiJkYXRhIn0pLHQuZGF0YXM9dC5tYWluRGF0YT1udWxsLFFDKGUsbix0KSxFKG4sKGZ1bmN0aW9uKG4pe0UoZS5UUkFOU0ZFUkFCTEVfTUVUSE9EUywoZnVuY3Rpb24oZSl7bi53cmFwTWV0aG9kKGUsSChqQyx0KSl9KSl9KSksZS53cmFwTWV0aG9kKCJjbG9uZVNoYWxsb3ciLEgoS0MsdCkpLEUoZS5DSEFOR0FCTEVfTUVUSE9EUywoZnVuY3Rpb24obil7ZS53cmFwTWV0aG9kKG4sSChxQyx0KSl9KSksbHQobltlLmRhdGFUeXBlXT09PWUpfWZ1bmN0aW9uIGpDKHQsZSl7aWYoVUMoaT10aGlzKS5tYWluRGF0YT09PWkpe3ZhciBuPUEoe30sVUModGhpcykuZGF0YXMpO25bdGhpcy5kYXRhVHlwZV09ZSxRQyhlLG4sdCl9ZWxzZSB0RChlLHRoaXMuZGF0YVR5cGUsVUModGhpcykubWFpbkRhdGEsdCk7dmFyIGk7cmV0dXJuIGV9ZnVuY3Rpb24gcUModCxlKXtyZXR1cm4gdC5zdHJ1Y3QmJnQuc3RydWN0LnVwZGF0ZSgpLGV9ZnVuY3Rpb24gS0ModCxlKXtyZXR1cm4gRShVQyhlKS5kYXRhcywoZnVuY3Rpb24obixpKXtuIT09ZSYmdEQobi5jbG9uZVNoYWxsb3coKSxpLGUsdCl9KSksZX1mdW5jdGlvbiAkQyh0KXt2YXIgZT1VQyh0aGlzKS5tYWluRGF0YTtyZXR1cm4gbnVsbD09dHx8bnVsbD09ZT9lOlVDKGUpLmRhdGFzW3RdfWZ1bmN0aW9uIEpDKCl7dmFyIHQ9VUModGhpcykubWFpbkRhdGE7cmV0dXJuIG51bGw9PXQ/W3tkYXRhOnR9XTp6KEcoVUModCkuZGF0YXMpLChmdW5jdGlvbihlKXtyZXR1cm57dHlwZTplLGRhdGE6VUModCkuZGF0YXNbZV19fSkpfWZ1bmN0aW9uIFFDKHQsZSxuKXtVQyh0KS5kYXRhcz17fSxFKGUsKGZ1bmN0aW9uKGUsaSl7dEQoZSxpLHQsbil9KSl9ZnVuY3Rpb24gdEQodCxlLG4saSl7VUMobikuZGF0YXNbZV09dCxVQyh0KS5tYWluRGF0YT1uLHQuZGF0YVR5cGU9ZSxpLnN0cnVjdCYmKHRbaS5zdHJ1Y3RBdHRyXT1pLnN0cnVjdCxpLnN0cnVjdFtpLmRhdGFzQXR0cltlXV09dCksdC5nZXRMaW5rZWREYXRhPSRDLHQuZ2V0TGlua2VkRGF0YUFsbD1KQ312YXIgZUQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5kZXB0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5kYXRhSW5kZXg9LTEsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnZpZXdDaGlsZHJlbj1bXSx0aGlzLmlzRXhwYW5kPSExLHRoaXMubmFtZT10fHwiIix0aGlzLmhvc3RUcmVlPWV9cmV0dXJuIHQucHJvdG90eXBlLmlzUmVtb3ZlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGFJbmRleDwwfSx0LnByb3RvdHlwZS5lYWNoTm9kZT1mdW5jdGlvbih0LGUsbil7WCh0KSYmKG49ZSxlPXQsdD1udWxsKSxVKHQ9dHx8e30pJiYodD17b3JkZXI6dH0pO3ZhciBpLHI9dC5vcmRlcnx8InByZW9yZGVyIixvPXRoaXNbdC5hdHRyfHwiY2hpbGRyZW4iXTsicHJlb3JkZXIiPT09ciYmKGk9ZS5jYWxsKG4sdGhpcykpO2Zvcih2YXIgYT0wOyFpJiZhPG8ubGVuZ3RoO2ErKylvW2FdLmVhY2hOb2RlKHQsZSxuKTsicG9zdG9yZGVyIj09PXImJmUuY2FsbChuLHRoaXMpfSx0LnByb3RvdHlwZS51cGRhdGVEZXB0aEFuZEhlaWdodD1mdW5jdGlvbih0KXt2YXIgZT0wO3RoaXMuZGVwdGg9dDtmb3IodmFyIG49MDtuPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO24rKyl7dmFyIGk9dGhpcy5jaGlsZHJlbltuXTtpLnVwZGF0ZURlcHRoQW5kSGVpZ2h0KHQrMSksaS5oZWlnaHQ+ZSYmKGU9aS5oZWlnaHQpfXRoaXMuaGVpZ2h0PWUrMX0sdC5wcm90b3R5cGUuZ2V0Tm9kZUJ5SWQ9ZnVuY3Rpb24odCl7aWYodGhpcy5nZXRJZCgpPT09dClyZXR1cm4gdGhpcztmb3IodmFyIGU9MCxuPXRoaXMuY2hpbGRyZW4saT1uLmxlbmd0aDtlPGk7ZSsrKXt2YXIgcj1uW2VdLmdldE5vZGVCeUlkKHQpO2lmKHIpcmV0dXJuIHJ9fSx0LnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtpZih0PT09dGhpcylyZXR1cm4hMDtmb3IodmFyIGU9MCxuPXRoaXMuY2hpbGRyZW4saT1uLmxlbmd0aDtlPGk7ZSsrKXt2YXIgcj1uW2VdLmNvbnRhaW5zKHQpO2lmKHIpcmV0dXJuIHJ9fSx0LnByb3RvdHlwZS5nZXRBbmNlc3RvcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dD90aGlzOnRoaXMucGFyZW50Tm9kZTtuOyllLnB1c2gobiksbj1uLnBhcmVudE5vZGU7cmV0dXJuIGUucmV2ZXJzZSgpLGV9LHQucHJvdG90eXBlLmdldEFuY2VzdG9yc0luZGljZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT10aGlzO2U7KXQucHVzaChlLmRhdGFJbmRleCksZT1lLnBhcmVudE5vZGU7cmV0dXJuIHQucmV2ZXJzZSgpLHR9LHQucHJvdG90eXBlLmdldERlc2NlbmRhbnRJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaE5vZGUoKGZ1bmN0aW9uKGUpe3QucHVzaChlLmRhdGFJbmRleCl9KSksdH0sdC5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ob3N0VHJlZS5kYXRhO3JldHVybiBlLmdldFN0b3JlKCkuZ2V0KGUuZ2V0RGltZW5zaW9uSW5kZXgodHx8InZhbHVlIiksdGhpcy5kYXRhSW5kZXgpfSx0LnByb3RvdHlwZS5zZXRMYXlvdXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGFJbmRleD49MCYmdGhpcy5ob3N0VHJlZS5kYXRhLnNldEl0ZW1MYXlvdXQodGhpcy5kYXRhSW5kZXgsdCxlKX0sdC5wcm90b3R5cGUuZ2V0TGF5b3V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFRyZWUuZGF0YS5nZXRJdGVtTGF5b3V0KHRoaXMuZGF0YUluZGV4KX0sdC5wcm90b3R5cGUuZ2V0TW9kZWw9ZnVuY3Rpb24odCl7aWYoISh0aGlzLmRhdGFJbmRleDwwKSlyZXR1cm4gdGhpcy5ob3N0VHJlZS5kYXRhLmdldEl0ZW1Nb2RlbCh0aGlzLmRhdGFJbmRleCkuZ2V0TW9kZWwodCl9LHQucHJvdG90eXBlLmdldExldmVsTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5ob3N0VHJlZS5sZXZlbE1vZGVsc3x8W10pW3RoaXMuZGVwdGhdfSx0LnByb3RvdHlwZS5zZXRWaXN1YWw9ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGFJbmRleD49MCYmdGhpcy5ob3N0VHJlZS5kYXRhLnNldEl0ZW1WaXN1YWwodGhpcy5kYXRhSW5kZXgsdCxlKX0sdC5wcm90b3R5cGUuZ2V0VmlzdWFsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhvc3RUcmVlLmRhdGEuZ2V0SXRlbVZpc3VhbCh0aGlzLmRhdGFJbmRleCx0KX0sdC5wcm90b3R5cGUuZ2V0UmF3SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3N0VHJlZS5kYXRhLmdldFJhd0luZGV4KHRoaXMuZGF0YUluZGV4KX0sdC5wcm90b3R5cGUuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3N0VHJlZS5kYXRhLmdldElkKHRoaXMuZGF0YUluZGV4KX0sdC5wcm90b3R5cGUuZ2V0Q2hpbGRJbmRleD1mdW5jdGlvbigpe2lmKHRoaXMucGFyZW50Tm9kZSl7Zm9yKHZhciB0PXRoaXMucGFyZW50Tm9kZS5jaGlsZHJlbixlPTA7ZTx0Lmxlbmd0aDsrK2UpaWYodFtlXT09PXRoaXMpcmV0dXJuIGU7cmV0dXJuLTF9cmV0dXJuLTF9LHQucHJvdG90eXBlLmlzQW5jZXN0b3JPZj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5wYXJlbnROb2RlO2U7KXtpZihlPT09dGhpcylyZXR1cm4hMDtlPWUucGFyZW50Tm9kZX1yZXR1cm4hMX0sdC5wcm90b3R5cGUuaXNEZXNjZW5kYW50T2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT10aGlzJiZ0LmlzQW5jZXN0b3JPZih0aGlzKX0sdH0oKSxuRD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy50eXBlPSJ0cmVlIix0aGlzLl9ub2Rlcz1bXSx0aGlzLmhvc3RNb2RlbD10fXJldHVybiB0LnByb3RvdHlwZS5lYWNoTm9kZT1mdW5jdGlvbih0LGUsbil7dGhpcy5yb290LmVhY2hOb2RlKHQsZSxuKX0sdC5wcm90b3R5cGUuZ2V0Tm9kZUJ5RGF0YUluZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YS5nZXRSYXdJbmRleCh0KTtyZXR1cm4gdGhpcy5fbm9kZXNbZV19LHQucHJvdG90eXBlLmdldE5vZGVCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJvb3QuZ2V0Tm9kZUJ5SWQodCl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmRhdGEsZT10aGlzLl9ub2RlcyxuPTAsaT1lLmxlbmd0aDtuPGk7bisrKWVbbl0uZGF0YUluZGV4PS0xO2ZvcihuPTAsaT10LmNvdW50KCk7bjxpO24rKyllW3QuZ2V0UmF3SW5kZXgobildLmRhdGFJbmRleD1ufSx0LnByb3RvdHlwZS5jbGVhckxheW91dHM9ZnVuY3Rpb24oKXt0aGlzLmRhdGEuY2xlYXJJdGVtTGF5b3V0cygpfSx0LmNyZWF0ZVRyZWU9ZnVuY3Rpb24oZSxuLGkpe3ZhciByPW5ldyB0KG4pLG89W10sYT0xOyFmdW5jdGlvbiB0KGUsbil7dmFyIGk9ZS52YWx1ZTthPU1hdGgubWF4KGEsWShpKT9pLmxlbmd0aDoxKSxvLnB1c2goZSk7dmFyIHM9bmV3IGVEKFJvKGUubmFtZSwiIikscik7bj9mdW5jdGlvbih0LGUpe3ZhciBuPWUuY2hpbGRyZW47aWYodC5wYXJlbnROb2RlPT09ZSlyZXR1cm47bi5wdXNoKHQpLHQucGFyZW50Tm9kZT1lfShzLG4pOnIucm9vdD1zLHIuX25vZGVzLnB1c2gocyk7dmFyIGw9ZS5jaGlsZHJlbjtpZihsKWZvcih2YXIgdT0wO3U8bC5sZW5ndGg7dSsrKXQobFt1XSxzKX0oZSksci5yb290LnVwZGF0ZURlcHRoQW5kSGVpZ2h0KDApO3ZhciBzPXB4KG8se2Nvb3JkRGltZW5zaW9uczpbInZhbHVlIl0sZGltZW5zaW9uc0NvdW50OmF9KS5kaW1lbnNpb25zLGw9bmV3IGN4KHMsbik7cmV0dXJuIGwuaW5pdERhdGEobyksaSYmaShsKSxaQyh7bWFpbkRhdGE6bCxzdHJ1Y3Q6cixzdHJ1Y3RBdHRyOiJ0cmVlIn0pLHIudXBkYXRlKCkscn0sdH0oKTtmdW5jdGlvbiBpRCh0LGUsbil7aWYodCYmUChlLHQudHlwZSk+PTApe3ZhciBpPW4uZ2V0RGF0YSgpLnRyZWUucm9vdCxyPXQudGFyZ2V0Tm9kZTtpZihVKHIpJiYocj1pLmdldE5vZGVCeUlkKHIpKSxyJiZpLmNvbnRhaW5zKHIpKXJldHVybntub2RlOnJ9O3ZhciBvPXQudGFyZ2V0Tm9kZUlkO2lmKG51bGwhPW8mJihyPWkuZ2V0Tm9kZUJ5SWQobykpKXJldHVybntub2RlOnJ9fX1mdW5jdGlvbiByRCh0KXtmb3IodmFyIGU9W107dDspKHQ9dC5wYXJlbnROb2RlKSYmZS5wdXNoKHQpO3JldHVybiBlLnJldmVyc2UoKX1mdW5jdGlvbiBvRCh0LGUpe3JldHVybiBQKHJEKHQpLGUpPj0wfWZ1bmN0aW9uIGFEKHQsZSl7Zm9yKHZhciBuPVtdO3Q7KXt2YXIgaT10LmRhdGFJbmRleDtuLnB1c2goe25hbWU6dC5uYW1lLGRhdGFJbmRleDppLHZhbHVlOmUuZ2V0UmF3VmFsdWUoaSl9KSx0PXQucGFyZW50Tm9kZX1yZXR1cm4gbi5yZXZlcnNlKCksbn12YXIgc0Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5oYXNTeW1ib2xWaXN1YWw9ITAsZS5pZ25vcmVTdHlsZU9uRGF0YT0hMCxlfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCl7dmFyIGU9e25hbWU6dC5uYW1lLGNoaWxkcmVuOnQuZGF0YX0sbj10LmxlYXZlc3x8e30saT1uZXcgQ2Mobix0aGlzLHRoaXMuZWNNb2RlbCkscj1uRC5jcmVhdGVUcmVlKGUsdGhpcywoZnVuY3Rpb24odCl7dC53cmFwTWV0aG9kKCJnZXRJdGVtTW9kZWwiLChmdW5jdGlvbih0LGUpe3ZhciBuPXIuZ2V0Tm9kZUJ5RGF0YUluZGV4KGUpO3JldHVybiBuJiZuLmNoaWxkcmVuLmxlbmd0aCYmbi5pc0V4cGFuZHx8KHQucGFyZW50TW9kZWw9aSksdH0pKX0pKTt2YXIgbz0wO3IuZWFjaE5vZGUoInByZW9yZGVyIiwoZnVuY3Rpb24odCl7dC5kZXB0aD5vJiYobz10LmRlcHRoKX0pKTt2YXIgYT10LmV4cGFuZEFuZENvbGxhcHNlJiZ0LmluaXRpYWxUcmVlRGVwdGg+PTA/dC5pbml0aWFsVHJlZURlcHRoOm87cmV0dXJuIHIucm9vdC5lYWNoTm9kZSgicHJlb3JkZXIiLChmdW5jdGlvbih0KXt2YXIgZT10Lmhvc3RUcmVlLmRhdGEuZ2V0UmF3RGF0YUl0ZW0odC5kYXRhSW5kZXgpO3QuaXNFeHBhbmQ9ZSYmbnVsbCE9ZS5jb2xsYXBzZWQ/IWUuY29sbGFwc2VkOnQuZGVwdGg8PWF9KSksci5kYXRhfSxlLnByb3RvdHlwZS5nZXRPcmllbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldCgib3JpZW50Iik7cmV0dXJuImhvcml6b250YWwiPT09dD90PSJMUiI6InZlcnRpY2FsIj09PXQmJih0PSJUQiIpLHR9LGUucHJvdG90eXBlLnNldFpvb209ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uem9vbT10fSxlLnByb3RvdHlwZS5zZXRDZW50ZXI9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uY2VudGVyPXR9LGUucHJvdG90eXBlLmZvcm1hdFRvb2x0aXA9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10aGlzLmdldERhdGEoKS50cmVlLHI9aS5yb290LmNoaWxkcmVuWzBdLG89aS5nZXROb2RlQnlEYXRhSW5kZXgodCksYT1vLmdldFZhbHVlKCkscz1vLm5hbWU7byYmbyE9PXI7KXM9by5wYXJlbnROb2RlLm5hbWUrIi4iK3Msbz1vLnBhcmVudE5vZGU7cmV0dXJuIG9nKCJuYW1lVmFsdWUiLHtuYW1lOnMsdmFsdWU6YSxub1ZhbHVlOmlzTmFOKGEpfHxudWxsPT1hfSl9LGUucHJvdG90eXBlLmdldERhdGFQYXJhbXM9ZnVuY3Rpb24oZSl7dmFyIG49dC5wcm90b3R5cGUuZ2V0RGF0YVBhcmFtcy5hcHBseSh0aGlzLGFyZ3VtZW50cyksaT10aGlzLmdldERhdGEoKS50cmVlLmdldE5vZGVCeURhdGFJbmRleChlKTtyZXR1cm4gbi50cmVlQW5jZXN0b3JzPWFEKGksdGhpcyksbi5jb2xsYXBzZWQ9IWkuaXNFeHBhbmQsbn0sZS50eXBlPSJzZXJpZXMudHJlZSIsZS5sYXlvdXRNb2RlPSJib3giLGUuZGVmYXVsdE9wdGlvbj17ejoyLGNvb3JkaW5hdGVTeXN0ZW06InZpZXciLGxlZnQ6IjEyJSIsdG9wOiIxMiUiLHJpZ2h0OiIxMiUiLGJvdHRvbToiMTIlIixsYXlvdXQ6Im9ydGhvZ29uYWwiLGVkZ2VTaGFwZToiY3VydmUiLGVkZ2VGb3JrUG9zaXRpb246IjUwJSIscm9hbTohMSxub2RlU2NhbGVSYXRpbzouNCxjZW50ZXI6bnVsbCx6b29tOjEsb3JpZW50OiJMUiIsc3ltYm9sOiJlbXB0eUNpcmNsZSIsc3ltYm9sU2l6ZTo3LGV4cGFuZEFuZENvbGxhcHNlOiEwLGluaXRpYWxUcmVlRGVwdGg6MixsaW5lU3R5bGU6e2NvbG9yOiIjY2NjIix3aWR0aDoxLjUsY3VydmVuZXNzOi41fSxpdGVtU3R5bGU6e2NvbG9yOiJsaWdodHN0ZWVsYmx1ZSIsYm9yZGVyV2lkdGg6MS41fSxsYWJlbDp7c2hvdzohMH0sYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGFuaW1hdGlvbkR1cmF0aW9uOjcwMCxhbmltYXRpb25EdXJhdGlvblVwZGF0ZTo1MDB9LGV9KGJnKTtmdW5jdGlvbiBsRCh0LGUpe2Zvcih2YXIgbixpPVt0XTtuPWkucG9wKCk7KWlmKGUobiksbi5pc0V4cGFuZCl7dmFyIHI9bi5jaGlsZHJlbjtpZihyLmxlbmd0aClmb3IodmFyIG89ci5sZW5ndGgtMTtvPj0wO28tLSlpLnB1c2gocltvXSl9fWZ1bmN0aW9uIHVEKHQsZSl7dC5lYWNoU2VyaWVzQnlUeXBlKCJ0cmVlIiwoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3AodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSl9KHQsZSk7dC5sYXlvdXRJbmZvPW47dmFyIGk9dC5nZXQoImxheW91dCIpLHI9MCxvPTAsYT1udWxsOyJyYWRpYWwiPT09aT8ocj0yKk1hdGguUEksbz1NYXRoLm1pbihuLmhlaWdodCxuLndpZHRoKS8yLGE9a0MoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQucGFyZW50Tm9kZT09PWUucGFyZW50Tm9kZT8xOjIpL3QuZGVwdGh9KSkpOihyPW4ud2lkdGgsbz1uLmhlaWdodCxhPWtDKCkpO3ZhciBzPXQuZ2V0RGF0YSgpLnRyZWUucm9vdCxsPXMuY2hpbGRyZW5bMF07aWYobCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXQ7ZS5oaWVyTm9kZT17ZGVmYXVsdEFuY2VzdG9yOm51bGwsYW5jZXN0b3I6ZSxwcmVsaW06MCxtb2RpZmllcjowLGNoYW5nZTowLHNoaWZ0OjAsaTowLHRocmVhZDpudWxsfTtmb3IodmFyIG4saSxyPVtlXTtuPXIucG9wKCk7KWlmKGk9bi5jaGlsZHJlbixuLmlzRXhwYW5kJiZpLmxlbmd0aClmb3IodmFyIG89aS5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIGE9aVtvXTthLmhpZXJOb2RlPXtkZWZhdWx0QW5jZXN0b3I6bnVsbCxhbmNlc3RvcjphLHByZWxpbTowLG1vZGlmaWVyOjAsY2hhbmdlOjAsc2hpZnQ6MCxpOm8sdGhyZWFkOm51bGx9LHIucHVzaChhKX19KHMpLGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkscj1bdF0sbz1bXTtpPXIucG9wKCk7KWlmKG8ucHVzaChpKSxpLmlzRXhwYW5kKXt2YXIgYT1pLmNoaWxkcmVuO2lmKGEubGVuZ3RoKWZvcih2YXIgcz0wO3M8YS5sZW5ndGg7cysrKXIucHVzaChhW3NdKX1mb3IoO2k9by5wb3AoKTspZShpLG4pfShsLERDLGEpLHMuaGllck5vZGUubW9kaWZpZXI9LWwuaGllck5vZGUucHJlbGltLGxEKGwsQUMpO3ZhciB1PWwsaD1sLGM9bDtsRChsLChmdW5jdGlvbih0KXt2YXIgZT10LmdldExheW91dCgpLng7ZTx1LmdldExheW91dCgpLngmJih1PXQpLGU+aC5nZXRMYXlvdXQoKS54JiYoaD10KSx0LmRlcHRoPmMuZGVwdGgmJihjPXQpfSkpO3ZhciBwPXU9PT1oPzE6YSh1LGgpLzIsZD1wLXUuZ2V0TGF5b3V0KCkueCxmPTAsZz0wLHk9MCx2PTA7aWYoInJhZGlhbCI9PT1pKWY9ci8oaC5nZXRMYXlvdXQoKS54K3ArZCksZz1vLyhjLmRlcHRoLTF8fDEpLGxEKGwsKGZ1bmN0aW9uKHQpe3k9KHQuZ2V0TGF5b3V0KCkueCtkKSpmLHY9KHQuZGVwdGgtMSkqZzt2YXIgZT1MQyh5LHYpO3Quc2V0TGF5b3V0KHt4OmUueCx5OmUueSxyYXdYOnkscmF3WTp2fSwhMCl9KSk7ZWxzZXt2YXIgbT10LmdldE9yaWVudCgpOyJSTCI9PT1tfHwiTFIiPT09bT8oZz1vLyhoLmdldExheW91dCgpLngrcCtkKSxmPXIvKGMuZGVwdGgtMXx8MSksbEQobCwoZnVuY3Rpb24odCl7dj0odC5nZXRMYXlvdXQoKS54K2QpKmcseT0iTFIiPT09bT8odC5kZXB0aC0xKSpmOnItKHQuZGVwdGgtMSkqZix0LnNldExheW91dCh7eDp5LHk6dn0sITApfSkpKToiVEIiIT09bSYmIkJUIiE9PW18fChmPXIvKGguZ2V0TGF5b3V0KCkueCtwK2QpLGc9by8oYy5kZXB0aC0xfHwxKSxsRChsLChmdW5jdGlvbih0KXt5PSh0LmdldExheW91dCgpLngrZCkqZix2PSJUQiI9PT1tPyh0LmRlcHRoLTEpKmc6by0odC5kZXB0aC0xKSpnLHQuc2V0TGF5b3V0KHt4OnkseTp2fSwhMCl9KSkpfX19KHQsZSl9KSl9ZnVuY3Rpb24gaEQodCl7dC5lYWNoU2VyaWVzQnlUeXBlKCJ0cmVlIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCk7ZS50cmVlLmVhY2hOb2RlKChmdW5jdGlvbih0KXt2YXIgbj10LmdldE1vZGVsKCkuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpO0EoZS5lbnN1cmVVbmlxdWVJdGVtVmlzdWFsKHQuZGF0YUluZGV4LCJzdHlsZSIpLG4pfSkpfSkpfXZhciBjRD1bInRyZWVtYXBab29tVG9Ob2RlIiwidHJlZW1hcFJlbmRlciIsInRyZWVtYXBNb3ZlIl07ZnVuY3Rpb24gcEQodCl7dmFyIGU9dC5nZXREYXRhKCkudHJlZSxuPXt9O2UuZWFjaE5vZGUoKGZ1bmN0aW9uKGUpe2Zvcih2YXIgaT1lO2kmJmkuZGVwdGg+MTspaT1pLnBhcmVudE5vZGU7dmFyIHI9cGQodC5lY01vZGVsLGkubmFtZXx8aS5kYXRhSW5kZXgrIiIsbik7ZS5zZXRWaXN1YWwoImRlY2FsIixyKX0pKX12YXIgZEQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLnByZXZlbnRVc2luZ0hvdmVyTGF5ZXI9ITAsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKHQsZSl7dmFyIG49e25hbWU6dC5uYW1lLGNoaWxkcmVuOnQuZGF0YX07ZkQobik7dmFyIGk9dC5sZXZlbHN8fFtdLHI9dGhpcy5kZXNpZ25hdGVkVmlzdWFsSXRlbVN0eWxlPXt9LG89bmV3IENjKHtpdGVtU3R5bGU6cn0sdGhpcyxlKTtpPXQubGV2ZWxzPWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyPVRvKGUuZ2V0KCJjb2xvciIpKSxvPVRvKGUuZ2V0KFsiYXJpYSIsImRlY2FsIiwiZGVjYWxzIl0pKTtpZighcilyZXR1cm47dD10fHxbXSxFKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBDYyh0KSxyPWUuZ2V0KCJjb2xvciIpLG89ZS5nZXQoImRlY2FsIik7KGUuZ2V0KFsiaXRlbVN0eWxlIiwiY29sb3IiXSl8fHImJiJub25lIiE9PXIpJiYobj0hMCksKGUuZ2V0KFsiaXRlbVN0eWxlIiwiZGVjYWwiXSl8fG8mJiJub25lIiE9PW8pJiYoaT0hMCl9KSk7dmFyIGE9dFswXXx8KHRbMF09e30pO258fChhLmNvbG9yPXIuc2xpY2UoKSk7IWkmJm8mJihhLmRlY2FsPW8uc2xpY2UoKSk7cmV0dXJuIHR9KGksZSk7dmFyIGE9eihpfHxbXSwoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBDYyh0LG8sZSl9KSx0aGlzKSxzPW5ELmNyZWF0ZVRyZWUobix0aGlzLChmdW5jdGlvbih0KXt0LndyYXBNZXRob2QoImdldEl0ZW1Nb2RlbCIsKGZ1bmN0aW9uKHQsZSl7dmFyIG49cy5nZXROb2RlQnlEYXRhSW5kZXgoZSksaT1uP2Fbbi5kZXB0aF06bnVsbDtyZXR1cm4gdC5wYXJlbnRNb2RlbD1pfHxvLHR9KSl9KSk7cmV0dXJuIHMuZGF0YX0sZS5wcm90b3R5cGUub3B0aW9uVXBkYXRlZD1mdW5jdGlvbigpe3RoaXMucmVzZXRWaWV3Um9vdCgpfSxlLnByb3RvdHlwZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmdldERhdGEoKSxyPXRoaXMuZ2V0UmF3VmFsdWUodCk7cmV0dXJuIG9nKCJuYW1lVmFsdWUiLHtuYW1lOmkuZ2V0TmFtZSh0KSx2YWx1ZTpyfSl9LGUucHJvdG90eXBlLmdldERhdGFQYXJhbXM9ZnVuY3Rpb24oZSl7dmFyIG49dC5wcm90b3R5cGUuZ2V0RGF0YVBhcmFtcy5hcHBseSh0aGlzLGFyZ3VtZW50cyksaT10aGlzLmdldERhdGEoKS50cmVlLmdldE5vZGVCeURhdGFJbmRleChlKTtyZXR1cm4gbi50cmVlQW5jZXN0b3JzPWFEKGksdGhpcyksbi50cmVlUGF0aEluZm89bi50cmVlQW5jZXN0b3JzLG59LGUucHJvdG90eXBlLnNldExheW91dEluZm89ZnVuY3Rpb24odCl7dGhpcy5sYXlvdXRJbmZvPXRoaXMubGF5b3V0SW5mb3x8e30sQSh0aGlzLmxheW91dEluZm8sdCl9LGUucHJvdG90eXBlLm1hcElkVG9JbmRleD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pZEluZGV4TWFwO2V8fChlPXRoaXMuX2lkSW5kZXhNYXA9eXQoKSx0aGlzLl9pZEluZGV4TWFwQ291bnQ9MCk7dmFyIG49ZS5nZXQodCk7cmV0dXJuIG51bGw9PW4mJmUuc2V0KHQsbj10aGlzLl9pZEluZGV4TWFwQ291bnQrKyksbn0sZS5wcm90b3R5cGUuZ2V0Vmlld1Jvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmlld1Jvb3R9LGUucHJvdG90eXBlLnJlc2V0Vmlld1Jvb3Q9ZnVuY3Rpb24odCl7dD90aGlzLl92aWV3Um9vdD10OnQ9dGhpcy5fdmlld1Jvb3Q7dmFyIGU9dGhpcy5nZXRSYXdEYXRhKCkudHJlZS5yb290O3QmJih0PT09ZXx8ZS5jb250YWlucyh0KSl8fCh0aGlzLl92aWV3Um9vdD1lKX0sZS5wcm90b3R5cGUuZW5hYmxlQXJpYURlY2FsPWZ1bmN0aW9uKCl7cEQodGhpcyl9LGUudHlwZT0ic2VyaWVzLnRyZWVtYXAiLGUubGF5b3V0TW9kZT0iYm94IixlLmRlZmF1bHRPcHRpb249e3Byb2dyZXNzaXZlOjAsbGVmdDoiY2VudGVyIix0b3A6Im1pZGRsZSIsd2lkdGg6IjgwJSIsaGVpZ2h0OiI4MCUiLHNvcnQ6ITAsY2xpcFdpbmRvdzoib3JpZ2luIixzcXVhcmVSYXRpbzouNSooMStNYXRoLnNxcnQoNSkpLGxlYWZEZXB0aDpudWxsLGRyaWxsRG93bkljb246IuKWtiIsem9vbVRvTm9kZVJhdGlvOi4xMDI0LHNjYWxlTGltaXQ6bnVsbCxyb2FtOiEwLG5vZGVDbGljazoiem9vbVRvTm9kZSIsYW5pbWF0aW9uOiEwLGFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlOjkwMCxhbmltYXRpb25FYXNpbmc6InF1aW50aWNJbk91dCIsYnJlYWRjcnVtYjp7c2hvdzohMCxoZWlnaHQ6MjIsbGVmdDoiY2VudGVyIix0b3A6ImJvdHRvbSIsZW1wdHlJdGVtV2lkdGg6MjUsaXRlbVN0eWxlOntjb2xvcjoicmdiYSgwLDAsMCwwLjcpIix0ZXh0U3R5bGU6e2NvbG9yOiIjZmZmIn19LGVtcGhhc2lzOntpdGVtU3R5bGU6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuOSkifX19LGxhYmVsOntzaG93OiEwLGRpc3RhbmNlOjAscGFkZGluZzo1LHBvc2l0aW9uOiJpbnNpZGUiLGNvbG9yOiIjZmZmIixvdmVyZmxvdzoidHJ1bmNhdGUifSx1cHBlckxhYmVsOntzaG93OiExLHBvc2l0aW9uOlswLCI1MCUiXSxoZWlnaHQ6MjAsb3ZlcmZsb3c6InRydW5jYXRlIix2ZXJ0aWNhbEFsaWduOiJtaWRkbGUifSxpdGVtU3R5bGU6e2NvbG9yOm51bGwsY29sb3JBbHBoYTpudWxsLGNvbG9yU2F0dXJhdGlvbjpudWxsLGJvcmRlcldpZHRoOjAsZ2FwV2lkdGg6MCxib3JkZXJDb2xvcjoiI2ZmZiIsYm9yZGVyQ29sb3JTYXR1cmF0aW9uOm51bGx9LGVtcGhhc2lzOnt1cHBlckxhYmVsOntzaG93OiEwLHBvc2l0aW9uOlswLCI1MCUiXSxvdmVyZmxvdzoidHJ1bmNhdGUiLHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9fSx2aXN1YWxEaW1lbnNpb246MCx2aXN1YWxNaW46bnVsbCx2aXN1YWxNYXg6bnVsbCxjb2xvcjpbXSxjb2xvckFscGhhOm51bGwsY29sb3JTYXR1cmF0aW9uOm51bGwsY29sb3JNYXBwaW5nQnk6ImluZGV4Iix2aXNpYmxlTWluOjEwLGNoaWxkcmVuVmlzaWJsZU1pbjpudWxsLGxldmVsczpbXX0sZX0oYmcpO2Z1bmN0aW9uIGZEKHQpe3ZhciBlPTA7RSh0LmNoaWxkcmVuLChmdW5jdGlvbih0KXtmRCh0KTt2YXIgbj10LnZhbHVlO1kobikmJihuPW5bMF0pLGUrPW59KSk7dmFyIG49dC52YWx1ZTtZKG4pJiYobj1uWzBdKSwobnVsbD09bnx8aXNOYU4obikpJiYobj1lKSxuPDAmJihuPTApLFkodC52YWx1ZSk/dC52YWx1ZVswXT1uOnQudmFsdWU9bn12YXIgZ0Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZ3JvdXA9bmV3IEJyLHQuYWRkKHRoaXMuZ3JvdXApfXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC5nZXRNb2RlbCgiYnJlYWRjcnVtYiIpLG89dGhpcy5ncm91cDtpZihvLnJlbW92ZUFsbCgpLHIuZ2V0KCJzaG93IikmJm4pe3ZhciBhPXIuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLHM9ci5nZXRNb2RlbCgiZW1waGFzaXMiKSxsPWEuZ2V0TW9kZWwoInRleHRTdHlsZSIpLHU9cy5nZXRNb2RlbChbIml0ZW1TdHlsZSIsInRleHRTdHlsZSJdKSxoPXtwb3M6e2xlZnQ6ci5nZXQoImxlZnQiKSxyaWdodDpyLmdldCgicmlnaHQiKSx0b3A6ci5nZXQoInRvcCIpLGJvdHRvbTpyLmdldCgiYm90dG9tIil9LGJveDp7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSxlbXB0eUl0ZW1XaWR0aDpyLmdldCgiZW1wdHlJdGVtV2lkdGgiKSx0b3RhbFdpZHRoOjAscmVuZGVyTGlzdDpbXX07dGhpcy5fcHJlcGFyZShuLGgsbCksdGhpcy5fcmVuZGVyQ29udGVudCh0LGgsYSxzLGwsdSxpKSxMcChvLGgucG9zLGguYm94KX19LHQucHJvdG90eXBlLl9wcmVwYXJlPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dDtpO2k9aS5wYXJlbnROb2RlKXt2YXIgcj1SbyhpLmdldE1vZGVsKCkuZ2V0KCJuYW1lIiksIiIpLG89bi5nZXRUZXh0UmVjdChyKSxhPU1hdGgubWF4KG8ud2lkdGgrMTYsZS5lbXB0eUl0ZW1XaWR0aCk7ZS50b3RhbFdpZHRoKz1hKzgsZS5yZW5kZXJMaXN0LnB1c2goe25vZGU6aSx0ZXh0OnIsd2lkdGg6YX0pfX0sdC5wcm90b3R5cGUuX3JlbmRlckNvbnRlbnQ9ZnVuY3Rpb24odCxlLG4saSxyLG8sYSl7Zm9yKHZhciBzLGwsdSxoLGMscCxkLGYsZyx5PTAsdj1lLmVtcHR5SXRlbVdpZHRoLG09dC5nZXQoWyJicmVhZGNydW1iIiwiaGVpZ2h0Il0pLHg9KHM9ZS5wb3MsbD1lLmJveCxoPWwud2lkdGgsYz1sLmhlaWdodCxwPSRyKHMubGVmdCxoKSxkPSRyKHMudG9wLGMpLGY9JHIocy5yaWdodCxoKSxnPSRyKHMuYm90dG9tLGMpLChpc05hTihwKXx8aXNOYU4ocGFyc2VGbG9hdChzLmxlZnQpKSkmJihwPTApLChpc05hTihmKXx8aXNOYU4ocGFyc2VGbG9hdChzLnJpZ2h0KSkpJiYoZj1oKSwoaXNOYU4oZCl8fGlzTmFOKHBhcnNlRmxvYXQocy50b3ApKSkmJihkPTApLChpc05hTihnKXx8aXNOYU4ocGFyc2VGbG9hdChzLmJvdHRvbSkpKSYmKGc9YyksdT12cCh1fHwwKSx7d2lkdGg6TWF0aC5tYXgoZi1wLXVbMV0tdVszXSwwKSxoZWlnaHQ6TWF0aC5tYXgoZy1kLXVbMF0tdVsyXSwwKX0pLF89ZS50b3RhbFdpZHRoLGI9ZS5yZW5kZXJMaXN0LHc9aS5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksUz1iLmxlbmd0aC0xO1M+PTA7Uy0tKXt2YXIgTT1iW1NdLEk9TS5ub2RlLFQ9TS53aWR0aCxDPU0udGV4dDtfPngud2lkdGgmJihfLT1ULXYsVD12LEM9bnVsbCk7dmFyIEQ9bmV3IFh1KHtzaGFwZTp7cG9pbnRzOnlEKHksMCxULG0sUz09PWIubGVuZ3RoLTEsMD09PVMpfSxzdHlsZTprKG4uZ2V0SXRlbVN0eWxlKCkse2xpbmVKb2luOiJiZXZlbCJ9KSx0ZXh0Q29udGVudDpuZXcgWHMoe3N0eWxlOm9jKHIse3RleHQ6Q30pfSksdGV4dENvbmZpZzp7cG9zaXRpb246Imluc2lkZSJ9LHoyOjFlNSxvbmNsaWNrOkgoYSxJKX0pO0QuZGlzYWJsZUxhYmVsQW5pbWF0aW9uPSEwLEQuZ2V0VGV4dENvbnRlbnQoKS5lbnN1cmVTdGF0ZSgiZW1waGFzaXMiKS5zdHlsZT1vYyhvLHt0ZXh0OkN9KSxELmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPXcsWmwoRCxpLmdldCgiZm9jdXMiKSxpLmdldCgiYmx1clNjb3BlIiksaS5nZXQoImRpc2FibGVkIikpLHRoaXMuZ3JvdXAuYWRkKEQpLHZEKEQsdCxJKSx5Kz1UKzh9fSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSx0fSgpO2Z1bmN0aW9uIHlEKHQsZSxuLGkscixvKXt2YXIgYT1bW3I/dDp0LTUsZV0sW3QrbixlXSxbdCtuLGUraV0sW3I/dDp0LTUsZStpXV07cmV0dXJuIW8mJmEuc3BsaWNlKDIsMCxbdCtuKzUsZStpLzJdKSwhciYmYS5wdXNoKFt0LGUraS8yXSksYX1mdW5jdGlvbiB2RCh0LGUsbil7cmwodCkuZXZlbnREYXRhPXtjb21wb25lbnRUeXBlOiJzZXJpZXMiLGNvbXBvbmVudFN1YlR5cGU6InRyZWVtYXAiLGNvbXBvbmVudEluZGV4OmUuY29tcG9uZW50SW5kZXgsc2VyaWVzSW5kZXg6ZS5zZXJpZXNJbmRleCxzZXJpZXNOYW1lOmUubmFtZSxzZXJpZXNUeXBlOiJ0cmVlbWFwIixzZWxmVHlwZToiYnJlYWRjcnVtYiIsbm9kZURhdGE6e2RhdGFJbmRleDpuJiZuLmRhdGFJbmRleCxuYW1lOm4mJm4ubmFtZX0sdHJlZVBhdGhJbmZvOm4mJmFEKG4sZSl9fXZhciBtRD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9zdG9yYWdlPVtdLHRoaXMuX2VsRXhpc3RzTWFwPXt9fXJldHVybiB0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlLG4saSxyKXtyZXR1cm4hdGhpcy5fZWxFeGlzdHNNYXBbdC5pZF0mJih0aGlzLl9lbEV4aXN0c01hcFt0LmlkXT0hMCx0aGlzLl9zdG9yYWdlLnB1c2goe2VsOnQsdGFyZ2V0OmUsZHVyYXRpb246bixkZWxheTppLGVhc2luZzpyfSksITApfSx0LnByb3RvdHlwZS5maW5pc2hlZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmluaXNoZWRDYWxsYmFjaz10LHRoaXN9LHQucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT10aGlzLl9zdG9yYWdlLmxlbmd0aCxuPWZ1bmN0aW9uKCl7LS1lPD0wJiYodC5fc3RvcmFnZS5sZW5ndGg9MCx0Ll9lbEV4aXN0c01hcD17fSx0Ll9maW5pc2hlZENhbGxiYWNrJiZ0Ll9maW5pc2hlZENhbGxiYWNrKCkpfSxpPTAscj10aGlzLl9zdG9yYWdlLmxlbmd0aDtpPHI7aSsrKXt2YXIgbz10aGlzLl9zdG9yYWdlW2ldO28uZWwuYW5pbWF0ZVRvKG8udGFyZ2V0LHtkdXJhdGlvbjpvLmR1cmF0aW9uLGRlbGF5Om8uZGVsYXksZWFzaW5nOm8uZWFzaW5nLHNldFRvRmluYWw6ITAsZG9uZTpuLGFib3J0ZWQ6bn0pfXJldHVybiB0aGlzfSx0fSgpO3ZhciB4RD1CcixfRD1XcyxiRD0ibGFiZWwiLHdEPSJ1cHBlckxhYmVsIixTRD1pYShbWyJmaWxsIiwiY29sb3IiXSxbInN0cm9rZSIsInN0cm9rZUNvbG9yIl0sWyJsaW5lV2lkdGgiLCJzdHJva2VXaWR0aCJdLFsic2hhZG93Qmx1ciJdLFsic2hhZG93T2Zmc2V0WCJdLFsic2hhZG93T2Zmc2V0WSJdLFsic2hhZG93Q29sb3IiXV0pLE1EPWZ1bmN0aW9uKHQpe3ZhciBlPVNEKHQpO3JldHVybiBlLnN0cm9rZT1lLmZpbGw9ZS5saW5lV2lkdGg9bnVsbCxlfSxJRD1WbygpLFREPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5fc3RhdGU9InJlYWR5IixuLl9zdG9yYWdlPXtub2RlR3JvdXA6W10sYmFja2dyb3VuZDpbXSxjb250ZW50OltdfSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKCEoUChlLmZpbmRDb21wb25lbnRzKHttYWluVHlwZToic2VyaWVzIixzdWJUeXBlOiJ0cmVlbWFwIixxdWVyeTppfSksdCk8MCkpe3RoaXMuc2VyaWVzTW9kZWw9dCx0aGlzLmFwaT1uLHRoaXMuZWNNb2RlbD1lO3ZhciByPWlEKGksWyJ0cmVlbWFwWm9vbVRvTm9kZSIsInRyZWVtYXBSb290VG9Ob2RlIl0sdCksbz1pJiZpLnR5cGUsYT10LmxheW91dEluZm8scz0hdGhpcy5fb2xkVHJlZSxsPXRoaXMuX3N0b3JhZ2UsdT0idHJlZW1hcFJvb3RUb05vZGUiPT09byYmciYmbD97cm9vdE5vZGVHcm91cDpsLm5vZGVHcm91cFtyLm5vZGUuZ2V0UmF3SW5kZXgoKV0sZGlyZWN0aW9uOmkuZGlyZWN0aW9ufTpudWxsLGg9dGhpcy5fZ2l2ZUNvbnRhaW5lckdyb3VwKGEpLGM9dC5nZXQoImFuaW1hdGlvbiIpLHA9dGhpcy5fZG9SZW5kZXIoaCx0LHUpOyFjfHxzfHxvJiYidHJlZW1hcFpvb21Ub05vZGUiIT09byYmInRyZWVtYXBSb290VG9Ob2RlIiE9PW8/cC5yZW5kZXJGaW5hbGx5KCk6dGhpcy5fZG9BbmltYXRpb24oaCxwLHQsdSksdGhpcy5fcmVzZXRDb250cm9sbGVyKG4pLHRoaXMuX3JlbmRlckJyZWFkY3J1bWIodCxuLHIpfX0sZS5wcm90b3R5cGUuX2dpdmVDb250YWluZXJHcm91cD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb250YWluZXJHcm91cDtyZXR1cm4gZXx8KGU9dGhpcy5fY29udGFpbmVyR3JvdXA9bmV3IHhELHRoaXMuX2luaXRFdmVudHMoZSksdGhpcy5ncm91cC5hZGQoZSkpLGUueD10LngsZS55PXQueSxlfSxlLnByb3RvdHlwZS5fZG9SZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUuZ2V0RGF0YSgpLnRyZWUscj10aGlzLl9vbGRUcmVlLG89e25vZGVHcm91cDpbXSxiYWNrZ3JvdW5kOltdLGNvbnRlbnQ6W119LGE9e25vZGVHcm91cDpbXSxiYWNrZ3JvdW5kOltdLGNvbnRlbnQ6W119LHM9dGhpcy5fc3RvcmFnZSxsPVtdO2Z1bmN0aW9uIHUodCxpLHIsdSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyxsLHUpe2lmKCFhKXJldHVybjt2YXIgaD1hLmdldExheW91dCgpLGM9dC5nZXREYXRhKCkscD1hLmdldE1vZGVsKCk7aWYoYy5zZXRJdGVtR3JhcGhpY0VsKGEuZGF0YUluZGV4LG51bGwpLCFofHwhaC5pc0luVmlldylyZXR1cm47dmFyIGQ9aC53aWR0aCxmPWguaGVpZ2h0LGc9aC5ib3JkZXJXaWR0aCx5PWguaW52aXNpYmxlLHY9YS5nZXRSYXdJbmRleCgpLG09cyYmcy5nZXRSYXdJbmRleCgpLHg9YS52aWV3Q2hpbGRyZW4sXz1oLnVwcGVySGVpZ2h0LGI9eCYmeC5sZW5ndGgsdz1wLmdldE1vZGVsKCJpdGVtU3R5bGUiKSxTPXAuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsIml0ZW1TdHlsZSJdKSxNPXAuZ2V0TW9kZWwoWyJibHVyIiwiaXRlbVN0eWxlIl0pLEk9cC5nZXRNb2RlbChbInNlbGVjdCIsIml0ZW1TdHlsZSJdKSxUPXcuZ2V0KCJib3JkZXJSYWRpdXMiKXx8MCxDPUcoIm5vZGVHcm91cCIseEQpO2lmKCFDKXJldHVybjtpZihsLmFkZChDKSxDLng9aC54fHwwLEMueT1oLnl8fDAsQy5tYXJrUmVkcmF3KCksSUQoQykubm9kZVdpZHRoPWQsSUQoQykubm9kZUhlaWdodD1mLGguaXNBYm92ZVZpZXdSb290KXJldHVybiBDO3ZhciBEPUcoImJhY2tncm91bmQiLF9ELHUsMjApO0QmJkUoQyxELGImJmgudXBwZXJMYWJlbEhlaWdodCk7dmFyIGs9cC5nZXRNb2RlbCgiZW1waGFzaXMiKSxMPWsuZ2V0KCJmb2N1cyIpLFA9ay5nZXQoImJsdXJTY29wZSIpLE89ay5nZXQoImRpc2FibGVkIiksUj0iYW5jZXN0b3IiPT09TD9hLmdldEFuY2VzdG9yc0luZGljZXMoKToiZGVzY2VuZGFudCI9PT1MP2EuZ2V0RGVzY2VuZGFudEluZGljZXMoKTpMO2lmKGIpUWwoQykmJkpsKEMsITEpLEQmJihKbChELCFPKSxjLnNldEl0ZW1HcmFwaGljRWwoYS5kYXRhSW5kZXgsRCksamwoRCxSLFApKTtlbHNle3ZhciBOPUcoImNvbnRlbnQiLF9ELHUsMzApO04mJnooQyxOKSxELmRpc2FibGVNb3JwaGluZz0hMCxEJiZRbChEKSYmSmwoRCwhMSksSmwoQywhTyksYy5zZXRJdGVtR3JhcGhpY0VsKGEuZGF0YUluZGV4LEMpLGpsKEMsUixQKX1yZXR1cm4gQztmdW5jdGlvbiBFKGUsbixpKXt2YXIgcj1ybChuKTtpZihyLmRhdGFJbmRleD1hLmRhdGFJbmRleCxyLnNlcmllc0luZGV4PXQuc2VyaWVzSW5kZXgsbi5zZXRTaGFwZSh7eDowLHk6MCx3aWR0aDpkLGhlaWdodDpmLHI6VH0pLHkpVihuKTtlbHNle24uaW52aXNpYmxlPSExO3ZhciBvPWEuZ2V0VmlzdWFsKCJzdHlsZSIpLHM9by5zdHJva2UsbD1NRCh3KTtsLmZpbGw9czt2YXIgdT1TRChTKTt1LmZpbGw9Uy5nZXQoImJvcmRlckNvbG9yIik7dmFyIGg9U0QoTSk7aC5maWxsPU0uZ2V0KCJib3JkZXJDb2xvciIpO3ZhciBjPVNEKEkpO2lmKGMuZmlsbD1JLmdldCgiYm9yZGVyQ29sb3IiKSxpKXt2YXIgcD1kLTIqZztCKG4scyxvLm9wYWNpdHkse3g6Zyx5OjAsd2lkdGg6cCxoZWlnaHQ6X30pfWVsc2Ugbi5yZW1vdmVUZXh0Q29udGVudCgpO24uc2V0U3R5bGUobCksbi5lbnN1cmVTdGF0ZSgiZW1waGFzaXMiKS5zdHlsZT11LG4uZW5zdXJlU3RhdGUoImJsdXIiKS5zdHlsZT1oLG4uZW5zdXJlU3RhdGUoInNlbGVjdCIpLnN0eWxlPWMsa2wobil9ZS5hZGQobil9ZnVuY3Rpb24geihlLG4pe3ZhciBpPXJsKG4pO2kuZGF0YUluZGV4PWEuZGF0YUluZGV4LGkuc2VyaWVzSW5kZXg9dC5zZXJpZXNJbmRleDt2YXIgcj1NYXRoLm1heChkLTIqZywwKSxvPU1hdGgubWF4KGYtMipnLDApO2lmKG4uY3VsbGluZz0hMCxuLnNldFNoYXBlKHt4OmcseTpnLHdpZHRoOnIsaGVpZ2h0Om8scjpUfSkseSlWKG4pO2Vsc2V7bi5pbnZpc2libGU9ITE7dmFyIHM9YS5nZXRWaXN1YWwoInN0eWxlIiksbD1zLmZpbGwsdT1NRCh3KTt1LmZpbGw9bCx1LmRlY2FsPXMuZGVjYWw7dmFyIGg9U0QoUyksYz1TRChNKSxwPVNEKEkpO0IobixsLHMub3BhY2l0eSxudWxsKSxuLnNldFN0eWxlKHUpLG4uZW5zdXJlU3RhdGUoImVtcGhhc2lzIikuc3R5bGU9aCxuLmVuc3VyZVN0YXRlKCJibHVyIikuc3R5bGU9YyxuLmVuc3VyZVN0YXRlKCJzZWxlY3QiKS5zdHlsZT1wLGtsKG4pfWUuYWRkKG4pfWZ1bmN0aW9uIFYodCl7IXQuaW52aXNpYmxlJiZvLnB1c2godCl9ZnVuY3Rpb24gQihlLG4saSxyKXt2YXIgbz1wLmdldE1vZGVsKHI/d0Q6YkQpLHM9Um8ocC5nZXQoIm5hbWUiKSxudWxsKSxsPW8uZ2V0U2hhbGxvdygic2hvdyIpO2ljKGUscmMocCxyP3dEOmJEKSx7ZGVmYXVsdFRleHQ6bD9zOm51bGwsaW5oZXJpdENvbG9yOm4sZGVmYXVsdE9wYWNpdHk6aSxsYWJlbEZldGNoZXI6dCxsYWJlbERhdGFJbmRleDphLmRhdGFJbmRleH0pO3ZhciB1PWUuZ2V0VGV4dENvbnRlbnQoKTtpZih1KXt2YXIgYz11LnN0eWxlLGQ9c3QoYy5wYWRkaW5nfHwwKTtyJiYoZS5zZXRUZXh0Q29uZmlnKHtsYXlvdXRSZWN0OnJ9KSx1LmRpc2FibGVMYWJlbExheW91dD0hMCksdS5iZWZvcmVVcGRhdGU9ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLm1heCgocj9yLndpZHRoOmUuc2hhcGUud2lkdGgpLWRbMV0tZFszXSwwKSxuPU1hdGgubWF4KChyP3IuaGVpZ2h0OmUuc2hhcGUuaGVpZ2h0KS1kWzBdLWRbMl0sMCk7Yy53aWR0aD09PXQmJmMuaGVpZ2h0PT09bnx8dS5zZXRTdHlsZSh7d2lkdGg6dCxoZWlnaHQ6bn0pfSxjLnRydW5jYXRlTWluQ2hhcj0yLGMubGluZU92ZXJmbG93PSJ0cnVuY2F0ZSIsRihjLHIsaCk7dmFyIGY9dS5nZXRTdGF0ZSgiZW1waGFzaXMiKTtGKGY/Zi5zdHlsZTpudWxsLHIsaCl9fWZ1bmN0aW9uIEYoZSxuLGkpe3ZhciByPWU/ZS50ZXh0Om51bGw7aWYoIW4mJmkuaXNMZWFmUm9vdCYmbnVsbCE9cil7dmFyIG89dC5nZXQoImRyaWxsRG93bkljb24iLCEwKTtlLnRleHQ9bz9vKyIgIityOnJ9fWZ1bmN0aW9uIEcodCxpLG8sYSl7dmFyIHM9bnVsbCE9bSYmblt0XVttXSxsPXJbdF07cmV0dXJuIHM/KG5bdF1bbV09bnVsbCxXKGwscykpOnl8fCgocz1uZXcgaSlpbnN0YW5jZW9mIERhJiYocy56Mj1mdW5jdGlvbih0LGUpe3JldHVybiAxMDAqdCtlfShvLGEpKSxIKGwscykpLGVbdF1bdl09c31mdW5jdGlvbiBXKHQsZSl7dmFyIG49dFt2XT17fTtlIGluc3RhbmNlb2YgeEQ/KG4ub2xkWD1lLngsbi5vbGRZPWUueSk6bi5vbGRTaGFwZT1BKHt9LGUuc2hhcGUpfWZ1bmN0aW9uIEgodCxlKXt2YXIgbj10W3ZdPXt9LG89YS5wYXJlbnROb2RlLHM9ZSBpbnN0YW5jZW9mIEJyO2lmKG8mJighaXx8ImRyaWxsRG93biI9PT1pLmRpcmVjdGlvbikpe3ZhciBsPTAsdT0wLGg9ci5iYWNrZ3JvdW5kW28uZ2V0UmF3SW5kZXgoKV07IWkmJmgmJmgub2xkU2hhcGUmJihsPWgub2xkU2hhcGUud2lkdGgsdT1oLm9sZFNoYXBlLmhlaWdodCkscz8obi5vbGRYPTAsbi5vbGRZPXUpOm4ub2xkU2hhcGU9e3g6bCx5OnUsd2lkdGg6MCxoZWlnaHQ6MH19bi5mYWRlaW49IXN9fShlLGEscyxuLG8sbCx0LGkscix1KX0hZnVuY3Rpb24gdChlLG4saSxyLG8pe3I/KG49ZSxFKGUsKGZ1bmN0aW9uKHQsZSl7IXQuaXNSZW1vdmVkKCkmJnMoZSxlKX0pKSk6bmV3IEdtKG4sZSxhLGEpLmFkZChzKS51cGRhdGUocykucmVtb3ZlKEgocyxudWxsKSkuZXhlY3V0ZSgpO2Z1bmN0aW9uIGEodCl7cmV0dXJuIHQuZ2V0SWQoKX1mdW5jdGlvbiBzKGEscyl7dmFyIGw9bnVsbCE9YT9lW2FdOm51bGwsaD1udWxsIT1zP25bc106bnVsbCxjPXUobCxoLGksbyk7YyYmdChsJiZsLnZpZXdDaGlsZHJlbnx8W10saCYmaC52aWV3Q2hpbGRyZW58fFtdLGMscixvKzEpfX0oaS5yb290P1tpLnJvb3RdOltdLHImJnIucm9vdD9bci5yb290XTpbXSx0LGk9PT1yfHwhciwwKTt2YXIgaD1mdW5jdGlvbih0KXt2YXIgZT17bm9kZUdyb3VwOltdLGJhY2tncm91bmQ6W10sY29udGVudDpbXX07cmV0dXJuIHQmJkUodCwoZnVuY3Rpb24odCxuKXt2YXIgaT1lW25dO0UodCwoZnVuY3Rpb24odCl7dCYmKGkucHVzaCh0KSxJRCh0KS53aWxsRGVsZXRlPSEwKX0pKX0pKSxlfShzKTtpZih0aGlzLl9vbGRUcmVlPWksdGhpcy5fc3RvcmFnZT1hLHRoaXMuX2NvbnRyb2xsZXJIb3N0KXt2YXIgYz10aGlzLnNlcmllc01vZGVsLmxheW91dEluZm8scD1pLnJvb3QuZ2V0TGF5b3V0KCk7cC53aWR0aD09PWMud2lkdGgmJnAuaGVpZ2h0PT09Yy5oZWlnaHQmJih0aGlzLl9jb250cm9sbGVySG9zdC56b29tPTEpfXJldHVybntsYXN0c0ZvckFuaW1hdGlvbjpvLHdpbGxEZWxldGVFbHM6aCxyZW5kZXJGaW5hbGx5OmZ1bmN0aW9uKCl7RShoLChmdW5jdGlvbih0KXtFKHQsKGZ1bmN0aW9uKHQpe3QucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCl9KSl9KSksRShsLChmdW5jdGlvbih0KXt0LmludmlzaWJsZT0hMCx0LmRpcnR5KCl9KSl9fX0sZS5wcm90b3R5cGUuX2RvQW5pbWF0aW9uPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uZ2V0KCJhbmltYXRpb25EdXJhdGlvblVwZGF0ZSIpLG89bi5nZXQoImFuaW1hdGlvbkVhc2luZyIpLGE9KFgocik/MDpyKXx8MCxzPShYKG8pP251bGw6byl8fCJjdWJpY091dCIsbD1uZXcgbUQ7RShlLndpbGxEZWxldGVFbHMsKGZ1bmN0aW9uKHQsZSl7RSh0LChmdW5jdGlvbih0LG4pe2lmKCF0LmludmlzaWJsZSl7dmFyIHIsbz10LnBhcmVudCx1PUlEKG8pO2lmKGkmJiJkcmlsbERvd24iPT09aS5kaXJlY3Rpb24pcj1vPT09aS5yb290Tm9kZUdyb3VwP3tzaGFwZTp7eDowLHk6MCx3aWR0aDp1Lm5vZGVXaWR0aCxoZWlnaHQ6dS5ub2RlSGVpZ2h0fSxzdHlsZTp7b3BhY2l0eTowfX06e3N0eWxlOntvcGFjaXR5OjB9fTtlbHNle3ZhciBoPTAsYz0wO3Uud2lsbERlbGV0ZXx8KGg9dS5ub2RlV2lkdGgvMixjPXUubm9kZUhlaWdodC8yKSxyPSJub2RlR3JvdXAiPT09ZT97eDpoLHk6YyxzdHlsZTp7b3BhY2l0eTowfX06e3NoYXBlOnt4OmgseTpjLHdpZHRoOjAsaGVpZ2h0OjB9LHN0eWxlOntvcGFjaXR5OjB9fX1yJiZsLmFkZCh0LHIsYSwwLHMpfX0pKX0pKSxFKHRoaXMuX3N0b3JhZ2UsKGZ1bmN0aW9uKHQsbil7RSh0LChmdW5jdGlvbih0LGkpe3ZhciByPWUubGFzdHNGb3JBbmltYXRpb25bbl1baV0sbz17fTtyJiYodCBpbnN0YW5jZW9mIEJyP251bGwhPXIub2xkWCYmKG8ueD10Lngsby55PXQueSx0Lng9ci5vbGRYLHQueT1yLm9sZFkpOihyLm9sZFNoYXBlJiYoby5zaGFwZT1BKHt9LHQuc2hhcGUpLHQuc2V0U2hhcGUoci5vbGRTaGFwZSkpLHIuZmFkZWluPyh0LnNldFN0eWxlKCJvcGFjaXR5IiwwKSxvLnN0eWxlPXtvcGFjaXR5OjF9KToxIT09dC5zdHlsZS5vcGFjaXR5JiYoby5zdHlsZT17b3BhY2l0eToxfSkpLGwuYWRkKHQsbyxhLDAscykpfSkpfSksdGhpcyksdGhpcy5fc3RhdGU9ImFuaW1hdGluZyIsbC5maW5pc2hlZChXKChmdW5jdGlvbigpe3RoaXMuX3N0YXRlPSJyZWFkeSIsZS5yZW5kZXJGaW5hbGx5KCl9KSx0aGlzKSkuc3RhcnQoKX0sZS5wcm90b3R5cGUuX3Jlc2V0Q29udHJvbGxlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb250cm9sbGVyLG49dGhpcy5fY29udHJvbGxlckhvc3Q7bnx8KHRoaXMuX2NvbnRyb2xsZXJIb3N0PXt0YXJnZXQ6dGhpcy5ncm91cH0sbj10aGlzLl9jb250cm9sbGVySG9zdCksZXx8KChlPXRoaXMuX2NvbnRyb2xsZXI9bmV3IG5UKHQuZ2V0WnIoKSkpLmVuYWJsZSh0aGlzLnNlcmllc01vZGVsLmdldCgicm9hbSIpKSxuLnpvb21MaW1pdD10aGlzLnNlcmllc01vZGVsLmdldCgic2NhbGVMaW1pdCIpLG4uem9vbT10aGlzLnNlcmllc01vZGVsLmdldCgiem9vbSIpLGUub24oInBhbiIsVyh0aGlzLl9vblBhbix0aGlzKSksZS5vbigiem9vbSIsVyh0aGlzLl9vblpvb20sdGhpcykpKTt2YXIgaT1uZXcgemUoMCwwLHQuZ2V0V2lkdGgoKSx0LmdldEhlaWdodCgpKTtlLnNldFBvaW50ZXJDaGVja2VyKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuY29udGFpbihlLG4pfSkpfSxlLnByb3RvdHlwZS5fY2xlYXJDb250cm9sbGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udHJvbGxlcjt0aGlzLl9jb250cm9sbGVySG9zdD1udWxsLHQmJih0LmRpc3Bvc2UoKSx0PW51bGwpfSxlLnByb3RvdHlwZS5fb25QYW49ZnVuY3Rpb24odCl7aWYoImFuaW1hdGluZyIhPT10aGlzLl9zdGF0ZSYmKE1hdGguYWJzKHQuZHgpPjN8fE1hdGguYWJzKHQuZHkpPjMpKXt2YXIgZT10aGlzLnNlcmllc01vZGVsLmdldERhdGEoKS50cmVlLnJvb3Q7aWYoIWUpcmV0dXJuO3ZhciBuPWUuZ2V0TGF5b3V0KCk7aWYoIW4pcmV0dXJuO3RoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0cmVlbWFwTW92ZSIsZnJvbTp0aGlzLnVpZCxzZXJpZXNJZDp0aGlzLnNlcmllc01vZGVsLmlkLHJvb3RSZWN0Ont4Om4ueCt0LmR4LHk6bi55K3QuZHksd2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHR9fSl9fSxlLnByb3RvdHlwZS5fb25ab29tPWZ1bmN0aW9uKHQpe3ZhciBlPXQub3JpZ2luWCxuPXQub3JpZ2luWSxpPXQuc2NhbGU7aWYoImFuaW1hdGluZyIhPT10aGlzLl9zdGF0ZSl7dmFyIHI9dGhpcy5zZXJpZXNNb2RlbC5nZXREYXRhKCkudHJlZS5yb290O2lmKCFyKXJldHVybjt2YXIgbz1yLmdldExheW91dCgpO2lmKCFvKXJldHVybjt2YXIgYSxzPW5ldyB6ZShvLngsby55LG8ud2lkdGgsby5oZWlnaHQpLGw9dGhpcy5fY29udHJvbGxlckhvc3Q7YT1sLnpvb21MaW1pdDt2YXIgdT1sLnpvb209bC56b29tfHwxO2lmKHUqPWksYSl7dmFyIGg9YS5taW58fDAsYz1hLm1heHx8MS8wO3U9TWF0aC5tYXgoTWF0aC5taW4oYyx1KSxoKX12YXIgcD11L2wuem9vbTtsLnpvb209dTt2YXIgZD10aGlzLnNlcmllc01vZGVsLmxheW91dEluZm8sZj1bMSwwLDAsMSwwLDBdO3dlKGYsZixbLShlLT1kLngpLC0obi09ZC55KV0pLE1lKGYsZixbcCxwXSksd2UoZixmLFtlLG5dKSxzLmFwcGx5VHJhbnNmb3JtKGYpLHRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0cmVlbWFwUmVuZGVyIixmcm9tOnRoaXMudWlkLHNlcmllc0lkOnRoaXMuc2VyaWVzTW9kZWwuaWQscm9vdFJlY3Q6e3g6cy54LHk6cy55LHdpZHRoOnMud2lkdGgsaGVpZ2h0OnMuaGVpZ2h0fX0pfX0sZS5wcm90b3R5cGUuX2luaXRFdmVudHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0Lm9uKCJjbGljayIsKGZ1bmN0aW9uKHQpe2lmKCJyZWFkeSI9PT1lLl9zdGF0ZSl7dmFyIG49ZS5zZXJpZXNNb2RlbC5nZXQoIm5vZGVDbGljayIsITApO2lmKG4pe3ZhciBpPWUuZmluZFRhcmdldCh0Lm9mZnNldFgsdC5vZmZzZXRZKTtpZihpKXt2YXIgcj1pLm5vZGU7aWYoci5nZXRMYXlvdXQoKS5pc0xlYWZSb290KWUuX3Jvb3RUb05vZGUoaSk7ZWxzZSBpZigiem9vbVRvTm9kZSI9PT1uKWUuX3pvb21Ub05vZGUoaSk7ZWxzZSBpZigibGluayI9PT1uKXt2YXIgbz1yLmhvc3RUcmVlLmRhdGEuZ2V0SXRlbU1vZGVsKHIuZGF0YUluZGV4KSxhPW8uZ2V0KCJsaW5rIiwhMCkscz1vLmdldCgidGFyZ2V0IiwhMCl8fCJibGFuayI7YSYmTXAoYSxzKX19fX19KSx0aGlzKX0sZS5wcm90b3R5cGUuX3JlbmRlckJyZWFkY3J1bWI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXM7bnx8KG49bnVsbCE9dC5nZXQoImxlYWZEZXB0aCIsITApP3tub2RlOnQuZ2V0Vmlld1Jvb3QoKX06dGhpcy5maW5kVGFyZ2V0KGUuZ2V0V2lkdGgoKS8yLGUuZ2V0SGVpZ2h0KCkvMikpfHwobj17bm9kZTp0LmdldERhdGEoKS50cmVlLnJvb3R9KSwodGhpcy5fYnJlYWRjcnVtYnx8KHRoaXMuX2JyZWFkY3J1bWI9bmV3IGdEKHRoaXMuZ3JvdXApKSkucmVuZGVyKHQsZSxuLm5vZGUsKGZ1bmN0aW9uKGUpeyJhbmltYXRpbmciIT09aS5fc3RhdGUmJihvRCh0LmdldFZpZXdSb290KCksZSk/aS5fcm9vdFRvTm9kZSh7bm9kZTplfSk6aS5fem9vbVRvTm9kZSh7bm9kZTplfSkpfSkpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckNvbnRyb2xsZXIoKSx0aGlzLl9jb250YWluZXJHcm91cCYmdGhpcy5fY29udGFpbmVyR3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fc3RvcmFnZT17bm9kZUdyb3VwOltdLGJhY2tncm91bmQ6W10sY29udGVudDpbXX0sdGhpcy5fc3RhdGU9InJlYWR5Iix0aGlzLl9icmVhZGNydW1iJiZ0aGlzLl9icmVhZGNydW1iLnJlbW92ZSgpfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJDb250cm9sbGVyKCl9LGUucHJvdG90eXBlLl96b29tVG9Ob2RlPWZ1bmN0aW9uKHQpe3RoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0cmVlbWFwWm9vbVRvTm9kZSIsZnJvbTp0aGlzLnVpZCxzZXJpZXNJZDp0aGlzLnNlcmllc01vZGVsLmlkLHRhcmdldE5vZGU6dC5ub2RlfSl9LGUucHJvdG90eXBlLl9yb290VG9Ob2RlPWZ1bmN0aW9uKHQpe3RoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0cmVlbWFwUm9vdFRvTm9kZSIsZnJvbTp0aGlzLnVpZCxzZXJpZXNJZDp0aGlzLnNlcmllc01vZGVsLmlkLHRhcmdldE5vZGU6dC5ub2RlfSl9LGUucHJvdG90eXBlLmZpbmRUYXJnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gdGhpcy5zZXJpZXNNb2RlbC5nZXRWaWV3Um9vdCgpLmVhY2hOb2RlKHthdHRyOiJ2aWV3Q2hpbGRyZW4iLG9yZGVyOiJwcmVvcmRlciJ9LChmdW5jdGlvbihpKXt2YXIgcj10aGlzLl9zdG9yYWdlLmJhY2tncm91bmRbaS5nZXRSYXdJbmRleCgpXTtpZihyKXt2YXIgbz1yLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0LGUpLGE9ci5zaGFwZTtpZighKGEueDw9b1swXSYmb1swXTw9YS54K2Eud2lkdGgmJmEueTw9b1sxXSYmb1sxXTw9YS55K2EuaGVpZ2h0KSlyZXR1cm4hMTtuPXtub2RlOmksb2Zmc2V0WDpvWzBdLG9mZnNldFk6b1sxXX19fSksdGhpcyksbn0sZS50eXBlPSJ0cmVlbWFwIixlfShPZyk7dmFyIENEPUUsREQ9cSxBRD0tMSxrRD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49ZS5tYXBwaW5nTWV0aG9kLGk9ZS50eXBlLHI9dGhpcy5vcHRpb249VChlKTt0aGlzLnR5cGU9aSx0aGlzLm1hcHBpbmdNZXRob2Q9bix0aGlzLl9ub3JtYWxpemVEYXRhPUZEW25dO3ZhciBvPXQudmlzdWFsSGFuZGxlcnNbaV07dGhpcy5hcHBseVZpc3VhbD1vLmFwcGx5VmlzdWFsLHRoaXMuZ2V0Q29sb3JNYXBwZXI9by5nZXRDb2xvck1hcHBlcix0aGlzLl9ub3JtYWxpemVkVG9WaXN1YWw9by5fbm9ybWFsaXplZFRvVmlzdWFsW25dLCJwaWVjZXdpc2UiPT09bj8oTEQociksZnVuY3Rpb24odCl7dmFyIGU9dC5waWVjZUxpc3Q7dC5oYXNTcGVjaWFsVmlzdWFsPSExLEUoZSwoZnVuY3Rpb24oZSxuKXtlLm9yaWdpbkluZGV4PW4sbnVsbCE9ZS52aXN1YWwmJih0Lmhhc1NwZWNpYWxWaXN1YWw9ITApfSkpfShyKSk6ImNhdGVnb3J5Ij09PW4/ci5jYXRlZ29yaWVzP2Z1bmN0aW9uKHQpe3ZhciBlPXQuY2F0ZWdvcmllcyxuPXQuY2F0ZWdvcnlNYXA9e30saT10LnZpc3VhbDtpZihDRChlLChmdW5jdGlvbih0LGUpe25bdF09ZX0pKSwhWShpKSl7dmFyIHI9W107cShpKT9DRChpLChmdW5jdGlvbih0LGUpe3ZhciBpPW5bZV07cltudWxsIT1pP2k6QURdPXR9KSk6clstMV09aSxpPUJEKHQscil9Zm9yKHZhciBvPWUubGVuZ3RoLTE7bz49MDtvLS0pbnVsbD09aVtvXSYmKGRlbGV0ZSBuW2Vbb11dLGUucG9wKCkpfShyKTpMRChyLCEwKToobHQoImxpbmVhciIhPT1ufHxyLmRhdGFFeHRlbnQpLExEKHIpKX1yZXR1cm4gdC5wcm90b3R5cGUubWFwVmFsdWVUb1Zpc3VhbD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub3JtYWxpemVEYXRhKHQpO3JldHVybiB0aGlzLl9ub3JtYWxpemVkVG9WaXN1YWwoZSx0KX0sdC5wcm90b3R5cGUuZ2V0Tm9ybWFsaXplcj1mdW5jdGlvbigpe3JldHVybiBXKHRoaXMuX25vcm1hbGl6ZURhdGEsdGhpcyl9LHQubGlzdFZpc3VhbFR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIEcodC52aXN1YWxIYW5kbGVycyl9LHQuaXNWYWxpZFR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQudmlzdWFsSGFuZGxlcnMuaGFzT3duUHJvcGVydHkoZSl9LHQuZWFjaFZpc3VhbD1mdW5jdGlvbih0LGUsbil7cSh0KT9FKHQsZSxuKTplLmNhbGwobix0KX0sdC5tYXBWaXN1YWw9ZnVuY3Rpb24oZSxuLGkpe3ZhciByLG89WShlKT9bXTpxKGUpP3t9OihyPSEwLG51bGwpO3JldHVybiB0LmVhY2hWaXN1YWwoZSwoZnVuY3Rpb24odCxlKXt2YXIgYT1uLmNhbGwoaSx0LGUpO3I/bz1hOm9bZV09YX0pKSxvfSx0LnJldHJpZXZlVmlzdWFscz1mdW5jdGlvbihlKXt2YXIgbixpPXt9O3JldHVybiBlJiZDRCh0LnZpc3VhbEhhbmRsZXJzLChmdW5jdGlvbih0LHIpe2UuaGFzT3duUHJvcGVydHkocikmJihpW3JdPWVbcl0sbj0hMCl9KSksbj9pOm51bGx9LHQucHJlcGFyZVZpc3VhbFR5cGVzPWZ1bmN0aW9uKHQpe2lmKFkodCkpdD10LnNsaWNlKCk7ZWxzZXtpZighREQodCkpcmV0dXJuW107dmFyIGU9W107Q0QodCwoZnVuY3Rpb24odCxuKXtlLnB1c2gobil9KSksdD1lfXJldHVybiB0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuImNvbG9yIj09PWUmJiJjb2xvciIhPT10JiYwPT09dC5pbmRleE9mKCJjb2xvciIpPzE6LTF9KSksdH0sdC5kZXBlbmRzT249ZnVuY3Rpb24odCxlKXtyZXR1cm4iY29sb3IiPT09ZT8hKCF0fHwwIT09dC5pbmRleE9mKGUpKTp0PT09ZX0sdC5maW5kUGllY2VJbmRleD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpLHI9MS8wLG89MCxhPWUubGVuZ3RoO288YTtvKyspe3ZhciBzPWVbb10udmFsdWU7aWYobnVsbCE9cyl7aWYocz09PXR8fFUocykmJnM9PT10KyIiKXJldHVybiBvO24mJmMocyxvKX19Zm9yKG89MCxhPWUubGVuZ3RoO288YTtvKyspe3ZhciBsPWVbb10sdT1sLmludGVydmFsLGg9bC5jbG9zZTtpZih1KXtpZih1WzBdPT09LTEvMCl7aWYoR0QoaFsxXSx0LHVbMV0pKXJldHVybiBvfWVsc2UgaWYodVsxXT09PTEvMCl7aWYoR0QoaFswXSx1WzBdLHQpKXJldHVybiBvfWVsc2UgaWYoR0QoaFswXSx1WzBdLHQpJiZHRChoWzFdLHQsdVsxXSkpcmV0dXJuIG87biYmYyh1WzBdLG8pLG4mJmModVsxXSxvKX19aWYobilyZXR1cm4gdD09PTEvMD9lLmxlbmd0aC0xOnQ9PT0tMS8wPzA6aTtmdW5jdGlvbiBjKGUsbil7dmFyIG89TWF0aC5hYnMoZS10KTtvPHImJihyPW8saT1uKX19LHQudmlzdWFsSGFuZGxlcnM9e2NvbG9yOnthcHBseVZpc3VhbDpSRCgiY29sb3IiKSxnZXRDb2xvck1hcHBlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uO3JldHVybiBXKCJjYXRlZ29yeSI9PT10Lm1hcHBpbmdNZXRob2Q/ZnVuY3Rpb24odCxlKXtyZXR1cm4hZSYmKHQ9dGhpcy5fbm9ybWFsaXplRGF0YSh0KSksTkQuY2FsbCh0aGlzLHQpfTpmdW5jdGlvbihlLG4saSl7dmFyIHI9ISFpO3JldHVybiFuJiYoZT10aGlzLl9ub3JtYWxpemVEYXRhKGUpKSxpPUpuKGUsdC5wYXJzZWRWaXN1YWwsaSkscj9pOnJpKGksInJnYmEiKX0sdGhpcyl9LF9ub3JtYWxpemVkVG9WaXN1YWw6e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gcmkoSm4odCx0aGlzLm9wdGlvbi5wYXJzZWRWaXN1YWwpLCJyZ2JhIil9LGNhdGVnb3J5Ok5ELHBpZWNld2lzZTpmdW5jdGlvbih0LGUpe3ZhciBuPVZELmNhbGwodGhpcyxlKTtyZXR1cm4gbnVsbD09biYmKG49cmkoSm4odCx0aGlzLm9wdGlvbi5wYXJzZWRWaXN1YWwpLCJyZ2JhIikpLG59LGZpeGVkOkVEfX0sY29sb3JIdWU6UEQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5pKHQsZSl9KSksY29sb3JTYXR1cmF0aW9uOlBEKChmdW5jdGlvbih0LGUpe3JldHVybiBuaSh0LG51bGwsZSl9KSksY29sb3JMaWdodG5lc3M6UEQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5pKHQsbnVsbCxudWxsLGUpfSkpLGNvbG9yQWxwaGE6UEQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGlpKHQsZSl9KSksZGVjYWw6e2FwcGx5VmlzdWFsOlJEKCJkZWNhbCIpLF9ub3JtYWxpemVkVG9WaXN1YWw6e2xpbmVhcjpudWxsLGNhdGVnb3J5Ok5ELHBpZWNld2lzZTpudWxsLGZpeGVkOm51bGx9fSxvcGFjaXR5OnthcHBseVZpc3VhbDpSRCgib3BhY2l0eSIpLF9ub3JtYWxpemVkVG9WaXN1YWw6ekQoWzAsMV0pfSxsaWZ0Wjp7YXBwbHlWaXN1YWw6UkQoImxpZnRaIiksX25vcm1hbGl6ZWRUb1Zpc3VhbDp7bGluZWFyOkVELGNhdGVnb3J5OkVELHBpZWNld2lzZTpFRCxmaXhlZDpFRH19LHN5bWJvbDp7YXBwbHlWaXN1YWw6ZnVuY3Rpb24odCxlLG4pe24oInN5bWJvbCIsdGhpcy5tYXBWYWx1ZVRvVmlzdWFsKHQpKX0sX25vcm1hbGl6ZWRUb1Zpc3VhbDp7bGluZWFyOk9ELGNhdGVnb3J5Ok5ELHBpZWNld2lzZTpmdW5jdGlvbih0LGUpe3ZhciBuPVZELmNhbGwodGhpcyxlKTtyZXR1cm4gbnVsbD09biYmKG49T0QuY2FsbCh0aGlzLHQpKSxufSxmaXhlZDpFRH19LHN5bWJvbFNpemU6e2FwcGx5VmlzdWFsOlJEKCJzeW1ib2xTaXplIiksX25vcm1hbGl6ZWRUb1Zpc3VhbDp6RChbMCwxXSl9fSx0fSgpO2Z1bmN0aW9uIExEKHQsZSl7dmFyIG49dC52aXN1YWwsaT1bXTtxKG4pP0NEKG4sKGZ1bmN0aW9uKHQpe2kucHVzaCh0KX0pKTpudWxsIT1uJiZpLnB1c2gobik7ZXx8MSE9PWkubGVuZ3RofHx7Y29sb3I6MSxzeW1ib2w6MX0uaGFzT3duUHJvcGVydHkodC50eXBlKXx8KGlbMV09aVswXSksQkQodCxpKX1mdW5jdGlvbiBQRCh0KXtyZXR1cm57YXBwbHlWaXN1YWw6ZnVuY3Rpb24oZSxuLGkpe3ZhciByPXRoaXMubWFwVmFsdWVUb1Zpc3VhbChlKTtpKCJjb2xvciIsdChuKCJjb2xvciIpLHIpKX0sX25vcm1hbGl6ZWRUb1Zpc3VhbDp6RChbMCwxXSl9fWZ1bmN0aW9uIE9EKHQpe3ZhciBlPXRoaXMub3B0aW9uLnZpc3VhbDtyZXR1cm4gZVtNYXRoLnJvdW5kKEtyKHQsWzAsMV0sWzAsZS5sZW5ndGgtMV0sITApKV18fHt9fWZ1bmN0aW9uIFJEKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7aSh0LHRoaXMubWFwVmFsdWVUb1Zpc3VhbChlKSl9fWZ1bmN0aW9uIE5EKHQpe3ZhciBlPXRoaXMub3B0aW9uLnZpc3VhbDtyZXR1cm4gZVt0aGlzLm9wdGlvbi5sb29wJiZ0IT09QUQ/dCVlLmxlbmd0aDp0XX1mdW5jdGlvbiBFRCgpe3JldHVybiB0aGlzLm9wdGlvbi52aXN1YWxbMF19ZnVuY3Rpb24gekQodCl7cmV0dXJue2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gS3IoZSx0LHRoaXMub3B0aW9uLnZpc3VhbCwhMCl9LGNhdGVnb3J5Ok5ELHBpZWNld2lzZTpmdW5jdGlvbihlLG4pe3ZhciBpPVZELmNhbGwodGhpcyxuKTtyZXR1cm4gbnVsbD09aSYmKGk9S3IoZSx0LHRoaXMub3B0aW9uLnZpc3VhbCwhMCkpLGl9LGZpeGVkOkVEfX1mdW5jdGlvbiBWRCh0KXt2YXIgZT10aGlzLm9wdGlvbixuPWUucGllY2VMaXN0O2lmKGUuaGFzU3BlY2lhbFZpc3VhbCl7dmFyIGk9bltrRC5maW5kUGllY2VJbmRleCh0LG4pXTtpZihpJiZpLnZpc3VhbClyZXR1cm4gaS52aXN1YWxbdGhpcy50eXBlXX19ZnVuY3Rpb24gQkQodCxlKXtyZXR1cm4gdC52aXN1YWw9ZSwiY29sb3IiPT09dC50eXBlJiYodC5wYXJzZWRWaXN1YWw9eihlLChmdW5jdGlvbih0KXt2YXIgZT1xbih0KTtyZXR1cm4gZXx8WzAsMCwwLDFdfSkpKSxlfXZhciBGRD17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiBLcih0LHRoaXMub3B0aW9uLmRhdGFFeHRlbnQsWzAsMV0sITApfSxwaWVjZXdpc2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24ucGllY2VMaXN0LG49a0QuZmluZFBpZWNlSW5kZXgodCxlLCEwKTtpZihudWxsIT1uKXJldHVybiBLcihuLFswLGUubGVuZ3RoLTFdLFswLDFdLCEwKX0sY2F0ZWdvcnk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24uY2F0ZWdvcmllcz90aGlzLm9wdGlvbi5jYXRlZ29yeU1hcFt0XTp0O3JldHVybiBudWxsPT1lP0FEOmV9LGZpeGVkOmJ0fTtmdW5jdGlvbiBHRCh0LGUsbil7cmV0dXJuIHQ/ZTw9bjplPG59dmFyIFdEPVZvKCksSEQ9e3Nlcmllc1R5cGU6InRyZWVtYXAiLHJlc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLnRyZWUucm9vdDtlLmlzUmVtb3ZlZCgpfHxZRChlLHt9LHQuZ2V0Vmlld1Jvb3QoKS5nZXRBbmNlc3RvcnMoKSx0KX19O2Z1bmN0aW9uIFlEKHQsZSxuLGkpe3ZhciByPXQuZ2V0TW9kZWwoKSxvPXQuZ2V0TGF5b3V0KCksYT10Lmhvc3RUcmVlLmRhdGE7aWYobyYmIW8uaW52aXNpYmxlJiZvLmlzSW5WaWV3KXt2YXIgcyxsPXIuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLHU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPUEoe30sZSkscj1uLmRlc2lnbmF0ZWRWaXN1YWxJdGVtU3R5bGU7cmV0dXJuIEUoWyJjb2xvciIsImNvbG9yQWxwaGEiLCJjb2xvclNhdHVyYXRpb24iXSwoZnVuY3Rpb24obil7cltuXT1lW25dO3ZhciBvPXQuZ2V0KG4pO3Jbbl09bnVsbCxudWxsIT1vJiYoaVtuXT1vKX0pKSxpfShsLGUsaSksaD1hLmVuc3VyZVVuaXF1ZUl0ZW1WaXN1YWwodC5kYXRhSW5kZXgsInN0eWxlIiksYz1sLmdldCgiYm9yZGVyQ29sb3IiKSxwPWwuZ2V0KCJib3JkZXJDb2xvclNhdHVyYXRpb24iKTtudWxsIT1wJiYoYz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT1lP25pKGUsbnVsbCxudWxsLHQpOm51bGx9KHAscz1YRCh1KSkpLGguc3Ryb2tlPWM7dmFyIGQ9dC52aWV3Q2hpbGRyZW47aWYoZCYmZC5sZW5ndGgpe3ZhciBmPWZ1bmN0aW9uKHQsZSxuLGkscixvKXtpZighb3x8IW8ubGVuZ3RoKXJldHVybjt2YXIgYT1aRChlLCJjb2xvciIpfHxudWxsIT1yLmNvbG9yJiYibm9uZSIhPT1yLmNvbG9yJiYoWkQoZSwiY29sb3JBbHBoYSIpfHxaRChlLCJjb2xvclNhdHVyYXRpb24iKSk7aWYoIWEpcmV0dXJuO3ZhciBzPWUuZ2V0KCJ2aXN1YWxNaW4iKSxsPWUuZ2V0KCJ2aXN1YWxNYXgiKSx1PW4uZGF0YUV4dGVudC5zbGljZSgpO251bGwhPXMmJnM8dVswXSYmKHVbMF09cyksbnVsbCE9bCYmbD51WzFdJiYodVsxXT1sKTt2YXIgaD1lLmdldCgiY29sb3JNYXBwaW5nQnkiKSxjPXt0eXBlOmEubmFtZSxkYXRhRXh0ZW50OnUsdmlzdWFsOmEucmFuZ2V9OyJjb2xvciIhPT1jLnR5cGV8fCJpbmRleCIhPT1oJiYiaWQiIT09aD9jLm1hcHBpbmdNZXRob2Q9ImxpbmVhciI6KGMubWFwcGluZ01ldGhvZD0iY2F0ZWdvcnkiLGMubG9vcD0hMCk7dmFyIHA9bmV3IGtEKGMpO3JldHVybiBXRChwKS5kckNvbG9yTWFwcGluZ0J5PWgscH0oMCxyLG8sMCx1LGQpO0UoZCwoZnVuY3Rpb24odCxlKXtpZih0LmRlcHRoPj1uLmxlbmd0aHx8dD09PW5bdC5kZXB0aF0pe3ZhciBvPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT1BKHt9LGUpO2lmKHIpe3ZhciBzPXIudHlwZSxsPSJjb2xvciI9PT1zJiZXRChyKS5kckNvbG9yTWFwcGluZ0J5LHU9ImluZGV4Ij09PWw/aToiaWQiPT09bD9vLm1hcElkVG9JbmRleChuLmdldElkKCkpOm4uZ2V0VmFsdWUodC5nZXQoInZpc3VhbERpbWVuc2lvbiIpKTthW3NdPXIubWFwVmFsdWVUb1Zpc3VhbCh1KX1yZXR1cm4gYX0ocix1LHQsZSxmLGkpO1lEKHQsbyxuLGkpfX0pKX1lbHNlIHM9WEQodSksaC5maWxsPXN9fWZ1bmN0aW9uIFhEKHQpe3ZhciBlPVVEKHQsImNvbG9yIik7aWYoZSl7dmFyIG49VUQodCwiY29sb3JBbHBoYSIpLGk9VUQodCwiY29sb3JTYXR1cmF0aW9uIik7cmV0dXJuIGkmJihlPW5pKGUsbnVsbCxudWxsLGkpKSxuJiYoZT1paShlLG4pKSxlfX1mdW5jdGlvbiBVRCh0LGUpe3ZhciBuPXRbZV07aWYobnVsbCE9biYmIm5vbmUiIT09bilyZXR1cm4gbn1mdW5jdGlvbiBaRCh0LGUpe3ZhciBuPXQuZ2V0KGUpO3JldHVybiBZKG4pJiZuLmxlbmd0aD97bmFtZTplLHJhbmdlOm59Om51bGx9dmFyIGpEPU1hdGgubWF4LHFEPU1hdGgubWluLEtEPWl0LCREPUUsSkQ9WyJpdGVtU3R5bGUiLCJib3JkZXJXaWR0aCJdLFFEPVsiaXRlbVN0eWxlIiwiZ2FwV2lkdGgiXSx0QT1bInVwcGVyTGFiZWwiLCJzaG93Il0sZUE9WyJ1cHBlckxhYmVsIiwiaGVpZ2h0Il0sbkE9e3Nlcmllc1R5cGU6InRyZWVtYXAiLHJlc2V0OmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uZ2V0V2lkdGgoKSxvPW4uZ2V0SGVpZ2h0KCksYT10Lm9wdGlvbixzPWtwKHQuZ2V0Qm94TGF5b3V0UGFyYW1zKCkse3dpZHRoOm4uZ2V0V2lkdGgoKSxoZWlnaHQ6bi5nZXRIZWlnaHQoKX0pLGw9YS5zaXplfHxbXSx1PSRyKEtEKHMud2lkdGgsbFswXSksciksaD0kcihLRChzLmhlaWdodCxsWzFdKSxvKSxjPWkmJmkudHlwZSxwPWlEKGksWyJ0cmVlbWFwWm9vbVRvTm9kZSIsInRyZWVtYXBSb290VG9Ob2RlIl0sdCksZD0idHJlZW1hcFJlbmRlciI9PT1jfHwidHJlZW1hcE1vdmUiPT09Yz9pLnJvb3RSZWN0Om51bGwsZj10LmdldFZpZXdSb290KCksZz1yRChmKTtpZigidHJlZW1hcE1vdmUiIT09Yyl7dmFyIHk9InRyZWVtYXBab29tVG9Ob2RlIj09PWM/ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbyxhPShlfHx7fSkubm9kZSxzPVtpLHJdO2lmKCFhfHxhPT09bilyZXR1cm4gczt2YXIgbD1pKnIsdT1sKnQub3B0aW9uLnpvb21Ub05vZGVSYXRpbztmb3IoO289YS5wYXJlbnROb2RlOyl7Zm9yKHZhciBoPTAsYz1vLmNoaWxkcmVuLHA9MCxkPWMubGVuZ3RoO3A8ZDtwKyspaCs9Y1twXS5nZXRWYWx1ZSgpO3ZhciBmPWEuZ2V0VmFsdWUoKTtpZigwPT09ZilyZXR1cm4gczt1Kj1oL2Y7dmFyIGc9by5nZXRNb2RlbCgpLHk9Zy5nZXQoSkQpOyh1Kz00KnkqeSsoMyp5K01hdGgubWF4KHksc0EoZykpKSpNYXRoLnBvdyh1LC41KSk+b28mJih1PW9vKSxhPW99dTxsJiYodT1sKTt2YXIgdj1NYXRoLnBvdyh1L2wsLjUpO3JldHVybltpKnYscip2XX0odCxwLGYsdSxoKTpkP1tkLndpZHRoLGQuaGVpZ2h0XTpbdSxoXSx2PWEuc29ydDt2JiYiYXNjIiE9PXYmJiJkZXNjIiE9PXYmJih2PSJkZXNjIik7dmFyIG09e3NxdWFyZVJhdGlvOmEuc3F1YXJlUmF0aW8sc29ydDp2LGxlYWZEZXB0aDphLmxlYWZEZXB0aH07Zi5ob3N0VHJlZS5jbGVhckxheW91dHMoKTt2YXIgeD17eDowLHk6MCx3aWR0aDp5WzBdLGhlaWdodDp5WzFdLGFyZWE6eVswXSp5WzFdfTtmLnNldExheW91dCh4KSxpQShmLG0sITEsMCkseD1mLmdldExheW91dCgpLCREKGcsKGZ1bmN0aW9uKHQsZSl7dmFyIG49KGdbZSsxXXx8ZikuZ2V0VmFsdWUoKTt0LnNldExheW91dChBKHtkYXRhRXh0ZW50OltuLG5dLGJvcmRlcldpZHRoOjAsdXBwZXJIZWlnaHQ6MH0seCkpfSkpfXZhciBfPXQuZ2V0RGF0YSgpLnRyZWUucm9vdDtfLnNldExheW91dChmdW5jdGlvbih0LGUsbil7aWYoZSlyZXR1cm57eDplLngseTplLnl9O3ZhciBpPXt4OjAseTowfTtpZighbilyZXR1cm4gaTt2YXIgcj1uLm5vZGUsbz1yLmdldExheW91dCgpO2lmKCFvKXJldHVybiBpO3ZhciBhPVtvLndpZHRoLzIsby5oZWlnaHQvMl0scz1yO2Zvcig7czspe3ZhciBsPXMuZ2V0TGF5b3V0KCk7YVswXSs9bC54LGFbMV0rPWwueSxzPXMucGFyZW50Tm9kZX1yZXR1cm57eDp0LndpZHRoLzItYVswXSx5OnQuaGVpZ2h0LzItYVsxXX19KHMsZCxwKSwhMCksdC5zZXRMYXlvdXRJbmZvKHMpLGFBKF8sbmV3IHplKC1zLngsLXMueSxyLG8pLGcsZiwwKX19O2Z1bmN0aW9uIGlBKHQsZSxuLGkpe3ZhciByLG87aWYoIXQuaXNSZW1vdmVkKCkpe3ZhciBhPXQuZ2V0TGF5b3V0KCk7cj1hLndpZHRoLG89YS5oZWlnaHQ7dmFyIHM9dC5nZXRNb2RlbCgpLGw9cy5nZXQoSkQpLHU9cy5nZXQoUUQpLzIsaD1zQShzKSxjPU1hdGgubWF4KGwsaCkscD1sLXUsZD1jLXU7dC5zZXRMYXlvdXQoe2JvcmRlcldpZHRoOmwsdXBwZXJIZWlnaHQ6Yyx1cHBlckxhYmVsSGVpZ2h0Omh9LCEwKTt2YXIgZj0ocj1qRChyLTIqcCwwKSkqKG89akQoby1wLWQsMCkpLGc9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPXQuY2hpbGRyZW58fFtdLHM9aS5zb3J0OyJhc2MiIT09cyYmImRlc2MiIT09cyYmKHM9bnVsbCk7dmFyIGw9bnVsbCE9aS5sZWFmRGVwdGgmJmkubGVhZkRlcHRoPD1vO2lmKHImJiFsKXJldHVybiB0LnZpZXdDaGlsZHJlbj1bXTthPUIoYSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuaXNSZW1vdmVkKCl9KSksZnVuY3Rpb24odCxlKXtlJiZ0LnNvcnQoKGZ1bmN0aW9uKHQsbil7dmFyIGk9ImFzYyI9PT1lP3QuZ2V0VmFsdWUoKS1uLmdldFZhbHVlKCk6bi5nZXRWYWx1ZSgpLXQuZ2V0VmFsdWUoKTtyZXR1cm4gMD09PWk/ImFzYyI9PT1lP3QuZGF0YUluZGV4LW4uZGF0YUluZGV4Om4uZGF0YUluZGV4LXQuZGF0YUluZGV4Oml9KSl9KGEscyk7dmFyIHU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wLHI9MCxvPWUubGVuZ3RoO3I8bztyKyspaSs9ZVtyXS5nZXRWYWx1ZSgpO3ZhciBhLHM9dC5nZXQoInZpc3VhbERpbWVuc2lvbiIpO2UmJmUubGVuZ3RoPyJ2YWx1ZSI9PT1zJiZuPyhhPVtlW2UubGVuZ3RoLTFdLmdldFZhbHVlKCksZVswXS5nZXRWYWx1ZSgpXSwiYXNjIj09PW4mJmEucmV2ZXJzZSgpKTooYT1bMS8wLC0xLzBdLCREKGUsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0VmFsdWUocyk7ZTxhWzBdJiYoYVswXT1lKSxlPmFbMV0mJihhWzFdPWUpfSkpKTphPVtOYU4sTmFOXTtyZXR1cm57c3VtOmksZGF0YUV4dGVudDphfX0oZSxhLHMpO2lmKDA9PT11LnN1bSlyZXR1cm4gdC52aWV3Q2hpbGRyZW49W107aWYodS5zdW09ZnVuY3Rpb24odCxlLG4saSxyKXtpZighaSlyZXR1cm4gbjtmb3IodmFyIG89dC5nZXQoInZpc2libGVNaW4iKSxhPXIubGVuZ3RoLHM9YSxsPWEtMTtsPj0wO2wtLSl7dmFyIHU9clsiYXNjIj09PWk/YS1sLTE6bF0uZ2V0VmFsdWUoKTt1L24qZTxvJiYocz1sLG4tPXUpfXJldHVybiJhc2MiPT09aT9yLnNwbGljZSgwLGEtcyk6ci5zcGxpY2UocyxhLXMpLG59KGUsbix1LnN1bSxzLGEpLDA9PT11LnN1bSlyZXR1cm4gdC52aWV3Q2hpbGRyZW49W107Zm9yKHZhciBoPTAsYz1hLmxlbmd0aDtoPGM7aCsrKXt2YXIgcD1hW2hdLmdldFZhbHVlKCkvdS5zdW0qbjthW2hdLnNldExheW91dCh7YXJlYTpwfSl9bCYmKGEubGVuZ3RoJiZ0LnNldExheW91dCh7aXNMZWFmUm9vdDohMH0sITApLGEubGVuZ3RoPTApO3JldHVybiB0LnZpZXdDaGlsZHJlbj1hLHQuc2V0TGF5b3V0KHtkYXRhRXh0ZW50OnUuZGF0YUV4dGVudH0sITApLGF9KHQscyxmLGUsbixpKTtpZihnLmxlbmd0aCl7dmFyIHk9e3g6cCx5OmQsd2lkdGg6cixoZWlnaHQ6b30sdj1xRChyLG8pLG09MS8wLHg9W107eC5hcmVhPTA7Zm9yKHZhciBfPTAsYj1nLmxlbmd0aDtfPGI7KXt2YXIgdz1nW19dO3gucHVzaCh3KSx4LmFyZWErPXcuZ2V0TGF5b3V0KCkuYXJlYTt2YXIgUz1yQSh4LHYsZS5zcXVhcmVSYXRpbyk7Uzw9bT8oXysrLG09Uyk6KHguYXJlYS09eC5wb3AoKS5nZXRMYXlvdXQoKS5hcmVhLG9BKHgsdix5LHUsITEpLHY9cUQoeS53aWR0aCx5LmhlaWdodCkseC5sZW5ndGg9eC5hcmVhPTAsbT0xLzApfWlmKHgubGVuZ3RoJiZvQSh4LHYseSx1LCEwKSwhbil7dmFyIE09cy5nZXQoImNoaWxkcmVuVmlzaWJsZU1pbiIpO251bGwhPU0mJmY8TSYmKG49ITApfWZvcihfPTAsYj1nLmxlbmd0aDtfPGI7XysrKWlBKGdbX10sZSxuLGkrMSl9fX1mdW5jdGlvbiByQSh0LGUsbil7Zm9yKHZhciBpPTAscj0xLzAsbz0wLGE9dm9pZCAwLHM9dC5sZW5ndGg7bzxzO28rKykoYT10W29dLmdldExheW91dCgpLmFyZWEpJiYoYTxyJiYocj1hKSxhPmkmJihpPWEpKTt2YXIgbD10LmFyZWEqdC5hcmVhLHU9ZSplKm47cmV0dXJuIGw/akQodSppL2wsbC8odSpyKSk6MS8wfWZ1bmN0aW9uIG9BKHQsZSxuLGkscil7dmFyIG89ZT09PW4ud2lkdGg/MDoxLGE9MS1vLHM9WyJ4IiwieSJdLGw9WyJ3aWR0aCIsImhlaWdodCJdLHU9bltzW29dXSxoPWU/dC5hcmVhL2U6MDsocnx8aD5uW2xbYV1dKSYmKGg9bltsW2FdXSk7Zm9yKHZhciBjPTAscD10Lmxlbmd0aDtjPHA7YysrKXt2YXIgZD10W2NdLGY9e30sZz1oP2QuZ2V0TGF5b3V0KCkuYXJlYS9oOjAseT1mW2xbYV1dPWpEKGgtMippLDApLHY9bltzW29dXStuW2xbb11dLXUsbT1jPT09cC0xfHx2PGc/djpnLHg9ZltsW29dXT1qRChtLTIqaSwwKTtmW3NbYV1dPW5bc1thXV0rcUQoaSx5LzIpLGZbc1tvXV09dStxRChpLHgvMiksdSs9bSxkLnNldExheW91dChmLCEwKX1uW3NbYV1dKz1oLG5bbFthXV0tPWh9ZnVuY3Rpb24gYUEodCxlLG4saSxyKXt2YXIgbz10LmdldExheW91dCgpLGE9bltyXSxzPWEmJmE9PT10O2lmKCEoYSYmIXN8fHI9PT1uLmxlbmd0aCYmdCE9PWkpKXt0LnNldExheW91dCh7aXNJblZpZXc6ITAsaW52aXNpYmxlOiFzJiYhZS5pbnRlcnNlY3QobyksaXNBYm92ZVZpZXdSb290OnN9LCEwKTt2YXIgbD1uZXcgemUoZS54LW8ueCxlLnktby55LGUud2lkdGgsZS5oZWlnaHQpOyREKHQudmlld0NoaWxkcmVufHxbXSwoZnVuY3Rpb24odCl7YUEodCxsLG4saSxyKzEpfSkpfX1mdW5jdGlvbiBzQSh0KXtyZXR1cm4gdC5nZXQodEEpP3QuZ2V0KGVBKTowfWZ1bmN0aW9uIGxBKHQpe3ZhciBlPXQuZmluZENvbXBvbmVudHMoe21haW5UeXBlOiJsZWdlbmQifSk7ZSYmZS5sZW5ndGgmJnQuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLChmdW5jdGlvbih0KXt2YXIgbj10LmdldENhdGVnb3JpZXNEYXRhKCksaT10LmdldEdyYXBoKCkuZGF0YSxyPW4ubWFwQXJyYXkobi5nZXROYW1lKTtpLmZpbHRlclNlbGYoKGZ1bmN0aW9uKHQpe3ZhciBuPWkuZ2V0SXRlbU1vZGVsKHQpLmdldFNoYWxsb3coImNhdGVnb3J5Iik7aWYobnVsbCE9bil7aihuKSYmKG49cltuXSk7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDtvKyspaWYoIWVbb10uaXNTZWxlY3RlZChuKSlyZXR1cm4hMX1yZXR1cm4hMH0pKX0pKX1mdW5jdGlvbiB1QSh0KXt2YXIgZT17fTt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIiwoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRDYXRlZ29yaWVzRGF0YSgpLGk9dC5nZXREYXRhKCkscj17fTtuLmVhY2goKGZ1bmN0aW9uKGkpe3ZhciBvPW4uZ2V0TmFtZShpKTtyWyJlYy0iK29dPWk7dmFyIGE9bi5nZXRJdGVtTW9kZWwoaSkscz1hLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKTtzLmZpbGx8fChzLmZpbGw9dC5nZXRDb2xvckZyb21QYWxldHRlKG8sZSkpLG4uc2V0SXRlbVZpc3VhbChpLCJzdHlsZSIscyk7Zm9yKHZhciBsPVsic3ltYm9sIiwic3ltYm9sU2l6ZSIsInN5bWJvbEtlZXBBc3BlY3QiXSx1PTA7dTxsLmxlbmd0aDt1Kyspe3ZhciBoPWEuZ2V0U2hhbGxvdyhsW3VdLCEwKTtudWxsIT1oJiZuLnNldEl0ZW1WaXN1YWwoaSxsW3VdLGgpfX0pKSxuLmNvdW50KCkmJmkuZWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9aS5nZXRJdGVtTW9kZWwodCkuZ2V0U2hhbGxvdygiY2F0ZWdvcnkiKTtpZihudWxsIT1lKXtVKGUpJiYoZT1yWyJlYy0iK2VdKTt2YXIgbz1uLmdldEl0ZW1WaXN1YWwoZSwic3R5bGUiKTtBKGkuZW5zdXJlVW5pcXVlSXRlbVZpc3VhbCh0LCJzdHlsZSIpLG8pO2Zvcih2YXIgYT1bInN5bWJvbCIsInN5bWJvbFNpemUiLCJzeW1ib2xLZWVwQXNwZWN0Il0scz0wO3M8YS5sZW5ndGg7cysrKWkuc2V0SXRlbVZpc3VhbCh0LGFbc10sbi5nZXRJdGVtVmlzdWFsKGUsYVtzXSkpfX0pKX0pKX1mdW5jdGlvbiBoQSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFycmF5fHwodD1bdCx0XSksdH1mdW5jdGlvbiBjQSh0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHcmFwaCgpLG49dC5nZXRFZGdlRGF0YSgpLGk9aEEodC5nZXQoImVkZ2VTeW1ib2wiKSkscj1oQSh0LmdldCgiZWRnZVN5bWJvbFNpemUiKSk7bi5zZXRWaXN1YWwoImZyb21TeW1ib2wiLGkmJmlbMF0pLG4uc2V0VmlzdWFsKCJ0b1N5bWJvbCIsaSYmaVsxXSksbi5zZXRWaXN1YWwoImZyb21TeW1ib2xTaXplIixyJiZyWzBdKSxuLnNldFZpc3VhbCgidG9TeW1ib2xTaXplIixyJiZyWzFdKSxuLnNldFZpc3VhbCgic3R5bGUiLHQuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpKSxuLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPW4uZ2V0SXRlbU1vZGVsKHQpLHI9ZS5nZXRFZGdlQnlJbmRleCh0KSxvPWhBKGkuZ2V0U2hhbGxvdygic3ltYm9sIiwhMCkpLGE9aEEoaS5nZXRTaGFsbG93KCJzeW1ib2xTaXplIiwhMCkpLHM9aS5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksbD1uLmVuc3VyZVVuaXF1ZUl0ZW1WaXN1YWwodCwic3R5bGUiKTtzd2l0Y2goQShsLHMpLGwuc3Ryb2tlKXtjYXNlInNvdXJjZSI6dmFyIHU9ci5ub2RlMS5nZXRWaXN1YWwoInN0eWxlIik7bC5zdHJva2U9dSYmdS5maWxsO2JyZWFrO2Nhc2UidGFyZ2V0Ijp1PXIubm9kZTIuZ2V0VmlzdWFsKCJzdHlsZSIpO2wuc3Ryb2tlPXUmJnUuZmlsbH1vWzBdJiZyLnNldFZpc3VhbCgiZnJvbVN5bWJvbCIsb1swXSksb1sxXSYmci5zZXRWaXN1YWwoInRvU3ltYm9sIixvWzFdKSxhWzBdJiZyLnNldFZpc3VhbCgiZnJvbVN5bWJvbFNpemUiLGFbMF0pLGFbMV0mJnIuc2V0VmlzdWFsKCJ0b1N5bWJvbFNpemUiLGFbMV0pfSkpfSkpfXZhciBwQT0iLS1ceDNlIixkQT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoImF1dG9DdXJ2ZW5lc3MiKXx8bnVsbH0sZkE9ZnVuY3Rpb24odCxlKXt2YXIgbj1kQSh0KSxpPTIwLHI9W107aWYoaihuKSlpPW47ZWxzZSBpZihZKG4pKXJldHVybiB2b2lkKHQuX19jdXJ2ZW5lc3NMaXN0PW4pO2U+aSYmKGk9ZSk7dmFyIG89aSUyP2krMjppKzM7cj1bXTtmb3IodmFyIGE9MDthPG87YSsrKXIucHVzaCgoYSUyP2ErMTphKS8xMCooYSUyPy0xOjEpKTt0Ll9fY3VydmVuZXNzTGlzdD1yfSxnQT1mdW5jdGlvbih0LGUsbil7dmFyIGk9W3QuaWQsdC5kYXRhSW5kZXhdLmpvaW4oIi4iKSxyPVtlLmlkLGUuZGF0YUluZGV4XS5qb2luKCIuIik7cmV0dXJuW24udWlkLGkscl0uam9pbihwQSl9LHlBPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQocEEpO3JldHVybltlWzBdLGVbMl0sZVsxXV0uam9pbihwQSl9LHZBPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5fX2VkZ2VNYXA7cmV0dXJuIG5bdF0/blt0XS5sZW5ndGg6MH07ZnVuY3Rpb24gbUEodCxlLG4saSl7dmFyIHI9ZEEoZSksbz1ZKHIpO2lmKCFyKXJldHVybiBudWxsO3ZhciBhPWZ1bmN0aW9uKHQsZSl7dmFyIG49Z0EodC5ub2RlMSx0Lm5vZGUyLGUpO3JldHVybiBlLl9fZWRnZU1hcFtuXX0odCxlKTtpZighYSlyZXR1cm4gbnVsbDtmb3IodmFyIHM9LTEsbD0wO2w8YS5sZW5ndGg7bCsrKWlmKGFbbF09PT1uKXtzPWw7YnJlYWt9dmFyIHU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdkEoZ0EodC5ub2RlMSx0Lm5vZGUyLGUpLGUpK3ZBKGdBKHQubm9kZTIsdC5ub2RlMSxlKSxlKX0odCxlKTtmQShlLHUpLHQubGluZVN0eWxlPXQubGluZVN0eWxlfHx7fTt2YXIgaD1nQSh0Lm5vZGUxLHQubm9kZTIsZSksYz1lLl9fY3VydmVuZXNzTGlzdCxwPW98fHUlMj8wOjE7aWYoYS5pc0ZvcndhcmQpcmV0dXJuIGNbcCtzXTt2YXIgZD15QShoKSxmPXZBKGQsZSksZz1jW3MrZitwXTtyZXR1cm4gaT9vP3ImJjA9PT1yWzBdPyhmK3ApJTI/ZzotZzooKGYlMj8wOjEpK3ApJTI/ZzotZzooZitwKSUyP2c6LWc6Y1tzK2YrcF19ZnVuY3Rpb24geEEodCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO2lmKCFlfHwidmlldyI9PT1lLnR5cGUpe3ZhciBuPXQuZ2V0R3JhcGgoKTtuLmVhY2hOb2RlKChmdW5jdGlvbih0KXt2YXIgZT10LmdldE1vZGVsKCk7dC5zZXRMYXlvdXQoWytlLmdldCgieCIpLCtlLmdldCgieSIpXSl9KSksX0Eobix0KX19ZnVuY3Rpb24gX0EodCxlKXt0LmVhY2hFZGdlKChmdW5jdGlvbih0LG4pe3ZhciBpPW90KHQuZ2V0TW9kZWwoKS5nZXQoWyJsaW5lU3R5bGUiLCJjdXJ2ZW5lc3MiXSksLW1BKHQsZSxuLCEwKSwwKSxyPVR0KHQubm9kZTEuZ2V0TGF5b3V0KCkpLG89VHQodC5ub2RlMi5nZXRMYXlvdXQoKSksYT1bcixvXTsraSYmYS5wdXNoKFsoclswXStvWzBdKS8yLShyWzFdLW9bMV0pKmksKHJbMV0rb1sxXSkvMi0ob1swXS1yWzBdKSppXSksdC5zZXRMYXlvdXQoYSl9KSl9ZnVuY3Rpb24gYkEodCxlKXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImxheW91dCIpLG49dC5jb29yZGluYXRlU3lzdGVtO2lmKG4mJiJ2aWV3IiE9PW4udHlwZSl7dmFyIGk9dC5nZXREYXRhKCkscj1bXTtFKG4uZGltZW5zaW9ucywoZnVuY3Rpb24odCl7cj1yLmNvbmNhdChpLm1hcERpbWVuc2lvbnNBbGwodCkpfSkpO2Zvcih2YXIgbz0wO288aS5jb3VudCgpO28rKyl7Zm9yKHZhciBhPVtdLHM9ITEsbD0wO2w8ci5sZW5ndGg7bCsrKXt2YXIgdT1pLmdldChyW2xdLG8pO2lzTmFOKHUpfHwocz0hMCksYS5wdXNoKHUpfXM/aS5zZXRJdGVtTGF5b3V0KG8sbi5kYXRhVG9Qb2ludChhKSk6aS5zZXRJdGVtTGF5b3V0KG8sW05hTixOYU5dKX1fQShpLmdyYXBoLHQpfWVsc2UgZSYmIm5vbmUiIT09ZXx8eEEodCl9KSl9ZnVuY3Rpb24gd0EodCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO2lmKCJ2aWV3IiE9PWUudHlwZSlyZXR1cm4gMTt2YXIgbj10Lm9wdGlvbi5ub2RlU2NhbGVSYXRpbyxpPWUuc2NhbGVYO3JldHVybigoZS5nZXRab29tKCktMSkqbisxKS9pfWZ1bmN0aW9uIFNBKHQpe3ZhciBlPXQuZ2V0VmlzdWFsKCJzeW1ib2xTaXplIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheSYmKGU9KGVbMF0rZVsxXSkvMiksK2V9dmFyIE1BPU1hdGguUEksSUE9W107ZnVuY3Rpb24gVEEodCxlLG4saSl7dmFyIHI9dC5jb29yZGluYXRlU3lzdGVtO2lmKCFyfHwidmlldyI9PT1yLnR5cGUpe3ZhciBvPXIuZ2V0Qm91bmRpbmdSZWN0KCksYT10LmdldERhdGEoKSxzPWEuZ3JhcGgsbD1vLndpZHRoLzIrby54LHU9by5oZWlnaHQvMitvLnksaD1NYXRoLm1pbihvLndpZHRoLG8uaGVpZ2h0KS8yLGM9YS5jb3VudCgpO2lmKGEuc2V0TGF5b3V0KHtjeDpsLGN5OnV9KSxjKXtpZihuKXt2YXIgcD1yLnBvaW50VG9EYXRhKGkpLGQ9cFswXSxmPXBbMV0sZz1bZC1sLGYtdV07RXQoZyxnKSxOdChnLGcsaCksbi5zZXRMYXlvdXQoW2wrZ1swXSx1K2dbMV1dLCEwKSxEQShuLHQuZ2V0KFsiY2lyY3VsYXIiLCJyb3RhdGVMYWJlbCJdKSxsLHUpfUNBW2VdKHQscyxhLGgsbCx1LGMpLHMuZWFjaEVkZ2UoKGZ1bmN0aW9uKGUsbil7dmFyIGkscj1vdChlLmdldE1vZGVsKCkuZ2V0KFsibGluZVN0eWxlIiwiY3VydmVuZXNzIl0pLG1BKGUsdCxuKSwwKSxvPVR0KGUubm9kZTEuZ2V0TGF5b3V0KCkpLGE9VHQoZS5ub2RlMi5nZXRMYXlvdXQoKSkscz0ob1swXSthWzBdKS8yLGg9KG9bMV0rYVsxXSkvMjsrciYmKGk9W2wqKHIqPTMpK3MqKDEtciksdSpyK2gqKDEtcildKSxlLnNldExheW91dChbbyxhLGldKX0pKX19fXZhciBDQT17dmFsdWU6ZnVuY3Rpb24odCxlLG4saSxyLG8sYSl7dmFyIHM9MCxsPW4uZ2V0U3VtKCJ2YWx1ZSIpLHU9MipNYXRoLlBJLyhsfHxhKTtlLmVhY2hOb2RlKChmdW5jdGlvbih0KXt2YXIgZT10LmdldFZhbHVlKCJ2YWx1ZSIpLG49dSoobD9lOjEpLzI7cys9bix0LnNldExheW91dChbaSpNYXRoLmNvcyhzKStyLGkqTWF0aC5zaW4ocykrb10pLHMrPW59KSl9LHN5bWJvbFNpemU6ZnVuY3Rpb24odCxlLG4saSxyLG8sYSl7dmFyIHM9MDtJQS5sZW5ndGg9YTt2YXIgbD13QSh0KTtlLmVhY2hOb2RlKChmdW5jdGlvbih0KXt2YXIgZT1TQSh0KTtpc05hTihlKSYmKGU9MiksZTwwJiYoZT0wKSxlKj1sO3ZhciBuPU1hdGguYXNpbihlLzIvaSk7aXNOYU4obikmJihuPU1BLzIpLElBW3QuZGF0YUluZGV4XT1uLHMrPTIqbn0pKTt2YXIgdT0oMipNQS1zKS9hLzIsaD0wO2UuZWFjaE5vZGUoKGZ1bmN0aW9uKHQpe3ZhciBlPXUrSUFbdC5kYXRhSW5kZXhdO2grPWUsKCF0LmdldExheW91dCgpfHwhdC5nZXRMYXlvdXQoKS5maXhlZCkmJnQuc2V0TGF5b3V0KFtpKk1hdGguY29zKGgpK3IsaSpNYXRoLnNpbihoKStvXSksaCs9ZX0pKX19O2Z1bmN0aW9uIERBKHQsZSxuLGkpe3ZhciByPXQuZ2V0R3JhcGhpY0VsKCk7aWYocil7dmFyIG89dC5nZXRNb2RlbCgpLmdldChbImxhYmVsIiwicm90YXRlIl0pfHwwLGE9ci5nZXRTeW1ib2xQYXRoKCk7aWYoZSl7dmFyIHM9dC5nZXRMYXlvdXQoKSxsPU1hdGguYXRhbjIoc1sxXS1pLHNbMF0tbik7bDwwJiYobD0yKk1hdGguUEkrbCk7dmFyIHU9c1swXTxuO3UmJihsLT1NYXRoLlBJKTt2YXIgaD11PyJsZWZ0IjoicmlnaHQiO2Euc2V0VGV4dENvbmZpZyh7cm90YXRpb246LWwscG9zaXRpb246aCxvcmlnaW46ImNlbnRlciJ9KTt2YXIgYz1hLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpO0EoYy50ZXh0Q29uZmlnfHwoYy50ZXh0Q29uZmlnPXt9KSx7cG9zaXRpb246aH0pfWVsc2UgYS5zZXRUZXh0Q29uZmlnKHtyb3RhdGlvbjpvKj1NYXRoLlBJLzE4MH0pfX1mdW5jdGlvbiBBQSh0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIiwoZnVuY3Rpb24odCl7ImNpcmN1bGFyIj09PXQuZ2V0KCJsYXlvdXQiKSYmVEEodCwic3ltYm9sU2l6ZSIpfSkpfXZhciBrQT1BdDtmdW5jdGlvbiBMQSh0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO2lmKCFlfHwidmlldyI9PT1lLnR5cGUpaWYoImZvcmNlIj09PXQuZ2V0KCJsYXlvdXQiKSl7dmFyIG49dC5wcmVzZXJ2ZWRQb2ludHN8fHt9LGk9dC5nZXRHcmFwaCgpLHI9aS5kYXRhLG89aS5lZGdlRGF0YSxhPXQuZ2V0TW9kZWwoImZvcmNlIikscz1hLmdldCgiaW5pdExheW91dCIpO3QucHJlc2VydmVkUG9pbnRzP3IuZWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9ci5nZXRJZCh0KTtyLnNldEl0ZW1MYXlvdXQodCxuW2VdfHxbTmFOLE5hTl0pfSkpOnMmJiJub25lIiE9PXM/ImNpcmN1bGFyIj09PXMmJlRBKHQsInZhbHVlIik6eEEodCk7dmFyIGw9ci5nZXREYXRhRXh0ZW50KCJ2YWx1ZSIpLHU9by5nZXREYXRhRXh0ZW50KCJ2YWx1ZSIpLGg9YS5nZXQoInJlcHVsc2lvbiIpLGM9YS5nZXQoImVkZ2VMZW5ndGgiKSxwPVkoaCk/aDpbaCxoXSxkPVkoYyk/YzpbYyxjXTtkPVtkWzFdLGRbMF1dO3ZhciBmPXIubWFwQXJyYXkoInZhbHVlIiwoZnVuY3Rpb24odCxlKXt2YXIgbj1yLmdldEl0ZW1MYXlvdXQoZSksaT1Lcih0LGwscCk7cmV0dXJuIGlzTmFOKGkpJiYoaT0ocFswXStwWzFdKS8yKSx7dzppLHJlcDppLGZpeGVkOnIuZ2V0SXRlbU1vZGVsKGUpLmdldCgiZml4ZWQiKSxwOiFufHxpc05hTihuWzBdKXx8aXNOYU4oblsxXSk/bnVsbDpufX0pKSxnPW8ubWFwQXJyYXkoInZhbHVlIiwoZnVuY3Rpb24oZSxuKXt2YXIgcj1pLmdldEVkZ2VCeUluZGV4KG4pLG89S3IoZSx1LGQpO2lzTmFOKG8pJiYobz0oZFswXStkWzFdKS8yKTt2YXIgYT1yLmdldE1vZGVsKCkscz1vdChyLmdldE1vZGVsKCkuZ2V0KFsibGluZVN0eWxlIiwiY3VydmVuZXNzIl0pLC1tQShyLHQsbiwhMCksMCk7cmV0dXJue24xOmZbci5ub2RlMS5kYXRhSW5kZXhdLG4yOmZbci5ub2RlMi5kYXRhSW5kZXhdLGQ6byxjdXJ2ZW5lc3M6cyxpZ25vcmVGb3JjZUxheW91dDphLmdldCgiaWdub3JlRm9yY2VMYXlvdXQiKX19KSkseT1lLmdldEJvdW5kaW5nUmVjdCgpLHY9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10LHI9ZSxvPW4ucmVjdCxhPW8ud2lkdGgscz1vLmhlaWdodCxsPVtvLngrYS8yLG8ueStzLzJdLHU9bnVsbD09bi5ncmF2aXR5Py4xOm4uZ3Jhdml0eSxoPTA7aDxpLmxlbmd0aDtoKyspe3ZhciBjPWlbaF07Yy5wfHwoYy5wPU10KGEqKE1hdGgucmFuZG9tKCktLjUpK2xbMF0scyooTWF0aC5yYW5kb20oKS0uNSkrbFsxXSkpLGMucHA9VHQoYy5wKSxjLmVkZ2VzPW51bGx9dmFyIHAsZCxmPW51bGw9PW4uZnJpY3Rpb24/LjY6bi5mcmljdGlvbixnPWY7cmV0dXJue3dhcm1VcDpmdW5jdGlvbigpe2c9LjgqZn0sc2V0Rml4ZWQ6ZnVuY3Rpb24odCl7aVt0XS5maXhlZD0hMH0sc2V0VW5maXhlZDpmdW5jdGlvbih0KXtpW3RdLmZpeGVkPSExfSxiZWZvcmVTdGVwOmZ1bmN0aW9uKHQpe3A9dH0sYWZ0ZXJTdGVwOmZ1bmN0aW9uKHQpe2Q9dH0sc3RlcDpmdW5jdGlvbih0KXtwJiZwKGkscik7Zm9yKHZhciBlPVtdLG49aS5sZW5ndGgsbz0wO288ci5sZW5ndGg7bysrKXt2YXIgYT1yW29dO2lmKCFhLmlnbm9yZUZvcmNlTGF5b3V0KXt2YXIgcz1hLm4xO2t0KGUsKHk9YS5uMikucCxzLnApO3ZhciBoPUx0KGUpLWEuZCxjPXkudy8ocy53K3kudyk7aXNOYU4oYykmJihjPTApLEV0KGUsZSksIXMuZml4ZWQmJmtBKHMucCxzLnAsZSxjKmgqZyksIXkuZml4ZWQmJmtBKHkucCx5LnAsZSwtKDEtYykqaCpnKX19Zm9yKG89MDtvPG47bysrKSh4PWlbb10pLmZpeGVkfHwoa3QoZSxsLHgucCksa0EoeC5wLHgucCxlLHUqZykpO2ZvcihvPTA7bzxuO28rKyl7cz1pW29dO2Zvcih2YXIgZj1vKzE7ZjxuO2YrKyl7dmFyIHk7a3QoZSwoeT1pW2ZdKS5wLHMucCksMD09PShoPUx0KGUpKSYmKEN0KGUsTWF0aC5yYW5kb20oKS0uNSxNYXRoLnJhbmRvbSgpLS41KSxoPTEpO3ZhciB2PShzLnJlcCt5LnJlcCkvaC9oOyFzLmZpeGVkJiZrQShzLnBwLHMucHAsZSx2KSwheS5maXhlZCYma0EoeS5wcCx5LnBwLGUsLXYpfX12YXIgbT1bXTtmb3Iobz0wO288bjtvKyspe3ZhciB4Oyh4PWlbb10pLmZpeGVkfHwoa3QobSx4LnAseC5wcCksa0EoeC5wLHgucCxtLGcpLEl0KHgucHAseC5wKSl9dmFyIF89KGcqPS45OTIpPC4wMTtkJiZkKGkscixfKSx0JiZ0KF8pfX19KGYsZyx7cmVjdDp5LGdyYXZpdHk6YS5nZXQoImdyYXZpdHkiKSxmcmljdGlvbjphLmdldCgiZnJpY3Rpb24iKX0pO3YuYmVmb3JlU3RlcCgoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspdFtuXS5maXhlZCYmSXQodFtuXS5wLGkuZ2V0Tm9kZUJ5SW5kZXgobikuZ2V0TGF5b3V0KCkpfSkpLHYuYWZ0ZXJTdGVwKChmdW5jdGlvbih0LGUsbyl7Zm9yKHZhciBhPTAscz10Lmxlbmd0aDthPHM7YSsrKXRbYV0uZml4ZWR8fGkuZ2V0Tm9kZUJ5SW5kZXgoYSkuc2V0TGF5b3V0KHRbYV0ucCksbltyLmdldElkKGEpXT10W2FdLnA7Zm9yKGE9MCxzPWUubGVuZ3RoO2E8czthKyspe3ZhciBsPWVbYV0sdT1pLmdldEVkZ2VCeUluZGV4KGEpLGg9bC5uMS5wLGM9bC5uMi5wLHA9dS5nZXRMYXlvdXQoKTsocD1wP3Auc2xpY2UoKTpbXSlbMF09cFswXXx8W10scFsxXT1wWzFdfHxbXSxJdChwWzBdLGgpLEl0KHBbMV0sYyksK2wuY3VydmVuZXNzJiYocFsyXT1bKGhbMF0rY1swXSkvMi0oaFsxXS1jWzFdKSpsLmN1cnZlbmVzcywoaFsxXStjWzFdKS8yLShjWzBdLWhbMF0pKmwuY3VydmVuZXNzXSksdS5zZXRMYXlvdXQocCl9fSkpLHQuZm9yY2VMYXlvdXQ9dix0LnByZXNlcnZlZFBvaW50cz1uLHYuc3RlcCgpfWVsc2UgdC5mb3JjZUxheW91dD1udWxsfSkpfWZ1bmN0aW9uIFBBKHQsZSl7dmFyIG49W107cmV0dXJuIHQuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLChmdW5jdGlvbih0KXt2YXIgaT10LmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpO2lmKCFpfHwidmlldyI9PT1pKXt2YXIgcj10LmdldERhdGEoKSxvPVtdLGE9W107QmEoci5tYXBBcnJheSgoZnVuY3Rpb24odCl7dmFyIGU9ci5nZXRJdGVtTW9kZWwodCk7cmV0dXJuWytlLmdldCgieCIpLCtlLmdldCgieSIpXX0pKSxvLGEpLGFbMF0tb1swXT09MCYmKGFbMF0rPTEsb1swXS09MSksYVsxXS1vWzFdPT0wJiYoYVsxXSs9MSxvWzFdLT0xKTt2YXIgcz0oYVswXS1vWzBdKS8oYVsxXS1vWzFdKSxsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4ga3AoQSh0LmdldEJveExheW91dFBhcmFtcygpLHthc3BlY3Q6bn0pLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KX0odCxlLHMpO2lzTmFOKHMpJiYobz1bbC54LGwueV0sYT1bbC54K2wud2lkdGgsbC55K2wuaGVpZ2h0XSk7dmFyIHU9YVswXS1vWzBdLGg9YVsxXS1vWzFdLGM9bC53aWR0aCxwPWwuaGVpZ2h0LGQ9dC5jb29yZGluYXRlU3lzdGVtPW5ldyBkQztkLnpvb21MaW1pdD10LmdldCgic2NhbGVMaW1pdCIpLGQuc2V0Qm91bmRpbmdSZWN0KG9bMF0sb1sxXSx1LGgpLGQuc2V0Vmlld1JlY3QobC54LGwueSxjLHApLGQuc2V0Q2VudGVyKHQuZ2V0KCJjZW50ZXIiKSxlKSxkLnNldFpvb20odC5nZXQoInpvb20iKSksbi5wdXNoKGQpfX0pKSxufXZhciBPQT1LdS5wcm90b3R5cGUsUkE9dGgucHJvdG90eXBlLE5BPWZ1bmN0aW9uKCl7dGhpcy54MT0wLHRoaXMueTE9MCx0aGlzLngyPTAsdGhpcy55Mj0wLHRoaXMucGVyY2VudD0xfTshZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9bihlLHQpfShOQSk7ZnVuY3Rpb24gRUEodCl7cmV0dXJuIGlzTmFOKCt0LmNweDEpfHxpc05hTigrdC5jcHkxKX12YXIgekE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi50eXBlPSJlYy1saW5lIixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJue3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfX0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOQX0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7RUEoZSk/T0EuYnVpbGRQYXRoLmNhbGwodGhpcyx0LGUpOlJBLmJ1aWxkUGF0aC5jYWxsKHRoaXMsdCxlKX0sZS5wcm90b3R5cGUucG9pbnRBdD1mdW5jdGlvbih0KXtyZXR1cm4gRUEodGhpcy5zaGFwZSk/T0EucG9pbnRBdC5jYWxsKHRoaXMsdCk6UkEucG9pbnRBdC5jYWxsKHRoaXMsdCl9LGUucHJvdG90eXBlLnRhbmdlbnRBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnNoYXBlLG49RUEoZSk/W2UueDItZS54MSxlLnkyLWUueTFdOlJBLnRhbmdlbnRBdC5jYWxsKHRoaXMsdCk7cmV0dXJuIEV0KG4sbil9LGV9KGtzKSxWQT1bImZyb21TeW1ib2wiLCJ0b1N5bWJvbCJdO2Z1bmN0aW9uIEJBKHQpe3JldHVybiJfIit0KyJUeXBlIn1mdW5jdGlvbiBGQSh0LGUsbil7dmFyIGk9ZS5nZXRJdGVtVmlzdWFsKG4sdCk7aWYoIWl8fCJub25lIj09PWkpcmV0dXJuIGk7dmFyIHI9ZS5nZXRJdGVtVmlzdWFsKG4sdCsiU2l6ZSIpLG89ZS5nZXRJdGVtVmlzdWFsKG4sdCsiUm90YXRlIiksYT1lLmdldEl0ZW1WaXN1YWwobix0KyJPZmZzZXQiKSxzPWUuZ2V0SXRlbVZpc3VhbChuLHQrIktlZXBBc3BlY3QiKSxsPVV5KHIpO3JldHVybiBpK2wrWnkoYXx8MCxsKSsob3x8IiIpKyhzfHwiIil9ZnVuY3Rpb24gR0EodCxlLG4pe3ZhciBpPWUuZ2V0SXRlbVZpc3VhbChuLHQpO2lmKGkmJiJub25lIiE9PWkpe3ZhciByPWUuZ2V0SXRlbVZpc3VhbChuLHQrIlNpemUiKSxvPWUuZ2V0SXRlbVZpc3VhbChuLHQrIlJvdGF0ZSIpLGE9ZS5nZXRJdGVtVmlzdWFsKG4sdCsiT2Zmc2V0Iikscz1lLmdldEl0ZW1WaXN1YWwobix0KyJLZWVwQXNwZWN0IiksbD1VeShyKSx1PVp5KGF8fDAsbCksaD1YeShpLC1sWzBdLzIrdVswXSwtbFsxXS8yK3VbMV0sbFswXSxsWzFdLG51bGwscyk7cmV0dXJuIGguX19zcGVjaWZpZWRSb3RhdGlvbj1udWxsPT1vfHxpc05hTihvKT92b2lkIDA6K28qTWF0aC5QSS8xODB8fDAsaC5uYW1lPXQsaH19ZnVuY3Rpb24gV0EodCxlKXt0LngxPWVbMF1bMF0sdC55MT1lWzBdWzFdLHQueDI9ZVsxXVswXSx0LnkyPWVbMV1bMV0sdC5wZXJjZW50PTE7dmFyIG49ZVsyXTtuPyh0LmNweDE9blswXSx0LmNweTE9blsxXSk6KHQuY3B4MT1OYU4sdC5jcHkxPU5hTil9dmFyIEhBPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLGkpe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5fY3JlYXRlTGluZShlLG4saSkscn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLl9jcmVhdGVMaW5lPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10Lmhvc3RNb2RlbCxyPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB6QSh7bmFtZToibGluZSIsc3ViUGl4ZWxPcHRpbWl6ZTohMH0pO3JldHVybiBXQShlLnNoYXBlLHQpLGV9KHQuZ2V0SXRlbUxheW91dChlKSk7ci5zaGFwZS5wZXJjZW50PTAsbWgocix7c2hhcGU6e3BlcmNlbnQ6MX19LGksZSksdGhpcy5hZGQociksRShWQSwoZnVuY3Rpb24obil7dmFyIGk9R0Eobix0LGUpO3RoaXMuYWRkKGkpLHRoaXNbQkEobildPUZBKG4sdCxlKX0pLHRoaXMpLHRoaXMuX3VwZGF0ZUNvbW1vblN0bCh0LGUsbil9LGUucHJvdG90eXBlLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuaG9zdE1vZGVsLHI9dGhpcy5jaGlsZE9mTmFtZSgibGluZSIpLG89dC5nZXRJdGVtTGF5b3V0KGUpLGE9e3NoYXBlOnt9fTtXQShhLnNoYXBlLG8pLHZoKHIsYSxpLGUpLEUoVkEsKGZ1bmN0aW9uKG4pe3ZhciBpPUZBKG4sdCxlKSxyPUJBKG4pO2lmKHRoaXNbcl0hPT1pKXt0aGlzLnJlbW92ZSh0aGlzLmNoaWxkT2ZOYW1lKG4pKTt2YXIgbz1HQShuLHQsZSk7dGhpcy5hZGQobyl9dGhpc1tyXT1pfSksdGhpcyksdGhpcy5fdXBkYXRlQ29tbW9uU3RsKHQsZSxuKX0sZS5wcm90b3R5cGUuZ2V0TGluZVBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZEF0KDApfSxlLnByb3RvdHlwZS5fdXBkYXRlQ29tbW9uU3RsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10Lmhvc3RNb2RlbCxyPXRoaXMuY2hpbGRPZk5hbWUoImxpbmUiKSxvPW4mJm4uZW1waGFzaXNMaW5lU3R5bGUsYT1uJiZuLmJsdXJMaW5lU3R5bGUscz1uJiZuLnNlbGVjdExpbmVTdHlsZSxsPW4mJm4ubGFiZWxTdGF0ZXNNb2RlbHMsdT1uJiZuLmVtcGhhc2lzRGlzYWJsZWQsaD1uJiZuLmZvY3VzLGM9biYmbi5ibHVyU2NvcGU7aWYoIW58fHQuaGFzSXRlbU9wdGlvbil7dmFyIHA9dC5nZXRJdGVtTW9kZWwoZSksZD1wLmdldE1vZGVsKCJlbXBoYXNpcyIpO289ZC5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksYT1wLmdldE1vZGVsKFsiYmx1ciIsImxpbmVTdHlsZSJdKS5nZXRMaW5lU3R5bGUoKSxzPXAuZ2V0TW9kZWwoWyJzZWxlY3QiLCJsaW5lU3R5bGUiXSkuZ2V0TGluZVN0eWxlKCksdT1kLmdldCgiZGlzYWJsZWQiKSxoPWQuZ2V0KCJmb2N1cyIpLGM9ZC5nZXQoImJsdXJTY29wZSIpLGw9cmMocCl9dmFyIGY9dC5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIiksZz1mLnN0cm9rZTtyLnVzZVN0eWxlKGYpLHIuc3R5bGUuZmlsbD1udWxsLHIuc3R5bGUuc3Ryb2tlTm9TY2FsZT0hMCxyLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPW8sci5lbnN1cmVTdGF0ZSgiYmx1ciIpLnN0eWxlPWEsci5lbnN1cmVTdGF0ZSgic2VsZWN0Iikuc3R5bGU9cyxFKFZBLChmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNoaWxkT2ZOYW1lKHQpO2lmKGUpe2Uuc2V0Q29sb3IoZyksZS5zdHlsZS5vcGFjaXR5PWYub3BhY2l0eTtmb3IodmFyIG49MDtuPGhsLmxlbmd0aDtuKyspe3ZhciBpPWhsW25dLG89ci5nZXRTdGF0ZShpKTtpZihvKXt2YXIgYT1vLnN0eWxlfHx7fSxzPWUuZW5zdXJlU3RhdGUoaSksbD1zLnN0eWxlfHwocy5zdHlsZT17fSk7bnVsbCE9YS5zdHJva2UmJihsW2UuX19pc0VtcHR5QnJ1c2g/InN0cm9rZSI6ImZpbGwiXT1hLnN0cm9rZSksbnVsbCE9YS5vcGFjaXR5JiYobC5vcGFjaXR5PWEub3BhY2l0eSl9fWUubWFya1JlZHJhdygpfX0pLHRoaXMpO3ZhciB5PWkuZ2V0UmF3VmFsdWUoZSk7aWModGhpcyxsLHtsYWJlbERhdGFJbmRleDplLGxhYmVsRmV0Y2hlcjp7Z2V0Rm9ybWF0dGVkTGFiZWw6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gaS5nZXRGb3JtYXR0ZWRMYWJlbChlLG4sdC5kYXRhVHlwZSl9fSxpbmhlcml0Q29sb3I6Z3x8IiMwMDAiLGRlZmF1bHRPcGFjaXR5OmYub3BhY2l0eSxkZWZhdWx0VGV4dDoobnVsbD09eT90LmdldE5hbWUoZSk6aXNGaW5pdGUoeSk/SnIoeSk6eSkrIiJ9KTt2YXIgdj10aGlzLmdldFRleHRDb250ZW50KCk7aWYodil7dmFyIG09bC5ub3JtYWw7di5fX2FsaWduPXYuc3R5bGUuYWxpZ24sdi5fX3ZlcnRpY2FsQWxpZ249di5zdHlsZS52ZXJ0aWNhbEFsaWduLHYuX19wb3NpdGlvbj1tLmdldCgicG9zaXRpb24iKXx8Im1pZGRsZSI7dmFyIHg9bS5nZXQoImRpc3RhbmNlIik7WSh4KXx8KHg9W3gseF0pLHYuX19sYWJlbERpc3RhbmNlPXh9dGhpcy5zZXRUZXh0Q29uZmlnKHtwb3NpdGlvbjpudWxsLGxvY2FsOiEwLGluc2lkZTohMX0pLFpsKHRoaXMsaCxjLHUpfSxlLnByb3RvdHlwZS5oaWdobGlnaHQ9ZnVuY3Rpb24oKXtPbCh0aGlzKX0sZS5wcm90b3R5cGUuZG93bnBsYXk9ZnVuY3Rpb24oKXtSbCh0aGlzKX0sZS5wcm90b3R5cGUudXBkYXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRMaW5lUG9pbnRzKHQuZ2V0SXRlbUxheW91dChlKSl9LGUucHJvdG90eXBlLnNldExpbmVQb2ludHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jaGlsZE9mTmFtZSgibGluZSIpO1dBKGUuc2hhcGUsdCksZS5kaXJ0eSgpfSxlLnByb3RvdHlwZS5iZWZvcmVVcGRhdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jaGlsZE9mTmFtZSgiZnJvbVN5bWJvbCIpLG49dC5jaGlsZE9mTmFtZSgidG9TeW1ib2wiKSxpPXQuZ2V0VGV4dENvbnRlbnQoKTtpZihlfHxufHxpJiYhaS5pZ25vcmUpe2Zvcih2YXIgcj0xLG89dGhpcy5wYXJlbnQ7bzspby5zY2FsZVgmJihyLz1vLnNjYWxlWCksbz1vLnBhcmVudDt2YXIgYT10LmNoaWxkT2ZOYW1lKCJsaW5lIik7aWYodGhpcy5fX2RpcnR5fHxhLl9fZGlydHkpe3ZhciBzPWEuc2hhcGUucGVyY2VudCxsPWEucG9pbnRBdCgwKSx1PWEucG9pbnRBdChzKSxoPWt0KFtdLHUsbCk7aWYoRXQoaCxoKSxlJiYoZS5zZXRQb3NpdGlvbihsKSxTKGUsMCksZS5zY2FsZVg9ZS5zY2FsZVk9cipzLGUubWFya1JlZHJhdygpKSxuJiYobi5zZXRQb3NpdGlvbih1KSxTKG4sMSksbi5zY2FsZVg9bi5zY2FsZVk9cipzLG4ubWFya1JlZHJhdygpKSxpJiYhaS5pZ25vcmUpe2kueD1pLnk9MCxpLm9yaWdpblg9aS5vcmlnaW5ZPTA7dmFyIGM9dm9pZCAwLHA9dm9pZCAwLGQ9aS5fX2xhYmVsRGlzdGFuY2UsZj1kWzBdKnIsZz1kWzFdKnIseT1zLzIsdj1hLnRhbmdlbnRBdCh5KSxtPVt2WzFdLC12WzBdXSx4PWEucG9pbnRBdCh5KTttWzFdPjAmJihtWzBdPS1tWzBdLG1bMV09LW1bMV0pO3ZhciBfPXZbMF08MD8tMToxO2lmKCJzdGFydCIhPT1pLl9fcG9zaXRpb24mJiJlbmQiIT09aS5fX3Bvc2l0aW9uKXt2YXIgYj0tTWF0aC5hdGFuMih2WzFdLHZbMF0pO3VbMF08bFswXSYmKGI9TWF0aC5QSStiKSxpLnJvdGF0aW9uPWJ9dmFyIHc9dm9pZCAwO3N3aXRjaChpLl9fcG9zaXRpb24pe2Nhc2UiaW5zaWRlU3RhcnRUb3AiOmNhc2UiaW5zaWRlTWlkZGxlVG9wIjpjYXNlImluc2lkZUVuZFRvcCI6Y2FzZSJtaWRkbGUiOnc9LWcscD0iYm90dG9tIjticmVhaztjYXNlImluc2lkZVN0YXJ0Qm90dG9tIjpjYXNlImluc2lkZU1pZGRsZUJvdHRvbSI6Y2FzZSJpbnNpZGVFbmRCb3R0b20iOnc9ZyxwPSJ0b3AiO2JyZWFrO2RlZmF1bHQ6dz0wLHA9Im1pZGRsZSJ9c3dpdGNoKGkuX19wb3NpdGlvbil7Y2FzZSJlbmQiOmkueD1oWzBdKmYrdVswXSxpLnk9aFsxXSpnK3VbMV0sYz1oWzBdPi44PyJsZWZ0IjpoWzBdPC0uOD8icmlnaHQiOiJjZW50ZXIiLHA9aFsxXT4uOD8idG9wIjpoWzFdPC0uOD8iYm90dG9tIjoibWlkZGxlIjticmVhaztjYXNlInN0YXJ0IjppLng9LWhbMF0qZitsWzBdLGkueT0taFsxXSpnK2xbMV0sYz1oWzBdPi44PyJyaWdodCI6aFswXTwtLjg/ImxlZnQiOiJjZW50ZXIiLHA9aFsxXT4uOD8iYm90dG9tIjpoWzFdPC0uOD8idG9wIjoibWlkZGxlIjticmVhaztjYXNlImluc2lkZVN0YXJ0VG9wIjpjYXNlImluc2lkZVN0YXJ0IjpjYXNlImluc2lkZVN0YXJ0Qm90dG9tIjppLng9ZipfK2xbMF0saS55PWxbMV0rdyxjPXZbMF08MD8icmlnaHQiOiJsZWZ0IixpLm9yaWdpblg9LWYqXyxpLm9yaWdpblk9LXc7YnJlYWs7Y2FzZSJpbnNpZGVNaWRkbGVUb3AiOmNhc2UiaW5zaWRlTWlkZGxlIjpjYXNlImluc2lkZU1pZGRsZUJvdHRvbSI6Y2FzZSJtaWRkbGUiOmkueD14WzBdLGkueT14WzFdK3csYz0iY2VudGVyIixpLm9yaWdpblk9LXc7YnJlYWs7Y2FzZSJpbnNpZGVFbmRUb3AiOmNhc2UiaW5zaWRlRW5kIjpjYXNlImluc2lkZUVuZEJvdHRvbSI6aS54PS1mKl8rdVswXSxpLnk9dVsxXSt3LGM9dlswXT49MD8icmlnaHQiOiJsZWZ0IixpLm9yaWdpblg9ZipfLGkub3JpZ2luWT0td31pLnNjYWxlWD1pLnNjYWxlWT1yLGkuc2V0U3R5bGUoe3ZlcnRpY2FsQWxpZ246aS5fX3ZlcnRpY2FsQWxpZ258fHAsYWxpZ246aS5fX2FsaWdufHxjfSl9fX1mdW5jdGlvbiBTKHQsZSl7dmFyIG49dC5fX3NwZWNpZmllZFJvdGF0aW9uO2lmKG51bGw9PW4pe3ZhciBpPWEudGFuZ2VudEF0KGUpO3QuYXR0cigicm90YXRpb24iLCgxPT09ZT8tMToxKSpNYXRoLlBJLzItTWF0aC5hdGFuMihpWzFdLGlbMF0pKX1lbHNlIHQuYXR0cigicm90YXRpb24iLG4pfX0sZX0oQnIpLFlBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmdyb3VwPW5ldyBCcix0aGlzLl9MaW5lQ3Rvcj10fHxIQX1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3Byb2dyZXNzaXZlRWxzPW51bGw7dmFyIG49dGhpcyxpPW4uZ3JvdXAscj1uLl9saW5lRGF0YTtuLl9saW5lRGF0YT10LHJ8fGkucmVtb3ZlQWxsKCk7dmFyIG89WEEodCk7dC5kaWZmKHIpLmFkZCgoZnVuY3Rpb24obil7ZS5fZG9BZGQodCxuLG8pfSkpLnVwZGF0ZSgoZnVuY3Rpb24obixpKXtlLl9kb1VwZGF0ZShyLHQsaSxuLG8pfSkpLnJlbW92ZSgoZnVuY3Rpb24odCl7aS5yZW1vdmUoci5nZXRJdGVtR3JhcGhpY0VsKHQpKX0pKS5leGVjdXRlKCl9LHQucHJvdG90eXBlLnVwZGF0ZUxheW91dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2xpbmVEYXRhO3QmJnQuZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKGUsbil7ZS51cGRhdGVMYXlvdXQodCxuKX0pLHRoaXMpfSx0LnByb3RvdHlwZS5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fc2VyaWVzU2NvcGU9WEEodCksdGhpcy5fbGluZURhdGE9bnVsbCx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSx0LnByb3RvdHlwZS5pbmNyZW1lbnRhbFVwZGF0ZT1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCl7dC5pc0dyb3VwfHxmdW5jdGlvbih0KXtyZXR1cm4gdC5hbmltYXRvcnMmJnQuYW5pbWF0b3JzLmxlbmd0aD4wfSh0KXx8KHQuaW5jcmVtZW50YWw9ITAsdC5lbnN1cmVTdGF0ZSgiZW1waGFzaXMiKS5ob3ZlckxheWVyPSEwKX10aGlzLl9wcm9ncmVzc2l2ZUVscz1bXTtmb3IodmFyIGk9dC5zdGFydDtpPHQuZW5kO2krKyl7aWYoWkEoZS5nZXRJdGVtTGF5b3V0KGkpKSl7dmFyIHI9bmV3IHRoaXMuX0xpbmVDdG9yKGUsaSx0aGlzLl9zZXJpZXNTY29wZSk7ci50cmF2ZXJzZShuKSx0aGlzLmdyb3VwLmFkZChyKSxlLnNldEl0ZW1HcmFwaGljRWwoaSxyKSx0aGlzLl9wcm9ncmVzc2l2ZUVscy5wdXNoKHIpfX19LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LHQucHJvdG90eXBlLmVhY2hSZW5kZXJlZD1mdW5jdGlvbih0KXtKaCh0aGlzLl9wcm9ncmVzc2l2ZUVsc3x8dGhpcy5ncm91cCx0KX0sdC5wcm90b3R5cGUuX2RvQWRkPWZ1bmN0aW9uKHQsZSxuKXtpZihaQSh0LmdldEl0ZW1MYXlvdXQoZSkpKXt2YXIgaT1uZXcgdGhpcy5fTGluZUN0b3IodCxlLG4pO3Quc2V0SXRlbUdyYXBoaWNFbChlLGkpLHRoaXMuZ3JvdXAuYWRkKGkpfX0sdC5wcm90b3R5cGUuX2RvVXBkYXRlPWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89dC5nZXRJdGVtR3JhcGhpY0VsKG4pO1pBKGUuZ2V0SXRlbUxheW91dChpKSk/KG8/by51cGRhdGVEYXRhKGUsaSxyKTpvPW5ldyB0aGlzLl9MaW5lQ3RvcihlLGksciksZS5zZXRJdGVtR3JhcGhpY0VsKGksbyksdGhpcy5ncm91cC5hZGQobykpOnRoaXMuZ3JvdXAucmVtb3ZlKG8pfSx0fSgpO2Z1bmN0aW9uIFhBKHQpe3ZhciBlPXQuaG9zdE1vZGVsLG49ZS5nZXRNb2RlbCgiZW1waGFzaXMiKTtyZXR1cm57bGluZVN0eWxlOmUuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLGVtcGhhc2lzTGluZVN0eWxlOm4uZ2V0TW9kZWwoWyJsaW5lU3R5bGUiXSkuZ2V0TGluZVN0eWxlKCksYmx1ckxpbmVTdHlsZTplLmdldE1vZGVsKFsiYmx1ciIsImxpbmVTdHlsZSJdKS5nZXRMaW5lU3R5bGUoKSxzZWxlY3RMaW5lU3R5bGU6ZS5nZXRNb2RlbChbInNlbGVjdCIsImxpbmVTdHlsZSJdKS5nZXRMaW5lU3R5bGUoKSxlbXBoYXNpc0Rpc2FibGVkOm4uZ2V0KCJkaXNhYmxlZCIpLGJsdXJTY29wZTpuLmdldCgiYmx1clNjb3BlIiksZm9jdXM6bi5nZXQoImZvY3VzIiksbGFiZWxTdGF0ZXNNb2RlbHM6cmMoZSl9fWZ1bmN0aW9uIFVBKHQpe3JldHVybiBpc05hTih0WzBdKXx8aXNOYU4odFsxXSl9ZnVuY3Rpb24gWkEodCl7cmV0dXJuIHQmJiFVQSh0WzBdKSYmIVVBKHRbMV0pfXZhciBqQT1bXSxxQT1bXSxLQT1bXSwkQT1JbixKQT1GdCxRQT1NYXRoLmFicztmdW5jdGlvbiB0ayh0LGUsbil7Zm9yKHZhciBpLHI9dFswXSxvPXRbMV0sYT10WzJdLHM9MS8wLGw9bipuLHU9LjEsaD0uMTtoPD0uOTtoKz0uMSl7akFbMF09JEEoclswXSxvWzBdLGFbMF0saCksakFbMV09JEEoclsxXSxvWzFdLGFbMV0saCksKGQ9UUEoSkEoakEsZSktbCkpPHMmJihzPWQsaT1oKX1mb3IodmFyIGM9MDtjPDMyO2MrKyl7dmFyIHA9aSt1O3FBWzBdPSRBKHJbMF0sb1swXSxhWzBdLGkpLHFBWzFdPSRBKHJbMV0sb1sxXSxhWzFdLGkpLEtBWzBdPSRBKHJbMF0sb1swXSxhWzBdLHApLEtBWzFdPSRBKHJbMV0sb1sxXSxhWzFdLHApO3ZhciBkPUpBKHFBLGUpLWw7aWYoUUEoZCk8LjAxKWJyZWFrO3ZhciBmPUpBKEtBLGUpLWw7dS89MixkPDA/Zj49MD9pKz11OmktPXU6Zj49MD9pLT11OmkrPXV9cmV0dXJuIGl9ZnVuY3Rpb24gZWsodCxlKXt2YXIgbj1bXSxpPURuLHI9W1tdLFtdLFtdXSxvPVtbXSxbXV0sYT1bXTtlLz0yLHQuZWFjaEVkZ2UoKGZ1bmN0aW9uKHQscyl7dmFyIGw9dC5nZXRMYXlvdXQoKSx1PXQuZ2V0VmlzdWFsKCJmcm9tU3ltYm9sIiksaD10LmdldFZpc3VhbCgidG9TeW1ib2wiKTtsLl9fb3JpZ2luYWx8fChsLl9fb3JpZ2luYWw9W1R0KGxbMF0pLFR0KGxbMV0pXSxsWzJdJiZsLl9fb3JpZ2luYWwucHVzaChUdChsWzJdKSkpO3ZhciBjPWwuX19vcmlnaW5hbDtpZihudWxsIT1sWzJdKXtpZihJdChyWzBdLGNbMF0pLEl0KHJbMV0sY1syXSksSXQoclsyXSxjWzFdKSx1JiYibm9uZSIhPT11KXt2YXIgcD1TQSh0Lm5vZGUxKSxkPXRrKHIsY1swXSxwKmUpO2koclswXVswXSxyWzFdWzBdLHJbMl1bMF0sZCxuKSxyWzBdWzBdPW5bM10sclsxXVswXT1uWzRdLGkoclswXVsxXSxyWzFdWzFdLHJbMl1bMV0sZCxuKSxyWzBdWzFdPW5bM10sclsxXVsxXT1uWzRdfWlmKGgmJiJub25lIiE9PWgpe3A9U0EodC5ub2RlMiksZD10ayhyLGNbMV0scCplKTtpKHJbMF1bMF0sclsxXVswXSxyWzJdWzBdLGQsbiksclsxXVswXT1uWzFdLHJbMl1bMF09blsyXSxpKHJbMF1bMV0sclsxXVsxXSxyWzJdWzFdLGQsbiksclsxXVsxXT1uWzFdLHJbMl1bMV09blsyXX1JdChsWzBdLHJbMF0pLEl0KGxbMV0sclsyXSksSXQobFsyXSxyWzFdKX1lbHNle2lmKEl0KG9bMF0sY1swXSksSXQob1sxXSxjWzFdKSxrdChhLG9bMV0sb1swXSksRXQoYSxhKSx1JiYibm9uZSIhPT11KXtwPVNBKHQubm9kZTEpO0F0KG9bMF0sb1swXSxhLHAqZSl9aWYoaCYmIm5vbmUiIT09aCl7cD1TQSh0Lm5vZGUyKTtBdChvWzFdLG9bMV0sYSwtcCplKX1JdChsWzBdLG9bMF0pLEl0KGxbMV0sb1sxXSl9fSkpfWZ1bmN0aW9uIG5rKHQpe3JldHVybiJ2aWV3Ij09PXQudHlwZX12YXIgaWs9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyB4UyxpPW5ldyBZQSxyPXRoaXMuZ3JvdXA7dGhpcy5fY29udHJvbGxlcj1uZXcgblQoZS5nZXRacigpKSx0aGlzLl9jb250cm9sbGVySG9zdD17dGFyZ2V0OnJ9LHIuYWRkKG4uZ3JvdXApLHIuYWRkKGkuZ3JvdXApLHRoaXMuX3N5bWJvbERyYXc9bix0aGlzLl9saW5lRHJhdz1pLHRoaXMuX2ZpcnN0UmVuZGVyPSEwfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMscj10LmNvb3JkaW5hdGVTeXN0ZW07dGhpcy5fbW9kZWw9dDt2YXIgbz10aGlzLl9zeW1ib2xEcmF3LGE9dGhpcy5fbGluZURyYXcscz10aGlzLmdyb3VwO2lmKG5rKHIpKXt2YXIgbD17eDpyLngseTpyLnksc2NhbGVYOnIuc2NhbGVYLHNjYWxlWTpyLnNjYWxlWX07dGhpcy5fZmlyc3RSZW5kZXI/cy5hdHRyKGwpOnZoKHMsbCx0KX1layh0LmdldEdyYXBoKCksd0EodCkpO3ZhciB1PXQuZ2V0RGF0YSgpO28udXBkYXRlRGF0YSh1KTt2YXIgaD10LmdldEVkZ2VEYXRhKCk7YS51cGRhdGVEYXRhKGgpLHRoaXMuX3VwZGF0ZU5vZGVBbmRMaW5rU2NhbGUoKSx0aGlzLl91cGRhdGVDb250cm9sbGVyKHQsZSxuKSxjbGVhclRpbWVvdXQodGhpcy5fbGF5b3V0VGltZW91dCk7dmFyIGM9dC5mb3JjZUxheW91dCxwPXQuZ2V0KFsiZm9yY2UiLCJsYXlvdXRBbmltYXRpb24iXSk7YyYmdGhpcy5fc3RhcnRGb3JjZUxheW91dEl0ZXJhdGlvbihjLHApO3ZhciBkPXQuZ2V0KCJsYXlvdXQiKTt1LmdyYXBoLmVhY2hOb2RlKChmdW5jdGlvbihlKXt2YXIgbj1lLmRhdGFJbmRleCxyPWUuZ2V0R3JhcGhpY0VsKCksbz1lLmdldE1vZGVsKCk7aWYocil7ci5vZmYoImRyYWciKS5vZmYoImRyYWdlbmQiKTt2YXIgYT1vLmdldCgiZHJhZ2dhYmxlIik7YSYmci5vbigiZHJhZyIsKGZ1bmN0aW9uKG8pe3N3aXRjaChkKXtjYXNlImZvcmNlIjpjLndhcm1VcCgpLCFpLl9sYXlvdXRpbmcmJmkuX3N0YXJ0Rm9yY2VMYXlvdXRJdGVyYXRpb24oYyxwKSxjLnNldEZpeGVkKG4pLHUuc2V0SXRlbUxheW91dChuLFtyLngsci55XSk7YnJlYWs7Y2FzZSJjaXJjdWxhciI6dS5zZXRJdGVtTGF5b3V0KG4sW3IueCxyLnldKSxlLnNldExheW91dCh7Zml4ZWQ6ITB9LCEwKSxUQSh0LCJzeW1ib2xTaXplIixlLFtvLm9mZnNldFgsby5vZmZzZXRZXSksaS51cGRhdGVMYXlvdXQodCk7YnJlYWs7ZGVmYXVsdDp1LnNldEl0ZW1MYXlvdXQobixbci54LHIueV0pLF9BKHQuZ2V0R3JhcGgoKSx0KSxpLnVwZGF0ZUxheW91dCh0KX19KSkub24oImRyYWdlbmQiLChmdW5jdGlvbigpe2MmJmMuc2V0VW5maXhlZChuKX0pKSxyLnNldERyYWdnYWJsZShhLCEhby5nZXQoImN1cnNvciIpKSwiYWRqYWNlbmN5Ij09PW8uZ2V0KFsiZW1waGFzaXMiLCJmb2N1cyJdKSYmKHJsKHIpLmZvY3VzPWUuZ2V0QWRqYWNlbnREYXRhSW5kaWNlcygpKX19KSksdS5ncmFwaC5lYWNoRWRnZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHcmFwaGljRWwoKSxuPXQuZ2V0TW9kZWwoKS5nZXQoWyJlbXBoYXNpcyIsImZvY3VzIl0pO2UmJiJhZGphY2VuY3kiPT09biYmKHJsKGUpLmZvY3VzPXtlZGdlOlt0LmRhdGFJbmRleF0sbm9kZTpbdC5ub2RlMS5kYXRhSW5kZXgsdC5ub2RlMi5kYXRhSW5kZXhdfSl9KSk7dmFyIGY9ImNpcmN1bGFyIj09PXQuZ2V0KCJsYXlvdXQiKSYmdC5nZXQoWyJjaXJjdWxhciIsInJvdGF0ZUxhYmVsIl0pLGc9dS5nZXRMYXlvdXQoImN4IikseT11LmdldExheW91dCgiY3kiKTt1LmdyYXBoLmVhY2hOb2RlKChmdW5jdGlvbih0KXtEQSh0LGYsZyx5KX0pKSx0aGlzLl9maXJzdFJlbmRlcj0hMX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMucmVtb3ZlKCksdGhpcy5fY29udHJvbGxlciYmdGhpcy5fY29udHJvbGxlci5kaXNwb3NlKCksdGhpcy5fY29udHJvbGxlckhvc3Q9bnVsbH0sZS5wcm90b3R5cGUuX3N0YXJ0Rm9yY2VMYXlvdXRJdGVyYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzOyFmdW5jdGlvbiBpKCl7dC5zdGVwKChmdW5jdGlvbih0KXtuLnVwZGF0ZUxheW91dChuLl9tb2RlbCksKG4uX2xheW91dGluZz0hdCkmJihlP24uX2xheW91dFRpbWVvdXQ9c2V0VGltZW91dChpLDE2KTppKCkpfSkpfSgpfSxlLnByb3RvdHlwZS5fdXBkYXRlQ29udHJvbGxlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcyxyPXRoaXMuX2NvbnRyb2xsZXIsbz10aGlzLl9jb250cm9sbGVySG9zdCxhPXRoaXMuZ3JvdXA7ci5zZXRQb2ludGVyQ2hlY2tlcigoZnVuY3Rpb24oZSxpLHIpe3ZhciBvPWEuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuIG8uYXBwbHlUcmFuc2Zvcm0oYS50cmFuc2Zvcm0pLG8uY29udGFpbihpLHIpJiYhaFQoZSxuLHQpfSkpLG5rKHQuY29vcmRpbmF0ZVN5c3RlbSk/KHIuZW5hYmxlKHQuZ2V0KCJyb2FtIikpLG8uem9vbUxpbWl0PXQuZ2V0KCJzY2FsZUxpbWl0Iiksby56b29tPXQuY29vcmRpbmF0ZVN5c3RlbS5nZXRab29tKCksci5vZmYoInBhbiIpLm9mZigiem9vbSIpLm9uKCJwYW4iLChmdW5jdGlvbihlKXthVChvLGUuZHgsZS5keSksbi5kaXNwYXRjaEFjdGlvbih7c2VyaWVzSWQ6dC5pZCx0eXBlOiJncmFwaFJvYW0iLGR4OmUuZHgsZHk6ZS5keX0pfSkpLm9uKCJ6b29tIiwoZnVuY3Rpb24oZSl7c1QobyxlLnNjYWxlLGUub3JpZ2luWCxlLm9yaWdpblkpLG4uZGlzcGF0Y2hBY3Rpb24oe3Nlcmllc0lkOnQuaWQsdHlwZToiZ3JhcGhSb2FtIix6b29tOmUuc2NhbGUsb3JpZ2luWDplLm9yaWdpblgsb3JpZ2luWTplLm9yaWdpbll9KSxpLl91cGRhdGVOb2RlQW5kTGlua1NjYWxlKCksZWsodC5nZXRHcmFwaCgpLHdBKHQpKSxpLl9saW5lRHJhdy51cGRhdGVMYXlvdXQoKSxuLnVwZGF0ZUxhYmVsTGF5b3V0KCl9KSkpOnIuZGlzYWJsZSgpfSxlLnByb3RvdHlwZS5fdXBkYXRlTm9kZUFuZExpbmtTY2FsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX21vZGVsLGU9dC5nZXREYXRhKCksbj13QSh0KTtlLmVhY2hJdGVtR3JhcGhpY0VsKChmdW5jdGlvbih0LGUpe3QmJnQuc2V0U3ltYm9sU2NhbGUobil9KSl9LGUucHJvdG90eXBlLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0KXtlayh0LmdldEdyYXBoKCksd0EodCkpLHRoaXMuX3N5bWJvbERyYXcudXBkYXRlTGF5b3V0KCksdGhpcy5fbGluZURyYXcudXBkYXRlTGF5b3V0KCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl9sYXlvdXRUaW1lb3V0KSx0aGlzLl9sYXlvdXRpbmc9ITEsdGhpcy5fbGF5b3V0VGltZW91dD1udWxsLHRoaXMuX3N5bWJvbERyYXcmJnRoaXMuX3N5bWJvbERyYXcucmVtb3ZlKCksdGhpcy5fbGluZURyYXcmJnRoaXMuX2xpbmVEcmF3LnJlbW92ZSgpfSxlLnR5cGU9ImdyYXBoIixlfShPZyk7ZnVuY3Rpb24gcmsodCl7cmV0dXJuIl9FQ18iK3R9dmFyIG9rPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLnR5cGU9ImdyYXBoIix0aGlzLm5vZGVzPVtdLHRoaXMuZWRnZXM9W10sdGhpcy5fbm9kZXNNYXA9e30sdGhpcy5fZWRnZXNNYXA9e30sdGhpcy5fZGlyZWN0ZWQ9dHx8ITF9cmV0dXJuIHQucHJvdG90eXBlLmlzRGlyZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlyZWN0ZWR9LHQucHJvdG90eXBlLmFkZE5vZGU9ZnVuY3Rpb24odCxlKXt0PW51bGw9PXQ/IiIrZToiIit0O3ZhciBuPXRoaXMuX25vZGVzTWFwO2lmKCFuW3JrKHQpXSl7dmFyIGk9bmV3IGFrKHQsZSk7cmV0dXJuIGkuaG9zdEdyYXBoPXRoaXMsdGhpcy5ub2Rlcy5wdXNoKGkpLG5bcmsodCldPWksaX19LHQucHJvdG90eXBlLmdldE5vZGVCeUluZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YS5nZXRSYXdJbmRleCh0KTtyZXR1cm4gdGhpcy5ub2Rlc1tlXX0sdC5wcm90b3R5cGUuZ2V0Tm9kZUJ5SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25vZGVzTWFwW3JrKHQpXX0sdC5wcm90b3R5cGUuYWRkRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fbm9kZXNNYXAscj10aGlzLl9lZGdlc01hcDtpZihqKHQpJiYodD10aGlzLm5vZGVzW3RdKSxqKGUpJiYoZT10aGlzLm5vZGVzW2VdKSx0IGluc3RhbmNlb2YgYWt8fCh0PWlbcmsodCldKSxlIGluc3RhbmNlb2YgYWt8fChlPWlbcmsoZSldKSx0JiZlKXt2YXIgbz10LmlkKyItIitlLmlkLGE9bmV3IHNrKHQsZSxuKTtyZXR1cm4gYS5ob3N0R3JhcGg9dGhpcyx0aGlzLl9kaXJlY3RlZCYmKHQub3V0RWRnZXMucHVzaChhKSxlLmluRWRnZXMucHVzaChhKSksdC5lZGdlcy5wdXNoKGEpLHQhPT1lJiZlLmVkZ2VzLnB1c2goYSksdGhpcy5lZGdlcy5wdXNoKGEpLHJbb109YSxhfX0sdC5wcm90b3R5cGUuZ2V0RWRnZUJ5SW5kZXg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lZGdlRGF0YS5nZXRSYXdJbmRleCh0KTtyZXR1cm4gdGhpcy5lZGdlc1tlXX0sdC5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbih0LGUpe3QgaW5zdGFuY2VvZiBhayYmKHQ9dC5pZCksZSBpbnN0YW5jZW9mIGFrJiYoZT1lLmlkKTt2YXIgbj10aGlzLl9lZGdlc01hcDtyZXR1cm4gdGhpcy5fZGlyZWN0ZWQ/blt0KyItIitlXTpuW3QrIi0iK2VdfHxuW2UrIi0iK3RdfSx0LnByb3RvdHlwZS5lYWNoTm9kZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLm5vZGVzLGk9bi5sZW5ndGgscj0wO3I8aTtyKyspbltyXS5kYXRhSW5kZXg+PTAmJnQuY2FsbChlLG5bcl0scil9LHQucHJvdG90eXBlLmVhY2hFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuZWRnZXMsaT1uLmxlbmd0aCxyPTA7cjxpO3IrKyluW3JdLmRhdGFJbmRleD49MCYmbltyXS5ub2RlMS5kYXRhSW5kZXg+PTAmJm5bcl0ubm9kZTIuZGF0YUluZGV4Pj0wJiZ0LmNhbGwoZSxuW3JdLHIpfSx0LnByb3RvdHlwZS5icmVhZHRoRmlyc3RUcmF2ZXJzZT1mdW5jdGlvbih0LGUsbixpKXtpZihlIGluc3RhbmNlb2YgYWt8fChlPXRoaXMuX25vZGVzTWFwW3JrKGUpXSksZSl7Zm9yKHZhciByPSJvdXQiPT09bj8ib3V0RWRnZXMiOiJpbiI9PT1uPyJpbkVkZ2VzIjoiZWRnZXMiLG89MDtvPHRoaXMubm9kZXMubGVuZ3RoO28rKyl0aGlzLm5vZGVzW29dLl9fdmlzaXRlZD0hMTtpZighdC5jYWxsKGksZSxudWxsKSlmb3IodmFyIGE9W2VdO2EubGVuZ3RoOyl7dmFyIHM9YS5zaGlmdCgpLGw9c1tyXTtmb3Iobz0wO288bC5sZW5ndGg7bysrKXt2YXIgdT1sW29dLGg9dS5ub2RlMT09PXM/dS5ub2RlMjp1Lm5vZGUxO2lmKCFoLl9fdmlzaXRlZCl7aWYodC5jYWxsKGksaCxzKSlyZXR1cm47YS5wdXNoKGgpLGguX192aXNpdGVkPSEwfX19fX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZGF0YSxlPXRoaXMuZWRnZURhdGEsbj10aGlzLm5vZGVzLGk9dGhpcy5lZGdlcyxyPTAsbz1uLmxlbmd0aDtyPG87cisrKW5bcl0uZGF0YUluZGV4PS0xO2ZvcihyPTAsbz10LmNvdW50KCk7cjxvO3IrKyluW3QuZ2V0UmF3SW5kZXgocildLmRhdGFJbmRleD1yO2UuZmlsdGVyU2VsZigoZnVuY3Rpb24odCl7dmFyIG49aVtlLmdldFJhd0luZGV4KHQpXTtyZXR1cm4gbi5ub2RlMS5kYXRhSW5kZXg+PTAmJm4ubm9kZTIuZGF0YUluZGV4Pj0wfSkpO2ZvcihyPTAsbz1pLmxlbmd0aDtyPG87cisrKWlbcl0uZGF0YUluZGV4PS0xO2ZvcihyPTAsbz1lLmNvdW50KCk7cjxvO3IrKylpW2UuZ2V0UmF3SW5kZXgocildLmRhdGFJbmRleD1yfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe2Zvcih2YXIgZT1uZXcgdCh0aGlzLl9kaXJlY3RlZCksbj10aGlzLm5vZGVzLGk9dGhpcy5lZGdlcyxyPTA7cjxuLmxlbmd0aDtyKyspZS5hZGROb2RlKG5bcl0uaWQsbltyXS5kYXRhSW5kZXgpO2ZvcihyPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBvPWlbcl07ZS5hZGRFZGdlKG8ubm9kZTEuaWQsby5ub2RlMi5pZCxvLmRhdGFJbmRleCl9cmV0dXJuIGV9LHR9KCksYWs9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5pbkVkZ2VzPVtdLHRoaXMub3V0RWRnZXM9W10sdGhpcy5lZGdlcz1bXSx0aGlzLmRhdGFJbmRleD0tMSx0aGlzLmlkPW51bGw9PXQ/IiI6dCx0aGlzLmRhdGFJbmRleD1udWxsPT1lPy0xOmV9cmV0dXJuIHQucHJvdG90eXBlLmRlZ3JlZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmxlbmd0aH0sdC5wcm90b3R5cGUuaW5EZWdyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbkVkZ2VzLmxlbmd0aH0sdC5wcm90b3R5cGUub3V0RGVncmVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0RWRnZXMubGVuZ3RofSx0LnByb3RvdHlwZS5nZXRNb2RlbD1mdW5jdGlvbih0KXtpZighKHRoaXMuZGF0YUluZGV4PDApKXJldHVybiB0aGlzLmhvc3RHcmFwaC5kYXRhLmdldEl0ZW1Nb2RlbCh0aGlzLmRhdGFJbmRleCkuZ2V0TW9kZWwodCl9LHQucHJvdG90eXBlLmdldEFkamFjZW50RGF0YUluZGljZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9e2VkZ2U6W10sbm9kZTpbXX0sZT0wO2U8dGhpcy5lZGdlcy5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLmVkZ2VzW2VdO24uZGF0YUluZGV4PDB8fCh0LmVkZ2UucHVzaChuLmRhdGFJbmRleCksdC5ub2RlLnB1c2gobi5ub2RlMS5kYXRhSW5kZXgsbi5ub2RlMi5kYXRhSW5kZXgpKX1yZXR1cm4gdH0sdC5wcm90b3R5cGUuZ2V0VHJhamVjdG9yeURhdGFJbmRpY2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXl0KCksZT15dCgpLG49MDtuPHRoaXMuZWRnZXMubGVuZ3RoO24rKyl7dmFyIGk9dGhpcy5lZGdlc1tuXTtpZighKGkuZGF0YUluZGV4PDApKXt0LnNldChpLmRhdGFJbmRleCwhMCk7Zm9yKHZhciByPVtpLm5vZGUxXSxvPVtpLm5vZGUyXSxhPTA7YTxyLmxlbmd0aDspe3ZhciBzPXJbYV07YSsrLGUuc2V0KHMuZGF0YUluZGV4LCEwKTtmb3IodmFyIGw9MDtsPHMuaW5FZGdlcy5sZW5ndGg7bCsrKXQuc2V0KHMuaW5FZGdlc1tsXS5kYXRhSW5kZXgsITApLHIucHVzaChzLmluRWRnZXNbbF0ubm9kZTEpfWZvcihhPTA7YTxvLmxlbmd0aDspe3ZhciB1PW9bYV07YSsrLGUuc2V0KHUuZGF0YUluZGV4LCEwKTtmb3IobD0wO2w8dS5vdXRFZGdlcy5sZW5ndGg7bCsrKXQuc2V0KHUub3V0RWRnZXNbbF0uZGF0YUluZGV4LCEwKSxvLnB1c2godS5vdXRFZGdlc1tsXS5ub2RlMil9fX1yZXR1cm57ZWRnZTp0LmtleXMoKSxub2RlOmUua2V5cygpfX0sdH0oKSxzaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuZGF0YUluZGV4PS0xLHRoaXMubm9kZTE9dCx0aGlzLm5vZGUyPWUsdGhpcy5kYXRhSW5kZXg9bnVsbD09bj8tMTpufXJldHVybiB0LnByb3RvdHlwZS5nZXRNb2RlbD1mdW5jdGlvbih0KXtpZighKHRoaXMuZGF0YUluZGV4PDApKXJldHVybiB0aGlzLmhvc3RHcmFwaC5lZGdlRGF0YS5nZXRJdGVtTW9kZWwodGhpcy5kYXRhSW5kZXgpLmdldE1vZGVsKHQpfSx0LnByb3RvdHlwZS5nZXRBZGphY2VudERhdGFJbmRpY2VzPWZ1bmN0aW9uKCl7cmV0dXJue2VkZ2U6W3RoaXMuZGF0YUluZGV4XSxub2RlOlt0aGlzLm5vZGUxLmRhdGFJbmRleCx0aGlzLm5vZGUyLmRhdGFJbmRleF19fSx0LnByb3RvdHlwZS5nZXRUcmFqZWN0b3J5RGF0YUluZGljZXM9ZnVuY3Rpb24oKXt2YXIgdD15dCgpLGU9eXQoKTt0LnNldCh0aGlzLmRhdGFJbmRleCwhMCk7Zm9yKHZhciBuPVt0aGlzLm5vZGUxXSxpPVt0aGlzLm5vZGUyXSxyPTA7cjxuLmxlbmd0aDspe3ZhciBvPW5bcl07cisrLGUuc2V0KG8uZGF0YUluZGV4LCEwKTtmb3IodmFyIGE9MDthPG8uaW5FZGdlcy5sZW5ndGg7YSsrKXQuc2V0KG8uaW5FZGdlc1thXS5kYXRhSW5kZXgsITApLG4ucHVzaChvLmluRWRnZXNbYV0ubm9kZTEpfWZvcihyPTA7cjxpLmxlbmd0aDspe3ZhciBzPWlbcl07cisrLGUuc2V0KHMuZGF0YUluZGV4LCEwKTtmb3IoYT0wO2E8cy5vdXRFZGdlcy5sZW5ndGg7YSsrKXQuc2V0KHMub3V0RWRnZXNbYV0uZGF0YUluZGV4LCEwKSxpLnB1c2gocy5vdXRFZGdlc1thXS5ub2RlMil9cmV0dXJue2VkZ2U6dC5rZXlzKCksbm9kZTplLmtleXMoKX19LHR9KCk7ZnVuY3Rpb24gbGsodCxlKXtyZXR1cm57Z2V0VmFsdWU6ZnVuY3Rpb24obil7dmFyIGk9dGhpc1t0XVtlXTtyZXR1cm4gaS5nZXRTdG9yZSgpLmdldChpLmdldERpbWVuc2lvbkluZGV4KG58fCJ2YWx1ZSIpLHRoaXMuZGF0YUluZGV4KX0sc2V0VmlzdWFsOmZ1bmN0aW9uKG4saSl7dGhpcy5kYXRhSW5kZXg+PTAmJnRoaXNbdF1bZV0uc2V0SXRlbVZpc3VhbCh0aGlzLmRhdGFJbmRleCxuLGkpfSxnZXRWaXN1YWw6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXNbdF1bZV0uZ2V0SXRlbVZpc3VhbCh0aGlzLmRhdGFJbmRleCxuKX0sc2V0TGF5b3V0OmZ1bmN0aW9uKG4saSl7dGhpcy5kYXRhSW5kZXg+PTAmJnRoaXNbdF1bZV0uc2V0SXRlbUxheW91dCh0aGlzLmRhdGFJbmRleCxuLGkpfSxnZXRMYXlvdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtlXS5nZXRJdGVtTGF5b3V0KHRoaXMuZGF0YUluZGV4KX0sZ2V0R3JhcGhpY0VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bZV0uZ2V0SXRlbUdyYXBoaWNFbCh0aGlzLmRhdGFJbmRleCl9LGdldFJhd0luZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bZV0uZ2V0UmF3SW5kZXgodGhpcy5kYXRhSW5kZXgpfX19ZnVuY3Rpb24gdWsodCxlLG4saSxyKXtmb3IodmFyIG89bmV3IG9rKGkpLGE9MDthPHQubGVuZ3RoO2ErKylvLmFkZE5vZGUoaXQodFthXS5pZCx0W2FdLm5hbWUsYSksYSk7dmFyIHM9W10sbD1bXSx1PTA7Zm9yKGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIGg9ZVthXSxjPWguc291cmNlLHA9aC50YXJnZXQ7by5hZGRFZGdlKGMscCx1KSYmKGwucHVzaChoKSxzLnB1c2goaXQoUm8oaC5pZCxudWxsKSxjKyIgPiAiK3ApKSx1KyspfXZhciBkLGY9bi5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKTtpZigiY2FydGVzaWFuMmQiPT09Znx8InBvbGFyIj09PWYpZD1feCh0LG4pO2Vsc2V7dmFyIGc9d2QuZ2V0KGYpLHk9ZyYmZy5kaW1lbnNpb25zfHxbXTtQKHksInZhbHVlIik8MCYmeS5jb25jYXQoWyJ2YWx1ZSJdKTt2YXIgdj1weCh0LHtjb29yZERpbWVuc2lvbnM6eSxlbmNvZGVEZWZpbmU6bi5nZXRFbmNvZGUoKX0pLmRpbWVuc2lvbnM7KGQ9bmV3IGN4KHYsbikpLmluaXREYXRhKHQpfXZhciBtPW5ldyBjeChbInZhbHVlIl0sbik7cmV0dXJuIG0uaW5pdERhdGEobCxzKSxyJiZyKGQsbSksWkMoe21haW5EYXRhOmQsc3RydWN0Om8sc3RydWN0QXR0cjoiZ3JhcGgiLGRhdGFzOntub2RlOmQsZWRnZTptfSxkYXRhc0F0dHI6e25vZGU6ImRhdGEiLGVkZ2U6ImVkZ2VEYXRhIn19KSxvLnVwZGF0ZSgpLG99UihhayxsaygiaG9zdEdyYXBoIiwiZGF0YSIpKSxSKHNrLGxrKCJob3N0R3JhcGgiLCJlZGdlRGF0YSIpKTt2YXIgaGs9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmhhc1N5bWJvbFZpc3VhbD0hMCxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoKXtyZXR1cm4gbi5fY2F0ZWdvcmllc0RhdGF9dGhpcy5sZWdlbmRWaXN1YWxQcm92aWRlcj1uZXcgTk0oaSxpKSx0aGlzLmZpbGxEYXRhVGV4dFN0eWxlKGUuZWRnZXN8fGUubGlua3MpLHRoaXMuX3VwZGF0ZUNhdGVnb3JpZXNEYXRhKCl9LGUucHJvdG90eXBlLm1lcmdlT3B0aW9uPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLm1lcmdlT3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmZpbGxEYXRhVGV4dFN0eWxlKGUuZWRnZXN8fGUubGlua3MpLHRoaXMuX3VwZGF0ZUNhdGVnb3JpZXNEYXRhKCl9LGUucHJvdG90eXBlLm1lcmdlRGVmYXVsdEFuZFRoZW1lPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLm1lcmdlRGVmYXVsdEFuZFRoZW1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxDbyhlLCJlZGdlTGFiZWwiLFsic2hvdyJdKX0sZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXt2YXIgbixpPXQuZWRnZXN8fHQubGlua3N8fFtdLHI9dC5kYXRhfHx0Lm5vZGVzfHxbXSxvPXRoaXM7aWYociYmaSl7ZEEobj10aGlzKSYmKG4uX19jdXJ2ZW5lc3NMaXN0PVtdLG4uX19lZGdlTWFwPXt9LGZBKG4pKTt2YXIgYT11ayhyLGksdGhpcywhMCwoZnVuY3Rpb24odCxlKXt0LndyYXBNZXRob2QoImdldEl0ZW1Nb2RlbCIsKGZ1bmN0aW9uKHQpe3ZhciBlPW8uX2NhdGVnb3JpZXNNb2RlbHNbdC5nZXRTaGFsbG93KCJjYXRlZ29yeSIpXTtyZXR1cm4gZSYmKGUucGFyZW50TW9kZWw9dC5wYXJlbnRNb2RlbCx0LnBhcmVudE1vZGVsPWUpLHR9KSk7dmFyIG49Q2MucHJvdG90eXBlLmdldE1vZGVsO2Z1bmN0aW9uIGkodCxlKXt2YXIgaT1uLmNhbGwodGhpcyx0LGUpO3JldHVybiBpLnJlc29sdmVQYXJlbnRQYXRoPXIsaX1mdW5jdGlvbiByKHQpe2lmKHQmJigibGFiZWwiPT09dFswXXx8ImxhYmVsIj09PXRbMV0pKXt2YXIgZT10LnNsaWNlKCk7cmV0dXJuImxhYmVsIj09PXRbMF0/ZVswXT0iZWRnZUxhYmVsIjoibGFiZWwiPT09dFsxXSYmKGVbMV09ImVkZ2VMYWJlbCIpLGV9cmV0dXJuIHR9ZS53cmFwTWV0aG9kKCJnZXRJdGVtTW9kZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXNvbHZlUGFyZW50UGF0aD1yLHQuZ2V0TW9kZWw9aSx0fSkpfSkpO3JldHVybiBFKGEuZWRnZXMsKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUsbixpKXtpZihkQShuKSl7dmFyIHI9Z0EodCxlLG4pLG89bi5fX2VkZ2VNYXAsYT1vW3lBKHIpXTtvW3JdJiYhYT9vW3JdLmlzRm9yd2FyZD0hMDphJiZvW3JdJiYoYS5pc0ZvcndhcmQ9ITAsb1tyXS5pc0ZvcndhcmQ9ITEpLG9bcl09b1tyXXx8W10sb1tyXS5wdXNoKGkpfX0odC5ub2RlMSx0Lm5vZGUyLHRoaXMsdC5kYXRhSW5kZXgpfSksdGhpcyksYS5kYXRhfX0sZS5wcm90b3R5cGUuZ2V0R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREYXRhKCkuZ3JhcGh9LGUucHJvdG90eXBlLmdldEVkZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0R3JhcGgoKS5lZGdlRGF0YX0sZS5wcm90b3R5cGUuZ2V0Q2F0ZWdvcmllc0RhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2F0ZWdvcmllc0RhdGF9LGUucHJvdG90eXBlLmZvcm1hdFRvb2x0aXA9ZnVuY3Rpb24odCxlLG4pe2lmKCJlZGdlIj09PW4pe3ZhciBpPXRoaXMuZ2V0RGF0YSgpLHI9dGhpcy5nZXREYXRhUGFyYW1zKHQsbiksbz1pLmdyYXBoLmdldEVkZ2VCeUluZGV4KHQpLGE9aS5nZXROYW1lKG8ubm9kZTEuZGF0YUluZGV4KSxzPWkuZ2V0TmFtZShvLm5vZGUyLmRhdGFJbmRleCksbD1bXTtyZXR1cm4gbnVsbCE9YSYmbC5wdXNoKGEpLG51bGwhPXMmJmwucHVzaChzKSxvZygibmFtZVZhbHVlIix7bmFtZTpsLmpvaW4oIiA+ICIpLHZhbHVlOnIudmFsdWUsbm9WYWx1ZTpudWxsPT1yLnZhbHVlfSl9cmV0dXJuIHZnKHtzZXJpZXM6dGhpcyxkYXRhSW5kZXg6dCxtdWx0aXBsZVNlcmllczplfSl9LGUucHJvdG90eXBlLl91cGRhdGVDYXRlZ29yaWVzRGF0YT1mdW5jdGlvbigpe3ZhciB0PXoodGhpcy5vcHRpb24uY2F0ZWdvcmllc3x8W10sKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10LnZhbHVlP3Q6QSh7dmFsdWU6MH0sdCl9KSksZT1uZXcgY3goWyJ2YWx1ZSJdLHRoaXMpO2UuaW5pdERhdGEodCksdGhpcy5fY2F0ZWdvcmllc0RhdGE9ZSx0aGlzLl9jYXRlZ29yaWVzTW9kZWxzPWUubWFwQXJyYXkoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmdldEl0ZW1Nb2RlbCh0KX0pKX0sZS5wcm90b3R5cGUuc2V0Wm9vbT1mdW5jdGlvbih0KXt0aGlzLm9wdGlvbi56b29tPXR9LGUucHJvdG90eXBlLnNldENlbnRlcj1mdW5jdGlvbih0KXt0aGlzLm9wdGlvbi5jZW50ZXI9dH0sZS5wcm90b3R5cGUuaXNBbmltYXRpb25FbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLmlzQW5pbWF0aW9uRW5hYmxlZC5jYWxsKHRoaXMpJiYhKCJmb3JjZSI9PT10aGlzLmdldCgibGF5b3V0IikmJnRoaXMuZ2V0KFsiZm9yY2UiLCJsYXlvdXRBbmltYXRpb24iXSkpfSxlLnR5cGU9InNlcmllcy5ncmFwaCIsZS5kZXBlbmRlbmNpZXM9WyJncmlkIiwicG9sYXIiLCJnZW8iLCJzaW5nbGVBeGlzIiwiY2FsZW5kYXIiXSxlLmRlZmF1bHRPcHRpb249e3o6Mixjb29yZGluYXRlU3lzdGVtOiJ2aWV3IixsZWdlbmRIb3Zlckxpbms6ITAsbGF5b3V0Om51bGwsY2lyY3VsYXI6e3JvdGF0ZUxhYmVsOiExfSxmb3JjZTp7aW5pdExheW91dDpudWxsLHJlcHVsc2lvbjpbMCw1MF0sZ3Jhdml0eTouMSxmcmljdGlvbjouNixlZGdlTGVuZ3RoOjMwLGxheW91dEFuaW1hdGlvbjohMH0sbGVmdDoiY2VudGVyIix0b3A6ImNlbnRlciIsc3ltYm9sOiJjaXJjbGUiLHN5bWJvbFNpemU6MTAsZWRnZVN5bWJvbDpbIm5vbmUiLCJub25lIl0sZWRnZVN5bWJvbFNpemU6MTAsZWRnZUxhYmVsOntwb3NpdGlvbjoibWlkZGxlIixkaXN0YW5jZTo1fSxkcmFnZ2FibGU6ITEscm9hbTohMSxjZW50ZXI6bnVsbCx6b29tOjEsbm9kZVNjYWxlUmF0aW86LjYsbGFiZWw6e3Nob3c6ITEsZm9ybWF0dGVyOiJ7Yn0ifSxpdGVtU3R5bGU6e30sbGluZVN0eWxlOntjb2xvcjoiI2FhYSIsd2lkdGg6MSxvcGFjaXR5Oi41fSxlbXBoYXNpczp7c2NhbGU6ITAsbGFiZWw6e3Nob3c6ITB9fSxzZWxlY3Q6e2l0ZW1TdHlsZTp7Ym9yZGVyQ29sb3I6IiMyMTIxMjEifX19LGV9KGJnKSxjaz17dHlwZToiZ3JhcGhSb2FtIixldmVudDoiZ3JhcGhSb2FtIix1cGRhdGU6Im5vbmUifTt2YXIgcGs9ZnVuY3Rpb24oKXt0aGlzLmFuZ2xlPTAsdGhpcy53aWR0aD0xMCx0aGlzLnI9MTAsdGhpcy54PTAsdGhpcy55PTB9LGRrPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4udHlwZT0icG9pbnRlciIsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcGt9LGUucHJvdG90eXBlLmJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY29zLGk9TWF0aC5zaW4scj1lLnIsbz1lLndpZHRoLGE9ZS5hbmdsZSxzPWUueC1uKGEpKm8qKG8+PXIvMz8xOjIpLGw9ZS55LWkoYSkqbyoobz49ci8zPzE6Mik7YT1lLmFuZ2xlLU1hdGguUEkvMix0Lm1vdmVUbyhzLGwpLHQubGluZVRvKGUueCtuKGEpKm8sZS55K2koYSkqbyksdC5saW5lVG8oZS54K24oZS5hbmdsZSkqcixlLnkraShlLmFuZ2xlKSpyKSx0LmxpbmVUbyhlLngtbihhKSpvLGUueS1pKGEpKm8pLHQubGluZVRvKHMsbCl9LGV9KGtzKTtmdW5jdGlvbiBmayh0LGUpe3ZhciBuPW51bGw9PXQ/IiI6dCsiIjtyZXR1cm4gZSYmKFUoZSk/bj1lLnJlcGxhY2UoInt2YWx1ZX0iLG4pOlgoZSkmJihuPWUodCkpKSxufXZhciBnaz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIGk9dC5nZXQoWyJheGlzTGluZSIsImxpbmVTdHlsZSIsImNvbG9yIl0pLHI9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldCgiY2VudGVyIiksaT1lLmdldFdpZHRoKCkscj1lLmdldEhlaWdodCgpLG89TWF0aC5taW4oaSxyKTtyZXR1cm57Y3g6JHIoblswXSxlLmdldFdpZHRoKCkpLGN5OiRyKG5bMV0sZS5nZXRIZWlnaHQoKSkscjokcih0LmdldCgicmFkaXVzIiksby8yKX19KHQsbik7dGhpcy5fcmVuZGVyTWFpbih0LGUsbixpLHIpLHRoaXMuX2RhdGE9dC5nZXREYXRhKCl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLl9yZW5kZXJNYWluPWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89dGhpcy5ncm91cCxhPXQuZ2V0KCJjbG9ja3dpc2UiKSxzPS10LmdldCgic3RhcnRBbmdsZSIpLzE4MCpNYXRoLlBJLGw9LXQuZ2V0KCJlbmRBbmdsZSIpLzE4MCpNYXRoLlBJLHU9dC5nZXRNb2RlbCgiYXhpc0xpbmUiKSxoPXUuZ2V0KCJyb3VuZENhcCIpP0pTOkZ1LGM9dS5nZXQoInNob3ciKSxwPXUuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLGQ9cC5nZXQoIndpZHRoIiksZj1bcyxsXTt1cyhmLCFhKTtmb3IodmFyIGc9KGw9ZlsxXSktKHM9ZlswXSkseT1zLHY9W10sbT0wO2MmJm08aS5sZW5ndGg7bSsrKXt2YXIgeD1uZXcgaCh7c2hhcGU6e3N0YXJ0QW5nbGU6eSxlbmRBbmdsZTpsPXMrZypNYXRoLm1pbihNYXRoLm1heChpW21dWzBdLDApLDEpLGN4OnIuY3gsY3k6ci5jeSxjbG9ja3dpc2U6YSxyMDpyLnItZCxyOnIucn0sc2lsZW50OiEwfSk7eC5zZXRTdHlsZSh7ZmlsbDppW21dWzFdfSkseC5zZXRTdHlsZShwLmdldExpbmVTdHlsZShbImNvbG9yIiwid2lkdGgiXSkpLHYucHVzaCh4KSx5PWx9di5yZXZlcnNlKCksRSh2LChmdW5jdGlvbih0KXtyZXR1cm4gby5hZGQodCl9KSk7dmFyIF89ZnVuY3Rpb24odCl7aWYodDw9MClyZXR1cm4gaVswXVsxXTt2YXIgZTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKWlmKGlbZV1bMF0+PXQmJigwPT09ZT8wOmlbZS0xXVswXSk8dClyZXR1cm4gaVtlXVsxXTtyZXR1cm4gaVtlLTFdWzFdfTt0aGlzLl9yZW5kZXJUaWNrcyh0LGUsbixfLHIscyxsLGEsZCksdGhpcy5fcmVuZGVyVGl0bGVBbmREZXRhaWwodCxlLG4sXyxyKSx0aGlzLl9yZW5kZXJBbmNob3IodCxyKSx0aGlzLl9yZW5kZXJQb2ludGVyKHQsZSxuLF8scixzLGwsYSxkKX0sZS5wcm90b3R5cGUuX3JlbmRlclRpY2tzPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyxsKXtmb3IodmFyIHUsaCxjPXRoaXMuZ3JvdXAscD1yLmN4LGQ9ci5jeSxmPXIucixnPSt0LmdldCgibWluIikseT0rdC5nZXQoIm1heCIpLHY9dC5nZXRNb2RlbCgic3BsaXRMaW5lIiksbT10LmdldE1vZGVsKCJheGlzVGljayIpLHg9dC5nZXRNb2RlbCgiYXhpc0xhYmVsIiksXz10LmdldCgic3BsaXROdW1iZXIiKSxiPW0uZ2V0KCJzcGxpdE51bWJlciIpLHc9JHIodi5nZXQoImxlbmd0aCIpLGYpLFM9JHIobS5nZXQoImxlbmd0aCIpLGYpLE09byxJPShhLW8pL18sVD1JL2IsQz12LmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxEPW0uZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLEE9di5nZXQoImRpc3RhbmNlIiksaz0wO2s8PV87aysrKXtpZih1PU1hdGguY29zKE0pLGg9TWF0aC5zaW4oTSksdi5nZXQoInNob3ciKSl7dmFyIEw9bmV3IEt1KHtzaGFwZTp7eDE6dSooZi0oUD1BP0ErbDpsKSkrcCx5MTpoKihmLVApK2QseDI6dSooZi13LVApK3AseTI6aCooZi13LVApK2R9LHN0eWxlOkMsc2lsZW50OiEwfSk7ImF1dG8iPT09Qy5zdHJva2UmJkwuc2V0U3R5bGUoe3N0cm9rZTppKGsvXyl9KSxjLmFkZChMKX1pZih4LmdldCgic2hvdyIpKXt2YXIgUD14LmdldCgiZGlzdGFuY2UiKStBLE89ZmsoSnIoay9fKih5LWcpK2cpLHguZ2V0KCJmb3JtYXR0ZXIiKSksUj1pKGsvXyksTj11KihmLXctUCkrcCxFPWgqKGYtdy1QKStkLHo9eC5nZXQoInJvdGF0ZSIpLFY9MDsicmFkaWFsIj09PXo/KFY9LU0rMipNYXRoLlBJKT5NYXRoLlBJLzImJihWKz1NYXRoLlBJKToidGFuZ2VudGlhbCI9PT16P1Y9LU0tTWF0aC5QSS8yOmooeikmJihWPXoqTWF0aC5QSS8xODApLDA9PT1WP2MuYWRkKG5ldyBYcyh7c3R5bGU6b2MoeCx7dGV4dDpPLHg6Tix5OkUsdmVydGljYWxBbGlnbjpoPC0uOD8idG9wIjpoPi44PyJib3R0b20iOiJtaWRkbGUiLGFsaWduOnU8LS40PyJsZWZ0Ijp1Pi40PyJyaWdodCI6ImNlbnRlciJ9LHtpbmhlcml0Q29sb3I6Un0pLHNpbGVudDohMH0pKTpjLmFkZChuZXcgWHMoe3N0eWxlOm9jKHgse3RleHQ6Tyx4Ok4seTpFLHZlcnRpY2FsQWxpZ246Im1pZGRsZSIsYWxpZ246ImNlbnRlciJ9LHtpbmhlcml0Q29sb3I6Un0pLHNpbGVudDohMCxvcmlnaW5YOk4sb3JpZ2luWTpFLHJvdGF0aW9uOlZ9KSl9aWYobS5nZXQoInNob3ciKSYmayE9PV8pe1A9KFA9bS5nZXQoImRpc3RhbmNlIikpP1ArbDpsO2Zvcih2YXIgQj0wO0I8PWI7QisrKXt1PU1hdGguY29zKE0pLGg9TWF0aC5zaW4oTSk7dmFyIEY9bmV3IEt1KHtzaGFwZTp7eDE6dSooZi1QKStwLHkxOmgqKGYtUCkrZCx4Mjp1KihmLVMtUCkrcCx5MjpoKihmLVMtUCkrZH0sc2lsZW50OiEwLHN0eWxlOkR9KTsiYXV0byI9PT1ELnN0cm9rZSYmRi5zZXRTdHlsZSh7c3Ryb2tlOmkoKGsrQi9iKS9fKX0pLGMuYWRkKEYpLE0rPVR9TS09VH1lbHNlIE0rPUl9fSxlLnByb3RvdHlwZS5fcmVuZGVyUG9pbnRlcj1mdW5jdGlvbih0LGUsbixpLHIsbyxhLHMsbCl7dmFyIHU9dGhpcy5ncm91cCxoPXRoaXMuX2RhdGEsYz10aGlzLl9wcm9ncmVzc0VscyxwPVtdLGQ9dC5nZXQoWyJwb2ludGVyIiwic2hvdyJdKSxmPXQuZ2V0TW9kZWwoInByb2dyZXNzIiksZz1mLmdldCgic2hvdyIpLHk9dC5nZXREYXRhKCksdj15Lm1hcERpbWVuc2lvbigidmFsdWUiKSxtPSt0LmdldCgibWluIikseD0rdC5nZXQoIm1heCIpLF89W20seF0sYj1bbyxhXTtmdW5jdGlvbiB3KGUsbil7dmFyIGksbz15LmdldEl0ZW1Nb2RlbChlKS5nZXRNb2RlbCgicG9pbnRlciIpLGE9JHIoby5nZXQoIndpZHRoIiksci5yKSxzPSRyKG8uZ2V0KCJsZW5ndGgiKSxyLnIpLGw9dC5nZXQoWyJwb2ludGVyIiwiaWNvbiJdKSx1PW8uZ2V0KCJvZmZzZXRDZW50ZXIiKSxoPSRyKHVbMF0sci5yKSxjPSRyKHVbMV0sci5yKSxwPW8uZ2V0KCJrZWVwQXNwZWN0Iik7cmV0dXJuKGk9bD9YeShsLGgtYS8yLGMtcyxhLHMsbnVsbCxwKTpuZXcgZGsoe3NoYXBlOnthbmdsZTotTWF0aC5QSS8yLHdpZHRoOmEscjpzLHg6aCx5OmN9fSkpLnJvdGF0aW9uPS0obitNYXRoLlBJLzIpLGkueD1yLmN4LGkueT1yLmN5LGl9ZnVuY3Rpb24gUyh0LGUpe3ZhciBuPWYuZ2V0KCJyb3VuZENhcCIpP0pTOkZ1LGk9Zi5nZXQoIm92ZXJsYXAiKSxhPWk/Zi5nZXQoIndpZHRoIik6bC95LmNvdW50KCksdT1pP3Iuci1hOnIuci0odCsxKSphLGg9aT9yLnI6ci5yLXQqYSxjPW5ldyBuKHtzaGFwZTp7c3RhcnRBbmdsZTpvLGVuZEFuZ2xlOmUsY3g6ci5jeCxjeTpyLmN5LGNsb2Nrd2lzZTpzLHIwOnUscjpofX0pO3JldHVybiBpJiYoYy56Mj14LXkuZ2V0KHYsdCkleCksY30oZ3x8ZCkmJih5LmRpZmYoaCkuYWRkKChmdW5jdGlvbihlKXt2YXIgbj15LmdldCh2LGUpO2lmKGQpe3ZhciBpPXcoZSxvKTttaChpLHtyb3RhdGlvbjotKChpc05hTigrbik/YlswXTpLcihuLF8sYiwhMCkpK01hdGguUEkvMil9LHQpLHUuYWRkKGkpLHkuc2V0SXRlbUdyYXBoaWNFbChlLGkpfWlmKGcpe3ZhciByPVMoZSxvKSxhPWYuZ2V0KCJjbGlwIik7bWgocix7c2hhcGU6e2VuZEFuZ2xlOktyKG4sXyxiLGEpfX0sdCksdS5hZGQociksb2wodC5zZXJpZXNJbmRleCx5LmRhdGFUeXBlLGUscikscFtlXT1yfX0pKS51cGRhdGUoKGZ1bmN0aW9uKGUsbil7dmFyIGk9eS5nZXQodixlKTtpZihkKXt2YXIgcj1oLmdldEl0ZW1HcmFwaGljRWwobiksYT1yP3Iucm90YXRpb246byxzPXcoZSxhKTtzLnJvdGF0aW9uPWEsdmgocyx7cm90YXRpb246LSgoaXNOYU4oK2kpP2JbMF06S3IoaSxfLGIsITApKStNYXRoLlBJLzIpfSx0KSx1LmFkZChzKSx5LnNldEl0ZW1HcmFwaGljRWwoZSxzKX1pZihnKXt2YXIgbD1jW25dLG09UyhlLGw/bC5zaGFwZS5lbmRBbmdsZTpvKSx4PWYuZ2V0KCJjbGlwIik7dmgobSx7c2hhcGU6e2VuZEFuZ2xlOktyKGksXyxiLHgpfX0sdCksdS5hZGQobSksb2wodC5zZXJpZXNJbmRleCx5LmRhdGFUeXBlLGUsbSkscFtlXT1tfX0pKS5leGVjdXRlKCkseS5lYWNoKChmdW5jdGlvbih0KXt2YXIgZT15LmdldEl0ZW1Nb2RlbCh0KSxuPWUuZ2V0TW9kZWwoImVtcGhhc2lzIikscj1uLmdldCgiZm9jdXMiKSxvPW4uZ2V0KCJibHVyU2NvcGUiKSxhPW4uZ2V0KCJkaXNhYmxlZCIpO2lmKGQpe3ZhciBzPXkuZ2V0SXRlbUdyYXBoaWNFbCh0KSxsPXkuZ2V0SXRlbVZpc3VhbCh0LCJzdHlsZSIpLHU9bC5maWxsO2lmKHMgaW5zdGFuY2VvZiBOcyl7dmFyIGg9cy5zdHlsZTtzLnVzZVN0eWxlKEEoe2ltYWdlOmguaW1hZ2UseDpoLngseTpoLnksd2lkdGg6aC53aWR0aCxoZWlnaHQ6aC5oZWlnaHR9LGwpKX1lbHNlIHMudXNlU3R5bGUobCksInBvaW50ZXIiIT09cy50eXBlJiZzLnNldENvbG9yKHUpO3Muc2V0U3R5bGUoZS5nZXRNb2RlbChbInBvaW50ZXIiLCJpdGVtU3R5bGUiXSkuZ2V0SXRlbVN0eWxlKCkpLCJhdXRvIj09PXMuc3R5bGUuZmlsbCYmcy5zZXRTdHlsZSgiZmlsbCIsaShLcih5LmdldCh2LHQpLF8sWzAsMV0sITApKSkscy56MkVtcGhhc2lzTGlmdD0wLCRsKHMsZSksWmwocyxyLG8sYSl9aWYoZyl7dmFyIGM9cFt0XTtjLnVzZVN0eWxlKHkuZ2V0SXRlbVZpc3VhbCh0LCJzdHlsZSIpKSxjLnNldFN0eWxlKGUuZ2V0TW9kZWwoWyJwcm9ncmVzcyIsIml0ZW1TdHlsZSJdKS5nZXRJdGVtU3R5bGUoKSksYy56MkVtcGhhc2lzTGlmdD0wLCRsKGMsZSksWmwoYyxyLG8sYSl9fSkpLHRoaXMuX3Byb2dyZXNzRWxzPXApfSxlLnByb3RvdHlwZS5fcmVuZGVyQW5jaG9yPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRNb2RlbCgiYW5jaG9yIik7aWYobi5nZXQoInNob3ciKSl7dmFyIGk9bi5nZXQoInNpemUiKSxyPW4uZ2V0KCJpY29uIiksbz1uLmdldCgib2Zmc2V0Q2VudGVyIiksYT1uLmdldCgia2VlcEFzcGVjdCIpLHM9WHkocixlLmN4LWkvMiskcihvWzBdLGUuciksZS5jeS1pLzIrJHIob1sxXSxlLnIpLGksaSxudWxsLGEpO3MuejI9bi5nZXQoInNob3dBYm92ZSIpPzE6MCxzLnNldFN0eWxlKG4uZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpKSx0aGlzLmdyb3VwLmFkZChzKX19LGUucHJvdG90eXBlLl9yZW5kZXJUaXRsZUFuZERldGFpbD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXRoaXMsYT10LmdldERhdGEoKSxzPWEubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGw9K3QuZ2V0KCJtaW4iKSx1PSt0LmdldCgibWF4IiksaD1uZXcgQnIsYz1bXSxwPVtdLGQ9dC5pc0FuaW1hdGlvbkVuYWJsZWQoKSxmPXQuZ2V0KFsicG9pbnRlciIsInNob3dBYm92ZSJdKTthLmRpZmYodGhpcy5fZGF0YSkuYWRkKChmdW5jdGlvbih0KXtjW3RdPW5ldyBYcyh7c2lsZW50OiEwfSkscFt0XT1uZXcgWHMoe3NpbGVudDohMH0pfSkpLnVwZGF0ZSgoZnVuY3Rpb24odCxlKXtjW3RdPW8uX3RpdGxlRWxzW2VdLHBbdF09by5fZGV0YWlsRWxzW2VdfSkpLmV4ZWN1dGUoKSxhLmVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWEuZ2V0SXRlbU1vZGVsKGUpLG89YS5nZXQocyxlKSxnPW5ldyBCcix5PWkoS3IobyxbbCx1XSxbMCwxXSwhMCkpLHY9bi5nZXRNb2RlbCgidGl0bGUiKTtpZih2LmdldCgic2hvdyIpKXt2YXIgbT12LmdldCgib2Zmc2V0Q2VudGVyIikseD1yLmN4KyRyKG1bMF0sci5yKSxfPXIuY3krJHIobVsxXSxyLnIpOyhEPWNbZV0pLmF0dHIoe3oyOmY/MDoyLHN0eWxlOm9jKHYse3g6eCx5Ol8sdGV4dDphLmdldE5hbWUoZSksYWxpZ246ImNlbnRlciIsdmVydGljYWxBbGlnbjoibWlkZGxlIn0se2luaGVyaXRDb2xvcjp5fSl9KSxnLmFkZChEKX12YXIgYj1uLmdldE1vZGVsKCJkZXRhaWwiKTtpZihiLmdldCgic2hvdyIpKXt2YXIgdz1iLmdldCgib2Zmc2V0Q2VudGVyIiksUz1yLmN4KyRyKHdbMF0sci5yKSxNPXIuY3krJHIod1sxXSxyLnIpLEk9JHIoYi5nZXQoIndpZHRoIiksci5yKSxUPSRyKGIuZ2V0KCJoZWlnaHQiKSxyLnIpLEM9dC5nZXQoWyJwcm9ncmVzcyIsInNob3ciXSk/YS5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIikuZmlsbDp5LEQ9cFtlXSxBPWIuZ2V0KCJmb3JtYXR0ZXIiKTtELmF0dHIoe3oyOmY/MDoyLHN0eWxlOm9jKGIse3g6Uyx5Ok0sdGV4dDpmayhvLEEpLHdpZHRoOmlzTmFOKEkpP251bGw6SSxoZWlnaHQ6aXNOYU4oVCk/bnVsbDpULGFsaWduOiJjZW50ZXIiLHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LHtpbmhlcml0Q29sb3I6Q30pfSksZGMoRCx7bm9ybWFsOmJ9LG8sKGZ1bmN0aW9uKHQpe3JldHVybiBmayh0LEEpfSkpLGQmJmZjKEQsZSxhLHQse2dldEZvcm1hdHRlZExhYmVsOmZ1bmN0aW9uKHQsZSxuLGkscixhKXtyZXR1cm4gZmsoYT9hLmludGVycG9sYXRlZFZhbHVlOm8sQSl9fSksZy5hZGQoRCl9aC5hZGQoZyl9KSksdGhpcy5ncm91cC5hZGQoaCksdGhpcy5fdGl0bGVFbHM9Yyx0aGlzLl9kZXRhaWxFbHM9cH0sZS50eXBlPSJnYXVnZSIsZX0oT2cpLHlrPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi52aXN1YWxTdHlsZUFjY2Vzc1BhdGg9Iml0ZW1TdHlsZSIsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFJNKHRoaXMsWyJ2YWx1ZSJdKX0sZS50eXBlPSJzZXJpZXMuZ2F1Z2UiLGUuZGVmYXVsdE9wdGlvbj17ejoyLGNvbG9yQnk6ImRhdGEiLGNlbnRlcjpbIjUwJSIsIjUwJSJdLGxlZ2VuZEhvdmVyTGluazohMCxyYWRpdXM6Ijc1JSIsc3RhcnRBbmdsZToyMjUsZW5kQW5nbGU6LTQ1LGNsb2Nrd2lzZTohMCxtaW46MCxtYXg6MTAwLHNwbGl0TnVtYmVyOjEwLGF4aXNMaW5lOntzaG93OiEwLHJvdW5kQ2FwOiExLGxpbmVTdHlsZTp7Y29sb3I6W1sxLCIjRTZFQkY4Il1dLHdpZHRoOjEwfX0scHJvZ3Jlc3M6e3Nob3c6ITEsb3ZlcmxhcDohMCx3aWR0aDoxMCxyb3VuZENhcDohMSxjbGlwOiEwfSxzcGxpdExpbmU6e3Nob3c6ITAsbGVuZ3RoOjEwLGRpc3RhbmNlOjEwLGxpbmVTdHlsZTp7Y29sb3I6IiM2MzY3N0EiLHdpZHRoOjMsdHlwZToic29saWQifX0sYXhpc1RpY2s6e3Nob3c6ITAsc3BsaXROdW1iZXI6NSxsZW5ndGg6NixkaXN0YW5jZToxMCxsaW5lU3R5bGU6e2NvbG9yOiIjNjM2NzdBIix3aWR0aDoxLHR5cGU6InNvbGlkIn19LGF4aXNMYWJlbDp7c2hvdzohMCxkaXN0YW5jZToxNSxjb2xvcjoiIzQ2NDY0NiIsZm9udFNpemU6MTIscm90YXRlOjB9LHBvaW50ZXI6e2ljb246bnVsbCxvZmZzZXRDZW50ZXI6WzAsMF0sc2hvdzohMCxzaG93QWJvdmU6ITAsbGVuZ3RoOiI2MCUiLHdpZHRoOjYsa2VlcEFzcGVjdDohMX0sYW5jaG9yOntzaG93OiExLHNob3dBYm92ZTohMSxzaXplOjYsaWNvbjoiY2lyY2xlIixvZmZzZXRDZW50ZXI6WzAsMF0sa2VlcEFzcGVjdDohMSxpdGVtU3R5bGU6e2NvbG9yOiIjZmZmIixib3JkZXJXaWR0aDowLGJvcmRlckNvbG9yOiIjNTQ3MGM2In19LHRpdGxlOntzaG93OiEwLG9mZnNldENlbnRlcjpbMCwiMjAlIl0sY29sb3I6IiM0NjQ2NDYiLGZvbnRTaXplOjE2LHZhbHVlQW5pbWF0aW9uOiExfSxkZXRhaWw6e3Nob3c6ITAsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJXaWR0aDowLGJvcmRlckNvbG9yOiIjY2NjIix3aWR0aDoxMDAsaGVpZ2h0Om51bGwscGFkZGluZzpbNSwxMF0sb2Zmc2V0Q2VudGVyOlswLCI0MCUiXSxjb2xvcjoiIzQ2NDY0NiIsZm9udFNpemU6MzAsZm9udFdlaWdodDoiYm9sZCIsbGluZUhlaWdodDozMCx2YWx1ZUFuaW1hdGlvbjohMX19LGV9KGJnKTt2YXIgdms9WyJpdGVtU3R5bGUiLCJvcGFjaXR5Il0sbWs9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcyxyPWksbz1uZXcgWnUsYT1uZXcgWHM7cmV0dXJuIHIuc2V0VGV4dENvbnRlbnQoYSksaS5zZXRUZXh0R3VpZGVMaW5lKG8pLGkudXBkYXRlRGF0YShlLG4sITApLGl9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9dC5ob3N0TW9kZWwsbz10LmdldEl0ZW1Nb2RlbChlKSxhPXQuZ2V0SXRlbUxheW91dChlKSxzPW8uZ2V0TW9kZWwoImVtcGhhc2lzIiksbD1vLmdldCh2ayk7bD1udWxsPT1sPzE6bCxufHxTaChpKSxpLnVzZVN0eWxlKHQuZ2V0SXRlbVZpc3VhbChlLCJzdHlsZSIpKSxpLnN0eWxlLmxpbmVKb2luPSJyb3VuZCIsbj8oaS5zZXRTaGFwZSh7cG9pbnRzOmEucG9pbnRzfSksaS5zdHlsZS5vcGFjaXR5PTAsbWgoaSx7c3R5bGU6e29wYWNpdHk6bH19LHIsZSkpOnZoKGkse3N0eWxlOntvcGFjaXR5Omx9LHNoYXBlOntwb2ludHM6YS5wb2ludHN9fSxyLGUpLCRsKGksbyksdGhpcy5fdXBkYXRlTGFiZWwodCxlKSxabCh0aGlzLHMuZ2V0KCJmb2N1cyIpLHMuZ2V0KCJibHVyU2NvcGUiKSxzLmdldCgiZGlzYWJsZWQiKSl9LGUucHJvdG90eXBlLl91cGRhdGVMYWJlbD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMsaT10aGlzLmdldFRleHRHdWlkZUxpbmUoKSxyPW4uZ2V0VGV4dENvbnRlbnQoKSxvPXQuaG9zdE1vZGVsLGE9dC5nZXRJdGVtTW9kZWwoZSkscz10LmdldEl0ZW1MYXlvdXQoZSkubGFiZWwsbD10LmdldEl0ZW1WaXN1YWwoZSwic3R5bGUiKSx1PWwuZmlsbDtpYyhyLHJjKGEpLHtsYWJlbEZldGNoZXI6dC5ob3N0TW9kZWwsbGFiZWxEYXRhSW5kZXg6ZSxkZWZhdWx0T3BhY2l0eTpsLm9wYWNpdHksZGVmYXVsdFRleHQ6dC5nZXROYW1lKGUpfSx7bm9ybWFsOnthbGlnbjpzLnRleHRBbGlnbix2ZXJ0aWNhbEFsaWduOnMudmVydGljYWxBbGlnbn19KSxuLnNldFRleHRDb25maWcoe2xvY2FsOiEwLGluc2lkZTohIXMuaW5zaWRlLGluc2lkZVN0cm9rZTp1LG91dHNpZGVGaWxsOnV9KTt2YXIgaD1zLmxpbmVQb2ludHM7aS5zZXRTaGFwZSh7cG9pbnRzOmh9KSxuLnRleHRHdWlkZUxpbmVDb25maWc9e2FuY2hvcjpoP25ldyBEZShoWzBdWzBdLGhbMF1bMV0pOm51bGx9LHZoKHIse3N0eWxlOnt4OnMueCx5OnMueX19LG8sZSksci5hdHRyKHtyb3RhdGlvbjpzLnJvdGF0aW9uLG9yaWdpblg6cy54LG9yaWdpblk6cy55LHoyOjEwfSksa2IobixMYihhKSx7c3Ryb2tlOnV9KX0sZX0oWHUpLHhrPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5pZ25vcmVMYWJlbExpbmVVcGRhdGU9ITAsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCkscj10aGlzLl9kYXRhLG89dGhpcy5ncm91cDtpLmRpZmYocikuYWRkKChmdW5jdGlvbih0KXt2YXIgZT1uZXcgbWsoaSx0KTtpLnNldEl0ZW1HcmFwaGljRWwodCxlKSxvLmFkZChlKX0pKS51cGRhdGUoKGZ1bmN0aW9uKHQsZSl7dmFyIG49ci5nZXRJdGVtR3JhcGhpY0VsKGUpO24udXBkYXRlRGF0YShpLHQpLG8uYWRkKG4pLGkuc2V0SXRlbUdyYXBoaWNFbCh0LG4pfSkpLnJlbW92ZSgoZnVuY3Rpb24oZSl7d2goci5nZXRJdGVtR3JhcGhpY0VsKGUpLHQsZSl9KSkuZXhlY3V0ZSgpLHRoaXMuX2RhdGE9aX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt9LGUudHlwZT0iZnVubmVsIixlfShPZyksX2s9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmxlZ2VuZFZpc3VhbFByb3ZpZGVyPW5ldyBOTShXKHRoaXMuZ2V0RGF0YSx0aGlzKSxXKHRoaXMuZ2V0UmF3RGF0YSx0aGlzKSksdGhpcy5fZGVmYXVsdExhYmVsTGluZShlKX0sZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUk0odGhpcyx7Y29vcmREaW1lbnNpb25zOlsidmFsdWUiXSxlbmNvZGVEZWZhdWx0ZXI6SChlZCx0aGlzKX0pfSxlLnByb3RvdHlwZS5fZGVmYXVsdExhYmVsTGluZT1mdW5jdGlvbih0KXtDbyh0LCJsYWJlbExpbmUiLFsic2hvdyJdKTt2YXIgZT10LmxhYmVsTGluZSxuPXQuZW1waGFzaXMubGFiZWxMaW5lO2Uuc2hvdz1lLnNob3cmJnQubGFiZWwuc2hvdyxuLnNob3c9bi5zaG93JiZ0LmVtcGhhc2lzLmxhYmVsLnNob3d9LGUucHJvdG90eXBlLmdldERhdGFQYXJhbXM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5nZXREYXRhKCksaT10LnByb3RvdHlwZS5nZXREYXRhUGFyYW1zLmNhbGwodGhpcyxlKSxyPW4ubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLG89bi5nZXRTdW0ocik7cmV0dXJuIGkucGVyY2VudD1vPysobi5nZXQocixlKS9vKjEwMCkudG9GaXhlZCgyKTowLGkuJHZhcnMucHVzaCgicGVyY2VudCIpLGl9LGUudHlwZT0ic2VyaWVzLmZ1bm5lbCIsZS5kZWZhdWx0T3B0aW9uPXt6OjIsbGVnZW5kSG92ZXJMaW5rOiEwLGNvbG9yQnk6ImRhdGEiLGxlZnQ6ODAsdG9wOjYwLHJpZ2h0OjgwLGJvdHRvbTo2MCxtaW5TaXplOiIwJSIsbWF4U2l6ZToiMTAwJSIsc29ydDoiZGVzY2VuZGluZyIsb3JpZW50OiJ2ZXJ0aWNhbCIsZ2FwOjAsZnVubmVsQWxpZ246ImNlbnRlciIsbGFiZWw6e3Nob3c6ITAscG9zaXRpb246Im91dGVyIn0sbGFiZWxMaW5lOntzaG93OiEwLGxlbmd0aDoyMCxsaW5lU3R5bGU6e3dpZHRoOjF9fSxpdGVtU3R5bGU6e2JvcmRlckNvbG9yOiIjZmZmIixib3JkZXJXaWR0aDoxfSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITB9fSxzZWxlY3Q6e2l0ZW1TdHlsZTp7Ym9yZGVyQ29sb3I6IiMyMTIxMjEifX19LGV9KGJnKTtmdW5jdGlvbiBiayh0LGUpe3QuZWFjaFNlcmllc0J5VHlwZSgiZnVubmVsIiwoZnVuY3Rpb24odCl7dmFyIG49dC5nZXREYXRhKCksaT1uLm1hcERpbWVuc2lvbigidmFsdWUiKSxyPXQuZ2V0KCJzb3J0Iiksbz1mdW5jdGlvbih0LGUpe3JldHVybiBrcCh0LmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KX0odCxlKSxhPXQuZ2V0KCJvcmllbnQiKSxzPW8ud2lkdGgsbD1vLmhlaWdodCx1PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGk9dC5tYXBBcnJheShuLChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSxyPVtdLG89ImFzY2VuZGluZyI9PT1lLGE9MCxzPXQuY291bnQoKTthPHM7YSsrKXJbYV09YTtyZXR1cm4gWChlKT9yLnNvcnQoZSk6Im5vbmUiIT09ZSYmci5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBvP2lbdF0taVtlXTppW2VdLWlbdF19KSkscn0obixyKSxoPW8ueCxjPW8ueSxwPSJob3Jpem9udGFsIj09PWE/WyRyKHQuZ2V0KCJtaW5TaXplIiksbCksJHIodC5nZXQoIm1heFNpemUiKSxsKV06WyRyKHQuZ2V0KCJtaW5TaXplIikscyksJHIodC5nZXQoIm1heFNpemUiKSxzKV0sZD1uLmdldERhdGFFeHRlbnQoaSksZj10LmdldCgibWluIiksZz10LmdldCgibWF4Iik7bnVsbD09ZiYmKGY9TWF0aC5taW4oZFswXSwwKSksbnVsbD09ZyYmKGc9ZFsxXSk7dmFyIHk9dC5nZXQoImZ1bm5lbEFsaWduIiksdj10LmdldCgiZ2FwIiksbT0oKCJob3Jpem9udGFsIj09PWE/czpsKS12KihuLmNvdW50KCktMSkpL24uY291bnQoKSx4PWZ1bmN0aW9uKHQsZSl7aWYoImhvcml6b250YWwiPT09YSl7dmFyIHI9S3Iobi5nZXQoaSx0KXx8MCxbZixnXSxwLCEwKSxvPXZvaWQgMDtzd2l0Y2goeSl7Y2FzZSJ0b3AiOm89YzticmVhaztjYXNlImNlbnRlciI6bz1jKyhsLXIpLzI7YnJlYWs7Y2FzZSJib3R0b20iOm89YysobC1yKX1yZXR1cm5bW2Usb10sW2UsbytyXV19dmFyIHUsZD1LcihuLmdldChpLHQpfHwwLFtmLGddLHAsITApO3N3aXRjaCh5KXtjYXNlImxlZnQiOnU9aDticmVhaztjYXNlImNlbnRlciI6dT1oKyhzLWQpLzI7YnJlYWs7Y2FzZSJyaWdodCI6dT1oK3MtZH1yZXR1cm5bW3UsZV0sW3UrZCxlXV19OyJhc2NlbmRpbmciPT09ciYmKG09LW0sdj0tdiwiaG9yaXpvbnRhbCI9PT1hP2grPXM6Yys9bCx1PXUucmV2ZXJzZSgpKTtmb3IodmFyIF89MDtfPHUubGVuZ3RoO18rKyl7dmFyIGI9dVtfXSx3PXVbXysxXSxTPW4uZ2V0SXRlbU1vZGVsKGIpO2lmKCJob3Jpem9udGFsIj09PWEpe3ZhciBNPVMuZ2V0KFsiaXRlbVN0eWxlIiwid2lkdGgiXSk7bnVsbD09TT9NPW06KE09JHIoTSxzKSwiYXNjZW5kaW5nIj09PXImJihNPS1NKSk7dmFyIEk9eChiLGgpLFQ9eCh3LGgrTSk7aCs9TSt2LG4uc2V0SXRlbUxheW91dChiLHtwb2ludHM6SS5jb25jYXQoVC5zbGljZSgpLnJldmVyc2UoKSl9KX1lbHNle3ZhciBDPVMuZ2V0KFsiaXRlbVN0eWxlIiwiaGVpZ2h0Il0pO251bGw9PUM/Qz1tOihDPSRyKEMsbCksImFzY2VuZGluZyI9PT1yJiYoQz0tQykpO0k9eChiLGMpLFQ9eCh3LGMrQyk7Yys9Qyt2LG4uc2V0SXRlbUxheW91dChiLHtwb2ludHM6SS5jb25jYXQoVC5zbGljZSgpLnJldmVyc2UoKSl9KX19IWZ1bmN0aW9uKHQpe3ZhciBlPXQuaG9zdE1vZGVsLmdldCgib3JpZW50Iik7dC5lYWNoKChmdW5jdGlvbihuKXt2YXIgaSxyLG8sYSxzPXQuZ2V0SXRlbU1vZGVsKG4pLGw9cy5nZXRNb2RlbCgibGFiZWwiKS5nZXQoInBvc2l0aW9uIiksdT1zLmdldE1vZGVsKCJsYWJlbExpbmUiKSxoPXQuZ2V0SXRlbUxheW91dChuKSxjPWgucG9pbnRzLHA9ImlubmVyIj09PWx8fCJpbnNpZGUiPT09bHx8ImNlbnRlciI9PT1sfHwiaW5zaWRlTGVmdCI9PT1sfHwiaW5zaWRlUmlnaHQiPT09bDtpZihwKSJpbnNpZGVMZWZ0Ij09PWw/KHI9KGNbMF1bMF0rY1szXVswXSkvMis1LG89KGNbMF1bMV0rY1szXVsxXSkvMixpPSJsZWZ0Iik6Imluc2lkZVJpZ2h0Ij09PWw/KHI9KGNbMV1bMF0rY1syXVswXSkvMi01LG89KGNbMV1bMV0rY1syXVsxXSkvMixpPSJyaWdodCIpOihyPShjWzBdWzBdK2NbMV1bMF0rY1syXVswXStjWzNdWzBdKS80LG89KGNbMF1bMV0rY1sxXVsxXStjWzJdWzFdK2NbM11bMV0pLzQsaT0iY2VudGVyIiksYT1bW3Isb10sW3Isb11dO2Vsc2V7dmFyIGQ9dm9pZCAwLGY9dm9pZCAwLGc9dm9pZCAwLHk9dm9pZCAwLHY9dS5nZXQoImxlbmd0aCIpOyJsZWZ0Ij09PWw/KGQ9KGNbM11bMF0rY1swXVswXSkvMixmPShjWzNdWzFdK2NbMF1bMV0pLzIscj0oZz1kLXYpLTUsaT0icmlnaHQiKToicmlnaHQiPT09bD8oZD0oY1sxXVswXStjWzJdWzBdKS8yLGY9KGNbMV1bMV0rY1syXVsxXSkvMixyPShnPWQrdikrNSxpPSJsZWZ0Iik6InRvcCI9PT1sPyhkPShjWzNdWzBdK2NbMF1bMF0pLzIsbz0oeT0oZj0oY1szXVsxXStjWzBdWzFdKS8yKS12KS01LGk9ImNlbnRlciIpOiJib3R0b20iPT09bD8oZD0oY1sxXVswXStjWzJdWzBdKS8yLG89KHk9KGY9KGNbMV1bMV0rY1syXVsxXSkvMikrdikrNSxpPSJjZW50ZXIiKToicmlnaHRUb3AiPT09bD8oZD0iaG9yaXpvbnRhbCI9PT1lP2NbM11bMF06Y1sxXVswXSxmPSJob3Jpem9udGFsIj09PWU/Y1szXVsxXTpjWzFdWzFdLCJob3Jpem9udGFsIj09PWU/KG89KHk9Zi12KS01LGk9ImNlbnRlciIpOihyPShnPWQrdikrNSxpPSJ0b3AiKSk6InJpZ2h0Qm90dG9tIj09PWw/KGQ9Y1syXVswXSxmPWNbMl1bMV0sImhvcml6b250YWwiPT09ZT8obz0oeT1mK3YpKzUsaT0iY2VudGVyIik6KHI9KGc9ZCt2KSs1LGk9ImJvdHRvbSIpKToibGVmdFRvcCI9PT1sPyhkPWNbMF1bMF0sZj0iaG9yaXpvbnRhbCI9PT1lP2NbMF1bMV06Y1sxXVsxXSwiaG9yaXpvbnRhbCI9PT1lPyhvPSh5PWYtdiktNSxpPSJjZW50ZXIiKToocj0oZz1kLXYpLTUsaT0icmlnaHQiKSk6ImxlZnRCb3R0b20iPT09bD8oZD0iaG9yaXpvbnRhbCI9PT1lP2NbMV1bMF06Y1szXVswXSxmPSJob3Jpem9udGFsIj09PWU/Y1sxXVsxXTpjWzJdWzFdLCJob3Jpem9udGFsIj09PWU/KG89KHk9Zit2KSs1LGk9ImNlbnRlciIpOihyPShnPWQtdiktNSxpPSJyaWdodCIpKTooZD0oY1sxXVswXStjWzJdWzBdKS8yLGY9KGNbMV1bMV0rY1syXVsxXSkvMiwiaG9yaXpvbnRhbCI9PT1lPyhvPSh5PWYrdikrNSxpPSJjZW50ZXIiKToocj0oZz1kK3YpKzUsaT0ibGVmdCIpKSwiaG9yaXpvbnRhbCI9PT1lP3I9Zz1kOm89eT1mLGE9W1tkLGZdLFtnLHldXX1oLmxhYmVsPXtsaW5lUG9pbnRzOmEseDpyLHk6byx2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLHRleHRBbGlnbjppLGluc2lkZTpwfX0pKX0obil9KSl9dmFyIHdrPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5fZGF0YUdyb3VwPW5ldyBCcixuLl9pbml0aWFsaXplZD0hMSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuZ3JvdXAuYWRkKHRoaXMuX2RhdGFHcm91cCl9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbixpKXt0aGlzLl9wcm9ncmVzc2l2ZUVscz1udWxsO3ZhciByPXRoaXMuX2RhdGFHcm91cCxvPXQuZ2V0RGF0YSgpLGE9dGhpcy5fZGF0YSxzPXQuY29vcmRpbmF0ZVN5c3RlbSxsPXMuZGltZW5zaW9ucyx1PUlrKHQpO2lmKG8uZGlmZihhKS5hZGQoKGZ1bmN0aW9uKHQpe1RrKE1rKG8scix0LGwscyksbyx0LHUpfSkpLnVwZGF0ZSgoZnVuY3Rpb24oZSxuKXt2YXIgaT1hLmdldEl0ZW1HcmFwaGljRWwobikscj1TayhvLGUsbCxzKTtvLnNldEl0ZW1HcmFwaGljRWwoZSxpKSx2aChpLHtzaGFwZTp7cG9pbnRzOnJ9fSx0LGUpLFNoKGkpLFRrKGksbyxlLHUpfSkpLnJlbW92ZSgoZnVuY3Rpb24odCl7dmFyIGU9YS5nZXRJdGVtR3JhcGhpY0VsKHQpO3IucmVtb3ZlKGUpfSkpLmV4ZWN1dGUoKSwhdGhpcy5faW5pdGlhbGl6ZWQpe3RoaXMuX2luaXRpYWxpemVkPSEwO3ZhciBoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10Lm1vZGVsLHI9dC5nZXRSZWN0KCksbz1uZXcgV3Moe3NoYXBlOnt4OnIueCx5OnIueSx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodH19KSxhPSJob3Jpem9udGFsIj09PWkuZ2V0KCJsYXlvdXQiKT8id2lkdGgiOiJoZWlnaHQiO3JldHVybiBvLnNldFNoYXBlKGEsMCksbWgobyx7c2hhcGU6e3dpZHRoOnIud2lkdGgsaGVpZ2h0OnIuaGVpZ2h0fX0sZSxuKSxvfShzLHQsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLnJlbW92ZUNsaXBQYXRoKCl9KSl9KSk7ci5zZXRDbGlwUGF0aChoKX10aGlzLl9kYXRhPW99LGUucHJvdG90eXBlLmluY3JlbWVudGFsUHJlcGFyZVJlbmRlcj1mdW5jdGlvbih0LGUsbil7dGhpcy5faW5pdGlhbGl6ZWQ9ITAsdGhpcy5fZGF0YT1udWxsLHRoaXMuX2RhdGFHcm91cC5yZW1vdmVBbGwoKX0sZS5wcm90b3R5cGUuaW5jcmVtZW50YWxSZW5kZXI9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1lLmdldERhdGEoKSxyPWUuY29vcmRpbmF0ZVN5c3RlbSxvPXIuZGltZW5zaW9ucyxhPUlrKGUpLHM9dGhpcy5fcHJvZ3Jlc3NpdmVFbHM9W10sbD10LnN0YXJ0O2w8dC5lbmQ7bCsrKXt2YXIgdT1NayhpLHRoaXMuX2RhdGFHcm91cCxsLG8scik7dS5pbmNyZW1lbnRhbD0hMCxUayh1LGksbCxhKSxzLnB1c2godSl9fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9kYXRhR3JvdXAmJnRoaXMuX2RhdGFHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9LGUudHlwZT0icGFyYWxsZWwiLGV9KE9nKTtmdW5jdGlvbiBTayh0LGUsbixpKXtmb3IodmFyIHIsbz1bXSxhPTA7YTxuLmxlbmd0aDthKyspe3ZhciBzPW5bYV0sbD10LmdldCh0Lm1hcERpbWVuc2lvbihzKSxlKTtyPWwsKCJjYXRlZ29yeSI9PT1pLmdldEF4aXMocykudHlwZT9udWxsPT1yOm51bGw9PXJ8fGlzTmFOKHIpKXx8by5wdXNoKGkuZGF0YVRvUG9pbnQobCxzKSl9cmV0dXJuIG99ZnVuY3Rpb24gTWsodCxlLG4saSxyKXt2YXIgbz1Tayh0LG4saSxyKSxhPW5ldyBadSh7c2hhcGU6e3BvaW50czpvfSx6MjoxMH0pO3JldHVybiBlLmFkZChhKSx0LnNldEl0ZW1HcmFwaGljRWwobixhKSxhfWZ1bmN0aW9uIElrKHQpe3ZhciBlPXQuZ2V0KCJzbW9vdGgiLCEwKTtyZXR1cm4hMD09PWUmJihlPS4zKSxudChlPXlvKGUpKSYmKGU9MCkse3Ntb290aDplfX1mdW5jdGlvbiBUayh0LGUsbixpKXt0LnVzZVN0eWxlKGUuZ2V0SXRlbVZpc3VhbChuLCJzdHlsZSIpKSx0LnN0eWxlLmZpbGw9bnVsbCx0LnNldFNoYXBlKCJzbW9vdGgiLGkuc21vb3RoKTt2YXIgcj1lLmdldEl0ZW1Nb2RlbChuKSxvPXIuZ2V0TW9kZWwoImVtcGhhc2lzIik7JGwodCxyLCJsaW5lU3R5bGUiKSxabCh0LG8uZ2V0KCJmb2N1cyIpLG8uZ2V0KCJibHVyU2NvcGUiKSxvLmdldCgiZGlzYWJsZWQiKSl9dmFyIENrPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi52aXN1YWxTdHlsZUFjY2Vzc1BhdGg9ImxpbmVTdHlsZSIsbi52aXN1YWxEcmF3VHlwZT0ic3Ryb2tlIixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3gobnVsbCx0aGlzLHt1c2VFbmNvZGVEZWZhdWx0ZXI6VyhEayxudWxsLHRoaXMpfSl9LGUucHJvdG90eXBlLmdldFJhd0luZGljZXNCeUFjdGl2ZVN0YXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29vcmRpbmF0ZVN5c3RlbSxuPXRoaXMuZ2V0RGF0YSgpLGk9W107cmV0dXJuIGUuZWFjaEFjdGl2ZVN0YXRlKG4sKGZ1bmN0aW9uKGUscil7dD09PWUmJmkucHVzaChuLmdldFJhd0luZGV4KHIpKX0pKSxpfSxlLnR5cGU9InNlcmllcy5wYXJhbGxlbCIsZS5kZXBlbmRlbmNpZXM9WyJwYXJhbGxlbCJdLGUuZGVmYXVsdE9wdGlvbj17ejoyLGNvb3JkaW5hdGVTeXN0ZW06InBhcmFsbGVsIixwYXJhbGxlbEluZGV4OjAsbGFiZWw6e3Nob3c6ITF9LGluYWN0aXZlT3BhY2l0eTouMDUsYWN0aXZlT3BhY2l0eToxLGxpbmVTdHlsZTp7d2lkdGg6MSxvcGFjaXR5Oi40NSx0eXBlOiJzb2xpZCJ9LGVtcGhhc2lzOntsYWJlbDp7c2hvdzohMX19LHByb2dyZXNzaXZlOjUwMCxzbW9vdGg6ITEsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIifSxlfShiZyk7ZnVuY3Rpb24gRGsodCl7dmFyIGU9dC5lY01vZGVsLmdldENvbXBvbmVudCgicGFyYWxsZWwiLHQuZ2V0KCJwYXJhbGxlbEluZGV4IikpO2lmKGUpe3ZhciBuPXt9O3JldHVybiBFKGUuZGltZW5zaW9ucywoZnVuY3Rpb24odCl7dmFyIGU9K3QucmVwbGFjZSgiZGltIiwiIik7blt0XT1lfSkpLG59fXZhciBBaz1bImxpbmVTdHlsZSIsIm9wYWNpdHkiXSxraz17c2VyaWVzVHlwZToicGFyYWxsZWwiLHJlc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtLGk9e25vcm1hbDp0LmdldChbImxpbmVTdHlsZSIsIm9wYWNpdHkiXSksYWN0aXZlOnQuZ2V0KCJhY3RpdmVPcGFjaXR5IiksaW5hY3RpdmU6dC5nZXQoImluYWN0aXZlT3BhY2l0eSIpfTtyZXR1cm57cHJvZ3Jlc3M6ZnVuY3Rpb24odCxlKXtuLmVhY2hBY3RpdmVTdGF0ZShlLChmdW5jdGlvbih0LG4pe3ZhciByPWlbdF07aWYoIm5vcm1hbCI9PT10JiZlLmhhc0l0ZW1PcHRpb24pe3ZhciBvPWUuZ2V0SXRlbU1vZGVsKG4pLmdldChBaywhMCk7bnVsbCE9byYmKHI9byl9ZS5lbnN1cmVVbmlxdWVJdGVtVmlzdWFsKG4sInN0eWxlIikub3BhY2l0eT1yfSksdC5zdGFydCx0LmVuZCl9fX19O2Z1bmN0aW9uIExrKHQpeyFmdW5jdGlvbih0KXtpZih0LnBhcmFsbGVsKXJldHVybjt2YXIgZT0hMTtFKHQuc2VyaWVzLChmdW5jdGlvbih0KXt0JiYicGFyYWxsZWwiPT09dC50eXBlJiYoZT0hMCl9KSksZSYmKHQucGFyYWxsZWw9W3t9XSl9KHQpLGZ1bmN0aW9uKHQpe3ZhciBlPVRvKHQucGFyYWxsZWxBeGlzKTtFKGUsKGZ1bmN0aW9uKGUpe2lmKHEoZSkpe3ZhciBuPWUucGFyYWxsZWxJbmRleHx8MCxpPVRvKHQucGFyYWxsZWwpW25dO2kmJmkucGFyYWxsZWxBeGlzRGVmYXVsdCYmQyhlLGkucGFyYWxsZWxBeGlzRGVmYXVsdCwhMSl9fSkpfSh0KX12YXIgUGs9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9tb2RlbD10LHRoaXMuX2FwaT1uLHRoaXMuX2hhbmRsZXJzfHwodGhpcy5faGFuZGxlcnM9e30sRShPaywoZnVuY3Rpb24odCxlKXtuLmdldFpyKCkub24oZSx0aGlzLl9oYW5kbGVyc1tlXT1XKHQsdGhpcykpfSksdGhpcykpLEhnKHRoaXMsIl90aHJvdHRsZWREaXNwYXRjaEV4cGFuZCIsdC5nZXQoImF4aXNFeHBhbmRSYXRlIiksImZpeFJhdGUiKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbih0LGUpe1lnKHRoaXMsIl90aHJvdHRsZWREaXNwYXRjaEV4cGFuZCIpLEUodGhpcy5faGFuZGxlcnMsKGZ1bmN0aW9uKHQsbil7ZS5nZXRacigpLm9mZihuLHQpfSkpLHRoaXMuX2hhbmRsZXJzPW51bGx9LGUucHJvdG90eXBlLl90aHJvdHRsZWREaXNwYXRjaEV4cGFuZD1mdW5jdGlvbih0KXt0aGlzLl9kaXNwYXRjaEV4cGFuZCh0KX0sZS5wcm90b3R5cGUuX2Rpc3BhdGNoRXhwYW5kPWZ1bmN0aW9uKHQpe3QmJnRoaXMuX2FwaS5kaXNwYXRjaEFjdGlvbihBKHt0eXBlOiJwYXJhbGxlbEF4aXNFeHBhbmQifSx0KSl9LGUudHlwZT0icGFyYWxsZWwiLGV9KEFnKSxPaz17bW91c2Vkb3duOmZ1bmN0aW9uKHQpe1JrKHRoaXMsImNsaWNrIikmJih0aGlzLl9tb3VzZURvd25Qb2ludD1bdC5vZmZzZXRYLHQub2Zmc2V0WV0pfSxtb3VzZXVwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21vdXNlRG93blBvaW50O2lmKFJrKHRoaXMsImNsaWNrIikmJmUpe3ZhciBuPVt0Lm9mZnNldFgsdC5vZmZzZXRZXTtpZihNYXRoLnBvdyhlWzBdLW5bMF0sMikrTWF0aC5wb3coZVsxXS1uWzFdLDIpPjUpcmV0dXJuO3ZhciBpPXRoaXMuX21vZGVsLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0U2xpZGVkQXhpc0V4cGFuZFdpbmRvdyhbdC5vZmZzZXRYLHQub2Zmc2V0WV0pOyJub25lIiE9PWkuYmVoYXZpb3ImJnRoaXMuX2Rpc3BhdGNoRXhwYW5kKHtheGlzRXhwYW5kV2luZG93OmkuYXhpc0V4cGFuZFdpbmRvd30pfXRoaXMuX21vdXNlRG93blBvaW50PW51bGx9LG1vdXNlbW92ZTpmdW5jdGlvbih0KXtpZighdGhpcy5fbW91c2VEb3duUG9pbnQmJlJrKHRoaXMsIm1vdXNlbW92ZSIpKXt2YXIgZT10aGlzLl9tb2RlbCxuPWUuY29vcmRpbmF0ZVN5c3RlbS5nZXRTbGlkZWRBeGlzRXhwYW5kV2luZG93KFt0Lm9mZnNldFgsdC5vZmZzZXRZXSksaT1uLmJlaGF2aW9yOyJqdW1wIj09PWkmJnRoaXMuX3Rocm90dGxlZERpc3BhdGNoRXhwYW5kLmRlYm91bmNlTmV4dENhbGwoZS5nZXQoImF4aXNFeHBhbmREZWJvdW5jZSIpKSx0aGlzLl90aHJvdHRsZWREaXNwYXRjaEV4cGFuZCgibm9uZSI9PT1pP251bGw6e2F4aXNFeHBhbmRXaW5kb3c6bi5heGlzRXhwYW5kV2luZG93LGFuaW1hdGlvbjoianVtcCI9PT1pP251bGw6e2R1cmF0aW9uOjB9fSl9fX07ZnVuY3Rpb24gUmsodCxlKXt2YXIgbj10Ll9tb2RlbDtyZXR1cm4gbi5nZXQoImF4aXNFeHBhbmRhYmxlIikmJm4uZ2V0KCJheGlzRXhwYW5kVHJpZ2dlck9uIik9PT1lfXZhciBOaz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5tZXJnZU9wdGlvbih7fSl9LGUucHJvdG90eXBlLm1lcmdlT3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uO3QmJkMoZSx0LCEwKSx0aGlzLl9pbml0RGltZW5zaW9ucygpfSxlLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0KCJwYXJhbGxlbEluZGV4Iik7cmV0dXJuIG51bGwhPW4mJmUuZ2V0Q29tcG9uZW50KCJwYXJhbGxlbCIsbik9PT10aGlzfSxlLnByb3RvdHlwZS5zZXRBeGlzRXhwYW5kPWZ1bmN0aW9uKHQpe0UoWyJheGlzRXhwYW5kYWJsZSIsImF4aXNFeHBhbmRDZW50ZXIiLCJheGlzRXhwYW5kQ291bnQiLCJheGlzRXhwYW5kV2lkdGgiLCJheGlzRXhwYW5kV2luZG93Il0sKGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJih0aGlzLm9wdGlvbltlXT10W2VdKX0pLHRoaXMpfSxlLnByb3RvdHlwZS5faW5pdERpbWVuc2lvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRpbWVuc2lvbnM9W10sZT10aGlzLnBhcmFsbGVsQXhpc0luZGV4PVtdO0UoQih0aGlzLmVjTW9kZWwucXVlcnlDb21wb25lbnRzKHttYWluVHlwZToicGFyYWxsZWxBeGlzIn0pLChmdW5jdGlvbih0KXtyZXR1cm4odC5nZXQoInBhcmFsbGVsSW5kZXgiKXx8MCk9PT10aGlzLmNvbXBvbmVudEluZGV4fSksdGhpcyksKGZ1bmN0aW9uKG4pe3QucHVzaCgiZGltIituLmdldCgiZGltIikpLGUucHVzaChuLmNvbXBvbmVudEluZGV4KX0pKX0sZS50eXBlPSJwYXJhbGxlbCIsZS5kZXBlbmRlbmNpZXM9WyJwYXJhbGxlbEF4aXMiXSxlLmxheW91dE1vZGU9ImJveCIsZS5kZWZhdWx0T3B0aW9uPXt6OjAsbGVmdDo4MCx0b3A6NjAscmlnaHQ6ODAsYm90dG9tOjYwLGxheW91dDoiaG9yaXpvbnRhbCIsYXhpc0V4cGFuZGFibGU6ITEsYXhpc0V4cGFuZENlbnRlcjpudWxsLGF4aXNFeHBhbmRDb3VudDowLGF4aXNFeHBhbmRXaWR0aDo1MCxheGlzRXhwYW5kUmF0ZToxNyxheGlzRXhwYW5kRGVib3VuY2U6NTAsYXhpc0V4cGFuZFNsaWRlVHJpZ2dlckFyZWE6Wy0uMTUsLjA1LC40XSxheGlzRXhwYW5kVHJpZ2dlck9uOiJjbGljayIscGFyYWxsZWxBeGlzRGVmYXVsdDpudWxsfSxlfSh6cCksRWs9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4saSxyLG8pe3ZhciBhPXQuY2FsbCh0aGlzLGUsbixpKXx8dGhpcztyZXR1cm4gYS50eXBlPXJ8fCJ2YWx1ZSIsYS5heGlzSW5kZXg9byxhfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5jb29yZGluYXRlU3lzdGVtLmdldE1vZGVsKCkuZ2V0KCJsYXlvdXQiKX0sZX0oYWIpO2Z1bmN0aW9uIHprKHQsZSxuLGkscixvKXt0PXR8fDA7dmFyIGE9blsxXS1uWzBdO2lmKG51bGwhPXImJihyPUJrKHIsWzAsYV0pKSxudWxsIT1vJiYobz1NYXRoLm1heChvLG51bGwhPXI/cjowKSksImFsbCI9PT1pKXt2YXIgcz1NYXRoLmFicyhlWzFdLWVbMF0pO3M9QmsocyxbMCxhXSkscj1vPUJrKHMsW3Isb10pLGk9MH1lWzBdPUJrKGVbMF0sbiksZVsxXT1CayhlWzFdLG4pO3ZhciBsPVZrKGUsaSk7ZVtpXSs9dDt2YXIgdSxoPXJ8fDAsYz1uLnNsaWNlKCk7cmV0dXJuIGwuc2lnbjwwP2NbMF0rPWg6Y1sxXS09aCxlW2ldPUJrKGVbaV0sYyksdT1WayhlLGkpLG51bGwhPXImJih1LnNpZ24hPT1sLnNpZ258fHUuc3BhbjxyKSYmKGVbMS1pXT1lW2ldK2wuc2lnbipyKSx1PVZrKGUsaSksbnVsbCE9byYmdS5zcGFuPm8mJihlWzEtaV09ZVtpXSt1LnNpZ24qbyksZX1mdW5jdGlvbiBWayh0LGUpe3ZhciBuPXRbZV0tdFsxLWVdO3JldHVybntzcGFuOk1hdGguYWJzKG4pLHNpZ246bj4wPy0xOm48MD8xOmU/LTE6MX19ZnVuY3Rpb24gQmsodCxlKXtyZXR1cm4gTWF0aC5taW4obnVsbCE9ZVsxXT9lWzFdOjEvMCxNYXRoLm1heChudWxsIT1lWzBdP2VbMF06LTEvMCx0KSl9dmFyIEZrPUUsR2s9TWF0aC5taW4sV2s9TWF0aC5tYXgsSGs9TWF0aC5mbG9vcixZaz1NYXRoLmNlaWwsWGs9SnIsVWs9TWF0aC5QSSxaaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMudHlwZT0icGFyYWxsZWwiLHRoaXMuX2F4ZXNNYXA9eXQoKSx0aGlzLl9heGVzTGF5b3V0PXt9LHRoaXMuZGltZW5zaW9ucz10LmRpbWVuc2lvbnMsdGhpcy5fbW9kZWw9dCx0aGlzLl9pbml0KHQsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuZGltZW5zaW9ucyxyPXQucGFyYWxsZWxBeGlzSW5kZXg7RmsoaSwoZnVuY3Rpb24odCxuKXt2YXIgaT1yW25dLG89ZS5nZXRDb21wb25lbnQoInBhcmFsbGVsQXhpcyIsaSksYT10aGlzLl9heGVzTWFwLnNldCh0LG5ldyBFayh0LGJfKG8pLFswLDBdLG8uZ2V0KCJ0eXBlIiksaSkpLHM9ImNhdGVnb3J5Ij09PWEudHlwZTthLm9uQmFuZD1zJiZvLmdldCgiYm91bmRhcnlHYXAiKSxhLmludmVyc2U9by5nZXQoImludmVyc2UiKSxvLmF4aXM9YSxhLm1vZGVsPW8sYS5jb29yZGluYXRlU3lzdGVtPW8uY29vcmRpbmF0ZVN5c3RlbT10aGlzfSksdGhpcyl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX3VwZGF0ZUF4ZXNGcm9tU2VyaWVzKHRoaXMuX21vZGVsLHQpfSx0LnByb3RvdHlwZS5jb250YWluUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFrZUxheW91dEluZm8oKSxuPWUuYXhpc0Jhc2UsaT1lLmxheW91dEJhc2Uscj1lLnBpeGVsRGltSW5kZXgsbz10WzEtcl0sYT10W3JdO3JldHVybiBvPj1uJiZvPD1uK2UuYXhpc0xlbmd0aCYmYT49aSYmYTw9aStlLmxheW91dExlbmd0aH0sdC5wcm90b3R5cGUuZ2V0TW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWx9LHQucHJvdG90eXBlLl91cGRhdGVBeGVzRnJvbVNlcmllcz1mdW5jdGlvbih0LGUpe2UuZWFjaFNlcmllcygoZnVuY3Rpb24obil7aWYodC5jb250YWlucyhuLGUpKXt2YXIgaT1uLmdldERhdGEoKTtGayh0aGlzLmRpbWVuc2lvbnMsKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2F4ZXNNYXAuZ2V0KHQpO2Uuc2NhbGUudW5pb25FeHRlbnRGcm9tRGF0YShpLGkubWFwRGltZW5zaW9uKHQpKSxfXyhlLnNjYWxlLGUubW9kZWwpfSksdGhpcyl9fSksdGhpcyl9LHQucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3RoaXMuX3JlY3Q9a3AodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSksdGhpcy5fbGF5b3V0QXhlcygpfSx0LnByb3RvdHlwZS5nZXRSZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3R9LHQucHJvdG90eXBlLl9tYWtlTGF5b3V0SW5mbz1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fbW9kZWwsbj10aGlzLl9yZWN0LGk9WyJ4IiwieSJdLHI9WyJ3aWR0aCIsImhlaWdodCJdLG89ZS5nZXQoImxheW91dCIpLGE9Imhvcml6b250YWwiPT09bz8wOjEscz1uW3JbYV1dLGw9WzAsc10sdT10aGlzLmRpbWVuc2lvbnMubGVuZ3RoLGg9amsoZS5nZXQoImF4aXNFeHBhbmRXaWR0aCIpLGwpLGM9amsoZS5nZXQoImF4aXNFeHBhbmRDb3VudCIpfHwwLFswLHVdKSxwPWUuZ2V0KCJheGlzRXhwYW5kYWJsZSIpJiZ1PjMmJnU+YyYmYz4xJiZoPjAmJnM+MCxkPWUuZ2V0KCJheGlzRXhwYW5kV2luZG93Iik7ZD8odD1qayhkWzFdLWRbMF0sbCksZFsxXT1kWzBdK3QpOih0PWprKGgqKGMtMSksbCksKGQ9W2gqKGUuZ2V0KCJheGlzRXhwYW5kQ2VudGVyIil8fEhrKHUvMikpLXQvMl0pWzFdPWRbMF0rdCk7dmFyIGY9KHMtdCkvKHUtYyk7ZjwzJiYoZj0wKTt2YXIgZz1bSGsoWGsoZFswXS9oLDEpKSsxLFlrKFhrKGRbMV0vaCwxKSktMV0seT1mL2gqZFswXTtyZXR1cm57bGF5b3V0Om8scGl4ZWxEaW1JbmRleDphLGxheW91dEJhc2U6bltpW2FdXSxsYXlvdXRMZW5ndGg6cyxheGlzQmFzZTpuW2lbMS1hXV0sYXhpc0xlbmd0aDpuW3JbMS1hXV0sYXhpc0V4cGFuZGFibGU6cCxheGlzRXhwYW5kV2lkdGg6aCxheGlzQ29sbGFwc2VXaWR0aDpmLGF4aXNFeHBhbmRXaW5kb3c6ZCxheGlzQ291bnQ6dSx3aW5Jbm5lckluZGljZXM6ZyxheGlzRXhwYW5kV2luZG93MFBvczp5fX0sdC5wcm90b3R5cGUuX2xheW91dEF4ZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWN0LGU9dGhpcy5fYXhlc01hcCxuPXRoaXMuZGltZW5zaW9ucyxpPXRoaXMuX21ha2VMYXlvdXRJbmZvKCkscj1pLmxheW91dDtlLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPVswLGkuYXhpc0xlbmd0aF0sbj10LmludmVyc2U/MTowO3Quc2V0RXh0ZW50KGVbbl0sZVsxLW5dKX0pKSxGayhuLChmdW5jdGlvbihlLG4pe3ZhciBvPShpLmF4aXNFeHBhbmRhYmxlP0trOnFrKShuLGkpLGE9e2hvcml6b250YWw6e3g6by5wb3NpdGlvbix5OmkuYXhpc0xlbmd0aH0sdmVydGljYWw6e3g6MCx5Om8ucG9zaXRpb259fSxzPXtob3Jpem9udGFsOlVrLzIsdmVydGljYWw6MH0sbD1bYVtyXS54K3QueCxhW3JdLnkrdC55XSx1PXNbcl0saD1bMSwwLDAsMSwwLDBdO1NlKGgsaCx1KSx3ZShoLGgsbCksdGhpcy5fYXhlc0xheW91dFtlXT17cG9zaXRpb246bCxyb3RhdGlvbjp1LHRyYW5zZm9ybTpoLGF4aXNOYW1lQXZhaWxhYmxlV2lkdGg6by5heGlzTmFtZUF2YWlsYWJsZVdpZHRoLGF4aXNMYWJlbFNob3c6by5heGlzTGFiZWxTaG93LG5hbWVUcnVuY2F0ZU1heFdpZHRoOm8ubmFtZVRydW5jYXRlTWF4V2lkdGgsdGlja0RpcmVjdGlvbjoxLGxhYmVsRGlyZWN0aW9uOjF9fSksdGhpcyl9LHQucHJvdG90eXBlLmdldEF4aXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2F4ZXNNYXAuZ2V0KHQpfSx0LnByb3RvdHlwZS5kYXRhVG9Qb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmF4aXNDb29yZFRvUG9pbnQodGhpcy5fYXhlc01hcC5nZXQoZSkuZGF0YVRvQ29vcmQodCksZSl9LHQucHJvdG90eXBlLmVhY2hBY3RpdmVTdGF0ZT1mdW5jdGlvbih0LGUsbixpKXtudWxsPT1uJiYobj0wKSxudWxsPT1pJiYoaT10LmNvdW50KCkpO3ZhciByPXRoaXMuX2F4ZXNNYXAsbz10aGlzLmRpbWVuc2lvbnMsYT1bXSxzPVtdO0UobywoZnVuY3Rpb24oZSl7YS5wdXNoKHQubWFwRGltZW5zaW9uKGUpKSxzLnB1c2goci5nZXQoZSkubW9kZWwpfSkpO2Zvcih2YXIgbD10aGlzLmhhc0F4aXNCcnVzaGVkKCksdT1uO3U8aTt1Kyspe3ZhciBoPXZvaWQgMDtpZihsKXtoPSJhY3RpdmUiO2Zvcih2YXIgYz10LmdldFZhbHVlcyhhLHUpLHA9MCxkPW8ubGVuZ3RoO3A8ZDtwKyspe2lmKCJpbmFjdGl2ZSI9PT1zW3BdLmdldEFjdGl2ZVN0YXRlKGNbcF0pKXtoPSJpbmFjdGl2ZSI7YnJlYWt9fX1lbHNlIGg9Im5vcm1hbCI7ZShoLHUpfX0sdC5wcm90b3R5cGUuaGFzQXhpc0JydXNoZWQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5kaW1lbnNpb25zLGU9dGhpcy5fYXhlc01hcCxuPSExLGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspIm5vcm1hbCIhPT1lLmdldCh0W2ldKS5tb2RlbC5nZXRBY3RpdmVTdGF0ZSgpJiYobj0hMCk7cmV0dXJuIG59LHQucHJvdG90eXBlLmF4aXNDb29yZFRvUG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gRmgoW3QsMF0sdGhpcy5fYXhlc0xheW91dFtlXS50cmFuc2Zvcm0pfSx0LnByb3RvdHlwZS5nZXRBeGlzTGF5b3V0PWZ1bmN0aW9uKHQpe3JldHVybiBUKHRoaXMuX2F4ZXNMYXlvdXRbdF0pfSx0LnByb3RvdHlwZS5nZXRTbGlkZWRBeGlzRXhwYW5kV2luZG93PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21ha2VMYXlvdXRJbmZvKCksbj1lLnBpeGVsRGltSW5kZXgsaT1lLmF4aXNFeHBhbmRXaW5kb3cuc2xpY2UoKSxyPWlbMV0taVswXSxvPVswLGUuYXhpc0V4cGFuZFdpZHRoKihlLmF4aXNDb3VudC0xKV07aWYoIXRoaXMuY29udGFpblBvaW50KHQpKXJldHVybntiZWhhdmlvcjoibm9uZSIsYXhpc0V4cGFuZFdpbmRvdzppfTt2YXIgYSxzPXRbbl0tZS5sYXlvdXRCYXNlLWUuYXhpc0V4cGFuZFdpbmRvdzBQb3MsbD0ic2xpZGUiLHU9ZS5heGlzQ29sbGFwc2VXaWR0aCxoPXRoaXMuX21vZGVsLmdldCgiYXhpc0V4cGFuZFNsaWRlVHJpZ2dlckFyZWEiKSxjPW51bGwhPWhbMF07aWYodSljJiZ1JiZzPHIqaFswXT8obD0ianVtcCIsYT1zLXIqaFsyXSk6YyYmdSYmcz5yKigxLWhbMF0pPyhsPSJqdW1wIixhPXMtciooMS1oWzJdKSk6KGE9cy1yKmhbMV0pPj0wJiYoYT1zLXIqKDEtaFsxXSkpPD0wJiYoYT0wKSwoYSo9ZS5heGlzRXhwYW5kV2lkdGgvdSk/emsoYSxpLG8sImFsbCIpOmw9Im5vbmUiO2Vsc2V7dmFyIHA9aVsxXS1pWzBdOyhpPVtXaygwLG9bMV0qcy9wLXAvMildKVsxXT1HayhvWzFdLGlbMF0rcCksaVswXT1pWzFdLXB9cmV0dXJue2F4aXNFeHBhbmRXaW5kb3c6aSxiZWhhdmlvcjpsfX0sdH0oKTtmdW5jdGlvbiBqayh0LGUpe3JldHVybiBHayhXayh0LGVbMF0pLGVbMV0pfWZ1bmN0aW9uIHFrKHQsZSl7dmFyIG49ZS5sYXlvdXRMZW5ndGgvKGUuYXhpc0NvdW50LTEpO3JldHVybntwb3NpdGlvbjpuKnQsYXhpc05hbWVBdmFpbGFibGVXaWR0aDpuLGF4aXNMYWJlbFNob3c6ITB9fWZ1bmN0aW9uIEtrKHQsZSl7dmFyIG4saSxyPWUubGF5b3V0TGVuZ3RoLG89ZS5heGlzRXhwYW5kV2lkdGgsYT1lLmF4aXNDb3VudCxzPWUuYXhpc0NvbGxhcHNlV2lkdGgsbD1lLndpbklubmVySW5kaWNlcyx1PXMsaD0hMTtyZXR1cm4gdDxsWzBdPyhuPXQqcyxpPXMpOnQ8PWxbMV0/KG49ZS5heGlzRXhwYW5kV2luZG93MFBvcyt0Km8tZS5heGlzRXhwYW5kV2luZG93WzBdLHU9byxoPSEwKToobj1yLShhLTEtdCkqcyxpPXMpLHtwb3NpdGlvbjpuLGF4aXNOYW1lQXZhaWxhYmxlV2lkdGg6dSxheGlzTGFiZWxTaG93OmgsbmFtZVRydW5jYXRlTWF4V2lkdGg6aX19dmFyICRrPXtjcmVhdGU6ZnVuY3Rpb24odCxlKXt2YXIgbj1bXTtyZXR1cm4gdC5lYWNoQ29tcG9uZW50KCJwYXJhbGxlbCIsKGZ1bmN0aW9uKGkscil7dmFyIG89bmV3IFprKGksdCxlKTtvLm5hbWU9InBhcmFsbGVsXyIrcixvLnJlc2l6ZShpLGUpLGkuY29vcmRpbmF0ZVN5c3RlbT1vLG8ubW9kZWw9aSxuLnB1c2gobyl9KSksdC5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXtpZigicGFyYWxsZWwiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSl7dmFyIGU9dC5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJwYXJhbGxlbCIsV28pLm1vZGVsc1swXTt0LmNvb3JkaW5hdGVTeXN0ZW09ZS5jb29yZGluYXRlU3lzdGVtfX0pKSxufX0sSms9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmFjdGl2ZUludGVydmFscz1bXSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0QXJlYVNlbGVjdFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGlhKFtbImZpbGwiLCJjb2xvciJdLFsibGluZVdpZHRoIiwiYm9yZGVyV2lkdGgiXSxbInN0cm9rZSIsImJvcmRlckNvbG9yIl0sWyJ3aWR0aCIsIndpZHRoIl0sWyJvcGFjaXR5Iiwib3BhY2l0eSJdXSkodGhpcy5nZXRNb2RlbCgiYXJlYVNlbGVjdFN0eWxlIikpfSxlLnByb3RvdHlwZS5zZXRBY3RpdmVJbnRlcnZhbHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hY3RpdmVJbnRlcnZhbHM9VCh0KTtpZihlKWZvcih2YXIgbj1lLmxlbmd0aC0xO24+PTA7bi0tKVFyKGVbbl0pfSxlLnByb3RvdHlwZS5nZXRBY3RpdmVTdGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFjdGl2ZUludGVydmFscztpZighZS5sZW5ndGgpcmV0dXJuIm5vcm1hbCI7aWYobnVsbD09dHx8aXNOYU4oK3QpKXJldHVybiJpbmFjdGl2ZSI7aWYoMT09PWUubGVuZ3RoKXt2YXIgbj1lWzBdO2lmKG5bMF08PXQmJnQ8PW5bMV0pcmV0dXJuImFjdGl2ZSJ9ZWxzZSBmb3IodmFyIGk9MCxyPWUubGVuZ3RoO2k8cjtpKyspaWYoZVtpXVswXTw9dCYmdDw9ZVtpXVsxXSlyZXR1cm4iYWN0aXZlIjtyZXR1cm4iaW5hY3RpdmUifSxlfSh6cCk7UihKayxEXyk7dmFyIFFrPSEwLHRMPU1hdGgubWluLGVMPU1hdGgubWF4LG5MPU1hdGgucG93LGlMPSJnbG9iYWxQYW4iLHJMPXt3OlswLDBdLGU6WzAsMV0sbjpbMSwwXSxzOlsxLDFdfSxvTD17dzoiZXciLGU6ImV3IixuOiJucyIsczoibnMiLG5lOiJuZXN3IixzdzoibmVzdyIsbnc6Im53c2UiLHNlOiJud3NlIn0sYUw9e2JydXNoU3R5bGU6e2xpbmVXaWR0aDoyLHN0cm9rZToicmdiYSgyMTAsMjE5LDIzOCwwLjMpIixmaWxsOiIjRDJEQkVFIn0sdHJhbnNmb3JtYWJsZTohMCxicnVzaE1vZGU6InNpbmdsZSIscmVtb3ZlT25DbGljazohMX0sc0w9MCxsTD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5fdHJhY2s9W10sbi5fY292ZXJzPVtdLG4uX2hhbmRsZXJzPXt9LG4uX3pyPWUsbi5ncm91cD1uZXcgQnIsbi5fdWlkPSJicnVzaENvbnRyb2xsZXJfIitzTCsrLEUoTkwsKGZ1bmN0aW9uKHQsZSl7dGhpcy5faGFuZGxlcnNbZV09Vyh0LHRoaXMpfSksbiksbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmVuYWJsZUJydXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9icnVzaFR5cGUmJnRoaXMuX2RvRGlzYWJsZUJydXNoKCksdC5icnVzaFR5cGUmJnRoaXMuX2RvRW5hYmxlQnJ1c2godCksdGhpc30sZS5wcm90b3R5cGUuX2RvRW5hYmxlQnJ1c2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fenI7dGhpcy5fZW5hYmxlR2xvYmFsUGFufHxmdW5jdGlvbih0LGUsbil7ZVQodClbZV09bn0oZSxpTCx0aGlzLl91aWQpLEUodGhpcy5faGFuZGxlcnMsKGZ1bmN0aW9uKHQsbil7ZS5vbihuLHQpfSkpLHRoaXMuX2JydXNoVHlwZT10LmJydXNoVHlwZSx0aGlzLl9icnVzaE9wdGlvbj1DKFQoYUwpLHQsITApfSxlLnByb3RvdHlwZS5fZG9EaXNhYmxlQnJ1c2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl96cjshZnVuY3Rpb24odCxlLG4pe3ZhciBpPWVUKHQpO2lbZV09PT1uJiYoaVtlXT1udWxsKX0odCxpTCx0aGlzLl91aWQpLEUodGhpcy5faGFuZGxlcnMsKGZ1bmN0aW9uKGUsbil7dC5vZmYobixlKX0pKSx0aGlzLl9icnVzaFR5cGU9dGhpcy5fYnJ1c2hPcHRpb249bnVsbH0sZS5wcm90b3R5cGUuc2V0UGFuZWxzPWZ1bmN0aW9uKHQpe2lmKHQmJnQubGVuZ3RoKXt2YXIgZT10aGlzLl9wYW5lbHM9e307RSh0LChmdW5jdGlvbih0KXtlW3QucGFuZWxJZF09VCh0KX0pKX1lbHNlIHRoaXMuX3BhbmVscz1udWxsO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5tb3VudD1mdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMuX2VuYWJsZUdsb2JhbFBhbj10LmVuYWJsZUdsb2JhbFBhbjt2YXIgZT10aGlzLmdyb3VwO3JldHVybiB0aGlzLl96ci5hZGQoZSksZS5hdHRyKHt4OnQueHx8MCx5OnQueXx8MCxyb3RhdGlvbjp0LnJvdGF0aW9ufHwwLHNjYWxlWDp0LnNjYWxlWHx8MSxzY2FsZVk6dC5zY2FsZVl8fDF9KSx0aGlzLl90cmFuc2Zvcm09ZS5nZXRMb2NhbFRyYW5zZm9ybSgpLHRoaXN9LGUucHJvdG90eXBlLnVwZGF0ZUNvdmVycz1mdW5jdGlvbih0KXt0PXoodCwoZnVuY3Rpb24odCl7cmV0dXJuIEMoVChhTCksdCwhMCl9KSk7dmFyIGU9dGhpcy5fY292ZXJzLG49dGhpcy5fY292ZXJzPVtdLGk9dGhpcyxyPXRoaXMuX2NyZWF0aW5nQ292ZXI7cmV0dXJuIG5ldyBHbShlLHQsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8odC5fX2JydXNoT3B0aW9uLGUpfSksbykuYWRkKGEpLnVwZGF0ZShhKS5yZW1vdmUoKGZ1bmN0aW9uKHQpe2VbdF0hPT1yJiZpLmdyb3VwLnJlbW92ZShlW3RdKX0pKS5leGVjdXRlKCksdGhpcztmdW5jdGlvbiBvKHQsZSl7cmV0dXJuKG51bGwhPXQuaWQ/dC5pZDoiXDAtYnJ1c2gtaW5kZXgtIitlKSsiLSIrdC5icnVzaFR5cGV9ZnVuY3Rpb24gYShvLGEpe3ZhciBzPXRbb107aWYobnVsbCE9YSYmZVthXT09PXIpbltvXT1lW2FdO2Vsc2V7dmFyIGw9bltvXT1udWxsIT1hPyhlW2FdLl9fYnJ1c2hPcHRpb249cyxlW2FdKTpoTChpLHVMKGkscykpO2RMKGksbCl9fX0sZS5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuYWJsZUJydXNoKCExKSx2TCh0aGlzKSx0aGlzLl96ci5yZW1vdmUodGhpcy5ncm91cCksdGhpc30sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMudW5tb3VudCgpLHRoaXMub2ZmKCl9LGV9KGp0KTtmdW5jdGlvbiB1TCh0LGUpe3ZhciBuPXpMW2UuYnJ1c2hUeXBlXS5jcmVhdGVDb3Zlcih0LGUpO3JldHVybiBuLl9fYnJ1c2hPcHRpb249ZSxwTChuLGUpLHQuZ3JvdXAuYWRkKG4pLG59ZnVuY3Rpb24gaEwodCxlKXt2YXIgbj1mTChlKTtyZXR1cm4gbi5lbmRDcmVhdGluZyYmKG4uZW5kQ3JlYXRpbmcodCxlKSxwTChlLGUuX19icnVzaE9wdGlvbikpLGV9ZnVuY3Rpb24gY0wodCxlKXt2YXIgbj1lLl9fYnJ1c2hPcHRpb247ZkwoZSkudXBkYXRlQ292ZXJTaGFwZSh0LGUsbi5yYW5nZSxuKX1mdW5jdGlvbiBwTCh0LGUpe3ZhciBuPWUuejtudWxsPT1uJiYobj0xZTQpLHQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe3Quej1uLHQuejI9bn0pKX1mdW5jdGlvbiBkTCh0LGUpe2ZMKGUpLnVwZGF0ZUNvbW1vbih0LGUpLGNMKHQsZSl9ZnVuY3Rpb24gZkwodCl7cmV0dXJuIHpMW3QuX19icnVzaE9wdGlvbi5icnVzaFR5cGVdfWZ1bmN0aW9uIGdMKHQsZSxuKXt2YXIgaSxyPXQuX3BhbmVscztpZighcilyZXR1cm4gUWs7dmFyIG89dC5fdHJhbnNmb3JtO3JldHVybiBFKHIsKGZ1bmN0aW9uKHQpe3QuaXNUYXJnZXRCeUN1cnNvcihlLG4sbykmJihpPXQpfSkpLGl9ZnVuY3Rpb24geUwodCxlKXt2YXIgbj10Ll9wYW5lbHM7aWYoIW4pcmV0dXJuIFFrO3ZhciBpPWUuX19icnVzaE9wdGlvbi5wYW5lbElkO3JldHVybiBudWxsIT1pP25baV06UWt9ZnVuY3Rpb24gdkwodCl7dmFyIGU9dC5fY292ZXJzLG49ZS5sZW5ndGg7cmV0dXJuIEUoZSwoZnVuY3Rpb24oZSl7dC5ncm91cC5yZW1vdmUoZSl9KSx0KSxlLmxlbmd0aD0wLCEhbn1mdW5jdGlvbiBtTCh0LGUpe3ZhciBuPXoodC5fY292ZXJzLChmdW5jdGlvbih0KXt2YXIgZT10Ll9fYnJ1c2hPcHRpb24sbj1UKGUucmFuZ2UpO3JldHVybnticnVzaFR5cGU6ZS5icnVzaFR5cGUscGFuZWxJZDplLnBhbmVsSWQscmFuZ2U6bn19KSk7dC50cmlnZ2VyKCJicnVzaCIse2FyZWFzOm4saXNFbmQ6ISFlLmlzRW5kLHJlbW92ZU9uQ2xpY2s6ISFlLnJlbW92ZU9uQ2xpY2t9KX1mdW5jdGlvbiB4TCh0KXt2YXIgZT10Lmxlbmd0aC0xO3JldHVybiBlPDAmJihlPTApLFt0WzBdLHRbZV1dfWZ1bmN0aW9uIF9MKHQsZSxuLGkpe3ZhciByPW5ldyBCcjtyZXR1cm4gci5hZGQobmV3IFdzKHtuYW1lOiJtYWluIixzdHlsZTpNTChuKSxzaWxlbnQ6ITAsZHJhZ2dhYmxlOiEwLGN1cnNvcjoibW92ZSIsZHJpZnQ6SChDTCx0LGUscixbIm4iLCJzIiwidyIsImUiXSksb25kcmFnZW5kOkgobUwsZSx7aXNFbmQ6ITB9KX0pKSxFKGksKGZ1bmN0aW9uKG4pe3IuYWRkKG5ldyBXcyh7bmFtZTpuLmpvaW4oIiIpLHN0eWxlOntvcGFjaXR5OjB9LGRyYWdnYWJsZTohMCxzaWxlbnQ6ITAsaW52aXNpYmxlOiEwLGRyaWZ0OkgoQ0wsdCxlLHIsbiksb25kcmFnZW5kOkgobUwsZSx7aXNFbmQ6ITB9KX0pKX0pKSxyfWZ1bmN0aW9uIGJMKHQsZSxuLGkpe3ZhciByPWkuYnJ1c2hTdHlsZS5saW5lV2lkdGh8fDAsbz1lTChyLDYpLGE9blswXVswXSxzPW5bMV1bMF0sbD1hLXIvMix1PXMtci8yLGg9blswXVsxXSxjPW5bMV1bMV0scD1oLW8rci8yLGQ9Yy1vK3IvMixmPWgtYSxnPWMtcyx5PWYrcix2PWcrcjtTTCh0LGUsIm1haW4iLGEscyxmLGcpLGkudHJhbnNmb3JtYWJsZSYmKFNMKHQsZSwidyIsbCx1LG8sdiksU0wodCxlLCJlIixwLHUsbyx2KSxTTCh0LGUsIm4iLGwsdSx5LG8pLFNMKHQsZSwicyIsbCxkLHksbyksU0wodCxlLCJudyIsbCx1LG8sbyksU0wodCxlLCJuZSIscCx1LG8sbyksU0wodCxlLCJzdyIsbCxkLG8sbyksU0wodCxlLCJzZSIscCxkLG8sbykpfWZ1bmN0aW9uIHdMKHQsZSl7dmFyIG49ZS5fX2JydXNoT3B0aW9uLGk9bi50cmFuc2Zvcm1hYmxlLHI9ZS5jaGlsZEF0KDApO3IudXNlU3R5bGUoTUwobikpLHIuYXR0cih7c2lsZW50OiFpLGN1cnNvcjppPyJtb3ZlIjoiZGVmYXVsdCJ9KSxFKFtbInciXSxbImUiXSxbIm4iXSxbInMiXSxbInMiLCJlIl0sWyJzIiwidyJdLFsibiIsImUiXSxbIm4iLCJ3Il1dLChmdW5jdGlvbihuKXt2YXIgcj1lLmNoaWxkT2ZOYW1lKG4uam9pbigiIikpLG89MT09PW4ubGVuZ3RoP1RMKHQsblswXSk6ZnVuY3Rpb24odCxlKXt2YXIgbj1bVEwodCxlWzBdKSxUTCh0LGVbMV0pXTtyZXR1cm4oImUiPT09blswXXx8InciPT09blswXSkmJm4ucmV2ZXJzZSgpLG4uam9pbigiIil9KHQsbik7ciYmci5hdHRyKHtzaWxlbnQ6IWksaW52aXNpYmxlOiFpLGN1cnNvcjppP29MW29dKyItcmVzaXplIjpudWxsfSl9KSl9ZnVuY3Rpb24gU0wodCxlLG4saSxyLG8sYSl7dmFyIHM9ZS5jaGlsZE9mTmFtZShuKTtzJiZzLnNldFNoYXBlKGZ1bmN0aW9uKHQpe3ZhciBlPXRMKHRbMF1bMF0sdFsxXVswXSksbj10TCh0WzBdWzFdLHRbMV1bMV0pLGk9ZUwodFswXVswXSx0WzFdWzBdKSxyPWVMKHRbMF1bMV0sdFsxXVsxXSk7cmV0dXJue3g6ZSx5Om4sd2lkdGg6aS1lLGhlaWdodDpyLW59fShrTCh0LGUsW1tpLHJdLFtpK28scithXV0pKSl9ZnVuY3Rpb24gTUwodCl7cmV0dXJuIGsoe3N0cm9rZU5vU2NhbGU6ITB9LHQuYnJ1c2hTdHlsZSl9ZnVuY3Rpb24gSUwodCxlLG4saSl7dmFyIHI9W3RMKHQsbiksdEwoZSxpKV0sbz1bZUwodCxuKSxlTChlLGkpXTtyZXR1cm5bW3JbMF0sb1swXV0sW3JbMV0sb1sxXV1dfWZ1bmN0aW9uIFRMKHQsZSl7dmFyIG49R2goe3c6ImxlZnQiLGU6InJpZ2h0IixuOiJ0b3AiLHM6ImJvdHRvbSJ9W2VdLGZ1bmN0aW9uKHQpe3JldHVybiBCaCh0Lmdyb3VwKX0odCkpO3JldHVybntsZWZ0OiJ3IixyaWdodDoiZSIsdG9wOiJuIixib3R0b206InMifVtuXX1mdW5jdGlvbiBDTCh0LGUsbixpLHIsbyl7dmFyIGE9bi5fX2JydXNoT3B0aW9uLHM9dC50b1JlY3RSYW5nZShhLnJhbmdlKSxsPUFMKGUscixvKTtFKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXJMW3RdO3NbZVswXV1bZVsxXV0rPWxbZVswXV19KSksYS5yYW5nZT10LmZyb21SZWN0UmFuZ2UoSUwoc1swXVswXSxzWzFdWzBdLHNbMF1bMV0sc1sxXVsxXSkpLGRMKGUsbiksbUwoZSx7aXNFbmQ6ITF9KX1mdW5jdGlvbiBETCh0LGUsbixpKXt2YXIgcj1lLl9fYnJ1c2hPcHRpb24ucmFuZ2Usbz1BTCh0LG4saSk7RShyLChmdW5jdGlvbih0KXt0WzBdKz1vWzBdLHRbMV0rPW9bMV19KSksZEwodCxlKSxtTCh0LHtpc0VuZDohMX0pfWZ1bmN0aW9uIEFMKHQsZSxuKXt2YXIgaT10Lmdyb3VwLHI9aS50cmFuc2Zvcm1Db29yZFRvTG9jYWwoZSxuKSxvPWkudHJhbnNmb3JtQ29vcmRUb0xvY2FsKDAsMCk7cmV0dXJuW3JbMF0tb1swXSxyWzFdLW9bMV1dfWZ1bmN0aW9uIGtMKHQsZSxuKXt2YXIgaT15TCh0LGUpO3JldHVybiBpJiZpIT09UWs/aS5jbGlwUGF0aChuLHQuX3RyYW5zZm9ybSk6VChuKX1mdW5jdGlvbiBMTCh0KXt2YXIgZT10LmV2ZW50O2UucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBQTCh0LGUsbil7cmV0dXJuIHQuY2hpbGRPZk5hbWUoIm1haW4iKS5jb250YWluKGUsbil9ZnVuY3Rpb24gT0wodCxlLG4saSl7dmFyIHIsbz10Ll9jcmVhdGluZ0NvdmVyLGE9dC5fY3JlYXRpbmdQYW5lbCxzPXQuX2JydXNoT3B0aW9uO2lmKHQuX3RyYWNrLnB1c2gobi5zbGljZSgpKSxmdW5jdGlvbih0KXt2YXIgZT10Ll90cmFjaztpZighZS5sZW5ndGgpcmV0dXJuITE7dmFyIG49ZVtlLmxlbmd0aC0xXSxpPWVbMF0scj1uWzBdLWlbMF0sbz1uWzFdLWlbMV07cmV0dXJuIG5MKHIqcitvKm8sLjUpPjZ9KHQpfHxvKXtpZihhJiYhbyl7InNpbmdsZSI9PT1zLmJydXNoTW9kZSYmdkwodCk7dmFyIGw9VChzKTtsLmJydXNoVHlwZT1STChsLmJydXNoVHlwZSxhKSxsLnBhbmVsSWQ9YT09PVFrP251bGw6YS5wYW5lbElkLG89dC5fY3JlYXRpbmdDb3Zlcj11TCh0LGwpLHQuX2NvdmVycy5wdXNoKG8pfWlmKG8pe3ZhciB1PXpMW1JMKHQuX2JydXNoVHlwZSxhKV07by5fX2JydXNoT3B0aW9uLnJhbmdlPXUuZ2V0Q3JlYXRpbmdSYW5nZShrTCh0LG8sdC5fdHJhY2spKSxpJiYoaEwodCxvKSx1LnVwZGF0ZUNvbW1vbih0LG8pKSxjTCh0LG8pLHI9e2lzRW5kOml9fX1lbHNlIGkmJiJzaW5nbGUiPT09cy5icnVzaE1vZGUmJnMucmVtb3ZlT25DbGljayYmZ0wodCxlLG4pJiZ2TCh0KSYmKHI9e2lzRW5kOmkscmVtb3ZlT25DbGljazohMH0pO3JldHVybiByfWZ1bmN0aW9uIFJMKHQsZSl7cmV0dXJuImF1dG8iPT09dD9lLmRlZmF1bHRCcnVzaFR5cGU6dH12YXIgTkw9e21vdXNlZG93bjpmdW5jdGlvbih0KXtpZih0aGlzLl9kcmFnZ2luZylFTCh0aGlzLHQpO2Vsc2UgaWYoIXQudGFyZ2V0fHwhdC50YXJnZXQuZHJhZ2dhYmxlKXtMTCh0KTt2YXIgZT10aGlzLmdyb3VwLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0Lm9mZnNldFgsdC5vZmZzZXRZKTt0aGlzLl9jcmVhdGluZ0NvdmVyPW51bGwsKHRoaXMuX2NyZWF0aW5nUGFuZWw9Z0wodGhpcyx0LGUpKSYmKHRoaXMuX2RyYWdnaW5nPSEwLHRoaXMuX3RyYWNrPVtlLnNsaWNlKCldKX19LG1vdXNlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10Lm9mZnNldFgsbj10Lm9mZnNldFksaT10aGlzLmdyb3VwLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbChlLG4pO2lmKGZ1bmN0aW9uKHQsZSxuKXtpZih0Ll9icnVzaFR5cGUmJiFmdW5jdGlvbih0LGUsbil7dmFyIGk9dC5fenI7cmV0dXJuIGU8MHx8ZT5pLmdldFdpZHRoKCl8fG48MHx8bj5pLmdldEhlaWdodCgpfSh0LGUub2Zmc2V0WCxlLm9mZnNldFkpKXt2YXIgaT10Ll96cixyPXQuX2NvdmVycyxvPWdMKHQsZSxuKTtpZighdC5fZHJhZ2dpbmcpZm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBzPXJbYV0uX19icnVzaE9wdGlvbjtpZihvJiYobz09PVFrfHxzLnBhbmVsSWQ9PT1vLnBhbmVsSWQpJiZ6TFtzLmJydXNoVHlwZV0uY29udGFpbihyW2FdLG5bMF0sblsxXSkpcmV0dXJufW8mJmkuc2V0Q3Vyc29yU3R5bGUoImNyb3NzaGFpciIpfX0odGhpcyx0LGkpLHRoaXMuX2RyYWdnaW5nKXtMTCh0KTt2YXIgcj1PTCh0aGlzLHQsaSwhMSk7ciYmbUwodGhpcyxyKX19LG1vdXNldXA6ZnVuY3Rpb24odCl7RUwodGhpcyx0KX19O2Z1bmN0aW9uIEVMKHQsZSl7aWYodC5fZHJhZ2dpbmcpe0xMKGUpO3ZhciBuPWUub2Zmc2V0WCxpPWUub2Zmc2V0WSxyPXQuZ3JvdXAudHJhbnNmb3JtQ29vcmRUb0xvY2FsKG4saSksbz1PTCh0LGUsciwhMCk7dC5fZHJhZ2dpbmc9ITEsdC5fdHJhY2s9W10sdC5fY3JlYXRpbmdDb3Zlcj1udWxsLG8mJm1MKHQsbyl9fXZhciB6TD17bGluZVg6VkwoMCksbGluZVk6VkwoMSkscmVjdDp7Y3JlYXRlQ292ZXI6ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0fXJldHVybiBfTCh7dG9SZWN0UmFuZ2U6bixmcm9tUmVjdFJhbmdlOm59LHQsZSxbWyJ3Il0sWyJlIl0sWyJuIl0sWyJzIl0sWyJzIiwiZSJdLFsicyIsInciXSxbIm4iLCJlIl0sWyJuIiwidyJdXSl9LGdldENyZWF0aW5nUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9eEwodCk7cmV0dXJuIElMKGVbMV1bMF0sZVsxXVsxXSxlWzBdWzBdLGVbMF1bMV0pfSx1cGRhdGVDb3ZlclNoYXBlOmZ1bmN0aW9uKHQsZSxuLGkpe2JMKHQsZSxuLGkpfSx1cGRhdGVDb21tb246d0wsY29udGFpbjpQTH0scG9seWdvbjp7Y3JlYXRlQ292ZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgQnI7cmV0dXJuIG4uYWRkKG5ldyBadSh7bmFtZToibWFpbiIsc3R5bGU6TUwoZSksc2lsZW50OiEwfSkpLG59LGdldENyZWF0aW5nUmFuZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGVuZENyZWF0aW5nOmZ1bmN0aW9uKHQsZSl7ZS5yZW1vdmUoZS5jaGlsZEF0KDApKSxlLmFkZChuZXcgWHUoe25hbWU6Im1haW4iLGRyYWdnYWJsZTohMCxkcmlmdDpIKERMLHQsZSksb25kcmFnZW5kOkgobUwsdCx7aXNFbmQ6ITB9KX0pKX0sdXBkYXRlQ292ZXJTaGFwZTpmdW5jdGlvbih0LGUsbixpKXtlLmNoaWxkQXQoMCkuc2V0U2hhcGUoe3BvaW50czprTCh0LGUsbil9KX0sdXBkYXRlQ29tbW9uOndMLGNvbnRhaW46UEx9fTtmdW5jdGlvbiBWTCh0KXtyZXR1cm57Y3JlYXRlQ292ZXI6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gX0woe3RvUmVjdFJhbmdlOmZ1bmN0aW9uKGUpe3ZhciBuPVtlLFswLDEwMF1dO3JldHVybiB0JiZuLnJldmVyc2UoKSxufSxmcm9tUmVjdFJhbmdlOmZ1bmN0aW9uKGUpe3JldHVybiBlW3RdfX0sZSxuLFtbWyJ3Il0sWyJlIl1dLFtbIm4iXSxbInMiXV1dW3RdKX0sZ2V0Q3JlYXRpbmdSYW5nZTpmdW5jdGlvbihlKXt2YXIgbj14TChlKTtyZXR1cm5bdEwoblswXVt0XSxuWzFdW3RdKSxlTChuWzBdW3RdLG5bMV1bdF0pXX0sdXBkYXRlQ292ZXJTaGFwZTpmdW5jdGlvbihlLG4saSxyKXt2YXIgbyxhPXlMKGUsbik7aWYoYSE9PVFrJiZhLmdldExpbmVhckJydXNoT3RoZXJFeHRlbnQpbz1hLmdldExpbmVhckJydXNoT3RoZXJFeHRlbnQodCk7ZWxzZXt2YXIgcz1lLl96cjtvPVswLFtzLmdldFdpZHRoKCkscy5nZXRIZWlnaHQoKV1bMS10XV19dmFyIGw9W2ksb107dCYmbC5yZXZlcnNlKCksYkwoZSxuLGwscil9LHVwZGF0ZUNvbW1vbjp3TCxjb250YWluOlBMfX1mdW5jdGlvbiBCTCh0KXtyZXR1cm4gdD1XTCh0KSxmdW5jdGlvbihlKXtyZXR1cm4gWWgoZSx0KX19ZnVuY3Rpb24gRkwodCxlKXtyZXR1cm4gdD1XTCh0KSxmdW5jdGlvbihuKXt2YXIgaT1udWxsIT1lP2U6bixyPWk/dC53aWR0aDp0LmhlaWdodCxvPWk/dC54OnQueTtyZXR1cm5bbyxvKyhyfHwwKV19fWZ1bmN0aW9uIEdMKHQsZSxuKXt2YXIgaT1XTCh0KTtyZXR1cm4gZnVuY3Rpb24odCxyKXtyZXR1cm4gaS5jb250YWluKHJbMF0sclsxXSkmJiFoVCh0LGUsbil9fWZ1bmN0aW9uIFdMKHQpe3JldHVybiB6ZS5jcmVhdGUodCl9dmFyIEhMPVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSxZTD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGUsbil7dC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksKHRoaXMuX2JydXNoQ29udHJvbGxlcj1uZXcgbEwobi5nZXRacigpKSkub24oImJydXNoIixXKHRoaXMuX29uQnJ1c2gsdGhpcykpfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4saSl7aWYoIWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbiYmImF4aXNBcmVhU2VsZWN0Ij09PW4udHlwZSYmZS5maW5kQ29tcG9uZW50cyh7bWFpblR5cGU6InBhcmFsbGVsQXhpcyIscXVlcnk6bn0pWzBdPT09dH0odCxlLGkpKXt0aGlzLmF4aXNNb2RlbD10LHRoaXMuYXBpPW4sdGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgcj10aGlzLl9heGlzR3JvdXA7aWYodGhpcy5fYXhpc0dyb3VwPW5ldyBCcix0aGlzLmdyb3VwLmFkZCh0aGlzLl9heGlzR3JvdXApLHQuZ2V0KCJzaG93Iikpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0Q29tcG9uZW50KCJwYXJhbGxlbCIsdC5nZXQoInBhcmFsbGVsSW5kZXgiKSl9KHQsZSksYT1vLmNvb3JkaW5hdGVTeXN0ZW0scz10LmdldEFyZWFTZWxlY3RTdHlsZSgpLGw9cy53aWR0aCx1PXQuYXhpcy5kaW0saD1BKHtzdHJva2VDb250YWluVGhyZXNob2xkOmx9LGEuZ2V0QXhpc0xheW91dCh1KSksYz1uZXcgZEkodCxoKTtFKEhMLGMuYWRkLGMpLHRoaXMuX2F4aXNHcm91cC5hZGQoYy5nZXRHcm91cCgpKSx0aGlzLl9yZWZyZXNoQnJ1c2hDb250cm9sbGVyKGgscyx0LG8sbCxuKSxIaChyLHRoaXMuX2F4aXNHcm91cCx0KX19fSxlLnByb3RvdHlwZS5fcmVmcmVzaEJydXNoQ29udHJvbGxlcj1mdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIGE9bi5heGlzLmdldEV4dGVudCgpLHM9YVsxXS1hWzBdLGw9TWF0aC5taW4oMzAsLjEqTWF0aC5hYnMocykpLHU9emUuY3JlYXRlKHt4OmFbMF0seTotci8yLHdpZHRoOnMsaGVpZ2h0OnJ9KTt1LngtPWwsdS53aWR0aCs9MipsLHRoaXMuX2JydXNoQ29udHJvbGxlci5tb3VudCh7ZW5hYmxlR2xvYmFsUGFuOiEwLHJvdGF0aW9uOnQucm90YXRpb24seDp0LnBvc2l0aW9uWzBdLHk6dC5wb3NpdGlvblsxXX0pLnNldFBhbmVscyhbe3BhbmVsSWQ6InBsIixjbGlwUGF0aDpCTCh1KSxpc1RhcmdldEJ5Q3Vyc29yOkdMKHUsbyxpKSxnZXRMaW5lYXJCcnVzaE90aGVyRXh0ZW50OkZMKHUsMCl9XSkuZW5hYmxlQnJ1c2goe2JydXNoVHlwZToibGluZVgiLGJydXNoU3R5bGU6ZSxyZW1vdmVPbkNsaWNrOiEwfSkudXBkYXRlQ292ZXJzKGZ1bmN0aW9uKHQpe3ZhciBlPXQuYXhpcztyZXR1cm4geih0LmFjdGl2ZUludGVydmFscywoZnVuY3Rpb24odCl7cmV0dXJue2JydXNoVHlwZToibGluZVgiLHBhbmVsSWQ6InBsIixyYW5nZTpbZS5kYXRhVG9Db29yZCh0WzBdLCEwKSxlLmRhdGFUb0Nvb3JkKHRbMV0sITApXX19KSl9KG4pKX0sZS5wcm90b3R5cGUuX29uQnJ1c2g9ZnVuY3Rpb24odCl7dmFyIGU9dC5hcmVhcyxuPXRoaXMuYXhpc01vZGVsLGk9bi5heGlzLHI9eihlLChmdW5jdGlvbih0KXtyZXR1cm5baS5jb29yZFRvRGF0YSh0LnJhbmdlWzBdLCEwKSxpLmNvb3JkVG9EYXRhKHQucmFuZ2VbMV0sITApXX0pKTsoIW4ub3B0aW9uLnJlYWx0aW1lPT09dC5pc0VuZHx8dC5yZW1vdmVPbkNsaWNrKSYmdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImF4aXNBcmVhU2VsZWN0IixwYXJhbGxlbEF4aXNJZDpuLmlkLGludGVydmFsczpyfSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9icnVzaENvbnRyb2xsZXIuZGlzcG9zZSgpfSxlLnR5cGU9InBhcmFsbGVsQXhpcyIsZX0oQWcpO3ZhciBYTD17dHlwZToiYXhpc0FyZWFTZWxlY3QiLGV2ZW50OiJheGlzQXJlYVNlbGVjdGVkIn07dmFyIFVMPXt0eXBlOiJ2YWx1ZSIsYXJlYVNlbGVjdFN0eWxlOnt3aWR0aDoyMCxib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiJyZ2JhKDE2MCwxOTcsMjMyKSIsY29sb3I6InJnYmEoMTYwLDE5NywyMzIpIixvcGFjaXR5Oi4zfSxyZWFsdGltZTohMCx6OjEwfTtmdW5jdGlvbiBaTCh0KXt0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhQayksdC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKE5rKSx0LnJlZ2lzdGVyQ29vcmRpbmF0ZVN5c3RlbSgicGFyYWxsZWwiLCRrKSx0LnJlZ2lzdGVyUHJlcHJvY2Vzc29yKExrKSx0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoSmspLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KFlMKSxLTSh0LCJwYXJhbGxlbCIsSmssVUwpLGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJBY3Rpb24oWEwsKGZ1bmN0aW9uKHQsZSl7ZS5lYWNoQ29tcG9uZW50KHttYWluVHlwZToicGFyYWxsZWxBeGlzIixxdWVyeTp0fSwoZnVuY3Rpb24oZSl7ZS5heGlzLm1vZGVsLnNldEFjdGl2ZUludGVydmFscyh0LmludGVydmFscyl9KSl9KSksdC5yZWdpc3RlckFjdGlvbigicGFyYWxsZWxBeGlzRXhwYW5kIiwoZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJwYXJhbGxlbCIscXVlcnk6dH0sKGZ1bmN0aW9uKGUpe2Uuc2V0QXhpc0V4cGFuZCh0KX0pKX0pKX0odCl9dmFyIGpMPWZ1bmN0aW9uKCl7dGhpcy54MT0wLHRoaXMueTE9MCx0aGlzLngyPTAsdGhpcy55Mj0wLHRoaXMuY3B4MT0wLHRoaXMuY3B5MT0wLHRoaXMuY3B4Mj0wLHRoaXMuY3B5Mj0wLHRoaXMuZXh0ZW50PTB9LHFMPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBqTH0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5leHRlbnQ7dC5tb3ZlVG8oZS54MSxlLnkxKSx0LmJlemllckN1cnZlVG8oZS5jcHgxLGUuY3B5MSxlLmNweDIsZS5jcHkyLGUueDIsZS55MiksInZlcnRpY2FsIj09PWUub3JpZW50Pyh0LmxpbmVUbyhlLngyK24sZS55MiksdC5iZXppZXJDdXJ2ZVRvKGUuY3B4MituLGUuY3B5MixlLmNweDErbixlLmNweTEsZS54MStuLGUueTEpKToodC5saW5lVG8oZS54MixlLnkyK24pLHQuYmV6aWVyQ3VydmVUbyhlLmNweDIsZS5jcHkyK24sZS5jcHgxLGUuY3B5MStuLGUueDEsZS55MStuKSksdC5jbG9zZVBhdGgoKX0sZS5wcm90b3R5cGUuaGlnaGxpZ2h0PWZ1bmN0aW9uKCl7T2wodGhpcyl9LGUucHJvdG90eXBlLmRvd25wbGF5PWZ1bmN0aW9uKCl7UmwodGhpcyl9LGV9KGtzKSxLTD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4uX2ZvY3VzQWRqYWNlbmN5RGlzYWJsZWQ9ITEsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcyxyPXQuZ2V0R3JhcGgoKSxvPXRoaXMuZ3JvdXAsYT10LmxheW91dEluZm8scz1hLndpZHRoLGw9YS5oZWlnaHQsdT10LmdldERhdGEoKSxoPXQuZ2V0RGF0YSgiZWRnZSIpLGM9dC5nZXQoIm9yaWVudCIpO3RoaXMuX21vZGVsPXQsby5yZW1vdmVBbGwoKSxvLng9YS54LG8ueT1hLnksci5lYWNoRWRnZSgoZnVuY3Rpb24oZSl7dmFyIG49bmV3IHFMLGk9cmwobik7aS5kYXRhSW5kZXg9ZS5kYXRhSW5kZXgsaS5zZXJpZXNJbmRleD10LnNlcmllc0luZGV4LGkuZGF0YVR5cGU9ImVkZ2UiO3ZhciByLGEsdSxwLGQsZixnLHksdj1lLmdldE1vZGVsKCksbT12LmdldE1vZGVsKCJsaW5lU3R5bGUiKSx4PW0uZ2V0KCJjdXJ2ZW5lc3MiKSxfPWUubm9kZTEuZ2V0TGF5b3V0KCksYj1lLm5vZGUxLmdldE1vZGVsKCksdz1iLmdldCgibG9jYWxYIiksUz1iLmdldCgibG9jYWxZIiksTT1lLm5vZGUyLmdldExheW91dCgpLEk9ZS5ub2RlMi5nZXRNb2RlbCgpLFQ9SS5nZXQoImxvY2FsWCIpLEM9SS5nZXQoImxvY2FsWSIpLEQ9ZS5nZXRMYXlvdXQoKTtuLnNoYXBlLmV4dGVudD1NYXRoLm1heCgxLEQuZHkpLG4uc2hhcGUub3JpZW50PWMsInZlcnRpY2FsIj09PWM/KHI9KG51bGwhPXc/dypzOl8ueCkrRC5zeSxhPShudWxsIT1TP1MqbDpfLnkpK18uZHksdT0obnVsbCE9VD9UKnM6TS54KStELnR5LGQ9cixmPWEqKDEteCkrKHA9bnVsbCE9Qz9DKmw6TS55KSp4LGc9dSx5PWEqeCtwKigxLXgpKToocj0obnVsbCE9dz93KnM6Xy54KStfLmR4LGE9KG51bGwhPVM/UypsOl8ueSkrRC5zeSxkPXIqKDEteCkrKHU9bnVsbCE9VD9UKnM6TS54KSp4LGY9YSxnPXIqeCt1KigxLXgpLHk9cD0obnVsbCE9Qz9DKmw6TS55KStELnR5KSxuLnNldFNoYXBlKHt4MTpyLHkxOmEseDI6dSx5MjpwLGNweDE6ZCxjcHkxOmYsY3B4MjpnLGNweTI6eX0pLG4udXNlU3R5bGUobS5nZXRJdGVtU3R5bGUoKSksJEwobi5zdHlsZSxjLGUpO3ZhciBBPSIiK3YuZ2V0KCJ2YWx1ZSIpLGs9cmModiwiZWRnZUxhYmVsIik7aWMobixrLHtsYWJlbEZldGNoZXI6e2dldEZvcm1hdHRlZExhYmVsOmZ1bmN0aW9uKGUsbixpLHIsbyxhKXtyZXR1cm4gdC5nZXRGb3JtYXR0ZWRMYWJlbChlLG4sImVkZ2UiLHIsb3QobyxrLm5vcm1hbCYmay5ub3JtYWwuZ2V0KCJmb3JtYXR0ZXIiKSxBKSxhKX19LGxhYmVsRGF0YUluZGV4OmUuZGF0YUluZGV4LGRlZmF1bHRUZXh0OkF9KSxuLnNldFRleHRDb25maWcoe3Bvc2l0aW9uOiJpbnNpZGUifSk7dmFyIEw9di5nZXRNb2RlbCgiZW1waGFzaXMiKTskbChuLHYsImxpbmVTdHlsZSIsKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0SXRlbVN0eWxlKCk7cmV0dXJuICRMKG4sYyxlKSxufSkpLG8uYWRkKG4pLGguc2V0SXRlbUdyYXBoaWNFbChlLmRhdGFJbmRleCxuKTt2YXIgUD1MLmdldCgiZm9jdXMiKTtabChuLCJhZGphY2VuY3kiPT09UD9lLmdldEFkamFjZW50RGF0YUluZGljZXMoKToidHJhamVjdG9yeSI9PT1QP2UuZ2V0VHJhamVjdG9yeURhdGFJbmRpY2VzKCk6UCxMLmdldCgiYmx1clNjb3BlIiksTC5nZXQoImRpc2FibGVkIikpfSkpLHIuZWFjaE5vZGUoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0TGF5b3V0KCksaT1lLmdldE1vZGVsKCkscj1pLmdldCgibG9jYWxYIiksYT1pLmdldCgibG9jYWxZIiksaD1pLmdldE1vZGVsKCJlbXBoYXNpcyIpLGM9aS5nZXQoWyJpdGVtU3R5bGUiLCJib3JkZXJSYWRpdXMiXSl8fDAscD1uZXcgV3Moe3NoYXBlOnt4Om51bGwhPXI/cipzOm4ueCx5Om51bGwhPWE/YSpsOm4ueSx3aWR0aDpuLmR4LGhlaWdodDpuLmR5LHI6Y30sc3R5bGU6aS5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksejI6MTB9KTtpYyhwLHJjKGkpLHtsYWJlbEZldGNoZXI6e2dldEZvcm1hdHRlZExhYmVsOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuZ2V0Rm9ybWF0dGVkTGFiZWwoZSxuLCJub2RlIil9fSxsYWJlbERhdGFJbmRleDplLmRhdGFJbmRleCxkZWZhdWx0VGV4dDplLmlkfSkscC5kaXNhYmxlTGFiZWxBbmltYXRpb249ITAscC5zZXRTdHlsZSgiZmlsbCIsZS5nZXRWaXN1YWwoImNvbG9yIikpLHAuc2V0U3R5bGUoImRlY2FsIixlLmdldFZpc3VhbCgic3R5bGUiKS5kZWNhbCksJGwocCxpKSxvLmFkZChwKSx1LnNldEl0ZW1HcmFwaGljRWwoZS5kYXRhSW5kZXgscCkscmwocCkuZGF0YVR5cGU9Im5vZGUiO3ZhciBkPWguZ2V0KCJmb2N1cyIpO1psKHAsImFkamFjZW5jeSI9PT1kP2UuZ2V0QWRqYWNlbnREYXRhSW5kaWNlcygpOiJ0cmFqZWN0b3J5Ij09PWQ/ZS5nZXRUcmFqZWN0b3J5RGF0YUluZGljZXMoKTpkLGguZ2V0KCJibHVyU2NvcGUiKSxoLmdldCgiZGlzYWJsZWQiKSl9KSksdS5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24oZSxyKXt1LmdldEl0ZW1Nb2RlbChyKS5nZXQoImRyYWdnYWJsZSIpJiYoZS5kcmlmdD1mdW5jdGlvbihlLG8pe2kuX2ZvY3VzQWRqYWNlbmN5RGlzYWJsZWQ9ITAsdGhpcy5zaGFwZS54Kz1lLHRoaXMuc2hhcGUueSs9byx0aGlzLmRpcnR5KCksbi5kaXNwYXRjaEFjdGlvbih7dHlwZToiZHJhZ05vZGUiLHNlcmllc0lkOnQuaWQsZGF0YUluZGV4OnUuZ2V0UmF3SW5kZXgociksbG9jYWxYOnRoaXMuc2hhcGUueC9zLGxvY2FsWTp0aGlzLnNoYXBlLnkvbH0pfSxlLm9uZHJhZ2VuZD1mdW5jdGlvbigpe2kuX2ZvY3VzQWRqYWNlbmN5RGlzYWJsZWQ9ITF9LGUuZHJhZ2dhYmxlPSEwLGUuY3Vyc29yPSJtb3ZlIil9KSksIXRoaXMuX2RhdGEmJnQuaXNBbmltYXRpb25FbmFibGVkKCkmJm8uc2V0Q2xpcFBhdGgoZnVuY3Rpb24odCxlLG4pe3ZhciBpPW5ldyBXcyh7c2hhcGU6e3g6dC54LTEwLHk6dC55LTEwLHdpZHRoOjAsaGVpZ2h0OnQuaGVpZ2h0KzIwfX0pO3JldHVybiBtaChpLHtzaGFwZTp7d2lkdGg6dC53aWR0aCsyMH19LGUsbiksaX0oby5nZXRCb3VuZGluZ1JlY3QoKSx0LChmdW5jdGlvbigpe28ucmVtb3ZlQ2xpcFBhdGgoKX0pKSksdGhpcy5fZGF0YT10LmdldERhdGEoKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe30sZS50eXBlPSJzYW5rZXkiLGV9KE9nKTtmdW5jdGlvbiAkTCh0LGUsbil7c3dpdGNoKHQuZmlsbCl7Y2FzZSJzb3VyY2UiOnQuZmlsbD1uLm5vZGUxLmdldFZpc3VhbCgiY29sb3IiKSx0LmRlY2FsPW4ubm9kZTEuZ2V0VmlzdWFsKCJzdHlsZSIpLmRlY2FsO2JyZWFrO2Nhc2UidGFyZ2V0Ijp0LmZpbGw9bi5ub2RlMi5nZXRWaXN1YWwoImNvbG9yIiksdC5kZWNhbD1uLm5vZGUyLmdldFZpc3VhbCgic3R5bGUiKS5kZWNhbDticmVhaztjYXNlImdyYWRpZW50Ijp2YXIgaT1uLm5vZGUxLmdldFZpc3VhbCgiY29sb3IiKSxyPW4ubm9kZTIuZ2V0VmlzdWFsKCJjb2xvciIpO1UoaSkmJlUocikmJih0LmZpbGw9bmV3IG9oKDAsMCwrKCJob3Jpem9udGFsIj09PWUpLCsoInZlcnRpY2FsIj09PWUpLFt7Y29sb3I6aSxvZmZzZXQ6MH0se2NvbG9yOnIsb2Zmc2V0OjF9XSkpfX12YXIgSkw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmVkZ2VzfHx0LmxpbmtzLGk9dC5kYXRhfHx0Lm5vZGVzLHI9dC5sZXZlbHM7dGhpcy5sZXZlbE1vZGVscz1bXTtmb3IodmFyIG89dGhpcy5sZXZlbE1vZGVscyxhPTA7YTxyLmxlbmd0aDthKyspbnVsbCE9clthXS5kZXB0aCYmclthXS5kZXB0aD49MCYmKG9bclthXS5kZXB0aF09bmV3IENjKHJbYV0sdGhpcyxlKSk7aWYoaSYmbil7dmFyIHM9dWsoaSxuLHRoaXMsITAsKGZ1bmN0aW9uKHQsZSl7dC53cmFwTWV0aG9kKCJnZXRJdGVtTW9kZWwiLChmdW5jdGlvbih0LGUpe3ZhciBuPXQucGFyZW50TW9kZWwsaT1uLmdldERhdGEoKS5nZXRJdGVtTGF5b3V0KGUpO2lmKGkpe3ZhciByPWkuZGVwdGgsbz1uLmxldmVsTW9kZWxzW3JdO28mJih0LnBhcmVudE1vZGVsPW8pfXJldHVybiB0fSkpLGUud3JhcE1ldGhvZCgiZ2V0SXRlbU1vZGVsIiwoZnVuY3Rpb24odCxlKXt2YXIgbj10LnBhcmVudE1vZGVsLGk9bi5nZXRHcmFwaCgpLmdldEVkZ2VCeUluZGV4KGUpLm5vZGUxLmdldExheW91dCgpO2lmKGkpe3ZhciByPWkuZGVwdGgsbz1uLmxldmVsTW9kZWxzW3JdO28mJih0LnBhcmVudE1vZGVsPW8pfXJldHVybiB0fSkpfSkpO3JldHVybiBzLmRhdGF9fSxlLnByb3RvdHlwZS5zZXROb2RlUG9zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj0odGhpcy5vcHRpb24uZGF0YXx8dGhpcy5vcHRpb24ubm9kZXMpW3RdO24ubG9jYWxYPWVbMF0sbi5sb2NhbFk9ZVsxXX0sZS5wcm90b3R5cGUuZ2V0R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREYXRhKCkuZ3JhcGh9LGUucHJvdG90eXBlLmdldEVkZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0R3JhcGgoKS5lZGdlRGF0YX0sZS5wcm90b3R5cGUuZm9ybWF0VG9vbHRpcD1mdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gaXNOYU4odCl8fG51bGw9PXR9aWYoImVkZ2UiPT09bil7dmFyIHI9dGhpcy5nZXREYXRhUGFyYW1zKHQsbiksbz1yLmRhdGEsYT1yLnZhbHVlO3JldHVybiBvZygibmFtZVZhbHVlIix7bmFtZTpvLnNvdXJjZSsiIC0tICIrby50YXJnZXQsdmFsdWU6YSxub1ZhbHVlOmkoYSl9KX12YXIgcz10aGlzLmdldEdyYXBoKCkuZ2V0Tm9kZUJ5SW5kZXgodCkuZ2V0TGF5b3V0KCkudmFsdWUsbD10aGlzLmdldERhdGFQYXJhbXModCxuKS5kYXRhLm5hbWU7cmV0dXJuIG9nKCJuYW1lVmFsdWUiLHtuYW1lOm51bGwhPWw/bCsiIjpudWxsLHZhbHVlOnMsbm9WYWx1ZTppKHMpfSl9LGUucHJvdG90eXBlLm9wdGlvblVwZGF0ZWQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmdldERhdGFQYXJhbXM9ZnVuY3Rpb24oZSxuKXt2YXIgaT10LnByb3RvdHlwZS5nZXREYXRhUGFyYW1zLmNhbGwodGhpcyxlLG4pO2lmKG51bGw9PWkudmFsdWUmJiJub2RlIj09PW4pe3ZhciByPXRoaXMuZ2V0R3JhcGgoKS5nZXROb2RlQnlJbmRleChlKS5nZXRMYXlvdXQoKS52YWx1ZTtpLnZhbHVlPXJ9cmV0dXJuIGl9LGUudHlwZT0ic2VyaWVzLnNhbmtleSIsZS5kZWZhdWx0T3B0aW9uPXt6OjIsY29vcmRpbmF0ZVN5c3RlbToidmlldyIsbGVmdDoiNSUiLHRvcDoiNSUiLHJpZ2h0OiIyMCUiLGJvdHRvbToiNSUiLG9yaWVudDoiaG9yaXpvbnRhbCIsbm9kZVdpZHRoOjIwLG5vZGVHYXA6OCxkcmFnZ2FibGU6ITAsbGF5b3V0SXRlcmF0aW9uczozMixsYWJlbDp7c2hvdzohMCxwb3NpdGlvbjoicmlnaHQiLGZvbnRTaXplOjEyfSxlZGdlTGFiZWw6e3Nob3c6ITEsZm9udFNpemU6MTJ9LGxldmVsczpbXSxub2RlQWxpZ246Imp1c3RpZnkiLGxpbmVTdHlsZTp7Y29sb3I6IiMzMTQ2NTYiLG9wYWNpdHk6LjIsY3VydmVuZXNzOi41fSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITB9LGxpbmVTdHlsZTp7b3BhY2l0eTouNX19LHNlbGVjdDp7aXRlbVN0eWxlOntib3JkZXJDb2xvcjoiIzIxMjEyMSJ9fSxhbmltYXRpb25FYXNpbmc6ImxpbmVhciIsYW5pbWF0aW9uRHVyYXRpb246MWUzfSxlfShiZyk7ZnVuY3Rpb24gUUwodCxlKXt0LmVhY2hTZXJpZXNCeVR5cGUoInNhbmtleSIsKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0KCJub2RlV2lkdGgiKSxpPXQuZ2V0KCJub2RlR2FwIikscj1mdW5jdGlvbih0LGUpe3JldHVybiBrcCh0LmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KX0odCxlKTt0LmxheW91dEluZm89cjt2YXIgbz1yLndpZHRoLGE9ci5oZWlnaHQscz10LmdldEdyYXBoKCksbD1zLm5vZGVzLHU9cy5lZGdlczshZnVuY3Rpb24odCl7RSh0LChmdW5jdGlvbih0KXt2YXIgZT11UCh0Lm91dEVkZ2VzLGxQKSxuPXVQKHQuaW5FZGdlcyxsUCksaT10LmdldFZhbHVlKCl8fDAscj1NYXRoLm1heChlLG4saSk7dC5zZXRMYXlvdXQoe3ZhbHVlOnJ9LCEwKX0pKX0obCksZnVuY3Rpb24odCxlLG4saSxyLG8sYSxzLGwpeyhmdW5jdGlvbih0LGUsbixpLHIsbyxhKXtmb3IodmFyIHM9W10sbD1bXSx1PVtdLGg9W10sYz0wLHA9MDtwPGUubGVuZ3RoO3ArKylzW3BdPTE7Zm9yKHA9MDtwPHQubGVuZ3RoO3ArKylsW3BdPXRbcF0uaW5FZGdlcy5sZW5ndGgsMD09PWxbcF0mJnUucHVzaCh0W3BdKTt2YXIgZD0tMTtmb3IoO3UubGVuZ3RoOyl7Zm9yKHZhciBmPTA7Zjx1Lmxlbmd0aDtmKyspe3ZhciBnPXVbZl0seT1nLmhvc3RHcmFwaC5kYXRhLmdldFJhd0RhdGFJdGVtKGcuZGF0YUluZGV4KSx2PW51bGwhPXkuZGVwdGgmJnkuZGVwdGg+PTA7diYmeS5kZXB0aD5kJiYoZD15LmRlcHRoKSxnLnNldExheW91dCh7ZGVwdGg6dj95LmRlcHRoOmN9LCEwKSwidmVydGljYWwiPT09bz9nLnNldExheW91dCh7ZHk6bn0sITApOmcuc2V0TGF5b3V0KHtkeDpufSwhMCk7Zm9yKHZhciBtPTA7bTxnLm91dEVkZ2VzLmxlbmd0aDttKyspe3ZhciB4PWcub3V0RWRnZXNbbV07c1tlLmluZGV4T2YoeCldPTA7dmFyIF89eC5ub2RlMjswPT0tLWxbdC5pbmRleE9mKF8pXSYmaC5pbmRleE9mKF8pPDAmJmgucHVzaChfKX19KytjLHU9aCxoPVtdfWZvcihwPTA7cDxzLmxlbmd0aDtwKyspaWYoMT09PXNbcF0pdGhyb3cgbmV3IEVycm9yKCJTYW5rZXkgaXMgYSBEQUcsIHRoZSBvcmlnaW5hbCBkYXRhIGhhcyBjeWNsZSEiKTt2YXIgYj1kPmMtMT9kOmMtMTthJiYibGVmdCIhPT1hJiZmdW5jdGlvbih0LGUsbixpKXtpZigicmlnaHQiPT09ZSl7Zm9yKHZhciByPVtdLG89dCxhPTA7by5sZW5ndGg7KXtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIGw9b1tzXTtsLnNldExheW91dCh7c2tOb2RlSGVpZ2h0OmF9LCEwKTtmb3IodmFyIHU9MDt1PGwuaW5FZGdlcy5sZW5ndGg7dSsrKXt2YXIgaD1sLmluRWRnZXNbdV07ci5pbmRleE9mKGgubm9kZTEpPDAmJnIucHVzaChoLm5vZGUxKX19bz1yLHI9W10sKythfUUodCwoZnVuY3Rpb24odCl7dFAodCl8fHQuc2V0TGF5b3V0KHtkZXB0aDpNYXRoLm1heCgwLGktdC5nZXRMYXlvdXQoKS5za05vZGVIZWlnaHQpfSwhMCl9KSl9ZWxzZSJqdXN0aWZ5Ij09PWUmJmZ1bmN0aW9uKHQsZSl7RSh0LChmdW5jdGlvbih0KXt0UCh0KXx8dC5vdXRFZGdlcy5sZW5ndGh8fHQuc2V0TGF5b3V0KHtkZXB0aDplfSwhMCl9KSl9KHQsaSl9KHQsYSwwLGIpO3ZhciB3PSJ2ZXJ0aWNhbCI9PT1vPyhyLW4pL2I6KGktbikvYjshZnVuY3Rpb24odCxlLG4pe0UodCwoZnVuY3Rpb24odCl7dmFyIGk9dC5nZXRMYXlvdXQoKS5kZXB0aCplOyJ2ZXJ0aWNhbCI9PT1uP3Quc2V0TGF5b3V0KHt5Oml9LCEwKTp0LnNldExheW91dCh7eDppfSwhMCl9KSl9KHQsdyxvKX0pKHQsZSxuLHIsbyxzLGwpLGZ1bmN0aW9uKHQsZSxuLGkscixvLGEpe3ZhciBzPWZ1bmN0aW9uKHQsZSl7dmFyIG49W10saT0idmVydGljYWwiPT09ZT8ieSI6IngiLHI9VW8odCwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TGF5b3V0KClbaV19KSk7cmV0dXJuIHIua2V5cy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSksRShyLmtleXMsKGZ1bmN0aW9uKHQpe24ucHVzaChyLmJ1Y2tldHMuZ2V0KHQpKX0pKSxufSh0LGEpOyhmdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIGE9MS8wO0UodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscz0wO0UodCwoZnVuY3Rpb24odCl7cys9dC5nZXRMYXlvdXQoKS52YWx1ZX0pKTt2YXIgbD0idmVydGljYWwiPT09bz8oaS0oZS0xKSpyKS9zOihuLShlLTEpKnIpL3M7bDxhJiYoYT1sKX0pKSxFKHQsKGZ1bmN0aW9uKHQpe0UodCwoZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldExheW91dCgpLnZhbHVlKmE7InZlcnRpY2FsIj09PW8/KHQuc2V0TGF5b3V0KHt4OmV9LCEwKSx0LnNldExheW91dCh7ZHg6bn0sITApKToodC5zZXRMYXlvdXQoe3k6ZX0sITApLHQuc2V0TGF5b3V0KHtkeTpufSwhMCkpfSkpfSkpLEUoZSwoZnVuY3Rpb24odCl7dmFyIGU9K3QuZ2V0VmFsdWUoKSphO3Quc2V0TGF5b3V0KHtkeTplfSwhMCl9KSl9KShzLGUsbixpLHIsYSksZVAocyxyLG4saSxhKTtmb3IodmFyIGw9MTtvPjA7by0tKW5QKHMsbCo9Ljk5LGEpLGVQKHMscixuLGksYSksaFAocyxsLGEpLGVQKHMscixuLGksYSl9KHQsZSxvLHIsaSxhLHMpLGZ1bmN0aW9uKHQsZSl7dmFyIG49InZlcnRpY2FsIj09PWU/IngiOiJ5IjtFKHQsKGZ1bmN0aW9uKHQpe3Qub3V0RWRnZXMuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ub2RlMi5nZXRMYXlvdXQoKVtuXS1lLm5vZGUyLmdldExheW91dCgpW25dfSkpLHQuaW5FZGdlcy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0Lm5vZGUxLmdldExheW91dCgpW25dLWUubm9kZTEuZ2V0TGF5b3V0KClbbl19KSl9KSksRSh0LChmdW5jdGlvbih0KXt2YXIgZT0wLG49MDtFKHQub3V0RWRnZXMsKGZ1bmN0aW9uKHQpe3Quc2V0TGF5b3V0KHtzeTplfSwhMCksZSs9dC5nZXRMYXlvdXQoKS5keX0pKSxFKHQuaW5FZGdlcywoZnVuY3Rpb24odCl7dC5zZXRMYXlvdXQoe3R5Om59LCEwKSxuKz10LmdldExheW91dCgpLmR5fSkpfSkpfSh0LHMpfShsLHUsbixpLG8sYSwwIT09QihsLChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuZ2V0TGF5b3V0KCkudmFsdWV9KSkubGVuZ3RoPzA6dC5nZXQoImxheW91dEl0ZXJhdGlvbnMiKSx0LmdldCgib3JpZW50IiksdC5nZXQoIm5vZGVBbGlnbiIpKX0pKX1mdW5jdGlvbiB0UCh0KXt2YXIgZT10Lmhvc3RHcmFwaC5kYXRhLmdldFJhd0RhdGFJdGVtKHQuZGF0YUluZGV4KTtyZXR1cm4gbnVsbCE9ZS5kZXB0aCYmZS5kZXB0aD49MH1mdW5jdGlvbiBlUCh0LGUsbixpLHIpe3ZhciBvPSJ2ZXJ0aWNhbCI9PT1yPyJ4IjoieSI7RSh0LChmdW5jdGlvbih0KXt2YXIgYSxzLGw7dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LmdldExheW91dCgpW29dLWUuZ2V0TGF5b3V0KClbb119KSk7Zm9yKHZhciB1PTAsaD10Lmxlbmd0aCxjPSJ2ZXJ0aWNhbCI9PT1yPyJkeCI6ImR5IixwPTA7cDxoO3ArKykobD11LShzPXRbcF0pLmdldExheW91dCgpW29dKT4wJiYoYT1zLmdldExheW91dCgpW29dK2wsInZlcnRpY2FsIj09PXI/cy5zZXRMYXlvdXQoe3g6YX0sITApOnMuc2V0TGF5b3V0KHt5OmF9LCEwKSksdT1zLmdldExheW91dCgpW29dK3MuZ2V0TGF5b3V0KClbY10rZTtpZigobD11LWUtKCJ2ZXJ0aWNhbCI9PT1yP2k6bikpPjApe2E9cy5nZXRMYXlvdXQoKVtvXS1sLCJ2ZXJ0aWNhbCI9PT1yP3Muc2V0TGF5b3V0KHt4OmF9LCEwKTpzLnNldExheW91dCh7eTphfSwhMCksdT1hO2ZvcihwPWgtMjtwPj0wOy0tcCkobD0ocz10W3BdKS5nZXRMYXlvdXQoKVtvXStzLmdldExheW91dCgpW2NdK2UtdSk+MCYmKGE9cy5nZXRMYXlvdXQoKVtvXS1sLCJ2ZXJ0aWNhbCI9PT1yP3Muc2V0TGF5b3V0KHt4OmF9LCEwKTpzLnNldExheW91dCh7eTphfSwhMCkpLHU9cy5nZXRMYXlvdXQoKVtvXX19KSl9ZnVuY3Rpb24gblAodCxlLG4pe0UodC5zbGljZSgpLnJldmVyc2UoKSwoZnVuY3Rpb24odCl7RSh0LChmdW5jdGlvbih0KXtpZih0Lm91dEVkZ2VzLmxlbmd0aCl7dmFyIGk9dVAodC5vdXRFZGdlcyxpUCxuKS91UCh0Lm91dEVkZ2VzLGxQKTtpZihpc05hTihpKSl7dmFyIHI9dC5vdXRFZGdlcy5sZW5ndGg7aT1yP3VQKHQub3V0RWRnZXMsclAsbikvcjowfWlmKCJ2ZXJ0aWNhbCI9PT1uKXt2YXIgbz10LmdldExheW91dCgpLngrKGktc1AodCxuKSkqZTt0LnNldExheW91dCh7eDpvfSwhMCl9ZWxzZXt2YXIgYT10LmdldExheW91dCgpLnkrKGktc1AodCxuKSkqZTt0LnNldExheW91dCh7eTphfSwhMCl9fX0pKX0pKX1mdW5jdGlvbiBpUCh0LGUpe3JldHVybiBzUCh0Lm5vZGUyLGUpKnQuZ2V0VmFsdWUoKX1mdW5jdGlvbiByUCh0LGUpe3JldHVybiBzUCh0Lm5vZGUyLGUpfWZ1bmN0aW9uIG9QKHQsZSl7cmV0dXJuIHNQKHQubm9kZTEsZSkqdC5nZXRWYWx1ZSgpfWZ1bmN0aW9uIGFQKHQsZSl7cmV0dXJuIHNQKHQubm9kZTEsZSl9ZnVuY3Rpb24gc1AodCxlKXtyZXR1cm4idmVydGljYWwiPT09ZT90LmdldExheW91dCgpLngrdC5nZXRMYXlvdXQoKS5keC8yOnQuZ2V0TGF5b3V0KCkueSt0LmdldExheW91dCgpLmR5LzJ9ZnVuY3Rpb24gbFAodCl7cmV0dXJuIHQuZ2V0VmFsdWUoKX1mdW5jdGlvbiB1UCh0LGUsbil7Zm9yKHZhciBpPTAscj10Lmxlbmd0aCxvPS0xOysrbzxyOyl7dmFyIGE9K2UodFtvXSxuKTtpc05hTihhKXx8KGkrPWEpfXJldHVybiBpfWZ1bmN0aW9uIGhQKHQsZSxuKXtFKHQsKGZ1bmN0aW9uKHQpe0UodCwoZnVuY3Rpb24odCl7aWYodC5pbkVkZ2VzLmxlbmd0aCl7dmFyIGk9dVAodC5pbkVkZ2VzLG9QLG4pL3VQKHQuaW5FZGdlcyxsUCk7aWYoaXNOYU4oaSkpe3ZhciByPXQuaW5FZGdlcy5sZW5ndGg7aT1yP3VQKHQuaW5FZGdlcyxhUCxuKS9yOjB9aWYoInZlcnRpY2FsIj09PW4pe3ZhciBvPXQuZ2V0TGF5b3V0KCkueCsoaS1zUCh0LG4pKSplO3Quc2V0TGF5b3V0KHt4Om99LCEwKX1lbHNle3ZhciBhPXQuZ2V0TGF5b3V0KCkueSsoaS1zUCh0LG4pKSplO3Quc2V0TGF5b3V0KHt5OmF9LCEwKX19fSkpfSkpfWZ1bmN0aW9uIGNQKHQpe3QuZWFjaFNlcmllc0J5VHlwZSgic2Fua2V5IiwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHcmFwaCgpLG49ZS5ub2RlcyxpPWUuZWRnZXM7aWYobi5sZW5ndGgpe3ZhciByPTEvMCxvPS0xLzA7RShuLChmdW5jdGlvbih0KXt2YXIgZT10LmdldExheW91dCgpLnZhbHVlO2U8ciYmKHI9ZSksZT5vJiYobz1lKX0pKSxFKG4sKGZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBrRCh7dHlwZToiY29sb3IiLG1hcHBpbmdNZXRob2Q6ImxpbmVhciIsZGF0YUV4dGVudDpbcixvXSx2aXN1YWw6dC5nZXQoImNvbG9yIil9KS5tYXBWYWx1ZVRvVmlzdWFsKGUuZ2V0TGF5b3V0KCkudmFsdWUpLGk9ZS5nZXRNb2RlbCgpLmdldChbIml0ZW1TdHlsZSIsImNvbG9yIl0pO251bGwhPWk/KGUuc2V0VmlzdWFsKCJjb2xvciIsaSksZS5zZXRWaXN1YWwoInN0eWxlIix7ZmlsbDppfSkpOihlLnNldFZpc3VhbCgiY29sb3IiLG4pLGUuc2V0VmlzdWFsKCJzdHlsZSIse2ZpbGw6bn0pKX0pKX1pLmxlbmd0aCYmRShpLChmdW5jdGlvbih0KXt2YXIgZT10LmdldE1vZGVsKCkuZ2V0KCJsaW5lU3R5bGUiKTt0LnNldFZpc3VhbCgic3R5bGUiLGUpfSkpfSkpfXZhciBwUD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyPWUuZ2V0Q29tcG9uZW50KCJ4QXhpcyIsdGhpcy5nZXQoInhBeGlzSW5kZXgiKSksbz1lLmdldENvbXBvbmVudCgieUF4aXMiLHRoaXMuZ2V0KCJ5QXhpc0luZGV4IikpLGE9ci5nZXQoInR5cGUiKSxzPW8uZ2V0KCJ0eXBlIik7ImNhdGVnb3J5Ij09PWE/KHQubGF5b3V0PSJob3Jpem9udGFsIixuPXIuZ2V0T3JkaW5hbE1ldGEoKSxpPSEwKToiY2F0ZWdvcnkiPT09cz8odC5sYXlvdXQ9InZlcnRpY2FsIixuPW8uZ2V0T3JkaW5hbE1ldGEoKSxpPSEwKTp0LmxheW91dD10LmxheW91dHx8Imhvcml6b250YWwiO3ZhciBsPVsieCIsInkiXSx1PSJob3Jpem9udGFsIj09PXQubGF5b3V0PzA6MSxoPXRoaXMuX2Jhc2VBeGlzRGltPWxbdV0sYz1sWzEtdV0scD1bcixvXSxkPXBbdV0uZ2V0KCJ0eXBlIiksZj1wWzEtdV0uZ2V0KCJ0eXBlIiksZz10LmRhdGE7aWYoZyYmaSl7dmFyIHk9W107RShnLChmdW5jdGlvbih0LGUpe3ZhciBuO1kodCk/KG49dC5zbGljZSgpLHQudW5zaGlmdChlKSk6WSh0LnZhbHVlKT8oKG49QSh7fSx0KSkudmFsdWU9bi52YWx1ZS5zbGljZSgpLHQudmFsdWUudW5zaGlmdChlKSk6bj10LHkucHVzaChuKX0pKSx0LmRhdGE9eX12YXIgdj10aGlzLmRlZmF1bHRWYWx1ZURpbWVuc2lvbnMsbT1be25hbWU6aCx0eXBlOlltKGQpLG9yZGluYWxNZXRhOm4sb3RoZXJEaW1zOnt0b29sdGlwOiExLGl0ZW1OYW1lOjB9LGRpbXNEZWY6WyJiYXNlIl19LHtuYW1lOmMsdHlwZTpZbShmKSxkaW1zRGVmOnYuc2xpY2UoKX1dO3JldHVybiBSTSh0aGlzLHtjb29yZERpbWVuc2lvbnM6bSxkaW1lbnNpb25zQ291bnQ6di5sZW5ndGgrMSxlbmNvZGVEZWZhdWx0ZXI6SCh0ZCxtLHRoaXMpfSl9LHQucHJvdG90eXBlLmdldEJhc2VBeGlzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZUF4aXNEaW07cmV0dXJuIHRoaXMuZWNNb2RlbC5nZXRDb21wb25lbnQodCsiQXhpcyIsdGhpcy5nZXQodCsiQXhpc0luZGV4IikpLmF4aXN9LHR9KCksZFA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmRlZmF1bHRWYWx1ZURpbWVuc2lvbnM9W3tuYW1lOiJtaW4iLGRlZmF1bHRUb29sdGlwOiEwfSx7bmFtZToiUTEiLGRlZmF1bHRUb29sdGlwOiEwfSx7bmFtZToibWVkaWFuIixkZWZhdWx0VG9vbHRpcDohMH0se25hbWU6IlEzIixkZWZhdWx0VG9vbHRpcDohMH0se25hbWU6Im1heCIsZGVmYXVsdFRvb2x0aXA6ITB9XSxuLnZpc3VhbERyYXdUeXBlPSJzdHJva2UiLG59cmV0dXJuIG4oZSx0KSxlLnR5cGU9InNlcmllcy5ib3hwbG90IixlLmRlcGVuZGVuY2llcz1bInhBeGlzIiwieUF4aXMiLCJncmlkIl0sZS5kZWZhdWx0T3B0aW9uPXt6OjIsY29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLGxlZ2VuZEhvdmVyTGluazohMCxsYXlvdXQ6bnVsbCxib3hXaWR0aDpbNyw1MF0saXRlbVN0eWxlOntjb2xvcjoiI2ZmZiIsYm9yZGVyV2lkdGg6MX0sZW1waGFzaXM6e3NjYWxlOiEwLGl0ZW1TdHlsZTp7Ym9yZGVyV2lkdGg6MixzaGFkb3dCbHVyOjUsc2hhZG93T2Zmc2V0WDoxLHNoYWRvd09mZnNldFk6MSxzaGFkb3dDb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19LGFuaW1hdGlvbkR1cmF0aW9uOjgwMH0sZX0oYmcpO1IoZFAscFAsITApO3ZhciBmUD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuZ2V0RGF0YSgpLHI9dGhpcy5ncm91cCxvPXRoaXMuX2RhdGE7dGhpcy5fZGF0YXx8ci5yZW1vdmVBbGwoKTt2YXIgYT0iaG9yaXpvbnRhbCI9PT10LmdldCgibGF5b3V0Iik/MTowO2kuZGlmZihvKS5hZGQoKGZ1bmN0aW9uKHQpe2lmKGkuaGFzVmFsdWUodCkpe3ZhciBlPXZQKGkuZ2V0SXRlbUxheW91dCh0KSxpLHQsYSwhMCk7aS5zZXRJdGVtR3JhcGhpY0VsKHQsZSksci5hZGQoZSl9fSkpLnVwZGF0ZSgoZnVuY3Rpb24odCxlKXt2YXIgbj1vLmdldEl0ZW1HcmFwaGljRWwoZSk7aWYoaS5oYXNWYWx1ZSh0KSl7dmFyIHM9aS5nZXRJdGVtTGF5b3V0KHQpO24/KFNoKG4pLG1QKHMsbixpLHQpKTpuPXZQKHMsaSx0LGEpLHIuYWRkKG4pLGkuc2V0SXRlbUdyYXBoaWNFbCh0LG4pfWVsc2Ugci5yZW1vdmUobil9KSkucmVtb3ZlKChmdW5jdGlvbih0KXt2YXIgZT1vLmdldEl0ZW1HcmFwaGljRWwodCk7ZSYmci5yZW1vdmUoZSl9KSkuZXhlY3V0ZSgpLHRoaXMuX2RhdGE9aX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXAsbj10aGlzLl9kYXRhO3RoaXMuX2RhdGE9bnVsbCxuJiZuLmVhY2hJdGVtR3JhcGhpY0VsKChmdW5jdGlvbih0KXt0JiZlLnJlbW92ZSh0KX0pKX0sZS50eXBlPSJib3hwbG90IixlfShPZyksZ1A9ZnVuY3Rpb24oKXt9LHlQPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4udHlwZT0iYm94cGxvdEJveFBhdGgiLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXREZWZhdWx0U2hhcGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGdQfSxlLnByb3RvdHlwZS5idWlsZFBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnBvaW50cyxpPTA7Zm9yKHQubW92ZVRvKG5baV1bMF0sbltpXVsxXSksaSsrO2k8NDtpKyspdC5saW5lVG8obltpXVswXSxuW2ldWzFdKTtmb3IodC5jbG9zZVBhdGgoKTtpPG4ubGVuZ3RoO2krKyl0Lm1vdmVUbyhuW2ldWzBdLG5baV1bMV0pLGkrKyx0LmxpbmVUbyhuW2ldWzBdLG5baV1bMV0pfSxlfShrcyk7ZnVuY3Rpb24gdlAodCxlLG4saSxyKXt2YXIgbz10LmVuZHMsYT1uZXcgeVAoe3NoYXBlOntwb2ludHM6cj94UChvLGksdCk6b319KTtyZXR1cm4gbVAodCxhLGUsbixyKSxhfWZ1bmN0aW9uIG1QKHQsZSxuLGkscil7dmFyIG89bi5ob3N0TW9kZWw7KDAsUWhbcj8iaW5pdFByb3BzIjoidXBkYXRlUHJvcHMiXSkoZSx7c2hhcGU6e3BvaW50czp0LmVuZHN9fSxvLGkpLGUudXNlU3R5bGUobi5nZXRJdGVtVmlzdWFsKGksInN0eWxlIikpLGUuc3R5bGUuc3Ryb2tlTm9TY2FsZT0hMCxlLnoyPTEwMDt2YXIgYT1uLmdldEl0ZW1Nb2RlbChpKSxzPWEuZ2V0TW9kZWwoImVtcGhhc2lzIik7JGwoZSxhKSxabChlLHMuZ2V0KCJmb2N1cyIpLHMuZ2V0KCJibHVyU2NvcGUiKSxzLmdldCgiZGlzYWJsZWQiKSl9ZnVuY3Rpb24geFAodCxlLG4pe3JldHVybiB6KHQsKGZ1bmN0aW9uKHQpe3JldHVybih0PXQuc2xpY2UoKSlbZV09bi5pbml0QmFzZWxpbmUsdH0pKX12YXIgX1A9RTtmdW5jdGlvbiBiUCh0KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdO3JldHVybiB0LmVhY2hTZXJpZXNCeVR5cGUoImJveHBsb3QiLChmdW5jdGlvbih0KXt2YXIgaT10LmdldEJhc2VBeGlzKCkscj1QKG4saSk7cjwwJiYocj1uLmxlbmd0aCxuW3JdPWksZVtyXT17YXhpczppLHNlcmllc01vZGVsczpbXX0pLGVbcl0uc2VyaWVzTW9kZWxzLnB1c2godCl9KSksZX0odCk7X1AoZSwoZnVuY3Rpb24odCl7dmFyIGU9dC5zZXJpZXNNb2RlbHM7ZS5sZW5ndGgmJighZnVuY3Rpb24odCl7dmFyIGUsbj10LmF4aXMsaT10LnNlcmllc01vZGVscyxyPWkubGVuZ3RoLG89dC5ib3hXaWR0aExpc3Q9W10sYT10LmJveE9mZnNldExpc3Q9W10scz1bXTtpZigiY2F0ZWdvcnkiPT09bi50eXBlKWU9bi5nZXRCYW5kV2lkdGgoKTtlbHNle3ZhciBsPTA7X1AoaSwoZnVuY3Rpb24odCl7bD1NYXRoLm1heChsLHQuZ2V0RGF0YSgpLmNvdW50KCkpfSkpO3ZhciB1PW4uZ2V0RXh0ZW50KCk7ZT1NYXRoLmFicyh1WzFdLXVbMF0pL2x9X1AoaSwoZnVuY3Rpb24odCl7dmFyIG49dC5nZXQoImJveFdpZHRoIik7WShuKXx8KG49W24sbl0pLHMucHVzaChbJHIoblswXSxlKXx8MCwkcihuWzFdLGUpfHwwXSl9KSk7dmFyIGg9LjgqZS0yLGM9aC9yKi4zLHA9KGgtYyooci0xKSkvcixkPXAvMi1oLzI7X1AoaSwoZnVuY3Rpb24odCxlKXthLnB1c2goZCksZCs9YytwLG8ucHVzaChNYXRoLm1pbihNYXRoLm1heChwLHNbZV1bMF0pLHNbZV1bMV0pKX0pKX0odCksX1AoZSwoZnVuY3Rpb24oZSxuKXshZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuY29vcmRpbmF0ZVN5c3RlbSxyPXQuZ2V0RGF0YSgpLG89bi8yLGE9Imhvcml6b250YWwiPT09dC5nZXQoImxheW91dCIpPzA6MSxzPTEtYSxsPVsieCIsInkiXSx1PXIubWFwRGltZW5zaW9uKGxbYV0pLGg9ci5tYXBEaW1lbnNpb25zQWxsKGxbc10pO2lmKG51bGw9PXV8fGgubGVuZ3RoPDUpcmV0dXJuO2Zvcih2YXIgYz0wO2M8ci5jb3VudCgpO2MrKyl7dmFyIHA9ci5nZXQodSxjKSxkPXgocCxoWzJdLGMpLGY9eChwLGhbMF0sYyksZz14KHAsaFsxXSxjKSx5PXgocCxoWzNdLGMpLHY9eChwLGhbNF0sYyksbT1bXTtfKG0sZywhMSksXyhtLHksITApLG0ucHVzaChmLGcsdix5KSxiKG0sZiksYihtLHYpLGIobSxkKSxyLnNldEl0ZW1MYXlvdXQoYyx7aW5pdEJhc2VsaW5lOmRbc10sZW5kczptfSl9ZnVuY3Rpb24geCh0LG4sbyl7dmFyIGwsdT1yLmdldChuLG8pLGg9W107cmV0dXJuIGhbYV09dCxoW3NdPXUsaXNOYU4odCl8fGlzTmFOKHUpP2w9W05hTixOYU5dOihsPWkuZGF0YVRvUG9pbnQoaCkpW2FdKz1lLGx9ZnVuY3Rpb24gXyh0LGUsbil7dmFyIGk9ZS5zbGljZSgpLHI9ZS5zbGljZSgpO2lbYV0rPW8sclthXS09byxuP3QucHVzaChpLHIpOnQucHVzaChyLGkpfWZ1bmN0aW9uIGIodCxlKXt2YXIgbj1lLnNsaWNlKCksaT1lLnNsaWNlKCk7blthXS09byxpW2FdKz1vLHQucHVzaChuLGkpfX0oZSx0LmJveE9mZnNldExpc3Rbbl0sdC5ib3hXaWR0aExpc3Rbbl0pfSkpKX0pKX12YXIgd1A9e3R5cGU6ImVjaGFydHM6Ym94cGxvdCIsdHJhbnNmb3JtOmZ1bmN0aW9uKHQpe3ZhciBlPXQudXBzdHJlYW07aWYoZS5zb3VyY2VGb3JtYXQhPT1IcCl7dmFyIG49IiI7MCx3byhuKX12YXIgaT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXSxpPVtdLHI9KGU9ZXx8e30pLmJvdW5kSVFSLG89Im5vbmUiPT09cnx8MD09PXIsYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgcz1Rcih0W2FdLnNsaWNlKCkpLGw9Zm8ocywuMjUpLHU9Zm8ocywuNSksaD1mbyhzLC43NSksYz1zWzBdLHA9c1tzLmxlbmd0aC0xXSxkPShudWxsPT1yPzEuNTpyKSooaC1sKSxmPW8/YzpNYXRoLm1heChjLGwtZCksZz1vP3A6TWF0aC5taW4ocCxoK2QpLHk9ZS5pdGVtTmFtZUZvcm1hdHRlcix2PVgoeSk/eSh7dmFsdWU6YX0pOlUoeSk/eS5yZXBsYWNlKCJ7dmFsdWV9IixhKyIiKTphKyIiO24ucHVzaChbdixmLGwsdSxoLGddKTtmb3IodmFyIG09MDttPHMubGVuZ3RoO20rKyl7dmFyIHg9c1ttXTtpZih4PGZ8fHg+Zyl7dmFyIF89W3YseF07aS5wdXNoKF8pfX19cmV0dXJue2JveERhdGE6bixvdXRsaWVyczppfX0oZS5nZXRSYXdEYXRhKCksdC5jb25maWcpO3JldHVyblt7ZGltZW5zaW9uczpbIkl0ZW1OYW1lIiwiTG93IiwiUTEiLCJRMiIsIlEzIiwiSGlnaCJdLGRhdGE6aS5ib3hEYXRhfSx7ZGF0YTppLm91dGxpZXJzfV19fTt2YXIgU1A9WyJjb2xvciIsImJvcmRlckNvbG9yIl0sTVA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmdyb3VwLnJlbW92ZUNsaXBQYXRoKCksdGhpcy5fcHJvZ3Jlc3NpdmVFbHM9bnVsbCx0aGlzLl91cGRhdGVEcmF3TW9kZSh0KSx0aGlzLl9pc0xhcmdlRHJhdz90aGlzLl9yZW5kZXJMYXJnZSh0KTp0aGlzLl9yZW5kZXJOb3JtYWwodCl9LGUucHJvdG90eXBlLmluY3JlbWVudGFsUHJlcGFyZVJlbmRlcj1mdW5jdGlvbih0LGUsbil7dGhpcy5fY2xlYXIoKSx0aGlzLl91cGRhdGVEcmF3TW9kZSh0KX0sZS5wcm90b3R5cGUuaW5jcmVtZW50YWxSZW5kZXI9ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fcHJvZ3Jlc3NpdmVFbHM9W10sdGhpcy5faXNMYXJnZURyYXc/dGhpcy5faW5jcmVtZW50YWxSZW5kZXJMYXJnZSh0LGUpOnRoaXMuX2luY3JlbWVudGFsUmVuZGVyTm9ybWFsKHQsZSl9LGUucHJvdG90eXBlLmVhY2hSZW5kZXJlZD1mdW5jdGlvbih0KXtKaCh0aGlzLl9wcm9ncmVzc2l2ZUVsc3x8dGhpcy5ncm91cCx0KX0sZS5wcm90b3R5cGUuX3VwZGF0ZURyYXdNb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXQucGlwZWxpbmVDb250ZXh0LmxhcmdlO251bGwhPXRoaXMuX2lzTGFyZ2VEcmF3JiZlPT09dGhpcy5faXNMYXJnZURyYXd8fCh0aGlzLl9pc0xhcmdlRHJhdz1lLHRoaXMuX2NsZWFyKCkpfSxlLnByb3RvdHlwZS5fcmVuZGVyTm9ybWFsPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLG49dGhpcy5fZGF0YSxpPXRoaXMuZ3JvdXAscj1lLmdldExheW91dCgiaXNTaW1wbGVCb3giKSxvPXQuZ2V0KCJjbGlwIiwhMCksYT10LmNvb3JkaW5hdGVTeXN0ZW0scz1hLmdldEFyZWEmJmEuZ2V0QXJlYSgpO3RoaXMuX2RhdGF8fGkucmVtb3ZlQWxsKCksZS5kaWZmKG4pLmFkZCgoZnVuY3Rpb24obil7aWYoZS5oYXNWYWx1ZShuKSl7dmFyIGE9ZS5nZXRJdGVtTGF5b3V0KG4pO2lmKG8mJkRQKHMsYSkpcmV0dXJuO3ZhciBsPUNQKGEsbiwhMCk7bWgobCx7c2hhcGU6e3BvaW50czphLmVuZHN9fSx0LG4pLEFQKGwsZSxuLHIpLGkuYWRkKGwpLGUuc2V0SXRlbUdyYXBoaWNFbChuLGwpfX0pKS51cGRhdGUoKGZ1bmN0aW9uKGEsbCl7dmFyIHU9bi5nZXRJdGVtR3JhcGhpY0VsKGwpO2lmKGUuaGFzVmFsdWUoYSkpe3ZhciBoPWUuZ2V0SXRlbUxheW91dChhKTtvJiZEUChzLGgpP2kucmVtb3ZlKHUpOih1Pyh2aCh1LHtzaGFwZTp7cG9pbnRzOmguZW5kc319LHQsYSksU2godSkpOnU9Q1AoaCksQVAodSxlLGEsciksaS5hZGQodSksZS5zZXRJdGVtR3JhcGhpY0VsKGEsdSkpfWVsc2UgaS5yZW1vdmUodSl9KSkucmVtb3ZlKChmdW5jdGlvbih0KXt2YXIgZT1uLmdldEl0ZW1HcmFwaGljRWwodCk7ZSYmaS5yZW1vdmUoZSl9KSkuZXhlY3V0ZSgpLHRoaXMuX2RhdGE9ZX0sZS5wcm90b3R5cGUuX3JlbmRlckxhcmdlPWZ1bmN0aW9uKHQpe3RoaXMuX2NsZWFyKCksT1AodCx0aGlzLmdyb3VwKTt2YXIgZT10LmdldCgiY2xpcCIsITApP1BTKHQuY29vcmRpbmF0ZVN5c3RlbSwhMSx0KTpudWxsO2U/dGhpcy5ncm91cC5zZXRDbGlwUGF0aChlKTp0aGlzLmdyb3VwLnJlbW92ZUNsaXBQYXRoKCl9LGUucHJvdG90eXBlLl9pbmNyZW1lbnRhbFJlbmRlck5vcm1hbD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixpPWUuZ2V0RGF0YSgpLHI9aS5nZXRMYXlvdXQoImlzU2ltcGxlQm94Iik7bnVsbCE9KG49dC5uZXh0KCkpOyl7dmFyIG89Q1AoaS5nZXRJdGVtTGF5b3V0KG4pKTtBUChvLGksbixyKSxvLmluY3JlbWVudGFsPSEwLHRoaXMuZ3JvdXAuYWRkKG8pLHRoaXMuX3Byb2dyZXNzaXZlRWxzLnB1c2gobyl9fSxlLnByb3RvdHlwZS5faW5jcmVtZW50YWxSZW5kZXJMYXJnZT1mdW5jdGlvbih0LGUpe09QKGUsdGhpcy5ncm91cCx0aGlzLl9wcm9ncmVzc2l2ZUVscywhMCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aGlzLl9jbGVhcigpfSxlLnByb3RvdHlwZS5fY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2RhdGE9bnVsbH0sZS50eXBlPSJjYW5kbGVzdGljayIsZX0oT2cpLElQPWZ1bmN0aW9uKCl7fSxUUD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLnR5cGU9Im5vcm1hbENhbmRsZXN0aWNrQm94IixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBJUH0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5wb2ludHM7dGhpcy5fX3NpbXBsZUJveD8odC5tb3ZlVG8obls0XVswXSxuWzRdWzFdKSx0LmxpbmVUbyhuWzZdWzBdLG5bNl1bMV0pKToodC5tb3ZlVG8oblswXVswXSxuWzBdWzFdKSx0LmxpbmVUbyhuWzFdWzBdLG5bMV1bMV0pLHQubGluZVRvKG5bMl1bMF0sblsyXVsxXSksdC5saW5lVG8oblszXVswXSxuWzNdWzFdKSx0LmNsb3NlUGF0aCgpLHQubW92ZVRvKG5bNF1bMF0sbls0XVsxXSksdC5saW5lVG8obls1XVswXSxuWzVdWzFdKSx0Lm1vdmVUbyhuWzZdWzBdLG5bNl1bMV0pLHQubGluZVRvKG5bN11bMF0sbls3XVsxXSkpfSxlfShrcyk7ZnVuY3Rpb24gQ1AodCxlLG4pe3ZhciBpPXQuZW5kcztyZXR1cm4gbmV3IFRQKHtzaGFwZTp7cG9pbnRzOm4/a1AoaSx0KTppfSx6MjoxMDB9KX1mdW5jdGlvbiBEUCh0LGUpe2Zvcih2YXIgbj0hMCxpPTA7aTxlLmVuZHMubGVuZ3RoO2krKylpZih0LmNvbnRhaW4oZS5lbmRzW2ldWzBdLGUuZW5kc1tpXVsxXSkpe249ITE7YnJlYWt9cmV0dXJuIG59ZnVuY3Rpb24gQVAodCxlLG4saSl7dmFyIHI9ZS5nZXRJdGVtTW9kZWwobik7dC51c2VTdHlsZShlLmdldEl0ZW1WaXN1YWwobiwic3R5bGUiKSksdC5zdHlsZS5zdHJva2VOb1NjYWxlPSEwLHQuX19zaW1wbGVCb3g9aSwkbCh0LHIpfWZ1bmN0aW9uIGtQKHQsZSl7cmV0dXJuIHoodCwoZnVuY3Rpb24odCl7cmV0dXJuKHQ9dC5zbGljZSgpKVsxXT1lLmluaXRCYXNlbGluZSx0fSkpfXZhciBMUD1mdW5jdGlvbigpe30sUFA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi50eXBlPSJsYXJnZUNhbmRsZXN0aWNrQm94IixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0RGVmYXVsdFNoYXBlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMUH0sZS5wcm90b3R5cGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUucG9pbnRzLGk9MDtpPG4ubGVuZ3RoOylpZih0aGlzLl9fc2lnbj09PW5baSsrXSl7dmFyIHI9bltpKytdO3QubW92ZVRvKHIsbltpKytdKSx0LmxpbmVUbyhyLG5baSsrXSl9ZWxzZSBpKz0zfSxlfShrcyk7ZnVuY3Rpb24gT1AodCxlLG4saSl7dmFyIHI9dC5nZXREYXRhKCkuZ2V0TGF5b3V0KCJsYXJnZVBvaW50cyIpLG89bmV3IFBQKHtzaGFwZTp7cG9pbnRzOnJ9LF9fc2lnbjoxLGlnbm9yZUNvYXJzZVBvaW50ZXI6ITB9KTtlLmFkZChvKTt2YXIgYT1uZXcgUFAoe3NoYXBlOntwb2ludHM6cn0sX19zaWduOi0xLGlnbm9yZUNvYXJzZVBvaW50ZXI6ITB9KTtlLmFkZChhKTt2YXIgcz1uZXcgUFAoe3NoYXBlOntwb2ludHM6cn0sX19zaWduOjAsaWdub3JlQ29hcnNlUG9pbnRlcjohMH0pO2UuYWRkKHMpLFJQKDEsbyx0KSxSUCgtMSxhLHQpLFJQKDAscyx0KSxpJiYoby5pbmNyZW1lbnRhbD0hMCxhLmluY3JlbWVudGFsPSEwKSxuJiZuLnB1c2gobyxhKX1mdW5jdGlvbiBSUCh0LGUsbixpKXt2YXIgcj1uLmdldChbIml0ZW1TdHlsZSIsdD4wPyJib3JkZXJDb2xvciI6ImJvcmRlckNvbG9yMCJdKXx8bi5nZXQoWyJpdGVtU3R5bGUiLHQ+MD8iY29sb3IiOiJjb2xvcjAiXSk7MD09PXQmJihyPW4uZ2V0KFsiaXRlbVN0eWxlIiwiYm9yZGVyQ29sb3JEb2ppIl0pKTt2YXIgbz1uLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoU1ApO2UudXNlU3R5bGUobyksZS5zdHlsZS5maWxsPW51bGwsZS5zdHlsZS5zdHJva2U9cn12YXIgTlA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmRlZmF1bHRWYWx1ZURpbWVuc2lvbnM9W3tuYW1lOiJvcGVuIixkZWZhdWx0VG9vbHRpcDohMH0se25hbWU6ImNsb3NlIixkZWZhdWx0VG9vbHRpcDohMH0se25hbWU6Imxvd2VzdCIsZGVmYXVsdFRvb2x0aXA6ITB9LHtuYW1lOiJoaWdoZXN0IixkZWZhdWx0VG9vbHRpcDohMH1dLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXRTaGFkb3dEaW09ZnVuY3Rpb24oKXtyZXR1cm4ib3BlbiJ9LGUucHJvdG90eXBlLmJydXNoU2VsZWN0b3I9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUuZ2V0SXRlbUxheW91dCh0KTtyZXR1cm4gaSYmbi5yZWN0KGkuYnJ1c2hSZWN0KX0sZS50eXBlPSJzZXJpZXMuY2FuZGxlc3RpY2siLGUuZGVwZW5kZW5jaWVzPVsieEF4aXMiLCJ5QXhpcyIsImdyaWQiXSxlLmRlZmF1bHRPcHRpb249e3o6Mixjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsbGVnZW5kSG92ZXJMaW5rOiEwLGxheW91dDpudWxsLGNsaXA6ITAsaXRlbVN0eWxlOntjb2xvcjoiI2ViNTQ1NCIsY29sb3IwOiIjNDdiMjYyIixib3JkZXJDb2xvcjoiI2ViNTQ1NCIsYm9yZGVyQ29sb3IwOiIjNDdiMjYyIixib3JkZXJDb2xvckRvamk6bnVsbCxib3JkZXJXaWR0aDoxfSxlbXBoYXNpczp7c2NhbGU6ITAsaXRlbVN0eWxlOntib3JkZXJXaWR0aDoyfX0sYmFyTWF4V2lkdGg6bnVsbCxiYXJNaW5XaWR0aDpudWxsLGJhcldpZHRoOm51bGwsbGFyZ2U6ITAsbGFyZ2VUaHJlc2hvbGQ6NjAwLHByb2dyZXNzaXZlOjNlMyxwcm9ncmVzc2l2ZVRocmVzaG9sZDoxZTQscHJvZ3Jlc3NpdmVDaHVua01vZGU6Im1vZCIsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGFuaW1hdGlvbkR1cmF0aW9uOjMwMH0sZX0oYmcpO2Z1bmN0aW9uIEVQKHQpe3QmJlkodC5zZXJpZXMpJiZFKHQuc2VyaWVzLChmdW5jdGlvbih0KXtxKHQpJiYiayI9PT10LnR5cGUmJih0LnR5cGU9ImNhbmRsZXN0aWNrIil9KSl9UihOUCxwUCwhMCk7dmFyIHpQPVsiaXRlbVN0eWxlIiwiYm9yZGVyQ29sb3IiXSxWUD1bIml0ZW1TdHlsZSIsImJvcmRlckNvbG9yMCJdLEJQPVsiaXRlbVN0eWxlIiwiYm9yZGVyQ29sb3JEb2ppIl0sRlA9WyJpdGVtU3R5bGUiLCJjb2xvciJdLEdQPVsiaXRlbVN0eWxlIiwiY29sb3IwIl0sV1A9e3Nlcmllc1R5cGU6ImNhbmRsZXN0aWNrIixwbGFuOmtnKCkscGVyZm9ybVJhd1NlcmllczohMCxyZXNldDpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gZS5nZXQodD4wP0ZQOkdQKX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGUuZ2V0KDA9PT10P0JQOnQ+MD96UDpWUCl9aWYoIWUuaXNTZXJpZXNGaWx0ZXJlZCh0KSlyZXR1cm4hdC5waXBlbGluZUNvbnRleHQubGFyZ2UmJntwcm9ncmVzczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcjtudWxsIT0ocj10Lm5leHQoKSk7KXt2YXIgbz1lLmdldEl0ZW1Nb2RlbChyKSxhPWUuZ2V0SXRlbUxheW91dChyKS5zaWduLHM9by5nZXRJdGVtU3R5bGUoKTtzLmZpbGw9bihhLG8pLHMuc3Ryb2tlPWkoYSxvKXx8cy5maWxsLEEoZS5lbnN1cmVVbmlxdWVJdGVtVmlzdWFsKHIsInN0eWxlIikscyl9fX19fSxIUD17c2VyaWVzVHlwZToiY2FuZGxlc3RpY2siLHBsYW46a2coKSxyZXNldDpmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW0sbj10LmdldERhdGEoKSxpPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT10LmdldEJhc2VBeGlzKCkscj0iY2F0ZWdvcnkiPT09aS50eXBlP2kuZ2V0QmFuZFdpZHRoKCk6KG49aS5nZXRFeHRlbnQoKSxNYXRoLmFicyhuWzFdLW5bMF0pL2UuY291bnQoKSksbz0kcihydCh0LmdldCgiYmFyTWF4V2lkdGgiKSxyKSxyKSxhPSRyKHJ0KHQuZ2V0KCJiYXJNaW5XaWR0aCIpLDEpLHIpLHM9dC5nZXQoImJhcldpZHRoIik7cmV0dXJuIG51bGwhPXM/JHIocyxyKTpNYXRoLm1heChNYXRoLm1pbihyLzIsbyksYSl9KHQsbikscj1bIngiLCJ5Il0sbz1uLmdldERpbWVuc2lvbkluZGV4KG4ubWFwRGltZW5zaW9uKHJbMF0pKSxhPXoobi5tYXBEaW1lbnNpb25zQWxsKHJbMV0pLG4uZ2V0RGltZW5zaW9uSW5kZXgsbikscz1hWzBdLGw9YVsxXSx1PWFbMl0saD1hWzNdO2lmKG4uc2V0TGF5b3V0KHtjYW5kbGVXaWR0aDppLGlzU2ltcGxlQm94Omk8PTEuM30pLCEobzwwfHxhLmxlbmd0aDw0KSlyZXR1cm57cHJvZ3Jlc3M6dC5waXBlbGluZUNvbnRleHQubGFyZ2U/ZnVuY3Rpb24obixpKXt2YXIgcixhLGM9QngoNCpuLmNvdW50KSxwPTAsZD1bXSxmPVtdLGc9aS5nZXRTdG9yZSgpLHk9ISF0LmdldChbIml0ZW1TdHlsZSIsImJvcmRlckNvbG9yRG9qaSJdKTtmb3IoO251bGwhPShhPW4ubmV4dCgpKTspe3ZhciB2PWcuZ2V0KG8sYSksbT1nLmdldChzLGEpLHg9Zy5nZXQobCxhKSxfPWcuZ2V0KHUsYSksYj1nLmdldChoLGEpO2lzTmFOKHYpfHxpc05hTihfKXx8aXNOYU4oYik/KGNbcCsrXT1OYU4scCs9Myk6KGNbcCsrXT1ZUChnLGEsbSx4LGwseSksZFswXT12LGRbMV09XyxyPWUuZGF0YVRvUG9pbnQoZCxudWxsLGYpLGNbcCsrXT1yP3JbMF06TmFOLGNbcCsrXT1yP3JbMV06TmFOLGRbMV09YixyPWUuZGF0YVRvUG9pbnQoZCxudWxsLGYpLGNbcCsrXT1yP3JbMV06TmFOKX1pLnNldExheW91dCgibGFyZ2VQb2ludHMiLGMpfTpmdW5jdGlvbih0LG4pe3ZhciByLGE9bi5nZXRTdG9yZSgpO2Zvcig7bnVsbCE9KHI9dC5uZXh0KCkpOyl7dmFyIGM9YS5nZXQobyxyKSxwPWEuZ2V0KHMsciksZD1hLmdldChsLHIpLGY9YS5nZXQodSxyKSxnPWEuZ2V0KGgscikseT1NYXRoLm1pbihwLGQpLHY9TWF0aC5tYXgocCxkKSxtPU0oeSxjKSx4PU0odixjKSxfPU0oZixjKSxiPU0oZyxjKSx3PVtdO0kodyx4LDApLEkodyxtLDEpLHcucHVzaChDKGIpLEMoeCksQyhfKSxDKG0pKTt2YXIgUz0hIW4uZ2V0SXRlbU1vZGVsKHIpLmdldChbIml0ZW1TdHlsZSIsImJvcmRlckNvbG9yRG9qaSJdKTtuLnNldEl0ZW1MYXlvdXQocix7c2lnbjpZUChhLHIscCxkLGwsUyksaW5pdEJhc2VsaW5lOnA+ZD94WzFdOm1bMV0sZW5kczp3LGJydXNoUmVjdDpUKGYsZyxjKX0pfWZ1bmN0aW9uIE0odCxuKXt2YXIgaT1bXTtyZXR1cm4gaVswXT1uLGlbMV09dCxpc05hTihuKXx8aXNOYU4odCk/W05hTixOYU5dOmUuZGF0YVRvUG9pbnQoaSl9ZnVuY3Rpb24gSSh0LGUsbil7dmFyIHI9ZS5zbGljZSgpLG89ZS5zbGljZSgpO3JbMF09VmgoclswXStpLzIsMSwhMSksb1swXT1WaChvWzBdLWkvMiwxLCEwKSxuP3QucHVzaChyLG8pOnQucHVzaChvLHIpfWZ1bmN0aW9uIFQodCxlLG4pe3ZhciByPU0odCxuKSxvPU0oZSxuKTtyZXR1cm4gclswXS09aS8yLG9bMF0tPWkvMix7eDpyWzBdLHk6clsxXSx3aWR0aDppLGhlaWdodDpvWzFdLXJbMV19fWZ1bmN0aW9uIEModCl7cmV0dXJuIHRbMF09VmgodFswXSwxKSx0fX19fX07ZnVuY3Rpb24gWVAodCxlLG4saSxyLG8pe3JldHVybiBuPmk/LTE6bjxpPzE6bz8wOmU+MD90LmdldChyLGUtMSk8PWk/MTotMToxfWZ1bmN0aW9uIFhQKHQsZSl7dmFyIG49ZS5yaXBwbGVFZmZlY3RDb2xvcnx8ZS5jb2xvcjt0LmVhY2hDaGlsZCgoZnVuY3Rpb24odCl7dC5hdHRyKHt6OmUueix6bGV2ZWw6ZS56bGV2ZWwsc3R5bGU6e3N0cm9rZToic3Ryb2tlIj09PWUuYnJ1c2hUeXBlP246bnVsbCxmaWxsOiJmaWxsIj09PWUuYnJ1c2hUeXBlP246bnVsbH19KX0pKX12YXIgVVA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcyxyPW5ldyBmUyhlLG4pLG89bmV3IEJyO3JldHVybiBpLmFkZChyKSxpLmFkZChvKSxpLnVwZGF0ZURhdGEoZSxuKSxpfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuc3RvcEVmZmVjdEFuaW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuY2hpbGRBdCgxKS5yZW1vdmVBbGwoKX0sZS5wcm90b3R5cGUuc3RhcnRFZmZlY3RBbmltYXRpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuc3ltYm9sVHlwZSxuPXQuY29sb3IsaT10LnJpcHBsZU51bWJlcixyPXRoaXMuY2hpbGRBdCgxKSxvPTA7bzxpO28rKyl7dmFyIGE9WHkoZSwtMSwtMSwyLDIsbik7YS5hdHRyKHtzdHlsZTp7c3Ryb2tlTm9TY2FsZTohMH0sejI6OTksc2lsZW50OiEwLHNjYWxlWDouNSxzY2FsZVk6LjV9KTt2YXIgcz0tby9pKnQucGVyaW9kK3QuZWZmZWN0T2Zmc2V0O2EuYW5pbWF0ZSgiIiwhMCkud2hlbih0LnBlcmlvZCx7c2NhbGVYOnQucmlwcGxlU2NhbGUvMixzY2FsZVk6dC5yaXBwbGVTY2FsZS8yfSkuZGVsYXkocykuc3RhcnQoKSxhLmFuaW1hdGVTdHlsZSghMCkud2hlbih0LnBlcmlvZCx7b3BhY2l0eTowfSkuZGVsYXkocykuc3RhcnQoKSxyLmFkZChhKX1YUChyLHQpfSxlLnByb3RvdHlwZS51cGRhdGVFZmZlY3RBbmltYXRpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VmZmVjdENmZyxuPXRoaXMuY2hpbGRBdCgxKSxpPVsic3ltYm9sVHlwZSIsInBlcmlvZCIsInJpcHBsZVNjYWxlIiwicmlwcGxlTnVtYmVyIl0scj0wO3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdO2lmKGVbb10hPT10W29dKXJldHVybiB0aGlzLnN0b3BFZmZlY3RBbmltYXRpb24oKSx2b2lkIHRoaXMuc3RhcnRFZmZlY3RBbmltYXRpb24odCl9WFAobix0KX0sZS5wcm90b3R5cGUuaGlnaGxpZ2h0PWZ1bmN0aW9uKCl7T2wodGhpcyl9LGUucHJvdG90eXBlLmRvd25wbGF5PWZ1bmN0aW9uKCl7UmwodGhpcyl9LGUucHJvdG90eXBlLmdldFN5bWJvbFR5cGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNoaWxkQXQoMCk7cmV0dXJuIHQmJnQuZ2V0U3ltYm9sVHlwZSgpfSxlLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXQuaG9zdE1vZGVsO3RoaXMuY2hpbGRBdCgwKS51cGRhdGVEYXRhKHQsZSk7dmFyIHI9dGhpcy5jaGlsZEF0KDEpLG89dC5nZXRJdGVtTW9kZWwoZSksYT10LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sIikscz1VeSh0LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sU2l6ZSIpKSxsPXQuZ2V0SXRlbVZpc3VhbChlLCJzdHlsZSIpLHU9bCYmbC5maWxsLGg9by5nZXRNb2RlbCgiZW1waGFzaXMiKTtyLnNldFNjYWxlKHMpLHIudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe3Quc2V0U3R5bGUoImZpbGwiLHUpfSkpO3ZhciBjPVp5KHQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xPZmZzZXQiKSxzKTtjJiYoci54PWNbMF0sci55PWNbMV0pO3ZhciBwPXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xSb3RhdGUiKTtyLnJvdGF0aW9uPShwfHwwKSpNYXRoLlBJLzE4MHx8MDt2YXIgZD17fTtkLnNob3dFZmZlY3RPbj1pLmdldCgic2hvd0VmZmVjdE9uIiksZC5yaXBwbGVTY2FsZT1vLmdldChbInJpcHBsZUVmZmVjdCIsInNjYWxlIl0pLGQuYnJ1c2hUeXBlPW8uZ2V0KFsicmlwcGxlRWZmZWN0IiwiYnJ1c2hUeXBlIl0pLGQucGVyaW9kPTFlMypvLmdldChbInJpcHBsZUVmZmVjdCIsInBlcmlvZCJdKSxkLmVmZmVjdE9mZnNldD1lL3QuY291bnQoKSxkLno9aS5nZXRTaGFsbG93KCJ6Iil8fDAsZC56bGV2ZWw9aS5nZXRTaGFsbG93KCJ6bGV2ZWwiKXx8MCxkLnN5bWJvbFR5cGU9YSxkLmNvbG9yPXUsZC5yaXBwbGVFZmZlY3RDb2xvcj1vLmdldChbInJpcHBsZUVmZmVjdCIsImNvbG9yIl0pLGQucmlwcGxlTnVtYmVyPW8uZ2V0KFsicmlwcGxlRWZmZWN0IiwibnVtYmVyIl0pLCJyZW5kZXIiPT09ZC5zaG93RWZmZWN0T24/KHRoaXMuX2VmZmVjdENmZz90aGlzLnVwZGF0ZUVmZmVjdEFuaW1hdGlvbihkKTp0aGlzLnN0YXJ0RWZmZWN0QW5pbWF0aW9uKGQpLHRoaXMuX2VmZmVjdENmZz1kKToodGhpcy5fZWZmZWN0Q2ZnPW51bGwsdGhpcy5zdG9wRWZmZWN0QW5pbWF0aW9uKCksdGhpcy5vbkhvdmVyU3RhdGVDaGFuZ2U9ZnVuY3Rpb24odCl7ImVtcGhhc2lzIj09PXQ/InJlbmRlciIhPT1kLnNob3dFZmZlY3RPbiYmbi5zdGFydEVmZmVjdEFuaW1hdGlvbihkKToibm9ybWFsIj09PXQmJiJyZW5kZXIiIT09ZC5zaG93RWZmZWN0T24mJm4uc3RvcEVmZmVjdEFuaW1hdGlvbigpfSksdGhpcy5fZWZmZWN0Q2ZnPWQsWmwodGhpcyxoLmdldCgiZm9jdXMiKSxoLmdldCgiYmx1clNjb3BlIiksaC5nZXQoImRpc2FibGVkIikpfSxlLnByb3RvdHlwZS5mYWRlT3V0PWZ1bmN0aW9uKHQpe3QmJnQoKX0sZX0oQnIpLFpQPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLl9zeW1ib2xEcmF3PW5ldyB4UyhVUCl9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCkscj10aGlzLl9zeW1ib2xEcmF3O3IudXBkYXRlRGF0YShpLHtjbGlwU2hhcGU6dGhpcy5fZ2V0Q2xpcFNoYXBlKHQpfSksdGhpcy5ncm91cC5hZGQoci5ncm91cCl9LGUucHJvdG90eXBlLl9nZXRDbGlwU2hhcGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtLG49ZSYmZS5nZXRBcmVhJiZlLmdldEFyZWEoKTtyZXR1cm4gdC5nZXQoImNsaXAiLCEwKT9uOm51bGx9LGUucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCk7dGhpcy5ncm91cC5kaXJ0eSgpO3ZhciByPVhTKCIiKS5yZXNldCh0LGUsbik7ci5wcm9ncmVzcyYmci5wcm9ncmVzcyh7c3RhcnQ6MCxlbmQ6aS5jb3VudCgpLGNvdW50OmkuY291bnQoKX0saSksdGhpcy5fc3ltYm9sRHJhdy51cGRhdGVMYXlvdXQoKX0sZS5wcm90b3R5cGUuX3VwZGF0ZUdyb3VwVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29vcmRpbmF0ZVN5c3RlbTtlJiZlLmdldFJvYW1UcmFuc2Zvcm0mJih0aGlzLmdyb3VwLnRyYW5zZm9ybT1UZShlLmdldFJvYW1UcmFuc2Zvcm0oKSksdGhpcy5ncm91cC5kZWNvbXBvc2VUcmFuc2Zvcm0oKSl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe3RoaXMuX3N5bWJvbERyYXcmJnRoaXMuX3N5bWJvbERyYXcucmVtb3ZlKCEwKX0sZS50eXBlPSJlZmZlY3RTY2F0dGVyIixlfShPZyksalA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmhhc1N5bWJvbFZpc3VhbD0hMCxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3gobnVsbCx0aGlzLHt1c2VFbmNvZGVEZWZhdWx0ZXI6ITB9KX0sZS5wcm90b3R5cGUuYnJ1c2hTZWxlY3Rvcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG4ucG9pbnQoZS5nZXRJdGVtTGF5b3V0KHQpKX0sZS50eXBlPSJzZXJpZXMuZWZmZWN0U2NhdHRlciIsZS5kZXBlbmRlbmNpZXM9WyJncmlkIiwicG9sYXIiXSxlLmRlZmF1bHRPcHRpb249e2Nvb3JkaW5hdGVTeXN0ZW06ImNhcnRlc2lhbjJkIix6OjIsbGVnZW5kSG92ZXJMaW5rOiEwLGVmZmVjdFR5cGU6InJpcHBsZSIscHJvZ3Jlc3NpdmU6MCxzaG93RWZmZWN0T246InJlbmRlciIsY2xpcDohMCxyaXBwbGVFZmZlY3Q6e3BlcmlvZDo0LHNjYWxlOjIuNSxicnVzaFR5cGU6ImZpbGwiLG51bWJlcjozfSx1bml2ZXJzYWxUcmFuc2l0aW9uOntkaXZpZGVTaGFwZToiY2xvbmUifSxzeW1ib2xTaXplOjEwfSxlfShiZyk7dmFyIHFQPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLGkpe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5hZGQoci5jcmVhdGVMaW5lKGUsbixpKSksci5fdXBkYXRlRWZmZWN0U3ltYm9sKGUsbikscn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmNyZWF0ZUxpbmU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgSEEodCxlLG4pfSxlLnByb3RvdHlwZS5fdXBkYXRlRWZmZWN0U3ltYm9sPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRJdGVtTW9kZWwoZSkuZ2V0TW9kZWwoImVmZmVjdCIpLGk9bi5nZXQoInN5bWJvbFNpemUiKSxyPW4uZ2V0KCJzeW1ib2wiKTtZKGkpfHwoaT1baSxpXSk7dmFyIG89dC5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIiksYT1uLmdldCgiY29sb3IiKXx8byYmby5zdHJva2Uscz10aGlzLmNoaWxkQXQoMSk7dGhpcy5fc3ltYm9sVHlwZSE9PXImJih0aGlzLnJlbW92ZShzKSwocz1YeShyLC0uNSwtLjUsMSwxLGEpKS56Mj0xMDAscy5jdWxsaW5nPSEwLHRoaXMuYWRkKHMpKSxzJiYocy5zZXRTdHlsZSgic2hhZG93Q29sb3IiLGEpLHMuc2V0U3R5bGUobi5nZXRJdGVtU3R5bGUoWyJjb2xvciJdKSkscy5zY2FsZVg9aVswXSxzLnNjYWxlWT1pWzFdLHMuc2V0Q29sb3IoYSksdGhpcy5fc3ltYm9sVHlwZT1yLHRoaXMuX3N5bWJvbFNjYWxlPWksdGhpcy5fdXBkYXRlRWZmZWN0QW5pbWF0aW9uKHQsbixlKSl9LGUucHJvdG90eXBlLl91cGRhdGVFZmZlY3RBbmltYXRpb249ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuY2hpbGRBdCgxKTtpZihpKXt2YXIgcj10LmdldEl0ZW1MYXlvdXQobiksbz0xZTMqZS5nZXQoInBlcmlvZCIpLGE9ZS5nZXQoImxvb3AiKSxzPWUuZ2V0KCJyb3VuZFRyaXAiKSxsPWUuZ2V0KCJjb25zdGFudFNwZWVkIiksdT1pdChlLmdldCgiZGVsYXkiKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUvdC5jb3VudCgpKm8vM30pKTtpZihpLmlnbm9yZT0hMCx0aGlzLl91cGRhdGVBbmltYXRpb25Qb2ludHMoaSxyKSxsPjAmJihvPXRoaXMuX2dldExpbmVMZW5ndGgoaSkvbCoxZTMpLG8hPT10aGlzLl9wZXJpb2R8fGEhPT10aGlzLl9sb29wfHxzIT09dGhpcy5fcm91bmRUcmlwKXtpLnN0b3BBbmltYXRpb24oKTt2YXIgaD12b2lkIDA7aD1YKHUpP3Uobik6dSxpLl9fdD4wJiYoaD0tbyppLl9fdCksdGhpcy5fYW5pbWF0ZVN5bWJvbChpLG8saCxhLHMpfXRoaXMuX3BlcmlvZD1vLHRoaXMuX2xvb3A9YSx0aGlzLl9yb3VuZFRyaXA9c319LGUucHJvdG90eXBlLl9hbmltYXRlU3ltYm9sPWZ1bmN0aW9uKHQsZSxuLGkscil7aWYoZT4wKXt0Ll9fdD0wO3ZhciBvPXRoaXMsYT10LmFuaW1hdGUoIiIsaSkud2hlbihyPzIqZTplLHtfX3Q6cj8yOjF9KS5kZWxheShuKS5kdXJpbmcoKGZ1bmN0aW9uKCl7by5fdXBkYXRlU3ltYm9sUG9zaXRpb24odCl9KSk7aXx8YS5kb25lKChmdW5jdGlvbigpe28ucmVtb3ZlKHQpfSkpLGEuc3RhcnQoKX19LGUucHJvdG90eXBlLl9nZXRMaW5lTGVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBWdCh0Ll9fcDEsdC5fX2NwMSkrVnQodC5fX2NwMSx0Ll9fcDIpfSxlLnByb3RvdHlwZS5fdXBkYXRlQW5pbWF0aW9uUG9pbnRzPWZ1bmN0aW9uKHQsZSl7dC5fX3AxPWVbMF0sdC5fX3AyPWVbMV0sdC5fX2NwMT1lWzJdfHxbKGVbMF1bMF0rZVsxXVswXSkvMiwoZVswXVsxXStlWzFdWzFdKS8yXX0sZS5wcm90b3R5cGUudXBkYXRlRGF0YT1mdW5jdGlvbih0LGUsbil7dGhpcy5jaGlsZEF0KDApLnVwZGF0ZURhdGEodCxlLG4pLHRoaXMuX3VwZGF0ZUVmZmVjdFN5bWJvbCh0LGUpfSxlLnByb3RvdHlwZS5fdXBkYXRlU3ltYm9sUG9zaXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dC5fX3AxLG49dC5fX3AyLGk9dC5fX2NwMSxyPXQuX190PDE/dC5fX3Q6Mi10Ll9fdCxvPVt0LngsdC55XSxhPW8uc2xpY2UoKSxzPUluLGw9VG47b1swXT1zKGVbMF0saVswXSxuWzBdLHIpLG9bMV09cyhlWzFdLGlbMV0sblsxXSxyKTt2YXIgdT10Ll9fdDwxP2woZVswXSxpWzBdLG5bMF0scik6bChuWzBdLGlbMF0sZVswXSwxLXIpLGg9dC5fX3Q8MT9sKGVbMV0saVsxXSxuWzFdLHIpOmwoblsxXSxpWzFdLGVbMV0sMS1yKTt0LnJvdGF0aW9uPS1NYXRoLmF0YW4yKGgsdSktTWF0aC5QSS8yLCJsaW5lIiE9PXRoaXMuX3N5bWJvbFR5cGUmJiJyZWN0IiE9PXRoaXMuX3N5bWJvbFR5cGUmJiJyb3VuZFJlY3QiIT09dGhpcy5fc3ltYm9sVHlwZXx8KHZvaWQgMCE9PXQuX19sYXN0VCYmdC5fX2xhc3RUPHQuX190Pyh0LnNjYWxlWT0xLjA1KlZ0KGEsbyksMT09PXImJihvWzBdPWFbMF0rKG9bMF0tYVswXSkvMixvWzFdPWFbMV0rKG9bMV0tYVsxXSkvMikpOjE9PT10Ll9fbGFzdFQ/dC5zY2FsZVk9MipWdChlLG8pOnQuc2NhbGVZPXRoaXMuX3N5bWJvbFNjYWxlWzFdKSx0Ll9fbGFzdFQ9dC5fX3QsdC5pZ25vcmU9ITEsdC54PW9bMF0sdC55PW9bMV19LGUucHJvdG90eXBlLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0LGUpe3RoaXMuY2hpbGRBdCgwKS51cGRhdGVMYXlvdXQodCxlKTt2YXIgbj10LmdldEl0ZW1Nb2RlbChlKS5nZXRNb2RlbCgiZWZmZWN0Iik7dGhpcy5fdXBkYXRlRWZmZWN0QW5pbWF0aW9uKHQsbixlKX0sZX0oQnIpLEtQPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLGkpe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5fY3JlYXRlUG9seWxpbmUoZSxuLGkpLHJ9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5fY3JlYXRlUG9seWxpbmU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuZ2V0SXRlbUxheW91dChlKSxyPW5ldyBadSh7c2hhcGU6e3BvaW50czppfX0pO3RoaXMuYWRkKHIpLHRoaXMuX3VwZGF0ZUNvbW1vblN0bCh0LGUsbil9LGUucHJvdG90eXBlLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuaG9zdE1vZGVsO3ZoKHRoaXMuY2hpbGRBdCgwKSx7c2hhcGU6e3BvaW50czp0LmdldEl0ZW1MYXlvdXQoZSl9fSxpLGUpLHRoaXMuX3VwZGF0ZUNvbW1vblN0bCh0LGUsbil9LGUucHJvdG90eXBlLl91cGRhdGVDb21tb25TdGw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuY2hpbGRBdCgwKSxyPXQuZ2V0SXRlbU1vZGVsKGUpLG89biYmbi5lbXBoYXNpc0xpbmVTdHlsZSxhPW4mJm4uZm9jdXMscz1uJiZuLmJsdXJTY29wZSxsPW4mJm4uZW1waGFzaXNEaXNhYmxlZDtpZighbnx8dC5oYXNJdGVtT3B0aW9uKXt2YXIgdT1yLmdldE1vZGVsKCJlbXBoYXNpcyIpO289dS5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksbD11LmdldCgiZGlzYWJsZWQiKSxhPXUuZ2V0KCJmb2N1cyIpLHM9dS5nZXQoImJsdXJTY29wZSIpfWkudXNlU3R5bGUodC5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIikpLGkuc3R5bGUuZmlsbD1udWxsLGkuc3R5bGUuc3Ryb2tlTm9TY2FsZT0hMCxpLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPW8sWmwodGhpcyxhLHMsbCl9LGUucHJvdG90eXBlLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0LGUpe3RoaXMuY2hpbGRBdCgwKS5zZXRTaGFwZSgicG9pbnRzIix0LmdldEl0ZW1MYXlvdXQoZSkpfSxlfShCciksJFA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fbGFzdEZyYW1lPTAsZS5fbGFzdEZyYW1lUGVyY2VudD0wLGV9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5jcmVhdGVMaW5lPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IEtQKHQsZSxuKX0sZS5wcm90b3R5cGUuX3VwZGF0ZUFuaW1hdGlvblBvaW50cz1mdW5jdGlvbih0LGUpe3RoaXMuX3BvaW50cz1lO2Zvcih2YXIgbj1bMF0saT0wLHI9MTtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZVtyLTFdLGE9ZVtyXTtpKz1WdChvLGEpLG4ucHVzaChpKX1pZigwIT09aSl7Zm9yKHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdLz1pO3RoaXMuX29mZnNldHM9bix0aGlzLl9sZW5ndGg9aX1lbHNlIHRoaXMuX2xlbmd0aD0wfSxlLnByb3RvdHlwZS5fZ2V0TGluZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZW5ndGh9LGUucHJvdG90eXBlLl91cGRhdGVTeW1ib2xQb3NpdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10Ll9fdDwxP3QuX190OjItdC5fX3Qsbj10aGlzLl9wb2ludHMsaT10aGlzLl9vZmZzZXRzLHI9bi5sZW5ndGg7aWYoaSl7dmFyIG8sYT10aGlzLl9sYXN0RnJhbWU7aWYoZTx0aGlzLl9sYXN0RnJhbWVQZXJjZW50KXtmb3Iobz1NYXRoLm1pbihhKzEsci0xKTtvPj0wJiYhKGlbb108PWUpO28tLSk7bz1NYXRoLm1pbihvLHItMil9ZWxzZXtmb3Iobz1hO288ciYmIShpW29dPmUpO28rKyk7bz1NYXRoLm1pbihvLTEsci0yKX12YXIgcz0oZS1pW29dKS8oaVtvKzFdLWlbb10pLGw9bltvXSx1PW5bbysxXTt0Lng9bFswXSooMS1zKStzKnVbMF0sdC55PWxbMV0qKDEtcykrcyp1WzFdO3ZhciBoPXQuX190PDE/dVswXS1sWzBdOmxbMF0tdVswXSxjPXQuX190PDE/dVsxXS1sWzFdOmxbMV0tdVsxXTt0LnJvdGF0aW9uPS1NYXRoLmF0YW4yKGMsaCktTWF0aC5QSS8yLHRoaXMuX2xhc3RGcmFtZT1vLHRoaXMuX2xhc3RGcmFtZVBlcmNlbnQ9ZSx0Lmlnbm9yZT0hMX19LGV9KHFQKSxKUD1mdW5jdGlvbigpe3RoaXMucG9seWxpbmU9ITEsdGhpcy5jdXJ2ZW5lc3M9MCx0aGlzLnNlZ3M9W119LFFQPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4uX29mZj0wLG4uaG92ZXJEYXRhSWR4PS0xLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMubm90Q2xlYXI9ITEsdGhpcy5fb2ZmPTB9LGUucHJvdG90eXBlLmdldERlZmF1bHRTdHlsZT1mdW5jdGlvbigpe3JldHVybntzdHJva2U6IiMwMDAiLGZpbGw6bnVsbH19LGUucHJvdG90eXBlLmdldERlZmF1bHRTaGFwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgSlB9LGUucHJvdG90eXBlLmJ1aWxkUGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuLGk9ZS5zZWdzLHI9ZS5jdXJ2ZW5lc3M7aWYoZS5wb2x5bGluZSlmb3Iobj10aGlzLl9vZmY7bjxpLmxlbmd0aDspe3ZhciBvPWlbbisrXTtpZihvPjApe3QubW92ZVRvKGlbbisrXSxpW24rK10pO2Zvcih2YXIgYT0xO2E8bzthKyspdC5saW5lVG8oaVtuKytdLGlbbisrXSl9fWVsc2UgZm9yKG49dGhpcy5fb2ZmO248aS5sZW5ndGg7KXt2YXIgcz1pW24rK10sbD1pW24rK10sdT1pW24rK10saD1pW24rK107aWYodC5tb3ZlVG8ocyxsKSxyPjApe3ZhciBjPShzK3UpLzItKGwtaCkqcixwPShsK2gpLzItKHUtcykqcjt0LnF1YWRyYXRpY0N1cnZlVG8oYyxwLHUsaCl9ZWxzZSB0LmxpbmVUbyh1LGgpfXRoaXMuaW5jcmVtZW50YWwmJih0aGlzLl9vZmY9bix0aGlzLm5vdENsZWFyPSEwKX0sZS5wcm90b3R5cGUuZmluZERhdGFJbmRleD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc2hhcGUsaT1uLnNlZ3Mscj1uLmN1cnZlbmVzcyxvPXRoaXMuc3R5bGUubGluZVdpZHRoO2lmKG4ucG9seWxpbmUpZm9yKHZhciBhPTAscz0wO3M8aS5sZW5ndGg7KXt2YXIgbD1pW3MrK107aWYobD4wKWZvcih2YXIgdT1pW3MrK10saD1pW3MrK10sYz0xO2M8bDtjKyspe2lmKGNzKHUsaCxwPWlbcysrXSxkPWlbcysrXSxvLHQsZSkpcmV0dXJuIGF9YSsrfWVsc2UgZm9yKGE9MCxzPTA7czxpLmxlbmd0aDspe3U9aVtzKytdLGg9aVtzKytdO3ZhciBwPWlbcysrXSxkPWlbcysrXTtpZihyPjApe2lmKGRzKHUsaCwodStwKS8yLShoLWQpKnIsKGgrZCkvMi0ocC11KSpyLHAsZCxvLHQsZSkpcmV0dXJuIGF9ZWxzZSBpZihjcyh1LGgscCxkLG8sdCxlKSlyZXR1cm4gYTthKyt9cmV0dXJuLTF9LGUucHJvdG90eXBlLmNvbnRhaW49ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0LGUpLGk9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKTtyZXR1cm4gdD1uWzBdLGU9blsxXSxpLmNvbnRhaW4odCxlKT8odGhpcy5ob3ZlckRhdGFJZHg9dGhpcy5maW5kRGF0YUluZGV4KHQsZSkpPj0wOih0aGlzLmhvdmVyRGF0YUlkeD0tMSwhMSl9LGUucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlY3Q7aWYoIXQpe2Zvcih2YXIgZT10aGlzLnNoYXBlLnNlZ3Msbj0xLzAsaT0xLzAscj0tMS8wLG89LTEvMCxhPTA7YTxlLmxlbmd0aDspe3ZhciBzPWVbYSsrXSxsPWVbYSsrXTtuPU1hdGgubWluKHMsbikscj1NYXRoLm1heChzLHIpLGk9TWF0aC5taW4obCxpKSxvPU1hdGgubWF4KGwsbyl9dD10aGlzLl9yZWN0PW5ldyB6ZShuLGkscixvKX1yZXR1cm4gdH0sZX0oa3MpLHRPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZ3JvdXA9bmV3IEJyfXJldHVybiB0LnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2NsZWFyKCk7dmFyIGU9dGhpcy5fY3JlYXRlKCk7ZS5zZXRTaGFwZSh7c2Vnczp0LmdldExheW91dCgibGluZXNQb2ludHMiKX0pLHRoaXMuX3NldENvbW1vbihlLHQpfSx0LnByb3RvdHlwZS5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl9jbGVhcigpfSx0LnByb3RvdHlwZS5pbmNyZW1lbnRhbFVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX25ld0FkZGVkWzBdLGk9ZS5nZXRMYXlvdXQoImxpbmVzUG9pbnRzIikscj1uJiZuLnNoYXBlLnNlZ3M7aWYociYmci5sZW5ndGg8MmU0KXt2YXIgbz1yLmxlbmd0aCxhPW5ldyBGbG9hdDMyQXJyYXkobytpLmxlbmd0aCk7YS5zZXQociksYS5zZXQoaSxvKSxuLnNldFNoYXBlKHtzZWdzOmF9KX1lbHNle3RoaXMuX25ld0FkZGVkPVtdO3ZhciBzPXRoaXMuX2NyZWF0ZSgpO3MuaW5jcmVtZW50YWw9ITAscy5zZXRTaGFwZSh7c2VnczppfSksdGhpcy5fc2V0Q29tbW9uKHMsZSkscy5fX3N0YXJ0SW5kZXg9dC5zdGFydH19LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyKCl9LHQucHJvdG90eXBlLmVhY2hSZW5kZXJlZD1mdW5jdGlvbih0KXt0aGlzLl9uZXdBZGRlZFswXSYmdCh0aGlzLl9uZXdBZGRlZFswXSl9LHQucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgUVAoe2N1cnNvcjoiZGVmYXVsdCIsaWdub3JlQ29hcnNlUG9pbnRlcjohMH0pO3JldHVybiB0aGlzLl9uZXdBZGRlZC5wdXNoKHQpLHRoaXMuZ3JvdXAuYWRkKHQpLHR9LHQucHJvdG90eXBlLl9zZXRDb21tb249ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWUuaG9zdE1vZGVsO3Quc2V0U2hhcGUoe3BvbHlsaW5lOmkuZ2V0KCJwb2x5bGluZSIpLGN1cnZlbmVzczppLmdldChbImxpbmVTdHlsZSIsImN1cnZlbmVzcyJdKX0pLHQudXNlU3R5bGUoaS5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCkpLHQuc3R5bGUuc3Ryb2tlTm9TY2FsZT0hMDt2YXIgcj1lLmdldFZpc3VhbCgic3R5bGUiKTtyJiZyLnN0cm9rZSYmdC5zZXRTdHlsZSgic3Ryb2tlIixyLnN0cm9rZSksdC5zZXRTdHlsZSgiZmlsbCIsbnVsbCk7dmFyIG89cmwodCk7by5zZXJpZXNJbmRleD1pLnNlcmllc0luZGV4LHQub24oIm1vdXNlbW92ZSIsKGZ1bmN0aW9uKGUpe28uZGF0YUluZGV4PW51bGw7dmFyIG49dC5ob3ZlckRhdGFJZHg7bj4wJiYoby5kYXRhSW5kZXg9bit0Ll9fc3RhcnRJbmRleCl9KSl9LHQucHJvdG90eXBlLl9jbGVhcj1mdW5jdGlvbigpe3RoaXMuX25ld0FkZGVkPVtdLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LHR9KCksZU89e3Nlcmllc1R5cGU6ImxpbmVzIixwbGFuOmtnKCkscmVzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlU3lzdGVtO2lmKGUpe3ZhciBuPXQuZ2V0KCJwb2x5bGluZSIpLGk9dC5waXBlbGluZUNvbnRleHQubGFyZ2U7cmV0dXJue3Byb2dyZXNzOmZ1bmN0aW9uKHIsbyl7dmFyIGE9W107aWYoaSl7dmFyIHM9dm9pZCAwLGw9ci5lbmQtci5zdGFydDtpZihuKXtmb3IodmFyIHU9MCxoPXIuc3RhcnQ7aDxyLmVuZDtoKyspdSs9dC5nZXRMaW5lQ29vcmRzQ291bnQoaCk7cz1uZXcgRmxvYXQzMkFycmF5KGwrMip1KX1lbHNlIHM9bmV3IEZsb2F0MzJBcnJheSg0KmwpO3ZhciBjPTAscD1bXTtmb3IoaD1yLnN0YXJ0O2g8ci5lbmQ7aCsrKXt2YXIgZD10LmdldExpbmVDb29yZHMoaCxhKTtuJiYoc1tjKytdPWQpO2Zvcih2YXIgZj0wO2Y8ZDtmKyspcD1lLmRhdGFUb1BvaW50KGFbZl0sITEscCksc1tjKytdPXBbMF0sc1tjKytdPXBbMV19by5zZXRMYXlvdXQoImxpbmVzUG9pbnRzIixzKX1lbHNlIGZvcihoPXIuc3RhcnQ7aDxyLmVuZDtoKyspe3ZhciBnPW8uZ2V0SXRlbU1vZGVsKGgpLHk9KGQ9dC5nZXRMaW5lQ29vcmRzKGgsYSksW10pO2lmKG4pZm9yKHZhciB2PTA7djxkO3YrKyl5LnB1c2goZS5kYXRhVG9Qb2ludChhW3ZdKSk7ZWxzZXt5WzBdPWUuZGF0YVRvUG9pbnQoYVswXSkseVsxXT1lLmRhdGFUb1BvaW50KGFbMV0pO3ZhciBtPWcuZ2V0KFsibGluZVN0eWxlIiwiY3VydmVuZXNzIl0pOyttJiYoeVsyXT1bKHlbMF1bMF0reVsxXVswXSkvMi0oeVswXVsxXS15WzFdWzFdKSptLCh5WzBdWzFdK3lbMV1bMV0pLzItKHlbMV1bMF0teVswXVswXSkqbV0pfW8uc2V0SXRlbUxheW91dChoLHkpfX19fX19LG5PPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCkscj10aGlzLl91cGRhdGVMaW5lRHJhdyhpLHQpLG89dC5nZXQoInpsZXZlbCIpLGE9dC5nZXQoWyJlZmZlY3QiLCJ0cmFpbExlbmd0aCJdKSxzPW4uZ2V0WnIoKSxsPSJzdmciPT09cy5wYWludGVyLmdldFR5cGUoKTtsfHxzLnBhaW50ZXIuZ2V0TGF5ZXIobykuY2xlYXIoITApLG51bGw9PXRoaXMuX2xhc3RabGV2ZWx8fGx8fHMuY29uZmlnTGF5ZXIodGhpcy5fbGFzdFpsZXZlbCx7bW90aW9uQmx1cjohMX0pLHRoaXMuX3Nob3dFZmZlY3QodCkmJmE+MCYmKGx8fHMuY29uZmlnTGF5ZXIobyx7bW90aW9uQmx1cjohMCxsYXN0RnJhbWVBbHBoYTpNYXRoLm1heChNYXRoLm1pbihhLzEwKy45LDEpLDApfSkpLHIudXBkYXRlRGF0YShpKTt2YXIgdT10LmdldCgiY2xpcCIsITApJiZQUyh0LmNvb3JkaW5hdGVTeXN0ZW0sITEsdCk7dT90aGlzLmdyb3VwLnNldENsaXBQYXRoKHUpOnRoaXMuZ3JvdXAucmVtb3ZlQ2xpcFBhdGgoKSx0aGlzLl9sYXN0WmxldmVsPW8sdGhpcy5fZmluaXNoZWQ9ITB9LGUucHJvdG90eXBlLmluY3JlbWVudGFsUHJlcGFyZVJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCk7dGhpcy5fdXBkYXRlTGluZURyYXcoaSx0KS5pbmNyZW1lbnRhbFByZXBhcmVVcGRhdGUoaSksdGhpcy5fY2xlYXJMYXllcihuKSx0aGlzLl9maW5pc2hlZD0hMX0sZS5wcm90b3R5cGUuaW5jcmVtZW50YWxSZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX2xpbmVEcmF3LmluY3JlbWVudGFsVXBkYXRlKHQsZS5nZXREYXRhKCkpLHRoaXMuX2ZpbmlzaGVkPXQuZW5kPT09ZS5nZXREYXRhKCkuY291bnQoKX0sZS5wcm90b3R5cGUuZWFjaFJlbmRlcmVkPWZ1bmN0aW9uKHQpe3RoaXMuX2xpbmVEcmF3JiZ0aGlzLl9saW5lRHJhdy5lYWNoUmVuZGVyZWQodCl9LGUucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCkscj10LnBpcGVsaW5lQ29udGV4dDtpZighdGhpcy5fZmluaXNoZWR8fHIubGFyZ2V8fHIucHJvZ3Jlc3NpdmVSZW5kZXIpcmV0dXJue3VwZGF0ZTohMH07dmFyIG89ZU8ucmVzZXQodCxlLG4pO28ucHJvZ3Jlc3MmJm8ucHJvZ3Jlc3Moe3N0YXJ0OjAsZW5kOmkuY291bnQoKSxjb3VudDppLmNvdW50KCl9LGkpLHRoaXMuX2xpbmVEcmF3LnVwZGF0ZUxheW91dCgpLHRoaXMuX2NsZWFyTGF5ZXIobil9LGUucHJvdG90eXBlLl91cGRhdGVMaW5lRHJhdz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2xpbmVEcmF3LGk9dGhpcy5fc2hvd0VmZmVjdChlKSxyPSEhZS5nZXQoInBvbHlsaW5lIiksbz1lLnBpcGVsaW5lQ29udGV4dC5sYXJnZTtyZXR1cm4gbiYmaT09PXRoaXMuX2hhc0VmZmV0JiZyPT09dGhpcy5faXNQb2x5bGluZSYmbz09PXRoaXMuX2lzTGFyZ2VEcmF3fHwobiYmbi5yZW1vdmUoKSxuPXRoaXMuX2xpbmVEcmF3PW8/bmV3IHRPOm5ldyBZQShyP2k/JFA6S1A6aT9xUDpIQSksdGhpcy5faGFzRWZmZXQ9aSx0aGlzLl9pc1BvbHlsaW5lPXIsdGhpcy5faXNMYXJnZURyYXc9byksdGhpcy5ncm91cC5hZGQobi5ncm91cCksbn0sZS5wcm90b3R5cGUuX3Nob3dFZmZlY3Q9ZnVuY3Rpb24odCl7cmV0dXJuISF0LmdldChbImVmZmVjdCIsInNob3ciXSl9LGUucHJvdG90eXBlLl9jbGVhckxheWVyPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0WnIoKTsic3ZnIj09PWUucGFpbnRlci5nZXRUeXBlKCl8fG51bGw9PXRoaXMuX2xhc3RabGV2ZWx8fGUucGFpbnRlci5nZXRMYXllcih0aGlzLl9sYXN0WmxldmVsKS5jbGVhcighMCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2xpbmVEcmF3JiZ0aGlzLl9saW5lRHJhdy5yZW1vdmUoKSx0aGlzLl9saW5lRHJhdz1udWxsLHRoaXMuX2NsZWFyTGF5ZXIoZSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24odCxlKXt0aGlzLnJlbW92ZSh0LGUpfSxlLnR5cGU9ImxpbmVzIixlfShPZyksaU89InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50MzJBcnJheT9BcnJheTpVaW50MzJBcnJheSxyTz0idW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0NjRBcnJheT9BcnJheTpGbG9hdDY0QXJyYXk7ZnVuY3Rpb24gb08odCl7dmFyIGU9dC5kYXRhO2UmJmVbMF0mJmVbMF1bMF0mJmVbMF1bMF0uY29vcmQmJih0LmRhdGE9eihlLChmdW5jdGlvbih0KXt2YXIgZT17Y29vcmRzOlt0WzBdLmNvb3JkLHRbMV0uY29vcmRdfTtyZXR1cm4gdFswXS5uYW1lJiYoZS5mcm9tTmFtZT10WzBdLm5hbWUpLHRbMV0ubmFtZSYmKGUudG9OYW1lPXRbMV0ubmFtZSksRChbZSx0WzBdLHRbMV1dKX0pKSl9dmFyIGFPPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi52aXN1YWxTdHlsZUFjY2Vzc1BhdGg9ImxpbmVTdHlsZSIsbi52aXN1YWxEcmF3VHlwZT0ic3Ryb2tlIixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXtlLmRhdGE9ZS5kYXRhfHxbXSxvTyhlKTt2YXIgbj10aGlzLl9wcm9jZXNzRmxhdENvb3Jkc0FycmF5KGUuZGF0YSk7dGhpcy5fZmxhdENvb3Jkcz1uLmZsYXRDb29yZHMsdGhpcy5fZmxhdENvb3Jkc09mZnNldD1uLmZsYXRDb29yZHNPZmZzZXQsbi5mbGF0Q29vcmRzJiYoZS5kYXRhPW5ldyBGbG9hdDMyQXJyYXkobi5jb3VudCkpLHQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbihlKXtpZihvTyhlKSxlLmRhdGEpe3ZhciBuPXRoaXMuX3Byb2Nlc3NGbGF0Q29vcmRzQXJyYXkoZS5kYXRhKTt0aGlzLl9mbGF0Q29vcmRzPW4uZmxhdENvb3Jkcyx0aGlzLl9mbGF0Q29vcmRzT2Zmc2V0PW4uZmxhdENvb3Jkc09mZnNldCxuLmZsYXRDb29yZHMmJihlLmRhdGE9bmV3IEZsb2F0MzJBcnJheShuLmNvdW50KSl9dC5wcm90b3R5cGUubWVyZ2VPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5hcHBlbmREYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Byb2Nlc3NGbGF0Q29vcmRzQXJyYXkodC5kYXRhKTtlLmZsYXRDb29yZHMmJih0aGlzLl9mbGF0Q29vcmRzPyh0aGlzLl9mbGF0Q29vcmRzPXZ0KHRoaXMuX2ZsYXRDb29yZHMsZS5mbGF0Q29vcmRzKSx0aGlzLl9mbGF0Q29vcmRzT2Zmc2V0PXZ0KHRoaXMuX2ZsYXRDb29yZHNPZmZzZXQsZS5mbGF0Q29vcmRzT2Zmc2V0KSk6KHRoaXMuX2ZsYXRDb29yZHM9ZS5mbGF0Q29vcmRzLHRoaXMuX2ZsYXRDb29yZHNPZmZzZXQ9ZS5mbGF0Q29vcmRzT2Zmc2V0KSx0LmRhdGE9bmV3IEZsb2F0MzJBcnJheShlLmNvdW50KSksdGhpcy5nZXRSYXdEYXRhKCkuYXBwZW5kRGF0YSh0LmRhdGEpfSxlLnByb3RvdHlwZS5fZ2V0Q29vcmRzRnJvbUl0ZW1Nb2RlbD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKS5nZXRJdGVtTW9kZWwodCksbj1lLm9wdGlvbiBpbnN0YW5jZW9mIEFycmF5P2Uub3B0aW9uOmUuZ2V0U2hhbGxvdygiY29vcmRzIik7cmV0dXJuIG59LGUucHJvdG90eXBlLmdldExpbmVDb29yZHNDb3VudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmxhdENvb3Jkc09mZnNldD90aGlzLl9mbGF0Q29vcmRzT2Zmc2V0WzIqdCsxXTp0aGlzLl9nZXRDb29yZHNGcm9tSXRlbU1vZGVsKHQpLmxlbmd0aH0sZS5wcm90b3R5cGUuZ2V0TGluZUNvb3Jkcz1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2ZsYXRDb29yZHNPZmZzZXQpe2Zvcih2YXIgbj10aGlzLl9mbGF0Q29vcmRzT2Zmc2V0WzIqdF0saT10aGlzLl9mbGF0Q29vcmRzT2Zmc2V0WzIqdCsxXSxyPTA7cjxpO3IrKyllW3JdPWVbcl18fFtdLGVbcl1bMF09dGhpcy5fZmxhdENvb3Jkc1tuKzIqcl0sZVtyXVsxXT10aGlzLl9mbGF0Q29vcmRzW24rMipyKzFdO3JldHVybiBpfXZhciBvPXRoaXMuX2dldENvb3Jkc0Zyb21JdGVtTW9kZWwodCk7Zm9yKHI9MDtyPG8ubGVuZ3RoO3IrKyllW3JdPWVbcl18fFtdLGVbcl1bMF09b1tyXVswXSxlW3JdWzFdPW9bcl1bMV07cmV0dXJuIG8ubGVuZ3RofSxlLnByb3RvdHlwZS5fcHJvY2Vzc0ZsYXRDb29yZHNBcnJheT1mdW5jdGlvbih0KXt2YXIgZT0wO2lmKHRoaXMuX2ZsYXRDb29yZHMmJihlPXRoaXMuX2ZsYXRDb29yZHMubGVuZ3RoKSxqKHRbMF0pKXtmb3IodmFyIG49dC5sZW5ndGgsaT1uZXcgaU8obikscj1uZXcgck8obiksbz0wLGE9MCxzPTAsbD0wO2w8bjspe3MrKzt2YXIgdT10W2wrK107aVthKytdPW8rZSxpW2ErK109dTtmb3IodmFyIGg9MDtoPHU7aCsrKXt2YXIgYz10W2wrK10scD10W2wrK107cltvKytdPWMscltvKytdPXB9fXJldHVybntmbGF0Q29vcmRzT2Zmc2V0Om5ldyBVaW50MzJBcnJheShpLmJ1ZmZlciwwLGEpLGZsYXRDb29yZHM6cixjb3VudDpzfX1yZXR1cm57ZmxhdENvb3Jkc09mZnNldDpudWxsLGZsYXRDb29yZHM6bnVsbCxjb3VudDp0Lmxlbmd0aH19LGUucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IGN4KFsidmFsdWUiXSx0aGlzKTtyZXR1cm4gbi5oYXNJdGVtT3B0aW9uPSExLG4uaW5pdERhdGEodC5kYXRhLFtdLChmdW5jdGlvbih0LGUsaSxyKXtpZih0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIE5hTjtuLmhhc0l0ZW1PcHRpb249ITA7dmFyIG89dC52YWx1ZTtyZXR1cm4gbnVsbCE9bz9vIGluc3RhbmNlb2YgQXJyYXk/b1tyXTpvOnZvaWQgMH0pKSxufSxlLnByb3RvdHlwZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmdldERhdGEoKS5nZXRJdGVtTW9kZWwodCkscj1pLmdldCgibmFtZSIpO2lmKHIpcmV0dXJuIHI7dmFyIG89aS5nZXQoImZyb21OYW1lIiksYT1pLmdldCgidG9OYW1lIikscz1bXTtyZXR1cm4gbnVsbCE9byYmcy5wdXNoKG8pLG51bGwhPWEmJnMucHVzaChhKSxvZygibmFtZVZhbHVlIix7bmFtZTpzLmpvaW4oIiA+ICIpfSl9LGUucHJvdG90eXBlLnByZXZlbnRJbmNyZW1lbnRhbD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5nZXQoWyJlZmZlY3QiLCJzaG93Il0pfSxlLnByb3RvdHlwZS5nZXRQcm9ncmVzc2l2ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLnByb2dyZXNzaXZlO3JldHVybiBudWxsPT10P3RoaXMub3B0aW9uLmxhcmdlPzFlNDp0aGlzLmdldCgicHJvZ3Jlc3NpdmUiKTp0fSxlLnByb3RvdHlwZS5nZXRQcm9ncmVzc2l2ZVRocmVzaG9sZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLnByb2dyZXNzaXZlVGhyZXNob2xkO3JldHVybiBudWxsPT10P3RoaXMub3B0aW9uLmxhcmdlPzJlNDp0aGlzLmdldCgicHJvZ3Jlc3NpdmVUaHJlc2hvbGQiKTp0fSxlLnByb3RvdHlwZS5nZXRaTGV2ZWxLZXk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldE1vZGVsKCJlZmZlY3QiKSxlPXQuZ2V0KCJ0cmFpbExlbmd0aCIpO3JldHVybiB0aGlzLmdldERhdGEoKS5jb3VudCgpPnRoaXMuZ2V0UHJvZ3Jlc3NpdmVUaHJlc2hvbGQoKT90aGlzLmlkOnQuZ2V0KCJzaG93IikmJmU+MD9lKyIiOiIifSxlLnR5cGU9InNlcmllcy5saW5lcyIsZS5kZXBlbmRlbmNpZXM9WyJncmlkIiwicG9sYXIiLCJnZW8iLCJjYWxlbmRhciJdLGUuZGVmYXVsdE9wdGlvbj17Y29vcmRpbmF0ZVN5c3RlbToiZ2VvIix6OjIsbGVnZW5kSG92ZXJMaW5rOiEwLHhBeGlzSW5kZXg6MCx5QXhpc0luZGV4OjAsc3ltYm9sOlsibm9uZSIsIm5vbmUiXSxzeW1ib2xTaXplOlsxMCwxMF0sZ2VvSW5kZXg6MCxlZmZlY3Q6e3Nob3c6ITEscGVyaW9kOjQsY29uc3RhbnRTcGVlZDowLHN5bWJvbDoiY2lyY2xlIixzeW1ib2xTaXplOjMsbG9vcDohMCx0cmFpbExlbmd0aDouMn0sbGFyZ2U6ITEsbGFyZ2VUaHJlc2hvbGQ6MmUzLHBvbHlsaW5lOiExLGNsaXA6ITAsbGFiZWw6e3Nob3c6ITEscG9zaXRpb246ImVuZCJ9LGxpbmVTdHlsZTp7b3BhY2l0eTouNX19LGV9KGJnKTtmdW5jdGlvbiBzTyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFycmF5fHwodD1bdCx0XSksdH12YXIgbE89e3Nlcmllc1R5cGU6ImxpbmVzIixyZXNldDpmdW5jdGlvbih0KXt2YXIgZT1zTyh0LmdldCgic3ltYm9sIikpLG49c08odC5nZXQoInN5bWJvbFNpemUiKSksaT10LmdldERhdGEoKTtyZXR1cm4gaS5zZXRWaXN1YWwoImZyb21TeW1ib2wiLGUmJmVbMF0pLGkuc2V0VmlzdWFsKCJ0b1N5bWJvbCIsZSYmZVsxXSksaS5zZXRWaXN1YWwoImZyb21TeW1ib2xTaXplIixuJiZuWzBdKSxpLnNldFZpc3VhbCgidG9TeW1ib2xTaXplIixuJiZuWzFdKSx7ZGF0YUVhY2g6aS5oYXNJdGVtT3B0aW9uP2Z1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRJdGVtTW9kZWwoZSksaT1zTyhuLmdldFNoYWxsb3coInN5bWJvbCIsITApKSxyPXNPKG4uZ2V0U2hhbGxvdygic3ltYm9sU2l6ZSIsITApKTtpWzBdJiZ0LnNldEl0ZW1WaXN1YWwoZSwiZnJvbVN5bWJvbCIsaVswXSksaVsxXSYmdC5zZXRJdGVtVmlzdWFsKGUsInRvU3ltYm9sIixpWzFdKSxyWzBdJiZ0LnNldEl0ZW1WaXN1YWwoZSwiZnJvbVN5bWJvbFNpemUiLHJbMF0pLHJbMV0mJnQuc2V0SXRlbVZpc3VhbChlLCJ0b1N5bWJvbFNpemUiLHJbMV0pfTpudWxsfX19O3ZhciB1Tz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmJsdXJTaXplPTMwLHRoaXMucG9pbnRTaXplPTIwLHRoaXMubWF4T3BhY2l0eT0xLHRoaXMubWluT3BhY2l0eT0wLHRoaXMuX2dyYWRpZW50UGl4ZWxzPXtpblJhbmdlOm51bGwsb3V0T2ZSYW5nZTpudWxsfTt2YXIgdD1oLmNyZWF0ZUNhbnZhcygpO3RoaXMuY2FudmFzPXR9cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIGE9dGhpcy5fZ2V0QnJ1c2goKSxzPXRoaXMuX2dldEdyYWRpZW50KHIsImluUmFuZ2UiKSxsPXRoaXMuX2dldEdyYWRpZW50KHIsIm91dE9mUmFuZ2UiKSx1PXRoaXMucG9pbnRTaXplK3RoaXMuYmx1clNpemUsaD10aGlzLmNhbnZhcyxjPWguZ2V0Q29udGV4dCgiMmQiKSxwPXQubGVuZ3RoO2gud2lkdGg9ZSxoLmhlaWdodD1uO2Zvcih2YXIgZD0wO2Q8cDsrK2Qpe3ZhciBmPXRbZF0sZz1mWzBdLHk9ZlsxXSx2PWkoZlsyXSk7Yy5nbG9iYWxBbHBoYT12LGMuZHJhd0ltYWdlKGEsZy11LHktdSl9aWYoIWgud2lkdGh8fCFoLmhlaWdodClyZXR1cm4gaDtmb3IodmFyIG09Yy5nZXRJbWFnZURhdGEoMCwwLGgud2lkdGgsaC5oZWlnaHQpLHg9bS5kYXRhLF89MCxiPXgubGVuZ3RoLHc9dGhpcy5taW5PcGFjaXR5LFM9dGhpcy5tYXhPcGFjaXR5LXc7XzxiOyl7dj14W18rM10vMjU2O3ZhciBNPTQqTWF0aC5mbG9vcigyNTUqdik7aWYodj4wKXt2YXIgST1vKHYpP3M6bDt2PjAmJih2PXYqUyt3KSx4W18rK109SVtNXSx4W18rK109SVtNKzFdLHhbXysrXT1JW00rMl0seFtfKytdPUlbTSszXSp2KjI1Nn1lbHNlIF8rPTR9cmV0dXJuIGMucHV0SW1hZ2VEYXRhKG0sMCwwKSxofSx0LnByb3RvdHlwZS5fZ2V0QnJ1c2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9icnVzaENhbnZhc3x8KHRoaXMuX2JydXNoQ2FudmFzPWguY3JlYXRlQ2FudmFzKCkpLGU9dGhpcy5wb2ludFNpemUrdGhpcy5ibHVyU2l6ZSxuPTIqZTt0LndpZHRoPW4sdC5oZWlnaHQ9bjt2YXIgaT10LmdldENvbnRleHQoIjJkIik7cmV0dXJuIGkuY2xlYXJSZWN0KDAsMCxuLG4pLGkuc2hhZG93T2Zmc2V0WD1uLGkuc2hhZG93Qmx1cj10aGlzLmJsdXJTaXplLGkuc2hhZG93Q29sb3I9IiMwMDAiLGkuYmVnaW5QYXRoKCksaS5hcmMoLWUsZSx0aGlzLnBvaW50U2l6ZSwwLDIqTWF0aC5QSSwhMCksaS5jbG9zZVBhdGgoKSxpLmZpbGwoKSx0fSx0LnByb3RvdHlwZS5fZ2V0R3JhZGllbnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5fZ3JhZGllbnRQaXhlbHMsaT1uW2VdfHwobltlXT1uZXcgVWludDhDbGFtcGVkQXJyYXkoMTAyNCkpLHI9WzAsMCwwLDBdLG89MCxhPTA7YTwyNTY7YSsrKXRbZV0oYS8yNTUsITAsciksaVtvKytdPXJbMF0saVtvKytdPXJbMV0saVtvKytdPXJbMl0saVtvKytdPXJbM107cmV0dXJuIGl9LHR9KCk7ZnVuY3Rpb24gaE8odCl7dmFyIGU9dC5kaW1lbnNpb25zO3JldHVybiJsbmciPT09ZVswXSYmImxhdCI9PT1lWzFdfXZhciBjTz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpO2UuZWFjaENvbXBvbmVudCgidmlzdWFsTWFwIiwoZnVuY3Rpb24oZSl7ZS5lYWNoVGFyZ2V0U2VyaWVzKChmdW5jdGlvbihuKXtuPT09dCYmKGk9ZSl9KSl9KSksdGhpcy5fcHJvZ3Jlc3NpdmVFbHM9bnVsbCx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpO3ZhciByPXQuY29vcmRpbmF0ZVN5c3RlbTsiY2FydGVzaWFuMmQiPT09ci50eXBlfHwiY2FsZW5kYXIiPT09ci50eXBlP3RoaXMuX3JlbmRlck9uQ2FydGVzaWFuQW5kQ2FsZW5kYXIodCxuLDAsdC5nZXREYXRhKCkuY291bnQoKSk6aE8ocikmJnRoaXMuX3JlbmRlck9uR2VvKHIsdCxpLG4pfSxlLnByb3RvdHlwZS5pbmNyZW1lbnRhbFByZXBhcmVSZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LGUucHJvdG90eXBlLmluY3JlbWVudGFsUmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPWUuY29vcmRpbmF0ZVN5c3RlbTtyJiYoaE8ocik/dGhpcy5yZW5kZXIoZSxuLGkpOih0aGlzLl9wcm9ncmVzc2l2ZUVscz1bXSx0aGlzLl9yZW5kZXJPbkNhcnRlc2lhbkFuZENhbGVuZGFyKGUsaSx0LnN0YXJ0LHQuZW5kLCEwKSkpfSxlLnByb3RvdHlwZS5lYWNoUmVuZGVyZWQ9ZnVuY3Rpb24odCl7SmgodGhpcy5fcHJvZ3Jlc3NpdmVFbHN8fHRoaXMuZ3JvdXAsdCl9LGUucHJvdG90eXBlLl9yZW5kZXJPbkNhcnRlc2lhbkFuZENhbGVuZGFyPWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG8sYSxzLGwsdT10LmNvb3JkaW5hdGVTeXN0ZW0saD1PUyh1LCJjYXJ0ZXNpYW4yZCIpO2lmKGgpe3ZhciBjPXUuZ2V0QXhpcygieCIpLHA9dS5nZXRBeGlzKCJ5Iik7MCxvPWMuZ2V0QmFuZFdpZHRoKCkrLjUsYT1wLmdldEJhbmRXaWR0aCgpKy41LHM9Yy5zY2FsZS5nZXRFeHRlbnQoKSxsPXAuc2NhbGUuZ2V0RXh0ZW50KCl9Zm9yKHZhciBkPXRoaXMuZ3JvdXAsZj10LmdldERhdGEoKSxnPXQuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsIml0ZW1TdHlsZSJdKS5nZXRJdGVtU3R5bGUoKSx5PXQuZ2V0TW9kZWwoWyJibHVyIiwiaXRlbVN0eWxlIl0pLmdldEl0ZW1TdHlsZSgpLHY9dC5nZXRNb2RlbChbInNlbGVjdCIsIml0ZW1TdHlsZSJdKS5nZXRJdGVtU3R5bGUoKSxtPXQuZ2V0KFsiaXRlbVN0eWxlIiwiYm9yZGVyUmFkaXVzIl0pLHg9cmModCksXz10LmdldE1vZGVsKCJlbXBoYXNpcyIpLGI9Xy5nZXQoImZvY3VzIiksdz1fLmdldCgiYmx1clNjb3BlIiksUz1fLmdldCgiZGlzYWJsZWQiKSxNPWg/W2YubWFwRGltZW5zaW9uKCJ4IiksZi5tYXBEaW1lbnNpb24oInkiKSxmLm1hcERpbWVuc2lvbigidmFsdWUiKV06W2YubWFwRGltZW5zaW9uKCJ0aW1lIiksZi5tYXBEaW1lbnNpb24oInZhbHVlIildLEk9bjtJPGk7SSsrKXt2YXIgVD12b2lkIDAsQz1mLmdldEl0ZW1WaXN1YWwoSSwic3R5bGUiKTtpZihoKXt2YXIgRD1mLmdldChNWzBdLEkpLEE9Zi5nZXQoTVsxXSxJKTtpZihpc05hTihmLmdldChNWzJdLEkpKXx8aXNOYU4oRCl8fGlzTmFOKEEpfHxEPHNbMF18fEQ+c1sxXXx8QTxsWzBdfHxBPmxbMV0pY29udGludWU7dmFyIGs9dS5kYXRhVG9Qb2ludChbRCxBXSk7VD1uZXcgV3Moe3NoYXBlOnt4OmtbMF0tby8yLHk6a1sxXS1hLzIsd2lkdGg6byxoZWlnaHQ6YX0sc3R5bGU6Q30pfWVsc2V7aWYoaXNOYU4oZi5nZXQoTVsxXSxJKSkpY29udGludWU7VD1uZXcgV3Moe3oyOjEsc2hhcGU6dS5kYXRhVG9SZWN0KFtmLmdldChNWzBdLEkpXSkuY29udGVudFNoYXBlLHN0eWxlOkN9KX1pZihmLmhhc0l0ZW1PcHRpb24pe3ZhciBMPWYuZ2V0SXRlbU1vZGVsKEkpLFA9TC5nZXRNb2RlbCgiZW1waGFzaXMiKTtnPVAuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpLHk9TC5nZXRNb2RlbChbImJsdXIiLCJpdGVtU3R5bGUiXSkuZ2V0SXRlbVN0eWxlKCksdj1MLmdldE1vZGVsKFsic2VsZWN0IiwiaXRlbVN0eWxlIl0pLmdldEl0ZW1TdHlsZSgpLG09TC5nZXQoWyJpdGVtU3R5bGUiLCJib3JkZXJSYWRpdXMiXSksYj1QLmdldCgiZm9jdXMiKSx3PVAuZ2V0KCJibHVyU2NvcGUiKSxTPVAuZ2V0KCJkaXNhYmxlZCIpLHg9cmMoTCl9VC5zaGFwZS5yPW07dmFyIE89dC5nZXRSYXdWYWx1ZShJKSxSPSItIjtPJiZudWxsIT1PWzJdJiYoUj1PWzJdKyIiKSxpYyhULHgse2xhYmVsRmV0Y2hlcjp0LGxhYmVsRGF0YUluZGV4OkksZGVmYXVsdE9wYWNpdHk6Qy5vcGFjaXR5LGRlZmF1bHRUZXh0OlJ9KSxULmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPWcsVC5lbnN1cmVTdGF0ZSgiYmx1ciIpLnN0eWxlPXksVC5lbnN1cmVTdGF0ZSgic2VsZWN0Iikuc3R5bGU9dixabChULGIsdyxTKSxULmluY3JlbWVudGFsPXIsciYmKFQuc3RhdGVzLmVtcGhhc2lzLmhvdmVyTGF5ZXI9ITApLGQuYWRkKFQpLGYuc2V0SXRlbUdyYXBoaWNFbChJLFQpLHRoaXMuX3Byb2dyZXNzaXZlRWxzJiZ0aGlzLl9wcm9ncmVzc2l2ZUVscy5wdXNoKFQpfX0sZS5wcm90b3R5cGUuX3JlbmRlck9uR2VvPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4udGFyZ2V0VmlzdWFscy5pblJhbmdlLG89bi50YXJnZXRWaXN1YWxzLm91dE9mUmFuZ2UsYT1lLmdldERhdGEoKSxzPXRoaXMuX2htTGF5ZXJ8fHRoaXMuX2htTGF5ZXJ8fG5ldyB1TztzLmJsdXJTaXplPWUuZ2V0KCJibHVyU2l6ZSIpLHMucG9pbnRTaXplPWUuZ2V0KCJwb2ludFNpemUiKSxzLm1pbk9wYWNpdHk9ZS5nZXQoIm1pbk9wYWNpdHkiKSxzLm1heE9wYWNpdHk9ZS5nZXQoIm1heE9wYWNpdHkiKTt2YXIgbD10LmdldFZpZXdSZWN0KCkuY2xvbmUoKSx1PXQuZ2V0Um9hbVRyYW5zZm9ybSgpO2wuYXBwbHlUcmFuc2Zvcm0odSk7dmFyIGg9TWF0aC5tYXgobC54LDApLGM9TWF0aC5tYXgobC55LDApLHA9TWF0aC5taW4obC53aWR0aCtsLngsaS5nZXRXaWR0aCgpKSxkPU1hdGgubWluKGwuaGVpZ2h0K2wueSxpLmdldEhlaWdodCgpKSxmPXAtaCxnPWQtYyx5PVthLm1hcERpbWVuc2lvbigibG5nIiksYS5tYXBEaW1lbnNpb24oImxhdCIpLGEubWFwRGltZW5zaW9uKCJ2YWx1ZSIpXSx2PWEubWFwQXJyYXkoeSwoZnVuY3Rpb24oZSxuLGkpe3ZhciByPXQuZGF0YVRvUG9pbnQoW2Usbl0pO3JldHVybiByWzBdLT1oLHJbMV0tPWMsci5wdXNoKGkpLHJ9KSksbT1uLmdldEV4dGVudCgpLHg9InZpc3VhbE1hcC5jb250aW51b3VzIj09PW4udHlwZT9mdW5jdGlvbih0LGUpe3ZhciBuPXRbMV0tdFswXTtyZXR1cm4gZT1bKGVbMF0tdFswXSkvbiwoZVsxXS10WzBdKS9uXSxmdW5jdGlvbih0KXtyZXR1cm4gdD49ZVswXSYmdDw9ZVsxXX19KG0sbi5vcHRpb24ucmFuZ2UpOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10WzFdLXRbMF0scj0oZT16KGUsKGZ1bmN0aW9uKGUpe3JldHVybntpbnRlcnZhbDpbKGUuaW50ZXJ2YWxbMF0tdFswXSkvaSwoZS5pbnRlcnZhbFsxXS10WzBdKS9pXX19KSkpLmxlbmd0aCxvPTA7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpO2ZvcihpPW87aTxyO2krKylpZigoYT1lW2ldLmludGVydmFsKVswXTw9dCYmdDw9YVsxXSl7bz1pO2JyZWFrfWlmKGk9PT1yKWZvcihpPW8tMTtpPj0wO2ktLSl7dmFyIGE7aWYoKGE9ZVtpXS5pbnRlcnZhbClbMF08PXQmJnQ8PWFbMV0pe289aTticmVha319cmV0dXJuIGk+PTAmJmk8ciYmbltpXX19KG0sbi5nZXRQaWVjZUxpc3QoKSxuLm9wdGlvbi5zZWxlY3RlZCk7cy51cGRhdGUodixmLGcsci5jb2xvci5nZXROb3JtYWxpemVyKCkse2luUmFuZ2U6ci5jb2xvci5nZXRDb2xvck1hcHBlcigpLG91dE9mUmFuZ2U6by5jb2xvci5nZXRDb2xvck1hcHBlcigpfSx4KTt2YXIgXz1uZXcgTnMoe3N0eWxlOnt3aWR0aDpmLGhlaWdodDpnLHg6aCx5OmMsaW1hZ2U6cy5jYW52YXN9LHNpbGVudDohMH0pO3RoaXMuZ3JvdXAuYWRkKF8pfSxlLnR5cGU9ImhlYXRtYXAiLGV9KE9nKSxwTz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXRJbml0aWFsRGF0YT1mdW5jdGlvbih0LGUpe3JldHVybiBfeChudWxsLHRoaXMse2dlbmVyYXRlQ29vcmQ6InZhbHVlIn0pfSxlLnByb3RvdHlwZS5wcmV2ZW50SW5jcmVtZW50YWw9ZnVuY3Rpb24oKXt2YXIgdD13ZC5nZXQodGhpcy5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSk7aWYodCYmdC5kaW1lbnNpb25zKXJldHVybiJsbmciPT09dC5kaW1lbnNpb25zWzBdJiYibGF0Ij09PXQuZGltZW5zaW9uc1sxXX0sZS50eXBlPSJzZXJpZXMuaGVhdG1hcCIsZS5kZXBlbmRlbmNpZXM9WyJncmlkIiwiZ2VvIiwiY2FsZW5kYXIiXSxlLmRlZmF1bHRPcHRpb249e2Nvb3JkaW5hdGVTeXN0ZW06ImNhcnRlc2lhbjJkIix6OjIsZ2VvSW5kZXg6MCxibHVyU2l6ZTozMCxwb2ludFNpemU6MjAsbWF4T3BhY2l0eToxLG1pbk9wYWNpdHk6MCxzZWxlY3Q6e2l0ZW1TdHlsZTp7Ym9yZGVyQ29sb3I6IiMyMTIxMjEifX19LGV9KGJnKTt2YXIgZE89WyJpdGVtU3R5bGUiLCJib3JkZXJXaWR0aCJdLGZPPVt7eHk6IngiLHdoOiJ3aWR0aCIsaW5kZXg6MCxwb3NEZXNjOlsibGVmdCIsInJpZ2h0Il19LHt4eToieSIsd2g6ImhlaWdodCIsaW5kZXg6MSxwb3NEZXNjOlsidG9wIiwiYm90dG9tIl19XSxnTz1uZXcgU3UseU89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmdyb3VwLHI9dC5nZXREYXRhKCksbz10aGlzLl9kYXRhLGE9dC5jb29yZGluYXRlU3lzdGVtLHM9YS5nZXRCYXNlQXhpcygpLmlzSG9yaXpvbnRhbCgpLGw9YS5tYXN0ZXIuZ2V0UmVjdCgpLHU9e2VjU2l6ZTp7d2lkdGg6bi5nZXRXaWR0aCgpLGhlaWdodDpuLmdldEhlaWdodCgpfSxzZXJpZXNNb2RlbDp0LGNvb3JkU3lzOmEsY29vcmRTeXNFeHRlbnQ6W1tsLngsbC54K2wud2lkdGhdLFtsLnksbC55K2wuaGVpZ2h0XV0saXNIb3Jpem9udGFsOnMsdmFsdWVEaW06Zk9bK3NdLGNhdGVnb3J5RGltOmZPWzEtK3NdfTtyLmRpZmYobykuYWRkKChmdW5jdGlvbih0KXtpZihyLmhhc1ZhbHVlKHQpKXt2YXIgZT1NTyhyLHQpLG49dk8ocix0LGUsdSksbz1DTyhyLHUsbik7ci5zZXRJdGVtR3JhcGhpY0VsKHQsbyksaS5hZGQobyksUE8obyx1LG4pfX0pKS51cGRhdGUoKGZ1bmN0aW9uKHQsZSl7dmFyIG49by5nZXRJdGVtR3JhcGhpY0VsKGUpO2lmKHIuaGFzVmFsdWUodCkpe3ZhciBhPU1PKHIsdCkscz12TyhyLHQsYSx1KSxsPUFPKHIscyk7biYmbCE9PW4uX19waWN0b3JpYWxTaGFwZVN0ciYmKGkucmVtb3ZlKG4pLHIuc2V0SXRlbUdyYXBoaWNFbCh0LG51bGwpLG49bnVsbCksbj9mdW5jdGlvbih0LGUsbil7dmFyIGk9bi5hbmltYXRpb25Nb2RlbCxyPW4uZGF0YUluZGV4LG89dC5fX3BpY3RvcmlhbEJ1bmRsZTt2aChvLHt4Om4uYnVuZGxlUG9zaXRpb25bMF0seTpuLmJ1bmRsZVBvc2l0aW9uWzFdfSxpLHIpLG4uc3ltYm9sUmVwZWF0P19PKHQsZSxuLCEwKTpiTyh0LGUsbiwhMCk7d08odCxuLCEwKSxTTyh0LGUsbiwhMCl9KG4sdSxzKTpuPUNPKHIsdSxzLCEwKSxyLnNldEl0ZW1HcmFwaGljRWwodCxuKSxuLl9fcGljdG9yaWFsU3ltYm9sTWV0YT1zLGkuYWRkKG4pLFBPKG4sdSxzKX1lbHNlIGkucmVtb3ZlKG4pfSkpLnJlbW92ZSgoZnVuY3Rpb24odCl7dmFyIGU9by5nZXRJdGVtR3JhcGhpY0VsKHQpO2UmJkRPKG8sdCxlLl9fcGljdG9yaWFsU3ltYm9sTWV0YS5hbmltYXRpb25Nb2RlbCxlKX0pKS5leGVjdXRlKCk7dmFyIGg9dC5nZXQoImNsaXAiLCEwKT9QUyh0LmNvb3JkaW5hdGVTeXN0ZW0sITEsdCk6bnVsbDtyZXR1cm4gaD9pLnNldENsaXBQYXRoKGgpOmkucmVtb3ZlQ2xpcFBhdGgoKSx0aGlzLl9kYXRhPXIsdGhpcy5ncm91cH0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5ncm91cCxpPXRoaXMuX2RhdGE7dC5nZXQoImFuaW1hdGlvbiIpP2kmJmkuZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKGUpe0RPKGkscmwoZSkuZGF0YUluZGV4LHQsZSl9KSk6bi5yZW1vdmVBbGwoKX0sZS50eXBlPSJwaWN0b3JpYWxCYXIiLGV9KE9nKTtmdW5jdGlvbiB2Tyh0LGUsbixpKXt2YXIgcj10LmdldEl0ZW1MYXlvdXQoZSksbz1uLmdldCgic3ltYm9sUmVwZWF0IiksYT1uLmdldCgic3ltYm9sQ2xpcCIpLHM9bi5nZXQoInN5bWJvbFBvc2l0aW9uIil8fCJzdGFydCIsbD0obi5nZXQoInN5bWJvbFJvdGF0ZSIpfHwwKSpNYXRoLlBJLzE4MHx8MCx1PW4uZ2V0KCJzeW1ib2xQYXR0ZXJuU2l6ZSIpfHwyLGg9bi5pc0FuaW1hdGlvbkVuYWJsZWQoKSxjPXtkYXRhSW5kZXg6ZSxsYXlvdXQ6cixpdGVtTW9kZWw6bixzeW1ib2xUeXBlOnQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2wiKXx8ImNpcmNsZSIsc3R5bGU6dC5nZXRJdGVtVmlzdWFsKGUsInN0eWxlIiksc3ltYm9sQ2xpcDphLHN5bWJvbFJlcGVhdDpvLHN5bWJvbFJlcGVhdERpcmVjdGlvbjpuLmdldCgic3ltYm9sUmVwZWF0RGlyZWN0aW9uIiksc3ltYm9sUGF0dGVyblNpemU6dSxyb3RhdGlvbjpsLGFuaW1hdGlvbk1vZGVsOmg/bjpudWxsLGhvdmVyU2NhbGU6aCYmbi5nZXQoWyJlbXBoYXNpcyIsInNjYWxlIl0pLHoyOm4uZ2V0U2hhbGxvdygieiIsITApfHwwfTshZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbyxhPWkudmFsdWVEaW0scz10LmdldCgic3ltYm9sQm91bmRpbmdEYXRhIiksbD1pLmNvb3JkU3lzLmdldE90aGVyQXhpcyhpLmNvb3JkU3lzLmdldEJhc2VBeGlzKCkpLHU9bC50b0dsb2JhbENvb3JkKGwuZGF0YVRvQ29vcmQoMCkpLGg9MS0rKG5bYS53aF08PTApO2lmKFkocykpe3ZhciBjPVttTyhsLHNbMF0pLXUsbU8obCxzWzFdKS11XTtjWzFdPGNbMF0mJmMucmV2ZXJzZSgpLG89Y1toXX1lbHNlIG89bnVsbCE9cz9tTyhsLHMpLXU6ZT9pLmNvb3JkU3lzRXh0ZW50W2EuaW5kZXhdW2hdLXU6blthLndoXTtyLmJvdW5kaW5nTGVuZ3RoPW8sZSYmKHIucmVwZWF0Q3V0TGVuZ3RoPW5bYS53aF0pO3IucHhTaWduPW8+MD8xOi0xfShuLG8scixpLGMpLGZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyxsLHUpe3ZhciBoLGM9bC52YWx1ZURpbSxwPWwuY2F0ZWdvcnlEaW0sZD1NYXRoLmFicyhuW3Aud2hdKSxmPXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIik7aD1ZKGYpP2Yuc2xpY2UoKTpudWxsPT1mP1siMTAwJSIsIjEwMCUiXTpbZixmXTtoW3AuaW5kZXhdPSRyKGhbcC5pbmRleF0sZCksaFtjLmluZGV4XT0kcihoW2MuaW5kZXhdLGk/ZDpNYXRoLmFicyhvKSksdS5zeW1ib2xTaXplPWg7dmFyIGc9dS5zeW1ib2xTY2FsZT1baFswXS9zLGhbMV0vc107Z1tjLmluZGV4XSo9KGwuaXNIb3Jpem9udGFsPy0xOjEpKmF9KHQsZSxyLG8sMCxjLmJvdW5kaW5nTGVuZ3RoLGMucHhTaWduLHUsaSxjKSxmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXQuZ2V0KGRPKXx8MDtvJiYoZ08uYXR0cih7c2NhbGVYOmVbMF0sc2NhbGVZOmVbMV0scm90YXRpb246bn0pLGdPLnVwZGF0ZVRyYW5zZm9ybSgpLG8vPWdPLmdldExpbmVTY2FsZSgpLG8qPWVbaS52YWx1ZURpbS5pbmRleF0pO3IudmFsdWVMaW5lV2lkdGg9b3x8MH0obixjLnN5bWJvbFNjYWxlLGwsaSxjKTt2YXIgcD1jLnN5bWJvbFNpemUsZD1aeShuLmdldCgic3ltYm9sT2Zmc2V0IikscCk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyxsLHUsaCxjKXt2YXIgcD1oLmNhdGVnb3J5RGltLGQ9aC52YWx1ZURpbSxmPWMucHhTaWduLGc9TWF0aC5tYXgoZVtkLmluZGV4XStzLDApLHk9ZztpZihpKXt2YXIgdj1NYXRoLmFicyhsKSxtPWl0KHQuZ2V0KCJzeW1ib2xNYXJnaW4iKSwiMTUlIikrIiIseD0hMTttLmxhc3RJbmRleE9mKCIhIik9PT1tLmxlbmd0aC0xJiYoeD0hMCxtPW0uc2xpY2UoMCxtLmxlbmd0aC0xKSk7dmFyIF89JHIobSxlW2QuaW5kZXhdKSxiPU1hdGgubWF4KGcrMipfLDApLHc9eD8wOjIqXyxTPXZvKGkpLE09Uz9pOk9PKCh2K3cpL2IpO2I9ZysyKihfPSh2LU0qZykvMi8oeD9NOk1hdGgubWF4KE0tMSwxKSkpLHc9eD8wOjIqXyxTfHwiZml4ZWQiPT09aXx8KE09dT9PTygoTWF0aC5hYnModSkrdykvYik6MCkseT1NKmItdyxjLnJlcGVhdFRpbWVzPU0sYy5zeW1ib2xNYXJnaW49X312YXIgST1mKih5LzIpLFQ9Yy5wYXRoUG9zaXRpb249W107VFtwLmluZGV4XT1uW3Aud2hdLzIsVFtkLmluZGV4XT0ic3RhcnQiPT09YT9JOiJlbmQiPT09YT9sLUk6bC8yLG8mJihUWzBdKz1vWzBdLFRbMV0rPW9bMV0pO3ZhciBDPWMuYnVuZGxlUG9zaXRpb249W107Q1twLmluZGV4XT1uW3AueHldLENbZC5pbmRleF09bltkLnh5XTt2YXIgRD1jLmJhclJlY3RTaGFwZT1BKHt9LG4pO0RbZC53aF09ZipNYXRoLm1heChNYXRoLmFicyhuW2Qud2hdKSxNYXRoLmFicyhUW2QuaW5kZXhdK0kpKSxEW3Aud2hdPW5bcC53aF07dmFyIGs9Yy5jbGlwU2hhcGU9e307a1twLnh5XT0tbltwLnh5XSxrW3Aud2hdPWguZWNTaXplW3Aud2hdLGtbZC54eV09MCxrW2Qud2hdPW5bZC53aF19KG4scCxyLG8sMCxkLHMsYy52YWx1ZUxpbmVXaWR0aCxjLmJvdW5kaW5nTGVuZ3RoLGMucmVwZWF0Q3V0TGVuZ3RoLGksYyksY31mdW5jdGlvbiBtTyh0LGUpe3JldHVybiB0LnRvR2xvYmFsQ29vcmQodC5kYXRhVG9Db29yZCh0LnNjYWxlLnBhcnNlKGUpKSl9ZnVuY3Rpb24geE8odCl7dmFyIGU9dC5zeW1ib2xQYXR0ZXJuU2l6ZSxuPVh5KHQuc3ltYm9sVHlwZSwtZS8yLC1lLzIsZSxlKTtyZXR1cm4gbi5hdHRyKHtjdWxsaW5nOiEwfSksImltYWdlIiE9PW4udHlwZSYmbi5zZXRTdHlsZSh7c3Ryb2tlTm9TY2FsZTohMH0pLG59ZnVuY3Rpb24gX08odCxlLG4saSl7dmFyIHI9dC5fX3BpY3RvcmlhbEJ1bmRsZSxvPW4uc3ltYm9sU2l6ZSxhPW4udmFsdWVMaW5lV2lkdGgscz1uLnBhdGhQb3NpdGlvbixsPWUudmFsdWVEaW0sdT1uLnJlcGVhdFRpbWVzfHwwLGg9MCxjPW9bZS52YWx1ZURpbS5pbmRleF0rYSsyKm4uc3ltYm9sTWFyZ2luO2ZvcihrTyh0LChmdW5jdGlvbih0KXt0Ll9fcGljdG9yaWFsQW5pbWF0aW9uSW5kZXg9aCx0Ll9fcGljdG9yaWFsUmVwZWF0VGltZXM9dSxoPHU/TE8odCxudWxsLGYoaCksbixpKTpMTyh0LG51bGwse3NjYWxlWDowLHNjYWxlWTowfSxuLGksKGZ1bmN0aW9uKCl7ci5yZW1vdmUodCl9KSksaCsrfSkpO2g8dTtoKyspe3ZhciBwPXhPKG4pO3AuX19waWN0b3JpYWxBbmltYXRpb25JbmRleD1oLHAuX19waWN0b3JpYWxSZXBlYXRUaW1lcz11LHIuYWRkKHApO3ZhciBkPWYoaCk7TE8ocCx7eDpkLngseTpkLnksc2NhbGVYOjAsc2NhbGVZOjB9LHtzY2FsZVg6ZC5zY2FsZVgsc2NhbGVZOmQuc2NhbGVZLHJvdGF0aW9uOmQucm90YXRpb259LG4saSl9ZnVuY3Rpb24gZih0KXt2YXIgZT1zLnNsaWNlKCksaT1uLnB4U2lnbixyPXQ7cmV0dXJuKCJzdGFydCI9PT1uLnN5bWJvbFJlcGVhdERpcmVjdGlvbj9pPjA6aTwwKSYmKHI9dS0xLXQpLGVbbC5pbmRleF09Yyooci11LzIrLjUpK3NbbC5pbmRleF0se3g6ZVswXSx5OmVbMV0sc2NhbGVYOm4uc3ltYm9sU2NhbGVbMF0sc2NhbGVZOm4uc3ltYm9sU2NhbGVbMV0scm90YXRpb246bi5yb3RhdGlvbn19fWZ1bmN0aW9uIGJPKHQsZSxuLGkpe3ZhciByPXQuX19waWN0b3JpYWxCdW5kbGUsbz10Ll9fcGljdG9yaWFsTWFpblBhdGg7bz9MTyhvLG51bGwse3g6bi5wYXRoUG9zaXRpb25bMF0seTpuLnBhdGhQb3NpdGlvblsxXSxzY2FsZVg6bi5zeW1ib2xTY2FsZVswXSxzY2FsZVk6bi5zeW1ib2xTY2FsZVsxXSxyb3RhdGlvbjpuLnJvdGF0aW9ufSxuLGkpOihvPXQuX19waWN0b3JpYWxNYWluUGF0aD14TyhuKSxyLmFkZChvKSxMTyhvLHt4Om4ucGF0aFBvc2l0aW9uWzBdLHk6bi5wYXRoUG9zaXRpb25bMV0sc2NhbGVYOjAsc2NhbGVZOjAscm90YXRpb246bi5yb3RhdGlvbn0se3NjYWxlWDpuLnN5bWJvbFNjYWxlWzBdLHNjYWxlWTpuLnN5bWJvbFNjYWxlWzFdfSxuLGkpKX1mdW5jdGlvbiB3Tyh0LGUsbil7dmFyIGk9QSh7fSxlLmJhclJlY3RTaGFwZSkscj10Ll9fcGljdG9yaWFsQmFyUmVjdDtyP0xPKHIsbnVsbCx7c2hhcGU6aX0sZSxuKTooKHI9dC5fX3BpY3RvcmlhbEJhclJlY3Q9bmV3IFdzKHt6MjoyLHNoYXBlOmksc2lsZW50OiEwLHN0eWxlOntzdHJva2U6InRyYW5zcGFyZW50IixmaWxsOiJ0cmFuc3BhcmVudCIsbGluZVdpZHRoOjB9fSkpLmRpc2FibGVNb3JwaGluZz0hMCx0LmFkZChyKSl9ZnVuY3Rpb24gU08odCxlLG4saSl7aWYobi5zeW1ib2xDbGlwKXt2YXIgcj10Ll9fcGljdG9yaWFsQ2xpcFBhdGgsbz1BKHt9LG4uY2xpcFNoYXBlKSxhPWUudmFsdWVEaW0scz1uLmFuaW1hdGlvbk1vZGVsLGw9bi5kYXRhSW5kZXg7aWYocil2aChyLHtzaGFwZTpvfSxzLGwpO2Vsc2V7b1thLndoXT0wLHI9bmV3IFdzKHtzaGFwZTpvfSksdC5fX3BpY3RvcmlhbEJ1bmRsZS5zZXRDbGlwUGF0aChyKSx0Ll9fcGljdG9yaWFsQ2xpcFBhdGg9cjt2YXIgdT17fTt1W2Eud2hdPW4uY2xpcFNoYXBlW2Eud2hdLFFoW2k/InVwZGF0ZVByb3BzIjoiaW5pdFByb3BzIl0ocix7c2hhcGU6dX0scyxsKX19fWZ1bmN0aW9uIE1PKHQsZSl7dmFyIG49dC5nZXRJdGVtTW9kZWwoZSk7cmV0dXJuIG4uZ2V0QW5pbWF0aW9uRGVsYXlQYXJhbXM9SU8sbi5pc0FuaW1hdGlvbkVuYWJsZWQ9VE8sbn1mdW5jdGlvbiBJTyh0KXtyZXR1cm57aW5kZXg6dC5fX3BpY3RvcmlhbEFuaW1hdGlvbkluZGV4LGNvdW50OnQuX19waWN0b3JpYWxSZXBlYXRUaW1lc319ZnVuY3Rpb24gVE8oKXtyZXR1cm4gdGhpcy5wYXJlbnRNb2RlbC5pc0FuaW1hdGlvbkVuYWJsZWQoKSYmISF0aGlzLmdldFNoYWxsb3coImFuaW1hdGlvbiIpfWZ1bmN0aW9uIENPKHQsZSxuLGkpe3ZhciByPW5ldyBCcixvPW5ldyBCcjtyZXR1cm4gci5hZGQobyksci5fX3BpY3RvcmlhbEJ1bmRsZT1vLG8ueD1uLmJ1bmRsZVBvc2l0aW9uWzBdLG8ueT1uLmJ1bmRsZVBvc2l0aW9uWzFdLG4uc3ltYm9sUmVwZWF0P19PKHIsZSxuKTpiTyhyLDAsbiksd08ocixuLGkpLFNPKHIsZSxuLGkpLHIuX19waWN0b3JpYWxTaGFwZVN0cj1BTyh0LG4pLHIuX19waWN0b3JpYWxTeW1ib2xNZXRhPW4scn1mdW5jdGlvbiBETyh0LGUsbixpKXt2YXIgcj1pLl9fcGljdG9yaWFsQmFyUmVjdDtyJiZyLnJlbW92ZVRleHRDb250ZW50KCk7dmFyIG89W107a08oaSwoZnVuY3Rpb24odCl7by5wdXNoKHQpfSkpLGkuX19waWN0b3JpYWxNYWluUGF0aCYmby5wdXNoKGkuX19waWN0b3JpYWxNYWluUGF0aCksaS5fX3BpY3RvcmlhbENsaXBQYXRoJiYobj1udWxsKSxFKG8sKGZ1bmN0aW9uKHQpe19oKHQse3NjYWxlWDowLHNjYWxlWTowfSxuLGUsKGZ1bmN0aW9uKCl7aS5wYXJlbnQmJmkucGFyZW50LnJlbW92ZShpKX0pKX0pKSx0LnNldEl0ZW1HcmFwaGljRWwoZSxudWxsKX1mdW5jdGlvbiBBTyh0LGUpe3JldHVyblt0LmdldEl0ZW1WaXN1YWwoZS5kYXRhSW5kZXgsInN5bWJvbCIpfHwibm9uZSIsISFlLnN5bWJvbFJlcGVhdCwhIWUuc3ltYm9sQ2xpcF0uam9pbigiOiIpfWZ1bmN0aW9uIGtPKHQsZSxuKXtFKHQuX19waWN0b3JpYWxCdW5kbGUuY2hpbGRyZW4oKSwoZnVuY3Rpb24oaSl7aSE9PXQuX19waWN0b3JpYWxCYXJSZWN0JiZlLmNhbGwobixpKX0pKX1mdW5jdGlvbiBMTyh0LGUsbixpLHIsbyl7ZSYmdC5hdHRyKGUpLGkuc3ltYm9sQ2xpcCYmIXI/biYmdC5hdHRyKG4pOm4mJlFoW3I/InVwZGF0ZVByb3BzIjoiaW5pdFByb3BzIl0odCxuLGkuYW5pbWF0aW9uTW9kZWwsaS5kYXRhSW5kZXgsbyl9ZnVuY3Rpb24gUE8odCxlLG4pe3ZhciBpPW4uZGF0YUluZGV4LHI9bi5pdGVtTW9kZWwsbz1yLmdldE1vZGVsKCJlbXBoYXNpcyIpLGE9by5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCkscz1yLmdldE1vZGVsKFsiYmx1ciIsIml0ZW1TdHlsZSJdKS5nZXRJdGVtU3R5bGUoKSxsPXIuZ2V0TW9kZWwoWyJzZWxlY3QiLCJpdGVtU3R5bGUiXSkuZ2V0SXRlbVN0eWxlKCksdT1yLmdldFNoYWxsb3coImN1cnNvciIpLGg9by5nZXQoImZvY3VzIiksYz1vLmdldCgiYmx1clNjb3BlIikscD1vLmdldCgic2NhbGUiKTtrTyh0LChmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgTnMpe3ZhciBlPXQuc3R5bGU7dC51c2VTdHlsZShBKHtpbWFnZTplLmltYWdlLHg6ZS54LHk6ZS55LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSxuLnN0eWxlKSl9ZWxzZSB0LnVzZVN0eWxlKG4uc3R5bGUpO3ZhciBpPXQuZW5zdXJlU3RhdGUoImVtcGhhc2lzIik7aS5zdHlsZT1hLHAmJihpLnNjYWxlWD0xLjEqdC5zY2FsZVgsaS5zY2FsZVk9MS4xKnQuc2NhbGVZKSx0LmVuc3VyZVN0YXRlKCJibHVyIikuc3R5bGU9cyx0LmVuc3VyZVN0YXRlKCJzZWxlY3QiKS5zdHlsZT1sLHUmJih0LmN1cnNvcj11KSx0LnoyPW4uejJ9KSk7dmFyIGQ9ZS52YWx1ZURpbS5wb3NEZXNjWysobi5ib3VuZGluZ0xlbmd0aD4wKV0sZj10Ll9fcGljdG9yaWFsQmFyUmVjdDtmLmlnbm9yZUNsaXA9ITAsaWMoZixyYyhyKSx7bGFiZWxGZXRjaGVyOmUuc2VyaWVzTW9kZWwsbGFiZWxEYXRhSW5kZXg6aSxkZWZhdWx0VGV4dDpwUyhlLnNlcmllc01vZGVsLmdldERhdGEoKSxpKSxpbmhlcml0Q29sb3I6bi5zdHlsZS5maWxsLGRlZmF1bHRPcGFjaXR5Om4uc3R5bGUub3BhY2l0eSxkZWZhdWx0T3V0c2lkZVBvc2l0aW9uOmR9KSxabCh0LGgsYyxvLmdldCgiZGlzYWJsZWQiKSl9ZnVuY3Rpb24gT08odCl7dmFyIGU9TWF0aC5yb3VuZCh0KTtyZXR1cm4gTWF0aC5hYnModC1lKTwxZS00P2U6TWF0aC5jZWlsKHQpfXZhciBSTz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4uaGFzU3ltYm9sVmlzdWFsPSEwLG4uZGVmYXVsdFN5bWJvbD0icm91bmRSZWN0IixufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhY2s9bnVsbCx0LnByb3RvdHlwZS5nZXRJbml0aWFsRGF0YS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUudHlwZT0ic2VyaWVzLnBpY3RvcmlhbEJhciIsZS5kZXBlbmRlbmNpZXM9WyJncmlkIl0sZS5kZWZhdWx0T3B0aW9uPWtjKHFTLmRlZmF1bHRPcHRpb24se3N5bWJvbDoiY2lyY2xlIixzeW1ib2xTaXplOm51bGwsc3ltYm9sUm90YXRlOm51bGwsc3ltYm9sUG9zaXRpb246bnVsbCxzeW1ib2xPZmZzZXQ6bnVsbCxzeW1ib2xNYXJnaW46bnVsbCxzeW1ib2xSZXBlYXQ6ITEsc3ltYm9sUmVwZWF0RGlyZWN0aW9uOiJlbmQiLHN5bWJvbENsaXA6ITEsc3ltYm9sQm91bmRpbmdEYXRhOm51bGwsc3ltYm9sUGF0dGVyblNpemU6NDAwLGJhckdhcDoiLTEwMCUiLGNsaXA6ITEscHJvZ3Jlc3NpdmU6MCxlbXBoYXNpczp7c2NhbGU6ITF9LHNlbGVjdDp7aXRlbVN0eWxlOntib3JkZXJDb2xvcjoiIzIxMjEyMSJ9fX0pLGV9KHFTKTt2YXIgTk89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLl9sYXllcnM9W10sbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXREYXRhKCkscj10aGlzLG89dGhpcy5ncm91cCxhPXQuZ2V0TGF5ZXJTZXJpZXMoKSxzPWkuZ2V0TGF5b3V0KCJsYXlvdXRJbmZvIiksbD1zLnJlY3QsdT1zLmJvdW5kYXJ5R2FwO2Z1bmN0aW9uIGgodCl7cmV0dXJuIHQubmFtZX1vLng9MCxvLnk9bC55K3VbMF07dmFyIGM9bmV3IEdtKHRoaXMuX2xheWVyc1Nlcmllc3x8W10sYSxoLGgpLHA9W107ZnVuY3Rpb24gZChlLG4scyl7dmFyIGw9ci5fbGF5ZXJzO2lmKCJyZW1vdmUiIT09ZSl7Zm9yKHZhciB1LGgsYz1bXSxkPVtdLGY9YVtuXS5pbmRpY2VzLGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIHk9aS5nZXRJdGVtTGF5b3V0KGZbZ10pLHY9eS54LG09eS55MCx4PXkueTtjLnB1c2godixtKSxkLnB1c2godixtK3gpLHU9aS5nZXRJdGVtVmlzdWFsKGZbZ10sInN0eWxlIil9dmFyIF89aS5nZXRJdGVtTGF5b3V0KGZbMF0pLGI9dC5nZXRNb2RlbCgibGFiZWwiKS5nZXQoIm1hcmdpbiIpLHc9dC5nZXRNb2RlbCgiZW1waGFzaXMiKTtpZigiYWRkIj09PWUpe3ZhciBTPXBbbl09bmV3IEJyO2g9bmV3IEFTKHtzaGFwZTp7cG9pbnRzOmMsc3RhY2tlZE9uUG9pbnRzOmQsc21vb3RoOi40LHN0YWNrZWRPblNtb290aDouNCxzbW9vdGhDb25zdHJhaW50OiExfSx6MjowfSksUy5hZGQoaCksby5hZGQoUyksdC5pc0FuaW1hdGlvbkVuYWJsZWQoKSYmaC5zZXRDbGlwUGF0aChmdW5jdGlvbih0LGUsbil7dmFyIGk9bmV3IFdzKHtzaGFwZTp7eDp0LngtMTAseTp0LnktMTAsd2lkdGg6MCxoZWlnaHQ6dC5oZWlnaHQrMjB9fSk7cmV0dXJuIG1oKGkse3NoYXBlOnt4OnQueC01MCx3aWR0aDp0LndpZHRoKzEwMCxoZWlnaHQ6dC5oZWlnaHQrMjB9fSxlLG4pLGl9KGguZ2V0Qm91bmRpbmdSZWN0KCksdCwoZnVuY3Rpb24oKXtoLnJlbW92ZUNsaXBQYXRoKCl9KSkpfWVsc2V7Uz1sW3NdO2g9Uy5jaGlsZEF0KDApLG8uYWRkKFMpLHBbbl09Uyx2aChoLHtzaGFwZTp7cG9pbnRzOmMsc3RhY2tlZE9uUG9pbnRzOmR9fSx0KSxTaChoKX1pYyhoLHJjKHQpLHtsYWJlbERhdGFJbmRleDpmW2ctMV0sZGVmYXVsdFRleHQ6aS5nZXROYW1lKGZbZy0xXSksaW5oZXJpdENvbG9yOnUuZmlsbH0se25vcm1hbDp7dmVydGljYWxBbGlnbjoibWlkZGxlIn19KSxoLnNldFRleHRDb25maWcoe3Bvc2l0aW9uOm51bGwsbG9jYWw6ITB9KTt2YXIgTT1oLmdldFRleHRDb250ZW50KCk7TSYmKE0ueD1fLngtYixNLnk9Xy55MCtfLnkvMiksaC51c2VTdHlsZSh1KSxpLnNldEl0ZW1HcmFwaGljRWwobixoKSwkbChoLHQpLFpsKGgsdy5nZXQoImZvY3VzIiksdy5nZXQoImJsdXJTY29wZSIpLHcuZ2V0KCJkaXNhYmxlZCIpKX1lbHNlIG8ucmVtb3ZlKGxbbl0pfWMuYWRkKFcoZCx0aGlzLCJhZGQiKSkudXBkYXRlKFcoZCx0aGlzLCJ1cGRhdGUiKSkucmVtb3ZlKFcoZCx0aGlzLCJyZW1vdmUiKSkuZXhlY3V0ZSgpLHRoaXMuX2xheWVyc1Nlcmllcz1hLHRoaXMuX2xheWVycz1wfSxlLnR5cGU9InRoZW1lUml2ZXIiLGV9KE9nKTt2YXIgRU89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmxlZ2VuZFZpc3VhbFByb3ZpZGVyPW5ldyBOTShXKHRoaXMuZ2V0RGF0YSx0aGlzKSxXKHRoaXMuZ2V0UmF3RGF0YSx0aGlzKSl9LGUucHJvdG90eXBlLmZpeERhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgsbj17fSxpPVVvKHQsKGZ1bmN0aW9uKHQpe3JldHVybiBuLmhhc093blByb3BlcnR5KHRbMF0rIiIpfHwoblt0WzBdKyIiXT0tMSksdFsyXX0pKSxyPVtdO2kuYnVja2V0cy5lYWNoKChmdW5jdGlvbih0LGUpe3IucHVzaCh7bmFtZTplLGRhdGFMaXN0OnR9KX0pKTtmb3IodmFyIG89ci5sZW5ndGgsYT0wO2E8bzsrK2Epe2Zvcih2YXIgcz1yW2FdLm5hbWUsbD0wO2w8clthXS5kYXRhTGlzdC5sZW5ndGg7KytsKXt2YXIgdT1yW2FdLmRhdGFMaXN0W2xdWzBdKyIiO25bdV09YX1mb3IodmFyIHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiZuW3VdIT09YSYmKG5bdV09YSx0W2VdPVt1LDAsc10sZSsrKX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0SW5pdGlhbERhdGE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJzaW5nbGVBeGlzIixXbykubW9kZWxzWzBdLmdldCgidHlwZSIpLGk9Qih0LmRhdGEsKGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10WzJdfSkpLHI9dGhpcy5maXhEYXRhKGl8fFtdKSxvPVtdLGE9dGhpcy5uYW1lTWFwPXl0KCkscz0wLGw9MDtsPHIubGVuZ3RoOysrbClvLnB1c2gocltsXVsyXSksYS5nZXQocltsXVsyXSl8fChhLnNldChyW2xdWzJdLHMpLHMrKyk7dmFyIHU9cHgocix7Y29vcmREaW1lbnNpb25zOlsic2luZ2xlIl0sZGltZW5zaW9uc0RlZmluZTpbe25hbWU6InRpbWUiLHR5cGU6WW0obil9LHtuYW1lOiJ2YWx1ZSIsdHlwZToiZmxvYXQifSx7bmFtZToibmFtZSIsdHlwZToib3JkaW5hbCJ9XSxlbmNvZGVEZWZpbmU6e3NpbmdsZTowLHZhbHVlOjEsaXRlbU5hbWU6Mn19KS5kaW1lbnNpb25zLGg9bmV3IGN4KHUsdGhpcyk7cmV0dXJuIGguaW5pdERhdGEociksaH0sZS5wcm90b3R5cGUuZ2V0TGF5ZXJTZXJpZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXREYXRhKCksZT10LmNvdW50KCksbj1bXSxpPTA7aTxlOysraSluW2ldPWk7dmFyIHI9dC5tYXBEaW1lbnNpb24oInNpbmdsZSIpLG89VW8obiwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZ2V0KCJuYW1lIixlKX0pKSxhPVtdO3JldHVybiBvLmJ1Y2tldHMuZWFjaCgoZnVuY3Rpb24oZSxuKXtlLnNvcnQoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuZ2V0KHIsZSktdC5nZXQocixuKX0pKSxhLnB1c2goe25hbWU6bixpbmRpY2VzOmV9KX0pKSxhfSxlLnByb3RvdHlwZS5nZXRBeGlzVG9vbHRpcERhdGE9ZnVuY3Rpb24odCxlLG4pe1kodCl8fCh0PXQ/W3RdOltdKTtmb3IodmFyIGkscj10aGlzLmdldERhdGEoKSxvPXRoaXMuZ2V0TGF5ZXJTZXJpZXMoKSxhPVtdLHM9by5sZW5ndGgsbD0wO2w8czsrK2wpe2Zvcih2YXIgdT1OdW1iZXIuTUFYX1ZBTFVFLGg9LTEsYz1vW2xdLmluZGljZXMubGVuZ3RoLHA9MDtwPGM7KytwKXt2YXIgZD1yLmdldCh0WzBdLG9bbF0uaW5kaWNlc1twXSksZj1NYXRoLmFicyhkLWUpO2Y8PXUmJihpPWQsdT1mLGg9b1tsXS5pbmRpY2VzW3BdKX1hLnB1c2goaCl9cmV0dXJue2RhdGFJbmRpY2VzOmEsbmVzdGVzdFZhbHVlOml9fSxlLnByb3RvdHlwZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmdldERhdGEoKTtyZXR1cm4gb2coIm5hbWVWYWx1ZSIse25hbWU6aS5nZXROYW1lKHQpLHZhbHVlOmkuZ2V0KGkubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLHQpfSl9LGUudHlwZT0ic2VyaWVzLnRoZW1lUml2ZXIiLGUuZGVwZW5kZW5jaWVzPVsic2luZ2xlQXhpcyJdLGUuZGVmYXVsdE9wdGlvbj17ejoyLGNvbG9yQnk6ImRhdGEiLGNvb3JkaW5hdGVTeXN0ZW06InNpbmdsZUF4aXMiLGJvdW5kYXJ5R2FwOlsiMTAlIiwiMTAlIl0sc2luZ2xlQXhpc0luZGV4OjAsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGxhYmVsOnttYXJnaW46NCxzaG93OiEwLHBvc2l0aW9uOiJsZWZ0Iixmb250U2l6ZToxMX0sZW1waGFzaXM6e2xhYmVsOntzaG93OiEwfX19LGV9KGJnKTtmdW5jdGlvbiB6Tyh0LGUpe3QuZWFjaFNlcmllc0J5VHlwZSgidGhlbWVSaXZlciIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLG49dC5jb29yZGluYXRlU3lzdGVtLGk9e30scj1uLmdldFJlY3QoKTtpLnJlY3Q9cjt2YXIgbz10LmdldCgiYm91bmRhcnlHYXAiKSxhPW4uZ2V0QXhpcygpOyhpLmJvdW5kYXJ5R2FwPW8sImhvcml6b250YWwiPT09YS5vcmllbnQpPyhvWzBdPSRyKG9bMF0sci5oZWlnaHQpLG9bMV09JHIob1sxXSxyLmhlaWdodCksVk8oZSx0LHIuaGVpZ2h0LW9bMF0tb1sxXSkpOihvWzBdPSRyKG9bMF0sci53aWR0aCksb1sxXT0kcihvWzFdLHIud2lkdGgpLFZPKGUsdCxyLndpZHRoLW9bMF0tb1sxXSkpO2Uuc2V0TGF5b3V0KCJsYXlvdXRJbmZvIixpKX0pKX1mdW5jdGlvbiBWTyh0LGUsbil7aWYodC5jb3VudCgpKWZvcih2YXIgaSxyPWUuY29vcmRpbmF0ZVN5c3RlbSxvPWUuZ2V0TGF5ZXJTZXJpZXMoKSxhPXQubWFwRGltZW5zaW9uKCJzaW5nbGUiKSxzPXQubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGw9eihvLChmdW5jdGlvbihlKXtyZXR1cm4geihlLmluZGljZXMsKGZ1bmN0aW9uKGUpe3ZhciBuPXIuZGF0YVRvUG9pbnQodC5nZXQoYSxlKSk7cmV0dXJuIG5bMV09dC5nZXQocyxlKSxufSkpfSkpLHU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLG49dFswXS5sZW5ndGgsaT1bXSxyPVtdLG89MCxhPTA7YTxuOysrYSl7Zm9yKHZhciBzPTAsbD0wO2w8ZTsrK2wpcys9dFtsXVthXVsxXTtzPm8mJihvPXMpLGkucHVzaChzKX1mb3IodmFyIHU9MDt1PG47Kyt1KXJbdV09KG8taVt1XSkvMjtvPTA7Zm9yKHZhciBoPTA7aDxuOysraCl7dmFyIGM9aVtoXStyW2hdO2M+byYmKG89Yyl9cmV0dXJue3kwOnIsbWF4Om99fShsKSxoPXUueTAsYz1uL3UubWF4LHA9by5sZW5ndGgsZD1vWzBdLmluZGljZXMubGVuZ3RoLGY9MDtmPGQ7KytmKXtpPWhbZl0qYyx0LnNldEl0ZW1MYXlvdXQob1swXS5pbmRpY2VzW2ZdLHtsYXllckluZGV4OjAseDpsWzBdW2ZdWzBdLHkwOmkseTpsWzBdW2ZdWzFdKmN9KTtmb3IodmFyIGc9MTtnPHA7KytnKWkrPWxbZy0xXVtmXVsxXSpjLHQuc2V0SXRlbUxheW91dChvW2ddLmluZGljZXNbZl0se2xheWVySW5kZXg6Zyx4OmxbZ11bZl1bMF0seTA6aSx5OmxbZ11bZl1bMV0qY30pfX12YXIgQk89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4saSxyKXt2YXIgbz10LmNhbGwodGhpcyl8fHRoaXM7by56Mj0yLG8udGV4dENvbmZpZz17aW5zaWRlOiEwfSxybChvKS5zZXJpZXNJbmRleD1uLnNlcmllc0luZGV4O3ZhciBhPW5ldyBYcyh7ejI6NCxzaWxlbnQ6ZS5nZXRNb2RlbCgpLmdldChbImxhYmVsIiwic2lsZW50Il0pfSk7cmV0dXJuIG8uc2V0VGV4dENvbnRlbnQoYSksby51cGRhdGVEYXRhKCEwLGUsbixpLHIpLG99cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxuLGkscil7dGhpcy5ub2RlPWUsZS5waWVjZT10aGlzLG49bnx8dGhpcy5fc2VyaWVzTW9kZWwsaT1pfHx0aGlzLl9lY01vZGVsO3ZhciBvPXRoaXM7cmwobykuZGF0YUluZGV4PWUuZGF0YUluZGV4O3ZhciBhPWUuZ2V0TW9kZWwoKSxzPWEuZ2V0TW9kZWwoImVtcGhhc2lzIiksbD1lLmdldExheW91dCgpLHU9QSh7fSxsKTt1LmxhYmVsPW51bGw7dmFyIGg9ZS5nZXRWaXN1YWwoInN0eWxlIik7aC5saW5lSm9pbj0iYmV2ZWwiO3ZhciBjPWUuZ2V0VmlzdWFsKCJkZWNhbCIpO2MmJihoLmRlY2FsPW12KGMscikpO3ZhciBwPWVNKGEuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLHUsITApO0EodSxwKSxFKGhsLChmdW5jdGlvbih0KXt2YXIgZT1vLmVuc3VyZVN0YXRlKHQpLG49YS5nZXRNb2RlbChbdCwiaXRlbVN0eWxlIl0pO2Uuc3R5bGU9bi5nZXRJdGVtU3R5bGUoKTt2YXIgaT1lTShuLHUpO2kmJihlLnNoYXBlPWkpfSkpLHQ/KG8uc2V0U2hhcGUodSksby5zaGFwZS5yPWwucjAsbWgobyx7c2hhcGU6e3I6bC5yfX0sbixlLmRhdGFJbmRleCkpOih2aChvLHtzaGFwZTp1fSxuKSxTaChvKSksby51c2VTdHlsZShoKSx0aGlzLl91cGRhdGVMYWJlbChuKTt2YXIgZD1hLmdldFNoYWxsb3coImN1cnNvciIpO2QmJm8uYXR0cigiY3Vyc29yIixkKSx0aGlzLl9zZXJpZXNNb2RlbD1ufHx0aGlzLl9zZXJpZXNNb2RlbCx0aGlzLl9lY01vZGVsPWl8fHRoaXMuX2VjTW9kZWw7dmFyIGY9cy5nZXQoImZvY3VzIik7WmwodGhpcywiYW5jZXN0b3IiPT09Zj9lLmdldEFuY2VzdG9yc0luZGljZXMoKToiZGVzY2VuZGFudCI9PT1mP2UuZ2V0RGVzY2VuZGFudEluZGljZXMoKTpmLHMuZ2V0KCJibHVyU2NvcGUiKSxzLmdldCgiZGlzYWJsZWQiKSl9LGUucHJvdG90eXBlLl91cGRhdGVMYWJlbD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5ub2RlLmdldE1vZGVsKCksaT1uLmdldE1vZGVsKCJsYWJlbCIpLHI9dGhpcy5ub2RlLmdldExheW91dCgpLG89ci5lbmRBbmdsZS1yLnN0YXJ0QW5nbGUsYT0oci5zdGFydEFuZ2xlK3IuZW5kQW5nbGUpLzIscz1NYXRoLmNvcyhhKSxsPU1hdGguc2luKGEpLHU9dGhpcyxoPXUuZ2V0VGV4dENvbnRlbnQoKSxjPXRoaXMubm9kZS5kYXRhSW5kZXgscD1pLmdldCgibWluQW5nbGUiKS8xODAqTWF0aC5QSSxkPWkuZ2V0KCJzaG93IikmJiEobnVsbCE9cCYmTWF0aC5hYnMobyk8cCk7ZnVuY3Rpb24gZih0LGUpe3ZhciBuPXQuZ2V0KGUpO3JldHVybiBudWxsPT1uP2kuZ2V0KGUpOm59aC5pZ25vcmU9IWQsRShjbCwoZnVuY3Rpb24oaSl7dmFyIHA9Im5vcm1hbCI9PT1pP24uZ2V0TW9kZWwoImxhYmVsIik6bi5nZXRNb2RlbChbaSwibGFiZWwiXSksZD0ibm9ybWFsIj09PWksZz1kP2g6aC5lbnN1cmVTdGF0ZShpKSx5PXQuZ2V0Rm9ybWF0dGVkTGFiZWwoYyxpKTtkJiYoeT15fHxlLm5vZGUubmFtZSksZy5zdHlsZT1vYyhwLHt9LG51bGwsIm5vcm1hbCIhPT1pLCEwKSx5JiYoZy5zdHlsZS50ZXh0PXkpO3ZhciB2PXAuZ2V0KCJzaG93Iik7bnVsbD09dnx8ZHx8KGcuaWdub3JlPSF2KTt2YXIgbSx4PWYocCwicG9zaXRpb24iKSxfPWQ/dTp1LnN0YXRlc1tpXSxiPV8uc3R5bGUuZmlsbDtfLnRleHRDb25maWc9e291dHNpZGVGaWxsOiJpbmhlcml0Ij09PXAuZ2V0KCJjb2xvciIpP2I6bnVsbCxpbnNpZGU6Im91dHNpZGUiIT09eH07dmFyIHc9ZihwLCJkaXN0YW5jZSIpfHwwLFM9ZihwLCJhbGlnbiIpLE09ZihwLCJyb3RhdGUiKSxJPS41Kk1hdGguUEksVD0xLjUqTWF0aC5QSSxDPWdzKCJ0YW5nZW50aWFsIj09PU0/TWF0aC5QSS8yLWE6YSksRD1DPkkmJiFzbyhDLUkpJiZDPFQ7Im91dHNpZGUiPT09eD8obT1yLnIrdyxTPUQ/InJpZ2h0IjoibGVmdCIpOlMmJiJjZW50ZXIiIT09Uz8ibGVmdCI9PT1TPyhtPXIucjArdyxTPUQ/InJpZ2h0IjoibGVmdCIpOiJyaWdodCI9PT1TJiYobT1yLnItdyxTPUQ/ImxlZnQiOiJyaWdodCIpOihtPW89PT0yKk1hdGguUEkmJjA9PT1yLnIwPzA6KHIucityLnIwKS8yLFM9ImNlbnRlciIpLGcuc3R5bGUuYWxpZ249UyxnLnN0eWxlLnZlcnRpY2FsQWxpZ249ZihwLCJ2ZXJ0aWNhbEFsaWduIil8fCJtaWRkbGUiLGcueD1tKnMrci5jeCxnLnk9bSpsK3IuY3k7dmFyIEE9MDsicmFkaWFsIj09PU0/QT1ncygtYSkrKEQ/TWF0aC5QSTowKToidGFuZ2VudGlhbCI9PT1NP0E9Z3MoTWF0aC5QSS8yLWEpKyhEP01hdGguUEk6MCk6aihNKSYmKEE9TSpNYXRoLlBJLzE4MCksZy5yb3RhdGlvbj1ncyhBKX0pKSxoLmRpcnR5U3R5bGUoKX0sZX0oRnUpLEZPPSJzdW5idXJzdFJvb3RUb05vZGUiLEdPPSJzdW5idXJzdEhpZ2hsaWdodCI7dmFyIFdPPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzO3RoaXMuc2VyaWVzTW9kZWw9dCx0aGlzLmFwaT1uLHRoaXMuZWNNb2RlbD1lO3ZhciBvPXQuZ2V0RGF0YSgpLGE9by50cmVlLnJvb3Qscz10LmdldFZpZXdSb290KCksbD10aGlzLmdyb3VwLHU9dC5nZXQoInJlbmRlckxhYmVsRm9yWmVyb0RhdGEiKSxoPVtdO3MuZWFjaE5vZGUoKGZ1bmN0aW9uKHQpe2gucHVzaCh0KX0pKTt2YXIgYz10aGlzLl9vbGRDaGlsZHJlbnx8W107IWZ1bmN0aW9uKGkscil7aWYoMD09PWkubGVuZ3RoJiYwPT09ci5sZW5ndGgpcmV0dXJuO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQuZ2V0SWQoKX1mdW5jdGlvbiBoKHMsaCl7IWZ1bmN0aW9uKGkscil7dXx8IWl8fGkuZ2V0VmFsdWUoKXx8KGk9bnVsbCk7aWYoaSE9PWEmJnIhPT1hKWlmKHImJnIucGllY2UpaT8oci5waWVjZS51cGRhdGVEYXRhKCExLGksdCxlLG4pLG8uc2V0SXRlbUdyYXBoaWNFbChpLmRhdGFJbmRleCxyLnBpZWNlKSk6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuO3QucGllY2UmJihsLnJlbW92ZSh0LnBpZWNlKSx0LnBpZWNlPW51bGwpfShyKTtlbHNlIGlmKGkpe3ZhciBzPW5ldyBCTyhpLHQsZSxuKTtsLmFkZChzKSxvLnNldEl0ZW1HcmFwaGljRWwoaS5kYXRhSW5kZXgscyl9fShudWxsPT1zP251bGw6aVtzXSxudWxsPT1oP251bGw6cltoXSl9bmV3IEdtKHIsaSxzLHMpLmFkZChoKS51cGRhdGUoaCkucmVtb3ZlKEgoaCxudWxsKSkuZXhlY3V0ZSgpfShoLGMpLGZ1bmN0aW9uKGksbyl7by5kZXB0aD4wPyhyLnZpcnR1YWxQaWVjZT9yLnZpcnR1YWxQaWVjZS51cGRhdGVEYXRhKCExLGksdCxlLG4pOihyLnZpcnR1YWxQaWVjZT1uZXcgQk8oaSx0LGUsbiksbC5hZGQoci52aXJ0dWFsUGllY2UpKSxvLnBpZWNlLm9mZigiY2xpY2siKSxyLnZpcnR1YWxQaWVjZS5vbigiY2xpY2siLChmdW5jdGlvbih0KXtyLl9yb290VG9Ob2RlKG8ucGFyZW50Tm9kZSl9KSkpOnIudmlydHVhbFBpZWNlJiYobC5yZW1vdmUoci52aXJ0dWFsUGllY2UpLHIudmlydHVhbFBpZWNlPW51bGwpfShhLHMpLHRoaXMuX2luaXRFdmVudHMoKSx0aGlzLl9vbGRDaGlsZHJlbj1ofSxlLnByb3RvdHlwZS5faW5pdEV2ZW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ncm91cC5vZmYoImNsaWNrIiksdGhpcy5ncm91cC5vbigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgbj0hMTt0LnNlcmllc01vZGVsLmdldFZpZXdSb290KCkuZWFjaE5vZGUoKGZ1bmN0aW9uKGkpe2lmKCFuJiZpLnBpZWNlJiZpLnBpZWNlPT09ZS50YXJnZXQpe3ZhciByPWkuZ2V0TW9kZWwoKS5nZXQoIm5vZGVDbGljayIpO2lmKCJyb290VG9Ob2RlIj09PXIpdC5fcm9vdFRvTm9kZShpKTtlbHNlIGlmKCJsaW5rIj09PXIpe3ZhciBvPWkuZ2V0TW9kZWwoKSxhPW8uZ2V0KCJsaW5rIik7aWYoYSlNcChhLG8uZ2V0KCJ0YXJnZXQiLCEwKXx8Il9ibGFuayIpfW49ITB9fSkpfSkpfSxlLnByb3RvdHlwZS5fcm9vdFRvTm9kZT1mdW5jdGlvbih0KXt0IT09dGhpcy5zZXJpZXNNb2RlbC5nZXRWaWV3Um9vdCgpJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZTpGTyxmcm9tOnRoaXMudWlkLHNlcmllc0lkOnRoaXMuc2VyaWVzTW9kZWwuaWQsdGFyZ2V0Tm9kZTp0fSl9LGUucHJvdG90eXBlLmNvbnRhaW5Qb2ludD1mdW5jdGlvbih0LGUpe3ZhciBuPWUuZ2V0RGF0YSgpLmdldEl0ZW1MYXlvdXQoMCk7aWYobil7dmFyIGk9dFswXS1uLmN4LHI9dFsxXS1uLmN5LG89TWF0aC5zcXJ0KGkqaStyKnIpO3JldHVybiBvPD1uLnImJm8+PW4ucjB9fSxlLnR5cGU9InN1bmJ1cnN0IixlfShPZyksSE89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmlnbm9yZVN0eWxlT25EYXRhPSEwLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXRJbml0aWFsRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBuPXtuYW1lOnQubmFtZSxjaGlsZHJlbjp0LmRhdGF9O1lPKG4pO3ZhciBpPXRoaXMuX2xldmVsTW9kZWxzPXoodC5sZXZlbHN8fFtdLChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IENjKHQsdGhpcyxlKX0pLHRoaXMpLHI9bkQuY3JlYXRlVHJlZShuLHRoaXMsKGZ1bmN0aW9uKHQpe3Qud3JhcE1ldGhvZCgiZ2V0SXRlbU1vZGVsIiwoZnVuY3Rpb24odCxlKXt2YXIgbj1yLmdldE5vZGVCeURhdGFJbmRleChlKSxvPWlbbi5kZXB0aF07cmV0dXJuIG8mJih0LnBhcmVudE1vZGVsPW8pLHR9KSl9KSk7cmV0dXJuIHIuZGF0YX0sZS5wcm90b3R5cGUub3B0aW9uVXBkYXRlZD1mdW5jdGlvbigpe3RoaXMucmVzZXRWaWV3Um9vdCgpfSxlLnByb3RvdHlwZS5nZXREYXRhUGFyYW1zPWZ1bmN0aW9uKGUpe3ZhciBuPXQucHJvdG90eXBlLmdldERhdGFQYXJhbXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9dGhpcy5nZXREYXRhKCkudHJlZS5nZXROb2RlQnlEYXRhSW5kZXgoZSk7cmV0dXJuIG4udHJlZVBhdGhJbmZvPWFEKGksdGhpcyksbn0sZS5wcm90b3R5cGUuZ2V0TGV2ZWxNb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGV2ZWxNb2RlbHMmJnRoaXMuX2xldmVsTW9kZWxzW3QuZGVwdGhdfSxlLnByb3RvdHlwZS5nZXRWaWV3Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3Um9vdH0sZS5wcm90b3R5cGUucmVzZXRWaWV3Um9vdD1mdW5jdGlvbih0KXt0P3RoaXMuX3ZpZXdSb290PXQ6dD10aGlzLl92aWV3Um9vdDt2YXIgZT10aGlzLmdldFJhd0RhdGEoKS50cmVlLnJvb3Q7dCYmKHQ9PT1lfHxlLmNvbnRhaW5zKHQpKXx8KHRoaXMuX3ZpZXdSb290PWUpfSxlLnByb3RvdHlwZS5lbmFibGVBcmlhRGVjYWw9ZnVuY3Rpb24oKXtwRCh0aGlzKX0sZS50eXBlPSJzZXJpZXMuc3VuYnVyc3QiLGUuZGVmYXVsdE9wdGlvbj17ejoyLGNlbnRlcjpbIjUwJSIsIjUwJSJdLHJhZGl1czpbMCwiNzUlIl0sY2xvY2t3aXNlOiEwLHN0YXJ0QW5nbGU6OTAsbWluQW5nbGU6MCxzdGlsbFNob3daZXJvU3VtOiEwLG5vZGVDbGljazoicm9vdFRvTm9kZSIscmVuZGVyTGFiZWxGb3JaZXJvRGF0YTohMSxsYWJlbDp7cm90YXRlOiJyYWRpYWwiLHNob3c6ITAsb3BhY2l0eToxLGFsaWduOiJjZW50ZXIiLHBvc2l0aW9uOiJpbnNpZGUiLGRpc3RhbmNlOjUsc2lsZW50OiEwfSxpdGVtU3R5bGU6e2JvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IndoaXRlIixib3JkZXJUeXBlOiJzb2xpZCIsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOiJyZ2JhKDAsIDAsIDAsIDAuMikiLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsb3BhY2l0eToxfSxlbXBoYXNpczp7Zm9jdXM6ImRlc2NlbmRhbnQifSxibHVyOntpdGVtU3R5bGU6e29wYWNpdHk6LjJ9LGxhYmVsOntvcGFjaXR5Oi4xfX0sYW5pbWF0aW9uVHlwZToiZXhwYW5zaW9uIixhbmltYXRpb25EdXJhdGlvbjoxZTMsYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6NTAwLGRhdGE6W10sc29ydDoiZGVzYyJ9LGV9KGJnKTtmdW5jdGlvbiBZTyh0KXt2YXIgZT0wO0UodC5jaGlsZHJlbiwoZnVuY3Rpb24odCl7WU8odCk7dmFyIG49dC52YWx1ZTtZKG4pJiYobj1uWzBdKSxlKz1ufSkpO3ZhciBuPXQudmFsdWU7WShuKSYmKG49blswXSksKG51bGw9PW58fGlzTmFOKG4pKSYmKG49ZSksbjwwJiYobj0wKSxZKHQudmFsdWUpP3QudmFsdWVbMF09bjp0LnZhbHVlPW59dmFyIFhPPU1hdGguUEkvMTgwO2Z1bmN0aW9uIFVPKHQsZSxuKXtlLmVhY2hTZXJpZXNCeVR5cGUodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImNlbnRlciIpLGk9dC5nZXQoInJhZGl1cyIpO1koaSl8fChpPVswLGldKSxZKGUpfHwoZT1bZSxlXSk7dmFyIHI9bi5nZXRXaWR0aCgpLG89bi5nZXRIZWlnaHQoKSxhPU1hdGgubWluKHIsbykscz0kcihlWzBdLHIpLGw9JHIoZVsxXSxvKSx1PSRyKGlbMF0sYS8yKSxoPSRyKGlbMV0sYS8yKSxjPS10LmdldCgic3RhcnRBbmdsZSIpKlhPLHA9dC5nZXQoIm1pbkFuZ2xlIikqWE8sZD10LmdldERhdGEoKS50cmVlLnJvb3QsZj10LmdldFZpZXdSb290KCksZz1mLmRlcHRoLHk9dC5nZXQoInNvcnQiKTtudWxsIT15JiZaTyhmLHkpO3ZhciB2PTA7RShmLmNoaWxkcmVuLChmdW5jdGlvbih0KXshaXNOYU4odC5nZXRWYWx1ZSgpKSYmdisrfSkpO3ZhciBtPWYuZ2V0VmFsdWUoKSx4PU1hdGguUEkvKG18fHYpKjIsXz1mLmRlcHRoPjAsYj1mLmhlaWdodC0oXz8tMToxKSx3PShoLXUpLyhifHwxKSxTPXQuZ2V0KCJjbG9ja3dpc2UiKSxNPXQuZ2V0KCJzdGlsbFNob3daZXJvU3VtIiksST1TPzE6LTEsVD1mdW5jdGlvbihlLG4pe2lmKGUpe3ZhciBpPW47aWYoZSE9PWQpe3ZhciByPWUuZ2V0VmFsdWUoKSxvPTA9PT1tJiZNP3g6cip4O288cCYmKG89cCksaT1uK0kqbzt2YXIgaD1lLmRlcHRoLWctKF8/LTE6MSksYz11K3cqaCxmPXUrdyooaCsxKSx5PXQuZ2V0TGV2ZWxNb2RlbChlKTtpZih5KXt2YXIgdj15LmdldCgicjAiLCEwKSxiPXkuZ2V0KCJyIiwhMCksQz15LmdldCgicmFkaXVzIiwhMCk7bnVsbCE9QyYmKHY9Q1swXSxiPUNbMV0pLG51bGwhPXYmJihjPSRyKHYsYS8yKSksbnVsbCE9YiYmKGY9JHIoYixhLzIpKX1lLnNldExheW91dCh7YW5nbGU6byxzdGFydEFuZ2xlOm4sZW5kQW5nbGU6aSxjbG9ja3dpc2U6UyxjeDpzLGN5OmwscjA6YyxyOmZ9KX1pZihlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLmxlbmd0aCl7dmFyIEQ9MDtFKGUuY2hpbGRyZW4sKGZ1bmN0aW9uKHQpe0QrPVQodCxuK0QpfSkpfXJldHVybiBpLW59fTtpZihfKXt2YXIgQz11LEQ9dSt3LEE9MipNYXRoLlBJO2Quc2V0TGF5b3V0KHthbmdsZTpBLHN0YXJ0QW5nbGU6YyxlbmRBbmdsZTpjK0EsY2xvY2t3aXNlOlMsY3g6cyxjeTpsLHIwOkMscjpEfSl9VChmLGMpfSkpfWZ1bmN0aW9uIFpPKHQsZSl7dmFyIG49dC5jaGlsZHJlbnx8W107dC5jaGlsZHJlbj1mdW5jdGlvbih0LGUpe2lmKFgoZSkpe3ZhciBuPXoodCwoZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldFZhbHVlKCk7cmV0dXJue3BhcmFtczp7ZGVwdGg6dC5kZXB0aCxoZWlnaHQ6dC5oZWlnaHQsZGF0YUluZGV4OnQuZGF0YUluZGV4LGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG59fSxpbmRleDplfX0pKTtyZXR1cm4gbi5zb3J0KChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQucGFyYW1zLG4ucGFyYW1zKX0pKSx6KG4sKGZ1bmN0aW9uKGUpe3JldHVybiB0W2UuaW5kZXhdfSkpfXZhciBpPSJhc2MiPT09ZTtyZXR1cm4gdC5zb3J0KChmdW5jdGlvbih0LGUpe3ZhciBuPSh0LmdldFZhbHVlKCktZS5nZXRWYWx1ZSgpKSooaT8xOi0xKTtyZXR1cm4gMD09PW4/KHQuZGF0YUluZGV4LWUuZGF0YUluZGV4KSooaT8tMToxKTpufSkpfShuLGUpLG4ubGVuZ3RoJiZFKHQuY2hpbGRyZW4sKGZ1bmN0aW9uKHQpe1pPKHQsZSl9KSl9ZnVuY3Rpb24gak8odCl7dmFyIGU9e307dC5lYWNoU2VyaWVzQnlUeXBlKCJzdW5idXJzdCIsKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0RGF0YSgpLGk9bi50cmVlO2kuZWFjaE5vZGUoKGZ1bmN0aW9uKHIpe3ZhciBvPXIuZ2V0TW9kZWwoKS5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCk7by5maWxsfHwoby5maWxsPWZ1bmN0aW9uKHQsbixpKXtmb3IodmFyIHI9dDtyJiZyLmRlcHRoPjE7KXI9ci5wYXJlbnROb2RlO3ZhciBvPW4uZ2V0Q29sb3JGcm9tUGFsZXR0ZShyLm5hbWV8fHIuZGF0YUluZGV4KyIiLGUpO3JldHVybiB0LmRlcHRoPjEmJlUobykmJihvPSRuKG8sKHQuZGVwdGgtMSkvKGktMSkqLjUpKSxvfShyLHQsaS5yb290LmhlaWdodCkpLEEobi5lbnN1cmVVbmlxdWVJdGVtVmlzdWFsKHIuZGF0YUluZGV4LCJzdHlsZSIpLG8pfSkpfSkpfXZhciBxTz17Y29sb3I6ImZpbGwiLGJvcmRlckNvbG9yOiJzdHJva2UifSxLTz17c3ltYm9sOjEsc3ltYm9sU2l6ZToxLHN5bWJvbEtlZXBBc3BlY3Q6MSxsZWdlbmRJY29uOjEsdmlzdWFsTWV0YToxLGxpZnRaOjEsZGVjYWw6MX0sJE89Vm8oKSxKTz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50WkxldmVsPXRoaXMuZ2V0KCJ6bGV2ZWwiLCEwKSx0aGlzLmN1cnJlbnRaPXRoaXMuZ2V0KCJ6IiwhMCl9LGUucHJvdG90eXBlLmdldEluaXRpYWxEYXRhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF94KG51bGwsdGhpcyl9LGUucHJvdG90eXBlLmdldERhdGFQYXJhbXM9ZnVuY3Rpb24oZSxuLGkpe3ZhciByPXQucHJvdG90eXBlLmdldERhdGFQYXJhbXMuY2FsbCh0aGlzLGUsbik7cmV0dXJuIGkmJihyLmluZm89JE8oaSkuaW5mbykscn0sZS50eXBlPSJzZXJpZXMuY3VzdG9tIixlLmRlcGVuZGVuY2llcz1bImdyaWQiLCJwb2xhciIsImdlbyIsInNpbmdsZUF4aXMiLCJjYWxlbmRhciJdLGUuZGVmYXVsdE9wdGlvbj17Y29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLHo6MixsZWdlbmRIb3Zlckxpbms6ITAsY2xpcDohMX0sZX0oYmcpO2Z1bmN0aW9uIFFPKHQsZSl7cmV0dXJuIGU9ZXx8WzAsMF0seihbIngiLCJ5Il0sKGZ1bmN0aW9uKG4saSl7dmFyIHI9dGhpcy5nZXRBeGlzKG4pLG89ZVtpXSxhPXRbaV0vMjtyZXR1cm4iY2F0ZWdvcnkiPT09ci50eXBlP3IuZ2V0QmFuZFdpZHRoKCk6TWF0aC5hYnMoci5kYXRhVG9Db29yZChvLWEpLXIuZGF0YVRvQ29vcmQobythKSl9KSx0aGlzKX1mdW5jdGlvbiB0Uih0LGUpe3JldHVybiBlPWV8fFswLDBdLHooWzAsMV0sKGZ1bmN0aW9uKG4pe3ZhciBpPWVbbl0scj10W25dLzIsbz1bXSxhPVtdO3JldHVybiBvW25dPWktcixhW25dPWkrcixvWzEtbl09YVsxLW5dPWVbMS1uXSxNYXRoLmFicyh0aGlzLmRhdGFUb1BvaW50KG8pW25dLXRoaXMuZGF0YVRvUG9pbnQoYSlbbl0pfSksdGhpcyl9ZnVuY3Rpb24gZVIodCxlKXt2YXIgbj10aGlzLmdldEF4aXMoKSxpPWUgaW5zdGFuY2VvZiBBcnJheT9lWzBdOmUscj0odCBpbnN0YW5jZW9mIEFycmF5P3RbMF06dCkvMjtyZXR1cm4iY2F0ZWdvcnkiPT09bi50eXBlP24uZ2V0QmFuZFdpZHRoKCk6TWF0aC5hYnMobi5kYXRhVG9Db29yZChpLXIpLW4uZGF0YVRvQ29vcmQoaStyKSl9ZnVuY3Rpb24gblIodCxlKXtyZXR1cm4gZT1lfHxbMCwwXSx6KFsiUmFkaXVzIiwiQW5nbGUiXSwoZnVuY3Rpb24obixpKXt2YXIgcj10aGlzWyJnZXQiK24rIkF4aXMiXSgpLG89ZVtpXSxhPXRbaV0vMixzPSJjYXRlZ29yeSI9PT1yLnR5cGU/ci5nZXRCYW5kV2lkdGgoKTpNYXRoLmFicyhyLmRhdGFUb0Nvb3JkKG8tYSktci5kYXRhVG9Db29yZChvK2EpKTtyZXR1cm4iQW5nbGUiPT09biYmKHM9cypNYXRoLlBJLzE4MCksc30pLHRoaXMpfWZ1bmN0aW9uIGlSKHQsZSxuLGkpe3JldHVybiB0JiYodC5sZWdhY3l8fCExIT09dC5sZWdhY3kmJiFuJiYhaSYmInRzcGFuIiE9PWUmJigidGV4dCI9PT1lfHxfdCh0LCJ0ZXh0IikpKX1mdW5jdGlvbiByUih0LGUsbil7dmFyIGkscixvLGE9dDtpZigidGV4dCI9PT1lKW89YTtlbHNle289e30sX3QoYSwidGV4dCIpJiYoby50ZXh0PWEudGV4dCksX3QoYSwicmljaCIpJiYoby5yaWNoPWEucmljaCksX3QoYSwidGV4dEZpbGwiKSYmKG8uZmlsbD1hLnRleHRGaWxsKSxfdChhLCJ0ZXh0U3Ryb2tlIikmJihvLnN0cm9rZT1hLnRleHRTdHJva2UpLF90KGEsImZvbnRGYW1pbHkiKSYmKG8uZm9udEZhbWlseT1hLmZvbnRGYW1pbHkpLF90KGEsImZvbnRTaXplIikmJihvLmZvbnRTaXplPWEuZm9udFNpemUpLF90KGEsImZvbnRTdHlsZSIpJiYoby5mb250U3R5bGU9YS5mb250U3R5bGUpLF90KGEsImZvbnRXZWlnaHQiKSYmKG8uZm9udFdlaWdodD1hLmZvbnRXZWlnaHQpLHI9e3R5cGU6InRleHQiLHN0eWxlOm8sc2lsZW50OiEwfSxpPXt9O3ZhciBzPV90KGEsInRleHRQb3NpdGlvbiIpO24/aS5wb3NpdGlvbj1zP2EudGV4dFBvc2l0aW9uOiJpbnNpZGUiOnMmJihpLnBvc2l0aW9uPWEudGV4dFBvc2l0aW9uKSxfdChhLCJ0ZXh0UG9zaXRpb24iKSYmKGkucG9zaXRpb249YS50ZXh0UG9zaXRpb24pLF90KGEsInRleHRPZmZzZXQiKSYmKGkub2Zmc2V0PWEudGV4dE9mZnNldCksX3QoYSwidGV4dFJvdGF0aW9uIikmJihpLnJvdGF0aW9uPWEudGV4dFJvdGF0aW9uKSxfdChhLCJ0ZXh0RGlzdGFuY2UiKSYmKGkuZGlzdGFuY2U9YS50ZXh0RGlzdGFuY2UpfXJldHVybiBvUihvLHQpLEUoby5yaWNoLChmdW5jdGlvbih0KXtvUih0LHQpfSkpLHt0ZXh0Q29uZmlnOmksdGV4dENvbnRlbnQ6cn19ZnVuY3Rpb24gb1IodCxlKXtlJiYoZS5mb250PWUudGV4dEZvbnR8fGUuZm9udCxfdChlLCJ0ZXh0U3Ryb2tlV2lkdGgiKSYmKHQubGluZVdpZHRoPWUudGV4dFN0cm9rZVdpZHRoKSxfdChlLCJ0ZXh0QWxpZ24iKSYmKHQuYWxpZ249ZS50ZXh0QWxpZ24pLF90KGUsInRleHRWZXJ0aWNhbEFsaWduIikmJih0LnZlcnRpY2FsQWxpZ249ZS50ZXh0VmVydGljYWxBbGlnbiksX3QoZSwidGV4dExpbmVIZWlnaHQiKSYmKHQubGluZUhlaWdodD1lLnRleHRMaW5lSGVpZ2h0KSxfdChlLCJ0ZXh0V2lkdGgiKSYmKHQud2lkdGg9ZS50ZXh0V2lkdGgpLF90KGUsInRleHRIZWlnaHQiKSYmKHQuaGVpZ2h0PWUudGV4dEhlaWdodCksX3QoZSwidGV4dEJhY2tncm91bmRDb2xvciIpJiYodC5iYWNrZ3JvdW5kQ29sb3I9ZS50ZXh0QmFja2dyb3VuZENvbG9yKSxfdChlLCJ0ZXh0UGFkZGluZyIpJiYodC5wYWRkaW5nPWUudGV4dFBhZGRpbmcpLF90KGUsInRleHRCb3JkZXJDb2xvciIpJiYodC5ib3JkZXJDb2xvcj1lLnRleHRCb3JkZXJDb2xvciksX3QoZSwidGV4dEJvcmRlcldpZHRoIikmJih0LmJvcmRlcldpZHRoPWUudGV4dEJvcmRlcldpZHRoKSxfdChlLCJ0ZXh0Qm9yZGVyUmFkaXVzIikmJih0LmJvcmRlclJhZGl1cz1lLnRleHRCb3JkZXJSYWRpdXMpLF90KGUsInRleHRCb3hTaGFkb3dDb2xvciIpJiYodC5zaGFkb3dDb2xvcj1lLnRleHRCb3hTaGFkb3dDb2xvciksX3QoZSwidGV4dEJveFNoYWRvd0JsdXIiKSYmKHQuc2hhZG93Qmx1cj1lLnRleHRCb3hTaGFkb3dCbHVyKSxfdChlLCJ0ZXh0Qm94U2hhZG93T2Zmc2V0WCIpJiYodC5zaGFkb3dPZmZzZXRYPWUudGV4dEJveFNoYWRvd09mZnNldFgpLF90KGUsInRleHRCb3hTaGFkb3dPZmZzZXRZIikmJih0LnNoYWRvd09mZnNldFk9ZS50ZXh0Qm94U2hhZG93T2Zmc2V0WSkpfWZ1bmN0aW9uIGFSKHQsZSxuKXt2YXIgaT10O2kudGV4dFBvc2l0aW9uPWkudGV4dFBvc2l0aW9ufHxuLnBvc2l0aW9ufHwiaW5zaWRlIixudWxsIT1uLm9mZnNldCYmKGkudGV4dE9mZnNldD1uLm9mZnNldCksbnVsbCE9bi5yb3RhdGlvbiYmKGkudGV4dFJvdGF0aW9uPW4ucm90YXRpb24pLG51bGwhPW4uZGlzdGFuY2UmJihpLnRleHREaXN0YW5jZT1uLmRpc3RhbmNlKTt2YXIgcj1pLnRleHRQb3NpdGlvbi5pbmRleE9mKCJpbnNpZGUiKT49MCxvPXQuZmlsbHx8IiMwMDAiO3NSKGksZSk7dmFyIGE9bnVsbD09aS50ZXh0RmlsbDtyZXR1cm4gcj9hJiYoaS50ZXh0RmlsbD1uLmluc2lkZUZpbGx8fCIjZmZmIiwhaS50ZXh0U3Ryb2tlJiZuLmluc2lkZVN0cm9rZSYmKGkudGV4dFN0cm9rZT1uLmluc2lkZVN0cm9rZSksIWkudGV4dFN0cm9rZSYmKGkudGV4dFN0cm9rZT1vKSxudWxsPT1pLnRleHRTdHJva2VXaWR0aCYmKGkudGV4dFN0cm9rZVdpZHRoPTIpKTooYSYmKGkudGV4dEZpbGw9dC5maWxsfHxuLm91dHNpZGVGaWxsfHwiIzAwMCIpLCFpLnRleHRTdHJva2UmJm4ub3V0c2lkZVN0cm9rZSYmKGkudGV4dFN0cm9rZT1uLm91dHNpZGVTdHJva2UpKSxpLnRleHQ9ZS50ZXh0LGkucmljaD1lLnJpY2gsRShlLnJpY2gsKGZ1bmN0aW9uKHQpe3NSKHQsdCl9KSksaX1mdW5jdGlvbiBzUih0LGUpe2UmJihfdChlLCJmaWxsIikmJih0LnRleHRGaWxsPWUuZmlsbCksX3QoZSwic3Ryb2tlIikmJih0LnRleHRTdHJva2U9ZS5maWxsKSxfdChlLCJsaW5lV2lkdGgiKSYmKHQudGV4dFN0cm9rZVdpZHRoPWUubGluZVdpZHRoKSxfdChlLCJmb250IikmJih0LmZvbnQ9ZS5mb250KSxfdChlLCJmb250U3R5bGUiKSYmKHQuZm9udFN0eWxlPWUuZm9udFN0eWxlKSxfdChlLCJmb250V2VpZ2h0IikmJih0LmZvbnRXZWlnaHQ9ZS5mb250V2VpZ2h0KSxfdChlLCJmb250U2l6ZSIpJiYodC5mb250U2l6ZT1lLmZvbnRTaXplKSxfdChlLCJmb250RmFtaWx5IikmJih0LmZvbnRGYW1pbHk9ZS5mb250RmFtaWx5KSxfdChlLCJhbGlnbiIpJiYodC50ZXh0QWxpZ249ZS5hbGlnbiksX3QoZSwidmVydGljYWxBbGlnbiIpJiYodC50ZXh0VmVydGljYWxBbGlnbj1lLnZlcnRpY2FsQWxpZ24pLF90KGUsImxpbmVIZWlnaHQiKSYmKHQudGV4dExpbmVIZWlnaHQ9ZS5saW5lSGVpZ2h0KSxfdChlLCJ3aWR0aCIpJiYodC50ZXh0V2lkdGg9ZS53aWR0aCksX3QoZSwiaGVpZ2h0IikmJih0LnRleHRIZWlnaHQ9ZS5oZWlnaHQpLF90KGUsImJhY2tncm91bmRDb2xvciIpJiYodC50ZXh0QmFja2dyb3VuZENvbG9yPWUuYmFja2dyb3VuZENvbG9yKSxfdChlLCJwYWRkaW5nIikmJih0LnRleHRQYWRkaW5nPWUucGFkZGluZyksX3QoZSwiYm9yZGVyQ29sb3IiKSYmKHQudGV4dEJvcmRlckNvbG9yPWUuYm9yZGVyQ29sb3IpLF90KGUsImJvcmRlcldpZHRoIikmJih0LnRleHRCb3JkZXJXaWR0aD1lLmJvcmRlcldpZHRoKSxfdChlLCJib3JkZXJSYWRpdXMiKSYmKHQudGV4dEJvcmRlclJhZGl1cz1lLmJvcmRlclJhZGl1cyksX3QoZSwic2hhZG93Q29sb3IiKSYmKHQudGV4dEJveFNoYWRvd0NvbG9yPWUuc2hhZG93Q29sb3IpLF90KGUsInNoYWRvd0JsdXIiKSYmKHQudGV4dEJveFNoYWRvd0JsdXI9ZS5zaGFkb3dCbHVyKSxfdChlLCJzaGFkb3dPZmZzZXRYIikmJih0LnRleHRCb3hTaGFkb3dPZmZzZXRYPWUuc2hhZG93T2Zmc2V0WCksX3QoZSwic2hhZG93T2Zmc2V0WSIpJiYodC50ZXh0Qm94U2hhZG93T2Zmc2V0WT1lLnNoYWRvd09mZnNldFkpLF90KGUsInRleHRTaGFkb3dDb2xvciIpJiYodC50ZXh0U2hhZG93Q29sb3I9ZS50ZXh0U2hhZG93Q29sb3IpLF90KGUsInRleHRTaGFkb3dCbHVyIikmJih0LnRleHRTaGFkb3dCbHVyPWUudGV4dFNoYWRvd0JsdXIpLF90KGUsInRleHRTaGFkb3dPZmZzZXRYIikmJih0LnRleHRTaGFkb3dPZmZzZXRYPWUudGV4dFNoYWRvd09mZnNldFgpLF90KGUsInRleHRTaGFkb3dPZmZzZXRZIikmJih0LnRleHRTaGFkb3dPZmZzZXRZPWUudGV4dFNoYWRvd09mZnNldFkpKX12YXIgbFI9e3Bvc2l0aW9uOlsieCIsInkiXSxzY2FsZTpbInNjYWxlWCIsInNjYWxlWSJdLG9yaWdpbjpbIm9yaWdpblgiLCJvcmlnaW5ZIl19LHVSPUcobFIpLGhSPShWKG1yLChmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdPTEsdH0pLHt9KSxtci5qb2luKCIsICIpLFsiIiwic3R5bGUiLCJzaGFwZSIsImV4dHJhIl0pLGNSPVZvKCk7ZnVuY3Rpb24gcFIodCxlLG4saSxyKXt2YXIgbz10KyJBbmltYXRpb24iLGE9Z2godCxpLHIpfHx7fSxzPWNSKGUpLnVzZXJEdXJpbmc7cmV0dXJuIGEuZHVyYXRpb24+MCYmKGEuZHVyaW5nPXM/Vyh4Uix7ZWw6ZSx1c2VyRHVyaW5nOnN9KTpudWxsLGEuc2V0VG9GaW5hbD0hMCxhLnNjb3BlPXQpLEEoYSxuW29dKSxhfWZ1bmN0aW9uIGRSKHQsZSxuLGkpe3ZhciByPShpPWl8fHt9KS5kYXRhSW5kZXgsbz1pLmlzSW5pdCxhPWkuY2xlYXJTdHlsZSxzPW4uaXNBbmltYXRpb25FbmFibGVkKCksbD1jUih0KSx1PWUuc3R5bGU7bC51c2VyRHVyaW5nPWUuZHVyaW5nO3ZhciBoPXt9LGM9e307aWYoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT0wO2k8dVIubGVuZ3RoO2krKyl7dmFyIHI9dVJbaV0sbz1sUltyXSxhPWVbcl07YSYmKG5bb1swXV09YVswXSxuW29bMV1dPWFbMV0pfWZvcihpPTA7aTxtci5sZW5ndGg7aSsrKXt2YXIgcz1tcltpXTtudWxsIT1lW3NdJiYobltzXT1lW3NdKX19KDAsZSxjKSxiUigic2hhcGUiLGUsYyksYlIoImV4dHJhIixlLGMpLCFvJiZzJiYoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT1lLnRyYW5zaXRpb24scj15UihpKT9tcjpUbyhpfHxbXSksbz0wO288ci5sZW5ndGg7bysrKXt2YXIgYT1yW29dO2lmKCJzdHlsZSIhPT1hJiYic2hhcGUiIT09YSYmImV4dHJhIiE9PWEpe3ZhciBzPXRbYV07MCxuW2FdPXN9fX0odCxlLGgpLF9SKCJzaGFwZSIsdCxlLGgpLF9SKCJleHRyYSIsdCxlLGgpLGZ1bmN0aW9uKHQsZSxuLGkpe2lmKCFuKXJldHVybjt2YXIgcixvPXQuc3R5bGU7aWYobyl7dmFyIGE9bi50cmFuc2l0aW9uLHM9ZS50cmFuc2l0aW9uO2lmKGEmJiF5UihhKSl7dmFyIGw9VG8oYSk7IXImJihyPWkuc3R5bGU9e30pO2Zvcih2YXIgdT0wO3U8bC5sZW5ndGg7dSsrKXt2YXIgaD1vW2Y9bFt1XV07cltmXT1ofX1lbHNlIGlmKHQuZ2V0QW5pbWF0aW9uU3R5bGVQcm9wcyYmKHlSKHMpfHx5UihhKXx8UChzLCJzdHlsZSIpPj0wKSl7dmFyIGM9dC5nZXRBbmltYXRpb25TdHlsZVByb3BzKCkscD1jP2Muc3R5bGU6bnVsbDtpZihwKXshciYmKHI9aS5zdHlsZT17fSk7dmFyIGQ9RyhuKTtmb3IodT0wO3U8ZC5sZW5ndGg7dSsrKXt2YXIgZjtpZihwW2Y9ZFt1XV0pe2g9b1tmXTtyW2ZdPWh9fX19fX0odCxlLHUsaCkpLGMuc3R5bGU9dSxmdW5jdGlvbih0LGUsbil7dmFyIGk9ZS5zdHlsZTtpZighdC5pc0dyb3VwJiZpKXtpZihuKXt0LnVzZVN0eWxlKHt9KTtmb3IodmFyIHI9dC5hbmltYXRvcnMsbz0wO288ci5sZW5ndGg7bysrKXt2YXIgYT1yW29dOyJzdHlsZSI9PT1hLnRhcmdldE5hbWUmJmEuY2hhbmdlVGFyZ2V0KHQuc3R5bGUpfX10LnNldFN0eWxlKGkpfWUmJihlLnN0eWxlPW51bGwsZSYmdC5hdHRyKGUpLGUuc3R5bGU9aSl9KHQsYyxhKSxmdW5jdGlvbih0LGUpe190KGUsInNpbGVudCIpJiYodC5zaWxlbnQ9ZS5zaWxlbnQpLF90KGUsImlnbm9yZSIpJiYodC5pZ25vcmU9ZS5pZ25vcmUpLHQgaW5zdGFuY2VvZiBEYSYmX3QoZSwiaW52aXNpYmxlIikmJih0LmludmlzaWJsZT1lLmludmlzaWJsZSk7dCBpbnN0YW5jZW9mIGtzJiZfdChlLCJhdXRvQmF0Y2giKSYmKHQuYXV0b0JhdGNoPWUuYXV0b0JhdGNoKX0odCxlKSxzKWlmKG8pe3ZhciBwPXt9O0UoaFIsKGZ1bmN0aW9uKHQpe3ZhciBuPXQ/ZVt0XTplO24mJm4uZW50ZXJGcm9tJiYodCYmKHBbdF09cFt0XXx8e30pLEEodD9wW3RdOnAsbi5lbnRlckZyb20pKX0pKTt2YXIgZD1wUigiZW50ZXIiLHQsZSxuLHIpO2QuZHVyYXRpb24+MCYmdC5hbmltYXRlRnJvbShwLGQpfWVsc2UhZnVuY3Rpb24odCxlLG4saSxyKXtpZihyKXt2YXIgbz1wUigidXBkYXRlIix0LGUsaSxuKTtvLmR1cmF0aW9uPjAmJnQuYW5pbWF0ZUZyb20ocixvKX19KHQsZSxyfHwwLG4saCk7ZlIodCxlKSx1P3QuZGlydHkoKTp0Lm1hcmtSZWRyYXcoKX1mdW5jdGlvbiBmUih0LGUpe2Zvcih2YXIgbj1jUih0KS5sZWF2ZVRvUHJvcHMsaT0wO2k8aFIubGVuZ3RoO2krKyl7dmFyIHI9aFJbaV0sbz1yP2Vbcl06ZTtvJiZvLmxlYXZlVG8mJihufHwobj1jUih0KS5sZWF2ZVRvUHJvcHM9e30pLHImJihuW3JdPW5bcl18fHt9KSxBKHI/bltyXTpuLG8ubGVhdmVUbykpfX1mdW5jdGlvbiBnUih0LGUsbixpKXtpZih0KXt2YXIgcj10LnBhcmVudCxvPWNSKHQpLmxlYXZlVG9Qcm9wcztpZihvKXt2YXIgYT1wUigidXBkYXRlIix0LGUsbiwwKTthLmRvbmU9ZnVuY3Rpb24oKXtyLnJlbW92ZSh0KSxpJiZpKCl9LHQuYW5pbWF0ZVRvKG8sYSl9ZWxzZSByLnJlbW92ZSh0KSxpJiZpKCl9fWZ1bmN0aW9uIHlSKHQpe3JldHVybiJhbGwiPT09dH12YXIgdlI9e30sbVI9e3NldFRyYW5zZm9ybTpmdW5jdGlvbih0LGUpe3JldHVybiB2Ui5lbFt0XT1lLHRoaXN9LGdldFRyYW5zZm9ybTpmdW5jdGlvbih0KXtyZXR1cm4gdlIuZWxbdF19LHNldFNoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dlIuZWw7cmV0dXJuKG4uc2hhcGV8fChuLnNoYXBlPXt9KSlbdF09ZSxuLmRpcnR5U2hhcGUmJm4uZGlydHlTaGFwZSgpLHRoaXN9LGdldFNoYXBlOmZ1bmN0aW9uKHQpe3ZhciBlPXZSLmVsLnNoYXBlO2lmKGUpcmV0dXJuIGVbdF19LHNldFN0eWxlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dlIuZWwsaT1uLnN0eWxlO3JldHVybiBpJiYoaVt0XT1lLG4uZGlydHlTdHlsZSYmbi5kaXJ0eVN0eWxlKCkpLHRoaXN9LGdldFN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXZSLmVsLnN0eWxlO2lmKGUpcmV0dXJuIGVbdF19LHNldEV4dHJhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKHZSLmVsLmV4dHJhfHwodlIuZWwuZXh0cmE9e30pKVt0XT1lLHRoaXN9LGdldEV4dHJhOmZ1bmN0aW9uKHQpe3ZhciBlPXZSLmVsLmV4dHJhO2lmKGUpcmV0dXJuIGVbdF19fTtmdW5jdGlvbiB4Uigpe3ZhciB0PXRoaXMsZT10LmVsO2lmKGUpe3ZhciBuPWNSKGUpLnVzZXJEdXJpbmcsaT10LnVzZXJEdXJpbmc7bj09PWk/KHZSLmVsPWUsaShtUikpOnQuZWw9dC51c2VyRHVyaW5nPW51bGx9fWZ1bmN0aW9uIF9SKHQsZSxuLGkpe3ZhciByPW5bdF07aWYocil7dmFyIG8sYT1lW3RdO2lmKGEpe3ZhciBzPW4udHJhbnNpdGlvbixsPXIudHJhbnNpdGlvbjtpZihsKWlmKCFvJiYobz1pW3RdPXt9KSx5UihsKSlBKG8sYSk7ZWxzZSBmb3IodmFyIHU9VG8obCksaD0wO2g8dS5sZW5ndGg7aCsrKXt2YXIgYz1hW2Q9dVtoXV07b1tkXT1jfWVsc2UgaWYoeVIocyl8fFAocyx0KT49MCl7IW8mJihvPWlbdF09e30pO3ZhciBwPUcoYSk7Zm9yKGg9MDtoPHAubGVuZ3RoO2grKyl7dmFyIGQ7Yz1hW2Q9cFtoXV07d1IocltkXSxjKSYmKG9bZF09Yyl9fX19fWZ1bmN0aW9uIGJSKHQsZSxuKXt2YXIgaT1lW3RdO2lmKGkpZm9yKHZhciByPW5bdF09e30sbz1HKGkpLGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIHM9b1thXTtyW3NdPVBpKGlbc10pfX1mdW5jdGlvbiB3Uih0LGUpe3JldHVybiBOKHQpP3QhPT1lOm51bGwhPXQmJmlzRmluaXRlKHQpfXZhciBTUj1WbygpLE1SPVsicGVyY2VudCIsImVhc2luZyIsInNoYXBlIiwic3R5bGUiLCJleHRyYSJdO2Z1bmN0aW9uIElSKHQpe3Quc3RvcEFuaW1hdGlvbigia2V5ZnJhbWUiKSx0LmF0dHIoU1IodCkpfWZ1bmN0aW9uIFRSKHQsZSxuKXtpZihuLmlzQW5pbWF0aW9uRW5hYmxlZCgpJiZlKWlmKFkoZSkpRShlLChmdW5jdGlvbihlKXtUUih0LGUsbil9KSk7ZWxzZXt2YXIgaT1lLmtleWZyYW1lcyxyPWUuZHVyYXRpb247aWYobiYmbnVsbD09cil7dmFyIG89Z2goImVudGVyIixuLDApO3I9byYmby5kdXJhdGlvbn1pZihpJiZyKXt2YXIgYT1TUih0KTtFKGhSLChmdW5jdGlvbihuKXtpZighbnx8dFtuXSl7dmFyIG87aS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LnBlcmNlbnQtZS5wZXJjZW50fSkpLEUoaSwoZnVuY3Rpb24oaSl7dmFyIHM9dC5hbmltYXRvcnMsbD1uP2lbbl06aTtpZihsKXt2YXIgdT1HKGwpO2lmKG58fCh1PUIodSwoZnVuY3Rpb24odCl7cmV0dXJuIFAoTVIsdCk8MH0pKSksdS5sZW5ndGgpe298fCgobz10LmFuaW1hdGUobixlLmxvb3AsITApKS5zY29wZT0ia2V5ZnJhbWUiKTtmb3IodmFyIGg9MDtoPHMubGVuZ3RoO2grKylzW2hdIT09byYmc1toXS50YXJnZXROYW1lPT09by50YXJnZXROYW1lJiZzW2hdLnN0b3BUcmFja3ModSk7biYmKGFbbl09YVtuXXx8e30pO3ZhciBjPW4/YVtuXTphO0UodSwoZnVuY3Rpb24oZSl7Y1tlXT0oKG4/dFtuXTp0KXx8e30pW2VdfSkpLG8ud2hlbldpdGhLZXlzKHIqaS5wZXJjZW50LGwsdSxpLmVhc2luZyl9fX0pKSxvJiZvLmRlbGF5KGUuZGVsYXl8fDApLmR1cmF0aW9uKHIpLnN0YXJ0KGUuZWFzaW5nKX19KSl9fX12YXIgQ1I9ImVtcGhhc2lzIixEUj0ibm9ybWFsIixBUj0iYmx1ciIsa1I9InNlbGVjdCIsTFI9W0RSLENSLEFSLGtSXSxQUj17bm9ybWFsOlsiaXRlbVN0eWxlIl0sZW1waGFzaXM6W0NSLCJpdGVtU3R5bGUiXSxibHVyOltBUiwiaXRlbVN0eWxlIl0sc2VsZWN0OltrUiwiaXRlbVN0eWxlIl19LE9SPXtub3JtYWw6WyJsYWJlbCJdLGVtcGhhc2lzOltDUiwibGFiZWwiXSxibHVyOltBUiwibGFiZWwiXSxzZWxlY3Q6W2tSLCJsYWJlbCJdfSxSUj1bIngiLCJ5Il0sTlI9e25vcm1hbDp7fSxlbXBoYXNpczp7fSxibHVyOnt9LHNlbGVjdDp7fX0sRVI9e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWFzdGVyLmdldFJlY3QoKTtyZXR1cm57Y29vcmRTeXM6e3R5cGU6ImNhcnRlc2lhbjJkIix4OmUueCx5OmUueSx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodH0sYXBpOntjb29yZDpmdW5jdGlvbihlKXtyZXR1cm4gdC5kYXRhVG9Qb2ludChlKX0sc2l6ZTpXKFFPLHQpfX19LGdlbzpmdW5jdGlvbih0KXt2YXIgZT10LmdldEJvdW5kaW5nUmVjdCgpO3JldHVybntjb29yZFN5czp7dHlwZToiZ2VvIix4OmUueCx5OmUueSx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCx6b29tOnQuZ2V0Wm9vbSgpfSxhcGk6e2Nvb3JkOmZ1bmN0aW9uKGUpe3JldHVybiB0LmRhdGFUb1BvaW50KGUpfSxzaXplOlcodFIsdCl9fX0sc2luZ2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0UmVjdCgpO3JldHVybntjb29yZFN5czp7dHlwZToic2luZ2xlQXhpcyIseDplLngseTplLnksd2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9LGFwaTp7Y29vcmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZGF0YVRvUG9pbnQoZSl9LHNpemU6VyhlUix0KX19fSxwb2xhcjpmdW5jdGlvbih0KXt2YXIgZT10LmdldFJhZGl1c0F4aXMoKSxuPXQuZ2V0QW5nbGVBeGlzKCksaT1lLmdldEV4dGVudCgpO3JldHVybiBpWzBdPmlbMV0mJmkucmV2ZXJzZSgpLHtjb29yZFN5czp7dHlwZToicG9sYXIiLGN4OnQuY3gsY3k6dC5jeSxyOmlbMV0scjA6aVswXX0sYXBpOntjb29yZDpmdW5jdGlvbihpKXt2YXIgcj1lLmRhdGFUb1JhZGl1cyhpWzBdKSxvPW4uZGF0YVRvQW5nbGUoaVsxXSksYT10LmNvb3JkVG9Qb2ludChbcixvXSk7cmV0dXJuIGEucHVzaChyLG8qTWF0aC5QSS8xODApLGF9LHNpemU6VyhuUix0KX19fSxjYWxlbmRhcjpmdW5jdGlvbih0KXt2YXIgZT10LmdldFJlY3QoKSxuPXQuZ2V0UmFuZ2VJbmZvKCk7cmV0dXJue2Nvb3JkU3lzOnt0eXBlOiJjYWxlbmRhciIseDplLngseTplLnksd2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHQsY2VsbFdpZHRoOnQuZ2V0Q2VsbFdpZHRoKCksY2VsbEhlaWdodDp0LmdldENlbGxIZWlnaHQoKSxyYW5nZUluZm86e3N0YXJ0Om4uc3RhcnQsZW5kOm4uZW5kLHdlZWtzOm4ud2Vla3MsZGF5Q291bnQ6bi5hbGxEYXl9fSxhcGk6e2Nvb3JkOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuZGF0YVRvUG9pbnQoZSxuKX19fX19O2Z1bmN0aW9uIHpSKHQpe3JldHVybiB0IGluc3RhbmNlb2Yga3N9ZnVuY3Rpb24gVlIodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYX12YXIgQlI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuX3Byb2dyZXNzaXZlRWxzPW51bGw7dmFyIHI9dGhpcy5fZGF0YSxvPXQuZ2V0RGF0YSgpLGE9dGhpcy5ncm91cCxzPVlSKHQsbyxlLG4pO3J8fGEucmVtb3ZlQWxsKCksby5kaWZmKHIpLmFkZCgoZnVuY3Rpb24oZSl7VVIobixudWxsLGUscyhlLGkpLHQsYSxvKX0pKS5yZW1vdmUoKGZ1bmN0aW9uKGUpe3ZhciBuPXIuZ2V0SXRlbUdyYXBoaWNFbChlKTtuJiZnUihuLCRPKG4pLm9wdGlvbix0KX0pKS51cGRhdGUoKGZ1bmN0aW9uKGUsbCl7dmFyIHU9ci5nZXRJdGVtR3JhcGhpY0VsKGwpO1VSKG4sdSxlLHMoZSxpKSx0LGEsbyl9KSkuZXhlY3V0ZSgpO3ZhciBsPXQuZ2V0KCJjbGlwIiwhMCk/UFModC5jb29yZGluYXRlU3lzdGVtLCExLHQpOm51bGw7bD9hLnNldENsaXBQYXRoKGwpOmEucmVtb3ZlQ2xpcFBhdGgoKSx0aGlzLl9kYXRhPW99LGUucHJvdG90eXBlLmluY3JlbWVudGFsUHJlcGFyZVJlbmRlcj1mdW5jdGlvbih0LGUsbil7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9LGUucHJvdG90eXBlLmluY3JlbWVudGFsUmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89ZS5nZXREYXRhKCksYT1ZUihlLG8sbixpKSxzPXRoaXMuX3Byb2dyZXNzaXZlRWxzPVtdO2Z1bmN0aW9uIGwodCl7dC5pc0dyb3VwfHwodC5pbmNyZW1lbnRhbD0hMCx0LmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLmhvdmVyTGF5ZXI9ITApfWZvcih2YXIgdT10LnN0YXJ0O3U8dC5lbmQ7dSsrKXt2YXIgaD1VUihudWxsLG51bGwsdSxhKHUsciksZSx0aGlzLmdyb3VwLG8pO2gmJihoLnRyYXZlcnNlKGwpLHMucHVzaChoKSl9fSxlLnByb3RvdHlwZS5lYWNoUmVuZGVyZWQ9ZnVuY3Rpb24odCl7SmgodGhpcy5fcHJvZ3Jlc3NpdmVFbHN8fHRoaXMuZ3JvdXAsdCl9LGUucHJvdG90eXBlLmZpbHRlckZvckV4cG9zZWRFdmVudD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1lLmVsZW1lbnQ7aWYobnVsbD09cnx8bi5uYW1lPT09cilyZXR1cm4hMDtmb3IoOyhuPW4uX19ob3N0VGFyZ2V0fHxuLnBhcmVudCkmJm4hPT10aGlzLmdyb3VwOylpZihuLm5hbWU9PT1yKXJldHVybiEwO3JldHVybiExfSxlLnR5cGU9ImN1c3RvbSIsZX0oT2cpO2Z1bmN0aW9uIEZSKHQpe3ZhciBlLG49dC50eXBlO2lmKCJwYXRoIj09PW4pe3ZhciBpPXQuc2hhcGUscj1udWxsIT1pLndpZHRoJiZudWxsIT1pLmhlaWdodD97eDppLnh8fDAseTppLnl8fDAsd2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9Om51bGwsbz1uTihpKTtlPVBoKG8sbnVsbCxyLGkubGF5b3V0fHwiY2VudGVyIiksJE8oZSkuY3VzdG9tUGF0aERhdGE9b31lbHNlIGlmKCJpbWFnZSI9PT1uKWU9bmV3IE5zKHt9KSwkTyhlKS5jdXN0b21JbWFnZVBhdGg9dC5zdHlsZS5pbWFnZTtlbHNlIGlmKCJ0ZXh0Ij09PW4pZT1uZXcgWHMoe30pO2Vsc2UgaWYoImdyb3VwIj09PW4pZT1uZXcgQnI7ZWxzZXtpZigiY29tcG91bmRQYXRoIj09PW4pdGhyb3cgbmV3IEVycm9yKCciY29tcG91bmRQYXRoIiBpcyBub3Qgc3VwcG9ydGVkIHlldC4nKTt2YXIgYT1MaChuKTtpZighYSl7dmFyIHM9IiI7MCx3byhzKX1lPW5ldyBhfXJldHVybiAkTyhlKS5jdXN0b21HcmFwaGljVHlwZT1uLGUubmFtZT10Lm5hbWUsZS56MkVtcGhhc2lzTGlmdD0xLGUuejJTZWxlY3RMaWZ0PTEsZX1mdW5jdGlvbiBHUih0LGUsbixpLHIsbyxhKXtJUihlKTt2YXIgcz1yJiZyLm5vcm1hbC5jZmc7cyYmZS5zZXRUZXh0Q29uZmlnKHMpLGkmJm51bGw9PWkudHJhbnNpdGlvbiYmKGkudHJhbnNpdGlvbj1SUik7dmFyIGw9aSYmaS5zdHlsZTtpZihsKXtpZigidGV4dCI9PT1lLnR5cGUpe3ZhciB1PWw7X3QodSwidGV4dEZpbGwiKSYmKHUuZmlsbD11LnRleHRGaWxsKSxfdCh1LCJ0ZXh0U3Ryb2tlIikmJih1LnN0cm9rZT11LnRleHRTdHJva2UpfXZhciBoPXZvaWQgMCxjPXpSKGUpP2wuZGVjYWw6bnVsbDt0JiZjJiYoYy5kaXJ0eT0hMCxoPW12KGMsdCkpLGwuX19kZWNhbFBhdHRlcm49aH1WUihlKSYmKGwmJihoPWwuX19kZWNhbFBhdHRlcm4pJiYobC5kZWNhbD1oKSk7ZFIoZSxpLG8se2RhdGFJbmRleDpuLGlzSW5pdDphLGNsZWFyU3R5bGU6ITB9KSxUUihlLGkua2V5ZnJhbWVBbmltYXRpb24sbyl9ZnVuY3Rpb24gV1IodCxlLG4saSxyKXt2YXIgbz1lLmlzR3JvdXA/bnVsbDplLGE9ciYmclt0XS5jZmc7aWYobyl7dmFyIHM9by5lbnN1cmVTdGF0ZSh0KTtpZighMT09PWkpe3ZhciBsPW8uZ2V0U3RhdGUodCk7bCYmKGwuc3R5bGU9bnVsbCl9ZWxzZSBzLnN0eWxlPWl8fG51bGw7YSYmKHMudGV4dENvbmZpZz1hKSxrbChvKX19ZnVuY3Rpb24gSFIodCxlLG4pe3ZhciBpPW49PT1EUixyPWk/ZTpLUihlLG4pLG89cj9yLnoyOm51bGw7bnVsbCE9byYmKChpP3Q6dC5lbnN1cmVTdGF0ZShuKSkuejI9b3x8MCl9ZnVuY3Rpb24gWVIodCxlLG4saSl7dmFyIHI9dC5nZXQoInJlbmRlckl0ZW0iKSxvPXQuY29vcmRpbmF0ZVN5c3RlbSxhPXt9O28mJihhPW8ucHJlcGFyZUN1c3RvbXM/by5wcmVwYXJlQ3VzdG9tcyhvKTpFUltvLnR5cGVdKG8pKTtmb3IodmFyIHMsbCx1PWsoe2dldFdpZHRoOmkuZ2V0V2lkdGgsZ2V0SGVpZ2h0OmkuZ2V0SGVpZ2h0LGdldFpyOmkuZ2V0WnIsZ2V0RGV2aWNlUGl4ZWxSYXRpbzppLmdldERldmljZVBpeGVsUmF0aW8sdmFsdWU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09biYmKG49cyksZS5nZXRTdG9yZSgpLmdldChlLmdldERpbWVuc2lvbkluZGV4KHR8fDApLG4pfSxzdHlsZTpmdW5jdGlvbihuLGkpezA7bnVsbD09aSYmKGk9cyk7dmFyIHI9ZS5nZXRJdGVtVmlzdWFsKGksInN0eWxlIiksbz1yJiZyLmZpbGwsYT1yJiZyLm9wYWNpdHksbD1tKGksRFIpLmdldEl0ZW1TdHlsZSgpO251bGwhPW8mJihsLmZpbGw9byksbnVsbCE9YSYmKGwub3BhY2l0eT1hKTt2YXIgdT17aW5oZXJpdENvbG9yOlUobyk/bzoiIzAwMCJ9LGg9eChpLERSKSxjPW9jKGgsbnVsbCx1LCExLCEwKTtjLnRleHQ9aC5nZXRTaGFsbG93KCJzaG93Iik/cnQodC5nZXRGb3JtYXR0ZWRMYWJlbChpLERSKSxwUyhlLGkpKTpudWxsO3ZhciBwPWFjKGgsdSwhMSk7cmV0dXJuIGIobixsKSxsPWFSKGwsYyxwKSxuJiZfKGwsbiksbC5sZWdhY3k9ITAsbH0sb3JkaW5hbFJhd1ZhbHVlOmZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49cyksdD10fHwwO3ZhciBpPWUuZ2V0RGltZW5zaW9uSW5mbyh0KTtpZighaSl7dmFyIHI9ZS5nZXREaW1lbnNpb25JbmRleCh0KTtyZXR1cm4gcj49MD9lLmdldFN0b3JlKCkuZ2V0KHIsbik6dm9pZCAwfXZhciBvPWUuZ2V0KGkubmFtZSxuKSxhPWkmJmkub3JkaW5hbE1ldGE7cmV0dXJuIGE/YS5jYXRlZ29yaWVzW29dOm99LHN0eWxlRW1waGFzaXM6ZnVuY3Rpb24obixpKXswO251bGw9PWkmJihpPXMpO3ZhciByPW0oaSxDUikuZ2V0SXRlbVN0eWxlKCksbz14KGksQ1IpLGE9b2MobyxudWxsLG51bGwsITAsITApO2EudGV4dD1vLmdldFNoYWxsb3coInNob3ciKT9vdCh0LmdldEZvcm1hdHRlZExhYmVsKGksQ1IpLHQuZ2V0Rm9ybWF0dGVkTGFiZWwoaSxEUikscFMoZSxpKSk6bnVsbDt2YXIgbD1hYyhvLG51bGwsITApO3JldHVybiBiKG4scikscj1hUihyLGEsbCksbiYmXyhyLG4pLHIubGVnYWN5PSEwLHJ9LHZpc3VhbDpmdW5jdGlvbih0LG4pe2lmKG51bGw9PW4mJihuPXMpLF90KHFPLHQpKXt2YXIgaT1lLmdldEl0ZW1WaXN1YWwobiwic3R5bGUiKTtyZXR1cm4gaT9pW3FPW3RdXTpudWxsfWlmKF90KEtPLHQpKXJldHVybiBlLmdldEl0ZW1WaXN1YWwobix0KX0sYmFyTGF5b3V0OmZ1bmN0aW9uKHQpe2lmKCJjYXJ0ZXNpYW4yZCI9PT1vLnR5cGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1bXSxuPXQuYXhpcyxpPSJheGlzMCI7aWYoImNhdGVnb3J5Ij09PW4udHlwZSl7Zm9yKHZhciByPW4uZ2V0QmFuZFdpZHRoKCksbz0wO288dC5jb3VudDtvKyspZS5wdXNoKGsoe2JhbmRXaWR0aDpyLGF4aXNLZXk6aSxzdGFja0lkOkZ4K299LHQpKTt2YXIgYT1YeChlKSxzPVtdO2ZvcihvPTA7bzx0LmNvdW50O28rKyl7dmFyIGw9YVtpXVtGeCtvXTtsLm9mZnNldENlbnRlcj1sLm9mZnNldCtsLndpZHRoLzIscy5wdXNoKGwpfXJldHVybiBzfX0oayh7YXhpczpvLmdldEJhc2VBeGlzKCl9LHQpKX19LGN1cnJlbnRTZXJpZXNJbmRpY2VzOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0Q3VycmVudFNlcmllc0luZGljZXMoKX0sZm9udDpmdW5jdGlvbih0KXtyZXR1cm4gY2ModCxuKX19LGEuYXBpfHx7fSksaD17Y29udGV4dDp7fSxzZXJpZXNJZDp0LmlkLHNlcmllc05hbWU6dC5uYW1lLHNlcmllc0luZGV4OnQuc2VyaWVzSW5kZXgsY29vcmRTeXM6YS5jb29yZFN5cyxkYXRhSW5zaWRlTGVuZ3RoOmUuY291bnQoKSxlbmNvZGU6WFIodC5nZXREYXRhKCkpfSxjPXt9LHA9e30sZD17fSxmPXt9LGc9MDtnPExSLmxlbmd0aDtnKyspe3ZhciB5PUxSW2ddO2RbeV09dC5nZXRNb2RlbChQUlt5XSksZlt5XT10LmdldE1vZGVsKE9SW3ldKX1mdW5jdGlvbiB2KHQpe3JldHVybiB0PT09cz9sfHwobD1lLmdldEl0ZW1Nb2RlbCh0KSk6ZS5nZXRJdGVtTW9kZWwodCl9ZnVuY3Rpb24gbSh0LG4pe3JldHVybiBlLmhhc0l0ZW1PcHRpb24/dD09PXM/Y1tuXXx8KGNbbl09dih0KS5nZXRNb2RlbChQUltuXSkpOnYodCkuZ2V0TW9kZWwoUFJbbl0pOmRbbl19ZnVuY3Rpb24geCh0LG4pe3JldHVybiBlLmhhc0l0ZW1PcHRpb24/dD09PXM/cFtuXXx8KHBbbl09dih0KS5nZXRNb2RlbChPUltuXSkpOnYodCkuZ2V0TW9kZWwoT1Jbbl0pOmZbbl19cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIHM9dCxsPW51bGwsYz17fSxwPXt9LHImJnIoayh7ZGF0YUluZGV4SW5zaWRlOnQsZGF0YUluZGV4OmUuZ2V0UmF3SW5kZXgodCksYWN0aW9uVHlwZTpuP24udHlwZTpudWxsfSxoKSx1KX07ZnVuY3Rpb24gXyh0LGUpe2Zvcih2YXIgbiBpbiBlKV90KGUsbikmJih0W25dPWVbbl0pfWZ1bmN0aW9uIGIodCxlKXt0JiYodC50ZXh0RmlsbCYmKGUudGV4dEZpbGw9dC50ZXh0RmlsbCksdC50ZXh0UG9zaXRpb24mJihlLnRleHRQb3NpdGlvbj10LnRleHRQb3NpdGlvbikpfX1mdW5jdGlvbiBYUih0KXt2YXIgZT17fTtyZXR1cm4gRSh0LmRpbWVuc2lvbnMsKGZ1bmN0aW9uKG4pe3ZhciBpPXQuZ2V0RGltZW5zaW9uSW5mbyhuKTtpZighaS5pc0V4dHJhQ29vcmQpe3ZhciByPWkuY29vcmREaW07KGVbcl09ZVtyXXx8W10pW2kuY29vcmREaW1JbmRleF09dC5nZXREaW1lbnNpb25JbmRleChuKX19KSksZX1mdW5jdGlvbiBVUih0LGUsbixpLHIsbyxhKXtpZihpKXt2YXIgcz1aUih0LGUsbixpLHIsbyk7cmV0dXJuIHMmJmEuc2V0SXRlbUdyYXBoaWNFbChuLHMpLHMmJlpsKHMsaS5mb2N1cyxpLmJsdXJTY29wZSxpLmVtcGhhc2lzRGlzYWJsZWQpLHN9by5yZW1vdmUoZSl9ZnVuY3Rpb24gWlIodCxlLG4saSxyLG8pe3ZhciBhPS0xLHM9ZTtlJiZqUihlLGkscikmJihhPVAoby5jaGlsZHJlblJlZigpLGUpLGU9bnVsbCk7dmFyIGwsdSxoPSFlLGM9ZTtjP2MuY2xlYXJTdGF0ZXMoKTooYz1GUihpKSxzJiYobD1zLCh1PWMpLmNvcHlUcmFuc2Zvcm0obCksVlIodSkmJlZSKGwpJiYodS5zZXRTdHlsZShsLnN0eWxlKSx1Lno9bC56LHUuejI9bC56Mix1LnpsZXZlbD1sLnpsZXZlbCx1LmludmlzaWJsZT1sLmludmlzaWJsZSx1Lmlnbm9yZT1sLmlnbm9yZSx6Uih1KSYmelIobCkmJnUuc2V0U2hhcGUobC5zaGFwZSkpKSksITE9PT1pLm1vcnBoP2MuZGlzYWJsZU1vcnBoaW5nPSEwOmMuZGlzYWJsZU1vcnBoaW5nJiYoYy5kaXNhYmxlTW9ycGhpbmc9ITEpLE5SLm5vcm1hbC5jZmc9TlIubm9ybWFsLmNvbk9wdD1OUi5lbXBoYXNpcy5jZmc9TlIuZW1waGFzaXMuY29uT3B0PU5SLmJsdXIuY2ZnPU5SLmJsdXIuY29uT3B0PU5SLnNlbGVjdC5jZmc9TlIuc2VsZWN0LmNvbk9wdD1udWxsLE5SLmlzTGVnYWN5PSExLGZ1bmN0aW9uKHQsZSxuLGkscixvKXtpZih0LmlzR3JvdXApcmV0dXJuO3FSKG4sbnVsbCxvKSxxUihuLENSLG8pO3ZhciBhPW8ubm9ybWFsLmNvbk9wdCxzPW8uZW1waGFzaXMuY29uT3B0LGw9by5ibHVyLmNvbk9wdCx1PW8uc2VsZWN0LmNvbk9wdDtpZihudWxsIT1hfHxudWxsIT1zfHxudWxsIT11fHxudWxsIT1sKXt2YXIgaD10LmdldFRleHRDb250ZW50KCk7aWYoITE9PT1hKWgmJnQucmVtb3ZlVGV4dENvbnRlbnQoKTtlbHNle2E9by5ub3JtYWwuY29uT3B0PWF8fHt0eXBlOiJ0ZXh0In0saD9oLmNsZWFyU3RhdGVzKCk6KGg9RlIoYSksdC5zZXRUZXh0Q29udGVudChoKSksR1IobnVsbCxoLGUsYSxudWxsLGkscik7Zm9yKHZhciBjPWEmJmEuc3R5bGUscD0wO3A8TFIubGVuZ3RoO3ArKyl7dmFyIGQ9TFJbcF07aWYoZCE9PURSKXt2YXIgZj1vW2RdLmNvbk9wdDtXUihkLGgsMCwkUihhLGYsZCksbnVsbCl9fWM/aC5kaXJ0eSgpOmgubWFya1JlZHJhdygpfX19KGMsbixpLHIsaCxOUiksZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz1uLmNsaXBQYXRoO2lmKCExPT09byl0JiZ0LmdldENsaXBQYXRoKCkmJnQucmVtb3ZlQ2xpcFBhdGgoKTtlbHNlIGlmKG8pe3ZhciBhPXQuZ2V0Q2xpcFBhdGgoKTthJiZqUihhLG8saSkmJihhPW51bGwpLGF8fChhPUZSKG8pLHQuc2V0Q2xpcFBhdGgoYSkpLEdSKG51bGwsYSxlLG8sbnVsbCxpLHIpfX0oYyxuLGkscixoKSxHUih0LGMsbixpLE5SLHIsaCksX3QoaSwiaW5mbyIpJiYoJE8oYykuaW5mbz1pLmluZm8pO2Zvcih2YXIgcD0wO3A8TFIubGVuZ3RoO3ArKyl7dmFyIGQ9TFJbcF07aWYoZCE9PURSKXt2YXIgZj1LUihpLGQpO1dSKGQsYywwLCRSKGksZixkKSxOUil9fXJldHVybiBmdW5jdGlvbih0LGUsbil7aWYoIXQuaXNHcm91cCl7dmFyIGk9dCxyPW4uY3VycmVudFosbz1uLmN1cnJlbnRaTGV2ZWw7aS56PXIsaS56bGV2ZWw9bzt2YXIgYT1lLnoyO251bGwhPWEmJihpLnoyPWF8fDApO2Zvcih2YXIgcz0wO3M8TFIubGVuZ3RoO3MrKylIUihpLGUsTFJbc10pfX0oYyxpLHIpLCJncm91cCI9PT1pLnR5cGUmJmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89aS5jaGlsZHJlbixhPW8/by5sZW5ndGg6MCxzPWkuJG1lcmdlQ2hpbGRyZW4sbD0iYnlOYW1lIj09PXN8fGkuZGlmZkNoaWxkcmVuQnlOYW1lLHU9ITE9PT1zO2lmKCFhJiYhbCYmIXUpcmV0dXJuO2lmKGwpcmV0dXJuIGg9e2FwaTp0LG9sZENoaWxkcmVuOmUuY2hpbGRyZW4oKXx8W10sbmV3Q2hpbGRyZW46b3x8W10sZGF0YUluZGV4Om4sc2VyaWVzTW9kZWw6cixncm91cDplfSx2b2lkIG5ldyBHbShoLm9sZENoaWxkcmVuLGgubmV3Q2hpbGRyZW4sUVIsUVIsaCkuYWRkKHROKS51cGRhdGUodE4pLnJlbW92ZShlTikuZXhlY3V0ZSgpO3ZhciBoO3UmJmUucmVtb3ZlQWxsKCk7Zm9yKHZhciBjPTA7YzxhO2MrKyl7dmFyIHA9b1tjXSxkPWUuY2hpbGRBdChjKTtwPyhudWxsPT1wLmlnbm9yZSYmKHAuaWdub3JlPSExKSxaUih0LGQsbixwLHIsZSkpOmQuaWdub3JlPSEwfWZvcih2YXIgZj1lLmNoaWxkQ291bnQoKS0xO2Y+PWM7Zi0tKXt2YXIgZz1lLmNoaWxkQXQoZik7SlIoZSxnLHIpfX0odCxjLG4saSxyKSxhPj0wP28ucmVwbGFjZUF0KGMsYSk6by5hZGQoYyksY31mdW5jdGlvbiBqUih0LGUsbil7dmFyIGkscj0kTyh0KSxvPWUudHlwZSxhPWUuc2hhcGUscz1lLnN0eWxlO3JldHVybiBuLmlzVW5pdmVyc2FsVHJhbnNpdGlvbkVuYWJsZWQoKXx8bnVsbCE9byYmbyE9PXIuY3VzdG9tR3JhcGhpY1R5cGV8fCJwYXRoIj09PW8mJigoaT1hKSYmKF90KGksInBhdGhEYXRhIil8fF90KGksImQiKSkpJiZuTihhKSE9PXIuY3VzdG9tUGF0aERhdGF8fCJpbWFnZSI9PT1vJiZfdChzLCJpbWFnZSIpJiZzLmltYWdlIT09ci5jdXN0b21JbWFnZVBhdGh9ZnVuY3Rpb24gcVIodCxlLG4pe3ZhciBpPWU/S1IodCxlKTp0LHI9ZT8kUih0LGksQ1IpOnQuc3R5bGUsbz10LnR5cGUsYT1pP2kudGV4dENvbmZpZzpudWxsLHM9dC50ZXh0Q29udGVudCxsPXM/ZT9LUihzLGUpOnM6bnVsbDtpZihyJiYobi5pc0xlZ2FjeXx8aVIocixvLCEhYSwhIWwpKSl7bi5pc0xlZ2FjeT0hMDt2YXIgdT1yUihyLG8sIWUpOyFhJiZ1LnRleHRDb25maWcmJihhPXUudGV4dENvbmZpZyksIWwmJnUudGV4dENvbnRlbnQmJihsPXUudGV4dENvbnRlbnQpfWlmKCFlJiZsKXt2YXIgaD1sOyFoLnR5cGUmJihoLnR5cGU9InRleHQiKX12YXIgYz1lP25bZV06bi5ub3JtYWw7Yy5jZmc9YSxjLmNvbk9wdD1sfWZ1bmN0aW9uIEtSKHQsZSl7cmV0dXJuIGU/dD90W2VdOm51bGw6dH1mdW5jdGlvbiAkUih0LGUsbil7dmFyIGk9ZSYmZS5zdHlsZTtyZXR1cm4gbnVsbD09aSYmbj09PUNSJiZ0JiYoaT10LnN0eWxlRW1waGFzaXMpLGl9ZnVuY3Rpb24gSlIodCxlLG4pe2UmJmdSKGUsJE8odCkub3B0aW9uLG4pfWZ1bmN0aW9uIFFSKHQsZSl7dmFyIG49dCYmdC5uYW1lO3JldHVybiBudWxsIT1uP246ImVcMFwwIitlfWZ1bmN0aW9uIHROKHQsZSl7dmFyIG49dGhpcy5jb250ZXh0LGk9bnVsbCE9dD9uLm5ld0NoaWxkcmVuW3RdOm51bGwscj1udWxsIT1lP24ub2xkQ2hpbGRyZW5bZV06bnVsbDtaUihuLmFwaSxyLG4uZGF0YUluZGV4LGksbi5zZXJpZXNNb2RlbCxuLmdyb3VwKX1mdW5jdGlvbiBlTih0KXt2YXIgZT10aGlzLmNvbnRleHQsbj1lLm9sZENoaWxkcmVuW3RdO24mJmdSKG4sJE8obikub3B0aW9uLGUuc2VyaWVzTW9kZWwpfWZ1bmN0aW9uIG5OKHQpe3JldHVybiB0JiYodC5wYXRoRGF0YXx8dC5kKX12YXIgaU49Vm8oKSxyTj1ULG9OPVcsYU49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5hbmltYXRpb25UaHJlc2hvbGQ9MTV9cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1lLmdldCgidmFsdWUiKSxvPWUuZ2V0KCJzdGF0dXMiKTtpZih0aGlzLl9heGlzTW9kZWw9dCx0aGlzLl9heGlzUG9pbnRlck1vZGVsPWUsdGhpcy5fYXBpPW4saXx8dGhpcy5fbGFzdFZhbHVlIT09cnx8dGhpcy5fbGFzdFN0YXR1cyE9PW8pe3RoaXMuX2xhc3RWYWx1ZT1yLHRoaXMuX2xhc3RTdGF0dXM9bzt2YXIgYT10aGlzLl9ncm91cCxzPXRoaXMuX2hhbmRsZTtpZighb3x8ImhpZGUiPT09bylyZXR1cm4gYSYmYS5oaWRlKCksdm9pZChzJiZzLmhpZGUoKSk7YSYmYS5zaG93KCkscyYmcy5zaG93KCk7dmFyIGw9e307dGhpcy5tYWtlRWxPcHRpb24obCxyLHQsZSxuKTt2YXIgdT1sLmdyYXBoaWNLZXk7dSE9PXRoaXMuX2xhc3RHcmFwaGljS2V5JiZ0aGlzLmNsZWFyKG4pLHRoaXMuX2xhc3RHcmFwaGljS2V5PXU7dmFyIGg9dGhpcy5fbW92ZUFuaW1hdGlvbj10aGlzLmRldGVybWluZUFuaW1hdGlvbih0LGUpO2lmKGEpe3ZhciBjPUgoc04sZSxoKTt0aGlzLnVwZGF0ZVBvaW50ZXJFbChhLGwsYyksdGhpcy51cGRhdGVMYWJlbEVsKGEsbCxjLGUpfWVsc2UgYT10aGlzLl9ncm91cD1uZXcgQnIsdGhpcy5jcmVhdGVQb2ludGVyRWwoYSxsLHQsZSksdGhpcy5jcmVhdGVMYWJlbEVsKGEsbCx0LGUpLG4uZ2V0WnIoKS5hZGQoYSk7Y04oYSxlLCEwKSx0aGlzLl9yZW5kZXJIYW5kbGUocil9fSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5jbGVhcih0KX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbih0KXt0aGlzLmNsZWFyKHQpfSx0LnByb3RvdHlwZS5kZXRlcm1pbmVBbmltYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldCgiYW5pbWF0aW9uIiksaT10LmF4aXMscj0iY2F0ZWdvcnkiPT09aS50eXBlLG89ZS5nZXQoInNuYXAiKTtpZighbyYmIXIpcmV0dXJuITE7aWYoImF1dG8iPT09bnx8bnVsbD09bil7dmFyIGE9dGhpcy5hbmltYXRpb25UaHJlc2hvbGQ7aWYociYmaS5nZXRCYW5kV2lkdGgoKT5hKXJldHVybiEwO2lmKG8pe3ZhciBzPXdJKHQpLnNlcmllc0RhdGFDb3VudCxsPWkuZ2V0RXh0ZW50KCk7cmV0dXJuIE1hdGguYWJzKGxbMF0tbFsxXSkvcz5hfXJldHVybiExfXJldHVybiEwPT09bn0sdC5wcm90b3R5cGUubWFrZUVsT3B0aW9uPWZ1bmN0aW9uKHQsZSxuLGkscil7fSx0LnByb3RvdHlwZS5jcmVhdGVQb2ludGVyRWw9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9ZS5wb2ludGVyO2lmKHIpe3ZhciBvPWlOKHQpLnBvaW50ZXJFbD1uZXcgUWhbci50eXBlXShyTihlLnBvaW50ZXIpKTt0LmFkZChvKX19LHQucHJvdG90eXBlLmNyZWF0ZUxhYmVsRWw9ZnVuY3Rpb24odCxlLG4saSl7aWYoZS5sYWJlbCl7dmFyIHI9aU4odCkubGFiZWxFbD1uZXcgWHMock4oZS5sYWJlbCkpO3QuYWRkKHIpLHVOKHIsaSl9fSx0LnByb3RvdHlwZS51cGRhdGVQb2ludGVyRWw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPWlOKHQpLnBvaW50ZXJFbDtpJiZlLnBvaW50ZXImJihpLnNldFN0eWxlKGUucG9pbnRlci5zdHlsZSksbihpLHtzaGFwZTplLnBvaW50ZXIuc2hhcGV9KSl9LHQucHJvdG90eXBlLnVwZGF0ZUxhYmVsRWw9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9aU4odCkubGFiZWxFbDtyJiYoci5zZXRTdHlsZShlLmxhYmVsLnN0eWxlKSxuKHIse3g6ZS5sYWJlbC54LHk6ZS5sYWJlbC55fSksdU4ocixpKSl9LHQucHJvdG90eXBlLl9yZW5kZXJIYW5kbGU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuX2RyYWdnaW5nJiZ0aGlzLnVwZGF0ZUhhbmRsZVRyYW5zZm9ybSl7dmFyIGUsbj10aGlzLl9heGlzUG9pbnRlck1vZGVsLGk9dGhpcy5fYXBpLmdldFpyKCkscj10aGlzLl9oYW5kbGUsbz1uLmdldE1vZGVsKCJoYW5kbGUiKSxhPW4uZ2V0KCJzdGF0dXMiKTtpZighby5nZXQoInNob3ciKXx8IWF8fCJoaWRlIj09PWEpcmV0dXJuIHImJmkucmVtb3ZlKHIpLHZvaWQodGhpcy5faGFuZGxlPW51bGwpO3RoaXMuX2hhbmRsZXx8KGU9ITAscj10aGlzLl9oYW5kbGU9VWgoby5nZXQoImljb24iKSx7Y3Vyc29yOiJtb3ZlIixkcmFnZ2FibGU6ITAsb25tb3VzZW1vdmU6ZnVuY3Rpb24odCl7ZGUodC5ldmVudCl9LG9ubW91c2Vkb3duOm9OKHRoaXMuX29uSGFuZGxlRHJhZ01vdmUsdGhpcywwLDApLGRyaWZ0Om9OKHRoaXMuX29uSGFuZGxlRHJhZ01vdmUsdGhpcyksb25kcmFnZW5kOm9OKHRoaXMuX29uSGFuZGxlRHJhZ0VuZCx0aGlzKX0pLGkuYWRkKHIpKSxjTihyLG4sITEpLHIuc2V0U3R5bGUoby5nZXRJdGVtU3R5bGUobnVsbCxbImNvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsIm9wYWNpdHkiLCJzaGFkb3dDb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dPZmZzZXRYIiwic2hhZG93T2Zmc2V0WSJdKSk7dmFyIHM9by5nZXQoInNpemUiKTtZKHMpfHwocz1bcyxzXSksci5zY2FsZVg9c1swXS8yLHIuc2NhbGVZPXNbMV0vMixIZyh0aGlzLCJfZG9EaXNwYXRjaEF4aXNQb2ludGVyIixvLmdldCgidGhyb3R0bGUiKXx8MCwiZml4UmF0ZSIpLHRoaXMuX21vdmVIYW5kbGVUb1ZhbHVlKHQsZSl9fSx0LnByb3RvdHlwZS5fbW92ZUhhbmRsZVRvVmFsdWU9ZnVuY3Rpb24odCxlKXtzTih0aGlzLl9heGlzUG9pbnRlck1vZGVsLCFlJiZ0aGlzLl9tb3ZlQW5pbWF0aW9uLHRoaXMuX2hhbmRsZSxoTih0aGlzLmdldEhhbmRsZVRyYW5zZm9ybSh0LHRoaXMuX2F4aXNNb2RlbCx0aGlzLl9heGlzUG9pbnRlck1vZGVsKSkpfSx0LnByb3RvdHlwZS5fb25IYW5kbGVEcmFnTW92ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2hhbmRsZTtpZihuKXt0aGlzLl9kcmFnZ2luZz0hMDt2YXIgaT10aGlzLnVwZGF0ZUhhbmRsZVRyYW5zZm9ybShoTihuKSxbdCxlXSx0aGlzLl9heGlzTW9kZWwsdGhpcy5fYXhpc1BvaW50ZXJNb2RlbCk7dGhpcy5fcGF5bG9hZEluZm89aSxuLnN0b3BBbmltYXRpb24oKSxuLmF0dHIoaE4oaSkpLGlOKG4pLmxhc3RQcm9wPW51bGwsdGhpcy5fZG9EaXNwYXRjaEF4aXNQb2ludGVyKCl9fSx0LnByb3RvdHlwZS5fZG9EaXNwYXRjaEF4aXNQb2ludGVyPWZ1bmN0aW9uKCl7aWYodGhpcy5faGFuZGxlKXt2YXIgdD10aGlzLl9wYXlsb2FkSW5mbyxlPXRoaXMuX2F4aXNNb2RlbDt0aGlzLl9hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InVwZGF0ZUF4aXNQb2ludGVyIix4OnQuY3Vyc29yUG9pbnRbMF0seTp0LmN1cnNvclBvaW50WzFdLHRvb2x0aXBPcHRpb246dC50b29sdGlwT3B0aW9uLGF4ZXNJbmZvOlt7YXhpc0RpbTplLmF4aXMuZGltLGF4aXNJbmRleDplLmNvbXBvbmVudEluZGV4fV19KX19LHQucHJvdG90eXBlLl9vbkhhbmRsZURyYWdFbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9kcmFnZ2luZz0hMSx0aGlzLl9oYW5kbGUpe3ZhciB0PXRoaXMuX2F4aXNQb2ludGVyTW9kZWwuZ2V0KCJ2YWx1ZSIpO3RoaXMuX21vdmVIYW5kbGVUb1ZhbHVlKHQpLHRoaXMuX2FwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiaGlkZVRpcCJ9KX19LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe3RoaXMuX2xhc3RWYWx1ZT1udWxsLHRoaXMuX2xhc3RTdGF0dXM9bnVsbDt2YXIgZT10LmdldFpyKCksbj10aGlzLl9ncm91cCxpPXRoaXMuX2hhbmRsZTtlJiZuJiYodGhpcy5fbGFzdEdyYXBoaWNLZXk9bnVsbCxuJiZlLnJlbW92ZShuKSxpJiZlLnJlbW92ZShpKSx0aGlzLl9ncm91cD1udWxsLHRoaXMuX2hhbmRsZT1udWxsLHRoaXMuX3BheWxvYWRJbmZvPW51bGwpLFlnKHRoaXMsIl9kb0Rpc3BhdGNoQXhpc1BvaW50ZXIiKX0sdC5wcm90b3R5cGUuZG9DbGVhcj1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuYnVpbGRMYWJlbD1mdW5jdGlvbih0LGUsbil7cmV0dXJue3g6dFtuPW58fDBdLHk6dFsxLW5dLHdpZHRoOmVbbl0saGVpZ2h0OmVbMS1uXX19LHR9KCk7ZnVuY3Rpb24gc04odCxlLG4saSl7bE4oaU4obikubGFzdFByb3AsaSl8fChpTihuKS5sYXN0UHJvcD1pLGU/dmgobixpLHQpOihuLnN0b3BBbmltYXRpb24oKSxuLmF0dHIoaSkpKX1mdW5jdGlvbiBsTih0LGUpe2lmKHEodCkmJnEoZSkpe3ZhciBuPSEwO3JldHVybiBFKGUsKGZ1bmN0aW9uKGUsaSl7bj1uJiZsTih0W2ldLGUpfSkpLCEhbn1yZXR1cm4gdD09PWV9ZnVuY3Rpb24gdU4odCxlKXt0W2UuZ2V0KFsibGFiZWwiLCJzaG93Il0pPyJzaG93IjoiaGlkZSJdKCl9ZnVuY3Rpb24gaE4odCl7cmV0dXJue3g6dC54fHwwLHk6dC55fHwwLHJvdGF0aW9uOnQucm90YXRpb258fDB9fWZ1bmN0aW9uIGNOKHQsZSxuKXt2YXIgaT1lLmdldCgieiIpLHI9ZS5nZXQoInpsZXZlbCIpO3QmJnQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpeyJncm91cCIhPT10LnR5cGUmJihudWxsIT1pJiYodC56PWkpLG51bGwhPXImJih0LnpsZXZlbD1yKSx0LnNpbGVudD1uKX0pKX1mdW5jdGlvbiBwTih0KXt2YXIgZSxuPXQuZ2V0KCJ0eXBlIiksaT10LmdldE1vZGVsKG4rIlN0eWxlIik7cmV0dXJuImxpbmUiPT09bj8oZT1pLmdldExpbmVTdHlsZSgpKS5maWxsPW51bGw6InNoYWRvdyI9PT1uJiYoKGU9aS5nZXRBcmVhU3R5bGUoKSkuc3Ryb2tlPW51bGwpLGV9ZnVuY3Rpb24gZE4odCxlLG4saSxyKXt2YXIgbz1mTihuLmdldCgidmFsdWUiKSxlLmF4aXMsZS5lY01vZGVsLG4uZ2V0KCJzZXJpZXNEYXRhSW5kaWNlcyIpLHtwcmVjaXNpb246bi5nZXQoWyJsYWJlbCIsInByZWNpc2lvbiJdKSxmb3JtYXR0ZXI6bi5nZXQoWyJsYWJlbCIsImZvcm1hdHRlciJdKX0pLGE9bi5nZXRNb2RlbCgibGFiZWwiKSxzPXZwKGEuZ2V0KCJwYWRkaW5nIil8fDApLGw9YS5nZXRGb250KCksdT1TcihvLGwpLGg9ci5wb3NpdGlvbixjPXUud2lkdGgrc1sxXStzWzNdLHA9dS5oZWlnaHQrc1swXStzWzJdLGQ9ci5hbGlnbjsicmlnaHQiPT09ZCYmKGhbMF0tPWMpLCJjZW50ZXIiPT09ZCYmKGhbMF0tPWMvMik7dmFyIGY9ci52ZXJ0aWNhbEFsaWduOyJib3R0b20iPT09ZiYmKGhbMV0tPXApLCJtaWRkbGUiPT09ZiYmKGhbMV0tPXAvMiksZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9aS5nZXRXaWR0aCgpLG89aS5nZXRIZWlnaHQoKTt0WzBdPU1hdGgubWluKHRbMF0rZSxyKS1lLHRbMV09TWF0aC5taW4odFsxXStuLG8pLW4sdFswXT1NYXRoLm1heCh0WzBdLDApLHRbMV09TWF0aC5tYXgodFsxXSwwKX0oaCxjLHAsaSk7dmFyIGc9YS5nZXQoImJhY2tncm91bmRDb2xvciIpO2cmJiJhdXRvIiE9PWd8fChnPWUuZ2V0KFsiYXhpc0xpbmUiLCJsaW5lU3R5bGUiLCJjb2xvciJdKSksdC5sYWJlbD17eDpoWzBdLHk6aFsxXSxzdHlsZTpvYyhhLHt0ZXh0Om8sZm9udDpsLGZpbGw6YS5nZXRUZXh0Q29sb3IoKSxwYWRkaW5nOnMsYmFja2dyb3VuZENvbG9yOmd9KSx6MjoxMH19ZnVuY3Rpb24gZk4odCxlLG4saSxyKXt0PWUuc2NhbGUucGFyc2UodCk7dmFyIG89ZS5zY2FsZS5nZXRMYWJlbCh7dmFsdWU6dH0se3ByZWNpc2lvbjpyLnByZWNpc2lvbn0pLGE9ci5mb3JtYXR0ZXI7aWYoYSl7dmFyIHM9e3ZhbHVlOlNfKGUse3ZhbHVlOnR9KSxheGlzRGltZW5zaW9uOmUuZGltLGF4aXNJbmRleDplLmluZGV4LHNlcmllc0RhdGE6W119O0UoaSwoZnVuY3Rpb24odCl7dmFyIGU9bi5nZXRTZXJpZXNCeUluZGV4KHQuc2VyaWVzSW5kZXgpLGk9dC5kYXRhSW5kZXhJbnNpZGUscj1lJiZlLmdldERhdGFQYXJhbXMoaSk7ciYmcy5zZXJpZXNEYXRhLnB1c2gocil9KSksVShhKT9vPWEucmVwbGFjZSgie3ZhbHVlfSIsbyk6WChhKSYmKG89YShzKSl9cmV0dXJuIG99ZnVuY3Rpb24gZ04odCxlLG4pe3ZhciBpPVsxLDAsMCwxLDAsMF07cmV0dXJuIFNlKGksaSxuLnJvdGF0aW9uKSx3ZShpLGksbi5wb3NpdGlvbiksRmgoW3QuZGF0YVRvQ29vcmQoZSksKG4ubGFiZWxPZmZzZXR8fDApKyhuLmxhYmVsRGlyZWN0aW9ufHwxKSoobi5sYWJlbE1hcmdpbnx8MCldLGkpfWZ1bmN0aW9uIHlOKHQsZSxuLGkscixvKXt2YXIgYT1kSS5pbm5lclRleHRMYXlvdXQobi5yb3RhdGlvbiwwLG4ubGFiZWxEaXJlY3Rpb24pO24ubGFiZWxNYXJnaW49ci5nZXQoWyJsYWJlbCIsIm1hcmdpbiJdKSxkTihlLGkscixvLHtwb3NpdGlvbjpnTihpLmF4aXMsdCxuKSxhbGlnbjphLnRleHRBbGlnbix2ZXJ0aWNhbEFsaWduOmEudGV4dFZlcnRpY2FsQWxpZ259KX1mdW5jdGlvbiB2Tih0LGUsbil7cmV0dXJue3gxOnRbbj1ufHwwXSx5MTp0WzEtbl0seDI6ZVtuXSx5MjplWzEtbl19fWZ1bmN0aW9uIG1OKHQsZSxuKXtyZXR1cm57eDp0W249bnx8MF0seTp0WzEtbl0sd2lkdGg6ZVtuXSxoZWlnaHQ6ZVsxLW5dfX1mdW5jdGlvbiB4Tih0LGUsbixpLHIsbyl7cmV0dXJue2N4OnQsY3k6ZSxyMDpuLHI6aSxzdGFydEFuZ2xlOnIsZW5kQW5nbGU6byxjbG9ja3dpc2U6ITB9fXZhciBfTj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLm1ha2VFbE9wdGlvbj1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPW4uYXhpcyxhPW8uZ3JpZCxzPWkuZ2V0KCJ0eXBlIiksbD1iTihhLG8pLmdldE90aGVyQXhpcyhvKS5nZXRHbG9iYWxFeHRlbnQoKSx1PW8udG9HbG9iYWxDb29yZChvLmRhdGFUb0Nvb3JkKGUsITApKTtpZihzJiYibm9uZSIhPT1zKXt2YXIgaD1wTihpKSxjPXdOW3NdKG8sdSxsKTtjLnN0eWxlPWgsdC5ncmFwaGljS2V5PWMudHlwZSx0LnBvaW50ZXI9Y315TihlLHQsaUkoYS5tb2RlbCxuKSxuLGkscil9LGUucHJvdG90eXBlLmdldEhhbmRsZVRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIGk9aUkoZS5heGlzLmdyaWQubW9kZWwsZSx7bGFiZWxJbnNpZGU6ITF9KTtpLmxhYmVsTWFyZ2luPW4uZ2V0KFsiaGFuZGxlIiwibWFyZ2luIl0pO3ZhciByPWdOKGUuYXhpcyx0LGkpO3JldHVybnt4OnJbMF0seTpyWzFdLHJvdGF0aW9uOmkucm90YXRpb24rKGkubGFiZWxEaXJlY3Rpb248MD9NYXRoLlBJOjApfX0sZS5wcm90b3R5cGUudXBkYXRlSGFuZGxlVHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uYXhpcyxvPXIuZ3JpZCxhPXIuZ2V0R2xvYmFsRXh0ZW50KCEwKSxzPWJOKG8scikuZ2V0T3RoZXJBeGlzKHIpLmdldEdsb2JhbEV4dGVudCgpLGw9IngiPT09ci5kaW0/MDoxLHU9W3QueCx0LnldO3VbbF0rPWVbbF0sdVtsXT1NYXRoLm1pbihhWzFdLHVbbF0pLHVbbF09TWF0aC5tYXgoYVswXSx1W2xdKTt2YXIgaD0oc1sxXStzWzBdKS8yLGM9W2gsaF07Y1tsXT11W2xdO3JldHVybnt4OnVbMF0seTp1WzFdLHJvdGF0aW9uOnQucm90YXRpb24sY3Vyc29yUG9pbnQ6Yyx0b29sdGlwT3B0aW9uOlt7dmVydGljYWxBbGlnbjoibWlkZGxlIn0se2FsaWduOiJjZW50ZXIifV1bbF19fSxlfShhTik7ZnVuY3Rpb24gYk4odCxlKXt2YXIgbj17fTtyZXR1cm4gbltlLmRpbSsiQXhpc0luZGV4Il09ZS5pbmRleCx0LmdldENhcnRlc2lhbihuKX12YXIgd049e2xpbmU6ZnVuY3Rpb24odCxlLG4pe3JldHVybnt0eXBlOiJMaW5lIixzdWJQaXhlbE9wdGltaXplOiEwLHNoYXBlOnZOKFtlLG5bMF1dLFtlLG5bMV1dLFNOKHQpKX19LHNoYWRvdzpmdW5jdGlvbih0LGUsbil7dmFyIGk9TWF0aC5tYXgoMSx0LmdldEJhbmRXaWR0aCgpKSxyPW5bMV0tblswXTtyZXR1cm57dHlwZToiUmVjdCIsc2hhcGU6bU4oW2UtaS8yLG5bMF1dLFtpLHJdLFNOKHQpKX19fTtmdW5jdGlvbiBTTih0KXtyZXR1cm4ieCI9PT10LmRpbT8wOjF9dmFyIE1OPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUudHlwZT0iYXhpc1BvaW50ZXIiLGUuZGVmYXVsdE9wdGlvbj17c2hvdzoiYXV0byIsejo1MCx0eXBlOiJsaW5lIixzbmFwOiExLHRyaWdnZXJUb29sdGlwOiEwLHRyaWdnZXJFbXBoYXNpczohMCx2YWx1ZTpudWxsLHN0YXR1czpudWxsLGxpbms6W10sYW5pbWF0aW9uOm51bGwsYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6MjAwLGxpbmVTdHlsZTp7Y29sb3I6IiNCOUJFQzkiLHdpZHRoOjEsdHlwZToiZGFzaGVkIn0sc2hhZG93U3R5bGU6e2NvbG9yOiJyZ2JhKDIxMCwyMTksMjM4LDAuMikifSxsYWJlbDp7c2hvdzohMCxmb3JtYXR0ZXI6bnVsbCxwcmVjaXNpb246ImF1dG8iLG1hcmdpbjozLGNvbG9yOiIjZmZmIixwYWRkaW5nOls1LDcsNSw3XSxiYWNrZ3JvdW5kQ29sb3I6ImF1dG8iLGJvcmRlckNvbG9yOm51bGwsYm9yZGVyV2lkdGg6MCxib3JkZXJSYWRpdXM6M30saGFuZGxlOntzaG93OiExLGljb246Ik0xMC43LDExLjl2LTEuM0g5LjN2MS4zYy00LjksMC4zLTguOCw0LjQtOC44LDkuNGMwLDUsMy45LDkuMSw4LjgsOS40aDEuM2M0LjktMC4zLDguOC00LjQsOC44LTkuNEMxOS41LDE2LjMsMTUuNiwxMi4yLDEwLjcsMTEuOXogTTEzLjMsMjQuNEg2Ljd2LTEuMmg2LjZ6IE0xMy4zLDIySDYuN3YtMS4yaDYuNnogTTEzLjMsMTkuNkg2Ljd2LTEuMmg2LjZ6IixzaXplOjQ1LG1hcmdpbjo1MCxjb2xvcjoiIzMzMyIsc2hhZG93Qmx1cjozLHNoYWRvd0NvbG9yOiIjYWFhIixzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WToyLHRocm90dGxlOjQwfX0sZX0oenApLElOPVZvKCksVE49RTtmdW5jdGlvbiBDTih0LGUsbil7aWYoIXIubm9kZSl7dmFyIGk9ZS5nZXRacigpO0lOKGkpLnJlY29yZHN8fChJTihpKS5yZWNvcmRzPXt9KSxmdW5jdGlvbih0LGUpe2lmKElOKHQpLmluaXRpYWxpemVkKXJldHVybjtmdW5jdGlvbiBuKG4saSl7dC5vbihuLChmdW5jdGlvbihuKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT17c2hvd1RpcDpbXSxoaWRlVGlwOltdfSxuPWZ1bmN0aW9uKGkpe3ZhciByPWVbaS50eXBlXTtyP3IucHVzaChpKTooaS5kaXNwYXRjaEFjdGlvbj1uLHQuZGlzcGF0Y2hBY3Rpb24oaSkpfTtyZXR1cm57ZGlzcGF0Y2hBY3Rpb246bixwZW5kaW5nczplfX0oZSk7VE4oSU4odCkucmVjb3JkcywoZnVuY3Rpb24odCl7dCYmaSh0LG4sci5kaXNwYXRjaEFjdGlvbil9KSksZnVuY3Rpb24odCxlKXt2YXIgbixpPXQuc2hvd1RpcC5sZW5ndGgscj10LmhpZGVUaXAubGVuZ3RoO2k/bj10LnNob3dUaXBbaS0xXTpyJiYobj10LmhpZGVUaXBbci0xXSk7biYmKG4uZGlzcGF0Y2hBY3Rpb249bnVsbCxlLmRpc3BhdGNoQWN0aW9uKG4pKX0oci5wZW5kaW5ncyxlKX0pKX1JTih0KS5pbml0aWFsaXplZD0hMCxuKCJjbGljayIsSChBTiwiY2xpY2siKSksbigibW91c2Vtb3ZlIixIKEFOLCJtb3VzZW1vdmUiKSksbigiZ2xvYmFsb3V0IixETil9KGksZSksKElOKGkpLnJlY29yZHNbdF18fChJTihpKS5yZWNvcmRzW3RdPXt9KSkuaGFuZGxlcj1ufX1mdW5jdGlvbiBETih0LGUsbil7dC5oYW5kbGVyKCJsZWF2ZSIsbnVsbCxuKX1mdW5jdGlvbiBBTih0LGUsbixpKXtlLmhhbmRsZXIodCxuLGkpfWZ1bmN0aW9uIGtOKHQsZSl7aWYoIXIubm9kZSl7dmFyIG49ZS5nZXRacigpOyhJTihuKS5yZWNvcmRzfHx7fSlbdF0mJihJTihuKS5yZWNvcmRzW3RdPW51bGwpfX12YXIgTE49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lLmdldENvbXBvbmVudCgidG9vbHRpcCIpLHI9dC5nZXQoInRyaWdnZXJPbiIpfHxpJiZpLmdldCgidHJpZ2dlck9uIil8fCJtb3VzZW1vdmV8Y2xpY2siO0NOKCJheGlzUG9pbnRlciIsbiwoZnVuY3Rpb24odCxlLG4peyJub25lIiE9PXImJigibGVhdmUiPT09dHx8ci5pbmRleE9mKHQpPj0wKSYmbih7dHlwZToidXBkYXRlQXhpc1BvaW50ZXIiLGN1cnJUcmlnZ2VyOnQseDplJiZlLm9mZnNldFgseTplJiZlLm9mZnNldFl9KX0pKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7a04oImF4aXNQb2ludGVyIixlKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbih0LGUpe2tOKCJheGlzUG9pbnRlciIsZSl9LGUudHlwZT0iYXhpc1BvaW50ZXIiLGV9KEFnKTtmdW5jdGlvbiBQTih0LGUpe3ZhciBuLGk9W10scj10LnNlcmllc0luZGV4O2lmKG51bGw9PXJ8fCEobj1lLmdldFNlcmllc0J5SW5kZXgocikpKXJldHVybntwb2ludDpbXX07dmFyIG89bi5nZXREYXRhKCksYT16byhvLHQpO2lmKG51bGw9PWF8fGE8MHx8WShhKSlyZXR1cm57cG9pbnQ6W119O3ZhciBzPW8uZ2V0SXRlbUdyYXBoaWNFbChhKSxsPW4uY29vcmRpbmF0ZVN5c3RlbTtpZihuLmdldFRvb2x0aXBQb3NpdGlvbilpPW4uZ2V0VG9vbHRpcFBvc2l0aW9uKGEpfHxbXTtlbHNlIGlmKGwmJmwuZGF0YVRvUG9pbnQpaWYodC5pc1N0YWNrZWQpe3ZhciB1PWwuZ2V0QmFzZUF4aXMoKSxoPWwuZ2V0T3RoZXJBeGlzKHUpLmRpbSxjPXUuZGltLHA9IngiPT09aHx8InJhZGl1cyI9PT1oPzE6MCxkPW8ubWFwRGltZW5zaW9uKGMpLGY9W107ZltwXT1vLmdldChkLGEpLGZbMS1wXT1vLmdldChvLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tSZXN1bHREaW1lbnNpb24iKSxhKSxpPWwuZGF0YVRvUG9pbnQoZil8fFtdfWVsc2UgaT1sLmRhdGFUb1BvaW50KG8uZ2V0VmFsdWVzKHoobC5kaW1lbnNpb25zLChmdW5jdGlvbih0KXtyZXR1cm4gby5tYXBEaW1lbnNpb24odCl9KSksYSkpfHxbXTtlbHNlIGlmKHMpe3ZhciBnPXMuZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKTtnLmFwcGx5VHJhbnNmb3JtKHMudHJhbnNmb3JtKSxpPVtnLngrZy53aWR0aC8yLGcueStnLmhlaWdodC8yXX1yZXR1cm57cG9pbnQ6aSxlbDpzfX12YXIgT049Vm8oKTtmdW5jdGlvbiBSTih0LGUsbil7dmFyIGk9dC5jdXJyVHJpZ2dlcixyPVt0LngsdC55XSxvPXQsYT10LmRpc3BhdGNoQWN0aW9ufHxXKG4uZGlzcGF0Y2hBY3Rpb24sbikscz1lLmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKS5jb29yZFN5c0F4ZXNJbmZvO2lmKHMpe0JOKHIpJiYocj1QTih7c2VyaWVzSW5kZXg6by5zZXJpZXNJbmRleCxkYXRhSW5kZXg6by5kYXRhSW5kZXh9LGUpLnBvaW50KTt2YXIgbD1CTihyKSx1PW8uYXhlc0luZm8saD1zLmF4ZXNJbmZvLGM9ImxlYXZlIj09PWl8fEJOKHIpLHA9e30sZD17fSxmPXtsaXN0OltdLG1hcDp7fX0sZz17c2hvd1BvaW50ZXI6SChFTixkKSxzaG93VG9vbHRpcDpIKHpOLGYpfTtFKHMuY29vcmRTeXNNYXAsKGZ1bmN0aW9uKHQsZSl7dmFyIG49bHx8dC5jb250YWluUG9pbnQocik7RShzLmNvb3JkU3lzQXhlc0luZm9bZV0sKGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5heGlzLG89ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPCh0fHxbXSkubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtpZihlLmF4aXMuZGltPT09aS5heGlzRGltJiZlLmF4aXMubW9kZWwuY29tcG9uZW50SW5kZXg9PT1pLmF4aXNJbmRleClyZXR1cm4gaX19KHUsdCk7aWYoIWMmJm4mJighdXx8bykpe3ZhciBhPW8mJm8udmFsdWU7bnVsbCE9YXx8bHx8KGE9aS5wb2ludFRvRGF0YShyKSksbnVsbCE9YSYmTk4odCxhLGcsITEscCl9fSkpfSkpO3ZhciB5PXt9O3JldHVybiBFKGgsKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5saW5rR3JvdXA7biYmIWRbZV0mJkUobi5heGVzSW5mbywoZnVuY3Rpb24oZSxpKXt2YXIgcj1kW2ldO2lmKGUhPT10JiZyKXt2YXIgbz1yLnZhbHVlO24ubWFwcGVyJiYobz10LmF4aXMuc2NhbGUucGFyc2Uobi5tYXBwZXIobyxWTihlKSxWTih0KSkpKSx5W3Qua2V5XT1vfX0pKX0pKSxFKHksKGZ1bmN0aW9uKHQsZSl7Tk4oaFtlXSx0LGcsITAscCl9KSksZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4uYXhlc0luZm89W107RShlLChmdW5jdGlvbihlLG4pe3ZhciByPWUuYXhpc1BvaW50ZXJNb2RlbC5vcHRpb24sbz10W25dO28/KCFlLnVzZUhhbmRsZSYmKHIuc3RhdHVzPSJzaG93Iiksci52YWx1ZT1vLnZhbHVlLHIuc2VyaWVzRGF0YUluZGljZXM9KG8ucGF5bG9hZEJhdGNofHxbXSkuc2xpY2UoKSk6IWUudXNlSGFuZGxlJiYoci5zdGF0dXM9ImhpZGUiKSwic2hvdyI9PT1yLnN0YXR1cyYmaS5wdXNoKHtheGlzRGltOmUuYXhpcy5kaW0sYXhpc0luZGV4OmUuYXhpcy5tb2RlbC5jb21wb25lbnRJbmRleCx2YWx1ZTpyLnZhbHVlfSl9KSl9KGQsaCxwKSxmdW5jdGlvbih0LGUsbixpKXtpZihCTihlKXx8IXQubGlzdC5sZW5ndGgpcmV0dXJuIHZvaWQgaSh7dHlwZToiaGlkZVRpcCJ9KTt2YXIgcj0oKHQubGlzdFswXS5kYXRhQnlBeGlzWzBdfHx7fSkuc2VyaWVzRGF0YUluZGljZXN8fFtdKVswXXx8e307aSh7dHlwZToic2hvd1RpcCIsZXNjYXBlQ29ubmVjdDohMCx4OmVbMF0seTplWzFdLHRvb2x0aXBPcHRpb246bi50b29sdGlwT3B0aW9uLHBvc2l0aW9uOm4ucG9zaXRpb24sZGF0YUluZGV4SW5zaWRlOnIuZGF0YUluZGV4SW5zaWRlLGRhdGFJbmRleDpyLmRhdGFJbmRleCxzZXJpZXNJbmRleDpyLnNlcmllc0luZGV4LGRhdGFCeUNvb3JkU3lzOnQubGlzdH0pfShmLHIsdCxhKSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bi5nZXRacigpLHI9ImF4aXNQb2ludGVyTGFzdEhpZ2hsaWdodHMiLG89T04oaSlbcl18fHt9LGE9T04oaSlbcl09e307RSh0LChmdW5jdGlvbih0LGUpe3ZhciBuPXQuYXhpc1BvaW50ZXJNb2RlbC5vcHRpb247InNob3ciPT09bi5zdGF0dXMmJnQudHJpZ2dlckVtcGhhc2lzJiZFKG4uc2VyaWVzRGF0YUluZGljZXMsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuc2VyaWVzSW5kZXgrIiB8ICIrdC5kYXRhSW5kZXg7YVtlXT10fSkpfSkpO3ZhciBzPVtdLGw9W107RShvLChmdW5jdGlvbih0LGUpeyFhW2VdJiZsLnB1c2godCl9KSksRShhLChmdW5jdGlvbih0LGUpeyFvW2VdJiZzLnB1c2godCl9KSksbC5sZW5ndGgmJm4uZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImRvd25wbGF5Iixlc2NhcGVDb25uZWN0OiEwLG5vdEJsdXI6ITAsYmF0Y2g6bH0pLHMubGVuZ3RoJiZuLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJoaWdobGlnaHQiLGVzY2FwZUNvbm5lY3Q6ITAsbm90Qmx1cjohMCxiYXRjaDpzfSl9KGgsMCxuKSxwfX1mdW5jdGlvbiBOTih0LGUsbixpLHIpe3ZhciBvPXQuYXhpcztpZighby5zY2FsZS5pc0JsYW5rKCkmJm8uY29udGFpbkRhdGEoZSkpaWYodC5pbnZvbHZlU2VyaWVzKXt2YXIgYT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuYXhpcyxpPW4uZGltLHI9dCxvPVtdLGE9TnVtYmVyLk1BWF9WQUxVRSxzPS0xO3JldHVybiBFKGUuc2VyaWVzTW9kZWxzLChmdW5jdGlvbihlLGwpe3ZhciB1LGgsYz1lLmdldERhdGEoKS5tYXBEaW1lbnNpb25zQWxsKGkpO2lmKGUuZ2V0QXhpc1Rvb2x0aXBEYXRhKXt2YXIgcD1lLmdldEF4aXNUb29sdGlwRGF0YShjLHQsbik7aD1wLmRhdGFJbmRpY2VzLHU9cC5uZXN0ZXN0VmFsdWV9ZWxzZXtpZighKGg9ZS5nZXREYXRhKCkuaW5kaWNlc09mTmVhcmVzdChjWzBdLHQsImNhdGVnb3J5Ij09PW4udHlwZT8uNTpudWxsKSkubGVuZ3RoKXJldHVybjt1PWUuZ2V0RGF0YSgpLmdldChjWzBdLGhbMF0pfWlmKG51bGwhPXUmJmlzRmluaXRlKHUpKXt2YXIgZD10LXUsZj1NYXRoLmFicyhkKTtmPD1hJiYoKGY8YXx8ZD49MCYmczwwKSYmKGE9ZixzPWQscj11LG8ubGVuZ3RoPTApLEUoaCwoZnVuY3Rpb24odCl7by5wdXNoKHtzZXJpZXNJbmRleDplLnNlcmllc0luZGV4LGRhdGFJbmRleEluc2lkZTp0LGRhdGFJbmRleDplLmdldERhdGEoKS5nZXRSYXdJbmRleCh0KX0pfSkpKX19KSkse3BheWxvYWRCYXRjaDpvLHNuYXBUb1ZhbHVlOnJ9fShlLHQpLHM9YS5wYXlsb2FkQmF0Y2gsbD1hLnNuYXBUb1ZhbHVlO3NbMF0mJm51bGw9PXIuc2VyaWVzSW5kZXgmJkEocixzWzBdKSwhaSYmdC5zbmFwJiZvLmNvbnRhaW5EYXRhKGwpJiZudWxsIT1sJiYoZT1sKSxuLnNob3dQb2ludGVyKHQsZSxzKSxuLnNob3dUb29sdGlwKHQsYSxsKX1lbHNlIG4uc2hvd1BvaW50ZXIodCxlKX1mdW5jdGlvbiBFTih0LGUsbixpKXt0W2Uua2V5XT17dmFsdWU6bixwYXlsb2FkQmF0Y2g6aX19ZnVuY3Rpb24gek4odCxlLG4saSl7dmFyIHI9bi5wYXlsb2FkQmF0Y2gsbz1lLmF4aXMsYT1vLm1vZGVsLHM9ZS5heGlzUG9pbnRlck1vZGVsO2lmKGUudHJpZ2dlclRvb2x0aXAmJnIubGVuZ3RoKXt2YXIgbD1lLmNvb3JkU3lzLm1vZGVsLHU9TUkobCksaD10Lm1hcFt1XTtofHwoaD10Lm1hcFt1XT17Y29vcmRTeXNJZDpsLmlkLGNvb3JkU3lzSW5kZXg6bC5jb21wb25lbnRJbmRleCxjb29yZFN5c1R5cGU6bC50eXBlLGNvb3JkU3lzTWFpblR5cGU6bC5tYWluVHlwZSxkYXRhQnlBeGlzOltdfSx0Lmxpc3QucHVzaChoKSksaC5kYXRhQnlBeGlzLnB1c2goe2F4aXNEaW06by5kaW0sYXhpc0luZGV4OmEuY29tcG9uZW50SW5kZXgsYXhpc1R5cGU6YS50eXBlLGF4aXNJZDphLmlkLHZhbHVlOmksdmFsdWVMYWJlbE9wdDp7cHJlY2lzaW9uOnMuZ2V0KFsibGFiZWwiLCJwcmVjaXNpb24iXSksZm9ybWF0dGVyOnMuZ2V0KFsibGFiZWwiLCJmb3JtYXR0ZXIiXSl9LHNlcmllc0RhdGFJbmRpY2VzOnIuc2xpY2UoKX0pfX1mdW5jdGlvbiBWTih0KXt2YXIgZT10LmF4aXMubW9kZWwsbj17fSxpPW4uYXhpc0RpbT10LmF4aXMuZGltO3JldHVybiBuLmF4aXNJbmRleD1uW2krIkF4aXNJbmRleCJdPWUuY29tcG9uZW50SW5kZXgsbi5heGlzTmFtZT1uW2krIkF4aXNOYW1lIl09ZS5uYW1lLG4uYXhpc0lkPW5baSsiQXhpc0lkIl09ZS5pZCxufWZ1bmN0aW9uIEJOKHQpe3JldHVybiF0fHxudWxsPT10WzBdfHxpc05hTih0WzBdKXx8bnVsbD09dFsxXXx8aXNOYU4odFsxXSl9ZnVuY3Rpb24gRk4odCl7VEkucmVnaXN0ZXJBeGlzUG9pbnRlckNsYXNzKCJDYXJ0ZXNpYW5BeGlzUG9pbnRlciIsX04pLHQucmVnaXN0ZXJDb21wb25lbnRNb2RlbChNTiksdC5yZWdpc3RlckNvbXBvbmVudFZpZXcoTE4pLHQucmVnaXN0ZXJQcmVwcm9jZXNzb3IoKGZ1bmN0aW9uKHQpe2lmKHQpeyghdC5heGlzUG9pbnRlcnx8MD09PXQuYXhpc1BvaW50ZXIubGVuZ3RoKSYmKHQuYXhpc1BvaW50ZXI9e30pO3ZhciBlPXQuYXhpc1BvaW50ZXIubGluaztlJiYhWShlKSYmKHQuYXhpc1BvaW50ZXIubGluaz1bZV0pfX0pKSx0LnJlZ2lzdGVyUHJvY2Vzc29yKHQuUFJJT1JJVFkuUFJPQ0VTU09SLlNUQVRJU1RJQywoZnVuY3Rpb24odCxlKXt0LmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKS5jb29yZFN5c0F4ZXNJbmZvPXhJKHQsZSl9KSksdC5yZWdpc3RlckFjdGlvbih7dHlwZToidXBkYXRlQXhpc1BvaW50ZXIiLGV2ZW50OiJ1cGRhdGVBeGlzUG9pbnRlciIsdXBkYXRlOiI6dXBkYXRlQXhpc1BvaW50ZXIifSxSTil9dmFyIEdOPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUubWFrZUVsT3B0aW9uPWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89bi5heGlzOyJhbmdsZSI9PT1vLmRpbSYmKHRoaXMuYW5pbWF0aW9uVGhyZXNob2xkPU1hdGguUEkvMTgpO3ZhciBhPW8ucG9sYXIscz1hLmdldE90aGVyQXhpcyhvKS5nZXRFeHRlbnQoKSxsPW8uZGF0YVRvQ29vcmQoZSksdT1pLmdldCgidHlwZSIpO2lmKHUmJiJub25lIiE9PXUpe3ZhciBoPXBOKGkpLGM9V05bdV0obyxhLGwscyk7Yy5zdHlsZT1oLHQuZ3JhcGhpY0tleT1jLnR5cGUsdC5wb2ludGVyPWN9dmFyIHA9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz1lLmF4aXMsYT1vLmRhdGFUb0Nvb3JkKHQpLHM9aS5nZXRBbmdsZUF4aXMoKS5nZXRFeHRlbnQoKVswXTtzPXMvMTgwKk1hdGguUEk7dmFyIGwsdSxoLGM9aS5nZXRSYWRpdXNBeGlzKCkuZ2V0RXh0ZW50KCk7aWYoInJhZGl1cyI9PT1vLmRpbSl7dmFyIHA9WzEsMCwwLDEsMCwwXTtTZShwLHAscyksd2UocCxwLFtpLmN4LGkuY3ldKSxsPUZoKFthLC1yXSxwKTt2YXIgZD1lLmdldE1vZGVsKCJheGlzTGFiZWwiKS5nZXQoInJvdGF0ZSIpfHwwLGY9ZEkuaW5uZXJUZXh0TGF5b3V0KHMsZCpNYXRoLlBJLzE4MCwtMSk7dT1mLnRleHRBbGlnbixoPWYudGV4dFZlcnRpY2FsQWxpZ259ZWxzZXt2YXIgZz1jWzFdO2w9aS5jb29yZFRvUG9pbnQoW2crcixhXSk7dmFyIHk9aS5jeCx2PWkuY3k7dT1NYXRoLmFicyhsWzBdLXkpL2c8LjM/ImNlbnRlciI6bFswXT55PyJsZWZ0IjoicmlnaHQiLGg9TWF0aC5hYnMobFsxXS12KS9nPC4zPyJtaWRkbGUiOmxbMV0+dj8idG9wIjoiYm90dG9tIn1yZXR1cm57cG9zaXRpb246bCxhbGlnbjp1LHZlcnRpY2FsQWxpZ246aH19KGUsbiwwLGEsaS5nZXQoWyJsYWJlbCIsIm1hcmdpbiJdKSk7ZE4odCxuLGkscixwKX0sZX0oYU4pO3ZhciBXTj17bGluZTpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4iYW5nbGUiPT09dC5kaW0/e3R5cGU6IkxpbmUiLHNoYXBlOnZOKGUuY29vcmRUb1BvaW50KFtpWzBdLG5dKSxlLmNvb3JkVG9Qb2ludChbaVsxXSxuXSkpfTp7dHlwZToiQ2lyY2xlIixzaGFwZTp7Y3g6ZS5jeCxjeTplLmN5LHI6bn19fSxzaGFkb3c6ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9TWF0aC5tYXgoMSx0LmdldEJhbmRXaWR0aCgpKSxvPU1hdGguUEkvMTgwO3JldHVybiJhbmdsZSI9PT10LmRpbT97dHlwZToiU2VjdG9yIixzaGFwZTp4TihlLmN4LGUuY3ksaVswXSxpWzFdLCgtbi1yLzIpKm8sKHIvMi1uKSpvKX06e3R5cGU6IlNlY3RvciIsc2hhcGU6eE4oZS5jeCxlLmN5LG4tci8yLG4rci8yLDAsMipNYXRoLlBJKX19fSxITj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5maW5kQXhpc01vZGVsPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzLmVjTW9kZWwuZWFjaENvbXBvbmVudCh0LChmdW5jdGlvbih0KXt0LmdldENvb3JkU3lzTW9kZWwoKT09PXRoaXMmJihlPXQpfSksdGhpcyksZX0sZS50eXBlPSJwb2xhciIsZS5kZXBlbmRlbmNpZXM9WyJyYWRpdXNBeGlzIiwiYW5nbGVBeGlzIl0sZS5kZWZhdWx0T3B0aW9uPXt6OjAsY2VudGVyOlsiNTAlIiwiNTAlIl0scmFkaXVzOiI4MCUifSxlfSh6cCksWU49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5nZXRDb29yZFN5c01vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygicG9sYXIiLFdvKS5tb2RlbHNbMF19LGUudHlwZT0icG9sYXJBeGlzIixlfSh6cCk7UihZTixEXyk7dmFyIFhOPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUudHlwZT0iYW5nbGVBeGlzIixlfShZTiksVU49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS50eXBlPSJyYWRpdXNBeGlzIixlfShZTiksWk49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiB0LmNhbGwodGhpcywicmFkaXVzIixlLG4pfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wb2xhci5wb2ludFRvRGF0YSh0LGUpWyJyYWRpdXMiPT09dGhpcy5kaW0/MDoxXX0sZX0oYWIpO1pOLnByb3RvdHlwZS5kYXRhVG9SYWRpdXM9YWIucHJvdG90eXBlLmRhdGFUb0Nvb3JkLFpOLnByb3RvdHlwZS5yYWRpdXNUb0RhdGE9YWIucHJvdG90eXBlLmNvb3JkVG9EYXRhO3ZhciBqTj1WbygpLHFOPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gdC5jYWxsKHRoaXMsImFuZ2xlIixlLG58fFswLDM2MF0pfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wb2xhci5wb2ludFRvRGF0YSh0LGUpWyJyYWRpdXMiPT09dGhpcy5kaW0/MDoxXX0sZS5wcm90b3R5cGUuY2FsY3VsYXRlQ2F0ZWdvcnlJbnRlcnZhbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LmdldExhYmVsTW9kZWwoKSxuPXQuc2NhbGUsaT1uLmdldEV4dGVudCgpLHI9bi5jb3VudCgpO2lmKGlbMV0taVswXTwxKXJldHVybiAwO3ZhciBvPWlbMF0sYT10LmRhdGFUb0Nvb3JkKG8rMSktdC5kYXRhVG9Db29yZChvKSxzPU1hdGguYWJzKGEpLGw9U3IobnVsbD09bz8iIjpvKyIiLGUuZ2V0Rm9udCgpLCJjZW50ZXIiLCJ0b3AiKSx1PU1hdGgubWF4KGwuaGVpZ2h0LDcpL3M7aXNOYU4odSkmJih1PTEvMCk7dmFyIGg9TWF0aC5tYXgoMCxNYXRoLmZsb29yKHUpKSxjPWpOKHQubW9kZWwpLHA9Yy5sYXN0QXV0b0ludGVydmFsLGQ9Yy5sYXN0VGlja0NvdW50O3JldHVybiBudWxsIT1wJiZudWxsIT1kJiZNYXRoLmFicyhwLWgpPD0xJiZNYXRoLmFicyhkLXIpPD0xJiZwPmg/aD1wOihjLmxhc3RUaWNrQ291bnQ9cixjLmxhc3RBdXRvSW50ZXJ2YWw9aCksaH0sZX0oYWIpO3FOLnByb3RvdHlwZS5kYXRhVG9BbmdsZT1hYi5wcm90b3R5cGUuZGF0YVRvQ29vcmQscU4ucHJvdG90eXBlLmFuZ2xlVG9EYXRhPWFiLnByb3RvdHlwZS5jb29yZFRvRGF0YTt2YXIgS049WyJyYWRpdXMiLCJhbmdsZSJdLCROPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmRpbWVuc2lvbnM9S04sdGhpcy50eXBlPSJwb2xhciIsdGhpcy5jeD0wLHRoaXMuY3k9MCx0aGlzLl9yYWRpdXNBeGlzPW5ldyBaTix0aGlzLl9hbmdsZUF4aXM9bmV3IHFOLHRoaXMuYXhpc1BvaW50ZXJFbmFibGVkPSEwLHRoaXMubmFtZT10fHwiIix0aGlzLl9yYWRpdXNBeGlzLnBvbGFyPXRoaXMuX2FuZ2xlQXhpcy5wb2xhcj10aGlzfXJldHVybiB0LnByb3RvdHlwZS5jb250YWluUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wb2ludFRvQ29vcmQodCk7cmV0dXJuIHRoaXMuX3JhZGl1c0F4aXMuY29udGFpbihlWzBdKSYmdGhpcy5fYW5nbGVBeGlzLmNvbnRhaW4oZVsxXSl9LHQucHJvdG90eXBlLmNvbnRhaW5EYXRhPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXNBeGlzLmNvbnRhaW5EYXRhKHRbMF0pJiZ0aGlzLl9hbmdsZUF4aXMuY29udGFpbkRhdGEodFsxXSl9LHQucHJvdG90eXBlLmdldEF4aXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIl8iK3QrIkF4aXMiXX0sdC5wcm90b3R5cGUuZ2V0QXhlcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLl9yYWRpdXNBeGlzLHRoaXMuX2FuZ2xlQXhpc119LHQucHJvdG90eXBlLmdldEF4ZXNCeVNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49dGhpcy5fYW5nbGVBeGlzLGk9dGhpcy5fcmFkaXVzQXhpcztyZXR1cm4gbi5zY2FsZS50eXBlPT09dCYmZS5wdXNoKG4pLGkuc2NhbGUudHlwZT09PXQmJmUucHVzaChpKSxlfSx0LnByb3RvdHlwZS5nZXRBbmdsZUF4aXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5nbGVBeGlzfSx0LnByb3RvdHlwZS5nZXRSYWRpdXNBeGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGl1c0F4aXN9LHQucHJvdG90eXBlLmdldE90aGVyQXhpcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9hbmdsZUF4aXM7cmV0dXJuIHQ9PT1lP3RoaXMuX3JhZGl1c0F4aXM6ZX0sdC5wcm90b3R5cGUuZ2V0QmFzZUF4aXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBeGVzQnlTY2FsZSgib3JkaW5hbCIpWzBdfHx0aGlzLmdldEF4ZXNCeVNjYWxlKCJ0aW1lIilbMF18fHRoaXMuZ2V0QW5nbGVBeGlzKCl9LHQucHJvdG90eXBlLmdldFRvb2x0aXBBeGVzPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGwhPXQmJiJhdXRvIiE9PXQ/dGhpcy5nZXRBeGlzKHQpOnRoaXMuZ2V0QmFzZUF4aXMoKTtyZXR1cm57YmFzZUF4ZXM6W2VdLG90aGVyQXhlczpbdGhpcy5nZXRPdGhlckF4aXMoZSldfX0sdC5wcm90b3R5cGUuZGF0YVRvUG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb29yZFRvUG9pbnQoW3RoaXMuX3JhZGl1c0F4aXMuZGF0YVRvUmFkaXVzKHRbMF0sZSksdGhpcy5fYW5nbGVBeGlzLmRhdGFUb0FuZ2xlKHRbMV0sZSldKX0sdC5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnBvaW50VG9Db29yZCh0KTtyZXR1cm5bdGhpcy5fcmFkaXVzQXhpcy5yYWRpdXNUb0RhdGEoblswXSxlKSx0aGlzLl9hbmdsZUF4aXMuYW5nbGVUb0RhdGEoblsxXSxlKV19LHQucHJvdG90eXBlLnBvaW50VG9Db29yZD1mdW5jdGlvbih0KXt2YXIgZT10WzBdLXRoaXMuY3gsbj10WzFdLXRoaXMuY3ksaT10aGlzLmdldEFuZ2xlQXhpcygpLHI9aS5nZXRFeHRlbnQoKSxvPU1hdGgubWluKHJbMF0sclsxXSksYT1NYXRoLm1heChyWzBdLHJbMV0pO2kuaW52ZXJzZT9vPWEtMzYwOmE9byszNjA7dmFyIHM9TWF0aC5zcXJ0KGUqZStuKm4pO2UvPXMsbi89cztmb3IodmFyIGw9TWF0aC5hdGFuMigtbixlKS9NYXRoLlBJKjE4MCx1PWw8bz8xOi0xO2w8b3x8bD5hOylsKz0zNjAqdTtyZXR1cm5bcyxsXX0sdC5wcm90b3R5cGUuY29vcmRUb1BvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0sbj10WzFdLzE4MCpNYXRoLlBJO3JldHVybltNYXRoLmNvcyhuKSplK3RoaXMuY3gsLU1hdGguc2luKG4pKmUrdGhpcy5jeV19LHQucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEFuZ2xlQXhpcygpLGU9dGhpcy5nZXRSYWRpdXNBeGlzKCkuZ2V0RXh0ZW50KCkuc2xpY2UoKTtlWzBdPmVbMV0mJmUucmV2ZXJzZSgpO3ZhciBuPXQuZ2V0RXh0ZW50KCksaT1NYXRoLlBJLzE4MDtyZXR1cm57Y3g6dGhpcy5jeCxjeTp0aGlzLmN5LHIwOmVbMF0scjplWzFdLHN0YXJ0QW5nbGU6LW5bMF0qaSxlbmRBbmdsZTotblsxXSppLGNsb2Nrd2lzZTp0LmludmVyc2UsY29udGFpbjpmdW5jdGlvbih0LGUpe3ZhciBuPXQtdGhpcy5jeCxpPWUtdGhpcy5jeSxyPW4qbitpKmktMWUtNCxvPXRoaXMucixhPXRoaXMucjA7cmV0dXJuIHI8PW8qbyYmcj49YSphfX19LHQucHJvdG90eXBlLmNvbnZlcnRUb1BpeGVsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gSk4oZSk9PT10aGlzP3RoaXMuZGF0YVRvUG9pbnQobik6bnVsbH0sdC5wcm90b3R5cGUuY29udmVydEZyb21QaXhlbD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIEpOKGUpPT09dGhpcz90aGlzLnBvaW50VG9EYXRhKG4pOm51bGx9LHR9KCk7ZnVuY3Rpb24gSk4odCl7dmFyIGU9dC5zZXJpZXNNb2RlbCxuPXQucG9sYXJNb2RlbDtyZXR1cm4gbiYmbi5jb29yZGluYXRlU3lzdGVtfHxlJiZlLmNvb3JkaW5hdGVTeXN0ZW19ZnVuY3Rpb24gUU4odCxlKXt2YXIgbj10aGlzLGk9bi5nZXRBbmdsZUF4aXMoKSxyPW4uZ2V0UmFkaXVzQXhpcygpO2lmKGkuc2NhbGUuc2V0RXh0ZW50KDEvMCwtMS8wKSxyLnNjYWxlLnNldEV4dGVudCgxLzAsLTEvMCksdC5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXtpZih0LmNvb3JkaW5hdGVTeXN0ZW09PT1uKXt2YXIgZT10LmdldERhdGEoKTtFKENfKGUsInJhZGl1cyIpLChmdW5jdGlvbih0KXtyLnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoZSx0KX0pKSxFKENfKGUsImFuZ2xlIiksKGZ1bmN0aW9uKHQpe2kuc2NhbGUudW5pb25FeHRlbnRGcm9tRGF0YShlLHQpfSkpfX0pKSxfXyhpLnNjYWxlLGkubW9kZWwpLF9fKHIuc2NhbGUsci5tb2RlbCksImNhdGVnb3J5Ij09PWkudHlwZSYmIWkub25CYW5kKXt2YXIgbz1pLmdldEV4dGVudCgpLGE9MzYwL2kuc2NhbGUuY291bnQoKTtpLmludmVyc2U/b1sxXSs9YTpvWzFdLT1hLGkuc2V0RXh0ZW50KG9bMF0sb1sxXSl9fWZ1bmN0aW9uIHRFKHQsZSl7dmFyIG47aWYodC50eXBlPWUuZ2V0KCJ0eXBlIiksdC5zY2FsZT1iXyhlKSx0Lm9uQmFuZD1lLmdldCgiYm91bmRhcnlHYXAiKSYmImNhdGVnb3J5Ij09PXQudHlwZSx0LmludmVyc2U9ZS5nZXQoImludmVyc2UiKSxmdW5jdGlvbih0KXtyZXR1cm4iYW5nbGVBeGlzIj09PXQubWFpblR5cGV9KGUpKXt0LmludmVyc2U9dC5pbnZlcnNlIT09ZS5nZXQoImNsb2Nrd2lzZSIpO3ZhciBpPWUuZ2V0KCJzdGFydEFuZ2xlIikscj1udWxsIT09KG49ZS5nZXQoImVuZEFuZ2xlIikpJiZ2b2lkIDAhPT1uP246aSsodC5pbnZlcnNlPy0zNjA6MzYwKTt0LnNldEV4dGVudChpLHIpfWUuYXhpcz10LHQubW9kZWw9ZX12YXIgZUU9e2RpbWVuc2lvbnM6S04sY3JlYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIHQuZWFjaENvbXBvbmVudCgicG9sYXIiLChmdW5jdGlvbih0LGkpe3ZhciByPW5ldyAkTihpKyIiKTtyLnVwZGF0ZT1RTjt2YXIgbz1yLmdldFJhZGl1c0F4aXMoKSxhPXIuZ2V0QW5nbGVBeGlzKCkscz10LmZpbmRBeGlzTW9kZWwoInJhZGl1c0F4aXMiKSxsPXQuZmluZEF4aXNNb2RlbCgiYW5nbGVBeGlzIik7dEUobyxzKSx0RShhLGwpLGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lLmdldCgiY2VudGVyIikscj1uLmdldFdpZHRoKCksbz1uLmdldEhlaWdodCgpO3QuY3g9JHIoaVswXSxyKSx0LmN5PSRyKGlbMV0sbyk7dmFyIGE9dC5nZXRSYWRpdXNBeGlzKCkscz1NYXRoLm1pbihyLG8pLzIsbD1lLmdldCgicmFkaXVzIik7bnVsbD09bD9sPVswLCIxMDAlIl06WShsKXx8KGw9WzAsbF0pO3ZhciB1PVskcihsWzBdLHMpLCRyKGxbMV0scyldO2EuaW52ZXJzZT9hLnNldEV4dGVudCh1WzFdLHVbMF0pOmEuc2V0RXh0ZW50KHVbMF0sdVsxXSl9KHIsdCxlKSxuLnB1c2gociksdC5jb29yZGluYXRlU3lzdGVtPXIsci5tb2RlbD10fSkpLHQuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7aWYoInBvbGFyIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikpe3ZhciBlPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygicG9sYXIiLFdvKS5tb2RlbHNbMF07MCx0LmNvb3JkaW5hdGVTeXN0ZW09ZS5jb29yZGluYXRlU3lzdGVtfX0pKSxufX0sbkU9WyJheGlzTGluZSIsImF4aXNMYWJlbCIsImF4aXNUaWNrIiwibWlub3JUaWNrIiwic3BsaXRMaW5lIiwibWlub3JTcGxpdExpbmUiLCJzcGxpdEFyZWEiXTtmdW5jdGlvbiBpRSh0LGUsbil7ZVsxXT5lWzBdJiYoZT1lLnNsaWNlKCkucmV2ZXJzZSgpKTt2YXIgaT10LmNvb3JkVG9Qb2ludChbZVswXSxuXSkscj10LmNvb3JkVG9Qb2ludChbZVsxXSxuXSk7cmV0dXJue3gxOmlbMF0seTE6aVsxXSx4MjpyWzBdLHkyOnJbMV19fWZ1bmN0aW9uIHJFKHQpe3JldHVybiB0LmdldFJhZGl1c0F4aXMoKS5pbnZlcnNlPzA6MX1mdW5jdGlvbiBvRSh0KXt2YXIgZT10WzBdLG49dFt0Lmxlbmd0aC0xXTtlJiZuJiZNYXRoLmFicyhNYXRoLmFicyhlLmNvb3JkLW4uY29vcmQpLTM2MCk8MWUtNCYmdC5wb3AoKX12YXIgYUU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmF4aXNQb2ludGVyQ2xhc3M9IlBvbGFyQXhpc1BvaW50ZXIiLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHQuZ2V0KCJzaG93Iikpe3ZhciBuPXQuYXhpcyxpPW4ucG9sYXIscj1pLmdldFJhZGl1c0F4aXMoKS5nZXRFeHRlbnQoKSxvPW4uZ2V0VGlja3NDb29yZHMoKSxhPW4uZ2V0TWlub3JUaWNrc0Nvb3JkcygpLHM9eihuLmdldFZpZXdMYWJlbHMoKSwoZnVuY3Rpb24odCl7dD1UKHQpO3ZhciBlPW4uc2NhbGUsaT0ib3JkaW5hbCI9PT1lLnR5cGU/ZS5nZXRSYXdPcmRpbmFsTnVtYmVyKHQudGlja1ZhbHVlKTp0LnRpY2tWYWx1ZTtyZXR1cm4gdC5jb29yZD1uLmRhdGFUb0Nvb3JkKGkpLHR9KSk7b0Uocyksb0UobyksRShuRSwoZnVuY3Rpb24oZSl7IXQuZ2V0KFtlLCJzaG93Il0pfHxuLnNjYWxlLmlzQmxhbmsoKSYmImF4aXNMaW5lIiE9PWV8fHNFW2VdKHRoaXMuZ3JvdXAsdCxpLG8sYSxyLHMpfSksdGhpcyl9fSxlLnR5cGU9ImFuZ2xlQXhpcyIsZX0oVEkpLHNFPXtheGlzTGluZTpmdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIGEscz1lLmdldE1vZGVsKFsiYXhpc0xpbmUiLCJsaW5lU3R5bGUiXSksbD1uLmdldEFuZ2xlQXhpcygpLHU9TWF0aC5QSS8xODAsaD1sLmdldEV4dGVudCgpLGM9ckUobikscD1jPzA6MSxkPTM2MD09PU1hdGguYWJzKGhbMV0taFswXSk/IkNpcmNsZSI6IkFyYyI7KGE9MD09PW9bcF0/bmV3IFFoW2RdKHtzaGFwZTp7Y3g6bi5jeCxjeTpuLmN5LHI6b1tjXSxzdGFydEFuZ2xlOi1oWzBdKnUsZW5kQW5nbGU6LWhbMV0qdSxjbG9ja3dpc2U6bC5pbnZlcnNlfSxzdHlsZTpzLmdldExpbmVTdHlsZSgpLHoyOjEsc2lsZW50OiEwfSk6bmV3IFd1KHtzaGFwZTp7Y3g6bi5jeCxjeTpuLmN5LHI6b1tjXSxyMDpvW3BdfSxzdHlsZTpzLmdldExpbmVTdHlsZSgpLHoyOjEsc2lsZW50OiEwfSkpLnN0eWxlLmZpbGw9bnVsbCx0LmFkZChhKX0sYXhpc1RpY2s6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPWUuZ2V0TW9kZWwoImF4aXNUaWNrIikscz0oYS5nZXQoImluc2lkZSIpPy0xOjEpKmEuZ2V0KCJsZW5ndGgiKSxsPW9bckUobildLHU9eihpLChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEt1KHtzaGFwZTppRShuLFtsLGwrc10sdC5jb29yZCl9KX0pKTt0LmFkZChOaCh1LHtzdHlsZTprKGEuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLHtzdHJva2U6ZS5nZXQoWyJheGlzTGluZSIsImxpbmVTdHlsZSIsImNvbG9yIl0pfSl9KSl9LG1pbm9yVGljazpmdW5jdGlvbih0LGUsbixpLHIsbyl7aWYoci5sZW5ndGgpe2Zvcih2YXIgYT1lLmdldE1vZGVsKCJheGlzVGljayIpLHM9ZS5nZXRNb2RlbCgibWlub3JUaWNrIiksbD0oYS5nZXQoImluc2lkZSIpPy0xOjEpKnMuZ2V0KCJsZW5ndGgiKSx1PW9bckUobildLGg9W10sYz0wO2M8ci5sZW5ndGg7YysrKWZvcih2YXIgcD0wO3A8cltjXS5sZW5ndGg7cCsrKWgucHVzaChuZXcgS3Uoe3NoYXBlOmlFKG4sW3UsdStsXSxyW2NdW3BdLmNvb3JkKX0pKTt0LmFkZChOaChoLHtzdHlsZTprKHMuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLGsoYS5nZXRMaW5lU3R5bGUoKSx7c3Ryb2tlOmUuZ2V0KFsiYXhpc0xpbmUiLCJsaW5lU3R5bGUiLCJjb2xvciJdKX0pKX0pKX19LGF4aXNMYWJlbDpmdW5jdGlvbih0LGUsbixpLHIsbyxhKXt2YXIgcz1lLmdldENhdGVnb3JpZXMoITApLGw9ZS5nZXRNb2RlbCgiYXhpc0xhYmVsIiksdT1sLmdldCgibWFyZ2luIiksaD1lLmdldCgidHJpZ2dlckV2ZW50Iik7RShhLChmdW5jdGlvbihpLHIpe3ZhciBhPWwsYz1pLnRpY2tWYWx1ZSxwPW9bckUobildLGQ9bi5jb29yZFRvUG9pbnQoW3ArdSxpLmNvb3JkXSksZj1uLmN4LGc9bi5jeSx5PU1hdGguYWJzKGRbMF0tZikvcDwuMz8iY2VudGVyIjpkWzBdPmY/ImxlZnQiOiJyaWdodCIsdj1NYXRoLmFicyhkWzFdLWcpL3A8LjM/Im1pZGRsZSI6ZFsxXT5nPyJ0b3AiOiJib3R0b20iO2lmKHMmJnNbY10pe3ZhciBtPXNbY107cShtKSYmbS50ZXh0U3R5bGUmJihhPW5ldyBDYyhtLnRleHRTdHlsZSxsLGwuZWNNb2RlbCkpfXZhciB4PW5ldyBYcyh7c2lsZW50OmRJLmlzTGFiZWxTaWxlbnQoZSksc3R5bGU6b2MoYSx7eDpkWzBdLHk6ZFsxXSxmaWxsOmEuZ2V0VGV4dENvbG9yKCl8fGUuZ2V0KFsiYXhpc0xpbmUiLCJsaW5lU3R5bGUiLCJjb2xvciJdKSx0ZXh0OmkuZm9ybWF0dGVkTGFiZWwsYWxpZ246eSx2ZXJ0aWNhbEFsaWduOnZ9KX0pO2lmKHQuYWRkKHgpLGgpe3ZhciBfPWRJLm1ha2VBeGlzRXZlbnREYXRhQmFzZShlKTtfLnRhcmdldFR5cGU9ImF4aXNMYWJlbCIsXy52YWx1ZT1pLnJhd0xhYmVsLHJsKHgpLmV2ZW50RGF0YT1ffX0pLHRoaXMpfSxzcGxpdExpbmU6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPWUuZ2V0TW9kZWwoInNwbGl0TGluZSIpLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxzPWEuZ2V0KCJjb2xvciIpLGw9MDtzPXMgaW5zdGFuY2VvZiBBcnJheT9zOltzXTtmb3IodmFyIHU9W10saD0wO2g8aS5sZW5ndGg7aCsrKXt2YXIgYz1sKyslcy5sZW5ndGg7dVtjXT11W2NdfHxbXSx1W2NdLnB1c2gobmV3IEt1KHtzaGFwZTppRShuLG8saVtoXS5jb29yZCl9KSl9Zm9yKGg9MDtoPHUubGVuZ3RoO2grKyl0LmFkZChOaCh1W2hdLHtzdHlsZTprKHtzdHJva2U6c1toJXMubGVuZ3RoXX0sYS5nZXRMaW5lU3R5bGUoKSksc2lsZW50OiEwLHo6ZS5nZXQoInoiKX0pKX0sbWlub3JTcGxpdExpbmU6ZnVuY3Rpb24odCxlLG4saSxyLG8pe2lmKHIubGVuZ3RoKXtmb3IodmFyIGE9ZS5nZXRNb2RlbCgibWlub3JTcGxpdExpbmUiKS5nZXRNb2RlbCgibGluZVN0eWxlIikscz1bXSxsPTA7bDxyLmxlbmd0aDtsKyspZm9yKHZhciB1PTA7dTxyW2xdLmxlbmd0aDt1Kyspcy5wdXNoKG5ldyBLdSh7c2hhcGU6aUUobixvLHJbbF1bdV0uY29vcmQpfSkpO3QuYWRkKE5oKHMse3N0eWxlOmEuZ2V0TGluZVN0eWxlKCksc2lsZW50OiEwLHo6ZS5nZXQoInoiKX0pKX19LHNwbGl0QXJlYTpmdW5jdGlvbih0LGUsbixpLHIsbyl7aWYoaS5sZW5ndGgpe3ZhciBhPWUuZ2V0TW9kZWwoInNwbGl0QXJlYSIpLmdldE1vZGVsKCJhcmVhU3R5bGUiKSxzPWEuZ2V0KCJjb2xvciIpLGw9MDtzPXMgaW5zdGFuY2VvZiBBcnJheT9zOltzXTtmb3IodmFyIHU9W10saD1NYXRoLlBJLzE4MCxjPS1pWzBdLmNvb3JkKmgscD1NYXRoLm1pbihvWzBdLG9bMV0pLGQ9TWF0aC5tYXgob1swXSxvWzFdKSxmPWUuZ2V0KCJjbG9ja3dpc2UiKSxnPTEseT1pLmxlbmd0aDtnPD15O2crKyl7dmFyIHY9Zz09PXk/aVswXS5jb29yZDppW2ddLmNvb3JkLG09bCsrJXMubGVuZ3RoO3VbbV09dVttXXx8W10sdVttXS5wdXNoKG5ldyBGdSh7c2hhcGU6e2N4Om4uY3gsY3k6bi5jeSxyMDpwLHI6ZCxzdGFydEFuZ2xlOmMsZW5kQW5nbGU6LXYqaCxjbG9ja3dpc2U6Zn0sc2lsZW50OiEwfSkpLGM9LXYqaH1mb3IoZz0wO2c8dS5sZW5ndGg7ZysrKXQuYWRkKE5oKHVbZ10se3N0eWxlOmsoe2ZpbGw6c1tnJXMubGVuZ3RoXX0sYS5nZXRBcmVhU3R5bGUoKSksc2lsZW50OiEwfSkpfX19LGxFPVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSx1RT1bInNwbGl0TGluZSIsInNwbGl0QXJlYSIsIm1pbm9yU3BsaXRMaW5lIl0saEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmF4aXNQb2ludGVyQ2xhc3M9IlBvbGFyQXhpc1BvaW50ZXIiLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHQuZ2V0KCJzaG93Iikpe3ZhciBuPXRoaXMuX2F4aXNHcm91cCxpPXRoaXMuX2F4aXNHcm91cD1uZXcgQnI7dGhpcy5ncm91cC5hZGQoaSk7dmFyIHI9dC5heGlzLG89ci5wb2xhcixhPW8uZ2V0QW5nbGVBeGlzKCkscz1yLmdldFRpY2tzQ29vcmRzKCksbD1yLmdldE1pbm9yVGlja3NDb29yZHMoKSx1PWEuZ2V0RXh0ZW50KClbMF0saD1yLmdldEV4dGVudCgpLGM9ZnVuY3Rpb24odCxlLG4pe3JldHVybntwb3NpdGlvbjpbdC5jeCx0LmN5XSxyb3RhdGlvbjpuLzE4MCpNYXRoLlBJLGxhYmVsRGlyZWN0aW9uOi0xLHRpY2tEaXJlY3Rpb246LTEsbmFtZURpcmVjdGlvbjoxLGxhYmVsUm90YXRlOmUuZ2V0TW9kZWwoImF4aXNMYWJlbCIpLmdldCgicm90YXRlIiksejI6MX19KG8sdCx1KSxwPW5ldyBkSSh0LGMpO0UobEUscC5hZGQscCksaS5hZGQocC5nZXRHcm91cCgpKSxIaChuLGksdCksRSh1RSwoZnVuY3Rpb24oZSl7dC5nZXQoW2UsInNob3ciXSkmJiFyLnNjYWxlLmlzQmxhbmsoKSYmY0VbZV0odGhpcy5ncm91cCx0LG8sdSxoLHMsbCl9KSx0aGlzKX19LGUudHlwZT0icmFkaXVzQXhpcyIsZX0oVEkpLGNFPXtzcGxpdExpbmU6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPWUuZ2V0TW9kZWwoInNwbGl0TGluZSIpLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxzPWEuZ2V0KCJjb2xvciIpLGw9MCx1PW4uZ2V0QW5nbGVBeGlzKCksaD1NYXRoLlBJLzE4MCxjPXUuZ2V0RXh0ZW50KCkscD0zNjA9PT1NYXRoLmFicyhjWzFdLWNbMF0pPyJDaXJjbGUiOiJBcmMiO3M9cyBpbnN0YW5jZW9mIEFycmF5P3M6W3NdO2Zvcih2YXIgZD1bXSxmPTA7ZjxvLmxlbmd0aDtmKyspe3ZhciBnPWwrKyVzLmxlbmd0aDtkW2ddPWRbZ118fFtdLGRbZ10ucHVzaChuZXcgUWhbcF0oe3NoYXBlOntjeDpuLmN4LGN5Om4uY3kscjpNYXRoLm1heChvW2ZdLmNvb3JkLDApLHN0YXJ0QW5nbGU6LWNbMF0qaCxlbmRBbmdsZTotY1sxXSpoLGNsb2Nrd2lzZTp1LmludmVyc2V9fSkpfWZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdC5hZGQoTmgoZFtmXSx7c3R5bGU6ayh7c3Ryb2tlOnNbZiVzLmxlbmd0aF0sZmlsbDpudWxsfSxhLmdldExpbmVTdHlsZSgpKSxzaWxlbnQ6ITB9KSl9LG1pbm9yU3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSxuLGkscixvLGEpe2lmKGEubGVuZ3RoKXtmb3IodmFyIHM9ZS5nZXRNb2RlbCgibWlub3JTcGxpdExpbmUiKS5nZXRNb2RlbCgibGluZVN0eWxlIiksbD1bXSx1PTA7dTxhLmxlbmd0aDt1KyspZm9yKHZhciBoPTA7aDxhW3VdLmxlbmd0aDtoKyspbC5wdXNoKG5ldyBTdSh7c2hhcGU6e2N4Om4uY3gsY3k6bi5jeSxyOmFbdV1baF0uY29vcmR9fSkpO3QuYWRkKE5oKGwse3N0eWxlOmsoe2ZpbGw6bnVsbH0scy5nZXRMaW5lU3R5bGUoKSksc2lsZW50OiEwfSkpfX0sc3BsaXRBcmVhOmZ1bmN0aW9uKHQsZSxuLGkscixvKXtpZihvLmxlbmd0aCl7dmFyIGE9ZS5nZXRNb2RlbCgic3BsaXRBcmVhIikuZ2V0TW9kZWwoImFyZWFTdHlsZSIpLHM9YS5nZXQoImNvbG9yIiksbD0wO3M9cyBpbnN0YW5jZW9mIEFycmF5P3M6W3NdO2Zvcih2YXIgdT1bXSxoPW9bMF0uY29vcmQsYz0xO2M8by5sZW5ndGg7YysrKXt2YXIgcD1sKyslcy5sZW5ndGg7dVtwXT11W3BdfHxbXSx1W3BdLnB1c2gobmV3IEZ1KHtzaGFwZTp7Y3g6bi5jeCxjeTpuLmN5LHIwOmgscjpvW2NdLmNvb3JkLHN0YXJ0QW5nbGU6MCxlbmRBbmdsZToyKk1hdGguUEl9LHNpbGVudDohMH0pKSxoPW9bY10uY29vcmR9Zm9yKGM9MDtjPHUubGVuZ3RoO2MrKyl0LmFkZChOaCh1W2NdLHtzdHlsZTprKHtmaWxsOnNbYyVzLmxlbmd0aF19LGEuZ2V0QXJlYVN0eWxlKCkpLHNpbGVudDohMH0pKX19fTtmdW5jdGlvbiBwRSh0KXtyZXR1cm4gdC5nZXQoInN0YWNrIil8fCJfX2VjX3N0YWNrXyIrdC5zZXJpZXNJbmRleH1mdW5jdGlvbiBkRSh0LGUpe3JldHVybiBlLmRpbSt0Lm1vZGVsLmNvbXBvbmVudEluZGV4fWZ1bmN0aW9uIGZFKHQsZSxuKXt2YXIgaT17fSxyPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O0UodCwoZnVuY3Rpb24odCxuKXt2YXIgaT10LmdldERhdGEoKSxyPXQuY29vcmRpbmF0ZVN5c3RlbSxvPXIuZ2V0QmFzZUF4aXMoKSxhPWRFKHIsbykscz1vLmdldEV4dGVudCgpLGw9ImNhdGVnb3J5Ij09PW8udHlwZT9vLmdldEJhbmRXaWR0aCgpOk1hdGguYWJzKHNbMV0tc1swXSkvaS5jb3VudCgpLHU9ZVthXXx8e2JhbmRXaWR0aDpsLHJlbWFpbmVkV2lkdGg6bCxhdXRvV2lkdGhDb3VudDowLGNhdGVnb3J5R2FwOiIyMCUiLGdhcDoiMzAlIixzdGFja3M6e319LGg9dS5zdGFja3M7ZVthXT11O3ZhciBjPXBFKHQpO2hbY118fHUuYXV0b1dpZHRoQ291bnQrKyxoW2NdPWhbY118fHt3aWR0aDowLG1heFdpZHRoOjB9O3ZhciBwPSRyKHQuZ2V0KCJiYXJXaWR0aCIpLGwpLGQ9JHIodC5nZXQoImJhck1heFdpZHRoIiksbCksZj10LmdldCgiYmFyR2FwIiksZz10LmdldCgiYmFyQ2F0ZWdvcnlHYXAiKTtwJiYhaFtjXS53aWR0aCYmKHA9TWF0aC5taW4odS5yZW1haW5lZFdpZHRoLHApLGhbY10ud2lkdGg9cCx1LnJlbWFpbmVkV2lkdGgtPXApLGQmJihoW2NdLm1heFdpZHRoPWQpLG51bGwhPWYmJih1LmdhcD1mKSxudWxsIT1nJiYodS5jYXRlZ29yeUdhcD1nKX0pKTt2YXIgbj17fTtyZXR1cm4gRShlLChmdW5jdGlvbih0LGUpe25bZV09e307dmFyIGk9dC5zdGFja3Mscj10LmJhbmRXaWR0aCxvPSRyKHQuY2F0ZWdvcnlHYXAsciksYT0kcih0LmdhcCwxKSxzPXQucmVtYWluZWRXaWR0aCxsPXQuYXV0b1dpZHRoQ291bnQsdT0ocy1vKS8obCsobC0xKSphKTt1PU1hdGgubWF4KHUsMCksRShpLChmdW5jdGlvbih0LGUpe3ZhciBuPXQubWF4V2lkdGg7biYmbjx1JiYobj1NYXRoLm1pbihuLHMpLHQud2lkdGgmJihuPU1hdGgubWluKG4sdC53aWR0aCkpLHMtPW4sdC53aWR0aD1uLGwtLSl9KSksdT0ocy1vKS8obCsobC0xKSphKSx1PU1hdGgubWF4KHUsMCk7dmFyIGgsYz0wO0UoaSwoZnVuY3Rpb24odCxlKXt0LndpZHRofHwodC53aWR0aD11KSxoPXQsYys9dC53aWR0aCooMSthKX0pKSxoJiYoYy09aC53aWR0aCphKTt2YXIgcD0tYy8yO0UoaSwoZnVuY3Rpb24odCxpKXtuW2VdW2ldPW5bZV1baV18fHtvZmZzZXQ6cCx3aWR0aDp0LndpZHRofSxwKz10LndpZHRoKigxK2EpfSkpfSkpLG59KEIoZS5nZXRTZXJpZXNCeVR5cGUodCksKGZ1bmN0aW9uKHQpe3JldHVybiFlLmlzU2VyaWVzRmlsdGVyZWQodCkmJnQuY29vcmRpbmF0ZVN5c3RlbSYmInBvbGFyIj09PXQuY29vcmRpbmF0ZVN5c3RlbS50eXBlfSkpKTtlLmVhY2hTZXJpZXNCeVR5cGUodCwoZnVuY3Rpb24odCl7aWYoInBvbGFyIj09PXQuY29vcmRpbmF0ZVN5c3RlbS50eXBlKXt2YXIgZT10LmdldERhdGEoKSxuPXQuY29vcmRpbmF0ZVN5c3RlbSxvPW4uZ2V0QmFzZUF4aXMoKSxhPWRFKG4sbykscz1wRSh0KSxsPXJbYV1bc10sdT1sLm9mZnNldCxoPWwud2lkdGgsYz1uLmdldE90aGVyQXhpcyhvKSxwPXQuY29vcmRpbmF0ZVN5c3RlbS5jeCxkPXQuY29vcmRpbmF0ZVN5c3RlbS5jeSxmPXQuZ2V0KCJiYXJNaW5IZWlnaHQiKXx8MCxnPXQuZ2V0KCJiYXJNaW5BbmdsZSIpfHwwO2lbc109aVtzXXx8W107Zm9yKHZhciB5PWUubWFwRGltZW5zaW9uKGMuZGltKSx2PWUubWFwRGltZW5zaW9uKG8uZGltKSxtPW14KGUseSkseD0icmFkaXVzIiE9PW8uZGltfHwhdC5nZXQoInJvdW5kQ2FwIiwhMCksXz1jLm1vZGVsLmdldCgic3RhcnRWYWx1ZSIpLGI9Yy5kYXRhVG9Db29yZChffHwwKSx3PTAsUz1lLmNvdW50KCk7dzxTO3crKyl7dmFyIE09ZS5nZXQoeSx3KSxJPWUuZ2V0KHYsdyksVD1NPj0wPyJwIjoibiIsQz1iO20mJihpW3NdW0ldfHwoaVtzXVtJXT17cDpiLG46Yn0pLEM9aVtzXVtJXVtUXSk7dmFyIEQ9dm9pZCAwLEE9dm9pZCAwLGs9dm9pZCAwLEw9dm9pZCAwO2lmKCJyYWRpdXMiPT09Yy5kaW0pe3ZhciBQPWMuZGF0YVRvQ29vcmQoTSktYixPPW8uZGF0YVRvQ29vcmQoSSk7TWF0aC5hYnMoUCk8ZiYmKFA9KFA8MD8tMToxKSpmKSxEPUMsQT1DK1AsTD0oaz1PLXUpLWgsbSYmKGlbc11bSV1bVF09QSl9ZWxzZXt2YXIgUj1jLmRhdGFUb0Nvb3JkKE0seCktYixOPW8uZGF0YVRvQ29vcmQoSSk7TWF0aC5hYnMoUik8ZyYmKFI9KFI8MD8tMToxKSpnKSxBPShEPU4rdSkraCxrPUMsTD1DK1IsbSYmKGlbc11bSV1bVF09TCl9ZS5zZXRJdGVtTGF5b3V0KHcse2N4OnAsY3k6ZCxyMDpELHI6QSxzdGFydEFuZ2xlOi1rKk1hdGguUEkvMTgwLGVuZEFuZ2xlOi1MKk1hdGguUEkvMTgwLGNsb2Nrd2lzZTprPj1MfSl9fX0pKX12YXIgZ0U9e3N0YXJ0QW5nbGU6OTAsY2xvY2t3aXNlOiEwLHNwbGl0TnVtYmVyOjEyLGF4aXNMYWJlbDp7cm90YXRlOjB9fSx5RT17c3BsaXROdW1iZXI6NX0sdkU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS50eXBlPSJwb2xhciIsZX0oQWcpO2Z1bmN0aW9uIG1FKHQsZSl7ZT1lfHx7fTt2YXIgbj10LmNvb3JkaW5hdGVTeXN0ZW0saT10LmF4aXMscj17fSxvPWkucG9zaXRpb24sYT1pLm9yaWVudCxzPW4uZ2V0UmVjdCgpLGw9W3MueCxzLngrcy53aWR0aCxzLnkscy55K3MuaGVpZ2h0XSx1PXtob3Jpem9udGFsOnt0b3A6bFsyXSxib3R0b206bFszXX0sdmVydGljYWw6e2xlZnQ6bFswXSxyaWdodDpsWzFdfX07ci5wb3NpdGlvbj1bInZlcnRpY2FsIj09PWE/dS52ZXJ0aWNhbFtvXTpsWzBdLCJob3Jpem9udGFsIj09PWE/dS5ob3Jpem9udGFsW29dOmxbM11dO3Iucm90YXRpb249TWF0aC5QSS8yKntob3Jpem9udGFsOjAsdmVydGljYWw6MX1bYV07ci5sYWJlbERpcmVjdGlvbj1yLnRpY2tEaXJlY3Rpb249ci5uYW1lRGlyZWN0aW9uPXt0b3A6LTEsYm90dG9tOjEscmlnaHQ6MSxsZWZ0Oi0xfVtvXSx0LmdldChbImF4aXNUaWNrIiwiaW5zaWRlIl0pJiYoci50aWNrRGlyZWN0aW9uPS1yLnRpY2tEaXJlY3Rpb24pLGl0KGUubGFiZWxJbnNpZGUsdC5nZXQoWyJheGlzTGFiZWwiLCJpbnNpZGUiXSkpJiYoci5sYWJlbERpcmVjdGlvbj0tci5sYWJlbERpcmVjdGlvbik7dmFyIGg9ZS5yb3RhdGU7cmV0dXJuIG51bGw9PWgmJihoPXQuZ2V0KFsiYXhpc0xhYmVsIiwicm90YXRlIl0pKSxyLmxhYmVsUm90YXRpb249InRvcCI9PT1vPy1oOmgsci56Mj0xLHJ9dmFyIHhFPVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSxfRT1bInNwbGl0QXJlYSIsInNwbGl0TGluZSJdLGJFPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5heGlzUG9pbnRlckNsYXNzPSJTaW5nbGVBeGlzUG9pbnRlciIsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlLG4saSxyKXt2YXIgbz10aGlzLmdyb3VwO28ucmVtb3ZlQWxsKCk7dmFyIGE9dGhpcy5fYXhpc0dyb3VwO3RoaXMuX2F4aXNHcm91cD1uZXcgQnI7dmFyIHM9bUUoZSksbD1uZXcgZEkoZSxzKTtFKHhFLGwuYWRkLGwpLG8uYWRkKHRoaXMuX2F4aXNHcm91cCksby5hZGQobC5nZXRHcm91cCgpKSxFKF9FLChmdW5jdGlvbih0KXtlLmdldChbdCwic2hvdyJdKSYmd0VbdF0odGhpcyx0aGlzLmdyb3VwLHRoaXMuX2F4aXNHcm91cCxlKX0pLHRoaXMpLEhoKGEsdGhpcy5fYXhpc0dyb3VwLGUpLHQucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMsZSxuLGkscil9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe0FJKHRoaXMpfSxlLnR5cGU9InNpbmdsZUF4aXMiLGV9KFRJKSx3RT17c3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPWkuYXhpcztpZighci5zY2FsZS5pc0JsYW5rKCkpe3ZhciBvPWkuZ2V0TW9kZWwoInNwbGl0TGluZSIpLGE9by5nZXRNb2RlbCgibGluZVN0eWxlIikscz1hLmdldCgiY29sb3IiKTtzPXMgaW5zdGFuY2VvZiBBcnJheT9zOltzXTtmb3IodmFyIGw9YS5nZXQoIndpZHRoIiksdT1pLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0UmVjdCgpLGg9ci5pc0hvcml6b250YWwoKSxjPVtdLHA9MCxkPXIuZ2V0VGlja3NDb29yZHMoe3RpY2tNb2RlbDpvfSksZj1bXSxnPVtdLHk9MDt5PGQubGVuZ3RoOysreSl7dmFyIHY9ci50b0dsb2JhbENvb3JkKGRbeV0uY29vcmQpO2g/KGZbMF09dixmWzFdPXUueSxnWzBdPXYsZ1sxXT11LnkrdS5oZWlnaHQpOihmWzBdPXUueCxmWzFdPXYsZ1swXT11LngrdS53aWR0aCxnWzFdPXYpO3ZhciBtPW5ldyBLdSh7c2hhcGU6e3gxOmZbMF0seTE6ZlsxXSx4MjpnWzBdLHkyOmdbMV19LHNpbGVudDohMH0pO3poKG0uc2hhcGUsbCk7dmFyIHg9cCsrJXMubGVuZ3RoO2NbeF09Y1t4XXx8W10sY1t4XS5wdXNoKG0pfXZhciBfPWEuZ2V0TGluZVN0eWxlKFsiY29sb3IiXSk7Zm9yKHk9MDt5PGMubGVuZ3RoOysreSllLmFkZChOaChjW3ldLHtzdHlsZTprKHtzdHJva2U6c1t5JXMubGVuZ3RoXX0sXyksc2lsZW50OiEwfSkpfX0sc3BsaXRBcmVhOmZ1bmN0aW9uKHQsZSxuLGkpe0RJKHQsbixpLGkpfX0sU0U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0Q29vcmRTeXNNb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlLnR5cGU9InNpbmdsZUF4aXMiLGUubGF5b3V0TW9kZT0iYm94IixlLmRlZmF1bHRPcHRpb249e2xlZnQ6IjUlIix0b3A6IjUlIixyaWdodDoiNSUiLGJvdHRvbToiNSUiLHR5cGU6InZhbHVlIixwb3NpdGlvbjoiYm90dG9tIixvcmllbnQ6Imhvcml6b250YWwiLGF4aXNMaW5lOntzaG93OiEwLGxpbmVTdHlsZTp7d2lkdGg6MSx0eXBlOiJzb2xpZCJ9fSx0b29sdGlwOntzaG93OiEwfSxheGlzVGljazp7c2hvdzohMCxsZW5ndGg6NixsaW5lU3R5bGU6e3dpZHRoOjF9fSxheGlzTGFiZWw6e3Nob3c6ITAsaW50ZXJ2YWw6ImF1dG8ifSxzcGxpdExpbmU6e3Nob3c6ITAsbGluZVN0eWxlOnt0eXBlOiJkYXNoZWQiLG9wYWNpdHk6LjJ9fX0sZX0oenApO1IoU0UsRF8ucHJvdG90eXBlKTt2YXIgTUU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4saSxyLG8pe3ZhciBhPXQuY2FsbCh0aGlzLGUsbixpKXx8dGhpcztyZXR1cm4gYS50eXBlPXJ8fCJ2YWx1ZSIsYS5wb3NpdGlvbj1vfHwiYm90dG9tIixhfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wb3NpdGlvbjtyZXR1cm4idG9wIj09PXR8fCJib3R0b20iPT09dH0sZS5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlU3lzdGVtLnBvaW50VG9EYXRhKHQpWzBdfSxlfShhYiksSUU9WyJzaW5nbGUiXSxURT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMudHlwZT0ic2luZ2xlIix0aGlzLmRpbWVuc2lvbj0ic2luZ2xlIix0aGlzLmRpbWVuc2lvbnM9SUUsdGhpcy5heGlzUG9pbnRlckVuYWJsZWQ9ITAsdGhpcy5tb2RlbD10LHRoaXMuX2luaXQodCxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5kaW1lbnNpb24scj1uZXcgTUUoaSxiXyh0KSxbMCwwXSx0LmdldCgidHlwZSIpLHQuZ2V0KCJwb3NpdGlvbiIpKSxvPSJjYXRlZ29yeSI9PT1yLnR5cGU7ci5vbkJhbmQ9byYmdC5nZXQoImJvdW5kYXJ5R2FwIiksci5pbnZlcnNlPXQuZ2V0KCJpbnZlcnNlIiksci5vcmllbnQ9dC5nZXQoIm9yaWVudCIpLHQuYXhpcz1yLHIubW9kZWw9dCxyLmNvb3JkaW5hdGVTeXN0ZW09dGhpcyx0aGlzLl9heGlzPXJ9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3QuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7aWYodC5jb29yZGluYXRlU3lzdGVtPT09dGhpcyl7dmFyIGU9dC5nZXREYXRhKCk7RShlLm1hcERpbWVuc2lvbnNBbGwodGhpcy5kaW1lbnNpb24pLChmdW5jdGlvbih0KXt0aGlzLl9heGlzLnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoZSx0KX0pLHRoaXMpLF9fKHRoaXMuX2F4aXMuc2NhbGUsdGhpcy5fYXhpcy5tb2RlbCl9fSksdGhpcyl9LHQucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3RoaXMuX3JlY3Q9a3Aoe2xlZnQ6dC5nZXQoImxlZnQiKSx0b3A6dC5nZXQoInRvcCIpLHJpZ2h0OnQuZ2V0KCJyaWdodCIpLGJvdHRvbTp0LmdldCgiYm90dG9tIiksd2lkdGg6dC5nZXQoIndpZHRoIiksaGVpZ2h0OnQuZ2V0KCJoZWlnaHQiKX0se3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0pLHRoaXMuX2FkanVzdEF4aXMoKX0sdC5wcm90b3R5cGUuZ2V0UmVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWN0fSx0LnByb3RvdHlwZS5fYWRqdXN0QXhpcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlY3QsZT10aGlzLl9heGlzLG49ZS5pc0hvcml6b250YWwoKSxpPW4/WzAsdC53aWR0aF06WzAsdC5oZWlnaHRdLHI9ZS5pbnZlcnNlPzE6MDtlLnNldEV4dGVudChpW3JdLGlbMS1yXSksdGhpcy5fdXBkYXRlQXhpc1RyYW5zZm9ybShlLG4/dC54OnQueSl9LHQucHJvdG90eXBlLl91cGRhdGVBeGlzVHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRFeHRlbnQoKSxpPW5bMF0rblsxXSxyPXQuaXNIb3Jpem9udGFsKCk7dC50b0dsb2JhbENvb3JkPXI/ZnVuY3Rpb24odCl7cmV0dXJuIHQrZX06ZnVuY3Rpb24odCl7cmV0dXJuIGktdCtlfSx0LnRvTG9jYWxDb29yZD1yP2Z1bmN0aW9uKHQpe3JldHVybiB0LWV9OmZ1bmN0aW9uKHQpe3JldHVybiBpLXQrZX19LHQucHJvdG90eXBlLmdldEF4aXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXhpc30sdC5wcm90b3R5cGUuZ2V0QmFzZUF4aXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXhpc30sdC5wcm90b3R5cGUuZ2V0QXhlcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLl9heGlzXX0sdC5wcm90b3R5cGUuZ2V0VG9vbHRpcEF4ZXM9ZnVuY3Rpb24oKXtyZXR1cm57YmFzZUF4ZXM6W3RoaXMuZ2V0QXhpcygpXSxvdGhlckF4ZXM6W119fSx0LnByb3RvdHlwZS5jb250YWluUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSZWN0KCksbj10aGlzLmdldEF4aXMoKTtyZXR1cm4iaG9yaXpvbnRhbCI9PT1uLm9yaWVudD9uLmNvbnRhaW4obi50b0xvY2FsQ29vcmQodFswXSkpJiZ0WzFdPj1lLnkmJnRbMV08PWUueStlLmhlaWdodDpuLmNvbnRhaW4obi50b0xvY2FsQ29vcmQodFsxXSkpJiZ0WzBdPj1lLnkmJnRbMF08PWUueStlLmhlaWdodH0sdC5wcm90b3R5cGUucG9pbnRUb0RhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRBeGlzKCk7cmV0dXJuW2UuY29vcmRUb0RhdGEoZS50b0xvY2FsQ29vcmQodFsiaG9yaXpvbnRhbCI9PT1lLm9yaWVudD8wOjFdKSldfSx0LnByb3RvdHlwZS5kYXRhVG9Qb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEF4aXMoKSxuPXRoaXMuZ2V0UmVjdCgpLGk9W10scj0iaG9yaXpvbnRhbCI9PT1lLm9yaWVudD8wOjE7cmV0dXJuIHQgaW5zdGFuY2VvZiBBcnJheSYmKHQ9dFswXSksaVtyXT1lLnRvR2xvYmFsQ29vcmQoZS5kYXRhVG9Db29yZCgrdCkpLGlbMS1yXT0wPT09cj9uLnkrbi5oZWlnaHQvMjpuLngrbi53aWR0aC8yLGl9LHQucHJvdG90eXBlLmNvbnZlcnRUb1BpeGVsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQ0UoZSk9PT10aGlzP3RoaXMuZGF0YVRvUG9pbnQobik6bnVsbH0sdC5wcm90b3R5cGUuY29udmVydEZyb21QaXhlbD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIENFKGUpPT09dGhpcz90aGlzLnBvaW50VG9EYXRhKG4pOm51bGx9LHR9KCk7ZnVuY3Rpb24gQ0UodCl7dmFyIGU9dC5zZXJpZXNNb2RlbCxuPXQuc2luZ2xlQXhpc01vZGVsO3JldHVybiBuJiZuLmNvb3JkaW5hdGVTeXN0ZW18fGUmJmUuY29vcmRpbmF0ZVN5c3RlbX12YXIgREU9e2NyZWF0ZTpmdW5jdGlvbih0LGUpe3ZhciBuPVtdO3JldHVybiB0LmVhY2hDb21wb25lbnQoInNpbmdsZUF4aXMiLChmdW5jdGlvbihpLHIpe3ZhciBvPW5ldyBURShpLHQsZSk7by5uYW1lPSJzaW5nbGVfIityLG8ucmVzaXplKGksZSksaS5jb29yZGluYXRlU3lzdGVtPW8sbi5wdXNoKG8pfSkpLHQuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7aWYoInNpbmdsZUF4aXMiPT09dC5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSl7dmFyIGU9dC5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJzaW5nbGVBeGlzIixXbykubW9kZWxzWzBdO3QuY29vcmRpbmF0ZVN5c3RlbT1lJiZlLmNvb3JkaW5hdGVTeXN0ZW19fSkpLG59LGRpbWVuc2lvbnM6SUV9LEFFPVsieCIsInkiXSxrRT1bIndpZHRoIiwiaGVpZ2h0Il0sTEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5tYWtlRWxPcHRpb249ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz1uLmF4aXMsYT1vLmNvb3JkaW5hdGVTeXN0ZW0scz1SRShhLDEtT0UobykpLGw9YS5kYXRhVG9Qb2ludChlKVswXSx1PWkuZ2V0KCJ0eXBlIik7aWYodSYmIm5vbmUiIT09dSl7dmFyIGg9cE4oaSksYz1QRVt1XShvLGwscyk7Yy5zdHlsZT1oLHQuZ3JhcGhpY0tleT1jLnR5cGUsdC5wb2ludGVyPWN9eU4oZSx0LG1FKG4pLG4saSxyKX0sZS5wcm90b3R5cGUuZ2V0SGFuZGxlVHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1tRShlLHtsYWJlbEluc2lkZTohMX0pO2kubGFiZWxNYXJnaW49bi5nZXQoWyJoYW5kbGUiLCJtYXJnaW4iXSk7dmFyIHI9Z04oZS5heGlzLHQsaSk7cmV0dXJue3g6clswXSx5OnJbMV0scm90YXRpb246aS5yb3RhdGlvbisoaS5sYWJlbERpcmVjdGlvbjwwP01hdGguUEk6MCl9fSxlLnByb3RvdHlwZS51cGRhdGVIYW5kbGVUcmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9bi5heGlzLG89ci5jb29yZGluYXRlU3lzdGVtLGE9T0Uocikscz1SRShvLGEpLGw9W3QueCx0LnldO2xbYV0rPWVbYV0sbFthXT1NYXRoLm1pbihzWzFdLGxbYV0pLGxbYV09TWF0aC5tYXgoc1swXSxsW2FdKTt2YXIgdT1SRShvLDEtYSksaD0odVsxXSt1WzBdKS8yLGM9W2gsaF07cmV0dXJuIGNbYV09bFthXSx7eDpsWzBdLHk6bFsxXSxyb3RhdGlvbjp0LnJvdGF0aW9uLGN1cnNvclBvaW50OmMsdG9vbHRpcE9wdGlvbjp7dmVydGljYWxBbGlnbjoibWlkZGxlIn19fSxlfShhTiksUEU9e2xpbmU6ZnVuY3Rpb24odCxlLG4pe3JldHVybnt0eXBlOiJMaW5lIixzdWJQaXhlbE9wdGltaXplOiEwLHNoYXBlOnZOKFtlLG5bMF1dLFtlLG5bMV1dLE9FKHQpKX19LHNoYWRvdzpmdW5jdGlvbih0LGUsbil7dmFyIGk9dC5nZXRCYW5kV2lkdGgoKSxyPW5bMV0tblswXTtyZXR1cm57dHlwZToiUmVjdCIsc2hhcGU6bU4oW2UtaS8yLG5bMF1dLFtpLHJdLE9FKHQpKX19fTtmdW5jdGlvbiBPRSh0KXtyZXR1cm4gdC5pc0hvcml6b250YWwoKT8wOjF9ZnVuY3Rpb24gUkUodCxlKXt2YXIgbj10LmdldFJlY3QoKTtyZXR1cm5bbltBRVtlXV0sbltBRVtlXV0rbltrRVtlXV1dfXZhciBORT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnR5cGU9InNpbmdsZSIsZX0oQWcpO3ZhciBFRT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGUsbixpKXt2YXIgcj1ScChlKTt0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx6RShlLHIpfSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5tZXJnZU9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksekUodGhpcy5vcHRpb24sZSl9LGUucHJvdG90eXBlLmdldENlbGxTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uLmNlbGxTaXplfSxlLnR5cGU9ImNhbGVuZGFyIixlLmRlZmF1bHRPcHRpb249e3o6MixsZWZ0OjgwLHRvcDo2MCxjZWxsU2l6ZToyMCxvcmllbnQ6Imhvcml6b250YWwiLHNwbGl0TGluZTp7c2hvdzohMCxsaW5lU3R5bGU6e2NvbG9yOiIjMDAwIix3aWR0aDoxLHR5cGU6InNvbGlkIn19LGl0ZW1TdHlsZTp7Y29sb3I6IiNmZmYiLGJvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IiNjY2MifSxkYXlMYWJlbDp7c2hvdzohMCxmaXJzdERheTowLHBvc2l0aW9uOiJzdGFydCIsbWFyZ2luOiI1MCUiLGNvbG9yOiIjMDAwIn0sbW9udGhMYWJlbDp7c2hvdzohMCxwb3NpdGlvbjoic3RhcnQiLG1hcmdpbjo1LGFsaWduOiJjZW50ZXIiLGZvcm1hdHRlcjpudWxsLGNvbG9yOiIjMDAwIn0seWVhckxhYmVsOntzaG93OiEwLHBvc2l0aW9uOm51bGwsbWFyZ2luOjMwLGZvcm1hdHRlcjpudWxsLGNvbG9yOiIjY2NjIixmb250RmFtaWx5OiJzYW5zLXNlcmlmIixmb250V2VpZ2h0OiJib2xkZXIiLGZvbnRTaXplOjIwfX0sZX0oenApO2Z1bmN0aW9uIHpFKHQsZSl7dmFyIG4saT10LmNlbGxTaXplOzE9PT0obj1ZKGkpP2k6dC5jZWxsU2l6ZT1baSxpXSkubGVuZ3RoJiYoblsxXT1uWzBdKTt2YXIgcj16KFswLDFdLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dFtDcFtlXVswXV18fG51bGwhPXRbQ3BbZV1bMV1dJiZudWxsIT10W0NwW2VdWzJdXX0oZSx0KSYmKG5bdF09ImF1dG8iKSxudWxsIT1uW3RdJiYiYXV0byIhPT1uW3RdfSkpO09wKHQsZSx7dHlwZToiYm94IixpZ25vcmVTaXplOnJ9KX12YXIgVkU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmdyb3VwO2kucmVtb3ZlQWxsKCk7dmFyIHI9dC5jb29yZGluYXRlU3lzdGVtLG89ci5nZXRSYW5nZUluZm8oKSxhPXIuZ2V0T3JpZW50KCkscz1lLmdldExvY2FsZU1vZGVsKCk7dGhpcy5fcmVuZGVyRGF5UmVjdCh0LG8saSksdGhpcy5fcmVuZGVyTGluZXModCxvLGEsaSksdGhpcy5fcmVuZGVyWWVhclRleHQodCxvLGEsaSksdGhpcy5fcmVuZGVyTW9udGhUZXh0KHQscyxhLGkpLHRoaXMuX3JlbmRlcldlZWtUZXh0KHQscyxvLGEsaSl9LGUucHJvdG90eXBlLl9yZW5kZXJEYXlSZWN0PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dC5jb29yZGluYXRlU3lzdGVtLHI9dC5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksbz1pLmdldENlbGxXaWR0aCgpLGE9aS5nZXRDZWxsSGVpZ2h0KCkscz1lLnN0YXJ0LnRpbWU7czw9ZS5lbmQudGltZTtzPWkuZ2V0TmV4dE5EYXkocywxKS50aW1lKXt2YXIgbD1pLmRhdGFUb1JlY3QoW3NdLCExKS50bCx1PW5ldyBXcyh7c2hhcGU6e3g6bFswXSx5OmxbMV0sd2lkdGg6byxoZWlnaHQ6YX0sY3Vyc29yOiJkZWZhdWx0IixzdHlsZTpyfSk7bi5hZGQodSl9fSxlLnByb3RvdHlwZS5fcmVuZGVyTGluZXM9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcyxvPXQuY29vcmRpbmF0ZVN5c3RlbSxhPXQuZ2V0TW9kZWwoWyJzcGxpdExpbmUiLCJsaW5lU3R5bGUiXSkuZ2V0TGluZVN0eWxlKCkscz10LmdldChbInNwbGl0TGluZSIsInNob3ciXSksbD1hLmxpbmVXaWR0aDt0aGlzLl90bHBvaW50cz1bXSx0aGlzLl9ibHBvaW50cz1bXSx0aGlzLl9maXJzdERheU9mTW9udGg9W10sdGhpcy5fZmlyc3REYXlQb2ludHM9W107Zm9yKHZhciB1PWUuc3RhcnQsaD0wO3UudGltZTw9ZS5lbmQudGltZTtoKyspe3AodS5mb3JtYXRlZERhdGUpLDA9PT1oJiYodT1vLmdldERhdGVJbmZvKGUuc3RhcnQueSsiLSIrZS5zdGFydC5tKSk7dmFyIGM9dS5kYXRlO2Muc2V0TW9udGgoYy5nZXRNb250aCgpKzEpLHU9by5nZXREYXRlSW5mbyhjKX1mdW5jdGlvbiBwKGUpe3IuX2ZpcnN0RGF5T2ZNb250aC5wdXNoKG8uZ2V0RGF0ZUluZm8oZSkpLHIuX2ZpcnN0RGF5UG9pbnRzLnB1c2goby5kYXRhVG9SZWN0KFtlXSwhMSkudGwpO3ZhciBsPXIuX2dldExpbmVQb2ludHNPZk9uZVdlZWsodCxlLG4pO3IuX3RscG9pbnRzLnB1c2gobFswXSksci5fYmxwb2ludHMucHVzaChsW2wubGVuZ3RoLTFdKSxzJiZyLl9kcmF3U3BsaXRsaW5lKGwsYSxpKX1wKG8uZ2V0TmV4dE5EYXkoZS5lbmQudGltZSwxKS5mb3JtYXRlZERhdGUpLHMmJnRoaXMuX2RyYXdTcGxpdGxpbmUoci5fZ2V0RWRnZXNQb2ludHMoci5fdGxwb2ludHMsbCxuKSxhLGkpLHMmJnRoaXMuX2RyYXdTcGxpdGxpbmUoci5fZ2V0RWRnZXNQb2ludHMoci5fYmxwb2ludHMsbCxuKSxhLGkpfSxlLnByb3RvdHlwZS5fZ2V0RWRnZXNQb2ludHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPVt0WzBdLnNsaWNlKCksdFt0Lmxlbmd0aC0xXS5zbGljZSgpXSxyPSJob3Jpem9udGFsIj09PW4/MDoxO3JldHVybiBpWzBdW3JdPWlbMF1bcl0tZS8yLGlbMV1bcl09aVsxXVtyXStlLzIsaX0sZS5wcm90b3R5cGUuX2RyYXdTcGxpdGxpbmU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPW5ldyBadSh7ejI6MjAsc2hhcGU6e3BvaW50czp0fSxzdHlsZTplfSk7bi5hZGQoaSl9LGUucHJvdG90eXBlLl9nZXRMaW5lUG9pbnRzT2ZPbmVXZWVrPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dC5jb29yZGluYXRlU3lzdGVtLHI9aS5nZXREYXRlSW5mbyhlKSxvPVtdLGE9MDthPDc7YSsrKXt2YXIgcz1pLmdldE5leHRORGF5KHIudGltZSxhKSxsPWkuZGF0YVRvUmVjdChbcy50aW1lXSwhMSk7b1syKnMuZGF5XT1sLnRsLG9bMipzLmRheSsxXT1sWyJob3Jpem9udGFsIj09PW4/ImJsIjoidHIiXX1yZXR1cm4gb30sZS5wcm90b3R5cGUuX2Zvcm1hdHRlckxhYmVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFUodCkmJnQ/KG49dCxFKGUsKGZ1bmN0aW9uKHQsZSl7bj1uLnJlcGxhY2UoInsiK2UrIn0iLGk/cmUodCk6dCl9KSksbik6WCh0KT90KGUpOmUubmFtZU1hcDt2YXIgbixpfSxlLnByb3RvdHlwZS5feWVhclRleHRQb3NpdGlvbkNvbnRyb2w9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz1lWzBdLGE9ZVsxXSxzPVsiY2VudGVyIiwiYm90dG9tIl07ImJvdHRvbSI9PT1pPyhhKz1yLHM9WyJjZW50ZXIiLCJ0b3AiXSk6ImxlZnQiPT09aT9vLT1yOiJyaWdodCI9PT1pPyhvKz1yLHM9WyJjZW50ZXIiLCJ0b3AiXSk6YS09cjt2YXIgbD0wO3JldHVybiJsZWZ0IiE9PWkmJiJyaWdodCIhPT1pfHwobD1NYXRoLlBJLzIpLHtyb3RhdGlvbjpsLHg6byx5OmEsc3R5bGU6e2FsaWduOnNbMF0sdmVydGljYWxBbGlnbjpzWzFdfX19LGUucHJvdG90eXBlLl9yZW5kZXJZZWFyVGV4dD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LmdldE1vZGVsKCJ5ZWFyTGFiZWwiKTtpZihyLmdldCgic2hvdyIpKXt2YXIgbz1yLmdldCgibWFyZ2luIiksYT1yLmdldCgicG9zaXRpb24iKTthfHwoYT0iaG9yaXpvbnRhbCIhPT1uPyJ0b3AiOiJsZWZ0Iik7dmFyIHM9W3RoaXMuX3RscG9pbnRzW3RoaXMuX3RscG9pbnRzLmxlbmd0aC0xXSx0aGlzLl9ibHBvaW50c1swXV0sbD0oc1swXVswXStzWzFdWzBdKS8yLHU9KHNbMF1bMV0rc1sxXVsxXSkvMixoPSJob3Jpem9udGFsIj09PW4/MDoxLGM9e3RvcDpbbCxzW2hdWzFdXSxib3R0b206W2wsc1sxLWhdWzFdXSxsZWZ0OltzWzEtaF1bMF0sdV0scmlnaHQ6W3NbaF1bMF0sdV19LHA9ZS5zdGFydC55OytlLmVuZC55PitlLnN0YXJ0LnkmJihwPXArIi0iK2UuZW5kLnkpO3ZhciBkPXIuZ2V0KCJmb3JtYXR0ZXIiKSxmPXtzdGFydDplLnN0YXJ0LnksZW5kOmUuZW5kLnksbmFtZU1hcDpwfSxnPXRoaXMuX2Zvcm1hdHRlckxhYmVsKGQsZikseT1uZXcgWHMoe3oyOjMwLHN0eWxlOm9jKHIse3RleHQ6Z30pfSk7eS5hdHRyKHRoaXMuX3llYXJUZXh0UG9zaXRpb25Db250cm9sKHksY1thXSxuLGEsbykpLGkuYWRkKHkpfX0sZS5wcm90b3R5cGUuX21vbnRoVGV4dFBvc2l0aW9uQ29udHJvbD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPSJsZWZ0IixhPSJ0b3AiLHM9dFswXSxsPXRbMV07cmV0dXJuImhvcml6b250YWwiPT09bj8obCs9cixlJiYobz0iY2VudGVyIiksInN0YXJ0Ij09PWkmJihhPSJib3R0b20iKSk6KHMrPXIsZSYmKGE9Im1pZGRsZSIpLCJzdGFydCI9PT1pJiYobz0icmlnaHQiKSkse3g6cyx5OmwsYWxpZ246byx2ZXJ0aWNhbEFsaWduOmF9fSxlLnByb3RvdHlwZS5fcmVuZGVyTW9udGhUZXh0PWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuZ2V0TW9kZWwoIm1vbnRoTGFiZWwiKTtpZihyLmdldCgic2hvdyIpKXt2YXIgbz1yLmdldCgibmFtZU1hcCIpLGE9ci5nZXQoIm1hcmdpbiIpLHM9ci5nZXQoInBvc2l0aW9uIiksbD1yLmdldCgiYWxpZ24iKSx1PVt0aGlzLl90bHBvaW50cyx0aGlzLl9ibHBvaW50c107byYmIVUobyl8fChvJiYoZT1WYyhvKXx8ZSksbz1lLmdldChbInRpbWUiLCJtb250aEFiYnIiXSl8fFtdKTt2YXIgaD0ic3RhcnQiPT09cz8wOjEsYz0iaG9yaXpvbnRhbCI9PT1uPzA6MTthPSJzdGFydCI9PT1zPy1hOmE7Zm9yKHZhciBwPSJjZW50ZXIiPT09bCxkPTA7ZDx1W2hdLmxlbmd0aC0xO2QrKyl7dmFyIGY9dVtoXVtkXS5zbGljZSgpLGc9dGhpcy5fZmlyc3REYXlPZk1vbnRoW2RdO2lmKHApe3ZhciB5PXRoaXMuX2ZpcnN0RGF5UG9pbnRzW2RdO2ZbY109KHlbY10rdVswXVtkKzFdW2NdKS8yfXZhciB2PXIuZ2V0KCJmb3JtYXR0ZXIiKSxtPW9bK2cubS0xXSx4PXt5eXl5OmcueSx5eTooZy55KyIiKS5zbGljZSgyKSxNTTpnLm0sTTorZy5tLG5hbWVNYXA6bX0sXz10aGlzLl9mb3JtYXR0ZXJMYWJlbCh2LHgpLGI9bmV3IFhzKHt6MjozMCxzdHlsZTpBKG9jKHIse3RleHQ6X30pLHRoaXMuX21vbnRoVGV4dFBvc2l0aW9uQ29udHJvbChmLHAsbixzLGEpKX0pO2kuYWRkKGIpfX19LGUucHJvdG90eXBlLl93ZWVrVGV4dFBvc2l0aW9uQ29udHJvbD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPSJjZW50ZXIiLGE9Im1pZGRsZSIscz10WzBdLGw9dFsxXSx1PSJzdGFydCI9PT1uO3JldHVybiJob3Jpem9udGFsIj09PWU/KHM9cytpKyh1PzE6LTEpKnJbMF0vMixvPXU/InJpZ2h0IjoibGVmdCIpOihsPWwraSsodT8xOi0xKSpyWzFdLzIsYT11PyJib3R0b20iOiJ0b3AiKSx7eDpzLHk6bCxhbGlnbjpvLHZlcnRpY2FsQWxpZ246YX19LGUucHJvdG90eXBlLl9yZW5kZXJXZWVrVGV4dD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXQuZ2V0TW9kZWwoImRheUxhYmVsIik7aWYoby5nZXQoInNob3ciKSl7dmFyIGE9dC5jb29yZGluYXRlU3lzdGVtLHM9by5nZXQoInBvc2l0aW9uIiksbD1vLmdldCgibmFtZU1hcCIpLHU9by5nZXQoIm1hcmdpbiIpLGg9YS5nZXRGaXJzdERheU9mV2VlaygpO2lmKCFsfHxVKGwpKWwmJihlPVZjKGwpfHxlKSxsPWUuZ2V0KFsidGltZSIsImRheU9mV2Vla1Nob3J0Il0pfHx6KGUuZ2V0KFsidGltZSIsImRheU9mV2Vla0FiYnIiXSksKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpO3ZhciBjPWEuZ2V0TmV4dE5EYXkobi5lbmQudGltZSw3LW4ubHdlZWspLnRpbWUscD1bYS5nZXRDZWxsV2lkdGgoKSxhLmdldENlbGxIZWlnaHQoKV07dT0kcih1LE1hdGgubWluKHBbMV0scFswXSkpLCJzdGFydCI9PT1zJiYoYz1hLmdldE5leHRORGF5KG4uc3RhcnQudGltZSwtKDcrbi5md2VlaykpLnRpbWUsdT0tdSk7Zm9yKHZhciBkPTA7ZDw3O2QrKyl7dmFyIGYsZz1hLmdldE5leHRORGF5KGMsZCkseT1hLmRhdGFUb1JlY3QoW2cudGltZV0sITEpLmNlbnRlcjtmPU1hdGguYWJzKChkK2gpJTcpO3ZhciB2PW5ldyBYcyh7ejI6MzAsc3R5bGU6QShvYyhvLHt0ZXh0OmxbZl19KSx0aGlzLl93ZWVrVGV4dFBvc2l0aW9uQ29udHJvbCh5LGkscyx1LHApKX0pO3IuYWRkKHYpfX19LGUudHlwZT0iY2FsZW5kYXIiLGV9KEFnKSxCRT04NjRlNSxGRT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLGkpe3RoaXMudHlwZT0iY2FsZW5kYXIiLHRoaXMuZGltZW5zaW9ucz10LmRpbWVuc2lvbnMsdGhpcy5nZXREaW1lbnNpb25zSW5mbz10LmdldERpbWVuc2lvbnNJbmZvLHRoaXMuX21vZGVsPWV9cmV0dXJuIHQuZ2V0RGltZW5zaW9uc0luZm89ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6InRpbWUiLHR5cGU6InRpbWUifSwidmFsdWUiXX0sdC5wcm90b3R5cGUuZ2V0UmFuZ2VJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlSW5mb30sdC5wcm90b3R5cGUuZ2V0TW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWx9LHQucHJvdG90eXBlLmdldFJlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdH0sdC5wcm90b3R5cGUuZ2V0Q2VsbFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N3fSx0LnByb3RvdHlwZS5nZXRDZWxsSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NofSx0LnByb3RvdHlwZS5nZXRPcmllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50fSx0LnByb3RvdHlwZS5nZXRGaXJzdERheU9mV2Vlaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXJzdERheU9mV2Vla30sdC5wcm90b3R5cGUuZ2V0RGF0ZUluZm89ZnVuY3Rpb24odCl7dmFyIGU9KHQ9dW8odCkpLmdldEZ1bGxZZWFyKCksbj10LmdldE1vbnRoKCkrMSxpPW48MTA/IjAiK246IiIrbixyPXQuZ2V0RGF0ZSgpLG89cjwxMD8iMCIrcjoiIityLGE9dC5nZXREYXkoKTtyZXR1cm57eTplKyIiLG06aSxkOm8sZGF5OmE9TWF0aC5hYnMoKGErNy10aGlzLmdldEZpcnN0RGF5T2ZXZWVrKCkpJTcpLHRpbWU6dC5nZXRUaW1lKCksZm9ybWF0ZWREYXRlOmUrIi0iK2krIi0iK28sZGF0ZTp0fX0sdC5wcm90b3R5cGUuZ2V0TmV4dE5EYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PShlPWV8fDApfHwodD1uZXcgRGF0ZSh0aGlzLmdldERhdGVJbmZvKHQpLnRpbWUpKS5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpLHRoaXMuZ2V0RGF0ZUluZm8odCl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2ZpcnN0RGF5T2ZXZWVrPSt0aGlzLl9tb2RlbC5nZXRNb2RlbCgiZGF5TGFiZWwiKS5nZXQoImZpcnN0RGF5IiksdGhpcy5fb3JpZW50PXRoaXMuX21vZGVsLmdldCgib3JpZW50IiksdGhpcy5fbGluZVdpZHRoPXRoaXMuX21vZGVsLmdldE1vZGVsKCJpdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKS5saW5lV2lkdGh8fDAsdGhpcy5fcmFuZ2VJbmZvPXRoaXMuX2dldFJhbmdlSW5mbyh0aGlzLl9pbml0UmFuZ2VPcHRpb24oKSk7dmFyIG49dGhpcy5fcmFuZ2VJbmZvLndlZWtzfHwxLGk9WyJ3aWR0aCIsImhlaWdodCJdLHI9dGhpcy5fbW9kZWwuZ2V0Q2VsbFNpemUoKS5zbGljZSgpLG89dGhpcy5fbW9kZWwuZ2V0Qm94TGF5b3V0UGFyYW1zKCksYT0iaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnQ/W24sN106Wzcsbl07RShbMCwxXSwoZnVuY3Rpb24odCl7dShyLHQpJiYob1tpW3RdXT1yW3RdKmFbdF0pfSkpO3ZhciBzPXt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9LGw9dGhpcy5fcmVjdD1rcChvLHMpO2Z1bmN0aW9uIHUodCxlKXtyZXR1cm4gbnVsbCE9dFtlXSYmImF1dG8iIT09dFtlXX1FKFswLDFdLChmdW5jdGlvbih0KXt1KHIsdCl8fChyW3RdPWxbaVt0XV0vYVt0XSl9KSksdGhpcy5fc3c9clswXSx0aGlzLl9zaD1yWzFdfSx0LnByb3RvdHlwZS5kYXRhVG9Qb2ludD1mdW5jdGlvbih0LGUpe1kodCkmJih0PXRbMF0pLG51bGw9PWUmJihlPSEwKTt2YXIgbj10aGlzLmdldERhdGVJbmZvKHQpLGk9dGhpcy5fcmFuZ2VJbmZvLHI9bi5mb3JtYXRlZERhdGU7aWYoZSYmIShuLnRpbWU+PWkuc3RhcnQudGltZSYmbi50aW1lPGkuZW5kLnRpbWUrQkUpKXJldHVybltOYU4sTmFOXTt2YXIgbz1uLmRheSxhPXRoaXMuX2dldFJhbmdlSW5mbyhbaS5zdGFydC50aW1lLHJdKS5udGhXZWVrO3JldHVybiJ2ZXJ0aWNhbCI9PT10aGlzLl9vcmllbnQ/W3RoaXMuX3JlY3QueCtvKnRoaXMuX3N3K3RoaXMuX3N3LzIsdGhpcy5fcmVjdC55K2EqdGhpcy5fc2grdGhpcy5fc2gvMl06W3RoaXMuX3JlY3QueCthKnRoaXMuX3N3K3RoaXMuX3N3LzIsdGhpcy5fcmVjdC55K28qdGhpcy5fc2grdGhpcy5fc2gvMl19LHQucHJvdG90eXBlLnBvaW50VG9EYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucG9pbnRUb0RhdGUodCk7cmV0dXJuIGUmJmUudGltZX0sdC5wcm90b3R5cGUuZGF0YVRvUmVjdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZGF0YVRvUG9pbnQodCxlKTtyZXR1cm57Y29udGVudFNoYXBlOnt4Om5bMF0tKHRoaXMuX3N3LXRoaXMuX2xpbmVXaWR0aCkvMix5Om5bMV0tKHRoaXMuX3NoLXRoaXMuX2xpbmVXaWR0aCkvMix3aWR0aDp0aGlzLl9zdy10aGlzLl9saW5lV2lkdGgsaGVpZ2h0OnRoaXMuX3NoLXRoaXMuX2xpbmVXaWR0aH0sY2VudGVyOm4sdGw6W25bMF0tdGhpcy5fc3cvMixuWzFdLXRoaXMuX3NoLzJdLHRyOltuWzBdK3RoaXMuX3N3LzIsblsxXS10aGlzLl9zaC8yXSxicjpbblswXSt0aGlzLl9zdy8yLG5bMV0rdGhpcy5fc2gvMl0sYmw6W25bMF0tdGhpcy5fc3cvMixuWzFdK3RoaXMuX3NoLzJdfX0sdC5wcm90b3R5cGUucG9pbnRUb0RhdGU9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5mbG9vcigodFswXS10aGlzLl9yZWN0LngpL3RoaXMuX3N3KSsxLG49TWF0aC5mbG9vcigodFsxXS10aGlzLl9yZWN0LnkpL3RoaXMuX3NoKSsxLGk9dGhpcy5fcmFuZ2VJbmZvLnJhbmdlO3JldHVybiJ2ZXJ0aWNhbCI9PT10aGlzLl9vcmllbnQ/dGhpcy5fZ2V0RGF0ZUJ5V2Vla3NBbmREYXkobixlLTEsaSk6dGhpcy5fZ2V0RGF0ZUJ5V2Vla3NBbmREYXkoZSxuLTEsaSl9LHQucHJvdG90eXBlLmNvbnZlcnRUb1BpeGVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1HRShlKTtyZXR1cm4gaT09PXRoaXM/aS5kYXRhVG9Qb2ludChuKTpudWxsfSx0LnByb3RvdHlwZS5jb252ZXJ0RnJvbVBpeGVsPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1HRShlKTtyZXR1cm4gaT09PXRoaXM/aS5wb2ludFRvRGF0YShuKTpudWxsfSx0LnByb3RvdHlwZS5jb250YWluUG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiTm90IGltcGxlbWVudGVkLiIpLCExfSx0LnByb3RvdHlwZS5faW5pdFJhbmdlT3B0aW9uPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLl9tb2RlbC5nZXQoInJhbmdlIik7aWYoWShlKSYmMT09PWUubGVuZ3RoJiYoZT1lWzBdKSxZKGUpKXQ9ZTtlbHNle3ZhciBuPWUudG9TdHJpbmcoKTtpZigvXlxkezR9JC8udGVzdChuKSYmKHQ9W24rIi0wMS0wMSIsbisiLTEyLTMxIl0pLC9eXGR7NH1bXC98LV1cZHsxLDJ9JC8udGVzdChuKSl7dmFyIGk9dGhpcy5nZXREYXRlSW5mbyhuKSxyPWkuZGF0ZTtyLnNldE1vbnRoKHIuZ2V0TW9udGgoKSsxKTt2YXIgbz10aGlzLmdldE5leHRORGF5KHIsLTEpO3Q9W2kuZm9ybWF0ZWREYXRlLG8uZm9ybWF0ZWREYXRlXX0vXlxkezR9W1wvfC1dXGR7MSwyfVtcL3wtXVxkezEsMn0kLy50ZXN0KG4pJiYodD1bbixuXSl9aWYoIXQpcmV0dXJuIGU7dmFyIGE9dGhpcy5fZ2V0UmFuZ2VJbmZvKHQpO3JldHVybiBhLnN0YXJ0LnRpbWU+YS5lbmQudGltZSYmdC5yZXZlcnNlKCksdH0sdC5wcm90b3R5cGUuX2dldFJhbmdlSW5mbz1mdW5jdGlvbih0KXt2YXIgZSxuPVt0aGlzLmdldERhdGVJbmZvKHRbMF0pLHRoaXMuZ2V0RGF0ZUluZm8odFsxXSldO25bMF0udGltZT5uWzFdLnRpbWUmJihlPSEwLG4ucmV2ZXJzZSgpKTt2YXIgaT1NYXRoLmZsb29yKG5bMV0udGltZS9CRSktTWF0aC5mbG9vcihuWzBdLnRpbWUvQkUpKzEscj1uZXcgRGF0ZShuWzBdLnRpbWUpLG89ci5nZXREYXRlKCksYT1uWzFdLmRhdGUuZ2V0RGF0ZSgpO3Iuc2V0RGF0ZShvK2ktMSk7dmFyIHM9ci5nZXREYXRlKCk7aWYocyE9PWEpZm9yKHZhciBsPXIuZ2V0VGltZSgpLW5bMV0udGltZT4wPzE6LTE7KHM9ci5nZXREYXRlKCkpIT09YSYmKHIuZ2V0VGltZSgpLW5bMV0udGltZSkqbD4wOylpLT1sLHIuc2V0RGF0ZShzLWwpO3ZhciB1PU1hdGguZmxvb3IoKGkrblswXS5kYXkrNikvNyksaD1lPzEtdTp1LTE7cmV0dXJuIGUmJm4ucmV2ZXJzZSgpLHtyYW5nZTpbblswXS5mb3JtYXRlZERhdGUsblsxXS5mb3JtYXRlZERhdGVdLHN0YXJ0Om5bMF0sZW5kOm5bMV0sYWxsRGF5Omksd2Vla3M6dSxudGhXZWVrOmgsZndlZWs6blswXS5kYXksbHdlZWs6blsxXS5kYXl9fSx0LnByb3RvdHlwZS5fZ2V0RGF0ZUJ5V2Vla3NBbmREYXk9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2dldFJhbmdlSW5mbyhuKTtpZih0Pmkud2Vla3N8fDA9PT10JiZlPGkuZndlZWt8fHQ9PT1pLndlZWtzJiZlPmkubHdlZWspcmV0dXJuIG51bGw7dmFyIHI9NyoodC0xKS1pLmZ3ZWVrK2Usbz1uZXcgRGF0ZShpLnN0YXJ0LnRpbWUpO3JldHVybiBvLnNldERhdGUoK2kuc3RhcnQuZCtyKSx0aGlzLmdldERhdGVJbmZvKG8pfSx0LmNyZWF0ZT1mdW5jdGlvbihlLG4pe3ZhciBpPVtdO3JldHVybiBlLmVhY2hDb21wb25lbnQoImNhbGVuZGFyIiwoZnVuY3Rpb24ocil7dmFyIG89bmV3IHQocixlLG4pO2kucHVzaChvKSxyLmNvb3JkaW5hdGVTeXN0ZW09b30pKSxlLmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpeyJjYWxlbmRhciI9PT10LmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpJiYodC5jb29yZGluYXRlU3lzdGVtPWlbdC5nZXQoImNhbGVuZGFySW5kZXgiKXx8MF0pfSkpLGl9LHQuZGltZW5zaW9ucz1bInRpbWUiLCJ2YWx1ZSJdLHR9KCk7ZnVuY3Rpb24gR0UodCl7dmFyIGU9dC5jYWxlbmRhck1vZGVsLG49dC5zZXJpZXNNb2RlbDtyZXR1cm4gZT9lLmNvb3JkaW5hdGVTeXN0ZW06bj9uLmNvb3JkaW5hdGVTeXN0ZW06bnVsbH1mdW5jdGlvbiBXRSh0LGUpe3ZhciBuO3JldHVybiBFKGUsKGZ1bmN0aW9uKGUpe251bGwhPXRbZV0mJiJhdXRvIiE9PXRbZV0mJihuPSEwKX0pKSxufXZhciBIRT1bInRyYW5zaXRpb24iLCJlbnRlckZyb20iLCJsZWF2ZVRvIl0sWUU9SEUuY29uY2F0KFsiZW50ZXJBbmltYXRpb24iLCJ1cGRhdGVBbmltYXRpb24iLCJsZWF2ZUFuaW1hdGlvbiJdKTtmdW5jdGlvbiBYRSh0LGUsbil7aWYobiYmKCF0W25dJiZlW25dJiYodFtuXT17fSksdD10W25dLGU9ZVtuXSksdCYmZSlmb3IodmFyIGk9bj9IRTpZRSxyPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBvPWlbcl07bnVsbD09dFtvXSYmbnVsbCE9ZVtvXSYmKHRbb109ZVtvXSl9fXZhciBVRT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG4ucHJldmVudEF1dG9aPSEwLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMub3B0aW9uLmVsZW1lbnRzO3RoaXMub3B0aW9uLmVsZW1lbnRzPW51bGwsdC5wcm90b3R5cGUubWVyZ2VPcHRpb24uY2FsbCh0aGlzLGUsbiksdGhpcy5vcHRpb24uZWxlbWVudHM9aX0sZS5wcm90b3R5cGUub3B0aW9uVXBkYXRlZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9uLGk9KGU/bjp0KS5lbGVtZW50cyxyPW4uZWxlbWVudHM9ZT9bXTpuLmVsZW1lbnRzLG89W107dGhpcy5fZmxhdHRlbihpLG8sbnVsbCk7dmFyIGE9TG8ocixvLCJub3JtYWxNZXJnZSIpLHM9dGhpcy5fZWxPcHRpb25zVG9VcGRhdGU9W107RShhLChmdW5jdGlvbih0LGUpe3ZhciBuPXQubmV3T3B0aW9uO24mJihzLnB1c2gobiksZnVuY3Rpb24odCxlKXt2YXIgbj10LmV4aXN0aW5nO2lmKGUuaWQ9dC5rZXlJbmZvLmlkLCFlLnR5cGUmJm4mJihlLnR5cGU9bi50eXBlKSxudWxsPT1lLnBhcmVudElkKXt2YXIgaT1lLnBhcmVudE9wdGlvbjtpP2UucGFyZW50SWQ9aS5pZDpuJiYoZS5wYXJlbnRJZD1uLnBhcmVudElkKX1lLnBhcmVudE9wdGlvbj1udWxsfSh0LG4pLGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1BKHt9LG4pLHI9dFtlXSxvPW4uJGFjdGlvbnx8Im1lcmdlIjsibWVyZ2UiPT09bz9yPyhDKHIsaSwhMCksT3AocixpLHtpZ25vcmVTaXplOiEwfSksTnAobixyKSxYRShuLHIpLFhFKG4sciwic2hhcGUiKSxYRShuLHIsInN0eWxlIiksWEUobixyLCJleHRyYSIpLG4uY2xpcFBhdGg9ci5jbGlwUGF0aCk6dFtlXT1pOiJyZXBsYWNlIj09PW8/dFtlXT1pOiJyZW1vdmUiPT09byYmciYmKHRbZV09bnVsbCl9KHIsZSxuKSxmdW5jdGlvbih0LGUpe2lmKHQmJih0Lmh2PWUuaHY9W1dFKGUsWyJsZWZ0IiwicmlnaHQiXSksV0UoZSxbInRvcCIsImJvdHRvbSJdKV0sImdyb3VwIj09PXQudHlwZSkpe3ZhciBuPXQsaT1lO251bGw9PW4ud2lkdGgmJihuLndpZHRoPWkud2lkdGg9MCksbnVsbD09bi5oZWlnaHQmJihuLmhlaWdodD1pLmhlaWdodD0wKX19KHJbZV0sbikpfSksdGhpcyksbi5lbGVtZW50cz1CKHIsKGZ1bmN0aW9uKHQpe3JldHVybiB0JiZkZWxldGUgdC4kYWN0aW9uLG51bGwhPXR9KSl9LGUucHJvdG90eXBlLl9mbGF0dGVuPWZ1bmN0aW9uKHQsZSxuKXtFKHQsKGZ1bmN0aW9uKHQpe2lmKHQpe24mJih0LnBhcmVudE9wdGlvbj1uKSxlLnB1c2godCk7dmFyIGk9dC5jaGlsZHJlbjtpJiZpLmxlbmd0aCYmdGhpcy5fZmxhdHRlbihpLGUsdCksZGVsZXRlIHQuY2hpbGRyZW59fSksdGhpcyl9LGUucHJvdG90eXBlLnVzZUVsT3B0aW9uc1RvVXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxPcHRpb25zVG9VcGRhdGU7cmV0dXJuIHRoaXMuX2VsT3B0aW9uc1RvVXBkYXRlPW51bGwsdH0sZS50eXBlPSJncmFwaGljIixlLmRlZmF1bHRPcHRpb249e2VsZW1lbnRzOltdfSxlfSh6cCksWkU9e3BhdGg6bnVsbCxjb21wb3VuZFBhdGg6bnVsbCxncm91cDpCcixpbWFnZTpOcyx0ZXh0OlhzfSxqRT1WbygpLHFFPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLl9lbE1hcD15dCgpfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3QhPT10aGlzLl9sYXN0R3JhcGhpY01vZGVsJiZ0aGlzLl9jbGVhcigpLHRoaXMuX2xhc3RHcmFwaGljTW9kZWw9dCx0aGlzLl91cGRhdGVFbGVtZW50cyh0KSx0aGlzLl9yZWxvY2F0ZSh0LG4pfSxlLnByb3RvdHlwZS5fdXBkYXRlRWxlbWVudHM9ZnVuY3Rpb24odCl7dmFyIGU9dC51c2VFbE9wdGlvbnNUb1VwZGF0ZSgpO2lmKGUpe3ZhciBuPXRoaXMuX2VsTWFwLGk9dGhpcy5ncm91cCxyPXQuZ2V0KCJ6Iiksbz10LmdldCgiemxldmVsIik7RShlLChmdW5jdGlvbihlKXt2YXIgYT1SbyhlLmlkLG51bGwpLHM9bnVsbCE9YT9uLmdldChhKTpudWxsLGw9Um8oZS5wYXJlbnRJZCxudWxsKSx1PW51bGwhPWw/bi5nZXQobCk6aSxoPWUudHlwZSxjPWUuc3R5bGU7InRleHQiPT09aCYmYyYmZS5odiYmZS5odlsxXSYmKGMudGV4dFZlcnRpY2FsQWxpZ249Yy50ZXh0QmFzZWxpbmU9Yy52ZXJ0aWNhbEFsaWduPWMuYWxpZ249bnVsbCk7dmFyIHA9ZS50ZXh0Q29udGVudCxkPWUudGV4dENvbmZpZztpZihjJiZpUihjLGgsISFkLCEhcCkpe3ZhciBmPXJSKGMsaCwhMCk7IWQmJmYudGV4dENvbmZpZyYmKGQ9ZS50ZXh0Q29uZmlnPWYudGV4dENvbmZpZyksIXAmJmYudGV4dENvbnRlbnQmJihwPWYudGV4dENvbnRlbnQpfXZhciBnPWZ1bmN0aW9uKHQpe3JldHVybiB0PUEoe30sdCksRShbImlkIiwicGFyZW50SWQiLCIkYWN0aW9uIiwiaHYiLCJib3VuZGluZyIsInRleHRDb250ZW50IiwiY2xpcFBhdGgiXS5jb25jYXQoVHApLChmdW5jdGlvbihlKXtkZWxldGUgdFtlXX0pKSx0fShlKTt2YXIgeT1lLiRhY3Rpb258fCJtZXJnZSIsdj0ibWVyZ2UiPT09eSxtPSJyZXBsYWNlIj09PXk7aWYodil7dmFyIHg9czsoVD0hcyk/eD0kRShhLHUsZS50eXBlLG4pOih4JiYoakUoeCkuaXNOZXc9ITEpLElSKHgpKSx4JiYoZFIoeCxnLHQse2lzSW5pdDpUfSksUUUoeCxlLHIsbykpfWVsc2UgaWYobSl7SkUocyxlLG4sdCk7dmFyIF89JEUoYSx1LGUudHlwZSxuKTtfJiYoZFIoXyxnLHQse2lzSW5pdDohMH0pLFFFKF8sZSxyLG8pKX1lbHNlInJlbW92ZSI9PT15JiYoZlIocyxlKSxKRShzLGUsbix0KSk7dmFyIGI9bi5nZXQoYSk7aWYoYiYmcClpZih2KXt2YXIgdz1iLmdldFRleHRDb250ZW50KCk7dz93LmF0dHIocCk6Yi5zZXRUZXh0Q29udGVudChuZXcgWHMocCkpfWVsc2UgbSYmYi5zZXRUZXh0Q29udGVudChuZXcgWHMocCkpO2lmKGIpe3ZhciBTPWUuY2xpcFBhdGg7aWYoUyl7dmFyIE09Uy50eXBlLEk9dm9pZCAwLFQ9ITE7aWYodil7dmFyIEM9Yi5nZXRDbGlwUGF0aCgpO0k9KFQ9IUN8fGpFKEMpLnR5cGUhPT1NKT9LRShNKTpDfWVsc2UgbSYmKFQ9ITAsST1LRShNKSk7Yi5zZXRDbGlwUGF0aChJKSxkUihJLFMsdCx7aXNJbml0OlR9KSxUUihJLFMua2V5ZnJhbWVBbmltYXRpb24sdCl9dmFyIEQ9akUoYik7Yi5zZXRUZXh0Q29uZmlnKGQpLEQub3B0aW9uPWUsZnVuY3Rpb24odCxlLG4pe3ZhciBpPXJsKHQpLmV2ZW50RGF0YTt0LnNpbGVudHx8dC5pZ25vcmV8fGl8fChpPXJsKHQpLmV2ZW50RGF0YT17Y29tcG9uZW50VHlwZToiZ3JhcGhpYyIsY29tcG9uZW50SW5kZXg6ZS5jb21wb25lbnRJbmRleCxuYW1lOnQubmFtZX0pO2kmJihpLmluZm89bi5pbmZvKX0oYix0LGUpLEtoKHtlbDpiLGNvbXBvbmVudE1vZGVsOnQsaXRlbU5hbWU6Yi5uYW1lLGl0ZW1Ub29sdGlwT3B0aW9uOmUudG9vbHRpcH0pLFRSKGIsZS5rZXlmcmFtZUFuaW1hdGlvbix0KX19KSl9fSxlLnByb3RvdHlwZS5fcmVsb2NhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5vcHRpb24uZWxlbWVudHMsaT10aGlzLmdyb3VwLHI9dGhpcy5fZWxNYXAsbz1lLmdldFdpZHRoKCksYT1lLmdldEhlaWdodCgpLHM9WyJ4IiwieSJdLGw9MDtsPG4ubGVuZ3RoO2wrKyl7aWYoKGY9bnVsbCE9KGQ9Um8oKHA9bltsXSkuaWQsbnVsbCkpP3IuZ2V0KGQpOm51bGwpJiZmLmlzR3JvdXApe3ZhciB1PShnPWYucGFyZW50KT09PWksaD1qRShmKSxjPWpFKGcpO2gud2lkdGg9JHIoaC5vcHRpb24ud2lkdGgsdT9vOmMud2lkdGgpfHwwLGguaGVpZ2h0PSRyKGgub3B0aW9uLmhlaWdodCx1P2E6Yy5oZWlnaHQpfHwwfX1mb3IobD1uLmxlbmd0aC0xO2w+PTA7bC0tKXt2YXIgcCxkLGY7aWYoZj1udWxsIT0oZD1SbygocD1uW2xdKS5pZCxudWxsKSk/ci5nZXQoZCk6bnVsbCl7dmFyIGc9Zi5wYXJlbnQseT0oYz1qRShnKSx7fSksdj1McChmLHAsZz09PWk/e3dpZHRoOm8saGVpZ2h0OmF9Ont3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0sbnVsbCx7aHY6cC5odixib3VuZGluZ01vZGU6cC5ib3VuZGluZ30seSk7aWYoIWpFKGYpLmlzTmV3JiZ2KXtmb3IodmFyIG09cC50cmFuc2l0aW9uLHg9e30sXz0wO188cy5sZW5ndGg7XysrKXt2YXIgYj1zW19dLHc9eVtiXTttJiYoeVIobSl8fFAobSxiKT49MCk/eFtiXT13OmZbYl09d312aChmLHgsdCwwKX1lbHNlIGYuYXR0cih5KX19fSxlLnByb3RvdHlwZS5fY2xlYXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fZWxNYXA7ZS5lYWNoKChmdW5jdGlvbihuKXtKRShuLGpFKG4pLm9wdGlvbixlLHQuX2xhc3RHcmFwaGljTW9kZWwpfSkpLHRoaXMuX2VsTWFwPXl0KCl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhcigpfSxlLnR5cGU9ImdyYXBoaWMiLGV9KEFnKTtmdW5jdGlvbiBLRSh0KXt2YXIgZT1fdChaRSx0KT9aRVt0XTpMaCh0KTt2YXIgbj1uZXcgZSh7fSk7cmV0dXJuIGpFKG4pLnR5cGU9dCxufWZ1bmN0aW9uICRFKHQsZSxuLGkpe3ZhciByPUtFKG4pO3JldHVybiBlLmFkZChyKSxpLnNldCh0LHIpLGpFKHIpLmlkPXQsakUocikuaXNOZXc9ITAscn1mdW5jdGlvbiBKRSh0LGUsbixpKXt0JiZ0LnBhcmVudCYmKCJncm91cCI9PT10LnR5cGUmJnQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe0pFKHQsZSxuLGkpfSkpLGdSKHQsZSxpKSxuLnJlbW92ZUtleShqRSh0KS5pZCkpfWZ1bmN0aW9uIFFFKHQsZSxuLGkpe3QuaXNHcm91cHx8RShbWyJjdXJzb3IiLERhLnByb3RvdHlwZS5jdXJzb3JdLFsiemxldmVsIixpfHwwXSxbInoiLG58fDBdLFsiejIiLDBdXSwoZnVuY3Rpb24obil7dmFyIGk9blswXTtfdChlLGkpP3RbaV09cnQoZVtpXSxuWzFdKTpudWxsPT10W2ldJiYodFtpXT1uWzFdKX0pKSxFKEcoZSksKGZ1bmN0aW9uKG4pe2lmKDA9PT1uLmluZGV4T2YoIm9uIikpe3ZhciBpPWVbbl07dFtuXT1YKGkpP2k6bnVsbH19KSksX3QoZSwiZHJhZ2dhYmxlIikmJih0LmRyYWdnYWJsZT1lLmRyYWdnYWJsZSksbnVsbCE9ZS5uYW1lJiYodC5uYW1lPWUubmFtZSksbnVsbCE9ZS5pZCYmKHQuaWQ9ZS5pZCl9dmFyIHR6PVsieCIsInkiLCJyYWRpdXMiLCJhbmdsZSIsInNpbmdsZSJdLGV6PVsiY2FydGVzaWFuMmQiLCJwb2xhciIsInNpbmdsZUF4aXMiXTtmdW5jdGlvbiBueih0KXtyZXR1cm4gdCsiQXhpcyJ9ZnVuY3Rpb24gaXoodCxlKXt2YXIgbixpPXl0KCkscj1bXSxvPXl0KCk7dC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToiZGF0YVpvb20iLHF1ZXJ5OmV9LChmdW5jdGlvbih0KXtvLmdldCh0LnVpZCl8fHModCl9KSk7ZG97bj0hMSx0LmVhY2hDb21wb25lbnQoImRhdGFab29tIixhKX13aGlsZShuKTtmdW5jdGlvbiBhKHQpeyFvLmdldCh0LnVpZCkmJmZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiB0LmVhY2hUYXJnZXRBeGlzKChmdW5jdGlvbih0LG4pe3ZhciByPWkuZ2V0KHQpO3ImJnJbbl0mJihlPSEwKX0pKSxlfSh0KSYmKHModCksbj0hMCl9ZnVuY3Rpb24gcyh0KXtvLnNldCh0LnVpZCwhMCksci5wdXNoKHQpLHQuZWFjaFRhcmdldEF4aXMoKGZ1bmN0aW9uKHQsZSl7KGkuZ2V0KHQpfHxpLnNldCh0LFtdKSlbZV09ITB9KSl9cmV0dXJuIHJ9ZnVuY3Rpb24gcnoodCl7dmFyIGU9dC5lY01vZGVsLG49e2luZm9MaXN0OltdLGluZm9NYXA6eXQoKX07cmV0dXJuIHQuZWFjaFRhcmdldEF4aXMoKGZ1bmN0aW9uKHQsaSl7dmFyIHI9ZS5nZXRDb21wb25lbnQobnoodCksaSk7aWYocil7dmFyIG89ci5nZXRDb29yZFN5c01vZGVsKCk7aWYobyl7dmFyIGE9by51aWQscz1uLmluZm9NYXAuZ2V0KGEpO3N8fChzPXttb2RlbDpvLGF4aXNNb2RlbHM6W119LG4uaW5mb0xpc3QucHVzaChzKSxuLmluZm9NYXAuc2V0KGEscykpLHMuYXhpc01vZGVscy5wdXNoKHIpfX19KSksbn12YXIgb3o9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5pbmRleExpc3Q9W10sdGhpcy5pbmRleE1hcD1bXX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuaW5kZXhNYXBbdF18fCh0aGlzLmluZGV4TGlzdC5wdXNoKHQpLHRoaXMuaW5kZXhNYXBbdF09ITApfSx0fSgpLGF6PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5fYXV0b1Rocm90dGxlPSEwLG4uX25vVGFyZ2V0PSEwLG4uX3JhbmdlUHJvcE1vZGU9WyJwZXJjZW50IiwicGVyY2VudCJdLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1zeih0KTt0aGlzLnNldHRsZWRPcHRpb249aSx0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsbiksdGhpcy5fZG9Jbml0KGkpfSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1zeih0KTtDKHRoaXMub3B0aW9uLHQsITApLEModGhpcy5zZXR0bGVkT3B0aW9uLGUsITApLHRoaXMuX2RvSW5pdChlKX0sZS5wcm90b3R5cGUuX2RvSW5pdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbjt0aGlzLl9zZXREZWZhdWx0VGhyb3R0bGUodCksdGhpcy5fdXBkYXRlUmFuZ2VVc2UodCk7dmFyIG49dGhpcy5zZXR0bGVkT3B0aW9uO0UoW1sic3RhcnQiLCJzdGFydFZhbHVlIl0sWyJlbmQiLCJlbmRWYWx1ZSJdXSwoZnVuY3Rpb24odCxpKXsidmFsdWUiPT09dGhpcy5fcmFuZ2VQcm9wTW9kZVtpXSYmKGVbdFswXV09blt0WzBdXT1udWxsKX0pLHRoaXMpLHRoaXMuX3Jlc2V0VGFyZ2V0KCl9LGUucHJvdG90eXBlLl9yZXNldFRhcmdldD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KCJvcmllbnQiLCEwKSxlPXRoaXMuX3RhcmdldEF4aXNJbmZvTWFwPXl0KCk7dGhpcy5fZmlsbFNwZWNpZmllZFRhcmdldEF4aXMoZSk/dGhpcy5fb3JpZW50PXR8fHRoaXMuX21ha2VBdXRvT3JpZW50QnlUYXJnZXRBeGlzKCk6KHRoaXMuX29yaWVudD10fHwiaG9yaXpvbnRhbCIsdGhpcy5fZmlsbEF1dG9UYXJnZXRBeGlzQnlPcmllbnQoZSx0aGlzLl9vcmllbnQpKSx0aGlzLl9ub1RhcmdldD0hMCxlLmVhY2goKGZ1bmN0aW9uKHQpe3QuaW5kZXhMaXN0Lmxlbmd0aCYmKHRoaXMuX25vVGFyZ2V0PSExKX0pLHRoaXMpfSxlLnByb3RvdHlwZS5fZmlsbFNwZWNpZmllZFRhcmdldEF4aXM9ZnVuY3Rpb24odCl7dmFyIGU9ITE7cmV0dXJuIEUodHosKGZ1bmN0aW9uKG4pe3ZhciBpPXRoaXMuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cyhueihuKSxIbyk7aWYoaS5zcGVjaWZpZWQpe2U9ITA7dmFyIHI9bmV3IG96O0UoaS5tb2RlbHMsKGZ1bmN0aW9uKHQpe3IuYWRkKHQuY29tcG9uZW50SW5kZXgpfSkpLHQuc2V0KG4scil9fSksdGhpcyksZX0sZS5wcm90b3R5cGUuX2ZpbGxBdXRvVGFyZ2V0QXhpc0J5T3JpZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5lY01vZGVsLGk9ITA7aWYoaSl7dmFyIHI9InZlcnRpY2FsIj09PWU/InkiOiJ4IjtvKG4uZmluZENvbXBvbmVudHMoe21haW5UeXBlOnIrIkF4aXMifSkscil9aSYmbyhuLmZpbmRDb21wb25lbnRzKHttYWluVHlwZToic2luZ2xlQXhpcyIsZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LmdldCgib3JpZW50IiwhMCk9PT1lfX0pLCJzaW5nbGUiKTtmdW5jdGlvbiBvKGUsbil7dmFyIHI9ZVswXTtpZihyKXt2YXIgbz1uZXcgb3o7aWYoby5hZGQoci5jb21wb25lbnRJbmRleCksdC5zZXQobixvKSxpPSExLCJ4Ij09PW58fCJ5Ij09PW4pe3ZhciBhPXIuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cygiZ3JpZCIsV28pLm1vZGVsc1swXTthJiZFKGUsKGZ1bmN0aW9uKHQpe3IuY29tcG9uZW50SW5kZXghPT10LmNvbXBvbmVudEluZGV4JiZhPT09dC5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJncmlkIixXbykubW9kZWxzWzBdJiZvLmFkZCh0LmNvbXBvbmVudEluZGV4KX0pKX19fWkmJkUodHosKGZ1bmN0aW9uKGUpe2lmKGkpe3ZhciByPW4uZmluZENvbXBvbmVudHMoe21haW5UeXBlOm56KGUpLGZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4iY2F0ZWdvcnkiPT09dC5nZXQoInR5cGUiLCEwKX19KTtpZihyWzBdKXt2YXIgbz1uZXcgb3o7by5hZGQoclswXS5jb21wb25lbnRJbmRleCksdC5zZXQoZSxvKSxpPSExfX19KSx0aGlzKX0sZS5wcm90b3R5cGUuX21ha2VBdXRvT3JpZW50QnlUYXJnZXRBeGlzPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMuZWFjaFRhcmdldEF4aXMoKGZ1bmN0aW9uKGUpeyF0JiYodD1lKX0pLHRoaXMpLCJ5Ij09PXQ/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LGUucHJvdG90eXBlLl9zZXREZWZhdWx0VGhyb3R0bGU9ZnVuY3Rpb24odCl7aWYodC5oYXNPd25Qcm9wZXJ0eSgidGhyb3R0bGUiKSYmKHRoaXMuX2F1dG9UaHJvdHRsZT0hMSksdGhpcy5fYXV0b1Rocm90dGxlKXt2YXIgZT10aGlzLmVjTW9kZWwub3B0aW9uO3RoaXMub3B0aW9uLnRocm90dGxlPWUuYW5pbWF0aW9uJiZlLmFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlPjA/MTAwOjIwfX0sZS5wcm90b3R5cGUuX3VwZGF0ZVJhbmdlVXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JhbmdlUHJvcE1vZGUsbj10aGlzLmdldCgicmFuZ2VNb2RlIik7RShbWyJzdGFydCIsInN0YXJ0VmFsdWUiXSxbImVuZCIsImVuZFZhbHVlIl1dLChmdW5jdGlvbihpLHIpe3ZhciBvPW51bGwhPXRbaVswXV0sYT1udWxsIT10W2lbMV1dO28mJiFhP2Vbcl09InBlcmNlbnQiOiFvJiZhP2Vbcl09InZhbHVlIjpuP2Vbcl09bltyXTpvJiYoZVtyXT0icGVyY2VudCIpfSkpfSxlLnByb3RvdHlwZS5ub1RhcmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub1RhcmdldH0sZS5wcm90b3R5cGUuZ2V0Rmlyc3RUYXJnZXRBeGlzTW9kZWw9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy5lYWNoVGFyZ2V0QXhpcygoZnVuY3Rpb24oZSxuKXtudWxsPT10JiYodD10aGlzLmVjTW9kZWwuZ2V0Q29tcG9uZW50KG56KGUpLG4pKX0pLHRoaXMpLHR9LGUucHJvdG90eXBlLmVhY2hUYXJnZXRBeGlzPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdGFyZ2V0QXhpc0luZm9NYXAuZWFjaCgoZnVuY3Rpb24obixpKXtFKG4uaW5kZXhMaXN0LChmdW5jdGlvbihuKXt0LmNhbGwoZSxpLG4pfSkpfSkpfSxlLnByb3RvdHlwZS5nZXRBeGlzUHJveHk9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldEF4aXNNb2RlbCh0LGUpO2lmKG4pcmV0dXJuIG4uX19kekF4aXNQcm94eX0sZS5wcm90b3R5cGUuZ2V0QXhpc01vZGVsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdGFyZ2V0QXhpc0luZm9NYXAuZ2V0KHQpO2lmKG4mJm4uaW5kZXhNYXBbZV0pcmV0dXJuIHRoaXMuZWNNb2RlbC5nZXRDb21wb25lbnQobnoodCksZSl9LGUucHJvdG90eXBlLnNldFJhd1JhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLG49dGhpcy5zZXR0bGVkT3B0aW9uO0UoW1sic3RhcnQiLCJzdGFydFZhbHVlIl0sWyJlbmQiLCJlbmRWYWx1ZSJdXSwoZnVuY3Rpb24oaSl7bnVsbD09dFtpWzBdXSYmbnVsbD09dFtpWzFdXXx8KGVbaVswXV09bltpWzBdXT10W2lbMF1dLGVbaVsxXV09bltpWzFdXT10W2lbMV1dKX0pLHRoaXMpLHRoaXMuX3VwZGF0ZVJhbmdlVXNlKHQpfSxlLnByb3RvdHlwZS5zZXRDYWxjdWxhdGVkUmFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb247RShbInN0YXJ0Iiwic3RhcnRWYWx1ZSIsImVuZCIsImVuZFZhbHVlIl0sKGZ1bmN0aW9uKG4pe2Vbbl09dFtuXX0pKX0sZS5wcm90b3R5cGUuZ2V0UGVyY2VudFJhbmdlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5maW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHkoKTtpZih0KXJldHVybiB0LmdldERhdGFQZXJjZW50V2luZG93KCl9LGUucHJvdG90eXBlLmdldFZhbHVlUmFuZ2U9ZnVuY3Rpb24odCxlKXtpZihudWxsIT10fHxudWxsIT1lKXJldHVybiB0aGlzLmdldEF4aXNQcm94eSh0LGUpLmdldERhdGFWYWx1ZVdpbmRvdygpO3ZhciBuPXRoaXMuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCk7cmV0dXJuIG4/bi5nZXREYXRhVmFsdWVXaW5kb3coKTp2b2lkIDB9LGUucHJvdG90eXBlLmZpbmRSZXByZXNlbnRhdGl2ZUF4aXNQcm94eT1mdW5jdGlvbih0KXtpZih0KXJldHVybiB0Ll9fZHpBeGlzUHJveHk7Zm9yKHZhciBlLG49dGhpcy5fdGFyZ2V0QXhpc0luZm9NYXAua2V5cygpLGk9MDtpPG4ubGVuZ3RoO2krKylmb3IodmFyIHI9bltpXSxvPXRoaXMuX3RhcmdldEF4aXNJbmZvTWFwLmdldChyKSxhPTA7YTxvLmluZGV4TGlzdC5sZW5ndGg7YSsrKXt2YXIgcz10aGlzLmdldEF4aXNQcm94eShyLG8uaW5kZXhMaXN0W2FdKTtpZihzLmhvc3RlZEJ5KHRoaXMpKXJldHVybiBzO2V8fChlPXMpfXJldHVybiBlfSxlLnByb3RvdHlwZS5nZXRSYW5nZVByb3BNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlUHJvcE1vZGUuc2xpY2UoKX0sZS5wcm90b3R5cGUuZ2V0T3JpZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudH0sZS50eXBlPSJkYXRhWm9vbSIsZS5kZXBlbmRlbmNpZXM9WyJ4QXhpcyIsInlBeGlzIiwicmFkaXVzQXhpcyIsImFuZ2xlQXhpcyIsInNpbmdsZUF4aXMiLCJzZXJpZXMiLCJ0b29sYm94Il0sZS5kZWZhdWx0T3B0aW9uPXt6OjQsZmlsdGVyTW9kZToiZmlsdGVyIixzdGFydDowLGVuZDoxMDB9LGV9KHpwKTtmdW5jdGlvbiBzeih0KXt2YXIgZT17fTtyZXR1cm4gRShbInN0YXJ0IiwiZW5kIiwic3RhcnRWYWx1ZSIsImVuZFZhbHVlIiwidGhyb3R0bGUiXSwoZnVuY3Rpb24obil7dC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KSksZX12YXIgbHo9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS50eXBlPSJkYXRhWm9vbS5zZWxlY3QiLGV9KGF6KSx1ej1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5kYXRhWm9vbU1vZGVsPXQsdGhpcy5lY01vZGVsPWUsdGhpcy5hcGk9bn0sZS50eXBlPSJkYXRhWm9vbSIsZX0oQWcpLGh6PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUudHlwZT0iZGF0YVpvb20uc2VsZWN0IixlfSh1eiksY3o9RSxwej1Rcixkej1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSl7dGhpcy5fZGltTmFtZT10LHRoaXMuX2F4aXNJbmRleD1lLHRoaXMuZWNNb2RlbD1pLHRoaXMuX2RhdGFab29tTW9kZWw9bn1yZXR1cm4gdC5wcm90b3R5cGUuaG9zdGVkQnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RhdGFab29tTW9kZWw9PT10fSx0LnByb3RvdHlwZS5nZXREYXRhVmFsdWVXaW5kb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFsdWVXaW5kb3cuc2xpY2UoKX0sdC5wcm90b3R5cGUuZ2V0RGF0YVBlcmNlbnRXaW5kb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGVyY2VudFdpbmRvdy5zbGljZSgpfSx0LnByb3RvdHlwZS5nZXRUYXJnZXRTZXJpZXNNb2RlbHM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lY01vZGVsLmVhY2hTZXJpZXMoKGZ1bmN0aW9uKGUpe2lmKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIik7cmV0dXJuIFAoZXosZSk+PTB9KGUpKXt2YXIgbj1ueih0aGlzLl9kaW1OYW1lKSxpPWUuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cyhuLFdvKS5tb2RlbHNbMF07aSYmdGhpcy5fYXhpc0luZGV4PT09aS5jb21wb25lbnRJbmRleCYmdC5wdXNoKGUpfX0pLHRoaXMpLHR9LHQucHJvdG90eXBlLmdldEF4aXNNb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVjTW9kZWwuZ2V0Q29tcG9uZW50KHRoaXMuX2RpbU5hbWUrIkF4aXMiLHRoaXMuX2F4aXNJbmRleCl9LHQucHJvdG90eXBlLmdldE1pbk1heFNwYW49ZnVuY3Rpb24oKXtyZXR1cm4gVCh0aGlzLl9taW5NYXhTcGFuKX0sdC5wcm90b3R5cGUuY2FsY3VsYXRlRGF0YVdpbmRvdz1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMuX2RhdGFFeHRlbnQsaT10aGlzLmdldEF4aXNNb2RlbCgpLmF4aXMuc2NhbGUscj10aGlzLl9kYXRhWm9vbU1vZGVsLmdldFJhbmdlUHJvcE1vZGUoKSxvPVswLDEwMF0sYT1bXSxzPVtdO2N6KFsic3RhcnQiLCJlbmQiXSwoZnVuY3Rpb24obCx1KXt2YXIgaD10W2xdLGM9dFtsKyJWYWx1ZSJdOyJwZXJjZW50Ij09PXJbdV0/KG51bGw9PWgmJihoPW9bdV0pLGM9aS5wYXJzZShLcihoLG8sbikpKTooZT0hMCxoPUtyKGM9bnVsbD09Yz9uW3VdOmkucGFyc2UoYyksbixvKSksc1t1XT1udWxsPT1jfHxpc05hTihjKT9uW3VdOmMsYVt1XT1udWxsPT1ofHxpc05hTihoKT9vW3VdOmh9KSkscHoocykscHooYSk7dmFyIGw9dGhpcy5fbWluTWF4U3BhbjtmdW5jdGlvbiB1KHQsZSxuLHIsbyl7dmFyIGE9bz8iU3BhbiI6IlZhbHVlU3BhbiI7emsoMCx0LG4sImFsbCIsbFsibWluIithXSxsWyJtYXgiK2FdKTtmb3IodmFyIHM9MDtzPDI7cysrKWVbc109S3IodFtzXSxuLHIsITApLG8mJihlW3NdPWkucGFyc2UoZVtzXSkpfXJldHVybiBlP3UocyxhLG4sbywhMSk6dShhLHMsbyxuLCEwKSx7dmFsdWVXaW5kb3c6cyxwZXJjZW50V2luZG93OmF9fSx0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbih0KXtpZih0PT09dGhpcy5fZGF0YVpvb21Nb2RlbCl7dmFyIGU9dGhpcy5nZXRUYXJnZXRTZXJpZXNNb2RlbHMoKTt0aGlzLl9kYXRhRXh0ZW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1bMS8wLC0xLzBdO2N6KG4sKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUsbil7ZSYmRShDXyhlLG4pLChmdW5jdGlvbihuKXt2YXIgaT1lLmdldEFwcHJveGltYXRlRXh0ZW50KG4pO2lbMF08dFswXSYmKHRbMF09aVswXSksaVsxXT50WzFdJiYodFsxXT1pWzFdKX0pKX0oaSx0LmdldERhdGEoKSxlKX0pKTt2YXIgcj10LmdldEF4aXNNb2RlbCgpLG89dl8oci5heGlzLnNjYWxlLHIsaSkuY2FsY3VsYXRlKCk7cmV0dXJuW28ubWluLG8ubWF4XX0odGhpcyx0aGlzLl9kaW1OYW1lLGUpLHRoaXMuX3VwZGF0ZU1pbk1heFNwYW4oKTt2YXIgbj10aGlzLmNhbGN1bGF0ZURhdGFXaW5kb3codC5zZXR0bGVkT3B0aW9uKTt0aGlzLl92YWx1ZVdpbmRvdz1uLnZhbHVlV2luZG93LHRoaXMuX3BlcmNlbnRXaW5kb3c9bi5wZXJjZW50V2luZG93LHRoaXMuX3NldEF4aXNNb2RlbCgpfX0sdC5wcm90b3R5cGUuZmlsdGVyRGF0YT1mdW5jdGlvbih0LGUpe2lmKHQ9PT10aGlzLl9kYXRhWm9vbU1vZGVsKXt2YXIgbj10aGlzLl9kaW1OYW1lLGk9dGhpcy5nZXRUYXJnZXRTZXJpZXNNb2RlbHMoKSxyPXQuZ2V0KCJmaWx0ZXJNb2RlIiksbz10aGlzLl92YWx1ZVdpbmRvdzsibm9uZSIhPT1yJiZjeihpLChmdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKSxpPWUubWFwRGltZW5zaW9uc0FsbChuKTtpZihpLmxlbmd0aCl7aWYoIndlYWtGaWx0ZXIiPT09cil7dmFyIGE9ZS5nZXRTdG9yZSgpLHM9eihpLChmdW5jdGlvbih0KXtyZXR1cm4gZS5nZXREaW1lbnNpb25JbmRleCh0KX0pLGUpO2UuZmlsdGVyU2VsZigoZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4scixsPTA7bDxpLmxlbmd0aDtsKyspe3ZhciB1PWEuZ2V0KHNbbF0sdCksaD0haXNOYU4odSksYz11PG9bMF0scD11Pm9bMV07aWYoaCYmIWMmJiFwKXJldHVybiEwO2gmJihyPSEwKSxjJiYoZT0hMCkscCYmKG49ITApfXJldHVybiByJiZlJiZufSkpfWVsc2UgY3ooaSwoZnVuY3Rpb24obil7aWYoImVtcHR5Ij09PXIpdC5zZXREYXRhKGU9ZS5tYXAobiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0Pj1vWzBdJiZ0PD1vWzFdfSh0KT90Ok5hTn0pKSk7ZWxzZXt2YXIgaT17fTtpW25dPW8sZS5zZWxlY3RSYW5nZShpKX19KSk7Y3ooaSwoZnVuY3Rpb24odCl7ZS5zZXRBcHByb3hpbWF0ZUV4dGVudChvLHQpfSkpfX0pKX19LHQucHJvdG90eXBlLl91cGRhdGVNaW5NYXhTcGFuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWluTWF4U3Bhbj17fSxlPXRoaXMuX2RhdGFab29tTW9kZWwsbj10aGlzLl9kYXRhRXh0ZW50O2N6KFsibWluIiwibWF4Il0sKGZ1bmN0aW9uKGkpe3ZhciByPWUuZ2V0KGkrIlNwYW4iKSxvPWUuZ2V0KGkrIlZhbHVlU3BhbiIpO251bGwhPW8mJihvPXRoaXMuZ2V0QXhpc01vZGVsKCkuYXhpcy5zY2FsZS5wYXJzZShvKSksbnVsbCE9bz9yPUtyKG5bMF0rbyxuLFswLDEwMF0sITApOm51bGwhPXImJihvPUtyKHIsWzAsMTAwXSxuLCEwKS1uWzBdKSx0W2krIlNwYW4iXT1yLHRbaSsiVmFsdWVTcGFuIl09b30pLHRoaXMpfSx0LnByb3RvdHlwZS5fc2V0QXhpc01vZGVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRBeGlzTW9kZWwoKSxlPXRoaXMuX3BlcmNlbnRXaW5kb3csbj10aGlzLl92YWx1ZVdpbmRvdztpZihlKXt2YXIgaT1ubyhuLFswLDUwMF0pO2k9TWF0aC5taW4oaSwyMCk7dmFyIHI9dC5heGlzLnNjYWxlLnJhd0V4dGVudEluZm87MCE9PWVbMF0mJnIuc2V0RGV0ZXJtaW5lZE1pbk1heCgibWluIiwrblswXS50b0ZpeGVkKGkpKSwxMDAhPT1lWzFdJiZyLnNldERldGVybWluZWRNaW5NYXgoIm1heCIsK25bMV0udG9GaXhlZChpKSksci5mcmVlemUoKX19LHR9KCk7dmFyIGZ6PXtnZXRUYXJnZXRTZXJpZXM6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmVhY2hDb21wb25lbnQoImRhdGFab29tIiwoZnVuY3Rpb24obil7bi5lYWNoVGFyZ2V0QXhpcygoZnVuY3Rpb24oaSxyKXt2YXIgbz10LmdldENvbXBvbmVudChueihpKSxyKTtlKGkscixvLG4pfSkpfSkpfWUoKGZ1bmN0aW9uKHQsZSxuLGkpe24uX19kekF4aXNQcm94eT1udWxsfSkpO3ZhciBuPVtdO2UoKGZ1bmN0aW9uKGUsaSxyLG8pe3IuX19kekF4aXNQcm94eXx8KHIuX19kekF4aXNQcm94eT1uZXcgZHooZSxpLG8sdCksbi5wdXNoKHIuX19kekF4aXNQcm94eSkpfSkpO3ZhciBpPXl0KCk7cmV0dXJuIEUobiwoZnVuY3Rpb24odCl7RSh0LmdldFRhcmdldFNlcmllc01vZGVscygpLChmdW5jdGlvbih0KXtpLnNldCh0LnVpZCx0KX0pKX0pKSxpfSxvdmVyYWxsUmVzZXQ6ZnVuY3Rpb24odCxlKXt0LmVhY2hDb21wb25lbnQoImRhdGFab29tIiwoZnVuY3Rpb24odCl7dC5lYWNoVGFyZ2V0QXhpcygoZnVuY3Rpb24oZSxuKXt0LmdldEF4aXNQcm94eShlLG4pLnJlc2V0KHQpfSkpLHQuZWFjaFRhcmdldEF4aXMoKGZ1bmN0aW9uKG4saSl7dC5nZXRBeGlzUHJveHkobixpKS5maWx0ZXJEYXRhKHQsZSl9KSl9KSksdC5lYWNoQ29tcG9uZW50KCJkYXRhWm9vbSIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCk7aWYoZSl7dmFyIG49ZS5nZXREYXRhUGVyY2VudFdpbmRvdygpLGk9ZS5nZXREYXRhVmFsdWVXaW5kb3coKTt0LnNldENhbGN1bGF0ZWRSYW5nZSh7c3RhcnQ6blswXSxlbmQ6blsxXSxzdGFydFZhbHVlOmlbMF0sZW5kVmFsdWU6aVsxXX0pfX0pKX19O3ZhciBnej0hMTtmdW5jdGlvbiB5eih0KXtnenx8KGd6PSEwLHQucmVnaXN0ZXJQcm9jZXNzb3IodC5QUklPUklUWS5QUk9DRVNTT1IuRklMVEVSLGZ6KSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQWN0aW9uKCJkYXRhWm9vbSIsKGZ1bmN0aW9uKHQsZSl7RShpeihlLHQpLChmdW5jdGlvbihlKXtlLnNldFJhd1JhbmdlKHtzdGFydDp0LnN0YXJ0LGVuZDp0LmVuZCxzdGFydFZhbHVlOnQuc3RhcnRWYWx1ZSxlbmRWYWx1ZTp0LmVuZFZhbHVlfSl9KSl9KSl9KHQpLHQucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyKCJkYXRhWm9vbSIsKGZ1bmN0aW9uKCl7cmV0dXJuInNsaWRlciJ9KSkpfWZ1bmN0aW9uIHZ6KHQpe3QucmVnaXN0ZXJDb21wb25lbnRNb2RlbChseiksdC5yZWdpc3RlckNvbXBvbmVudFZpZXcoaHopLHl6KHQpfXZhciBtej1mdW5jdGlvbigpe30seHo9e307ZnVuY3Rpb24gX3oodCxlKXt4elt0XT1lfWZ1bmN0aW9uIGJ6KHQpe3JldHVybiB4elt0XX12YXIgd3o9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUub3B0aW9uVXBkYXRlZD1mdW5jdGlvbigpe3QucHJvdG90eXBlLm9wdGlvblVwZGF0ZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPXRoaXMuZWNNb2RlbDtFKHRoaXMub3B0aW9uLmZlYXR1cmUsKGZ1bmN0aW9uKHQsbil7dmFyIGk9Ynoobik7aSYmKGkuZ2V0RGVmYXVsdE9wdGlvbiYmKGkuZGVmYXVsdE9wdGlvbj1pLmdldERlZmF1bHRPcHRpb24oZSkpLEModCxpLmRlZmF1bHRPcHRpb24pKX0pKX0sZS50eXBlPSJ0b29sYm94IixlLmxheW91dE1vZGU9e3R5cGU6ImJveCIsaWdub3JlU2l6ZTohMH0sZS5kZWZhdWx0T3B0aW9uPXtzaG93OiEwLHo6NixvcmllbnQ6Imhvcml6b250YWwiLGxlZnQ6InJpZ2h0Iix0b3A6InRvcCIsYmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYm9yZGVyQ29sb3I6IiNjY2MiLGJvcmRlclJhZGl1czowLGJvcmRlcldpZHRoOjAscGFkZGluZzo1LGl0ZW1TaXplOjE1LGl0ZW1HYXA6OCxzaG93VGl0bGU6ITAsaWNvblN0eWxlOntib3JkZXJDb2xvcjoiIzY2NiIsY29sb3I6Im5vbmUifSxlbXBoYXNpczp7aWNvblN0eWxlOntib3JkZXJDb2xvcjoiIzNFOThDNSJ9fSx0b29sdGlwOntzaG93OiExLHBvc2l0aW9uOiJib3R0b20ifX0sZX0oenApO2Z1bmN0aW9uIFN6KHQsZSl7dmFyIG49dnAoZS5nZXQoInBhZGRpbmciKSksaT1lLmdldEl0ZW1TdHlsZShbImNvbG9yIiwib3BhY2l0eSJdKTtyZXR1cm4gaS5maWxsPWUuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKSx0PW5ldyBXcyh7c2hhcGU6e3g6dC54LW5bM10seTp0LnktblswXSx3aWR0aDp0LndpZHRoK25bMV0rblszXSxoZWlnaHQ6dC5oZWlnaHQrblswXStuWzJdLHI6ZS5nZXQoImJvcmRlclJhZGl1cyIpfSxzdHlsZTppLHNpbGVudDohMCx6MjotMX0pfXZhciBNej1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLmdyb3VwO2lmKHIucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciKSl7dmFyIG89K3QuZ2V0KCJpdGVtU2l6ZSIpLGE9InZlcnRpY2FsIj09PXQuZ2V0KCJvcmllbnQiKSxzPXQuZ2V0KCJmZWF0dXJlIil8fHt9LGw9dGhpcy5fZmVhdHVyZXN8fCh0aGlzLl9mZWF0dXJlcz17fSksdT1bXTtFKHMsKGZ1bmN0aW9uKHQsZSl7dS5wdXNoKGUpfSkpLG5ldyBHbSh0aGlzLl9mZWF0dXJlTmFtZXN8fFtdLHUpLmFkZChoKS51cGRhdGUoaCkucmVtb3ZlKEgoaCxudWxsKSkuZXhlY3V0ZSgpLHRoaXMuX2ZlYXR1cmVOYW1lcz11LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1lLmdldEJveExheW91dFBhcmFtcygpLHI9ZS5nZXQoInBhZGRpbmciKSxvPXt3aWR0aDpuLmdldFdpZHRoKCksaGVpZ2h0Om4uZ2V0SGVpZ2h0KCl9LGE9a3AoaSxvLHIpO0FwKGUuZ2V0KCJvcmllbnQiKSx0LGUuZ2V0KCJpdGVtR2FwIiksYS53aWR0aCxhLmhlaWdodCksTHAodCxpLG8scil9KHIsdCxuKSxyLmFkZChTeihyLmdldEJvdW5kaW5nUmVjdCgpLHQpKSxhfHxyLmVhY2hDaGlsZCgoZnVuY3Rpb24odCl7dmFyIGU9dC5fX3RpdGxlLGk9dC5lbnN1cmVTdGF0ZSgiZW1waGFzaXMiKSxhPWkudGV4dENvbmZpZ3x8KGkudGV4dENvbmZpZz17fSkscz10LmdldFRleHRDb250ZW50KCksbD1zJiZzLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpO2lmKGwmJiFYKGwpJiZlKXt2YXIgdT1sLnN0eWxlfHwobC5zdHlsZT17fSksaD1TcihlLFhzLm1ha2VGb250KHUpKSxjPXQueCtyLngscD0hMTt0Lnkrci55K28raC5oZWlnaHQ+bi5nZXRIZWlnaHQoKSYmKGEucG9zaXRpb249InRvcCIscD0hMCk7dmFyIGQ9cD8tNS1oLmhlaWdodDpvKzEwO2MraC53aWR0aC8yPm4uZ2V0V2lkdGgoKT8oYS5wb3NpdGlvbj1bIjEwMCUiLGRdLHUuYWxpZ249InJpZ2h0Iik6Yy1oLndpZHRoLzI8MCYmKGEucG9zaXRpb249WzAsZF0sdS5hbGlnbj0ibGVmdCIpfX0pKX1mdW5jdGlvbiBoKGgsYyl7dmFyIHAsZD11W2hdLGY9dVtjXSxnPXNbZF0seT1uZXcgQ2MoZyx0LHQuZWNNb2RlbCk7aWYoaSYmbnVsbCE9aS5uZXdUaXRsZSYmaS5mZWF0dXJlTmFtZT09PWQmJihnLnRpdGxlPWkubmV3VGl0bGUpLGQmJiFmKXtpZihmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuaW5kZXhPZigibXkiKX0oZCkpcD17b25jbGljazp5Lm9wdGlvbi5vbmNsaWNrLGZlYXR1cmVOYW1lOmR9O2Vsc2V7dmFyIHY9YnooZCk7aWYoIXYpcmV0dXJuO3A9bmV3IHZ9bFtkXT1wfWVsc2UgaWYoIShwPWxbZl0pKXJldHVybjtwLnVpZD1BYygidG9vbGJveC1mZWF0dXJlIikscC5tb2RlbD15LHAuZWNNb2RlbD1lLHAuYXBpPW47dmFyIG09cCBpbnN0YW5jZW9mIG16O2R8fCFmPyF5LmdldCgic2hvdyIpfHxtJiZwLnVudXNhYmxlP20mJnAucmVtb3ZlJiZwLnJlbW92ZShlLG4pOighZnVuY3Rpb24oaSxzLGwpe3ZhciB1LGgsYz1pLmdldE1vZGVsKCJpY29uU3R5bGUiKSxwPWkuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsImljb25TdHlsZSJdKSxkPXMgaW5zdGFuY2VvZiBteiYmcy5nZXRJY29ucz9zLmdldEljb25zKCk6aS5nZXQoImljb24iKSxmPWkuZ2V0KCJ0aXRsZSIpfHx7fTtVKGQpPyh1PXt9KVtsXT1kOnU9ZDtVKGYpPyhoPXt9KVtsXT1mOmg9Zjt2YXIgZz1pLmljb25QYXRocz17fTtFKHUsKGZ1bmN0aW9uKGwsdSl7dmFyIGQ9VWgobCx7fSx7eDotby8yLHk6LW8vMix3aWR0aDpvLGhlaWdodDpvfSk7ZC5zZXRTdHlsZShjLmdldEl0ZW1TdHlsZSgpKSxkLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPXAuZ2V0SXRlbVN0eWxlKCk7dmFyIGY9bmV3IFhzKHtzdHlsZTp7dGV4dDpoW3VdLGFsaWduOnAuZ2V0KCJ0ZXh0QWxpZ24iKSxib3JkZXJSYWRpdXM6cC5nZXQoInRleHRCb3JkZXJSYWRpdXMiKSxwYWRkaW5nOnAuZ2V0KCJ0ZXh0UGFkZGluZyIpLGZpbGw6bnVsbCxmb250OmNjKHtmb250U3R5bGU6cC5nZXQoInRleHRGb250U3R5bGUiKSxmb250RmFtaWx5OnAuZ2V0KCJ0ZXh0Rm9udEZhbWlseSIpLGZvbnRTaXplOnAuZ2V0KCJ0ZXh0Rm9udFNpemUiKSxmb250V2VpZ2h0OnAuZ2V0KCJ0ZXh0Rm9udFdlaWdodCIpfSxlKX0saWdub3JlOiEwfSk7ZC5zZXRUZXh0Q29udGVudChmKSxLaCh7ZWw6ZCxjb21wb25lbnRNb2RlbDp0LGl0ZW1OYW1lOnUsZm9ybWF0dGVyUGFyYW1zRXh0cmE6e3RpdGxlOmhbdV19fSksZC5fX3RpdGxlPWhbdV0sZC5vbigibW91c2VvdmVyIiwoZnVuY3Rpb24oKXt2YXIgZT1wLmdldEl0ZW1TdHlsZSgpLGk9YT9udWxsPT10LmdldCgicmlnaHQiKSYmInJpZ2h0IiE9PXQuZ2V0KCJsZWZ0Iik/InJpZ2h0IjoibGVmdCI6bnVsbD09dC5nZXQoImJvdHRvbSIpJiYiYm90dG9tIiE9PXQuZ2V0KCJ0b3AiKT8iYm90dG9tIjoidG9wIjtmLnNldFN0eWxlKHtmaWxsOnAuZ2V0KCJ0ZXh0RmlsbCIpfHxlLmZpbGx8fGUuc3Ryb2tlfHwiIzAwMCIsYmFja2dyb3VuZENvbG9yOnAuZ2V0KCJ0ZXh0QmFja2dyb3VuZENvbG9yIil9KSxkLnNldFRleHRDb25maWcoe3Bvc2l0aW9uOnAuZ2V0KCJ0ZXh0UG9zaXRpb24iKXx8aX0pLGYuaWdub3JlPSF0LmdldCgic2hvd1RpdGxlIiksbi5lbnRlckVtcGhhc2lzKHRoaXMpfSkpLm9uKCJtb3VzZW91dCIsKGZ1bmN0aW9uKCl7ImVtcGhhc2lzIiE9PWkuZ2V0KFsiaWNvblN0YXR1cyIsdV0pJiZuLmxlYXZlRW1waGFzaXModGhpcyksZi5oaWRlKCl9KSksKCJlbXBoYXNpcyI9PT1pLmdldChbImljb25TdGF0dXMiLHVdKT9PbDpSbCkoZCksci5hZGQoZCksZC5vbigiY2xpY2siLFcocy5vbmNsaWNrLHMsZSxuLHUpKSxnW3VdPWR9KSl9KHkscCxkKSx5LnNldEljb25TdGF0dXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLm9wdGlvbixpPXRoaXMuaWNvblBhdGhzO24uaWNvblN0YXR1cz1uLmljb25TdGF0dXN8fHt9LG4uaWNvblN0YXR1c1t0XT1lLGlbdF0mJigiZW1waGFzaXMiPT09ZT9PbDpSbCkoaVt0XSl9LHAgaW5zdGFuY2VvZiBteiYmcC5yZW5kZXImJnAucmVuZGVyKHksZSxuLGkpKTptJiZwLmRpc3Bvc2UmJnAuZGlzcG9zZShlLG4pfX0sZS5wcm90b3R5cGUudXBkYXRlVmlldz1mdW5jdGlvbih0LGUsbixpKXtFKHRoaXMuX2ZlYXR1cmVzLChmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgbXomJnQudXBkYXRlVmlldyYmdC51cGRhdGVWaWV3KHQubW9kZWwsZSxuLGkpfSkpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXtFKHRoaXMuX2ZlYXR1cmVzLChmdW5jdGlvbihuKXtuIGluc3RhbmNlb2YgbXomJm4ucmVtb3ZlJiZuLnJlbW92ZSh0LGUpfSkpLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24odCxlKXtFKHRoaXMuX2ZlYXR1cmVzLChmdW5jdGlvbihuKXtuIGluc3RhbmNlb2YgbXomJm4uZGlzcG9zZSYmbi5kaXNwb3NlKHQsZSl9KSl9LGUudHlwZT0idG9vbGJveCIsZX0oQWcpO3ZhciBJej1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLm9uY2xpY2s9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLm1vZGVsLGk9bi5nZXQoIm5hbWUiKXx8dC5nZXQoInRpdGxlLjAudGV4dCIpfHwiZWNoYXJ0cyIsbz0ic3ZnIj09PWUuZ2V0WnIoKS5wYWludGVyLmdldFR5cGUoKSxhPW8/InN2ZyI6bi5nZXQoInR5cGUiLCEwKXx8InBuZyIscz1lLmdldENvbm5lY3RlZERhdGFVUkwoe3R5cGU6YSxiYWNrZ3JvdW5kQ29sb3I6bi5nZXQoImJhY2tncm91bmRDb2xvciIsITApfHx0LmdldCgiYmFja2dyb3VuZENvbG9yIil8fCIjZmZmIixjb25uZWN0ZWRCYWNrZ3JvdW5kQ29sb3I6bi5nZXQoImNvbm5lY3RlZEJhY2tncm91bmRDb2xvciIpLGV4Y2x1ZGVDb21wb25lbnRzOm4uZ2V0KCJleGNsdWRlQ29tcG9uZW50cyIpLHBpeGVsUmF0aW86bi5nZXQoInBpeGVsUmF0aW8iKX0pLGw9ci5icm93c2VyO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBNb3VzZUV2ZW50fHwhbC5uZXdFZGdlJiYobC5pZXx8bC5lZGdlKSlpZih3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2J8fG8pe3ZhciB1PXMuc3BsaXQoIiwiKSxoPXVbMF0uaW5kZXhPZigiYmFzZTY0Iik+LTEsYz1vP2RlY29kZVVSSUNvbXBvbmVudCh1WzFdKTp1WzFdO2gmJihjPXdpbmRvdy5hdG9iKGMpKTt2YXIgcD1pKyIuIithO2lmKHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYil7Zm9yKHZhciBkPWMubGVuZ3RoLGY9bmV3IFVpbnQ4QXJyYXkoZCk7ZC0tOylmW2RdPWMuY2hhckNvZGVBdChkKTt2YXIgZz1uZXcgQmxvYihbZl0pO3dpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihnLHApfWVsc2V7dmFyIHk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh5KTt2YXIgdj15LmNvbnRlbnRXaW5kb3csbT12LmRvY3VtZW50O20ub3BlbigiaW1hZ2Uvc3ZnK3htbCIsInJlcGxhY2UiKSxtLndyaXRlKGMpLG0uY2xvc2UoKSx2LmZvY3VzKCksbS5leGVjQ29tbWFuZCgiU2F2ZUFzIiwhMCxwKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHkpfX1lbHNle3ZhciB4PW4uZ2V0KCJsYW5nIiksXz0nPGJvZHkgc3R5bGU9Im1hcmdpbjowOyI+PGltZyBzcmM9IicrcysnIiBzdHlsZT0ibWF4LXdpZHRoOjEwMCU7IiB0aXRsZT0iJysoeCYmeFswXXx8IiIpKyciIC8+PC9ib2R5PicsYj13aW5kb3cub3BlbigpO2IuZG9jdW1lbnQud3JpdGUoXyksYi5kb2N1bWVudC50aXRsZT1pfWVsc2V7dmFyIHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO3cuZG93bmxvYWQ9aSsiLiIrYSx3LnRhcmdldD0iX2JsYW5rIix3LmhyZWY9czt2YXIgUz1uZXcgTW91c2VFdmVudCgiY2xpY2siLHt2aWV3OmRvY3VtZW50LmRlZmF1bHRWaWV3LGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMX0pO3cuZGlzcGF0Y2hFdmVudChTKX19LGUuZ2V0RGVmYXVsdE9wdGlvbj1mdW5jdGlvbih0KXtyZXR1cm57c2hvdzohMCxpY29uOiJNNC43LDIyLjlMMjkuMyw0NS41TDU0LjcsMjMuNE00LjYsNDMuNkw0LjYsNThMNTMuOCw1OEw1My44LDQzLjZNMjkuMiw0NS4xTDI5LjIsMCIsdGl0bGU6dC5nZXRMb2NhbGVNb2RlbCgpLmdldChbInRvb2xib3giLCJzYXZlQXNJbWFnZSIsInRpdGxlIl0pLHR5cGU6InBuZyIsY29ubmVjdGVkQmFja2dyb3VuZENvbG9yOiIjZmZmIixuYW1lOiIiLGV4Y2x1ZGVDb21wb25lbnRzOlsidG9vbGJveCJdLGxhbmc6dC5nZXRMb2NhbGVNb2RlbCgpLmdldChbInRvb2xib3giLCJzYXZlQXNJbWFnZSIsImxhbmciXSl9fSxlfShteiksVHo9Il9fZWNfbWFnaWNUeXBlX3N0YWNrX18iLEN6PVtbImxpbmUiLCJiYXIiXSxbInN0YWNrIl1dLER6PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuZ2V0SWNvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLGU9dC5nZXQoImljb24iKSxuPXt9O3JldHVybiBFKHQuZ2V0KCJ0eXBlIiksKGZ1bmN0aW9uKHQpe2VbdF0mJihuW3RdPWVbdF0pfSkpLG59LGUuZ2V0RGVmYXVsdE9wdGlvbj1mdW5jdGlvbih0KXtyZXR1cm57c2hvdzohMCx0eXBlOltdLGljb246e2xpbmU6Ik00LjEsMjguOWg3LjFsOS4zLTIybDcuNCwzOGw5LjctMTkuN2wzLDEyLjhoMTQuOU00LjEsNThoNTEuNCIsYmFyOiJNNi43LDIyLjloMTBWNDhoLTEwVjIyLjl6TTI0LjksMTNoMTB2MzVoLTEwVjEzek00My4yLDJoMTB2NDZoLTEwVjJ6TTMuMSw1OGg1My43IixzdGFjazoiTTguMiwzOC40bC04LjQsNC4xbDMwLjYsMTUuM0w2MCw0Mi41bC04LjEtNC4xbC0yMS41LDExTDguMiwzOC40eiBNNTEuOSwzMGwtOC4xLDQuMmwtMTMuNCw2LjlsLTEzLjktNi45TDguMiwzMGwtOC40LDQuMmw4LjQsNC4ybDIyLjIsMTFsMjEuNS0xMWw4LjEtNC4yTDUxLjksMzB6IE01MS45LDIxLjdsLTguMSw0LjJMMzUuNywzMGwtNS4zLDIuOEwyNC45LDMwbC04LjQtNC4xbC04LjMtNC4ybC04LjQsNC4yTDguMiwzMGw4LjMsNC4ybDEzLjksNi45bDEzLjQtNi45bDguMS00LjJsOC4xLTQuMUw1MS45LDIxLjd6TTMwLjQsMi4yTC0wLjIsMTcuNWw4LjQsNC4xbDguMyw0LjJsOC40LDQuMmw1LjUsMi43bDUuMy0yLjdsOC4xLTQuMmw4LjEtNC4ybDguMS00LjFMMzAuNCwyLjJ6In0sdGl0bGU6dC5nZXRMb2NhbGVNb2RlbCgpLmdldChbInRvb2xib3giLCJtYWdpY1R5cGUiLCJ0aXRsZSJdKSxvcHRpb246e30sc2VyaWVzSW5kZXg6e319fSxlLnByb3RvdHlwZS5vbmNsaWNrPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLm1vZGVsLHI9aS5nZXQoWyJzZXJpZXNJbmRleCIsbl0pO2lmKEF6W25dKXt2YXIgbyxhPXtzZXJpZXM6W119O0UoQ3osKGZ1bmN0aW9uKHQpe1AodCxuKT49MCYmRSh0LChmdW5jdGlvbih0KXtpLnNldEljb25TdGF0dXModCwibm9ybWFsIil9KSl9KSksaS5zZXRJY29uU3RhdHVzKG4sImVtcGhhc2lzIiksdC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToic2VyaWVzIixxdWVyeTpudWxsPT1yP251bGw6e3Nlcmllc0luZGV4OnJ9fSwoZnVuY3Rpb24odCl7dmFyIGU9dC5zdWJUeXBlLHI9dC5pZCxvPUF6W25dKGUscix0LGkpO28mJihrKG8sdC5vcHRpb24pLGEuc2VyaWVzLnB1c2gobykpO3ZhciBzPXQuY29vcmRpbmF0ZVN5c3RlbTtpZihzJiYiY2FydGVzaWFuMmQiPT09cy50eXBlJiYoImxpbmUiPT09bnx8ImJhciI9PT1uKSl7dmFyIGw9cy5nZXRBeGVzQnlTY2FsZSgib3JkaW5hbCIpWzBdO2lmKGwpe3ZhciB1PWwuZGltKyJBeGlzIixoPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cyh1LFdvKS5tb2RlbHNbMF0uY29tcG9uZW50SW5kZXg7YVt1XT1hW3VdfHxbXTtmb3IodmFyIGM9MDtjPD1oO2MrKylhW3VdW2hdPWFbdV1baF18fHt9O2FbdV1baF0uYm91bmRhcnlHYXA9ImJhciI9PT1ufX19KSk7dmFyIHM9bjsic3RhY2siPT09biYmKG89Qyh7c3RhY2s6aS5vcHRpb24udGl0bGUudGlsZWQsdGlsZWQ6aS5vcHRpb24udGl0bGUuc3RhY2t9LGkub3B0aW9uLnRpdGxlKSwiZW1waGFzaXMiIT09aS5nZXQoWyJpY29uU3RhdHVzIixuXSkmJihzPSJ0aWxlZCIpKSxlLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJjaGFuZ2VNYWdpY1R5cGUiLGN1cnJlbnRUeXBlOnMsbmV3T3B0aW9uOmEsbmV3VGl0bGU6byxmZWF0dXJlTmFtZToibWFnaWNUeXBlIn0pfX0sZX0obXopLEF6PXtsaW5lOmZ1bmN0aW9uKHQsZSxuLGkpe2lmKCJiYXIiPT09dClyZXR1cm4gQyh7aWQ6ZSx0eXBlOiJsaW5lIixkYXRhOm4uZ2V0KCJkYXRhIiksc3RhY2s6bi5nZXQoInN0YWNrIiksbWFya1BvaW50Om4uZ2V0KCJtYXJrUG9pbnQiKSxtYXJrTGluZTpuLmdldCgibWFya0xpbmUiKX0saS5nZXQoWyJvcHRpb24iLCJsaW5lIl0pfHx7fSwhMCl9LGJhcjpmdW5jdGlvbih0LGUsbixpKXtpZigibGluZSI9PT10KXJldHVybiBDKHtpZDplLHR5cGU6ImJhciIsZGF0YTpuLmdldCgiZGF0YSIpLHN0YWNrOm4uZ2V0KCJzdGFjayIpLG1hcmtQb2ludDpuLmdldCgibWFya1BvaW50IiksbWFya0xpbmU6bi5nZXQoIm1hcmtMaW5lIil9LGkuZ2V0KFsib3B0aW9uIiwiYmFyIl0pfHx7fSwhMCl9LHN0YWNrOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uZ2V0KCJzdGFjayIpPT09VHo7aWYoImxpbmUiPT09dHx8ImJhciI9PT10KXJldHVybiBpLnNldEljb25TdGF0dXMoInN0YWNrIixyPyJub3JtYWwiOiJlbXBoYXNpcyIpLEMoe2lkOmUsc3RhY2s6cj8iIjpUen0saS5nZXQoWyJvcHRpb24iLCJzdGFjayJdKXx8e30sITApfX07Q20oe3R5cGU6ImNoYW5nZU1hZ2ljVHlwZSIsZXZlbnQ6Im1hZ2ljVHlwZUNoYW5nZWQiLHVwZGF0ZToicHJlcGFyZUFuZFVwZGF0ZSJ9LChmdW5jdGlvbih0LGUpe2UubWVyZ2VPcHRpb24odC5uZXdPcHRpb24pfSkpO3ZhciBrej1uZXcgQXJyYXkoNjApLmpvaW4oIi0iKSxMej0iXHQiO2Z1bmN0aW9uIFB6KHQpe3JldHVybiB0LnJlcGxhY2UoL15cc1xzKi8sIiIpLnJlcGxhY2UoL1xzXHMqJC8sIiIpfXZhciBPej1uZXcgUmVnRXhwKCJbXHRdKyIsImciKTtmdW5jdGlvbiBSeih0LGUpe3ZhciBuPXQuc3BsaXQobmV3IFJlZ0V4cCgiXG4qIitreisiXG4qIiwiZyIpKSxpPXtzZXJpZXM6W119O3JldHVybiBFKG4sKGZ1bmN0aW9uKHQsbil7aWYoZnVuY3Rpb24odCl7aWYodC5zbGljZSgwLHQuaW5kZXhPZigiXG4iKSkuaW5kZXhPZihMeik+PTApcmV0dXJuITB9KHQpKXt2YXIgcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5zcGxpdCgvXG4rL2cpLG49W10saT16KFB6KGUuc2hpZnQoKSkuc3BsaXQoT3opLChmdW5jdGlvbih0KXtyZXR1cm57bmFtZTp0LGRhdGE6W119fSkpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89UHooZVtyXSkuc3BsaXQoT3opO24ucHVzaChvLnNoaWZ0KCkpO2Zvcih2YXIgYT0wO2E8by5sZW5ndGg7YSsrKWlbYV0mJihpW2FdLmRhdGFbcl09b1thXSl9cmV0dXJue3NlcmllczppLGNhdGVnb3JpZXM6bn19KHQpLG89ZVtuXSxhPW8uYXhpc0RpbSsiQXhpcyI7byYmKGlbYV09aVthXXx8W10saVthXVtvLmF4aXNJbmRleF09e2RhdGE6ci5jYXRlZ29yaWVzfSxpLnNlcmllcz1pLnNlcmllcy5jb25jYXQoci5zZXJpZXMpKX1lbHNle3I9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuc3BsaXQoL1xuKy9nKSxuPVB6KGUuc2hpZnQoKSksaT1bXSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBvPVB6KGVbcl0pO2lmKG8pe3ZhciBhPW8uc3BsaXQoT3opLHM9IiIsbD12b2lkIDAsdT0hMTtpc05hTihhWzBdKT8odT0hMCxzPWFbMF0sYT1hLnNsaWNlKDEpLGlbcl09e25hbWU6cyx2YWx1ZTpbXX0sbD1pW3JdLnZhbHVlKTpsPWlbcl09W107Zm9yKHZhciBoPTA7aDxhLmxlbmd0aDtoKyspbC5wdXNoKCthW2hdKTsxPT09bC5sZW5ndGgmJih1P2lbcl0udmFsdWU9bFswXTppW3JdPWxbMF0pfX1yZXR1cm57bmFtZTpuLGRhdGE6aX19KHQpO2kuc2VyaWVzLnB1c2gocil9fSkpLGl9dmFyIE56PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUub25jbGljaz1mdW5jdGlvbih0LGUpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5kaXNwYXRjaEFjdGlvbih7dHlwZToiaGlkZVRpcCJ9KX0pKTt2YXIgbj1lLmdldERvbSgpLGk9dGhpcy5tb2RlbDt0aGlzLl9kb20mJm4ucmVtb3ZlQ2hpbGQodGhpcy5fZG9tKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3BhZGRpbmc6NXB4IixyLnN0eWxlLmJhY2tncm91bmRDb2xvcj1pLmdldCgiYmFja2dyb3VuZENvbG9yIil8fCIjZmZmIjt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoNCIpLGE9aS5nZXQoImxhbmciKXx8W107by5pbm5lckhUTUw9YVswXXx8aS5nZXQoInRpdGxlIiksby5zdHlsZS5jc3NUZXh0PSJtYXJnaW46MTBweCAyMHB4IixvLnN0eWxlLmNvbG9yPWkuZ2V0KCJ0ZXh0Q29sb3IiKTt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7cy5zdHlsZS5jc3NUZXh0PSJvdmVyZmxvdzphdXRvIjt2YXIgdT1pLmdldCgib3B0aW9uVG9Db250ZW50IiksaD1pLmdldCgiY29udGVudFRvT3B0aW9uIiksYz1mdW5jdGlvbih0KXt2YXIgZSxuLGkscj1mdW5jdGlvbih0KXt2YXIgZT17fSxuPVtdLGk9W107cmV0dXJuIHQuZWFjaFJhd1NlcmllcygoZnVuY3Rpb24odCl7dmFyIHI9dC5jb29yZGluYXRlU3lzdGVtO2lmKCFyfHwiY2FydGVzaWFuMmQiIT09ci50eXBlJiYicG9sYXIiIT09ci50eXBlKW4ucHVzaCh0KTtlbHNle3ZhciBvPXIuZ2V0QmFzZUF4aXMoKTtpZigiY2F0ZWdvcnkiPT09by50eXBlKXt2YXIgYT1vLmRpbSsiXyIrby5pbmRleDtlW2FdfHwoZVthXT17Y2F0ZWdvcnlBeGlzOm8sdmFsdWVBeGlzOnIuZ2V0T3RoZXJBeGlzKG8pLHNlcmllczpbXX0saS5wdXNoKHtheGlzRGltOm8uZGltLGF4aXNJbmRleDpvLmluZGV4fSkpLGVbYV0uc2VyaWVzLnB1c2godCl9ZWxzZSBuLnB1c2godCl9fSkpLHtzZXJpZXNHcm91cEJ5Q2F0ZWdvcnlBeGlzOmUsb3RoZXI6bixtZXRhOml9fSh0KTtyZXR1cm57dmFsdWU6QihbKG49ci5zZXJpZXNHcm91cEJ5Q2F0ZWdvcnlBeGlzLGk9W10sRShuLChmdW5jdGlvbih0LGUpe3ZhciBuPXQuY2F0ZWdvcnlBeGlzLHI9dC52YWx1ZUF4aXMuZGltLG89WyIgIl0uY29uY2F0KHoodC5zZXJpZXMsKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KSkpLGE9W24ubW9kZWwuZ2V0Q2F0ZWdvcmllcygpXTtFKHQuc2VyaWVzLChmdW5jdGlvbih0KXt2YXIgZT10LmdldFJhd0RhdGEoKTthLnB1c2godC5nZXRSYXdEYXRhKCkubWFwQXJyYXkoZS5tYXBEaW1lbnNpb24ociksKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpKX0pKTtmb3IodmFyIHM9W28uam9pbihMeildLGw9MDtsPGFbMF0ubGVuZ3RoO2wrKyl7Zm9yKHZhciB1PVtdLGg9MDtoPGEubGVuZ3RoO2grKyl1LnB1c2goYVtoXVtsXSk7cy5wdXNoKHUuam9pbihMeikpfWkucHVzaChzLmpvaW4oIlxuIikpfSkpLGkuam9pbigiXG5cbiIra3orIlxuXG4iKSksKGU9ci5vdGhlcix6KGUsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0UmF3RGF0YSgpLG49W3QubmFtZV0saT1bXTtyZXR1cm4gZS5lYWNoKGUuZGltZW5zaW9ucywoZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPWFyZ3VtZW50c1t0LTFdLG89ZS5nZXROYW1lKHIpLGE9MDthPHQtMTthKyspaVthXT1hcmd1bWVudHNbYV07bi5wdXNoKChvP28rTHo6IiIpK2kuam9pbihMeikpfSkpLG4uam9pbigiXG4iKX0pKS5qb2luKCJcblxuIitreisiXG5cbiIpKV0sKGZ1bmN0aW9uKHQpe3JldHVybiEhdC5yZXBsYWNlKC9bXG5cdFxzXS9nLCIiKX0pKS5qb2luKCJcblxuIitreisiXG5cbiIpLG1ldGE6ci5tZXRhfX0odCk7aWYoWCh1KSl7dmFyIHA9dShlLmdldE9wdGlvbigpKTtVKHApP3MuaW5uZXJIVE1MPXA6SihwKSYmcy5hcHBlbmRDaGlsZChwKX1lbHNle2wucmVhZE9ubHk9aS5nZXQoInJlYWRPbmx5Iik7dmFyIGQ9bC5zdHlsZTtkLmNzc1RleHQ9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42cmVtO3Jlc2l6ZTpub25lO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdXRsaW5lOm5vbmUiLGQuY29sb3I9aS5nZXQoInRleHRDb2xvciIpLGQuYm9yZGVyQ29sb3I9aS5nZXQoInRleHRhcmVhQm9yZGVyQ29sb3IiKSxkLmJhY2tncm91bmRDb2xvcj1pLmdldCgidGV4dGFyZWFDb2xvciIpLGwudmFsdWU9Yy52YWx1ZSxzLmFwcGVuZENoaWxkKGwpfXZhciBmPWMubWV0YSxnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjVweDtsZWZ0OjA7cmlnaHQ6MCI7dmFyIHk9ImZsb2F0OnJpZ2h0O21hcmdpbi1yaWdodDoyMHB4O2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6MnB4IDVweDtmb250LXNpemU6MTJweDtib3JkZXItcmFkaXVzOjNweCIsdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3krPSI7YmFja2dyb3VuZC1jb2xvcjoiK2kuZ2V0KCJidXR0b25Db2xvciIpLHkrPSI7Y29sb3I6IitpLmdldCgiYnV0dG9uVGV4dENvbG9yIik7dmFyIHg9dGhpcztmdW5jdGlvbiBfKCl7bi5yZW1vdmVDaGlsZChyKSx4Ll9kb209bnVsbH1wZSh2LCJjbGljayIsXykscGUobSwiY2xpY2siLChmdW5jdGlvbigpe2lmKG51bGw9PWgmJm51bGwhPXV8fG51bGwhPWgmJm51bGw9PXUpXygpO2Vsc2V7dmFyIHQ7dHJ5e3Q9WChoKT9oKHMsZS5nZXRPcHRpb24oKSk6UnoobC52YWx1ZSxmKX1jYXRjaCh0KXt0aHJvdyBfKCksbmV3IEVycm9yKCJEYXRhIHZpZXcgZm9ybWF0IGVycm9yICIrdCl9dCYmZS5kaXNwYXRjaEFjdGlvbih7dHlwZToiY2hhbmdlRGF0YVZpZXciLG5ld09wdGlvbjp0fSksXygpfX0pKSx2LmlubmVySFRNTD1hWzFdLG0uaW5uZXJIVE1MPWFbMl0sbS5zdHlsZS5jc3NUZXh0PXYuc3R5bGUuY3NzVGV4dD15LCFpLmdldCgicmVhZE9ubHkiKSYmZy5hcHBlbmRDaGlsZChtKSxnLmFwcGVuZENoaWxkKHYpLHIuYXBwZW5kQ2hpbGQobyksci5hcHBlbmRDaGlsZChzKSxyLmFwcGVuZENoaWxkKGcpLHMuc3R5bGUuaGVpZ2h0PW4uY2xpZW50SGVpZ2h0LTgwKyJweCIsbi5hcHBlbmRDaGlsZChyKSx0aGlzLl9kb209cn0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZG9tJiZlLmdldERvbSgpLnJlbW92ZUNoaWxkKHRoaXMuX2RvbSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24odCxlKXt0aGlzLnJlbW92ZSh0LGUpfSxlLmdldERlZmF1bHRPcHRpb249ZnVuY3Rpb24odCl7cmV0dXJue3Nob3c6ITAscmVhZE9ubHk6ITEsb3B0aW9uVG9Db250ZW50Om51bGwsY29udGVudFRvT3B0aW9uOm51bGwsaWNvbjoiTTE3LjUsMTcuM0gzMyBNMTcuNSwxNy4zSDMzIE00NS40LDI5LjVoLTI4IE0xMS41LDJ2NTZINTFWMTQuOEwzOC40LDJIMTEuNXogTTM4LjQsMi4ydjEyLjdINTEgTTQ1LjQsNDEuN2gtMjgiLHRpdGxlOnQuZ2V0TG9jYWxlTW9kZWwoKS5nZXQoWyJ0b29sYm94IiwiZGF0YVZpZXciLCJ0aXRsZSJdKSxsYW5nOnQuZ2V0TG9jYWxlTW9kZWwoKS5nZXQoWyJ0b29sYm94IiwiZGF0YVZpZXciLCJsYW5nIl0pLGJhY2tncm91bmRDb2xvcjoiI2ZmZiIsdGV4dENvbG9yOiIjMDAwIix0ZXh0YXJlYUNvbG9yOiIjZmZmIix0ZXh0YXJlYUJvcmRlckNvbG9yOiIjMzMzIixidXR0b25Db2xvcjoiI2MyMzUzMSIsYnV0dG9uVGV4dENvbG9yOiIjZmZmIn19LGV9KG16KTtmdW5jdGlvbiBFeih0LGUpe3JldHVybiB6KHQsKGZ1bmN0aW9uKHQsbil7dmFyIGk9ZSYmZVtuXTtpZihxKGkpJiYhWShpKSl7cSh0KSYmIVkodCl8fCh0PXt2YWx1ZTp0fSk7dmFyIHI9bnVsbCE9aS5uYW1lJiZudWxsPT10Lm5hbWU7cmV0dXJuIHQ9ayh0LGkpLHImJmRlbGV0ZSB0Lm5hbWUsdH1yZXR1cm4gdH0pKX1DbSh7dHlwZToiY2hhbmdlRGF0YVZpZXciLGV2ZW50OiJkYXRhVmlld0NoYW5nZWQiLHVwZGF0ZToicHJlcGFyZUFuZFVwZGF0ZSJ9LChmdW5jdGlvbih0LGUpe3ZhciBuPVtdO0UodC5uZXdPcHRpb24uc2VyaWVzLChmdW5jdGlvbih0KXt2YXIgaT1lLmdldFNlcmllc0J5TmFtZSh0Lm5hbWUpWzBdO2lmKGkpe3ZhciByPWkuZ2V0KCJkYXRhIik7bi5wdXNoKHtuYW1lOnQubmFtZSxkYXRhOkV6KHQuZGF0YSxyKX0pfWVsc2Ugbi5wdXNoKEEoe3R5cGU6InNjYXR0ZXIifSx0KSl9KSksZS5tZXJnZU9wdGlvbihrKHtzZXJpZXM6bn0sdC5uZXdPcHRpb24pKX0pKTt2YXIgeno9RSxWej1WbygpO2Z1bmN0aW9uIEJ6KHQpe3ZhciBlPVZ6KHQpO3JldHVybiBlLnNuYXBzaG90c3x8KGUuc25hcHNob3RzPVt7fV0pLGUuc25hcHNob3RzfXZhciBGej1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLm9uY2xpY2s9ZnVuY3Rpb24odCxlKXshZnVuY3Rpb24odCl7VnoodCkuc25hcHNob3RzPW51bGx9KHQpLGUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InJlc3RvcmUiLGZyb206dGhpcy51aWR9KX0sZS5nZXREZWZhdWx0T3B0aW9uPWZ1bmN0aW9uKHQpe3JldHVybntzaG93OiEwLGljb246Ik0zLjgsMzMuNCBNNDcsMTguOWg5LjhWOC43IE01Ni4zLDIwLjEgQzUyLjEsOSw0MC41LDAuNiwyNi44LDIuMUMxMi42LDMuNywxLjYsMTYuMiwyLjEsMzAuNiBNMTMsNDEuMUgzLjF2MTAuMiBNMy43LDM5LjljNC4yLDExLjEsMTUuOCwxOS41LDI5LjUsMTggYzE0LjItMS42LDI1LjItMTQuMSwyNC43LTI4LjUiLHRpdGxlOnQuZ2V0TG9jYWxlTW9kZWwoKS5nZXQoWyJ0b29sYm94IiwicmVzdG9yZSIsInRpdGxlIl0pfX0sZX0obXopO0NtKHt0eXBlOiJyZXN0b3JlIixldmVudDoicmVzdG9yZSIsdXBkYXRlOiJwcmVwYXJlQW5kVXBkYXRlIn0sKGZ1bmN0aW9uKHQsZSl7ZS5yZXNldE9wdGlvbigicmVjcmVhdGUiKX0pKTt2YXIgR3o9WyJncmlkIiwieEF4aXMiLCJ5QXhpcyIsImdlbyIsImdyYXBoIiwicG9sYXIiLCJyYWRpdXNBeGlzIiwiYW5nbGVBeGlzIiwiYm1hcCJdLFd6PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIGk9dGhpczt0aGlzLl90YXJnZXRJbmZvTGlzdD1bXTt2YXIgcj1ZeihlLHQpO0UoWHosKGZ1bmN0aW9uKHQsZSl7KCFufHwhbi5pbmNsdWRlfHxQKG4uaW5jbHVkZSxlKT49MCkmJnQocixpLl90YXJnZXRJbmZvTGlzdCl9KSl9cmV0dXJuIHQucHJvdG90eXBlLnNldE91dHB1dFJhbmdlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1hdGNoT3V0cHV0UmFuZ2VzKHQsZSwoZnVuY3Rpb24odCxlLG4pe2lmKCh0LmNvb3JkUmFuZ2VzfHwodC5jb29yZFJhbmdlcz1bXSkpLnB1c2goZSksIXQuY29vcmRSYW5nZSl7dC5jb29yZFJhbmdlPWU7dmFyIGk9anpbdC5icnVzaFR5cGVdKDAsbixlKTt0Ll9fcmFuZ2VPZmZzZXQ9e29mZnNldDpLelt0LmJydXNoVHlwZV0oaS52YWx1ZXMsdC5yYW5nZSxbMSwxXSkseHlNaW5NYXg6aS54eU1pbk1heH19fSkpLHR9LHQucHJvdG90eXBlLm1hdGNoT3V0cHV0UmFuZ2VzPWZ1bmN0aW9uKHQsZSxuKXtFKHQsKGZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZmluZFRhcmdldEluZm8odCxlKTtpJiYhMCE9PWkmJkUoaS5jb29yZFN5c2VzLChmdW5jdGlvbihpKXt2YXIgcj1qelt0LmJydXNoVHlwZV0oMSxpLHQucmFuZ2UsITApO24odCxyLnZhbHVlcyxpLGUpfSkpfSksdGhpcyl9LHQucHJvdG90eXBlLnNldElucHV0UmFuZ2VzPWZ1bmN0aW9uKHQsZSl7RSh0LChmdW5jdGlvbih0KXt2YXIgbixpLHIsbyxhLHM9dGhpcy5maW5kVGFyZ2V0SW5mbyh0LGUpO2lmKHQucmFuZ2U9dC5yYW5nZXx8W10scyYmITAhPT1zKXt0LnBhbmVsSWQ9cy5wYW5lbElkO3ZhciBsPWp6W3QuYnJ1c2hUeXBlXSgwLHMuY29vcmRTeXMsdC5jb29yZFJhbmdlKSx1PXQuX19yYW5nZU9mZnNldDt0LnJhbmdlPXU/S3pbdC5icnVzaFR5cGVdKGwudmFsdWVzLHUub2Zmc2V0LChuPWwueHlNaW5NYXgsaT11Lnh5TWluTWF4LHI9Snoobiksbz1KeihpKSxhPVtyWzBdL29bMF0sclsxXS9vWzFdXSxpc05hTihhWzBdKSYmKGFbMF09MSksaXNOYU4oYVsxXSkmJihhWzFdPTEpLGEpKTpsLnZhbHVlc319KSx0aGlzKX0sdC5wcm90b3R5cGUubWFrZVBhbmVsT3B0cz1mdW5jdGlvbih0LGUpe3JldHVybiB6KHRoaXMuX3RhcmdldEluZm9MaXN0LChmdW5jdGlvbihuKXt2YXIgaT1uLmdldFBhbmVsUmVjdCgpO3JldHVybntwYW5lbElkOm4ucGFuZWxJZCxkZWZhdWx0QnJ1c2hUeXBlOmU/ZShuKTpudWxsLGNsaXBQYXRoOkJMKGkpLGlzVGFyZ2V0QnlDdXJzb3I6R0woaSx0LG4uY29vcmRTeXNNb2RlbCksZ2V0TGluZWFyQnJ1c2hPdGhlckV4dGVudDpGTChpKX19KSl9LHQucHJvdG90eXBlLmNvbnRyb2xTZXJpZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuZmluZFRhcmdldEluZm8odCxuKTtyZXR1cm4hMD09PWl8fGkmJlAoaS5jb29yZFN5c2VzLGUuY29vcmRpbmF0ZVN5c3RlbSk+PTB9LHQucHJvdG90eXBlLmZpbmRUYXJnZXRJbmZvPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuX3RhcmdldEluZm9MaXN0LGk9WXooZSx0KSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl0sYT10LnBhbmVsSWQ7aWYoYSl7aWYoby5wYW5lbElkPT09YSlyZXR1cm4gb31lbHNlIGZvcih2YXIgcz0wO3M8VXoubGVuZ3RoO3MrKylpZihVeltzXShpLG8pKXJldHVybiBvfXJldHVybiEwfSx0fSgpO2Z1bmN0aW9uIEh6KHQpe3JldHVybiB0WzBdPnRbMV0mJnQucmV2ZXJzZSgpLHR9ZnVuY3Rpb24gWXoodCxlKXtyZXR1cm4gRm8odCxlLHtpbmNsdWRlTWFpblR5cGVzOkd6fSl9dmFyIFh6PXtncmlkOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC54QXhpc01vZGVscyxpPXQueUF4aXNNb2RlbHMscj10LmdyaWRNb2RlbHMsbz15dCgpLGE9e30scz17fTsobnx8aXx8cikmJihFKG4sKGZ1bmN0aW9uKHQpe3ZhciBlPXQuYXhpcy5ncmlkLm1vZGVsO28uc2V0KGUuaWQsZSksYVtlLmlkXT0hMH0pKSxFKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQuYXhpcy5ncmlkLm1vZGVsO28uc2V0KGUuaWQsZSksc1tlLmlkXT0hMH0pKSxFKHIsKGZ1bmN0aW9uKHQpe28uc2V0KHQuaWQsdCksYVt0LmlkXT0hMCxzW3QuaWRdPSEwfSkpLG8uZWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9dC5jb29yZGluYXRlU3lzdGVtLG89W107RShyLmdldENhcnRlc2lhbnMoKSwoZnVuY3Rpb24odCxlKXsoUChuLHQuZ2V0QXhpcygieCIpLm1vZGVsKT49MHx8UChpLHQuZ2V0QXhpcygieSIpLm1vZGVsKT49MCkmJm8ucHVzaCh0KX0pKSxlLnB1c2goe3BhbmVsSWQ6ImdyaWQtLSIrdC5pZCxncmlkTW9kZWw6dCxjb29yZFN5c01vZGVsOnQsY29vcmRTeXM6b1swXSxjb29yZFN5c2VzOm8sZ2V0UGFuZWxSZWN0Olp6LmdyaWQseEF4aXNEZWNsYXJlZDphW3QuaWRdLHlBeGlzRGVjbGFyZWQ6c1t0LmlkXX0pfSkpKX0sZ2VvOmZ1bmN0aW9uKHQsZSl7RSh0Lmdlb01vZGVscywoZnVuY3Rpb24odCl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtO2UucHVzaCh7cGFuZWxJZDoiZ2VvLS0iK3QuaWQsZ2VvTW9kZWw6dCxjb29yZFN5c01vZGVsOnQsY29vcmRTeXM6bixjb29yZFN5c2VzOltuXSxnZXRQYW5lbFJlY3Q6WnouZ2VvfSl9KSl9fSxVej1bZnVuY3Rpb24odCxlKXt2YXIgbj10LnhBeGlzTW9kZWwsaT10LnlBeGlzTW9kZWwscj10LmdyaWRNb2RlbDtyZXR1cm4hciYmbiYmKHI9bi5heGlzLmdyaWQubW9kZWwpLCFyJiZpJiYocj1pLmF4aXMuZ3JpZC5tb2RlbCksciYmcj09PWUuZ3JpZE1vZGVsfSxmdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2VvTW9kZWw7cmV0dXJuIG4mJm49PT1lLmdlb01vZGVsfV0sWno9e2dyaWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZFN5cy5tYXN0ZXIuZ2V0UmVjdCgpLmNsb25lKCl9LGdlbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29vcmRTeXMsZT10LmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7cmV0dXJuIGUuYXBwbHlUcmFuc2Zvcm0oQmgodCkpLGV9fSxqej17bGluZVg6SChxeiwwKSxsaW5lWTpIKHF6LDEpLHJlY3Q6ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dD9lLnBvaW50VG9EYXRhKFtuWzBdWzBdLG5bMV1bMF1dLGkpOmUuZGF0YVRvUG9pbnQoW25bMF1bMF0sblsxXVswXV0saSksbz10P2UucG9pbnRUb0RhdGEoW25bMF1bMV0sblsxXVsxXV0saSk6ZS5kYXRhVG9Qb2ludChbblswXVsxXSxuWzFdWzFdXSxpKSxhPVtIeihbclswXSxvWzBdXSksSHooW3JbMV0sb1sxXV0pXTtyZXR1cm57dmFsdWVzOmEseHlNaW5NYXg6YX19LHBvbHlnb246ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9W1sxLzAsLTEvMF0sWzEvMCwtMS8wXV07cmV0dXJue3ZhbHVlczp6KG4sKGZ1bmN0aW9uKG4pe3ZhciBvPXQ/ZS5wb2ludFRvRGF0YShuLGkpOmUuZGF0YVRvUG9pbnQobixpKTtyZXR1cm4gclswXVswXT1NYXRoLm1pbihyWzBdWzBdLG9bMF0pLHJbMV1bMF09TWF0aC5taW4oclsxXVswXSxvWzFdKSxyWzBdWzFdPU1hdGgubWF4KHJbMF1bMV0sb1swXSksclsxXVsxXT1NYXRoLm1heChyWzFdWzFdLG9bMV0pLG99KSkseHlNaW5NYXg6cn19fTtmdW5jdGlvbiBxeih0LGUsbixpKXt2YXIgcj1uLmdldEF4aXMoWyJ4IiwieSJdW3RdKSxvPUh6KHooWzAsMV0sKGZ1bmN0aW9uKHQpe3JldHVybiBlP3IuY29vcmRUb0RhdGEoci50b0xvY2FsQ29vcmQoaVt0XSksITApOnIudG9HbG9iYWxDb29yZChyLmRhdGFUb0Nvb3JkKGlbdF0pKX0pKSksYT1bXTtyZXR1cm4gYVt0XT1vLGFbMS10XT1bTmFOLE5hTl0se3ZhbHVlczpvLHh5TWluTWF4OmF9fXZhciBLej17bGluZVg6SCgkeiwwKSxsaW5lWTpIKCR6LDEpLHJlY3Q6ZnVuY3Rpb24odCxlLG4pe3JldHVybltbdFswXVswXS1uWzBdKmVbMF1bMF0sdFswXVsxXS1uWzBdKmVbMF1bMV1dLFt0WzFdWzBdLW5bMV0qZVsxXVswXSx0WzFdWzFdLW5bMV0qZVsxXVsxXV1dfSxwb2x5Z29uOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geih0LChmdW5jdGlvbih0LGkpe3JldHVyblt0WzBdLW5bMF0qZVtpXVswXSx0WzFdLW5bMV0qZVtpXVsxXV19KSl9fTtmdW5jdGlvbiAkeih0LGUsbixpKXtyZXR1cm5bZVswXS1pW3RdKm5bMF0sZVsxXS1pW3RdKm5bMV1dfWZ1bmN0aW9uIEp6KHQpe3JldHVybiB0P1t0WzBdWzFdLXRbMF1bMF0sdFsxXVsxXS10WzFdWzBdXTpbTmFOLE5hTl19dmFyIFF6LHRWLGVWPUUsblY9SW8rInRvb2xib3gtZGF0YVpvb21fIixpVj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbixpKXt0aGlzLl9icnVzaENvbnRyb2xsZXJ8fCh0aGlzLl9icnVzaENvbnRyb2xsZXI9bmV3IGxMKG4uZ2V0WnIoKSksdGhpcy5fYnJ1c2hDb250cm9sbGVyLm9uKCJicnVzaCIsVyh0aGlzLl9vbkJydXNoLHRoaXMpKS5tb3VudCgpKSxmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPW4uX2lzWm9vbUFjdGl2ZTtpJiYidGFrZUdsb2JhbEN1cnNvciI9PT1pLnR5cGUmJihvPSJkYXRhWm9vbVNlbGVjdCI9PT1pLmtleSYmaS5kYXRhWm9vbVNlbGVjdEFjdGl2ZSk7bi5faXNab29tQWN0aXZlPW8sdC5zZXRJY29uU3RhdHVzKCJ6b29tIixvPyJlbXBoYXNpcyI6Im5vcm1hbCIpO3ZhciBhPW5ldyBXeihvVih0KSxlLHtpbmNsdWRlOlsiZ3JpZCJdfSkscz1hLm1ha2VQYW5lbE9wdHMociwoZnVuY3Rpb24odCl7cmV0dXJuIHQueEF4aXNEZWNsYXJlZCYmIXQueUF4aXNEZWNsYXJlZD8ibGluZVgiOiF0LnhBeGlzRGVjbGFyZWQmJnQueUF4aXNEZWNsYXJlZD8ibGluZVkiOiJyZWN0In0pKTtuLl9icnVzaENvbnRyb2xsZXIuc2V0UGFuZWxzKHMpLmVuYWJsZUJydXNoKCEoIW98fCFzLmxlbmd0aCkmJnticnVzaFR5cGU6ImF1dG8iLGJydXNoU3R5bGU6dC5nZXRNb2RlbCgiYnJ1c2hTdHlsZSIpLmdldEl0ZW1TdHlsZSgpfSl9KHQsZSx0aGlzLGksbiksZnVuY3Rpb24odCxlKXt0LnNldEljb25TdGF0dXMoImJhY2siLGZ1bmN0aW9uKHQpe3JldHVybiBCeih0KS5sZW5ndGh9KGUpPjE/ImVtcGhhc2lzIjoibm9ybWFsIil9KHQsZSl9LGUucHJvdG90eXBlLm9uY2xpY2s9ZnVuY3Rpb24odCxlLG4pe3JWW25dLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2JydXNoQ29udHJvbGxlciYmdGhpcy5fYnJ1c2hDb250cm9sbGVyLnVubW91bnQoKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbih0LGUpe3RoaXMuX2JydXNoQ29udHJvbGxlciYmdGhpcy5fYnJ1c2hDb250cm9sbGVyLmRpc3Bvc2UoKX0sZS5wcm90b3R5cGUuX29uQnJ1c2g9ZnVuY3Rpb24odCl7dmFyIGU9dC5hcmVhcztpZih0LmlzRW5kJiZlLmxlbmd0aCl7dmFyIG49e30saT10aGlzLmVjTW9kZWw7dGhpcy5fYnJ1c2hDb250cm9sbGVyLnVwZGF0ZUNvdmVycyhbXSksbmV3IFd6KG9WKHRoaXMubW9kZWwpLGkse2luY2x1ZGU6WyJncmlkIl19KS5tYXRjaE91dHB1dFJhbmdlcyhlLGksKGZ1bmN0aW9uKHQsZSxuKXtpZigiY2FydGVzaWFuMmQiPT09bi50eXBlKXt2YXIgaT10LmJydXNoVHlwZTsicmVjdCI9PT1pPyhyKCJ4IixuLGVbMF0pLHIoInkiLG4sZVsxXSkpOnIoe2xpbmVYOiJ4IixsaW5lWToieSJ9W2ldLG4sZSl9fSkpLGZ1bmN0aW9uKHQsZSl7dmFyIG49QnoodCk7enooZSwoZnVuY3Rpb24oZSxpKXtmb3IodmFyIHI9bi5sZW5ndGgtMTtyPj0wJiYhbltyXVtpXTtyLS0pO2lmKHI8MCl7dmFyIG89dC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJkYXRhWm9vbSIsc3ViVHlwZToic2VsZWN0IixpZDppfSlbMF07aWYobyl7dmFyIGE9by5nZXRQZXJjZW50UmFuZ2UoKTtuWzBdW2ldPXtkYXRhWm9vbUlkOmksc3RhcnQ6YVswXSxlbmQ6YVsxXX19fX0pKSxuLnB1c2goZSl9KGksbiksdGhpcy5fZGlzcGF0Y2hab29tQWN0aW9uKG4pfWZ1bmN0aW9uIHIodCxlLHIpe3ZhciBvPWUuZ2V0QXhpcyh0KSxhPW8ubW9kZWwscz1mdW5jdGlvbih0LGUsbil7dmFyIGk7cmV0dXJuIG4uZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImRhdGFab29tIixzdWJUeXBlOiJzZWxlY3QifSwoZnVuY3Rpb24obil7bi5nZXRBeGlzTW9kZWwodCxlLmNvbXBvbmVudEluZGV4KSYmKGk9bil9KSksaX0odCxhLGkpLGw9cy5maW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHkoYSkuZ2V0TWluTWF4U3BhbigpO251bGw9PWwubWluVmFsdWVTcGFuJiZudWxsPT1sLm1heFZhbHVlU3Bhbnx8KHI9emsoMCxyLnNsaWNlKCksby5zY2FsZS5nZXRFeHRlbnQoKSwwLGwubWluVmFsdWVTcGFuLGwubWF4VmFsdWVTcGFuKSkscyYmKG5bcy5pZF09e2RhdGFab29tSWQ6cy5pZCxzdGFydFZhbHVlOnJbMF0sZW5kVmFsdWU6clsxXX0pfX0sZS5wcm90b3R5cGUuX2Rpc3BhdGNoWm9vbUFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1bXTtlVih0LChmdW5jdGlvbih0LG4pe2UucHVzaChUKHQpKX0pKSxlLmxlbmd0aCYmdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImRhdGFab29tIixmcm9tOnRoaXMudWlkLGJhdGNoOmV9KX0sZS5nZXREZWZhdWx0T3B0aW9uPWZ1bmN0aW9uKHQpe3JldHVybntzaG93OiEwLGZpbHRlck1vZGU6ImZpbHRlciIsaWNvbjp7em9vbToiTTAsMTMuNWgyNi45IE0xMy41LDI2LjlWMCBNMzIuMSwxMy41SDU4VjU4SDEzLjUgVjMyLjEiLGJhY2s6Ik0yMiwxLjRMOS45LDEzLjVsMTIuMywxMi4zIE0xMC4zLDEzLjVINTQuOXY0NC42IEgxMC4zdi0yNiJ9LHRpdGxlOnQuZ2V0TG9jYWxlTW9kZWwoKS5nZXQoWyJ0b29sYm94IiwiZGF0YVpvb20iLCJ0aXRsZSJdKSxicnVzaFN0eWxlOntib3JkZXJXaWR0aDowLGNvbG9yOiJyZ2JhKDIxMCwyMTksMjM4LDAuMikifX19LGV9KG16KSxyVj17em9vbTpmdW5jdGlvbigpe3ZhciB0PSF0aGlzLl9pc1pvb21BY3RpdmU7dGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRha2VHbG9iYWxDdXJzb3IiLGtleToiZGF0YVpvb21TZWxlY3QiLGRhdGFab29tU2VsZWN0QWN0aXZlOnR9KX0sYmFjazpmdW5jdGlvbigpe3RoaXMuX2Rpc3BhdGNoWm9vbUFjdGlvbihmdW5jdGlvbih0KXt2YXIgZT1Ceih0KSxuPWVbZS5sZW5ndGgtMV07ZS5sZW5ndGg+MSYmZS5wb3AoKTt2YXIgaT17fTtyZXR1cm4genoobiwoZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9ZS5sZW5ndGgtMTtyPj0wO3ItLSlpZih0PWVbcl1bbl0pe2lbbl09dDticmVha319KSksaX0odGhpcy5lY01vZGVsKSl9fTtmdW5jdGlvbiBvVih0KXt2YXIgZT17eEF4aXNJbmRleDp0LmdldCgieEF4aXNJbmRleCIsITApLHlBeGlzSW5kZXg6dC5nZXQoInlBeGlzSW5kZXgiLCEwKSx4QXhpc0lkOnQuZ2V0KCJ4QXhpc0lkIiwhMCkseUF4aXNJZDp0LmdldCgieUF4aXNJZCIsITApfTtyZXR1cm4gbnVsbD09ZS54QXhpc0luZGV4JiZudWxsPT1lLnhBeGlzSWQmJihlLnhBeGlzSW5kZXg9ImFsbCIpLG51bGw9PWUueUF4aXNJbmRleCYmbnVsbD09ZS55QXhpc0lkJiYoZS55QXhpc0luZGV4PSJhbGwiKSxlfVF6PSJkYXRhWm9vbSIsdFY9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDb21wb25lbnQoInRvb2xib3giLDApLG49WyJmZWF0dXJlIiwiZGF0YVpvb20iXTtpZihlJiZudWxsIT1lLmdldChuKSl7dmFyIGk9ZS5nZXRNb2RlbChuKSxyPVtdLG89Rm8odCxvVihpKSk7cmV0dXJuIGVWKG8ueEF4aXNNb2RlbHMsKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsInhBeGlzIiwieEF4aXNJbmRleCIpfSkpLGVWKG8ueUF4aXNNb2RlbHMsKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsInlBeGlzIiwieUF4aXNJbmRleCIpfSkpLHJ9ZnVuY3Rpb24gYSh0LGUsbil7dmFyIG89dC5jb21wb25lbnRJbmRleCxhPXt0eXBlOiJzZWxlY3QiLCRmcm9tVG9vbGJveDohMCxmaWx0ZXJNb2RlOmkuZ2V0KCJmaWx0ZXJNb2RlIiwhMCl8fCJmaWx0ZXIiLGlkOm5WK2Urb307YVtuXT1vLHIucHVzaChhKX19LGx0KG51bGw9PW9kLmdldChReikmJnRWKSxvZC5zZXQoUXosdFYpO3ZhciBhVj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnR5cGU9InRvb2x0aXAiLGUuZGVwZW5kZW5jaWVzPVsiYXhpc1BvaW50ZXIiXSxlLmRlZmF1bHRPcHRpb249e3o6NjAsc2hvdzohMCxzaG93Q29udGVudDohMCx0cmlnZ2VyOiJpdGVtIix0cmlnZ2VyT246Im1vdXNlbW92ZXxjbGljayIsYWx3YXlzU2hvd0NvbnRlbnQ6ITEsZGlzcGxheU1vZGU6InNpbmdsZSIscmVuZGVyTW9kZToiYXV0byIsY29uZmluZTpudWxsLHNob3dEZWxheTowLGhpZGVEZWxheToxMDAsdHJhbnNpdGlvbkR1cmF0aW9uOi40LGVudGVyYWJsZTohMSxiYWNrZ3JvdW5kQ29sb3I6IiNmZmYiLHNoYWRvd0JsdXI6MTAsc2hhZG93Q29sb3I6InJnYmEoMCwgMCwgMCwgLjIpIixzaGFkb3dPZmZzZXRYOjEsc2hhZG93T2Zmc2V0WToyLGJvcmRlclJhZGl1czo0LGJvcmRlcldpZHRoOjEscGFkZGluZzpudWxsLGV4dHJhQ3NzVGV4dDoiIixheGlzUG9pbnRlcjp7dHlwZToibGluZSIsYXhpczoiYXV0byIsYW5pbWF0aW9uOiJhdXRvIixhbmltYXRpb25EdXJhdGlvblVwZGF0ZToyMDAsYW5pbWF0aW9uRWFzaW5nVXBkYXRlOiJleHBvbmVudGlhbE91dCIsY3Jvc3NTdHlsZTp7Y29sb3I6IiM5OTkiLHdpZHRoOjEsdHlwZToiZGFzaGVkIix0ZXh0U3R5bGU6e319fSx0ZXh0U3R5bGU6e2NvbG9yOiIjNjY2Iixmb250U2l6ZToxNH19LGV9KHpwKTtmdW5jdGlvbiBzVih0KXt2YXIgZT10LmdldCgiY29uZmluZSIpO3JldHVybiBudWxsIT1lPyEhZToicmljaFRleHQiPT09dC5nZXQoInJlbmRlck1vZGUiKX1mdW5jdGlvbiBsVih0KXtpZihyLmRvbVN1cHBvcnRlZClmb3IodmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLG49MCxpPXQubGVuZ3RoO248aTtuKyspaWYodFtuXWluIGUpcmV0dXJuIHRbbl19dmFyIHVWPWxWKFsidHJhbnNmb3JtIiwid2Via2l0VHJhbnNmb3JtIiwiT1RyYW5zZm9ybSIsIk1velRyYW5zZm9ybSIsIm1zVHJhbnNmb3JtIl0pO2Z1bmN0aW9uIGhWKHQsZSl7aWYoIXQpcmV0dXJuIGU7ZT15cChlLCEwKTt2YXIgbj10LmluZGV4T2YoZSk7cmV0dXJuKHQ9LTE9PT1uP2U6Ii0iK3Quc2xpY2UoMCxuKSsiLSIrZSkudG9Mb3dlckNhc2UoKX12YXIgY1Y9aFYobFYoWyJ3ZWJraXRUcmFuc2l0aW9uIiwidHJhbnNpdGlvbiIsIk9UcmFuc2l0aW9uIiwiTW96VHJhbnNpdGlvbiIsIm1zVHJhbnNpdGlvbiJdKSwidHJhbnNpdGlvbiIpLHBWPWhWKHVWLCJ0cmFuc2Zvcm0iKSxkVj0icG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztib3JkZXItc3R5bGU6c29saWQ7d2hpdGUtc3BhY2U6bm93cmFwO3otaW5kZXg6OTk5OTk5OTsiKyhyLnRyYW5zZm9ybTNkU3VwcG9ydGVkPyJ3aWxsLWNoYW5nZTp0cmFuc2Zvcm07IjoiIik7ZnVuY3Rpb24gZlYodCxlLG4pe3ZhciBpPXQudG9GaXhlZCgwKSsicHgiLG89ZS50b0ZpeGVkKDApKyJweCI7aWYoIXIudHJhbnNmb3JtU3VwcG9ydGVkKXJldHVybiBuPyJ0b3A6IitvKyI7bGVmdDoiK2krIjsiOltbInRvcCIsb10sWyJsZWZ0IixpXV07dmFyIGE9ci50cmFuc2Zvcm0zZFN1cHBvcnRlZCxzPSJ0cmFuc2xhdGUiKyhhPyIzZCI6IiIpKyIoIitpKyIsIitvKyhhPyIsMCI6IiIpKyIpIjtyZXR1cm4gbj8idG9wOjA7bGVmdDowOyIrcFYrIjoiK3MrIjsiOltbInRvcCIsMF0sWyJsZWZ0IiwwXSxbdVYsc11dfWZ1bmN0aW9uIGdWKHQsZSxuKXt2YXIgaT1bXSxvPXQuZ2V0KCJ0cmFuc2l0aW9uRHVyYXRpb24iKSxhPXQuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKSxzPXQuZ2V0KCJzaGFkb3dCbHVyIiksbD10LmdldCgic2hhZG93Q29sb3IiKSx1PXQuZ2V0KCJzaGFkb3dPZmZzZXRYIiksaD10LmdldCgic2hhZG93T2Zmc2V0WSIpLGM9dC5nZXRNb2RlbCgidGV4dFN0eWxlIikscD1nZyh0LCJodG1sIiksZD11KyJweCAiK2grInB4ICIrcysicHggIitsO3JldHVybiBpLnB1c2goImJveC1zaGFkb3c6IitkKSxlJiZvJiZpLnB1c2goZnVuY3Rpb24odCxlKXt2YXIgbj0iY3ViaWMtYmV6aWVyKDAuMjMsMSwwLjMyLDEpIixpPSIgIit0LzIrInMgIituLG89Im9wYWNpdHkiK2krIix2aXNpYmlsaXR5IitpO3JldHVybiBlfHwoaT0iICIrdCsicyAiK24sbys9ci50cmFuc2Zvcm1TdXBwb3J0ZWQ/IiwiK3BWK2k6IixsZWZ0IitpKyIsdG9wIitpKSxjVisiOiIrb30obyxuKSksYSYmaS5wdXNoKCJiYWNrZ3JvdW5kLWNvbG9yOiIrYSksRShbIndpZHRoIiwiY29sb3IiLCJyYWRpdXMiXSwoZnVuY3Rpb24oZSl7dmFyIG49ImJvcmRlci0iK2Uscj15cChuKSxvPXQuZ2V0KHIpO251bGwhPW8mJmkucHVzaChuKyI6IitvKygiY29sb3IiPT09ZT8iIjoicHgiKSl9KSksaS5wdXNoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49dC5nZXQoImZvbnRTaXplIiksaT10LmdldFRleHRDb2xvcigpO2kmJmUucHVzaCgiY29sb3I6IitpKSxlLnB1c2goImZvbnQ6Iit0LmdldEZvbnQoKSksbiYmZS5wdXNoKCJsaW5lLWhlaWdodDoiK01hdGgucm91bmQoMypuLzIpKyJweCIpO3ZhciByPXQuZ2V0KCJ0ZXh0U2hhZG93Q29sb3IiKSxvPXQuZ2V0KCJ0ZXh0U2hhZG93Qmx1ciIpfHwwLGE9dC5nZXQoInRleHRTaGFkb3dPZmZzZXRYIil8fDAscz10LmdldCgidGV4dFNoYWRvd09mZnNldFkiKXx8MDtyZXR1cm4gciYmbyYmZS5wdXNoKCJ0ZXh0LXNoYWRvdzoiK2ErInB4ICIrcysicHggIitvKyJweCAiK3IpLEUoWyJkZWNvcmF0aW9uIiwiYWxpZ24iXSwoZnVuY3Rpb24obil7dmFyIGk9dC5nZXQobik7aSYmZS5wdXNoKCJ0ZXh0LSIrbisiOiIraSl9KSksZS5qb2luKCI7Iil9KGMpKSxudWxsIT1wJiZpLnB1c2goInBhZGRpbmc6Iit2cChwKS5qb2luKCJweCAiKSsicHgiKSxpLmpvaW4oIjsiKSsiOyJ9ZnVuY3Rpb24geVYodCxlLG4saSxyKXt2YXIgbz1lJiZlLnBhaW50ZXI7aWYobil7dmFyIGE9byYmby5nZXRWaWV3cG9ydFJvb3QoKTthJiZmdW5jdGlvbih0LGUsbixpLHIpe3RlKFF0LGUsaSxyLCEwKSYmdGUodCxuLFF0WzBdLFF0WzFdKX0odCxhLG4saSxyKX1lbHNle3RbMF09aSx0WzFdPXI7dmFyIHM9byYmby5nZXRWaWV3cG9ydFJvb3RPZmZzZXQoKTtzJiYodFswXSs9cy5vZmZzZXRMZWZ0LHRbMV0rPXMub2Zmc2V0VG9wKX10WzJdPXRbMF0vZS5nZXRXaWR0aCgpLHRbM109dFsxXS9lLmdldEhlaWdodCgpfXZhciB2Vj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtpZih0aGlzLl9zaG93PSExLHRoaXMuX3N0eWxlQ29vcmQ9WzAsMCwwLDBdLHRoaXMuX2VudGVyYWJsZT0hMCx0aGlzLl9hbHdheXNTaG93Q29udGVudD0hMSx0aGlzLl9maXJzdFNob3c9ITAsdGhpcy5fbG9uZ0hpZGU9ITAsci53eGEpcmV0dXJuIG51bGw7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5kb21CZWxvbmdUb1pyPSEwLHRoaXMuZWw9bjt2YXIgaT10aGlzLl96cj10LmdldFpyKCksbz1lLmFwcGVuZFRvLGE9byYmKFUobyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvKTpKKG8pP286WChvKSYmbyh0LmdldERvbSgpKSk7eVYodGhpcy5fc3R5bGVDb29yZCxpLGEsdC5nZXRXaWR0aCgpLzIsdC5nZXRIZWlnaHQoKS8yKSwoYXx8dC5nZXREb20oKSkuYXBwZW5kQ2hpbGQobiksdGhpcy5fYXBpPXQsdGhpcy5fY29udGFpbmVyPWE7dmFyIHM9dGhpcztuLm9ubW91c2VlbnRlcj1mdW5jdGlvbigpe3MuX2VudGVyYWJsZSYmKGNsZWFyVGltZW91dChzLl9oaWRlVGltZW91dCkscy5fc2hvdz0hMCkscy5faW5Db250ZW50PSEwfSxuLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKHQpe2lmKHQ9dHx8d2luZG93LmV2ZW50LCFzLl9lbnRlcmFibGUpe3ZhciBlPWkuaGFuZGxlcjtjZShpLnBhaW50ZXIuZ2V0Vmlld3BvcnRSb290KCksdCwhMCksZS5kaXNwYXRjaCgibW91c2Vtb3ZlIix0KX19LG4ub25tb3VzZWxlYXZlPWZ1bmN0aW9uKCl7cy5faW5Db250ZW50PSExLHMuX2VudGVyYWJsZSYmcy5fc2hvdyYmcy5oaWRlTGF0ZXIocy5faGlkZURlbGF5KX19cmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0KXtpZighdGhpcy5fY29udGFpbmVyKXt2YXIgZT10aGlzLl9hcGkuZ2V0RG9tKCksbj0obz0icG9zaXRpb24iLChhPShyPWUpLmN1cnJlbnRTdHlsZXx8ZG9jdW1lbnQuZGVmYXVsdFZpZXcmJmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUocikpP28/YVtvXTphOm51bGwpLGk9ZS5zdHlsZTsiYWJzb2x1dGUiIT09aS5wb3NpdGlvbiYmImFic29sdXRlIiE9PW4mJihpLnBvc2l0aW9uPSJyZWxhdGl2ZSIpfXZhciByLG8sYSxzPXQuZ2V0KCJhbHdheXNTaG93Q29udGVudCIpO3MmJnRoaXMuX21vdmVJZlJlc2l6ZWQoKSx0aGlzLl9hbHdheXNTaG93Q29udGVudD1zLHRoaXMuZWwuY2xhc3NOYW1lPXQuZ2V0KCJjbGFzc05hbWUiKXx8IiJ9LHQucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24odCxlKXtjbGVhclRpbWVvdXQodGhpcy5faGlkZVRpbWVvdXQpLGNsZWFyVGltZW91dCh0aGlzLl9sb25nSGlkZVRpbWVvdXQpO3ZhciBuPXRoaXMuZWwsaT1uLnN0eWxlLHI9dGhpcy5fc3R5bGVDb29yZDtuLmlubmVySFRNTD9pLmNzc1RleHQ9ZFYrZ1YodCwhdGhpcy5fZmlyc3RTaG93LHRoaXMuX2xvbmdIaWRlKStmVihyWzBdLHJbMV0sITApKyJib3JkZXItY29sb3I6IitTcChlKSsiOyIrKHQuZ2V0KCJleHRyYUNzc1RleHQiKXx8IiIpKyI7cG9pbnRlci1ldmVudHM6IisodGhpcy5fZW50ZXJhYmxlPyJhdXRvIjoibm9uZSIpOmkuZGlzcGxheT0ibm9uZSIsdGhpcy5fc2hvdz0hMCx0aGlzLl9maXJzdFNob3c9ITEsdGhpcy5fbG9uZ0hpZGU9ITF9LHQucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLmVsO2lmKG51bGwhPXQpe3ZhciBhPSIiO2lmKFUocikmJiJpdGVtIj09PW4uZ2V0KCJ0cmlnZ2VyIikmJiFzVihuKSYmKGE9ZnVuY3Rpb24odCxlLG4pe2lmKCFVKG4pfHwiaW5zaWRlIj09PW4pcmV0dXJuIiI7dmFyIGk9dC5nZXQoImJhY2tncm91bmRDb2xvciIpLHI9dC5nZXQoImJvcmRlcldpZHRoIik7ZT1TcChlKTt2YXIgbyxhLHM9ImxlZnQiPT09KG89bik/InJpZ2h0IjoicmlnaHQiPT09bz8ibGVmdCI6InRvcCI9PT1vPyJib3R0b20iOiJ0b3AiLGw9TWF0aC5tYXgoMS41Kk1hdGgucm91bmQociksNiksdT0iIixoPXBWKyI6IjtQKFsibGVmdCIsInJpZ2h0Il0scyk+LTE/KHUrPSJ0b3A6NTAlIixoKz0idHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoIisoYT0ibGVmdCI9PT1zPy0yMjU6LTQ1KSsiZGVnKSIpOih1Kz0ibGVmdDo1MCUiLGgrPSJ0cmFuc2xhdGVYKC01MCUpIHJvdGF0ZSgiKyhhPSJ0b3AiPT09cz8yMjU6NDUpKyJkZWcpIik7dmFyIGM9YSpNYXRoLlBJLzE4MCxwPWwrcixkPXAqTWF0aC5hYnMoTWF0aC5jb3MoYykpK3AqTWF0aC5hYnMoTWF0aC5zaW4oYykpLGY9ZSsiIHNvbGlkICIrcisicHg7IjtyZXR1cm4nPGRpdiBzdHlsZT0iJytbInBvc2l0aW9uOmFic29sdXRlO3dpZHRoOiIrbCsicHg7aGVpZ2h0OiIrbCsicHg7ei1pbmRleDotMTsiLCh1Kz0iOyIrcysiOi0iK01hdGgucm91bmQoMTAwKigoZC1NYXRoLlNRUlQyKnIpLzIrTWF0aC5TUVJUMipyLShkLXApLzIpKS8xMDArInB4IikrIjsiK2grIjsiLCJib3JkZXItYm90dG9tOiIrZiwiYm9yZGVyLXJpZ2h0OiIrZiwiYmFja2dyb3VuZC1jb2xvcjoiK2krIjsiXS5qb2luKCIiKSsnIj48L2Rpdj4nfShuLGkscikpLFUodCkpby5pbm5lckhUTUw9dCthO2Vsc2UgaWYodCl7by5pbm5lckhUTUw9IiIsWSh0KXx8KHQ9W3RdKTtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKylKKHRbc10pJiZ0W3NdLnBhcmVudE5vZGUhPT1vJiZvLmFwcGVuZENoaWxkKHRbc10pO2lmKGEmJm8uY2hpbGROb2Rlcy5sZW5ndGgpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuaW5uZXJIVE1MPWEsby5hcHBlbmRDaGlsZChsKX19fWVsc2Ugby5pbm5lckhUTUw9IiJ9LHQucHJvdG90eXBlLnNldEVudGVyYWJsZT1mdW5jdGlvbih0KXt0aGlzLl9lbnRlcmFibGU9dH0sdC5wcm90b3R5cGUuZ2V0U2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWw7cmV0dXJuW3Qub2Zmc2V0V2lkdGgsdC5vZmZzZXRIZWlnaHRdfSx0LnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9zdHlsZUNvb3JkO2lmKHlWKG4sdGhpcy5fenIsdGhpcy5fY29udGFpbmVyLHQsZSksbnVsbCE9blswXSYmbnVsbCE9blsxXSl7dmFyIGk9dGhpcy5lbC5zdHlsZTtFKGZWKG5bMF0sblsxXSksKGZ1bmN0aW9uKHQpe2lbdFswXV09dFsxXX0pKX19LHQucHJvdG90eXBlLl9tb3ZlSWZSZXNpemVkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3R5bGVDb29yZFsyXSxlPXRoaXMuX3N0eWxlQ29vcmRbM107dGhpcy5tb3ZlVG8odCp0aGlzLl96ci5nZXRXaWR0aCgpLGUqdGhpcy5fenIuZ2V0SGVpZ2h0KCkpfSx0LnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZWwuc3R5bGU7ZS52aXNpYmlsaXR5PSJoaWRkZW4iLGUub3BhY2l0eT0iMCIsci50cmFuc2Zvcm0zZFN1cHBvcnRlZCYmKGUud2lsbENoYW5nZT0iIiksdGhpcy5fc2hvdz0hMSx0aGlzLl9sb25nSGlkZVRpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gdC5fbG9uZ0hpZGU9ITB9KSw1MDApfSx0LnByb3RvdHlwZS5oaWRlTGF0ZXI9ZnVuY3Rpb24odCl7IXRoaXMuX3Nob3d8fHRoaXMuX2luQ29udGVudCYmdGhpcy5fZW50ZXJhYmxlfHx0aGlzLl9hbHdheXNTaG93Q29udGVudHx8KHQ/KHRoaXMuX2hpZGVEZWxheT10LHRoaXMuX3Nob3c9ITEsdGhpcy5faGlkZVRpbWVvdXQ9c2V0VGltZW91dChXKHRoaXMuaGlkZSx0aGlzKSx0KSk6dGhpcy5oaWRlKCkpfSx0LnByb3RvdHlwZS5pc1Nob3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd30sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZW91dCksY2xlYXJUaW1lb3V0KHRoaXMuX2xvbmdIaWRlVGltZW91dCk7dmFyIHQ9dGhpcy5lbC5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcy5lbCksdGhpcy5lbD10aGlzLl9jb250YWluZXI9bnVsbH0sdH0oKSxtVj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fc2hvdz0hMSx0aGlzLl9zdHlsZUNvb3JkPVswLDAsMCwwXSx0aGlzLl9hbHdheXNTaG93Q29udGVudD0hMSx0aGlzLl9lbnRlcmFibGU9ITAsdGhpcy5fenI9dC5nZXRacigpLGJWKHRoaXMuX3N0eWxlQ29vcmQsdGhpcy5fenIsdC5nZXRXaWR0aCgpLzIsdC5nZXRIZWlnaHQoKS8yKX1yZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KCJhbHdheXNTaG93Q29udGVudCIpO2UmJnRoaXMuX21vdmVJZlJlc2l6ZWQoKSx0aGlzLl9hbHdheXNTaG93Q29udGVudD1lfSx0LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5faGlkZVRpbWVvdXQmJmNsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZW91dCksdGhpcy5lbC5zaG93KCksdGhpcy5fc2hvdz0hMH0sdC5wcm90b3R5cGUuc2V0Q29udGVudD1mdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXRoaXM7cSh0KSYmd28oIiIpLHRoaXMuZWwmJnRoaXMuX3pyLnJlbW92ZSh0aGlzLmVsKTt2YXIgYT1uLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKTt0aGlzLmVsPW5ldyBYcyh7c3R5bGU6e3JpY2g6ZS5yaWNoVGV4dFN0eWxlcyx0ZXh0OnQsbGluZUhlaWdodDoyMixib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOmksdGV4dFNoYWRvd0NvbG9yOmEuZ2V0KCJ0ZXh0U2hhZG93Q29sb3IiKSxmaWxsOm4uZ2V0KFsidGV4dFN0eWxlIiwiY29sb3IiXSkscGFkZGluZzpnZyhuLCJyaWNoVGV4dCIpLHZlcnRpY2FsQWxpZ246InRvcCIsYWxpZ246ImxlZnQifSx6Om4uZ2V0KCJ6Iil9KSxFKFsiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyUmFkaXVzIiwic2hhZG93Q29sb3IiLCJzaGFkb3dCbHVyIiwic2hhZG93T2Zmc2V0WCIsInNoYWRvd09mZnNldFkiXSwoZnVuY3Rpb24odCl7by5lbC5zdHlsZVt0XT1uLmdldCh0KX0pKSxFKFsidGV4dFNoYWRvd0JsdXIiLCJ0ZXh0U2hhZG93T2Zmc2V0WCIsInRleHRTaGFkb3dPZmZzZXRZIl0sKGZ1bmN0aW9uKHQpe28uZWwuc3R5bGVbdF09YS5nZXQodCl8fDB9KSksdGhpcy5fenIuYWRkKHRoaXMuZWwpO3ZhciBzPXRoaXM7dGhpcy5lbC5vbigibW91c2VvdmVyIiwoZnVuY3Rpb24oKXtzLl9lbnRlcmFibGUmJihjbGVhclRpbWVvdXQocy5faGlkZVRpbWVvdXQpLHMuX3Nob3c9ITApLHMuX2luQ29udGVudD0hMH0pKSx0aGlzLmVsLm9uKCJtb3VzZW91dCIsKGZ1bmN0aW9uKCl7cy5fZW50ZXJhYmxlJiZzLl9zaG93JiZzLmhpZGVMYXRlcihzLl9oaWRlRGVsYXkpLHMuX2luQ29udGVudD0hMX0pKX0sdC5wcm90b3R5cGUuc2V0RW50ZXJhYmxlPWZ1bmN0aW9uKHQpe3RoaXMuX2VudGVyYWJsZT10fSx0LnByb3RvdHlwZS5nZXRTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbCxlPXRoaXMuZWwuZ2V0Qm91bmRpbmdSZWN0KCksbj1fVih0LnN0eWxlKTtyZXR1cm5bZS53aWR0aCtuLmxlZnQrbi5yaWdodCxlLmhlaWdodCtuLnRvcCtuLmJvdHRvbV19LHQucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZWw7aWYobil7dmFyIGk9dGhpcy5fc3R5bGVDb29yZDtiVihpLHRoaXMuX3pyLHQsZSksdD1pWzBdLGU9aVsxXTt2YXIgcj1uLnN0eWxlLG89eFYoci5ib3JkZXJXaWR0aHx8MCksYT1fVihyKTtuLng9dCtvK2EubGVmdCxuLnk9ZStvK2EudG9wLG4ubWFya1JlZHJhdygpfX0sdC5wcm90b3R5cGUuX21vdmVJZlJlc2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdHlsZUNvb3JkWzJdLGU9dGhpcy5fc3R5bGVDb29yZFszXTt0aGlzLm1vdmVUbyh0KnRoaXMuX3pyLmdldFdpZHRoKCksZSp0aGlzLl96ci5nZXRIZWlnaHQoKSl9LHQucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmVsJiZ0aGlzLmVsLmhpZGUoKSx0aGlzLl9zaG93PSExfSx0LnByb3RvdHlwZS5oaWRlTGF0ZXI9ZnVuY3Rpb24odCl7IXRoaXMuX3Nob3d8fHRoaXMuX2luQ29udGVudCYmdGhpcy5fZW50ZXJhYmxlfHx0aGlzLl9hbHdheXNTaG93Q29udGVudHx8KHQ/KHRoaXMuX2hpZGVEZWxheT10LHRoaXMuX3Nob3c9ITEsdGhpcy5faGlkZVRpbWVvdXQ9c2V0VGltZW91dChXKHRoaXMuaGlkZSx0aGlzKSx0KSk6dGhpcy5oaWRlKCkpfSx0LnByb3RvdHlwZS5pc1Nob3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd30sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX3pyLnJlbW92ZSh0aGlzLmVsKX0sdH0oKTtmdW5jdGlvbiB4Vih0KXtyZXR1cm4gTWF0aC5tYXgoMCx0KX1mdW5jdGlvbiBfVih0KXt2YXIgZT14Vih0LnNoYWRvd0JsdXJ8fDApLG49eFYodC5zaGFkb3dPZmZzZXRYfHwwKSxpPXhWKHQuc2hhZG93T2Zmc2V0WXx8MCk7cmV0dXJue2xlZnQ6eFYoZS1uKSxyaWdodDp4VihlK24pLHRvcDp4VihlLWkpLGJvdHRvbTp4VihlK2kpfX1mdW5jdGlvbiBiVih0LGUsbixpKXt0WzBdPW4sdFsxXT1pLHRbMl09dFswXS9lLmdldFdpZHRoKCksdFszXT10WzFdL2UuZ2V0SGVpZ2h0KCl9dmFyIHdWPW5ldyBXcyh7c2hhcGU6e3g6LTEseTotMSx3aWR0aDoyLGhlaWdodDoyfX0pLFNWPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlKXtpZighci5ub2RlJiZlLmdldERvbSgpKXt2YXIgbixpPXQuZ2V0Q29tcG9uZW50KCJ0b29sdGlwIiksbz10aGlzLl9yZW5kZXJNb2RlPSJhdXRvIj09PShuPWkuZ2V0KCJyZW5kZXJNb2RlIikpP3IuZG9tU3VwcG9ydGVkPyJodG1sIjoicmljaFRleHQiOm58fCJodG1sIjt0aGlzLl90b29sdGlwQ29udGVudD0icmljaFRleHQiPT09bz9uZXcgbVYoZSk6bmV3IHZWKGUse2FwcGVuZFRvOmkuZ2V0KCJhcHBlbmRUb0JvZHkiLCEwKT8iYm9keSI6aS5nZXQoImFwcGVuZFRvIiwhMCl9KX19LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7aWYoIXIubm9kZSYmbi5nZXREb20oKSl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl90b29sdGlwTW9kZWw9dCx0aGlzLl9lY01vZGVsPWUsdGhpcy5fYXBpPW47dmFyIGk9dGhpcy5fdG9vbHRpcENvbnRlbnQ7aS51cGRhdGUodCksaS5zZXRFbnRlcmFibGUodC5nZXQoImVudGVyYWJsZSIpKSx0aGlzLl9pbml0R2xvYmFsTGlzdGVuZXIoKSx0aGlzLl9rZWVwU2hvdygpLCJyaWNoVGV4dCIhPT10aGlzLl9yZW5kZXJNb2RlJiZ0LmdldCgidHJhbnNpdGlvbkR1cmF0aW9uIik/SGcodGhpcywiX3VwZGF0ZVBvc2l0aW9uIiw1MCwiZml4UmF0ZSIpOllnKHRoaXMsIl91cGRhdGVQb3NpdGlvbiIpfX0sZS5wcm90b3R5cGUuX2luaXRHbG9iYWxMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Rvb2x0aXBNb2RlbC5nZXQoInRyaWdnZXJPbiIpO0NOKCJpdGVtVG9vbHRpcCIsdGhpcy5fYXBpLFcoKGZ1bmN0aW9uKGUsbixpKXsibm9uZSIhPT10JiYodC5pbmRleE9mKGUpPj0wP3RoaXMuX3RyeVNob3cobixpKToibGVhdmUiPT09ZSYmdGhpcy5faGlkZShpKSl9KSx0aGlzKSl9LGUucHJvdG90eXBlLl9rZWVwU2hvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Rvb2x0aXBNb2RlbCxlPXRoaXMuX2VjTW9kZWwsbj10aGlzLl9hcGksaT10LmdldCgidHJpZ2dlck9uIik7aWYobnVsbCE9dGhpcy5fbGFzdFgmJm51bGwhPXRoaXMuX2xhc3RZJiYibm9uZSIhPT1pJiYiY2xpY2siIT09aSl7dmFyIHI9dGhpcztjbGVhclRpbWVvdXQodGhpcy5fcmVmcmVzaFVwZGF0ZVRpbWVvdXQpLHRoaXMuX3JlZnJlc2hVcGRhdGVUaW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7IW4uaXNEaXNwb3NlZCgpJiZyLm1hbnVhbGx5U2hvd1RpcCh0LGUsbix7eDpyLl9sYXN0WCx5OnIuX2xhc3RZLGRhdGFCeUNvb3JkU3lzOnIuX2xhc3REYXRhQnlDb29yZFN5c30pfSkpfX0sZS5wcm90b3R5cGUubWFudWFsbHlTaG93VGlwPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKGkuZnJvbSE9PXRoaXMudWlkJiYhci5ub2RlJiZuLmdldERvbSgpKXt2YXIgbz1JVihpLG4pO3RoaXMuX3RpY2tldD0iIjt2YXIgYT1pLmRhdGFCeUNvb3JkU3lzLHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPUdvKHQpLnF1ZXJ5T3B0aW9uTWFwLHI9aS5rZXlzKClbMF07aWYoIXJ8fCJzZXJpZXMiPT09cilyZXR1cm47dmFyIG89WW8oZSxyLGkuZ2V0KHIpLHt1c2VEZWZhdWx0OiExLGVuYWJsZUFsbDohMSxlbmFibGVOb25lOiExfSksYT1vLm1vZGVsc1swXTtpZighYSlyZXR1cm47dmFyIHMsbD1uLmdldFZpZXdPZkNvbXBvbmVudE1vZGVsKGEpO2lmKGwuZ3JvdXAudHJhdmVyc2UoKGZ1bmN0aW9uKGUpe3ZhciBuPXJsKGUpLnRvb2x0aXBDb25maWc7aWYobiYmbi5uYW1lPT09dC5uYW1lKXJldHVybiBzPWUsITB9KSkscylyZXR1cm57Y29tcG9uZW50TWFpblR5cGU6cixjb21wb25lbnRJbmRleDphLmNvbXBvbmVudEluZGV4LGVsOnN9fShpLGUsbik7aWYocyl7dmFyIGw9cy5lbC5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpO2wuYXBwbHlUcmFuc2Zvcm0ocy5lbC50cmFuc2Zvcm0pLHRoaXMuX3RyeVNob3coe29mZnNldFg6bC54K2wud2lkdGgvMixvZmZzZXRZOmwueStsLmhlaWdodC8yLHRhcmdldDpzLmVsLHBvc2l0aW9uOmkucG9zaXRpb24scG9zaXRpb25EZWZhdWx0OiJib3R0b20ifSxvKX1lbHNlIGlmKGkudG9vbHRpcCYmbnVsbCE9aS54JiZudWxsIT1pLnkpe3ZhciB1PXdWO3UueD1pLngsdS55PWkueSx1LnVwZGF0ZSgpLHJsKHUpLnRvb2x0aXBDb25maWc9e25hbWU6bnVsbCxvcHRpb246aS50b29sdGlwfSx0aGlzLl90cnlTaG93KHtvZmZzZXRYOmkueCxvZmZzZXRZOmkueSx0YXJnZXQ6dX0sbyl9ZWxzZSBpZihhKXRoaXMuX3RyeVNob3coe29mZnNldFg6aS54LG9mZnNldFk6aS55LHBvc2l0aW9uOmkucG9zaXRpb24sZGF0YUJ5Q29vcmRTeXM6YSx0b29sdGlwT3B0aW9uOmkudG9vbHRpcE9wdGlvbn0sbyk7ZWxzZSBpZihudWxsIT1pLnNlcmllc0luZGV4KXtpZih0aGlzLl9tYW51YWxseUF4aXNTaG93VGlwKHQsZSxuLGkpKXJldHVybjt2YXIgaD1QTihpLGUpLGM9aC5wb2ludFswXSxwPWgucG9pbnRbMV07bnVsbCE9YyYmbnVsbCE9cCYmdGhpcy5fdHJ5U2hvdyh7b2Zmc2V0WDpjLG9mZnNldFk6cCx0YXJnZXQ6aC5lbCxwb3NpdGlvbjppLnBvc2l0aW9uLHBvc2l0aW9uRGVmYXVsdDoiYm90dG9tIn0sbyl9ZWxzZSBudWxsIT1pLngmJm51bGwhPWkueSYmKG4uZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InVwZGF0ZUF4aXNQb2ludGVyIix4OmkueCx5OmkueX0pLHRoaXMuX3RyeVNob3coe29mZnNldFg6aS54LG9mZnNldFk6aS55LHBvc2l0aW9uOmkucG9zaXRpb24sdGFyZ2V0Om4uZ2V0WnIoKS5maW5kSG92ZXIoaS54LGkueSkudGFyZ2V0fSxvKSl9fSxlLnByb3RvdHlwZS5tYW51YWxseUhpZGVUaXA9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5fdG9vbHRpcENvbnRlbnQ7dGhpcy5fdG9vbHRpcE1vZGVsJiZyLmhpZGVMYXRlcih0aGlzLl90b29sdGlwTW9kZWwuZ2V0KCJoaWRlRGVsYXkiKSksdGhpcy5fbGFzdFg9dGhpcy5fbGFzdFk9dGhpcy5fbGFzdERhdGFCeUNvb3JkU3lzPW51bGwsaS5mcm9tIT09dGhpcy51aWQmJnRoaXMuX2hpZGUoSVYoaSxuKSl9LGUucHJvdG90eXBlLl9tYW51YWxseUF4aXNTaG93VGlwPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPWkuc2VyaWVzSW5kZXgsbz1pLmRhdGFJbmRleCxhPWUuZ2V0Q29tcG9uZW50KCJheGlzUG9pbnRlciIpLmNvb3JkU3lzQXhlc0luZm87aWYobnVsbCE9ciYmbnVsbCE9byYmbnVsbCE9YSl7dmFyIHM9ZS5nZXRTZXJpZXNCeUluZGV4KHIpO2lmKHMpaWYoImF4aXMiPT09TVYoW3MuZ2V0RGF0YSgpLmdldEl0ZW1Nb2RlbChvKSxzLChzLmNvb3JkaW5hdGVTeXN0ZW18fHt9KS5tb2RlbF0sdGhpcy5fdG9vbHRpcE1vZGVsKS5nZXQoInRyaWdnZXIiKSlyZXR1cm4gbi5kaXNwYXRjaEFjdGlvbih7dHlwZToidXBkYXRlQXhpc1BvaW50ZXIiLHNlcmllc0luZGV4OnIsZGF0YUluZGV4Om8scG9zaXRpb246aS5wb3NpdGlvbn0pLCEwfX0sZS5wcm90b3R5cGUuX3RyeVNob3c9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnRhcmdldDtpZih0aGlzLl90b29sdGlwTW9kZWwpe3RoaXMuX2xhc3RYPXQub2Zmc2V0WCx0aGlzLl9sYXN0WT10Lm9mZnNldFk7dmFyIGk9dC5kYXRhQnlDb29yZFN5cztpZihpJiZpLmxlbmd0aCl0aGlzLl9zaG93QXhpc1Rvb2x0aXAoaSx0KTtlbHNlIGlmKG4pe3ZhciByLG87aWYoImxlZ2VuZCI9PT1ybChuKS5zc3JUeXBlKXJldHVybjt0aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXM9bnVsbCxPeShuLChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9cmwodCkuZGF0YUluZGV4PyhyPXQsITApOm51bGwhPXJsKHQpLnRvb2x0aXBDb25maWc/KG89dCwhMCk6dm9pZCAwfSksITApLHI/dGhpcy5fc2hvd1Nlcmllc0l0ZW1Ub29sdGlwKHQscixlKTpvP3RoaXMuX3Nob3dDb21wb25lbnRJdGVtVG9vbHRpcCh0LG8sZSk6dGhpcy5faGlkZShlKX1lbHNlIHRoaXMuX2xhc3REYXRhQnlDb29yZFN5cz1udWxsLHRoaXMuX2hpZGUoZSl9fSxlLnByb3RvdHlwZS5fc2hvd09yTW92ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0KCJzaG93RGVsYXkiKTtlPVcoZSx0aGlzKSxjbGVhclRpbWVvdXQodGhpcy5fc2hvd1RpbW91dCksbj4wP3RoaXMuX3Nob3dUaW1vdXQ9c2V0VGltZW91dChlLG4pOmUoKX0sZS5wcm90b3R5cGUuX3Nob3dBeGlzVG9vbHRpcD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2VjTW9kZWwsaT10aGlzLl90b29sdGlwTW9kZWwscj1bZS5vZmZzZXRYLGUub2Zmc2V0WV0sbz1NVihbZS50b29sdGlwT3B0aW9uXSxpKSxhPXRoaXMuX3JlbmRlck1vZGUscz1bXSxsPW9nKCJzZWN0aW9uIix7YmxvY2tzOltdLG5vSGVhZGVyOiEwfSksdT1bXSxoPW5ldyB5ZztFKHQsKGZ1bmN0aW9uKHQpe0UodC5kYXRhQnlBeGlzLChmdW5jdGlvbih0KXt2YXIgZT1uLmdldENvbXBvbmVudCh0LmF4aXNEaW0rIkF4aXMiLHQuYXhpc0luZGV4KSxyPXQudmFsdWU7aWYoZSYmbnVsbCE9cil7dmFyIG89Zk4ocixlLmF4aXMsbix0LnNlcmllc0RhdGFJbmRpY2VzLHQudmFsdWVMYWJlbE9wdCksYz1vZygic2VjdGlvbiIse2hlYWRlcjpvLG5vSGVhZGVyOiF1dChvKSxzb3J0QmxvY2tzOiEwLGJsb2NrczpbXX0pO2wuYmxvY2tzLnB1c2goYyksRSh0LnNlcmllc0RhdGFJbmRpY2VzLChmdW5jdGlvbihsKXt2YXIgcD1uLmdldFNlcmllc0J5SW5kZXgobC5zZXJpZXNJbmRleCksZD1sLmRhdGFJbmRleEluc2lkZSxmPXAuZ2V0RGF0YVBhcmFtcyhkKTtpZighKGYuZGF0YUluZGV4PDApKXtmLmF4aXNEaW09dC5heGlzRGltLGYuYXhpc0luZGV4PXQuYXhpc0luZGV4LGYuYXhpc1R5cGU9dC5heGlzVHlwZSxmLmF4aXNJZD10LmF4aXNJZCxmLmF4aXNWYWx1ZT1TXyhlLmF4aXMse3ZhbHVlOnJ9KSxmLmF4aXNWYWx1ZUxhYmVsPW8sZi5tYXJrZXI9aC5tYWtlVG9vbHRpcE1hcmtlcigiaXRlbSIsU3AoZi5jb2xvciksYSk7dmFyIGc9YmYocC5mb3JtYXRUb29sdGlwKGQsITAsbnVsbCkpLHk9Zy5mcmFnO2lmKHkpe3ZhciB2PU1WKFtwXSxpKS5nZXQoInZhbHVlRm9ybWF0dGVyIik7Yy5ibG9ja3MucHVzaCh2P0Eoe3ZhbHVlRm9ybWF0dGVyOnZ9LHkpOnkpfWcudGV4dCYmdS5wdXNoKGcudGV4dCkscy5wdXNoKGYpfX0pKX19KSl9KSksbC5ibG9ja3MucmV2ZXJzZSgpLHUucmV2ZXJzZSgpO3ZhciBjPWUucG9zaXRpb24scD1vLmdldCgib3JkZXIiKSxkPWNnKGwsaCxhLHAsbi5nZXQoInVzZVVUQyIpLG8uZ2V0KCJ0ZXh0U3R5bGUiKSk7ZCYmdS51bnNoaWZ0KGQpO3ZhciBmPSJyaWNoVGV4dCI9PT1hPyJcblxuIjoiPGJyLz4iLGc9dS5qb2luKGYpO3RoaXMuX3Nob3dPck1vdmUobywoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDb250ZW50Tm90Q2hhbmdlZE9uQXhpcyh0LHMpP3RoaXMuX3VwZGF0ZVBvc2l0aW9uKG8sYyxyWzBdLHJbMV0sdGhpcy5fdG9vbHRpcENvbnRlbnQscyk6dGhpcy5fc2hvd1Rvb2x0aXBDb250ZW50KG8sZyxzLE1hdGgucmFuZG9tKCkrIiIsclswXSxyWzFdLGMsbnVsbCxoKX0pKX0sZS5wcm90b3R5cGUuX3Nob3dTZXJpZXNJdGVtVG9vbHRpcD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fZWNNb2RlbCxyPXJsKGUpLG89ci5zZXJpZXNJbmRleCxhPWkuZ2V0U2VyaWVzQnlJbmRleChvKSxzPXIuZGF0YU1vZGVsfHxhLGw9ci5kYXRhSW5kZXgsdT1yLmRhdGFUeXBlLGg9cy5nZXREYXRhKHUpLGM9dGhpcy5fcmVuZGVyTW9kZSxwPXQucG9zaXRpb25EZWZhdWx0LGQ9TVYoW2guZ2V0SXRlbU1vZGVsKGwpLHMsYSYmKGEuY29vcmRpbmF0ZVN5c3RlbXx8e30pLm1vZGVsXSx0aGlzLl90b29sdGlwTW9kZWwscD97cG9zaXRpb246cH06bnVsbCksZj1kLmdldCgidHJpZ2dlciIpO2lmKG51bGw9PWZ8fCJpdGVtIj09PWYpe3ZhciBnPXMuZ2V0RGF0YVBhcmFtcyhsLHUpLHk9bmV3IHlnO2cubWFya2VyPXkubWFrZVRvb2x0aXBNYXJrZXIoIml0ZW0iLFNwKGcuY29sb3IpLGMpO3ZhciB2PWJmKHMuZm9ybWF0VG9vbHRpcChsLCExLHUpKSxtPWQuZ2V0KCJvcmRlciIpLHg9ZC5nZXQoInZhbHVlRm9ybWF0dGVyIiksXz12LmZyYWcsYj1fP2NnKHg/QSh7dmFsdWVGb3JtYXR0ZXI6eH0sXyk6Xyx5LGMsbSxpLmdldCgidXNlVVRDIiksZC5nZXQoInRleHRTdHlsZSIpKTp2LnRleHQsdz0iaXRlbV8iK3MubmFtZSsiXyIrbDt0aGlzLl9zaG93T3JNb3ZlKGQsKGZ1bmN0aW9uKCl7dGhpcy5fc2hvd1Rvb2x0aXBDb250ZW50KGQsYixnLHcsdC5vZmZzZXRYLHQub2Zmc2V0WSx0LnBvc2l0aW9uLHQudGFyZ2V0LHkpfSkpLG4oe3R5cGU6InNob3dUaXAiLGRhdGFJbmRleEluc2lkZTpsLGRhdGFJbmRleDpoLmdldFJhd0luZGV4KGwpLHNlcmllc0luZGV4Om8sZnJvbTp0aGlzLnVpZH0pfX0sZS5wcm90b3R5cGUuX3Nob3dDb21wb25lbnRJdGVtVG9vbHRpcD1mdW5jdGlvbih0LGUsbil7dmFyIGk9Imh0bWwiPT09dGhpcy5fcmVuZGVyTW9kZSxyPXJsKGUpLG89ci50b29sdGlwQ29uZmlnLm9wdGlvbnx8e30sYT1vLmVuY29kZUhUTUxDb250ZW50O2lmKFUobykpe289e2NvbnRlbnQ6byxmb3JtYXR0ZXI6b30sYT0hMH1hJiZpJiZvLmNvbnRlbnQmJigobz1UKG8pKS5jb250ZW50PXJlKG8uY29udGVudCkpO3ZhciBzPVtvXSxsPXRoaXMuX2VjTW9kZWwuZ2V0Q29tcG9uZW50KHIuY29tcG9uZW50TWFpblR5cGUsci5jb21wb25lbnRJbmRleCk7bCYmcy5wdXNoKGwpLHMucHVzaCh7Zm9ybWF0dGVyOm8uY29udGVudH0pO3ZhciB1PXQucG9zaXRpb25EZWZhdWx0LGg9TVYocyx0aGlzLl90b29sdGlwTW9kZWwsdT97cG9zaXRpb246dX06bnVsbCksYz1oLmdldCgiY29udGVudCIpLHA9TWF0aC5yYW5kb20oKSsiIixkPW5ldyB5Zzt0aGlzLl9zaG93T3JNb3ZlKGgsKGZ1bmN0aW9uKCl7dmFyIG49VChoLmdldCgiZm9ybWF0dGVyUGFyYW1zIil8fHt9KTt0aGlzLl9zaG93VG9vbHRpcENvbnRlbnQoaCxjLG4scCx0Lm9mZnNldFgsdC5vZmZzZXRZLHQucG9zaXRpb24sZSxkKX0pKSxuKHt0eXBlOiJzaG93VGlwIixmcm9tOnRoaXMudWlkfSl9LGUucHJvdG90eXBlLl9zaG93VG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24odCxlLG4saSxyLG8sYSxzLGwpe2lmKHRoaXMuX3RpY2tldD0iIix0LmdldCgic2hvd0NvbnRlbnQiKSYmdC5nZXQoInNob3ciKSl7dmFyIHU9dGhpcy5fdG9vbHRpcENvbnRlbnQ7dS5zZXRFbnRlcmFibGUodC5nZXQoImVudGVyYWJsZSIpKTt2YXIgaD10LmdldCgiZm9ybWF0dGVyIik7YT1hfHx0LmdldCgicG9zaXRpb24iKTt2YXIgYz1lLHA9dGhpcy5fZ2V0TmVhcmVzdFBvaW50KFtyLG9dLG4sdC5nZXQoInRyaWdnZXIiKSx0LmdldCgiYm9yZGVyQ29sb3IiKSkuY29sb3I7aWYoaClpZihVKGgpKXt2YXIgZD10LmVjTW9kZWwuZ2V0KCJ1c2VVVEMiKSxmPVkobik/blswXTpuO2M9aCxmJiZmLmF4aXNUeXBlJiZmLmF4aXNUeXBlLmluZGV4T2YoInRpbWUiKT49MCYmKGM9SmMoZi5heGlzVmFsdWUsYyxkKSksYz1icChjLG4sITApfWVsc2UgaWYoWChoKSl7dmFyIGc9VygoZnVuY3Rpb24oZSxpKXtlPT09dGhpcy5fdGlja2V0JiYodS5zZXRDb250ZW50KGksbCx0LHAsYSksdGhpcy5fdXBkYXRlUG9zaXRpb24odCxhLHIsbyx1LG4scykpfSksdGhpcyk7dGhpcy5fdGlja2V0PWksYz1oKG4saSxnKX1lbHNlIGM9aDt1LnNldENvbnRlbnQoYyxsLHQscCxhKSx1LnNob3codCxwKSx0aGlzLl91cGRhdGVQb3NpdGlvbih0LGEscixvLHUsbixzKX19LGUucHJvdG90eXBlLl9nZXROZWFyZXN0UG9pbnQ9ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuImF4aXMiPT09bnx8WShlKT97Y29sb3I6aXx8KCJodG1sIj09PXRoaXMuX3JlbmRlck1vZGU/IiNmZmYiOiJub25lIil9OlkoZSk/dm9pZCAwOntjb2xvcjppfHxlLmNvbG9yfHxlLmJvcmRlckNvbG9yfX0sZS5wcm90b3R5cGUuX3VwZGF0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEpe3ZhciBzPXRoaXMuX2FwaS5nZXRXaWR0aCgpLGw9dGhpcy5fYXBpLmdldEhlaWdodCgpO2U9ZXx8dC5nZXQoInBvc2l0aW9uIik7dmFyIHU9ci5nZXRTaXplKCksaD10LmdldCgiYWxpZ24iKSxjPXQuZ2V0KCJ2ZXJ0aWNhbEFsaWduIikscD1hJiZhLmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7aWYoYSYmcC5hcHBseVRyYW5zZm9ybShhLnRyYW5zZm9ybSksWChlKSYmKGU9ZShbbixpXSxvLHIuZWwscCx7dmlld1NpemU6W3MsbF0sY29udGVudFNpemU6dS5zbGljZSgpfSkpLFkoZSkpbj0kcihlWzBdLHMpLGk9JHIoZVsxXSxsKTtlbHNlIGlmKHEoZSkpe3ZhciBkPWU7ZC53aWR0aD11WzBdLGQuaGVpZ2h0PXVbMV07dmFyIGY9a3AoZCx7d2lkdGg6cyxoZWlnaHQ6bH0pO249Zi54LGk9Zi55LGg9bnVsbCxjPW51bGx9ZWxzZSBpZihVKGUpJiZhKXt2YXIgZz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1uWzBdLG89blsxXSxhPU1hdGguY2VpbChNYXRoLlNRUlQyKmkpKzgscz0wLGw9MCx1PWUud2lkdGgsaD1lLmhlaWdodDtzd2l0Y2godCl7Y2FzZSJpbnNpZGUiOnM9ZS54K3UvMi1yLzIsbD1lLnkraC8yLW8vMjticmVhaztjYXNlInRvcCI6cz1lLngrdS8yLXIvMixsPWUueS1vLWE7YnJlYWs7Y2FzZSJib3R0b20iOnM9ZS54K3UvMi1yLzIsbD1lLnkraCthO2JyZWFrO2Nhc2UibGVmdCI6cz1lLngtci1hLGw9ZS55K2gvMi1vLzI7YnJlYWs7Y2FzZSJyaWdodCI6cz1lLngrdSthLGw9ZS55K2gvMi1vLzJ9cmV0dXJuW3MsbF19KGUscCx1LHQuZ2V0KCJib3JkZXJXaWR0aCIpKTtuPWdbMF0saT1nWzFdfWVsc2V7Zz1mdW5jdGlvbih0LGUsbixpLHIsbyxhKXt2YXIgcz1uLmdldFNpemUoKSxsPXNbMF0sdT1zWzFdO251bGwhPW8mJih0K2wrbysyPmk/dC09bCtvOnQrPW8pO251bGwhPWEmJihlK3UrYT5yP2UtPXUrYTplKz1hKTtyZXR1cm5bdCxlXX0obixpLHIscyxsLGg/bnVsbDoyMCxjP251bGw6MjApO249Z1swXSxpPWdbMV19aWYoaCYmKG4tPVRWKGgpP3VbMF0vMjoicmlnaHQiPT09aD91WzBdOjApLGMmJihpLT1UVihjKT91WzFdLzI6ImJvdHRvbSI9PT1jP3VbMV06MCksc1YodCkpe2c9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz1uLmdldFNpemUoKSxhPW9bMF0scz1vWzFdO3JldHVybiB0PU1hdGgubWluKHQrYSxpKS1hLGU9TWF0aC5taW4oZStzLHIpLXMsdD1NYXRoLm1heCh0LDApLGU9TWF0aC5tYXgoZSwwKSxbdCxlXX0obixpLHIscyxsKTtuPWdbMF0saT1nWzFdfXIubW92ZVRvKG4saSl9LGUucHJvdG90eXBlLl91cGRhdGVDb250ZW50Tm90Q2hhbmdlZE9uQXhpcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2xhc3REYXRhQnlDb29yZFN5cyxpPXRoaXMuX2NiUGFyYW1zTGlzdCxyPSEhbiYmbi5sZW5ndGg9PT10Lmxlbmd0aDtyZXR1cm4gciYmRShuLChmdW5jdGlvbihuLG8pe3ZhciBhPW4uZGF0YUJ5QXhpc3x8W10scz0odFtvXXx8e30pLmRhdGFCeUF4aXN8fFtdOyhyPXImJmEubGVuZ3RoPT09cy5sZW5ndGgpJiZFKGEsKGZ1bmN0aW9uKHQsbil7dmFyIG89c1tuXXx8e30sYT10LnNlcmllc0RhdGFJbmRpY2VzfHxbXSxsPW8uc2VyaWVzRGF0YUluZGljZXN8fFtdOyhyPXImJnQudmFsdWU9PT1vLnZhbHVlJiZ0LmF4aXNUeXBlPT09by5heGlzVHlwZSYmdC5heGlzSWQ9PT1vLmF4aXNJZCYmYS5sZW5ndGg9PT1sLmxlbmd0aCkmJkUoYSwoZnVuY3Rpb24odCxlKXt2YXIgbj1sW2VdO3I9ciYmdC5zZXJpZXNJbmRleD09PW4uc2VyaWVzSW5kZXgmJnQuZGF0YUluZGV4PT09bi5kYXRhSW5kZXh9KSksaSYmRSh0LnNlcmllc0RhdGFJbmRpY2VzLChmdW5jdGlvbih0KXt2YXIgbj10LnNlcmllc0luZGV4LG89ZVtuXSxhPWlbbl07byYmYSYmYS5kYXRhIT09by5kYXRhJiYocj0hMSl9KSl9KSl9KSksdGhpcy5fbGFzdERhdGFCeUNvb3JkU3lzPXQsdGhpcy5fY2JQYXJhbXNMaXN0PWUsISFyfSxlLnByb3RvdHlwZS5faGlkZT1mdW5jdGlvbih0KXt0aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXM9bnVsbCx0KHt0eXBlOiJoaWRlVGlwIixmcm9tOnRoaXMudWlkfSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24odCxlKXshci5ub2RlJiZlLmdldERvbSgpJiYoWWcodGhpcywiX3VwZGF0ZVBvc2l0aW9uIiksdGhpcy5fdG9vbHRpcENvbnRlbnQuZGlzcG9zZSgpLGtOKCJpdGVtVG9vbHRpcCIsZSkpfSxlLnR5cGU9InRvb2x0aXAiLGV9KEFnKTtmdW5jdGlvbiBNVih0LGUsbil7dmFyIGkscj1lLmVjTW9kZWw7bj8oaT1uZXcgQ2MobixyLHIpLGk9bmV3IENjKGUub3B0aW9uLGkscikpOmk9ZTtmb3IodmFyIG89dC5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIGE9dFtvXTthJiYoYSBpbnN0YW5jZW9mIENjJiYoYT1hLmdldCgidG9vbHRpcCIsITApKSxVKGEpJiYoYT17Zm9ybWF0dGVyOmF9KSxhJiYoaT1uZXcgQ2MoYSxpLHIpKSl9cmV0dXJuIGl9ZnVuY3Rpb24gSVYodCxlKXtyZXR1cm4gdC5kaXNwYXRjaEFjdGlvbnx8VyhlLmRpc3BhdGNoQWN0aW9uLGUpfWZ1bmN0aW9uIFRWKHQpe3JldHVybiJjZW50ZXIiPT09dHx8Im1pZGRsZSI9PT10fXZhciBDVj1bInJlY3QiLCJwb2x5Z29uIiwia2VlcCIsImNsZWFyIl07ZnVuY3Rpb24gRFYodCxlKXt2YXIgbj1Ubyh0P3QuYnJ1c2g6W10pO2lmKG4ubGVuZ3RoKXt2YXIgaT1bXTtFKG4sKGZ1bmN0aW9uKHQpe3ZhciBlPXQuaGFzT3duUHJvcGVydHkoInRvb2xib3giKT90LnRvb2xib3g6W107ZSBpbnN0YW5jZW9mIEFycmF5JiYoaT1pLmNvbmNhdChlKSl9KSk7dmFyIHI9dCYmdC50b29sYm94O1kocikmJihyPXJbMF0pLHJ8fChyPXtmZWF0dXJlOnt9fSx0LnRvb2xib3g9W3JdKTt2YXIgbz1yLmZlYXR1cmV8fChyLmZlYXR1cmU9e30pLGE9by5icnVzaHx8KG8uYnJ1c2g9e30pLHM9YS50eXBlfHwoYS50eXBlPVtdKTtzLnB1c2guYXBwbHkocyxpKSxmdW5jdGlvbih0KXt2YXIgZT17fTtFKHQsKGZ1bmN0aW9uKHQpe2VbdF09MX0pKSx0Lmxlbmd0aD0wLEUoZSwoZnVuY3Rpb24oZSxuKXt0LnB1c2gobil9KSl9KHMpLGUmJiFzLmxlbmd0aCYmcy5wdXNoLmFwcGx5KHMsQ1YpfX12YXIgQVY9RTtmdW5jdGlvbiBrVih0KXtpZih0KWZvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITB9ZnVuY3Rpb24gTFYodCxlLG4pe3ZhciBpPXt9O3JldHVybiBBVihlLChmdW5jdGlvbihlKXt2YXIgcixvPWlbZV09KChyPWZ1bmN0aW9uKCl7fSkucHJvdG90eXBlLl9faGlkZGVuPXIucHJvdG90eXBlLG5ldyByKTtBVih0W2VdLChmdW5jdGlvbih0LGkpe2lmKGtELmlzVmFsaWRUeXBlKGkpKXt2YXIgcj17dHlwZTppLHZpc3VhbDp0fTtuJiZuKHIsZSksb1tpXT1uZXcga0QociksIm9wYWNpdHkiPT09aSYmKChyPVQocikpLnR5cGU9ImNvbG9yQWxwaGEiLG8uX19oaWRkZW4uX19hbHBoYUZvck9wYWNpdHk9bmV3IGtEKHIpKX19KSl9KSksaX1mdW5jdGlvbiBQVih0LGUsbil7dmFyIGk7RShuLChmdW5jdGlvbih0KXtlLmhhc093blByb3BlcnR5KHQpJiZrVihlW3RdKSYmKGk9ITApfSkpLGkmJkUobiwoZnVuY3Rpb24obil7ZS5oYXNPd25Qcm9wZXJ0eShuKSYma1YoZVtuXSk/dFtuXT1UKGVbbl0pOmRlbGV0ZSB0W25dfSkpfXZhciBPVj17bGluZVg6UlYoMCksbGluZVk6UlYoMSkscmVjdDp7cG9pbnQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0JiZuLmJvdW5kaW5nUmVjdC5jb250YWluKHRbMF0sdFsxXSl9LHJlY3Q6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0JiZuLmJvdW5kaW5nUmVjdC5pbnRlcnNlY3QodCl9fSxwb2x5Z29uOntwb2ludDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQmJm4uYm91bmRpbmdSZWN0LmNvbnRhaW4odFswXSx0WzFdKSYmUF8obi5yYW5nZSx0WzBdLHRbMV0pfSxyZWN0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uLnJhbmdlO2lmKCF0fHxpLmxlbmd0aDw9MSlyZXR1cm4hMTt2YXIgcj10Lngsbz10LnksYT10LndpZHRoLHM9dC5oZWlnaHQsbD1pWzBdO3JldHVybiEhKFBfKGkscixvKXx8UF8oaSxyK2Esbyl8fFBfKGkscixvK3MpfHxQXyhpLHIrYSxvK3MpfHx6ZS5jcmVhdGUodCkuY29udGFpbihsWzBdLGxbMV0pfHxaaChyLG8scithLG8saSl8fFpoKHIsbyxyLG8rcyxpKXx8WmgocithLG8scithLG8rcyxpKXx8WmgocixvK3MscithLG8rcyxpKSl8fHZvaWQgMH19fTtmdW5jdGlvbiBSVih0KXt2YXIgZT1bIngiLCJ5Il0sbj1bIndpZHRoIiwiaGVpZ2h0Il07cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUsbixpKXtpZihlKXt2YXIgcj1pLnJhbmdlO3JldHVybiBOVihlW3RdLHIpfX0scmVjdDpmdW5jdGlvbihpLHIsbyl7aWYoaSl7dmFyIGE9by5yYW5nZSxzPVtpW2VbdF1dLGlbZVt0XV0raVtuW3RdXV07cmV0dXJuIHNbMV08c1swXSYmcy5yZXZlcnNlKCksTlYoc1swXSxhKXx8TlYoc1sxXSxhKXx8TlYoYVswXSxzKXx8TlYoYVsxXSxzKX19fX1mdW5jdGlvbiBOVih0LGUpe3JldHVybiBlWzBdPD10JiZ0PD1lWzFdfXZhciBFVj1bImluQnJ1c2giLCJvdXRPZkJydXNoIl0selY9Il9fZWNCcnVzaFNlbGVjdCIsVlY9Il9fZWNJbkJydXNoU2VsZWN0RXZlbnQiO2Z1bmN0aW9uIEJWKHQpe3QuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImJydXNoIn0sKGZ1bmN0aW9uKGUpeyhlLmJydXNoVGFyZ2V0TWFuYWdlcj1uZXcgV3ooZS5vcHRpb24sdCkpLnNldElucHV0UmFuZ2VzKGUuYXJlYXMsdCl9KSl9ZnVuY3Rpb24gRlYodCxlLG4pe3ZhciBpLHIsbz1bXTt0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJicnVzaCJ9LChmdW5jdGlvbih0KXtuJiYidGFrZUdsb2JhbEN1cnNvciI9PT1uLnR5cGUmJnQuc2V0QnJ1c2hPcHRpb24oImJydXNoIj09PW4ua2V5P24uYnJ1c2hPcHRpb246e2JydXNoVHlwZTohMX0pfSkpLEJWKHQpLHQuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImJydXNoIn0sKGZ1bmN0aW9uKGUsbil7dmFyIGE9e2JydXNoSWQ6ZS5pZCxicnVzaEluZGV4Om4sYnJ1c2hOYW1lOmUubmFtZSxhcmVhczpUKGUuYXJlYXMpLHNlbGVjdGVkOltdfTtvLnB1c2goYSk7dmFyIHM9ZS5vcHRpb24sbD1zLmJydXNoTGluayx1PVtdLGg9W10sYz1bXSxwPSExO258fChpPXMudGhyb3R0bGVUeXBlLHI9cy50aHJvdHRsZURlbGF5KTt2YXIgZD16KGUuYXJlYXMsKGZ1bmN0aW9uKHQpe3ZhciBlPUhWW3QuYnJ1c2hUeXBlXSxuPWsoe2JvdW5kaW5nUmVjdDplP2UodCk6dm9pZCAwfSx0KTtyZXR1cm4gbi5zZWxlY3RvcnM9ZnVuY3Rpb24odCl7dmFyIGU9dC5icnVzaFR5cGUsbj17cG9pbnQ6ZnVuY3Rpb24oaSl7cmV0dXJuIE9WW2VdLnBvaW50KGksbix0KX0scmVjdDpmdW5jdGlvbihpKXtyZXR1cm4gT1ZbZV0ucmVjdChpLG4sdCl9fTtyZXR1cm4gbn0obiksbn0pKSxmPUxWKGUub3B0aW9uLEVWLChmdW5jdGlvbih0KXt0Lm1hcHBpbmdNZXRob2Q9ImZpeGVkIn0pKTtmdW5jdGlvbiBnKHQpe3JldHVybiJhbGwiPT09bHx8ISF1W3RdfWZ1bmN0aW9uIHkodCl7cmV0dXJuISF0Lmxlbmd0aH1ZKGwpJiZFKGwsKGZ1bmN0aW9uKHQpe3VbdF09MX0pKSx0LmVhY2hTZXJpZXMoKGZ1bmN0aW9uKG4saSl7dmFyIHI9Y1tpXT1bXTsicGFyYWxsZWwiPT09bi5zdWJUeXBlP2Z1bmN0aW9uKHQsZSl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtO3A9cHx8bi5oYXNBeGlzQnJ1c2hlZCgpLGcoZSkmJm4uZWFjaEFjdGl2ZVN0YXRlKHQuZ2V0RGF0YSgpLChmdW5jdGlvbih0LGUpeyJhY3RpdmUiPT09dCYmKGhbZV09MSl9KSl9KG4saSk6ZnVuY3Rpb24obixpLHIpe2lmKCFuLmJydXNoU2VsZWN0b3J8fGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5vcHRpb24uc2VyaWVzSW5kZXg7cmV0dXJuIG51bGwhPW4mJiJhbGwiIT09biYmKFkobik/UChuLGUpPDA6ZSE9PW4pfShlLGkpKXJldHVybjtpZihFKGQsKGZ1bmN0aW9uKGkpe2UuYnJ1c2hUYXJnZXRNYW5hZ2VyLmNvbnRyb2xTZXJpZXMoaSxuLHQpJiZyLnB1c2goaSkscD1wfHx5KHIpfSkpLGcoaSkmJnkocikpe3ZhciBvPW4uZ2V0RGF0YSgpO28uZWFjaCgoZnVuY3Rpb24odCl7V1YobixyLG8sdCkmJihoW3RdPTEpfSkpfX0obixpLHIpfSkpLHQuZWFjaFNlcmllcygoZnVuY3Rpb24odCxlKXt2YXIgbj17c2VyaWVzSWQ6dC5pZCxzZXJpZXNJbmRleDplLHNlcmllc05hbWU6dC5uYW1lLGRhdGFJbmRleDpbXX07YS5zZWxlY3RlZC5wdXNoKG4pO3ZhciBpPWNbZV0scj10LmdldERhdGEoKSxvPWcoZSk/ZnVuY3Rpb24odCl7cmV0dXJuIGhbdF0/KG4uZGF0YUluZGV4LnB1c2goci5nZXRSYXdJbmRleCh0KSksImluQnJ1c2giKToib3V0T2ZCcnVzaCJ9OmZ1bmN0aW9uKGUpe3JldHVybiBXVih0LGkscixlKT8obi5kYXRhSW5kZXgucHVzaChyLmdldFJhd0luZGV4KGUpKSwiaW5CcnVzaCIpOiJvdXRPZkJydXNoIn07KGcoZSk/cDp5KGkpKSYmZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhLHM9e307ZnVuY3Rpb24gbCh0KXtyZXR1cm4gRHkobixhLHQpfWZ1bmN0aW9uIHUodCxlKXtreShuLGEsdCxlKX1mdW5jdGlvbiBoKHQsaCl7YT1udWxsPT1vP3Q6aDt2YXIgYz1uLmdldFJhd0RhdGFJdGVtKGEpO2lmKCFjfHwhMSE9PWMudmlzdWFsTWFwKWZvcih2YXIgcD1pLmNhbGwocix0KSxkPWVbcF0sZj1zW3BdLGc9MCx5PWYubGVuZ3RoO2c8eTtnKyspe3ZhciB2PWZbZ107ZFt2XSYmZFt2XS5hcHBseVZpc3VhbCh0LGwsdSl9fUUodCwoZnVuY3Rpb24odCl7dmFyIG49a0QucHJlcGFyZVZpc3VhbFR5cGVzKGVbdF0pO3NbdF09bn0pKSxudWxsPT1vP24uZWFjaChoKTpuLmVhY2goW29dLGgpfShFVixmLHIsbyl9KSl9KSksZnVuY3Rpb24odCxlLG4saSxyKXtpZighcilyZXR1cm47dmFyIG89dC5nZXRacigpO2lmKG9bVlZdKXJldHVybjtvW3pWXXx8KG9belZdPUdWKTt2YXIgYT1IZyhvLHpWLG4sZSk7YSh0LGkpfShlLGkscixvLG4pfWZ1bmN0aW9uIEdWKHQsZSl7aWYoIXQuaXNEaXNwb3NlZCgpKXt2YXIgbj10LmdldFpyKCk7bltWVl09ITAsdC5kaXNwYXRjaEFjdGlvbih7dHlwZToiYnJ1c2hTZWxlY3QiLGJhdGNoOmV9KSxuW1ZWXT0hMX19ZnVuY3Rpb24gV1YodCxlLG4saSl7Zm9yKHZhciByPTAsbz1lLmxlbmd0aDtyPG87cisrKXt2YXIgYT1lW3JdO2lmKHQuYnJ1c2hTZWxlY3RvcihpLG4sYS5zZWxlY3RvcnMsYSkpcmV0dXJuITB9fXZhciBIVj17cmVjdDpmdW5jdGlvbih0KXtyZXR1cm4gWVYodC5yYW5nZSl9LHBvbHlnb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5yYW5nZSxpPTAscj1uLmxlbmd0aDtpPHI7aSsrKXtlPWV8fFtbMS8wLC0xLzBdLFsxLzAsLTEvMF1dO3ZhciBvPW5baV07b1swXTxlWzBdWzBdJiYoZVswXVswXT1vWzBdKSxvWzBdPmVbMF1bMV0mJihlWzBdWzFdPW9bMF0pLG9bMV08ZVsxXVswXSYmKGVbMV1bMF09b1sxXSksb1sxXT5lWzFdWzFdJiYoZVsxXVsxXT1vWzFdKX1yZXR1cm4gZSYmWVYoZSl9fTtmdW5jdGlvbiBZVih0KXtyZXR1cm4gbmV3IHplKHRbMF1bMF0sdFsxXVswXSx0WzBdWzFdLXRbMF1bMF0sdFsxXVsxXS10WzFdWzBdKX12YXIgWFY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe3RoaXMuZWNNb2RlbD10LHRoaXMuYXBpPWUsdGhpcy5tb2RlbCwodGhpcy5fYnJ1c2hDb250cm9sbGVyPW5ldyBsTChlLmdldFpyKCkpKS5vbigiYnJ1c2giLFcodGhpcy5fb25CcnVzaCx0aGlzKSkubW91bnQoKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMubW9kZWw9dCx0aGlzLl91cGRhdGVDb250cm9sbGVyKHQsZSxuLGkpfSxlLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4saSl7QlYoZSksdGhpcy5fdXBkYXRlQ29udHJvbGxlcih0LGUsbixpKX0sZS5wcm90b3R5cGUudXBkYXRlVmlzdWFsPWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMudXBkYXRlVHJhbnNmb3JtKHQsZSxuLGkpfSxlLnByb3RvdHlwZS51cGRhdGVWaWV3PWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuX3VwZGF0ZUNvbnRyb2xsZXIodCxlLG4saSl9LGUucHJvdG90eXBlLl91cGRhdGVDb250cm9sbGVyPWZ1bmN0aW9uKHQsZSxuLGkpeyghaXx8aS4kZnJvbSE9PXQuaWQpJiZ0aGlzLl9icnVzaENvbnRyb2xsZXIuc2V0UGFuZWxzKHQuYnJ1c2hUYXJnZXRNYW5hZ2VyLm1ha2VQYW5lbE9wdHMobikpLmVuYWJsZUJydXNoKHQuYnJ1c2hPcHRpb24pLnVwZGF0ZUNvdmVycyh0LmFyZWFzLnNsaWNlKCkpfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fYnJ1c2hDb250cm9sbGVyLmRpc3Bvc2UoKX0sZS5wcm90b3R5cGUuX29uQnJ1c2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tb2RlbC5pZCxuPXRoaXMubW9kZWwuYnJ1c2hUYXJnZXRNYW5hZ2VyLnNldE91dHB1dFJhbmdlcyh0LmFyZWFzLHRoaXMuZWNNb2RlbCk7KCF0LmlzRW5kfHx0LnJlbW92ZU9uQ2xpY2spJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiYnJ1c2giLGJydXNoSWQ6ZSxhcmVhczpUKG4pLCRmcm9tOmV9KSx0LmlzRW5kJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiYnJ1c2hFbmQiLGJydXNoSWQ6ZSxhcmVhczpUKG4pLCRmcm9tOmV9KX0sZS50eXBlPSJicnVzaCIsZX0oQWcpLFVWPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5hcmVhcz1bXSxuLmJydXNoT3B0aW9uPXt9LG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5vcHRpb247IWUmJlBWKG4sdCxbImluQnJ1c2giLCJvdXRPZkJydXNoIl0pO3ZhciBpPW4uaW5CcnVzaD1uLmluQnJ1c2h8fHt9O24ub3V0T2ZCcnVzaD1uLm91dE9mQnJ1c2h8fHtjb2xvcjoiI2RkZCJ9LGkuaGFzT3duUHJvcGVydHkoImxpZnRaIil8fChpLmxpZnRaPTUpfSxlLnByb3RvdHlwZS5zZXRBcmVhcz1mdW5jdGlvbih0KXt0JiYodGhpcy5hcmVhcz16KHQsKGZ1bmN0aW9uKHQpe3JldHVybiBaVih0aGlzLm9wdGlvbix0KX0pLHRoaXMpKX0sZS5wcm90b3R5cGUuc2V0QnJ1c2hPcHRpb249ZnVuY3Rpb24odCl7dGhpcy5icnVzaE9wdGlvbj1aVih0aGlzLm9wdGlvbix0KSx0aGlzLmJydXNoVHlwZT10aGlzLmJydXNoT3B0aW9uLmJydXNoVHlwZX0sZS50eXBlPSJicnVzaCIsZS5kZXBlbmRlbmNpZXM9WyJnZW8iLCJncmlkIiwieEF4aXMiLCJ5QXhpcyIsInBhcmFsbGVsIiwic2VyaWVzIl0sZS5kZWZhdWx0T3B0aW9uPXtzZXJpZXNJbmRleDoiYWxsIixicnVzaFR5cGU6InJlY3QiLGJydXNoTW9kZToic2luZ2xlIix0cmFuc2Zvcm1hYmxlOiEwLGJydXNoU3R5bGU6e2JvcmRlcldpZHRoOjEsY29sb3I6InJnYmEoMjEwLDIxOSwyMzgsMC4zKSIsYm9yZGVyQ29sb3I6IiNEMkRCRUUifSx0aHJvdHRsZVR5cGU6ImZpeFJhdGUiLHRocm90dGxlRGVsYXk6MCxyZW1vdmVPbkNsaWNrOiEwLHo6MWU0fSxlfSh6cCk7ZnVuY3Rpb24gWlYodCxlKXtyZXR1cm4gQyh7YnJ1c2hUeXBlOnQuYnJ1c2hUeXBlLGJydXNoTW9kZTp0LmJydXNoTW9kZSx0cmFuc2Zvcm1hYmxlOnQudHJhbnNmb3JtYWJsZSxicnVzaFN0eWxlOm5ldyBDYyh0LmJydXNoU3R5bGUpLmdldEl0ZW1TdHlsZSgpLHJlbW92ZU9uQ2xpY2s6dC5yZW1vdmVPbkNsaWNrLHo6dC56fSxlLCEwKX12YXIgalY9WyJyZWN0IiwicG9seWdvbiIsImxpbmVYIiwibGluZVkiLCJrZWVwIiwiY2xlYXIiXSxxVj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvO2UuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImJydXNoIn0sKGZ1bmN0aW9uKHQpe2k9dC5icnVzaFR5cGUscj10LmJydXNoT3B0aW9uLmJydXNoTW9kZXx8InNpbmdsZSIsbz1vfHwhIXQuYXJlYXMubGVuZ3RofSkpLHRoaXMuX2JydXNoVHlwZT1pLHRoaXMuX2JydXNoTW9kZT1yLEUodC5nZXQoInR5cGUiLCEwKSwoZnVuY3Rpb24oZSl7dC5zZXRJY29uU3RhdHVzKGUsKCJrZWVwIj09PWU/Im11bHRpcGxlIj09PXI6ImNsZWFyIj09PWU/bzplPT09aSk/ImVtcGhhc2lzIjoibm9ybWFsIil9KSl9LGUucHJvdG90eXBlLnVwZGF0ZVZpZXc9ZnVuY3Rpb24odCxlLG4pe3RoaXMucmVuZGVyKHQsZSxuKX0sZS5wcm90b3R5cGUuZ2V0SWNvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLGU9dC5nZXQoImljb24iLCEwKSxuPXt9O3JldHVybiBFKHQuZ2V0KCJ0eXBlIiwhMCksKGZ1bmN0aW9uKHQpe2VbdF0mJihuW3RdPWVbdF0pfSkpLG59LGUucHJvdG90eXBlLm9uY2xpY2s9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2JydXNoVHlwZSxyPXRoaXMuX2JydXNoTW9kZTsiY2xlYXIiPT09bj8oZS5kaXNwYXRjaEFjdGlvbih7dHlwZToiYXhpc0FyZWFTZWxlY3QiLGludGVydmFsczpbXX0pLGUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImJydXNoIixjb21tYW5kOiJjbGVhciIsYXJlYXM6W119KSk6ZS5kaXNwYXRjaEFjdGlvbih7dHlwZToidGFrZUdsb2JhbEN1cnNvciIsa2V5OiJicnVzaCIsYnJ1c2hPcHRpb246e2JydXNoVHlwZToia2VlcCI9PT1uP2k6aSE9PW4mJm4sYnJ1c2hNb2RlOiJrZWVwIj09PW4/Im11bHRpcGxlIj09PXI/InNpbmdsZSI6Im11bHRpcGxlIjpyfX0pfSxlLmdldERlZmF1bHRPcHRpb249ZnVuY3Rpb24odCl7cmV0dXJue3Nob3c6ITAsdHlwZTpqVi5zbGljZSgpLGljb246e3JlY3Q6Ik03LjMsMzQuNyBNMC40LDEwVi0wLjJoOS44IE04OS42LDEwVi0wLjJoLTkuOCBNMC40LDYwdjEwLjJoOS44IE04OS42LDYwdjEwLjJoLTkuOCBNMTIuMywyMi40VjEwLjVoMTMuMSBNMzMuNiwxMC41aDcuOCBNNDkuMSwxMC41aDcuOCBNNzcuNSwyMi40VjEwLjVoLTEzIE0xMi4zLDMxLjF2OC4yIE03Ny43LDMxLjF2OC4yIE0xMi4zLDQ3LjZ2MTEuOWgxMy4xIE0zMy42LDU5LjVoNy42IE00OS4xLDU5LjUgaDcuNyBNNzcuNSw0Ny42djExLjloLTEzIixwb2x5Z29uOiJNNTUuMiwzNC45YzEuNywwLDMuMSwxLjQsMy4xLDMuMXMtMS40LDMuMS0zLjEsMy4xIHMtMy4xLTEuNC0zLjEtMy4xUzUzLjUsMzQuOSw1NS4yLDM0Ljl6IE01MC40LDUxYzEuNywwLDMuMSwxLjQsMy4xLDMuMWMwLDEuNy0xLjQsMy4xLTMuMSwzLjFjLTEuNywwLTMuMS0xLjQtMy4xLTMuMSBDNDcuMyw1Mi40LDQ4LjcsNTEsNTAuNCw1MXogTTU1LjYsMzcuMWwxLjUtNy44IE02MC4xLDEzLjVsMS42LTguN2wtNy44LDQgTTU5LDE5bC0xLDUuMyBNMjQsMTYuMWw2LjQsNC45bDYuNC0zLjMgTTQ4LjUsMTEuNiBsLTUuOSwzLjEgTTE5LjEsMTIuOEw5LjcsNS4xbDEuMSw3LjcgTTEzLjQsMjkuOGwxLDcuM2w2LjYsMS42IE0xMS42LDE4LjRsMSw2LjEgTTMyLjgsNDEuOSBNMjYuNiw0MC40IE0yNy4zLDQwLjJsNi4xLDEuNiBNNDkuOSw1Mi4xbC01LjYtNy42bC00LjktMS4yIixsaW5lWDoiTTE1LjIsMzAgTTE5LjcsMTUuNlYxLjlIMjkgTTM0LjgsMS45SDQwLjQgTTU1LjMsMTUuNlYxLjlINDUuOSBNMTkuNyw0NC40VjU4LjFIMjkgTTM0LjgsNTguMUg0MC40IE01NS4zLDQ0LjQgVjU4LjFINDUuOSBNMTIuNSwyMC4zbC05LjQsOS42bDkuNiw5LjggTTMuMSwyOS45aDE2LjUgTTYyLjUsMjAuM2w5LjQsOS42TDYyLjMsMzkuNyBNNzEuOSwyOS45SDU1LjQiLGxpbmVZOiJNMzguOCw3LjcgTTUyLjcsMTJoMTMuMnY5IE02NS45LDI2LjZWMzIgTTUyLjcsNDYuM2gxMy4ydi05IE0yNC45LDEySDExLjh2OSBNMTEuOCwyNi42VjMyIE0yNC45LDQ2LjNIMTEuOHYtOSBNNDguMiw1LjFsLTkuMy05bC05LjQsOS4yIE0zOC45LTMuOVYxMiBNNDguMiw1My4zbC05LjMsOWwtOS40LTkuMiBNMzguOSw2Mi4zVjQ2LjQiLGtlZXA6Ik00LDEwLjVWMWgxMC4zIE0yMC43LDFoNi4xIE0zMywxaDYuMSBNNTUuNCwxMC41VjFINDUuMiBNNCwxNy4zdjYuNiBNNTUuNiwxNy4zdjYuNiBNNCwzMC41VjQwaDEwLjMgTTIwLjcsNDAgaDYuMSBNMzMsNDBoNi4xIE01NS40LDMwLjVWNDBINDUuMiBNMjEsMTguOWg2Mi45djQ4LjZIMjFWMTguOXoiLGNsZWFyOiJNMjIsMTQuN2wzMC45LDMxIE01Mi45LDE0LjdMMjIsNDUuNyBNNC43LDE2LjhWNC4yaDEzLjEgTTI2LDQuMmg3LjggTTQxLjYsNC4yaDcuOCBNNzAuMywxNi44VjQuMkg1Ny4yIE00LjcsMjUuOXY4LjYgTTcwLjMsMjUuOXY4LjYgTTQuNyw0My4ydjEyLjZoMTMuMSBNMjYsNTUuOGg3LjggTTQxLjYsNTUuOGg3LjggTTcwLjMsNDMuMnYxMi42SDU3LjIifSx0aXRsZTp0LmdldExvY2FsZU1vZGVsKCkuZ2V0KFsidG9vbGJveCIsImJydXNoIiwidGl0bGUiXSl9fSxlfShteik7dmFyIEtWPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5sYXlvdXRNb2RlPXt0eXBlOiJib3giLGlnbm9yZVNpemU6ITB9LG59cmV0dXJuIG4oZSx0KSxlLnR5cGU9InRpdGxlIixlLmRlZmF1bHRPcHRpb249e3o6NixzaG93OiEwLHRleHQ6IiIsdGFyZ2V0OiJibGFuayIsc3VidGV4dDoiIixzdWJ0YXJnZXQ6ImJsYW5rIixsZWZ0OjAsdG9wOjAsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJDb2xvcjoiI2NjYyIsYm9yZGVyV2lkdGg6MCxwYWRkaW5nOjUsaXRlbUdhcDoxMCx0ZXh0U3R5bGU6e2ZvbnRTaXplOjE4LGZvbnRXZWlnaHQ6ImJvbGQiLGNvbG9yOiIjNDY0NjQ2In0sc3VidGV4dFN0eWxlOntmb250U2l6ZToxMixjb2xvcjoiIzZFNzA3OSJ9fSxlfSh6cCksJFY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHQuZ2V0KCJzaG93Iikpe3ZhciBpPXRoaXMuZ3JvdXAscj10LmdldE1vZGVsKCJ0ZXh0U3R5bGUiKSxvPXQuZ2V0TW9kZWwoInN1YnRleHRTdHlsZSIpLGE9dC5nZXQoInRleHRBbGlnbiIpLHM9cnQodC5nZXQoInRleHRCYXNlbGluZSIpLHQuZ2V0KCJ0ZXh0VmVydGljYWxBbGlnbiIpKSxsPW5ldyBYcyh7c3R5bGU6b2Mocix7dGV4dDp0LmdldCgidGV4dCIpLGZpbGw6ci5nZXRUZXh0Q29sb3IoKX0se2Rpc2FibGVCb3g6ITB9KSx6MjoxMH0pLHU9bC5nZXRCb3VuZGluZ1JlY3QoKSxoPXQuZ2V0KCJzdWJ0ZXh0IiksYz1uZXcgWHMoe3N0eWxlOm9jKG8se3RleHQ6aCxmaWxsOm8uZ2V0VGV4dENvbG9yKCkseTp1LmhlaWdodCt0LmdldCgiaXRlbUdhcCIpLHZlcnRpY2FsQWxpZ246InRvcCJ9LHtkaXNhYmxlQm94OiEwfSksejI6MTB9KSxwPXQuZ2V0KCJsaW5rIiksZD10LmdldCgic3VibGluayIpLGY9dC5nZXQoInRyaWdnZXJFdmVudCIsITApO2wuc2lsZW50PSFwJiYhZixjLnNpbGVudD0hZCYmIWYscCYmbC5vbigiY2xpY2siLChmdW5jdGlvbigpe01wKHAsIl8iK3QuZ2V0KCJ0YXJnZXQiKSl9KSksZCYmYy5vbigiY2xpY2siLChmdW5jdGlvbigpe01wKGQsIl8iK3QuZ2V0KCJzdWJ0YXJnZXQiKSl9KSkscmwobCkuZXZlbnREYXRhPXJsKGMpLmV2ZW50RGF0YT1mP3tjb21wb25lbnRUeXBlOiJ0aXRsZSIsY29tcG9uZW50SW5kZXg6dC5jb21wb25lbnRJbmRleH06bnVsbCxpLmFkZChsKSxoJiZpLmFkZChjKTt2YXIgZz1pLmdldEJvdW5kaW5nUmVjdCgpLHk9dC5nZXRCb3hMYXlvdXRQYXJhbXMoKTt5LndpZHRoPWcud2lkdGgseS5oZWlnaHQ9Zy5oZWlnaHQ7dmFyIHY9a3AoeSx7d2lkdGg6bi5nZXRXaWR0aCgpLGhlaWdodDpuLmdldEhlaWdodCgpfSx0LmdldCgicGFkZGluZyIpKTthfHwoIm1pZGRsZSI9PT0oYT10LmdldCgibGVmdCIpfHx0LmdldCgicmlnaHQiKSkmJihhPSJjZW50ZXIiKSwicmlnaHQiPT09YT92LngrPXYud2lkdGg6ImNlbnRlciI9PT1hJiYodi54Kz12LndpZHRoLzIpKSxzfHwoImNlbnRlciI9PT0ocz10LmdldCgidG9wIil8fHQuZ2V0KCJib3R0b20iKSkmJihzPSJtaWRkbGUiKSwiYm90dG9tIj09PXM/di55Kz12LmhlaWdodDoibWlkZGxlIj09PXMmJih2LnkrPXYuaGVpZ2h0LzIpLHM9c3x8InRvcCIpLGkueD12LngsaS55PXYueSxpLm1hcmtSZWRyYXcoKTt2YXIgbT17YWxpZ246YSx2ZXJ0aWNhbEFsaWduOnN9O2wuc2V0U3R5bGUobSksYy5zZXRTdHlsZShtKSxnPWkuZ2V0Qm91bmRpbmdSZWN0KCk7dmFyIHg9di5tYXJnaW4sXz10LmdldEl0ZW1TdHlsZShbImNvbG9yIiwib3BhY2l0eSJdKTtfLmZpbGw9dC5nZXQoImJhY2tncm91bmRDb2xvciIpO3ZhciBiPW5ldyBXcyh7c2hhcGU6e3g6Zy54LXhbM10seTpnLnkteFswXSx3aWR0aDpnLndpZHRoK3hbMV0reFszXSxoZWlnaHQ6Zy5oZWlnaHQreFswXSt4WzJdLHI6dC5nZXQoImJvcmRlclJhZGl1cyIpfSxzdHlsZTpfLHN1YlBpeGVsT3B0aW1pemU6ITAsc2lsZW50OiEwfSk7aS5hZGQoYil9fSxlLnR5cGU9InRpdGxlIixlfShBZyk7dmFyIEpWPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5sYXlvdXRNb2RlPSJib3giLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsbiksdGhpcy5faW5pdERhdGEoKX0sZS5wcm90b3R5cGUubWVyZ2VPcHRpb249ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUubWVyZ2VPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2luaXREYXRhKCl9LGUucHJvdG90eXBlLnNldEN1cnJlbnRJbmRleD1mdW5jdGlvbih0KXtudWxsPT10JiYodD10aGlzLm9wdGlvbi5jdXJyZW50SW5kZXgpO3ZhciBlPXRoaXMuX2RhdGEuY291bnQoKTt0aGlzLm9wdGlvbi5sb29wP3Q9KHQlZStlKSVlOih0Pj1lJiYodD1lLTEpLHQ8MCYmKHQ9MCkpLHRoaXMub3B0aW9uLmN1cnJlbnRJbmRleD10fSxlLnByb3RvdHlwZS5nZXRDdXJyZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb24uY3VycmVudEluZGV4fSxlLnByb3RvdHlwZS5pc0luZGV4TWF4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q3VycmVudEluZGV4KCk+PXRoaXMuX2RhdGEuY291bnQoKS0xfSxlLnByb3RvdHlwZS5zZXRQbGF5U3RhdGU9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uYXV0b1BsYXk9ISF0fSxlLnByb3RvdHlwZS5nZXRQbGF5U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMub3B0aW9uLmF1dG9QbGF5fSxlLnByb3RvdHlwZS5faW5pdERhdGE9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMub3B0aW9uLG49ZS5kYXRhfHxbXSxpPWUuYXhpc1R5cGUscj10aGlzLl9uYW1lcz1bXTsiY2F0ZWdvcnkiPT09aT8odD1bXSxFKG4sKGZ1bmN0aW9uKGUsbil7dmFyIGksbz1SbyhBbyhlKSwiIik7cShlKT8oaT1UKGUpKS52YWx1ZT1uOmk9bix0LnB1c2goaSksci5wdXNoKG8pfSkpKTp0PW47dmFyIG89e2NhdGVnb3J5OiJvcmRpbmFsIix0aW1lOiJ0aW1lIix2YWx1ZToibnVtYmVyIn1baV18fCJudW1iZXIiOyh0aGlzLl9kYXRhPW5ldyBjeChbe25hbWU6InZhbHVlIix0eXBlOm99XSx0aGlzKSkuaW5pdERhdGEodCxyKX0sZS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxlLnByb3RvdHlwZS5nZXRDYXRlZ29yaWVzPWZ1bmN0aW9uKCl7aWYoImNhdGVnb3J5Ij09PXRoaXMuZ2V0KCJheGlzVHlwZSIpKXJldHVybiB0aGlzLl9uYW1lcy5zbGljZSgpfSxlLnR5cGU9InRpbWVsaW5lIixlLmRlZmF1bHRPcHRpb249e3o6NCxzaG93OiEwLGF4aXNUeXBlOiJ0aW1lIixyZWFsdGltZTohMCxsZWZ0OiIyMCUiLHRvcDpudWxsLHJpZ2h0OiIyMCUiLGJvdHRvbTowLHdpZHRoOm51bGwsaGVpZ2h0OjQwLHBhZGRpbmc6NSxjb250cm9sUG9zaXRpb246ImxlZnQiLGF1dG9QbGF5OiExLHJld2luZDohMSxsb29wOiEwLHBsYXlJbnRlcnZhbDoyZTMsY3VycmVudEluZGV4OjAsaXRlbVN0eWxlOnt9LGxhYmVsOntjb2xvcjoiIzAwMCJ9LGRhdGE6W119LGV9KHpwKSxRVj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnR5cGU9InRpbWVsaW5lLnNsaWRlciIsZS5kZWZhdWx0T3B0aW9uPWtjKEpWLmRlZmF1bHRPcHRpb24se2JhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsYm9yZGVyQ29sb3I6IiNjY2MiLGJvcmRlcldpZHRoOjAsb3JpZW50OiJob3Jpem9udGFsIixpbnZlcnNlOiExLHRvb2x0aXA6e3RyaWdnZXI6Iml0ZW0ifSxzeW1ib2w6ImNpcmNsZSIsc3ltYm9sU2l6ZToxMixsaW5lU3R5bGU6e3Nob3c6ITAsd2lkdGg6Mixjb2xvcjoiI0RBRTFGNSJ9LGxhYmVsOntwb3NpdGlvbjoiYXV0byIsc2hvdzohMCxpbnRlcnZhbDoiYXV0byIscm90YXRlOjAsY29sb3I6IiNBNEIxRDcifSxpdGVtU3R5bGU6e2NvbG9yOiIjQTRCMUQ3Iixib3JkZXJXaWR0aDoxfSxjaGVja3BvaW50U3R5bGU6e3N5bWJvbDoiY2lyY2xlIixzeW1ib2xTaXplOjE1LGNvbG9yOiIjMzE2YmYzIixib3JkZXJDb2xvcjoiI2ZmZiIsYm9yZGVyV2lkdGg6MixzaGFkb3dCbHVyOjIsc2hhZG93T2Zmc2V0WDoxLHNoYWRvd09mZnNldFk6MSxzaGFkb3dDb2xvcjoicmdiYSgwLCAwLCAwLCAwLjMpIixhbmltYXRpb246ITAsYW5pbWF0aW9uRHVyYXRpb246MzAwLGFuaW1hdGlvbkVhc2luZzoicXVpbnRpY0luT3V0In0sY29udHJvbFN0eWxlOntzaG93OiEwLHNob3dQbGF5QnRuOiEwLHNob3dQcmV2QnRuOiEwLHNob3dOZXh0QnRuOiEwLGl0ZW1TaXplOjI0LGl0ZW1HYXA6MTIscG9zaXRpb246ImxlZnQiLHBsYXlJY29uOiJwYXRoOi8vTTMxLjYsNTNDMTcuNSw1Myw2LDQxLjUsNiwyNy40UzE3LjUsMS44LDMxLjYsMS44QzQ1LjcsMS44LDU3LjIsMTMuMyw1Ny4yLDI3LjRTNDUuNyw1MywzMS42LDUzeiBNMzEuNiwzLjMgQzE4LjQsMy4zLDcuNSwxNC4xLDcuNSwyNy40YzAsMTMuMywxMC44LDI0LjEsMjQuMSwyNC4xQzQ0LjksNTEuNSw1NS43LDQwLjcsNTUuNywyNy40QzU1LjcsMTQuMSw0NC45LDMuMywzMS42LDMuM3ogTTI0LjksMjEuMyBjMC0yLjIsMS42LTMuMSwzLjUtMmwxMC41LDYuMWMxLjg5OSwxLjEsMS44OTksMi45LDAsNGwtMTAuNSw2LjFjLTEuOSwxLjEtMy41LDAuMi0zLjUtMlYyMS4zeiIsc3RvcEljb246InBhdGg6Ly9NMzAuOSw1My4yQzE2LjgsNTMuMiw1LjMsNDEuNyw1LjMsMjcuNlMxNi44LDIsMzAuOSwyQzQ1LDIsNTYuNCwxMy41LDU2LjQsMjcuNlM0NSw1My4yLDMwLjksNTMuMnogTTMwLjksMy41QzE3LjYsMy41LDYuOCwxNC40LDYuOCwyNy42YzAsMTMuMywxMC44LDI0LjEsMjQuMTAxLDI0LjFDNDQuMiw1MS43LDU1LDQwLjksNTUsMjcuNkM1NC45LDE0LjQsNDQuMSwzLjUsMzAuOSwzLjV6IE0zNi45LDM1LjhjMCwwLjYwMS0wLjQsMS0wLjksMWgtMS4zYy0wLjUsMC0wLjktMC4zOTktMC45LTFWMTkuNWMwLTAuNiwwLjQtMSwwLjktMUgzNmMwLjUsMCwwLjksMC40LDAuOSwxVjM1Ljh6IE0yNy44LDM1LjggYzAsMC42MDEtMC40LDEtMC45LDFoLTEuM2MtMC41LDAtMC45LTAuMzk5LTAuOS0xVjE5LjVjMC0wLjYsMC40LTEsMC45LTFIMjdjMC41LDAsMC45LDAuNCwwLjksMUwyNy44LDM1LjhMMjcuOCwzNS44eiIsbmV4dEljb246Ik0yLDE4LjVBMS41MiwxLjUyLDAsMCwxLC45MiwxOGExLjQ5LDEuNDksMCwwLDEsMC0yLjEyTDcuODEsOS4zNiwxLDMuMTFBMS41LDEuNSwwLDEsMSwzLC44OWw4LDcuMzRhMS40OCwxLjQ4LDAsMCwxLC40OSwxLjA5LDEuNTEsMS41MSwwLDAsMS0uNDYsMS4xTDMsMTguMDhBMS41LDEuNSwwLDAsMSwyLDE4LjVaIixwcmV2SWNvbjoiTTEwLC41QTEuNTIsMS41MiwwLDAsMSwxMS4wOCwxYTEuNDksMS40OSwwLDAsMSwwLDIuMTJMNC4xOSw5LjY0LDExLDE1Ljg5YTEuNSwxLjUsMCwxLDEtMiwyLjIyTDEsMTAuNzdBMS40OCwxLjQ4LDAsMCwxLC41LDkuNjgsMS41MSwxLjUxLDAsMCwxLDEsOC41OEw5LC45MkExLjUsMS41LDAsMCwxLDEwLC41WiIscHJldkJ0blNpemU6MTgsbmV4dEJ0blNpemU6MTgsY29sb3I6IiNBNEIxRDciLGJvcmRlckNvbG9yOiIjQTRCMUQ3Iixib3JkZXJXaWR0aDoxfSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITAsY29sb3I6IiM2Zjc3OGQifSxpdGVtU3R5bGU6e2NvbG9yOiIjMzE2QkYzIn0sY29udHJvbFN0eWxlOntjb2xvcjoiIzMxNkJGMyIsYm9yZGVyQ29sb3I6IiMzMTZCRjMiLGJvcmRlcldpZHRoOjJ9fSxwcm9ncmVzczp7bGluZVN0eWxlOntjb2xvcjoiIzMxNkJGMyJ9LGl0ZW1TdHlsZTp7Y29sb3I6IiMzMTZCRjMifSxsYWJlbDp7Y29sb3I6IiM2Zjc3OGQifX0sZGF0YTpbXX0pLGV9KEpWKTtSKFFWLF9mLnByb3RvdHlwZSk7dmFyIHRCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUudHlwZT0idGltZWxpbmUiLGV9KEFnKSxlQj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixpLHIpe3ZhciBvPXQuY2FsbCh0aGlzLGUsbixpKXx8dGhpcztyZXR1cm4gby50eXBlPXJ8fCJ2YWx1ZSIsb31yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmdldExhYmVsTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb2RlbC5nZXRNb2RlbCgibGFiZWwiKX0sZS5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiPT09dGhpcy5tb2RlbC5nZXQoIm9yaWVudCIpfSxlfShhYiksbkI9TWF0aC5QSSxpQj1WbygpLHJCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmFwaT1lfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMubW9kZWw9dCx0aGlzLmFwaT1uLHRoaXMuZWNNb2RlbD1lLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciLCEwKSl7dmFyIGk9dGhpcy5fbGF5b3V0KHQsbikscj10aGlzLl9jcmVhdGVHcm91cCgiX21haW5Hcm91cCIpLG89dGhpcy5fY3JlYXRlR3JvdXAoIl9sYWJlbEdyb3VwIiksYT10aGlzLl9heGlzPXRoaXMuX2NyZWF0ZUF4aXMoaSx0KTt0LmZvcm1hdFRvb2x0aXA9ZnVuY3Rpb24odCl7cmV0dXJuIG9nKCJuYW1lVmFsdWUiLHtub05hbWU6ITAsdmFsdWU6YS5zY2FsZS5nZXRMYWJlbCh7dmFsdWU6dH0pfSl9LEUoWyJBeGlzTGluZSIsIkF4aXNUaWNrIiwiQ29udHJvbCIsIkN1cnJlbnRQb2ludGVyIl0sKGZ1bmN0aW9uKGUpe3RoaXNbIl9yZW5kZXIiK2VdKGkscixhLHQpfSksdGhpcyksdGhpcy5fcmVuZGVyQXhpc0xhYmVsKGksbyxhLHQpLHRoaXMuX3Bvc2l0aW9uKGksdCl9dGhpcy5fZG9QbGF5U3RvcCgpLHRoaXMuX3VwZGF0ZVRpY2tzU3RhdHVzKCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyVGltZXIoKSx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJUaW1lcigpfSxlLnByb3RvdHlwZS5fbGF5b3V0PWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLG8sYT10LmdldChbImxhYmVsIiwicG9zaXRpb24iXSkscz10LmdldCgib3JpZW50IiksbD1mdW5jdGlvbih0LGUpe3JldHVybiBrcCh0LmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9LHQuZ2V0KCJwYWRkaW5nIikpfSh0LGUpLHU9e2hvcml6b250YWw6ImNlbnRlciIsdmVydGljYWw6KG49bnVsbD09YXx8ImF1dG8iPT09YT8iaG9yaXpvbnRhbCI9PT1zP2wueStsLmhlaWdodC8yPGUuZ2V0SGVpZ2h0KCkvMj8iLSI6IisiOmwueCtsLndpZHRoLzI8ZS5nZXRXaWR0aCgpLzI/IisiOiItIjpVKGEpP3tob3Jpem9udGFsOnt0b3A6Ii0iLGJvdHRvbToiKyJ9LHZlcnRpY2FsOntsZWZ0OiItIixyaWdodDoiKyJ9fVtzXVthXTphKT49MHx8IisiPT09bj8ibGVmdCI6InJpZ2h0In0saD17aG9yaXpvbnRhbDpuPj0wfHwiKyI9PT1uPyJ0b3AiOiJib3R0b20iLHZlcnRpY2FsOiJtaWRkbGUifSxjPXtob3Jpem9udGFsOjAsdmVydGljYWw6bkIvMn0scD0idmVydGljYWwiPT09cz9sLmhlaWdodDpsLndpZHRoLGQ9dC5nZXRNb2RlbCgiY29udHJvbFN0eWxlIiksZj1kLmdldCgic2hvdyIsITApLGc9Zj9kLmdldCgiaXRlbVNpemUiKTowLHk9Zj9kLmdldCgiaXRlbUdhcCIpOjAsdj1nK3ksbT10LmdldChbImxhYmVsIiwicm90YXRlIl0pfHwwO209bSpuQi8xODA7dmFyIHg9ZC5nZXQoInBvc2l0aW9uIiwhMCksXz1mJiZkLmdldCgic2hvd1BsYXlCdG4iLCEwKSxiPWYmJmQuZ2V0KCJzaG93UHJldkJ0biIsITApLHc9ZiYmZC5nZXQoInNob3dOZXh0QnRuIiwhMCksUz0wLE09cDsibGVmdCI9PT14fHwiYm90dG9tIj09PXg/KF8mJihpPVswLDBdLFMrPXYpLGImJihyPVtTLDBdLFMrPXYpLHcmJihvPVtNLWcsMF0sTS09dikpOihfJiYoaT1bTS1nLDBdLE0tPXYpLGImJihyPVswLDBdLFMrPXYpLHcmJihvPVtNLWcsMF0sTS09dikpO3ZhciBJPVtTLE1dO3JldHVybiB0LmdldCgiaW52ZXJzZSIpJiZJLnJldmVyc2UoKSx7dmlld1JlY3Q6bCxtYWluTGVuZ3RoOnAsb3JpZW50OnMscm90YXRpb246Y1tzXSxsYWJlbFJvdGF0aW9uOm0sbGFiZWxQb3NPcHQ6bixsYWJlbEFsaWduOnQuZ2V0KFsibGFiZWwiLCJhbGlnbiJdKXx8dVtzXSxsYWJlbEJhc2VsaW5lOnQuZ2V0KFsibGFiZWwiLCJ2ZXJ0aWNhbEFsaWduIl0pfHx0LmdldChbImxhYmVsIiwiYmFzZWxpbmUiXSl8fGhbc10scGxheVBvc2l0aW9uOmkscHJldkJ0blBvc2l0aW9uOnIsbmV4dEJ0blBvc2l0aW9uOm8sYXhpc0V4dGVudDpJLGNvbnRyb2xTaXplOmcsY29udHJvbEdhcDp5fX0sZS5wcm90b3R5cGUuX3Bvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbWFpbkdyb3VwLGk9dGhpcy5fbGFiZWxHcm91cCxyPXQudmlld1JlY3Q7aWYoInZlcnRpY2FsIj09PXQub3JpZW50KXt2YXIgbz1bMSwwLDAsMSwwLDBdLGE9ci54LHM9ci55K3IuaGVpZ2h0O3dlKG8sbyxbLWEsLXNdKSxTZShvLG8sLW5CLzIpLHdlKG8sbyxbYSxzXSksKHI9ci5jbG9uZSgpKS5hcHBseVRyYW5zZm9ybShvKX12YXIgbD15KHIpLHU9eShuLmdldEJvdW5kaW5nUmVjdCgpKSxoPXkoaS5nZXRCb3VuZGluZ1JlY3QoKSksYz1bbi54LG4ueV0scD1baS54LGkueV07cFswXT1jWzBdPWxbMF1bMF07dmFyIGQsZj10LmxhYmVsUG9zT3B0O251bGw9PWZ8fFUoZik/KHYoYyx1LGwsMSxkPSIrIj09PWY/MDoxKSx2KHAsaCxsLDEsMS1kKSk6KHYoYyx1LGwsMSxkPWY+PTA/MDoxKSxwWzFdPWNbMV0rZik7ZnVuY3Rpb24gZyh0KXt0Lm9yaWdpblg9bFswXVswXS10LngsdC5vcmlnaW5ZPWxbMV1bMF0tdC55fWZ1bmN0aW9uIHkodCl7cmV0dXJuW1t0LngsdC54K3Qud2lkdGhdLFt0LnksdC55K3QuaGVpZ2h0XV19ZnVuY3Rpb24gdih0LGUsbixpLHIpe3RbaV0rPW5baV1bcl0tZVtpXVtyXX1uLnNldFBvc2l0aW9uKGMpLGkuc2V0UG9zaXRpb24ocCksbi5yb3RhdGlvbj1pLnJvdGF0aW9uPXQucm90YXRpb24sZyhuKSxnKGkpfSxlLnByb3RvdHlwZS5fY3JlYXRlQXhpcz1mdW5jdGlvbih0LGUpe3ZhciBuPWUuZ2V0RGF0YSgpLGk9ZS5nZXQoImF4aXNUeXBlIikscj1mdW5jdGlvbih0LGUpe2lmKGU9ZXx8dC5nZXQoInR5cGUiKSxlKXN3aXRjaChlKXtjYXNlImNhdGVnb3J5IjpyZXR1cm4gbmV3IFJ4KHtvcmRpbmFsTWV0YTp0LmdldENhdGVnb3JpZXMoKSxleHRlbnQ6WzEvMCwtMS8wXX0pO2Nhc2UidGltZSI6cmV0dXJuIG5ldyBLeCh7bG9jYWxlOnQuZWNNb2RlbC5nZXRMb2NhbGVNb2RlbCgpLHVzZVVUQzp0LmVjTW9kZWwuZ2V0KCJ1c2VVVEMiKX0pO2RlZmF1bHQ6cmV0dXJuIG5ldyBFeH19KGUsaSk7ci5nZXRUaWNrcz1mdW5jdGlvbigpe3JldHVybiBuLm1hcEFycmF5KFsidmFsdWUiXSwoZnVuY3Rpb24odCl7cmV0dXJue3ZhbHVlOnR9fSkpfTt2YXIgbz1uLmdldERhdGFFeHRlbnQoInZhbHVlIik7ci5zZXRFeHRlbnQob1swXSxvWzFdKSxyLmNhbGNOaWNlVGlja3MoKTt2YXIgYT1uZXcgZUIoInZhbHVlIixyLHQuYXhpc0V4dGVudCxpKTtyZXR1cm4gYS5tb2RlbD1lLGF9LGUucHJvdG90eXBlLl9jcmVhdGVHcm91cD1mdW5jdGlvbih0KXt2YXIgZT10aGlzW3RdPW5ldyBCcjtyZXR1cm4gdGhpcy5ncm91cC5hZGQoZSksZX0sZS5wcm90b3R5cGUuX3JlbmRlckF4aXNMaW5lPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPW4uZ2V0RXh0ZW50KCk7aWYoaS5nZXQoWyJsaW5lU3R5bGUiLCJzaG93Il0pKXt2YXIgbz1uZXcgS3Uoe3NoYXBlOnt4MTpyWzBdLHkxOjAseDI6clsxXSx5MjowfSxzdHlsZTpBKHtsaW5lQ2FwOiJyb3VuZCJ9LGkuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpKSxzaWxlbnQ6ITAsejI6MX0pO2UuYWRkKG8pO3ZhciBhPXRoaXMuX3Byb2dyZXNzTGluZT1uZXcgS3Uoe3NoYXBlOnt4MTpyWzBdLHgyOnRoaXMuX2N1cnJlbnRQb2ludGVyP3RoaXMuX2N1cnJlbnRQb2ludGVyLng6clswXSx5MTowLHkyOjB9LHN0eWxlOmsoe2xpbmVDYXA6InJvdW5kIixsaW5lV2lkdGg6by5zdHlsZS5saW5lV2lkdGh9LGkuZ2V0TW9kZWwoWyJwcm9ncmVzcyIsImxpbmVTdHlsZSJdKS5nZXRMaW5lU3R5bGUoKSksc2lsZW50OiEwLHoyOjF9KTtlLmFkZChhKX19LGUucHJvdG90eXBlLl9yZW5kZXJBeGlzVGljaz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLG89aS5nZXREYXRhKCksYT1uLnNjYWxlLmdldFRpY2tzKCk7dGhpcy5fdGlja1N5bWJvbHM9W10sRShhLChmdW5jdGlvbih0KXt2YXIgYT1uLmRhdGFUb0Nvb3JkKHQudmFsdWUpLHM9by5nZXRJdGVtTW9kZWwodC52YWx1ZSksbD1zLmdldE1vZGVsKCJpdGVtU3R5bGUiKSx1PXMuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsIml0ZW1TdHlsZSJdKSxoPXMuZ2V0TW9kZWwoWyJwcm9ncmVzcyIsIml0ZW1TdHlsZSJdKSxjPXt4OmEseTowLG9uY2xpY2s6VyhyLl9jaGFuZ2VUaW1lbGluZSxyLHQudmFsdWUpfSxwPW9CKHMsbCxlLGMpO3AuZW5zdXJlU3RhdGUoImVtcGhhc2lzIikuc3R5bGU9dS5nZXRJdGVtU3R5bGUoKSxwLmVuc3VyZVN0YXRlKCJwcm9ncmVzcyIpLnN0eWxlPWguZ2V0SXRlbVN0eWxlKCksVWwocCk7dmFyIGQ9cmwocCk7cy5nZXQoInRvb2x0aXAiKT8oZC5kYXRhSW5kZXg9dC52YWx1ZSxkLmRhdGFNb2RlbD1pKTpkLmRhdGFJbmRleD1kLmRhdGFNb2RlbD1udWxsLHIuX3RpY2tTeW1ib2xzLnB1c2gocCl9KSl9LGUucHJvdG90eXBlLl9yZW5kZXJBeGlzTGFiZWw9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcztpZihuLmdldExhYmVsTW9kZWwoKS5nZXQoInNob3ciKSl7dmFyIG89aS5nZXREYXRhKCksYT1uLmdldFZpZXdMYWJlbHMoKTt0aGlzLl90aWNrTGFiZWxzPVtdLEUoYSwoZnVuY3Rpb24oaSl7dmFyIGE9aS50aWNrVmFsdWUscz1vLmdldEl0ZW1Nb2RlbChhKSxsPXMuZ2V0TW9kZWwoImxhYmVsIiksdT1zLmdldE1vZGVsKFsiZW1waGFzaXMiLCJsYWJlbCJdKSxoPXMuZ2V0TW9kZWwoWyJwcm9ncmVzcyIsImxhYmVsIl0pLGM9bi5kYXRhVG9Db29yZChpLnRpY2tWYWx1ZSkscD1uZXcgWHMoe3g6Yyx5OjAscm90YXRpb246dC5sYWJlbFJvdGF0aW9uLXQucm90YXRpb24sb25jbGljazpXKHIuX2NoYW5nZVRpbWVsaW5lLHIsYSksc2lsZW50OiExLHN0eWxlOm9jKGwse3RleHQ6aS5mb3JtYXR0ZWRMYWJlbCxhbGlnbjp0LmxhYmVsQWxpZ24sdmVydGljYWxBbGlnbjp0LmxhYmVsQmFzZWxpbmV9KX0pO3AuZW5zdXJlU3RhdGUoImVtcGhhc2lzIikuc3R5bGU9b2ModSkscC5lbnN1cmVTdGF0ZSgicHJvZ3Jlc3MiKS5zdHlsZT1vYyhoKSxlLmFkZChwKSxVbChwKSxpQihwKS5kYXRhSW5kZXg9YSxyLl90aWNrTGFiZWxzLnB1c2gocCl9KSl9fSxlLnByb3RvdHlwZS5fcmVuZGVyQ29udHJvbD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LmNvbnRyb2xTaXplLG89dC5yb3RhdGlvbixhPWkuZ2V0TW9kZWwoImNvbnRyb2xTdHlsZSIpLmdldEl0ZW1TdHlsZSgpLHM9aS5nZXRNb2RlbChbImVtcGhhc2lzIiwiY29udHJvbFN0eWxlIl0pLmdldEl0ZW1TdHlsZSgpLGw9aS5nZXRQbGF5U3RhdGUoKSx1PWkuZ2V0KCJpbnZlcnNlIiwhMCk7ZnVuY3Rpb24gaCh0LG4sbCx1KXtpZih0KXt2YXIgaD1DcihydChpLmdldChbImNvbnRyb2xTdHlsZSIsbisiQnRuU2l6ZSJdKSxyKSxyKSxjPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPWkuc3R5bGUsbz1VaCh0LmdldChbImNvbnRyb2xTdHlsZSIsZV0pLGl8fHt9LG5ldyB6ZShuWzBdLG5bMV0sblsyXSxuWzNdKSk7ciYmby5zZXRTdHlsZShyKTtyZXR1cm4gb30oaSxuKyJJY29uIixbMCwtaC8yLGgsaF0se3g6dFswXSx5OnRbMV0sb3JpZ2luWDpyLzIsb3JpZ2luWTowLHJvdGF0aW9uOnU/LW86MCxyZWN0SG92ZXI6ITAsc3R5bGU6YSxvbmNsaWNrOmx9KTtjLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPXMsZS5hZGQoYyksVWwoYyl9fWgodC5uZXh0QnRuUG9zaXRpb24sIm5leHQiLFcodGhpcy5fY2hhbmdlVGltZWxpbmUsdGhpcyx1PyItIjoiKyIpKSxoKHQucHJldkJ0blBvc2l0aW9uLCJwcmV2IixXKHRoaXMuX2NoYW5nZVRpbWVsaW5lLHRoaXMsdT8iKyI6Ii0iKSksaCh0LnBsYXlQb3NpdGlvbixsPyJzdG9wIjoicGxheSIsVyh0aGlzLl9oYW5kbGVQbGF5Q2xpY2ssdGhpcywhbCksITApfSxlLnByb3RvdHlwZS5fcmVuZGVyQ3VycmVudFBvaW50ZXI9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9aS5nZXREYXRhKCksbz1pLmdldEN1cnJlbnRJbmRleCgpLGE9ci5nZXRJdGVtTW9kZWwobykuZ2V0TW9kZWwoImNoZWNrcG9pbnRTdHlsZSIpLHM9dGhpcyxsPXtvbkNyZWF0ZTpmdW5jdGlvbih0KXt0LmRyYWdnYWJsZT0hMCx0LmRyaWZ0PVcocy5faGFuZGxlUG9pbnRlckRyYWcscyksdC5vbmRyYWdlbmQ9VyhzLl9oYW5kbGVQb2ludGVyRHJhZ2VuZCxzKSxhQih0LHMuX3Byb2dyZXNzTGluZSxvLG4saSwhMCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe2FCKHQscy5fcHJvZ3Jlc3NMaW5lLG8sbixpKX19O3RoaXMuX2N1cnJlbnRQb2ludGVyPW9CKGEsYSx0aGlzLl9tYWluR3JvdXAse30sdGhpcy5fY3VycmVudFBvaW50ZXIsbCl9LGUucHJvdG90eXBlLl9oYW5kbGVQbGF5Q2xpY2s9ZnVuY3Rpb24odCl7dGhpcy5fY2xlYXJUaW1lcigpLHRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0aW1lbGluZVBsYXlDaGFuZ2UiLHBsYXlTdGF0ZTp0LGZyb206dGhpcy51aWR9KX0sZS5wcm90b3R5cGUuX2hhbmRsZVBvaW50ZXJEcmFnPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fcG9pbnRlckNoYW5nZVRpbWVsaW5lKFtuLm9mZnNldFgsbi5vZmZzZXRZXSl9LGUucHJvdG90eXBlLl9oYW5kbGVQb2ludGVyRHJhZ2VuZD1mdW5jdGlvbih0KXt0aGlzLl9wb2ludGVyQ2hhbmdlVGltZWxpbmUoW3Qub2Zmc2V0WCx0Lm9mZnNldFldLCEwKX0sZS5wcm90b3R5cGUuX3BvaW50ZXJDaGFuZ2VUaW1lbGluZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3RvQXhpc0Nvb3JkKHQpWzBdLGk9UXIodGhpcy5fYXhpcy5nZXRFeHRlbnQoKS5zbGljZSgpKTtuPmlbMV0mJihuPWlbMV0pLG48aVswXSYmKG49aVswXSksdGhpcy5fY3VycmVudFBvaW50ZXIueD1uLHRoaXMuX2N1cnJlbnRQb2ludGVyLm1hcmtSZWRyYXcoKTt2YXIgcj10aGlzLl9wcm9ncmVzc0xpbmU7ciYmKHIuc2hhcGUueDI9bixyLmRpcnR5KCkpO3ZhciBvPXRoaXMuX2ZpbmROZWFyZXN0VGljayhuKSxhPXRoaXMubW9kZWw7KGV8fG8hPT1hLmdldEN1cnJlbnRJbmRleCgpJiZhLmdldCgicmVhbHRpbWUiKSkmJnRoaXMuX2NoYW5nZVRpbWVsaW5lKG8pfSxlLnByb3RvdHlwZS5fZG9QbGF5U3RvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fY2xlYXJUaW1lcigpLHRoaXMubW9kZWwuZ2V0UGxheVN0YXRlKCkmJih0aGlzLl90aW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciBlPXQubW9kZWw7dC5fY2hhbmdlVGltZWxpbmUoZS5nZXRDdXJyZW50SW5kZXgoKSsoZS5nZXQoInJld2luZCIsITApPy0xOjEpKX0pLHRoaXMubW9kZWwuZ2V0KCJwbGF5SW50ZXJ2YWwiKSkpfSxlLnByb3RvdHlwZS5fdG9BeGlzQ29vcmQ9ZnVuY3Rpb24odCl7cmV0dXJuIEZoKHQsdGhpcy5fbWFpbkdyb3VwLmdldExvY2FsVHJhbnNmb3JtKCksITApfSxlLnByb3RvdHlwZS5fZmluZE5lYXJlc3RUaWNrPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5tb2RlbC5nZXREYXRhKCksaT0xLzAscj10aGlzLl9heGlzO3JldHVybiBuLmVhY2goWyJ2YWx1ZSJdLChmdW5jdGlvbihuLG8pe3ZhciBhPXIuZGF0YVRvQ29vcmQobikscz1NYXRoLmFicyhhLXQpO3M8aSYmKGk9cyxlPW8pfSkpLGV9LGUucHJvdG90eXBlLl9jbGVhclRpbWVyPWZ1bmN0aW9uKCl7dGhpcy5fdGltZXImJihjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpfSxlLnByb3RvdHlwZS5fY2hhbmdlVGltZWxpbmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tb2RlbC5nZXRDdXJyZW50SW5kZXgoKTsiKyI9PT10P3Q9ZSsxOiItIj09PXQmJih0PWUtMSksdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRpbWVsaW5lQ2hhbmdlIixjdXJyZW50SW5kZXg6dCxmcm9tOnRoaXMudWlkfSl9LGUucHJvdG90eXBlLl91cGRhdGVUaWNrc1N0YXR1cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMubW9kZWwuZ2V0Q3VycmVudEluZGV4KCksZT10aGlzLl90aWNrU3ltYm9scyxuPXRoaXMuX3RpY2tMYWJlbHM7aWYoZSlmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyllJiZlW2ldJiZlW2ldLnRvZ2dsZVN0YXRlKCJwcm9ncmVzcyIsaTx0KTtpZihuKWZvcihpPTA7aTxuLmxlbmd0aDtpKyspbiYmbltpXSYmbltpXS50b2dnbGVTdGF0ZSgicHJvZ3Jlc3MiLGlCKG5baV0pLmRhdGFJbmRleDw9dCl9LGUudHlwZT0idGltZWxpbmUuc2xpZGVyIixlfSh0Qik7ZnVuY3Rpb24gb0IodCxlLG4saSxyLG8pe3ZhciBhPWUuZ2V0KCJjb2xvciIpO3I/KHIuc2V0Q29sb3IoYSksbi5hZGQociksbyYmby5vblVwZGF0ZShyKSk6KChyPVh5KHQuZ2V0KCJzeW1ib2wiKSwtMSwtMSwyLDIsYSkpLnNldFN0eWxlKCJzdHJva2VOb1NjYWxlIiwhMCksbi5hZGQociksbyYmby5vbkNyZWF0ZShyKSk7dmFyIHM9ZS5nZXRJdGVtU3R5bGUoWyJjb2xvciJdKTtyLnNldFN0eWxlKHMpLGk9Qyh7cmVjdEhvdmVyOiEwLHoyOjEwMH0saSwhMCk7dmFyIGw9VXkodC5nZXQoInN5bWJvbFNpemUiKSk7aS5zY2FsZVg9bFswXS8yLGkuc2NhbGVZPWxbMV0vMjt2YXIgdT1aeSh0LmdldCgic3ltYm9sT2Zmc2V0IiksbCk7dSYmKGkueD0oaS54fHwwKSt1WzBdLGkueT0oaS55fHwwKSt1WzFdKTt2YXIgaD10LmdldCgic3ltYm9sUm90YXRlIik7cmV0dXJuIGkucm90YXRpb249KGh8fDApKk1hdGguUEkvMTgwfHwwLHIuYXR0cihpKSxyLnVwZGF0ZVRyYW5zZm9ybSgpLHJ9ZnVuY3Rpb24gYUIodCxlLG4saSxyLG8pe2lmKCF0LmRyYWdnaW5nKXt2YXIgYT1yLmdldE1vZGVsKCJjaGVja3BvaW50U3R5bGUiKSxzPWkuZGF0YVRvQ29vcmQoci5nZXREYXRhKCkuZ2V0KCJ2YWx1ZSIsbikpO2lmKG98fCFhLmdldCgiYW5pbWF0aW9uIiwhMCkpdC5hdHRyKHt4OnMseTowfSksZSYmZS5hdHRyKHtzaGFwZTp7eDI6c319KTtlbHNle3ZhciBsPXtkdXJhdGlvbjphLmdldCgiYW5pbWF0aW9uRHVyYXRpb24iLCEwKSxlYXNpbmc6YS5nZXQoImFuaW1hdGlvbkVhc2luZyIsITApfTt0LnN0b3BBbmltYXRpb24obnVsbCwhMCksdC5hbmltYXRlVG8oe3g6cyx5OjB9LGwpLGUmJmUuYW5pbWF0ZVRvKHtzaGFwZTp7eDI6c319LGwpfX19ZnVuY3Rpb24gc0IodCl7dmFyIGU9dCYmdC50aW1lbGluZTtZKGUpfHwoZT1lP1tlXTpbXSksRShlLChmdW5jdGlvbih0KXt0JiZmdW5jdGlvbih0KXt2YXIgZT10LnR5cGUsbj17bnVtYmVyOiJ2YWx1ZSIsdGltZToidGltZSJ9O25bZV0mJih0LmF4aXNUeXBlPW5bZV0sZGVsZXRlIHQudHlwZSk7aWYobEIodCksdUIodCwiY29udHJvbFBvc2l0aW9uIikpe3ZhciBpPXQuY29udHJvbFN0eWxlfHwodC5jb250cm9sU3R5bGU9e30pO3VCKGksInBvc2l0aW9uIil8fChpLnBvc2l0aW9uPXQuY29udHJvbFBvc2l0aW9uKSwibm9uZSIhPT1pLnBvc2l0aW9ufHx1QihpLCJzaG93Iil8fChpLnNob3c9ITEsZGVsZXRlIGkucG9zaXRpb24pLGRlbGV0ZSB0LmNvbnRyb2xQb3NpdGlvbn1FKHQuZGF0YXx8W10sKGZ1bmN0aW9uKHQpe3EodCkmJiFZKHQpJiYoIXVCKHQsInZhbHVlIikmJnVCKHQsIm5hbWUiKSYmKHQudmFsdWU9dC5uYW1lKSxsQih0KSl9KSl9KHQpfSkpfWZ1bmN0aW9uIGxCKHQpe3ZhciBlPXQuaXRlbVN0eWxlfHwodC5pdGVtU3R5bGU9e30pLG49ZS5lbXBoYXNpc3x8KGUuZW1waGFzaXM9e30pLGk9dC5sYWJlbHx8dC5sYWJlbHx8e30scj1pLm5vcm1hbHx8KGkubm9ybWFsPXt9KSxvPXtub3JtYWw6MSxlbXBoYXNpczoxfTtFKGksKGZ1bmN0aW9uKHQsZSl7b1tlXXx8dUIocixlKXx8KHJbZV09dCl9KSksbi5sYWJlbCYmIXVCKGksImVtcGhhc2lzIikmJihpLmVtcGhhc2lzPW4ubGFiZWwsZGVsZXRlIG4ubGFiZWwpfWZ1bmN0aW9uIHVCKHQsZSl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSl9ZnVuY3Rpb24gaEIodCxlKXtpZighdClyZXR1cm4hMTtmb3IodmFyIG49WSh0KT90Olt0XSxpPTA7aTxuLmxlbmd0aDtpKyspaWYobltpXSYmbltpXVtlXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBjQih0KXtDbyh0LCJsYWJlbCIsWyJzaG93Il0pfXZhciBwQj1WbygpLGRCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5jcmVhdGVkQnlTZWxmPSExLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsbiksdGhpcy5fbWVyZ2VPcHRpb24odCxuLCExLCEwKX0sZS5wcm90b3R5cGUuaXNBbmltYXRpb25FbmFibGVkPWZ1bmN0aW9uKCl7aWYoci5ub2RlKXJldHVybiExO3ZhciB0PXRoaXMuX19ob3N0U2VyaWVzO3JldHVybiB0aGlzLmdldFNoYWxsb3coImFuaW1hdGlvbiIpJiZ0JiZ0LmlzQW5pbWF0aW9uRW5hYmxlZCgpfSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbih0LGUpe3RoaXMuX21lcmdlT3B0aW9uKHQsZSwhMSwhMSl9LGUucHJvdG90eXBlLl9tZXJnZU9wdGlvbj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLm1haW5UeXBlO258fGUuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7dmFyIG49dC5nZXQodGhpcy5tYWluVHlwZSwhMCksbz1wQih0KVtyXTtuJiZuLmRhdGE/KG8/by5fbWVyZ2VPcHRpb24obixlLCEwKTooaSYmY0IobiksRShuLmRhdGEsKGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBBcnJheT8oY0IodFswXSksY0IodFsxXSkpOmNCKHQpfSkpLEEobz10aGlzLmNyZWF0ZU1hcmtlck1vZGVsRnJvbVNlcmllcyhuLHRoaXMsZSkse21haW5UeXBlOnRoaXMubWFpblR5cGUsc2VyaWVzSW5kZXg6dC5zZXJpZXNJbmRleCxuYW1lOnQubmFtZSxjcmVhdGVkQnlTZWxmOiEwfSksby5fX2hvc3RTZXJpZXM9dCkscEIodClbcl09byk6cEIodClbcl09bnVsbH0pLHRoaXMpfSxlLnByb3RvdHlwZS5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLmdldERhdGEoKSxyPXRoaXMuZ2V0UmF3VmFsdWUodCksbz1pLmdldE5hbWUodCk7cmV0dXJuIG9nKCJzZWN0aW9uIix7aGVhZGVyOnRoaXMubmFtZSxibG9ja3M6W29nKCJuYW1lVmFsdWUiLHtuYW1lOm8sdmFsdWU6cixub05hbWU6IW8sbm9WYWx1ZTpudWxsPT1yfSldfSl9LGUucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sZS5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt0aGlzLl9kYXRhPXR9LGUucHJvdG90eXBlLmdldERhdGFQYXJhbXM9ZnVuY3Rpb24odCxlKXt2YXIgbj1fZi5wcm90b3R5cGUuZ2V0RGF0YVBhcmFtcy5jYWxsKHRoaXMsdCxlKSxpPXRoaXMuX19ob3N0U2VyaWVzO3JldHVybiBpJiYobi5zZXJpZXNJZD1pLmlkLG4uc2VyaWVzTmFtZT1pLm5hbWUsbi5zZXJpZXNUeXBlPWkuc3ViVHlwZSksbn0sZS5nZXRNYXJrZXJNb2RlbEZyb21TZXJpZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcEIodClbZV19LGUudHlwZT0ibWFya2VyIixlLmRlcGVuZGVuY2llcz1bInNlcmllcyIsImdyaWQiLCJwb2xhciIsImdlbyJdLGV9KHpwKTtSKGRCLF9mLnByb3RvdHlwZSk7dmFyIGZCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmNyZWF0ZU1hcmtlck1vZGVsRnJvbVNlcmllcz1mdW5jdGlvbih0LG4saSl7cmV0dXJuIG5ldyBlKHQsbixpKX0sZS50eXBlPSJtYXJrUG9pbnQiLGUuZGVmYXVsdE9wdGlvbj17ejo1LHN5bWJvbDoicGluIixzeW1ib2xTaXplOjUwLHRvb2x0aXA6e3RyaWdnZXI6Iml0ZW0ifSxsYWJlbDp7c2hvdzohMCxwb3NpdGlvbjoiaW5zaWRlIn0saXRlbVN0eWxlOntib3JkZXJXaWR0aDoyfSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITB9fX0sZX0oZEIpO2Z1bmN0aW9uIGdCKHQpe3JldHVybiEoaXNOYU4ocGFyc2VGbG9hdCh0LngpKSYmaXNOYU4ocGFyc2VGbG9hdCh0LnkpKSl9ZnVuY3Rpb24geUIodCxlLG4saSxyLG8pe3ZhciBhPVtdLHM9bXgoZSxpKT9lLmdldENhbGN1bGF0aW9uSW5mbygic3RhY2tSZXN1bHREaW1lbnNpb24iKTppLGw9d0IoZSxzLHQpLHU9ZS5pbmRpY2VzT2ZOZWFyZXN0KHMsbClbMF07YVtyXT1lLmdldChuLHUpLGFbb109ZS5nZXQocyx1KTt2YXIgaD1lLmdldChpLHUpLGM9dG8oZS5nZXQoaSx1KSk7cmV0dXJuKGM9TWF0aC5taW4oYywyMCkpPj0wJiYoYVtvXT0rYVtvXS50b0ZpeGVkKGMpKSxbYSxoXX12YXIgdkI9e21pbjpIKHlCLCJtaW4iKSxtYXg6SCh5QiwibWF4IiksYXZlcmFnZTpIKHlCLCJhdmVyYWdlIiksbWVkaWFuOkgoeUIsIm1lZGlhbiIpfTtmdW5jdGlvbiBtQih0LGUpe2lmKGUpe3ZhciBuPXQuZ2V0RGF0YSgpLGk9dC5jb29yZGluYXRlU3lzdGVtLHI9aSYmaS5kaW1lbnNpb25zO2lmKCFmdW5jdGlvbih0KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh0LngpKSYmIWlzTmFOKHBhcnNlRmxvYXQodC55KSl9KGUpJiYhWShlLmNvb3JkKSYmWShyKSl7dmFyIG89eEIoZSxuLGksdCk7aWYoKGU9VChlKSkudHlwZSYmdkJbZS50eXBlXSYmby5iYXNlQXhpcyYmby52YWx1ZUF4aXMpe3ZhciBhPVAocixvLmJhc2VBeGlzLmRpbSkscz1QKHIsby52YWx1ZUF4aXMuZGltKSxsPXZCW2UudHlwZV0obixvLmJhc2VEYXRhRGltLG8udmFsdWVEYXRhRGltLGEscyk7ZS5jb29yZD1sWzBdLGUudmFsdWU9bFsxXX1lbHNlIGUuY29vcmQ9W251bGwhPWUueEF4aXM/ZS54QXhpczplLnJhZGl1c0F4aXMsbnVsbCE9ZS55QXhpcz9lLnlBeGlzOmUuYW5nbGVBeGlzXX1pZihudWxsIT1lLmNvb3JkJiZZKHIpKWZvcih2YXIgdT1lLmNvb3JkLGg9MDtoPDI7aCsrKXZCW3VbaF1dJiYodVtoXT13QihuLG4ubWFwRGltZW5zaW9uKHJbaF0pLHVbaF0pKTtlbHNlIGUuY29vcmQ9W107cmV0dXJuIGV9fWZ1bmN0aW9uIHhCKHQsZSxuLGkpe3ZhciByPXt9O3JldHVybiBudWxsIT10LnZhbHVlSW5kZXh8fG51bGwhPXQudmFsdWVEaW0/KHIudmFsdWVEYXRhRGltPW51bGwhPXQudmFsdWVJbmRleD9lLmdldERpbWVuc2lvbih0LnZhbHVlSW5kZXgpOnQudmFsdWVEaW0sci52YWx1ZUF4aXM9bi5nZXRBeGlzKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXREYXRhKCkuZ2V0RGltZW5zaW9uSW5mbyhlKTtyZXR1cm4gbiYmbi5jb29yZERpbX0oaSxyLnZhbHVlRGF0YURpbSkpLHIuYmFzZUF4aXM9bi5nZXRPdGhlckF4aXMoci52YWx1ZUF4aXMpLHIuYmFzZURhdGFEaW09ZS5tYXBEaW1lbnNpb24oci5iYXNlQXhpcy5kaW0pKTooci5iYXNlQXhpcz1pLmdldEJhc2VBeGlzKCksci52YWx1ZUF4aXM9bi5nZXRPdGhlckF4aXMoci5iYXNlQXhpcyksci5iYXNlRGF0YURpbT1lLm1hcERpbWVuc2lvbihyLmJhc2VBeGlzLmRpbSksci52YWx1ZURhdGFEaW09ZS5tYXBEaW1lbnNpb24oci52YWx1ZUF4aXMuZGltKSkscn1mdW5jdGlvbiBfQih0LGUpe3JldHVybiEodCYmdC5jb250YWluRGF0YSYmZS5jb29yZCYmIWdCKGUpKXx8dC5jb250YWluRGF0YShlLmNvb3JkKX1mdW5jdGlvbiBiQih0LGUpe3JldHVybiB0P2Z1bmN0aW9uKHQsbixpLHIpe3JldHVybiBJZihyPDI/dC5jb29yZCYmdC5jb29yZFtyXTp0LnZhbHVlLGVbcl0pfTpmdW5jdGlvbih0LG4saSxyKXtyZXR1cm4gSWYodC52YWx1ZSxlW3JdKX19ZnVuY3Rpb24gd0IodCxlLG4pe2lmKCJhdmVyYWdlIj09PW4pe3ZhciBpPTAscj0wO3JldHVybiB0LmVhY2goZSwoZnVuY3Rpb24odCxlKXtpc05hTih0KXx8KGkrPXQscisrKX0pKSxpL3J9cmV0dXJuIm1lZGlhbiI9PT1uP3QuZ2V0TWVkaWFuKGUpOnQuZ2V0RGF0YUV4dGVudChlKVsibWF4Ij09PW4/MTowXX12YXIgU0I9Vm8oKSxNQj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5tYXJrZXJHcm91cE1hcD15dCgpfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMscj10aGlzLm1hcmtlckdyb3VwTWFwO3IuZWFjaCgoZnVuY3Rpb24odCl7U0IodCkua2VlcD0hMX0pKSxlLmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpe3ZhciByPWRCLmdldE1hcmtlck1vZGVsRnJvbVNlcmllcyh0LGkudHlwZSk7ciYmaS5yZW5kZXJTZXJpZXModCxyLGUsbil9KSksci5lYWNoKChmdW5jdGlvbih0KXshU0IodCkua2VlcCYmaS5ncm91cC5yZW1vdmUodC5ncm91cCl9KSl9LGUucHJvdG90eXBlLm1hcmtLZWVwPWZ1bmN0aW9uKHQpe1NCKHQpLmtlZXA9ITB9LGUucHJvdG90eXBlLnRvZ2dsZUJsdXJTZXJpZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO0UodCwoZnVuY3Rpb24odCl7dmFyIGk9ZEIuZ2V0TWFya2VyTW9kZWxGcm9tU2VyaWVzKHQsbi50eXBlKTtpJiZpLmdldERhdGEoKS5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCl7dCYmKGU/TmwodCk6RWwodCkpfSkpfSkpfSxlLnR5cGU9Im1hcmtlciIsZX0oQWcpO2Z1bmN0aW9uIElCKHQsZSxuKXt2YXIgaT1lLmNvb3JkaW5hdGVTeXN0ZW07dC5lYWNoKChmdW5jdGlvbihyKXt2YXIgbyxhPXQuZ2V0SXRlbU1vZGVsKHIpLHM9JHIoYS5nZXQoIngiKSxuLmdldFdpZHRoKCkpLGw9JHIoYS5nZXQoInkiKSxuLmdldEhlaWdodCgpKTtpZihpc05hTihzKXx8aXNOYU4obCkpe2lmKGUuZ2V0TWFya2VyUG9zaXRpb24pbz1lLmdldE1hcmtlclBvc2l0aW9uKHQuZ2V0VmFsdWVzKHQuZGltZW5zaW9ucyxyKSk7ZWxzZSBpZihpKXt2YXIgdT10LmdldChpLmRpbWVuc2lvbnNbMF0sciksaD10LmdldChpLmRpbWVuc2lvbnNbMV0scik7bz1pLmRhdGFUb1BvaW50KFt1LGhdKX19ZWxzZSBvPVtzLGxdO2lzTmFOKHMpfHwob1swXT1zKSxpc05hTihsKXx8KG9bMV09bCksdC5zZXRJdGVtTGF5b3V0KHIsbyl9KSl9dmFyIFRCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7ZS5lYWNoU2VyaWVzKChmdW5jdGlvbih0KXt2YXIgZT1kQi5nZXRNYXJrZXJNb2RlbEZyb21TZXJpZXModCwibWFya1BvaW50Iik7ZSYmKElCKGUuZ2V0RGF0YSgpLHQsbiksdGhpcy5tYXJrZXJHcm91cE1hcC5nZXQodC5pZCkudXBkYXRlTGF5b3V0KCkpfSksdGhpcyl9LGUucHJvdG90eXBlLnJlbmRlclNlcmllcz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LmNvb3JkaW5hdGVTeXN0ZW0sbz10LmlkLGE9dC5nZXREYXRhKCkscz10aGlzLm1hcmtlckdyb3VwTWFwLGw9cy5nZXQobyl8fHMuc2V0KG8sbmV3IHhTKSx1PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpPXQ/eih0JiZ0LmRpbWVuc2lvbnMsKGZ1bmN0aW9uKHQpe3JldHVybiBBKEEoe30sZS5nZXREYXRhKCkuZ2V0RGltZW5zaW9uSW5mbyhlLmdldERhdGEoKS5tYXBEaW1lbnNpb24odCkpfHx7fSkse25hbWU6dCxvcmRpbmFsTWV0YTpudWxsfSl9KSk6W3tuYW1lOiJ2YWx1ZSIsdHlwZToiZmxvYXQifV07dmFyIHI9bmV3IGN4KGksbiksbz16KG4uZ2V0KCJkYXRhIiksSChtQixlKSk7dCYmKG89QihvLEgoX0IsdCkpKTt2YXIgYT1iQighIXQsaSk7cmV0dXJuIHIuaW5pdERhdGEobyxudWxsLGEpLHJ9KHIsdCxlKTtlLnNldERhdGEodSksSUIoZS5nZXREYXRhKCksdCxpKSx1LmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXUuZ2V0SXRlbU1vZGVsKHQpLGk9bi5nZXRTaGFsbG93KCJzeW1ib2wiKSxyPW4uZ2V0U2hhbGxvdygic3ltYm9sU2l6ZSIpLG89bi5nZXRTaGFsbG93KCJzeW1ib2xSb3RhdGUiKSxzPW4uZ2V0U2hhbGxvdygic3ltYm9sT2Zmc2V0IiksbD1uLmdldFNoYWxsb3coInN5bWJvbEtlZXBBc3BlY3QiKTtpZihYKGkpfHxYKHIpfHxYKG8pfHxYKHMpKXt2YXIgaD1lLmdldFJhd1ZhbHVlKHQpLGM9ZS5nZXREYXRhUGFyYW1zKHQpO1goaSkmJihpPWkoaCxjKSksWChyKSYmKHI9cihoLGMpKSxYKG8pJiYobz1vKGgsYykpLFgocykmJihzPXMoaCxjKSl9dmFyIHA9bi5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksZD1BeShhLCJjb2xvciIpO3AuZmlsbHx8KHAuZmlsbD1kKSx1LnNldEl0ZW1WaXN1YWwodCx7c3ltYm9sOmksc3ltYm9sU2l6ZTpyLHN5bWJvbFJvdGF0ZTpvLHN5bWJvbE9mZnNldDpzLHN5bWJvbEtlZXBBc3BlY3Q6bCxzdHlsZTpwfSl9KSksbC51cGRhdGVEYXRhKHUpLHRoaXMuZ3JvdXAuYWRkKGwuZ3JvdXApLHUuZWFjaEl0ZW1HcmFwaGljRWwoKGZ1bmN0aW9uKHQpe3QudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe3JsKHQpLmRhdGFNb2RlbD1lfSkpfSkpLHRoaXMubWFya0tlZXAobCksbC5ncm91cC5zaWxlbnQ9ZS5nZXQoInNpbGVudCIpfHx0LmdldCgic2lsZW50Iil9LGUudHlwZT0ibWFya1BvaW50IixlfShNQik7dmFyIENCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmNyZWF0ZU1hcmtlck1vZGVsRnJvbVNlcmllcz1mdW5jdGlvbih0LG4saSl7cmV0dXJuIG5ldyBlKHQsbixpKX0sZS50eXBlPSJtYXJrTGluZSIsZS5kZWZhdWx0T3B0aW9uPXt6OjUsc3ltYm9sOlsiY2lyY2xlIiwiYXJyb3ciXSxzeW1ib2xTaXplOls4LDE2XSxzeW1ib2xPZmZzZXQ6MCxwcmVjaXNpb246Mix0b29sdGlwOnt0cmlnZ2VyOiJpdGVtIn0sbGFiZWw6e3Nob3c6ITAscG9zaXRpb246ImVuZCIsZGlzdGFuY2U6NX0sbGluZVN0eWxlOnt0eXBlOiJkYXNoZWQifSxlbXBoYXNpczp7bGFiZWw6e3Nob3c6ITB9LGxpbmVTdHlsZTp7d2lkdGg6M319LGFuaW1hdGlvbkVhc2luZzoibGluZWFyIn0sZX0oZEIpLERCPVZvKCksQUI9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIsbz10LmdldERhdGEoKTtpZihZKGkpKXI9aTtlbHNle3ZhciBhPWkudHlwZTtpZigibWluIj09PWF8fCJtYXgiPT09YXx8ImF2ZXJhZ2UiPT09YXx8Im1lZGlhbiI9PT1hfHxudWxsIT1pLnhBeGlzfHxudWxsIT1pLnlBeGlzKXt2YXIgcz12b2lkIDAsbD12b2lkIDA7aWYobnVsbCE9aS55QXhpc3x8bnVsbCE9aS54QXhpcylzPWUuZ2V0QXhpcyhudWxsIT1pLnlBeGlzPyJ5IjoieCIpLGw9aXQoaS55QXhpcyxpLnhBeGlzKTtlbHNle3ZhciB1PXhCKGksbyxlLHQpO3M9dS52YWx1ZUF4aXMsbD13QihvLHh4KG8sdS52YWx1ZURhdGFEaW0pLGEpfXZhciBoPSJ4Ij09PXMuZGltPzA6MSxjPTEtaCxwPVQoaSksZD17Y29vcmQ6W119O3AudHlwZT1udWxsLHAuY29vcmQ9W10scC5jb29yZFtjXT0tMS8wLGQuY29vcmRbY109MS8wO3ZhciBmPW4uZ2V0KCJwcmVjaXNpb24iKTtmPj0wJiZqKGwpJiYobD0rbC50b0ZpeGVkKE1hdGgubWluKGYsMjApKSkscC5jb29yZFtoXT1kLmNvb3JkW2hdPWwscj1bcCxkLHt0eXBlOmEsdmFsdWVJbmRleDppLnZhbHVlSW5kZXgsdmFsdWU6bH1dfWVsc2Ugcj1bXX12YXIgZz1bbUIodCxyWzBdKSxtQih0LHJbMV0pLEEoe30sclsyXSldO3JldHVybiBnWzJdLnR5cGU9Z1syXS50eXBlfHxudWxsLEMoZ1syXSxnWzBdKSxDKGdbMl0sZ1sxXSksZ307ZnVuY3Rpb24ga0IodCl7cmV0dXJuIWlzTmFOKHQpJiYhaXNGaW5pdGUodCl9ZnVuY3Rpb24gTEIodCxlLG4saSl7dmFyIHI9MS10LG89aS5kaW1lbnNpb25zW3RdO3JldHVybiBrQihlW3JdKSYma0IobltyXSkmJmVbdF09PT1uW3RdJiZpLmdldEF4aXMobykuY29udGFpbkRhdGEoZVt0XSl9ZnVuY3Rpb24gUEIodCxlKXtpZigiY2FydGVzaWFuMmQiPT09dC50eXBlKXt2YXIgbj1lWzBdLmNvb3JkLGk9ZVsxXS5jb29yZDtpZihuJiZpJiYoTEIoMSxuLGksdCl8fExCKDAsbixpLHQpKSlyZXR1cm4hMH1yZXR1cm4gX0IodCxlWzBdKSYmX0IodCxlWzFdKX1mdW5jdGlvbiBPQih0LGUsbixpLHIpe3ZhciBvLGE9aS5jb29yZGluYXRlU3lzdGVtLHM9dC5nZXRJdGVtTW9kZWwoZSksbD0kcihzLmdldCgieCIpLHIuZ2V0V2lkdGgoKSksdT0kcihzLmdldCgieSIpLHIuZ2V0SGVpZ2h0KCkpO2lmKGlzTmFOKGwpfHxpc05hTih1KSl7aWYoaS5nZXRNYXJrZXJQb3NpdGlvbilvPWkuZ2V0TWFya2VyUG9zaXRpb24odC5nZXRWYWx1ZXModC5kaW1lbnNpb25zLGUpKTtlbHNle3ZhciBoPWEuZGltZW5zaW9ucyxjPXQuZ2V0KGhbMF0sZSkscD10LmdldChoWzFdLGUpO289YS5kYXRhVG9Qb2ludChbYyxwXSl9aWYoT1MoYSwiY2FydGVzaWFuMmQiKSl7dmFyIGQ9YS5nZXRBeGlzKCJ4IiksZj1hLmdldEF4aXMoInkiKTtoPWEuZGltZW5zaW9ucztrQih0LmdldChoWzBdLGUpKT9vWzBdPWQudG9HbG9iYWxDb29yZChkLmdldEV4dGVudCgpW24/MDoxXSk6a0IodC5nZXQoaFsxXSxlKSkmJihvWzFdPWYudG9HbG9iYWxDb29yZChmLmdldEV4dGVudCgpW24/MDoxXSkpfWlzTmFOKGwpfHwob1swXT1sKSxpc05hTih1KXx8KG9bMV09dSl9ZWxzZSBvPVtsLHVdO3Quc2V0SXRlbUxheW91dChlLG8pfXZhciBSQj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4pe2UuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7dmFyIGU9ZEIuZ2V0TWFya2VyTW9kZWxGcm9tU2VyaWVzKHQsIm1hcmtMaW5lIik7aWYoZSl7dmFyIGk9ZS5nZXREYXRhKCkscj1EQihlKS5mcm9tLG89REIoZSkudG87ci5lYWNoKChmdW5jdGlvbihlKXtPQihyLGUsITAsdCxuKSxPQihvLGUsITEsdCxuKX0pKSxpLmVhY2goKGZ1bmN0aW9uKHQpe2kuc2V0SXRlbUxheW91dCh0LFtyLmdldEl0ZW1MYXlvdXQodCksby5nZXRJdGVtTGF5b3V0KHQpXSl9KSksdGhpcy5tYXJrZXJHcm91cE1hcC5nZXQodC5pZCkudXBkYXRlTGF5b3V0KCl9fSksdGhpcyl9LGUucHJvdG90eXBlLnJlbmRlclNlcmllcz1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LmNvb3JkaW5hdGVTeXN0ZW0sbz10LmlkLGE9dC5nZXREYXRhKCkscz10aGlzLm1hcmtlckdyb3VwTWFwLGw9cy5nZXQobyl8fHMuc2V0KG8sbmV3IFlBKTt0aGlzLmdyb3VwLmFkZChsLmdyb3VwKTt2YXIgdT1mdW5jdGlvbih0LGUsbil7dmFyIGk7aT10P3oodCYmdC5kaW1lbnNpb25zLChmdW5jdGlvbih0KXtyZXR1cm4gQShBKHt9LGUuZ2V0RGF0YSgpLmdldERpbWVuc2lvbkluZm8oZS5nZXREYXRhKCkubWFwRGltZW5zaW9uKHQpKXx8e30pLHtuYW1lOnQsb3JkaW5hbE1ldGE6bnVsbH0pfSkpOlt7bmFtZToidmFsdWUiLHR5cGU6ImZsb2F0In1dO3ZhciByPW5ldyBjeChpLG4pLG89bmV3IGN4KGksbiksYT1uZXcgY3goW10sbikscz16KG4uZ2V0KCJkYXRhIiksSChBQixlLHQsbikpO3QmJihzPUIocyxIKFBCLHQpKSk7dmFyIGw9YkIoISF0LGkpO3JldHVybiByLmluaXREYXRhKHoocywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF19KSksbnVsbCxsKSxvLmluaXREYXRhKHoocywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSksbnVsbCxsKSxhLmluaXREYXRhKHoocywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KSkpLGEuaGFzSXRlbU9wdGlvbj0hMCx7ZnJvbTpyLHRvOm8sbGluZTphfX0ocix0LGUpLGg9dS5mcm9tLGM9dS50byxwPXUubGluZTtEQihlKS5mcm9tPWgsREIoZSkudG89YyxlLnNldERhdGEocCk7dmFyIGQ9ZS5nZXQoInN5bWJvbCIpLGY9ZS5nZXQoInN5bWJvbFNpemUiKSxnPWUuZ2V0KCJzeW1ib2xSb3RhdGUiKSx5PWUuZ2V0KCJzeW1ib2xPZmZzZXQiKTtmdW5jdGlvbiB2KGUsbixyKXt2YXIgbz1lLmdldEl0ZW1Nb2RlbChuKTtPQihlLG4scix0LGkpO3ZhciBzPW8uZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLmdldEl0ZW1TdHlsZSgpO251bGw9PXMuZmlsbCYmKHMuZmlsbD1BeShhLCJjb2xvciIpKSxlLnNldEl0ZW1WaXN1YWwobix7c3ltYm9sS2VlcEFzcGVjdDpvLmdldCgic3ltYm9sS2VlcEFzcGVjdCIpLHN5bWJvbE9mZnNldDpydChvLmdldCgic3ltYm9sT2Zmc2V0IiwhMCkseVtyPzA6MV0pLHN5bWJvbFJvdGF0ZTpydChvLmdldCgic3ltYm9sUm90YXRlIiwhMCksZ1tyPzA6MV0pLHN5bWJvbFNpemU6cnQoby5nZXQoInN5bWJvbFNpemUiKSxmW3I/MDoxXSksc3ltYm9sOnJ0KG8uZ2V0KCJzeW1ib2wiLCEwKSxkW3I/MDoxXSksc3R5bGU6c30pfVkoZCl8fChkPVtkLGRdKSxZKGYpfHwoZj1bZixmXSksWShnKXx8KGc9W2csZ10pLFkoeSl8fCh5PVt5LHldKSx1LmZyb20uZWFjaCgoZnVuY3Rpb24odCl7dihoLHQsITApLHYoYyx0LCExKX0pKSxwLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXAuZ2V0SXRlbU1vZGVsKHQpLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKTtwLnNldEl0ZW1MYXlvdXQodCxbaC5nZXRJdGVtTGF5b3V0KHQpLGMuZ2V0SXRlbUxheW91dCh0KV0pLG51bGw9PWUuc3Ryb2tlJiYoZS5zdHJva2U9aC5nZXRJdGVtVmlzdWFsKHQsInN0eWxlIikuZmlsbCkscC5zZXRJdGVtVmlzdWFsKHQse2Zyb21TeW1ib2xLZWVwQXNwZWN0OmguZ2V0SXRlbVZpc3VhbCh0LCJzeW1ib2xLZWVwQXNwZWN0IiksZnJvbVN5bWJvbE9mZnNldDpoLmdldEl0ZW1WaXN1YWwodCwic3ltYm9sT2Zmc2V0IiksZnJvbVN5bWJvbFJvdGF0ZTpoLmdldEl0ZW1WaXN1YWwodCwic3ltYm9sUm90YXRlIiksZnJvbVN5bWJvbFNpemU6aC5nZXRJdGVtVmlzdWFsKHQsInN5bWJvbFNpemUiKSxmcm9tU3ltYm9sOmguZ2V0SXRlbVZpc3VhbCh0LCJzeW1ib2wiKSx0b1N5bWJvbEtlZXBBc3BlY3Q6Yy5nZXRJdGVtVmlzdWFsKHQsInN5bWJvbEtlZXBBc3BlY3QiKSx0b1N5bWJvbE9mZnNldDpjLmdldEl0ZW1WaXN1YWwodCwic3ltYm9sT2Zmc2V0IiksdG9TeW1ib2xSb3RhdGU6Yy5nZXRJdGVtVmlzdWFsKHQsInN5bWJvbFJvdGF0ZSIpLHRvU3ltYm9sU2l6ZTpjLmdldEl0ZW1WaXN1YWwodCwic3ltYm9sU2l6ZSIpLHRvU3ltYm9sOmMuZ2V0SXRlbVZpc3VhbCh0LCJzeW1ib2wiKSxzdHlsZTplfSl9KSksbC51cGRhdGVEYXRhKHApLHUubGluZS5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCl7cmwodCkuZGF0YU1vZGVsPWUsdC50cmF2ZXJzZSgoZnVuY3Rpb24odCl7cmwodCkuZGF0YU1vZGVsPWV9KSl9KSksdGhpcy5tYXJrS2VlcChsKSxsLmdyb3VwLnNpbGVudD1lLmdldCgic2lsZW50Iil8fHQuZ2V0KCJzaWxlbnQiKX0sZS50eXBlPSJtYXJrTGluZSIsZX0oTUIpO3ZhciBOQj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLnR5cGU9ZS50eXBlLG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5jcmVhdGVNYXJrZXJNb2RlbEZyb21TZXJpZXM9ZnVuY3Rpb24odCxuLGkpe3JldHVybiBuZXcgZSh0LG4saSl9LGUudHlwZT0ibWFya0FyZWEiLGUuZGVmYXVsdE9wdGlvbj17ejoxLHRvb2x0aXA6e3RyaWdnZXI6Iml0ZW0ifSxhbmltYXRpb246ITEsbGFiZWw6e3Nob3c6ITAscG9zaXRpb246InRvcCJ9LGl0ZW1TdHlsZTp7Ym9yZGVyV2lkdGg6MH0sZW1waGFzaXM6e2xhYmVsOntzaG93OiEwLHBvc2l0aW9uOiJ0b3AifX19LGV9KGRCKSxFQj1WbygpLHpCPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPWlbMF0sbz1pWzFdO2lmKHImJm8pe3ZhciBhPW1CKHQscikscz1tQih0LG8pLGw9YS5jb29yZCx1PXMuY29vcmQ7bFswXT1pdChsWzBdLC0xLzApLGxbMV09aXQobFsxXSwtMS8wKSx1WzBdPWl0KHVbMF0sMS8wKSx1WzFdPWl0KHVbMV0sMS8wKTt2YXIgaD1EKFt7fSxhLHNdKTtyZXR1cm4gaC5jb29yZD1bYS5jb29yZCxzLmNvb3JkXSxoLngwPWEueCxoLnkwPWEueSxoLngxPXMueCxoLnkxPXMueSxofX07ZnVuY3Rpb24gVkIodCl7cmV0dXJuIWlzTmFOKHQpJiYhaXNGaW5pdGUodCl9ZnVuY3Rpb24gQkIodCxlLG4saSl7dmFyIHI9MS10O3JldHVybiBWQihlW3JdKSYmVkIobltyXSl9ZnVuY3Rpb24gRkIodCxlKXt2YXIgbj1lLmNvb3JkWzBdLGk9ZS5jb29yZFsxXSxyPXtjb29yZDpuLHg6ZS54MCx5OmUueTB9LG89e2Nvb3JkOmkseDplLngxLHk6ZS55MX07cmV0dXJuIE9TKHQsImNhcnRlc2lhbjJkIik/ISghbnx8IWl8fCFCQigxLG4saSkmJiFCQigwLG4saSkpfHxmdW5jdGlvbih0LGUsbil7cmV0dXJuISh0JiZ0LmNvbnRhaW5ab25lJiZlLmNvb3JkJiZuLmNvb3JkJiYhZ0IoZSkmJiFnQihuKSl8fHQuY29udGFpblpvbmUoZS5jb29yZCxuLmNvb3JkKX0odCxyLG8pOl9CKHQscil8fF9CKHQsbyl9ZnVuY3Rpb24gR0IodCxlLG4saSxyKXt2YXIgbyxhPWkuY29vcmRpbmF0ZVN5c3RlbSxzPXQuZ2V0SXRlbU1vZGVsKGUpLGw9JHIocy5nZXQoblswXSksci5nZXRXaWR0aCgpKSx1PSRyKHMuZ2V0KG5bMV0pLHIuZ2V0SGVpZ2h0KCkpO2lmKGlzTmFOKGwpfHxpc05hTih1KSl7aWYoaS5nZXRNYXJrZXJQb3NpdGlvbil7dmFyIGg9dC5nZXRWYWx1ZXMoWyJ4MCIsInkwIl0sZSksYz10LmdldFZhbHVlcyhbIngxIiwieTEiXSxlKSxwPWEuY2xhbXBEYXRhKGgpLGQ9YS5jbGFtcERhdGEoYyksZj1bXTsieDAiPT09blswXT9mWzBdPXBbMF0+ZFswXT9jWzBdOmhbMF06ZlswXT1wWzBdPmRbMF0/aFswXTpjWzBdLCJ5MCI9PT1uWzFdP2ZbMV09cFsxXT5kWzFdP2NbMV06aFsxXTpmWzFdPXBbMV0+ZFsxXT9oWzFdOmNbMV0sbz1pLmdldE1hcmtlclBvc2l0aW9uKGYsbiwhMCl9ZWxzZXt2YXIgZz1bbT10LmdldChuWzBdLGUpLHg9dC5nZXQoblsxXSxlKV07YS5jbGFtcERhdGEmJmEuY2xhbXBEYXRhKGcsZyksbz1hLmRhdGFUb1BvaW50KGcsITApfWlmKE9TKGEsImNhcnRlc2lhbjJkIikpe3ZhciB5PWEuZ2V0QXhpcygieCIpLHY9YS5nZXRBeGlzKCJ5IiksbT10LmdldChuWzBdLGUpLHg9dC5nZXQoblsxXSxlKTtWQihtKT9vWzBdPXkudG9HbG9iYWxDb29yZCh5LmdldEV4dGVudCgpWyJ4MCI9PT1uWzBdPzA6MV0pOlZCKHgpJiYob1sxXT12LnRvR2xvYmFsQ29vcmQodi5nZXRFeHRlbnQoKVsieTAiPT09blsxXT8wOjFdKSl9aXNOYU4obCl8fChvWzBdPWwpLGlzTmFOKHUpfHwob1sxXT11KX1lbHNlIG89W2wsdV07cmV0dXJuIG99dmFyIFdCPVtbIngwIiwieTAiXSxbIngxIiwieTAiXSxbIngxIiwieTEiXSxbIngwIiwieTEiXV0sSEI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXtlLmVhY2hTZXJpZXMoKGZ1bmN0aW9uKHQpe3ZhciBlPWRCLmdldE1hcmtlck1vZGVsRnJvbVNlcmllcyh0LCJtYXJrQXJlYSIpO2lmKGUpe3ZhciBpPWUuZ2V0RGF0YSgpO2kuZWFjaCgoZnVuY3Rpb24oZSl7dmFyIHI9eihXQiwoZnVuY3Rpb24ocil7cmV0dXJuIEdCKGksZSxyLHQsbil9KSk7aS5zZXRJdGVtTGF5b3V0KGUsciksaS5nZXRJdGVtR3JhcGhpY0VsKGUpLnNldFNoYXBlKCJwb2ludHMiLHIpfSkpfX0pLHRoaXMpfSxlLnByb3RvdHlwZS5yZW5kZXJTZXJpZXM9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC5jb29yZGluYXRlU3lzdGVtLG89dC5pZCxhPXQuZ2V0RGF0YSgpLHM9dGhpcy5tYXJrZXJHcm91cE1hcCxsPXMuZ2V0KG8pfHxzLnNldChvLHtncm91cDpuZXcgQnJ9KTt0aGlzLmdyb3VwLmFkZChsLmdyb3VwKSx0aGlzLm1hcmtLZWVwKGwpO3ZhciB1PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLG89WyJ4MCIsInkwIiwieDEiLCJ5MSJdO2lmKHQpe3ZhciBhPXoodCYmdC5kaW1lbnNpb25zLChmdW5jdGlvbih0KXt2YXIgbj1lLmdldERhdGEoKTtyZXR1cm4gQShBKHt9LG4uZ2V0RGltZW5zaW9uSW5mbyhuLm1hcERpbWVuc2lvbih0KSl8fHt9KSx7bmFtZTp0LG9yZGluYWxNZXRhOm51bGx9KX0pKTtyPXoobywoZnVuY3Rpb24odCxlKXtyZXR1cm57bmFtZTp0LHR5cGU6YVtlJTJdLnR5cGV9fSkpLGk9bmV3IGN4KHIsbil9ZWxzZSBpPW5ldyBjeChyPVt7bmFtZToidmFsdWUiLHR5cGU6ImZsb2F0In1dLG4pO3ZhciBzPXoobi5nZXQoImRhdGEiKSxIKHpCLGUsdCxuKSk7dCYmKHM9QihzLEgoRkIsdCkpKTt2YXIgbD10P2Z1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBJZih0LmNvb3JkW01hdGguZmxvb3IoaS8yKV1baSUyXSxyW2ldKX06ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIElmKHQudmFsdWUscltpXSl9O3JldHVybiBpLmluaXREYXRhKHMsbnVsbCxsKSxpLmhhc0l0ZW1PcHRpb249ITAsaX0ocix0LGUpO2Uuc2V0RGF0YSh1KSx1LmVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPXooV0IsKGZ1bmN0aW9uKG4pe3JldHVybiBHQih1LGUsbix0LGkpfSkpLG89ci5nZXRBeGlzKCJ4Iikuc2NhbGUscz1yLmdldEF4aXMoInkiKS5zY2FsZSxsPW8uZ2V0RXh0ZW50KCksaD1zLmdldEV4dGVudCgpLGM9W28ucGFyc2UodS5nZXQoIngwIixlKSksby5wYXJzZSh1LmdldCgieDEiLGUpKV0scD1bcy5wYXJzZSh1LmdldCgieTAiLGUpKSxzLnBhcnNlKHUuZ2V0KCJ5MSIsZSkpXTtRcihjKSxRcihwKTt2YXIgZD0hIShsWzBdPmNbMV18fGxbMV08Y1swXXx8aFswXT5wWzFdfHxoWzFdPHBbMF0pO3Uuc2V0SXRlbUxheW91dChlLHtwb2ludHM6bixhbGxDbGlwcGVkOmR9KTt2YXIgZj11LmdldEl0ZW1Nb2RlbChlKS5nZXRNb2RlbCgiaXRlbVN0eWxlIikuZ2V0SXRlbVN0eWxlKCksZz1BeShhLCJjb2xvciIpO2YuZmlsbHx8KGYuZmlsbD1nLFUoZi5maWxsKSYmKGYuZmlsbD1paShmLmZpbGwsLjQpKSksZi5zdHJva2V8fChmLnN0cm9rZT1nKSx1LnNldEl0ZW1WaXN1YWwoZSwic3R5bGUiLGYpfSkpLHUuZGlmZihFQihsKS5kYXRhKS5hZGQoKGZ1bmN0aW9uKHQpe3ZhciBlPXUuZ2V0SXRlbUxheW91dCh0KTtpZighZS5hbGxDbGlwcGVkKXt2YXIgbj1uZXcgWHUoe3NoYXBlOntwb2ludHM6ZS5wb2ludHN9fSk7dS5zZXRJdGVtR3JhcGhpY0VsKHQsbiksbC5ncm91cC5hZGQobil9fSkpLnVwZGF0ZSgoZnVuY3Rpb24odCxuKXt2YXIgaT1FQihsKS5kYXRhLmdldEl0ZW1HcmFwaGljRWwobikscj11LmdldEl0ZW1MYXlvdXQodCk7ci5hbGxDbGlwcGVkP2kmJmwuZ3JvdXAucmVtb3ZlKGkpOihpP3ZoKGkse3NoYXBlOntwb2ludHM6ci5wb2ludHN9fSxlLHQpOmk9bmV3IFh1KHtzaGFwZTp7cG9pbnRzOnIucG9pbnRzfX0pLHUuc2V0SXRlbUdyYXBoaWNFbCh0LGkpLGwuZ3JvdXAuYWRkKGkpKX0pKS5yZW1vdmUoKGZ1bmN0aW9uKHQpe3ZhciBlPUVCKGwpLmRhdGEuZ2V0SXRlbUdyYXBoaWNFbCh0KTtsLmdyb3VwLnJlbW92ZShlKX0pKS5leGVjdXRlKCksdS5lYWNoSXRlbUdyYXBoaWNFbCgoZnVuY3Rpb24odCxuKXt2YXIgaT11LmdldEl0ZW1Nb2RlbChuKSxyPXUuZ2V0SXRlbVZpc3VhbChuLCJzdHlsZSIpO3QudXNlU3R5bGUodS5nZXRJdGVtVmlzdWFsKG4sInN0eWxlIikpLGljKHQscmMoaSkse2xhYmVsRmV0Y2hlcjplLGxhYmVsRGF0YUluZGV4Om4sZGVmYXVsdFRleHQ6dS5nZXROYW1lKG4pfHwiIixpbmhlcml0Q29sb3I6VShyLmZpbGwpP2lpKHIuZmlsbCwxKToiIzAwMCJ9KSwkbCh0LGkpLFpsKHQsbnVsbCxudWxsLGkuZ2V0KFsiZW1waGFzaXMiLCJkaXNhYmxlZCJdKSkscmwodCkuZGF0YU1vZGVsPWV9KSksRUIobCkuZGF0YT11LGwuZ3JvdXAuc2lsZW50PWUuZ2V0KCJzaWxlbnQiKXx8dC5nZXQoInNpbGVudCIpfSxlLnR5cGU9Im1hcmtBcmVhIixlfShNQik7dmFyIFlCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5sYXlvdXRNb2RlPXt0eXBlOiJib3giLGlnbm9yZVNpemU6ITB9LG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsbiksdC5zZWxlY3RlZD10LnNlbGVjdGVkfHx7fSx0aGlzLl91cGRhdGVTZWxlY3Rvcih0KX0sZS5wcm90b3R5cGUubWVyZ2VPcHRpb249ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5tZXJnZU9wdGlvbi5jYWxsKHRoaXMsZSxuKSx0aGlzLl91cGRhdGVTZWxlY3RvcihlKX0sZS5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdG9yPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2VsZWN0b3Isbj10aGlzLmVjTW9kZWw7ITA9PT1lJiYoZT10LnNlbGVjdG9yPVsiYWxsIiwiaW52ZXJzZSJdKSxZKGUpJiZFKGUsKGZ1bmN0aW9uKHQsaSl7VSh0KSYmKHQ9e3R5cGU6dH0pLGVbaV09Qyh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuImFsbCI9PT1lP3t0eXBlOiJhbGwiLHRpdGxlOnQuZ2V0TG9jYWxlTW9kZWwoKS5nZXQoWyJsZWdlbmQiLCJzZWxlY3RvciIsImFsbCJdKX06ImludmVyc2UiPT09ZT97dHlwZToiaW52ZXJzZSIsdGl0bGU6dC5nZXRMb2NhbGVNb2RlbCgpLmdldChbImxlZ2VuZCIsInNlbGVjdG9yIiwiaW52ZXJzZSJdKX06dm9pZCAwfShuLHQudHlwZSkpfSkpfSxlLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlRGF0YSh0aGlzLmVjTW9kZWwpO3ZhciB0PXRoaXMuX2RhdGE7aWYodFswXSYmInNpbmdsZSI9PT10aGlzLmdldCgic2VsZWN0ZWRNb2RlIikpe2Zvcih2YXIgZT0hMSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl0uZ2V0KCJuYW1lIik7aWYodGhpcy5pc1NlbGVjdGVkKGkpKXt0aGlzLnNlbGVjdChpKSxlPSEwO2JyZWFrfX0hZSYmdGhpcy5zZWxlY3QodFswXS5nZXQoIm5hbWUiKSl9fSxlLnByb3RvdHlwZS5fdXBkYXRlRGF0YT1mdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdO3QuZWFjaFJhd1NlcmllcygoZnVuY3Rpb24oaSl7dmFyIHIsbz1pLm5hbWU7aWYobi5wdXNoKG8pLGkubGVnZW5kVmlzdWFsUHJvdmlkZXIpe3ZhciBhPWkubGVnZW5kVmlzdWFsUHJvdmlkZXIuZ2V0QWxsTmFtZXMoKTt0LmlzU2VyaWVzRmlsdGVyZWQoaSl8fChuPW4uY29uY2F0KGEpKSxhLmxlbmd0aD9lPWUuY29uY2F0KGEpOnI9ITB9ZWxzZSByPSEwO3ImJk5vKGkpJiZlLnB1c2goaS5uYW1lKX0pKSx0aGlzLl9hdmFpbGFibGVOYW1lcz1uO3ZhciBpPXRoaXMuZ2V0KCJkYXRhIil8fGUscj15dCgpLG89eihpLChmdW5jdGlvbih0KXtyZXR1cm4oVSh0KXx8aih0KSkmJih0PXtuYW1lOnR9KSxyLmdldCh0Lm5hbWUpP251bGw6KHIuc2V0KHQubmFtZSwhMCksbmV3IENjKHQsdGhpcyx0aGlzLmVjTW9kZWwpKX0pLHRoaXMpO3RoaXMuX2RhdGE9QihvLChmdW5jdGlvbih0KXtyZXR1cm4hIXR9KSl9LGUucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sZS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnNlbGVjdGVkOyJzaW5nbGUiPT09dGhpcy5nZXQoInNlbGVjdGVkTW9kZSIpJiZFKHRoaXMuX2RhdGEsKGZ1bmN0aW9uKHQpe2VbdC5nZXQoIm5hbWUiKV09ITF9KSk7ZVt0XT0hMH0sZS5wcm90b3R5cGUudW5TZWxlY3Q9ZnVuY3Rpb24odCl7InNpbmdsZSIhPT10aGlzLmdldCgic2VsZWN0ZWRNb2RlIikmJih0aGlzLm9wdGlvbi5zZWxlY3RlZFt0XT0hMSl9LGUucHJvdG90eXBlLnRvZ2dsZVNlbGVjdGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnNlbGVjdGVkO2UuaGFzT3duUHJvcGVydHkodCl8fChlW3RdPSEwKSx0aGlzW2VbdF0/InVuU2VsZWN0Ijoic2VsZWN0Il0odCl9LGUucHJvdG90eXBlLmFsbFNlbGVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10aGlzLm9wdGlvbi5zZWxlY3RlZDtFKHQsKGZ1bmN0aW9uKHQpe2VbdC5nZXQoIm5hbWUiLCEwKV09ITB9KSl9LGUucHJvdG90eXBlLmludmVyc2VTZWxlY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9kYXRhLGU9dGhpcy5vcHRpb24uc2VsZWN0ZWQ7RSh0LChmdW5jdGlvbih0KXt2YXIgbj10LmdldCgibmFtZSIsITApO2UuaGFzT3duUHJvcGVydHkobil8fChlW25dPSEwKSxlW25dPSFlW25dfSkpfSxlLnByb3RvdHlwZS5pc1NlbGVjdGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnNlbGVjdGVkO3JldHVybiEoZS5oYXNPd25Qcm9wZXJ0eSh0KSYmIWVbdF0pJiZQKHRoaXMuX2F2YWlsYWJsZU5hbWVzLHQpPj0wfSxlLnByb3RvdHlwZS5nZXRPcmllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4idmVydGljYWwiPT09dGhpcy5nZXQoIm9yaWVudCIpP3tpbmRleDoxLG5hbWU6InZlcnRpY2FsIn06e2luZGV4OjAsbmFtZToiaG9yaXpvbnRhbCJ9fSxlLnR5cGU9ImxlZ2VuZC5wbGFpbiIsZS5kZXBlbmRlbmNpZXM9WyJzZXJpZXMiXSxlLmRlZmF1bHRPcHRpb249e3o6NCxzaG93OiEwLG9yaWVudDoiaG9yaXpvbnRhbCIsbGVmdDoiY2VudGVyIix0b3A6MCxhbGlnbjoiYXV0byIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJDb2xvcjoiI2NjYyIsYm9yZGVyUmFkaXVzOjAsYm9yZGVyV2lkdGg6MCxwYWRkaW5nOjUsaXRlbUdhcDoxMCxpdGVtV2lkdGg6MjUsaXRlbUhlaWdodDoxNCxzeW1ib2xSb3RhdGU6ImluaGVyaXQiLHN5bWJvbEtlZXBBc3BlY3Q6ITAsaW5hY3RpdmVDb2xvcjoiI2NjYyIsaW5hY3RpdmVCb3JkZXJDb2xvcjoiI2NjYyIsaW5hY3RpdmVCb3JkZXJXaWR0aDoiYXV0byIsaXRlbVN0eWxlOntjb2xvcjoiaW5oZXJpdCIsb3BhY2l0eToiaW5oZXJpdCIsYm9yZGVyQ29sb3I6ImluaGVyaXQiLGJvcmRlcldpZHRoOiJhdXRvIixib3JkZXJDYXA6ImluaGVyaXQiLGJvcmRlckpvaW46ImluaGVyaXQiLGJvcmRlckRhc2hPZmZzZXQ6ImluaGVyaXQiLGJvcmRlck1pdGVyTGltaXQ6ImluaGVyaXQifSxsaW5lU3R5bGU6e3dpZHRoOiJhdXRvIixjb2xvcjoiaW5oZXJpdCIsaW5hY3RpdmVDb2xvcjoiI2NjYyIsaW5hY3RpdmVXaWR0aDoyLG9wYWNpdHk6ImluaGVyaXQiLHR5cGU6ImluaGVyaXQiLGNhcDoiaW5oZXJpdCIsam9pbjoiaW5oZXJpdCIsZGFzaE9mZnNldDoiaW5oZXJpdCIsbWl0ZXJMaW1pdDoiaW5oZXJpdCJ9LHRleHRTdHlsZTp7Y29sb3I6IiMzMzMifSxzZWxlY3RlZE1vZGU6ITAsc2VsZWN0b3I6ITEsc2VsZWN0b3JMYWJlbDp7c2hvdzohMCxib3JkZXJSYWRpdXM6MTAscGFkZGluZzpbMyw1LDMsNV0sZm9udFNpemU6MTIsZm9udEZhbWlseToic2Fucy1zZXJpZiIsY29sb3I6IiM2NjYiLGJvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IiM2NjYifSxlbXBoYXNpczp7c2VsZWN0b3JMYWJlbDp7c2hvdzohMCxjb2xvcjoiI2VlZSIsYmFja2dyb3VuZENvbG9yOiIjNjY2In19LHNlbGVjdG9yUG9zaXRpb246ImF1dG8iLHNlbGVjdG9ySXRlbUdhcDo3LHNlbGVjdG9yQnV0dG9uR2FwOjEwLHRvb2x0aXA6e3Nob3c6ITF9fSxlfSh6cCksWEI9SCxVQj1FLFpCPUJyLGpCPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5uZXdsaW5lRGlzYWJsZWQ9ITEsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmdyb3VwLmFkZCh0aGlzLl9jb250ZW50R3JvdXA9bmV3IFpCKSx0aGlzLmdyb3VwLmFkZCh0aGlzLl9zZWxlY3Rvckdyb3VwPW5ldyBaQiksdGhpcy5faXNGaXJzdFJlbmRlcj0hMH0sZS5wcm90b3R5cGUuZ2V0Q29udGVudEdyb3VwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRHcm91cH0sZS5wcm90b3R5cGUuZ2V0U2VsZWN0b3JHcm91cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3Rvckdyb3VwfSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2lzRmlyc3RSZW5kZXI7aWYodGhpcy5faXNGaXJzdFJlbmRlcj0hMSx0aGlzLnJlc2V0SW5uZXIoKSx0LmdldCgic2hvdyIsITApKXt2YXIgcj10LmdldCgiYWxpZ24iKSxvPXQuZ2V0KCJvcmllbnQiKTtyJiYiYXV0byIhPT1yfHwocj0icmlnaHQiPT09dC5nZXQoImxlZnQiKSYmInZlcnRpY2FsIj09PW8/InJpZ2h0IjoibGVmdCIpO3ZhciBhPXQuZ2V0KCJzZWxlY3RvciIsITApLHM9dC5nZXQoInNlbGVjdG9yUG9zaXRpb24iLCEwKTshYXx8cyYmImF1dG8iIT09c3x8KHM9Imhvcml6b250YWwiPT09bz8iZW5kIjoic3RhcnQiKSx0aGlzLnJlbmRlcklubmVyKHIsdCxlLG4sYSxvLHMpO3ZhciBsPXQuZ2V0Qm94TGF5b3V0UGFyYW1zKCksdT17d2lkdGg6bi5nZXRXaWR0aCgpLGhlaWdodDpuLmdldEhlaWdodCgpfSxoPXQuZ2V0KCJwYWRkaW5nIiksYz1rcChsLHUsaCkscD10aGlzLmxheW91dElubmVyKHQscixjLGksYSxzKSxkPWtwKGsoe3dpZHRoOnAud2lkdGgsaGVpZ2h0OnAuaGVpZ2h0fSxsKSx1LGgpO3RoaXMuZ3JvdXAueD1kLngtcC54LHRoaXMuZ3JvdXAueT1kLnktcC55LHRoaXMuZ3JvdXAubWFya1JlZHJhdygpLHRoaXMuZ3JvdXAuYWRkKHRoaXMuX2JhY2tncm91bmRFbD1TeihwLHQpKX19LGUucHJvdG90eXBlLnJlc2V0SW5uZXI9ZnVuY3Rpb24oKXt0aGlzLmdldENvbnRlbnRHcm91cCgpLnJlbW92ZUFsbCgpLHRoaXMuX2JhY2tncm91bmRFbCYmdGhpcy5ncm91cC5yZW1vdmUodGhpcy5fYmFja2dyb3VuZEVsKSx0aGlzLmdldFNlbGVjdG9yR3JvdXAoKS5yZW1vdmVBbGwoKX0sZS5wcm90b3R5cGUucmVuZGVySW5uZXI9ZnVuY3Rpb24odCxlLG4saSxyLG8sYSl7dmFyIHM9dGhpcy5nZXRDb250ZW50R3JvdXAoKSxsPXl0KCksdT1lLmdldCgic2VsZWN0ZWRNb2RlIiksaD1bXTtuLmVhY2hSYXdTZXJpZXMoKGZ1bmN0aW9uKHQpeyF0LmdldCgibGVnZW5kSG92ZXJMaW5rIikmJmgucHVzaCh0LmlkKX0pKSxVQihlLmdldERhdGEoKSwoZnVuY3Rpb24ocixvKXt2YXIgYT1yLmdldCgibmFtZSIpO2lmKCF0aGlzLm5ld2xpbmVEaXNhYmxlZCYmKCIiPT09YXx8IlxuIj09PWEpKXt2YXIgYz1uZXcgWkI7cmV0dXJuIGMubmV3bGluZT0hMCx2b2lkIHMuYWRkKGMpfXZhciBwPW4uZ2V0U2VyaWVzQnlOYW1lKGEpWzBdO2lmKCFsLmdldChhKSl7aWYocCl7dmFyIGQ9cC5nZXREYXRhKCksZj1kLmdldFZpc3VhbCgibGVnZW5kTGluZVN0eWxlIil8fHt9LGc9ZC5nZXRWaXN1YWwoImxlZ2VuZEljb24iKSx5PWQuZ2V0VmlzdWFsKCJzdHlsZSIpLHY9dGhpcy5fY3JlYXRlSXRlbShwLGEsbyxyLGUsdCxmLHksZyx1LGkpO3Yub24oImNsaWNrIixYQihxQixhLG51bGwsaSxoKSkub24oIm1vdXNlb3ZlciIsWEIoJEIscC5uYW1lLG51bGwsaSxoKSkub24oIm1vdXNlb3V0IixYQihKQixwLm5hbWUsbnVsbCxpLGgpKSxuLnNzciYmdi5lYWNoQ2hpbGQoKGZ1bmN0aW9uKHQpe3ZhciBlPXJsKHQpO2Uuc2VyaWVzSW5kZXg9cC5zZXJpZXNJbmRleCxlLmRhdGFJbmRleD1vLGUuc3NyVHlwZT0ibGVnZW5kIn0pKSxsLnNldChhLCEwKX1lbHNlIG4uZWFjaFJhd1NlcmllcygoZnVuY3Rpb24ocyl7aWYoIWwuZ2V0KGEpJiZzLmxlZ2VuZFZpc3VhbFByb3ZpZGVyKXt2YXIgYz1zLmxlZ2VuZFZpc3VhbFByb3ZpZGVyO2lmKCFjLmNvbnRhaW5OYW1lKGEpKXJldHVybjt2YXIgcD1jLmluZGV4T2ZOYW1lKGEpLGQ9Yy5nZXRJdGVtVmlzdWFsKHAsInN0eWxlIiksZj1jLmdldEl0ZW1WaXN1YWwocCwibGVnZW5kSWNvbiIpLGc9cW4oZC5maWxsKTtnJiYwPT09Z1szXSYmKGdbM109LjIsZD1BKEEoe30sZCkse2ZpbGw6cmkoZywicmdiYSIpfSkpO3ZhciB5PXRoaXMuX2NyZWF0ZUl0ZW0ocyxhLG8scixlLHQse30sZCxmLHUsaSk7eS5vbigiY2xpY2siLFhCKHFCLG51bGwsYSxpLGgpKS5vbigibW91c2VvdmVyIixYQigkQixudWxsLGEsaSxoKSkub24oIm1vdXNlb3V0IixYQihKQixudWxsLGEsaSxoKSksbi5zc3ImJnkuZWFjaENoaWxkKChmdW5jdGlvbih0KXt2YXIgZT1ybCh0KTtlLnNlcmllc0luZGV4PXMuc2VyaWVzSW5kZXgsZS5kYXRhSW5kZXg9byxlLnNzclR5cGU9ImxlZ2VuZCJ9KSksbC5zZXQoYSwhMCl9fSksdGhpcyk7MH19KSx0aGlzKSxyJiZ0aGlzLl9jcmVhdGVTZWxlY3RvcihyLGUsaSxvLGEpfSxlLnByb3RvdHlwZS5fY3JlYXRlU2VsZWN0b3I9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLmdldFNlbGVjdG9yR3JvdXAoKTtVQih0LChmdW5jdGlvbih0KXt2YXIgaT10LnR5cGUscj1uZXcgWHMoe3N0eWxlOnt4OjAseTowLGFsaWduOiJjZW50ZXIiLHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LG9uY2xpY2s6ZnVuY3Rpb24oKXtuLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJhbGwiPT09aT8ibGVnZW5kQWxsU2VsZWN0IjoibGVnZW5kSW52ZXJzZVNlbGVjdCJ9KX19KTtvLmFkZChyKSxpYyhyLHtub3JtYWw6ZS5nZXRNb2RlbCgic2VsZWN0b3JMYWJlbCIpLGVtcGhhc2lzOmUuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsInNlbGVjdG9yTGFiZWwiXSl9LHtkZWZhdWx0VGV4dDp0LnRpdGxlfSksVWwocil9KSl9LGUucHJvdG90eXBlLl9jcmVhdGVJdGVtPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyxsLHUsaCl7dmFyIGM9dC52aXN1YWxEcmF3VHlwZSxwPXIuZ2V0KCJpdGVtV2lkdGgiKSxkPXIuZ2V0KCJpdGVtSGVpZ2h0IiksZj1yLmlzU2VsZWN0ZWQoZSksZz1pLmdldCgic3ltYm9sUm90YXRlIikseT1pLmdldCgic3ltYm9sS2VlcEFzcGVjdCIpLHY9aS5nZXQoImljb24iKSxtPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEpe2Z1bmN0aW9uIHModCxlKXsiYXV0byI9PT10LmxpbmVXaWR0aCYmKHQubGluZVdpZHRoPWUubGluZVdpZHRoPjA/MjowKSxVQih0LChmdW5jdGlvbihuLGkpeyJpbmhlcml0Ij09PXRbaV0mJih0W2ldPWVbaV0pfSkpfXZhciBsPWUuZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLHU9bC5nZXRJdGVtU3R5bGUoKSxoPTA9PT10Lmxhc3RJbmRleE9mKCJlbXB0eSIsMCk/ImZpbGwiOiJzdHJva2UiLGM9bC5nZXRTaGFsbG93KCJkZWNhbCIpO3UuZGVjYWw9YyYmImluaGVyaXQiIT09Yz9tdihjLGEpOmkuZGVjYWwsImluaGVyaXQiPT09dS5maWxsJiYodS5maWxsPWlbcl0pOyJpbmhlcml0Ij09PXUuc3Ryb2tlJiYodS5zdHJva2U9aVtoXSk7ImluaGVyaXQiPT09dS5vcGFjaXR5JiYodS5vcGFjaXR5PSgiZmlsbCI9PT1yP2k6bikub3BhY2l0eSk7cyh1LGkpO3ZhciBwPWUuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLGQ9cC5nZXRMaW5lU3R5bGUoKTtpZihzKGQsbiksImF1dG8iPT09dS5maWxsJiYodS5maWxsPWkuZmlsbCksImF1dG8iPT09dS5zdHJva2UmJih1LnN0cm9rZT1pLmZpbGwpLCJhdXRvIj09PWQuc3Ryb2tlJiYoZC5zdHJva2U9aS5maWxsKSwhbyl7dmFyIGY9ZS5nZXQoImluYWN0aXZlQm9yZGVyV2lkdGgiKSxnPXVbaF07dS5saW5lV2lkdGg9ImF1dG8iPT09Zj9pLmxpbmVXaWR0aD4wJiZnPzI6MDp1LmxpbmVXaWR0aCx1LmZpbGw9ZS5nZXQoImluYWN0aXZlQ29sb3IiKSx1LnN0cm9rZT1lLmdldCgiaW5hY3RpdmVCb3JkZXJDb2xvciIpLGQuc3Ryb2tlPXAuZ2V0KCJpbmFjdGl2ZUNvbG9yIiksZC5saW5lV2lkdGg9cC5nZXQoImluYWN0aXZlV2lkdGgiKX1yZXR1cm57aXRlbVN0eWxlOnUsbGluZVN0eWxlOmR9fShsPXZ8fGx8fCJyb3VuZFJlY3QiLGksYSxzLGMsZixoKSx4PW5ldyBaQixfPWkuZ2V0TW9kZWwoInRleHRTdHlsZSIpO2lmKCFYKHQuZ2V0TGVnZW5kSWNvbil8fHYmJiJpbmhlcml0IiE9PXYpe3ZhciBiPSJpbmhlcml0Ij09PXYmJnQuZ2V0RGF0YSgpLmdldFZpc3VhbCgic3ltYm9sIik/ImluaGVyaXQiPT09Zz90LmdldERhdGEoKS5nZXRWaXN1YWwoInN5bWJvbFJvdGF0ZSIpOmc6MDt4LmFkZChmdW5jdGlvbih0KXt2YXIgZT10Lmljb258fCJyb3VuZFJlY3QiLG49WHkoZSwwLDAsdC5pdGVtV2lkdGgsdC5pdGVtSGVpZ2h0LHQuaXRlbVN0eWxlLmZpbGwsdC5zeW1ib2xLZWVwQXNwZWN0KTtuLnNldFN0eWxlKHQuaXRlbVN0eWxlKSxuLnJvdGF0aW9uPSh0Lmljb25Sb3RhdGV8fDApKk1hdGguUEkvMTgwLG4uc2V0T3JpZ2luKFt0Lml0ZW1XaWR0aC8yLHQuaXRlbUhlaWdodC8yXSksZS5pbmRleE9mKCJlbXB0eSIpPi0xJiYobi5zdHlsZS5zdHJva2U9bi5zdHlsZS5maWxsLG4uc3R5bGUuZmlsbD0iI2ZmZiIsbi5zdHlsZS5saW5lV2lkdGg9Mik7cmV0dXJuIG59KHtpdGVtV2lkdGg6cCxpdGVtSGVpZ2h0OmQsaWNvbjpsLGljb25Sb3RhdGU6YixpdGVtU3R5bGU6bS5pdGVtU3R5bGUsbGluZVN0eWxlOm0ubGluZVN0eWxlLHN5bWJvbEtlZXBBc3BlY3Q6eX0pKX1lbHNlIHguYWRkKHQuZ2V0TGVnZW5kSWNvbih7aXRlbVdpZHRoOnAsaXRlbUhlaWdodDpkLGljb246bCxpY29uUm90YXRlOmcsaXRlbVN0eWxlOm0uaXRlbVN0eWxlLGxpbmVTdHlsZTptLmxpbmVTdHlsZSxzeW1ib2xLZWVwQXNwZWN0Onl9KSk7dmFyIHc9ImxlZnQiPT09bz9wKzU6LTUsUz1vLE09ci5nZXQoImZvcm1hdHRlciIpLEk9ZTtVKE0pJiZNP0k9TS5yZXBsYWNlKCJ7bmFtZX0iLG51bGwhPWU/ZToiIik6WChNKSYmKEk9TShlKSk7dmFyIFQ9Zj9fLmdldFRleHRDb2xvcigpOmkuZ2V0KCJpbmFjdGl2ZUNvbG9yIik7eC5hZGQobmV3IFhzKHtzdHlsZTpvYyhfLHt0ZXh0OkkseDp3LHk6ZC8yLGZpbGw6VCxhbGlnbjpTLHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LHtpbmhlcml0Q29sb3I6VH0pfSkpO3ZhciBDPW5ldyBXcyh7c2hhcGU6eC5nZXRCb3VuZGluZ1JlY3QoKSxzdHlsZTp7ZmlsbDoidHJhbnNwYXJlbnQifX0pLEQ9aS5nZXRNb2RlbCgidG9vbHRpcCIpO3JldHVybiBELmdldCgic2hvdyIpJiZLaCh7ZWw6Qyxjb21wb25lbnRNb2RlbDpyLGl0ZW1OYW1lOmUsaXRlbVRvb2x0aXBPcHRpb246RC5vcHRpb259KSx4LmFkZChDKSx4LmVhY2hDaGlsZCgoZnVuY3Rpb24odCl7dC5zaWxlbnQ9ITB9KSksQy5zaWxlbnQ9IXUsdGhpcy5nZXRDb250ZW50R3JvdXAoKS5hZGQoeCksVWwoeCkseC5fX2xlZ2VuZERhdGFJbmRleD1uLHh9LGUucHJvdG90eXBlLmxheW91dElubmVyPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT10aGlzLmdldENvbnRlbnRHcm91cCgpLHM9dGhpcy5nZXRTZWxlY3Rvckdyb3VwKCk7QXAodC5nZXQoIm9yaWVudCIpLGEsdC5nZXQoIml0ZW1HYXAiKSxuLndpZHRoLG4uaGVpZ2h0KTt2YXIgbD1hLmdldEJvdW5kaW5nUmVjdCgpLHU9Wy1sLngsLWwueV07aWYocy5tYXJrUmVkcmF3KCksYS5tYXJrUmVkcmF3KCkscil7QXAoImhvcml6b250YWwiLHMsdC5nZXQoInNlbGVjdG9ySXRlbUdhcCIsITApKTt2YXIgaD1zLmdldEJvdW5kaW5nUmVjdCgpLGM9Wy1oLngsLWgueV0scD10LmdldCgic2VsZWN0b3JCdXR0b25HYXAiLCEwKSxkPXQuZ2V0T3JpZW50KCkuaW5kZXgsZj0wPT09ZD8id2lkdGgiOiJoZWlnaHQiLGc9MD09PWQ/ImhlaWdodCI6IndpZHRoIix5PTA9PT1kPyJ5IjoieCI7ImVuZCI9PT1vP2NbZF0rPWxbZl0rcDp1W2RdKz1oW2ZdK3AsY1sxLWRdKz1sW2ddLzItaFtnXS8yLHMueD1jWzBdLHMueT1jWzFdLGEueD11WzBdLGEueT11WzFdO3ZhciB2PXt4OjAseTowfTtyZXR1cm4gdltmXT1sW2ZdK3AraFtmXSx2W2ddPU1hdGgubWF4KGxbZ10saFtnXSksdlt5XT1NYXRoLm1pbigwLGhbeV0rY1sxLWRdKSx2fXJldHVybiBhLng9dVswXSxhLnk9dVsxXSx0aGlzLmdyb3VwLmdldEJvdW5kaW5nUmVjdCgpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmdldENvbnRlbnRHcm91cCgpLnJlbW92ZUFsbCgpLHRoaXMuX2lzRmlyc3RSZW5kZXI9ITB9LGUudHlwZT0ibGVnZW5kLnBsYWluIixlfShBZyk7ZnVuY3Rpb24gcUIodCxlLG4saSl7SkIodCxlLG4saSksbi5kaXNwYXRjaEFjdGlvbih7dHlwZToibGVnZW5kVG9nZ2xlU2VsZWN0IixuYW1lOm51bGwhPXQ/dDplfSksJEIodCxlLG4saSl9ZnVuY3Rpb24gS0IodCl7Zm9yKHZhciBlLG49dC5nZXRacigpLnN0b3JhZ2UuZ2V0RGlzcGxheUxpc3QoKSxpPTAscj1uLmxlbmd0aDtpPHImJiEoZT1uW2ldLnN0YXRlcy5lbXBoYXNpcyk7KWkrKztyZXR1cm4gZSYmZS5ob3ZlckxheWVyfWZ1bmN0aW9uICRCKHQsZSxuLGkpe0tCKG4pfHxuLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJoaWdobGlnaHQiLHNlcmllc05hbWU6dCxuYW1lOmUsZXhjbHVkZVNlcmllc0lkOml9KX1mdW5jdGlvbiBKQih0LGUsbixpKXtLQihuKXx8bi5kaXNwYXRjaEFjdGlvbih7dHlwZToiZG93bnBsYXkiLHNlcmllc05hbWU6dCxuYW1lOmUsZXhjbHVkZVNlcmllc0lkOml9KX1mdW5jdGlvbiBRQih0KXt2YXIgZT10LmZpbmRDb21wb25lbnRzKHttYWluVHlwZToibGVnZW5kIn0pO2UmJmUubGVuZ3RoJiZ0LmZpbHRlclNlcmllcygoZnVuY3Rpb24odCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0uaXNTZWxlY3RlZCh0Lm5hbWUpKXJldHVybiExO3JldHVybiEwfSkpfWZ1bmN0aW9uIHRGKHQsZSxuKXt2YXIgaSxyPXt9LG89InRvZ2dsZVNlbGVjdGVkIj09PXQ7cmV0dXJuIG4uZWFjaENvbXBvbmVudCgibGVnZW5kIiwoZnVuY3Rpb24obil7byYmbnVsbCE9aT9uW2k/InNlbGVjdCI6InVuU2VsZWN0Il0oZS5uYW1lKToiYWxsU2VsZWN0Ij09PXR8fCJpbnZlcnNlU2VsZWN0Ij09PXQ/blt0XSgpOihuW3RdKGUubmFtZSksaT1uLmlzU2VsZWN0ZWQoZS5uYW1lKSksRShuLmdldERhdGEoKSwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoIm5hbWUiKTtpZigiXG4iIT09ZSYmIiIhPT1lKXt2YXIgaT1uLmlzU2VsZWN0ZWQoZSk7ci5oYXNPd25Qcm9wZXJ0eShlKT9yW2VdPXJbZV0mJmk6cltlXT1pfX0pKX0pKSwiYWxsU2VsZWN0Ij09PXR8fCJpbnZlcnNlU2VsZWN0Ij09PXQ/e3NlbGVjdGVkOnJ9OntuYW1lOmUubmFtZSxzZWxlY3RlZDpyfX1mdW5jdGlvbiBlRih0KXt0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoWUIpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KGpCKSx0LnJlZ2lzdGVyUHJvY2Vzc29yKHQuUFJJT1JJVFkuUFJPQ0VTU09SLlNFUklFU19GSUxURVIsUUIpLHQucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyKCJsZWdlbmQiLChmdW5jdGlvbigpe3JldHVybiJwbGFpbiJ9KSksZnVuY3Rpb24odCl7dC5yZWdpc3RlckFjdGlvbigibGVnZW5kVG9nZ2xlU2VsZWN0IiwibGVnZW5kc2VsZWN0Y2hhbmdlZCIsSCh0RiwidG9nZ2xlU2VsZWN0ZWQiKSksdC5yZWdpc3RlckFjdGlvbigibGVnZW5kQWxsU2VsZWN0IiwibGVnZW5kc2VsZWN0YWxsIixIKHRGLCJhbGxTZWxlY3QiKSksdC5yZWdpc3RlckFjdGlvbigibGVnZW5kSW52ZXJzZVNlbGVjdCIsImxlZ2VuZGludmVyc2VzZWxlY3QiLEgodEYsImludmVyc2VTZWxlY3QiKSksdC5yZWdpc3RlckFjdGlvbigibGVnZW5kU2VsZWN0IiwibGVnZW5kc2VsZWN0ZWQiLEgodEYsInNlbGVjdCIpKSx0LnJlZ2lzdGVyQWN0aW9uKCJsZWdlbmRVblNlbGVjdCIsImxlZ2VuZHVuc2VsZWN0ZWQiLEgodEYsInVuU2VsZWN0IikpfSh0KX12YXIgbkY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuc2V0U2Nyb2xsRGF0YUluZGV4PWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9uLnNjcm9sbERhdGFJbmRleD10fSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGUsbixpKXt2YXIgcj1ScChlKTt0LnByb3RvdHlwZS5pbml0LmNhbGwodGhpcyxlLG4saSksaUYodGhpcyxlLHIpfSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLm1lcmdlT3B0aW9uLmNhbGwodGhpcyxlLG4pLGlGKHRoaXMsdGhpcy5vcHRpb24sZSl9LGUudHlwZT0ibGVnZW5kLnNjcm9sbCIsZS5kZWZhdWx0T3B0aW9uPWtjKFlCLmRlZmF1bHRPcHRpb24se3Njcm9sbERhdGFJbmRleDowLHBhZ2VCdXR0b25JdGVtR2FwOjUscGFnZUJ1dHRvbkdhcDpudWxsLHBhZ2VCdXR0b25Qb3NpdGlvbjoiZW5kIixwYWdlRm9ybWF0dGVyOiJ7Y3VycmVudH0ve3RvdGFsfSIscGFnZUljb25zOntob3Jpem9udGFsOlsiTTAsMEwxMiwtMTBMMTIsMTB6IiwiTTAsMEwtMTIsLTEwTC0xMiwxMHoiXSx2ZXJ0aWNhbDpbIk0wLDBMMjAsMEwxMCwtMjB6IiwiTTAsMEwyMCwwTDEwLDIweiJdfSxwYWdlSWNvbkNvbG9yOiIjMmY0NTU0IixwYWdlSWNvbkluYWN0aXZlQ29sb3I6IiNhYWEiLHBhZ2VJY29uU2l6ZToxNSxwYWdlVGV4dFN0eWxlOntjb2xvcjoiIzMzMyJ9LGFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlOjgwMH0pLGV9KFlCKTtmdW5jdGlvbiBpRih0LGUsbil7dmFyIGk9WzEsMV07aVt0LmdldE9yaWVudCgpLmluZGV4XT0wLE9wKGUsbix7dHlwZToiYm94IixpZ25vcmVTaXplOiEhaX0pfXZhciByRj1CcixvRj1bIndpZHRoIiwiaGVpZ2h0Il0sYUY9WyJ4IiwieSJdLHNGPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5uZXdsaW5lRGlzYWJsZWQ9ITAsbi5fY3VycmVudEluZGV4PTAsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5pbml0LmNhbGwodGhpcyksdGhpcy5ncm91cC5hZGQodGhpcy5fY29udGFpbmVyR3JvdXA9bmV3IHJGKSx0aGlzLl9jb250YWluZXJHcm91cC5hZGQodGhpcy5nZXRDb250ZW50R3JvdXAoKSksdGhpcy5ncm91cC5hZGQodGhpcy5fY29udHJvbGxlckdyb3VwPW5ldyByRil9LGUucHJvdG90eXBlLnJlc2V0SW5uZXI9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5yZXNldElubmVyLmNhbGwodGhpcyksdGhpcy5fY29udHJvbGxlckdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2NvbnRhaW5lckdyb3VwLnJlbW92ZUNsaXBQYXRoKCksdGhpcy5fY29udGFpbmVyR3JvdXAuX19yZWN0U2l6ZT1udWxsfSxlLnByb3RvdHlwZS5yZW5kZXJJbm5lcj1mdW5jdGlvbihlLG4saSxyLG8sYSxzKXt2YXIgbD10aGlzO3QucHJvdG90eXBlLnJlbmRlcklubmVyLmNhbGwodGhpcyxlLG4saSxyLG8sYSxzKTt2YXIgdT10aGlzLl9jb250cm9sbGVyR3JvdXAsaD1uLmdldCgicGFnZUljb25TaXplIiwhMCksYz1ZKGgpP2g6W2gsaF07ZCgicGFnZVByZXYiLDApO3ZhciBwPW4uZ2V0TW9kZWwoInBhZ2VUZXh0U3R5bGUiKTtmdW5jdGlvbiBkKHQsZSl7dmFyIGk9dCsiRGF0YUluZGV4IixvPVVoKG4uZ2V0KCJwYWdlSWNvbnMiLCEwKVtuLmdldE9yaWVudCgpLm5hbWVdW2VdLHtvbmNsaWNrOlcobC5fcGFnZUdvLGwsaSxuLHIpfSx7eDotY1swXS8yLHk6LWNbMV0vMix3aWR0aDpjWzBdLGhlaWdodDpjWzFdfSk7by5uYW1lPXQsdS5hZGQobyl9dS5hZGQobmV3IFhzKHtuYW1lOiJwYWdlVGV4dCIsc3R5bGU6e3RleHQ6Inh4L3h4IixmaWxsOnAuZ2V0VGV4dENvbG9yKCksZm9udDpwLmdldEZvbnQoKSx2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGFsaWduOiJjZW50ZXIifSxzaWxlbnQ6ITB9KSksZCgicGFnZU5leHQiLDEpfSxlLnByb3RvdHlwZS5sYXlvdXRJbm5lcj1mdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIGE9dGhpcy5nZXRTZWxlY3Rvckdyb3VwKCkscz10LmdldE9yaWVudCgpLmluZGV4LGw9b0Zbc10sdT1hRltzXSxoPW9GWzEtc10sYz1hRlsxLXNdO3ImJkFwKCJob3Jpem9udGFsIixhLHQuZ2V0KCJzZWxlY3Rvckl0ZW1HYXAiLCEwKSk7dmFyIHA9dC5nZXQoInNlbGVjdG9yQnV0dG9uR2FwIiwhMCksZD1hLmdldEJvdW5kaW5nUmVjdCgpLGY9Wy1kLngsLWQueV0sZz1UKG4pO3ImJihnW2xdPW5bbF0tZFtsXS1wKTt2YXIgeT10aGlzLl9sYXlvdXRDb250ZW50QW5kQ29udHJvbGxlcih0LGksZyxzLGwsaCxjLHUpO2lmKHIpe2lmKCJlbmQiPT09bylmW3NdKz15W2xdK3A7ZWxzZXt2YXIgdj1kW2xdK3A7ZltzXS09dix5W3VdLT12fXlbbF0rPWRbbF0rcCxmWzEtc10rPXlbY10reVtoXS8yLWRbaF0vMix5W2hdPU1hdGgubWF4KHlbaF0sZFtoXSkseVtjXT1NYXRoLm1pbih5W2NdLGRbY10rZlsxLXNdKSxhLng9ZlswXSxhLnk9ZlsxXSxhLm1hcmtSZWRyYXcoKX1yZXR1cm4geX0sZS5wcm90b3R5cGUuX2xheW91dENvbnRlbnRBbmRDb250cm9sbGVyPWZ1bmN0aW9uKHQsZSxuLGkscixvLGEscyl7dmFyIGw9dGhpcy5nZXRDb250ZW50R3JvdXAoKSx1PXRoaXMuX2NvbnRhaW5lckdyb3VwLGg9dGhpcy5fY29udHJvbGxlckdyb3VwO0FwKHQuZ2V0KCJvcmllbnQiKSxsLHQuZ2V0KCJpdGVtR2FwIiksaT9uLndpZHRoOm51bGwsaT9udWxsOm4uaGVpZ2h0KSxBcCgiaG9yaXpvbnRhbCIsaCx0LmdldCgicGFnZUJ1dHRvbkl0ZW1HYXAiLCEwKSk7dmFyIGM9bC5nZXRCb3VuZGluZ1JlY3QoKSxwPWguZ2V0Qm91bmRpbmdSZWN0KCksZD10aGlzLl9zaG93Q29udHJvbGxlcj1jW3JdPm5bcl0sZj1bLWMueCwtYy55XTtlfHwoZltpXT1sW3NdKTt2YXIgZz1bMCwwXSx5PVstcC54LC1wLnldLHY9cnQodC5nZXQoInBhZ2VCdXR0b25HYXAiLCEwKSx0LmdldCgiaXRlbUdhcCIsITApKTtkJiYoImVuZCI9PT10LmdldCgicGFnZUJ1dHRvblBvc2l0aW9uIiwhMCk/eVtpXSs9bltyXS1wW3JdOmdbaV0rPXBbcl0rdik7eVsxLWldKz1jW29dLzItcFtvXS8yLGwuc2V0UG9zaXRpb24oZiksdS5zZXRQb3NpdGlvbihnKSxoLnNldFBvc2l0aW9uKHkpO3ZhciBtPXt4OjAseTowfTtpZihtW3JdPWQ/bltyXTpjW3JdLG1bb109TWF0aC5tYXgoY1tvXSxwW29dKSxtW2FdPU1hdGgubWluKDAscFthXSt5WzEtaV0pLHUuX19yZWN0U2l6ZT1uW3JdLGQpe3ZhciB4PXt4OjAseTowfTt4W3JdPU1hdGgubWF4KG5bcl0tcFtyXS12LDApLHhbb109bVtvXSx1LnNldENsaXBQYXRoKG5ldyBXcyh7c2hhcGU6eH0pKSx1Ll9fcmVjdFNpemU9eFtyXX1lbHNlIGguZWFjaENoaWxkKChmdW5jdGlvbih0KXt0LmF0dHIoe2ludmlzaWJsZTohMCxzaWxlbnQ6ITB9KX0pKTt2YXIgXz10aGlzLl9nZXRQYWdlSW5mbyh0KTtyZXR1cm4gbnVsbCE9Xy5wYWdlSW5kZXgmJnZoKGwse3g6Xy5jb250ZW50UG9zaXRpb25bMF0seTpfLmNvbnRlbnRQb3NpdGlvblsxXX0sZD90Om51bGwpLHRoaXMuX3VwZGF0ZVBhZ2VJbmZvVmlldyh0LF8pLG19LGUucHJvdG90eXBlLl9wYWdlR289ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2dldFBhZ2VJbmZvKGUpW3RdO251bGwhPWkmJm4uZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImxlZ2VuZFNjcm9sbCIsc2Nyb2xsRGF0YUluZGV4OmksbGVnZW5kSWQ6ZS5pZH0pfSxlLnByb3RvdHlwZS5fdXBkYXRlUGFnZUluZm9WaWV3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY29udHJvbGxlckdyb3VwO0UoWyJwYWdlUHJldiIsInBhZ2VOZXh0Il0sKGZ1bmN0aW9uKGkpe3ZhciByPW51bGwhPWVbaSsiRGF0YUluZGV4Il0sbz1uLmNoaWxkT2ZOYW1lKGkpO28mJihvLnNldFN0eWxlKCJmaWxsIixyP3QuZ2V0KCJwYWdlSWNvbkNvbG9yIiwhMCk6dC5nZXQoInBhZ2VJY29uSW5hY3RpdmVDb2xvciIsITApKSxvLmN1cnNvcj1yPyJwb2ludGVyIjoiZGVmYXVsdCIpfSkpO3ZhciBpPW4uY2hpbGRPZk5hbWUoInBhZ2VUZXh0Iikscj10LmdldCgicGFnZUZvcm1hdHRlciIpLG89ZS5wYWdlSW5kZXgsYT1udWxsIT1vP28rMTowLHM9ZS5wYWdlQ291bnQ7aSYmciYmaS5zZXRTdHlsZSgidGV4dCIsVShyKT9yLnJlcGxhY2UoIntjdXJyZW50fSIsbnVsbD09YT8iIjphKyIiKS5yZXBsYWNlKCJ7dG90YWx9IixudWxsPT1zPyIiOnMrIiIpOnIoe2N1cnJlbnQ6YSx0b3RhbDpzfSkpfSxlLnByb3RvdHlwZS5fZ2V0UGFnZUluZm89ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoInNjcm9sbERhdGFJbmRleCIsITApLG49dGhpcy5nZXRDb250ZW50R3JvdXAoKSxpPXRoaXMuX2NvbnRhaW5lckdyb3VwLl9fcmVjdFNpemUscj10LmdldE9yaWVudCgpLmluZGV4LG89b0Zbcl0sYT1hRltyXSxzPXRoaXMuX2ZpbmRUYXJnZXRJdGVtSW5kZXgoZSksbD1uLmNoaWxkcmVuKCksdT1sW3NdLGg9bC5sZW5ndGgsYz1oPzE6MCxwPXtjb250ZW50UG9zaXRpb246W24ueCxuLnldLHBhZ2VDb3VudDpjLHBhZ2VJbmRleDpjLTEscGFnZVByZXZEYXRhSW5kZXg6bnVsbCxwYWdlTmV4dERhdGFJbmRleDpudWxsfTtpZighdSlyZXR1cm4gcDt2YXIgZD1tKHUpO3AuY29udGVudFBvc2l0aW9uW3JdPS1kLnM7Zm9yKHZhciBmPXMrMSxnPWQseT1kLHY9bnVsbDtmPD1oOysrZikoISh2PW0obFtmXSkpJiZ5LmU+Zy5zK2l8fHYmJiF4KHYsZy5zKSkmJihnPXkuaT5nLmk/eTp2KSYmKG51bGw9PXAucGFnZU5leHREYXRhSW5kZXgmJihwLnBhZ2VOZXh0RGF0YUluZGV4PWcuaSksKytwLnBhZ2VDb3VudCkseT12O2ZvcihmPXMtMSxnPWQseT1kLHY9bnVsbDtmPj0tMTstLWYpKHY9bShsW2ZdKSkmJngoeSx2LnMpfHwhKGcuaTx5LmkpfHwoeT1nLG51bGw9PXAucGFnZVByZXZEYXRhSW5kZXgmJihwLnBhZ2VQcmV2RGF0YUluZGV4PWcuaSksKytwLnBhZ2VDb3VudCwrK3AucGFnZUluZGV4KSxnPXY7cmV0dXJuIHA7ZnVuY3Rpb24gbSh0KXtpZih0KXt2YXIgZT10LmdldEJvdW5kaW5nUmVjdCgpLG49ZVthXSt0W2FdO3JldHVybntzOm4sZTpuK2Vbb10saTp0Ll9fbGVnZW5kRGF0YUluZGV4fX19ZnVuY3Rpb24geCh0LGUpe3JldHVybiB0LmU+PWUmJnQuczw9ZStpfX0sZS5wcm90b3R5cGUuX2ZpbmRUYXJnZXRJdGVtSW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Nob3dDb250cm9sbGVyPyh0aGlzLmdldENvbnRlbnRHcm91cCgpLmVhY2hDaGlsZCgoZnVuY3Rpb24oaSxyKXt2YXIgbz1pLl9fbGVnZW5kRGF0YUluZGV4O251bGw9PW4mJm51bGwhPW8mJihuPXIpLG89PT10JiYoZT1yKX0pKSxudWxsIT1lP2U6bik6MDt2YXIgZSxufSxlLnR5cGU9ImxlZ2VuZC5zY3JvbGwiLGV9KGpCKTtmdW5jdGlvbiBsRih0KXtWbShlRiksdC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKG5GKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhzRiksZnVuY3Rpb24odCl7dC5yZWdpc3RlckFjdGlvbigibGVnZW5kU2Nyb2xsIiwibGVnZW5kc2Nyb2xsIiwoZnVuY3Rpb24odCxlKXt2YXIgbj10LnNjcm9sbERhdGFJbmRleDtudWxsIT1uJiZlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJsZWdlbmQiLHN1YlR5cGU6InNjcm9sbCIscXVlcnk6dH0sKGZ1bmN0aW9uKHQpe3Quc2V0U2Nyb2xsRGF0YUluZGV4KG4pfSkpfSkpfSh0KX12YXIgdUY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxufXJldHVybiBuKGUsdCksZS50eXBlPSJkYXRhWm9vbS5pbnNpZGUiLGUuZGVmYXVsdE9wdGlvbj1rYyhhei5kZWZhdWx0T3B0aW9uLHtkaXNhYmxlZDohMSx6b29tTG9jazohMSx6b29tT25Nb3VzZVdoZWVsOiEwLG1vdmVPbk1vdXNlTW92ZTohMCxtb3ZlT25Nb3VzZVdoZWVsOiExLHByZXZlbnREZWZhdWx0TW91c2VNb3ZlOiEwfSksZX0oYXopLGhGPVZvKCk7ZnVuY3Rpb24gY0YodCxlLG4pe2hGKHQpLmNvb3JkU3lzUmVjb3JkTWFwLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPXQuZGF0YVpvb21JbmZvTWFwLmdldChlLnVpZCk7aSYmKGkuZ2V0UmFuZ2U9bil9KSl9ZnVuY3Rpb24gcEYodCxlKXtpZihlKXt0LnJlbW92ZUtleShlLm1vZGVsLnVpZCk7dmFyIG49ZS5jb250cm9sbGVyO24mJm4uZGlzcG9zZSgpfX1mdW5jdGlvbiBkRih0LGUpe3QuaXNEaXNwb3NlZCgpfHx0LmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJkYXRhWm9vbSIsYW5pbWF0aW9uOntlYXNpbmc6ImN1YmljT3V0IixkdXJhdGlvbjoxMDB9LGJhdGNoOmV9KX1mdW5jdGlvbiBmRih0LGUsbixpKXtyZXR1cm4gdC5jb29yZGluYXRlU3lzdGVtLmNvbnRhaW5Qb2ludChbbixpXSl9ZnVuY3Rpb24gZ0YodCl7dC5yZWdpc3RlclByb2Nlc3Nvcih0LlBSSU9SSVRZLlBST0NFU1NPUi5GSUxURVIsKGZ1bmN0aW9uKHQsZSl7dmFyIG49aEYoZSksaT1uLmNvb3JkU3lzUmVjb3JkTWFwfHwobi5jb29yZFN5c1JlY29yZE1hcD15dCgpKTtpLmVhY2goKGZ1bmN0aW9uKHQpe3QuZGF0YVpvb21JbmZvTWFwPW51bGx9KSksdC5lYWNoQ29tcG9uZW50KHttYWluVHlwZToiZGF0YVpvb20iLHN1YlR5cGU6Imluc2lkZSJ9LChmdW5jdGlvbih0KXtFKHJ6KHQpLmluZm9MaXN0LChmdW5jdGlvbihuKXt2YXIgcj1uLm1vZGVsLnVpZCxvPWkuZ2V0KHIpfHxpLnNldChyLGZ1bmN0aW9uKHQsZSl7dmFyIG49e21vZGVsOmUsY29udGFpbnNQb2ludDpIKGZGLGUpLGRpc3BhdGNoQWN0aW9uOkgoZEYsdCksZGF0YVpvb21JbmZvTWFwOm51bGwsY29udHJvbGxlcjpudWxsfSxpPW4uY29udHJvbGxlcj1uZXcgblQodC5nZXRacigpKTtyZXR1cm4gRShbInBhbiIsInpvb20iLCJzY3JvbGxNb3ZlIl0sKGZ1bmN0aW9uKHQpe2kub24odCwoZnVuY3Rpb24oZSl7dmFyIGk9W107bi5kYXRhWm9vbUluZm9NYXAuZWFjaCgoZnVuY3Rpb24ocil7aWYoZS5pc0F2YWlsYWJsZUJlaGF2aW9yKHIubW9kZWwub3B0aW9uKSl7dmFyIG89KHIuZ2V0UmFuZ2V8fHt9KVt0XSxhPW8mJm8oci5kelJlZmVyQ29vcmRTeXNJbmZvLG4ubW9kZWwubWFpblR5cGUsbi5jb250cm9sbGVyLGUpOyFyLm1vZGVsLmdldCgiZGlzYWJsZWQiLCEwKSYmYSYmaS5wdXNoKHtkYXRhWm9vbUlkOnIubW9kZWwuaWQsc3RhcnQ6YVswXSxlbmQ6YVsxXX0pfX0pKSxpLmxlbmd0aCYmbi5kaXNwYXRjaEFjdGlvbihpKX0pKX0pKSxufShlLG4ubW9kZWwpKTsoby5kYXRhWm9vbUluZm9NYXB8fChvLmRhdGFab29tSW5mb01hcD15dCgpKSkuc2V0KHQudWlkLHtkelJlZmVyQ29vcmRTeXNJbmZvOm4sbW9kZWw6dCxnZXRSYW5nZTpudWxsfSl9KSl9KSksaS5lYWNoKChmdW5jdGlvbih0KXt2YXIgZSxuPXQuY29udHJvbGxlcixyPXQuZGF0YVpvb21JbmZvTWFwO2lmKHIpe3ZhciBvPXIua2V5cygpWzBdO251bGwhPW8mJihlPXIuZ2V0KG8pKX1pZihlKXt2YXIgYT1mdW5jdGlvbih0KXt2YXIgZSxuPSJ0eXBlXyIsaT17dHlwZV90cnVlOjIsdHlwZV9tb3ZlOjEsdHlwZV9mYWxzZTowLHR5cGVfdW5kZWZpbmVkOi0xfSxyPSEwO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBvPXQubW9kZWwsYT0hby5nZXQoImRpc2FibGVkIiwhMCkmJighby5nZXQoInpvb21Mb2NrIiwhMCl8fCJtb3ZlIik7aVtuK2FdPmlbbitlXSYmKGU9YSkscj1yJiZvLmdldCgicHJldmVudERlZmF1bHRNb3VzZU1vdmUiLCEwKX0pKSx7Y29udHJvbFR5cGU6ZSxvcHQ6e3pvb21Pbk1vdXNlV2hlZWw6ITAsbW92ZU9uTW91c2VNb3ZlOiEwLG1vdmVPbk1vdXNlV2hlZWw6ITAscHJldmVudERlZmF1bHRNb3VzZU1vdmU6ISFyfX19KHIpO24uZW5hYmxlKGEuY29udHJvbFR5cGUsYS5vcHQpLG4uc2V0UG9pbnRlckNoZWNrZXIodC5jb250YWluc1BvaW50KSxIZyh0LCJkaXNwYXRjaEFjdGlvbiIsZS5tb2RlbC5nZXQoInRocm90dGxlIiwhMCksImZpeFJhdGUiKX1lbHNlIHBGKGksdCl9KSl9KSl9dmFyIHlGPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT0iZGF0YVpvb20uaW5zaWRlIixlfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGUsbixpKXt0LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUubm9UYXJnZXQoKT90aGlzLl9jbGVhcigpOih0aGlzLnJhbmdlPWUuZ2V0UGVyY2VudFJhbmdlKCksY0YoaSxlLHtwYW46Vyh2Ri5wYW4sdGhpcyksem9vbTpXKHZGLnpvb20sdGhpcyksc2Nyb2xsTW92ZTpXKHZGLnNjcm9sbE1vdmUsdGhpcyl9KSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhcigpLHQucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5fY2xlYXI9ZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlKXtmb3IodmFyIG49aEYodCkuY29vcmRTeXNSZWNvcmRNYXAsaT1uLmtleXMoKSxyPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBvPWlbcl0sYT1uLmdldChvKSxzPWEuZGF0YVpvb21JbmZvTWFwO2lmKHMpe3ZhciBsPWUudWlkO3MuZ2V0KGwpJiYocy5yZW1vdmVLZXkobCkscy5rZXlzKCkubGVuZ3RofHxwRihuLGEpKX19fSh0aGlzLmFwaSx0aGlzLmRhdGFab29tTW9kZWwpLHRoaXMucmFuZ2U9bnVsbH0sZS50eXBlPSJkYXRhWm9vbS5pbnNpZGUiLGV9KHV6KSx2Rj17em9vbTpmdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLnJhbmdlLG89ci5zbGljZSgpLGE9dC5heGlzTW9kZWxzWzBdO2lmKGEpe3ZhciBzPXhGW2VdKG51bGwsW2kub3JpZ2luWCxpLm9yaWdpblldLGEsbix0KSxsPShzLnNpZ25hbD4wP3MucGl4ZWxTdGFydCtzLnBpeGVsTGVuZ3RoLXMucGl4ZWw6cy5waXhlbC1zLnBpeGVsU3RhcnQpL3MucGl4ZWxMZW5ndGgqKG9bMV0tb1swXSkrb1swXSx1PU1hdGgubWF4KDEvaS5zY2FsZSwwKTtvWzBdPShvWzBdLWwpKnUrbCxvWzFdPShvWzFdLWwpKnUrbDt2YXIgaD10aGlzLmRhdGFab29tTW9kZWwuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCkuZ2V0TWluTWF4U3BhbigpO3JldHVybiB6aygwLG8sWzAsMTAwXSwwLGgubWluU3BhbixoLm1heFNwYW4pLHRoaXMucmFuZ2U9byxyWzBdIT09b1swXXx8clsxXSE9PW9bMV0/bzp2b2lkIDB9fSxwYW46bUYoKGZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT14RltpXShbby5vbGRYLG8ub2xkWV0sW28ubmV3WCxvLm5ld1ldLGUscixuKTtyZXR1cm4gYS5zaWduYWwqKHRbMV0tdFswXSkqYS5waXhlbC9hLnBpeGVsTGVuZ3RofSkpLHNjcm9sbE1vdmU6bUYoKGZ1bmN0aW9uKHQsZSxuLGkscixvKXtyZXR1cm4geEZbaV0oWzAsMF0sW28uc2Nyb2xsRGVsdGEsby5zY3JvbGxEZWx0YV0sZSxyLG4pLnNpZ25hbCoodFsxXS10WzBdKSpvLnNjcm9sbERlbHRhfSkpfTtmdW5jdGlvbiBtRih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGkscil7dmFyIG89dGhpcy5yYW5nZSxhPW8uc2xpY2UoKSxzPWUuYXhpc01vZGVsc1swXTtpZihzKXJldHVybiB6ayh0KGEscyxlLG4saSxyKSxhLFswLDEwMF0sImFsbCIpLHRoaXMucmFuZ2U9YSxvWzBdIT09YVswXXx8b1sxXSE9PWFbMV0/YTp2b2lkIDB9fXZhciB4Rj17Z3JpZDpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPW4uYXhpcyxhPXt9LHM9ci5tb2RlbC5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKTtyZXR1cm4gdD10fHxbMCwwXSwieCI9PT1vLmRpbT8oYS5waXhlbD1lWzBdLXRbMF0sYS5waXhlbExlbmd0aD1zLndpZHRoLGEucGl4ZWxTdGFydD1zLngsYS5zaWduYWw9by5pbnZlcnNlPzE6LTEpOihhLnBpeGVsPWVbMV0tdFsxXSxhLnBpeGVsTGVuZ3RoPXMuaGVpZ2h0LGEucGl4ZWxTdGFydD1zLnksYS5zaWduYWw9by5pbnZlcnNlPy0xOjEpLGF9LHBvbGFyOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89bi5heGlzLGE9e30scz1yLm1vZGVsLmNvb3JkaW5hdGVTeXN0ZW0sbD1zLmdldFJhZGl1c0F4aXMoKS5nZXRFeHRlbnQoKSx1PXMuZ2V0QW5nbGVBeGlzKCkuZ2V0RXh0ZW50KCk7cmV0dXJuIHQ9dD9zLnBvaW50VG9Db29yZCh0KTpbMCwwXSxlPXMucG9pbnRUb0Nvb3JkKGUpLCJyYWRpdXNBeGlzIj09PW4ubWFpblR5cGU/KGEucGl4ZWw9ZVswXS10WzBdLGEucGl4ZWxMZW5ndGg9bFsxXS1sWzBdLGEucGl4ZWxTdGFydD1sWzBdLGEuc2lnbmFsPW8uaW52ZXJzZT8xOi0xKTooYS5waXhlbD1lWzFdLXRbMV0sYS5waXhlbExlbmd0aD11WzFdLXVbMF0sYS5waXhlbFN0YXJ0PXVbMF0sYS5zaWduYWw9by5pbnZlcnNlPy0xOjEpLGF9LHNpbmdsZUF4aXM6ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz1uLmF4aXMsYT1yLm1vZGVsLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0UmVjdCgpLHM9e307cmV0dXJuIHQ9dHx8WzAsMF0sImhvcml6b250YWwiPT09by5vcmllbnQ/KHMucGl4ZWw9ZVswXS10WzBdLHMucGl4ZWxMZW5ndGg9YS53aWR0aCxzLnBpeGVsU3RhcnQ9YS54LHMuc2lnbmFsPW8uaW52ZXJzZT8xOi0xKToocy5waXhlbD1lWzFdLXRbMV0scy5waXhlbExlbmd0aD1hLmhlaWdodCxzLnBpeGVsU3RhcnQ9YS55LHMuc2lnbmFsPW8uaW52ZXJzZT8tMToxKSxzfX07ZnVuY3Rpb24gX0YodCl7eXoodCksdC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKHVGKSx0LnJlZ2lzdGVyQ29tcG9uZW50Vmlldyh5RiksZ0YodCl9dmFyIGJGPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUudHlwZT0iZGF0YVpvb20uc2xpZGVyIixlLmxheW91dE1vZGU9ImJveCIsZS5kZWZhdWx0T3B0aW9uPWtjKGF6LmRlZmF1bHRPcHRpb24se3Nob3c6ITAscmlnaHQ6InBoIix0b3A6InBoIix3aWR0aDoicGgiLGhlaWdodDoicGgiLGxlZnQ6bnVsbCxib3R0b206bnVsbCxib3JkZXJDb2xvcjoiI2QyZGJlZSIsYm9yZGVyUmFkaXVzOjMsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDQ3LDY5LDg0LDApIixkYXRhQmFja2dyb3VuZDp7bGluZVN0eWxlOntjb2xvcjoiI2QyZGJlZSIsd2lkdGg6LjV9LGFyZWFTdHlsZTp7Y29sb3I6IiNkMmRiZWUiLG9wYWNpdHk6LjJ9fSxzZWxlY3RlZERhdGFCYWNrZ3JvdW5kOntsaW5lU3R5bGU6e2NvbG9yOiIjOGZiMGY3Iix3aWR0aDouNX0sYXJlYVN0eWxlOntjb2xvcjoiIzhmYjBmNyIsb3BhY2l0eTouMn19LGZpbGxlckNvbG9yOiJyZ2JhKDEzNSwxNzUsMjc0LDAuMikiLGhhbmRsZUljb246InBhdGg6Ly9NLTkuMzUsMzQuNTZWNDJtMC00MFY5LjVtLTIsMGg0YTIsMiwwLDAsMSwyLDJ2MjFhMiwyLDAsMCwxLTIsMmgtNGEyLDIsMCwwLDEtMi0ydi0yMUEyLDIsMCwwLDEtMTEuMzUsOS41WiIsaGFuZGxlU2l6ZToiMTAwJSIsaGFuZGxlU3R5bGU6e2NvbG9yOiIjZmZmIixib3JkZXJDb2xvcjoiI0FDQjhEMSJ9LG1vdmVIYW5kbGVTaXplOjcsbW92ZUhhbmRsZUljb246InBhdGg6Ly9NLTMyMC45LTUwTC0zMjAuOS01MGMxOC4xLDAsMjcuMSw5LDI3LjEsMjcuMVY4NS43YzAsMTguMS05LDI3LjEtMjcuMSwyNy4xbDAsMGMtMTguMSwwLTI3LjEtOS0yNy4xLTI3LjFWLTIyLjlDLTM0OC00MS0zMzktNTAtMzIwLjktNTB6IE0tMjEyLjMtNTBMLTIxMi4zLTUwYzE4LjEsMCwyNy4xLDksMjcuMSwyNy4xVjg1LjdjMCwxOC4xLTksMjcuMS0yNy4xLDI3LjFsMCwwYy0xOC4xLDAtMjcuMS05LTI3LjEtMjcuMVYtMjIuOUMtMjM5LjQtNDEtMjMwLjQtNTAtMjEyLjMtNTB6IE0tMTAzLjctNTBMLTEwMy43LTUwYzE4LjEsMCwyNy4xLDksMjcuMSwyNy4xVjg1LjdjMCwxOC4xLTksMjcuMS0yNy4xLDI3LjFsMCwwYy0xOC4xLDAtMjcuMS05LTI3LjEtMjcuMVYtMjIuOUMtMTMwLjktNDEtMTIxLjgtNTAtMTAzLjctNTB6Iixtb3ZlSGFuZGxlU3R5bGU6e2NvbG9yOiIjRDJEQkVFIixvcGFjaXR5Oi43fSxzaG93RGV0YWlsOiEwLHNob3dEYXRhU2hhZG93OiJhdXRvIixyZWFsdGltZTohMCx6b29tTG9jazohMSx0ZXh0U3R5bGU6e2NvbG9yOiIjNkU3MDc5In0sYnJ1c2hTZWxlY3Q6ITAsYnJ1c2hTdHlsZTp7Y29sb3I6InJnYmEoMTM1LDE3NSwyNzQsMC4xNSkifSxlbXBoYXNpczp7aGFuZGxlU3R5bGU6e2JvcmRlckNvbG9yOiIjOEZCMEY3In0sbW92ZUhhbmRsZVN0eWxlOntjb2xvcjoiIzhGQjBGNyJ9fX0pLGV9KGF6KSx3Rj1XcyxTRj0iaG9yaXpvbnRhbCIsTUY9InZlcnRpY2FsIixJRj1bImxpbmUiLCJiYXIiLCJjYW5kbGVzdGljayIsInNjYXR0ZXIiXSxURj17ZWFzaW5nOiJjdWJpY091dCIsZHVyYXRpb246MTAwLGRlbGF5OjB9LENGPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbi5fZGlzcGxheWFibGVzPXt9LG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSl7dGhpcy5hcGk9ZSx0aGlzLl9vbkJydXNoPVcodGhpcy5fb25CcnVzaCx0aGlzKSx0aGlzLl9vbkJydXNoRW5kPVcodGhpcy5fb25CcnVzaEVuZCx0aGlzKX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGUsbixpLHIpe2lmKHQucHJvdG90eXBlLnJlbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksSGcodGhpcywiX2Rpc3BhdGNoWm9vbUFjdGlvbiIsZS5nZXQoInRocm90dGxlIiksImZpeFJhdGUiKSx0aGlzLl9vcmllbnQ9ZS5nZXRPcmllbnQoKSwhMSE9PWUuZ2V0KCJzaG93Iikpe2lmKGUubm9UYXJnZXQoKSlyZXR1cm4gdGhpcy5fY2xlYXIoKSx2b2lkIHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7ciYmImRhdGFab29tIj09PXIudHlwZSYmci5mcm9tPT09dGhpcy51aWR8fHRoaXMuX2J1aWxkVmlldygpLHRoaXMuX3VwZGF0ZVZpZXcoKX1lbHNlIHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhcigpLHQucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5fY2xlYXI9ZnVuY3Rpb24oKXtZZyh0aGlzLCJfZGlzcGF0Y2hab29tQWN0aW9uIik7dmFyIHQ9dGhpcy5hcGkuZ2V0WnIoKTt0Lm9mZigibW91c2Vtb3ZlIix0aGlzLl9vbkJydXNoKSx0Lm9mZigibW91c2V1cCIsdGhpcy5fb25CcnVzaEVuZCl9LGUucHJvdG90eXBlLl9idWlsZFZpZXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdyb3VwO3QucmVtb3ZlQWxsKCksdGhpcy5fYnJ1c2hpbmc9ITEsdGhpcy5fZGlzcGxheWFibGVzLmJydXNoUmVjdD1udWxsLHRoaXMuX3Jlc2V0TG9jYXRpb24oKSx0aGlzLl9yZXNldEludGVydmFsKCk7dmFyIGU9dGhpcy5fZGlzcGxheWFibGVzLnNsaWRlckdyb3VwPW5ldyBCcjt0aGlzLl9yZW5kZXJCYWNrZ3JvdW5kKCksdGhpcy5fcmVuZGVySGFuZGxlKCksdGhpcy5fcmVuZGVyRGF0YVNoYWRvdygpLHQuYWRkKGUpLHRoaXMuX3Bvc2l0aW9uR3JvdXAoKX0sZS5wcm90b3R5cGUuX3Jlc2V0TG9jYXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRhdGFab29tTW9kZWwsZT10aGlzLmFwaSxuPXQuZ2V0KCJicnVzaFNlbGVjdCIpPzc6MCxpPXRoaXMuX2ZpbmRDb29yZFJlY3QoKSxyPXt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9LG89dGhpcy5fb3JpZW50PT09U0Y/e3JpZ2h0OnIud2lkdGgtaS54LWkud2lkdGgsdG9wOnIuaGVpZ2h0LTMwLTctbix3aWR0aDppLndpZHRoLGhlaWdodDozMH06e3JpZ2h0OjcsdG9wOmkueSx3aWR0aDozMCxoZWlnaHQ6aS5oZWlnaHR9LGE9UnAodC5vcHRpb24pO0UoWyJyaWdodCIsInRvcCIsIndpZHRoIiwiaGVpZ2h0Il0sKGZ1bmN0aW9uKHQpeyJwaCI9PT1hW3RdJiYoYVt0XT1vW3RdKX0pKTt2YXIgcz1rcChhLHIpO3RoaXMuX2xvY2F0aW9uPXt4OnMueCx5OnMueX0sdGhpcy5fc2l6ZT1bcy53aWR0aCxzLmhlaWdodF0sdGhpcy5fb3JpZW50PT09TUYmJnRoaXMuX3NpemUucmV2ZXJzZSgpfSxlLnByb3RvdHlwZS5fcG9zaXRpb25Hcm91cD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ3JvdXAsZT10aGlzLl9sb2NhdGlvbixuPXRoaXMuX29yaWVudCxpPXRoaXMuZGF0YVpvb21Nb2RlbC5nZXRGaXJzdFRhcmdldEF4aXNNb2RlbCgpLHI9aSYmaS5nZXQoImludmVyc2UiKSxvPXRoaXMuX2Rpc3BsYXlhYmxlcy5zbGlkZXJHcm91cCxhPSh0aGlzLl9kYXRhU2hhZG93SW5mb3x8e30pLm90aGVyQXhpc0ludmVyc2U7by5hdHRyKG4hPT1TRnx8cj9uPT09U0YmJnI/e3NjYWxlWTphPzE6LTEsc2NhbGVYOi0xfTpuIT09TUZ8fHI/e3NjYWxlWTphPy0xOjEsc2NhbGVYOi0xLHJvdGF0aW9uOk1hdGguUEkvMn06e3NjYWxlWTphPy0xOjEsc2NhbGVYOjEscm90YXRpb246TWF0aC5QSS8yfTp7c2NhbGVZOmE/MTotMSxzY2FsZVg6MX0pO3ZhciBzPXQuZ2V0Qm91bmRpbmdSZWN0KFtvXSk7dC54PWUueC1zLngsdC55PWUueS1zLnksdC5tYXJrUmVkcmF3KCl9LGUucHJvdG90eXBlLl9nZXRWaWV3RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fc2l6ZVswXV19LGUucHJvdG90eXBlLl9yZW5kZXJCYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhWm9vbU1vZGVsLGU9dGhpcy5fc2l6ZSxuPXRoaXMuX2Rpc3BsYXlhYmxlcy5zbGlkZXJHcm91cCxpPXQuZ2V0KCJicnVzaFNlbGVjdCIpO24uYWRkKG5ldyB3Rih7c2lsZW50OiEwLHNoYXBlOnt4OjAseTowLHdpZHRoOmVbMF0saGVpZ2h0OmVbMV19LHN0eWxlOntmaWxsOnQuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKX0sejI6LTQwfSkpO3ZhciByPW5ldyB3Rih7c2hhcGU6e3g6MCx5OjAsd2lkdGg6ZVswXSxoZWlnaHQ6ZVsxXX0sc3R5bGU6e2ZpbGw6InRyYW5zcGFyZW50In0sejI6MCxvbmNsaWNrOlcodGhpcy5fb25DbGlja1BhbmVsLHRoaXMpfSksbz10aGlzLmFwaS5nZXRacigpO2k/KHIub24oIm1vdXNlZG93biIsdGhpcy5fb25CcnVzaFN0YXJ0LHRoaXMpLHIuY3Vyc29yPSJjcm9zc2hhaXIiLG8ub24oIm1vdXNlbW92ZSIsdGhpcy5fb25CcnVzaCksby5vbigibW91c2V1cCIsdGhpcy5fb25CcnVzaEVuZCkpOihvLm9mZigibW91c2Vtb3ZlIix0aGlzLl9vbkJydXNoKSxvLm9mZigibW91c2V1cCIsdGhpcy5fb25CcnVzaEVuZCkpLG4uYWRkKHIpfSxlLnByb3RvdHlwZS5fcmVuZGVyRGF0YVNoYWRvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGFTaGFkb3dJbmZvPXRoaXMuX3ByZXBhcmVEYXRhU2hhZG93SW5mbygpO2lmKHRoaXMuX2Rpc3BsYXlhYmxlcy5kYXRhU2hhZG93U2Vncz1bXSx0KXt2YXIgZT10aGlzLl9zaXplLG49dGhpcy5fc2hhZG93U2l6ZXx8W10saT10LnNlcmllcyxyPWkuZ2V0UmF3RGF0YSgpLG89aS5nZXRTaGFkb3dEaW0mJmkuZ2V0U2hhZG93RGltKCksYT1vJiZyLmdldERpbWVuc2lvbkluZm8obyk/aS5nZXRTaGFkb3dEaW0oKTp0Lm90aGVyRGltO2lmKG51bGwhPWEpe3ZhciBzPXRoaXMuX3NoYWRvd1BvbHlnb25QdHMsbD10aGlzLl9zaGFkb3dQb2x5bGluZVB0cztpZihyIT09dGhpcy5fc2hhZG93RGF0YXx8YSE9PXRoaXMuX3NoYWRvd0RpbXx8ZVswXSE9PW5bMF18fGVbMV0hPT1uWzFdKXt2YXIgdT1yLmdldERhdGFFeHRlbnQoYSksaD0uMyoodVsxXS11WzBdKTt1PVt1WzBdLWgsdVsxXStoXTt2YXIgYyxwPVswLGVbMV1dLGQ9WzAsZVswXV0sZj1bW2VbMF0sMF0sWzAsMF1dLGc9W10seT1kWzFdLyhyLmNvdW50KCktMSksdj0wLG09TWF0aC5yb3VuZChyLmNvdW50KCkvZVswXSk7ci5lYWNoKFthXSwoZnVuY3Rpb24odCxlKXtpZihtPjAmJmUlbSl2Kz15O2Vsc2V7dmFyIG49bnVsbD09dHx8aXNOYU4odCl8fCIiPT09dCxpPW4/MDpLcih0LHUscCwhMCk7biYmIWMmJmU/KGYucHVzaChbZltmLmxlbmd0aC0xXVswXSwwXSksZy5wdXNoKFtnW2cubGVuZ3RoLTFdWzBdLDBdKSk6IW4mJmMmJihmLnB1c2goW3YsMF0pLGcucHVzaChbdiwwXSkpLGYucHVzaChbdixpXSksZy5wdXNoKFt2LGldKSx2Kz15LGM9bn19KSkscz10aGlzLl9zaGFkb3dQb2x5Z29uUHRzPWYsbD10aGlzLl9zaGFkb3dQb2x5bGluZVB0cz1nfXRoaXMuX3NoYWRvd0RhdGE9cix0aGlzLl9zaGFkb3dEaW09YSx0aGlzLl9zaGFkb3dTaXplPVtlWzBdLGVbMV1dO2Zvcih2YXIgeD10aGlzLmRhdGFab29tTW9kZWwsXz0wO188MztfKyspe3ZhciBiPXcoMT09PV8pO3RoaXMuX2Rpc3BsYXlhYmxlcy5zbGlkZXJHcm91cC5hZGQoYiksdGhpcy5fZGlzcGxheWFibGVzLmRhdGFTaGFkb3dTZWdzLnB1c2goYil9fX1mdW5jdGlvbiB3KHQpe3ZhciBlPXguZ2V0TW9kZWwodD8ic2VsZWN0ZWREYXRhQmFja2dyb3VuZCI6ImRhdGFCYWNrZ3JvdW5kIiksbj1uZXcgQnIsaT1uZXcgWHUoe3NoYXBlOntwb2ludHM6c30sc2VnbWVudElnbm9yZVRocmVzaG9sZDoxLHN0eWxlOmUuZ2V0TW9kZWwoImFyZWFTdHlsZSIpLmdldEFyZWFTdHlsZSgpLHNpbGVudDohMCx6MjotMjB9KSxyPW5ldyBadSh7c2hhcGU6e3BvaW50czpsfSxzZWdtZW50SWdub3JlVGhyZXNob2xkOjEsc3R5bGU6ZS5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksc2lsZW50OiEwLHoyOi0xOX0pO3JldHVybiBuLmFkZChpKSxuLmFkZChyKSxufX0sZS5wcm90b3R5cGUuX3ByZXBhcmVEYXRhU2hhZG93SW5mbz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YVpvb21Nb2RlbCxlPXQuZ2V0KCJzaG93RGF0YVNoYWRvdyIpO2lmKCExIT09ZSl7dmFyIG4saT10aGlzLmVjTW9kZWw7cmV0dXJuIHQuZWFjaFRhcmdldEF4aXMoKGZ1bmN0aW9uKHIsbyl7RSh0LmdldEF4aXNQcm94eShyLG8pLmdldFRhcmdldFNlcmllc01vZGVscygpLChmdW5jdGlvbih0KXtpZighKG58fCEwIT09ZSYmUChJRix0LmdldCgidHlwZSIpKTwwKSl7dmFyIGEscz1pLmdldENvbXBvbmVudChueihyKSxvKS5heGlzLGw9ZnVuY3Rpb24odCl7dmFyIGU9e3g6InkiLHk6IngiLHJhZGl1czoiYW5nbGUiLGFuZ2xlOiJyYWRpdXMifTtyZXR1cm4gZVt0XX0ociksdT10LmNvb3JkaW5hdGVTeXN0ZW07bnVsbCE9bCYmdS5nZXRPdGhlckF4aXMmJihhPXUuZ2V0T3RoZXJBeGlzKHMpLmludmVyc2UpLGw9dC5nZXREYXRhKCkubWFwRGltZW5zaW9uKGwpLG49e3RoaXNBeGlzOnMsc2VyaWVzOnQsdGhpc0RpbTpyLG90aGVyRGltOmwsb3RoZXJBeGlzSW52ZXJzZTphfX19KSx0aGlzKX0pLHRoaXMpLG59fSxlLnByb3RvdHlwZS5fcmVuZGVySGFuZGxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncm91cCxlPXRoaXMuX2Rpc3BsYXlhYmxlcyxuPWUuaGFuZGxlcz1bbnVsbCxudWxsXSxpPWUuaGFuZGxlTGFiZWxzPVtudWxsLG51bGxdLHI9dGhpcy5fZGlzcGxheWFibGVzLnNsaWRlckdyb3VwLG89dGhpcy5fc2l6ZSxhPXRoaXMuZGF0YVpvb21Nb2RlbCxzPXRoaXMuYXBpLGw9YS5nZXQoImJvcmRlclJhZGl1cyIpfHwwLHU9YS5nZXQoImJydXNoU2VsZWN0IiksaD1lLmZpbGxlcj1uZXcgd0Yoe3NpbGVudDp1LHN0eWxlOntmaWxsOmEuZ2V0KCJmaWxsZXJDb2xvciIpfSx0ZXh0Q29uZmlnOntwb3NpdGlvbjoiaW5zaWRlIn19KTtyLmFkZChoKSxyLmFkZChuZXcgd0Yoe3NpbGVudDohMCxzdWJQaXhlbE9wdGltaXplOiEwLHNoYXBlOnt4OjAseTowLHdpZHRoOm9bMF0saGVpZ2h0Om9bMV0scjpsfSxzdHlsZTp7c3Ryb2tlOmEuZ2V0KCJkYXRhQmFja2dyb3VuZENvbG9yIil8fGEuZ2V0KCJib3JkZXJDb2xvciIpLGxpbmVXaWR0aDoxLGZpbGw6InJnYmEoMCwwLDAsMCkifX0pKSxFKFswLDFdLChmdW5jdGlvbihlKXt2YXIgbz1hLmdldCgiaGFuZGxlSWNvbiIpOyFXeVtvXSYmby5pbmRleE9mKCJwYXRoOi8vIik8MCYmby5pbmRleE9mKCJpbWFnZTovLyIpPDAmJihvPSJwYXRoOi8vIitvKTt2YXIgcz1YeShvLC0xLDAsMiwyLG51bGwsITApO3MuYXR0cih7Y3Vyc29yOkRGKHRoaXMuX29yaWVudCksZHJhZ2dhYmxlOiEwLGRyaWZ0OlcodGhpcy5fb25EcmFnTW92ZSx0aGlzLGUpLG9uZHJhZ2VuZDpXKHRoaXMuX29uRHJhZ0VuZCx0aGlzKSxvbm1vdXNlb3ZlcjpXKHRoaXMuX3Nob3dEYXRhSW5mbyx0aGlzLCEwKSxvbm1vdXNlb3V0OlcodGhpcy5fc2hvd0RhdGFJbmZvLHRoaXMsITEpLHoyOjV9KTt2YXIgbD1zLmdldEJvdW5kaW5nUmVjdCgpLHU9YS5nZXQoImhhbmRsZVNpemUiKTt0aGlzLl9oYW5kbGVIZWlnaHQ9JHIodSx0aGlzLl9zaXplWzFdKSx0aGlzLl9oYW5kbGVXaWR0aD1sLndpZHRoL2wuaGVpZ2h0KnRoaXMuX2hhbmRsZUhlaWdodCxzLnNldFN0eWxlKGEuZ2V0TW9kZWwoImhhbmRsZVN0eWxlIikuZ2V0SXRlbVN0eWxlKCkpLHMuc3R5bGUuc3Ryb2tlTm9TY2FsZT0hMCxzLnJlY3RIb3Zlcj0hMCxzLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPWEuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsImhhbmRsZVN0eWxlIl0pLmdldEl0ZW1TdHlsZSgpLFVsKHMpO3ZhciBoPWEuZ2V0KCJoYW5kbGVDb2xvciIpO251bGwhPWgmJihzLnN0eWxlLmZpbGw9aCksci5hZGQobltlXT1zKTt2YXIgYz1hLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKTt0LmFkZChpW2VdPW5ldyBYcyh7c2lsZW50OiEwLGludmlzaWJsZTohMCxzdHlsZTpvYyhjLHt4OjAseTowLHRleHQ6IiIsdmVydGljYWxBbGlnbjoibWlkZGxlIixhbGlnbjoiY2VudGVyIixmaWxsOmMuZ2V0VGV4dENvbG9yKCksZm9udDpjLmdldEZvbnQoKX0pLHoyOjEwfSkpfSksdGhpcyk7dmFyIGM9aDtpZih1KXt2YXIgcD0kcihhLmdldCgibW92ZUhhbmRsZVNpemUiKSxvWzFdKSxkPWUubW92ZUhhbmRsZT1uZXcgV3Moe3N0eWxlOmEuZ2V0TW9kZWwoIm1vdmVIYW5kbGVTdHlsZSIpLmdldEl0ZW1TdHlsZSgpLHNpbGVudDohMCxzaGFwZTp7cjpbMCwwLDIsMl0seTpvWzFdLS41LGhlaWdodDpwfX0pLGY9LjgqcCxnPWUubW92ZUhhbmRsZUljb249WHkoYS5nZXQoIm1vdmVIYW5kbGVJY29uIiksLWYvMiwtZi8yLGYsZiwiI2ZmZiIsITApO2cuc2lsZW50PSEwLGcueT1vWzFdK3AvMi0uNSxkLmVuc3VyZVN0YXRlKCJlbXBoYXNpcyIpLnN0eWxlPWEuZ2V0TW9kZWwoWyJlbXBoYXNpcyIsIm1vdmVIYW5kbGVTdHlsZSJdKS5nZXRJdGVtU3R5bGUoKTt2YXIgeT1NYXRoLm1pbihvWzFdLzIsTWF0aC5tYXgocCwxMCkpOyhjPWUubW92ZVpvbmU9bmV3IFdzKHtpbnZpc2libGU6ITAsc2hhcGU6e3k6b1sxXS15LGhlaWdodDpwK3l9fSkpLm9uKCJtb3VzZW92ZXIiLChmdW5jdGlvbigpe3MuZW50ZXJFbXBoYXNpcyhkKX0pKS5vbigibW91c2VvdXQiLChmdW5jdGlvbigpe3MubGVhdmVFbXBoYXNpcyhkKX0pKSxyLmFkZChkKSxyLmFkZChnKSxyLmFkZChjKX1jLmF0dHIoe2RyYWdnYWJsZTohMCxjdXJzb3I6REYodGhpcy5fb3JpZW50KSxkcmlmdDpXKHRoaXMuX29uRHJhZ01vdmUsdGhpcywiYWxsIiksb25kcmFnc3RhcnQ6Vyh0aGlzLl9zaG93RGF0YUluZm8sdGhpcywhMCksb25kcmFnZW5kOlcodGhpcy5fb25EcmFnRW5kLHRoaXMpLG9ubW91c2VvdmVyOlcodGhpcy5fc2hvd0RhdGFJbmZvLHRoaXMsITApLG9ubW91c2VvdXQ6Vyh0aGlzLl9zaG93RGF0YUluZm8sdGhpcywhMSl9KX0sZS5wcm90b3R5cGUuX3Jlc2V0SW50ZXJ2YWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yYW5nZT10aGlzLmRhdGFab29tTW9kZWwuZ2V0UGVyY2VudFJhbmdlKCksZT10aGlzLl9nZXRWaWV3RXh0ZW50KCk7dGhpcy5faGFuZGxlRW5kcz1bS3IodFswXSxbMCwxMDBdLGUsITApLEtyKHRbMV0sWzAsMTAwXSxlLCEwKV19LGUucHJvdG90eXBlLl91cGRhdGVJbnRlcnZhbD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZGF0YVpvb21Nb2RlbCxpPXRoaXMuX2hhbmRsZUVuZHMscj10aGlzLl9nZXRWaWV3RXh0ZW50KCksbz1uLmZpbmRSZXByZXNlbnRhdGl2ZUF4aXNQcm94eSgpLmdldE1pbk1heFNwYW4oKSxhPVswLDEwMF07emsoZSxpLHIsbi5nZXQoInpvb21Mb2NrIik/ImFsbCI6dCxudWxsIT1vLm1pblNwYW4/S3Ioby5taW5TcGFuLGEsciwhMCk6bnVsbCxudWxsIT1vLm1heFNwYW4/S3Ioby5tYXhTcGFuLGEsciwhMCk6bnVsbCk7dmFyIHM9dGhpcy5fcmFuZ2UsbD10aGlzLl9yYW5nZT1RcihbS3IoaVswXSxyLGEsITApLEtyKGlbMV0scixhLCEwKV0pO3JldHVybiFzfHxzWzBdIT09bFswXXx8c1sxXSE9PWxbMV19LGUucHJvdG90eXBlLl91cGRhdGVWaWV3PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2Rpc3BsYXlhYmxlcyxuPXRoaXMuX2hhbmRsZUVuZHMsaT1RcihuLnNsaWNlKCkpLHI9dGhpcy5fc2l6ZTtFKFswLDFdLChmdW5jdGlvbih0KXt2YXIgaT1lLmhhbmRsZXNbdF0sbz10aGlzLl9oYW5kbGVIZWlnaHQ7aS5hdHRyKHtzY2FsZVg6by8yLHNjYWxlWTpvLzIseDpuW3RdKyh0Py0xOjEpLHk6clsxXS8yLW8vMn0pfSksdGhpcyksZS5maWxsZXIuc2V0U2hhcGUoe3g6aVswXSx5OjAsd2lkdGg6aVsxXS1pWzBdLGhlaWdodDpyWzFdfSk7dmFyIG89e3g6aVswXSx3aWR0aDppWzFdLWlbMF19O2UubW92ZUhhbmRsZSYmKGUubW92ZUhhbmRsZS5zZXRTaGFwZShvKSxlLm1vdmVab25lLnNldFNoYXBlKG8pLGUubW92ZVpvbmUuZ2V0Qm91bmRpbmdSZWN0KCksZS5tb3ZlSGFuZGxlSWNvbiYmZS5tb3ZlSGFuZGxlSWNvbi5hdHRyKCJ4IixvLngrby53aWR0aC8yKSk7Zm9yKHZhciBhPWUuZGF0YVNoYWRvd1NlZ3Mscz1bMCxpWzBdLGlbMV0sclswXV0sbD0wO2w8YS5sZW5ndGg7bCsrKXt2YXIgdT1hW2xdLGg9dS5nZXRDbGlwUGF0aCgpO2h8fChoPW5ldyBXcyx1LnNldENsaXBQYXRoKGgpKSxoLnNldFNoYXBlKHt4OnNbbF0seTowLHdpZHRoOnNbbCsxXS1zW2xdLGhlaWdodDpyWzFdfSl9dGhpcy5fdXBkYXRlRGF0YUluZm8odCl9LGUucHJvdG90eXBlLl91cGRhdGVEYXRhSW5mbz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGFab29tTW9kZWwsbj10aGlzLl9kaXNwbGF5YWJsZXMsaT1uLmhhbmRsZUxhYmVscyxyPXRoaXMuX29yaWVudCxvPVsiIiwiIl07aWYoZS5nZXQoInNob3dEZXRhaWwiKSl7dmFyIGE9ZS5maW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHkoKTtpZihhKXt2YXIgcz1hLmdldEF4aXNNb2RlbCgpLmF4aXMsbD10aGlzLl9yYW5nZSx1PXQ/YS5jYWxjdWxhdGVEYXRhV2luZG93KHtzdGFydDpsWzBdLGVuZDpsWzFdfSkudmFsdWVXaW5kb3c6YS5nZXREYXRhVmFsdWVXaW5kb3coKTtvPVt0aGlzLl9mb3JtYXRMYWJlbCh1WzBdLHMpLHRoaXMuX2Zvcm1hdExhYmVsKHVbMV0scyldfX12YXIgaD1Rcih0aGlzLl9oYW5kbGVFbmRzLnNsaWNlKCkpO2Z1bmN0aW9uIGModCl7dmFyIGU9Qmgobi5oYW5kbGVzW3RdLnBhcmVudCx0aGlzLmdyb3VwKSxhPUdoKDA9PT10PyJyaWdodCI6ImxlZnQiLGUpLHM9dGhpcy5faGFuZGxlV2lkdGgvMis1LGw9RmgoW2hbdF0rKDA9PT10Py1zOnMpLHRoaXMuX3NpemVbMV0vMl0sZSk7aVt0XS5zZXRTdHlsZSh7eDpsWzBdLHk6bFsxXSx2ZXJ0aWNhbEFsaWduOnI9PT1TRj8ibWlkZGxlIjphLGFsaWduOnI9PT1TRj9hOiJjZW50ZXIiLHRleHQ6b1t0XX0pfWMuY2FsbCh0aGlzLDApLGMuY2FsbCh0aGlzLDEpfSxlLnByb3RvdHlwZS5fZm9ybWF0TGFiZWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmRhdGFab29tTW9kZWwsaT1uLmdldCgibGFiZWxGb3JtYXR0ZXIiKSxyPW4uZ2V0KCJsYWJlbFByZWNpc2lvbiIpO251bGwhPXImJiJhdXRvIiE9PXJ8fChyPWUuZ2V0UGl4ZWxQcmVjaXNpb24oKSk7dmFyIG89bnVsbD09dHx8aXNOYU4odCk/IiI6ImNhdGVnb3J5Ij09PWUudHlwZXx8InRpbWUiPT09ZS50eXBlP2Uuc2NhbGUuZ2V0TGFiZWwoe3ZhbHVlOk1hdGgucm91bmQodCl9KTp0LnRvRml4ZWQoTWF0aC5taW4ociwyMCkpO3JldHVybiBYKGkpP2kodCxvKTpVKGkpP2kucmVwbGFjZSgie3ZhbHVlfSIsbyk6b30sZS5wcm90b3R5cGUuX3Nob3dEYXRhSW5mbz1mdW5jdGlvbih0KXt0PXRoaXMuX2RyYWdnaW5nfHx0O3ZhciBlPXRoaXMuX2Rpc3BsYXlhYmxlcyxuPWUuaGFuZGxlTGFiZWxzO25bMF0uYXR0cigiaW52aXNpYmxlIiwhdCksblsxXS5hdHRyKCJpbnZpc2libGUiLCF0KSxlLm1vdmVIYW5kbGUmJnRoaXMuYXBpW3Q/ImVudGVyRW1waGFzaXMiOiJsZWF2ZUVtcGhhc2lzIl0oZS5tb3ZlSGFuZGxlLDEpfSxlLnByb3RvdHlwZS5fb25EcmFnTW92ZT1mdW5jdGlvbih0LGUsbixpKXt0aGlzLl9kcmFnZ2luZz0hMCxkZShpLmV2ZW50KTt2YXIgcj1GaChbZSxuXSx0aGlzLl9kaXNwbGF5YWJsZXMuc2xpZGVyR3JvdXAuZ2V0TG9jYWxUcmFuc2Zvcm0oKSwhMCksbz10aGlzLl91cGRhdGVJbnRlcnZhbCh0LHJbMF0pLGE9dGhpcy5kYXRhWm9vbU1vZGVsLmdldCgicmVhbHRpbWUiKTt0aGlzLl91cGRhdGVWaWV3KCFhKSxvJiZhJiZ0aGlzLl9kaXNwYXRjaFpvb21BY3Rpb24oITApfSxlLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fc2hvd0RhdGFJbmZvKCExKSwhdGhpcy5kYXRhWm9vbU1vZGVsLmdldCgicmVhbHRpbWUiKSYmdGhpcy5fZGlzcGF0Y2hab29tQWN0aW9uKCExKX0sZS5wcm90b3R5cGUuX29uQ2xpY2tQYW5lbD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zaXplLG49dGhpcy5fZGlzcGxheWFibGVzLnNsaWRlckdyb3VwLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0Lm9mZnNldFgsdC5vZmZzZXRZKTtpZighKG5bMF08MHx8blswXT5lWzBdfHxuWzFdPDB8fG5bMV0+ZVsxXSkpe3ZhciBpPXRoaXMuX2hhbmRsZUVuZHMscj0oaVswXStpWzFdKS8yLG89dGhpcy5fdXBkYXRlSW50ZXJ2YWwoImFsbCIsblswXS1yKTt0aGlzLl91cGRhdGVWaWV3KCksbyYmdGhpcy5fZGlzcGF0Y2hab29tQWN0aW9uKCExKX19LGUucHJvdG90eXBlLl9vbkJydXNoU3RhcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5vZmZzZXRYLG49dC5vZmZzZXRZO3RoaXMuX2JydXNoU3RhcnQ9bmV3IERlKGUsbiksdGhpcy5fYnJ1c2hpbmc9ITAsdGhpcy5fYnJ1c2hTdGFydFRpbWU9K25ldyBEYXRlfSxlLnByb3RvdHlwZS5fb25CcnVzaEVuZD1mdW5jdGlvbih0KXtpZih0aGlzLl9icnVzaGluZyl7dmFyIGU9dGhpcy5fZGlzcGxheWFibGVzLmJydXNoUmVjdDtpZih0aGlzLl9icnVzaGluZz0hMSxlKXtlLmF0dHIoImlnbm9yZSIsITApO3ZhciBuPWUuc2hhcGU7aWYoISgrbmV3IERhdGUtdGhpcy5fYnJ1c2hTdGFydFRpbWU8MjAwJiZNYXRoLmFicyhuLndpZHRoKTw1KSl7dmFyIGk9dGhpcy5fZ2V0Vmlld0V4dGVudCgpLHI9WzAsMTAwXTt0aGlzLl9yYW5nZT1RcihbS3Iobi54LGksciwhMCksS3Iobi54K24ud2lkdGgsaSxyLCEwKV0pLHRoaXMuX2hhbmRsZUVuZHM9W24ueCxuLngrbi53aWR0aF0sdGhpcy5fdXBkYXRlVmlldygpLHRoaXMuX2Rpc3BhdGNoWm9vbUFjdGlvbighMSl9fX19LGUucHJvdG90eXBlLl9vbkJydXNoPWZ1bmN0aW9uKHQpe3RoaXMuX2JydXNoaW5nJiYoZGUodC5ldmVudCksdGhpcy5fdXBkYXRlQnJ1c2hSZWN0KHQub2Zmc2V0WCx0Lm9mZnNldFkpKX0sZS5wcm90b3R5cGUuX3VwZGF0ZUJydXNoUmVjdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2Rpc3BsYXlhYmxlcyxpPXRoaXMuZGF0YVpvb21Nb2RlbCxyPW4uYnJ1c2hSZWN0O3J8fChyPW4uYnJ1c2hSZWN0PW5ldyB3Rih7c2lsZW50OiEwLHN0eWxlOmkuZ2V0TW9kZWwoImJydXNoU3R5bGUiKS5nZXRJdGVtU3R5bGUoKX0pLG4uc2xpZGVyR3JvdXAuYWRkKHIpKSxyLmF0dHIoImlnbm9yZSIsITEpO3ZhciBvPXRoaXMuX2JydXNoU3RhcnQsYT10aGlzLl9kaXNwbGF5YWJsZXMuc2xpZGVyR3JvdXAscz1hLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0LGUpLGw9YS50cmFuc2Zvcm1Db29yZFRvTG9jYWwoby54LG8ueSksdT10aGlzLl9zaXplO3NbMF09TWF0aC5tYXgoTWF0aC5taW4odVswXSxzWzBdKSwwKSxyLnNldFNoYXBlKHt4OmxbMF0seTowLHdpZHRoOnNbMF0tbFswXSxoZWlnaHQ6dVsxXX0pfSxlLnByb3RvdHlwZS5fZGlzcGF0Y2hab29tQWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JhbmdlO3RoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJkYXRhWm9vbSIsZnJvbTp0aGlzLnVpZCxkYXRhWm9vbUlkOnRoaXMuZGF0YVpvb21Nb2RlbC5pZCxhbmltYXRpb246dD9URjpudWxsLHN0YXJ0OmVbMF0sZW5kOmVbMV19KX0sZS5wcm90b3R5cGUuX2ZpbmRDb29yZFJlY3Q9ZnVuY3Rpb24oKXt2YXIgdCxlPXJ6KHRoaXMuZGF0YVpvb21Nb2RlbCkuaW5mb0xpc3Q7aWYoIXQmJmUubGVuZ3RoKXt2YXIgbj1lWzBdLm1vZGVsLmNvb3JkaW5hdGVTeXN0ZW07dD1uLmdldFJlY3QmJm4uZ2V0UmVjdCgpfWlmKCF0KXt2YXIgaT10aGlzLmFwaS5nZXRXaWR0aCgpLHI9dGhpcy5hcGkuZ2V0SGVpZ2h0KCk7dD17eDouMippLHk6LjIqcix3aWR0aDouNippLGhlaWdodDouNipyfX1yZXR1cm4gdH0sZS50eXBlPSJkYXRhWm9vbS5zbGlkZXIiLGV9KHV6KTtmdW5jdGlvbiBERih0KXtyZXR1cm4idmVydGljYWwiPT09dD8ibnMtcmVzaXplIjoiZXctcmVzaXplIn1mdW5jdGlvbiBBRih0KXt0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoYkYpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KENGKSx5eih0KX12YXIga0Y9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPVQoKExGW3RdfHx7fSlbZV0pO3JldHVybiBuJiZZKGkpP2lbaS5sZW5ndGgtMV06aX0sTEY9e2NvbG9yOnthY3RpdmU6WyIjMDA2ZWRkIiwiI2UwZmZmZiJdLGluYWN0aXZlOlsicmdiYSgwLDAsMCwwKSJdfSxjb2xvckh1ZTp7YWN0aXZlOlswLDM2MF0saW5hY3RpdmU6WzAsMF19LGNvbG9yU2F0dXJhdGlvbjp7YWN0aXZlOlsuMywxXSxpbmFjdGl2ZTpbMCwwXX0sY29sb3JMaWdodG5lc3M6e2FjdGl2ZTpbLjksLjVdLGluYWN0aXZlOlswLDBdfSxjb2xvckFscGhhOnthY3RpdmU6Wy4zLDFdLGluYWN0aXZlOlswLDBdfSxvcGFjaXR5OnthY3RpdmU6Wy4zLDFdLGluYWN0aXZlOlswLDBdfSxzeW1ib2w6e2FjdGl2ZTpbImNpcmNsZSIsInJvdW5kUmVjdCIsImRpYW1vbmQiXSxpbmFjdGl2ZTpbIm5vbmUiXX0sc3ltYm9sU2l6ZTp7YWN0aXZlOlsxMCw1MF0saW5hY3RpdmU6WzAsMF19fSxQRj1rRC5tYXBWaXN1YWwsT0Y9a0QuZWFjaFZpc3VhbCxSRj1ZLE5GPUUsRUY9UXIsekY9S3IsVkY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLnN0YXRlTGlzdD1bImluUmFuZ2UiLCJvdXRPZlJhbmdlIl0sbi5yZXBsYWNhYmxlT3B0aW9uS2V5cz1bImluUmFuZ2UiLCJvdXRPZlJhbmdlIiwidGFyZ2V0IiwiY29udHJvbGxlciIsImNvbG9yIl0sbi5sYXlvdXRNb2RlPXt0eXBlOiJib3giLGlnbm9yZVNpemU6ITB9LG4uZGF0YUJvdW5kPVstMS8wLDEvMF0sbi50YXJnZXRWaXN1YWxzPXt9LG4uY29udHJvbGxlclZpc3VhbHM9e30sbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMubWVyZ2VEZWZhdWx0QW5kVGhlbWUodCxuKX0sZS5wcm90b3R5cGUub3B0aW9uVXBkYXRlZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9uOyFlJiZQVihuLHQsdGhpcy5yZXBsYWNhYmxlT3B0aW9uS2V5cyksdGhpcy50ZXh0U3R5bGVNb2RlbD10aGlzLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKSx0aGlzLnJlc2V0SXRlbVNpemUoKSx0aGlzLmNvbXBsZXRlVmlzdWFsT3B0aW9uKCl9LGUucHJvdG90eXBlLnJlc2V0VmlzdWFsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RhdGVMaXN0O3Q9Vyh0LHRoaXMpLHRoaXMuY29udHJvbGxlclZpc3VhbHM9TFYodGhpcy5vcHRpb24uY29udHJvbGxlcixlLHQpLHRoaXMudGFyZ2V0VmlzdWFscz1MVih0aGlzLm9wdGlvbi50YXJnZXQsZSx0KX0sZS5wcm90b3R5cGUuZ2V0SXRlbVN5bWJvbD1mdW5jdGlvbigpe3JldHVybiBudWxsfSxlLnByb3RvdHlwZS5nZXRUYXJnZXRTZXJpZXNJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb24uc2VyaWVzSW5kZXgsZT1bXTtyZXR1cm4gbnVsbD09dHx8ImFsbCI9PT10P3RoaXMuZWNNb2RlbC5lYWNoU2VyaWVzKChmdW5jdGlvbih0LG4pe2UucHVzaChuKX0pKTplPVRvKHQpLGV9LGUucHJvdG90eXBlLmVhY2hUYXJnZXRTZXJpZXM9ZnVuY3Rpb24odCxlKXtFKHRoaXMuZ2V0VGFyZ2V0U2VyaWVzSW5kaWNlcygpLChmdW5jdGlvbihuKXt2YXIgaT10aGlzLmVjTW9kZWwuZ2V0U2VyaWVzQnlJbmRleChuKTtpJiZ0LmNhbGwoZSxpKX0pLHRoaXMpfSxlLnByb3RvdHlwZS5pc1RhcmdldFNlcmllcz1mdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4gdGhpcy5lYWNoVGFyZ2V0U2VyaWVzKChmdW5jdGlvbihuKXtuPT09dCYmKGU9ITApfSkpLGV9LGUucHJvdG90eXBlLmZvcm1hdFZhbHVlVGV4dD1mdW5jdGlvbih0LGUsbil7dmFyIGkscj10aGlzLm9wdGlvbixvPXIucHJlY2lzaW9uLGE9dGhpcy5kYXRhQm91bmQscz1yLmZvcm1hdHRlcjtuPW58fFsiPCIsIj4iXSxZKHQpJiYodD10LnNsaWNlKCksaT0hMCk7dmFyIGw9ZT90Omk/W3UodFswXSksdSh0WzFdKV06dSh0KTtyZXR1cm4gVShzKT9zLnJlcGxhY2UoInt2YWx1ZX0iLGk/bFswXTpsKS5yZXBsYWNlKCJ7dmFsdWUyfSIsaT9sWzFdOmwpOlgocyk/aT9zKHRbMF0sdFsxXSk6cyh0KTppP3RbMF09PT1hWzBdP25bMF0rIiAiK2xbMV06dFsxXT09PWFbMV0/blsxXSsiICIrbFswXTpsWzBdKyIgLSAiK2xbMV06bDtmdW5jdGlvbiB1KHQpe3JldHVybiB0PT09YVswXT8ibWluIjp0PT09YVsxXT8ibWF4IjooK3QpLnRvRml4ZWQoTWF0aC5taW4obywyMCkpfX0sZS5wcm90b3R5cGUucmVzZXRFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbixlPUVGKFt0Lm1pbix0Lm1heF0pO3RoaXMuX2RhdGFFeHRlbnQ9ZX0sZS5wcm90b3R5cGUuZ2V0RGF0YURpbWVuc2lvbkluZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLmRpbWVuc2lvbjtpZihudWxsIT1lKXJldHVybiB0LmdldERpbWVuc2lvbkluZGV4KGUpO2Zvcih2YXIgbj10LmRpbWVuc2lvbnMsaT1uLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgcj1uW2ldLG89dC5nZXREaW1lbnNpb25JbmZvKHIpO2lmKCFvLmlzQ2FsY3VsYXRpb25Db29yZClyZXR1cm4gby5zdG9yZURpbUluZGV4fX0sZS5wcm90b3R5cGUuZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFFeHRlbnQuc2xpY2UoKX0sZS5wcm90b3R5cGUuY29tcGxldGVWaXN1YWxPcHRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVjTW9kZWwsZT10aGlzLm9wdGlvbixuPXtpblJhbmdlOmUuaW5SYW5nZSxvdXRPZlJhbmdlOmUub3V0T2ZSYW5nZX0saT1lLnRhcmdldHx8KGUudGFyZ2V0PXt9KSxyPWUuY29udHJvbGxlcnx8KGUuY29udHJvbGxlcj17fSk7QyhpLG4pLEMocixuKTt2YXIgbz10aGlzLmlzQ2F0ZWdvcnkoKTtmdW5jdGlvbiBhKG4pe1JGKGUuY29sb3IpJiYhbi5pblJhbmdlJiYobi5pblJhbmdlPXtjb2xvcjplLmNvbG9yLnNsaWNlKCkucmV2ZXJzZSgpfSksbi5pblJhbmdlPW4uaW5SYW5nZXx8e2NvbG9yOnQuZ2V0KCJncmFkaWVudENvbG9yIil9fWEuY2FsbCh0aGlzLGkpLGEuY2FsbCh0aGlzLHIpLGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10W2VdLHI9dFtuXTtpJiYhciYmKHI9dFtuXT17fSxORihpLChmdW5jdGlvbih0LGUpe2lmKGtELmlzVmFsaWRUeXBlKGUpKXt2YXIgbj1rRihlLCJpbmFjdGl2ZSIsbyk7bnVsbCE9biYmKHJbZV09biwiY29sb3IiIT09ZXx8ci5oYXNPd25Qcm9wZXJ0eSgib3BhY2l0eSIpfHxyLmhhc093blByb3BlcnR5KCJjb2xvckFscGhhIil8fChyLm9wYWNpdHk9WzAsMF0pKX19KSkpfS5jYWxsKHRoaXMsaSwiaW5SYW5nZSIsIm91dE9mUmFuZ2UiKSxmdW5jdGlvbih0KXt2YXIgZT0odC5pblJhbmdlfHx7fSkuc3ltYm9sfHwodC5vdXRPZlJhbmdlfHx7fSkuc3ltYm9sLG49KHQuaW5SYW5nZXx8e30pLnN5bWJvbFNpemV8fCh0Lm91dE9mUmFuZ2V8fHt9KS5zeW1ib2xTaXplLGk9dGhpcy5nZXQoImluYWN0aXZlQ29sb3IiKSxyPXRoaXMuZ2V0SXRlbVN5bWJvbCgpfHwicm91bmRSZWN0IjtORih0aGlzLnN0YXRlTGlzdCwoZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5pdGVtU2l6ZSxsPXRbYV07bHx8KGw9dFthXT17Y29sb3I6bz9pOltpXX0pLG51bGw9PWwuc3ltYm9sJiYobC5zeW1ib2w9ZSYmVChlKXx8KG8/cjpbcl0pKSxudWxsPT1sLnN5bWJvbFNpemUmJihsLnN5bWJvbFNpemU9biYmVChuKXx8KG8/c1swXTpbc1swXSxzWzBdXSkpLGwuc3ltYm9sPVBGKGwuc3ltYm9sLChmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P3I6dH0pKTt2YXIgdT1sLnN5bWJvbFNpemU7aWYobnVsbCE9dSl7dmFyIGg9LTEvMDtPRih1LChmdW5jdGlvbih0KXt0PmgmJihoPXQpfSkpLGwuc3ltYm9sU2l6ZT1QRih1LChmdW5jdGlvbih0KXtyZXR1cm4gekYodCxbMCxoXSxbMCxzWzBdXSwhMCl9KSl9fSksdGhpcyl9LmNhbGwodGhpcyxyKX0sZS5wcm90b3R5cGUucmVzZXRJdGVtU2l6ZT1mdW5jdGlvbigpe3RoaXMuaXRlbVNpemU9W3BhcnNlRmxvYXQodGhpcy5nZXQoIml0ZW1XaWR0aCIpKSxwYXJzZUZsb2F0KHRoaXMuZ2V0KCJpdGVtSGVpZ2h0IikpXX0sZS5wcm90b3R5cGUuaXNDYXRlZ29yeT1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5vcHRpb24uY2F0ZWdvcmllc30sZS5wcm90b3R5cGUuc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5nZXRTZWxlY3RlZD1mdW5jdGlvbigpe3JldHVybiBudWxsfSxlLnByb3RvdHlwZS5nZXRWYWx1ZVN0YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSxlLnByb3RvdHlwZS5nZXRWaXN1YWxNZXRhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSxlLnR5cGU9InZpc3VhbE1hcCIsZS5kZXBlbmRlbmNpZXM9WyJzZXJpZXMiXSxlLmRlZmF1bHRPcHRpb249e3Nob3c6ITAsejo0LHNlcmllc0luZGV4OiJhbGwiLG1pbjowLG1heDoyMDAsbGVmdDowLHJpZ2h0Om51bGwsdG9wOm51bGwsYm90dG9tOjAsaXRlbVdpZHRoOm51bGwsaXRlbUhlaWdodDpudWxsLGludmVyc2U6ITEsb3JpZW50OiJ2ZXJ0aWNhbCIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJDb2xvcjoiI2NjYyIsY29udGVudENvbG9yOiIjNTc5M2YzIixpbmFjdGl2ZUNvbG9yOiIjYWFhIixib3JkZXJXaWR0aDowLHBhZGRpbmc6NSx0ZXh0R2FwOjEwLHByZWNpc2lvbjowLHRleHRTdHlsZTp7Y29sb3I6IiMzMzMifX0sZX0oenApLEJGPVsyMCwxNDBdLEZGPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLm9wdGlvblVwZGF0ZWQ9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5vcHRpb25VcGRhdGVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc2V0RXh0ZW50KCksdGhpcy5yZXNldFZpc3VhbCgoZnVuY3Rpb24odCl7dC5tYXBwaW5nTWV0aG9kPSJsaW5lYXIiLHQuZGF0YUV4dGVudD10aGlzLmdldEV4dGVudCgpfSkpLHRoaXMuX3Jlc2V0UmFuZ2UoKX0sZS5wcm90b3R5cGUucmVzZXRJdGVtU2l6ZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlc2V0SXRlbVNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPXRoaXMuaXRlbVNpemU7KG51bGw9PWVbMF18fGlzTmFOKGVbMF0pKSYmKGVbMF09QkZbMF0pLChudWxsPT1lWzFdfHxpc05hTihlWzFdKSkmJihlWzFdPUJGWzFdKX0sZS5wcm90b3R5cGUuX3Jlc2V0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEV4dGVudCgpLGU9dGhpcy5vcHRpb24ucmFuZ2U7IWV8fGUuYXV0bz8odC5hdXRvPTEsdGhpcy5vcHRpb24ucmFuZ2U9dCk6WShlKSYmKGVbMF0+ZVsxXSYmZS5yZXZlcnNlKCksZVswXT1NYXRoLm1heChlWzBdLHRbMF0pLGVbMV09TWF0aC5taW4oZVsxXSx0WzFdKSl9LGUucHJvdG90eXBlLmNvbXBsZXRlVmlzdWFsT3B0aW9uPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuY29tcGxldGVWaXN1YWxPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpLEUodGhpcy5zdGF0ZUxpc3QsKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLmNvbnRyb2xsZXJbdF0uc3ltYm9sU2l6ZTtlJiZlWzBdIT09ZVsxXSYmKGVbMF09ZVsxXS8zKX0pLHRoaXMpfSxlLnByb3RvdHlwZS5zZXRTZWxlY3RlZD1mdW5jdGlvbih0KXt0aGlzLm9wdGlvbi5yYW5nZT10LnNsaWNlKCksdGhpcy5fcmVzZXRSYW5nZSgpfSxlLnByb3RvdHlwZS5nZXRTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0RXh0ZW50KCksZT1RcigodGhpcy5nZXQoInJhbmdlIil8fFtdKS5zbGljZSgpKTtyZXR1cm4gZVswXT50WzFdJiYoZVswXT10WzFdKSxlWzFdPnRbMV0mJihlWzFdPXRbMV0pLGVbMF08dFswXSYmKGVbMF09dFswXSksZVsxXTx0WzBdJiYoZVsxXT10WzBdKSxlfSxlLnByb3RvdHlwZS5nZXRWYWx1ZVN0YXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnJhbmdlLG49dGhpcy5nZXRFeHRlbnQoKTtyZXR1cm4oZVswXTw9blswXXx8ZVswXTw9dCkmJihlWzFdPj1uWzFdfHx0PD1lWzFdKT8iaW5SYW5nZSI6Im91dE9mUmFuZ2UifSxlLnByb3RvdHlwZS5maW5kVGFyZ2V0RGF0YUluZGljZXM9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHRoaXMuZWFjaFRhcmdldFNlcmllcygoZnVuY3Rpb24obil7dmFyIGk9W10scj1uLmdldERhdGEoKTtyLmVhY2godGhpcy5nZXREYXRhRGltZW5zaW9uSW5kZXgociksKGZ1bmN0aW9uKGUsbil7dFswXTw9ZSYmZTw9dFsxXSYmaS5wdXNoKG4pfSksdGhpcyksZS5wdXNoKHtzZXJpZXNJZDpuLmlkLGRhdGFJbmRleDppfSl9KSx0aGlzKSxlfSxlLnByb3RvdHlwZS5nZXRWaXN1YWxNZXRhPWZ1bmN0aW9uKHQpe3ZhciBlPUdGKHRoaXMsIm91dE9mUmFuZ2UiLHRoaXMuZ2V0RXh0ZW50KCkpLG49R0YodGhpcywiaW5SYW5nZSIsdGhpcy5vcHRpb24ucmFuZ2Uuc2xpY2UoKSksaT1bXTtmdW5jdGlvbiByKGUsbil7aS5wdXNoKHt2YWx1ZTplLGNvbG9yOnQoZSxuKX0pfWZvcih2YXIgbz0wLGE9MCxzPW4ubGVuZ3RoLGw9ZS5sZW5ndGg7YTxsJiYoIW4ubGVuZ3RofHxlW2FdPD1uWzBdKTthKyspZVthXTxuW29dJiZyKGVbYV0sIm91dE9mUmFuZ2UiKTtmb3IodmFyIHU9MTtvPHM7bysrLHU9MCl1JiZpLmxlbmd0aCYmcihuW29dLCJvdXRPZlJhbmdlIikscihuW29dLCJpblJhbmdlIik7Zm9yKHU9MTthPGw7YSsrKSghbi5sZW5ndGh8fG5bbi5sZW5ndGgtMV08ZVthXSkmJih1JiYoaS5sZW5ndGgmJnIoaVtpLmxlbmd0aC0xXS52YWx1ZSwib3V0T2ZSYW5nZSIpLHU9MCkscihlW2FdLCJvdXRPZlJhbmdlIikpO3ZhciBoPWkubGVuZ3RoO3JldHVybntzdG9wczppLG91dGVyQ29sb3JzOltoP2lbMF0uY29sb3I6InRyYW5zcGFyZW50IixoP2lbaC0xXS5jb2xvcjoidHJhbnNwYXJlbnQiXX19LGUudHlwZT0idmlzdWFsTWFwLmNvbnRpbnVvdXMiLGUuZGVmYXVsdE9wdGlvbj1rYyhWRi5kZWZhdWx0T3B0aW9uLHthbGlnbjoiYXV0byIsY2FsY3VsYWJsZTohMSxob3Zlckxpbms6ITAscmVhbHRpbWU6ITAsaGFuZGxlSWNvbjoicGF0aDovL00tMTEuMzksOS43N2gwYTMuNSwzLjUsMCwwLDEtMy41LDMuNWgtMjJhMy41LDMuNSwwLDAsMS0zLjUtMy41aDBhMy41LDMuNSwwLDAsMSwzLjUtMy41aDIyQTMuNSwzLjUsMCwwLDEtMTEuMzksOS43N1oiLGhhbmRsZVNpemU6IjEyMCUiLGhhbmRsZVN0eWxlOntib3JkZXJDb2xvcjoiI2ZmZiIsYm9yZGVyV2lkdGg6MX0saW5kaWNhdG9ySWNvbjoiY2lyY2xlIixpbmRpY2F0b3JTaXplOiI1MCUiLGluZGljYXRvclN0eWxlOntib3JkZXJDb2xvcjoiI2ZmZiIsYm9yZGVyV2lkdGg6MixzaGFkb3dCbHVyOjIsc2hhZG93T2Zmc2V0WDoxLHNoYWRvd09mZnNldFk6MSxzaGFkb3dDb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19KSxlfShWRik7ZnVuY3Rpb24gR0YodCxlLG4pe2lmKG5bMF09PT1uWzFdKXJldHVybiBuLnNsaWNlKCk7Zm9yKHZhciBpPShuWzFdLW5bMF0pLzIwMCxyPW5bMF0sbz1bXSxhPTA7YTw9MjAwJiZyPG5bMV07YSsrKW8ucHVzaChyKSxyKz1pO3JldHVybiBvLnB1c2goblsxXSksb312YXIgV0Y9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLmF1dG9Qb3NpdGlvblZhbHVlcz17bGVmdDoxLHJpZ2h0OjEsdG9wOjEsYm90dG9tOjF9LG59cmV0dXJuIG4oZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSl7dGhpcy5lY01vZGVsPXQsdGhpcy5hcGk9ZX0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMudmlzdWFsTWFwTW9kZWw9dCwhMSE9PXQuZ2V0KCJzaG93Iik/dGhpcy5kb1JlbmRlcih0LGUsbixpKTp0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxlLnByb3RvdHlwZS5yZW5kZXJCYWNrZ3JvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWwsbj12cChlLmdldCgicGFkZGluZyIpfHwwKSxpPXQuZ2V0Qm91bmRpbmdSZWN0KCk7dC5hZGQobmV3IFdzKHt6MjotMSxzaWxlbnQ6ITAsc2hhcGU6e3g6aS54LW5bM10seTppLnktblswXSx3aWR0aDppLndpZHRoK25bM10rblsxXSxoZWlnaHQ6aS5oZWlnaHQrblswXStuWzJdfSxzdHlsZTp7ZmlsbDplLmdldCgiYmFja2dyb3VuZENvbG9yIiksc3Ryb2tlOmUuZ2V0KCJib3JkZXJDb2xvciIpLGxpbmVXaWR0aDplLmdldCgiYm9yZGVyV2lkdGgiKX19KSl9LGUucHJvdG90eXBlLmdldENvbnRyb2xsZXJWaXN1YWw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPShuPW58fHt9KS5mb3JjZVN0YXRlLHI9dGhpcy52aXN1YWxNYXBNb2RlbCxvPXt9O2lmKCJjb2xvciI9PT1lKXt2YXIgYT1yLmdldCgiY29udGVudENvbG9yIik7by5jb2xvcj1hfWZ1bmN0aW9uIHModCl7cmV0dXJuIG9bdF19ZnVuY3Rpb24gbCh0LGUpe29bdF09ZX12YXIgdT1yLmNvbnRyb2xsZXJWaXN1YWxzW2l8fHIuZ2V0VmFsdWVTdGF0ZSh0KV07cmV0dXJuIEUoa0QucHJlcGFyZVZpc3VhbFR5cGVzKHUpLChmdW5jdGlvbihpKXt2YXIgcj11W2ldO24uY29udmVydE9wYWNpdHlUb0FscGhhJiYib3BhY2l0eSI9PT1pJiYoaT0iY29sb3JBbHBoYSIscj11Ll9fYWxwaGFGb3JPcGFjaXR5KSxrRC5kZXBlbmRzT24oaSxlKSYmciYmci5hcHBseVZpc3VhbCh0LHMsbCl9KSksb1tlXX0sZS5wcm90b3R5cGUucG9zaXRpb25Hcm91cD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpc3VhbE1hcE1vZGVsLG49dGhpcy5hcGk7THAodCxlLmdldEJveExheW91dFBhcmFtcygpLHt3aWR0aDpuLmdldFdpZHRoKCksaGVpZ2h0Om4uZ2V0SGVpZ2h0KCl9KX0sZS5wcm90b3R5cGUuZG9SZW5kZXI9ZnVuY3Rpb24odCxlLG4saSl7fSxlLnR5cGU9InZpc3VhbE1hcCIsZX0oQWcpLEhGPVtbImxlZnQiLCJyaWdodCIsIndpZHRoIl0sWyJ0b3AiLCJib3R0b20iLCJoZWlnaHQiXV07ZnVuY3Rpb24gWUYodCxlLG4pe3ZhciBpPXQub3B0aW9uLHI9aS5hbGlnbjtpZihudWxsIT1yJiYiYXV0byIhPT1yKXJldHVybiByO2Zvcih2YXIgbz17d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSxhPSJob3Jpem9udGFsIj09PWkub3JpZW50PzE6MCxzPUhGW2FdLGw9WzAsbnVsbCwxMF0sdT17fSxoPTA7aDwzO2grKyl1W0hGWzEtYV1baF1dPWxbaF0sdVtzW2hdXT0yPT09aD9uWzBdOmlbc1toXV07dmFyIGM9W1sieCIsIndpZHRoIiwzXSxbInkiLCJoZWlnaHQiLDBdXVthXSxwPWtwKHUsbyxpLnBhZGRpbmcpO3JldHVybiBzWyhwLm1hcmdpbltjWzJdXXx8MCkrcFtjWzBdXSsuNSpwW2NbMV1dPC41Km9bY1sxXV0/MDoxXX1mdW5jdGlvbiBYRih0LGUpe3JldHVybiBFKHR8fFtdLChmdW5jdGlvbih0KXtudWxsIT10LmRhdGFJbmRleCYmKHQuZGF0YUluZGV4SW5zaWRlPXQuZGF0YUluZGV4LHQuZGF0YUluZGV4PW51bGwpLHQuaGlnaGxpZ2h0S2V5PSJ2aXN1YWxNYXAiKyhlP2UuY29tcG9uZW50SW5kZXg6IiIpfSkpLHR9dmFyIFVGPUtyLFpGPUUsakY9TWF0aC5taW4scUY9TWF0aC5tYXgsS0Y9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLl9zaGFwZXM9e30sbi5fZGF0YUludGVydmFsPVtdLG4uX2hhbmRsZUVuZHM9W10sbi5faG92ZXJMaW5rRGF0YUluZGljZXM9W10sbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5pbml0LmNhbGwodGhpcyxlLG4pLHRoaXMuX2hvdmVyTGlua0Zyb21TZXJpZXNNb3VzZU92ZXI9Vyh0aGlzLl9ob3ZlckxpbmtGcm9tU2VyaWVzTW91c2VPdmVyLHRoaXMpLHRoaXMuX2hpZGVJbmRpY2F0b3I9Vyh0aGlzLl9oaWRlSW5kaWNhdG9yLHRoaXMpfSxlLnByb3RvdHlwZS5kb1JlbmRlcj1mdW5jdGlvbih0LGUsbixpKXtpJiYic2VsZWN0RGF0YVJhbmdlIj09PWkudHlwZSYmaS5mcm9tPT09dGhpcy51aWR8fHRoaXMuX2J1aWxkVmlldygpfSxlLnByb3RvdHlwZS5fYnVpbGRWaWV3PWZ1bmN0aW9uKCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgdD10aGlzLnZpc3VhbE1hcE1vZGVsLGU9dGhpcy5ncm91cDt0aGlzLl9vcmllbnQ9dC5nZXQoIm9yaWVudCIpLHRoaXMuX3VzZUhhbmRsZT10LmdldCgiY2FsY3VsYWJsZSIpLHRoaXMuX3Jlc2V0SW50ZXJ2YWwoKSx0aGlzLl9yZW5kZXJCYXIoZSk7dmFyIG49dC5nZXQoInRleHQiKTt0aGlzLl9yZW5kZXJFbmRzVGV4dChlLG4sMCksdGhpcy5fcmVuZGVyRW5kc1RleHQoZSxuLDEpLHRoaXMuX3VwZGF0ZVZpZXcoITApLHRoaXMucmVuZGVyQmFja2dyb3VuZChlKSx0aGlzLl91cGRhdGVWaWV3KCksdGhpcy5fZW5hYmxlSG92ZXJMaW5rVG9TZXJpZXMoKSx0aGlzLl9lbmFibGVIb3ZlckxpbmtGcm9tU2VyaWVzKCksdGhpcy5wb3NpdGlvbkdyb3VwKGUpfSxlLnByb3RvdHlwZS5fcmVuZGVyRW5kc1RleHQ9ZnVuY3Rpb24odCxlLG4pe2lmKGUpe3ZhciBpPWVbMS1uXTtpPW51bGwhPWk/aSsiIjoiIjt2YXIgcj10aGlzLnZpc3VhbE1hcE1vZGVsLG89ci5nZXQoInRleHRHYXAiKSxhPXIuaXRlbVNpemUscz10aGlzLl9zaGFwZXMubWFpbkdyb3VwLGw9dGhpcy5fYXBwbHlUcmFuc2Zvcm0oW2FbMF0vMiwwPT09bj8tbzphWzFdK29dLHMpLHU9dGhpcy5fYXBwbHlUcmFuc2Zvcm0oMD09PW4/ImJvdHRvbSI6InRvcCIscyksaD10aGlzLl9vcmllbnQsYz10aGlzLnZpc3VhbE1hcE1vZGVsLnRleHRTdHlsZU1vZGVsO3RoaXMuZ3JvdXAuYWRkKG5ldyBYcyh7c3R5bGU6b2MoYyx7eDpsWzBdLHk6bFsxXSx2ZXJ0aWNhbEFsaWduOiJob3Jpem9udGFsIj09PWg/Im1pZGRsZSI6dSxhbGlnbjoiaG9yaXpvbnRhbCI9PT1oP3U6ImNlbnRlciIsdGV4dDppfSl9KSl9fSxlLnByb3RvdHlwZS5fcmVuZGVyQmFyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWwsbj10aGlzLl9zaGFwZXMsaT1lLml0ZW1TaXplLHI9dGhpcy5fb3JpZW50LG89dGhpcy5fdXNlSGFuZGxlLGE9WUYoZSx0aGlzLmFwaSxpKSxzPW4ubWFpbkdyb3VwPXRoaXMuX2NyZWF0ZUJhckdyb3VwKGEpLGw9bmV3IEJyO3MuYWRkKGwpLGwuYWRkKG4ub3V0T2ZSYW5nZT0kRigpKSxsLmFkZChuLmluUmFuZ2U9JEYobnVsbCxvP1FGKHRoaXMuX29yaWVudCk6bnVsbCxXKHRoaXMuX2RyYWdIYW5kbGUsdGhpcywiYWxsIiwhMSksVyh0aGlzLl9kcmFnSGFuZGxlLHRoaXMsImFsbCIsITApKSksbC5zZXRDbGlwUGF0aChuZXcgV3Moe3NoYXBlOnt4OjAseTowLHdpZHRoOmlbMF0saGVpZ2h0OmlbMV0scjozfX0pKTt2YXIgdT1lLnRleHRTdHlsZU1vZGVsLmdldFRleHRSZWN0KCLlm70iKSxoPXFGKHUud2lkdGgsdS5oZWlnaHQpO28mJihuLmhhbmRsZVRodW1icz1bXSxuLmhhbmRsZUxhYmVscz1bXSxuLmhhbmRsZUxhYmVsUG9pbnRzPVtdLHRoaXMuX2NyZWF0ZUhhbmRsZShlLHMsMCxpLGgsciksdGhpcy5fY3JlYXRlSGFuZGxlKGUscywxLGksaCxyKSksdGhpcy5fY3JlYXRlSW5kaWNhdG9yKGUscyxpLGgsciksdC5hZGQocyl9LGUucHJvdG90eXBlLl9jcmVhdGVIYW5kbGU9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPVcodGhpcy5fZHJhZ0hhbmRsZSx0aGlzLG4sITEpLHM9Vyh0aGlzLl9kcmFnSGFuZGxlLHRoaXMsbiwhMCksbD1Dcih0LmdldCgiaGFuZGxlU2l6ZSIpLGlbMF0pLHU9WHkodC5nZXQoImhhbmRsZUljb24iKSwtbC8yLC1sLzIsbCxsLG51bGwsITApLGg9UUYodGhpcy5fb3JpZW50KTt1LmF0dHIoe2N1cnNvcjpoLGRyYWdnYWJsZTohMCxkcmlmdDphLG9uZHJhZ2VuZDpzLG9ubW91c2Vtb3ZlOmZ1bmN0aW9uKHQpe2RlKHQuZXZlbnQpfX0pLHUueD1pWzBdLzIsdS51c2VTdHlsZSh0LmdldE1vZGVsKCJoYW5kbGVTdHlsZSIpLmdldEl0ZW1TdHlsZSgpKSx1LnNldFN0eWxlKHtzdHJva2VOb1NjYWxlOiEwLHN0cm9rZUZpcnN0OiEwfSksdS5zdHlsZS5saW5lV2lkdGgqPTIsdS5lbnN1cmVTdGF0ZSgiZW1waGFzaXMiKS5zdHlsZT10LmdldE1vZGVsKFsiZW1waGFzaXMiLCJoYW5kbGVTdHlsZSJdKS5nZXRJdGVtU3R5bGUoKSxKbCh1LCEwKSxlLmFkZCh1KTt2YXIgYz10aGlzLnZpc3VhbE1hcE1vZGVsLnRleHRTdHlsZU1vZGVsLHA9bmV3IFhzKHtjdXJzb3I6aCxkcmFnZ2FibGU6ITAsZHJpZnQ6YSxvbm1vdXNlbW92ZTpmdW5jdGlvbih0KXtkZSh0LmV2ZW50KX0sb25kcmFnZW5kOnMsc3R5bGU6b2MoYyx7eDowLHk6MCx0ZXh0OiIifSl9KTtwLmVuc3VyZVN0YXRlKCJibHVyIikuc3R5bGU9e29wYWNpdHk6LjF9LHAuc3RhdGVUcmFuc2l0aW9uPXtkdXJhdGlvbjoyMDB9LHRoaXMuZ3JvdXAuYWRkKHApO3ZhciBkPVtsLDBdLGY9dGhpcy5fc2hhcGVzO2YuaGFuZGxlVGh1bWJzW25dPXUsZi5oYW5kbGVMYWJlbFBvaW50c1tuXT1kLGYuaGFuZGxlTGFiZWxzW25dPXB9LGUucHJvdG90eXBlLl9jcmVhdGVJbmRpY2F0b3I9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz1Dcih0LmdldCgiaW5kaWNhdG9yU2l6ZSIpLG5bMF0pLGE9WHkodC5nZXQoImluZGljYXRvckljb24iKSwtby8yLC1vLzIsbyxvLG51bGwsITApO2EuYXR0cih7Y3Vyc29yOiJtb3ZlIixpbnZpc2libGU6ITAsc2lsZW50OiEwLHg6blswXS8yfSk7dmFyIHM9dC5nZXRNb2RlbCgiaW5kaWNhdG9yU3R5bGUiKS5nZXRJdGVtU3R5bGUoKTtpZihhIGluc3RhbmNlb2YgTnMpe3ZhciBsPWEuc3R5bGU7YS51c2VTdHlsZShBKHtpbWFnZTpsLmltYWdlLHg6bC54LHk6bC55LHdpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fSxzKSl9ZWxzZSBhLnVzZVN0eWxlKHMpO2UuYWRkKGEpO3ZhciB1PXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWwsaD1uZXcgWHMoe3NpbGVudDohMCxpbnZpc2libGU6ITAsc3R5bGU6b2ModSx7eDowLHk6MCx0ZXh0OiIifSl9KTt0aGlzLmdyb3VwLmFkZChoKTt2YXIgYz1bKCJob3Jpem9udGFsIj09PXI/aS8yOjYpK25bMF0vMiwwXSxwPXRoaXMuX3NoYXBlcztwLmluZGljYXRvcj1hLHAuaW5kaWNhdG9yTGFiZWw9aCxwLmluZGljYXRvckxhYmVsUG9pbnQ9Yyx0aGlzLl9maXJzdFNob3dJbmRpY2F0b3I9ITB9LGUucHJvdG90eXBlLl9kcmFnSGFuZGxlPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHRoaXMuX3VzZUhhbmRsZSl7aWYodGhpcy5fZHJhZ2dpbmc9IWUsIWUpe3ZhciByPXRoaXMuX2FwcGx5VHJhbnNmb3JtKFtuLGldLHRoaXMuX3NoYXBlcy5tYWluR3JvdXAsITApO3RoaXMuX3VwZGF0ZUludGVydmFsKHQsclsxXSksdGhpcy5faGlkZUluZGljYXRvcigpLHRoaXMuX3VwZGF0ZVZpZXcoKX1lPT09IXRoaXMudmlzdWFsTWFwTW9kZWwuZ2V0KCJyZWFsdGltZSIpJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToic2VsZWN0RGF0YVJhbmdlIixmcm9tOnRoaXMudWlkLHZpc3VhbE1hcElkOnRoaXMudmlzdWFsTWFwTW9kZWwuaWQsc2VsZWN0ZWQ6dGhpcy5fZGF0YUludGVydmFsLnNsaWNlKCl9KSxlPyF0aGlzLl9ob3ZlcmluZyYmdGhpcy5fY2xlYXJIb3ZlckxpbmtUb1NlcmllcygpOkpGKHRoaXMudmlzdWFsTWFwTW9kZWwpJiZ0aGlzLl9kb0hvdmVyTGlua1RvU2VyaWVzKHRoaXMuX2hhbmRsZUVuZHNbdF0sITEpfX0sZS5wcm90b3R5cGUuX3Jlc2V0SW50ZXJ2YWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpc3VhbE1hcE1vZGVsLGU9dGhpcy5fZGF0YUludGVydmFsPXQuZ2V0U2VsZWN0ZWQoKSxuPXQuZ2V0RXh0ZW50KCksaT1bMCx0Lml0ZW1TaXplWzFdXTt0aGlzLl9oYW5kbGVFbmRzPVtVRihlWzBdLG4saSwhMCksVUYoZVsxXSxuLGksITApXX0sZS5wcm90b3R5cGUuX3VwZGF0ZUludGVydmFsPWZ1bmN0aW9uKHQsZSl7ZT1lfHwwO3ZhciBuPXRoaXMudmlzdWFsTWFwTW9kZWwsaT10aGlzLl9oYW5kbGVFbmRzLHI9WzAsbi5pdGVtU2l6ZVsxXV07emsoZSxpLHIsdCwwKTt2YXIgbz1uLmdldEV4dGVudCgpO3RoaXMuX2RhdGFJbnRlcnZhbD1bVUYoaVswXSxyLG8sITApLFVGKGlbMV0scixvLCEwKV19LGUucHJvdG90eXBlLl91cGRhdGVWaWV3PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWwsbj1lLmdldEV4dGVudCgpLGk9dGhpcy5fc2hhcGVzLHI9WzAsZS5pdGVtU2l6ZVsxXV0sbz10P3I6dGhpcy5faGFuZGxlRW5kcyxhPXRoaXMuX2NyZWF0ZUJhclZpc3VhbCh0aGlzLl9kYXRhSW50ZXJ2YWwsbixvLCJpblJhbmdlIikscz10aGlzLl9jcmVhdGVCYXJWaXN1YWwobixuLHIsIm91dE9mUmFuZ2UiKTtpLmluUmFuZ2Uuc2V0U3R5bGUoe2ZpbGw6YS5iYXJDb2xvcn0pLnNldFNoYXBlKCJwb2ludHMiLGEuYmFyUG9pbnRzKSxpLm91dE9mUmFuZ2Uuc2V0U3R5bGUoe2ZpbGw6cy5iYXJDb2xvcn0pLnNldFNoYXBlKCJwb2ludHMiLHMuYmFyUG9pbnRzKSx0aGlzLl91cGRhdGVIYW5kbGUobyxhKX0sZS5wcm90b3R5cGUuX2NyZWF0ZUJhclZpc3VhbD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj17Zm9yY2VTdGF0ZTppLGNvbnZlcnRPcGFjaXR5VG9BbHBoYTohMH0sbz10aGlzLl9tYWtlQ29sb3JHcmFkaWVudCh0LHIpLGE9W3RoaXMuZ2V0Q29udHJvbGxlclZpc3VhbCh0WzBdLCJzeW1ib2xTaXplIixyKSx0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwodFsxXSwic3ltYm9sU2l6ZSIscildLHM9dGhpcy5fY3JlYXRlQmFyUG9pbnRzKG4sYSk7cmV0dXJue2JhckNvbG9yOm5ldyBvaCgwLDAsMCwxLG8pLGJhclBvaW50czpzLGhhbmRsZXNDb2xvcjpbb1swXS5jb2xvcixvW28ubGVuZ3RoLTFdLmNvbG9yXX19LGUucHJvdG90eXBlLl9tYWtlQ29sb3JHcmFkaWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLGk9KHRbMV0tdFswXSkvMTAwO24ucHVzaCh7Y29sb3I6dGhpcy5nZXRDb250cm9sbGVyVmlzdWFsKHRbMF0sImNvbG9yIixlKSxvZmZzZXQ6MH0pO2Zvcih2YXIgcj0xO3I8MTAwO3IrKyl7dmFyIG89dFswXStpKnI7aWYobz50WzFdKWJyZWFrO24ucHVzaCh7Y29sb3I6dGhpcy5nZXRDb250cm9sbGVyVmlzdWFsKG8sImNvbG9yIixlKSxvZmZzZXQ6ci8xMDB9KX1yZXR1cm4gbi5wdXNoKHtjb2xvcjp0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwodFsxXSwiY29sb3IiLGUpLG9mZnNldDoxfSksbn0sZS5wcm90b3R5cGUuX2NyZWF0ZUJhclBvaW50cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudmlzdWFsTWFwTW9kZWwuaXRlbVNpemU7cmV0dXJuW1tuWzBdLWVbMF0sdFswXV0sW25bMF0sdFswXV0sW25bMF0sdFsxXV0sW25bMF0tZVsxXSx0WzFdXV19LGUucHJvdG90eXBlLl9jcmVhdGVCYXJHcm91cD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9vcmllbnQsbj10aGlzLnZpc3VhbE1hcE1vZGVsLmdldCgiaW52ZXJzZSIpO3JldHVybiBuZXcgQnIoImhvcml6b250YWwiIT09ZXx8bj8iaG9yaXpvbnRhbCI9PT1lJiZuP3tzY2FsZVg6ImJvdHRvbSI9PT10Py0xOjEscm90YXRpb246LU1hdGguUEkvMn06InZlcnRpY2FsIiE9PWV8fG4/e3NjYWxlWDoibGVmdCI9PT10PzE6LTF9OntzY2FsZVg6ImxlZnQiPT09dD8xOi0xLHNjYWxlWTotMX06e3NjYWxlWDoiYm90dG9tIj09PXQ/MTotMSxyb3RhdGlvbjpNYXRoLlBJLzJ9KX0sZS5wcm90b3R5cGUuX3VwZGF0ZUhhbmRsZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX3VzZUhhbmRsZSl7dmFyIG49dGhpcy5fc2hhcGVzLGk9dGhpcy52aXN1YWxNYXBNb2RlbCxyPW4uaGFuZGxlVGh1bWJzLG89bi5oYW5kbGVMYWJlbHMsYT1pLml0ZW1TaXplLHM9aS5nZXRFeHRlbnQoKTtaRihbMCwxXSwoZnVuY3Rpb24obCl7dmFyIHU9cltsXTt1LnNldFN0eWxlKCJmaWxsIixlLmhhbmRsZXNDb2xvcltsXSksdS55PXRbbF07dmFyIGg9VUYodFtsXSxbMCxhWzFdXSxzLCEwKSxjPXRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbChoLCJzeW1ib2xTaXplIik7dS5zY2FsZVg9dS5zY2FsZVk9Yy9hWzBdLHUueD1hWzBdLWMvMjt2YXIgcD1GaChuLmhhbmRsZUxhYmVsUG9pbnRzW2xdLEJoKHUsdGhpcy5ncm91cCkpO29bbF0uc2V0U3R5bGUoe3g6cFswXSx5OnBbMV0sdGV4dDppLmZvcm1hdFZhbHVlVGV4dCh0aGlzLl9kYXRhSW50ZXJ2YWxbbF0pLHZlcnRpY2FsQWxpZ246Im1pZGRsZSIsYWxpZ246InZlcnRpY2FsIj09PXRoaXMuX29yaWVudD90aGlzLl9hcHBseVRyYW5zZm9ybSgibGVmdCIsbi5tYWluR3JvdXApOiJjZW50ZXIifSl9KSx0aGlzKX19LGUucHJvdG90eXBlLl9zaG93SW5kaWNhdG9yPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMudmlzdWFsTWFwTW9kZWwsbz1yLmdldEV4dGVudCgpLGE9ci5pdGVtU2l6ZSxzPVswLGFbMV1dLGw9dGhpcy5fc2hhcGVzLHU9bC5pbmRpY2F0b3I7aWYodSl7dS5hdHRyKCJpbnZpc2libGUiLCExKTt2YXIgaD10aGlzLmdldENvbnRyb2xsZXJWaXN1YWwodCwiY29sb3IiLHtjb252ZXJ0T3BhY2l0eVRvQWxwaGE6ITB9KSxjPXRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbCh0LCJzeW1ib2xTaXplIikscD1VRih0LG8scywhMCksZD1hWzBdLWMvMixmPXt4OnUueCx5OnUueX07dS55PXAsdS54PWQ7dmFyIGc9RmgobC5pbmRpY2F0b3JMYWJlbFBvaW50LEJoKHUsdGhpcy5ncm91cCkpLHk9bC5pbmRpY2F0b3JMYWJlbDt5LmF0dHIoImludmlzaWJsZSIsITEpO3ZhciB2PXRoaXMuX2FwcGx5VHJhbnNmb3JtKCJsZWZ0IixsLm1haW5Hcm91cCksbT0iaG9yaXpvbnRhbCI9PT10aGlzLl9vcmllbnQ7eS5zZXRTdHlsZSh7dGV4dDoobnx8IiIpK3IuZm9ybWF0VmFsdWVUZXh0KGUpLHZlcnRpY2FsQWxpZ246bT92OiJtaWRkbGUiLGFsaWduOm0/ImNlbnRlciI6dn0pO3ZhciB4PXt4OmQseTpwLHN0eWxlOntmaWxsOmh9fSxfPXtzdHlsZTp7eDpnWzBdLHk6Z1sxXX19O2lmKHIuZWNNb2RlbC5pc0FuaW1hdGlvbkVuYWJsZWQoKSYmIXRoaXMuX2ZpcnN0U2hvd0luZGljYXRvcil7dmFyIGI9e2R1cmF0aW9uOjEwMCxlYXNpbmc6ImN1YmljSW5PdXQiLGFkZGl0aXZlOiEwfTt1Lng9Zi54LHUueT1mLnksdS5hbmltYXRlVG8oeCxiKSx5LmFuaW1hdGVUbyhfLGIpfWVsc2UgdS5hdHRyKHgpLHkuYXR0cihfKTt0aGlzLl9maXJzdFNob3dJbmRpY2F0b3I9ITE7dmFyIHc9dGhpcy5fc2hhcGVzLmhhbmRsZUxhYmVscztpZih3KWZvcih2YXIgUz0wO1M8dy5sZW5ndGg7UysrKXRoaXMuYXBpLmVudGVyQmx1cih3W1NdKX19LGUucHJvdG90eXBlLl9lbmFibGVIb3ZlckxpbmtUb1Nlcmllcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc2hhcGVzLm1haW5Hcm91cC5vbigibW91c2Vtb3ZlIiwoZnVuY3Rpb24oZSl7aWYodC5faG92ZXJpbmc9ITAsIXQuX2RyYWdnaW5nKXt2YXIgbj10LnZpc3VhbE1hcE1vZGVsLml0ZW1TaXplLGk9dC5fYXBwbHlUcmFuc2Zvcm0oW2Uub2Zmc2V0WCxlLm9mZnNldFldLHQuX3NoYXBlcy5tYWluR3JvdXAsITAsITApO2lbMV09akYocUYoMCxpWzFdKSxuWzFdKSx0Ll9kb0hvdmVyTGlua1RvU2VyaWVzKGlbMV0sMDw9aVswXSYmaVswXTw9blswXSl9fSkpLm9uKCJtb3VzZW91dCIsKGZ1bmN0aW9uKCl7dC5faG92ZXJpbmc9ITEsIXQuX2RyYWdnaW5nJiZ0Ll9jbGVhckhvdmVyTGlua1RvU2VyaWVzKCl9KSl9LGUucHJvdG90eXBlLl9lbmFibGVIb3ZlckxpbmtGcm9tU2VyaWVzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hcGkuZ2V0WnIoKTt0aGlzLnZpc3VhbE1hcE1vZGVsLm9wdGlvbi5ob3Zlckxpbms/KHQub24oIm1vdXNlb3ZlciIsdGhpcy5faG92ZXJMaW5rRnJvbVNlcmllc01vdXNlT3Zlcix0aGlzKSx0Lm9uKCJtb3VzZW91dCIsdGhpcy5faGlkZUluZGljYXRvcix0aGlzKSk6dGhpcy5fY2xlYXJIb3ZlckxpbmtGcm9tU2VyaWVzKCl9LGUucHJvdG90eXBlLl9kb0hvdmVyTGlua1RvU2VyaWVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy52aXN1YWxNYXBNb2RlbCxpPW4uaXRlbVNpemU7aWYobi5vcHRpb24uaG92ZXJMaW5rKXt2YXIgcj1bMCxpWzFdXSxvPW4uZ2V0RXh0ZW50KCk7dD1qRihxRihyWzBdLHQpLHJbMV0pO3ZhciBhPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT02LHI9dC5nZXQoImhvdmVyTGlua0RhdGFTaXplIik7ciYmKGk9VUYocixlLG4sITApLzIpO3JldHVybiBpfShuLG8scikscz1bdC1hLHQrYV0sbD1VRih0LHIsbywhMCksdT1bVUYoc1swXSxyLG8sITApLFVGKHNbMV0scixvLCEwKV07c1swXTxyWzBdJiYodVswXT0tMS8wKSxzWzFdPnJbMV0mJih1WzFdPTEvMCksZSYmKHVbMF09PT0tMS8wP3RoaXMuX3Nob3dJbmRpY2F0b3IobCx1WzFdLCI8ICIsYSk6dVsxXT09PTEvMD90aGlzLl9zaG93SW5kaWNhdG9yKGwsdVswXSwiPiAiLGEpOnRoaXMuX3Nob3dJbmRpY2F0b3IobCxsLCLiiYggIixhKSk7dmFyIGg9dGhpcy5faG92ZXJMaW5rRGF0YUluZGljZXMsYz1bXTsoZXx8SkYobikpJiYoYz10aGlzLl9ob3ZlckxpbmtEYXRhSW5kaWNlcz1uLmZpbmRUYXJnZXREYXRhSW5kaWNlcyh1KSk7dmFyIHA9ZnVuY3Rpb24odCxlKXt2YXIgbj17fSxpPXt9O3JldHVybiByKHR8fFtdLG4pLHIoZXx8W10saSxuKSxbbyhuKSxvKGkpXTtmdW5jdGlvbiByKHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe3ZhciBvPVJvKHRbaV0uc2VyaWVzSWQsbnVsbCk7aWYobnVsbD09bylyZXR1cm47Zm9yKHZhciBhPVRvKHRbaV0uZGF0YUluZGV4KSxzPW4mJm5bb10sbD0wLHU9YS5sZW5ndGg7bDx1O2wrKyl7dmFyIGg9YVtsXTtzJiZzW2hdP3NbaF09bnVsbDooZVtvXXx8KGVbb109e30pKVtoXT0xfX19ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPVtdO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkmJm51bGwhPXRbaV0paWYoZSluLnB1c2goK2kpO2Vsc2V7dmFyIHI9byh0W2ldLCEwKTtyLmxlbmd0aCYmbi5wdXNoKHtzZXJpZXNJZDppLGRhdGFJbmRleDpyfSl9cmV0dXJuIG59fShoLGMpO3RoaXMuX2Rpc3BhdGNoSGlnaERvd24oImRvd25wbGF5IixYRihwWzBdLG4pKSx0aGlzLl9kaXNwYXRjaEhpZ2hEb3duKCJoaWdobGlnaHQiLFhGKHBbMV0sbikpfX0sZS5wcm90b3R5cGUuX2hvdmVyTGlua0Zyb21TZXJpZXNNb3VzZU92ZXI9ZnVuY3Rpb24odCl7dmFyIGU7aWYoT3kodC50YXJnZXQsKGZ1bmN0aW9uKHQpe3ZhciBuPXJsKHQpO2lmKG51bGwhPW4uZGF0YUluZGV4KXJldHVybiBlPW4sITB9KSwhMCksZSl7dmFyIG49dGhpcy5lY01vZGVsLmdldFNlcmllc0J5SW5kZXgoZS5zZXJpZXNJbmRleCksaT10aGlzLnZpc3VhbE1hcE1vZGVsO2lmKGkuaXNUYXJnZXRTZXJpZXMobikpe3ZhciByPW4uZ2V0RGF0YShlLmRhdGFUeXBlKSxvPXIuZ2V0U3RvcmUoKS5nZXQoaS5nZXREYXRhRGltZW5zaW9uSW5kZXgociksZS5kYXRhSW5kZXgpO2lzTmFOKG8pfHx0aGlzLl9zaG93SW5kaWNhdG9yKG8sbyl9fX0sZS5wcm90b3R5cGUuX2hpZGVJbmRpY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zaGFwZXM7dC5pbmRpY2F0b3ImJnQuaW5kaWNhdG9yLmF0dHIoImludmlzaWJsZSIsITApLHQuaW5kaWNhdG9yTGFiZWwmJnQuaW5kaWNhdG9yTGFiZWwuYXR0cigiaW52aXNpYmxlIiwhMCk7dmFyIGU9dGhpcy5fc2hhcGVzLmhhbmRsZUxhYmVscztpZihlKWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMuYXBpLmxlYXZlQmx1cihlW25dKX0sZS5wcm90b3R5cGUuX2NsZWFySG92ZXJMaW5rVG9TZXJpZXM9ZnVuY3Rpb24oKXt0aGlzLl9oaWRlSW5kaWNhdG9yKCk7dmFyIHQ9dGhpcy5faG92ZXJMaW5rRGF0YUluZGljZXM7dGhpcy5fZGlzcGF0Y2hIaWdoRG93bigiZG93bnBsYXkiLFhGKHQsdGhpcy52aXN1YWxNYXBNb2RlbCkpLHQubGVuZ3RoPTB9LGUucHJvdG90eXBlLl9jbGVhckhvdmVyTGlua0Zyb21TZXJpZXM9ZnVuY3Rpb24oKXt0aGlzLl9oaWRlSW5kaWNhdG9yKCk7dmFyIHQ9dGhpcy5hcGkuZ2V0WnIoKTt0Lm9mZigibW91c2VvdmVyIix0aGlzLl9ob3ZlckxpbmtGcm9tU2VyaWVzTW91c2VPdmVyKSx0Lm9mZigibW91c2VvdXQiLHRoaXMuX2hpZGVJbmRpY2F0b3IpfSxlLnByb3RvdHlwZS5fYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9QmgoZSxpP251bGw6dGhpcy5ncm91cCk7cmV0dXJuIFkodCk/RmgodCxyLG4pOkdoKHQscixuKX0sZS5wcm90b3R5cGUuX2Rpc3BhdGNoSGlnaERvd249ZnVuY3Rpb24odCxlKXtlJiZlLmxlbmd0aCYmdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6dCxiYXRjaDplfSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckhvdmVyTGlua0Zyb21TZXJpZXMoKSx0aGlzLl9jbGVhckhvdmVyTGlua1RvU2VyaWVzKCl9LGUudHlwZT0idmlzdWFsTWFwLmNvbnRpbnVvdXMiLGV9KFdGKTtmdW5jdGlvbiAkRih0LGUsbixpKXtyZXR1cm4gbmV3IFh1KHtzaGFwZTp7cG9pbnRzOnR9LGRyYWdnYWJsZTohIW4sY3Vyc29yOmUsZHJpZnQ6bixvbm1vdXNlbW92ZTpmdW5jdGlvbih0KXtkZSh0LmV2ZW50KX0sb25kcmFnZW5kOml9KX1mdW5jdGlvbiBKRih0KXt2YXIgZT10LmdldCgiaG92ZXJMaW5rT25IYW5kbGUiKTtyZXR1cm4hIShudWxsPT1lP3QuZ2V0KCJyZWFsdGltZSIpOmUpfWZ1bmN0aW9uIFFGKHQpe3JldHVybiJ2ZXJ0aWNhbCI9PT10PyJucy1yZXNpemUiOiJldy1yZXNpemUifXZhciB0Rz17dHlwZToic2VsZWN0RGF0YVJhbmdlIixldmVudDoiZGF0YVJhbmdlU2VsZWN0ZWQiLHVwZGF0ZToidXBkYXRlIn0sZUc9ZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJ2aXN1YWxNYXAiLHF1ZXJ5OnR9LChmdW5jdGlvbihlKXtlLnNldFNlbGVjdGVkKHQuc2VsZWN0ZWQpfSkpfSxuRz1be2NyZWF0ZU9uQWxsU2VyaWVzOiEwLHJlc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIGUuZWFjaENvbXBvbmVudCgidmlzdWFsTWFwIiwoZnVuY3Rpb24oZSl7dmFyIGkscixvLGEscyxsPXQucGlwZWxpbmVDb250ZXh0OyFlLmlzVGFyZ2V0U2VyaWVzKHQpfHxsJiZsLmxhcmdlfHxuLnB1c2goKGk9ZS5zdGF0ZUxpc3Qscj1lLnRhcmdldFZpc3VhbHMsbz1XKGUuZ2V0VmFsdWVTdGF0ZSxlKSxhPWUuZ2V0RGF0YURpbWVuc2lvbkluZGV4KHQuZ2V0RGF0YSgpKSxzPXt9LEUoaSwoZnVuY3Rpb24odCl7dmFyIGU9a0QucHJlcGFyZVZpc3VhbFR5cGVzKHJbdF0pO3NbdF09ZX0pKSx7cHJvZ3Jlc3M6ZnVuY3Rpb24odCxlKXt2YXIgbixpO2Z1bmN0aW9uIGwodCl7cmV0dXJuIER5KGUsaSx0KX1mdW5jdGlvbiB1KHQsbil7a3koZSxpLHQsbil9bnVsbCE9YSYmKG49ZS5nZXREaW1lbnNpb25JbmRleChhKSk7Zm9yKHZhciBoPWUuZ2V0U3RvcmUoKTtudWxsIT0oaT10Lm5leHQoKSk7KXt2YXIgYz1lLmdldFJhd0RhdGFJdGVtKGkpO2lmKCFjfHwhMSE9PWMudmlzdWFsTWFwKWZvcih2YXIgcD1udWxsIT1hP2guZ2V0KG4saSk6aSxkPW8ocCksZj1yW2RdLGc9c1tkXSx5PTAsdj1nLmxlbmd0aDt5PHY7eSsrKXt2YXIgbT1nW3ldO2ZbbV0mJmZbbV0uYXBwbHlWaXN1YWwocCxsLHUpfX19fSkpfSkpLG59fSx7Y3JlYXRlT25BbGxTZXJpZXM6ITAscmVzZXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldERhdGEoKSxpPVtdO2UuZWFjaENvbXBvbmVudCgidmlzdWFsTWFwIiwoZnVuY3Rpb24oZSl7aWYoZS5pc1RhcmdldFNlcmllcyh0KSl7dmFyIHI9ZS5nZXRWaXN1YWxNZXRhKFcoaUcsbnVsbCx0LGUpKXx8e3N0b3BzOltdLG91dGVyQ29sb3JzOltdfSxvPWUuZ2V0RGF0YURpbWVuc2lvbkluZGV4KG4pO28+PTAmJihyLmRpbWVuc2lvbj1vLGkucHVzaChyKSl9fSkpLHQuZ2V0RGF0YSgpLnNldFZpc3VhbCgidmlzdWFsTWV0YSIsaSl9fV07ZnVuY3Rpb24gaUcodCxlLG4saSl7Zm9yKHZhciByPWUudGFyZ2V0VmlzdWFsc1tpXSxvPWtELnByZXBhcmVWaXN1YWxUeXBlcyhyKSxhPXtjb2xvcjpBeSh0LmdldERhdGEoKSwiY29sb3IiKX0scz0wLGw9by5sZW5ndGg7czxsO3MrKyl7dmFyIHU9b1tzXSxoPXJbIm9wYWNpdHkiPT09dT8iX19hbHBoYUZvck9wYWNpdHkiOnVdO2gmJmguYXBwbHlWaXN1YWwobixjLHApfXJldHVybiBhLmNvbG9yO2Z1bmN0aW9uIGModCl7cmV0dXJuIGFbdF19ZnVuY3Rpb24gcCh0LGUpe2FbdF09ZX19dmFyIHJHPUU7ZnVuY3Rpb24gb0codCl7dmFyIGU9dCYmdC52aXN1YWxNYXA7WShlKXx8KGU9ZT9bZV06W10pLHJHKGUsKGZ1bmN0aW9uKHQpe2lmKHQpe2FHKHQsInNwbGl0TGlzdCIpJiYhYUcodCwicGllY2VzIikmJih0LnBpZWNlcz10LnNwbGl0TGlzdCxkZWxldGUgdC5zcGxpdExpc3QpO3ZhciBlPXQucGllY2VzO2UmJlkoZSkmJnJHKGUsKGZ1bmN0aW9uKHQpe3EodCkmJihhRyh0LCJzdGFydCIpJiYhYUcodCwibWluIikmJih0Lm1pbj10LnN0YXJ0KSxhRyh0LCJlbmQiKSYmIWFHKHQsIm1heCIpJiYodC5tYXg9dC5lbmQpKX0pKX19KSl9ZnVuY3Rpb24gYUcodCxlKXtyZXR1cm4gdCYmdC5oYXNPd25Qcm9wZXJ0eSYmdC5oYXNPd25Qcm9wZXJ0eShlKX12YXIgc0c9ITE7ZnVuY3Rpb24gbEcodCl7c0d8fChzRz0hMCx0LnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcigidmlzdWFsTWFwIiwoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2F0ZWdvcmllc3x8KHQucGllY2VzP3QucGllY2VzLmxlbmd0aD4wOnQuc3BsaXROdW1iZXI+MCkmJiF0LmNhbGN1bGFibGU/InBpZWNld2lzZSI6ImNvbnRpbnVvdXMifSkpLHQucmVnaXN0ZXJBY3Rpb24odEcsZUcpLEUobkcsKGZ1bmN0aW9uKGUpe3QucmVnaXN0ZXJWaXN1YWwodC5QUklPUklUWS5WSVNVQUwuQ09NUE9ORU5ULGUpfSkpLHQucmVnaXN0ZXJQcmVwcm9jZXNzb3Iob0cpKX1mdW5jdGlvbiB1Ryh0KXt0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoRkYpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KEtGKSxsRyh0KX12YXIgaEc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi50eXBlPWUudHlwZSxuLl9waWVjZUxpc3Q9W10sbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLm9wdGlvblVwZGF0ZWQ9ZnVuY3Rpb24oZSxuKXt0LnByb3RvdHlwZS5vcHRpb25VcGRhdGVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc2V0RXh0ZW50KCk7dmFyIGk9dGhpcy5fbW9kZT10aGlzLl9kZXRlcm1pbmVNb2RlKCk7dGhpcy5fcGllY2VMaXN0PVtdLGNHW3RoaXMuX21vZGVdLmNhbGwodGhpcyx0aGlzLl9waWVjZUxpc3QpLHRoaXMuX3Jlc2V0U2VsZWN0ZWQoZSxuKTt2YXIgcj10aGlzLm9wdGlvbi5jYXRlZ29yaWVzO3RoaXMucmVzZXRWaXN1YWwoKGZ1bmN0aW9uKHQsZSl7ImNhdGVnb3JpZXMiPT09aT8odC5tYXBwaW5nTWV0aG9kPSJjYXRlZ29yeSIsdC5jYXRlZ29yaWVzPVQocikpOih0LmRhdGFFeHRlbnQ9dGhpcy5nZXRFeHRlbnQoKSx0Lm1hcHBpbmdNZXRob2Q9InBpZWNld2lzZSIsdC5waWVjZUxpc3Q9eih0aGlzLl9waWVjZUxpc3QsKGZ1bmN0aW9uKHQpe3JldHVybiB0PVQodCksImluUmFuZ2UiIT09ZSYmKHQudmlzdWFsPW51bGwpLHR9KSkpfSkpfSxlLnByb3RvdHlwZS5jb21wbGV0ZVZpc3VhbE9wdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9uLG49e30saT1rRC5saXN0VmlzdWFsVHlwZXMoKSxyPXRoaXMuaXNDYXRlZ29yeSgpO2Z1bmN0aW9uIG8odCxlLG4pe3JldHVybiB0JiZ0W2VdJiZ0W2VdLmhhc093blByb3BlcnR5KG4pfUUoZS5waWVjZXMsKGZ1bmN0aW9uKHQpe0UoaSwoZnVuY3Rpb24oZSl7dC5oYXNPd25Qcm9wZXJ0eShlKSYmKG5bZV09MSl9KSl9KSksRShuLChmdW5jdGlvbih0LG4pe3ZhciBpPSExO0UodGhpcy5zdGF0ZUxpc3QsKGZ1bmN0aW9uKHQpe2k9aXx8byhlLHQsbil8fG8oZS50YXJnZXQsdCxuKX0pLHRoaXMpLCFpJiZFKHRoaXMuc3RhdGVMaXN0LChmdW5jdGlvbih0KXsoZVt0XXx8KGVbdF09e30pKVtuXT1rRihuLCJpblJhbmdlIj09PXQ/ImFjdGl2ZSI6ImluYWN0aXZlIixyKX0pKX0pLHRoaXMpLHQucHJvdG90eXBlLmNvbXBsZXRlVmlzdWFsT3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuX3Jlc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLm9wdGlvbixpPXRoaXMuX3BpZWNlTGlzdCxyPShlP246dCkuc2VsZWN0ZWR8fHt9O2lmKG4uc2VsZWN0ZWQ9cixFKGksKGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRTZWxlY3RlZE1hcEtleSh0KTtyLmhhc093blByb3BlcnR5KG4pfHwocltuXT0hMCl9KSx0aGlzKSwic2luZ2xlIj09PW4uc2VsZWN0ZWRNb2RlKXt2YXIgbz0hMTtFKGksKGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRTZWxlY3RlZE1hcEtleSh0KTtyW25dJiYobz9yW25dPSExOm89ITApfSksdGhpcyl9fSxlLnByb3RvdHlwZS5nZXRJdGVtU3ltYm9sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJpdGVtU3ltYm9sIil9LGUucHJvdG90eXBlLmdldFNlbGVjdGVkTWFwS2V5PWZ1bmN0aW9uKHQpe3JldHVybiJjYXRlZ29yaWVzIj09PXRoaXMuX21vZGU/dC52YWx1ZSsiIjp0LmluZGV4KyIifSxlLnByb3RvdHlwZS5nZXRQaWVjZUxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGllY2VMaXN0fSxlLnByb3RvdHlwZS5fZGV0ZXJtaW5lTW9kZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uO3JldHVybiB0LnBpZWNlcyYmdC5waWVjZXMubGVuZ3RoPjA/InBpZWNlcyI6dGhpcy5vcHRpb24uY2F0ZWdvcmllcz8iY2F0ZWdvcmllcyI6InNwbGl0TnVtYmVyIn0sZS5wcm90b3R5cGUuc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uc2VsZWN0ZWQ9VCh0KX0sZS5wcm90b3R5cGUuZ2V0VmFsdWVTdGF0ZT1mdW5jdGlvbih0KXt2YXIgZT1rRC5maW5kUGllY2VJbmRleCh0LHRoaXMuX3BpZWNlTGlzdCk7cmV0dXJuIG51bGwhPWUmJnRoaXMub3B0aW9uLnNlbGVjdGVkW3RoaXMuZ2V0U2VsZWN0ZWRNYXBLZXkodGhpcy5fcGllY2VMaXN0W2VdKV0/ImluUmFuZ2UiOiJvdXRPZlJhbmdlIn0sZS5wcm90b3R5cGUuZmluZFRhcmdldERhdGFJbmRpY2VzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49dGhpcy5fcGllY2VMaXN0O3JldHVybiB0aGlzLmVhY2hUYXJnZXRTZXJpZXMoKGZ1bmN0aW9uKGkpe3ZhciByPVtdLG89aS5nZXREYXRhKCk7by5lYWNoKHRoaXMuZ2V0RGF0YURpbWVuc2lvbkluZGV4KG8pLChmdW5jdGlvbihlLGkpe2tELmZpbmRQaWVjZUluZGV4KGUsbik9PT10JiZyLnB1c2goaSl9KSx0aGlzKSxlLnB1c2goe3Nlcmllc0lkOmkuaWQsZGF0YUluZGV4OnJ9KX0pLHRoaXMpLGV9LGUucHJvdG90eXBlLmdldFJlcHJlc2VudFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHRoaXMuaXNDYXRlZ29yeSgpKWU9dC52YWx1ZTtlbHNlIGlmKG51bGwhPXQudmFsdWUpZT10LnZhbHVlO2Vsc2V7dmFyIG49dC5pbnRlcnZhbHx8W107ZT1uWzBdPT09LTEvMCYmblsxXT09PTEvMD8wOihuWzBdK25bMV0pLzJ9cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldFZpc3VhbE1ldGE9ZnVuY3Rpb24odCl7aWYoIXRoaXMuaXNDYXRlZ29yeSgpKXt2YXIgZT1bXSxuPVsiIiwiIl0saT10aGlzLHI9dGhpcy5fcGllY2VMaXN0LnNsaWNlKCk7aWYoci5sZW5ndGgpe3ZhciBvPXJbMF0uaW50ZXJ2YWxbMF07byE9PS0xLzAmJnIudW5zaGlmdCh7aW50ZXJ2YWw6Wy0xLzAsb119KSwobz1yW3IubGVuZ3RoLTFdLmludGVydmFsWzFdKSE9PTEvMCYmci5wdXNoKHtpbnRlcnZhbDpbbywxLzBdfSl9ZWxzZSByLnB1c2goe2ludGVydmFsOlstMS8wLDEvMF19KTt2YXIgYT0tMS8wO3JldHVybiBFKHIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuaW50ZXJ2YWw7ZSYmKGVbMF0+YSYmcyhbYSxlWzBdXSwib3V0T2ZSYW5nZSIpLHMoZS5zbGljZSgpKSxhPWVbMV0pfSksdGhpcykse3N0b3BzOmUsb3V0ZXJDb2xvcnM6bn19ZnVuY3Rpb24gcyhyLG8pe3ZhciBhPWkuZ2V0UmVwcmVzZW50VmFsdWUoe2ludGVydmFsOnJ9KTtvfHwobz1pLmdldFZhbHVlU3RhdGUoYSkpO3ZhciBzPXQoYSxvKTtyWzBdPT09LTEvMD9uWzBdPXM6clsxXT09PTEvMD9uWzFdPXM6ZS5wdXNoKHt2YWx1ZTpyWzBdLGNvbG9yOnN9LHt2YWx1ZTpyWzFdLGNvbG9yOnN9KX19LGUudHlwZT0idmlzdWFsTWFwLnBpZWNld2lzZSIsZS5kZWZhdWx0T3B0aW9uPWtjKFZGLmRlZmF1bHRPcHRpb24se3NlbGVjdGVkOm51bGwsbWluT3BlbjohMSxtYXhPcGVuOiExLGFsaWduOiJhdXRvIixpdGVtV2lkdGg6MjAsaXRlbUhlaWdodDoxNCxpdGVtU3ltYm9sOiJyb3VuZFJlY3QiLHBpZWNlczpudWxsLGNhdGVnb3JpZXM6bnVsbCxzcGxpdE51bWJlcjo1LHNlbGVjdGVkTW9kZToibXVsdGlwbGUiLGl0ZW1HYXA6MTAsaG92ZXJMaW5rOiEwfSksZX0oVkYpLGNHPXtzcGxpdE51bWJlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbixuPU1hdGgubWluKGUucHJlY2lzaW9uLDIwKSxpPXRoaXMuZ2V0RXh0ZW50KCkscj1lLnNwbGl0TnVtYmVyO3I9TWF0aC5tYXgocGFyc2VJbnQociwxMCksMSksZS5zcGxpdE51bWJlcj1yO2Zvcih2YXIgbz0oaVsxXS1pWzBdKS9yOytvLnRvRml4ZWQobikhPT1vJiZuPDU7KW4rKztlLnByZWNpc2lvbj1uLG89K28udG9GaXhlZChuKSxlLm1pbk9wZW4mJnQucHVzaCh7aW50ZXJ2YWw6Wy0xLzAsaVswXV0sY2xvc2U6WzAsMF19KTtmb3IodmFyIGE9MCxzPWlbMF07YTxyO3MrPW8sYSsrKXt2YXIgbD1hPT09ci0xP2lbMV06cytvO3QucHVzaCh7aW50ZXJ2YWw6W3MsbF0sY2xvc2U6WzEsMV19KX1lLm1heE9wZW4mJnQucHVzaCh7aW50ZXJ2YWw6W2lbMV0sMS8wXSxjbG9zZTpbMCwwXX0pLGdvKHQpLEUodCwoZnVuY3Rpb24odCxlKXt0LmluZGV4PWUsdC50ZXh0PXRoaXMuZm9ybWF0VmFsdWVUZXh0KHQuaW50ZXJ2YWwpfSksdGhpcyl9LGNhdGVnb3JpZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb247RShlLmNhdGVnb3JpZXMsKGZ1bmN0aW9uKGUpe3QucHVzaCh7dGV4dDp0aGlzLmZvcm1hdFZhbHVlVGV4dChlLCEwKSx2YWx1ZTplfSl9KSx0aGlzKSxwRyhlLHQpfSxwaWVjZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb247RShlLnBpZWNlcywoZnVuY3Rpb24oZSxuKXtxKGUpfHwoZT17dmFsdWU6ZX0pO3ZhciBpPXt0ZXh0OiIiLGluZGV4Om59O2lmKG51bGwhPWUubGFiZWwmJihpLnRleHQ9ZS5sYWJlbCksZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSl7dmFyIHI9aS52YWx1ZT1lLnZhbHVlO2kuaW50ZXJ2YWw9W3Iscl0saS5jbG9zZT1bMSwxXX1lbHNle2Zvcih2YXIgbz1pLmludGVydmFsPVtdLGE9aS5jbG9zZT1bMCwwXSxzPVsxLDAsMV0sbD1bLTEvMCwxLzBdLHU9W10saD0wO2g8MjtoKyspe2Zvcih2YXIgYz1bWyJndGUiLCJndCIsIm1pbiJdLFsibHRlIiwibHQiLCJtYXgiXV1baF0scD0wO3A8MyYmbnVsbD09b1toXTtwKyspb1toXT1lW2NbcF1dLGFbaF09c1twXSx1W2hdPTI9PT1wO251bGw9PW9baF0mJihvW2hdPWxbaF0pfXVbMF0mJm9bMV09PT0xLzAmJihhWzBdPTApLHVbMV0mJm9bMF09PT0tMS8wJiYoYVsxXT0wKSxvWzBdPT09b1sxXSYmYVswXSYmYVsxXSYmKGkudmFsdWU9b1swXSl9aS52aXN1YWw9a0QucmV0cmlldmVWaXN1YWxzKGUpLHQucHVzaChpKX0pLHRoaXMpLHBHKGUsdCksZ28odCksRSh0LChmdW5jdGlvbih0KXt2YXIgZT10LmNsb3NlLG49W1siPCIsIuKJpCJdW2VbMV1dLFsiPiIsIuKJpSJdW2VbMF1dXTt0LnRleHQ9dC50ZXh0fHx0aGlzLmZvcm1hdFZhbHVlVGV4dChudWxsIT10LnZhbHVlP3QudmFsdWU6dC5pbnRlcnZhbCwhMSxuKX0pLHRoaXMpfX07ZnVuY3Rpb24gcEcodCxlKXt2YXIgbj10LmludmVyc2U7KCJ2ZXJ0aWNhbCI9PT10Lm9yaWVudD8hbjpuKSYmZS5yZXZlcnNlKCl9dmFyIGRHPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4udHlwZT1lLnR5cGUsbn1yZXR1cm4gbihlLHQpLGUucHJvdG90eXBlLmRvUmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncm91cDt0LnJlbW92ZUFsbCgpO3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWwsbj1lLmdldCgidGV4dEdhcCIpLGk9ZS50ZXh0U3R5bGVNb2RlbCxyPWkuZ2V0Rm9udCgpLG89aS5nZXRUZXh0Q29sb3IoKSxhPXRoaXMuX2dldEl0ZW1BbGlnbigpLHM9ZS5pdGVtU2l6ZSxsPXRoaXMuX2dldFZpZXdEYXRhKCksdT1sLmVuZHNUZXh0LGg9aXQoZS5nZXQoInNob3dMYWJlbCIsITApLCF1KTt1JiZ0aGlzLl9yZW5kZXJFbmRzVGV4dCh0LHVbMF0scyxoLGEpLEUobC52aWV3UGllY2VMaXN0LChmdW5jdGlvbihpKXt2YXIgbD1pLnBpZWNlLHU9bmV3IEJyO3Uub25jbGljaz1XKHRoaXMuX29uSXRlbUNsaWNrLHRoaXMsbCksdGhpcy5fZW5hYmxlSG92ZXJMaW5rKHUsaS5pbmRleEluTW9kZWxQaWVjZUxpc3QpO3ZhciBjPWUuZ2V0UmVwcmVzZW50VmFsdWUobCk7aWYodGhpcy5fY3JlYXRlSXRlbVN5bWJvbCh1LGMsWzAsMCxzWzBdLHNbMV1dKSxoKXt2YXIgcD10aGlzLnZpc3VhbE1hcE1vZGVsLmdldFZhbHVlU3RhdGUoYyk7dS5hZGQobmV3IFhzKHtzdHlsZTp7eDoicmlnaHQiPT09YT8tbjpzWzBdK24seTpzWzFdLzIsdGV4dDpsLnRleHQsdmVydGljYWxBbGlnbjoibWlkZGxlIixhbGlnbjphLGZvbnQ6cixmaWxsOm8sb3BhY2l0eToib3V0T2ZSYW5nZSI9PT1wPy41OjF9fSkpfXQuYWRkKHUpfSksdGhpcyksdSYmdGhpcy5fcmVuZGVyRW5kc1RleHQodCx1WzFdLHMsaCxhKSxBcChlLmdldCgib3JpZW50IiksdCxlLmdldCgiaXRlbUdhcCIpKSx0aGlzLnJlbmRlckJhY2tncm91bmQodCksdGhpcy5wb3NpdGlvbkdyb3VwKHQpfSxlLnByb3RvdHlwZS5fZW5hYmxlSG92ZXJMaW5rPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt0Lm9uKCJtb3VzZW92ZXIiLChmdW5jdGlvbigpe3JldHVybiBpKCJoaWdobGlnaHQiKX0pKS5vbigibW91c2VvdXQiLChmdW5jdGlvbigpe3JldHVybiBpKCJkb3ducGxheSIpfSkpO3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciBpPW4udmlzdWFsTWFwTW9kZWw7aS5vcHRpb24uaG92ZXJMaW5rJiZuLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZTp0LGJhdGNoOlhGKGkuZmluZFRhcmdldERhdGFJbmRpY2VzKGUpLGkpfSl9fSxlLnByb3RvdHlwZS5fZ2V0SXRlbUFsaWduPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aXN1YWxNYXBNb2RlbCxlPXQub3B0aW9uO2lmKCJ2ZXJ0aWNhbCI9PT1lLm9yaWVudClyZXR1cm4gWUYodCx0aGlzLmFwaSx0Lml0ZW1TaXplKTt2YXIgbj1lLmFsaWduO3JldHVybiBuJiYiYXV0byIhPT1ufHwobj0ibGVmdCIpLG59LGUucHJvdG90eXBlLl9yZW5kZXJFbmRzVGV4dD1mdW5jdGlvbih0LGUsbixpLHIpe2lmKGUpe3ZhciBvPW5ldyBCcixhPXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWw7by5hZGQobmV3IFhzKHtzdHlsZTpvYyhhLHt4Omk/InJpZ2h0Ij09PXI/blswXTowOm5bMF0vMix5Om5bMV0vMix2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGFsaWduOmk/cjoiY2VudGVyIix0ZXh0OmV9KX0pKSx0LmFkZChvKX19LGUucHJvdG90eXBlLl9nZXRWaWV3RGF0YT1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmlzdWFsTWFwTW9kZWwsZT16KHQuZ2V0UGllY2VMaXN0KCksKGZ1bmN0aW9uKHQsZSl7cmV0dXJue3BpZWNlOnQsaW5kZXhJbk1vZGVsUGllY2VMaXN0OmV9fSkpLG49dC5nZXQoInRleHQiKSxpPXQuZ2V0KCJvcmllbnQiKSxyPXQuZ2V0KCJpbnZlcnNlIik7cmV0dXJuKCJob3Jpem9udGFsIj09PWk/cjohcik/ZS5yZXZlcnNlKCk6biYmKG49bi5zbGljZSgpLnJldmVyc2UoKSkse3ZpZXdQaWVjZUxpc3Q6ZSxlbmRzVGV4dDpufX0sZS5wcm90b3R5cGUuX2NyZWF0ZUl0ZW1TeW1ib2w9ZnVuY3Rpb24odCxlLG4pe3QuYWRkKFh5KHRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbChlLCJzeW1ib2wiKSxuWzBdLG5bMV0sblsyXSxuWzNdLHRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbChlLCJjb2xvciIpKSl9LGUucHJvdG90eXBlLl9vbkl0ZW1DbGljaz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpc3VhbE1hcE1vZGVsLG49ZS5vcHRpb24saT1uLnNlbGVjdGVkTW9kZTtpZihpKXt2YXIgcj1UKG4uc2VsZWN0ZWQpLG89ZS5nZXRTZWxlY3RlZE1hcEtleSh0KTsic2luZ2xlIj09PWl8fCEwPT09aT8ocltvXT0hMCxFKHIsKGZ1bmN0aW9uKHQsZSl7cltlXT1lPT09b30pKSk6cltvXT0hcltvXSx0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToic2VsZWN0RGF0YVJhbmdlIixmcm9tOnRoaXMudWlkLHZpc3VhbE1hcElkOnRoaXMudmlzdWFsTWFwTW9kZWwuaWQsc2VsZWN0ZWQ6cn0pfX0sZS50eXBlPSJ2aXN1YWxNYXAucGllY2V3aXNlIixlfShXRik7ZnVuY3Rpb24gZkcodCl7dC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKGhHKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhkRyksbEcodCl9dmFyIGdHPXtsYWJlbDp7ZW5hYmxlZDohMH0sZGVjYWw6e3Nob3c6ITF9fSx5Rz1WbygpLHZHPXt9O2Z1bmN0aW9uIG1HKHQsZSl7dmFyIG49dC5nZXRNb2RlbCgiYXJpYSIpO2lmKG4uZ2V0KCJlbmFibGVkIikpe3ZhciBpPVQoZ0cpO0MoaS5sYWJlbCx0LmdldExvY2FsZU1vZGVsKCkuZ2V0KCJhcmlhIiksITEpLEMobi5vcHRpb24saSwhMSksZnVuY3Rpb24oKXtpZihuLmdldE1vZGVsKCJkZWNhbCIpLmdldCgic2hvdyIpKXt2YXIgZT15dCgpO3QuZWFjaFNlcmllcygoZnVuY3Rpb24odCl7aWYoIXQuaXNDb2xvckJ5U2VyaWVzKCkpe3ZhciBuPWUuZ2V0KHQudHlwZSk7bnx8KG49e30sZS5zZXQodC50eXBlLG4pKSx5Ryh0KS5zY29wZT1ufX0pKSx0LmVhY2hSYXdTZXJpZXMoKGZ1bmN0aW9uKGUpe2lmKCF0LmlzU2VyaWVzRmlsdGVyZWQoZSkpaWYoWChlLmVuYWJsZUFyaWFEZWNhbCkpZS5lbmFibGVBcmlhRGVjYWwoKTtlbHNle3ZhciBuPWUuZ2V0RGF0YSgpO2lmKGUuaXNDb2xvckJ5U2VyaWVzKCkpe3ZhciBpPXBkKGUuZWNNb2RlbCxlLm5hbWUsdkcsdC5nZXRTZXJpZXNDb3VudCgpKSxyPW4uZ2V0VmlzdWFsKCJkZWNhbCIpO24uc2V0VmlzdWFsKCJkZWNhbCIsdShyLGkpKX1lbHNle3ZhciBvPWUuZ2V0UmF3RGF0YSgpLGE9e30scz15RyhlKS5zY29wZTtuLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPW4uZ2V0UmF3SW5kZXgodCk7YVtlXT10fSkpO3ZhciBsPW8uY291bnQoKTtvLmVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPWFbdF0scj1vLmdldE5hbWUodCl8fHQrIiIsaD1wZChlLmVjTW9kZWwscixzLGwpLGM9bi5nZXRJdGVtVmlzdWFsKGksImRlY2FsIik7bi5zZXRJdGVtVmlzdWFsKGksImRlY2FsIix1KGMsaCkpfSkpfX1mdW5jdGlvbiB1KHQsZSl7dmFyIG49dD9BKEEoe30sZSksdCk6ZTtyZXR1cm4gbi5kaXJ0eT0hMCxufX0pKX19KCksZnVuY3Rpb24oKXt2YXIgaT1lLmdldFpyKCkuZG9tO2lmKCFpKXJldHVybjt2YXIgbz10LmdldExvY2FsZU1vZGVsKCkuZ2V0KCJhcmlhIiksYT1uLmdldE1vZGVsKCJsYWJlbCIpO2lmKGEub3B0aW9uPWsoYS5vcHRpb24sbyksIWEuZ2V0KCJlbmFibGVkIikpcmV0dXJuO2lmKGEuZ2V0KCJkZXNjcmlwdGlvbiIpKXJldHVybiB2b2lkIGkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixhLmdldCgiZGVzY3JpcHRpb24iKSk7dmFyIHMsbD10LmdldFNlcmllc0NvdW50KCksdT1hLmdldChbImRhdGEiLCJtYXhDb3VudCJdKXx8MTAsaD1hLmdldChbInNlcmllcyIsIm1heENvdW50Il0pfHwxMCxjPU1hdGgubWluKGwsaCk7aWYobDwxKXJldHVybjt2YXIgcD1mdW5jdGlvbigpe3ZhciBlPXQuZ2V0KCJ0aXRsZSIpO2UmJmUubGVuZ3RoJiYoZT1lWzBdKTtyZXR1cm4gZSYmZS50ZXh0fSgpO3M9cD9yKGEuZ2V0KFsiZ2VuZXJhbCIsIndpdGhUaXRsZSJdKSx7dGl0bGU6cH0pOmEuZ2V0KFsiZ2VuZXJhbCIsIndpdGhvdXRUaXRsZSJdKTt2YXIgZD1bXTtzKz1yKGw+MT9hLmdldChbInNlcmllcyIsIm11bHRpcGxlIiwicHJlZml4Il0pOmEuZ2V0KFsic2VyaWVzIiwic2luZ2xlIiwicHJlZml4Il0pLHtzZXJpZXNDb3VudDpsfSksdC5lYWNoU2VyaWVzKChmdW5jdGlvbihlLG4pe2lmKG48Yyl7dmFyIGk9dm9pZCAwLG89ZS5nZXQoIm5hbWUiKT8id2l0aE5hbWUiOiJ3aXRob3V0TmFtZSI7aT1yKGk9bD4xP2EuZ2V0KFsic2VyaWVzIiwibXVsdGlwbGUiLG9dKTphLmdldChbInNlcmllcyIsInNpbmdsZSIsb10pLHtzZXJpZXNJZDplLnNlcmllc0luZGV4LHNlcmllc05hbWU6ZS5nZXQoIm5hbWUiKSxzZXJpZXNUeXBlOih4PWUuc3ViVHlwZSxfPXQuZ2V0TG9jYWxlTW9kZWwoKS5nZXQoWyJzZXJpZXMiLCJ0eXBlTmFtZXMiXSksX1t4XXx8Xy5jaGFydCl9KTt2YXIgcz1lLmdldERhdGEoKTtpZihzLmNvdW50KCk+dSlpKz1yKGEuZ2V0KFsiZGF0YSIsInBhcnRpYWxEYXRhIl0pLHtkaXNwbGF5Q250OnV9KTtlbHNlIGkrPWEuZ2V0KFsiZGF0YSIsImFsbERhdGEiXSk7Zm9yKHZhciBoPWEuZ2V0KFsiZGF0YSIsInNlcGFyYXRvciIsIm1pZGRsZSJdKSxwPWEuZ2V0KFsiZGF0YSIsInNlcGFyYXRvciIsImVuZCJdKSxmPVtdLGc9MDtnPHMuY291bnQoKTtnKyspaWYoZzx1KXt2YXIgeT1zLmdldE5hbWUoZyksdj1zLmdldFZhbHVlcyhnKSxtPWEuZ2V0KFsiZGF0YSIseT8id2l0aE5hbWUiOiJ3aXRob3V0TmFtZSJdKTtmLnB1c2gocihtLHtuYW1lOnksdmFsdWU6di5qb2luKGgpfSkpfWkrPWYuam9pbihoKStwLGQucHVzaChpKX12YXIgeCxffSkpO3ZhciBmPWEuZ2V0TW9kZWwoWyJzZXJpZXMiLCJtdWx0aXBsZSIsInNlcGFyYXRvciJdKSxnPWYuZ2V0KCJtaWRkbGUiKSx5PWYuZ2V0KCJlbmQiKTtzKz1kLmpvaW4oZykreSxpLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIscyl9KCl9ZnVuY3Rpb24gcih0LGUpe2lmKCFVKHQpKXJldHVybiB0O3ZhciBuPXQ7cmV0dXJuIEUoZSwoZnVuY3Rpb24odCxlKXtuPW4ucmVwbGFjZShuZXcgUmVnRXhwKCJcXHtcXHMqIitlKyJcXHMqXFx9IiwiZyIpLHQpfSkpLG59fWZ1bmN0aW9uIHhHKHQpe2lmKHQmJnQuYXJpYSl7dmFyIGU9dC5hcmlhO251bGwhPWUuc2hvdyYmKGUuZW5hYmxlZD1lLnNob3cpLGUubGFiZWw9ZS5sYWJlbHx8e30sRShbImRlc2NyaXB0aW9uIiwiZ2VuZXJhbCIsInNlcmllcyIsImRhdGEiXSwoZnVuY3Rpb24odCl7bnVsbCE9ZVt0XSYmKGUubGFiZWxbdF09ZVt0XSl9KSl9fXZhciBfRz17dmFsdWU6ImVxIiwiPCI6Imx0IiwiPD0iOiJsdGUiLCI+IjoiZ3QiLCI+PSI6Imd0ZSIsIj0iOiJlcSIsIiE9IjoibmUiLCI8PiI6Im5lIn0sYkc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe2lmKG51bGw9PSh0aGlzLl9jb25kVmFsPVUodCk/bmV3IFJlZ0V4cCh0KTpldCh0KT90Om51bGwpKXt2YXIgZT0iIjswLHdvKGUpfX1yZXR1cm4gdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIFUoZSk/dGhpcy5fY29uZFZhbC50ZXN0KHQpOiEhaihlKSYmdGhpcy5fY29uZFZhbC50ZXN0KHQrIiIpfSx0fSgpLHdHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sdH0oKSxTRz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuY2hpbGRyZW4sZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCF0W2VdLmV2YWx1YXRlKCkpcmV0dXJuITE7cmV0dXJuITB9LHR9KCksTUc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmNoaWxkcmVuLGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdLmV2YWx1YXRlKCkpcmV0dXJuITA7cmV0dXJuITF9LHR9KCksSUc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLmNoaWxkLmV2YWx1YXRlKCl9LHR9KCksVEc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD0hIXRoaXMudmFsdWVQYXJzZXIsZT0oMCx0aGlzLmdldFZhbHVlKSh0aGlzLnZhbHVlR2V0dGVyUGFyYW0pLG49dD90aGlzLnZhbHVlUGFyc2VyKGUpOm51bGwsaT0wO2k8dGhpcy5zdWJDb25kTGlzdC5sZW5ndGg7aSsrKWlmKCF0aGlzLnN1YkNvbmRMaXN0W2ldLmV2YWx1YXRlKHQ/bjplKSlyZXR1cm4hMTtyZXR1cm4hMH0sdH0oKTtmdW5jdGlvbiBDRyh0LGUpe2lmKCEwPT09dHx8ITE9PT10KXt2YXIgbj1uZXcgd0c7cmV0dXJuIG4udmFsdWU9dCxufXZhciBpPSIiO3JldHVybiBBRyh0KXx8d28oaSksdC5hbmQ/REcoImFuZCIsdCxlKTp0Lm9yP0RHKCJvciIsdCxlKTp0Lm5vdD9mdW5jdGlvbih0LGUpe3ZhciBuPXQubm90LGk9IiI7MDtBRyhuKXx8d28oaSk7dmFyIHI9bmV3IElHO3IuY2hpbGQ9Q0cobixlKSxyLmNoaWxkfHx3byhpKTtyZXR1cm4gcn0odCxlKTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0iIixpPWUucHJlcGFyZUdldFZhbHVlKHQpLHI9W10sbz1HKHQpLGE9dC5wYXJzZXIscz1hP0NmKGEpOm51bGwsbD0wO2w8by5sZW5ndGg7bCsrKXt2YXIgdT1vW2xdO2lmKCJwYXJzZXIiIT09dSYmIWUudmFsdWVHZXR0ZXJBdHRyTWFwLmdldCh1KSl7dmFyIGg9X3QoX0csdSk/X0dbdV06dSxjPXRbdV0scD1zP3MoYyk6YyxkPVBmKGgscCl8fCJyZWciPT09aCYmbmV3IGJHKHApO2R8fHdvKG4pLHIucHVzaChkKX19ci5sZW5ndGh8fHdvKG4pO3ZhciBmPW5ldyBURztyZXR1cm4gZi52YWx1ZUdldHRlclBhcmFtPWksZi52YWx1ZVBhcnNlcj1zLGYuZ2V0VmFsdWU9ZS5nZXRWYWx1ZSxmLnN1YkNvbmRMaXN0PXIsZn0odCxlKX1mdW5jdGlvbiBERyh0LGUsbil7dmFyIGk9ZVt0XSxyPSIiO1koaSl8fHdvKHIpLGkubGVuZ3RofHx3byhyKTt2YXIgbz0iYW5kIj09PXQ/bmV3IFNHOm5ldyBNRztyZXR1cm4gby5jaGlsZHJlbj16KGksKGZ1bmN0aW9uKHQpe3JldHVybiBDRyh0LG4pfSkpLG8uY2hpbGRyZW4ubGVuZ3RofHx3byhyKSxvfWZ1bmN0aW9uIEFHKHQpe3JldHVybiBxKHQpJiYhTih0KX12YXIga0c9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fY29uZD1DRyh0LGUpfXJldHVybiB0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb25kLmV2YWx1YXRlKCl9LHR9KCk7dmFyIExHPXt0eXBlOiJlY2hhcnRzOmZpbHRlciIsdHJhbnNmb3JtOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLGkscj10LnVwc3RyZWFtLG89KG49dC5jb25maWcsaT17dmFsdWVHZXR0ZXJBdHRyTWFwOnl0KHtkaW1lbnNpb246ITB9KSxwcmVwYXJlR2V0VmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IiIsbj10LmRpbWVuc2lvbjtfdCh0LCJkaW1lbnNpb24iKXx8d28oZSk7dmFyIGk9ci5nZXREaW1lbnNpb25JbmZvKG4pO3JldHVybiBpfHx3byhlKSx7ZGltSWR4OmkuaW5kZXh9fSxnZXRWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gci5yZXRyaWV2ZVZhbHVlRnJvbUl0ZW0oZSx0LmRpbUlkeCl9fSxuZXcga0cobixpKSksYT1bXSxzPTAsbD1yLmNvdW50KCk7czxsO3MrKyllPXIuZ2V0UmF3RGF0YUl0ZW0ocyksby5ldmFsdWF0ZSgpJiZhLnB1c2goZSk7cmV0dXJue2RhdGE6YX19fTt2YXIgUEc9e3R5cGU6ImVjaGFydHM6c29ydCIsdHJhbnNmb3JtOmZ1bmN0aW9uKHQpe3ZhciBlPXQudXBzdHJlYW0sbj10LmNvbmZpZyxpPSIiLHI9VG8obik7ci5sZW5ndGh8fHdvKGkpO3ZhciBvPVtdO0UociwoZnVuY3Rpb24odCl7dmFyIG49dC5kaW1lbnNpb24scj10Lm9yZGVyLGE9dC5wYXJzZXIscz10LmluY29tcGFyYWJsZTtpZihudWxsPT1uJiZ3byhpKSwiYXNjIiE9PXImJiJkZXNjIiE9PXImJndvKGkpLHMmJiJtaW4iIT09cyYmIm1heCIhPT1zKXt2YXIgbD0iIjswLHdvKGwpfWlmKCJhc2MiIT09ciYmImRlc2MiIT09cil7dmFyIHU9IiI7MCx3byh1KX12YXIgaD1lLmdldERpbWVuc2lvbkluZm8obik7aHx8d28oaSk7dmFyIGM9YT9DZihhKTpudWxsO2EmJiFjJiZ3byhpKSxvLnB1c2goe2RpbUlkeDpoLmluZGV4LHBhcnNlcjpjLGNvbXBhcmF0b3I6bmV3IGtmKHIscyl9KX0pKTt2YXIgYT1lLnNvdXJjZUZvcm1hdDthIT09SHAmJmEhPT1ZcCYmd28oaSk7Zm9yKHZhciBzPVtdLGw9MCx1PWUuY291bnQoKTtsPHU7bCsrKXMucHVzaChlLmdldFJhd0RhdGFJdGVtKGwpKTtyZXR1cm4gcy5zb3J0KChmdW5jdGlvbih0LG4pe2Zvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKXt2YXIgcj1vW2ldLGE9ZS5yZXRyaWV2ZVZhbHVlRnJvbUl0ZW0odCxyLmRpbUlkeCkscz1lLnJldHJpZXZlVmFsdWVGcm9tSXRlbShuLHIuZGltSWR4KTtyLnBhcnNlciYmKGE9ci5wYXJzZXIoYSkscz1yLnBhcnNlcihzKSk7dmFyIGw9ci5jb21wYXJhdG9yLmV2YWx1YXRlKGEscyk7aWYoMCE9PWwpcmV0dXJuIGx9cmV0dXJuIDB9KSkse2RhdGE6c319fTt2YXIgT0c9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS50eXBlPSJkYXRhc2V0IixlfXJldHVybiBuKGUsdCksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlLG4saSl7dC5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMsZSxuLGkpLHRoaXMuX3NvdXJjZU1hbmFnZXI9bmV3ICRmKHRoaXMpLEpmKHRoaXMpfSxlLnByb3RvdHlwZS5tZXJnZU9wdGlvbj1mdW5jdGlvbihlLG4pe3QucHJvdG90eXBlLm1lcmdlT3B0aW9uLmNhbGwodGhpcyxlLG4pLEpmKHRoaXMpfSxlLnByb3RvdHlwZS5vcHRpb25VcGRhdGVkPWZ1bmN0aW9uKCl7dGhpcy5fc291cmNlTWFuYWdlci5kaXJ0eSgpfSxlLnByb3RvdHlwZS5nZXRTb3VyY2VNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXJjZU1hbmFnZXJ9LGUudHlwZT0iZGF0YXNldCIsZS5kZWZhdWx0T3B0aW9uPXtzZXJpZXNMYXlvdXRCeTpqcH0sZX0oenApLFJHPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUudHlwZT0iZGF0YXNldCIsZX1yZXR1cm4gbihlLHQpLGUudHlwZT0iZGF0YXNldCIsZX0oQWcpO3ZhciBORz1ocy5DTUQ7ZnVuY3Rpb24gRUcodCxlKXtyZXR1cm4gTWF0aC5hYnModC1lKTwxZS01fWZ1bmN0aW9uIHpHKHQpe3ZhciBlLG4saSxyLG8sYT10LmRhdGEscz10LmxlbigpLGw9W10sdT0wLGg9MCxjPTAscD0wO2Z1bmN0aW9uIGQodCxuKXtlJiZlLmxlbmd0aD4yJiZsLnB1c2goZSksZT1bdCxuXX1mdW5jdGlvbiBmKHQsbixpLHIpe0VHKHQsaSkmJkVHKG4scil8fGUucHVzaCh0LG4saSxyLGkscil9ZnVuY3Rpb24gZyh0LG4saSxyLG8sYSl7dmFyIHM9TWF0aC5hYnMobi10KSxsPTQqTWF0aC50YW4ocy80KS8zLHU9bjx0Py0xOjEsaD1NYXRoLmNvcyh0KSxjPU1hdGguc2luKHQpLHA9TWF0aC5jb3MobiksZD1NYXRoLnNpbihuKSxmPWgqbytpLGc9YyphK3IseT1wKm8raSx2PWQqYStyLG09bypsKnUseD1hKmwqdTtlLnB1c2goZi1tKmMsZyt4KmgseSttKmQsdi14KnAseSx2KX1mb3IodmFyIHk9MDt5PHM7KXt2YXIgdj1hW3krK10sbT0xPT09eTtzd2l0Y2gobSYmKGM9dT1hW3ldLHA9aD1hW3krMV0sdiE9PU5HLkwmJnYhPT1ORy5DJiZ2IT09TkcuUXx8KGU9W2MscF0pKSx2KXtjYXNlIE5HLk06dT1jPWFbeSsrXSxoPXA9YVt5KytdLGQoYyxwKTticmVhaztjYXNlIE5HLkw6Zih1LGgsbj1hW3krK10saT1hW3krK10pLHU9bixoPWk7YnJlYWs7Y2FzZSBORy5DOmUucHVzaChhW3krK10sYVt5KytdLGFbeSsrXSxhW3krK10sdT1hW3krK10saD1hW3krK10pO2JyZWFrO2Nhc2UgTkcuUTpuPWFbeSsrXSxpPWFbeSsrXSxyPWFbeSsrXSxvPWFbeSsrXSxlLnB1c2godSsyLzMqKG4tdSksaCsyLzMqKGktaCkscisyLzMqKG4tciksbysyLzMqKGktbykscixvKSx1PXIsaD1vO2JyZWFrO2Nhc2UgTkcuQTp2YXIgeD1hW3krK10sXz1hW3krK10sYj1hW3krK10sdz1hW3krK10sUz1hW3krK10sTT1hW3krK10rUzt5Kz0xO3ZhciBJPSFhW3krK107bj1NYXRoLmNvcyhTKSpiK3gsaT1NYXRoLnNpbihTKSp3K18sbT9kKGM9bixwPWkpOmYodSxoLG4saSksdT1NYXRoLmNvcyhNKSpiK3gsaD1NYXRoLnNpbihNKSp3K187Zm9yKHZhciBUPShJPy0xOjEpKk1hdGguUEkvMixDPVM7ST9DPk06QzxNO0MrPVQpe2coQyxJP01hdGgubWF4KEMrVCxNKTpNYXRoLm1pbihDK1QsTSkseCxfLGIsdyl9YnJlYWs7Y2FzZSBORy5SOmM9dT1hW3krK10scD1oPWFbeSsrXSxuPWMrYVt5KytdLGk9cCthW3krK10sZChuLHApLGYobixwLG4saSksZihuLGksYyxpKSxmKGMsaSxjLHApLGYoYyxwLG4scCk7YnJlYWs7Y2FzZSBORy5aOmUmJmYodSxoLGMscCksdT1jLGg9cH19cmV0dXJuIGUmJmUubGVuZ3RoPjImJmwucHVzaChlKSxsfWZ1bmN0aW9uIFZHKHQsZSxuLGkscixvLGEscyxsLHUpe2lmKEVHKHQsbikmJkVHKGUsaSkmJkVHKHIsYSkmJkVHKG8scykpbC5wdXNoKGEscyk7ZWxzZXt2YXIgaD0yL3UsYz1oKmgscD1hLXQsZD1zLWUsZj1NYXRoLnNxcnQocCpwK2QqZCk7cC89ZixkLz1mO3ZhciBnPW4tdCx5PWktZSx2PXItYSxtPW8tcyx4PWcqZyt5KnksXz12KnYrbSptO2lmKHg8YyYmXzxjKWwucHVzaChhLHMpO2Vsc2V7dmFyIGI9cCpnK2QqeSx3PS1wKnYtZCptO2lmKHgtYipiPGMmJmI+PTAmJl8tdyp3PGMmJnc+PTApbC5wdXNoKGEscyk7ZWxzZXt2YXIgUz1bXSxNPVtdO3duKHQsbixyLGEsLjUsUyksd24oZSxpLG8scywuNSxNKSxWRyhTWzBdLE1bMF0sU1sxXSxNWzFdLFNbMl0sTVsyXSxTWzNdLE1bM10sbCx1KSxWRyhTWzRdLE1bNF0sU1s1XSxNWzVdLFNbNl0sTVs2XSxTWzddLE1bN10sbCx1KX19fX1mdW5jdGlvbiBCRyh0LGUsbil7dmFyIGk9dFtlXSxyPXRbMS1lXSxvPU1hdGguYWJzKGkvciksYT1NYXRoLmNlaWwoTWF0aC5zcXJ0KG8qbikpLHM9TWF0aC5mbG9vcihuL2EpOzA9PT1zJiYocz0xLGE9bik7Zm9yKHZhciBsPVtdLHU9MDt1PGE7dSsrKWwucHVzaChzKTt2YXIgaD1uLWEqcztpZihoPjApZm9yKHU9MDt1PGg7dSsrKWxbdSVhXSs9MTtyZXR1cm4gbH1mdW5jdGlvbiBGRyh0LGUsbil7Zm9yKHZhciBpPXQucjAscj10LnIsbz10LnN0YXJ0QW5nbGUsYT10LmVuZEFuZ2xlLHM9TWF0aC5hYnMoYS1vKSxsPXMqcix1PXItaSxoPWw+TWF0aC5hYnModSksYz1CRyhbbCx1XSxoPzA6MSxlKSxwPShoP3M6dSkvYy5sZW5ndGgsZD0wO2Q8Yy5sZW5ndGg7ZCsrKWZvcih2YXIgZj0oaD91OnMpL2NbZF0sZz0wO2c8Y1tkXTtnKyspe3ZhciB5PXt9O2g/KHkuc3RhcnRBbmdsZT1vK3AqZCx5LmVuZEFuZ2xlPW8rcCooZCsxKSx5LnIwPWkrZipnLHkucj1pK2YqKGcrMSkpOih5LnN0YXJ0QW5nbGU9bytmKmcseS5lbmRBbmdsZT1vK2YqKGcrMSkseS5yMD1pK3AqZCx5LnI9aStwKihkKzEpKSx5LmNsb2Nrd2lzZT10LmNsb2Nrd2lzZSx5LmN4PXQuY3gseS5jeT10LmN5LG4ucHVzaCh5KX19ZnVuY3Rpb24gR0codCxlLG4saSl7cmV0dXJuIHQqaS1uKmV9ZnVuY3Rpb24gV0codCxlLG4saSxyLG8sYSxzKXt2YXIgbD1uLXQsdT1pLWUsaD1hLXIsYz1zLW8scD1HRyhoLGMsbCx1KTtpZihNYXRoLmFicyhwKTwxZS02KXJldHVybiBudWxsO3ZhciBkPUdHKHQtcixlLW8saCxjKS9wO3JldHVybiBkPDB8fGQ+MT9udWxsOm5ldyBEZShkKmwrdCxkKnUrZSl9ZnVuY3Rpb24gSEcodCxlLG4pe3ZhciBpPW5ldyBEZTtEZS5zdWIoaSxuLGUpLGkubm9ybWFsaXplKCk7dmFyIHI9bmV3IERlO3JldHVybiBEZS5zdWIocix0LGUpLHIuZG90KGkpfWZ1bmN0aW9uIFlHKHQsZSl7dmFyIG49dFt0Lmxlbmd0aC0xXTtuJiZuWzBdPT09ZVswXSYmblsxXT09PWVbMV18fHQucHVzaChlKX1mdW5jdGlvbiBYRyh0KXt2YXIgZT10LnBvaW50cyxuPVtdLGk9W107QmEoZSxuLGkpO3ZhciByPW5ldyB6ZShuWzBdLG5bMV0saVswXS1uWzBdLGlbMV0tblsxXSksbz1yLndpZHRoLGE9ci5oZWlnaHQscz1yLngsbD1yLnksdT1uZXcgRGUsaD1uZXcgRGU7cmV0dXJuIG8+YT8odS54PWgueD1zK28vMix1Lnk9bCxoLnk9bCthKToodS55PWgueT1sK2EvMix1Lng9cyxoLng9cytvKSxmdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPXQubGVuZ3RoLHI9W10sbz0wO288aTtvKyspe3ZhciBhPXRbb10scz10WyhvKzEpJWldLGw9V0coYVswXSxhWzFdLHNbMF0sc1sxXSxlLngsZS55LG4ueCxuLnkpO2wmJnIucHVzaCh7cHJvalB0OkhHKGwsZSxuKSxwdDpsLGlkeDpvfSl9aWYoci5sZW5ndGg8MilyZXR1cm5be3BvaW50czp0fSx7cG9pbnRzOnR9XTtyLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHJvalB0LWUucHJvalB0fSkpO3ZhciB1PXJbMF0saD1yW3IubGVuZ3RoLTFdO2lmKGguaWR4PHUuaWR4KXt2YXIgYz11O3U9aCxoPWN9dmFyIHA9W3UucHQueCx1LnB0LnldLGQ9W2gucHQueCxoLnB0LnldLGY9W3BdLGc9W2RdO2ZvcihvPXUuaWR4KzE7bzw9aC5pZHg7bysrKVlHKGYsdFtvXS5zbGljZSgpKTtmb3IoWUcoZixkKSxZRyhmLHApLG89aC5pZHgrMTtvPD11LmlkeCtpO28rKylZRyhnLHRbbyVpXS5zbGljZSgpKTtyZXR1cm4gWUcoZyxwKSxZRyhnLGQpLFt7cG9pbnRzOmZ9LHtwb2ludHM6Z31dfShlLHUsaCl9ZnVuY3Rpb24gVUcodCxlLG4saSl7aWYoMT09PW4paS5wdXNoKGUpO2Vsc2V7dmFyIHI9TWF0aC5mbG9vcihuLzIpLG89dChlKTtVRyh0LG9bMF0scixpKSxVRyh0LG9bMV0sbi1yLGkpfXJldHVybiBpfWZ1bmN0aW9uIFpHKHQsZSl7ZS5zZXRTdHlsZSh0LnN0eWxlKSxlLno9dC56LGUuejI9dC56MixlLnpsZXZlbD10LnpsZXZlbH1mdW5jdGlvbiBqRyh0LGUpe3ZhciBuLGk9W10scj10LnNoYXBlO3N3aXRjaCh0LnR5cGUpe2Nhc2UicmVjdCI6IWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dC53aWR0aCxyPXQuaGVpZ2h0LG89aT5yLGE9QkcoW2kscl0sbz8wOjEsZSkscz1vPyJ3aWR0aCI6ImhlaWdodCIsbD1vPyJoZWlnaHQiOiJ3aWR0aCIsdT1vPyJ4IjoieSIsaD1vPyJ5IjoieCIsYz10W3NdL2EubGVuZ3RoLHA9MDtwPGEubGVuZ3RoO3ArKylmb3IodmFyIGQ9dFtsXS9hW3BdLGY9MDtmPGFbcF07ZisrKXt2YXIgZz17fTtnW3VdPXAqYyxnW2hdPWYqZCxnW3NdPWMsZ1tsXT1kLGcueCs9dC54LGcueSs9dC55LG4ucHVzaChnKX19KHIsZSxpKSxuPVdzO2JyZWFrO2Nhc2Uic2VjdG9yIjpGRyhyLGUsaSksbj1GdTticmVhaztjYXNlImNpcmNsZSI6Rkcoe3IwOjAscjpyLnIsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjIqTWF0aC5QSSxjeDpyLmN4LGN5OnIuY3l9LGUsaSksbj1GdTticmVhaztkZWZhdWx0OnZhciBvPXQuZ2V0Q29tcHV0ZWRUcmFuc2Zvcm0oKSxhPW8/TWF0aC5zcXJ0KE1hdGgubWF4KG9bMF0qb1swXStvWzFdKm9bMV0sb1syXSpvWzJdK29bM10qb1szXSkpOjEscz16KGZ1bmN0aW9uKHQsZSl7dmFyIG49ekcodCksaT1bXTtlPWV8fDE7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl0sYT1bXSxzPW9bMF0sbD1vWzFdO2EucHVzaChzLGwpO2Zvcih2YXIgdT0yO3U8by5sZW5ndGg7KXt2YXIgaD1vW3UrK10sYz1vW3UrK10scD1vW3UrK10sZD1vW3UrK10sZj1vW3UrK10sZz1vW3UrK107VkcocyxsLGgsYyxwLGQsZixnLGEsZSkscz1mLGw9Z31pLnB1c2goYSl9cmV0dXJuIGl9KHQuZ2V0VXBkYXRlZFBhdGhQcm94eSgpLGEpLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOyllLnB1c2goW3RbbisrXSx0W24rK11dKTtyZXR1cm4gZX0odCl9KSksbD1zLmxlbmd0aDtpZigwPT09bClVRyhYRyx7cG9pbnRzOnNbMF19LGUsaSk7ZWxzZSBpZihsPT09ZSlmb3IodmFyIHU9MDt1PGw7dSsrKWkucHVzaCh7cG9pbnRzOnNbdV19KTtlbHNle3ZhciBoPTAsYz16KHMsKGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W107QmEodCxlLG4pO3ZhciBpPShuWzFdLWVbMV0pKihuWzBdLWVbMF0pO3JldHVybiBoKz1pLHtwb2x5OnQsYXJlYTppfX0pKTtjLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuYXJlYS10LmFyZWF9KSk7dmFyIHA9ZTtmb3IodT0wO3U8bDt1Kyspe3ZhciBkPWNbdV07aWYocDw9MClicmVhazt2YXIgZj11PT09bC0xP3A6TWF0aC5jZWlsKGQuYXJlYS9oKmUpO2Y8MHx8KFVHKFhHLHtwb2ludHM6ZC5wb2x5fSxmLGkpLHAtPWYpfX1uPVh1fWlmKCFuKXJldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXSxpPTA7aTxlO2krKyluLnB1c2goYnUodCkpO3JldHVybiBufSh0LGUpO3ZhciBnPVtdO2Zvcih1PTA7dTxpLmxlbmd0aDt1Kyspe3ZhciB5PW5ldyBuO3kuc2V0U2hhcGUoaVt1XSksWkcodCx5KSxnLnB1c2goeSl9cmV0dXJuIGd9ZnVuY3Rpb24gcUcodCxlKXt2YXIgbj10Lmxlbmd0aCxpPWUubGVuZ3RoO2lmKG49PT1pKXJldHVyblt0LGVdO2Zvcih2YXIgcj1bXSxvPVtdLGE9bjxpP3Q6ZSxzPU1hdGgubWluKG4saSksbD1NYXRoLmFicyhpLW4pLzYsdT0ocy0yKS82LGg9TWF0aC5jZWlsKGwvdSkrMSxjPVthWzBdLGFbMV1dLHA9bCxkPTI7ZDxzOyl7dmFyIGY9YVtkLTJdLGc9YVtkLTFdLHk9YVtkKytdLHY9YVtkKytdLG09YVtkKytdLHg9YVtkKytdLF89YVtkKytdLGI9YVtkKytdO2lmKHA8PTApYy5wdXNoKHksdixtLHgsXyxiKTtlbHNle2Zvcih2YXIgdz1NYXRoLm1pbihwLGgtMSkrMSxTPTE7Uzw9dztTKyspe3ZhciBNPVMvdzt3bihmLHksbSxfLE0sciksd24oZyx2LHgsYixNLG8pLGY9clszXSxnPW9bM10sYy5wdXNoKHJbMV0sb1sxXSxyWzJdLG9bMl0sZixnKSx5PXJbNV0sdj1vWzVdLG09cls2XSx4PW9bNl19cC09dy0xfX1yZXR1cm4gYT09PXQ/W2MsZV06W3QsY119ZnVuY3Rpb24gS0codCxlKXtmb3IodmFyIG49dC5sZW5ndGgsaT10W24tMl0scj10W24tMV0sbz1bXSxhPTA7YTxlLmxlbmd0aDspb1thKytdPWksb1thKytdPXI7cmV0dXJuIG99ZnVuY3Rpb24gJEcodCl7Zm9yKHZhciBlPTAsbj0wLGk9MCxyPXQubGVuZ3RoLG89MCxhPXItMjtvPHI7YT1vLG8rPTIpe3ZhciBzPXRbYV0sbD10W2ErMV0sdT10W29dLGg9dFtvKzFdLGM9cypoLXUqbDtlKz1jLG4rPShzK3UpKmMsaSs9KGwraCkqY31yZXR1cm4gMD09PWU/W3RbMF18fDAsdFsxXXx8MF06W24vZS8zLGkvZS8zLGVdfWZ1bmN0aW9uIEpHKHQsZSxuLGkpe2Zvcih2YXIgcj0odC5sZW5ndGgtMikvNixvPTEvMCxhPTAscz10Lmxlbmd0aCxsPXMtMix1PTA7dTxyO3UrKyl7Zm9yKHZhciBoPTYqdSxjPTAscD0wO3A8cztwKz0yKXt2YXIgZD0wPT09cD9oOihoK3AtMiklbCsyLGY9dFtkXS1uWzBdLGc9dFtkKzFdLW5bMV0seT1lW3BdLWlbMF0tZix2PWVbcCsxXS1pWzFdLWc7Yys9eSp5K3Yqdn1jPG8mJihvPWMsYT11KX1yZXR1cm4gYX1mdW5jdGlvbiBRRyh0KXtmb3IodmFyIGU9W10sbj10Lmxlbmd0aCxpPTA7aTxuO2krPTIpZVtpXT10W24taS0yXSxlW2krMV09dFtuLWktMV07cmV0dXJuIGV9ZnVuY3Rpb24gdFcodCl7cmV0dXJuIHQuX19pc0NvbWJpbmVNb3JwaGluZ312YXIgZVc9Il9fbU9yaWdpbmFsXyI7ZnVuY3Rpb24gblcodCxlLG4pe3ZhciBpPWVXK2Uscj10W2ldfHx0W2VdO3RbaV18fCh0W2ldPXRbZV0pO3ZhciBvPW4ucmVwbGFjZSxhPW4uYWZ0ZXIscz1uLmJlZm9yZTt0W2VdPWZ1bmN0aW9uKCl7dmFyIHQsZT1hcmd1bWVudHM7cmV0dXJuIHMmJnMuYXBwbHkodGhpcyxlKSx0PW8/by5hcHBseSh0aGlzLGUpOnIuYXBwbHkodGhpcyxlKSxhJiZhLmFwcGx5KHRoaXMsZSksdH19ZnVuY3Rpb24gaVcodCxlKXt2YXIgbj1lVytlO3Rbbl0mJih0W2VdPXRbbl0sdFtuXT1udWxsKX1mdW5jdGlvbiByVyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWZvcih2YXIgaT10W25dLHI9MDtyPGkubGVuZ3RoOyl7dmFyIG89aVtyXSxhPWlbcisxXTtpW3IrK109ZVswXSpvK2VbMl0qYStlWzRdLGlbcisrXT1lWzFdKm8rZVszXSphK2VbNV19fWZ1bmN0aW9uIG9XKHQsZSl7dmFyIG49dC5nZXRVcGRhdGVkUGF0aFByb3h5KCksaT1lLmdldFVwZGF0ZWRQYXRoUHJveHkoKSxyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLGkscixvPVtdLGE9W10scz0wO3M8TWF0aC5tYXgodC5sZW5ndGgsZS5sZW5ndGgpO3MrKyl7dmFyIGw9dFtzXSx1PWVbc10saD12b2lkIDAsYz12b2lkIDA7bD91PyhpPWg9KG49cUcobCx1KSlbMF0scj1jPW5bMV0pOihjPUtHKHJ8fGwsbCksaD1sKTooaD1LRyhpfHx1LHUpLGM9dSksby5wdXNoKGgpLGEucHVzaChjKX1yZXR1cm5bbyxhXX0oekcobiksekcoaSkpLG89clswXSxhPXJbMV0scz10LmdldENvbXB1dGVkVHJhbnNmb3JtKCksbD1lLmdldENvbXB1dGVkVHJhbnNmb3JtKCk7cyYmclcobyxzKSxsJiZyVyhhLGwpLG5XKGUsInVwZGF0ZVRyYW5zZm9ybSIse3JlcGxhY2U6ZnVuY3Rpb24oKXt0aGlzLnRyYW5zZm9ybT1udWxsfX0pLGUudHJhbnNmb3JtPW51bGw7dmFyIHU9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByLG89W10sYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgcz10W2FdLGw9ZVthXSx1PSRHKHMpLGg9JEcobCk7bnVsbD09ciYmKHI9dVsyXTwwIT1oWzJdPDApO3ZhciBjPVtdLHA9W10sZD0wLGY9MS8wLGc9W10seT1zLmxlbmd0aDtyJiYocz1RRyhzKSk7Zm9yKHZhciB2PTYqSkcocyxsLHUsaCksbT15LTIseD0wO3g8bTt4Kz0yKXt2YXIgXz0odit4KSVtKzI7Y1t4KzJdPXNbX10tdVswXSxjW3grM109c1tfKzFdLXVbMV19aWYoY1swXT1zW3ZdLXVbMF0sY1sxXT1zW3YrMV0tdVsxXSxuPjApZm9yKHZhciBiPWkvbix3PS1pLzI7dzw9aS8yO3crPWIpe3ZhciBTPU1hdGguc2luKHcpLE09TWF0aC5jb3ModyksST0wO2Zvcih4PTA7eDxzLmxlbmd0aDt4Kz0yKXt2YXIgVD1jW3hdLEM9Y1t4KzFdLEQ9bFt4XS1oWzBdLEE9bFt4KzFdLWhbMV0saz1EKk0tQSpTLEw9RCpTK0EqTTtnW3hdPWssZ1t4KzFdPUw7dmFyIFA9ay1ULE89TC1DO0krPVAqUCtPKk99aWYoSTxmKXtmPUksZD13O2Zvcih2YXIgUj0wO1I8Zy5sZW5ndGg7UisrKXBbUl09Z1tSXX19ZWxzZSBmb3IodmFyIE49MDtOPHk7Tis9MilwW05dPWxbTl0taFswXSxwW04rMV09bFtOKzFdLWhbMV07by5wdXNoKHtmcm9tOmMsdG86cCxmcm9tQ3A6dSx0b0NwOmgscm90YXRpb246LWR9KX1yZXR1cm4gb30obyxhLDEwLE1hdGguUEkpLGg9W107blcoZSwiYnVpbGRQYXRoIix7cmVwbGFjZTpmdW5jdGlvbih0KXtmb3IodmFyIG49ZS5fX21vcnBoVCxpPTEtbixyPVtdLG89MDtvPHUubGVuZ3RoO28rKyl7dmFyIGE9dVtvXSxzPWEuZnJvbSxsPWEudG8sYz1hLnJvdGF0aW9uKm4scD1hLmZyb21DcCxkPWEudG9DcCxmPU1hdGguc2luKGMpLGc9TWF0aC5jb3MoYyk7R3QocixwLGQsbik7Zm9yKHZhciB5PTA7eTxzLmxlbmd0aDt5Kz0yKXt2YXIgdj1zW3ldLG09c1t5KzFdLHg9dippKyhTPWxbeV0pKm4sXz1tKmkrKE09bFt5KzFdKSpuO2hbeV09eCpnLV8qZityWzBdLGhbeSsxXT14KmYrXypnK3JbMV19dmFyIGI9aFswXSx3PWhbMV07dC5tb3ZlVG8oYix3KTtmb3IoeT0yO3k8cy5sZW5ndGg7KXt2YXIgUz1oW3krK10sTT1oW3krK10sST1oW3krK10sVD1oW3krK10sQz1oW3krK10sRD1oW3krK107Yj09PVMmJnc9PT1NJiZJPT09QyYmVD09PUQ/dC5saW5lVG8oQyxEKTp0LmJlemllckN1cnZlVG8oUyxNLEksVCxDLEQpLGI9Qyx3PUR9fX19KX1mdW5jdGlvbiBhVyh0LGUsbil7aWYoIXR8fCFlKXJldHVybiBlO3ZhciBpPW4uZG9uZSxyPW4uZHVyaW5nO3JldHVybiBvVyh0LGUpLGUuX19tb3JwaFQ9MCxlLmFuaW1hdGVUbyh7X19tb3JwaFQ6MX0sayh7ZHVyaW5nOmZ1bmN0aW9uKHQpe2UuZGlydHlTaGFwZSgpLHImJnIodCl9LGRvbmU6ZnVuY3Rpb24oKXtpVyhlLCJidWlsZFBhdGgiKSxpVyhlLCJ1cGRhdGVUcmFuc2Zvcm0iKSxlLl9fbW9ycGhUPS0xLGUuY3JlYXRlUGF0aFByb3h5KCksZS5kaXJ0eVNoYXBlKCksaSYmaSgpfX0sbikpLGV9ZnVuY3Rpb24gc1codCxlLG4saSxyLG8pe3Q9cj09PW4/MDpNYXRoLnJvdW5kKDMyNzY3Kih0LW4pLyhyLW4pKSxlPW89PT1pPzA6TWF0aC5yb3VuZCgzMjc2NyooZS1pKS8oby1pKSk7Zm9yKHZhciBhLHM9MCxsPTMyNzY4O2w+MDtsLz0yKXt2YXIgdT0wLGg9MDsodCZsKT4wJiYodT0xKSwoZSZsKT4wJiYoaD0xKSxzKz1sKmwqKDMqdV5oKSwwPT09aCYmKDE9PT11JiYodD1sLTEtdCxlPWwtMS1lKSxhPXQsdD1lLGU9YSl9cmV0dXJuIHN9ZnVuY3Rpb24gbFcodCl7dmFyIGU9MS8wLG49MS8wLGk9LTEvMCxyPS0xLzAsbz16KHQsKGZ1bmN0aW9uKHQpe3ZhciBvPXQuZ2V0Qm91bmRpbmdSZWN0KCksYT10LmdldENvbXB1dGVkVHJhbnNmb3JtKCkscz1vLngrby53aWR0aC8yKyhhP2FbNF06MCksbD1vLnkrby5oZWlnaHQvMisoYT9hWzVdOjApO3JldHVybiBlPU1hdGgubWluKHMsZSksbj1NYXRoLm1pbihsLG4pLGk9TWF0aC5tYXgocyxpKSxyPU1hdGgubWF4KGwsciksW3MsbF19KSk7cmV0dXJuIHoobywoZnVuY3Rpb24obyxhKXtyZXR1cm57Y3A6byx6OnNXKG9bMF0sb1sxXSxlLG4saSxyKSxwYXRoOnRbYV19fSkpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuei1lLnp9KSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXRofSkpfWZ1bmN0aW9uIHVXKHQpe3JldHVybiBqRyh0LnBhdGgsdC5jb3VudCl9ZnVuY3Rpb24gaFcodCl7cmV0dXJuIFkodFswXSl9ZnVuY3Rpb24gY1codCxlKXtmb3IodmFyIG49W10saT10Lmxlbmd0aCxyPTA7cjxpO3IrKyluLnB1c2goe29uZTp0W3JdLG1hbnk6W119KTtmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbz1lW3JdLmxlbmd0aCxhPXZvaWQgMDtmb3IoYT0wO2E8bzthKyspblthJWldLm1hbnkucHVzaChlW3JdW2FdKX12YXIgcz0wO2ZvcihyPWktMTtyPj0wO3ItLSlpZighbltyXS5tYW55Lmxlbmd0aCl7dmFyIGw9bltzXS5tYW55O2lmKGwubGVuZ3RoPD0xKXtpZighcylyZXR1cm4gbjtzPTB9bz1sLmxlbmd0aDt2YXIgdT1NYXRoLmNlaWwoby8yKTtuW3JdLm1hbnk9bC5zbGljZSh1LG8pLG5bc10ubWFueT1sLnNsaWNlKDAsdSkscysrfXJldHVybiBufXZhciBwVz17Y2xvbmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MS1NYXRoLnBvdygxLXQucGF0aC5zdHlsZS5vcGFjaXR5LDEvdC5jb3VudCksaT0wO2k8dC5jb3VudDtpKyspe3ZhciByPWJ1KHQucGF0aCk7ci5zZXRTdHlsZSgib3BhY2l0eSIsbiksZS5wdXNoKHIpfXJldHVybiBlfSxzcGxpdDpudWxsfTtmdW5jdGlvbiBkVyh0LGUsbixpLHIsbyl7aWYodC5sZW5ndGgmJmUubGVuZ3RoKXt2YXIgYT1naCgidXBkYXRlIixpLHIpO2lmKGEmJmEuZHVyYXRpb24+MCl7dmFyIHMsbCx1PWkuZ2V0TW9kZWwoInVuaXZlcnNhbFRyYW5zaXRpb24iKS5nZXQoImRlbGF5IiksaD1PYmplY3QuYXNzaWduKHtzZXRUb0ZpbmFsOiEwfSxhKTtoVyh0KSYmKHM9dCxsPWUpLGhXKGUpJiYocz1lLGw9dCk7Zm9yKHZhciBjPXM/cz09PXQ6dC5sZW5ndGg+ZS5sZW5ndGgscD1zP2NXKGwscyk6Y1coYz9lOnQsW2M/dDplXSksZD0wLGY9MDtmPHAubGVuZ3RoO2YrKylkKz1wW2ZdLm1hbnkubGVuZ3RoO3ZhciBnPTA7Zm9yKGY9MDtmPHAubGVuZ3RoO2YrKyl5KHBbZl0sYyxnLGQpLGcrPXBbZl0ubWFueS5sZW5ndGh9fWZ1bmN0aW9uIHkodCxlLGkscixhKXt2YXIgcz10Lm1hbnksbD10Lm9uZTtpZigxIT09cy5sZW5ndGh8fGEpZm9yKHZhciBjPWsoe2RpdmlkZVBhdGg6cFdbbl0saW5kaXZpZHVhbERlbGF5OnUmJmZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB1KHQraSxyKX19LGgpLHA9ZT9mdW5jdGlvbih0LGUsbil7dmFyIGk9W107IWZ1bmN0aW9uIHQoZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07dFcocik/dChyLmNoaWxkcmVuUmVmKCkpOnIgaW5zdGFuY2VvZiBrcyYmaS5wdXNoKHIpfX0odCk7dmFyIHI9aS5sZW5ndGg7aWYoIXIpcmV0dXJue2Zyb21JbmRpdmlkdWFsczpbXSx0b0luZGl2aWR1YWxzOltdLGNvdW50OjB9O3ZhciBvPShuLmRpdmlkZVBhdGh8fHVXKSh7cGF0aDplLGNvdW50OnJ9KTtpZihvLmxlbmd0aCE9PXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIkludmFsaWQgbW9ycGhpbmc6IHVubWF0Y2hlZCBzcGxpdHRlZCBwYXRoIikse2Zyb21JbmRpdmlkdWFsczpbXSx0b0luZGl2aWR1YWxzOltdLGNvdW50OjB9O2k9bFcoaSksbz1sVyhvKTtmb3IodmFyIGE9bi5kb25lLHM9bi5kdXJpbmcsbD1uLmluZGl2aWR1YWxEZWxheSx1PW5ldyB2cixoPTA7aDxyO2grKyl7dmFyIGM9aVtoXSxwPW9baF07cC5wYXJlbnQ9ZSxwLmNvcHlUcmFuc2Zvcm0odSksbHx8b1coYyxwKX1mdW5jdGlvbiBkKHQpe2Zvcih2YXIgZT0wO2U8by5sZW5ndGg7ZSsrKW9bZV0uYWRkU2VsZlRvWnIodCl9ZnVuY3Rpb24gZigpe2UuX19pc0NvbWJpbmVNb3JwaGluZz0hMSxlLl9fbW9ycGhUPS0xLGUuY2hpbGRyZW5SZWY9bnVsbCxpVyhlLCJhZGRTZWxmVG9aciIpLGlXKGUsInJlbW92ZVNlbGZGcm9tWnIiKX1lLl9faXNDb21iaW5lTW9ycGhpbmc9ITAsZS5jaGlsZHJlblJlZj1mdW5jdGlvbigpe3JldHVybiBvfSxuVyhlLCJhZGRTZWxmVG9aciIse2FmdGVyOmZ1bmN0aW9uKHQpe2QodCl9fSksblcoZSwicmVtb3ZlU2VsZkZyb21aciIse2FmdGVyOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8by5sZW5ndGg7ZSsrKW9bZV0ucmVtb3ZlU2VsZkZyb21acih0KX19KTt2YXIgZz1vLmxlbmd0aDtpZihsKXt2YXIgeT1nLHY9ZnVuY3Rpb24oKXswPT0tLXkmJihmKCksYSYmYSgpKX07Zm9yKGg9MDtoPGc7aCsrKXt2YXIgbT1sP2soe2RlbGF5OihuLmRlbGF5fHwwKStsKGgsZyxpW2hdLG9baF0pLGRvbmU6dn0sbik6bjthVyhpW2hdLG9baF0sbSl9fWVsc2UgZS5fX21vcnBoVD0wLGUuYW5pbWF0ZVRvKHtfX21vcnBoVDoxfSxrKHtkdXJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTA7bjxnO24rKyl7dmFyIGk9b1tuXTtpLl9fbW9ycGhUPWUuX19tb3JwaFQsaS5kaXJ0eVNoYXBlKCl9cyYmcyh0KX0sZG9uZTpmdW5jdGlvbigpe2YoKTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpVyh0W2VdLCJ1cGRhdGVUcmFuc2Zvcm0iKTthJiZhKCl9fSxuKSk7cmV0dXJuIGUuX196ciYmZChlLl9fenIpLHtmcm9tSW5kaXZpZHVhbHM6aSx0b0luZGl2aWR1YWxzOm8sY291bnQ6Z319KHMsbCxjKTpmdW5jdGlvbih0LGUsbil7dmFyIGk9ZS5sZW5ndGgscj1bXSxvPW4uZGl2aWRlUGF0aHx8dVc7aWYodFcodCkpeyFmdW5jdGlvbiB0KGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dO3RXKGkpP3QoaS5jaGlsZHJlblJlZigpKTppIGluc3RhbmNlb2Yga3MmJnIucHVzaChpKX19KHQuY2hpbGRyZW5SZWYoKSk7dmFyIGE9ci5sZW5ndGg7aWYoYTxpKWZvcih2YXIgcz0wLGw9YTtsPGk7bCsrKXIucHVzaChidShyW3MrKyVhXSkpO3IubGVuZ3RoPWl9ZWxzZXtyPW8oe3BhdGg6dCxjb3VudDppfSk7dmFyIHU9dC5nZXRDb21wdXRlZFRyYW5zZm9ybSgpO2ZvcihsPTA7bDxyLmxlbmd0aDtsKyspcltsXS5zZXRMb2NhbFRyYW5zZm9ybSh1KTtpZihyLmxlbmd0aCE9PWkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIkludmFsaWQgbW9ycGhpbmc6IHVubWF0Y2hlZCBzcGxpdHRlZCBwYXRoIikse2Zyb21JbmRpdmlkdWFsczpbXSx0b0luZGl2aWR1YWxzOltdLGNvdW50OjB9fXI9bFcociksZT1sVyhlKTt2YXIgaD1uLmluZGl2aWR1YWxEZWxheTtmb3IobD0wO2w8aTtsKyspe3ZhciBjPWg/ayh7ZGVsYXk6KG4uZGVsYXl8fDApK2gobCxpLHJbbF0sZVtsXSl9LG4pOm47YVcocltsXSxlW2xdLGMpfXJldHVybntmcm9tSW5kaXZpZHVhbHM6cix0b0luZGl2aWR1YWxzOmUsY291bnQ6ZS5sZW5ndGh9fShsLHMsYyksZD1wLmZyb21JbmRpdmlkdWFscyxmPXAudG9JbmRpdmlkdWFscyxnPWQubGVuZ3RoLHY9MDt2PGc7disrKXttPXU/ayh7ZGVsYXk6dSh2LGcpfSxoKTpoO28oZFt2XSxmW3ZdLGU/c1t2XTp0Lm9uZSxlP3Qub25lOnNbdl0sbSl9ZWxzZXt2YXIgbSx4PWU/c1swXTpsLF89ZT9sOnNbMF07aWYodFcoeCkpeSh7bWFueTpbeF0sb25lOl99LCEwLGksciwhMCk7ZWxzZSBhVyh4LF8sbT11P2soe2RlbGF5OnUoaSxyKX0saCk6aCksbyh4LF8seCxfLG0pfX19ZnVuY3Rpb24gZlcodCl7aWYoIXQpcmV0dXJuW107aWYoWSh0KSl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoO24rKyllLnB1c2goZlcodFtuXSkpO3JldHVybiBlfXZhciBpPVtdO3JldHVybiB0LnRyYXZlcnNlKChmdW5jdGlvbih0KXt0IGluc3RhbmNlb2Yga3MmJiF0LmRpc2FibGVNb3JwaGluZyYmIXQuaW52aXNpYmxlJiYhdC5pZ25vcmUmJmkucHVzaCh0KX0pKSxpfXZhciBnVz1WbygpO2Z1bmN0aW9uIHlXKHQsZSxuLGkpe3ZhciByPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZGltZW5zaW9ucyxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPXQuZ2V0RGltZW5zaW9uSW5mbyhuW2ldKTtpZihyJiYwPT09ci5vdGhlckRpbXNbZV0pcmV0dXJuIG5baV19fSh0LGk/Iml0ZW1DaGlsZEdyb3VwSWQiOiJpdGVtR3JvdXBJZCIpO2lmKHIpe3ZhciBvPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmdldERpbWVuc2lvbkluZm8obikscj1pJiZpLm9yZGluYWxNZXRhO2lmKGkpe3ZhciBvPXQuZ2V0KGkubmFtZSxlKTtyZXR1cm4gciYmci5jYXRlZ29yaWVzW29dfHxvKyIifX0odCxlLHIpO3JldHVybiBvfXZhciBhPXQuZ2V0UmF3RGF0YUl0ZW0oZSkscz1pPyJjaGlsZEdyb3VwSWQiOiJncm91cElkIjtyZXR1cm4gYSYmYVtzXT9hW3NdKyIiOmk/dm9pZCAwOm58fHQuZ2V0SWQoZSl9ZnVuY3Rpb24gdlcodCl7dmFyIGU9W107cmV0dXJuIEUodCwoZnVuY3Rpb24odCl7dmFyIG49dC5kYXRhLGk9dC5kYXRhR3JvdXBJZDtpZighKG4uY291bnQoKT4xZTQpKWZvcih2YXIgcj1uLmdldEluZGljZXMoKSxvPTA7bzxyLmxlbmd0aDtvKyspZS5wdXNoKHtkYXRhOm4sZ3JvdXBJZDp5VyhuLG8saSwhMSksY2hpbGRHcm91cElkOnlXKG4sbyxpLCEwKSxkaXZpZGU6dC5kaXZpZGUsZGF0YUluZGV4Om99KX0pKSxlfWZ1bmN0aW9uIG1XKHQsZSxuKXt0LnRyYXZlcnNlKChmdW5jdGlvbih0KXt0IGluc3RhbmNlb2Yga3MmJm1oKHQse3N0eWxlOntvcGFjaXR5OjB9fSxlLHtkYXRhSW5kZXg6bixpc0Zyb206ITB9KX0pKX1mdW5jdGlvbiB4Vyh0KXtpZih0LnBhcmVudCl7dmFyIGU9dC5nZXRDb21wdXRlZFRyYW5zZm9ybSgpO3Quc2V0TG9jYWxUcmFuc2Zvcm0oZSksdC5wYXJlbnQucmVtb3ZlKHQpfX1mdW5jdGlvbiBfVyh0KXt0LnN0b3BBbmltYXRpb24oKSx0LmlzR3JvdXAmJnQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe3Quc3RvcEFuaW1hdGlvbigpfSkpfWZ1bmN0aW9uIGJXKHQsZSxuKXt2YXIgaT1naCgidXBkYXRlIixuLGUpO2kmJnQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBEYSl7dmFyIGU9ZnVuY3Rpb24odCl7cmV0dXJuIGZoKHQpLm9sZFN0eWxlfSh0KTtlJiZ0LmFuaW1hdGVGcm9tKHtzdHlsZTplfSxpKX19KSl9ZnVuY3Rpb24gd1codCxlLG4pe3ZhciBpPXZXKHQpLHI9dlcoZSk7ZnVuY3Rpb24gbyh0LGUsbixpLHIpeyhufHx0KSYmZS5hbmltYXRlRnJvbSh7c3R5bGU6biYmbiE9PXQ/QShBKHt9LG4uc3R5bGUpLHQuc3R5bGUpOnQuc3R5bGV9LHIpfXZhciBhPSExLHM9MCxsPXl0KCksdT15dCgpO2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5ncm91cElkJiZsLnNldCh0Lmdyb3VwSWQsITApLHQuY2hpbGRHcm91cElkJiZ1LnNldCh0LmNoaWxkR3JvdXBJZCwhMCl9KSk7Zm9yKHZhciBoPTA7aDxyLmxlbmd0aDtoKyspe3ZhciBjPXJbaF0uZ3JvdXBJZDtpZih1LmdldChjKSl7cz0xO2JyZWFrfXZhciBwPXJbaF0uY2hpbGRHcm91cElkO2lmKHAmJmwuZ2V0KHApKXtzPTI7YnJlYWt9fWZ1bmN0aW9uIGQodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9bi5kYXRhLHI9bi5kYXRhSW5kZXg7cmV0dXJuIGU/aS5nZXRJZChyKTp0PzE9PT1zP24uY2hpbGRHcm91cElkOm4uZ3JvdXBJZDoyPT09cz9uLmNoaWxkR3JvdXBJZDpuLmdyb3VwSWR9fXZhciBmPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYobiE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8bjtpKyspe3ZhciByPXRbaV0sbz1lW2ldO2lmKHIuZGF0YS5nZXRJZChyLmRhdGFJbmRleCkhPT1vLmRhdGEuZ2V0SWQoby5kYXRhSW5kZXgpKXJldHVybiExfXJldHVybiEwfShpLHIpLGc9e307aWYoIWYpZm9yKGg9MDtoPHIubGVuZ3RoO2grKyl7dmFyIHk9cltoXSx2PXkuZGF0YS5nZXRJdGVtR3JhcGhpY0VsKHkuZGF0YUluZGV4KTt2JiYoZ1t2LmlkXT0hMCl9ZnVuY3Rpb24gbSh0LGUpe3ZhciBuPWlbZV0scz1yW3RdLGw9cy5kYXRhLmhvc3RNb2RlbCx1PW4uZGF0YS5nZXRJdGVtR3JhcGhpY0VsKG4uZGF0YUluZGV4KSxoPXMuZGF0YS5nZXRJdGVtR3JhcGhpY0VsKHMuZGF0YUluZGV4KTt1IT09aD91JiZnW3UuaWRdfHxoJiYoX1coaCksdT8oX1codSkseFcodSksYT0hMCxkVyhmVyh1KSxmVyhoKSxzLmRpdmlkZSxsLHQsbykpOm1XKGgsbCx0KSk6aCYmYlcoaCxzLmRhdGFJbmRleCxsKX1uZXcgR20oaSxyLGQoITAsZiksZCghMSxmKSxudWxsLCJtdWx0aXBsZSIpLnVwZGF0ZShtKS51cGRhdGVNYW55VG9PbmUoKGZ1bmN0aW9uKHQsZSl7dmFyIG49clt0XSxzPW4uZGF0YSxsPXMuaG9zdE1vZGVsLHU9cy5nZXRJdGVtR3JhcGhpY0VsKG4uZGF0YUluZGV4KSxoPUIoeihlLChmdW5jdGlvbih0KXtyZXR1cm4gaVt0XS5kYXRhLmdldEl0ZW1HcmFwaGljRWwoaVt0XS5kYXRhSW5kZXgpfSkpLChmdW5jdGlvbih0KXtyZXR1cm4gdCYmdCE9PXUmJiFnW3QuaWRdfSkpO3UmJihfVyh1KSxoLmxlbmd0aD8oRShoLChmdW5jdGlvbih0KXtfVyh0KSx4Vyh0KX0pKSxhPSEwLGRXKGZXKGgpLGZXKHUpLG4uZGl2aWRlLGwsdCxvKSk6bVcodSxsLG4uZGF0YUluZGV4KSl9KSkudXBkYXRlT25lVG9NYW55KChmdW5jdGlvbih0LGUpe3ZhciBuPWlbZV0scz1uLmRhdGEuZ2V0SXRlbUdyYXBoaWNFbChuLmRhdGFJbmRleCk7aWYoIXN8fCFnW3MuaWRdKXt2YXIgbD1CKHoodCwoZnVuY3Rpb24odCl7cmV0dXJuIHJbdF0uZGF0YS5nZXRJdGVtR3JhcGhpY0VsKHJbdF0uZGF0YUluZGV4KX0pKSwoZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQhPT1zfSkpLHU9clt0WzBdXS5kYXRhLmhvc3RNb2RlbDtsLmxlbmd0aCYmKEUobCwoZnVuY3Rpb24odCl7cmV0dXJuIF9XKHQpfSkpLHM/KF9XKHMpLHhXKHMpLGE9ITAsZFcoZlcocyksZlcobCksbi5kaXZpZGUsdSx0WzBdLG8pKTpFKGwsKGZ1bmN0aW9uKGUpe3JldHVybiBtVyhlLHUsdFswXSl9KSkpfX0pKS51cGRhdGVNYW55VG9NYW55KChmdW5jdGlvbih0LGUpe25ldyBHbShlLHQsKGZ1bmN0aW9uKHQpe3JldHVybiBpW3RdLmRhdGEuZ2V0SWQoaVt0XS5kYXRhSW5kZXgpfSksKGZ1bmN0aW9uKHQpe3JldHVybiByW3RdLmRhdGEuZ2V0SWQoclt0XS5kYXRhSW5kZXgpfSkpLnVwZGF0ZSgoZnVuY3Rpb24obixpKXttKHRbbl0sZVtpXSl9KSkuZXhlY3V0ZSgpfSkpLmV4ZWN1dGUoKSxhJiZFKGUsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YS5ob3N0TW9kZWwsaT1lJiZuLmdldFZpZXdPZlNlcmllc01vZGVsKGUpLHI9Z2goInVwZGF0ZSIsZSwwKTtpJiZlLmlzQW5pbWF0aW9uRW5hYmxlZCgpJiZyJiZyLmR1cmF0aW9uPjAmJmkuZ3JvdXAudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBrcyYmIXQuYW5pbWF0b3JzLmxlbmd0aCYmdC5hbmltYXRlRnJvbSh7c3R5bGU6e29wYWNpdHk6MH19LHIpfSkpfSkpfWZ1bmN0aW9uIFNXKHQpe3ZhciBlPXQuZ2V0TW9kZWwoInVuaXZlcnNhbFRyYW5zaXRpb24iKS5nZXQoInNlcmllc0tleSIpO3JldHVybiBlfHx0LmlkfWZ1bmN0aW9uIE1XKHQpe3JldHVybiBZKHQpP3Quc29ydCgpLmpvaW4oIiwiKTp0fWZ1bmN0aW9uIElXKHQpe2lmKHQuaG9zdE1vZGVsKXJldHVybiB0Lmhvc3RNb2RlbC5nZXRNb2RlbCgidW5pdmVyc2FsVHJhbnNpdGlvbiIpLmdldCgiZGl2aWRlU2hhcGUiKX1mdW5jdGlvbiBUVyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXtpZihudWxsIT1lLnNlcmllc0luZGV4JiZlLnNlcmllc0luZGV4PT09dFtuXS5zZXJpZXNJbmRleHx8bnVsbCE9ZS5zZXJpZXNJZCYmZS5zZXJpZXNJZD09PXRbbl0uaWQpcmV0dXJuIG59fVZtKFtmdW5jdGlvbih0KXt0LnJlZ2lzdGVyUGFpbnRlcigiY2FudmFzIixoUyl9XSksVm0oW2Z1bmN0aW9uKHQpe3QucmVnaXN0ZXJQYWludGVyKCJzdmciLGlTKX1dKSxWbShbZnVuY3Rpb24odCl7dC5yZWdpc3RlckNoYXJ0VmlldyhZUyksdC5yZWdpc3RlclNlcmllc01vZGVsKGNTKSx0LnJlZ2lzdGVyTGF5b3V0KFhTKCJsaW5lIiwhMCkpLHQucmVnaXN0ZXJWaXN1YWwoe3Nlcmllc1R5cGU6ImxpbmUiLHJlc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLG49dC5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCk7biYmIW4uc3Ryb2tlJiYobi5zdHJva2U9ZS5nZXRWaXN1YWwoInN0eWxlIikuZmlsbCksZS5zZXRWaXN1YWwoImxlZ2VuZExpbmVTdHlsZSIsbil9fSksdC5yZWdpc3RlclByb2Nlc3Nvcih0LlBSSU9SSVRZLlBST0NFU1NPUi5TVEFUSVNUSUMsalMoImxpbmUiKSl9LGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDaGFydFZpZXcock0pLHQucmVnaXN0ZXJTZXJpZXNNb2RlbChLUyksdC5yZWdpc3RlckxheW91dCh0LlBSSU9SSVRZLlZJU1VBTC5MQVlPVVQsSChVeCwiYmFyIikpLHQucmVnaXN0ZXJMYXlvdXQodC5QUklPUklUWS5WSVNVQUwuUFJPR1JFU1NJVkVfTEFZT1VULFp4KCJiYXIiKSksdC5yZWdpc3RlclByb2Nlc3Nvcih0LlBSSU9SSVRZLlBST0NFU1NPUi5TVEFUSVNUSUMsalMoImJhciIpKSx0LnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJjaGFuZ2VBeGlzT3JkZXIiLGV2ZW50OiJjaGFuZ2VBeGlzT3JkZXIiLHVwZGF0ZToidXBkYXRlIn0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5jb21wb25lbnRUeXBlfHwic2VyaWVzIjtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOm4scXVlcnk6dH0sKGZ1bmN0aW9uKGUpe3Quc29ydEluZm8mJmUuYXhpcy5zZXRDYXRlZ29yeVNvcnRJbmZvKHQuc29ydEluZm8pfSkpfSkpfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ2hhcnRWaWV3KE9NKSx0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoek0pLEx5KCJwaWUiLHQucmVnaXN0ZXJBY3Rpb24pLHQucmVnaXN0ZXJMYXlvdXQoSChNTSwicGllIikpLHQucmVnaXN0ZXJQcm9jZXNzb3IoVE0oInBpZSIpKSx0LnJlZ2lzdGVyUHJvY2Vzc29yKGZ1bmN0aW9uKHQpe3JldHVybntzZXJpZXNUeXBlOnQscmVzZXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldERhdGEoKTtuLmZpbHRlclNlbGYoKGZ1bmN0aW9uKHQpe3ZhciBlPW4ubWFwRGltZW5zaW9uKCJ2YWx1ZSIpLGk9bi5nZXQoZSx0KTtyZXR1cm4hKGooaSkmJiFpc05hTihpKSYmaTwwKX0pKX19fSgicGllIikpfSxmdW5jdGlvbih0KXtWbShWSSksdC5yZWdpc3RlclNlcmllc01vZGVsKFZNKSx0LnJlZ2lzdGVyQ2hhcnRWaWV3KFdNKSx0LnJlZ2lzdGVyTGF5b3V0KFhTKCJzY2F0dGVyIikpfSxmdW5jdGlvbih0KXtWbShKSSksdC5yZWdpc3RlckNoYXJ0VmlldyhISSksdC5yZWdpc3RlclNlcmllc01vZGVsKFlJKSx0LnJlZ2lzdGVyTGF5b3V0KEJJKSx0LnJlZ2lzdGVyUHJvY2Vzc29yKFRNKCJyYWRhciIpKSx0LnJlZ2lzdGVyUHJlcHJvY2Vzc29yKFdJKX0sZnVuY3Rpb24odCl7Vm0oQ0MpLHQucmVnaXN0ZXJDaGFydFZpZXcobEMpLHQucmVnaXN0ZXJTZXJpZXNNb2RlbCh1QyksdC5yZWdpc3RlckxheW91dChjQyksdC5yZWdpc3RlclByb2Nlc3Nvcih0LlBSSU9SSVRZLlBST0NFU1NPUi5TVEFUSVNUSUMsaEMpLEx5KCJtYXAiLHQucmVnaXN0ZXJBY3Rpb24pfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ2hhcnRWaWV3KEJDKSx0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoc0QpLHQucmVnaXN0ZXJMYXlvdXQodUQpLHQucmVnaXN0ZXJWaXN1YWwoaEQpLGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJBY3Rpb24oe3R5cGU6InRyZWVFeHBhbmRBbmRDb2xsYXBzZSIsZXZlbnQ6InRyZWVFeHBhbmRBbmRDb2xsYXBzZSIsdXBkYXRlOiJ1cGRhdGUifSwoZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6InRyZWUiLHF1ZXJ5OnR9LChmdW5jdGlvbihlKXt2YXIgbj10LmRhdGFJbmRleCxpPWUuZ2V0RGF0YSgpLnRyZWUuZ2V0Tm9kZUJ5RGF0YUluZGV4KG4pO2kuaXNFeHBhbmQ9IWkuaXNFeHBhbmR9KSl9KSksdC5yZWdpc3RlckFjdGlvbih7dHlwZToidHJlZVJvYW0iLGV2ZW50OiJ0cmVlUm9hbSIsdXBkYXRlOiJub25lIn0sKGZ1bmN0aW9uKHQsZSxuKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6InRyZWUiLHF1ZXJ5OnR9LChmdW5jdGlvbihlKXt2YXIgaT1NQyhlLmNvb3JkaW5hdGVTeXN0ZW0sdCx2b2lkIDAsbik7ZS5zZXRDZW50ZXImJmUuc2V0Q2VudGVyKGkuY2VudGVyKSxlLnNldFpvb20mJmUuc2V0Wm9vbShpLnpvb20pfSkpfSkpfSh0KX0sZnVuY3Rpb24odCl7dC5yZWdpc3RlclNlcmllc01vZGVsKGREKSx0LnJlZ2lzdGVyQ2hhcnRWaWV3KFREKSx0LnJlZ2lzdGVyVmlzdWFsKEhEKSx0LnJlZ2lzdGVyTGF5b3V0KG5BKSxmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGNELmxlbmd0aDtlKyspdC5yZWdpc3RlckFjdGlvbih7dHlwZTpjRFtlXSx1cGRhdGU6InVwZGF0ZVZpZXcifSxidCk7dC5yZWdpc3RlckFjdGlvbih7dHlwZToidHJlZW1hcFJvb3RUb05vZGUiLHVwZGF0ZToidXBkYXRlVmlldyJ9LChmdW5jdGlvbih0LGUpe2UuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToidHJlZW1hcCIscXVlcnk6dH0sKGZ1bmN0aW9uKGUsbil7dmFyIGk9aUQodCxbInRyZWVtYXBab29tVG9Ob2RlIiwidHJlZW1hcFJvb3RUb05vZGUiXSxlKTtpZihpKXt2YXIgcj1lLmdldFZpZXdSb290KCk7ciYmKHQuZGlyZWN0aW9uPW9EKHIsaS5ub2RlKT8icm9sbFVwIjoiZHJpbGxEb3duIiksZS5yZXNldFZpZXdSb290KGkubm9kZSl9fSkpfSkpfSh0KX0sZnVuY3Rpb24odCl7dC5yZWdpc3RlckNoYXJ0VmlldyhpayksdC5yZWdpc3RlclNlcmllc01vZGVsKGhrKSx0LnJlZ2lzdGVyUHJvY2Vzc29yKGxBKSx0LnJlZ2lzdGVyVmlzdWFsKHVBKSx0LnJlZ2lzdGVyVmlzdWFsKGNBKSx0LnJlZ2lzdGVyTGF5b3V0KGJBKSx0LnJlZ2lzdGVyTGF5b3V0KHQuUFJJT1JJVFkuVklTVUFMLlBPU1RfQ0hBUlRfTEFZT1VULEFBKSx0LnJlZ2lzdGVyTGF5b3V0KExBKSx0LnJlZ2lzdGVyQ29vcmRpbmF0ZVN5c3RlbSgiZ3JhcGhWaWV3Iix7ZGltZW5zaW9uczpkQy5kaW1lbnNpb25zLGNyZWF0ZTpQQX0pLHQucmVnaXN0ZXJBY3Rpb24oe3R5cGU6ImZvY3VzTm9kZUFkamFjZW5jeSIsZXZlbnQ6ImZvY3VzTm9kZUFkamFjZW5jeSIsdXBkYXRlOiJzZXJpZXM6Zm9jdXNOb2RlQWRqYWNlbmN5In0sYnQpLHQucmVnaXN0ZXJBY3Rpb24oe3R5cGU6InVuZm9jdXNOb2RlQWRqYWNlbmN5IixldmVudDoidW5mb2N1c05vZGVBZGphY2VuY3kiLHVwZGF0ZToic2VyaWVzOnVuZm9jdXNOb2RlQWRqYWNlbmN5In0sYnQpLHQucmVnaXN0ZXJBY3Rpb24oY2ssKGZ1bmN0aW9uKHQsZSxuKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHF1ZXJ5OnR9LChmdW5jdGlvbihlKXt2YXIgaT1NQyhlLmNvb3JkaW5hdGVTeXN0ZW0sdCx2b2lkIDAsbik7ZS5zZXRDZW50ZXImJmUuc2V0Q2VudGVyKGkuY2VudGVyKSxlLnNldFpvb20mJmUuc2V0Wm9vbShpLnpvb20pfSkpfSkpfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ2hhcnRWaWV3KGdrKSx0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoeWspfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ2hhcnRWaWV3KHhrKSx0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoX2spLHQucmVnaXN0ZXJMYXlvdXQoYmspLHQucmVnaXN0ZXJQcm9jZXNzb3IoVE0oImZ1bm5lbCIpKX0sZnVuY3Rpb24odCl7Vm0oWkwpLHQucmVnaXN0ZXJDaGFydFZpZXcod2spLHQucmVnaXN0ZXJTZXJpZXNNb2RlbChDayksdC5yZWdpc3RlclZpc3VhbCh0LlBSSU9SSVRZLlZJU1VBTC5CUlVTSCxrayl9LGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDaGFydFZpZXcoS0wpLHQucmVnaXN0ZXJTZXJpZXNNb2RlbChKTCksdC5yZWdpc3RlckxheW91dChRTCksdC5yZWdpc3RlclZpc3VhbChjUCksdC5yZWdpc3RlckFjdGlvbih7dHlwZToiZHJhZ05vZGUiLGV2ZW50OiJkcmFnbm9kZSIsdXBkYXRlOiJ1cGRhdGUifSwoZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6InNhbmtleSIscXVlcnk6dH0sKGZ1bmN0aW9uKGUpe2Uuc2V0Tm9kZVBvc2l0aW9uKHQuZGF0YUluZGV4LFt0LmxvY2FsWCx0LmxvY2FsWV0pfSkpfSkpfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoZFApLHQucmVnaXN0ZXJDaGFydFZpZXcoZlApLHQucmVnaXN0ZXJMYXlvdXQoYlApLHQucmVnaXN0ZXJUcmFuc2Zvcm0od1ApfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ2hhcnRWaWV3KE1QKSx0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoTlApLHQucmVnaXN0ZXJQcmVwcm9jZXNzb3IoRVApLHQucmVnaXN0ZXJWaXN1YWwoV1ApLHQucmVnaXN0ZXJMYXlvdXQoSFApfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ2hhcnRWaWV3KFpQKSx0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoalApLHQucmVnaXN0ZXJMYXlvdXQoWFMoImVmZmVjdFNjYXR0ZXIiKSl9LGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDaGFydFZpZXcobk8pLHQucmVnaXN0ZXJTZXJpZXNNb2RlbChhTyksdC5yZWdpc3RlckxheW91dChlTyksdC5yZWdpc3RlclZpc3VhbChsTyl9LGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDaGFydFZpZXcoY08pLHQucmVnaXN0ZXJTZXJpZXNNb2RlbChwTyl9LGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDaGFydFZpZXcoeU8pLHQucmVnaXN0ZXJTZXJpZXNNb2RlbChSTyksdC5yZWdpc3RlckxheW91dCh0LlBSSU9SSVRZLlZJU1VBTC5MQVlPVVQsSChVeCwicGljdG9yaWFsQmFyIikpLHQucmVnaXN0ZXJMYXlvdXQodC5QUklPUklUWS5WSVNVQUwuUFJPR1JFU1NJVkVfTEFZT1VULFp4KCJwaWN0b3JpYWxCYXIiKSl9LGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDaGFydFZpZXcoTk8pLHQucmVnaXN0ZXJTZXJpZXNNb2RlbChFTyksdC5yZWdpc3RlckxheW91dCh6TyksdC5yZWdpc3RlclByb2Nlc3NvcihUTSgidGhlbWVSaXZlciIpKX0sZnVuY3Rpb24odCl7dC5yZWdpc3RlckNoYXJ0VmlldyhXTyksdC5yZWdpc3RlclNlcmllc01vZGVsKEhPKSx0LnJlZ2lzdGVyTGF5b3V0KEgoVU8sInN1bmJ1cnN0IikpLHQucmVnaXN0ZXJQcm9jZXNzb3IoSChUTSwic3VuYnVyc3QiKSksdC5yZWdpc3RlclZpc3VhbChqTyksZnVuY3Rpb24odCl7dC5yZWdpc3RlckFjdGlvbih7dHlwZTpGTyx1cGRhdGU6InVwZGF0ZVZpZXcifSwoZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6InN1bmJ1cnN0IixxdWVyeTp0fSwoZnVuY3Rpb24oZSxuKXt2YXIgaT1pRCh0LFtGT10sZSk7aWYoaSl7dmFyIHI9ZS5nZXRWaWV3Um9vdCgpO3ImJih0LmRpcmVjdGlvbj1vRChyLGkubm9kZSk/InJvbGxVcCI6ImRyaWxsRG93biIpLGUucmVzZXRWaWV3Um9vdChpLm5vZGUpfX0pKX0pKSx0LnJlZ2lzdGVyQWN0aW9uKHt0eXBlOkdPLHVwZGF0ZToibm9uZSJ9LChmdW5jdGlvbih0LGUsbil7dD1BKHt9LHQpLGUuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToic3VuYnVyc3QiLHF1ZXJ5OnR9LChmdW5jdGlvbihlKXt2YXIgbj1pRCh0LFtHT10sZSk7biYmKHQuZGF0YUluZGV4PW4ubm9kZS5kYXRhSW5kZXgpfSkpLG4uZGlzcGF0Y2hBY3Rpb24oQSh0LHt0eXBlOiJoaWdobGlnaHQifSkpfSkpLHQucmVnaXN0ZXJBY3Rpb24oe3R5cGU6InN1bmJ1cnN0VW5oaWdobGlnaHQiLHVwZGF0ZToidXBkYXRlVmlldyJ9LChmdW5jdGlvbih0LGUsbil7dD1BKHt9LHQpLG4uZGlzcGF0Y2hBY3Rpb24oQSh0LHt0eXBlOiJkb3ducGxheSJ9KSl9KSl9KHQpfSxmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ2hhcnRWaWV3KEJSKSx0LnJlZ2lzdGVyU2VyaWVzTW9kZWwoSk8pfV0pLFZtKChmdW5jdGlvbih0KXtWbShWSSksVm0oRk4pfSkpLFZtKChmdW5jdGlvbih0KXtWbShGTiksVEkucmVnaXN0ZXJBeGlzUG9pbnRlckNsYXNzKCJQb2xhckF4aXNQb2ludGVyIixHTiksdC5yZWdpc3RlckNvb3JkaW5hdGVTeXN0ZW0oInBvbGFyIixlRSksdC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKEhOKSx0LnJlZ2lzdGVyQ29tcG9uZW50Vmlldyh2RSksS00odCwiYW5nbGUiLFhOLGdFKSxLTSh0LCJyYWRpdXMiLFVOLHlFKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhhRSksdC5yZWdpc3RlckNvbXBvbmVudFZpZXcoaEUpLHQucmVnaXN0ZXJMYXlvdXQoSChmRSwiYmFyIikpfSkpLFZtKENDKSxWbSgoZnVuY3Rpb24odCl7Vm0oRk4pLFRJLnJlZ2lzdGVyQXhpc1BvaW50ZXJDbGFzcygiU2luZ2xlQXhpc1BvaW50ZXIiLExFKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhORSksdC5yZWdpc3RlckNvbXBvbmVudFZpZXcoYkUpLHQucmVnaXN0ZXJDb21wb25lbnRNb2RlbChTRSksS00odCwic2luZ2xlIixTRSxTRS5kZWZhdWx0T3B0aW9uKSx0LnJlZ2lzdGVyQ29vcmRpbmF0ZVN5c3RlbSgic2luZ2xlIixERSl9KSksVm0oWkwpLFZtKChmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoRUUpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KFZFKSx0LnJlZ2lzdGVyQ29vcmRpbmF0ZVN5c3RlbSgiY2FsZW5kYXIiLEZFKX0pKSxWbSgoZnVuY3Rpb24odCl7dC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKFVFKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhxRSksdC5yZWdpc3RlclByZXByb2Nlc3NvcigoZnVuY3Rpb24odCl7dmFyIGU9dC5ncmFwaGljO1koZSk/ZVswXSYmZVswXS5lbGVtZW50cz90LmdyYXBoaWM9W3QuZ3JhcGhpY1swXV06dC5ncmFwaGljPVt7ZWxlbWVudHM6ZX1dOmUmJiFlLmVsZW1lbnRzJiYodC5ncmFwaGljPVt7ZWxlbWVudHM6W2VdfV0pfSkpfSkpLFZtKChmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwod3opLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KE16KSxfeigic2F2ZUFzSW1hZ2UiLEl6KSxfeigibWFnaWNUeXBlIixEeiksX3ooImRhdGFWaWV3IixOeiksX3ooImRhdGFab29tIixpViksX3ooInJlc3RvcmUiLEZ6KSxWbSh2eil9KSksVm0oKGZ1bmN0aW9uKHQpe1ZtKEZOKSx0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoYVYpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KFNWKSx0LnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJzaG93VGlwIixldmVudDoic2hvd1RpcCIsdXBkYXRlOiJ0b29sdGlwOm1hbnVhbGx5U2hvd1RpcCJ9LGJ0KSx0LnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJoaWRlVGlwIixldmVudDoiaGlkZVRpcCIsdXBkYXRlOiJ0b29sdGlwOm1hbnVhbGx5SGlkZVRpcCJ9LGJ0KX0pKSxWbShGTiksVm0oKGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDb21wb25lbnRWaWV3KFhWKSx0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoVVYpLHQucmVnaXN0ZXJQcmVwcm9jZXNzb3IoRFYpLHQucmVnaXN0ZXJWaXN1YWwodC5QUklPUklUWS5WSVNVQUwuQlJVU0gsRlYpLHQucmVnaXN0ZXJBY3Rpb24oe3R5cGU6ImJydXNoIixldmVudDoiYnJ1c2giLHVwZGF0ZToidXBkYXRlVmlzdWFsIn0sKGZ1bmN0aW9uKHQsZSl7ZS5lYWNoQ29tcG9uZW50KHttYWluVHlwZToiYnJ1c2giLHF1ZXJ5OnR9LChmdW5jdGlvbihlKXtlLnNldEFyZWFzKHQuYXJlYXMpfSkpfSkpLHQucmVnaXN0ZXJBY3Rpb24oe3R5cGU6ImJydXNoU2VsZWN0IixldmVudDoiYnJ1c2hTZWxlY3RlZCIsdXBkYXRlOiJub25lIn0sYnQpLHQucmVnaXN0ZXJBY3Rpb24oe3R5cGU6ImJydXNoRW5kIixldmVudDoiYnJ1c2hFbmQiLHVwZGF0ZToibm9uZSJ9LGJ0KSxfeigiYnJ1c2giLHFWKX0pKSxWbSgoZnVuY3Rpb24odCl7dC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKEtWKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldygkVil9KSksVm0oKGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJDb21wb25lbnRNb2RlbChRViksdC5yZWdpc3RlckNvbXBvbmVudFZpZXcockIpLHQucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyKCJ0aW1lbGluZSIsKGZ1bmN0aW9uKCl7cmV0dXJuInNsaWRlciJ9KSksZnVuY3Rpb24odCl7dC5yZWdpc3RlckFjdGlvbih7dHlwZToidGltZWxpbmVDaGFuZ2UiLGV2ZW50OiJ0aW1lbGluZUNoYW5nZWQiLHVwZGF0ZToicHJlcGFyZUFuZFVwZGF0ZSJ9LChmdW5jdGlvbih0LGUsbil7dmFyIGk9ZS5nZXRDb21wb25lbnQoInRpbWVsaW5lIik7cmV0dXJuIGkmJm51bGwhPXQuY3VycmVudEluZGV4JiYoaS5zZXRDdXJyZW50SW5kZXgodC5jdXJyZW50SW5kZXgpLCFpLmdldCgibG9vcCIsITApJiZpLmlzSW5kZXhNYXgoKSYmaS5nZXRQbGF5U3RhdGUoKSYmKGkuc2V0UGxheVN0YXRlKCExKSxuLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0aW1lbGluZVBsYXlDaGFuZ2UiLHBsYXlTdGF0ZTohMSxmcm9tOnQuZnJvbX0pKSksZS5yZXNldE9wdGlvbigidGltZWxpbmUiLHtyZXBsYWNlTWVyZ2U6aS5nZXQoInJlcGxhY2VNZXJnZSIsITApfSksayh7Y3VycmVudEluZGV4Omkub3B0aW9uLmN1cnJlbnRJbmRleH0sdCl9KSksdC5yZWdpc3RlckFjdGlvbih7dHlwZToidGltZWxpbmVQbGF5Q2hhbmdlIixldmVudDoidGltZWxpbmVQbGF5Q2hhbmdlZCIsdXBkYXRlOiJ1cGRhdGUifSwoZnVuY3Rpb24odCxlKXt2YXIgbj1lLmdldENvbXBvbmVudCgidGltZWxpbmUiKTtuJiZudWxsIT10LnBsYXlTdGF0ZSYmbi5zZXRQbGF5U3RhdGUodC5wbGF5U3RhdGUpfSkpfSh0KSx0LnJlZ2lzdGVyUHJlcHJvY2Vzc29yKHNCKX0pKSxWbSgoZnVuY3Rpb24odCl7dC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKGZCKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhUQiksdC5yZWdpc3RlclByZXByb2Nlc3NvcigoZnVuY3Rpb24odCl7aEIodC5zZXJpZXMsIm1hcmtQb2ludCIpJiYodC5tYXJrUG9pbnQ9dC5tYXJrUG9pbnR8fHt9KX0pKX0pKSxWbSgoZnVuY3Rpb24odCl7dC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKENCKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhSQiksdC5yZWdpc3RlclByZXByb2Nlc3NvcigoZnVuY3Rpb24odCl7aEIodC5zZXJpZXMsIm1hcmtMaW5lIikmJih0Lm1hcmtMaW5lPXQubWFya0xpbmV8fHt9KX0pKX0pKSxWbSgoZnVuY3Rpb24odCl7dC5yZWdpc3RlckNvbXBvbmVudE1vZGVsKE5CKSx0LnJlZ2lzdGVyQ29tcG9uZW50VmlldyhIQiksdC5yZWdpc3RlclByZXByb2Nlc3NvcigoZnVuY3Rpb24odCl7aEIodC5zZXJpZXMsIm1hcmtBcmVhIikmJih0Lm1hcmtBcmVhPXQubWFya0FyZWF8fHt9KX0pKX0pKSxWbSgoZnVuY3Rpb24odCl7Vm0oZUYpLFZtKGxGKX0pKSxWbSgoZnVuY3Rpb24odCl7Vm0oX0YpLFZtKEFGKX0pKSxWbShfRiksVm0oQUYpLFZtKChmdW5jdGlvbih0KXtWbSh1RyksVm0oZkcpfSkpLFZtKHVHKSxWbShmRyksVm0oKGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJQcmVwcm9jZXNzb3IoeEcpLHQucmVnaXN0ZXJWaXN1YWwodC5QUklPUklUWS5WSVNVQUwuQVJJQSxtRyl9KSksVm0oKGZ1bmN0aW9uKHQpe3QucmVnaXN0ZXJUcmFuc2Zvcm0oTEcpLHQucmVnaXN0ZXJUcmFuc2Zvcm0oUEcpfSkpLFZtKChmdW5jdGlvbih0KXt0LnJlZ2lzdGVyQ29tcG9uZW50TW9kZWwoT0cpLHQucmVnaXN0ZXJDb21wb25lbnRWaWV3KFJHKX0pKSxWbSgoZnVuY3Rpb24odCl7dC5yZWdpc3RlclVwZGF0ZUxpZmVjeWNsZSgic2VyaWVzOmJlZm9yZXVwZGF0ZSIsKGZ1bmN0aW9uKHQsZSxuKXtFKFRvKG4uc2VyaWVzVHJhbnNpdGlvbiksKGZ1bmN0aW9uKHQpe0UoVG8odC50byksKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uLnVwZGF0ZWRTZXJpZXMsaT0wO2k8ZS5sZW5ndGg7aSsrKShudWxsIT10LnNlcmllc0luZGV4JiZ0LnNlcmllc0luZGV4PT09ZVtpXS5zZXJpZXNJbmRleHx8bnVsbCE9dC5zZXJpZXNJZCYmdC5zZXJpZXNJZD09PWVbaV0uaWQpJiYoZVtpXVtfZ109ITApfSkpfSkpfSkpLHQucmVnaXN0ZXJVcGRhdGVMaWZlY3ljbGUoInNlcmllczp0cmFuc2l0aW9uIiwoZnVuY3Rpb24odCxlLG4pe3ZhciBpPWdXKGUpO2lmKGkub2xkU2VyaWVzJiZuLnVwZGF0ZWRTZXJpZXMmJm4ub3B0aW9uQ2hhbmdlZCl7dmFyIHI9bi5zZXJpZXNUcmFuc2l0aW9uO2lmKHIpRShUbyhyKSwoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPVtdLG89W107RShUbyh0LmZyb20pLChmdW5jdGlvbih0KXt2YXIgbj1UVyhlLm9sZFNlcmllcyx0KTtuPj0wJiZyLnB1c2goe2RhdGFHcm91cElkOmUub2xkRGF0YUdyb3VwSWRzW25dLGRhdGE6ZS5vbGREYXRhW25dLGRpdmlkZTpJVyhlLm9sZERhdGFbbl0pLGdyb3VwSWREaW06dC5kaW1lbnNpb259KX0pKSxFKFRvKHQudG8pLChmdW5jdGlvbih0KXt2YXIgaT1UVyhuLnVwZGF0ZWRTZXJpZXMsdCk7aWYoaT49MCl7dmFyIHI9bi51cGRhdGVkU2VyaWVzW2ldLmdldERhdGEoKTtvLnB1c2goe2RhdGFHcm91cElkOmUub2xkRGF0YUdyb3VwSWRzW2ldLGRhdGE6cixkaXZpZGU6SVcociksZ3JvdXBJZERpbTp0LmRpbWVuc2lvbn0pfX0pKSxyLmxlbmd0aD4wJiZvLmxlbmd0aD4wJiZ3VyhyLG8saSl9KHQsaSxuLGUpfSkpO2Vsc2V7dmFyIG89ZnVuY3Rpb24odCxlKXt2YXIgbj15dCgpLGk9eXQoKSxyPXl0KCk7cmV0dXJuIEUodC5vbGRTZXJpZXMsKGZ1bmN0aW9uKGUsbil7dmFyIG89dC5vbGREYXRhR3JvdXBJZHNbbl0sYT10Lm9sZERhdGFbbl0scz1TVyhlKSxsPU1XKHMpO2kuc2V0KGwse2RhdGFHcm91cElkOm8sZGF0YTphfSksWShzKSYmRShzLChmdW5jdGlvbih0KXtyLnNldCh0LHtrZXk6bCxkYXRhR3JvdXBJZDpvLGRhdGE6YX0pfSkpfSkpLEUoZS51cGRhdGVkU2VyaWVzLChmdW5jdGlvbih0KXtpZih0LmlzVW5pdmVyc2FsVHJhbnNpdGlvbkVuYWJsZWQoKSYmdC5pc0FuaW1hdGlvbkVuYWJsZWQoKSl7dmFyIGU9dC5nZXQoImRhdGFHcm91cElkIiksbz10LmdldERhdGEoKSxhPVNXKHQpLHM9TVcoYSksbD1pLmdldChzKTtpZihsKW4uc2V0KHMse29sZFNlcmllczpbe2RhdGFHcm91cElkOmwuZGF0YUdyb3VwSWQsZGl2aWRlOklXKGwuZGF0YSksZGF0YTpsLmRhdGF9XSxuZXdTZXJpZXM6W3tkYXRhR3JvdXBJZDplLGRpdmlkZTpJVyhvKSxkYXRhOm99XX0pO2Vsc2UgaWYoWShhKSl7dmFyIHU9W107RShhLChmdW5jdGlvbih0KXt2YXIgZT1pLmdldCh0KTtlLmRhdGEmJnUucHVzaCh7ZGF0YUdyb3VwSWQ6ZS5kYXRhR3JvdXBJZCxkaXZpZGU6SVcoZS5kYXRhKSxkYXRhOmUuZGF0YX0pfSkpLHUubGVuZ3RoJiZuLnNldChzLHtvbGRTZXJpZXM6dSxuZXdTZXJpZXM6W3tkYXRhR3JvdXBJZDplLGRhdGE6byxkaXZpZGU6SVcobyl9XX0pfWVsc2V7dmFyIGg9ci5nZXQoYSk7aWYoaCl7dmFyIGM9bi5nZXQoaC5rZXkpO2N8fChjPXtvbGRTZXJpZXM6W3tkYXRhR3JvdXBJZDpoLmRhdGFHcm91cElkLGRhdGE6aC5kYXRhLGRpdmlkZTpJVyhoLmRhdGEpfV0sbmV3U2VyaWVzOltdfSxuLnNldChoLmtleSxjKSksYy5uZXdTZXJpZXMucHVzaCh7ZGF0YUdyb3VwSWQ6ZSxkYXRhOm8sZGl2aWRlOklXKG8pfSl9fX19KSksbn0oaSxuKTtFKG8ua2V5cygpLChmdW5jdGlvbih0KXt2YXIgbj1vLmdldCh0KTt3VyhuLm9sZFNlcmllcyxuLm5ld1NlcmllcyxlKX0pKX1FKG4udXBkYXRlZFNlcmllcywoZnVuY3Rpb24odCl7dFtfZ10mJih0W19nXT0hMSl9KSl9Zm9yKHZhciBhPXQuZ2V0U2VyaWVzKCkscz1pLm9sZFNlcmllcz1bXSxsPWkub2xkRGF0YUdyb3VwSWRzPVtdLHU9aS5vbGREYXRhPVtdLGg9MDtoPGEubGVuZ3RoO2grKyl7dmFyIGM9YVtoXS5nZXREYXRhKCk7Yy5jb3VudCgpPDFlNCYmKHMucHVzaChhW2hdKSxsLnB1c2goYVtoXS5nZXQoImRhdGFHcm91cElkIikpLHUucHVzaChjKSl9fSkpfSkpLFZtKChmdW5jdGlvbih0KXt0LnJlZ2lzdGVyVXBkYXRlTGlmZWN5Y2xlKCJzZXJpZXM6YmVmb3JldXBkYXRlIiwoZnVuY3Rpb24odCxlLG4pe3ZhciBpPVhiKGUpLmxhYmVsTWFuYWdlcjtpfHwoaT1YYihlKS5sYWJlbE1hbmFnZXI9bmV3IFliKSxpLmNsZWFyTGFiZWxzKCl9KSksdC5yZWdpc3RlclVwZGF0ZUxpZmVjeWNsZSgic2VyaWVzOmxheW91dGxhYmVscyIsKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1YYihlKS5sYWJlbE1hbmFnZXI7bi51cGRhdGVkU2VyaWVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuYWRkTGFiZWxzT2ZTZXJpZXMoZS5nZXRWaWV3T2ZTZXJpZXNNb2RlbCh0KSl9KSksaS51cGRhdGVMYXlvdXRDb25maWcoZSksaS5sYXlvdXQoZSksaS5wcm9jZXNzTGFiZWxzT3ZlcmFsbCgpfSkpfSkpLHQuQXhpcz1hYix0LkNoYXJ0Vmlldz1PZyx0LkNvbXBvbmVudE1vZGVsPXpwLHQuQ29tcG9uZW50Vmlldz1BZyx0Lkxpc3Q9Y3gsdC5Nb2RlbD1DYyx0LlBSSU9SSVRZPUN2LHQuU2VyaWVzTW9kZWw9YmcsdC5jb2xvcj1saSx0LmNvbm5lY3Q9ZnVuY3Rpb24odCl7aWYoWSh0KSl7dmFyIGU9dDt0PW51bGwsRShlLChmdW5jdGlvbihlKXtudWxsIT1lLmdyb3VwJiYodD1lLmdyb3VwKX0pKSx0PXR8fCJnXyIreW0rKyxFKGUsKGZ1bmN0aW9uKGUpe2UuZ3JvdXA9dH0pKX1yZXR1cm4gZm1bdF09ITAsdH0sdC5kYXRhVG9vbD17fSx0LmRlcGVuZGVuY2llcz17enJlbmRlcjoiNS42LjAifSx0LmRpc0Nvbm5lY3Q9eG0sdC5kaXNjb25uZWN0PW1tLHQuZGlzcG9zZT1mdW5jdGlvbih0KXtVKHQpP3Q9ZG1bdF06dCBpbnN0YW5jZW9mIG5tfHwodD1fbSh0KSksdCBpbnN0YW5jZW9mIG5tJiYhdC5pc0Rpc3Bvc2VkKCkmJnQuZGlzcG9zZSgpfSx0LmVudj1yLHQuZXh0ZW5kQ2hhcnRWaWV3PWZ1bmN0aW9uKHQpe3ZhciBlPU9nLmV4dGVuZCh0KTtyZXR1cm4gT2cucmVnaXN0ZXJDbGFzcyhlKSxlfSx0LmV4dGVuZENvbXBvbmVudE1vZGVsPWZ1bmN0aW9uKHQpe3ZhciBlPXpwLmV4dGVuZCh0KTtyZXR1cm4genAucmVnaXN0ZXJDbGFzcyhlKSxlfSx0LmV4dGVuZENvbXBvbmVudFZpZXc9ZnVuY3Rpb24odCl7dmFyIGU9QWcuZXh0ZW5kKHQpO3JldHVybiBBZy5yZWdpc3RlckNsYXNzKGUpLGV9LHQuZXh0ZW5kU2VyaWVzTW9kZWw9ZnVuY3Rpb24odCl7dmFyIGU9YmcuZXh0ZW5kKHQpO3JldHVybiBiZy5yZWdpc3RlckNsYXNzKGUpLGV9LHQuZm9ybWF0PVpfLHQuZ2V0Q29vcmRpbmF0ZVN5c3RlbURpbWVuc2lvbnM9ZnVuY3Rpb24odCl7dmFyIGU9d2QuZ2V0KHQpO2lmKGUpcmV0dXJuIGUuZ2V0RGltZW5zaW9uc0luZm8/ZS5nZXREaW1lbnNpb25zSW5mbygpOmUuZGltZW5zaW9ucy5zbGljZSgpfSx0LmdldEluc3RhbmNlQnlEb209X20sdC5nZXRJbnN0YW5jZUJ5SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGRtW3RdfSx0LmdldE1hcD1mdW5jdGlvbih0KXt2YXIgZT1NdigiZ2V0TWFwIik7cmV0dXJuIGUmJmUodCl9LHQuZ3JhcGhpYz1VXyx0LmhlbHBlcj1rXyx0LmluaXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPSEobiYmbi5zc3IpO2lmKGkpezA7dmFyIHI9X20odCk7aWYocilyZXR1cm4gcjswfXZhciBvPW5ldyBubSh0LGUsbik7cmV0dXJuIG8uaWQ9ImVjXyIrZ20rKyxkbVtvLmlkXT1vLGkmJlhvKHQsdm0sby5pZCksJHYobyksd3YudHJpZ2dlcigiYWZ0ZXJpbml0IixvKSxvfSx0LmlubmVyRHJhd0VsZW1lbnRPbkNhbnZhcz1kdix0Lm1hdHJpeD1DZSx0Lm51bWJlcj1ZXyx0LnBhcnNlR2VvSlNPTj1IXyx0LnBhcnNlR2VvSnNvbj1IXyx0LnJlZ2lzdGVyQWN0aW9uPUNtLHQucmVnaXN0ZXJDb29yZGluYXRlU3lzdGVtPURtLHQucmVnaXN0ZXJMYXlvdXQ9QW0sdC5yZWdpc3RlckxvYWRpbmc9T20sdC5yZWdpc3RlckxvY2FsZT16Yyx0LnJlZ2lzdGVyTWFwPVJtLHQucmVnaXN0ZXJQb3N0SW5pdD1NbSx0LnJlZ2lzdGVyUG9zdFVwZGF0ZT1JbSx0LnJlZ2lzdGVyUHJlcHJvY2Vzc29yPXdtLHQucmVnaXN0ZXJQcm9jZXNzb3I9U20sdC5yZWdpc3RlclRoZW1lPWJtLHQucmVnaXN0ZXJUcmFuc2Zvcm09Tm0sdC5yZWdpc3RlclVwZGF0ZUxpZmVjeWNsZT1UbSx0LnJlZ2lzdGVyVmlzdWFsPWttLHQuc2V0Q2FudmFzQ3JlYXRvcj1mdW5jdGlvbih0KXtjKHtjcmVhdGVDYW52YXM6dH0pfSx0LnNldFBsYXRmb3JtQVBJPWMsdC50aHJvdHRsZT1XZyx0LnRpbWU9WF8sdC51c2U9Vm0sdC51dGlsPWpfLHQudmVjdG9yPVh0LHQudmVyc2lvbj0iNS41LjEiLHQuenJVdGlsPVN0LHQuenJlbmRlcj1qcixPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KSk7Cg==";