@cometchat/chat-uikit-angular 4.0.0-beta.1
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/Calls/CallingExtension.d.ts +5 -0
- package/Calls/CallingExtensionDecorator.d.ts +17 -0
- package/Calls/CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component.d.ts +75 -0
- package/Calls/CometChatCallButtons/cometchat-call-buttons.module.d.ts +11 -0
- package/Calls/CometChatIncomingCall/cometchat-incoming-call/cometchat-incoming-call.component.d.ts +80 -0
- package/Calls/CometChatIncomingCall/cometchat-incoming-call.module.d.ts +11 -0
- package/Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component.d.ts +26 -0
- package/Calls/CometChatOngoingCall/cometchat-ongoing-call.module.d.ts +9 -0
- package/Calls/CometChatOutgoingCall/cometchat-outgoing-call/cometchat-outgoing-call.component.d.ts +58 -0
- package/Calls/CometChatOutgoingCall/cometchat-outgoing-call.module.d.ts +10 -0
- package/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.d.ts +109 -0
- package/CometChatAddMembers/cometchat-add-members.module.d.ts +12 -0
- package/CometChatBannedMembers/cometchat-banned-members/cometchat-banned-members.component.d.ts +140 -0
- package/CometChatBannedMembers/cometchat-banned-members.module.d.ts +13 -0
- package/CometChatConversations/cometchat-conversations/cometchat-conversations.component.d.ts +335 -0
- package/CometChatConversations/cometchat-conversations.module.d.ts +10 -0
- package/CometChatConversationsWithMessages/cometchat-conversations-with-messages/cometchat-conversations-with-messages.component.d.ts +86 -0
- package/CometChatConversationsWithMessages/cometchat-conversations-with-messages.module.d.ts +12 -0
- package/CometChatDetails/cometchat-details/cometchat-details.component.d.ts +149 -0
- package/CometChatDetails/cometchat-details.module.d.ts +12 -0
- package/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.d.ts +145 -0
- package/CometChatGroupMembers/cometchat-group-members.module.d.ts +13 -0
- package/CometChatGroups/cometchat-groups/cometchat-groups.component.d.ts +136 -0
- package/CometChatGroups/cometchat-groups.module.d.ts +10 -0
- package/CometChatGroupsWithMessages/cometchat-groups-with-messages/cometchat-groups-with-messages.component.d.ts +100 -0
- package/CometChatGroupsWithMessages/cometchat-groups-with-messages.module.d.ts +13 -0
- package/CometChatList/cometchat-list.component.d.ts +87 -0
- package/CometChatList/cometchat-list.module.d.ts +10 -0
- package/CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component.d.ts +62 -0
- package/CometChatMessageBubble/cometchat-message-bubble.module.d.ts +8 -0
- package/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.d.ts +165 -0
- package/CometChatMessageComposer/cometchat-message-composer.module.d.ts +9 -0
- package/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.d.ts +85 -0
- package/CometChatMessageHeader/cometchat-message-header.module.d.ts +9 -0
- package/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.d.ts +510 -0
- package/CometChatMessageList/cometchat-message-list.module.d.ts +11 -0
- package/CometChatMessages/cometchat-messages/cometchat-messages.component.d.ts +136 -0
- package/CometChatMessages/cometchat-messages.module.d.ts +15 -0
- package/CometChatTheme.service.d.ts +7 -0
- package/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.d.ts +73 -0
- package/CometChatThreadedMessages/cometchat-threaded-messages.module.d.ts +12 -0
- package/CometChatTransferOwnership/cometchat-transfer-ownership/cometchat-transfer-ownership.component.d.ts +88 -0
- package/CometChatTransferOwnership/cometchat-transfer-ownership.module.d.ts +10 -0
- package/CometChatUsers/cometchat-users/cometchat-users.component.d.ts +105 -0
- package/CometChatUsers/cometchat-users.module.d.ts +11 -0
- package/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.d.ts +71 -0
- package/CometChatUsersWithMessages/cometchat-users-with-messages.module.d.ts +12 -0
- package/Extensions/CollaborativeDocument/CollaborativeDocumentExtension.d.ts +9 -0
- package/Extensions/CollaborativeDocument/CollaborativeDocumentExtensionDecorator.d.ts +17 -0
- package/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtension.d.ts +9 -0
- package/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtensionDecorator.d.ts +17 -0
- package/Extensions/ImageModeration/ImageModerationExtension.d.ts +5 -0
- package/Extensions/ImageModeration/ImageModerationExtensionDecorator.d.ts +6 -0
- package/Extensions/LinkPreviewExtension/LinkPreviewExtension.d.ts +5 -0
- package/Extensions/LinkPreviewExtension/LinkPreviewExtensionDecorator.d.ts +6 -0
- package/Extensions/MessageTranslation/MessageTranslationExtension.d.ts +9 -0
- package/Extensions/MessageTranslation/MessageTranslationExtensionDecorator.d.ts +12 -0
- package/Extensions/PollsExtension/PollsExtension.d.ts +5 -0
- package/Extensions/PollsExtension/PollsExtensionDecorator.d.ts +15 -0
- package/Extensions/Reactions/ReactionExtension.d.ts +5 -0
- package/Extensions/Reactions/ReactionExtensionDecorator.d.ts +10 -0
- package/Extensions/SmartReplies/SmartRepliesExtension.d.ts +9 -0
- package/Extensions/SmartReplies/SmartRepliesExtensionDecorator.d.ts +16 -0
- package/Extensions/Stickers/StickersExtension.d.ts +9 -0
- package/Extensions/Stickers/StickersExtensionDecorator.d.ts +27 -0
- package/Extensions/TextModerator/TextModeratorExtension.d.ts +5 -0
- package/Extensions/TextModerator/TextModeratorExtensionDecorator.d.ts +9 -0
- package/Extensions/ThumbnailGeneration/ThumbnailGenerationExtension.d.ts +5 -0
- package/Extensions/ThumbnailGeneration/ThumbnailGenerationExtensionDecorator.d.ts +6 -0
- package/README.md +60 -0
- package/Shared/CometChatUIkit/CometChatUIKit.d.ts +18 -0
- package/Shared/Framework/ChatConfigurator.d.ts +8 -0
- package/Shared/Framework/DataSource.d.ts +29 -0
- package/Shared/Framework/DataSourceDecorator.d.ts +32 -0
- package/Shared/Framework/ExtensionDataSource.d.ts +3 -0
- package/Shared/Utils/MessageUtils.d.ts +43 -0
- package/assets/.gitkeep +0 -0
- package/assets/Audio-Call.svg +11 -0
- package/assets/Audio-Call2x.svg +11 -0
- package/assets/Copy.svg +17 -0
- package/assets/Grid-layout.svg +1 -0
- package/assets/Heart.svg +11 -0
- package/assets/Imagemoderation.svg +14 -0
- package/assets/Info.svg +13 -0
- package/assets/Locked.svg +10 -0
- package/assets/More@2x.svg +9 -0
- package/assets/Plus.svg +13 -0
- package/assets/Private.svg +10 -0
- package/assets/Reactionsicon.svg +9 -0
- package/assets/Send.svg +12 -0
- package/assets/Spinner.svg +15 -0
- package/assets/Stickers.svg +16 -0
- package/assets/Stipop.svg +9 -0
- package/assets/Video-call.svg +12 -0
- package/assets/Video-call2x.svg +12 -0
- package/assets/activity.svg +22 -0
- package/assets/addreaction.svg +9 -0
- package/assets/animals.svg +15 -0
- package/assets/attachment-file.svg +14 -0
- package/assets/audio-file.svg +12 -0
- package/assets/back.png +0 -0
- package/assets/backbutton.svg +12 -0
- package/assets/call.svg +1 -0
- package/assets/chats.svg +1 -0
- package/assets/checkmark.svg +11 -0
- package/assets/close.svg +12 -0
- package/assets/close2x.svg +12 -0
- package/assets/collaborativedocument.svg +13 -0
- package/assets/collaborativewhiteboard.svg +12 -0
- package/assets/create-button.svg +12 -0
- package/assets/declaration.d.ts +3 -0
- package/assets/delete.svg +7 -0
- package/assets/deleteicon.svg +15 -0
- package/assets/down-arrow.svg +1 -0
- package/assets/download.svg +13 -0
- package/assets/editicon.svg +14 -0
- package/assets/emoji.svg +2693 -0
- package/assets/file-upload.svg +2693 -0
- package/assets/flags.svg +12 -0
- package/assets/food.svg +26 -0
- package/assets/group.svg +40 -0
- package/assets/heart-reaction.png +0 -0
- package/assets/heart.png +0 -0
- package/assets/image.svg +2693 -0
- package/assets/incomingcall.wav +0 -0
- package/assets/increase-size.svg +6 -0
- package/assets/location.svg +2693 -0
- package/assets/message-delivered.png +0 -0
- package/assets/message-delivered.svg +4 -0
- package/assets/message-read.png +0 -0
- package/assets/message-read.svg +4 -0
- package/assets/message-sent.png +0 -0
- package/assets/message-sent.svg +3 -0
- package/assets/moreicon.svg +9 -0
- package/assets/objects.svg +13 -0
- package/assets/open-thread.svg +11 -0
- package/assets/password-protected-group.svg +3 -0
- package/assets/photolibrary.svg +11 -0
- package/assets/placeholder.png +0 -0
- package/assets/plus-rotated.svg +13 -0
- package/assets/polls.svg +14 -0
- package/assets/privacy.svg +4 -0
- package/assets/private-group.svg +9 -0
- package/assets/public.svg +3 -0
- package/assets/reduce-size.svg +6 -0
- package/assets/right-arrow.svg +6 -0
- package/assets/search.png +0 -0
- package/assets/search.svg +4 -0
- package/assets/side-arrow.svg +1 -0
- package/assets/smileys.svg +16 -0
- package/assets/start-chat.svg +1 -0
- package/assets/symbols.svg +16 -0
- package/assets/thread-arrow.svg +1 -0
- package/assets/thread-icon.svg +38 -0
- package/assets/threadicon.svg +14 -0
- package/assets/translation.svg +16 -0
- package/assets/travel.svg +18 -0
- package/assets/unsafe-content.svg +23 -0
- package/assets/user.svg +31 -0
- package/assets/video-upload.svg +2693 -0
- package/assets/video.svg +12 -0
- package/assets/wait.png +0 -0
- package/assets/wait.svg +4 -0
- package/assets/warning-small.png +0 -0
- package/assets/warning-small.svg +5 -0
- package/cometchat-chat-uikit-angular.d.ts +5 -0
- package/esm2020/Calls/CallingExtension.mjs +11 -0
- package/esm2020/Calls/CallingExtensionDecorator.mjs +114 -0
- package/esm2020/Calls/CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component.mjs +358 -0
- package/esm2020/Calls/CometChatCallButtons/cometchat-call-buttons.module.mjs +32 -0
- package/esm2020/Calls/CometChatIncomingCall/cometchat-incoming-call/cometchat-incoming-call.component.mjs +423 -0
- package/esm2020/Calls/CometChatIncomingCall/cometchat-incoming-call.module.mjs +32 -0
- package/esm2020/Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component.mjs +54 -0
- package/esm2020/Calls/CometChatOngoingCall/cometchat-ongoing-call.module.mjs +27 -0
- package/esm2020/Calls/CometChatOutgoingCall/cometchat-outgoing-call/cometchat-outgoing-call.component.mjs +196 -0
- package/esm2020/Calls/CometChatOutgoingCall/cometchat-outgoing-call.module.mjs +28 -0
- package/esm2020/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.mjs +353 -0
- package/esm2020/CometChatAddMembers/cometchat-add-members.module.mjs +23 -0
- package/esm2020/CometChatBannedMembers/cometchat-banned-members/cometchat-banned-members.component.mjs +446 -0
- package/esm2020/CometChatBannedMembers/cometchat-banned-members.module.mjs +24 -0
- package/esm2020/CometChatConversations/cometchat-conversations/cometchat-conversations.component.mjs +1400 -0
- package/esm2020/CometChatConversations/cometchat-conversations.module.mjs +28 -0
- package/esm2020/CometChatConversationsWithMessages/cometchat-conversations-with-messages/cometchat-conversations-with-messages.component.mjs +272 -0
- package/esm2020/CometChatConversationsWithMessages/cometchat-conversations-with-messages.module.mjs +39 -0
- package/esm2020/CometChatDetails/cometchat-details/cometchat-details.component.mjs +696 -0
- package/esm2020/CometChatDetails/cometchat-details.module.mjs +27 -0
- package/esm2020/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.mjs +676 -0
- package/esm2020/CometChatGroupMembers/cometchat-group-members.module.mjs +24 -0
- package/esm2020/CometChatGroups/cometchat-groups/cometchat-groups.component.mjs +564 -0
- package/esm2020/CometChatGroups/cometchat-groups.module.mjs +28 -0
- package/esm2020/CometChatGroupsWithMessages/cometchat-groups-with-messages/cometchat-groups-with-messages.component.mjs +430 -0
- package/esm2020/CometChatGroupsWithMessages/cometchat-groups-with-messages.module.mjs +43 -0
- package/esm2020/CometChatList/cometchat-list.component.mjs +210 -0
- package/esm2020/CometChatList/cometchat-list.module.mjs +28 -0
- package/esm2020/CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component.mjs +157 -0
- package/esm2020/CometChatMessageBubble/cometchat-message-bubble.module.mjs +23 -0
- package/esm2020/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.mjs +930 -0
- package/esm2020/CometChatMessageComposer/cometchat-message-composer.module.mjs +24 -0
- package/esm2020/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.mjs +420 -0
- package/esm2020/CometChatMessageHeader/cometchat-message-header.module.mjs +26 -0
- package/esm2020/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.mjs +2598 -0
- package/esm2020/CometChatMessageList/cometchat-message-list.module.mjs +34 -0
- package/esm2020/CometChatMessages/cometchat-messages/cometchat-messages.component.mjs +393 -0
- package/esm2020/CometChatMessages/cometchat-messages.module.mjs +48 -0
- package/esm2020/CometChatTheme.service.mjs +17 -0
- package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.mjs +304 -0
- package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages.module.mjs +36 -0
- package/esm2020/CometChatTransferOwnership/cometchat-transfer-ownership/cometchat-transfer-ownership.component.mjs +337 -0
- package/esm2020/CometChatTransferOwnership/cometchat-transfer-ownership.module.mjs +21 -0
- package/esm2020/CometChatUsers/cometchat-users/cometchat-users.component.mjs +447 -0
- package/esm2020/CometChatUsers/cometchat-users.module.mjs +32 -0
- package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.mjs +185 -0
- package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages.module.mjs +39 -0
- package/esm2020/Extensions/CollaborativeDocument/CollaborativeDocumentExtension.mjs +11 -0
- package/esm2020/Extensions/CollaborativeDocument/CollaborativeDocumentExtensionDecorator.mjs +89 -0
- package/esm2020/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtension.mjs +11 -0
- package/esm2020/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtensionDecorator.mjs +89 -0
- package/esm2020/Extensions/ImageModeration/ImageModerationExtension.mjs +10 -0
- package/esm2020/Extensions/ImageModeration/ImageModerationExtensionDecorator.mjs +10 -0
- package/esm2020/Extensions/LinkPreviewExtension/LinkPreviewExtension.mjs +10 -0
- package/esm2020/Extensions/LinkPreviewExtension/LinkPreviewExtensionDecorator.mjs +10 -0
- package/esm2020/Extensions/MessageTranslation/MessageTranslationExtension.mjs +11 -0
- package/esm2020/Extensions/MessageTranslation/MessageTranslationExtensionDecorator.mjs +33 -0
- package/esm2020/Extensions/PollsExtension/PollsExtension.mjs +10 -0
- package/esm2020/Extensions/PollsExtension/PollsExtensionDecorator.mjs +75 -0
- package/esm2020/Extensions/Reactions/ReactionExtension.mjs +10 -0
- package/esm2020/Extensions/Reactions/ReactionExtensionDecorator.mjs +30 -0
- package/esm2020/Extensions/SmartReplies/SmartRepliesExtension.mjs +11 -0
- package/esm2020/Extensions/SmartReplies/SmartRepliesExtensionDecorator.mjs +117 -0
- package/esm2020/Extensions/Stickers/StickersExtension.mjs +15 -0
- package/esm2020/Extensions/Stickers/StickersExtensionDecorator.mjs +118 -0
- package/esm2020/Extensions/TextModerator/TextModeratorExtension.mjs +10 -0
- package/esm2020/Extensions/TextModerator/TextModeratorExtensionDecorator.mjs +32 -0
- package/esm2020/Extensions/ThumbnailGeneration/ThumbnailGenerationExtension.mjs +10 -0
- package/esm2020/Extensions/ThumbnailGeneration/ThumbnailGenerationExtensionDecorator.mjs +10 -0
- package/esm2020/Shared/CometChatUIkit/CometChatUIKit.mjs +180 -0
- package/esm2020/Shared/Framework/ChatConfigurator.mjs +20 -0
- package/esm2020/Shared/Framework/DataSource.mjs +3 -0
- package/esm2020/Shared/Framework/DataSourceDecorator.mjs +80 -0
- package/esm2020/Shared/Framework/ExtensionDataSource.mjs +4 -0
- package/esm2020/Shared/Utils/MessageUtils.mjs +342 -0
- package/esm2020/cometchat-chat-uikit-angular.mjs +5 -0
- package/esm2020/public-api.mjs +93 -0
- package/fesm2015/cometchat-chat-uikit-angular.mjs +13683 -0
- package/fesm2015/cometchat-chat-uikit-angular.mjs.map +1 -0
- package/fesm2020/cometchat-chat-uikit-angular.mjs +13586 -0
- package/fesm2020/cometchat-chat-uikit-angular.mjs.map +1 -0
- package/package.json +51 -0
- package/public-api.d.ts +79 -0
package/esm2020/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.mjs
ADDED
|
@@ -0,0 +1,2598 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, ChangeDetectionStrategy, } from "@angular/core";
|
|
2
|
+
import { CometChat } from "@cometchat-pro/chat";
|
|
3
|
+
import { DateStyle, AvatarStyle, ReceiptStyle } from '@cometchat/uikit-elements';
|
|
4
|
+
import { States, localize, MessageListAlignment, DatePatterns, TimestampAlignment, DocumentIconAlignment, CometChatUIKitConstants, CometChatTheme, MessageBubbleAlignment, fontHelper, CometChatMessageEvents, MessageStatus, CometChatGroupEvents, CometChatUIEvents, Placement, CometChatCallEvents } from "@cometchat/uikit-resources";
|
|
5
|
+
import { MessageListStyle, CometChatSoundManager, MessageReceiptUtils, CollaborativeWhiteboardConstants, CollaborativeDocumentConstants, MessageTranslationConstants, MessageTranslationStyle, ReactionsConstants, SmartRepliesConstants, ThumbnailGenerationConstants, LinkPreviewConstants, CallscreenStyle, CallingDetailsUtils, CometChatUIKitUtility } from "@cometchat/uikit-shared";
|
|
6
|
+
import { ChatConfigurator } from "../../Shared/Framework/ChatConfigurator";
|
|
7
|
+
import { StickersConstants, LinkPreviewStyle } from "@cometchat/uikit-shared";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../../CometChatTheme.service";
|
|
10
|
+
import * as i2 from "../../CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component";
|
|
11
|
+
import * as i3 from "../../Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component";
|
|
12
|
+
import * as i4 from "@angular/common";
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* CometChatMessageList is a wrapper component for messageBubble
|
|
16
|
+
*
|
|
17
|
+
* @version 1.0.0
|
|
18
|
+
* @author CometChatTeam
|
|
19
|
+
* @copyright © 2022 CometChat Inc.
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
export class CometChatMessageListComponent {
|
|
23
|
+
constructor(ngZone, ref, themeService) {
|
|
24
|
+
this.ngZone = ngZone;
|
|
25
|
+
this.ref = ref;
|
|
26
|
+
this.themeService = themeService;
|
|
27
|
+
this.hideError = false;
|
|
28
|
+
this.errorStateText = localize("SOMETHING_WRONG");
|
|
29
|
+
this.emptyStateText = localize("NO_MESSAGES_FOUND");
|
|
30
|
+
this.loadingIconURL = "assets/Spinner.svg";
|
|
31
|
+
this.disableReceipt = true;
|
|
32
|
+
this.disableSoundForMessages = false;
|
|
33
|
+
this.customSoundForMessages = "";
|
|
34
|
+
this.readIcon = "assets/message-read.svg";
|
|
35
|
+
this.deliveredIcon = "assets/message-delivered.svg";
|
|
36
|
+
this.sentIcon = "assets/message-sent.svg";
|
|
37
|
+
this.waitIcon = "assets/wait.svg";
|
|
38
|
+
this.errorIcon = "assets/warning-small.svg";
|
|
39
|
+
this.alignment = MessageListAlignment.standard;
|
|
40
|
+
this.showAvatar = true;
|
|
41
|
+
this.datePattern = DatePatterns.time;
|
|
42
|
+
this.timestampAlignment = TimestampAlignment.bottom;
|
|
43
|
+
this.DateSeparatorPattern = DatePatterns.DayDateTime;
|
|
44
|
+
this.templates = [];
|
|
45
|
+
this.newMessageIndicatorText = "";
|
|
46
|
+
this.scrollToBottomOnNewMessages = false;
|
|
47
|
+
this.thresholdValue = 1000;
|
|
48
|
+
this.avatarStyle = {
|
|
49
|
+
borderRadius: "16px",
|
|
50
|
+
width: "28px",
|
|
51
|
+
height: "28px",
|
|
52
|
+
};
|
|
53
|
+
this.backdropStyle = {
|
|
54
|
+
height: "100%",
|
|
55
|
+
width: "100%",
|
|
56
|
+
background: "rgba(0, 0, 0, 0.5)"
|
|
57
|
+
};
|
|
58
|
+
this.dateSeparatorStyle = {
|
|
59
|
+
height: "",
|
|
60
|
+
width: "",
|
|
61
|
+
};
|
|
62
|
+
this.messageListStyle = {
|
|
63
|
+
nameTextFont: "600 15px Inter",
|
|
64
|
+
nameTextColor: "white",
|
|
65
|
+
TimestampTextFont: "",
|
|
66
|
+
TimestampTextColor: "",
|
|
67
|
+
threadReplySeparatorColor: "",
|
|
68
|
+
threadReplyTextFont: "",
|
|
69
|
+
threadReplyIconTint: "",
|
|
70
|
+
threadReplyTextColor: "",
|
|
71
|
+
emptyStateTextFont: "700 22px Inter",
|
|
72
|
+
emptyStateTextColor: "#bcbcbc",
|
|
73
|
+
errorStateTextFont: "700 22px Inter",
|
|
74
|
+
errorStateTextColor: "#bcbcbc",
|
|
75
|
+
loadingIconTint: "grey",
|
|
76
|
+
};
|
|
77
|
+
this.onError = (error) => {
|
|
78
|
+
console.log(error);
|
|
79
|
+
};
|
|
80
|
+
this.state = States.loading;
|
|
81
|
+
this.optionsStyle = {
|
|
82
|
+
width: "",
|
|
83
|
+
height: "",
|
|
84
|
+
border: "1px solid #e8e8e8",
|
|
85
|
+
borderRadius: "8px",
|
|
86
|
+
background: "white",
|
|
87
|
+
submenuWidth: "100%",
|
|
88
|
+
submenuHeight: "100%",
|
|
89
|
+
submenuBorder: "1px solid #e8e8e8",
|
|
90
|
+
submenuBorderRadius: "8px",
|
|
91
|
+
submenuBackground: "white",
|
|
92
|
+
moreIconTint: "grey"
|
|
93
|
+
};
|
|
94
|
+
this.receiptStyle = {};
|
|
95
|
+
this.documentBubbleAlignment = DocumentIconAlignment.right;
|
|
96
|
+
this.callBubbleAlignment = DocumentIconAlignment.left;
|
|
97
|
+
this.imageModerationStyle = {};
|
|
98
|
+
this.timestampEnum = TimestampAlignment;
|
|
99
|
+
this.chatChanged = true;
|
|
100
|
+
this.timeStampColor = "";
|
|
101
|
+
this.timeStampFont = "";
|
|
102
|
+
this.smartReplyStyle = {
|
|
103
|
+
width: "100%",
|
|
104
|
+
height: "100%",
|
|
105
|
+
border: "none",
|
|
106
|
+
};
|
|
107
|
+
this.showSmartReply = false;
|
|
108
|
+
this.smartReplyMessage = null;
|
|
109
|
+
this.enableSmartReply = false;
|
|
110
|
+
this.timeStampBackground = "";
|
|
111
|
+
this.linkPreviewStyle = {};
|
|
112
|
+
this.unreadMessagesStyle = {
|
|
113
|
+
height: "100%",
|
|
114
|
+
width: "100%",
|
|
115
|
+
background: "#3399FF",
|
|
116
|
+
display: "flex",
|
|
117
|
+
justifyContent: "center",
|
|
118
|
+
buttonTextFont: "400 13px Inter",
|
|
119
|
+
color: "white",
|
|
120
|
+
border: "none",
|
|
121
|
+
borderRadius: "12px"
|
|
122
|
+
};
|
|
123
|
+
this.dividerStyle = {
|
|
124
|
+
height: "1px",
|
|
125
|
+
width: "100%",
|
|
126
|
+
background: "grey"
|
|
127
|
+
};
|
|
128
|
+
this.pollBubbleStyle = {};
|
|
129
|
+
this.labelStyle = {
|
|
130
|
+
textFont: "400 11px Inter",
|
|
131
|
+
textColor: "grey"
|
|
132
|
+
};
|
|
133
|
+
this.imageBubbleStyle = {
|
|
134
|
+
height: "128px",
|
|
135
|
+
width: "128px",
|
|
136
|
+
border: "none",
|
|
137
|
+
borderRadius: "0",
|
|
138
|
+
background: "transparent"
|
|
139
|
+
};
|
|
140
|
+
this.messagesList = [];
|
|
141
|
+
this.bubbleDateStyle = {};
|
|
142
|
+
this.whiteboardIconURL = "assets/collaborativewhiteboard.svg";
|
|
143
|
+
this.documentIconURL = "assets/collaborativedocument.svg";
|
|
144
|
+
this.directCallIconURL = "assets/Video-call2x.svg";
|
|
145
|
+
this.placeholderIconURL = "/assets/placeholder.png";
|
|
146
|
+
this.downloadIconURL = "assets/download.svg";
|
|
147
|
+
this.translationStyle = {};
|
|
148
|
+
this.documentBubbleStyle = {};
|
|
149
|
+
this.callBubbleStyle = {};
|
|
150
|
+
this.whiteboardTitle = localize("COLLABORATIVE_WHITEBOARD");
|
|
151
|
+
this.whiteboardSubitle = localize("DRAW_WHITEBOARD_TOGETHER");
|
|
152
|
+
this.whiteboardButtonText = localize("OPEN_WHITEBOARD");
|
|
153
|
+
this.documentTitle = localize("COLLABORATIVE_DOCUMENT");
|
|
154
|
+
this.documentSubitle = localize("DRAW_DOCUMENT_TOGETHER");
|
|
155
|
+
this.documentButtonText = localize("OPEN_DOCUMENT");
|
|
156
|
+
this.joinCallButtonText = localize("JOIN");
|
|
157
|
+
this.localize = localize;
|
|
158
|
+
this.reinitialized = false;
|
|
159
|
+
this.MessageTypesConstant = CometChatUIKitConstants.MessageTypes;
|
|
160
|
+
this.callConstant = CometChatUIKitConstants.MessageCategory.call;
|
|
161
|
+
this.typesMap = {};
|
|
162
|
+
this.messageTypesMap = {};
|
|
163
|
+
this.theme = new CometChatTheme({});
|
|
164
|
+
this.msgListenerId = "message_" + new Date().getTime();
|
|
165
|
+
this.groupListenerId = "group_" + new Date().getTime();
|
|
166
|
+
this.callListenerId = "call_" + new Date().getTime();
|
|
167
|
+
this.states = States;
|
|
168
|
+
this.MessageCategory = CometChatUIKitConstants.MessageCategory;
|
|
169
|
+
this.numberOfTopScroll = 0;
|
|
170
|
+
this.keepRecentMessages = true;
|
|
171
|
+
this.messageTemplate = [];
|
|
172
|
+
this.isOnBottom = false;
|
|
173
|
+
this.UnreadCount = [];
|
|
174
|
+
this.newMessageCount = 0;
|
|
175
|
+
this.type = "";
|
|
176
|
+
this.confirmText = localize("YES");
|
|
177
|
+
this.cancelText = localize("NO");
|
|
178
|
+
this.warningText = "Are you sure want to see unsafe content?";
|
|
179
|
+
this.threadedAlignment = MessageBubbleAlignment.left;
|
|
180
|
+
this.openEmojiKeyboard = false;
|
|
181
|
+
this.keyboardAlignment = Placement.right;
|
|
182
|
+
this.popoverStyle = {
|
|
183
|
+
height: "330px",
|
|
184
|
+
width: "325px",
|
|
185
|
+
};
|
|
186
|
+
this.videoBubbleStyle = {
|
|
187
|
+
height: "130px",
|
|
188
|
+
width: "230px",
|
|
189
|
+
border: "none",
|
|
190
|
+
borderRadius: "8px",
|
|
191
|
+
background: "transparent"
|
|
192
|
+
};
|
|
193
|
+
this.threadViewAlignment = MessageBubbleAlignment.left;
|
|
194
|
+
this.enableDataMasking = false;
|
|
195
|
+
this.enableThumbnailGeneration = false;
|
|
196
|
+
this.enableLinkPreview = false;
|
|
197
|
+
this.enablePolls = false;
|
|
198
|
+
this.enableReactions = false;
|
|
199
|
+
this.enableImageModeration = false;
|
|
200
|
+
this.enableStickers = false;
|
|
201
|
+
this.enableWhiteboard = false;
|
|
202
|
+
this.enableDocument = false;
|
|
203
|
+
this.showOngoingCall = false;
|
|
204
|
+
this.enableCalling = false;
|
|
205
|
+
this.ongoingCallStyle = {};
|
|
206
|
+
this.sessionId = "";
|
|
207
|
+
this.closeIconURL = "assets/close2x.svg";
|
|
208
|
+
this.threadOpenIcon = "assets/side-arrow.svg";
|
|
209
|
+
this.confirmDialogStyle = {};
|
|
210
|
+
this.messageToReact = null;
|
|
211
|
+
this.limit = 30;
|
|
212
|
+
this.types = [];
|
|
213
|
+
this.categories = [];
|
|
214
|
+
this.addReaction = (event) => {
|
|
215
|
+
let emoji = event?.detail?.id;
|
|
216
|
+
this.popoverRef.nativeElement.openContentView(event);
|
|
217
|
+
this.reactToMessages(emoji);
|
|
218
|
+
};
|
|
219
|
+
this.getCallActionMessage = (call) => {
|
|
220
|
+
return CallingDetailsUtils.getCallStatus(call, this.loggedInUser);
|
|
221
|
+
};
|
|
222
|
+
this.showEmojiKeyboard = (id, event) => {
|
|
223
|
+
let message = this.getMessageById(id);
|
|
224
|
+
if (message) {
|
|
225
|
+
this.messageToReact = message;
|
|
226
|
+
this.keyboardAlignment = message.getSender()?.getUid() == this.loggedInUser?.getUid() ? Placement.left : Placement.right;
|
|
227
|
+
this.ref.detectChanges();
|
|
228
|
+
this.popoverRef.nativeElement.openContentView(event);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
this.setBubbleView = () => {
|
|
232
|
+
this.messageTemplate.forEach((element) => {
|
|
233
|
+
this.messageTypesMap[element.type] = element;
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
this.openThreadView = (message) => {
|
|
237
|
+
if (this.onThreadRepliesClick) {
|
|
238
|
+
this.onThreadRepliesClick(message, this.threadMessageBubble);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
this.threadCallback = (id) => {
|
|
242
|
+
let messageObject = this.getMessageById(id);
|
|
243
|
+
this.openThreadView(messageObject);
|
|
244
|
+
};
|
|
245
|
+
this.deleteCallback = (id) => {
|
|
246
|
+
let messageObject = this.getMessageById(id);
|
|
247
|
+
this.deleteMessage(messageObject);
|
|
248
|
+
};
|
|
249
|
+
this.editCallback = (id) => {
|
|
250
|
+
let messageObject = this.getMessageById(id);
|
|
251
|
+
this.onEditMessage(messageObject);
|
|
252
|
+
};
|
|
253
|
+
this.copyCallback = (id) => {
|
|
254
|
+
let messageObject = this.getMessageById(id);
|
|
255
|
+
this.onCopyMessage(messageObject);
|
|
256
|
+
};
|
|
257
|
+
this.updateTranslatedMessage = (translation) => {
|
|
258
|
+
const receivedMessage = translation;
|
|
259
|
+
const translatedText = receivedMessage.translations[0].message_translated;
|
|
260
|
+
let messageList = [...this.messagesList];
|
|
261
|
+
let messageKey = messageList.findIndex((m) => m.getId() === receivedMessage.msgId);
|
|
262
|
+
let data;
|
|
263
|
+
if (messageKey > -1) {
|
|
264
|
+
const messageObj = messageList[messageKey];
|
|
265
|
+
if (messageObj.getMetadata()) {
|
|
266
|
+
data = messageObj.getMetadata();
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
messageObj.setMetadata({});
|
|
270
|
+
data = messageObj.getMetadata();
|
|
271
|
+
}
|
|
272
|
+
data[MessageTranslationConstants.translated_message] = translatedText;
|
|
273
|
+
const newMessageObj = messageObj;
|
|
274
|
+
messageList.splice(messageKey, 1, newMessageObj);
|
|
275
|
+
this.messagesList = [...messageList];
|
|
276
|
+
this.ref.detectChanges();
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
this.translateMessage = (id) => {
|
|
280
|
+
let message = this.getMessageById(id);
|
|
281
|
+
if (message) {
|
|
282
|
+
CometChat.callExtension(MessageTranslationConstants.message_translation, MessageTranslationConstants.post, MessageTranslationConstants.v2_translate, {
|
|
283
|
+
"msgId": message.getId(),
|
|
284
|
+
"text": message.getText(),
|
|
285
|
+
"languages": navigator.languages
|
|
286
|
+
}).then((result) => {
|
|
287
|
+
if (result?.translations[0]?.message_translated != message?.getText()) {
|
|
288
|
+
this.updateTranslatedMessage(result);
|
|
289
|
+
this.ref.detectChanges();
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
// Result of translations
|
|
295
|
+
})
|
|
296
|
+
.catch((error) => {
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
this.getContentView = (message) => {
|
|
301
|
+
if (this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()]?.contentView) {
|
|
302
|
+
return this.messageTypesMap[message?.getType()]?.contentView(message);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
return message.getDeletedAt() ? this.typesMap["text"] : this.typesMap[message?.getType()];
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
this.setBubbleAlignment = (message) => {
|
|
309
|
+
let alignment = MessageBubbleAlignment.center;
|
|
310
|
+
if (this.alignment == MessageListAlignment.left) {
|
|
311
|
+
alignment = MessageBubbleAlignment.left;
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
if (message?.getType() == CometChatUIKitConstants.MessageTypes.groupMember || message.getCategory() == this.callConstant) {
|
|
315
|
+
alignment = MessageBubbleAlignment.center;
|
|
316
|
+
}
|
|
317
|
+
else if (!message?.getSender() || message?.getSender().getUid() == this.loggedInUser.getUid() && message?.getType() != CometChatUIKitConstants.MessageTypes.groupMember) {
|
|
318
|
+
alignment = MessageBubbleAlignment.right;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
alignment = MessageBubbleAlignment.left;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return alignment;
|
|
325
|
+
};
|
|
326
|
+
this.getBubbleWrapper = (message) => {
|
|
327
|
+
let view;
|
|
328
|
+
if (this.messageTypesMap && this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()].bubbleView) {
|
|
329
|
+
view = this.messageTypesMap[message?.getType()].bubbleView(message);
|
|
330
|
+
return view;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
view = null;
|
|
334
|
+
return view;
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
this.setTranslationStyle = (message) => {
|
|
338
|
+
const isLeftAligned = this.alignment !== MessageListAlignment.left;
|
|
339
|
+
const isUserSentMessage = !message?.getSender() || this.loggedInUser.getUid() === message?.getSender().getUid();
|
|
340
|
+
if (!isLeftAligned) {
|
|
341
|
+
return new MessageTranslationStyle({
|
|
342
|
+
translatedTextFont: fontHelper(this.themeService.theme.typography.text3),
|
|
343
|
+
translatedTextColor: this.themeService.theme.palette.getAccent("light"),
|
|
344
|
+
helpTextColor: this.themeService.theme.palette.getAccent700(),
|
|
345
|
+
helpTextFont: fontHelper(this.themeService.theme.typography.caption2),
|
|
346
|
+
background: "transparent"
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
if (isUserSentMessage) {
|
|
351
|
+
return new MessageTranslationStyle({
|
|
352
|
+
translatedTextFont: fontHelper(this.themeService.theme.typography.text3),
|
|
353
|
+
translatedTextColor: this.themeService.theme.palette.getAccent("dark"),
|
|
354
|
+
helpTextColor: this.themeService.theme.palette.getAccent700("dark"),
|
|
355
|
+
helpTextFont: fontHelper(this.themeService.theme.typography.caption2),
|
|
356
|
+
background: "transparent"
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
return new MessageTranslationStyle({
|
|
361
|
+
translatedTextFont: fontHelper(this.themeService.theme.typography.text3),
|
|
362
|
+
translatedTextColor: this.themeService.theme.palette.getAccent("light"),
|
|
363
|
+
helpTextColor: this.themeService.theme.palette.getAccent700(),
|
|
364
|
+
helpTextFont: fontHelper(this.themeService.theme.typography.caption2),
|
|
365
|
+
background: "transparent"
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
this.setTextBubbleStyle = (message) => {
|
|
371
|
+
const isDeleted = message.getDeletedAt();
|
|
372
|
+
const isLeftAligned = this.alignment !== MessageListAlignment.left;
|
|
373
|
+
const isTextMessage = message.getCategory() === CometChatUIKitConstants.MessageCategory.message && message?.getType() === CometChatUIKitConstants.MessageTypes.text;
|
|
374
|
+
const isUserSentMessage = !message?.getSender() || this.loggedInUser.getUid() === message?.getSender().getUid();
|
|
375
|
+
const isGroupMemberMessage = message?.getType() === CometChatUIKitConstants.MessageTypes.groupMember;
|
|
376
|
+
if (this.getLinkPreview(message)) {
|
|
377
|
+
return {
|
|
378
|
+
textFont: fontHelper(this.themeService.theme.typography.text3),
|
|
379
|
+
textColor: this.themeService.theme.palette.getAccent()
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
if (!isDeleted && isLeftAligned && isTextMessage && isUserSentMessage) {
|
|
383
|
+
return {
|
|
384
|
+
textFont: fontHelper(this.themeService.theme.typography.text3),
|
|
385
|
+
textColor: this.themeService.theme.palette.getAccent900("light")
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
if (!isDeleted && isLeftAligned && isTextMessage && !isUserSentMessage && !isGroupMemberMessage) {
|
|
389
|
+
return {
|
|
390
|
+
textFont: fontHelper(this.themeService.theme.typography.text3),
|
|
391
|
+
textColor: this.themeService.theme.palette.getAccent()
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
if (isGroupMemberMessage) {
|
|
395
|
+
return {
|
|
396
|
+
textFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
397
|
+
textColor: this.themeService.theme.palette.getAccent600()
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
return {
|
|
401
|
+
textFont: fontHelper(this.themeService.theme.typography.text2),
|
|
402
|
+
textColor: this.themeService.theme.palette.getAccent400()
|
|
403
|
+
};
|
|
404
|
+
};
|
|
405
|
+
this.startDirectCall = (sessionId) => {
|
|
406
|
+
this.sessionId = sessionId;
|
|
407
|
+
this.showOngoingCall = true;
|
|
408
|
+
this.ref.detectChanges();
|
|
409
|
+
};
|
|
410
|
+
this.launchCollaborativeWhiteboardDocument = (url) => {
|
|
411
|
+
window.open(url, "", "fullscreen=yes, scrollbars=auto");
|
|
412
|
+
};
|
|
413
|
+
this.openConfirmDialog = false;
|
|
414
|
+
this.openFullscreenView = false;
|
|
415
|
+
this.imageurlToOpen = "";
|
|
416
|
+
this.fullScreenViewerStyle = {
|
|
417
|
+
height: "100%",
|
|
418
|
+
width: "100%",
|
|
419
|
+
closeIconTint: "blue"
|
|
420
|
+
};
|
|
421
|
+
this.onConfirmClick = () => {
|
|
422
|
+
this.openConfirmDialog = false;
|
|
423
|
+
if (this.closeImageModeration) {
|
|
424
|
+
this.closeImageModeration();
|
|
425
|
+
}
|
|
426
|
+
this.ref.detectChanges();
|
|
427
|
+
};
|
|
428
|
+
this.setOngoingCallStyle = () => {
|
|
429
|
+
let defaultStyle = new CallscreenStyle({
|
|
430
|
+
maxHeight: "100%",
|
|
431
|
+
maxWidth: "100%",
|
|
432
|
+
border: "none",
|
|
433
|
+
borderRadius: "0",
|
|
434
|
+
background: "#1c2226",
|
|
435
|
+
minHeight: "400px",
|
|
436
|
+
minWidth: "400px",
|
|
437
|
+
minimizeIconTint: this.themeService.theme.palette.getAccent900(),
|
|
438
|
+
maximizeIconTint: this.themeService.theme.palette.getAccent900(),
|
|
439
|
+
});
|
|
440
|
+
this.ongoingCallStyle = { ...defaultStyle, ...this.ongoingCallStyle };
|
|
441
|
+
};
|
|
442
|
+
/**
|
|
443
|
+
* Listener To Receive Messages in Real Time
|
|
444
|
+
* @param
|
|
445
|
+
*/
|
|
446
|
+
this.fetchPreviousMessages = () => {
|
|
447
|
+
if (this.reinitialized) {
|
|
448
|
+
if (this.messagesRequestBuilder) {
|
|
449
|
+
this.requestBuilder = this.messagesRequestBuilder.setMessageId(this.messagesList[0].getId()).build();
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
if (this.user) {
|
|
453
|
+
this.requestBuilder = new CometChat.MessagesRequestBuilder().setUID(this.user.getUid())
|
|
454
|
+
.setLimit(this.limit)
|
|
455
|
+
.setTypes(this.types)
|
|
456
|
+
.setMessageId(this.messagesList[0].getId())
|
|
457
|
+
.setCategories(this.categories)
|
|
458
|
+
.hideReplies(true)
|
|
459
|
+
.build();
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
this.requestBuilder = new CometChat.MessagesRequestBuilder().setGUID(this.group.getGuid())
|
|
463
|
+
.setLimit(this.limit)
|
|
464
|
+
.setTypes(this.types)
|
|
465
|
+
.setMessageId(this.messagesList[0].getId())
|
|
466
|
+
.setCategories(this.categories)
|
|
467
|
+
.hideReplies(true)
|
|
468
|
+
.build();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
this.requestBuilder.fetchPrevious().then((messageList) => {
|
|
473
|
+
console.log(messageList);
|
|
474
|
+
this.state = States.loading;
|
|
475
|
+
// No Messages Found
|
|
476
|
+
if (messageList.length === 0 && this.messagesList.length === 0) {
|
|
477
|
+
this.state = States.empty;
|
|
478
|
+
this.ref.detectChanges();
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
if (messageList && messageList.length > 0) {
|
|
482
|
+
let lastMessage = messageList[messageList.length - 1];
|
|
483
|
+
if (lastMessage?.getSender().getUid() != this.loggedInUser?.getUid() && !lastMessage.getDeliveredAt()) {
|
|
484
|
+
//mark the message as delivered
|
|
485
|
+
if (!this.disableReceipt) {
|
|
486
|
+
CometChat.markAsDelivered(lastMessage).then((receipt) => {
|
|
487
|
+
let messageKey = this.messagesList.findIndex((m) => m.getId() === Number(receipt?.getMessageId()));
|
|
488
|
+
if (messageKey > -1) {
|
|
489
|
+
this.markAllMessagAsDelivered(messageKey);
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
if (!lastMessage?.getReadAt()) {
|
|
495
|
+
if (!this.disableReceipt) {
|
|
496
|
+
CometChat.markAsRead(lastMessage).then((receipt) => {
|
|
497
|
+
let messageKey = this.messagesList.findIndex((m) => m.getId() === Number(receipt?.getMessageId()));
|
|
498
|
+
if (messageKey > -1) {
|
|
499
|
+
this.markAllMessagAsRead(messageKey);
|
|
500
|
+
}
|
|
501
|
+
}).catch((error) => {
|
|
502
|
+
if (this.onError) {
|
|
503
|
+
this.onError(error);
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
this.UnreadCount = [];
|
|
509
|
+
this.ref.detectChanges();
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
this.state = States.loaded;
|
|
513
|
+
this.ref.detectChanges();
|
|
514
|
+
//if the sender of the message is not the loggedin user, mark it as read.
|
|
515
|
+
let prevScrollHeight = this.listScroll.nativeElement.scrollHeight;
|
|
516
|
+
setTimeout(() => {
|
|
517
|
+
this.listScroll.nativeElement.scrollTop =
|
|
518
|
+
this.listScroll.nativeElement.scrollHeight - prevScrollHeight;
|
|
519
|
+
});
|
|
520
|
+
this.showSmartReply = false;
|
|
521
|
+
this.smartReplyMessage = null;
|
|
522
|
+
this.prependMessages(messageList);
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
this.state = States.loaded;
|
|
526
|
+
}
|
|
527
|
+
this.ref.detectChanges();
|
|
528
|
+
}, (error) => {
|
|
529
|
+
this.state = States.error;
|
|
530
|
+
if (this.onError) {
|
|
531
|
+
this.onError(error);
|
|
532
|
+
}
|
|
533
|
+
this.ref.detectChanges();
|
|
534
|
+
}).catch((error) => {
|
|
535
|
+
console.log(error);
|
|
536
|
+
this.state = States.error;
|
|
537
|
+
this.ref.detectChanges();
|
|
538
|
+
});
|
|
539
|
+
};
|
|
540
|
+
this.fetchNextMessage = () => {
|
|
541
|
+
let index = this.messagesList.length - 1;
|
|
542
|
+
if (this.reinitialized) {
|
|
543
|
+
if (this.messagesRequestBuilder) {
|
|
544
|
+
this.requestBuilder = this.messagesRequestBuilder.setMessageId(this.messagesList[index].getId()).build();
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
if (this.user) {
|
|
548
|
+
this.requestBuilder = new CometChat.MessagesRequestBuilder().setUID(this.user.getUid())
|
|
549
|
+
.setLimit(this.limit)
|
|
550
|
+
.setTypes(this.types)
|
|
551
|
+
.setMessageId(this.messagesList[index].getId())
|
|
552
|
+
.setCategories(this.categories)
|
|
553
|
+
.hideReplies(true)
|
|
554
|
+
.build();
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
this.requestBuilder = new CometChat.MessagesRequestBuilder().setGUID(this.group.getGuid())
|
|
558
|
+
.setLimit(this.limit)
|
|
559
|
+
.setTypes(this.types)
|
|
560
|
+
.setMessageId(this.messagesList[index].getId())
|
|
561
|
+
.setCategories(this.categories)
|
|
562
|
+
.hideReplies(true)
|
|
563
|
+
.build();
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
this.requestBuilder.fetchNext().then((messageList) => {
|
|
567
|
+
this.state = States.loading;
|
|
568
|
+
// No Messages Found
|
|
569
|
+
if (messageList.length === 0 && this.messagesList.length === 0) {
|
|
570
|
+
this.state = States.empty;
|
|
571
|
+
this.ref.detectChanges();
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
if (messageList && messageList.length) {
|
|
575
|
+
let lastMessage = messageList[messageList.length - 1];
|
|
576
|
+
if (!lastMessage?.getReadAt() && lastMessage?.getSender().getUid() != this.loggedInUser?.getUid()) {
|
|
577
|
+
if (!this.disableReceipt) {
|
|
578
|
+
CometChat.markAsRead(lastMessage);
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
this.UnreadCount = [];
|
|
582
|
+
this.ref.detectChanges();
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
if (!lastMessage?.getDeliveredAt() && lastMessage?.getSender().getUid() != this.loggedInUser?.getUid()) {
|
|
586
|
+
this.markMessageAsDelivered(lastMessage);
|
|
587
|
+
this.markAllMessagAsDelivered(messageList.length - 1);
|
|
588
|
+
}
|
|
589
|
+
this.state = States.loaded;
|
|
590
|
+
let prevScrollHeight = this.listScroll.nativeElement.scrollHeight;
|
|
591
|
+
setTimeout(() => {
|
|
592
|
+
this.listScroll.nativeElement.scrollTop =
|
|
593
|
+
this.listScroll.nativeElement.scrollHeight - prevScrollHeight;
|
|
594
|
+
});
|
|
595
|
+
this.appendMessages(messageList);
|
|
596
|
+
this.ref.detectChanges();
|
|
597
|
+
}
|
|
598
|
+
}, (error) => {
|
|
599
|
+
this.state = States.error;
|
|
600
|
+
console.log(error);
|
|
601
|
+
if (this.onError) {
|
|
602
|
+
this.onError(error);
|
|
603
|
+
}
|
|
604
|
+
this.ref.detectChanges();
|
|
605
|
+
}).catch((error) => {
|
|
606
|
+
console.log(error);
|
|
607
|
+
this.state = States.error;
|
|
608
|
+
this.ref.detectChanges();
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
};
|
|
612
|
+
this.appendMessages = (messages) => {
|
|
613
|
+
this.messagesList.push(...messages);
|
|
614
|
+
this.messageCount = this.messagesList.length;
|
|
615
|
+
if (this.messageCount > this.thresholdValue) {
|
|
616
|
+
this.keepRecentMessages = true;
|
|
617
|
+
this.reInitializeMessageBuilder();
|
|
618
|
+
}
|
|
619
|
+
this.state = States.loaded;
|
|
620
|
+
this.ref.detectChanges();
|
|
621
|
+
};
|
|
622
|
+
/**
|
|
623
|
+
* translate message then call update message
|
|
624
|
+
* @param {CometChat.BaseMessage} message
|
|
625
|
+
*/
|
|
626
|
+
// translateMessage(message: CometChat.BaseMessage) {
|
|
627
|
+
// }
|
|
628
|
+
/**
|
|
629
|
+
* @param {CometChat.BaseMessage} message
|
|
630
|
+
*/
|
|
631
|
+
this.markMessageAsDelivered = (message) => {
|
|
632
|
+
if (!this.disableReceipt && message?.getSender().getUid() !== this.loggedInUser?.getUid() && message.hasOwnProperty("deliveredAt") === false) {
|
|
633
|
+
CometChat.markAsDelivered(message);
|
|
634
|
+
}
|
|
635
|
+
};
|
|
636
|
+
/**
|
|
637
|
+
* @param {CometChat.BaseMessage} message
|
|
638
|
+
* @param {string} type
|
|
639
|
+
*/
|
|
640
|
+
this.messageReceivedHandler = (message, type) => {
|
|
641
|
+
++this.messageCount;
|
|
642
|
+
if (message.getParentMessageId()) {
|
|
643
|
+
this.updateReplyCount(message);
|
|
644
|
+
this.addMessage(message);
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
if (this.messageCount > this.thresholdValue) {
|
|
648
|
+
this.keepRecentMessages = true;
|
|
649
|
+
this.reInitializeMessageBuilder();
|
|
650
|
+
}
|
|
651
|
+
this.addMessage(message);
|
|
652
|
+
if (!this.isOnBottom) {
|
|
653
|
+
if (this.scrollToBottomOnNewMessages) {
|
|
654
|
+
setTimeout(() => {
|
|
655
|
+
this.scrollToBottom();
|
|
656
|
+
}, 100);
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
let countText = localize("NEW_MESSAGES");
|
|
660
|
+
if (this.newMessageIndicatorText && this.newMessageIndicatorText != "") {
|
|
661
|
+
countText = this.newMessageIndicatorText;
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
countText = this.UnreadCount.length > 0 ? localize("NEW_MESSAGES") : localize("NEW_MESSAGE");
|
|
665
|
+
}
|
|
666
|
+
this.UnreadCount.push(message);
|
|
667
|
+
this.newMessageCount = " ↓ " + this.UnreadCount.length + " " + countText;
|
|
668
|
+
this.ref.detectChanges();
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
this.playAudio();
|
|
673
|
+
//handling dom lag - increment count only for main message list
|
|
674
|
+
if (message.hasOwnProperty("parentMessageId") === false && this.parentMessageId) {
|
|
675
|
+
++this.messageCount;
|
|
676
|
+
this.ref.detectChanges();
|
|
677
|
+
}
|
|
678
|
+
else if (message.hasOwnProperty("parentMessageId") === true && this.parentMessageId) {
|
|
679
|
+
if (message.getParentMessageId() === this.parentMessageId && this.isOnBottom) {
|
|
680
|
+
if (!this.disableReceipt) {
|
|
681
|
+
CometChat.markAsRead(message).then(() => {
|
|
682
|
+
CometChatMessageEvents.ccMessageRead.next(message);
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
else {
|
|
686
|
+
this.UnreadCount = [];
|
|
687
|
+
this.ref.detectChanges();
|
|
688
|
+
}
|
|
689
|
+
this.ref.detectChanges();
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
}
|
|
694
|
+
};
|
|
695
|
+
this.reInitializeMessageBuilder = () => {
|
|
696
|
+
if (!this.parentMessageId) {
|
|
697
|
+
this.messageCount = 0;
|
|
698
|
+
}
|
|
699
|
+
this.requestBuilder = null;
|
|
700
|
+
CometChat.removeMessageListener(this.msgListenerId);
|
|
701
|
+
CometChat.removeGroupListener(this.groupListenerId);
|
|
702
|
+
CometChat.removeCallListener(this.callListenerId);
|
|
703
|
+
this.reInitializeMessageList();
|
|
704
|
+
};
|
|
705
|
+
/**
|
|
706
|
+
* Emits an Action Indicating that a message was deleted by the user/person you are chatting with
|
|
707
|
+
* @param {CometChat.BaseMessage} message
|
|
708
|
+
*/
|
|
709
|
+
/**
|
|
710
|
+
* Detects if the message that was edit is your current open conversation window
|
|
711
|
+
* @param {CometChat.BaseMessage} message
|
|
712
|
+
*/
|
|
713
|
+
this.messageEdited = (message) => {
|
|
714
|
+
try {
|
|
715
|
+
if (this.group &&
|
|
716
|
+
message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
|
|
717
|
+
message.getReceiverId() === this.group?.getGuid()) {
|
|
718
|
+
this.updateEditedMessage(message);
|
|
719
|
+
}
|
|
720
|
+
else if (this.user &&
|
|
721
|
+
message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
|
|
722
|
+
this.loggedInUser?.getUid() === message.getReceiverId() &&
|
|
723
|
+
message?.getSender().getUid() === this.user?.getUid()) {
|
|
724
|
+
this.updateEditedMessage(message);
|
|
725
|
+
}
|
|
726
|
+
else if (this.user &&
|
|
727
|
+
message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
|
|
728
|
+
this.loggedInUser?.getUid() === message?.getSender().getUid() &&
|
|
729
|
+
message.getReceiverId() === this.user?.getUid()) {
|
|
730
|
+
this.updateEditedMessage(message);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
catch (error) {
|
|
734
|
+
if (this.onError) {
|
|
735
|
+
this.onError(error);
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
this.ref.detectChanges();
|
|
739
|
+
};
|
|
740
|
+
/**
|
|
741
|
+
* Emits an Action Indicating that a message was deleted by the user/person you are chatting with
|
|
742
|
+
* @param {CometChat.BaseMessage} message
|
|
743
|
+
*/
|
|
744
|
+
this.updateEditedMessage = (message) => {
|
|
745
|
+
const messageList = this.messagesList;
|
|
746
|
+
const messageKey = messageList.findIndex(m => m.getId() === message.getId());
|
|
747
|
+
if (messageKey > -1) {
|
|
748
|
+
this.messagesList = [
|
|
749
|
+
...messageList.slice(0, messageKey),
|
|
750
|
+
message,
|
|
751
|
+
...messageList.slice(messageKey + 1)
|
|
752
|
+
];
|
|
753
|
+
}
|
|
754
|
+
this.ref.detectChanges();
|
|
755
|
+
};
|
|
756
|
+
/**
|
|
757
|
+
* @param {CometChat.BaseMessage} message
|
|
758
|
+
* @param {string} type
|
|
759
|
+
*/
|
|
760
|
+
this.customMessageReceivedHandler = (message, type) => {
|
|
761
|
+
++this.messageCount;
|
|
762
|
+
// add received message to messages list
|
|
763
|
+
if (message.getParentMessageId()) {
|
|
764
|
+
this.updateReplyCount(message);
|
|
765
|
+
this.addMessage(message);
|
|
766
|
+
}
|
|
767
|
+
else {
|
|
768
|
+
if (this.messageCount > this.thresholdValue) {
|
|
769
|
+
this.keepRecentMessages = true;
|
|
770
|
+
this.reInitializeMessageBuilder();
|
|
771
|
+
}
|
|
772
|
+
this.addMessage(message);
|
|
773
|
+
if (!this.isOnBottom) {
|
|
774
|
+
if (this.scrollToBottomOnNewMessages) {
|
|
775
|
+
setTimeout(() => {
|
|
776
|
+
this.scrollToBottom();
|
|
777
|
+
}, 100);
|
|
778
|
+
}
|
|
779
|
+
else {
|
|
780
|
+
let countText = localize("NEW_MESSAGES");
|
|
781
|
+
if (this.newMessageIndicatorText && this.newMessageIndicatorText != "") {
|
|
782
|
+
countText = this.newMessageIndicatorText;
|
|
783
|
+
}
|
|
784
|
+
else {
|
|
785
|
+
countText = this.UnreadCount.length > 0 ? localize("NEW_MESSAGES") : localize("NEW_MESSAGE");
|
|
786
|
+
}
|
|
787
|
+
this.UnreadCount.push(message);
|
|
788
|
+
this.newMessageCount = " ↓ " + this.UnreadCount.length + " " + countText;
|
|
789
|
+
this.ref.detectChanges();
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
this.playAudio();
|
|
794
|
+
//handling dom lag - increment count only for main message list
|
|
795
|
+
if (message.hasOwnProperty("parentMessageId") === false && !this.parentMessageId) {
|
|
796
|
+
++this.messageCount;
|
|
797
|
+
//if the user has not scrolled in chat window(scroll is at the bottom of the chat window)
|
|
798
|
+
}
|
|
799
|
+
else if (message.hasOwnProperty("parentMessageId") === true && this.parentMessageId && this.isOnBottom) {
|
|
800
|
+
if (message.getParentMessageId() === this.parentMessageId) {
|
|
801
|
+
if (!this.disableReceipt) {
|
|
802
|
+
CometChat.markAsRead(message).then(() => {
|
|
803
|
+
CometChatMessageEvents.ccMessageRead.next(message);
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
else {
|
|
807
|
+
this.UnreadCount = [];
|
|
808
|
+
this.ref.detectChanges();
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
else {
|
|
813
|
+
}
|
|
814
|
+
this.ref.detectChanges();
|
|
815
|
+
};
|
|
816
|
+
// public methods
|
|
817
|
+
this.addMessage = (message) => {
|
|
818
|
+
if (!message?.getParentMessageId() || this.parentMessageId) {
|
|
819
|
+
this.messagesList.push(message);
|
|
820
|
+
if (!message?.getSender() || this.loggedInUser?.getUid() == message?.getSender()?.getUid() || this.isOnBottom) {
|
|
821
|
+
this.scrollToBottom();
|
|
822
|
+
this.ref.detectChanges();
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
if (this.state != States.loaded) {
|
|
826
|
+
this.state = States.loaded;
|
|
827
|
+
this.ref.detectChanges();
|
|
828
|
+
}
|
|
829
|
+
this.ref.detectChanges();
|
|
830
|
+
};
|
|
831
|
+
/**
|
|
832
|
+
* callback for copy message
|
|
833
|
+
* @param {CometChat.TextMessage} object
|
|
834
|
+
*/
|
|
835
|
+
this.onCopyMessage = (object) => {
|
|
836
|
+
navigator.clipboard.writeText(object.getText());
|
|
837
|
+
};
|
|
838
|
+
/**
|
|
839
|
+
* callback for editMessage option
|
|
840
|
+
* @param {CometChat.BaseMessage} object
|
|
841
|
+
*/
|
|
842
|
+
this.onEditMessage = (object) => {
|
|
843
|
+
CometChatMessageEvents.ccMessageEdited.next({ message: object, status: MessageStatus.inprogress });
|
|
844
|
+
};
|
|
845
|
+
this.removeMessage = (message) => {
|
|
846
|
+
try {
|
|
847
|
+
const messageKey = this.messagesList.findIndex(msg => msg?.getId() === message.getId());
|
|
848
|
+
if (messageKey > -1) {
|
|
849
|
+
this.messagesList.splice(messageKey, 1, message);
|
|
850
|
+
this.messagesList = [...this.messagesList];
|
|
851
|
+
this.ref.detectChanges();
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
catch (error) {
|
|
855
|
+
if (this.onError) {
|
|
856
|
+
this.onError(error);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
};
|
|
860
|
+
this.deleteMessage = (message) => {
|
|
861
|
+
try {
|
|
862
|
+
const messageId = message.getId();
|
|
863
|
+
CometChat.deleteMessage(messageId)
|
|
864
|
+
.then((deletedMessage) => {
|
|
865
|
+
CometChatMessageEvents.ccMessageDeleted.next(deletedMessage);
|
|
866
|
+
// this.ref.detectChanges()
|
|
867
|
+
})
|
|
868
|
+
.catch((error) => {
|
|
869
|
+
if (this.onError) {
|
|
870
|
+
this.onError(error);
|
|
871
|
+
}
|
|
872
|
+
});
|
|
873
|
+
}
|
|
874
|
+
catch (error) {
|
|
875
|
+
if (this.onError) {
|
|
876
|
+
this.onError(error);
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
};
|
|
880
|
+
this.scrollToBottom = () => {
|
|
881
|
+
try {
|
|
882
|
+
setTimeout(() => {
|
|
883
|
+
this.listScroll.nativeElement.scroll({
|
|
884
|
+
top: this.listScroll.nativeElement.scrollHeight,
|
|
885
|
+
left: 0,
|
|
886
|
+
});
|
|
887
|
+
this.isOnBottom = true;
|
|
888
|
+
this.ref.detectChanges();
|
|
889
|
+
}, 10);
|
|
890
|
+
}
|
|
891
|
+
catch (error) {
|
|
892
|
+
if (this.onError) {
|
|
893
|
+
this.onError(error);
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
};
|
|
897
|
+
this.closeSmartReply = () => {
|
|
898
|
+
this.showSmartReply = false;
|
|
899
|
+
this.smartReplyMessage = null;
|
|
900
|
+
this.ref.detectChanges();
|
|
901
|
+
};
|
|
902
|
+
this.sendReply = (event) => {
|
|
903
|
+
let reply = event?.detail?.reply;
|
|
904
|
+
if (this.smartReplyConfig.ccSmartRepliesClicked) {
|
|
905
|
+
this.smartReplyConfig.ccSmartRepliesClicked(reply, this.smartReplyMessage, this.onError, this.customSoundForMessages, this.disableSoundForMessages);
|
|
906
|
+
this.closeSmartReply();
|
|
907
|
+
}
|
|
908
|
+
};
|
|
909
|
+
/**
|
|
910
|
+
* styling part
|
|
911
|
+
*/
|
|
912
|
+
this.chatsListStyle = () => {
|
|
913
|
+
return {
|
|
914
|
+
height: this.messageListStyle.height,
|
|
915
|
+
background: this.messageListStyle.background,
|
|
916
|
+
};
|
|
917
|
+
};
|
|
918
|
+
this.messageContainerStyle = () => {
|
|
919
|
+
return {
|
|
920
|
+
width: this.messageListStyle.width,
|
|
921
|
+
};
|
|
922
|
+
};
|
|
923
|
+
this.errorStyle = () => {
|
|
924
|
+
return {
|
|
925
|
+
textFont: this.messageListStyle.errorStateTextFont,
|
|
926
|
+
textColor: this.messageListStyle.errorStateTextColor,
|
|
927
|
+
};
|
|
928
|
+
};
|
|
929
|
+
this.emptyStyle = () => {
|
|
930
|
+
return {
|
|
931
|
+
textFont: this.messageListStyle.emptyStateTextFont,
|
|
932
|
+
textColor: this.messageListStyle.emptyStateTextColor,
|
|
933
|
+
};
|
|
934
|
+
};
|
|
935
|
+
this.loadingStyle = () => {
|
|
936
|
+
return {
|
|
937
|
+
iconTint: this.messageListStyle.loadingIconTint,
|
|
938
|
+
};
|
|
939
|
+
};
|
|
940
|
+
this.wrapperStyle = () => {
|
|
941
|
+
return {
|
|
942
|
+
height: this.messageListStyle.height,
|
|
943
|
+
width: this.messageListStyle.width,
|
|
944
|
+
background: this.messageListStyle.background,
|
|
945
|
+
border: this.messageListStyle.border,
|
|
946
|
+
borderRadius: this.messageListStyle.borderRadius
|
|
947
|
+
};
|
|
948
|
+
};
|
|
949
|
+
}
|
|
950
|
+
getThreadViewStyle(message) {
|
|
951
|
+
if ((!message.getSender() || message.getSender().getUid() === this.loggedInUser?.getUid()) && message?.getType() == CometChatUIKitConstants.MessageTypes.text) {
|
|
952
|
+
return {
|
|
953
|
+
height: "30px",
|
|
954
|
+
width: "100%",
|
|
955
|
+
border: "none",
|
|
956
|
+
borderRadius: "0",
|
|
957
|
+
background: "transparent",
|
|
958
|
+
padding: "0 8px",
|
|
959
|
+
buttonIconTint: this.themeService.theme.palette.getAccent600(),
|
|
960
|
+
display: "flex",
|
|
961
|
+
flexFlow: "row-reverse",
|
|
962
|
+
alignItems: "center",
|
|
963
|
+
justifyContent: "space-between",
|
|
964
|
+
buttonTextColor: this.themeService.theme.palette.getAccent("dark")
|
|
965
|
+
};
|
|
966
|
+
}
|
|
967
|
+
else {
|
|
968
|
+
return {
|
|
969
|
+
height: "30px",
|
|
970
|
+
width: "100%",
|
|
971
|
+
border: "none",
|
|
972
|
+
borderRadius: "0",
|
|
973
|
+
background: "transparent",
|
|
974
|
+
padding: "0 8px",
|
|
975
|
+
buttonIconTint: "grey",
|
|
976
|
+
display: "flex",
|
|
977
|
+
flexFlow: "row-reverse",
|
|
978
|
+
alignItems: "center",
|
|
979
|
+
justifyContent: "space-between",
|
|
980
|
+
buttonTextColor: this.themeService.theme.palette.getPrimary()
|
|
981
|
+
};
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
ngOnChanges(changes) {
|
|
985
|
+
console.log(this.templates);
|
|
986
|
+
try {
|
|
987
|
+
if (changes[CometChatUIKitConstants.MessageReceiverType.user] || changes[CometChatUIKitConstants.MessageReceiverType.group]) {
|
|
988
|
+
this.showEnabledExtensions();
|
|
989
|
+
this.numberOfTopScroll = 0;
|
|
990
|
+
if (!this.loggedInUser) {
|
|
991
|
+
CometChat.getLoggedinUser().then((user) => {
|
|
992
|
+
this.loggedInUser = user;
|
|
993
|
+
});
|
|
994
|
+
}
|
|
995
|
+
this.messagesList = [];
|
|
996
|
+
if (this.user) {
|
|
997
|
+
if (Object.keys(this.user).length > 1) {
|
|
998
|
+
this.user = this.user;
|
|
999
|
+
this.type = CometChatUIKitConstants.MessageReceiverType.user;
|
|
1000
|
+
this.createRequestBuilder();
|
|
1001
|
+
}
|
|
1002
|
+
else {
|
|
1003
|
+
CometChat.getUser(this.user)
|
|
1004
|
+
.then((user) => {
|
|
1005
|
+
this.user = user;
|
|
1006
|
+
this.type = CometChatUIKitConstants.MessageReceiverType.user;
|
|
1007
|
+
this.createRequestBuilder();
|
|
1008
|
+
});
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
else if (this.group) {
|
|
1012
|
+
if (Object.keys(this.group).length > 1) {
|
|
1013
|
+
this.group = this.group;
|
|
1014
|
+
this.type = CometChatUIKitConstants.MessageReceiverType.group;
|
|
1015
|
+
this.createRequestBuilder();
|
|
1016
|
+
}
|
|
1017
|
+
else {
|
|
1018
|
+
CometChat.getGroup(this.group)
|
|
1019
|
+
.then((group) => {
|
|
1020
|
+
this.group = group;
|
|
1021
|
+
this.type = CometChatUIKitConstants.MessageReceiverType.group;
|
|
1022
|
+
this.createRequestBuilder();
|
|
1023
|
+
});
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
//Removing Previous Conversation Listeners
|
|
1027
|
+
CometChat.removeMessageListener(this.msgListenerId);
|
|
1028
|
+
CometChat.removeGroupListener(this.groupListenerId);
|
|
1029
|
+
CometChat.removeCallListener(this.callListenerId);
|
|
1030
|
+
this.msgListenerId = "message_" + new Date().getTime();
|
|
1031
|
+
this.groupListenerId = "group_" + new Date().getTime();
|
|
1032
|
+
this.callListenerId = "call_" + new Date().getTime();
|
|
1033
|
+
// Attach MessageListeners for the new conversation
|
|
1034
|
+
this.addMessageEventListeners();
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
catch (error) {
|
|
1038
|
+
if (this.onError) {
|
|
1039
|
+
this.onError(error);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
getCallBubbleTitle(message) {
|
|
1044
|
+
if (!message.getSender() || message.getSender().getUid() == this.loggedInUser.getUid()) {
|
|
1045
|
+
return localize("YOU_INITIATED_GROUP_CALL");
|
|
1046
|
+
}
|
|
1047
|
+
else {
|
|
1048
|
+
return `${message.getSender().getName()} ${localize("INITIATED_GROUP_CALL")}`;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
reactToMessages(emoji) {
|
|
1052
|
+
let removeEmoji = false;
|
|
1053
|
+
let reactionObject = {};
|
|
1054
|
+
let newMessageObject;
|
|
1055
|
+
let msgObject = this.messageToReact;
|
|
1056
|
+
const userObject = {};
|
|
1057
|
+
if (this.loggedInUser?.getAvatar()) {
|
|
1058
|
+
userObject["avatar"] = this.loggedInUser?.getAvatar();
|
|
1059
|
+
}
|
|
1060
|
+
if (this.loggedInUser?.getName()) {
|
|
1061
|
+
userObject["name"] = this.loggedInUser?.getName();
|
|
1062
|
+
}
|
|
1063
|
+
let uid = this.loggedInUser?.getUid();
|
|
1064
|
+
const emojiObject = {
|
|
1065
|
+
[emoji]: {
|
|
1066
|
+
[uid]: userObject,
|
|
1067
|
+
},
|
|
1068
|
+
};
|
|
1069
|
+
const reactionExtensionsData = CometChatUIKitUtility.checkMessageForExtensionsData(this.messageToReact, "reactions");
|
|
1070
|
+
if (reactionExtensionsData) {
|
|
1071
|
+
if (reactionExtensionsData[emoji]) {
|
|
1072
|
+
//if the reactions metadata has the selected emoji/reaction for the loggedin user
|
|
1073
|
+
if (reactionExtensionsData[emoji][uid]) {
|
|
1074
|
+
delete reactionExtensionsData[emoji];
|
|
1075
|
+
removeEmoji = true;
|
|
1076
|
+
}
|
|
1077
|
+
else {
|
|
1078
|
+
let data = msgObject["metadata"]["@injected"]["extensions"]["reactions"];
|
|
1079
|
+
data[emoji][uid] = userObject;
|
|
1080
|
+
reactionObject = {
|
|
1081
|
+
...data,
|
|
1082
|
+
};
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
else {
|
|
1086
|
+
if (!msgObject?.hasOwnProperty("metadata")) {
|
|
1087
|
+
msgObject["metadata"] = {};
|
|
1088
|
+
}
|
|
1089
|
+
if (!msgObject["metadata"].hasOwnProperty("@injected")) {
|
|
1090
|
+
msgObject["metadata"]["@injected"] = {};
|
|
1091
|
+
}
|
|
1092
|
+
if (!msgObject["metadata"]["@injected"].hasOwnProperty("extensions")) {
|
|
1093
|
+
msgObject["metadata"]["@injected"]["extensions"] = {};
|
|
1094
|
+
}
|
|
1095
|
+
if (!msgObject["metadata"]["@injected"]["extensions"].hasOwnProperty("reactions")) {
|
|
1096
|
+
msgObject["metadata"]["@injected"]["extensions"]["reactions"] = {};
|
|
1097
|
+
}
|
|
1098
|
+
let data = msgObject["metadata"]["@injected"]["extensions"]["reactions"];
|
|
1099
|
+
reactionObject = { ...data, ...emojiObject };
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
else {
|
|
1103
|
+
if (!msgObject?.hasOwnProperty("metadata")) {
|
|
1104
|
+
msgObject["metadata"] = {};
|
|
1105
|
+
}
|
|
1106
|
+
if (!msgObject["metadata"].hasOwnProperty("@injected")) {
|
|
1107
|
+
msgObject["metadata"]["@injected"] = {};
|
|
1108
|
+
}
|
|
1109
|
+
if (!msgObject["metadata"]["@injected"].hasOwnProperty("extensions")) {
|
|
1110
|
+
msgObject["metadata"]["@injected"]["extensions"] = {};
|
|
1111
|
+
}
|
|
1112
|
+
if (!msgObject["metadata"]["@injected"]["extensions"].hasOwnProperty("reactions")) {
|
|
1113
|
+
msgObject["metadata"]["@injected"]["extensions"]["reactions"] = {};
|
|
1114
|
+
}
|
|
1115
|
+
reactionObject = {
|
|
1116
|
+
...emojiObject,
|
|
1117
|
+
};
|
|
1118
|
+
}
|
|
1119
|
+
var metadataObject;
|
|
1120
|
+
if (removeEmoji) {
|
|
1121
|
+
metadataObject = {
|
|
1122
|
+
...msgObject["metadata"],
|
|
1123
|
+
};
|
|
1124
|
+
}
|
|
1125
|
+
else {
|
|
1126
|
+
metadataObject = {
|
|
1127
|
+
...msgObject["metadata"],
|
|
1128
|
+
"@injected": {
|
|
1129
|
+
...msgObject["metadata"]["@injected"],
|
|
1130
|
+
extensions: {
|
|
1131
|
+
...msgObject["metadata"]["@injected"]["extensions"],
|
|
1132
|
+
reactions: {
|
|
1133
|
+
...reactionObject,
|
|
1134
|
+
},
|
|
1135
|
+
},
|
|
1136
|
+
},
|
|
1137
|
+
};
|
|
1138
|
+
}
|
|
1139
|
+
newMessageObject = this.messageToReact;
|
|
1140
|
+
newMessageObject.setMetadata(metadataObject);
|
|
1141
|
+
this.updateMessage(newMessageObject);
|
|
1142
|
+
try {
|
|
1143
|
+
CometChat.callExtension(ReactionsConstants.reactions, ReactionsConstants.post, ReactionsConstants.v1, {
|
|
1144
|
+
msgId: this.messageToReact?.getId(),
|
|
1145
|
+
emoji: emoji,
|
|
1146
|
+
})
|
|
1147
|
+
.then((response) => {
|
|
1148
|
+
})
|
|
1149
|
+
.catch((error) => {
|
|
1150
|
+
console.log(error);
|
|
1151
|
+
});
|
|
1152
|
+
}
|
|
1153
|
+
catch (error) {
|
|
1154
|
+
console.log(error);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
ngOnDestroy() {
|
|
1158
|
+
this.unsubscribeToEvents();
|
|
1159
|
+
try {
|
|
1160
|
+
//Removing Message Listeners
|
|
1161
|
+
CometChat.removeMessageListener(this.msgListenerId);
|
|
1162
|
+
CometChat.removeGroupListener(this.groupListenerId);
|
|
1163
|
+
CometChat.removeCallListener(this.callListenerId);
|
|
1164
|
+
}
|
|
1165
|
+
catch (error) {
|
|
1166
|
+
if (this.onError) {
|
|
1167
|
+
this.onError(error);
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
}
|
|
1171
|
+
reactionsStyle(message) {
|
|
1172
|
+
let sentByMe = !message?.getSender() || message.getSender().getUid() == this.loggedInUser?.getUid();
|
|
1173
|
+
let isLeftAligned = this.alignment == MessageListAlignment.left || !sentByMe || message?.getCategory() != CometChatUIKitConstants.MessageCategory.message;
|
|
1174
|
+
if (isLeftAligned) {
|
|
1175
|
+
return {
|
|
1176
|
+
height: "100%",
|
|
1177
|
+
width: "100%",
|
|
1178
|
+
border: "none",
|
|
1179
|
+
borderRadius: "0",
|
|
1180
|
+
background: "transparent",
|
|
1181
|
+
textFont: fontHelper(this.themeService.theme.typography.subtitle1),
|
|
1182
|
+
textColor: this.themeService.theme.palette.getAccent600(),
|
|
1183
|
+
activeTextColor: this.themeService.theme.palette.getAccent("dark"),
|
|
1184
|
+
activeTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
|
|
1185
|
+
addReactionIconTint: this.themeService.theme.palette.getAccent600(),
|
|
1186
|
+
activeReactionBackground: this.themeService.theme.palette.getPrimary(),
|
|
1187
|
+
reactionBackground: "transparent",
|
|
1188
|
+
reactionBorder: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
|
|
1189
|
+
reactionBorderRadius: "12px",
|
|
1190
|
+
addReactionIconBackground: this.themeService.theme.palette.getAccent100()
|
|
1191
|
+
};
|
|
1192
|
+
}
|
|
1193
|
+
else {
|
|
1194
|
+
return {
|
|
1195
|
+
height: "100%",
|
|
1196
|
+
width: "100%",
|
|
1197
|
+
border: "none",
|
|
1198
|
+
borderRadius: "0",
|
|
1199
|
+
background: "transparent",
|
|
1200
|
+
textFont: fontHelper(this.themeService.theme.typography.caption1),
|
|
1201
|
+
textColor: this.themeService.theme.palette.getAccent("dark"),
|
|
1202
|
+
activeTextColor: this.themeService.theme.palette.getPrimary(),
|
|
1203
|
+
activeTextFont: fontHelper(this.themeService.theme.typography.caption1),
|
|
1204
|
+
addReactionIconTint: this.themeService.theme.palette.getAccent("dark"),
|
|
1205
|
+
activeReactionBackground: this.themeService.theme.palette.getAccent("dark"),
|
|
1206
|
+
reactionBackground: "transparent",
|
|
1207
|
+
reactionBorder: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
|
|
1208
|
+
reactionBorderRadius: "12px",
|
|
1209
|
+
addReactionIconBackground: this.themeService.theme.palette.getAccent100("light")
|
|
1210
|
+
};
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
getMessageById(id) {
|
|
1214
|
+
let messageKey = this.messagesList.findIndex((m) => m.getId() === id);
|
|
1215
|
+
if (messageKey > -1) {
|
|
1216
|
+
return this.messagesList[messageKey];
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
return false;
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
isTranslated(message) {
|
|
1223
|
+
let translatedMessageObject = message;
|
|
1224
|
+
if (translatedMessageObject && translatedMessageObject?.data?.metadata && translatedMessageObject?.data?.metadata[MessageTranslationConstants.translated_message]) {
|
|
1225
|
+
return translatedMessageObject.data.metadata[MessageTranslationConstants.translated_message];
|
|
1226
|
+
}
|
|
1227
|
+
else {
|
|
1228
|
+
return null;
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
setOptionsCallback(options) {
|
|
1232
|
+
options?.forEach((element) => {
|
|
1233
|
+
switch (element.id) {
|
|
1234
|
+
case CometChatUIKitConstants.MessageOption.deleteMessage:
|
|
1235
|
+
if (!element.onClick) {
|
|
1236
|
+
element.onClick = this.deleteCallback;
|
|
1237
|
+
}
|
|
1238
|
+
break;
|
|
1239
|
+
case CometChatUIKitConstants.MessageOption.editMessage:
|
|
1240
|
+
if (!element.onClick) {
|
|
1241
|
+
element.onClick = this.editCallback;
|
|
1242
|
+
}
|
|
1243
|
+
break;
|
|
1244
|
+
case CometChatUIKitConstants.MessageOption.translateMessage:
|
|
1245
|
+
if (!element.onClick) {
|
|
1246
|
+
element.onClick = this.translateMessage;
|
|
1247
|
+
}
|
|
1248
|
+
break;
|
|
1249
|
+
case CometChatUIKitConstants.MessageOption.copyMessage:
|
|
1250
|
+
if (!element.onClick) {
|
|
1251
|
+
element.onClick = this.copyCallback;
|
|
1252
|
+
}
|
|
1253
|
+
break;
|
|
1254
|
+
case CometChatUIKitConstants.MessageOption.reactToMessage:
|
|
1255
|
+
if (!element.onClick) {
|
|
1256
|
+
element.onClick = this.showEmojiKeyboard;
|
|
1257
|
+
}
|
|
1258
|
+
break;
|
|
1259
|
+
case CometChatUIKitConstants.MessageOption.replyInThread:
|
|
1260
|
+
if (!element.onClick) {
|
|
1261
|
+
element.onClick = this.threadCallback;
|
|
1262
|
+
}
|
|
1263
|
+
break;
|
|
1264
|
+
default:
|
|
1265
|
+
break;
|
|
1266
|
+
}
|
|
1267
|
+
});
|
|
1268
|
+
return options;
|
|
1269
|
+
}
|
|
1270
|
+
/**
|
|
1271
|
+
* send message options based on type
|
|
1272
|
+
* @param {CometChat.BaseMessage} msgObject
|
|
1273
|
+
*/
|
|
1274
|
+
setMessageOptions(msgObject) {
|
|
1275
|
+
let options;
|
|
1276
|
+
if (this.messageTemplate && this.messageTemplate.length > 0 && !msgObject?.getDeletedAt() && msgObject?.getType() != CometChatUIKitConstants.MessageTypes.groupMember) {
|
|
1277
|
+
this.messageTemplate.forEach((element) => {
|
|
1278
|
+
if (msgObject?.getId() && element.type == msgObject?.getType() && element?.options) {
|
|
1279
|
+
options = this.setOptionsCallback(element?.options(this.loggedInUser, msgObject, this.themeService.theme, this.group)) || [];
|
|
1280
|
+
}
|
|
1281
|
+
});
|
|
1282
|
+
}
|
|
1283
|
+
else {
|
|
1284
|
+
options = [];
|
|
1285
|
+
}
|
|
1286
|
+
return options;
|
|
1287
|
+
}
|
|
1288
|
+
/**
|
|
1289
|
+
* passing style based on message object
|
|
1290
|
+
* @param {CometChat.BaseMessage} messageObject
|
|
1291
|
+
*/
|
|
1292
|
+
setMessageBubbleStyle(msg) {
|
|
1293
|
+
let style;
|
|
1294
|
+
if (msg?.getDeletedAt()) {
|
|
1295
|
+
style = {
|
|
1296
|
+
background: "transparent",
|
|
1297
|
+
border: `1px dashed ${this.themeService.theme.palette.getAccent400()}`,
|
|
1298
|
+
borderRadius: "12px",
|
|
1299
|
+
};
|
|
1300
|
+
}
|
|
1301
|
+
else if (msg?.getType() == CometChatUIKitConstants.calls.meeting && (!msg?.getSender() || msg?.getSender().getUid() == this.loggedInUser.getUid())) {
|
|
1302
|
+
style = {
|
|
1303
|
+
background: this.themeService.theme.palette.getPrimary(),
|
|
1304
|
+
border: `none`,
|
|
1305
|
+
borderRadius: "12px",
|
|
1306
|
+
};
|
|
1307
|
+
}
|
|
1308
|
+
else if (this.getLinkPreview(msg)) {
|
|
1309
|
+
style = {
|
|
1310
|
+
borderRadius: "8px",
|
|
1311
|
+
background: this.themeService.theme.palette.getAccent100(),
|
|
1312
|
+
};
|
|
1313
|
+
}
|
|
1314
|
+
else if (msg?.getType() == StickersConstants.sticker) {
|
|
1315
|
+
style = {
|
|
1316
|
+
background: "transparent",
|
|
1317
|
+
borderRadius: "12px",
|
|
1318
|
+
};
|
|
1319
|
+
}
|
|
1320
|
+
else if (!msg?.getDeletedAt() && msg?.getCategory() == CometChatUIKitConstants.MessageCategory.message && msg?.getType() == CometChatUIKitConstants.MessageTypes.text && (!msg?.getSender() || this.loggedInUser.getUid() == msg?.getSender().getUid())) {
|
|
1321
|
+
style = {
|
|
1322
|
+
background: this.alignment == MessageListAlignment.left ? this.themeService.theme.palette.getAccent100() : this.themeService.theme.palette.getPrimary(),
|
|
1323
|
+
borderRadius: "12px",
|
|
1324
|
+
};
|
|
1325
|
+
}
|
|
1326
|
+
else if (!msg?.getDeletedAt() && msg?.getCategory() == CometChatUIKitConstants.MessageCategory.message && msg?.getType() == CometChatUIKitConstants.MessageTypes.audio) {
|
|
1327
|
+
style = {
|
|
1328
|
+
borderRadius: "",
|
|
1329
|
+
background: this.themeService.theme.palette.getAccent100(),
|
|
1330
|
+
};
|
|
1331
|
+
}
|
|
1332
|
+
else if (msg?.getType() == CometChatUIKitConstants.MessageTypes.groupMember || msg?.getCategory() == this.callConstant) {
|
|
1333
|
+
style = {
|
|
1334
|
+
background: "transparent",
|
|
1335
|
+
borderRadius: "12px",
|
|
1336
|
+
border: `1px solid ${this.themeService.theme.palette.getAccent100()}`
|
|
1337
|
+
};
|
|
1338
|
+
}
|
|
1339
|
+
else {
|
|
1340
|
+
if (msg?.getSender() && msg?.getSender().getUid() != this.loggedInUser.getUid()) {
|
|
1341
|
+
style = {
|
|
1342
|
+
background: this.themeService.theme.palette.getAccent100(),
|
|
1343
|
+
borderRadius: "12px",
|
|
1344
|
+
};
|
|
1345
|
+
}
|
|
1346
|
+
else {
|
|
1347
|
+
style = {
|
|
1348
|
+
background: this.themeService.theme.palette.getAccent100(),
|
|
1349
|
+
borderRadius: "12px",
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
return style;
|
|
1354
|
+
}
|
|
1355
|
+
getSessionId(message) {
|
|
1356
|
+
let data = message.getData();
|
|
1357
|
+
return data?.customData?.sessionID;
|
|
1358
|
+
}
|
|
1359
|
+
getWhiteboardDocument(message) {
|
|
1360
|
+
try {
|
|
1361
|
+
if (message?.getData()) {
|
|
1362
|
+
const data = message.getData();
|
|
1363
|
+
if (data?.metadata) {
|
|
1364
|
+
const metadata = data?.metadata;
|
|
1365
|
+
if (CometChatUIKitUtility.checkHasOwnProperty(metadata, "@injected")) {
|
|
1366
|
+
const injectedObject = metadata["@injected"];
|
|
1367
|
+
if (injectedObject?.extensions) {
|
|
1368
|
+
const extensionObject = injectedObject.extensions;
|
|
1369
|
+
return extensionObject[CollaborativeWhiteboardConstants.whiteboard] ? extensionObject[CollaborativeWhiteboardConstants.whiteboard].board_url : extensionObject[CollaborativeDocumentConstants.document].document_url;
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
catch (error) {
|
|
1376
|
+
if (this.onError) {
|
|
1377
|
+
this.onError(error);
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
openLinkURL(event) {
|
|
1382
|
+
window.open(event?.detail?.url, '_blank');
|
|
1383
|
+
}
|
|
1384
|
+
getSticker(message) {
|
|
1385
|
+
try {
|
|
1386
|
+
let stickerData = null;
|
|
1387
|
+
if (CometChatUIKitUtility.checkHasOwnProperty(message, StickersConstants.data) &&
|
|
1388
|
+
CometChatUIKitUtility.checkHasOwnProperty(message.getData(), StickersConstants.custom_data)) {
|
|
1389
|
+
stickerData = message.data.customData;
|
|
1390
|
+
if (CometChatUIKitUtility.checkHasOwnProperty(stickerData, StickersConstants.sticker_url)) {
|
|
1391
|
+
return stickerData.sticker_url;
|
|
1392
|
+
}
|
|
1393
|
+
else {
|
|
1394
|
+
return "";
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
else {
|
|
1398
|
+
return "";
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
catch (error) {
|
|
1402
|
+
if (this.onError) {
|
|
1403
|
+
this.onError(error);
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
getHeaderView(message) {
|
|
1408
|
+
let view = null;
|
|
1409
|
+
if (this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()]?.headerView) {
|
|
1410
|
+
view = this.messageTypesMap[message?.getType()]?.headerView(message);
|
|
1411
|
+
return view;
|
|
1412
|
+
}
|
|
1413
|
+
else {
|
|
1414
|
+
return null;
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
getFooterView(message) {
|
|
1418
|
+
let view = null;
|
|
1419
|
+
if (this.messageTypesMap[message?.getType()] && this.messageTypesMap[message?.getType()]?.footerView) {
|
|
1420
|
+
view = this.messageTypesMap[message?.getType()]?.footerView(message);
|
|
1421
|
+
return view;
|
|
1422
|
+
}
|
|
1423
|
+
else {
|
|
1424
|
+
return null;
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
getCallBubbleStyle(message) {
|
|
1428
|
+
const isLeftAligned = this.alignment == MessageListAlignment.left;
|
|
1429
|
+
const isUserSentMessage = !message?.getSender() || this.loggedInUser.getUid() === message?.getSender().getUid();
|
|
1430
|
+
if (isUserSentMessage && !isLeftAligned) {
|
|
1431
|
+
return {
|
|
1432
|
+
titleFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1433
|
+
titleColor: this.themeService.theme.palette.getAccent("dark"),
|
|
1434
|
+
iconTint: this.themeService.theme.palette.getAccent("dark"),
|
|
1435
|
+
buttonTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1436
|
+
buttonTextColor: this.themeService.theme.palette.getPrimary(),
|
|
1437
|
+
buttonBackground: this.themeService.theme.palette.getAccent("dark"),
|
|
1438
|
+
width: "240px"
|
|
1439
|
+
};
|
|
1440
|
+
}
|
|
1441
|
+
else {
|
|
1442
|
+
return {
|
|
1443
|
+
titleFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1444
|
+
titleColor: this.themeService.theme.palette.getAccent(),
|
|
1445
|
+
iconTint: this.themeService.theme.palette.getPrimary(),
|
|
1446
|
+
buttonTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1447
|
+
buttonTextColor: this.themeService.theme.palette.getPrimary(),
|
|
1448
|
+
buttonBackground: this.themeService.theme.palette.getAccent("dark"),
|
|
1449
|
+
width: "240px"
|
|
1450
|
+
};
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
getBubbleAlignment(message) {
|
|
1454
|
+
return this.alignment == MessageListAlignment.left || (message.getSender() && message.getSender().getUid() != this.loggedInUser.getUid()) ? MessageBubbleAlignment.left : MessageBubbleAlignment.right;
|
|
1455
|
+
}
|
|
1456
|
+
getCallTypeIcon(message) {
|
|
1457
|
+
if (message.getType() == CometChatUIKitConstants.MessageTypes.audio) {
|
|
1458
|
+
return "assets/Audio-Call.svg";
|
|
1459
|
+
}
|
|
1460
|
+
else {
|
|
1461
|
+
return "assets/Video-call.svg";
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
callStatusStyle(message) {
|
|
1465
|
+
if (message.getCategory() == this.callConstant) {
|
|
1466
|
+
return {
|
|
1467
|
+
buttonTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
1468
|
+
buttonTextColor: CallingDetailsUtils.isMissedCall(message, this.loggedInUser) ? this.themeService.theme.palette.getError() : this.themeService.theme.palette.getAccent600(),
|
|
1469
|
+
borderRadius: "10px",
|
|
1470
|
+
border: CallingDetailsUtils.isMissedCall(message, this.loggedInUser) ? `1px solid RGBA(255, 59, 48, 0.2)` : `1px solid ${this.themeService.theme.palette.getAccent100()}`,
|
|
1471
|
+
buttonIconTint: CallingDetailsUtils.isMissedCall(message, this.loggedInUser) ? this.themeService.theme.palette.getError() : this.themeService.theme.palette.getAccent600(),
|
|
1472
|
+
background: "transparent",
|
|
1473
|
+
iconBackground: "transparent",
|
|
1474
|
+
padding: "2px 12px 2px 0",
|
|
1475
|
+
gap: "0",
|
|
1476
|
+
height: "25px",
|
|
1477
|
+
justifyContent: "center"
|
|
1478
|
+
};
|
|
1479
|
+
}
|
|
1480
|
+
else {
|
|
1481
|
+
return null;
|
|
1482
|
+
}
|
|
1483
|
+
}
|
|
1484
|
+
setFileBubbleStyle(message) {
|
|
1485
|
+
const isFileMessage = message.getCategory() === CometChatUIKitConstants.MessageCategory.message && message?.getType() === CometChatUIKitConstants.MessageTypes.file;
|
|
1486
|
+
if (isFileMessage) {
|
|
1487
|
+
return {
|
|
1488
|
+
titleFont: fontHelper(this.theme.typography.subtitle1),
|
|
1489
|
+
titleColor: this.themeService.theme.palette.getAccent(),
|
|
1490
|
+
subtitleFont: fontHelper(this.theme.typography.subtitle2),
|
|
1491
|
+
subtitleColor: this.themeService.theme.palette.getAccent600(),
|
|
1492
|
+
iconTint: this.themeService.theme.palette.getPrimary(),
|
|
1493
|
+
};
|
|
1494
|
+
}
|
|
1495
|
+
else {
|
|
1496
|
+
return;
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
ngAfterViewInit() {
|
|
1500
|
+
this.ioBottom();
|
|
1501
|
+
this.ioTop();
|
|
1502
|
+
this.checkMessageTemplate();
|
|
1503
|
+
}
|
|
1504
|
+
/**
|
|
1505
|
+
* Extracting types and categories from template
|
|
1506
|
+
*
|
|
1507
|
+
*/
|
|
1508
|
+
checkMessageTemplate() {
|
|
1509
|
+
this.typesMap = {
|
|
1510
|
+
text: this.textBubble,
|
|
1511
|
+
file: this.fileBubble,
|
|
1512
|
+
audio: this.audioBubble,
|
|
1513
|
+
video: this.videoBubble,
|
|
1514
|
+
image: this.imageBubble,
|
|
1515
|
+
groupMember: this.textBubble,
|
|
1516
|
+
extension_sticker: this.stickerBubble,
|
|
1517
|
+
extension_whiteboard: this.whiteboardBubble,
|
|
1518
|
+
extension_document: this.documentBubble,
|
|
1519
|
+
extension_poll: this.pollBubble,
|
|
1520
|
+
meeting: this.directCalling
|
|
1521
|
+
};
|
|
1522
|
+
this.setBubbleView();
|
|
1523
|
+
}
|
|
1524
|
+
getPollBubbleData(message, type) {
|
|
1525
|
+
let data = message.getCustomData();
|
|
1526
|
+
if (type) {
|
|
1527
|
+
return data[type];
|
|
1528
|
+
}
|
|
1529
|
+
else {
|
|
1530
|
+
return message.getSender().getUid();
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
getThreadCount(message) {
|
|
1534
|
+
const replyCount = message?.getReplyCount() || 0;
|
|
1535
|
+
const suffix = replyCount === 1 ? localize("REPLY") : localize("REPLIES");
|
|
1536
|
+
return `${localize("VIEW")} ${replyCount} ${suffix}`;
|
|
1537
|
+
}
|
|
1538
|
+
showEnabledExtensions() {
|
|
1539
|
+
if (ChatConfigurator.names.includes('textmoderator')) {
|
|
1540
|
+
this.enableDataMasking = true;
|
|
1541
|
+
}
|
|
1542
|
+
if (ChatConfigurator.names.includes('thumbnailgeneration')) {
|
|
1543
|
+
this.enableThumbnailGeneration = true;
|
|
1544
|
+
}
|
|
1545
|
+
if (ChatConfigurator.names.includes('linkpreview')) {
|
|
1546
|
+
this.enableLinkPreview = true;
|
|
1547
|
+
}
|
|
1548
|
+
if (ChatConfigurator.names.includes('polls')) {
|
|
1549
|
+
this.enablePolls = true;
|
|
1550
|
+
}
|
|
1551
|
+
if (ChatConfigurator.names.includes('reactions')) {
|
|
1552
|
+
this.enableReactions = true;
|
|
1553
|
+
}
|
|
1554
|
+
if (ChatConfigurator.names.includes('imagemoderation')) {
|
|
1555
|
+
this.enableImageModeration = true;
|
|
1556
|
+
}
|
|
1557
|
+
if (ChatConfigurator.names.includes('stickers')) {
|
|
1558
|
+
this.enableStickers = true;
|
|
1559
|
+
}
|
|
1560
|
+
if (ChatConfigurator.names.includes('collaborativewhiteboard')) {
|
|
1561
|
+
this.enableWhiteboard = true;
|
|
1562
|
+
}
|
|
1563
|
+
if (ChatConfigurator.names.includes('collaborativedocument')) {
|
|
1564
|
+
this.enableDocument = true;
|
|
1565
|
+
}
|
|
1566
|
+
if (ChatConfigurator.names.includes('calling')) {
|
|
1567
|
+
this.enableCalling = true;
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
openImageInFullScreen(message) {
|
|
1571
|
+
this.imageurlToOpen = message?.data?.attachments[0]?.url;
|
|
1572
|
+
this.openFullscreenView = true;
|
|
1573
|
+
this.ref.detectChanges();
|
|
1574
|
+
}
|
|
1575
|
+
closeImageInFullScreen() {
|
|
1576
|
+
this.imageurlToOpen = "";
|
|
1577
|
+
this.openFullscreenView = false;
|
|
1578
|
+
this.ref.detectChanges();
|
|
1579
|
+
}
|
|
1580
|
+
openWarningDialog(event) {
|
|
1581
|
+
this.closeImageModeration = event?.detail?.onConfirm;
|
|
1582
|
+
this.openConfirmDialog = true;
|
|
1583
|
+
this.ref.detectChanges();
|
|
1584
|
+
}
|
|
1585
|
+
onCancelClick() {
|
|
1586
|
+
this.openConfirmDialog = false;
|
|
1587
|
+
this.ref.detectChanges();
|
|
1588
|
+
}
|
|
1589
|
+
getTextMessage(message) {
|
|
1590
|
+
const text = this.enableDataMasking ? CometChatUIKitUtility.getExtensionData(message) : null;
|
|
1591
|
+
return text?.trim()?.length > 0 ? text : message.getText();
|
|
1592
|
+
}
|
|
1593
|
+
getLinkPreview(message) {
|
|
1594
|
+
try {
|
|
1595
|
+
if (message?.getMetadata() && this.enableLinkPreview) {
|
|
1596
|
+
const metadata = message.getMetadata();
|
|
1597
|
+
const injectedObject = metadata[LinkPreviewConstants.injected];
|
|
1598
|
+
if (injectedObject && injectedObject?.extensions) {
|
|
1599
|
+
const extensionsObject = injectedObject.extensions;
|
|
1600
|
+
if (extensionsObject &&
|
|
1601
|
+
CometChatUIKitUtility.checkHasOwnProperty(extensionsObject, LinkPreviewConstants.link_preview)) {
|
|
1602
|
+
const linkPreviewObject = extensionsObject[LinkPreviewConstants.link_preview];
|
|
1603
|
+
if (linkPreviewObject &&
|
|
1604
|
+
CometChatUIKitUtility.checkHasOwnProperty(linkPreviewObject, LinkPreviewConstants.links) &&
|
|
1605
|
+
linkPreviewObject[LinkPreviewConstants.links].length) {
|
|
1606
|
+
return linkPreviewObject[LinkPreviewConstants.links][0];
|
|
1607
|
+
}
|
|
1608
|
+
else {
|
|
1609
|
+
return null;
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1612
|
+
else {
|
|
1613
|
+
return null;
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
else {
|
|
1618
|
+
return null;
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
catch (error) {
|
|
1622
|
+
if (this.onError) {
|
|
1623
|
+
this.onError(error);
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
getImageThumbnail(msg) {
|
|
1628
|
+
const message = msg;
|
|
1629
|
+
let imageURL = "";
|
|
1630
|
+
if (this.enableThumbnailGeneration) {
|
|
1631
|
+
try {
|
|
1632
|
+
const metadata = message.getMetadata();
|
|
1633
|
+
const injectedObject = metadata?.[ThumbnailGenerationConstants.injected];
|
|
1634
|
+
const extensionsObject = injectedObject?.extensions;
|
|
1635
|
+
const thumbnailGenerationObject = extensionsObject[ThumbnailGenerationConstants.thumbnail_generation];
|
|
1636
|
+
const imageToDownload = thumbnailGenerationObject?.url_small;
|
|
1637
|
+
if (imageToDownload) {
|
|
1638
|
+
imageURL = imageToDownload;
|
|
1639
|
+
}
|
|
1640
|
+
else {
|
|
1641
|
+
imageURL = message?.data?.attachments ? message?.data?.attachments[0]?.url : "";
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1644
|
+
catch (error) {
|
|
1645
|
+
if (this.onError) {
|
|
1646
|
+
this.onError(error);
|
|
1647
|
+
}
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
else {
|
|
1651
|
+
imageURL = message?.data?.attachments ? message?.data?.attachments[0]?.url : "";
|
|
1652
|
+
}
|
|
1653
|
+
return imageURL;
|
|
1654
|
+
}
|
|
1655
|
+
getLinkPreviewDetails(key, message) {
|
|
1656
|
+
let linkPreviewObject = this.getLinkPreview(message);
|
|
1657
|
+
if (Object.keys(linkPreviewObject).length > 0) {
|
|
1658
|
+
return linkPreviewObject[key];
|
|
1659
|
+
}
|
|
1660
|
+
else {
|
|
1661
|
+
return "";
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
ngOnInit() {
|
|
1665
|
+
this.setMessagesStyle();
|
|
1666
|
+
this.setAvatarStyle();
|
|
1667
|
+
this.setDateStyle();
|
|
1668
|
+
this.setReceiptStyle();
|
|
1669
|
+
this.subscribeToEvents();
|
|
1670
|
+
this.setOngoingCallStyle();
|
|
1671
|
+
this.state = States.loading;
|
|
1672
|
+
CometChat.getLoggedinUser().then((user) => {
|
|
1673
|
+
this.loggedInUser = user;
|
|
1674
|
+
}).catch((error) => {
|
|
1675
|
+
if (this.onError) {
|
|
1676
|
+
this.onError(error);
|
|
1677
|
+
}
|
|
1678
|
+
});
|
|
1679
|
+
this.dateSeparatorStyle.background = this.dateSeparatorStyle.background || this.themeService.theme.palette.getAccent600();
|
|
1680
|
+
this.dividerStyle.background = this.themeService.theme.palette.getAccent100();
|
|
1681
|
+
}
|
|
1682
|
+
setAvatarStyle() {
|
|
1683
|
+
let defaultStyle = new AvatarStyle({
|
|
1684
|
+
borderRadius: "24px",
|
|
1685
|
+
width: "28px",
|
|
1686
|
+
height: "28px",
|
|
1687
|
+
border: "none",
|
|
1688
|
+
backgroundColor: this.themeService.theme.palette.getAccent700(),
|
|
1689
|
+
nameTextColor: this.themeService.theme.palette.getAccent900(),
|
|
1690
|
+
backgroundSize: "cover",
|
|
1691
|
+
nameTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
|
|
1692
|
+
outerViewBorder: "",
|
|
1693
|
+
outerViewBorderSpacing: "",
|
|
1694
|
+
});
|
|
1695
|
+
this.avatarStyle = { ...defaultStyle, ...this.avatarStyle };
|
|
1696
|
+
}
|
|
1697
|
+
setDateStyle() {
|
|
1698
|
+
let defaultStyle = new DateStyle({
|
|
1699
|
+
textFont: fontHelper(this.themeService.theme.typography.subtitle1),
|
|
1700
|
+
textColor: this.themeService.theme.palette.getAccent600(),
|
|
1701
|
+
background: this.themeService.theme.palette.getAccent100(),
|
|
1702
|
+
height: "100%",
|
|
1703
|
+
width: "100%",
|
|
1704
|
+
border: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
|
|
1705
|
+
borderRadius: "8px",
|
|
1706
|
+
});
|
|
1707
|
+
this.dateSeparatorStyle = { ...defaultStyle, ...this.dateSeparatorStyle };
|
|
1708
|
+
}
|
|
1709
|
+
setMessagesStyle() {
|
|
1710
|
+
this.smartReplyStyle = {
|
|
1711
|
+
replyTextFont: fontHelper(this.themeService.theme.typography.caption1),
|
|
1712
|
+
replyTextColor: this.themeService.theme.palette.getAccent(),
|
|
1713
|
+
replyBackground: this.themeService.theme.palette.getBackground(),
|
|
1714
|
+
boxShadow: `0px 0px 1px ${this.themeService.theme.palette.getAccent600()}`,
|
|
1715
|
+
closeIconTint: this.themeService.theme.palette.getAccent600(),
|
|
1716
|
+
background: this.themeService.theme.palette.getBackground(),
|
|
1717
|
+
...this.smartReplyStyle
|
|
1718
|
+
};
|
|
1719
|
+
this.fullScreenViewerStyle.closeIconTint = this.themeService.theme.palette.getPrimary();
|
|
1720
|
+
let defaultStyle = new MessageListStyle({
|
|
1721
|
+
background: this.themeService.theme.palette.getBackground(),
|
|
1722
|
+
border: `none`,
|
|
1723
|
+
emptyStateTextFont: fontHelper(this.themeService.theme.typography.title1),
|
|
1724
|
+
emptyStateTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1725
|
+
errorStateTextFont: fontHelper(this.themeService.theme.typography.title1),
|
|
1726
|
+
errorStateTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1727
|
+
loadingIconTint: this.themeService.theme.palette.getAccent600(),
|
|
1728
|
+
nameTextFont: fontHelper(this.themeService.theme.typography.title2),
|
|
1729
|
+
nameTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1730
|
+
threadReplySeparatorColor: this.themeService.theme.palette.getAccent400(),
|
|
1731
|
+
threadReplyTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
|
|
1732
|
+
threadReplyIconTint: this.themeService.theme.palette.getAccent600(),
|
|
1733
|
+
threadReplyTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1734
|
+
TimestampTextFont: fontHelper(this.themeService.theme.typography.caption2),
|
|
1735
|
+
TimestampTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1736
|
+
});
|
|
1737
|
+
this.messageListStyle = { ...defaultStyle, ...this.messageListStyle };
|
|
1738
|
+
this.bubbleDateStyle = {
|
|
1739
|
+
textColor: this.messageListStyle.TimestampTextColor || this.themeService.theme.palette.getAccent600(),
|
|
1740
|
+
textFont: this.messageListStyle.TimestampTextFont || fontHelper(this.themeService.theme.typography.caption2)
|
|
1741
|
+
};
|
|
1742
|
+
this.linkPreviewStyle = new LinkPreviewStyle({
|
|
1743
|
+
titleColor: this.themeService.theme.palette.getAccent(),
|
|
1744
|
+
titleFont: fontHelper(this.themeService.theme.typography.title2),
|
|
1745
|
+
descriptionColor: this.themeService.theme.palette.getAccent600(),
|
|
1746
|
+
descriptionFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
1747
|
+
background: "transparent",
|
|
1748
|
+
height: "100%",
|
|
1749
|
+
width: "100%"
|
|
1750
|
+
});
|
|
1751
|
+
this.documentBubbleStyle = {
|
|
1752
|
+
titleFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1753
|
+
titleColor: this.themeService.theme.palette.getAccent(),
|
|
1754
|
+
subtitleFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
1755
|
+
subtitleColor: this.themeService.theme.palette.getAccent600(),
|
|
1756
|
+
iconTint: this.themeService.theme.palette.getAccent700(),
|
|
1757
|
+
buttonTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1758
|
+
buttonTextColor: this.themeService.theme.palette.getPrimary(),
|
|
1759
|
+
buttonBackground: "transparent",
|
|
1760
|
+
separatorColor: this.themeService.theme.palette.getAccent200()
|
|
1761
|
+
};
|
|
1762
|
+
this.pollBubbleStyle = {
|
|
1763
|
+
borderRadius: "8px",
|
|
1764
|
+
background: "transparent",
|
|
1765
|
+
votePercentTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
1766
|
+
votePercentTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1767
|
+
pollQuestionTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
|
|
1768
|
+
pollQuestionTextColor: this.themeService.theme.palette.getAccent(),
|
|
1769
|
+
pollOptionTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1770
|
+
pollOptionTextColor: this.themeService.theme.palette.getAccent(),
|
|
1771
|
+
pollOptionBackground: this.themeService.theme.palette.getAccent900(),
|
|
1772
|
+
optionsIconTint: this.themeService.theme.palette.getAccent600(),
|
|
1773
|
+
totalVoteCountTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
1774
|
+
totalVoteCountTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1775
|
+
selectedPollOptionBackground: this.themeService.theme.palette.getAccent200(),
|
|
1776
|
+
userSelectedOptionBackground: this.themeService.theme.palette.getPrimary(),
|
|
1777
|
+
pollOptionBorder: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
|
|
1778
|
+
pollOptionBorderRadius: "8px"
|
|
1779
|
+
};
|
|
1780
|
+
this.imageModerationStyle = {
|
|
1781
|
+
filterColor: this.themeService.theme.palette.getPrimary(),
|
|
1782
|
+
height: "100%",
|
|
1783
|
+
width: "100%",
|
|
1784
|
+
border: "none",
|
|
1785
|
+
warningTextColor: this.themeService.theme.palette.getAccent("dark"),
|
|
1786
|
+
warningTextFont: fontHelper(this.themeService.theme.typography.title2),
|
|
1787
|
+
};
|
|
1788
|
+
this.confirmDialogStyle = {
|
|
1789
|
+
confirmButtonBackground: this.themeService.theme.palette.getError(),
|
|
1790
|
+
cancelButtonBackground: this.themeService.theme.palette.getSecondary(),
|
|
1791
|
+
confirmButtonTextColor: this.themeService.theme.palette.getAccent900("light"),
|
|
1792
|
+
confirmButtonTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1793
|
+
cancelButtonTextColor: this.themeService.theme.palette.getAccent900("dark"),
|
|
1794
|
+
cancelButtonTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
1795
|
+
titleFont: fontHelper(this.themeService.theme.typography.title1),
|
|
1796
|
+
titleColor: this.themeService.theme.palette.getAccent(),
|
|
1797
|
+
messageTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
1798
|
+
messageTextColor: this.themeService.theme.palette.getAccent600(),
|
|
1799
|
+
background: this.themeService.theme.palette.getBackground(),
|
|
1800
|
+
height: "100%",
|
|
1801
|
+
width: "100%",
|
|
1802
|
+
border: `1px solid ${this.themeService.theme.palette.getAccent100()}`,
|
|
1803
|
+
borderRadius: "8px"
|
|
1804
|
+
};
|
|
1805
|
+
}
|
|
1806
|
+
setReceiptStyle() {
|
|
1807
|
+
this.receiptStyle = new ReceiptStyle({
|
|
1808
|
+
waitIconTint: this.themeService.theme.palette.getAccent700(),
|
|
1809
|
+
sentIconTint: this.themeService.theme.palette.getAccent600(),
|
|
1810
|
+
deliveredIconTint: this.themeService.theme.palette.getAccent600(),
|
|
1811
|
+
readIconTint: this.themeService.theme.palette.getPrimary(),
|
|
1812
|
+
errorIconTint: this.themeService.theme.palette.getError(),
|
|
1813
|
+
});
|
|
1814
|
+
this.receiptStyle = { ...this.receiptStyle };
|
|
1815
|
+
}
|
|
1816
|
+
createRequestBuilder() {
|
|
1817
|
+
if (!this.templates || this.templates?.length == 0) {
|
|
1818
|
+
this.messageTemplate = ChatConfigurator.getDataSource().getAllMessageTemplates();
|
|
1819
|
+
this.categories = ChatConfigurator.getDataSource().getAllMessageCategories();
|
|
1820
|
+
this.types = ChatConfigurator.getDataSource().getAllMessageTypes();
|
|
1821
|
+
}
|
|
1822
|
+
else {
|
|
1823
|
+
this.messageTemplate = this.templates;
|
|
1824
|
+
}
|
|
1825
|
+
this.state = States.loading;
|
|
1826
|
+
this.requestBuilder = null;
|
|
1827
|
+
if (this.user || this.group) {
|
|
1828
|
+
if (!this.messagesRequestBuilder) {
|
|
1829
|
+
if (this.user) {
|
|
1830
|
+
this.requestBuilder = new CometChat.MessagesRequestBuilder()
|
|
1831
|
+
.setUID(this.user.getUid())
|
|
1832
|
+
.setLimit(this.limit)
|
|
1833
|
+
.setTypes(this.types)
|
|
1834
|
+
.setCategories(this.categories)
|
|
1835
|
+
.hideReplies(true)
|
|
1836
|
+
.build();
|
|
1837
|
+
}
|
|
1838
|
+
else {
|
|
1839
|
+
this.requestBuilder = new CometChat.MessagesRequestBuilder()
|
|
1840
|
+
.setGUID(this.group.getGuid())
|
|
1841
|
+
.setLimit(this.limit)
|
|
1842
|
+
.setTypes(this.types)
|
|
1843
|
+
.hideReplies(true)
|
|
1844
|
+
.setCategories(this.categories)
|
|
1845
|
+
.build();
|
|
1846
|
+
}
|
|
1847
|
+
}
|
|
1848
|
+
else {
|
|
1849
|
+
this.requestBuilder = this.messagesRequestBuilder.build();
|
|
1850
|
+
}
|
|
1851
|
+
this.fetchPreviousMessages();
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
addMessageEventListeners() {
|
|
1855
|
+
try {
|
|
1856
|
+
CometChat.addMessageListener(this.msgListenerId, new CometChat.MessageListener({
|
|
1857
|
+
onTextMessageReceived: (textMessage) => {
|
|
1858
|
+
this.messageUpdate(CometChatUIKitConstants.messages.TEXT_MESSAGE_RECEIVED, textMessage);
|
|
1859
|
+
},
|
|
1860
|
+
onCustomMessageReceived: (customMessage) => {
|
|
1861
|
+
this.messageUpdate(CometChatUIKitConstants.messages.CUSTOM_MESSAGE_RECEIVED, customMessage);
|
|
1862
|
+
},
|
|
1863
|
+
onMediaMessageReceived: (mediaMessage) => {
|
|
1864
|
+
this.messageUpdate(CometChatUIKitConstants.messages.MEDIA_MESSAGE_RECEIVED, mediaMessage);
|
|
1865
|
+
},
|
|
1866
|
+
onMessagesDelivered: (messageReceipt) => {
|
|
1867
|
+
this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_DELIVERED, messageReceipt);
|
|
1868
|
+
},
|
|
1869
|
+
onMessagesRead: (messageReceipt) => {
|
|
1870
|
+
this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_READ, messageReceipt);
|
|
1871
|
+
},
|
|
1872
|
+
onMessageDeleted: (deletedMessage) => {
|
|
1873
|
+
this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_DELETED, deletedMessage);
|
|
1874
|
+
},
|
|
1875
|
+
onMessageEdited: (editedMessage) => {
|
|
1876
|
+
this.messageUpdate(CometChatUIKitConstants.messages.MESSAGE_EDITED, editedMessage);
|
|
1877
|
+
},
|
|
1878
|
+
onTransientMessageReceived: (transientMessage) => {
|
|
1879
|
+
let liveReaction = transientMessage.getData();
|
|
1880
|
+
if (transientMessage.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.user && this.user && transientMessage?.getSender().getUid() == this.user.getUid() && transientMessage.getReceiverId() == this.loggedInUser?.getUid()) {
|
|
1881
|
+
CometChatMessageEvents.ccLiveReaction.next(liveReaction["LIVE_REACTION"]);
|
|
1882
|
+
return;
|
|
1883
|
+
}
|
|
1884
|
+
else if (transientMessage.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.group && this.group && transientMessage.getReceiverId() == this.group.getGuid() && transientMessage?.getSender().getUid() != this.loggedInUser?.getUid()) {
|
|
1885
|
+
CometChatMessageEvents.ccLiveReaction.next(liveReaction["LIVE_REACTION"]);
|
|
1886
|
+
return;
|
|
1887
|
+
}
|
|
1888
|
+
},
|
|
1889
|
+
}));
|
|
1890
|
+
CometChat.addGroupListener(this.groupListenerId, new CometChat.GroupListener({
|
|
1891
|
+
onGroupMemberScopeChanged: (message, changedUser, newScope, oldScope, changedGroup) => {
|
|
1892
|
+
this.messageUpdate(CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE, message, changedGroup, { user: changedUser, scope: newScope });
|
|
1893
|
+
},
|
|
1894
|
+
onGroupMemberKicked: (message, kickedUser, kickedBy, kickedFrom) => {
|
|
1895
|
+
this.messageUpdate(CometChatUIKitConstants.groupMemberAction.KICKED, message, kickedFrom, {
|
|
1896
|
+
user: kickedUser,
|
|
1897
|
+
hasJoined: false,
|
|
1898
|
+
});
|
|
1899
|
+
},
|
|
1900
|
+
onGroupMemberBanned: (message, bannedUser, bannedBy, bannedFrom) => {
|
|
1901
|
+
this.messageUpdate(CometChatUIKitConstants.groupMemberAction.BANNED, message, bannedFrom, {
|
|
1902
|
+
user: bannedUser,
|
|
1903
|
+
});
|
|
1904
|
+
},
|
|
1905
|
+
onGroupMemberUnbanned: (message, unbannedUser, unbannedBy, unbannedFrom) => {
|
|
1906
|
+
this.messageUpdate(CometChatUIKitConstants.groupMemberAction.UNBANNED, message, unbannedFrom, { user: unbannedUser });
|
|
1907
|
+
},
|
|
1908
|
+
onMemberAddedToGroup: (message, userAdded, userAddedBy, userAddedIn) => {
|
|
1909
|
+
this.messageUpdate(CometChatUIKitConstants.groupMemberAction.ADDED, message, userAddedIn, {
|
|
1910
|
+
user: userAdded,
|
|
1911
|
+
hasJoined: true,
|
|
1912
|
+
});
|
|
1913
|
+
},
|
|
1914
|
+
onGroupMemberLeft: (message, leavingUser, group) => {
|
|
1915
|
+
this.messageUpdate(CometChatUIKitConstants.groupMemberAction.LEFT, message, group, {
|
|
1916
|
+
user: leavingUser,
|
|
1917
|
+
});
|
|
1918
|
+
},
|
|
1919
|
+
onGroupMemberJoined: (message, joinedUser, joinedGroup) => {
|
|
1920
|
+
this.messageUpdate(CometChatUIKitConstants.groupMemberAction.JOINED, message, joinedGroup, {
|
|
1921
|
+
user: joinedUser,
|
|
1922
|
+
});
|
|
1923
|
+
},
|
|
1924
|
+
}));
|
|
1925
|
+
if (this.enableCalling) {
|
|
1926
|
+
CometChat.addCallListener(this.callListenerId, new CometChat.CallListener({
|
|
1927
|
+
onIncomingCallReceived: (call) => {
|
|
1928
|
+
this.addMessage(call);
|
|
1929
|
+
},
|
|
1930
|
+
onIncomingCallCancelled: (call) => {
|
|
1931
|
+
this.addMessage(call);
|
|
1932
|
+
},
|
|
1933
|
+
onOutgoingCallRejected: (call) => {
|
|
1934
|
+
this.addMessage(call);
|
|
1935
|
+
},
|
|
1936
|
+
onOutgoingCallAccepted: (call) => {
|
|
1937
|
+
this.addMessage(call);
|
|
1938
|
+
},
|
|
1939
|
+
}));
|
|
1940
|
+
}
|
|
1941
|
+
}
|
|
1942
|
+
catch (error) {
|
|
1943
|
+
if (this.onError) {
|
|
1944
|
+
this.onError(error);
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1947
|
+
}
|
|
1948
|
+
/**
|
|
1949
|
+
*
|
|
1950
|
+
* @param
|
|
1951
|
+
*/
|
|
1952
|
+
/**
|
|
1953
|
+
* Updates messageList on basis of user activity or group activity or calling activity
|
|
1954
|
+
* @param {any=null} key
|
|
1955
|
+
* @param {CometChat.MessageReceipt | CometChat.BaseMessage} message
|
|
1956
|
+
* @param {CometChat.Group | null=null} group
|
|
1957
|
+
* @param {any=null} options
|
|
1958
|
+
*/
|
|
1959
|
+
messageUpdate(key = null, message = null, group = null, options = null) {
|
|
1960
|
+
try {
|
|
1961
|
+
switch (key) {
|
|
1962
|
+
case CometChatUIKitConstants.messages.TEXT_MESSAGE_RECEIVED:
|
|
1963
|
+
case CometChatUIKitConstants.messages.MEDIA_MESSAGE_RECEIVED:
|
|
1964
|
+
this.messageReceived(message);
|
|
1965
|
+
break;
|
|
1966
|
+
case CometChatUIKitConstants.messages.MESSAGE_DELIVERED:
|
|
1967
|
+
case CometChatUIKitConstants.messages.MESSAGE_READ:
|
|
1968
|
+
this.messageReadAndDelivered(message);
|
|
1969
|
+
break;
|
|
1970
|
+
case CometChatUIKitConstants.messages.MESSAGE_DELETED:
|
|
1971
|
+
case CometChatUIKitConstants.messages.MESSAGE_EDITED: {
|
|
1972
|
+
this.messageEdited(message);
|
|
1973
|
+
break;
|
|
1974
|
+
}
|
|
1975
|
+
case CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE:
|
|
1976
|
+
case CometChatUIKitConstants.groupMemberAction.JOINED:
|
|
1977
|
+
case CometChatUIKitConstants.groupMemberAction.LEFT:
|
|
1978
|
+
case CometChatUIKitConstants.groupMemberAction.ADDED:
|
|
1979
|
+
case CometChatUIKitConstants.groupMemberAction.KICKED:
|
|
1980
|
+
case CometChatUIKitConstants.groupMemberAction.BANNED:
|
|
1981
|
+
case CometChatUIKitConstants.groupMemberAction.UNBANNED: {
|
|
1982
|
+
this.addMessage(message);
|
|
1983
|
+
break;
|
|
1984
|
+
}
|
|
1985
|
+
case CometChatUIKitConstants.messages.CUSTOM_MESSAGE_RECEIVED:
|
|
1986
|
+
this.customMessageReceived(message);
|
|
1987
|
+
break;
|
|
1988
|
+
default:
|
|
1989
|
+
return;
|
|
1990
|
+
}
|
|
1991
|
+
this.ref.detectChanges();
|
|
1992
|
+
}
|
|
1993
|
+
catch (error) {
|
|
1994
|
+
if (this.onError) {
|
|
1995
|
+
this.onError(error);
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
/**
|
|
2000
|
+
* When Message is Received
|
|
2001
|
+
* @param message
|
|
2002
|
+
*/
|
|
2003
|
+
/**
|
|
2004
|
+
* @param {CometChat.BaseMessage} message
|
|
2005
|
+
*/
|
|
2006
|
+
messageReceived(message) {
|
|
2007
|
+
this.markMessageAsDelivered(message);
|
|
2008
|
+
try {
|
|
2009
|
+
if (this.group &&
|
|
2010
|
+
message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
|
|
2011
|
+
message.getReceiverId() === this.group?.getGuid()) {
|
|
2012
|
+
this.messageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.group);
|
|
2013
|
+
}
|
|
2014
|
+
else if (this.user &&
|
|
2015
|
+
message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
|
|
2016
|
+
message?.getSender().getUid() === this.user?.getUid()) {
|
|
2017
|
+
if ((!message?.getReadAt() && !message?.getParentMessageId() && this.isOnBottom) || (!message?.getReadAt() && message.getParentMessageId() && this.parentMessageId && this.isOnBottom)) {
|
|
2018
|
+
if (!this.disableReceipt) {
|
|
2019
|
+
CometChat.markAsRead(message).then(() => {
|
|
2020
|
+
CometChatMessageEvents.ccMessageRead.next(message);
|
|
2021
|
+
});
|
|
2022
|
+
}
|
|
2023
|
+
else {
|
|
2024
|
+
this.UnreadCount = [];
|
|
2025
|
+
this.ref.detectChanges();
|
|
2026
|
+
}
|
|
2027
|
+
CometChatMessageEvents.ccMessageRead.next(message);
|
|
2028
|
+
}
|
|
2029
|
+
this.messageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.user);
|
|
2030
|
+
}
|
|
2031
|
+
}
|
|
2032
|
+
catch (error) {
|
|
2033
|
+
if (this.onError) {
|
|
2034
|
+
this.onError(error);
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
this.ref.detectChanges();
|
|
2038
|
+
}
|
|
2039
|
+
/**
|
|
2040
|
+
* Updating the reply count of Thread Parent Message
|
|
2041
|
+
* @param {CometChat.BaseMessage} messages
|
|
2042
|
+
*/
|
|
2043
|
+
updateReplyCount(messages) {
|
|
2044
|
+
try {
|
|
2045
|
+
const receivedMessage = messages;
|
|
2046
|
+
let messageList = [...this.messagesList];
|
|
2047
|
+
let messageKey = messageList.findIndex((m) => m.getId() === receivedMessage.getParentMessageId());
|
|
2048
|
+
if (messageKey > -1) {
|
|
2049
|
+
const messageObj = messageList[messageKey];
|
|
2050
|
+
let replyCount = messageObj.getReplyCount() ? messageObj.getReplyCount() : 0;
|
|
2051
|
+
replyCount = replyCount + 1;
|
|
2052
|
+
messageObj.setReplyCount(replyCount);
|
|
2053
|
+
messageList.splice(messageKey, 1, messageObj);
|
|
2054
|
+
this.messagesList = [...messageList];
|
|
2055
|
+
this.ref.detectChanges();
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
catch (error) {
|
|
2059
|
+
if (this.onError) {
|
|
2060
|
+
this.onError(error);
|
|
2061
|
+
}
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2064
|
+
playAudio() {
|
|
2065
|
+
if (!this.disableSoundForMessages) {
|
|
2066
|
+
if (this.customSoundForMessages) {
|
|
2067
|
+
CometChatSoundManager.play(CometChatSoundManager.Sound.incomingMessage, this.customSoundForMessages);
|
|
2068
|
+
}
|
|
2069
|
+
else {
|
|
2070
|
+
CometChatSoundManager.play(CometChatSoundManager.Sound.incomingMessage);
|
|
2071
|
+
}
|
|
2072
|
+
}
|
|
2073
|
+
}
|
|
2074
|
+
reInitializeMessageList() {
|
|
2075
|
+
this.reinitialized = true;
|
|
2076
|
+
this.msgListenerId = "message_" + new Date().getTime();
|
|
2077
|
+
this.groupListenerId = "group_" + new Date().getTime();
|
|
2078
|
+
this.callListenerId = "call_" + new Date().getTime();
|
|
2079
|
+
this.addMessageEventListeners();
|
|
2080
|
+
if (this.messagesRequestBuilder) {
|
|
2081
|
+
if (this.keepRecentMessages) {
|
|
2082
|
+
this.messagesList.splice(1, this.messagesList.length - 30);
|
|
2083
|
+
}
|
|
2084
|
+
else {
|
|
2085
|
+
this.messagesList.splice(30);
|
|
2086
|
+
}
|
|
2087
|
+
this.requestBuilder = this.messagesRequestBuilder;
|
|
2088
|
+
}
|
|
2089
|
+
else {
|
|
2090
|
+
if (this.keepRecentMessages) {
|
|
2091
|
+
this.messagesList.splice(1, this.messagesList.length - 30);
|
|
2092
|
+
this.scrollToBottom();
|
|
2093
|
+
}
|
|
2094
|
+
else {
|
|
2095
|
+
this.messagesList.splice(30);
|
|
2096
|
+
}
|
|
2097
|
+
}
|
|
2098
|
+
this.ref.detectChanges();
|
|
2099
|
+
}
|
|
2100
|
+
getMessageReceipt(message) {
|
|
2101
|
+
let receipt = MessageReceiptUtils.getReceiptStatus(message);
|
|
2102
|
+
return receipt;
|
|
2103
|
+
}
|
|
2104
|
+
messageReadAndDelivered(message) {
|
|
2105
|
+
try {
|
|
2106
|
+
if (message.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.user &&
|
|
2107
|
+
message?.getSender().getUid() == this.user?.getUid() &&
|
|
2108
|
+
message.getReceiver() == this.loggedInUser?.getUid()) {
|
|
2109
|
+
if (message.getReceiptType() == CometChatUIKitConstants.messages.DELIVERY) {
|
|
2110
|
+
//search for message
|
|
2111
|
+
let messageKey = this.messagesList.findIndex((m) => m.getId() == Number(message.getMessageId()));
|
|
2112
|
+
if (messageKey > -1) {
|
|
2113
|
+
this.messagesList[messageKey].setDeliveredAt(message.getDeliveredAt());
|
|
2114
|
+
this.ref.detectChanges();
|
|
2115
|
+
}
|
|
2116
|
+
// this.ref.detectChanges();
|
|
2117
|
+
this.markAllMessagAsDelivered(messageKey);
|
|
2118
|
+
}
|
|
2119
|
+
else if (message.getReceiptType() == CometChatUIKitConstants.messages.READ) {
|
|
2120
|
+
//search for message
|
|
2121
|
+
let messageKey = this.messagesList.findIndex((m) => m.getId() == Number(message.getMessageId()));
|
|
2122
|
+
if (messageKey > -1) {
|
|
2123
|
+
this.messagesList[messageKey].setReadAt(message?.getReadAt());
|
|
2124
|
+
this.ref.detectChanges();
|
|
2125
|
+
}
|
|
2126
|
+
this.ref.detectChanges();
|
|
2127
|
+
this.markAllMessagAsRead(messageKey);
|
|
2128
|
+
}
|
|
2129
|
+
}
|
|
2130
|
+
else if (message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
|
|
2131
|
+
message.getReceiver() === this.group?.getGuid()) {
|
|
2132
|
+
return;
|
|
2133
|
+
}
|
|
2134
|
+
}
|
|
2135
|
+
catch (error) {
|
|
2136
|
+
if (this.onError) {
|
|
2137
|
+
this.onError(error);
|
|
2138
|
+
}
|
|
2139
|
+
}
|
|
2140
|
+
this.ref.detectChanges();
|
|
2141
|
+
}
|
|
2142
|
+
/**
|
|
2143
|
+
* @param {CometChat.BaseMessage} readMessage
|
|
2144
|
+
*/
|
|
2145
|
+
markAllMessagAsRead(messageKey) {
|
|
2146
|
+
for (let i = messageKey; i >= 0; i--) {
|
|
2147
|
+
if (!this.messagesList[i].getReadAt()) {
|
|
2148
|
+
this.messagesList[i].setReadAt(CometChatUIKitUtility.getUnixTimestamp());
|
|
2149
|
+
this.ref.detectChanges();
|
|
2150
|
+
}
|
|
2151
|
+
}
|
|
2152
|
+
CometChatMessageEvents.ccMessageRead.next(this.messagesList[messageKey]);
|
|
2153
|
+
}
|
|
2154
|
+
markAllMessagAsDelivered(messageKey) {
|
|
2155
|
+
for (let i = messageKey; i >= 0; i--) {
|
|
2156
|
+
if (!this.messagesList[i].getDeliveredAt()) {
|
|
2157
|
+
this.messagesList[i].setDeliveredAt(CometChatUIKitUtility.getUnixTimestamp());
|
|
2158
|
+
this.ref.detectChanges();
|
|
2159
|
+
}
|
|
2160
|
+
}
|
|
2161
|
+
}
|
|
2162
|
+
/**
|
|
2163
|
+
* Emits an Action Indicating that Group Data has been updated
|
|
2164
|
+
* @param
|
|
2165
|
+
*/
|
|
2166
|
+
/**
|
|
2167
|
+
* When custom messages are received eg. Poll, Stickers emits action to update message list
|
|
2168
|
+
* @param message
|
|
2169
|
+
*/
|
|
2170
|
+
/**
|
|
2171
|
+
* @param {CometChat.BaseMessage} message
|
|
2172
|
+
*/
|
|
2173
|
+
customMessageReceived(message) {
|
|
2174
|
+
try {
|
|
2175
|
+
this.markMessageAsDelivered(message);
|
|
2176
|
+
if (this.group &&
|
|
2177
|
+
message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&
|
|
2178
|
+
message.getReceiverId() === this.group?.getGuid()) {
|
|
2179
|
+
if ((!message?.getReadAt() && !message?.getParentMessageId() && this.isOnBottom) || (!message?.getReadAt() && message.getParentMessageId() && this.parentMessageId && this.isOnBottom)) {
|
|
2180
|
+
if (!this.disableReceipt) {
|
|
2181
|
+
CometChat.markAsRead(message).then(() => {
|
|
2182
|
+
CometChatMessageEvents.ccMessageRead.next(message);
|
|
2183
|
+
});
|
|
2184
|
+
}
|
|
2185
|
+
else {
|
|
2186
|
+
this.UnreadCount = [];
|
|
2187
|
+
this.ref.detectChanges();
|
|
2188
|
+
}
|
|
2189
|
+
}
|
|
2190
|
+
this.customMessageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.group);
|
|
2191
|
+
}
|
|
2192
|
+
else if (this.user &&
|
|
2193
|
+
message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user &&
|
|
2194
|
+
((message?.getSender().getUid() === this.user?.getUid() &&
|
|
2195
|
+
message.getReceiverId() === this.loggedInUser?.getUid())
|
|
2196
|
+
|| (this.loggedInUser?.getUid() === message?.getSender().getUid() &&
|
|
2197
|
+
message.getReceiverId() === this.user?.getUid()))) {
|
|
2198
|
+
if ((!message?.getReadAt() && !message?.getParentMessageId() && this.isOnBottom) || (!message?.getReadAt() && message.getParentMessageId() && this.parentMessageId && this.isOnBottom)) {
|
|
2199
|
+
if (!this.disableReceipt) {
|
|
2200
|
+
CometChat.markAsRead(message).then(() => {
|
|
2201
|
+
CometChatMessageEvents.ccMessageRead.next(message);
|
|
2202
|
+
});
|
|
2203
|
+
}
|
|
2204
|
+
else {
|
|
2205
|
+
this.UnreadCount = [];
|
|
2206
|
+
this.ref.detectChanges();
|
|
2207
|
+
}
|
|
2208
|
+
}
|
|
2209
|
+
this.customMessageReceivedHandler(message, CometChatUIKitConstants.MessageReceiverType.user);
|
|
2210
|
+
}
|
|
2211
|
+
}
|
|
2212
|
+
catch (error) {
|
|
2213
|
+
if (this.onError) {
|
|
2214
|
+
this.onError(error);
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
this.ref.detectChanges();
|
|
2218
|
+
return true;
|
|
2219
|
+
}
|
|
2220
|
+
/**
|
|
2221
|
+
* TrackBy method to update UI when a change is detected
|
|
2222
|
+
*/
|
|
2223
|
+
/**
|
|
2224
|
+
* @param {number} index
|
|
2225
|
+
* @param {any} item
|
|
2226
|
+
*/
|
|
2227
|
+
getMessageId(index, item) {
|
|
2228
|
+
return item.editedAt || item.readAt || item.deliveredAt || item.id;
|
|
2229
|
+
}
|
|
2230
|
+
/**
|
|
2231
|
+
* Compares two dates and sets Date on a a new day
|
|
2232
|
+
*/
|
|
2233
|
+
/**
|
|
2234
|
+
* @param {number} firstDate
|
|
2235
|
+
* @param {number} secondDate
|
|
2236
|
+
*/
|
|
2237
|
+
isDateDifferent(firstDate, secondDate) {
|
|
2238
|
+
let firstDateObj, secondDateObj;
|
|
2239
|
+
firstDateObj = new Date(firstDate * 1000);
|
|
2240
|
+
secondDateObj = new Date(secondDate * 1000);
|
|
2241
|
+
return firstDateObj.getDate() !== secondDateObj.getDate() ||
|
|
2242
|
+
firstDateObj.getMonth() !== secondDateObj.getMonth() ||
|
|
2243
|
+
firstDateObj.getFullYear() !== secondDateObj.getFullYear();
|
|
2244
|
+
}
|
|
2245
|
+
/**
|
|
2246
|
+
* prepend Fetched Messages
|
|
2247
|
+
* @param {CometChat.BaseMessage} messages
|
|
2248
|
+
*/
|
|
2249
|
+
prependMessages(messages) {
|
|
2250
|
+
try {
|
|
2251
|
+
this.messagesList = [...messages, ...this.messagesList];
|
|
2252
|
+
this.messageCount = this.messagesList.length;
|
|
2253
|
+
if (this.messageCount > this.thresholdValue) {
|
|
2254
|
+
this.keepRecentMessages = false;
|
|
2255
|
+
this.reInitializeMessageBuilder();
|
|
2256
|
+
}
|
|
2257
|
+
this.ngZone.run(() => {
|
|
2258
|
+
if (this.state != States.loaded) {
|
|
2259
|
+
this.state = States.loaded;
|
|
2260
|
+
}
|
|
2261
|
+
this.ref.detach(); // Detach the change detector
|
|
2262
|
+
});
|
|
2263
|
+
if (this.chatChanged) {
|
|
2264
|
+
CometChatUIEvents.ccActiveChatChanged.next({
|
|
2265
|
+
user: this.user,
|
|
2266
|
+
group: this.group,
|
|
2267
|
+
message: messages[messages?.length - 1]
|
|
2268
|
+
});
|
|
2269
|
+
this.chatChanged = false;
|
|
2270
|
+
this.scrollToBottom();
|
|
2271
|
+
}
|
|
2272
|
+
}
|
|
2273
|
+
catch (error) {
|
|
2274
|
+
this.state = States.error;
|
|
2275
|
+
if (this.onError) {
|
|
2276
|
+
this.onError(error);
|
|
2277
|
+
}
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
/**
|
|
2281
|
+
* listening to bottom scroll using intersection observer
|
|
2282
|
+
*/
|
|
2283
|
+
ioBottom() {
|
|
2284
|
+
const options = {
|
|
2285
|
+
root: this.listScroll.nativeElement,
|
|
2286
|
+
rootMargin: '-100% 0px 100px 0px',
|
|
2287
|
+
threshold: 0,
|
|
2288
|
+
};
|
|
2289
|
+
const callback = (entries) => {
|
|
2290
|
+
this.isOnBottom = false;
|
|
2291
|
+
const lastMessage = this.UnreadCount[this.UnreadCount.length - 1];
|
|
2292
|
+
this.isOnBottom = entries[0].isIntersecting;
|
|
2293
|
+
if (this.isOnBottom) {
|
|
2294
|
+
this.fetchNextMessage();
|
|
2295
|
+
if (!this.disableReceipt && this.UnreadCount?.length > 0) {
|
|
2296
|
+
CometChat.markAsRead(lastMessage).then((res) => {
|
|
2297
|
+
this.UnreadCount = [];
|
|
2298
|
+
let messageKey = this.messagesList.findIndex((m) => m.getId() === Number(res?.getMessageId()));
|
|
2299
|
+
if (messageKey > -1) {
|
|
2300
|
+
this.markAllMessagAsRead(messageKey);
|
|
2301
|
+
}
|
|
2302
|
+
this.ref.detectChanges();
|
|
2303
|
+
CometChatMessageEvents.ccMessageRead.next(lastMessage);
|
|
2304
|
+
});
|
|
2305
|
+
}
|
|
2306
|
+
else {
|
|
2307
|
+
this.UnreadCount = [];
|
|
2308
|
+
this.ref.detectChanges();
|
|
2309
|
+
}
|
|
2310
|
+
}
|
|
2311
|
+
};
|
|
2312
|
+
var observer = new IntersectionObserver(callback, options);
|
|
2313
|
+
observer.observe(this.bottom.nativeElement);
|
|
2314
|
+
}
|
|
2315
|
+
;
|
|
2316
|
+
/**
|
|
2317
|
+
* listening to top scroll using intersection observer
|
|
2318
|
+
*/
|
|
2319
|
+
ioTop() {
|
|
2320
|
+
const options = {
|
|
2321
|
+
root: this.listScroll.nativeElement,
|
|
2322
|
+
rootMargin: '200px 0px 0px 0px',
|
|
2323
|
+
threshold: 1.0
|
|
2324
|
+
};
|
|
2325
|
+
const callback = (entries) => {
|
|
2326
|
+
this.isOnBottom = false;
|
|
2327
|
+
if (entries[0].isIntersecting) {
|
|
2328
|
+
this.numberOfTopScroll++;
|
|
2329
|
+
if (this.numberOfTopScroll > 1) {
|
|
2330
|
+
this.fetchPreviousMessages();
|
|
2331
|
+
}
|
|
2332
|
+
}
|
|
2333
|
+
};
|
|
2334
|
+
var observer = new IntersectionObserver(callback, options);
|
|
2335
|
+
observer.observe(this.top.nativeElement);
|
|
2336
|
+
}
|
|
2337
|
+
/**
|
|
2338
|
+
* callback for deleteMessage
|
|
2339
|
+
* @param {CometChat.BaseMessage} object
|
|
2340
|
+
*/
|
|
2341
|
+
/**
|
|
2342
|
+
* @param {CometChat.BaseMessage} messages
|
|
2343
|
+
*/
|
|
2344
|
+
messageSent(messages) {
|
|
2345
|
+
const message = messages;
|
|
2346
|
+
const messageList = [...this.messagesList];
|
|
2347
|
+
let messageKey = messageList.findIndex((m) => m.getMuid() === message.getMuid());
|
|
2348
|
+
if (messageKey > -1) {
|
|
2349
|
+
messageList.splice(messageKey, 1, message);
|
|
2350
|
+
}
|
|
2351
|
+
this.messagesList = messageList;
|
|
2352
|
+
this.ref.detectChanges();
|
|
2353
|
+
this.scrollToBottom();
|
|
2354
|
+
}
|
|
2355
|
+
updateMessage(message, muid = false) {
|
|
2356
|
+
if (muid) {
|
|
2357
|
+
this.messageSent(message);
|
|
2358
|
+
}
|
|
2359
|
+
else {
|
|
2360
|
+
this.updateEditedMessage(message);
|
|
2361
|
+
}
|
|
2362
|
+
}
|
|
2363
|
+
showHeaderTitle(message) {
|
|
2364
|
+
if (this.alignment == MessageListAlignment.left) {
|
|
2365
|
+
return true;
|
|
2366
|
+
}
|
|
2367
|
+
else {
|
|
2368
|
+
if (this.group && message?.getCategory() != CometChatUIKitConstants.MessageCategory.action && !message?.getDeletedAt() && message?.getSender() && message?.getSender().getUid() != this.loggedInUser?.getUid() && this.alignment == MessageListAlignment.standard) {
|
|
2369
|
+
return true;
|
|
2370
|
+
}
|
|
2371
|
+
else {
|
|
2372
|
+
return false;
|
|
2373
|
+
}
|
|
2374
|
+
}
|
|
2375
|
+
}
|
|
2376
|
+
subscribeToEvents() {
|
|
2377
|
+
this.ccShowPanel = CometChatUIEvents.ccShowPanel.subscribe((data) => {
|
|
2378
|
+
this.smartReplyConfig = data.configuration;
|
|
2379
|
+
this.smartReplyMessage = data.message;
|
|
2380
|
+
this.enableSmartReply = true;
|
|
2381
|
+
this.showSmartReply = true;
|
|
2382
|
+
this.ref.detectChanges();
|
|
2383
|
+
});
|
|
2384
|
+
this.ccHidePanel = CometChatUIEvents.ccHidePanel.subscribe(() => {
|
|
2385
|
+
this.smartReplyMessage = null;
|
|
2386
|
+
this.enableSmartReply = false;
|
|
2387
|
+
this.showSmartReply = false;
|
|
2388
|
+
});
|
|
2389
|
+
this.ccGroupMemberAdded = CometChatGroupEvents.ccGroupMemberAdded.subscribe((item) => {
|
|
2390
|
+
item;
|
|
2391
|
+
this.appendMessages(item.messages);
|
|
2392
|
+
});
|
|
2393
|
+
this.ccGroupMemberBanned = CometChatGroupEvents.ccGroupMemberBanned.subscribe((item) => {
|
|
2394
|
+
this.addMessage(item.message);
|
|
2395
|
+
});
|
|
2396
|
+
this.ccGroupMemberKicked = CometChatGroupEvents.ccGroupMemberKicked.subscribe((item) => {
|
|
2397
|
+
this.addMessage(item.message);
|
|
2398
|
+
});
|
|
2399
|
+
this.ccGroupMemberScopeChanged = CometChatGroupEvents.ccGroupMemberScopeChanged.subscribe((item) => {
|
|
2400
|
+
this.addMessage(item.message);
|
|
2401
|
+
});
|
|
2402
|
+
this.ccGroupLeft = CometChatGroupEvents.ccGroupLeft.subscribe((item) => {
|
|
2403
|
+
this.addMessage(item.message);
|
|
2404
|
+
});
|
|
2405
|
+
this.ccMessageEdit = CometChatMessageEvents.ccMessageEdited.subscribe((object) => {
|
|
2406
|
+
if (object?.status == MessageStatus.success) {
|
|
2407
|
+
this.updateMessage(object.message);
|
|
2408
|
+
}
|
|
2409
|
+
});
|
|
2410
|
+
this.ccMessageSent = CometChatMessageEvents.ccMessageSent.subscribe((obj) => {
|
|
2411
|
+
let message = obj.message;
|
|
2412
|
+
switch (obj.status) {
|
|
2413
|
+
case MessageStatus.inprogress: {
|
|
2414
|
+
this.addMessage(message);
|
|
2415
|
+
this.playAudio();
|
|
2416
|
+
break;
|
|
2417
|
+
}
|
|
2418
|
+
case MessageStatus.success: {
|
|
2419
|
+
if (message.getParentMessageId() || this.parentMessageId) {
|
|
2420
|
+
this.updateReplyCount(message);
|
|
2421
|
+
}
|
|
2422
|
+
this.updateMessage(message, true);
|
|
2423
|
+
break;
|
|
2424
|
+
}
|
|
2425
|
+
case MessageStatus.success: {
|
|
2426
|
+
this.updateMessage(message);
|
|
2427
|
+
}
|
|
2428
|
+
}
|
|
2429
|
+
});
|
|
2430
|
+
this.ccMessageDelete = CometChatMessageEvents.ccMessageDeleted.subscribe((messageObject) => {
|
|
2431
|
+
this.removeMessage(messageObject);
|
|
2432
|
+
this.ref.detectChanges();
|
|
2433
|
+
});
|
|
2434
|
+
this.ccCallEnded = CometChatCallEvents.ccCallEnded.subscribe((call) => {
|
|
2435
|
+
this.showOngoingCall = false;
|
|
2436
|
+
this.sessionId = "";
|
|
2437
|
+
if (call) {
|
|
2438
|
+
this.addMessage(call);
|
|
2439
|
+
}
|
|
2440
|
+
this.ref.detectChanges();
|
|
2441
|
+
});
|
|
2442
|
+
this.ccCallRejected = CometChatCallEvents.ccCallRejected.subscribe((call) => {
|
|
2443
|
+
this.addMessage(call);
|
|
2444
|
+
});
|
|
2445
|
+
this.ccOutgoingCall = CometChatCallEvents.ccOutgoingCall.subscribe((call) => {
|
|
2446
|
+
this.addMessage(call);
|
|
2447
|
+
});
|
|
2448
|
+
this.ccCallAccepted = CometChatCallEvents.ccCallAccepted.subscribe((call) => {
|
|
2449
|
+
this.addMessage(call);
|
|
2450
|
+
});
|
|
2451
|
+
}
|
|
2452
|
+
getReplies() {
|
|
2453
|
+
let smartReply = this.smartReplyMessage;
|
|
2454
|
+
const smartReplyObject = smartReply?.metadata?.[SmartRepliesConstants.injected]?.extensions?.[SmartRepliesConstants.smart_reply];
|
|
2455
|
+
if (smartReplyObject?.reply_positive && smartReplyObject?.reply_neutral && smartReplyObject?.reply_negative) {
|
|
2456
|
+
const { reply_positive, reply_neutral, reply_negative } = smartReplyObject;
|
|
2457
|
+
return [reply_positive, reply_neutral, reply_negative];
|
|
2458
|
+
}
|
|
2459
|
+
return null;
|
|
2460
|
+
}
|
|
2461
|
+
unsubscribeToEvents() {
|
|
2462
|
+
this.ccGroupMemberAdded?.unsubscribe();
|
|
2463
|
+
this.ccGroupMemberBanned?.unsubscribe();
|
|
2464
|
+
this.ccGroupMemberJoined?.unsubscribe();
|
|
2465
|
+
this.ccGroupMemberKicked?.unsubscribe();
|
|
2466
|
+
this.ccOwnershipChanged?.unsubscribe();
|
|
2467
|
+
this.ccGroupLeft?.unsubscribe();
|
|
2468
|
+
this.ccMessageEdit?.unsubscribe();
|
|
2469
|
+
this.ccMessageSent?.unsubscribe();
|
|
2470
|
+
this.ccLiveReaction?.unsubscribe();
|
|
2471
|
+
this.ccMessageDelete?.unsubscribe();
|
|
2472
|
+
this.ccGroupMemberScopeChanged?.unsubscribe();
|
|
2473
|
+
}
|
|
2474
|
+
}
|
|
2475
|
+
CometChatMessageListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatMessageListComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1.CometChatThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2476
|
+
CometChatMessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometChatMessageListComponent, selector: "cometchat-message-list", inputs: { hideError: "hideError", errorStateView: "errorStateView", loadingStateView: "loadingStateView", emptyStateView: "emptyStateView", errorStateText: "errorStateText", emptyStateText: "emptyStateText", loadingIconURL: "loadingIconURL", user: "user", group: "group", disableReceipt: "disableReceipt", disableSoundForMessages: "disableSoundForMessages", customSoundForMessages: "customSoundForMessages", readIcon: "readIcon", deliveredIcon: "deliveredIcon", sentIcon: "sentIcon", waitIcon: "waitIcon", errorIcon: "errorIcon", alignment: "alignment", showAvatar: "showAvatar", datePattern: "datePattern", timestampAlignment: "timestampAlignment", DateSeparatorPattern: "DateSeparatorPattern", templates: "templates", messagesRequestBuilder: "messagesRequestBuilder", newMessageIndicatorText: "newMessageIndicatorText", scrollToBottomOnNewMessages: "scrollToBottomOnNewMessages", thresholdValue: "thresholdValue", onThreadRepliesClick: "onThreadRepliesClick", headerView: "headerView", footerView: "footerView", parentMessageId: "parentMessageId", avatarStyle: "avatarStyle", backdropStyle: "backdropStyle", dateSeparatorStyle: "dateSeparatorStyle", messageListStyle: "messageListStyle", onError: "onError" }, viewQueries: [{ propertyName: "listScroll", first: true, predicate: ["listScroll"], descendants: true }, { propertyName: "bottom", first: true, predicate: ["bottom"], descendants: true }, { propertyName: "top", first: true, predicate: ["top"], descendants: true }, { propertyName: "textBubble", first: true, predicate: ["textBubble"], descendants: true }, { propertyName: "threadMessageBubble", first: true, predicate: ["threadMessageBubble"], descendants: true }, { propertyName: "fileBubble", first: true, predicate: ["fileBubble"], descendants: true }, { propertyName: "audioBubble", first: true, predicate: ["audioBubble"], descendants: true }, { propertyName: "videoBubble", first: true, predicate: ["videoBubble"], descendants: true }, { propertyName: "imageBubble", first: true, predicate: ["imageBubble"], descendants: true }, { propertyName: "stickerBubble", first: true, predicate: ["stickerBubble"], descendants: true }, { propertyName: "documentBubble", first: true, predicate: ["documentBubble"], descendants: true }, { propertyName: "whiteboardBubble", first: true, predicate: ["whiteboardBubble"], descendants: true }, { propertyName: "popoverRef", first: true, predicate: ["popoverRef"], descendants: true }, { propertyName: "directCalling", first: true, predicate: ["directCalling"], descendants: true }, { propertyName: "pollBubble", first: true, predicate: ["pollBubble"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-message-list__wrapper\" [ngStyle]=\"wrapperStyle()\">\n <div class=\"cc-message-list__header-view\">\n<div *ngIf=\"headerView\">\n <ng-container *ngTemplateOutlet=\"headerView\">\n </ng-container>\n</div>\n </div>\n <div class=\"cc-message-list\" #listScroll>\n <div class=\"cc-message-list__top\" #top>\n </div>\n <div class=\"cc-message-list__decorator-message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"cc-message-list__loading-view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"loadingStyle()\">\n </cometchat-loader>\n <span class=\"cc-message-list__customview--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__error-view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\" [text]=\"errorStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__empty-view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\" [text]=\"emptyStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"cc-message-list__bubble\" *ngFor=\"let message of messagesList; let i = index\">\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i === 0)\">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message!.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i > 0 && isDateDifferent(messagesList[i - 1]?.getSentAt(), messagesList[i]?.getSentAt()))\n \">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div *ngIf=\"getBubbleWrapper(message) \">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [leadingView]=\" showAvatar ? leadingView : null\" [bottomView]=\"enableReactions ? reactionView : null\"\n [headerView]=\"getHeaderView(message) || message?.getCategory() != MessageCategory.action && showHeaderTitle(message) ? bubbleHeader : null\" [footerView]=\"footerView\" [contentView]=\"contentView\" [threadView]=\"threadView\"\n [id]=\"message?.getId() || message?.getMuid()\" [options]=\"setMessageOptions(message)\"\n [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"setBubbleAlignment(message)\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && !message.getDeletedAt() && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"deliveredIcon\" [readIcon]=\"readIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n <div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n <cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n </cometchat-avatar>\n </div>\n</ng-template>\n<ng-template #bubbleHeader>\n <div *ngIf=\"getHeaderView(message);else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n<ng-template #defaultHeader>\n <div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n <cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n <cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n </div>\n</ng-template>\n</ng-template>\n<ng-template #threadView>\n <div class=\"cc-message-list__threadreplies\" *ngIf=\"message?.getReplyCount() && !message.getDeletedAt()\" >\n <cometchat-divider [dividerStyle]=\"dividerStyle\"></cometchat-divider>\n <cometchat-button [text]=\"getThreadCount(message)\" [buttonStyle]=\"getThreadViewStyle(message)\" [iconURL]=\"threadOpenIcon\" (cc-button-clicked)=\"openThreadView(message)\">\n </cometchat-button>\n </div>\n</ng-template>\n </cometchat-message-bubble>\n </div>\n </div>\n <div class=\"cc-message-list__bottom\" #bottom>\n </div>\n </div>\n <div class=\"cc-message-list__footer-view\">\n <div *ngIf=\"footerView;else footer\">\n <ng-container *ngTemplateOutlet=\"footerView\">\n </ng-container>\n </div>\n <ng-template #footer>\n <div class=\"cc-message-list__smart-replies\" *ngIf=\"showSmartReply && getReplies() && (!UnreadCount || UnreadCount.length == 0)\">\n <smart-replies [smartReplyStyle]=\"smartReplyStyle\" [replies]=\"getReplies()\" (cc-reply-clicked)=\"sendReply($event)\" (cc-close-clicked)=\"closeSmartReply()\">\n </smart-replies>\n </div>\n<div class=\"cc-message-list__message-indicator\" *ngIf=\"UnreadCount && UnreadCount.length > 0 && !isOnBottom\">\n <cometchat-button [text]=\"newMessageCount\" [buttonStyle]=\"unreadMessagesStyle\" (cc-button-clicked)=\"scrollToBottom()\"></cometchat-button>\n</div>\n </ng-template>\n </div>\n\n</div>\n<!-- default bubbles -->\n<ng-template #textBubble let-message>\n <cometchat-text-bubble *ngIf=\"message?.type == MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.message\"></cometchat-text-bubble>\n <cometchat-text-bubble *ngIf=\"message?.getDeletedAt()\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"localize('MESSAGE_IS_DELETED')\"></cometchat-text-bubble>\n<cometchat-text-bubble *ngIf=\"!isTranslated(message) && !getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n<link-preview [linkPreviewStyle]=\"linkPreviewStyle\" (cc-link-clicked)=\"openLinkURL($event)\" *ngIf=\"!message?.getDeletedAt() && getLinkPreview(message) && enableLinkPreview\" [title]=\"getLinkPreviewDetails('title',message)\" [description]=\"getLinkPreviewDetails('description',message)\" [URL]=\"getLinkPreviewDetails('url',message)\" [image]=\"getLinkPreviewDetails('image',message)\" [favIconURL]=\"getLinkPreviewDetails('favicon',message)\">\n <cometchat-text-bubble\n *ngIf=\"!isTranslated(message) && getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\"\n [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n</link-preview>\n<message-translation-bubble [alignment]=\"getBubbleAlignment(message)\" *ngIf=\"isTranslated(message)\" [messageTranslationStyle]=\"setTranslationStyle(message)\" [translatedText]=\"isTranslated(message)\">\n <cometchat-text-bubble *ngIf=\" !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.text\"></cometchat-text-bubble>\n\n</message-translation-bubble>\n</ng-template>\n<ng-template #fileBubble let-message>\n\n <cometchat-file-bubble [fileStyle]=\"setFileBubbleStyle(message)\" [downloadIconURL]=\"downloadIconURL\" [subtitle]=\"localize('SHARED_FILE')\" [title]=\"message?.data?.attachments ? message?.data?.attachments[0]?.name: ''\" [fileURL]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\"></cometchat-file-bubble>\n</ng-template>\n<ng-template #audioBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.audio\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n <cometchat-audio-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" > </cometchat-audio-bubble>\n</ng-template>\n<ng-template #videoBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.video\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n\n <cometchat-video-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [videoStyle]=\"videoBubbleStyle\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" [poster]=\" getImageThumbnail(message)\"></cometchat-video-bubble>\n</ng-template>\n<ng-template #imageBubble let-message>\n <image-moderation (cc-show-dialog)=\"openWarningDialog($event)\" *ngIf=\"!message.getDeletedAt() && enableImageModeration\" [message]=\"message\" [imageModerationStyle]=\"imageModerationStyle\">\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n </image-moderation>\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" *ngIf=\"!message.getDeletedAt() && !enableImageModeration\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n</ng-template>\n<ng-template #customTextBubble>\n</ng-template>\n<ng-template #stickerBubble let-message>\n <cometchat-image-bubble [src]=\"getSticker(message)\" [imageStyle]=\"imageBubbleStyle\" ></cometchat-image-bubble>\n\n</ng-template>\n<ng-template #whiteboardBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"whiteboardIconURL\" [title]=\"whiteboardTitle\" [buttonText]=\"whiteboardButtonText\" [subtitle]=\"whiteboardSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #documentBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"documentIconURL\" [title]=\"documentTitle\" [buttonText]=\"documentButtonText\" [subtitle]=\"documentSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #directCalling let-message>\n <cometchat-document-bubble [hideSeparator]=\"true\" [iconAlignment]=\"callBubbleAlignment\" [documentStyle]=\"getCallBubbleStyle(message)\" [URL]=\"getSessionId(message)\" [ccClicked]=\"startDirectCall\" [iconURL]=\"directCallIconURL\" [title]=\"getCallBubbleTitle(message)\" [buttonText]=\"joinCallButtonText\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #pollBubble let-message>\n <polls-bubble [pollStyle]=\"pollBubbleStyle\" [pollQuestion]=\"getPollBubbleData(message,'question')\" [pollId]=\"getPollBubbleData(message,'id')\"\n [loggedInUser]=\"loggedInUser\" [senderUid]=\"getPollBubbleData(message)\" [metadata]=\"message?.metadata\"></polls-bubble>\n\n</ng-template>\n\n<!-- thread bubble view -->\n<ng-template #threadMessageBubble let-message>\n <div *ngIf=\"getBubbleWrapper(message)\">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [bottomView]=\"enableReactions ? reactionView : null\" [leadingView]=\" showAvatar ? leadingView : null\" [headerView]=\"bubbleHeader\" [footerView]=\"footerView\"\n [contentView]=\"contentView\" [id]=\"message?.getId() || message?.getMuid()\" [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"threadedAlignment\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"\" [readIcon]=\"deliveredIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n<div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n<cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n</cometchat-avatar>\n</div>\n</ng-template>\n<ng-template #bubbleHeader>\n<div *ngIf=\"getHeaderView(message);else defaultHeader\">\n<ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n</ng-container>\n</div>\n<ng-template #defaultHeader>\n<div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n<cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n<cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n</div>\n</ng-template>\n</ng-template>\n </cometchat-message-bubble>\n\n</ng-template>\n\n\n<!-- -->\n<ng-template #bubbleView></ng-template>\n<cometchat-popover [popoverStyle]=\"popoverStyle\" #popoverRef [placement]=\"keyboardAlignment\">\n<cometchat-emoji-keyboard (cc-emoji-clicked)=\"addReaction($event)\" slot=\"content\"></cometchat-emoji-keyboard>\n</cometchat-popover>\n<cometchat-backdrop *ngIf=\"openConfirmDialog\" [backdropStyle]=\"backdropStyle\">\n <cometchat-confirm-dialog [title]=\"''\" [messageText]=\"warningText\" (cc-confirm-clicked)=\"onConfirmClick()\" [cancelButtonText]=\"cancelText\" [confirmButtonText]=\"confirmText\" (cc-cancel-clicked)=\"onCancelClick()\" [confirmDialogStyle]=\"confirmDialogStyle\">\n\n </cometchat-confirm-dialog>\n</cometchat-backdrop>\n<full-screen-viewer (cc-close-clicked)=\"closeImageInFullScreen()\" *ngIf=\"openFullscreenView\" [URL]=\"imageurlToOpen\" [closeIconURL]=\"closeIconURL\" [fullScreenViewerStyle]=\"fullScreenViewerStyle\">\n\n</full-screen-viewer>\n\n<!-- ongoing callscreen for direct call -->\n<cometchat-ongoing-call *ngIf=\"showOngoingCall\" [ongoingCallStyle]=\"ongoingCallStyle\" [sessionID]=\"sessionId\"></cometchat-ongoing-call>\n", styles: [".cc-message-list{height:100%;width:100%;overflow-y:auto;position:relative}.cc-message-list__wrapper{height:100%;width:100%;padding:8px;overflow-y:hidden}.cc-message-list__bubble-footer{display:flex;justify-content:center;align-items:center}.cc-message-list__date-container{text-align:center;margin:5px 0}.cc-message-list__smart-replies{height:-moz-fit-content;height:fit-content;width:100%;position:absolute;bottom:0}.cc-message-list__date{border-radius:10px}.cc-message-list__threadreplies{min-width:130px;width:100%}.cc-message-list__message-indicator{height:25px;display:flex;align-items:center;justify-content:center;width:100%;bottom:0%;position:absolute}.cc-message-list__footer-view{z-index:2;position:relative;width:100%}.cc-message-list__decorator-message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.cc-message-list::-webkit-scrollbar{background:transparent;width:8px}.cc-message-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}\n"], components: [{ type: i2.CometChatMessageBubbleComponent, selector: "cometchat-message-bubble", inputs: ["messageBubbleStyle", "alignment", "options", "id", "leadingView", "headerView", "replyView", "contentView", "threadView", "footerView", "bottomView", "moreIconURL", "topMenuSize"] }, { type: i3.CometChatOngoingCallComponent, selector: "cometchat-ongoing-call", inputs: ["ongoingCallStyle", "resizeIconHoverText", "sessionID", "minimizeIconURL", "maximizeIconURL", "callSettingsBuilder"] }], directives: [{ type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2477
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatMessageListComponent, decorators: [{
|
|
2478
|
+
type: Component,
|
|
2479
|
+
args: [{ selector: "cometchat-message-list", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-message-list__wrapper\" [ngStyle]=\"wrapperStyle()\">\n <div class=\"cc-message-list__header-view\">\n<div *ngIf=\"headerView\">\n <ng-container *ngTemplateOutlet=\"headerView\">\n </ng-container>\n</div>\n </div>\n <div class=\"cc-message-list\" #listScroll>\n <div class=\"cc-message-list__top\" #top>\n </div>\n <div class=\"cc-message-list__decorator-message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"cc-message-list__loading-view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"loadingStyle()\">\n </cometchat-loader>\n <span class=\"cc-message-list__customview--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__error-view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\" [text]=\"errorStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"cc-message-list__empty-view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\" [text]=\"emptyStateText\"\n >\n </cometchat-label>\n <span class=\"cc-message-list__custom-view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"cc-message-list__bubble\" *ngFor=\"let message of messagesList; let i = index\">\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i === 0)\">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message!.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div class=\"cc-message-list__date-container\" *ngIf=\"(i > 0 && isDateDifferent(messagesList[i - 1]?.getSentAt(), messagesList[i]?.getSentAt()))\n \">\n <span class=\"cc-message-list__date\" >\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [pattern]=\"DateSeparatorPattern\" [dateStyle]=\"dateSeparatorStyle\"\n >\n </cometchat-date>\n </span>\n </div>\n <div *ngIf=\"getBubbleWrapper(message) \">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [leadingView]=\" showAvatar ? leadingView : null\" [bottomView]=\"enableReactions ? reactionView : null\"\n [headerView]=\"getHeaderView(message) || message?.getCategory() != MessageCategory.action && showHeaderTitle(message) ? bubbleHeader : null\" [footerView]=\"footerView\" [contentView]=\"contentView\" [threadView]=\"threadView\"\n [id]=\"message?.getId() || message?.getMuid()\" [options]=\"setMessageOptions(message)\"\n [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"setBubbleAlignment(message)\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && !message.getDeletedAt() && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"deliveredIcon\" [readIcon]=\"readIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n <div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n <cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n </cometchat-avatar>\n </div>\n</ng-template>\n<ng-template #bubbleHeader>\n <div *ngIf=\"getHeaderView(message);else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n<ng-template #defaultHeader>\n <div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n <cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n <cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n </div>\n</ng-template>\n</ng-template>\n<ng-template #threadView>\n <div class=\"cc-message-list__threadreplies\" *ngIf=\"message?.getReplyCount() && !message.getDeletedAt()\" >\n <cometchat-divider [dividerStyle]=\"dividerStyle\"></cometchat-divider>\n <cometchat-button [text]=\"getThreadCount(message)\" [buttonStyle]=\"getThreadViewStyle(message)\" [iconURL]=\"threadOpenIcon\" (cc-button-clicked)=\"openThreadView(message)\">\n </cometchat-button>\n </div>\n</ng-template>\n </cometchat-message-bubble>\n </div>\n </div>\n <div class=\"cc-message-list__bottom\" #bottom>\n </div>\n </div>\n <div class=\"cc-message-list__footer-view\">\n <div *ngIf=\"footerView;else footer\">\n <ng-container *ngTemplateOutlet=\"footerView\">\n </ng-container>\n </div>\n <ng-template #footer>\n <div class=\"cc-message-list__smart-replies\" *ngIf=\"showSmartReply && getReplies() && (!UnreadCount || UnreadCount.length == 0)\">\n <smart-replies [smartReplyStyle]=\"smartReplyStyle\" [replies]=\"getReplies()\" (cc-reply-clicked)=\"sendReply($event)\" (cc-close-clicked)=\"closeSmartReply()\">\n </smart-replies>\n </div>\n<div class=\"cc-message-list__message-indicator\" *ngIf=\"UnreadCount && UnreadCount.length > 0 && !isOnBottom\">\n <cometchat-button [text]=\"newMessageCount\" [buttonStyle]=\"unreadMessagesStyle\" (cc-button-clicked)=\"scrollToBottom()\"></cometchat-button>\n</div>\n </ng-template>\n </div>\n\n</div>\n<!-- default bubbles -->\n<ng-template #textBubble let-message>\n <cometchat-text-bubble *ngIf=\"message?.type == MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.message\"></cometchat-text-bubble>\n <cometchat-text-bubble *ngIf=\"message?.getDeletedAt()\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"localize('MESSAGE_IS_DELETED')\"></cometchat-text-bubble>\n<cometchat-text-bubble *ngIf=\"!isTranslated(message) && !getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n<link-preview [linkPreviewStyle]=\"linkPreviewStyle\" (cc-link-clicked)=\"openLinkURL($event)\" *ngIf=\"!message?.getDeletedAt() && getLinkPreview(message) && enableLinkPreview\" [title]=\"getLinkPreviewDetails('title',message)\" [description]=\"getLinkPreviewDetails('description',message)\" [URL]=\"getLinkPreviewDetails('url',message)\" [image]=\"getLinkPreviewDetails('image',message)\" [favIconURL]=\"getLinkPreviewDetails('favicon',message)\">\n <cometchat-text-bubble\n *ngIf=\"!isTranslated(message) && getLinkPreview(message) && !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\"\n [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"getTextMessage(message)\"></cometchat-text-bubble>\n</link-preview>\n<message-translation-bubble [alignment]=\"getBubbleAlignment(message)\" *ngIf=\"isTranslated(message)\" [messageTranslationStyle]=\"setTranslationStyle(message)\" [translatedText]=\"isTranslated(message)\">\n <cometchat-text-bubble *ngIf=\" !message?.deletedAt && message?.type != MessageTypesConstant.groupMember\" [textStyle]=\"setTextBubbleStyle(message)\" [text]=\"message?.text\"></cometchat-text-bubble>\n\n</message-translation-bubble>\n</ng-template>\n<ng-template #fileBubble let-message>\n\n <cometchat-file-bubble [fileStyle]=\"setFileBubbleStyle(message)\" [downloadIconURL]=\"downloadIconURL\" [subtitle]=\"localize('SHARED_FILE')\" [title]=\"message?.data?.attachments ? message?.data?.attachments[0]?.name: ''\" [fileURL]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\"></cometchat-file-bubble>\n</ng-template>\n<ng-template #audioBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.audio\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n <cometchat-audio-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" > </cometchat-audio-bubble>\n</ng-template>\n<ng-template #videoBubble let-message>\n <cometchat-icon-button [disabled]=\"true\" *ngIf=\"message?.category == callConstant && message?.type == MessageTypesConstant.video\" [iconURL]=\"getCallTypeIcon(message)\" [buttonStyle]=\"callStatusStyle(message)\" [text]=\"getCallActionMessage(message)\"></cometchat-icon-button>\n\n <cometchat-video-bubble *ngIf=\"!message.getDeletedAt() && message?.category != callConstant\" [videoStyle]=\"videoBubbleStyle\" [src]=\"message?.data?.attachments ? message?.data?.attachments[0]?.url : ''\" [poster]=\" getImageThumbnail(message)\"></cometchat-video-bubble>\n</ng-template>\n<ng-template #imageBubble let-message>\n <image-moderation (cc-show-dialog)=\"openWarningDialog($event)\" *ngIf=\"!message.getDeletedAt() && enableImageModeration\" [message]=\"message\" [imageModerationStyle]=\"imageModerationStyle\">\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n </image-moderation>\n <cometchat-image-bubble (cc-image-clicked)=\"openImageInFullScreen(message)\" *ngIf=\"!message.getDeletedAt() && !enableImageModeration\" [src]=\" getImageThumbnail(message)\" [placeholderImage]=\"placeholderIconURL\"></cometchat-image-bubble>\n</ng-template>\n<ng-template #customTextBubble>\n</ng-template>\n<ng-template #stickerBubble let-message>\n <cometchat-image-bubble [src]=\"getSticker(message)\" [imageStyle]=\"imageBubbleStyle\" ></cometchat-image-bubble>\n\n</ng-template>\n<ng-template #whiteboardBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"whiteboardIconURL\" [title]=\"whiteboardTitle\" [buttonText]=\"whiteboardButtonText\" [subtitle]=\"whiteboardSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #documentBubble let-message>\n <cometchat-document-bubble [hideSeparator]=\"false\" [iconAlignment]=\"documentBubbleAlignment\" [documentStyle]=\"documentBubbleStyle\" [URL]=\"getWhiteboardDocument(message)\" [ccClicked]=\"launchCollaborativeWhiteboardDocument\" [iconURL]=\"documentIconURL\" [title]=\"documentTitle\" [buttonText]=\"documentButtonText\" [subtitle]=\"documentSubitle\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #directCalling let-message>\n <cometchat-document-bubble [hideSeparator]=\"true\" [iconAlignment]=\"callBubbleAlignment\" [documentStyle]=\"getCallBubbleStyle(message)\" [URL]=\"getSessionId(message)\" [ccClicked]=\"startDirectCall\" [iconURL]=\"directCallIconURL\" [title]=\"getCallBubbleTitle(message)\" [buttonText]=\"joinCallButtonText\"></cometchat-document-bubble>\n\n</ng-template>\n<ng-template #pollBubble let-message>\n <polls-bubble [pollStyle]=\"pollBubbleStyle\" [pollQuestion]=\"getPollBubbleData(message,'question')\" [pollId]=\"getPollBubbleData(message,'id')\"\n [loggedInUser]=\"loggedInUser\" [senderUid]=\"getPollBubbleData(message)\" [metadata]=\"message?.metadata\"></polls-bubble>\n\n</ng-template>\n\n<!-- thread bubble view -->\n<ng-template #threadMessageBubble let-message>\n <div *ngIf=\"getBubbleWrapper(message)\">\n <ng-container *ngTemplateOutlet=\"getBubbleWrapper(message)\">\n </ng-container>\n </div>\n <cometchat-message-bubble *ngIf=\"!getBubbleWrapper(message)\" [bottomView]=\"enableReactions ? reactionView : null\" [leadingView]=\" showAvatar ? leadingView : null\" [headerView]=\"bubbleHeader\" [footerView]=\"footerView\"\n [contentView]=\"contentView\" [id]=\"message?.getId() || message?.getMuid()\" [messageBubbleStyle]=\"setMessageBubbleStyle(message)\" [alignment]=\"threadedAlignment\">\n <ng-template #contentView>\n <ng-container *ngTemplateOutlet=\"getContentView(message);context:{ $implicit: message }\" >\n </ng-container>\n </ng-template>\n <ng-template #reactionView>\n <reactions-view [messageObject]=\"message\" [alignment]=\"setBubbleAlignment(message)\"\n [loggedInUser]=\"loggedInUser\" [reactionsStyle]=\"reactionsStyle(message)\"></reactions-view>\n </ng-template>\n <ng-template #footerView>\n <div class=\"cc-message-list__bubble-footer\">\n <div *ngIf=\"getFooterView(message);else bubbleFooter\">\n <ng-container *ngTemplateOutlet=\"getFooterView(message);context:{ $implicit: message }\" >\n </ng-container>\n </div>\n <ng-template #bubbleFooter>\n <div class=\"cc-message-list__bubble-date\" *ngIf=\"timestampAlignment == timestampEnum.bottom && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\">\n <cometchat-date [timestamp]=\"message?.getSentAt()\" [dateStyle]=\"bubbleDateStyle\" [pattern]=\"datePattern\">\n </cometchat-date>\n </div>\n <div *ngIf=\" !message?.getDeletedAt() && !disableReceipt && (!message?.getSender() ||this.loggedInUser.getUid() == message?.getSender()?.getUid()) && message?.getCategory() != MessageCategory.action && message?.getCategory() != MessageCategory.call\" class=\"cc-message-list__receipt\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(message)\" [receiptStyle]=\"receiptStyle\" [waitIcon]=\"waitIcon\" [sentIcon]=\"sentIcon\" [deliveredIcon]=\"\" [readIcon]=\"deliveredIcon\" [errorIcon]=\"errorIcon\"></cometchat-receipt>\n </div>\n </ng-template>\n </div>\n </ng-template>\n<ng-template #leadingView>\n<div *ngIf=\" message?.getCategory() != MessageCategory.action && showHeaderTitle(message)\" >\n<cometchat-avatar [name]=\"message?.getSender()?.getName()\" [style]=\"avatarStyle\" [image]=\"message?.getSender()?.getAvatar()\">\n</cometchat-avatar>\n</div>\n</ng-template>\n<ng-template #bubbleHeader>\n<div *ngIf=\"getHeaderView(message);else defaultHeader\">\n<ng-container *ngTemplateOutlet=\"getHeaderView(message);context:{ $implicit: message }\" >\n</ng-container>\n</div>\n<ng-template #defaultHeader>\n<div class=\"cc-message-list__bubble-header\" *ngIf=\"message?.getCategory() != MessageCategory.action && showHeaderTitle(message) && message?.getCategory() != MessageCategory.call\">\n<cometchat-label [text]=\"message?.getSender()?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n<cometchat-date [pattern]=\"datePattern\" [timestamp]=\"message?.getSentAt()\" [style]=\"bubbleDateStyle\" *ngIf=\"timestampAlignment == timestampEnum.top\"></cometchat-date>\n</div>\n</ng-template>\n</ng-template>\n </cometchat-message-bubble>\n\n</ng-template>\n\n\n<!-- -->\n<ng-template #bubbleView></ng-template>\n<cometchat-popover [popoverStyle]=\"popoverStyle\" #popoverRef [placement]=\"keyboardAlignment\">\n<cometchat-emoji-keyboard (cc-emoji-clicked)=\"addReaction($event)\" slot=\"content\"></cometchat-emoji-keyboard>\n</cometchat-popover>\n<cometchat-backdrop *ngIf=\"openConfirmDialog\" [backdropStyle]=\"backdropStyle\">\n <cometchat-confirm-dialog [title]=\"''\" [messageText]=\"warningText\" (cc-confirm-clicked)=\"onConfirmClick()\" [cancelButtonText]=\"cancelText\" [confirmButtonText]=\"confirmText\" (cc-cancel-clicked)=\"onCancelClick()\" [confirmDialogStyle]=\"confirmDialogStyle\">\n\n </cometchat-confirm-dialog>\n</cometchat-backdrop>\n<full-screen-viewer (cc-close-clicked)=\"closeImageInFullScreen()\" *ngIf=\"openFullscreenView\" [URL]=\"imageurlToOpen\" [closeIconURL]=\"closeIconURL\" [fullScreenViewerStyle]=\"fullScreenViewerStyle\">\n\n</full-screen-viewer>\n\n<!-- ongoing callscreen for direct call -->\n<cometchat-ongoing-call *ngIf=\"showOngoingCall\" [ongoingCallStyle]=\"ongoingCallStyle\" [sessionID]=\"sessionId\"></cometchat-ongoing-call>\n", styles: [".cc-message-list{height:100%;width:100%;overflow-y:auto;position:relative}.cc-message-list__wrapper{height:100%;width:100%;padding:8px;overflow-y:hidden}.cc-message-list__bubble-footer{display:flex;justify-content:center;align-items:center}.cc-message-list__date-container{text-align:center;margin:5px 0}.cc-message-list__smart-replies{height:-moz-fit-content;height:fit-content;width:100%;position:absolute;bottom:0}.cc-message-list__date{border-radius:10px}.cc-message-list__threadreplies{min-width:130px;width:100%}.cc-message-list__message-indicator{height:25px;display:flex;align-items:center;justify-content:center;width:100%;bottom:0%;position:absolute}.cc-message-list__footer-view{z-index:2;position:relative;width:100%}.cc-message-list__decorator-message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.cc-message-list::-webkit-scrollbar{background:transparent;width:8px}.cc-message-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}\n"] }]
|
|
2480
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1.CometChatThemeService }]; }, propDecorators: { listScroll: [{
|
|
2481
|
+
type: ViewChild,
|
|
2482
|
+
args: ["listScroll", { static: false }]
|
|
2483
|
+
}], bottom: [{
|
|
2484
|
+
type: ViewChild,
|
|
2485
|
+
args: ["bottom", { static: false }]
|
|
2486
|
+
}], top: [{
|
|
2487
|
+
type: ViewChild,
|
|
2488
|
+
args: ["top", { static: false }]
|
|
2489
|
+
}], textBubble: [{
|
|
2490
|
+
type: ViewChild,
|
|
2491
|
+
args: ["textBubble", { static: false }]
|
|
2492
|
+
}], threadMessageBubble: [{
|
|
2493
|
+
type: ViewChild,
|
|
2494
|
+
args: ["threadMessageBubble", { static: false }]
|
|
2495
|
+
}], fileBubble: [{
|
|
2496
|
+
type: ViewChild,
|
|
2497
|
+
args: ["fileBubble", { static: false }]
|
|
2498
|
+
}], audioBubble: [{
|
|
2499
|
+
type: ViewChild,
|
|
2500
|
+
args: ["audioBubble", { static: false }]
|
|
2501
|
+
}], videoBubble: [{
|
|
2502
|
+
type: ViewChild,
|
|
2503
|
+
args: ["videoBubble", { static: false }]
|
|
2504
|
+
}], imageBubble: [{
|
|
2505
|
+
type: ViewChild,
|
|
2506
|
+
args: ["imageBubble", { static: false }]
|
|
2507
|
+
}], stickerBubble: [{
|
|
2508
|
+
type: ViewChild,
|
|
2509
|
+
args: ["stickerBubble", { static: false }]
|
|
2510
|
+
}], documentBubble: [{
|
|
2511
|
+
type: ViewChild,
|
|
2512
|
+
args: ["documentBubble", { static: false }]
|
|
2513
|
+
}], whiteboardBubble: [{
|
|
2514
|
+
type: ViewChild,
|
|
2515
|
+
args: ["whiteboardBubble", { static: false }]
|
|
2516
|
+
}], popoverRef: [{
|
|
2517
|
+
type: ViewChild,
|
|
2518
|
+
args: ["popoverRef", { static: false }]
|
|
2519
|
+
}], directCalling: [{
|
|
2520
|
+
type: ViewChild,
|
|
2521
|
+
args: ["directCalling", { static: false }]
|
|
2522
|
+
}], pollBubble: [{
|
|
2523
|
+
type: ViewChild,
|
|
2524
|
+
args: ["pollBubble", { static: false }]
|
|
2525
|
+
}], hideError: [{
|
|
2526
|
+
type: Input
|
|
2527
|
+
}], errorStateView: [{
|
|
2528
|
+
type: Input
|
|
2529
|
+
}], loadingStateView: [{
|
|
2530
|
+
type: Input
|
|
2531
|
+
}], emptyStateView: [{
|
|
2532
|
+
type: Input
|
|
2533
|
+
}], errorStateText: [{
|
|
2534
|
+
type: Input
|
|
2535
|
+
}], emptyStateText: [{
|
|
2536
|
+
type: Input
|
|
2537
|
+
}], loadingIconURL: [{
|
|
2538
|
+
type: Input
|
|
2539
|
+
}], user: [{
|
|
2540
|
+
type: Input
|
|
2541
|
+
}], group: [{
|
|
2542
|
+
type: Input
|
|
2543
|
+
}], disableReceipt: [{
|
|
2544
|
+
type: Input
|
|
2545
|
+
}], disableSoundForMessages: [{
|
|
2546
|
+
type: Input
|
|
2547
|
+
}], customSoundForMessages: [{
|
|
2548
|
+
type: Input
|
|
2549
|
+
}], readIcon: [{
|
|
2550
|
+
type: Input
|
|
2551
|
+
}], deliveredIcon: [{
|
|
2552
|
+
type: Input
|
|
2553
|
+
}], sentIcon: [{
|
|
2554
|
+
type: Input
|
|
2555
|
+
}], waitIcon: [{
|
|
2556
|
+
type: Input
|
|
2557
|
+
}], errorIcon: [{
|
|
2558
|
+
type: Input
|
|
2559
|
+
}], alignment: [{
|
|
2560
|
+
type: Input
|
|
2561
|
+
}], showAvatar: [{
|
|
2562
|
+
type: Input
|
|
2563
|
+
}], datePattern: [{
|
|
2564
|
+
type: Input
|
|
2565
|
+
}], timestampAlignment: [{
|
|
2566
|
+
type: Input
|
|
2567
|
+
}], DateSeparatorPattern: [{
|
|
2568
|
+
type: Input
|
|
2569
|
+
}], templates: [{
|
|
2570
|
+
type: Input
|
|
2571
|
+
}], messagesRequestBuilder: [{
|
|
2572
|
+
type: Input
|
|
2573
|
+
}], newMessageIndicatorText: [{
|
|
2574
|
+
type: Input
|
|
2575
|
+
}], scrollToBottomOnNewMessages: [{
|
|
2576
|
+
type: Input
|
|
2577
|
+
}], thresholdValue: [{
|
|
2578
|
+
type: Input
|
|
2579
|
+
}], onThreadRepliesClick: [{
|
|
2580
|
+
type: Input
|
|
2581
|
+
}], headerView: [{
|
|
2582
|
+
type: Input
|
|
2583
|
+
}], footerView: [{
|
|
2584
|
+
type: Input
|
|
2585
|
+
}], parentMessageId: [{
|
|
2586
|
+
type: Input
|
|
2587
|
+
}], avatarStyle: [{
|
|
2588
|
+
type: Input
|
|
2589
|
+
}], backdropStyle: [{
|
|
2590
|
+
type: Input
|
|
2591
|
+
}], dateSeparatorStyle: [{
|
|
2592
|
+
type: Input
|
|
2593
|
+
}], messageListStyle: [{
|
|
2594
|
+
type: Input
|
|
2595
|
+
}], onError: [{
|
|
2596
|
+
type: Input
|
|
2597
|
+
}] } });
|
|
2598
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LW1lc3NhZ2UtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NvbWV0Q2hhdE1lc3NhZ2VMaXN0L2NvbWV0Y2hhdC1tZXNzYWdlLWxpc3QvY29tZXRjaGF0LW1lc3NhZ2UtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NvbWV0Q2hhdE1lc3NhZ2VMaXN0L2NvbWV0Y2hhdC1tZXNzYWdlLWxpc3QvY29tZXRjaGF0LW1lc3NhZ2UtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFLTCxTQUFTLEVBQ1QsdUJBQXVCLEdBT3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsU0FBUyxFQUFDLFdBQVcsRUFBaUIsWUFBWSxFQUE0RSxNQUFNLDJCQUEyQixDQUFBO0FBRXZLLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBNEIscUJBQXFCLEVBQUMsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUEwQixVQUFVLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFnRyxpQkFBaUIsRUFBRSxTQUFTLEVBQVUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqZSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsZ0NBQWdDLEVBQUUsOEJBQThCLEVBQUUsMkJBQTJCLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQXdGLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSx5QkFBeUIsQ0FBQztBQUN0ZSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUMsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBSTdFOzs7Ozs7OztFQVFFO0FBT0YsTUFBTSxPQUFPLDZCQUE2QjtJQWlTeEMsWUFBb0IsTUFBYyxFQUFVLEdBQXNCLEVBQVMsWUFBa0M7UUFBekYsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBL1FwRyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBSzNCLG1CQUFjLEdBQVcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckQsbUJBQWMsR0FBVyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2RCxtQkFBYyxHQUFXLG9CQUFvQixDQUFDO1FBRzlDLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUN6QywyQkFBc0IsR0FBVyxFQUFFLENBQUM7UUFDcEMsYUFBUSxHQUFXLHlCQUF5QixDQUFDO1FBQzdDLGtCQUFhLEdBQVcsOEJBQThCLENBQUM7UUFDdkQsYUFBUSxHQUFXLHlCQUF5QixDQUFDO1FBQzdDLGFBQVEsR0FBVyxpQkFBaUIsQ0FBQztRQUNyQyxjQUFTLEdBQVcsMEJBQTBCLENBQUE7UUFDOUMsY0FBUyxHQUF5QixvQkFBb0IsQ0FBQyxRQUFRLENBQUM7UUFDaEUsZUFBVSxHQUFZLElBQUksQ0FBQztRQUMzQixnQkFBVyxHQUFpQixZQUFZLENBQUMsSUFBSSxDQUFDO1FBQzlDLHVCQUFrQixHQUF1QixrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDbkUseUJBQW9CLEdBQWlCLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDOUQsY0FBUyxHQUErQixFQUFFLENBQUM7UUFFM0MsNEJBQXVCLEdBQVcsRUFBRSxDQUFDO1FBQ3JDLGdDQUEyQixHQUFZLEtBQUssQ0FBQztRQUM3QyxtQkFBYyxHQUFXLElBQUksQ0FBQztRQUs5QixnQkFBVyxHQUFnQjtZQUNsQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUNPLGtCQUFhLEdBQWM7WUFDbEMsTUFBTSxFQUFDLE1BQU07WUFDYixLQUFLLEVBQUMsTUFBTTtZQUNaLFVBQVUsRUFBQyxvQkFBb0I7U0FDaEMsQ0FBQTtRQUNRLHVCQUFrQixHQUFjO1lBQ3ZDLE1BQU0sRUFBRSxFQUFFO1lBQ1YsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBQ08scUJBQWdCLEdBQXFCO1lBQzVDLFlBQVksRUFBRSxnQkFBZ0I7WUFDOUIsYUFBYSxFQUFFLE9BQU87WUFDdEIsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixrQkFBa0IsRUFBRSxFQUFFO1lBQ3RCLHlCQUF5QixFQUFFLEVBQUU7WUFDN0IsbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLG9CQUFvQixFQUFFLEVBQUU7WUFDeEIsa0JBQWtCLEVBQUUsZ0JBQWdCO1lBQ3BDLG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsa0JBQWtCLEVBQUUsZ0JBQWdCO1lBQ3BDLG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsZUFBZSxFQUFFLE1BQU07U0FDeEIsQ0FBQztRQUNPLFlBQU8sR0FBRyxDQUFDLEtBQVMsRUFBQyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDcEIsQ0FBQyxDQUFBO1FBQ0QsVUFBSyxHQUFXLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsaUJBQVksR0FBa0I7WUFDN0IsS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsWUFBWSxFQUFFLEtBQUs7WUFDbkIsVUFBVSxFQUFFLE9BQU87WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsYUFBYSxFQUFFLE1BQU07WUFDckIsYUFBYSxFQUFFLG1CQUFtQjtZQUNsQyxtQkFBbUIsRUFBRSxLQUFLO1lBQzFCLGlCQUFpQixFQUFFLE9BQU87WUFDMUIsWUFBWSxFQUFDLE1BQU07U0FDcEIsQ0FBQztRQUNGLGlCQUFZLEdBQWdCLEVBQzNCLENBQUE7UUFDRCw0QkFBdUIsR0FBeUIscUJBQXFCLENBQUMsS0FBSyxDQUFBO1FBQzNFLHdCQUFtQixHQUF5QixxQkFBcUIsQ0FBQyxJQUFJLENBQUE7UUFDdEUseUJBQW9CLEdBQXdCLEVBQUUsQ0FBQTtRQUU5QyxrQkFBYSxHQUE2QixrQkFBa0IsQ0FBQztRQUN0RCxnQkFBVyxHQUFXLElBQUksQ0FBQTtRQUsxQixtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1QixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUNsQyxvQkFBZSxHQUFzQjtZQUNuQyxLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFBO1FBQ00sbUJBQWMsR0FBVyxLQUFLLENBQUM7UUFHdEMsc0JBQWlCLEdBQWdDLElBQUksQ0FBQztRQUMvQyxxQkFBZ0IsR0FBVyxLQUFLLENBQUM7UUFFakMsd0JBQW1CLEdBQVcsRUFBRSxDQUFDO1FBQ3hDLHFCQUFnQixHQUFvQixFQUFFLENBQUE7UUFDL0Isd0JBQW1CLEdBQUc7WUFDM0IsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLE9BQU8sRUFBRSxNQUFNO1lBQ2YsY0FBYyxFQUFFLFFBQVE7WUFDeEIsY0FBYyxFQUFFLGdCQUFnQjtZQUNoQyxLQUFLLEVBQUUsT0FBTztZQUNkLE1BQU0sRUFBQyxNQUFNO1lBQ2IsWUFBWSxFQUFDLE1BQU07U0FDcEIsQ0FBQTtRQUNNLGlCQUFZLEdBQWE7WUFDOUIsTUFBTSxFQUFFLEtBQUs7WUFDYixLQUFLLEVBQUUsTUFBTTtZQUNiLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUE7UUFDRCxvQkFBZSxHQUFvQixFQUFFLENBQUE7UUFDckMsZUFBVSxHQUFPO1lBQ2YsUUFBUSxFQUFDLGdCQUFnQjtZQUN6QixTQUFTLEVBQUMsTUFBTTtTQUNqQixDQUFBO1FBQ0QscUJBQWdCLEdBQU87WUFDckIsTUFBTSxFQUFDLE9BQU87WUFDZCxLQUFLLEVBQUMsT0FBTztZQUNiLE1BQU0sRUFBQyxNQUFNO1lBQ2IsWUFBWSxFQUFDLEdBQUc7WUFDaEIsVUFBVSxFQUFDLGFBQWE7U0FDekIsQ0FBQTtRQUNELGlCQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUMzQyxvQkFBZSxHQUFhLEVBQzNCLENBQUE7UUFDRCxzQkFBaUIsR0FBVSxvQ0FBb0MsQ0FBQztRQUNoRSxvQkFBZSxHQUFVLGtDQUFrQyxDQUFDO1FBQzVELHNCQUFpQixHQUFVLHlCQUF5QixDQUFDO1FBQ3JELHVCQUFrQixHQUFVLHlCQUF5QixDQUFBO1FBQ3JELG9CQUFlLEdBQVUscUJBQXFCLENBQUE7UUFDOUMscUJBQWdCLEdBQTJCLEVBQUUsQ0FBQTtRQUM3Qyx3QkFBbUIsR0FBdUIsRUFBRSxDQUFBO1FBQzVDLG9CQUFlLEdBQXVCLEVBQUUsQ0FBQTtRQUN2QyxvQkFBZSxHQUFVLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBQzdELHNCQUFpQixHQUFVLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBQy9ELHlCQUFvQixHQUFXLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQzFELGtCQUFhLEdBQVUsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFDekQsb0JBQWUsR0FBVSxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUMzRCx1QkFBa0IsR0FBVSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDckQsdUJBQWtCLEdBQVUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRzdDLGFBQVEsR0FBbUIsUUFBUSxDQUFBO1FBQ25DLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLHlCQUFvQixHQUErQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUE7UUFDdkcsaUJBQVksR0FBVyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFBO1FBQzVELGFBQVEsR0FBUSxFQUN0QixDQUFBO1FBQ00sb0JBQWUsR0FBUSxFQUM3QixDQUFBO1FBQ0QsVUFBSyxHQUFtQixJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN2QyxrQkFBYSxHQUFHLFVBQVUsR0FBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pELG9CQUFlLEdBQUcsUUFBUSxHQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakQsbUJBQWMsR0FBRyxPQUFPLEdBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUvQyxXQUFNLEdBQWtCLE1BQU0sQ0FBQTtRQUNyQyxvQkFBZSxHQUFHLHVCQUF1QixDQUFDLGVBQWUsQ0FBQztRQUNuRCxzQkFBaUIsR0FBVyxDQUFDLENBQUM7UUFDckMsdUJBQWtCLEdBQVksSUFBSSxDQUFDO1FBQ25DLG9CQUFlLEdBQStCLEVBQUUsQ0FBQztRQUdqRCxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGdCQUFXLEdBQTRCLEVBQUUsQ0FBQztRQUMxQyxvQkFBZSxHQUFvQixDQUFDLENBQUM7UUFDckMsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixnQkFBVyxHQUFVLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwQyxlQUFVLEdBQVUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xDLGdCQUFXLEdBQVUsMENBQTBDLENBQUE7UUFxQnhELHNCQUFpQixHQUEwQixzQkFBc0IsQ0FBQyxJQUFJLENBQUE7UUFDN0Usc0JBQWlCLEdBQVcsS0FBSyxDQUFDO1FBQ2xDLHNCQUFpQixHQUFVLFNBQVMsQ0FBQyxLQUFLLENBQUE7UUFDMUMsaUJBQVksR0FBTztZQUNqQixNQUFNLEVBQUMsT0FBTztZQUNkLEtBQUssRUFBQyxPQUFPO1NBQ2QsQ0FBQTtRQUNELHFCQUFnQixHQUFjO1lBQzVCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLFlBQVksRUFBRSxLQUFLO1lBQ25CLFVBQVUsRUFBRSxhQUFhO1NBQzFCLENBQUE7UUFDRCx3QkFBbUIsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUE7UUFFakQsc0JBQWlCLEdBQVcsS0FBSyxDQUFDO1FBQ2xDLDhCQUF5QixHQUFXLEtBQUssQ0FBQztRQUMxQyxzQkFBaUIsR0FBVyxLQUFLLENBQUE7UUFDakMsZ0JBQVcsR0FBVyxLQUFLLENBQUM7UUFDNUIsb0JBQWUsR0FBVyxLQUFLLENBQUM7UUFDaEMsMEJBQXFCLEdBQVcsS0FBSyxDQUFDO1FBQ3RDLG1CQUFjLEdBQVcsS0FBSyxDQUFDO1FBQy9CLHFCQUFnQixHQUFXLEtBQUssQ0FBQTtRQUNoQyxtQkFBYyxHQUFXLEtBQUssQ0FBQTtRQUM5QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxrQkFBYSxHQUFXLEtBQUssQ0FBQztRQUM5QixxQkFBZ0IsR0FBb0IsRUFBRSxDQUFBO1FBQ3RDLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFvQ3ZCLGlCQUFZLEdBQVUsb0JBQW9CLENBQUE7UUFDMUMsbUJBQWMsR0FBVSx1QkFBdUIsQ0FBQTtRQUMvQyx1QkFBa0IsR0FBc0IsRUFBRSxDQUFBO1FBQ25DLG1CQUFjLEdBQWdDLElBQUksQ0FBQztRQUNuRCxVQUFLLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLFVBQUssR0FBYSxFQUFFLENBQUM7UUFDckIsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQTZEMUIsZ0JBQVcsR0FBRyxDQUFDLEtBQVMsRUFBQyxFQUFFO1lBQ3pCLElBQUksS0FBSyxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFBO1lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN4RCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXpCLENBQUMsQ0FBQTtRQVVELHlCQUFvQixHQUFHLENBQUMsSUFBbUIsRUFBRSxFQUFFO1lBRWhELE9BQU8sbUJBQW1CLENBQUMsYUFBYSxDQUFDLElBQUksRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDaEUsQ0FBQyxDQUFDO1FBcUxELHNCQUFpQixHQUFFLENBQUMsRUFBUyxFQUFDLEtBQVMsRUFBQyxFQUFFO1lBQ3hDLElBQUksT0FBTyxHQUFpQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ25FLElBQUcsT0FBTyxFQUFDO2dCQUNULElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFBO2dCQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUE7Z0JBQ3ZILElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUdyRDtRQUVILENBQUMsQ0FBQTtRQUVELGtCQUFhLEdBQUcsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBaUMsRUFBRSxFQUFFO2dCQUNqRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUE7WUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUE7UUFDRCxtQkFBYyxHQUFHLENBQUMsT0FBNkIsRUFBQyxFQUFFO1lBQ2hELElBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFDO2dCQUMzQixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2FBQzdEO1FBQ0gsQ0FBQyxDQUFBO1FBQ0QsbUJBQWMsR0FBRyxDQUFDLEVBQVMsRUFBQyxFQUFFO1lBQzVCLElBQUksYUFBYSxHQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNoQyxDQUFDLENBQUE7UUFDRCxtQkFBYyxHQUFFLENBQUMsRUFBUyxFQUFDLEVBQUU7WUFDL0IsSUFBSSxhQUFhLEdBQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQy9CLENBQUMsQ0FBQTtRQUNELGlCQUFZLEdBQUUsQ0FBQyxFQUFTLEVBQUMsRUFBRTtZQUN6QixJQUFJLGFBQWEsR0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFBO1FBQ0QsaUJBQVksR0FBRSxDQUFDLEVBQVMsRUFBQyxFQUFFO1lBQ3pCLElBQUksYUFBYSxHQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUE7UUFxQkQsNEJBQXVCLEdBQUcsQ0FBQyxXQUFnQixFQUFFLEVBQUU7WUFDN0MsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDO1lBQ3BDLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7WUFDMUUsSUFBSSxXQUFXLEdBQTRCLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEUsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FDcEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxlQUFlLENBQUMsS0FBSyxDQUMzQyxDQUFDO1lBQ0YsSUFBSSxJQUFTLENBQUM7WUFDZCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxVQUFVLEdBQTBCLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbEUsSUFBSyxVQUFvQyxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUN2RCxJQUFJLEdBQUksVUFBb0MsQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDNUQ7cUJBQ0k7b0JBQ0YsVUFBb0MsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7b0JBQ3JELElBQUksR0FBSSxVQUFvQyxDQUFDLFdBQVcsRUFBRSxDQUFBO2lCQUMzRDtnQkFDRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxjQUFjLENBQUM7Z0JBQ3RFLE1BQU0sYUFBYSxHQUFrRCxVQUFVLENBQUM7Z0JBQ2hGLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUE7UUFDRCxxQkFBZ0IsR0FBRyxDQUFDLEVBQVMsRUFBQyxFQUFFO1lBQzlCLElBQUksT0FBTyxHQUFpQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ25FLElBQUcsT0FBTyxFQUFDO2dCQUNULFNBQVMsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsbUJBQW1CLEVBQUUsMkJBQTJCLENBQUMsSUFBSSxFQUFFLDJCQUEyQixDQUFDLFlBQVksRUFBRTtvQkFDbkosT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ3hCLE1BQU0sRUFBRyxPQUFpQyxDQUFDLE9BQU8sRUFBRTtvQkFDcEQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxTQUFTO2lCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVSxFQUFFLEVBQUU7b0JBQ3JCLElBQUcsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsSUFBSyxPQUFpQyxFQUFFLE9BQU8sRUFBRSxFQUFDO3dCQUM5RixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7cUJBQzFCO3lCQUNHO3dCQUNGLE9BQU07cUJBQ1A7b0JBRUQseUJBQXlCO2dCQUMzQixDQUFDLENBQUM7cUJBQ0MsS0FBSyxDQUFDLENBQUMsS0FBUyxFQUFFLEVBQUU7Z0JBQ3JCLENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDSCxDQUFDLENBQUE7UUFxTEQsbUJBQWMsR0FBRyxDQUFDLE9BQThCLEVBQTJCLEVBQUU7WUFDM0UsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFO2dCQUNyRyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2FBQ3RFO2lCQUNJO2dCQUNILE9BQU8sT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO2FBQzNGO1FBQ0gsQ0FBQyxDQUFBO1FBcUJELHVCQUFrQixHQUFHLENBQUMsT0FBOEIsRUFBRSxFQUFFO1lBQ3RELElBQUksU0FBUyxHQUEwQixzQkFBc0IsQ0FBQyxNQUFNLENBQUE7WUFDcEUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRTtnQkFDL0MsU0FBUyxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQTthQUN4QztpQkFDSTtnQkFDSCxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUN4SCxTQUFTLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFBO2lCQUMxQztxQkFDSSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFO29CQUN2SyxTQUFTLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFBO2lCQUN6QztxQkFDSTtvQkFDSCxTQUFTLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFBO2lCQUN4QzthQUNGO1lBQ0QsT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQyxDQUFBO1FBNkJELHFCQUFnQixHQUFHLENBQUMsT0FBOEIsRUFBMkIsRUFBRTtZQUM3RSxJQUFJLElBQTZCLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUU7Z0JBQzNILElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDbkUsT0FBTyxJQUFJLENBQUE7YUFDWjtpQkFDSTtnQkFDSCxJQUFJLEdBQUcsSUFBSSxDQUFBO2dCQUNYLE9BQU8sSUFBSSxDQUFBO2FBQ1o7UUFDSCxDQUFDLENBQUE7UUFJRCx3QkFBbUIsR0FBRyxDQUFDLE9BQThCLEVBQUMsRUFBRTtZQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUNuRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pILElBQUssQ0FBQyxhQUFhLEVBQUU7Z0JBQ25CLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztvQkFDakMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7b0JBQ3hFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUN2RSxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtvQkFDN0QsWUFBWSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUNwRSxVQUFVLEVBQUMsYUFBYTtpQkFDekIsQ0FBQyxDQUFDO2FBQ0o7aUJBQ0U7Z0JBQ0osSUFBSSxpQkFBaUIsRUFBRTtvQkFDcEIsT0FBTyxJQUFJLHVCQUF1QixDQUFDO3dCQUNqQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQzt3QkFDeEUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7d0JBQ3RFLGFBQWEsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQzt3QkFDbEUsWUFBWSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO3dCQUNwRSxVQUFVLEVBQUMsYUFBYTtxQkFDekIsQ0FBQyxDQUFDO2lCQUNKO3FCQUNHO29CQUNGLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQzt3QkFDakMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7d0JBQ3hFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO3dCQUN2RSxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTt3QkFDN0QsWUFBWSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO3dCQUNwRSxVQUFVLEVBQUMsYUFBYTtxQkFDekIsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Q7UUFDRixDQUFDLENBQUE7UUE2QkQsdUJBQWtCLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEVBQUU7WUFDdEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssb0JBQW9CLENBQUMsSUFBSSxDQUFDO1lBQ25FLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3BLLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakgsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssdUJBQXVCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztZQUNyRyxJQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBZ0MsQ0FBQyxFQUFDO2dCQUN2RCxPQUFPO29CQUNMLFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztvQkFDOUQsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7aUJBQ3ZELENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyxTQUFTLElBQUksYUFBYSxJQUFJLGFBQWEsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckUsT0FBTztvQkFDTCxRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7b0JBQzlELFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztpQkFDakUsQ0FBQzthQUNIO1lBQ0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxhQUFhLElBQUksYUFBYSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDL0YsT0FBTztvQkFDTCxRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7b0JBQzlELFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO2lCQUN2RCxDQUFDO2FBQ0g7WUFDRCxJQUFJLG9CQUFvQixFQUFFO2dCQUN4QixPQUFPO29CQUNMLFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztvQkFDbEUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7aUJBQzFELENBQUM7YUFDSDtZQUVELE9BQU87Z0JBQ0wsUUFBUSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUM5RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTthQUMxRCxDQUFDO1FBQ0osQ0FBQyxDQUFBO1FBcUJELG9CQUFlLEdBQUUsQ0FBQyxTQUFnQixFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7WUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUU1QixDQUFDLENBQUE7UUFDRCwwQ0FBcUMsR0FBRSxDQUFDLEdBQVUsRUFBQyxFQUFFO1lBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQTtRQXlFTSxzQkFBaUIsR0FBVyxLQUFLLENBQUE7UUFDakMsdUJBQWtCLEdBQVcsS0FBSyxDQUFBO1FBQ2xDLG1CQUFjLEdBQVUsRUFBRSxDQUFDO1FBQ2xDLDBCQUFxQixHQUF5QjtZQUNoRCxNQUFNLEVBQUMsTUFBTTtZQUNiLEtBQUssRUFBQyxNQUFNO1lBQ1osYUFBYSxFQUFDLE1BQU07U0FDakIsQ0FBQTtRQWlCRCxtQkFBYyxHQUFHLEdBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUM1QixJQUFJLENBQUMsb0JBQW9CLEVBQUcsQ0FBQTthQUM3QjtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDMUIsQ0FBQyxDQUFBO1FBb0dELHdCQUFtQixHQUFHLEdBQUcsRUFBRTtZQUN6QixJQUFJLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQztnQkFDckMsU0FBUyxFQUFFLE1BQU07Z0JBQ2pCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxZQUFZLEVBQUUsR0FBRztnQkFDakIsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixRQUFRLEVBQUUsT0FBTztnQkFDakIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDaEUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTthQUNqRSxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ3ZFLENBQUMsQ0FBQTtRQStLRDs7O1NBR0M7UUFDRCwwQkFBcUIsR0FBRyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtpQkFDckc7cUJBQ0k7b0JBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs2QkFDcEYsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7NkJBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzZCQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDMUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7NkJBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUM7NkJBQ2pCLEtBQUssRUFBRSxDQUFBO3FCQUNYO3lCQUNJO3dCQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzs2QkFDdkYsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7NkJBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzZCQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDMUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7NkJBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUM7NkJBQ2pCLEtBQUssRUFBRSxDQUFBO3FCQUNYO2lCQUNGO2FBQ0Y7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FDdEMsQ0FBQyxXQUFvQyxFQUFFLEVBQUU7Z0JBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDNUIsb0JBQW9CO2dCQUNwQixJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMxQixPQUFNO2lCQUNQO2dCQUNELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN6QyxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtvQkFDckQsSUFBSSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsRUFBRTt3QkFDckcsK0JBQStCO3dCQUMvQixJQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBQzs0QkFDdEIsU0FBUyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFnQyxFQUFDLEVBQUU7Z0NBQzlFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMxSCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRTtvQ0FDakIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFBO2lDQUM1Qzs0QkFDSCxDQUFDLENBQUMsQ0FBQTt5QkFDRjtxQkFDSDtvQkFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFO3dCQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTs0QkFDeEIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFnQyxFQUFDLEVBQUU7Z0NBQ3pFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMxSCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRTtvQ0FDakIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFBO2lDQUN2Qzs0QkFDSCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFTLEVBQUMsRUFBRTtnQ0FDcEIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO29DQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7aUNBQ3BCOzRCQUNILENBQUMsQ0FBQyxDQUFBO3lCQUNIOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDOzRCQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7eUJBQ2pDO3FCQUNGO29CQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtvQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDaEMseUVBQXlFO29CQUN2RSxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztvQkFDbEUsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTOzRCQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsZ0JBQWdCLENBQUM7b0JBQ2xFLENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO29CQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO29CQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2lCQUNwQztxQkFDRztvQkFDRixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7aUJBQzNCO2dCQUNBLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUIsQ0FBQyxFQUNELENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMxQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7b0JBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ25CO2dCQUNjLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbEMsQ0FBQyxDQUNGLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQTtRQUNELHFCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7WUFDeEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtpQkFDekc7cUJBQ0k7b0JBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs2QkFDcEYsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7NkJBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzZCQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDOUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7NkJBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUM7NkJBQ2pCLEtBQUssRUFBRSxDQUFBO3FCQUNYO3lCQUNJO3dCQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzs2QkFDdkYsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7NkJBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzZCQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDOUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7NkJBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUM7NkJBQ2pCLEtBQUssRUFBRSxDQUFBO3FCQUNYO2lCQUNGO2dCQUNELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUNsQyxDQUFDLFdBQW9DLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUM1QixvQkFBb0I7b0JBQ3BCLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7d0JBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ2hDLE9BQU07cUJBQ1A7b0JBQ0QsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTt3QkFDckMsSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7d0JBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUU7NEJBQ2pHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dDQUN4QixTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzZCQUNuQztpQ0FBTTtnQ0FDTCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztnQ0FDZixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDOzZCQUNqQzt5QkFDRjt3QkFDRCxJQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxJQUFJLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFDOzRCQUNyRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUE7NEJBQ3hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO3lCQUNyRDt3QkFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7d0JBRXhCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO3dCQUNsRSxVQUFVLENBQUMsR0FBRyxFQUFFOzRCQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVM7Z0NBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQzt3QkFDbEUsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTt3QkFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztxQkFDakM7Z0JBQ0gsQ0FBQyxFQUNELENBQUMsS0FBVSxFQUFFLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUNsQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7d0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ25CO29CQUNnQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNsQyxDQUFDLENBQ0YsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNsQyxDQUFDLENBQUMsQ0FBQTthQUNIO1FBQ0gsQ0FBQyxDQUFBO1FBQ0QsbUJBQWMsR0FBRyxDQUFDLFFBQWlDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFBO1lBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDN0MsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7Z0JBQzlCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFBO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFBO1FBMk1EOzs7U0FHQztRQUNELHFEQUFxRDtRQUNyRCxJQUFJO1FBQ0o7O1dBRUc7UUFDSCwyQkFBc0IsR0FBRyxDQUFDLE9BQThCLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDN0ksU0FBUyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUNuQztRQUNILENBQUMsQ0FBQztRQXFFRjs7O1dBR0c7UUFDSCwyQkFBc0IsR0FBRyxDQUFDLE9BQThCLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFDeEUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3BCLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxQjtpQkFBTTtnQkFDTCxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtvQkFDOUIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7aUJBQ25DO2dCQUNELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNwQixJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRTt3QkFDcEMsVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDZCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7d0JBQ3ZCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztxQkFDVDt5QkFDSTt3QkFDSCxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUE7d0JBQ3hDLElBQUksSUFBSSxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLEVBQUU7NEJBQ3RFLFNBQVMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUE7eUJBQ3pDOzZCQUNJOzRCQUNILFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO3lCQUMvRjt3QkFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTt3QkFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQzt3QkFDekUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtxQkFDekI7aUJBQ0Y7YUFDRjtZQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQiwrREFBK0Q7WUFDL0QsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQy9FLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTthQUN6QjtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDckYsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUN4QixTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7NEJBQ3BDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUUsT0FBTyxDQUFDLENBQUE7d0JBQ3ZELENBQUMsQ0FBQyxDQUFDO3FCQUNKO3lCQUNJO3dCQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO3FCQUN6QjtvQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO2lCQUN6QjthQUNGO2lCQUFNO2FBQ047UUFDSCxDQUFDLENBQUM7UUFxQ0YsK0JBQTBCLEdBQUcsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQzthQUN2QjtZQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFBO1lBQzFCLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDcEQsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNwRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ2pELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQ2hDLENBQUMsQ0FBQztRQW9FRjs7O1dBR0c7UUFDSDs7O1dBR0c7UUFDSCxrQkFBYSxHQUFHLENBQUMsT0FBOEIsRUFBRSxFQUFFO1lBQ2pELElBQUk7Z0JBQ0YsSUFDRSxJQUFJLENBQUMsS0FBSztvQkFDVixPQUFPLENBQUMsZUFBZSxFQUFFLEtBQUssdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsS0FBSztvQkFDL0UsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQ2pEO29CQUNBLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbkM7cUJBQU0sSUFDTCxJQUFJLENBQUMsSUFBSTtvQkFDVCxPQUFPLENBQUMsZUFBZSxFQUFFLEtBQUssdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsSUFBSTtvQkFDOUUsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxPQUFPLENBQUMsYUFBYSxFQUFFO29CQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFDckQ7b0JBQ0EsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNuQztxQkFBTSxJQUNMLElBQUksQ0FBQyxJQUFJO29CQUNULE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO29CQUM5RSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUU7b0JBQzdELE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUMvQztvQkFDQSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ25DO2FBQ0Y7WUFBQyxPQUFPLEtBQVUsRUFBRTtnQkFDbkIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO29CQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNuQjthQUNJO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUMxQixDQUFDLENBQUM7UUFDRjs7O1dBR0c7UUFDSCx3QkFBbUIsR0FBRyxDQUFDLE9BQThCLEVBQUUsRUFBRTtZQUN2RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3RDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDN0UsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUc7b0JBQ2xCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDO29CQUNuQyxPQUFPO29CQUNQLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2lCQUNyQyxDQUFDO2FBQ0g7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQztRQWdFRjs7O1dBR0c7UUFDSCxpQ0FBNEIsR0FBRyxDQUFDLE9BQThCLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFDOUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3BCLHdDQUF3QztZQUN4QyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0wsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7b0JBQzlCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2lCQUNuQztnQkFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDcEIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUU7d0JBQ3BDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO3dCQUN2QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7cUJBQ1Q7eUJBQ0k7d0JBQ0gsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFBO3dCQUN4QyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLElBQUksRUFBRSxFQUFFOzRCQUN0RSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFBO3lCQUN6Qzs2QkFDSTs0QkFDSCxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQTt5QkFDL0Y7d0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7d0JBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7cUJBQ3pCO2lCQUNGO2FBQ0Y7WUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsK0RBQStEO1lBQy9ELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ2hGLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDcEIseUZBQXlGO2FBQzFGO2lCQUFNLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3pHLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRztvQkFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUc7d0JBQ3pCLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTs0QkFDcEMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBRSxPQUFPLENBQUMsQ0FBQTt3QkFDdkQsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7eUJBQ0k7d0JBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7cUJBQ3pCO2lCQUNGO2FBQ0Y7aUJBQU07YUFDTjtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDO1FBb0hGLGlCQUFpQjtRQUNqQixlQUFVLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEVBQUU7WUFDOUMsSUFBRyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUM7Z0JBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUMvQixJQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUM7b0JBQzVHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtvQkFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtpQkFDekI7YUFDRDtZQUVGLElBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFDO2dCQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7Z0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7YUFDMUI7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzFCLENBQUMsQ0FBQTtRQUNDOzs7U0FHQztRQUNBLGtCQUFhLEdBQUcsQ0FBQyxNQUE2QixFQUFFLEVBQUU7WUFDakQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDakQsQ0FBQyxDQUFBO1FBbUJDOzs7T0FHRDtRQUNILGtCQUFhLEdBQUcsQ0FBQyxNQUE2QixFQUFFLEVBQUU7WUFDaEQsc0JBQXNCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQ2hHLENBQUMsQ0FBQTtRQVNELGtCQUFhLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEVBQUU7WUFDakQsSUFBSTtnQkFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDeEYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDMUI7YUFDRjtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztvQkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkI7YUFDSTtRQUNILENBQUMsQ0FBQztRQUNGLGtCQUFhLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEVBQUU7WUFDakQsSUFBSTtnQkFDRixNQUFNLFNBQVMsR0FBUSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3ZDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO3FCQUMvQixJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtvQkFDckIsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO29CQUM5RCwyQkFBMkI7Z0JBQzdCLENBQUMsQ0FBQztxQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRTtvQkFDbkIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO3dCQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNuQjtnQkFDTyxDQUFDLENBQUMsQ0FBQzthQUNOO1lBQUMsT0FBTyxLQUFTLEVBQUU7Z0JBQ2pCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztvQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkI7YUFDSTtRQUNILENBQUMsQ0FBQTtRQUNELG1CQUFjLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLElBQUk7Z0JBQ0YsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7d0JBQ25DLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZO3dCQUMvQyxJQUFJLEVBQUUsQ0FBQztxQkFDUixDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNSO1lBQUMsT0FBTyxLQUFVLEVBQUU7Z0JBQ25CLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztvQkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkI7YUFDSTtRQUNILENBQUMsQ0FBQTtRQThGRCxvQkFBZSxHQUFFLEdBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQTtZQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDekIsQ0FBQyxDQUFBO1FBQ0YsY0FBUyxHQUFFLENBQUMsS0FBUyxFQUFDLEVBQUU7WUFDdEIsSUFBSSxLQUFLLEdBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUE7WUFDM0MsSUFBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUM7Z0JBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUMsSUFBSSxDQUFDLGlCQUFrQixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO2dCQUNoSixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7YUFDckI7UUFDQyxDQUFDLENBQUE7UUF3QkQ7O1FBRUE7UUFDQSxtQkFBYyxHQUFHLEdBQUcsRUFBRTtZQUNwQixPQUFPO2dCQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtnQkFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVO2FBQzdDLENBQUM7UUFDSixDQUFDLENBQUE7UUFDRCwwQkFBcUIsR0FBRyxHQUFHLEVBQUU7WUFDM0IsT0FBTztnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUs7YUFDbkMsQ0FBQztRQUNKLENBQUMsQ0FBQTtRQUNELGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDaEIsT0FBTztnQkFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQjtnQkFDbEQsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUI7YUFDckQsQ0FBQTtRQUNILENBQUMsQ0FBQTtRQUNELGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDaEIsT0FBTztnQkFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQjtnQkFDbEQsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUI7YUFDckQsQ0FBQTtRQUNILENBQUMsQ0FBQTtRQUNELGlCQUFZLEdBQUcsR0FBRyxFQUFFO1lBQ2xCLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlO2FBQ2hELENBQUE7UUFDSCxDQUFDLENBQUE7UUFDRCxpQkFBWSxHQUFHLEdBQUcsRUFBRTtZQUNsQixPQUFPO2dCQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtnQkFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLO2dCQUNsQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVU7Z0JBQzVDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtnQkFDcEMsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZO2FBQ2pELENBQUE7UUFDSCxDQUFDLENBQUE7SUExeUVELENBQUM7SUExQ0Qsa0JBQWtCLENBQUMsT0FBNkI7UUFDOUMsSUFBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUM7WUFDM0osT0FBTztnQkFDTCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsTUFBTTtnQkFDZCxZQUFZLEVBQUUsR0FBRztnQkFDakIsVUFBVSxFQUFFLGFBQWE7Z0JBQ3pCLE9BQU8sRUFBQyxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUM5RCxPQUFPLEVBQUUsTUFBTTtnQkFDZixRQUFRLEVBQUUsYUFBYTtnQkFDdkIsVUFBVSxFQUFFLFFBQVE7Z0JBQ3BCLGNBQWMsRUFBRSxlQUFlO2dCQUMvQixlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDbkUsQ0FBQTtTQUNGO2FBQ0c7WUFDRixPQUFPO2dCQUNMLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFlBQVksRUFBRSxHQUFHO2dCQUNqQixVQUFVLEVBQUUsYUFBYTtnQkFDekIsT0FBTyxFQUFDLE9BQU87Z0JBQ2YsY0FBYyxFQUFDLE1BQU07Z0JBQ3JCLE9BQU8sRUFBRSxNQUFNO2dCQUNmLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsY0FBYyxFQUFFLGVBQWU7Z0JBQy9CLGVBQWUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO2FBQzlELENBQUE7U0FDRjtJQUNDLENBQUM7SUFVTCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDM0IsSUFBSTtZQUNGLElBQUksT0FBTyxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0gsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7Z0JBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUE7Z0JBQzFCLElBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFDO29CQUNwQixTQUFTLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBMkIsRUFBRSxFQUFFO3dCQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQXNCLENBQUE7b0JBQzVDLENBQUMsQ0FBQyxDQUFBO2lCQUNIO2dCQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO2dCQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO3dCQUM3RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztxQkFDN0I7eUJBQ0k7d0JBQ0gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzZCQUN6QixJQUFJLENBQUMsQ0FBQyxJQUFvQixFQUFFLEVBQUU7NEJBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOzRCQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQzs0QkFDN0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxDQUFBO3FCQUNMO2lCQUNGO3FCQUNJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDbkIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7d0JBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFBO3dCQUM3RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtxQkFDNUI7eUJBQ0k7d0JBQ0gsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzZCQUMzQixJQUFJLENBQUMsQ0FBQyxLQUFzQixFQUFFLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOzRCQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQzs0QkFDOUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxDQUFBO3FCQUNMO2lCQUNGO2dCQUNELDBDQUEwQztnQkFDMUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDcEQsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDcEQsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLEdBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLEdBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLEdBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEQsbURBQW1EO2dCQUNuRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzthQUNqQztTQUNGO1FBQUMsT0FBTyxLQUFTLEVBQUU7WUFDbkIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO2dCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7YUFDbkI7U0FDRDtJQUNILENBQUM7SUFPRCxrQkFBa0IsQ0FBQyxPQUE2QjtRQUM5QyxJQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFDO1lBQ3BGLE9BQU8sUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUE7U0FDNUM7YUFDSTtZQUNILE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQTtTQUMvRTtJQUVILENBQUM7SUFLRCxlQUFlLENBQUMsS0FBWTtRQUMxQixJQUFJLFdBQVcsR0FBVyxLQUFLLENBQUE7UUFDL0IsSUFBSSxjQUFjLEdBQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksZ0JBQThDLENBQUM7UUFDbkQsSUFBSSxTQUFTLEdBQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBTyxFQUFFLENBQUM7UUFDMUIsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFDO1lBQ2hDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQ3ZEO1FBQ0QsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFDO1lBQzlCLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxHQUFHLEdBQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRztZQUNsQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNQLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVTthQUNsQjtTQUNGLENBQUM7UUFDRixNQUFNLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDLDZCQUE2QixDQUMvRSxJQUFJLENBQUMsY0FBd0MsRUFDN0MsV0FBVyxDQUNYLENBQUM7UUFDSixJQUFJLHNCQUFzQixFQUFFO1lBQzFCLElBQUksc0JBQXNCLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLGlGQUFpRjtnQkFDakYsSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDdEMsT0FBTyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckMsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDcEI7cUJBQU07b0JBQ0wsSUFBSSxJQUFJLEdBQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUM3RCxXQUFXLENBQ1osQ0FBQztvQkFDRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFBO29CQUM5QixjQUFjLEdBQUc7d0JBQ2hCLEdBQUcsSUFBSTtxQkFDUixDQUFDO2lCQUNEO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQzFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQzVCO2dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUN0RCxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUN6QztnQkFDRCxJQUNFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFDaEU7b0JBQ0EsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDdkQ7Z0JBQ0QsSUFDRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxjQUFjLENBQzlELFdBQVcsQ0FDWixFQUNEO29CQUNBLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ3BFO2dCQUNELElBQUksSUFBSSxHQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0UsY0FBYyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQzthQUM5QztTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDMUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0RCxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3pDO1lBQ0QsSUFDRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQ2hFO2dCQUNBLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDdkQ7WUFDRCxJQUNFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLGNBQWMsQ0FDOUQsV0FBVyxDQUNaLEVBQ0Q7Z0JBQ0EsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNwRTtZQUNELGNBQWMsR0FBRztnQkFDZixHQUFHLFdBQVc7YUFDZixDQUFDO1NBQ0g7UUFDRCxJQUFJLGNBQWtCLENBQUM7UUFDeEIsSUFBRyxXQUFXLEVBQUM7WUFDYixjQUFjLEdBQUc7Z0JBQ2hCLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQzthQUMzQixDQUFDO1NBQ0E7YUFDRztZQUNGLGNBQWMsR0FBRztnQkFDaEIsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDO2dCQUN4QixXQUFXLEVBQUU7b0JBQ1gsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxDQUFDO29CQUNyQyxVQUFVLEVBQUU7d0JBQ1YsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDO3dCQUNuRCxTQUFTLEVBQUU7NEJBQ1QsR0FBRyxjQUFjO3lCQUNsQjtxQkFDRjtpQkFDRjthQUNKLENBQUM7U0FDQTtRQUNBLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUF1QyxDQUFDO1FBQ2hFLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDcEMsSUFBSTtZQUNGLFNBQVMsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BHLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRTtnQkFDbkMsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFDO2lCQUNDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBR3hCLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFrQyxFQUFFLEVBQUU7Z0JBRWpELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDZixDQUFDLENBQUMsQ0FBQztTQUNOO1FBQUMsT0FBTyxLQUFTLEVBQUU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUVuQjtJQUNILENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDMUIsSUFBSTtZQUNGLDRCQUE0QjtZQUM1QixTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BELFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEQsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNuRDtRQUFDLE9BQU8sS0FBUyxFQUFFO1lBQ2pCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztnQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQjtTQUNJO0lBQ0gsQ0FBQztJQUNELGNBQWMsQ0FBQyxPQUE2QjtRQUMxQyxJQUFJLFFBQVEsR0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQTtRQUMzRyxJQUFJLGFBQWEsR0FBVyxJQUFJLENBQUMsU0FBUyxJQUFJLG9CQUFvQixDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksdUJBQXVCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQTtRQUVqSyxJQUFHLGFBQWEsRUFBQztZQUNiLE9BQU87Z0JBQ1QsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsWUFBWSxFQUFFLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xFLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUN6RCxlQUFlLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pFLGNBQWMsRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDdkUsbUJBQW1CLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDbEUsd0JBQXdCLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtnQkFDckUsa0JBQWtCLEVBQUMsYUFBYTtnQkFDaEMsY0FBYyxFQUFDLGFBQWEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUM1RSxvQkFBb0IsRUFBQyxNQUFNO2dCQUMzQix5QkFBeUIsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2FBRXpFLENBQUE7U0FDQTthQUNDO1lBQ0YsT0FBTztnQkFDTCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsTUFBTTtnQkFDZCxZQUFZLEVBQUUsR0FBRztnQkFDakIsVUFBVSxFQUFFLGFBQWE7Z0JBQ3pCLFFBQVEsRUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDbkUsU0FBUyxFQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2dCQUM3RCxlQUFlLEVBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtnQkFDOUQsY0FBYyxFQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO2dCQUN4RSxtQkFBbUIsRUFBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDdkUsd0JBQXdCLEVBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQzVFLGtCQUFrQixFQUFHLGFBQWE7Z0JBQ2xDLGNBQWMsRUFBQyxhQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDNUUsb0JBQW9CLEVBQUMsTUFBTTtnQkFDM0IseUJBQXlCLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7YUFDaEYsQ0FBQTtTQUNGO0lBQ0QsQ0FBQztJQXdDRCxjQUFjLENBQUMsRUFBUztRQUN0QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDMUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQ3hCLENBQUM7UUFDRixJQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBQztZQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7U0FDckM7YUFDSTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBQ0QsWUFBWSxDQUFDLE9BQTZCO1FBQ3hDLElBQUksdUJBQXVCLEdBQU8sT0FBTyxDQUFBO1FBQ3pDLElBQUksdUJBQXVCLElBQUksdUJBQXVCLEVBQUUsSUFBSSxFQUFFLFFBQVEsSUFBSSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLEVBQUU7WUFDakssT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDOUY7YUFDSTtZQUNELE9BQU8sSUFBSSxDQUFBO1NBQ2Q7SUFDSCxDQUFDO0lBK0NELGtCQUFrQixDQUFDLE9BQWdDO1FBQy9DLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUErQixFQUFFLEVBQUU7WUFFbkQsUUFBUSxPQUFPLENBQUMsRUFBRSxFQUFFO2dCQUNsQixLQUFLLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxhQUFhO29CQUN0RCxJQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBQzt3QkFDbEIsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO3FCQUN0QztvQkFDRCxNQUFNO2dCQUNSLEtBQUssdUJBQXVCLENBQUMsYUFBYSxDQUFDLFdBQVc7b0JBQ3BELElBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFDO3dCQUNsQixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7cUJBQ3BDO29CQUNELE1BQU07Z0JBQ1IsS0FBSyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCO29CQUN6RCxJQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBQzt3QkFDbEIsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7cUJBQ3hDO29CQUNELE1BQU07Z0JBQ1IsS0FBSyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsV0FBVztvQkFDcEQsSUFBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUM7d0JBQ2xCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtxQkFDcEM7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxjQUFjO29CQUN2RCxJQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBQzt3QkFDbEIsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7cUJBQ3pDO29CQUNELE1BQU07Z0JBQ04sS0FBSyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsYUFBYTtvQkFDdEQsSUFBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUM7d0JBQ2xCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQTtxQkFDdEM7b0JBQ0QsTUFBTTtnQkFDVjtvQkFDRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFDQzs7O0tBR0M7SUFDQSxpQkFBaUIsQ0FBQyxTQUFnQztRQUNqRCxJQUFJLE9BQWlDLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsSUFBSyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksdUJBQXVCLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRTtZQUV0SyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQWlDLEVBQUUsRUFBRTtnQkFDakUsSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksT0FBTyxFQUFFLE9BQU8sRUFBRTtvQkFDbkYsT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUMsU0FBUyxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtpQkFDekg7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQ0c7WUFDRixPQUFPLEdBQUcsRUFBRSxDQUFBO1NBQ2I7UUFDRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQ0g7OztTQUdLO0lBQ0wscUJBQXFCLENBQUMsR0FBMEI7UUFFOUMsSUFBSSxLQUFpQixDQUFDO1FBQ3RCLElBQUksR0FBRyxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQ3ZCLEtBQUssR0FBRztnQkFDTixVQUFVLEVBQUUsYUFBYTtnQkFDekIsTUFBTSxFQUFFLGNBQWMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUN0RSxZQUFZLEVBQUUsTUFBTTthQUNyQixDQUFBO1NBQ0Y7YUFDSSxJQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBQztZQUNqSixLQUFLLEdBQUc7Z0JBQ04sVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3hELE1BQU0sRUFBRSxNQUFNO2dCQUNkLFlBQVksRUFBRSxNQUFNO2FBQ3JCLENBQUE7U0FFRjthQUNJLElBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUE0QixDQUFDLEVBQUM7WUFDeEQsS0FBSyxHQUFHO2dCQUNOLFlBQVksRUFBRSxLQUFLO2dCQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTthQUMzRCxDQUFBO1NBQ0Y7YUFDSSxJQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUM7WUFDbEQsS0FBSyxHQUFHO2dCQUNKLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixZQUFZLEVBQUUsTUFBTTthQUN2QixDQUFBO1NBQ0Y7YUFDSSxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUN4UCxLQUFLLEdBQUc7Z0JBQ04sVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3ZKLFlBQVksRUFBRSxNQUFNO2FBQ3JCLENBQUE7U0FDRjthQUNJLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxPQUFPLElBQUksR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDdEssS0FBSyxHQUFHO2dCQUNOLFlBQVksRUFBRSxFQUFFO2dCQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTthQUMzRCxDQUFBO1NBQ0Y7YUFDSSxJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RILEtBQUssR0FBRztnQkFDTixVQUFVLEVBQUUsYUFBYTtnQkFDekIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLE1BQU0sRUFBRSxhQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRTthQUN0RSxDQUFBO1NBQ0Y7YUFDSTtZQUNKLElBQUcsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFDO2dCQUM5RSxLQUFLLEdBQUc7b0JBQ04sVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7b0JBQzFELFlBQVksRUFBRSxNQUFNO2lCQUNyQixDQUFBO2FBQ0Q7aUJBQ0c7Z0JBQ0gsS0FBSyxHQUFHO29CQUNOLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO29CQUMxRCxZQUFZLEVBQUUsTUFBTTtpQkFDckIsQ0FBQTthQUNEO1NBQ0Q7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxZQUFZLENBQUMsT0FBK0I7UUFDMUMsSUFBSSxJQUFJLEdBQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2hDLE9BQU8sSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUE7SUFDcEMsQ0FBQztJQUNELHFCQUFxQixDQUFDLE9BQStCO1FBQ25ELElBQUk7WUFDRixJQUFLLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLEdBQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUU7b0JBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksRUFBRSxRQUFRLENBQUM7b0JBQ2hDLElBQUkscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUNuRSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQzdDLElBQUksY0FBYyxFQUFFLFVBQVUsRUFBRTs0QkFDOUIsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQzs0QkFDbEQsT0FBTyxlQUFlLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFFLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUM7eUJBQ3ROO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUFDLE9BQU8sS0FBUyxFQUFFO1lBQ2xCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztnQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQ3BCO1NBQ0Y7SUFDSCxDQUFDO0lBQ0QsV0FBVyxDQUFDLEtBQVM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBQ0QsVUFBVSxDQUFDLE9BQStCO1FBQ3hDLElBQUk7WUFDRixJQUFJLFdBQVcsR0FBTyxJQUFJLENBQUM7WUFDM0IsSUFDRSxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO2dCQUMxRSxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBRyxPQUFtQyxDQUFDLE9BQU8sRUFBRSxFQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUN2SDtnQkFDQSxXQUFXLEdBQUksT0FBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQy9DLElBQUkscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUN4RixPQUFPLFdBQVcsQ0FBQyxXQUFXLENBQUM7aUJBQ2hDO3FCQUNHO29CQUNGLE9BQU8sRUFBRSxDQUFBO2lCQUNWO2FBQ0Y7aUJBQ0c7Z0JBQ0YsT0FBTyxFQUFFLENBQUE7YUFDVjtTQUNGO1FBQUMsT0FBTyxLQUFTLEVBQUU7WUFDakIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO2dCQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7YUFDcEI7U0FDSDtJQUNILENBQUM7SUFTRCxhQUFhLENBQUMsT0FBOEI7UUFDMUMsSUFBSSxJQUFJLEdBQTRCLElBQUksQ0FBQTtRQUN4QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUU7WUFDcEcsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BFLE9BQU8sSUFBSSxDQUFBO1NBQ1o7YUFDSTtZQUNILE9BQU8sSUFBSSxDQUFBO1NBQ1o7SUFDSCxDQUFDO0lBQ0QsYUFBYSxDQUFDLE9BQThCO1FBQzFDLElBQUksSUFBSSxHQUE0QixJQUFJLENBQUE7UUFDeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFO1lBQ3BHLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwRSxPQUFPLElBQUksQ0FBQztTQUNiO2FBQ0k7WUFDSCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQW1CRCxrQkFBa0IsQ0FBQyxPQUE2QjtRQUM5QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQztRQUNsRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pILElBQUcsaUJBQWlCLElBQUssQ0FBQyxhQUFhLEVBQUM7WUFDdEMsT0FBTztnQkFDTCxTQUFTLEVBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hFLFVBQVUsRUFBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDOUQsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2dCQUMzRCxjQUFjLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BFLGVBQWUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO2dCQUM3RCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDbkUsS0FBSyxFQUFDLE9BQU87YUFDZCxDQUFBO1NBRUY7YUFDRztZQUNGLE9BQU87Z0JBQ0wsU0FBUyxFQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUNoRSxVQUFVLEVBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDeEQsUUFBUSxFQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3ZELGNBQWMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDcEUsZUFBZSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQzdELGdCQUFnQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2dCQUNuRSxLQUFLLEVBQUMsT0FBTzthQUNkLENBQUE7U0FDRjtJQUVILENBQUM7SUFZRCxrQkFBa0IsQ0FBQyxPQUE2QjtRQUM5QyxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksb0JBQW9CLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFBO0lBQ3hNLENBQUM7SUFrQ0QsZUFBZSxDQUFDLE9BQTZCO1FBQzNDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDbkUsT0FBTyx1QkFBdUIsQ0FBQTtTQUMvQjthQUNJO1lBQ0gsT0FBTyx1QkFBdUIsQ0FBQTtTQUMvQjtJQUNILENBQUM7SUFDRCxlQUFlLENBQUMsT0FBOEI7UUFDNUMsSUFBRyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBQztZQUM1QyxPQUFPO2dCQUNMLGNBQWMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDeEUsZUFBZSxFQUFFLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxPQUF5QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUM5TCxZQUFZLEVBQUUsTUFBTTtnQkFDcEIsTUFBTSxFQUFFLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxPQUF5QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUMzTCxjQUFjLEVBQUUsbUJBQW1CLENBQUMsWUFBWSxDQUFDLE9BQXlCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7Z0JBQzVMLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixjQUFjLEVBQUMsYUFBYTtnQkFDNUIsT0FBTyxFQUFDLGdCQUFnQjtnQkFDeEIsR0FBRyxFQUFDLEdBQUc7Z0JBQ1AsTUFBTSxFQUFDLE1BQU07Z0JBQ2IsY0FBYyxFQUFDLFFBQVE7YUFDeEIsQ0FBQztTQUNIO2FBQ0c7WUFDRixPQUFPLElBQUksQ0FBQTtTQUNaO0lBQ0gsQ0FBQztJQXFDRCxrQkFBa0IsQ0FBQyxPQUE2QjtRQUM5QyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssdUJBQXVCLENBQUMsZUFBZSxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssdUJBQXVCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUN4SyxJQUFHLGFBQWEsRUFBQztZQUNmLE9BQU87Z0JBQ0wsU0FBUyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3RELFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO2dCQUN2RCxZQUFZLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDekQsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7Z0JBQzdELFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO2FBQ3ZELENBQUM7U0FDSDthQUNHO1lBQ0YsT0FBTTtTQUNQO0lBQ0MsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7SUFDN0IsQ0FBQztJQVlDOzs7S0FHQztJQUdILG9CQUFvQjtRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVztZQUN2QixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDNUIsaUJBQWlCLEVBQUMsSUFBSSxDQUFDLGFBQWE7WUFDcEMsb0JBQW9CLEVBQUMsSUFBSSxDQUFDLGdCQUFnQjtZQUMxQyxrQkFBa0IsRUFBQyxJQUFJLENBQUMsY0FBYztZQUN0QyxjQUFjLEVBQUMsSUFBSSxDQUFDLFVBQVU7WUFDOUIsT0FBTyxFQUFDLElBQUksQ0FBQyxhQUFhO1NBRTNCLENBQUE7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDdEIsQ0FBQztJQUNELGlCQUFpQixDQUFDLE9BQStCLEVBQUUsSUFBWTtRQUM5RCxJQUFJLElBQUksR0FBUSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDdEMsSUFBRyxJQUFJLEVBQUM7WUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUNqQjthQUNHO1lBQ0YsT0FBTyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUE7U0FDcEM7SUFDSCxDQUFDO0lBQ0QsY0FBYyxDQUFDLE9BQTZCO1FBQzFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxNQUFNLEdBQUcsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLElBQUksTUFBTSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUNELHFCQUFxQjtRQUNuQixJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtTQUM5QjtRQUNELElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUE7U0FDdEM7UUFDRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtTQUM5QjtRQUNELElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtTQUN4QjtRQUNELElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtTQUM1QjtRQUNELElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3RELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUE7U0FDbEM7UUFDRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7U0FDM0I7UUFDRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRTtZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFBO1NBQzdCO1FBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUU7WUFDNUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7U0FDM0I7UUFDRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7U0FDMUI7SUFDSCxDQUFDO0lBVUQscUJBQXFCLENBQUMsT0FBVztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQTtRQUN4RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUNELHNCQUFzQjtRQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQTtRQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUNELGlCQUFpQixDQUFDLEtBQVM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFBO1FBQ3BELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUV0QixDQUFDO0lBUUQsYUFBYTtRQUNYLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBQ0QsY0FBYyxDQUFDLE9BQThCO1FBQzNDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM3RixPQUFPLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsY0FBYyxDQUFDLE9BQTZCO1FBQzFDLElBQUk7WUFDRixJQUFJLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3BELE1BQU0sUUFBUSxHQUFPLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLGNBQWMsSUFBSSxjQUFjLEVBQUUsVUFBVSxFQUFFO29CQUNoRCxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7b0JBQ25ELElBQ0UsZ0JBQWdCO3dCQUNoQixxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFDN0Y7d0JBQ0EsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDOUUsSUFDRSxpQkFBaUI7NEJBQ2pCLHFCQUFxQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLEtBQUssQ0FBQzs0QkFDeEYsaUJBQWlCLENBQUUsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUNyRDs0QkFDQSxPQUFPLGlCQUFpQixDQUFFLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO3lCQUN6RDs2QkFDRzs0QkFDRixPQUFPLElBQUksQ0FBQTt5QkFDWjtxQkFDRjt5QkFDRzt3QkFDRixPQUFPLElBQUksQ0FBQTtxQkFDWjtpQkFDRjthQUNGO2lCQUNHO2dCQUNGLE9BQU8sSUFBSSxDQUFBO2FBQ1o7U0FDRjtRQUFDLE9BQU8sS0FBUyxFQUFFO1lBQ2pCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztnQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQ3BCO1NBQ0g7SUFDSCxDQUFDO0lBQ0EsaUJBQWlCLENBQUMsR0FBMkI7UUFDNUMsTUFBTSxPQUFPLEdBQU8sR0FBNkIsQ0FBQztRQUNsRCxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDbEMsSUFBSTtnQkFDRixNQUFNLFFBQVEsR0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sY0FBYyxHQUFHLFFBQVEsRUFBRSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBeUIsQ0FBQztnQkFDakcsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLEVBQUUsVUFBVSxDQUFDO2dCQUNwRCxNQUFNLHlCQUF5QixHQUFHLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3RHLE1BQU0sZUFBZSxHQUFHLHlCQUF5QixFQUFFLFNBQVMsQ0FBQztnQkFDN0QsSUFBSSxlQUFlLEVBQUU7b0JBQ25CLFFBQVEsR0FBRyxlQUFlLENBQUE7aUJBQzNCO3FCQUFNO29CQUNMLFFBQVEsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ2pGO2FBQ0Y7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3JCO2FBQ0Y7U0FDRjthQUFNO1lBQ0wsUUFBUSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxxQkFBcUIsQ0FBQyxHQUFVLEVBQUMsT0FBNkI7UUFDNUQsSUFBSSxpQkFBaUIsR0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3hELElBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDM0MsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUM5QjthQUNHO1lBQ0YsT0FBTyxFQUFFLENBQUE7U0FDVjtJQUNILENBQUM7SUFFRCxRQUFRO1FBRU4sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNuQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFBO1FBQzNCLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUEyQixFQUFFLEVBQUU7WUFDL0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFzQixDQUFBO1FBQzVDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQWtDLEVBQUMsRUFBRTtZQUM3QyxJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUNwQjtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsR0FBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxJQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUM1SCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDL0UsQ0FBQztJQWVELGNBQWM7UUFDWixJQUFJLFlBQVksR0FBZSxJQUFJLFdBQVcsQ0FBQztZQUM3QyxZQUFZLEVBQUUsTUFBTTtZQUNwQixLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLE1BQU07WUFDZCxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUMvRCxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUM3RCxjQUFjLEVBQUUsT0FBTztZQUN2QixZQUFZLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDdEUsZUFBZSxFQUFFLEVBQUU7WUFDbkIsc0JBQXNCLEVBQUUsRUFBRTtTQUMzQixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUMsR0FBRyxZQUFZLEVBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUE7SUFDMUQsQ0FBQztJQUNILFlBQVk7UUFDWCxJQUFJLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUNoQyxRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDbEUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDekQsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDMUQsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxhQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNyRSxZQUFZLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBQyxHQUFHLFlBQVksRUFBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBQyxDQUFBO0lBQ3hFLENBQUM7SUFDQyxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLGFBQWEsRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNyRSxjQUFjLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUMxRCxlQUFlLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUMvRCxTQUFTLEVBQUMsZUFBZSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDekUsYUFBYSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDNUQsVUFBVSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDMUQsR0FBRyxJQUFJLENBQUMsZUFBZTtTQUN4QixDQUFBO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDdkYsSUFBSSxZQUFZLEdBQW9CLElBQUksZ0JBQWdCLENBQUM7WUFDdkQsVUFBVSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDMUQsTUFBTSxFQUFDLE1BQU07WUFDYixrQkFBa0IsRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUN4RSxtQkFBbUIsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ2xFLGtCQUFrQixFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ3hFLG1CQUFtQixFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDbEUsZUFBZSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDOUQsWUFBWSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ25FLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzdELHlCQUF5QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDekUsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDN0UsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUNuRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3BFLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7U0FDbkUsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUMsR0FBRyxZQUFZLEVBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUMsQ0FBQTtRQUNsRSxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUNyRyxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQzdHLENBQUE7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUssSUFBSSxnQkFBZ0IsQ0FBQztZQUM3QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN2RCxTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDaEUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUNoRSxlQUFlLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDekUsVUFBVSxFQUFFLGFBQWE7WUFDekIsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsTUFBTTtTQUNkLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN6QixTQUFTLEVBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDaEUsVUFBVSxFQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDeEQsWUFBWSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ3RFLGFBQWEsRUFBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzlELFFBQVEsRUFBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3pELGNBQWMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNwRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUM3RCxnQkFBZ0IsRUFBRSxhQUFhO1lBQy9CLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1NBQy9ELENBQUE7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQzdFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDcEUsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDOUUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNsRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUN4RSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ2hFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDcEUsZUFBZSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDL0Qsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDaEYsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN2RSw0QkFBNEIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzVFLDRCQUE0QixFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDekUsZ0JBQWdCLEVBQUMsYUFBYSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDOUUsc0JBQXNCLEVBQUMsS0FBSztTQUM3QixDQUFBO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHO1lBQzFCLFdBQVcsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3hELE1BQU0sRUFBQyxNQUFNO1lBQ2IsS0FBSyxFQUFDLE1BQU07WUFDWixNQUFNLEVBQUMsTUFBTTtZQUNiLGdCQUFnQixFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ2xFLGVBQWUsRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztTQUN0RSxDQUFBO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3hCLHVCQUF1QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDbkUsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN0RSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUM3RSxxQkFBcUIsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUMzRSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUMzRSxvQkFBb0IsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUMxRSxTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDaEUsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDdkQsZUFBZSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ3pFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDaEUsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDM0QsTUFBTSxFQUFDLE1BQU07WUFDYixLQUFLLEVBQUMsTUFBTTtZQUNaLE1BQU0sRUFBQyxhQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNwRSxZQUFZLEVBQUMsS0FBSztTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDO1lBQ3pDLFlBQVksRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzNELFlBQVksRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzNELGlCQUFpQixFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDaEUsWUFBWSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDekQsYUFBYSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7U0FDbkQsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFBO0lBQzVDLENBQUM7SUFDRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtZQUNoRixJQUFJLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDLHVCQUF1QixFQUFFLENBQUE7WUFDNUUsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1NBQ25FO2FBQ0k7WUFFSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7U0FDdEM7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUE7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7UUFDMUIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDaEMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLENBQUMsc0JBQXNCLEVBQUU7eUJBQ3pELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO3lCQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzt5QkFDcEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7eUJBQ3BCLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO3lCQUM5QixXQUFXLENBQUMsSUFBSSxDQUFDO3lCQUNqQixLQUFLLEVBQUUsQ0FBQTtpQkFDWDtxQkFDSTtvQkFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksU0FBUyxDQUFDLHNCQUFzQixFQUFFO3lCQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt5QkFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7eUJBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO3lCQUNwQixXQUFXLENBQUMsSUFBSSxDQUFDO3lCQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzt5QkFDOUIsS0FBSyxFQUFFLENBQUE7aUJBQ1g7YUFDRjtpQkFDSTtnQkFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQTthQUMxRDtZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQTBMRCx3QkFBd0I7UUFDdEIsSUFBSTtZQUNGLFNBQVMsQ0FBQyxrQkFBa0IsQ0FDMUIsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxTQUFTLENBQUMsZUFBZSxDQUFDO2dCQUM1QixxQkFBcUIsRUFBRSxDQUFDLFdBQWtDLEVBQUUsRUFBRTtvQkFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzFGLENBQUM7Z0JBQ0QsdUJBQXVCLEVBQUUsQ0FBQyxhQUFzQyxFQUFFLEVBQUU7b0JBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUM5RixDQUFDO2dCQUNELHNCQUFzQixFQUFFLENBQUMsWUFBb0MsRUFBRSxFQUFFO29CQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDNUYsQ0FBQztnQkFDRCxtQkFBbUIsRUFBRSxDQUFDLGNBQXdDLEVBQUUsRUFBRTtvQkFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ3pGLENBQUM7Z0JBQ0QsY0FBYyxFQUFFLENBQUMsY0FBd0MsRUFBRSxFQUFFO29CQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ3BGLENBQUM7Z0JBQ0QsZ0JBQWdCLEVBQUUsQ0FBQyxjQUFxQyxFQUFFLEVBQUU7b0JBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDdkYsQ0FBQztnQkFDRCxlQUFlLEVBQUUsQ0FBQyxhQUFvQyxFQUFFLEVBQUU7b0JBQ3hELElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDckYsQ0FBQztnQkFDRCwwQkFBMEIsRUFBRSxDQUFDLGdCQUE0QyxFQUFFLEVBQUU7b0JBQzNFLElBQUksWUFBWSxHQUFRLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuRCxJQUFJLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRTt3QkFDMU8sc0JBQXNCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTt3QkFDekUsT0FBTztxQkFDUjt5QkFDSSxJQUFJLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRTt3QkFDblAsc0JBQXNCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTt3QkFDekUsT0FBTztxQkFDUjtnQkFDSCxDQUFDO2FBQ0YsQ0FBQyxDQUNILENBQUM7WUFDRixTQUFTLENBQUMsZ0JBQWdCLENBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDMUIseUJBQXlCLEVBQUUsQ0FDekIsT0FBeUIsRUFDekIsV0FBMkIsRUFDM0IsUUFBb0MsRUFDcEMsUUFBb0MsRUFDcEMsWUFBOEIsRUFDOUIsRUFBRTtvQkFDRixJQUFJLENBQUMsYUFBYSxDQUNoQix1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQ3RELE9BQU8sRUFDUCxZQUFZLEVBQ1osRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FDdkMsQ0FBQztnQkFDSixDQUFDO2dCQUNELG1CQUFtQixFQUFFLENBQUMsT0FBeUIsRUFBRSxVQUEwQixFQUFFLFFBQXdCLEVBQUUsVUFBNEIsRUFBRSxFQUFFO29CQUNySSxJQUFJLENBQUMsYUFBYSxDQUNoQix1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQ2hELE9BQU8sRUFDUCxVQUFVLEVBQ1Y7d0JBQ0UsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLFNBQVMsRUFBRSxLQUFLO3FCQUNqQixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxtQkFBbUIsRUFBRSxDQUFDLE9BQXlCLEVBQUUsVUFBMEIsRUFBRSxRQUF3QixFQUFFLFVBQTRCLEVBQUUsRUFBRTtvQkFDckksSUFBSSxDQUFDLGFBQWEsQ0FDaEIsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUNoRCxPQUFPLEVBQ1AsVUFBVSxFQUNWO3dCQUNFLElBQUksRUFBRSxVQUFVO3FCQUNqQixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxxQkFBcUIsRUFBRSxDQUNyQixPQUF5QixFQUN6QixZQUE0QixFQUM1QixVQUEwQixFQUMxQixZQUE4QixFQUM5QixFQUFFO29CQUNGLElBQUksQ0FBQyxhQUFhLENBQ2hCLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFDbEQsT0FBTyxFQUNQLFlBQVksRUFDWixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FDdkIsQ0FBQztnQkFDSixDQUFDO2dCQUNELG9CQUFvQixFQUFFLENBQ3BCLE9BQXlCLEVBQ3pCLFNBQXlCLEVBQ3pCLFdBQTJCLEVBQzNCLFdBQTZCLEVBQzdCLEVBQUU7b0JBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUMvQyxPQUFPLEVBQ1AsV0FBVyxFQUNYO3dCQUNFLElBQUksRUFBRSxTQUFTO3dCQUNmLFNBQVMsRUFBRSxJQUFJO3FCQUNoQixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxpQkFBaUIsRUFBRSxDQUFDLE9BQThCLEVBQUUsV0FBa0MsRUFBRSxLQUFzQixFQUFFLEVBQUU7b0JBQ2hILElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7d0JBQ2pGLElBQUksRUFBRSxXQUFXO3FCQUNsQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxtQkFBbUIsRUFBRSxDQUFDLE9BQThCLEVBQUUsVUFBaUMsRUFBRSxXQUE0QixFQUFFLEVBQUU7b0JBQ3ZILElBQUksQ0FBQyxhQUFhLENBQ2hCLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFDaEQsT0FBTyxFQUNQLFdBQVcsRUFDWDt3QkFDRSxJQUFJLEVBQUUsVUFBVTtxQkFDakIsQ0FDRixDQUFDO2dCQUNKLENBQUM7YUFDRixDQUFDLENBQ0gsQ0FBQztZQUNGLElBQUcsSUFBSSxDQUFDLGFBQWEsRUFBQztnQkFDcEIsU0FBUyxDQUFDLGVBQWUsQ0FDdkIsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDO29CQUN6QixzQkFBc0IsRUFBRSxDQUFDLElBQW9CLEVBQUUsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDdkIsQ0FBQztvQkFDRCx1QkFBdUIsRUFBRSxDQUFDLElBQW9CLEVBQUUsRUFBRTt3QkFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDdkIsQ0FBQztvQkFDRCxzQkFBc0IsRUFBRSxDQUFDLElBQW9CLEVBQUUsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFFdkIsQ0FBQztvQkFDRCxzQkFBc0IsRUFBRSxDQUFDLElBQW9CLEVBQUUsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDdkIsQ0FBQztpQkFFRixDQUFDLENBQ0gsQ0FBQzthQUNIO1NBRUY7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkI7U0FDSTtJQUNILENBQUM7SUFDRDs7O0lBR0E7SUFDQTs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsTUFBcUIsSUFBSSxFQUFFLFVBQWtFLElBQUksRUFBRSxRQUFnQyxJQUFJLEVBQUUsVUFBZSxJQUFJO1FBQ3hLLElBQUk7WUFDRixRQUFRLEdBQUcsRUFBRTtnQkFDWCxLQUFLLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDNUQsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsc0JBQXNCO29CQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM5QixNQUFNO2dCQUNSLEtBQUssdUJBQXVCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN4RCxLQUFLLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxZQUFZO29CQUNoRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3RDLE1BQU07Z0JBQ1IsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2dCQUN0RCxLQUFLLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDNUIsTUFBTTtpQkFDUDtnQkFDRCxLQUFLLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQztnQkFDNUQsS0FBSyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RELEtBQUssdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO2dCQUNwRCxLQUFLLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztnQkFDckQsS0FBSyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RELEtBQUssdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO2dCQUN0RCxLQUFLLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUN4QixNQUFNO2lCQUNQO2dCQUNELEtBQUssdUJBQXVCLENBQUMsUUFBUSxDQUFDLHVCQUF1QjtvQkFDekQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN0QyxNQUFNO2dCQUNSO29CQUNFLE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7U0FDekI7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkI7U0FDSTtJQUNILENBQUM7SUFnQkQ7OztPQUdHO0lBQ0g7O09BRUc7SUFDSCxlQUFlLENBQUMsT0FBOEI7UUFDNUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BDLElBQUk7WUFDRixJQUNFLElBQUksQ0FBQyxLQUFLO2dCQUNWLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO2dCQUMvRSxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFDakQ7Z0JBQ0EsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN6RjtpQkFBTSxJQUNMLElBQUksQ0FBQyxJQUFJO2dCQUNULE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO2dCQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFDckQ7Z0JBQ0EsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLElBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ3hMLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUN4QixTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7NEJBQ3BDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUUsT0FBTyxDQUFDLENBQUE7d0JBQ3ZELENBQUMsQ0FBQyxDQUFDO3FCQUNKO3lCQUNJO3dCQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO3FCQUN6QjtvQkFDRCxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLE9BQU8sQ0FBQyxDQUFBO2lCQUNwRDtnQkFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hGO1NBQ0Y7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkI7U0FDSTtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7S0FHQztJQUNELGdCQUFnQixDQUFDLFFBQStCO1FBQzlDLElBQUk7WUFDRixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUM7WUFDakMsSUFBSSxXQUFXLEdBQTRCLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEUsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FDcEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxlQUFlLENBQUMsa0JBQWtCLEVBQUUsQ0FDMUQsQ0FBQztZQUNGLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNuQixNQUFNLFVBQVUsR0FBMEIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxVQUFVLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDNUIsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMxQjtTQUNGO1FBQUMsT0FBTyxLQUFVLEVBQUU7WUFDbkIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO2dCQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ25CO1NBQ0k7SUFDSCxDQUFDO0lBeURELFNBQVM7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUMvQixxQkFBcUIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTthQUNyRztpQkFDSTtnQkFDSCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFBO2FBQ3hFO1NBQ0Y7SUFDSCxDQUFDO0lBQ0QsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxHQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLEdBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sR0FBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDNUQ7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDOUI7WUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtTQUNsRDthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO2FBQ3JCO2lCQUNJO2dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzlCO1NBQ0Y7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFXRCxpQkFBaUIsQ0FBQyxPQUE4QjtRQUM5QyxJQUFJLE9BQU8sR0FBSyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM3RCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQ0QsdUJBQXVCLENBQUMsT0FBaUM7UUFDdkQsSUFBSTtZQUNGLElBQ0UsT0FBTyxDQUFDLGVBQWUsRUFBRSxJQUFJLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLElBQUk7Z0JBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtnQkFDcEQsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQ3BEO2dCQUNBLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7b0JBQ3pFLG9CQUFvQjtvQkFDcEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQzFDLENBQUMsQ0FBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FDMUUsQ0FBQztvQkFDRixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUE7d0JBQ3RFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7cUJBQzFCO29CQUNELDRCQUE0QjtvQkFDNUIsSUFBSSxDQUFDLHdCQUF3QixDQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUM1QztxQkFBTSxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO29CQUM1RSxvQkFBb0I7b0JBQ3BCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUMxQyxDQUFDLENBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQzFFLENBQUM7b0JBQ0YsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO3dCQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO3FCQUMxQjtvQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsbUJBQW1CLENBQUUsVUFBVSxDQUFDLENBQUE7aUJBQ3RDO2FBQ0Y7aUJBQU0sSUFDTCxPQUFPLENBQUMsZUFBZSxFQUFFLEtBQUssdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsS0FBSztnQkFDL0UsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQy9DO2dCQUNBLE9BQU07YUFDUDtTQUNGO1FBQUMsT0FBTyxLQUFVLEVBQUU7WUFDbkIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO2dCQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ25CO1NBQ0k7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFDRDs7S0FFQztJQUNBLG1CQUFtQixDQUFFLFVBQWtCO1FBQ3RDLEtBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMxQjtTQUNFO1FBQ0Qsc0JBQXNCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFDekUsQ0FBQztJQUNILHdCQUF3QixDQUFDLFVBQWtCO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMxQjtTQUNGO0lBQ0gsQ0FBQztJQXVERDs7O09BR0c7SUFDSDs7O09BR0c7SUFDSDs7T0FFRztJQUNILHFCQUFxQixDQUFDLE9BQThCO1FBQ2xELElBQUk7WUFDRixJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsSUFDRSxJQUFJLENBQUMsS0FBSztnQkFDVixPQUFPLENBQUMsZUFBZSxFQUFFLEtBQUssdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsS0FBSztnQkFDL0UsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQ2pEO2dCQUNBLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFHO29CQUN4TCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFDeEIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFOzRCQUNwQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLE9BQU8sQ0FBQyxDQUFBO3dCQUN2RCxDQUFDLENBQUMsQ0FBQztxQkFDSjt5QkFDSTt3QkFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtxQkFDekI7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUM5RjtpQkFDSSxJQUNILElBQUksQ0FBQyxJQUFJO2dCQUNULE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO2dCQUM5RSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO29CQUNyRCxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQzt1QkFDckQsQ0FDRCxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUU7d0JBQzdELE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUNoRCxDQUFDLEVBQ0o7Z0JBQ0EsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ3RMLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUN4QixTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7NEJBQ3BDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUUsT0FBTyxDQUFDLENBQUE7d0JBQ3ZELENBQUMsQ0FBQyxDQUFDO3FCQUNKO3lCQUNJO3dCQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO3FCQUN6QjtpQkFDRjtnQkFDRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFBO2FBQzdGO1NBQ0Y7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkI7U0FDSTtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBMEREOztPQUVHO0lBQ0g7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLEtBQWEsRUFBRSxJQUFTO1FBQ25DLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0lBQ0Q7O09BRUc7SUFDSDs7O09BR0c7SUFDRixlQUFlLENBQUMsU0FBNkIsRUFBRSxVQUE4QjtRQUM1RSxJQUFJLFlBQWtCLEVBQUUsYUFBbUIsQ0FBQztRQUM1QyxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBVSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNDLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFXLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDN0MsT0FBTyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssYUFBYSxDQUFDLE9BQU8sRUFBRTtZQUN2RCxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUNwRCxZQUFZLENBQUMsV0FBVyxFQUFFLEtBQUssYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDRixlQUFlLENBQUMsUUFBaUM7UUFDL0MsSUFBSTtZQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUMzQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQzthQUNuQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDckIsSUFBRyxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUM7b0JBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtpQkFDMUI7Z0JBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLDZCQUE2QjtZQUNsRCxDQUFDLENBQUMsQ0FBQztZQUNSLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQztnQkFFbkIsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO29CQUN4QyxJQUFJLEVBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ2QsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLO29CQUNoQixPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUUsQ0FBQyxDQUFDO2lCQUN2QyxDQUFDLENBQUE7Z0JBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7Z0JBQ3hCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN2QjtTQUNHO1FBQUMsT0FBTyxLQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFBO1lBQ3pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQztJQUNGOztPQUVHO0lBQ0YsUUFBUTtRQUNQLE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtZQUNuQyxVQUFVLEVBQUUscUJBQXFCO1lBQ2pDLFNBQVMsRUFBRSxDQUFDO1NBQ2IsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBWSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUE7WUFDakIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDNUMsSUFBRyxJQUFJLENBQUMsVUFBVSxFQUFDO2dCQUNqQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtnQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN4RCxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQTZCLEVBQUUsRUFBRTt3QkFDdkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7d0JBQ3RCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN0SCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRTs0QkFDakIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFBO3lCQUN2Qzt3QkFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO3dCQUN6QixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUMxRCxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtpQkFDMUI7YUFDRjtRQUNILENBQUMsQ0FBQztRQUNGLElBQUksUUFBUSxHQUEwQixJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRixRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUFBLENBQUM7SUFDRjs7S0FFQztJQUNELEtBQUs7UUFDSCxNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWE7WUFDbkMsVUFBVSxFQUFFLG1CQUFtQjtZQUMvQixTQUFTLEVBQUUsR0FBRztTQUNmLENBQUE7UUFDRCxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQVksRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO1lBQ3ZCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7aUJBQzdCO2FBQ0Y7UUFDSCxDQUFDLENBQUE7UUFDRixJQUFJLFFBQVEsR0FBMEIsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUF3Qkc7OztHQUdEO0lBQ0Q7O0tBRUM7SUFDQSxXQUFXLENBQUMsUUFBK0I7UUFDMUMsTUFBTSxPQUFPLEdBQTBCLFFBQVEsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBNEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRSxJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ25CLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM1QztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFRSCxhQUFhLENBQUMsT0FBOEIsRUFBRSxPQUFnQixLQUFLO1FBQ2pFLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtTQUMxQjthQUNJO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1NBQ2xDO0lBQ0gsQ0FBQztJQWtERCxlQUFlLENBQUMsT0FBNkI7UUFDM0MsSUFBRyxJQUFJLENBQUMsU0FBUyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBQztZQUM3QyxPQUFPLElBQUksQ0FBQTtTQUNaO2FBQ0M7WUFDRCxJQUFHLElBQUksQ0FBQyxLQUFLLElBQUssT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksb0JBQW9CLENBQUMsUUFBUSxFQUFDO2dCQUNqUSxPQUFPLElBQUksQ0FBQTthQUNaO2lCQUNHO2dCQUNGLE9BQU8sS0FBSyxDQUFBO2FBQ2I7U0FDRjtJQUNELENBQUM7SUFDQSxpQkFBaUI7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBVyxFQUFDLEVBQUU7WUFDeEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFjLENBQUE7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFRLENBQUE7WUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtZQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQTtZQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBRXBCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUUsRUFBRTtZQUU3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUE7UUFFN0IsQ0FBQyxDQUFDLENBQUE7UUFDVCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBdUIsRUFBRSxFQUFFO1lBQ3RHLElBQUksQ0FBQTtZQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxDQUFBO1FBQ25DLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQThCLEVBQUUsRUFBRTtZQUNoSCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFRLENBQUMsQ0FBQTtRQUMvQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUE4QixFQUFFLEVBQUU7WUFDL0csSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBUSxDQUFDLENBQUE7UUFDaEMsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMseUJBQXlCLEdBQUcsb0JBQW9CLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBOEIsRUFBRSxFQUFFO1lBQzVILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQVEsQ0FBQyxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBZ0IsRUFBRSxFQUFFO1lBQ2xGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQVEsQ0FBQyxDQUFBO1FBQy9CLENBQUMsQ0FBQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBaUIsRUFBRSxFQUFFO1lBQ3pGLElBQUcsTUFBTSxFQUFFLE1BQU0sSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFDO2dCQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsQ0FBQTthQUNwQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBYyxFQUFFLEVBQUU7WUFDckYsSUFBSSxPQUFPLEdBQTBCLEdBQUcsQ0FBQyxPQUFRLENBQUE7WUFDakQsUUFBUSxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUNsQixLQUFLLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNqQixNQUFNO2lCQUNQO2dCQUNELEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzQixJQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUM7d0JBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtxQkFDN0I7b0JBQ0EsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ2xDLE1BQU07aUJBQ1A7Z0JBQ0QsS0FBSyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7aUJBQzNCO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBb0MsRUFBRSxFQUFFO1lBQ2pILElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQW1CLEVBQUMsRUFBRTtZQUNsRixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQTtZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtZQUNuQixJQUFHLElBQUksRUFBQztnQkFDTixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ3RCO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUMxQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsbUJBQW1CLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQW9CLEVBQUUsRUFBRTtZQUMzRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBb0IsRUFBRSxFQUFFO1lBRTFGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkIsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFvQixFQUFFLEVBQUU7WUFDMUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFhRCxVQUFVO1FBQ1IsSUFBSSxVQUFVLEdBQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFBO1FBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pJLElBQUksZ0JBQWdCLEVBQUUsY0FBYyxJQUFJLGdCQUFnQixFQUFFLGFBQWEsSUFBSSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUU7WUFFM0csTUFBTSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7WUFDM0UsT0FBTyxDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxDQUFBO0lBQy9DLENBQUM7OzJIQXBpRlUsNkJBQTZCOytHQUE3Qiw2QkFBNkIscXBGQzFDMUMsMjVrQkEyUUE7NEZEak9hLDZCQUE2QjtrQkFOekMsU0FBUzsrQkFDRSx3QkFBd0IsbUJBR2pCLHVCQUF1QixDQUFDLE1BQU07aUtBR0gsVUFBVTtzQkFBckQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNGLE1BQU07c0JBQTdDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDRCxHQUFHO3NCQUF2QyxTQUFTO3VCQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ1MsVUFBVTtzQkFBckQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNXLG1CQUFtQjtzQkFBdkUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ1AsVUFBVTtzQkFBckQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNHLFdBQVc7c0JBQXZELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDRSxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0UsV0FBVztzQkFBdkQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNJLGFBQWE7c0JBQTNELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDRyxjQUFjO3NCQUE3RCxTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSSxnQkFBZ0I7c0JBQWpFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNKLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSyxhQUFhO3NCQUEzRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0QsVUFBVTtzQkFBckQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUdqQyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUlHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFlRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFJlbmRlcmVyMixcbiAgQXBwbGljYXRpb25SZWYsXG4gIE5nWm9uZSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbWV0Q2hhdCB9IGZyb20gXCJAY29tZXRjaGF0LXByby9jaGF0XCI7XG5pbXBvcnQgeyAgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7RGF0ZVN0eWxlLEF2YXRhclN0eWxlLCBNZW51TGlzdFN0eWxlLCBSZWNlaXB0U3R5bGUsIEJhc2VTdHlsZSwgRG9jdW1lbnRCdWJibGVTdHlsZSwgQ29uZmlybURpYWxvZ1N0eWxlLCBGdWxsU2NyZWVuVmlld2VyU3R5bGV9IGZyb20gJ0Bjb21ldGNoYXQvdWlraXQtZWxlbWVudHMnXG5pbXBvcnQgeyBDb21ldENoYXRUaGVtZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vQ29tZXRDaGF0VGhlbWUuc2VydmljZVwiO1xuaW1wb3J0IHsgU3RhdGVzLCBsb2NhbGl6ZSwgTWVzc2FnZUxpc3RBbGlnbm1lbnQsIERhdGVQYXR0ZXJucywgVGltZXN0YW1wQWxpZ25tZW50LCBDb21ldENoYXRNZXNzYWdlVGVtcGxhdGUsIERvY3VtZW50SWNvbkFsaWdubWVudCxDb21ldENoYXRVSUtpdENvbnN0YW50cywgQ29tZXRDaGF0VGhlbWUsIE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQsIENvbWV0Q2hhdE1lc3NhZ2VPcHRpb24sIGZvbnRIZWxwZXIsIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMsIE1lc3NhZ2VTdGF0dXMsIENvbWV0Q2hhdEdyb3VwRXZlbnRzLCBJR3JvdXBNZW1iZXJBZGRlZCwgSUdyb3VwTWVtYmVyS2lja2VkQmFubmVkLCBJR3JvdXBNZW1iZXJTY29wZUNoYW5nZWQsIElHcm91cExlZnQsIElNZXNzYWdlcywgQ29tZXRDaGF0VUlFdmVudHMsIFBsYWNlbWVudCwgSVBhbmVsLCBDb21ldENoYXRDYWxsRXZlbnRzIH0gZnJvbSBcIkBjb21ldGNoYXQvdWlraXQtcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBNZXNzYWdlTGlzdFN0eWxlLCBDb21ldENoYXRTb3VuZE1hbmFnZXIsIE1lc3NhZ2VSZWNlaXB0VXRpbHMsIENvbGxhYm9yYXRpdmVXaGl0ZWJvYXJkQ29uc3RhbnRzLCBDb2xsYWJvcmF0aXZlRG9jdW1lbnRDb25zdGFudHMsIE1lc3NhZ2VUcmFuc2xhdGlvbkNvbnN0YW50cywgTWVzc2FnZVRyYW5zbGF0aW9uU3R5bGUsIFJlYWN0aW9uc0NvbnN0YW50cywgUG9sbHNCdWJibGVTdHlsZSwgSW1hZ2VNb2RlcmF0aW9uU3R5bGUsIFNtYXJ0UmVwbGllc1N0eWxlLCBTbWFydFJlcGxpZXNDb25maWd1cmF0aW9uLCBTbWFydFJlcGxpZXNDb25zdGFudHMsIFRodW1ibmFpbEdlbmVyYXRpb25Db25zdGFudHMsIExpbmtQcmV2aWV3Q29uc3RhbnRzLCBDYWxsc2NyZWVuU3R5bGUsIENhbGxpbmdEZXRhaWxzVXRpbHMgLENvbWV0Q2hhdFVJS2l0VXRpbGl0eSwgQ29tZXRDaGF0VUlLaXRIZWxwZXJ9IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXNoYXJlZFwiO1xuaW1wb3J0IHsgQ2hhdENvbmZpZ3VyYXRvciB9IGZyb20gXCIuLi8uLi9TaGFyZWQvRnJhbWV3b3JrL0NoYXRDb25maWd1cmF0b3JcIjtcbmltcG9ydCB7IFN0aWNrZXJzQ29uc3RhbnRzLExpbmtQcmV2aWV3U3R5bGUgfSBmcm9tIFwiQGNvbWV0Y2hhdC91aWtpdC1zaGFyZWRcIjtcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL2kxOG4vaTE4bl9hc3RcIjtcblxuXG4vKipcbipcbiogQ29tZXRDaGF0TWVzc2FnZUxpc3QgaXMgYSB3cmFwcGVyIGNvbXBvbmVudCBmb3IgbWVzc2FnZUJ1YmJsZVxuKlxuKiBAdmVyc2lvbiAxLjAuMFxuKiBAYXV0aG9yIENvbWV0Q2hhdFRlYW1cbiogQGNvcHlyaWdodCDCqSAyMDIyIENvbWV0Q2hhdCBJbmMuXG4qXG4qL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNvbWV0Y2hhdC1tZXNzYWdlLWxpc3RcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9jb21ldGNoYXQtbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jb21ldGNoYXQtbWVzc2FnZS1saXN0LmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ29tZXRDaGF0TWVzc2FnZUxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZChcImxpc3RTY3JvbGxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGxpc3RTY3JvbGwhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFwiYm90dG9tXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBib3R0b20hOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFwidG9wXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0b3AhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFwidGV4dEJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgdGV4dEJ1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJ0aHJlYWRNZXNzYWdlQnViYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0aHJlYWRNZXNzYWdlQnViYmxlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZChcImZpbGVCdWJibGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVCdWJibGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKFwiYXVkaW9CdWJibGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGF1ZGlvQnViYmxlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZChcInZpZGVvQnViYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWRlb0J1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJpbWFnZUJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgaW1hZ2VCdWJibGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKFwic3RpY2tlckJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc3RpY2tlckJ1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJkb2N1bWVudEJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgZG9jdW1lbnRCdWJibGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKFwid2hpdGVib2FyZEJ1YmJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgd2hpdGVib2FyZEJ1YmJsZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJwb3BvdmVyUmVmXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwb3BvdmVyUmVmITogYW55O1xuICBAVmlld0NoaWxkKFwiZGlyZWN0Q2FsbGluZ1wiLCB7IHN0YXRpYzogZmFsc2UgfSkgZGlyZWN0Q2FsbGluZyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoXCJwb2xsQnViYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwb2xsQnViYmxlITogVGVtcGxhdGVSZWY8YW55PjtcblxuXG4gIEBJbnB1dCgpIGhpZGVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvclN0YXRlVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGxvYWRpbmdTdGF0ZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBlbXB0eVN0YXRlVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgZXJyb3JTdGF0ZVRleHQ6IHN0cmluZyA9IGxvY2FsaXplKFwiU09NRVRISU5HX1dST05HXCIpO1xuICBASW5wdXQoKSBlbXB0eVN0YXRlVGV4dDogc3RyaW5nID0gbG9jYWxpemUoXCJOT19NRVNTQUdFU19GT1VORFwiKTtcbiAgQElucHV0KCkgbG9hZGluZ0ljb25VUkw6IHN0cmluZyA9IFwiYXNzZXRzL1NwaW5uZXIuc3ZnXCI7XG4gIEBJbnB1dCgpIHVzZXIhOiBDb21ldENoYXQuVXNlcjtcbiAgQElucHV0KCkgZ3JvdXAhOiBDb21ldENoYXQuR3JvdXA7XG4gIEBJbnB1dCgpIGRpc2FibGVSZWNlaXB0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzYWJsZVNvdW5kRm9yTWVzc2FnZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY3VzdG9tU291bmRGb3JNZXNzYWdlczogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgcmVhZEljb246IHN0cmluZyA9IFwiYXNzZXRzL21lc3NhZ2UtcmVhZC5zdmdcIjtcbiAgQElucHV0KCkgZGVsaXZlcmVkSWNvbjogc3RyaW5nID0gXCJhc3NldHMvbWVzc2FnZS1kZWxpdmVyZWQuc3ZnXCI7XG4gIEBJbnB1dCgpIHNlbnRJY29uOiBzdHJpbmcgPSBcImFzc2V0cy9tZXNzYWdlLXNlbnQuc3ZnXCI7XG4gIEBJbnB1dCgpIHdhaXRJY29uOiBzdHJpbmcgPSBcImFzc2V0cy93YWl0LnN2Z1wiO1xuICBASW5wdXQoKSBlcnJvckljb246IHN0cmluZyA9IFwiYXNzZXRzL3dhcm5pbmctc21hbGwuc3ZnXCJcbiAgQElucHV0KCkgYWxpZ25tZW50OiBNZXNzYWdlTGlzdEFsaWdubWVudCA9IE1lc3NhZ2VMaXN0QWxpZ25tZW50LnN0YW5kYXJkO1xuICBASW5wdXQoKSBzaG93QXZhdGFyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGF0ZVBhdHRlcm46IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy50aW1lO1xuICBASW5wdXQoKSB0aW1lc3RhbXBBbGlnbm1lbnQ6IFRpbWVzdGFtcEFsaWdubWVudCA9IFRpbWVzdGFtcEFsaWdubWVudC5ib3R0b207XG4gIEBJbnB1dCgpIERhdGVTZXBhcmF0b3JQYXR0ZXJuOiBEYXRlUGF0dGVybnMgPSBEYXRlUGF0dGVybnMuRGF5RGF0ZVRpbWU7XG4gIEBJbnB1dCgpIHRlbXBsYXRlczogQ29tZXRDaGF0TWVzc2FnZVRlbXBsYXRlW10gPSBbXTtcbiAgQElucHV0KCkgbWVzc2FnZXNSZXF1ZXN0QnVpbGRlciE6IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyO1xuICBASW5wdXQoKSBuZXdNZXNzYWdlSW5kaWNhdG9yVGV4dDogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgc2Nyb2xsVG9Cb3R0b21Pbk5ld01lc3NhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRocmVzaG9sZFZhbHVlOiBudW1iZXIgPSAxMDAwO1xuICBASW5wdXQoKSBvblRocmVhZFJlcGxpZXNDbGljayE6ICgobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UsdmlldzpUZW1wbGF0ZVJlZjxhbnk+KT0+dm9pZCkgfCBudWxsO1xuICBASW5wdXQoKSBoZWFkZXJWaWV3ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgZm9vdGVyVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIHBhcmVudE1lc3NhZ2VJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgYXZhdGFyU3R5bGU6IEF2YXRhclN0eWxlID0ge1xuICAgIGJvcmRlclJhZGl1czogXCIxNnB4XCIsXG4gICAgd2lkdGg6IFwiMjhweFwiLFxuICAgIGhlaWdodDogXCIyOHB4XCIsXG4gIH07XG4gIEBJbnB1dCgpIGJhY2tkcm9wU3R5bGUgOkJhc2VTdHlsZSA9IHtcbiAgICBoZWlnaHQ6XCIxMDAlXCIsXG4gICAgd2lkdGg6XCIxMDAlXCIsXG4gICAgYmFja2dyb3VuZDpcInJnYmEoMCwgMCwgMCwgMC41KVwiXG4gIH1cbiAgQElucHV0KCkgZGF0ZVNlcGFyYXRvclN0eWxlOiBEYXRlU3R5bGUgPSB7XG4gICAgaGVpZ2h0OiBcIlwiLFxuICAgIHdpZHRoOiBcIlwiLFxuICB9O1xuICBASW5wdXQoKSBtZXNzYWdlTGlzdFN0eWxlOiBNZXNzYWdlTGlzdFN0eWxlID0ge1xuICAgIG5hbWVUZXh0Rm9udDogXCI2MDAgMTVweCBJbnRlclwiLFxuICAgIG5hbWVUZXh0Q29sb3I6IFwid2hpdGVcIixcbiAgICBUaW1lc3RhbXBUZXh0Rm9udDogXCJcIixcbiAgICBUaW1lc3RhbXBUZXh0Q29sb3I6IFwiXCIsXG4gICAgdGhyZWFkUmVwbHlTZXBhcmF0b3JDb2xvcjogXCJcIixcbiAgICB0aHJlYWRSZXBseVRleHRGb250OiBcIlwiLFxuICAgIHRocmVhZFJlcGx5SWNvblRpbnQ6IFwiXCIsXG4gICAgdGhyZWFkUmVwbHlUZXh0Q29sb3I6IFwiXCIsXG4gICAgZW1wdHlTdGF0ZVRleHRGb250OiBcIjcwMCAyMnB4IEludGVyXCIsXG4gICAgZW1wdHlTdGF0ZVRleHRDb2xvcjogXCIjYmNiY2JjXCIsXG4gICAgZXJyb3JTdGF0ZVRleHRGb250OiBcIjcwMCAyMnB4IEludGVyXCIsXG4gICAgZXJyb3JTdGF0ZVRleHRDb2xvcjogXCIjYmNiY2JjXCIsXG4gICAgbG9hZGluZ0ljb25UaW50OiBcImdyZXlcIixcbiAgfTtcbiAgQElucHV0KCkgb25FcnJvciA9IChlcnJvcjphbnkpPT57XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gIH1cbiAgc3RhdGU6IFN0YXRlcyA9IFN0YXRlcy5sb2FkaW5nO1xuICAgb3B0aW9uc1N0eWxlOiBNZW51TGlzdFN0eWxlID0ge1xuICAgIHdpZHRoOiBcIlwiLFxuICAgIGhlaWdodDogXCJcIixcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNlOGU4ZThcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgYmFja2dyb3VuZDogXCJ3aGl0ZVwiLFxuICAgIHN1Ym1lbnVXaWR0aDogXCIxMDAlXCIsXG4gICAgc3VibWVudUhlaWdodDogXCIxMDAlXCIsXG4gICAgc3VibWVudUJvcmRlcjogXCIxcHggc29saWQgI2U4ZThlOFwiLFxuICAgIHN1Ym1lbnVCb3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgc3VibWVudUJhY2tncm91bmQ6IFwid2hpdGVcIixcbiAgICBtb3JlSWNvblRpbnQ6XCJncmV5XCJcbiAgfTtcbiAgcmVjZWlwdFN0eWxlOlJlY2VpcHRTdHlsZSA9IHtcbiAgfVxuICBkb2N1bWVudEJ1YmJsZUFsaWdubWVudDpEb2N1bWVudEljb25BbGlnbm1lbnQgPSBEb2N1bWVudEljb25BbGlnbm1lbnQucmlnaHRcbiAgY2FsbEJ1YmJsZUFsaWdubWVudDpEb2N1bWVudEljb25BbGlnbm1lbnQgPSBEb2N1bWVudEljb25BbGlnbm1lbnQubGVmdFxuICBpbWFnZU1vZGVyYXRpb25TdHlsZTpJbWFnZU1vZGVyYXRpb25TdHlsZSA9IHt9XG5cbiAgdGltZXN0YW1wRW51bTogdHlwZW9mIFRpbWVzdGFtcEFsaWdubWVudD0gVGltZXN0YW1wQWxpZ25tZW50O1xuICBwdWJsaWMgY2hhdENoYW5nZWQ6Ym9vbGVhbiA9IHRydWVcbiAgLy8gcHVibGljIHByb3BlcnRpZXNcbiAgcHVibGljIHJlcXVlc3RCdWlsZGVyOiBhbnk7XG4gIHB1YmxpYyBjbG9zZUltYWdlTW9kZXJhdGlvbjphbnlcblxuICBwdWJsaWMgdGltZVN0YW1wQ29sb3I6IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyB0aW1lU3RhbXBGb250OiBzdHJpbmcgPSBcIlwiO1xuICBzbWFydFJlcGx5U3R5bGU6IFNtYXJ0UmVwbGllc1N0eWxlID0ge1xuICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgIGJvcmRlcjogXCJub25lXCIsXG4gIH1cbiAgcHVibGljIHNob3dTbWFydFJlcGx5OmJvb2xlYW4gPSBmYWxzZTtcbiAgY2NIaWRlUGFuZWwhOlN1YnNjcmlwdGlvbjtcbiAgY2NTaG93UGFuZWwhOlN1YnNjcmlwdGlvbjtcbiAgc21hcnRSZXBseU1lc3NhZ2U6Q29tZXRDaGF0LkJhc2VNZXNzYWdlIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBlbmFibGVTbWFydFJlcGx5OmJvb2xlYW4gPSBmYWxzZTtcbiAgc21hcnRSZXBseUNvbmZpZyE6U21hcnRSZXBsaWVzQ29uZmlndXJhdGlvbjtcbiAgcHVibGljIHRpbWVTdGFtcEJhY2tncm91bmQ6IHN0cmluZyA9IFwiXCI7XG4gIGxpbmtQcmV2aWV3U3R5bGU6TGlua1ByZXZpZXdTdHlsZSA9IHt9XG4gIHB1YmxpYyB1bnJlYWRNZXNzYWdlc1N0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGJhY2tncm91bmQ6IFwiIzMzOTlGRlwiLFxuICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgIGJ1dHRvblRleHRGb250OiBcIjQwMCAxM3B4IEludGVyXCIsXG4gICAgY29sb3I6IFwid2hpdGVcIixcbiAgICBib3JkZXI6XCJub25lXCIsXG4gICAgYm9yZGVyUmFkaXVzOlwiMTJweFwiXG4gIH1cbiAgcHVibGljIGRpdmlkZXJTdHlsZTpCYXNlU3R5bGUgPSB7XG4gICAgaGVpZ2h0OiBcIjFweFwiLFxuICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICBiYWNrZ3JvdW5kOiBcImdyZXlcIlxuICB9XG4gIHBvbGxCdWJibGVTdHlsZTpQb2xsc0J1YmJsZVN0eWxlID0ge31cbiAgbGFiZWxTdHlsZTphbnkgPSB7XG4gICAgdGV4dEZvbnQ6XCI0MDAgMTFweCBJbnRlclwiLFxuICAgIHRleHRDb2xvcjpcImdyZXlcIlxuICB9XG4gIGltYWdlQnViYmxlU3R5bGU6YW55ID0ge1xuICAgIGhlaWdodDpcIjEyOHB4XCIsXG4gICAgd2lkdGg6XCIxMjhweFwiLFxuICAgIGJvcmRlcjpcIm5vbmVcIixcbiAgICBib3JkZXJSYWRpdXM6XCIwXCIsXG4gICAgYmFja2dyb3VuZDpcInRyYW5zcGFyZW50XCJcbiAgfVxuICBtZXNzYWdlc0xpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdID0gW107XG4gIGJ1YmJsZURhdGVTdHlsZTpEYXRlU3R5bGUgPSB7XG4gIH1cbiAgd2hpdGVib2FyZEljb25VUkw6c3RyaW5nID0gXCJhc3NldHMvY29sbGFib3JhdGl2ZXdoaXRlYm9hcmQuc3ZnXCI7XG4gIGRvY3VtZW50SWNvblVSTDpzdHJpbmcgPSBcImFzc2V0cy9jb2xsYWJvcmF0aXZlZG9jdW1lbnQuc3ZnXCI7XG4gIGRpcmVjdENhbGxJY29uVVJMOnN0cmluZyA9IFwiYXNzZXRzL1ZpZGVvLWNhbGwyeC5zdmdcIjtcbiAgcGxhY2Vob2xkZXJJY29uVVJMOnN0cmluZyA9IFwiL2Fzc2V0cy9wbGFjZWhvbGRlci5wbmdcIlxuICBkb3dubG9hZEljb25VUkw6c3RyaW5nID0gXCJhc3NldHMvZG93bmxvYWQuc3ZnXCJcbiAgdHJhbnNsYXRpb25TdHlsZTpNZXNzYWdlVHJhbnNsYXRpb25TdHlsZSA9IHt9XG4gIGRvY3VtZW50QnViYmxlU3R5bGU6RG9jdW1lbnRCdWJibGVTdHlsZSA9IHt9XG4gIGNhbGxCdWJibGVTdHlsZTpEb2N1bWVudEJ1YmJsZVN0eWxlID0ge31cbiAgIHdoaXRlYm9hcmRUaXRsZTpzdHJpbmcgPSBsb2NhbGl6ZShcIkNPTExBQk9SQVRJVkVfV0hJVEVCT0FSRFwiKVxuICAgd2hpdGVib2FyZFN1Yml0bGU6c3RyaW5nID0gbG9jYWxpemUoXCJEUkFXX1dISVRFQk9BUkRfVE9HRVRIRVJcIilcbiAgIHdoaXRlYm9hcmRCdXR0b25UZXh0OnN0cmluZyA9ICBsb2NhbGl6ZShcIk9QRU5fV0hJVEVCT0FSRFwiKVxuICAgZG9jdW1lbnRUaXRsZTpzdHJpbmcgPSBsb2NhbGl6ZShcIkNPTExBQk9SQVRJVkVfRE9DVU1FTlRcIilcbiAgIGRvY3VtZW50U3ViaXRsZTpzdHJpbmcgPSBsb2NhbGl6ZShcIkRSQVdfRE9DVU1FTlRfVE9HRVRIRVJcIilcbiAgIGRvY3VtZW50QnV0dG9uVGV4dDpzdHJpbmcgPSBsb2NhbGl6ZShcIk9QRU5fRE9DVU1FTlRcIilcbiAgIGpvaW5DYWxsQnV0dG9uVGV4dDpzdHJpbmcgPSBsb2NhbGl6ZShcIkpPSU5cIilcbiAgdG9wT2JzZXJ2ZXIhOkludGVyc2VjdGlvbk9ic2VydmVyO1xuICBib3R0b21PYnNlcnZlciE6SW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIGxvY2FsaXplOnR5cGVvZiBsb2NhbGl6ZSA9IGxvY2FsaXplXG4gIHJlaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgTWVzc2FnZVR5cGVzQ29uc3RhbnQ6dHlwZW9mIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcyA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlc1xuICBjYWxsQ29uc3RhbnQ6IHN0cmluZyA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5jYWxsXG4gIHB1YmxpYyB0eXBlc01hcDogYW55ID0ge1xuICB9XG4gIHB1YmxpYyBtZXNzYWdlVHlwZXNNYXA6IGFueSA9IHtcbiAgfVxuICB0aGVtZTogQ29tZXRDaGF0VGhlbWUgPSBuZXcgQ29tZXRDaGF0VGhlbWUoe30pXG4gIHB1YmxpYyBtc2dMaXN0ZW5lcklkID0gXCJtZXNzYWdlX1wiKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgcHVibGljIGdyb3VwTGlzdGVuZXJJZCA9IFwiZ3JvdXBfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBwdWJsaWMgY2FsbExpc3RlbmVySWQgPSBcImNhbGxfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBwdWJsaWMgbG9nZ2VkSW5Vc2VyITogQ29tZXRDaGF0LlVzZXI7XG4gIHB1YmxpYyBzdGF0ZXM6IHR5cGVvZiBTdGF0ZXMgPSBTdGF0ZXNcbiAgTWVzc2FnZUNhdGVnb3J5ID0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZUNhdGVnb3J5O1xuICBwdWJsaWMgbnVtYmVyT2ZUb3BTY3JvbGw6IG51bWJlciA9IDA7XG4gIGtlZXBSZWNlbnRNZXNzYWdlczogYm9vbGVhbiA9IHRydWU7XG4gIG1lc3NhZ2VUZW1wbGF0ZTogQ29tZXRDaGF0TWVzc2FnZVRlbXBsYXRlW10gPSBbXTtcblxuICBtZXNzYWdlQ291bnQhOiBudW1iZXI7XG4gIGlzT25Cb3R0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgVW5yZWFkQ291bnQ6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdID0gW107XG4gIG5ld01lc3NhZ2VDb3VudDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgdHlwZTogc3RyaW5nID0gXCJcIjtcbiAgY29uZmlybVRleHQ6c3RyaW5nID0gbG9jYWxpemUoXCJZRVNcIilcbiAgY2FuY2VsVGV4dDpzdHJpbmcgPSBsb2NhbGl6ZShcIk5PXCIpXG4gIHdhcm5pbmdUZXh0OnN0cmluZyA9IFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gc2VlIHVuc2FmZSBjb250ZW50P1wiXG4gIGNjTWVzc2FnZURlbGV0ZSE6IFN1YnNjcmlwdGlvbjtcbiAgY2NNZXNzYWdlUmVhY3QhOiBTdWJzY3JpcHRpb247XG4gIGNjTWVzc2FnZVJlYWQhOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY01lc3NhZ2VFZGl0ITogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2NMaXZlUmVhY3Rpb24hOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY01lc3NhZ2VTZW50ITogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2NNZXNzYWdlRWRpdGVkITogU3Vic2NyaXB0aW9uO1xuICBjY0dyb3VwTWVtYmVyQWRkZWQhOlN1YnNjcmlwdGlvbjtcbiAgY2NHcm91cExlZnQhOlN1YnNjcmlwdGlvbjtcbiAgY2NHcm91cE1lbWJlckpvaW5lZCE6U3Vic2NyaXB0aW9uO1xuICBjY0dyb3VwTWVtYmVyS2lja2VkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBNZW1iZXJCYW5uZWQhOlN1YnNjcmlwdGlvbjtcbiAgY2NPd25lcnNoaXBDaGFuZ2VkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBEZWxldGVkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBDcmVhdGVkITpTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY091dGdvaW5nQ2FsbCE6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGNjQ2FsbFJlamVjdGVkITogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2NDYWxsRW5kZWQhOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjY0NhbGxBY2NlcHRlZCE6U3Vic2NyaXB0aW9uO1xuICBjY0dyb3VwTWVtYmVyU2NvcGVDaGFuZ2VkITpTdWJzY3JpcHRpb247XG4gIHB1YmxpYyB0aHJlYWRlZEFsaWdubWVudDpNZXNzYWdlQnViYmxlQWxpZ25tZW50ID0gTWVzc2FnZUJ1YmJsZUFsaWdubWVudC5sZWZ0XG4gIG9wZW5FbW9qaUtleWJvYXJkOmJvb2xlYW4gPSBmYWxzZTtcbiAga2V5Ym9hcmRBbGlnbm1lbnQ6c3RyaW5nID0gUGxhY2VtZW50LnJpZ2h0XG4gIHBvcG92ZXJTdHlsZTphbnkgPSB7XG4gICAgaGVpZ2h0OlwiMzMwcHhcIixcbiAgICB3aWR0aDpcIjMyNXB4XCIsXG4gIH1cbiAgdmlkZW9CdWJibGVTdHlsZTogQmFzZVN0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMzBweFwiLFxuICAgIHdpZHRoOiBcIjIzMHB4XCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiXG4gIH1cbiAgdGhyZWFkVmlld0FsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQubGVmdFxuICB3aGl0ZWJvYXJkVVJMOiBzdHJpbmcgfCBVUkwgfCB1bmRlZmluZWQ7XG4gIGVuYWJsZURhdGFNYXNraW5nOmJvb2xlYW4gPSBmYWxzZTtcbiAgZW5hYmxlVGh1bWJuYWlsR2VuZXJhdGlvbjpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZUxpbmtQcmV2aWV3OmJvb2xlYW4gPSBmYWxzZVxuICBlbmFibGVQb2xsczpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZVJlYWN0aW9uczpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZUltYWdlTW9kZXJhdGlvbjpib29sZWFuID0gZmFsc2U7XG4gIGVuYWJsZVN0aWNrZXJzOmJvb2xlYW4gPSBmYWxzZTtcbiAgZW5hYmxlV2hpdGVib2FyZDpib29sZWFuID0gZmFsc2VcbiAgZW5hYmxlRG9jdW1lbnQ6Ym9vbGVhbiA9IGZhbHNlXG4gIHNob3dPbmdvaW5nQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xuICBlbmFibGVDYWxsaW5nOmJvb2xlYW4gPSBmYWxzZTtcbiAgb25nb2luZ0NhbGxTdHlsZTogQ2FsbHNjcmVlblN0eWxlID0ge31cbiAgc2Vzc2lvbklkOiBzdHJpbmcgPSBcIlwiO1xuXG4gIGdldFRocmVhZFZpZXdTdHlsZShtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgaWYoKCFtZXNzYWdlLmdldFNlbmRlcigpIHx8IG1lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT09IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSkgJiYgbWVzc2FnZT8uZ2V0VHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcy50ZXh0KXtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogXCIzMHB4XCIsXG4gICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjBcIixcbiAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBwYWRkaW5nOlwiMCA4cHhcIixcbiAgICAgICAgYnV0dG9uSWNvblRpbnQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBmbGV4RmxvdzogXCJyb3ctcmV2ZXJzZVwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICAgIGJ1dHRvblRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IFwiMzBweFwiLFxuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGJvcmRlcjogXCJub25lXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgcGFkZGluZzpcIjAgOHB4XCIsXG4gICAgICAgIGJ1dHRvbkljb25UaW50OlwiZ3JleVwiLFxuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgZmxleEZsb3c6IFwicm93LXJldmVyc2VcIixcbiAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwiLFxuICAgICAgICBidXR0b25UZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpXG4gICAgICB9XG4gICAgfVxuICAgICAgfVxuICBjbG9zZUljb25VUkw6c3RyaW5nID0gXCJhc3NldHMvY2xvc2UyeC5zdmdcIlxuICB0aHJlYWRPcGVuSWNvbjpzdHJpbmcgPSBcImFzc2V0cy9zaWRlLWFycm93LnN2Z1wiXG4gIGNvbmZpcm1EaWFsb2dTdHlsZTpDb25maXJtRGlhbG9nU3R5bGUgPSB7fVxuICBwdWJsaWMgbWVzc2FnZVRvUmVhY3Q6Q29tZXRDaGF0LkJhc2VNZXNzYWdlIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBsaW1pdDpudW1iZXIgPSAzMDtcbiAgdHlwZXM6IHN0cmluZ1tdID0gW107XG4gIGNhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUsIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIHRoZW1lU2VydmljZTpDb21ldENoYXRUaGVtZVNlcnZpY2UpIHtcbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2codGhpcy50ZW1wbGF0ZXMpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjaGFuZ2VzW0NvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlcl0gfHwgY2hhbmdlc1tDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwXSkge1xuICAgICAgICB0aGlzLnNob3dFbmFibGVkRXh0ZW5zaW9ucygpXG4gICAgICAgIHRoaXMubnVtYmVyT2ZUb3BTY3JvbGwgPSAwXG4gICAgICAgIGlmKCF0aGlzLmxvZ2dlZEluVXNlcil7XG4gICAgICAgICAgQ29tZXRDaGF0LmdldExvZ2dlZGluVXNlcigpLnRoZW4oKHVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSB1c2VyIGFzIENvbWV0Q2hhdC5Vc2VyXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdCA9IFtdXG4gICAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy51c2VyKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXIgPSB0aGlzLnVzZXI7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXI7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3RCdWlsZGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgQ29tZXRDaGF0LmdldFVzZXIodGhpcy51c2VyKVxuICAgICAgICAgICAgICAudGhlbigodXNlcjogQ29tZXRDaGF0LlVzZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlcjtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3RCdWlsZGVyKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5ncm91cCkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cCA9IHRoaXMuZ3JvdXBcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUuZ3JvdXBcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVxdWVzdEJ1aWxkZXIoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENvbWV0Q2hhdC5nZXRHcm91cCh0aGlzLmdyb3VwKVxuICAgICAgICAgICAgICAudGhlbigoZ3JvdXA6IENvbWV0Q2hhdC5Hcm91cCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVxdWVzdEJ1aWxkZXIoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9SZW1vdmluZyBQcmV2aW91cyBDb252ZXJzYXRpb24gTGlzdGVuZXJzXG4gICAgICAgIENvbWV0Q2hhdC5yZW1vdmVNZXNzYWdlTGlzdGVuZXIodGhpcy5tc2dMaXN0ZW5lcklkKTtcbiAgICAgICAgQ29tZXRDaGF0LnJlbW92ZUdyb3VwTGlzdGVuZXIodGhpcy5ncm91cExpc3RlbmVySWQpO1xuICAgICAgICBDb21ldENoYXQucmVtb3ZlQ2FsbExpc3RlbmVyKHRoaXMuY2FsbExpc3RlbmVySWQpO1xuICAgICAgICB0aGlzLm1zZ0xpc3RlbmVySWQgPSBcIm1lc3NhZ2VfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmdyb3VwTGlzdGVuZXJJZCA9IFwiZ3JvdXBfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcklkID0gXCJjYWxsX1wiKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgLy8gQXR0YWNoIE1lc3NhZ2VMaXN0ZW5lcnMgZm9yIHRoZSBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIHRoaXMuYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6YW55KSB7XG4gICAgIGlmKHRoaXMub25FcnJvcil7XG4gICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgIH1cbiAgICB9XG4gIH1cbiAgYWRkUmVhY3Rpb24gPSAoZXZlbnQ6YW55KT0+e1xuICAgIGxldCBlbW9qaSA9IGV2ZW50Py5kZXRhaWw/LmlkXG4gICAgdGhpcy5wb3BvdmVyUmVmLm5hdGl2ZUVsZW1lbnQub3BlbkNvbnRlbnRWaWV3KGV2ZW50KVxudGhpcy5yZWFjdFRvTWVzc2FnZXMoZW1vamkpXG5cbiAgfVxuICBnZXRDYWxsQnViYmxlVGl0bGUobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2Upe1xuICAgIGlmKCFtZXNzYWdlLmdldFNlbmRlcigpIHx8IG1lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT0gdGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkpe1xuICAgICAgcmV0dXJuIGxvY2FsaXplKFwiWU9VX0lOSVRJQVRFRF9HUk9VUF9DQUxMXCIpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGAke21lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0TmFtZSgpfSAgJHtsb2NhbGl6ZShcIklOSVRJQVRFRF9HUk9VUF9DQUxMXCIpfWBcbiAgICB9XG5cbiAgfVxuICBnZXRDYWxsQWN0aW9uTWVzc2FnZSA9IChjYWxsOkNvbWV0Q2hhdC5DYWxsKSA9PiB7XG5cblx0cmV0dXJuIENhbGxpbmdEZXRhaWxzVXRpbHMuZ2V0Q2FsbFN0YXR1cyhjYWxsLHRoaXMubG9nZ2VkSW5Vc2VyKVxuXHR9O1xuICByZWFjdFRvTWVzc2FnZXMoZW1vamk6c3RyaW5nKSB7XG4gICAgbGV0IHJlbW92ZUVtb2ppOmJvb2xlYW4gPSBmYWxzZVxuICAgIGxldCByZWFjdGlvbk9iamVjdDphbnkgPSB7fTtcbiAgICBsZXQgbmV3TWVzc2FnZU9iamVjdCE6Q29tZXRDaGF0LlRleHRNZXNzYWdlIHwgbnVsbDtcbiAgICBsZXQgbXNnT2JqZWN0OmFueSA9IHRoaXMubWVzc2FnZVRvUmVhY3Q7XG4gICAgY29uc3QgdXNlck9iamVjdDphbnkgPSB7fTtcbiAgICBpZih0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0QXZhdGFyKCkpe1xuICAgICAgdXNlck9iamVjdFtcImF2YXRhclwiXSA9IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRBdmF0YXIoKTtcbiAgICB9XG4gICAgaWYodGhpcy5sb2dnZWRJblVzZXI/LmdldE5hbWUoKSl7XG4gICAgICB1c2VyT2JqZWN0W1wibmFtZVwiXSA9IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXROYW1lKCk7XG4gICAgfVxuICAgIGxldCB1aWQ6YW55ID0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpO1xuICAgIGNvbnN0IGVtb2ppT2JqZWN0ID0ge1xuICAgICAgW2Vtb2ppXToge1xuICAgICAgICBbdWlkXTogdXNlck9iamVjdCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCByZWFjdGlvbkV4dGVuc2lvbnNEYXRhID0gQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmNoZWNrTWVzc2FnZUZvckV4dGVuc2lvbnNEYXRhKFxuICAgICAgKHRoaXMubWVzc2FnZVRvUmVhY3QgYXMgQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSxcbiAgICAgICBcInJlYWN0aW9uc1wiXG4gICAgICApO1xuICAgIGlmIChyZWFjdGlvbkV4dGVuc2lvbnNEYXRhKSB7XG4gICAgICBpZiAocmVhY3Rpb25FeHRlbnNpb25zRGF0YVtlbW9qaV0pIHtcbiAgICAgICAgLy9pZiB0aGUgcmVhY3Rpb25zIG1ldGFkYXRhIGhhcyB0aGUgc2VsZWN0ZWQgZW1vamkvcmVhY3Rpb24gZm9yIHRoZSBsb2dnZWRpbiB1c2VyXG4gICAgICAgIGlmIChyZWFjdGlvbkV4dGVuc2lvbnNEYXRhW2Vtb2ppXVt1aWRdKSB7XG4gICAgICAgICAgZGVsZXRlIHJlYWN0aW9uRXh0ZW5zaW9uc0RhdGFbZW1vamldO1xuICAgICAgICAgIHJlbW92ZUVtb2ppID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZGF0YTphbnkgPSBtc2dPYmplY3RbXCJtZXRhZGF0YVwiXVtcIkBpbmplY3RlZFwiXVtcImV4dGVuc2lvbnNcIl1bXG4gICAgICAgICAgICBcInJlYWN0aW9uc1wiXG4gICAgICAgICAgXTtcbiAgICAgICAgICBkYXRhW2Vtb2ppXVt1aWRdID0gdXNlck9iamVjdFxuICAgICAgICAgcmVhY3Rpb25PYmplY3QgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFtc2dPYmplY3Q/Lmhhc093blByb3BlcnR5KFwibWV0YWRhdGFcIikpIHtcbiAgICAgICAgICBtc2dPYmplY3RbXCJtZXRhZGF0YVwiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghbXNnT2JqZWN0W1wibWV0YWRhdGFcIl0uaGFzT3duUHJvcGVydHkoXCJAaW5qZWN0ZWRcIikpIHtcbiAgICAgICAgICBtc2dPYmplY3RbXCJtZXRhZGF0YVwiXVtcIkBpbmplY3RlZFwiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl0uaGFzT3duUHJvcGVydHkoXCJleHRlbnNpb25zXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIG1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdW1wiZXh0ZW5zaW9uc1wiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdLmhhc093blByb3BlcnR5KFxuICAgICAgICAgICAgXCJyZWFjdGlvbnNcIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdW1wicmVhY3Rpb25zXCJdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGE6YW55ID0gbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdW1wicmVhY3Rpb25zXCJdO1xuICAgICAgICByZWFjdGlvbk9iamVjdCA9IHsgLi4uZGF0YSwgLi4uZW1vamlPYmplY3QgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFtc2dPYmplY3Q/Lmhhc093blByb3BlcnR5KFwibWV0YWRhdGFcIikpIHtcbiAgICAgICAgbXNnT2JqZWN0W1wibWV0YWRhdGFcIl0gPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmICghbXNnT2JqZWN0W1wibWV0YWRhdGFcIl0uaGFzT3duUHJvcGVydHkoXCJAaW5qZWN0ZWRcIikpIHtcbiAgICAgICAgbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl0gPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIW1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdLmhhc093blByb3BlcnR5KFwiZXh0ZW5zaW9uc1wiKVxuICAgICAgKSB7XG4gICAgICAgIG1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdW1wiZXh0ZW5zaW9uc1wiXSA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhbXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdLmhhc093blByb3BlcnR5KFxuICAgICAgICAgIFwicmVhY3Rpb25zXCJcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdW1wiZXh0ZW5zaW9uc1wiXVtcInJlYWN0aW9uc1wiXSA9IHt9O1xuICAgICAgfVxuICAgICAgcmVhY3Rpb25PYmplY3QgPSB7XG4gICAgICAgIC4uLmVtb2ppT2JqZWN0LFxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIG1ldGFkYXRhT2JqZWN0OmFueTtcbiAgIGlmKHJlbW92ZUVtb2ppKXtcbiAgICAgbWV0YWRhdGFPYmplY3QgPSB7XG4gICAgICAuLi5tc2dPYmplY3RbXCJtZXRhZGF0YVwiXSxcbiAgfTtcbiAgIH1cbiAgIGVsc2V7XG4gICAgIG1ldGFkYXRhT2JqZWN0ID0ge1xuICAgICAgLi4ubXNnT2JqZWN0W1wibWV0YWRhdGFcIl0sXG4gICAgICBcIkBpbmplY3RlZFwiOiB7XG4gICAgICAgIC4uLm1zZ09iamVjdFtcIm1ldGFkYXRhXCJdW1wiQGluamVjdGVkXCJdLFxuICAgICAgICBleHRlbnNpb25zOiB7XG4gICAgICAgICAgLi4ubXNnT2JqZWN0W1wibWV0YWRhdGFcIl1bXCJAaW5qZWN0ZWRcIl1bXCJleHRlbnNpb25zXCJdLFxuICAgICAgICAgIHJlYWN0aW9uczoge1xuICAgICAgICAgICAgLi4ucmVhY3Rpb25PYmplY3QsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gIH07XG4gICB9XG4gICAgbmV3TWVzc2FnZU9iamVjdCA9IHRoaXMubWVzc2FnZVRvUmVhY3QgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlO1xuICAgIG5ld01lc3NhZ2VPYmplY3Quc2V0TWV0YWRhdGEobWV0YWRhdGFPYmplY3QpXG4gICAgdGhpcy51cGRhdGVNZXNzYWdlKG5ld01lc3NhZ2VPYmplY3QpXG4gICAgdHJ5IHtcbiAgICAgIENvbWV0Q2hhdC5jYWxsRXh0ZW5zaW9uKFJlYWN0aW9uc0NvbnN0YW50cy5yZWFjdGlvbnMsIFJlYWN0aW9uc0NvbnN0YW50cy5wb3N0LCBSZWFjdGlvbnNDb25zdGFudHMudjEsIHtcbiAgICAgICAgbXNnSWQ6IHRoaXMubWVzc2FnZVRvUmVhY3Q/LmdldElkKCksXG4gICAgICAgIGVtb2ppOiBlbW9qaSxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cblxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOkNvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pID0+IHtcblxuICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6YW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcblxuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVG9FdmVudHMoKVxuICAgIHRyeSB7XG4gICAgICAvL1JlbW92aW5nIE1lc3NhZ2UgTGlzdGVuZXJzXG4gICAgICBDb21ldENoYXQucmVtb3ZlTWVzc2FnZUxpc3RlbmVyKHRoaXMubXNnTGlzdGVuZXJJZCk7XG4gICAgICBDb21ldENoYXQucmVtb3ZlR3JvdXBMaXN0ZW5lcih0aGlzLmdyb3VwTGlzdGVuZXJJZCk7XG4gICAgICBDb21ldENoYXQucmVtb3ZlQ2FsbExpc3RlbmVyKHRoaXMuY2FsbExpc3RlbmVySWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yOmFueSkge1xuICAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgfVxuICByZWFjdGlvbnNTdHlsZShtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgbGV0IHNlbnRCeU1lOmJvb2xlYW4gPSAhbWVzc2FnZT8uZ2V0U2VuZGVyKCkgfHwgbWVzc2FnZS5nZXRTZW5kZXIoKS5nZXRVaWQoKSA9PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKClcbiAgICBsZXQgaXNMZWZ0QWxpZ25lZDpib29sZWFuID0gdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdCB8fCAhc2VudEJ5TWUgfHwgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubWVzc2FnZVxuXG4gICAgaWYoaXNMZWZ0QWxpZ25lZCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB0ZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMSksXG4gICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBhY3RpdmVUZXh0Q29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgYWN0aXZlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMSksXG4gICAgICBhZGRSZWFjdGlvbkljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBhY3RpdmVSZWFjdGlvbkJhY2tncm91bmQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICByZWFjdGlvbkJhY2tncm91bmQ6XCJ0cmFuc3BhcmVudFwiLFxuICAgICAgcmVhY3Rpb25Cb3JkZXI6YDFweCBzb2xpZCAke3RoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCl9YCxcbiAgICAgIHJlYWN0aW9uQm9yZGVyUmFkaXVzOlwiMTJweFwiLFxuICAgICAgYWRkUmVhY3Rpb25JY29uQmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpXG5cbiAgICB9XG4gICAgfVxuICBlbHNle1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB0ZXh0Rm9udDogICBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbjEpLFxuICAgICAgdGV4dENvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgYWN0aXZlVGV4dENvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICBhY3RpdmVUZXh0Rm9udDogIGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMSksXG4gICAgICBhZGRSZWFjdGlvbkljb25UaW50OiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgYWN0aXZlUmVhY3Rpb25CYWNrZ3JvdW5kOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgcmVhY3Rpb25CYWNrZ3JvdW5kOiAgXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgcmVhY3Rpb25Cb3JkZXI6YDFweCBzb2xpZCAke3RoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCl9YCxcbiAgICAgIHJlYWN0aW9uQm9yZGVyUmFkaXVzOlwiMTJweFwiLFxuICAgICAgYWRkUmVhY3Rpb25JY29uQmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMChcImxpZ2h0XCIpXG4gICAgfVxuICB9XG4gIH1cbiAgc2hvd0Vtb2ppS2V5Ym9hcmQgPShpZDpudW1iZXIsZXZlbnQ6YW55KT0+e1xuICAgIGxldCBtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSB8IGZhbHNlID0gdGhpcy5nZXRNZXNzYWdlQnlJZChpZClcbiAgICBpZihtZXNzYWdlKXtcbiAgICAgIHRoaXMubWVzc2FnZVRvUmVhY3QgPSBtZXNzYWdlXG4gICAgIHRoaXMua2V5Ym9hcmRBbGlnbm1lbnQgPSBtZXNzYWdlLmdldFNlbmRlcigpPy5nZXRVaWQoKSA9PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgPyBQbGFjZW1lbnQubGVmdCA6IFBsYWNlbWVudC5yaWdodFxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICB0aGlzLnBvcG92ZXJSZWYubmF0aXZlRWxlbWVudC5vcGVuQ29udGVudFZpZXcoZXZlbnQpXG5cblxuICAgIH1cblxuICB9XG5cbiAgc2V0QnViYmxlVmlldyA9ICgpID0+IHtcbiAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZS5mb3JFYWNoKChlbGVtZW50OiBDb21ldENoYXRNZXNzYWdlVGVtcGxhdGUpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZVR5cGVzTWFwW2VsZW1lbnQudHlwZV0gPSBlbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgb3BlblRocmVhZFZpZXcgPSAobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UpPT57XG4gICAgaWYodGhpcy5vblRocmVhZFJlcGxpZXNDbGljayl7XG4gICAgICB0aGlzLm9uVGhyZWFkUmVwbGllc0NsaWNrKG1lc3NhZ2UsIHRoaXMudGhyZWFkTWVzc2FnZUJ1YmJsZSlcbiAgICB9XG4gIH1cbiAgdGhyZWFkQ2FsbGJhY2sgPSAoaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlT2JqZWN0OmFueSA9IHRoaXMuZ2V0TWVzc2FnZUJ5SWQoaWQpXG50aGlzLm9wZW5UaHJlYWRWaWV3KG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgZGVsZXRlQ2FsbGJhY2sgPShpZDpudW1iZXIpPT57XG5sZXQgbWVzc2FnZU9iamVjdDphbnkgPSB0aGlzLmdldE1lc3NhZ2VCeUlkKGlkKVxudGhpcy5kZWxldGVNZXNzYWdlKG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgZWRpdENhbGxiYWNrID0oaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlT2JqZWN0OmFueSA9IHRoaXMuZ2V0TWVzc2FnZUJ5SWQoaWQpXG4gICAgdGhpcy5vbkVkaXRNZXNzYWdlKG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgY29weUNhbGxiYWNrID0oaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlT2JqZWN0OmFueSA9IHRoaXMuZ2V0TWVzc2FnZUJ5SWQoaWQpXG4gICAgdGhpcy5vbkNvcHlNZXNzYWdlKG1lc3NhZ2VPYmplY3QpXG4gIH1cbiAgZ2V0TWVzc2FnZUJ5SWQoaWQ6bnVtYmVyKXtcbiAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleChcbiAgICAgIChtKSA9PiBtLmdldElkKCkgPT09IGlkXG4gICAgKTtcbiAgICBpZihtZXNzYWdlS2V5ID4gLTEpe1xuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXNMaXN0W21lc3NhZ2VLZXldXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpc1RyYW5zbGF0ZWQobWVzc2FnZTpDb21ldENoYXQuVGV4dE1lc3NhZ2UpOmFueXtcbiAgICBsZXQgdHJhbnNsYXRlZE1lc3NhZ2VPYmplY3Q6YW55ID0gbWVzc2FnZVxuICAgIGlmICh0cmFuc2xhdGVkTWVzc2FnZU9iamVjdCAmJiB0cmFuc2xhdGVkTWVzc2FnZU9iamVjdD8uZGF0YT8ubWV0YWRhdGEgJiYgdHJhbnNsYXRlZE1lc3NhZ2VPYmplY3Q/LmRhdGE/Lm1ldGFkYXRhW01lc3NhZ2VUcmFuc2xhdGlvbkNvbnN0YW50cy50cmFuc2xhdGVkX21lc3NhZ2VdKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlZE1lc3NhZ2VPYmplY3QuZGF0YS5tZXRhZGF0YVtNZXNzYWdlVHJhbnNsYXRpb25Db25zdGFudHMudHJhbnNsYXRlZF9tZXNzYWdlXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG4gIHVwZGF0ZVRyYW5zbGF0ZWRNZXNzYWdlID0gKHRyYW5zbGF0aW9uOiBhbnkpID0+IHtcbiAgICBjb25zdCByZWNlaXZlZE1lc3NhZ2UgPSB0cmFuc2xhdGlvbjtcbiAgICBjb25zdCB0cmFuc2xhdGVkVGV4dCA9IHJlY2VpdmVkTWVzc2FnZS50cmFuc2xhdGlvbnNbMF0ubWVzc2FnZV90cmFuc2xhdGVkO1xuICAgIGxldCBtZXNzYWdlTGlzdDogQ29tZXRDaGF0LkJhc2VNZXNzYWdlW10gPSBbLi4udGhpcy5tZXNzYWdlc0xpc3RdO1xuICAgIGxldCBtZXNzYWdlS2V5ID0gbWVzc2FnZUxpc3QuZmluZEluZGV4KFxuICAgICAgKG0pID0+IG0uZ2V0SWQoKSA9PT0gcmVjZWl2ZWRNZXNzYWdlLm1zZ0lkXG4gICAgKTtcbiAgICBsZXQgZGF0YTogYW55O1xuICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VPYmo6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSA9IG1lc3NhZ2VMaXN0W21lc3NhZ2VLZXldO1xuICAgICAgaWYgKChtZXNzYWdlT2JqIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuZ2V0TWV0YWRhdGEoKSkge1xuICAgICAgICBkYXRhID0gKG1lc3NhZ2VPYmogYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKS5nZXRNZXRhZGF0YSgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIChtZXNzYWdlT2JqIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuc2V0TWV0YWRhdGEoe30pXG4gICAgICAgIGRhdGEgPSAobWVzc2FnZU9iaiBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpLmdldE1ldGFkYXRhKClcbiAgICAgIH1cbiAgICAgIGRhdGFbTWVzc2FnZVRyYW5zbGF0aW9uQ29uc3RhbnRzLnRyYW5zbGF0ZWRfbWVzc2FnZV0gPSB0cmFuc2xhdGVkVGV4dDtcbiAgICAgIGNvbnN0IG5ld01lc3NhZ2VPYmo6IENvbWV0Q2hhdC5UZXh0TWVzc2FnZSB8IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSA9IG1lc3NhZ2VPYmo7XG4gICAgICBtZXNzYWdlTGlzdC5zcGxpY2UobWVzc2FnZUtleSwgMSwgbmV3TWVzc2FnZU9iaik7XG4gICAgICB0aGlzLm1lc3NhZ2VzTGlzdCA9IFsuLi5tZXNzYWdlTGlzdF07XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIHRyYW5zbGF0ZU1lc3NhZ2UgPSAoaWQ6bnVtYmVyKT0+e1xuICAgIGxldCBtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSB8IGZhbHNlID0gdGhpcy5nZXRNZXNzYWdlQnlJZChpZClcbiAgICBpZihtZXNzYWdlKXtcbiAgICAgIENvbWV0Q2hhdC5jYWxsRXh0ZW5zaW9uKE1lc3NhZ2VUcmFuc2xhdGlvbkNvbnN0YW50cy5tZXNzYWdlX3RyYW5zbGF0aW9uLCBNZXNzYWdlVHJhbnNsYXRpb25Db25zdGFudHMucG9zdCwgTWVzc2FnZVRyYW5zbGF0aW9uQ29uc3RhbnRzLnYyX3RyYW5zbGF0ZSwge1xuICAgICAgICBcIm1zZ0lkXCI6IG1lc3NhZ2UuZ2V0SWQoKSxcbiAgICAgICAgXCJ0ZXh0XCI6IChtZXNzYWdlIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuZ2V0VGV4dCgpLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBuYXZpZ2F0b3IubGFuZ3VhZ2VzXG4gICAgICB9KS50aGVuKChyZXN1bHQ6YW55KSA9PiB7XG4gICAgICAgIGlmKHJlc3VsdD8udHJhbnNsYXRpb25zWzBdPy5tZXNzYWdlX3RyYW5zbGF0ZWQgIT0gKG1lc3NhZ2UgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKT8uZ2V0VGV4dCgpKXtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zbGF0ZWRNZXNzYWdlKHJlc3VsdCk7XG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXN1bHQgb2YgdHJhbnNsYXRpb25zXG4gICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOmFueSkgPT4ge1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbiAgc2V0T3B0aW9uc0NhbGxiYWNrKG9wdGlvbnM6Q29tZXRDaGF0TWVzc2FnZU9wdGlvbltdKSB7XG4gICAgICBvcHRpb25zPy5mb3JFYWNoKChlbGVtZW50OiBDb21ldENoYXRNZXNzYWdlT3B0aW9uKSA9PiB7XG5cbiAgICAgICAgc3dpdGNoIChlbGVtZW50LmlkKSB7XG4gICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLmRlbGV0ZU1lc3NhZ2U6XG4gICAgICAgICAgICBpZighZWxlbWVudC5vbkNsaWNrKXtcbiAgICAgICAgICAgICAgZWxlbWVudC5vbkNsaWNrID0gdGhpcy5kZWxldGVDYWxsYmFja1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLmVkaXRNZXNzYWdlOlxuICAgICAgICAgICAgaWYoIWVsZW1lbnQub25DbGljayl7XG4gICAgICAgICAgICAgIGVsZW1lbnQub25DbGljayA9IHRoaXMuZWRpdENhbGxiYWNrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VPcHRpb24udHJhbnNsYXRlTWVzc2FnZTpcbiAgICAgICAgICAgIGlmKCFlbGVtZW50Lm9uQ2xpY2spe1xuICAgICAgICAgICAgICBlbGVtZW50Lm9uQ2xpY2sgPSB0aGlzLnRyYW5zbGF0ZU1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZU9wdGlvbi5jb3B5TWVzc2FnZTpcbiAgICAgICAgICAgIGlmKCFlbGVtZW50Lm9uQ2xpY2spe1xuICAgICAgICAgICAgICBlbGVtZW50Lm9uQ2xpY2sgPSB0aGlzLmNvcHlDYWxsYmFja1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLnJlYWN0VG9NZXNzYWdlOlxuICAgICAgICAgICAgaWYoIWVsZW1lbnQub25DbGljayl7XG4gICAgICAgICAgICAgIGVsZW1lbnQub25DbGljayA9IHRoaXMuc2hvd0Vtb2ppS2V5Ym9hcmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlT3B0aW9uLnJlcGx5SW5UaHJlYWQ6XG4gICAgICAgICAgICAgIGlmKCFlbGVtZW50Lm9uQ2xpY2spe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQub25DbGljayA9IHRoaXMudGhyZWFkQ2FsbGJhY2tcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cbiAgICAvKipcbiAgICogc2VuZCBtZXNzYWdlIG9wdGlvbnMgYmFzZWQgb24gdHlwZVxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1zZ09iamVjdFxuICAgKi9cbiAgICAgc2V0TWVzc2FnZU9wdGlvbnMobXNnT2JqZWN0OiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBDb21ldENoYXRNZXNzYWdlT3B0aW9uW10ge1xuICAgICAgbGV0IG9wdGlvbnMhOkNvbWV0Q2hhdE1lc3NhZ2VPcHRpb25bXTtcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VUZW1wbGF0ZSAmJiB0aGlzLm1lc3NhZ2VUZW1wbGF0ZS5sZW5ndGggPiAwICYmICFtc2dPYmplY3Q/LmdldERlbGV0ZWRBdCgpICAmJiBtc2dPYmplY3Q/LmdldFR5cGUoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlVHlwZXMuZ3JvdXBNZW1iZXIpIHtcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZS5mb3JFYWNoKChlbGVtZW50OiBDb21ldENoYXRNZXNzYWdlVGVtcGxhdGUpID0+IHtcbiAgICAgICAgICBpZiAobXNnT2JqZWN0Py5nZXRJZCgpICYmIGVsZW1lbnQudHlwZSA9PSBtc2dPYmplY3Q/LmdldFR5cGUoKSAmJiBlbGVtZW50Py5vcHRpb25zKSB7XG4gICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLnNldE9wdGlvbnNDYWxsYmFjayhlbGVtZW50Py5vcHRpb25zKHRoaXMubG9nZ2VkSW5Vc2VyLG1zZ09iamVjdCx0aGlzLnRoZW1lU2VydmljZS50aGVtZSx0aGlzLmdyb3VwKSkgfHwgW11cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZXtcbiAgICAgICAgb3B0aW9ucyA9IFtdXG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uc1xuICAgIH1cbiAgLyoqXG4gICAgICogcGFzc2luZyBzdHlsZSBiYXNlZCBvbiBtZXNzYWdlIG9iamVjdFxuICAgICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZU9iamVjdFxuICAgICAqL1xuICBzZXRNZXNzYWdlQnViYmxlU3R5bGUobXNnOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBCYXNlU3R5bGUge1xuXG4gICAgbGV0IHN0eWxlITogQmFzZVN0eWxlO1xuICAgIGlmIChtc2c/LmdldERlbGV0ZWRBdCgpKSB7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBib3JkZXI6IGAxcHggZGFzaGVkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ0MDAoKX1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTJweFwiLFxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmKG1zZz8uZ2V0VHlwZSgpID09ICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5jYWxscy5tZWV0aW5nICYmICghbXNnPy5nZXRTZW5kZXIoKSB8fCBtc2c/LmdldFNlbmRlcigpLmdldFVpZCgpID09IHRoaXMubG9nZ2VkSW5Vc2VyLmdldFVpZCgpKSl7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICAgIGJvcmRlcjogYG5vbmVgLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTJweFwiLFxuICAgICAgfVxuXG4gICAgfVxuICAgIGVsc2UgaWYodGhpcy5nZXRMaW5rUHJldmlldyhtc2cgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKSl7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpLFxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmKG1zZz8uZ2V0VHlwZSgpID09IFN0aWNrZXJzQ29uc3RhbnRzLnN0aWNrZXIpe1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIxMnB4XCIsXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKCFtc2c/LmdldERlbGV0ZWRBdCgpICYmIG1zZz8uZ2V0Q2F0ZWdvcnkoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubWVzc2FnZSAmJiBtc2c/LmdldFR5cGUoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlVHlwZXMudGV4dCAmJiAoIW1zZz8uZ2V0U2VuZGVyKCkgfHwgdGhpcy5sb2dnZWRJblVzZXIhLmdldFVpZCgpID09IG1zZz8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkpKSB7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdCA/IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCkgOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjEycHhcIixcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIW1zZz8uZ2V0RGVsZXRlZEF0KCkgJiYgbXNnPy5nZXRDYXRlZ29yeSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5tZXNzYWdlICYmIG1zZz8uZ2V0VHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcy5hdWRpbykge1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGJvcmRlclJhZGl1czogXCJcIixcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKSxcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobXNnPy5nZXRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmdyb3VwTWVtYmVyIHx8IG1zZz8uZ2V0Q2F0ZWdvcnkoKSA9PSB0aGlzLmNhbGxDb25zdGFudCkge1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjEycHhcIixcbiAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKX1gXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICBpZihtc2c/LmdldFNlbmRlcigpICYmIG1zZz8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgIT0gdGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkpe1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxMnB4XCIsXG4gICAgICB9XG4gICAgIH1cbiAgICAgZWxzZXtcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTJweFwiLFxuICAgICAgfVxuICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVxuICB9XG4gIGdldFNlc3Npb25JZChtZXNzYWdlOkNvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKXtcbiAgICBsZXQgZGF0YTphbnkgPSBtZXNzYWdlLmdldERhdGEoKVxuICAgIHJldHVybiBkYXRhPy5jdXN0b21EYXRhPy5zZXNzaW9uSURcbiAgfVxuICBnZXRXaGl0ZWJvYXJkRG9jdW1lbnQobWVzc2FnZTpDb21ldENoYXQuQ3VzdG9tTWVzc2FnZSl7XG4gICAgdHJ5IHtcbiAgICAgIGlmICggbWVzc2FnZT8uZ2V0RGF0YSgpKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6YW55ID0gbWVzc2FnZS5nZXREYXRhKCk7XG4gICAgICAgIGlmIChkYXRhPy5tZXRhZGF0YSkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZGF0YT8ubWV0YWRhdGE7XG4gICAgICAgICAgaWYgKENvbWV0Q2hhdFVJS2l0VXRpbGl0eS5jaGVja0hhc093blByb3BlcnR5KG1ldGFkYXRhLFwiQGluamVjdGVkXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmplY3RlZE9iamVjdCA9IG1ldGFkYXRhW1wiQGluamVjdGVkXCJdO1xuICAgICAgICAgICAgaWYgKGluamVjdGVkT2JqZWN0Py5leHRlbnNpb25zKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbk9iamVjdCA9IGluamVjdGVkT2JqZWN0LmV4dGVuc2lvbnM7XG4gICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25PYmplY3RbQ29sbGFib3JhdGl2ZVdoaXRlYm9hcmRDb25zdGFudHMud2hpdGVib2FyZF0gPyAgZXh0ZW5zaW9uT2JqZWN0W0NvbGxhYm9yYXRpdmVXaGl0ZWJvYXJkQ29uc3RhbnRzLndoaXRlYm9hcmRdLmJvYXJkX3VybDogZXh0ZW5zaW9uT2JqZWN0W0NvbGxhYm9yYXRpdmVEb2N1bWVudENvbnN0YW50cy5kb2N1bWVudF0uZG9jdW1lbnRfdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOmFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBvcGVuTGlua1VSTChldmVudDphbnkpe1xuICAgIHdpbmRvdy5vcGVuKGV2ZW50Py5kZXRhaWw/LnVybCwgJ19ibGFuaycpXG4gIH1cbiAgZ2V0U3RpY2tlcihtZXNzYWdlOkNvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzdGlja2VyRGF0YTphbnkgPSBudWxsO1xuICAgICAgaWYgKFxuICAgICAgICBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShtZXNzYWdlLFN0aWNrZXJzQ29uc3RhbnRzLmRhdGEpICYmXG4gICAgICAgQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmNoZWNrSGFzT3duUHJvcGVydHkoIChtZXNzYWdlIGFzIENvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKS5nZXREYXRhKCksU3RpY2tlcnNDb25zdGFudHMuY3VzdG9tX2RhdGEpXG4gICAgICApIHtcbiAgICAgICAgc3RpY2tlckRhdGEgPSAobWVzc2FnZSBhcyBhbnkpLmRhdGEuY3VzdG9tRGF0YTtcbiAgICAgICAgaWYgKENvbWV0Q2hhdFVJS2l0VXRpbGl0eS5jaGVja0hhc093blByb3BlcnR5KHN0aWNrZXJEYXRhLFN0aWNrZXJzQ29uc3RhbnRzLnN0aWNrZXJfdXJsKSkge1xuICAgICAgICAgIHJldHVybiBzdGlja2VyRGF0YS5zdGlja2VyX3VybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgIHJldHVybiBcIlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2V7XG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6YW55KSB7XG4gICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcilcbiAgICAgICB9XG4gICAgfVxuICB9XG4gIGdldENvbnRlbnRWaWV3ID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0+IHtcbiAgICBpZiAodGhpcy5tZXNzYWdlVHlwZXNNYXBbbWVzc2FnZT8uZ2V0VHlwZSgpXSAmJiB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldPy5jb250ZW50Vmlldykge1xuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0/LmNvbnRlbnRWaWV3KG1lc3NhZ2UpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgPyAgdGhpcy50eXBlc01hcFtcInRleHRcIl0gOiB0aGlzLnR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV1cbiAgICB9XG4gIH1cbiAgZ2V0SGVhZGVyVmlldyhtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbHtcbiAgICBsZXQgdmlldzogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsXG4gICAgaWYgKHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0gJiYgdGhpcy5tZXNzYWdlVHlwZXNNYXBbbWVzc2FnZT8uZ2V0VHlwZSgpXT8uaGVhZGVyVmlldykge1xuICAgICAgdmlldyA9IHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0/LmhlYWRlclZpZXcobWVzc2FnZSlcbiAgICAgIHJldHVybiB2aWV3XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbiAgZ2V0Rm9vdGVyVmlldyhtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgbGV0IHZpZXc6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbFxuICAgIGlmICh0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldICYmIHRoaXMubWVzc2FnZVR5cGVzTWFwW21lc3NhZ2U/LmdldFR5cGUoKV0/LmZvb3RlclZpZXcpIHtcbiAgICAgIHZpZXcgPSB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldPy5mb290ZXJWaWV3KG1lc3NhZ2UpXG4gICAgICByZXR1cm4gdmlldztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgc2V0QnViYmxlQWxpZ25tZW50ID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIGxldCBhbGlnbm1lbnQ6TWVzc2FnZUJ1YmJsZUFsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQuY2VudGVyXG4gICAgaWYgKHRoaXMuYWxpZ25tZW50ID09IE1lc3NhZ2VMaXN0QWxpZ25tZW50LmxlZnQpIHtcbiAgICAgIGFsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQubGVmdFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChtZXNzYWdlPy5nZXRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmdyb3VwTWVtYmVyIHx8IG1lc3NhZ2UuZ2V0Q2F0ZWdvcnkoKSA9PSB0aGlzLmNhbGxDb25zdGFudCkge1xuICAgICAgICBhbGlnbm1lbnQgPSBNZXNzYWdlQnViYmxlQWxpZ25tZW50LmNlbnRlclxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8IG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpID09IHRoaXMubG9nZ2VkSW5Vc2VyLmdldFVpZCgpICYmIG1lc3NhZ2U/LmdldFR5cGUoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlVHlwZXMuZ3JvdXBNZW1iZXIpIHtcbiAgICAgICAgYWxpZ25tZW50ID0gTWVzc2FnZUJ1YmJsZUFsaWdubWVudC5yaWdodFxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGFsaWdubWVudCA9IE1lc3NhZ2VCdWJibGVBbGlnbm1lbnQubGVmdFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxpZ25tZW50XG4gIH1cbiAgZ2V0Q2FsbEJ1YmJsZVN0eWxlKG1lc3NhZ2U6Q29tZXRDaGF0LkJhc2VNZXNzYWdlKXtcbiAgICBjb25zdCBpc0xlZnRBbGlnbmVkID0gdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdDtcbiAgICBjb25zdCBpc1VzZXJTZW50TWVzc2FnZSA9ICFtZXNzYWdlPy5nZXRTZW5kZXIoKSB8fCB0aGlzLmxvZ2dlZEluVXNlciEuZ2V0VWlkKCkgPT09IG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpO1xuICAgIGlmKGlzVXNlclNlbnRNZXNzYWdlICYmICAhaXNMZWZ0QWxpZ25lZCl7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZUZvbnQ6ICBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgICB0aXRsZUNvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgICBpY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgICBidXR0b25UZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQyKSxcbiAgICAgICAgYnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgICAgYnV0dG9uQmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJkYXJrXCIpLFxuICAgICAgICB3aWR0aDpcIjI0MHB4XCJcbiAgICAgIH1cblxuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGVGb250OiAgZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQyKSxcbiAgICAgICAgdGl0bGVDb2xvcjogIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgICAgIGljb25UaW50OiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICAgIGJ1dHRvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgICBidXR0b25UZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICAgICAgICBidXR0b25CYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudChcImRhcmtcIiksXG4gICAgICAgIHdpZHRoOlwiMjQwcHhcIlxuICAgICAgfVxuICAgIH1cblxuICB9XG4gIGdldEJ1YmJsZVdyYXBwZXIgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPT4ge1xuICAgIGxldCB2aWV3OiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbDtcbiAgICBpZiAodGhpcy5tZXNzYWdlVHlwZXNNYXAgJiYgdGhpcy5tZXNzYWdlVHlwZXNNYXBbbWVzc2FnZT8uZ2V0VHlwZSgpXSAmJiB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldLmJ1YmJsZVZpZXcpIHtcbiAgICAgIHZpZXcgPSB0aGlzLm1lc3NhZ2VUeXBlc01hcFttZXNzYWdlPy5nZXRUeXBlKCldLmJ1YmJsZVZpZXcobWVzc2FnZSlcbiAgICAgIHJldHVybiB2aWV3XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmlldyA9IG51bGxcbiAgICAgIHJldHVybiB2aWV3XG4gICAgfVxuICB9XG4gIGdldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgcmV0dXJuIHRoaXMuYWxpZ25tZW50ID09IE1lc3NhZ2VMaXN0QWxpZ25tZW50LmxlZnQgfHwgKG1lc3NhZ2UuZ2V0U2VuZGVyKCkgJiYgbWVzc2FnZS5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPSB0aGlzLmxvZ2dlZEluVXNlci5nZXRVaWQoKSkgPyBNZXNzYWdlQnViYmxlQWxpZ25tZW50LmxlZnQgOiBNZXNzYWdlQnViYmxlQWxpZ25tZW50LnJpZ2h0XG4gIH1cbiAgc2V0VHJhbnNsYXRpb25TdHlsZSA9IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpPT57XG4gICAgY29uc3QgaXNMZWZ0QWxpZ25lZCA9IHRoaXMuYWxpZ25tZW50ICE9PSBNZXNzYWdlTGlzdEFsaWdubWVudC5sZWZ0O1xuICAgIGNvbnN0IGlzVXNlclNlbnRNZXNzYWdlID0gIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8IHRoaXMubG9nZ2VkSW5Vc2VyIS5nZXRVaWQoKSA9PT0gbWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCk7XG4gICAgaWYgKCAhaXNMZWZ0QWxpZ25lZCkge1xuICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlVHJhbnNsYXRpb25TdHlsZSh7XG4gICAgICAgIHRyYW5zbGF0ZWRUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQzKSxcbiAgICAgICAgdHJhbnNsYXRlZFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJsaWdodFwiKSxcbiAgICAgICAgaGVscFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgICAgaGVscFRleHRGb250OmZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMiksXG4gICAgICAgIGJhY2tncm91bmQ6XCJ0cmFuc3BhcmVudFwiXG4gICAgICB9KTtcbiAgICB9XG4gICBlbHNle1xuICAgaWYgKGlzVXNlclNlbnRNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gbmV3IE1lc3NhZ2VUcmFuc2xhdGlvblN0eWxlKHtcbiAgICAgICAgdHJhbnNsYXRlZFRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDMpLFxuICAgICAgICB0cmFuc2xhdGVkVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudChcImRhcmtcIiksXG4gICAgICAgIGhlbHBUZXh0Q29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoXCJkYXJrXCIpLFxuICAgICAgICBoZWxwVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LmNhcHRpb24yKSxcbiAgICAgICAgYmFja2dyb3VuZDpcInRyYW5zcGFyZW50XCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlVHJhbnNsYXRpb25TdHlsZSh7XG4gICAgICAgIHRyYW5zbGF0ZWRUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQzKSxcbiAgICAgICAgdHJhbnNsYXRlZFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoXCJsaWdodFwiKSxcbiAgICAgICAgaGVscFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgICAgaGVscFRleHRGb250OmZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMiksXG4gICAgICAgIGJhY2tncm91bmQ6XCJ0cmFuc3BhcmVudFwiXG4gICAgICB9KTtcbiAgICB9XG4gICB9XG4gIH1cbiAgZ2V0Q2FsbFR5cGVJY29uKG1lc3NhZ2U6Q29tZXRDaGF0LkJhc2VNZXNzYWdlKXtcbiAgICBpZiAobWVzc2FnZS5nZXRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmF1ZGlvKSB7XG4gICAgICByZXR1cm4gXCJhc3NldHMvQXVkaW8tQ2FsbC5zdmdcIlxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBcImFzc2V0cy9WaWRlby1jYWxsLnN2Z1wiXG4gICAgfVxuICB9XG4gIGNhbGxTdGF0dXNTdHlsZShtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2Upe1xuICAgIGlmKG1lc3NhZ2UuZ2V0Q2F0ZWdvcnkoKSA9PSB0aGlzLmNhbGxDb25zdGFudCl7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidXR0b25UZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMiksXG4gICAgICAgIGJ1dHRvblRleHRDb2xvcjogQ2FsbGluZ0RldGFpbHNVdGlscy5pc01pc3NlZENhbGwobWVzc2FnZSBhcyBDb21ldENoYXQuQ2FsbCwgdGhpcy5sb2dnZWRJblVzZXIpID8gdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRFcnJvcigpIDogIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgIGJvcmRlcjogQ2FsbGluZ0RldGFpbHNVdGlscy5pc01pc3NlZENhbGwobWVzc2FnZSBhcyBDb21ldENoYXQuQ2FsbCwgdGhpcy5sb2dnZWRJblVzZXIpID8gYDFweCBzb2xpZCBSR0JBKDI1NSwgNTksIDQ4LCAwLjIpYCA6IGAxcHggc29saWQgJHt0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpfWAsXG4gICAgICAgIGJ1dHRvbkljb25UaW50OiBDYWxsaW5nRGV0YWlsc1V0aWxzLmlzTWlzc2VkQ2FsbChtZXNzYWdlIGFzIENvbWV0Q2hhdC5DYWxsLCB0aGlzLmxvZ2dlZEluVXNlcikgPyB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEVycm9yKCkgOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIGljb25CYWNrZ3JvdW5kOlwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgcGFkZGluZzpcIjJweCAxMnB4IDJweCAwXCIsXG4gICAgICAgIGdhcDpcIjBcIixcbiAgICAgICAgaGVpZ2h0OlwiMjVweFwiLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDpcImNlbnRlclwiXG4gICAgICB9O1xuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbiAgc2V0VGV4dEJ1YmJsZVN0eWxlID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIGNvbnN0IGlzRGVsZXRlZCA9IG1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCk7XG4gICAgY29uc3QgaXNMZWZ0QWxpZ25lZCA9IHRoaXMuYWxpZ25tZW50ICE9PSBNZXNzYWdlTGlzdEFsaWdubWVudC5sZWZ0O1xuICAgIGNvbnN0IGlzVGV4dE1lc3NhZ2UgPSBtZXNzYWdlLmdldENhdGVnb3J5KCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5tZXNzYWdlICYmIG1lc3NhZ2U/LmdldFR5cGUoKSA9PT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLnRleHQ7XG4gICAgY29uc3QgaXNVc2VyU2VudE1lc3NhZ2UgPSAhbWVzc2FnZT8uZ2V0U2VuZGVyKCkgfHwgdGhpcy5sb2dnZWRJblVzZXIhLmdldFVpZCgpID09PSBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKTtcbiAgICBjb25zdCBpc0dyb3VwTWVtYmVyTWVzc2FnZSA9IG1lc3NhZ2U/LmdldFR5cGUoKSA9PT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVR5cGVzLmdyb3VwTWVtYmVyO1xuICAgIGlmKHRoaXMuZ2V0TGlua1ByZXZpZXcobWVzc2FnZSBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpKXtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDMpLFxuICAgICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghaXNEZWxldGVkICYmIGlzTGVmdEFsaWduZWQgJiYgaXNUZXh0TWVzc2FnZSAmJiBpc1VzZXJTZW50TWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50ZXh0MyksXG4gICAgICAgIHRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ5MDAoXCJsaWdodFwiKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFpc0RlbGV0ZWQgJiYgaXNMZWZ0QWxpZ25lZCAmJiBpc1RleHRNZXNzYWdlICYmICFpc1VzZXJTZW50TWVzc2FnZSAmJiAhaXNHcm91cE1lbWJlck1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDMpLFxuICAgICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0dyb3VwTWVtYmVyTWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTIpLFxuICAgICAgICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgdGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDQwMCgpXG4gICAgfTtcbiAgfVxuICBzZXRGaWxlQnViYmxlU3R5bGUobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UpOmFueXtcbiAgICBjb25zdCBpc0ZpbGVNZXNzYWdlID0gbWVzc2FnZS5nZXRDYXRlZ29yeSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubWVzc2FnZSAmJiBtZXNzYWdlPy5nZXRUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VUeXBlcy5maWxlO1xuaWYoaXNGaWxlTWVzc2FnZSl7XG4gIHJldHVybiB7XG4gICAgdGl0bGVGb250OiBmb250SGVscGVyKHRoaXMudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgIHRpdGxlQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgc3VidGl0bGVGb250OiBmb250SGVscGVyKHRoaXMudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTIpLFxuICAgIHN1YnRpdGxlQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgaWNvblRpbnQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICB9O1xufVxuZWxzZXtcbiAgcmV0dXJuXG59XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW9Cb3R0b20oKTtcbiAgICB0aGlzLmlvVG9wKCk7XG4gICAgdGhpcy5jaGVja01lc3NhZ2VUZW1wbGF0ZSgpXG4gIH1cbiAgc3RhcnREaXJlY3RDYWxsID0oc2Vzc2lvbklkOnN0cmluZykgPT57XG4gICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZFxuICAgICAgdGhpcy5zaG93T25nb2luZ0NhbGwgPSB0cnVlO1xuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgfVxuICBsYXVuY2hDb2xsYWJvcmF0aXZlV2hpdGVib2FyZERvY3VtZW50ID0odXJsOnN0cmluZyk9PiB7XG4gICAgd2luZG93Lm9wZW4odXJsLCBcIlwiLCBcImZ1bGxzY3JlZW49eWVzLCBzY3JvbGxiYXJzPWF1dG9cIik7XG4gIH1cblxuXG4gICAgLyoqXG4gICAqIEV4dHJhY3RpbmcgIHR5cGVzIGFuZCBjYXRlZ29yaWVzIGZyb20gdGVtcGxhdGVcbiAgICpcbiAgICovXG5cblxuICBjaGVja01lc3NhZ2VUZW1wbGF0ZSgpe1xuICAgIHRoaXMudHlwZXNNYXAgPSB7XG4gICAgICB0ZXh0OiB0aGlzLnRleHRCdWJibGUsXG4gICAgICBmaWxlOiB0aGlzLmZpbGVCdWJibGUsXG4gICAgICBhdWRpbzogdGhpcy5hdWRpb0J1YmJsZSxcbiAgICAgIHZpZGVvOiB0aGlzLnZpZGVvQnViYmxlLFxuICAgICAgaW1hZ2U6IHRoaXMuaW1hZ2VCdWJibGUsXG4gICAgICBncm91cE1lbWJlcjogdGhpcy50ZXh0QnViYmxlLFxuICAgICAgZXh0ZW5zaW9uX3N0aWNrZXI6dGhpcy5zdGlja2VyQnViYmxlLFxuICAgICAgZXh0ZW5zaW9uX3doaXRlYm9hcmQ6dGhpcy53aGl0ZWJvYXJkQnViYmxlLFxuICAgICAgZXh0ZW5zaW9uX2RvY3VtZW50OnRoaXMuZG9jdW1lbnRCdWJibGUsXG4gICAgICBleHRlbnNpb25fcG9sbDp0aGlzLnBvbGxCdWJibGUsXG4gICAgICBtZWV0aW5nOnRoaXMuZGlyZWN0Q2FsbGluZ1xuXG4gICAgfVxuICAgIHRoaXMuc2V0QnViYmxlVmlldygpXG4gIH1cbiAgZ2V0UG9sbEJ1YmJsZURhdGEobWVzc2FnZTpDb21ldENoYXQuQ3VzdG9tTWVzc2FnZSwgdHlwZT86c3RyaW5nKXtcbiAgIGxldCBkYXRhOmFueSA9ICBtZXNzYWdlLmdldEN1c3RvbURhdGEoKVxuICAgIGlmKHR5cGUpe1xuICAgICByZXR1cm4gZGF0YVt0eXBlXVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0VWlkKClcbiAgICB9XG4gIH1cbiAgZ2V0VGhyZWFkQ291bnQobWVzc2FnZTpDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICBjb25zdCByZXBseUNvdW50ID0gbWVzc2FnZT8uZ2V0UmVwbHlDb3VudCgpIHx8IDA7XG4gICAgY29uc3Qgc3VmZml4ID0gcmVwbHlDb3VudCA9PT0gMSA/IGxvY2FsaXplKFwiUkVQTFlcIikgOiBsb2NhbGl6ZShcIlJFUExJRVNcIik7XG4gICAgcmV0dXJuIGAke2xvY2FsaXplKFwiVklFV1wiKX0gJHtyZXBseUNvdW50fSAke3N1ZmZpeH1gO1xuICB9XG4gIHNob3dFbmFibGVkRXh0ZW5zaW9ucygpe1xuICAgIGlmIChDaGF0Q29uZmlndXJhdG9yLm5hbWVzLmluY2x1ZGVzKCd0ZXh0bW9kZXJhdG9yJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlRGF0YU1hc2tpbmcgPSB0cnVlXG4gICAgfVxuICAgIGlmIChDaGF0Q29uZmlndXJhdG9yLm5hbWVzLmluY2x1ZGVzKCd0aHVtYm5haWxnZW5lcmF0aW9uJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlVGh1bWJuYWlsR2VuZXJhdGlvbiA9IHRydWVcbiAgICB9XG4gICAgaWYgKENoYXRDb25maWd1cmF0b3IubmFtZXMuaW5jbHVkZXMoJ2xpbmtwcmV2aWV3JykpIHtcbiAgICAgIHRoaXMuZW5hYmxlTGlua1ByZXZpZXcgPSB0cnVlXG4gICAgfVxuICAgIGlmIChDaGF0Q29uZmlndXJhdG9yLm5hbWVzLmluY2x1ZGVzKCdwb2xscycpKSB7XG4gICAgICB0aGlzLmVuYWJsZVBvbGxzID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygncmVhY3Rpb25zJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlUmVhY3Rpb25zID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygnaW1hZ2Vtb2RlcmF0aW9uJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlSW1hZ2VNb2RlcmF0aW9uID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygnc3RpY2tlcnMnKSkge1xuICAgICAgdGhpcy5lbmFibGVTdGlja2VycyA9IHRydWVcbiAgICB9XG4gICAgaWYgKENoYXRDb25maWd1cmF0b3IubmFtZXMuaW5jbHVkZXMoJ2NvbGxhYm9yYXRpdmV3aGl0ZWJvYXJkJykpIHtcbiAgICAgIHRoaXMuZW5hYmxlV2hpdGVib2FyZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKENoYXRDb25maWd1cmF0b3IubmFtZXMuaW5jbHVkZXMoJ2NvbGxhYm9yYXRpdmVkb2N1bWVudCcpKSB7XG4gICAgICB0aGlzLmVuYWJsZURvY3VtZW50ID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoQ2hhdENvbmZpZ3VyYXRvci5uYW1lcy5pbmNsdWRlcygnY2FsbGluZycpKSB7XG4gICAgICB0aGlzLmVuYWJsZUNhbGxpbmcgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5Db25maXJtRGlhbG9nOmJvb2xlYW4gPSBmYWxzZVxuICBwdWJsaWMgb3BlbkZ1bGxzY3JlZW5WaWV3OmJvb2xlYW4gPSBmYWxzZVxuICBwdWJsaWMgaW1hZ2V1cmxUb09wZW46c3RyaW5nID0gXCJcIjtcbiAgZnVsbFNjcmVlblZpZXdlclN0eWxlOkZ1bGxTY3JlZW5WaWV3ZXJTdHlsZSA9IHtcbmhlaWdodDpcIjEwMCVcIixcbndpZHRoOlwiMTAwJVwiLFxuY2xvc2VJY29uVGludDpcImJsdWVcIlxuICB9XG4gIG9wZW5JbWFnZUluRnVsbFNjcmVlbihtZXNzYWdlOmFueSl7XG4gICAgdGhpcy5pbWFnZXVybFRvT3BlbiA9IG1lc3NhZ2U/LmRhdGE/LmF0dGFjaG1lbnRzWzBdPy51cmxcbiAgICB0aGlzLm9wZW5GdWxsc2NyZWVuVmlldyA9IHRydWVcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuICBjbG9zZUltYWdlSW5GdWxsU2NyZWVuKCl7XG4gICAgdGhpcy5pbWFnZXVybFRvT3BlbiA9IFwiXCJcbiAgICB0aGlzLm9wZW5GdWxsc2NyZWVuVmlldyA9IGZhbHNlXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cbiAgb3Blbldhcm5pbmdEaWFsb2coZXZlbnQ6YW55KXtcbnRoaXMuY2xvc2VJbWFnZU1vZGVyYXRpb24gPSBldmVudD8uZGV0YWlsPy5vbkNvbmZpcm1cbnRoaXMub3BlbkNvbmZpcm1EaWFsb2cgPSB0cnVlO1xudGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgfVxuICBvbkNvbmZpcm1DbGljayA9ICgpPT57XG4gICAgdGhpcy5vcGVuQ29uZmlybURpYWxvZyA9IGZhbHNlO1xuICAgIGlmKHRoaXMuY2xvc2VJbWFnZU1vZGVyYXRpb24gKXtcbiAgICAgIHRoaXMuY2xvc2VJbWFnZU1vZGVyYXRpb24gKClcbiAgICB9XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cbiAgb25DYW5jZWxDbGljaygpe1xuICAgIHRoaXMub3BlbkNvbmZpcm1EaWFsb2cgPSBmYWxzZTtcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuICBnZXRUZXh0TWVzc2FnZShtZXNzYWdlOiBDb21ldENoYXQuVGV4dE1lc3NhZ2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuYWJsZURhdGFNYXNraW5nID8gQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmdldEV4dGVuc2lvbkRhdGEobWVzc2FnZSkgOiBudWxsO1xuICAgIHJldHVybiB0ZXh0Py50cmltKCk/Lmxlbmd0aCA+IDAgPyB0ZXh0IDogbWVzc2FnZS5nZXRUZXh0KCk7XG4gIH1cbiAgZ2V0TGlua1ByZXZpZXcobWVzc2FnZTpDb21ldENoYXQuVGV4dE1lc3NhZ2UpOmFueXtcbiAgICB0cnkge1xuICAgICAgaWYgKG1lc3NhZ2U/LmdldE1ldGFkYXRhKCkgJiYgdGhpcy5lbmFibGVMaW5rUHJldmlldykge1xuICAgICAgICBjb25zdCBtZXRhZGF0YTphbnkgPSBtZXNzYWdlLmdldE1ldGFkYXRhKCk7XG4gICAgICAgIGNvbnN0IGluamVjdGVkT2JqZWN0ID0gbWV0YWRhdGFbTGlua1ByZXZpZXdDb25zdGFudHMuaW5qZWN0ZWRdO1xuICAgICAgICBpZiAoaW5qZWN0ZWRPYmplY3QgJiYgaW5qZWN0ZWRPYmplY3Q/LmV4dGVuc2lvbnMpIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb25zT2JqZWN0ID0gaW5qZWN0ZWRPYmplY3QuZXh0ZW5zaW9ucztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBleHRlbnNpb25zT2JqZWN0ICYmXG4gICAgICAgICAgICBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShleHRlbnNpb25zT2JqZWN0LExpbmtQcmV2aWV3Q29uc3RhbnRzLmxpbmtfcHJldmlldylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtQcmV2aWV3T2JqZWN0ID0gZXh0ZW5zaW9uc09iamVjdFtMaW5rUHJldmlld0NvbnN0YW50cy5saW5rX3ByZXZpZXddO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBsaW5rUHJldmlld09iamVjdCAmJlxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShsaW5rUHJldmlld09iamVjdCwgTGlua1ByZXZpZXdDb25zdGFudHMubGlua3MpICYmXG4gICAgICAgICAgICAgIGxpbmtQcmV2aWV3T2JqZWN0WyBMaW5rUHJldmlld0NvbnN0YW50cy5saW5rc10ubGVuZ3RoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGxpbmtQcmV2aWV3T2JqZWN0WyBMaW5rUHJldmlld0NvbnN0YW50cy5saW5rc11bMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZXtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjphbnkpIHtcbiAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgIH1cbiAgICB9XG4gIH1cbiAgIGdldEltYWdlVGh1bWJuYWlsKG1zZzogQ29tZXRDaGF0Lk1lZGlhTWVzc2FnZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWVzc2FnZTphbnkgPSBtc2cgYXMgQ29tZXRDaGF0Lk1lZGlhTWVzc2FnZTtcbiAgICBsZXQgaW1hZ2VVUkwgPSBcIlwiO1xuICAgIGlmICh0aGlzLmVuYWJsZVRodW1ibmFpbEdlbmVyYXRpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOmFueSA9IG1lc3NhZ2UuZ2V0TWV0YWRhdGEoKTtcbiAgICAgICAgY29uc3QgaW5qZWN0ZWRPYmplY3QgPSBtZXRhZGF0YT8uW1RodW1ibmFpbEdlbmVyYXRpb25Db25zdGFudHMuaW5qZWN0ZWRdIGFzIHsgZXh0ZW5zaW9ucz86IGFueSB9O1xuICAgICAgICBjb25zdCBleHRlbnNpb25zT2JqZWN0ID0gaW5qZWN0ZWRPYmplY3Q/LmV4dGVuc2lvbnM7XG4gICAgICAgIGNvbnN0IHRodW1ibmFpbEdlbmVyYXRpb25PYmplY3QgPSBleHRlbnNpb25zT2JqZWN0W1RodW1ibmFpbEdlbmVyYXRpb25Db25zdGFudHMudGh1bWJuYWlsX2dlbmVyYXRpb25dO1xuICAgICAgICBjb25zdCBpbWFnZVRvRG93bmxvYWQgPSB0aHVtYm5haWxHZW5lcmF0aW9uT2JqZWN0Py51cmxfc21hbGw7XG4gICAgICAgIGlmIChpbWFnZVRvRG93bmxvYWQpIHtcbiAgICAgICAgICBpbWFnZVVSTCA9IGltYWdlVG9Eb3dubG9hZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltYWdlVVJMID0gbWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8udXJsIDogXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMub25FcnJvcikge1xuICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW1hZ2VVUkwgPSBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50cyA/IG1lc3NhZ2U/LmRhdGE/LmF0dGFjaG1lbnRzWzBdPy51cmwgOiBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gaW1hZ2VVUkw7XG4gIH1cbiAgZ2V0TGlua1ByZXZpZXdEZXRhaWxzKGtleTpzdHJpbmcsbWVzc2FnZTpDb21ldENoYXQuVGV4dE1lc3NhZ2UpOnN0cmluZ3tcbiAgICBsZXQgbGlua1ByZXZpZXdPYmplY3Q6YW55ID0gdGhpcy5nZXRMaW5rUHJldmlldyhtZXNzYWdlKVxuICAgIGlmKE9iamVjdC5rZXlzKGxpbmtQcmV2aWV3T2JqZWN0KS5sZW5ndGggPiAwKXtcbiAgICAgIHJldHVybiBsaW5rUHJldmlld09iamVjdFtrZXldXG4gICAgfVxuICAgIGVsc2V7XG4gICAgICByZXR1cm4gXCJcIlxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5zZXRNZXNzYWdlc1N0eWxlKClcbiAgICB0aGlzLnNldEF2YXRhclN0eWxlKClcbiAgICB0aGlzLnNldERhdGVTdHlsZSgpXG4gICAgdGhpcy5zZXRSZWNlaXB0U3R5bGUoKVxuICAgIHRoaXMuc3Vic2NyaWJlVG9FdmVudHMoKVxuICAgIHRoaXMuc2V0T25nb2luZ0NhbGxTdHlsZSgpXG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkaW5nXG4gICAgQ29tZXRDaGF0LmdldExvZ2dlZGluVXNlcigpLnRoZW4oKHVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSB1c2VyIGFzIENvbWV0Q2hhdC5Vc2VyXG4gICAgfSkuY2F0Y2goKGVycm9yOkNvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pPT57XG4gICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmRhdGVTZXBhcmF0b3JTdHlsZS5iYWNrZ3JvdW5kID0gIHRoaXMuZGF0ZVNlcGFyYXRvclN0eWxlLmJhY2tncm91bmQgIHx8ICB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpXG4gICAgdGhpcy5kaXZpZGVyU3R5bGUuYmFja2dyb3VuZCA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKClcbiAgfVxuICBzZXRPbmdvaW5nQ2FsbFN0eWxlID0gKCkgPT4ge1xuICAgIGxldCBkZWZhdWx0U3R5bGUgPSBuZXcgQ2FsbHNjcmVlblN0eWxlKHtcbiAgICAgIG1heEhlaWdodDogXCIxMDAlXCIsXG4gICAgICBtYXhXaWR0aDogXCIxMDAlXCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjBcIixcbiAgICAgIGJhY2tncm91bmQ6IFwiIzFjMjIyNlwiLFxuICAgICAgbWluSGVpZ2h0OiBcIjQwMHB4XCIsXG4gICAgICBtaW5XaWR0aDogXCI0MDBweFwiLFxuICAgICAgbWluaW1pemVJY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ5MDAoKSxcbiAgICAgIG1heGltaXplSWNvblRpbnQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50OTAwKCksXG4gICAgfSlcbiAgICB0aGlzLm9uZ29pbmdDYWxsU3R5bGUgPSB7IC4uLmRlZmF1bHRTdHlsZSwgLi4udGhpcy5vbmdvaW5nQ2FsbFN0eWxlIH1cbiAgfVxuICBzZXRBdmF0YXJTdHlsZSgpe1xuICAgIGxldCBkZWZhdWx0U3R5bGU6QXZhdGFyU3R5bGUgPSBuZXcgQXZhdGFyU3R5bGUoe1xuICAgICAgYm9yZGVyUmFkaXVzOiBcIjI0cHhcIixcbiAgICAgIHdpZHRoOiBcIjI4cHhcIixcbiAgICAgIGhlaWdodDogXCIyOHB4XCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDcwMCgpLFxuICAgICAgbmFtZVRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ5MDAoKSxcbiAgICAgIGJhY2tncm91bmRTaXplOiBcImNvdmVyXCIsXG4gICAgICBuYW1lVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgICAgb3V0ZXJWaWV3Qm9yZGVyOiBcIlwiLFxuICAgICAgb3V0ZXJWaWV3Qm9yZGVyU3BhY2luZzogXCJcIixcbiAgICB9KVxuICAgIHRoaXMuYXZhdGFyU3R5bGUgPSB7Li4uZGVmYXVsdFN0eWxlLC4uLnRoaXMuYXZhdGFyU3R5bGV9XG4gIH1cbnNldERhdGVTdHlsZSgpe1xuIGxldCBkZWZhdWx0U3R5bGUgPSBuZXcgRGF0ZVN0eWxlKHtcbiAgdGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICB0ZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gIGJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gIGhlaWdodDogXCIxMDAlXCIsXG4gIHdpZHRoOiBcIjEwMCVcIixcbiAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKX1gLFxuICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gIH0pXG4gIHRoaXMuZGF0ZVNlcGFyYXRvclN0eWxlID0gey4uLmRlZmF1bHRTdHlsZSwuLi50aGlzLmRhdGVTZXBhcmF0b3JTdHlsZX1cbn1cbiAgc2V0TWVzc2FnZXNTdHlsZSgpe1xuICAgIHRoaXMuc21hcnRSZXBseVN0eWxlID0ge1xuICAgICAgcmVwbHlUZXh0Rm9udDpmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbjEpLFxuICAgICAgcmVwbHlUZXh0Q29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHJlcGx5QmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGJveFNoYWRvdzpgMHB4IDBweCAxcHggJHt0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpfWAsXG4gICAgICBjbG9zZUljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBiYWNrZ3JvdW5kOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QmFja2dyb3VuZCgpLFxuICAgICAgLi4udGhpcy5zbWFydFJlcGx5U3R5bGVcbiAgICB9XG4gICAgdGhpcy5mdWxsU2NyZWVuVmlld2VyU3R5bGUuY2xvc2VJY29uVGludCA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpXG4gICAgbGV0IGRlZmF1bHRTdHlsZTpNZXNzYWdlTGlzdFN0eWxlID0gbmV3IE1lc3NhZ2VMaXN0U3R5bGUoe1xuICAgICAgYmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGJvcmRlcjpgbm9uZWAsXG4gICAgICBlbXB0eVN0YXRlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICBlbXB0eVN0YXRlVGV4dENvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBlcnJvclN0YXRlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICBlcnJvclN0YXRlVGV4dENvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBsb2FkaW5nSWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIG5hbWVUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMiksXG4gICAgICBuYW1lVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgdGhyZWFkUmVwbHlTZXBhcmF0b3JDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ0MDAoKSxcbiAgICAgIHRocmVhZFJlcGx5VGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgICAgdGhyZWFkUmVwbHlJY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIHRocmVhZFJlcGx5VGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgVGltZXN0YW1wVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5jYXB0aW9uMiksXG4gICAgICBUaW1lc3RhbXBUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgfSlcbiAgICB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUgPSB7Li4uZGVmYXVsdFN0eWxlLC4uLnRoaXMubWVzc2FnZUxpc3RTdHlsZX1cbiAgICB0aGlzLmJ1YmJsZURhdGVTdHlsZSA9IHtcbiAgICAgIHRleHRDb2xvcjogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLlRpbWVzdGFtcFRleHRDb2xvciB8fCB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgdGV4dEZvbnQ6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5UaW1lc3RhbXBUZXh0Rm9udCB8fCBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbjIpXG4gICAgfVxuICAgIHRoaXMubGlua1ByZXZpZXdTdHlsZSA9ICAgbmV3IExpbmtQcmV2aWV3U3R5bGUoe1xuICAgICAgdGl0bGVDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMiksXG4gICAgICBkZXNjcmlwdGlvbkNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgZGVzY3JpcHRpb25Gb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCJcbiAgICB9KVxuICAgIHRoaXMuZG9jdW1lbnRCdWJibGVTdHlsZSA9IHtcbiAgICAgIHRpdGxlRm9udDogIGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50ZXh0MiksXG4gICAgICB0aXRsZUNvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHN1YnRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMiksXG4gICAgICBzdWJ0aXRsZUNvbG9yOiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIGljb25UaW50OiAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgIGJ1dHRvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgYnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgIGJ1dHRvbkJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIHNlcGFyYXRvckNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDIwMCgpXG4gICAgfVxuXG4gICAgdGhpcy5wb2xsQnViYmxlU3R5bGUgPSB7XG4gICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICB2b3RlUGVyY2VudFRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICAgIHZvdGVQZXJjZW50VGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgcG9sbFF1ZXN0aW9uVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuICAgICAgcG9sbFF1ZXN0aW9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudCgpLFxuICAgICAgcG9sbE9wdGlvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgcG9sbE9wdGlvblRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIHBvbGxPcHRpb25CYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMCgpLFxuICAgICAgb3B0aW9uc0ljb25UaW50OiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgdG90YWxWb3RlQ291bnRUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMiksXG4gICAgICB0b3RhbFZvdGVDb3VudFRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIHNlbGVjdGVkUG9sbE9wdGlvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCksXG4gICAgICB1c2VyU2VsZWN0ZWRPcHRpb25CYWNrZ3JvdW5kOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICAgICAgcG9sbE9wdGlvbkJvcmRlcjpgMXB4IHNvbGlkICR7dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKX1gLFxuICAgICAgcG9sbE9wdGlvbkJvcmRlclJhZGl1czpcIjhweFwiXG4gICAgfVxuICAgIHRoaXMuaW1hZ2VNb2RlcmF0aW9uU3R5bGUgPSB7XG4gICAgICBmaWx0ZXJDb2xvcjp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgIGhlaWdodDpcIjEwMCVcIixcbiAgICAgIHdpZHRoOlwiMTAwJVwiLFxuICAgICAgYm9yZGVyOlwibm9uZVwiLFxuICAgICAgd2FybmluZ1RleHRDb2xvcjp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudChcImRhcmtcIiksXG4gICAgICB3YXJuaW5nVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMiksXG4gICAgfVxuICAgIHRoaXMuY29uZmlybURpYWxvZ1N0eWxlID0ge1xuICAgICAgY29uZmlybUJ1dHRvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0RXJyb3IoKSxcbiAgICAgIGNhbmNlbEJ1dHRvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0U2Vjb25kYXJ5KCksXG4gICAgICBjb25maXJtQnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMChcImxpZ2h0XCIpLFxuICAgICAgY29uZmlybUJ1dHRvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgY2FuY2VsQnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMChcImRhcmtcIiksXG4gICAgICBjYW5jZWxCdXR0b25UZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQyKSxcbiAgICAgIHRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICB0aXRsZUNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudCgpLFxuICAgICAgbWVzc2FnZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICAgIG1lc3NhZ2VUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGhlaWdodDpcIjEwMCVcIixcbiAgICAgIHdpZHRoOlwiMTAwJVwiLFxuICAgICAgYm9yZGVyOmAxcHggc29saWQgJHt0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDEwMCgpfWAsXG4gICAgICBib3JkZXJSYWRpdXM6XCI4cHhcIlxuICAgIH1cbiAgfVxuICBzZXRSZWNlaXB0U3R5bGUoKXtcbiAgICB0aGlzLnJlY2VpcHRTdHlsZSA9IG5ldyBSZWNlaXB0U3R5bGUoe1xud2FpdEljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NzAwKCksXG5zZW50SWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbmRlbGl2ZXJlZEljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG5yZWFkSWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG5lcnJvckljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0RXJyb3IoKSxcbiAgICB9KVxuICAgIHRoaXMucmVjZWlwdFN0eWxlID0gey4uLnRoaXMucmVjZWlwdFN0eWxlfVxuICB9XG4gIGNyZWF0ZVJlcXVlc3RCdWlsZGVyKCl7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlcyB8fCB0aGlzLnRlbXBsYXRlcz8ubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlID0gQ2hhdENvbmZpZ3VyYXRvci5nZXREYXRhU291cmNlKCkuZ2V0QWxsTWVzc2FnZVRlbXBsYXRlcygpXG4gICAgICB0aGlzLmNhdGVnb3JpZXMgPSBDaGF0Q29uZmlndXJhdG9yLmdldERhdGFTb3VyY2UoKS5nZXRBbGxNZXNzYWdlQ2F0ZWdvcmllcygpXG4gICAgICB0aGlzLnR5cGVzID0gQ2hhdENvbmZpZ3VyYXRvci5nZXREYXRhU291cmNlKCkuZ2V0QWxsTWVzc2FnZVR5cGVzKClcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZXNcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkaW5nXG4gICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IG51bGxcbiAgICBpZiAodGhpcy51c2VyIHx8IHRoaXMuZ3JvdXApIHtcbiAgICAgIGlmICghdGhpcy5tZXNzYWdlc1JlcXVlc3RCdWlsZGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbmV3IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyKClcbiAgICAgICAgICAgIC5zZXRVSUQodGhpcy51c2VyLmdldFVpZCgpKVxuICAgICAgICAgICAgLnNldExpbWl0KHRoaXMubGltaXQpXG4gICAgICAgICAgICAuc2V0VHlwZXModGhpcy50eXBlcylcbiAgICAgICAgICAgIC5zZXRDYXRlZ29yaWVzKHRoaXMuY2F0ZWdvcmllcylcbiAgICAgICAgICAgIC5oaWRlUmVwbGllcyh0cnVlKVxuICAgICAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbmV3IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyKClcbiAgICAgICAgICAgIC5zZXRHVUlEKHRoaXMuZ3JvdXAuZ2V0R3VpZCgpKVxuICAgICAgICAgICAgLnNldExpbWl0KHRoaXMubGltaXQpXG4gICAgICAgICAgICAuc2V0VHlwZXModGhpcy50eXBlcylcbiAgICAgICAgICAgIC5oaWRlUmVwbGllcyh0cnVlKVxuICAgICAgICAgICAgLnNldENhdGVnb3JpZXModGhpcy5jYXRlZ29yaWVzKVxuICAgICAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSB0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIuYnVpbGQoKVxuICAgICAgfVxuICAgICAgdGhpcy5mZXRjaFByZXZpb3VzTWVzc2FnZXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gKiBMaXN0ZW5lciBUbyBSZWNlaXZlIE1lc3NhZ2VzIGluIFJlYWwgVGltZVxuICogQHBhcmFtXG4gKi9cbiAgZmV0Y2hQcmV2aW91c01lc3NhZ2VzID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnJlaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IHRoaXMubWVzc2FnZXNSZXF1ZXN0QnVpbGRlci5zZXRNZXNzYWdlSWQodGhpcy5tZXNzYWdlc0xpc3RbMF0uZ2V0SWQoKSkuYnVpbGQoKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbmV3IENvbWV0Q2hhdC5NZXNzYWdlc1JlcXVlc3RCdWlsZGVyKCkuc2V0VUlEKHRoaXMudXNlci5nZXRVaWQoKSlcbiAgICAgICAgICAgIC5zZXRMaW1pdCh0aGlzLmxpbWl0KVxuICAgICAgICAgICAgLnNldFR5cGVzKHRoaXMudHlwZXMpXG4gICAgICAgICAgICAuc2V0TWVzc2FnZUlkKHRoaXMubWVzc2FnZXNMaXN0WzBdLmdldElkKCkpXG4gICAgICAgICAgICAuc2V0Q2F0ZWdvcmllcyh0aGlzLmNhdGVnb3JpZXMpXG4gICAgICAgICAgICAuaGlkZVJlcGxpZXModHJ1ZSlcbiAgICAgICAgICAgIC5idWlsZCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IG5ldyBDb21ldENoYXQuTWVzc2FnZXNSZXF1ZXN0QnVpbGRlcigpLnNldEdVSUQodGhpcy5ncm91cC5nZXRHdWlkKCkpXG4gICAgICAgICAgICAuc2V0TGltaXQodGhpcy5saW1pdClcbiAgICAgICAgICAgIC5zZXRUeXBlcyh0aGlzLnR5cGVzKVxuICAgICAgICAgICAgLnNldE1lc3NhZ2VJZCh0aGlzLm1lc3NhZ2VzTGlzdFswXS5nZXRJZCgpKVxuICAgICAgICAgICAgLnNldENhdGVnb3JpZXModGhpcy5jYXRlZ29yaWVzKVxuICAgICAgICAgICAgLmhpZGVSZXBsaWVzKHRydWUpXG4gICAgICAgICAgICAuYnVpbGQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIuZmV0Y2hQcmV2aW91cygpLnRoZW4oXG4gICAgICAobWVzc2FnZUxpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2VMaXN0KVxuICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmxvYWRpbmc7XG4gICAgICAgIC8vIE5vIE1lc3NhZ2VzIEZvdW5kXG4gICAgICAgIGlmIChtZXNzYWdlTGlzdC5sZW5ndGggPT09IDAgJiYgdGhpcy5tZXNzYWdlc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5lbXB0eTtcbiAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlTGlzdCAmJiBtZXNzYWdlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGV0IGxhc3RNZXNzYWdlID0gbWVzc2FnZUxpc3RbbWVzc2FnZUxpc3QubGVuZ3RoIC0gMV1cbiAgICAgICAgICBpZiAobGFzdE1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpICE9IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSAmJiAhbGFzdE1lc3NhZ2UuZ2V0RGVsaXZlcmVkQXQoKSkge1xuICAgICAgICAgICAgLy9tYXJrIHRoZSBtZXNzYWdlIGFzIGRlbGl2ZXJlZFxuICAgICAgICAgICAgaWYoIXRoaXMuZGlzYWJsZVJlY2VpcHQpe1xuICAgICAgICAgICAgICBDb21ldENoYXQubWFya0FzRGVsaXZlcmVkKGxhc3RNZXNzYWdlKS50aGVuKChyZWNlaXB0OkNvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCk9PntcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleCgobTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiBtLmdldElkKCkgPT09IE51bWJlcihyZWNlaXB0Py5nZXRNZXNzYWdlSWQoKSkpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrQWxsTWVzc2FnQXNEZWxpdmVyZWQobWVzc2FnZUtleSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWxhc3RNZXNzYWdlPy5nZXRSZWFkQXQoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0KSB7XG4gICAgICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKGxhc3RNZXNzYWdlKS50aGVuKChyZWNlaXB0OkNvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCk9PntcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleCgobTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiBtLmdldElkKCkgPT09IE51bWJlcihyZWNlaXB0Py5nZXRNZXNzYWdlSWQoKSkpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrQWxsTWVzc2FnQXNSZWFkKG1lc3NhZ2VLZXkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3I6YW55KT0+e1xuICAgICAgICAgICAgICAgIGlmKHRoaXMub25FcnJvcil7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmxvYWRlZFxuICAgICAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgLy9pZiB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlIGlzIG5vdCB0aGUgbG9nZ2VkaW4gdXNlciwgbWFyayBpdCBhcyByZWFkLlxuICAgICAgICAgICAgbGV0IHByZXZTY3JvbGxIZWlnaHQgPSB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0U2Nyb2xsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBwcmV2U2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dTbWFydFJlcGx5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNtYXJ0UmVwbHlNZXNzYWdlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucHJlcGVuZE1lc3NhZ2VzKG1lc3NhZ2VMaXN0KVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcbiAgICAgICAgfVxuICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMuZXJyb3I7XG4gICAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgICkuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5lcnJvcjtcbiAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSlcbiAgfVxuICBmZXRjaE5leHRNZXNzYWdlID0gKCkgPT4ge1xuICAgIGxldCBpbmRleCA9IHRoaXMubWVzc2FnZXNMaXN0Lmxlbmd0aCAtIDFcbiAgICBpZiAodGhpcy5yZWluaXRpYWxpemVkKSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlc1JlcXVlc3RCdWlsZGVyKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSB0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIuc2V0TWVzc2FnZUlkKHRoaXMubWVzc2FnZXNMaXN0W2luZGV4XS5nZXRJZCgpKS5idWlsZCgpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSBuZXcgQ29tZXRDaGF0Lk1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXIoKS5zZXRVSUQodGhpcy51c2VyLmdldFVpZCgpKVxuICAgICAgICAgICAgLnNldExpbWl0KHRoaXMubGltaXQpXG4gICAgICAgICAgICAuc2V0VHlwZXModGhpcy50eXBlcylcbiAgICAgICAgICAgIC5zZXRNZXNzYWdlSWQodGhpcy5tZXNzYWdlc0xpc3RbaW5kZXhdLmdldElkKCkpXG4gICAgICAgICAgICAuc2V0Q2F0ZWdvcmllcyh0aGlzLmNhdGVnb3JpZXMpXG4gICAgICAgICAgICAuaGlkZVJlcGxpZXModHJ1ZSlcbiAgICAgICAgICAgIC5idWlsZCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlciA9IG5ldyBDb21ldENoYXQuTWVzc2FnZXNSZXF1ZXN0QnVpbGRlcigpLnNldEdVSUQodGhpcy5ncm91cC5nZXRHdWlkKCkpXG4gICAgICAgICAgICAuc2V0TGltaXQodGhpcy5saW1pdClcbiAgICAgICAgICAgIC5zZXRUeXBlcyh0aGlzLnR5cGVzKVxuICAgICAgICAgICAgLnNldE1lc3NhZ2VJZCh0aGlzLm1lc3NhZ2VzTGlzdFtpbmRleF0uZ2V0SWQoKSlcbiAgICAgICAgICAgIC5zZXRDYXRlZ29yaWVzKHRoaXMuY2F0ZWdvcmllcylcbiAgICAgICAgICAgIC5oaWRlUmVwbGllcyh0cnVlKVxuICAgICAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZXF1ZXN0QnVpbGRlci5mZXRjaE5leHQoKS50aGVuKFxuICAgICAgICAobWVzc2FnZUxpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkaW5nO1xuICAgICAgICAgIC8vIE5vIE1lc3NhZ2VzIEZvdW5kXG4gICAgICAgICAgaWYgKG1lc3NhZ2VMaXN0Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLm1lc3NhZ2VzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMuZW1wdHk7XG4gICAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtZXNzYWdlTGlzdCAmJiBtZXNzYWdlTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VMaXN0W21lc3NhZ2VMaXN0Lmxlbmd0aCAtIDFdXG4gICAgICAgICAgICBpZiAoIWxhc3RNZXNzYWdlPy5nZXRSZWFkQXQoKSAmJiBsYXN0TWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgIT0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlUmVjZWlwdCkge1xuICAgICAgICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKGxhc3RNZXNzYWdlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLlVucmVhZENvdW50ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIWxhc3RNZXNzYWdlPy5nZXREZWxpdmVyZWRBdCgpICYmIGxhc3RNZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkpe1xuICAgICAgICAgICAgIHRoaXMubWFya01lc3NhZ2VBc0RlbGl2ZXJlZChsYXN0TWVzc2FnZSlcbiAgICAgICAgICAgICB0aGlzLm1hcmtBbGxNZXNzYWdBc0RlbGl2ZXJlZChtZXNzYWdlTGlzdC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcblxuICAgICAgICAgICAgICBsZXQgcHJldlNjcm9sbEhlaWdodCA9IHRoaXMubGlzdFNjcm9sbC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0U2Nyb2xsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICAgICAgICAgICAgIHRoaXMubGlzdFNjcm9sbC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCAtIHByZXZTY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFwcGVuZE1lc3NhZ2VzKG1lc3NhZ2VMaXN0KVxuICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5lcnJvcjtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICApLmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmVycm9yO1xuICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgYXBwZW5kTWVzc2FnZXMgPSAobWVzc2FnZXM6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdKSA9PiB7XG4gICAgdGhpcy5tZXNzYWdlc0xpc3QucHVzaCguLi5tZXNzYWdlcylcbiAgICB0aGlzLm1lc3NhZ2VDb3VudCA9IHRoaXMubWVzc2FnZXNMaXN0Lmxlbmd0aDtcbiAgICBpZiAodGhpcy5tZXNzYWdlQ291bnQgPiB0aGlzLnRocmVzaG9sZFZhbHVlKSB7XG4gICAgICB0aGlzLmtlZXBSZWNlbnRNZXNzYWdlcyA9IHRydWVcbiAgICAgIHRoaXMucmVJbml0aWFsaXplTWVzc2FnZUJ1aWxkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBDb21ldENoYXQuYWRkTWVzc2FnZUxpc3RlbmVyKFxuICAgICAgICB0aGlzLm1zZ0xpc3RlbmVySWQsXG4gICAgICAgIG5ldyBDb21ldENoYXQuTWVzc2FnZUxpc3RlbmVyKHtcbiAgICAgICAgICBvblRleHRNZXNzYWdlUmVjZWl2ZWQ6ICh0ZXh0TWVzc2FnZTogQ29tZXRDaGF0LlRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuVEVYVF9NRVNTQUdFX1JFQ0VJVkVELCB0ZXh0TWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkN1c3RvbU1lc3NhZ2VSZWNlaXZlZDogKGN1c3RvbU1lc3NhZ2U6IENvbWV0Q2hhdC5DdXN0b21NZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuQ1VTVE9NX01FU1NBR0VfUkVDRUlWRUQsIGN1c3RvbU1lc3NhZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25NZWRpYU1lc3NhZ2VSZWNlaXZlZDogKG1lZGlhTWVzc2FnZTogQ29tZXRDaGF0Lk1lZGlhTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FRElBX01FU1NBR0VfUkVDRUlWRUQsIG1lZGlhTWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VzRGVsaXZlcmVkOiAobWVzc2FnZVJlY2VpcHQ6IENvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMSVZFUkVELCBtZXNzYWdlUmVjZWlwdCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VzUmVhZDogKG1lc3NhZ2VSZWNlaXB0OiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVVwZGF0ZShDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX1JFQUQsIG1lc3NhZ2VSZWNlaXB0KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uTWVzc2FnZURlbGV0ZWQ6IChkZWxldGVkTWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuTUVTU0FHRV9ERUxFVEVELCBkZWxldGVkTWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VFZGl0ZWQ6IChlZGl0ZWRNZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVVwZGF0ZShDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX0VESVRFRCwgZWRpdGVkTWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRyYW5zaWVudE1lc3NhZ2VSZWNlaXZlZDogKHRyYW5zaWVudE1lc3NhZ2U6IENvbWV0Q2hhdC5UcmFuc2llbnRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBsZXQgbGl2ZVJlYWN0aW9uOiBhbnkgPSB0cmFuc2llbnRNZXNzYWdlLmdldERhdGEoKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2llbnRNZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJiB0aGlzLnVzZXIgJiYgdHJhbnNpZW50TWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT0gdGhpcy51c2VyLmdldFVpZCgpICYmIHRyYW5zaWVudE1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpID09IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSkge1xuICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTGl2ZVJlYWN0aW9uLm5leHQobGl2ZVJlYWN0aW9uW1wiTElWRV9SRUFDVElPTlwiXSlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNpZW50TWVzc2FnZS5nZXRSZWNlaXZlclR5cGUoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwICYmIHRoaXMuZ3JvdXAgJiYgdHJhbnNpZW50TWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT0gdGhpcy5ncm91cC5nZXRHdWlkKCkgJiYgdHJhbnNpZW50TWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgIT0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpKSB7XG4gICAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NMaXZlUmVhY3Rpb24ubmV4dChsaXZlUmVhY3Rpb25bXCJMSVZFX1JFQUNUSU9OXCJdKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBDb21ldENoYXQuYWRkR3JvdXBMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5ncm91cExpc3RlbmVySWQsXG4gICAgICAgIG5ldyBDb21ldENoYXQuR3JvdXBMaXN0ZW5lcih7XG4gICAgICAgICAgb25Hcm91cE1lbWJlclNjb3BlQ2hhbmdlZDogKFxuICAgICAgICAgICAgbWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNoYW5nZWRVc2VyOiBDb21ldENoYXQuVXNlcixcbiAgICAgICAgICAgIG5ld1Njb3BlOiBDb21ldENoYXQuR3JvdXBNZW1iZXJTY29wZSxcbiAgICAgICAgICAgIG9sZFNjb3BlOiBDb21ldENoYXQuR3JvdXBNZW1iZXJTY29wZSxcbiAgICAgICAgICAgIGNoYW5nZWRHcm91cDogbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5TQ09QRV9DSEFOR0UsXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIGNoYW5nZWRHcm91cCxcbiAgICAgICAgICAgICAgeyB1c2VyOiBjaGFuZ2VkVXNlciwgc2NvcGU6IG5ld1Njb3BlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkdyb3VwTWVtYmVyS2lja2VkOiAobWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCwga2lja2VkVXNlcjogQ29tZXRDaGF0LlVzZXIsIGtpY2tlZEJ5OiBDb21ldENoYXQuVXNlciwga2lja2VkRnJvbTogbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5LSUNLRUQsXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIGtpY2tlZEZyb20sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiBraWNrZWRVc2VyLFxuICAgICAgICAgICAgICAgIGhhc0pvaW5lZDogZmFsc2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkdyb3VwTWVtYmVyQmFubmVkOiAobWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCwgYmFubmVkVXNlcjogQ29tZXRDaGF0LlVzZXIsIGJhbm5lZEJ5OiBDb21ldENoYXQuVXNlciwgYmFubmVkRnJvbTogbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5CQU5ORUQsXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIGJhbm5lZEZyb20sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiBiYW5uZWRVc2VyLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlclVuYmFubmVkOiAoXG4gICAgICAgICAgICBtZXNzYWdlOiBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5iYW5uZWRVc2VyOiBDb21ldENoYXQuVXNlcixcbiAgICAgICAgICAgIHVuYmFubmVkQnk6IENvbWV0Q2hhdC5Vc2VyLFxuICAgICAgICAgICAgdW5iYW5uZWRGcm9tOiBudWxsIHwgdW5kZWZpbmVkXG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoXG4gICAgICAgICAgICAgIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLlVOQkFOTkVELFxuICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICB1bmJhbm5lZEZyb20sXG4gICAgICAgICAgICAgIHsgdXNlcjogdW5iYW5uZWRVc2VyIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lbWJlckFkZGVkVG9Hcm91cDogKFxuICAgICAgICAgICAgbWVzc2FnZTogbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVzZXJBZGRlZDogQ29tZXRDaGF0LlVzZXIsXG4gICAgICAgICAgICB1c2VyQWRkZWRCeTogQ29tZXRDaGF0LlVzZXIsXG4gICAgICAgICAgICB1c2VyQWRkZWRJbjogbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlKFxuICAgICAgICAgICAgICBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5BRERFRCxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgdXNlckFkZGVkSW4sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiB1c2VyQWRkZWQsXG4gICAgICAgICAgICAgICAgaGFzSm9pbmVkOiB0cnVlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlckxlZnQ6IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UsIGxlYXZpbmdVc2VyOiBDb21ldENoYXQuR3JvdXBNZW1iZXIsIGdyb3VwOiBDb21ldENoYXQuR3JvdXApID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVVwZGF0ZShDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5MRUZULCBtZXNzYWdlLCBncm91cCwge1xuICAgICAgICAgICAgICB1c2VyOiBsZWF2aW5nVXNlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlckpvaW5lZDogKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSwgam9pbmVkVXNlcjogQ29tZXRDaGF0Lkdyb3VwTWVtYmVyLCBqb2luZWRHcm91cDogQ29tZXRDaGF0Lkdyb3VwKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGUoXG4gICAgICAgICAgICAgIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLkpPSU5FRCxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgam9pbmVkR3JvdXAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1c2VyOiBqb2luZWRVc2VyLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgaWYodGhpcy5lbmFibGVDYWxsaW5nKXtcbiAgICAgICAgQ29tZXRDaGF0LmFkZENhbGxMaXN0ZW5lcihcbiAgICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcklkLFxuICAgICAgICAgIG5ldyBDb21ldENoYXQuQ2FsbExpc3RlbmVyKHtcbiAgICAgICAgICAgIG9uSW5jb21pbmdDYWxsUmVjZWl2ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoY2FsbClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkluY29taW5nQ2FsbENhbmNlbGxlZDogKGNhbGw6IENvbWV0Q2hhdC5DYWxsKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkTWVzc2FnZShjYWxsKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uT3V0Z29pbmdDYWxsUmVqZWN0ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoY2FsbClcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uT3V0Z29pbmdDYWxsQWNjZXB0ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoY2FsbClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbnRoaXMub25FcnJvcihlcnJvcik7XG59XG4gICAgfVxuICB9XG4gIC8qKlxuKlxuKiBAcGFyYW1cbiovXG4gIC8qKlxuICAgKiBVcGRhdGVzIG1lc3NhZ2VMaXN0IG9uIGJhc2lzIG9mIHVzZXIgYWN0aXZpdHkgb3IgZ3JvdXAgYWN0aXZpdHkgb3IgY2FsbGluZyBhY3Rpdml0eVxuICAgKiBAcGFyYW0gIHthbnk9bnVsbH0ga2V5XG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCB8IENvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZVxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuR3JvdXAgfCBudWxsPW51bGx9IGdyb3VwXG4gICAqIEBwYXJhbSAge2FueT1udWxsfSBvcHRpb25zXG4gICAqL1xuICBtZXNzYWdlVXBkYXRlKGtleTogc3RyaW5nIHwgbnVsbCA9IG51bGwsIG1lc3NhZ2U6IENvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCB8IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSB8IGFueSA9IG51bGwsIGdyb3VwOiBDb21ldENoYXQuR3JvdXAgfCBudWxsID0gbnVsbCwgb3B0aW9uczogYW55ID0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLlRFWFRfTUVTU0FHRV9SRUNFSVZFRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRURJQV9NRVNTQUdFX1JFQ0VJVkVEOlxuICAgICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMSVZFUkVEOlxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfUkVBRDpcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VSZWFkQW5kRGVsaXZlcmVkKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMRVRFRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX0VESVRFRDoge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUVkaXRlZChtZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLlNDT1BFX0NIQU5HRTpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5KT0lORUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuZ3JvdXBNZW1iZXJBY3Rpb24uTEVGVDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5BRERFRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5LSUNLRUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuZ3JvdXBNZW1iZXJBY3Rpb24uQkFOTkVEOlxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLlVOQkFOTkVEOiB7XG4gICAgICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5DVVNUT01fTUVTU0FHRV9SRUNFSVZFRDpcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogdHJhbnNsYXRlIG1lc3NhZ2UgdGhlbiBjYWxsIHVwZGF0ZSBtZXNzYWdlXG4gKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAqL1xuICAvLyB0cmFuc2xhdGVNZXNzYWdlKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkge1xuICAvLyB9XG4gIC8qKlxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICovXG4gIG1hcmtNZXNzYWdlQXNEZWxpdmVyZWQgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0ICYmICBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPT0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpICYmIG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoXCJkZWxpdmVyZWRBdFwiKSA9PT0gZmFsc2UpIHtcbiAgICAgIENvbWV0Q2hhdC5tYXJrQXNEZWxpdmVyZWQobWVzc2FnZSlcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBXaGVuIE1lc3NhZ2UgaXMgUmVjZWl2ZWRcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIC8qKlxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICovXG4gIG1lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICB0aGlzLm1hcmtNZXNzYWdlQXNEZWxpdmVyZWQobWVzc2FnZSlcbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmdyb3VwICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUuZ3JvdXAgJiZcbiAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT09IHRoaXMuZ3JvdXA/LmdldEd1aWQoKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkSGFuZGxlcihtZXNzYWdlLCBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMudXNlciAmJlxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXIgJiZcbiAgICAgICAgbWVzc2FnZT8uZ2V0U2VuZGVyKCkuZ2V0VWlkKCkgPT09IHRoaXMudXNlcj8uZ2V0VWlkKClcbiAgICAgICkge1xuICAgICAgICBpZiAoKCFtZXNzYWdlPy5nZXRSZWFkQXQoKSAmJiAhbWVzc2FnZT8uZ2V0UGFyZW50TWVzc2FnZUlkKCkgICYmIHRoaXMuaXNPbkJvdHRvbSkgfHwgKCFtZXNzYWdlPy5nZXRSZWFkQXQoKSAmJiBtZXNzYWdlLmdldFBhcmVudE1lc3NhZ2VJZCgpICYmIHRoaXMucGFyZW50TWVzc2FnZUlkICAmJiB0aGlzLmlzT25Cb3R0b20pKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0KSB7XG4gICAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChtZXNzYWdlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlZEhhbmRsZXIobWVzc2FnZSwgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS51c2VyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICB9XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIC8qKlxuICogVXBkYXRpbmcgdGhlIHJlcGx5IGNvdW50IG9mIFRocmVhZCBQYXJlbnQgTWVzc2FnZVxuICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlc1xuICovXG4gIHVwZGF0ZVJlcGx5Q291bnQobWVzc2FnZXM6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNlaXZlZE1lc3NhZ2UgPSBtZXNzYWdlcztcbiAgICAgIGxldCBtZXNzYWdlTGlzdDogQ29tZXRDaGF0LkJhc2VNZXNzYWdlW10gPSBbLi4udGhpcy5tZXNzYWdlc0xpc3RdO1xuICAgICAgbGV0IG1lc3NhZ2VLZXkgPSBtZXNzYWdlTGlzdC5maW5kSW5kZXgoXG4gICAgICAgIChtKSA9PiBtLmdldElkKCkgPT09IHJlY2VpdmVkTWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKVxuICAgICAgKTtcbiAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZU9iajogQ29tZXRDaGF0LkJhc2VNZXNzYWdlID0gbWVzc2FnZUxpc3RbbWVzc2FnZUtleV07XG4gICAgICAgIGxldCByZXBseUNvdW50ID0gbWVzc2FnZU9iai5nZXRSZXBseUNvdW50KCkgPyBtZXNzYWdlT2JqLmdldFJlcGx5Q291bnQoKSA6IDA7XG4gICAgICAgIHJlcGx5Q291bnQgPSByZXBseUNvdW50ICsgMTtcbiAgICAgICAgbWVzc2FnZU9iai5zZXRSZXBseUNvdW50KHJlcGx5Q291bnQpO1xuICAgICAgICBtZXNzYWdlTGlzdC5zcGxpY2UobWVzc2FnZUtleSwgMSwgbWVzc2FnZU9iaik7XG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gWy4uLm1lc3NhZ2VMaXN0XTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gdHlwZVxuICAgKi9cbiAgbWVzc2FnZVJlY2VpdmVkSGFuZGxlciA9IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UsIHR5cGU6IHN0cmluZykgPT4ge1xuICAgICsrdGhpcy5tZXNzYWdlQ291bnQ7XG4gICAgaWYgKG1lc3NhZ2UuZ2V0UGFyZW50TWVzc2FnZUlkKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlUmVwbHlDb3VudChtZXNzYWdlKTtcbiAgICAgIHRoaXMuYWRkTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubWVzc2FnZUNvdW50ID4gdGhpcy50aHJlc2hvbGRWYWx1ZSkge1xuICAgICAgICB0aGlzLmtlZXBSZWNlbnRNZXNzYWdlcyA9IHRydWVcbiAgICAgICAgdGhpcy5yZUluaXRpYWxpemVNZXNzYWdlQnVpbGRlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgaWYgKCF0aGlzLmlzT25Cb3R0b20pIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9Cb3R0b21Pbk5ld01lc3NhZ2VzKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGxldCBjb3VudFRleHQgPSBsb2NhbGl6ZShcIk5FV19NRVNTQUdFU1wiKVxuICAgICAgICAgIGlmICh0aGlzLm5ld01lc3NhZ2VJbmRpY2F0b3JUZXh0ICYmIHRoaXMubmV3TWVzc2FnZUluZGljYXRvclRleHQgIT0gXCJcIikge1xuICAgICAgICAgICAgY291bnRUZXh0ID0gdGhpcy5uZXdNZXNzYWdlSW5kaWNhdG9yVGV4dFxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvdW50VGV4dCA9IHRoaXMuVW5yZWFkQ291bnQubGVuZ3RoID4gMCA/ICBsb2NhbGl6ZShcIk5FV19NRVNTQUdFU1wiKSA6ICBsb2NhbGl6ZShcIk5FV19NRVNTQUdFXCIpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQucHVzaChtZXNzYWdlKVxuICAgICAgICAgIHRoaXMubmV3TWVzc2FnZUNvdW50ID0gXCIg4oaTIFwiICsgdGhpcy5VbnJlYWRDb3VudC5sZW5ndGggKyBcIiBcIiArIGNvdW50VGV4dDtcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBsYXlBdWRpbygpO1xuICAgIC8vaGFuZGxpbmcgZG9tIGxhZyAtIGluY3JlbWVudCBjb3VudCBvbmx5IGZvciBtYWluIG1lc3NhZ2UgbGlzdFxuICAgIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KFwicGFyZW50TWVzc2FnZUlkXCIpID09PSBmYWxzZSAmJiB0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgKyt0aGlzLm1lc3NhZ2VDb3VudDtcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5oYXNPd25Qcm9wZXJ0eShcInBhcmVudE1lc3NhZ2VJZFwiKSA9PT0gdHJ1ZSAmJiB0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgaWYgKG1lc3NhZ2UuZ2V0UGFyZW50TWVzc2FnZUlkKCkgPT09IHRoaXMucGFyZW50TWVzc2FnZUlkICYmIHRoaXMuaXNPbkJvdHRvbSkge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVJlY2VpcHQpIHtcbiAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChtZXNzYWdlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgQ29tZXRDaGF0TWVzc2FnZUV2ZW50cy5jY01lc3NhZ2VSZWFkLm5leHQoIG1lc3NhZ2UpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgfVxuICB9O1xuICBwbGF5QXVkaW8oKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVTb3VuZEZvck1lc3NhZ2VzKSB7XG4gICAgICBpZiAodGhpcy5jdXN0b21Tb3VuZEZvck1lc3NhZ2VzKSB7XG4gICAgICAgIENvbWV0Q2hhdFNvdW5kTWFuYWdlci5wbGF5KENvbWV0Q2hhdFNvdW5kTWFuYWdlci5Tb3VuZC5pbmNvbWluZ01lc3NhZ2UsIHRoaXMuY3VzdG9tU291bmRGb3JNZXNzYWdlcylcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBDb21ldENoYXRTb3VuZE1hbmFnZXIucGxheShDb21ldENoYXRTb3VuZE1hbmFnZXIuU291bmQuaW5jb21pbmdNZXNzYWdlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZUluaXRpYWxpemVNZXNzYWdlTGlzdCgpIHtcbiAgICB0aGlzLnJlaW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgdGhpcy5tc2dMaXN0ZW5lcklkID0gXCJtZXNzYWdlX1wiKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB0aGlzLmdyb3VwTGlzdGVuZXJJZCA9IFwiZ3JvdXBfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHRoaXMuY2FsbExpc3RlbmVySWQgPSBcImNhbGxfXCIrIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHRoaXMuYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgaWYgKHRoaXMubWVzc2FnZXNSZXF1ZXN0QnVpbGRlcikge1xuICAgICAgaWYgKHRoaXMua2VlcFJlY2VudE1lc3NhZ2VzKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnNwbGljZSgxLCB0aGlzLm1lc3NhZ2VzTGlzdC5sZW5ndGggLSAzMCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc3BsaWNlKDMwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdEJ1aWxkZXIgPSB0aGlzLm1lc3NhZ2VzUmVxdWVzdEJ1aWxkZXJcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5rZWVwUmVjZW50TWVzc2FnZXMpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc3BsaWNlKDEsIHRoaXMubWVzc2FnZXNMaXN0Lmxlbmd0aCAtIDMwKTtcbiAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdC5zcGxpY2UoMzApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgcmVJbml0aWFsaXplTWVzc2FnZUJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgdGhpcy5tZXNzYWdlQ291bnQgPSAwO1xuICAgIH1cbiAgICB0aGlzLnJlcXVlc3RCdWlsZGVyID0gbnVsbFxuICAgIENvbWV0Q2hhdC5yZW1vdmVNZXNzYWdlTGlzdGVuZXIodGhpcy5tc2dMaXN0ZW5lcklkKTtcbiAgICBDb21ldENoYXQucmVtb3ZlR3JvdXBMaXN0ZW5lcih0aGlzLmdyb3VwTGlzdGVuZXJJZCk7XG4gICAgQ29tZXRDaGF0LnJlbW92ZUNhbGxMaXN0ZW5lcih0aGlzLmNhbGxMaXN0ZW5lcklkKVxuICAgIHRoaXMucmVJbml0aWFsaXplTWVzc2FnZUxpc3QoKVxuICB9O1xuICBnZXRNZXNzYWdlUmVjZWlwdChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICBsZXQgcmVjZWlwdCA9ICAgTWVzc2FnZVJlY2VpcHRVdGlscy5nZXRSZWNlaXB0U3RhdHVzKG1lc3NhZ2UpXG4gICAgcmV0dXJuIHJlY2VpcHRcbiAgfVxuICBtZXNzYWdlUmVhZEFuZERlbGl2ZXJlZChtZXNzYWdlOiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJlxuICAgICAgICBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSA9PSB0aGlzLnVzZXI/LmdldFVpZCgpICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXIoKSA9PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKClcbiAgICAgICkge1xuICAgICAgICBpZiAobWVzc2FnZS5nZXRSZWNlaXB0VHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLkRFTElWRVJZKSB7XG4gICAgICAgICAgLy9zZWFyY2ggZm9yIG1lc3NhZ2VcbiAgICAgICAgICBsZXQgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgIChtOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IG0uZ2V0SWQoKSA9PSBOdW1iZXIobWVzc2FnZS5nZXRNZXNzYWdlSWQoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNMaXN0W21lc3NhZ2VLZXldLnNldERlbGl2ZXJlZEF0KG1lc3NhZ2UuZ2V0RGVsaXZlcmVkQXQoKSlcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHRoaXMubWFya0FsbE1lc3NhZ0FzRGVsaXZlcmVkKCBtZXNzYWdlS2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLmdldFJlY2VpcHRUeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuUkVBRCkge1xuICAgICAgICAgIC8vc2VhcmNoIGZvciBtZXNzYWdlXG4gICAgICAgICAgbGV0IG1lc3NhZ2VLZXkgPSB0aGlzLm1lc3NhZ2VzTGlzdC5maW5kSW5kZXgoXG4gICAgICAgICAgICAobTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiBtLmdldElkKCkgPT0gTnVtYmVyKG1lc3NhZ2UuZ2V0TWVzc2FnZUlkKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWVzc2FnZUtleSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdFttZXNzYWdlS2V5XS5zZXRSZWFkQXQobWVzc2FnZT8uZ2V0UmVhZEF0KCkpO1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgdGhpcy5tYXJrQWxsTWVzc2FnQXNSZWFkKCBtZXNzYWdlS2V5KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXIoKSA9PT0gdGhpcy5ncm91cD8uZ2V0R3VpZCgpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbnRoaXMub25FcnJvcihlcnJvcik7XG59XG4gICAgfVxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICB9XG4gIC8qKlxuICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSByZWFkTWVzc2FnZVxuICovXG4gICBtYXJrQWxsTWVzc2FnQXNSZWFkKCBtZXNzYWdlS2V5OiBudW1iZXIpIHtcbiAgICBmb3IobGV0IGkgPSBtZXNzYWdlS2V5OyBpID49MDsgaS0tKXtcbiAgICAgIGlmICghdGhpcy5tZXNzYWdlc0xpc3RbaV0uZ2V0UmVhZEF0KCkpIHtcbiAgICB0aGlzLm1lc3NhZ2VzTGlzdFtpXS5zZXRSZWFkQXQoQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmdldFVuaXhUaW1lc3RhbXAoKSk7XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gICAgfVxuICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlUmVhZC5uZXh0KCB0aGlzLm1lc3NhZ2VzTGlzdFttZXNzYWdlS2V5XSlcbiAgICB9XG4gIG1hcmtBbGxNZXNzYWdBc0RlbGl2ZXJlZChtZXNzYWdlS2V5OiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gbWVzc2FnZUtleTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICghdGhpcy5tZXNzYWdlc0xpc3RbaV0uZ2V0RGVsaXZlcmVkQXQoKSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdFtpXS5zZXREZWxpdmVyZWRBdChDb21ldENoYXRVSUtpdFV0aWxpdHkuZ2V0VW5peFRpbWVzdGFtcCgpKTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRW1pdHMgYW4gQWN0aW9uIEluZGljYXRpbmcgdGhhdCBhIG1lc3NhZ2Ugd2FzIGRlbGV0ZWQgYnkgdGhlIHVzZXIvcGVyc29uIHlvdSBhcmUgY2hhdHRpbmcgd2l0aFxuICAgKiBAcGFyYW0ge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZVxuICAgKi9cbiAgLyoqXG4gICAqIERldGVjdHMgaWYgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgZWRpdCBpcyB5b3VyIGN1cnJlbnQgb3BlbiBjb252ZXJzYXRpb24gd2luZG93XG4gICAqIEBwYXJhbSB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqL1xuICBtZXNzYWdlRWRpdGVkID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZ3JvdXAgJiZcbiAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlclR5cGUoKSA9PT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS5ncm91cCAmJlxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVySWQoKSA9PT0gdGhpcy5ncm91cD8uZ2V0R3VpZCgpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy51c2VyICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJlxuICAgICAgICB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgPT09IG1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpICYmXG4gICAgICAgIG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpID09PSB0aGlzLnVzZXI/LmdldFVpZCgpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy51c2VyICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJlxuICAgICAgICB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgPT09IG1lc3NhZ2U/LmdldFNlbmRlcigpLmdldFVpZCgpICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpID09PSB0aGlzLnVzZXI/LmdldFVpZCgpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfTtcbiAgLyoqXG4gICAqIEVtaXRzIGFuIEFjdGlvbiBJbmRpY2F0aW5nIHRoYXQgYSBtZXNzYWdlIHdhcyBkZWxldGVkIGJ5IHRoZSB1c2VyL3BlcnNvbiB5b3UgYXJlIGNoYXR0aW5nIHdpdGhcbiAgICogQHBhcmFtIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICovXG4gIHVwZGF0ZUVkaXRlZE1lc3NhZ2UgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZUxpc3QgPSB0aGlzLm1lc3NhZ2VzTGlzdDtcbiAgICBjb25zdCBtZXNzYWdlS2V5ID0gbWVzc2FnZUxpc3QuZmluZEluZGV4KG0gPT4gbS5nZXRJZCgpID09PSBtZXNzYWdlLmdldElkKCkpO1xuICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gW1xuICAgICAgICAuLi5tZXNzYWdlTGlzdC5zbGljZSgwLCBtZXNzYWdlS2V5KSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgLi4ubWVzc2FnZUxpc3Quc2xpY2UobWVzc2FnZUtleSArIDEpXG4gICAgICBdO1xuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG4gIC8qKlxuICAgKiBFbWl0cyBhbiBBY3Rpb24gSW5kaWNhdGluZyB0aGF0IEdyb3VwIERhdGEgaGFzIGJlZW4gdXBkYXRlZFxuICAgKiBAcGFyYW1cbiAgICovXG4gIC8qKlxuICAgKiBXaGVuIGN1c3RvbSBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgZWcuIFBvbGwsIFN0aWNrZXJzIGVtaXRzIGFjdGlvbiB0byB1cGRhdGUgbWVzc2FnZSBsaXN0XG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqL1xuICBjdXN0b21NZXNzYWdlUmVjZWl2ZWQobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5tYXJrTWVzc2FnZUFzRGVsaXZlcmVkKG1lc3NhZ2UpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmdyb3VwICYmXG4gICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJUeXBlKCkgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUuZ3JvdXAgJiZcbiAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT09IHRoaXMuZ3JvdXA/LmdldEd1aWQoKVxuICAgICAgKSB7XG4gICAgICAgIGlmICgoIW1lc3NhZ2U/LmdldFJlYWRBdCgpICYmICFtZXNzYWdlPy5nZXRQYXJlbnRNZXNzYWdlSWQoKSAgJiYgdGhpcy5pc09uQm90dG9tKSB8fCAoIW1lc3NhZ2U/LmdldFJlYWRBdCgpICYmIG1lc3NhZ2UuZ2V0UGFyZW50TWVzc2FnZUlkKCkgJiYgdGhpcy5wYXJlbnRNZXNzYWdlSWQgJiYgdGhpcy5pc09uQm90dG9tKSApIHtcbiAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVJlY2VpcHQpIHtcbiAgICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKG1lc3NhZ2UpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlUmVhZC5uZXh0KCBtZXNzYWdlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZVJlY2VpdmVkSGFuZGxlcihtZXNzYWdlLCBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRoaXMudXNlciAmJlxuICAgICAgICBtZXNzYWdlLmdldFJlY2VpdmVyVHlwZSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXIgJiZcbiAgICAgICAgKChtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSA9PT0gdGhpcy51c2VyPy5nZXRVaWQoKSAmJlxuICAgICAgICAgIG1lc3NhZ2UuZ2V0UmVjZWl2ZXJJZCgpID09PSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkpXG4gICAgICAgICAgfHwgKFxuICAgICAgICAgICAgdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpID09PSBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAmJlxuICAgICAgICAgICAgbWVzc2FnZS5nZXRSZWNlaXZlcklkKCkgPT09IHRoaXMudXNlcj8uZ2V0VWlkKClcbiAgICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgIGlmICgoIW1lc3NhZ2U/LmdldFJlYWRBdCgpICYmICFtZXNzYWdlPy5nZXRQYXJlbnRNZXNzYWdlSWQoKSAmJiB0aGlzLmlzT25Cb3R0b20pIHx8ICghbWVzc2FnZT8uZ2V0UmVhZEF0KCkgJiYgbWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKSAmJiB0aGlzLnBhcmVudE1lc3NhZ2VJZCAmJiB0aGlzLmlzT25Cb3R0b20pKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0KSB7XG4gICAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChtZXNzYWdlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1c3RvbU1lc3NhZ2VSZWNlaXZlZEhhbmRsZXIobWVzc2FnZSwgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS51c2VyKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAgICovXG4gIGN1c3RvbU1lc3NhZ2VSZWNlaXZlZEhhbmRsZXIgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlLCB0eXBlOiBzdHJpbmcpID0+IHtcbiAgICArK3RoaXMubWVzc2FnZUNvdW50O1xuICAgIC8vIGFkZCByZWNlaXZlZCBtZXNzYWdlIHRvIG1lc3NhZ2VzIGxpc3RcbiAgICBpZiAobWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKSkge1xuICAgICAgdGhpcy51cGRhdGVSZXBseUNvdW50KG1lc3NhZ2UpO1xuICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlQ291bnQgPiB0aGlzLnRocmVzaG9sZFZhbHVlKSB7XG4gICAgICAgIHRoaXMua2VlcFJlY2VudE1lc3NhZ2VzID0gdHJ1ZVxuICAgICAgICB0aGlzLnJlSW5pdGlhbGl6ZU1lc3NhZ2VCdWlsZGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICBpZiAoIXRoaXMuaXNPbkJvdHRvbSkge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb0JvdHRvbU9uTmV3TWVzc2FnZXMpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbGV0IGNvdW50VGV4dCA9IGxvY2FsaXplKFwiTkVXX01FU1NBR0VTXCIpXG4gICAgICAgICAgaWYgKHRoaXMubmV3TWVzc2FnZUluZGljYXRvclRleHQgJiYgdGhpcy5uZXdNZXNzYWdlSW5kaWNhdG9yVGV4dCAhPSBcIlwiKSB7XG4gICAgICAgICAgICBjb3VudFRleHQgPSB0aGlzLm5ld01lc3NhZ2VJbmRpY2F0b3JUZXh0XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY291bnRUZXh0ID0gdGhpcy5VbnJlYWRDb3VudC5sZW5ndGggPiAwID8gIGxvY2FsaXplKFwiTkVXX01FU1NBR0VTXCIpIDogIGxvY2FsaXplKFwiTkVXX01FU1NBR0VcIilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5VbnJlYWRDb3VudC5wdXNoKG1lc3NhZ2UpXG4gICAgICAgICAgdGhpcy5uZXdNZXNzYWdlQ291bnQgPSBcIiDihpMgXCIgKyB0aGlzLlVucmVhZENvdW50Lmxlbmd0aCArIFwiIFwiICsgY291bnRUZXh0O1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxheUF1ZGlvKCk7XG4gICAgLy9oYW5kbGluZyBkb20gbGFnIC0gaW5jcmVtZW50IGNvdW50IG9ubHkgZm9yIG1haW4gbWVzc2FnZSBsaXN0XG4gICAgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoXCJwYXJlbnRNZXNzYWdlSWRcIikgPT09IGZhbHNlICYmICF0aGlzLnBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgKyt0aGlzLm1lc3NhZ2VDb3VudDtcbiAgICAgIC8vaWYgdGhlIHVzZXIgaGFzIG5vdCBzY3JvbGxlZCBpbiBjaGF0IHdpbmRvdyhzY3JvbGwgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY2hhdCB3aW5kb3cpXG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KFwicGFyZW50TWVzc2FnZUlkXCIpID09PSB0cnVlICYmIHRoaXMucGFyZW50TWVzc2FnZUlkICAmJiB0aGlzLmlzT25Cb3R0b20pIHtcbiAgICAgIGlmIChtZXNzYWdlLmdldFBhcmVudE1lc3NhZ2VJZCgpID09PSB0aGlzLnBhcmVudE1lc3NhZ2VJZCApIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0ICkge1xuICAgICAgICAgIENvbWV0Q2hhdC5tYXJrQXNSZWFkKG1lc3NhZ2UpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQubmV4dCggbWVzc2FnZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLlVucmVhZENvdW50ID0gW107XG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG4gIC8qKlxuICAgKiBUcmFja0J5IG1ldGhvZCB0byB1cGRhdGUgVUkgd2hlbiBhIGNoYW5nZSBpcyBkZXRlY3RlZFxuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSAge251bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtICB7YW55fSBpdGVtXG4gICAqL1xuICBnZXRNZXNzYWdlSWQoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgcmV0dXJuIGl0ZW0uZWRpdGVkQXQgfHwgaXRlbS5yZWFkQXQgfHwgaXRlbS5kZWxpdmVyZWRBdCB8fCBpdGVtLmlkO1xuICB9XG4gIC8qKlxuICAgKiBDb21wYXJlcyB0d28gZGF0ZXMgYW5kIHNldHMgRGF0ZSBvbiBhIGEgbmV3IGRheVxuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSAge251bWJlcn0gZmlyc3REYXRlXG4gICAqIEBwYXJhbSAge251bWJlcn0gc2Vjb25kRGF0ZVxuICAgKi9cbiAgIGlzRGF0ZURpZmZlcmVudChmaXJzdERhdGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2Vjb25kRGF0ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgbGV0IGZpcnN0RGF0ZU9iajogRGF0ZSwgc2Vjb25kRGF0ZU9iajogRGF0ZTtcbiAgICBmaXJzdERhdGVPYmogPSBuZXcgRGF0ZShmaXJzdERhdGUhICogMTAwMCk7XG4gICAgc2Vjb25kRGF0ZU9iaiA9IG5ldyBEYXRlKHNlY29uZERhdGUhICogMTAwMCk7XG4gICAgcmV0dXJuIGZpcnN0RGF0ZU9iai5nZXREYXRlKCkgIT09IHNlY29uZERhdGVPYmouZ2V0RGF0ZSgpIHx8XG4gICAgICBmaXJzdERhdGVPYmouZ2V0TW9udGgoKSAhPT0gc2Vjb25kRGF0ZU9iai5nZXRNb250aCgpIHx8XG4gICAgICBmaXJzdERhdGVPYmouZ2V0RnVsbFllYXIoKSAhPT0gc2Vjb25kRGF0ZU9iai5nZXRGdWxsWWVhcigpO1xuICB9XG4gIC8qKlxuICAgKiBwcmVwZW5kIEZldGNoZWQgTWVzc2FnZXNcbiAgICogQHBhcmFtIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VzXG4gICAqL1xuICAgcHJlcGVuZE1lc3NhZ2VzKG1lc3NhZ2VzOiBDb21ldENoYXQuQmFzZU1lc3NhZ2VbXSkge1xuICAgICB0cnkge1xuICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gWy4uLm1lc3NhZ2VzLCAuLi50aGlzLm1lc3NhZ2VzTGlzdF07XG4gICAgICAgdGhpcy5tZXNzYWdlQ291bnQgPSB0aGlzLm1lc3NhZ2VzTGlzdC5sZW5ndGg7XG4gICAgICAgaWYgKHRoaXMubWVzc2FnZUNvdW50ID4gdGhpcy50aHJlc2hvbGRWYWx1ZSkge1xuICAgICAgICAgdGhpcy5rZWVwUmVjZW50TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgIHRoaXMucmVJbml0aWFsaXplTWVzc2FnZUJ1aWxkZXIoKTtcbiAgICAgICB9XG4gICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICBpZih0aGlzLnN0YXRlICE9IFN0YXRlcy5sb2FkZWQpe1xuICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmxvYWRlZFxuICAgICAgIH1cbiAgICAgICAgIHRoaXMucmVmLmRldGFjaCgpOyAvLyBEZXRhY2ggdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgICAgIH0pO1xuICBpZih0aGlzLmNoYXRDaGFuZ2VkKXtcblxuICAgQ29tZXRDaGF0VUlFdmVudHMuY2NBY3RpdmVDaGF0Q2hhbmdlZC5uZXh0KHtcbiAgICAgIHVzZXI6dGhpcy51c2VyLFxuICAgICAgZ3JvdXA6dGhpcy5ncm91cCxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VzW21lc3NhZ2VzPy5sZW5ndGggLTFdXG4gICAgfSlcbiAgICB0aGlzLmNoYXRDaGFuZ2VkID0gZmFsc2VcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gIH1cbiAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMuZXJyb3JcbiAgICAgICBpZiAodGhpcy5vbkVycm9yKSB7XG4gICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgIH1cbiAgICAgfVxuICAgfVxuICAvKipcbiAgICogbGlzdGVuaW5nIHRvIGJvdHRvbSBzY3JvbGwgdXNpbmcgaW50ZXJzZWN0aW9uIG9ic2VydmVyXG4gICAqL1xuICAgaW9Cb3R0b20oKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHRoaXMubGlzdFNjcm9sbC5uYXRpdmVFbGVtZW50LFxuICAgICAgcm9vdE1hcmdpbjogJy0xMDAlIDBweCAxMDBweCAwcHgnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgIH07XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZW50cmllczogYW55KSA9PiB7XG50aGlzLmlzT25Cb3R0b20gPSBmYWxzZVxuICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLlVucmVhZENvdW50W3RoaXMuVW5yZWFkQ291bnQubGVuZ3RoIC0gMV07XG4gICAgICB0aGlzLmlzT25Cb3R0b20gPSBlbnRyaWVzWzBdLmlzSW50ZXJzZWN0aW5nO1xuICAgICAgaWYodGhpcy5pc09uQm90dG9tKXtcbiAgICAgICAgdGhpcy5mZXRjaE5leHRNZXNzYWdlKClcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0ICYmIHRoaXMuVW5yZWFkQ291bnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBDb21ldENoYXQubWFya0FzUmVhZChsYXN0TWVzc2FnZSkudGhlbigocmVzOiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuVW5yZWFkQ291bnQgPSBbXTtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlS2V5ID0gdGhpcy5tZXNzYWdlc0xpc3QuZmluZEluZGV4KChtOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IG0uZ2V0SWQoKSA9PT0gTnVtYmVyKHJlcz8uZ2V0TWVzc2FnZUlkKCkpKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlS2V5ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtBbGxNZXNzYWdBc1JlYWQobWVzc2FnZUtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlUmVhZC5uZXh0KCBsYXN0TWVzc2FnZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5VbnJlYWRDb3VudCA9IFtdO1xuICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9ic2VydmVyOkludGVyc2VjdGlvbk9ic2VydmVyID0gICBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy5ib3R0b20ubmF0aXZlRWxlbWVudClcbiAgfTtcbiAgLyoqXG4gKiBsaXN0ZW5pbmcgdG8gdG9wIHNjcm9sbCB1c2luZyBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXJcbiAqL1xuICBpb1RvcCgpe1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudCxcbiAgICAgIHJvb3RNYXJnaW46ICcyMDBweCAwcHggMHB4IDBweCcsXG4gICAgICB0aHJlc2hvbGQ6IDEuMFxuICAgIH1cbiAgICBjb25zdCBjYWxsYmFjayA9IChlbnRyaWVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuaXNPbkJvdHRvbSA9IGZhbHNlXG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLm51bWJlck9mVG9wU2Nyb2xsKys7XG4gICAgICAgIGlmICh0aGlzLm51bWJlck9mVG9wU2Nyb2xsID4gMSkge1xuICAgICAgICAgIHRoaXMuZmV0Y2hQcmV2aW91c01lc3NhZ2VzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgIHZhciBvYnNlcnZlcjpJbnRlcnNlY3Rpb25PYnNlcnZlciA9ICAgbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudG9wLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG4gIC8vIHB1YmxpYyBtZXRob2RzXG4gIGFkZE1lc3NhZ2UgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgaWYoIW1lc3NhZ2U/LmdldFBhcmVudE1lc3NhZ2VJZCgpIHx8IHRoaXMucGFyZW50TWVzc2FnZUlkKXtcbiAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnB1c2gobWVzc2FnZSlcbiAgICAgIGlmKCFtZXNzYWdlPy5nZXRTZW5kZXIoKSB8fCAgdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpID09IG1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXRVaWQoKSB8fCB0aGlzLmlzT25Cb3R0b20pe1xuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICB9XG4gICAgIH1cblxuICAgIGlmKHRoaXMuc3RhdGUgIT0gU3RhdGVzLmxvYWRlZCl7XG4gICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkZWRcbiAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICB9XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cbiAgICAvKipcbiAgICogY2FsbGJhY2sgZm9yIGNvcHkgbWVzc2FnZVxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuVGV4dE1lc3NhZ2V9IG9iamVjdFxuICAgKi9cbiAgICAgb25Db3B5TWVzc2FnZSA9IChvYmplY3Q6IENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkgPT4ge1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQob2JqZWN0LmdldFRleHQoKSlcbiAgICB9XG4gICAgICAvKipcbiAgICogY2FsbGJhY2sgZm9yIGRlbGV0ZU1lc3NhZ2VcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBvYmplY3RcbiAgICovXG4gICAgLyoqXG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gbWVzc2FnZXNcbiAgICovXG4gICAgIG1lc3NhZ2VTZW50KG1lc3NhZ2VzOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSA9IG1lc3NhZ2VzO1xuICAgICAgY29uc3QgbWVzc2FnZUxpc3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZVtdID0gWy4uLnRoaXMubWVzc2FnZXNMaXN0XTtcbiAgICAgIGxldCBtZXNzYWdlS2V5ID0gbWVzc2FnZUxpc3QuZmluZEluZGV4KChtOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IG0uZ2V0TXVpZCgpID09PSBtZXNzYWdlLmdldE11aWQoKSk7XG4gICAgICBpZiAobWVzc2FnZUtleSA+IC0xKSB7XG4gICAgICAgIG1lc3NhZ2VMaXN0LnNwbGljZShtZXNzYWdlS2V5LCAxLCBtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gbWVzc2FnZUxpc3Q7XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB9XG4gICAgICAvKipcbiAgICogY2FsbGJhY2sgZm9yIGVkaXRNZXNzYWdlIG9wdGlvblxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG9iamVjdFxuICAgKi9cbiAgb25FZGl0TWVzc2FnZSA9IChvYmplY3Q6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlRWRpdGVkLm5leHQoe21lc3NhZ2U6b2JqZWN0LHN0YXR1czpNZXNzYWdlU3RhdHVzLmlucHJvZ3Jlc3N9KTtcbiAgfVxuICB1cGRhdGVNZXNzYWdlKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSwgbXVpZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKG11aWQpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlbnQobWVzc2FnZSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUVkaXRlZE1lc3NhZ2UobWVzc2FnZSlcbiAgICB9XG4gIH1cbiAgcmVtb3ZlTWVzc2FnZSA9IChtZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWVzc2FnZUtleSA9IHRoaXMubWVzc2FnZXNMaXN0LmZpbmRJbmRleChtc2cgPT4gbXNnPy5nZXRJZCgpID09PSBtZXNzYWdlLmdldElkKCkpO1xuICAgICAgaWYgKG1lc3NhZ2VLZXkgPiAtMSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdC5zcGxpY2UobWVzc2FnZUtleSwgMSwgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gWy4uLnRoaXMubWVzc2FnZXNMaXN0XTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICB9XG4gIH07XG4gIGRlbGV0ZU1lc3NhZ2UgPSAobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VJZDogYW55ID0gbWVzc2FnZS5nZXRJZCgpO1xuICAgICAgQ29tZXRDaGF0LmRlbGV0ZU1lc3NhZ2UobWVzc2FnZUlkKVxuICAgICAgICAudGhlbigoZGVsZXRlZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlRGVsZXRlZC5uZXh0KGRlbGV0ZWRNZXNzYWdlKVxuICAgICAgICAgIC8vIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOmFueSkgPT4ge1xuICAgICAgICAgIGlmKHRoaXMub25FcnJvcil7XG50aGlzLm9uRXJyb3IoZXJyb3IpO1xufVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjphbnkpIHtcbiAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xudGhpcy5vbkVycm9yKGVycm9yKTtcbn1cbiAgICB9XG4gIH1cbiAgc2Nyb2xsVG9Cb3R0b20gPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpc3RTY3JvbGwubmF0aXZlRWxlbWVudC5zY3JvbGwoe1xuICAgICAgICAgIHRvcDogdGhpcy5saXN0U2Nyb2xsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzT25Cb3R0b20gPSB0cnVlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAxMCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbnRoaXMub25FcnJvcihlcnJvcik7XG59XG4gICAgfVxuICB9XG4gIHNob3dIZWFkZXJUaXRsZShtZXNzYWdlOkNvbWV0Q2hhdC5CYXNlTWVzc2FnZSl7XG4gICAgaWYodGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQubGVmdCl7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgZWxzZXtcbiAgICAgaWYodGhpcy5ncm91cCAmJiAgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkuYWN0aW9uICYmICFtZXNzYWdlPy5nZXREZWxldGVkQXQoKSAmJiBtZXNzYWdlPy5nZXRTZW5kZXIoKSAmJiBtZXNzYWdlPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAhPSB0aGlzLmxvZ2dlZEluVXNlcj8uZ2V0VWlkKCkgJiYgdGhpcy5hbGlnbm1lbnQgPT0gTWVzc2FnZUxpc3RBbGlnbm1lbnQuc3RhbmRhcmQpe1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgZWxzZXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICB9XG4gICBzdWJzY3JpYmVUb0V2ZW50cygpIHtcbiAgICB0aGlzLmNjU2hvd1BhbmVsID0gQ29tZXRDaGF0VUlFdmVudHMuY2NTaG93UGFuZWwuc3Vic2NyaWJlKChkYXRhOklQYW5lbCk9PntcbiAgICAgIHRoaXMuc21hcnRSZXBseUNvbmZpZyA9IGRhdGEuY29uZmlndXJhdGlvbiFcbiAgICAgIHRoaXMuc21hcnRSZXBseU1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UhXG4gICAgICB0aGlzLmVuYWJsZVNtYXJ0UmVwbHkgPSB0cnVlXG4gICAgICB0aGlzLnNob3dTbWFydFJlcGx5ID0gdHJ1ZVxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMuY2NIaWRlUGFuZWwgPSBDb21ldENoYXRVSUV2ZW50cy5jY0hpZGVQYW5lbC5zdWJzY3JpYmUoKCk9PntcblxuICAgICAgICAgICAgdGhpcy5zbWFydFJlcGx5TWVzc2FnZSA9IG51bGxcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlU21hcnRSZXBseSA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dTbWFydFJlcGx5ID0gZmFsc2VcblxuICAgICAgICAgIH0pXG4gICB0aGlzLmNjR3JvdXBNZW1iZXJBZGRlZCA9IENvbWV0Q2hhdEdyb3VwRXZlbnRzLmNjR3JvdXBNZW1iZXJBZGRlZC5zdWJzY3JpYmUoKGl0ZW06IElHcm91cE1lbWJlckFkZGVkKSA9PiB7XG4gICAgIGl0ZW1cbiAgIHRoaXMuYXBwZW5kTWVzc2FnZXMoaXRlbS5tZXNzYWdlcyEpXG4gICB9KVxuICAgdGhpcy5jY0dyb3VwTWVtYmVyQmFubmVkID0gQ29tZXRDaGF0R3JvdXBFdmVudHMuY2NHcm91cE1lbWJlckJhbm5lZC5zdWJzY3JpYmUoKGl0ZW06IElHcm91cE1lbWJlcktpY2tlZEJhbm5lZCkgPT4ge1xuICAgIHRoaXMuYWRkTWVzc2FnZShpdGVtLm1lc3NhZ2UhKVxuICAgfSlcbiAgIHRoaXMuY2NHcm91cE1lbWJlcktpY2tlZCA9IENvbWV0Q2hhdEdyb3VwRXZlbnRzLmNjR3JvdXBNZW1iZXJLaWNrZWQuc3Vic2NyaWJlKChpdGVtOiBJR3JvdXBNZW1iZXJLaWNrZWRCYW5uZWQpID0+IHtcbiAgICAgdGhpcy5hZGRNZXNzYWdlKGl0ZW0ubWVzc2FnZSEpXG4gICB9KVxuICAgdGhpcy5jY0dyb3VwTWVtYmVyU2NvcGVDaGFuZ2VkID0gQ29tZXRDaGF0R3JvdXBFdmVudHMuY2NHcm91cE1lbWJlclNjb3BlQ2hhbmdlZC5zdWJzY3JpYmUoKGl0ZW06IElHcm91cE1lbWJlclNjb3BlQ2hhbmdlZCkgPT4ge1xuICAgIHRoaXMuYWRkTWVzc2FnZShpdGVtLm1lc3NhZ2UhKVxuICB9KVxuICAgdGhpcy5jY0dyb3VwTGVmdCA9IENvbWV0Q2hhdEdyb3VwRXZlbnRzLmNjR3JvdXBMZWZ0LnN1YnNjcmliZSgoaXRlbTogSUdyb3VwTGVmdCkgPT4ge1xuICAgIHRoaXMuYWRkTWVzc2FnZShpdGVtLm1lc3NhZ2UhKVxuICAgfSlcbiAgICB0aGlzLmNjTWVzc2FnZUVkaXQgPSBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZUVkaXRlZC5zdWJzY3JpYmUoKG9iamVjdDogSU1lc3NhZ2VzKSA9PiB7XG4gICAgICAgaWYob2JqZWN0Py5zdGF0dXMgPT0gTWVzc2FnZVN0YXR1cy5zdWNjZXNzKXtcbiAgICAgICAgdGhpcy51cGRhdGVNZXNzYWdlKG9iamVjdC5tZXNzYWdlISlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuY2NNZXNzYWdlU2VudCA9IENvbWV0Q2hhdE1lc3NhZ2VFdmVudHMuY2NNZXNzYWdlU2VudC5zdWJzY3JpYmUoKG9iajogSU1lc3NhZ2VzKSA9PiB7XG4gICAgICBsZXQgbWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlID0gb2JqLm1lc3NhZ2UhXG4gICAgICBzd2l0Y2ggKG9iai5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSBNZXNzYWdlU3RhdHVzLmlucHJvZ3Jlc3M6IHtcbiAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5wbGF5QXVkaW8oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIE1lc3NhZ2VTdGF0dXMuc3VjY2Vzczoge1xuICAgICAgICAgaWYobWVzc2FnZS5nZXRQYXJlbnRNZXNzYWdlSWQoKSB8fCB0aGlzLnBhcmVudE1lc3NhZ2VJZCl7XG4gICAgICAgICB0aGlzLnVwZGF0ZVJlcGx5Q291bnQobWVzc2FnZSlcbiAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2UobWVzc2FnZSwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBNZXNzYWdlU3RhdHVzLnN1Y2Nlc3M6IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuY2NNZXNzYWdlRGVsZXRlID0gQ29tZXRDaGF0TWVzc2FnZUV2ZW50cy5jY01lc3NhZ2VEZWxldGVkLnN1YnNjcmliZSgobWVzc2FnZU9iamVjdDogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgIHRoaXMucmVtb3ZlTWVzc2FnZShtZXNzYWdlT2JqZWN0KVxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pXG4gICAgdGhpcy5jY0NhbGxFbmRlZCA9IENvbWV0Q2hhdENhbGxFdmVudHMuY2NDYWxsRW5kZWQuc3Vic2NyaWJlKChjYWxsOkNvbWV0Q2hhdC5DYWxsKT0+e1xuICAgICAgdGhpcy5zaG93T25nb2luZ0NhbGwgPSBmYWxzZVxuICAgICAgdGhpcy5zZXNzaW9uSWQgPSBcIlwiXG4gICAgICBpZihjYWxsKXtcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKGNhbGwpXG4gICAgICB9XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICB9KVxuICAgIHRoaXMuY2NDYWxsUmVqZWN0ZWQgPSBDb21ldENoYXRDYWxsRXZlbnRzLmNjQ2FsbFJlamVjdGVkLnN1YnNjcmliZSgoY2FsbDogQ29tZXRDaGF0LkNhbGwpID0+IHtcbiAgICAgdGhpcy5hZGRNZXNzYWdlKGNhbGwpXG4gICAgfSlcbiAgICB0aGlzLmNjT3V0Z29pbmdDYWxsID0gQ29tZXRDaGF0Q2FsbEV2ZW50cy5jY091dGdvaW5nQ2FsbC5zdWJzY3JpYmUoKGNhbGw6IENvbWV0Q2hhdC5DYWxsKSA9PiB7XG5cbiAgICAgIHRoaXMuYWRkTWVzc2FnZShjYWxsKVxuICAgIH0pXG4gICAgdGhpcy5jY0NhbGxBY2NlcHRlZCA9IENvbWV0Q2hhdENhbGxFdmVudHMuY2NDYWxsQWNjZXB0ZWQuc3Vic2NyaWJlKChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgdGhpcy5hZGRNZXNzYWdlKGNhbGwpXG4gICAgfSlcbiAgfVxuICBjbG9zZVNtYXJ0UmVwbHkgPSgpPT57XG4gICAgdGhpcy5zaG93U21hcnRSZXBseSA9IGZhbHNlXG4gICAgdGhpcy5zbWFydFJlcGx5TWVzc2FnZSA9IG51bGxcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgIH1cbiAgc2VuZFJlcGx5ID0oZXZlbnQ6YW55KT0+e1xuICAgIGxldCByZXBseTpzdHJpbmcgPSBldmVudD8uZGV0YWlsPy5yZXBseVxuaWYodGhpcy5zbWFydFJlcGx5Q29uZmlnLmNjU21hcnRSZXBsaWVzQ2xpY2tlZCl7XG50aGlzLnNtYXJ0UmVwbHlDb25maWcuY2NTbWFydFJlcGxpZXNDbGlja2VkKHJlcGx5LHRoaXMuc21hcnRSZXBseU1lc3NhZ2UhLHRoaXMub25FcnJvcix0aGlzLmN1c3RvbVNvdW5kRm9yTWVzc2FnZXMsdGhpcy5kaXNhYmxlU291bmRGb3JNZXNzYWdlcylcbnRoaXMuY2xvc2VTbWFydFJlcGx5KClcbn1cbiAgfVxuICBnZXRSZXBsaWVzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgbGV0IHNtYXJ0UmVwbHk6YW55ID0gdGhpcy5zbWFydFJlcGx5TWVzc2FnZVxuICAgIGNvbnN0IHNtYXJ0UmVwbHlPYmplY3QgPSBzbWFydFJlcGx5Py5tZXRhZGF0YT8uW1NtYXJ0UmVwbGllc0NvbnN0YW50cy5pbmplY3RlZF0/LmV4dGVuc2lvbnM/LltTbWFydFJlcGxpZXNDb25zdGFudHMuc21hcnRfcmVwbHldO1xuICAgIGlmIChzbWFydFJlcGx5T2JqZWN0Py5yZXBseV9wb3NpdGl2ZSAmJiBzbWFydFJlcGx5T2JqZWN0Py5yZXBseV9uZXV0cmFsICYmIHNtYXJ0UmVwbHlPYmplY3Q/LnJlcGx5X25lZ2F0aXZlKSB7XG5cbiAgICAgIGNvbnN0IHsgcmVwbHlfcG9zaXRpdmUsIHJlcGx5X25ldXRyYWwsIHJlcGx5X25lZ2F0aXZlIH0gPSBzbWFydFJlcGx5T2JqZWN0O1xuICAgICAgcmV0dXJuIFtyZXBseV9wb3NpdGl2ZSwgcmVwbHlfbmV1dHJhbCwgcmVwbHlfbmVnYXRpdmVdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB1bnN1YnNjcmliZVRvRXZlbnRzKCkge1xuICAgIHRoaXMuY2NHcm91cE1lbWJlckFkZGVkPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NHcm91cE1lbWJlckJhbm5lZD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJKb2luZWQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY0dyb3VwTWVtYmVyS2lja2VkPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NPd25lcnNoaXBDaGFuZ2VkPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NHcm91cExlZnQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY01lc3NhZ2VFZGl0Py51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NNZXNzYWdlU2VudD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjTGl2ZVJlYWN0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NNZXNzYWdlRGVsZXRlPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NHcm91cE1lbWJlclNjb3BlQ2hhbmdlZD8udW5zdWJzY3JpYmUoKVxuICB9XG4gIC8qKlxuKiBzdHlsaW5nIHBhcnRcbiovXG4gIGNoYXRzTGlzdFN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5oZWlnaHQsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuYmFja2dyb3VuZCxcbiAgICB9O1xuICB9XG4gIG1lc3NhZ2VDb250YWluZXJTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS53aWR0aCxcbiAgICB9O1xuICB9XG4gIGVycm9yU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuZXJyb3JTdGF0ZVRleHRGb250LFxuICAgICAgdGV4dENvbG9yOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuZXJyb3JTdGF0ZVRleHRDb2xvcixcbiAgICB9XG4gIH1cbiAgZW1wdHlTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEZvbnQ6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5lbXB0eVN0YXRlVGV4dEZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRoaXMubWVzc2FnZUxpc3RTdHlsZS5lbXB0eVN0YXRlVGV4dENvbG9yLFxuICAgIH1cbiAgfVxuICBsb2FkaW5nU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGljb25UaW50OiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUubG9hZGluZ0ljb25UaW50LFxuICAgIH1cbiAgfVxuICB3cmFwcGVyU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLmhlaWdodCxcbiAgICAgIHdpZHRoOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUud2lkdGgsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLm1lc3NhZ2VMaXN0U3R5bGUuYmFja2dyb3VuZCxcbiAgICAgIGJvcmRlcjogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLmJvcmRlcixcbiAgICAgIGJvcmRlclJhZGl1czogdGhpcy5tZXNzYWdlTGlzdFN0eWxlLmJvcmRlclJhZGl1c1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fd3JhcHBlclwiIFtuZ1N0eWxlXT1cIndyYXBwZXJTdHlsZSgpXCI+XG4gIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2hlYWRlci12aWV3XCI+XG48ZGl2ICpuZ0lmPVwiaGVhZGVyVmlld1wiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVmlld1wiPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdFwiICNsaXN0U2Nyb2xsPlxuICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX3RvcFwiICN0b3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fZGVjb3JhdG9yLW1lc3NhZ2VcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5sb2FkaW5nIHx8IHN0YXRlID09IHN0YXRlcy5lcnJvciAgfHwgc3RhdGUgPT0gc3RhdGVzLmVtcHR5IFwiXG4gICAgICBbbmdTdHlsZV09XCJtZXNzYWdlQ29udGFpbmVyU3R5bGUoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fbG9hZGluZy12aWV3XCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMubG9hZGluZyBcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1sb2FkZXIgW2ljb25VUkxdPVwibG9hZGluZ0ljb25VUkxcIiBbbG9hZGVyU3R5bGVdPVwibG9hZGluZ1N0eWxlKClcIj5cbiAgICAgICAgPC9jb21ldGNoYXQtbG9hZGVyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fY3VzdG9tdmlldy0tbG9hZGluZ1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmxvYWRpbmcgICYmIGxvYWRpbmdTdGF0ZVZpZXdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1N0YXRlVmlld1wiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2Vycm9yLXZpZXdcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lcnJvciAgJiYgIWhpZGVFcnJvciBcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1sYWJlbCBbbGFiZWxTdHlsZV09XCJlcnJvclN0eWxlKClcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lcnJvciAgJiYgIWhpZGVFcnJvciAmJiAhZXJyb3JTdGF0ZVZpZXdcIiBbdGV4dF09XCJlcnJvclN0YXRlVGV4dFwiXG4gICAgICAgICAgPlxuICAgICAgICA8L2NvbWV0Y2hhdC1sYWJlbD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2N1c3RvbS12aWV3LS1lcnJvclwiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVycm9yICAmJiAhaGlkZUVycm9yICYmIGVycm9yU3RhdGVWaWV3XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVycm9yU3RhdGVWaWV3XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fZW1wdHktdmlld1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVtcHR5XCI+XG4gICAgICAgIDxjb21ldGNoYXQtbGFiZWwgW2xhYmVsU3R5bGVdPVwiZW1wdHlTdHlsZSgpXCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMuZW1wdHkgJiYgIWVtcHR5U3RhdGVWaWV3XCIgW3RleHRdPVwiZW1wdHlTdGF0ZVRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgPC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19jdXN0b20tdmlldy0tZW1wdHlcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lbXB0eSAmJiBlbXB0eVN0YXRlVmlld1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVN0YXRlVmlld1wiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19idWJibGVcIiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlc0xpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIoaSA9PT0gMClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2RhdGVcIiA+XG4gICAgICAgICAgPGNvbWV0Y2hhdC1kYXRlIFt0aW1lc3RhbXBdPVwibWVzc2FnZSEuZ2V0U2VudEF0KClcIiAgW3BhdHRlcm5dPVwiRGF0ZVNlcGFyYXRvclBhdHRlcm5cIiBbZGF0ZVN0eWxlXT1cImRhdGVTZXBhcmF0b3JTdHlsZVwiXG4gICAgICAgICAgID5cbiAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIoaSA+IDAgJiYgaXNEYXRlRGlmZmVyZW50KG1lc3NhZ2VzTGlzdFtpIC0gMV0/LmdldFNlbnRBdCgpLCBtZXNzYWdlc0xpc3RbaV0/LmdldFNlbnRBdCgpKSlcbiAgICAgICAgXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19kYXRlXCIgID5cbiAgICAgICAgICA8Y29tZXRjaGF0LWRhdGUgW3RpbWVzdGFtcF09XCJtZXNzYWdlPy5nZXRTZW50QXQoKVwiIFtwYXR0ZXJuXT1cIkRhdGVTZXBhcmF0b3JQYXR0ZXJuXCIgICBbZGF0ZVN0eWxlXT1cImRhdGVTZXBhcmF0b3JTdHlsZVwiXG4gICAgICAgICAgID5cbiAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImdldEJ1YmJsZVdyYXBwZXIobWVzc2FnZSkgXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldEJ1YmJsZVdyYXBwZXIobWVzc2FnZSlcIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgPGRpdj5cbiAgICAgICAgPGNvbWV0Y2hhdC1tZXNzYWdlLWJ1YmJsZSAgKm5nSWY9XCIhZ2V0QnViYmxlV3JhcHBlcihtZXNzYWdlKVwiIFtsZWFkaW5nVmlld109XCIgc2hvd0F2YXRhciA/IGxlYWRpbmdWaWV3IDogbnVsbFwiIFtib3R0b21WaWV3XT1cImVuYWJsZVJlYWN0aW9ucyA/IHJlYWN0aW9uVmlldyA6IG51bGxcIlxuICAgICAgICBbaGVhZGVyVmlld109XCJnZXRIZWFkZXJWaWV3KG1lc3NhZ2UpIHx8IG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAmJiBzaG93SGVhZGVyVGl0bGUobWVzc2FnZSkgPyBidWJibGVIZWFkZXIgOiBudWxsXCIgW2Zvb3RlclZpZXddPVwiZm9vdGVyVmlld1wiICBbY29udGVudFZpZXddPVwiY29udGVudFZpZXdcIiBbdGhyZWFkVmlld109XCJ0aHJlYWRWaWV3XCJcbiAgICAgICAgIFtpZF09XCJtZXNzYWdlPy5nZXRJZCgpIHx8IG1lc3NhZ2U/LmdldE11aWQoKVwiIFtvcHRpb25zXT1cInNldE1lc3NhZ2VPcHRpb25zKG1lc3NhZ2UpXCJcbiAgICAgICAgICBbbWVzc2FnZUJ1YmJsZVN0eWxlXT1cInNldE1lc3NhZ2VCdWJibGVTdHlsZShtZXNzYWdlKVwiICBbYWxpZ25tZW50XT1cInNldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRWaWV3PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRDb250ZW50VmlldyhtZXNzYWdlKTtjb250ZXh0OnsgJGltcGxpY2l0OiBtZXNzYWdlIH1cIiA+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVhY3Rpb25WaWV3PlxuICAgICAgICAgIDxyZWFjdGlvbnMtdmlldyBbbWVzc2FnZU9iamVjdF09XCJtZXNzYWdlXCIgW2FsaWdubWVudF09XCJzZXRCdWJibGVBbGlnbm1lbnQobWVzc2FnZSlcIlxuICAgICAgICAgIFtsb2dnZWRJblVzZXJdPVwibG9nZ2VkSW5Vc2VyXCIgW3JlYWN0aW9uc1N0eWxlXT1cInJlYWN0aW9uc1N0eWxlKG1lc3NhZ2UpXCI+PC9yZWFjdGlvbnMtdmlldz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgPG5nLXRlbXBsYXRlICNmb290ZXJWaWV3PlxuICAgICAgICAgIDxkaXYgIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19idWJibGUtZm9vdGVyXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGVyVmlldyhtZXNzYWdlKTtlbHNlIGJ1YmJsZUZvb3RlclwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0Rm9vdGVyVmlldyhtZXNzYWdlKTtjb250ZXh0OnsgJGltcGxpY2l0OiBtZXNzYWdlIH1cIiA+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J1YmJsZUZvb3Rlcj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fYnViYmxlLWRhdGVcIiAqbmdJZj1cInRpbWVzdGFtcEFsaWdubWVudCA9PSB0aW1lc3RhbXBFbnVtLmJvdHRvbSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5hY3Rpb24gJiYgIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiPlxuICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtZGF0ZSBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW2RhdGVTdHlsZV09XCJidWJibGVEYXRlU3R5bGVcIiBbcGF0dGVybl09XCJkYXRlUGF0dGVyblwiPlxuICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWRhdGU+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiAhbWVzc2FnZT8uZ2V0RGVsZXRlZEF0KCkgJiYgICFkaXNhYmxlUmVjZWlwdCAmJiAoIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8dGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkgPT0gbWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldFVpZCgpKSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5hY3Rpb24gJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19yZWNlaXB0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtcmVjZWlwdCBbcmVjZWlwdF09XCJnZXRNZXNzYWdlUmVjZWlwdChtZXNzYWdlKVwiIFtyZWNlaXB0U3R5bGVdPVwicmVjZWlwdFN0eWxlXCIgW3dhaXRJY29uXT1cIndhaXRJY29uXCIgW3NlbnRJY29uXT1cInNlbnRJY29uXCIgW2RlbGl2ZXJlZEljb25dPVwiZGVsaXZlcmVkSWNvblwiIFtyZWFkSWNvbl09XCJyZWFkSWNvblwiIFtlcnJvckljb25dPVwiZXJyb3JJY29uXCI+PC9jb21ldGNoYXQtcmVjZWlwdD5cbiAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbGVhZGluZ1ZpZXc+XG4gIDxkaXYgICpuZ0lmPVwiIG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAgJiYgc2hvd0hlYWRlclRpdGxlKG1lc3NhZ2UpXCIgPlxuICAgIDxjb21ldGNoYXQtYXZhdGFyIFtuYW1lXT1cIm1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXROYW1lKClcIiBbc3R5bGVdPVwiYXZhdGFyU3R5bGVcIiBbaW1hZ2VdPVwibWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldEF2YXRhcigpXCI+XG4gICAgPC9jb21ldGNoYXQtYXZhdGFyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2J1YmJsZUhlYWRlcj5cbiAgPGRpdiAqbmdJZj1cImdldEhlYWRlclZpZXcobWVzc2FnZSk7ZWxzZSBkZWZhdWx0SGVhZGVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldEhlYWRlclZpZXcobWVzc2FnZSk7Y29udGV4dDp7ICRpbXBsaWNpdDogbWVzc2FnZSB9XCIgPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlcj5cbiAgPGRpdiAgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2J1YmJsZS1oZWFkZXJcIiAqbmdJZj1cIm1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAmJiBzaG93SGVhZGVyVGl0bGUobWVzc2FnZSkgJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiPlxuICAgIDxjb21ldGNoYXQtbGFiZWwgW3RleHRdPVwibWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldE5hbWUoKVwiIFtsYWJlbFN0eWxlXT1cImxhYmVsU3R5bGVcIj48L2NvbWV0Y2hhdC1sYWJlbD5cbiAgICA8Y29tZXRjaGF0LWRhdGUgW3BhdHRlcm5dPVwiZGF0ZVBhdHRlcm5cIiBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW3N0eWxlXT1cImJ1YmJsZURhdGVTdHlsZVwiICpuZ0lmPVwidGltZXN0YW1wQWxpZ25tZW50ID09IHRpbWVzdGFtcEVudW0udG9wXCI+PC9jb21ldGNoYXQtZGF0ZT5cbiAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3RocmVhZFZpZXc+XG4gIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX3RocmVhZHJlcGxpZXNcIiAqbmdJZj1cIm1lc3NhZ2U/LmdldFJlcGx5Q291bnQoKSAmJiAhbWVzc2FnZS5nZXREZWxldGVkQXQoKVwiID5cbiAgICA8Y29tZXRjaGF0LWRpdmlkZXIgW2RpdmlkZXJTdHlsZV09XCJkaXZpZGVyU3R5bGVcIj48L2NvbWV0Y2hhdC1kaXZpZGVyPlxuICAgIDxjb21ldGNoYXQtYnV0dG9uIFt0ZXh0XT1cImdldFRocmVhZENvdW50KG1lc3NhZ2UpXCIgW2J1dHRvblN0eWxlXT1cImdldFRocmVhZFZpZXdTdHlsZShtZXNzYWdlKVwiIFtpY29uVVJMXT1cInRocmVhZE9wZW5JY29uXCIgKGNjLWJ1dHRvbi1jbGlja2VkKT1cIm9wZW5UaHJlYWRWaWV3KG1lc3NhZ2UpXCI+XG4gICAgPC9jb21ldGNoYXQtYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2NvbWV0Y2hhdC1tZXNzYWdlLWJ1YmJsZT5cbiAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19ib3R0b21cIiAjYm90dG9tPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fZm9vdGVyLXZpZXdcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9vdGVyVmlldztlbHNlIGZvb3RlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlclZpZXdcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fc21hcnQtcmVwbGllc1wiICpuZ0lmPVwic2hvd1NtYXJ0UmVwbHkgJiYgZ2V0UmVwbGllcygpICYmICghVW5yZWFkQ291bnQgfHwgVW5yZWFkQ291bnQubGVuZ3RoID09IDApXCI+XG4gICAgICAgIDxzbWFydC1yZXBsaWVzIFtzbWFydFJlcGx5U3R5bGVdPVwic21hcnRSZXBseVN0eWxlXCIgW3JlcGxpZXNdPVwiZ2V0UmVwbGllcygpXCIgKGNjLXJlcGx5LWNsaWNrZWQpPVwic2VuZFJlcGx5KCRldmVudClcIiAoY2MtY2xvc2UtY2xpY2tlZCk9XCJjbG9zZVNtYXJ0UmVwbHkoKVwiPlxuICAgICAgICA8L3NtYXJ0LXJlcGxpZXM+XG4gICAgICA8L2Rpdj5cbjxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX21lc3NhZ2UtaW5kaWNhdG9yXCIgKm5nSWY9XCJVbnJlYWRDb3VudCAmJiBVbnJlYWRDb3VudC5sZW5ndGggPiAwICYmICFpc09uQm90dG9tXCI+XG4gIDxjb21ldGNoYXQtYnV0dG9uIFt0ZXh0XT1cIm5ld01lc3NhZ2VDb3VudFwiIFtidXR0b25TdHlsZV09XCJ1bnJlYWRNZXNzYWdlc1N0eWxlXCIgKGNjLWJ1dHRvbi1jbGlja2VkKT1cInNjcm9sbFRvQm90dG9tKClcIj48L2NvbWV0Y2hhdC1idXR0b24+XG48L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cblxuPC9kaXY+XG48IS0tIGRlZmF1bHQgYnViYmxlcyAtLT5cbjxuZy10ZW1wbGF0ZSAjdGV4dEJ1YmJsZSBsZXQtbWVzc2FnZT5cbiAgPGNvbWV0Y2hhdC10ZXh0LWJ1YmJsZSAqbmdJZj1cIm1lc3NhZ2U/LnR5cGUgPT0gTWVzc2FnZVR5cGVzQ29uc3RhbnQuZ3JvdXBNZW1iZXJcIiBbdGV4dFN0eWxlXT1cInNldFRleHRCdWJibGVTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cIm1lc3NhZ2U/Lm1lc3NhZ2VcIj48L2NvbWV0Y2hhdC10ZXh0LWJ1YmJsZT5cbiAgPGNvbWV0Y2hhdC10ZXh0LWJ1YmJsZSAqbmdJZj1cIm1lc3NhZ2U/LmdldERlbGV0ZWRBdCgpXCIgW3RleHRTdHlsZV09XCJzZXRUZXh0QnViYmxlU3R5bGUobWVzc2FnZSlcIiBbdGV4dF09XCJsb2NhbGl6ZSgnTUVTU0FHRV9JU19ERUxFVEVEJylcIj48L2NvbWV0Y2hhdC10ZXh0LWJ1YmJsZT5cbjxjb21ldGNoYXQtdGV4dC1idWJibGUgKm5nSWY9XCIhaXNUcmFuc2xhdGVkKG1lc3NhZ2UpICYmICFnZXRMaW5rUHJldmlldyhtZXNzYWdlKSAmJiAhbWVzc2FnZT8uZGVsZXRlZEF0ICYmIG1lc3NhZ2U/LnR5cGUgIT0gTWVzc2FnZVR5cGVzQ29uc3RhbnQuZ3JvdXBNZW1iZXJcIiBbdGV4dFN0eWxlXT1cInNldFRleHRCdWJibGVTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cImdldFRleHRNZXNzYWdlKG1lc3NhZ2UpXCI+PC9jb21ldGNoYXQtdGV4dC1idWJibGU+XG48bGluay1wcmV2aWV3IFtsaW5rUHJldmlld1N0eWxlXT1cImxpbmtQcmV2aWV3U3R5bGVcIiAoY2MtbGluay1jbGlja2VkKT1cIm9wZW5MaW5rVVJMKCRldmVudClcIiAqbmdJZj1cIiFtZXNzYWdlPy5nZXREZWxldGVkQXQoKSAmJiBnZXRMaW5rUHJldmlldyhtZXNzYWdlKSAmJiBlbmFibGVMaW5rUHJldmlld1wiIFt0aXRsZV09XCJnZXRMaW5rUHJldmlld0RldGFpbHMoJ3RpdGxlJyxtZXNzYWdlKVwiIFtkZXNjcmlwdGlvbl09XCJnZXRMaW5rUHJldmlld0RldGFpbHMoJ2Rlc2NyaXB0aW9uJyxtZXNzYWdlKVwiIFtVUkxdPVwiZ2V0TGlua1ByZXZpZXdEZXRhaWxzKCd1cmwnLG1lc3NhZ2UpXCIgW2ltYWdlXT1cImdldExpbmtQcmV2aWV3RGV0YWlscygnaW1hZ2UnLG1lc3NhZ2UpXCIgW2Zhdkljb25VUkxdPVwiZ2V0TGlua1ByZXZpZXdEZXRhaWxzKCdmYXZpY29uJyxtZXNzYWdlKVwiPlxuICA8Y29tZXRjaGF0LXRleHQtYnViYmxlXG4gICpuZ0lmPVwiIWlzVHJhbnNsYXRlZChtZXNzYWdlKSAmJiBnZXRMaW5rUHJldmlldyhtZXNzYWdlKSAmJiAhbWVzc2FnZT8uZGVsZXRlZEF0ICYmIG1lc3NhZ2U/LnR5cGUgIT0gTWVzc2FnZVR5cGVzQ29uc3RhbnQuZ3JvdXBNZW1iZXJcIlxuICBbdGV4dFN0eWxlXT1cInNldFRleHRCdWJibGVTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cImdldFRleHRNZXNzYWdlKG1lc3NhZ2UpXCI+PC9jb21ldGNoYXQtdGV4dC1idWJibGU+XG48L2xpbmstcHJldmlldz5cbjxtZXNzYWdlLXRyYW5zbGF0aW9uLWJ1YmJsZSBbYWxpZ25tZW50XT1cImdldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlKVwiICpuZ0lmPVwiaXNUcmFuc2xhdGVkKG1lc3NhZ2UpXCIgIFttZXNzYWdlVHJhbnNsYXRpb25TdHlsZV09XCJzZXRUcmFuc2xhdGlvblN0eWxlKG1lc3NhZ2UpXCIgW3RyYW5zbGF0ZWRUZXh0XT1cImlzVHJhbnNsYXRlZChtZXNzYWdlKVwiPlxuICA8Y29tZXRjaGF0LXRleHQtYnViYmxlICpuZ0lmPVwiICFtZXNzYWdlPy5kZWxldGVkQXQgJiYgbWVzc2FnZT8udHlwZSAhPSBNZXNzYWdlVHlwZXNDb25zdGFudC5ncm91cE1lbWJlclwiIFt0ZXh0U3R5bGVdPVwic2V0VGV4dEJ1YmJsZVN0eWxlKG1lc3NhZ2UpXCIgW3RleHRdPVwibWVzc2FnZT8udGV4dFwiPjwvY29tZXRjaGF0LXRleHQtYnViYmxlPlxuXG48L21lc3NhZ2UtdHJhbnNsYXRpb24tYnViYmxlPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZmlsZUJ1YmJsZSBsZXQtbWVzc2FnZT5cblxuICA8Y29tZXRjaGF0LWZpbGUtYnViYmxlIFtmaWxlU3R5bGVdPVwic2V0RmlsZUJ1YmJsZVN0eWxlKG1lc3NhZ2UpXCIgW2Rvd25sb2FkSWNvblVSTF09XCJkb3dubG9hZEljb25VUkxcIiBbc3VidGl0bGVdPVwibG9jYWxpemUoJ1NIQVJFRF9GSUxFJylcIiBbdGl0bGVdPVwibWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8ubmFtZTogJydcIiBbZmlsZVVSTF09XCJtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50cyA/IG1lc3NhZ2U/LmRhdGE/LmF0dGFjaG1lbnRzWzBdPy51cmwgOiAnJ1wiPjwvY29tZXRjaGF0LWZpbGUtYnViYmxlPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjYXVkaW9CdWJibGUgbGV0LW1lc3NhZ2U+XG4gIDxjb21ldGNoYXQtaWNvbi1idXR0b24gW2Rpc2FibGVkXT1cInRydWVcIiAqbmdJZj1cIm1lc3NhZ2U/LmNhdGVnb3J5ID09IGNhbGxDb25zdGFudCAmJiBtZXNzYWdlPy50eXBlID09IE1lc3NhZ2VUeXBlc0NvbnN0YW50LmF1ZGlvXCIgW2ljb25VUkxdPVwiZ2V0Q2FsbFR5cGVJY29uKG1lc3NhZ2UpXCIgW2J1dHRvblN0eWxlXT1cImNhbGxTdGF0dXNTdHlsZShtZXNzYWdlKVwiIFt0ZXh0XT1cImdldENhbGxBY3Rpb25NZXNzYWdlKG1lc3NhZ2UpXCI+PC9jb21ldGNoYXQtaWNvbi1idXR0b24+XG4gIDxjb21ldGNoYXQtYXVkaW8tYnViYmxlICpuZ0lmPVwiIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgbWVzc2FnZT8uY2F0ZWdvcnkgIT0gY2FsbENvbnN0YW50XCIgIFtzcmNdPVwibWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8udXJsIDogJydcIiA+IDwvY29tZXRjaGF0LWF1ZGlvLWJ1YmJsZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3ZpZGVvQnViYmxlIGxldC1tZXNzYWdlPlxuICA8Y29tZXRjaGF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCJ0cnVlXCIgKm5nSWY9XCJtZXNzYWdlPy5jYXRlZ29yeSA9PSBjYWxsQ29uc3RhbnQgJiYgbWVzc2FnZT8udHlwZSA9PSBNZXNzYWdlVHlwZXNDb25zdGFudC52aWRlb1wiIFtpY29uVVJMXT1cImdldENhbGxUeXBlSWNvbihtZXNzYWdlKVwiIFtidXR0b25TdHlsZV09XCJjYWxsU3RhdHVzU3R5bGUobWVzc2FnZSlcIiBbdGV4dF09XCJnZXRDYWxsQWN0aW9uTWVzc2FnZShtZXNzYWdlKVwiPjwvY29tZXRjaGF0LWljb24tYnV0dG9uPlxuXG4gIDxjb21ldGNoYXQtdmlkZW8tYnViYmxlICpuZ0lmPVwiIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgbWVzc2FnZT8uY2F0ZWdvcnkgIT0gY2FsbENvbnN0YW50XCIgW3ZpZGVvU3R5bGVdPVwidmlkZW9CdWJibGVTdHlsZVwiIFtzcmNdPVwibWVzc2FnZT8uZGF0YT8uYXR0YWNobWVudHMgPyBtZXNzYWdlPy5kYXRhPy5hdHRhY2htZW50c1swXT8udXJsIDogJydcIiBbcG9zdGVyXT1cIiBnZXRJbWFnZVRodW1ibmFpbChtZXNzYWdlKVwiPjwvY29tZXRjaGF0LXZpZGVvLWJ1YmJsZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ltYWdlQnViYmxlIGxldC1tZXNzYWdlPlxuIDxpbWFnZS1tb2RlcmF0aW9uICAoY2Mtc2hvdy1kaWFsb2cpPVwib3Blbldhcm5pbmdEaWFsb2coJGV2ZW50KVwiICpuZ0lmPVwiIW1lc3NhZ2UuZ2V0RGVsZXRlZEF0KCkgJiYgZW5hYmxlSW1hZ2VNb2RlcmF0aW9uXCIgW21lc3NhZ2VdPVwibWVzc2FnZVwiIFtpbWFnZU1vZGVyYXRpb25TdHlsZV09XCJpbWFnZU1vZGVyYXRpb25TdHlsZVwiPlxuICA8Y29tZXRjaGF0LWltYWdlLWJ1YmJsZSAoY2MtaW1hZ2UtY2xpY2tlZCk9XCJvcGVuSW1hZ2VJbkZ1bGxTY3JlZW4obWVzc2FnZSlcIiAgIFtzcmNdPVwiIGdldEltYWdlVGh1bWJuYWlsKG1lc3NhZ2UpXCIgW3BsYWNlaG9sZGVySW1hZ2VdPVwicGxhY2Vob2xkZXJJY29uVVJMXCI+PC9jb21ldGNoYXQtaW1hZ2UtYnViYmxlPlxuIDwvaW1hZ2UtbW9kZXJhdGlvbj5cbiAgPGNvbWV0Y2hhdC1pbWFnZS1idWJibGUgKGNjLWltYWdlLWNsaWNrZWQpPVwib3BlbkltYWdlSW5GdWxsU2NyZWVuKG1lc3NhZ2UpXCIgKm5nSWY9XCIhbWVzc2FnZS5nZXREZWxldGVkQXQoKSAmJiAhZW5hYmxlSW1hZ2VNb2RlcmF0aW9uXCIgIFtzcmNdPVwiIGdldEltYWdlVGh1bWJuYWlsKG1lc3NhZ2UpXCIgW3BsYWNlaG9sZGVySW1hZ2VdPVwicGxhY2Vob2xkZXJJY29uVVJMXCI+PC9jb21ldGNoYXQtaW1hZ2UtYnViYmxlPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjY3VzdG9tVGV4dEJ1YmJsZT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3N0aWNrZXJCdWJibGUgIGxldC1tZXNzYWdlPlxuICA8Y29tZXRjaGF0LWltYWdlLWJ1YmJsZSBbc3JjXT1cImdldFN0aWNrZXIobWVzc2FnZSlcIiBbaW1hZ2VTdHlsZV09XCJpbWFnZUJ1YmJsZVN0eWxlXCIgPjwvY29tZXRjaGF0LWltYWdlLWJ1YmJsZT5cblxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjd2hpdGVib2FyZEJ1YmJsZSAgbGV0LW1lc3NhZ2U+XG4gIDxjb21ldGNoYXQtZG9jdW1lbnQtYnViYmxlIFtoaWRlU2VwYXJhdG9yXT1cImZhbHNlXCIgW2ljb25BbGlnbm1lbnRdPVwiZG9jdW1lbnRCdWJibGVBbGlnbm1lbnRcIiBbZG9jdW1lbnRTdHlsZV09XCJkb2N1bWVudEJ1YmJsZVN0eWxlXCIgW1VSTF09XCJnZXRXaGl0ZWJvYXJkRG9jdW1lbnQobWVzc2FnZSlcIiBbY2NDbGlja2VkXT1cImxhdW5jaENvbGxhYm9yYXRpdmVXaGl0ZWJvYXJkRG9jdW1lbnRcIiBbaWNvblVSTF09XCJ3aGl0ZWJvYXJkSWNvblVSTFwiIFt0aXRsZV09XCJ3aGl0ZWJvYXJkVGl0bGVcIiBbYnV0dG9uVGV4dF09XCJ3aGl0ZWJvYXJkQnV0dG9uVGV4dFwiIFtzdWJ0aXRsZV09XCJ3aGl0ZWJvYXJkU3ViaXRsZVwiPjwvY29tZXRjaGF0LWRvY3VtZW50LWJ1YmJsZT5cblxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZG9jdW1lbnRCdWJibGUgIGxldC1tZXNzYWdlPlxuICA8Y29tZXRjaGF0LWRvY3VtZW50LWJ1YmJsZSBbaGlkZVNlcGFyYXRvcl09XCJmYWxzZVwiIFtpY29uQWxpZ25tZW50XT1cImRvY3VtZW50QnViYmxlQWxpZ25tZW50XCIgW2RvY3VtZW50U3R5bGVdPVwiZG9jdW1lbnRCdWJibGVTdHlsZVwiIFtVUkxdPVwiZ2V0V2hpdGVib2FyZERvY3VtZW50KG1lc3NhZ2UpXCIgW2NjQ2xpY2tlZF09XCJsYXVuY2hDb2xsYWJvcmF0aXZlV2hpdGVib2FyZERvY3VtZW50XCIgW2ljb25VUkxdPVwiZG9jdW1lbnRJY29uVVJMXCIgW3RpdGxlXT1cImRvY3VtZW50VGl0bGVcIiBbYnV0dG9uVGV4dF09XCJkb2N1bWVudEJ1dHRvblRleHRcIiBbc3VidGl0bGVdPVwiZG9jdW1lbnRTdWJpdGxlXCI+PC9jb21ldGNoYXQtZG9jdW1lbnQtYnViYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNkaXJlY3RDYWxsaW5nICBsZXQtbWVzc2FnZT5cbiAgPGNvbWV0Y2hhdC1kb2N1bWVudC1idWJibGUgIFtoaWRlU2VwYXJhdG9yXT1cInRydWVcIiBbaWNvbkFsaWdubWVudF09XCJjYWxsQnViYmxlQWxpZ25tZW50XCIgW2RvY3VtZW50U3R5bGVdPVwiZ2V0Q2FsbEJ1YmJsZVN0eWxlKG1lc3NhZ2UpXCIgW1VSTF09XCJnZXRTZXNzaW9uSWQobWVzc2FnZSlcIiBbY2NDbGlja2VkXT1cInN0YXJ0RGlyZWN0Q2FsbFwiIFtpY29uVVJMXT1cImRpcmVjdENhbGxJY29uVVJMXCIgW3RpdGxlXT1cImdldENhbGxCdWJibGVUaXRsZShtZXNzYWdlKVwiIFtidXR0b25UZXh0XT1cImpvaW5DYWxsQnV0dG9uVGV4dFwiPjwvY29tZXRjaGF0LWRvY3VtZW50LWJ1YmJsZT5cblxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjcG9sbEJ1YmJsZSAgbGV0LW1lc3NhZ2U+XG4gIDxwb2xscy1idWJibGUgW3BvbGxTdHlsZV09XCJwb2xsQnViYmxlU3R5bGVcIiAgW3BvbGxRdWVzdGlvbl09XCJnZXRQb2xsQnViYmxlRGF0YShtZXNzYWdlLCdxdWVzdGlvbicpXCIgW3BvbGxJZF09XCJnZXRQb2xsQnViYmxlRGF0YShtZXNzYWdlLCdpZCcpXCJcbiAgIFtsb2dnZWRJblVzZXJdPVwibG9nZ2VkSW5Vc2VyXCIgW3NlbmRlclVpZF09XCJnZXRQb2xsQnViYmxlRGF0YShtZXNzYWdlKVwiIFttZXRhZGF0YV09XCJtZXNzYWdlPy5tZXRhZGF0YVwiPjwvcG9sbHMtYnViYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuXG48IS0tIHRocmVhZCBidWJibGUgdmlldyAtLT5cbjxuZy10ZW1wbGF0ZSAjdGhyZWFkTWVzc2FnZUJ1YmJsZSBsZXQtbWVzc2FnZT5cbiAgPGRpdiAqbmdJZj1cImdldEJ1YmJsZVdyYXBwZXIobWVzc2FnZSlcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0QnViYmxlV3JhcHBlcihtZXNzYWdlKVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGNvbWV0Y2hhdC1tZXNzYWdlLWJ1YmJsZSAgKm5nSWY9XCIhZ2V0QnViYmxlV3JhcHBlcihtZXNzYWdlKVwiIFtib3R0b21WaWV3XT1cImVuYWJsZVJlYWN0aW9ucyA/IHJlYWN0aW9uVmlldyA6IG51bGxcIiBbbGVhZGluZ1ZpZXddPVwiIHNob3dBdmF0YXIgPyBsZWFkaW5nVmlldyA6IG51bGxcIiBbaGVhZGVyVmlld109XCJidWJibGVIZWFkZXJcIiBbZm9vdGVyVmlld109XCJmb290ZXJWaWV3XCJcbiAgW2NvbnRlbnRWaWV3XT1cImNvbnRlbnRWaWV3XCIgIFtpZF09XCJtZXNzYWdlPy5nZXRJZCgpIHx8IG1lc3NhZ2U/LmdldE11aWQoKVwiICBbbWVzc2FnZUJ1YmJsZVN0eWxlXT1cInNldE1lc3NhZ2VCdWJibGVTdHlsZShtZXNzYWdlKVwiICBbYWxpZ25tZW50XT1cInRocmVhZGVkQWxpZ25tZW50XCI+XG4gICAgPG5nLXRlbXBsYXRlICNjb250ZW50Vmlldz5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRDb250ZW50VmlldyhtZXNzYWdlKTtjb250ZXh0OnsgJGltcGxpY2l0OiBtZXNzYWdlIH1cIiA+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjcmVhY3Rpb25WaWV3PlxuICAgICAgPHJlYWN0aW9ucy12aWV3IFttZXNzYWdlT2JqZWN0XT1cIm1lc3NhZ2VcIiBbYWxpZ25tZW50XT1cInNldEJ1YmJsZUFsaWdubWVudChtZXNzYWdlKVwiXG4gICAgICBbbG9nZ2VkSW5Vc2VyXT1cImxvZ2dlZEluVXNlclwiIFtyZWFjdGlvbnNTdHlsZV09XCJyZWFjdGlvbnNTdHlsZShtZXNzYWdlKVwiPjwvcmVhY3Rpb25zLXZpZXc+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICA8bmctdGVtcGxhdGUgI2Zvb3RlclZpZXc+XG4gICAgICA8ZGl2ICBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fYnViYmxlLWZvb3RlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGVyVmlldyhtZXNzYWdlKTtlbHNlIGJ1YmJsZUZvb3RlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRGb290ZXJWaWV3KG1lc3NhZ2UpO2NvbnRleHQ6eyAkaW1wbGljaXQ6IG1lc3NhZ2UgfVwiID5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjYnViYmxlRm9vdGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYy1tZXNzYWdlLWxpc3RfX2J1YmJsZS1kYXRlXCIgKm5nSWY9XCJ0aW1lc3RhbXBBbGlnbm1lbnQgPT0gdGltZXN0YW1wRW51bS5ib3R0b20gJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuYWN0aW9uICYmIG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmNhbGxcIj5cbiAgICAgICAgICAgIDxjb21ldGNoYXQtZGF0ZSBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW2RhdGVTdHlsZV09XCJidWJibGVEYXRlU3R5bGVcIiBbcGF0dGVybl09XCJkYXRlUGF0dGVyblwiPlxuICAgICAgICAgICAgPC9jb21ldGNoYXQtZGF0ZT5cbiAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiAhbWVzc2FnZT8uZ2V0RGVsZXRlZEF0KCkgJiYgICFkaXNhYmxlUmVjZWlwdCAmJiAoIW1lc3NhZ2U/LmdldFNlbmRlcigpIHx8dGhpcy5sb2dnZWRJblVzZXIuZ2V0VWlkKCkgPT0gbWVzc2FnZT8uZ2V0U2VuZGVyKCk/LmdldFVpZCgpKSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5hY3Rpb24gJiYgbWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuY2FsbFwiIGNsYXNzPVwiY2MtbWVzc2FnZS1saXN0X19yZWNlaXB0XCI+XG4gICAgICAgICAgICAgICAgPGNvbWV0Y2hhdC1yZWNlaXB0IFtyZWNlaXB0XT1cImdldE1lc3NhZ2VSZWNlaXB0KG1lc3NhZ2UpXCIgW3JlY2VpcHRTdHlsZV09XCJyZWNlaXB0U3R5bGVcIiBbd2FpdEljb25dPVwid2FpdEljb25cIiBbc2VudEljb25dPVwic2VudEljb25cIiBbZGVsaXZlcmVkSWNvbl09XCJcIiBbcmVhZEljb25dPVwiZGVsaXZlcmVkSWNvblwiIFtlcnJvckljb25dPVwiZXJyb3JJY29uXCI+PC9jb21ldGNoYXQtcmVjZWlwdD5cbiAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICA8L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNsZWFkaW5nVmlldz5cbjxkaXYgICpuZ0lmPVwiIG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAmJiBzaG93SGVhZGVyVGl0bGUobWVzc2FnZSlcIiA+XG48Y29tZXRjaGF0LWF2YXRhciBbbmFtZV09XCJtZXNzYWdlPy5nZXRTZW5kZXIoKT8uZ2V0TmFtZSgpXCIgW3N0eWxlXT1cImF2YXRhclN0eWxlXCIgW2ltYWdlXT1cIm1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXRBdmF0YXIoKVwiPlxuPC9jb21ldGNoYXQtYXZhdGFyPlxuPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNidWJibGVIZWFkZXI+XG48ZGl2ICpuZ0lmPVwiZ2V0SGVhZGVyVmlldyhtZXNzYWdlKTtlbHNlIGRlZmF1bHRIZWFkZXJcIj5cbjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRIZWFkZXJWaWV3KG1lc3NhZ2UpO2NvbnRleHQ6eyAkaW1wbGljaXQ6IG1lc3NhZ2UgfVwiID5cbjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXI+XG48ZGl2ICBjbGFzcz1cImNjLW1lc3NhZ2UtbGlzdF9fYnViYmxlLWhlYWRlclwiICpuZ0lmPVwibWVzc2FnZT8uZ2V0Q2F0ZWdvcnkoKSAhPSBNZXNzYWdlQ2F0ZWdvcnkuYWN0aW9uICYmIHNob3dIZWFkZXJUaXRsZShtZXNzYWdlKSAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IE1lc3NhZ2VDYXRlZ29yeS5jYWxsXCI+XG48Y29tZXRjaGF0LWxhYmVsIFt0ZXh0XT1cIm1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXROYW1lKClcIiBbbGFiZWxTdHlsZV09XCJsYWJlbFN0eWxlXCI+PC9jb21ldGNoYXQtbGFiZWw+XG48Y29tZXRjaGF0LWRhdGUgW3BhdHRlcm5dPVwiZGF0ZVBhdHRlcm5cIiBbdGltZXN0YW1wXT1cIm1lc3NhZ2U/LmdldFNlbnRBdCgpXCIgW3N0eWxlXT1cImJ1YmJsZURhdGVTdHlsZVwiICpuZ0lmPVwidGltZXN0YW1wQWxpZ25tZW50ID09IHRpbWVzdGFtcEVudW0udG9wXCI+PC9jb21ldGNoYXQtZGF0ZT5cbjwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4gIDwvY29tZXRjaGF0LW1lc3NhZ2UtYnViYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuXG5cbjwhLS0gIC0tPlxuPG5nLXRlbXBsYXRlICNidWJibGVWaWV3PjwvbmctdGVtcGxhdGU+XG48Y29tZXRjaGF0LXBvcG92ZXIgW3BvcG92ZXJTdHlsZV09XCJwb3BvdmVyU3R5bGVcIiAgI3BvcG92ZXJSZWYgW3BsYWNlbWVudF09XCJrZXlib2FyZEFsaWdubWVudFwiPlxuPGNvbWV0Y2hhdC1lbW9qaS1rZXlib2FyZCAoY2MtZW1vamktY2xpY2tlZCk9XCJhZGRSZWFjdGlvbigkZXZlbnQpXCIgIHNsb3Q9XCJjb250ZW50XCI+PC9jb21ldGNoYXQtZW1vamkta2V5Ym9hcmQ+XG48L2NvbWV0Y2hhdC1wb3BvdmVyPlxuPGNvbWV0Y2hhdC1iYWNrZHJvcCAqbmdJZj1cIm9wZW5Db25maXJtRGlhbG9nXCIgW2JhY2tkcm9wU3R5bGVdPVwiYmFja2Ryb3BTdHlsZVwiPlxuICA8Y29tZXRjaGF0LWNvbmZpcm0tZGlhbG9nIFt0aXRsZV09XCInJ1wiIFttZXNzYWdlVGV4dF09XCJ3YXJuaW5nVGV4dFwiIChjYy1jb25maXJtLWNsaWNrZWQpPVwib25Db25maXJtQ2xpY2soKVwiIFtjYW5jZWxCdXR0b25UZXh0XT1cImNhbmNlbFRleHRcIiBbY29uZmlybUJ1dHRvblRleHRdPVwiY29uZmlybVRleHRcIiAoY2MtY2FuY2VsLWNsaWNrZWQpPVwib25DYW5jZWxDbGljaygpXCIgW2NvbmZpcm1EaWFsb2dTdHlsZV09XCJjb25maXJtRGlhbG9nU3R5bGVcIj5cblxuICA8L2NvbWV0Y2hhdC1jb25maXJtLWRpYWxvZz5cbjwvY29tZXRjaGF0LWJhY2tkcm9wPlxuPGZ1bGwtc2NyZWVuLXZpZXdlciAoY2MtY2xvc2UtY2xpY2tlZCk9XCJjbG9zZUltYWdlSW5GdWxsU2NyZWVuKClcIiAqbmdJZj1cIm9wZW5GdWxsc2NyZWVuVmlld1wiIFtVUkxdPVwiaW1hZ2V1cmxUb09wZW5cIiBbY2xvc2VJY29uVVJMXT1cImNsb3NlSWNvblVSTFwiIFtmdWxsU2NyZWVuVmlld2VyU3R5bGVdPVwiZnVsbFNjcmVlblZpZXdlclN0eWxlXCI+XG5cbjwvZnVsbC1zY3JlZW4tdmlld2VyPlxuXG48IS0tIG9uZ29pbmcgY2FsbHNjcmVlbiBmb3IgZGlyZWN0IGNhbGwgLS0+XG48Y29tZXRjaGF0LW9uZ29pbmctY2FsbCAqbmdJZj1cInNob3dPbmdvaW5nQ2FsbFwiIFtvbmdvaW5nQ2FsbFN0eWxlXT1cIm9uZ29pbmdDYWxsU3R5bGVcIiBbc2Vzc2lvbklEXT1cInNlc3Npb25JZFwiPjwvY29tZXRjaGF0LW9uZ29pbmctY2FsbD5cbiJdfQ==
|