payload-auth 1.8.0-canary.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/dist/better-auth/adapter/generate-schema/generate-schema-builder.d.ts +1 -1
  2. package/dist/better-auth/adapter/generate-schema/generate-schema-builder.d.ts.map +1 -1
  3. package/dist/better-auth/adapter/generate-schema/generate-schema-builder.js +51 -54
  4. package/dist/better-auth/adapter/generate-schema/get-payload-schema.d.ts.map +1 -1
  5. package/dist/better-auth/adapter/generate-schema/get-payload-schema.js +4 -4
  6. package/dist/better-auth/adapter/generate-schema/index.d.ts +1 -1
  7. package/dist/better-auth/adapter/generate-schema/index.d.ts.map +1 -1
  8. package/dist/better-auth/adapter/generate-schema/index.js +4 -4
  9. package/dist/better-auth/adapter/generate-schema/utils.js +4 -4
  10. package/dist/better-auth/adapter/index.d.ts +2 -2
  11. package/dist/better-auth/adapter/index.d.ts.map +1 -1
  12. package/dist/better-auth/adapter/index.js +59 -59
  13. package/dist/better-auth/adapter/transform/index.d.ts +3 -3
  14. package/dist/better-auth/adapter/transform/index.d.ts.map +1 -1
  15. package/dist/better-auth/adapter/transform/index.js +86 -61
  16. package/dist/better-auth/adapter/types.d.ts +4 -4
  17. package/dist/better-auth/adapter/types.d.ts.map +1 -1
  18. package/dist/better-auth/adapter/types.js +1 -1
  19. package/dist/better-auth/generated-types.d.ts +27 -1
  20. package/dist/better-auth/generated-types.d.ts.map +1 -1
  21. package/dist/better-auth/generated-types.js +1 -1
  22. package/dist/better-auth/index.d.ts +3 -3
  23. package/dist/better-auth/index.d.ts.map +1 -1
  24. package/dist/better-auth/index.js +1 -1
  25. package/dist/better-auth/plugin/constants.d.ts +10 -0
  26. package/dist/better-auth/plugin/constants.d.ts.map +1 -1
  27. package/dist/better-auth/plugin/constants.js +163 -153
  28. package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts +1 -1
  29. package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts.map +1 -1
  30. package/dist/better-auth/plugin/helpers/check-plugin-exists.js +1 -1
  31. package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts.map +1 -1
  32. package/dist/better-auth/plugin/helpers/generate-verify-email-url.js +7 -7
  33. package/dist/better-auth/plugin/helpers/get-admin-access.d.ts +2 -2
  34. package/dist/better-auth/plugin/helpers/get-admin-access.d.ts.map +1 -1
  35. package/dist/better-auth/plugin/helpers/get-admin-access.js +2 -2
  36. package/dist/better-auth/plugin/helpers/get-all-roles.d.ts +2 -2
  37. package/dist/better-auth/plugin/helpers/get-all-roles.d.ts.map +1 -1
  38. package/dist/better-auth/plugin/helpers/get-all-roles.js +4 -4
  39. package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts +2 -2
  40. package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts.map +1 -1
  41. package/dist/better-auth/plugin/helpers/get-better-auth-schema.js +3 -3
  42. package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts +2 -2
  43. package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts.map +1 -1
  44. package/dist/better-auth/plugin/helpers/get-collection-slug.js +7 -7
  45. package/dist/better-auth/plugin/helpers/get-collection.d.ts +2 -2
  46. package/dist/better-auth/plugin/helpers/get-collection.d.ts.map +1 -1
  47. package/dist/better-auth/plugin/helpers/get-collection.js +1 -1
  48. package/dist/better-auth/plugin/helpers/get-ip.d.ts +1 -1
  49. package/dist/better-auth/plugin/helpers/get-ip.d.ts.map +1 -1
  50. package/dist/better-auth/plugin/helpers/get-ip.js +14 -14
  51. package/dist/better-auth/plugin/helpers/get-signed-cookie.d.ts +1 -1
  52. package/dist/better-auth/plugin/helpers/get-signed-cookie.d.ts.map +1 -1
  53. package/dist/better-auth/plugin/helpers/get-signed-cookie.js +13 -13
  54. package/dist/better-auth/plugin/helpers/index.d.ts +1 -1
  55. package/dist/better-auth/plugin/helpers/index.d.ts.map +1 -1
  56. package/dist/better-auth/plugin/helpers/index.js +1 -1
  57. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts +2 -2
  58. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -1
  59. package/dist/better-auth/plugin/helpers/prepare-session-data.js +2 -2
  60. package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.d.ts +2 -2
  61. package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.d.ts.map +1 -1
  62. package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.js +1 -1
  63. package/dist/better-auth/plugin/index.d.ts +7 -11
  64. package/dist/better-auth/plugin/index.d.ts.map +1 -1
  65. package/dist/better-auth/plugin/index.js +3 -26
  66. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.d.ts +3 -3
  67. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.d.ts.map +1 -1
  68. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.js +9 -9
  69. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts +2 -2
  70. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +1 -1
  71. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +6 -6
  72. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts +2 -2
  73. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts.map +1 -1
  74. package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +19 -20
  75. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts +2 -2
  76. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts.map +1 -1
  77. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.js +1 -1
  78. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts +1 -1
  79. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts.map +1 -1
  80. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.js +2 -2
  81. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts +3 -3
  82. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts.map +1 -1
  83. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.js +21 -21
  84. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts +2 -2
  85. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -1
  86. package/dist/better-auth/plugin/lib/build-collections/api-keys.js +26 -26
  87. package/dist/better-auth/plugin/lib/build-collections/device-code.d.ts +2 -2
  88. package/dist/better-auth/plugin/lib/build-collections/device-code.d.ts.map +1 -1
  89. package/dist/better-auth/plugin/lib/build-collections/device-code.js +6 -6
  90. package/dist/better-auth/plugin/lib/build-collections/index.d.ts +3 -3
  91. package/dist/better-auth/plugin/lib/build-collections/index.d.ts.map +1 -1
  92. package/dist/better-auth/plugin/lib/build-collections/index.js +10 -4
  93. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts +2 -2
  94. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts.map +1 -1
  95. package/dist/better-auth/plugin/lib/build-collections/invitations.js +14 -14
  96. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts +2 -2
  97. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -1
  98. package/dist/better-auth/plugin/lib/build-collections/jwks.js +8 -8
  99. package/dist/better-auth/plugin/lib/build-collections/members.d.ts +2 -2
  100. package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -1
  101. package/dist/better-auth/plugin/lib/build-collections/members.js +11 -12
  102. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts +2 -2
  103. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -1
  104. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +15 -15
  105. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts +2 -2
  106. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -1
  107. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +16 -16
  108. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts +2 -2
  109. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -1
  110. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +11 -12
  111. package/dist/better-auth/plugin/lib/build-collections/organization-roles.d.ts +4 -0
  112. package/dist/better-auth/plugin/lib/build-collections/organization-roles.d.ts.map +1 -0
  113. package/dist/better-auth/plugin/lib/build-collections/organization-roles.js +65 -0
  114. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts +2 -2
  115. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -1
  116. package/dist/better-auth/plugin/lib/build-collections/organizations.js +61 -13
  117. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts +2 -2
  118. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts.map +1 -1
  119. package/dist/better-auth/plugin/lib/build-collections/passkeys.js +15 -16
  120. package/dist/better-auth/plugin/lib/build-collections/rate-limit.d.ts +4 -0
  121. package/dist/better-auth/plugin/lib/build-collections/rate-limit.d.ts.map +1 -0
  122. package/dist/better-auth/plugin/lib/build-collections/rate-limit.js +54 -0
  123. package/dist/better-auth/plugin/lib/build-collections/scim-provider.d.ts +4 -0
  124. package/dist/better-auth/plugin/lib/build-collections/scim-provider.d.ts.map +1 -0
  125. package/dist/better-auth/plugin/lib/build-collections/scim-provider.js +65 -0
  126. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts +2 -2
  127. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -1
  128. package/dist/better-auth/plugin/lib/build-collections/sessions.js +21 -22
  129. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts +2 -2
  130. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts.map +1 -1
  131. package/dist/better-auth/plugin/lib/build-collections/sso-providers.js +12 -13
  132. package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts +2 -2
  133. package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts.map +1 -1
  134. package/dist/better-auth/plugin/lib/build-collections/subscriptions.js +17 -18
  135. package/dist/better-auth/plugin/lib/build-collections/team-members.d.ts +2 -2
  136. package/dist/better-auth/plugin/lib/build-collections/team-members.d.ts.map +1 -1
  137. package/dist/better-auth/plugin/lib/build-collections/team-members.js +14 -9
  138. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts +2 -2
  139. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -1
  140. package/dist/better-auth/plugin/lib/build-collections/teams.js +9 -9
  141. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts +2 -2
  142. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts.map +1 -1
  143. package/dist/better-auth/plugin/lib/build-collections/two-factors.js +9 -9
  144. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts +1 -1
  145. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -1
  146. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +4 -4
  147. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts +5 -5
  148. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts.map +1 -1
  149. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +9 -9
  150. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts +4 -4
  151. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts.map +1 -1
  152. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.js +1 -1
  153. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts +1 -1
  154. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts.map +1 -1
  155. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.js +17 -17
  156. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts +3 -3
  157. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts.map +1 -1
  158. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.js +7 -7
  159. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts +3 -3
  160. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts.map +1 -1
  161. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +7 -7
  162. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts +1 -1
  163. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -1
  164. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +10 -11
  165. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts +1 -1
  166. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts.map +1 -1
  167. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +9 -9
  168. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts +1 -1
  169. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -1
  170. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +3 -3
  171. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts +2 -2
  172. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +1 -1
  173. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +2 -2
  174. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts +6 -6
  175. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts.map +1 -1
  176. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.js +1 -1
  177. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +1 -1
  178. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +1 -1
  179. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +1 -1
  180. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts +1 -1
  181. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +1 -1
  182. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +12 -12
  183. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts +2 -2
  184. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -1
  185. package/dist/better-auth/plugin/lib/build-collections/users/index.js +38 -38
  186. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts +3 -3
  187. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts.map +1 -1
  188. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.js +3 -3
  189. package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.d.ts +2 -2
  190. package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.d.ts.map +1 -1
  191. package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.js +53 -53
  192. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts +1 -1
  193. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts.map +1 -1
  194. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.js +7 -7
  195. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts +3 -3
  196. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts.map +1 -1
  197. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.js +1 -1
  198. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts +1 -2
  199. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts.map +1 -1
  200. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.js +12 -12
  201. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts +4 -4
  202. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts.map +1 -1
  203. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.js +17 -17
  204. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts +2 -2
  205. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -1
  206. package/dist/better-auth/plugin/lib/build-collections/verifications.js +10 -10
  207. package/dist/better-auth/plugin/lib/get-payload-auth.d.ts +3 -3
  208. package/dist/better-auth/plugin/lib/get-payload-auth.d.ts.map +1 -1
  209. package/dist/better-auth/plugin/lib/get-payload-auth.js +1 -1
  210. package/dist/better-auth/plugin/lib/init-better-auth.d.ts +4 -4
  211. package/dist/better-auth/plugin/lib/init-better-auth.d.ts.map +1 -1
  212. package/dist/better-auth/plugin/lib/init-better-auth.js +1 -1
  213. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts +2 -2
  214. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts.map +1 -1
  215. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.js +1 -1
  216. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts +1 -1
  217. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -1
  218. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +1 -1
  219. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.d.ts +1 -1
  220. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.d.ts.map +1 -1
  221. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.js +1 -1
  222. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +4 -5
  223. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -1
  224. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +11 -11
  225. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts +1 -1
  226. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -1
  227. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +1 -1
  228. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts +1 -1
  229. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -1
  230. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +1 -1
  231. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts +1 -1
  232. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts.map +1 -1
  233. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.js +2 -2
  234. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts +1 -1
  235. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -1
  236. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +1 -1
  237. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts +1 -1
  238. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts.map +1 -1
  239. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.js +1 -1
  240. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.d.ts +1 -1
  241. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.d.ts.map +1 -1
  242. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.js +6 -6
  243. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.d.ts +1 -1
  244. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.d.ts.map +1 -1
  245. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.js +6 -6
  246. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.d.ts +3 -3
  247. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.d.ts.map +1 -1
  248. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.js +3 -3
  249. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts +1 -1
  250. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts.map +1 -1
  251. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.js +6 -7
  252. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts.map +1 -1
  253. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.js +6 -7
  254. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts +3 -3
  255. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts.map +1 -1
  256. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.js +9 -10
  257. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts +1 -1
  258. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts.map +1 -1
  259. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.js +12 -12
  260. package/dist/better-auth/plugin/lib/set-login-methods.d.ts +3 -3
  261. package/dist/better-auth/plugin/lib/set-login-methods.d.ts.map +1 -1
  262. package/dist/better-auth/plugin/lib/set-login-methods.js +4 -5
  263. package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts +5 -5
  264. package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts.map +1 -1
  265. package/dist/better-auth/plugin/payload/components/admin-buttons/index.js +20 -20
  266. package/dist/better-auth/plugin/payload/components/admin-buttons/index.scss +6 -1
  267. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts +5 -5
  268. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts.map +1 -1
  269. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.js +30 -30
  270. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.scss +6 -2
  271. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.d.ts +3 -3
  272. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.d.ts.map +1 -1
  273. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.js +32 -32
  274. package/dist/better-auth/plugin/payload/components/login-form/context.d.ts +9 -9
  275. package/dist/better-auth/plugin/payload/components/login-form/context.d.ts.map +1 -1
  276. package/dist/better-auth/plugin/payload/components/login-form/context.js +18 -18
  277. package/dist/better-auth/plugin/payload/components/login-form/credentials-form.d.ts +3 -3
  278. package/dist/better-auth/plugin/payload/components/login-form/credentials-form.d.ts.map +1 -1
  279. package/dist/better-auth/plugin/payload/components/login-form/credentials-form.js +32 -32
  280. package/dist/better-auth/plugin/payload/components/login-form/index.d.ts +4 -3
  281. package/dist/better-auth/plugin/payload/components/login-form/index.d.ts.map +1 -1
  282. package/dist/better-auth/plugin/payload/components/login-form/index.js +3 -3
  283. package/dist/better-auth/plugin/payload/components/login-form/index.scss +1 -2
  284. package/dist/better-auth/plugin/payload/components/logout-button.d.ts +1 -1
  285. package/dist/better-auth/plugin/payload/components/logout-button.d.ts.map +1 -1
  286. package/dist/better-auth/plugin/payload/components/logout-button.js +7 -7
  287. package/dist/better-auth/plugin/payload/components/passkeys/add-button.d.ts +2 -2
  288. package/dist/better-auth/plugin/payload/components/passkeys/add-button.d.ts.map +1 -1
  289. package/dist/better-auth/plugin/payload/components/passkeys/add-button.js +17 -17
  290. package/dist/better-auth/plugin/payload/components/passkeys/client.d.ts +2 -3
  291. package/dist/better-auth/plugin/payload/components/passkeys/client.d.ts.map +1 -1
  292. package/dist/better-auth/plugin/payload/components/passkeys/client.js +9 -9
  293. package/dist/better-auth/plugin/payload/components/passkeys/index.d.ts +4 -4
  294. package/dist/better-auth/plugin/payload/components/passkeys/index.d.ts.map +1 -1
  295. package/dist/better-auth/plugin/payload/components/passkeys/index.js +4 -4
  296. package/dist/better-auth/plugin/payload/components/passkeys/index.scss +8 -1
  297. package/dist/better-auth/plugin/payload/components/passkeys/list.d.ts +3 -3
  298. package/dist/better-auth/plugin/payload/components/passkeys/list.d.ts.map +1 -1
  299. package/dist/better-auth/plugin/payload/components/passkeys/list.js +12 -12
  300. package/dist/better-auth/plugin/payload/components/passkeys/types.d.ts +8 -8
  301. package/dist/better-auth/plugin/payload/components/passkeys/types.d.ts.map +1 -1
  302. package/dist/better-auth/plugin/payload/components/passkeys/types.js +1 -1
  303. package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts +1 -2
  304. package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts.map +1 -1
  305. package/dist/better-auth/plugin/payload/components/rsc-redirect.js +5 -5
  306. package/dist/better-auth/plugin/payload/components/token-field.d.ts +2 -3
  307. package/dist/better-auth/plugin/payload/components/token-field.d.ts.map +1 -1
  308. package/dist/better-auth/plugin/payload/components/token-field.js +5 -6
  309. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.d.ts +5 -5
  310. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.d.ts.map +1 -1
  311. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.js +41 -40
  312. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.scss +6 -3
  313. package/dist/better-auth/plugin/payload/exports/client.d.ts +6 -7
  314. package/dist/better-auth/plugin/payload/exports/client.d.ts.map +1 -1
  315. package/dist/better-auth/plugin/payload/exports/client.js +3 -4
  316. package/dist/better-auth/plugin/payload/exports/rsc.d.ts +8 -8
  317. package/dist/better-auth/plugin/payload/exports/rsc.d.ts.map +1 -1
  318. package/dist/better-auth/plugin/payload/exports/rsc.js +5 -5
  319. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts +1 -1
  320. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts.map +1 -1
  321. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.js +2 -2
  322. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts.map +1 -1
  323. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.js +10 -11
  324. package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts +5 -6
  325. package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts.map +1 -1
  326. package/dist/better-auth/plugin/payload/views/admin-login/client.js +6 -7
  327. package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts +5 -5
  328. package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts.map +1 -1
  329. package/dist/better-auth/plugin/payload/views/admin-login/index.js +21 -21
  330. package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts +7 -7
  331. package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts.map +1 -1
  332. package/dist/better-auth/plugin/payload/views/admin-signup/client.js +29 -29
  333. package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts +5 -5
  334. package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts.map +1 -1
  335. package/dist/better-auth/plugin/payload/views/admin-signup/index.js +14 -14
  336. package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts +3 -4
  337. package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts.map +1 -1
  338. package/dist/better-auth/plugin/payload/views/forgot-password/client.js +22 -22
  339. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts +7 -7
  340. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -1
  341. package/dist/better-auth/plugin/payload/views/forgot-password/index.js +10 -10
  342. package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts +4 -4
  343. package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts.map +1 -1
  344. package/dist/better-auth/plugin/payload/views/reset-password/client.js +22 -22
  345. package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts +7 -7
  346. package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts.map +1 -1
  347. package/dist/better-auth/plugin/payload/views/reset-password/index.js +12 -12
  348. package/dist/better-auth/plugin/payload/views/two-factor-verify/client.d.ts +4 -2
  349. package/dist/better-auth/plugin/payload/views/two-factor-verify/client.d.ts.map +1 -1
  350. package/dist/better-auth/plugin/payload/views/two-factor-verify/client.js +17 -17
  351. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts +5 -5
  352. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts.map +1 -1
  353. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.js +10 -10
  354. package/dist/better-auth/plugin/types.d.ts +28 -30
  355. package/dist/better-auth/plugin/types.d.ts.map +1 -1
  356. package/dist/better-auth/plugin/types.js +1 -1
  357. package/dist/better-auth/plugin/utils/set.d.ts.map +1 -1
  358. package/dist/better-auth/plugin/utils/set.js +4 -4
  359. package/dist/better-auth/scripts/generate-types.js +58 -61
  360. package/dist/better-auth/types.d.ts +2 -2
  361. package/dist/better-auth/types.d.ts.map +1 -1
  362. package/dist/better-auth/types.js +1 -1
  363. package/dist/index.d.ts +1 -1
  364. package/dist/index.d.ts.map +1 -1
  365. package/dist/index.js +1 -1
  366. package/dist/shared/components/icons.d.ts +2 -3
  367. package/dist/shared/components/icons.d.ts.map +1 -1
  368. package/dist/shared/components/icons.js +17 -18
  369. package/dist/shared/components/logo.d.ts +2 -3
  370. package/dist/shared/components/logo.d.ts.map +1 -1
  371. package/dist/shared/components/logo.js +3 -3
  372. package/dist/shared/form/components/submit.d.ts +1 -1
  373. package/dist/shared/form/components/submit.d.ts.map +1 -1
  374. package/dist/shared/form/components/submit.js +2 -2
  375. package/dist/shared/form/fields/text-field.d.ts.map +1 -1
  376. package/dist/shared/form/fields/text-field.js +2 -2
  377. package/dist/shared/form/index.d.ts +13 -19
  378. package/dist/shared/form/index.d.ts.map +1 -1
  379. package/dist/shared/form/index.js +4 -4
  380. package/dist/shared/form/ui/header/index.d.ts +6 -6
  381. package/dist/shared/form/ui/header/index.d.ts.map +1 -1
  382. package/dist/shared/form/ui/header/index.js +4 -5
  383. package/dist/shared/form/ui/header/index.scss +1 -1
  384. package/dist/shared/form/ui/index.d.ts +26 -23
  385. package/dist/shared/form/ui/index.d.ts.map +1 -1
  386. package/dist/shared/form/ui/index.js +33 -20
  387. package/dist/shared/form/validation.d.ts +1 -1
  388. package/dist/shared/form/validation.d.ts.map +1 -1
  389. package/dist/shared/form/validation.js +27 -22
  390. package/dist/shared/index.d.ts +2 -2
  391. package/dist/shared/index.d.ts.map +1 -1
  392. package/dist/shared/index.js +1 -1
  393. package/dist/shared/payload/fields/field-copy-button/index.css +2 -2
  394. package/dist/shared/payload/fields/field-copy-button/index.d.ts +2 -2
  395. package/dist/shared/payload/fields/field-copy-button/index.d.ts.map +1 -1
  396. package/dist/shared/payload/fields/field-copy-button/index.js +2 -2
  397. package/dist/shared/payload/fields/generate-uuid-button/index.d.ts +2 -2
  398. package/dist/shared/payload/fields/generate-uuid-button/index.d.ts.map +1 -1
  399. package/dist/shared/payload/fields/generate-uuid-button/index.js +2 -2
  400. package/dist/shared/payload/fields/index.d.ts +2 -2
  401. package/dist/shared/payload/fields/index.d.ts.map +1 -1
  402. package/dist/shared/payload/fields/index.js +1 -1
  403. package/dist/shared/utils/regex.d.ts.map +1 -1
  404. package/dist/shared/utils/regex.js +1 -1
  405. package/dist/shared/utils/try-catch.d.ts.map +1 -1
  406. package/dist/shared/utils/try-catch.js +1 -1
  407. package/dist/shared/utils/value-or-default.d.ts.map +1 -1
  408. package/dist/shared/utils/value-or-default.js +2 -2
  409. package/package.json +28 -27
@@ -1,4 +1,5 @@
1
1
  import { getAuthTables } from "better-auth/db";
2
+ import { flattenAllFields } from "payload";
2
3
  import { getCollectionByModelKey, getCollectionFieldNameByFieldKeyUntyped, getFieldKeyByCollectionFieldName } from "../../plugin/helpers/get-collection";
3
4
  export const createTransform = (options, enableDebugLogs)=>{
4
5
  const schema = getAuthTables(options);
@@ -36,7 +37,7 @@ export const createTransform = (options, enableDebugLogs)=>{
36
37
  // First try to get the modelName from schema, otherwise fall back to the original model name
37
38
  const collection = schema?.[model]?.modelName || model;
38
39
  debugLog([
39
- 'getCollectionSlug:',
40
+ "getCollectionSlug:",
40
41
  {
41
42
  model,
42
43
  resolvedSlug: collection
@@ -45,6 +46,22 @@ export const createTransform = (options, enableDebugLogs)=>{
45
46
  return collection;
46
47
  }
47
48
  /**
49
+ * Checks if a field in the Payload collection is a relationship or upload field.
50
+ *
51
+ * @param payload - The Payload client instance
52
+ * @param collectionSlug - The slug of the collection
53
+ * @param fieldName - The name of the field to check
54
+ * @returns True if the field is a relationship or upload field, false otherwise
55
+ */ function isPayloadRelationship(payload, collectionSlug, fieldName) {
56
+ const collection = payload.collections[collectionSlug];
57
+ if (!collection) return false;
58
+ const fields = flattenAllFields({
59
+ fields: collection.config.fields
60
+ });
61
+ const field = fields.find((f)=>f.name === fieldName);
62
+ return field?.type === "relationship" || field?.type === "upload";
63
+ }
64
+ /**
48
65
  * Maps a BetterAuth schema field to its corresponding Payload CMS field name.
49
66
  *
50
67
  * This function resolves the appropriate field name by:
@@ -73,8 +90,8 @@ export const createTransform = (options, enableDebugLogs)=>{
73
90
  */ function getFieldName(model, field) {
74
91
  // Special case: 'id' or '_id' is always preserved as-is
75
92
  if ([
76
- 'id',
77
- '_id'
93
+ "id",
94
+ "_id"
78
95
  ].includes(field)) {
79
96
  return field;
80
97
  }
@@ -84,7 +101,7 @@ export const createTransform = (options, enableDebugLogs)=>{
84
101
  const fieldName = fieldDefinition?.fieldName || field;
85
102
  // Log the field resolution for debugging
86
103
  debugLog([
87
- 'getField: ',
104
+ "getField: ",
88
105
  {
89
106
  model,
90
107
  originalField: field,
@@ -141,28 +158,28 @@ export const createTransform = (options, enableDebugLogs)=>{
141
158
  * singleIdQuery({ and: [{ id: { equals: '123' } }] }) // null
142
159
  */ function singleIdQuery(where) {
143
160
  // Return null for empty where clauses or complex queries with 'and'/'or' operators
144
- if (!where || 'and' in where || 'or' in where) return null;
161
+ if (!where || "and" in where || "or" in where) return null;
145
162
  // Check if the where clause contains either 'id' or '_id' field
146
163
  if ([
147
- 'id',
148
- '_id'
164
+ "id",
165
+ "_id"
149
166
  ].some((field)=>field in where)) {
150
167
  // Determine which ID field is being used (support both 'id' and '_id')
151
- const idField = 'id' in where ? 'id' : '_id';
168
+ const idField = "id" in where ? "id" : "_id";
152
169
  const condition = where[idField];
153
170
  // Process the equals operator case
154
- if (condition && typeof condition === 'object' && !Array.isArray(condition) && 'equals' in condition) {
171
+ if (condition && typeof condition === "object" && !Array.isArray(condition) && "equals" in condition) {
155
172
  const value = condition.equals;
156
173
  // Only return string or number ID values
157
- if (typeof value === 'string' || typeof value === 'number') {
174
+ if (typeof value === "string" || typeof value === "number") {
158
175
  return value;
159
176
  }
160
177
  }
161
178
  // Process the contains operator case with a single value
162
- if (condition && typeof condition === 'object' && !Array.isArray(condition) && 'contains' in condition && Array.isArray(condition.contains) && condition.contains.length === 1) {
179
+ if (condition && typeof condition === "object" && !Array.isArray(condition) && "contains" in condition && Array.isArray(condition.contains) && condition.contains.length === 1) {
163
180
  const value = condition.contains[0];
164
181
  // Only return string or number ID values
165
- if (typeof value === 'string' || typeof value === 'number') {
182
+ if (typeof value === "string" || typeof value === "number") {
166
183
  return value;
167
184
  }
168
185
  }
@@ -187,10 +204,10 @@ export const createTransform = (options, enableDebugLogs)=>{
187
204
  return value;
188
205
  }
189
206
  if ([
190
- 'id',
191
- '_id'
207
+ "id",
208
+ "_id"
192
209
  ].includes(key)) {
193
- if (typeof value === 'string' && idType === 'number') {
210
+ if (typeof value === "string" && idType === "number") {
194
211
  const parsed = parseInt(value, 10);
195
212
  if (!isNaN(parsed)) {
196
213
  debugLog([
@@ -203,7 +220,7 @@ export const createTransform = (options, enableDebugLogs)=>{
203
220
  return parsed;
204
221
  }
205
222
  }
206
- if (typeof value === 'number' && idType === 'text') {
223
+ if (typeof value === "number" && idType === "text") {
207
224
  const stringId = String(value);
208
225
  debugLog([
209
226
  `ID conversion: ${key} converting number ID to string`,
@@ -218,7 +235,7 @@ export const createTransform = (options, enableDebugLogs)=>{
218
235
  // Only process relationship fields that need type conversion
219
236
  if (isRelatedField) {
220
237
  // Handle single ID value conversion
221
- if (typeof value === 'string' && idType === 'number') {
238
+ if (typeof value === "string" && idType === "number") {
222
239
  const parsed = parseInt(value, 10);
223
240
  if (!isNaN(parsed)) {
224
241
  debugLog([
@@ -230,7 +247,7 @@ export const createTransform = (options, enableDebugLogs)=>{
230
247
  ]);
231
248
  return parsed;
232
249
  }
233
- } else if (typeof value === 'number' && idType === 'text') {
250
+ } else if (typeof value === "number" && idType === "text") {
234
251
  const stringId = String(value);
235
252
  debugLog([
236
253
  `ID conversion: ${key} converting number ID to string`,
@@ -246,10 +263,10 @@ export const createTransform = (options, enableDebugLogs)=>{
246
263
  return value.map((id)=>{
247
264
  // Skip null/undefined values in arrays
248
265
  if (id === null || id === undefined) return id;
249
- if (idType === 'number' && typeof id === 'string') {
266
+ if (idType === "number" && typeof id === "string") {
250
267
  const parsed = parseInt(id, 10);
251
268
  return !isNaN(parsed) ? parsed : id;
252
- } else if (idType === 'text' && typeof id === 'number') {
269
+ } else if (idType === "text" && typeof id === "number") {
253
270
  return String(id);
254
271
  }
255
272
  return id;
@@ -257,8 +274,8 @@ export const createTransform = (options, enableDebugLogs)=>{
257
274
  }
258
275
  }
259
276
  // Handle role fields (Coming from better auth, will be a single string seperated by commas if theres multiple roles)
260
- if (key === 'role' || key === 'roles') {
261
- return value.split(',').map((role)=>role.trim().toLowerCase());
277
+ if (key === "role" || key === "roles") {
278
+ return value.split(",").map((role)=>role.trim().toLowerCase());
262
279
  }
263
280
  // Return original value if no conversion was needed or applicable
264
281
  return value;
@@ -284,10 +301,14 @@ export const createTransform = (options, enableDebugLogs)=>{
284
301
  if (value === null || value === undefined) {
285
302
  return;
286
303
  }
287
- // Determine if this is a relationship field
288
- const isRelatedField = isRelationshipField(key, schemaFields);
289
304
  // Get the mapped field name from schema (if any)
290
305
  const schemaFieldName = schemaFields[key]?.fieldName;
306
+ const targetFieldName = schemaFieldName || key;
307
+ // Check Payload schema for relationship fields
308
+ const collectionSlug = getCollectionSlug(model);
309
+ const isPayloadRel = isPayloadRelationship(payload, collectionSlug, targetFieldName);
310
+ // Determine if this is a relationship field
311
+ const isRelatedField = isRelationshipField(key, schemaFields) || isPayloadRel;
291
312
  // Normalize the data value based on field type and ID type
292
313
  const normalizedData = normalizeData({
293
314
  idType,
@@ -295,8 +316,6 @@ export const createTransform = (options, enableDebugLogs)=>{
295
316
  value,
296
317
  isRelatedField
297
318
  });
298
- // Use the schema-defined field name if available, otherwise use original key
299
- const targetFieldName = schemaFieldName || key;
300
319
  const targetFieldKey = getCollectionFieldNameByFieldKeyUntyped(getCollectionByModelKey(payload.collections, model), targetFieldName);
301
320
  transformedData[targetFieldKey] = normalizedData;
302
321
  });
@@ -305,7 +324,7 @@ export const createTransform = (options, enableDebugLogs)=>{
305
324
  /**
306
325
  * Checks if a value is a Payload join result (has docs array structure)
307
326
  */ function isJoinResult(value) {
308
- return value !== null && typeof value === 'object' && 'docs' in value && Array.isArray(value.docs);
327
+ return value !== null && typeof value === "object" && "docs" in value && Array.isArray(value.docs);
309
328
  }
310
329
  /**
311
330
  * Flattens a Payload join result to just the array of documents.
@@ -313,7 +332,7 @@ export const createTransform = (options, enableDebugLogs)=>{
313
332
  */ function flattenJoinResult(joinResult) {
314
333
  return joinResult.docs.map((item)=>{
315
334
  // Handle polymorphic join format: { relationTo: string, value: doc }
316
- if (item && typeof item === 'object' && 'value' in item && 'relationTo' in item) {
335
+ if (item && typeof item === "object" && "value" in item && "relationTo" in item) {
317
336
  return item.value;
318
337
  }
319
338
  return item;
@@ -341,14 +360,20 @@ export const createTransform = (options, enableDebugLogs)=>{
341
360
  * @param model - The model name in the BetterAuth schema
342
361
  * @returns The transformed document compatible with BetterAuth
343
362
  */ function transformOutput({ doc, model, payload }) {
344
- if (!doc || typeof doc !== 'object') return doc;
363
+ if (!doc || typeof doc !== "object") return doc;
345
364
  const result = {
346
365
  ...doc
347
366
  };
348
367
  const schemaFields = schema?.[model]?.fields ?? {};
349
368
  // Identify relationship fields with custom field name mappings
350
- const relationshipFields = Object.fromEntries(Object.entries(schemaFields).filter(([key])=>isRelationshipField(key, schemaFields)));
351
- const dateFields = Object.fromEntries(Object.entries(schemaFields).filter(([_, value])=>value.type === 'date'));
369
+ const relationshipFields = Object.fromEntries(Object.entries(schemaFields).filter(([key])=>{
370
+ if (isRelationshipField(key, schemaFields)) return true;
371
+ // Also check payload schema
372
+ const fieldName = schemaFields[key]?.fieldName || key;
373
+ const collectionSlug = getCollectionSlug(model);
374
+ return isPayloadRelationship(payload, collectionSlug, fieldName);
375
+ }));
376
+ const dateFields = Object.fromEntries(Object.entries(schemaFields).filter(([_, value])=>value.type === "date"));
352
377
  // First make sure all the fields keys are correct
353
378
  Object.keys(result).forEach((key)=>{
354
379
  const targetFieldKey = getFieldKeyByCollectionFieldName(getCollectionByModelKey(payload.collections, model), key);
@@ -362,8 +387,8 @@ export const createTransform = (options, enableDebugLogs)=>{
362
387
  const targetFieldKey = getFieldKeyByCollectionFieldName(getCollectionByModelKey(payload.collections, model), key);
363
388
  // Convert ID fields to strings for BetterAuth compatibility
364
389
  if ([
365
- 'id',
366
- '_id'
390
+ "id",
391
+ "_id"
367
392
  ].includes(key)) {
368
393
  result[targetFieldKey] = String(value);
369
394
  return;
@@ -371,7 +396,7 @@ export const createTransform = (options, enableDebugLogs)=>{
371
396
  // Flatten join results from { docs: [...] } to plain arrays
372
397
  if (isJoinResult(value)) {
373
398
  debugLog([
374
- 'transformOutput: flattening join result',
399
+ "transformOutput: flattening join result",
375
400
  {
376
401
  key,
377
402
  targetFieldKey,
@@ -414,7 +439,7 @@ export const createTransform = (options, enableDebugLogs)=>{
414
439
  * @param value - The ID value to normalize (primitive, object, or array)
415
440
  */ function normalizeDocumentIds(result, originalKey, fieldName, value) {
416
441
  // Case 1: Primitive ID value (string or number)
417
- if (typeof value === 'string' || typeof value === 'number') {
442
+ if (typeof value === "string" || typeof value === "number") {
418
443
  // For BetterAuth: Always use string IDs
419
444
  result[originalKey] = String(value);
420
445
  // For Payload: Keep original type
@@ -422,7 +447,7 @@ export const createTransform = (options, enableDebugLogs)=>{
422
447
  return;
423
448
  }
424
449
  // Case 2: Object with ID property
425
- if (typeof value === 'object' && value !== null && !Array.isArray(value) && 'id' in value) {
450
+ if (typeof value === "object" && value !== null && !Array.isArray(value) && "id" in value) {
426
451
  // For BetterAuth: Extract and stringify the ID
427
452
  result[originalKey] = String(value.id);
428
453
  // Preserve the populated relationship object so joins return full documents
@@ -435,7 +460,7 @@ export const createTransform = (options, enableDebugLogs)=>{
435
460
  // Case 3: Array of IDs or references
436
461
  if (Array.isArray(value) && value.length > 0) {
437
462
  // Check if array contains objects with ID properties
438
- if (value.every((item)=>typeof item === 'object' && item !== null && 'id' in item)) {
463
+ if (value.every((item)=>typeof item === "object" && item !== null && "id" in item)) {
439
464
  // Array of objects with IDs
440
465
  result[originalKey] = value.map((item)=>String(item.id));
441
466
  // Keep joined documents intact while normalizing ID type
@@ -471,43 +496,43 @@ export const createTransform = (options, enableDebugLogs)=>{
471
496
  * operatorToPayload('gt', 100)
472
497
  */ function operatorToPayload(operator, value) {
473
498
  switch(operator){
474
- case 'eq':
499
+ case "eq":
475
500
  return {
476
501
  equals: value
477
502
  };
478
- case 'ne':
503
+ case "ne":
479
504
  return {
480
505
  not_equals: value
481
506
  };
482
- case 'gt':
507
+ case "gt":
483
508
  return {
484
509
  greater_than: value
485
510
  };
486
- case 'gte':
511
+ case "gte":
487
512
  return {
488
513
  greater_than_equal: value
489
514
  };
490
- case 'lt':
515
+ case "lt":
491
516
  return {
492
517
  less_than: value
493
518
  };
494
- case 'lte':
519
+ case "lte":
495
520
  return {
496
521
  less_than_equal: value
497
522
  };
498
- case 'contains':
523
+ case "contains":
499
524
  return {
500
525
  contains: value
501
526
  };
502
- case 'in':
527
+ case "in":
503
528
  return {
504
529
  in: value
505
530
  };
506
- case 'starts_with':
531
+ case "starts_with":
507
532
  return {
508
533
  like: `${value}%`
509
534
  };
510
- case 'ends_with':
535
+ case "ends_with":
511
536
  return {
512
537
  like: `%${value}`
513
538
  };
@@ -532,28 +557,28 @@ export const createTransform = (options, enableDebugLogs)=>{
532
557
  */ function convertWhereValue({ value, fieldName, idType }) {
533
558
  // Check if field is an ID field (supporting both MongoDB-style _id and standard id)
534
559
  if ([
535
- 'id',
536
- '_id'
560
+ "id",
561
+ "_id"
537
562
  ].includes(fieldName)) {
538
563
  // Case 1: Value is an object containing an ID property
539
- if (typeof value === 'object' && value !== null && 'id' in value) {
564
+ if (typeof value === "object" && value !== null && "id" in value) {
540
565
  // Extract ID from object
541
566
  const id = value.id;
542
567
  // Use type conversion based on database configuration
543
- if (idType === 'number' && typeof id === 'string') {
568
+ if (idType === "number" && typeof id === "string") {
544
569
  const numId = Number(id);
545
570
  return !isNaN(numId) ? numId : id;
546
571
  }
547
- if (idType === 'text' && typeof id === 'number') {
572
+ if (idType === "text" && typeof id === "number") {
548
573
  return String(id);
549
574
  }
550
575
  return id;
551
576
  }
552
577
  // Case 2: Value is a standalone ID that needs type conversion
553
578
  // Convert string ID to number if database expects numeric IDs
554
- if (idType === 'number' && typeof value === 'string' && !isNaN(Number(value))) {
579
+ if (idType === "number" && typeof value === "string" && !isNaN(Number(value))) {
555
580
  return Number(value);
556
- } else if (idType === 'text' && typeof value === 'number') {
581
+ } else if (idType === "text" && typeof value === "number") {
557
582
  return String(value);
558
583
  }
559
584
  return value;
@@ -597,14 +622,14 @@ export const createTransform = (options, enableDebugLogs)=>{
597
622
  });
598
623
  // Create the Payload where condition with proper operator
599
624
  const res = {
600
- [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? '', value)
625
+ [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
601
626
  };
602
627
  return res;
603
628
  }
604
629
  // Handle multiple conditions by separating AND/OR clauses
605
630
  // Default to AND if no connector is specified
606
- const and = where.filter((w)=>w.connector === 'AND' || !w.connector);
607
- const or = where.filter((w)=>w.connector === 'OR');
631
+ const and = where.filter((w)=>w.connector === "AND" || !w.connector);
632
+ const or = where.filter((w)=>w.connector === "OR");
608
633
  // Process AND conditions
609
634
  const andClause = and.map((w)=>{
610
635
  const fieldName = getFieldName(model, w.field);
@@ -614,7 +639,7 @@ export const createTransform = (options, enableDebugLogs)=>{
614
639
  idType
615
640
  });
616
641
  return {
617
- [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? '', value)
642
+ [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
618
643
  };
619
644
  });
620
645
  // Process OR conditions
@@ -626,7 +651,7 @@ export const createTransform = (options, enableDebugLogs)=>{
626
651
  idType
627
652
  });
628
653
  return {
629
- [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? '', value)
654
+ [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
630
655
  };
631
656
  });
632
657
  // Combine AND and OR clauses into final Payload where object
@@ -686,7 +711,7 @@ export const createTransform = (options, enableDebugLogs)=>{
686
711
  */ function convertSort(model, sortBy) {
687
712
  if (!sortBy) return undefined;
688
713
  const fieldName = getFieldName(model, sortBy.field);
689
- const prefix = sortBy.direction === 'desc' ? '-' : '';
714
+ const prefix = sortBy.direction === "desc" ? "-" : "";
690
715
  return `${prefix}${fieldName}`;
691
716
  }
692
717
  return {
@@ -701,4 +726,4 @@ export const createTransform = (options, enableDebugLogs)=>{
701
726
  };
702
727
  };
703
728
 
704
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRBdXRoVGFibGVzIH0gZnJvbSAnYmV0dGVyLWF1dGgvZGInXG5pbXBvcnQgdHlwZSB7IE1vZGVsS2V5IH0gZnJvbSAnQC9iZXR0ZXItYXV0aC9nZW5lcmF0ZWQtdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBEQkZpZWxkQXR0cmlidXRlIH0gZnJvbSAnYmV0dGVyLWF1dGgvZGInXG5pbXBvcnQgdHlwZSB7IEJhc2VQYXlsb2FkLCBDb2xsZWN0aW9uU2x1ZywgV2hlcmUgYXMgUGF5bG9hZFdoZXJlIH0gZnJvbSAncGF5bG9hZCdcbmltcG9ydCB7XG4gIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5LFxuICBnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQsXG4gIGdldEZpZWxkS2V5QnlDb2xsZWN0aW9uRmllbGROYW1lXG59IGZyb20gJ0AvYmV0dGVyLWF1dGgvcGx1Z2luL2hlbHBlcnMvZ2V0LWNvbGxlY3Rpb24nXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUcmFuc2Zvcm0gPSAob3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsIGVuYWJsZURlYnVnTG9nczogYm9vbGVhbikgPT4ge1xuICBjb25zdCBzY2hlbWEgPSBnZXRBdXRoVGFibGVzKG9wdGlvbnMpXG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgQmV0dGVyQXV0aCBzY2hlbWEgbW9kZWwgbmFtZSB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBjb2xsZWN0aW9uIHNsdWcuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMgdGhlIGFwcHJvcHJpYXRlIGNvbGxlY3Rpb24gc2x1ZyBieTpcbiAgICogMS4gTG9va2luZyB1cCB0aGUgbW9kZWwgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hIHRvIGZpbmQgaXRzIGNvbmZpZ3VyZWQgbW9kZWxOYW1lXG4gICAqIDIuIEZhbGxpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwgbW9kZWwgbmFtZSBpZiBubyBtYXBwaW5nIGV4aXN0c1xuICAgKlxuICAgKiBDb2xsZWN0aW9uIHNsdWcgcmVzb2x1dGlvbiBmb2xsb3dzIHRoZXNlIHJ1bGVzOlxuICAgKiAtIEZvciBiYXNlIGNvbGxlY3Rpb25zOiBUaGUgc2FuaXRpemVCZXR0ZXJBdXRoT3B0aW9ucyBmdW5jdGlvbiBlbnN1cmVzIHRoZSBjb2xsZWN0aW9uIHNsdWdcbiAgICogICBmcm9tIHBsdWdpbiBvcHRpb25zIGlzIHNldCBhcyB0aGUgbW9kZWwgbmFtZSBpbiB0aGUgc2NoZW1hXG4gICAqIC0gRm9yIHBsdWdpbnM6IFRoZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MgY29uc3RhbnQgaXMgdXNlZCBhcyB0aGUgbW9kZWxOYW1lXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBCZXR0ZXJBdXRoIG1vZGVsIG5hbWUgdG8gcmVzb2x2ZVxuICAgKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBjb2xsZWN0aW9uIHNsdWdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10ubW9kZWxOYW1lIGlzICd1c2VycydcbiAgICogZ2V0Q29sbGVjdGlvblNsdWcoJ3VzZXInKSAvLyBSZXR1cm5zICd1c2VycydcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgbW9kZWwgZG9lc24ndCBleGlzdCBpbiBzY2hlbWFcbiAgICogZ2V0Q29sbGVjdGlvblNsdWcoJ2N1c3RvbScpIC8vIFJldHVybnMgJ2N1c3RvbSdcbiAgICpcbiAgICogQHdhcm5pbmcgSWYgYSBjb2xsZWN0aW9uIGlzIG92ZXJyaWRkZW4gdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3Qgc2x1Z3NcbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25TbHVnKG1vZGVsOiBNb2RlbEtleSk6IENvbGxlY3Rpb25TbHVnIHtcbiAgICAvLyBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBtb2RlbE5hbWUgZnJvbSBzY2hlbWEsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWVcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gc2NoZW1hPy5bbW9kZWxdPy5tb2RlbE5hbWUgfHwgbW9kZWxcbiAgICBkZWJ1Z0xvZyhbJ2dldENvbGxlY3Rpb25TbHVnOicsIHsgbW9kZWwsIHJlc29sdmVkU2x1ZzogY29sbGVjdGlvbiB9XSlcbiAgICByZXR1cm4gY29sbGVjdGlvbiBhcyBDb2xsZWN0aW9uU2x1Z1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uaW5jbHVkZXMoZmllbGQpKSB7XG4gICAgICByZXR1cm4gZmllbGRcbiAgICB9XG5cbiAgICAvLyBMb29rIHVwIHRoZSBmaWVsZCBpbiB0aGUgc2NoZW1hXG4gICAgY29uc3QgZmllbGREZWZpbml0aW9uID0gc2NoZW1hW21vZGVsXT8uZmllbGRzW2ZpZWxkXVxuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZFxuXG4gICAgLy8gTG9nIHRoZSBmaWVsZCByZXNvbHV0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICBkZWJ1Z0xvZyhbJ2dldEZpZWxkOiAnLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKVxuXG4gICAgcmV0dXJuIGZpZWxkTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBieSBjaGVja2luZyBmb3IgYSByZWZlcmVuY2VzIHByb3BlcnR5LlxuICAgKlxuICAgKiBSZWxhdGlvbnNoaXAgZmllbGRzIGluIHRoZSBzY2hlbWEgaGF2ZSBhICdyZWZlcmVuY2VzJyBwcm9wZXJ0eSB0aGF0IHBvaW50cyB0byBhbm90aGVyIG1vZGVsLlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyB0byBpZGVudGlmeSByZWxhdGlvbnNoaXAgZmllbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGRLZXkgLSBUaGUga2V5IG9mIHRoZSBmaWVsZCB0byBjaGVjayBpbiB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBzY2hlbWFGaWVsZHMgLSBPYmplY3QgY29udGFpbmluZyBhbGwgZmllbGRzIGZyb20gdGhlIHNjaGVtYSBmb3IgYSBzcGVjaWZpYyBtb2RlbFxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCAoaGFzIHJlZmVyZW5jZXMpLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hLnVzZXIuZmllbGRzLnBvc3RzIGhhcyB7IHJlZmVyZW5jZXM6IHt9IH1cbiAgICogaXNSZWxhdGlvbnNoaXBGaWVsZCgncG9zdHMnLCBzY2hlbWEudXNlci5maWVsZHMpIC8vIFJldHVybnMgdHJ1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMuZW1haWwgaGFzIG5vIHJlZmVyZW5jZXMgcHJvcGVydHlcbiAgICogaXNSZWxhdGlvbnNoaXBGaWVsZCgnZW1haWwnLCBzY2hlbWEudXNlci5maWVsZHMpIC8vIFJldHVybnMgZmFsc2VcbiAgICovXG4gIGZ1bmN0aW9uIGlzUmVsYXRpb25zaGlwRmllbGQoZmllbGRLZXk6IHN0cmluZywgc2NoZW1hRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBEQkZpZWxkQXR0cmlidXRlPik6IGJvb2xlYW4ge1xuICAgIC8vIEEgZmllbGQgaXMgYSByZWxhdGlvbnNoaXAgZmllbGQgaWYgaXQgaGFzIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IGRlZmluZWRcbiAgICByZXR1cm4gc2NoZW1hRmllbGRzW2ZpZWxkS2V5XT8ucmVmZXJlbmNlcyAhPT0gdW5kZWZpbmVkXG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCAnYW5kJyBpbiB3aGVyZSB8fCAnb3InIGluIHdoZXJlKSByZXR1cm4gbnVsbFxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHdoZXJlIGNsYXVzZSBjb250YWlucyBlaXRoZXIgJ2lkJyBvciAnX2lkJyBmaWVsZFxuICAgIGlmIChbJ2lkJywgJ19pZCddLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gJ2lkJyBpbiB3aGVyZSA/ICdpZCcgOiAnX2lkJ1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gd2hlcmVbaWRGaWVsZF1cblxuICAgICAgLy8gUHJvY2VzcyB0aGUgZXF1YWxzIG9wZXJhdG9yIGNhc2VcbiAgICAgIGlmIChjb25kaXRpb24gJiYgdHlwZW9mIGNvbmRpdGlvbiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJiAnZXF1YWxzJyBpbiBjb25kaXRpb24pIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzXG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGNvbmRpdGlvbikgJiZcbiAgICAgICAgJ2NvbnRhaW5zJyBpbiBjb25kaXRpb24gJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShjb25kaXRpb24uY29udGFpbnMpICYmXG4gICAgICAgIGNvbmRpdGlvbi5jb250YWlucy5sZW5ndGggPT09IDFcbiAgICAgICkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jb250YWluc1swXVxuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiBubyB2YWxpZCBJRCBxdWVyeSB3YXMgZm91bmRcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgZGF0YSB2YWx1ZXMgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgcmVxdWlyZWQgSUQgdHlwZVxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzIHRvIGVuc3VyZVxuICAgKiBJRHMgYXJlIGluIHRoZSBjb3JyZWN0IGZvcm1hdCAoc3RyaW5nIG9yIG51bWJlcikgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgZmllbGQga2V5L25hbWVcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICAgKiBAcGFyYW0gaXNSZWxhdGVkRmllbGQgLSBXaGV0aGVyIHRoaXMgZmllbGQgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhKHtcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgaXNSZWxhdGVkRmllbGQsXG4gICAgaWRUeXBlXG4gIH06IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBpc1JlbGF0ZWRGaWVsZDogYm9vbGVhblxuICAgIGlkVHlwZTogJ251bWJlcicgfCAndGV4dCdcbiAgfSkge1xuICAgIC8vIFNraXAgcHJvY2Vzc2luZyBmb3IgbnVsbC91bmRlZmluZWQgdmFsdWVzXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChbJ2lkJywgJ19pZCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIGlkVHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKVxuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIHN0cmluZyBJRCB0byBudW1iZXJgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfV0pXG4gICAgICAgICAgcmV0dXJuIHBhcnNlZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpZFR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBjb25zdCBzdHJpbmdJZCA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgZGVidWdMb2coW2BJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCwgeyBvcmlnaW5hbDogdmFsdWUsIGNvbnZlcnRlZDogc3RyaW5nSWQgfV0pXG4gICAgICAgIHJldHVybiBzdHJpbmdJZFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgcHJvY2VzcyByZWxhdGlvbnNoaXAgZmllbGRzIHRoYXQgbmVlZCB0eXBlIGNvbnZlcnNpb25cbiAgICBpZiAoaXNSZWxhdGVkRmllbGQpIHtcbiAgICAgIC8vIEhhbmRsZSBzaW5nbGUgSUQgdmFsdWUgY29udmVyc2lvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgaWRUeXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApXG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XSlcbiAgICAgICAgICByZXR1cm4gcGFyc2VkXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpZFR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBjb25zdCBzdHJpbmdJZCA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgZGVidWdMb2coW2BJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCwgeyBvcmlnaW5hbDogdmFsdWUsIGNvbnZlcnRlZDogc3RyaW5nSWQgfV0pXG4gICAgICAgIHJldHVybiBzdHJpbmdJZFxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYXJyYXkgb2YgSURzIC0gbWFwIGVhY2ggdmFsdWUgdG8gdGhlIGNvcnJlY3QgdHlwZVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGlkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBudWxsL3VuZGVmaW5lZCB2YWx1ZXMgaW4gYXJyYXlzXG4gICAgICAgICAgaWYgKGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQpIHJldHVybiBpZFxuXG4gICAgICAgICAgaWYgKGlkVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoaWQsIDEwKVxuICAgICAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZWQpID8gcGFyc2VkIDogaWRcbiAgICAgICAgICB9IGVsc2UgaWYgKGlkVHlwZSA9PT0gJ3RleHQnICYmIHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpZFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSByb2xlIGZpZWxkcyAoQ29taW5nIGZyb20gYmV0dGVyIGF1dGgsIHdpbGwgYmUgYSBzaW5nbGUgc3RyaW5nIHNlcGVyYXRlZCBieSBjb21tYXMgaWYgdGhlcmVzIG11bHRpcGxlIHJvbGVzKVxuICAgIGlmIChrZXkgPT09ICdyb2xlJyB8fCBrZXkgPT09ICdyb2xlcycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcCgocm9sZTogc3RyaW5nKSA9PiByb2xlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKVxuICAgIH1cblxuICAgIC8vIFJldHVybiBvcmlnaW5hbCB2YWx1ZSBpZiBubyBjb252ZXJzaW9uIHdhcyBuZWVkZWQgb3IgYXBwbGljYWJsZVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoIHRvIFBheWxvYWQgQ01TIGZvcm1hdFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXM6XG4gICAqIDEuIEZpZWxkIG5hbWUgbWFwcGluZyBhY2NvcmRpbmcgdG8gc2NoZW1hIGRlZmluaXRpb25zXG4gICAqIDIuIElEIHR5cGUgY29udmVyc2lvbiBmb3IgcmVsYXRpb25zaGlwIGZpZWxkc1xuICAgKiAzLiBQcm9wZXIgZGF0YSBub3JtYWxpemF0aW9uIGJhc2VkIG9uIGZpZWxkIHR5cGVzXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGlucHV0IGRhdGEgZnJvbSBiZXR0ZXItYXV0aFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBpbiB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcmV0dXJucyBUcmFuc2Zvcm1lZCBkYXRhIGNvbXBhdGlibGUgd2l0aCBQYXlsb2FkIENNU1xuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtSW5wdXQoe1xuICAgIGRhdGEsXG4gICAgbW9kZWwsXG4gICAgaWRUeXBlLFxuICAgIHBheWxvYWRcbiAgfToge1xuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBtb2RlbDogTW9kZWxLZXlcbiAgICBpZFR5cGU6ICdudW1iZXInIHwgJ3RleHQnXG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWRcbiAgfSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gc2NoZW1hPy5bbW9kZWxdPy5maWVsZHMgPz8ge31cblxuICAgIC8vIFByb2Nlc3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gU2tpcCBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgICAgY29uc3QgaXNSZWxhdGVkRmllbGQgPSBpc1JlbGF0aW9uc2hpcEZpZWxkKGtleSwgc2NoZW1hRmllbGRzKVxuXG4gICAgICAvLyBHZXQgdGhlIG1hcHBlZCBmaWVsZCBuYW1lIGZyb20gc2NoZW1hIChpZiBhbnkpXG4gICAgICBjb25zdCBzY2hlbWFGaWVsZE5hbWUgPSBzY2hlbWFGaWVsZHNba2V5XT8uZmllbGROYW1lXG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgZGF0YSB2YWx1ZSBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCBJRCB0eXBlXG4gICAgICBjb25zdCBub3JtYWxpemVkRGF0YSA9IG5vcm1hbGl6ZURhdGEoe1xuICAgICAgICBpZFR5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGlzUmVsYXRlZEZpZWxkXG4gICAgICB9KVxuXG4gICAgICAvLyBVc2UgdGhlIHNjaGVtYS1kZWZpbmVkIGZpZWxkIG5hbWUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIG9yaWdpbmFsIGtleVxuICAgICAgY29uc3QgdGFyZ2V0RmllbGROYW1lID0gc2NoZW1hRmllbGROYW1lIHx8IGtleVxuICAgICAgY29uc3QgdGFyZ2V0RmllbGRLZXkgPSBnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQoZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkocGF5bG9hZC5jb2xsZWN0aW9ucywgbW9kZWwpLCB0YXJnZXRGaWVsZE5hbWUpXG4gICAgICB0cmFuc2Zvcm1lZERhdGFbdGFyZ2V0RmllbGRLZXldID0gbm9ybWFsaXplZERhdGFcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgUGF5bG9hZCBqb2luIHJlc3VsdCAoaGFzIGRvY3MgYXJyYXkgc3RydWN0dXJlKVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKb2luUmVzdWx0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyB7IGRvY3M6IGFueVtdOyBoYXNOZXh0UGFnZT86IGJvb2xlYW47IHRvdGFsRG9jcz86IG51bWJlciB9IHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdkb2NzJyBpbiB2YWx1ZSAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZS5kb2NzKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVucyBhIFBheWxvYWQgam9pbiByZXN1bHQgdG8ganVzdCB0aGUgYXJyYXkgb2YgZG9jdW1lbnRzLlxuICAgKiBIYW5kbGVzIGJvdGggZGlyZWN0IGRvY3VtZW50cyBhbmQgcG9seW1vcnBoaWMgeyByZWxhdGlvblRvLCB2YWx1ZSB9IGZvcm1hdC5cbiAgICovXG4gIGZ1bmN0aW9uIGZsYXR0ZW5Kb2luUmVzdWx0KGpvaW5SZXN1bHQ6IHsgZG9jczogYW55W10gfSk6IGFueVtdIHtcbiAgICByZXR1cm4gam9pblJlc3VsdC5kb2NzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgLy8gSGFuZGxlIHBvbHltb3JwaGljIGpvaW4gZm9ybWF0OiB7IHJlbGF0aW9uVG86IHN0cmluZywgdmFsdWU6IGRvYyB9XG4gICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgJ3ZhbHVlJyBpbiBpdGVtICYmICdyZWxhdGlvblRvJyBpbiBpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlXG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBQYXlsb2FkIENNUyBkb2N1bWVudCBvdXRwdXQgdG8gbWF0Y2ggQmV0dGVyQXV0aCBzY2hlbWEgZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgc2V2ZXJhbCBjcml0aWNhbCB0cmFuc2Zvcm1hdGlvbnM6XG4gICAqXG4gICAqIDEuIElEIENvbnZlcnNpb246IEVuc3VyZXMgYWxsIElEIGZpZWxkcyBhcmUgc3RyaW5ncyBhcyByZXF1aXJlZCBieSBCZXR0ZXJBdXRoXG4gICAqICAgIChzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZXR0ZXItYXV0aC9iZXR0ZXItYXV0aC9ibG9iL21haW4vcGFja2FnZXMvYmV0dGVyLWF1dGgvc3JjL2RiL3NjaGVtYS50cyNMMTI1KVxuICAgKlxuICAgKiAyLiBSZWxhdGlvbnNoaXAgRmllbGQgTWFwcGluZzogQWxpZ25zIHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCBCZXR0ZXJBdXRoIHNjaGVtYSBuYW1pbmcgY29udmVudGlvbnNcbiAgICogICAgYW5kIGVuc3VyZXMgcHJvcGVyIElEIHR5cGUgaGFuZGxpbmdcbiAgICpcbiAgICogMy4gRGF0ZSBDb252ZXJzaW9uOiBUcmFuc2Zvcm1zIGRhdGUgc3RyaW5ncyBmcm9tIFBheWxvYWQgaW50byBEYXRlIG9iamVjdHMgZm9yIEJldHRlckF1dGhcbiAgICpcbiAgICogNC4gSm9pbiBSZXN1bHQgRmxhdHRlbmluZzogQ29udmVydHMgUGF5bG9hZCdzIHsgZG9jczogWy4uLl0gfSBqb2luIGZvcm1hdCB0byBwbGFpbiBhcnJheXNcbiAgICpcbiAgICogTm90ZTogV2hpbGUgc2V0dGluZyBkZXB0aDogMSBpbiBQYXlsb2FkIG9wZXJhdGlvbnMgc2ltcGxpZmllcyB0aGlzIHByb2Nlc3MgYnkgYXZvaWRpbmdcbiAgICogZGVlcGx5IG5lc3RlZCBvYmplY3RzLCB3ZSBtYWludGFpbiBjb21wcmVoZW5zaXZlIGNoZWNrcyBmb3Igcm9idXN0bmVzcy5cbiAgICpcbiAgICogQHBhcmFtIGRvYyAtIFRoZSBkb2N1bWVudCByZXR1cm5lZCBmcm9tIFBheWxvYWQgQ01TXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQgY29tcGF0aWJsZSB3aXRoIEJldHRlckF1dGhcbiAgICovXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybU91dHB1dDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw+KHtcbiAgICBkb2MsXG4gICAgbW9kZWwsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgZG9jOiBUXG4gICAgbW9kZWw6IE1vZGVsS2V5XG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWRcbiAgfSk6IFQge1xuICAgIGlmICghZG9jIHx8IHR5cGVvZiBkb2MgIT09ICdvYmplY3QnKSByZXR1cm4gZG9jXG5cbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLmRvYyB9XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gc2NoZW1hPy5bbW9kZWxdPy5maWVsZHMgPz8ge31cblxuICAgIC8vIElkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCBjdXN0b20gZmllbGQgbmFtZSBtYXBwaW5nc1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcEZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW2tleV0pID0+IGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpKSlcbiAgICBjb25zdCBkYXRlRmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNjaGVtYUZpZWxkcykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZS50eXBlID09PSAnZGF0ZScpKVxuXG4gICAgLy8gRmlyc3QgbWFrZSBzdXJlIGFsbCB0aGUgZmllbGRzIGtleXMgYXJlIGNvcnJlY3RcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0RmllbGRLZXkgPSBnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZShnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksIGtleSlcbiAgICAgIGlmICh0YXJnZXRGaWVsZEtleSAhPT0ga2V5KSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSByZXN1bHRba2V5XVxuICAgICAgICBkZWxldGUgcmVzdWx0W2tleV1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgT2JqZWN0LmVudHJpZXMoZG9jKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgY29uc3QgdGFyZ2V0RmllbGRLZXkgPSBnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZShnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksIGtleSlcblxuICAgICAgLy8gQ29udmVydCBJRCBmaWVsZHMgdG8gc3RyaW5ncyBmb3IgQmV0dGVyQXV0aCBjb21wYXRpYmlsaXR5XG4gICAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBTdHJpbmcodmFsdWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBGbGF0dGVuIGpvaW4gcmVzdWx0cyBmcm9tIHsgZG9jczogWy4uLl0gfSB0byBwbGFpbiBhcnJheXNcbiAgICAgIGlmIChpc0pvaW5SZXN1bHQodmFsdWUpKSB7XG4gICAgICAgIGRlYnVnTG9nKFsndHJhbnNmb3JtT3V0cHV0OiBmbGF0dGVuaW5nIGpvaW4gcmVzdWx0JywgeyBrZXksIHRhcmdldEZpZWxkS2V5LCBpc0FycmF5OiBBcnJheS5pc0FycmF5KHZhbHVlLmRvY3MpIH1dKVxuICAgICAgICByZXN1bHRbdGFyZ2V0RmllbGRLZXldID0gZmxhdHRlbkpvaW5SZXN1bHQodmFsdWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIHJlbmFtZWQgZmllbGROYW1lc1xuICAgICAgY29uc3Qgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXkgPSBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBGaWVsZHMpLmZpbmQoKGspID0+IHJlbGF0aW9uc2hpcEZpZWxkc1trXS5maWVsZE5hbWUgPT09IGtleSlcbiAgICAgIGlmIChvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSkge1xuICAgICAgICBub3JtYWxpemVEb2N1bWVudElkcyhyZXN1bHQsIG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5LCBrZXksIHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3JpZ2luYWxEYXRlRmllbGRLZXkgPSBPYmplY3Qua2V5cyhkYXRlRmllbGRzKS5maW5kKChrKSA9PiBkYXRlRmllbGRzW2tdLmZpZWxkTmFtZSA9PT0ga2V5KVxuICAgICAgaWYgKG9yaWdpbmFsRGF0ZUZpZWxkS2V5KSB7XG4gICAgICAgIC8vIENvbnZlcnQgSVNPIGRhdGUgc3RyaW5ncyB0byBEYXRlIG9iamVjdHMgZm9yIEJldHRlckF1dGhcbiAgICAgICAgcmVzdWx0W3RhcmdldEZpZWxkS2V5XSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBJRCBmaWVsZHMgZm9yIGJvdGggcHJpbWFyeSBhbmQgcmVsYXRpb25zaGlwIGRvY3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIGNvbnNpc3RlbnQgSUQgaGFuZGxpbmcgYmV0d2VlbiBCZXR0ZXJBdXRoIGFuZCBQYXlsb2FkIENNUyBieTpcbiAgICogMS4gQ29udmVydGluZyBhbGwgSURzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggKHN0b3JlZCBpbiBvcmlnaW5hbEtleSlcbiAgICogMi4gUHJlc2VydmluZyBvcmlnaW5hbCBJRCB0eXBlcyBmb3IgUGF5bG9hZCBDTVMgKHN0b3JlZCBpbiBmaWVsZE5hbWUpXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHZhcmlvdXMgSUQgZm9ybWF0czpcbiAgICogLSBQcmltaXRpdmUgdmFsdWVzIChzdHJpbmcvbnVtYmVyIElEcylcbiAgICogLSBPYmplY3QgcmVmZXJlbmNlcyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICogLSBBcnJheXMgb2YgZWl0aGVyIHByaW1pdGl2ZSBJRHMgb3Igb2JqZWN0IHJlZmVyZW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHRyYW5zZm9ybWVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEtleSAtIFRoZSBvcmlnaW5hbCBmaWVsZCBrZXkgZnJvbSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIHJlbmFtZWQgZmllbGQgYXMgdXNlZCBpbiBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSUQgdmFsdWUgdG8gbm9ybWFsaXplIChwcmltaXRpdmUsIG9iamVjdCwgb3IgYXJyYXkpXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEb2N1bWVudElkcyhyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIG9yaWdpbmFsS2V5OiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gQ2FzZSAxOiBQcmltaXRpdmUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gRm9yIEJldHRlckF1dGg6IEFsd2F5cyB1c2Ugc3RyaW5nIElEc1xuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZSlcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBLZWVwIG9yaWdpbmFsIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENhc2UgMjogT2JqZWN0IHdpdGggSUQgcHJvcGVydHlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgJ2lkJyBpbiB2YWx1ZSkge1xuICAgICAgLy8gRm9yIEJldHRlckF1dGg6IEV4dHJhY3QgYW5kIHN0cmluZ2lmeSB0aGUgSURcbiAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSBTdHJpbmcodmFsdWUuaWQpXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcG9wdWxhdGVkIHJlbGF0aW9uc2hpcCBvYmplY3Qgc28gam9pbnMgcmV0dXJuIGZ1bGwgZG9jdW1lbnRzXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHtcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIGlkOiBTdHJpbmcodmFsdWUuaWQpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXNlIDM6IEFycmF5IG9mIElEcyBvciByZWZlcmVuY2VzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNrIGlmIGFycmF5IGNvbnRhaW5zIG9iamVjdHMgd2l0aCBJRCBwcm9wZXJ0aWVzXG4gICAgICBpZiAodmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsICYmICdpZCcgaW4gaXRlbSkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIElEc1xuICAgICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gdmFsdWUubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbS5pZCkpXG4gICAgICAgIC8vIEtlZXAgam9pbmVkIGRvY3VtZW50cyBpbnRhY3Qgd2hpbGUgbm9ybWFsaXppbmcgSUQgdHlwZVxuICAgICAgICByZXN1bHRbZmllbGROYW1lXSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGlkOiBTdHJpbmcoaXRlbS5pZClcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcnJheSBvZiBwcmltaXRpdmUgSURzXG4gICAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSlcbiAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IGl0ZW0pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBOb3RlOiBJZiB2YWx1ZSBkb2Vzbid0IG1hdGNoIGFueSBleHBlY3RlZCBmb3JtYXQsIG5vIGNoYW5nZXMgYXJlIG1hZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEJldHRlckF1dGggb3BlcmF0b3IgdG8gdGhlIGVxdWl2YWxlbnQgUGF5bG9hZCBDTVMgcXVlcnkgb3BlcmF0b3JcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtYXBzIHN0YW5kYXJkIHF1ZXJ5IG9wZXJhdG9ycyBmcm9tIEJldHRlckF1dGgncyBmb3JtYXQgdG9cbiAgICogdGhlIHNwZWNpZmljIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdG9yIC0gVGhlIEJldHRlckF1dGggb3BlcmF0b3Igc3RyaW5nIChlLmcuLCAnZXEnLCAnZ3QnLCAnY29udGFpbnMnKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdXNlZCB3aXRoIHRoZSBvcGVyYXRvclxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgUGF5bG9hZC1jb21wYXRpYmxlIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZXF1YWxzOiAndGVzdEBleGFtcGxlLmNvbScgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZXEnLCAndGVzdEBleGFtcGxlLmNvbScpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBncmVhdGVyX3RoYW46IDEwMCB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdndCcsIDEwMClcbiAgICovXG4gIGZ1bmN0aW9uIG9wZXJhdG9yVG9QYXlsb2FkKG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlICdlcSc6XG4gICAgICAgIHJldHVybiB7IGVxdWFsczogdmFsdWUgfVxuICAgICAgY2FzZSAnbmUnOlxuICAgICAgICByZXR1cm4geyBub3RfZXF1YWxzOiB2YWx1ZSB9XG4gICAgICBjYXNlICdndCc6XG4gICAgICAgIHJldHVybiB7IGdyZWF0ZXJfdGhhbjogdmFsdWUgfVxuICAgICAgY2FzZSAnZ3RlJzpcbiAgICAgICAgcmV0dXJuIHsgZ3JlYXRlcl90aGFuX2VxdWFsOiB2YWx1ZSB9XG4gICAgICBjYXNlICdsdCc6XG4gICAgICAgIHJldHVybiB7IGxlc3NfdGhhbjogdmFsdWUgfVxuICAgICAgY2FzZSAnbHRlJzpcbiAgICAgICAgcmV0dXJuIHsgbGVzc190aGFuX2VxdWFsOiB2YWx1ZSB9XG4gICAgICBjYXNlICdjb250YWlucyc6XG4gICAgICAgIHJldHVybiB7IGNvbnRhaW5zOiB2YWx1ZSB9XG4gICAgICBjYXNlICdpbic6XG4gICAgICAgIHJldHVybiB7IGluOiB2YWx1ZSB9XG4gICAgICBjYXNlICdzdGFydHNfd2l0aCc6XG4gICAgICAgIHJldHVybiB7IGxpa2U6IGAke3ZhbHVlfSVgIH1cbiAgICAgIGNhc2UgJ2VuZHNfd2l0aCc6XG4gICAgICAgIHJldHVybiB7IGxpa2U6IGAlJHt2YWx1ZX1gIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBlcXVhbHMgZm9yIHVucmVjb2duaXplZCBvcGVyYXRvcnNcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgd2hlcmUgY2xhdXNlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGJhc2VkIG9uIGZpZWxkIG5hbWUgYW5kIElEIHR5cGUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdHdvIG1haW4gc2NlbmFyaW9zOlxuICAgKiAxLiBJRCBmaWVsZCBjb252ZXJzaW9uIC0gZW5zdXJlcyBJRHMgbWF0Y2ggdGhlIGRhdGFiYXNlJ3MgZXhwZWN0ZWQgdHlwZSAobnVtYmVyIG9yIHN0cmluZylcbiAgICogMi4gT2JqZWN0IHdpdGggZW1iZWRkZWQgSUQgLSBleHRyYWN0cyBhbmQgY29udmVydHMgdGhlIElEIHByb3BlcnR5IGZyb20gb2JqZWN0c1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoY2FuIGJlIHByaW1pdGl2ZSwgb2JqZWN0IHdpdGggSUQsIG9yIGFycmF5KVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHF1ZXJpZWRcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHZhbHVlIGFwcHJvcHJpYXRlIGZvciB0aGUgZGF0YWJhc2UgcXVlcnlcbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRXaGVyZVZhbHVlKHsgdmFsdWUsIGZpZWxkTmFtZSwgaWRUeXBlIH06IHsgdmFsdWU6IGFueTsgZmllbGROYW1lOiBzdHJpbmc7IGlkVHlwZTogJ251bWJlcicgfCAndGV4dCcgfSkge1xuICAgIC8vIENoZWNrIGlmIGZpZWxkIGlzIGFuIElEIGZpZWxkIChzdXBwb3J0aW5nIGJvdGggTW9uZ29EQi1zdHlsZSBfaWQgYW5kIHN0YW5kYXJkIGlkKVxuICAgIGlmIChbJ2lkJywgJ19pZCddLmluY2x1ZGVzKGZpZWxkTmFtZSkpIHtcbiAgICAgIC8vIENhc2UgMTogVmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gSUQgcHJvcGVydHlcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdpZCcgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBJRCBmcm9tIG9iamVjdFxuICAgICAgICBjb25zdCBpZCA9IHZhbHVlLmlkXG5cbiAgICAgICAgLy8gVXNlIHR5cGUgY29udmVyc2lvbiBiYXNlZCBvbiBkYXRhYmFzZSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChpZFR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBudW1JZCA9IE51bWJlcihpZClcbiAgICAgICAgICByZXR1cm4gIWlzTmFOKG51bUlkKSA/IG51bUlkIDogaWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZFR5cGUgPT09ICd0ZXh0JyAmJiB0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhpZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpZFxuICAgICAgfVxuICAgICAgLy8gQ2FzZSAyOiBWYWx1ZSBpcyBhIHN0YW5kYWxvbmUgSUQgdGhhdCBuZWVkcyB0eXBlIGNvbnZlcnNpb25cbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIElEIHRvIG51bWJlciBpZiBkYXRhYmFzZSBleHBlY3RzIG51bWVyaWMgSURzXG4gICAgICBpZiAoaWRUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCBudW1lcmljIElEIHRvIHN0cmluZyBpZiBkYXRhYmFzZSBleHBlY3RzIHRleHQgSURzXG4gICAgICBlbHNlIGlmIChpZFR5cGUgPT09ICd0ZXh0JyAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICAvLyBGb3Igbm9uLUlEIGZpZWxkcywgcmV0dXJuIHRoZSB2YWx1ZSB1bmNoYW5nZWRcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBCZXR0ZXIgQXV0aCB3aGVyZSBjbGF1c2VzIHRvIFBheWxvYWQgQ01TIGNvbXBhdGlibGUgd2hlcmUgY29uZGl0aW9uc1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIEJldHRlciBBdXRoIHF1ZXJ5IGZvcm1hdCBpbnRvIFBheWxvYWQncyBxdWVyeSBmb3JtYXQsXG4gICAqIGhhbmRsaW5nIGZpZWxkIG5hbWUgbWFwcGluZywgdmFsdWUgdHlwZSBjb252ZXJzaW9uLCBhbmQgbG9naWNhbCBvcGVyYXRvcnMgKEFORC9PUikuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHRocmVlIG1haW4gY2FzZXM6XG4gICAqIDEuIEVtcHR5IG9yIHVuZGVmaW5lZCB3aGVyZSBjbGF1c2UgLSByZXR1cm5zIGVtcHR5IG9iamVjdFxuICAgKiAyLiBTaW5nbGUgY29uZGl0aW9uIC0gY29udmVydHMgdG8gYSBzaW1wbGUgZmllbGQtdmFsdWUgcGFpclxuICAgKiAzLiBNdWx0aXBsZSBjb25kaXRpb25zIC0gZ3JvdXBzIGJ5IEFORC9PUiBjb25uZWN0b3JzIGFuZCBidWlsZHMgYSBjb21wbGV4IHF1ZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZGF0YWJhc2UgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSB3aGVyZSAtIEFycmF5IG9mIEJldHRlciBBdXRoIHdoZXJlIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgd2hlcmUgY2xhdXNlIG9iamVjdFxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICBpZFR5cGUsXG4gICAgbW9kZWwsXG4gICAgd2hlcmUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0J1xuICAgIG1vZGVsOiBNb2RlbEtleVxuICAgIHdoZXJlPzogV2hlcmVbXVxuICAgIHBheWxvYWQ6IEJhc2VQYXlsb2FkXG4gIH0pOiBQYXlsb2FkV2hlcmUge1xuICAgIC8vIEhhbmRsZSBlbXB0eSB3aGVyZSBjbGF1c2VcbiAgICBpZiAoIXdoZXJlKSByZXR1cm4ge31cblxuICAgIGZ1bmN0aW9uIGdldFBheWxvYWRGaWVsZE5hbWUoZmllbGRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSwgZmllbGRLZXkpXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNpbmdsZSBjb25kaXRpb24gY2FzZSBmb3Igb3B0aW1pemF0aW9uXG4gICAgaWYgKHdoZXJlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdyA9IHdoZXJlWzBdXG4gICAgICBpZiAoIXcpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCBmaWVsZCBuYW1lIGFjY29yZGluZyB0byBzY2hlbWEgYW5kIGNvbnZlcnQgdmFsdWUgdG8gYXBwcm9wcmlhdGUgdHlwZVxuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKVxuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgIHZhbHVlOiB3LnZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIGlkVHlwZVxuICAgICAgfSlcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBQYXlsb2FkIHdoZXJlIGNvbmRpdGlvbiB3aXRoIHByb3BlciBvcGVyYXRvclxuICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICBbZ2V0UGF5bG9hZEZpZWxkTmFtZShmaWVsZE5hbWUpXTogb3BlcmF0b3JUb1BheWxvYWQody5vcGVyYXRvciA/PyAnJywgdmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgY29uZGl0aW9ucyBieSBzZXBhcmF0aW5nIEFORC9PUiBjbGF1c2VzXG4gICAgLy8gRGVmYXVsdCB0byBBTkQgaWYgbm8gY29ubmVjdG9yIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGFuZCA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09ICdBTkQnIHx8ICF3LmNvbm5lY3RvcilcbiAgICBjb25zdCBvciA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09ICdPUicpXG5cbiAgICAvLyBQcm9jZXNzIEFORCBjb25kaXRpb25zXG4gICAgY29uc3QgYW5kQ2xhdXNlID0gYW5kLm1hcCgodykgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKVxuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgIHZhbHVlOiB3LnZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIGlkVHlwZVxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZCh3Lm9wZXJhdG9yID8/ICcnLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gUHJvY2VzcyBPUiBjb25kaXRpb25zXG4gICAgY29uc3Qgb3JDbGF1c2UgPSBvci5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZClcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbZ2V0UGF5bG9hZEZpZWxkTmFtZShmaWVsZE5hbWUpXTogb3BlcmF0b3JUb1BheWxvYWQody5vcGVyYXRvciA/PyAnJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIENvbWJpbmUgQU5EIGFuZCBPUiBjbGF1c2VzIGludG8gZmluYWwgUGF5bG9hZCB3aGVyZSBvYmplY3RcbiAgICAvLyBPbmx5IGluY2x1ZGUgbm9uLWVtcHR5IGNsYXVzZSBhcnJheXNcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGFuZENsYXVzZS5sZW5ndGggPyB7IEFORDogYW5kQ2xhdXNlIH0gOiB7fSksXG4gICAgICAuLi4ob3JDbGF1c2UubGVuZ3RoID8geyBPUjogb3JDbGF1c2UgfSA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNlbGVjdCBhcnJheSB0byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNlbGVjdCBhcnJheSAod2hpY2ggY29udGFpbnMgZmllbGQgbmFtZXMpXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYW4gb2JqZWN0IHdpdGggZmllbGQgbmFtZXMgYXMga2V5c1xuICAgKiBhbmQgYm9vbGVhbiB0cnVlIGFzIHZhbHVlcykuXG4gICAqXG4gICAqIEl0IGFsc28gaGFuZGxlcyBmaWVsZCBuYW1lIG1hcHBpbmcgYmV0d2VlbiBiZXR0ZXItYXV0aCBzY2hlbWEgYW5kIFBheWxvYWQgY29sbGVjdGlvbnNcbiAgICogYnkgdXNpbmcgdGhlIGdldEZpZWxkTmFtZSBoZWxwZXIgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCBmaWVsZCBuYW1lcy5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsL2NvbGxlY3Rpb24gbmFtZSB0byBnZXQgZmllbGQgbWFwcGluZ3MgZnJvbVxuICAgKiBAcGFyYW0gc2VsZWN0IC0gT3B0aW9uYWwgYXJyYXkgb2YgZmllbGQgbmFtZXMgdG8gc2VsZWN0XG4gICAqIEByZXR1cm5zIEEgUGF5bG9hZC1jb21wYXRpYmxlIHNlbGVjdCBvYmplY3Qgb3IgdW5kZWZpbmVkIGlmIG5vIGZpZWxkcyB0byBzZWxlY3RcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IFsnZW1haWwnLCAnbmFtZSddXG4gICAqIC8vIE91dHB1dDogeyBlbWFpbDogdHJ1ZSwgbmFtZTogdHJ1ZSB9XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U2VsZWN0KG1vZGVsOiBNb2RlbEtleSwgc2VsZWN0Pzogc3RyaW5nW10pIHtcbiAgICAvLyBSZXR1cm4gdW5kZWZpbmVkIGlmIHNlbGVjdCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWRcbiAgICBpZiAoIXNlbGVjdCB8fCBzZWxlY3QubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAvLyBUcmFuc2Zvcm0gdGhlIGFycmF5IG9mIGZpZWxkIG5hbWVzIGludG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICAvLyB3aGlsZSBhbHNvIG1hcHBpbmcgYW55IGZpZWxkIG5hbWVzIHRoYXQgbWlnaHQgYmUgZGlmZmVyZW50IGluIFBheWxvYWRcbiAgICByZXR1cm4gc2VsZWN0LnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4gKHsgLi4uYWNjLCBbZ2V0RmllbGROYW1lKG1vZGVsLCBmaWVsZCldOiB0cnVlIH0pLCB7fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0IHRvIGEgUGF5bG9hZCBzb3J0IHN0cmluZ1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lIGFuZCBkaXJlY3Rpb24pXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYSBzdHJpbmcgd2l0aCBvcHRpb25hbCAnLScgcHJlZml4IGZvciBkZXNjZW5kaW5nIG9yZGVyKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzb3J0QnkgLSBPcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBmaWVsZCBuYW1lIGFuZCBzb3J0IGRpcmVjdGlvblxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzb3J0IHN0cmluZyBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdlbWFpbCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnLWVtYWlsJ1xuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2FzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICdjcmVhdGVkQXQnXG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U29ydChtb2RlbDogTW9kZWxLZXksIHNvcnRCeT86IHsgZmllbGQ6IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB9KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNvcnRCeSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgc29ydEJ5LmZpZWxkKVxuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09ICdkZXNjJyA/ICctJyA6ICcnXG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke2ZpZWxkTmFtZX1gXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldEZpZWxkTmFtZSxcbiAgICBnZXRDb2xsZWN0aW9uU2x1ZyxcbiAgICBzaW5nbGVJZFF1ZXJ5LFxuICAgIHRyYW5zZm9ybUlucHV0LFxuICAgIHRyYW5zZm9ybU91dHB1dCxcbiAgICBjb252ZXJ0V2hlcmVDbGF1c2UsXG4gICAgY29udmVydFNlbGVjdCxcbiAgICBjb252ZXJ0U29ydFxuICB9XG59XG4iXSwibmFtZXMiOlsiZ2V0QXV0aFRhYmxlcyIsImdldENvbGxlY3Rpb25CeU1vZGVsS2V5IiwiZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkIiwiZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUiLCJjcmVhdGVUcmFuc2Zvcm0iLCJvcHRpb25zIiwiZW5hYmxlRGVidWdMb2dzIiwic2NoZW1hIiwiZGVidWdMb2ciLCJtZXNzYWdlIiwiY29uc29sZSIsImxvZyIsImdldENvbGxlY3Rpb25TbHVnIiwibW9kZWwiLCJjb2xsZWN0aW9uIiwibW9kZWxOYW1lIiwicmVzb2x2ZWRTbHVnIiwiZ2V0RmllbGROYW1lIiwiZmllbGQiLCJpbmNsdWRlcyIsImZpZWxkRGVmaW5pdGlvbiIsImZpZWxkcyIsImZpZWxkTmFtZSIsIm9yaWdpbmFsRmllbGQiLCJpc1JlbGF0aW9uc2hpcEZpZWxkIiwiZmllbGRLZXkiLCJzY2hlbWFGaWVsZHMiLCJyZWZlcmVuY2VzIiwidW5kZWZpbmVkIiwic2luZ2xlSWRRdWVyeSIsIndoZXJlIiwic29tZSIsImlkRmllbGQiLCJjb25kaXRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJ2YWx1ZSIsImVxdWFscyIsImNvbnRhaW5zIiwibGVuZ3RoIiwibm9ybWFsaXplRGF0YSIsImtleSIsImlzUmVsYXRlZEZpZWxkIiwiaWRUeXBlIiwicGFyc2VkIiwicGFyc2VJbnQiLCJpc05hTiIsIm9yaWdpbmFsIiwiY29udmVydGVkIiwic3RyaW5nSWQiLCJTdHJpbmciLCJtYXAiLCJpZCIsInNwbGl0Iiwicm9sZSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInRyYW5zZm9ybUlucHV0IiwiZGF0YSIsInBheWxvYWQiLCJ0cmFuc2Zvcm1lZERhdGEiLCJPYmplY3QiLCJlbnRyaWVzIiwiZm9yRWFjaCIsInNjaGVtYUZpZWxkTmFtZSIsIm5vcm1hbGl6ZWREYXRhIiwidGFyZ2V0RmllbGROYW1lIiwidGFyZ2V0RmllbGRLZXkiLCJjb2xsZWN0aW9ucyIsImlzSm9pblJlc3VsdCIsImRvY3MiLCJmbGF0dGVuSm9pblJlc3VsdCIsImpvaW5SZXN1bHQiLCJpdGVtIiwidHJhbnNmb3JtT3V0cHV0IiwiZG9jIiwicmVzdWx0IiwicmVsYXRpb25zaGlwRmllbGRzIiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJkYXRlRmllbGRzIiwiXyIsInR5cGUiLCJrZXlzIiwib3JpZ2luYWxSZWxhdGVkRmllbGRLZXkiLCJmaW5kIiwiayIsIm5vcm1hbGl6ZURvY3VtZW50SWRzIiwib3JpZ2luYWxEYXRlRmllbGRLZXkiLCJEYXRlIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIm9wZXJhdG9yVG9QYXlsb2FkIiwib3BlcmF0b3IiLCJub3RfZXF1YWxzIiwiZ3JlYXRlcl90aGFuIiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwibGVzc190aGFuIiwibGVzc190aGFuX2VxdWFsIiwiaW4iLCJsaWtlIiwiY29udmVydFdoZXJlVmFsdWUiLCJudW1JZCIsIk51bWJlciIsImNvbnZlcnRXaGVyZUNsYXVzZSIsImdldFBheWxvYWRGaWVsZE5hbWUiLCJ3IiwicmVzIiwiYW5kIiwiY29ubmVjdG9yIiwib3IiLCJhbmRDbGF1c2UiLCJvckNsYXVzZSIsIkFORCIsIk9SIiwiY29udmVydFNlbGVjdCIsInNlbGVjdCIsInJlZHVjZSIsImFjYyIsImNvbnZlcnRTb3J0Iiwic29ydEJ5IiwicHJlZml4IiwiZGlyZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxhQUFhLFFBQVEsaUJBQWdCO0FBSzlDLFNBQ0VDLHVCQUF1QixFQUN2QkMsdUNBQXVDLEVBQ3ZDQyxnQ0FBZ0MsUUFDM0Isc0NBQTZDO0FBRXBELE9BQU8sTUFBTUMsa0JBQWtCLENBQUNDLFNBQTRCQztJQUMxRCxNQUFNQyxTQUFTUCxjQUFjSztJQUU3QixTQUFT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
729
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEQkZpZWxkQXR0cmlidXRlIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQgeyBnZXRBdXRoVGFibGVzIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQge1xuICB0eXBlIEJhc2VQYXlsb2FkLFxuICB0eXBlIENvbGxlY3Rpb25TbHVnLFxuICBmbGF0dGVuQWxsRmllbGRzLFxuICB0eXBlIFdoZXJlIGFzIFBheWxvYWRXaGVyZVxufSBmcm9tIFwicGF5bG9hZFwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEtleSB9IGZyb20gXCJAL2JldHRlci1hdXRoL2dlbmVyYXRlZC10eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXksXG4gIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZCxcbiAgZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWVcbn0gZnJvbSBcIkAvYmV0dGVyLWF1dGgvcGx1Z2luL2hlbHBlcnMvZ2V0LWNvbGxlY3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChcbiAgb3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsXG4gIGVuYWJsZURlYnVnTG9nczogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIEJldHRlckF1dGggc2NoZW1hIG1vZGVsIG5hbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uIHNsdWcgYnk6XG4gICAqIDEuIExvb2tpbmcgdXAgdGhlIG1vZGVsIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIG1vZGVsTmFtZVxuICAgKiAyLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQ29sbGVjdGlvbiBzbHVnIHJlc29sdXRpb24gZm9sbG93cyB0aGVzZSBydWxlczpcbiAgICogLSBGb3IgYmFzZSBjb2xsZWN0aW9uczogVGhlIHNhbml0aXplQmV0dGVyQXV0aE9wdGlvbnMgZnVuY3Rpb24gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBzbHVnXG4gICAqICAgZnJvbSBwbHVnaW4gb3B0aW9ucyBpcyBzZXQgYXMgdGhlIG1vZGVsIG5hbWUgaW4gdGhlIHNjaGVtYVxuICAgKiAtIEZvciBwbHVnaW5zOiBUaGUgYmV0dGVyQXV0aFBsdWdpblNsdWdzIGNvbnN0YW50IGlzIHVzZWQgYXMgdGhlIG1vZGVsTmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgQmV0dGVyQXV0aCBtb2RlbCBuYW1lIHRvIHJlc29sdmVcbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLm1vZGVsTmFtZSBpcyAndXNlcnMnXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCd1c2VyJykgLy8gUmV0dXJucyAndXNlcnMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIG1vZGVsIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgY29sbGVjdGlvbiBpcyBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IHNsdWdzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbDogTW9kZWxLZXkpOiBDb2xsZWN0aW9uU2x1ZyB7XG4gICAgLy8gRmlyc3QgdHJ5IHRvIGdldCB0aGUgbW9kZWxOYW1lIGZyb20gc2NoZW1hLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHNjaGVtYT8uW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsO1xuICAgIGRlYnVnTG9nKFtcImdldENvbGxlY3Rpb25TbHVnOlwiLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25TbHVnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGZpZWxkIGluIHRoZSBQYXlsb2FkIGNvbGxlY3Rpb24gaXMgYSByZWxhdGlvbnNoaXAgb3IgdXBsb2FkIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBQYXlsb2FkIGNsaWVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gY29sbGVjdGlvblNsdWcgLSBUaGUgc2x1ZyBvZiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIG9yIHVwbG9hZCBmaWVsZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBmdW5jdGlvbiBpc1BheWxvYWRSZWxhdGlvbnNoaXAoXG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWQsXG4gICAgY29sbGVjdGlvblNsdWc6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gcGF5bG9hZC5jb2xsZWN0aW9uc1tjb2xsZWN0aW9uU2x1Z107XG4gICAgaWYgKCFjb2xsZWN0aW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBmaWVsZHMgPSBmbGF0dGVuQWxsRmllbGRzKHsgZmllbGRzOiBjb2xsZWN0aW9uLmNvbmZpZy5maWVsZHMgfSk7XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuXG4gICAgcmV0dXJuIGZpZWxkPy50eXBlID09PSBcInJlbGF0aW9uc2hpcFwiIHx8IGZpZWxkPy50eXBlID09PSBcInVwbG9hZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdO1xuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZDtcblxuICAgIC8vIExvZyB0aGUgZmllbGQgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAgZGVidWdMb2coW1wiZ2V0RmllbGQ6IFwiLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKTtcblxuICAgIHJldHVybiBmaWVsZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChcbiAgICBmaWVsZEtleTogc3RyaW5nLFxuICAgIHNjaGVtYUZpZWxkczogUmVjb3JkPHN0cmluZywgREJGaWVsZEF0dHJpYnV0ZT5cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCBcImFuZFwiIGluIHdoZXJlIHx8IFwib3JcIiBpbiB3aGVyZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gXCJpZFwiIGluIHdoZXJlID8gXCJpZFwiIDogXCJfaWRcIjtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHdoZXJlW2lkRmllbGRdO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmXG4gICAgICAgIFwiZXF1YWxzXCIgaW4gY29uZGl0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzO1xuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICBcImNvbnRhaW5zXCIgaW4gY29uZGl0aW9uICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLmNvbnRhaW5zKSAmJlxuICAgICAgICBjb25kaXRpb24uY29udGFpbnMubGVuZ3RoID09PSAxXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY29udGFpbnNbMF07XG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gdmFsaWQgSUQgcXVlcnkgd2FzIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnk7XG4gICAgaXNSZWxhdGVkRmllbGQ6IGJvb2xlYW47XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gIH0pIHtcbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgaWRUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCxcbiAgICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XG4gICAgICAgICAgXSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBpZFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCxcbiAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gc3RyaW5nSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICBgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsXG4gICAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIGlkVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nSWQgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLFxuICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHN0cmluZ0lkIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdJZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGFycmF5IG9mIElEcyAtIG1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChpZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgbnVsbC91bmRlZmluZWQgdmFsdWVzIGluIGFycmF5c1xuICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gaWQ7XG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoaWQsIDEwKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VkKSA/IHBhcnNlZCA6IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSByb2xlIGZpZWxkcyAoQ29taW5nIGZyb20gYmV0dGVyIGF1dGgsIHdpbGwgYmUgYSBzaW5nbGUgc3RyaW5nIHNlcGVyYXRlZCBieSBjb21tYXMgaWYgdGhlcmVzIG11bHRpcGxlIHJvbGVzKVxuICAgIGlmIChrZXkgPT09IFwicm9sZVwiIHx8IGtleSA9PT0gXCJyb2xlc1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocm9sZTogc3RyaW5nKSA9PiByb2xlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gb3JpZ2luYWwgdmFsdWUgaWYgbm8gY29udmVyc2lvbiB3YXMgbmVlZGVkIG9yIGFwcGxpY2FibGVcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBpbnB1dCBkYXRhIGZyb20gYmV0dGVyLWF1dGggdG8gUGF5bG9hZCBDTVMgZm9ybWF0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlczpcbiAgICogMS4gRmllbGQgbmFtZSBtYXBwaW5nIGFjY29yZGluZyB0byBzY2hlbWEgZGVmaW5pdGlvbnNcbiAgICogMi4gSUQgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAqIDMuIFByb3BlciBkYXRhIG5vcm1hbGl6YXRpb24gYmFzZWQgb24gZmllbGQgdHlwZXNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIGRhdGEgY29tcGF0aWJsZSB3aXRoIFBheWxvYWQgQ01TXG4gICAqL1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1JbnB1dCh7XG4gICAgZGF0YSxcbiAgICBtb2RlbCxcbiAgICBpZFR5cGUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBtb2RlbDogTW9kZWxLZXk7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWQ7XG4gIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gU2tpcCBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBtYXBwZWQgZmllbGQgbmFtZSBmcm9tIHNjaGVtYSAoaWYgYW55KVxuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZTtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkTmFtZSB8fCBrZXk7XG5cbiAgICAgIC8vIENoZWNrIFBheWxvYWQgc2NoZW1hIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGNvbnN0IGlzUGF5bG9hZFJlbCA9IGlzUGF5bG9hZFJlbGF0aW9uc2hpcChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICAgIGNvbnN0IGlzUmVsYXRlZEZpZWxkID1cbiAgICAgICAgaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykgfHwgaXNQYXlsb2FkUmVsO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdGhlIGRhdGEgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgSUQgdHlwZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVEYXRhKHtcbiAgICAgICAgaWRUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc1JlbGF0ZWRGaWVsZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcbiAgICAgIHRyYW5zZm9ybWVkRGF0YVt0YXJnZXRGaWVsZEtleV0gPSBub3JtYWxpemVkRGF0YTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBQYXlsb2FkIGpvaW4gcmVzdWx0IChoYXMgZG9jcyBhcnJheSBzdHJ1Y3R1cmUpXG4gICAqL1xuICBmdW5jdGlvbiBpc0pvaW5SZXN1bHQoXG4gICAgdmFsdWU6IGFueVxuICApOiB2YWx1ZSBpcyB7IGRvY3M6IGFueVtdOyBoYXNOZXh0UGFnZT86IGJvb2xlYW47IHRvdGFsRG9jcz86IG51bWJlciB9IHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJkb2NzXCIgaW4gdmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUuZG9jcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGEgUGF5bG9hZCBqb2luIHJlc3VsdCB0byBqdXN0IHRoZSBhcnJheSBvZiBkb2N1bWVudHMuXG4gICAqIEhhbmRsZXMgYm90aCBkaXJlY3QgZG9jdW1lbnRzIGFuZCBwb2x5bW9ycGhpYyB7IHJlbGF0aW9uVG8sIHZhbHVlIH0gZm9ybWF0LlxuICAgKi9cbiAgZnVuY3Rpb24gZmxhdHRlbkpvaW5SZXN1bHQoam9pblJlc3VsdDogeyBkb2NzOiBhbnlbXSB9KTogYW55W10ge1xuICAgIHJldHVybiBqb2luUmVzdWx0LmRvY3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgcG9seW1vcnBoaWMgam9pbiBmb3JtYXQ6IHsgcmVsYXRpb25Ubzogc3RyaW5nLCB2YWx1ZTogZG9jIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSAmJlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInZhbHVlXCIgaW4gaXRlbSAmJlxuICAgICAgICBcInJlbGF0aW9uVG9cIiBpbiBpdGVtXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiA0LiBKb2luIFJlc3VsdCBGbGF0dGVuaW5nOiBDb252ZXJ0cyBQYXlsb2FkJ3MgeyBkb2NzOiBbLi4uXSB9IGpvaW4gZm9ybWF0IHRvIHBsYWluIGFycmF5c1xuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oe1xuICAgIGRvYyxcbiAgICBtb2RlbCxcbiAgICBwYXlsb2FkXG4gIH06IHtcbiAgICBkb2M6IFQ7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHBheWxvYWQ6IEJhc2VQYXlsb2FkO1xuICB9KTogVCB7XG4gICAgaWYgKCFkb2MgfHwgdHlwZW9mIGRvYyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGRvYztcblxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4uZG9jIH07XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gc2NoZW1hPy5bbW9kZWxdPy5maWVsZHMgPz8ge307XG5cbiAgICAvLyBJZGVudGlmeSByZWxhdGlvbnNoaXAgZmllbGRzIHdpdGggY3VzdG9tIGZpZWxkIG5hbWUgbWFwcGluZ3NcbiAgICBjb25zdCByZWxhdGlvbnNoaXBGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW2tleV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBBbHNvIGNoZWNrIHBheWxvYWQgc2NoZW1hXG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkc1trZXldPy5maWVsZE5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgICAgcmV0dXJuIGlzUGF5bG9hZFJlbGF0aW9uc2hpcChwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgZmllbGROYW1lKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBkYXRlRmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hRmllbGRzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICk7XG5cbiAgICAvLyBGaXJzdCBtYWtlIHN1cmUgYWxsIHRoZSBmaWVsZHMga2V5cyBhcmUgY29ycmVjdFxuICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRGaWVsZEtleSA9IGdldEZpZWxkS2V5QnlDb2xsZWN0aW9uRmllbGROYW1lKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIGtleVxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXRGaWVsZEtleSAhPT0ga2V5KSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSByZXN1bHRba2V5XTtcbiAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoZG9jKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUoXG4gICAgICAgIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSxcbiAgICAgICAga2V5XG4gICAgICApO1xuXG4gICAgICAvLyBDb252ZXJ0IElEIGZpZWxkcyB0byBzdHJpbmdzIGZvciBCZXR0ZXJBdXRoIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZsYXR0ZW4gam9pbiByZXN1bHRzIGZyb20geyBkb2NzOiBbLi4uXSB9IHRvIHBsYWluIGFycmF5c1xuICAgICAgaWYgKGlzSm9pblJlc3VsdCh2YWx1ZSkpIHtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIFwidHJhbnNmb3JtT3V0cHV0OiBmbGF0dGVuaW5nIGpvaW4gcmVzdWx0XCIsXG4gICAgICAgICAgeyBrZXksIHRhcmdldEZpZWxkS2V5LCBpc0FycmF5OiBBcnJheS5pc0FycmF5KHZhbHVlLmRvY3MpIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBmbGF0dGVuSm9pblJlc3VsdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCByZW5hbWVkIGZpZWxkTmFtZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5ID0gT2JqZWN0LmtleXMocmVsYXRpb25zaGlwRmllbGRzKS5maW5kKFxuICAgICAgICAoaykgPT4gcmVsYXRpb25zaGlwRmllbGRzW2tdLmZpZWxkTmFtZSA9PT0ga2V5XG4gICAgICApO1xuICAgICAgaWYgKG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5KSB7XG4gICAgICAgIG5vcm1hbGl6ZURvY3VtZW50SWRzKHJlc3VsdCwgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXksIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF0ZUZpZWxkS2V5ID0gT2JqZWN0LmtleXMoZGF0ZUZpZWxkcykuZmluZChcbiAgICAgICAgKGspID0+IGRhdGVGaWVsZHNba10uZmllbGROYW1lID09PSBrZXlcbiAgICAgICk7XG4gICAgICBpZiAob3JpZ2luYWxEYXRlRmllbGRLZXkpIHtcbiAgICAgICAgLy8gQ29udmVydCBJU08gZGF0ZSBzdHJpbmdzIHRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgICAgICByZXN1bHRbdGFyZ2V0RmllbGRLZXldID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBJRCBmaWVsZHMgZm9yIGJvdGggcHJpbWFyeSBhbmQgcmVsYXRpb25zaGlwIGRvY3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIGNvbnNpc3RlbnQgSUQgaGFuZGxpbmcgYmV0d2VlbiBCZXR0ZXJBdXRoIGFuZCBQYXlsb2FkIENNUyBieTpcbiAgICogMS4gQ29udmVydGluZyBhbGwgSURzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggKHN0b3JlZCBpbiBvcmlnaW5hbEtleSlcbiAgICogMi4gUHJlc2VydmluZyBvcmlnaW5hbCBJRCB0eXBlcyBmb3IgUGF5bG9hZCBDTVMgKHN0b3JlZCBpbiBmaWVsZE5hbWUpXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHZhcmlvdXMgSUQgZm9ybWF0czpcbiAgICogLSBQcmltaXRpdmUgdmFsdWVzIChzdHJpbmcvbnVtYmVyIElEcylcbiAgICogLSBPYmplY3QgcmVmZXJlbmNlcyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICogLSBBcnJheXMgb2YgZWl0aGVyIHByaW1pdGl2ZSBJRHMgb3Igb2JqZWN0IHJlZmVyZW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHRyYW5zZm9ybWVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEtleSAtIFRoZSBvcmlnaW5hbCBmaWVsZCBrZXkgZnJvbSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIHJlbmFtZWQgZmllbGQgYXMgdXNlZCBpbiBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSUQgdmFsdWUgdG8gbm9ybWFsaXplIChwcmltaXRpdmUsIG9iamVjdCwgb3IgYXJyYXkpXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEb2N1bWVudElkcyhcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgb3JpZ2luYWxLZXk6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IHZvaWQge1xuICAgIC8vIENhc2UgMTogUHJpbWl0aXZlIElEIHZhbHVlIChzdHJpbmcgb3IgbnVtYmVyKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogQWx3YXlzIHVzZSBzdHJpbmcgSURzXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBLZWVwIG9yaWdpbmFsIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAyOiBPYmplY3Qgd2l0aCBJRCBwcm9wZXJ0eVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgXCJpZFwiIGluIHZhbHVlXG4gICAgKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogRXh0cmFjdCBhbmQgc3RyaW5naWZ5IHRoZSBJRFxuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZS5pZCk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcG9wdWxhdGVkIHJlbGF0aW9uc2hpcCBvYmplY3Qgc28gam9pbnMgcmV0dXJuIGZ1bGwgZG9jdW1lbnRzXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHtcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIGlkOiBTdHJpbmcodmFsdWUuaWQpXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhc2UgMzogQXJyYXkgb2YgSURzIG9yIHJlZmVyZW5jZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgaWYgYXJyYXkgY29udGFpbnMgb2JqZWN0cyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuZXZlcnkoXG4gICAgICAgICAgKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmIGl0ZW0gIT09IG51bGwgJiYgXCJpZFwiIGluIGl0ZW1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIG9iamVjdHMgd2l0aCBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0uaWQpKTtcbiAgICAgICAgLy8gS2VlcCBqb2luZWQgZG9jdW1lbnRzIGludGFjdCB3aGlsZSBub3JtYWxpemluZyBJRCB0eXBlXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmlkKVxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcnJheSBvZiBwcmltaXRpdmUgSURzXG4gICAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBJZiB2YWx1ZSBkb2Vzbid0IG1hdGNoIGFueSBleHBlY3RlZCBmb3JtYXQsIG5vIGNoYW5nZXMgYXJlIG1hZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEJldHRlckF1dGggb3BlcmF0b3IgdG8gdGhlIGVxdWl2YWxlbnQgUGF5bG9hZCBDTVMgcXVlcnkgb3BlcmF0b3JcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtYXBzIHN0YW5kYXJkIHF1ZXJ5IG9wZXJhdG9ycyBmcm9tIEJldHRlckF1dGgncyBmb3JtYXQgdG9cbiAgICogdGhlIHNwZWNpZmljIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdG9yIC0gVGhlIEJldHRlckF1dGggb3BlcmF0b3Igc3RyaW5nIChlLmcuLCAnZXEnLCAnZ3QnLCAnY29udGFpbnMnKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdXNlZCB3aXRoIHRoZSBvcGVyYXRvclxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgUGF5bG9hZC1jb21wYXRpYmxlIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZXF1YWxzOiAndGVzdEBleGFtcGxlLmNvbScgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZXEnLCAndGVzdEBleGFtcGxlLmNvbScpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBncmVhdGVyX3RoYW46IDEwMCB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdndCcsIDEwMClcbiAgICovXG4gIGZ1bmN0aW9uIG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcIm5lXCI6XG4gICAgICAgIHJldHVybiB7IG5vdF9lcXVhbHM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiZ3RcIjpcbiAgICAgICAgcmV0dXJuIHsgZ3JlYXRlcl90aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwibHRcIjpcbiAgICAgICAgcmV0dXJuIHsgbGVzc190aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiY29udGFpbnNcIjpcbiAgICAgICAgcmV0dXJuIHsgY29udGFpbnM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiaW5cIjpcbiAgICAgICAgcmV0dXJuIHsgaW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwic3RhcnRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCR7dmFsdWV9JWAgfTtcbiAgICAgIGNhc2UgXCJlbmRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCUke3ZhbHVlfWAgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBlcXVhbHMgZm9yIHVucmVjb2duaXplZCBvcGVyYXRvcnNcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHdoZXJlIGNsYXVzZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBiYXNlZCBvbiBmaWVsZCBuYW1lIGFuZCBJRCB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHR3byBtYWluIHNjZW5hcmlvczpcbiAgICogMS4gSUQgZmllbGQgY29udmVyc2lvbiAtIGVuc3VyZXMgSURzIG1hdGNoIHRoZSBkYXRhYmFzZSdzIGV4cGVjdGVkIHR5cGUgKG51bWJlciBvciBzdHJpbmcpXG4gICAqIDIuIE9iamVjdCB3aXRoIGVtYmVkZGVkIElEIC0gZXh0cmFjdHMgYW5kIGNvbnZlcnRzIHRoZSBJRCBwcm9wZXJ0eSBmcm9tIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKGNhbiBiZSBwcmltaXRpdmUsIG9iamVjdCB3aXRoIElELCBvciBhcnJheSlcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBxdWVyaWVkXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJ5XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgdmFsdWUsXG4gICAgZmllbGROYW1lLFxuICAgIGlkVHlwZVxuICB9OiB7XG4gICAgdmFsdWU6IGFueTtcbiAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICBpZFR5cGU6IFwibnVtYmVyXCIgfCBcInRleHRcIjtcbiAgfSkge1xuICAgIC8vIENoZWNrIGlmIGZpZWxkIGlzIGFuIElEIGZpZWxkIChzdXBwb3J0aW5nIGJvdGggTW9uZ29EQi1zdHlsZSBfaWQgYW5kIHN0YW5kYXJkIGlkKVxuICAgIGlmIChbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG4gICAgICAvLyBDYXNlIDE6IFZhbHVlIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFuIElEIHByb3BlcnR5XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwiaWRcIiBpbiB2YWx1ZSkge1xuICAgICAgICAvLyBFeHRyYWN0IElEIGZyb20gb2JqZWN0XG4gICAgICAgIGNvbnN0IGlkID0gdmFsdWUuaWQ7XG5cbiAgICAgICAgLy8gVXNlIHR5cGUgY29udmVyc2lvbiBiYXNlZCBvbiBkYXRhYmFzZSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChpZFR5cGUgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgbnVtSWQgPSBOdW1iZXIoaWQpO1xuICAgICAgICAgIHJldHVybiAhaXNOYU4obnVtSWQpID8gbnVtSWQgOiBpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZFR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfVxuICAgICAgLy8gQ2FzZSAyOiBWYWx1ZSBpcyBhIHN0YW5kYWxvbmUgSUQgdGhhdCBuZWVkcyB0eXBlIGNvbnZlcnNpb25cbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIElEIHRvIG51bWJlciBpZiBkYXRhYmFzZSBleHBlY3RzIG51bWVyaWMgSURzXG4gICAgICBpZiAoXG4gICAgICAgIGlkVHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgIWlzTmFOKE51bWJlcih2YWx1ZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IG51bWVyaWMgSUQgdG8gc3RyaW5nIGlmIGRhdGFiYXNlIGV4cGVjdHMgdGV4dCBJRHNcbiAgICAgIGVsc2UgaWYgKGlkVHlwZSA9PT0gXCJ0ZXh0XCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIEZvciBub24tSUQgZmllbGRzLCByZXR1cm4gdGhlIHZhbHVlIHVuY2hhbmdlZFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBCZXR0ZXIgQXV0aCB3aGVyZSBjbGF1c2VzIHRvIFBheWxvYWQgQ01TIGNvbXBhdGlibGUgd2hlcmUgY29uZGl0aW9uc1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIEJldHRlciBBdXRoIHF1ZXJ5IGZvcm1hdCBpbnRvIFBheWxvYWQncyBxdWVyeSBmb3JtYXQsXG4gICAqIGhhbmRsaW5nIGZpZWxkIG5hbWUgbWFwcGluZywgdmFsdWUgdHlwZSBjb252ZXJzaW9uLCBhbmQgbG9naWNhbCBvcGVyYXRvcnMgKEFORC9PUikuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHRocmVlIG1haW4gY2FzZXM6XG4gICAqIDEuIEVtcHR5IG9yIHVuZGVmaW5lZCB3aGVyZSBjbGF1c2UgLSByZXR1cm5zIGVtcHR5IG9iamVjdFxuICAgKiAyLiBTaW5nbGUgY29uZGl0aW9uIC0gY29udmVydHMgdG8gYSBzaW1wbGUgZmllbGQtdmFsdWUgcGFpclxuICAgKiAzLiBNdWx0aXBsZSBjb25kaXRpb25zIC0gZ3JvdXBzIGJ5IEFORC9PUiBjb25uZWN0b3JzIGFuZCBidWlsZHMgYSBjb21wbGV4IHF1ZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZGF0YWJhc2UgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSB3aGVyZSAtIEFycmF5IG9mIEJldHRlciBBdXRoIHdoZXJlIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgd2hlcmUgY2xhdXNlIG9iamVjdFxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICBpZFR5cGUsXG4gICAgbW9kZWwsXG4gICAgd2hlcmUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHdoZXJlPzogV2hlcmVbXTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFBheWxvYWRXaGVyZSB7XG4gICAgLy8gSGFuZGxlIGVtcHR5IHdoZXJlIGNsYXVzZVxuICAgIGlmICghd2hlcmUpIHJldHVybiB7fTtcblxuICAgIGZ1bmN0aW9uIGdldFBheWxvYWRGaWVsZE5hbWUoZmllbGRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIGZpZWxkS2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzaW5nbGUgY29uZGl0aW9uIGNhc2UgZm9yIG9wdGltaXphdGlvblxuICAgIGlmICh3aGVyZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHcgPSB3aGVyZVswXTtcbiAgICAgIGlmICghdykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCBmaWVsZCBuYW1lIGFjY29yZGluZyB0byBzY2hlbWEgYW5kIGNvbnZlcnQgdmFsdWUgdG8gYXBwcm9wcmlhdGUgdHlwZVxuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIFBheWxvYWQgd2hlcmUgY29uZGl0aW9uIHdpdGggcHJvcGVyIG9wZXJhdG9yXG4gICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgY29uZGl0aW9ucyBieSBzZXBhcmF0aW5nIEFORC9PUiBjbGF1c2VzXG4gICAgLy8gRGVmYXVsdCB0byBBTkQgaWYgbm8gY29ubmVjdG9yIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGFuZCA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiQU5EXCIgfHwgIXcuY29ubmVjdG9yKTtcbiAgICBjb25zdCBvciA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiT1JcIik7XG5cbiAgICAvLyBQcm9jZXNzIEFORCBjb25kaXRpb25zXG4gICAgY29uc3QgYW5kQ2xhdXNlID0gYW5kLm1hcCgodykgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBPUiBjb25kaXRpb25zXG4gICAgY29uc3Qgb3JDbGF1c2UgPSBvci5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIENvbWJpbmUgQU5EIGFuZCBPUiBjbGF1c2VzIGludG8gZmluYWwgUGF5bG9hZCB3aGVyZSBvYmplY3RcbiAgICAvLyBPbmx5IGluY2x1ZGUgbm9uLWVtcHR5IGNsYXVzZSBhcnJheXNcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGFuZENsYXVzZS5sZW5ndGggPyB7IEFORDogYW5kQ2xhdXNlIH0gOiB7fSksXG4gICAgICAuLi4ob3JDbGF1c2UubGVuZ3RoID8geyBPUjogb3JDbGF1c2UgfSA6IHt9KVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgdG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWVzKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGFuIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzIGFzIGtleXNcbiAgICogYW5kIGJvb2xlYW4gdHJ1ZSBhcyB2YWx1ZXMpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNlbGVjdCAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRvIHNlbGVjdFxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzZWxlY3Qgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBmaWVsZHMgdG8gc2VsZWN0XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiBbJ2VtYWlsJywgJ25hbWUnXVxuICAgKiAvLyBPdXRwdXQ6IHsgZW1haWw6IHRydWUsIG5hbWU6IHRydWUgfVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNlbGVjdChtb2RlbDogTW9kZWxLZXksIHNlbGVjdD86IHN0cmluZ1tdKSB7XG4gICAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBzZWxlY3QgaXMgZW1wdHkgb3Igbm90IHByb3ZpZGVkXG4gICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIHdoaWxlIGFsc28gbWFwcGluZyBhbnkgZmllbGQgbmFtZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgaW4gUGF5bG9hZFxuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKFxuICAgICAgKGFjYywgZmllbGQpID0+ICh7IC4uLmFjYywgW2dldEZpZWxkTmFtZShtb2RlbCwgZmllbGQpXTogdHJ1ZSB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0IHRvIGEgUGF5bG9hZCBzb3J0IHN0cmluZ1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lIGFuZCBkaXJlY3Rpb24pXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYSBzdHJpbmcgd2l0aCBvcHRpb25hbCAnLScgcHJlZml4IGZvciBkZXNjZW5kaW5nIG9yZGVyKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzb3J0QnkgLSBPcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBmaWVsZCBuYW1lIGFuZCBzb3J0IGRpcmVjdGlvblxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzb3J0IHN0cmluZyBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdlbWFpbCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnLWVtYWlsJ1xuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2FzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICdjcmVhdGVkQXQnXG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U29ydChcbiAgICBtb2RlbDogTW9kZWxLZXksXG4gICAgc29ydEJ5PzogeyBmaWVsZDogc3RyaW5nOyBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiB9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzb3J0QnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCBzb3J0QnkuZmllbGQpO1xuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09IFwiZGVzY1wiID8gXCItXCIgOiBcIlwiO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtmaWVsZE5hbWV9YDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0RmllbGROYW1lLFxuICAgIGdldENvbGxlY3Rpb25TbHVnLFxuICAgIHNpbmdsZUlkUXVlcnksXG4gICAgdHJhbnNmb3JtSW5wdXQsXG4gICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgIGNvbnZlcnRXaGVyZUNsYXVzZSxcbiAgICBjb252ZXJ0U2VsZWN0LFxuICAgIGNvbnZlcnRTb3J0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdldEF1dGhUYWJsZXMiLCJmbGF0dGVuQWxsRmllbGRzIiwiZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkiLCJnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQiLCJnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZSIsImNyZWF0ZVRyYW5zZm9ybSIsIm9wdGlvbnMiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJzY2hlbWEiLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q29sbGVjdGlvblNsdWciLCJtb2RlbCIsImNvbGxlY3Rpb24iLCJtb2RlbE5hbWUiLCJyZXNvbHZlZFNsdWciLCJpc1BheWxvYWRSZWxhdGlvbnNoaXAiLCJwYXlsb2FkIiwiY29sbGVjdGlvblNsdWciLCJmaWVsZE5hbWUiLCJjb2xsZWN0aW9ucyIsImZpZWxkcyIsImNvbmZpZyIsImZpZWxkIiwiZmluZCIsImYiLCJuYW1lIiwidHlwZSIsImdldEZpZWxkTmFtZSIsImluY2x1ZGVzIiwiZmllbGREZWZpbml0aW9uIiwib3JpZ2luYWxGaWVsZCIsImlzUmVsYXRpb25zaGlwRmllbGQiLCJmaWVsZEtleSIsInNjaGVtYUZpZWxkcyIsInJlZmVyZW5jZXMiLCJ1bmRlZmluZWQiLCJzaW5nbGVJZFF1ZXJ5Iiwid2hlcmUiLCJzb21lIiwiaWRGaWVsZCIsImNvbmRpdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwiZXF1YWxzIiwiY29udGFpbnMiLCJsZW5ndGgiLCJub3JtYWxpemVEYXRhIiwia2V5IiwiaXNSZWxhdGVkRmllbGQiLCJpZFR5cGUiLCJwYXJzZWQiLCJwYXJzZUludCIsImlzTmFOIiwib3JpZ2luYWwiLCJjb252ZXJ0ZWQiLCJzdHJpbmdJZCIsIlN0cmluZyIsIm1hcCIsImlkIiwic3BsaXQiLCJyb2xlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwidHJhbnNmb3JtSW5wdXQiLCJkYXRhIiwidHJhbnNmb3JtZWREYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJzY2hlbWFGaWVsZE5hbWUiLCJ0YXJnZXRGaWVsZE5hbWUiLCJpc1BheWxvYWRSZWwiLCJub3JtYWxpemVkRGF0YSIsInRhcmdldEZpZWxkS2V5IiwiaXNKb2luUmVzdWx0IiwiZG9jcyIsImZsYXR0ZW5Kb2luUmVzdWx0Iiwiam9pblJlc3VsdCIsIml0ZW0iLCJ0cmFuc2Zvcm1PdXRwdXQiLCJkb2MiLCJyZXN1bHQiLCJyZWxhdGlvbnNoaXBGaWVsZHMiLCJmcm9tRW50cmllcyIsImZpbHRlciIsImRhdGVGaWVsZHMiLCJfIiwia2V5cyIsIm9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5IiwiayIsIm5vcm1hbGl6ZURvY3VtZW50SWRzIiwib3JpZ2luYWxEYXRlRmllbGRLZXkiLCJEYXRlIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIm9wZXJhdG9yVG9QYXlsb2FkIiwib3BlcmF0b3IiLCJub3RfZXF1YWxzIiwiZ3JlYXRlcl90aGFuIiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwibGVzc190aGFuIiwibGVzc190aGFuX2VxdWFsIiwiaW4iLCJsaWtlIiwiY29udmVydFdoZXJlVmFsdWUiLCJudW1JZCIsIk51bWJlciIsImNvbnZlcnRXaGVyZUNsYXVzZSIsImdldFBheWxvYWRGaWVsZE5hbWUiLCJ3IiwicmVzIiwiYW5kIiwiY29ubmVjdG9yIiwib3IiLCJhbmRDbGF1c2UiLCJvckNsYXVzZSIsIkFORCIsIk9SIiwiY29udmVydFNlbGVjdCIsInNlbGVjdCIsInJlZHVjZSIsImFjYyIsImNvbnZlcnRTb3J0Iiwic29ydEJ5IiwicHJlZml4IiwiZGlyZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFFQSxTQUFTQSxhQUFhLFFBQVEsaUJBQWlCO0FBQy9DLFNBR0VDLGdCQUFnQixRQUVYLFVBQVU7QUFFakIsU0FDRUMsdUJBQXVCLEVBQ3ZCQyx1Q0FBdUMsRUFDdkNDLGdDQUFnQyxRQUMzQixzQ0FBOEM7QUFFckQsT0FBTyxNQUFNQyxrQkFBa0IsQ0FDN0JDLFNBQ0FDO0lBRUEsTUFBTUMsU0FBU1IsY0FBY007SUFFN0IsU0FBU0csU0FBU0MsT0FBYztRQUM5QixJQUFJSCxpQkFBaUI7WUFDbkJJLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUtGO1FBQ3pDO0lBQ0Y7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCQyxH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