@nlabs/reaktor 0.10.5 → 0.10.7
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/lib/actions/apps.d.ts +1 -0
- package/lib/actions/apps.d.ts.map +1 -0
- package/lib/actions/apps.js +221 -0
- package/lib/actions/connections.d.ts +1 -0
- package/lib/actions/connections.d.ts.map +1 -0
- package/lib/actions/connections.js +62 -0
- package/lib/actions/content.d.ts +1 -0
- package/lib/actions/content.d.ts.map +1 -0
- package/lib/actions/content.js +240 -0
- package/lib/actions/conversations.d.ts +1 -0
- package/lib/actions/conversations.d.ts.map +1 -0
- package/lib/actions/conversations.js +335 -0
- package/lib/actions/dynamodb.d.ts +1 -0
- package/lib/actions/dynamodb.d.ts.map +1 -0
- package/lib/actions/dynamodb.js +119 -0
- package/lib/actions/email.d.ts +1 -0
- package/lib/actions/email.d.ts.map +1 -0
- package/lib/actions/email.js +56 -0
- package/lib/actions/files.d.ts +1 -0
- package/lib/actions/files.d.ts.map +1 -0
- package/lib/actions/files.js +226 -0
- package/lib/actions/groups.d.ts +1 -0
- package/lib/actions/groups.d.ts.map +1 -0
- package/lib/actions/groups.js +267 -0
- package/lib/actions/images.d.ts +1 -0
- package/lib/actions/images.d.ts.map +1 -0
- package/lib/actions/images.js +723 -0
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +29 -0
- package/lib/actions/ios.d.ts +1 -0
- package/lib/actions/ios.d.ts.map +1 -0
- package/lib/actions/ios.js +230 -0
- package/lib/actions/locations.d.ts +1 -0
- package/lib/actions/locations.d.ts.map +1 -0
- package/lib/actions/locations.js +111 -0
- package/lib/actions/messages.d.ts +1 -0
- package/lib/actions/messages.d.ts.map +1 -0
- package/lib/actions/messages.js +167 -0
- package/lib/actions/notifications.d.ts +3 -2
- package/lib/actions/notifications.d.ts.map +1 -0
- package/lib/actions/notifications.js +37 -0
- package/lib/actions/payments.d.ts +1 -0
- package/lib/actions/payments.d.ts.map +1 -0
- package/lib/actions/payments.js +449 -0
- package/lib/actions/posts.d.ts +1 -0
- package/lib/actions/posts.d.ts.map +1 -0
- package/lib/actions/posts.js +608 -0
- package/lib/actions/profiles.d.ts +1 -0
- package/lib/actions/profiles.d.ts.map +1 -0
- package/lib/actions/profiles.js +58 -0
- package/lib/actions/reactions.d.ts +1 -0
- package/lib/actions/reactions.d.ts.map +1 -0
- package/lib/actions/reactions.js +286 -0
- package/lib/actions/s3.d.ts +1 -0
- package/lib/actions/s3.d.ts.map +1 -0
- package/lib/actions/s3.js +102 -0
- package/lib/actions/search.d.ts +1 -0
- package/lib/actions/search.d.ts.map +1 -0
- package/lib/actions/search.js +81 -0
- package/lib/actions/sms.d.ts +1 -0
- package/lib/actions/sms.d.ts.map +1 -0
- package/lib/actions/sms.js +52 -0
- package/lib/actions/statistics.d.ts +1 -0
- package/lib/actions/statistics.d.ts.map +1 -0
- package/lib/actions/statistics.js +43 -0
- package/lib/actions/subscriptions.d.ts +1 -0
- package/lib/actions/subscriptions.d.ts.map +1 -0
- package/lib/actions/subscriptions.js +202 -0
- package/lib/actions/tags.d.ts +1 -0
- package/lib/actions/tags.d.ts.map +1 -0
- package/lib/actions/tags.js +263 -0
- package/lib/actions/users.d.ts +1 -0
- package/lib/actions/users.d.ts.map +1 -0
- package/lib/actions/users.js +802 -0
- package/lib/actions/videos.d.ts +1 -0
- package/lib/actions/videos.d.ts.map +1 -0
- package/lib/actions/videos.js +423 -0
- package/lib/actions/websockets.d.ts +1 -0
- package/lib/actions/websockets.d.ts.map +1 -0
- package/lib/actions/websockets.js +164 -0
- package/lib/adapters/arangoAdapter.d.ts +1 -0
- package/lib/adapters/arangoAdapter.d.ts.map +1 -0
- package/lib/adapters/arangoAdapter.js +70 -0
- package/lib/adapters/contentAdapter.d.ts +1 -0
- package/lib/adapters/contentAdapter.d.ts.map +1 -0
- package/lib/adapters/contentAdapter.js +108 -0
- package/lib/adapters/fileAdapter.d.ts +1 -0
- package/lib/adapters/fileAdapter.d.ts.map +1 -0
- package/lib/adapters/fileAdapter.js +119 -0
- package/lib/adapters/imageAdapter.d.ts +1 -0
- package/lib/adapters/imageAdapter.d.ts.map +1 -0
- package/lib/adapters/imageAdapter.js +112 -0
- package/lib/adapters/index.d.ts +1 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +11 -0
- package/lib/adapters/messageAdapter.d.ts +1 -0
- package/lib/adapters/messageAdapter.d.ts.map +1 -0
- package/lib/adapters/messageAdapter.js +82 -0
- package/lib/adapters/postAdapter.d.ts +1 -0
- package/lib/adapters/postAdapter.d.ts.map +1 -0
- package/lib/adapters/postAdapter.js +117 -0
- package/lib/adapters/reaktorAdapter.d.ts +1 -0
- package/lib/adapters/reaktorAdapter.d.ts.map +1 -0
- package/lib/adapters/reaktorAdapter.js +59 -0
- package/lib/adapters/tagAdapter.d.ts +1 -0
- package/lib/adapters/tagAdapter.d.ts.map +1 -0
- package/lib/adapters/tagAdapter.js +99 -0
- package/lib/adapters/userAdapter.d.ts +1 -0
- package/lib/adapters/userAdapter.d.ts.map +1 -0
- package/lib/adapters/userAdapter.js +264 -0
- package/lib/config.d.ts +1 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +161 -0
- package/lib/handlers/graphqlHandler.d.ts +1 -0
- package/lib/handlers/graphqlHandler.d.ts.map +1 -0
- package/lib/handlers/graphqlHandler.js +118 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/lambdas/actions/websockets.d.ts +1 -0
- package/lib/lambdas/actions/websockets.d.ts.map +1 -0
- package/lib/lambdas/actions/websockets.js +105 -0
- package/lib/lambdas/authorizer.d.ts +1 -0
- package/lib/lambdas/authorizer.d.ts.map +1 -0
- package/lib/lambdas/authorizer.js +41 -0
- package/lib/lambdas/connection.d.ts +1 -0
- package/lib/lambdas/connection.d.ts.map +1 -0
- package/lib/lambdas/connection.js +85 -0
- package/lib/lambdas/utils/message.d.ts +1 -0
- package/lib/lambdas/utils/message.d.ts.map +1 -0
- package/lib/lambdas/utils/message.js +20 -0
- package/lib/lambdas/utils/websocket.d.ts +1 -0
- package/lib/lambdas/utils/websocket.d.ts.map +1 -0
- package/lib/lambdas/utils/websocket.js +78 -0
- package/lib/mocks/conversation.d.ts +1 -0
- package/lib/mocks/conversation.d.ts.map +1 -0
- package/lib/mocks/conversation.js +10 -0
- package/lib/mocks/file.d.ts +1 -0
- package/lib/mocks/file.d.ts.map +1 -0
- package/lib/mocks/file.js +13 -0
- package/lib/mocks/group.d.ts +1 -0
- package/lib/mocks/group.d.ts.map +1 -0
- package/lib/mocks/group.js +20 -0
- package/lib/mocks/image.d.ts +1 -0
- package/lib/mocks/image.d.ts.map +1 -0
- package/lib/mocks/image.js +17 -0
- package/lib/mocks/post.d.ts +1 -0
- package/lib/mocks/post.d.ts.map +1 -0
- package/lib/mocks/post.js +28 -0
- package/lib/mocks/tag.d.ts +1 -0
- package/lib/mocks/tag.d.ts.map +1 -0
- package/lib/mocks/tag.js +12 -0
- package/lib/mocks/user.d.ts +1 -0
- package/lib/mocks/user.d.ts.map +1 -0
- package/lib/mocks/user.js +61 -0
- package/lib/mocks/video.d.ts +1 -0
- package/lib/mocks/video.d.ts.map +1 -0
- package/lib/mocks/video.js +17 -0
- package/lib/mutations/content.d.ts +1 -0
- package/lib/mutations/content.d.ts.map +1 -0
- package/lib/mutations/content.js +27 -0
- package/lib/mutations/index.d.ts +1 -0
- package/lib/mutations/index.d.ts.map +1 -0
- package/lib/mutations/index.js +29 -0
- package/lib/mutations/locations.d.ts +1 -0
- package/lib/mutations/locations.d.ts.map +1 -0
- package/lib/mutations/locations.js +22 -0
- package/lib/mutations/messages.d.ts +1 -0
- package/lib/mutations/messages.d.ts.map +1 -0
- package/lib/mutations/messages.js +75 -0
- package/lib/mutations/posts.d.ts +1 -0
- package/lib/mutations/posts.d.ts.map +1 -0
- package/lib/mutations/posts.js +31 -0
- package/lib/mutations/profiles.d.ts +1 -0
- package/lib/mutations/profiles.d.ts.map +1 -0
- package/lib/mutations/profiles.js +78 -0
- package/lib/mutations/reactions.d.ts +1 -0
- package/lib/mutations/reactions.d.ts.map +1 -0
- package/lib/mutations/reactions.js +29 -0
- package/lib/mutations/statistics.d.ts +1 -0
- package/lib/mutations/statistics.d.ts.map +1 -0
- package/lib/mutations/statistics.js +17 -0
- package/lib/mutations/subscriptions.d.ts +1 -0
- package/lib/mutations/subscriptions.d.ts.map +1 -0
- package/lib/mutations/subscriptions.js +38 -0
- package/lib/mutations/tags.d.ts +1 -0
- package/lib/mutations/tags.d.ts.map +1 -0
- package/lib/mutations/tags.js +109 -0
- package/lib/mutations/users.d.ts +1 -0
- package/lib/mutations/users.d.ts.map +1 -0
- package/lib/mutations/users.js +129 -0
- package/lib/objectTypes/app.d.ts +1 -0
- package/lib/objectTypes/app.d.ts.map +1 -0
- package/lib/objectTypes/app.js +147 -0
- package/lib/objectTypes/bankAccount.d.ts +1 -0
- package/lib/objectTypes/bankAccount.d.ts.map +1 -0
- package/lib/objectTypes/bankAccount.js +54 -0
- package/lib/objectTypes/connection.d.ts +1 -0
- package/lib/objectTypes/connection.d.ts.map +1 -0
- package/lib/objectTypes/connection.js +26 -0
- package/lib/objectTypes/content.d.ts +1 -0
- package/lib/objectTypes/content.d.ts.map +1 -0
- package/lib/objectTypes/content.js +79 -0
- package/lib/objectTypes/conversation.d.ts +1 -0
- package/lib/objectTypes/conversation.d.ts.map +1 -0
- package/lib/objectTypes/conversation.js +53 -0
- package/lib/objectTypes/creditCard.d.ts +1 -0
- package/lib/objectTypes/creditCard.d.ts.map +1 -0
- package/lib/objectTypes/creditCard.js +64 -0
- package/lib/objectTypes/document.d.ts +1 -0
- package/lib/objectTypes/document.d.ts.map +1 -0
- package/lib/objectTypes/document.js +21 -0
- package/lib/objectTypes/error.d.ts +1 -0
- package/lib/objectTypes/error.d.ts.map +1 -0
- package/lib/objectTypes/error.js +24 -0
- package/lib/objectTypes/external.d.ts +1 -0
- package/lib/objectTypes/external.d.ts.map +1 -0
- package/lib/objectTypes/external.js +52 -0
- package/lib/objectTypes/file.d.ts +1 -0
- package/lib/objectTypes/file.d.ts.map +1 -0
- package/lib/objectTypes/file.js +76 -0
- package/lib/objectTypes/filter.d.ts +1 -0
- package/lib/objectTypes/filter.d.ts.map +1 -0
- package/lib/objectTypes/filter.js +21 -0
- package/lib/objectTypes/group.d.ts +1 -0
- package/lib/objectTypes/group.d.ts.map +1 -0
- package/lib/objectTypes/group.js +97 -0
- package/lib/objectTypes/iapSubscription.d.ts +1 -0
- package/lib/objectTypes/iapSubscription.d.ts.map +1 -0
- package/lib/objectTypes/iapSubscription.js +18 -0
- package/lib/objectTypes/image.d.ts +1 -0
- package/lib/objectTypes/image.d.ts.map +1 -0
- package/lib/objectTypes/image.js +105 -0
- package/lib/objectTypes/index.d.ts +1 -0
- package/lib/objectTypes/index.d.ts.map +1 -0
- package/lib/objectTypes/index.js +28 -0
- package/lib/objectTypes/location.d.ts +1 -0
- package/lib/objectTypes/location.d.ts.map +1 -0
- package/lib/objectTypes/location.js +85 -0
- package/lib/objectTypes/message.d.ts +1 -0
- package/lib/objectTypes/message.d.ts.map +1 -0
- package/lib/objectTypes/message.js +72 -0
- package/lib/objectTypes/passcode.d.ts +1 -0
- package/lib/objectTypes/passcode.d.ts.map +1 -0
- package/lib/objectTypes/passcode.js +20 -0
- package/lib/objectTypes/plan.d.ts +1 -0
- package/lib/objectTypes/plan.d.ts.map +1 -0
- package/lib/objectTypes/plan.js +71 -0
- package/lib/objectTypes/post.d.ts +1 -0
- package/lib/objectTypes/post.d.ts.map +1 -0
- package/lib/objectTypes/post.js +101 -0
- package/lib/objectTypes/profile.d.ts +1 -0
- package/lib/objectTypes/profile.d.ts.map +1 -0
- package/lib/objectTypes/profile.js +68 -0
- package/lib/objectTypes/reaction.d.ts +1 -0
- package/lib/objectTypes/reaction.d.ts.map +1 -0
- package/lib/objectTypes/reaction.js +37 -0
- package/lib/objectTypes/relation.d.ts +1 -0
- package/lib/objectTypes/relation.d.ts.map +1 -0
- package/lib/objectTypes/relation.js +27 -0
- package/lib/objectTypes/search.d.ts +1 -0
- package/lib/objectTypes/search.d.ts.map +1 -0
- package/lib/objectTypes/search.js +50 -0
- package/lib/objectTypes/statistics.d.ts +1 -0
- package/lib/objectTypes/statistics.d.ts.map +1 -0
- package/lib/objectTypes/statistics.js +17 -0
- package/lib/objectTypes/subscription.d.ts +1 -0
- package/lib/objectTypes/subscription.d.ts.map +1 -0
- package/lib/objectTypes/subscription.js +102 -0
- package/lib/objectTypes/tag.d.ts +1 -0
- package/lib/objectTypes/tag.d.ts.map +1 -0
- package/lib/objectTypes/tag.js +41 -0
- package/lib/objectTypes/user.d.ts +1 -0
- package/lib/objectTypes/user.d.ts.map +1 -0
- package/lib/objectTypes/user.js +111 -0
- package/lib/queries/content.d.ts +1 -0
- package/lib/queries/content.d.ts.map +1 -0
- package/lib/queries/content.js +50 -0
- package/lib/queries/index.d.ts +1 -0
- package/lib/queries/index.d.ts.map +1 -0
- package/lib/queries/index.js +27 -0
- package/lib/queries/locations.d.ts +1 -0
- package/lib/queries/locations.d.ts.map +1 -0
- package/lib/queries/locations.js +23 -0
- package/lib/queries/messages.d.ts +1 -0
- package/lib/queries/messages.d.ts.map +1 -0
- package/lib/queries/messages.js +35 -0
- package/lib/queries/posts.d.ts +1 -0
- package/lib/queries/posts.d.ts.map +1 -0
- package/lib/queries/posts.js +154 -0
- package/lib/queries/reactions.d.ts +1 -0
- package/lib/queries/reactions.d.ts.map +1 -0
- package/lib/queries/reactions.js +34 -0
- package/lib/queries/statistics.d.ts +1 -0
- package/lib/queries/statistics.d.ts.map +1 -0
- package/lib/queries/statistics.js +17 -0
- package/lib/queries/subscriptions.d.ts +1 -0
- package/lib/queries/subscriptions.d.ts.map +1 -0
- package/lib/queries/subscriptions.js +21 -0
- package/lib/queries/tags.d.ts +1 -0
- package/lib/queries/tags.d.ts.map +1 -0
- package/lib/queries/tags.js +56 -0
- package/lib/queries/users.d.ts +1 -0
- package/lib/queries/users.d.ts.map +1 -0
- package/lib/queries/users.js +39 -0
- package/lib/templates/email/layout.d.ts +1 -0
- package/lib/templates/email/layout.d.ts.map +1 -0
- package/lib/templates/email/layout.js +281 -0
- package/lib/templates/email/passwordForgot.d.ts +1 -0
- package/lib/templates/email/passwordForgot.d.ts.map +1 -0
- package/lib/templates/email/passwordForgot.js +17 -0
- package/lib/templates/email/passwordRecovery.d.ts +1 -0
- package/lib/templates/email/passwordRecovery.d.ts.map +1 -0
- package/lib/templates/email/passwordRecovery.js +14 -0
- package/lib/templates/email/verifyEmail.d.ts +1 -0
- package/lib/templates/email/verifyEmail.d.ts.map +1 -0
- package/lib/templates/email/verifyEmail.js +17 -0
- package/lib/templates/email/welcome.d.ts +1 -0
- package/lib/templates/email/welcome.d.ts.map +1 -0
- package/lib/templates/email/welcome.js +17 -0
- package/lib/templates/sms/passwordForgot.d.ts +1 -0
- package/lib/templates/sms/passwordForgot.d.ts.map +1 -0
- package/lib/templates/sms/passwordForgot.js +3 -0
- package/lib/templates/sms/passwordRecovery.d.ts +1 -0
- package/lib/templates/sms/passwordRecovery.d.ts.map +1 -0
- package/lib/templates/sms/passwordRecovery.js +3 -0
- package/lib/templates/sms/verifyEmail.d.ts +1 -0
- package/lib/templates/sms/verifyEmail.d.ts.map +1 -0
- package/lib/templates/sms/verifyEmail.js +3 -0
- package/lib/templates/sms/verifyPhone.d.ts +1 -0
- package/lib/templates/sms/verifyPhone.d.ts.map +1 -0
- package/lib/templates/sms/verifyPhone.js +3 -0
- package/lib/templates/sms/welcome.d.ts +1 -0
- package/lib/templates/sms/welcome.d.ts.map +1 -0
- package/lib/templates/sms/welcome.js +3 -0
- package/lib/types/apps.types.d.ts +1 -0
- package/lib/types/apps.types.d.ts.map +1 -0
- package/lib/types/apps.types.js +10 -0
- package/lib/types/arangodb.types.d.ts +1 -0
- package/lib/types/arangodb.types.d.ts.map +1 -0
- package/lib/types/arangodb.types.js +6 -0
- package/lib/types/auth.types.d.ts +1 -0
- package/lib/types/auth.types.d.ts.map +1 -0
- package/lib/types/auth.types.js +6 -0
- package/lib/types/connections.types.d.ts +1 -0
- package/lib/types/connections.types.d.ts.map +1 -0
- package/lib/types/connections.types.js +6 -0
- package/lib/types/content.types.d.ts +1 -0
- package/lib/types/content.types.d.ts.map +1 -0
- package/lib/types/content.types.js +6 -0
- package/lib/types/conversations.types.d.ts +1 -0
- package/lib/types/conversations.types.d.ts.map +1 -0
- package/lib/types/conversations.types.js +6 -0
- package/lib/types/email.types.d.ts +1 -0
- package/lib/types/email.types.d.ts.map +1 -0
- package/lib/types/email.types.js +6 -0
- package/lib/types/error.types.d.ts +1 -0
- package/lib/types/error.types.d.ts.map +1 -0
- package/lib/types/error.types.js +20 -0
- package/lib/types/files.types.d.ts +1 -0
- package/lib/types/files.types.d.ts.map +1 -0
- package/lib/types/files.types.js +6 -0
- package/lib/types/google.types.d.ts +1 -0
- package/lib/types/google.types.d.ts.map +1 -0
- package/lib/types/google.types.js +6 -0
- package/lib/types/groups.types.d.ts +1 -0
- package/lib/types/groups.types.d.ts.map +1 -0
- package/lib/types/groups.types.js +6 -0
- package/lib/types/images.types.d.ts +1 -0
- package/lib/types/images.types.d.ts.map +1 -0
- package/lib/types/images.types.js +6 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +28 -0
- package/lib/types/locations.types.d.ts +1 -0
- package/lib/types/locations.types.d.ts.map +1 -0
- package/lib/types/locations.types.js +6 -0
- package/lib/types/messages.types.d.ts +1 -0
- package/lib/types/messages.types.d.ts.map +1 -0
- package/lib/types/messages.types.js +6 -0
- package/lib/types/notifications.types.d.ts +1 -0
- package/lib/types/notifications.types.d.ts.map +1 -0
- package/lib/types/notifications.types.js +6 -0
- package/lib/types/payments.types.d.ts +1 -0
- package/lib/types/payments.types.d.ts.map +1 -0
- package/lib/types/payments.types.js +6 -0
- package/lib/types/posts.types.d.ts +1 -0
- package/lib/types/posts.types.d.ts.map +1 -0
- package/lib/types/posts.types.js +6 -0
- package/lib/types/profiles.types.d.ts +1 -0
- package/lib/types/profiles.types.d.ts.map +1 -0
- package/lib/types/profiles.types.js +3 -0
- package/lib/types/statistics.types.d.ts +1 -0
- package/lib/types/statistics.types.d.ts.map +1 -0
- package/lib/types/statistics.types.js +3 -0
- package/lib/types/tags.types.d.ts +1 -0
- package/lib/types/tags.types.d.ts.map +1 -0
- package/lib/types/tags.types.js +6 -0
- package/lib/types/users.types.d.ts +1 -0
- package/lib/types/users.types.d.ts.map +1 -0
- package/lib/types/users.types.js +6 -0
- package/lib/types/videos.types.d.ts +1 -0
- package/lib/types/videos.types.d.ts.map +1 -0
- package/lib/types/videos.types.js +6 -0
- package/lib/types/websockets.types.d.ts +1 -0
- package/lib/types/websockets.types.d.ts.map +1 -0
- package/lib/types/websockets.types.js +6 -0
- package/lib/utils/adapterUtils.d.ts +1 -0
- package/lib/utils/adapterUtils.d.ts.map +1 -0
- package/lib/utils/adapterUtils.js +23 -0
- package/lib/utils/analyticsUtils.d.ts +1 -0
- package/lib/utils/analyticsUtils.d.ts.map +1 -0
- package/lib/utils/analyticsUtils.js +45 -0
- package/lib/utils/arangodbUtils.d.ts +1 -0
- package/lib/utils/arangodbUtils.d.ts.map +1 -0
- package/lib/utils/arangodbUtils.js +130 -0
- package/lib/utils/authUtils.d.ts +1 -0
- package/lib/utils/authUtils.d.ts.map +1 -0
- package/lib/utils/authUtils.js +54 -0
- package/lib/utils/contextUtils.d.ts +1 -0
- package/lib/utils/contextUtils.d.ts.map +1 -0
- package/lib/utils/contextUtils.js +10 -0
- package/lib/utils/dbI18n.d.ts +1 -0
- package/lib/utils/dbI18n.d.ts.map +1 -0
- package/lib/utils/dbI18n.example.d.ts +1 -0
- package/lib/utils/dbI18n.example.d.ts.map +1 -0
- package/lib/utils/dbI18n.example.js +93 -0
- package/lib/utils/dbI18n.js +28 -0
- package/lib/utils/googleTranslate.d.ts +1 -0
- package/lib/utils/googleTranslate.d.ts.map +1 -0
- package/lib/utils/googleTranslate.js +70 -0
- package/lib/utils/graphqlUtils.d.ts +1 -0
- package/lib/utils/graphqlUtils.d.ts.map +1 -0
- package/lib/utils/graphqlUtils.js +11 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +19 -0
- package/lib/utils/languageDetection.d.ts +1 -0
- package/lib/utils/languageDetection.d.ts.map +1 -0
- package/lib/utils/languageDetection.js +120 -0
- package/lib/utils/localeUtils.d.ts +1 -0
- package/lib/utils/localeUtils.d.ts.map +1 -0
- package/lib/utils/localeUtils.example.d.ts +1 -0
- package/lib/utils/localeUtils.example.d.ts.map +1 -0
- package/lib/utils/localeUtils.example.js +124 -0
- package/lib/utils/localeUtils.js +71 -0
- package/lib/utils/middlewareUtils.d.ts +1 -0
- package/lib/utils/middlewareUtils.d.ts.map +1 -0
- package/lib/utils/middlewareUtils.js +10 -0
- package/lib/utils/sessionUtils.d.ts +1 -0
- package/lib/utils/sessionUtils.d.ts.map +1 -0
- package/lib/utils/sessionUtils.js +26 -0
- package/lib/utils/stripeUtils.d.ts +2 -1
- package/lib/utils/stripeUtils.d.ts.map +1 -0
- package/lib/utils/stripeUtils.js +12 -0
- package/lib/utils/templateUtils.d.ts +1 -0
- package/lib/utils/templateUtils.d.ts.map +1 -0
- package/lib/utils/templateUtils.js +11 -0
- package/lib/utils/testUtils.d.ts +1 -0
- package/lib/utils/testUtils.d.ts.map +1 -0
- package/lib/utils/testUtils.js +292 -0
- package/lib/utils/translationQueue.d.ts +1 -0
- package/lib/utils/translationQueue.d.ts.map +1 -0
- package/lib/utils/translationQueue.example.d.ts +1 -0
- package/lib/utils/translationQueue.example.d.ts.map +1 -0
- package/lib/utils/translationQueue.example.js +340 -0
- package/lib/utils/translationQueue.js +113 -0
- package/package.json +54 -24
- package/.env +0 -1
- package/.env.example +0 -1
- package/DATABASE_I18N_GUIDE.md +0 -434
- package/TEST_UTILITIES_GUIDE.md +0 -360
- package/coverage/actions/groups.ts.html +0 -1039
- package/coverage/actions/images.ts.html +0 -2500
- package/coverage/actions/index.html +0 -116
- package/coverage/actions/notifications.ts.html +0 -223
- package/coverage/actions/posts.ts.html +0 -2356
- package/coverage/actions/tags.ts.html +0 -1000
- package/coverage/adapters/arangoAdapter.ts.html +0 -301
- package/coverage/adapters/fileAdapter.ts.html +0 -445
- package/coverage/adapters/index.html +0 -176
- package/coverage/adapters/postAdapter.ts.html +0 -436
- package/coverage/adapters/reaktorAdapter.ts.html +0 -310
- package/coverage/adapters/tagAdapter.ts.html +0 -409
- package/coverage/adapters/userAdapter.ts.html +0 -829
- package/coverage/analyticsUtils.ts.html +0 -286
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -6
- package/coverage/config.ts.html +0 -766
- package/coverage/coverage-final.json +0 -1
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -221
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -101
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -0
- package/coverage/mocks/file.ts.html +0 -118
- package/coverage/mocks/group.ts.html +0 -145
- package/coverage/mocks/image.ts.html +0 -142
- package/coverage/mocks/index.html +0 -176
- package/coverage/mocks/post.ts.html +0 -169
- package/coverage/mocks/tag.ts.html +0 -121
- package/coverage/mocks/user.ts.html +0 -271
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/testUtils.ts.html +0 -1309
- package/coverage/translationQueue.ts.html +0 -592
- package/coverage/types/error.ts.html +0 -145
- package/coverage/types/error.types.ts.html +0 -148
- package/coverage/types/index.html +0 -116
- package/coverage/utils/adapterUtils.ts.html +0 -163
- package/coverage/utils/analyticsUtils.ts.html +0 -286
- package/coverage/utils/arangodbUtils.ts.html +0 -463
- package/coverage/utils/authUtils.ts.html +0 -328
- package/coverage/utils/dbI18n.ts.html +0 -280
- package/coverage/utils/googleTranslate.ts.html +0 -385
- package/coverage/utils/index.html +0 -131
- package/coverage/utils/localeUtils.ts.html +0 -193
- package/coverage/utils/sessionUtils.ts.html +0 -211
- package/coverage/utils/testUtils.ts.html +0 -1309
- package/index.js +0 -5
- package/jpg:- +0 -0
- package/lex.config.mjs +0 -34
- package/tsconfig.build.json +0 -21
- package/tsconfig.lint.json +0 -33
- package/tsconfig.test.json +0 -31
package/lib/actions/videos.d.ts
CHANGED
|
@@ -23,3 +23,4 @@ export declare const addVideo: (context: ApiContext, video: VideoType, s3Options
|
|
|
23
23
|
export declare const addVideoEdge: (context: ApiContext, videoEdge: VideoEdgeType) => Promise<object>;
|
|
24
24
|
export declare const updateVideo: (context: ApiContext, video: VideoType, s3Options?: PutObjectCommandInput) => Promise<VideoType>;
|
|
25
25
|
export declare const deleteVideo: (context: ApiContext, videoId: string) => Promise<VideoType>;
|
|
26
|
+
//# sourceMappingURL=videos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"videos.d.ts","sourceRoot":"","sources":["../../src/actions/videos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA4B,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAYpF,OAAO,KAAK,EAAqB,aAAa,EAAC,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAC,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAInG,eAAO,MAAM,iBAAiB,GAAI,UAAS,YAAiB;WAI3B,aAAa;;CAG7C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAQ,MAAM,EAAO,QA0BtB,CAAC;AAEjC,eAAO,MAAM,eAAe,GAC1B,SAAS,UAAU,EACnB,QAAQ,MAAM,EACd,OAAM,MAAU,EAChB,KAAI,MAAW,KACd,OAAO,CAAC,SAAS,EAAE,CAsBrB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,SAAS,UAAU,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,CAcvF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,SAAS,UAAU,EACnB,QAAQ,MAAM,EACd,UAAS,YAAiB,KACzB,OAAO,CAAC,SAAS,EAAE,CAuBrB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,SAAS,UAAU,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,SAAS,CAahF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,SAAS,MAAM,EAAE,WAAW,MAAM,EAAE,MAAK,MAAiB,KAAG,MAgB9G,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,uDAO5B,YAAY,KAAG,MAkBjB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,gEAQ/B,GAAG,KAAG,OAAO,CAAC,MAAM,CAuBtB,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,UAAU,EACnB,SAAS,MAAM,EACf,QAAQ,MAAM,EACd,WAAU,MAAoB,EAAE,YAAY,qBAAqB,KAChE,OAAO,CAAC,SAAS,CAmBnB,CAAC;AAEF,eAAO,MAAM,QAAQ,GACnB,SAAS,UAAU,EACnB,OAAO,SAAS,EAChB,YAAY,qBAAqB,KAChC,OAAO,CAAC,SAAS,CAmDnB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAU,SAAS,UAAU,EAAE,WAAW,aAAa,KAAG,OAAO,CAAC,MAAM,CA+BhG,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,SAAS,UAAU,EACnB,OAAO,SAAS,EAChB,YAAY,qBAAqB,KAChC,OAAO,CAAC,SAAS,CA6HnB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,SAAS,UAAU,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,SAAS,CAmCzF,CAAC"}
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { get as httpGet } from '@nlabs/rip-hunter';
|
|
5
|
+
import { createHash, parseArangoId, parseChar, parseId } from '@nlabs/utils/parsers/strings';
|
|
6
|
+
import { aql } from 'arangojs';
|
|
7
|
+
import { Config } from '../config.js';
|
|
8
|
+
import { ErrorTypes } from '../types/error.types.js';
|
|
9
|
+
import { logError } from '../utils/analyticsUtils.js';
|
|
10
|
+
import { getDocId, getLimit, selectReactionCountByType, useDb } from '../utils/arangodbUtils.js';
|
|
11
|
+
import { s3DeleteList, s3GetSignedUrl, s3Put } from './s3.js';
|
|
12
|
+
const eventCategory = 'videos';
|
|
13
|
+
export const parseVideoOptions = (options = {})=>{
|
|
14
|
+
const { from = 0, to = 30, type = 'default' } = options;
|
|
15
|
+
return {
|
|
16
|
+
limit: getLimit(from, to),
|
|
17
|
+
type: parseChar(type, 32)
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export const getVideoOptional = (fields = [])=>fields.reduce((selects, field)=>{
|
|
21
|
+
if (field.includes('Count')) {
|
|
22
|
+
return selectReactionCountByType('videos', 'v', field, selects);
|
|
23
|
+
}
|
|
24
|
+
switch(field){
|
|
25
|
+
case 'reactions':
|
|
26
|
+
{
|
|
27
|
+
selects.queries.push(`LET reactions = (FOR video, r IN INBOUND v._id reactions COLLECT reactionName = r.value INTO reactionItems RETURN {name: reactionName, count: LENGTH(reactionItems[*].r.value)})`);
|
|
28
|
+
selects.objects.push('reactions:reactions');
|
|
29
|
+
return selects;
|
|
30
|
+
}
|
|
31
|
+
case 'tags':
|
|
32
|
+
{
|
|
33
|
+
selects.queries.push(`LET tags = (FOR t, pl IN INBOUND v._id isTagged RETURN t)`);
|
|
34
|
+
selects.objects.push('tags:tags');
|
|
35
|
+
return selects;
|
|
36
|
+
}
|
|
37
|
+
case 'users':
|
|
38
|
+
{
|
|
39
|
+
selects.queries.push(`LET users = FIRST(FOR u IN users FILTER v.userId == u._key LIMIT 1 RETURN u)`);
|
|
40
|
+
selects.objects.push('users:users');
|
|
41
|
+
return selects;
|
|
42
|
+
}
|
|
43
|
+
default:
|
|
44
|
+
{
|
|
45
|
+
return selects;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}, {
|
|
49
|
+
objects: [],
|
|
50
|
+
queries: []
|
|
51
|
+
});
|
|
52
|
+
export const getVideosByUser = (context, userId, from = 0, to = 30)=>{
|
|
53
|
+
const action = 'getVideosByUser';
|
|
54
|
+
const { databaseName } = context;
|
|
55
|
+
const formatUserId = parseId(userId);
|
|
56
|
+
const limit = getLimit(from, to);
|
|
57
|
+
const aqlQry = `FOR v IN videos
|
|
58
|
+
FILTER v.userId == "${formatUserId}"
|
|
59
|
+
LET user = FIRST(FOR u IN users FILTER u._key == v.userId LIMIT 1 RETURN u)
|
|
60
|
+
${limit.aql}
|
|
61
|
+
SORT v.added
|
|
62
|
+
RETURN MERGE(v, {user:user})`;
|
|
63
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.all()).catch((error)=>{
|
|
64
|
+
logError({
|
|
65
|
+
action,
|
|
66
|
+
category: eventCategory,
|
|
67
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
68
|
+
}, error, context);
|
|
69
|
+
return [];
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
export const getVideoCountByItem = (context, itemId)=>{
|
|
73
|
+
const action = 'getVideoCountByItem';
|
|
74
|
+
const { databaseName } = context;
|
|
75
|
+
const formatItemId = parseArangoId(itemId);
|
|
76
|
+
const aqlQry = aql`FOR v IN hasVideo FILTER v._to == ${formatItemId} RETURN {count: COUNT(v)}`;
|
|
77
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then(({ count })=>count).catch((error)=>logError({
|
|
78
|
+
action,
|
|
79
|
+
category: eventCategory,
|
|
80
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
81
|
+
}, error, context));
|
|
82
|
+
};
|
|
83
|
+
export const getVideosByItem = async (context, itemId, options = {})=>{
|
|
84
|
+
const action = 'getVideosByItem';
|
|
85
|
+
const { databaseName, fields = [] } = context;
|
|
86
|
+
const formatItemId = parseArangoId(itemId);
|
|
87
|
+
const { limit } = parseVideoOptions(options);
|
|
88
|
+
const { objects: selectObjects, queries: selectQueries } = getVideoOptional(fields);
|
|
89
|
+
const aqlQry = `FOR v, l IN 1..1 OUTBOUND "${formatItemId}" hasVideo
|
|
90
|
+
FILTER NOT IS_NULL(v)
|
|
91
|
+
${selectQueries.join('\n')}
|
|
92
|
+
SORT v.added
|
|
93
|
+
${limit.aql}
|
|
94
|
+
RETURN MERGE(v, {${selectObjects.join(', ')}})`;
|
|
95
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.all()).catch((error)=>{
|
|
96
|
+
logError({
|
|
97
|
+
action,
|
|
98
|
+
category: eventCategory,
|
|
99
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
100
|
+
}, error, context);
|
|
101
|
+
return [];
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
export const getVideo = (context, videoId)=>{
|
|
105
|
+
const action = 'getVideo';
|
|
106
|
+
const { databaseName } = context;
|
|
107
|
+
const formatVideoId = parseId(videoId);
|
|
108
|
+
const aqlQry = aql`FOR v IN videos FILTER v._key==${formatVideoId} LIMIT 1 RETURN v`;
|
|
109
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
110
|
+
action,
|
|
111
|
+
category: eventCategory,
|
|
112
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
113
|
+
}, error, context));
|
|
114
|
+
};
|
|
115
|
+
export const getPathUserVideos = (userId, videoId, videoType, dir = 'videos')=>{
|
|
116
|
+
let filename = videoId;
|
|
117
|
+
switch(videoType){
|
|
118
|
+
case 'video/webm':
|
|
119
|
+
filename = `${videoId}.webm`;
|
|
120
|
+
break;
|
|
121
|
+
case 'video/quicktime':
|
|
122
|
+
filename = `${videoId}.mov`;
|
|
123
|
+
break;
|
|
124
|
+
default:
|
|
125
|
+
filename = `${videoId}.mp4`;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
return `users/${userId}/${dir}/${filename}`;
|
|
129
|
+
};
|
|
130
|
+
export const getAppVideoUrl = ({ bucket, directory = 'videos', isThumb = false, type, typeId, videoId })=>{
|
|
131
|
+
if (!type) {
|
|
132
|
+
return '';
|
|
133
|
+
}
|
|
134
|
+
if (!videoId) {
|
|
135
|
+
return '';
|
|
136
|
+
}
|
|
137
|
+
const bucketName = bucket || Config.get('image.bucket') || 'dev.reaktor.io';
|
|
138
|
+
const videoName = `${videoId}.mp4`;
|
|
139
|
+
const videoUrl = Config.get('image.url') || `https://s3.amazonaws.com/${bucketName}`;
|
|
140
|
+
if (type === 'apps') {
|
|
141
|
+
return `${videoUrl}/${type}/${directory}/${videoName}`;
|
|
142
|
+
}
|
|
143
|
+
return `${videoUrl}/${type}/${typeId}/${directory}/${videoName}`;
|
|
144
|
+
};
|
|
145
|
+
export const getVideoUrl = async ({ bucket, imageDir = 'videos', videoDir = 'videos', videoId, type, typeId, urlType = 'public' })=>{
|
|
146
|
+
if (!videoId) {
|
|
147
|
+
return '';
|
|
148
|
+
}
|
|
149
|
+
const keyDir = videoDir || imageDir || 'videos';
|
|
150
|
+
const videoKey = `${type}/${typeId}/${keyDir}/${videoId}.mp4`;
|
|
151
|
+
switch(urlType){
|
|
152
|
+
case 'signed':
|
|
153
|
+
{
|
|
154
|
+
const defaultBucket = Config.get('image.bucket') || 'dev.reaktor.io';
|
|
155
|
+
return await s3GetSignedUrl({
|
|
156
|
+
Bucket: bucket || defaultBucket,
|
|
157
|
+
Expires: 900,
|
|
158
|
+
Key: videoKey
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
case 'public':
|
|
162
|
+
{
|
|
163
|
+
return `https://box.${Config.get('app.url')}/${videoKey}`;
|
|
164
|
+
}
|
|
165
|
+
case 'dev':
|
|
166
|
+
{
|
|
167
|
+
return `https://s3.amazonaws.com/dev.${Config.get('app.url')}/${videoKey}`;
|
|
168
|
+
}
|
|
169
|
+
default:
|
|
170
|
+
{
|
|
171
|
+
return '';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
export const saveVideo = async (context, videoId, buffer, fileType = 'video/mp4', s3Options)=>{
|
|
176
|
+
const { session: { userId: sessionId } } = context;
|
|
177
|
+
const videoObj = {
|
|
178
|
+
ACL: 'authenticated-read',
|
|
179
|
+
Body: buffer,
|
|
180
|
+
Bucket: null,
|
|
181
|
+
ContentType: fileType,
|
|
182
|
+
...s3Options || {},
|
|
183
|
+
Key: getPathUserVideos(sessionId, videoId, fileType, 'videos')
|
|
184
|
+
};
|
|
185
|
+
await s3Put(videoObj);
|
|
186
|
+
return {
|
|
187
|
+
fileSize: buffer.length,
|
|
188
|
+
fileType,
|
|
189
|
+
videoId
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
export const addVideo = (context, video, s3Options)=>{
|
|
193
|
+
const action = 'addVideo';
|
|
194
|
+
const { databaseName, session: { userId: sessionId } } = context;
|
|
195
|
+
const { videoId, description, buffer, fileType, type = 'video', provider, externalId, externalUrl } = video;
|
|
196
|
+
const now = Date.now();
|
|
197
|
+
if (type === 'external') {
|
|
198
|
+
const insert = {
|
|
199
|
+
_key: videoId,
|
|
200
|
+
added: now,
|
|
201
|
+
description,
|
|
202
|
+
externalId,
|
|
203
|
+
externalUrl,
|
|
204
|
+
provider,
|
|
205
|
+
type,
|
|
206
|
+
userId: sessionId
|
|
207
|
+
};
|
|
208
|
+
const aqlQry = aql`INSERT ${insert} IN videos RETURN NEW`;
|
|
209
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
210
|
+
action,
|
|
211
|
+
category: eventCategory,
|
|
212
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
213
|
+
}, error, context));
|
|
214
|
+
}
|
|
215
|
+
return saveVideo(context, videoId, buffer, fileType, s3Options).then((saved)=>{
|
|
216
|
+
const insert = {
|
|
217
|
+
...saved,
|
|
218
|
+
_key: videoId,
|
|
219
|
+
added: now,
|
|
220
|
+
description,
|
|
221
|
+
fileType,
|
|
222
|
+
modified: now,
|
|
223
|
+
type,
|
|
224
|
+
userId: sessionId
|
|
225
|
+
};
|
|
226
|
+
const aqlQry = aql`INSERT ${insert} IN videos RETURN NEW`;
|
|
227
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
228
|
+
action,
|
|
229
|
+
category: eventCategory,
|
|
230
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
231
|
+
}, error, context));
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
export const addVideoEdge = async (context, videoEdge)=>{
|
|
235
|
+
const action = 'addVideoEdge';
|
|
236
|
+
const { databaseName, session: { userId: sessionId } } = context;
|
|
237
|
+
const { videoId, itemId, itemType } = videoEdge;
|
|
238
|
+
const now = Date.now();
|
|
239
|
+
const edgeId = createHash(`hasVideo-${videoId}-${itemId}-${sessionId}`);
|
|
240
|
+
const formatItemType = parseChar(itemType).toLowerCase();
|
|
241
|
+
const formatItemId = parseId(itemId);
|
|
242
|
+
const itemDocId = getDocId(formatItemType, {
|
|
243
|
+
_key: formatItemId
|
|
244
|
+
});
|
|
245
|
+
const formatVideoId = parseId(videoId);
|
|
246
|
+
const fileDocId = `videos/${formatVideoId}`;
|
|
247
|
+
const edge = {
|
|
248
|
+
_from: itemDocId,
|
|
249
|
+
_key: edgeId,
|
|
250
|
+
_to: fileDocId,
|
|
251
|
+
added: now,
|
|
252
|
+
itemType
|
|
253
|
+
};
|
|
254
|
+
if (itemDocId) {
|
|
255
|
+
return useDb(databaseName).collection('hasVideo').save(edge, {
|
|
256
|
+
returnNew: true
|
|
257
|
+
}).then((fileEdge)=>useDb(databaseName).collection('hasVideo').document(fileEdge)).catch((error)=>logError({
|
|
258
|
+
action,
|
|
259
|
+
category: eventCategory,
|
|
260
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
261
|
+
}, error, context));
|
|
262
|
+
}
|
|
263
|
+
return null;
|
|
264
|
+
};
|
|
265
|
+
export const updateVideo = async (context, video, s3Options)=>{
|
|
266
|
+
const action = 'updateVideo';
|
|
267
|
+
const { databaseName, session: { userId: sessionId } } = context;
|
|
268
|
+
const { base64 = '', buffer: videoBuffer, description = '', externalId, externalUrl, fileType, itemId, itemType, provider, type, url = '', videoId } = video;
|
|
269
|
+
const now = Date.now();
|
|
270
|
+
const formatVideoId = videoId || createHash(`video-${sessionId}`);
|
|
271
|
+
const formatItemId = parseId(itemId);
|
|
272
|
+
const formatItemType = parseChar(itemType, 16).toLowerCase();
|
|
273
|
+
if (type === 'external' && (externalId || externalUrl)) {
|
|
274
|
+
const insert = {
|
|
275
|
+
_key: formatVideoId,
|
|
276
|
+
added: now,
|
|
277
|
+
description,
|
|
278
|
+
externalId,
|
|
279
|
+
externalUrl,
|
|
280
|
+
modified: now,
|
|
281
|
+
provider,
|
|
282
|
+
type,
|
|
283
|
+
userId: sessionId
|
|
284
|
+
};
|
|
285
|
+
const aqlQry = aql`UPSERT {_key: ${formatVideoId}} INSERT ${insert} UPDATE ${insert} IN videos RETURN NEW`;
|
|
286
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((newVideo)=>{
|
|
287
|
+
if (formatItemId && formatItemType) {
|
|
288
|
+
const videoEdge = {
|
|
289
|
+
videoId: formatVideoId,
|
|
290
|
+
itemId: formatItemId,
|
|
291
|
+
itemType: formatItemType
|
|
292
|
+
};
|
|
293
|
+
return addVideoEdge(context, videoEdge).then(()=>newVideo);
|
|
294
|
+
}
|
|
295
|
+
return newVideo;
|
|
296
|
+
}).catch((error)=>logError({
|
|
297
|
+
action,
|
|
298
|
+
category: eventCategory,
|
|
299
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
300
|
+
}, error, context));
|
|
301
|
+
}
|
|
302
|
+
if (base64 || videoBuffer) {
|
|
303
|
+
let buffer = videoBuffer;
|
|
304
|
+
if (base64) {
|
|
305
|
+
const formatBase64 = base64.substr(base64.indexOf(',') + 1);
|
|
306
|
+
buffer = Buffer.from(formatBase64, 'base64');
|
|
307
|
+
}
|
|
308
|
+
let updatedFileType = fileType;
|
|
309
|
+
if (!fileType) {
|
|
310
|
+
const { fileTypeFromBuffer } = await import('file-type');
|
|
311
|
+
const { mime } = await fileTypeFromBuffer(buffer);
|
|
312
|
+
updatedFileType = mime;
|
|
313
|
+
}
|
|
314
|
+
const vParams = {
|
|
315
|
+
buffer,
|
|
316
|
+
fileType: updatedFileType,
|
|
317
|
+
userId: sessionId,
|
|
318
|
+
videoId: formatVideoId
|
|
319
|
+
};
|
|
320
|
+
return addVideo(context, {
|
|
321
|
+
...vParams,
|
|
322
|
+
description
|
|
323
|
+
}, s3Options).then((newVideo)=>{
|
|
324
|
+
if (formatItemId && formatItemType) {
|
|
325
|
+
const videoEdge = {
|
|
326
|
+
videoId: formatVideoId,
|
|
327
|
+
itemId: formatItemId,
|
|
328
|
+
itemType: formatItemType
|
|
329
|
+
};
|
|
330
|
+
return addVideoEdge(context, videoEdge).then(()=>newVideo);
|
|
331
|
+
}
|
|
332
|
+
return newVideo;
|
|
333
|
+
}).catch((error)=>logError({
|
|
334
|
+
action,
|
|
335
|
+
category: eventCategory,
|
|
336
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
337
|
+
}, error, context));
|
|
338
|
+
} else if (url !== '') {
|
|
339
|
+
let contentType;
|
|
340
|
+
return httpGet(url).then((res)=>{
|
|
341
|
+
if (res.status !== 200) {
|
|
342
|
+
throw new Error(ErrorTypes.IMAGE_REQUEST);
|
|
343
|
+
}
|
|
344
|
+
contentType = res.headers.get('content-type');
|
|
345
|
+
return res;
|
|
346
|
+
}).then((res)=>res.buffer()).then((buffer)=>{
|
|
347
|
+
const vParams = {
|
|
348
|
+
buffer,
|
|
349
|
+
description,
|
|
350
|
+
fileType: contentType,
|
|
351
|
+
userId: sessionId,
|
|
352
|
+
videoId: formatVideoId
|
|
353
|
+
};
|
|
354
|
+
return addVideo(context, vParams, s3Options).then((newVideo)=>{
|
|
355
|
+
if (formatItemId && formatItemType) {
|
|
356
|
+
const videoEdge = {
|
|
357
|
+
videoId: formatVideoId,
|
|
358
|
+
itemId: formatItemId,
|
|
359
|
+
itemType: formatItemType
|
|
360
|
+
};
|
|
361
|
+
return addVideoEdge(context, videoEdge).then(()=>newVideo);
|
|
362
|
+
}
|
|
363
|
+
return newVideo;
|
|
364
|
+
}).catch((error)=>logError({
|
|
365
|
+
action,
|
|
366
|
+
category: eventCategory,
|
|
367
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
368
|
+
}, error, context));
|
|
369
|
+
}).catch((error)=>logError({
|
|
370
|
+
action,
|
|
371
|
+
category: eventCategory,
|
|
372
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
373
|
+
}, error, context));
|
|
374
|
+
} else if (videoId !== '') {
|
|
375
|
+
const update = {
|
|
376
|
+
description,
|
|
377
|
+
modified: now
|
|
378
|
+
};
|
|
379
|
+
const aqlQry = aql`UPDATE {_key: ${formatVideoId}} WITH ${update} IN videos RETURN NEW`;
|
|
380
|
+
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
|
|
381
|
+
action,
|
|
382
|
+
category: eventCategory,
|
|
383
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
384
|
+
}, error, context));
|
|
385
|
+
}
|
|
386
|
+
return null;
|
|
387
|
+
};
|
|
388
|
+
export const deleteVideo = async (context, videoId)=>{
|
|
389
|
+
const action = 'deleteVideo';
|
|
390
|
+
const { databaseName, session: { userId: sessionId } } = context;
|
|
391
|
+
const formatVideoId = parseId(videoId);
|
|
392
|
+
try {
|
|
393
|
+
const videoDocId = `videos/${formatVideoId}`;
|
|
394
|
+
const removeEdgeQuery = aql`FOR hv IN hasVideo FILTER hv._to == ${videoDocId} REMOVE hv IN hasVideo RETURN OLD`;
|
|
395
|
+
await useDb(databaseName).query(removeEdgeQuery);
|
|
396
|
+
const aqlQuery = aql`FOR v IN videos FILTER v._key == ${formatVideoId} && v.userId == ${sessionId} REMOVE v IN videos RETURN OLD`;
|
|
397
|
+
const video = await useDb(databaseName).query(aqlQuery).then((cursor)=>cursor.next());
|
|
398
|
+
if (video) {
|
|
399
|
+
const { _key: vKey } = video;
|
|
400
|
+
const params = {
|
|
401
|
+
Bucket: null,
|
|
402
|
+
Delete: {
|
|
403
|
+
Objects: [
|
|
404
|
+
{
|
|
405
|
+
Key: `users/${sessionId}/videos/${vKey}.mp4`
|
|
406
|
+
}
|
|
407
|
+
],
|
|
408
|
+
Quiet: true
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
return s3DeleteList(params).then(()=>video);
|
|
412
|
+
}
|
|
413
|
+
return null;
|
|
414
|
+
} catch (error) {
|
|
415
|
+
return logError({
|
|
416
|
+
action,
|
|
417
|
+
category: eventCategory,
|
|
418
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
419
|
+
}, error, context);
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvdmlkZW9zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0RlbGV0ZU9iamVjdHNDb21tYW5kSW5wdXQsIFB1dE9iamVjdENvbW1hbmRJbnB1dH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7Z2V0IGFzIGh0dHBHZXR9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VBcmFuZ29JZCwgcGFyc2VDaGFyLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7czNEZWxldGVMaXN0LCBzM0dldFNpZ25lZFVybCwgczNQdXR9IGZyb20gJy4vczMuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXJhbmdvRGJDb2xsZWN0aW9uLCBBcmFuZ29EYkxpbWl0fSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYi50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VmlkZW9FZGdlVHlwZSwgVmlkZW9PcHRpb25zLCBWaWRlb1R5cGUsIFZpZGVvVXJsRGF0YX0gZnJvbSAnLi4vdHlwZXMvdmlkZW9zLnR5cGVzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3ZpZGVvcyc7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVZpZGVvT3B0aW9ucyA9IChvcHRpb25zOiBWaWRlb09wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7ZnJvbSA9IDAsIHRvID0gMzAsIHR5cGUgPSAnZGVmYXVsdCd9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmlkZW9PcHRpb25hbCA9IChmaWVsZHM6IHN0cmluZ1tdID0gW10pID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHMsIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ3ZpZGVvcycsICd2JywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHN3aXRjaChmaWVsZCkge1xuICAgICAgY2FzZSAncmVhY3Rpb25zJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHJlYWN0aW9ucyA9IChGT1IgdmlkZW8sIHIgSU4gSU5CT1VORCB2Ll9pZCByZWFjdGlvbnMgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtcyBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfSlgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoRk9SIHQsIHBsIElOIElOQk9VTkQgdi5faWQgaXNUYWdnZWQgUkVUVVJOIHQpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2Vycyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB1c2VycyA9IEZJUlNUKEZPUiB1IElOIHVzZXJzIEZJTFRFUiB2LnVzZXJJZCA9PSB1Ll9rZXkgTElNSVQgMSBSRVRVUk4gdSlgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3VzZXJzOnVzZXJzJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldFZpZGVvc0J5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGZyb206IG51bWJlciA9IDAsXG4gIHRvOiBudW1iZXIgPSAzMFxuKTogUHJvbWlzZTxWaWRlb1R5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRWaWRlb3NCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHYgSU4gdmlkZW9zXG4gICAgICBGSUxURVIgdi51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIlxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChGT1IgdSBJTiB1c2VycyBGSUxURVIgdS5fa2V5ID09IHYudXNlcklkIExJTUlUIDEgUkVUVVJOIHUpXG4gICAgICAke2xpbWl0LmFxbH1cbiAgICAgIFNPUlQgdi5hZGRlZFxuICAgICAgUkVUVVJOIE1FUkdFKHYsIHt1c2VyOnVzZXJ9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFZpZGVvVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW10gYXMgVmlkZW9UeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmlkZW9Db3VudEJ5SXRlbSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFZpZGVvQ291bnRCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB2IElOIGhhc1ZpZGVvIEZJTFRFUiB2Ll90byA9PSAke2Zvcm1hdEl0ZW1JZH0gUkVUVVJOIHtjb3VudDogQ09VTlQodil9YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoe2NvdW50fSkgPT4gY291bnQpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZpZGVvc0J5SXRlbSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFZpZGVvT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFZpZGVvVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFZpZGVvc0J5SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcyA9IFtdfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VWaWRlb09wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFZpZGVvT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHYsIGwgSU4gMS4uMSBPVVRCT1VORCBcIiR7Zm9ybWF0SXRlbUlkfVwiIGhhc1ZpZGVvXG4gICAgRklMVEVSIE5PVCBJU19OVUxMKHYpXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIFNPUlQgdi5hZGRlZFxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBNRVJHRSh2LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBWaWRlb1R5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdIGFzIFZpZGVvVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZpZGVvID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHZpZGVvSWQ6IHN0cmluZyk6IFByb21pc2U8VmlkZW9UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFZpZGVvJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRWaWRlb0lkOiBzdHJpbmcgPSBwYXJzZUlkKHZpZGVvSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB2IElOIHZpZGVvcyBGSUxURVIgdi5fa2V5PT0ke2Zvcm1hdFZpZGVvSWR9IExJTUlUIDEgUkVUVVJOIHZgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoVXNlclZpZGVvcyA9ICh1c2VySWQ6IHN0cmluZywgdmlkZW9JZDogc3RyaW5nLCB2aWRlb1R5cGU6IHN0cmluZywgZGlyOiBzdHJpbmcgPSAndmlkZW9zJyk6IHN0cmluZyA9PiB7XG4gIGxldCBmaWxlbmFtZTogc3RyaW5nID0gdmlkZW9JZDtcblxuICBzd2l0Y2godmlkZW9UeXBlKSB7XG4gICAgY2FzZSAndmlkZW8vd2VibSc6XG4gICAgICBmaWxlbmFtZSA9IGAke3ZpZGVvSWR9LndlYm1gO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmlkZW8vcXVpY2t0aW1lJzpcbiAgICAgIGZpbGVuYW1lID0gYCR7dmlkZW9JZH0ubW92YDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmaWxlbmFtZSA9IGAke3ZpZGVvSWR9Lm1wNGA7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBgdXNlcnMvJHt1c2VySWR9LyR7ZGlyfS8ke2ZpbGVuYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwVmlkZW9VcmwgPSAoe1xuICBidWNrZXQsXG4gIGRpcmVjdG9yeSA9ICd2aWRlb3MnLFxuICBpc1RodW1iID0gZmFsc2UsXG4gIHR5cGUsXG4gIHR5cGVJZCxcbiAgdmlkZW9JZFxufTogVmlkZW9VcmxEYXRhKTogc3RyaW5nID0+IHtcbiAgaWYoIXR5cGUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZighdmlkZW9JZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJ1Y2tldE5hbWUgPSBidWNrZXQgfHwgQ29uZmlnLmdldCgnaW1hZ2UuYnVja2V0JykgfHwgJ2Rldi5yZWFrdG9yLmlvJztcbiAgY29uc3QgdmlkZW9OYW1lID0gYCR7dmlkZW9JZH0ubXA0YDtcbiAgY29uc3QgdmlkZW9VcmwgPSBDb25maWcuZ2V0KCdpbWFnZS51cmwnKSB8fCBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLyR7YnVja2V0TmFtZX1gO1xuXG4gIGlmKHR5cGUgPT09ICdhcHBzJykge1xuICAgIHJldHVybiBgJHt2aWRlb1VybH0vJHt0eXBlfS8ke2RpcmVjdG9yeX0vJHt2aWRlb05hbWV9YDtcbiAgfVxuXG4gIHJldHVybiBgJHt2aWRlb1VybH0vJHt0eXBlfS8ke3R5cGVJZH0vJHtkaXJlY3Rvcnl9LyR7dmlkZW9OYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmlkZW9VcmwgPSBhc3luYyAoe1xuICBidWNrZXQsXG4gIGltYWdlRGlyID0gJ3ZpZGVvcycsXG4gIHZpZGVvRGlyID0gJ3ZpZGVvcycsXG4gIHZpZGVvSWQsXG4gIHR5cGUsXG4gIHR5cGVJZCxcbiAgdXJsVHlwZSA9ICdwdWJsaWMnXG59OiBhbnkpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZighdmlkZW9JZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGtleURpciA9IHZpZGVvRGlyIHx8IGltYWdlRGlyIHx8ICd2aWRlb3MnO1xuICBjb25zdCB2aWRlb0tleTogc3RyaW5nID0gYCR7dHlwZX0vJHt0eXBlSWR9LyR7a2V5RGlyfS8ke3ZpZGVvSWR9Lm1wNGA7XG5cbiAgc3dpdGNoKHVybFR5cGUpIHtcbiAgICBjYXNlICdzaWduZWQnOiB7XG4gICAgICBjb25zdCBkZWZhdWx0QnVja2V0ID0gQ29uZmlnLmdldCgnaW1hZ2UuYnVja2V0JykgfHwgJ2Rldi5yZWFrdG9yLmlvJztcbiAgICAgIHJldHVybiBhd2FpdCBzM0dldFNpZ25lZFVybCh7QnVja2V0OiBidWNrZXQgfHwgZGVmYXVsdEJ1Y2tldCwgRXhwaXJlczogOTAwLCBLZXk6IHZpZGVvS2V5fSk7XG4gICAgfVxuICAgIGNhc2UgJ3B1YmxpYyc6IHtcbiAgICAgIHJldHVybiBgaHR0cHM6Ly9ib3guJHtDb25maWcuZ2V0KCdhcHAudXJsJyl9LyR7dmlkZW9LZXl9YDtcbiAgICB9XG4gICAgY2FzZSAnZGV2Jzoge1xuICAgICAgcmV0dXJuIGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vZGV2LiR7Q29uZmlnLmdldCgnYXBwLnVybCcpfS8ke3ZpZGVvS2V5fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzYXZlVmlkZW8gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHZpZGVvSWQ6IHN0cmluZyxcbiAgYnVmZmVyOiBCdWZmZXIsXG4gIGZpbGVUeXBlOiBzdHJpbmcgPSAndmlkZW8vbXA0JywgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHZpZGVvT2JqOiBQdXRPYmplY3RDb21tYW5kSW5wdXQgPSB7XG4gICAgQUNMOiAnYXV0aGVudGljYXRlZC1yZWFkJyxcbiAgICBCb2R5OiBidWZmZXIsXG4gICAgQnVja2V0OiBudWxsLFxuICAgIENvbnRlbnRUeXBlOiBmaWxlVHlwZSxcbiAgICAuLi4oczNPcHRpb25zIHx8IHt9KSxcbiAgICBLZXk6IGdldFBhdGhVc2VyVmlkZW9zKHNlc3Npb25JZCwgdmlkZW9JZCwgZmlsZVR5cGUsICd2aWRlb3MnKVxuICB9O1xuXG4gIGF3YWl0IHMzUHV0KHZpZGVvT2JqKTtcblxuICByZXR1cm4ge1xuICAgIGZpbGVTaXplOiBidWZmZXIubGVuZ3RoLFxuICAgIGZpbGVUeXBlLFxuICAgIHZpZGVvSWRcbiAgfSBhcyB1bmtub3duIGFzIFZpZGVvVHlwZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRWaWRlbyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdmlkZW86IFZpZGVvVHlwZSxcbiAgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRWaWRlbyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge3ZpZGVvSWQsIGRlc2NyaXB0aW9uLCBidWZmZXIsIGZpbGVUeXBlLCB0eXBlID0gJ3ZpZGVvJywgcHJvdmlkZXIsIGV4dGVybmFsSWQsIGV4dGVybmFsVXJsfSA9IHZpZGVvO1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG5cbiAgaWYodHlwZSA9PT0gJ2V4dGVybmFsJykge1xuICAgIGNvbnN0IGluc2VydDogVmlkZW9UeXBlID0ge1xuICAgICAgX2tleTogdmlkZW9JZCxcbiAgICAgIGFkZGVkOiBub3csXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGV4dGVybmFsSWQsXG4gICAgICBleHRlcm5hbFVybCxcbiAgICAgIHByb3ZpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgfSBhcyBWaWRlb1R5cGU7XG5cbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdmlkZW9zIFJFVFVSTiBORVdgO1xuICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfVxuXG4gIHJldHVybiBzYXZlVmlkZW8oY29udGV4dCwgdmlkZW9JZCwgYnVmZmVyLCBmaWxlVHlwZSwgczNPcHRpb25zKVxuICAgIC50aGVuKChzYXZlZDogVmlkZW9UeXBlKSA9PiB7XG4gICAgICBjb25zdCBpbnNlcnQ6IFZpZGVvVHlwZSA9IHtcbiAgICAgICAgLi4uc2F2ZWQsXG4gICAgICAgIF9rZXk6IHZpZGVvSWQsXG4gICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH0gYXMgVmlkZW9UeXBlO1xuXG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdmlkZW9zIFJFVFVSTiBORVdgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVmlkZW9FZGdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHZpZGVvRWRnZTogVmlkZW9FZGdlVHlwZSk6IFByb21pc2U8b2JqZWN0PiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFZpZGVvRWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge3ZpZGVvSWQsIGl0ZW1JZCwgaXRlbVR5cGV9ID0gdmlkZW9FZGdlO1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgaGFzVmlkZW8tJHt2aWRlb0lkfS0ke2l0ZW1JZH0tJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBBcmFuZ29EYkNvbGxlY3Rpb24gPSBwYXJzZUNoYXIoaXRlbVR5cGUpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgaXRlbURvY0lkOiBzdHJpbmcgPSBnZXREb2NJZChmb3JtYXRJdGVtVHlwZSwge19rZXk6IGZvcm1hdEl0ZW1JZH0pO1xuICBjb25zdCBmb3JtYXRWaWRlb0lkOiBzdHJpbmcgPSBwYXJzZUlkKHZpZGVvSWQpO1xuICBjb25zdCBmaWxlRG9jSWQ6IHN0cmluZyA9IGB2aWRlb3MvJHtmb3JtYXRWaWRlb0lkfWA7XG5cbiAgY29uc3QgZWRnZTogVmlkZW9FZGdlVHlwZSA9IHtcbiAgICBfZnJvbTogaXRlbURvY0lkLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGZpbGVEb2NJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGl0ZW1UeXBlXG4gIH0gYXMgVmlkZW9FZGdlVHlwZTtcblxuICBpZihpdGVtRG9jSWQpIHtcbiAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKCdoYXNWaWRlbycpLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgICAudGhlbigoZmlsZUVkZ2UpID0+IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaGFzVmlkZW8nKS5kb2N1bWVudChmaWxlRWRnZSkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVZpZGVvID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB2aWRlbzogVmlkZW9UeXBlLFxuICBzM09wdGlvbnM/OiBQdXRPYmplY3RDb21tYW5kSW5wdXRcbik6IFByb21pc2U8VmlkZW9UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZVZpZGVvJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgYmFzZTY0ID0gJycsXG4gICAgYnVmZmVyOiB2aWRlb0J1ZmZlcixcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxuICAgIGV4dGVybmFsSWQsXG4gICAgZXh0ZXJuYWxVcmwsXG4gICAgZmlsZVR5cGUsXG4gICAgaXRlbUlkLFxuICAgIGl0ZW1UeXBlLFxuICAgIHByb3ZpZGVyLFxuICAgIHR5cGUsXG4gICAgdXJsID0gJycsXG4gICAgdmlkZW9JZFxuICB9ID0gdmlkZW87XG5cbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRWaWRlb0lkOiBzdHJpbmcgPSB2aWRlb0lkIHx8IGNyZWF0ZUhhc2goYHZpZGVvLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0SXRlbVR5cGU6IEFyYW5nb0RiQ29sbGVjdGlvbiA9IHBhcnNlQ2hhcihpdGVtVHlwZSwgMTYpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uO1xuXG4gIGlmKHR5cGUgPT09ICdleHRlcm5hbCcgJiYgKGV4dGVybmFsSWQgfHwgZXh0ZXJuYWxVcmwpKSB7XG4gICAgY29uc3QgaW5zZXJ0OiBWaWRlb1R5cGUgPSB7XG4gICAgICBfa2V5OiBmb3JtYXRWaWRlb0lkLFxuICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZXh0ZXJuYWxJZCxcbiAgICAgIGV4dGVybmFsVXJsLFxuICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgIHByb3ZpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgfSBhcyBWaWRlb1R5cGU7XG4gICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge19rZXk6ICR7Zm9ybWF0VmlkZW9JZH19IElOU0VSVCAke2luc2VydH0gVVBEQVRFICR7aW5zZXJ0fSBJTiB2aWRlb3MgUkVUVVJOIE5FV2A7XG4gICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC50aGVuKChuZXdWaWRlbzogVmlkZW9UeXBlKSA9PiB7XG4gICAgICAgIGlmKGZvcm1hdEl0ZW1JZCAmJiBmb3JtYXRJdGVtVHlwZSkge1xuICAgICAgICAgIGNvbnN0IHZpZGVvRWRnZTogVmlkZW9FZGdlVHlwZSA9IHt2aWRlb0lkOiBmb3JtYXRWaWRlb0lkLCBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCwgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlfTtcbiAgICAgICAgICByZXR1cm4gYWRkVmlkZW9FZGdlKGNvbnRleHQsIHZpZGVvRWRnZSkudGhlbigoKSA9PiBuZXdWaWRlbyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1ZpZGVvO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9XG5cbiAgaWYoYmFzZTY0IHx8IHZpZGVvQnVmZmVyKSB7XG4gICAgbGV0IGJ1ZmZlcjogQnVmZmVyID0gdmlkZW9CdWZmZXIgYXMgQnVmZmVyO1xuICAgIGlmKGJhc2U2NCkge1xuICAgICAgY29uc3QgZm9ybWF0QmFzZTY0OiBzdHJpbmcgPSBiYXNlNjQuc3Vic3RyKGJhc2U2NC5pbmRleE9mKCcsJykgKyAxKTtcbiAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGZvcm1hdEJhc2U2NCwgJ2Jhc2U2NCcpO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVkRmlsZVR5cGUgPSBmaWxlVHlwZTtcbiAgICBpZighZmlsZVR5cGUpIHtcbiAgICAgIGNvbnN0IHtmaWxlVHlwZUZyb21CdWZmZXJ9ID0gYXdhaXQgaW1wb3J0KCdmaWxlLXR5cGUnKTtcbiAgICAgIGNvbnN0IHttaW1lfSA9IGF3YWl0IGZpbGVUeXBlRnJvbUJ1ZmZlcihidWZmZXIpO1xuICAgICAgdXBkYXRlZEZpbGVUeXBlID0gbWltZTtcbiAgICB9XG5cbiAgICBjb25zdCB2UGFyYW1zOiBWaWRlb1R5cGUgPSB7YnVmZmVyLCBmaWxlVHlwZTogdXBkYXRlZEZpbGVUeXBlLCB1c2VySWQ6IHNlc3Npb25JZCwgdmlkZW9JZDogZm9ybWF0VmlkZW9JZH0gYXMgVmlkZW9UeXBlO1xuICAgIHJldHVybiBhZGRWaWRlbyhjb250ZXh0LCB7Li4udlBhcmFtcywgZGVzY3JpcHRpb259LCBzM09wdGlvbnMpXG4gICAgICAudGhlbigobmV3VmlkZW86IFZpZGVvVHlwZSkgPT4ge1xuICAgICAgICBpZihmb3JtYXRJdGVtSWQgJiYgZm9ybWF0SXRlbVR5cGUpIHtcbiAgICAgICAgICBjb25zdCB2aWRlb0VkZ2U6IFZpZGVvRWRnZVR5cGUgPSB7dmlkZW9JZDogZm9ybWF0VmlkZW9JZCwgaXRlbUlkOiBmb3JtYXRJdGVtSWQsIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZX07XG4gICAgICAgICAgcmV0dXJuIGFkZFZpZGVvRWRnZShjb250ZXh0LCB2aWRlb0VkZ2UpLnRoZW4oKCkgPT4gbmV3VmlkZW8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdWaWRlbztcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfSBlbHNlIGlmKHVybCAhPT0gJycpIHtcbiAgICBsZXQgY29udGVudFR5cGU7XG4gICAgcmV0dXJuIGh0dHBHZXQodXJsKVxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklNQUdFX1JFUVVFU1QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuYnVmZmVyKCkpXG4gICAgICAudGhlbigoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgICAgY29uc3QgdlBhcmFtczogVmlkZW9UeXBlID0ge2J1ZmZlciwgZGVzY3JpcHRpb24sIGZpbGVUeXBlOiBjb250ZW50VHlwZSwgdXNlcklkOiBzZXNzaW9uSWQsIHZpZGVvSWQ6IGZvcm1hdFZpZGVvSWR9IGFzIFZpZGVvVHlwZTtcbiAgICAgICAgcmV0dXJuIGFkZFZpZGVvKGNvbnRleHQsIHZQYXJhbXMsIHMzT3B0aW9ucylcbiAgICAgICAgICAudGhlbigobmV3VmlkZW86IFZpZGVvVHlwZSkgPT4ge1xuICAgICAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZpZGVvRWRnZTogVmlkZW9FZGdlVHlwZSA9IHt2aWRlb0lkOiBmb3JtYXRWaWRlb0lkLCBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCwgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFkZFZpZGVvRWRnZShjb250ZXh0LCB2aWRlb0VkZ2UpLnRoZW4oKCkgPT4gbmV3VmlkZW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld1ZpZGVvO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9IGVsc2UgaWYodmlkZW9JZCAhPT0gJycpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7ZGVzY3JpcHRpb24sIG1vZGlmaWVkOiBub3d9O1xuICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFIHtfa2V5OiAke2Zvcm1hdFZpZGVvSWR9fSBXSVRIICR7dXBkYXRlfSBJTiB2aWRlb3MgUkVUVVJOIE5FV2A7XG4gICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGwgYXMgdW5rbm93biBhcyBWaWRlb1R5cGU7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVmlkZW8gPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdmlkZW9JZDogc3RyaW5nKTogUHJvbWlzZTxWaWRlb1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZGVsZXRlVmlkZW8nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFZpZGVvSWQgPSBwYXJzZUlkKHZpZGVvSWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgdmlkZW9Eb2NJZCA9IGB2aWRlb3MvJHtmb3JtYXRWaWRlb0lkfWA7XG4gICAgY29uc3QgcmVtb3ZlRWRnZVF1ZXJ5ID0gYXFsYEZPUiBodiBJTiBoYXNWaWRlbyBGSUxURVIgaHYuX3RvID09ICR7dmlkZW9Eb2NJZH0gUkVNT1ZFIGh2IElOIGhhc1ZpZGVvIFJFVFVSTiBPTERgO1xuICAgIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkocmVtb3ZlRWRnZVF1ZXJ5KTtcblxuICAgIGNvbnN0IGFxbFF1ZXJ5ID0gYXFsYEZPUiB2IElOIHZpZGVvcyBGSUxURVIgdi5fa2V5ID09ICR7Zm9ybWF0VmlkZW9JZH0gJiYgdi51c2VySWQgPT0gJHtzZXNzaW9uSWR9IFJFTU9WRSB2IElOIHZpZGVvcyBSRVRVUk4gT0xEYDtcbiAgICBjb25zdCB2aWRlbyA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgICBpZih2aWRlbykge1xuICAgICAgY29uc3Qge19rZXk6IHZLZXl9ID0gdmlkZW87XG4gICAgICBjb25zdCBwYXJhbXM6IERlbGV0ZU9iamVjdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICAgIEJ1Y2tldDogbnVsbCxcbiAgICAgICAgRGVsZXRlOiB7XG4gICAgICAgICAgT2JqZWN0czogW1xuICAgICAgICAgICAge0tleTogYHVzZXJzLyR7c2Vzc2lvbklkfS92aWRlb3MvJHt2S2V5fS5tcDRgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgUXVpZXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBzM0RlbGV0ZUxpc3QocGFyYW1zKS50aGVuKCgpID0+IHZpZGVvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbCBhcyB1bmtub3duIGFzIFZpZGVvVHlwZTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IgYXMgRXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5cbiJdLCJuYW1lcyI6WyJnZXQiLCJodHRwR2V0IiwiY3JlYXRlSGFzaCIsInBhcnNlQXJhbmdvSWQiLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwiYXFsIiwiQ29uZmlnIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwiZ2V0RG9jSWQiLCJnZXRMaW1pdCIsInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCJ1c2VEYiIsInMzRGVsZXRlTGlzdCIsInMzR2V0U2lnbmVkVXJsIiwiczNQdXQiLCJldmVudENhdGVnb3J5IiwicGFyc2VWaWRlb09wdGlvbnMiLCJvcHRpb25zIiwiZnJvbSIsInRvIiwidHlwZSIsImxpbWl0IiwiZ2V0VmlkZW9PcHRpb25hbCIsImZpZWxkcyIsInJlZHVjZSIsInNlbGVjdHMiLCJmaWVsZCIsImluY2x1ZGVzIiwicXVlcmllcyIsInB1c2giLCJvYmplY3RzIiwiZ2V0VmlkZW9zQnlVc2VyIiwiY29udGV4dCIsInVzZXJJZCIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsImZvcm1hdFVzZXJJZCIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImFsbCIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsInZhbHVlIiwiREFUQUJBU0VfRVJST1IiLCJnZXRWaWRlb0NvdW50QnlJdGVtIiwiaXRlbUlkIiwiZm9ybWF0SXRlbUlkIiwibmV4dCIsImNvdW50IiwiZ2V0VmlkZW9zQnlJdGVtIiwic2VsZWN0T2JqZWN0cyIsInNlbGVjdFF1ZXJpZXMiLCJqb2luIiwiZ2V0VmlkZW8iLCJ2aWRlb0lkIiwiZm9ybWF0VmlkZW9JZCIsImdldFBhdGhVc2VyVmlkZW9zIiwidmlkZW9UeXBlIiwiZGlyIiwiZmlsZW5hbWUiLCJnZXRBcHBWaWRlb1VybCIsImJ1Y2tldCIsImRpcmVjdG9yeSIsImlzVGh1bWIiLCJ0eXBlSWQiLCJidWNrZXROYW1lIiwidmlkZW9OYW1lIiwidmlkZW9VcmwiLCJnZXRWaWRlb1VybCIsImltYWdlRGlyIiwidmlkZW9EaXIiLCJ1cmxUeXBlIiwia2V5RGlyIiwidmlkZW9LZXkiLCJkZWZhdWx0QnVja2V0IiwiQnVja2V0IiwiRXhwaXJlcyIsIktleSIsInNhdmVWaWRlbyIsImJ1ZmZlciIsImZpbGVUeXBlIiwiczNPcHRpb25zIiwic2Vzc2lvbiIsInNlc3Npb25JZCIsInZpZGVvT2JqIiwiQUNMIiwiQm9keSIsIkNvbnRlbnRUeXBlIiwiZmlsZVNpemUiLCJsZW5ndGgiLCJhZGRWaWRlbyIsInZpZGVvIiwiZGVzY3JpcHRpb24iLCJwcm92aWRlciIsImV4dGVybmFsSWQiLCJleHRlcm5hbFVybCIsIm5vdyIsIkRhdGUiLCJpbnNlcnQiLCJfa2V5IiwiYWRkZWQiLCJzYXZlZCIsIm1vZGlmaWVkIiwiYWRkVmlkZW9FZGdlIiwidmlkZW9FZGdlIiwiaXRlbVR5cGUiLCJlZGdlSWQiLCJmb3JtYXRJdGVtVHlwZSIsInRvTG93ZXJDYXNlIiwiaXRlbURvY0lkIiwiZmlsZURvY0lkIiwiZWRnZSIsIl9mcm9tIiwiX3RvIiwiY29sbGVjdGlvbiIsInNhdmUiLCJyZXR1cm5OZXciLCJmaWxlRWRnZSIsImRvY3VtZW50IiwidXBkYXRlVmlkZW8iLCJiYXNlNjQiLCJ2aWRlb0J1ZmZlciIsInVybCIsIm5ld1ZpZGVvIiwiZm9ybWF0QmFzZTY0Iiwic3Vic3RyIiwiaW5kZXhPZiIsIkJ1ZmZlciIsInVwZGF0ZWRGaWxlVHlwZSIsImZpbGVUeXBlRnJvbUJ1ZmZlciIsIm1pbWUiLCJ2UGFyYW1zIiwiY29udGVudFR5cGUiLCJyZXMiLCJzdGF0dXMiLCJFcnJvciIsIklNQUdFX1JFUVVFU1QiLCJoZWFkZXJzIiwidXBkYXRlIiwiZGVsZXRlVmlkZW8iLCJ2aWRlb0RvY0lkIiwicmVtb3ZlRWRnZVF1ZXJ5IiwiYXFsUXVlcnkiLCJ2S2V5IiwicGFyYW1zIiwiRGVsZXRlIiwiT2JqZWN0cyIsIlF1aWV0Il0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FFRCxTQUFRQSxPQUFPQyxPQUFPLFFBQU8sb0JBQW9CO0FBQ2pELFNBQVFDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sUUFBTywrQkFBK0I7QUFDM0YsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFHN0IsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUNuRCxTQUFRQyxRQUFRLFFBQU8sNkJBQTZCO0FBQ3BELFNBQVFDLFFBQVEsRUFBRUMsUUFBUSxFQUFFQyx5QkFBeUIsRUFBRUMsS0FBSyxRQUFPLDRCQUE0QjtBQUMvRixTQUFRQyxZQUFZLEVBQUVDLGNBQWMsRUFBRUMsS0FBSyxRQUFPLFVBQVU7QUFNNUQsTUFBTUMsZ0JBQXdCO0FBRTlCLE9BQU8sTUFBTUMsb0JBQW9CLENBQUNDLFVBQXdCLENBQUMsQ0FBQztJQUMxRCxNQUFNLEVBQUNDLE9BQU8sQ0FBQyxFQUFFQyxLQUFLLEVBQUUsRUFBRUMsT0FBTyxTQUFTLEVBQUMsR0FBR0g7SUFFOUMsT0FBTztRQUNMSSxPQUFPWixTQUFTUyxNQUFNQztRQUN0QkMsTUFBTWxCLFVBQVVrQixNQUFNO0lBQ3hCO0FBQ0YsRUFBRTtBQUVGLE9BQU8sTUFBTUUsbUJBQW1CLENBQUNDLFNBQW1CLEVBQUUsR0FDcERBLE9BQU9DLE1BQU0sQ0FBQyxDQUFDQyxTQUFTQztRQUN0QixJQUFHQSxNQUFNQyxRQUFRLENBQUMsVUFBVTtZQUMxQixPQUFPakIsMEJBQTBCLFVBQVUsS0FBS2dCLE9BQU9EO1FBQ3pEO1FBRUEsT0FBT0M7WUFDTCxLQUFLO2dCQUFhO29CQUNoQkQsUUFBUUcsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxnTEFBZ0wsQ0FBQztvQkFDdk1KLFFBQVFLLE9BQU8sQ0FBQ0QsSUFBSSxDQUFDO29CQUNyQixPQUFPSjtnQkFDVDtZQUNBLEtBQUs7Z0JBQVE7b0JBQ1hBLFFBQVFHLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUMseURBQXlELENBQUM7b0JBQ2hGSixRQUFRSyxPQUFPLENBQUNELElBQUksQ0FBQztvQkFDckIsT0FBT0o7Z0JBQ1Q7WUFDQSxLQUFLO2dCQUFTO29CQUNaQSxRQUFRRyxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDLDRFQUE0RSxDQUFDO29CQUNuR0osUUFBUUssT0FBTyxDQUFDRCxJQUFJLENBQUM7b0JBQ3JCLE9BQU9KO2dCQUNUO1lBQ0E7Z0JBQVM7b0JBQ1AsT0FBT0E7Z0JBQ1Q7UUFDRjtJQUNGLEdBQUc7UUFBQ0ssU0FBUyxFQUFFO1FBQUVGLFNBQVMsRUFBRTtJQUFBLEdBQUc7QUFFakMsT0FBTyxNQUFNRyxrQkFBa0IsQ0FDN0JDLFNBQ0FDLFFBQ0FmLE9BQWUsQ0FBQyxFQUNoQkMsS0FBYSxFQUFFO0lBRWYsTUFBTWUsU0FBaUI7SUFDdkIsTUFBTSxFQUFDQyxZQUFZLEVBQUMsR0FBR0g7SUFDdkIsTUFBTUksZUFBdUJqQyxRQUFROEI7SUFDckMsTUFBTVosUUFBdUJaLFNBQVNTLE1BQU1DO0lBQzVDLE1BQU1rQixTQUFpQixDQUFDOzBCQUNBLEVBQUVELGFBQWE7O01BRW5DLEVBQUVmLE1BQU1qQixHQUFHLENBQUM7O2tDQUVnQixDQUFDO0lBRWpDLE9BQU9PLE1BQU13QixjQUFjRyxLQUFLLENBQUNELFFBQzlCRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsR0FBRyxJQUMzQkMsS0FBSyxDQUFDLENBQUNDO1FBQ05wQyxTQUFTO1lBQ1AyQjtZQUNBVSxVQUFVN0I7WUFDVjhCLE9BQU92QyxXQUFXd0MsY0FBYztRQUNsQyxHQUFHSCxPQUFPWDtRQUNWLE9BQU8sRUFBRTtJQUNYO0FBQ0osRUFBRTtBQUVGLE9BQU8sTUFBTWUsc0JBQXNCLENBQUNmLFNBQXFCZ0I7SUFDdkQsTUFBTWQsU0FBaUI7SUFDdkIsTUFBTSxFQUFDQyxZQUFZLEVBQUMsR0FBR0g7SUFDdkIsTUFBTWlCLGVBQXVCaEQsY0FBYytDO0lBQzNDLE1BQU1YLFNBQW1CakMsR0FBRyxDQUFDLGtDQUFrQyxFQUFFNkMsYUFBYSx5QkFBeUIsQ0FBQztJQUV4RyxPQUFPdEMsTUFBTXdCLGNBQWNHLEtBQUssQ0FBQ0QsUUFDOUJFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPVSxJQUFJLElBQzVCWCxJQUFJLENBQUMsQ0FBQyxFQUFDWSxLQUFLLEVBQUMsR0FBS0EsT0FDbEJULEtBQUssQ0FBQyxDQUFDQyxRQUFpQnBDLFNBQVM7WUFDaEMyQjtZQUNBVSxVQUFVN0I7WUFDVjhCLE9BQU92QyxXQUFXd0MsY0FBYztRQUNsQyxHQUFHSCxPQUFPWDtBQUNkLEVBQUU7QUFFRixPQUFPLE1BQU1vQixrQkFBa0IsT0FDN0JwQixTQUNBZ0IsUUFDQS9CLFVBQXdCLENBQUMsQ0FBQztJQUUxQixNQUFNaUIsU0FBaUI7SUFDdkIsTUFBTSxFQUFDQyxZQUFZLEVBQUVaLFNBQVMsRUFBRSxFQUFDLEdBQUdTO0lBQ3BDLE1BQU1pQixlQUF1QmhELGNBQWMrQztJQUMzQyxNQUFNLEVBQUMzQixLQUFLLEVBQUMsR0FBR0wsa0JBQWtCQztJQUNsQyxNQUFNLEVBQUNhLFNBQVN1QixhQUFhLEVBQUV6QixTQUFTMEIsYUFBYSxFQUFDLEdBQUdoQyxpQkFBaUJDO0lBQzFFLE1BQU1jLFNBQWlCLENBQUMsMkJBQTJCLEVBQUVZLGFBQWE7O0lBRWhFLEVBQUVLLGNBQWNDLElBQUksQ0FBQyxNQUFNOztJQUUzQixFQUFFbEMsTUFBTWpCLEdBQUcsQ0FBQztxQkFDSyxFQUFFaUQsY0FBY0UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRWpELE9BQU81QyxNQUFNd0IsY0FBY0csS0FBSyxDQUFDRCxRQUM5QkUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLEdBQUcsSUFDM0JDLEtBQUssQ0FBQyxDQUFDQztRQUNOcEMsU0FBUztZQUNQMkI7WUFDQVUsVUFBVTdCO1lBQ1Y4QixPQUFPdkMsV0FBV3dDLGNBQWM7UUFDbEMsR0FBR0gsT0FBT1g7UUFDVixPQUFPLEVBQUU7SUFDWDtBQUNKLEVBQUU7QUFFRixPQUFPLE1BQU13QixXQUFXLENBQUN4QixTQUFxQnlCO0lBQzVDLE1BQU12QixTQUFpQjtJQUN2QixNQUFNLEVBQUNDLFlBQVksRUFBQyxHQUFHSDtJQUN2QixNQUFNMEIsZ0JBQXdCdkQsUUFBUXNEO0lBQ3RDLE1BQU1wQixTQUFtQmpDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRXNELGNBQWMsaUJBQWlCLENBQUM7SUFFOUYsT0FBTy9DLE1BQU13QixjQUFjRyxLQUFLLENBQUNELFFBQzlCRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT1UsSUFBSSxJQUM1QlIsS0FBSyxDQUFDLENBQUNDLFFBQWlCcEMsU0FBUztZQUNoQzJCO1lBQ0FVLFVBQVU3QjtZQUNWOEIsT0FBT3ZDLFdBQVd3QyxjQUFjO1FBQ2xDLEdBQUdILE9BQU9YO0FBQ2QsRUFBRTtBQUVGLE9BQU8sTUFBTTJCLG9CQUFvQixDQUFDMUIsUUFBZ0J3QixTQUFpQkcsV0FBbUJDLE1BQWMsUUFBUTtJQUMxRyxJQUFJQyxXQUFtQkw7SUFFdkIsT0FBT0c7UUFDTCxLQUFLO1lBQ0hFLFdBQVcsR0FBR0wsUUFBUSxLQUFLLENBQUM7WUFDNUI7UUFDRixLQUFLO1lBQ0hLLFdBQVcsR0FBR0wsUUFBUSxJQUFJLENBQUM7WUFDM0I7UUFDRjtZQUNFSyxXQUFXLEdBQUdMLFFBQVEsSUFBSSxDQUFDO1lBQzNCO0lBQ0o7SUFFQSxPQUFPLENBQUMsTUFBTSxFQUFFeEIsT0FBTyxDQUFDLEVBQUU0QixJQUFJLENBQUMsRUFBRUMsVUFBVTtBQUM3QyxFQUFFO0FBRUYsT0FBTyxNQUFNQyxpQkFBaUIsQ0FBQyxFQUM3QkMsTUFBTSxFQUNOQyxZQUFZLFFBQVEsRUFDcEJDLFVBQVUsS0FBSyxFQUNmOUMsSUFBSSxFQUNKK0MsTUFBTSxFQUNOVixPQUFPLEVBQ007SUFDYixJQUFHLENBQUNyQyxNQUFNO1FBQ1IsT0FBTztJQUNUO0lBRUEsSUFBRyxDQUFDcUMsU0FBUztRQUNYLE9BQU87SUFDVDtJQUVBLE1BQU1XLGFBQWFKLFVBQVUzRCxPQUFPUCxHQUFHLENBQUMsbUJBQW1CO0lBQzNELE1BQU11RSxZQUFZLEdBQUdaLFFBQVEsSUFBSSxDQUFDO0lBQ2xDLE1BQU1hLFdBQVdqRSxPQUFPUCxHQUFHLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEVBQUVzRSxZQUFZO0lBRXBGLElBQUdoRCxTQUFTLFFBQVE7UUFDbEIsT0FBTyxHQUFHa0QsU0FBUyxDQUFDLEVBQUVsRCxLQUFLLENBQUMsRUFBRTZDLFVBQVUsQ0FBQyxFQUFFSSxXQUFXO0lBQ3hEO0lBRUEsT0FBTyxHQUFHQyxTQUFTLENBQUMsRUFBRWxELEtBQUssQ0FBQyxFQUFFK0MsT0FBTyxDQUFDLEVBQUVGLFVBQVUsQ0FBQyxFQUFFSSxXQUFXO0FBQ2xFLEVBQUU7QUFFRixPQUFPLE1BQU1FLGNBQWMsT0FBTyxFQUNoQ1AsTUFBTSxFQUNOUSxXQUFXLFFBQVEsRUFDbkJDLFdBQVcsUUFBUSxFQUNuQmhCLE9BQU8sRUFDUHJDLElBQUksRUFDSitDLE1BQU0sRUFDTk8sVUFBVSxRQUFRLEVBQ2Q7SUFDSixJQUFHLENBQUNqQixTQUFTO1FBQ1gsT0FBTztJQUNUO0lBRUEsTUFBTWtCLFNBQVNGLFlBQVlELFlBQVk7SUFDdkMsTUFBTUksV0FBbUIsR0FBR3hELEtBQUssQ0FBQyxFQUFFK0MsT0FBTyxDQUFDLEVBQUVRLE9BQU8sQ0FBQyxFQUFFbEIsUUFBUSxJQUFJLENBQUM7SUFFckUsT0FBT2lCO1FBQ0wsS0FBSztZQUFVO2dCQUNiLE1BQU1HLGdCQUFnQnhFLE9BQU9QLEdBQUcsQ0FBQyxtQkFBbUI7Z0JBQ3BELE9BQU8sTUFBTWUsZUFBZTtvQkFBQ2lFLFFBQVFkLFVBQVVhO29CQUFlRSxTQUFTO29CQUFLQyxLQUFLSjtnQkFBUTtZQUMzRjtRQUNBLEtBQUs7WUFBVTtnQkFDYixPQUFPLENBQUMsWUFBWSxFQUFFdkUsT0FBT1AsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFOEUsVUFBVTtZQUMzRDtRQUNBLEtBQUs7WUFBTztnQkFDVixPQUFPLENBQUMsNkJBQTZCLEVBQUV2RSxPQUFPUCxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU4RSxVQUFVO1lBQzVFO1FBQ0E7WUFBUztnQkFDUCxPQUFPO1lBQ1Q7SUFDRjtBQUNGLEVBQUU7QUFFRixPQUFPLE1BQU1LLFlBQVksT0FDdkJqRCxTQUNBeUIsU0FDQXlCLFFBQ0FDLFdBQW1CLFdBQVcsRUFBRUM7SUFFaEMsTUFBTSxFQUFDQyxTQUFTLEVBQUNwRCxRQUFRcUQsU0FBUyxFQUFDLEVBQUMsR0FBR3REO0lBRXZDLE1BQU11RCxXQUFrQztRQUN0Q0MsS0FBSztRQUNMQyxNQUFNUDtRQUNOSixRQUFRO1FBQ1JZLGFBQWFQO1FBQ2IsR0FBSUMsYUFBYSxDQUFDLENBQUM7UUFDbkJKLEtBQUtyQixrQkFBa0IyQixXQUFXN0IsU0FBUzBCLFVBQVU7SUFDdkQ7SUFFQSxNQUFNckUsTUFBTXlFO0lBRVosT0FBTztRQUNMSSxVQUFVVCxPQUFPVSxNQUFNO1FBQ3ZCVDtRQUNBMUI7SUFDRjtBQUNGLEVBQUU7QUFFRixPQUFPLE1BQU1vQyxXQUFXLENBQ3RCN0QsU0FDQThELE9BQ0FWO0lBRUEsTUFBTWxELFNBQWlCO0lBQ3ZCLE1BQU0sRUFBQ0MsWUFBWSxFQUFFa0QsU0FBUyxFQUFDcEQsUUFBUXFELFNBQVMsRUFBQyxFQUFDLEdBQUd0RDtJQUNyRCxNQUFNLEVBQUN5QixPQUFPLEVBQUVzQyxXQUFXLEVBQUViLE1BQU0sRUFBRUMsUUFBUSxFQUFFL0QsT0FBTyxPQUFPLEVBQUU0RSxRQUFRLEVBQUVDLFVBQVUsRUFBRUMsV0FBVyxFQUFDLEdBQUdKO0lBQ3BHLE1BQU1LLE1BQWNDLEtBQUtELEdBQUc7SUFFNUIsSUFBRy9FLFNBQVMsWUFBWTtRQUN0QixNQUFNaUYsU0FBb0I7WUFDeEJDLE1BQU03QztZQUNOOEMsT0FBT0o7WUFDUEo7WUFDQUU7WUFDQUM7WUFDQUY7WUFDQTVFO1lBQ0FhLFFBQVFxRDtRQUNWO1FBRUEsTUFBTWpELFNBQW1CakMsR0FBRyxDQUFDLE9BQU8sRUFBRWlHLE9BQU8scUJBQXFCLENBQUM7UUFDbkUsT0FBTzFGLE1BQU13QixjQUFjRyxLQUFLLENBQUNELFFBQzlCRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT1UsSUFBSSxJQUM1QlIsS0FBSyxDQUFDLENBQUNDLFFBQWlCcEMsU0FBUztnQkFDaEMyQjtnQkFDQVUsVUFBVTdCO2dCQUNWOEIsT0FBT3ZDLFdBQVd3QyxjQUFjO1lBQ2xDLEdBQUdILE9BQU9YO0lBQ2Q7SUFFQSxPQUFPaUQsVUFBVWpELFNBQVN5QixTQUFTeUIsUUFBUUMsVUFBVUMsV0FDbEQ3QyxJQUFJLENBQUMsQ0FBQ2lFO1FBQ0wsTUFBTUgsU0FBb0I7WUFDeEIsR0FBR0csS0FBSztZQUNSRixNQUFNN0M7WUFDTjhDLE9BQU9KO1lBQ1BKO1lBQ0FaO1lBQ0FzQixVQUFVTjtZQUNWL0U7WUFDQWEsUUFBUXFEO1FBQ1Y7UUFFQSxNQUFNakQsU0FBbUJqQyxHQUFHLENBQUMsT0FBTyxFQUFFaUcsT0FBTyxxQkFBcUIsQ0FBQztRQUVuRSxPQUFPMUYsTUFBTXdCLGNBQWNHLEtBQUssQ0FBQ0QsUUFDOUJFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPVSxJQUFJLElBQzVCUixLQUFLLENBQUMsQ0FBQ0MsUUFBaUJwQyxTQUFTO2dCQUNoQzJCO2dCQUNBVSxVQUFVN0I7Z0JBQ1Y4QixPQUFPdkMsV0FBV3dDLGNBQWM7WUFDbEMsR0FBR0gsT0FBT1g7SUFDZDtBQUNKLEVBQUU7QUFFRixPQUFPLE1BQU0wRSxlQUFlLE9BQU8xRSxTQUFxQjJFO0lBQ3RELE1BQU16RSxTQUFpQjtJQUN2QixNQUFNLEVBQUNDLFlBQVksRUFBRWtELFNBQVMsRUFBQ3BELFFBQVFxRCxTQUFTLEVBQUMsRUFBQyxHQUFHdEQ7SUFDckQsTUFBTSxFQUFDeUIsT0FBTyxFQUFFVCxNQUFNLEVBQUU0RCxRQUFRLEVBQUMsR0FBR0Q7SUFDcEMsTUFBTVIsTUFBY0MsS0FBS0QsR0FBRztJQUM1QixNQUFNVSxTQUFpQjdHLFdBQVcsQ0FBQyxTQUFTLEVBQUV5RCxRQUFRLENBQUMsRUFBRVQsT0FBTyxDQUFDLEVBQUVzQyxXQUFXO0lBQzlFLE1BQU13QixpQkFBcUM1RyxVQUFVMEcsVUFBVUcsV0FBVztJQUMxRSxNQUFNOUQsZUFBdUI5QyxRQUFRNkM7SUFDckMsTUFBTWdFLFlBQW9CeEcsU0FBU3NHLGdCQUFnQjtRQUFDUixNQUFNckQ7SUFBWTtJQUN0RSxNQUFNUyxnQkFBd0J2RCxRQUFRc0Q7SUFDdEMsTUFBTXdELFlBQW9CLENBQUMsT0FBTyxFQUFFdkQsZUFBZTtJQUVuRCxNQUFNd0QsT0FBc0I7UUFDMUJDLE9BQU9IO1FBQ1BWLE1BQU1PO1FBQ05PLEtBQUtIO1FBQ0xWLE9BQU9KO1FBQ1BTO0lBQ0Y7SUFFQSxJQUFHSSxXQUFXO1FBQ1osT0FBT3JHLE1BQU13QixjQUFja0YsVUFBVSxDQUFDLFlBQVlDLElBQUksQ0FBQ0osTUFBTTtZQUFDSyxXQUFXO1FBQUksR0FDMUVoRixJQUFJLENBQUMsQ0FBQ2lGLFdBQWE3RyxNQUFNd0IsY0FBY2tGLFVBQVUsQ0FBQyxZQUFZSSxRQUFRLENBQUNELFdBQ3ZFOUUsS0FBSyxDQUFDLENBQUNDLFFBQWlCcEMsU0FBUztnQkFDaEMyQjtnQkFDQVUsVUFBVTdCO2dCQUNWOEIsT0FBT3ZDLFdBQVd3QyxjQUFjO1lBQ2xDLEdBQUdILE9BQU9YO0lBQ2Q7SUFFQSxPQUFPO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTTBGLGNBQWMsT0FDekIxRixTQUNBOEQsT0FDQVY7SUFFQSxNQUFNbEQsU0FBaUI7SUFDdkIsTUFBTSxFQUFDQyxZQUFZLEVBQUVrRCxTQUFTLEVBQUNwRCxRQUFRcUQsU0FBUyxFQUFDLEVBQUMsR0FBR3REO0lBQ3JELE1BQU0sRUFDSjJGLFNBQVMsRUFBRSxFQUNYekMsUUFBUTBDLFdBQVcsRUFDbkI3QixjQUFjLEVBQUUsRUFDaEJFLFVBQVUsRUFDVkMsV0FBVyxFQUNYZixRQUFRLEVBQ1JuQyxNQUFNLEVBQ040RCxRQUFRLEVBQ1JaLFFBQVEsRUFDUjVFLElBQUksRUFDSnlHLE1BQU0sRUFBRSxFQUNScEUsT0FBTyxFQUNSLEdBQUdxQztJQUVKLE1BQU1LLE1BQWNDLEtBQUtELEdBQUc7SUFDNUIsTUFBTXpDLGdCQUF3QkQsV0FBV3pELFdBQVcsQ0FBQyxNQUFNLEVBQUVzRixXQUFXO0lBQ3hFLE1BQU1yQyxlQUF1QjlDLFFBQVE2QztJQUNyQyxNQUFNOEQsaUJBQXFDNUcsVUFBVTBHLFVBQVUsSUFBSUcsV0FBVztJQUU5RSxJQUFHM0YsU0FBUyxjQUFlNkUsQ0FBQUEsY0FBY0MsV0FBVSxHQUFJO1FBQ3JELE1BQU1HLFNBQW9CO1lBQ3hCQyxNQUFNNUM7WUFDTjZDLE9BQU9KO1lBQ1BKO1lBQ0FFO1lBQ0FDO1lBQ0FPLFVBQVVOO1lBQ1ZIO1lBQ0E1RTtZQUNBYSxRQUFRcUQ7UUFDVjtRQUNBLE1BQU1qRCxTQUFtQmpDLEdBQUcsQ0FBQyxjQUFjLEVBQUVzRCxjQUFjLFNBQVMsRUFBRTJDLE9BQU8sUUFBUSxFQUFFQSxPQUFPLHFCQUFxQixDQUFDO1FBQ3BILE9BQU8xRixNQUFNd0IsY0FBY0csS0FBSyxDQUFDRCxRQUM5QkUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9VLElBQUksSUFDNUJYLElBQUksQ0FBQyxDQUFDdUY7WUFDTCxJQUFHN0UsZ0JBQWdCNkQsZ0JBQWdCO2dCQUNqQyxNQUFNSCxZQUEyQjtvQkFBQ2xELFNBQVNDO29CQUFlVixRQUFRQztvQkFBYzJELFVBQVVFO2dCQUFjO2dCQUN4RyxPQUFPSixhQUFhMUUsU0FBUzJFLFdBQVdwRSxJQUFJLENBQUMsSUFBTXVGO1lBQ3JEO1lBQ0EsT0FBT0E7UUFDVCxHQUNDcEYsS0FBSyxDQUFDLENBQUNDLFFBQWlCcEMsU0FBUztnQkFDaEMyQjtnQkFDQVUsVUFBVTdCO2dCQUNWOEIsT0FBT3ZDLFdBQVd3QyxjQUFjO1lBQ2xDLEdBQUdILE9BQU9YO0lBQ2Q7SUFFQSxJQUFHMkYsVUFBVUMsYUFBYTtRQUN4QixJQUFJMUMsU0FBaUIwQztRQUNyQixJQUFHRCxRQUFRO1lBQ1QsTUFBTUksZUFBdUJKLE9BQU9LLE1BQU0sQ0FBQ0wsT0FBT00sT0FBTyxDQUFDLE9BQU87WUFDakUvQyxTQUFTZ0QsT0FBT2hILElBQUksQ0FBQzZHLGNBQWM7UUFDckM7UUFFQSxJQUFJSSxrQkFBa0JoRDtRQUN0QixJQUFHLENBQUNBLFVBQVU7WUFDWixNQUFNLEVBQUNpRCxrQkFBa0IsRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDO1lBQzFDLE1BQU0sRUFBQ0MsSUFBSSxFQUFDLEdBQUcsTUFBTUQsbUJBQW1CbEQ7WUFDeENpRCxrQkFBa0JFO1FBQ3BCO1FBRUEsTUFBTUMsVUFBcUI7WUFBQ3BEO1lBQVFDLFVBQVVnRDtZQUFpQmxHLFFBQVFxRDtZQUFXN0IsU0FBU0M7UUFBYTtRQUN4RyxPQUFPbUMsU0FBUzdELFNBQVM7WUFBQyxHQUFHc0csT0FBTztZQUFFdkM7UUFBVyxHQUFHWCxXQUNqRDdDLElBQUksQ0FBQyxDQUFDdUY7WUFDTCxJQUFHN0UsZ0JBQWdCNkQsZ0JBQWdCO2dCQUNqQyxNQUFNSCxZQUEyQjtvQkFBQ2xELFNBQVNDO29CQUFlVixRQUFRQztvQkFBYzJELFVBQVVFO2dCQUFjO2dCQUN4RyxPQUFPSixhQUFhMUUsU0FBUzJFLFdBQVdwRSxJQUFJLENBQUMsSUFBTXVGO1lBQ3JEO1lBQ0EsT0FBT0E7UUFDVCxHQUNDcEYsS0FBSyxDQUFDLENBQUNDLFFBQWlCcEMsU0FBUztnQkFDaEMyQjtnQkFDQVUsVUFBVTdCO2dCQUNWOEIsT0FBT3ZDLFdBQVd3QyxjQUFjO1lBQ2xDLEdBQUdILE9BQU9YO0lBQ2QsT0FBTyxJQUFHNkYsUUFBUSxJQUFJO1FBQ3BCLElBQUlVO1FBQ0osT0FBT3hJLFFBQVE4SCxLQUNadEYsSUFBSSxDQUFDLENBQUNpRztZQUNMLElBQUdBLElBQUlDLE1BQU0sS0FBSyxLQUFLO2dCQUNyQixNQUFNLElBQUlDLE1BQU1wSSxXQUFXcUksYUFBYTtZQUMxQztZQUNBSixjQUFjQyxJQUFJSSxPQUFPLENBQUM5SSxHQUFHLENBQUM7WUFDOUIsT0FBTzBJO1FBQ1QsR0FDQ2pHLElBQUksQ0FBQyxDQUFDaUcsTUFBUUEsSUFBSXRELE1BQU0sSUFDeEIzQyxJQUFJLENBQUMsQ0FBQzJDO1lBQ0wsTUFBTW9ELFVBQXFCO2dCQUFDcEQ7Z0JBQVFhO2dCQUFhWixVQUFVb0Q7Z0JBQWF0RyxRQUFRcUQ7Z0JBQVc3QixTQUFTQztZQUFhO1lBQ2pILE9BQU9tQyxTQUFTN0QsU0FBU3NHLFNBQVNsRCxXQUMvQjdDLElBQUksQ0FBQyxDQUFDdUY7Z0JBQ0wsSUFBRzdFLGdCQUFnQjZELGdCQUFnQjtvQkFDakMsTUFBTUgsWUFBMkI7d0JBQUNsRCxTQUFTQzt3QkFBZVYsUUFBUUM7d0JBQWMyRCxVQUFVRTtvQkFBYztvQkFDeEcsT0FBT0osYUFBYTFFLFNBQVMyRSxXQUFXcEUsSUFBSSxDQUFDLElBQU11RjtnQkFDckQ7Z0JBQ0EsT0FBT0E7WUFDVCxHQUNDcEYsS0FBSyxDQUFDLENBQUNDLFFBQWlCcEMsU0FBUztvQkFDaEMyQjtvQkFDQVUsVUFBVTdCO29CQUNWOEIsT0FBT3ZDLFdBQVd3QyxjQUFjO2dCQUNsQyxHQUFHSCxPQUFPWDtRQUNkLEdBQ0NVLEtBQUssQ0FBQyxDQUFDQyxRQUFpQnBDLFNBQVM7Z0JBQ2hDMkI7Z0JBQ0FVLFVBQVU3QjtnQkFDVjhCLE9BQU92QyxXQUFXd0MsY0FBYztZQUNsQyxHQUFHSCxPQUFPWDtJQUNkLE9BQU8sSUFBR3lCLFlBQVksSUFBSTtRQUN4QixNQUFNb0YsU0FBUztZQUFDOUM7WUFBYVUsVUFBVU47UUFBRztRQUMxQyxNQUFNOUQsU0FBbUJqQyxHQUFHLENBQUMsY0FBYyxFQUFFc0QsY0FBYyxPQUFPLEVBQUVtRixPQUFPLHFCQUFxQixDQUFDO1FBQ2pHLE9BQU9sSSxNQUFNd0IsY0FBY0csS0FBSyxDQUFDRCxRQUM5QkUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9VLElBQUksSUFDNUJSLEtBQUssQ0FBQyxDQUFDQyxRQUFpQnBDLFNBQVM7Z0JBQ2hDMkI7Z0JBQ0FVLFVBQVU3QjtnQkFDVjhCLE9BQU92QyxXQUFXd0MsY0FBYztZQUNsQyxHQUFHSCxPQUFPWDtJQUNkO0lBRUEsT0FBTztBQUNULEVBQUU7QUFFRixPQUFPLE1BQU04RyxjQUFjLE9BQU85RyxTQUFxQnlCO0lBQ3JELE1BQU12QixTQUFpQjtJQUN2QixNQUFNLEVBQUNDLFlBQVksRUFBRWtELFNBQVMsRUFBQ3BELFFBQVFxRCxTQUFTLEVBQUMsRUFBQyxHQUFHdEQ7SUFDckQsTUFBTTBCLGdCQUFnQnZELFFBQVFzRDtJQUU5QixJQUFJO1FBQ0YsTUFBTXNGLGFBQWEsQ0FBQyxPQUFPLEVBQUVyRixlQUFlO1FBQzVDLE1BQU1zRixrQkFBa0I1SSxHQUFHLENBQUMsb0NBQW9DLEVBQUUySSxXQUFXLGlDQUFpQyxDQUFDO1FBQy9HLE1BQU1wSSxNQUFNd0IsY0FBY0csS0FBSyxDQUFDMEc7UUFFaEMsTUFBTUMsV0FBVzdJLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRXNELGNBQWMsZ0JBQWdCLEVBQUU0QixVQUFVLDhCQUE4QixDQUFDO1FBQ2pJLE1BQU1RLFFBQVEsTUFBTW5GLE1BQU13QixjQUFjRyxLQUFLLENBQUMyRyxVQUFVMUcsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9VLElBQUk7UUFFcEYsSUFBRzRDLE9BQU87WUFDUixNQUFNLEVBQUNRLE1BQU00QyxJQUFJLEVBQUMsR0FBR3BEO1lBQ3JCLE1BQU1xRCxTQUFvQztnQkFDeENyRSxRQUFRO2dCQUNSc0UsUUFBUTtvQkFDTkMsU0FBUzt3QkFDUDs0QkFBQ3JFLEtBQUssQ0FBQyxNQUFNLEVBQUVNLFVBQVUsUUFBUSxFQUFFNEQsS0FBSyxJQUFJLENBQUM7d0JBQUE7cUJBQzlDO29CQUNESSxPQUFPO2dCQUNUO1lBQ0Y7WUFDQSxPQUFPMUksYUFBYXVJLFFBQVE1RyxJQUFJLENBQUMsSUFBTXVEO1FBQ3pDO1FBRUEsT0FBTztJQUNULEVBQUUsT0FBTW5ELE9BQU87UUFDYixPQUFPcEMsU0FBUztZQUNkMkI7WUFDQVUsVUFBVTdCO1lBQ1Y4QixPQUFPdkMsV0FBV3dDLGNBQWM7UUFDbEMsR0FBR0gsT0FBZ0JYO0lBQ3JCO0FBQ0YsRUFBRSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websockets.d.ts","sourceRoot":"","sources":["../../src/actions/websockets.ts"],"names":[],"mappings":"AAUA,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAKlD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,8BAA8B,CAAC;AAGtE,eAAO,MAAM,SAAS,GAAU,UAAU,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,mBAAmB,CAwC5F,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG,OAAO,CAAC,mBAAmB,CAc3E,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,OAAO,CAAC,GAAG,CAoB3D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,UAAU,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,GAAG,CAqBtF,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,KAAG,OAAO,CAAC,mBAAmB,CAoB1E,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AACD,qBAAa,eAAe;IAC1B,MAAM,MAAC;gBAEK,MAAM,CAAC,KAAA;IAOb,WAAW,CAAC,EAAC,cAAc,EAAC,EAAE,sBAAsB;IAiBpD,IAAI,CAAC,UAAU,KAAA,EAAE,OAAO,KAAA;CA2B/B"}
|