@nlabs/reaktor 0.10.1 → 0.10.2
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/coverage/actions/index.html +21 -36
- package/coverage/actions/notifications.ts.html +223 -0
- package/coverage/actions/posts.ts.html +2356 -0
- package/coverage/adapters/arangoAdapter.ts.html +170 -20
- package/coverage/adapters/fileAdapter.ts.html +445 -0
- package/coverage/adapters/index.html +72 -42
- package/coverage/adapters/postAdapter.ts.html +436 -0
- package/coverage/adapters/reaktorAdapter.ts.html +201 -18
- package/coverage/adapters/tagAdapter.ts.html +274 -25
- package/coverage/adapters/userAdapter.ts.html +829 -0
- package/coverage/analyticsUtils.ts.html +286 -0
- package/coverage/config.ts.html +766 -0
- package/coverage/index.html +81 -51
- package/coverage/mocks/group.ts.html +5 -5
- package/coverage/mocks/image.ts.html +18 -12
- package/coverage/mocks/index.html +37 -7
- package/coverage/mocks/post.ts.html +8 -8
- package/coverage/mocks/tag.ts.html +2 -2
- package/coverage/mocks/user.ts.html +18 -15
- package/coverage/testUtils.ts.html +1309 -0
- package/coverage/translationQueue.ts.html +592 -0
- package/coverage/types/error.types.ts.html +148 -0
- package/coverage/types/index.html +2 -2
- package/coverage/utils/adapterUtils.ts.html +39 -27
- package/coverage/utils/analyticsUtils.ts.html +35 -41
- package/coverage/utils/authUtils.ts.html +328 -0
- package/coverage/utils/dbI18n.ts.html +280 -0
- package/coverage/utils/googleTranslate.ts.html +385 -0
- package/coverage/utils/index.html +29 -44
- package/coverage/utils/localeUtils.ts.html +193 -0
- package/coverage/utils/sessionUtils.ts.html +211 -0
- package/coverage/utils/testUtils.ts.html +1309 -0
- package/lex.config.mjs +34 -0
- package/lib/actions/apps.d.ts +25 -0
- package/lib/actions/apps.js +11 -11
- package/lib/actions/connections.d.ts +5 -0
- package/lib/actions/connections.js +6 -6
- package/lib/actions/content.d.ts +13 -0
- package/lib/actions/content.js +9 -9
- package/lib/actions/conversations.d.ts +16 -0
- package/lib/actions/conversations.js +17 -17
- package/lib/actions/dynamodb.d.ts +12 -0
- package/lib/actions/dynamodb.js +2 -2
- package/lib/actions/email.d.ts +8 -0
- package/lib/actions/email.js +2 -2
- package/lib/actions/files.d.ts +19 -0
- package/lib/actions/files.js +3 -3
- package/lib/actions/groups.d.ts +13 -0
- package/lib/actions/groups.js +15 -15
- package/lib/actions/images.d.ts +33 -0
- package/lib/actions/images.js +22 -22
- package/lib/actions/index.d.ts +27 -0
- package/lib/actions/index.js +2 -2
- package/lib/actions/ios.d.ts +7 -0
- package/lib/actions/ios.js +4 -4
- package/lib/actions/locations.d.ts +6 -0
- package/lib/actions/locations.js +3 -3
- package/lib/actions/messages.d.ts +13 -0
- package/lib/actions/messages.js +3 -3
- package/lib/actions/notifications.d.ts +9 -0
- package/lib/actions/notifications.js +2 -2
- package/lib/actions/payments.d.ts +12 -0
- package/lib/actions/payments.js +6 -6
- package/lib/actions/posts.d.ts +25 -0
- package/lib/actions/posts.js +30 -30
- package/lib/actions/profiles.d.ts +4 -0
- package/lib/actions/profiles.js +4 -4
- package/lib/actions/reactions.d.ts +32 -0
- package/lib/actions/reactions.js +16 -16
- package/lib/actions/s3.d.ts +11 -0
- package/lib/actions/s3.js +2 -2
- package/lib/actions/search.d.ts +3 -0
- package/lib/actions/search.js +3 -3
- package/lib/actions/sms.d.ts +2 -0
- package/lib/actions/sms.js +2 -2
- package/lib/actions/statistics.d.ts +4 -0
- package/lib/actions/statistics.js +4 -4
- package/lib/actions/subscriptions.d.ts +7 -0
- package/lib/actions/subscriptions.js +6 -6
- package/lib/actions/tags.d.ts +34 -0
- package/lib/actions/tags.js +6 -6
- package/lib/actions/users.d.ts +73 -0
- package/lib/actions/users.js +45 -42
- package/lib/actions/websockets.d.ts +20 -0
- package/lib/actions/websockets.js +8 -8
- package/lib/adapters/arangoAdapter.d.ts +8 -0
- package/lib/adapters/arangoAdapter.js +2 -2
- package/lib/adapters/contentAdapter.d.ts +8 -0
- package/lib/adapters/contentAdapter.js +2 -2
- package/lib/adapters/fileAdapter.d.ts +9 -0
- package/lib/adapters/fileAdapter.js +2 -2
- package/lib/adapters/imageAdapter.d.ts +8 -0
- package/lib/adapters/imageAdapter.js +2 -2
- package/lib/adapters/index.d.ts +9 -0
- package/lib/adapters/index.js +2 -0
- package/lib/adapters/messageAdapter.d.ts +8 -0
- package/lib/adapters/messageAdapter.js +2 -2
- package/lib/adapters/postAdapter.d.ts +8 -0
- package/lib/adapters/postAdapter.js +2 -2
- package/lib/adapters/reaktorAdapter.d.ts +16 -0
- package/lib/adapters/reaktorAdapter.js +2 -2
- package/lib/adapters/tagAdapter.d.ts +9 -0
- package/lib/adapters/tagAdapter.js +2 -2
- package/lib/adapters/userAdapter.d.ts +13 -0
- package/lib/adapters/userAdapter.js +2 -2
- package/lib/config.d.ts +57 -0
- package/lib/config.js +2 -2
- package/lib/handlers/graphqlHandler.d.ts +4 -0
- package/lib/handlers/graphqlHandler.js +2 -2
- package/lib/index.d.ts +19 -0
- package/lib/index.js +2 -2
- package/lib/lambdas/actions/websockets.d.ts +7 -0
- package/lib/lambdas/actions/websockets.js +6 -6
- package/lib/lambdas/authorizer.d.ts +20 -0
- package/lib/lambdas/authorizer.js +2 -2
- package/lib/lambdas/connection.d.ts +12 -0
- package/lib/lambdas/connection.js +2 -2
- package/lib/lambdas/utils/message.d.ts +1 -0
- package/lib/lambdas/utils/websocket.d.ts +7 -0
- package/lib/lambdas/utils/websocket.js +2 -2
- package/lib/mocks/conversation.d.ts +8 -0
- package/lib/mocks/file.d.ts +11 -0
- package/lib/mocks/group.d.ts +17 -0
- package/lib/mocks/group.js +2 -2
- package/lib/mocks/image.d.ts +3 -0
- package/lib/mocks/image.js +2 -2
- package/lib/mocks/post.d.ts +38 -0
- package/lib/mocks/post.js +2 -2
- package/lib/mocks/tag.d.ts +2 -0
- package/lib/mocks/tag.js +1 -1
- package/lib/mocks/user.d.ts +4 -0
- package/lib/mocks/user.js +2 -2
- package/lib/mutations/content.d.ts +2 -0
- package/lib/mutations/content.js +2 -0
- package/lib/mutations/index.d.ts +11 -0
- package/lib/mutations/index.js +2 -2
- package/lib/mutations/locations.d.ts +2 -0
- package/lib/mutations/locations.js +2 -2
- package/lib/mutations/messages.d.ts +2 -0
- package/lib/mutations/messages.js +2 -2
- package/lib/mutations/posts.d.ts +2 -0
- package/lib/mutations/posts.js +2 -2
- package/lib/mutations/profiles.d.ts +2 -0
- package/lib/mutations/profiles.js +2 -2
- package/lib/mutations/reactions.d.ts +2 -0
- package/lib/mutations/reactions.js +2 -2
- package/lib/mutations/statistics.d.ts +2 -0
- package/lib/mutations/statistics.js +2 -2
- package/lib/mutations/subscriptions.d.ts +2 -0
- package/lib/mutations/subscriptions.js +2 -2
- package/lib/mutations/tags.d.ts +2 -0
- package/lib/mutations/tags.js +2 -2
- package/lib/mutations/users.d.ts +1 -0
- package/lib/mutations/users.js +2 -2
- package/lib/objectTypes/app.d.ts +3 -0
- package/lib/objectTypes/app.js +2 -2
- package/lib/objectTypes/bankAccount.d.ts +1 -0
- package/lib/objectTypes/connection.d.ts +1 -0
- package/lib/objectTypes/connection.js +2 -2
- package/lib/objectTypes/content.d.ts +2 -0
- package/lib/objectTypes/content.js +2 -0
- package/lib/objectTypes/conversation.d.ts +2 -0
- package/lib/objectTypes/conversation.js +2 -2
- package/lib/objectTypes/creditCard.d.ts +1 -0
- package/lib/objectTypes/document.d.ts +1 -0
- package/lib/objectTypes/error.d.ts +1 -0
- package/lib/objectTypes/external.d.ts +1 -0
- package/lib/objectTypes/external.js +2 -2
- package/lib/objectTypes/file.d.ts +2 -0
- package/lib/objectTypes/file.js +2 -2
- package/lib/objectTypes/filter.d.ts +1 -0
- package/lib/objectTypes/group.d.ts +3 -0
- package/lib/objectTypes/group.js +2 -2
- package/lib/objectTypes/iapSubscription.d.ts +1 -0
- package/lib/objectTypes/image.d.ts +6 -0
- package/lib/objectTypes/image.js +2 -2
- package/lib/objectTypes/index.d.ts +26 -0
- package/lib/objectTypes/index.js +2 -2
- package/lib/objectTypes/location.d.ts +2 -0
- package/lib/objectTypes/location.js +2 -2
- package/lib/objectTypes/message.d.ts +2 -0
- package/lib/objectTypes/message.js +2 -2
- package/lib/objectTypes/passcode.d.ts +1 -0
- package/lib/objectTypes/passcode.js +2 -2
- package/lib/objectTypes/plan.d.ts +2 -0
- package/lib/objectTypes/plan.js +2 -2
- package/lib/objectTypes/post.d.ts +2 -0
- package/lib/objectTypes/post.js +2 -2
- package/lib/objectTypes/profile.d.ts +3 -0
- package/lib/objectTypes/profile.js +2 -2
- package/lib/objectTypes/reaction.d.ts +2 -0
- package/lib/objectTypes/reaction.js +2 -2
- package/lib/objectTypes/relation.d.ts +1 -0
- package/lib/objectTypes/relation.js +2 -2
- package/lib/objectTypes/search.d.ts +1 -0
- package/lib/objectTypes/search.js +2 -2
- package/lib/objectTypes/statistics.d.ts +1 -0
- package/lib/objectTypes/statistics.js +2 -2
- package/lib/objectTypes/subscription.d.ts +2 -0
- package/lib/objectTypes/subscription.js +2 -2
- package/lib/objectTypes/tag.d.ts +2 -0
- package/lib/objectTypes/tag.js +2 -2
- package/lib/objectTypes/user.d.ts +4 -0
- package/lib/objectTypes/user.js +2 -2
- package/lib/queries/content.d.ts +2 -0
- package/lib/queries/content.js +2 -0
- package/lib/queries/index.d.ts +10 -0
- package/lib/queries/index.js +2 -2
- package/lib/queries/locations.d.ts +2 -0
- package/lib/queries/locations.js +2 -2
- package/lib/queries/messages.d.ts +2 -0
- package/lib/queries/messages.js +2 -2
- package/lib/queries/posts.d.ts +2 -0
- package/lib/queries/posts.js +2 -2
- package/lib/queries/reactions.d.ts +2 -0
- package/lib/queries/reactions.js +2 -2
- package/lib/queries/statistics.d.ts +2 -0
- package/lib/queries/statistics.js +2 -2
- package/lib/queries/subscriptions.d.ts +2 -0
- package/lib/queries/subscriptions.js +2 -2
- package/lib/queries/tags.d.ts +2 -0
- package/lib/queries/tags.js +2 -2
- package/lib/queries/users.d.ts +1 -0
- package/lib/queries/users.js +2 -2
- package/lib/templates/email/layout.d.ts +2 -0
- package/lib/templates/email/passwordForgot.d.ts +2 -0
- package/lib/templates/email/passwordRecovery.d.ts +2 -0
- package/lib/templates/email/verifyEmail.d.ts +2 -0
- package/lib/templates/email/welcome.d.ts +2 -0
- package/lib/templates/sms/passwordForgot.d.ts +2 -0
- package/lib/templates/sms/passwordRecovery.d.ts +2 -0
- package/lib/templates/sms/verifyEmail.d.ts +2 -0
- package/lib/templates/sms/verifyPhone.d.ts +2 -0
- package/lib/templates/sms/welcome.d.ts +2 -0
- package/lib/types/apps.types.d.ts +50 -0
- package/lib/types/apps.types.js +1 -1
- package/lib/types/arangodb.types.d.ts +38 -0
- package/lib/types/auth.types.d.ts +15 -0
- package/lib/types/connections.types.d.ts +9 -0
- package/lib/types/content.types.d.ts +31 -0
- package/lib/types/conversations.types.d.ts +31 -0
- package/lib/types/email.types.d.ts +17 -0
- package/lib/types/error.types.d.ts +21 -0
- package/lib/types/files.types.d.ts +27 -0
- package/lib/types/google.types.d.ts +33 -0
- package/lib/types/groups.types.d.ts +22 -0
- package/lib/types/images.types.d.ts +56 -0
- package/lib/types/index.d.ts +26 -0
- package/lib/types/index.js +2 -2
- package/lib/types/locations.types.d.ts +22 -0
- package/lib/types/messages.types.d.ts +20 -0
- package/lib/types/notifications.types.d.ts +23 -0
- package/lib/types/payments.types.d.ts +113 -0
- package/lib/types/posts.types.d.ts +32 -0
- package/lib/types/profiles.types.d.ts +20 -0
- package/lib/types/statistics.types.d.ts +3 -0
- package/lib/types/tags.types.d.ts +19 -0
- package/lib/types/users.types.d.ts +110 -0
- package/lib/types/websockets.types.d.ts +22 -0
- package/lib/utils/adapterUtils.d.ts +5 -0
- package/lib/utils/analyticsUtils.d.ts +25 -0
- package/lib/utils/analyticsUtils.js +2 -2
- package/lib/utils/arangodbUtils.d.ts +70 -0
- package/lib/utils/arangodbUtils.js +3 -3
- package/lib/utils/authUtils.d.ts +23 -0
- package/lib/utils/authUtils.js +2 -2
- package/lib/utils/contextUtils.d.ts +3 -0
- package/lib/utils/contextUtils.js +1 -1
- package/lib/utils/dbI18n.d.ts +10 -0
- package/lib/utils/dbI18n.example.d.ts +20 -0
- package/lib/utils/dbI18n.example.js +3 -3
- package/lib/utils/dbI18n.js +2 -2
- package/lib/utils/googleTranslate.d.ts +6 -0
- package/lib/utils/googleTranslate.js +2 -2
- package/lib/utils/graphqlUtils.d.ts +10 -0
- package/lib/utils/graphqlUtils.js +2 -2
- package/lib/utils/index.d.ts +18 -0
- package/lib/utils/index.js +2 -2
- package/lib/utils/languageDetection.d.ts +8 -0
- package/lib/utils/languageDetection.js +1 -1
- package/lib/utils/localeUtils.d.ts +11 -0
- package/lib/utils/localeUtils.example.d.ts +5 -0
- package/lib/utils/localeUtils.example.js +2 -2
- package/lib/utils/localeUtils.js +1 -1
- package/lib/utils/middlewareUtils.d.ts +2 -0
- package/lib/utils/middlewareUtils.js +2 -2
- package/lib/utils/sessionUtils.d.ts +18 -0
- package/lib/utils/sessionUtils.js +2 -2
- package/lib/utils/stripeUtils.d.ts +7 -0
- package/lib/utils/stripeUtils.js +2 -2
- package/lib/utils/templateUtils.d.ts +3 -0
- package/lib/utils/testUtils.d.ts +95 -0
- package/lib/utils/testUtils.js +2 -2
- package/lib/utils/translationQueue.d.ts +29 -0
- package/lib/utils/translationQueue.example.d.ts +33 -0
- package/lib/utils/translationQueue.example.js +2 -2
- package/lib/utils/translationQueue.js +2 -2
- package/package.json +22 -21
- package/tsconfig.build.json +21 -0
- package/tsconfig.lint.json +33 -0
- package/tsconfig.test.json +31 -0
- package/dist/actions/apps.js +0 -242
- package/dist/actions/connections.js +0 -90
- package/dist/actions/conversations.js +0 -350
- package/dist/actions/dynamodb.js +0 -150
- package/dist/actions/email.js +0 -152
- package/dist/actions/files.js +0 -283
- package/dist/actions/groups.js +0 -292
- package/dist/actions/images.js +0 -735
- package/dist/actions/index.js +0 -66
- package/dist/actions/ios.js +0 -164
- package/dist/actions/locations.js +0 -122
- package/dist/actions/messages.js +0 -208
- package/dist/actions/notifications.js +0 -59
- package/dist/actions/payments.js +0 -497
- package/dist/actions/personas.js +0 -110
- package/dist/actions/posts.js +0 -595
- package/dist/actions/reactions.js +0 -322
- package/dist/actions/s3.js +0 -133
- package/dist/actions/search.js +0 -90
- package/dist/actions/sms.js +0 -108
- package/dist/actions/statistics.js +0 -62
- package/dist/actions/subscription.js +0 -220
- package/dist/actions/tags.js +0 -292
- package/dist/actions/users.js +0 -784
- package/dist/actions/websockets.js +0 -174
- package/dist/adapters/arangoAdapter.js +0 -46
- package/dist/adapters/fileAdapter.js +0 -76
- package/dist/adapters/imageAdapter.js +0 -40
- package/dist/adapters/messageAdapter.js +0 -49
- package/dist/adapters/postAdapter.js +0 -70
- package/dist/adapters/reaktorAdapter.js +0 -44
- package/dist/adapters/tagAdapter.js +0 -50
- package/dist/adapters/userAdapter.js +0 -115
- package/dist/config.js +0 -125
- package/dist/index.js +0 -66
- package/dist/lambdas/actions/websockets.js +0 -132
- package/dist/lambdas/authorizer.js +0 -67
- package/dist/lambdas/connection.js +0 -91
- package/dist/lambdas/utils/message.js +0 -42
- package/dist/lambdas/utils/websocket.js +0 -105
- package/dist/mocks/conversation.js +0 -35
- package/dist/mocks/file.js +0 -38
- package/dist/mocks/group.js +0 -47
- package/dist/mocks/image.js +0 -44
- package/dist/mocks/nlabs.png +0 -0
- package/dist/mocks/post.js +0 -55
- package/dist/mocks/tag.js +0 -37
- package/dist/mocks/user.js +0 -88
- package/dist/mutations/index.js +0 -26
- package/dist/mutations/locations.js +0 -44
- package/dist/mutations/messages.js +0 -86
- package/dist/mutations/personas.js +0 -100
- package/dist/mutations/posts.js +0 -53
- package/dist/mutations/reactions.js +0 -51
- package/dist/mutations/statistics.js +0 -39
- package/dist/mutations/subscriptions.js +0 -56
- package/dist/mutations/tags.js +0 -120
- package/dist/mutations/users.js +0 -116
- package/dist/objectTypes/app.js +0 -173
- package/dist/objectTypes/bankAccount.js +0 -76
- package/dist/objectTypes/connection.js +0 -48
- package/dist/objectTypes/conversation.js +0 -77
- package/dist/objectTypes/creditCard.js +0 -86
- package/dist/objectTypes/document.js +0 -46
- package/dist/objectTypes/error.js +0 -46
- package/dist/objectTypes/external.js +0 -74
- package/dist/objectTypes/file.js +0 -100
- package/dist/objectTypes/filter.js +0 -43
- package/dist/objectTypes/group.js +0 -123
- package/dist/objectTypes/iapSubscription.js +0 -40
- package/dist/objectTypes/image.js +0 -129
- package/dist/objectTypes/index.js +0 -68
- package/dist/objectTypes/location.js +0 -109
- package/dist/objectTypes/message.js +0 -96
- package/dist/objectTypes/passcode.js +0 -42
- package/dist/objectTypes/persona.js +0 -87
- package/dist/objectTypes/plan.js +0 -95
- package/dist/objectTypes/post.js +0 -125
- package/dist/objectTypes/reaction.js +0 -61
- package/dist/objectTypes/relation.js +0 -49
- package/dist/objectTypes/search.js +0 -72
- package/dist/objectTypes/statistics.js +0 -39
- package/dist/objectTypes/subscription.js +0 -117
- package/dist/objectTypes/tag.js +0 -65
- package/dist/objectTypes/user.js +0 -144
- package/dist/queries/index.js +0 -33
- package/dist/queries/locations.js +0 -45
- package/dist/queries/messages.js +0 -52
- package/dist/queries/posts.js +0 -154
- package/dist/queries/reactions.js +0 -56
- package/dist/queries/statistics.js +0 -39
- package/dist/queries/subscriptions.js +0 -44
- package/dist/queries/tags.js +0 -75
- package/dist/queries/users.js +0 -64
- package/dist/templates/email/layout.js +0 -302
- package/dist/templates/email/passwordForgot.js +0 -38
- package/dist/templates/email/passwordRecovery.js +0 -35
- package/dist/templates/email/verifyEmail.js +0 -38
- package/dist/templates/email/welcome.js +0 -38
- package/dist/templates/sms/passwordForgot.js +0 -24
- package/dist/templates/sms/passwordRecovery.js +0 -24
- package/dist/templates/sms/verifyEmail.js +0 -24
- package/dist/templates/sms/verifyPhone.js +0 -24
- package/dist/templates/sms/welcome.js +0 -24
- package/dist/types/apps.js +0 -32
- package/dist/types/arangodb.js +0 -16
- package/dist/types/auth.js +0 -16
- package/dist/types/connections.js +0 -16
- package/dist/types/conversations.js +0 -16
- package/dist/types/email.js +0 -16
- package/dist/types/error.js +0 -44
- package/dist/types/files.js +0 -16
- package/dist/types/google.js +0 -16
- package/dist/types/groups.js +0 -16
- package/dist/types/images.js +0 -16
- package/dist/types/index.js +0 -60
- package/dist/types/locations.js +0 -16
- package/dist/types/messages.js +0 -16
- package/dist/types/notifications.js +0 -16
- package/dist/types/payments.js +0 -16
- package/dist/types/personas.js +0 -16
- package/dist/types/posts.js +0 -16
- package/dist/types/statistics.js +0 -16
- package/dist/types/tags.js +0 -16
- package/dist/types/users.js +0 -16
- package/dist/types/websockets.js +0 -16
- package/dist/utils/adapterUtils.js +0 -45
- package/dist/utils/analyticsUtils.js +0 -72
- package/dist/utils/arangodbUtils.js +0 -165
- package/dist/utils/auth.js +0 -57
- package/dist/utils/index.js +0 -30
- package/dist/utils/session.js +0 -60
- package/jest.config.js +0 -17
- package/jest.setup.js +0 -36
- package/lex.config.cjs +0 -13
- package/lib/mutations/locations.integration.js +0 -2
- package/lib/mutations/messages.integration.js +0 -2
- package/lib/mutations/posts.integration.js +0 -2
- package/lib/mutations/profiles.integration.js +0 -2
- package/lib/mutations/reactions.integration.js +0 -2
- package/lib/mutations/statistics.integration.js +0 -2
- package/lib/mutations/subscriptions.integration.js +0 -2
- package/lib/mutations/tags.integration.js +0 -2
- package/lib/mutations/users.integration.js +0 -2
- package/lib/queries/locations.integration.js +0 -2
- package/lib/queries/messages.integration.js +0 -2
- package/lib/queries/posts.integration.js +0 -2
- package/lib/queries/reactions.integration.js +0 -2
- package/lib/queries/tags.integration.js +0 -2
- package/lib/queries/users.integration.js +0 -2
package/lib/actions/posts.js
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import{createHash as
|
|
1
|
+
import{parseNum as L}from"@nlabs/utils/parsers/numbers";import{createHash as v,parseArangoId as S,parseChar as _,parseId as D,parseString as q,parseVarChar as x}from"@nlabs/utils/parsers/strings";import{aql as A}from"arangojs";import{parsePost as H}from"../adapters/postAdapter.js";import{ErrorTypes as m}from"../types/error.types.js";import{logError as f,logException as w}from"../utils/analyticsUtils.js";import{getLimit as V,useDb as E}from"../utils/arangodbUtils.js";import{extractTags as B,getTagsByName as U,updateTagsInItem as Q}from"./tags.js";const W=1e5,O="posts",$=(t={})=>{const{from:r=0,latitude:e=0,longitude:o=0,to:i=30,type:n="post"}=t;return{latitude:L(e,32),limit:V(r,i),longitude:L(o,32),type:_(n,32)}},C=(t=[],r="")=>(t||[]).reduce((e,o)=>{switch(o){case"hasRsvp":return e.queries.push(`LET hasRsvp = TO_BOOL(FIRST(
|
|
2
2
|
FOR post, r IN INBOUND p._id hasReaction
|
|
3
3
|
FILTER r.name == "rsvp" && r.type == "posts" && r._from == "users/${r}"
|
|
4
4
|
COLLECT WITH COUNT INTO count
|
|
5
5
|
RETURN count
|
|
6
|
-
))`),
|
|
6
|
+
))`),e.objects.push("hasRsvp:hasRsvp"),e;case"isSaved":return e.queries.push(`LET isSaved = TO_BOOL(FIRST(
|
|
7
7
|
FOR post, r IN INBOUND p._id hasReaction
|
|
8
8
|
FILTER r.name == "pin" && r.type == "posts" && r._from == "users/${r}"
|
|
9
9
|
COLLECT WITH COUNT INTO count
|
|
10
10
|
RETURN count
|
|
11
|
-
))`),
|
|
11
|
+
))`),e.objects.push("isSaved:isSaved"),e;case"reactions":return e.queries.push(`LET reactions = (
|
|
12
12
|
FOR post, r IN INBOUND p._id hasReaction
|
|
13
13
|
COLLECT reactionName = r.value INTO reactionItems
|
|
14
14
|
RETURN {name: reactionName, count: LENGTH(reactionItems[*].r.value)}
|
|
15
|
-
)`),
|
|
15
|
+
)`),e.objects.push("reactions:reactions"),e;case"rsvpCount":return e.queries.push(`LET rsvpCount = FIRST(
|
|
16
16
|
FOR post, r IN INBOUND p._id hasReaction
|
|
17
17
|
FILTER r.name == "rsvp" && r.type == "posts"
|
|
18
18
|
COLLECT WITH COUNT INTO count
|
|
19
19
|
RETURN count
|
|
20
|
-
)`),
|
|
20
|
+
)`),e.objects.push("rsvpCount:rsvpCount"),e;case"viewCount":return e.queries.push(`LET viewCount = FIRST(
|
|
21
21
|
FOR post, r IN INBOUND p._id hasReaction
|
|
22
22
|
FILTER r.name == "view" && r.type == "posts"
|
|
23
23
|
COLLECT WITH COUNT INTO count
|
|
24
24
|
RETURN count
|
|
25
|
-
)`),
|
|
25
|
+
)`),e.objects.push("viewCount:viewCount"),e;default:return e}},{objects:[],queries:[]}),st=async(t,r,e)=>{const o="getPost",{databaseName:i,fields:n,session:{userId:p}={}}=t,R=D(r),{type:c}=$(e),s=E(i),{objects:a,queries:u}=C(n,p),d=A`FOR p IN posts
|
|
26
26
|
FILTER p._key == ${R} && p.type == ${c}
|
|
27
27
|
LIMIT 1
|
|
28
|
-
RETURN p`;return s.query(d).then(I=>I.next()).then(I=>{const{_id:
|
|
28
|
+
RETURN p`;return s.query(d).then(I=>I.next()).then(I=>{const{_id:g,userId:T,groupId:h,privacy:N="default"}=I;let y;return T===p?I:(h&&N==="group"?y=`LET p = DOCUMENT("${g}")
|
|
29
29
|
${u.join(`
|
|
30
30
|
`)}
|
|
31
31
|
FOR group IN groups
|
|
@@ -33,30 +33,30 @@ import{createHash as B,parseArangoId as S,parseChar as _,parseId as D,parseNum a
|
|
|
33
33
|
FOR u, e IN OUTBOUND group._id hasConnection
|
|
34
34
|
FILTER u._key == "${p}"
|
|
35
35
|
LIMIT 1
|
|
36
|
-
RETURN MERGE(p, {${a.join(", ")}})`:
|
|
36
|
+
RETURN MERGE(p, {${a.join(", ")}})`:N==="public"&&(y=`LET p = DOCUMENT("${g}")
|
|
37
37
|
${u.join(`
|
|
38
38
|
`)}
|
|
39
39
|
LIMIT 1
|
|
40
|
-
RETURN MERGE(p, {${a.join(", ")}})`),
|
|
40
|
+
RETURN MERGE(p, {${a.join(", ")}})`),y?s.query(y).then(l=>l.next()).catch(l=>f({action:o,category:O,label:m.DATABASE_ERROR},l,t)):{})}).catch(I=>f({action:o,category:O,label:m.DATABASE_ERROR},I,t))},ot=(t,r,e,o)=>{const i="getPostsByArea",{databaseName:n,fields:p,session:{userId:R}={}}=t,{limit:c,type:s}=$(o),a=L(r),u=L(e),{objects:d,queries:I}=C(p,R);I.push(`LET distance = DISTANCE(
|
|
41
41
|
${a},
|
|
42
42
|
${u},
|
|
43
43
|
NOT_NULL(p.latitude, 0),
|
|
44
44
|
NOT_NULL(p.longitude, 0))
|
|
45
|
-
`),d.push("distance:distance");const
|
|
45
|
+
`),d.push("distance:distance");const g=`FOR p IN posts
|
|
46
46
|
${I.join(`
|
|
47
47
|
`)}
|
|
48
48
|
FILTER p.type == "${s}" && p.privacy == "public" && p.parentId == null
|
|
49
49
|
${c.aql}
|
|
50
50
|
SORT distance, p.added
|
|
51
|
-
RETURN DISTINCT MERGE(p, {${d.join(", ")}})`;return
|
|
51
|
+
RETURN DISTINCT MERGE(p, {${d.join(", ")}})`;return E(n).query(g).then(T=>T.all()).catch(T=>(f({action:i,category:O,label:m.DATABASE_ERROR},T,t),[]))},rt=(t,r)=>{const{databaseName:e,fields:o,session:{userId:i}={}}=t,{limit:n,type:p}=$(r),{objects:R,queries:c}=C(o,i),s=`FOR p IN posts
|
|
52
52
|
FILTER p.type == "${p}" && p.privacy == "public" && p.parent == null
|
|
53
53
|
${c.join(`
|
|
54
54
|
`)}
|
|
55
55
|
${n.aql}
|
|
56
56
|
SORT p.added DESC
|
|
57
|
-
RETURN DISTINCT MERGE(p, {${R.join(", ")}})`;return
|
|
58
|
-
${
|
|
59
|
-
${
|
|
57
|
+
RETURN DISTINCT MERGE(p, {${R.join(", ")}})`;return E(e).query(s).then(a=>a.all()).catch(a=>{throw a})},nt=(t,r=[],e)=>{const o="getPostsByReactions",{databaseName:i,fields:n,session:{userId:p}={}}=t,{latitude:R,limit:c,longitude:s,type:a}=$(e),{objects:u,queries:d}=C(n,p),I=`users/${p}`,g=JSON.stringify(r.map(P=>_(P,32).toLowerCase())),T=[],h=[`p.type == "${a}"`,'p.privacy == "public"'],N=L(R),y=L(s);N&&y&&(d.push(`LET distance = DISTANCE(
|
|
58
|
+
${N},
|
|
59
|
+
${y},
|
|
60
60
|
NOT_NULL(p.latitude, 0),
|
|
61
61
|
NOT_NULL(p.longitude, 0))
|
|
62
62
|
`),u.push("distance:distance"),T.push("distance")),r.length&&(T.push("matchedTags DESC"),d.push(`LET matchedReactions = LENGTH(
|
|
@@ -66,7 +66,7 @@ import{createHash as B,parseArangoId as S,parseChar as _,parseId as D,parseNum a
|
|
|
66
66
|
)`),u.push("matchedReactions:matchedReactions"),h.push("matchedReactions > 0")),T.push("p.added DESC"),u.push("reactions:reactions");const l=`FOR p, r IN OUTBOUND "${I}" hasReaction
|
|
67
67
|
LET reactions = (
|
|
68
68
|
FOR reaction, hr IN 1..1 INBOUND p isTagged
|
|
69
|
-
LET matched = LENGTH(${
|
|
69
|
+
LET matched = LENGTH(${g}) > 0 && POSITION(${g}, reaction.name)
|
|
70
70
|
SORT reaction.name
|
|
71
71
|
RETURN MERGE(reaction, {matched:matched})
|
|
72
72
|
)
|
|
@@ -74,16 +74,16 @@ import{createHash as B,parseArangoId as S,parseChar as _,parseId as D,parseNum a
|
|
|
74
74
|
`)}
|
|
75
75
|
FILTER ${h.join(" && ")}
|
|
76
76
|
${c.aql}
|
|
77
|
-
RETURN DISTINCT MERGE(p, {${u.join(", ")}})`;return
|
|
77
|
+
RETURN DISTINCT MERGE(p, {${u.join(", ")}})`;return E(i).query(l).then(P=>P.all()).catch(P=>(f({action:o,category:O,label:m.DATABASE_ERROR},P,t),[]))},at=(t,r=[],e)=>{const o="getPostsByTags",{databaseName:i,fields:n,session:{userId:p}={}}=t,{latitude:R,limit:c,longitude:s,type:a}=$(e),{objects:u,queries:d}=C(n,p),I=JSON.stringify(r.map(l=>_(l,32).toLowerCase())),g=[],T=[`p.type == "${a}"`,'p.privacy == "public"'],h=L(R),N=L(s);h&&N&&(d.push(`LET distance = DISTANCE(
|
|
78
78
|
${h},
|
|
79
|
-
${
|
|
79
|
+
${N},
|
|
80
80
|
NOT_NULL(p.latitude, 0),
|
|
81
81
|
NOT_NULL(p.longitude, 0))
|
|
82
|
-
`),u.push("distance:distance"),
|
|
82
|
+
`),u.push("distance:distance"),g.push("distance")),r.length&&(g.push("matchedTags DESC"),d.push(`LET matchedTags = LENGTH(
|
|
83
83
|
FOR t IN tags
|
|
84
84
|
FILTER t.matched == true
|
|
85
85
|
RETURN t
|
|
86
|
-
)`),u.push("matchedTags:matchedTags"),T.push("matchedTags > 0")),
|
|
86
|
+
)`),u.push("matchedTags:matchedTags"),T.push("matchedTags > 0")),g.push("p.added DESC"),u.push("tags:tags");const y=`FOR p IN posts
|
|
87
87
|
LET tags = (
|
|
88
88
|
FOR tag, it IN 1..1 INBOUND p isTagged
|
|
89
89
|
LET matched = LENGTH(${I}) > 0 && POSITION(${I}, tag.name)
|
|
@@ -94,17 +94,17 @@ import{createHash as B,parseArangoId as S,parseChar as _,parseId as D,parseNum a
|
|
|
94
94
|
`)}
|
|
95
95
|
FILTER ${T.join(" && ")}
|
|
96
96
|
${c.aql}
|
|
97
|
-
SORT ${
|
|
98
|
-
RETURN DISTINCT MERGE(p, {${u.join(", ")}})`;return
|
|
97
|
+
SORT ${g.join(", ")}
|
|
98
|
+
RETURN DISTINCT MERGE(p, {${u.join(", ")}})`;return E(i).query(y).then(l=>l.all()).catch(l=>(f({action:o,category:O,label:m.DATABASE_ERROR},l,t),[]))},it=(t,r,e)=>{const o="getPostsByUser",{databaseName:i,fields:n,session:{userId:p}={}}=t,{limit:R,type:c}=$(e),s=D(r),{objects:a,queries:u}=C(n,p),d=`FOR p IN posts
|
|
99
99
|
FILTER p.userId == "${s}" && p.type == "${c}" && p.privacy == "public" && p.parent == null
|
|
100
100
|
${u.join(`
|
|
101
101
|
`)}
|
|
102
102
|
${R.aql}
|
|
103
103
|
SORT p.added
|
|
104
|
-
RETURN DISTINCT MERGE(p, {${a.join(", ")}})`;return
|
|
104
|
+
RETURN DISTINCT MERGE(p, {${a.join(", ")}})`;return E(i).query(d).then(I=>I.all()).catch(I=>(f({action:o,category:O,label:m.DATABASE_ERROR},I,t),[]))},pt=(t,r,e)=>{const o="getPostComments",{databaseName:i,session:{userId:n}={}}=t,{limit:p,type:R}=$(e),c=D(r),s=A`FOR p IN posts
|
|
105
105
|
FILTER p.type == ${R} && p._key == ${c}
|
|
106
106
|
LIMIT 1
|
|
107
|
-
RETURN p`;return
|
|
107
|
+
RETURN p`;return E(i).query(s).then(a=>a.next()).then(a=>{const{_key:u,groupId:d,privacy:I="default"}=a;let g;return d&&I==="group"?g=`FOR p IN posts
|
|
108
108
|
FOR user IN users
|
|
109
109
|
FILTER p.parent == "${u}" && user._key == p.userId
|
|
110
110
|
LET reactions = (
|
|
@@ -118,7 +118,7 @@ import{createHash as B,parseArangoId as S,parseChar as _,parseId as D,parseNum a
|
|
|
118
118
|
FILTER u._key == "${n}"
|
|
119
119
|
SORT p.added
|
|
120
120
|
${p.aql}
|
|
121
|
-
RETURN MERGE(p, {user: user, reactions: reactions})`:I==="public"&&(
|
|
121
|
+
RETURN MERGE(p, {user: user, reactions: reactions})`:I==="public"&&(g=`FOR p IN posts
|
|
122
122
|
FOR user IN users
|
|
123
123
|
FILTER p.parent == "${u}" && user._key == p.userId
|
|
124
124
|
LET reactions = (
|
|
@@ -128,16 +128,16 @@ import{createHash as B,parseArangoId as S,parseChar as _,parseId as D,parseNum a
|
|
|
128
128
|
)
|
|
129
129
|
SORT p.added
|
|
130
130
|
${p.aql}
|
|
131
|
-
RETURN MERGE(p, {user: user, reactions: reactions})`),E
|
|
131
|
+
RETURN MERGE(p, {user: user, reactions: reactions})`),g?E(i).query(g).then(T=>T.all()).catch(T=>(f({action:o,category:O,label:m.DATABASE_ERROR},T,t),[])):[]}).catch(a=>(f({action:o,category:O,label:m.DATABASE_ERROR},a,t),[]))},ct=async(t,{content:r="",endDate:e,groupId:o="",location:i,latitude:n,longitude:p,name:R="",parentId:c="",privacy:s="public",tags:a=[],startDate:u,type:d="default"})=>{const I="addPost",{databaseName:g,session:{userId:T}={}}=t,h=Date.now(),N=v(`post-${T}`),y={_id:`posts/${N}`,_key:N,added:h,content:q(r,W)||"",endDate:e?L(e,13):void 0,groupId:o?D(o):void 0,latitude:n!==void 0?L(n):void 0,location:i?q(i,160):void 0,longitude:p!==void 0?L(p):void 0,modified:h,name:q(R,160),parentId:c?D(c):void 0,privacy:x(s,16),startDate:u?L(u,13):void 0,type:_(d,32),userId:T},l=A`INSERT ${y} IN posts RETURN NEW`;try{const P=await E(g).query(l).then(b=>b.next()).catch(b=>f({action:I,category:O,label:m.DATABASE_ERROR},b,t)),{_id:M}=P,j=await B(y.content||"");if(a.length||j.length){const b=(await U(t,a.map(({name:F})=>F||""))).map(F=>({...F,tagBy:T})),G=(await U(t,j||[])).map(F=>({...F,tagBy:"extract"})),k=await Q(t,{itemDocId:M,tags:[...G,...b]});return{...P,tags:k}}return P}catch(P){throw P}},ut=async(t,r)=>{const e="updatePost",{databaseName:o,session:{userId:i}={}}=t,n=Date.now(),p=H(r),{postId:R,tags:c=[]}=p,s={...p,modified:n};if(!R)throw w({action:e,category:O,value:m.INVALID_ID},t);const a={...s,_key:R,added:n,userId:i},u=A`UPSERT {_key: ${R}, userId: ${i}}
|
|
132
132
|
INSERT ${a}
|
|
133
133
|
UPDATE ${s}
|
|
134
|
-
IN posts RETURN NEW`;try{const d=await
|
|
134
|
+
IN posts RETURN NEW`;try{const d=await E(o).query(u).then(T=>T.next()).catch(T=>f({action:e,category:O,value:m.DATABASE_ERROR},T,{})),{_id:I}=d,g=await B(a.content||"");if(c?.length||g?.length){const T=c?.length?(await U(t,c.map(({name:y})=>y||""))).map(y=>({...y,tagBy:i})):[],h=g?.length?(await U(t,g||[])).map(y=>({...y,tagBy:"extract"})):[],N=await Q(t,{itemDocId:I,tags:[...h,...T]});return{...d,tags:N}}return d}catch(d){throw d}},dt=async(t,r)=>{const e="deletePost",{databaseName:o,session:{userId:i}={}}=t,n=S(r);if(!n)throw w({action:e,category:O,value:m.INVALID_ID},t);const p=A`FOR t IN isTagged
|
|
135
135
|
FILTER t._to == ${n}
|
|
136
|
-
REMOVE t IN isTagged`;await
|
|
136
|
+
REMOVE t IN isTagged`;await E(o).query(p).catch(s=>{throw s});const R=A`FOR f IN hasFile
|
|
137
137
|
FILTER f._to == ${n}
|
|
138
|
-
REMOVE f IN hasFile`;await
|
|
138
|
+
REMOVE f IN hasFile`;await E(o).query(R).catch(s=>{throw s});const c=A`FOR p IN posts
|
|
139
139
|
FILTER p._id == ${n} && p.userId == ${i}
|
|
140
140
|
LIMIT 1
|
|
141
141
|
REMOVE p IN posts
|
|
142
|
-
RETURN OLD`;return
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVN0cmluZywgcGFyc2VWYXJDaGFyXG59IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtleHRyYWN0VGFncywgZ2V0VGFnc0J5TmFtZSwgdXBkYXRlVGFnc0luSXRlbX0gZnJvbSAnLi90YWdzJztcbmltcG9ydCB7cGFyc2VQb3N0fSBmcm9tICcuLi9hZGFwdGVycy9wb3N0QWRhcHRlcic7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dCwgQXJhbmdvRGJMaW1pdCwgRmlsZVR5cGUsIFBvc3RJbnB1dFR5cGUsIFBvc3RPcHRpb25zLCBQb3N0VHlwZSwgVGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5cbmNvbnN0IE1BWF9DT05URU5UX0xFTkdUSDogbnVtYmVyID0gMTAwMDAwO1xuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3Bvc3RzJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlUG9zdE9wdGlvbnMgPSAob3B0aW9uczogUG9zdE9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgbGF0aXR1ZGUgPSAwLFxuICAgIGxvbmdpdHVkZSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ3Bvc3QnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSBhcyBBcmFuZ29EYkxpbWl0LFxuICAgIGxvbmdpdHVkZTogcGFyc2VOdW0obG9uZ2l0dWRlLCAzMiksXG4gICAgdHlwZTogcGFyc2VDaGFyKHR5cGUsIDMyKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RPcHRpb25hbCA9IChmaWVsZHM6IHN0cmluZ1tdLCBzZXNzaW9uSWQ6IHN0cmluZykgPT5cbiAgKGZpZWxkcyB8fCBbXSkucmVkdWNlKChzZWxlY3RzLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdoYXNSc3ZwJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIGhhc1JzdnAgPSBUT19CT09MKEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicnN2cFwiICYmIHIudHlwZSA9PSBcInBvc3RzXCIgJiYgci5fZnJvbSA9PSBcInVzZXJzLyR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKSlgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ2hhc1JzdnA6aGFzUnN2cCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2lzU2F2ZWQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgaXNTYXZlZCA9IFRPX0JPT0woRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJwaW5cIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiICYmIHIuX2Zyb20gPT0gXCJ1c2Vycy8ke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgICkpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdpc1NhdmVkOmlzU2F2ZWQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncmVhY3Rpb25zOnJlYWN0aW9ucycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JzdnBDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByc3ZwQ291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInJzdnBcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncnN2cENvdW50OnJzdnBDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB2aWV3Q291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInZpZXdcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndmlld0NvdW50OnZpZXdDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgfVxuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwb3N0SWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKHBvc3RJZCk7XG4gIGNvbnN0IHt0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9ICYmIHAudHlwZSA9PSAke3R5cGV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHBvc3Q6IFBvc3RUeXBlKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9pZDogcG9zdERvY0lkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAnZGVmYXVsdCdcbiAgICAgIH06IFBvc3RUeXBlID0gcG9zdDtcblxuICAgICAgbGV0IHByaXZhY3lBcWxRcnk6IHN0cmluZztcblxuICAgICAgaWYodXNlcklkID09PSBzZXNzaW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIHBvc3Q7XG4gICAgICB9XG5cbiAgICAgIGlmKGdyb3VwSWQgJiYgcHJpdmFjeSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYExFVCBwID0gRE9DVU1FTlQoXCIke3Bvc3REb2NJZH1cIilcbiAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBoYXNDb25uZWN0aW9uXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBcIiR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlBcHAnO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbi8vICAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbi8vICAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbi8vICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50ID09IG51bGxcbi8vICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4vLyAgICAgJHtsaW1pdC5hcWx9XG4vLyAgICAgU09SVCBwLmFkZGVkXG4vLyAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbi8vICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbi8vICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlBcmVhID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBsYXRpdHVkZTogbnVtYmVyLFxuICBsb25naXR1ZGU6IG51bWJlcixcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeUFyZWEnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICBgKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnRJZCA9PSBudWxsXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSwgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBQb3N0VHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBQb3N0VHlwZVtdO1xuICAgIH0pO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlHcm91cCA9IChcbi8vICAgY29udGV4dDogQXBpQ29udGV4dCxcbi8vICAgZ3JvdXBJZDogc3RyaW5nLFxuLy8gICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbi8vICk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG5cbi8vICAgLy8gR3JvdXAgaWRcbi8vICAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbi8vICAgY29uc3QgZGIgPSBkYXRhYmFzZTtcbi8vICAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4vLyAgICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuLy8gICAgICAgUkVUVVJOIGdgO1xuXG4vLyAgIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuLy8gICAgIC50aGVuKChncm91cHM6IEdyb3VwVHlwZVtdID0gW10pID0+IHtcbi8vICAgICAgIGlmKGdyb3Vwcy5sZW5ndGgpIHtcbi8vICAgICAgICAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4vLyAgICAgICAgIGNvbnN0IHBvc3RBcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuLy8gICAgICAgICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5ncm91cElkID09IFwiJHtmb3JtYXRHcm91cElkfVwiICYmIHAucGFyZW50ID09IG51bGxcbi8vICAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4vLyAgICAgICAgICAgJHtsaW1pdC5hcWx9XG4vLyAgICAgICAgICAgU09SVCBwLmFkZGVkXG4vLyAgICAgICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbi8vICAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHBvc3RBcWxRcnkpXG4vLyAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuLy8gICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4vLyAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgcmV0dXJuIFtdO1xuLy8gICAgIH0pXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUxhdGVzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50ID09IG51bGxcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5UmVhY3Rpb25zID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsaW1pdCwgbG9uZ2l0dWRlLCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmVhY3Rpb25zLm1hcCgocmVhY3Rpb24pID0+IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZihyZWFjdGlvbnMubGVuZ3RoKSB7XG4gICAgc29ydEJ5LnB1c2goJ21hdGNoZWRUYWdzIERFU0MnKTtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBtYXRjaGVkUmVhY3Rpb25zID0gTEVOR1RIKFxuICAgICAgRk9SIG1yIElOIHJlYWN0aW9uc1xuICAgICAgRklMVEVSIG1yLm1hdGNoZWQgPT0gdHJ1ZVxuICAgICAgUkVUVVJOIG1yXG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFJlYWN0aW9uczptYXRjaGVkUmVhY3Rpb25zJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkUmVhY3Rpb25zID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwLCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgRk9SIHJlYWN0aW9uLCBociBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRSZWFjdGlvbnN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRSZWFjdGlvbnN9LCByZWFjdGlvbi5uYW1lKVxuICAgICAgU09SVCByZWFjdGlvbi5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UocmVhY3Rpb24sIHttYXRjaGVkOm1hdGNoZWR9KVxuICAgIClcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFBvc3RUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFBvc3RUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRhZ3M6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbGltaXQsIGxvbmdpdHVkZSwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBmb3JtYXRUYWdOYW1lczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGFncy5tYXAoKHRhZykgPT4gcGFyc2VDaGFyKHRhZywgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZih0YWdzLmxlbmd0aCkge1xuICAgIHNvcnRCeS5wdXNoKCdtYXRjaGVkVGFncyBERVNDJyk7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgbWF0Y2hlZFRhZ3MgPSBMRU5HVEgoXG4gICAgICBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgdC5tYXRjaGVkID09IHRydWVcbiAgICAgIFJFVFVSTiB0XG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFRhZ3M6bWF0Y2hlZFRhZ3MnKTtcbiAgICBmaWx0ZXJzLnB1c2goJ21hdGNoZWRUYWdzID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3RhZ3M6dGFncycpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgTEVUIHRhZ3MgPSAoXG4gICAgICBGT1IgdGFnLCBpdCBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRUYWdOYW1lc30pID4gMCAmJiBQT1NJVElPTigke2Zvcm1hdFRhZ05hbWVzfSwgdGFnLm5hbWUpXG4gICAgICBTT1JUIHRhZy5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UodGFnLCB7bWF0Y2hlZDptYXRjaGVkfSlcbiAgICApXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0Q29tbWVudHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdElkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0Q29tbWVudHMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcblxuICAvLyBHZXQgdGhlIHBhcmVudCBwb3N0IHRvIGdldCByZXN0cmljdGlvbnNcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgX2tleSxcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgcHJpdmFjeSA9ICdkZWZhdWx0J1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBoYXNDb25uZWN0aW9uXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBcIiR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgU09SVCBwLmFkZGVkXG4gICAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHt1c2VyOiB1c2VyLCByZWFjdGlvbnM6IHJlYWN0aW9uc30pYDtcbiAgICAgIH0gZWxzZSBpZihwcml2YWN5ID09PSAncHVibGljJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgRk9SIHVzZXIgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgcC5wYXJlbnQgPT0gXCIke19rZXl9XCIgJiYgdXNlci5fa2V5ID09IHAudXNlcklkXG4gICAgICAgICAgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICAgIClcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfVxuXG4gICAgICBpZihwcml2YWN5QXFsUXJ5KSB7XG4gICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdIGFzIFBvc3RUeXBlW107XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udGVudCA9ICcnLFxuICAgIGVuZERhdGUsXG4gICAgZ3JvdXBJZCA9ICcnLFxuICAgIGxvY2F0aW9uLFxuICAgIGxhdGl0dWRlLFxuICAgIGxvbmdpdHVkZSxcbiAgICBuYW1lID0gJycsXG4gICAgcGFyZW50SWQgPSBudWxsLFxuICAgIHByaXZhY3kgPSAncHVibGljJyxcbiAgICB0YWdzID0gW10sXG4gICAgc3RhcnREYXRlLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdElucHV0VHlwZVxuKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBwb3N0SWQgPSBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBpbnNlcnQ6IFBvc3RUeXBlID0ge1xuICAgIF9pZDogYHBvc3RzLyR7cG9zdElkfWAsXG4gICAgX2tleTogcG9zdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgY29udGVudDogcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSxcbiAgICBlbmREYXRlOiBlbmREYXRlID8gcGFyc2VOdW0oZW5kRGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpLFxuICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlID8gcGFyc2VOdW0oc3RhcnREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgdHlwZTogcGFyc2VDaGFyKHR5cGUsIDMyKSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZFBvc3Q6IFBvc3RUeXBlID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gICAgY29uc3Qge19pZDogcG9zdERvY0lkfSA9IHNhdmVkUG9zdDtcbiAgICBjb25zdCBjb250ZW50VGFnTmFtZXMgPSBhd2FpdCBleHRyYWN0VGFncyhpbnNlcnQuY29udGVudCk7XG5cbiAgICBpZih0YWdzLmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1c2VyVGFncyA9IChhd2FpdCBnZXRUYWdzQnlOYW1lKGNvbnRleHQsIHRhZ3MubWFwKCh7bmFtZX0pID0+IG5hbWUpKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6IHNlc3Npb25JZH0pKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gKGF3YWl0IGdldFRhZ3NCeU5hbWUoY29udGV4dCwgY29udGVudFRhZ05hbWVzKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6ICdleHRyYWN0J30pKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUYWdzOiBUYWdUeXBlW10gPSBhd2FpdCB1cGRhdGVUYWdzSW5JdGVtKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgaXRlbURvY0lkOiBwb3N0RG9jSWQsXG4gICAgICAgICAgdGFnczogWy4uLmNvbnRlbnRUYWdzLCAuLi51c2VyVGFnc11cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc2F2ZWRQb3N0LFxuICAgICAgICB0YWdzOiB1cGRhdGVkVGFnc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3Q6IFBvc3RJbnB1dFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZVBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcGFyc2VkUG9zdCA9IHBhcnNlUG9zdChwb3N0KTtcbiAgY29uc3Qge1xuICAgIHBvc3RJZCxcbiAgICB0YWdzID0gW11cbiAgfSA9IHBhcnNlZFBvc3Q7XG5cbiAgY29uc3QgdXBkYXRlOiBQb3N0VHlwZSA9IHtcbiAgICAuLi5wYXJzZWRQb3N0LFxuICAgIG1vZGlmaWVkOiBub3dcbiAgfTtcblxuICBpZighcG9zdElkKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfSURcbiAgICB9LCB7fSk7XG4gIH1cblxuICBjb25zdCBpbnNlcnQgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IHBvc3RJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke3Bvc3RJZH0sIHVzZXJJZDogJHtzZXNzaW9uSWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpXG4gICAgICAucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pKTtcbiAgICBjb25zdCB7X2lkOiB1cGRhdGVkUG9zdElkfSA9IHVwZGF0ZWRQb3N0O1xuICAgIGNvbnN0IGNvbnRlbnRUYWdOYW1lcyA9IGF3YWl0IGV4dHJhY3RUYWdzKGluc2VydC5jb250ZW50KTtcblxuICAgIGlmKHRhZ3M/Lmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdXNlclRhZ3MgPSB0YWdzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCB0YWdzLm1hcCgoe25hbWV9KSA9PiBuYW1lKSkpXG4gICAgICAgIC5tYXAoKHRhZykgPT4gKHsuLi50YWcsIHRhZ0J5OiBzZXNzaW9uSWR9KSkgOiBbXTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gY29udGVudFRhZ05hbWVzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCBjb250ZW50VGFnTmFtZXMpKVxuICAgICAgICAubWFwKCh0YWcpID0+ICh7Li4udGFnLCB0YWdCeTogJ2V4dHJhY3QnfSkpIDogW107XG4gICAgICBjb25zdCB1cGRhdGVkVGFnczogVGFnVHlwZVtdID0gYXdhaXQgdXBkYXRlVGFnc0luSXRlbShcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIGl0ZW1Eb2NJZDogdXBkYXRlZFBvc3RJZCxcbiAgICAgICAgICB0YWdzOiBbLi4uY29udGVudFRhZ3MsIC4uLnVzZXJUYWdzXVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVkUG9zdCxcbiAgICAgICAgdGFnczogdXBkYXRlZFRhZ3NcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3REb2NJZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRQb3N0SWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQocG9zdERvY0lkKTtcblxuICBpZighZm9ybWF0UG9zdElkKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfSURcbiAgICB9LCB7fSk7XG4gIH1cblxuICBjb25zdCBlZGdlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdCBJTiBpc1RhZ2dlZFxuICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRQb3N0SWR9XG4gIFJFTU9WRSB0IElOIGlzVGFnZ2VkYDtcblxuICBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gIGNvbnN0IGZpbGVBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBmIElOIGhhc0ZpbGVcbiAgICBGSUxURVIgZi5fdG8gPT0gJHtmb3JtYXRQb3N0SWR9XG4gICAgUkVNT1ZFIGYgSU4gaGFzRmlsZWA7XG5cbiAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShmaWxlQXFsUXJ5KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcblxuICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIHAgSU4gcG9zdHNcbiAgICAgIEZJTFRFUiBwLl9pZCA9PSAke2Zvcm1hdFBvc3RJZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvc3RFZGdlID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwb3N0RG9jSWQ6IHN0cmluZyxcbiAgaXRlbURvY0lkOiBzdHJpbmcsXG4gIGVkZ2VUeXBlOiBzdHJpbmcgPSAnaXNQb3N0ZWQnLFxuICBwcm9wcyA9IHt9XG4pOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjcmVhdGVQb3N0RWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKGVkZ2VUeXBlKTtcbiAgY29uc3QgZm9ybWF0UG9zdElkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKHBvc3REb2NJZCk7XG4gIGNvbnN0IGZvcm1hdERvY0lkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1Eb2NJZCk7XG5cbiAgaWYoIWZvcm1hdERvY0lkIHx8ICFmb3JtYXRQb3N0SWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9JRCkpO1xuICB9XG5cbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBwb3N0RWRnZS0ke2Zvcm1hdFBvc3RJZH0tJHtmb3JtYXREb2NJZH1gKTtcbiAgY29uc3QgZWRnZSA9IHtcbiAgICBfZnJvbTogZm9ybWF0UG9zdElkLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGZvcm1hdERvY0lkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIC4uLnByb3BzXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUNFLGNBQUFBLEVBQVksaUJBQUFDLEVBQWUsYUFBQUMsRUFBVyxXQUFBQyxFQUFTLFlBQUFDLEVBQVUsZUFBQUMsRUFBYSxnQkFBQUMsTUFDakUsZUFDUCxPQUFRLE9BQUFDLE1BQVUsV0FHbEIsT0FBUSxlQUFBQyxFQUFhLGlCQUFBQyxFQUFlLG9CQUFBQyxNQUF1QixTQUMzRCxPQUFRLGFBQUFDLE1BQWdCLDBCQUN4QixPQUFRLGNBQUFDLE1BQWlCLHVCQUN6QixPQUFRLFlBQUFDLEVBQVUsZ0JBQUFDLE1BQW1CLDBCQUNyQyxPQUFRLFlBQUFDLEVBQVUsU0FBQUMsTUFBWSx5QkFLOUIsTUFBTUMsRUFBNkIsSUFDN0JDLEVBQXdCLFFBRWpCQyxFQUFtQixDQUFDQyxFQUF1QixDQUFDLElBQU0sQ0FDN0QsS0FBTSxDQUNKLEtBQUFDLEVBQU8s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QU8sSUFBSSxNQUFNN0UsRUFBVyxVQUFVLENBQUMsRUFHeEQsTUFBTXNGLEVBQWlCbEcsRUFBVyxZQUFZeUYsQ0FBWSxJQUFJUSxDQUFXLEVBQUUsRUFDckVFLEVBQU8sQ0FDWCxNQUFPVixFQUNQLEtBQU1TLEVBQ04sSUFBS0QsRUFDTCxNQUFPLEtBQUssSUFBSSxFQUNoQixHQUFHRixDQUNMLEVBRUEsT0FBT0MsRUFBZSxLQUFLRyxFQUFNLENBQUMsVUFBVyxFQUFJLENBQUMsRUFDL0MsTUFBT25ELEdBQ05uQyxFQUFTLENBQ1AsT0FBQXFCLEVBQ0EsU0FBVWhCLEVBQ1YsTUFBT04sRUFBVyxjQUNwQixFQUFHb0MsRUFBTyxDQUFDLENBQUMsQ0FBQyxDQUNuQiIsCiAgIm5hbWVzIjogWyJjcmVhdGVIYXNoIiwgInBhcnNlQXJhbmdvSWQiLCAicGFyc2VDaGFyIiwgInBhcnNlSWQiLCAicGFyc2VOdW0iLCAicGFyc2VTdHJpbmciLCAicGFyc2VWYXJDaGFyIiwgImFxbCIsICJleHRyYWN0VGFncyIsICJnZXRUYWdzQnlOYW1lIiwgInVwZGF0ZVRhZ3NJbkl0ZW0iLCAicGFyc2VQb3N0IiwgIkVycm9yVHlwZXMiLCAibG9nRXJyb3IiLCAibG9nRXhjZXB0aW9uIiwgImdldExpbWl0IiwgInVzZURiIiwgIk1BWF9DT05URU5UX0xFTkdUSCIsICJldmVudENhdGVnb3J5IiwgInBhcnNlUG9zdE9wdGlvbnMiLCAib3B0aW9ucyIsICJmcm9tIiwgImxhdGl0dWRlIiwgImxvbmdpdHVkZSIsICJ0byIsICJ0eXBlIiwgImdldFBvc3RPcHRpb25hbCIsICJmaWVsZHMiLCAic2Vzc2lvbklkIiwgInNlbGVjdHMiLCAiZmllbGQiLCAiZ2V0UG9zdCIsICJjb250ZXh0IiwgInBvc3RJZCIsICJhY3Rpb24iLCAiZGF0YWJhc2VOYW1lIiwgImZvcm1hdEl0ZW1JZCIsICJkYXRhYmFzZSIsICJzZWxlY3RPYmplY3RzIiwgInNlbGVjdFF1ZXJpZXMiLCAiYXFsUXJ5IiwgImN1cnNvciIsICJwb3N0IiwgInBvc3REb2NJZCIsICJ1c2VySWQiLCAiZ3JvdXBJZCIsICJwcml2YWN5IiwgInByaXZhY3lBcWxRcnkiLCAiZXJyb3IiLCAiZ2V0UG9zdHNCeUFyZWEiLCAibGltaXQiLCAiZm9ybWF0TGF0aXR1ZGUiLCAiZm9ybWF0TG9uZ2l0dWRlIiwgImdldFBvc3RzQnlMYXRlc3QiLCAiZ2V0UG9zdHNCeVJlYWN0aW9ucyIsICJyZWFjdGlvbnMiLCAiZm9ybWF0U2Vzc2lvbklkIiwgImZvcm1hdFJlYWN0aW9ucyIsICJyZWFjdGlvbiIsICJzb3J0QnkiLCAiZmlsdGVycyIsICJnZXRQb3N0c0J5VGFncyIsICJ0YWdzIiwgImZvcm1hdFRhZ05hbWVzIiwgInRhZyIsICJnZXRQb3N0c0J5VXNlciIsICJmb3JtYXRVc2VySWQiLCAiZ2V0UG9zdENvbW1lbnRzIiwgIl9rZXkiLCAiYWRkUG9zdCIsICJjb250ZW50IiwgImVuZERhdGUiLCAibG9jYXRpb24iLCAibmFtZSIsICJwYXJlbnRJZCIsICJzdGFydERhdGUiLCAibm93IiwgImluc2VydCIsICJzYXZlZFBvc3QiLCAiY29udGVudFRhZ05hbWVzIiwgInVzZXJUYWdzIiwgImNvbnRlbnRUYWdzIiwgInVwZGF0ZWRUYWdzIiwgInVwZGF0ZVBvc3QiLCAicGFyc2VkUG9zdCIsICJ1cGRhdGUiLCAidXBkYXRlZFBvc3QiLCAidXBkYXRlZFBvc3RJZCIsICJkZWxldGVQb3N0IiwgImZvcm1hdFBvc3RJZCIsICJlZGdlQXFsUXJ5IiwgImZpbGVBcWxRcnkiLCAiY3JlYXRlUG9zdEVkZ2UiLCAiaXRlbURvY0lkIiwgImVkZ2VUeXBlIiwgInByb3BzIiwgImVkZ2VDb2xsZWN0aW9uIiwgImZvcm1hdERvY0lkIiwgImVkZ2VJZCIsICJlZGdlIl0KfQo=
|
|
142
|
+
RETURN OLD`;return E(o).query(c).then(s=>s.next()).catch(s=>{throw s})},Tt=(t,r,e,o="isPosted",i={})=>{const n="createPostEdge",{databaseName:p}=t,R=E(p).collection(o),c=S(r),s=S(e);if(!s||!c)throw new Error(m.INVALID_ID);const a=v(`postEdge-${c}-${s}`),u={_from:c,_key:a,_to:s,added:Date.now(),...i};return R.save(u,{returnNew:!0}).catch(d=>{throw f({action:n,category:O,value:m.DATABASE_ERROR},d,t)})};export{ct as addPost,Tt as createPostEdge,dt as deletePost,st as getPost,pt as getPostComments,C as getPostOptional,ot as getPostsByArea,rt as getPostsByLatest,nt as getPostsByReactions,at as getPostsByTags,it as getPostsByUser,$ as parsePostOptions,ut as updatePost};
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgeyBwYXJzZU51bSB9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtcbiAgICBjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJcbn0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQgeyBhcWwgfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQgeyBBcWxRdWVyeSB9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7IHBhcnNlUG9zdCB9IGZyb20gJy4uL2FkYXB0ZXJzL3Bvc3RBZGFwdGVyLmpzJztcbmltcG9ydCB7IEVycm9yVHlwZXMgfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dFcnJvciwgbG9nRXhjZXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0TGltaXQsIHVzZURiIH0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0VGFncywgZ2V0VGFnc0J5TmFtZSwgdXBkYXRlVGFnc0luSXRlbSB9IGZyb20gJy4vdGFncy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgRWRnZUNvbGxlY3Rpb24gfSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IEFyYW5nb0RiTGltaXQgfSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYi50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFwaUNvbnRleHQgfSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmlsZVR5cGUgfSBmcm9tICcuLi90eXBlcy9maWxlcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBvc3RJbnB1dFR5cGUsIFBvc3RPcHRpb25zLCBQb3N0VHlwZSB9IGZyb20gJy4uL3R5cGVzL3Bvc3RzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgVGFnVHlwZSB9IGZyb20gJy4uL3R5cGVzL3RhZ3MudHlwZXMuanMnO1xuXG5jb25zdCBNQVhfQ09OVEVOVF9MRU5HVEg6IG51bWJlciA9IDEwMDAwMDtcbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdwb3N0cyc7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVBvc3RPcHRpb25zID0gKG9wdGlvbnM6IFBvc3RPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIGxhdGl0dWRlID0gMCxcbiAgICBsb25naXR1ZGUgPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdwb3N0J1xuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxhdGl0dWRlOiBwYXJzZU51bShsYXRpdHVkZSwgMzIpLFxuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdCxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSA9IFtdLCBzZXNzaW9uSWQ6IHN0cmluZyA9ICcnKSA9PlxuICAoZmllbGRzIHx8IFtdKS5yZWR1Y2UoKHNlbGVjdHM6IHtvYmplY3RzOiBzdHJpbmdbXSwgcXVlcmllczogc3RyaW5nW119LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdoYXNSc3ZwJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIGhhc1JzdnAgPSBUT19CT09MKEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicnN2cFwiICYmIHIudHlwZSA9PSBcInBvc3RzXCIgJiYgci5fZnJvbSA9PSBcInVzZXJzLyR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKSlgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ2hhc1JzdnA6aGFzUnN2cCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2lzU2F2ZWQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgaXNTYXZlZCA9IFRPX0JPT0woRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJwaW5cIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiICYmIHIuX2Zyb20gPT0gXCJ1c2Vycy8ke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgICkpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdpc1NhdmVkOmlzU2F2ZWQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncmVhY3Rpb25zOnJlYWN0aW9ucycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JzdnBDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByc3ZwQ291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInJzdnBcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncnN2cENvdW50OnJzdnBDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB2aWV3Q291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInZpZXdcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndmlld0NvdW50OnZpZXdDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgfVxuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwb3N0SWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgY29uc3Qge3R5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC50eXBlID09ICR7dHlwZX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHBgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgX2lkOiBwb3N0RG9jSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgcHJpdmFjeSA9ICdkZWZhdWx0J1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZih1c2VySWQgPT09IHNlc3Npb25JZCkge1xuICAgICAgICByZXR1cm4gcG9zdDtcbiAgICAgIH1cblxuICAgICAgaWYoZ3JvdXBJZCAmJiBwcml2YWN5ID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBGT1IgZ3JvdXAgSU4gZ3JvdXBzXG4gICAgICAgICAgRklMVEVSIGdyb3VwLl9rZXkgPT0gcC5ncm91cElkXG4gICAgICAgICAgRk9SIHUsIGUgSU4gT1VUQk9VTkQgZ3JvdXAuX2lkIGhhc0Nvbm5lY3Rpb25cbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBMRVQgcCA9IERPQ1VNRU5UKFwiJHtwb3N0RG9jSWR9XCIpXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgICAgIH1cblxuICAgICAgaWYocHJpdmFjeUFxbFFyeSkge1xuICAgICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkocHJpdmFjeUFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuXG4vLyBleHBvcnQgY29uc3QgZ2V0UG9zdExpc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4vLyAgIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUFwcCc7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuLy8gICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuLy8gICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAke2xpbWl0LmFxbH1cbi8vICAgICBTT1JUIHAuYWRkZWRcbi8vICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuLy8gICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgdGhyb3cgZXJyb3I7XG4vLyAgICAgfSk7XG4vLyB9O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeUFyZWEgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGxhdGl0dWRlOiBudW1iZXIsXG4gIGxvbmdpdHVkZTogbnVtYmVyLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0c0J5QXJlYSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgYCk7XG4gIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcblxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50SWQgPT0gbnVsbFxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgZGlzdGFuY2UsIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbi8vIGV4cG9ydCBjb25zdCBnZXRQb3N0c0J5R3JvdXAgPSAoXG4vLyAgIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4vLyAgIGdyb3VwSWQ6IHN0cmluZyxcbi8vICAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4vLyApOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbi8vICAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5R3JvdXAnO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuXG4vLyAgIC8vIEdyb3VwIGlkXG4vLyAgIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4vLyAgIGNvbnN0IGRiID0gZGF0YWJhc2U7XG4vLyAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB1LCBnIElOIElOQk9VTkQgJHtmb3JtYXRHcm91cElkfSBoYXNHcm91cFxuLy8gICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbi8vICAgICAgIFJFVFVSTiBnYDtcblxuLy8gICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAudGhlbigoZ3JvdXBzOiBHcm91cFR5cGVbXSA9IFtdKSA9PiB7XG4vLyAgICAgICBpZihncm91cHMubGVuZ3RoKSB7XG4vLyAgICAgICAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICAgICAgICBjb25zdCBwb3N0QXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbi8vICAgICAgICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAuZ3JvdXBJZCA9PSBcIiR7Zm9ybWF0R3JvdXBJZH1cIiAmJiBwLnBhcmVudCA9PSBudWxsXG4vLyAgICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuLy8gICAgICAgICAgICR7bGltaXQuYXFsfVxuLy8gICAgICAgICAgIFNPUlQgcC5hZGRlZFxuLy8gICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4vLyAgICAgICAgIHJldHVybiBkYi5xdWVyeShwb3N0QXFsUXJ5KVxuLy8gICAgICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4vLyAgICAgICAgICAgfSk7XG4vLyAgICAgICB9XG5cbi8vICAgICAgIHJldHVybiBbXTtcbi8vICAgICB9KVxuLy8gICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4vLyAgICAgICB0aHJvdyBlcnJvcjtcbi8vICAgICB9KTtcbi8vIH07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5TGF0ZXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlMYXRlc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50ID09IG51bGxcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5UmVhY3Rpb25zID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGF0aXR1ZGUsIGxpbWl0LCBsb25naXR1ZGUsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShyZWFjdGlvbnMubWFwKChyZWFjdGlvbikgPT4gcGFyc2VDaGFyKHJlYWN0aW9uLCAzMikudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBzb3J0Qnk6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW2BwLnR5cGUgPT0gXCIke3R5cGV9XCJgLCAncC5wcml2YWN5ID09IFwicHVibGljXCInXTtcbiAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbiAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuXG4gIGlmKGZvcm1hdExhdGl0dWRlICYmIGZvcm1hdExvbmdpdHVkZSkge1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbiAgICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICAgIGApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcbiAgICBzb3J0QnkucHVzaCgnZGlzdGFuY2UnKTtcbiAgfVxuXG4gIGlmKHJlYWN0aW9ucy5sZW5ndGgpIHtcbiAgICBzb3J0QnkucHVzaCgnbWF0Y2hlZFRhZ3MgREVTQycpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIG1hdGNoZWRSZWFjdGlvbnMgPSBMRU5HVEgoXG4gICAgICBGT1IgbXIgSU4gcmVhY3Rpb25zXG4gICAgICBGSUxURVIgbXIubWF0Y2hlZCA9PSB0cnVlXG4gICAgICBSRVRVUk4gbXJcbiAgICApYCk7XG4gICAgc2VsZWN0T2JqZWN0cy5wdXNoKCdtYXRjaGVkUmVhY3Rpb25zOm1hdGNoZWRSZWFjdGlvbnMnKTtcbiAgICBmaWx0ZXJzLnB1c2goJ21hdGNoZWRSZWFjdGlvbnMgPiAwJyk7XG4gIH1cblxuICBzb3J0QnkucHVzaCgncC5hZGRlZCBERVNDJyk7XG4gIHNlbGVjdE9iamVjdHMucHVzaCgncmVhY3Rpb25zOnJlYWN0aW9ucycpO1xuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAsIHIgSU4gT1VUQk9VTkQgXCIke2Zvcm1hdFNlc3Npb25JZH1cIiBoYXNSZWFjdGlvblxuICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICBGT1IgcmVhY3Rpb24sIGhyIElOIDEuLjEgSU5CT1VORCBwIGlzVGFnZ2VkXG4gICAgICBMRVQgbWF0Y2hlZCA9IExFTkdUSCgke2Zvcm1hdFJlYWN0aW9uc30pID4gMCAmJiBQT1NJVElPTigke2Zvcm1hdFJlYWN0aW9uc30sIHJlYWN0aW9uLm5hbWUpXG4gICAgICBTT1JUIHJlYWN0aW9uLm5hbWVcbiAgICAgIFJFVFVSTiBNRVJHRShyZWFjdGlvbiwge21hdGNoZWQ6bWF0Y2hlZH0pXG4gICAgKVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeVRhZ3MnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGF0aXR1ZGUsIGxpbWl0LCBsb25naXR1ZGUsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgZm9ybWF0VGFnTmFtZXM6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRhZ3MubWFwKCh0YWcpID0+IHBhcnNlQ2hhcih0YWcsIDMyKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNvcnRCeTogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbYHAudHlwZSA9PSBcIiR7dHlwZX1cImAsICdwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiddO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG5cbiAgaWYoZm9ybWF0TGF0aXR1ZGUgJiYgZm9ybWF0TG9uZ2l0dWRlKSB7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAgICR7Zm9ybWF0TGF0aXR1ZGV9LFxuICAgICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgICBOT1RfTlVMTChwLmxvbmdpdHVkZSwgMCkpXG4gICAgYCk7XG4gICAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuICAgIHNvcnRCeS5wdXNoKCdkaXN0YW5jZScpO1xuICB9XG5cbiAgaWYodGFncy5sZW5ndGgpIHtcbiAgICBzb3J0QnkucHVzaCgnbWF0Y2hlZFRhZ3MgREVTQycpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIG1hdGNoZWRUYWdzID0gTEVOR1RIKFxuICAgICAgRk9SIHQgSU4gdGFnc1xuICAgICAgRklMVEVSIHQubWF0Y2hlZCA9PSB0cnVlXG4gICAgICBSRVRVUk4gdFxuICAgIClgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ21hdGNoZWRUYWdzOm1hdGNoZWRUYWdzJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkVGFncyA+IDAnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkIERFU0MnKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcblxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIExFVCB0YWdzID0gKFxuICAgICAgRk9SIHRhZywgaXQgSU4gMS4uMSBJTkJPVU5EIHAgaXNUYWdnZWRcbiAgICAgIExFVCBtYXRjaGVkID0gTEVOR1RIKCR7Zm9ybWF0VGFnTmFtZXN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRUYWdOYW1lc30sIHRhZy5uYW1lKVxuICAgICAgU09SVCB0YWcubmFtZVxuICAgICAgUkVUVVJOIE1FUkdFKHRhZywge21hdGNoZWQ6bWF0Y2hlZH0pXG4gICAgKVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUICR7c29ydEJ5LmpvaW4oJywgJyl9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFBvc3RUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFBvc3RUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0c0J5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0Q29tbWVudHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdElkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0Q29tbWVudHMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuXG4gIC8vIEdldCB0aGUgcGFyZW50IHBvc3QgdG8gZ2V0IHJlc3RyaWN0aW9uc1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAudHlwZSA9PSAke3R5cGV9ICYmIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBfa2V5LFxuICAgICAgICBncm91cElkLFxuICAgICAgICBwcml2YWN5ID0gJ2RlZmF1bHQnXG4gICAgICB9OiBQb3N0VHlwZSA9IHBvc3Q7XG5cbiAgICAgIC8vIFF1ZXJ5IGJhc2VkIG9uIHByaXZhY3kgbGV2ZWxcbiAgICAgIGxldCBwcml2YWN5QXFsUXJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmKGdyb3VwSWQgJiYgcHJpdmFjeSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgRk9SIHVzZXIgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgcC5wYXJlbnQgPT0gXCIke19rZXl9XCIgJiYgdXNlci5fa2V5ID09IHAudXNlcklkXG4gICAgICAgICAgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICAgIClcbiAgICAgICAgICBGT1IgZ3JvdXAgSU4gZ3JvdXBzXG4gICAgICAgICAgRklMVEVSIGdyb3VwLl9rZXkgPT0gcC5ncm91cElkXG4gICAgICAgICAgRk9SIHUsIGUgSU4gT1VUQk9VTkQgZ3JvdXAuX2lkIGhhc0Nvbm5lY3Rpb25cbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkocHJpdmFjeUFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBQb3N0VHlwZVtdKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBbXSBhcyBQb3N0VHlwZVtdO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBQb3N0VHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFBvc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb250ZW50ID0gJycsXG4gICAgZW5kRGF0ZSxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9ICcnLFxuICAgIHByaXZhY3kgPSAncHVibGljJyxcbiAgICB0YWdzID0gW10sXG4gICAgc3RhcnREYXRlLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdElucHV0VHlwZVxuKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHBvc3RJZCA9IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGluc2VydDogUG9zdFR5cGUgPSB7XG4gICAgX2lkOiBgcG9zdHMvJHtwb3N0SWR9YCxcbiAgICBfa2V5OiBwb3N0SWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCBNQVhfQ09OVEVOVF9MRU5HVEgpIHx8ICcnLFxuICAgIGVuZERhdGU6IGVuZERhdGUgPyBwYXJzZU51bShlbmREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgZ3JvdXBJZDogZ3JvdXBJZCA/IHBhcnNlSWQoZ3JvdXBJZCkgOiB1bmRlZmluZWQsXG4gICAgbGF0aXR1ZGU6IGxhdGl0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsYXRpdHVkZSkgOiB1bmRlZmluZWQsXG4gICAgbG9jYXRpb246IGxvY2F0aW9uID8gcGFyc2VTdHJpbmcobG9jYXRpb24sIDE2MCkgOiB1bmRlZmluZWQsXG4gICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlTnVtKGxvbmdpdHVkZSkgOiB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBuYW1lOiBwYXJzZVN0cmluZyhuYW1lLCAxNjApLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlSWQocGFyZW50SWQpIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHBhcnNlVmFyQ2hhcihwcml2YWN5LCAxNiksXG4gICAgc3RhcnREYXRlOiBzdGFydERhdGUgPyBwYXJzZU51bShzdGFydERhdGUsIDEzKSA6IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkUG9zdDogUG9zdFR5cGUgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgICBjb25zdCB7X2lkOiBwb3N0RG9jSWR9ID0gc2F2ZWRQb3N0O1xuICAgIGNvbnN0IGNvbnRlbnRUYWdOYW1lcyA9IGF3YWl0IGV4dHJhY3RUYWdzKGluc2VydC5jb250ZW50IHx8ICcnKTtcblxuICAgIGlmKHRhZ3MubGVuZ3RoIHx8IGNvbnRlbnRUYWdOYW1lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVzZXJUYWdzID0gKGF3YWl0IGdldFRhZ3NCeU5hbWUoY29udGV4dCwgdGFncy5tYXAoKHtuYW1lfSkgPT4gbmFtZSB8fCAnJykpKVxuICAgICAgICAubWFwKCh0YWcpID0+ICh7Li4udGFnLCB0YWdCeTogc2Vzc2lvbklkfSkpO1xuICAgICAgY29uc3QgY29udGVudFRhZ3MgPSAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCBjb250ZW50VGFnTmFtZXMgfHwgW10pKVxuICAgICAgICAubWFwKCh0YWcpID0+ICh7Li4udGFnLCB0YWdCeTogJ2V4dHJhY3QnfSkpO1xuICAgICAgY29uc3QgdXBkYXRlZFRhZ3M6IFRhZ1R5cGVbXSA9IGF3YWl0IHVwZGF0ZVRhZ3NJbkl0ZW0oXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHtcbiAgICAgICAgICBpdGVtRG9jSWQ6IHBvc3REb2NJZCxcbiAgICAgICAgICB0YWdzOiBbLi4uY29udGVudFRhZ3MsIC4uLnVzZXJUYWdzXVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zYXZlZFBvc3QsXG4gICAgICAgIHRhZ3M6IHVwZGF0ZWRUYWdzXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzYXZlZFBvc3Q7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVBvc3QgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdDogUG9zdElucHV0VHlwZSk6IFByb21pc2U8UG9zdFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAndXBkYXRlUG9zdCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IHBhcnNlZFBvc3QgPSBwYXJzZVBvc3QocG9zdCk7XG4gIGNvbnN0IHtcbiAgICBwb3N0SWQsXG4gICAgdGFncyA9IFtdXG4gIH0gPSBwYXJzZWRQb3N0O1xuXG4gIGNvbnN0IHVwZGF0ZTogUG9zdFR5cGUgPSB7XG4gICAgLi4ucGFyc2VkUG9zdCxcbiAgICBtb2RpZmllZDogbm93XG4gIH07XG5cbiAgaWYoIXBvc3RJZCkge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfSURcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGluc2VydCA9IHtcbiAgICAuLi51cGRhdGUsXG4gICAgX2tleTogcG9zdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge19rZXk6ICR7cG9zdElkfSwgdXNlcklkOiAke3Nlc3Npb25JZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRQb3N0OiBQb3N0VHlwZSA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSlcbiAgICAgIC5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCB7fSkpO1xuICAgIGNvbnN0IHtfaWQ6IHVwZGF0ZWRQb3N0SWR9ID0gdXBkYXRlZFBvc3Q7XG4gICAgY29uc3QgY29udGVudFRhZ05hbWVzID0gYXdhaXQgZXh0cmFjdFRhZ3MoaW5zZXJ0LmNvbnRlbnQgfHwgJycpO1xuXG4gICAgaWYodGFncz8ubGVuZ3RoIHx8IGNvbnRlbnRUYWdOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1c2VyVGFncyA9IHRhZ3M/Lmxlbmd0aCA/IChhd2FpdCBnZXRUYWdzQnlOYW1lKGNvbnRleHQsIHRhZ3MubWFwKCh7bmFtZX0pID0+IG5hbWUgfHwgJycpKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6IHNlc3Npb25JZH0pKSA6IFtdO1xuICAgICAgY29uc3QgY29udGVudFRhZ3MgPSBjb250ZW50VGFnTmFtZXM/Lmxlbmd0aCA/IChhd2FpdCBnZXRUYWdzQnlOYW1lKGNvbnRleHQsIGNvbnRlbnRUYWdOYW1lcyB8fCBbXSkpXG4gICAgICAgIC5tYXAoKHRhZykgPT4gKHsuLi50YWcsIHRhZ0J5OiAnZXh0cmFjdCd9KSkgOiBbXTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUYWdzOiBUYWdUeXBlW10gPSBhd2FpdCB1cGRhdGVUYWdzSW5JdGVtKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgaXRlbURvY0lkOiB1cGRhdGVkUG9zdElkLFxuICAgICAgICAgIHRhZ3M6IFsuLi5jb250ZW50VGFncywgLi4udXNlclRhZ3NdXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVwZGF0ZWRQb3N0LFxuICAgICAgICB0YWdzOiB1cGRhdGVkVGFnc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZFBvc3Q7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVBvc3QgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdERvY0lkOiBzdHJpbmcpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZVBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UG9zdElkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKHBvc3REb2NJZCk7XG5cbiAgaWYoIWZvcm1hdFBvc3RJZCkge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfSURcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gIEZJTFRFUiB0Ll90byA9PSAke2Zvcm1hdFBvc3RJZH1cbiAgUkVNT1ZFIHQgSU4gaXNUYWdnZWRgO1xuXG4gIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoZWRnZUFxbFFyeSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG5cbiAgY29uc3QgZmlsZUFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGYgSU4gaGFzRmlsZVxuICAgIEZJTFRFUiBmLl90byA9PSAke2Zvcm1hdFBvc3RJZH1cbiAgICBSRU1PVkUgZiBJTiBoYXNGaWxlYDtcblxuICBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGZpbGVBcWxRcnkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuX2lkID09ICR7Zm9ybWF0UG9zdElkfSAmJiBwLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFTU9WRSBwIElOIHBvc3RzXG4gICAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdEVkZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHBvc3REb2NJZDogc3RyaW5nLFxuICBpdGVtRG9jSWQ6IHN0cmluZyxcbiAgZWRnZVR5cGU6IHN0cmluZyA9ICdpc1Bvc3RlZCcsXG4gIHByb3BzID0ge31cbik6IFByb21pc2U8RmlsZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2NyZWF0ZVBvc3RFZGdlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oZWRnZVR5cGUpO1xuICBjb25zdCBmb3JtYXRQb3N0SWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQocG9zdERvY0lkKTtcbiAgY29uc3QgZm9ybWF0RG9jSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbURvY0lkKTtcblxuICBpZighZm9ybWF0RG9jSWQgfHwgIWZvcm1hdFBvc3RJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfSUQpO1xuICB9XG5cbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBwb3N0RWRnZS0ke2Zvcm1hdFBvc3RJZH0tJHtmb3JtYXREb2NJZH1gKTtcbiAgY29uc3QgZWRnZSA9IHtcbiAgICBfZnJvbTogZm9ybWF0UG9zdElkLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGZvcm1hdERvY0lkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIC4uLnByb3BzXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFTLFlBQUFBLE1BQWdCLCtCQUN6QixPQUNJLGNBQUFDLEVBQVksaUJBQUFDLEVBQWUsYUFBQUMsRUFBVyxXQUFBQyxFQUFTLGVBQUFDLEVBQWEsZ0JBQUFDLE1BQ3pELCtCQUNQLE9BQVMsT0FBQUMsTUFBVyxXQUdwQixPQUFTLGFBQUFDLE1BQWlCLDZCQUMxQixPQUFTLGNBQUFDLE1BQWtCLDBCQUMzQixPQUFTLFlBQUFDLEVBQVUsZ0JBQUFDLE1BQW9CLDZCQUN2QyxPQUFTLFlBQUFDLEVBQVUsU0FBQUMsTUFBYSw0QkFDaEMsT0FBUyxlQUFBQyxFQUFhLGlCQUFBQyxFQUFlLG9CQUFBQyxNQUF3QixZQVM3RCxNQUFNQyxFQUE2QixJQUM3QkMsRUFBd0IsUUFFakJDLEVBQW1CLENBQUNDLEVBQXVCLENBQUMsSUFBTSxDQUM3RCxLQUFNLENBQ0osS0FBQUMsRUFBTyxFQUNQLFNBQUFDLEVBQVcsRUFDWCxVQUFBQyxFQUFZLEVBQ1osR0FBQUMsRUFBSyxHQUNMLEtBQUFDLEVBQU8sTUFDVCxFQUFJTCxFQUVKLE1BQU8sQ0FDTCxTQUFVcEIsRUFBU3NCLEVBQVUsRUFBRSxFQUMvQixNQUFPVixFQUFTUyxFQUFNRyxDQUFFLEVBQ3hCLFVBQVd4QixFQUFTdUIsRUFBVyxFQUFFLEVBQ2pDLEtBQU1wQixFQUFVc0IsRUFBTSxFQUFFLENBQzFCLENBQ0YsRUFFYUMsRUFBa0IsQ0FBQ0MsRUFBbUIsQ0FBQyxFQUFHQyxFQUFvQixNQUN4RUQsR0FBVSxDQUFDLEdBQUcsT0FBTyxDQUFDRSxFQUFpREMsSUFBa0IsQ0FDeEYsT0FBT0EsRUFBTyxDQUNaLElBQUssVUFDSCxPQUFBRCxFQUFRLFFBQVEsS0FBSztBQUFBO0FBQUEsOEVBRWlERCxDQUFTO0FBQUE7QUFBQTtBQUFBLFdBRzVFLEVBQ0hD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QixFQUNBLFNBQVVoQixFQUNWLE1BQU9ULEVBQVcsY0FDcEIsRUFBR3VDLEVBQU9oQixDQUFPLENBQ25CLENBQUMsQ0FDTCIsCiAgIm5hbWVzIjogWyJwYXJzZU51bSIsICJjcmVhdGVIYXNoIiwgInBhcnNlQXJhbmdvSWQiLCAicGFyc2VDaGFyIiwgInBhcnNlSWQiLCAicGFyc2VTdHJpbmciLCAicGFyc2VWYXJDaGFyIiwgImFxbCIsICJwYXJzZVBvc3QiLCAiRXJyb3JUeXBlcyIsICJsb2dFcnJvciIsICJsb2dFeGNlcHRpb24iLCAiZ2V0TGltaXQiLCAidXNlRGIiLCAiZXh0cmFjdFRhZ3MiLCAiZ2V0VGFnc0J5TmFtZSIsICJ1cGRhdGVUYWdzSW5JdGVtIiwgIk1BWF9DT05URU5UX0xFTkdUSCIsICJldmVudENhdGVnb3J5IiwgInBhcnNlUG9zdE9wdGlvbnMiLCAib3B0aW9ucyIsICJmcm9tIiwgImxhdGl0dWRlIiwgImxvbmdpdHVkZSIsICJ0byIsICJ0eXBlIiwgImdldFBvc3RPcHRpb25hbCIsICJmaWVsZHMiLCAic2Vzc2lvbklkIiwgInNlbGVjdHMiLCAiZmllbGQiLCAiZ2V0UG9zdCIsICJjb250ZXh0IiwgInBvc3RJZCIsICJhY3Rpb24iLCAiZGF0YWJhc2VOYW1lIiwgImZvcm1hdEl0ZW1JZCIsICJkYXRhYmFzZSIsICJzZWxlY3RPYmplY3RzIiwgInNlbGVjdFF1ZXJpZXMiLCAiYXFsUXJ5IiwgImN1cnNvciIsICJwb3N0IiwgInBvc3REb2NJZCIsICJ1c2VySWQiLCAiZ3JvdXBJZCIsICJwcml2YWN5IiwgInByaXZhY3lBcWxRcnkiLCAiZXJyb3IiLCAiZ2V0UG9zdHNCeUFyZWEiLCAibGltaXQiLCAiZm9ybWF0TGF0aXR1ZGUiLCAiZm9ybWF0TG9uZ2l0dWRlIiwgImdldFBvc3RzQnlMYXRlc3QiLCAiZ2V0UG9zdHNCeVJlYWN0aW9ucyIsICJyZWFjdGlvbnMiLCAiZm9ybWF0U2Vzc2lvbklkIiwgImZvcm1hdFJlYWN0aW9ucyIsICJyZWFjdGlvbiIsICJzb3J0QnkiLCAiZmlsdGVycyIsICJnZXRQb3N0c0J5VGFncyIsICJ0YWdzIiwgImZvcm1hdFRhZ05hbWVzIiwgInRhZyIsICJnZXRQb3N0c0J5VXNlciIsICJmb3JtYXRVc2VySWQiLCAiZ2V0UG9zdENvbW1lbnRzIiwgIl9rZXkiLCAiYWRkUG9zdCIsICJjb250ZW50IiwgImVuZERhdGUiLCAibG9jYXRpb24iLCAibmFtZSIsICJwYXJlbnRJZCIsICJzdGFydERhdGUiLCAibm93IiwgImluc2VydCIsICJzYXZlZFBvc3QiLCAiY29udGVudFRhZ05hbWVzIiwgInVzZXJUYWdzIiwgImNvbnRlbnRUYWdzIiwgInVwZGF0ZWRUYWdzIiwgInVwZGF0ZVBvc3QiLCAicGFyc2VkUG9zdCIsICJ1cGRhdGUiLCAidXBkYXRlZFBvc3QiLCAidXBkYXRlZFBvc3RJZCIsICJkZWxldGVQb3N0IiwgImZvcm1hdFBvc3RJZCIsICJlZGdlQXFsUXJ5IiwgImZpbGVBcWxRcnkiLCAiY3JlYXRlUG9zdEVkZ2UiLCAiaXRlbURvY0lkIiwgImVkZ2VUeXBlIiwgInByb3BzIiwgImVkZ2VDb2xsZWN0aW9uIiwgImZvcm1hdERvY0lkIiwgImVkZ2VJZCIsICJlZGdlIl0KfQo=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ApiContext } from '../types/auth.types.js';
|
|
2
|
+
import type { ProfileType } from '../types/profiles.types.js';
|
|
3
|
+
export declare const addProfile: (context: ApiContext, profile: ProfileType) => Promise<ProfileType>;
|
|
4
|
+
export declare const updateProfile: (context: ApiContext, profile: ProfileType) => Promise<ProfileType>;
|
package/lib/actions/profiles.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{createHash as U,parseChar as E,parseId as q,parseVarChar as e}from"@nlabs/utils";import{aql as A}from"arangojs";import{useDb as I}from"../utils/arangodbUtils";const R=(N,n)=>{const{databaseName:P}=N,{city:d,country:t,street1:i,street2:r,zip:f,state:u,timezone:
|
|
1
|
+
import{createHash as U,parseChar as E,parseId as q,parseVarChar as e}from"@nlabs/utils/parsers/strings";import{aql as A}from"arangojs";import{useDb as I}from"../utils/arangodbUtils.js";const R=(N,n)=>{const{databaseName:P}=N,{city:d,country:t,street1:i,street2:r,zip:f,state:u,timezone:s,firstName:o,lastName:a,gender:p,name:m,userId:y}=n,l={city:d!==void 0?e(d,32):void 0,country:t!==void 0?e(t,32):void 0,firstName:o!==void 0?e(o,32):void 0,gender:p!==void 0?E(p,1).toUpperCase():void 0,lastName:a!==void 0?e(a,32):void 0,modified:Date.now(),name:m!==void 0?e(m,32):void 0,state:u!==void 0?e(u,2):void 0,street1:i!==void 0?e(i,32):void 0,street2:r!==void 0?e(r,32):void 0,timezone:s!==void 0?e(s,32):void 0,zip:f!==void 0?e(f,15):void 0},c={...l,_key:U(y),added:Date.now(),userId:q(y)},T=A`UPSERT {sub: ${c._key}}
|
|
2
2
|
INSERT ${c}
|
|
3
3
|
UPDATE ${l}
|
|
4
|
-
IN profiles RETURN NEW`;return I(P).query(T).then(z=>z.next())}
|
|
4
|
+
IN profiles RETURN NEW`;return I(P).query(T).then(z=>z.next())},h=(N,n)=>{const{databaseName:P}=N,{city:d,country:t,street1:i,street2:r,zip:f,state:u,timezone:s,firstName:o,lastName:a,gender:p,name:m,userId:y}=n,l={city:d!==void 0?e(d,32):void 0,country:t!==void 0?e(t,32):void 0,firstName:o!==void 0?e(o,32):void 0,gender:p!==void 0?E(p,1).toUpperCase():void 0,lastName:a!==void 0?e(a,32):void 0,modified:Date.now(),name:m!==void 0?e(m,32):void 0,state:u!==void 0?e(u,2):void 0,street1:i!==void 0?e(i,32):void 0,street2:r!==void 0?e(r,32):void 0,timezone:s!==void 0?e(s,32):void 0,userId:y!==void 0?q(y):void 0,zip:f!==void 0?e(f,15):void 0},c=A`UPDATE {sub: ${n._key}}
|
|
5
5
|
INSERT ${n}
|
|
6
6
|
UPDATE ${l}
|
|
7
|
-
IN profiles RETURN NEW`;return I(P).query(c).then(T=>T.next())};export{R as addProfile
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
IN profiles RETURN NEW`;return I(P).query(c).then(T=>T.next())};export{R as addProfile,h as updateProfile};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcHJvZmlsZXMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VDaGFyLCBwYXJzZUlkLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcblxuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtQcm9maWxlVHlwZX0gZnJvbSAnLi4vdHlwZXMvcHJvZmlsZXMudHlwZXMuanMnO1xuXG5leHBvcnQgY29uc3QgYWRkUHJvZmlsZSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwcm9maWxlOiBQcm9maWxlVHlwZSk6IFByb21pc2U8UHJvZmlsZVR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgY2l0eSxcbiAgICBjb3VudHJ5LFxuICAgIHN0cmVldDEsXG4gICAgc3RyZWV0MixcbiAgICB6aXAsXG4gICAgc3RhdGUsXG4gICAgdGltZXpvbmUsXG4gICAgZmlyc3ROYW1lLFxuICAgIGxhc3ROYW1lLFxuICAgIGdlbmRlcixcbiAgICBuYW1lLFxuICAgIHVzZXJJZFxuICB9ID0gcHJvZmlsZTtcblxuICBjb25zdCB1cGRhdGU6IFByb2ZpbGVUeXBlID0ge1xuICAgIGNpdHk6IGNpdHkgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihjaXR5LCAzMikgOiB1bmRlZmluZWQsXG4gICAgY291bnRyeTogY291bnRyeSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKGNvdW50cnksIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBmaXJzdE5hbWU6IGZpcnN0TmFtZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKGZpcnN0TmFtZSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIGdlbmRlcjogZ2VuZGVyICE9PSB1bmRlZmluZWQgPyBwYXJzZUNoYXIoZ2VuZGVyLCAxKS50b1VwcGVyQ2FzZSgpIDogdW5kZWZpbmVkLFxuICAgIGxhc3ROYW1lOiBsYXN0TmFtZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKGxhc3ROYW1lLCAzMikgOiB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IERhdGUubm93KCksXG4gICAgbmFtZTogbmFtZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKG5hbWUsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogc3RhdGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihzdGF0ZSwgMikgOiB1bmRlZmluZWQsXG4gICAgc3RyZWV0MTogc3RyZWV0MSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKHN0cmVldDEsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBzdHJlZXQyOiBzdHJlZXQyICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoc3RyZWV0MiwgMzIpIDogdW5kZWZpbmVkLFxuICAgIHRpbWV6b25lOiB0aW1lem9uZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKHRpbWV6b25lLCAzMikgOiB1bmRlZmluZWQsXG4gICAgemlwOiB6aXAgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcih6aXAsIDE1KSA6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGNvbnN0IGluc2VydDogUHJvZmlsZVR5cGUgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2godXNlcklkKSxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICB1c2VySWQ6IHBhcnNlSWQodXNlcklkKVxuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtzdWI6ICR7aW5zZXJ0Ll9rZXl9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gcHJvZmlsZXMgUkVUVVJOIE5FV2A7XG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVQcm9maWxlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHByb2ZpbGU6IFByb2ZpbGVUeXBlKTogUHJvbWlzZTxQcm9maWxlVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjaXR5LFxuICAgIGNvdW50cnksXG4gICAgc3RyZWV0MSxcbiAgICBzdHJlZXQyLFxuICAgIHppcCxcbiAgICBzdGF0ZSxcbiAgICB0aW1lem9uZSxcbiAgICBmaXJzdE5hbWUsXG4gICAgbGFzdE5hbWUsXG4gICAgZ2VuZGVyLFxuICAgIG5hbWUsXG4gICAgdXNlcklkXG4gIH0gPSBwcm9maWxlO1xuXG4gIGNvbnN0IHVwZGF0ZTogUHJvZmlsZVR5cGUgPSB7XG4gICAgY2l0eTogY2l0eSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKGNpdHksIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBjb3VudHJ5OiBjb3VudHJ5ICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoY291bnRyeSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIGZpcnN0TmFtZTogZmlyc3ROYW1lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoZmlyc3ROYW1lLCAzMikgOiB1bmRlZmluZWQsXG4gICAgZ2VuZGVyOiBnZW5kZXIgIT09IHVuZGVmaW5lZCA/IHBhcnNlQ2hhcihnZW5kZXIsIDEpLnRvVXBwZXJDYXNlKCkgOiB1bmRlZmluZWQsXG4gICAgbGFzdE5hbWU6IGxhc3ROYW1lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIobGFzdE5hbWUsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBuYW1lOiBuYW1lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIobmFtZSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBzdGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKHN0YXRlLCAyKSA6IHVuZGVmaW5lZCxcbiAgICBzdHJlZXQxOiBzdHJlZXQxICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoc3RyZWV0MSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIHN0cmVldDI6IHN0cmVldDIgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihzdHJlZXQyLCAzMikgOiB1bmRlZmluZWQsXG4gICAgdGltZXpvbmU6IHRpbWV6b25lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIodGltZXpvbmUsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICB1c2VySWQ6IHVzZXJJZCAhPT0gdW5kZWZpbmVkID8gcGFyc2VJZCh1c2VySWQpIDogdW5kZWZpbmVkLFxuICAgIHppcDogemlwICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoemlwLCAxNSkgOiB1bmRlZmluZWRcbiAgfTtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSB7c3ViOiAke3Byb2ZpbGUuX2tleX19XG4gICAgSU5TRVJUICR7cHJvZmlsZX1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gcHJvZmlsZXMgUkVUVVJOIE5FV2A7XG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsT0FBUSxjQUFBQSxFQUFZLGFBQUFDLEVBQVcsV0FBQUMsRUFBUyxnQkFBQUMsTUFBbUIsK0JBQzNELE9BQVEsT0FBQUMsTUFB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RUFBSyxFQUFFLEVBQUksTUFDbkQsRUFFTVUsRUFBbUJwQixpQkFBbUJJLEVBQVEsSUFBSTtBQUFBLGFBQzdDQSxDQUFPO0FBQUEsYUFDUGMsQ0FBTTtBQUFBLDRCQUVqQixPQUFPakIsRUFBTUksQ0FBWSxFQUFFLE1BQU1lLENBQU0sRUFBRSxLQUFNQyxHQUFXQSxFQUFPLEtBQUssQ0FBQyxDQUN6RSIsCiAgIm5hbWVzIjogWyJjcmVhdGVIYXNoIiwgInBhcnNlQ2hhciIsICJwYXJzZUlkIiwgInBhcnNlVmFyQ2hhciIsICJhcWwiLCAidXNlRGIiLCAiYWRkUHJvZmlsZSIsICJjb250ZXh0IiwgInByb2ZpbGUiLCAiZGF0YWJhc2VOYW1lIiwgImNpdHkiLCAiY291bnRyeSIsICJzdHJlZXQxIiwgInN0cmVldDIiLCAiemlwIiwgInN0YXRlIiwgInRpbWV6b25lIiwgImZpcnN0TmFtZSIsICJsYXN0TmFtZSIsICJnZW5kZXIiLCAibmFtZSIsICJ1c2VySWQiLCAidXBkYXRlIiwgImluc2VydCIsICJhcWxRcnkiLCAiY3Vyc29yIiwgInVwZGF0ZVByb2ZpbGUiXQp9Cg==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ArangoDbCollection, ArangoDbLimit } from '../types/arangodb.types.js';
|
|
2
|
+
import type { ApiContext } from '../types/auth.types.js';
|
|
3
|
+
import type { UserReactionQuery, UserType } from '../types/users.types.js';
|
|
4
|
+
export type ReactionDirection = 'INBOUND' | 'OUTBOUND';
|
|
5
|
+
export interface Reaction {
|
|
6
|
+
readonly _from?: string;
|
|
7
|
+
readonly _key?: string;
|
|
8
|
+
readonly _to?: string;
|
|
9
|
+
readonly added?: number;
|
|
10
|
+
readonly count?: number;
|
|
11
|
+
readonly id?: string;
|
|
12
|
+
readonly name?: string;
|
|
13
|
+
readonly type?: ArangoDbCollection;
|
|
14
|
+
readonly value?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ReactionOptions {
|
|
17
|
+
readonly from?: number;
|
|
18
|
+
readonly to?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare const parseReactionOptions: (options?: ReactionOptions) => {
|
|
21
|
+
limit: ArangoDbLimit;
|
|
22
|
+
};
|
|
23
|
+
export declare const addReaction: (context: ApiContext, itemId: string, reaction?: Reaction, allowDuplicate?: boolean) => Promise<Reaction>;
|
|
24
|
+
export declare const deleteReaction: (context: ApiContext, reactionId: string) => Promise<Reaction>;
|
|
25
|
+
export declare const deleteReactionByItem: (context: ApiContext, itemId: string, reactionName: string) => Promise<Reaction>;
|
|
26
|
+
export declare const updateReaction: (context: ApiContext, reaction?: Reaction) => Promise<Reaction>;
|
|
27
|
+
export declare const getReactionCount: (context: ApiContext, itemId: string, reactionName: string) => Promise<Reaction>;
|
|
28
|
+
export declare const getReactionCountByUser: (context: ApiContext, itemId: string, itemType: string, reactionName: string) => Promise<Reaction[]>;
|
|
29
|
+
export declare const getGroupUsersByReaction: (context: ApiContext, params?: UserReactionQuery) => Promise<UserType[]>;
|
|
30
|
+
export declare const getReactionsByItem: (context: ApiContext, itemId: string, reactionName: string, options: ReactionOptions) => Promise<UserType[]>;
|
|
31
|
+
export declare const getItemsByReaction: (context: ApiContext, itemId: string, reactionName: string, options: ReactionOptions) => Promise<Reaction[]>;
|
|
32
|
+
export declare const hasReaction: (context: ApiContext, itemId: string, reactionName: string, direction?: ReactionDirection) => Promise<boolean>;
|