@sentry/node 8.3.0 → 8.5.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 (173) hide show
  1. package/cjs/index.js +14 -9
  2. package/cjs/index.js.map +1 -1
  3. package/cjs/init.js +2 -2
  4. package/cjs/init.js.map +1 -1
  5. package/cjs/integrations/anr/index.js +2 -2
  6. package/cjs/integrations/anr/index.js.map +1 -1
  7. package/cjs/integrations/http.js +121 -97
  8. package/cjs/integrations/http.js.map +1 -1
  9. package/cjs/integrations/local-variables/local-variables-async.js +2 -2
  10. package/cjs/integrations/local-variables/local-variables-async.js.map +1 -1
  11. package/cjs/integrations/local-variables/local-variables-sync.js +114 -109
  12. package/cjs/integrations/local-variables/local-variables-sync.js.map +1 -1
  13. package/cjs/integrations/tracing/connect.js +8 -3
  14. package/cjs/integrations/tracing/connect.js.map +1 -1
  15. package/cjs/integrations/tracing/express.js +44 -37
  16. package/cjs/integrations/tracing/express.js.map +1 -1
  17. package/cjs/integrations/tracing/fastify.js +16 -9
  18. package/cjs/integrations/tracing/fastify.js.map +1 -1
  19. package/cjs/integrations/tracing/graphql.js +24 -16
  20. package/cjs/integrations/tracing/graphql.js.map +1 -1
  21. package/cjs/integrations/tracing/hapi/index.js +8 -3
  22. package/cjs/integrations/tracing/hapi/index.js.map +1 -1
  23. package/cjs/integrations/tracing/index.js +25 -0
  24. package/cjs/integrations/tracing/index.js.map +1 -1
  25. package/cjs/integrations/tracing/koa.js +45 -39
  26. package/cjs/integrations/tracing/koa.js.map +1 -1
  27. package/cjs/integrations/tracing/mongo.js +16 -9
  28. package/cjs/integrations/tracing/mongo.js.map +1 -1
  29. package/cjs/integrations/tracing/mongoose.js +16 -9
  30. package/cjs/integrations/tracing/mongoose.js.map +1 -1
  31. package/cjs/integrations/tracing/mysql.js +8 -3
  32. package/cjs/integrations/tracing/mysql.js.map +1 -1
  33. package/cjs/integrations/tracing/mysql2.js +16 -9
  34. package/cjs/integrations/tracing/mysql2.js.map +1 -1
  35. package/cjs/integrations/tracing/nest.js +8 -3
  36. package/cjs/integrations/tracing/nest.js.map +1 -1
  37. package/cjs/integrations/tracing/postgres.js +17 -10
  38. package/cjs/integrations/tracing/postgres.js.map +1 -1
  39. package/cjs/integrations/tracing/prisma.js +16 -7
  40. package/cjs/integrations/tracing/prisma.js.map +1 -1
  41. package/cjs/integrations/tracing/redis.js +58 -47
  42. package/cjs/integrations/tracing/redis.js.map +1 -1
  43. package/cjs/otel/instrument.js +35 -0
  44. package/cjs/otel/instrument.js.map +1 -0
  45. package/cjs/preload.js +20 -0
  46. package/cjs/preload.js.map +1 -0
  47. package/cjs/sdk/{init.js → index.js} +8 -29
  48. package/cjs/sdk/index.js.map +1 -0
  49. package/cjs/sdk/initOtel.js +88 -9
  50. package/cjs/sdk/initOtel.js.map +1 -1
  51. package/esm/index.js +4 -3
  52. package/esm/index.js.map +1 -1
  53. package/esm/init.js +1 -1
  54. package/esm/init.js.map +1 -1
  55. package/esm/integrations/anr/index.js +2 -2
  56. package/esm/integrations/anr/index.js.map +1 -1
  57. package/esm/integrations/anr/worker-script.js +2 -2
  58. package/esm/integrations/http.js +123 -100
  59. package/esm/integrations/http.js.map +1 -1
  60. package/esm/integrations/local-variables/local-variables-async.js +2 -2
  61. package/esm/integrations/local-variables/local-variables-async.js.map +1 -1
  62. package/esm/integrations/local-variables/local-variables-sync.js +114 -109
  63. package/esm/integrations/local-variables/local-variables-sync.js.map +1 -1
  64. package/esm/integrations/local-variables/worker-script.js +1 -1
  65. package/esm/integrations/tracing/connect.js +8 -4
  66. package/esm/integrations/tracing/connect.js.map +1 -1
  67. package/esm/integrations/tracing/express.js +44 -38
  68. package/esm/integrations/tracing/express.js.map +1 -1
  69. package/esm/integrations/tracing/fastify.js +16 -10
  70. package/esm/integrations/tracing/fastify.js.map +1 -1
  71. package/esm/integrations/tracing/graphql.js +24 -17
  72. package/esm/integrations/tracing/graphql.js.map +1 -1
  73. package/esm/integrations/tracing/hapi/index.js +8 -4
  74. package/esm/integrations/tracing/hapi/index.js.map +1 -1
  75. package/esm/integrations/tracing/index.js +37 -13
  76. package/esm/integrations/tracing/index.js.map +1 -1
  77. package/esm/integrations/tracing/koa.js +45 -40
  78. package/esm/integrations/tracing/koa.js.map +1 -1
  79. package/esm/integrations/tracing/mongo.js +16 -10
  80. package/esm/integrations/tracing/mongo.js.map +1 -1
  81. package/esm/integrations/tracing/mongoose.js +16 -10
  82. package/esm/integrations/tracing/mongoose.js.map +1 -1
  83. package/esm/integrations/tracing/mysql.js +8 -4
  84. package/esm/integrations/tracing/mysql.js.map +1 -1
  85. package/esm/integrations/tracing/mysql2.js +16 -10
  86. package/esm/integrations/tracing/mysql2.js.map +1 -1
  87. package/esm/integrations/tracing/nest.js +8 -4
  88. package/esm/integrations/tracing/nest.js.map +1 -1
  89. package/esm/integrations/tracing/postgres.js +17 -11
  90. package/esm/integrations/tracing/postgres.js.map +1 -1
  91. package/esm/integrations/tracing/prisma.js +16 -8
  92. package/esm/integrations/tracing/prisma.js.map +1 -1
  93. package/esm/integrations/tracing/redis.js +57 -47
  94. package/esm/integrations/tracing/redis.js.map +1 -1
  95. package/esm/otel/instrument.js +33 -0
  96. package/esm/otel/instrument.js.map +1 -0
  97. package/esm/preload.js +20 -0
  98. package/esm/preload.js.map +1 -0
  99. package/esm/sdk/{init.js → index.js} +11 -32
  100. package/esm/sdk/index.js.map +1 -0
  101. package/esm/sdk/initOtel.js +88 -12
  102. package/esm/sdk/initOtel.js.map +1 -1
  103. package/package.json +13 -5
  104. package/types/index.d.ts +4 -3
  105. package/types/index.d.ts.map +1 -1
  106. package/types/integrations/anr/index.d.ts.map +1 -1
  107. package/types/integrations/http.d.ts +7 -0
  108. package/types/integrations/http.d.ts.map +1 -1
  109. package/types/integrations/local-variables/local-variables-sync.d.ts +1 -1
  110. package/types/integrations/local-variables/local-variables-sync.d.ts.map +1 -1
  111. package/types/integrations/tracing/connect.d.ts +3 -0
  112. package/types/integrations/tracing/connect.d.ts.map +1 -1
  113. package/types/integrations/tracing/express.d.ts +3 -0
  114. package/types/integrations/tracing/express.d.ts.map +1 -1
  115. package/types/integrations/tracing/fastify.d.ts +3 -0
  116. package/types/integrations/tracing/fastify.d.ts.map +1 -1
  117. package/types/integrations/tracing/graphql.d.ts +4 -1
  118. package/types/integrations/tracing/graphql.d.ts.map +1 -1
  119. package/types/integrations/tracing/hapi/index.d.ts +3 -0
  120. package/types/integrations/tracing/hapi/index.d.ts.map +1 -1
  121. package/types/integrations/tracing/index.d.ts +6 -0
  122. package/types/integrations/tracing/index.d.ts.map +1 -1
  123. package/types/integrations/tracing/koa.d.ts +3 -0
  124. package/types/integrations/tracing/koa.d.ts.map +1 -1
  125. package/types/integrations/tracing/mongo.d.ts +3 -0
  126. package/types/integrations/tracing/mongo.d.ts.map +1 -1
  127. package/types/integrations/tracing/mongoose.d.ts +3 -0
  128. package/types/integrations/tracing/mongoose.d.ts.map +1 -1
  129. package/types/integrations/tracing/mysql.d.ts +3 -0
  130. package/types/integrations/tracing/mysql.d.ts.map +1 -1
  131. package/types/integrations/tracing/mysql2.d.ts +3 -0
  132. package/types/integrations/tracing/mysql2.d.ts.map +1 -1
  133. package/types/integrations/tracing/nest.d.ts +3 -0
  134. package/types/integrations/tracing/nest.d.ts.map +1 -1
  135. package/types/integrations/tracing/postgres.d.ts +3 -0
  136. package/types/integrations/tracing/postgres.d.ts.map +1 -1
  137. package/types/integrations/tracing/prisma.d.ts +3 -0
  138. package/types/integrations/tracing/prisma.d.ts.map +1 -1
  139. package/types/integrations/tracing/redis.d.ts +3 -0
  140. package/types/integrations/tracing/redis.d.ts.map +1 -1
  141. package/types/otel/instrument.d.ts +9 -0
  142. package/types/otel/instrument.d.ts.map +1 -0
  143. package/types/preload.d.ts +2 -0
  144. package/types/preload.d.ts.map +1 -0
  145. package/types/sdk/{init.d.ts → index.d.ts} +5 -1
  146. package/types/sdk/index.d.ts.map +1 -0
  147. package/types/sdk/initOtel.d.ts +13 -0
  148. package/types/sdk/initOtel.d.ts.map +1 -1
  149. package/types-ts3.8/index.d.ts +4 -3
  150. package/types-ts3.8/integrations/http.d.ts +7 -0
  151. package/types-ts3.8/integrations/local-variables/local-variables-sync.d.ts +1 -1
  152. package/types-ts3.8/integrations/tracing/connect.d.ts +3 -0
  153. package/types-ts3.8/integrations/tracing/express.d.ts +3 -0
  154. package/types-ts3.8/integrations/tracing/fastify.d.ts +3 -0
  155. package/types-ts3.8/integrations/tracing/graphql.d.ts +4 -1
  156. package/types-ts3.8/integrations/tracing/hapi/index.d.ts +3 -0
  157. package/types-ts3.8/integrations/tracing/index.d.ts +6 -0
  158. package/types-ts3.8/integrations/tracing/koa.d.ts +3 -0
  159. package/types-ts3.8/integrations/tracing/mongo.d.ts +3 -0
  160. package/types-ts3.8/integrations/tracing/mongoose.d.ts +3 -0
  161. package/types-ts3.8/integrations/tracing/mysql.d.ts +3 -0
  162. package/types-ts3.8/integrations/tracing/mysql2.d.ts +3 -0
  163. package/types-ts3.8/integrations/tracing/nest.d.ts +3 -0
  164. package/types-ts3.8/integrations/tracing/postgres.d.ts +3 -0
  165. package/types-ts3.8/integrations/tracing/prisma.d.ts +3 -0
  166. package/types-ts3.8/integrations/tracing/redis.d.ts +3 -0
  167. package/types-ts3.8/otel/instrument.d.ts +9 -0
  168. package/types-ts3.8/preload.d.ts +2 -0
  169. package/types-ts3.8/sdk/{init.d.ts → index.d.ts} +5 -1
  170. package/types-ts3.8/sdk/initOtel.d.ts +13 -0
  171. package/cjs/sdk/init.js.map +0 -1
  172. package/esm/sdk/init.js.map +0 -1
  173. package/types/sdk/init.d.ts.map +0 -1
package/cjs/index.js CHANGED
@@ -25,14 +25,15 @@ const index$2 = require('./integrations/tracing/hapi/index.js');
25
25
  const koa = require('./integrations/tracing/koa.js');
26
26
  const connect = require('./integrations/tracing/connect.js');
27
27
  const spotlight = require('./integrations/spotlight.js');
28
- const init = require('./sdk/init.js');
28
+ const contextManager = require('./otel/contextManager.js');
29
+ const index$3 = require('./sdk/index.js');
29
30
  const initOtel = require('./sdk/initOtel.js');
30
- const index$3 = require('./integrations/tracing/index.js');
31
+ const index$4 = require('./integrations/tracing/index.js');
31
32
  const api = require('./sdk/api.js');
32
33
  const module$1 = require('./utils/module.js');
33
34
  const http$1 = require('./transports/http.js');
34
35
  const client = require('./sdk/client.js');
35
- const index$4 = require('./cron/index.js');
36
+ const index$5 = require('./cron/index.js');
36
37
  const utils = require('@sentry/utils');
37
38
  const opentelemetry = require('@sentry/opentelemetry');
38
39
  const core = require('@sentry/core');
@@ -71,18 +72,21 @@ exports.setupKoaErrorHandler = koa.setupKoaErrorHandler;
71
72
  exports.connectIntegration = connect.connectIntegration;
72
73
  exports.setupConnectErrorHandler = connect.setupConnectErrorHandler;
73
74
  exports.spotlightIntegration = spotlight.spotlightIntegration;
74
- exports.getDefaultIntegrations = init.getDefaultIntegrations;
75
- exports.getDefaultIntegrationsWithoutPerformance = init.getDefaultIntegrationsWithoutPerformance;
76
- exports.init = init.init;
77
- exports.initWithoutDefaultIntegrations = init.initWithoutDefaultIntegrations;
75
+ exports.SentryContextManager = contextManager.SentryContextManager;
76
+ exports.getDefaultIntegrations = index$3.getDefaultIntegrations;
77
+ exports.getDefaultIntegrationsWithoutPerformance = index$3.getDefaultIntegrationsWithoutPerformance;
78
+ exports.init = index$3.init;
79
+ exports.initWithoutDefaultIntegrations = index$3.initWithoutDefaultIntegrations;
80
+ exports.validateOpenTelemetrySetup = index$3.validateOpenTelemetrySetup;
78
81
  exports.initOpenTelemetry = initOtel.initOpenTelemetry;
79
- exports.getAutoPerformanceIntegrations = index$3.getAutoPerformanceIntegrations;
82
+ exports.preloadOpenTelemetry = initOtel.preloadOpenTelemetry;
83
+ exports.getAutoPerformanceIntegrations = index$4.getAutoPerformanceIntegrations;
80
84
  exports.defaultStackParser = api.defaultStackParser;
81
85
  exports.getSentryRelease = api.getSentryRelease;
82
86
  exports.createGetModuleFromFilename = module$1.createGetModuleFromFilename;
83
87
  exports.makeNodeTransport = http$1.makeNodeTransport;
84
88
  exports.NodeClient = client.NodeClient;
85
- exports.cron = index$4.cron;
89
+ exports.cron = index$5.cron;
86
90
  exports.DEFAULT_USER_INCLUDES = utils.DEFAULT_USER_INCLUDES;
87
91
  exports.addRequestDataToEvent = utils.addRequestDataToEvent;
88
92
  exports.extractRequestData = utils.extractRequestData;
@@ -144,6 +148,7 @@ exports.spanToBaggageHeader = core.spanToBaggageHeader;
144
148
  exports.spanToJSON = core.spanToJSON;
145
149
  exports.spanToTraceHeader = core.spanToTraceHeader;
146
150
  exports.startInactiveSpan = core.startInactiveSpan;
151
+ exports.startNewTrace = core.startNewTrace;
147
152
  exports.startSession = core.startSession;
148
153
  exports.startSpan = core.startSpan;
149
154
  exports.startSpanManual = core.startSpanManual;
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/cjs/init.js CHANGED
@@ -1,4 +1,4 @@
1
- const init = require('./sdk/init.js');
1
+ const index = require('./sdk/index.js');
2
2
 
3
3
  /**
4
4
  * The @sentry/node/init export can be used with the node --import and --require args to initialize the SDK entirely via
@@ -6,5 +6,5 @@ const init = require('./sdk/init.js');
6
6
  *
7
7
  * > SENTRY_DSN=https://examplePublicKey@o0.ingest.sentry.io/0 SENTRY_TRACES_SAMPLE_RATE=1.0 node --import=@sentry/node/init app.mjs
8
8
  */
9
- init.init();
9
+ index.init();
10
10
  //# sourceMappingURL=init.js.map
package/cjs/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sources":["../../src/init.ts"],"sourcesContent":["import { init } from './sdk/init';\n\n/**\n * The @sentry/node/init export can be used with the node --import and --require args to initialize the SDK entirely via\n * environment variables.\n *\n * > SENTRY_DSN=https://examplePublicKey@o0.ingest.sentry.io/0 SENTRY_TRACES_SAMPLE_RATE=1.0 node --import=@sentry/node/init app.mjs\n */\ninit();\n"],"names":["init"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACAA,SAAI,EAAE;;"}
1
+ {"version":3,"file":"init.js","sources":["../../src/init.ts"],"sourcesContent":["import { init } from './sdk';\n\n/**\n * The @sentry/node/init export can be used with the node --import and --require args to initialize the SDK entirely via\n * environment variables.\n *\n * > SENTRY_DSN=https://examplePublicKey@o0.ingest.sentry.io/0 SENTRY_TRACES_SAMPLE_RATE=1.0 node --import=@sentry/node/init app.mjs\n */\ninit();\n"],"names":["init"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACAA,UAAI,EAAE;;"}
@@ -5,14 +5,13 @@ var {
5
5
 
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
- const inspector = require('node:inspector');
9
8
  const node_worker_threads = require('node:worker_threads');
10
9
  const core = require('@sentry/core');
11
10
  const utils = require('@sentry/utils');
12
11
  const nodeVersion = require('../../nodeVersion.js');
13
12
 
14
13
  // This string is a placeholder that gets overwritten with the worker code.
15
- const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjMuMCAoOGI5OWRlNykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtwYXJlbnRQb3J0IGFzIHQsd29ya2VyRGF0YSBhcyBlfWZyb20ibm9kZTp3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e1Nlc3Npb24gYXMgbn1mcm9tImluc3BlY3RvciI7aW1wb3J0e3Bvc2l4IGFzIHIsc2VwIGFzIG99ZnJvbSJub2RlOnBhdGgiO2ltcG9ydCphcyBzIGZyb20ibm9kZTpodHRwIjtpbXBvcnQqYXMgaSBmcm9tIm5vZGU6aHR0cHMiO2ltcG9ydHtSZWFkYWJsZSBhcyBjfWZyb20ibm9kZTpzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJub2RlOnpsaWIiO2ltcG9ydCphcyBhIGZyb20ibm9kZTpuZXQiO2ltcG9ydCphcyBmIGZyb20ibm9kZTp0bHMiO2NvbnN0IGg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBwKHQsZSl7cmV0dXJuIGguY2FsbCh0KT09PWBbb2JqZWN0ICR7ZX1dYH1mdW5jdGlvbiBsKHQpe3JldHVybiBwKHQsIk9iamVjdCIpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIEJvb2xlYW4odCYmdC50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuKX1mdW5jdGlvbiBtKHQsZSl7dHJ5e3JldHVybiB0IGluc3RhbmNlb2YgZX1jYXRjaCh0KXtyZXR1cm4hMX19Y29uc3QgZz1nbG9iYWxUaGlzO2Z1bmN0aW9uIHkodCxlLG4pe2NvbnN0IHI9bnx8ZyxvPXIuX19TRU5UUllfXz1yLl9fU0VOVFJZX198fHt9O3JldHVybiBvW3RdfHwob1t0XT1lKCkpfWNvbnN0IGI9Zyx2PTgwO2Z1bmN0aW9uIF8odCxlKXtjb25zdCBuPXQscj1bXTtsZXQgbyxzLGksYyx1O2lmKCFufHwhbi50YWdOYW1lKXJldHVybiIiO2lmKGIuSFRNTEVsZW1lbnQmJm4gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmbi5kYXRhc2V0KXtpZihuLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50KXJldHVybiBuLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50O2lmKG4uZGF0YXNldC5zZW50cnlFbGVtZW50KXJldHVybiBuLmRhdGFzZXQuc2VudHJ5RWxlbWVudH1yLnB1c2gobi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO2NvbnN0IGE9ZSYmZS5sZW5ndGg/ZS5maWx0ZXIoKHQ9Pm4uZ2V0QXR0cmlidXRlKHQpKSkubWFwKCh0PT5bdCxuLmdldEF0dHJpYnV0ZSh0KV0pKTpudWxsO2lmKGEmJmEubGVuZ3RoKWEuZm9yRWFjaCgodD0+e3IucHVzaChgWyR7dFswXX09IiR7dFsxXX0iXWApfSkpO2Vsc2UgaWYobi5pZCYmci5wdXNoKGAjJHtuLmlkfWApLG89bi5jbGFzc05hbWUsbyYmcChvLCJTdHJpbmciKSlmb3Iocz1vLnNwbGl0KC9ccysvKSx1PTA7dTxzLmxlbmd0aDt1Kyspci5wdXNoKGAuJHtzW3VdfWApO2NvbnN0IGY9WyJhcmlhLWxhYmVsIiwidHlwZSIsIm5hbWUiLCJ0aXRsZSIsImFsdCJdO2Zvcih1PTA7dTxmLmxlbmd0aDt1KyspaT1mW3VdLGM9bi5nZXRBdHRyaWJ1dGUoaSksYyYmci5wdXNoKGBbJHtpfT0iJHtjfSJdYCk7cmV0dXJuIHIuam9pbigiIil9Y29uc3Qgdz0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX18sUz1bImRlYnVnIiwiaW5mbyIsIndhcm4iLCJlcnJvciIsImxvZyIsImFzc2VydCIsInRyYWNlIl0sJD17fTtmdW5jdGlvbiBFKHQpe2lmKCEoImNvbnNvbGUiaW4gZykpcmV0dXJuIHQoKTtjb25zdCBlPWcuY29uc29sZSxuPXt9LHI9T2JqZWN0LmtleXMoJCk7ci5mb3JFYWNoKCh0PT57Y29uc3Qgcj0kW3RdO25bdF09ZVt0XSxlW3RdPXJ9KSk7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtyLmZvckVhY2goKHQ9PntlW3RdPW5bdF19KSl9fWNvbnN0IHg9ZnVuY3Rpb24oKXtsZXQgdD0hMTtjb25zdCBlPXtlbmFibGU6KCk9Pnt0PSEwfSxkaXNhYmxlOigpPT57dD0hMX0saXNFbmFibGVkOigpPT50fTtyZXR1cm4gdz9TLmZvckVhY2goKG49PntlW25dPSguLi5lKT0+e3QmJkUoKCgpPT57Zy5jb25zb2xlW25dKGBTZW50cnkgTG9nZ2VyIFske259XTpgLC4uLmUpfSkpfX0pKTpTLmZvckVhY2goKHQ9PntlW3RdPSgpPT57fX0pKSxlfSgpO2Z1bmN0aW9uIE4odCxlPSExKXtjb25zdHtob3N0Om4scGF0aDpyLHBhc3M6byxwb3J0OnMscHJvamVjdElkOmkscHJvdG9jb2w6YyxwdWJsaWNLZXk6dX09dDtyZXR1cm5gJHtjfTovLyR7dX0ke2UmJm8/YDoke299YDoiIn1AJHtufSR7cz9gOiR7c31gOiIifS8ke3I/YCR7cn0vYDpyfSR7aX1gfWNsYXNzIGsgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGU9Indhcm4iKXtzdXBlcih0KSx0aGlzLm1lc3NhZ2U9dCx0aGlzLm5hbWU9bmV3LnRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuZXcudGFyZ2V0LnByb3RvdHlwZSksdGhpcy5sb2dMZXZlbD1lfX1mdW5jdGlvbiBDKHQpe2lmKGZ1bmN0aW9uKHQpe3N3aXRjaChoLmNhbGwodCkpe2Nhc2UiW29iamVjdCBFcnJvcl0iOmNhc2UiW29iamVjdCBFeGNlcHRpb25dIjpjYXNlIltvYmplY3QgRE9NRXhjZXB0aW9uXSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4gbSh0LEVycm9yKX19KHQpKXJldHVybnttZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrLC4uLlQodCl9O2lmKGU9dCwidW5kZWZpbmVkIiE9dHlwZW9mIEV2ZW50JiZtKGUsRXZlbnQpKXtjb25zdCBlPXt0eXBlOnQudHlwZSx0YXJnZXQ6RCh0LnRhcmdldCksY3VycmVudFRhcmdldDpEKHQuY3VycmVudFRhcmdldCksLi4uVCh0KX07cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBDdXN0b21FdmVudCYmbSh0LEN1c3RvbUV2ZW50KSYmKGUuZGV0YWlsPXQuZGV0YWlsKSxlfXJldHVybiB0O3ZhciBlfWZ1bmN0aW9uIEQodCl7dHJ5e3JldHVybiBlPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50JiZtKGUsRWxlbWVudCk/ZnVuY3Rpb24odCxlPXt9KXtpZighdClyZXR1cm4iPHVua25vd24+Ijt0cnl7bGV0IG49dDtjb25zdCByPTUsbz1bXTtsZXQgcz0wLGk9MDtjb25zdCBjPSIgPiAiLHU9Yy5sZW5ndGg7bGV0IGE7Y29uc3QgZj1BcnJheS5pc0FycmF5KGUpP2U6ZS5rZXlBdHRycyxoPSFBcnJheS5pc0FycmF5KGUpJiZlLm1heFN0cmluZ0xlbmd0aHx8djtmb3IoO24mJnMrKzxyJiYoYT1fKG4sZiksISgiaHRtbCI9PT1hfHxzPjEmJmkrby5sZW5ndGgqdSthLmxlbmd0aD49aCkpOylvLnB1c2goYSksaSs9YS5sZW5ndGgsbj1uLnBhcmVudE5vZGU7cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oYyl9Y2F0Y2godCl7cmV0dXJuIjx1bmtub3duPiJ9fSh0KTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9Y2F0Y2godCl7cmV0dXJuIjx1bmtub3duPiJ9dmFyIGV9ZnVuY3Rpb24gVCh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlfXJldHVybnt9fWZ1bmN0aW9uIE8odCl7cmV0dXJuIGoodCxuZXcgTWFwKX1mdW5jdGlvbiBqKHQsZSl7aWYoZnVuY3Rpb24odCl7aWYoIWwodCkpcmV0dXJuITE7dHJ5e2NvbnN0IGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yLm5hbWU7cmV0dXJuIWV8fCJPYmplY3QiPT09ZX1jYXRjaCh0KXtyZXR1cm4hMH19KHQpKXtjb25zdCBuPWUuZ2V0KHQpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47Y29uc3Qgcj17fTtlLnNldCh0LHIpO2Zvcihjb25zdCBuIG9mIE9iamVjdC5rZXlzKHQpKXZvaWQgMCE9PXRbbl0mJihyW25dPWoodFtuXSxlKSk7cmV0dXJuIHJ9aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgbj1lLmdldCh0KTtpZih2b2lkIDAhPT1uKXJldHVybiBuO2NvbnN0IHI9W107cmV0dXJuIGUuc2V0KHQsciksdC5mb3JFYWNoKCh0PT57ci5wdXNoKGoodCxlKSl9KSkscn1yZXR1cm4gdH1jb25zdCBSPTUwLEE9Ij8iLEk9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2NvbnN0IFA9Ijxhbm9ueW1vdXM+Ijtjb25zdCBVPTFlMztmdW5jdGlvbiBNKCl7cmV0dXJuIERhdGUubm93KCkvVX1jb25zdCBMPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09ZztpZighdHx8IXQubm93KXJldHVybiBNO2NvbnN0IGU9RGF0ZS5ub3coKS10Lm5vdygpLG49bnVsbD09dC50aW1lT3JpZ2luP2U6dC50aW1lT3JpZ2luO3JldHVybigpPT4obit0Lm5vdygpKS9VfSgpO2Z1bmN0aW9uIEIoKXtjb25zdCB0PWcsZT10LmNyeXB0b3x8dC5tc0NyeXB0bztsZXQgbj0oKT0+MTYqTWF0aC5yYW5kb20oKTt0cnl7aWYoZSYmZS5yYW5kb21VVUlEKXJldHVybiBlLnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csIiIpO2UmJmUuZ2V0UmFuZG9tVmFsdWVzJiYobj0oKT0+e2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGUuZ2V0UmFuZG9tVmFsdWVzKHQpLHRbMF19KX1jYXRjaCh0KXt9cmV0dXJuKFsxZTddKzFlMys0ZTMrOGUzKzFlMTEpLnJlcGxhY2UoL1swMThdL2csKHQ9Pih0XigxNSZuKCkpPj50LzQpLnRvU3RyaW5nKDE2KSkpfWZ1bmN0aW9uIEcodCxlPTEwMCxuPTEvMCl7dHJ5e3JldHVybiBKKCIiLHQsZSxuKX1jYXRjaCh0KXtyZXR1cm57RVJST1I6YCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9fX1mdW5jdGlvbiBKKHQsZSxuPTEvMCxyPTEvMCxvPWZ1bmN0aW9uKCl7Y29uc3QgdD0iZnVuY3Rpb24iPT10eXBlb2YgV2Vha1NldCxlPXQ/bmV3IFdlYWtTZXQ6W107cmV0dXJuW2Z1bmN0aW9uKG4pe2lmKHQpcmV0dXJuISFlLmhhcyhuKXx8KGUuYWRkKG4pLCExKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdPT09bilyZXR1cm4hMDtyZXR1cm4gZS5wdXNoKG4pLCExfSxmdW5jdGlvbihuKXtpZih0KWUuZGVsZXRlKG4pO2Vsc2UgZm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspaWYoZVt0XT09PW4pe2Uuc3BsaWNlKHQsMSk7YnJlYWt9fV19KCkpe2NvbnN0W3MsaV09bztpZihudWxsPT1lfHxbIm51bWJlciIsImJvb2xlYW4iLCJzdHJpbmciXS5pbmNsdWRlcyh0eXBlb2YgZSkmJiFOdW1iZXIuaXNOYU4oZSkpcmV0dXJuIGU7Y29uc3QgYz1mdW5jdGlvbih0LGUpe3RyeXtpZigiZG9tYWluIj09PXQmJmUmJiJvYmplY3QiPT10eXBlb2YgZSYmZS50KXJldHVybiJbRG9tYWluXSI7aWYoImRvbWFpbkVtaXR0ZXIiPT09dClyZXR1cm4iW0RvbWFpbkVtaXR0ZXJdIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmZT09PWdsb2JhbClyZXR1cm4iW0dsb2JhbF0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZlPT09d2luZG93KXJldHVybiJbV2luZG93XSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZT09PWRvY3VtZW50KXJldHVybiJbRG9jdW1lbnRdIjtpZigib2JqZWN0Ij09dHlwZW9mKG49ZSkmJm51bGwhPT1uJiYobi5fX2lzVnVlfHxuLm8pKXJldHVybiJbVnVlVmlld01vZGVsXSI7aWYoZnVuY3Rpb24odCl7cmV0dXJuIGwodCkmJiJuYXRpdmVFdmVudCJpbiB0JiYicHJldmVudERlZmF1bHQiaW4gdCYmInN0b3BQcm9wYWdhdGlvbiJpbiB0fShlKSlyZXR1cm4iW1N5bnRoZXRpY0V2ZW50XSI7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlIT1lKXJldHVybiJbTmFOXSI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuYFtGdW5jdGlvbjogJHtmdW5jdGlvbih0KXt0cnl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0Lm5hbWV8fFB9Y2F0Y2godCl7cmV0dXJuIFB9fShlKX1dYDtpZigic3ltYm9sIj09dHlwZW9mIGUpcmV0dXJuYFske1N0cmluZyhlKX1dYDtpZigiYmlnaW50Ij09dHlwZW9mIGUpcmV0dXJuYFtCaWdJbnQ6ICR7U3RyaW5nKGUpfV1gO2NvbnN0IHI9ZnVuY3Rpb24odCl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7cmV0dXJuIGU/ZS5jb25zdHJ1Y3Rvci5uYW1lOiJudWxsIHByb3RvdHlwZSJ9KGUpO3JldHVybi9eSFRNTChcdyopRWxlbWVudCQvLnRlc3Qocik/YFtIVE1MRWxlbWVudDogJHtyfV1gOmBbb2JqZWN0ICR7cn1dYH1jYXRjaCh0KXtyZXR1cm5gKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH12YXIgbn0odCxlKTtpZighYy5zdGFydHNXaXRoKCJbb2JqZWN0ICIpKXJldHVybiBjO2lmKGUuX19zZW50cnlfc2tpcF9ub3JtYWxpemF0aW9uX18pcmV0dXJuIGU7Y29uc3QgdT0ibnVtYmVyIj09dHlwZW9mIGUuX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fP2UuX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fOm47aWYoMD09PXUpcmV0dXJuIGMucmVwbGFjZSgib2JqZWN0ICIsIiIpO2lmKHMoZSkpcmV0dXJuIltDaXJjdWxhciB+XSI7Y29uc3QgYT1lO2lmKGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRvSlNPTil0cnl7cmV0dXJuIEooIiIsYS50b0pTT04oKSx1LTEscixvKX1jYXRjaCh0KXt9Y29uc3QgZj1BcnJheS5pc0FycmF5KGUpP1tdOnt9O2xldCBoPTA7Y29uc3QgcD1DKGUpO2Zvcihjb25zdCB0IGluIHApe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCx0KSljb250aW51ZTtpZihoPj1yKXtmW3RdPSJbTWF4UHJvcGVydGllcyB+XSI7YnJlYWt9Y29uc3QgZT1wW3RdO2ZbdF09Sih0LGUsdS0xLHIsbyksaCsrfXJldHVybiBpKGUpLGZ9ZnVuY3Rpb24geih0LGUpe2NvbnN0IG49ZS5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvW3xcXHt9KClbXF1eJCsqPy5dL2csIlxcJCYiKTtsZXQgcj10O3RyeXtyPWRlY29kZVVSSSh0KX1jYXRjaCh0KXt9cmV0dXJuIHIucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL3dlYnBhY2s6XC8/L2csIiIpLnJlcGxhY2UobmV3IFJlZ0V4cChgKGZpbGU6Ly8pPy8qJHtufS8qYCwiaWciKSwiYXBwOi8vLyIpfSgoKT0+e2NvbnN0e3BlcmZvcm1hbmNlOnR9PWc7aWYoIXR8fCF0Lm5vdylyZXR1cm47Y29uc3QgZT0zNmU1LG49dC5ub3coKSxyPURhdGUubm93KCksbz10LnRpbWVPcmlnaW4/TWF0aC5hYnModC50aW1lT3JpZ2luK24tcik6ZSxzPW88ZSxpPXQudGltaW5nJiZ0LnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsYz0ibnVtYmVyIj09dHlwZW9mIGk/TWF0aC5hYnMoaStuLXIpOmU7KHN8fGM8ZSkmJihvPD1jJiZ0LnRpbWVPcmlnaW4pfSkoKTtjb25zdCBIPS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBXKHQpe2NvbnN0IGU9ZnVuY3Rpb24odCl7Y29uc3QgZT10Lmxlbmd0aD4xMDI0P2A8dHJ1bmNhdGVkPiR7dC5zbGljZSgtMTAyNCl9YDp0LG49SC5leGVjKGUpO3JldHVybiBuP24uc2xpY2UoMSk6W119KHQpLG49ZVswXTtsZXQgcj1lWzFdO3JldHVybiBufHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLG4rcik6Ii4ifXZhciBZO2Z1bmN0aW9uIHEodCl7cmV0dXJuIG5ldyBGKChlPT57ZSh0KX0pKX0hZnVuY3Rpb24odCl7dFt0LlBFTkRJTkc9MF09IlBFTkRJTkciO3RbdC5SRVNPTFZFRD0xXT0iUkVTT0xWRUQiO3RbdC5SRUpFQ1RFRD0yXT0iUkVKRUNURUQifShZfHwoWT17fSkpO2NsYXNzIEZ7Y29uc3RydWN0b3IodCl7Ri5wcm90b3R5cGUuX19pbml0LmNhbGwodGhpcyksRi5wcm90b3R5cGUuX19pbml0Mi5jYWxsKHRoaXMpLEYucHJvdG90eXBlLl9faW5pdDMuY2FsbCh0aGlzKSxGLnByb3RvdHlwZS5fX2luaXQ0LmNhbGwodGhpcyksdGhpcy5pPVkuUEVORElORyx0aGlzLnU9W107dHJ5e3QodGhpcy5oLHRoaXMucCl9Y2F0Y2godCl7dGhpcy5wKHQpfX10aGVuKHQsZSl7cmV0dXJuIG5ldyBGKCgobixyKT0+e3RoaXMudS5wdXNoKFshMSxlPT57aWYodCl0cnl7bih0KGUpKX1jYXRjaCh0KXtyKHQpfWVsc2UgbihlKX0sdD0+e2lmKGUpdHJ5e24oZSh0KSl9Y2F0Y2godCl7cih0KX1lbHNlIHIodCl9XSksdGhpcy5sKCl9KSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMudGhlbigodD0+dCksdCl9ZmluYWxseSh0KXtyZXR1cm4gbmV3IEYoKChlLG4pPT57bGV0IHIsbztyZXR1cm4gdGhpcy50aGVuKChlPT57bz0hMSxyPWUsdCYmdCgpfSksKGU9PntvPSEwLHI9ZSx0JiZ0KCl9KSkudGhlbigoKCk9PntvP24ocik6ZShyKX0pKX0pKX1fX2luaXQoKXt0aGlzLmg9dD0+e3RoaXMubShZLlJFU09MVkVELHQpfX1fX2luaXQyKCl7dGhpcy5wPXQ9Pnt0aGlzLm0oWS5SRUpFQ1RFRCx0KX19X19pbml0Mygpe3RoaXMubT0odCxlKT0+e3RoaXMuaT09PVkuUEVORElORyYmKGQoZSk/ZS50aGVuKHRoaXMuaCx0aGlzLnApOih0aGlzLmk9dCx0aGlzLnY9ZSx0aGlzLmwoKSkpfX1fX2luaXQ0KCl7dGhpcy5sPSgpPT57aWYodGhpcy5pPT09WS5QRU5ESU5HKXJldHVybjtjb25zdCB0PXRoaXMudS5zbGljZSgpO3RoaXMudT1bXSx0LmZvckVhY2goKHQ9Pnt0WzBdfHwodGhpcy5pPT09WS5SRVNPTFZFRCYmdFsxXSh0aGlzLnYpLHRoaXMuaT09PVkuUkVKRUNURUQmJnRbMl0odGhpcy52KSx0WzBdPSEwKX0pKX19fWZ1bmN0aW9uIEsodCl7Y29uc3QgZT1bXTtmdW5jdGlvbiBuKHQpe3JldHVybiBlLnNwbGljZShlLmluZGV4T2YodCksMSlbMF19cmV0dXJueyQ6ZSxhZGQ6ZnVuY3Rpb24ocil7aWYoISh2b2lkIDA9PT10fHxlLmxlbmd0aDx0KSlyZXR1cm4gbz1uZXcgaygiTm90IGFkZGluZyBQcm9taXNlIGJlY2F1c2UgYnVmZmVyIGxpbWl0IHdhcyByZWFjaGVkLiIpLG5ldyBGKCgodCxlKT0+e2Uobyl9KSk7dmFyIG87Y29uc3Qgcz1yKCk7cmV0dXJuLTE9PT1lLmluZGV4T2YocykmJmUucHVzaChzKSxzLnRoZW4oKCgpPT5uKHMpKSkudGhlbihudWxsLCgoKT0+bihzKS50aGVuKG51bGwsKCgpPT57fSkpKSksc30sZHJhaW46ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGKCgobixyKT0+e2xldCBvPWUubGVuZ3RoO2lmKCFvKXJldHVybiBuKCEwKTtjb25zdCBzPXNldFRpbWVvdXQoKCgpPT57dCYmdD4wJiZuKCExKX0pLHQpO2UuZm9yRWFjaCgodD0+e3EodCkudGhlbigoKCk9PnstLW98fChjbGVhclRpbWVvdXQocyksbighMCkpfSkscil9KSl9KSl9fX1mdW5jdGlvbiBWKHQsZT0hMSl7cmV0dXJuIShlfHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWZ1bmN0aW9uIFoodCxlPVtdKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBRKHQsZSl7Y29uc3Qgbj10WzFdO2Zvcihjb25zdCB0IG9mIG4pe2lmKGUodCx0WzBdLnR5cGUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFgodCl7cmV0dXJuIGcuX19TRU5UUllfXyYmZy5fX1NFTlRSWV9fLmVuY29kZVBvbHlmaWxsP2cuX19TRU5UUllfXy5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gdHQodCl7Y29uc3RbZSxuXT10O2xldCByPUpTT04uc3RyaW5naWZ5KGUpO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbWChyKSx0XTpyLnB1c2goInN0cmluZyI9PXR5cGVvZiB0P1godCk6dCl9Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3RbZSxuXT10O2lmKG8oYFxuJHtKU09OLnN0cmluZ2lmeShlKX1cbmApLCJzdHJpbmciPT10eXBlb2Ygbnx8biBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpbyhuKTtlbHNle2xldCB0O3RyeXt0PUpTT04uc3RyaW5naWZ5KG4pfWNhdGNoKGUpe3Q9SlNPTi5zdHJpbmdpZnkoRyhuKSl9byh0KX19cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6ZnVuY3Rpb24odCl7Y29uc3QgZT10LnJlZHVjZSgoKHQsZSk9PnQrZS5sZW5ndGgpLDApLG49bmV3IFVpbnQ4QXJyYXkoZSk7bGV0IHI9MDtmb3IoY29uc3QgZSBvZiB0KW4uc2V0KGUscikscis9ZS5sZW5ndGg7cmV0dXJuIG59KHIpfWNvbnN0IGV0PXtzZXNzaW9uOiJzZXNzaW9uIixzZXNzaW9uczoic2Vzc2lvbiIsYXR0YWNobWVudDoiYXR0YWNobWVudCIsdHJhbnNhY3Rpb246InRyYW5zYWN0aW9uIixldmVudDoiZXJyb3IiLGNsaWVudF9yZXBvcnQ6ImludGVybmFsIix1c2VyX3JlcG9ydDoiZGVmYXVsdCIscHJvZmlsZToicHJvZmlsZSIscmVwbGF5X2V2ZW50OiJyZXBsYXkiLHJlcGxheV9yZWNvcmRpbmc6InJlcGxheSIsY2hlY2tfaW46Im1vbml0b3IiLGZlZWRiYWNrOiJmZWVkYmFjayIsc3Bhbjoic3BhbiIsc3RhdHNkOiJtZXRyaWNfYnVja2V0In07ZnVuY3Rpb24gbnQodCl7cmV0dXJuIGV0W3RdfWZ1bmN0aW9uIHJ0KHQpe2lmKCF0fHwhdC5zZGspcmV0dXJuO2NvbnN0e25hbWU6ZSx2ZXJzaW9uOm59PXQuc2RrO3JldHVybntuYW1lOmUsdmVyc2lvbjpufX1jb25zdCBvdD02ZTQ7ZnVuY3Rpb24gc3QodCx7c3RhdHVzQ29kZTplLGhlYWRlcnM6bn0scj1EYXRlLm5vdygpKXtjb25zdCBvPXsuLi50fSxzPW4mJm5bIngtc2VudHJ5LXJhdGUtbGltaXRzIl0saT1uJiZuWyJyZXRyeS1hZnRlciJdO2lmKHMpZm9yKGNvbnN0IHQgb2Ygcy50cmltKCkuc3BsaXQoIiwiKSl7Y29uc3RbZSxuLCwsc109dC5zcGxpdCgiOiIsNSksaT1wYXJzZUludChlLDEwKSxjPTFlMyooaXNOYU4oaSk/NjA6aSk7aWYobilmb3IoY29uc3QgdCBvZiBuLnNwbGl0KCI7IikpIm1ldHJpY19idWNrZXQiPT09dCYmcyYmIXMuc3BsaXQoIjsiKS5pbmNsdWRlcygiY3VzdG9tIil8fChvW3RdPXIrYyk7ZWxzZSBvLmFsbD1yK2N9ZWxzZSBpP28uYWxsPXIrZnVuY3Rpb24odCxlPURhdGUubm93KCkpe2NvbnN0IG49cGFyc2VJbnQoYCR7dH1gLDEwKTtpZighaXNOYU4obikpcmV0dXJuIDFlMypuO2NvbnN0IHI9RGF0ZS5wYXJzZShgJHt0fWApO3JldHVybiBpc05hTihyKT9vdDpyLWV9KGkscik6NDI5PT09ZSYmKG8uYWxsPXIrNmU0KTtyZXR1cm4gb31jb25zdCBpdD0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX187ZnVuY3Rpb24gY3QoKXtyZXR1cm4gdXQoZyksZ31mdW5jdGlvbiB1dCh0KXtyZXR1cm4gdC5fX1NFTlRSWV9ffHwodC5fX1NFTlRSWV9fPXtleHRlbnNpb25zOnt9fSksdC5fX1NFTlRSWV9ffWZ1bmN0aW9uIGF0KHQpe2NvbnN0IGU9TCgpLG49e3NpZDpCKCksaW5pdDohMCx0aW1lc3RhbXA6ZSxzdGFydGVkOmUsZHVyYXRpb246MCxzdGF0dXM6Im9rIixlcnJvcnM6MCxpZ25vcmVEdXJhdGlvbjohMSx0b0pTT046KCk9PmZ1bmN0aW9uKHQpe3JldHVybiBPKHtzaWQ6YCR7dC5zaWR9YCxpbml0OnQuaW5pdCxzdGFydGVkOm5ldyBEYXRlKDFlMyp0LnN0YXJ0ZWQpLnRvSVNPU3RyaW5nKCksdGltZXN0YW1wOm5ldyBEYXRlKDFlMyp0LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxzdGF0dXM6dC5zdGF0dXMsZXJyb3JzOnQuZXJyb3JzLGRpZDoibnVtYmVyIj09dHlwZW9mIHQuZGlkfHwic3RyaW5nIj09dHlwZW9mIHQuZGlkP2Ake3QuZGlkfWA6dm9pZCAwLGR1cmF0aW9uOnQuZHVyYXRpb24sYWJub3JtYWxfbWVjaGFuaXNtOnQuYWJub3JtYWxfbWVjaGFuaXNtLGF0dHJzOntyZWxlYXNlOnQucmVsZWFzZSxlbnZpcm9ubWVudDp0LmVudmlyb25tZW50LGlwX2FkZHJlc3M6dC5pcEFkZHJlc3MsdXNlcl9hZ2VudDp0LnVzZXJBZ2VudH19KX0obil9O3JldHVybiB0JiZmdChuLHQpLG59ZnVuY3Rpb24gZnQodCxlPXt9KXtpZihlLnVzZXImJighdC5pcEFkZHJlc3MmJmUudXNlci5pcF9hZGRyZXNzJiYodC5pcEFkZHJlc3M9ZS51c2VyLmlwX2FkZHJlc3MpLHQuZGlkfHxlLmRpZHx8KHQuZGlkPWUudXNlci5pZHx8ZS51c2VyLmVtYWlsfHxlLnVzZXIudXNlcm5hbWUpKSx0LnRpbWVzdGFtcD1lLnRpbWVzdGFtcHx8TCgpLGUuYWJub3JtYWxfbWVjaGFuaXNtJiYodC5hYm5vcm1hbF9tZWNoYW5pc209ZS5hYm5vcm1hbF9tZWNoYW5pc20pLGUuaWdub3JlRHVyYXRpb24mJih0Lmlnbm9yZUR1cmF0aW9uPWUuaWdub3JlRHVyYXRpb24pLGUuc2lkJiYodC5zaWQ9MzI9PT1lLnNpZC5sZW5ndGg/ZS5zaWQ6QigpKSx2b2lkIDAhPT1lLmluaXQmJih0LmluaXQ9ZS5pbml0KSwhdC5kaWQmJmUuZGlkJiYodC5kaWQ9YCR7ZS5kaWR9YCksIm51bWJlciI9PXR5cGVvZiBlLnN0YXJ0ZWQmJih0LnN0YXJ0ZWQ9ZS5zdGFydGVkKSx0Lmlnbm9yZUR1cmF0aW9uKXQuZHVyYXRpb249dm9pZCAwO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlLmR1cmF0aW9uKXQuZHVyYXRpb249ZS5kdXJhdGlvbjtlbHNle2NvbnN0IGU9dC50aW1lc3RhbXAtdC5zdGFydGVkO3QuZHVyYXRpb249ZT49MD9lOjB9ZS5yZWxlYXNlJiYodC5yZWxlYXNlPWUucmVsZWFzZSksZS5lbnZpcm9ubWVudCYmKHQuZW52aXJvbm1lbnQ9ZS5lbnZpcm9ubWVudCksIXQuaXBBZGRyZXNzJiZlLmlwQWRkcmVzcyYmKHQuaXBBZGRyZXNzPWUuaXBBZGRyZXNzKSwhdC51c2VyQWdlbnQmJmUudXNlckFnZW50JiYodC51c2VyQWdlbnQ9ZS51c2VyQWdlbnQpLCJudW1iZXIiPT10eXBlb2YgZS5lcnJvcnMmJih0LmVycm9ycz1lLmVycm9ycyksZS5zdGF0dXMmJih0LnN0YXR1cz1lLnN0YXR1cyl9Y29uc3QgaHQ9Il9zZW50cnlTcGFuIjtmdW5jdGlvbiBwdCh0LGUpe2U/ZnVuY3Rpb24odCxlLG4pe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfWNhdGNoKG4pe3cmJngubG9nKGBGYWlsZWQgdG8gYWRkIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5ICIke2V9IiB0byBvYmplY3RgLHQpfX0odCxodCxlKTpkZWxldGUgdFtodF19ZnVuY3Rpb24gbHQodCl7cmV0dXJuIHRbaHRdfWNsYXNzIGR0e2NvbnN0cnVjdG9yKCl7dGhpcy5fPSExLHRoaXMuUz1bXSx0aGlzLk49W10sdGhpcy5rPVtdLHRoaXMuQz1bXSx0aGlzLkQ9e30sdGhpcy5UPXt9LHRoaXMuTz17fSx0aGlzLmo9e30sdGhpcy5SPXt9LHRoaXMuQT1ndCgpfWNsb25lKCl7Y29uc3QgdD1uZXcgZHQ7cmV0dXJuIHQuaz1bLi4udGhpcy5rXSx0LlQ9ey4uLnRoaXMuVH0sdC5PPXsuLi50aGlzLk99LHQuaj17Li4udGhpcy5qfSx0LkQ9dGhpcy5ELHQuST10aGlzLkksdC5QPXRoaXMuUCx0LlU9dGhpcy5VLHQuTT10aGlzLk0sdC5OPVsuLi50aGlzLk5dLHQuTD10aGlzLkwsdC5DPVsuLi50aGlzLkNdLHQuUj17Li4udGhpcy5SfSx0LkE9ey4uLnRoaXMuQX0sdC5CPXRoaXMuQix0Lkc9dGhpcy5HLHB0KHQsbHQodGhpcykpLHR9c2V0Q2xpZW50KHQpe3RoaXMuQj10fXNldExhc3RFdmVudElkKHQpe3RoaXMuRz10fWdldENsaWVudCgpe3JldHVybiB0aGlzLkJ9bGFzdEV2ZW50SWQoKXtyZXR1cm4gdGhpcy5HfWFkZFNjb3BlTGlzdGVuZXIodCl7dGhpcy5TLnB1c2godCl9YWRkRXZlbnRQcm9jZXNzb3IodCl7cmV0dXJuIHRoaXMuTi5wdXNoKHQpLHRoaXN9c2V0VXNlcih0KXtyZXR1cm4gdGhpcy5EPXR8fHtlbWFpbDp2b2lkIDAsaWQ6dm9pZCAwLGlwX2FkZHJlc3M6dm9pZCAwLHVzZXJuYW1lOnZvaWQgMH0sdGhpcy5QJiZmdCh0aGlzLlAse3VzZXI6dH0pLHRoaXMuSigpLHRoaXN9Z2V0VXNlcigpe3JldHVybiB0aGlzLkR9Z2V0UmVxdWVzdFNlc3Npb24oKXtyZXR1cm4gdGhpcy5MfXNldFJlcXVlc3RTZXNzaW9uKHQpe3JldHVybiB0aGlzLkw9dCx0aGlzfXNldFRhZ3ModCl7cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULC4uLnR9LHRoaXMuSigpLHRoaXN9c2V0VGFnKHQsZSl7cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULFt0XTplfSx0aGlzLkooKSx0aGlzfXNldEV4dHJhcyh0KXtyZXR1cm4gdGhpcy5PPXsuLi50aGlzLk8sLi4udH0sdGhpcy5KKCksdGhpc31zZXRFeHRyYSh0LGUpe3JldHVybiB0aGlzLk89ey4uLnRoaXMuTyxbdF06ZX0sdGhpcy5KKCksdGhpc31zZXRGaW5nZXJwcmludCh0KXtyZXR1cm4gdGhpcy5NPXQsdGhpcy5KKCksdGhpc31zZXRMZXZlbCh0KXtyZXR1cm4gdGhpcy5JPXQsdGhpcy5KKCksdGhpc31zZXRUcmFuc2FjdGlvbk5hbWUodCl7cmV0dXJuIHRoaXMuVT10LHRoaXMuSigpLHRoaXN9c2V0Q29udGV4dCh0LGUpe3JldHVybiBudWxsPT09ZT9kZWxldGUgdGhpcy5qW3RdOnRoaXMualt0XT1lLHRoaXMuSigpLHRoaXN9c2V0U2Vzc2lvbih0KXtyZXR1cm4gdD90aGlzLlA9dDpkZWxldGUgdGhpcy5QLHRoaXMuSigpLHRoaXN9Z2V0U2Vzc2lvbigpe3JldHVybiB0aGlzLlB9dXBkYXRlKHQpe2lmKCF0KXJldHVybiB0aGlzO2NvbnN0IGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCh0aGlzKTp0LFtuLHJdPWUgaW5zdGFuY2VvZiBtdD9bZS5nZXRTY29wZURhdGEoKSxlLmdldFJlcXVlc3RTZXNzaW9uKCldOmwoZSk/W3QsdC5yZXF1ZXN0U2Vzc2lvbl06W10se3RhZ3M6byxleHRyYTpzLHVzZXI6aSxjb250ZXh0czpjLGxldmVsOnUsZmluZ2VycHJpbnQ6YT1bXSxwcm9wYWdhdGlvbkNvbnRleHQ6Zn09bnx8e307cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULC4uLm99LHRoaXMuTz17Li4udGhpcy5PLC4uLnN9LHRoaXMuaj17Li4udGhpcy5qLC4uLmN9LGkmJk9iamVjdC5rZXlzKGkpLmxlbmd0aCYmKHRoaXMuRD1pKSx1JiYodGhpcy5JPXUpLGEubGVuZ3RoJiYodGhpcy5NPWEpLGYmJih0aGlzLkE9ZiksciYmKHRoaXMuTD1yKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMuaz1bXSx0aGlzLlQ9e30sdGhpcy5PPXt9LHRoaXMuRD17fSx0aGlzLmo9e30sdGhpcy5JPXZvaWQgMCx0aGlzLlU9dm9pZCAwLHRoaXMuTT12b2lkIDAsdGhpcy5MPXZvaWQgMCx0aGlzLlA9dm9pZCAwLHB0KHRoaXMsdm9pZCAwKSx0aGlzLkM9W10sdGhpcy5BPWd0KCksdGhpcy5KKCksdGhpc31hZGRCcmVhZGNydW1iKHQsZSl7Y29uc3Qgbj0ibnVtYmVyIj09dHlwZW9mIGU/ZToxMDA7aWYobjw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6TSgpLC4uLnR9LG89dGhpcy5rO3JldHVybiBvLnB1c2gociksdGhpcy5rPW8ubGVuZ3RoPm4/by5zbGljZSgtbik6byx0aGlzLkooKSx0aGlzfWdldExhc3RCcmVhZGNydW1iKCl7cmV0dXJuIHRoaXMua1t0aGlzLmsubGVuZ3RoLTFdfWNsZWFyQnJlYWRjcnVtYnMoKXtyZXR1cm4gdGhpcy5rPVtdLHRoaXMuSigpLHRoaXN9YWRkQXR0YWNobWVudCh0KXtyZXR1cm4gdGhpcy5DLnB1c2godCksdGhpc31jbGVhckF0dGFjaG1lbnRzKCl7cmV0dXJuIHRoaXMuQz1bXSx0aGlzfWdldFNjb3BlRGF0YSgpe3JldHVybnticmVhZGNydW1iczp0aGlzLmssYXR0YWNobWVudHM6dGhpcy5DLGNvbnRleHRzOnRoaXMuaix0YWdzOnRoaXMuVCxleHRyYTp0aGlzLk8sdXNlcjp0aGlzLkQsbGV2ZWw6dGhpcy5JLGZpbmdlcnByaW50OnRoaXMuTXx8W10sZXZlbnRQcm9jZXNzb3JzOnRoaXMuTixwcm9wYWdhdGlvbkNvbnRleHQ6dGhpcy5BLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTp0aGlzLlIsdHJhbnNhY3Rpb25OYW1lOnRoaXMuVSxzcGFuOmx0KHRoaXMpfX1zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMuUj17Li4udGhpcy5SLC4uLnR9LHRoaXN9c2V0UHJvcGFnYXRpb25Db250ZXh0KHQpe3JldHVybiB0aGlzLkE9dCx0aGlzfWdldFByb3BhZ2F0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLkF9Y2FwdHVyZUV4Y2VwdGlvbih0LGUpe2NvbnN0IG49ZSYmZS5ldmVudF9pZD9lLmV2ZW50X2lkOkIoKTtpZighdGhpcy5CKXJldHVybiB4Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBleGNlcHRpb24hIiksbjtjb25zdCByPW5ldyBFcnJvcigiU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbiIpO3JldHVybiB0aGlzLkIuY2FwdHVyZUV4Y2VwdGlvbih0LHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpyLC4uLmUsZXZlbnRfaWQ6bn0sdGhpcyksbn1jYXB0dXJlTWVzc2FnZSh0LGUsbil7Y29uc3Qgcj1uJiZuLmV2ZW50X2lkP24uZXZlbnRfaWQ6QigpO2lmKCF0aGlzLkIpcmV0dXJuIHgud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIG1lc3NhZ2UhIikscjtjb25zdCBvPW5ldyBFcnJvcih0KTtyZXR1cm4gdGhpcy5CLmNhcHR1cmVNZXNzYWdlKHQsZSx7b3JpZ2luYWxFeGNlcHRpb246dCxzeW50aGV0aWNFeGNlcHRpb246bywuLi5uLGV2ZW50X2lkOnJ9LHRoaXMpLHJ9Y2FwdHVyZUV2ZW50KHQsZSl7Y29uc3Qgbj1lJiZlLmV2ZW50X2lkP2UuZXZlbnRfaWQ6QigpO3JldHVybiB0aGlzLkI/KHRoaXMuQi5jYXB0dXJlRXZlbnQodCx7Li4uZSxldmVudF9pZDpufSx0aGlzKSxuKTooeC53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgZXZlbnQhIiksbil9Sigpe3RoaXMuX3x8KHRoaXMuXz0hMCx0aGlzLlMuZm9yRWFjaCgodD0+e3QodGhpcyl9KSksdGhpcy5fPSExKX19Y29uc3QgbXQ9ZHQ7ZnVuY3Rpb24gZ3QoKXtyZXR1cm57dHJhY2VJZDpCKCksc3BhbklkOkIoKS5zdWJzdHJpbmcoMTYpfX1jbGFzcyB5dHtjb25zdHJ1Y3Rvcih0LGUpe2xldCBuLHI7bj10fHxuZXcgbXQscj1lfHxuZXcgbXQsdGhpcy5IPVt7c2NvcGU6bn1dLHRoaXMuVz1yfXdpdGhTY29wZSh0KXtjb25zdCBlPXRoaXMuWSgpO2xldCBuO3RyeXtuPXQoZSl9Y2F0Y2godCl7dGhyb3cgdGhpcy5xKCksdH1yZXR1cm4gZChuKT9uLnRoZW4oKHQ9Pih0aGlzLnEoKSx0KSksKHQ9Pnt0aHJvdyB0aGlzLnEoKSx0fSkpOih0aGlzLnEoKSxuKX1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudH1nZXRTY29wZSgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGV9Z2V0SXNvbGF0aW9uU2NvcGUoKXtyZXR1cm4gdGhpcy5XfWdldFN0YWNrKCl7cmV0dXJuIHRoaXMuSH1nZXRTdGFja1RvcCgpe3JldHVybiB0aGlzLkhbdGhpcy5ILmxlbmd0aC0xXX1ZKCl7Y29uc3QgdD10aGlzLmdldFNjb3BlKCkuY2xvbmUoKTtyZXR1cm4gdGhpcy5nZXRTdGFjaygpLnB1c2goe2NsaWVudDp0aGlzLmdldENsaWVudCgpLHNjb3BlOnR9KSx0fXEoKXtyZXR1cm4hKHRoaXMuZ2V0U3RhY2soKS5sZW5ndGg8PTEpJiYhIXRoaXMuZ2V0U3RhY2soKS5wb3AoKX19ZnVuY3Rpb24gYnQoKXtjb25zdCB0PXV0KGN0KCkpO3JldHVybiB0Lmh1Ynx8KHQuaHViPW5ldyB5dCh5KCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKCk9Pm5ldyBtdCkpLHkoImRlZmF1bHRJc29sYXRpb25TY29wZSIsKCgpPT5uZXcgbXQpKSkpLHQuaHVifWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBidCgpLndpdGhTY29wZSh0KX1mdW5jdGlvbiBfdCh0LGUpe2NvbnN0IG49YnQoKTtyZXR1cm4gbi53aXRoU2NvcGUoKCgpPT4obi5nZXRTdGFja1RvcCgpLnNjb3BlPXQsZSh0KSkpKX1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gYnQoKS53aXRoU2NvcGUoKCgpPT50KGJ0KCkuZ2V0SXNvbGF0aW9uU2NvcGUoKSkpKX1mdW5jdGlvbiBTdCh0KXtjb25zdCBlPXV0KHQpO3JldHVybiBlLmFjcz9lLmFjczp7d2l0aElzb2xhdGlvblNjb3BlOnd0LHdpdGhTY29wZTp2dCx3aXRoU2V0U2NvcGU6X3Qsd2l0aFNldElzb2xhdGlvblNjb3BlOih0LGUpPT53dChlKSxnZXRDdXJyZW50U2NvcGU6KCk9PmJ0KCkuZ2V0U2NvcGUoKSxnZXRJc29sYXRpb25TY29wZTooKT0+YnQoKS5nZXRJc29sYXRpb25TY29wZSgpfX1mdW5jdGlvbiAkdCgpe3JldHVybiBTdChjdCgpKS5nZXRDdXJyZW50U2NvcGUoKS5nZXRDbGllbnQoKX1jb25zdCBFdD0ic2VudHJ5LnNvdXJjZSIseHQ9InNlbnRyeS5zYW1wbGVfcmF0ZSIsTnQ9InNlbnRyeS5vcCIsa3Q9InNlbnRyeS5vcmlnaW4iLEN0PTAsRHQ9MSxUdD0xO2Z1bmN0aW9uIE90KHQpe2NvbnN0e3NwYW5JZDplLHRyYWNlSWQ6bn09dC5zcGFuQ29udGV4dCgpLHtwYXJlbnRfc3Bhbl9pZDpyfT1BdCh0KTtyZXR1cm4gTyh7cGFyZW50X3NwYW5faWQ6cixzcGFuX2lkOmUsdHJhY2VfaWQ6bn0pfWZ1bmN0aW9uIGp0KHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD9SdCh0KTpBcnJheS5pc0FycmF5KHQpP3RbMF0rdFsxXS8xZTk6dCBpbnN0YW5jZW9mIERhdGU/UnQodC5nZXRUaW1lKCkpOkwoKX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gdD45OTk5OTk5OTk5P3QvMWUzOnR9ZnVuY3Rpb24gQXQodCl7aWYoZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0U3BhbkpTT059KHQpKXJldHVybiB0LmdldFNwYW5KU09OKCk7dHJ5e2NvbnN0e3NwYW5JZDplLHRyYWNlSWQ6bn09dC5zcGFuQ29udGV4dCgpO2lmKGZ1bmN0aW9uKHQpe2NvbnN0IGU9dDtyZXR1cm4hIShlLmF0dHJpYnV0ZXMmJmUuc3RhcnRUaW1lJiZlLm5hbWUmJmUuZW5kVGltZSYmZS5zdGF0dXMpfSh0KSl7Y29uc3R7YXR0cmlidXRlczpyLHN0YXJ0VGltZTpvLG5hbWU6cyxlbmRUaW1lOmkscGFyZW50U3BhbklkOmMsc3RhdHVzOnV9PXQ7cmV0dXJuIE8oe3NwYW5faWQ6ZSx0cmFjZV9pZDpuLGRhdGE6cixkZXNjcmlwdGlvbjpzLHBhcmVudF9zcGFuX2lkOmMsc3RhcnRfdGltZXN0YW1wOmp0KG8pLHRpbWVzdGFtcDpqdChpKXx8dm9pZCAwLHN0YXR1czpJdCh1KSxvcDpyW050XSxvcmlnaW46cltrdF0sRjp2b2lkIDB9KX1yZXR1cm57c3Bhbl9pZDplLHRyYWNlX2lkOm59fWNhdGNoKHQpe3JldHVybnt9fX1mdW5jdGlvbiBJdCh0KXtpZih0JiZ0LmNvZGUhPT1DdClyZXR1cm4gdC5jb2RlPT09RHQ/Im9rIjp0Lm1lc3NhZ2V8fCJ1bmtub3duX2Vycm9yIn1jb25zdCBQdD0iX3NlbnRyeVJvb3RTcGFuIjtmdW5jdGlvbiBVdCh0KXtyZXR1cm4gdFtQdF18fHR9Y29uc3QgTXQ9InByb2R1Y3Rpb24iLEx0PSJfZnJvemVuRHNjIjtmdW5jdGlvbiBCdCh0KXtjb25zdCBlPSR0KCk7aWYoIWUpcmV0dXJue307Y29uc3Qgbj1mdW5jdGlvbih0LGUpe2NvbnN0IG49ZS5nZXRPcHRpb25zKCkse3B1YmxpY0tleTpyfT1lLmdldERzbigpfHx7fSxvPU8oe2Vudmlyb25tZW50Om4uZW52aXJvbm1lbnR8fE10LHJlbGVhc2U6bi5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0fSk7cmV0dXJuIGUuZW1pdCgiY3JlYXRlRHNjIixvKSxvfShBdCh0KS50cmFjZV9pZHx8IiIsZSkscj1VdCh0KTtpZighcilyZXR1cm4gbjtjb25zdCBvPXJbTHRdO2lmKG8pcmV0dXJuIG87Y29uc3Qgcz1BdChyKSxpPXMuZGF0YXx8e30sYz1pW3h0XTtudWxsIT1jJiYobi5zYW1wbGVfcmF0ZT1gJHtjfWApO2NvbnN0IHU9aVtFdF07cmV0dXJuIHUmJiJ1cmwiIT09dSYmKG4udHJhbnNhY3Rpb249cy5kZXNjcmlwdGlvbiksbi5zYW1wbGVkPVN0cmluZyhmdW5jdGlvbih0KXtjb25zdHt0cmFjZUZsYWdzOmV9PXQuc3BhbkNvbnRleHQoKTtyZXR1cm4gZT09PVR0fShyKSksZS5lbWl0KCJjcmVhdGVEc2MiLG4pLG59ZnVuY3Rpb24gR3QodCxlLG4scil7Y29uc3Qgbz1ydChuKSxzPXQudHlwZSYmInJlcGxheV9ldmVudCIhPT10LnR5cGU/dC50eXBlOiJldmVudCI7IWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc2RrPXQuc2RrfHx7fSx0LnNkay5uYW1lPXQuc2RrLm5hbWV8fGUubmFtZSx0LnNkay52ZXJzaW9uPXQuc2RrLnZlcnNpb258fGUudmVyc2lvbix0LnNkay5pbnRlZ3JhdGlvbnM9Wy4uLnQuc2RrLmludGVncmF0aW9uc3x8W10sLi4uZS5pbnRlZ3JhdGlvbnN8fFtdXSx0LnNkay5wYWNrYWdlcz1bLi4udC5zZGsucGFja2FnZXN8fFtdLC4uLmUucGFja2FnZXN8fFtdXSl9KHQsbiYmbi5zZGspO2NvbnN0IGk9ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz10LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSYmdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGEuZHluYW1pY1NhbXBsaW5nQ29udGV4dDtyZXR1cm57ZXZlbnRfaWQ6dC5ldmVudF9pZCxzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5lJiZ7c2RrOmV9LC4uLiEhbiYmciYme2RzbjpOKHIpfSwuLi5vJiZ7dHJhY2U6Tyh7Li4ub30pfX19KHQsbyxyLGUpO2RlbGV0ZSB0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YTtyZXR1cm4gWihpLFtbe3R5cGU6c30sdF1dKX1jb25zdCBKdD0iX19TRU5UUllfU1VQUFJFU1NfVFJBQ0lOR19fIjtmdW5jdGlvbiB6dCh0KXtjb25zdCBlPVN0KGN0KCkpO3JldHVybiBlLnN1cHByZXNzVHJhY2luZz9lLnN1cHByZXNzVHJhY2luZyh0KTpmdW5jdGlvbiguLi50KXtjb25zdCBlPVN0KGN0KCkpO2lmKDI9PT10Lmxlbmd0aCl7Y29uc3RbbixyXT10O3JldHVybiBuP2Uud2l0aFNldFNjb3BlKG4scik6ZS53aXRoU2NvcGUocil9cmV0dXJuIGUud2l0aFNjb3BlKHRbMF0pfSgoZT0+KGUuc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbSnRdOiEwfSksdCgpKSkpfWZ1bmN0aW9uIEh0KHQsZSl7Y29uc3R7ZmluZ2VycHJpbnQ6bixzcGFuOnIsYnJlYWRjcnVtYnM6byxzZGtQcm9jZXNzaW5nTWV0YWRhdGE6c309ZTshZnVuY3Rpb24odCxlKXtjb25zdHtleHRyYTpuLHRhZ3M6cix1c2VyOm8sY29udGV4dHM6cyxsZXZlbDppLHRyYW5zYWN0aW9uTmFtZTpjfT1lLHU9TyhuKTt1JiZPYmplY3Qua2V5cyh1KS5sZW5ndGgmJih0LmV4dHJhPXsuLi51LC4uLnQuZXh0cmF9KTtjb25zdCBhPU8ocik7YSYmT2JqZWN0LmtleXMoYSkubGVuZ3RoJiYodC50YWdzPXsuLi5hLC4uLnQudGFnc30pO2NvbnN0IGY9TyhvKTtmJiZPYmplY3Qua2V5cyhmKS5sZW5ndGgmJih0LnVzZXI9ey4uLmYsLi4udC51c2VyfSk7Y29uc3QgaD1PKHMpO2gmJk9iamVjdC5rZXlzKGgpLmxlbmd0aCYmKHQuY29udGV4dHM9ey4uLmgsLi4udC5jb250ZXh0c30pO2kmJih0LmxldmVsPWkpO2MmJiJ0cmFuc2FjdGlvbiIhPT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPWMpfSh0LGUpLHImJmZ1bmN0aW9uKHQsZSl7dC5jb250ZXh0cz17dHJhY2U6T3QoZSksLi4udC5jb250ZXh0c30sdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9e2R5bmFtaWNTYW1wbGluZ0NvbnRleHQ6QnQoZSksLi4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGF9O2NvbnN0IG49VXQoZSkscj1BdChuKS5kZXNjcmlwdGlvbjtyJiYhdC50cmFuc2FjdGlvbiYmInRyYW5zYWN0aW9uIj09PXQudHlwZSYmKHQudHJhbnNhY3Rpb249cil9KHQsciksZnVuY3Rpb24odCxlKXt0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQ/ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19KHQuZmluZ2VycHJpbnQpOltdLGUmJih0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQuY29uY2F0KGUpKTt0LmZpbmdlcnByaW50JiYhdC5maW5nZXJwcmludC5sZW5ndGgmJmRlbGV0ZSB0LmZpbmdlcnByaW50fSh0LG4pLGZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1bLi4udC5icmVhZGNydW1ic3x8W10sLi4uZV07dC5icmVhZGNydW1icz1uLmxlbmd0aD9uOnZvaWQgMH0odCxvKSxmdW5jdGlvbih0LGUpe3Quc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXsuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSwuLi5lfX0odCxzKX1jb25zdCBXdD0iNyI7ZnVuY3Rpb24gWXQodCxlKXtyZXR1cm4gbj17c2VudHJ5X2tleTp0LnB1YmxpY0tleSxzZW50cnlfdmVyc2lvbjpXdCwuLi5lJiZ7c2VudHJ5X2NsaWVudDpgJHtlLm5hbWV9LyR7ZS52ZXJzaW9ufWB9fSxPYmplY3Qua2V5cyhuKS5tYXAoKHQ9PmAke2VuY29kZVVSSUNvbXBvbmVudCh0KX09JHtlbmNvZGVVUklDb21wb25lbnQoblt0XSl9YCkpLmpvaW4oIiYiKTt2YXIgbn1jb25zdCBxdD02NDtmdW5jdGlvbiBGdCh0LGUsbj1LKHQuYnVmZmVyU2l6ZXx8cXQpKXtsZXQgcj17fTtyZXR1cm57c2VuZDpmdW5jdGlvbihvKXtjb25zdCBzPVtdO2lmKFEobywoKGUsbik9Pntjb25zdCBvPW50KG4pO2lmKGZ1bmN0aW9uKHQsZSxuPURhdGUubm93KCkpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdfHx0LmFsbHx8MH0odCxlKT5ufShyLG8pKXtjb25zdCByPUt0KGUsbik7dC5yZWNvcmREcm9wcGVkRXZlbnQoInJhdGVsaW1pdF9iYWNrb2ZmIixvLHIpfWVsc2Ugcy5wdXNoKGUpfSkpLDA9PT1zLmxlbmd0aClyZXR1cm4gcSh7fSk7Y29uc3QgaT1aKG9bMF0scyksYz1lPT57UShpLCgobixyKT0+e2NvbnN0IG89S3QobixyKTt0LnJlY29yZERyb3BwZWRFdmVudChlLG50KHIpLG8pfSkpfTtyZXR1cm4gbi5hZGQoKCgpPT5lKHtib2R5OnR0KGkpfSkudGhlbigodD0+KHZvaWQgMCE9PXQuc3RhdHVzQ29kZSYmKHQuc3RhdHVzQ29kZTwyMDB8fHQuc3RhdHVzQ29kZT49MzAwKSYmaXQmJngud2FybihgU2VudHJ5IHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBjb2RlICR7dC5zdGF0dXNDb2RlfSB0byBzZW50IGV2ZW50LmApLHI9c3Qocix0KSx0KSksKHQ9Pnt0aHJvdyBjKCJuZXR3b3JrX2Vycm9yIiksdH0pKSkpLnRoZW4oKHQ9PnQpLCh0PT57aWYodCBpbnN0YW5jZW9mIGspcmV0dXJuIGl0JiZ4LmVycm9yKCJTa2lwcGVkIHNlbmRpbmcgZXZlbnQgYmVjYXVzZSBidWZmZXIgaXMgZnVsbC4iKSxjKCJxdWV1ZV9vdmVyZmxvdyIpLHEoe30pO3Rocm93IHR9KSl9LGZsdXNoOnQ9Pm4uZHJhaW4odCl9fWZ1bmN0aW9uIEt0KHQsZSl7aWYoImV2ZW50Ij09PWV8fCJ0cmFuc2FjdGlvbiI9PT1lKXJldHVybiBBcnJheS5pc0FycmF5KHQpP3RbMV06dm9pZCAwfWNvbnN0IFZ0PVN5bWJvbCgiQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZSIpO2NsYXNzIFp0IGV4dGVuZHMgcy5BZ2VudHtbVnRdO29wdGlvbnM7a2VlcEFsaXZlO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXNbVnRdPXt9fWlzU2VjdXJlRW5kcG9pbnQodCl7aWYodCl7aWYoImJvb2xlYW4iPT10eXBlb2YgdC5zZWN1cmVFbmRwb2ludClyZXR1cm4gdC5zZWN1cmVFbmRwb2ludDtpZigic3RyaW5nIj09dHlwZW9mIHQucHJvdG9jb2wpcmV0dXJuImh0dHBzOiI9PT10LnByb3RvY29sfWNvbnN0e3N0YWNrOmV9PW5ldyBFcnJvcjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUuc3BsaXQoIlxuIikuc29tZSgodD0+LTEhPT10LmluZGV4T2YoIihodHRwcy5qczoiKXx8LTEhPT10LmluZGV4T2YoIm5vZGU6aHR0cHM6IikpKX1jcmVhdGVTb2NrZXQodCxlLG4pe2NvbnN0IHI9ey4uLmUsc2VjdXJlRW5kcG9pbnQ6dGhpcy5pc1NlY3VyZUVuZHBvaW50KGUpfTtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+dGhpcy5jb25uZWN0KHQscikpKS50aGVuKChvPT57aWYobyBpbnN0YW5jZW9mIHMuQWdlbnQpcmV0dXJuIG8uYWRkUmVxdWVzdCh0LHIpO3RoaXNbVnRdLmN1cnJlbnRTb2NrZXQ9byxzdXBlci5jcmVhdGVTb2NrZXQodCxlLG4pfSksbil9Y3JlYXRlQ29ubmVjdGlvbigpe2NvbnN0IHQ9dGhpc1tWdF0uY3VycmVudFNvY2tldDtpZih0aGlzW1Z0XS5jdXJyZW50U29ja2V0PXZvaWQgMCwhdCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNvY2tldCB3YXMgcmV0dXJuZWQgaW4gdGhlIGBjb25uZWN0KClgIGZ1bmN0aW9uIik7cmV0dXJuIHR9Z2V0IGRlZmF1bHRQb3J0KCl7cmV0dXJuIHRoaXNbVnRdLmRlZmF1bHRQb3J0Pz8oImh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MCl9c2V0IGRlZmF1bHRQb3J0KHQpe3RoaXNbVnRdJiYodGhpc1tWdF0uZGVmYXVsdFBvcnQ9dCl9Z2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXNbVnRdLnByb3RvY29sPz8odGhpcy5pc1NlY3VyZUVuZHBvaW50KCk/Imh0dHBzOiI6Imh0dHA6Iil9c2V0IHByb3RvY29sKHQpe3RoaXNbVnRdJiYodGhpc1tWdF0ucHJvdG9jb2w9dCl9fWZ1bmN0aW9uIFF0KC4uLnQpe3gubG9nKCJbaHR0cHMtcHJveHktYWdlbnQ6cGFyc2UtcHJveHktcmVzcG9uc2VdIiwuLi50KX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLG4pPT57bGV0IHI9MDtjb25zdCBvPVtdO2Z1bmN0aW9uIHMoKXtjb25zdCBjPXQucmVhZCgpO2M/ZnVuY3Rpb24oYyl7by5wdXNoKGMpLHIrPWMubGVuZ3RoO2NvbnN0IHU9QnVmZmVyLmNvbmNhdChvLHIpLGE9dS5pbmRleE9mKCJcclxuXHJcbiIpO2lmKC0xPT09YSlyZXR1cm4gUXQoImhhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uIiksdm9pZCBzKCk7Y29uc3QgZj11LnNsaWNlKDAsYSkudG9TdHJpbmcoImFzY2lpIikuc3BsaXQoIlxyXG4iKSxoPWYuc2hpZnQoKTtpZighaClyZXR1cm4gdC5kZXN0cm95KCksbihuZXcgRXJyb3IoIk5vIGhlYWRlciByZWNlaXZlZCBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2UiKSk7Y29uc3QgcD1oLnNwbGl0KCIgIiksbD0rcFsxXSxkPXAuc2xpY2UoMikuam9pbigiICIpLG09e307Zm9yKGNvbnN0IGUgb2YgZil7aWYoIWUpY29udGludWU7Y29uc3Qgcj1lLmluZGV4T2YoIjoiKTtpZigtMT09PXIpcmV0dXJuIHQuZGVzdHJveSgpLG4obmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6ICIke2V9ImApKTtjb25zdCBvPWUuc2xpY2UoMCxyKS50b0xvd2VyQ2FzZSgpLHM9ZS5zbGljZShyKzEpLnRyaW1TdGFydCgpLGk9bVtvXTsic3RyaW5nIj09dHlwZW9mIGk/bVtvXT1baSxzXTpBcnJheS5pc0FycmF5KGkpP2kucHVzaChzKTptW29dPXN9UXQoImdvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvIixoLG0pLGkoKSxlKHtjb25uZWN0OntzdGF0dXNDb2RlOmwsc3RhdHVzVGV4dDpkLGhlYWRlcnM6bX0sYnVmZmVyZWQ6dX0pfShjKTp0Lm9uY2UoInJlYWRhYmxlIixzKX1mdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixjKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksdC5yZW1vdmVMaXN0ZW5lcigicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGMoKXtpKCksUXQoIm9uZW5kIiksbihuZXcgRXJyb3IoIlByb3h5IGNvbm5lY3Rpb24gZW5kZWQgYmVmb3JlIHJlY2VpdmluZyBDT05ORUNUIHJlc3BvbnNlIikpfWZ1bmN0aW9uIHUodCl7aSgpLFF0KCJvbmVycm9yICVvIix0KSxuKHQpfXQub24oImVycm9yIix1KSx0Lm9uKCJlbmQiLGMpLHMoKX0pKX1mdW5jdGlvbiB0ZSguLi50KXt4LmxvZygiW2h0dHBzLXByb3h5LWFnZW50XSIsLi4udCl9Y2xhc3MgZWUgZXh0ZW5kcyBadHtzdGF0aWMgcHJvdG9jb2xzPVsiaHR0cCIsImh0dHBzIl07cHJveHk7cHJveHlIZWFkZXJzO2Nvbm5lY3RPcHRzO2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSksdGhpcy5vcHRpb25zPXt9LHRoaXMucHJveHk9InN0cmluZyI9PXR5cGVvZiB0P25ldyBVUkwodCk6dCx0aGlzLnByb3h5SGVhZGVycz1lPy5oZWFkZXJzPz97fSx0ZSgiQ3JlYXRpbmcgbmV3IEh0dHBzUHJveHlBZ2VudCBpbnN0YW5jZTogJW8iLHRoaXMucHJveHkuaHJlZik7Y29uc3Qgbj0odGhpcy5wcm94eS5ob3N0bmFtZXx8dGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFt8XF0kL2csIiIpLHI9dGhpcy5wcm94eS5wb3J0P3BhcnNlSW50KHRoaXMucHJveHkucG9ydCwxMCk6Imh0dHBzOiI9PT10aGlzLnByb3h5LnByb3RvY29sPzQ0Mzo4MDt0aGlzLmNvbm5lY3RPcHRzPXtBTFBOUHJvdG9jb2xzOlsiaHR0cC8xLjEiXSwuLi5lP3JlKGUsImhlYWRlcnMiKTpudWxsLGhvc3Q6bixwb3J0OnJ9fWFzeW5jIGNvbm5lY3QodCxlKXtjb25zdHtwcm94eTpufT10aGlzO2lmKCFlLmhvc3QpdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gImhvc3QiIHByb3ZpZGVkJyk7bGV0IHI7aWYoImh0dHBzOiI9PT1uLnByb3RvY29sKXt0ZSgiQ3JlYXRpbmcgYHRscy5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cyk7Y29uc3QgdD10aGlzLmNvbm5lY3RPcHRzLnNlcnZlcm5hbWV8fHRoaXMuY29ubmVjdE9wdHMuaG9zdDtyPWYuY29ubmVjdCh7Li4udGhpcy5jb25uZWN0T3B0cyxzZXJ2ZXJuYW1lOnQmJmEuaXNJUCh0KT92b2lkIDA6dH0pfWVsc2UgdGUoIkNyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8iLHRoaXMuY29ubmVjdE9wdHMpLHI9YS5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO2NvbnN0IG89ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucHJveHlIZWFkZXJzP3RoaXMucHJveHlIZWFkZXJzKCk6ey4uLnRoaXMucHJveHlIZWFkZXJzfSxzPWEuaXNJUHY2KGUuaG9zdCk/YFske2UuaG9zdH1dYDplLmhvc3Q7bGV0IGk9YENPTk5FQ1QgJHtzfToke2UucG9ydH0gSFRUUC8xLjFcclxuYDtpZihuLnVzZXJuYW1lfHxuLnBhc3N3b3JkKXtjb25zdCB0PWAke2RlY29kZVVSSUNvbXBvbmVudChuLnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQobi5wYXNzd29yZCl9YDtvWyJQcm94eS1BdXRob3JpemF0aW9uIl09YEJhc2ljICR7QnVmZmVyLmZyb20odCkudG9TdHJpbmcoImJhc2U2NCIpfWB9by5Ib3N0PWAke3N9OiR7ZS5wb3J0fWAsb1siUHJveHktQ29ubmVjdGlvbiJdfHwob1siUHJveHktQ29ubmVjdGlvbiJdPXRoaXMua2VlcEFsaXZlPyJLZWVwLUFsaXZlIjoiY2xvc2UiKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhvKSlpKz1gJHt0fTogJHtvW3RdfVxyXG5gO2NvbnN0IGM9WHQocik7ci53cml0ZShgJHtpfVxyXG5gKTtjb25zdHtjb25uZWN0OnUsYnVmZmVyZWQ6aH09YXdhaXQgYztpZih0LmVtaXQoInByb3h5Q29ubmVjdCIsdSksdGhpcy5lbWl0KCJwcm94eUNvbm5lY3QiLHUsdCksMjAwPT09dS5zdGF0dXNDb2RlKXtpZih0Lm9uY2UoInNvY2tldCIsbmUpLGUuc2VjdXJlRW5kcG9pbnQpe3RlKCJVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTIik7Y29uc3QgdD1lLnNlcnZlcm5hbWV8fGUuaG9zdDtyZXR1cm4gZi5jb25uZWN0KHsuLi5yZShlLCJob3N0IiwicGF0aCIsInBvcnQiKSxzb2NrZXQ6cixzZXJ2ZXJuYW1lOmEuaXNJUCh0KT92b2lkIDA6dH0pfXJldHVybiByfXIuZGVzdHJveSgpO2NvbnN0IHA9bmV3IGEuU29ja2V0KHt3cml0YWJsZTohMX0pO3JldHVybiBwLnJlYWRhYmxlPSEwLHQub25jZSgic29ja2V0IiwodD0+e3RlKCJSZXBsYXlpbmcgcHJveHkgYnVmZmVyIGZvciBmYWlsZWQgcmVxdWVzdCIpLHQucHVzaChoKSx0LnB1c2gobnVsbCl9KSkscH19ZnVuY3Rpb24gbmUodCl7dC5yZXN1bWUoKX1mdW5jdGlvbiByZSh0LC4uLmUpe2NvbnN0IG49e307bGV0IHI7Zm9yKHIgaW4gdCllLmluY2x1ZGVzKHIpfHwobltyXT10W3JdKTtyZXR1cm4gbn1jb25zdCBvZT0zMjc2ODtmdW5jdGlvbiBzZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IGllPWU7bGV0IGNlLHVlPSExO2Z1bmN0aW9uIGFlKHQpe2llLmRlYnVnJiZjb25zb2xlLmxvZyhgW0FOUiBXb3JrZXJdICR7dH1gKX12YXIgZmUsaGUscGU7Y29uc3QgbGU9ZnVuY3Rpb24odCl7bGV0IGU7dHJ5e2U9bmV3IFVSTCh0LnVybCl9Y2F0Y2goZSl7cmV0dXJuIEUoKCgpPT57Y29uc29sZS53YXJuKCJbQHNlbnRyeS9ub2RlXTogSW52YWxpZCBkc24gb3IgdHVubmVsIG9wdGlvbiwgd2lsbCBub3Qgc2VuZCBhbnkgZXZlbnRzLiBUaGUgdHVubmVsIG9wdGlvbiBtdXN0IGJlIGEgZnVsbCBVUkwgd2hlbiB1c2VkLiIpfSkpLEZ0KHQsKCgpPT5Qcm9taXNlLnJlc29sdmUoe30pKSl9Y29uc3Qgbj0iaHR0cHM6Ij09PWUucHJvdG9jb2wscj1mdW5jdGlvbih0LGUpe2NvbnN0e25vX3Byb3h5Om59PXByb2Nlc3MuZW52O3JldHVybiBuJiZuLnNwbGl0KCIsIikuc29tZSgoZT0+dC5ob3N0LmVuZHNXaXRoKGUpfHx0Lmhvc3RuYW1lLmVuZHNXaXRoKGUpKSk/dm9pZCAwOmV9KGUsdC5wcm94eXx8KG4/cHJvY2Vzcy5lbnYuaHR0cHNfcHJveHk6dm9pZCAwKXx8cHJvY2Vzcy5lbnYuaHR0cF9wcm94eSksbz1uP2k6cyxhPXZvaWQgMCE9PXQua2VlcEFsaXZlJiZ0LmtlZXBBbGl2ZSxmPXI/bmV3IGVlKHIpOm5ldyBvLkFnZW50KHtrZWVwQWxpdmU6YSxtYXhTb2NrZXRzOjMwLHRpbWVvdXQ6MmUzfSk7cmV0dXJuIHp0KCgoKT0+e2NvbnN0IGU9ZnVuY3Rpb24odCxlLG4pe2NvbnN0e2hvc3RuYW1lOnIscGF0aG5hbWU6byxwb3J0OnMscHJvdG9jb2w6aSxzZWFyY2g6YX09bmV3IFVSTCh0LnVybCk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgUHJvbWlzZSgoKGgscCk9PntsZXQgbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGMoe3JlYWQoKXt0aGlzLnB1c2godCksdGhpcy5wdXNoKG51bGwpfX0pfShmLmJvZHkpO2NvbnN0IGQ9ey4uLnQuaGVhZGVyc307Zi5ib2R5Lmxlbmd0aD5vZSYmKGRbImNvbnRlbnQtZW5jb2RpbmciXT0iZ3ppcCIsbD1sLnBpcGUodSgpKSk7Y29uc3QgbT1lLnJlcXVlc3Qoe21ldGhvZDoiUE9TVCIsYWdlbnQ6bixoZWFkZXJzOmQsaG9zdG5hbWU6cixwYXRoOmAke299JHthfWAscG9ydDpzLHByb3RvY29sOmksY2E6dC5jYUNlcnRzfSwodD0+e3Qub24oImRhdGEiLCgoKT0+e30pKSx0Lm9uKCJlbmQiLCgoKT0+e30pKSx0LnNldEVuY29kaW5nKCJ1dGY4Iik7Y29uc3QgZT10LmhlYWRlcnNbInJldHJ5LWFmdGVyIl0/P251bGwsbj10LmhlYWRlcnNbIngtc2VudHJ5LXJhdGUtbGltaXRzIl0/P251bGw7aCh7c3RhdHVzQ29kZTp0LnN0YXR1c0NvZGUsaGVhZGVyczp7InJldHJ5LWFmdGVyIjplLCJ4LXNlbnRyeS1yYXRlLWxpbWl0cyI6QXJyYXkuaXNBcnJheShuKT9uWzBdOm59fSl9KSk7bS5vbigiZXJyb3IiLHApLGwucGlwZShtKX0pKX19KHQsdC5odHRwTW9kdWxlPz9vLGYpO3JldHVybiBGdCh0LGUpfSkpfSh7dXJsOihmZT1pZS5kc24saGU9aWUudHVubmVsLHBlPWllLnNka01ldGFkYXRhLnNkayxoZXx8YCR7ZnVuY3Rpb24odCl7cmV0dXJuYCR7ZnVuY3Rpb24odCl7Y29uc3QgZT10LnByb3RvY29sP2Ake3QucHJvdG9jb2x9OmA6IiIsbj10LnBvcnQ/YDoke3QucG9ydH1gOiIiO3JldHVybmAke2V9Ly8ke3QuaG9zdH0ke259JHt0LnBhdGg/YC8ke3QucGF0aH1gOiIifS9hcGkvYH0odCl9JHt0LnByb2plY3RJZH0vZW52ZWxvcGUvYH0oZmUpfT8ke1l0KGZlLHBlKX1gKSxyZWNvcmREcm9wcGVkRXZlbnQ6KCk9Pnt9fSk7YXN5bmMgZnVuY3Rpb24gZGUoKXtpZihjZSl7YWUoIlNlbmRpbmcgYWJub3JtYWwgc2Vzc2lvbiIpLGZ0KGNlLHtzdGF0dXM6ImFibm9ybWFsIixhYm5vcm1hbF9tZWNoYW5pc206ImFucl9mb3JlZ3JvdW5kIn0pO2NvbnN0IGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz1ydChuKTtyZXR1cm4gWih7c2VudF9hdDoobmV3IERhdGUpLnRvSVNPU3RyaW5nKCksLi4ubyYme3NkazpvfSwuLi4hIXImJmUmJntkc246TihlKX19LFsiYWdncmVnYXRlcyJpbiB0P1t7dHlwZToic2Vzc2lvbnMifSx0XTpbe3R5cGU6InNlc3Npb24ifSx0LnRvSlNPTigpXV0pfShjZSxpZS5kc24saWUuc2RrTWV0YWRhdGEsaWUudHVubmVsKTthZShKU09OLnN0cmluZ2lmeShlKSksYXdhaXQgbGUuc2VuZChlKTt0cnl7dD8ucG9zdE1lc3NhZ2UoInNlc3Npb24tZW5kZWQiKX1jYXRjaCh0KXt9fX1mdW5jdGlvbiBtZSh0KXtpZighdClyZXR1cm47Y29uc3QgZT1mdW5jdGlvbih0KXtpZighdC5sZW5ndGgpcmV0dXJuW107Y29uc3QgZT1BcnJheS5mcm9tKHQpO3JldHVybi9zZW50cnlXcmFwcGVkLy50ZXN0KGVbZS5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmZS5wb3AoKSxlLnJldmVyc2UoKSxJLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiYoZS5wb3AoKSxJLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZlLnBvcCgpKSxlLnNsaWNlKDAsUikubWFwKCh0PT4oey4uLnQsZmlsZW5hbWU6dC5maWxlbmFtZXx8ZVtlLmxlbmd0aC0xXS5maWxlbmFtZSxmdW5jdGlvbjp0LmZ1bmN0aW9ufHxBfSkpKX0odCk7aWYoaWUuYXBwUm9vdFBhdGgpZm9yKGNvbnN0IHQgb2YgZSl0LmZpbGVuYW1lJiYodC5maWxlbmFtZT16KHQuZmlsZW5hbWUsaWUuYXBwUm9vdFBhdGgpKTtyZXR1cm4gZX1hc3luYyBmdW5jdGlvbiBnZSh0LGUpe2lmKHVlKXJldHVybjt1ZT0hMCxhd2FpdCBkZSgpLGFlKCJTZW5kaW5nIGV2ZW50Iik7Y29uc3Qgbj17ZXZlbnRfaWQ6QigpLGNvbnRleHRzOmllLmNvbnRleHRzLHJlbGVhc2U6aWUucmVsZWFzZSxlbnZpcm9ubWVudDppZS5lbnZpcm9ubWVudCxkaXN0OmllLmRpc3QscGxhdGZvcm06Im5vZGUiLGxldmVsOiJlcnJvciIsZXhjZXB0aW9uOnt2YWx1ZXM6W3t0eXBlOiJBcHBsaWNhdGlvbk5vdFJlc3BvbmRpbmciLHZhbHVlOmBBcHBsaWNhdGlvbiBOb3QgUmVzcG9uZGluZyBmb3IgYXQgbGVhc3QgJHtpZS5hbnJUaHJlc2hvbGR9IG1zYCxzdGFja3RyYWNlOntmcmFtZXM6bWUodCl9LG1lY2hhbmlzbTp7dHlwZToiQU5SIn19XX0sdGFnczppZS5zdGF0aWNUYWdzfTtlJiZmdW5jdGlvbih0LGUpe2lmKEh0KHQsZSksIXQuY29udGV4dHM/LnRyYWNlKXtjb25zdHt0cmFjZUlkOm4sc3BhbklkOnIscGFyZW50U3BhbklkOm99PWUucHJvcGFnYXRpb25Db250ZXh0O3QuY29udGV4dHM9e3RyYWNlOnt0cmFjZV9pZDpuLHNwYW5faWQ6cixwYXJlbnRfc3Bhbl9pZDpvfSwuLi50LmNvbnRleHRzfX19KG4sZSk7Y29uc3Qgcj1HdChuLGllLmRzbixpZS5zZGtNZXRhZGF0YSxpZS50dW5uZWwpO2FlKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCBsZS5zZW5kKHIpLGF3YWl0IGxlLmZsdXNoKDJlMyksc2V0VGltZW91dCgoKCk9Pntwcm9jZXNzLmV4aXQoMCl9KSw1ZTMpfWxldCB5ZTtpZihhZSgiU3RhcnRlZCIpLGllLmNhcHR1cmVTdGFja1RyYWNlKXthZSgiQ29ubmVjdGluZyB0byBkZWJ1Z2dlciIpO2NvbnN0IHQ9bmV3IG47dC5jb25uZWN0VG9NYWluVGhyZWFkKCksYWUoIkNvbm5lY3RlZCB0byBkZWJ1Z2dlciIpO2NvbnN0IGU9bmV3IE1hcDt0Lm9uKCJEZWJ1Z2dlci5zY3JpcHRQYXJzZWQiLCh0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pKSx0Lm9uKCJEZWJ1Z2dlci5wYXVzZWQiLChuPT57aWYoIm90aGVyIj09PW4ucGFyYW1zLnJlYXNvbil0cnl7YWUoIkRlYnVnZ2VyIHBhdXNlZCIpO2NvbnN0IHM9Wy4uLm4ucGFyYW1zLmNhbGxGcmFtZXNdLGk9aWUuYXBwUm9vdFBhdGg/ZnVuY3Rpb24odD0ocHJvY2Vzcy5hcmd2WzFdP1cocHJvY2Vzcy5hcmd2WzFdKTpwcm9jZXNzLmN3ZCgpKSxlPSJcXCI9PT1vKXtjb25zdCBuPWU/c2UodCk6dDtyZXR1cm4gdD0+e2lmKCF0KXJldHVybjtjb25zdCBvPWU/c2UodCk6dDtsZXR7ZGlyOnMsYmFzZTppLGV4dDpjfT1yLnBhcnNlKG8pOyIuanMiIT09YyYmIi5tanMiIT09YyYmIi5janMiIT09Y3x8KGk9aS5zbGljZSgwLC0xKmMubGVuZ3RoKSksc3x8KHM9Ii4iKTtjb25zdCB1PXMubGFzdEluZGV4T2YoIi9ub2RlX21vZHVsZXMiKTtpZih1Pi0xKXJldHVybmAke3Muc2xpY2UodSsxNCkucmVwbGFjZSgvXC8vZywiLiIpfToke2l9YDtpZihzLnN0YXJ0c1dpdGgobikpe2xldCB0PXMuc2xpY2Uobi5sZW5ndGgrMSkucmVwbGFjZSgvXC8vZywiLiIpO3JldHVybiB0JiYodCs9IjoiKSx0Kz1pLHR9cmV0dXJuIGl9fShpZS5hcHBSb290UGF0aCk6KCk9Pnt9LGM9cy5tYXAoKHQ9PmZ1bmN0aW9uKHQsZSxuKXtjb25zdCByPWU/ZS5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAscz10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybiBPKHtmaWxlbmFtZTpyLG1vZHVsZTpuKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHxBLGNvbG5vOm8sbGluZW5vOnMsaW5fYXBwOnI/VihyKTp2b2lkIDB9KX0odCxlLmdldCh0LmxvY2F0aW9uLnNjcmlwdElkKSxpKSkpLHU9c2V0VGltZW91dCgoKCk9PntnZShjKS50aGVuKG51bGwsKCgpPT57YWUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pKX0pLDVlMyk7dC5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCgoZSxuKT0+e2UmJmFlKGBFcnJvciBleGVjdXRpbmcgc2NyaXB0OiAnJHtlLm1lc3NhZ2V9J2ApLGNsZWFyVGltZW91dCh1KTtjb25zdCByPW4mJm4ucmVzdWx0P24ucmVzdWx0LnZhbHVlOnZvaWQgMDt0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLHQucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLGdlKGMscikudGhlbihudWxsLCgoKT0+e2FlKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQuIil9KSl9KSl9Y2F0Y2goZSl7dGhyb3cgdC5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSx0LnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSxlfX0pKSx5ZT0oKT0+e3RyeXt0LnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIsKCgpPT57dC5wb3N0KCJEZWJ1Z2dlci5wYXVzZSIpfSkpfWNhdGNoKHQpe319fWNvbnN0e3BvbGw6YmV9PWZ1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IG89dCgpO2xldCBzPSExLGk9ITA7cmV0dXJuIHNldEludGVydmFsKCgoKT0+e2NvbnN0IHQ9by5nZXRUaW1lTXMoKTshMT09PXMmJnQ+ZStuJiYocz0hMCxpJiZyKCkpLHQ8ZStuJiYocz0hMSl9KSwyMCkse3BvbGw6KCk9PntvLnJlc2V0KCl9LGVuYWJsZWQ6dD0+e2k9dH19fSgoZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtlLG5dPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMyplK24vMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0pLGllLnBvbGxJbnRlcnZhbCxpZS5hbnJUaHJlc2hvbGQsKGZ1bmN0aW9uKCl7YWUoIldhdGNoZG9nIHRpbWVvdXQiKSx5ZT8oYWUoIlBhdXNpbmcgZGVidWdnZXIgdG8gY2FwdHVyZSBzdGFjayB0cmFjZSIpLHllKCkpOihhZSgiQ2FwdHVyaW5nIGV2ZW50IHdpdGhvdXQgYSBzdGFjayB0cmFjZSIpLGdlKCkudGhlbihudWxsLCgoKT0+e2FlKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKSl9KSk7dD8ub24oIm1lc3NhZ2UiLCh0PT57dC5zZXNzaW9uJiYoY2U9YXQodC5zZXNzaW9uKSksYmUoKX0pKTs=';
14
+ const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjUuMCAoNjNkOGJhNCkgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIHR9ZnJvbSJub2RlOmluc3BlY3RvciI7aW1wb3J0e3BhcmVudFBvcnQgYXMgZSx3b3JrZXJEYXRhIGFzIG59ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtpbXBvcnR7cG9zaXggYXMgcixzZXAgYXMgb31mcm9tIm5vZGU6cGF0aCI7aW1wb3J0KmFzIHMgZnJvbSJub2RlOmh0dHAiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwcyI7aW1wb3J0e1JlYWRhYmxlIGFzIGN9ZnJvbSJub2RlOnN0cmVhbSI7aW1wb3J0e2NyZWF0ZUd6aXAgYXMgdX1mcm9tIm5vZGU6emxpYiI7aW1wb3J0KmFzIGEgZnJvbSJub2RlOm5ldCI7aW1wb3J0KmFzIGYgZnJvbSJub2RlOnRscyI7Y29uc3QgaD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHAodCxlKXtyZXR1cm4gaC5jYWxsKHQpPT09YFtvYmplY3QgJHtlfV1gfWZ1bmN0aW9uIGwodCl7cmV0dXJuIHAodCwiT2JqZWN0Iil9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gQm9vbGVhbih0JiZ0LnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4pfWZ1bmN0aW9uIG0odCxlKXt0cnl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfWNhdGNoKHQpe3JldHVybiExfX1jb25zdCBnPWdsb2JhbFRoaXM7ZnVuY3Rpb24geSh0LGUsbil7Y29uc3Qgcj1ufHxnLG89ci5fX1NFTlRSWV9fPXIuX19TRU5UUllfX3x8e307cmV0dXJuIG9bdF18fChvW3RdPWUoKSl9Y29uc3QgYj1nLHY9ODA7ZnVuY3Rpb24gXyh0LGUpe2NvbnN0IG49dCxyPVtdO2xldCBvLHMsaSxjLHU7aWYoIW58fCFuLnRhZ05hbWUpcmV0dXJuIiI7aWYoYi5IVE1MRWxlbWVudCYmbiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZuLmRhdGFzZXQpe2lmKG4uZGF0YXNldC5zZW50cnlDb21wb25lbnQpcmV0dXJuIG4uZGF0YXNldC5zZW50cnlDb21wb25lbnQ7aWYobi5kYXRhc2V0LnNlbnRyeUVsZW1lbnQpcmV0dXJuIG4uZGF0YXNldC5zZW50cnlFbGVtZW50fXIucHVzaChuLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7Y29uc3QgYT1lJiZlLmxlbmd0aD9lLmZpbHRlcigodD0+bi5nZXRBdHRyaWJ1dGUodCkpKS5tYXAoKHQ9Plt0LG4uZ2V0QXR0cmlidXRlKHQpXSkpOm51bGw7aWYoYSYmYS5sZW5ndGgpYS5mb3JFYWNoKCh0PT57ci5wdXNoKGBbJHt0WzBdfT0iJHt0WzFdfSJdYCl9KSk7ZWxzZSBpZihuLmlkJiZyLnB1c2goYCMke24uaWR9YCksbz1uLmNsYXNzTmFtZSxvJiZwKG8sIlN0cmluZyIpKWZvcihzPW8uc3BsaXQoL1xzKy8pLHU9MDt1PHMubGVuZ3RoO3UrKylyLnB1c2goYC4ke3NbdV19YCk7Y29uc3QgZj1bImFyaWEtbGFiZWwiLCJ0eXBlIiwibmFtZSIsInRpdGxlIiwiYWx0Il07Zm9yKHU9MDt1PGYubGVuZ3RoO3UrKylpPWZbdV0sYz1uLmdldEF0dHJpYnV0ZShpKSxjJiZyLnB1c2goYFske2l9PSIke2N9Il1gKTtyZXR1cm4gci5qb2luKCIiKX1jb25zdCB3PSJ1bmRlZmluZWQiPT10eXBlb2YgX19TRU5UUllfREVCVUdfX3x8X19TRU5UUllfREVCVUdfXyxTPVsiZGVidWciLCJpbmZvIiwid2FybiIsImVycm9yIiwibG9nIiwiYXNzZXJ0IiwidHJhY2UiXSwkPXt9O2Z1bmN0aW9uIEUodCl7aWYoISgiY29uc29sZSJpbiBnKSlyZXR1cm4gdCgpO2NvbnN0IGU9Zy5jb25zb2xlLG49e30scj1PYmplY3Qua2V5cygkKTtyLmZvckVhY2goKHQ9Pntjb25zdCByPSRbdF07blt0XT1lW3RdLGVbdF09cn0pKTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3IuZm9yRWFjaCgodD0+e2VbdF09blt0XX0pKX19Y29uc3QgeD1mdW5jdGlvbigpe2xldCB0PSExO2NvbnN0IGU9e2VuYWJsZTooKT0+e3Q9ITB9LGRpc2FibGU6KCk9Pnt0PSExfSxpc0VuYWJsZWQ6KCk9PnR9O3JldHVybiB3P1MuZm9yRWFjaCgobj0+e2Vbbl09KC4uLmUpPT57dCYmRSgoKCk9PntnLmNvbnNvbGVbbl0oYFNlbnRyeSBMb2dnZXIgWyR7bn1dOmAsLi4uZSl9KSl9fSkpOlMuZm9yRWFjaCgodD0+e2VbdF09KCk9Pnt9fSkpLGV9KCk7ZnVuY3Rpb24gTih0LGU9ITEpe2NvbnN0e2hvc3Q6bixwYXRoOnIscGFzczpvLHBvcnQ6cyxwcm9qZWN0SWQ6aSxwcm90b2NvbDpjLHB1YmxpY0tleTp1fT10O3JldHVybmAke2N9Oi8vJHt1fSR7ZSYmbz9gOiR7b31gOiIifUAke259JHtzP2A6JHtzfWA6IiJ9LyR7cj9gJHtyfS9gOnJ9JHtpfWB9Y2xhc3MgayBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsZT0id2FybiIpe3N1cGVyKHQpLHRoaXMubWVzc2FnZT10LHRoaXMubmFtZT1uZXcudGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKSx0aGlzLmxvZ0xldmVsPWV9fWZ1bmN0aW9uIEModCl7aWYoZnVuY3Rpb24odCl7c3dpdGNoKGguY2FsbCh0KSl7Y2FzZSJbb2JqZWN0IEVycm9yXSI6Y2FzZSJbb2JqZWN0IEV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBET01FeGNlcHRpb25dIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiBtKHQsRXJyb3IpfX0odCkpcmV0dXJue21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2ssLi4uVCh0KX07aWYoZT10LCJ1bmRlZmluZWQiIT10eXBlb2YgRXZlbnQmJm0oZSxFdmVudCkpe2NvbnN0IGU9e3R5cGU6dC50eXBlLHRhcmdldDpEKHQudGFyZ2V0KSxjdXJyZW50VGFyZ2V0OkQodC5jdXJyZW50VGFyZ2V0KSwuLi5UKHQpfTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEN1c3RvbUV2ZW50JiZtKHQsQ3VzdG9tRXZlbnQpJiYoZS5kZXRhaWw9dC5kZXRhaWwpLGV9cmV0dXJuIHQ7dmFyIGV9ZnVuY3Rpb24gRCh0KXt0cnl7cmV0dXJuIGU9dCwidW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQmJm0oZSxFbGVtZW50KT9mdW5jdGlvbih0LGU9e30pe2lmKCF0KXJldHVybiI8dW5rbm93bj4iO3RyeXtsZXQgbj10O2NvbnN0IHI9NSxvPVtdO2xldCBzPTAsaT0wO2NvbnN0IGM9IiA+ICIsdT1jLmxlbmd0aDtsZXQgYTtjb25zdCBmPUFycmF5LmlzQXJyYXkoZSk/ZTplLmtleUF0dHJzLGg9IUFycmF5LmlzQXJyYXkoZSkmJmUubWF4U3RyaW5nTGVuZ3RofHx2O2Zvcig7biYmcysrPHImJihhPV8obixmKSwhKCJodG1sIj09PWF8fHM+MSYmaStvLmxlbmd0aCp1K2EubGVuZ3RoPj1oKSk7KW8ucHVzaChhKSxpKz1hLmxlbmd0aCxuPW4ucGFyZW50Tm9kZTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihjKX1jYXRjaCh0KXtyZXR1cm4iPHVua25vd24+In19KHQpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1jYXRjaCh0KXtyZXR1cm4iPHVua25vd24+In12YXIgZX1mdW5jdGlvbiBUKHQpe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGV9cmV0dXJue319ZnVuY3Rpb24gTyh0KXtyZXR1cm4gaih0LG5ldyBNYXApfWZ1bmN0aW9uIGoodCxlKXtpZihmdW5jdGlvbih0KXtpZighbCh0KSlyZXR1cm4hMTt0cnl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IubmFtZTtyZXR1cm4hZXx8Ik9iamVjdCI9PT1lfWNhdGNoKHQpe3JldHVybiEwfX0odCkpe2NvbnN0IG49ZS5nZXQodCk7aWYodm9pZCAwIT09bilyZXR1cm4gbjtjb25zdCByPXt9O2Uuc2V0KHQscik7Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmtleXModCkpdm9pZCAwIT09dFtuXSYmKHJbbl09aih0W25dLGUpKTtyZXR1cm4gcn1pZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCBuPWUuZ2V0KHQpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47Y29uc3Qgcj1bXTtyZXR1cm4gZS5zZXQodCxyKSx0LmZvckVhY2goKHQ9PntyLnB1c2goaih0LGUpKX0pKSxyfXJldHVybiB0fWNvbnN0IFI9NTAsQT0iPyIsST0vY2FwdHVyZU1lc3NhZ2V8Y2FwdHVyZUV4Y2VwdGlvbi87Y29uc3QgUD0iPGFub255bW91cz4iO2NvbnN0IFU9MWUzO2Z1bmN0aW9uIE0oKXtyZXR1cm4gRGF0ZS5ub3coKS9VfWNvbnN0IEw9ZnVuY3Rpb24oKXtjb25zdHtwZXJmb3JtYW5jZTp0fT1nO2lmKCF0fHwhdC5ub3cpcmV0dXJuIE07Y29uc3QgZT1EYXRlLm5vdygpLXQubm93KCksbj1udWxsPT10LnRpbWVPcmlnaW4/ZTp0LnRpbWVPcmlnaW47cmV0dXJuKCk9PihuK3Qubm93KCkpL1V9KCk7ZnVuY3Rpb24gQigpe2NvbnN0IHQ9ZyxlPXQuY3J5cHRvfHx0Lm1zQ3J5cHRvO2xldCBuPSgpPT4xNipNYXRoLnJhbmRvbSgpO3RyeXtpZihlJiZlLnJhbmRvbVVVSUQpcmV0dXJuIGUucmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywiIik7ZSYmZS5nZXRSYW5kb21WYWx1ZXMmJihuPSgpPT57Y29uc3QgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5nZXRSYW5kb21WYWx1ZXModCksdFswXX0pfWNhdGNoKHQpe31yZXR1cm4oWzFlN10rMWUzKzRlMys4ZTMrMWUxMSkucmVwbGFjZSgvWzAxOF0vZywodD0+KHReKDE1Jm4oKSk+PnQvNCkudG9TdHJpbmcoMTYpKSl9ZnVuY3Rpb24gRyh0LGU9MTAwLG49MS8wKXt0cnl7cmV0dXJuIEooIiIsdCxlLG4pfWNhdGNoKHQpe3JldHVybntFUlJPUjpgKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH19fWZ1bmN0aW9uIEoodCxlLG49MS8wLHI9MS8wLG89ZnVuY3Rpb24oKXtjb25zdCB0PSJmdW5jdGlvbiI9PXR5cGVvZiBXZWFrU2V0LGU9dD9uZXcgV2Vha1NldDpbXTtyZXR1cm5bZnVuY3Rpb24obil7aWYodClyZXR1cm4hIWUuaGFzKG4pfHwoZS5hZGQobiksITEpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKGVbdF09PT1uKXJldHVybiEwO3JldHVybiBlLnB1c2gobiksITF9LGZ1bmN0aW9uKG4pe2lmKHQpZS5kZWxldGUobik7ZWxzZSBmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdPT09bil7ZS5zcGxpY2UodCwxKTticmVha319XX0oKSl7Y29uc3RbcyxpXT1vO2lmKG51bGw9PWV8fFsibnVtYmVyIiwiYm9vbGVhbiIsInN0cmluZyJdLmluY2x1ZGVzKHR5cGVvZiBlKSYmIU51bWJlci5pc05hTihlKSlyZXR1cm4gZTtjb25zdCBjPWZ1bmN0aW9uKHQsZSl7dHJ5e2lmKCJkb21haW4iPT09dCYmZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZlLnQpcmV0dXJuIltEb21haW5dIjtpZigiZG9tYWluRW1pdHRlciI9PT10KXJldHVybiJbRG9tYWluRW1pdHRlcl0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZlPT09Z2xvYmFsKXJldHVybiJbR2xvYmFsXSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJmU9PT13aW5kb3cpcmV0dXJuIltXaW5kb3ddIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZlPT09ZG9jdW1lbnQpcmV0dXJuIltEb2N1bWVudF0iO2lmKCJvYmplY3QiPT10eXBlb2Yobj1lKSYmbnVsbCE9PW4mJihuLl9faXNWdWV8fG4ubykpcmV0dXJuIltWdWVWaWV3TW9kZWxdIjtpZihmdW5jdGlvbih0KXtyZXR1cm4gbCh0KSYmIm5hdGl2ZUV2ZW50ImluIHQmJiJwcmV2ZW50RGVmYXVsdCJpbiB0JiYic3RvcFByb3BhZ2F0aW9uImluIHR9KGUpKXJldHVybiJbU3ludGhldGljRXZlbnRdIjtpZigibnVtYmVyIj09dHlwZW9mIGUmJmUhPWUpcmV0dXJuIltOYU5dIjtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm5gW0Z1bmN0aW9uOiAke2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQubmFtZXx8UH1jYXRjaCh0KXtyZXR1cm4gUH19KGUpfV1gO2lmKCJzeW1ib2wiPT10eXBlb2YgZSlyZXR1cm5gWyR7U3RyaW5nKGUpfV1gO2lmKCJiaWdpbnQiPT10eXBlb2YgZSlyZXR1cm5gW0JpZ0ludDogJHtTdHJpbmcoZSl9XWA7Y29uc3Qgcj1mdW5jdGlvbih0KXtjb25zdCBlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gZT9lLmNvbnN0cnVjdG9yLm5hbWU6Im51bGwgcHJvdG90eXBlIn0oZSk7cmV0dXJuL15IVE1MKFx3KilFbGVtZW50JC8udGVzdChyKT9gW0hUTUxFbGVtZW50OiAke3J9XWA6YFtvYmplY3QgJHtyfV1gfWNhdGNoKHQpe3JldHVybmAqKm5vbi1zZXJpYWxpemFibGUqKiAoJHt0fSlgfXZhciBufSh0LGUpO2lmKCFjLnN0YXJ0c1dpdGgoIltvYmplY3QgIikpcmV0dXJuIGM7aWYoZS5fX3NlbnRyeV9za2lwX25vcm1hbGl6YXRpb25fXylyZXR1cm4gZTtjb25zdCB1PSJudW1iZXIiPT10eXBlb2YgZS5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX18/ZS5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX186bjtpZigwPT09dSlyZXR1cm4gYy5yZXBsYWNlKCJvYmplY3QgIiwiIik7aWYocyhlKSlyZXR1cm4iW0NpcmN1bGFyIH5dIjtjb25zdCBhPWU7aWYoYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEudG9KU09OKXRyeXtyZXR1cm4gSigiIixhLnRvSlNPTigpLHUtMSxyLG8pfWNhdGNoKHQpe31jb25zdCBmPUFycmF5LmlzQXJyYXkoZSk/W106e307bGV0IGg9MDtjb25zdCBwPUMoZSk7Zm9yKGNvbnN0IHQgaW4gcCl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLHQpKWNvbnRpbnVlO2lmKGg+PXIpe2ZbdF09IltNYXhQcm9wZXJ0aWVzIH5dIjticmVha31jb25zdCBlPXBbdF07Zlt0XT1KKHQsZSx1LTEscixvKSxoKyt9cmV0dXJuIGkoZSksZn1mdW5jdGlvbiB6KHQsZSl7Y29uc3Qgbj1lLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywiXFwkJiIpO2xldCByPXQ7dHJ5e3I9ZGVjb2RlVVJJKHQpfWNhdGNoKHQpe31yZXR1cm4gci5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvd2VicGFjazpcLz8vZywiIikucmVwbGFjZShuZXcgUmVnRXhwKGAoZmlsZTovLyk/Lyoke259LypgLCJpZyIpLCJhcHA6Ly8vIil9KCgpPT57Y29uc3R7cGVyZm9ybWFuY2U6dH09ZztpZighdHx8IXQubm93KXJldHVybjtjb25zdCBlPTM2ZTUsbj10Lm5vdygpLHI9RGF0ZS5ub3coKSxvPXQudGltZU9yaWdpbj9NYXRoLmFicyh0LnRpbWVPcmlnaW4rbi1yKTplLHM9bzxlLGk9dC50aW1pbmcmJnQudGltaW5nLm5hdmlnYXRpb25TdGFydCxjPSJudW1iZXIiPT10eXBlb2YgaT9NYXRoLmFicyhpK24tcik6ZTsoc3x8YzxlKSYmKG88PWMmJnQudGltZU9yaWdpbil9KSgpO2NvbnN0IEg9L14oXFMrOlxcfFwvPykoW1xzXFNdKj8pKCg/OlwuezEsMn18W14vXFxdKz98KShcLlteLi9cXF0qfCkpKD86Wy9cXF0qKSQvO2Z1bmN0aW9uIFcodCl7Y29uc3QgZT1mdW5jdGlvbih0KXtjb25zdCBlPXQubGVuZ3RoPjEwMjQ/YDx0cnVuY2F0ZWQ+JHt0LnNsaWNlKC0xMDI0KX1gOnQsbj1ILmV4ZWMoZSk7cmV0dXJuIG4/bi5zbGljZSgxKTpbXX0odCksbj1lWzBdO2xldCByPWVbMV07cmV0dXJuIG58fHI/KHImJihyPXIuc2xpY2UoMCxyLmxlbmd0aC0xKSksbityKToiLiJ9dmFyIFk7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gbmV3IEYoKGU9PntlKHQpfSkpfSFmdW5jdGlvbih0KXt0W3QuUEVORElORz0wXT0iUEVORElORyI7dFt0LlJFU09MVkVEPTFdPSJSRVNPTFZFRCI7dFt0LlJFSkVDVEVEPTJdPSJSRUpFQ1RFRCJ9KFl8fChZPXt9KSk7Y2xhc3MgRntjb25zdHJ1Y3Rvcih0KXtGLnByb3RvdHlwZS5fX2luaXQuY2FsbCh0aGlzKSxGLnByb3RvdHlwZS5fX2luaXQyLmNhbGwodGhpcyksRi5wcm90b3R5cGUuX19pbml0My5jYWxsKHRoaXMpLEYucHJvdG90eXBlLl9faW5pdDQuY2FsbCh0aGlzKSx0aGlzLmk9WS5QRU5ESU5HLHRoaXMudT1bXTt0cnl7dCh0aGlzLmgsdGhpcy5wKX1jYXRjaCh0KXt0aGlzLnAodCl9fXRoZW4odCxlKXtyZXR1cm4gbmV3IEYoKChuLHIpPT57dGhpcy51LnB1c2goWyExLGU9PntpZih0KXRyeXtuKHQoZSkpfWNhdGNoKHQpe3IodCl9ZWxzZSBuKGUpfSx0PT57aWYoZSl0cnl7bihlKHQpKX1jYXRjaCh0KXtyKHQpfWVsc2Ugcih0KX1dKSx0aGlzLmwoKX0pKX1jYXRjaCh0KXtyZXR1cm4gdGhpcy50aGVuKCh0PT50KSx0KX1maW5hbGx5KHQpe3JldHVybiBuZXcgRigoKGUsbik9PntsZXQgcixvO3JldHVybiB0aGlzLnRoZW4oKGU9PntvPSExLHI9ZSx0JiZ0KCl9KSwoZT0+e289ITAscj1lLHQmJnQoKX0pKS50aGVuKCgoKT0+e28/bihyKTplKHIpfSkpfSkpfV9faW5pdCgpe3RoaXMuaD10PT57dGhpcy5tKFkuUkVTT0xWRUQsdCl9fV9faW5pdDIoKXt0aGlzLnA9dD0+e3RoaXMubShZLlJFSkVDVEVELHQpfX1fX2luaXQzKCl7dGhpcy5tPSh0LGUpPT57dGhpcy5pPT09WS5QRU5ESU5HJiYoZChlKT9lLnRoZW4odGhpcy5oLHRoaXMucCk6KHRoaXMuaT10LHRoaXMudj1lLHRoaXMubCgpKSl9fV9faW5pdDQoKXt0aGlzLmw9KCk9PntpZih0aGlzLmk9PT1ZLlBFTkRJTkcpcmV0dXJuO2NvbnN0IHQ9dGhpcy51LnNsaWNlKCk7dGhpcy51PVtdLHQuZm9yRWFjaCgodD0+e3RbMF18fCh0aGlzLmk9PT1ZLlJFU09MVkVEJiZ0WzFdKHRoaXMudiksdGhpcy5pPT09WS5SRUpFQ1RFRCYmdFsyXSh0aGlzLnYpLHRbMF09ITApfSkpfX19ZnVuY3Rpb24gSyh0KXtjb25zdCBlPVtdO2Z1bmN0aW9uIG4odCl7cmV0dXJuIGUuc3BsaWNlKGUuaW5kZXhPZih0KSwxKVswXX1yZXR1cm57JDplLGFkZDpmdW5jdGlvbihyKXtpZighKHZvaWQgMD09PXR8fGUubGVuZ3RoPHQpKXJldHVybiBvPW5ldyBrKCJOb3QgYWRkaW5nIFByb21pc2UgYmVjYXVzZSBidWZmZXIgbGltaXQgd2FzIHJlYWNoZWQuIiksbmV3IEYoKCh0LGUpPT57ZShvKX0pKTt2YXIgbztjb25zdCBzPXIoKTtyZXR1cm4tMT09PWUuaW5kZXhPZihzKSYmZS5wdXNoKHMpLHMudGhlbigoKCk9Pm4ocykpKS50aGVuKG51bGwsKCgpPT5uKHMpLnRoZW4obnVsbCwoKCk9Pnt9KSkpKSxzfSxkcmFpbjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEYoKChuLHIpPT57bGV0IG89ZS5sZW5ndGg7aWYoIW8pcmV0dXJuIG4oITApO2NvbnN0IHM9c2V0VGltZW91dCgoKCk9Pnt0JiZ0PjAmJm4oITEpfSksdCk7ZS5mb3JFYWNoKCh0PT57cSh0KS50aGVuKCgoKT0+ey0tb3x8KGNsZWFyVGltZW91dChzKSxuKCEwKSl9KSxyKX0pKX0pKX19fWZ1bmN0aW9uIFYodCxlPSExKXtyZXR1cm4hKGV8fHQmJiF0LnN0YXJ0c1dpdGgoIi8iKSYmIXQubWF0Y2goL15bQS1aXTovKSYmIXQuc3RhcnRzV2l0aCgiLiIpJiYhdC5tYXRjaCgvXlthLXpBLVpdKFthLXpBLVowLTkuXC0rXSkqOlwvXC8vKSkmJnZvaWQgMCE9PXQmJiF0LmluY2x1ZGVzKCJub2RlX21vZHVsZXMvIil9ZnVuY3Rpb24gWih0LGU9W10pe3JldHVyblt0LGVdfWZ1bmN0aW9uIFEodCxlKXtjb25zdCBuPXRbMV07Zm9yKGNvbnN0IHQgb2Ygbil7aWYoZSh0LHRbMF0udHlwZSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gWCh0KXtyZXR1cm4gZy5fX1NFTlRSWV9fJiZnLl9fU0VOVFJZX18uZW5jb2RlUG9seWZpbGw/Zy5fX1NFTlRSWV9fLmVuY29kZVBvbHlmaWxsKHQpOihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KX1mdW5jdGlvbiB0dCh0KXtjb25zdFtlLG5dPXQ7bGV0IHI9SlNPTi5zdHJpbmdpZnkoZSk7ZnVuY3Rpb24gbyh0KXsic3RyaW5nIj09dHlwZW9mIHI/cj0ic3RyaW5nIj09dHlwZW9mIHQ/cit0OltYKHIpLHRdOnIucHVzaCgic3RyaW5nIj09dHlwZW9mIHQ/WCh0KTp0KX1mb3IoY29uc3QgdCBvZiBuKXtjb25zdFtlLG5dPXQ7aWYobyhgXG4ke0pTT04uc3RyaW5naWZ5KGUpfVxuYCksInN0cmluZyI9PXR5cGVvZiBufHxuIGluc3RhbmNlb2YgVWludDhBcnJheSlvKG4pO2Vsc2V7bGV0IHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkobil9Y2F0Y2goZSl7dD1KU09OLnN0cmluZ2lmeShHKG4pKX1vKHQpfX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/cjpmdW5jdGlvbih0KXtjb25zdCBlPXQucmVkdWNlKCgodCxlKT0+dCtlLmxlbmd0aCksMCksbj1uZXcgVWludDhBcnJheShlKTtsZXQgcj0wO2Zvcihjb25zdCBlIG9mIHQpbi5zZXQoZSxyKSxyKz1lLmxlbmd0aDtyZXR1cm4gbn0ocil9Y29uc3QgZXQ9e3Nlc3Npb246InNlc3Npb24iLHNlc3Npb25zOiJzZXNzaW9uIixhdHRhY2htZW50OiJhdHRhY2htZW50Iix0cmFuc2FjdGlvbjoidHJhbnNhY3Rpb24iLGV2ZW50OiJlcnJvciIsY2xpZW50X3JlcG9ydDoiaW50ZXJuYWwiLHVzZXJfcmVwb3J0OiJkZWZhdWx0Iixwcm9maWxlOiJwcm9maWxlIixyZXBsYXlfZXZlbnQ6InJlcGxheSIscmVwbGF5X3JlY29yZGluZzoicmVwbGF5IixjaGVja19pbjoibW9uaXRvciIsZmVlZGJhY2s6ImZlZWRiYWNrIixzcGFuOiJzcGFuIixzdGF0c2Q6Im1ldHJpY19idWNrZXQifTtmdW5jdGlvbiBudCh0KXtyZXR1cm4gZXRbdF19ZnVuY3Rpb24gcnQodCl7aWYoIXR8fCF0LnNkaylyZXR1cm47Y29uc3R7bmFtZTplLHZlcnNpb246bn09dC5zZGs7cmV0dXJue25hbWU6ZSx2ZXJzaW9uOm59fWNvbnN0IG90PTZlNDtmdW5jdGlvbiBzdCh0LHtzdGF0dXNDb2RlOmUsaGVhZGVyczpufSxyPURhdGUubm93KCkpe2NvbnN0IG89ey4uLnR9LHM9biYmblsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxpPW4mJm5bInJldHJ5LWFmdGVyIl07aWYocylmb3IoY29uc3QgdCBvZiBzLnRyaW0oKS5zcGxpdCgiLCIpKXtjb25zdFtlLG4sLCxzXT10LnNwbGl0KCI6Iiw1KSxpPXBhcnNlSW50KGUsMTApLGM9MWUzKihpc05hTihpKT82MDppKTtpZihuKWZvcihjb25zdCB0IG9mIG4uc3BsaXQoIjsiKSkibWV0cmljX2J1Y2tldCI9PT10JiZzJiYhcy5zcGxpdCgiOyIpLmluY2x1ZGVzKCJjdXN0b20iKXx8KG9bdF09citjKTtlbHNlIG8uYWxsPXIrY31lbHNlIGk/by5hbGw9citmdW5jdGlvbih0LGU9RGF0ZS5ub3coKSl7Y29uc3Qgbj1wYXJzZUludChgJHt0fWAsMTApO2lmKCFpc05hTihuKSlyZXR1cm4gMWUzKm47Y29uc3Qgcj1EYXRlLnBhcnNlKGAke3R9YCk7cmV0dXJuIGlzTmFOKHIpP290OnItZX0oaSxyKTo0Mjk9PT1lJiYoby5hbGw9cis2ZTQpO3JldHVybiBvfWZ1bmN0aW9uIGl0KCl7cmV0dXJue3RyYWNlSWQ6QigpLHNwYW5JZDpCKCkuc3Vic3RyaW5nKDE2KX19Y29uc3QgY3Q9InVuZGVmaW5lZCI9PXR5cGVvZiBfX1NFTlRSWV9ERUJVR19ffHxfX1NFTlRSWV9ERUJVR19fO2Z1bmN0aW9uIHV0KCl7cmV0dXJuIGF0KGcpLGd9ZnVuY3Rpb24gYXQodCl7cmV0dXJuIHQuX19TRU5UUllfX3x8KHQuX19TRU5UUllfXz17ZXh0ZW5zaW9uczp7fX0pLHQuX19TRU5UUllfX31mdW5jdGlvbiBmdCh0KXtjb25zdCBlPUwoKSxuPXtzaWQ6QigpLGluaXQ6ITAsdGltZXN0YW1wOmUsc3RhcnRlZDplLGR1cmF0aW9uOjAsc3RhdHVzOiJvayIsZXJyb3JzOjAsaWdub3JlRHVyYXRpb246ITEsdG9KU09OOigpPT5mdW5jdGlvbih0KXtyZXR1cm4gTyh7c2lkOmAke3Quc2lkfWAsaW5pdDp0LmluaXQsc3RhcnRlZDpuZXcgRGF0ZSgxZTMqdC5zdGFydGVkKS50b0lTT1N0cmluZygpLHRpbWVzdGFtcDpuZXcgRGF0ZSgxZTMqdC50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksc3RhdHVzOnQuc3RhdHVzLGVycm9yczp0LmVycm9ycyxkaWQ6Im51bWJlciI9PXR5cGVvZiB0LmRpZHx8InN0cmluZyI9PXR5cGVvZiB0LmRpZD9gJHt0LmRpZH1gOnZvaWQgMCxkdXJhdGlvbjp0LmR1cmF0aW9uLGFibm9ybWFsX21lY2hhbmlzbTp0LmFibm9ybWFsX21lY2hhbmlzbSxhdHRyczp7cmVsZWFzZTp0LnJlbGVhc2UsZW52aXJvbm1lbnQ6dC5lbnZpcm9ubWVudCxpcF9hZGRyZXNzOnQuaXBBZGRyZXNzLHVzZXJfYWdlbnQ6dC51c2VyQWdlbnR9fSl9KG4pfTtyZXR1cm4gdCYmaHQobix0KSxufWZ1bmN0aW9uIGh0KHQsZT17fSl7aWYoZS51c2VyJiYoIXQuaXBBZGRyZXNzJiZlLnVzZXIuaXBfYWRkcmVzcyYmKHQuaXBBZGRyZXNzPWUudXNlci5pcF9hZGRyZXNzKSx0LmRpZHx8ZS5kaWR8fCh0LmRpZD1lLnVzZXIuaWR8fGUudXNlci5lbWFpbHx8ZS51c2VyLnVzZXJuYW1lKSksdC50aW1lc3RhbXA9ZS50aW1lc3RhbXB8fEwoKSxlLmFibm9ybWFsX21lY2hhbmlzbSYmKHQuYWJub3JtYWxfbWVjaGFuaXNtPWUuYWJub3JtYWxfbWVjaGFuaXNtKSxlLmlnbm9yZUR1cmF0aW9uJiYodC5pZ25vcmVEdXJhdGlvbj1lLmlnbm9yZUR1cmF0aW9uKSxlLnNpZCYmKHQuc2lkPTMyPT09ZS5zaWQubGVuZ3RoP2Uuc2lkOkIoKSksdm9pZCAwIT09ZS5pbml0JiYodC5pbml0PWUuaW5pdCksIXQuZGlkJiZlLmRpZCYmKHQuZGlkPWAke2UuZGlkfWApLCJudW1iZXIiPT10eXBlb2YgZS5zdGFydGVkJiYodC5zdGFydGVkPWUuc3RhcnRlZCksdC5pZ25vcmVEdXJhdGlvbil0LmR1cmF0aW9uPXZvaWQgMDtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZS5kdXJhdGlvbil0LmR1cmF0aW9uPWUuZHVyYXRpb247ZWxzZXtjb25zdCBlPXQudGltZXN0YW1wLXQuc3RhcnRlZDt0LmR1cmF0aW9uPWU+PTA/ZTowfWUucmVsZWFzZSYmKHQucmVsZWFzZT1lLnJlbGVhc2UpLGUuZW52aXJvbm1lbnQmJih0LmVudmlyb25tZW50PWUuZW52aXJvbm1lbnQpLCF0LmlwQWRkcmVzcyYmZS5pcEFkZHJlc3MmJih0LmlwQWRkcmVzcz1lLmlwQWRkcmVzcyksIXQudXNlckFnZW50JiZlLnVzZXJBZ2VudCYmKHQudXNlckFnZW50PWUudXNlckFnZW50KSwibnVtYmVyIj09dHlwZW9mIGUuZXJyb3JzJiYodC5lcnJvcnM9ZS5lcnJvcnMpLGUuc3RhdHVzJiYodC5zdGF0dXM9ZS5zdGF0dXMpfWNvbnN0IHB0PSJfc2VudHJ5U3BhbiI7ZnVuY3Rpb24gbHQodCxlKXtlP2Z1bmN0aW9uKHQsZSxuKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1jYXRjaChuKXt3JiZ4LmxvZyhgRmFpbGVkIHRvIGFkZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSAiJHtlfSIgdG8gb2JqZWN0YCx0KX19KHQscHQsZSk6ZGVsZXRlIHRbcHRdfWZ1bmN0aW9uIGR0KHQpe3JldHVybiB0W3B0XX1jbGFzcyBtdHtjb25zdHJ1Y3Rvcigpe3RoaXMuXz0hMSx0aGlzLlM9W10sdGhpcy5OPVtdLHRoaXMuaz1bXSx0aGlzLkM9W10sdGhpcy5EPXt9LHRoaXMuVD17fSx0aGlzLk89e30sdGhpcy5qPXt9LHRoaXMuUj17fSx0aGlzLkE9aXQoKX1jbG9uZSgpe2NvbnN0IHQ9bmV3IG10O3JldHVybiB0Lms9Wy4uLnRoaXMua10sdC5UPXsuLi50aGlzLlR9LHQuTz17Li4udGhpcy5PfSx0Lmo9ey4uLnRoaXMuan0sdC5EPXRoaXMuRCx0Lkk9dGhpcy5JLHQuUD10aGlzLlAsdC5VPXRoaXMuVSx0Lk09dGhpcy5NLHQuTj1bLi4udGhpcy5OXSx0Lkw9dGhpcy5MLHQuQz1bLi4udGhpcy5DXSx0LlI9ey4uLnRoaXMuUn0sdC5BPXsuLi50aGlzLkF9LHQuQj10aGlzLkIsdC5HPXRoaXMuRyxsdCh0LGR0KHRoaXMpKSx0fXNldENsaWVudCh0KXt0aGlzLkI9dH1zZXRMYXN0RXZlbnRJZCh0KXt0aGlzLkc9dH1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5CfWxhc3RFdmVudElkKCl7cmV0dXJuIHRoaXMuR31hZGRTY29wZUxpc3RlbmVyKHQpe3RoaXMuUy5wdXNoKHQpfWFkZEV2ZW50UHJvY2Vzc29yKHQpe3JldHVybiB0aGlzLk4ucHVzaCh0KSx0aGlzfXNldFVzZXIodCl7cmV0dXJuIHRoaXMuRD10fHx7ZW1haWw6dm9pZCAwLGlkOnZvaWQgMCxpcF9hZGRyZXNzOnZvaWQgMCx1c2VybmFtZTp2b2lkIDB9LHRoaXMuUCYmaHQodGhpcy5QLHt1c2VyOnR9KSx0aGlzLkooKSx0aGlzfWdldFVzZXIoKXtyZXR1cm4gdGhpcy5EfWdldFJlcXVlc3RTZXNzaW9uKCl7cmV0dXJuIHRoaXMuTH1zZXRSZXF1ZXN0U2Vzc2lvbih0KXtyZXR1cm4gdGhpcy5MPXQsdGhpc31zZXRUYWdzKHQpe3JldHVybiB0aGlzLlQ9ey4uLnRoaXMuVCwuLi50fSx0aGlzLkooKSx0aGlzfXNldFRhZyh0LGUpe3JldHVybiB0aGlzLlQ9ey4uLnRoaXMuVCxbdF06ZX0sdGhpcy5KKCksdGhpc31zZXRFeHRyYXModCl7cmV0dXJuIHRoaXMuTz17Li4udGhpcy5PLC4uLnR9LHRoaXMuSigpLHRoaXN9c2V0RXh0cmEodCxlKXtyZXR1cm4gdGhpcy5PPXsuLi50aGlzLk8sW3RdOmV9LHRoaXMuSigpLHRoaXN9c2V0RmluZ2VycHJpbnQodCl7cmV0dXJuIHRoaXMuTT10LHRoaXMuSigpLHRoaXN9c2V0TGV2ZWwodCl7cmV0dXJuIHRoaXMuST10LHRoaXMuSigpLHRoaXN9c2V0VHJhbnNhY3Rpb25OYW1lKHQpe3JldHVybiB0aGlzLlU9dCx0aGlzLkooKSx0aGlzfXNldENvbnRleHQodCxlKXtyZXR1cm4gbnVsbD09PWU/ZGVsZXRlIHRoaXMualt0XTp0aGlzLmpbdF09ZSx0aGlzLkooKSx0aGlzfXNldFNlc3Npb24odCl7cmV0dXJuIHQ/dGhpcy5QPXQ6ZGVsZXRlIHRoaXMuUCx0aGlzLkooKSx0aGlzfWdldFNlc3Npb24oKXtyZXR1cm4gdGhpcy5QfXVwZGF0ZSh0KXtpZighdClyZXR1cm4gdGhpcztjb25zdCBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QodGhpcyk6dCxbbixyXT1lIGluc3RhbmNlb2YgZ3Q/W2UuZ2V0U2NvcGVEYXRhKCksZS5nZXRSZXF1ZXN0U2Vzc2lvbigpXTpsKGUpP1t0LHQucmVxdWVzdFNlc3Npb25dOltdLHt0YWdzOm8sZXh0cmE6cyx1c2VyOmksY29udGV4dHM6YyxsZXZlbDp1LGZpbmdlcnByaW50OmE9W10scHJvcGFnYXRpb25Db250ZXh0OmZ9PW58fHt9O3JldHVybiB0aGlzLlQ9ey4uLnRoaXMuVCwuLi5vfSx0aGlzLk89ey4uLnRoaXMuTywuLi5zfSx0aGlzLmo9ey4uLnRoaXMuaiwuLi5jfSxpJiZPYmplY3Qua2V5cyhpKS5sZW5ndGgmJih0aGlzLkQ9aSksdSYmKHRoaXMuST11KSxhLmxlbmd0aCYmKHRoaXMuTT1hKSxmJiYodGhpcy5BPWYpLHImJih0aGlzLkw9ciksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLms9W10sdGhpcy5UPXt9LHRoaXMuTz17fSx0aGlzLkQ9e30sdGhpcy5qPXt9LHRoaXMuST12b2lkIDAsdGhpcy5VPXZvaWQgMCx0aGlzLk09dm9pZCAwLHRoaXMuTD12b2lkIDAsdGhpcy5QPXZvaWQgMCxsdCh0aGlzLHZvaWQgMCksdGhpcy5DPVtdLHRoaXMuQT1pdCgpLHRoaXMuSigpLHRoaXN9YWRkQnJlYWRjcnVtYih0LGUpe2NvbnN0IG49Im51bWJlciI9PXR5cGVvZiBlP2U6MTAwO2lmKG48PTApcmV0dXJuIHRoaXM7Y29uc3Qgcj17dGltZXN0YW1wOk0oKSwuLi50fSxvPXRoaXMuaztyZXR1cm4gby5wdXNoKHIpLHRoaXMuaz1vLmxlbmd0aD5uP28uc2xpY2UoLW4pOm8sdGhpcy5KKCksdGhpc31nZXRMYXN0QnJlYWRjcnVtYigpe3JldHVybiB0aGlzLmtbdGhpcy5rLmxlbmd0aC0xXX1jbGVhckJyZWFkY3J1bWJzKCl7cmV0dXJuIHRoaXMuaz1bXSx0aGlzLkooKSx0aGlzfWFkZEF0dGFjaG1lbnQodCl7cmV0dXJuIHRoaXMuQy5wdXNoKHQpLHRoaXN9Y2xlYXJBdHRhY2htZW50cygpe3JldHVybiB0aGlzLkM9W10sdGhpc31nZXRTY29wZURhdGEoKXtyZXR1cm57YnJlYWRjcnVtYnM6dGhpcy5rLGF0dGFjaG1lbnRzOnRoaXMuQyxjb250ZXh0czp0aGlzLmosdGFnczp0aGlzLlQsZXh0cmE6dGhpcy5PLHVzZXI6dGhpcy5ELGxldmVsOnRoaXMuSSxmaW5nZXJwcmludDp0aGlzLk18fFtdLGV2ZW50UHJvY2Vzc29yczp0aGlzLk4scHJvcGFnYXRpb25Db250ZXh0OnRoaXMuQSxzZGtQcm9jZXNzaW5nTWV0YWRhdGE6dGhpcy5SLHRyYW5zYWN0aW9uTmFtZTp0aGlzLlUsc3BhbjpkdCh0aGlzKX19c2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHQpe3JldHVybiB0aGlzLlI9ey4uLnRoaXMuUiwuLi50fSx0aGlzfXNldFByb3BhZ2F0aW9uQ29udGV4dCh0KXtyZXR1cm4gdGhpcy5BPXQsdGhpc31nZXRQcm9wYWdhdGlvbkNvbnRleHQoKXtyZXR1cm4gdGhpcy5BfWNhcHR1cmVFeGNlcHRpb24odCxlKXtjb25zdCBuPWUmJmUuZXZlbnRfaWQ/ZS5ldmVudF9pZDpCKCk7aWYoIXRoaXMuQilyZXR1cm4geC53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgZXhjZXB0aW9uISIpLG47Y29uc3Qgcj1uZXcgRXJyb3IoIlNlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24iKTtyZXR1cm4gdGhpcy5CLmNhcHR1cmVFeGNlcHRpb24odCx7b3JpZ2luYWxFeGNlcHRpb246dCxzeW50aGV0aWNFeGNlcHRpb246ciwuLi5lLGV2ZW50X2lkOm59LHRoaXMpLG59Y2FwdHVyZU1lc3NhZ2UodCxlLG4pe2NvbnN0IHI9biYmbi5ldmVudF9pZD9uLmV2ZW50X2lkOkIoKTtpZighdGhpcy5CKXJldHVybiB4Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBtZXNzYWdlISIpLHI7Y29uc3Qgbz1uZXcgRXJyb3IodCk7cmV0dXJuIHRoaXMuQi5jYXB0dXJlTWVzc2FnZSh0LGUse29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOm8sLi4ubixldmVudF9pZDpyfSx0aGlzKSxyfWNhcHR1cmVFdmVudCh0LGUpe2NvbnN0IG49ZSYmZS5ldmVudF9pZD9lLmV2ZW50X2lkOkIoKTtyZXR1cm4gdGhpcy5CPyh0aGlzLkIuY2FwdHVyZUV2ZW50KHQsey4uLmUsZXZlbnRfaWQ6bn0sdGhpcyksbik6KHgud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV2ZW50ISIpLG4pfUooKXt0aGlzLl98fCh0aGlzLl89ITAsdGhpcy5TLmZvckVhY2goKHQ9Pnt0KHRoaXMpfSkpLHRoaXMuXz0hMSl9fWNvbnN0IGd0PW10O2NsYXNzIHl0e2NvbnN0cnVjdG9yKHQsZSl7bGV0IG4scjtuPXR8fG5ldyBndCxyPWV8fG5ldyBndCx0aGlzLkg9W3tzY29wZTpufV0sdGhpcy5XPXJ9d2l0aFNjb3BlKHQpe2NvbnN0IGU9dGhpcy5ZKCk7bGV0IG47dHJ5e249dChlKX1jYXRjaCh0KXt0aHJvdyB0aGlzLnEoKSx0fXJldHVybiBkKG4pP24udGhlbigodD0+KHRoaXMucSgpLHQpKSwodD0+e3Rocm93IHRoaXMucSgpLHR9KSk6KHRoaXMucSgpLG4pfWdldENsaWVudCgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50fWdldFNjb3BlKCl7cmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5zY29wZX1nZXRJc29sYXRpb25TY29wZSgpe3JldHVybiB0aGlzLld9Z2V0U3RhY2soKXtyZXR1cm4gdGhpcy5IfWdldFN0YWNrVG9wKCl7cmV0dXJuIHRoaXMuSFt0aGlzLkgubGVuZ3RoLTFdfVkoKXtjb25zdCB0PXRoaXMuZ2V0U2NvcGUoKS5jbG9uZSgpO3JldHVybiB0aGlzLmdldFN0YWNrKCkucHVzaCh7Y2xpZW50OnRoaXMuZ2V0Q2xpZW50KCksc2NvcGU6dH0pLHR9cSgpe3JldHVybiEodGhpcy5nZXRTdGFjaygpLmxlbmd0aDw9MSkmJiEhdGhpcy5nZXRTdGFjaygpLnBvcCgpfX1mdW5jdGlvbiBidCgpe2NvbnN0IHQ9YXQodXQoKSk7cmV0dXJuIHQuaHVifHwodC5odWI9bmV3IHl0KHkoImRlZmF1bHRDdXJyZW50U2NvcGUiLCgoKT0+bmV3IGd0KSkseSgiZGVmYXVsdElzb2xhdGlvblNjb3BlIiwoKCk9Pm5ldyBndCkpKSksdC5odWJ9ZnVuY3Rpb24gdnQodCl7cmV0dXJuIGJ0KCkud2l0aFNjb3BlKHQpfWZ1bmN0aW9uIF90KHQsZSl7Y29uc3Qgbj1idCgpO3JldHVybiBuLndpdGhTY29wZSgoKCk9PihuLmdldFN0YWNrVG9wKCkuc2NvcGU9dCxlKHQpKSkpfWZ1bmN0aW9uIHd0KHQpe3JldHVybiBidCgpLndpdGhTY29wZSgoKCk9PnQoYnQoKS5nZXRJc29sYXRpb25TY29wZSgpKSkpfWZ1bmN0aW9uIFN0KHQpe2NvbnN0IGU9YXQodCk7cmV0dXJuIGUuYWNzP2UuYWNzOnt3aXRoSXNvbGF0aW9uU2NvcGU6d3Qsd2l0aFNjb3BlOnZ0LHdpdGhTZXRTY29wZTpfdCx3aXRoU2V0SXNvbGF0aW9uU2NvcGU6KHQsZSk9Pnd0KGUpLGdldEN1cnJlbnRTY29wZTooKT0+YnQoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5idCgpLmdldElzb2xhdGlvblNjb3BlKCl9fWZ1bmN0aW9uICR0KCl7cmV0dXJuIFN0KHV0KCkpLmdldEN1cnJlbnRTY29wZSgpLmdldENsaWVudCgpfWNvbnN0IEV0PSJzZW50cnkuc291cmNlIix4dD0ic2VudHJ5LnNhbXBsZV9yYXRlIixOdD0ic2VudHJ5Lm9wIixrdD0ic2VudHJ5Lm9yaWdpbiIsQ3Q9MCxEdD0xLFR0PTE7ZnVuY3Rpb24gT3QodCl7Y29uc3R7c3BhbklkOmUsdHJhY2VJZDpufT10LnNwYW5Db250ZXh0KCkse3BhcmVudF9zcGFuX2lkOnJ9PUF0KHQpO3JldHVybiBPKHtwYXJlbnRfc3Bhbl9pZDpyLHNwYW5faWQ6ZSx0cmFjZV9pZDpufSl9ZnVuY3Rpb24ganQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P1J0KHQpOkFycmF5LmlzQXJyYXkodCk/dFswXSt0WzFdLzFlOTp0IGluc3RhbmNlb2YgRGF0ZT9SdCh0LmdldFRpbWUoKSk6TCgpfWZ1bmN0aW9uIFJ0KHQpe3JldHVybiB0Pjk5OTk5OTk5OTk/dC8xZTM6dH1mdW5jdGlvbiBBdCh0KXtpZihmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRTcGFuSlNPTn0odCkpcmV0dXJuIHQuZ2V0U3BhbkpTT04oKTt0cnl7Y29uc3R7c3BhbklkOmUsdHJhY2VJZDpufT10LnNwYW5Db250ZXh0KCk7aWYoZnVuY3Rpb24odCl7Y29uc3QgZT10O3JldHVybiEhKGUuYXR0cmlidXRlcyYmZS5zdGFydFRpbWUmJmUubmFtZSYmZS5lbmRUaW1lJiZlLnN0YXR1cyl9KHQpKXtjb25zdHthdHRyaWJ1dGVzOnIsc3RhcnRUaW1lOm8sbmFtZTpzLGVuZFRpbWU6aSxwYXJlbnRTcGFuSWQ6YyxzdGF0dXM6dX09dDtyZXR1cm4gTyh7c3Bhbl9pZDplLHRyYWNlX2lkOm4sZGF0YTpyLGRlc2NyaXB0aW9uOnMscGFyZW50X3NwYW5faWQ6YyxzdGFydF90aW1lc3RhbXA6anQobyksdGltZXN0YW1wOmp0KGkpfHx2b2lkIDAsc3RhdHVzOkl0KHUpLG9wOnJbTnRdLG9yaWdpbjpyW2t0XSxGOnZvaWQgMH0pfXJldHVybntzcGFuX2lkOmUsdHJhY2VfaWQ6bn19Y2F0Y2godCl7cmV0dXJue319fWZ1bmN0aW9uIEl0KHQpe2lmKHQmJnQuY29kZSE9PUN0KXJldHVybiB0LmNvZGU9PT1EdD8ib2siOnQubWVzc2FnZXx8InVua25vd25fZXJyb3IifWNvbnN0IFB0PSJfc2VudHJ5Um9vdFNwYW4iO2Z1bmN0aW9uIFV0KHQpe3JldHVybiB0W1B0XXx8dH1jb25zdCBNdD0icHJvZHVjdGlvbiIsTHQ9Il9mcm96ZW5Ec2MiO2Z1bmN0aW9uIEJ0KHQpe2NvbnN0IGU9JHQoKTtpZighZSlyZXR1cm57fTtjb25zdCBuPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1lLmdldE9wdGlvbnMoKSx7cHVibGljS2V5OnJ9PWUuZ2V0RHNuKCl8fHt9LG89Tyh7ZW52aXJvbm1lbnQ6bi5lbnZpcm9ubWVudHx8TXQscmVsZWFzZTpuLnJlbGVhc2UscHVibGljX2tleTpyLHRyYWNlX2lkOnR9KTtyZXR1cm4gZS5lbWl0KCJjcmVhdGVEc2MiLG8pLG99KEF0KHQpLnRyYWNlX2lkfHwiIixlKSxyPVV0KHQpO2lmKCFyKXJldHVybiBuO2NvbnN0IG89cltMdF07aWYobylyZXR1cm4gbztjb25zdCBzPUF0KHIpLGk9cy5kYXRhfHx7fSxjPWlbeHRdO251bGwhPWMmJihuLnNhbXBsZV9yYXRlPWAke2N9YCk7Y29uc3QgdT1pW0V0XTtyZXR1cm4gdSYmInVybCIhPT11JiYobi50cmFuc2FjdGlvbj1zLmRlc2NyaXB0aW9uKSxuLnNhbXBsZWQ9U3RyaW5nKGZ1bmN0aW9uKHQpe2NvbnN0e3RyYWNlRmxhZ3M6ZX09dC5zcGFuQ29udGV4dCgpO3JldHVybiBlPT09VHR9KHIpKSxlLmVtaXQoImNyZWF0ZURzYyIsbiksbn1mdW5jdGlvbiBHdCh0LGUsbixyKXtjb25zdCBvPXJ0KG4pLHM9dC50eXBlJiYicmVwbGF5X2V2ZW50IiE9PXQudHlwZT90LnR5cGU6ImV2ZW50IjshZnVuY3Rpb24odCxlKXtlJiYodC5zZGs9dC5zZGt8fHt9LHQuc2RrLm5hbWU9dC5zZGsubmFtZXx8ZS5uYW1lLHQuc2RrLnZlcnNpb249dC5zZGsudmVyc2lvbnx8ZS52ZXJzaW9uLHQuc2RrLmludGVncmF0aW9ucz1bLi4udC5zZGsuaW50ZWdyYXRpb25zfHxbXSwuLi5lLmludGVncmF0aW9uc3x8W11dLHQuc2RrLnBhY2thZ2VzPVsuLi50LnNkay5wYWNrYWdlc3x8W10sLi4uZS5wYWNrYWdlc3x8W11dKX0odCxuJiZuLnNkayk7Y29uc3QgaT1mdW5jdGlvbih0LGUsbixyKXtjb25zdCBvPXQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhJiZ0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YS5keW5hbWljU2FtcGxpbmdDb250ZXh0O3JldHVybntldmVudF9pZDp0LmV2ZW50X2lkLHNlbnRfYXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLC4uLmUmJntzZGs6ZX0sLi4uISFuJiZyJiZ7ZHNuOk4ocil9LC4uLm8mJnt0cmFjZTpPKHsuLi5vfSl9fX0odCxvLHIsZSk7ZGVsZXRlIHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhO3JldHVybiBaKGksW1t7dHlwZTpzfSx0XV0pfWNvbnN0IEp0PSJfX1NFTlRSWV9TVVBQUkVTU19UUkFDSU5HX18iO2Z1bmN0aW9uIHp0KHQpe2NvbnN0IGU9U3QodXQoKSk7cmV0dXJuIGUuc3VwcHJlc3NUcmFjaW5nP2Uuc3VwcHJlc3NUcmFjaW5nKHQpOmZ1bmN0aW9uKC4uLnQpe2NvbnN0IGU9U3QodXQoKSk7aWYoMj09PXQubGVuZ3RoKXtjb25zdFtuLHJdPXQ7cmV0dXJuIG4/ZS53aXRoU2V0U2NvcGUobixyKTplLndpdGhTY29wZShyKX1yZXR1cm4gZS53aXRoU2NvcGUodFswXSl9KChlPT4oZS5zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEoe1tKdF06ITB9KSx0KCkpKSl9ZnVuY3Rpb24gSHQodCxlKXtjb25zdHtmaW5nZXJwcmludDpuLHNwYW46cixicmVhZGNydW1iczpvLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTpzfT1lOyFmdW5jdGlvbih0LGUpe2NvbnN0e2V4dHJhOm4sdGFnczpyLHVzZXI6byxjb250ZXh0czpzLGxldmVsOmksdHJhbnNhY3Rpb25OYW1lOmN9PWUsdT1PKG4pO3UmJk9iamVjdC5rZXlzKHUpLmxlbmd0aCYmKHQuZXh0cmE9ey4uLnUsLi4udC5leHRyYX0pO2NvbnN0IGE9TyhyKTthJiZPYmplY3Qua2V5cyhhKS5sZW5ndGgmJih0LnRhZ3M9ey4uLmEsLi4udC50YWdzfSk7Y29uc3QgZj1PKG8pO2YmJk9iamVjdC5rZXlzKGYpLmxlbmd0aCYmKHQudXNlcj17Li4uZiwuLi50LnVzZXJ9KTtjb25zdCBoPU8ocyk7aCYmT2JqZWN0LmtleXMoaCkubGVuZ3RoJiYodC5jb250ZXh0cz17Li4uaCwuLi50LmNvbnRleHRzfSk7aSYmKHQubGV2ZWw9aSk7YyYmInRyYW5zYWN0aW9uIiE9PXQudHlwZSYmKHQudHJhbnNhY3Rpb249Yyl9KHQsZSksciYmZnVuY3Rpb24odCxlKXt0LmNvbnRleHRzPXt0cmFjZTpPdChlKSwuLi50LmNvbnRleHRzfSx0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT17ZHluYW1pY1NhbXBsaW5nQ29udGV4dDpCdChlKSwuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YX07Y29uc3Qgbj1VdChlKSxyPUF0KG4pLmRlc2NyaXB0aW9uO3ImJiF0LnRyYW5zYWN0aW9uJiYidHJhbnNhY3Rpb24iPT09dC50eXBlJiYodC50cmFuc2FjdGlvbj1yKX0odCxyKSxmdW5jdGlvbih0LGUpe3QuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludD9mdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Olt0XX0odC5maW5nZXJwcmludCk6W10sZSYmKHQuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludC5jb25jYXQoZSkpO3QuZmluZ2VycHJpbnQmJiF0LmZpbmdlcnByaW50Lmxlbmd0aCYmZGVsZXRlIHQuZmluZ2VycHJpbnR9KHQsbiksZnVuY3Rpb24odCxlKXtjb25zdCBuPVsuLi50LmJyZWFkY3J1bWJzfHxbXSwuLi5lXTt0LmJyZWFkY3J1bWJzPW4ubGVuZ3RoP246dm9pZCAwfSh0LG8pLGZ1bmN0aW9uKHQsZSl7dC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9ey4uLnQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhLC4uLmV9fSh0LHMpfWNvbnN0IFd0PSI3IjtmdW5jdGlvbiBZdCh0LGUpe3JldHVybiBuPXtzZW50cnlfa2V5OnQucHVibGljS2V5LHNlbnRyeV92ZXJzaW9uOld0LC4uLmUmJntzZW50cnlfY2xpZW50OmAke2UubmFtZX0vJHtlLnZlcnNpb259YH19LE9iamVjdC5rZXlzKG4pLm1hcCgodD0+YCR7ZW5jb2RlVVJJQ29tcG9uZW50KHQpfT0ke2VuY29kZVVSSUNvbXBvbmVudChuW3RdKX1gKSkuam9pbigiJiIpO3ZhciBufWNvbnN0IHF0PTY0O2Z1bmN0aW9uIEZ0KHQsZSxuPUsodC5idWZmZXJTaXplfHxxdCkpe2xldCByPXt9O3JldHVybntzZW5kOmZ1bmN0aW9uKG8pe2NvbnN0IHM9W107aWYoUShvLCgoZSxuKT0+e2NvbnN0IG89bnQobik7aWYoZnVuY3Rpb24odCxlLG49RGF0ZS5ub3coKSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV18fHQuYWxsfHwwfSh0LGUpPm59KHIsbykpe2NvbnN0IHI9S3QoZSxuKTt0LnJlY29yZERyb3BwZWRFdmVudCgicmF0ZWxpbWl0X2JhY2tvZmYiLG8scil9ZWxzZSBzLnB1c2goZSl9KSksMD09PXMubGVuZ3RoKXJldHVybiBxKHt9KTtjb25zdCBpPVoob1swXSxzKSxjPWU9PntRKGksKChuLHIpPT57Y29uc3Qgbz1LdChuLHIpO3QucmVjb3JkRHJvcHBlZEV2ZW50KGUsbnQociksbyl9KSl9O3JldHVybiBuLmFkZCgoKCk9PmUoe2JvZHk6dHQoaSl9KS50aGVuKCh0PT4odm9pZCAwIT09dC5zdGF0dXNDb2RlJiYodC5zdGF0dXNDb2RlPDIwMHx8dC5zdGF0dXNDb2RlPj0zMDApJiZjdCYmeC53YXJuKGBTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgJHt0LnN0YXR1c0NvZGV9IHRvIHNlbnQgZXZlbnQuYCkscj1zdChyLHQpLHQpKSwodD0+e3Rocm93IGMoIm5ldHdvcmtfZXJyb3IiKSx0fSkpKSkudGhlbigodD0+dCksKHQ9PntpZih0IGluc3RhbmNlb2YgaylyZXR1cm4gY3QmJnguZXJyb3IoIlNraXBwZWQgc2VuZGluZyBldmVudCBiZWNhdXNlIGJ1ZmZlciBpcyBmdWxsLiIpLGMoInF1ZXVlX292ZXJmbG93IikscSh7fSk7dGhyb3cgdH0pKX0sZmx1c2g6dD0+bi5kcmFpbih0KX19ZnVuY3Rpb24gS3QodCxlKXtpZigiZXZlbnQiPT09ZXx8InRyYW5zYWN0aW9uIj09PWUpcmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dFsxXTp2b2lkIDB9Y29uc3QgVnQ9U3ltYm9sKCJBZ2VudEJhc2VJbnRlcm5hbFN0YXRlIik7Y2xhc3MgWnQgZXh0ZW5kcyBzLkFnZW50e1tWdF07b3B0aW9ucztrZWVwQWxpdmU7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpc1tWdF09e319aXNTZWN1cmVFbmRwb2ludCh0KXtpZih0KXtpZigiYm9vbGVhbiI9PXR5cGVvZiB0LnNlY3VyZUVuZHBvaW50KXJldHVybiB0LnNlY3VyZUVuZHBvaW50O2lmKCJzdHJpbmciPT10eXBlb2YgdC5wcm90b2NvbClyZXR1cm4iaHR0cHM6Ij09PXQucHJvdG9jb2x9Y29uc3R7c3RhY2s6ZX09bmV3IEVycm9yO3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5zcGxpdCgiXG4iKS5zb21lKCh0PT4tMSE9PXQuaW5kZXhPZigiKGh0dHBzLmpzOiIpfHwtMSE9PXQuaW5kZXhPZigibm9kZTpodHRwczoiKSkpfWNyZWF0ZVNvY2tldCh0LGUsbil7Y29uc3Qgcj17Li4uZSxzZWN1cmVFbmRwb2ludDp0aGlzLmlzU2VjdXJlRW5kcG9pbnQoZSl9O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT50aGlzLmNvbm5lY3QodCxyKSkpLnRoZW4oKG89PntpZihvIGluc3RhbmNlb2Ygcy5BZ2VudClyZXR1cm4gby5hZGRSZXF1ZXN0KHQscik7dGhpc1tWdF0uY3VycmVudFNvY2tldD1vLHN1cGVyLmNyZWF0ZVNvY2tldCh0LGUsbil9KSxuKX1jcmVhdGVDb25uZWN0aW9uKCl7Y29uc3QgdD10aGlzW1Z0XS5jdXJyZW50U29ja2V0O2lmKHRoaXNbVnRdLmN1cnJlbnRTb2NrZXQ9dm9pZCAwLCF0KXRocm93IG5ldyBFcnJvcigiTm8gc29ja2V0IHdhcyByZXR1cm5lZCBpbiB0aGUgYGNvbm5lY3QoKWAgZnVuY3Rpb24iKTtyZXR1cm4gdH1nZXQgZGVmYXVsdFBvcnQoKXtyZXR1cm4gdGhpc1tWdF0uZGVmYXVsdFBvcnQ/PygiaHR0cHM6Ij09PXRoaXMucHJvdG9jb2w/NDQzOjgwKX1zZXQgZGVmYXVsdFBvcnQodCl7dGhpc1tWdF0mJih0aGlzW1Z0XS5kZWZhdWx0UG9ydD10KX1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpc1tWdF0ucHJvdG9jb2w/Pyh0aGlzLmlzU2VjdXJlRW5kcG9pbnQoKT8iaHR0cHM6IjoiaHR0cDoiKX1zZXQgcHJvdG9jb2wodCl7dGhpc1tWdF0mJih0aGlzW1Z0XS5wcm90b2NvbD10KX19ZnVuY3Rpb24gUXQoLi4udCl7eC5sb2coIltodHRwcy1wcm94eS1hZ2VudDpwYXJzZS1wcm94eS1yZXNwb25zZV0iLC4uLnQpfWZ1bmN0aW9uIFh0KHQpe3JldHVybiBuZXcgUHJvbWlzZSgoKGUsbik9PntsZXQgcj0wO2NvbnN0IG89W107ZnVuY3Rpb24gcygpe2NvbnN0IGM9dC5yZWFkKCk7Yz9mdW5jdGlvbihjKXtvLnB1c2goYykscis9Yy5sZW5ndGg7Y29uc3QgdT1CdWZmZXIuY29uY2F0KG8sciksYT11LmluZGV4T2YoIlxyXG5cclxuIik7aWYoLTE9PT1hKXJldHVybiBRdCgiaGF2ZSBub3QgcmVjZWl2ZWQgZW5kIG9mIEhUVFAgaGVhZGVycyB5ZXQuLi4iKSx2b2lkIHMoKTtjb25zdCBmPXUuc2xpY2UoMCxhKS50b1N0cmluZygiYXNjaWkiKS5zcGxpdCgiXHJcbiIpLGg9Zi5zaGlmdCgpO2lmKCFoKXJldHVybiB0LmRlc3Ryb3koKSxuKG5ldyBFcnJvcigiTm8gaGVhZGVyIHJlY2VpdmVkIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZSIpKTtjb25zdCBwPWguc3BsaXQoIiAiKSxsPStwWzFdLGQ9cC5zbGljZSgyKS5qb2luKCIgIiksbT17fTtmb3IoY29uc3QgZSBvZiBmKXtpZighZSljb250aW51ZTtjb25zdCByPWUuaW5kZXhPZigiOiIpO2lmKC0xPT09cilyZXR1cm4gdC5kZXN0cm95KCksbihuZXcgRXJyb3IoYEludmFsaWQgaGVhZGVyIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZTogIiR7ZX0iYCkpO2NvbnN0IG89ZS5zbGljZSgwLHIpLnRvTG93ZXJDYXNlKCkscz1lLnNsaWNlKHIrMSkudHJpbVN0YXJ0KCksaT1tW29dOyJzdHJpbmciPT10eXBlb2YgaT9tW29dPVtpLHNdOkFycmF5LmlzQXJyYXkoaSk/aS5wdXNoKHMpOm1bb109c31RdCgiZ290IHByb3h5IHNlcnZlciByZXNwb25zZTogJW8gJW8iLGgsbSksaSgpLGUoe2Nvbm5lY3Q6e3N0YXR1c0NvZGU6bCxzdGF0dXNUZXh0OmQsaGVhZGVyczptfSxidWZmZXJlZDp1fSl9KGMpOnQub25jZSgicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIscyl9ZnVuY3Rpb24gYygpe2koKSxRdCgib25lbmQiKSxuKG5ldyBFcnJvcigiUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UiKSl9ZnVuY3Rpb24gdSh0KXtpKCksUXQoIm9uZXJyb3IgJW8iLHQpLG4odCl9dC5vbigiZXJyb3IiLHUpLHQub24oImVuZCIsYykscygpfSkpfWZ1bmN0aW9uIHRlKC4uLnQpe3gubG9nKCJbaHR0cHMtcHJveHktYWdlbnRdIiwuLi50KX1jbGFzcyBlZSBleHRlbmRzIFp0e3N0YXRpYyBwcm90b2NvbHM9WyJodHRwIiwiaHR0cHMiXTtwcm94eTtwcm94eUhlYWRlcnM7Y29ubmVjdE9wdHM7Y29uc3RydWN0b3IodCxlKXtzdXBlcihlKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5wcm94eT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFVSTCh0KTp0LHRoaXMucHJveHlIZWFkZXJzPWU/LmhlYWRlcnM/P3t9LHRlKCJDcmVhdGluZyBuZXcgSHR0cHNQcm94eUFnZW50IGluc3RhbmNlOiAlbyIsdGhpcy5wcm94eS5ocmVmKTtjb25zdCBuPSh0aGlzLnByb3h5Lmhvc3RuYW1lfHx0aGlzLnByb3h5Lmhvc3QpLnJlcGxhY2UoL15cW3xcXSQvZywiIikscj10aGlzLnByb3h5LnBvcnQ/cGFyc2VJbnQodGhpcy5wcm94eS5wb3J0LDEwKToiaHR0cHM6Ij09PXRoaXMucHJveHkucHJvdG9jb2w/NDQzOjgwO3RoaXMuY29ubmVjdE9wdHM9e0FMUE5Qcm90b2NvbHM6WyJodHRwLzEuMSJdLC4uLmU/cmUoZSwiaGVhZGVycyIpOm51bGwsaG9zdDpuLHBvcnQ6cn19YXN5bmMgY29ubmVjdCh0LGUpe2NvbnN0e3Byb3h5Om59PXRoaXM7aWYoIWUuaG9zdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyAiaG9zdCIgcHJvdmlkZWQnKTtsZXQgcjtpZigiaHR0cHM6Ij09PW4ucHJvdG9jb2wpe3RlKCJDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCB0PXRoaXMuY29ubmVjdE9wdHMuc2VydmVybmFtZXx8dGhpcy5jb25uZWN0T3B0cy5ob3N0O3I9Zi5jb25uZWN0KHsuLi50aGlzLmNvbm5lY3RPcHRzLHNlcnZlcm5hbWU6dCYmYS5pc0lQKHQpP3ZvaWQgMDp0fSl9ZWxzZSB0ZSgiQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cykscj1hLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7Y29uc3Qgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm94eUhlYWRlcnM/dGhpcy5wcm94eUhlYWRlcnMoKTp7Li4udGhpcy5wcm94eUhlYWRlcnN9LHM9YS5pc0lQdjYoZS5ob3N0KT9gWyR7ZS5ob3N0fV1gOmUuaG9zdDtsZXQgaT1gQ09OTkVDVCAke3N9OiR7ZS5wb3J0fSBIVFRQLzEuMVxyXG5gO2lmKG4udXNlcm5hbWV8fG4ucGFzc3dvcmQpe2NvbnN0IHQ9YCR7ZGVjb2RlVVJJQ29tcG9uZW50KG4udXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChuLnBhc3N3b3JkKX1gO29bIlByb3h5LUF1dGhvcml6YXRpb24iXT1gQmFzaWMgJHtCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9YH1vLkhvc3Q9YCR7c306JHtlLnBvcnR9YCxvWyJQcm94eS1Db25uZWN0aW9uIl18fChvWyJQcm94eS1Db25uZWN0aW9uIl09dGhpcy5rZWVwQWxpdmU/IktlZXAtQWxpdmUiOiJjbG9zZSIpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKG8pKWkrPWAke3R9OiAke29bdF19XHJcbmA7Y29uc3QgYz1YdChyKTtyLndyaXRlKGAke2l9XHJcbmApO2NvbnN0e2Nvbm5lY3Q6dSxidWZmZXJlZDpofT1hd2FpdCBjO2lmKHQuZW1pdCgicHJveHlDb25uZWN0Iix1KSx0aGlzLmVtaXQoInByb3h5Q29ubmVjdCIsdSx0KSwyMDA9PT11LnN0YXR1c0NvZGUpe2lmKHQub25jZSgic29ja2V0IixuZSksZS5zZWN1cmVFbmRwb2ludCl7dGUoIlVwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMiKTtjb25zdCB0PWUuc2VydmVybmFtZXx8ZS5ob3N0O3JldHVybiBmLmNvbm5lY3Qoey4uLnJlKGUsImhvc3QiLCJwYXRoIiwicG9ydCIpLHNvY2tldDpyLHNlcnZlcm5hbWU6YS5pc0lQKHQpP3ZvaWQgMDp0fSl9cmV0dXJuIHJ9ci5kZXN0cm95KCk7Y29uc3QgcD1uZXcgYS5Tb2NrZXQoe3dyaXRhYmxlOiExfSk7cmV0dXJuIHAucmVhZGFibGU9ITAsdC5vbmNlKCJzb2NrZXQiLCh0PT57dGUoIlJlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0IiksdC5wdXNoKGgpLHQucHVzaChudWxsKX0pKSxwfX1mdW5jdGlvbiBuZSh0KXt0LnJlc3VtZSgpfWZ1bmN0aW9uIHJlKHQsLi4uZSl7Y29uc3Qgbj17fTtsZXQgcjtmb3IociBpbiB0KWUuaW5jbHVkZXMocil8fChuW3JdPXRbcl0pO3JldHVybiBufWNvbnN0IG9lPTMyNzY4O2Z1bmN0aW9uIHNlKHQpe3JldHVybiB0LnJlcGxhY2UoL15bQS1aXTovLCIiKS5yZXBsYWNlKC9cXC9nLCIvIil9Y29uc3QgaWU9bjtsZXQgY2UsdWU9ITE7ZnVuY3Rpb24gYWUodCl7aWUuZGVidWcmJmNvbnNvbGUubG9nKGBbQU5SIFdvcmtlcl0gJHt0fWApfXZhciBmZSxoZSxwZTtjb25zdCBsZT1mdW5jdGlvbih0KXtsZXQgZTt0cnl7ZT1uZXcgVVJMKHQudXJsKX1jYXRjaChlKXtyZXR1cm4gRSgoKCk9Pntjb25zb2xlLndhcm4oIltAc2VudHJ5L25vZGVdOiBJbnZhbGlkIGRzbiBvciB0dW5uZWwgb3B0aW9uLCB3aWxsIG5vdCBzZW5kIGFueSBldmVudHMuIFRoZSB0dW5uZWwgb3B0aW9uIG11c3QgYmUgYSBmdWxsIFVSTCB3aGVuIHVzZWQuIil9KSksRnQodCwoKCk9PlByb21pc2UucmVzb2x2ZSh7fSkpKX1jb25zdCBuPSJodHRwczoiPT09ZS5wcm90b2NvbCxyPWZ1bmN0aW9uKHQsZSl7Y29uc3R7bm9fcHJveHk6bn09cHJvY2Vzcy5lbnY7cmV0dXJuIG4mJm4uc3BsaXQoIiwiKS5zb21lKChlPT50Lmhvc3QuZW5kc1dpdGgoZSl8fHQuaG9zdG5hbWUuZW5kc1dpdGgoZSkpKT92b2lkIDA6ZX0oZSx0LnByb3h5fHwobj9wcm9jZXNzLmVudi5odHRwc19wcm94eTp2b2lkIDApfHxwcm9jZXNzLmVudi5odHRwX3Byb3h5KSxvPW4/aTpzLGE9dm9pZCAwIT09dC5rZWVwQWxpdmUmJnQua2VlcEFsaXZlLGY9cj9uZXcgZWUocik6bmV3IG8uQWdlbnQoe2tlZXBBbGl2ZTphLG1heFNvY2tldHM6MzAsdGltZW91dDoyZTN9KTtyZXR1cm4genQoKCgpPT57Y29uc3QgZT1mdW5jdGlvbih0LGUsbil7Y29uc3R7aG9zdG5hbWU6cixwYXRobmFtZTpvLHBvcnQ6cyxwcm90b2NvbDppLHNlYXJjaDphfT1uZXcgVVJMKHQudXJsKTtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIG5ldyBQcm9taXNlKCgoaCxwKT0+e2xldCBsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyh7cmVhZCgpe3RoaXMucHVzaCh0KSx0aGlzLnB1c2gobnVsbCl9fSl9KGYuYm9keSk7Y29uc3QgZD17Li4udC5oZWFkZXJzfTtmLmJvZHkubGVuZ3RoPm9lJiYoZFsiY29udGVudC1lbmNvZGluZyJdPSJnemlwIixsPWwucGlwZSh1KCkpKTtjb25zdCBtPWUucmVxdWVzdCh7bWV0aG9kOiJQT1NUIixhZ2VudDpuLGhlYWRlcnM6ZCxob3N0bmFtZTpyLHBhdGg6YCR7b30ke2F9YCxwb3J0OnMscHJvdG9jb2w6aSxjYTp0LmNhQ2VydHN9LCh0PT57dC5vbigiZGF0YSIsKCgpPT57fSkpLHQub24oImVuZCIsKCgpPT57fSkpLHQuc2V0RW5jb2RpbmcoInV0ZjgiKTtjb25zdCBlPXQuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXT8/bnVsbCxuPXQuaGVhZGVyc1sieC1zZW50cnktcmF0ZS1saW1pdHMiXT8/bnVsbDtoKHtzdGF0dXNDb2RlOnQuc3RhdHVzQ29kZSxoZWFkZXJzOnsicmV0cnktYWZ0ZXIiOmUsIngtc2VudHJ5LXJhdGUtbGltaXRzIjpBcnJheS5pc0FycmF5KG4pP25bMF06bn19KX0pKTttLm9uKCJlcnJvciIscCksbC5waXBlKG0pfSkpfX0odCx0Lmh0dHBNb2R1bGU/P28sZik7cmV0dXJuIEZ0KHQsZSl9KSl9KHt1cmw6KGZlPWllLmRzbixoZT1pZS50dW5uZWwscGU9aWUuc2RrTWV0YWRhdGEuc2RrLGhlfHxgJHtmdW5jdGlvbih0KXtyZXR1cm5gJHtmdW5jdGlvbih0KXtjb25zdCBlPXQucHJvdG9jb2w/YCR7dC5wcm90b2NvbH06YDoiIixuPXQucG9ydD9gOiR7dC5wb3J0fWA6IiI7cmV0dXJuYCR7ZX0vLyR7dC5ob3N0fSR7bn0ke3QucGF0aD9gLyR7dC5wYXRofWA6IiJ9L2FwaS9gfSh0KX0ke3QucHJvamVjdElkfS9lbnZlbG9wZS9gfShmZSl9PyR7WXQoZmUscGUpfWApLHJlY29yZERyb3BwZWRFdmVudDooKT0+e319KTthc3luYyBmdW5jdGlvbiBkZSgpe2lmKGNlKXthZSgiU2VuZGluZyBhYm5vcm1hbCBzZXNzaW9uIiksaHQoY2Use3N0YXR1czoiYWJub3JtYWwiLGFibm9ybWFsX21lY2hhbmlzbToiYW5yX2ZvcmVncm91bmQifSk7Y29uc3QgdD1mdW5jdGlvbih0LGUsbixyKXtjb25zdCBvPXJ0KG4pO3JldHVybiBaKHtzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5vJiZ7c2RrOm99LC4uLiEhciYmZSYme2RzbjpOKGUpfX0sWyJhZ2dyZWdhdGVzImluIHQ/W3t0eXBlOiJzZXNzaW9ucyJ9LHRdOlt7dHlwZToic2Vzc2lvbiJ9LHQudG9KU09OKCldXSl9KGNlLGllLmRzbixpZS5zZGtNZXRhZGF0YSxpZS50dW5uZWwpO2FlKEpTT04uc3RyaW5naWZ5KHQpKSxhd2FpdCBsZS5zZW5kKHQpO3RyeXtlPy5wb3N0TWVzc2FnZSgic2Vzc2lvbi1lbmRlZCIpfWNhdGNoKHQpe319fWZ1bmN0aW9uIG1lKHQpe2lmKCF0KXJldHVybjtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBlPUFycmF5LmZyb20odCk7cmV0dXJuL3NlbnRyeVdyYXBwZWQvLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZlLnBvcCgpLGUucmV2ZXJzZSgpLEkudGVzdChlW2UubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJihlLnBvcCgpLEkudGVzdChlW2UubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJmUucG9wKCkpLGUuc2xpY2UoMCxSKS5tYXAoKHQ9Pih7Li4udCxmaWxlbmFtZTp0LmZpbGVuYW1lfHxlW2UubGVuZ3RoLTFdLmZpbGVuYW1lLGZ1bmN0aW9uOnQuZnVuY3Rpb258fEF9KSkpfSh0KTtpZihpZS5hcHBSb290UGF0aClmb3IoY29uc3QgdCBvZiBlKXQuZmlsZW5hbWUmJih0LmZpbGVuYW1lPXoodC5maWxlbmFtZSxpZS5hcHBSb290UGF0aCkpO3JldHVybiBlfWFzeW5jIGZ1bmN0aW9uIGdlKHQsZSl7aWYodWUpcmV0dXJuO3VlPSEwLGF3YWl0IGRlKCksYWUoIlNlbmRpbmcgZXZlbnQiKTtjb25zdCBuPXtldmVudF9pZDpCKCksY29udGV4dHM6aWUuY29udGV4dHMscmVsZWFzZTppZS5yZWxlYXNlLGVudmlyb25tZW50OmllLmVudmlyb25tZW50LGRpc3Q6aWUuZGlzdCxwbGF0Zm9ybToibm9kZSIsbGV2ZWw6ImVycm9yIixleGNlcHRpb246e3ZhbHVlczpbe3R5cGU6IkFwcGxpY2F0aW9uTm90UmVzcG9uZGluZyIsdmFsdWU6YEFwcGxpY2F0aW9uIE5vdCBSZXNwb25kaW5nIGZvciBhdCBsZWFzdCAke2llLmFuclRocmVzaG9sZH0gbXNgLHN0YWNrdHJhY2U6e2ZyYW1lczptZSh0KX0sbWVjaGFuaXNtOnt0eXBlOiJBTlIifX1dfSx0YWdzOmllLnN0YXRpY1RhZ3N9O2UmJmZ1bmN0aW9uKHQsZSl7aWYoSHQodCxlKSwhdC5jb250ZXh0cz8udHJhY2Upe2NvbnN0e3RyYWNlSWQ6bixzcGFuSWQ6cixwYXJlbnRTcGFuSWQ6b309ZS5wcm9wYWdhdGlvbkNvbnRleHQ7dC5jb250ZXh0cz17dHJhY2U6e3RyYWNlX2lkOm4sc3Bhbl9pZDpyLHBhcmVudF9zcGFuX2lkOm99LC4uLnQuY29udGV4dHN9fX0obixlKTtjb25zdCByPUd0KG4saWUuZHNuLGllLnNka01ldGFkYXRhLGllLnR1bm5lbCk7YWUoSlNPTi5zdHJpbmdpZnkocikpLGF3YWl0IGxlLnNlbmQociksYXdhaXQgbGUuZmx1c2goMmUzKSxzZXRUaW1lb3V0KCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0pLDVlMyl9bGV0IHllO2lmKGFlKCJTdGFydGVkIiksaWUuY2FwdHVyZVN0YWNrVHJhY2Upe2FlKCJDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIik7Y29uc3QgZT1uZXcgdDtlLmNvbm5lY3RUb01haW5UaHJlYWQoKSxhZSgiQ29ubmVjdGVkIHRvIGRlYnVnZ2VyIik7Y29uc3Qgbj1uZXcgTWFwO2Uub24oIkRlYnVnZ2VyLnNjcmlwdFBhcnNlZCIsKHQ9PntuLnNldCh0LnBhcmFtcy5zY3JpcHRJZCx0LnBhcmFtcy51cmwpfSkpLGUub24oIkRlYnVnZ2VyLnBhdXNlZCIsKHQ9PntpZigib3RoZXIiPT09dC5wYXJhbXMucmVhc29uKXRyeXthZSgiRGVidWdnZXIgcGF1c2VkIik7Y29uc3Qgcz1bLi4udC5wYXJhbXMuY2FsbEZyYW1lc10saT1pZS5hcHBSb290UGF0aD9mdW5jdGlvbih0PShwcm9jZXNzLmFyZ3ZbMV0/Vyhwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLGU9IlxcIj09PW8pe2NvbnN0IG49ZT9zZSh0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89ZT9zZSh0KTp0O2xldHtkaXI6cyxiYXNlOmksZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwoaT1pLnNsaWNlKDAsLTEqYy5sZW5ndGgpKSxzfHwocz0iLiIpO2NvbnN0IHU9cy5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKHU+LTEpcmV0dXJuYCR7cy5zbGljZSh1KzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7aX1gO2lmKHMuc3RhcnRzV2l0aChuKSl7bGV0IHQ9cy5zbGljZShuLmxlbmd0aCsxKS5yZXBsYWNlKC9cLy9nLCIuIik7cmV0dXJuIHQmJih0Kz0iOiIpLHQrPWksdH1yZXR1cm4gaX19KGllLmFwcFJvb3RQYXRoKTooKT0+e30sYz1zLm1hcCgodD0+ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9ZT9lLnJlcGxhY2UoL15maWxlOlwvXC8vLCIiKTp2b2lkIDAsbz10LmxvY2F0aW9uLmNvbHVtbk51bWJlcj90LmxvY2F0aW9uLmNvbHVtbk51bWJlcisxOnZvaWQgMCxzPXQubG9jYXRpb24ubGluZU51bWJlcj90LmxvY2F0aW9uLmxpbmVOdW1iZXIrMTp2b2lkIDA7cmV0dXJuIE8oe2ZpbGVuYW1lOnIsbW9kdWxlOm4ociksZnVuY3Rpb246dC5mdW5jdGlvbk5hbWV8fEEsY29sbm86byxsaW5lbm86cyxpbl9hcHA6cj9WKHIpOnZvaWQgMH0pfSh0LG4uZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLGkpKSksdT1zZXRUaW1lb3V0KCgoKT0+e2dlKGMpLnRoZW4obnVsbCwoKCk9PnthZSgiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSkpfSksNWUzKTtlLnBvc3QoIlJ1bnRpbWUuZXZhbHVhdGUiLHtleHByZXNzaW9uOiJnbG9iYWwuX19TRU5UUllfR0VUX1NDT1BFU19fKCk7IixzaWxlbnQ6ITAscmV0dXJuQnlWYWx1ZTohMH0sKCh0LG4pPT57dCYmYWUoYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9biYmbi5yZXN1bHQ/bi5yZXN1bHQudmFsdWU6dm9pZCAwO2UucG9zdCgiRGVidWdnZXIucmVzdW1lIiksZS5wb3N0KCJEZWJ1Z2dlci5kaXNhYmxlIiksZ2UoYyxyKS50aGVuKG51bGwsKCgpPT57YWUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pKX0pKX1jYXRjaCh0KXt0aHJvdyBlLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLGUucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLHR9fSkpLHllPSgpPT57dHJ5e2UucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKCk9PntlLnBvc3QoIkRlYnVnZ2VyLnBhdXNlIil9KSl9Y2F0Y2godCl7fX19Y29uc3R7cG9sbDpiZX09ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz10KCk7bGV0IHM9ITEsaT0hMDtyZXR1cm4gc2V0SW50ZXJ2YWwoKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09cyYmdD5lK24mJihzPSEwLGkmJnIoKSksdDxlK24mJihzPSExKX0pLDIwKSx7cG9sbDooKT0+e28ucmVzZXQoKX0sZW5hYmxlZDp0PT57aT10fX19KChmdW5jdGlvbigpe2xldCB0PXByb2Nlc3MuaHJ0aW1lKCk7cmV0dXJue2dldFRpbWVNczooKT0+e2NvbnN0W2Usbl09cHJvY2Vzcy5ocnRpbWUodCk7cmV0dXJuIE1hdGguZmxvb3IoMWUzKmUrbi8xZTYpfSxyZXNldDooKT0+e3Q9cHJvY2Vzcy5ocnRpbWUoKX19fSksaWUucG9sbEludGVydmFsLGllLmFuclRocmVzaG9sZCwoZnVuY3Rpb24oKXthZSgiV2F0Y2hkb2cgdGltZW91dCIpLHllPyhhZSgiUGF1c2luZyBkZWJ1Z2dlciB0byBjYXB0dXJlIHN0YWNrIHRyYWNlIikseWUoKSk6KGFlKCJDYXB0dXJpbmcgZXZlbnQgd2l0aG91dCBhIHN0YWNrIHRyYWNlIiksZ2UoKS50aGVuKG51bGwsKCgpPT57YWUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZCBvbiB3YXRjaGRvZyB0aW1lb3V0LiIpfSkpKX0pKTtlPy5vbigibWVzc2FnZSIsKHQ9Pnt0LnNlc3Npb24mJihjZT1mdCh0LnNlc3Npb24pKSxiZSgpfSkpOw==';
16
15
 
17
16
  const DEFAULT_INTERVAL = 50;
18
17
  const DEFAULT_HANG_THRESHOLD = 5000;
@@ -148,6 +147,7 @@ async function _startWorker(
148
147
  };
149
148
 
150
149
  if (options.captureStackTrace) {
150
+ const inspector = await import('node:inspector');
151
151
  if (!inspector.url()) {
152
152
  inspector.open(0);
153
153
  }