velocious 1.0.563 → 1.0.565

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 (219) hide show
  1. package/README.md +3 -1
  2. package/build/background-jobs/cron-expression.js +12 -13
  3. package/build/background-jobs/main.js +6 -6
  4. package/build/background-jobs/runner-graceful-shutdown.js +2 -3
  5. package/build/background-jobs/scheduler.js +3 -3
  6. package/build/background-jobs/worker.js +8 -9
  7. package/build/beacon/client.js +3 -4
  8. package/build/database/drivers/sqlite/web-persistence.js +2 -5
  9. package/build/database/pool/async-tracked-multi-connection.js +65 -15
  10. package/build/database/pool/base.js +23 -7
  11. package/build/database/query/index.js +21 -22
  12. package/build/database/query/model-class-query.js +5 -6
  13. package/build/database/record/acts-as-list.js +37 -10
  14. package/build/database/record/attachments/normalize-input.js +9 -10
  15. package/build/database/record/attachments/store.js +2 -2
  16. package/build/database/record/auditing.js +7 -8
  17. package/build/database/record/index.js +4 -5
  18. package/build/environment-handlers/node/cli/commands/generate/base-models.js +4 -12
  19. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  20. package/build/frontend-model-controller.js +49 -56
  21. package/build/frontend-models/base.js +17 -19
  22. package/build/frontend-models/outgoing-event-buffer.js +3 -4
  23. package/build/frontend-models/query.js +40 -44
  24. package/build/frontend-models/resource-definition.js +7 -8
  25. package/build/frontend-models/transport-serialization.js +10 -12
  26. package/build/frontend-models/websocket-channel.js +12 -13
  27. package/build/http-server/client/websocket-session.js +4 -5
  28. package/build/http-server/client-delivery-queue.js +7 -8
  29. package/build/http-server/websocket-event-log-store.js +4 -6
  30. package/build/plugins/sqljs-wasm-route.js +3 -5
  31. package/build/src/background-jobs/cron-expression.d.ts +0 -12
  32. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  33. package/build/src/background-jobs/cron-expression.js +13 -13
  34. package/build/src/background-jobs/main.d.ts.map +1 -1
  35. package/build/src/background-jobs/main.js +7 -7
  36. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +0 -6
  37. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
  38. package/build/src/background-jobs/runner-graceful-shutdown.js +3 -3
  39. package/build/src/background-jobs/scheduler.d.ts +0 -3
  40. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  41. package/build/src/background-jobs/scheduler.js +4 -4
  42. package/build/src/background-jobs/worker.d.ts +0 -8
  43. package/build/src/background-jobs/worker.d.ts.map +1 -1
  44. package/build/src/background-jobs/worker.js +9 -9
  45. package/build/src/beacon/client.d.ts +0 -4
  46. package/build/src/beacon/client.d.ts.map +1 -1
  47. package/build/src/beacon/client.js +4 -4
  48. package/build/src/database/drivers/sqlite/web-persistence.d.ts +0 -14
  49. package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
  50. package/build/src/database/drivers/sqlite/web-persistence.js +3 -3
  51. package/build/src/database/pool/async-tracked-multi-connection.d.ts +29 -1
  52. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  53. package/build/src/database/pool/async-tracked-multi-connection.js +57 -15
  54. package/build/src/database/pool/base.d.ts +53 -4
  55. package/build/src/database/pool/base.d.ts.map +1 -1
  56. package/build/src/database/pool/base.js +23 -6
  57. package/build/src/database/query/index.d.ts +18 -39
  58. package/build/src/database/query/index.d.ts.map +1 -1
  59. package/build/src/database/query/index.js +22 -22
  60. package/build/src/database/query/model-class-query.d.ts +0 -5
  61. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  62. package/build/src/database/query/model-class-query.js +6 -6
  63. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  64. package/build/src/database/record/acts-as-list.js +34 -12
  65. package/build/src/database/record/attachments/normalize-input.d.ts +0 -9
  66. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  67. package/build/src/database/record/attachments/normalize-input.js +10 -10
  68. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  69. package/build/src/database/record/attachments/store.js +2 -2
  70. package/build/src/database/record/auditing.d.ts +17 -24
  71. package/build/src/database/record/auditing.d.ts.map +1 -1
  72. package/build/src/database/record/auditing.js +8 -8
  73. package/build/src/database/record/index.d.ts +4 -4
  74. package/build/src/database/record/index.d.ts.map +1 -1
  75. package/build/src/database/record/index.js +5 -5
  76. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  77. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +5 -13
  78. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +0 -39
  79. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  80. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +2 -2
  81. package/build/src/frontend-model-controller.d.ts +1 -1
  82. package/build/src/frontend-model-controller.d.ts.map +1 -1
  83. package/build/src/frontend-model-controller.js +50 -50
  84. package/build/src/frontend-models/base.d.ts.map +1 -1
  85. package/build/src/frontend-models/base.js +18 -18
  86. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  87. package/build/src/frontend-models/outgoing-event-buffer.js +3 -3
  88. package/build/src/frontend-models/query.d.ts +56 -37
  89. package/build/src/frontend-models/query.d.ts.map +1 -1
  90. package/build/src/frontend-models/query.js +39 -39
  91. package/build/src/frontend-models/resource-definition.d.ts +0 -7
  92. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  93. package/build/src/frontend-models/resource-definition.js +8 -8
  94. package/build/src/frontend-models/transport-serialization.d.ts +0 -10
  95. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  96. package/build/src/frontend-models/transport-serialization.js +11 -11
  97. package/build/src/frontend-models/websocket-channel.d.ts +0 -12
  98. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  99. package/build/src/frontend-models/websocket-channel.js +13 -13
  100. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  101. package/build/src/http-server/client/websocket-session.js +5 -5
  102. package/build/src/http-server/client-delivery-queue.d.ts +7 -7
  103. package/build/src/http-server/client-delivery-queue.d.ts.map +1 -1
  104. package/build/src/http-server/client-delivery-queue.js +8 -8
  105. package/build/src/http-server/websocket-event-log-store.d.ts +0 -14
  106. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  107. package/build/src/http-server/websocket-event-log-store.js +5 -5
  108. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  109. package/build/src/plugins/sqljs-wasm-route.js +4 -4
  110. package/build/src/sync/conflict-strategy.d.ts +0 -15
  111. package/build/src/sync/conflict-strategy.d.ts.map +1 -1
  112. package/build/src/sync/conflict-strategy.js +3 -3
  113. package/build/src/sync/device-identity.d.ts +0 -45
  114. package/build/src/sync/device-identity.d.ts.map +1 -1
  115. package/build/src/sync/device-identity.js +4 -4
  116. package/build/src/sync/local-mutation-log.d.ts +0 -41
  117. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  118. package/build/src/sync/local-mutation-log.js +9 -9
  119. package/build/src/sync/offline-grant.d.ts +0 -26
  120. package/build/src/sync/offline-grant.d.ts.map +1 -1
  121. package/build/src/sync/offline-grant.js +4 -4
  122. package/build/src/sync/peer-mutation-bundle.d.ts +0 -14
  123. package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
  124. package/build/src/sync/peer-mutation-bundle.js +3 -3
  125. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  126. package/build/src/sync/server-change-feed.js +33 -33
  127. package/build/src/sync/sync-api-client.d.ts +0 -9
  128. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  129. package/build/src/sync/sync-api-client.js +2 -2
  130. package/build/src/sync/sync-envelope-replay-service.d.ts +38 -21
  131. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  132. package/build/src/sync/sync-envelope-replay-service.js +18 -18
  133. package/build/src/sync/sync-resource-base.d.ts +0 -7
  134. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  135. package/build/src/sync/sync-resource-base.js +2 -2
  136. package/build/src/sync/sync-scope-store.d.ts +0 -9
  137. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  138. package/build/src/sync/sync-scope-store.js +10 -10
  139. package/build/src/testing/test-filter-parser.d.ts +0 -10
  140. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  141. package/build/src/testing/test-filter-parser.js +11 -11
  142. package/build/src/testing/test-runner.d.ts +25 -91
  143. package/build/src/testing/test-runner.d.ts.map +1 -1
  144. package/build/src/testing/test-runner.js +113 -98
  145. package/build/src/testing/test.d.ts +8 -0
  146. package/build/src/testing/test.d.ts.map +1 -1
  147. package/build/src/testing/test.js +9 -9
  148. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  149. package/build/src/utils/backtrace-cleaner.js +9 -9
  150. package/build/src/utils/model-scope.d.ts +0 -8
  151. package/build/src/utils/model-scope.d.ts.map +1 -1
  152. package/build/src/utils/model-scope.js +3 -3
  153. package/build/src/utils/ransack.d.ts +52 -19
  154. package/build/src/utils/ransack.d.ts.map +1 -1
  155. package/build/src/utils/ransack.js +26 -26
  156. package/build/sync/conflict-strategy.js +3 -6
  157. package/build/sync/device-identity.js +4 -9
  158. package/build/sync/local-mutation-log.js +9 -14
  159. package/build/sync/offline-grant.js +4 -7
  160. package/build/sync/peer-mutation-bundle.js +2 -4
  161. package/build/sync/server-change-feed.js +32 -34
  162. package/build/sync/sync-api-client.js +1 -2
  163. package/build/sync/sync-envelope-replay-service.js +17 -19
  164. package/build/sync/sync-resource-base.js +1 -2
  165. package/build/sync/sync-scope-store.js +9 -10
  166. package/build/testing/test-filter-parser.js +10 -11
  167. package/build/testing/test-runner.js +116 -108
  168. package/build/testing/test.js +8 -9
  169. package/build/utils/backtrace-cleaner.js +8 -9
  170. package/build/utils/model-scope.js +3 -4
  171. package/build/utils/ransack.js +27 -34
  172. package/package.json +2 -1
  173. package/scripts/eslint-rules/typedefs-first.js +67 -0
  174. package/scripts/prewarm-chromedriver.js +26 -0
  175. package/src/background-jobs/cron-expression.js +12 -13
  176. package/src/background-jobs/main.js +6 -6
  177. package/src/background-jobs/runner-graceful-shutdown.js +2 -3
  178. package/src/background-jobs/scheduler.js +3 -3
  179. package/src/background-jobs/worker.js +8 -9
  180. package/src/beacon/client.js +3 -4
  181. package/src/database/drivers/sqlite/web-persistence.js +2 -5
  182. package/src/database/pool/async-tracked-multi-connection.js +65 -15
  183. package/src/database/pool/base.js +23 -7
  184. package/src/database/query/index.js +21 -22
  185. package/src/database/query/model-class-query.js +5 -6
  186. package/src/database/record/acts-as-list.js +37 -10
  187. package/src/database/record/attachments/normalize-input.js +9 -10
  188. package/src/database/record/attachments/store.js +2 -2
  189. package/src/database/record/auditing.js +7 -8
  190. package/src/database/record/index.js +4 -5
  191. package/src/environment-handlers/node/cli/commands/generate/base-models.js +4 -12
  192. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  193. package/src/frontend-model-controller.js +49 -56
  194. package/src/frontend-models/base.js +17 -19
  195. package/src/frontend-models/outgoing-event-buffer.js +3 -4
  196. package/src/frontend-models/query.js +40 -44
  197. package/src/frontend-models/resource-definition.js +7 -8
  198. package/src/frontend-models/transport-serialization.js +10 -12
  199. package/src/frontend-models/websocket-channel.js +12 -13
  200. package/src/http-server/client/websocket-session.js +4 -5
  201. package/src/http-server/client-delivery-queue.js +7 -8
  202. package/src/http-server/websocket-event-log-store.js +4 -6
  203. package/src/plugins/sqljs-wasm-route.js +3 -5
  204. package/src/sync/conflict-strategy.js +3 -6
  205. package/src/sync/device-identity.js +4 -9
  206. package/src/sync/local-mutation-log.js +9 -14
  207. package/src/sync/offline-grant.js +4 -7
  208. package/src/sync/peer-mutation-bundle.js +2 -4
  209. package/src/sync/server-change-feed.js +32 -34
  210. package/src/sync/sync-api-client.js +1 -2
  211. package/src/sync/sync-envelope-replay-service.js +17 -19
  212. package/src/sync/sync-resource-base.js +1 -2
  213. package/src/sync/sync-scope-store.js +9 -10
  214. package/src/testing/test-filter-parser.js +10 -11
  215. package/src/testing/test-runner.js +116 -108
  216. package/src/testing/test.js +8 -9
  217. package/src/utils/backtrace-cleaner.js +8 -9
  218. package/src/utils/model-scope.js +3 -4
  219. package/src/utils/ransack.js +27 -34
@@ -75,13 +75,6 @@ export function frontendModelCustomCommandForPath({ backendProjects, currentPath
75
75
  resourcePath: string;
76
76
  scope: "collection" | "member";
77
77
  } | null;
78
- /**
79
- * Resolved frontend-model resource registration for a replay resource type.
80
- * @typedef {object} FrontendModelResolvedResourceRegistration
81
- * @property {string} modelName - Effective frontend model name (modelName override or registry key).
82
- * @property {import("../configuration-types.js").FrontendModelResourceClassType} resourceClass - Registered resource class.
83
- * @property {import("../configuration-types.js").NormalizedFrontendModelResourceConfiguration} resourceConfiguration - Normalized resource configuration.
84
- */
85
78
  /**
86
79
  * Resolves the registered frontend-model resource class for a resource type
87
80
  * across all backend projects. A resource's effective name is its
@@ -1 +1 @@
1
- {"version":3,"file":"resource-definition.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/resource-definition.js"],"names":[],"mappings":"AAoDA;;;;GAIG;AACH,wEAHW,OAAO,2BAA2B,EAAE,2BAA2B,GAC7D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,8BAA8B,CAAC,CAc9F;AAED;;;;GAIG;AACH,8DAHW,OAAC,GACC,KAAK,IAAI,OAAO,2BAA2B,EAAE,8BAA8B,CAIvF;AAED;;;;GAIG;AACH,6EAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,8BAA8B,GAAG,IAAI,CAIrF;AAED;;;;GAIG;AACH,qFAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,4CAA4C,GAAG,IAAI,CAQnG;AA4JD;;;;GAIG;AACH,6EAHW,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,GAC/D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,gDAAgD,CAAC,CAuBhH;AAED;;;;;;;GAOG;AACH,0DAHW,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,GAC/D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkFnC;AA0gBD;;;;;GAKG;AACH,qDAJW,MAAM,sBACN,OAAC,GACC,MAAM,CAUlB;AAED;;;;;;;GAOG;AACH,8FALG;IAAqB,WAAW,EAAxB,MAAM;IACO,SAAS,EAAtB,MAAM;IACE,kBAAkB,EAA1B,OAAC;CACT,GAAU,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,IAAI,CA2BrG;AAED;;;;;;GAMG;AACH,oFAJG;IAAgF,eAAe,EAAvF,OAAO,2BAA2B,EAAE,2BAA2B,EAAE;IACpD,WAAW,EAAxB,MAAM;CACd,GAAU;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAAA;CAAC,GAAG,IAAI,CA8DxJ;AAiBD;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,mFAJG;IAA4G,aAAa,EAAjH;QAAC,kBAAkB,EAAE,MAAM,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,CAAA;KAAC;IAChF,YAAY,EAAzB,MAAM;CACd,GAAU,yCAAyC,GAAG,IAAI,CA0B5D;;;;;;;;eAxCa,MAAM;;;;mBACN,OAAO,2BAA2B,EAAE,8BAA8B;;;;2BAClE,OAAO,2BAA2B,EAAE,4CAA4C"}
1
+ {"version":3,"file":"resource-definition.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/resource-definition.js"],"names":[],"mappings":"AA2DA;;;;GAIG;AACH,wEAHW,OAAO,2BAA2B,EAAE,2BAA2B,GAC7D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,8BAA8B,CAAC,CAc9F;AAED;;;;GAIG;AACH,8DAHW,OAAC,GACC,KAAK,IAAI,OAAO,2BAA2B,EAAE,8BAA8B,CAIvF;AAED;;;;GAIG;AACH,6EAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,8BAA8B,GAAG,IAAI,CAIrF;AAED;;;;GAIG;AACH,qFAHW,OAAC,GACC,OAAO,2BAA2B,EAAE,4CAA4C,GAAG,IAAI,CAQnG;AA4JD;;;;GAIG;AACH,6EAHW,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,GAC/D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,gDAAgD,CAAC,CAuBhH;AAED;;;;;;;GAOG;AACH,0DAHW,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,GAC/D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkFnC;AA0gBD;;;;;GAKG;AACH,qDAJW,MAAM,sBACN,OAAC,GACC,MAAM,CAUlB;AAED;;;;;;;GAOG;AACH,8FALG;IAAqB,WAAW,EAAxB,MAAM;IACO,SAAS,EAAtB,MAAM;IACE,kBAAkB,EAA1B,OAAC;CACT,GAAU,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,IAAI,CA2BrG;AAED;;;;;;GAMG;AACH,oFAJG;IAAgF,eAAe,EAAvF,OAAO,2BAA2B,EAAE,2BAA2B,EAAE;IACpD,WAAW,EAAxB,MAAM;CACd,GAAU;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAAA;CAAC,GAAG,IAAI,CA8DxJ;AAiBD;;;;;;;;;;GAUG;AACH,mFAJG;IAA4G,aAAa,EAAjH;QAAC,kBAAkB,EAAE,MAAM,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,CAAA;KAAC;IAChF,YAAY,EAAzB,MAAM;CACd,GAAU,yCAAyC,GAAG,IAAI,CA0B5D;;;;;;;;eAriCa,MAAM;;;;mBACN,OAAO,2BAA2B,EAAE,8BAA8B;;;;2BAClE,OAAO,2BAA2B,EAAE,4CAA4C"}
@@ -3,6 +3,13 @@ import * as inflection from "inflection";
3
3
  import FrontendModelBaseResource from "../frontend-model-resource/base-resource.js";
4
4
  import restArgsError from "../utils/rest-args-error.js";
5
5
  import { validateFrontendModelResourceCommandName } from "./resource-config-validation.js";
6
+ /**
7
+ * Resolved frontend-model resource registration for a replay resource type.
8
+ * @typedef {object} FrontendModelResolvedResourceRegistration
9
+ * @property {string} modelName - Effective frontend model name (modelName override or registry key).
10
+ * @property {import("../configuration-types.js").FrontendModelResourceClassType} resourceClass - Registered resource class.
11
+ * @property {import("../configuration-types.js").NormalizedFrontendModelResourceConfiguration} resourceConfiguration - Normalized resource configuration.
12
+ */
6
13
  const BASE_FRONTEND_MODEL_ABILITY_ACTIONS = ["create", "destroy", "read", "update"];
7
14
  const SHA256_INITIAL_HASH = [
8
15
  0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
@@ -891,13 +898,6 @@ function normalizeFrontendModelResourcePathForMatch(path) {
891
898
  }
892
899
  return withLeadingSlash;
893
900
  }
894
- /**
895
- * Resolved frontend-model resource registration for a replay resource type.
896
- * @typedef {object} FrontendModelResolvedResourceRegistration
897
- * @property {string} modelName - Effective frontend model name (modelName override or registry key).
898
- * @property {import("../configuration-types.js").FrontendModelResourceClassType} resourceClass - Registered resource class.
899
- * @property {import("../configuration-types.js").NormalizedFrontendModelResourceConfiguration} resourceConfiguration - Normalized resource configuration.
900
- */
901
901
  /**
902
902
  * Resolves the registered frontend-model resource class for a resource type
903
903
  * across all backend projects. A resource's effective name is its
@@ -931,4 +931,4 @@ export function resolveFrontendModelResourceClass({ configuration, resourceType
931
931
  }
932
932
  return null;
933
933
  }
934
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV4RixNQUFNLG1DQUFtQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDbkYsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7Q0FDL0MsQ0FBQTtBQUNELE1BQU0sUUFBUSxHQUFHO0lBQ2YsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFF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QyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFFOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakosQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QixNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDakcsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBRWhHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN2RCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUE7UUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDckQsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUU1QixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNuQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN6QixDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzFFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0Qix1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbEUsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QixDQUFDO2FBQU0sSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekksQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxLQUFLLENBQUMsR0FBRyxNQUFNO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSTtJQUM5QixPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMscUJBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDO0lBQzNDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV4SCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZHLENBQUM7SUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUYsNkZBQTZGO1FBQzdGLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTtRQUVyQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxJQUFJLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksR0FBRyx3REFBd0QsQ0FBQyxDQUFBO1lBQ3RHLENBQUM7WUFFRCxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcscUJBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDeEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUE7QUFDakUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQUs7SUFDaEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUE7QUFDdEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEdBQUc7SUFDbkMsT0FBTyxrREFBa0QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDckUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHNDQUFzQyxDQUFDLHFCQUFxQjtJQUNuRSxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDLHlCQUF5QixDQUFBO0lBQ2pGLE1BQU0scUJBQXFCLEdBQUcscUJBQXFCLENBQUMscUJBQXFCLENBQUE7SUFDekUsTUFBTSx3QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQTtJQUN6RSxNQUFNLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLGNBQWMsQ0FBQTtJQUNqRSxNQUFNLG1DQUFtQyxHQUFHLHFDQUFxQyxDQUFDO1FBQ2hGLGVBQWUsRUFBRTtZQUNmLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1NBQ2Y7UUFDRCxjQUFjLEVBQUUseUJBQXlCO1FBQ3pDLFNBQVMsRUFBRSxtQkFBbUI7S0FDL0IsQ0FBQyxDQUFBO0lBQ0YsTUFBTSwrQkFBK0IsR0FBRyxxQ0FBcUMsQ0FBQztRQUM1RSxlQUFlLEVBQUU7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixjQUFjLEVBQUUsZ0JBQWdCO1lBQ2hDLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLElBQUksRUFBRSxNQUFNO1lBQ1osTUFBTSxFQUFFLFFBQVE7WUFDaEIsR0FBRyxFQUFFLEtBQUs7U0FDWDtRQUNELGNBQWMsRUFBRSxxQkFBcUI7UUFDckMsU0FBUyxFQUFFLGVBQWU7S0FDM0IsQ0FBQyxDQUFBO0lBRUYsTUFBTSw0QkFBNEIsR0FBRyxvQ0FBb0MsQ0FBQyxFQUFDLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsQ0FBQyxDQUFBO0lBQ3JKLE1BQU0sd0JBQXdCLEdBQUcsb0NBQW9DLENBQUMsRUFBQyxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQUE7SUFFekksT0FBTztRQUNMLHlCQUF5QixFQUFFLG1DQUFtQztRQUM5RCxxQkFBcUIsRUFBRSwrQkFBK0I7UUFDdEQsa0JBQWtCLEVBQUUsNEJBQTRCLENBQUMsUUFBUTtRQUN6RCxlQUFlLEVBQUUsRUFBQyxHQUFHLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsRUFBQztRQUNqRyxjQUFjLEVBQUUsd0JBQXdCLENBQUMsUUFBUTtLQUNsRCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHFDQUFxQyxDQUFDLEVBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUM7SUFDekYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sZUFBZSxDQUFBO0lBQ3hCLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLDZFQUE2RSxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVEOzt3Q0FFb0M7SUFDcEMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUE7SUFFN0IsS0FBSyxNQUFNLFdBQVcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV2RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxXQUFXLFNBQVMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUM5RixDQUFDO1FBRUQsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEdBQUcsd0NBQXdDLENBQUM7WUFDekUsV0FBVyxFQUFFLGtCQUFrQjtZQUMvQixXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLFNBQVM7U0FDVixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQTtBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG9DQUFvQyxDQUFDLEVBQUMsY0FBYyxFQUFFLFNBQVMsRUFBQztJQUN2RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsT0FBTyxFQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLDZFQUE2RSxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFDbkIscUdBQXFHO0lBQ3JHLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUVuQixLQUFLLE1BQU0sWUFBWSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxHQUFHLHdDQUF3QyxDQUFDLEVBQUMsWUFBWSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7UUFDMUcsTUFBTSxtQkFBbUIsR0FBRyx3Q0FBd0MsQ0FBQztZQUNuRSxXQUFXLEVBQUUsVUFBVTtZQUN2QixXQUFXLEVBQUUsVUFBVTtZQUN2QixTQUFTO1NBQ1YsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQTtRQUVwRixRQUFRLENBQUMsbUJBQW1CLENBQUMsR0FBRyxXQUFXLENBQUE7UUFDM0MsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVELE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUE7QUFDN0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsd0NBQXdDLENBQUMsRUFBQyxZQUFZLEVBQUUsU0FBUyxFQUFDO0lBQ3pFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckMsT0FBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxpRkFBaUYsQ0FBQyxDQUFBO0lBQ2hILENBQUM7SUFFRCxNQUFNLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLEVBQUMsR0FBRyxxRUFBcUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRTlILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLFNBQVMsVUFBVSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtJQUNuSCxDQUFDO0lBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxtREFBbUQsQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLElBQUk7UUFDaEIsSUFBSSxFQUFFLGlDQUFpQyxDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDLENBQUM7UUFDN0UsVUFBVSxFQUFFLHVDQUF1QyxDQUFDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7S0FDaEcsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxpQ0FBaUMsQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFDO0lBQ3ZFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEMsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxLQUFLLFdBQVcsaURBQWlELENBQUMsQ0FBQTtJQUNoRyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6SixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxLQUFLLFdBQVcsdUVBQXVFLENBQUMsQ0FBQTtRQUN0SCxDQUFDO1FBRUQsT0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFDLENBQUE7SUFDaEQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsdUNBQXVDLENBQUMsRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQztJQUNuRixJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsS0FBSyxXQUFXLG9EQUFvRCxDQUFDLENBQUE7SUFDbkcsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxDQUFBO0FBQzFCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCO0lBQ3JFLE1BQU0scUJBQXFCLEdBQUcsZ0RBQWdELENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUVsRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ2hGLENBQUM7SUFFRCxPQUFPLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDM0YsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFDO0lBQ3hGLE1BQU0scUJBQXFCLEdBQUcsZ0RBQWdELENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUVsRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ2hGLENBQUM7SUFFRCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzNELEdBQUcscUJBQXFCLENBQUMseUJBQXlCO1FBQ2xELEdBQUcscUJBQXFCLENBQUMscUJBQXFCO0tBQy9DLENBQUMsRUFBRSxDQUFDO1FBQ0gsSUFBSSxxQkFBcUIsS0FBSyxTQUFTO1lBQUUsU0FBUTtRQUVqRCxNQUFNLG9CQUFvQixHQUFHLHdDQUF3QyxDQUFDO1lBQ3BFLFdBQVcsRUFBRSxxQkFBcUI7WUFDbEMsV0FBVyxFQUFFLGlHQUFpRyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3ZILFNBQVM7U0FDVixDQUFDLENBQUE7UUFFRixJQUFJLFdBQVcsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3pDLE9BQU8saUdBQWlHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FBQyxFQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUM7SUFDOUUsTUFBTSxxQkFBcUIsR0FBRywwQ0FBMEMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVyRixLQUFLLE1BQU0sY0FBYyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLHVDQUF1QyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXpFLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDL0MsTUFBTSxxQkFBcUIsR0FBRyxnREFBZ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBRWxHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQixTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUE7WUFDekgsTUFBTSxjQUFjLEdBQUcsR0FBRyxZQUFZLEdBQUcsQ0FBQTtZQUV6QyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcscUJBQXFCO2lCQUN2QyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztpQkFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQztpQkFDVixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFbEIsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUM7cUJBQ3RGLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUU3RCxJQUFJLHdCQUF3QixFQUFFLENBQUM7b0JBQzdCLE9BQU87d0JBQ0wsV0FBVyxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQzt3QkFDeEMsVUFBVSxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQzt3QkFDdkMsU0FBUzt3QkFDVCxZQUFZO3dCQUNaLEtBQUssRUFBRSxZQUFZO3FCQUNwQixDQUFBO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDO3FCQUM5RSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFFN0QsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO29CQUN6QixPQUFPO3dCQUNMLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7d0JBQ3BDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7d0JBQ25DLFNBQVM7d0JBQ1QsWUFBWTt3QkFDWixLQUFLLEVBQUUsUUFBUTtxQkFDaEIsQ0FBQTtnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsMENBQTBDLENBQUMsSUFBSTtJQUN0RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVqRSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUE7QUFDekIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDO0lBQzdFLEtBQUssTUFBTSxjQUFjLElBQUksYUFBYSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztRQUNoRSxNQUFNLFNBQVMsR0FBRyx1Q0FBdUMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUV6RSxLQUFLLE1BQU0sbUJBQW1CLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDekQsTUFBTSxhQUFhLEdBQUcsd0NBQXdDLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUVsRixJQUFJLENBQUMsYUFBYTtnQkFBRSxTQUFRO1lBRTVCLHdFQUF3RTtZQUN4RSx1RUFBdUU7WUFDdkUsSUFBSSxtQkFBbUIsS0FBSyxZQUFZLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDO2dCQUFFLFNBQVE7WUFFM0csTUFBTSxxQkFBcUIsR0FBRyxnREFBZ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBRWxHLElBQUksQ0FBQyxxQkFBcUI7Z0JBQUUsU0FBUTtZQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxJQUFJLG1CQUFtQixDQUFDLEtBQUssWUFBWTtnQkFBRSxTQUFRO1lBRXZGLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBQyxDQUFBO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWV9IGZyb20gXCIuL3Jlc291cmNlLWNvbmZpZy12YWxpZGF0aW9uLmpzXCJcblxuY29uc3QgQkFTRV9GUk9OVEVORF9NT0RFTF9BQklMSVRZX0FDVElPTlMgPSBbXCJjcmVhdGVcIiwgXCJkZXN0cm95XCIsIFwicmVhZFwiLCBcInVwZGF0ZVwiXVxuY29uc3QgU0hBMjU2X0lOSVRJQUxfSEFTSCA9IFtcbiAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuXVxuY29uc3QgU0hBMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl1cbmNvbnN0IFJFU09VUkNFX1NUQVRJQ19DT05GSUdfS0VZUyA9IG5ldyBTZXQoW1xuICBcImFiaWxpdGllc1wiLFxuICBcImF0dGFjaG1lbnRzXCIsXG4gIFwiYXR0cmlidXRlc1wiLFxuICBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIixcbiAgXCJjb2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgXCJjb21tYW5kc1wiLFxuICBcIm1lbWJlckNvbW1hbmRzXCIsXG4gIFwibW9kZWxOYW1lXCIsXG4gIFwiTW9kZWxDbGFzc1wiLFxuICBcInByaW1hcnlLZXlcIixcbiAgXCJxdWlja1NlYXJjaENvbHVtbnNcIixcbiAgXCJyZWxhdGlvbnNoaXBzXCIsXG4gIFwiUmVwbGF5U2VydmljZUNsYXNzXCIsXG4gIFwic2VydmVyXCIsXG4gIFwiU2hhcmVkUmVzb3VyY2VcIixcbiAgXCJzeW5jXCIsXG4gIFwidHJhbnNsYXRlZEF0dHJpYnV0ZXNcIixcbiAgXCJ3cml0YWJsZUF0dHJpYnV0ZXNcIlxuXSlcblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QgaGVscGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlPn0gLSBSZXNvdXJjZSBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KSB7XG4gIGNvbnN0IHJlc291cmNlcyA9IGJhY2tlbmRQcm9qZWN0LmZyb250ZW5kTW9kZWxzXG5cbiAgaWYgKHJlc291cmNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZXNvdXJjZXMgfHwgdHlwZW9mIHJlc291cmNlcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBiYWNrZW5kIHByb2plY3QgZnJvbnRlbmRNb2RlbHMgb2JqZWN0IGJ1dCBnb3Q6ICR7cmVzb3VyY2VzfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc291cmNlc1xuICB9XG5cbiAgcmV0dXJuIHt9XG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3MgaGVscGVyLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSByZXNvdXJjZSBkZWZpbml0aW9uLlxuICogQHJldHVybnMge3ZhbHVlIGlzIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSAtIFdoZXRoZXIgdmFsdWUgaXMgYSByZXNvdXJjZSBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25Jc0NsYXNzKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiAodmFsdWUgPT09IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgfHwgdmFsdWUucHJvdG90eXBlIGluc3RhbmNlb2YgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSlcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uIGhlbHBlci5cbiAqIEBwYXJhbSB7P30gcmVzb3VyY2VEZWZpbml0aW9uIC0gUmVzb3VyY2UgZGVmaW5pdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IC0gUmVzb3VyY2UgY2xhc3Mgd2hlbiBkZWZpbml0aW9uIGlzIGNsYXNzLWJhc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pIHtcbiAgcmV0dXJuIGZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25Jc0NsYXNzKHJlc291cmNlRGVmaW5pdGlvbikgPyByZXNvdXJjZURlZmluaXRpb24gOiBudWxsXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uIGhlbHBlci5cbiAqIEBwYXJhbSB7P30gcmVzb3VyY2VEZWZpbml0aW9uIC0gUmVzb3VyY2UgZGVmaW5pdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uIHwgbnVsbH0gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKSB7XG4gIGlmICghZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3MocmVzb3VyY2VEZWZpbml0aW9uKSkgcmV0dXJuIG51bGxcblxuICBhc3NlcnRSZXNvdXJjZUNvbmZpZ0lzRnJhbWV3b3JrRGVmaW5lZChyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24ocmVzb3VyY2VEZWZpbml0aW9uLnJlc291cmNlQ29uZmlnKCkpXG59XG5cbi8qKlxuICogRW5zdXJlcyByZXNvdXJjZXMgdXNlIGRlY2xhcmF0aXZlIHN0YXRpYyBjb25maWcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcgcmVzb3VyY2VDb25maWcoKS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IFJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAqIEBwYXJhbSB7U2V0PGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlPn0gW3Zpc2l0ZWRdIC0gQWxyZWFkeSBpbnNwZWN0ZWQgc2hhcmVkIHJlc291cmNlcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRSZXNvdXJjZUNvbmZpZ0lzRnJhbWV3b3JrRGVmaW5lZChSZXNvdXJjZUNsYXNzLCB2aXNpdGVkID0gbmV3IFNldCgpKSB7XG4gIGlmICh2aXNpdGVkLmhhcyhSZXNvdXJjZUNsYXNzKSkgcmV0dXJuXG5cbiAgdmlzaXRlZC5hZGQoUmVzb3VyY2VDbGFzcylcbiAgYXNzZXJ0S25vd25SZXNvdXJjZVN0YXRpY0NvbmZpZ1Byb3BlcnRpZXMoUmVzb3VyY2VDbGFzcylcblxuICBjb25zdCBvd25lciA9IHN0YXRpY01ldGhvZE93bmVyRm9yKFJlc291cmNlQ2xhc3MsIFwicmVzb3VyY2VDb25maWdcIilcblxuICBpZiAob3duZXIgJiYgb3duZXIgIT09IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7UmVzb3VyY2VDbGFzcy5uYW1lfSBvdmVycmlkZXMgc3RhdGljIHJlc291cmNlQ29uZmlnKCksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBzdGF0aWMgcmVzb3VyY2UgcHJvcGVydGllcyBpbnN0ZWFkLmApXG4gIH1cblxuICBjb25zdCBTaGFyZWRSZXNvdXJjZSA9IFJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VDbGFzcygpXG5cbiAgaWYgKFNoYXJlZFJlc291cmNlKSBhc3NlcnRSZXNvdXJjZUNvbmZpZ0lzRnJhbWV3b3JrRGVmaW5lZChTaGFyZWRSZXNvdXJjZSwgdmlzaXRlZClcbn1cblxuLyoqXG4gKiBFbnN1cmVzIGRlY2xhcmF0aXZlIHN0YXRpYyByZXNvdXJjZSBjb25maWcgZG9lcyBub3Qgc2lsZW50bHkgaWdub3JlIHR5cG9zIG9yIHJlbW92ZWQga2V5cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IFJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRLbm93blJlc291cmNlU3RhdGljQ29uZmlnUHJvcGVydGllcyhSZXNvdXJjZUNsYXNzKSB7XG4gIGxldCBjdXJyZW50Q2xhc3MgPSBSZXNvdXJjZUNsYXNzXG5cbiAgd2hpbGUgKGN1cnJlbnRDbGFzcyAmJiBjdXJyZW50Q2xhc3MgIT09IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgJiYgY3VycmVudENsYXNzICE9PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgIGNvbnN0IHVua25vd25TdGF0aWNDb25maWcgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VycmVudENsYXNzKSkge1xuICAgICAgaWYgKCFSRVNPVVJDRV9TVEFUSUNfQ09ORklHX0tFWVMuaGFzKGtleSkpIHVua25vd25TdGF0aWNDb25maWdba2V5XSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjdXJyZW50Q2xhc3MpKVtrZXldXG4gICAgfVxuXG4gICAgcmVzdEFyZ3NFcnJvcih1bmtub3duU3RhdGljQ29uZmlnKVxuXG4gICAgY3VycmVudENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnRDbGFzcylcbiAgfVxufVxuXG4vKipcbiAqIExvY2F0ZXMgd2hpY2ggY29uc3RydWN0b3Igb3ducyBhIHN0YXRpYyBtZXRob2QgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSBSZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSAtIE1ldGhvZCBuYW1lLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgdHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgfCBudWxsfSAtIENsYXNzIHRoYXQgb3ducyB0aGUgc3RhdGljIG1ldGhvZC5cbiAqL1xuZnVuY3Rpb24gc3RhdGljTWV0aG9kT3duZXJGb3IoUmVzb3VyY2VDbGFzcywgbWV0aG9kTmFtZSkge1xuICBsZXQgY3VycmVudENsYXNzID0gUmVzb3VyY2VDbGFzc1xuXG4gIHdoaWxlIChjdXJyZW50Q2xhc3MgJiYgY3VycmVudENsYXNzICE9PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnRDbGFzcywgbWV0aG9kTmFtZSkpIHJldHVybiBjdXJyZW50Q2xhc3NcblxuICAgIGN1cnJlbnRDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50Q2xhc3MpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gcmVzb3VyY2VDb25maWd1cmF0aW9uIC0gUmF3IHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24ocmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IHJlc3RBcmdzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHsuLi5yZXNvdXJjZUNvbmZpZ3VyYXRpb259KVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIFtcbiAgICBcImFiaWxpdGllc1wiLFxuICAgIFwiYXR0cmlidXRlc1wiLFxuICAgIFwiYXR0YWNobWVudHNcIixcbiAgICBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgICBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgIFwiY29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgXCJjb21tYW5kc1wiLFxuICAgIFwibWVtYmVyQ29tbWFuZHNcIixcbiAgICBcIm1vZGVsTmFtZVwiLFxuICAgIFwicHJpbWFyeUtleVwiLFxuICAgIFwicmVsYXRpb25zaGlwc1wiLFxuICAgIFwic2VydmVyXCIsXG4gICAgXCJzeW5jXCJcbiAgXSkge1xuICAgIGRlbGV0ZSByZXN0QXJnc1trZXldXG4gIH1cblxuICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbW1hbmRzKHJlc291cmNlQ29uZmlndXJhdGlvbilcbiAgY29uc3Qgc3luYyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmMocmVzb3VyY2VDb25maWd1cmF0aW9uKVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzb3VyY2VDb25maWd1cmF0aW9uLFxuICAgIGFiaWxpdGllczogbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5hYmlsaXRpZXMpLFxuICAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb21tYW5kcy5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIGJ1aWx0SW5NZW1iZXJDb21tYW5kczogbm9ybWFsaXplZENvbW1hbmRzLmJ1aWx0SW5NZW1iZXJDb21tYW5kcyxcbiAgICBjb2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb21tYW5kcy5jb2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgLy8gUGVyLWNvbW1hbmQgbWV0YWRhdGEgKHR5cGVkIGFyZ3MgKyBkZWNsYXJlZCByZXR1cm4gdHlwZSkga2V5ZWQgYnkgbWV0aG9kXG4gICAgLy8gbmFtZSwgZGVyaXZlZCBmcm9tIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgY29tbWFuZCBlbnRyaWVzLiBUaGVcbiAgICAvLyBnZW5lcmF0b3IgdXNlcyBpdCB0byB0eXBlIGVhY2ggY3VzdG9tIGNvbW1hbmQgbWV0aG9kLlxuICAgIGNvbW1hbmRNZXRhZGF0YTogbm9ybWFsaXplZENvbW1hbmRzLmNvbW1hbmRNZXRhZGF0YSxcbiAgICBtZW1iZXJDb21tYW5kczogbm9ybWFsaXplZENvbW1hbmRzLm1lbWJlckNvbW1hbmRzLFxuICAgIHN5bmNcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGFiaWxpdGllcy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IGFiaWxpdGllcyAtIFJlc291cmNlIGFiaWxpdGllcyBjb25maWcgKGNhbWVsQ2FzZSBhY3Rpb24gbGlzdCkuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBOb3JtYWxpemVkIGFiaWxpdGllcyBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUFiaWxpdGllcyhhYmlsaXRpZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRlZmF1bHRDcnVkQWJpbGl0aWVzKClcblxuICBpZiAoYWJpbGl0aWVzID09PSB1bmRlZmluZWQpIHJldHVybiBub3JtYWxpemVkXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGFiaWxpdGllcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBhYmlsaXRpZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBhY3Rpb24gbmFtZXMuIE9iamVjdCBmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXCIpXG4gIH1cblxuICBjb25zdCBkdXBsaWNhdGVkQmFzZUFiaWxpdGllcyA9IGFiaWxpdGllcy5maWx0ZXIoKGFiaWxpdHkpID0+IEJBU0VfRlJPTlRFTkRfTU9ERUxfQUJJTElUWV9BQ1RJT05TLmluY2x1ZGVzKGFiaWxpdHkpKVxuXG4gIGlmIChkdXBsaWNhdGVkQmFzZUFiaWxpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXNvdXJjZSBhYmlsaXRpZXMgbXVzdCBub3QgaW5jbHVkZSBiYXNlIGFjdGlvbnM6ICR7ZHVwbGljYXRlZEJhc2VBYmlsaXRpZXMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IGFiaWxpdHkgb2YgYWJpbGl0aWVzKSB7XG4gICAgaWYgKHR5cGVvZiBhYmlsaXR5ICE9PSBcInN0cmluZ1wiIHx8IGFiaWxpdHkubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2UgYWJpbGl0aWVzIGVudHJpZXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy5cIilcbiAgICB9XG5cbiAgICBub3JtYWxpemVkW2FiaWxpdHldID0gYWJpbGl0eVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBSdW5zIGRlZmF1bHQgY3J1ZCBhYmlsaXRpZXMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBEZWZhdWx0IENSVUQgYWJpbGl0eSBtYXAuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRDcnVkQWJpbGl0aWVzKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogXCJjcmVhdGVcIixcbiAgICBkZXN0cm95OiBcImRlc3Ryb3lcIixcbiAgICBmaW5kOiBcInJlYWRcIixcbiAgICBpbmRleDogXCJyZWFkXCIsXG4gICAgdXBkYXRlOiBcInVwZGF0ZVwiXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmcm9udGVuZC1zYWZlIHN5bmMgbWFuaWZlc3QgZm9yIGFsbCBzeW5jLWVuYWJsZWQgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfSBiYWNrZW5kUHJvamVjdHMgLSBCYWNrZW5kIHByb2plY3RzIHRvIHNjYW4uXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb24+fSAtIFN5bmMgbWV0YWRhdGEga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxTeW5jTWFuaWZlc3RGb3JCYWNrZW5kUHJvamVjdHMoYmFja2VuZFByb2plY3RzKSB7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb24+fSAqL1xuICBjb25zdCBtYW5pZmVzdCA9IHt9XG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IGNvbmZpZ3VyZWRNb2RlbE5hbWUgb2YgT2JqZWN0LmtleXMocmVzb3VyY2VzKS5zb3J0KCkpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1tjb25maWd1cmVkTW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIGNvbnRpbnVlXG4gICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jPy5lbmFibGVkKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IGNvbmZpZ3VyZWRNb2RlbE5hbWVcblxuICAgICAgbWFuaWZlc3RbbW9kZWxOYW1lXSA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZnJvbnRlbmQtc2FmZSBBUEkgbWFuaWZlc3QgZm9yIGFsbCByZWdpc3RlcmVkIGZyb250ZW5kLW1vZGVsXG4gKiByZXNvdXJjZXMuIFRoZSBtYW5pZmVzdCBpcyBkZXRlcm1pbmlzdGljIChzb3J0ZWQgbW9kZWwgbmFtZXMsIHNvcnRlZFxuICogYXR0cmlidXRlcywgc29ydGVkIGNvbW1hbmRzKSBhbmQgaW5jbHVkZXMgb25seSBwdWJsaWMtc2FmZSBtZXRhZGF0YTogbm9cbiAqIHNlY3JldHMsIG5vIHNlcnZlciBjYWxsYmFja3MsIG5vIGJhY2tlbmQgZmlsZSBwYXRocy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX0gYmFja2VuZFByb2plY3RzIC0gQmFja2VuZCBwcm9qZWN0cyB0byBzY2FuLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAtIEZyb250ZW5kLXNhZmUgQVBJIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbEFwaU1hbmlmZXN0KGJhY2tlbmRQcm9qZWN0cykge1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgY29uc3QgcHJvamVjdFJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgY29uZmlndXJlZE1vZGVsTmFtZSBvZiBPYmplY3Qua2V5cyhwcm9qZWN0UmVzb3VyY2VzKS5zb3J0KCkpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHByb2plY3RSZXNvdXJjZXNbY29uZmlndXJlZE1vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IGNvbmZpZ3VyZWRNb2RlbE5hbWVcbiAgICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IGAvJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY29uZmlndXJlZE1vZGVsTmFtZSkpKX1gXG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgIHByaW1hcnlLZXk6IHJlc291cmNlQ29uZmlndXJhdGlvbi5wcmltYXJ5S2V5IHx8IFwiaWRcIixcbiAgICAgICAgYXR0cmlidXRlczogbWFuaWZlc3RBdHRyaWJ1dGVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVzKSxcbiAgICAgICAgYWJpbGl0aWVzOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzLFxuICAgICAgICBidWlsdEluQ29tbWFuZHM6IHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyxcbiAgICAgICAgICBtZW1iZXI6IHJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluTWVtYmVyQ29tbWFuZHNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLnJlbGF0aW9uc2hpcHNcbiAgICAgIGlmIChyZWxhdGlvbnNoaXBzICYmIHJlbGF0aW9uc2hpcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgICAgICBjb25zdCByZWxzID0ge31cbiAgICAgICAgZm9yIChjb25zdCByZWxOYW1lIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgICByZWxzW3JlbE5hbWVdID0ge31cbiAgICAgICAgfVxuICAgICAgICBlbnRyeS5yZWxhdGlvbnNoaXBzID0gcmVsc1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5hdHRhY2htZW50c1xuICAgICAgaWYgKGF0dGFjaG1lbnRzICYmIE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudHJ5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sbGVjdGlvbkNvbW1hbmRzID0gbWFuaWZlc3RDb21tYW5kRW50cmllcyh7XG4gICAgICAgIGNvbW1hbmRNZXRhZGF0YTogcmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbW1hbmRNZXRhZGF0YSB8fCB7fSxcbiAgICAgICAgY29tbWFuZHM6IHJlc291cmNlQ29uZmlndXJhdGlvbi5jb2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgICAgIHJlc291cmNlUGF0aCxcbiAgICAgICAgc2NvcGU6IFwiY29sbGVjdGlvblwiXG4gICAgICB9KVxuICAgICAgY29uc3QgbWVtYmVyQ29tbWFuZHMgPSBtYW5pZmVzdENvbW1hbmRFbnRyaWVzKHtcbiAgICAgICAgY29tbWFuZE1ldGFkYXRhOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uY29tbWFuZE1ldGFkYXRhIHx8IHt9LFxuICAgICAgICBjb21tYW5kczogcmVzb3VyY2VDb25maWd1cmF0aW9uLm1lbWJlckNvbW1hbmRzLFxuICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgIHNjb3BlOiBcIm1lbWJlclwiXG4gICAgICB9KVxuXG4gICAgICBpZiAoY29sbGVjdGlvbkNvbW1hbmRzLmxlbmd0aCA+IDAgfHwgbWVtYmVyQ29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgICAgICBjb25zdCBjbWRzID0ge31cbiAgICAgICAgaWYgKGNvbGxlY3Rpb25Db21tYW5kcy5sZW5ndGggPiAwKSBjbWRzW1wiY29sbGVjdGlvblwiXSA9IGNvbGxlY3Rpb25Db21tYW5kc1xuICAgICAgICBpZiAobWVtYmVyQ29tbWFuZHMubGVuZ3RoID4gMCkgY21kc1tcIm1lbWJlclwiXSA9IG1lbWJlckNvbW1hbmRzXG4gICAgICAgIGVudHJ5LmNvbW1hbmRzID0gY21kc1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb3VyY2VDb25maWd1cmF0aW9uLnN5bmM/LmVuYWJsZWQpIHtcbiAgICAgICAgZW50cnkuc3luYyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jXG4gICAgICB9XG5cbiAgICAgIHJlc291cmNlc1tjb25maWd1cmVkTW9kZWxOYW1lXSA9IGVudHJ5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXRWZXJzaW9uOiAxLFxuICAgIHJlc291cmNlczogT2JqZWN0LmtleXMocmVzb3VyY2VzKS5zb3J0KCkucmVkdWNlKChzb3J0ZWQsIGtleSkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHNvcnRlZClba2V5XSA9IHJlc291cmNlc1trZXldXG4gICAgICByZXR1cm4gc29ydGVkXG4gICAgfSwgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHt9KSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcmVzb3VyY2UgYXR0cmlidXRlIGRlZmluaXRpb25zIGludG8gYSBzb3J0ZWQgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSB7P30gYXR0cmlidXRlcyAtIFJhdyBhdHRyaWJ1dGVzIGNvbmZpZyAoYXJyYXkgb3Igb2JqZWN0KS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTb3J0ZWQgYXR0cmlidXRlIG5hbWVzLlxuICovXG5mdW5jdGlvbiBtYW5pZmVzdEF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICBpZiAoIWF0dHJpYnV0ZXMpIHJldHVybiBbXVxuXG4gIGxldCBuYW1lc1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgbmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoZW50cnkpID0+IHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5IDogZW50cnkubmFtZSkuZmlsdGVyKEJvb2xlYW4pXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikge1xuICAgIG5hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBuYW1lcy5zb3J0KClcbn1cblxuLyoqXG4gKiBCdWlsZHMgbWFuaWZlc3Qtc2FmZSBjb21tYW5kIGVudHJ5IGxpc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59IGFyZ3MuY29tbWFuZE1ldGFkYXRhIC0gUGVyLWNvbW1hbmQgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGFyZ3MuY29tbWFuZHMgLSBNZXRob2QgbmFtZSDihpIga2ViYWIgc2x1ZyBtYXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVBhdGggLSBSZXNvdXJjZSBwYXRoLlxuICogQHBhcmFtIHtcImNvbGxlY3Rpb25cIiB8IFwibWVtYmVyXCJ9IGFyZ3Muc2NvcGUgLSBDb21tYW5kIHNjb3BlLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+W119IC0gTWFuaWZlc3QgY29tbWFuZCBlbnRyaWVzLlxuICovXG5mdW5jdGlvbiBtYW5pZmVzdENvbW1hbmRFbnRyaWVzKHtjb21tYW5kTWV0YWRhdGEsIGNvbW1hbmRzLCByZXNvdXJjZVBhdGgsIHNjb3BlfSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29tbWFuZHMpLnNvcnQoKS5tYXAoKG1ldGhvZE5hbWUpID0+IHtcbiAgICBjb25zdCBzbHVnID0gY29tbWFuZHNbbWV0aG9kTmFtZV1cbiAgICBjb25zdCBtZXRhZGF0YSA9IGNvbW1hbmRNZXRhZGF0YVttZXRob2ROYW1lXSB8fCB7YXJnczogW10sIHJldHVyblR5cGU6IG51bGx9XG4gICAgY29uc3QgcGF0aCA9IHNjb3BlID09PSBcIm1lbWJlclwiXG4gICAgICA/IGAke3Jlc291cmNlUGF0aH0vPGlkPi8ke3NsdWd9YFxuICAgICAgOiBgJHtyZXNvdXJjZVBhdGh9LyR7c2x1Z31gXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHNjb3BlLFxuICAgICAgcGF0aCxcbiAgICAgIGFyZ3M6IG1ldGFkYXRhLmFyZ3NcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEucmV0dXJuVHlwZSkge1xuICAgICAgZW50cnkucmV0dXJuVHlwZSA9IG1ldGFkYXRhLnJldHVyblR5cGVcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnlcbiAgfSlcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHN5bmMgcG9saWN5IG1ldGFkYXRhIGFuZCBjb21wdXRlcyBhIGRldGVybWluaXN0aWMgaGFzaCBmcm9tIHNhZmUgcG9saWN5IGlucHV0cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBSYXcgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gLSBGcm9udGVuZC1zYWZlIHN5bmMgbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmMocmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IHN5bmMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uc3luY1xuXG4gIGlmIChzeW5jID09PSB1bmRlZmluZWQgfHwgc3luYyA9PT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAoc3luYyA9PT0gZmFsc2UpIHJldHVybiB7Y29uZmxpY3RTdHJhdGVneTogXCJvcHRpbWlzdGljVmVyc2lvblwiLCBlbmFibGVkOiBmYWxzZSwgb3BlcmF0aW9uczogW10sIHBvbGljeUhhc2g6IHN5bmNQb2xpY3lIYXNoKHtjb25mbGljdFN0cmF0ZWd5OiBcIm9wdGltaXN0aWNWZXJzaW9uXCIsIGVuYWJsZWQ6IGZhbHNlfSksIHBvbGljeVZlcnNpb246IG51bGx9XG4gIGlmIChzeW5jID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmMoe1xuICAgICAgLi4ucmVzb3VyY2VDb25maWd1cmF0aW9uLFxuICAgICAgc3luYzoge29wZXJhdGlvbnM6IFtcImluZGV4XCIsIFwiZmluZFwiXX1cbiAgICB9KVxuICB9XG4gIGlmICghc3luYyB8fCB0eXBlb2Ygc3luYyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHN5bmMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2Ugc3luYyBjb25maWd1cmF0aW9uIG11c3QgYmUgdHJ1ZSwgZmFsc2UsIG9yIGFuIG9iamVjdC5cIilcbiAgfVxuXG4gIGNvbnN0IHtjb25mbGljdFN0cmF0ZWd5LCBlbmFibGVkID0gdHJ1ZSwgbWV0YWRhdGEsIG9wZXJhdGlvbnMsIHBvbGljeSwgcG9saWN5VmVyc2lvbiwgLi4ucmVzdH0gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb259ICovIChzeW5jKVxuXG4gIGlmIChPYmplY3Qua2V5cyhyZXN0KS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHN5bmMga2V5czogJHtPYmplY3Qua2V5cyhyZXN0KS5qb2luKFwiLCBcIil9LiBBbGxvd2VkOiBjb25mbGljdFN0cmF0ZWd5LCBlbmFibGVkLCBtZXRhZGF0YSwgb3BlcmF0aW9ucywgcG9saWN5LCBwb2xpY3lWZXJzaW9uYClcbiAgfVxuICBpZiAoZW5hYmxlZCAhPT0gdHJ1ZSAmJiBlbmFibGVkICE9PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2Ugc3luYyBlbmFibGVkIG11c3QgYmUgdHJ1ZSBvciBmYWxzZSB3aGVuIHByb3ZpZGVkLlwiKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb25mbGljdFN0cmF0ZWd5ID0gbm9ybWFsaXplU3luY0NvbmZsaWN0U3RyYXRlZ3koY29uZmxpY3RTdHJhdGVneSlcbiAgY29uc3Qgbm9ybWFsaXplZE9wZXJhdGlvbnMgPSBub3JtYWxpemVTeW5jT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICBjb25zdCBub3JtYWxpemVkTWV0YWRhdGEgPSBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGV0ZXJtaW5pc3RpY1N5bmNKc29uKHtsYWJlbDogXCJtZXRhZGF0YVwiLCB2YWx1ZTogbWV0YWRhdGF9KVxuICBjb25zdCBub3JtYWxpemVkUG9saWN5ID0gcG9saWN5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsOiBcInBvbGljeVwiLCB2YWx1ZTogcG9saWN5fSlcbiAgY29uc3Qgbm9ybWFsaXplZFBvbGljeVZlcnNpb24gPSBwb2xpY3lWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgcG9saWN5VmVyc2lvbiA9PT0gbnVsbCA/IG51bGwgOiBTdHJpbmcocG9saWN5VmVyc2lvbilcbiAgY29uc3QgaGFzaElucHV0ID0ge1xuICAgIGNvbmZsaWN0U3RyYXRlZ3k6IG5vcm1hbGl6ZWRDb25mbGljdFN0cmF0ZWd5LFxuICAgIGVuYWJsZWQsXG4gICAgbWV0YWRhdGE6IG5vcm1hbGl6ZWRNZXRhZGF0YSxcbiAgICBtb2RlbE5hbWU6IHJlc291cmNlQ29uZmlndXJhdGlvbi5tb2RlbE5hbWUgfHwgbnVsbCxcbiAgICBvcGVyYXRpb25zOiBub3JtYWxpemVkT3BlcmF0aW9ucyxcbiAgICBwb2xpY3k6IG5vcm1hbGl6ZWRQb2xpY3ksXG4gICAgcG9saWN5VmVyc2lvbjogbm9ybWFsaXplZFBvbGljeVZlcnNpb25cbiAgfVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9ufSAqL1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIGNvbmZsaWN0U3RyYXRlZ3k6IG5vcm1hbGl6ZWRDb25mbGljdFN0cmF0ZWd5LFxuICAgIGVuYWJsZWQsXG4gICAgb3BlcmF0aW9uczogbm9ybWFsaXplZE9wZXJhdGlvbnMsXG4gICAgcG9saWN5SGFzaDogc3luY1BvbGljeUhhc2goaGFzaElucHV0KSxcbiAgICBwb2xpY3lWZXJzaW9uOiBub3JtYWxpemVkUG9saWN5VmVyc2lvblxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRNZXRhZGF0YSAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLm1ldGFkYXRhID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKG5vcm1hbGl6ZWRNZXRhZGF0YSlcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kgZm9yIHJlcGxheSBjbGllbnRzL3NlcnZlcnMuXG4gKiBAcGFyYW0ge3Vua25vd259IGNvbmZsaWN0U3RyYXRlZ3kgLSBSYXcgc3RyYXRlZ3kuXG4gKiBAcmV0dXJucyB7XCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIgfCBcImxhc3RXcml0ZXJXaW5zXCIgfCBcImZpZWxkVGhyZWVXYXlcIiB8IFwiYXBwZW5kT25seVwifSAtIE5vcm1hbGl6ZWQgc3RyYXRlZ3kuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN5bmNDb25mbGljdFN0cmF0ZWd5KGNvbmZsaWN0U3RyYXRlZ3kpIHtcbiAgaWYgKGNvbmZsaWN0U3RyYXRlZ3kgPT09IHVuZGVmaW5lZCB8fCBjb25mbGljdFN0cmF0ZWd5ID09PSBudWxsKSByZXR1cm4gXCJvcHRpbWlzdGljVmVyc2lvblwiXG4gIGlmIChbXCJvcHRpbWlzdGljVmVyc2lvblwiLCBcInNlcnZlcldpbnNcIiwgXCJsYXN0V3JpdGVyV2luc1wiLCBcImZpZWxkVGhyZWVXYXlcIiwgXCJhcHBlbmRPbmx5XCJdLmluY2x1ZGVzKFN0cmluZyhjb25mbGljdFN0cmF0ZWd5KSkpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtcIm9wdGltaXN0aWNWZXJzaW9uXCIgfCBcInNlcnZlcldpbnNcIiB8IFwibGFzdFdyaXRlcldpbnNcIiB8IFwiZmllbGRUaHJlZVdheVwiIHwgXCJhcHBlbmRPbmx5XCJ9ICovIChjb25mbGljdFN0cmF0ZWd5KVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJlc291cmNlIHN5bmMgY29uZmxpY3RTdHJhdGVneTogJHtTdHJpbmcoY29uZmxpY3RTdHJhdGVneSl9YClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHN5bmMgb3BlcmF0aW9ucyBpbnRvIGEgc3RhYmxlLCBkdXBsaWNhdGUtZnJlZSBsaXN0LlxuICogQHBhcmFtIHt1bmtub3dufSBvcGVyYXRpb25zIC0gUmF3IG9wZXJhdGlvbnMgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gTm9ybWFsaXplZCBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTeW5jT3BlcmF0aW9ucyhvcGVyYXRpb25zKSB7XG4gIGlmIChvcGVyYXRpb25zID09PSB1bmRlZmluZWQpIHJldHVybiBbXVxuICBpZiAoIUFycmF5LmlzQXJyYXkob3BlcmF0aW9ucykpIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHN5bmMgb3BlcmF0aW9ucyBtdXN0IGJlIGFuIGFycmF5IG9mIG9wZXJhdGlvbiBuYW1lcy5cIilcblxuICBjb25zdCBub3JtYWxpemVkID0gb3BlcmF0aW9ucy5tYXAoKG9wZXJhdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uICE9PSBcInN0cmluZ1wiIHx8IG9wZXJhdGlvbi5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBzeW5jIG9wZXJhdGlvbnMgZW50cmllcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzLlwiKVxuXG4gICAgcmV0dXJuIG9wZXJhdGlvblxuICB9KVxuXG4gIHJldHVybiBbLi4ubmV3IFNldChub3JtYWxpemVkKV0uc29ydCgpXG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGV0ZXJtaW5pc3RpYyBwb2xpY3kgaGFzaC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBIYXNoIGlucHV0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBzaGEyNTYtcHJlZml4ZWQgaGFzaC5cbiAqL1xuZnVuY3Rpb24gc3luY1BvbGljeUhhc2godmFsdWUpIHtcbiAgcmV0dXJuIGBzaGEyNTYtJHtzaGEyNTZIZXgoc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkpfWBcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBTSEEtMjU2IHdpdGhvdXQgaW1wb3J0aW5nIE5vZGUtb25seSBjcnlwdG8gbW9kdWxlcywga2VlcGluZyB0aGlzXG4gKiByZXNvdXJjZS1kZWZpbml0aW9uIG1vZHVsZSBzYWZlIGZvciBFeHBvL2Jyb3dzZXIgYnVuZGxlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVVRGLTggbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSGV4IGRpZ2VzdC5cbiAqL1xuZnVuY3Rpb24gc2hhMjU2SGV4KG1lc3NhZ2UpIHtcbiAgY29uc3QgYnl0ZXMgPSB1dGY4Qnl0ZXMobWVzc2FnZSlcbiAgY29uc3QgcGFkZGVkID0gWy4uLmJ5dGVzXVxuICBjb25zdCBiaXRMZW5ndGggPSBieXRlcy5sZW5ndGggKiA4XG4gIGNvbnN0IGhhc2ggPSBbLi4uU0hBMjU2X0lOSVRJQUxfSEFTSF1cbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3Qgd29yZHMgPSBuZXcgQXJyYXkoNjQpXG5cbiAgcGFkZGVkLnB1c2goMHg4MClcbiAgd2hpbGUgKHBhZGRlZC5sZW5ndGggJSA2NCAhPT0gNTYpIHBhZGRlZC5wdXNoKDApXG5cbiAgY29uc3QgaGlnaExlbmd0aCA9IE1hdGguZmxvb3IoYml0TGVuZ3RoIC8gMHgxMDAwMDAwMDApXG4gIGNvbnN0IGxvd0xlbmd0aCA9IGJpdExlbmd0aCA+Pj4gMFxuXG4gIGZvciAoY29uc3QgdmFsdWUgb2YgW2hpZ2hMZW5ndGgsIGxvd0xlbmd0aF0pIHtcbiAgICBwYWRkZWQucHVzaCgodmFsdWUgPj4+IDI0KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gMTYpICYgMHhmZiwgKHZhbHVlID4+PiA4KSAmIDB4ZmYsIHZhbHVlICYgMHhmZilcbiAgfVxuXG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHBhZGRlZC5sZW5ndGg7IG9mZnNldCArPSA2NCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyAoaSAqIDQpXG5cbiAgICAgIHdvcmRzW2ldID0gKCgocGFkZGVkW2luZGV4XSB8fCAwKSA8PCAyNCkgfCAoKHBhZGRlZFtpbmRleCArIDFdIHx8IDApIDw8IDE2KSB8ICgocGFkZGVkW2luZGV4ICsgMl0gfHwgMCkgPDwgOCkgfCAocGFkZGVkW2luZGV4ICsgM10gfHwgMCkpID4+PiAwXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDE2OyBpIDwgNjQ7IGkrKykge1xuICAgICAgY29uc3QgczAgPSByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMTVdLCA3KSBeIHJvdGF0ZVJpZ2h0KHdvcmRzW2kgLSAxNV0sIDE4KSBeICh3b3Jkc1tpIC0gMTVdID4+PiAzKVxuICAgICAgY29uc3QgczEgPSByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMl0sIDE3KSBeIHJvdGF0ZVJpZ2h0KHdvcmRzW2kgLSAyXSwgMTkpIF4gKHdvcmRzW2kgLSAyXSA+Pj4gMTApXG5cbiAgICAgIHdvcmRzW2ldID0gYWRkMzIod29yZHNbaSAtIDE2XSwgczAsIHdvcmRzW2kgLSA3XSwgczEpXG4gICAgfVxuXG4gICAgbGV0IFthLCBiLCBjLCBkLCBlLCBmLCBnLCBoXSA9IGhhc2hcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgICAgY29uc3QgczEgPSByb3RhdGVSaWdodChlLCA2KSBeIHJvdGF0ZVJpZ2h0KGUsIDExKSBeIHJvdGF0ZVJpZ2h0KGUsIDI1KVxuICAgICAgY29uc3QgY2ggPSAoZSAmIGYpIF4gKCh+ZSkgJiBnKVxuICAgICAgY29uc3QgdGVtcDEgPSBhZGQzMihoLCBzMSwgY2gsIFNIQTI1Nl9LW2ldLCB3b3Jkc1tpXSlcbiAgICAgIGNvbnN0IHMwID0gcm90YXRlUmlnaHQoYSwgMikgXiByb3RhdGVSaWdodChhLCAxMykgXiByb3RhdGVSaWdodChhLCAyMilcbiAgICAgIGNvbnN0IG1haiA9IChhICYgYikgXiAoYSAmIGMpIF4gKGIgJiBjKVxuICAgICAgY29uc3QgdGVtcDIgPSBhZGQzMihzMCwgbWFqKVxuXG4gICAgICBoID0gZ1xuICAgICAgZyA9IGZcbiAgICAgIGYgPSBlXG4gICAgICBlID0gYWRkMzIoZCwgdGVtcDEpXG4gICAgICBkID0gY1xuICAgICAgYyA9IGJcbiAgICAgIGIgPSBhXG4gICAgICBhID0gYWRkMzIodGVtcDEsIHRlbXAyKVxuICAgIH1cblxuICAgIGhhc2hbMF0gPSBhZGQzMihoYXNoWzBdLCBhKVxuICAgIGhhc2hbMV0gPSBhZGQzMihoYXNoWzFdLCBiKVxuICAgIGhhc2hbMl0gPSBhZGQzMihoYXNoWzJdLCBjKVxuICAgIGhhc2hbM10gPSBhZGQzMihoYXNoWzNdLCBkKVxuICAgIGhhc2hbNF0gPSBhZGQzMihoYXNoWzRdLCBlKVxuICAgIGhhc2hbNV0gPSBhZGQzMihoYXNoWzVdLCBmKVxuICAgIGhhc2hbNl0gPSBhZGQzMihoYXNoWzZdLCBnKVxuICAgIGhhc2hbN10gPSBhZGQzMihoYXNoWzddLCBoKVxuICB9XG5cbiAgcmV0dXJuIGhhc2gubWFwKCh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsIFwiMFwiKSkuam9pbihcIlwiKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIFVURi04IGJ5dGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gU3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMge251bWJlcltdfSAtIFVURi04IGJ5dGVzLlxuICovXG5mdW5jdGlvbiB1dGY4Qnl0ZXModmFsdWUpIHtcbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHZhbHVlKSB7XG4gICAgY29uc3QgY29kZVBvaW50ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCkpXG5cbiAgICBpZiAoY29kZVBvaW50IDw9IDB4N2YpIHtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDw9IDB4N2ZmKSB7XG4gICAgICBieXRlcy5wdXNoKDB4YzAgfCAoY29kZVBvaW50ID4+PiA2KSwgMHg4MCB8IChjb2RlUG9pbnQgJiAweDNmKSlcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhlMCB8IChjb2RlUG9pbnQgPj4+IDEyKSwgMHg4MCB8ICgoY29kZVBvaW50ID4+PiA2KSAmIDB4M2YpLCAweDgwIHwgKGNvZGVQb2ludCAmIDB4M2YpKVxuICAgIH0gZWxzZSB7XG4gICAgICBieXRlcy5wdXNoKDB4ZjAgfCAoY29kZVBvaW50ID4+PiAxOCksIDB4ODAgfCAoKGNvZGVQb2ludCA+Pj4gMTIpICYgMHgzZiksIDB4ODAgfCAoKGNvZGVQb2ludCA+Pj4gNikgJiAweDNmKSwgMHg4MCB8IChjb2RlUG9pbnQgJiAweDNmKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuLyoqXG4gKiBBZGRzIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy5cbiAqIEBwYXJhbSB7Li4ubnVtYmVyfSB2YWx1ZXMgLSBWYWx1ZXMgdG8gYWRkLlxuICogQHJldHVybnMge251bWJlcn0gLSBVbnNpZ25lZCAzMi1iaXQgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBhZGQzMiguLi52YWx1ZXMpIHtcbiAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IChzdW0gKyB2YWx1ZSkgPj4+IDAsIDApXG59XG5cbi8qKlxuICogUm90YXRlcyBhIDMyLWJpdCBpbnRlZ2VyIHJpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVmFsdWUgdG8gcm90YXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdHMgLSBCaXQgY291bnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFJvdGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KHZhbHVlLCBiaXRzKSB7XG4gIHJldHVybiAodmFsdWUgPj4+IGJpdHMpIHwgKHZhbHVlIDw8ICgzMiAtIGJpdHMpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGEgc3luYyBjb25maWcgc3VidHJlZSBpcyBkZXRlcm1pbmlzdGljIEpTT04gYW5kIGRvZXMgbm90IGNvbnRhaW4gb2J2aW91cyBzZWNyZXRzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIERpYWdub3N0aWMgcGF0aCBsYWJlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlIHRvIHZhbGlkYXRlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWV9IC0gU3RhYmxlIEpTT04gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWwsIHZhbHVlfSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdmFsdWVcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKChlbnRyeSwgaW5kZXgpID0+IGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2luZGV4fWAsIHZhbHVlOiBlbnRyeX0pKVxuICB9XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkVmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpW2tleV1cblxuICAgICAgaWYgKGNoaWxkVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGlmIChzeW5jQ29uZmlnS2V5TG9va3NTZWNyZXQoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgcG9saWN5ICR7bGFiZWx9LyR7a2V5fSBpcyBub3QgYWxsb3dlZCBpbiBmcm9udGVuZC12aXNpYmxlIHN5bmMgcG9saWN5IGNvbmZpZ2ApXG4gICAgICB9XG5cbiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2tleX1gLCB2YWx1ZTogY2hpbGRWYWx1ZX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlN5bmMgcG9saWN5IGlucHV0IG11c3QgYmUgZGV0ZXJtaW5pc3RpYyBKU09OXCIpXG59XG5cbi8qKlxuICogU3RhYmxlIEpTT04gc3RyaW5naWZpZXIgd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUgdG8gc3RyaW5naWZ5LlxuICogQHJldHVybnMge3N0cmluZ30gLSBTdGFibGUgSlNPTi5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGV0ZXJtaW5pc3RpY1N5bmNKc29uKHtsYWJlbDogXCJoYXNoXCIsIHZhbHVlfSkpXG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgc3luYyBjb25maWcga2V5IGxvb2tzIGxpa2UgYSBjcmVkZW50aWFsL3NlY3JldC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBPYmplY3Qga2V5LlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBrZXkgaXMgZGlzYWxsb3dlZC5cbiAqL1xuZnVuY3Rpb24gc3luY0NvbmZpZ0tleUxvb2tzU2VjcmV0KGtleSkge1xuICByZXR1cm4gL3NlY3JldHx0b2tlbnxwYXNzd29yZHxwcml2YXRlLj9rZXl8c2lnbmluZy4/a2V5L2kudGVzdChrZXkpXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29tbWFuZHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gcmVzb3VyY2VDb25maWd1cmF0aW9uIC0gUmF3IHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7e2J1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGJ1aWx0SW5NZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb21tYW5kTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+LCBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IC0gTm9ybWFsaXplZCBjb21tYW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbW1hbmRzKHJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcbiAgY29uc3QgYnVpbHRJbk1lbWJlckNvbW1hbmRzID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICBjb25zdCBjdXN0b21Db2xsZWN0aW9uQ29tbWFuZHMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uY29sbGVjdGlvbkNvbW1hbmRzXG4gIGNvbnN0IGN1c3RvbU1lbWJlckNvbW1hbmRzID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLm1lbWJlckNvbW1hbmRzXG4gIGNvbnN0IG5vcm1hbGl6ZWRCdWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEJ1aWx0SW5Db21tYW5kcyh7XG4gICAgY29tbWFuZERlZmF1bHRzOiB7XG4gICAgICBjcmVhdGU6IFwiY3JlYXRlXCIsXG4gICAgICBpbmRleDogXCJpbmRleFwiXG4gICAgfSxcbiAgICBjb21tYW5kc0NvbmZpZzogYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyxcbiAgICBtb2RlbE5hbWU6IFwiQ29sbGVjdGlvbkNvbW1hbmRcIlxuICB9KVxuICBjb25zdCBub3JtYWxpemVkQnVpbHRJbk1lbWJlckNvbW1hbmRzID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEJ1aWx0SW5Db21tYW5kcyh7XG4gICAgY29tbWFuZERlZmF1bHRzOiB7XG4gICAgICBhdHRhY2g6IFwiYXR0YWNoXCIsXG4gICAgICBhdHRhY2htZW50TGlzdDogXCJhdHRhY2htZW50TGlzdFwiLFxuICAgICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgICBkb3dubG9hZDogXCJkb3dubG9hZFwiLFxuICAgICAgZmluZDogXCJmaW5kXCIsXG4gICAgICB1cGRhdGU6IFwidXBkYXRlXCIsXG4gICAgICB1cmw6IFwidXJsXCJcbiAgICB9LFxuICAgIGNvbW1hbmRzQ29uZmlnOiBidWlsdEluTWVtYmVyQ29tbWFuZHMsXG4gICAgbW9kZWxOYW1lOiBcIk1lbWJlckNvbW1hbmRcIlxuICB9KVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb2xsZWN0aW9uQ29tbWFuZHMgPSBub3JtYWxpemVGcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZHMoe2NvbW1hbmRzQ29uZmlnOiBjdXN0b21Db2xsZWN0aW9uQ29tbWFuZHMsIG1vZGVsTmFtZTogXCJDb2xsZWN0aW9uQ29tbWFuZFwifSlcbiAgY29uc3Qgbm9ybWFsaXplZE1lbWJlckNvbW1hbmRzID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRzKHtjb21tYW5kc0NvbmZpZzogY3VzdG9tTWVtYmVyQ29tbWFuZHMsIG1vZGVsTmFtZTogXCJNZW1iZXJDb21tYW5kXCJ9KVxuXG4gIHJldHVybiB7XG4gICAgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kczogbm9ybWFsaXplZEJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgYnVpbHRJbk1lbWJlckNvbW1hbmRzOiBub3JtYWxpemVkQnVpbHRJbk1lbWJlckNvbW1hbmRzLFxuICAgIGNvbGxlY3Rpb25Db21tYW5kczogbm9ybWFsaXplZENvbGxlY3Rpb25Db21tYW5kcy5jb21tYW5kcyxcbiAgICBjb21tYW5kTWV0YWRhdGE6IHsuLi5ub3JtYWxpemVkQ29sbGVjdGlvbkNvbW1hbmRzLm1ldGFkYXRhLCAuLi5ub3JtYWxpemVkTWVtYmVyQ29tbWFuZHMubWV0YWRhdGF9LFxuICAgIG1lbWJlckNvbW1hbmRzOiBub3JtYWxpemVkTWVtYmVyQ29tbWFuZHMuY29tbWFuZHNcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIGJ1aWx0IGluIGNvbW1hbmRzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGFyZ3MuY29tbWFuZERlZmF1bHRzIC0gQnVpbHQtaW4gZGVmYXVsdCBjb21tYW5kIG5hbWVzLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gYXJncy5jb21tYW5kc0NvbmZpZyAtIEJ1aWx0LWluIGNvbW1hbmRzIGNvbmZpZyAoY2FtZWxDYXNlIGNvbW1hbmQgdHlwZSBsaXN0KS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIERpYWdub3N0aWMgbW9kZWwgbmFtZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIE5vcm1hbGl6ZWQgYnVpbHQtaW4gY29tbWFuZCBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxCdWlsdEluQ29tbWFuZHMoe2NvbW1hbmREZWZhdWx0cywgY29tbWFuZHNDb25maWcsIG1vZGVsTmFtZX0pIHtcbiAgaWYgKCFjb21tYW5kc0NvbmZpZykge1xuICAgIHJldHVybiBjb21tYW5kRGVmYXVsdHNcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShjb21tYW5kc0NvbmZpZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBjb25maWd1cmF0aW9uIG11c3QgdXNlIHRoZSBhcnJheSBmb3JtLiBPYmplY3QgZm9ybSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmApXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplZCBjb21tYW5kcy5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb21tYW5kcyA9IHt9XG5cbiAgZm9yIChjb25zdCBjb21tYW5kVHlwZSBvZiBjb21tYW5kc0NvbmZpZykge1xuICAgIGNvbnN0IGRlZmF1bHRDb21tYW5kTmFtZSA9IGNvbW1hbmREZWZhdWx0c1tjb21tYW5kVHlwZV1cblxuICAgIGlmICghZGVmYXVsdENvbW1hbmROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYnVpbHQtaW4gZnJvbnRlbmQgbW9kZWwgY29tbWFuZCAnJHtjb21tYW5kVHlwZX0nIGZvciAke21vZGVsTmFtZX1gKVxuICAgIH1cblxuICAgIG5vcm1hbGl6ZWRDb21tYW5kc1tjb21tYW5kVHlwZV0gPSB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbW1hbmROYW1lKHtcbiAgICAgIGNvbW1hbmROYW1lOiBkZWZhdWx0Q29tbWFuZE5hbWUsXG4gICAgICBjb21tYW5kVHlwZTogZGVmYXVsdENvbW1hbmROYW1lLFxuICAgICAgbW9kZWxOYW1lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkQ29tbWFuZHNcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBjdXN0b20gY29tbWFuZHMuIEVudHJpZXMgYXJlIGVpdGhlciBhIHBsYWluXG4gKiBjYW1lbENhc2UgbWV0aG9kLW5hbWUgc3RyaW5nIG9yIGEgYHtuYW1lLCBhcmdzPywgcmV0dXJuVHlwZT99YCBvYmplY3QgdGhhdFxuICogYWxzbyBkZWNsYXJlcyB0aGUgY29tbWFuZCdzIHR5cGVkIGFyZ3VtZW50cyBhbmQvb3IgcmVzcG9uc2UgdHlwZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCB7bmFtZTogc3RyaW5nLCBhcmdzPzogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU/OiBzdHJpbmd9PiB8IHVuZGVmaW5lZH0gYXJncy5jb21tYW5kc0NvbmZpZyAtIEN1c3RvbSBjb21tYW5kcyBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBEaWFnbm9zdGljIG1vZGVsIG5hbWUuXG4gKiBAcmV0dXJucyB7e2NvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59fSAtIFJvdXRlIG1hcCAobWV0aG9kIG5hbWUg4oaSIGtlYmFiIHNsdWcpICsgcGVyLWNvbW1hbmQgbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kcyh7Y29tbWFuZHNDb25maWcsIG1vZGVsTmFtZX0pIHtcbiAgaWYgKCFjb21tYW5kc0NvbmZpZykge1xuICAgIHJldHVybiB7Y29tbWFuZHM6IHt9LCBtZXRhZGF0YToge319XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29tbWFuZHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gY29uZmlndXJhdGlvbiBtdXN0IHVzZSB0aGUgYXJyYXkgZm9ybS4gT2JqZWN0IGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5gKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBjb21tYW5kcyA9IHt9XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59ICovXG4gIGNvbnN0IG1ldGFkYXRhID0ge31cblxuICBmb3IgKGNvbnN0IGNvbW1hbmRFbnRyeSBvZiBjb21tYW5kc0NvbmZpZykge1xuICAgIGNvbnN0IHttZXRob2ROYW1lLCBhcmdzLCByZXR1cm5UeXBlfSA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRW50cnkoe2NvbW1hbmRFbnRyeSwgbW9kZWxOYW1lfSlcbiAgICBjb25zdCB2YWxpZGF0ZWRNZXRob2ROYW1lID0gdmFsaWRhdGVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kTmFtZSh7XG4gICAgICBjb21tYW5kTmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIGNvbW1hbmRUeXBlOiBtZXRob2ROYW1lLFxuICAgICAgbW9kZWxOYW1lXG4gICAgfSlcbiAgICBjb25zdCBjb21tYW5kU2x1ZyA9IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZSh2YWxpZGF0ZWRNZXRob2ROYW1lKSlcblxuICAgIGNvbW1hbmRzW3ZhbGlkYXRlZE1ldGhvZE5hbWVdID0gY29tbWFuZFNsdWdcbiAgICBtZXRhZGF0YVt2YWxpZGF0ZWRNZXRob2ROYW1lXSA9IHthcmdzLCByZXR1cm5UeXBlfVxuICB9XG5cbiAgcmV0dXJuIHtjb21tYW5kcywgbWV0YWRhdGF9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBvbmUgY3VzdG9tLWNvbW1hbmQgZW50cnkgKHN0cmluZyBzaG9ydGhhbmQgb3IgY29udHJhY3Qgb2JqZWN0KS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLmNvbW1hbmRFbnRyeSAtIFJhdyBjb21tYW5kIGVudHJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gRGlhZ25vc3RpYyBtb2RlbCBuYW1lLlxuICogQHJldHVybnMge3ttZXRob2ROYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfX0gLSBNZXRob2QgbmFtZSArIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEVudHJ5KHtjb21tYW5kRW50cnksIG1vZGVsTmFtZX0pIHtcbiAgaWYgKHR5cGVvZiBjb21tYW5kRW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4ge21ldGhvZE5hbWU6IGNvbW1hbmRFbnRyeSwgYXJnczogW10sIHJldHVyblR5cGU6IG51bGx9XG4gIH1cblxuICBpZiAoIWNvbW1hbmRFbnRyeSB8fCB0eXBlb2YgY29tbWFuZEVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29tbWFuZEVudHJ5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IGVudHJpZXMgbXVzdCBiZSBhIGNhbWVsQ2FzZSBuYW1lIHN0cmluZyBvciBhIHtuYW1lLCBhcmdzPywgcmV0dXJuVHlwZT99IG9iamVjdGApXG4gIH1cblxuICBjb25zdCB7bmFtZSwgYXJncywgcmV0dXJuVHlwZSwgLi4ucmVzdH0gPSAvKiogQHR5cGUge3tuYW1lPzogdW5rbm93biwgYXJncz86IHVua25vd24sIHJldHVyblR5cGU/OiB1bmtub3dufX0gKi8gKGNvbW1hbmRFbnRyeSlcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCAke21vZGVsTmFtZX0ga2V5czogJHtPYmplY3Qua2V5cyhyZXN0KS5qb2luKFwiLCBcIil9LiBBbGxvd2VkOiBuYW1lLCBhcmdzLCByZXR1cm5UeXBlYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBvYmplY3QgZW50cmllcyByZXF1aXJlIGEgbm9uLWVtcHR5ICduYW1lJyBzdHJpbmdgKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXRob2ROYW1lOiBuYW1lLFxuICAgIGFyZ3M6IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDb21tYW5kQXJncyh7YXJncywgY29tbWFuZE5hbWU6IG5hbWUsIG1vZGVsTmFtZX0pLFxuICAgIHJldHVyblR5cGU6IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDb21tYW5kUmV0dXJuVHlwZSh7Y29tbWFuZE5hbWU6IG5hbWUsIG1vZGVsTmFtZSwgcmV0dXJuVHlwZX0pXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgYSBjdXN0b20gY29tbWFuZCdzIHR5cGVkLWFyZ3VtZW50IGxpc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy5hcmdzIC0gUmF3IGNvbW1hbmQgYXJncy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQ29tbWFuZCBuYW1lIGZvciBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIERpYWdub3N0aWMgbW9kZWwgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pn0gLSBOb3JtYWxpemVkIHR5cGVkIGNvbW1hbmQgYXJndW1lbnRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ29tbWFuZEFyZ3Moe2FyZ3MsIGNvbW1hbmROYW1lLCBtb2RlbE5hbWV9KSB7XG4gIGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gJyR7Y29tbWFuZE5hbWV9JyBhcmdzIG11c3QgYmUgYW4gYXJyYXkgb2Yge25hbWUsIHR5cGV9IG9iamVjdHNgKVxuICB9XG5cbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBhcmcubmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBhcmcubmFtZS5sZW5ndGggPCAxIHx8IHR5cGVvZiBhcmcudHlwZSAhPT0gXCJzdHJpbmdcIiB8fCBhcmcudHlwZS50cmltKCkubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gJyR7Y29tbWFuZE5hbWV9JyBhcmdzIGVudHJpZXMgcmVxdWlyZSBub24tZW1wdHkgJ25hbWUnIGFuZCBKU0RvYy10eXBlICd0eXBlJyBzdHJpbmdzYClcbiAgICB9XG5cbiAgICByZXR1cm4ge25hbWU6IGFyZy5uYW1lLCB0eXBlOiBhcmcudHlwZS50cmltKCl9XG4gIH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFuZCBub3JtYWxpemVzIGEgY3VzdG9tIGNvbW1hbmQncyBkZWNsYXJlZCBKU0RvYyByZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZE5hbWUgLSBDb21tYW5kIG5hbWUgZm9yIGRpYWdub3N0aWNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gRGlhZ25vc3RpYyBtb2RlbCBuYW1lLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnJldHVyblR5cGUgLSBSYXcgcmV0dXJuIHR5cGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBOb3JtYWxpemVkIEpTRG9jIHJldHVybiB0eXBlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ29tbWFuZFJldHVyblR5cGUoe2NvbW1hbmROYW1lLCBtb2RlbE5hbWUsIHJldHVyblR5cGV9KSB7XG4gIGlmIChyZXR1cm5UeXBlID09PSB1bmRlZmluZWQgfHwgcmV0dXJuVHlwZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAodHlwZW9mIHJldHVyblR5cGUgIT09IFwic3RyaW5nXCIgfHwgcmV0dXJuVHlwZS50cmltKCkubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9ICcke2NvbW1hbmROYW1lfScgcmV0dXJuVHlwZSBtdXN0IGJlIGEgbm9uLWVtcHR5IEpTRG9jIHR5cGUgc3RyaW5nYClcbiAgfVxuXG4gIHJldHVybiByZXR1cm5UeXBlLnRyaW0oKVxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGggaGVscGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcGFyYW0gez99IHJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgcmVzb3VyY2UgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgobW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb24pIHtcbiAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBkZWZpbml0aW9uIGZvciAke21vZGVsTmFtZX1gKVxuICB9XG5cbiAgcmV0dXJuIGAvJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUobW9kZWxOYW1lKSkpfWBcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCBoZWxwZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQ29tbWFuZCBwYXRoIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICogQHBhcmFtIHs/fSBhcmdzLnJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7XCJkZXN0cm95XCIgfCBcImZpbmRcIiB8IFwiaW5kZXhcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCIgfCBudWxsfSAtIEZyb250ZW5kIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kKHtjb21tYW5kTmFtZSwgbW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb259KSB7XG4gIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgZGVmaW5pdGlvbiBmb3IgJHttb2RlbE5hbWV9YClcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FjdGlvbiwgY29uZmlndXJlZENvbW1hbmROYW1lXSBvZiBPYmplY3QuZW50cmllcyh7XG4gICAgLi4ucmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgLi4ucmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICB9KSkge1xuICAgIGlmIChjb25maWd1cmVkQ29tbWFuZE5hbWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgIGNvbnN0IHZhbGlkYXRlZENvbW1hbmROYW1lID0gdmFsaWRhdGVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kTmFtZSh7XG4gICAgICBjb21tYW5kTmFtZTogY29uZmlndXJlZENvbW1hbmROYW1lLFxuICAgICAgY29tbWFuZFR5cGU6IC8qKiBAdHlwZSB7XCJhdHRhY2hcIiB8IFwiY3JlYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiZG93bmxvYWRcIiB8IFwiZmluZFwiIHwgXCJpbmRleFwiIHwgXCJ1cGRhdGVcIiB8IFwidXJsXCJ9ICovIChhY3Rpb24pLFxuICAgICAgbW9kZWxOYW1lXG4gICAgfSlcblxuICAgIGlmIChjb21tYW5kTmFtZSA9PT0gdmFsaWRhdGVkQ29tbWFuZE5hbWUpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1wiYXR0YWNoXCIgfCBcImNyZWF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImRvd25sb2FkXCIgfCBcImZpbmRcIiB8IFwiaW5kZXhcIiB8IFwidXBkYXRlXCIgfCBcInVybFwifSAqLyAoYWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoIGhlbHBlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfSBhcmdzLmJhY2tlbmRQcm9qZWN0cyAtIEJhY2tlbmQgcHJvamVjdHMgdG8gc2Nhbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcmV0dXJucyB7e2NvbW1hbmROYW1lOiBzdHJpbmcsIG1lbWJlcklkPzogc3RyaW5nLCBtZXRob2ROYW1lOiBzdHJpbmcsIG1vZGVsTmFtZTogc3RyaW5nLCByZXNvdXJjZVBhdGg6IHN0cmluZywgc2NvcGU6IFwiY29sbGVjdGlvblwiIHwgXCJtZW1iZXJcIn0gfCBudWxsfSAtIE1hdGNoZWQgY3VzdG9tIGNvbW1hbmQgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgoe2JhY2tlbmRQcm9qZWN0cywgY3VycmVudFBhdGh9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGhGb3JNYXRjaChjdXJyZW50UGF0aClcblxuICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgbW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcmVzb3VyY2VzW21vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGhGb3JNYXRjaChmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKSlcbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJlZml4ID0gYCR7cmVzb3VyY2VQYXRofS9gXG5cbiAgICAgIGlmICghbm9ybWFsaXplZEN1cnJlbnRQYXRoLnN0YXJ0c1dpdGgoZXhwZWN0ZWRQcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IG5vcm1hbGl6ZWRDdXJyZW50UGF0aFxuICAgICAgICAuc2xpY2UoZXhwZWN0ZWRQcmVmaXgubGVuZ3RoKVxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcblxuICAgICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZENvbGxlY3Rpb25Db21tYW5kID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbGxlY3Rpb25Db21tYW5kcylcbiAgICAgICAgICAuZmluZCgoWywgY29tbWFuZE5hbWVdKSA9PiBjb21tYW5kTmFtZSA9PT0gcGF0aFNlZ21lbnRzWzBdKVxuXG4gICAgICAgIGlmIChtYXRjaGVkQ29sbGVjdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWFuZE5hbWU6IG1hdGNoZWRDb2xsZWN0aW9uQ29tbWFuZFsxXSxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IG1hdGNoZWRDb2xsZWN0aW9uQ29tbWFuZFswXSxcbiAgICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlUGF0aCxcbiAgICAgICAgICAgIHNjb3BlOiBcImNvbGxlY3Rpb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBtYXRjaGVkTWVtYmVyQ29tbWFuZCA9IE9iamVjdC5lbnRyaWVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5tZW1iZXJDb21tYW5kcylcbiAgICAgICAgICAuZmluZCgoWywgY29tbWFuZE5hbWVdKSA9PiBjb21tYW5kTmFtZSA9PT0gcGF0aFNlZ21lbnRzWzFdKVxuXG4gICAgICAgIGlmIChtYXRjaGVkTWVtYmVyQ29tbWFuZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21tYW5kTmFtZTogbWF0Y2hlZE1lbWJlckNvbW1hbmRbMV0sXG4gICAgICAgICAgICBtZW1iZXJJZDogZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhTZWdtZW50c1swXSksXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtYXRjaGVkTWVtYmVyQ29tbWFuZFswXSxcbiAgICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlUGF0aCxcbiAgICAgICAgICAgIHNjb3BlOiBcIm1lbWJlclwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBwYXRoIGZvciBtYXRjaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCBwYXRoIHdpdGggbGVhZGluZyBzbGFzaCBhbmQgbm8gdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGhGb3JNYXRjaChwYXRoKSB7XG4gIGNvbnN0IHdpdGhMZWFkaW5nU2xhc2ggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWBcblxuICBpZiAod2l0aExlYWRpbmdTbGFzaC5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2hcbn1cblxuLyoqXG4gKiBSZXNvbHZlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIGEgcmVwbGF5IHJlc291cmNlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb2x2ZWRSZXNvdXJjZVJlZ2lzdHJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsTmFtZSAtIEVmZmVjdGl2ZSBmcm9udGVuZCBtb2RlbCBuYW1lIChtb2RlbE5hbWUgb3ZlcnJpZGUgb3IgcmVnaXN0cnkga2V5KS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBSZWdpc3RlcmVkIHJlc291cmNlIGNsYXNzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcmVnaXN0ZXJlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSBjbGFzcyBmb3IgYSByZXNvdXJjZSB0eXBlXG4gKiBhY3Jvc3MgYWxsIGJhY2tlbmQgcHJvamVjdHMuIEEgcmVzb3VyY2UncyBlZmZlY3RpdmUgbmFtZSBpcyBpdHNcbiAqIGBtb2RlbE5hbWVgIG92ZXJyaWRlIHdoZW4gZGVjbGFyZWQsIG90aGVyd2lzZSBpdHMgcmVnaXN0cnkga2V5IOKAlCBtYXRjaGluZ1xuICoge0BsaW5rIGZyb250ZW5kTW9kZWxTeW5jTWFuaWZlc3RGb3JCYWNrZW5kUHJvamVjdHN9LiBBIHJlZ2lzdHJ5IGtleSBzaGFkb3dlZFxuICogYnkgYSBgbW9kZWxOYW1lYCBvdmVycmlkZSBkb2VzIG5vdCByZXNvbHZlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHt7Z2V0QmFja2VuZFByb2plY3RzOiAoKSA9PiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfX0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBleHBvc2luZyB0aGUgYmFja2VuZCBwcm9qZWN0cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlVHlwZSAtIEZyb250ZW5kIG1vZGVsIG5hbWUgdG8gcmVzb2x2ZS5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUmVzb2x2ZWRSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGx9IFJlc29sdmVkIHJlZ2lzdHJhdGlvbiBvciBudWxsIHdoZW4gdGhlIHJlc291cmNlIHR5cGUgaXMgbm90IHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3Moe2NvbmZpZ3VyYXRpb24sIHJlc291cmNlVHlwZX0pIHtcbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBjb25maWd1cmF0aW9uLmdldEJhY2tlbmRQcm9qZWN0cygpKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgZm9yIChjb25zdCBjb25maWd1cmVkTW9kZWxOYW1lIG9mIE9iamVjdC5rZXlzKHJlc291cmNlcykpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1tjb25maWd1cmVkTW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VDbGFzcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gICAgICBpZiAoIXJlc291cmNlQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgIC8vIENoZWFwIGRpcmVjdC1rZXkgbWlzbWF0Y2ggc2tpcDogb25seSBub3JtYWxpemUgY29uZmlndXJhdGlvbnMgZm9yIHRoZVxuICAgICAgLy8gbWF0Y2hpbmcga2V5IG9yIHdoZW4gYSBtb2RlbE5hbWUgb3ZlcnJpZGUgY291bGQgcmVuYW1lIHRoZSByZXNvdXJjZS5cbiAgICAgIGlmIChjb25maWd1cmVkTW9kZWxOYW1lICE9PSByZXNvdXJjZVR5cGUgJiYgIXJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VTdGF0aWNWYWx1ZShcIm1vZGVsTmFtZVwiKSkgY29udGludWVcblxuICAgICAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIGNvbnRpbnVlXG4gICAgICBpZiAoKHJlc291cmNlQ29uZmlndXJhdGlvbi5tb2RlbE5hbWUgfHwgY29uZmlndXJlZE1vZGVsTmFtZSkgIT09IHJlc291cmNlVHlwZSkgY29udGludWVcblxuICAgICAgcmV0dXJuIHttb2RlbE5hbWU6IHJlc291cmNlVHlwZSwgcmVzb3VyY2VDbGFzcywgcmVzb3VyY2VDb25maWd1cmF0aW9ufVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG4iXX0=
934
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV4Rjs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1DQUFtQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDbkYsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7Q0FDL0MsQ0FBQTtBQUNELE1BQU0sUUFBUSxHQUFHO0lBQ2YsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtDQUMvQyxDQUFBO0FBQ0QsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxXQUFXO0lBQ1gsYUFBYTtJQUNiLFlBQVk7SUFDWiwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtJQUNwQixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxZQUFZO0lBQ1osWUFBWTtJQUNaLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLHNCQUFzQjtJQUN0QixvQkFBb0I7Q0FDckIsQ0FBQyxDQUFBO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1Q0FBdUMsQ0FBQyxjQUFjO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUE7SUFFL0MsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQ3pGLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUE7QUFDWCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQ0FBc0MsQ0FBQyxLQUFLO0lBQzFELE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBSyxLQUFLLHlCQUF5QixJQUFJLEtBQUssQ0FBQyxTQUFTLFlBQVkseUJBQXlCLENBQUMsQ0FBQTtBQUNySSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3Q0FBd0MsQ0FBQyxrQkFBa0I7SUFDekUsT0FBTyxzQ0FBc0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQy9GLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdEQUFnRCxDQUFDLGtCQUFrQjtJQUNqRixJQUFJLENBQUMsc0NBQXNDLENBQUMsa0JBQWtCLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUU1RSxzQ0FBc0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBRTFELE9BQU8sMkNBQTJDLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQTtBQUN6RixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHNDQUFzQyxDQUFDLGFBQWEsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDaEYsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUFFLE9BQU07SUFFdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUMxQix5Q0FBeUMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUV4RCxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtJQUVuRSxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsYUFBYSxDQUFDLElBQUkscUdBQXFHLENBQUMsQ0FBQTtJQUM3SSxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFFMUQsSUFBSSxjQUFjO1FBQUUsc0NBQXNDLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3JGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx5Q0FBeUMsQ0FBQyxhQUFhO0lBQzlELElBQUksWUFBWSxHQUFHLGFBQWEsQ0FBQTtJQUVoQyxPQUFPLFlBQVksSUFBSSxZQUFZLEtBQUsseUJBQXlCLElBQUksWUFBWSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6RyxnQ0FBZ0M7UUFDaEMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUE7UUFFOUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEdBQUcsZ0NBQWdDLENBQUMsRUFBQyxzQkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3JKLENBQUM7UUFFRCxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUVsQyxZQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNwRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsVUFBVTtJQUNyRCxJQUFJLFlBQVksR0FBRyxhQUFhLENBQUE7SUFFaEMsT0FBTyxZQUFZLElBQUksWUFBWSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMzRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUE7UUFFdkYsWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDJDQUEyQyxDQUFDLHFCQUFxQjtJQUN4RSxNQUFNLFFBQVEsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUMsR0FBRyxxQkFBcUIsRUFBQyxDQUFDLENBQUE7SUFFOUUsS0FBSyxNQUFNLEdBQUcsSUFBSTtRQUNoQixXQUFXO1FBQ1gsWUFBWTtRQUNaLGFBQWE7UUFDYiwyQkFBMkI7UUFDM0IsdUJBQXVCO1FBQ3ZCLG9CQUFvQjtRQUNwQixVQUFVO1FBQ1YsZ0JBQWdCO1FBQ2hCLFdBQVc7UUFDWCxZQUFZO1FBQ1osZUFBZTtRQUNmLFFBQVE7UUFDUixNQUFNO0tBQ1AsRUFBRSxDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUV2QixNQUFNLGtCQUFrQixHQUFHLHNDQUFzQyxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDeEYsTUFBTSxJQUFJLEdBQUcsa0NBQWtDLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUV0RSxPQUFPO1FBQ0wsR0FBRyxxQkFBcUI7UUFDeEIsU0FBUyxFQUFFLHVDQUF1QyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQztRQUNuRix5QkFBeUIsRUFBRSxrQkFBa0IsQ0FBQyx5QkFBeUI7UUFDdkUscUJBQXFCLEVBQUUsa0JBQWtCLENBQUMscUJBQXFCO1FBQy9ELGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLGtCQUFrQjtRQUN6RCwyRUFBMkU7UUFDM0UsdUVBQXVFO1FBQ3ZFLHdEQUF3RDtRQUN4RCxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZTtRQUNuRCxjQUFjLEVBQUUsa0JBQWtCLENBQUMsY0FBYztRQUNqRCxJQUFJO0tBQ0wsQ0FBQTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx1Q0FBdUMsQ0FBQyxTQUFTO0lBQ3hELE1BQU0sVUFBVSxHQUFHLG9CQUFvQixFQUFFLENBQUE7SUFFekMsSUFBSSxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU8sVUFBVSxDQUFBO0lBRTlDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwRkFBMEYsQ0FBQyxDQUFBO0lBQzdHLENBQUM7SUFFRCxNQUFNLHVCQUF1QixHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBRXBILElBQUksdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVELEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7UUFDaEMsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUE7UUFDMUUsQ0FBQztRQUVELFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUE7SUFDL0IsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG9CQUFvQjtJQUMzQixPQUFPO1FBQ0wsTUFBTSxFQUFFLFFBQVE7UUFDaEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsSUFBSSxFQUFFLE1BQU07UUFDWixLQUFLLEVBQUUsTUFBTTtRQUNiLE1BQU0sRUFBRSxRQUFRO0tBQ2pCLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwyQ0FBMkMsQ0FBQyxlQUFlO0lBQ3pFLG1IQUFtSDtJQUNuSCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFFbkIsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyx1Q0FBdUMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUV6RSxLQUFLLE1BQU0sbUJBQW1CLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDekQsTUFBTSxxQkFBcUIsR0FBRyxnREFBZ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBRWxHLElBQUksQ0FBQyxxQkFBcUI7Z0JBQUUsU0FBUTtZQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU87Z0JBQUUsU0FBUTtZQUVsRCxNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLElBQUksbUJBQW1CLENBQUE7WUFFeEUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQTtRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLGVBQWU7SUFDdEQsc0NBQXNDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUVwQixLQUFLLE1BQU0sY0FBYyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sZ0JBQWdCLEdBQUcsdUNBQXVDLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFaEYsS0FBSyxNQUFNLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtZQUNoRSxNQUFNLHFCQUFxQixHQUFHLGdEQUFnRCxDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFFbEcsSUFBSSxDQUFDLHFCQUFxQjtnQkFBRSxTQUFRO1lBRXBDLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsSUFBSSxtQkFBbUIsQ0FBQTtZQUN4RSxNQUFNLFlBQVksR0FBRyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFFakgsc0NBQXNDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHO2dCQUNaLFNBQVM7Z0JBQ1QsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQyxVQUFVLElBQUksSUFBSTtnQkFDcEQsVUFBVSxFQUFFLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQztnQkFDaEUsU0FBUyxFQUFFLHFCQUFxQixDQUFDLFNBQVM7Z0JBQzFDLGVBQWUsRUFBRTtvQkFDZixVQUFVLEVBQUUscUJBQXFCLENBQUMseUJBQXlCO29CQUMzRCxNQUFNLEVBQUUscUJBQXFCLENBQUMscUJBQXFCO2lCQUNwRDthQUNGLENBQUE7WUFFRCxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxhQUFhLENBQUE7WUFDekQsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsc0NBQXNDO2dCQUN0QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUE7Z0JBQ2YsS0FBSyxNQUFNLE9BQU8sSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtnQkFDcEIsQ0FBQztnQkFDRCxLQUFLLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtZQUM1QixDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsV0FBVyxDQUFBO1lBQ3JELElBQUksV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxLQUFLLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtZQUNqQyxDQUFDO1lBRUQsTUFBTSxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQztnQkFDaEQsZUFBZSxFQUFFLHFCQUFxQixDQUFDLGVBQWUsSUFBSSxFQUFFO2dCQUM1RCxRQUFRLEVBQUUscUJBQXFCLENBQUMsa0JBQWtCO2dCQUNsRCxZQUFZO2dCQUNaLEtBQUssRUFBRSxZQUFZO2FBQ3BCLENBQUMsQ0FBQTtZQUNGLE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUFDO2dCQUM1QyxlQUFlLEVBQUUscUJBQXFCLENBQUMsZUFBZSxJQUFJLEVBQUU7Z0JBQzVELFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxjQUFjO2dCQUM5QyxZQUFZO2dCQUNaLEtBQUssRUFBRSxRQUFRO2FBQ2hCLENBQUMsQ0FBQTtZQUVGLElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMvRCxzQ0FBc0M7Z0JBQ3RDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQTtnQkFDZixJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxrQkFBa0IsQ0FBQTtnQkFDMUUsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLGNBQWMsQ0FBQTtnQkFDOUQsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7WUFDdkIsQ0FBQztZQUVELElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN4QyxLQUFLLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQTtZQUN6QyxDQUFDO1lBRUQsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUM5RCxzQ0FBc0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNyRSxPQUFPLE1BQU0sQ0FBQTtRQUNmLENBQUMsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2hELENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUMsVUFBVTtJQUNwQyxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRTFCLElBQUksS0FBSyxDQUFBO0lBRVQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUIsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ25HLENBQUM7U0FBTSxJQUFJLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4RCxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNqQyxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3JCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsc0JBQXNCLENBQUMsRUFBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUM7SUFDOUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1FBQ3JELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUMsQ0FBQTtRQUM1RSxNQUFNLElBQUksR0FBRyxLQUFLLEtBQUssUUFBUTtZQUM3QixDQUFDLENBQUMsR0FBRyxZQUFZLFNBQVMsSUFBSSxFQUFFO1lBQ2hDLENBQUMsQ0FBQyxHQUFHLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU3QixzQ0FBc0M7UUFDdEMsTUFBTSxLQUFLLEdBQUc7WUFDWixVQUFVO1lBQ1YsS0FBSztZQUNMLElBQUk7WUFDSixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7U0FDcEIsQ0FBQTtRQUVELElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQTtRQUN4QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxrQ0FBa0MsQ0FBQyxxQkFBcUI7SUFDL0QsTUFBTSxJQUFJLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFBO0lBRXZDLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFBO0lBQ3pELElBQUksSUFBSSxLQUFLLEtBQUs7UUFBRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUE7SUFDNU0sSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxrQ0FBa0MsQ0FBQztZQUN4QyxHQUFHLHFCQUFxQjtZQUN4QixJQUFJLEVBQUUsRUFBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUM7U0FDdEMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUE7SUFDbkYsQ0FBQztJQUVELE1BQU0sRUFBQyxnQkFBZ0IsRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksRUFBQyxHQUFHLHlGQUF5RixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFak0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUZBQW1GLENBQUMsQ0FBQTtJQUMzSixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFBO0lBRXhILE1BQU0sMEJBQTBCLEdBQUcsNkJBQTZCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUNsRixNQUFNLG9CQUFvQixHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDM0gsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtJQUNuSCxNQUFNLHVCQUF1QixHQUFHLGFBQWEsS0FBSyxTQUFTLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDcEgsTUFBTSxTQUFTLEdBQUc7UUFDaEIsZ0JBQWdCLEVBQUUsMEJBQTBCO1FBQzVDLE9BQU87UUFDUCxRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxTQUFTLElBQUksSUFBSTtRQUNsRCxVQUFVLEVBQUUsb0JBQW9CO1FBQ2hDLE1BQU0sRUFBRSxnQkFBZ0I7UUFDeEIsYUFBYSxFQUFFLHVCQUF1QjtLQUN2QyxDQUFBO0lBQ0QsbUdBQW1HO0lBQ25HLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLGdCQUFnQixFQUFFLDBCQUEwQjtRQUM1QyxPQUFPO1FBQ1AsVUFBVSxFQUFFLG9CQUFvQjtRQUNoQyxVQUFVLEVBQUUsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUNyQyxhQUFhLEVBQUUsdUJBQXVCO0tBQ3ZDLENBQUE7SUFFRCxJQUFJLGtCQUFrQixLQUFLLFNBQVM7UUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLDZGQUE2RixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUU5SyxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsNkJBQTZCLENBQUMsZ0JBQWdCO0lBQ3JELElBQUksZ0JBQWdCLEtBQUssU0FBUyxJQUFJLGdCQUFnQixLQUFLLElBQUk7UUFBRSxPQUFPLG1CQUFtQixDQUFBO0lBQzNGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUgsT0FBTyxxR0FBcUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDakksQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsdUJBQXVCLENBQUMsVUFBVTtJQUN6QyxJQUFJLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFBO0lBRWhILE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUM5QyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUE7UUFFekksT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFFRixPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3hDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixPQUFPLFVBQVUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUMxRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxPQUFPO0lBQ3hCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7SUFDekIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDbEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUE7SUFDckMsdUJBQXVCO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRTNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakIsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFO1FBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQTtJQUN0RCxNQUFNLFNBQVMsR0FBRyxTQUFTLEtBQUssQ0FBQyxDQUFBO0lBRWpDLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBRUQsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFFOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakosQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QixNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDakcsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBRWhHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN2RCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUE7UUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDckQsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUU1QixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNuQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN6QixDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzFFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0Qix1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbEUsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QixDQUFDO2FBQU0sSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekksQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxLQUFLLENBQUMsR0FBRyxNQUFNO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSTtJQUM5QixPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMscUJBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDO0lBQzNDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV4SCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZHLENBQUM7SUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUYsNkZBQTZGO1FBQzdGLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTtRQUVyQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxJQUFJLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksR0FBRyx3REFBd0QsQ0FBQyxDQUFBO1lBQ3RHLENBQUM7WUFFRCxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcscUJBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDeEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUE7QUFDakUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQUs7SUFDaEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUE7QUFDdEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEdBQUc7SUFDbkMsT0FBTyxrREFBa0QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDckUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHNDQUFzQyxDQUFDLHFCQUFxQjtJQUNuRSxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDLHlCQUF5QixDQUFBO0lBQ2pGLE1BQU0scUJBQXFCLEdBQUcscUJBQXFCLENBQUMscUJBQXFCLENBQUE7SUFDekUsTUFBTSx3QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQTtJQUN6RSxNQUFNLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLGNBQWMsQ0FBQTtJQUNqRSxNQUFNLG1DQUFtQyxHQUFHLHFDQUFxQyxDQUFDO1FBQ2hGLGVBQWUsRUFBRTtZQUNmLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1NBQ2Y7UUFDRCxjQUFjLEVBQUUseUJBQXlCO1FBQ3pDLFNBQVMsRUFBRSxtQkFBbUI7S0FDL0IsQ0FBQyxDQUFBO0lBQ0YsTUFBTSwrQkFBK0IsR0FBRyxxQ0FBcUMsQ0FBQztRQUM1RSxlQUFlLEVBQUU7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixjQUFjLEVBQUUsZ0JBQWdCO1lBQ2hDLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLElBQUksRUFBRSxNQUFNO1lBQ1osTUFBTSxFQUFFLFFBQVE7WUFDaEIsR0FBRyxFQUFFLEtBQUs7U0FDWDtRQUNELGNBQWMsRUFBRSxxQkFBcUI7UUFDckMsU0FBUyxFQUFFLGVBQWU7S0FDM0IsQ0FBQyxDQUFBO0lBRUYsTUFBTSw0QkFBNEIsR0FBRyxvQ0FBb0MsQ0FBQyxFQUFDLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsQ0FBQyxDQUFBO0lBQ3JKLE1BQU0sd0JBQXdCLEdBQUcsb0NBQW9DLENBQUMsRUFBQyxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQUE7SUFFekksT0FBTztRQUNMLHlCQUF5QixFQUFFLG1DQUFtQztRQUM5RCxxQkFBcUIsRUFBRSwrQkFBK0I7UUFDdEQsa0JBQWtCLEVBQUUsNEJBQTRCLENBQUMsUUFBUTtRQUN6RCxlQUFlLEVBQUUsRUFBQyxHQUFHLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsRUFBQztRQUNqRyxjQUFjLEVBQUUsd0JBQXdCLENBQUMsUUFBUTtLQUNsRCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHFDQUFxQyxDQUFDLEVBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUM7SUFDekYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sZUFBZSxDQUFBO0lBQ3hCLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLDZFQUE2RSxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVEOzt3Q0FFb0M7SUFDcEMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUE7SUFFN0IsS0FBSyxNQUFNLFdBQVcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV2RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxXQUFXLFNBQVMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUM5RixDQUFDO1FBRUQsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEdBQUcsd0NBQXdDLENBQUM7WUFDekUsV0FBVyxFQUFFLGtCQUFrQjtZQUMvQixXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLFNBQVM7U0FDVixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQTtBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG9DQUFvQyxDQUFDLEVBQUMsY0FBYyxFQUFFLFNBQVMsRUFBQztJQUN2RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsT0FBTyxFQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLDZFQUE2RSxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFDbkIscUdBQXFHO0lBQ3JHLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUVuQixLQUFLLE1BQU0sWUFBWSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxHQUFHLHdDQUF3QyxDQUFDLEVBQUMsWUFBWSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7UUFDMUcsTUFBTSxtQkFBbUIsR0FBRyx3Q0FBd0MsQ0FBQztZQUNuRSxXQUFXLEVBQUUsVUFBVTtZQUN2QixXQUFXLEVBQUUsVUFBVTtZQUN2QixTQUFTO1NBQ1YsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQTtRQUVwRixRQUFRLENBQUMsbUJBQW1CLENBQUMsR0FBRyxXQUFXLENBQUE7UUFDM0MsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVELE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUE7QUFDN0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsd0NBQXdDLENBQUMsRUFBQyxZQUFZLEVBQUUsU0FBUyxFQUFDO0lBQ3pFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckMsT0FBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxpRkFBaUYsQ0FBQyxDQUFBO0lBQ2hILENBQUM7SUFFRCxNQUFNLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLEVBQUMsR0FBRyxxRUFBcUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRTlILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLFNBQVMsVUFBVSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtJQUNuSCxDQUFDO0lBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxtREFBbUQsQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLElBQUk7UUFDaEIsSUFBSSxFQUFFLGlDQUFpQyxDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDLENBQUM7UUFDN0UsVUFBVSxFQUFFLHVDQUF1QyxDQUFDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7S0FDaEcsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxpQ0FBaUMsQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFDO0lBQ3ZFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEMsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxLQUFLLFdBQVcsaURBQWlELENBQUMsQ0FBQTtJQUNoRyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6SixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxLQUFLLFdBQVcsdUVBQXVFLENBQUMsQ0FBQTtRQUN0SCxDQUFDO1FBRUQsT0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFDLENBQUE7SUFDaEQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsdUNBQXVDLENBQUMsRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQztJQUNuRixJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsS0FBSyxXQUFXLG9EQUFvRCxDQUFDLENBQUE7SUFDbkcsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxDQUFBO0FBQzFCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCO0lBQ3JFLE1BQU0scUJBQXFCLEdBQUcsZ0RBQWdELENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUVsRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ2hGLENBQUM7SUFFRCxPQUFPLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDM0YsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFDO0lBQ3hGLE1BQU0scUJBQXFCLEdBQUcsZ0RBQWdELENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUVsRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ2hGLENBQUM7SUFFRCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzNELEdBQUcscUJBQXFCLENBQUMseUJBQXlCO1FBQ2xELEdBQUcscUJBQXFCLENBQUMscUJBQXFCO0tBQy9DLENBQUMsRUFBRSxDQUFDO1FBQ0gsSUFBSSxxQkFBcUIsS0FBSyxTQUFTO1lBQUUsU0FBUTtRQUVqRCxNQUFNLG9CQUFvQixHQUFHLHdDQUF3QyxDQUFDO1lBQ3BFLFdBQVcsRUFBRSxxQkFBcUI7WUFDbEMsV0FBVyxFQUFFLGlHQUFpRyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3ZILFNBQVM7U0FDVixDQUFDLENBQUE7UUFFRixJQUFJLFdBQVcsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3pDLE9BQU8saUdBQWlHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FBQyxFQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUM7SUFDOUUsTUFBTSxxQkFBcUIsR0FBRywwQ0FBMEMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVyRixLQUFLLE1BQU0sY0FBYyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLHVDQUF1QyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXpFLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDL0MsTUFBTSxxQkFBcUIsR0FBRyxnREFBZ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBRWxHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQixTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUE7WUFDekgsTUFBTSxjQUFjLEdBQUcsR0FBRyxZQUFZLEdBQUcsQ0FBQTtZQUV6QyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcscUJBQXFCO2lCQUN2QyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztpQkFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQztpQkFDVixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFbEIsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUM7cUJBQ3RGLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUU3RCxJQUFJLHdCQUF3QixFQUFFLENBQUM7b0JBQzdCLE9BQU87d0JBQ0wsV0FBVyxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQzt3QkFDeEMsVUFBVSxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQzt3QkFDdkMsU0FBUzt3QkFDVCxZQUFZO3dCQUNaLEtBQUssRUFBRSxZQUFZO3FCQUNwQixDQUFBO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDO3FCQUM5RSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFFN0QsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO29CQUN6QixPQUFPO3dCQUNMLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7d0JBQ3BDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7d0JBQ25DLFNBQVM7d0JBQ1QsWUFBWTt3QkFDWixLQUFLLEVBQUUsUUFBUTtxQkFDaEIsQ0FBQTtnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsMENBQTBDLENBQUMsSUFBSTtJQUN0RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVqRSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUE7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDO0lBQzdFLEtBQUssTUFBTSxjQUFjLElBQUksYUFBYSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztRQUNoRSxNQUFNLFNBQVMsR0FBRyx1Q0FBdUMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUV6RSxLQUFLLE1BQU0sbUJBQW1CLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDekQsTUFBTSxhQUFhLEdBQUcsd0NBQXdDLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUVsRixJQUFJLENBQUMsYUFBYTtnQkFBRSxTQUFRO1lBRTVCLHdFQUF3RTtZQUN4RSx1RUFBdUU7WUFDdkUsSUFBSSxtQkFBbUIsS0FBSyxZQUFZLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDO2dCQUFFLFNBQVE7WUFFM0csTUFBTSxxQkFBcUIsR0FBRyxnREFBZ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBRWxHLElBQUksQ0FBQyxxQkFBcUI7Z0JBQUUsU0FBUTtZQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxJQUFJLG1CQUFtQixDQUFDLEtBQUssWUFBWTtnQkFBRSxTQUFRO1lBRXZGLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBQyxDQUFBO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWV9IGZyb20gXCIuL3Jlc291cmNlLWNvbmZpZy12YWxpZGF0aW9uLmpzXCJcblxuLyoqXG4gKiBSZXNvbHZlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIGEgcmVwbGF5IHJlc291cmNlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb2x2ZWRSZXNvdXJjZVJlZ2lzdHJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsTmFtZSAtIEVmZmVjdGl2ZSBmcm9udGVuZCBtb2RlbCBuYW1lIChtb2RlbE5hbWUgb3ZlcnJpZGUgb3IgcmVnaXN0cnkga2V5KS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBSZWdpc3RlcmVkIHJlc291cmNlIGNsYXNzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmNvbnN0IEJBU0VfRlJPTlRFTkRfTU9ERUxfQUJJTElUWV9BQ1RJT05TID0gW1wiY3JlYXRlXCIsIFwiZGVzdHJveVwiLCBcInJlYWRcIiwgXCJ1cGRhdGVcIl1cbmNvbnN0IFNIQTI1Nl9JTklUSUFMX0hBU0ggPSBbXG4gIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTlcbl1cbmNvbnN0IFNIQTI1Nl9LID0gW1xuICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LFxuICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LFxuICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLFxuICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LFxuICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLFxuICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LFxuICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG5dXG5jb25zdCBSRVNPVVJDRV9TVEFUSUNfQ09ORklHX0tFWVMgPSBuZXcgU2V0KFtcbiAgXCJhYmlsaXRpZXNcIixcbiAgXCJhdHRhY2htZW50c1wiLFxuICBcImF0dHJpYnV0ZXNcIixcbiAgXCJidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gIFwiYnVpbHRJbk1lbWJlckNvbW1hbmRzXCIsXG4gIFwiY29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gIFwiY29tbWFuZHNcIixcbiAgXCJtZW1iZXJDb21tYW5kc1wiLFxuICBcIm1vZGVsTmFtZVwiLFxuICBcIk1vZGVsQ2xhc3NcIixcbiAgXCJwcmltYXJ5S2V5XCIsXG4gIFwicXVpY2tTZWFyY2hDb2x1bW5zXCIsXG4gIFwicmVsYXRpb25zaGlwc1wiLFxuICBcIlJlcGxheVNlcnZpY2VDbGFzc1wiLFxuICBcInNlcnZlclwiLFxuICBcIlNoYXJlZFJlc291cmNlXCIsXG4gIFwic3luY1wiLFxuICBcInRyYW5zbGF0ZWRBdHRyaWJ1dGVzXCIsXG4gIFwid3JpdGFibGVBdHRyaWJ1dGVzXCJcbl0pXG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0IGhlbHBlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb259IGJhY2tlbmRQcm9qZWN0IC0gQmFja2VuZCBwcm9qZWN0IGNvbmZpZy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZT59IC0gUmVzb3VyY2UgZGVmaW5pdGlvbnMga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICBjb25zdCByZXNvdXJjZXMgPSBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVsc1xuXG4gIGlmIChyZXNvdXJjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVzb3VyY2VzIHx8IHR5cGVvZiByZXNvdXJjZXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYmFja2VuZCBwcm9qZWN0IGZyb250ZW5kTW9kZWxzIG9iamVjdCBidXQgZ290OiAke3Jlc291cmNlc31gKVxuICAgIH1cblxuICAgIHJldHVybiByZXNvdXJjZXNcbiAgfVxuXG4gIHJldHVybiB7fVxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25Jc0NsYXNzIGhlbHBlci5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgcmVzb3VyY2UgZGVmaW5pdGlvbi5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgcmVzb3VyY2UgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uSXNDbGFzcyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgKHZhbHVlID09PSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHx8IHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UpXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbiBoZWxwZXIuXG4gKiBAcGFyYW0gez99IHJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSAtIFJlc291cmNlIGNsYXNzIHdoZW4gZGVmaW5pdGlvbiBpcyBjbGFzcy1iYXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKSB7XG4gIHJldHVybiBmcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uSXNDbGFzcyhyZXNvdXJjZURlZmluaXRpb24pID8gcmVzb3VyY2VEZWZpbml0aW9uIDogbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbiBoZWxwZXIuXG4gKiBAcGFyYW0gez99IHJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiB8IG51bGx9IC0gTm9ybWFsaXplZCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbikge1xuICBpZiAoIWZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25Jc0NsYXNzKHJlc291cmNlRGVmaW5pdGlvbikpIHJldHVybiBudWxsXG5cbiAgYXNzZXJ0UmVzb3VyY2VDb25maWdJc0ZyYW1ld29ya0RlZmluZWQocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uKHJlc291cmNlRGVmaW5pdGlvbi5yZXNvdXJjZUNvbmZpZygpKVxufVxuXG4vKipcbiAqIEVuc3VyZXMgcmVzb3VyY2VzIHVzZSBkZWNsYXJhdGl2ZSBzdGF0aWMgY29uZmlnIHByb3BlcnRpZXMgaW5zdGVhZCBvZiBvdmVycmlkaW5nIHJlc291cmNlQ29uZmlnKCkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSBSZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gKiBAcGFyYW0ge1NldDxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZT59IFt2aXNpdGVkXSAtIEFscmVhZHkgaW5zcGVjdGVkIHNoYXJlZCByZXNvdXJjZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UmVzb3VyY2VDb25maWdJc0ZyYW1ld29ya0RlZmluZWQoUmVzb3VyY2VDbGFzcywgdmlzaXRlZCA9IG5ldyBTZXQoKSkge1xuICBpZiAodmlzaXRlZC5oYXMoUmVzb3VyY2VDbGFzcykpIHJldHVyblxuXG4gIHZpc2l0ZWQuYWRkKFJlc291cmNlQ2xhc3MpXG4gIGFzc2VydEtub3duUmVzb3VyY2VTdGF0aWNDb25maWdQcm9wZXJ0aWVzKFJlc291cmNlQ2xhc3MpXG5cbiAgY29uc3Qgb3duZXIgPSBzdGF0aWNNZXRob2RPd25lckZvcihSZXNvdXJjZUNsYXNzLCBcInJlc291cmNlQ29uZmlnXCIpXG5cbiAgaWYgKG93bmVyICYmIG93bmVyICE9PSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1Jlc291cmNlQ2xhc3MubmFtZX0gb3ZlcnJpZGVzIHN0YXRpYyByZXNvdXJjZUNvbmZpZygpLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBVc2Ugc3RhdGljIHJlc291cmNlIHByb3BlcnRpZXMgaW5zdGVhZC5gKVxuICB9XG5cbiAgY29uc3QgU2hhcmVkUmVzb3VyY2UgPSBSZXNvdXJjZUNsYXNzLnNoYXJlZFJlc291cmNlQ2xhc3MoKVxuXG4gIGlmIChTaGFyZWRSZXNvdXJjZSkgYXNzZXJ0UmVzb3VyY2VDb25maWdJc0ZyYW1ld29ya0RlZmluZWQoU2hhcmVkUmVzb3VyY2UsIHZpc2l0ZWQpXG59XG5cbi8qKlxuICogRW5zdXJlcyBkZWNsYXJhdGl2ZSBzdGF0aWMgcmVzb3VyY2UgY29uZmlnIGRvZXMgbm90IHNpbGVudGx5IGlnbm9yZSB0eXBvcyBvciByZW1vdmVkIGtleXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSBSZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0S25vd25SZXNvdXJjZVN0YXRpY0NvbmZpZ1Byb3BlcnRpZXMoUmVzb3VyY2VDbGFzcykge1xuICBsZXQgY3VycmVudENsYXNzID0gUmVzb3VyY2VDbGFzc1xuXG4gIHdoaWxlIChjdXJyZW50Q2xhc3MgJiYgY3VycmVudENsYXNzICE9PSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlICYmIGN1cnJlbnRDbGFzcyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICBjb25zdCB1bmtub3duU3RhdGljQ29uZmlnID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGN1cnJlbnRDbGFzcykpIHtcbiAgICAgIGlmICghUkVTT1VSQ0VfU1RBVElDX0NPTkZJR19LRVlTLmhhcyhrZXkpKSB1bmtub3duU3RhdGljQ29uZmlnW2tleV0gPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY3VycmVudENsYXNzKSlba2V5XVxuICAgIH1cblxuICAgIHJlc3RBcmdzRXJyb3IodW5rbm93blN0YXRpY0NvbmZpZylcblxuICAgIGN1cnJlbnRDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50Q2xhc3MpXG4gIH1cbn1cblxuLyoqXG4gKiBMb2NhdGVzIHdoaWNoIGNvbnN0cnVjdG9yIG93bnMgYSBzdGF0aWMgbWV0aG9kIGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gUmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHwgbnVsbH0gLSBDbGFzcyB0aGF0IG93bnMgdGhlIHN0YXRpYyBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIHN0YXRpY01ldGhvZE93bmVyRm9yKFJlc291cmNlQ2xhc3MsIG1ldGhvZE5hbWUpIHtcbiAgbGV0IGN1cnJlbnRDbGFzcyA9IFJlc291cmNlQ2xhc3NcblxuICB3aGlsZSAoY3VycmVudENsYXNzICYmIGN1cnJlbnRDbGFzcyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50Q2xhc3MsIG1ldGhvZE5hbWUpKSByZXR1cm4gY3VycmVudENsYXNzXG5cbiAgICBjdXJyZW50Q2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudENsYXNzKVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHJlc291cmNlQ29uZmlndXJhdGlvbiAtIFJhdyByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IC0gTm9ybWFsaXplZCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uKHJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICBjb25zdCByZXN0QXJncyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh7Li4ucmVzb3VyY2VDb25maWd1cmF0aW9ufSlcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbXG4gICAgXCJhYmlsaXRpZXNcIixcbiAgICBcImF0dHJpYnV0ZXNcIixcbiAgICBcImF0dGFjaG1lbnRzXCIsXG4gICAgXCJidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIixcbiAgICBcImNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgIFwiY29tbWFuZHNcIixcbiAgICBcIm1lbWJlckNvbW1hbmRzXCIsXG4gICAgXCJtb2RlbE5hbWVcIixcbiAgICBcInByaW1hcnlLZXlcIixcbiAgICBcInJlbGF0aW9uc2hpcHNcIixcbiAgICBcInNlcnZlclwiLFxuICAgIFwic3luY1wiXG4gIF0pIHtcbiAgICBkZWxldGUgcmVzdEFyZ3Nba2V5XVxuICB9XG5cbiAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICBjb25zdCBub3JtYWxpemVkQ29tbWFuZHMgPSBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24pXG4gIGNvbnN0IHN5bmMgPSBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jKHJlc291cmNlQ29uZmlndXJhdGlvbilcblxuICByZXR1cm4ge1xuICAgIC4uLnJlc291cmNlQ29uZmlndXJhdGlvbixcbiAgICBhYmlsaXRpZXM6IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUFiaWxpdGllcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzKSxcbiAgICBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzOiBub3JtYWxpemVkQ29tbWFuZHMuYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyxcbiAgICBidWlsdEluTWVtYmVyQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb21tYW5kcy5idWlsdEluTWVtYmVyQ29tbWFuZHMsXG4gICAgY29sbGVjdGlvbkNvbW1hbmRzOiBub3JtYWxpemVkQ29tbWFuZHMuY29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIC8vIFBlci1jb21tYW5kIG1ldGFkYXRhICh0eXBlZCBhcmdzICsgZGVjbGFyZWQgcmV0dXJuIHR5cGUpIGtleWVkIGJ5IG1ldGhvZFxuICAgIC8vIG5hbWUsIGRlcml2ZWQgZnJvbSBge25hbWUsIGFyZ3M/LCByZXR1cm5UeXBlP31gIGNvbW1hbmQgZW50cmllcy4gVGhlXG4gICAgLy8gZ2VuZXJhdG9yIHVzZXMgaXQgdG8gdHlwZSBlYWNoIGN1c3RvbSBjb21tYW5kIG1ldGhvZC5cbiAgICBjb21tYW5kTWV0YWRhdGE6IG5vcm1hbGl6ZWRDb21tYW5kcy5jb21tYW5kTWV0YWRhdGEsXG4gICAgbWVtYmVyQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb21tYW5kcy5tZW1iZXJDb21tYW5kcyxcbiAgICBzeW5jXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBhYmlsaXRpZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBhYmlsaXRpZXMgLSBSZXNvdXJjZSBhYmlsaXRpZXMgY29uZmlnIChjYW1lbENhc2UgYWN0aW9uIGxpc3QpLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gTm9ybWFsaXplZCBhYmlsaXRpZXMgY29uZmlnLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXRpZXMoYWJpbGl0aWVzKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBkZWZhdWx0Q3J1ZEFiaWxpdGllcygpXG5cbiAgaWYgKGFiaWxpdGllcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9ybWFsaXplZFxuXG4gIGlmICghQXJyYXkuaXNBcnJheShhYmlsaXRpZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2UgYWJpbGl0aWVzIG11c3QgYmUgYW4gYXJyYXkgb2YgYWN0aW9uIG5hbWVzLiBPYmplY3QgZm9ybSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlwiKVxuICB9XG5cbiAgY29uc3QgZHVwbGljYXRlZEJhc2VBYmlsaXRpZXMgPSBhYmlsaXRpZXMuZmlsdGVyKChhYmlsaXR5KSA9PiBCQVNFX0ZST05URU5EX01PREVMX0FCSUxJVFlfQUNUSU9OUy5pbmNsdWRlcyhhYmlsaXR5KSlcblxuICBpZiAoZHVwbGljYXRlZEJhc2VBYmlsaXRpZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVzb3VyY2UgYWJpbGl0aWVzIG11c3Qgbm90IGluY2x1ZGUgYmFzZSBhY3Rpb25zOiAke2R1cGxpY2F0ZWRCYXNlQWJpbGl0aWVzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgZm9yIChjb25zdCBhYmlsaXR5IG9mIGFiaWxpdGllcykge1xuICAgIGlmICh0eXBlb2YgYWJpbGl0eSAhPT0gXCJzdHJpbmdcIiB8fCBhYmlsaXR5Lmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIGFiaWxpdGllcyBlbnRyaWVzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3MuXCIpXG4gICAgfVxuXG4gICAgbm9ybWFsaXplZFthYmlsaXR5XSA9IGFiaWxpdHlcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogUnVucyBkZWZhdWx0IGNydWQgYWJpbGl0aWVzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gRGVmYXVsdCBDUlVEIGFiaWxpdHkgbWFwLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0Q3J1ZEFiaWxpdGllcygpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IFwiY3JlYXRlXCIsXG4gICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgZmluZDogXCJyZWFkXCIsXG4gICAgaW5kZXg6IFwicmVhZFwiLFxuICAgIHVwZGF0ZTogXCJ1cGRhdGVcIlxuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZnJvbnRlbmQtc2FmZSBzeW5jIG1hbmlmZXN0IGZvciBhbGwgc3luYy1lbmFibGVkIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX0gYmFja2VuZFByb2plY3RzIC0gQmFja2VuZCBwcm9qZWN0cyB0byBzY2FuLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uPn0gLSBTeW5jIG1ldGFkYXRhIGtleWVkIGJ5IG1vZGVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsU3luY01hbmlmZXN0Rm9yQmFja2VuZFByb2plY3RzKGJhY2tlbmRQcm9qZWN0cykge1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uPn0gKi9cbiAgY29uc3QgbWFuaWZlc3QgPSB7fVxuXG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgZm9yIChjb25zdCBjb25maWd1cmVkTW9kZWxOYW1lIG9mIE9iamVjdC5rZXlzKHJlc291cmNlcykuc29ydCgpKSB7XG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbY29uZmlndXJlZE1vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSBjb250aW51ZVxuICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24uc3luYz8uZW5hYmxlZCkgY29udGludWVcblxuICAgICAgY29uc3QgbW9kZWxOYW1lID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLm1vZGVsTmFtZSB8fCBjb25maWd1cmVkTW9kZWxOYW1lXG5cbiAgICAgIG1hbmlmZXN0W21vZGVsTmFtZV0gPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uc3luY1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYW5pZmVzdFxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGZyb250ZW5kLXNhZmUgQVBJIG1hbmlmZXN0IGZvciBhbGwgcmVnaXN0ZXJlZCBmcm9udGVuZC1tb2RlbFxuICogcmVzb3VyY2VzLiBUaGUgbWFuaWZlc3QgaXMgZGV0ZXJtaW5pc3RpYyAoc29ydGVkIG1vZGVsIG5hbWVzLCBzb3J0ZWRcbiAqIGF0dHJpYnV0ZXMsIHNvcnRlZCBjb21tYW5kcykgYW5kIGluY2x1ZGVzIG9ubHkgcHVibGljLXNhZmUgbWV0YWRhdGE6IG5vXG4gKiBzZWNyZXRzLCBubyBzZXJ2ZXIgY2FsbGJhY2tzLCBubyBiYWNrZW5kIGZpbGUgcGF0aHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uW119IGJhY2tlbmRQcm9qZWN0cyAtIEJhY2tlbmQgcHJvamVjdHMgdG8gc2Nhbi5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gLSBGcm9udGVuZC1zYWZlIEFQSSBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxBcGlNYW5pZmVzdChiYWNrZW5kUHJvamVjdHMpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgY29uc3QgcmVzb3VyY2VzID0ge31cblxuICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgIGNvbnN0IHByb2plY3RSZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IGNvbmZpZ3VyZWRNb2RlbE5hbWUgb2YgT2JqZWN0LmtleXMocHJvamVjdFJlc291cmNlcykuc29ydCgpKSB7XG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSBwcm9qZWN0UmVzb3VyY2VzW2NvbmZpZ3VyZWRNb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbikgY29udGludWVcblxuICAgICAgY29uc3QgbW9kZWxOYW1lID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLm1vZGVsTmFtZSB8fCBjb25maWd1cmVkTW9kZWxOYW1lXG4gICAgICBjb25zdCByZXNvdXJjZVBhdGggPSBgLyR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNvbmZpZ3VyZWRNb2RlbE5hbWUpKSl9YFxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgcGF0aDogcmVzb3VyY2VQYXRoLFxuICAgICAgICBwcmltYXJ5S2V5OiByZXNvdXJjZUNvbmZpZ3VyYXRpb24ucHJpbWFyeUtleSB8fCBcImlkXCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IG1hbmlmZXN0QXR0cmlidXRlcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlcyksXG4gICAgICAgIGFiaWxpdGllczogcmVzb3VyY2VDb25maWd1cmF0aW9uLmFiaWxpdGllcyxcbiAgICAgICAgYnVpbHRJbkNvbW1hbmRzOiB7XG4gICAgICAgICAgY29sbGVjdGlvbjogcmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgICAgICAgbWVtYmVyOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYnVpbHRJbk1lbWJlckNvbW1hbmRzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5yZWxhdGlvbnNoaXBzXG4gICAgICBpZiAocmVsYXRpb25zaGlwcyAmJiByZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICAgICAgY29uc3QgcmVscyA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgcmVsTmFtZSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgICAgcmVsc1tyZWxOYW1lXSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgZW50cnkucmVsYXRpb25zaGlwcyA9IHJlbHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYXR0YWNobWVudHNcbiAgICAgIGlmIChhdHRhY2htZW50cyAmJiBPYmplY3Qua2V5cyhhdHRhY2htZW50cykubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnRyeS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25Db21tYW5kcyA9IG1hbmlmZXN0Q29tbWFuZEVudHJpZXMoe1xuICAgICAgICBjb21tYW5kTWV0YWRhdGE6IHJlc291cmNlQ29uZmlndXJhdGlvbi5jb21tYW5kTWV0YWRhdGEgfHwge30sXG4gICAgICAgIGNvbW1hbmRzOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uY29sbGVjdGlvbkNvbW1hbmRzLFxuICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgIHNjb3BlOiBcImNvbGxlY3Rpb25cIlxuICAgICAgfSlcbiAgICAgIGNvbnN0IG1lbWJlckNvbW1hbmRzID0gbWFuaWZlc3RDb21tYW5kRW50cmllcyh7XG4gICAgICAgIGNvbW1hbmRNZXRhZGF0YTogcmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbW1hbmRNZXRhZGF0YSB8fCB7fSxcbiAgICAgICAgY29tbWFuZHM6IHJlc291cmNlQ29uZmlndXJhdGlvbi5tZW1iZXJDb21tYW5kcyxcbiAgICAgICAgcmVzb3VyY2VQYXRoLFxuICAgICAgICBzY29wZTogXCJtZW1iZXJcIlxuICAgICAgfSlcblxuICAgICAgaWYgKGNvbGxlY3Rpb25Db21tYW5kcy5sZW5ndGggPiAwIHx8IG1lbWJlckNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICAgICAgY29uc3QgY21kcyA9IHt9XG4gICAgICAgIGlmIChjb2xsZWN0aW9uQ29tbWFuZHMubGVuZ3RoID4gMCkgY21kc1tcImNvbGxlY3Rpb25cIl0gPSBjb2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgICAgaWYgKG1lbWJlckNvbW1hbmRzLmxlbmd0aCA+IDApIGNtZHNbXCJtZW1iZXJcIl0gPSBtZW1iZXJDb21tYW5kc1xuICAgICAgICBlbnRyeS5jb21tYW5kcyA9IGNtZHNcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jPy5lbmFibGVkKSB7XG4gICAgICAgIGVudHJ5LnN5bmMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uc3luY1xuICAgICAgfVxuXG4gICAgICByZXNvdXJjZXNbY29uZmlndXJlZE1vZGVsTmFtZV0gPSBlbnRyeVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0VmVyc2lvbjogMSxcbiAgICByZXNvdXJjZXM6IE9iamVjdC5rZXlzKHJlc291cmNlcykuc29ydCgpLnJlZHVjZSgoc29ydGVkLCBrZXkpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzb3J0ZWQpW2tleV0gPSByZXNvdXJjZXNba2V5XVxuICAgICAgcmV0dXJuIHNvcnRlZFxuICAgIH0sIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh7fSkpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHJlc291cmNlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBpbnRvIGEgc29ydGVkIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gez99IGF0dHJpYnV0ZXMgLSBSYXcgYXR0cmlidXRlcyBjb25maWcgKGFycmF5IG9yIG9iamVjdCkuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU29ydGVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbWFuaWZlc3RBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHtcbiAgaWYgKCFhdHRyaWJ1dGVzKSByZXR1cm4gW11cblxuICBsZXQgbmFtZXNcblxuICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgIG5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyBlbnRyeSA6IGVudHJ5Lm5hbWUpLmZpbHRlcihCb29sZWFuKVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBuYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gbmFtZXMuc29ydCgpXG59XG5cbi8qKlxuICogQnVpbGRzIG1hbmlmZXN0LXNhZmUgY29tbWFuZCBlbnRyeSBsaXN0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSBhcmdzLmNvbW1hbmRNZXRhZGF0YSAtIFBlci1jb21tYW5kIG1ldGFkYXRhLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLmNvbW1hbmRzIC0gTWV0aG9kIG5hbWUg4oaSIGtlYmFiIHNsdWcgbWFwLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VQYXRoIC0gUmVzb3VyY2UgcGF0aC5cbiAqIEBwYXJhbSB7XCJjb2xsZWN0aW9uXCIgfCBcIm1lbWJlclwifSBhcmdzLnNjb3BlIC0gQ29tbWFuZCBzY29wZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdfSAtIE1hbmlmZXN0IGNvbW1hbmQgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gbWFuaWZlc3RDb21tYW5kRW50cmllcyh7Y29tbWFuZE1ldGFkYXRhLCBjb21tYW5kcywgcmVzb3VyY2VQYXRoLCBzY29wZX0pIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbW1hbmRzKS5zb3J0KCkubWFwKChtZXRob2ROYW1lKSA9PiB7XG4gICAgY29uc3Qgc2x1ZyA9IGNvbW1hbmRzW21ldGhvZE5hbWVdXG4gICAgY29uc3QgbWV0YWRhdGEgPSBjb21tYW5kTWV0YWRhdGFbbWV0aG9kTmFtZV0gfHwge2FyZ3M6IFtdLCByZXR1cm5UeXBlOiBudWxsfVxuICAgIGNvbnN0IHBhdGggPSBzY29wZSA9PT0gXCJtZW1iZXJcIlxuICAgICAgPyBgJHtyZXNvdXJjZVBhdGh9LzxpZD4vJHtzbHVnfWBcbiAgICAgIDogYCR7cmVzb3VyY2VQYXRofS8ke3NsdWd9YFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBzY29wZSxcbiAgICAgIHBhdGgsXG4gICAgICBhcmdzOiBtZXRhZGF0YS5hcmdzXG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnJldHVyblR5cGUpIHtcbiAgICAgIGVudHJ5LnJldHVyblR5cGUgPSBtZXRhZGF0YS5yZXR1cm5UeXBlXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5XG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBzeW5jIHBvbGljeSBtZXRhZGF0YSBhbmQgY29tcHV0ZXMgYSBkZXRlcm1pbmlzdGljIGhhc2ggZnJvbSBzYWZlIHBvbGljeSBpbnB1dHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gcmVzb3VyY2VDb25maWd1cmF0aW9uIC0gUmF3IHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWR9IC0gRnJvbnRlbmQtc2FmZSBzeW5jIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jKHJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICBjb25zdCBzeW5jID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLnN5bmNcblxuICBpZiAoc3luYyA9PT0gdW5kZWZpbmVkIHx8IHN5bmMgPT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHN5bmMgPT09IGZhbHNlKSByZXR1cm4ge2NvbmZsaWN0U3RyYXRlZ3k6IFwib3B0aW1pc3RpY1ZlcnNpb25cIiwgZW5hYmxlZDogZmFsc2UsIG9wZXJhdGlvbnM6IFtdLCBwb2xpY3lIYXNoOiBzeW5jUG9saWN5SGFzaCh7Y29uZmxpY3RTdHJhdGVneTogXCJvcHRpbWlzdGljVmVyc2lvblwiLCBlbmFibGVkOiBmYWxzZX0pLCBwb2xpY3lWZXJzaW9uOiBudWxsfVxuICBpZiAoc3luYyA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jKHtcbiAgICAgIC4uLnJlc291cmNlQ29uZmlndXJhdGlvbixcbiAgICAgIHN5bmM6IHtvcGVyYXRpb25zOiBbXCJpbmRleFwiLCBcImZpbmRcIl19XG4gICAgfSlcbiAgfVxuICBpZiAoIXN5bmMgfHwgdHlwZW9mIHN5bmMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzeW5jKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHN5bmMgY29uZmlndXJhdGlvbiBtdXN0IGJlIHRydWUsIGZhbHNlLCBvciBhbiBvYmplY3QuXCIpXG4gIH1cblxuICBjb25zdCB7Y29uZmxpY3RTdHJhdGVneSwgZW5hYmxlZCA9IHRydWUsIG1ldGFkYXRhLCBvcGVyYXRpb25zLCBwb2xpY3ksIHBvbGljeVZlcnNpb24sIC4uLnJlc3R9ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9ufSAqLyAoc3luYylcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBzeW5jIGtleXM6ICR7T2JqZWN0LmtleXMocmVzdCkuam9pbihcIiwgXCIpfS4gQWxsb3dlZDogY29uZmxpY3RTdHJhdGVneSwgZW5hYmxlZCwgbWV0YWRhdGEsIG9wZXJhdGlvbnMsIHBvbGljeSwgcG9saWN5VmVyc2lvbmApXG4gIH1cbiAgaWYgKGVuYWJsZWQgIT09IHRydWUgJiYgZW5hYmxlZCAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHN5bmMgZW5hYmxlZCBtdXN0IGJlIHRydWUgb3IgZmFsc2Ugd2hlbiBwcm92aWRlZC5cIilcblxuICBjb25zdCBub3JtYWxpemVkQ29uZmxpY3RTdHJhdGVneSA9IG5vcm1hbGl6ZVN5bmNDb25mbGljdFN0cmF0ZWd5KGNvbmZsaWN0U3RyYXRlZ3kpXG4gIGNvbnN0IG5vcm1hbGl6ZWRPcGVyYXRpb25zID0gbm9ybWFsaXplU3luY09wZXJhdGlvbnMob3BlcmF0aW9ucylcbiAgY29uc3Qgbm9ybWFsaXplZE1ldGFkYXRhID0gbWV0YWRhdGEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWw6IFwibWV0YWRhdGFcIiwgdmFsdWU6IG1ldGFkYXRhfSlcbiAgY29uc3Qgbm9ybWFsaXplZFBvbGljeSA9IHBvbGljeSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGV0ZXJtaW5pc3RpY1N5bmNKc29uKHtsYWJlbDogXCJwb2xpY3lcIiwgdmFsdWU6IHBvbGljeX0pXG4gIGNvbnN0IG5vcm1hbGl6ZWRQb2xpY3lWZXJzaW9uID0gcG9saWN5VmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IHBvbGljeVZlcnNpb24gPT09IG51bGwgPyBudWxsIDogU3RyaW5nKHBvbGljeVZlcnNpb24pXG4gIGNvbnN0IGhhc2hJbnB1dCA9IHtcbiAgICBjb25mbGljdFN0cmF0ZWd5OiBub3JtYWxpemVkQ29uZmxpY3RTdHJhdGVneSxcbiAgICBlbmFibGVkLFxuICAgIG1ldGFkYXRhOiBub3JtYWxpemVkTWV0YWRhdGEsXG4gICAgbW9kZWxOYW1lOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IG51bGwsXG4gICAgb3BlcmF0aW9uczogbm9ybWFsaXplZE9wZXJhdGlvbnMsXG4gICAgcG9saWN5OiBub3JtYWxpemVkUG9saWN5LFxuICAgIHBvbGljeVZlcnNpb246IG5vcm1hbGl6ZWRQb2xpY3lWZXJzaW9uXG4gIH1cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBjb25mbGljdFN0cmF0ZWd5OiBub3JtYWxpemVkQ29uZmxpY3RTdHJhdGVneSxcbiAgICBlbmFibGVkLFxuICAgIG9wZXJhdGlvbnM6IG5vcm1hbGl6ZWRPcGVyYXRpb25zLFxuICAgIHBvbGljeUhhc2g6IHN5bmNQb2xpY3lIYXNoKGhhc2hJbnB1dCksXG4gICAgcG9saWN5VmVyc2lvbjogbm9ybWFsaXplZFBvbGljeVZlcnNpb25cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkTWV0YWRhdGEgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5tZXRhZGF0YSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChub3JtYWxpemVkTWV0YWRhdGEpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBzeW5jIGNvbmZsaWN0IHN0cmF0ZWd5IGZvciByZXBsYXkgY2xpZW50cy9zZXJ2ZXJzLlxuICogQHBhcmFtIHt1bmtub3dufSBjb25mbGljdFN0cmF0ZWd5IC0gUmF3IHN0cmF0ZWd5LlxuICogQHJldHVybnMge1wib3B0aW1pc3RpY1ZlcnNpb25cIiB8IFwic2VydmVyV2luc1wiIHwgXCJsYXN0V3JpdGVyV2luc1wiIHwgXCJmaWVsZFRocmVlV2F5XCIgfCBcImFwcGVuZE9ubHlcIn0gLSBOb3JtYWxpemVkIHN0cmF0ZWd5LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTeW5jQ29uZmxpY3RTdHJhdGVneShjb25mbGljdFN0cmF0ZWd5KSB7XG4gIGlmIChjb25mbGljdFN0cmF0ZWd5ID09PSB1bmRlZmluZWQgfHwgY29uZmxpY3RTdHJhdGVneSA9PT0gbnVsbCkgcmV0dXJuIFwib3B0aW1pc3RpY1ZlcnNpb25cIlxuICBpZiAoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCIsIFwibGFzdFdyaXRlcldpbnNcIiwgXCJmaWVsZFRocmVlV2F5XCIsIFwiYXBwZW5kT25seVwiXS5pbmNsdWRlcyhTdHJpbmcoY29uZmxpY3RTdHJhdGVneSkpKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7XCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIgfCBcImxhc3RXcml0ZXJXaW5zXCIgfCBcImZpZWxkVGhyZWVXYXlcIiB8IFwiYXBwZW5kT25seVwifSAqLyAoY29uZmxpY3RTdHJhdGVneSlcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZXNvdXJjZSBzeW5jIGNvbmZsaWN0U3RyYXRlZ3k6ICR7U3RyaW5nKGNvbmZsaWN0U3RyYXRlZ3kpfWApXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBzeW5jIG9wZXJhdGlvbnMgaW50byBhIHN0YWJsZSwgZHVwbGljYXRlLWZyZWUgbGlzdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gb3BlcmF0aW9ucyAtIFJhdyBvcGVyYXRpb25zIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgb3BlcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU3luY09wZXJhdGlvbnMob3BlcmF0aW9ucykge1xuICBpZiAob3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW11cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBzeW5jIG9wZXJhdGlvbnMgbXVzdCBiZSBhbiBhcnJheSBvZiBvcGVyYXRpb24gbmFtZXMuXCIpXG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBvcGVyYXRpb24ubGVuZ3RoIDwgMSkgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2Ugc3luYyBvcGVyYXRpb25zIGVudHJpZXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy5cIilcblxuICAgIHJldHVybiBvcGVyYXRpb25cbiAgfSlcblxuICByZXR1cm4gWy4uLm5ldyBTZXQobm9ybWFsaXplZCldLnNvcnQoKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGVybWluaXN0aWMgcG9saWN5IGhhc2guXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gSGFzaCBpbnB1dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gc2hhMjU2LXByZWZpeGVkIGhhc2guXG4gKi9cbmZ1bmN0aW9uIHN5bmNQb2xpY3lIYXNoKHZhbHVlKSB7XG4gIHJldHVybiBgc2hhMjU2LSR7c2hhMjU2SGV4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKX1gXG59XG5cbi8qKlxuICogQ29tcHV0ZXMgU0hBLTI1NiB3aXRob3V0IGltcG9ydGluZyBOb2RlLW9ubHkgY3J5cHRvIG1vZHVsZXMsIGtlZXBpbmcgdGhpc1xuICogcmVzb3VyY2UtZGVmaW5pdGlvbiBtb2R1bGUgc2FmZSBmb3IgRXhwby9icm93c2VyIGJ1bmRsZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFVURi04IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEhleCBkaWdlc3QuXG4gKi9cbmZ1bmN0aW9uIHNoYTI1NkhleChtZXNzYWdlKSB7XG4gIGNvbnN0IGJ5dGVzID0gdXRmOEJ5dGVzKG1lc3NhZ2UpXG4gIGNvbnN0IHBhZGRlZCA9IFsuLi5ieXRlc11cbiAgY29uc3QgYml0TGVuZ3RoID0gYnl0ZXMubGVuZ3RoICogOFxuICBjb25zdCBoYXNoID0gWy4uLlNIQTI1Nl9JTklUSUFMX0hBU0hdXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGNvbnN0IHdvcmRzID0gbmV3IEFycmF5KDY0KVxuXG4gIHBhZGRlZC5wdXNoKDB4ODApXG4gIHdoaWxlIChwYWRkZWQubGVuZ3RoICUgNjQgIT09IDU2KSBwYWRkZWQucHVzaCgwKVxuXG4gIGNvbnN0IGhpZ2hMZW5ndGggPSBNYXRoLmZsb29yKGJpdExlbmd0aCAvIDB4MTAwMDAwMDAwKVxuICBjb25zdCBsb3dMZW5ndGggPSBiaXRMZW5ndGggPj4+IDBcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFtoaWdoTGVuZ3RoLCBsb3dMZW5ndGhdKSB7XG4gICAgcGFkZGVkLnB1c2goKHZhbHVlID4+PiAyNCkgJiAweGZmLCAodmFsdWUgPj4+IDE2KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gOCkgJiAweGZmLCB2YWx1ZSAmIDB4ZmYpXG4gIH1cblxuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwYWRkZWQubGVuZ3RoOyBvZmZzZXQgKz0gNjQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgKGkgKiA0KVxuXG4gICAgICB3b3Jkc1tpXSA9ICgoKHBhZGRlZFtpbmRleF0gfHwgMCkgPDwgMjQpIHwgKChwYWRkZWRbaW5kZXggKyAxXSB8fCAwKSA8PCAxNikgfCAoKHBhZGRlZFtpbmRleCArIDJdIHx8IDApIDw8IDgpIHwgKHBhZGRlZFtpbmRleCArIDNdIHx8IDApKSA+Pj4gMFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDY0OyBpKyspIHtcbiAgICAgIGNvbnN0IHMwID0gcm90YXRlUmlnaHQod29yZHNbaSAtIDE1XSwgNykgXiByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMTVdLCAxOCkgXiAod29yZHNbaSAtIDE1XSA+Pj4gMylcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQod29yZHNbaSAtIDJdLCAxNykgXiByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMl0sIDE5KSBeICh3b3Jkc1tpIC0gMl0gPj4+IDEwKVxuXG4gICAgICB3b3Jkc1tpXSA9IGFkZDMyKHdvcmRzW2kgLSAxNl0sIHMwLCB3b3Jkc1tpIC0gN10sIHMxKVxuICAgIH1cblxuICAgIGxldCBbYSwgYiwgYywgZCwgZSwgZiwgZywgaF0gPSBoYXNoXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY0OyBpKyspIHtcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQoZSwgNikgXiByb3RhdGVSaWdodChlLCAxMSkgXiByb3RhdGVSaWdodChlLCAyNSlcbiAgICAgIGNvbnN0IGNoID0gKGUgJiBmKSBeICgofmUpICYgZylcbiAgICAgIGNvbnN0IHRlbXAxID0gYWRkMzIoaCwgczEsIGNoLCBTSEEyNTZfS1tpXSwgd29yZHNbaV0pXG4gICAgICBjb25zdCBzMCA9IHJvdGF0ZVJpZ2h0KGEsIDIpIF4gcm90YXRlUmlnaHQoYSwgMTMpIF4gcm90YXRlUmlnaHQoYSwgMjIpXG4gICAgICBjb25zdCBtYWogPSAoYSAmIGIpIF4gKGEgJiBjKSBeIChiICYgYylcbiAgICAgIGNvbnN0IHRlbXAyID0gYWRkMzIoczAsIG1hailcblxuICAgICAgaCA9IGdcbiAgICAgIGcgPSBmXG4gICAgICBmID0gZVxuICAgICAgZSA9IGFkZDMyKGQsIHRlbXAxKVxuICAgICAgZCA9IGNcbiAgICAgIGMgPSBiXG4gICAgICBiID0gYVxuICAgICAgYSA9IGFkZDMyKHRlbXAxLCB0ZW1wMilcbiAgICB9XG5cbiAgICBoYXNoWzBdID0gYWRkMzIoaGFzaFswXSwgYSlcbiAgICBoYXNoWzFdID0gYWRkMzIoaGFzaFsxXSwgYilcbiAgICBoYXNoWzJdID0gYWRkMzIoaGFzaFsyXSwgYylcbiAgICBoYXNoWzNdID0gYWRkMzIoaGFzaFszXSwgZClcbiAgICBoYXNoWzRdID0gYWRkMzIoaGFzaFs0XSwgZSlcbiAgICBoYXNoWzVdID0gYWRkMzIoaGFzaFs1XSwgZilcbiAgICBoYXNoWzZdID0gYWRkMzIoaGFzaFs2XSwgZylcbiAgICBoYXNoWzddID0gYWRkMzIoaGFzaFs3XSwgaClcbiAgfVxuXG4gIHJldHVybiBoYXNoLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIikpLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyB0byBVVEYtOCBieXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFN0cmluZyB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJbXX0gLSBVVEYtOCBieXRlcy5cbiAqL1xuZnVuY3Rpb24gdXRmOEJ5dGVzKHZhbHVlKSB7XG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICBmb3IgKGNvbnN0IGNoYXJhY3RlciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2hhcmFjdGVyLmNvZGVQb2ludEF0KDApKVxuXG4gICAgaWYgKGNvZGVQb2ludCA8PSAweDdmKSB7XG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8PSAweDdmZikge1xuICAgICAgYnl0ZXMucHVzaCgweGMwIHwgKGNvZGVQb2ludCA+Pj4gNiksIDB4ODAgfCAoY29kZVBvaW50ICYgMHgzZikpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICBieXRlcy5wdXNoKDB4ZTAgfCAoY29kZVBvaW50ID4+PiAxMiksIDB4ODAgfCAoKGNvZGVQb2ludCA+Pj4gNikgJiAweDNmKSwgMHg4MCB8IChjb2RlUG9pbnQgJiAweDNmKSlcbiAgICB9IGVsc2Uge1xuICAgICAgYnl0ZXMucHVzaCgweGYwIHwgKGNvZGVQb2ludCA+Pj4gMTgpLCAweDgwIHwgKChjb2RlUG9pbnQgPj4+IDEyKSAmIDB4M2YpLCAweDgwIHwgKChjb2RlUG9pbnQgPj4+IDYpICYgMHgzZiksIDB4ODAgfCAoY29kZVBvaW50ICYgMHgzZikpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbi8qKlxuICogQWRkcyB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuXG4gKiBAcGFyYW0gey4uLm51bWJlcn0gdmFsdWVzIC0gVmFsdWVzIHRvIGFkZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVW5zaWduZWQgMzItYml0IHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gYWRkMzIoLi4udmFsdWVzKSB7XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKChzdW0sIHZhbHVlKSA9PiAoc3VtICsgdmFsdWUpID4+PiAwLCAwKVxufVxuXG4vKipcbiAqIFJvdGF0ZXMgYSAzMi1iaXQgaW50ZWdlciByaWdodC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFZhbHVlIHRvIHJvdGF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRzIC0gQml0IGNvdW50LlxuICogQHJldHVybnMge251bWJlcn0gLSBSb3RhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiByb3RhdGVSaWdodCh2YWx1ZSwgYml0cykge1xuICByZXR1cm4gKHZhbHVlID4+PiBiaXRzKSB8ICh2YWx1ZSA8PCAoMzIgLSBiaXRzKSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBhIHN5bmMgY29uZmlnIHN1YnRyZWUgaXMgZGV0ZXJtaW5pc3RpYyBKU09OIGFuZCBkb2VzIG5vdCBjb250YWluIG9idmlvdXMgc2VjcmV0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFiZWwgLSBEaWFnbm9zdGljIHBhdGggbGFiZWwuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZSB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAtIFN0YWJsZSBKU09OIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsLCB2YWx1ZX0pIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtpbmRleH1gLCB2YWx1ZTogZW50cnl9KSlcbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKSB7XG4gICAgICBjb25zdCBjaGlsZFZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVtrZXldXG5cbiAgICAgIGlmIChjaGlsZFZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoc3luY0NvbmZpZ0tleUxvb2tzU2VjcmV0KGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIHBvbGljeSAke2xhYmVsfS8ke2tleX0gaXMgbm90IGFsbG93ZWQgaW4gZnJvbnRlbmQtdmlzaWJsZSBzeW5jIHBvbGljeSBjb25maWdgKVxuICAgICAgfVxuXG4gICAgICBub3JtYWxpemVkW2tleV0gPSBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtrZXl9YCwgdmFsdWU6IGNoaWxkVmFsdWV9KVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIHBvbGljeSBpbnB1dCBtdXN0IGJlIGRldGVybWluaXN0aWMgSlNPTlwiKVxufVxuXG4vKipcbiAqIFN0YWJsZSBKU09OIHN0cmluZ2lmaWVyIHdpdGggc29ydGVkIG9iamVjdCBrZXlzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlIHRvIHN0cmluZ2lmeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWw6IFwiaGFzaFwiLCB2YWx1ZX0pKVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHN5bmMgY29uZmlnIGtleSBsb29rcyBsaWtlIGEgY3JlZGVudGlhbC9zZWNyZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gT2JqZWN0IGtleS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIga2V5IGlzIGRpc2FsbG93ZWQuXG4gKi9cbmZ1bmN0aW9uIHN5bmNDb25maWdLZXlMb29rc1NlY3JldChrZXkpIHtcbiAgcmV0dXJuIC9zZWNyZXR8dG9rZW58cGFzc3dvcmR8cHJpdmF0ZS4/a2V5fHNpZ25pbmcuP2tleS9pLnRlc3Qoa2V5KVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbW1hbmRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHJlc291cmNlQ29uZmlndXJhdGlvbiAtIFJhdyByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge3tidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBidWlsdEluTWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29tbWFuZE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9PiwgbWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSAtIE5vcm1hbGl6ZWQgY29tbWFuZCBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3QgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXG4gIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluTWVtYmVyQ29tbWFuZHNcbiAgY29uc3QgY3VzdG9tQ29sbGVjdGlvbkNvbW1hbmRzID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbGxlY3Rpb25Db21tYW5kc1xuICBjb25zdCBjdXN0b21NZW1iZXJDb21tYW5kcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5tZW1iZXJDb21tYW5kc1xuICBjb25zdCBub3JtYWxpemVkQnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxCdWlsdEluQ29tbWFuZHMoe1xuICAgIGNvbW1hbmREZWZhdWx0czoge1xuICAgICAgY3JlYXRlOiBcImNyZWF0ZVwiLFxuICAgICAgaW5kZXg6IFwiaW5kZXhcIlxuICAgIH0sXG4gICAgY29tbWFuZHNDb25maWc6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgbW9kZWxOYW1lOiBcIkNvbGxlY3Rpb25Db21tYW5kXCJcbiAgfSlcbiAgY29uc3Qgbm9ybWFsaXplZEJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxCdWlsdEluQ29tbWFuZHMoe1xuICAgIGNvbW1hbmREZWZhdWx0czoge1xuICAgICAgYXR0YWNoOiBcImF0dGFjaFwiLFxuICAgICAgYXR0YWNobWVudExpc3Q6IFwiYXR0YWNobWVudExpc3RcIixcbiAgICAgIGRlc3Ryb3k6IFwiZGVzdHJveVwiLFxuICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgIGZpbmQ6IFwiZmluZFwiLFxuICAgICAgdXBkYXRlOiBcInVwZGF0ZVwiLFxuICAgICAgdXJsOiBcInVybFwiXG4gICAgfSxcbiAgICBjb21tYW5kc0NvbmZpZzogYnVpbHRJbk1lbWJlckNvbW1hbmRzLFxuICAgIG1vZGVsTmFtZTogXCJNZW1iZXJDb21tYW5kXCJcbiAgfSlcblxuICBjb25zdCBub3JtYWxpemVkQ29sbGVjdGlvbkNvbW1hbmRzID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRzKHtjb21tYW5kc0NvbmZpZzogY3VzdG9tQ29sbGVjdGlvbkNvbW1hbmRzLCBtb2RlbE5hbWU6IFwiQ29sbGVjdGlvbkNvbW1hbmRcIn0pXG4gIGNvbnN0IG5vcm1hbGl6ZWRNZW1iZXJDb21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kcyh7Y29tbWFuZHNDb25maWc6IGN1c3RvbU1lbWJlckNvbW1hbmRzLCBtb2RlbE5hbWU6IFwiTWVtYmVyQ29tbWFuZFwifSlcblxuICByZXR1cm4ge1xuICAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRCdWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIGJ1aWx0SW5NZW1iZXJDb21tYW5kczogbm9ybWFsaXplZEJ1aWx0SW5NZW1iZXJDb21tYW5kcyxcbiAgICBjb2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb2xsZWN0aW9uQ29tbWFuZHMuY29tbWFuZHMsXG4gICAgY29tbWFuZE1ldGFkYXRhOiB7Li4ubm9ybWFsaXplZENvbGxlY3Rpb25Db21tYW5kcy5tZXRhZGF0YSwgLi4ubm9ybWFsaXplZE1lbWJlckNvbW1hbmRzLm1ldGFkYXRhfSxcbiAgICBtZW1iZXJDb21tYW5kczogbm9ybWFsaXplZE1lbWJlckNvbW1hbmRzLmNvbW1hbmRzXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBidWlsdCBpbiBjb21tYW5kcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLmNvbW1hbmREZWZhdWx0cyAtIEJ1aWx0LWluIGRlZmF1bHQgY29tbWFuZCBuYW1lcy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IGFyZ3MuY29tbWFuZHNDb25maWcgLSBCdWlsdC1pbiBjb21tYW5kcyBjb25maWcgKGNhbWVsQ2FzZSBjb21tYW5kIHR5cGUgbGlzdCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBEaWFnbm9zdGljIG1vZGVsIG5hbWUuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBOb3JtYWxpemVkIGJ1aWx0LWluIGNvbW1hbmQgY29uZmlnLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsQnVpbHRJbkNvbW1hbmRzKHtjb21tYW5kRGVmYXVsdHMsIGNvbW1hbmRzQ29uZmlnLCBtb2RlbE5hbWV9KSB7XG4gIGlmICghY29tbWFuZHNDb25maWcpIHtcbiAgICByZXR1cm4gY29tbWFuZERlZmF1bHRzXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29tbWFuZHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gY29uZmlndXJhdGlvbiBtdXN0IHVzZSB0aGUgYXJyYXkgZm9ybS4gT2JqZWN0IGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5gKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZWQgY29tbWFuZHMuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBub3JtYWxpemVkQ29tbWFuZHMgPSB7fVxuXG4gIGZvciAoY29uc3QgY29tbWFuZFR5cGUgb2YgY29tbWFuZHNDb25maWcpIHtcbiAgICBjb25zdCBkZWZhdWx0Q29tbWFuZE5hbWUgPSBjb21tYW5kRGVmYXVsdHNbY29tbWFuZFR5cGVdXG5cbiAgICBpZiAoIWRlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJ1aWx0LWluIGZyb250ZW5kIG1vZGVsIGNvbW1hbmQgJyR7Y29tbWFuZFR5cGV9JyBmb3IgJHttb2RlbE5hbWV9YClcbiAgICB9XG5cbiAgICBub3JtYWxpemVkQ29tbWFuZHNbY29tbWFuZFR5cGVdID0gdmFsaWRhdGVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kTmFtZSh7XG4gICAgICBjb21tYW5kTmFtZTogZGVmYXVsdENvbW1hbmROYW1lLFxuICAgICAgY29tbWFuZFR5cGU6IGRlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgIG1vZGVsTmFtZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZENvbW1hbmRzXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgY3VzdG9tIGNvbW1hbmRzLiBFbnRyaWVzIGFyZSBlaXRoZXIgYSBwbGFpblxuICogY2FtZWxDYXNlIG1ldGhvZC1uYW1lIHN0cmluZyBvciBhIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgb2JqZWN0IHRoYXRcbiAqIGFsc28gZGVjbGFyZXMgdGhlIGNvbW1hbmQncyB0eXBlZCBhcmd1bWVudHMgYW5kL29yIHJlc3BvbnNlIHR5cGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwge25hbWU6IHN0cmluZywgYXJncz86IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlPzogc3RyaW5nfT4gfCB1bmRlZmluZWR9IGFyZ3MuY29tbWFuZHNDb25maWcgLSBDdXN0b20gY29tbWFuZHMgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gRGlhZ25vc3RpYyBtb2RlbCBuYW1lLlxuICogQHJldHVybnMge3tjb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fX0gLSBSb3V0ZSBtYXAgKG1ldGhvZCBuYW1lIOKGkiBrZWJhYiBzbHVnKSArIHBlci1jb21tYW5kIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZHMoe2NvbW1hbmRzQ29uZmlnLCBtb2RlbE5hbWV9KSB7XG4gIGlmICghY29tbWFuZHNDb25maWcpIHtcbiAgICByZXR1cm4ge2NvbW1hbmRzOiB7fSwgbWV0YWRhdGE6IHt9fVxuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbW1hbmRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IGNvbmZpZ3VyYXRpb24gbXVzdCB1c2UgdGhlIGFycmF5IGZvcm0uIE9iamVjdCBmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuYClcbiAgfVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgY29tbWFuZHMgPSB7fVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSAqL1xuICBjb25zdCBtZXRhZGF0YSA9IHt9XG5cbiAgZm9yIChjb25zdCBjb21tYW5kRW50cnkgb2YgY29tbWFuZHNDb25maWcpIHtcbiAgICBjb25zdCB7bWV0aG9kTmFtZSwgYXJncywgcmV0dXJuVHlwZX0gPSBub3JtYWxpemVGcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEVudHJ5KHtjb21tYW5kRW50cnksIG1vZGVsTmFtZX0pXG4gICAgY29uc3QgdmFsaWRhdGVkTWV0aG9kTmFtZSA9IHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUoe1xuICAgICAgY29tbWFuZE5hbWU6IG1ldGhvZE5hbWUsXG4gICAgICBjb21tYW5kVHlwZTogbWV0aG9kTmFtZSxcbiAgICAgIG1vZGVsTmFtZVxuICAgIH0pXG4gICAgY29uc3QgY29tbWFuZFNsdWcgPSBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodmFsaWRhdGVkTWV0aG9kTmFtZSkpXG5cbiAgICBjb21tYW5kc1t2YWxpZGF0ZWRNZXRob2ROYW1lXSA9IGNvbW1hbmRTbHVnXG4gICAgbWV0YWRhdGFbdmFsaWRhdGVkTWV0aG9kTmFtZV0gPSB7YXJncywgcmV0dXJuVHlwZX1cbiAgfVxuXG4gIHJldHVybiB7Y29tbWFuZHMsIG1ldGFkYXRhfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgb25lIGN1c3RvbS1jb21tYW5kIGVudHJ5IChzdHJpbmcgc2hvcnRoYW5kIG9yIGNvbnRyYWN0IG9iamVjdCkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy5jb21tYW5kRW50cnkgLSBSYXcgY29tbWFuZCBlbnRyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIERpYWdub3N0aWMgbW9kZWwgbmFtZS5cbiAqIEByZXR1cm5zIHt7bWV0aG9kTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH19IC0gTWV0aG9kIG5hbWUgKyBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRFbnRyeSh7Y29tbWFuZEVudHJ5LCBtb2RlbE5hbWV9KSB7XG4gIGlmICh0eXBlb2YgY29tbWFuZEVudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHttZXRob2ROYW1lOiBjb21tYW5kRW50cnksIGFyZ3M6IFtdLCByZXR1cm5UeXBlOiBudWxsfVxuICB9XG5cbiAgaWYgKCFjb21tYW5kRW50cnkgfHwgdHlwZW9mIGNvbW1hbmRFbnRyeSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbW1hbmRFbnRyeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBlbnRyaWVzIG11c3QgYmUgYSBjYW1lbENhc2UgbmFtZSBzdHJpbmcgb3IgYSB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fSBvYmplY3RgKVxuICB9XG5cbiAgY29uc3Qge25hbWUsIGFyZ3MsIHJldHVyblR5cGUsIC4uLnJlc3R9ID0gLyoqIEB0eXBlIHt7bmFtZT86IHVua25vd24sIGFyZ3M/OiB1bmtub3duLCByZXR1cm5UeXBlPzogdW5rbm93bn19ICovIChjb21tYW5kRW50cnkpXG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgJHttb2RlbE5hbWV9IGtleXM6ICR7T2JqZWN0LmtleXMocmVzdCkuam9pbihcIiwgXCIpfS4gQWxsb3dlZDogbmFtZSwgYXJncywgcmV0dXJuVHlwZWApXG4gIH1cblxuICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIgfHwgbmFtZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gb2JqZWN0IGVudHJpZXMgcmVxdWlyZSBhIG5vbi1lbXB0eSAnbmFtZScgc3RyaW5nYClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kTmFtZTogbmFtZSxcbiAgICBhcmdzOiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ29tbWFuZEFyZ3Moe2FyZ3MsIGNvbW1hbmROYW1lOiBuYW1lLCBtb2RlbE5hbWV9KSxcbiAgICByZXR1cm5UeXBlOiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ29tbWFuZFJldHVyblR5cGUoe2NvbW1hbmROYW1lOiBuYW1lLCBtb2RlbE5hbWUsIHJldHVyblR5cGV9KVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFuZCBub3JtYWxpemVzIGEgY3VzdG9tIGNvbW1hbmQncyB0eXBlZC1hcmd1bWVudCBsaXN0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MuYXJncyAtIFJhdyBjb21tYW5kIGFyZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kTmFtZSAtIENvbW1hbmQgbmFtZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBEaWFnbm9zdGljIG1vZGVsIG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT59IC0gTm9ybWFsaXplZCB0eXBlZCBjb21tYW5kIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbENvbW1hbmRBcmdzKHthcmdzLCBjb21tYW5kTmFtZSwgbW9kZWxOYW1lfSkge1xuICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9ICcke2NvbW1hbmROYW1lfScgYXJncyBtdXN0IGJlIGFuIGFycmF5IG9mIHtuYW1lLCB0eXBlfSBvYmplY3RzYClcbiAgfVxuXG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgYXJnLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgYXJnLm5hbWUubGVuZ3RoIDwgMSB8fCB0eXBlb2YgYXJnLnR5cGUgIT09IFwic3RyaW5nXCIgfHwgYXJnLnR5cGUudHJpbSgpLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9ICcke2NvbW1hbmROYW1lfScgYXJncyBlbnRyaWVzIHJlcXVpcmUgbm9uLWVtcHR5ICduYW1lJyBhbmQgSlNEb2MtdHlwZSAndHlwZScgc3RyaW5nc2ApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtuYW1lOiBhcmcubmFtZSwgdHlwZTogYXJnLnR5cGUudHJpbSgpfVxuICB9KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgbm9ybWFsaXplcyBhIGN1c3RvbSBjb21tYW5kJ3MgZGVjbGFyZWQgSlNEb2MgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQ29tbWFuZCBuYW1lIGZvciBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIERpYWdub3N0aWMgbW9kZWwgbmFtZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy5yZXR1cm5UeXBlIC0gUmF3IHJldHVybiB0eXBlLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gTm9ybWFsaXplZCBKU0RvYyByZXR1cm4gdHlwZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbENvbW1hbmRSZXR1cm5UeXBlKHtjb21tYW5kTmFtZSwgbW9kZWxOYW1lLCByZXR1cm5UeXBlfSkge1xuICBpZiAocmV0dXJuVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHJldHVyblR5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHR5cGVvZiByZXR1cm5UeXBlICE9PSBcInN0cmluZ1wiIHx8IHJldHVyblR5cGUudHJpbSgpLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSAnJHtjb21tYW5kTmFtZX0nIHJldHVyblR5cGUgbXVzdCBiZSBhIG5vbi1lbXB0eSBKU0RvYyB0eXBlIHN0cmluZ2ApXG4gIH1cblxuICByZXR1cm4gcmV0dXJuVHlwZS50cmltKClcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoIGhlbHBlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICogQHBhcmFtIHs/fSByZXNvdXJjZURlZmluaXRpb24gLSBSZXNvdXJjZSBkZWZpbml0aW9uLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIHJlc291cmNlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKSB7XG4gIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgZGVmaW5pdGlvbiBmb3IgJHttb2RlbE5hbWV9YClcbiAgfVxuXG4gIHJldHVybiBgLyR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1vZGVsTmFtZSkpKX1gXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbEFjdGlvbkZvckNvbW1hbmQgaGVscGVyLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kTmFtZSAtIENvbW1hbmQgcGF0aCBzZWdtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAqIEBwYXJhbSB7P30gYXJncy5yZXNvdXJjZURlZmluaXRpb24gLSBSZXNvdXJjZSBkZWZpbml0aW9uLlxuICogQHJldHVybnMge1wiZGVzdHJveVwiIHwgXCJmaW5kXCIgfCBcImluZGV4XCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiYXR0YWNoXCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwiIHwgbnVsbH0gLSBGcm9udGVuZCBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCh7Y29tbWFuZE5hbWUsIG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9ufSkge1xuICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICR7bW9kZWxOYW1lfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IFthY3Rpb24sIGNvbmZpZ3VyZWRDb21tYW5kTmFtZV0gb2YgT2JqZWN0LmVudHJpZXMoe1xuICAgIC4uLnJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIC4uLnJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluTWVtYmVyQ29tbWFuZHNcbiAgfSkpIHtcbiAgICBpZiAoY29uZmlndXJlZENvbW1hbmROYW1lID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICBjb25zdCB2YWxpZGF0ZWRDb21tYW5kTmFtZSA9IHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUoe1xuICAgICAgY29tbWFuZE5hbWU6IGNvbmZpZ3VyZWRDb21tYW5kTmFtZSxcbiAgICAgIGNvbW1hbmRUeXBlOiAvKiogQHR5cGUge1wiYXR0YWNoXCIgfCBcImNyZWF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImRvd25sb2FkXCIgfCBcImZpbmRcIiB8IFwiaW5kZXhcIiB8IFwidXBkYXRlXCIgfCBcInVybFwifSAqLyAoYWN0aW9uKSxcbiAgICAgIG1vZGVsTmFtZVxuICAgIH0pXG5cbiAgICBpZiAoY29tbWFuZE5hbWUgPT09IHZhbGlkYXRlZENvbW1hbmROYW1lKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtcImF0dGFjaFwiIHwgXCJjcmVhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJkb3dubG9hZFwiIHwgXCJmaW5kXCIgfCBcImluZGV4XCIgfCBcInVwZGF0ZVwiIHwgXCJ1cmxcIn0gKi8gKGFjdGlvbilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCBoZWxwZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX0gYXJncy5iYWNrZW5kUHJvamVjdHMgLSBCYWNrZW5kIHByb2plY3RzIHRvIHNjYW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHJldHVybnMge3tjb21tYW5kTmFtZTogc3RyaW5nLCBtZW1iZXJJZD86IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgcmVzb3VyY2VQYXRoOiBzdHJpbmcsIHNjb3BlOiBcImNvbGxlY3Rpb25cIiB8IFwibWVtYmVyXCJ9IHwgbnVsbH0gLSBNYXRjaGVkIGN1c3RvbSBjb21tYW5kIG1ldGFkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoKHtiYWNrZW5kUHJvamVjdHMsIGN1cnJlbnRQYXRofSkge1xuICBjb25zdCBub3JtYWxpemVkQ3VycmVudFBhdGggPSBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoRm9yTWF0Y2goY3VycmVudFBhdGgpXG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1ttb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvdXJjZVBhdGggPSBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoRm9yTWF0Y2goZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbikpXG4gICAgICBjb25zdCBleHBlY3RlZFByZWZpeCA9IGAke3Jlc291cmNlUGF0aH0vYFxuXG4gICAgICBpZiAoIW5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zdGFydHNXaXRoKGV4cGVjdGVkUHJlZml4KSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkQ3VycmVudFBhdGhcbiAgICAgICAgLnNsaWNlKGV4cGVjdGVkUHJlZml4Lmxlbmd0aClcbiAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRDb2xsZWN0aW9uQ29tbWFuZCA9IE9iamVjdC5lbnRyaWVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5jb2xsZWN0aW9uQ29tbWFuZHMpXG4gICAgICAgICAgLmZpbmQoKFssIGNvbW1hbmROYW1lXSkgPT4gY29tbWFuZE5hbWUgPT09IHBhdGhTZWdtZW50c1swXSlcblxuICAgICAgICBpZiAobWF0Y2hlZENvbGxlY3Rpb25Db21tYW5kKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbW1hbmROYW1lOiBtYXRjaGVkQ29sbGVjdGlvbkNvbW1hbmRbMV0sXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtYXRjaGVkQ29sbGVjdGlvbkNvbW1hbmRbMF0sXG4gICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICBzY29wZTogXCJjb2xsZWN0aW9uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZE1lbWJlckNvbW1hbmQgPSBPYmplY3QuZW50cmllcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24ubWVtYmVyQ29tbWFuZHMpXG4gICAgICAgICAgLmZpbmQoKFssIGNvbW1hbmROYW1lXSkgPT4gY29tbWFuZE5hbWUgPT09IHBhdGhTZWdtZW50c1sxXSlcblxuICAgICAgICBpZiAobWF0Y2hlZE1lbWJlckNvbW1hbmQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWFuZE5hbWU6IG1hdGNoZWRNZW1iZXJDb21tYW5kWzFdLFxuICAgICAgICAgICAgbWVtYmVySWQ6IGRlY29kZVVSSUNvbXBvbmVudChwYXRoU2VnbWVudHNbMF0pLFxuICAgICAgICAgICAgbWV0aG9kTmFtZTogbWF0Y2hlZE1lbWJlckNvbW1hbmRbMF0sXG4gICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICBzY29wZTogXCJtZW1iZXJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgcGF0aCBmb3IgbWF0Y2guXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgcGF0aCB3aXRoIGxlYWRpbmcgc2xhc2ggYW5kIG5vIHRyYWlsaW5nIHNsYXNoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoRm9yTWF0Y2gocGF0aCkge1xuICBjb25zdCB3aXRoTGVhZGluZ1NsYXNoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gXG5cbiAgaWYgKHdpdGhMZWFkaW5nU2xhc2gubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgfVxuXG4gIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHJlZ2lzdGVyZWQgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2UgY2xhc3MgZm9yIGEgcmVzb3VyY2UgdHlwZVxuICogYWNyb3NzIGFsbCBiYWNrZW5kIHByb2plY3RzLiBBIHJlc291cmNlJ3MgZWZmZWN0aXZlIG5hbWUgaXMgaXRzXG4gKiBgbW9kZWxOYW1lYCBvdmVycmlkZSB3aGVuIGRlY2xhcmVkLCBvdGhlcndpc2UgaXRzIHJlZ2lzdHJ5IGtleSDigJQgbWF0Y2hpbmdcbiAqIHtAbGluayBmcm9udGVuZE1vZGVsU3luY01hbmlmZXN0Rm9yQmFja2VuZFByb2plY3RzfS4gQSByZWdpc3RyeSBrZXkgc2hhZG93ZWRcbiAqIGJ5IGEgYG1vZGVsTmFtZWAgb3ZlcnJpZGUgZG9lcyBub3QgcmVzb2x2ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7e2dldEJhY2tlbmRQcm9qZWN0czogKCkgPT4gaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX19IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gZXhwb3NpbmcgdGhlIGJhY2tlbmQgcHJvamVjdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVR5cGUgLSBGcm9udGVuZCBtb2RlbCBuYW1lIHRvIHJlc29sdmUuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFJlc29sdmVkUmVzb3VyY2VSZWdpc3RyYXRpb24gfCBudWxsfSBSZXNvbHZlZCByZWdpc3RyYXRpb24gb3IgbnVsbCB3aGVuIHRoZSByZXNvdXJjZSB0eXBlIGlzIG5vdCByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzKHtjb25maWd1cmF0aW9uLCByZXNvdXJjZVR5cGV9KSB7XG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKSkge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgY29uZmlndXJlZE1vZGVsTmFtZSBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpKSB7XG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbY29uZmlndXJlZE1vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgaWYgKCFyZXNvdXJjZUNsYXNzKSBjb250aW51ZVxuXG4gICAgICAvLyBDaGVhcCBkaXJlY3Qta2V5IG1pc21hdGNoIHNraXA6IG9ubHkgbm9ybWFsaXplIGNvbmZpZ3VyYXRpb25zIGZvciB0aGVcbiAgICAgIC8vIG1hdGNoaW5nIGtleSBvciB3aGVuIGEgbW9kZWxOYW1lIG92ZXJyaWRlIGNvdWxkIHJlbmFtZSB0aGUgcmVzb3VyY2UuXG4gICAgICBpZiAoY29uZmlndXJlZE1vZGVsTmFtZSAhPT0gcmVzb3VyY2VUeXBlICYmICFyZXNvdXJjZUNsYXNzLnNoYXJlZFJlc291cmNlU3RhdGljVmFsdWUoXCJtb2RlbE5hbWVcIikpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSBjb250aW51ZVxuICAgICAgaWYgKChyZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IGNvbmZpZ3VyZWRNb2RlbE5hbWUpICE9PSByZXNvdXJjZVR5cGUpIGNvbnRpbnVlXG5cbiAgICAgIHJldHVybiB7bW9kZWxOYW1lOiByZXNvdXJjZVR5cGUsIHJlc291cmNlQ2xhc3MsIHJlc291cmNlQ29uZmlndXJhdGlvbn1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuIl19
@@ -1,13 +1,3 @@
1
- /**
2
- * Frontend model transport serialization options.
3
- * @typedef {object} FrontendModelTransportSerializationOptions
4
- * @property {string | undefined} [timeZone] - IANA timezone used when serializing Date instants.
5
- */
6
- /**
7
- * Normalized frontend model transport serialization options.
8
- * @typedef {object} NormalizedFrontendModelTransportSerializationOptions
9
- * @property {string | undefined} timeZone - Validated IANA timezone used when serializing Date instants.
10
- */
11
1
  /**
12
2
  * Assign a key to a plain object without triggering the `__proto__` setter.
13
3
  * Uses `Object.defineProperty` so that keys like `__proto__` are stored as
@@ -1 +1 @@
1
- {"version":3,"file":"transport-serialization.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/transport-serialization.js"],"names":[],"mappings":"AAiBA;;;;GAIG;AAEH;;;;GAIG;AAEH;;;;;;;;;;GAUG;AACH,2CALW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,OACjB,MAAM,SACN,OAAC,GACC,IAAI,CAShB;AAiGD;;;;GAIG;AACH,8CAHW,OAAC,GACC,KAAK,IAAI;IAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;IAAC,WAAW,EAAE;QAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAAC,aAAa,EAAE,MAAM,cAAc,6BAA6B,EAAE,OAAO,CAAC;IAAC,qBAAqB,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK;QAAC,YAAY,EAAE,MAAM,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,OAAC,CAAA;KAAC,CAAA;CAAC,CAYrS;AAgKD;;;;;GAKG;AACH,4DAJW,OAAC,YACD,0CAA0C,GACxC,OAAC,CAQb;AAED;;;;GAIG;AACH,8DAHW,OAAC,GACC,OAAC,CAkDb;;;;;;;;eA9Wa,MAAM,GAAG,SAAS;;;;;;;;;cAMlB,MAAM,GAAG,SAAS"}
1
+ {"version":3,"file":"transport-serialization.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/transport-serialization.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;GAUG;AACH,2CALW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,OACjB,MAAM,SACN,OAAC,GACC,IAAI,CAShB;AAiGD;;;;GAIG;AACH,8CAHW,OAAC,GACC,KAAK,IAAI;IAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;IAAC,WAAW,EAAE;QAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAAC,aAAa,EAAE,MAAM,cAAc,6BAA6B,EAAE,OAAO,CAAC;IAAC,qBAAqB,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK;QAAC,YAAY,EAAE,MAAM,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,OAAC,CAAA;KAAC,CAAA;CAAC,CAYrS;AAgKD;;;;;GAKG;AACH,4DAJW,OAAC,YACD,0CAA0C,GACxC,OAAC,CAQb;AAED;;;;GAIG;AACH,8DAHW,OAAC,GACC,OAAC,CAkDb;;;;;;;;eAvXa,MAAM,GAAG,SAAS;;;;;;;;;cAKlB,MAAM,GAAG,SAAS"}