@luochuanyuewu/payload-auth 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.
- package/dist/better-auth/adapter/generate-schema/generate-schema-builder.d.ts +24 -0
- package/dist/better-auth/adapter/generate-schema/generate-schema-builder.d.ts.map +1 -0
- package/dist/better-auth/adapter/generate-schema/generate-schema-builder.js +317 -0
- package/dist/better-auth/adapter/generate-schema/get-payload-schema.d.ts +2 -0
- package/dist/better-auth/adapter/generate-schema/get-payload-schema.d.ts.map +1 -0
- package/dist/better-auth/adapter/generate-schema/get-payload-schema.js +23 -0
- package/dist/better-auth/adapter/generate-schema/index.d.ts +5 -0
- package/dist/better-auth/adapter/generate-schema/index.d.ts.map +1 -0
- package/dist/better-auth/adapter/generate-schema/index.js +19 -0
- package/dist/better-auth/adapter/generate-schema/utils.d.ts +3 -0
- package/dist/better-auth/adapter/generate-schema/utils.d.ts.map +1 -0
- package/dist/better-auth/adapter/generate-schema/utils.js +20 -0
- package/dist/better-auth/adapter/index.d.ts +16 -0
- package/dist/better-auth/adapter/index.d.ts.map +1 -0
- package/dist/better-auth/adapter/index.js +717 -0
- package/dist/better-auth/adapter/transform/index.d.ts +31 -0
- package/dist/better-auth/adapter/transform/index.d.ts.map +1 -0
- package/dist/better-auth/adapter/transform/index.js +729 -0
- package/dist/better-auth/adapter/types.d.ts +11 -0
- package/dist/better-auth/adapter/types.d.ts.map +1 -0
- package/dist/better-auth/adapter/types.js +3 -0
- package/dist/better-auth/generated-types.d.ts +329 -0
- package/dist/better-auth/generated-types.d.ts.map +1 -0
- package/dist/better-auth/generated-types.js +4 -0
- package/dist/better-auth/index.d.ts +4 -0
- package/dist/better-auth/index.d.ts.map +1 -0
- package/dist/better-auth/index.js +5 -0
- package/dist/better-auth/plugin/constants.d.ts +231 -0
- package/dist/better-auth/plugin/constants.d.ts.map +1 -0
- package/dist/better-auth/plugin/constants.js +259 -0
- package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts +13 -0
- package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/check-plugin-exists.js +14 -0
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts +30 -0
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.js +46 -0
- package/dist/better-auth/plugin/helpers/get-admin-access.d.ts +8 -0
- package/dist/better-auth/plugin/helpers/get-admin-access.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-admin-access.js +22 -0
- package/dist/better-auth/plugin/helpers/get-all-roles.d.ts +6 -0
- package/dist/better-auth/plugin/helpers/get-all-roles.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-all-roles.js +20 -0
- package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts +19 -0
- package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-better-auth-schema.js +75 -0
- package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts +6 -0
- package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-collection-slug.js +20 -0
- package/dist/better-auth/plugin/helpers/get-collection.d.ts +28 -0
- package/dist/better-auth/plugin/helpers/get-collection.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-collection.js +49 -0
- package/dist/better-auth/plugin/helpers/get-ip.d.ts +3 -0
- package/dist/better-auth/plugin/helpers/get-ip.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-ip.js +31 -0
- package/dist/better-auth/plugin/helpers/get-signed-cookie.d.ts +3 -0
- package/dist/better-auth/plugin/helpers/get-signed-cookie.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-signed-cookie.js +63 -0
- package/dist/better-auth/plugin/helpers/index.d.ts +2 -0
- package/dist/better-auth/plugin/helpers/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/index.js +3 -0
- package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts +60 -0
- package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/prepare-session-data.js +49 -0
- package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.d.ts +21 -0
- package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.js +63 -0
- package/dist/better-auth/plugin/index.d.ts +8 -0
- package/dist/better-auth/plugin/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/index.js +103 -0
- package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.d.ts +13 -0
- package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.js +87 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +51 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +150 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.js +11 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.js +8 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.js +117 -0
- package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/api-keys.js +174 -0
- package/dist/better-auth/plugin/lib/build-collections/device-code.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/device-code.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/device-code.js +49 -0
- package/dist/better-auth/plugin/lib/build-collections/index.d.ts +11 -0
- package/dist/better-auth/plugin/lib/build-collections/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/index.js +79 -0
- package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/invitations.js +93 -0
- package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/jwks.js +58 -0
- package/dist/better-auth/plugin/lib/build-collections/members.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/members.js +72 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +105 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +117 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +87 -0
- package/dist/better-auth/plugin/lib/build-collections/organization-roles.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/organization-roles.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/organization-roles.js +65 -0
- package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/organizations.js +106 -0
- package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/passkeys.js +115 -0
- package/dist/better-auth/plugin/lib/build-collections/rate-limit.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/rate-limit.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/rate-limit.js +54 -0
- package/dist/better-auth/plugin/lib/build-collections/scim-provider.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/scim-provider.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/scim-provider.js +65 -0
- package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/sessions.js +140 -0
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.js +80 -0
- package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/subscriptions.js +110 -0
- package/dist/better-auth/plugin/lib/build-collections/team-members.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/team-members.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/team-members.js +63 -0
- package/dist/better-auth/plugin/lib/build-collections/teams.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/teams.js +74 -0
- package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/two-factors.js +66 -0
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts +8 -0
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +52 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts +12 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +68 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts +5 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.js +6 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.js +114 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.js +64 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +90 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +80 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +79 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +54 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +15 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.js +8 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +17 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +90 -0
- package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/index.js +333 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts +16 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.js +24 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.d.ts +11 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.js +112 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts +8 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.js +31 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts +12 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.js +26 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts +18 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.js +84 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts +21 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.js +95 -0
- package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/verifications.js +82 -0
- package/dist/better-auth/plugin/lib/get-payload-auth.d.ts +6 -0
- package/dist/better-auth/plugin/lib/get-payload-auth.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/get-payload-auth.js +9 -0
- package/dist/better-auth/plugin/lib/init-better-auth.d.ts +8 -0
- package/dist/better-auth/plugin/lib/init-better-auth.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/init-better-auth.js +16 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.js +12 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +10 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.js +8 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +12 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +146 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +18 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +34 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.js +11 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +10 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.js +11 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.d.ts +8 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.js +20 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.d.ts +8 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.js +20 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.d.ts +14 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.js +38 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts +8 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.js +23 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts +26 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.js +62 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts +10 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.js +42 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts +10 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.js +62 -0
- package/dist/better-auth/plugin/lib/set-login-methods.d.ts +5 -0
- package/dist/better-auth/plugin/lib/set-login-methods.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/set-login-methods.js +14 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts +10 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.js +116 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.scss +36 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts +11 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.js +213 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.scss +136 -0
- package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.d.ts +4 -0
- package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.js +197 -0
- package/dist/better-auth/plugin/payload/components/login-form/context.d.ts +49 -0
- package/dist/better-auth/plugin/payload/components/login-form/context.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/login-form/context.js +94 -0
- package/dist/better-auth/plugin/payload/components/login-form/credentials-form.d.ts +4 -0
- package/dist/better-auth/plugin/payload/components/login-form/credentials-form.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/login-form/credentials-form.js +167 -0
- package/dist/better-auth/plugin/payload/components/login-form/index.d.ts +5 -0
- package/dist/better-auth/plugin/payload/components/login-form/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/login-form/index.js +6 -0
- package/dist/better-auth/plugin/payload/components/login-form/index.scss +58 -0
- package/dist/better-auth/plugin/payload/components/logout-button.d.ts +5 -0
- package/dist/better-auth/plugin/payload/components/logout-button.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/logout-button.js +24 -0
- package/dist/better-auth/plugin/payload/components/passkeys/add-button.d.ts +9 -0
- package/dist/better-auth/plugin/payload/components/passkeys/add-button.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/passkeys/add-button.js +122 -0
- package/dist/better-auth/plugin/payload/components/passkeys/client.d.ts +3 -0
- package/dist/better-auth/plugin/payload/components/passkeys/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/passkeys/client.js +61 -0
- package/dist/better-auth/plugin/payload/components/passkeys/index.d.ts +5 -0
- package/dist/better-auth/plugin/payload/components/passkeys/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/passkeys/index.js +42 -0
- package/dist/better-auth/plugin/payload/components/passkeys/index.scss +98 -0
- package/dist/better-auth/plugin/payload/components/passkeys/list.d.ts +9 -0
- package/dist/better-auth/plugin/payload/components/passkeys/list.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/passkeys/list.js +57 -0
- package/dist/better-auth/plugin/payload/components/passkeys/types.d.ts +23 -0
- package/dist/better-auth/plugin/payload/components/passkeys/types.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/passkeys/types.js +3 -0
- package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts +7 -0
- package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/rsc-redirect.js +13 -0
- package/dist/better-auth/plugin/payload/components/token-field.d.ts +4 -0
- package/dist/better-auth/plugin/payload/components/token-field.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/token-field.js +29 -0
- package/dist/better-auth/plugin/payload/components/two-factor-auth/index.d.ts +9 -0
- package/dist/better-auth/plugin/payload/components/two-factor-auth/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/two-factor-auth/index.js +347 -0
- package/dist/better-auth/plugin/payload/components/two-factor-auth/index.scss +116 -0
- package/dist/better-auth/plugin/payload/exports/client.d.ts +7 -0
- package/dist/better-auth/plugin/payload/exports/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/exports/client.js +8 -0
- package/dist/better-auth/plugin/payload/exports/rsc.d.ts +9 -0
- package/dist/better-auth/plugin/payload/exports/rsc.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/exports/rsc.js +10 -0
- package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts +3 -0
- package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.js +9 -0
- package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts +2 -0
- package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/utils/get-safe-redirect.js +22 -0
- package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts +23 -0
- package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/admin-login/client.js +24 -0
- package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts +11 -0
- package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/admin-login/index.js +143 -0
- package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts +23 -0
- package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/admin-signup/client.js +185 -0
- package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts +10 -0
- package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/admin-signup/index.js +92 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts +7 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/client.js +104 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts +9 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/index.js +61 -0
- package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts +11 -0
- package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/reset-password/client.js +111 -0
- package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts +9 -0
- package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/reset-password/index.js +78 -0
- package/dist/better-auth/plugin/payload/views/two-factor-verify/client.d.ts +9 -0
- package/dist/better-auth/plugin/payload/views/two-factor-verify/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/two-factor-verify/client.js +79 -0
- package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts +10 -0
- package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/two-factor-verify/index.js +49 -0
- package/dist/better-auth/plugin/types.d.ts +448 -0
- package/dist/better-auth/plugin/types.d.ts.map +1 -0
- package/dist/better-auth/plugin/types.js +3 -0
- package/dist/better-auth/plugin/utils/set.d.ts +40 -0
- package/dist/better-auth/plugin/utils/set.d.ts.map +1 -0
- package/dist/better-auth/plugin/utils/set.js +84 -0
- package/dist/better-auth/scripts/generate-types.d.ts +2 -0
- package/dist/better-auth/scripts/generate-types.d.ts.map +1 -0
- package/dist/better-auth/scripts/generate-types.js +225 -0
- package/dist/better-auth/types.d.ts +3 -0
- package/dist/better-auth/types.d.ts.map +1 -0
- package/dist/better-auth/types.js +4 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/shared/components/icons.d.ts +8 -0
- package/dist/shared/components/icons.d.ts.map +1 -0
- package/dist/shared/components/icons.js +436 -0
- package/dist/shared/components/logo.d.ts +3 -0
- package/dist/shared/components/logo.d.ts.map +1 -0
- package/dist/shared/components/logo.js +24 -0
- package/dist/shared/form/components/submit.d.ts +8 -0
- package/dist/shared/form/components/submit.d.ts.map +1 -0
- package/dist/shared/form/components/submit.js +23 -0
- package/dist/shared/form/fields/text-field.d.ts +9 -0
- package/dist/shared/form/fields/text-field.d.ts.map +1 -0
- package/dist/shared/form/fields/text-field.js +44 -0
- package/dist/shared/form/index.d.ts +28 -0
- package/dist/shared/form/index.d.ts.map +1 -0
- package/dist/shared/form/index.js +17 -0
- package/dist/shared/form/ui/header/index.d.ts +9 -0
- package/dist/shared/form/ui/header/index.d.ts.map +1 -0
- package/dist/shared/form/ui/header/index.js +23 -0
- package/dist/shared/form/ui/header/index.scss +8 -0
- package/dist/shared/form/ui/index.d.ts +34 -0
- package/dist/shared/form/ui/index.d.ts.map +1 -0
- package/dist/shared/form/ui/index.js +70 -0
- package/dist/shared/form/ui/index.scss +27 -0
- package/dist/shared/form/validation.d.ts +65 -0
- package/dist/shared/form/validation.d.ts.map +1 -0
- package/dist/shared/form/validation.js +108 -0
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +4 -0
- package/dist/shared/payload/fields/field-copy-button/index.css +47 -0
- package/dist/shared/payload/fields/field-copy-button/index.d.ts +4 -0
- package/dist/shared/payload/fields/field-copy-button/index.d.ts.map +1 -0
- package/dist/shared/payload/fields/field-copy-button/index.js +38 -0
- package/dist/shared/payload/fields/generate-uuid-button/index.css +14 -0
- package/dist/shared/payload/fields/generate-uuid-button/index.d.ts +4 -0
- package/dist/shared/payload/fields/generate-uuid-button/index.d.ts.map +1 -0
- package/dist/shared/payload/fields/generate-uuid-button/index.js +26 -0
- package/dist/shared/payload/fields/index.d.ts +3 -0
- package/dist/shared/payload/fields/index.d.ts.map +1 -0
- package/dist/shared/payload/fields/index.js +4 -0
- package/dist/shared/utils/regex.d.ts +3 -0
- package/dist/shared/utils/regex.d.ts.map +1 -0
- package/dist/shared/utils/regex.js +4 -0
- package/dist/shared/utils/try-catch.d.ts +12 -0
- package/dist/shared/utils/try-catch.d.ts.map +1 -0
- package/dist/shared/utils/try-catch.js +17 -0
- package/dist/shared/utils/value-or-default.d.ts +10 -0
- package/dist/shared/utils/value-or-default.d.ts.map +1 -0
- package/dist/shared/utils/value-or-default.js +12 -0
- package/package.json +124 -0
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
import { getAuthTables } from "better-auth/db";
|
|
2
|
+
import { flattenAllFields } from "payload";
|
|
3
|
+
import { getCollectionByModelKey, getCollectionFieldNameByFieldKeyUntyped, getFieldKeyByCollectionFieldName } from "../../plugin/helpers/get-collection";
|
|
4
|
+
export const createTransform = (options, enableDebugLogs)=>{
|
|
5
|
+
const schema = getAuthTables(options);
|
|
6
|
+
function debugLog(message) {
|
|
7
|
+
if (enableDebugLogs) {
|
|
8
|
+
console.log(`[payload-db-adapter]`, ...message);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Maps a BetterAuth schema model name to its corresponding Payload CMS collection slug.
|
|
13
|
+
*
|
|
14
|
+
* This function resolves the appropriate collection slug by:
|
|
15
|
+
* 1. Looking up the model in the BetterAuth schema to find its configured modelName
|
|
16
|
+
* 2. Falling back to the original model name if no mapping exists
|
|
17
|
+
*
|
|
18
|
+
* Collection slug resolution follows these rules:
|
|
19
|
+
* - For base collections: The sanitizeBetterAuthOptions function ensures the collection slug
|
|
20
|
+
* from plugin options is set as the model name in the schema
|
|
21
|
+
* - For plugins: The betterAuthPluginSlugs constant is used as the modelName
|
|
22
|
+
*
|
|
23
|
+
* @param model - The BetterAuth model name to resolve
|
|
24
|
+
* @returns The corresponding Payload CMS collection slug
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // If schema['user'].modelName is 'users'
|
|
28
|
+
* getCollectionSlug('user') // Returns 'users'
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // If model doesn't exist in schema
|
|
32
|
+
* getCollectionSlug('custom') // Returns 'custom'
|
|
33
|
+
*
|
|
34
|
+
* @warning If a collection is overridden using the collectionOverride option
|
|
35
|
+
* without updating the schema mapping, this function may return incorrect slugs
|
|
36
|
+
*/ function getCollectionSlug(model) {
|
|
37
|
+
// First try to get the modelName from schema, otherwise fall back to the original model name
|
|
38
|
+
const collection = schema?.[model]?.modelName || model;
|
|
39
|
+
debugLog([
|
|
40
|
+
"getCollectionSlug:",
|
|
41
|
+
{
|
|
42
|
+
model,
|
|
43
|
+
resolvedSlug: collection
|
|
44
|
+
}
|
|
45
|
+
]);
|
|
46
|
+
return collection;
|
|
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
|
+
/**
|
|
65
|
+
* Maps a BetterAuth schema field to its corresponding Payload CMS field name.
|
|
66
|
+
*
|
|
67
|
+
* This function resolves the appropriate field name by:
|
|
68
|
+
* 1. Preserving 'id' or '_id' fields as-is (special case handling)
|
|
69
|
+
* 2. Looking up the field in the BetterAuth schema to find its configured fieldName
|
|
70
|
+
* 3. Falling back to the original field name if no mapping exists
|
|
71
|
+
*
|
|
72
|
+
* @param model - The BetterAuth model name containing the field
|
|
73
|
+
* @param field - The original field name to resolve
|
|
74
|
+
* @returns The corresponding Payload CMS field name
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* // If schema['user'].fields['email'].fieldName is 'emailAddress'
|
|
78
|
+
* getFieldName('user', 'email') // Returns 'emailAddress'
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* // Special case for ID fields
|
|
82
|
+
* getFieldName('user', 'id') // Always returns 'id'
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* // If field doesn't exist in schema or has no fieldName mapping
|
|
86
|
+
* getFieldName('user', 'custom') // Returns 'custom'
|
|
87
|
+
*
|
|
88
|
+
* @warning If a fieldName is overridden in the payload collection config using the collectionOverride option
|
|
89
|
+
* without updating the schema mapping, this function may return incorrect field names
|
|
90
|
+
*/ function getFieldName(model, field) {
|
|
91
|
+
// Special case: 'id' or '_id' is always preserved as-is
|
|
92
|
+
if ([
|
|
93
|
+
"id",
|
|
94
|
+
"_id"
|
|
95
|
+
].includes(field)) {
|
|
96
|
+
return field;
|
|
97
|
+
}
|
|
98
|
+
// Look up the field in the schema
|
|
99
|
+
const fieldDefinition = schema[model]?.fields[field];
|
|
100
|
+
// Use the configured fieldName if available, otherwise fall back to original
|
|
101
|
+
const fieldName = fieldDefinition?.fieldName || field;
|
|
102
|
+
// Log the field resolution for debugging
|
|
103
|
+
debugLog([
|
|
104
|
+
"getField: ",
|
|
105
|
+
{
|
|
106
|
+
model,
|
|
107
|
+
originalField: field,
|
|
108
|
+
fieldName
|
|
109
|
+
}
|
|
110
|
+
]);
|
|
111
|
+
return fieldName;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Determines if a field is a relationship field by checking for a references property.
|
|
115
|
+
*
|
|
116
|
+
* Relationship fields in the schema have a 'references' property that points to another model.
|
|
117
|
+
* This function checks if this property exists to identify relationship fields.
|
|
118
|
+
*
|
|
119
|
+
* @param fieldKey - The key of the field to check in the schema
|
|
120
|
+
* @param schemaFields - Object containing all fields from the schema for a specific model
|
|
121
|
+
* @returns True if the field is a relationship field (has references), false otherwise
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* // If schema.user.fields.posts has { references: {} }
|
|
125
|
+
* isRelationshipField('posts', schema.user.fields) // Returns true
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* // If schema.user.fields.email has no references property
|
|
129
|
+
* isRelationshipField('email', schema.user.fields) // Returns false
|
|
130
|
+
*/ function isRelationshipField(fieldKey, schemaFields) {
|
|
131
|
+
// A field is a relationship field if it has a 'references' property defined
|
|
132
|
+
return schemaFields[fieldKey]?.references !== undefined;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Extracts a single ID value from a Payload where clause if it represents a simple ID query.
|
|
136
|
+
*
|
|
137
|
+
* This function analyzes a Payload where clause to determine if it's a simple query for a
|
|
138
|
+
* single document by ID. It supports both 'id' and '_id' fields with 'equals' or 'contains'
|
|
139
|
+
* operators. This is useful for optimizing queries when we only need to fetch a single document.
|
|
140
|
+
*
|
|
141
|
+
* @param where - The Payload where clause to analyze
|
|
142
|
+
* @returns The ID value (string or number) if the where clause is a simple ID query, null otherwise
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* // Returns '123' for a simple equals query
|
|
146
|
+
* singleIdQuery({ id: { equals: '123' } }) // '123'
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* // Returns 456 for a simple equals query with number ID
|
|
150
|
+
* singleIdQuery({ _id: { equals: 456 } }) // 456
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* // Returns '789' for a contains query with a single value
|
|
154
|
+
* singleIdQuery({ id: { contains: ['789'] } }) // '789'
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* // Returns null for complex queries
|
|
158
|
+
* singleIdQuery({ and: [{ id: { equals: '123' } }] }) // null
|
|
159
|
+
*/ function singleIdQuery(where) {
|
|
160
|
+
// Return null for empty where clauses or complex queries with 'and'/'or' operators
|
|
161
|
+
if (!where || "and" in where || "or" in where) return null;
|
|
162
|
+
// Check if the where clause contains either 'id' or '_id' field
|
|
163
|
+
if ([
|
|
164
|
+
"id",
|
|
165
|
+
"_id"
|
|
166
|
+
].some((field)=>field in where)) {
|
|
167
|
+
// Determine which ID field is being used (support both 'id' and '_id')
|
|
168
|
+
const idField = "id" in where ? "id" : "_id";
|
|
169
|
+
const condition = where[idField];
|
|
170
|
+
// Process the equals operator case
|
|
171
|
+
if (condition && typeof condition === "object" && !Array.isArray(condition) && "equals" in condition) {
|
|
172
|
+
const value = condition.equals;
|
|
173
|
+
// Only return string or number ID values
|
|
174
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Process the contains operator case with a single value
|
|
179
|
+
if (condition && typeof condition === "object" && !Array.isArray(condition) && "contains" in condition && Array.isArray(condition.contains) && condition.contains.length === 1) {
|
|
180
|
+
const value = condition.contains[0];
|
|
181
|
+
// Only return string or number ID values
|
|
182
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
183
|
+
return value;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Return null if no valid ID query was found
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Normalizes data values based on field type and required ID type
|
|
192
|
+
*
|
|
193
|
+
* This function handles type conversion for relationship fields to ensure
|
|
194
|
+
* IDs are in the correct format (string or number) based on the configuration.
|
|
195
|
+
*
|
|
196
|
+
* @param key - The field key/name
|
|
197
|
+
* @param value - The value to normalize
|
|
198
|
+
* @param isRelatedField - Whether this field is a relationship field
|
|
199
|
+
* @param idType - The expected ID type ('number' or 'text')
|
|
200
|
+
* @returns The normalized value
|
|
201
|
+
*/ function normalizeData({ key, value, isRelatedField, idType }) {
|
|
202
|
+
// Skip processing for null/undefined values
|
|
203
|
+
if (value === null || value === undefined) {
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
if ([
|
|
207
|
+
"id",
|
|
208
|
+
"_id"
|
|
209
|
+
].includes(key)) {
|
|
210
|
+
if (typeof value === "string" && idType === "number") {
|
|
211
|
+
const parsed = parseInt(value, 10);
|
|
212
|
+
if (!isNaN(parsed)) {
|
|
213
|
+
debugLog([
|
|
214
|
+
`ID conversion: ${key} converting string ID to number`,
|
|
215
|
+
{
|
|
216
|
+
original: value,
|
|
217
|
+
converted: parsed
|
|
218
|
+
}
|
|
219
|
+
]);
|
|
220
|
+
return parsed;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (typeof value === "number" && idType === "text") {
|
|
224
|
+
const stringId = String(value);
|
|
225
|
+
debugLog([
|
|
226
|
+
`ID conversion: ${key} converting number ID to string`,
|
|
227
|
+
{
|
|
228
|
+
original: value,
|
|
229
|
+
converted: stringId
|
|
230
|
+
}
|
|
231
|
+
]);
|
|
232
|
+
return stringId;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Only process relationship fields that need type conversion
|
|
236
|
+
if (isRelatedField) {
|
|
237
|
+
// Handle single ID value conversion
|
|
238
|
+
if (typeof value === "string" && idType === "number") {
|
|
239
|
+
const parsed = parseInt(value, 10);
|
|
240
|
+
if (!isNaN(parsed)) {
|
|
241
|
+
debugLog([
|
|
242
|
+
`ID conversion: ${key} converting string ID to number`,
|
|
243
|
+
{
|
|
244
|
+
original: value,
|
|
245
|
+
converted: parsed
|
|
246
|
+
}
|
|
247
|
+
]);
|
|
248
|
+
return parsed;
|
|
249
|
+
}
|
|
250
|
+
} else if (typeof value === "number" && idType === "text") {
|
|
251
|
+
const stringId = String(value);
|
|
252
|
+
debugLog([
|
|
253
|
+
`ID conversion: ${key} converting number ID to string`,
|
|
254
|
+
{
|
|
255
|
+
original: value,
|
|
256
|
+
converted: stringId
|
|
257
|
+
}
|
|
258
|
+
]);
|
|
259
|
+
return stringId;
|
|
260
|
+
}
|
|
261
|
+
// Handle array of IDs - map each value to the correct type
|
|
262
|
+
if (Array.isArray(value)) {
|
|
263
|
+
return value.map((id)=>{
|
|
264
|
+
// Skip null/undefined values in arrays
|
|
265
|
+
if (id === null || id === undefined) return id;
|
|
266
|
+
if (idType === "number" && typeof id === "string") {
|
|
267
|
+
const parsed = parseInt(id, 10);
|
|
268
|
+
return !isNaN(parsed) ? parsed : id;
|
|
269
|
+
} else if (idType === "text" && typeof id === "number") {
|
|
270
|
+
return String(id);
|
|
271
|
+
}
|
|
272
|
+
return id;
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Handle role fields (Coming from better auth, will be a single string seperated by commas if theres multiple roles)
|
|
277
|
+
if (key === "role" || key === "roles") {
|
|
278
|
+
return value.split(",").map((role)=>role.trim().toLowerCase());
|
|
279
|
+
}
|
|
280
|
+
// Return original value if no conversion was needed or applicable
|
|
281
|
+
return value;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Transforms input data from better-auth to Payload CMS format
|
|
285
|
+
*
|
|
286
|
+
* This function handles:
|
|
287
|
+
* 1. Field name mapping according to schema definitions
|
|
288
|
+
* 2. ID type conversion for relationship fields
|
|
289
|
+
* 3. Proper data normalization based on field types
|
|
290
|
+
*
|
|
291
|
+
* @param data - The input data from better-auth
|
|
292
|
+
* @param model - The model name in the schema
|
|
293
|
+
* @param idType - The expected ID type ('number' or 'text')
|
|
294
|
+
* @returns Transformed data compatible with Payload CMS
|
|
295
|
+
*/ function transformInput({ data, model, idType, payload }) {
|
|
296
|
+
const transformedData = {};
|
|
297
|
+
const schemaFields = schema?.[model]?.fields ?? {};
|
|
298
|
+
// Process each field in the input data
|
|
299
|
+
Object.entries(data).forEach(([key, value])=>{
|
|
300
|
+
// Skip null/undefined values
|
|
301
|
+
if (value === null || value === undefined) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Get the mapped field name from schema (if any)
|
|
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;
|
|
312
|
+
// Normalize the data value based on field type and ID type
|
|
313
|
+
const normalizedData = normalizeData({
|
|
314
|
+
idType,
|
|
315
|
+
key,
|
|
316
|
+
value,
|
|
317
|
+
isRelatedField
|
|
318
|
+
});
|
|
319
|
+
const targetFieldKey = getCollectionFieldNameByFieldKeyUntyped(getCollectionByModelKey(payload.collections, model), targetFieldName);
|
|
320
|
+
transformedData[targetFieldKey] = normalizedData;
|
|
321
|
+
});
|
|
322
|
+
return transformedData;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Checks if a value is a Payload join result (has docs array structure)
|
|
326
|
+
*/ function isJoinResult(value) {
|
|
327
|
+
return value !== null && typeof value === "object" && "docs" in value && Array.isArray(value.docs);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Flattens a Payload join result to just the array of documents.
|
|
331
|
+
* Handles both direct documents and polymorphic { relationTo, value } format.
|
|
332
|
+
*/ function flattenJoinResult(joinResult) {
|
|
333
|
+
return joinResult.docs.map((item)=>{
|
|
334
|
+
// Handle polymorphic join format: { relationTo: string, value: doc }
|
|
335
|
+
if (item && typeof item === "object" && "value" in item && "relationTo" in item) {
|
|
336
|
+
return item.value;
|
|
337
|
+
}
|
|
338
|
+
return item;
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Transforms Payload CMS document output to match BetterAuth schema expectations.
|
|
343
|
+
*
|
|
344
|
+
* This function handles several critical transformations:
|
|
345
|
+
*
|
|
346
|
+
* 1. ID Conversion: Ensures all ID fields are strings as required by BetterAuth
|
|
347
|
+
* (see: https://github.com/better-auth/better-auth/blob/main/packages/better-auth/src/db/schema.ts#L125)
|
|
348
|
+
*
|
|
349
|
+
* 2. Relationship Field Mapping: Aligns relationship fields with BetterAuth schema naming conventions
|
|
350
|
+
* and ensures proper ID type handling
|
|
351
|
+
*
|
|
352
|
+
* 3. Date Conversion: Transforms date strings from Payload into Date objects for BetterAuth
|
|
353
|
+
*
|
|
354
|
+
* 4. Join Result Flattening: Converts Payload's { docs: [...] } join format to plain arrays
|
|
355
|
+
*
|
|
356
|
+
* Note: While setting depth: 1 in Payload operations simplifies this process by avoiding
|
|
357
|
+
* deeply nested objects, we maintain comprehensive checks for robustness.
|
|
358
|
+
*
|
|
359
|
+
* @param doc - The document returned from Payload CMS
|
|
360
|
+
* @param model - The model name in the BetterAuth schema
|
|
361
|
+
* @returns The transformed document compatible with BetterAuth
|
|
362
|
+
*/ function transformOutput({ doc, model, payload }) {
|
|
363
|
+
if (!doc || typeof doc !== "object") return doc;
|
|
364
|
+
const result = {
|
|
365
|
+
...doc
|
|
366
|
+
};
|
|
367
|
+
const schemaFields = schema?.[model]?.fields ?? {};
|
|
368
|
+
// Identify relationship fields with custom field name mappings
|
|
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"));
|
|
377
|
+
// First make sure all the fields keys are correct
|
|
378
|
+
Object.keys(result).forEach((key)=>{
|
|
379
|
+
const targetFieldKey = getFieldKeyByCollectionFieldName(getCollectionByModelKey(payload.collections, model), key);
|
|
380
|
+
if (targetFieldKey !== key) {
|
|
381
|
+
result[targetFieldKey] = result[key];
|
|
382
|
+
delete result[key];
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
Object.entries(doc).forEach(([key, value])=>{
|
|
386
|
+
if (value === null || value === undefined) return;
|
|
387
|
+
const targetFieldKey = getFieldKeyByCollectionFieldName(getCollectionByModelKey(payload.collections, model), key);
|
|
388
|
+
// Convert ID fields to strings for BetterAuth compatibility
|
|
389
|
+
if ([
|
|
390
|
+
"id",
|
|
391
|
+
"_id"
|
|
392
|
+
].includes(key)) {
|
|
393
|
+
result[targetFieldKey] = String(value);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
// Flatten join results from { docs: [...] } to plain arrays
|
|
397
|
+
if (isJoinResult(value)) {
|
|
398
|
+
debugLog([
|
|
399
|
+
"transformOutput: flattening join result",
|
|
400
|
+
{
|
|
401
|
+
key,
|
|
402
|
+
targetFieldKey,
|
|
403
|
+
isArray: Array.isArray(value.docs)
|
|
404
|
+
}
|
|
405
|
+
]);
|
|
406
|
+
result[targetFieldKey] = flattenJoinResult(value);
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
// Handle relationship fields with renamed fieldNames
|
|
410
|
+
const originalRelatedFieldKey = Object.keys(relationshipFields).find((k)=>relationshipFields[k].fieldName === key);
|
|
411
|
+
if (originalRelatedFieldKey) {
|
|
412
|
+
normalizeDocumentIds(result, originalRelatedFieldKey, key, value);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
const originalDateFieldKey = Object.keys(dateFields).find((k)=>dateFields[k].fieldName === key);
|
|
416
|
+
if (originalDateFieldKey) {
|
|
417
|
+
// Convert ISO date strings to Date objects for BetterAuth
|
|
418
|
+
result[targetFieldKey] = new Date(value);
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
return result;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Normalizes ID fields for both primary and relationship documents.
|
|
426
|
+
*
|
|
427
|
+
* This function ensures consistent ID handling between BetterAuth and Payload CMS by:
|
|
428
|
+
* 1. Converting all IDs to strings for BetterAuth (stored in originalKey)
|
|
429
|
+
* 2. Preserving original ID types for Payload CMS (stored in fieldName)
|
|
430
|
+
*
|
|
431
|
+
* The function handles various ID formats:
|
|
432
|
+
* - Primitive values (string/number IDs)
|
|
433
|
+
* - Object references with ID properties
|
|
434
|
+
* - Arrays of either primitive IDs or object references
|
|
435
|
+
*
|
|
436
|
+
* @param result - The result object being transformed
|
|
437
|
+
* @param originalKey - The original field key from BetterAuth schema
|
|
438
|
+
* @param fieldName - The renamed field as used in Payload CMS
|
|
439
|
+
* @param value - The ID value to normalize (primitive, object, or array)
|
|
440
|
+
*/ function normalizeDocumentIds(result, originalKey, fieldName, value) {
|
|
441
|
+
// Case 1: Primitive ID value (string or number)
|
|
442
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
443
|
+
// For BetterAuth: Always use string IDs
|
|
444
|
+
result[originalKey] = String(value);
|
|
445
|
+
// For Payload: Keep original type
|
|
446
|
+
result[fieldName] = value;
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
// Case 2: Object with ID property
|
|
450
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value) && "id" in value) {
|
|
451
|
+
// For BetterAuth: Extract and stringify the ID
|
|
452
|
+
result[originalKey] = String(value.id);
|
|
453
|
+
// Preserve the populated relationship object so joins return full documents
|
|
454
|
+
result[fieldName] = {
|
|
455
|
+
...value,
|
|
456
|
+
id: String(value.id)
|
|
457
|
+
};
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
// Case 3: Array of IDs or references
|
|
461
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
462
|
+
// Check if array contains objects with ID properties
|
|
463
|
+
if (value.every((item)=>typeof item === "object" && item !== null && "id" in item)) {
|
|
464
|
+
// Array of objects with IDs
|
|
465
|
+
result[originalKey] = value.map((item)=>String(item.id));
|
|
466
|
+
// Keep joined documents intact while normalizing ID type
|
|
467
|
+
result[fieldName] = value.map((item)=>({
|
|
468
|
+
...item,
|
|
469
|
+
id: String(item.id)
|
|
470
|
+
}));
|
|
471
|
+
} else {
|
|
472
|
+
// Array of primitive IDs
|
|
473
|
+
result[originalKey] = value.map((item)=>String(item));
|
|
474
|
+
result[fieldName] = value.map((item)=>item);
|
|
475
|
+
}
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
// Note: If value doesn't match any expected format, no changes are made
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Converts a BetterAuth operator to the equivalent Payload CMS query operator
|
|
482
|
+
*
|
|
483
|
+
* This function maps standard query operators from BetterAuth's format to
|
|
484
|
+
* the specific format expected by Payload CMS's query engine.
|
|
485
|
+
*
|
|
486
|
+
* @param operator - The BetterAuth operator string (e.g., 'eq', 'gt', 'contains')
|
|
487
|
+
* @param value - The value to be used with the operator
|
|
488
|
+
* @returns An object with the Payload-compatible operator and value
|
|
489
|
+
*
|
|
490
|
+
* @example
|
|
491
|
+
* // Returns { equals: 'test@example.com' }
|
|
492
|
+
* operatorToPayload('eq', 'test@example.com')
|
|
493
|
+
*
|
|
494
|
+
* @example
|
|
495
|
+
* // Returns { greater_than: 100 }
|
|
496
|
+
* operatorToPayload('gt', 100)
|
|
497
|
+
*/ function operatorToPayload(operator, value) {
|
|
498
|
+
switch(operator){
|
|
499
|
+
case "eq":
|
|
500
|
+
return {
|
|
501
|
+
equals: value
|
|
502
|
+
};
|
|
503
|
+
case "ne":
|
|
504
|
+
return {
|
|
505
|
+
not_equals: value
|
|
506
|
+
};
|
|
507
|
+
case "gt":
|
|
508
|
+
return {
|
|
509
|
+
greater_than: value
|
|
510
|
+
};
|
|
511
|
+
case "gte":
|
|
512
|
+
return {
|
|
513
|
+
greater_than_equal: value
|
|
514
|
+
};
|
|
515
|
+
case "lt":
|
|
516
|
+
return {
|
|
517
|
+
less_than: value
|
|
518
|
+
};
|
|
519
|
+
case "lte":
|
|
520
|
+
return {
|
|
521
|
+
less_than_equal: value
|
|
522
|
+
};
|
|
523
|
+
case "contains":
|
|
524
|
+
return {
|
|
525
|
+
contains: value
|
|
526
|
+
};
|
|
527
|
+
case "in":
|
|
528
|
+
return {
|
|
529
|
+
in: value
|
|
530
|
+
};
|
|
531
|
+
case "starts_with":
|
|
532
|
+
return {
|
|
533
|
+
like: `${value}%`
|
|
534
|
+
};
|
|
535
|
+
case "ends_with":
|
|
536
|
+
return {
|
|
537
|
+
like: `%${value}`
|
|
538
|
+
};
|
|
539
|
+
default:
|
|
540
|
+
// Fall back to equals for unrecognized operators
|
|
541
|
+
return {
|
|
542
|
+
equals: value
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Converts a where clause value to the appropriate type based on field name and ID type configuration
|
|
548
|
+
*
|
|
549
|
+
* This function handles two main scenarios:
|
|
550
|
+
* 1. ID field conversion - ensures IDs match the database's expected type (number or string)
|
|
551
|
+
* 2. Object with embedded ID - extracts and converts the ID property from objects
|
|
552
|
+
*
|
|
553
|
+
* @param value - The value to convert (can be primitive, object with ID, or array)
|
|
554
|
+
* @param fieldName - The name of the field being queried
|
|
555
|
+
* @param idType - The expected ID type in the database
|
|
556
|
+
* @returns The converted value appropriate for the database query
|
|
557
|
+
*/ function convertWhereValue({ value, fieldName, idType }) {
|
|
558
|
+
// Check if field is an ID field (supporting both MongoDB-style _id and standard id)
|
|
559
|
+
if ([
|
|
560
|
+
"id",
|
|
561
|
+
"_id"
|
|
562
|
+
].includes(fieldName)) {
|
|
563
|
+
// Case 1: Value is an object containing an ID property
|
|
564
|
+
if (typeof value === "object" && value !== null && "id" in value) {
|
|
565
|
+
// Extract ID from object
|
|
566
|
+
const id = value.id;
|
|
567
|
+
// Use type conversion based on database configuration
|
|
568
|
+
if (idType === "number" && typeof id === "string") {
|
|
569
|
+
const numId = Number(id);
|
|
570
|
+
return !isNaN(numId) ? numId : id;
|
|
571
|
+
}
|
|
572
|
+
if (idType === "text" && typeof id === "number") {
|
|
573
|
+
return String(id);
|
|
574
|
+
}
|
|
575
|
+
return id;
|
|
576
|
+
}
|
|
577
|
+
// Case 2: Value is a standalone ID that needs type conversion
|
|
578
|
+
// Convert string ID to number if database expects numeric IDs
|
|
579
|
+
if (idType === "number" && typeof value === "string" && !isNaN(Number(value))) {
|
|
580
|
+
return Number(value);
|
|
581
|
+
} else if (idType === "text" && typeof value === "number") {
|
|
582
|
+
return String(value);
|
|
583
|
+
}
|
|
584
|
+
return value;
|
|
585
|
+
}
|
|
586
|
+
// For non-ID fields, return the value unchanged
|
|
587
|
+
return value;
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Converts Better Auth where clauses to Payload CMS compatible where conditions
|
|
591
|
+
*
|
|
592
|
+
* This function transforms the Better Auth query format into Payload's query format,
|
|
593
|
+
* handling field name mapping, value type conversion, and logical operators (AND/OR).
|
|
594
|
+
*
|
|
595
|
+
* The function handles three main cases:
|
|
596
|
+
* 1. Empty or undefined where clause - returns empty object
|
|
597
|
+
* 2. Single condition - converts to a simple field-value pair
|
|
598
|
+
* 3. Multiple conditions - groups by AND/OR connectors and builds a complex query
|
|
599
|
+
*
|
|
600
|
+
* @param idType - The database ID type ('number' or 'text')
|
|
601
|
+
* @param model - The model/collection name to query
|
|
602
|
+
* @param where - Array of Better Auth where conditions
|
|
603
|
+
* @returns A Payload-compatible where clause object
|
|
604
|
+
*/ function convertWhereClause({ idType, model, where, payload }) {
|
|
605
|
+
// Handle empty where clause
|
|
606
|
+
if (!where) return {};
|
|
607
|
+
function getPayloadFieldName(fieldKey) {
|
|
608
|
+
return getCollectionFieldNameByFieldKeyUntyped(getCollectionByModelKey(payload.collections, model), fieldKey);
|
|
609
|
+
}
|
|
610
|
+
// Handle single condition case for optimization
|
|
611
|
+
if (where.length === 1) {
|
|
612
|
+
const w = where[0];
|
|
613
|
+
if (!w) {
|
|
614
|
+
return {};
|
|
615
|
+
}
|
|
616
|
+
// Map field name according to schema and convert value to appropriate type
|
|
617
|
+
const fieldName = getFieldName(model, w.field);
|
|
618
|
+
const value = convertWhereValue({
|
|
619
|
+
value: w.value,
|
|
620
|
+
fieldName,
|
|
621
|
+
idType
|
|
622
|
+
});
|
|
623
|
+
// Create the Payload where condition with proper operator
|
|
624
|
+
const res = {
|
|
625
|
+
[getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
|
|
626
|
+
};
|
|
627
|
+
return res;
|
|
628
|
+
}
|
|
629
|
+
// Handle multiple conditions by separating AND/OR clauses
|
|
630
|
+
// Default to AND if no connector is specified
|
|
631
|
+
const and = where.filter((w)=>w.connector === "AND" || !w.connector);
|
|
632
|
+
const or = where.filter((w)=>w.connector === "OR");
|
|
633
|
+
// Process AND conditions
|
|
634
|
+
const andClause = and.map((w)=>{
|
|
635
|
+
const fieldName = getFieldName(model, w.field);
|
|
636
|
+
const value = convertWhereValue({
|
|
637
|
+
value: w.value,
|
|
638
|
+
fieldName,
|
|
639
|
+
idType
|
|
640
|
+
});
|
|
641
|
+
return {
|
|
642
|
+
[getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
|
|
643
|
+
};
|
|
644
|
+
});
|
|
645
|
+
// Process OR conditions
|
|
646
|
+
const orClause = or.map((w)=>{
|
|
647
|
+
const fieldName = getFieldName(model, w.field);
|
|
648
|
+
const value = convertWhereValue({
|
|
649
|
+
value: w.value,
|
|
650
|
+
fieldName,
|
|
651
|
+
idType
|
|
652
|
+
});
|
|
653
|
+
return {
|
|
654
|
+
[getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
|
|
655
|
+
};
|
|
656
|
+
});
|
|
657
|
+
// Combine AND and OR clauses into final Payload where object
|
|
658
|
+
// Only include non-empty clause arrays
|
|
659
|
+
return {
|
|
660
|
+
...andClause.length ? {
|
|
661
|
+
AND: andClause
|
|
662
|
+
} : {},
|
|
663
|
+
...orClause.length ? {
|
|
664
|
+
OR: orClause
|
|
665
|
+
} : {}
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Converts a better-auth select array to a Payload select object
|
|
670
|
+
*
|
|
671
|
+
* This function transforms the better-auth select array (which contains field names)
|
|
672
|
+
* into the format expected by Payload CMS's query API (an object with field names as keys
|
|
673
|
+
* and boolean true as values).
|
|
674
|
+
*
|
|
675
|
+
* It also handles field name mapping between better-auth schema and Payload collections
|
|
676
|
+
* by using the getFieldName helper to resolve the correct field names.
|
|
677
|
+
*
|
|
678
|
+
* @param model - The model/collection name to get field mappings from
|
|
679
|
+
* @param select - Optional array of field names to select
|
|
680
|
+
* @returns A Payload-compatible select object or undefined if no fields to select
|
|
681
|
+
* @example
|
|
682
|
+
* // Input: ['email', 'name']
|
|
683
|
+
* // Output: { email: true, name: true }
|
|
684
|
+
*/ function convertSelect(model, select) {
|
|
685
|
+
// Return undefined if select is empty or not provided
|
|
686
|
+
if (!select || select.length === 0) return undefined;
|
|
687
|
+
// Transform the array of field names into a Payload select object
|
|
688
|
+
// while also mapping any field names that might be different in Payload
|
|
689
|
+
return select.reduce((acc, field)=>({
|
|
690
|
+
...acc,
|
|
691
|
+
[getFieldName(model, field)]: true
|
|
692
|
+
}), {});
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Converts a better-auth sort object to a Payload sort string
|
|
696
|
+
*
|
|
697
|
+
* This function transforms the better-auth sort object (which contains field name and direction)
|
|
698
|
+
* into the format expected by Payload CMS's query API (a string with optional '-' prefix for descending order).
|
|
699
|
+
*
|
|
700
|
+
* It also handles field name mapping between better-auth schema and Payload collections
|
|
701
|
+
* by using the getFieldName helper to resolve the correct field names.
|
|
702
|
+
*
|
|
703
|
+
* @param model - The model/collection name to get field mappings from
|
|
704
|
+
* @param sortBy - Optional object containing field name and sort direction
|
|
705
|
+
* @returns A Payload-compatible sort string or undefined if no sort specified
|
|
706
|
+
* @example
|
|
707
|
+
* // Input: { field: 'email', direction: 'desc' }
|
|
708
|
+
* // Output: '-email'
|
|
709
|
+
* // Input: { field: 'createdAt', direction: 'asc' }
|
|
710
|
+
* // Output: 'createdAt'
|
|
711
|
+
*/ function convertSort(model, sortBy) {
|
|
712
|
+
if (!sortBy) return undefined;
|
|
713
|
+
const fieldName = getFieldName(model, sortBy.field);
|
|
714
|
+
const prefix = sortBy.direction === "desc" ? "-" : "";
|
|
715
|
+
return `${prefix}${fieldName}`;
|
|
716
|
+
}
|
|
717
|
+
return {
|
|
718
|
+
getFieldName,
|
|
719
|
+
getCollectionSlug,
|
|
720
|
+
singleIdQuery,
|
|
721
|
+
transformInput,
|
|
722
|
+
transformOutput,
|
|
723
|
+
convertWhereClause,
|
|
724
|
+
convertSelect,
|
|
725
|
+
convertSort
|
|
726
|
+
};
|
|
727
|
+
};
|
|
728
|
+
|
|
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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
|